77 Commits

Author SHA1 Message Date
sku-refresh-bot
6aea208129 chore(pricing): monthly SKU catalog refresh (2026-07-01)
Automated refresh from Oracle public pricing API.
See workflow artifact 'sku-refresh-logs' for the diff.
2026-07-01 09:00:45 +00:00
root
4552ef7226 Enhance ADB-S to ADB-D business cases
Some checks failed
Deploy Skill to OCI / deploy (push) Failing after 19s
Diagram validators / diagram-validators (push) Failing after 22s
SKILL.md sync / check-sync (push) Successful in 17s
SKU Catalog Refresh / refresh-and-discover (push) Failing after 30s
KB Health Check / check-links (push) Successful in 57s
2026-05-08 15:25:21 -03:00
root
75203e7196 Document Gitea↔GitHub dual-push setup for agents
Some checks failed
Deploy Skill to OCI / deploy (push) Successful in 33s
SKU Catalog Refresh / refresh-and-discover (push) Failing after 26s
KB Health Check / check-links (push) Successful in 1m2s
origin's push URL list spans both remotes (Gitea authoritative, GitHub mirror), so a single `git push origin main` updates both. The setup lives in `.git/config` and isn't tracked, so we explicitly document the reproduction commands plus agent guidance: propose dual-push after commits, never force-push Gitea without OK, and the recovery pattern for divergence.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-29 23:25:47 -03:00
root
c22ba64bdb Brand icons (Slack/Jira) in diagrams + BOM comparison deck
All checks were successful
Deploy Skill to OCI / deploy (push) Successful in 35s
SKILL.md sync / check-sync (push) Successful in 18s
- brand_icon_catalog: shared resolver for non-OCI vendor assets (Slack, Jira, Jira Service Management) under kb/diagram/brand-icons; official > fallback; never hits the network at render time.
- oci_diagram_gen + oci_pptx_diagram_gen: services and external actors accept `brand_icon:`, unlocking real multicloud / SaaS topologies beyond Oracle stencils.
- build_bom_comparison_deck: customer-facing Oracle FY26 deck that compares N BOM specs with native PowerPoint charts and live SKU pricing.
- README + SKILL.md: document the new capabilities and ship copy/paste demo prompts (native .pptx diagram, Slack→OIC→Jira flow, multicloud Postgres↔ADB-S, discount-aware BOM).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-29 23:23:50 -03:00
root
7ea17b2f9e Skill: catalog-first pricing, centralised disclaimer, deck verification
Six fixes after a Codex transcript that scraped oracle.com for SKUs already
in kb/pricing/oci-sku-catalog.yaml. New option-4 cost-estimate flow with a
"catalog first, web never" rule, staleness gate, and miss policy; unconditional
Cookbook scope (any pricing or SKU work, not just specific tool calls); hard
no-WebSearch rule under "What You Do NOT Do"; disclaimer field extended with
reference-only / no-client-discount clauses and referenced from options 4/8/13
(single source of truth — oci_bom_gen.py already consumes it); tightened menu
hints separating option 4 (quick comparison while you scope) from option 13
(formal .xlsx artefact you send); structural deck verification step for
Linux/WSL where PowerPoint binary isn't available.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-29 23:23:48 -03:00
root
ee15e1f45e Add third-party brand icon support
Some checks failed
Deploy Skill to OCI / deploy (push) Successful in 33s
Diagram validators / diagram-validators (push) Failing after 20s
2026-04-27 15:15:31 -03:00
root
a032e7980b Fix drawio OIC icon resolution
Some checks failed
Deploy Skill to OCI / deploy (push) Successful in 35s
Diagram validators / diagram-validators (push) Failing after 21s
2026-04-27 13:07:38 -03:00
root
198861f533 PPTX icon resolver: skip degraded refs from stencil buckets
Some checks failed
Deploy Skill to OCI / deploy (push) Successful in 36s
Diagram validators / diagram-validators (push) Failing after 19s
SKILL.md sync / check-sync (push) Successful in 16s
Symptom on the GCP→OCI PostgreSQL deck: the OCI PostgreSQL icon bbox
rendered as empty space — labels and surrounding ADs all visible,
but no icon where the postgres stencil should be.

Root cause: ``_lookup_icon_ref`` returned the first hit from
``stencils.database_icons`` without checking it was cloneable.
The bucket happens to ship one degraded entry — ``database`` is
``tag=sp`` with ``bbox=None`` (a label-strip leaf, not the real
icon group) — so ``_clone_translated_block`` emitted a zero-size
shape. The 19 viable refs for the same key in
``shape_library.entries`` were ignored because the early-return in
``database_icons`` won.

Fix: extract a shared ``_is_viable_ref`` predicate (slide_path +
child_index/node_path + non-empty bbox + supported tag) and apply
it before returning from BOTH stencil buckets (``database_icons``,
``sample_icon_refs``). On miss, fall through to
``shape_library_entries`` where ``_select_preferred_ref`` already
filtered the same way.

Affects every alias that routes to a degraded stencil entry —
``postgresql`` / ``postgres`` / ``oci_postgresql`` were the obvious
fallout because they all alias to ``database``. The Architecture
Center reconstructions on shape-library-only slugs were unaffected.

Verified by re-rendering examples/output-gcp-virginia-oci-postgres-
adbs-clone/*.pptx — the OCI PostgreSQL bbox now shows the icon
(teal stencil + "Database" intrinsic caption) consistently with
the ADB-S and Refreshable Clone bboxes next to it.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-27 11:03:23 -03:00
root
7f8cba7f30 Skill: kill the lookup-loop time-sink (3 fixes from Codex transcript)
Root cause observed in a real Codex session: the agent burned ~3min
on `make venv` + 4 sequential `make diagram-lookup` queries trying
to find a non-existent ref-arch (OCI PostgreSQL accessed FROM GCP
via Cross-Cloud Interconnect). The catalog has 123 entries; if two
honest queries can't surface a topology, none exists — but nothing
in the skill said "stop." Three coordinated fixes:

1) Makefile: `make venv` is now idempotent.
   Marker file `.venv/.deps-installed` keyed off `requirements.txt`
   mtime — the second `make venv` in a row is a 26ms no-op (was
   1m53s on a Codex sandbox, paid every turn). Force a rebuild with
   `rm .venv/.deps-installed`.

2) kb/architecture-center/catalog.yaml: new `known_gaps` block.
   Surfaced by the lookup tool as a top-of-output banner whenever
   the (synonym-expanded) query tokens match any one of a gap's
   `triggers` token sets. Two gaps seeded from real engagements:

     - gcp-to-oci-native-services — OCI PostgreSQL/OKE/Cache/etc.
       reached FROM GCP via Cross-Cloud Interconnect (the
       Database@Google Cloud entries are the OPPOSITE direction).

     - newer-oci-services-without-icon — OCI Cache (Redis/Valkey)
       and OCI PostgreSQL post-v24.2-toolkit; no ref-arch, no
       toolkit icon, fall back to generic stencil + explicit label.

   Each gap's `notice:` is a copy-paste recommended composition so
   the agent doesn't have to invent a strategy.

3) tools/archcenter_pattern_lookup.py: detects + surfaces gaps.
   `lookup()` now returns `{"matches": ..., "gaps": ...}`. The
   text printer emits a "⚠ KNOWN GAP — <id>" banner with the
   notice block ABOVE the score-based top-K, so the agent sees
   the stop-and-compose signal before ever scrolling to results.
   YAML output mode mirrors the same shape under `gaps:`.

4) SKILL.md (option 2 step 1) + Codex copy via sync-skill.
   New explicit rule: "Lookup budget: max 2 queries — never loop."
   Documents the gap banner, the closest-3-then-ask fallback, and
   the prohibition against grasping at a 3rd refinement.

Verified manually:
  - GCP+postgresql query → gap fires
  - "redis ha multi-az" → newer-OCI gap fires
  - "exadata cross region data guard" → no false-positive gap

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-27 10:46:27 -03:00
root
ff77563133 settings.local.json: extend allowlist for diagram + MCP test workflow
All checks were successful
Deploy Skill to OCI / deploy (push) Successful in 32s
Adds permission entries accumulated during recent work — the local
draw.io.exe path probes used by the fidelity validator, curl probes
against the MCP server (mcp.tech-lad.com) and the Gitea remote
(git.tech-lad.com.br) for status checks, the .githooks/pre-commit
hook so the SKILL.md sync gate runs without a prompt, and a few
read-only awk/grep/curl one-liners hit repeatedly in the SKU /
ref-arch maintenance loop.

Per-machine allowlist only — no behaviour change for other
contributors.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-27 09:29:50 -03:00
root
1b4828f293 MELI Fraud: case-specific scaffolding scripts (3 chassis variants)
Three one-shot Python scripts that build the MELI Fraud As-Is /
To-Be .drawio pair by cloning an Oracle Architecture Center chassis
and overlaying MELI-specific labels, region renames, and workload
pills. Useful as worked examples of the chassis-then-overlay
transform pattern (drawio_template_transform.DrawioTemplate) that
the diagram procedure recommends:

  • build_meli_fraud_from_adbsplusadbd.py — clones the locally
    accepted ATP-S/ATP-D side-by-side reference and partitions cells
    into AS-IS / TO-BE panels by x-coordinate.
  • build_meli_fraud_from_crossregion.py — uses Oracle's
    exadata-dedicated-cross-region-dataguard ref-arch (two regions
    with DRG + RPC + Data Guard already drawn) as chassis and only
    overlays MELI-specific pills.
  • build_meli_fraud_from_templates.py — combines the in-region and
    cross-region Exadata ref-archs and clones the in-region
    topology to the right for the Montreal DR.

All three honour the standing rule: do not edit text inside Oracle
SVG stencil shapes — overlay new mxCells in whitespace instead.
Outputs land under examples/output-meli-fraud-adbd-migration/.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-27 09:29:37 -03:00
root
5566a171b0 PPTX: ensure [Content_Types].xml has defaults for every media extension
Symptom: PowerPoint prompted to repair some generated decks. Cause:
when python-pptx (or our native renderer) repacks the .pptx after we
embed Oracle template assets — some of which are SVG-backed —
[Content_Types].xml can lose the Default entry for "svg" (and other
extensions present under ppt/media), which makes Office refuse to
open the file cleanly.

Fix: after writing the deck (and after any native renderer pass),
walk ppt/media, collect the actual extensions in use, and ensure
[Content_Types].xml declares a Default for each one (svg, png, jpg,
jpeg, gif, bmp, tiff, emf, wmf, ico, webp). Repack only when at
least one new Default was added — no-op fast path otherwise.

Lines up with the existing field rule: every embedded media
extension must be declared in [Content_Types].xml Defaults, or
PowerPoint flags the file as corrupt.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-27 09:29:18 -03:00
root
eef213612c Aliases for newer OCI services without toolkit icons (Redis, PostgreSQL)
Some checks failed
Deploy Skill to OCI / deploy (push) Successful in 36s
Diagram validators / diagram-validators (push) Failing after 34s
SKILL.md sync / check-sync (push) Successful in 37s
Diego pointed at examples/output-ashburn-redis-oke and asked: does
Oracle ship a Redis icon for drawio? Answer: NO. Confirmed against
both libraries:
  - kb/diagram/oci-icons.json (OCI Toolkit v24.2)         → 0 hits
  - kb/diagram/oci-pptx-icons-index.json (OCI_Icons.pptx) → 0 hits
Same for OCI Cache, Valkey, OCI PostgreSQL — all are GA after the
toolkit shipped.

Oracle's own reference architecture
``modernize-app-dev-oci-postgresql-redis-opensearch`` works around
this by embedding inline SVG vector data into ``shape=stencil(...)``
cells — there is no reusable named stencil. The closest reusable
match is the generic ``database`` icon (8 cells in oci-icons.json,
the canonical "Database" stencil).

Persistent fixes:

- TYPE_TO_ICON (PPTX) and ICON_TYPE_ALIASES (drawio) both gain
  aliases for ``redis`` / ``oci_cache`` / ``oci_cache_with_redis`` /
  ``cache`` / ``valkey`` / ``postgresql`` / ``postgres`` /
  ``oci_postgresql`` → ``database``. Plus ``opensearch`` →
  ``database_opensearch`` (which exists) on the PPTX side.

- SKILL.md option 2 step 3 documents the convention: when an OCI
  service doesn't have a toolkit icon, use the generic stencil and
  pair with an explicit ``label:`` carrying the real service name
  (e.g. ``label: "OCI Cache (Redis)"``). When Oracle ships a v25+
  toolkit with these icons, update oci-icons.json + the alias tables
  and the next render picks up the real icon automatically.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-26 00:00:17 -03:00
root
b77a855a3e Extractor: drawio → absolute_layout YAML scaffold (107/132 cached)
Closes the procedural hole that kept making Codex sessions fall back
to ``examples/`` for YAML scaffolding even after the SKILL forbade it.

The lookup tool returns a canonical Oracle ``.drawio`` as the geometry
source, but the agent had no YAML version of that geometry to copy —
the .drawio is XML with stencil-encoded icons. Without a scaffold,
agents reverse-engineered or fell back to ``examples/`` (which is
forbidden but happened anyway because the alternative was painful).

New tool ``tools/archcenter_drawio_to_template.py`` extracts:
  • canvas dimensions
  • containers (region / vcn / ad / subnet) classified by stroke /
    fill style markers
  • service bounding boxes with ``type: TODO_identify`` (the icon
    type is encoded in stencil bytes — agent fills it from the
    renderer's TYPE_TO_ICON aliases when authoring the spec)
  • edge waypoints (source, target, points)

Output lands at ``kb/diagram/assets/archcenter-refs/<slug>/_template.yaml``
next to the .drawio. Lookup now surfaces it as
``cached: yaml=<path>`` so the agent has a one-step "copy this YAML
and adapt" path.

Ran across all 132 cached folders: 107 templates emitted, 24 had no
.drawio (zip didn't ship one), 1 already cached.

Other persistent guardrails added in this commit:

- SKILL.md option 2 step 3: explicit reminder that valid ``type:``
  values come from ``TYPE_TO_ICON`` / ``ICON_TYPE_ALIASES`` in the
  renderer source plus the icon-index JSON files. Do NOT grep
  ``examples/`` for ``type:`` — that's where the previous Codex
  session was looking, against the rule.

- ``make archcenter-templates-refresh`` Makefile target.

- The lookup index now also indexes ``_template.yaml`` per slug.

- Auto-extracted templates committed under
  ``kb/diagram/assets/archcenter-refs/*/_template.yaml`` so a fresh
  clone has them on first lookup (no extraction step needed).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-25 23:56:29 -03:00
root
5b8a6ad5ec Lookup index auto-invalidates on KB updates + manual rebuild flag
Diego asked: does the persisted ``archcenter-refs-index.json`` auto-
update when the KB is updated? Partially — mtime on the cache root
catches add/remove of subdirs (POSIX), but NOT changes to files
INSIDE existing subdirs (description.md added, .drawio replaced).

Two fixes:

1. Both KB-update tools now ``touch`` ``kb/diagram/assets/archcenter-refs``
   when they finish a run that produced changes:
   - ``archcenter_description_fetcher.py`` after fetched > 0
   - ``archcenter_zip_downloader.py`` after downloaded / extract /
     overwrite events
   The touch bumps the parent mtime, which the next lookup detects
   and uses to rebuild its persisted index. Closes the silent-drift
   case where description.md fetches landed but the index didn't
   notice.

2. ``archcenter_pattern_lookup.py --rebuild-index`` flag — escape
   hatch for manual KB edits (someone replaces a cached .drawio by
   hand) where neither tool ran. Removes the stale index file before
   the lookup, forcing a cold rebuild.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-25 23:38:29 -03:00
root
c46219468f Lookup speed (78s → 1s) + drawio ADB-S/RC alias coverage
Two persistent fixes flagged from a Codex session:

1. ``archcenter_pattern_lookup`` ran in 78 s on WSL2 because:
   - ``_cached_assets`` did ``iterdir`` + recursive ``rglob`` over the
     whole 113-folder cache for EVERY catalog entry (123x).
   - ``_patterns_for`` reloaded ``reference-patterns.yaml`` for every
     match (125 reloads = ~5 s).
   - Description text from disk was read for every entry, even those
     that wouldn't make the top-K.

   Now: one-shot scan of the cache dir cached in-memory AND persisted
   to ``kb/diagram/assets/archcenter-refs-index.json`` keyed by mtime;
   patterns YAML loaded once and indexed by URL; a two-pass scoring
   pipeline that only reads description text + cached_assets +
   visual_patterns for the top-K candidates instead of every entry.
   Result: cold run 14 s (one-time index build), warm run 1.1 s.

2. The drawio renderer had no alias for ``adb_s`` / ``adb_serverless``
   / ``autonomous_database_serverless`` / ``refreshable_clone`` —
   Codex's spec used ``type: adb_s`` and the icon never resolved.
   Mapped them to ``autonomous_database`` (the canonical 7-cell
   stencil shipped by the OCI Toolkit), with ``adb_d`` as fallback.
   Same proactive expansion in the drawio side that the PPTX side
   already got (oci_goldengate, dynamic_routing_gateway, atp/adw,
   kms/secret, identity/iam, iac/terraform, oac/oic, kafka).

The persisted lookup index is committed so a fresh clone hits warm
performance on first ``make diagram-lookup``.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-25 23:33:40 -03:00
root
82d09aeee6 PPTX icon resolver: 50+ proactive aliases + menu-mode 'no code edits' rule
Diego flagged two patterns from the Codex session:

1. Aliases for natural-language slugs were missing — Codex authored
   ``type: refreshable_clone`` and ``type: oci_goldengate`` and the
   resolver returned None for both. Beyond fixing those two, expand
   the table proactively: 50+ slugs an SA / agent might naturally
   reach for (atp, alb, nlb, apigw, lambda, kms, secret, kafka,
   alarm, email, identity, iam, iac, terraform, oac, oic, language /
   speech / vision, rpc / lpg / cpe, health_check, tags, etc.) all
   mapped to canonical icon entries that exist in
   kb/diagram/oci-pptx-icons-index.json.

2. Codex was editing tools/oci_deck_gen.py and the deck-spec while
   fulfilling a menu-driven option-2 request — going off the
   procedure to "fix" perceived bugs in the renderer. New rule in
   SKILL.md § What You Do NOT Do: when the user is in menu mode
   (options 1–14), the agent USES the existing tools, never modifies
   them. Tool gaps (missing aliases, broken paths) get surfaced as
   end-of-reply follow-ups for a separate developer-mode session.
   Two narrow exceptions kept: kb/field-findings/tracker.yaml via
   option 11, and writing customer spec/output YAML under examples/.

Codex copy auto-synced via the pre-commit hook.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-25 23:18:22 -03:00
root
0b6ca3b776 SKILL.md option 2: clarify cached .drawio vs examples/ as references
Diego flagged that Codex, when authoring an absolute_layout, fell
back to grepping ``examples/`` for AWS/OCI multicloud patterns even
though the procedure said not to. The reason was real: the lookup
tool returns a cached ``.drawio`` (canonical Oracle geometry) but
no canonical ``absolute_layout.yaml`` template, so the agent had no
YAML scaffold to copy the spec shape from.

Tighten the rule rather than ban it outright:

  • Cached ``.drawio`` = GEOMETRY source. Container nesting,
    padding, AD/subnet placement, icon choices come from there.
  • ``examples/`` = YAML scaffold reference ONLY (which fields
    exist, how connections are authored, fontSize unit). Do NOT
    copy geometry numbers — those came from a different topology.

Rule of thumb baked into the SKILL: if you're copying (x, y, w, h)
from examples/, stop and copy from the cached .drawio instead.

(Codex copy auto-synced via the pre-commit hook installed earlier.)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-25 23:04:26 -03:00
root
357dd10670 SKILL.md sync: reject isolated edits to the .agents/ copy
Diego asked the right question: what if someone edits the Codex
side directly? Until now the sync was unidirectional (root →
.agents/) but the hook only fired when root SKILL.md was staged —
isolated .agents/ edits sneaked past the hook locally and only got
caught by CI's --check. A future ``make sync-skill`` would then
silently destroy them.

Hardened both layers to reject the asymmetric case at the moment
of the commit/PR:

- Pre-commit hook now classifies the staged set and REJECTS
  commits that stage .agents/skills/.../SKILL.md in isolation,
  with a step-by-step message: move the edit into root SKILL.md
  and re-stage. The hook still auto-syncs when root SKILL.md is
  staged.

- CI gate adds a second step (PR-only) that diffs the PR's base
  against head; if .agents/ moved but root SKILL.md didn't, fails
  with an actionable error before the build proceeds.

- README documents the direction explicitly: edits land in root
  SKILL.md; .agents/ is auto-generated; Codex-specific instructions
  belong in AGENTS.md, not in the SKILL.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-25 23:00:51 -03:00
root
fba2d23d5d SKILL.md sync: pre-commit hook + CI gate + make install-hooks
Three-layer defense to keep root SKILL.md (Claude Code) and
.agents/skills/oci-deal-accelerator/SKILL.md (Codex) byte-aligned.
Without this, Claude Code and Codex can drift and give the user
contradictory instructions — exactly the failure mode that produced
the workload-driven-mode incident on 2026-04-25.

Layers (least → most enforcement):

1. Local pre-commit hook (.githooks/pre-commit, opt-in via
   ``make install-hooks`` which sets core.hooksPath). When SKILL.md
   is staged, auto-runs scripts/sync-skill.py and stages the
   regenerated .agents/ copy in the same commit. Idempotent.

2. ``make install-hooks`` target + a tip line in ``make venv``'s
   output so any new clone discovers the hook setup.

3. CI gate (.gitea/workflows/skill-sync.yaml) on every push/PR
   touching SKILL.md or the .agents/ copy. Runs
   ``scripts/sync-skill.py --check`` and fails the build on drift.
   Catches anyone who skipped the hook.

README documents the rationale and the three layers.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-25 22:58:33 -03:00
root
d86adaf7cc Diagram procedure: forbid workload-driven shape, warn at runtime
The Codex session showed why the workload-driven mode is the wrong
default. Codex authored a spec under
``tenancy → regions → compartments → services`` (the documented
"workload-driven" mode), generated two .drawio files, and reported
success. The output was unusable: services rendered as colored
rectangles with text instead of OCI icon stencils, connector text
went into the edge value (forbidden by the connector-label rule),
and the spec validator never ran because it only fires on
``absolute_layout`` blocks.

Diego: "los drawio son horribles, por que sucede eso?".

Three persistent fixes:

1. SKILL.md option 2 now says ``absolute_layout`` is REQUIRED for
   step 3, calls out workload-driven explicitly as forbidden, and
   explains *why* (no stencils, no validator).

2. docs/skill/output-formats.md § Diagram modes is rewritten — mode
   1 is ``absolute_layout`` (REQUIRED), mode 2 is workload-driven
   (DEPRECATED, back-compat only). Removes the "two acceptable
   shapes" framing that let Codex pick the wrong one.

3. ``oci_diagram_gen.py`` now prints a loud stderr WARNING when a
   spec takes the workload-driven path, naming the procedure docs.
   Catches any agent that skipped reading SKILL.md before generating.

Codex copy synced via ``make sync-skill``.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-25 22:54:03 -03:00
root
a1ad3a6fa1 SKILL.md option 2: explicit format question + numbered procedure steps
A Codex session showed the gap: option 2's prose asked the user to
describe the architecture but only mentioned the output formats in
passing ("if you want X / if you want Y"), so the agent never asked
which format(s). Codex also skipped the reference-architecture lookup
and went straight to grepping ``examples/`` for pre-existing specs —
``examples/`` is previous user output, not the authoritative Oracle
catalog.

Two persistent fixes for any agent (Claude Code, Codex, Cursor, …):

1. Option 2 now asks two explicit questions in one message and waits
   for both answers before doing anything: (1) describe / paste spec,
   (2) pick output format(s) — drawio, native PPTX, or both.

2. The procedure is restated as a numbered list directly under
   option 2 (no longer a single-sentence reference to
   docs/skill/output-formats.md). Step 1 explicitly says use
   ``archcenter_pattern_lookup.py`` against the catalog and explicitly
   forbids using ``examples/`` as a reference source.

Synced to the Codex copy at .agents/skills/oci-deal-accelerator/SKILL.md
via ``make sync-skill`` so both agents see the same instructions.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-25 22:49:47 -03:00
root
a0a059887a Deck generator: honor output.render_standard_sections, fix principles overlap
Two bugs flagged on the MySQL HeatWave HA example (2026-04-25 round 5):

1. ``render_standard_sections: false`` under the ``output:`` block was
   silently ignored — the generator only checked the top-level key.
   Result: every spec that put the flag where the docs suggest got the
   full standard deck PLUS the custom slide, producing a duplicated
   "Architecture Overview" + dedicated diagram slide. Now the
   generator honors both locations.

2. Architecture Principles slide allocated only 0.4" per bullet —
   exactly one 11pt line. Wrapping principle summaries (e.g. D-03
   Use-Case Fit's 125-char text) overflowed into the next bullet's
   slot, visually overlapping D-02. Diego: "D-03 esta superpuesto a
   D-02, lo mismo pasa en otras columnas". Bumped per-item height to
   0.95" — fits 2-3 wrapped lines with breathing room.

3. PPTX rasterizer (oci_pptx_render.py) gained word-wrap so the
   local PNG preview matches what real PowerPoint draws. Without it,
   long text rendered on a single line off the column and the
   principles fix looked broken in preview when it was actually fine
   in PowerPoint.

Persistent: all three fixes apply to every deck the skill generates.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-25 22:44:40 -03:00
root
68d1753a74 Spec validator: padding on all 4 edges + connector-over-label check
Closes the gap between what the validator catches and what Diego
flagged on the MySQL HeatWave HA example (2026-04-25 round 4):

- CONTAINER_PADDING_VIOLATION now checks all four edges (top / bottom /
  left / right). Previously only bottom — DB Subnet's left/right edges
  touching the AD borders went unflagged.

- CONNECTOR_OVER_LABEL now runs at SPEC level (was post-render drawio
  only). Catches "Network Load Balancer label sits below the arrows so
  the arrows cross it" before either renderer emits anything; covers
  the PPTX path too.

  Implemented via Liang-Barsky line-rect clipping on every connector
  segment vs every free-floating label bbox.

Renderer policies persist for every new diagram (bent connectors,
icon-group preference, mysql aliases). Spec-level rules are now
enforced earlier and on both render paths, so a spec authored against
the procedure will pass before any artifact is produced.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-25 22:11:02 -03:00
root
3fb832e578 PPTX connectors: emit native bentConnector2/3/5 instead of disjoint lines
Spec authors hand the renderer a polyline like
``points: [[210,280],[400,280],[700,130]]``. The previous code emitted
one ``prst="line"`` shape per segment, so the elbow was two separate
straight lines that PowerPoint cannot recognise as a connected path.

The OCI template (kb/diagram/assets/OCI_Icons.pptx) uses native
PowerPoint bent connectors instead — 98 ``straightConnector1`` plus
22 ``bentConnector2/3/5`` plus 15 ``line`` across 48 slides. Match
that convention:

  • 2 points  → straightConnector1 (one segment, unchanged)
  • 3 points  → bentConnector2     (one elbow)
  • 4 points  → bentConnector3     (S-shape, two elbows)
  • 5+ points → bentConnector5     (four elbows)

The rasterizer (oci_pptx_render.py) now also understands bentConnectorN
so the local PNG preview matches what real PowerPoint draws — without
this it rendered every connector as one straight diagonal regardless of
the prst.

Persistent: applies to every absolute_layout connector for every spec,
not a per-case patch.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-25 21:49:39 -03:00
root
e384e627d1 PPTX icon resolver: prefer full icon group over text-strip variant
OCI_Icons.pptx ships both a full icon group (tag=grpSp, ~0.7" tall)
and a tiny "label strip" (tag=sp, ~0.2" tall) under the same slug for
many services. The previous resolver picked whichever came first in
the index, which for 'mysql' returned the text strip — so the PPTX
diagram showed a label-only shape instead of the dolphin/HeatWave
icon, while drawio rendered the proper stencil.

Two fixes, both persistent (apply to every icon family, not just MySQL):

- TYPE_TO_ICON for mysql/heatwave now lists 'mysql_heatwave' (the
  grpSp) before 'mysql' (the strip).
- _select_preferred_ref now filters viable refs to those that are
  either grpSp/pic OR have a bbox ≥0.4"x0.4" — text strips fall out
  before the scoring function runs.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-25 21:42:21 -03:00
root
e5a1959585 Diagram tooling: make targets, CI gate, LLM-rewrite hook, refresh docs
Implements points 3–8 of the post-procedure follow-up.

- Make targets: diagram-lookup, diagram-validate-spec, diagram-spec-audit,
  archcenter-descriptions-refresh, archcenter-smoke. Promotes the new
  tools out of "remember the CLI" into discoverable build-automation.
- .gitea/workflows/diagram-validators.yaml — runs spec validator across
  every absolute_layout spec on push/PR, plus a drawio re-render smoke
  test on the canonical example. Hard fail blocks merges.
- archcenter_pattern_lookup --llm-rewrite — opt-in (ANTHROPIC_API_KEY
  env var, mirroring DRAWIO_EXE pattern). Rewrites natural-language
  queries into canonical OCI terminology before scoring; falls back to
  the original query on any error.
- diagram_spec_validator — documents the policy on legacy archcenter
  reproductions: LABEL_NEAR_PARENT_EDGE stays a warning so verbatim
  reconstructions don't lose pixel-fidelity from cosmetic edits.
- README — documents the asset refresh procedure (downloader +
  description fetcher are idempotent, refresh quarterly).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-25 21:37:28 -03:00
root
b30a4f0d32 Diagram generation: ref-arch-driven procedure + spec validator + KB enrichment
The diagram path now follows a documented standard procedure (lookup
the closest Oracle Architecture Center reference → confirm components
→ author absolute_layout → spec validator → render → visually verify)
and ships persistent guardrails so layout regressions can't recur.

Persistent procedure changes (apply to all users, all sessions):
- tools/diagram_spec_validator.py — geometry checks (CONTAINER_TOO_THIN,
  CONTAINER_PADDING_VIOLATION, LABEL_OVERFLOW_PARENT) run BEFORE either
  renderer (drawio + PPTX). Catches the subnet-collapse / label-overflow
  bugs that the post-render drawio validator missed.
- tools/oci_diagram_gen.py + tools/oci_pptx_diagram_gen.py — call the
  spec validator before emitting any output. Adds mysql / mysql_heatwave
  type aliases.
- tools/archcenter_pattern_lookup.py — scores against cached page
  descriptions (not just the 1-line summary), supports --queries for
  multi-fragment composition, and applies synonym expansion via
  kb/architecture-center/synonyms.yaml so "LB HA cross AD" matches
  "load balancer high availability availability domain".
- kb/architecture-center/synonyms.yaml — canonical synonym table
  (load balancer, autonomous database, data guard, …) used by the
  lookup scorer.

KB enrichment:
- tools/archcenter_description_fetcher.py + 121 cached _description.md
  under kb/diagram/assets/archcenter-refs/<slug>/. Removes the runtime
  dependency on docs.oracle.com when authoring specs and feeds the
  pattern-lookup scorer.
- 110+ cached .drawio / .svg / .png references for offline reuse,
  plus the OCI Toolkit v24.2 import (kb/diagram/assets/oci-toolkit-drawio).

Documentation:
- docs/skill/output-formats.md — new "Standard diagram-generation
  procedure (MANDATORY)" + geometry rules + the new validator entry.
- SKILL.md option 2 — references the mandatory procedure.
- README.md — describes the spec validator, archcenter_pattern_lookup
  and description fetcher, and updates the KB-health table.

Tooling that backs the procedure (cumulative across recent sessions):
tools/archcenter_case_runner.py, archcenter_batch_driver.py,
archcenter_zip_downloader.py, drawio_visual_validator.py,
drawio_fidelity_eval.py, harvest_drawio_icon.py, import_oci_library.py,
oci_pptx_diagram_gen.py, oci_pptx_render.py, refresh_pptx_icon_index.py.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-25 21:15:21 -03:00
root
2491c38d4b Fail-fast and log HTTP response on PR/issue creation
All checks were successful
Deploy Skill to OCI / deploy (push) Successful in 26s
KB Health Check / check-links (push) Successful in 58s
Previous curl calls ignored exit codes — PR/issue creation was silently
failing (branch got pushed but no PR/issue landed) while the step reported
green. Now each curl captures the response body and HTTP status, prints
both for debugging, and exits non-zero if status != 201.

Also dropped the labels field from the issue payload — Gitea rejects
issue creation when referenced labels don't exist in the repo, which
may have contributed to the silent failure. Labels can be added
manually post-creation.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-24 17:45:12 -03:00
d9b1bb52a4 update ADB serverless KB for AI Lakehouse workload 2026-04-24 15:50:05 -03:00
root
9fbe05a6a5 Use per-run branch name to avoid push collisions
All checks were successful
Deploy Skill to OCI / deploy (push) Successful in 19s
Prior run pushed automation/sku-refresh-2026-04-24 successfully but
failed before opening the PR (issue-creation bug, now fixed). On the
next run, main has moved, so a new commit on the same branch name has
a different parent → non-fast-forward rejection.

Append ${{ github.run_number }} to make the branch unique per workflow
invocation. Orphan branches left behind can be cleaned up after their
PRs are merged/closed.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-24 12:45:57 -03:00
root
9b4d04cf34 Make discover count machine-readable for CI parsing
All checks were successful
Deploy Skill to OCI / deploy (push) Successful in 25s
The workflow's grep-on-free-text approach was fragile: local run correctly
extracted 162, but in the CI run the 'Open issue' step was skipped, meaning
new_count ended up as 0 after parsing. Likely causes: stdout buffering,
color codes, or shell differences between local and the Gitea runner's
shell.

Fix: tools/refresh_sku_catalog.py --discover now emits a deterministic
last-line marker `DISCOVER_MISSING_COUNT=<n>`. The workflow parses that
with sed (anchored, unambiguous) instead of the human-facing summary
line. Also added a diagnostic echo so the parsed value shows up in CI
logs for future debugging.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-24 12:43:06 -03:00
root
30394ece48 Pin upload-artifact to v3 for Gitea Actions compatibility
All checks were successful
Deploy Skill to OCI / deploy (push) Successful in 21s
Gitea Actions runner does not support actions/upload-artifact v2.0.0+
(error: "@actions/artifact v2.0.0+, upload-artifact@v4+ and
download-artifact@v4+ are not currently supported on GHES").

The v4 release switched to a new artifact API that only GitHub-hosted
runners implement. v3 still uses the v1 API and works on Gitea /
self-hosted / GHES runners.

Downgraded in both sku-catalog-refresh.yaml and kb-health.yaml.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-24 12:31:58 -03:00
root
480c4bca52 Fix Python setup in Gitea Actions workflows
All checks were successful
Deploy Skill to OCI / deploy (push) Successful in 25s
The oci-mcp-runner uses node:20-bookworm which runs as root and does
NOT ship with sudo installed. Our workflows used 'sudo apt-get' → step
failed with 'sudo: command not found' (exit 127) on first invocation
of sku-catalog-refresh.yaml.

Fix both affected workflows (sku-catalog-refresh + kb-health):
- Drop the `sudo` prefix (we're already root).
- Install Python deps via apt packages (python3-requests, python3-yaml,
  python3-bs4) instead of pip. Avoids PEP 668 / externally-managed
  environment error on Debian 12 and is faster/cacheable by the runner.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-24 12:24:35 -03:00
root
433b08071b Use auto-provisioned GITHUB_TOKEN in SKU refresh workflow
All checks were successful
Deploy Skill to OCI / deploy (push) Successful in 30s
Switch from manually-configured secrets.GITEA_TOKEN to the auto-provisioned
secrets.GITHUB_TOKEN that Gitea Actions creates per run. Scoped to the repo,
rotates per workflow run, no manual config needed.

Added explicit permissions block (contents:write, pull-requests:write,
issues:write) so the ephemeral token has the scopes required to push a
branch, open the PR, and open the issue for new SKUs.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-24 11:51:00 -03:00
root
874d40d38a Improve SKU catalog hygiene and BOM accuracy
All checks were successful
Deploy Skill to OCI / deploy (push) Successful in 21s
- refresh_sku_catalog.py: add --discover to report API SKUs missing from
  catalog, filtered to already-curated serviceCategory values. Auto-runs
  at end of --validate and --refresh so gaps surface on every maintenance
  pass. First run found 162 missing SKUs (Blackwell GPUs, X12 Ax compute,
  VMware reserved tiers, WebLogic-on-OKE, Analytics/OIC BYOL).
- oci_bom_gen.py: fix Cost % column being blank. Back-fill was gated on
  formula detection but data rows write raw numbers, so the predicate
  never matched. Now tracks data_item_rows explicitly.
- .gitea/workflows/sku-catalog-refresh.yaml: monthly automation (1st at
  09:00 UTC). Auto-refresh prices → push branch + open PR; detect new
  SKUs → open issue with labels. Gated on secrets.GITEA_TOKEN.
- kb/pricing/oci-sku-catalog.yaml: add B95714 / B95715 (Autonomous ATP
  Dedicated ECPU, LI + BYOL) — canonical SKUs for ADB-D pricing.
- kb/services/compute.yaml: add X12 family (VM.Standard4.Ax.Flex,
  BM.Standard4.Ax.120), E6.Ax and A4.Ax variants. Verified against
  docs.oracle.com computeshapes.htm. Bump last_verified + changelog.
- templates/bom-spec.yaml: document 730 hrs/month convention as default
  (= real annual billing / 12; 744 overstates by 1.92% on 12-month TCO).
- Makefile: new 'make sku-discover' target.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-24 11:40:53 -03:00
root
a22711c065 Update ExaCS X11M KB with authoritative datasheet figures
All checks were successful
Deploy Skill to OCI / deploy (push) Successful in 30s
Source: ADB-D X11M Datasheet v1.0 (Jan 2025), Table 1.

- Add HC storage variant (default): 80 TB usable disk/SS, 264 TB raw, 1.25 TB
  XRMEM + 27.2 TB flash cache per SS. Keep EF variant (52.5 TB usable/SS).
- Add x11m_elastic_base (2 DB + 3 SS): 240 TB total usable disk, 192 TB Max
  DB Size no-backup (what OCI Cost Estimator caps at), 96 TB with backup.
  Include performance metrics (5.6M read IOPS, 300 GB/s flash bw, etc.).
- Add x11m_base_system as distinct SKU: fixed-spec, non-expandable, 192
  ECPUs / 73 TB usable disk / 10 GbE — not the same as elastic 2+3.
- Replace misleading rack_configurations table (mixed X9M figures) with
  elastic per-server model; 'quarter/half/full rack' noted as legacy.
- Add pricing verified against OCI Cost Estimator 2026-04-23: DB and SS at
  \$2.9032/hr each; base config \$10,800/month excluding licenses.
- Add gotcha exacs_x11m_hc_vs_ef: default quotes to EF without
  justification; HC serves hot data from flash cache at same latency and
  far better \$/TB.
- Document the three distinct storage figures (Total Usable Disk vs Max DB
  Size no-backup vs with-backup) to avoid customer confusion.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-24 10:02:42 -03:00
root
9d5cda8986 Fix BOM workbook monthly totals
All checks were successful
Deploy Skill to OCI / deploy (push) Successful in 21s
2026-04-23 10:54:07 -03:00
root
6de2251e00 Fix slide and diagram bugs in deck/diagram generators
Service Tiering slide no longer falls back to the workload `name`
field for the tier label, which previously rendered "Bronze Bronze"
when the spec only carried tier names. Uptime/RTO/RPO now fill from
tier defaults when the spec omits them.

Architecture Principles slide enriches caller-supplied items with
name + summary from the KB when only the principle id is given,
instead of rendering bare placeholders like "P-01 P-02".

Architecture Overview slide auto-builds a two-region visual when the
proposal spec names a `dr_region` but doesn't pre-render `architecture.visual`,
so DR is no longer dropped from the deck.

Diagram generator gained a region-level `local_dr` flag that adds a
"Local DR Standby" dormant node inside the region, and now auto-wires
an "RPC (Remote Peering)" edge between DRGs when the spec defines
two or more regions with DRGs but no manual peering connection.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-23 00:35:10 -03:00
root
77298a471c Read DR region from spec + make operational_raci handler tolerant
All checks were successful
Deploy Skill to OCI / deploy (push) Successful in 19s
Architecture Overview slide was rendering the DR region with a fallback
label (e.g. "DR STANDBY" with no region name) because _adapt_flat_spec()
only consulted disaster_recovery / architecture.dr — it never looked at
the dr_region / tenancy.regions fields the MCP actually emits. The
adapter now discovers the primary and DR regions from:

- spec.primary_region / spec.region / architecture.primary_region
- spec.dr_region / spec.secondary_region / architecture.dr_region
- tenancy.regions[] entries (strings or {region, role} dicts, with role
  in {primary, hub, prod, production} vs {dr, standby, secondary,
  failover})

When both regions are known, the adapter emits an architecture.visual
with two labeled region blocks so the DR region renders with its real
name (e.g. "mx-monterrey-1 [DR STANDBY]") instead of the placeholder.
If the spec already supplies architecture.visual or diagram_path, those
are preserved instead of overwritten.

Operational RACI slide kept being skipped for payloads that passed
operational_raci in a non-canonical shape. The from_spec handler now
accepts:

- Top-level key aliases: operational_raci, raci, operations_raci
- Bare string ("fully_managed") → loads KB defaults for that model
- List of dicts → used directly as raci_items
- Dict with raci_items / items / activities and model / engagement_model
- Empty raci_items → falls back to KB defaults by model

The flat adapter also now respects a user-supplied operational_raci
instead of overwriting it with the co_managed default. Verified:
operational_raci: "fully_managed" renders the Fully-Managed RACI table
with 18 activities; bare flat MCP payload still gets the 13-activity
co_managed default.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-22 14:32:25 -03:00
root
6209907a63 Enrich MCP flat-spec adapter to emit full ECAL deck content
All checks were successful
Deploy Skill to OCI / deploy (push) Successful in 17s
Regression after the closing-slide removal surfaced a separate bug:
_adapt_flat_spec() only emitted metadata + summary + cost, so decks
generated from the MCP flat payload collapsed to 3-5 slides of title +
summary. The deck generator's ECAL sections (service_tiering,
architecture_principles, environment_catalogue, operational_raci, etc.)
all check top-level spec keys the adapter never produced.

Adapter now also emits, from the flat payload + kb/patterns defaults:
- service_tiering from services[] (preserves any tier/uptime/rto/rpo)
- architecture / architecture_principles (ECAL "always" picks)
- ha_dr tiers derived from the distinct service tiers present
- security baseline (IAM/network/database/monitoring controls)
- environment_catalogue (Prod/Pre-Prod/Dev-Test, +DR if enabled)
- operational_raci co_managed default from the KB
- next_steps skeleton

Flat MCP payload now renders 11 content slides instead of 3-5, and the
proposal-spec.yaml path (non-flat) is unchanged — still 16 slides for
examples/proposal-spec.yaml.

Also documents the new data_services SKUs in docs/bom-cookbook.md as
Recipe 4 (BDS/DS/DF) so MCP payloads can use the catalog codes directly.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-22 13:13:42 -03:00
root
fc550c14bb Drop closing blanks, honor primary_driver, catalog data-services SKUs
All checks were successful
Deploy Skill to OCI / deploy (push) Successful in 23s
- oci_deck_gen / oci_bizcase_gen: stop appending the Thank You + Oracle
  logo-only closing slides at the end of every generated deck.
- oci_bizcase_gen: Business Drivers now reads primary_driver at the
  drivers-level and at the top level, and renders natural-language values
  verbatim (only snake_case enum tokens are Title-cased). A spec-provided
  drivers.items / additional / secondary list replaces the hardcoded
  "Financial Impact of Inaction" + "Operational Impact" fallback cards.
- oci-sku-catalog.yaml: add data_services category with the four real
  Big Data Service SKUs (B91128/B91129/B91130/B93555) plus EST-DS-NOTEBOOK,
  EST-DS-MODEL, EST-DF-SPARK as estimate placeholders (OCI Data Science /
  Data Flow have no dedicated SKUs in the public pricing API — they are
  billed via the underlying compute shape).
- oci_bom_gen: resolver now prints a stderr warning and tags estimate/
  unknown line items with an explicit note; the xlsx writer renders
  "other" category items under an "Uncategorized — confirm SKUs" section
  at the end instead of silently dropping them.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-22 12:34:37 -03:00
root
490072a4b7 Accept flat-spec input aliases across generators
All checks were successful
Deploy Skill to OCI / deploy (push) Successful in 20s
Harden bizcase, bom, deck, and diagram generators to tolerate payload
shape variants (metadata/cover/summary/line_item aliases, current_state
as string, alternate pillar keys) so MCP and CLI flat specs render
consistently. Add input-alias tests per generator.

Also loosen KB governance tests to handle multi-document service YAMLs
with optional changelogs, untrack the customer demo output under
examples/output-demo-pharma-mx/ (matches .gitignore), and ship an
ADB-S vs Aurora 500GB sample deck.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-21 10:22:14 -03:00
root
bcb16795d1 Add BOM cookbook to shortcut SKU mapping for common patterns
All checks were successful
Deploy Skill to OCI / deploy (push) Successful in 24s
Codex sessions burn 10+ tool calls grepping kb/field-knowledge and the SKU
catalog to map standard requirements (ExaCS X11M BYOL, ADB-D, ADB-S + block
+ FastConnect) to the 4-5 SKUs the MCP BOM tools need. Bake the recipes
into docs/bom-cookbook.md so the LLM can skip the exploration loop for
well-known patterns, and link it from SKILL.md between Output Generation
and Knowledge Base (same progressive-disclosure pattern the other docs use).

Recipe 2 (ADB-Dedicated) explicitly calls out the infra-SKU overlap with
ExaCS — one of the specific traps the exploration loop keeps hitting.
Catalog-fallback note keeps the cookbook honest when a requirement does
not match.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-20 15:29:20 -03:00
root
e57ab57b48 Accept MCP flat payload in deck generator to stop silent-blank decks
generate_deck on the MCP server passes a flat spec (customer_name, title,
workload_type, services, cost_summary, ...) — but from_spec only understood
the proposal-spec YAML shape (metadata/summary/architecture/...). With no
matching keys, only the title and closing layouts rendered, both populated
with empty strings, producing a deck that looked blank.

Detect the flat shape in from_spec and adapt it into the proposal-spec
fields that the existing slide builders already consume. Title, summary
(target state + current-state bullets) and cost slides now render from
whatever the MCP tool sends; the richer proposal-spec path is untouched.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-20 15:27:44 -03:00
root
dc4abf3774 Install Python via apt instead of setup-python in KB health workflow
All checks were successful
Deploy Skill to OCI / deploy (push) Successful in 24s
actions/setup-python@v5 fails on the arm64 Gitea runner with "version '3.12'
with architecture 'arm64' was not found" — the prebuilt Python manifest
doesn't cover this runner/arch combo. Use the system python3 from apt; the
link-check scripts don't require 3.12 specifically.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-20 11:00:56 -03:00
root
01baff1f5b Ship Oracle FY26 PPTX template in repo so MCP server finds it
The 13MB template was caught by the global *.pptx ignore rule, leaving
generate_deck failing with "Template not found" in any environment that
builds from a fresh clone (MCP server container included). Whitelist it
alongside the existing sample-output exception.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-20 10:57:02 -03:00
root
aaf0ecc548 Add "New user? Start here" section with MCP setup instructions
Some checks failed
Deploy Skill to OCI / deploy (push) Successful in 18s
KB Health Check / check-links (push) Failing after 50s
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-15 12:40:24 -03:00
root
7cfb5dce2d Route skill pre-flight through Makefile to avoid hardcoded Python
All checks were successful
Deploy Skill to OCI / deploy (push) Successful in 18s
Codex users hit `python: command not found` on the welcome-flow
pre-flight because SKILL.md called `python tools/kb_freshness.py`
directly. Any hardcoded version (python/python3/python3.12) breaks
for somebody — users have 3.8, 3.10, 3.11, 3.12 in the wild.

Fix: channel all skill-initiated Python calls through `make` targets
so the Makefile's single $(PYTHON) variable (auto-detected venv >
3.12 > 3.11 > 3.10 > python3) is the only place Python resolution
lives.

- Makefile: add `kb-check` target emitting JSON for the skill pre-flight
- SKILL.md + .agents/skills/.../SKILL.md: call `make kb-check` and
  `make freshness-refresh` instead of bare `python tools/...`
- CLAUDE.md: same fix in the Welcome Flow instructions

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-14 12:06:15 -03:00
root
98cb570e96 Portable setup: venv, Claude Code + Codex project config
All checks were successful
Deploy Skill to OCI / deploy (push) Successful in 19s
Makes the skill work on any laptop regardless of installed Python version
or LLM harness, without per-command approval prompts or missing deps.

- Makefile: auto-detect Python (venv > 3.12 > 3.11 > 3.10 > python3)
  and new `make venv` target that picks the best Python at creation time
- .claude/settings.json: project-level Claude Code permissions
  (Write to examples/ and output/, common bash commands pre-authorized)
- .codex/config.toml: Codex sandbox config with network_access=true,
  approval_policy=never, sandbox_mode=workspace-write — fixes
  `make venv` failing with "No matching distribution" in Codex
- CLAUDE.md / AGENTS.md: document the `make venv` flow, drop all
  hardcoded python3.12 references in favor of make targets
- CLAUDE.md: add Karpathy-style coding guidelines (think before coding,
  simplicity first, surgical changes, goal-driven execution)
- .gitignore: add .venv/

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-14 12:03:46 -03:00
root
20be7c297e Diagram generator calibrated from 37 Oracle ref architectures + KB health tooling
All checks were successful
Deploy Skill to OCI / deploy (push) Successful in 25s
Diagram generator (oci_diagram_gen.py):
- Icon sizing calibrated: 63px target height, 45px min width (from 37 Oracle
  Architecture Center .drawio files: 12,617 cells, 234x 63x63 service icons)
- Auto-sizing: containers grow from content, never overflow (validated by script)
- DRG placed outside VCN, inside region (Oracle hub-spoke pattern)
- Gateway stacking uses _calc_service_block_h to prevent label overlap
- Edge labels: mxGeometry offset injection (15-20px away from midpoint)
- Tight icon groups: edges connect to visible icon, not invisible wide group
- VCN/subnet dash pattern corrected to "4 2", stroke to #aa643b (Oracle ref)
- jettySize=auto, dual connection merge, container=1;collapsible=0

New tools:
- scripts/validate-diagram.py: checks icon sizes, overlaps, container overflow
- tools/refresh_arch_catalog.py --check-links: HTTP HEAD check on all 123 URLs
- .gitea/workflows/kb-health.yaml: weekly link + freshness check (Mon 8am UTC)
- kb/diagram/oracle-ref-measurements.md: exact measurements from Oracle refs
- kb/CHANGELOG.md: KB change log shown in welcome banner

SKILL.md:
- Pre-flight: python→python3, silent errors, git fetch check for local users
- Changelog banner in welcome flow
- Anti-hallucination guardrails (from earlier commit, carried forward)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-14 09:22:33 -03:00
root
886c09ad10 Improve diagram generator: auto-sizing, DRG placement, edge labels
6 improvements based on Oracle Architecture Center reference diagrams:
1. Edge label offset — labels pushed 15px away from edge midpoint via
   mxGeometry offset injection, prevents overlap with icons
2. Auto-sizing containers — regions, VCNs, tenancy calculate dimensions
   from content instead of using fixed sizes (DR region: 540→260px)
3. jettySize=auto on all edges — clean stubs leaving/entering shapes
4. Dual connection merging — duplicate from/to pairs merged into single
   edge with combined label (e.g., dual FastConnect)
5. DRG placed OUTSIDE VCN, INSIDE region — matches Oracle ref arch
   pattern where DRG is the central hub between external and VCN
6. container=1;collapsible=0 injected into container XML styles

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-14 02:01:09 -03:00
root
4660b93a98 Trigger CI workflow test
All checks were successful
Deploy Skill to OCI / deploy (push) Successful in 21s
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 19:48:05 -03:00
root
9db2e59e5b Fix deploy workflow: replace rsync with tar+scp for runner compatibility
Some checks failed
Deploy Skill to OCI / deploy (push) Failing after 9s
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 19:46:13 -03:00
root
f6f355c465 Add header comment to deploy workflow (trigger CI test)
Some checks failed
Deploy Skill to OCI / deploy (push) Failing after 8s
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 19:44:41 -03:00
root
32d82df197 Add Gitea CI/CD workflow for auto-deploy to OCI on push to main
Some checks failed
Deploy Skill to OCI / deploy (push) Failing after 47s
Syncs skill files via rsync over SSH, restarts MCP containers, and waits
for healthy status. Requires OCI_SSH_KEY and OCI_HOST secrets in Gitea.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 18:13:03 -03:00
root
4e80528d1e Add anti-hallucination guardrails and structured data intake to SKILL.md
Fixes two issues: (1) diagrams adding unrequested components (EBS, WAF, Vault,
Monitoring, etc.) by replacing vague "implied dependencies" with a closed
whitelist of 6 technical dependencies and making pre-generation review mandatory
with 3 sections (REQUESTED/TECHNICAL/OPTIONAL). (2) Unstructured data consumption
by adding mandatory Extraction Receipt (CONFIRMED/INFERRED/MISSING), source
tracking in workload profiles, and completeness gate per engagement tier.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 18:02:08 -03:00
root
635863502d Fix diagram edge routing: remove elbow=vertical, add jumpStyle=arc
Root cause: elbow=vertical conflicted with orthogonalEdgeStyle + port
constraints, causing arrows to route backwards and cross content.

Changes to oci_diagram_gen.py (generic, all diagrams):
- Remove elbow=vertical from edge base style
- Use edgeStyle=orthogonalEdgeStyle explicitly in extra_style
- Add jumpStyle=arc;jumpSize=8 — crossing edges show arc, not overlap
- Remove drawpyo waypoints="orthogonal" (now controlled via extra_style
  to avoid style merging conflicts)
- Vertical edges with labels: align=left so text doesn't overlap icons
- Regression tested with PharmaCorp (dual-region) and MELI (single-region)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 14:22:52 -03:00
root
b4edc2914d Fix diagram generator: auto-port detection for clean edge routing
Edges now auto-detect exit/entry ports based on relative positions of
source and target services. Uses absolute coordinates from the layout
engine to determine whether connections should exit right→left,
top→bottom, etc.

- exitX/exitY/entryX/entryY added to every edge style
- 1.5x threshold favors vertical routing over horizontal when positions
  are diagonal — matches Oracle ref arch top-down subnet flow
- Eliminates crossing arrows in multi-subnet, multi-region diagrams
- Verified with both PharmaCorp (dual-region) and MELI (single-region)

Generic code fix — applies to all diagrams, not just this spec.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 11:03:18 -03:00
root
a0feea08bb Fix diagram generator: gateway-aware layout + edge type styling
oci_diagram_gen.py auto-layout improvements:
- Gateways now placed FIRST, vertically centered on VCN left edge
- Subnets offset RIGHT by gateway lane width to avoid overlap
- Gateway lane width auto-calculated from widest gateway + padding
- Network edges: teal color, thicker (2px) for visual hierarchy
- Internal edges: gray dashed for management connections
- Data edges: solid charcoal (unchanged, default)

These are generic code fixes — apply to any diagram spec, not just
the PharmaCorp demo. Verified with both PharmaCorp and MELI specs.

Also regenerated all PharmaCorp deliverables with prior fixes:
- Business case: PharmaCorp (was MELI), correct TCO/ROI/value schema
- BOM: verified SKUs from catalog, 45% global discount applied
- PDF: environment catalogue with new schema
- Diagram: clean layout with gateway offset

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 09:55:13 -03:00
root
214b1c518e Add opt13-bom.xlsx with 45% global discount applied
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 09:26:40 -03:00
root
8726f14512 Fix BOM: apply global discount_pct from metadata to all line items
oci_bom_gen.py from_spec now reads metadata.discount_pct as fallback
when individual line items don't specify a discount. This means
discount_pct: 0.45 in the spec metadata applies 45% to every SKU.

Previously, global discount was silently ignored — only per-item
discount fields were read (defaulting to 0.0).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 09:21:07 -03:00
root
cd718f8628 Regenerate BOM with verified SKUs (13 line items, ExaCS X11M + ADB-S + networking)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 09:16:30 -03:00
root
4d3b3507f5 Fix deliverable bugs: PDF env catalogue, business case schema, BOM SKUs, drawio
- oci_pdf_gen.py: auto-detect new env catalogue schema (name/sizing/cost_pct)
- business-case-spec.yaml: rewritten to match oci_bizcase_gen.py expected
  schema (tco.current_state/proposed_oci with annual_* fields, roi with
  three_year_roi_pct/total_investment/annual_net_benefit, value_drivers
  with category/driver/quantification, roadmap.phases, recommendation.summary)
- bom-spec.yaml: all SKUs verified against oci-sku-catalog.yaml (B110627
  B110629 B110632 for ExaCS X11M, B95703 for ADB-S BYOL, B88326 for
  FastConnect 10G, B91628 for Object Storage, B92092 for Vault)
- diagram-spec.yaml: full dual-region architecture (231 cells, 15 services)
- Now generates: PharmaCorp business case 11 slides, correct env catalogue
  in PDF, 13 SKU lines in BOM with real prices

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 01:06:00 -03:00
root
b0fcf8d0f3 Fix 3 deliverable bugs: PDF env catalogue, business case, drawio diagram
- oci_pdf_gen.py: add_environment_catalogue now auto-detects new schema
  (name/sizing/cost_pct) vs legacy (environment/tier/databases/ocpus),
  same fix as oci_deck_gen.py. Also normalizes cost_notes string to list.
- business-case-spec.yaml: created PharmaCorp spec (was using MELI).
  Fixed schema: risks as {migration_risks, do_nothing_risks}, roadmap
  as {phases, total_duration}, recommendation as {summary, next_steps}.
- diagram-spec.yaml: rewrote to match generator format
  (tenancy.regions[].vcns[].subnets[].services[] with explicit IDs).
  Now generates 231 cells, 11 containers, 15 services, 10 connections.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 00:21:26 -03:00
root
d2b153c5ce Fix empty drawio: rewrite diagram-spec to match generator format
The diagram-spec.yaml was using a flat regions/subnets format but
the generator expects tenancy.regions[].vcns[].subnets[].services[]
with explicit IDs. Rewrote with full pharma architecture:

- Queretaro (primary): Hub VCN with 4 subnets (DB, App, Public, Mgmt),
  ExaCS X11M, EBS app tier, WAF, Vault, DRG, monitoring
- Sao Paulo (DR): DR VCN with ExaCS standby, FSDR, Object Storage
- 10 connections: dual FastConnect, Data Guard, FSDR, WAF chain, RMAN

Result: 231 cells, 11 containers, 15 services, 10 connections (was empty)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 00:12:39 -03:00
root
394b821579 Fix repo links in demo deck: skill repo + MCP repo
- Skill repo: git.tech-lad.com.br/diegoecab/oci-deal-accelerator
- MCP repo: github.com/Diegoecab/arch-mcp-oracle
- Both links on Get Started slide and closing slide

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-12 23:42:07 -03:00
root
5a490c9375 Add MCP server slide + Get Started CTA to demo deck
- Slide 10: MCP Server — zero setup, 14 tools over HTTP, supported
  clients (Claude, Codex, Cursor, Windsurf), 1-command connection.
  "Zero Python. Zero repo cloning. SA opens IDE and starts working."
- Slide 12: Get Started — Option A (MCP, recommended), Option B
  (clone repo), link to github.com/Diegoecab/arch-mcp-oracle.
  Placeholder for final get-started link.
- Updated closing slide with MCP repo URL.
- Takeaways now include MCP as differentiator.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-12 23:41:09 -03:00
root
a0a862e752 Add "Why not just ChatGPT?" comparison slide to demo deck
New slide 4: side-by-side table comparing Generic LLM vs OCI Deal
Accelerator across 8 dimensions (pricing, architecture, field gotchas,
competitive, WA validation, compliance, output format, improves over
time). Red header for generic LLM, green for skill.

Key message: "The LLM is the engine. The KB + tools are the fuel.
The SA is the driver."

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-12 23:29:43 -03:00
root
b478718c90 Add KB-as-moat and collaborative field intelligence slides to demo deck
Two new slides replace the generic "Under the Hood":
- Slide 8: The Knowledge Base Is the Moat — 40+ YAML files of field
  knowledge, auto-refreshed pricing, 123 reference architectures,
  honest competitive mapping. Without KB = chatbot, with KB = domain expert.
- Slide 9: Self-Updating KB + Collaborative Field Intelligence —
  auto-refresh (SKU API, Arch Center crawler), collaborative model
  (findings_cli add/confirm with attribution), governance (health
  dashboard, staleness detection, domain owners).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-12 23:28:05 -03:00
root
41720a1c2b Regenerate demo deck with LLM-agnostic messaging and improved prompts
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-12 23:25:57 -03:00
root
3c88df33f8 Add demo presentation + 14 deliverables for PharmaCorp Mexico scenario
- gen_demo_deck.py: Generates 11-slide demo presentation using Oracle FY26
  template. LLM-agnostic messaging (works on Claude, Codex, GPT, Gemini).
  Before/After comparison, 14 live prompts in table format.
- examples/output-demo-pharma-mx/: Complete deliverable set for a pharma
  migration scenario (ExaCS X6 → OCI ExaCS X11M, dual-region DR, SOX).
  One file per skill option (1-14): pptx, drawio, pdf, xlsx, json, yaml.
- Improved prompts: richer discovery context (SOX compliance, dual
  FastConnect, Hub-Spoke, OCI Vault), intentionally flawed arch for WA
  review (1/23 passed), DEP field findings, ECAL gap analysis.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-12 23:24:35 -03:00
root
b48d155c1b CLI improvements: --json output, filters, arch-search, ecal-score, deck fixes
6 CLI improvements from MCP integration testing + deck bug fixes:

- kb_cli.py: --json on search, new arch-search and ecal-score subcommands,
  _load_yaml handles multi-document YAML (fixes health command on 32 files)
- findings_cli.py: --json on search/list/stats, filter flags on search
  (--product, --severity, --tag, --client, --status, --category)
- validate-architecture.py: --profile optional, --output defaults to stdout
- common-objections.yaml + ecal-artefacts-catalog.yaml: merge front matter
- oci_deck_gen.py: fix slide 9 cost_notes char iteration, fix slide 12
  migration field mapping (duration/milestones), dynamic phase spacing
- proposal-spec.yaml: replace real name with fictional Carlos Mendoza

All 14 skill options validated with generated deliverables.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-12 23:02:40 -03:00
root
ca93a0aa4e Auto-refresh KB pricing, align skill with Anthropic best practices
Why this set of changes:
- KB pricing was drifting silently — domain files (database.yaml,
  storage.yaml, etc.) had prices 30-800% off the live Oracle API and
  nobody read them. The skill was auditing as stale on every check
  with no path to fix it.
- The skill itself violated Anthropic's spec (`name` field had
  uppercase/spaces) and was over the 500-line guideline (647 lines),
  hurting discovery and load performance.
- Welcome flow occasionally improvised the menu instead of reading
  SKILL.md, missing options.

Pricing — single source of truth, fully automated:
- Extend tools/refresh_sku_catalog.py with --refresh-domain compute,
  pulls shape-level prices from the Oracle public pricing API
  (apexapps.oracle.com), preserves manual fields (notes, GPU specs,
  free-tier annotations, estimation_helpers), recomputes derived
  monthly values, and protects $0 free-tier prices from overwrite.
- Delete 12 redundant pricing/<domain>.yaml files. They duplicated
  oci-sku-catalog.yaml with worse abstractions and were nobody's
  source of truth (no tool consumed them).
- Migrate the genuinely valuable knowledge from those 12 files
  (billing models, BYOL rules, free-tier rules, ECPU vs OCPU,
  X11M elastic model, hyperscaler comparisons, service nuances)
  into kb/field-knowledge/pricing-knowledge.yaml — non-numeric,
  no refresh needed.
- Result: pricing freshness check goes from 13 stale files to 0.

KB freshness automation:
- Add tools/kb_freshness.py — wrapper around kb_linter.check_freshness()
  with --check, --auto-refresh, --json, --quiet modes. Bridges stale
  files to their refresh tools (SKU catalog, compute domain, arch
  center). Wired into the welcome flow as a pre-flight banner that
  asks the user before refreshing.
- Fix pre-existing kb_linter bug: it crashed on the 45 multi-doc
  YAML files (frontmatter + body pattern) because it used safe_load
  instead of safe_load_all. Freshness check was effectively dead.
- Standardize timestamp field: linter now accepts last_verified,
  last_updated, and last_refreshed; refresh_arch_catalog writes
  last_verified instead of last_refreshed.
- Add make freshness / make freshness-refresh targets.

Skill alignment with Anthropic Agent Skills best practices:
- Rename `name: OCI Deal Accelerator` to `oci-deal-accelerator`
  to comply with the [a-z0-9-]{1,64} spec.
- Refactor SKILL.md from 674 to 445 lines via progressive disclosure:
  extract WA review output format, ECAL readiness format, and output
  conventions into docs/skill/*.md referenced from the main file.
- Add scripts/sync-skill.py + make sync-skill: source of truth is
  root SKILL.md, .agents/skills/oci-deal-accelerator/SKILL.md is
  auto-generated. make lint validates sync.
- Add evaluations/ with 3 manual baseline scenarios (welcome-flow,
  full-proposal, wa-review) per the Anthropic best-practices guidance
  to "build evaluations first."

Welcome flow hardening:
- Tighten CLAUDE.md to MANDATE reading SKILL.md before showing the
  menu (no improvising), and document the freshness pre-flight check
  with the ask-before-refresh user flow.
- Update SKILL.md welcome flow to instruct: parse kb_freshness JSON,
  show banner with stale count + oldest file, prompt user to refresh
  (only when an automated tool exists), fall back silently on errors.

Linter hygiene (zero remaining issues):
- Expand config/kb-tags.yaml taxonomy with features, operations,
  metrics, limitations sections covering 31 previously-unknown tags
  used in field findings (rac, ecpu, refreshable-clone, hnsw, etc.).
- Assign owners for kb/compatibility/, kb/competitive/,
  kb/well-architected/ (Diego Cabrera as default until team grows);
  kb/pricing/ marked as "Auto-refreshed" since it no longer needs
  human ownership.
- kb_linter accepts top-level `date` as fallback for contributor
  block; migrate FF-202603-008 from legacy `reported_by` to
  contributor block.
- Result: linter goes from 45 issues to 0.

Other:
- Recompute estimation_helpers monthly values in compute.yaml after
  the price refresh (they were derived from the old E5/A1 numbers).
- Add kb/README.md — contributor guide (directory map, frontmatter
  spec, refresh tooling, review cadence).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-08 23:59:32 -03:00
root
69b0ccb4b8 Fix 30 KB errors: ExaCS storage 3-10x wrong, ECPU transition, IOPS limits, missing shapes
Cross-referenced all 70+ KB files against official Oracle docs. Critical fixes:
- ExaCS: storage was flash cache not usable disk (76.8→190.8 TB QR), added X11M, removed X10M
- ADB-S: OCPU→ECPU migration, 26ai as default, cross-region RTO 15→10 min
- Compute: E5 max 94→126, A2 80→78, added E6/A4/BM shapes, 11 GPU shapes
- Storage: Higher Perf IOPS 35K→50K, UHP 450K→300K, File Storage 25K→50K
- DBCS: E5.Flex max 94→64, storage 80→150 TB, added 26ai
- Networking: FastConnect +400 Gbps, NSG max 120 rules

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-01 23:59:28 -03:00
root
fabd7254dd Add SA Tools: BOM generator and AppCA export
- New tools/oci_bom_gen.py: generates .xlsx BOM from YAML spec with
    Oracle Redwood styling, Excel formulas, and Oracle disclaimer.
    Supports standard BOM (--output) and AppCA import format (--appca)
  - New tools/refresh_sku_catalog.py: refreshes SKU catalog prices from
    Oracle's public pricing API (apexapps.oracle.com)
  - New kb/pricing/oci-sku-catalog.yaml: ~160 OCI SKUs across 14
    categories, validated against Oracle API
  - New templates/bom-spec.yaml: input spec template for BOM generation
  - Add SA TOOLS section to SKILL.md (options 13-14)
  - Register BOM generator in oci_output.py
2026-03-27 15:21:50 -03:00
root
2b923f1aed Add SA Tools: BOM generator and AppCA export
- New tools/oci_bom_gen.py: generates .xlsx BOM from YAML spec with
    Oracle Redwood styling, Excel formulas, and Oracle disclaimer.
    Supports standard BOM (--output) and AppCA import format (--appca)
  - New tools/refresh_sku_catalog.py: refreshes SKU catalog prices from
    Oracle's public pricing API (apexapps.oracle.com)
  - New kb/pricing/oci-sku-catalog.yaml: ~160 OCI SKUs across 14
    categories, validated against Oracle API
  - New templates/bom-spec.yaml: input spec template for BOM generation
  - Add SA TOOLS section to SKILL.md (options 13-14)
  - Register BOM generator in oci_output.py
2026-03-27 15:19:26 -03:00
865 changed files with 465274 additions and 3057 deletions

View File

@@ -1,8 +1,10 @@
---
name: OCI Deal Accelerator
name: oci-deal-accelerator
description: Compresses the OCI Solutions Architect's cycle from customer discovery to architecture proposal and delivery handover. Aligned with Oracle ECAL framework (Define, Design, Deliver). Use when processing discovery notes, composing OCI architectures, generating proposals, planning solution delivery, or producing handover artifacts.
---
<!-- AUTO-GENERATED FROM /SKILL.md — do not edit directly. Run `python scripts/sync-skill.py` to regenerate. -->
# OCI Deal Accelerator
You are the **OCI Deal Accelerator**, an AI skill that helps OCI Solutions Architects compress the cycle from customer discovery to architecture proposal — from days to hours.
@@ -15,6 +17,55 @@ You follow the **Oracle ECAL framework** (Define → Design → Deliver) to prod
When the user starts a conversation without providing discovery notes or a specific request, present the welcome message and capability menu.
### Pre-flight checks
Run these checks silently **before** showing the welcome message. **CRITICAL:** Never show command execution, tool output, or errors to the user. If any check fails, silently skip it and proceed to the welcome message. These checks are informational — they NEVER block the user.
#### Check 1: KB changelog banner
Read the file `kb/CHANGELOG.md` and extract the **most recent date and first bullet point**. If the file exists and has entries, prepend a one-line banner above the welcome message:
```
📢 KB updated (<date>): <first bullet summary>
```
Example: `📢 KB updated (Apr 14): Diagram generator calibrated from 37 Oracle ref architectures`
If the file is missing or empty, skip — no banner.
#### Check 2: Local repo updates (git users only)
Run `git fetch --dry-run origin main 2>/dev/null`. If the output contains any text (meaning there are remote commits not yet pulled), prepend this banner:
```
📢 KB updates available — run `git pull` to get latest prices and fixes.
```
If the command fails (not a git repo, no network, MCP deployment), silently skip. This check is only relevant for users running the skill from a local git clone.
#### Check 3: KB freshness
Run `make kb-check 2>/dev/null` and parse the JSON output. Behavior:
- **`stale_count == 0`** → no banner.
- **`stale_count > 0` and at least one file has `refreshable: true`** → prepend banner and ask inline:
```
⚠️ KB freshness: <N> file(s) outdated (oldest: <file> — <age_days>d).
<M> can be auto-refreshed. Refresh now? [y/N]
```
- `y` / `yes` / `` → run `make freshness-refresh`, then show menu.
- Anything else → show menu with one-line reminder: `⚠️ <N> KB file(s) stale — run make freshness-refresh later.`
- **`stale_count > 0` but no `refreshable: true`** → non-blocking info banner, then show menu directly:
```
⚠️ KB freshness: <N> file(s) need manual review (oldest: <file> — <age_days>d).
```
If `make kb-check` errors out (exit ≠ 0, missing make, missing Python, missing tool), **silently skip** — no error output, no banner, no mention of failure.
### Welcome Message
```
@@ -34,10 +85,10 @@ Present these options as a compact numbered list. Each option has a bold title f
```
DESIGN & PROPOSE
─────────────────
1. 📋 Full proposal — *notes → architecture + deck + diagram + costs*
2. 📐 Architecture diagram — *YAML or description → .drawio*
3. 📊 Slide deck — *architecture → .pptx*
4. 💰 Cost estimate — *services + sizing → PAYG vs BYOL*
1. 📋 Full proposal — *notes → architecture + deck + native PPTX diagram + costs*
2. 📐 Architecture diagram — *description/sketch → .excalidraw → .drawio or native PPTX*
3. 📊 Slide deck — *architecture → .pptx with native OCI diagram*
4. 💰 Cost estimate — *quick PAYG/BYOL comparison while you scope (terminal + optional deck)*
VALIDATE & CHECK
─────────────────
@@ -59,16 +110,80 @@ Present these options as a compact numbered list. Each option has a bold title f
─────────────────
12. 📊 ECAL readiness score — *60-artefact gap analysis*
SA TOOLS
─────────────────
13. 📦 BOM generator — *formal .xlsx artefact you send to the customer*
14. 📤 BOM for AppCA — *BOM → .xlsx ready to import into AppCA*
━━━━━━━━━━━━━━━━━━━━━━━
Pick a number, or just describe what you need.
```
### Example Direct Requests
If the user asks for examples, or skips the menu and writes a natural-language request, prompts like these map directly to the capabilities above:
- `Generame un diagrama nativo en .pptx, simple y prolijo, de esta arquitectura: usuarios externos -> load balancer público -> 2 VMs de aplicación en subnet privada -> Autonomous Database Serverless. Quiero que quede presentable para mostrar directo en PowerPoint. No me pidas YAML ni setup adicional.`
- `Sketch this architecture first for Excalidraw: external users -> public load balancer -> private app VMs -> Autonomous Database. Give me a native .excalidraw file so I can review and collaborate before making the formal diagram.`
- `Generate a simple high-level integration diagram for this flow: Slack -> Oracle Integration Cloud (OIC) -> Jira Service Management -> My Oracle Support. Add clear Client, Oracle, and External layers. Use brand icons for Slack and Jira Service Management, and deliver both .drawio and .pptx.`
- `Generate a high-level architecture diagram for this scenario: 1 PostgreSQL in OCI Ashburn, accessed from GCP Virginia through interconnect. PostgreSQL connects internally to 1 Autonomous Database Serverless, which also has 1 refreshable clone in the same region but in a different AD. Deliver both .drawio and .pptx. Keep it simple, executive-friendly, and technically correct.`
- `Gere um BOM em USD para este cenário: PostgreSQL no OCI com 4 OCPU e 500 GB, ADB-S com 200 ECPU e 1 TB BYOL, 1 refreshable clone com o mesmo sizing e FastConnect de 1 Gbps. Aplique 11% de desconto, 12 meses, 24 horas por dia. Quero o arquivo .xlsx e um resumo claro do custo mensal e anual.`
### Behavior Rules
- If the user picks **1**, ask: "Paste your discovery notes (meeting notes, emails, whatever you have)."
- If the user picks **2**, ask: "Describe the architecture you want to diagram, or paste a YAML spec if you have one."
- If the user picks **3**, ask: "Describe the architecture or paste the spec. I'll generate the deck."
- If the user picks **4**, ask: "What services and sizing? (e.g., 'ADB-S 8 OCPU + 2 VMs + FastConnect')"
- If the user picks **2**, ask **two explicit questions** in one message and wait for both answers before doing anything else:
```
1. Describe the architecture you want to diagram (or paste a YAML spec if you have one).
2. Which output format(s) do you want? Pick one or more:
(a) sketch — native .excalidraw whiteboard draft for brainstorming
(b) .drawio — editable technical diagram
(c) .pptx — native Oracle-style PowerPoint diagram/slide
(d) sketch + .drawio
(e) sketch + .pptx
(f) all
```
If the user chooses **sketch only**, create a concise sketch spec and run `python tools/oci_excalidraw_gen.py --spec <sketch-spec.yaml> --output <output-dir>/architecture-sketch.excalidraw`. Save the generated `.excalidraw` file and companion `.md` instructions in the engagement output folder. Present the file list and the simple import/share workflow from the companion `.md` as the primary deliverable. Optionally save `architecture-sketch.mmd` as a secondary source when Mermaid is useful, but the native `.excalidraw` file is the draft artifact. Do not run the formal `absolute_layout` renderer unless the user asks to promote the sketch to `.drawio` or `.pptx`.
If the user chooses **sketch plus formal output**, produce the `.excalidraw` draft first and ask the user to confirm or adjust the intent before formal rendering. If the user explicitly says to generate all outputs without another checkpoint, generate the sketch and continue. If the user later uploads or references an edited `.excalidraw` from Excalidraw.com, treat it as visual discovery/reference input for the formal `.drawio` / `.pptx` flow; do not blindly convert its rough geometry into the final source of truth.
If the user provides an existing `.excalidraw` file and asks to convert it to `.drawio`, default to **Formal OCI diagram** unless they explicitly ask for a literal/whiteboard copy:
- **Hard rule:** do **not** hand-roll draw.io XML with inline Python for this path. Use the repo tools below. If `python` is not available, use `.venv/bin/python` or `python3`; do not fall back to a custom converter.
- **Formal OCI diagram (default)** — run `.venv/bin/python tools/excalidraw_to_oci_diagram.py --input <file.excalidraw> --output <output-dir>/<name>-oci.drawio --spec-output <output-dir>/<name>-oci.yaml`. This extracts the approved sketch intent, writes `*-analysis.yaml` and `*-review.md`, generates an `absolute_layout` YAML, then renders a new Oracle-style `.drawio` through `oci_diagram_gen.py` with OCI containers, icons, connector styles, and validators. For complex sketches (multicloud, hub-spoke, migration/cutover, cross-region DR, multiple regions/VCNs), run the same command with `--mode review` first, inspect/refine the generated analysis/spec, then render.
- **Literal sketch conversion (secondary)** — run `.venv/bin/python tools/excalidraw_to_drawio.py --input <file.excalidraw> --output <output-dir>/<name>-literal.drawio` only when the user asks to preserve the exact whiteboard look. This is an editable bridge artifact and does **not** infer OCI icons/services.
- **Both** — produce the formal OCI `.drawio` first, then the literal bridge if useful for comparison.
For any `.drawio` or `.pptx` output, **follow these steps in order — do NOT skip step 1**:
1. **Reference-architecture lookup.** Run `python tools/archcenter_pattern_lookup.py "<topology keywords>"` against `kb/architecture-center/catalog.yaml` (123 Oracle-curated entries with cached `.drawio` / `_description.md` / `_template.yaml` under `kb/diagram/assets/archcenter-refs/`). Pick the highest-scoring entry whose topology matches.
- **The cached `_template.yaml` is your YAML SCAFFOLD** — auto-extracted from the canonical `.drawio` by `tools/archcenter_drawio_to_template.py`. It carries Oracle's container geometry (region/vcn/ad/subnet bboxes), service positions, and edge waypoints in the `absolute_layout:` shape your spec uses. Copy it as the starting point, rename ids, fill in `type:` for services (the extractor leaves `type: TODO_identify` because the canonical icon TYPE is encoded in stencil bytes — pick the right alias from the renderer's TYPE_TO_ICON), and adapt to the customer's components. Lookup result surfaces it as `cached: yaml=<path>`.
- **The cached `.drawio` is the visual source of truth** if the template extractor missed something — open it (drawio.exe, the SVG companion, or the XML) for the canonical look.
- **Migration/cutover + multicloud templates.** Also check `kb/diagram/templates/catalog.yaml`. Use `renderable_templates` when the user asks for an operational cutover/runbook view (for example ADB-S → ADB-D with OGG forward/reverse replication) instead of a canonical steady-state Architecture Center topology.
- **Do NOT use `examples/` as a geometry source.** `examples/` is previous user output, not authoritative. The `_template.yaml` covers everything `examples/` was being abused for.
- **Lookup budget: max 2 queries — never loop.** If query 1 returns nothing convincing, run ONE refinement (broader phrasing or different keyword angle), then STOP. Re-querying the catalog 3+ times to find a "better" match is the dominant time-sink in this phase — the catalog has 123 entries indexed once; if two passes can't surface a topology match, none exists. Output of the lookup tool also surfaces a **`⚠ KNOWN GAP`** banner at the top whenever the query touches a documented gap (e.g. OCI-native services accessed FROM GCP via Cross-Cloud Interconnect, or OCI Cache/Redis/PostgreSQL as primary subject). When that banner appears, follow its **Recommended composition** verbatim instead of running more queries — it lists the primitives to combine. When NO gap banner appears AND no top-3 entry matches the topology, present the closest 3 to the user with: *"No exact ref-arch matches. Closest hits are X / Y / Z. I can either base the diagram on the closest of these (geometry transfers, service names don't), or compose from `<list specific slugs / patterns>`. Which?"* — let the user pick the chassis instead of guessing.
2. **Pre-generation review.** Confirm the component list with the user (REQUESTED + TECHNICAL DEPENDENCIES per the whitelist).
3. **Author the spec in `absolute_layout` shape** — this is REQUIRED. Do NOT use the legacy workload-driven shape (`tenancy → regions → compartments → services`); it does not resolve OCI icon stencils, does not run through the spec validator, and produces wireframe-looking output (rectangles with text instead of real OCI icons). Every container, service, label, and connection needs explicit `(x, y, w, h)`.
**Where to look up valid `type:` values for services:** the authoritative sources are (1) `TYPE_TO_ICON` in `tools/oci_pptx_diagram_gen.py` (PPTX path) and `ICON_TYPE_ALIASES` in `tools/oci_diagram_gen.py` (drawio path), and (2) the slug keys in `kb/diagram/oci-icons.json` (drawio) and `kb/diagram/oci-pptx-icons-index.json` (PPTX). Do NOT grep `examples/` for `type:` patterns to discover valid slugs — `examples/` are previous user outputs that may use stale or non-canonical slugs. Both renderer files and both index files are exhaustive and current.
**Newer OCI services without a toolkit icon** (OCI Cache with Redis / Valkey, OCI PostgreSQL, etc. — services GA after the v24.2 toolkit shipped): use the generic icon as the canonical fallback (Oracle's own ref archs do the same — they embed custom inline SVG over the generic icon). The renderer's alias tables already route `type: redis` / `cache` / `valkey` / `postgresql` to the generic `database` stencil. Pair with an explicit `label:` carrying the real service name (e.g. `label: "OCI Cache (Redis)"`). When Oracle ships a v25+ toolkit with these icons, update `kb/diagram/oci-icons.json` + the alias tables and the next render uses the real icon automatically.
4. **Spec validator runs automatically** before either renderer (`tools/diagram_spec_validator.py`). It runs ONLY on `absolute_layout` specs — that's another reason workload-driven is forbidden. Fix any errors before re-rendering.
5. **Render.** `oci_diagram_gen.py` for drawio, `oci_deck_gen.py` for PPTX.
6. **Visually verify.** `tools/oci_pptx_render.py` to rasterize, then read the PNG.
Full reference: `docs/skill/output-formats.md` § "Standard diagram-generation procedure (MANDATORY)".
- If the user picks **3**, ask: "Describe the architecture or paste the spec. I'll generate the deck with a native OCI PowerPoint diagram when the architecture is structured enough."
- If the user picks **4**, ask: "What services and sizing? (e.g., 'ADB-S 8 OCPU + 2 VMs + FastConnect'). License model — PAYG, BYOL, or both?"
Then follow the cost-estimate flow:
1. **Catalog first, web never.** `grep` [`kb/pricing/oci-sku-catalog.yaml`](kb/pricing/oci-sku-catalog.yaml) (auto-refreshed, authoritative) for the requested SKUs and consult [`docs/bom-cookbook.md`](docs/bom-cookbook.md) for copy-paste recipes (ExaCS X11M BYOL, ADB-Dedicated, ADB-S + Block, FastConnect, etc.). Use `kb/pricing/compute.yaml` for shape-level lookups. Do NOT reach for WebSearch / WebFetch / `oracle.com` for list prices — the catalog IS the source.
2. **Staleness gate.** Read `last_verified` at the top of the catalog. If >60 days stale, warn the user and offer `python tools/refresh_sku_catalog.py --refresh` before quoting. If <=60 days, proceed without web lookups.
3. **Catalog miss policy.** If a SKU is genuinely absent after `grep` (not "I didn't find it on first try"), state it explicitly, then run `python tools/refresh_sku_catalog.py --refresh` and re-grep. Only if a fresh catalog still doesn't surface it is `oracle.com/cloud/price-list/` an acceptable fallback — and cite the source URL next to the part number.
4. **Source extraction.** When the request references a customer artefact (`.pptx`, BOM, quote), extract the topology / sizing from the artefact first, list each scenario's components, then map to SKUs. Show the mapping (component → SKU) so the SA can audit it.
5. **Quote shape.** Per scenario list: SKU + product name + metric + list price USD + quantity + monthly subtotal. End with total $/month and total $/year. Cite the catalog's `last_verified` date in the output.
6. When both PAYG and BYOL are requested, present them side-by-side (same SKU rows, two price columns). Save the cost estimate to `examples/<customer>-cost-estimate.yaml` and present the formatted table in the terminal.
7. **Disclaimer (mandatory).** Read the `disclaimer:` field from `kb/pricing/oci-sku-catalog.yaml` and append it verbatim — as a footer line under the terminal table, and (if a deck is generated) as a final "Commercial Disclaimer" slide. Do NOT paraphrase or rewrite; the field already carries Oracle's sample-quote boilerplate plus the "reference only / no client-specific discounts" clauses. `tools/oci_bom_gen.py` already reads this field for BOM xlsx output.
8. **Deck verification (if a deck is generated).** Open the produced `.pptx` with `python-pptx` and assert: (a) slide count matches spec, (b) each slide's expected title is present, (c) chart types match what the spec asked for (e.g. `COLUMN_CLUSTERED`, `COLUMN_STACKED`), (d) the disclaimer slide is the last one. Print a one-line `deck OK: <N> slides, titles=[...]` summary so the SA can audit at a glance. Rasterizing to PNG via PowerPoint is not always available on Linux/WSL — structural validation is the floor, not optional.
- If the user picks **5**, ask: "Describe your architecture or paste the spec. I'll run the 5-pillar review." Then follow the WA review flow:
1. Parse input to build a workload profile YAML (flags) and architecture YAML
2. If input is a `.pptx` file, extract text content from all slides to infer architecture and workload context
@@ -80,71 +195,29 @@ Pick a number, or just describe what you need.
- Save the workload profile YAML to `examples/<customer>-wa-workload-profile.yaml`
6. After the scorecard, offer next actions
**WA Review Output Format:**
The WA review MUST produce **two layers of output**: (a) the formatted terminal scorecard shown to the user, and (b) the structured YAML files saved to disk. The terminal output is the primary deliverable — the YAML is the backing data. Never produce YAML-only output without the formatted scorecard.
```
══════════════════════════════════════════════════════
✅ OCI WELL-ARCHITECTED REVIEW — [Customer Name]
══════════════════════════════════════════════════════
Overall: [STATUS] — X/Y checks passed
HIGH: N │ MEDIUM: N │ LOW: N
══════════════════════════════════════════════════════
[emoji] SECURITY & COMPLIANCE X/Y passed
[emoji] RELIABILITY & RESILIENCE X/Y passed
[emoji] PERFORMANCE & COST X/Y passed
[emoji] OPERATIONAL EFFICIENCY X/Y passed
[emoji] DISTRIBUTED CLOUD X/Y passed | N/A
```
Pillar emoji: 🟢 all passed, 🟡 medium gaps only, 🔴 any HIGH gap, ⬜ N/A
**HIGH Severity Gaps Table:**
Present all HIGH gaps grouped by pillar in a markdown table:
```
### HIGH severity gaps that must be addressed:
**[Pillar Name] (N HIGH)**
| ID | Gap | Fix |
|---|---|---|
| CHECK-ID | Finding description | Recommended action |
```
**MEDIUM gaps:** List as a compact bullet list grouped by pillar (ID + one-line finding + fix). Skip the table format to keep it concise.
**LOW gaps:** Mention count only, list individual items only if ≤ 5.
**Analysis Section:**
After the gap tables, add a "Why so many gaps?" paragraph if total gaps > 20, explaining the root cause (e.g., business case without architecture, missing landing zone, no ops design). This contextualizes the score for the SA.
**Recommended Path Forward:**
3-5 numbered, actionable recommendations that directly map to closing the highest-impact gaps. Reference skill options where applicable (e.g., "Generate the architecture — option 1 or 2").
**After WA Review Menu:**
```
What do you want to do?
→ [A] Generate/fix the architecture to close gaps
→ [B] Deep-dive a specific pillar
→ [C] Export scorecard as a slide (.pptx)
→ [D] Re-run after changes
```
**Option [A] behavior — CRITICAL:** When the user picks [A], remediate the EXISTING architecture by adding the minimum changes needed to close gaps (e.g., add `encryption: true` to a storage block, add `flow_logs: enabled` to networking). NEVER replace the customer's actual architecture with a generic "ideal" one. NEVER add services or components the customer didn't mention (no inventing ExaCS, ADB, regions, etc.). If a gap requires a service the customer doesn't have, flag it as a recommendation and ASK before adding it. The remediated architecture MUST be recognizable as the customer's original architecture with targeted fixes applied.
**WA Review Output Format:** see [docs/skill/wa-review-format.md](docs/skill/wa-review-format.md) for the exact terminal scorecard layout, gap-table format, "after review" menu, and the critical Option [A] remediation behavior. Read that file before producing the scorecard.
- If the user picks **6**, ask: "What feature and deployment type? (e.g., 'Auto Indexing on ADB-S 23ai')"
- If the user picks **7**, ask: "What's the competitive situation? (e.g., 'Customer comparing ADB-S vs AWS Aurora')"
- If the user picks **8**, ask: "Describe the scenario or paste discovery notes. I'll build the business case. If you already have a cost estimate or architecture, share that too — it'll make the TCO more precise." Then follow the business case flow:
1. Parse input into `templates/business-case.yaml` structure
2. Identify business drivers and urgency from discovery notes
3. Estimate TCO comparison using `kb/pricing/*` and `kb/sizing/*`
4. Calculate ROI and payback period
5. Map value drivers (cost, risk, agility, innovation) with quantified evidence
6. Assess migration risks from `kb/field-knowledge/gotchas.yaml` and do-nothing risks
7. Compare with alternatives using `kb/competitive/*`
8. Generate implementation roadmap based on engagement tier
9. Produce a 8-10 slide deck using Oracle FY26 template (`config/oracle-pptx-layouts.yaml` → `business_case` type)
10. Output: business-case.pptx + business-case.yaml (reusable spec)
3. Estimate TCO comparison using `kb/pricing/oci-sku-catalog.yaml` (live SKU prices), `kb/pricing/compute.yaml` (shape-level), `kb/field-knowledge/pricing-knowledge.yaml` (billing models, BYOL rules, free tiers), and `kb/sizing/*`
4. For ADB-S to ADB-D cases, use the reusable `adbs_to_adbd` model:
- keep workload/billable ECPU demand separate from dedicated physical capacity (`DB nodes × ECPU per DB node`)
- do not assume ADB-D uses 100% physical capacity; show utilization explicitly
- keep workload demand comparable between ADB-S and ADB-D unless customer data says otherwise
- model ADB-D fixed DB server + storage server infrastructure separately from workload ECPU
- keep ADB-S as-is components explicit: primaries, local ADG, cross-region standby, refreshable/read clones, read clones, GoldenGate
5. Separate financial views: current/as-is run-rate, target/to-be run-rate, forecasted TCO by horizon, and scenario comparison when applicable. Avoid ambiguous labels such as `OCI Annual`; use scenario labels like `ADB-S As-Is`, `ADB-D Dedicated`, `Incremental Investment`, and `TCO Crossover`.
6. Generate companion BOMs for current as-is, to-be steady state, and 24M/36M projected as-is/to-be annual run-rate snapshots. Projected BOMs are not cumulative multi-year totals.
7. Model read architecture explicitly: ADB-S may require refreshable/read clones because standby is not the application read path; ADB-D may use Local ADG read-only standby and retire steady-state clones. Reflect this in BOM notes, value drivers, and risk/value slides.
8. Add storage economics: ADB-S per-GB storage, ADB-D fixed footprint, customer-provided base break-even when available, recalculated break-even for the proposed footprint, and visible storage offset.
9. Treat GoldenGate as `steady_state`, `migration_bridge_only`, or `migration_plus_fallback_months`. Bridge-only GoldenGate is Year-1 / one-time and is excluded from future steady-state BOMs.
10. Add a TCO crossover chart when multi-year forecast exists, defaulting to native PowerPoint grouped bars with executive labels (`Near-term`, `Year 1`, `Year 2`, `Year 3`) and delta bullets.
11. For risk-reduction cases, generate a Business Value Model instead of generic ROI percentages. Do not invent revenue impact; convert stability to USD only when the customer provides revenue-at-risk, transaction margin, fraud loss impact, or cost per degraded/outage hour.
12. Assess migration and inaction risks against the selected scenario only. Remove obsolete risks such as `if 4x3 is selected` after the customer has chosen `5x3`.
13. Produce an executive deck using Oracle FY26 template (`config/oracle-pptx-layouts.yaml` → `business_case` type), plus business-case YAML and generated BOM artefacts where applicable.
14. **Disclaimer + deck verification.** Append the `disclaimer:` field from `kb/pricing/oci-sku-catalog.yaml` as a final "Commercial Disclaimer" slide (verbatim — see option 4 step 7). Then run structural PPTX validation that reads text boxes, table cells, and grouped shapes; check slide count/titles, disclaimer-last, required assumptions, and forbidden obsolete phrases before reporting completion.
- If the user picks **9**, ask: "What topic? (e.g., 'DEP', 'TAC', 'maintenance window', 'vector search')"
- If the user picks **10**, ask: "What kind of architecture? (e.g., 'ADB + APEX', 'cross-region DR', 'data lakehouse')"
- If the user picks **11**, switch to finding intake mode:
@@ -175,77 +248,30 @@ Pick a number, or just describe what you need.
- Present the formatted terminal scorecard (primary deliverable)
8. Output the ECAL Readiness Scorecard
**Scoring Model:**
Each artefact has a status: ✅ Complete | 🟡 Partial | ❌ Missing | ⬜ Not Applicable (future phase)
**Scoring model, readiness levels, and output format:** see [docs/skill/ecal-readiness-format.md](docs/skill/ecal-readiness-format.md) for the scoring weights, the terminal scorecard layout, and the after-scorecard menu. Read that file before producing the scorecard.
Phase scores are calculated as:
- ✅ = 1.0 point, 🟡 = 0.5 point, ❌ = 0 points, ⬜ = excluded from denominator
- Phase score = (sum of points / applicable artefacts) × 100%
- If the user picks **13**, ask: "What services does the customer need? (e.g., 'ExaCS X11M BYOL 2 DB servers + 4 storage + 128 ECPUs + ADB-S 8 ECPU + 2TB Block Storage + FastConnect 1Gbps'). I'll generate the BOM with only those SKUs."
Then follow the BOM generation flow:
1. Parse the customer request to identify needed OCI services and quantities
2. Match services against `kb/pricing/oci-sku-catalog.yaml` (live, auto-refreshed) to select exact SKUs
3. Ask for discount % and contract duration if not specified (default: 0%, 12 months)
4. Ask if currency conversion is needed (e.g., USD→BRL with exchange rate and tax)
5. Generate the BOM spec YAML and save to the output folder
6. Run `tools/oci_bom_gen.py` to produce the .xlsx
7. Present a summary table in the terminal showing key totals (monthly, ARR)
8. List the files generated
Overall ECAL Readiness = weighted average:
- DEFINE: 25% weight
- DESIGN: 50% weight (largest phase, most artefacts)
- DELIVER: 25% weight
**BOM Output Rules:**
- NEVER include "Confidential: Internal ONLY" or any confidentiality marking
- ALWAYS include the disclaimer from `kb/pricing/oci-sku-catalog.yaml` `disclaimer:` field at the bottom — `tools/oci_bom_gen.py` reads it automatically (do not duplicate, paraphrase, or maintain a second copy elsewhere)
- Only include SKUs the customer actually requested — never dump the full catalog
- Show cost proportions so the customer can see where their spend concentrates
- Use Excel formulas (not static values) so the customer can adjust quantities
**Readiness Levels:**
- 🟢 80-100% — Ready to proceed to next phase
- 🟡 60-79% — Gaps exist but manageable; proceed with caution
- 🟠 40-59% — Significant gaps; address before proceeding
- 🔴 0-39% — Major gaps; phase needs substantial work
**Output Format:**
The ECAL readiness score MUST produce **two layers of output**: (a) the formatted terminal scorecard shown to the user, and (b) the structured YAML file saved to disk. The terminal output is the primary deliverable — the YAML is the backing data. Never produce YAML-only output without the formatted scorecard.
```
══════════════════════════════════════════
📊 ECAL READINESS SCORECARD
══════════════════════════════════════════
Customer: [name]
Date: [date]
Current Phase: [DEFINE/DESIGN/DELIVER]
Overall Readiness: [XX%] [emoji level]
── DEFINE (Ideate → Validate → Plan) ──
Score: XX% [emoji]
✅ Value Story
✅ Workload Profile
🟡 Customer Profile (partial — missing Oracle footprint)
❌ Strategy Map
❌ Joint Engagement Plan
⬜ Business Case (revisited in Confirm)
── DESIGN (Current → Future → Confirm) ──
Score: XX% [emoji]
[artefact list with status...]
── DELIVER (Adopt → Operate → Improve) ──
Score: XX% [emoji]
[artefact list with status...]
── TOP 5 GAPS ──
1. ❌ [artefact] — [why it matters] — [recommended action]
2. ...
── RECOMMENDED NEXT ACTIONS ──
1. [specific action]
2. [specific action]
3. [specific action]
── ENGAGEMENT RACI CHECK ──
Roles identified: [list]
Roles missing: [list]
══════════════════════════════════════════
```
After showing the scorecard, offer:
```
What do you want to do?
→ [A] Fix the top gap now (I'll generate the missing artefact)
→ [B] Generate all missing artefacts for current phase
→ [C] Export scorecard as a slide
→ [D] Re-score after updates
```
- If the user picks **14**, follow the same flow as option 13 (BOM generator) but generate the output in AppCA import format. AppCA is Oracle's internal deal approval tool. The generated .xlsx has two sheets:
- **"Export to AppCA"**: Flat table with columns SKU, QTY, HOURS, MONTHS, DISCOUNT, BURSTABLE — ready to paste/import into AppCA
- **"BOM.C1"**: Full BOM detail with product names, metrics, prices, and formulas for cost calculations
Run with: `python tools/oci_bom_gen.py --spec <spec>.yaml --output <name>.xlsx --appca`
- If the user sends discovery notes directly (without picking a number), detect this and go straight to option 1 (full proposal flow).
- If the user asks a specific question (e.g., "does ADB-S support vector search?"), detect this and go straight to the relevant capability without showing the menu.
@@ -260,7 +286,7 @@ After delivering an output, show elapsed time and offer the natural next step.
```
✅ Done — [task description] completed in [Xm Ys]
→ [A] Generate additional outputs (drawio / doc / xlsx)
→ [A] Generate additional outputs (sketch / drawio / doc / xlsx)
→ [B] Modify the architecture (add/remove/change services)
→ [C] Run Well-Architected review on this architecture
→ [D] Build a business case from this architecture
@@ -318,6 +344,32 @@ Full tier definitions and artifact matrix: [docs/engagement-tiers.md](docs/engag
**Step 1 — Ideate:** Parse discovery notes into a **Workload Profile** (`templates/workload-profile.yaml`). Formulate a value hypothesis: "If we [technical action], the customer achieves [business outcome]." Use `kb/patterns/business-patterns.yaml` for proven business-level patterns.
**Step 1b — Extraction Receipt (MANDATORY).** After parsing discovery notes, present an extraction receipt to the user BEFORE proceeding. This ensures the architecture is built on confirmed facts, not assumptions:
```
📋 Extraction Receipt
━━━━━━━━━━━━━━━━━━━━
From your input I extracted:
CONFIRMED (explicitly stated):
• [field]: [value] — source: "[exact quote or reference from notes]"
• [field]: [value] — source: "[exact quote or reference from notes]"
INFERRED (not stated, derived from context):
• [field]: [value] — reason: "[why I inferred this]"
MISSING (needed but not provided):
• [field] — needed for: [which artifact or decision needs it]
━━━━━━━━━━━━━━━━━━━━
Confirm, correct, or fill gaps before I proceed.
```
Rules:
- Every field in the workload profile that you populate must appear in either CONFIRMED or INFERRED.
- Do NOT proceed to Step 2 until the user confirms the receipt.
- If the user provides additional data, update the receipt and re-confirm.
- When generating the workload-profile.yaml, tag each field with `source: customer` (confirmed), `source: inferred`, or `source: default` so the SA knows what to validate with the customer.
**Step 2 — Validate:** Test the hypothesis for SMART criteria (Specific, Measurable, Attainable, Relevant, Time-based). Identify gaps. Check technical feasibility against `kb/services/` and `kb/compatibility/`.
**Step 3 — Service Tiering:** After parsing databases, assign each workload a tier (Platinum/Gold/Silver/Bronze) based on SLA requirements, compliance needs, and business criticality. Use the auto-assignment rules in `kb/patterns/service-tiering.yaml`. Present the assignment and ask the architect to confirm or adjust.
@@ -351,7 +403,7 @@ Capture enough about current state to architect the future. Frame the problem
1. **Select services** from `kb/services/` across the full OCI catalog
2. **Dimension each service** using `kb/sizing/` rules. For Oracle DBs, use AWR metrics if available. Apply conversion ratios. For ADB-S, size base OCPUs for P75.
3. **Compose topology** from `kb/patterns/` blocks. Check conflicts, add implied dependencies, apply compliance overlays. Use `kb/patterns/application-patterns.yaml` for workload-type guidance.
3. **Compose topology** from `kb/patterns/` blocks. Check conflicts and apply compliance overlays. Use `kb/patterns/application-patterns.yaml` for workload-type guidance. **Do NOT silently add components** — only add technical dependencies from the closed whitelist in the Guardrails section below. Everything else must be proposed as optional in the pre-generation review.
4. **Architecture Principles** — Select applicable principles from `kb/patterns/architecture-principles.yaml` based on the workload profile. Check `applies_when` conditions. Include in the deck as a governance slide.
5. **Environment Catalogue** — Expand each workload into environments (Prod/Pre-Prod/Dev-Test/DR) using the tier templates in `kb/patterns/environment-catalogue.yaml`. Apply cost optimization rules. Include in the deck and in the cost estimate.
6. **Design deployment** — environment strategy, IaC approach, CI/CD pipeline
@@ -374,6 +426,28 @@ Capture enough about current state to architect the future. Frame the problem
#### Confirm (Solution Proposal)
**Completeness gate (MANDATORY before generating artifacts).** Before calling any generation tool (deck, diagram, BOM, PDF), verify that critical fields are populated based on engagement tier:
| Field | Small | Standard | Complex |
|---|---|---|---|
| customer_name | required | required | required |
| workload_type | required | required | required |
| databases (type + count) | required | required | required |
| primary_region | required | required | required |
| compliance_frameworks | — | required | required |
| RTO / RPO | — | required | required |
| team_size | — | required | required |
| current_infrastructure | — | required | required |
| migration_driver | — | required | required |
| environment_strategy | — | — | required |
| operational_model | — | — | required |
| multi_region_topology | — | — | required |
| data_residency | — | — | required |
- If **required** fields are missing: ask the user before generating.
- If **optional** fields are missing: list them as assumptions in the output (e.g., "Assumed: PAYG pricing, single environment, no compliance requirements").
- Fields tagged `source: inferred` in the workload profile count as populated but should be flagged as assumptions.
Assemble all design work into a proposal. Ensure all propositions are **SMART**. Quality matters — it must look professional.
**Outputs by tier:** See artifact matrix in [docs/engagement-tiers.md](docs/engagement-tiers.md)
@@ -415,162 +489,30 @@ Full DELIVER guide: [docs/deliver-phase.md](docs/deliver-phase.md)
Every skill option that produces output MUST generate **readable, human-consumable output** as the primary deliverable. YAML files are structured backing data — they are never the final output shown to the user. Specifically:
- **Options 1-4, 8:** Primary output is `.pptx` (slide deck) and/or `.drawio` (diagram). YAML specs are saved alongside but never presented as the deliverable.
- **Options 1-4, 8:** Primary output is `.pptx` (slide deck), `.drawio` (diagram), and/or native `.excalidraw` sketch when the user requests draft mode. YAML/Mermaid specs are saved alongside when useful but never presented as the final deliverable.
- **Option 5 (WA Review):** Primary output is the **formatted terminal scorecard** (banner + pillar bars + gap tables + recommendations). YAML scorecard saved to `examples/` as backing data.
- **Option 12 (ECAL Readiness):** Primary output is the **formatted terminal scorecard** (phase scores + artefact checklist + gap analysis). YAML scorecard saved to `examples/` as backing data.
- **After any review/score:** When the user picks [C] "Export as slide", generate a 1-2 slide `.pptx` with the scorecard visualization using `tools/oci_deck_gen.py`.
If a tool or agent generates YAML without the corresponding readable output, the task is **incomplete**. Always present the formatted result, then list the files saved.
### Output Directory Convention
### Output directory, slide deck structure, format options, service categorization
All generated files MUST be saved inside a dedicated output folder per customer/initiative:
```
examples/output-<customer>-<initiative>/
```
Examples:
- `examples/output-meli-im06/` — MELI MySQL engagement
- `examples/output-meli-im30/` — MELI ElasticSearch engagement
- `examples/output-acme-migration/` — ACME cloud migration
This folder contains ALL outputs for that engagement: `.pptx`, `.drawio`, `.yaml` specs, `.pdf`, scorecards. The folder is gitignored via `examples/output-*/` — never commit customer data.
YAML spec files (architecture, workload-profile, diagram-spec) are saved IN the output folder, not loose in `examples/`. This keeps everything grouped and portable.
Default output is a **slide deck (.pptx)**. The architect can specify:
| Format | Output |
|--------|--------|
| `deck` (default) | 10-12 slide presentation |
| `deck + drawio` | + editable architecture diagram |
| `deck + doc` | + technical document (15-25 pages) |
| `deck + xlsx` | + cost spreadsheet with formulas |
| `deck + pdf` | + customer-facing PDF (branded, no internal refs) |
| `pdf` | Customer PDF only |
| `full` | All of the above |
| `doc only` | Technical document without slides |
| `deliver` | Handover + go-live checklist + success criteria |
### Slide Deck Structure
Slide count adapts to engagement tier (6-8 small, 10-12 standard, 12-16 complex):
1. **Title** — customer, project, date (dark background)
2. **Value Story** — business driver, hypothesis, desired outcomes
3. **Service Tiering** — workload-to-tier mapping (Platinum/Gold/Silver/Bronze) with SLA, RTO/RPO
4. **Architecture Principles** — selected ECAL principles (Design/Deployment/Service) that govern the architecture
5. **Architecture Diagram** — fills 85% of slide
6. **Architecture Decisions** — 4-6 key decisions with rationale
7. **HA/DR** — topology + RTO/RPO per tier
8. **Security & Compliance** — controls grid, compliance badges
9. **Environment Catalogue** — Prod/Pre-Prod/Dev-Test/DR per workload with sizing and isolation
10. **Cost Estimate** — PAYG vs BYOL table with assumptions (all environments)
11. **Cost Comparison** (optional) — vs current state or competitor
12. **Migration Approach** — phased timeline, tools, downtime strategy
13. **Operational RACI** — responsibility matrix (customer vs Oracle/partner)
14. **Risk Register** — severity-coded risk table
15. **Well-Architected Scorecard** — 5-pillar traffic-light indicators
16. **Next Steps** — concrete SMART actions with dates
Use `tools/oci_deck_gen.py` for generation. Colors: teal `#2D5967`, copper `#AA643B`, purple `#804998`. Font: Segoe UI. Design standards: `config/output-formats.yaml`.
### Architecture Diagram
Use `tools/oci_diagram_gen.py` with OCI official styles from `kb/diagram/oci-toolkit-styles.yaml`. Containers, service blocks, connections, and typography rules are defined there.
See [docs/skill/output-formats.md](docs/skill/output-formats.md) for the per-customer output folder convention, the complete format option matrix, the 16-slide deck structure, the diagram generation rules, and the service-to-color mapping.
---
## Available Tools
## Cookbook: Building Tool Payloads
You have access to these command-line tools for generating outputs:
Any pricing or SKU work — cost estimate (option 4), BOM (option 13), BOM-AppCA (option 14), business-case TCO (option 8), scenario comparison from a customer artefact (`.pptx`, BOM, quote) — starts in the local catalog, not on the web. Check [docs/bom-cookbook.md](docs/bom-cookbook.md) for copy-paste recipes (ExaCS X11M BYOL, ADB-Dedicated, ADB-S + Block + FastConnect) and the gotchas that otherwise burn exploration turns (e.g. ADB-Dedicated shares infrastructure SKUs with ExaCS — there are no separate `adb_dedicated` SKUs in the catalog).
### generate_diagram
Generate an OCI architecture diagram (.drawio) from a YAML spec.
```bash
python tools/oci_diagram_gen.py --spec <spec_file> --output <output_file>
```
### generate_deck
Generate an architecture proposal slide deck (.pptx) from a YAML spec.
```bash
python tools/oci_deck_gen.py --spec <spec_file> --output <output_file>
```
### generate_pdf
Generate a customer-facing PDF document (branded, no internal KB references).
```bash
python tools/oci_pdf_gen.py --spec <spec_file> --output <output_file>
# With embedded diagram:
python tools/oci_pdf_gen.py --spec <spec_file> --output <output_file> --diagram <diagram_image>
```
### generate_output
Generate complete architecture proposal outputs (deck, diagram, cost spreadsheet, PDF).
```bash
python tools/oci_output.py --spec <spec_file> --output-dir <output_dir> --format <format>
# Formats: deck, drawio, doc, xlsx, pdf, full
```
### validate_architecture
Run Well-Architected Framework validation on an architecture.
```bash
python scripts/validate-architecture.py --profile <workload_profile> --architecture <architecture> --output <scorecard>
```
### refresh_catalog
Refresh the Architecture Center catalog.
```bash
python tools/refresh_arch_catalog.py --whats-new # crawl What's New pages
python tools/refresh_arch_catalog.py --url <url> # add single entry
python tools/refresh_arch_catalog.py --validate # validate catalog
```
---
## Service Categorization
| Category | Color | Use |
|----------|-------|-----|
| **Infrastructure** | Teal `#2D5967` | Compute, OKE, LB, Gateways, WAF, Bastion, Storage, Monitoring |
| **Database** | Copper `#AA643B` | ADB-S/D, DBCS, ExaCS, MySQL, PostgreSQL, NoSQL, GoldenGate |
| **Integration** | Purple `#804998` | DRG, Streaming, Queue, OIC, FastConnect, Service Connector Hub |
| **Dormant** | Light gray `#DFDCD8` | Standby/inactive resources (DR tier) |
| **Legacy** | Medium gray `#70665E` | Non-OCI systems (MQ Series, legacy middleware) |
If a requirement does not match a recipe, `grep` [`kb/pricing/oci-sku-catalog.yaml`](kb/pricing/oci-sku-catalog.yaml) and consult `kb/services/` before inventing SKUs. See "What You Do NOT Do" for the web-lookup rule and `kb/pricing/oci-sku-catalog.yaml`'s `last_verified` for staleness handling.
---
## Knowledge Base
```
kb/
├── architecture-center/ # Oracle Architecture Center reference catalog
│ └── catalog.yaml # 130+ reference architectures, solution playbooks
├── services/ # One YAML per OCI service (what, when, gotchas)
├── patterns/ # Composable blocks
│ ├── business-patterns.yaml # Business-level patterns (DEFINE)
│ ├── application-patterns.yaml # Application architecture patterns (DESIGN)
│ ├── service-tiering.yaml # Service tier definitions
│ ├── architecture-principles.yaml # ECAL architecture principles
│ ├── operational-raci.yaml # RACI matrix templates
│ ├── engagement-raci.yaml # ECAL engagement RACI (10 roles)
│ ├── business-drivers.yaml # 4-pillar business drivers
│ ├── ecal-artefacts-catalog.yaml # Complete ECAL 3.1 artefacts (60 items)
│ ├── environment-catalogue.yaml # Environment templates per tier
│ ├── database-ha/ # Database HA patterns
│ ├── database-dr/ # Database DR patterns
│ ├── networking-*/ # Networking patterns
│ ├── compute-scaling/ # Compute auto-scaling
│ ├── security-baseline/ # Security controls
│ └── compliance-pci/ # PCI-DSS compliance
├── sizing/ # CPU conversion ratios, IOPS, scaling rules
├── pricing/ # Simplified pricing for estimation
├── competitive/ # AWS/Azure/GCP service mapping
├── well-architected/ # 5-pillar validation checklists
├── diagram/ # OCI Toolkit styles and reference layouts
├── compatibility/ # Feature matrices (ADB, etc.)
└── field-knowledge/ # Real-world gotchas and lessons learned
```
KB lives under `kb/`. See [kb/README.md](kb/README.md) for the directory map, frontmatter requirements, refresh tooling, and contributor guide.
---
@@ -579,12 +521,8 @@ kb/
| Template | Phase | Purpose |
|----------|-------|---------|
| `workload-profile.yaml` | DEFINE | Discovery capture |
| `customer-profile.yaml` | DEFINE | Strategic customer profiling |
| `strategy-map.yaml` | DEFINE | Goals→Strategies→Capabilities→Enablers |
| `value-story.yaml` | DEFINE | Business value hypothesis |
| `joint-engagement-plan.yaml` | DEFINE | Engagement scoping |
| `business-case.yaml` | DEFINE | Business case for approval |
| `discovery-questionnaire.yaml` | DESIGN | Structured IT collection |
| `operations-model.yaml` | DESIGN | Day-2 operations design |
| `scorecard.yaml` | DESIGN | WA validation results |
| `adr-template.md` | DESIGN | Architecture Decision Records |
@@ -604,27 +542,71 @@ kb/
- Present trade-offs explicitly. Let the architect decide.
- Produce the **minimum needed** for the engagement tier — don't pad.
### Minimal Output — Work Silently
**Do NOT narrate your internal process.** The architect does not need a play-by-play of what you are doing. Specifically:
- **Do NOT** announce each file you are about to read ("Let me check the service catalog...", "Reading the pricing file...").
- **Do NOT** list the KB files, templates, or patterns you are consulting.
- **Do NOT** describe intermediate reasoning steps ("First I'll parse your notes, then I'll...", "Now I'm matching services against the catalog...").
- **Do NOT** echo back the user's input as a summary before starting work.
- **Do NOT** show progress updates for sub-steps ("Step 1 done, moving to step 2...").
**What TO show:**
- Clarifying questions (when input is ambiguous or incomplete).
- The pre-generation review (component confirmation before generating artifacts).
- The final deliverable (scorecard, deck summary, file list, next-step menu).
- Errors or blockers that require the architect's input.
**In short:** Go from input → clarifying question (if needed) → pre-generation confirmation → final output. Skip everything in between. The architect cares about results, not process.
---
## Guardrails
- **Only what the user asked for.** Never add services, components, or features the user did not request — this includes observability (Monitoring, Logging, Events), security services (Data Safe, Vault, Cloud Guard, WAF), sizing details, connection types (RPC, peering), and any "nice to have" additions. Adding unrequested components wastes the architect's time and erodes trust.
- **Only what the user asked for.** Never add services, components, or features the user did not request — this includes observability (Monitoring, Logging, Events), security services (Data Safe, Vault, Cloud Guard, WAF), sizing details, connection types (RPC, peering), and any "nice to have" additions. Adding unrequested components wastes the architect's time and erodes trust. The ONLY exception is the closed whitelist of technical dependencies below.
- **Technical dependency whitelist (closed — nothing else is auto-added):**
| If the user requests… | Auto-include | Reason |
|---|---|---|
| FastConnect | DRG | FastConnect terminates on DRG — cannot work without it |
| VPN Connect | DRG | IPSec tunnels terminate on DRG |
| ADB-S / ExaCS with backup to Object Storage | Service Gateway | Backup traffic requires SGW for Oracle Services Network |
| Any service in a public subnet | Internet Gateway | Public subnet routing requires IGW |
| Any private subnet service needing internet egress | NAT Gateway | Private-to-internet routing requires NAT |
| Cross-region DR (Data Guard, FSDR) | Remote Peering Connection (RPC) | Cross-region VCN connectivity requires RPC on both DRGs |
Everything NOT in this table — including Monitoring, Logging, Events, Vault, Data Safe, WAF, Cloud Guard, Bastion, management subnets, compartment boundaries — requires explicit user approval via the pre-generation review.
- **Ask, don't guess.** When requirements are ambiguous or incomplete, ask a clarifying question instead of filling in assumptions. A 10-second question saves a 10-minute redo.
- **Pre-generation review.** Before generating any diagram or architecture artifact, confirm the component list with the user. Present what you understood and suggest optional additions they can approve or reject:
```
I'll generate a diagram with:
✅ [list of explicitly requested components]
Want me to also include any of these?
• Observability subnet
• Compartment boundaries
• Security services (Data Safe, Vault)
• Gateways (IGW, NAT, SGW)
• [other relevant options based on context]
Or just generate with the above?
- **MANDATORY pre-generation review.** Before generating ANY diagram, deck, or architecture artifact, you MUST confirm the component list with the user. Never skip this step. Present three clearly separated sections:
```
This takes 5 seconds to confirm and prevents rework.
I'll generate with:
REQUESTED (from your input):
✅ [only components explicitly mentioned by the user]
TECHNICAL DEPENDENCIES (auto-added per whitelist):
⚙️ [only items from the whitelist table above, with reason]
OPTIONAL — want me to add any of these?
○ Observability (Monitoring, Logging, Events)
○ Security services (Vault, Data Safe, WAF, Cloud Guard)
○ Management subnet
○ Compartment boundaries
○ Bastion / jump host
○ [other relevant options based on context]
Generate with the above, or adjust?
```
Wait for the user's response before generating. If the user says "just generate" or equivalent, proceed with only REQUESTED + TECHNICAL DEPENDENCIES (no optionals).
- **Source attribution.** When the user provides documents, URLs, meeting notes, or external data:
- Cite the source when extracting data: "From [document/source]: [extracted fact]"
- Clearly separate facts from the source vs. your own inferences
- If the source contradicts the internal KB, flag the conflict explicitly and let the architect decide
## What You Do NOT Do
@@ -632,20 +614,10 @@ kb/
- You do NOT replace the architect's judgment. You accelerate it.
- You do NOT generate pixel-perfect diagrams. You generate 80% drafts the architect refines.
- You do NOT make up pricing. If you don't have current pricing, estimate ranges.
- You do NOT use WebSearch / WebFetch / `oracle.com` for OCI list prices or SKU lookups. `kb/pricing/oci-sku-catalog.yaml` is auto-refreshed via `tools/refresh_sku_catalog.py` (Oracle apexapps pricing API) and is the source of truth — including for ECPU/OCPU rates, BYOL deltas, Exadata X11M part numbers, and ADB-D ECPU SKUs. Web fallback is allowed ONLY when (a) the SKU is genuinely absent after `grep` AND a fresh `--refresh` still does not surface it, or (b) the catalog's `last_verified` is >60 days stale and a refresh is not currently possible. In either case, cite the source URL alongside the part number. Reflexively reaching for WebSearch when the catalog already has the answer is the most common cost-estimate failure mode — don't.
- You do NOT claim features exist if you're unsure. Check the KB first.
- You do NOT do detailed project management. DELIVER artifacts are lightweight handover aids.
- You do NOT add services or components the user did not request.
- **The skill ships as an MCP server.** This repo is packaged and served via the hosted MCP at `https://mcp.tech-lad.com/deal-accelerator/mcp/`. Anything you change in the skill's runtime — `tools/`, `scripts/`, `kb/`, `SKILL.md`, `AGENTS.md`, `.agents/` — must keep working in that deployed environment, not just on the SA's laptop. Concrete implications: (1) NO machine-specific paths (use `pathlib.Path(__file__).resolve().parent.parent` or env vars, never hardcoded `/mnt/c/...` or `/home/diego/...`); (2) NO required network calls during normal operation (the MCP container won't have access to drawio.exe, paid APIs, or Diego's local files — opt-in via env vars like `DRAWIO_EXE` / `ANTHROPIC_API_KEY`, never required); (3) NO writes outside the repo tree (the MCP filesystem is the cloned repo, write only under `examples/`, `tmp/`, or the artifacts the skill is meant to produce); (4) NO new dependencies that aren't in `requirements.txt` (CI installs from there, the MCP container too); (5) any new tool must work in a fresh clone with `make venv` — no manual setup steps. Before adding a feature that depends on a binary, an external service, or a privileged operation, ask whether it'll work when the SA is hitting the MCP endpoint with no laptop attached.
---
## Multi-Agent Mode (Codex)
When running in Codex with multiple agents, this skill can be split:
- **Agent 1 (Architect)**: Runs Phase 1 (DEFINE — discovery capture) and Phase 2 (DESIGN — composition)
- **Agent 2 (Validator)**: Runs WA validation on the composed architecture
- **Agent 3 (Renderer)**: Generates diagram + deck + PDF + any other outputs
The Architect agent produces the structured YAML spec. The Validator annotates it with WA findings. The Renderer consumes the annotated spec and produces files.
Each agent reads the same KB but focuses on its phase. The orchestrating agent (or the user) coordinates handoffs.
- **You do NOT edit skill source code or tooling when the user is in "menu mode".** When the user invoked the skill via the welcome menu (options 114) or asked for one of the menu outputs (proposal, diagram, deck, BOM, WA review, etc.), your job is to USE the existing tools, not modify them. Do NOT touch `tools/`, `scripts/`, `kb/diagram/*.json`, or any other code/index file as part of fulfilling a menu request — even if you discover a bug or a missing alias mid-task. If you hit a tool gap (missing icon alias, broken renderer, type that doesn't resolve), surface it as a follow-up at the end of your reply (e.g. "I noticed `refreshable_clone` doesn't have a PPTX icon alias — flag this for the maintainer to add to `tools/oci_pptx_diagram_gen.py::TYPE_TO_ICON`") rather than silently patching it. Code edits happen in a separate "developer mode" engagement, not while the SA is generating customer artifacts. The two exceptions: (1) `kb/field-findings/tracker.yaml` via menu option 11 (the menu's purpose IS to write that file), and (2) writing the customer's spec/output YAML files under `examples/<customer>/` — those are the deliverable, not the skill itself.

20
.claude/settings.json Normal file
View File

@@ -0,0 +1,20 @@
{
"permissions": {
"allow": [
"Read(**)",
"Write(examples/**)",
"Write(output/**)",
"Bash(python3.12:*)",
"Bash(python3:*)",
"Bash(.venv/bin/python:*)",
"Bash(make:*)",
"Bash(git:*)",
"Bash(pip:*)",
"Bash(pip3:*)",
"Bash(pip3.12:*)",
"Bash(ls:*)",
"Bash(which:*)",
"Bash(find:*)"
]
}
}

View File

@@ -60,7 +60,156 @@
"Bash(PYTHONPATH=/tmp/pptx_ok python3 -c \"from pptx import Presentation; print\\(''''OK''''\\)\")",
"Bash(PYTHONPATH=/tmp/pptx_ok python3 /tmp/migrate_to_oracle.py)",
"Bash(PYTHONPATH=/tmp/pptx_ok python3 -c \"\nfrom pptx import Presentation\nprs = Presentation\\('/mnt/c/Users/Diego/Documents/oci-deal-accelerator/oci-deal-accelerator/templates/Oracle_PPT-template_FY26.pptx'\\)\nprint\\('Template has {} existing slides'.format\\(len\\(prs.slides\\)\\)\\)\n\")",
"Bash(grep:*)"
"Bash(grep:*)",
"Bash(ls \"/mnt/c/Users/Diego/Documents/oci-deal-accelerator-oracle/oci-deal-accelerator/templates/Oracle_PPT\"*)",
"Bash(ls \"/mnt/c/Users/Diego/Documents/oci-deal-accelerator-oracle/oci-deal-accelerator/templates/\"*.pptx)",
"Bash(ls \"/mnt/c/Users/Diego/Documents/oci-deal-accelerator-oracle/oci-deal-accelerator/templates/\"*.potx)",
"Bash(python3.12 -c \"import drawpyo\")",
"Bash(python3.12 tools/oci_diagram_gen.py --spec examples/output-meli-kvs/diagram-spec.yaml --output examples/output-meli-kvs/architecture.drawio)",
"Bash(python3.12 tools/oci_pdf_gen.py --spec examples/output-meli-kvs/proposal-spec.yaml --output examples/output-meli-kvs/customer-proposal.pdf)",
"Bash(python3.12 -c \":*)",
"Bash(python3.12 tools/oci_deck_gen.py --spec examples/output-meli-kvs/proposal-spec.yaml --output examples/output-meli-kvs/architecture-proposal.pptx)",
"Bash(python3.12 tools/oci_bizcase_gen.py --spec examples/output-meli-kvs/business-case.yaml --output examples/output-meli-kvs/business-case.pptx)",
"Bash(python3 -c \":*)",
"WebFetch(domain:github.com)",
"Bash(curl -s --max-time 15 -H \"X-Oracle-Accept-CurrencyCode: USD\" \"https://itra.oraclecloud.com/itas/.anon/myservices/api/v1/products?limit=2&partNumber=B110627\")",
"Bash(curl -v --max-time 10 -H \"X-Oracle-Accept-CurrencyCode: USD\" \"https://itra.oraclecloud.com/itas/.anon/myservices/api/v1/products?limit=1\")",
"Bash(curl -s --max-time 15 \"https://apexapps.oracle.com/pls/apex/cetools/api/v1/products/?partNumber=B110627&currencyCode=USD\")",
"Bash(find:*)",
"Bash(echo \"exit=$?\")",
"Bash(echo \"quiet exit=$?\")",
"Bash(make freshness:*)",
"Bash(echo \"freshness exit=$?\")",
"Bash(make help:*)",
"Bash(make lint:*)",
"Bash(curl -sS \"https://apexapps.oracle.com/pls/apex/cetools/api/v1/products/?currencyCode=USD\")",
"Bash(/bin/rm kb/pricing/ai-ml.yaml kb/pricing/analytics.yaml kb/pricing/containers-serverless.yaml kb/pricing/database.yaml kb/pricing/developer.yaml kb/pricing/hybrid-vmware.yaml kb/pricing/integration.yaml kb/pricing/networking.yaml kb/pricing/observability.yaml kb/pricing/pricing-models.yaml kb/pricing/security.yaml kb/pricing/storage.yaml)",
"Bash(python3.12 tools/oci_deck_gen.py --spec examples/proposal-spec.yaml --output examples/output-cli-improvements-deliverables/architecture-proposal.pptx)",
"Bash(python3.12 tools/oci_diagram_gen.py --spec examples/diagram-spec.yaml --output examples/output-cli-improvements-deliverables/architecture.drawio)",
"Bash(python3.12 tools/oci_pdf_gen.py --spec examples/proposal-spec.yaml --output examples/output-cli-improvements-deliverables/customer-proposal.pdf)",
"Bash(python3.12 tools/oci_bom_gen.py --spec examples/exacs-bom-spec.yaml --output examples/output-cli-improvements-deliverables/exacs-bom.xlsx)",
"Bash(python3.12 tools/oci_bom_gen.py --spec examples/exacs-x11m-bom-spec.yaml --output examples/output-cli-improvements-deliverables/exacs-x11m-bom.xlsx)",
"Bash(python3.12 tools/kb_cli.py search \"Autonomous Database\" --json)",
"Bash(python3.12 tools/findings_cli.py search \"adb\" --product ADB-S --json)",
"Bash(python3.12 tools/findings_cli.py stats --json)",
"Bash(python3.12 tools/kb_cli.py arch-search --services adb-s exacs --tags ha-dr --json)",
"Bash(python3.12 tools/kb_cli.py ecal-score --summary \"ADB-S migration with Data Guard business case architecture review customer profile strategy map handover go-live\" --json)",
"Bash(python3.12 tools/oci_bom_gen.py --spec examples/exacs-bom-spec.yaml --output examples/output-cli-improvements-deliverables/exacs-bom-appca.xlsx --appca)",
"Bash(python3.12 tools/oci_bom_gen.py --spec examples/exacs-x11m-bom-spec.yaml --output examples/output-cli-improvements-deliverables/exacs-x11m-bom-appca.xlsx --appca)",
"Bash(python3.12:*)",
"Bash(pip3.12 list:*)",
"Bash(pip3.12 install:*)",
"Bash(xargs ls:*)",
"WebFetch(domain:www.drawio.com)",
"WebFetch(domain:jgraph.github.io)",
"WebFetch(domain:raw.githubusercontent.com)",
"Bash(ls /root/.claude/projects/-mnt-c-Users-Diego-Documents-oci-deal-accelerator-oracle-oci-deal-accelerator/a0d00b4c-8d61-421c-8ba9-19bb85f15fdb/tool-results/*.zip)",
"WebFetch(domain:developers.openai.com)",
"Bash(echo \"---exit:$?---\")",
"Bash(date +%s)",
"Read(//tmp/**)",
"Bash(.venv/bin/pip install *)",
"Bash(curl -sS -o /dev/null -w \"HTTP:%{http_code} dns:%{remote_ip} time:%{time_total}s\\\\n\" --max-time 10 https://mcp.tech-lad.com/deal-accelerator/mcp/)",
"Bash(curl -sS -o /dev/null -w \"oauth HTTP:%{http_code}\\\\n\" --max-time 10 https://mcp.tech-lad.com/oauth/authorize)",
"mcp__oci-deal-accelerator__generate_deck",
"mcp__oci-deal-accelerator__generate_business_case",
"mcp__oci-deal-accelerator__generate_bom",
"mcp__oci-deal-accelerator__generate_bom_appca",
"Bash(mkdir -p /tmp/mcp-test-outputs)",
"Bash(curl -sS -o deck-nova.pptx \"https://mcp.tech-lad.com/deal-accelerator/files/176ac90e-test-nova-retail-deck.pptx\")",
"Bash(curl -sS -o biz-nova.pptx \"https://mcp.tech-lad.com/deal-accelerator/files/42dd4da2-test-nova-retail-bizcase.pptx\")",
"Bash(curl -sS -o bom-vector.xlsx \"https://mcp.tech-lad.com/deal-accelerator/files/3868d74a-test-vector-retail-bom.xlsx\")",
"Bash(curl -sS -o bom-vector-appca.xlsx \"https://mcp.tech-lad.com/deal-accelerator/files/b34fa397-test-vector-retail-bom-appca.xlsx\")",
"Bash(curl -sS -o /tmp/mcp-test-outputs/biz-nova.pptx \"https://mcp.tech-lad.com/deal-accelerator/files/42dd4da2-test-nova-retail-bizcase.pptx\")",
"Bash(curl -sS -o /tmp/mcp-test-outputs/bom-vector.xlsx \"https://mcp.tech-lad.com/deal-accelerator/files/3868d74a-test-vector-retail-bom.xlsx\")",
"Bash(curl -sS -o /tmp/mcp-test-outputs/bom-vector-appca.xlsx \"https://mcp.tech-lad.com/deal-accelerator/files/b34fa397-test-vector-retail-bom-appca.xlsx\")",
"Bash(curl -sS -o /tmp/mcp-test-outputs/deck-vector.pptx \"https://mcp.tech-lad.com/deal-accelerator/files/19c5330e-test-vector-bank-deck.pptx\")",
"Bash(curl -sS -o /tmp/mcp-test-outputs/biz-digital.pptx \"https://mcp.tech-lad.com/deal-accelerator/files/16b90f10-test-vector-digital-bizcase.pptx\")",
"Bash(curl -sS -o /dev/null -w \"git remote HTTP: %{http_code} time: %{time_total}s\\\\n\" --max-time 15 https://git.tech-lad.com.br/)",
"Bash(awk '/- sku:/{sku=$NF} /product:/{print sku\" - \"$0}' kb/pricing/oci-sku-catalog.yaml)",
"Bash(awk '{print $3}')",
"Bash(awk '/- sku: B110627|- sku: B110628|- sku: B110629|- sku: B90453/{print;f=1;next} f&&/product:/{print;f=0}' kb/pricing/oci-sku-catalog.yaml)",
"Bash(awk '/- sku:/{sku=$NF} /product:.*Exadata|product:.*ECPU|product:.*Autonomous/{print sku\" - \"$0}' kb/pricing/oci-sku-catalog.yaml)",
"Bash(awk '/- sku: B90453/,/product:/' kb/pricing/oci-sku-catalog.yaml)",
"Bash(awk '/- sku:/{sku=$NF} /product:.*ADB|product:.*NoSQL|product:.*HeatWave|product:.*MySQL/{print sku\" - \"$0}' kb/pricing/oci-sku-catalog.yaml)",
"Bash(\"/mnt/c/Program Files/draw.io/draw.io.exe\" --help)",
"Bash(\"/mnt/c/Program Files/draw.io/draw.io.exe\" -x -f png -b 10 -o \"tmp/compare-iter/iter1.png\" \"tmp/compare-iter/iter1.drawio\")",
"Bash(\"/mnt/c/Program Files/draw.io/draw.io.exe\" -x -f png -b 20 --crop -s 2 -o tmp/compare-iter/iter4_crop.png tmp/compare-iter/iter4.drawio)",
"Bash(\"/mnt/c/Program Files/draw.io/draw.io.exe\" -x -f png -b 20 --crop -s 2 -o tmp/compare-iter/REFERENCE.png examples/output-meli-fraud-adbd-migration/adbsplusadbd.drawio)",
"Bash(\"/mnt/c/Program Files/draw.io/draw.io.exe\" -x -f png -b 30 --crop -s 3 -o tmp/compare-iter/iter6_hires.png tmp/compare-iter/iter6.drawio)",
"Bash(\"/mnt/c/Program Files/draw.io/draw.io.exe\" -x -f png -b 20 --crop -s 3 -o tmp/compare-iter/to_be_v1_hires.png tmp/compare-iter/to_be_v1.drawio)",
"Bash(\"/mnt/c/Program Files/draw.io/draw.io.exe\" -x -f png -b 40 -s 4 -o tmp/compare-iter/to_be_v1_4x.png tmp/compare-iter/to_be_v1.drawio)",
"Bash(\"/mnt/c/Program Files/draw.io/draw.io.exe\" -x -f png --crop -b 20 --width 3000 -o tmp/compare-iter/to_be_v1_w3000.png tmp/compare-iter/to_be_v1.drawio)",
"Bash(\"/mnt/c/Program Files/draw.io/draw.io.exe\" -x -f png -b 20 --crop --width 4500 -o tmp/compare-iter/to_be_v1_w4500.png tmp/compare-iter/to_be_v1.drawio)",
"Bash(\"/mnt/c/Program Files/draw.io/draw.io.exe\" -x -f png -b 30 --crop --width 5000 -o tmp/compare-iter/as_is_final.png examples/output-meli-fraud-adbd-migration/fraud-as-is-adbs.drawio)",
"Bash(\"/mnt/c/Program Files/draw.io/draw.io.exe\" -x -f png -b 30 --crop --width 5000 -o tmp/compare-iter/to_be_final.png examples/output-meli-fraud-adbd-migration/fraud-to-be-adbd.drawio)",
"Bash(curl -sL \"https://docs.oracle.com/en/solutions/deploy-autonomous-database-db-at-azure/index.html\" -o tmp/oracle-ref-archs/adb-azure.html)",
"Bash(curl -sL -w 'HTTP:%{http_code} size:%{size_download}\\\\n' \"https://docs.oracle.com/en/solutions/deploy-autonomous-database-db-at-azure/index.html\" -o /tmp/x.html)",
"Bash(curl -sL -w 'HTTP:%{http_code} size:%{size_download}\\\\n' \"https://docs.oracle.com/en/solutions/deploy-autonomous-database-db-at-azure/img/autonomous-database-db-azure-diagram-oracle.zip\" -o adb-azure.zip)",
"Bash(unzip -l adb-azure.zip)",
"Bash(unzip -o -q adb-azure.zip)",
"Bash(mv oracle-adb-jde-exadata-arch-oracle *)",
"Bash(curl -sL \"https://docs.oracle.com/en/solutions/dataguard-exadata-dedicated-infrastructure/index.html\" -o dg-exa-dedicated.html)",
"Bash(curl -sL \"https://docs.oracle.com/en/solutions/dataguard-exadata-dedicated-infrastructure/img/exadata-dedicated-region-dataguard.zip\" -o dg-exa-region.zip)",
"Bash(curl -sL \"https://docs.oracle.com/en/solutions/dataguard-exadata-dedicated-infrastructure/img/exadata-dedicated-cross-region-dataguard.zip\" -o dg-exa-cross-region.zip)",
"Bash(unzip -o -q dg-exa-region.zip)",
"Bash(unzip -o -q dg-exa-cross-region.zip)",
"Bash('/mnt/c/Program Files/draw.io/draw.io.exe' -x -f png -b 20 --crop -o /mnt/c/Users/Diego/Documents/oci-deal-accelerator-oracle/oci-deal-accelerator/tmp/oracle-ref-archs/oracle-adb-jde-exadata-arch-oracle/oracle-adb-jde-exadata-arch.png /mnt/c/Users/Diego/Documents/oci-deal-accelerator-oracle/oci-deal-accelerator/tmp/oracle-ref-archs/oracle-adb-jde-exadata-arch-oracle/oracle-adb-jde-exadata-arch.drawio)",
"Bash(\"/mnt/c/Program Files/draw.io/draw.io.exe\" -x -f png -b 20 --crop -s 2 -o /mnt/c/Users/Diego/Documents/oci-deal-accelerator-oracle/oci-deal-accelerator/tmp/oracle-ref-archs/oracle-adb-jde-exadata-arch-oracle/oracle-adb-jde-exadata-arch.png /mnt/c/Users/Diego/Documents/oci-deal-accelerator-oracle/oci-deal-accelerator/tmp/oracle-ref-archs/oracle-adb-jde-exadata-arch-oracle/oracle-adb-jde-exadata-arch.drawio)",
"Bash(\"/mnt/c/Program Files/draw.io/draw.io.exe\" -x -f png -b 20 --crop -s 2 -o tmp/oracle-ref-archs/oracle-adb-jde-exadata-arch-oracle/rendered.png tmp/oracle-ref-archs/oracle-adb-jde-exadata-arch-oracle/oracle-adb-jde-exadata-arch.drawio)",
"Bash(\"/mnt/c/Program Files/draw.io/draw.io.exe\" -x -f png -b 20 --crop -s 2 -o tmp/compare-iter/fraud-as-is-template.png examples/output-meli-fraud-adbd-migration/fraud-as-is-template.drawio)",
"Bash(\"/mnt/c/Program Files/draw.io/draw.io.exe\" -x -f png -b 20 --crop -s 2 -o tmp/compare-iter/fraud-to-be-template.png examples/output-meli-fraud-adbd-migration/fraud-to-be-template.drawio)",
"WebFetch(domain:www.bugraparlayan.com.tr)",
"WebFetch(domain:www.infolob.com)",
"Bash(curl -sS \"https://git.tech-lad.com.br/api/v1/repos/diegoecab/oci-deal-accelerator/actions/runs?limit=10\")",
"Bash(curl -sS \"https://git.tech-lad.com.br/api/v1/repos/diegoecab/oci-deal-accelerator/actions/secrets\")",
"Bash(curl -sS -o /dev/null -w \"%{http_code}\\\\n\" \"https://git.tech-lad.com.br/api/v1/repos/diegoecab/oci-deal-accelerator\")",
"Bash(curl -sS \"https://git.tech-lad.com.br/diegoecab/oci-deal-accelerator/raw/branch/main/.gitea/workflows/sku-catalog-refresh.yaml\")",
"Bash(curl -sS -o /dev/null -w \"%{http_code}\\\\n\" \"https://git.tech-lad.com.br/diegoecab/oci-deal-accelerator/raw/branch/main/.gitea/workflows/sku-catalog-refresh.yaml\")",
"Bash(curl -sS \"https://git.tech-lad.com.br/api/v1/repos/diegoecab/oci-deal-accelerator/issues?type=issues&state=open&limit=5&sort=newest\")",
"Bash(curl -sS \"https://git.tech-lad.com.br/api/v1/repos/diegoecab/oci-deal-accelerator/branches?limit=50\")",
"Bash(curl -sS \"https://git.tech-lad.com.br/api/v1/repos/diegoecab/oci-deal-accelerator\")",
"Bash(xargs -n1 grep -l '\"fidelity\"')",
"Bash(xargs '-I{}' .venv/bin/python -c ' *)",
"Bash(apt-cache show *)",
"Bash(apt list *)",
"Read(//mnt/c/Program Files/draw.io/**)",
"Read(//mnt/c/Users/Diego/AppData/Local/Programs/draw.io/**)",
"Read(//mnt/c/**)",
"Bash(\"/mnt/c/Program Files/draw.io/draw.io.exe\" -x -f png -o /tmp/test-drawio.png examples/dataguard-exa-dedicated-in-region/out/dataguard-exa-dedicated-in-region.drawio)",
"Bash(mkdir -p /mnt/c/Users/Diego/tmp-drawio-export)",
"Bash(\"/mnt/c/Program Files/draw.io/draw.io.exe\" -x -f png -s 2 -o /mnt/c/Users/Diego/tmp-drawio-export/test.png examples/dataguard-exa-dedicated-in-region/out/dataguard-exa-dedicated-in-region.drawio)",
"Bash(mkdir -p '/mnt/c/Users/Diego/tmp-drawio-export')",
"Bash('/mnt/c/Program Files/draw.io/draw.io.exe' -x -f png -s 2 -o 'C:\\\\Users\\\\Diego\\\\tmp-drawio-export\\\\test.png' 'C:\\\\Users\\\\Diego\\\\Documents\\\\oci-deal-accelerator-oracle\\\\oci-deal-accelerator\\\\examples\\\\dataguard-exa-dedicated-in-region\\\\out\\\\dataguard-exa-dedicated-in-region.drawio')",
"Bash(DRAWIO_EXE=\"/mnt/c/Program Files/draw.io/draw.io.exe\" .venv/bin/python tools/drawio_to_png.py --drawio examples/asis-tobe-adb-modernization/out/asis-adb-s-local-dr.drawio --out tmp/drawio-renders/asis-v3.png)",
"Bash(DRAWIO_EXE=\"/mnt/c/Program Files/draw.io/draw.io.exe\" .venv/bin/python tools/drawio_to_png.py --drawio examples/asis-tobe-adb-modernization/out/tobe-adb-d-active-dataguard.drawio --out tmp/drawio-renders/tobe-v3.png)",
"Bash(DRAWIO_EXE=\"/mnt/c/Program Files/draw.io/draw.io.exe\" .venv/bin/python tools/drawio_to_png.py --drawio examples/asis-tobe-adb-modernization/out/asis-adb-s-local-dr.drawio --out tmp/drawio-renders/asis-v4.png)",
"Bash(DRAWIO_EXE=\"/mnt/c/Program Files/draw.io/draw.io.exe\" .venv/bin/python tools/drawio_to_png.py --drawio examples/asis-tobe-adb-modernization/out/tobe-adb-d-active-dataguard.drawio --out tmp/drawio-renders/tobe-v4.png)",
"Bash(DRAWIO_EXE=\"/mnt/c/Program Files/draw.io/draw.io.exe\" .venv/bin/python tools/drawio_to_png.py --drawio examples/asis-tobe-adb-modernization/out/asis-adb-s-local-dr.drawio --out tmp/drawio-renders/asis-v5.png)",
"Bash(DRAWIO_EXE=\"/mnt/c/Program Files/draw.io/draw.io.exe\" .venv/bin/python tools/drawio_to_png.py --drawio examples/asis-tobe-adb-modernization/out/tobe-adb-d-active-dataguard.drawio --out tmp/drawio-renders/tobe-v5.png)",
"Bash(DRAWIO_EXE=\"/mnt/c/Program Files/draw.io/draw.io.exe\" .venv/bin/python tools/drawio_to_png.py --drawio examples/asis-tobe-adb-modernization/out/asis-adb-s-local-dr.drawio --out tmp/drawio-renders/asis-v6.png)",
"Bash(DRAWIO_EXE=\"/mnt/c/Program Files/draw.io/draw.io.exe\" .venv/bin/python tools/drawio_to_png.py --drawio examples/asis-tobe-adb-modernization/out/tobe-adb-d-active-dataguard.drawio --out tmp/drawio-renders/tobe-v6.png)",
"Bash(DRAWIO_EXE=\"/mnt/c/Program Files/draw.io/draw.io.exe\" .venv/bin/python tools/drawio_to_png.py --drawio examples/asis-tobe-adb-modernization/out/asis-adb-s-local-dr.drawio --out tmp/drawio-renders/asis-v7.png)",
"Bash(DRAWIO_EXE=\"/mnt/c/Program Files/draw.io/draw.io.exe\" .venv/bin/python tools/drawio_to_png.py --drawio examples/asis-tobe-adb-modernization/out/tobe-adb-d-active-dataguard.drawio --out tmp/drawio-renders/tobe-v7.png)",
"Bash(DRAWIO_EXE=\"/mnt/c/Program Files/draw.io/draw.io.exe\" .venv/bin/python tools/drawio_to_png.py --drawio examples/asis-tobe-adb-modernization/out/tobe-adb-d-active-dataguard.drawio --out tmp/drawio-renders/tobe-v9.png)",
"Bash(DRAWIO_EXE=\"/mnt/c/Program Files/draw.io/draw.io.exe\" .venv/bin/python tools/drawio_to_png.py --drawio examples/asis-tobe-adb-modernization/out/tobe-adb-d-active-dataguard.drawio --out tmp/drawio-renders/tobe-final.png)",
"Bash(DRAWIO_EXE=\"/mnt/c/Program Files/draw.io/draw.io.exe\" .venv/bin/python tools/drawio_to_png.py --drawio examples/asis-tobe-adb-modernization/out/asis-adb-s-local-dr.drawio --out tmp/drawio-renders/asis-final2.png)",
"Bash(DRAWIO_EXE=\"/mnt/c/Program Files/draw.io/draw.io.exe\" .venv/bin/python tools/drawio_to_png.py --drawio examples/asis-tobe-adb-modernization/out/tobe-adb-d-active-dataguard.drawio --out tmp/drawio-renders/tobe-final2.png)",
"Bash(.githooks/pre-commit)",
"Bash(unzip -l awr_Transactional.zip)",
"Bash(mkdir -p /tmp/awr_meli)",
"Bash(unzip -o \"/mnt/c/Users/Diego/Documents/Meli/ABD-M/April 2026 - Fraude ADB-S to ADB-D/awr_Transactional.zip\")",
"Bash(cp \"/mnt/c/Users/Diego/Documents/Meli/ABD-M/April 2026 - Fraude ADB-S to ADB-D/meli-fraud-adbd-arch.pptx\" /tmp/meli-fraud-adbd-arch.pptx)",
"Bash(unzip -o meli-fraud-adbd-arch.pptx -d meli-pptx-extracted/)",
"Bash(cp -f \"/mnt/c/Users/Diego/Documents/Meli/ABD-M/April 2026 - Fraude ADB-S to ADB-D/meli-fraud-adbd-arch.pptx\" /tmp/meli-fraud-adbd-arch.pptx)",
"Bash(rm -rf /tmp/meli-pptx-extracted)",
"Bash(unzip -oq /tmp/meli-fraud-adbd-arch.pptx -d /tmp/meli-pptx-extracted/)",
"Bash(cp -f \"/mnt/c/Users/Diego/Documents/Meli/ABD-M/April 2026 - Fraude ADB-S to ADB-D/meli-fraud-adbd-arch.pptx\" meli-fraud-adbd-arch.pptx)",
"Bash(rm -rf meli-pptx-extracted)",
"Bash(unzip -oq meli-fraud-adbd-arch.pptx -d meli-pptx-extracted/)",
"Bash(yes)",
"WebFetch(domain:blog.shadabmohammad.com)",
"Bash(\"/mnt/c/Program Files/draw.io/draw.io.exe\" -x -f png --scale 1 -o \"$\\(pwd\\)/examples/output-aws-mysql-to-oci-heatwave-fsdr/aws-mysql-to-heatwave-fsdr.png\" \"$\\(pwd\\)/examples/output-aws-mysql-to-oci-heatwave-fsdr/aws-mysql-to-heatwave-fsdr.drawio\")"
]
}
}

21
.codex/config.toml Normal file
View File

@@ -0,0 +1,21 @@
# Codex project configuration for OCI Deal Accelerator
# Applies to every user who opens this project with Codex CLI.
# Allow the agent to run commands without per-command approval prompts.
approval_policy = "never"
# Workspace-write: agent can write inside the project root but not system-wide.
sandbox_mode = "workspace-write"
[sandbox_workspace_write]
# Allow network access so `pip install -r requirements.txt` and `make venv`
# can actually download dependencies. Without this, Codex blocks PyPI.
network_access = true
writable_roots = []
exclude_tmpdir_env_var = false
exclude_slash_tmp = false
[shell_environment_policy]
# Inherit the user's shell env so python3.12 / python3 resolution works
# the same way as the Makefile expects.
inherit = "all"

View File

@@ -0,0 +1,50 @@
# Auto-deploy OCI Deal Accelerator skill to MCP server on every push to main.
# Requires secrets: OCI_SSH_KEY (private key), OCI_HOST (DNS alias).
name: Deploy Skill to OCI
on:
push:
branches: [main]
jobs:
deploy:
runs-on: ubuntu-latest
timeout-minutes: 5
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Setup SSH
run: |
mkdir -p ~/.ssh
echo "${{ secrets.OCI_SSH_KEY }}" > ~/.ssh/deploy_key
chmod 600 ~/.ssh/deploy_key
ssh-keyscan -H ${{ secrets.OCI_HOST }} >> ~/.ssh/known_hosts 2>/dev/null
- name: Sync skill to server
run: |
tar --exclude='.git' --exclude='.gitea' -czf /tmp/skill.tar.gz .
scp -i ~/.ssh/deploy_key /tmp/skill.tar.gz ubuntu@${{ secrets.OCI_HOST }}:/tmp/skill.tar.gz
ssh -i ~/.ssh/deploy_key ubuntu@${{ secrets.OCI_HOST }} '
rm -rf /home/ubuntu/oci-deal-accelerator-oracle/oci-deal-accelerator/*
tar -xzf /tmp/skill.tar.gz -C /home/ubuntu/oci-deal-accelerator-oracle/oci-deal-accelerator/
rm /tmp/skill.tar.gz
'
- name: Restart containers
run: |
ssh -i ~/.ssh/deploy_key ubuntu@${{ secrets.OCI_HOST }} '
cd /home/ubuntu/skills-platform &&
docker compose -f docker-compose.prod.yaml restart tools-service mcp-deal-accelerator
'
- name: Wait for healthy
run: |
ssh -i ~/.ssh/deploy_key ubuntu@${{ secrets.OCI_HOST }} '
timeout 60 bash -c "
until docker inspect --format=\"{{.State.Health.Status}}\" mcp-deal-accelerator 2>/dev/null | grep -q healthy; do
sleep 3
done
"
'

View File

@@ -0,0 +1,75 @@
# Diagram-validator gate.
#
# Runs on every push and PR. Two checks:
#
# 1. diagram-spec-audit — every absolute_layout spec under examples/
# passes tools/diagram_spec_validator.py (geometry rules:
# CONTAINER_TOO_THIN, CONTAINER_PADDING_VIOLATION,
# LABEL_OVERFLOW_PARENT). Hard fail surfaces the regressions
# Diego flagged on the MySQL HeatWave HA example.
#
# 2. drawio-validators-smoke — re-renders the canonical example with
# tools/oci_diagram_gen.py so the post-render
# drawio_visual_validator runs (font sizes, dangling edges,
# duplicate ids, off-canvas geometry).
#
# Failures block the merge so a busted geometry never ships.
name: Diagram validators
on:
push:
branches: [main]
paths:
- 'examples/**'
- 'kb/diagram/**'
- 'tools/diagram_spec_validator.py'
- 'tools/drawio_visual_validator.py'
- 'tools/oci_diagram_gen.py'
- 'tools/oci_pptx_diagram_gen.py'
pull_request:
branches: [main]
workflow_dispatch:
jobs:
diagram-validators:
runs-on: ubuntu-latest
timeout-minutes: 5
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Setup Python
run: |
apt-get update -qq
apt-get install -y --no-install-recommends python3 python3-pip python3-yaml
python3 --version
- name: Install minimal deps
run: |
python3 -m pip install --quiet --upgrade pip
python3 -m pip install --quiet drawpyo lxml pyyaml
- name: Spec validator audit (every absolute_layout spec)
run: |
set -e
total=0; failed=0
for f in $(find examples -name 'diagram-spec.yaml' -o -name '*-diagram-spec.yaml'); do
total=$((total+1))
if ! python3 tools/diagram_spec_validator.py --spec "$f" --strict; then
failed=$((failed+1))
fi
done
echo "Validated $total spec(s); $failed hard-failed."
test $failed -eq 0
- name: Re-render canonical example (drawio post-render validator)
run: |
if [ -f examples/aws-app-mysql-heatwave-ha/specs/diagram-spec.yaml ]; then
python3 tools/oci_diagram_gen.py \
--spec examples/aws-app-mysql-heatwave-ha/specs/diagram-spec.yaml \
--output /tmp/aws-app-mysql-heatwave-ha.drawio --strict
else
echo "Canonical example missing — skipping drawio smoke test"
fi

View File

@@ -0,0 +1,75 @@
# Weekly KB health check — validates catalog links and reports broken URLs.
# Runs Monday 8am UTC. Does NOT block deployments or affect user experience.
# If broken links found, creates a Gitea issue for manual review.
name: KB Health Check
on:
schedule:
- cron: '0 8 * * 1'
workflow_dispatch:
jobs:
check-links:
runs-on: ubuntu-latest
timeout-minutes: 10
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Setup Python
run: |
apt-get update -qq
apt-get install -y --no-install-recommends python3 python3-requests python3-bs4 python3-yaml
python3 --version
- name: Check Architecture Center links
id: check
continue-on-error: true
run: |
python3 tools/refresh_arch_catalog.py --check-links 2>&1 | tee /tmp/link-check.txt
echo "exit_code=$?" >> $GITHUB_OUTPUT
- name: Check SKU catalog freshness
id: sku
continue-on-error: true
run: |
python3 tools/refresh_sku_catalog.py --validate 2>&1 | tee -a /tmp/link-check.txt
- name: Create issue if problems found
if: steps.check.outcome == 'failure'
run: |
BROKEN=$(grep -c "❌" /tmp/link-check.txt || echo "0")
REDIRECTED=$(grep -c "↪️" /tmp/link-check.txt || echo "0")
BODY=$(cat <<'ISSUE_EOF'
## KB Health Check — Broken Links Found
**Run date:** $(date -u +%Y-%m-%d)
**Broken:** $BROKEN URLs
**Redirected:** $REDIRECTED URLs
<details>
<summary>Full report</summary>
```
$(cat /tmp/link-check.txt)
```
</details>
### Action needed
- For 404s: remove entry or find new URL via `python tools/refresh_arch_catalog.py --whats-new`
- For redirects: update URL in `kb/architecture-center/catalog.yaml`
ISSUE_EOF
)
# Note: Gitea issue creation requires gitea CLI or API call
# For now, save report as artifact
echo "$BODY" > /tmp/kb-health-report.md
echo "::warning::$BROKEN broken links found in KB catalog"
- name: Upload report
if: always()
uses: actions/upload-artifact@v3
with:
name: kb-health-report
path: /tmp/link-check.txt
retention-days: 30

View File

@@ -0,0 +1,67 @@
# SKILL.md sync gate.
#
# Why: the root SKILL.md (read by Claude Code) and
# .agents/skills/oci-deal-accelerator/SKILL.md (read by Codex) MUST
# stay byte-aligned modulo the auto-generated banner. If they drift,
# the two agents give the user different instructions — exactly the
# class of regression that produced the workload-driven-mode incident
# Diego flagged on 2026-04-25.
#
# This workflow blocks the merge if a PR/push leaves them out of
# sync. Locally, ``make install-hooks`` enables a pre-commit hook
# that auto-syncs before the commit lands; this CI step is the
# safety net for anyone who skipped the hook.
name: SKILL.md sync
on:
push:
branches: [main]
paths:
- 'SKILL.md'
- '.agents/skills/oci-deal-accelerator/SKILL.md'
- 'scripts/sync-skill.py'
pull_request:
branches: [main]
paths:
- 'SKILL.md'
- '.agents/skills/oci-deal-accelerator/SKILL.md'
- 'scripts/sync-skill.py'
workflow_dispatch:
jobs:
check-sync:
runs-on: ubuntu-latest
timeout-minutes: 2
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Setup Python
run: |
apt-get update -qq
apt-get install -y --no-install-recommends python3
python3 --version
- name: Verify SKILL.md is in sync with the Codex copy
run: |
python3 scripts/sync-skill.py --check
- name: Reject .agents/ edits without a matching root SKILL.md change
if: github.event_name == 'pull_request'
run: |
# If only .agents/skills/.../SKILL.md is in the diff (no
# change to root SKILL.md), someone edited the auto-generated
# copy directly. That edit will be silently destroyed by the
# next sync. Block the PR with a clear message.
base="${{ github.event.pull_request.base.sha }}"
head="${{ github.event.pull_request.head.sha }}"
changed=$(git diff --name-only "$base" "$head" || true)
if echo "$changed" | grep -qx ".agents/skills/oci-deal-accelerator/SKILL.md"; then
if ! echo "$changed" | grep -qx "SKILL.md"; then
echo "::error::PR edits .agents/skills/.../SKILL.md without touching root SKILL.md."
echo "::error::That file is auto-generated. Move the edit to SKILL.md and run 'make sync-skill'."
exit 1
fi
fi

View File

@@ -0,0 +1,163 @@
# Monthly SKU catalog refresh.
#
# Runs on the 1st of each month at 09:00 UTC and on manual dispatch.
#
# Does two things:
# 1. `--refresh`: pulls latest PAYG prices from Oracle's public API,
# updates kb/pricing/oci-sku-catalog.yaml, and opens a PR if anything
# changed.
# 2. `--discover`: reports SKUs present in the API but absent from the
# catalog (filtered to serviceCategory values already curated).
# If new SKUs are found, opens a Gitea issue listing them by category
# for manual review.
#
# Token:
# Uses the auto-provisioned secrets.GITHUB_TOKEN (Gitea Actions provides this
# per-run, scoped to this repo, GitHub-Actions-compatible). No manual secret
# configuration required. The explicit `permissions:` block below grants the
# scopes needed to push a branch, open a PR, and open an issue.
name: SKU Catalog Refresh
on:
schedule:
- cron: '0 9 1 * *'
workflow_dispatch:
permissions:
contents: write
pull-requests: write
issues: write
jobs:
refresh-and-discover:
runs-on: ubuntu-latest
timeout-minutes: 15
steps:
- name: Checkout
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Setup Python
run: |
apt-get update -qq
apt-get install -y --no-install-recommends python3 python3-requests python3-yaml jq
python3 --version
- name: Refresh prices from Oracle API
id: refresh
run: |
python3 tools/refresh_sku_catalog.py --refresh --diff 2>&1 \
| tee /tmp/refresh.log
if git diff --quiet kb/pricing/oci-sku-catalog.yaml; then
echo "changed=false" >> $GITHUB_OUTPUT
else
echo "changed=true" >> $GITHUB_OUTPUT
fi
- name: Discover missing SKUs
id: discover
run: |
python3 tools/refresh_sku_catalog.py --discover -v 2>&1 \
| tee /tmp/discover.log
NEW_COUNT=$(sed -n 's/^DISCOVER_MISSING_COUNT=\([0-9]\+\)$/\1/p' \
/tmp/discover.log | tail -1)
echo "Parsed new_count='${NEW_COUNT}'"
echo "new_count=${NEW_COUNT:-0}" >> $GITHUB_OUTPUT
- name: Upload logs as artifact
if: always()
uses: actions/upload-artifact@v3
with:
name: sku-refresh-logs
path: |
/tmp/refresh.log
/tmp/discover.log
retention-days: 90
- name: Open PR with price updates
if: steps.refresh.outputs.changed == 'true'
env:
GITEA_TOKEN: ${{ secrets.GITHUB_TOKEN }}
GITEA_SERVER: ${{ github.server_url }}
GITEA_REPO: ${{ github.repository }}
run: |
DATE=$(date -u +%Y-%m-%d)
BRANCH="automation/sku-refresh-${DATE}-run${{ github.run_number }}"
git config user.name "sku-refresh-bot"
git config user.email "sku-refresh@automation.local"
git checkout -b "$BRANCH"
git add kb/pricing/oci-sku-catalog.yaml
git commit -m "chore(pricing): monthly SKU catalog refresh (${DATE})
Automated refresh from Oracle public pricing API.
See workflow artifact 'sku-refresh-logs' for the diff."
# Push using token auth
REMOTE=$(echo "$GITEA_SERVER/$GITEA_REPO.git" \
| sed "s#https://#https://sku-refresh-bot:${GITEA_TOKEN}@#")
git push "$REMOTE" "$BRANCH"
# Open PR via Gitea API (fail-fast + log response)
OWNER=$(echo "$GITEA_REPO" | cut -d/ -f1)
REPO=$(echo "$GITEA_REPO" | cut -d/ -f2)
PAYLOAD=$(jq -n \
--arg title "chore(pricing): monthly SKU refresh ${DATE}" \
--arg head "$BRANCH" \
--arg base "main" \
--arg body "$(printf 'Automated refresh — see run artifact for full refresh/discover logs.\n\n```\n%s\n```' \
"$(tail -40 /tmp/refresh.log)")" \
'{title:$title, head:$head, base:$base, body:$body}')
echo "Creating PR ${BRANCH} -> main ..."
RESPONSE=$(curl -sS -w "\nHTTP_STATUS=%{http_code}\n" -X POST \
-H "Authorization: token ${GITEA_TOKEN}" \
-H "Content-Type: application/json" \
"${GITEA_SERVER}/api/v1/repos/${OWNER}/${REPO}/pulls" \
-d "$PAYLOAD")
echo "$RESPONSE"
STATUS=$(echo "$RESPONSE" | grep -oE 'HTTP_STATUS=[0-9]+' | cut -d= -f2)
if [ "$STATUS" != "201" ]; then
echo "::error::PR creation failed with HTTP $STATUS"
exit 1
fi
- name: Open issue for new SKUs
if: steps.discover.outputs.new_count != '0'
env:
GITEA_TOKEN: ${{ secrets.GITHUB_TOKEN }}
GITEA_SERVER: ${{ github.server_url }}
GITEA_REPO: ${{ github.repository }}
NEW_COUNT: ${{ steps.discover.outputs.new_count }}
run: |
DATE=$(date -u +%Y-%m-%d)
OWNER=$(echo "$GITEA_REPO" | cut -d/ -f1)
REPO=$(echo "$GITEA_REPO" | cut -d/ -f2)
BODY=$(printf '## %s new SKUs detected in Oracle API\n\n**Detected:** %s\n\nThese SKUs are present in the Oracle public pricing API but not yet in `kb/pricing/oci-sku-catalog.yaml`. Filter: serviceCategory values already represented in our catalog (so only relevant families show up).\n\n### Full listing\n\n```\n%s\n```\n\n### Next step\n\nReview and add relevant entries to `kb/pricing/oci-sku-catalog.yaml` under the appropriate category block. After merging, prices will be picked up automatically on the next monthly refresh.\n' \
"$NEW_COUNT" "$DATE" "$(cat /tmp/discover.log)")
PAYLOAD=$(jq -n \
--arg title "SKU catalog: ${NEW_COUNT} new SKUs to review (${DATE})" \
--arg body "$BODY" \
'{title:$title, body:$body}')
echo "Creating issue: ${NEW_COUNT} new SKUs..."
RESPONSE=$(curl -sS -w "\nHTTP_STATUS=%{http_code}\n" -X POST \
-H "Authorization: token ${GITEA_TOKEN}" \
-H "Content-Type: application/json" \
"${GITEA_SERVER}/api/v1/repos/${OWNER}/${REPO}/issues" \
-d "$PAYLOAD")
echo "$RESPONSE"
STATUS=$(echo "$RESPONSE" | grep -oE 'HTTP_STATUS=[0-9]+' | cut -d= -f2)
if [ "$STATUS" != "201" ]; then
echo "::error::Issue creation failed with HTTP $STATUS"
exit 1
fi
- name: Summary
if: always()
run: |
echo "## SKU Refresh Summary" >> $GITHUB_STEP_SUMMARY
echo "- Catalog changed: ${{ steps.refresh.outputs.changed }}" >> $GITHUB_STEP_SUMMARY
echo "- New SKUs discovered: ${{ steps.discover.outputs.new_count }}" >> $GITHUB_STEP_SUMMARY

83
.githooks/pre-commit Normal file
View File

@@ -0,0 +1,83 @@
#!/usr/bin/env bash
# Pre-commit hook: keep .agents/skills/oci-deal-accelerator/SKILL.md
# byte-aligned with the root SKILL.md (the source of truth that
# CLAUDE.md / Claude Code reads). The Codex copy under .agents/
# follows the same content with an auto-generated banner — they MUST
# stay in lock-step or Claude Code and Codex will give the user
# different instructions.
#
# Behavior:
# 1. Only the .agents/ copy staged (no root SKILL.md change):
# REJECT — the .agents/ file is auto-generated, edits MUST land
# in root SKILL.md. Otherwise the next sync silently destroys
# the change.
# 2. Root SKILL.md staged: auto-run scripts/sync-skill.py and
# stage the regenerated .agents/ copy in the same commit.
# 3. Neither: nothing to do.
# • If the script can't run (no python, etc.), abort with a clear
# message rather than committing a desync silently.
#
# Install once per clone: make install-hooks (sets core.hooksPath)
set -euo pipefail
ROOT="$(git rev-parse --show-toplevel)"
SOURCE="SKILL.md"
TARGET=".agents/skills/oci-deal-accelerator/SKILL.md"
SCRIPT="scripts/sync-skill.py"
STAGED="$(git diff --cached --name-only)"
SOURCE_STAGED=0
TARGET_STAGED=0
echo "$STAGED" | grep -qx "$SOURCE" && SOURCE_STAGED=1 || true
echo "$STAGED" | grep -qx "$TARGET" && TARGET_STAGED=1 || true
# Case 1: only the auto-generated .agents/ copy is staged. Reject —
# the source of truth is root SKILL.md and a future sync will
# silently overwrite this change.
if [ "$TARGET_STAGED" = "1" ] && [ "$SOURCE_STAGED" = "0" ]; then
echo "" >&2
echo "pre-commit: REJECTED — you staged $TARGET in isolation." >&2
echo " This file is auto-generated from $SOURCE and the next" >&2
echo " ``make sync-skill`` (or this pre-commit hook firing on a" >&2
echo " later commit) will overwrite your changes silently." >&2
echo "" >&2
echo " Workflow:" >&2
echo " 1. Move your edits into $SOURCE." >&2
echo " 2. ``git restore --staged --worktree $TARGET``" >&2
echo " 3. ``git add $SOURCE`` and re-commit — the hook will" >&2
echo " regenerate the .agents/ copy automatically." >&2
echo "" >&2
exit 1
fi
# Nothing else to do unless root SKILL.md changed.
if [ "$SOURCE_STAGED" = "0" ]; then
exit 0
fi
if [ ! -f "$ROOT/$SCRIPT" ]; then
echo "pre-commit: $SCRIPT missing — cannot verify SKILL.md sync. Aborting." >&2
exit 1
fi
PYTHON="$(command -v python3 || command -v python || true)"
if [ -z "$PYTHON" ]; then
echo "pre-commit: no python found in PATH — cannot run $SCRIPT. Aborting." >&2
exit 1
fi
# Run the full sync, then stage the regenerated target so it travels
# in the same commit. (Idempotent — if it was already in sync, the
# file write is a no-op.)
"$PYTHON" "$ROOT/$SCRIPT" >&2
git add "$ROOT/$TARGET"
# Final check — if for any reason the result still drifts, fail loud.
if ! "$PYTHON" "$ROOT/$SCRIPT" --check >/dev/null 2>&1; then
echo "pre-commit: SKILL.md and $TARGET are still out of sync after auto-run." >&2
echo " Investigate scripts/sync-skill.py before committing." >&2
exit 1
fi
exit 0

29
.gitignore vendored
View File

@@ -1,9 +1,11 @@
.venv/
__pycache__/
*.pyc
*.pyo
output/
*.pptx
!examples/sample-output/*.pptx
!templates/Oracle_PPT-template_FY26.pptx
!kb/diagram/assets/OCI_Icons.pptx
# OCI Toolkit binary (download from Oracle, don't commit)
kb/diagram/OCI Library.xml
@@ -11,23 +13,10 @@ kb/diagram/OCI Library.xml
# Build prompt (internal)
COMPLETE-BUILD-PROMPT.md
# Client-specific examples (never commit customer data)
examples/farma-sa-*
# Ignore all examples content
examples/
# Skill-generated output folders (customer-specific, never commit)
examples/output-*/
# Exported screenshots (temporary)
examples/*.png
# Exported ppts
examples/*.ppts
# Exported diagrams
examples/*.drawio
# Exported YAML files
examples/*.yaml
# Exported PDFfiles
examples/*.pdf
# Workspace / sandbox artifacts (never committed)
tmp/
.claude/scheduled_tasks.lock
.claude/worktrees/

View File

@@ -85,32 +85,39 @@ DEFINE (Ideate → Validate → Plan) → DESIGN (Current → Future → Confi
Phase details in `docs/` — skill references them via progressive disclosure.
## Environment Setup (MANDATORY before running tools)
```bash
make venv && source .venv/bin/activate
```
The Makefile auto-detects the best available Python (3.12 > 3.11 > 3.10 > python3).
**Always use `make <target>` to run tools.** For custom specs, activate the venv first.
### Codex sandbox note
This project ships `.codex/config.toml` which enables `network_access = true`
for the workspace-write sandbox. This is required so `make venv` can reach
PyPI. If you see `No matching distribution found for pyyaml`, the config file
is missing or Codex is ignoring it — re-open the project from its root so
Codex loads `.codex/config.toml`.
## Running Tools
```bash
# Generate slide deck (default output)
# Standard targets (recommended)
make deck # slide deck with sample spec
make diagram # architecture diagram
make full # all outputs (pptx + drawio + docx + xlsx + pdf)
make validate # WA validation
make lint # check YAML syntax
make venv # create/update virtual environment
# Custom specs (activate venv first)
python tools/oci_deck_gen.py --spec examples/proposal-spec.yaml --output proposal.pptx
# Generate customer-facing PDF (branded, no internal KB refs)
python tools/oci_pdf_gen.py --spec examples/proposal-spec.yaml --output proposal.pdf
# Generate diagram
python tools/oci_diagram_gen.py --spec examples/diagram-spec.yaml --output arch.drawio
# Run WA validation
python scripts/validate-architecture.py \
--profile examples/sample-workload-profile.yaml \
--architecture examples/sample-architecture.yaml \
--output scorecard.yaml
# Output orchestrator (multiple formats at once)
python tools/oci_output.py --spec examples/proposal-spec.yaml --format full --output-dir output/
# Build automation
make help # show all commands
make full # generate all outputs
make validate # run WA validation
make lint # check YAML syntax
```
## Output Formats
@@ -150,6 +157,32 @@ If a task generates YAML without the corresponding readable output, the task is
- **Readable outputs** — YAML is backing data, never the deliverable
- **No hallucinated architecture** — NEVER add services/components/regions the user didn't mention. When remediating WA gaps, apply minimum targeted fixes to the existing architecture; don't replace it with a generic "ideal" one. ASK before adding new services.
## Git Remotes (Gitea = source of truth, GitHub = mirror)
`origin` is configured with **one fetch URL (Gitea) and two push URLs (Gitea + GitHub)**, so a single `git push origin main` updates both. Gitea is authoritative; GitHub is a public mirror.
```
fetch → git.tech-lad.com.br/diegoecab/oci-deal-accelerator.git
push → git.tech-lad.com.br/diegoecab/oci-deal-accelerator.git
push → github.com/Diegoecab/oci-deal-accelerator.git
```
**Recreating this on a new clone** (the dual-push lives in `.git/config`, not tracked):
```bash
git remote set-url --add --push origin https://github.com/Diegoecab/oci-deal-accelerator.git
git remote set-url --add --push origin https://git.tech-lad.com.br/diegoecab/oci-deal-accelerator.git
git remote -v # confirm one fetch + two push URLs
```
The first command substitutes the implicit Gitea push URL with GitHub's; the second re-adds Gitea so origin pushes to BOTH. Counter-intuitive but necessary.
**Agent guidance**:
- After creating a commit on `main`, **always propose `git push origin main`** (not separate pushes per remote) — it covers both. Confirm with the user before pushing (pushing is shared-state).
- If a push fails on GitHub but succeeds on Gitea (or vice versa), the dual-push is partial. Re-run after fixing the failing one — Gitea's second push will be a no-op fast-forward.
- Never force-push Gitea unless explicitly asked; force-pushing GitHub is acceptable when needed because GitHub is downstream.
- If history diverges between Gitea and GitHub (e.g. after a rebase), the recovery pattern is: temporarily strip the GitHub URL (`git remote set-url --delete --push origin <github-url>`), push Gitea fast-forward, add `github` as a standalone remote, force-push, then restore the dual-push.
## Welcome Flow
When the user starts a conversation without providing discovery notes or a specific request (e.g., a greeting or empty context), present the welcome message and capability menu defined in the skill's SKILL.md § Welcome Flow. Specifically:

136
CLAUDE.md
View File

@@ -37,7 +37,9 @@ AI skill aligned with Oracle ECAL framework (Define → Design → Deliver) that
│ │ ├── networking-basic.yaml
│ │ └── (dirs: database-ha/, database-dr/, networking-hub-spoke/, etc.)
│ ├── sizing/ # CPU conversion ratios, IOPS, scaling rules
│ ├── pricing/ # Simplified pricing for estimation
│ ├── pricing/ # Auto-refreshed from Oracle public pricing API
│ │ ├── oci-sku-catalog.yaml # 200+ OCI SKUs across 20 categories (BOM source of truth)
│ │ └── compute.yaml # Shape-level estimation pricing
│ ├── competitive/ # AWS/Azure/GCP service mapping
│ ├── well-architected/ # 5-pillar WA Framework checklists
│ ├── compatibility/ # Feature matrices (ADB, etc.)
@@ -47,7 +49,9 @@ AI skill aligned with Oracle ECAL framework (Define → Design → Deliver) that
│ ├── oci_deck_gen.py # .pptx slide deck generator (DEFAULT output)
│ ├── oci_pdf_gen.py # .pdf customer-facing document (branded, no internal refs)
│ ├── oci_diagram_gen.py # .drawio diagram generator
│ ├── oci_bom_gen.py # .xlsx Bill of Materials generator (SA tool)
│ ├── oci_output.py # Output orchestrator
│ ├── refresh_sku_catalog.py # SKU catalog refresh from Oracle pricing API
│ └── refresh_arch_catalog.py # Architecture Center catalog refresh tool
├── scripts/ # Validation and utilities
│ └── validate-architecture.py # WA validation engine
@@ -72,7 +76,8 @@ AI skill aligned with Oracle ECAL framework (Define → Design → Deliver) that
│ ├── handover-document.yaml # DELIVER: Implementation handover
│ ├── go-live-checklist.yaml # DELIVER: Pre-cutover verification
│ ├── success-criteria.yaml # DELIVER: Post go-live metrics
── lessons-learned.yaml # DELIVER: Engagement retrospective
── lessons-learned.yaml # DELIVER: Engagement retrospective
│ └── bom-spec.yaml # SA TOOL: BOM input spec template
├── codex/ # Codex setup guide (README only)
└── examples/ # Example specs and generated outputs
```
@@ -105,38 +110,44 @@ doc only ← technical doc without slides
deliver ← handover + go-live checklist + success criteria
```
## Running Tools
## Environment Setup
Before running ANY Python tool, ensure dependencies are installed:
```bash
# Generate slide deck (default output)
make venv && source .venv/bin/activate
```
The Makefile auto-detects the best available Python (3.12 > 3.11 > 3.10 > python3).
**Always use `make <target>` to run tools** — this guarantees the correct Python with all dependencies.
## Running Tools
Prefer `make` targets. For custom specs, activate the venv first (`source .venv/bin/activate`), then use `python`:
```bash
# Standard targets (recommended)
make deck # slide deck with sample spec
make diagram # architecture diagram
make full # all outputs (pptx + drawio + docx + xlsx + pdf)
make validate # WA validation
make lint # check YAML syntax
make venv # create/update virtual environment
make freshness # check KB freshness
# Custom specs (activate venv first)
python tools/oci_deck_gen.py --spec examples/proposal-spec.yaml --output proposal.pptx
# Generate customer-facing PDF (branded, no internal KB refs)
python tools/oci_pdf_gen.py --spec examples/proposal-spec.yaml --output proposal.pdf
python tools/oci_pdf_gen.py --spec examples/proposal-spec.yaml --output proposal.pdf --diagram arch.png
# Generate diagram
python tools/oci_bom_gen.py --spec examples/bom-spec.yaml --output customer-bom.xlsx
python tools/oci_diagram_gen.py --spec examples/diagram-spec.yaml --output arch.drawio
# Run WA validation
python scripts/validate-architecture.py \
--profile examples/sample-workload-profile.yaml \
--architecture examples/sample-architecture.yaml \
--output scorecard.yaml
# Output orchestrator (multiple formats at once)
python tools/oci_output.py --spec examples/proposal-spec.yaml --format full --output-dir output/
# Refresh Architecture Center catalog
python tools/refresh_arch_catalog.py --whats-new # crawl What's New pages
python tools/refresh_arch_catalog.py --url <url> # add single entry
# KB maintenance (activate venv first)
python tools/refresh_sku_catalog.py --refresh # update all prices
python tools/refresh_sku_catalog.py --refresh --diff # update + show changes
python tools/refresh_sku_catalog.py --validate # check for stale prices
python tools/refresh_arch_catalog.py --whats-new # crawl What's New pages
python tools/refresh_arch_catalog.py --validate # validate catalog
# Build automation
make help # show all commands
make full # generate all outputs
make validate # run WA validation
make lint # check YAML syntax
```
## Key Principles
@@ -148,12 +159,77 @@ make lint # check YAML syntax
- **KB is the moat** — field experience, not documentation regurgitation
- **ECAL-aligned** — Define → Design → Deliver with iterative checkpoints
## Git Remotes (Gitea = source of truth, GitHub = mirror)
`origin` is configured with **one fetch URL (Gitea) and two push URLs (Gitea + GitHub)**, so a single `git push origin main` updates both. Gitea is authoritative; GitHub is a public mirror.
```
fetch → git.tech-lad.com.br/diegoecab/oci-deal-accelerator.git
push → git.tech-lad.com.br/diegoecab/oci-deal-accelerator.git
push → github.com/Diegoecab/oci-deal-accelerator.git
```
**Recreating this on a new clone** (the dual-push lives in `.git/config`, not tracked):
```bash
git remote set-url --add --push origin https://github.com/Diegoecab/oci-deal-accelerator.git
git remote set-url --add --push origin https://git.tech-lad.com.br/diegoecab/oci-deal-accelerator.git
git remote -v # confirm one fetch + two push URLs
```
The first command substitutes the implicit Gitea push URL with GitHub's; the second re-adds Gitea so origin pushes to BOTH. Counter-intuitive but necessary.
**Agent guidance**:
- After creating a commit on `main`, **always propose `git push origin main`** (not separate pushes per remote) — it covers both. Confirm with the user before pushing (pushing is shared-state).
- If a push fails on GitHub but succeeds on Gitea (or vice versa), the dual-push is partial. Re-run after fixing the failing one — Gitea's second push will be a no-op fast-forward.
- Never force-push Gitea unless explicitly asked; force-pushing GitHub is acceptable when needed because GitHub is downstream.
- If history diverges between Gitea and GitHub (e.g. after a rebase), the recovery pattern is: temporarily strip the GitHub URL (`git remote set-url --delete --push origin <github-url>`), push Gitea fast-forward, add `github` as a standalone remote, force-push, then restore the dual-push.
## Coding Guidelines
### 1. Think Before Coding
Don't assume. Don't hide confusion. Surface tradeoffs.
- State your assumptions explicitly. If uncertain, ask.
- If multiple interpretations exist, present them — don't pick silently.
- If a simpler approach exists, say so. Push back when warranted.
- If something is unclear, stop. Name what's confusing. Ask.
### 2. Simplicity First
Minimum code that solves the problem. Nothing speculative.
- No features beyond what was asked.
- No abstractions for single-use code.
- No "flexibility" or "configurability" that wasn't requested.
- No error handling for impossible scenarios.
- If you write 200 lines and it could be 50, rewrite it.
### 3. Surgical Changes
Touch only what you must. Clean up only your own mess.
- Don't "improve" adjacent code, comments, or formatting.
- Don't refactor things that aren't broken.
- Match existing style, even if you'd do it differently.
- If you notice unrelated dead code, mention it — don't delete it.
- Remove imports/variables/functions that YOUR changes made unused.
- Every changed line should trace directly to the user's request.
### 4. Goal-Driven Execution
Define success criteria. Loop until verified.
- "Add validation" → write tests for invalid inputs, then make them pass.
- "Fix the bug" → write a test that reproduces it, then make it pass.
- "Refactor X" → ensure tests pass before and after.
- For multi-step tasks, state a brief plan with verification steps.
## Welcome Flow
When the user starts a conversation without providing discovery notes or a specific request (e.g., a greeting like "hola", "hey", or empty context), present the welcome message and capability menu defined in `SKILL.md` § Welcome Flow. Specifically:
When the user starts a conversation without providing discovery notes or a specific request (e.g., a greeting like "hola", "hey", or empty context):
1. Show the welcome banner and numbered capability menu from SKILL.md
2. Follow the behavior rules for each option (1-10)
3. After completing any task, offer the next-step menu (A-E)
**MANDATORY:** Use the `Read` tool to open `SKILL.md` and read the entire `## Welcome Flow` section **before** showing anything to the user. Reproduce the welcome banner and the 14-option capability menu **verbatim** from that file. Do NOT paraphrase, reorder, summarize, translate, or reconstruct the menu from memory, folder structure, or prior conversations. If `SKILL.md` cannot be read for any reason, tell the user instead of improvising a menu.
**Pre-flight check (also defined in SKILL.md):** Before showing the welcome message, run `make kb-check 2>/dev/null`. If `stale_count > 0`, follow the banner-and-prompt logic in SKILL.md § Welcome Flow → Pre-flight. If the tool errors, silently skip the banner — never block the user.
Then:
1. Show the welcome banner and numbered capability menu exactly as defined in SKILL.md (14 options across DESIGN & PROPOSE, VALIDATE & CHECK, STRATEGY & BUSINESS, KNOWLEDGE BASE, ECAL GOVERNANCE, SA TOOLS)
2. Follow the behavior rules in SKILL.md for each option (1-14)
3. After completing any task, offer the next-step menu (A-E) as defined in SKILL.md
4. If the user sends discovery notes directly, skip the menu and go straight to full proposal flow
5. If the user asks a specific question, skip the menu and answer directly

104
Makefile
View File

@@ -1,8 +1,15 @@
# OCI Deal Accelerator — Build Automation
.PHONY: help install test validate example diagram deck full clean lint codex-package update-icons
.PHONY: help install test validate example diagram deck full clean lint codex-package update-icons freshness freshness-refresh sync-skill sku-discover pptx-icons-refresh archcenter-benchmark-20 diagram-lookup diagram-validate-spec archcenter-descriptions-refresh diagram-spec-audit archcenter-smoke install-hooks archcenter-templates-refresh
PYTHON ?= python3.12
# Use venv if present, otherwise find best available python3
ifneq (,$(wildcard .venv/bin/python))
PYTHON ?= .venv/bin/python
else ifneq (,$(shell command -v python3.12 2>/dev/null))
PYTHON ?= python3.12
else
PYTHON ?= python3
endif
SPEC_DIR = examples
OUTPUT_DIR = examples/sample-output
@@ -10,7 +17,34 @@ help: ## Show this help
@grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | sort | \
awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-20s\033[0m %s\n", $$1, $$2}'
install: ## Install Python dependencies
VENV_PYTHON := $(shell command -v python3.12 2>/dev/null || command -v python3.11 2>/dev/null || command -v python3.10 2>/dev/null || echo python3)
venv: .venv/.deps-installed ## Create or update venv (idempotent — no-op if requirements.txt unchanged)
# Marker file pattern: the venv only rebuilds when requirements.txt is
# newer than the marker. A fresh `make venv` after a successful install
# is an instant no-op (was 1m53s on Codex sandboxes — every turn).
# To force a rebuild: `rm .venv/.deps-installed` (or `rm -rf .venv`).
.venv/.deps-installed: requirements.txt
@if [ ! -x .venv/bin/python ]; then \
echo "Using $(VENV_PYTHON) to create venv..."; \
$(VENV_PYTHON) -m venv .venv; \
fi
.venv/bin/pip install --upgrade pip
.venv/bin/pip install -r requirements.txt
@touch .venv/.deps-installed
@echo "Virtual environment ready. Run: source .venv/bin/activate"
@echo "Tip: run 'make install-hooks' once to enable the pre-commit"
@echo " hook that keeps SKILL.md in sync with the Codex copy."
install-hooks: ## Install repo-versioned git hooks (pre-commit auto-syncs SKILL.md)
@if [ ! -d .git ]; then echo "install-hooks: not a git repo"; exit 1; fi
git config core.hooksPath .githooks
@echo "install-hooks: core.hooksPath set to .githooks"
@echo " → pre-commit now auto-syncs .agents/skills/.../SKILL.md"
@echo " whenever SKILL.md is part of the staged change set."
install: ## Install Python dependencies (system-wide)
pip install -r requirements.txt
validate: ## Validate imports and configs
@@ -56,14 +90,74 @@ update-icons: ## Re-extract OCI icons after updating OCI Library.xml
$(PYTHON) tools/oci_icon_extractor.py
@echo "Updated kb/diagram/oci-icons.json from OCI Library.xml"
pptx-icons-refresh: ## Refresh bundled OCI_Icons.pptx asset + manifest/index for native PPTX diagrams
$(PYTHON) tools/refresh_pptx_icon_index.py
@echo "Updated kb/diagram/oci-pptx-icons-manifest.yaml and oci-pptx-icons-index.json"
archcenter-benchmark-20: ## Run 20-case Oracle Architecture Center native benchmark
$(PYTHON) tools/oci_archcenter_batch.py \
--limit 20 \
--threshold 0.82 \
--fidelity-threshold 0.90 \
--output-root examples/eval-2026-04-25-archcenter-native-20-v8
diagram-lookup: ## Find Architecture Center reference patterns. Usage: make diagram-lookup QUERY="mysql heatwave HA"
@if [ -z "$(QUERY)" ]; then echo "Usage: make diagram-lookup QUERY=\"<topology>\""; exit 1; fi
$(PYTHON) tools/archcenter_pattern_lookup.py "$(QUERY)" --top $${TOP:-5}
diagram-validate-spec: ## Validate a diagram spec's geometry. Usage: make diagram-validate-spec SPEC=path/to/spec.yaml
@if [ -z "$(SPEC)" ]; then echo "Usage: make diagram-validate-spec SPEC=<path>"; exit 1; fi
$(PYTHON) tools/diagram_spec_validator.py --spec "$(SPEC)" --strict
diagram-spec-audit: ## Run spec validator across every diagram-spec in examples/, print pass/fail summary
@echo "Auditing diagram specs under examples/..."
@total=0; failed=0; \
for f in $$(find examples -name 'diagram-spec.yaml' -o -name '*-diagram-spec.yaml'); do \
total=$$((total+1)); \
$(PYTHON) tools/diagram_spec_validator.py --spec "$$f" --strict >/dev/null 2>&1 || { \
failed=$$((failed+1)); echo " FAIL $$f"; \
}; \
done; \
echo "Audited $$total spec(s); $$failed failed."
archcenter-descriptions-refresh: ## Re-fetch _description.md for every Architecture Center entry
$(PYTHON) tools/archcenter_description_fetcher.py --limit 200 --sleep 0.5
archcenter-templates-refresh: ## Extract absolute_layout YAML scaffolds from every cached .drawio
$(PYTHON) tools/archcenter_drawio_to_template.py
archcenter-smoke: ## 3-case Architecture Center reconstruction smoke test (CI-friendly)
$(PYTHON) tools/oci_archcenter_batch.py \
--limit 3 \
--threshold 0.78 \
--fidelity-threshold 0.85 \
--output-root tmp/archcenter-smoke
clean: ## Remove generated output files
rm -f examples/sample-output/*.drawio
rm -f examples/sample-output/*.pptx
rm -f examples/sample-output/*.xlsx
rm -f examples/sample-output/*.docx
lint: ## Check YAML files for syntax errors
lint: ## Check YAML files for syntax errors and validate SKILL.md sync
@echo "Checking YAML files..."
@find kb/ config/ examples/ -name '*.yaml' -exec $(PYTHON) -c \
"import yaml, sys; yaml.safe_load(open(sys.argv[1]))" {} \; \
"import yaml, sys; list(yaml.safe_load_all(open(sys.argv[1])))" {} \; \
-print 2>&1 | grep -v "^$$" || echo "All YAML files valid."
@echo "Checking SKILL.md sync..."
@$(PYTHON) scripts/sync-skill.py --check
sync-skill: ## Regenerate .agents/skills/oci-deal-accelerator/SKILL.md from root SKILL.md
@$(PYTHON) scripts/sync-skill.py
freshness: ## Report stale KB files (informational, never fails)
-@$(PYTHON) tools/kb_freshness.py --check
kb-check: ## KB freshness JSON (used by skill welcome-flow pre-flight)
@$(PYTHON) tools/kb_freshness.py --check --json
freshness-refresh: ## Run refresh tools for stale KB files that support automation
@$(PYTHON) tools/kb_freshness.py --auto-refresh
sku-discover: ## Report SKUs present in Oracle API but missing from oci-sku-catalog.yaml
@$(PYTHON) tools/refresh_sku_catalog.py --discover

214
README.md
View File

@@ -11,9 +11,47 @@ What normally takes an SA days of work (structuring notes, designing architectur
- **ECAL 3.1 native** — engagement RACI, artefact catalog, readiness scoring, and lessons learned per step baked into the workflow
- **Field knowledge, beyond the docs** — built-in KB with real gotchas, workarounds, and sizing lessons from production OCI deployments
- **Honest about trade-offs** — flags OCI limitations and competitive gaps instead of overselling
- **Multi-cloud aware** — supports hybrid/multi-cloud diagrams (AWS, Azure, GCP icons) and considers options like ADB Multicloud before recommending full migration
- **Multi-cloud aware** — supports hybrid/multi-cloud diagrams (AWS, Azure, GCP, plus external brand icons such as Slack and Jira) and considers options like ADB Multicloud before recommending full migration
- **MCP-tolerant inputs** — deck, diagram, BOM, and business-case generators accept flat MCP payloads and common field aliases instead of requiring one rigid schema
- **End-to-end coverage** — from discovery notes to go-live checklist, not just the architecture slide
## New user? Start here
The skill runs as a hosted MCP server. Connect once from your LLM client, sign in with Oracle SSO, and the tools are ready.
Fastest path: open AI Factory Hub at `https://ai-lad.com/`, search for `OCI Deal Accelerator`, and install it from there. If you prefer manual setup, use the MCP client instructions below.
**1. Add the MCP server to your client (manual setup):**
| Client | How |
|---|---|
| **Claude Code** | `claude mcp add --transport http oci-deal-accelerator "https://mcp.tech-lad.com/deal-accelerator/mcp/"` |
| **Codex** | `codex mcp add oci-deal-accelerator --url "https://mcp.tech-lad.com/deal-accelerator/mcp/"` |
| **Cursor** | Settings (Ctrl+Shift+J) → MCP → Add new MCP server → Name: `oci-deal-accelerator`, Type: `streamable-http`, URL: `https://mcp.tech-lad.com/deal-accelerator/mcp/` |
| **Claude Desktop** | Add to `claude_desktop_config.json`: `{ "mcpServers": { "oci-deal-accelerator": { "transport": "http", "url": "https://mcp.tech-lad.com/deal-accelerator/mcp/" } } }` |
| **Windsurf** | Settings → Cascade → MCP → Manual config: `{ "oci-deal-accelerator": { "serverUrl": "https://mcp.tech-lad.com/deal-accelerator/sse/" } }` |
**2. Trigger the connection** — type `/mcp` in Claude Code or Codex, or open any tool in Cursor / Claude Desktop / Windsurf. Your browser opens automatically.
**3. Pick one of two options in the browser:**
- **Sign in with Oracle SSO** — for existing users
- **Create a new account** — for new users (see step 4)
**4. New users — create an account** by clicking "Create a new account". This opens an OCI self-registration form (oracle.com emails only). Tips:
- Use your full Oracle email as User ID (e.g. `name@oracle.com`)
- Password must be 12+ chars, with an uppercase letter, a number, and a special character
- Password must NOT contain your name or username
**5. Verify your email**, then return to the browser and click **Sign in with Oracle SSO**.
**6. Done.** The MCP tools are now available in your client.
### Connection URLs
- **AI Factory Hub:** `https://ai-lad.com/`
- **MCP (HTTP streamable):** `https://mcp.tech-lad.com/deal-accelerator/mcp/`
- **SSE (Windsurf only):** `https://mcp.tech-lad.com/deal-accelerator/sse/`
## What It Produces
From unstructured input (meeting notes, emails, Slack threads), the skill generates:
@@ -27,10 +65,12 @@ From unstructured input (meeting notes, emails, Slack threads), the skill genera
| **Business Case** — TCO, ROI, value drivers, risk assessment | .pptx | Define | Ideate |
| **Joint Engagement Plan** — scope, resources, timeline | YAML | Define | Plan |
| **Discovery Questionnaire** — structured IT landscape collection | YAML | Design | Current |
| **Architecture Diagram**official Oracle visual style, multi-cloud support | .drawio | Design | Future |
| **Architecture Diagram**Oracle reference-architecture geometry, multi-cloud + external brand support | .drawio / .pptx | Design | Future |
| **Slide Deck** — 6-15 slides scaled to engagement complexity | .pptx | Design | Confirm |
| **Customer PDF** — branded, no internal KB references | .pdf | Design | Confirm |
| **Cost Estimate** — BYOL vs PAYG breakdown with assumptions | YAML | Design | Future |
| **Bill of Materials (BOM)** — requested SKUs only, formula-driven totals, discount-aware workbook | .xlsx | Design | Future |
| **AppCA-ready BOM** — AppCA import sheet plus full BOM workbook detail | .xlsx | Design | Future |
| **Well-Architected Scorecard** — 5-pillar automated validation | YAML | Design | Future |
| **Operations Model** — day-2 monitoring, patching, incident response | YAML | Design | Future |
| **ECAL Readiness Scorecard** — 60-artefact gap analysis per phase | Text | All | All |
@@ -66,9 +106,40 @@ deck + pdf ← + customer-facing PDF (branded, no internal refs)
pdf ← customer PDF only
bizcase ← business case deck for customer approval
full ← everything (pptx + drawio + docx + xlsx + pdf)
bom ← bill of materials (.xlsx)
deliver ← handover + go-live checklist + success criteria
```
Standalone architecture diagrams can be generated as editable `.drawio` files or as native Oracle-style `.pptx` diagrams/slides, depending on the workflow you trigger.
## Example Prompts
These copy/paste prompts are good demo asks for the newest user-visible features, especially when using Codex or another MCP client.
### Native PowerPoint diagram (.pptx)
```text
Generame un diagrama nativo en .pptx, simple y prolijo, de esta arquitectura: usuarios externos -> load balancer público -> 2 VMs de aplicación en subnet privada -> Autonomous Database Serverless. Quiero que quede presentable para mostrar directo en PowerPoint. No me pidas YAML ni setup adicional.
```
### Brand icons + OIC + dual output
```text
Generate a simple high-level integration diagram for this flow: Slack -> Oracle Integration Cloud (OIC) -> Jira Service Management -> My Oracle Support. Add clear Client, Oracle, and External layers. Use brand icons for Slack and Jira Service Management, and deliver both .drawio and .pptx.
```
### Real multicloud topology
```text
Generate a high-level architecture diagram for this scenario: 1 PostgreSQL in OCI Ashburn, accessed from GCP Virginia through interconnect. PostgreSQL connects internally to 1 Autonomous Database Serverless, which also has 1 refreshable clone in the same region but in a different AD. Deliver both .drawio and .pptx. Keep it simple, executive-friendly, and technically correct.
```
### Discount-aware BOM
```text
Gere um BOM em USD para este cenário: PostgreSQL no OCI com 4 OCPU e 500 GB, ADB-S com 200 ECPU e 1 TB BYOL, 1 refreshable clone com o mesmo sizing e FastConnect de 1 Gbps. Aplique 11% de desconto, 12 meses, 24 horas por dia. Quero o arquivo .xlsx e um resumo claro do custo mensal e anual.
```
## Knowledge Base
The KB is the moat — field experience, not documentation regurgitation.
@@ -86,31 +157,27 @@ Any SA can contribute knowledge to the skill. The KB lives in `kb/` as editable
| **OCI service info** | `kb/services/<service>.yaml` | Create or edit the service YAML |
| **Architecture pattern** | `kb/patterns/` | Add YAML following existing format |
| **Architecture Center reference** | `kb/architecture-center/catalog.yaml` | `python tools/refresh_arch_catalog.py --url <url>` |
| **Updated pricing** | `kb/pricing/<category>.yaml` | Edit with data from [OCI Price List](https://www.oracle.com/cloud/price-list/) |
| **Updated pricing** | `kb/pricing/oci-sku-catalog.yaml` (SKUs) or `kb/pricing/compute.yaml` (shapes) | `python tools/refresh_sku_catalog.py --refresh` (SKUs) or `--refresh-domain compute` (shapes). Both auto-pull from the Oracle public pricing API. |
| **Feature compatibility** | `kb/compatibility/adb-feature-matrix.yaml` | Edit the matrix, mark `verified_in_field: true` |
| **Competitive comparison** | `kb/competitive/` | Add or edit YAML with real pros AND cons |
**Fastest path**: if you hit something in an engagement that another SA should know about, use menu option 11 (Report a field finding) — the skill walks you through the format and adds it to the tracker automatically.
### OCI Pricing (13 categories)
### OCI Pricing
Comprehensive pricing from the [OCI Price List](https://www.oracle.com/cloud/price-list/) covering compute, database, storage, networking, AI/ML, containers, integration, observability, developer, analytics, hybrid/VMware, and security services. Source date: 2025-09-11.
All pricing is auto-refreshed from the [Oracle public pricing API](https://apexapps.oracle.com/pls/apex/cetools/api/v1/products/?currencyCode=USD). No manually maintained pricing files.
```
kb/pricing/
├── compute.yaml # VMs, bare metal, GPU (B200/B300/H200/H100/A100/L40S)
├── database.yaml # ADB (ECPU), DBCS, ExaCS, MySQL, PostgreSQL, NoSQL, Redis
── storage.yaml # Block, object, file, data transfer
├── networking.yaml # LB, NLB, FastConnect, DNS, egress
├── ai-ml.yaml # GenAI, Data Science, Vision, Speech, Digital Assistant
├── containers-serverless.yaml # OKE, Functions, Container Instances
├── integration.yaml # OIC, API Mgmt, Streaming, Queue, GoldenGate
├── observability.yaml # Monitoring, Logging, APM, DR, Email
├── developer.yaml # APEX, Visual Builder, DevOps, Blockchain
├── analytics.yaml # OAC, Essbase, Big Data, Data Flow
├── hybrid-vmware.yaml # OCVS, Compute C@C, Managed Mac, Roving Edge
├── security.yaml # Access Governance, Vault, Cloud Guard
└── pricing-models.yaml # PAYG, UCM, Reserved, BYOL
├── oci-sku-catalog.yaml # 200+ SKUs across 20 categories — single source of truth
│ Refresh: python tools/refresh_sku_catalog.py --refresh
── compute.yaml # Shape-level estimation pricing (VMs, BM, GPU)
Refresh: python tools/refresh_sku_catalog.py --refresh-domain compute
kb/field-knowledge/pricing-knowledge.yaml
# Stable pricing context: billing models, BYOL rules,
free tiers, service nuances, hyperscaler comparisons.
Non-numeric — no refresh needed.
```
### DBExpert Database Services Catalog
@@ -124,7 +191,13 @@ kb/services/dbexpert-api-reference.yaml # API endpoints and refresh procedure
### Architecture Center Catalog
**123 Oracle Architecture Center reference architectures** (`kb/architecture-center/catalog.yaml`) covering Database@Azure/AWS/Google Cloud, networking, security, AI/ML, migration, HA/DR, and more.
**123 Oracle Architecture Center reference architectures** (`kb/architecture-center/catalog.yaml`) covering Database@Azure/AWS/Google Cloud, networking, security, AI/ML, migration, HA/DR, and more. Each entry includes title, URL, tags, services, and a 1-line summary; **121 also have a cached `_description.md`** with the full "About this architecture" text fetched from docs.oracle.com.
Cached locally under `kb/diagram/assets/archcenter-refs/<slug>/`:
- `_description.md` — Oracle's architecture rationale (used by both the lookup tool and SKILL.md option 10 "Reference architecture lookup")
- `*.drawio` — official editable source for ~110 references (where Oracle ships a zip)
- `_template.yaml` — extracted `absolute_layout` scaffold so new diagrams can start from Oracle geometry instead of from scratch
- `*.svg` / `*.png` — raster fallback for the rest
During **Phase 2 (DESIGN)**, the skill automatically matches the proposed architecture against the catalog:
@@ -135,6 +208,47 @@ During **Phase 2 (DESIGN)**, the skill automatically matches the proposed archit
python tools/refresh_arch_catalog.py --whats-new # crawl What's New pages
python tools/refresh_arch_catalog.py --url <url> # add a single entry
python tools/refresh_arch_catalog.py --validate # validate catalog integrity
python tools/refresh_arch_catalog.py --check-links # check for broken URLs (404s, redirects)
# Topology lookup — base your diagram on the closest Oracle reference
python tools/archcenter_pattern_lookup.py "mysql heatwave high availability load balancer"
python tools/archcenter_pattern_lookup.py "fastconnect exacs cross region" --top 10
# Re-fetch description text after a catalog refresh
python tools/archcenter_description_fetcher.py --limit 200
# Re-download cached drawio/svg/png assets after a catalog refresh
python tools/archcenter_zip_downloader.py # idempotent; skips slugs whose folder already has a .drawio
```
The cached assets under `kb/diagram/assets/archcenter-refs/` (~83MB) are committed so the skill works offline. Lookup uses a local index for near-instant matches, and can be rebuilt manually when needed. Refresh quarterly or when `refresh_arch_catalog.py --whats-new` adds entries — both downloader and description fetcher are idempotent and only fetch what's missing.
### KB Health & Freshness
The KB is automatically monitored for staleness and broken links:
| Check | How | When |
|---|---|---|
| **Broken links** | `python tools/refresh_arch_catalog.py --check-links` | Weekly (CI), or on demand |
| **Stale prices** | `python tools/refresh_sku_catalog.py --validate` | Weekly (CI), or on demand |
| **KB freshness** | `python tools/kb_freshness.py --check` | On skill startup (pre-flight) |
| **Diagram spec geometry** | `python tools/diagram_spec_validator.py --spec <spec.yaml>` | Auto, before every drawio/PPTX render |
| **Diagram XML output** | `python tools/drawio_visual_validator.py <file.drawio>` | Auto, after `oci_diagram_gen.py` saves |
**Automated CI/CD:**
- **Deploy workflow** (`.gitea/workflows/deploy.yaml`) — auto-deploys to MCP server on every push to `main`
- **KB health workflow** (`.gitea/workflows/kb-health.yaml`) — runs every Monday 8am UTC, checks all catalog URLs and SKU freshness, reports broken links as artifacts
To run KB health manually:
```bash
# Check all 123 Architecture Center URLs for 404s
python tools/refresh_arch_catalog.py --check-links
# Fix broken links: re-crawl What's New for updated URLs
python tools/refresh_arch_catalog.py --whats-new
# Refresh stale pricing from Oracle API
python tools/refresh_sku_catalog.py --refresh --diff
```
### Feature Compatibility Matrix
@@ -225,8 +339,11 @@ Option 8 in the menu generates a business case deck for customer internal approv
| Cover | Dark - Title_Pillar | Customer name + subtitle |
| Executive Summary | Impact Statement | Bold 1-sentence opportunity |
| Business Drivers | Multi Statement | 3 key drivers: Why now |
| TCO Comparison | Blank + Table | Current vs OCI (3-5 year) |
| ROI Headline | Blank + Metric | Big number (e.g., "2080% ROI") |
| TCO Comparison | Blank + Table | Current/as-is run-rate vs target/to-be run-rate |
| BOM + Operations Breakdown | Blank + Tables | Cloud services, storage/infra, GoldenGate, operations, one-time bridge |
| Forecasted TCO | Blank + Table | 24M/36M annual run-rate snapshots, not cumulative totals |
| TCO Crossover | Native shapes | ADB-S vs ADB-D annual TCO and first cheaper period |
| Business Value Model | Blank + Table | Financial baseline, architecture benefit, risk-adjusted value, KPIs |
| Value Drivers | Blank + Cards | 4 categories: Cost, Risk, Agility, Innovation |
| Risk Assessment | Blank + 2-Column | Migration risks vs Do-nothing risks |
| Roadmap | Blank + Timeline | Implementation phases |
@@ -234,6 +351,12 @@ Option 8 in the menu generates a business case deck for customer internal approv
Uses the **Oracle FY26 official PowerPoint template** with Redwood design system.
For ADB-S to ADB-D cases, the generator keeps workload ECPU demand separate
from ADB-D physical capacity. Dedicated footprint is modeled as fixed DB server
and storage server infrastructure; projected BOMs are annual run-rate snapshots
at the horizon. Risk-reduction value is converted to USD only when the customer
provides business impact per degraded/outage hour.
```bash
python tools/oci_bizcase_gen.py --spec business-case.yaml --output business-case.pptx
```
@@ -286,6 +409,8 @@ If you paste discovery notes directly, the skill skips the menu and goes straigh
## Tools
All major generators accept either the canonical nested YAML specs or the flatter MCP payload aliases used by hosted clients.
```bash
# Slide deck generation (technical proposal)
python tools/oci_deck_gen.py --spec examples/proposal-spec.yaml --output proposal.pptx
@@ -297,15 +422,36 @@ python tools/oci_pdf_gen.py --spec examples/proposal-spec.yaml --output proposal
# Business case deck
python tools/oci_bizcase_gen.py --spec business-case.yaml --output business-case.pptx
# Architecture diagram
python tools/oci_diagram_gen.py --spec examples/diagram-spec.yaml --output arch.drawio
# Architecture diagram — see docs/skill/output-formats.md
# § "Standard diagram-generation procedure (MANDATORY)" for the full
# workflow: ref-arch lookup → pre-generation review → spec authoring
# → automatic spec validator → render → visual verification.
# Supports OCI fallback aliases for services whose official toolkit icons
# are still missing (for example PostgreSQL/Redis) plus `brand_icon` for
# third-party systems such as Slack and Jira in both drawio and PPTX.
python tools/archcenter_pattern_lookup.py "<topology keywords>" # 1. find canonical Oracle reference
python tools/oci_diagram_gen.py --spec examples/diagram-spec.yaml --output arch.drawio # 2. render (validators run automatically)
python tools/oci_pptx_render.py --pptx arch.pptx --output arch.png --width 1600 # 3. rasterize PPTX for visual review
# Pre-render geometry validator (auto-invoked by both renderers; CLI for ad-hoc spec checks)
python tools/diagram_spec_validator.py --spec examples/diagram-spec.yaml --strict
# Post-render XML validator (auto-invoked inside OCIDiagramGenerator.save())
python tools/drawio_visual_validator.py arch.drawio
# Output orchestrator (multiple formats at once)
python tools/oci_output.py --spec examples/proposal-spec.yaml --format full --output-dir output/
python tools/oci_output.py --spec examples/exacs-bom-spec.yaml --format bom --output-dir output/
# BOM / AppCA workbook
python tools/oci_bom_gen.py --spec examples/exacs-bom-spec.yaml --output customer-bom.xlsx
python tools/oci_bom_gen.py --spec examples/exacs-bom-spec.yaml --output customer-appca.xlsx --appca
# Architecture Center catalog
python tools/refresh_arch_catalog.py --validate
python tools/refresh_arch_catalog.py --whats-new
python tools/refresh_arch_catalog.py --check-links
python tools/archcenter_pattern_lookup.py "adb gcp fastconnect" --rebuild-index
# Feature compatibility
python tools/feature_matrix_cli.py check "Auto Scaling" adb_s 23ai
@@ -364,6 +510,28 @@ For temporary overrides (e.g., focusing on a specific customer), create `AGENTS.
Full setup details: [`codex/README.md`](codex/README.md)
#### Keeping the Claude and Codex skills in sync
The root `SKILL.md` (read by Claude Code) and `.agents/skills/oci-deal-accelerator/SKILL.md` (read by Codex) MUST stay byte-aligned modulo an auto-generated banner. If they drift, the two agents give the user different instructions.
Three layers of defense, run from least to most enforcement:
1. **Local pre-commit hook (recommended once per clone):**
```bash
make install-hooks
```
Sets `core.hooksPath = .githooks`. From then on, any commit that touches `SKILL.md` auto-runs `scripts/sync-skill.py` and stages the regenerated `.agents/` copy in the same commit. No manual step required.
2. **Manual sync (anytime):**
```bash
make sync-skill # write the .agents/ copy from SKILL.md
make lint # check (also runs sync --check)
```
3. **CI gate (`.gitea/workflows/skill-sync.yaml`):** every push/PR runs `python scripts/sync-skill.py --check` and fails the build if the two files have drifted. Catches anyone who skipped the hook.
**Direction is always root → `.agents/`.** The `.agents/` copy is auto-generated; do NOT edit it directly — the next sync will silently overwrite your changes. Both the local pre-commit hook and the CI gate REJECT a commit/PR that stages `.agents/skills/oci-deal-accelerator/SKILL.md` without a matching root `SKILL.md` change. If you find yourself wanting to tweak the Codex side specifically, that signal belongs in `AGENTS.md` (Codex-only project instructions) — `SKILL.md` content stays unified across both agents.
## Roadmap
### ECAL Completeness (see `docs/ecal-gaps-backlog.md` for full list)

540
SKILL.md
View File

@@ -1,5 +1,5 @@
---
name: OCI Deal Accelerator
name: oci-deal-accelerator
description: Compresses the OCI Solutions Architect's cycle from customer discovery to architecture proposal and delivery handover. Aligned with Oracle ECAL framework (Define, Design, Deliver). Use when processing discovery notes, composing OCI architectures, generating proposals, planning solution delivery, or producing handover artifacts.
---
@@ -15,6 +15,55 @@ You follow the **Oracle ECAL framework** (Define → Design → Deliver) to prod
When the user starts a conversation without providing discovery notes or a specific request, present the welcome message and capability menu.
### Pre-flight checks
Run these checks silently **before** showing the welcome message. **CRITICAL:** Never show command execution, tool output, or errors to the user. If any check fails, silently skip it and proceed to the welcome message. These checks are informational — they NEVER block the user.
#### Check 1: KB changelog banner
Read the file `kb/CHANGELOG.md` and extract the **most recent date and first bullet point**. If the file exists and has entries, prepend a one-line banner above the welcome message:
```
📢 KB updated (<date>): <first bullet summary>
```
Example: `📢 KB updated (Apr 14): Diagram generator calibrated from 37 Oracle ref architectures`
If the file is missing or empty, skip — no banner.
#### Check 2: Local repo updates (git users only)
Run `git fetch --dry-run origin main 2>/dev/null`. If the output contains any text (meaning there are remote commits not yet pulled), prepend this banner:
```
📢 KB updates available — run `git pull` to get latest prices and fixes.
```
If the command fails (not a git repo, no network, MCP deployment), silently skip. This check is only relevant for users running the skill from a local git clone.
#### Check 3: KB freshness
Run `make kb-check 2>/dev/null` and parse the JSON output. Behavior:
- **`stale_count == 0`** → no banner.
- **`stale_count > 0` and at least one file has `refreshable: true`** → prepend banner and ask inline:
```
⚠️ KB freshness: <N> file(s) outdated (oldest: <file> — <age_days>d).
<M> can be auto-refreshed. Refresh now? [y/N]
```
- `y` / `yes` / `` → run `make freshness-refresh`, then show menu.
- Anything else → show menu with one-line reminder: `⚠️ <N> KB file(s) stale — run make freshness-refresh later.`
- **`stale_count > 0` but no `refreshable: true`** → non-blocking info banner, then show menu directly:
```
⚠️ KB freshness: <N> file(s) need manual review (oldest: <file> — <age_days>d).
```
If `make kb-check` errors out (exit ≠ 0, missing make, missing Python, missing tool), **silently skip** — no error output, no banner, no mention of failure.
### Welcome Message
```
@@ -34,10 +83,10 @@ Present these options as a compact numbered list. Each option has a bold title f
```
DESIGN & PROPOSE
─────────────────
1. 📋 Full proposal — *notes → architecture + deck + diagram + costs*
2. 📐 Architecture diagram — *YAML or description → .drawio*
3. 📊 Slide deck — *architecture → .pptx*
4. 💰 Cost estimate — *services + sizing → PAYG vs BYOL*
1. 📋 Full proposal — *notes → architecture + deck + native PPTX diagram + costs*
2. 📐 Architecture diagram — *description/sketch → .excalidraw → .drawio or native PPTX*
3. 📊 Slide deck — *architecture → .pptx with native OCI diagram*
4. 💰 Cost estimate — *quick PAYG/BYOL comparison while you scope (terminal + optional deck)*
VALIDATE & CHECK
─────────────────
@@ -59,16 +108,80 @@ Present these options as a compact numbered list. Each option has a bold title f
─────────────────
12. 📊 ECAL readiness score — *60-artefact gap analysis*
SA TOOLS
─────────────────
13. 📦 BOM generator — *formal .xlsx artefact you send to the customer*
14. 📤 BOM for AppCA — *BOM → .xlsx ready to import into AppCA*
━━━━━━━━━━━━━━━━━━━━━━━
Pick a number, or just describe what you need.
```
### Example Direct Requests
If the user asks for examples, or skips the menu and writes a natural-language request, prompts like these map directly to the capabilities above:
- `Generame un diagrama nativo en .pptx, simple y prolijo, de esta arquitectura: usuarios externos -> load balancer público -> 2 VMs de aplicación en subnet privada -> Autonomous Database Serverless. Quiero que quede presentable para mostrar directo en PowerPoint. No me pidas YAML ni setup adicional.`
- `Sketch this architecture first for Excalidraw: external users -> public load balancer -> private app VMs -> Autonomous Database. Give me a native .excalidraw file so I can review and collaborate before making the formal diagram.`
- `Generate a simple high-level integration diagram for this flow: Slack -> Oracle Integration Cloud (OIC) -> Jira Service Management -> My Oracle Support. Add clear Client, Oracle, and External layers. Use brand icons for Slack and Jira Service Management, and deliver both .drawio and .pptx.`
- `Generate a high-level architecture diagram for this scenario: 1 PostgreSQL in OCI Ashburn, accessed from GCP Virginia through interconnect. PostgreSQL connects internally to 1 Autonomous Database Serverless, which also has 1 refreshable clone in the same region but in a different AD. Deliver both .drawio and .pptx. Keep it simple, executive-friendly, and technically correct.`
- `Gere um BOM em USD para este cenário: PostgreSQL no OCI com 4 OCPU e 500 GB, ADB-S com 200 ECPU e 1 TB BYOL, 1 refreshable clone com o mesmo sizing e FastConnect de 1 Gbps. Aplique 11% de desconto, 12 meses, 24 horas por dia. Quero o arquivo .xlsx e um resumo claro do custo mensal e anual.`
### Behavior Rules
- If the user picks **1**, ask: "Paste your discovery notes (meeting notes, emails, whatever you have)."
- If the user picks **2**, ask: "Describe the architecture you want to diagram, or paste a YAML spec if you have one."
- If the user picks **3**, ask: "Describe the architecture or paste the spec. I'll generate the deck."
- If the user picks **4**, ask: "What services and sizing? (e.g., 'ADB-S 8 OCPU + 2 VMs + FastConnect')"
- If the user picks **2**, ask **two explicit questions** in one message and wait for both answers before doing anything else:
```
1. Describe the architecture you want to diagram (or paste a YAML spec if you have one).
2. Which output format(s) do you want? Pick one or more:
(a) sketch — native .excalidraw whiteboard draft for brainstorming
(b) .drawio — editable technical diagram
(c) .pptx — native Oracle-style PowerPoint diagram/slide
(d) sketch + .drawio
(e) sketch + .pptx
(f) all
```
If the user chooses **sketch only**, create a concise sketch spec and run `python tools/oci_excalidraw_gen.py --spec <sketch-spec.yaml> --output <output-dir>/architecture-sketch.excalidraw`. Save the generated `.excalidraw` file and companion `.md` instructions in the engagement output folder. Present the file list and the simple import/share workflow from the companion `.md` as the primary deliverable. Optionally save `architecture-sketch.mmd` as a secondary source when Mermaid is useful, but the native `.excalidraw` file is the draft artifact. Do not run the formal `absolute_layout` renderer unless the user asks to promote the sketch to `.drawio` or `.pptx`.
If the user chooses **sketch plus formal output**, produce the `.excalidraw` draft first and ask the user to confirm or adjust the intent before formal rendering. If the user explicitly says to generate all outputs without another checkpoint, generate the sketch and continue. If the user later uploads or references an edited `.excalidraw` from Excalidraw.com, treat it as visual discovery/reference input for the formal `.drawio` / `.pptx` flow; do not blindly convert its rough geometry into the final source of truth.
If the user provides an existing `.excalidraw` file and asks to convert it to `.drawio`, default to **Formal OCI diagram** unless they explicitly ask for a literal/whiteboard copy:
- **Hard rule:** do **not** hand-roll draw.io XML with inline Python for this path. Use the repo tools below. If `python` is not available, use `.venv/bin/python` or `python3`; do not fall back to a custom converter.
- **Formal OCI diagram (default)** — run `.venv/bin/python tools/excalidraw_to_oci_diagram.py --input <file.excalidraw> --output <output-dir>/<name>-oci.drawio --spec-output <output-dir>/<name>-oci.yaml`. This extracts the approved sketch intent, writes `*-analysis.yaml` and `*-review.md`, generates an `absolute_layout` YAML, then renders a new Oracle-style `.drawio` through `oci_diagram_gen.py` with OCI containers, icons, connector styles, and validators. For complex sketches (multicloud, hub-spoke, migration/cutover, cross-region DR, multiple regions/VCNs), run the same command with `--mode review` first, inspect/refine the generated analysis/spec, then render.
- **Literal sketch conversion (secondary)** — run `.venv/bin/python tools/excalidraw_to_drawio.py --input <file.excalidraw> --output <output-dir>/<name>-literal.drawio` only when the user asks to preserve the exact whiteboard look. This is an editable bridge artifact and does **not** infer OCI icons/services.
- **Both** — produce the formal OCI `.drawio` first, then the literal bridge if useful for comparison.
For any `.drawio` or `.pptx` output, **follow these steps in order — do NOT skip step 1**:
1. **Reference-architecture lookup.** Run `python tools/archcenter_pattern_lookup.py "<topology keywords>"` against `kb/architecture-center/catalog.yaml` (123 Oracle-curated entries with cached `.drawio` / `_description.md` / `_template.yaml` under `kb/diagram/assets/archcenter-refs/`). Pick the highest-scoring entry whose topology matches.
- **The cached `_template.yaml` is your YAML SCAFFOLD** — auto-extracted from the canonical `.drawio` by `tools/archcenter_drawio_to_template.py`. It carries Oracle's container geometry (region/vcn/ad/subnet bboxes), service positions, and edge waypoints in the `absolute_layout:` shape your spec uses. Copy it as the starting point, rename ids, fill in `type:` for services (the extractor leaves `type: TODO_identify` because the canonical icon TYPE is encoded in stencil bytes — pick the right alias from the renderer's TYPE_TO_ICON), and adapt to the customer's components. Lookup result surfaces it as `cached: yaml=<path>`.
- **The cached `.drawio` is the visual source of truth** if the template extractor missed something — open it (drawio.exe, the SVG companion, or the XML) for the canonical look.
- **Migration/cutover + multicloud templates.** Also check `kb/diagram/templates/catalog.yaml`. Use `renderable_templates` when the user asks for an operational cutover/runbook view (for example ADB-S → ADB-D with OGG forward/reverse replication) instead of a canonical steady-state Architecture Center topology.
- **Do NOT use `examples/` as a geometry source.** `examples/` is previous user output, not authoritative. The `_template.yaml` covers everything `examples/` was being abused for.
- **Lookup budget: max 2 queries — never loop.** If query 1 returns nothing convincing, run ONE refinement (broader phrasing or different keyword angle), then STOP. Re-querying the catalog 3+ times to find a "better" match is the dominant time-sink in this phase — the catalog has 123 entries indexed once; if two passes can't surface a topology match, none exists. Output of the lookup tool also surfaces a **`⚠ KNOWN GAP`** banner at the top whenever the query touches a documented gap (e.g. OCI-native services accessed FROM GCP via Cross-Cloud Interconnect, or OCI Cache/Redis/PostgreSQL as primary subject). When that banner appears, follow its **Recommended composition** verbatim instead of running more queries — it lists the primitives to combine. When NO gap banner appears AND no top-3 entry matches the topology, present the closest 3 to the user with: *"No exact ref-arch matches. Closest hits are X / Y / Z. I can either base the diagram on the closest of these (geometry transfers, service names don't), or compose from `<list specific slugs / patterns>`. Which?"* — let the user pick the chassis instead of guessing.
2. **Pre-generation review.** Confirm the component list with the user (REQUESTED + TECHNICAL DEPENDENCIES per the whitelist).
3. **Author the spec in `absolute_layout` shape** — this is REQUIRED. Do NOT use the legacy workload-driven shape (`tenancy → regions → compartments → services`); it does not resolve OCI icon stencils, does not run through the spec validator, and produces wireframe-looking output (rectangles with text instead of real OCI icons). Every container, service, label, and connection needs explicit `(x, y, w, h)`.
**Where to look up valid `type:` values for services:** the authoritative sources are (1) `TYPE_TO_ICON` in `tools/oci_pptx_diagram_gen.py` (PPTX path) and `ICON_TYPE_ALIASES` in `tools/oci_diagram_gen.py` (drawio path), and (2) the slug keys in `kb/diagram/oci-icons.json` (drawio) and `kb/diagram/oci-pptx-icons-index.json` (PPTX). Do NOT grep `examples/` for `type:` patterns to discover valid slugs — `examples/` are previous user outputs that may use stale or non-canonical slugs. Both renderer files and both index files are exhaustive and current.
**Newer OCI services without a toolkit icon** (OCI Cache with Redis / Valkey, OCI PostgreSQL, etc. — services GA after the v24.2 toolkit shipped): use the generic icon as the canonical fallback (Oracle's own ref archs do the same — they embed custom inline SVG over the generic icon). The renderer's alias tables already route `type: redis` / `cache` / `valkey` / `postgresql` to the generic `database` stencil. Pair with an explicit `label:` carrying the real service name (e.g. `label: "OCI Cache (Redis)"`). When Oracle ships a v25+ toolkit with these icons, update `kb/diagram/oci-icons.json` + the alias tables and the next render uses the real icon automatically.
4. **Spec validator runs automatically** before either renderer (`tools/diagram_spec_validator.py`). It runs ONLY on `absolute_layout` specs — that's another reason workload-driven is forbidden. Fix any errors before re-rendering.
5. **Render.** `oci_diagram_gen.py` for drawio, `oci_deck_gen.py` for PPTX.
6. **Visually verify.** `tools/oci_pptx_render.py` to rasterize, then read the PNG.
Full reference: `docs/skill/output-formats.md` § "Standard diagram-generation procedure (MANDATORY)".
- If the user picks **3**, ask: "Describe the architecture or paste the spec. I'll generate the deck with a native OCI PowerPoint diagram when the architecture is structured enough."
- If the user picks **4**, ask: "What services and sizing? (e.g., 'ADB-S 8 OCPU + 2 VMs + FastConnect'). License model — PAYG, BYOL, or both?"
Then follow the cost-estimate flow:
1. **Catalog first, web never.** `grep` [`kb/pricing/oci-sku-catalog.yaml`](kb/pricing/oci-sku-catalog.yaml) (auto-refreshed, authoritative) for the requested SKUs and consult [`docs/bom-cookbook.md`](docs/bom-cookbook.md) for copy-paste recipes (ExaCS X11M BYOL, ADB-Dedicated, ADB-S + Block, FastConnect, etc.). Use `kb/pricing/compute.yaml` for shape-level lookups. Do NOT reach for WebSearch / WebFetch / `oracle.com` for list prices — the catalog IS the source.
2. **Staleness gate.** Read `last_verified` at the top of the catalog. If >60 days stale, warn the user and offer `python tools/refresh_sku_catalog.py --refresh` before quoting. If <=60 days, proceed without web lookups.
3. **Catalog miss policy.** If a SKU is genuinely absent after `grep` (not "I didn't find it on first try"), state it explicitly, then run `python tools/refresh_sku_catalog.py --refresh` and re-grep. Only if a fresh catalog still doesn't surface it is `oracle.com/cloud/price-list/` an acceptable fallback — and cite the source URL next to the part number.
4. **Source extraction.** When the request references a customer artefact (`.pptx`, BOM, quote), extract the topology / sizing from the artefact first, list each scenario's components, then map to SKUs. Show the mapping (component → SKU) so the SA can audit it.
5. **Quote shape.** Per scenario list: SKU + product name + metric + list price USD + quantity + monthly subtotal. End with total $/month and total $/year. Cite the catalog's `last_verified` date in the output.
6. When both PAYG and BYOL are requested, present them side-by-side (same SKU rows, two price columns). Save the cost estimate to `examples/<customer>-cost-estimate.yaml` and present the formatted table in the terminal.
7. **Disclaimer (mandatory).** Read the `disclaimer:` field from `kb/pricing/oci-sku-catalog.yaml` and append it verbatim — as a footer line under the terminal table, and (if a deck is generated) as a final "Commercial Disclaimer" slide. Do NOT paraphrase or rewrite; the field already carries Oracle's sample-quote boilerplate plus the "reference only / no client-specific discounts" clauses. `tools/oci_bom_gen.py` already reads this field for BOM xlsx output.
8. **Deck verification (if a deck is generated).** Open the produced `.pptx` with `python-pptx` and assert: (a) slide count matches spec, (b) each slide's expected title is present, (c) chart types match what the spec asked for (e.g. `COLUMN_CLUSTERED`, `COLUMN_STACKED`), (d) the disclaimer slide is the last one. Print a one-line `deck OK: <N> slides, titles=[...]` summary so the SA can audit at a glance. Rasterizing to PNG via PowerPoint is not always available on Linux/WSL — structural validation is the floor, not optional.
- If the user picks **5**, ask: "Describe your architecture or paste the spec. I'll run the 5-pillar review." Then follow the WA review flow:
1. Parse input to build a workload profile YAML (flags) and architecture YAML
2. If input is a `.pptx` file, extract text content from all slides to infer architecture and workload context
@@ -80,81 +193,29 @@ Pick a number, or just describe what you need.
- Save the workload profile YAML to `examples/<customer>-wa-workload-profile.yaml`
6. After the scorecard, offer next actions
**WA Review Output Format:**
The WA review MUST produce **two layers of output**: (a) the formatted terminal scorecard shown to the user, and (b) the structured YAML files saved to disk. The terminal output is the primary deliverable — the YAML is the backing data. Never produce YAML-only output without the formatted scorecard.
```
══════════════════════════════════════════════════════
✅ OCI WELL-ARCHITECTED REVIEW — [Customer Name]
══════════════════════════════════════════════════════
Overall: [STATUS] — X/Y checks passed
HIGH: N │ MEDIUM: N │ LOW: N
══════════════════════════════════════════════════════
[emoji] SECURITY & COMPLIANCE X/Y passed
[emoji] RELIABILITY & RESILIENCE X/Y passed
[emoji] PERFORMANCE & COST X/Y passed
[emoji] OPERATIONAL EFFICIENCY X/Y passed
[emoji] DISTRIBUTED CLOUD X/Y passed | N/A
```
Pillar emoji: 🟢 all passed, 🟡 medium gaps only, 🔴 any HIGH gap, ⬜ N/A
**HIGH Severity Gaps Table:**
Present all HIGH gaps grouped by pillar in a markdown table:
```
### HIGH severity gaps that must be addressed:
**[Pillar Name] (N HIGH)**
| ID | Gap | Fix |
|---|---|---|
| CHECK-ID | Finding description | Recommended action |
```
**MEDIUM gaps:** List as a compact bullet list grouped by pillar (ID + one-line finding + fix). Skip the table format to keep it concise.
**LOW gaps:** Mention count only, list individual items only if ≤ 5.
**Analysis Section:**
After the gap tables, add a "Why so many gaps?" paragraph if total gaps > 20, explaining the root cause (e.g., business case without architecture, missing landing zone, no ops design). This contextualizes the score for the SA.
**Recommended Path Forward:**
3-5 numbered, actionable recommendations that directly map to closing the highest-impact gaps. Reference skill options where applicable (e.g., "Generate the architecture — option 1 or 2").
**Files Generated:**
Always list the files saved at the end of the review:
```
📁 Files saved:
- examples/<customer>-wa-scorecard.yaml
- examples/<customer>-wa-architecture.yaml
- examples/<customer>-wa-workload-profile.yaml
```
**After WA Review Menu:**
```
What do you want to do?
→ [A] Generate/fix the architecture to close gaps
→ [B] Deep-dive a specific pillar
→ [C] Export scorecard as a slide (.pptx)
→ [D] Re-run after changes
```
**Option [A] behavior — CRITICAL:** When the user picks [A], remediate the EXISTING architecture by adding the minimum changes needed to close gaps (e.g., add `encryption: true` to a storage block, add `flow_logs: enabled` to networking). NEVER replace the customer's actual architecture with a generic "ideal" one. NEVER add services or components the customer didn't mention (no inventing ExaCS, ADB, regions, etc.). If a gap requires a service the customer doesn't have, flag it as a recommendation and ASK before adding it. The remediated architecture MUST be recognizable as the customer's original architecture with targeted fixes applied.
**WA Review Output Format:** see [docs/skill/wa-review-format.md](docs/skill/wa-review-format.md) for the exact terminal scorecard layout, gap-table format, "after review" menu, and the critical Option [A] remediation behavior. Read that file before producing the scorecard.
- If the user picks **6**, ask: "What feature and deployment type? (e.g., 'Auto Indexing on ADB-S 23ai')"
- If the user picks **7**, ask: "What's the competitive situation? (e.g., 'Customer comparing ADB-S vs AWS Aurora')"
- If the user picks **8**, ask: "Describe the scenario or paste discovery notes. I'll build the business case. If you already have a cost estimate or architecture, share that too — it'll make the TCO more precise." Then follow the business case flow:
1. Parse input into `templates/business-case.yaml` structure
2. Identify business drivers and urgency from discovery notes
3. Estimate TCO comparison using `kb/pricing/*` and `kb/sizing/*`
4. Calculate ROI and payback period
5. Map value drivers (cost, risk, agility, innovation) with quantified evidence
6. Assess migration risks from `kb/field-knowledge/gotchas.yaml` and do-nothing risks
7. Compare with alternatives using `kb/competitive/*`
8. Generate implementation roadmap based on engagement tier
9. Produce a 8-10 slide deck using Oracle FY26 template (`config/oracle-pptx-layouts.yaml` → `business_case` type)
10. Output: business-case.pptx + business-case.yaml (reusable spec)
3. Estimate TCO comparison using `kb/pricing/oci-sku-catalog.yaml` (live SKU prices), `kb/pricing/compute.yaml` (shape-level), `kb/field-knowledge/pricing-knowledge.yaml` (billing models, BYOL rules, free tiers), and `kb/sizing/*`
4. For ADB-S to ADB-D cases, use the reusable `adbs_to_adbd` model:
- keep workload/billable ECPU demand separate from dedicated physical capacity (`DB nodes × ECPU per DB node`)
- do not assume ADB-D uses 100% physical capacity; show utilization explicitly
- keep workload demand comparable between ADB-S and ADB-D unless customer data says otherwise
- model ADB-D fixed DB server + storage server infrastructure separately from workload ECPU
- keep ADB-S as-is components explicit: primaries, local ADG, cross-region standby, refreshable/read clones, read clones, GoldenGate
5. Separate financial views: current/as-is run-rate, target/to-be run-rate, forecasted TCO by horizon, and scenario comparison when applicable. Avoid ambiguous labels such as `OCI Annual`; use scenario labels like `ADB-S As-Is`, `ADB-D Dedicated`, `Incremental Investment`, and `TCO Crossover`.
6. Generate companion BOMs for current as-is, to-be steady state, and 24M/36M projected as-is/to-be annual run-rate snapshots. Projected BOMs are not cumulative multi-year totals.
7. Model read architecture explicitly: ADB-S may require refreshable/read clones because standby is not the application read path; ADB-D may use Local ADG read-only standby and retire steady-state clones. Reflect this in BOM notes, value drivers, and risk/value slides.
8. Add storage economics: ADB-S per-GB storage, ADB-D fixed footprint, customer-provided base break-even when available, recalculated break-even for the proposed footprint, and visible storage offset.
9. Treat GoldenGate as `steady_state`, `migration_bridge_only`, or `migration_plus_fallback_months`. Bridge-only GoldenGate is Year-1 / one-time and is excluded from future steady-state BOMs.
10. Add a TCO crossover chart when multi-year forecast exists, defaulting to native PowerPoint grouped bars with executive labels (`Near-term`, `Year 1`, `Year 2`, `Year 3`) and delta bullets.
11. For risk-reduction cases, generate a Business Value Model instead of generic ROI percentages. Do not invent revenue impact; convert stability to USD only when the customer provides revenue-at-risk, transaction margin, fraud loss impact, or cost per degraded/outage hour.
12. Assess migration and inaction risks against the selected scenario only. Remove obsolete risks such as `if 4x3 is selected` after the customer has chosen `5x3`.
13. Produce an executive deck using Oracle FY26 template (`config/oracle-pptx-layouts.yaml` → `business_case` type), plus business-case YAML and generated BOM artefacts where applicable.
14. **Disclaimer + deck verification.** Append the `disclaimer:` field from `kb/pricing/oci-sku-catalog.yaml` as a final "Commercial Disclaimer" slide (verbatim — see option 4 step 7). Then run structural PPTX validation that reads text boxes, table cells, and grouped shapes; check slide count/titles, disclaimer-last, required assumptions, and forbidden obsolete phrases before reporting completion.
- If the user picks **9**, ask: "What topic? (e.g., 'DEP', 'TAC', 'maintenance window', 'vector search')"
- If the user picks **10**, ask: "What kind of architecture? (e.g., 'ADB + APEX', 'cross-region DR', 'data lakehouse')"
- If the user picks **11**, switch to finding intake mode:
@@ -185,84 +246,30 @@ Pick a number, or just describe what you need.
- Present the formatted terminal scorecard (primary deliverable)
8. Output the ECAL Readiness Scorecard
**Scoring Model:**
Each artefact has a status: ✅ Complete | 🟡 Partial | ❌ Missing | ⬜ Not Applicable (future phase)
**Scoring model, readiness levels, and output format:** see [docs/skill/ecal-readiness-format.md](docs/skill/ecal-readiness-format.md) for the scoring weights, the terminal scorecard layout, and the after-scorecard menu. Read that file before producing the scorecard.
Phase scores are calculated as:
- ✅ = 1.0 point, 🟡 = 0.5 point, ❌ = 0 points, ⬜ = excluded from denominator
- Phase score = (sum of points / applicable artefacts) × 100%
- If the user picks **13**, ask: "What services does the customer need? (e.g., 'ExaCS X11M BYOL 2 DB servers + 4 storage + 128 ECPUs + ADB-S 8 ECPU + 2TB Block Storage + FastConnect 1Gbps'). I'll generate the BOM with only those SKUs."
Then follow the BOM generation flow:
1. Parse the customer request to identify needed OCI services and quantities
2. Match services against `kb/pricing/oci-sku-catalog.yaml` (live, auto-refreshed) to select exact SKUs
3. Ask for discount % and contract duration if not specified (default: 0%, 12 months)
4. Ask if currency conversion is needed (e.g., USD→BRL with exchange rate and tax)
5. Generate the BOM spec YAML and save to the output folder
6. Run `tools/oci_bom_gen.py` to produce the .xlsx
7. Present a summary table in the terminal showing key totals (monthly, ARR)
8. List the files generated
Overall ECAL Readiness = weighted average:
- DEFINE: 25% weight
- DESIGN: 50% weight (largest phase, most artefacts)
- DELIVER: 25% weight
**BOM Output Rules:**
- NEVER include "Confidential: Internal ONLY" or any confidentiality marking
- ALWAYS include the disclaimer from `kb/pricing/oci-sku-catalog.yaml` `disclaimer:` field at the bottom — `tools/oci_bom_gen.py` reads it automatically (do not duplicate, paraphrase, or maintain a second copy elsewhere)
- Only include SKUs the customer actually requested — never dump the full catalog
- Show cost proportions so the customer can see where their spend concentrates
- Use Excel formulas (not static values) so the customer can adjust quantities
**Readiness Levels:**
- 🟢 80-100% — Ready to proceed to next phase
- 🟡 60-79% — Gaps exist but manageable; proceed with caution
- 🟠 40-59% — Significant gaps; address before proceeding
- 🔴 0-39% — Major gaps; phase needs substantial work
**Output Format:**
The ECAL readiness score MUST produce **two layers of output**: (a) the formatted terminal scorecard shown to the user, and (b) the structured YAML file saved to disk. The terminal output is the primary deliverable — the YAML is the backing data. Never produce YAML-only output without the formatted scorecard.
```
══════════════════════════════════════════
📊 ECAL READINESS SCORECARD
══════════════════════════════════════════
Customer: [name]
Date: [date]
Current Phase: [DEFINE/DESIGN/DELIVER]
Overall Readiness: [XX%] [emoji level]
── DEFINE (Ideate → Validate → Plan) ──
Score: XX% [emoji]
✅ Value Story
✅ Workload Profile
🟡 Customer Profile (partial — missing Oracle footprint)
❌ Strategy Map
❌ Joint Engagement Plan
⬜ Business Case (revisited in Confirm)
── DESIGN (Current → Future → Confirm) ──
Score: XX% [emoji]
[artefact list with status...]
── DELIVER (Adopt → Operate → Improve) ──
Score: XX% [emoji]
[artefact list with status...]
── TOP 5 GAPS ──
1. ❌ [artefact] — [why it matters] — [recommended action]
2. ...
── RECOMMENDED NEXT ACTIONS ──
1. [specific action]
2. [specific action]
3. [specific action]
── ENGAGEMENT RACI CHECK ──
Roles identified: [list]
Roles missing: [list]
══════════════════════════════════════════
```
**Files Generated:**
Always list the files saved at the end of the scorecard:
```
📁 Files saved:
- examples/<customer>-ecal-scorecard.yaml
```
After showing the scorecard, offer:
```
What do you want to do?
→ [A] Fix the top gap now (I'll generate the missing artefact)
→ [B] Generate all missing artefacts for current phase
→ [C] Export scorecard as a slide (.pptx)
→ [D] Re-score after updates
```
- If the user picks **14**, follow the same flow as option 13 (BOM generator) but generate the output in AppCA import format. AppCA is Oracle's internal deal approval tool. The generated .xlsx has two sheets:
- **"Export to AppCA"**: Flat table with columns SKU, QTY, HOURS, MONTHS, DISCOUNT, BURSTABLE — ready to paste/import into AppCA
- **"BOM.C1"**: Full BOM detail with product names, metrics, prices, and formulas for cost calculations
Run with: `python tools/oci_bom_gen.py --spec <spec>.yaml --output <name>.xlsx --appca`
- If the user sends discovery notes directly (without picking a number), detect this and go straight to option 1 (full proposal flow).
- If the user asks a specific question (e.g., "does ADB-S support vector search?"), detect this and go straight to the relevant capability without showing the menu.
@@ -277,7 +284,7 @@ After delivering an output, show elapsed time and offer the natural next step.
```
✅ Done — [task description] completed in [Xm Ys]
→ [A] Generate additional outputs (drawio / doc / xlsx)
→ [A] Generate additional outputs (sketch / drawio / doc / xlsx)
→ [B] Modify the architecture (add/remove/change services)
→ [C] Run Well-Architected review on this architecture
→ [D] Build a business case from this architecture
@@ -335,6 +342,32 @@ Full tier definitions and artifact matrix: [docs/engagement-tiers.md](docs/engag
**Step 1 — Ideate:** Parse discovery notes into a **Workload Profile** (`templates/workload-profile.yaml`). Formulate a value hypothesis: "If we [technical action], the customer achieves [business outcome]." Use `kb/patterns/business-patterns.yaml` for proven business-level patterns.
**Step 1b — Extraction Receipt (MANDATORY).** After parsing discovery notes, present an extraction receipt to the user BEFORE proceeding. This ensures the architecture is built on confirmed facts, not assumptions:
```
📋 Extraction Receipt
━━━━━━━━━━━━━━━━━━━━
From your input I extracted:
CONFIRMED (explicitly stated):
• [field]: [value] — source: "[exact quote or reference from notes]"
• [field]: [value] — source: "[exact quote or reference from notes]"
INFERRED (not stated, derived from context):
• [field]: [value] — reason: "[why I inferred this]"
MISSING (needed but not provided):
• [field] — needed for: [which artifact or decision needs it]
━━━━━━━━━━━━━━━━━━━━
Confirm, correct, or fill gaps before I proceed.
```
Rules:
- Every field in the workload profile that you populate must appear in either CONFIRMED or INFERRED.
- Do NOT proceed to Step 2 until the user confirms the receipt.
- If the user provides additional data, update the receipt and re-confirm.
- When generating the workload-profile.yaml, tag each field with `source: customer` (confirmed), `source: inferred`, or `source: default` so the SA knows what to validate with the customer.
**Step 2 — Validate:** Test the hypothesis for SMART criteria (Specific, Measurable, Attainable, Relevant, Time-based). Identify gaps. Check technical feasibility against `kb/services/` and `kb/compatibility/`.
**Step 3 — Service Tiering:** After parsing databases, assign each workload a tier (Platinum/Gold/Silver/Bronze) based on SLA requirements, compliance needs, and business criticality. Use the auto-assignment rules in `kb/patterns/service-tiering.yaml`. Present the assignment and ask the architect to confirm or adjust.
@@ -368,7 +401,7 @@ Capture enough about current state to architect the future. Frame the problem
1. **Select services** from `kb/services/` across the full OCI catalog
2. **Dimension each service** using `kb/sizing/` rules. For Oracle DBs, use AWR metrics if available. Apply conversion ratios. For ADB-S, size base OCPUs for P75.
3. **Compose topology** from `kb/patterns/` blocks. Check conflicts, add implied dependencies, apply compliance overlays. Use `kb/patterns/application-patterns.yaml` for workload-type guidance.
3. **Compose topology** from `kb/patterns/` blocks. Check conflicts and apply compliance overlays. Use `kb/patterns/application-patterns.yaml` for workload-type guidance. **Do NOT silently add components** — only add technical dependencies from the closed whitelist in the Guardrails section below. Everything else must be proposed as optional in the pre-generation review.
4. **Architecture Principles** — Select applicable principles from `kb/patterns/architecture-principles.yaml` based on the workload profile. Check `applies_when` conditions. Include in the deck as a governance slide.
5. **Environment Catalogue** — Expand each workload into environments (Prod/Pre-Prod/Dev-Test/DR) using the tier templates in `kb/patterns/environment-catalogue.yaml`. Apply cost optimization rules. Include in the deck and in the cost estimate.
6. **Design deployment** — environment strategy, IaC approach, CI/CD pipeline
@@ -391,6 +424,28 @@ Capture enough about current state to architect the future. Frame the problem
#### Confirm (Solution Proposal)
**Completeness gate (MANDATORY before generating artifacts).** Before calling any generation tool (deck, diagram, BOM, PDF), verify that critical fields are populated based on engagement tier:
| Field | Small | Standard | Complex |
|---|---|---|---|
| customer_name | required | required | required |
| workload_type | required | required | required |
| databases (type + count) | required | required | required |
| primary_region | required | required | required |
| compliance_frameworks | — | required | required |
| RTO / RPO | — | required | required |
| team_size | — | required | required |
| current_infrastructure | — | required | required |
| migration_driver | — | required | required |
| environment_strategy | — | — | required |
| operational_model | — | — | required |
| multi_region_topology | — | — | required |
| data_residency | — | — | required |
- If **required** fields are missing: ask the user before generating.
- If **optional** fields are missing: list them as assumptions in the output (e.g., "Assumed: PAYG pricing, single environment, no compliance requirements").
- Fields tagged `source: inferred` in the workload profile count as populated but should be flagged as assumptions.
Assemble all design work into a proposal. Ensure all propositions are **SMART**. Quality matters — it must look professional.
**Outputs by tier:** See artifact matrix in [docs/engagement-tiers.md](docs/engagement-tiers.md)
@@ -432,113 +487,30 @@ Full DELIVER guide: [docs/deliver-phase.md](docs/deliver-phase.md)
Every skill option that produces output MUST generate **readable, human-consumable output** as the primary deliverable. YAML files are structured backing data — they are never the final output shown to the user. Specifically:
- **Options 1-4, 8:** Primary output is `.pptx` (slide deck) and/or `.drawio` (diagram). YAML specs are saved alongside but never presented as the deliverable.
- **Options 1-4, 8:** Primary output is `.pptx` (slide deck), `.drawio` (diagram), and/or native `.excalidraw` sketch when the user requests draft mode. YAML/Mermaid specs are saved alongside when useful but never presented as the final deliverable.
- **Option 5 (WA Review):** Primary output is the **formatted terminal scorecard** (banner + pillar bars + gap tables + recommendations). YAML scorecard saved to `examples/` as backing data.
- **Option 12 (ECAL Readiness):** Primary output is the **formatted terminal scorecard** (phase scores + artefact checklist + gap analysis). YAML scorecard saved to `examples/` as backing data.
- **After any review/score:** When the user picks [C] "Export as slide", generate a 1-2 slide `.pptx` with the scorecard visualization using `tools/oci_deck_gen.py`.
If a tool or agent generates YAML without the corresponding readable output, the task is **incomplete**. Always present the formatted result, then list the files saved.
### Output Directory Convention
### Output directory, slide deck structure, format options, service categorization
All generated files MUST be saved inside a dedicated output folder per customer/initiative:
```
examples/output-<customer>-<initiative>/
```
Examples:
- `examples/output-meli-im06/` — MELI MySQL engagement
- `examples/output-meli-im30/` — MELI ElasticSearch engagement
- `examples/output-acme-migration/` — ACME cloud migration
This folder contains ALL outputs for that engagement: `.pptx`, `.drawio`, `.yaml` specs, `.pdf`, scorecards. The folder is gitignored via `examples/output-*/` — never commit customer data.
YAML spec files (architecture, workload-profile, diagram-spec) are saved IN the output folder, not loose in `examples/`. This keeps everything grouped and portable.
Default output is a **slide deck (.pptx)**. The architect can specify:
| Format | Output |
|--------|--------|
| `deck` (default) | 10-12 slide presentation |
| `deck + drawio` | + editable architecture diagram |
| `deck + doc` | + technical document (15-25 pages) |
| `deck + xlsx` | + cost spreadsheet with formulas |
| `deck + pdf` | + customer-facing PDF (branded, no internal refs) |
| `pdf` | Customer PDF only |
| `full` | Everything (pptx + drawio + docx + xlsx + pdf) |
| `doc only` | Technical document without slides |
| `deliver` | Handover + go-live checklist + success criteria |
### Slide Deck Structure
Slide count adapts to engagement tier (6-8 small, 10-12 standard, 12-16 complex):
1. **Title** — customer, project, date (dark background)
2. **Value Story** — business driver, hypothesis, desired outcomes
3. **Service Tiering** — workload-to-tier mapping (Platinum/Gold/Silver/Bronze) with SLA, RTO/RPO
4. **Architecture Principles** — selected ECAL principles (Design/Deployment/Service) that govern the architecture
5. **Architecture Diagram** — fills 85% of slide
6. **Architecture Decisions** — 4-6 key decisions with rationale
7. **HA/DR** — topology + RTO/RPO per tier
8. **Security & Compliance** — controls grid, compliance badges
9. **Environment Catalogue** — Prod/Pre-Prod/Dev-Test/DR per workload with sizing and isolation
10. **Cost Estimate** — PAYG vs BYOL table with assumptions (all environments)
11. **Cost Comparison** (optional) — vs current state or competitor
12. **Migration Approach** — phased timeline, tools, downtime strategy
13. **Operational RACI** — responsibility matrix (customer vs Oracle/partner)
14. **Risk Register** — severity-coded risk table
15. **Well-Architected Scorecard** — 5-pillar traffic-light indicators
16. **Next Steps** — concrete SMART actions with dates
Use `tools/oci_deck_gen.py` for generation. Colors: teal `#2D5967`, copper `#AA643B`, purple `#804998`. Font: Segoe UI. Design standards: `config/output-formats.yaml`.
### Architecture Diagram
Use `tools/oci_diagram_gen.py` with OCI official styles from `kb/diagram/oci-toolkit-styles.yaml`. Containers, service blocks, connections, and typography rules are defined there.
See [docs/skill/output-formats.md](docs/skill/output-formats.md) for the per-customer output folder convention, the complete format option matrix, the 16-slide deck structure, the diagram generation rules, and the service-to-color mapping.
---
## Service Categorization
## Cookbook: Building Tool Payloads
| Category | Color | Use |
|----------|-------|-----|
| **Infrastructure** | Teal `#2D5967` | Compute, OKE, LB, Gateways, WAF, Bastion, Storage, Monitoring |
| **Database** | Copper `#AA643B` | ADB-S/D, DBCS, ExaCS, MySQL, PostgreSQL, NoSQL, GoldenGate |
| **Integration** | Purple `#804998` | DRG, Streaming, Queue, OIC, FastConnect, Service Connector Hub |
| **Dormant** | Light gray `#DFDCD8` | Standby/inactive resources (DR tier) |
| **Legacy** | Medium gray `#70665E` | Non-OCI systems (MQ Series, legacy middleware) |
Any pricing or SKU work — cost estimate (option 4), BOM (option 13), BOM-AppCA (option 14), business-case TCO (option 8), scenario comparison from a customer artefact (`.pptx`, BOM, quote) — starts in the local catalog, not on the web. Check [docs/bom-cookbook.md](docs/bom-cookbook.md) for copy-paste recipes (ExaCS X11M BYOL, ADB-Dedicated, ADB-S + Block + FastConnect) and the gotchas that otherwise burn exploration turns (e.g. ADB-Dedicated shares infrastructure SKUs with ExaCS — there are no separate `adb_dedicated` SKUs in the catalog).
If a requirement does not match a recipe, `grep` [`kb/pricing/oci-sku-catalog.yaml`](kb/pricing/oci-sku-catalog.yaml) and consult `kb/services/` before inventing SKUs. See "What You Do NOT Do" for the web-lookup rule and `kb/pricing/oci-sku-catalog.yaml`'s `last_verified` for staleness handling.
---
## Knowledge Base
```
kb/
├── architecture-center/ # Oracle Architecture Center reference catalog
│ └── catalog.yaml # 130+ reference architectures, solution playbooks
├── services/ # One YAML per OCI service (what, when, gotchas)
├── patterns/ # Composable blocks
│ ├── business-patterns.yaml # Business-level patterns (DEFINE)
│ ├── application-patterns.yaml # Application architecture patterns (DESIGN)
│ ├── service-tiering.yaml # Service tier definitions (Platinum/Gold/Silver/Bronze)
│ ├── architecture-principles.yaml # ECAL architecture principles (Design/Deployment/Service)
│ ├── operational-raci.yaml # RACI matrix templates (fully/co/self-managed)
│ ├── environment-catalogue.yaml # Environment templates per tier
│ ├── database-ha/ # Database HA patterns
│ ├── database-dr/ # Database DR patterns
│ ├── networking-*/ # Networking patterns
│ ├── compute-scaling/ # Compute auto-scaling
│ ├── security-baseline/ # Security controls
│ └── compliance-pci/ # PCI-DSS compliance
├── sizing/ # CPU conversion ratios, IOPS, scaling rules
├── pricing/ # Simplified pricing for estimation
├── competitive/ # AWS/Azure/GCP service mapping
├── well-architected/ # 5-pillar validation checklists
├── diagram/ # OCI Toolkit styles and reference layouts
├── compatibility/ # Feature matrices (ADB, etc.)
└── field-knowledge/ # Real-world gotchas and lessons learned
```
KB lives under `kb/`. See [kb/README.md](kb/README.md) for the directory map, frontmatter requirements, refresh tooling, and contributor guide.
---
@@ -568,27 +540,71 @@ kb/
- Present trade-offs explicitly. Let the architect decide.
- Produce the **minimum needed** for the engagement tier — don't pad.
### Minimal Output — Work Silently
**Do NOT narrate your internal process.** The architect does not need a play-by-play of what you are doing. Specifically:
- **Do NOT** announce each file you are about to read ("Let me check the service catalog...", "Reading the pricing file...").
- **Do NOT** list the KB files, templates, or patterns you are consulting.
- **Do NOT** describe intermediate reasoning steps ("First I'll parse your notes, then I'll...", "Now I'm matching services against the catalog...").
- **Do NOT** echo back the user's input as a summary before starting work.
- **Do NOT** show progress updates for sub-steps ("Step 1 done, moving to step 2...").
**What TO show:**
- Clarifying questions (when input is ambiguous or incomplete).
- The pre-generation review (component confirmation before generating artifacts).
- The final deliverable (scorecard, deck summary, file list, next-step menu).
- Errors or blockers that require the architect's input.
**In short:** Go from input → clarifying question (if needed) → pre-generation confirmation → final output. Skip everything in between. The architect cares about results, not process.
---
## Guardrails
- **Only what the user asked for.** Never add services, components, or features the user did not request — this includes observability (Monitoring, Logging, Events), security services (Data Safe, Vault, Cloud Guard, WAF), sizing details, connection types (RPC, peering), and any "nice to have" additions. Adding unrequested components wastes the architect's time and erodes trust.
- **Only what the user asked for.** Never add services, components, or features the user did not request — this includes observability (Monitoring, Logging, Events), security services (Data Safe, Vault, Cloud Guard, WAF), sizing details, connection types (RPC, peering), and any "nice to have" additions. Adding unrequested components wastes the architect's time and erodes trust. The ONLY exception is the closed whitelist of technical dependencies below.
- **Technical dependency whitelist (closed — nothing else is auto-added):**
| If the user requests… | Auto-include | Reason |
|---|---|---|
| FastConnect | DRG | FastConnect terminates on DRG — cannot work without it |
| VPN Connect | DRG | IPSec tunnels terminate on DRG |
| ADB-S / ExaCS with backup to Object Storage | Service Gateway | Backup traffic requires SGW for Oracle Services Network |
| Any service in a public subnet | Internet Gateway | Public subnet routing requires IGW |
| Any private subnet service needing internet egress | NAT Gateway | Private-to-internet routing requires NAT |
| Cross-region DR (Data Guard, FSDR) | Remote Peering Connection (RPC) | Cross-region VCN connectivity requires RPC on both DRGs |
Everything NOT in this table — including Monitoring, Logging, Events, Vault, Data Safe, WAF, Cloud Guard, Bastion, management subnets, compartment boundaries — requires explicit user approval via the pre-generation review.
- **Ask, don't guess.** When requirements are ambiguous or incomplete, ask a clarifying question instead of filling in assumptions. A 10-second question saves a 10-minute redo.
- **Pre-generation review.** Before generating any diagram or architecture artifact, confirm the component list with the user. Present what you understood and suggest optional additions they can approve or reject:
```
I'll generate a diagram with:
✅ [list of explicitly requested components]
Want me to also include any of these?
• Observability subnet
• Compartment boundaries
• Security services (Data Safe, Vault)
• Gateways (IGW, NAT, SGW)
• [other relevant options based on context]
Or just generate with the above?
- **MANDATORY pre-generation review.** Before generating ANY diagram, deck, or architecture artifact, you MUST confirm the component list with the user. Never skip this step. Present three clearly separated sections:
```
This takes 5 seconds to confirm and prevents rework.
I'll generate with:
REQUESTED (from your input):
✅ [only components explicitly mentioned by the user]
TECHNICAL DEPENDENCIES (auto-added per whitelist):
⚙️ [only items from the whitelist table above, with reason]
OPTIONAL — want me to add any of these?
○ Observability (Monitoring, Logging, Events)
○ Security services (Vault, Data Safe, WAF, Cloud Guard)
○ Management subnet
○ Compartment boundaries
○ Bastion / jump host
○ [other relevant options based on context]
Generate with the above, or adjust?
```
Wait for the user's response before generating. If the user says "just generate" or equivalent, proceed with only REQUESTED + TECHNICAL DEPENDENCIES (no optionals).
- **Source attribution.** When the user provides documents, URLs, meeting notes, or external data:
- Cite the source when extracting data: "From [document/source]: [extracted fact]"
- Clearly separate facts from the source vs. your own inferences
- If the source contradicts the internal KB, flag the conflict explicitly and let the architect decide
## What You Do NOT Do
@@ -596,6 +612,10 @@ kb/
- You do NOT replace the architect's judgment. You accelerate it.
- You do NOT generate pixel-perfect diagrams. You generate 80% drafts the architect refines.
- You do NOT make up pricing. If you don't have current pricing, estimate ranges.
- You do NOT use WebSearch / WebFetch / `oracle.com` for OCI list prices or SKU lookups. `kb/pricing/oci-sku-catalog.yaml` is auto-refreshed via `tools/refresh_sku_catalog.py` (Oracle apexapps pricing API) and is the source of truth — including for ECPU/OCPU rates, BYOL deltas, Exadata X11M part numbers, and ADB-D ECPU SKUs. Web fallback is allowed ONLY when (a) the SKU is genuinely absent after `grep` AND a fresh `--refresh` still does not surface it, or (b) the catalog's `last_verified` is >60 days stale and a refresh is not currently possible. In either case, cite the source URL alongside the part number. Reflexively reaching for WebSearch when the catalog already has the answer is the most common cost-estimate failure mode — don't.
- You do NOT claim features exist if you're unsure. Check the KB first.
- You do NOT do detailed project management. DELIVER artifacts are lightweight handover aids.
- You do NOT add services or components the user did not request.
- **The skill ships as an MCP server.** This repo is packaged and served via the hosted MCP at `https://mcp.tech-lad.com/deal-accelerator/mcp/`. Anything you change in the skill's runtime — `tools/`, `scripts/`, `kb/`, `SKILL.md`, `AGENTS.md`, `.agents/` — must keep working in that deployed environment, not just on the SA's laptop. Concrete implications: (1) NO machine-specific paths (use `pathlib.Path(__file__).resolve().parent.parent` or env vars, never hardcoded `/mnt/c/...` or `/home/diego/...`); (2) NO required network calls during normal operation (the MCP container won't have access to drawio.exe, paid APIs, or Diego's local files — opt-in via env vars like `DRAWIO_EXE` / `ANTHROPIC_API_KEY`, never required); (3) NO writes outside the repo tree (the MCP filesystem is the cloned repo, write only under `examples/`, `tmp/`, or the artifacts the skill is meant to produce); (4) NO new dependencies that aren't in `requirements.txt` (CI installs from there, the MCP container too); (5) any new tool must work in a fresh clone with `make venv` — no manual setup steps. Before adding a feature that depends on a binary, an external service, or a privileged operation, ask whether it'll work when the SA is hitting the MCP endpoint with no laptop attached.
- **You do NOT edit skill source code or tooling when the user is in "menu mode".** When the user invoked the skill via the welcome menu (options 114) or asked for one of the menu outputs (proposal, diagram, deck, BOM, WA review, etc.), your job is to USE the existing tools, not modify them. Do NOT touch `tools/`, `scripts/`, `kb/diagram/*.json`, or any other code/index file as part of fulfilling a menu request — even if you discover a bug or a missing alias mid-task. If you hit a tool gap (missing icon alias, broken renderer, type that doesn't resolve), surface it as a follow-up at the end of your reply (e.g. "I noticed `refreshable_clone` doesn't have a PPTX icon alias — flag this for the maintainer to add to `tools/oci_pptx_diagram_gen.py::TYPE_TO_ICON`") rather than silently patching it. Code edits happen in a separate "developer mode" engagement, not while the SA is generating customer artifacts. The two exceptions: (1) `kb/field-findings/tracker.yaml` via menu option 11 (the menu's purpose IS to write that file), and (2) writing the customer's spec/output YAML files under `examples/<customer>/` — those are the deliverable, not the skill itself.

View File

@@ -8,7 +8,10 @@
# Navigate to the project root
cd oci-deal-accelerator
# Run Codex — it auto-discovers AGENTS.md and .agents/skills/
# One-time: create virtual environment with all dependencies
make venv
# Run Codex — it auto-discovers AGENTS.md, .agents/skills/, and .codex/config.toml
codex
# Or explicitly load the skill
@@ -18,6 +21,18 @@ codex --skill oci-deal-accelerator
Codex automatically reads:
- `AGENTS.md` at project root (project-level instructions)
- `.agents/skills/oci-deal-accelerator/SKILL.md` (the skill definition)
- `.codex/config.toml` (project sandbox + approval config — **enables network for pip**)
### Why `.codex/config.toml` matters
By default Codex CLI blocks network access and prompts before every command.
The committed `.codex/config.toml` pre-configures this project with:
- `approval_policy = "never"` — no per-command prompts
- `sandbox_mode = "workspace-write"` — agent can write in the repo
- `network_access = true``pip install` and `make venv` actually work
Without this file, `make venv` fails with `No matching distribution found for pyyaml` because PyPI is unreachable from the sandbox.
### Option 2: Using Codex App

45
config/brand-icons.yaml Normal file
View File

@@ -0,0 +1,45 @@
version: 1
# Resolution policy:
# 1. Prefer officially downloaded vendor assets committed under
# kb/diagram/brand-icons/official/
# 2. Fall back to vetted local assets under
# kb/diagram/brand-icons/fallback/
#
# The renderers resolve by alias first, then walk `resolution_order`
# until they find an existing file.
resolution_order:
- official_svg
- official_png
- fallback_svg
- fallback_png
icons:
slack:
label: Slack
aliases:
- slack_app
- slack_bot
official_png: kb/diagram/brand-icons/official/slack/slack_hash_256.png
jira:
label: Jira
aliases:
- atlassian_jira
official_svg: kb/diagram/brand-icons/official/jira/Jira_icon.svg
jira_service_management:
label: Jira Service Management
aliases:
- jsm
- jira-service-management
- jira service management
official_svg: kb/diagram/brand-icons/official/jira-service-management/Jira-Service-Management_icon.svg
jirasoftware:
label: Jira Software
aliases:
- jira_software
- jira-software
- jira software
fallback_svg: kb/diagram/brand-icons/fallback/jirasoftware.svg

View File

@@ -28,7 +28,7 @@ review_triggers:
- event: "Oracle database version release"
action: "Review all feature matrix entries. Mark untested. Validate within 14 days."
- event: "Oracle pricing change"
action: "Update kb/pricing/ files. Verify cost calculator accuracy."
action: "Run python tools/refresh_sku_catalog.py --refresh and --refresh-domain compute. Both pull from the live Oracle pricing API."
- event: "After customer engagement"
action: "Run After-Engagement Review (AER). Add findings and KB updates."
- event: "Quarterly"

View File

@@ -20,15 +20,15 @@ domains:
review_cadence: "quarterly"
- area: "kb/compatibility/"
owner: { name: "TBD", team: "Database Specialists" }
owner: { name: "Diego Cabrera", team: "Field SA" }
review_cadence: "on Oracle version release + quarterly"
- area: "kb/pricing/"
owner: { name: "TBD", team: "Solution Engineering" }
review_cadence: "monthly (pricing changes frequently)"
owner: { name: "Auto-refreshed", team: "Oracle Public Pricing API" }
review_cadence: "automatic — refresh tools pull from the API on demand; freshness checker runs in welcome flow"
- area: "kb/competitive/"
owner: { name: "TBD", team: "Competitive Intelligence" }
owner: { name: "Diego Cabrera", team: "Field SA" }
review_cadence: "quarterly + on competitor announcements"
- area: "kb/field-findings/"
@@ -36,5 +36,5 @@ domains:
review_cadence: "continuous"
- area: "kb/well-architected/"
owner: { name: "TBD", team: "Cloud Architecture" }
owner: { name: "Diego Cabrera", team: "Field SA" }
review_cadence: "on Oracle WA Framework updates"

View File

@@ -12,6 +12,7 @@
---
taxonomy:
products:
- adb # generic ADB (covers both -s and -d)
- adb-s
- adb-d
- dep
@@ -26,6 +27,8 @@ taxonomy:
- goldengate
- data-safe
- vault
- rac
- proxysql
versions:
- 19c
@@ -44,6 +47,42 @@ taxonomy:
- sizing
- compliance
features:
- adg # Active Data Guard
- ai-vector-search
- vector-search
- hnsw # Hierarchical Navigable Small World indexes
- json
- partitioning
- refreshable-clone
- elastic-pool
- ecpu # ECPU billing model (vs OCPU)
- connection-pooling
- distributed
- immutable
- serialization
operations:
- cli
- maintenance-window
- provisioning
- planning
- lead-time
- capacity
- node-split
- zero-downtime
- bidirectional
- detection-delay
- stale-reads
metrics:
- latency
- 100m # 100 million scale (e.g. vector counts)
limitations:
- limitation
- sr-required # Service Request required to enable / fix
severity_tags:
- blocker
- workaround-available

View File

@@ -4,7 +4,7 @@
output_selection:
description: |
The architect can specify output format when requesting deliverables:
deck ← default, just the slide deck
deck ← default, slide deck with native OCI PowerPoint diagram when applicable
deck + drawio ← deck + editable diagram
deck + doc ← deck + detailed technical document
deck + xlsx ← deck + detailed cost spreadsheet
@@ -22,12 +22,12 @@ output_selection:
deck:
extension: ".pptx"
generator: "tools/oci_deck_gen.py"
description: "10-12 slide architecture proposal"
description: "10-12 slide architecture proposal with native OCI PowerPoint diagram when applicable"
drawio:
extension: ".drawio"
generator: "tools/oci_diagram_gen.py"
description: "Editable architecture diagram (draw.io)"
description: "Editable architecture diagram (draw.io) for technical editing workflows"
doc:
extension: ".docx"
@@ -133,7 +133,7 @@ deck_structure:
- number: 3
type: architecture_diagram
content: "Full architecture diagram (85% of slide)"
content: "Full architecture diagram (85% of slide), preferring native OCI PowerPoint shapes over pasted images"
style: "White background, diagram fills slide"
- number: 4

View File

@@ -0,0 +1,117 @@
asset:
bundled_path: kb/diagram/assets/OCI_Icons.pptx
manifest_path: kb/diagram/oci-pptx-icons-manifest.yaml
index_path: kb/diagram/oci-pptx-icons-index.json
env_var: OCI_ICONS_PPTX_PATH
search_globs:
- /mnt/c/Users/*/Downloads/OCI_Icons*.pptx
- ~/Downloads/OCI_Icons*.pptx
- kb/diagram/assets/OCI_Icons*.pptx
refresh:
sync_discovered_asset_into_bundle: true
choose_newest_discovered_match: true
instruction_index:
noise_contains:
- "copyright"
- "oracle and/or its affiliates"
noise_exact:
- "tip"
semantic_markers:
connectors_logical:
title_contains: "Connectors"
all_text:
- "Open Arrowhead style"
- "Bark color"
- "relationships between icons and grouping boxes"
connector_labels:
all_text:
- "connector labels"
- "Place connector labels on the horizontal portions"
grouping:
title_contains: "Grouping"
all_text:
- "OCI Region"
- "Availability Domain"
- "Compartment"
landscape_blank_template:
all_text:
- "Landscape Blank Template"
- "Location Canvas"
- "OCI Region"
portrait_blank_template:
all_text:
- "Portrait Blank Template"
- "OCI Region"
landscape_sample_db_dr:
all_text:
- "Landscape Sample"
- "Primary"
- "Standby"
- "Database"
- "VCN"
database_icons:
title_contains: "Database"
any_text:
- "ADB-D"
- "ATP-D"
- "ADW-D"
- "Data Guard"
migration_icons:
title_contains: "Migration"
any_text:
- "Database Migration"
- "Oracle Cloud Migration Advisor"
extracted_shapes:
grouping_labels:
- "OCI Region"
- "Availability Domain"
- "Fault Domain"
- "Tier"
- "Tenancy"
- "Compartment"
- "VCN"
- "Subnet"
database_icon_labels:
- "Database"
- "Oracle Autonomous Database"
- "ADW-D"
- "ATP-D"
- "ADB-D"
- "Oracle Exadata Database Service"
- "Data Safe"
- "NoSQL Database"
- "Database Management"
- "Data Guard"
- "Data Guard Recovery"
design_tokens:
palette:
bark: "312D2A"
bark_soft: "66615C"
gray_divider: "9E9892"
gray_tick: "C8C5C1"
bg_warm: "FBF6F0"
white: "FFFFFF"
oracle_red: "C74634"
oracle_red_soft: "AE562C"
oracle_blue: "3F7CC4"
oracle_green: "00875A"
oracle_amber: "E8A92F"
tl_green: "EAF2DE"
tl_yellow: "FBF1C7"
tl_amber: "F8D9A8"
tl_red: "F6CAC4"
typography:
primary_font: "Oracle Sans"
connector_style:
line_width_emu: 12700
line_width_soft_emu: 9525
color: "312D2A"
arrowhead:
type: "triangle"
width: "sm"
length: "sm"

190
docs/bom-cookbook.md Normal file
View File

@@ -0,0 +1,190 @@
# BOM Cookbook — Building `generate_bom` Payloads
Copy-paste recipes that map common customer requirements to the exact OCI SKUs the
`generate_bom`, `generate_bom_appca`, and `generate_cost_estimate` MCP tools expect.
The goal is to skip the "grep the catalog and guess SKUs" exploration loop that
burns tool calls on well-known patterns.
> **If the requirement does not match any recipe below, consult
> [`kb/services/`](../kb/services/) and
> [`kb/pricing/oci-sku-catalog.yaml`](../kb/pricing/oci-sku-catalog.yaml)
> before inventing SKUs.** All SKUs below are verified against the catalog as of
> 2026-04-20; re-`grep` the catalog if a recipe ever fails.
## Payload Shape
All three tools accept the same envelope:
```json
{
"customer_id": "acme-prod",
"discount_pct": 0.35,
"currency": "USD",
"services": [
{ "sku": "B90777", "quantity": 1 }
]
}
```
- `customer_id`: free-form identifier, used for output file naming.
- `discount_pct`: decimal (0.35 = 35%). Applied to every line unless overridden.
- `services[].quantity`: integer or float depending on the SKU metric (ECPUs, GB, hours).
---
## Recipe 1 — Exadata Cloud Service (ExaCS) X11M, BYOL
**When it matches:** "ExaCS X11M BYOL, N ECPUs, M TB storage, no DR" — customer-managed
Oracle Database on dedicated Exadata hardware, BYOL licensing.
**SKUs:**
| SKU | Component | Typical qty |
|-----|-----------|-------------|
| `B90777` | Exadata Infrastructure — Base System | `1` per rack |
| `B110627` | Exadata Database Server — X11M | `2` (Base/Quarter) — adjust per rack config |
| `B110629` | Exadata Storage Server — X11M | `3` (Base/Quarter) — adjust per rack config |
| `B110632` | Exadata Database ECPU — Dedicated Infra BYOL (X11M) | One per ECPU |
Swap `B110632``B110631` for PAYG (license-included) pricing.
**Payload (120 ECPUs, 120 TB, BYOL, standard Base System):**
```json
{
"customer_id": "acme-exacs",
"discount_pct": 0.35,
"currency": "USD",
"services": [
{ "sku": "B90777", "quantity": 1 },
{ "sku": "B110627", "quantity": 2 },
{ "sku": "B110629", "quantity": 3 },
{ "sku": "B110632", "quantity": 120 }
]
}
```
---
## Recipe 2 — Autonomous Database Dedicated (ADB-D), BYOL
**When it matches:** "ADB Dedicated, N ECPUs, M TB, BYOL" — Autonomous Database running
on dedicated Exadata infrastructure.
**⚠️ Gotcha that burns tool calls:** ADB-Dedicated has **no separate infrastructure
SKUs** in the catalog. It reuses the same Exadata dedicated infra SKUs as ExaCS
(`B90777`, `B110627`, `B110629`) plus the same Exadata ECPU SKU (`B110631`/`B110632`).
The Autonomous-vs-customer-managed distinction is a tenancy-level configuration,
not a billing line item. Do not search for `autonomous_dedicated` SKUs — they do
not exist.
**SKUs:** identical to Recipe 1.
**Payload (64 ECPUs, BYOL):**
```json
{
"customer_id": "acme-adbd",
"discount_pct": 0.35,
"currency": "USD",
"services": [
{ "sku": "B90777", "quantity": 1 },
{ "sku": "B110627", "quantity": 2 },
{ "sku": "B110629", "quantity": 3 },
{ "sku": "B110632", "quantity": 64 }
]
}
```
---
## Recipe 3 — Autonomous Database Serverless (ADB-S) + Block Volume + FastConnect
**When it matches:** "ADB-S ATP, N ECPUs, M TB data + block storage for app tier +
FastConnect to on-prem" — the typical "app on OCI Compute, DB on ADB-S" pattern.
**SKUs:**
| SKU | Component | Metric |
|-----|-----------|--------|
| `B95701` | ADB ECPU (ATP or ADW) — license-included | ECPU/hour |
| `B95703` | ADB ECPU BYOL — use instead of B95701 if BYOL | ECPU/hour |
| `B95706` | ADB ATP data storage | GB/month |
| `B95754` | ADB ADW data storage — use instead of B95706 for warehouse | GB/month |
| `B95754a` | ADB backup storage | GB/month |
| `B91961` | Block Volume storage (app tier) | GB/month |
| `B91962` | Block Volume performance (VPU) — optional, for higher IOPS tiers | VPU/GB/month |
| `B88326` | FastConnect 10 Gbps port | port-hour |
Swap `B88326``B88325` (1 Gbps) or `B93126` (100 Gbps) as needed.
**Payload (16 ECPUs ATP license-included, 2 TB data + 1 TB backup, 500 GB block, 10 G FastConnect):**
```json
{
"customer_id": "acme-adbs",
"discount_pct": 0.35,
"currency": "USD",
"services": [
{ "sku": "B95701", "quantity": 16 },
{ "sku": "B95706", "quantity": 2048 },
{ "sku": "B95754a", "quantity": 1024 },
{ "sku": "B91961", "quantity": 500 },
{ "sku": "B88326", "quantity": 1 }
]
}
```
---
## Recipe 4 — Big Data Service + Data Science + Data Flow (analytics stack)
**When it matches:** "HDFS-managed cluster for ETL", "notebooks + model deployment",
"managed Spark pipelines" — typical OCI analytics/AI workload mix.
**SKUs:**
| SKU | Component | Metric |
|-----|-----------|--------|
| `B91128` | Big Data Service — Compute Standard (real) | OCPU/hour |
| `B91129` | Big Data Service — Compute Dense I/O (real) | OCPU/hour |
| `B91130` | Big Data Service — Compute HPC (real) | OCPU/hour |
| `B93555` | Big Data Service — Core (real) | OCPU/hour |
| `EST-DS-NOTEBOOK` | **[Estimate]** Data Science notebook session — priced as underlying VM.Standard OCPU | OCPU/hour |
| `EST-DS-MODEL` | **[Estimate]** Data Science model-deployment endpoint — priced as underlying VM.Standard OCPU | OCPU/hour |
| `EST-DF-SPARK` | **[Estimate]** Data Flow managed Spark runtime — priced as underlying VM.Standard OCPU | OCPU/hour |
OCI Data Science and OCI Data Flow have no dedicated SKUs in the Oracle public
pricing API — both are billed via the underlying Compute shape + Block/Object
Storage consumed. The `EST-*` entries are placeholder estimates (VM.Standard3.Flex
OCPU rate) so BOMs can include them as line items with an explicit "estimate"
flag; confirm the actual shape and hours with the customer before quoting.
**Payload (16 BDS Standard + 8 BDS Dense I/O + 4 notebook + 2 model + 8 Spark):**
```json
{
"customer_id": "acme-analytics",
"discount_pct": 0.30,
"currency": "USD",
"services": [
{ "sku": "B91128", "quantity": 16 },
{ "sku": "B91129", "quantity": 8 },
{ "sku": "EST-DS-NOTEBOOK", "quantity": 4 },
{ "sku": "EST-DS-MODEL", "quantity": 2 },
{ "sku": "EST-DF-SPARK", "quantity": 8 }
]
}
```
Add `B91961` (Block Volume) and `B91628` (Object Storage Standard) when the
customer needs dedicated storage beyond the compute default.
---
## When a recipe doesn't fit
1. Grep the catalog: `grep -n "<product keyword>" kb/pricing/oci-sku-catalog.yaml`
2. Check service docs under `kb/services/` for deployment-specific guidance.
3. Check `kb/field-knowledge/` for known sizing/pricing gotchas.
4. If a SKU still cannot be located, surface the gap to the user rather than guessing — fabricated SKUs break the BOM silently.

View File

@@ -0,0 +1,63 @@
# Business Case Flow
Option 8 produces an executive business-case deck plus reusable YAML backing
data. For ADB-S to ADB-D cases, use `business_case.adbs_to_adbd`.
## ADB-S to ADB-D Rules
- Keep workload/billable ECPU demand comparable between ADB-S and ADB-D unless
the customer provides a different target demand.
- Dedicated physical capacity is a separate fixed footprint:
`DB nodes x ECPU per DB node`.
- Never model ADB-D at 100% utilization by default. Show utilization explicitly.
- ADB-D fixed infrastructure includes DB servers and storage servers; workload
ECPU demand remains a separate line.
- Projected BOMs are annual run-rate snapshots at the horizon, not cumulative
multi-year totals.
- GoldenGate can be `steady_state`, `migration_bridge_only`, or
`migration_plus_fallback_months`. Bridge-only GoldenGate is excluded from
future steady-state BOMs.
## Read Architecture
ADB-S and ADB-D can carry the same workload demand while using different read
architectures. ADB-S may require refreshable/read clones when standby is not the
application read path. ADB-D may use Local ADG read-only standby and retire
steady-state clones. The deck should call this out in BOM notes, value drivers,
and risk/value slides.
## Storage Economics
Storage economics are shown separately from aggregate TCO:
```text
break-even TB = fixed dedicated infra monthly cost / ADB-S storage USD per GB-month / 1024
```
Apply discounts uniformly when comparing scenarios. If customer material
provides a baseline break-even, show it beside the recalculated break-even for
the proposed footprint.
## Business Value
Risk-reduction cases use a Business Value Model instead of generic ROI
percentages. Do not invent revenue impact. Convert stability to USD only when
the customer provides revenue-at-risk, transaction margin, fraud loss impact, or
cost per degraded/outage hour.
Use:
```text
avoided degraded/outage hours x business impact per hour
```
Track success metrics such as CPU utilization, read latency, clone lag retired,
ADG read lag, GoldenGate/apply lag during migration, incidents avoided, and
degraded hours avoided.
## Validation
Business-case deck validation reads text boxes, table cells, and grouped shapes.
It checks expected titles, disclaimer-last, required assumptions, and forbidden
obsolete phrases such as `OCI Annual`, stale scenario risks, and unclear
language like `FTE-year`.

View File

@@ -0,0 +1,88 @@
# ECAL Readiness Scorecard Format
This document defines how option 12 (ECAL Readiness Score) presents its results.
Referenced from `SKILL.md` § Welcome Flow → Behavior Rules → option 12.
## Scoring model
Each artefact has a status: ✅ Complete | 🟡 Partial | ❌ Missing | ⬜ Not Applicable (future phase).
Phase scores are calculated as:
- ✅ = 1.0 point, 🟡 = 0.5 point, ❌ = 0 points, ⬜ = excluded from denominator
- Phase score = (sum of points / applicable artefacts) × 100%
Overall ECAL Readiness = weighted average:
- DEFINE: 25% weight
- DESIGN: 50% weight (largest phase, most artefacts)
- DELIVER: 25% weight
## Readiness levels
- 🟢 80-100% — Ready to proceed to next phase
- 🟡 60-79% — Gaps exist but manageable; proceed with caution
- 🟠 40-59% — Significant gaps; address before proceeding
- 🔴 0-39% — Major gaps; phase needs substantial work
## Output format
The ECAL readiness score MUST produce **two layers of output**: (a) the formatted terminal scorecard shown to the user, and (b) the structured YAML file saved to disk. The terminal output is the primary deliverable — the YAML is the backing data. Never produce YAML-only output without the formatted scorecard.
```
══════════════════════════════════════════
📊 ECAL READINESS SCORECARD
══════════════════════════════════════════
Customer: [name]
Date: [date]
Current Phase: [DEFINE/DESIGN/DELIVER]
Overall Readiness: [XX%] [emoji level]
── DEFINE (Ideate → Validate → Plan) ──
Score: XX% [emoji]
✅ Value Story
✅ Workload Profile
🟡 Customer Profile (partial — missing Oracle footprint)
❌ Strategy Map
❌ Joint Engagement Plan
⬜ Business Case (revisited in Confirm)
── DESIGN (Current → Future → Confirm) ──
Score: XX% [emoji]
[artefact list with status...]
── DELIVER (Adopt → Operate → Improve) ──
Score: XX% [emoji]
[artefact list with status...]
── TOP 5 GAPS ──
1. ❌ [artefact] — [why it matters] — [recommended action]
2. ...
── RECOMMENDED NEXT ACTIONS ──
1. [specific action]
2. [specific action]
3. [specific action]
── ENGAGEMENT RACI CHECK ──
Roles identified: [list]
Roles missing: [list]
══════════════════════════════════════════
```
## Files generated
Always list the files saved at the end of the scorecard:
```
📁 Files saved:
- examples/<customer>-ecal-scorecard.yaml
```
## After ECAL scorecard menu
```
What do you want to do?
→ [A] Fix the top gap now (I'll generate the missing artefact)
→ [B] Generate all missing artefacts for current phase
→ [C] Export scorecard as a slide (.pptx)
→ [D] Re-score after updates
```

View File

@@ -0,0 +1,148 @@
# Output Formats and Conventions
Referenced from `SKILL.md` § Output Generation.
## Output directory convention
All generated files MUST be saved inside a dedicated output folder per customer/initiative:
```
examples/output-<customer>-<initiative>/
```
Examples:
- `examples/output-meli-im06/` — MELI MySQL engagement
- `examples/output-meli-im30/` — MELI ElasticSearch engagement
- `examples/output-acme-migration/` — ACME cloud migration
This folder contains ALL outputs for that engagement: `.pptx`, `.drawio`, `.yaml` specs, `.pdf`, scorecards. The folder is gitignored via `examples/output-*/` — never commit customer data.
YAML spec files (architecture, workload-profile, diagram-spec) are saved IN the output folder, not loose in `examples/`. This keeps everything grouped and portable.
## Format options
Default output is a **slide deck (.pptx)**. The architect can specify:
| Format | Output |
|--------|--------|
| `deck` (default) | 10-12 slide presentation, with native OCI PowerPoint diagram when applicable |
| `deck + drawio` | + editable architecture diagram |
| `deck + doc` | + technical document (15-25 pages) |
| `deck + xlsx` | + cost spreadsheet with formulas |
| `deck + pdf` | + customer-facing PDF (branded, no internal refs) |
| `pdf` | Customer PDF only |
| `full` | Everything (pptx + drawio + docx + xlsx + pdf) |
| `doc only` | Technical document without slides |
| `deliver` | Handover + go-live checklist + success criteria |
## Slide deck structure
Slide count adapts to engagement tier (6-8 small, 10-12 standard, 12-16 complex):
1. **Title** — customer, project, date (dark background)
2. **Value Story** — business driver, hypothesis, desired outcomes
3. **Service Tiering** — workload-to-tier mapping (Platinum/Gold/Silver/Bronze) with SLA, RTO/RPO
4. **Architecture Principles** — selected ECAL principles (Design/Deployment/Service) that govern the architecture
5. **Architecture Diagram** — fills 85% of slide; prefer native OCI PowerPoint shapes inside the deck when the architecture is structured enough
6. **Architecture Decisions** — 4-6 key decisions with rationale
7. **HA/DR** — topology + RTO/RPO per tier
8. **Security & Compliance** — controls grid, compliance badges
9. **Environment Catalogue** — Prod/Pre-Prod/Dev-Test/DR per workload with sizing and isolation
10. **Cost Estimate** — PAYG vs BYOL table with assumptions (all environments)
11. **Cost Comparison** (optional) — vs current state or competitor
12. **Migration Approach** — phased timeline, tools, downtime strategy
13. **Operational RACI** — responsibility matrix (customer vs Oracle/partner)
14. **Risk Register** — severity-coded risk table
15. **Well-Architected Scorecard** — 5-pillar traffic-light indicators
16. **Next Steps** — concrete SMART actions with dates
Use `tools/oci_deck_gen.py` for generation. Decks should prefer native OCI PowerPoint diagrams over pasted images when the architecture can be rendered from structured input. Colors: teal `#2D5967`, copper `#AA643B`, purple `#804998`. Font: Segoe UI. Design standards: `config/output-formats.yaml`.
## Architecture diagram
Use `tools/oci_diagram_gen.py` with OCI official styles from `kb/diagram/oci-toolkit-styles.yaml` when the user wants an editable technical diagram (`.drawio`). For customer-facing or presentation-ready output, prefer the native PowerPoint path via `tools/oci_deck_gen.py` and the PPTX icon library/index under `kb/diagram/`.
### Standard diagram-generation procedure (MANDATORY)
Follow these steps for every diagram, in order. Skipping a step is the single most common source of layout regressions.
1. **Reference architecture lookup.** Run `python tools/archcenter_pattern_lookup.py "<topology keywords>"` against `kb/architecture-center/catalog.yaml` (123 entries). Pick the highest-scoring entry whose topology matches what the user asked for. The lookup surfaces cached `.drawio` / `.svg` under `kb/diagram/assets/archcenter-refs/<slug>/` — open it to copy proven container nesting, padding, and AD/subnet placement instead of inventing geometry.
2. **Pre-generation review (per SKILL.md § What You Do NOT Do).** Confirm the component list with the user. Never add services the user did not mention except via the explicit auto-include whitelist.
3. **Author the spec.** Use `absolute_layout` for ref-arch reproductions or any topology where geometry matters. Honor the geometry rules below (the spec validator enforces them).
4. **Spec validation runs automatically.** Both `tools/oci_diagram_gen.py` (drawio) and `tools/oci_pptx_diagram_gen.py` (PPTX, called via `oci_deck_gen.py`) call `tools/diagram_spec_validator.py` before emitting any output. A `fail` status raises and aborts generation — fix the geometry, re-run.
5. **Render.** Generate the `.drawio` and/or `.pptx`. The drawio path additionally runs `drawio_visual_validator.py` post-render to catch anything the spec validator missed (font sizes, off-canvas, duplicate ids).
6. **Visually verify.** Rasterize the PPTX with `python tools/oci_pptx_render.py --pptx X.pptx --output X.png --width 1600` and inspect the PNG before reporting success.
### Geometry rules for `absolute_layout`
These rules are enforced by `tools/diagram_spec_validator.py` and exist because each one corresponds to a regression that previously shipped to the user:
- **Container padding ≥ 12px.** Every nested container must keep ≥12px between its bottom edge and its parent's bottom edge. Otherwise the borders visually merge (`CONTAINER_PADDING_VIOLATION`).
- **Subnet height ≥ label band + 12px.** A container labeled at 11pt needs h ≥ ~30px to avoid the label collapsing onto the bottom edge. Public-subnet bands holding an icon need to clear icon height + label band + breathing room (`CONTAINER_TOO_THIN`).
- **Labels stay inside their parent, ≥ 6px from the bottom edge.** Free-floating labels under a service icon must not cross or sit within 6px of the enclosing subnet's bottom edge (`LABEL_OVERFLOW_PARENT`).
- **AD columns nest INSIDE the VCN, never beside it.** Otherwise AD borders align with VCN borders and visually merge.
- **Subnets may span AD columns** (regional public subnet, cross-AD DB subnet) — that is the canonical Oracle pattern for HA topologies; do not split a regional subnet per AD.
### Diagram modes
The diagram generator accepts two spec shapes — but only ONE is acceptable for any output an SA shows a customer:
1. **`absolute_layout` (REQUIRED for any new diagram).** Explicit `(x, y, w, h)` for every container, service, label, and connection. Resolves real OCI stencils from `kb/diagram/oci-icons.json`, runs through `tools/diagram_spec_validator.py` (geometry rules), and produces output visually consistent with Oracle Architecture Center references. **This is the only mode the standard procedure supports.** Pair it with the ref-arch lookup (`tools/archcenter_pattern_lookup.py`) so geometry derives from a canonical Oracle reference, not invented from scratch.
2. **Workload-driven (DEPRECATED).** `tenancy → region(s) → vcn(s) → subnet(s) → service(s)`. The generator auto-lays out blocks but **does NOT resolve OCI icon stencils** — services render as colored rectangles with text labels, connector text gets baked into edge values (which the connector-label rule forbids), and the spec validator does NOT run. Output looks like a wireframe placeholder, not an architecture diagram. Kept only for back-compat with very old specs; do not author new specs in this shape.
```yaml
absolute_layout:
canvas: {width: 720, height: 420}
containers:
- {id: region, type: region, label: "OCI Region", x: 0, y: 0, w: 720, h: 420}
- {id: vcn, type: vcn, label: "VCN 10.10.0.0/16", x: 28, y: 52, w: 670, h: 348}
services:
- {id: drg, label: "", type: drg, x: 8, y: 200, w: 55, h: 66}
- {id: adb, label: "", type: adb_d, x: 230, y: 240, w: 60, h: 80}
labels:
- {id: lbl_drg, text: "DRG", x: 8, y: 268, w: 55, h: 14, fontSize: 700}
connections:
- {id: c1, from: drg, to: adb, type: standard, points: [[63, 233], [260, 240]]}
```
`fontSize` is shared with the PPTX `absolute_layout` schema — it's hundredths of a point (720 → 7.2pt). The drawio renderer auto-converts.
The Architecture Center reconstruction pipeline lives at `tools/archcenter_case_runner.py` (single case) and `tools/archcenter_batch_driver.py` (batch). Reference: `kb/diagram/reference-layouts/archcenter-batch-runner.yaml`.
### Pre-delivery validation (automatic)
Both generators run sanity checks before the file ships, so a broken artifact never reaches the user:
- **`tools/diagram_spec_validator.py`** — runs automatically *before* either renderer (drawio or PPTX). Validates the parsed `absolute_layout` for `CONTAINER_TOO_THIN`, `CONTAINER_PADDING_VIOLATION`, and `LABEL_OVERFLOW_PARENT`. A fail aborts generation. Set `OCI_DIAGRAM_VALIDATOR_SOFT=1` to demote errors to warnings.
- **`tools/drawio_visual_validator.py`** — runs automatically inside `OCIDiagramGenerator.save()`. Hard-fails on `fontSize ≥ 50pt` (catches the PPTX-cents-of-pt → drawio-pt unit confusion that produced 700pt labels), duplicate cell ids, off-canvas geometry, and dangling edge endpoints. Reports OK/warnings/errors to stderr. Pass `--strict` on the CLI to make errors fail the build.
- **`OCIDeckGenerator.save()` post-check** — verifies `[Content_Types].xml` declares a `<Default>` for every embedded media extension (PowerPoint refuses to open a deck and prompts to "repair" it when this is missing — the SVG-backed icons in `OCI_Icons.pptx` are the canonical case), and that no slide rels point to absent media or duplicate cNvPr ids.
- **`tools/drawio_fidelity_eval.py`** — pixel-diff the rebuilt drawio against a canonical Architecture Center PNG. Runs automatically when the spec carries `source.diagram_asset` (or via `--reference-png` on the CLI). Default rendering path is the SVG companion via `cairosvg` (works in any environment); the rebuilt-drawio path through the actual `draw.io` binary is opt-in via the `DRAWIO_EXE` env var (the binary is not bundled with the skill — install on demand).
CLI usage:
```bash
# Standard run (validators on by default)
python tools/oci_diagram_gen.py --spec my-spec.yaml --output out.drawio
# Fail the build if validator finds errors
python tools/oci_diagram_gen.py --spec my-spec.yaml --output out.drawio --strict
# Fidelity comparison vs canonical PNG
python tools/oci_diagram_gen.py --spec my-spec.yaml --output out.drawio \
--reference-png kb/diagram/reference-layouts/.../canonical.png
# Strict draw.io binary path (opt-in)
DRAWIO_EXE=/usr/bin/drawio python tools/oci_diagram_gen.py --spec ... --reference-png ...
```
Skip validators only when intentionally generating a fixture or test: `--no-validate`.
## Service categorization
| Category | Color | Use |
|----------|-------|-----|
| **Infrastructure** | Teal `#2D5967` | Compute, OKE, LB, Gateways, WAF, Bastion, Storage, Monitoring |
| **Database** | Copper `#AA643B` | ADB-S/D, DBCS, ExaCS, MySQL, PostgreSQL, NoSQL, GoldenGate |
| **Integration** | Purple `#804998` | DRG, Streaming, Queue, OIC, FastConnect, Service Connector Hub |
| **Dormant** | Light gray `#DFDCD8` | Standby/inactive resources (DR tier) |
| **Legacy** | Medium gray `#70665E` | Non-OCI systems (MQ Series, legacy middleware) |

View File

@@ -0,0 +1,78 @@
# WA Review Output Format
This document defines how option 5 (Well-Architected Review) presents its results.
Referenced from `SKILL.md` § Welcome Flow → Behavior Rules → option 5.
The WA review MUST produce **two layers of output**: (a) the formatted terminal scorecard shown to the user, and (b) the structured YAML files saved to disk. The terminal output is the primary deliverable — the YAML is the backing data. Never produce YAML-only output without the formatted scorecard.
## Terminal scorecard banner
```
══════════════════════════════════════════════════════
✅ OCI WELL-ARCHITECTED REVIEW — [Customer Name]
══════════════════════════════════════════════════════
Overall: [STATUS] — X/Y checks passed
HIGH: N │ MEDIUM: N │ LOW: N
══════════════════════════════════════════════════════
[emoji] SECURITY & COMPLIANCE X/Y passed
[emoji] RELIABILITY & RESILIENCE X/Y passed
[emoji] PERFORMANCE & COST X/Y passed
[emoji] OPERATIONAL EFFICIENCY X/Y passed
[emoji] DISTRIBUTED CLOUD X/Y passed | N/A
```
Pillar emoji: 🟢 all passed, 🟡 medium gaps only, 🔴 any HIGH gap, ⬜ N/A
## HIGH severity gaps table
Present all HIGH gaps grouped by pillar in a markdown table:
```
### HIGH severity gaps that must be addressed:
**[Pillar Name] (N HIGH)**
| ID | Gap | Fix |
|---|---|---|
| CHECK-ID | Finding description | Recommended action |
```
## MEDIUM and LOW gaps
- **MEDIUM gaps:** List as a compact bullet list grouped by pillar (ID + one-line finding + fix). Skip the table format to keep it concise.
- **LOW gaps:** Mention count only, list individual items only if ≤ 5.
## Analysis section
After the gap tables, add a "Why so many gaps?" paragraph if total gaps > 20, explaining the root cause (e.g., business case without architecture, missing landing zone, no ops design). This contextualizes the score for the SA.
## Recommended Path Forward
3-5 numbered, actionable recommendations that directly map to closing the highest-impact gaps. Reference skill options where applicable (e.g., "Generate the architecture — option 1 or 2").
## Files Generated
Always list the files saved at the end of the review:
```
📁 Files saved:
- examples/<customer>-wa-scorecard.yaml
- examples/<customer>-wa-architecture.yaml
- examples/<customer>-wa-workload-profile.yaml
```
## After WA Review menu
```
What do you want to do?
→ [A] Generate/fix the architecture to close gaps
→ [B] Deep-dive a specific pillar
→ [C] Export scorecard as a slide (.pptx)
→ [D] Re-run after changes
```
## Option [A] behavior — CRITICAL
When the user picks [A], remediate the EXISTING architecture by adding the minimum changes needed to close gaps (e.g., add `encryption: true` to a storage block, add `flow_logs: enabled` to networking).
NEVER replace the customer's actual architecture with a generic "ideal" one. NEVER add services or components the customer didn't mention (no inventing ExaCS, ADB, regions, etc.). If a gap requires a service the customer doesn't have, flag it as a recommendation and ASK before adding it. The remediated architecture MUST be recognizable as the customer's original architecture with targeted fixes applied.

26
evaluations/README.md Normal file
View File

@@ -0,0 +1,26 @@
# Evaluations
Baseline evaluation scenarios for the OCI Deal Accelerator skill, following
the format recommended in the [Anthropic Agent Skills best practices](https://platform.claude.com/docs/en/agents-and-tools/agent-skills/best-practices#build-evaluations-first).
These are **manual evaluations** — there is no automated test runner yet.
Use them as a regression checklist after non-trivial changes to `SKILL.md`,
`CLAUDE.md`, or the welcome flow.
## How to run
1. Open a fresh Claude Code conversation in this repo.
2. For each `*.json` file in this directory:
- Read the `query` field — paste it as the user message (or simulate the trigger described in the file).
- If `files` is non-empty, attach those files as context.
- Observe the assistant's behavior.
- Manually verify each item in `expected_behavior` is met.
3. Note any failures — file an issue or update the skill accordingly.
## Scenarios
| File | Purpose |
|---|---|
| `welcome-flow.json` | Greeting → exact 14-option menu (verbatim from SKILL.md) |
| `full-proposal.json` | Discovery notes → bypass menu, run full proposal flow |
| `wa-review.json` | WA review request → scorecard format + saved YAML files |

View File

@@ -0,0 +1,18 @@
{
"skills": ["oci-deal-accelerator"],
"query": "Customer: ACME Bank, retail banking, 200 branches across LATAM. Driver: migrating core banking from on-prem Exadata to OCI for cost reduction and DR. Current: 4-node RAC on X8M, ~12 TB DB, 2000 TPS peak, RTO 4h / RPO 15min. Compliance: PCI-DSS, local data residency. Timeline: 6 months. Budget: tight, exploring BYOL. They are also evaluating AWS RDS Custom for Oracle.",
"files": [],
"expected_behavior": [
"Detects this is discovery notes and skips the welcome menu (no 14-option list shown)",
"Goes directly into the full proposal flow (option 1 behavior)",
"Builds a workload profile reflecting ACME Bank's stated requirements (does NOT invent services they did not mention)",
"Recommends an architecture that addresses RTO/RPO, PCI-DSS, data residency, and BYOL — using kb/services/, kb/patterns/, and kb/well-architected/",
"Cites at least one Oracle Architecture Center reference architecture from kb/architecture-center/catalog.yaml when there is a strong match",
"Generates a slide deck (.pptx) as the primary deliverable, saved to examples/output-acme-bank-*/",
"Includes a Cost Estimate slide that distinguishes BYOL vs PAYG using kb/pricing/",
"Mentions the AWS RDS Custom for Oracle competitive context honestly using kb/competitive/aws-mapping.yaml",
"Does NOT add observability/security services that ACME did not request, beyond what is required for stated compliance",
"Asks clarifying questions when input is genuinely ambiguous, instead of inventing answers",
"Surfaces relevant gotchas from kb/field-knowledge/ (e.g., Exadata-to-cloud migration risks)"
]
}

View File

@@ -0,0 +1,20 @@
{
"skills": ["oci-deal-accelerator"],
"query": "5",
"follow_up": "Single-region OCI architecture: ADB-S 8 ECPU in São Paulo, 2 VM.Standard.E5.Flex web tier behind a public load balancer, Object Storage for media. No backups configured, no FastConnect. Customer: SmallShop, e-commerce, no compliance requirements stated.",
"files": [],
"expected_behavior": [
"After the user picks 5, asks for the architecture description (does not skip to scoring)",
"Reads docs/skill/wa-review-format.md before producing the scorecard",
"Parses the input into a workload profile YAML and architecture YAML",
"Runs scripts/validate-architecture.py with both files",
"Produces the formatted terminal scorecard with the exact banner format from docs/skill/wa-review-format.md (5 pillars, X/Y passed, HIGH/MEDIUM/LOW counts)",
"Saves three YAML files under examples/: <customer>-wa-scorecard.yaml, <customer>-wa-architecture.yaml, <customer>-wa-workload-profile.yaml",
"Lists the saved files at the end of the review",
"Identifies the obvious gaps (no backups, no DR, no monitoring, single-AD) as HIGH severity",
"Presents HIGH gaps as a markdown table grouped by pillar",
"Presents MEDIUM gaps as compact bullets, not a table",
"Offers the after-WA-review menu with options [A] [B] [C] [D]",
"If the user picks [A], remediates the EXISTING architecture (adds encryption, backups, etc. to the actual services SmallShop has) — does NOT replace it with a generic 'ideal' architecture, does NOT invent services SmallShop did not mention"
]
}

View File

@@ -0,0 +1,16 @@
{
"skills": ["oci-deal-accelerator"],
"query": "hola",
"files": [],
"expected_behavior": [
"Reads SKILL.md before showing anything to the user (does not improvise the menu from memory or folder structure)",
"Runs python tools/kb_freshness.py --check --json as a pre-flight step",
"If freshness reports stale files with refreshable=true, prepends a banner asking the user [y/N] before proceeding",
"If freshness reports stale files but none are refreshable, prepends a non-blocking informational banner without asking",
"Shows the welcome banner exactly as defined in SKILL.md (no paraphrasing)",
"Shows all 14 capability menu options in the correct 6 sections: DESIGN & PROPOSE (1-4), VALIDATE & CHECK (5-7), STRATEGY & BUSINESS (8), KNOWLEDGE BASE (9-11), ECAL GOVERNANCE (12), SA TOOLS (13-14)",
"Does NOT invent options that are not in SKILL.md",
"Does NOT omit options that are in SKILL.md",
"If the freshness tool errors out, falls back to showing the welcome message silently — never blocks the user on tooling failures"
]
}

View File

@@ -0,0 +1,89 @@
business_case:
customer_name: "Synthetic Commerce Co."
cover_subtitle: "ADB-S to ADB-D Migration Business Case"
prepared_by: "Diego Cabrera"
prepared_by_role: "Solutions Architect"
date: "2026-05-08"
executive_summary: >
Synthetic Commerce Co. is evaluating a move from ADB-S to ADB-D for a
fraud analytics workload where predictable performance, read-path cleanup,
and storage economics are more important than a pure near-term cost takeout.
drivers:
primary: "Stabilize fraud analytics performance while keeping the business case auditable."
urgency: "Validate capacity, TCO crossover, and migration bridge assumptions before procurement."
adbs_to_adbd:
license_model: BYOL
discount_pct: 0.11
ecpu_per_db_node: 760
current:
label: "ADB-S As-Is"
workload_ecpu: 2400
storage_tb: 96
read_architecture: "Refreshable/read clones serve application reads; standby is not the application read path."
target:
label: "ADB-D Dedicated"
workload_ecpu: 2400
storage_tb: 96
db_nodes: 5
storage_servers: 3
read_architecture: "Local ADG read-only standby serves application reads; steady-state clones retired."
forecasts:
- period: "24M"
display_label: "Year 2"
as_is:
workload_ecpu: 3150
storage_tb: 128
to_be:
workload_ecpu: 3150
storage_tb: 128
db_nodes: 6
storage_servers: 3
- period: "36M"
display_label: "Year 3"
as_is:
workload_ecpu: 3900
storage_tb: 166
to_be:
workload_ecpu: 3900
storage_tb: 166
db_nodes: 8
storage_servers: 3
goldengate:
mode: migration_bridge_only
ocpus: 4
bridge_months: 3
bridge_one_time_cost: 0
storage_economics:
base_break_even_tb: 91
business_impact:
business_impact_per_hour: 0
crossover_chart:
y_axis_min: 1.5
y_axis_max: 3.5
y_axis_major_unit: 0.5
roadmap:
total_duration: "12 weeks"
phases:
- name: "Define"
duration: "2 weeks"
deliverables: ["Baseline current BOM", "Confirm success metrics"]
- name: "Design"
duration: "4 weeks"
deliverables: ["Dedicated capacity plan", "Read-path validation"]
- name: "Deliver"
duration: "6 weeks"
deliverables: ["Migration bridge", "Cutover rehearsal"]
recommendation:
summary: "Proceed with detailed design for the ADB-D Dedicated target, validating the utilization, storage break-even, and GoldenGate bridge assumptions before final commercial approval."
next_steps:
- action: "Confirm workload ECPU demand and storage forecast"
owner: "Customer"
deadline: "Before design sign-off"
- action: "Validate ADB-D DB node and storage server reservation"
owner: "Oracle"
deadline: "Before procurement"
deck_validation:
forbidden_phrases:
- "OCI Annual"
- "FTE-year"
- "if 4x3 is selected"

View File

@@ -0,0 +1,378 @@
[
{
"title": "Deploy Oracle Autonomous Database on Oracle Database@Azure",
"url": "https://docs.oracle.com/en/solutions/deploy-autonomous-database-db-at-azure/index.html",
"type": "reference-architecture",
"date": "2024-10",
"services": [
"adb-s",
"adg",
"azure"
],
"tags": [
"database",
"multicloud",
"azure",
"ha-dr",
"autonomous"
],
"summary": "Multi-AZ deployment of ADB-S on Database@Azure with Autonomous Data Guard. Recommends VNet peering between app and DB VNets, TAC for availability, and ADG standby in a different AZ for automatic failover.\n",
"terraform": null
},
{
"title": "Oracle MAA for Oracle Database@Azure",
"url": "https://docs.oracle.com/en/solutions/oracle-maa-db-at-azure/index.html",
"type": "reference-architecture",
"date": "2025-05",
"services": [
"exacs",
"adg",
"vault",
"azure"
],
"tags": [
"database",
"multicloud",
"azure",
"ha-dr",
"autonomous"
],
"summary": "Cross-AZ Data Guard on ExaCS in Database@Azure. Active Data Guard recommended for cross-AZ replication (block repair, app continuity, read offload). Backups to Autonomous Recovery Service.\n",
"terraform": null
},
{
"title": "Implement disaster recovery with local and regional standbys on Oracle Database@Azure",
"url": "https://docs.oracle.com/en/solutions/local-regional-standby-dr-db-at-azure/index.html",
"type": "reference-architecture",
"date": "2025-05",
"services": [
"exacs",
"adg",
"azure",
"fsdr"
],
"tags": [
"database",
"multicloud",
"azure",
"ha-dr"
],
"summary": "Local standby for HA within same region, regional standby for DR across Azure regions. Uses Active Data Guard with Fast-Start Failover. Recommends Full Stack DR service for automated failover orchestration.\n",
"terraform": null
},
{
"title": "Implement disaster recovery with multi-region standby on Oracle Database@Azure",
"url": "https://docs.oracle.com/en/solutions/multi-region-standby-dr-db-at-azure/index.html",
"type": "reference-architecture",
"date": "2025-04",
"services": [
"exacs",
"adg",
"azure"
],
"tags": [
"database",
"multicloud",
"azure",
"ha-dr"
],
"summary": "Multi-region DR for ExaCS on Database@Azure using Data Guard. Cross-region standby with switchover/failover capabilities. Includes network topology for Azure-to-Azure cross-region connectivity.\n",
"terraform": null
},
{
"title": "Implement cross-region disaster recovery for Exadata Database on Oracle Database@Azure",
"url": "https://docs.oracle.com/en/solutions/exadb-dr-on-db-azure/index.html",
"type": "reference-architecture",
"date": "2025-01",
"services": [
"exacs",
"adg",
"azure",
"fsdr"
],
"tags": [
"database",
"multicloud",
"azure",
"ha-dr"
],
"summary": "Cross-region DR for ExaCS on Database@Azure. OCI-managed networks for peering (better performance, first 10 TB/month free). Data Guard for cross-region replication, FSDR for automated failover orchestration.\n",
"terraform": "https://github.com/oracle-quickstart/oci-multicloud-azure"
},
{
"title": "Deploy Active Data Guard Far Sync to protect data across Oracle Database@Azure regions",
"url": "https://docs.oracle.com/en/solutions/active-data-guard-far-sync-oracle-db-at-azure/index.html",
"type": "reference-architecture",
"date": "2025-02",
"services": [
"exacs",
"adg",
"azure"
],
"tags": [
"database",
"multicloud",
"azure",
"ha-dr"
],
"summary": "Far Sync instance for zero data loss protection across Azure regions. Synchronous redo transport to Far Sync, async to remote standby. Eliminates performance impact of synchronous shipping over long distances.\n",
"terraform": null
},
{
"title": "Implement Oracle Database Autonomous Recovery Service with Oracle Database@Azure",
"url": "https://docs.oracle.com/en/solutions/implement-recovery-service-db-at-azure/index.html",
"type": "reference-architecture",
"date": "2025-01",
"services": [
"exacs",
"azure"
],
"tags": [
"database",
"multicloud",
"azure",
"ha-dr"
],
"summary": "Autonomous Recovery Service for ExaCS backups on Database@Azure. Automated backup management with real-time protection and point-in-time recovery capabilities.\n",
"terraform": null
},
{
"title": "Deploy Oracle Autonomous Database on Oracle Database@Google Cloud",
"url": "https://docs.oracle.com/en/solutions/deploy-adb-db-at-google-cloud/index.html",
"type": "reference-architecture",
"date": "2025-03",
"services": [
"adb-s",
"adg",
"google-cloud"
],
"tags": [
"database",
"multicloud",
"ha-dr",
"autonomous"
],
"summary": "ADB-S on Database@Google Cloud with cross-region ADG. Non-overlapping CIDR between VPC and VCN required. App tier should span 2+ AZs with Google Global Load Balancer for failover.\n",
"terraform": null
},
{
"title": "Deploy Active Data Guard Far Sync to protect data across Oracle Database@AWS regions",
"url": "https://docs.oracle.com/en/solutions/dr-active-dg-farsync-db-at-aws/index.html",
"type": "reference-architecture",
"date": "2025-09",
"services": [
"exacs",
"adg",
"aws"
],
"tags": [
"database",
"multicloud",
"aws",
"ha-dr"
],
"summary": "Far Sync instance for zero data loss protection across AWS regions. Synchronous redo to local Far Sync, asynchronous to remote standby. Requires cross-region AWS networking for redo transport.\n",
"terraform": null
},
{
"title": "Implement disaster recovery with local and regional standbys on Oracle Database@AWS",
"url": "https://docs.oracle.com/en/solutions/dr-local-regional-standby-db-at-aws/index.html",
"type": "reference-architecture",
"date": "2025-09",
"services": [
"exacs",
"adg",
"aws",
"fsdr"
],
"tags": [
"database",
"multicloud",
"aws",
"ha-dr"
],
"summary": "Local standby for HA within same AWS region, regional standby for DR. Active Data Guard with Fast-Start Failover for automated failover. Full Stack DR service for cross-service failover orchestration.\n",
"terraform": null
},
{
"title": "Implement disaster recovery with cross-zonal Data Guard on Oracle Database@AWS",
"url": "https://docs.oracle.com/en/solutions/cross-zone-dr-db-at-aws/index.html",
"type": "reference-architecture",
"date": "2025-08",
"services": [
"exacs",
"adg",
"aws"
],
"tags": [
"database",
"multicloud",
"aws",
"ha-dr"
],
"summary": "Cross-AZ Data Guard on Database@AWS for HA. Synchronous redo transport between AZs for zero data loss. Fast-Start Failover for automatic database switchover on failure.\n",
"terraform": null
},
{
"title": "Implement disaster recovery with cross-regional Data Guard on Oracle Database@AWS",
"url": "https://docs.oracle.com/en/solutions/implement-dr-cross-region-dg-odb-aws/index.html",
"type": "reference-architecture",
"date": "2025-08",
"services": [
"exacs",
"adg",
"aws"
],
"tags": [
"database",
"multicloud",
"aws",
"ha-dr"
],
"summary": "Cross-region Data Guard on Database@AWS for DR. Asynchronous redo transport for cross-region replication. Planned switchover for maintenance, forced failover for disaster scenarios.\n",
"terraform": null
},
{
"title": "Migrate Oracle RAC Databases to OCI",
"url": "https://docs.oracle.com/en/solutions/ensure-ha-migrate-vmware-workloads-to-oci/migrate-oracle-rac-databases1.html",
"type": "reference-architecture",
"date": "2025-01",
"services": [
"exacs",
"exascale",
"adb-d",
"base-db"
],
"tags": [
"database",
"migration",
"ha-dr"
],
"summary": "Compares 4 RAC migration targets: ExaCS Dedicated, Exascale, ADB-D, and 2-node RAC on Base DB. ExaCS recommended for full RAC feature parity. Exascale for 23ai-only without dedicated infra commitment.\n",
"terraform": null
},
{
"title": "Deploy ORDS with High Availability on OCI",
"url": "https://docs.oracle.com/en/solutions/deploy-ords-ha-oci/index.html",
"type": "reference-architecture",
"date": "2025-06",
"services": [
"compute",
"load-balancer",
"adb-s",
"bastion"
],
"tags": [
"database",
"application",
"ha-dr"
],
"summary": "Multi-instance ORDS behind OCI Load Balancer for HA REST access to Oracle DB. Works with ADB-S, DBCS, or ExaCS. Recommends DB in private subnet, ORDS in public with granular NSG rules.\n",
"terraform": null
},
{
"title": "Configure Data Guard for Oracle Exadata Database Service on Dedicated Infrastructure",
"url": "https://docs.oracle.com/en/solutions/dataguard-exadata-dedicated-infrastructure/index.html",
"type": "reference-architecture",
"date": "2025-07",
"services": [
"exacs",
"adg"
],
"tags": [
"database",
"ha-dr"
],
"summary": "Data Guard configuration for ExaCS Dedicated. Active Data Guard for read offload and automatic failover. Cross-region standby for DR with Fast-Start Failover for automated switchover.\n",
"terraform": null
},
{
"title": "Back up from Exadata on Dedicated Infrastructure to Zero Data Loss Autonomous Recovery",
"url": "https://docs.oracle.com/en/solutions/back-up-exadata-dedicated-zero-data-loss-recovery/index.html",
"type": "reference-architecture",
"date": "2025-07",
"services": [
"exacs"
],
"tags": [
"database",
"ha-dr"
],
"summary": "Autonomous Recovery Service for ExaCS backups. Automated backup management with real-time redo protection. Validates backup recoverability automatically.\n",
"terraform": null
},
{
"title": "Configure a standby database for disaster recovery using Oracle Exadata Database Service on Cloud@Customer",
"url": "https://docs.oracle.com/en/solutions/exadata-cloud-at-customer-standby/index.html",
"type": "reference-architecture",
"date": "2025-07",
"services": [
"exacs",
"adg"
],
"tags": [
"database",
"ha-dr"
],
"summary": "Data Guard standby on ExaCS Cloud@Customer for hybrid DR. On-premises primary with cloud standby, or cloud primary with on-premises standby for data sovereignty requirements.\n",
"terraform": null
},
{
"title": "Learn about maximum availability architecture for PeopleSoft",
"url": "https://docs.oracle.com/en/solutions/learn-about-maa-for-peoplesoft/index.html",
"type": "reference-architecture",
"date": "2024-08",
"services": [
"exacs",
"adg",
"load-balancer",
"compute"
],
"tags": [
"application",
"ha-dr",
"peoplesoft"
],
"summary": "MAA for PeopleSoft on OCI. Active Data Guard for database HA/DR, multi-instance PIA behind Load Balancer, Process Scheduler on multiple nodes for batch processing resilience.\n",
"terraform": null
},
{
"title": "Provision and deploy a maximum availability solution for PeopleSoft on Oracle Cloud",
"url": "https://docs.oracle.com/en/solutions/deploy-maa-for-peoplesoft-on-oci/index.html",
"type": "reference-architecture",
"date": "2024-08",
"services": [
"exacs",
"adg",
"load-balancer",
"compute"
],
"tags": [
"application",
"ha-dr",
"peoplesoft"
],
"summary": "Step-by-step PeopleSoft MAA deployment on OCI. Terraform stacks for infrastructure provisioning, Data Guard configuration, and PeopleSoft application tier setup.\n",
"terraform": null
},
{
"title": "Run PeopleSoft ERP and Autonomous Database in an HA multicloud deployment",
"url": "https://docs.oracle.com/en/solutions/bread-multicloud-on-oci/index.html",
"type": "reference-architecture",
"date": "2025-02",
"services": [
"adb-s",
"compute",
"load-balancer"
],
"tags": [
"application",
"ha-dr",
"multicloud",
"peoplesoft",
"autonomous"
],
"summary": "PeopleSoft HA with ADB-S across cloud providers. Application tier on OCI compute with database on ADB-S. Multi-AZ deployment for high availability with automatic failover.\n",
"terraform": null
}
]

View File

@@ -0,0 +1,195 @@
<mxfile host="app.diagrams.net" agent="OCI Deal Accelerator" version="24.0.0" type="device">
<diagram name="OCI Architecture" id="oci-arch">
<mxGraphModel dx="1900" dy="1200" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="1900" pageHeight="1200" background="#FFFFFF" math="0" shadow="0">
<root>
<mxCell id="0" />
<mxCell id="1" parent="0" />
<mxCell id="139766084988960" value="" style="group;whiteSpace=wrap;rounded=0;fillColor=none;strokeColor=none;dashed=0;connectable=1;pointerEvents=1;" vertex="1" parent="1">
<mxGeometry x="30" y="250" width="50" height="60" as="geometry" />
</mxCell>
<mxCell id="139766136148656" value="MELI&#xa;Applications" style="text;whiteSpace=wrap;rounded=0;fillColor=none;strokeColor=none;dashed=0;html=1;align=center;verticalAlign=top;fontFamily=Oracle Sans;fontSize=11;fontColor=#312D2A;" vertex="1" parent="139766084988960">
<mxGeometry x="-10" y="48" width="70" height="20" as="geometry" />
</mxCell>
<mxCell id="139766084989440" value="AWS&#xa;(Current State)" style="whiteSpace=wrap;rounded=1;fillColor=none;strokeColor=#70665E;dashed=1;html=1;strokeWidth=2;dashPattern=6 4;align=left;fontFamily=Oracle Sans;verticalAlign=top;fontColor=#70665E;fontSize=12;spacingLeft=5;spacingTop=5;arcSize=6;" vertex="1" parent="1">
<mxGeometry x="10" y="80" width="220" height="180" as="geometry" />
</mxCell>
<mxCell id="139766084990064" value="DynamoDB&#xa;30K Tables&#xa;70M RPM Peak" style="whiteSpace=wrap;rounded=1;fillColor=#FCFBFA;strokeColor=#2D5967;dashed=0;html=1;strokeWidth=1.5;fontColor=#2D5967;fontSize=11;fontFamily=Oracle Sans;arcSize=8;verticalAlign=middle;align=center;" vertex="1" parent="139766084989440">
<mxGeometry x="30" y="60" width="160" height="80" as="geometry" />
</mxCell>
<mxCell id="139766084989248" value="Oracle Cloud Infrastructure" style="whiteSpace=wrap;rounded=1;fillColor=none;strokeColor=#9E9892;dashed=1;html=1;strokeWidth=1;dashPattern=6 4;align=left;fontFamily=Oracle Sans;verticalAlign=top;fontColor=#312D2A;fontSize=13;fontStyle=1;spacingLeft=10;spacingTop=8;arcSize=1;" vertex="1" parent="1">
<mxGeometry x="280" y="80" width="1100" height="520" as="geometry" />
</mxCell>
<mxCell id="139766084990976" value="Region — São Paulo" style="whiteSpace=wrap;rounded=1;fillColor=#F5F4F2;strokeColor=#9E9892;dashed=0;html=1;align=left;fontFamily=Oracle Sans;verticalAlign=top;arcSize=5;fontColor=#312D2A;fontSize=13;fontStyle=1;spacingLeft=10;spacingTop=8;" vertex="1" parent="139766084989248">
<mxGeometry x="15" y="40" width="1070" height="460" as="geometry" />
</mxCell>
<mxCell id="139766084991984" value="VCN KVS Production (10.0.0.0/16)" style="whiteSpace=wrap;rounded=0;fillColor=none;strokeColor=#AE562C;dashed=1;html=1;strokeWidth=2;dashPattern=6 4;align=left;fontFamily=Oracle Sans;verticalAlign=top;fontColor=#AE562C;perimeterSpacing=0;fontSize=12;fontStyle=1;spacingLeft=8;spacingTop=6;" vertex="1" parent="139766084990976">
<mxGeometry x="15" y="45" width="1040" height="400" as="geometry" />
</mxCell>
<mxCell id="139766084992656" value="Application Subnet (Private) — 10.0.1.0/24" style="whiteSpace=wrap;rounded=0;fillColor=none;strokeColor=#AE562C;dashed=1;html=1;strokeWidth=1;dashPattern=6 4;align=left;fontFamily=Oracle Sans;verticalAlign=top;fontColor=#AE562C;fontSize=11;fontStyle=1;spacingLeft=8;spacingTop=4;" vertex="1" parent="139766084991984">
<mxGeometry x="8" y="32" width="1024" height="140" as="geometry" />
</mxCell>
<mxCell id="139766069527424" value="" style="group;whiteSpace=wrap;rounded=0;fillColor=none;strokeColor=none;dashed=0;pointerEvents=1;connectable=1;" vertex="1" parent="139766084992656">
<mxGeometry x="246" y="30" width="160" height="44" as="geometry" />
</mxCell>
<mxCell id="139766122318064" value="OCI NoSQL&#xa;Service Endpoint" style="text;whiteSpace=wrap;rounded=0;fillColor=none;strokeColor=none;dashed=0;html=1;overflow=visible;align=center;verticalAlign=top;fontFamily=Oracle Sans;fontSize=11;fontColor=#312D2A;spacingTop=2;" vertex="1" parent="139766084992656">
<mxGeometry x="246" y="76" width="160" height="36" as="geometry" />
</mxCell>
<mxCell id="139766069534000" value="" style="group;whiteSpace=wrap;rounded=0;fillColor=none;strokeColor=none;dashed=0;pointerEvents=1;connectable=1;" vertex="1" parent="139766084992656">
<mxGeometry x="422" y="30" width="180" height="28" as="geometry" />
</mxCell>
<mxCell id="139766111346400" value="NoSQL&#xa;Elastic Pod Dedicated&#xa;(Isolated Compute)" style="text;whiteSpace=wrap;rounded=0;fillColor=none;strokeColor=none;dashed=0;html=1;overflow=visible;align=center;verticalAlign=top;fontFamily=Oracle Sans;fontSize=11;fontColor=#312D2A;spacingTop=2;" vertex="1" parent="139766084992656">
<mxGeometry x="422" y="60" width="180" height="52" as="geometry" />
</mxCell>
<mxCell id="139766069536112" value="" style="group;whiteSpace=wrap;rounded=0;fillColor=none;strokeColor=none;dashed=0;pointerEvents=1;connectable=1;" vertex="1" parent="139766084992656">
<mxGeometry x="618" y="30" width="160" height="28" as="geometry" />
</mxCell>
<mxCell id="139766108726976" value="NoSQL Tables&#xa;30K Tables&#xa;70M RPM Peak" style="text;whiteSpace=wrap;rounded=0;fillColor=none;strokeColor=none;dashed=0;html=1;overflow=visible;align=center;verticalAlign=top;fontFamily=Oracle Sans;fontSize=11;fontColor=#312D2A;spacingTop=2;" vertex="1" parent="139766084992656">
<mxGeometry x="618" y="60" width="160" height="52" as="geometry" />
</mxCell>
<mxCell id="139766084986608" value="AI Memory Subnet (Private) — 10.0.3.0/24" style="whiteSpace=wrap;rounded=0;fillColor=none;strokeColor=#AE562C;dashed=1;html=1;strokeWidth=1;dashPattern=6 4;align=left;fontFamily=Oracle Sans;verticalAlign=top;fontColor=#AE562C;fontSize=11;fontStyle=1;spacingLeft=8;spacingTop=4;" vertex="1" parent="139766084991984">
<mxGeometry x="8" y="186" width="1024" height="140" as="geometry" />
</mxCell>
<mxCell id="139766069531888" value="Oracle ADB-S 23ai&#xa;AI Vector Search&#xa;(Agent Memory)" style="whiteSpace=wrap;rounded=1;fillColor=#FCFBFA;strokeColor=#2D5967;dashed=0;html=1;strokeWidth=1.5;fontColor=#2D5967;fontSize=11;fontFamily=Oracle Sans;arcSize=8;verticalAlign=middle;align=center;" vertex="1" parent="139766084986608">
<mxGeometry x="266" y="30" width="180" height="80" as="geometry" />
</mxCell>
<mxCell id="139766069540912" value="OCI GenAI&#xa;Embedding&#xa;Service" style="whiteSpace=wrap;rounded=1;fillColor=#FCFBFA;strokeColor=#2D5967;dashed=0;html=1;strokeWidth=1.5;fontColor=#2D5967;fontSize=11;fontFamily=Oracle Sans;arcSize=8;verticalAlign=middle;align=center;" vertex="1" parent="139766084986608">
<mxGeometry x="462" y="30" width="140" height="80" as="geometry" />
</mxCell>
<mxCell id="139766069542640" value="" style="group;whiteSpace=wrap;rounded=0;fillColor=none;strokeColor=none;dashed=0;pointerEvents=1;connectable=1;" vertex="1" parent="139766084986608">
<mxGeometry x="618" y="30" width="140" height="44" as="geometry" />
</mxCell>
<mxCell id="139766069542784" value="OCI Functions&#xa;Memory Sync" style="text;whiteSpace=wrap;rounded=0;fillColor=none;strokeColor=none;dashed=0;html=1;overflow=visible;align=center;verticalAlign=top;fontFamily=Oracle Sans;fontSize=11;fontColor=#312D2A;spacingTop=2;" vertex="1" parent="139766084986608">
<mxGeometry x="618" y="76" width="140" height="36" as="geometry" />
</mxCell>
<mxCell id="139766084817968" value="Management Subnet (Private) — 10.0.2.0/24" style="whiteSpace=wrap;rounded=0;fillColor=none;strokeColor=#AE562C;dashed=1;html=1;strokeWidth=1;dashPattern=6 4;align=left;fontFamily=Oracle Sans;verticalAlign=top;fontColor=#AE562C;fontSize=11;fontStyle=1;spacingLeft=8;spacingTop=4;" vertex="1" parent="139766084991984">
<mxGeometry x="8" y="340" width="1024" height="120" as="geometry" />
</mxCell>
<mxCell id="139766069584112" value="" style="group;whiteSpace=wrap;rounded=0;fillColor=none;strokeColor=none;dashed=0;pointerEvents=1;connectable=1;" vertex="1" parent="139766084817968">
<mxGeometry x="384" y="30" width="120" height="34" as="geometry" />
</mxCell>
<mxCell id="139766084991408" value="OCI&#xa;Monitoring" style="text;whiteSpace=wrap;rounded=0;fillColor=none;strokeColor=none;dashed=0;html=1;overflow=visible;align=center;verticalAlign=top;fontFamily=Oracle Sans;fontSize=11;fontColor=#312D2A;spacingTop=2;" vertex="1" parent="139766084817968">
<mxGeometry x="384" y="66" width="120" height="36" as="geometry" />
</mxCell>
<mxCell id="139766069586800" value="" style="group;whiteSpace=wrap;rounded=0;fillColor=none;strokeColor=none;dashed=0;pointerEvents=1;connectable=1;" vertex="1" parent="139766084817968">
<mxGeometry x="520" y="30" width="120" height="34" as="geometry" />
</mxCell>
<mxCell id="139766132774896" value="OCI&#xa;Logging" style="text;whiteSpace=wrap;rounded=0;fillColor=none;strokeColor=none;dashed=0;html=1;overflow=visible;align=center;verticalAlign=top;fontFamily=Oracle Sans;fontSize=11;fontColor=#312D2A;spacingTop=2;" vertex="1" parent="139766084817968">
<mxGeometry x="520" y="66" width="120" height="36" as="geometry" />
</mxCell>
<mxCell id="139766069591360" value="" style="group;whiteSpace=wrap;rounded=0;fillColor=none;strokeColor=none;dashed=0;pointerEvents=1;connectable=1;" vertex="1" parent="139766084991984">
<mxGeometry x="10" y="40" width="110" height="34" as="geometry" />
</mxCell>
<mxCell id="139766069586224" value="Service&#xa;Gateway" style="text;whiteSpace=wrap;rounded=0;fillColor=none;strokeColor=none;dashed=0;html=1;overflow=visible;align=center;verticalAlign=top;fontFamily=Oracle Sans;fontSize=11;fontColor=#312D2A;spacingTop=2;" vertex="1" parent="139766084991984">
<mxGeometry x="10" y="76" width="110" height="36" as="geometry" />
</mxCell>
<mxCell id="139766084992224" style="elbow=vertical;endFill=0;startFill=0;labelBackgroundColor=#FFFFFF;labelBorderColor=none;fontFamily=Oracle Sans;fontSize=10;fontColor=#312D2A;edgeStyle=orthogonalEdgeStyle;orthogonalLoop=1;rounded=1;jettySize=auto;startArrow=none;endArrow=open;strokeColor=#312D2A;strokeWidth=1;endSize=6;fontFamily=Oracle Sans;fontSize=10;fontColor=#312D2A;labelBackgroundColor=#FFFFFF;" edge="1" parent="1" source="139766084988960" target="139766084990064" value="Current: SDK calls">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="139766084992896" style="elbow=vertical;endFill=0;startFill=0;labelBackgroundColor=#FFFFFF;labelBorderColor=none;fontFamily=Oracle Sans;fontSize=10;fontColor=#312D2A;edgeStyle=orthogonalEdgeStyle;orthogonalLoop=1;rounded=1;jettySize=auto;startArrow=none;endArrow=open;strokeColor=#312D2A;strokeWidth=1;endSize=6;fontFamily=Oracle Sans;fontSize=10;fontColor=#312D2A;labelBackgroundColor=#FFFFFF;" edge="1" parent="1" source="139766084988960" target="139766069527424" value="Target: OCI NoSQL SDK">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="139766108632320" style="elbow=vertical;endFill=0;startFill=0;labelBackgroundColor=#FFFFFF;labelBorderColor=none;fontFamily=Oracle Sans;fontSize=10;fontColor=#312D2A;edgeStyle=orthogonalEdgeStyle;orthogonalLoop=1;rounded=1;jettySize=auto;startArrow=none;endArrow=open;strokeColor=#312D2A;strokeWidth=1;endSize=6;fontFamily=Oracle Sans;fontSize=10;fontColor=#312D2A;labelBackgroundColor=#FFFFFF;" edge="1" parent="1" source="139766069527424" target="139766069536112" value="R/W Operations">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="139766069577392" style="elbow=vertical;endFill=0;startFill=0;labelBackgroundColor=#FFFFFF;labelBorderColor=none;fontFamily=Oracle Sans;fontSize=10;fontColor=#312D2A;edgeStyle=orthogonalEdgeStyle;orthogonalLoop=1;rounded=1;jettySize=auto;startArrow=none;endArrow=open;strokeColor=#312D2A;strokeWidth=1;endSize=6;fontFamily=Oracle Sans;fontSize=10;fontColor=#312D2A;labelBackgroundColor=#FFFFFF;" edge="1" parent="1" source="139766069591360" target="139766069527424" value="Private access">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="139766069591456" style="elbow=vertical;endFill=0;startFill=0;labelBackgroundColor=#FFFFFF;labelBorderColor=none;fontFamily=Oracle Sans;fontSize=10;fontColor=#312D2A;edgeStyle=orthogonalEdgeStyle;orthogonalLoop=1;rounded=1;jettySize=auto;startArrow=none;endArrow=open;strokeColor=#312D2A;strokeWidth=1;endSize=6;fontFamily=Oracle Sans;fontSize=10;fontColor=#312D2A;labelBackgroundColor=#FFFFFF;" edge="1" parent="1" source="139766069534000" target="139766069536112" value="Dedicated&#xa;Infrastructure">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="139766069532176" style="elbow=vertical;endFill=0;startFill=0;labelBackgroundColor=#FFFFFF;labelBorderColor=none;fontFamily=Oracle Sans;fontSize=10;fontColor=#312D2A;edgeStyle=orthogonalEdgeStyle;orthogonalLoop=1;rounded=1;jettySize=auto;startArrow=none;endArrow=open;strokeColor=#312D2A;strokeWidth=1;endSize=6;fontFamily=Oracle Sans;fontSize=10;fontColor=#312D2A;labelBackgroundColor=#FFFFFF;" edge="1" parent="1" source="139766069536112" target="139766069542640" value="Memory Sync&#xa;(hot → warm)">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="139766069537168" style="elbow=vertical;endFill=0;startFill=0;labelBackgroundColor=#FFFFFF;labelBorderColor=none;fontFamily=Oracle Sans;fontSize=10;fontColor=#312D2A;edgeStyle=orthogonalEdgeStyle;orthogonalLoop=1;rounded=1;jettySize=auto;startArrow=none;endArrow=open;strokeColor=#312D2A;strokeWidth=1;endSize=6;fontFamily=Oracle Sans;fontSize=10;fontColor=#312D2A;labelBackgroundColor=#FFFFFF;" edge="1" parent="1" source="139766069542640" target="139766069531888" value="Vectorize &amp;&#xa;Store">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="139766069532272" style="elbow=vertical;endFill=0;startFill=0;labelBackgroundColor=#FFFFFF;labelBorderColor=none;fontFamily=Oracle Sans;fontSize=10;fontColor=#312D2A;edgeStyle=orthogonalEdgeStyle;orthogonalLoop=1;rounded=1;jettySize=auto;startArrow=none;endArrow=open;strokeColor=#312D2A;strokeWidth=1;endSize=6;fontFamily=Oracle Sans;fontSize=10;fontColor=#312D2A;labelBackgroundColor=#FFFFFF;" edge="1" parent="1" source="139766069540912" target="139766069531888" value="Embeddings">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="139766084991024" value="MELI KVS — OCI NoSQL Architecture" style="text;whiteSpace=wrap;rounded=0;dashed=0;html=1;fontSize=18;fontColor=#312D2A;fontFamily=Oracle Sans;align=center;verticalAlign=middle;fontStyle=1;" vertex="1" parent="1">
<mxGeometry x="0" y="8" width="1380" height="35" as="geometry" />
</mxCell>
<mxCell id="1002" value="" style="ellipse;fillColor=none;strokeColor=#2D5967;strokeWidth=2;" vertex="1" parent="139766084988960"><mxGeometry x="14" y="0" width="22" height="22" as="geometry"/></mxCell>
<mxCell id="1003" value="" style="shape=mxgraph.basic.arc;dx=0.5;fillColor=none;strokeColor=#2D5967;strokeWidth=2;rotation=180;" vertex="1" parent="139766084988960"><mxGeometry x="9" y="24" width="32" height="22" as="geometry"/></mxCell>
<mxCell id="nosql_endpoint_i2" parent="139766069527424" style="vsdxID=4;fillColor=none;gradientColor=none;strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" vertex="1"><mxGeometry as="geometry" height="28.65116279069762" width="25.92248062015499" x="67.03875968992253" y="7.755381177908675e-14" /></mxCell>
<mxCell id="nosql_endpoint_i3" parent="nosql_endpoint_i2" style="vsdxID=5;fillColor=#FCFBFA;gradientColor=none;shape=stencil(lZTRcoMgEEW/htcdYAHlOU3+I9OY6tRqxpg2/fviQHXBEds3WO56rrC7DA/3+nyrmOT3cejfq6/mMtYMX5iUTVdXQzO6FcMjw8O1H6q3oX90F7+/nSfltProP6cvPH2e5lOK5N9+K7jfn7z29TF4sfDHSkEpQoKIM/hT+gAH/isJEWvBYBDhShQipYHCUHbbdMQnSQhcBdrmvPLEpwKFidPYplPIcs+mEwn5HyyCVXksQqF3sQjaZLFLSoggGBODpQGrYziPwXM1ID3eQBYIXMfMpBTcw1sbA4krXIv++rdz0ZFrni9Rphq5fooMe++B12xSN5tsUn1ZdlzTcQ/QjI2mSc3SlCVkkkbQGpKWXbp6ozKSQREbzQ8Vt1im0bVpWz/M6Hk6vVzITz48/gA=);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" vertex="1"><mxGeometry as="geometry" height="27.968992248061962" width="25.24031007751933" x="0.3410852713178288" y="0.3410852713178288" /></mxCell>
<mxCell id="nosql_endpoint_i4" parent="nosql_endpoint_i2" style="vsdxID=6;fillColor=#FCFBFA;gradientColor=none;shape=stencil(lVbRcsIgEPyavDJwFwh5tu1/ODXWTK1xorb270tKYg5uAvEtnrvswS07FLi5HLbnpgB5ufbdZ/PT7q6HAl8KgPZ0aPr26r4KfC1ws+/65qPvbqed/33eDsjh66v7Hla4e56WQqqBBfLXV0Cg/S+8efz7rfcE5f+vQNiRoCKGvIOv1JVAM4LGkhGqHEHIQWNJlaLElPjAqUJ1xzHI5atQ3qEs5vW1kPCsvhbK5PW1gHqNfrj/Y3siw6IMX7Fa2OS0KGUquVbKsGFjWMOOaCBsmHoFY9SCPqIwZaRPVobJQSayC20SGQgXdh8eFyEsHG/cLbBm6dyAgYBbYLHZrLccRTNrW2TiOhIn/l8Wz10sQlHswk7alVB1KE6u/rJJ4kQJp5RPoFxiydTGSsWOVYbbIus9Kia6q3xT2ROVPKZUJMwGWa2RrZMXPpZ11sS0rHO4zcqmg4mNJJtLhDHFQi0wOiA6u6lbKYuc3ybMgrS2LBLnVWOZRx6R7jDGrIujGb8yjWYCCSOTaXQYOGQazZqIK/Mk4srO4XnhJ7dMriLw8YWOTlgiMEQufwKw+5jfTvv2ePRPL/p//NZyJf9Ow9c/);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" vertex="1"><mxGeometry as="geometry" height="28.65116279069762" width="25.92248062015499" /></mxCell>
<mxCell id="nosql_endpoint_i5" parent="nosql_endpoint_i2" style="vsdxID=7;fillColor=#2d5967;gradientColor=none;shape=stencil(lVPbDoIwDP2avTZbyxg8e/kPoyiLCGbg7e+FdMq2BBPfejntOe06Qau+3l0rgbIfXHeuHvYw1ILWAtG2deXsMFqCNoJWx85VJ9fd2gP7192EnKxLd586PLlOSTnVoHyxz96WofubY6ziZJGBRA/3IQ0lceSJHMkNoPIgHypBGQ8iX/ZhpQSxwEwIpoyZg6aeRo1iipg5kEfhgF/iaN7GtsFq4sWUEjD/JVEVoLJEooFkOaRB61ji9wWWdvMBLPDmGWQ65p1beo5CgcmTN5m1UXoKtDByvJ+fp/MHdDTm6zzapuHjDvPpNY8h/gm0eQM=);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" vertex="1"><mxGeometry as="geometry" height="1.0232558139534864" width="6.480620155038747" x="9.550387596899206" y="19.78294573643407" /></mxCell>
<mxCell id="nosql_endpoint_i6" parent="nosql_endpoint_i2" style="vsdxID=8;fillColor=#2d5967;gradientColor=none;shape=stencil(lVPRkoIwDPyavmbahFL67Ol/OCdK5zhwKnr494Kp0nLizb2lyya7TRdBq1O1PZYC5anz7Vf543ZdJehDILqmKr3rhkrQWtBq3/ry4Ntzs+PzcTsyx+q7vYwTeu6TYwfKK5+sBDR3ZMPkz7NntmKCKkBloSVA1gAx0iMjpEHrQAqQkkGoJwb0Q5hSwoJunkGmU91pZNAoFJg8lY28zXSewr+uXLsm2s/Ej/e14LLIQGLqUoPVqc3cAKqZTVD2/XqejAVlQjB29i7T0McjDGaKVDmyR2kg6MV909X8EZ1/kYdiSuje1TUHPP4+T/QA8d9A6xs=);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" vertex="1"><mxGeometry as="geometry" height="1.0232558139534864" width="6.480620155038747" x="9.550387596899206" y="13.302325581395323" /></mxCell>
<mxCell id="nosql_endpoint_i7" parent="nosql_endpoint_i2" style="vsdxID=9;fillColor=#2d5967;gradientColor=none;shape=stencil(lVhdd9sgDP01edUBhPl47rr/0bOma866pidNt/bfT54NCGEb5y3Bku9FV0jCB7x7f354Ox6Mer9ezr+Of0+P1+cDfjsYc3p9Pl5OV/p1wPsD3j2dL8efl/PH6+P0/+1htBx//T7/Gd/wOfnFCDGOXkZ9TSvagBv+r3yfHH58XCYP3brMSwhxclGfZlrxFpSbjeYlNVvg9HeY/38hf7yCaQaItsZUNaACpWs8RgobG9y5WVWDkn1wArhG1QjKd2ERjL8FFsGaHuzgdsBWqC+nV5YKzH5aCB7cNsvikXLDg0gENDNmoao6mZAMVlCdBxThUSIZeIqahhm2Rriy4zpCC4dFRFRyzcyYkoNIoGJjWrXXuXZzaAk7p+YqNkvwDWx5bLpxkg51FQq0F1s5ROKxeTC9ARxE8lmIWO/P6fLilAhUSrRMQNDiqJCVD1v4GPJrMv7Q4BsP3gh829Ql7cA7gd/bv0vPC7zKWAneghPoIeSwJXRmtO8YMIeZS+hUUU2VQrD1GlQUyUjxq9mSyC7UbI2GKOh6THtapMs9Zr4R9BZdw/JB5y0GwZYiGWq6ZNRXloz0jco6B6qrrENweOgo6wzEW5S1dq61+4W1tGXbE9ZS8ATZBWFtvEVV4uo3A7sgK/lY0bAWdCUr3RfWImxWjFZXq9M529AVY6rzG7pSNZqX9ulKm7Rmiyz1Cu1qtjRQ6Zos9XaFNVsa1Bq2EYLoH8Vqvcd7ESz+5lTMXBMtRrJUci2UanYv2hfzWAlvMxMPTbi4bqn0m5Kzpk2BVH0xn/a9qRU0iOmYp2wqpjFDscS2IrG9L2mK2cpv1FfusXRuG7K0mSDY0pkTBS5E8CK3xsoiisaCuLJk9bRtSuIObXmtXdeWl+11bbv9oBWX9Zl1bVnHWpdWdsKesk2r3SHu2MTlwW3FHecBwXdB3GbS6KnbvcPEUlYSYT4jJXVJNzlHsnGrqKuxJtzMcTXhHYPvzQ71aJ0vV6kTmM1CRgOzFrcr2wxqpKgR8g25tfJg1LHwYLY/LGBGyjNt0565XqljawiihnKrvVf9hUwYb2LynDOSZbwJQ2/z1HNU70JjROTHgUWEnuuTWh7dcZoLTQ1OJmrzFFCDCxJcp1ThtxlZZYiiOAQLk1F37665S/GY5tFI1oxRnhqc2eyVnbnonE8y6oWfaRJzfd+9hOfx1Pkc1dBcmRwIWSml3vKU1zWkUxLoR/la+HR6eZk+NvLn8usiLU1fJvH+Hw==);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" vertex="1"><mxGeometry as="geometry" height="27.286821705426302" width="24.558139534883672" x="0.6821705426356576" y="0.6821705426356576" /></mxCell>
<mxCell id="nosql_endpoint_i8" parent="nosql_endpoint_i2" style="vsdxID=10;fillColor=#2d5967;gradientColor=none;shape=stencil(lZbbUsMgEIafJrc7wMIC1x7ew9FqM9bWSevp7SUSCAuV6h0hu/l+9hQGvDpu7143gxLH03R43nyMD6ftgNeDUuN+u5nGU1gNeDPg1eNh2jxNh7f9Q3x+vZst59XL4X3+wmf0swasnr2U+Io7Uoif59tofv82RXsZXzsE5xcHyT3Ep4obXoGQi03a8mBxscLK7QuzjfQlezfuC6mr/aLEgzI9qd4AGi41+JCqxAownosNVtZzsc6Ak1zubGW7oVJgZcN3jvOtB+NavuN8S0ANXnfxFoGwwUtb4QU4W+EdEHE8OTD18S141+OTzlHMfGr4hCDq4yP4KvzBinzFlykjZ6ul9Ig7Jgi2vzugAuSdYAQI8x+CDnXfKeDWQTpQ3RAWwUnNRiCqCi4DvWzJ0KX6Ygpl0IvdEiqKI/FlbqpcQkWhJb5o+G0FByPTxxetkWcNKOT4ss1WvFQcf6aB52/p7gARZ/ma8+cxoxu+lhemXbCx9PdpFwJKXa05l1lrkFrNmrmzuFLBVZa/A0xfEbIH1pjPuoLT+E9gZXPaEtmskxhboxQkAoe/B6n0WLrYpcI768BjqqkaoT1jg9W4vySFJCj1H4eQHe5Qh7p0SWnXUJVjmQ9V1VInzdVvn2u9eEsIi/WG8TjudvGCUr6vbyRhK95m8OYb);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" vertex="1"><mxGeometry as="geometry" height="14.32558139534881" width="4.775193798449603" x="5.457364341085261" y="9.550387596899206" /></mxCell>
<mxCell id="nosql_endpoint_i9" parent="nosql_endpoint_i2" style="vsdxID=11;fillColor=#2d5967;gradientColor=none;shape=stencil(lZbddtMwDMefJrc6tuTP6zHeY4d1NIfS7mQdlLdHwXFsy8Wwu0SR/PtblhRP9PB2fHo9TKjersvl2+Hn/Hw9TvRpQpzPx8MyX/lposeJHl4uy+Hrcnk/P6f316fVc336fvmxrnBLcWjA2TUK1a9kUaD0H8Pn5P/lfUkBOn3XDnLAZlHp9YbpNQCFzQHzkrhZbpQtBjef3RJcjT3N50pm5b+pUODdSKYFFVqZuiySpUYI1EplJ7StVm3Axlbs6mWGSfLgXIfX1OJ5W973fGr5SOCx49shHx043/GDFfwIRuA1kGvxpMGTwCMoGuHJAsrtU4cnB0ELvsvVV/gOtNx+AD0oljoiWQyKom4DnAfr24AIMXyEYD3Ej/gHDWGYQVcOfTMFyppKBu2erpzBwCjfnaA4wMBq/bB+QnYo+LBPir1+3N4sOz7mo6nrV+K57sZ4BSSGDMd4sXtuMjQdPohRw+2bE1Lx/ZBf+uLvdB6cPdyJ4lUdeEvY/SnXlEjkVMaRSr/XQ5bJIV7MmLWjYqtTK9Wq5L1gN2HUcLryT0CUZ1l1w3gsMzDPWwMUW3btlbNE+cTuZqmO2PpXgx6kdVeWe5UH6v97GwdmsHivhsJoFPT+fEJhOMw5JIpusODEr4xPJIp6VN0srf/2JJzuqv339YAfyt3iZT6d0tWk/i7vImxK9xh6/A0=);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" vertex="1"><mxGeometry as="geometry" height="14.32558139534881" width="4.775193798449603" x="15.348837209302296" y="9.550387596899206" /></mxCell>
<mxCell id="nosql_dedicated_i2" parent="139766069534000" style="vsdxID=4;fillColor=none;gradientColor=none;strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" vertex="1"><mxGeometry as="geometry" height="18.23255813953485" width="16.49612403100772" x="81.75193798449615" y="4.935242567760066e-14" /></mxCell>
<mxCell id="nosql_dedicated_i3" parent="nosql_dedicated_i2" style="vsdxID=5;fillColor=#FCFBFA;gradientColor=none;shape=stencil(lZTRcoMgEEW/htcdYAHlOU3+I9OY6tRqxpg2/fviQHXBEds3WO56rrC7DA/3+nyrmOT3cejfq6/mMtYMX5iUTVdXQzO6FcMjw8O1H6q3oX90F7+/nSfltProP6cvPH2e5lOK5N9+K7jfn7z29TF4sfDHSkEpQoKIM/hT+gAH/isJEWvBYBDhShQipYHCUHbbdMQnSQhcBdrmvPLEpwKFidPYplPIcs+mEwn5HyyCVXksQqF3sQjaZLFLSoggGBODpQGrYziPwXM1ID3eQBYIXMfMpBTcw1sbA4krXIv++rdz0ZFrni9Rphq5fooMe++B12xSN5tsUn1ZdlzTcQ/QjI2mSc3SlCVkkkbQGpKWXbp6ozKSQREbzQ8Vt1im0bVpWz/M6Hk6vVzITz48/gA=);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" vertex="1"><mxGeometry as="geometry" height="17.798449612403065" width="16.062015503875937" x="0.21705426356589105" y="0.21705426356589105" /></mxCell>
<mxCell id="nosql_dedicated_i4" parent="nosql_dedicated_i2" style="vsdxID=6;fillColor=#FCFBFA;gradientColor=none;shape=stencil(lVbRcsIgEPyavDJwFwh5tu1/ODXWTK1xorb270tKYg5uAvEtnrvswS07FLi5HLbnpgB5ufbdZ/PT7q6HAl8KgPZ0aPr26r4KfC1ws+/65qPvbqed/33eDsjh66v7Hla4e56WQqqBBfLXV0Cg/S+8efz7rfcE5f+vQNiRoCKGvIOv1JVAM4LGkhGqHEHIQWNJlaLElPjAqUJ1xzHI5atQ3qEs5vW1kPCsvhbK5PW1gHqNfrj/Y3siw6IMX7Fa2OS0KGUquVbKsGFjWMOOaCBsmHoFY9SCPqIwZaRPVobJQSayC20SGQgXdh8eFyEsHG/cLbBm6dyAgYBbYLHZrLccRTNrW2TiOhIn/l8Wz10sQlHswk7alVB1KE6u/rJJ4kQJp5RPoFxiydTGSsWOVYbbIus9Kia6q3xT2ROVPKZUJMwGWa2RrZMXPpZ11sS0rHO4zcqmg4mNJJtLhDHFQi0wOiA6u6lbKYuc3ybMgrS2LBLnVWOZRx6R7jDGrIujGb8yjWYCCSOTaXQYOGQazZqIK/Mk4srO4XnhJ7dMriLw8YWOTlgiMEQufwKw+5jfTvv2ePRPL/p//NZyJf9Ow9c/);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" vertex="1"><mxGeometry as="geometry" height="18.23255813953485" width="16.49612403100772" /></mxCell>
<mxCell id="nosql_dedicated_i5" parent="nosql_dedicated_i2" style="vsdxID=7;fillColor=#2d5967;gradientColor=none;shape=stencil(lVPbDoIwDP2avTZbyxg8e/kPoyiLCGbg7e+FdMq2BBPfejntOe06Qau+3l0rgbIfXHeuHvYw1ILWAtG2deXsMFqCNoJWx85VJ9fd2gP7192EnKxLd586PLlOSTnVoHyxz96WofubY6ziZJGBRA/3IQ0lceSJHMkNoPIgHypBGQ8iX/ZhpQSxwEwIpoyZg6aeRo1iipg5kEfhgF/iaN7GtsFq4sWUEjD/JVEVoLJEooFkOaRB61ji9wWWdvMBLPDmGWQ65p1beo5CgcmTN5m1UXoKtDByvJ+fp/MHdDTm6zzapuHjDvPpNY8h/gm0eQM=);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" vertex="1"><mxGeometry as="geometry" height="0.6511627906976731" width="4.12403100775193" x="6.07751937984495" y="12.589147286821682" /></mxCell>
<mxCell id="nosql_dedicated_i6" parent="nosql_dedicated_i2" style="vsdxID=8;fillColor=#2d5967;gradientColor=none;shape=stencil(lVPRkoIwDPyavmbahFL67Ol/OCdK5zhwKnr494Kp0nLizb2lyya7TRdBq1O1PZYC5anz7Vf543ZdJehDILqmKr3rhkrQWtBq3/ry4Ntzs+PzcTsyx+q7vYwTeu6TYwfKK5+sBDR3ZMPkz7NntmKCKkBloSVA1gAx0iMjpEHrQAqQkkGoJwb0Q5hSwoJunkGmU91pZNAoFJg8lY28zXSewr+uXLsm2s/Ej/e14LLIQGLqUoPVqc3cAKqZTVD2/XqejAVlQjB29i7T0McjDGaKVDmyR2kg6MV909X8EZ1/kYdiSuje1TUHPP4+T/QA8d9A6xs=);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" vertex="1"><mxGeometry as="geometry" height="0.6511627906976731" width="4.12403100775193" x="6.07751937984495" y="8.46511627906975" /></mxCell>
<mxCell id="nosql_dedicated_i7" parent="nosql_dedicated_i2" style="vsdxID=9;fillColor=#2d5967;gradientColor=none;shape=stencil(lVhdd9sgDP01edUBhPl47rr/0bOma866pidNt/bfT54NCGEb5y3Bku9FV0jCB7x7f354Ox6Mer9ezr+Of0+P1+cDfjsYc3p9Pl5OV/p1wPsD3j2dL8efl/PH6+P0/+1htBx//T7/Gd/wOfnFCDGOXkZ9TSvagBv+r3yfHH58XCYP3brMSwhxclGfZlrxFpSbjeYlNVvg9HeY/38hf7yCaQaItsZUNaACpWs8RgobG9y5WVWDkn1wArhG1QjKd2ERjL8FFsGaHuzgdsBWqC+nV5YKzH5aCB7cNsvikXLDg0gENDNmoao6mZAMVlCdBxThUSIZeIqahhm2Rriy4zpCC4dFRFRyzcyYkoNIoGJjWrXXuXZzaAk7p+YqNkvwDWx5bLpxkg51FQq0F1s5ROKxeTC9ARxE8lmIWO/P6fLilAhUSrRMQNDiqJCVD1v4GPJrMv7Q4BsP3gh829Ql7cA7gd/bv0vPC7zKWAneghPoIeSwJXRmtO8YMIeZS+hUUU2VQrD1GlQUyUjxq9mSyC7UbI2GKOh6THtapMs9Zr4R9BZdw/JB5y0GwZYiGWq6ZNRXloz0jco6B6qrrENweOgo6wzEW5S1dq61+4W1tGXbE9ZS8ATZBWFtvEVV4uo3A7sgK/lY0bAWdCUr3RfWImxWjFZXq9M529AVY6rzG7pSNZqX9ulKm7Rmiyz1Cu1qtjRQ6Zos9XaFNVsa1Bq2EYLoH8Vqvcd7ESz+5lTMXBMtRrJUci2UanYv2hfzWAlvMxMPTbi4bqn0m5Kzpk2BVH0xn/a9qRU0iOmYp2wqpjFDscS2IrG9L2mK2cpv1FfusXRuG7K0mSDY0pkTBS5E8CK3xsoiisaCuLJk9bRtSuIObXmtXdeWl+11bbv9oBWX9Zl1bVnHWpdWdsKesk2r3SHu2MTlwW3FHecBwXdB3GbS6KnbvcPEUlYSYT4jJXVJNzlHsnGrqKuxJtzMcTXhHYPvzQ71aJ0vV6kTmM1CRgOzFrcr2wxqpKgR8g25tfJg1LHwYLY/LGBGyjNt0565XqljawiihnKrvVf9hUwYb2LynDOSZbwJQ2/z1HNU70JjROTHgUWEnuuTWh7dcZoLTQ1OJmrzFFCDCxJcp1ThtxlZZYiiOAQLk1F37665S/GY5tFI1oxRnhqc2eyVnbnonE8y6oWfaRJzfd+9hOfx1Pkc1dBcmRwIWSml3vKU1zWkUxLoR/la+HR6eZk+NvLn8usiLU1fJvH+Hw==);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" vertex="1"><mxGeometry as="geometry" height="17.364341085271285" width="15.627906976744155" x="0.4341085271317821" y="0.4341085271317821" /></mxCell>
<mxCell id="nosql_dedicated_i8" parent="nosql_dedicated_i2" style="vsdxID=10;fillColor=#2d5967;gradientColor=none;shape=stencil(lZbbUsMgEIafJrc7wMIC1x7ew9FqM9bWSevp7SUSCAuV6h0hu/l+9hQGvDpu7143gxLH03R43nyMD6ftgNeDUuN+u5nGU1gNeDPg1eNh2jxNh7f9Q3x+vZst59XL4X3+wmf0swasnr2U+Io7Uoif59tofv82RXsZXzsE5xcHyT3Ep4obXoGQi03a8mBxscLK7QuzjfQlezfuC6mr/aLEgzI9qd4AGi41+JCqxAownosNVtZzsc6Ak1zubGW7oVJgZcN3jvOtB+NavuN8S0ANXnfxFoGwwUtb4QU4W+EdEHE8OTD18S141+OTzlHMfGr4hCDq4yP4KvzBinzFlykjZ6ul9Ig7Jgi2vzugAuSdYAQI8x+CDnXfKeDWQTpQ3RAWwUnNRiCqCi4DvWzJ0KX6Ygpl0IvdEiqKI/FlbqpcQkWhJb5o+G0FByPTxxetkWcNKOT4ss1WvFQcf6aB52/p7gARZ/ma8+cxoxu+lhemXbCx9PdpFwJKXa05l1lrkFrNmrmzuFLBVZa/A0xfEbIH1pjPuoLT+E9gZXPaEtmskxhboxQkAoe/B6n0WLrYpcI768BjqqkaoT1jg9W4vySFJCj1H4eQHe5Qh7p0SWnXUJVjmQ9V1VInzdVvn2u9eEsIi/WG8TjudvGCUr6vbyRhK95m8OYb);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" vertex="1"><mxGeometry as="geometry" height="9.116279069767424" width="3.038759689922475" x="3.472868217054257" y="6.07751937984495" /></mxCell>
<mxCell id="nosql_dedicated_i9" parent="nosql_dedicated_i2" style="vsdxID=11;fillColor=#2d5967;gradientColor=none;shape=stencil(lZbddtMwDMefJrc6tuTP6zHeY4d1NIfS7mQdlLdHwXFsy8Wwu0SR/PtblhRP9PB2fHo9TKjersvl2+Hn/Hw9TvRpQpzPx8MyX/lposeJHl4uy+Hrcnk/P6f316fVc336fvmxrnBLcWjA2TUK1a9kUaD0H8Pn5P/lfUkBOn3XDnLAZlHp9YbpNQCFzQHzkrhZbpQtBjef3RJcjT3N50pm5b+pUODdSKYFFVqZuiySpUYI1EplJ7StVm3Axlbs6mWGSfLgXIfX1OJ5W973fGr5SOCx49shHx043/GDFfwIRuA1kGvxpMGTwCMoGuHJAsrtU4cnB0ELvsvVV/gOtNx+AD0oljoiWQyKom4DnAfr24AIMXyEYD3Ej/gHDWGYQVcOfTMFyppKBu2erpzBwCjfnaA4wMBq/bB+QnYo+LBPir1+3N4sOz7mo6nrV+K57sZ4BSSGDMd4sXtuMjQdPohRw+2bE1Lx/ZBf+uLvdB6cPdyJ4lUdeEvY/SnXlEjkVMaRSr/XQ5bJIV7MmLWjYqtTK9Wq5L1gN2HUcLryT0CUZ1l1w3gsMzDPWwMUW3btlbNE+cTuZqmO2PpXgx6kdVeWe5UH6v97GwdmsHivhsJoFPT+fEJhOMw5JIpusODEr4xPJIp6VN0srf/2JJzuqv339YAfyt3iZT6d0tWk/i7vImxK9xh6/A0=);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" vertex="1"><mxGeometry as="geometry" height="9.116279069767424" width="3.038759689922475" x="9.767441860465098" y="6.07751937984495" /></mxCell>
<mxCell id="nosql_tables_i2" parent="139766069536112" style="vsdxID=4;fillColor=none;gradientColor=none;strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" vertex="1"><mxGeometry as="geometry" height="18.23255813953485" width="16.49612403100772" x="71.75193798449615" y="4.935242567760066e-14" /></mxCell>
<mxCell id="nosql_tables_i3" parent="nosql_tables_i2" style="vsdxID=5;fillColor=#FCFBFA;gradientColor=none;shape=stencil(lZTRcoMgEEW/htcdYAHlOU3+I9OY6tRqxpg2/fviQHXBEds3WO56rrC7DA/3+nyrmOT3cejfq6/mMtYMX5iUTVdXQzO6FcMjw8O1H6q3oX90F7+/nSfltProP6cvPH2e5lOK5N9+K7jfn7z29TF4sfDHSkEpQoKIM/hT+gAH/isJEWvBYBDhShQipYHCUHbbdMQnSQhcBdrmvPLEpwKFidPYplPIcs+mEwn5HyyCVXksQqF3sQjaZLFLSoggGBODpQGrYziPwXM1ID3eQBYIXMfMpBTcw1sbA4krXIv++rdz0ZFrni9Rphq5fooMe++B12xSN5tsUn1ZdlzTcQ/QjI2mSc3SlCVkkkbQGpKWXbp6ozKSQREbzQ8Vt1im0bVpWz/M6Hk6vVzITz48/gA=);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" vertex="1"><mxGeometry as="geometry" height="17.798449612403065" width="16.062015503875937" x="0.21705426356589105" y="0.21705426356589105" /></mxCell>
<mxCell id="nosql_tables_i4" parent="nosql_tables_i2" style="vsdxID=6;fillColor=#FCFBFA;gradientColor=none;shape=stencil(lVbRcsIgEPyavDJwFwh5tu1/ODXWTK1xorb270tKYg5uAvEtnrvswS07FLi5HLbnpgB5ufbdZ/PT7q6HAl8KgPZ0aPr26r4KfC1ws+/65qPvbqed/33eDsjh66v7Hla4e56WQqqBBfLXV0Cg/S+8efz7rfcE5f+vQNiRoCKGvIOv1JVAM4LGkhGqHEHIQWNJlaLElPjAqUJ1xzHI5atQ3qEs5vW1kPCsvhbK5PW1gHqNfrj/Y3siw6IMX7Fa2OS0KGUquVbKsGFjWMOOaCBsmHoFY9SCPqIwZaRPVobJQSayC20SGQgXdh8eFyEsHG/cLbBm6dyAgYBbYLHZrLccRTNrW2TiOhIn/l8Wz10sQlHswk7alVB1KE6u/rJJ4kQJp5RPoFxiydTGSsWOVYbbIus9Kia6q3xT2ROVPKZUJMwGWa2RrZMXPpZ11sS0rHO4zcqmg4mNJJtLhDHFQi0wOiA6u6lbKYuc3ybMgrS2LBLnVWOZRx6R7jDGrIujGb8yjWYCCSOTaXQYOGQazZqIK/Mk4srO4XnhJ7dMriLw8YWOTlgiMEQufwKw+5jfTvv2ePRPL/p//NZyJf9Ow9c/);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" vertex="1"><mxGeometry as="geometry" height="18.23255813953485" width="16.49612403100772" /></mxCell>
<mxCell id="nosql_tables_i5" parent="nosql_tables_i2" style="vsdxID=7;fillColor=#2d5967;gradientColor=none;shape=stencil(lVPbDoIwDP2avTZbyxg8e/kPoyiLCGbg7e+FdMq2BBPfejntOe06Qau+3l0rgbIfXHeuHvYw1ILWAtG2deXsMFqCNoJWx85VJ9fd2gP7192EnKxLd586PLlOSTnVoHyxz96WofubY6ziZJGBRA/3IQ0lceSJHMkNoPIgHypBGQ8iX/ZhpQSxwEwIpoyZg6aeRo1iipg5kEfhgF/iaN7GtsFq4sWUEjD/JVEVoLJEooFkOaRB61ji9wWWdvMBLPDmGWQ65p1beo5CgcmTN5m1UXoKtDByvJ+fp/MHdDTm6zzapuHjDvPpNY8h/gm0eQM=);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" vertex="1"><mxGeometry as="geometry" height="0.6511627906976731" width="4.12403100775193" x="6.07751937984495" y="12.589147286821682" /></mxCell>
<mxCell id="nosql_tables_i6" parent="nosql_tables_i2" style="vsdxID=8;fillColor=#2d5967;gradientColor=none;shape=stencil(lVPRkoIwDPyavmbahFL67Ol/OCdK5zhwKnr494Kp0nLizb2lyya7TRdBq1O1PZYC5anz7Vf543ZdJehDILqmKr3rhkrQWtBq3/ry4Ntzs+PzcTsyx+q7vYwTeu6TYwfKK5+sBDR3ZMPkz7NntmKCKkBloSVA1gAx0iMjpEHrQAqQkkGoJwb0Q5hSwoJunkGmU91pZNAoFJg8lY28zXSewr+uXLsm2s/Ej/e14LLIQGLqUoPVqc3cAKqZTVD2/XqejAVlQjB29i7T0McjDGaKVDmyR2kg6MV909X8EZ1/kYdiSuje1TUHPP4+T/QA8d9A6xs=);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" vertex="1"><mxGeometry as="geometry" height="0.6511627906976731" width="4.12403100775193" x="6.07751937984495" y="8.46511627906975" /></mxCell>
<mxCell id="nosql_tables_i7" parent="nosql_tables_i2" style="vsdxID=9;fillColor=#2d5967;gradientColor=none;shape=stencil(lVhdd9sgDP01edUBhPl47rr/0bOma866pidNt/bfT54NCGEb5y3Bku9FV0jCB7x7f354Ox6Mer9ezr+Of0+P1+cDfjsYc3p9Pl5OV/p1wPsD3j2dL8efl/PH6+P0/+1htBx//T7/Gd/wOfnFCDGOXkZ9TSvagBv+r3yfHH58XCYP3brMSwhxclGfZlrxFpSbjeYlNVvg9HeY/38hf7yCaQaItsZUNaACpWs8RgobG9y5WVWDkn1wArhG1QjKd2ERjL8FFsGaHuzgdsBWqC+nV5YKzH5aCB7cNsvikXLDg0gENDNmoao6mZAMVlCdBxThUSIZeIqahhm2Rriy4zpCC4dFRFRyzcyYkoNIoGJjWrXXuXZzaAk7p+YqNkvwDWx5bLpxkg51FQq0F1s5ROKxeTC9ARxE8lmIWO/P6fLilAhUSrRMQNDiqJCVD1v4GPJrMv7Q4BsP3gh829Ql7cA7gd/bv0vPC7zKWAneghPoIeSwJXRmtO8YMIeZS+hUUU2VQrD1GlQUyUjxq9mSyC7UbI2GKOh6THtapMs9Zr4R9BZdw/JB5y0GwZYiGWq6ZNRXloz0jco6B6qrrENweOgo6wzEW5S1dq61+4W1tGXbE9ZS8ATZBWFtvEVV4uo3A7sgK/lY0bAWdCUr3RfWImxWjFZXq9M529AVY6rzG7pSNZqX9ulKm7Rmiyz1Cu1qtjRQ6Zos9XaFNVsa1Bq2EYLoH8Vqvcd7ESz+5lTMXBMtRrJUci2UanYv2hfzWAlvMxMPTbi4bqn0m5Kzpk2BVH0xn/a9qRU0iOmYp2wqpjFDscS2IrG9L2mK2cpv1FfusXRuG7K0mSDY0pkTBS5E8CK3xsoiisaCuLJk9bRtSuIObXmtXdeWl+11bbv9oBWX9Zl1bVnHWpdWdsKesk2r3SHu2MTlwW3FHecBwXdB3GbS6KnbvcPEUlYSYT4jJXVJNzlHsnGrqKuxJtzMcTXhHYPvzQ71aJ0vV6kTmM1CRgOzFrcr2wxqpKgR8g25tfJg1LHwYLY/LGBGyjNt0565XqljawiihnKrvVf9hUwYb2LynDOSZbwJQ2/z1HNU70JjROTHgUWEnuuTWh7dcZoLTQ1OJmrzFFCDCxJcp1ThtxlZZYiiOAQLk1F37665S/GY5tFI1oxRnhqc2eyVnbnonE8y6oWfaRJzfd+9hOfx1Pkc1dBcmRwIWSml3vKU1zWkUxLoR/la+HR6eZk+NvLn8usiLU1fJvH+Hw==);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" vertex="1"><mxGeometry as="geometry" height="17.364341085271285" width="15.627906976744155" x="0.4341085271317821" y="0.4341085271317821" /></mxCell>
<mxCell id="nosql_tables_i8" parent="nosql_tables_i2" style="vsdxID=10;fillColor=#2d5967;gradientColor=none;shape=stencil(lZbbUsMgEIafJrc7wMIC1x7ew9FqM9bWSevp7SUSCAuV6h0hu/l+9hQGvDpu7143gxLH03R43nyMD6ftgNeDUuN+u5nGU1gNeDPg1eNh2jxNh7f9Q3x+vZst59XL4X3+wmf0swasnr2U+Io7Uoif59tofv82RXsZXzsE5xcHyT3Ep4obXoGQi03a8mBxscLK7QuzjfQlezfuC6mr/aLEgzI9qd4AGi41+JCqxAownosNVtZzsc6Ak1zubGW7oVJgZcN3jvOtB+NavuN8S0ANXnfxFoGwwUtb4QU4W+EdEHE8OTD18S141+OTzlHMfGr4hCDq4yP4KvzBinzFlykjZ6ul9Ig7Jgi2vzugAuSdYAQI8x+CDnXfKeDWQTpQ3RAWwUnNRiCqCi4DvWzJ0KX6Ygpl0IvdEiqKI/FlbqpcQkWhJb5o+G0FByPTxxetkWcNKOT4ss1WvFQcf6aB52/p7gARZ/ma8+cxoxu+lhemXbCx9PdpFwJKXa05l1lrkFrNmrmzuFLBVZa/A0xfEbIH1pjPuoLT+E9gZXPaEtmskxhboxQkAoe/B6n0WLrYpcI768BjqqkaoT1jg9W4vySFJCj1H4eQHe5Qh7p0SWnXUJVjmQ9V1VInzdVvn2u9eEsIi/WG8TjudvGCUr6vbyRhK95m8OYb);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" vertex="1"><mxGeometry as="geometry" height="9.116279069767424" width="3.038759689922475" x="3.472868217054257" y="6.07751937984495" /></mxCell>
<mxCell id="nosql_tables_i9" parent="nosql_tables_i2" style="vsdxID=11;fillColor=#2d5967;gradientColor=none;shape=stencil(lZbddtMwDMefJrc6tuTP6zHeY4d1NIfS7mQdlLdHwXFsy8Wwu0SR/PtblhRP9PB2fHo9TKjersvl2+Hn/Hw9TvRpQpzPx8MyX/lposeJHl4uy+Hrcnk/P6f316fVc336fvmxrnBLcWjA2TUK1a9kUaD0H8Pn5P/lfUkBOn3XDnLAZlHp9YbpNQCFzQHzkrhZbpQtBjef3RJcjT3N50pm5b+pUODdSKYFFVqZuiySpUYI1EplJ7StVm3Axlbs6mWGSfLgXIfX1OJ5W973fGr5SOCx49shHx043/GDFfwIRuA1kGvxpMGTwCMoGuHJAsrtU4cnB0ELvsvVV/gOtNx+AD0oljoiWQyKom4DnAfr24AIMXyEYD3Ej/gHDWGYQVcOfTMFyppKBu2erpzBwCjfnaA4wMBq/bB+QnYo+LBPir1+3N4sOz7mo6nrV+K57sZ4BSSGDMd4sXtuMjQdPohRw+2bE1Lx/ZBf+uLvdB6cPdyJ4lUdeEvY/SnXlEjkVMaRSr/XQ5bJIV7MmLWjYqtTK9Wq5L1gN2HUcLryT0CUZ1l1w3gsMzDPWwMUW3btlbNE+cTuZqmO2PpXgx6kdVeWe5UH6v97GwdmsHivhsJoFPT+fEJhOMw5JIpusODEr4xPJIp6VN0srf/2JJzuqv339YAfyt3iZT6d0tWk/i7vImxK9xh6/A0=);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" vertex="1"><mxGeometry as="geometry" height="9.116279069767424" width="3.038759689922475" x="9.767441860465098" y="6.07751937984495" /></mxCell>
<mxCell connectable="0" id="functions_i2" parent="139766069542640" style="group" value="" vertex="1"><mxGeometry as="geometry" height="44.0" width="33.908256880733944" y="9.178386898625882e-14" x="53.04587155963303" /></mxCell>
<mxCell id="functions_i3" parent="functions_i2" style="vsdxID=37;fillColor=none;gradientColor=none;strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" vertex="1"><mxGeometry as="geometry" height="33.908256880733944" width="33.908256880733944" /></mxCell>
<mxCell id="functions_i4" parent="functions_i3" style="vsdxID=38;fillColor=none;gradientColor=none;strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" vertex="1"><mxGeometry as="geometry" height="33.908256880733944" width="33.908256880733944" /></mxCell>
<mxCell id="functions_i5" parent="functions_i4" style="vsdxID=39;fillColor=#FCFBFA;gradientColor=none;shape=stencil(lZPRDoIwDEW/Zq9LWUHCs+J/EAVZRCATFP/eYYdsAzW+td2922mzMtxey6zNmYBrp5pzfpfHrmS4Y0LIusyV7HTEMGW4LRqVn1TT10fK22xUjtGluY03DOSLOEajScCDCknC482rsif9oVdkCEggeIjGEfgWGASVwChMmsQchVGgqzBpEvLQfrWStUUJDuKb+QMhuHgz8ERnteDyTnDWVBzcVTiNvnFnCN/o9Cyi2CUEFy8Ab3xWB+hLfOJVxFnuI3+AnA1L6kEsG/HJB1zOxkNfBf39Hf/V62D++4WsKlod+9zfFV2iPcP0CQ==);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" vertex="1"><mxGeometry as="geometry" height="33.10091743119266" width="33.10091743119266" x="0.4036697247706422" y="0.4036697247706422" /></mxCell>
<mxCell id="functions_i6" parent="functions_i4" style="vsdxID=40;fillColor=#FCFBFA;gradientColor=none;shape=stencil(lZXRdoIwDIafprc9aUMpvXb6Hp6JgzMmHsSNvf1gLbQNCHpX4h/88iehDHe34njNmYRb29Sf+U95aguGb0zK8lLkTdn2J4Z7hrtz3eQfTX2/nOzz9Tgoh9NX/T28obN5BjmqIUvCr41Ijtl/4GD17/fGJgiXoXhiXIYgKdBJJ9IcR5ELJVy6SIdzkQulPMHwz6vyEsIGCRN+JlZpgxRfgFEEN6jJV5ClhDfwCqlqEbgvR8S8VE95e5c0wdU8lTFu77cmtIprEdMGIs+v9GPYIGG5GZQ1SBCzHstZPXI2LDhzCZdnkIzB5sy+qt/aCXihxbBuWaZiyyD2C6hZdAghdmp9YSAi21wWYHTyREInb+J3EQHANro5Sh41R8U7TeQLGy2Ih56BQgXbPJWCVPPcenj9c9thDNcp/U5O3Ry5Um5EjErsXPjorLu5Nrr9wV8E57Kq7D0S/k4vjj5kLx3c/wE=);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" vertex="1"><mxGeometry as="geometry" height="33.908256880733944" width="33.908256880733944" /></mxCell>
<mxCell id="functions_i7" parent="functions_i3" style="vsdxID=41;fillColor=none;gradientColor=none;strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" vertex="1"><mxGeometry as="geometry" height="32.29357798165138" width="32.29357798165138" x="0.8073394495412844" y="0.8073394495412844" /></mxCell>
<mxCell id="functions_i8" parent="functions_i7" style="vsdxID=42;fillColor=#2d5967;gradientColor=none;shape=stencil(lZXLcoMwDEW/xlvGWDzidZr8R6YhhSmFDCEt+ftCbbAkB+Lu/LgyR/IVFrC/ladrIZS89V37WfxU574U8CaUqpqy6Kp+HAk4CNhf2q746Np7czbz62lSTqOv9ns6YTBxOo3SeIpS8mFW5N/saMR11SBxEqlkXft+78zJsdmMI62tOsZyOSgyfdipsrtAd2H5drpOJgmWzra4JIXSO0qFsOcVKSkaqgNQyVO4scZ5RgCZnBPqXSRjSukYONRMueQBXAAOY6OETv+84B6kno9bIBVF1LnLm175AL774KX9XniVGTtzNVzJ38so88puneRSSr2UxihbqK20nCqsszw9hwWvuzCImkV5wmkpKlKE2QQFhPkEBdiVhEPyhoPFWesdB5uUfstxfcDlIwx01+z6EwqKFUF/rgCf/jtgHLj//aWqa/Nc4H3+PoxL5m2Bwy8=);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" vertex="1"><mxGeometry as="geometry" height="32.29357798165138" width="32.29357798165138" /></mxCell>
<mxCell id="functions_i9" parent="functions_i7" style="vsdxID=43;fillColor=#2d5967;gradientColor=none;shape=stencil(pZLRDsIgDEW/hlcCNG68z/kfS8aEiLCwOfXvhTTGTSPqfOul57YNuQSqQTe9IoINY/AHdTbtqAlsiRDGaRXMGCsCNYGq80Htgz+5FnXfJDJVRz+lCRf0seQQ7IqKM9Q7RK1xM/TeXAVn0JVgdn0WXf4AByrKJV5QuXk/Wxa0hP8MEijPGF5P+tnw4aQvDLF4hKYz1mLm5v3nkMUnDCjUNw==);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" vertex="1"><mxGeometry as="geometry" height="6.862385321100918" width="8.880733944954128" x="3.229357798165138" y="21.394495412844037" /></mxCell>
<mxCell id="functions_i10" parent="functions_i7" style="vsdxID=44;fillColor=#2d5967;gradientColor=none;shape=stencil(pZLdDsIgDIWfhlsC1Bm8nvM9lowJEWFhmz9vL6QxbhpZnHc99DttQw6Bstd1p4hg/RD8SV1NM2gCeyKEcVoFM8SKQEWgbH1Qx+BH16Du6kSm6uwvacINfSw5BLuj4gz1AVFr3AR9NlfBGXQlmF2fRec/sKFSzOktlcX30buCcvmfQQLlGcPHRb/yCwct87F4BaY11mLepv33gMUnDCdUDw==);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" vertex="1"><mxGeometry as="geometry" height="6.862385321100918" width="25.027522935779817" x="3.229357798165138" y="3.229357798165138" /></mxCell>
<mxCell id="functions_i11" parent="functions_i7" style="vsdxID=45;fillColor=#2d5967;gradientColor=none;shape=stencil(pZLLDoMgEEW/hi0BplRdW/sfJmIhpWKQvv6+kklT7cPWupsL5w7D5BLIO122igjWBe/26myqoAlsiBCm0cqb0FcECgJ57bzaeXdsKtRtGclYHdwpdrigjzMWPYJdUaPaImpNM0D/BO8vvEWzjEqxBJ+AZ3xtEh0vLBM0XY/gFCiXn3snlK8W8VzSBCZ28jLQbMOXiX4w9MUjYbWxFgM6vH9OZH+EaYbiBg==);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" vertex="1"><mxGeometry as="geometry" height="6.862385321100918" width="16.954128440366972" x="3.229357798165138" y="12.513761467889909" /></mxCell>
<mxCell id="functions_i12" parent="functions_i7" style="vsdxID=46;fillColor=#2d5967;gradientColor=none;shape=stencil(nZBLCoAwDERPk31tjuDnHoLVBmsrtf5ub0sQRdzobiZ5ycAA5pOuRwVSTMG7Xq3UBA1YgJRktfIUogIsAfPWedV5N9uG/VgnMqnBLenDxneZEOlGip09u4pRQ/aG/gTPhFf0Gf8J/otGcdXRkjHc5n3/rC+OuHosDw==);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" vertex="1"><mxGeometry as="geometry" height="5.651376146788991" width="6.055045871559633" x="21.79816513761468" y="12.917431192660551" /></mxCell>
<mxCell id="functions_i13" parent="functions_i7" style="vsdxID=47;fillColor=#2d5967;gradientColor=none;shape=stencil(nZBLCoAwDERPk31tjuDnHoLVBmsrtf5ub0sQRdzobiZ5ycAA5pOuRwVSTMG7Xq3UBA1YgJRktfIUogIsAfPWedV5N9uG/VgnMqnBLenDxneZEOlGip09u4pRQ/aG/gTPhFf0Gf8J/otGcdXRkjHc5n3/rC+OuHosDw==);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" vertex="1"><mxGeometry as="geometry" height="5.651376146788991" width="6.055045871559633" x="21.79816513761468" y="21.79816513761468" /></mxCell>
<mxCell id="functions_i14" parent="functions_i7" style="vsdxID=48;fillColor=#2d5967;gradientColor=none;shape=stencil(nZBLCoAwDERPk31tjuDnHoLVBmsrtf5ub0sQRdzobiZ5ycAA5pOuRwVSTMG7Xq3UBA1YgJRktfIUogIsAfPWedV5N9uG/VgnMqnBLenDxneZEOlGip09u4pRQ/aG/gTPhFf0Gf8J/otGcdXRkjHc5n3/rC+OuHosDw==);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" vertex="1"><mxGeometry as="geometry" height="5.651376146788991" width="6.055045871559633" x="14.128440366972479" y="21.79816513761468" /></mxCell>
<mxCell id="monitoring_i2" parent="139766069584112" style="vsdxID=76;fillColor=none;gradientColor=none;strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" vertex="1"><mxGeometry as="geometry" height="26.2018348623853" width="26.2018348623853" x="46.89908256880736" /></mxCell>
<mxCell id="monitoring_i3" parent="monitoring_i2" style="vsdxID=77;fillColor=none;gradientColor=none;strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" vertex="1"><mxGeometry as="geometry" height="26.2018348623853" width="26.2018348623853" /></mxCell>
<mxCell id="monitoring_i4" parent="monitoring_i3" style="vsdxID=78;fillColor=#FCFBFA;gradientColor=none;shape=stencil(lZPRDoIwDEW/Zq9LWUHCs+J/EAVZRCATFP/eYYdsAzW+td2922mzMtxey6zNmYBrp5pzfpfHrmS4Y0LIusyV7HTEMGW4LRqVn1TT10fK22xUjtGluY03DOSLOEajScCDCknC482rsif9oVdkCEggeIjGEfgWGASVwChMmsQchVGgqzBpEvLQfrWStUUJDuKb+QMhuHgz8ERnteDyTnDWVBzcVTiNvnFnCN/o9Cyi2CUEFy8Ab3xWB+hLfOJVxFnuI3+AnA1L6kEsG/HJB1zOxkNfBf39Hf/V62D++4WsKlod+9zfFV2iPcP0CQ==);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" vertex="1"><mxGeometry as="geometry" height="25.577981651376124" width="25.577981651376124" x="0.3119266055045869" y="0.3119266055045869" /></mxCell>
<mxCell id="monitoring_i5" parent="monitoring_i3" style="vsdxID=79;fillColor=#FCFBFA;gradientColor=none;shape=stencil(lZXRdoIwDIafprc9aUMpvXb6Hp6JgzMmHsSNvf1gLbQNCHpX4h/88iehDHe34njNmYRb29Sf+U95aguGb0zK8lLkTdn2J4Z7hrtz3eQfTX2/nOzz9Tgoh9NX/T28obN5BjmqIUvCr41Ijtl/4GD17/fGJgiXoXhiXIYgKdBJJ9IcR5ELJVy6SIdzkQulPMHwz6vyEsIGCRN+JlZpgxRfgFEEN6jJV5ClhDfwCqlqEbgvR8S8VE95e5c0wdU8lTFu77cmtIprEdMGIs+v9GPYIGG5GZQ1SBCzHstZPXI2LDhzCZdnkIzB5sy+qt/aCXihxbBuWaZiyyD2C6hZdAghdmp9YSAi21wWYHTyREInb+J3EQHANro5Sh41R8U7TeQLGy2Ih56BQgXbPJWCVPPcenj9c9thDNcp/U5O3Ry5Um5EjErsXPjorLu5Nrr9wV8E57Kq7D0S/k4vjj5kLx3c/wE=);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" vertex="1"><mxGeometry as="geometry" height="26.2018348623853" width="26.2018348623853" /></mxCell>
<mxCell id="monitoring_i6" parent="monitoring_i2" style="vsdxID=80;fillColor=none;gradientColor=none;strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" vertex="1"><mxGeometry as="geometry" height="24.95412844036695" width="24.95412844036695" x="0.6238532110091738" y="0.6238532110091738" /></mxCell>
<mxCell id="monitoring_i7" parent="monitoring_i6" style="vsdxID=81;fillColor=#2d5967;gradientColor=none;shape=stencil(pVjbctsgEP0ave5wvzyn6X9kGqfW1LUzitM6f19U2YIFaxHWmxDniMNe2BWdfPrYv7zvOsE+zsPp1+5v/3red/JbJ0R/3O+G/hyeOvncyae307D7OZw+j6/T+P1lRI5Pv09/xi9cJp7XoPnIEuxresP+j75P4EN/TMAKhFrG/vgcpi/zaZKD91c0T+HsItDw6zoU11mJZ+W8tl5WxpAsbyhdDIvyDqtKZN/eMIalJXaQGHJXHHfgNRJIwoUH7tbDlQau1sO1BmnWwy0HKdbDHQfdsNUQfZYUk/vOO2C3cOW5d3J33fw3e1jmABllEMEV8fdDsRDpb5+bRQos0du4b5wMlyhpzkuUEEt2pLIYp7wEi+NFOHL73kSbP0iQEgi8DSGJ8cpT+DArcYIoQeHDjo1HeCPIDRQW0qT+VoPW8dhhxbErafMXSZXji4A1RVbNlBizBkQWsyqL2QSx6tROCVdLkGbz/nFwLWkTp3C8O1F8URQ2WiwMtKuqnsWBIEQeyKMFqcgvCI6RmaJBqU34ZkHbCVmyODCyZYWSYBhJ0KEk2m2EZknbCdhKVoHjLSuUBGNpggVtthGCpCZFD+DbtlwxalmFKyuEbqnJzQXe0HWVA7Ob8BU9oZfkTRsuCZr0mQou8JvwteMltOZNLigJ1tDNY9H8NxNqyZ8XkQJf1rr8zyxSkno3F8S5A+hQtUsQ6xrpsq+yZHVRwLO+zRKxxYBjzyj6PAhNDz5v6C7vTlfrat0Ny7OD8sqdLmy2uIj2zXqw1HPL/w6VEFpxcoWHeIfw1h8O0xVEOp/fOYRX032FfP4H);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" vertex="1"><mxGeometry as="geometry" height="24.95412844036695" width="24.95412844036695" /></mxCell>
<mxCell id="monitoring_i8" parent="monitoring_i6" style="vsdxID=82;fillColor=#2d5967;gradientColor=none;shape=stencil(pZJNDoMgEIVPw5Yg01b31t7DRCykFAxqf25fyKRBDYtid2+G781kyCNQj7IdBOFsnJy9iafqJkngTDhXRgqnJq8INATq3jpxdXY2HdZDG8ig7vYRJrzQVzAWPJy9scbqgqhWZoHuBL8bkuh2fRa8F13/QMloBSs4dpKzoaD8+J8hdpKGU0XLQ44h+4YfDF7E0PRKa8zc8n0bMt/CgELzAQ==);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" vertex="1"><mxGeometry as="geometry" height="2.8073394495412822" width="2.8073394495412822" x="1.8715596330275215" y="1.8715596330275215" /></mxCell>
<mxCell id="logging_i2" parent="139766069586800" style="vsdxID=16;fillColor=none;gradientColor=none;strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" vertex="1"><mxGeometry as="geometry" height="26.129629629629623" width="27.074074074074066" x="46.462962962962955" /></mxCell>
<mxCell id="logging_i3" parent="logging_i2" style="vsdxID=17;fillColor=none;gradientColor=none;strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" vertex="1"><mxGeometry as="geometry" height="26.129629629629623" width="27.074074074074066" /></mxCell>
<mxCell id="logging_i4" parent="logging_i3" style="vsdxID=18;fillColor=#FCFBFA;gradientColor=none;shape=stencil(lZRBcoMwDEVPw1YjSxjkdZrcI9OQwpSGDCFtevtC7UwsIGTYyeJ/8/jYSnhzKffnIiG8dG3zWfxUh65M+C0hqk5l0VZdXyW8TXhzbNrio22up4Nfn/eDcqi+mu9hh5v3kQObDi7CX99xDpD/OztvqKtTbMiARBsEMFswENhMG1Iw7rkhBZFl/fu19d9gwiuAOTjM2II38i0MirB0BGiCgrUiLMWBeU6JCtECyhIhajyClDRdT+M0IGq4KBWFOwsnFqzOEJfoRIBzTYgazyGkmeYjMKIRYxHP56IxY0PYNAexS6gGR1GygzTXsA9NaNgM3EvUTCDP17COz8cYNXaY6aGjafb3sKPDy9MfymPVLC9bELPm2jECsTLcc5y/1qsHx2tDXzzm1LGqaz/m4ufjuda3/Ezk7R8=);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" vertex="1"><mxGeometry as="geometry" height="25.499999999999993" width="26.444444444444436" /></mxCell>
<mxCell id="logging_i5" parent="logging_i3" style="vsdxID=19;fillColor=#FCFBFA;gradientColor=none;shape=stencil(lVbbVuMwDPyavOrYkuPLM7D/wVnKNofSckLZLX+Pu3EUW20VeEvVmXg8uqWju/ft49umQ/N+HA8vm3/D03Hb0X2HOOy3m3E45qeOHjq6ez6Mmz/j4WP/NP1+ezwjz0+vh7/nN5wmXnTQxzMLzecUQSD3P/Brwv/+GCeCLQwPHgvDCoo5YQFFQFtAJUSQykEnugSVkAeT6sN3w74WWxHKyRH6oKlNAXrbqqXEV57l1qgS6j2fpekNc+ibgmMA6lV7K8ocSuC88LdKwnwHC1JvlVsSoKtyqQcKjdwVvAHfXi/lBOJtAgZwriU4iL1CIFmeyUAMtwk9JB0u/ab5fLZ7obDdCBhat3NOkFq7KxBxsq3mxkK4Xv1Sa0Vg9UmUcnUfFs/dSdIkEpDrVbw6I36KX5tB5vsJNrphQYwq07plpFVR9JBpjdLnk2mUrba66WTdeepE3bH+ucuJO+hmNhfM9bJD8KKnVgj9UlPc5kErbA/U4nMjKL5lfPCS4LQDcvcJRRHIq5OK2rqxRikyQnAk329JIeQbkPQ0aZvBcandIlxshsDNziXDnGWVGRCj6nIxVJhlUkXF74rAey+hJna2l6XW+xQlZp5dCeyq1LxDvJKJS6krQzUTnLC1GgPI/nCFtqNDWbZKga2MvPywfLA9D7vd9L1X/y8/8HJo+jikhy8=);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" vertex="1"><mxGeometry as="geometry" height="26.129629629629623" width="27.074074074074066" /></mxCell>
<mxCell id="logging_i6" parent="logging_i2" style="vsdxID=20;fillColor=none;gradientColor=none;strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" vertex="1"><mxGeometry as="geometry" height="24.555555555555546" width="25.814814814814806" x="0.3148148148148147" y="0.3148148148148147" /></mxCell>
<mxCell id="logging_i7" parent="logging_i6" style="vsdxID=21;fillColor=#2d5967;gradientColor=none;shape=stencil(lZPdcoIwEIWfJrc7Sdb8XVt9D0exZErBidjq2xeaAMla2undcjiHfBt2GW6v9eFSMcmvfejeqk9/6muGL0xK39ZV8P1QMdwx3J67UL2G7tae4vPlMDrH6r37GL9wjzmHoNSYkvwRFStAi29lHwPHW4gJ8RxJkpVgdJTucnZxl1xJsghOJBcmlwSNyYXUlc5vfJsBa9gQXuqnvAqcI7gKOMFVoJDQapCEdogZAmsA1TosL0gF5+vW/CZ+tD/9Bg3GlH1NibmrWZiacgKcLptaPLgyACXo4s97XIO0IHQJuQE6KQqsIpggyZxkMzdxI9hfrvPvuf53YCiWNTr7polbmL+nazdIcWVx9wU=);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" vertex="1"><mxGeometry as="geometry" height="5.35185185185185" width="13.222222222222218" x="9.759259259259256" y="17.94444444444444" /></mxCell>
<mxCell id="logging_i8" parent="logging_i6" style="vsdxID=22;fillColor=#2d5967;gradientColor=none;shape=stencil(lZXRcoMgEEW/xtcdWEDhOU3/I9OYxmkaM8a05u+LQ0BYIm3fcL3XOXtdoBKb63F3aStk13HoP9rvbj8eK/FSIXbnYzt0o11VYluJzaEf2vehv5337vmym5Xz6rP/mr8wOR83oHB2Ibu7itEgXeXVGU7dOTVgnRoa0KZg0NCI1FCD4OsGCYhl/dttcD1wJxBgPBKnFjahF9XmIcIgYvIhEpnoUTEKGr0OGxkI/SprMGT0C2roJ4P3pFFKlP0p6NKHJ6V6ShrFc8/gJ8yCvmf0njUWUfznsJHBVRBBiiJtA7VIaS2J1ARXg1EprkVRZAo4YyktKlClEQ9635wsJrvoPSlwnoFyAsrCxpuy2QykQfS3rUXlGSlolaKylJOljIveM5Iky/89jTHbepSOpBhlNmU8gdBnv76RvOQpov0kT0ezLGfAVNqVHUFZPF//fSD/ZrCL5fw/dKeTuz7i9/S+sCV314jtDw==);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" vertex="1"><mxGeometry as="geometry" height="23.29629629629629" width="23.29629629629629" /></mxCell>
<mxCell id="logging_i9" parent="logging_i6" style="vsdxID=23;fillColor=#2d5967;gradientColor=none;shape=stencil(nZLdCsIwDIWfJrcjNuvA6znfY7DOFms7uvn39rYEcQ4sxbtzki+5yAlQO+t+UiBwXoI/q7sZFg10ACGM0yqYJSqgDqgdfVCn4K9uYD/1iUzq4m9pw4PnJKYRgU+2O2R/ZNYat2Lfzb/gDNrIUvJ7pcCqbkphqivc/4Y3dxCyGM1eIc9G8cllNNZyrOv+NsdY4h+g7gU=);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" vertex="1"><mxGeometry as="geometry" height="2.5185185185185177" width="0.9444444444444442" x="1.8888888888888884" y="2.203703703703703" /></mxCell>
<mxCell id="logging_i10" parent="logging_i6" style="vsdxID=24;fillColor=#2d5967;gradientColor=none;shape=stencil(nZBLCoAwDERPk31tjuDnHoLVBmsrtf5ub0sQRdzobiZ5ycAA5pOuRwVSTMG7Xq3UBA1YgJRktfIUogIsAfPWedV5N9uG/VgnMqnBLenDxneZEOlGip09u4pRQ/aG/gTPhFf0Gf8J/otGcdXRkjHc5n3/rC+OuHosDw==);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" vertex="1"><mxGeometry as="geometry" height="0.3148148148148147" width="0.3148148148148147" x="4.092592592592592" y="4.092592592592592" /></mxCell>
<mxCell id="logging_i11" parent="logging_i6" style="vsdxID=25;fillColor=#2d5967;gradientColor=none;shape=stencil(nZBLCoAwDERPk31tjuDnHoLVBmsrtf5ub0sQRdzobiZ5ycAA5pOuRwVSTMG7Xq3UBA1YgJRktfIUogIsAfPWedV5N9uG/VgnMqnBLenDxneZEOlGip09u4pRQ/aG/gTPhFf0Gf8J/otGcdXRkjHc5n3/rC+OuHosDw==);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" vertex="1"><mxGeometry as="geometry" height="0.3148148148148147" width="0.3148148148148147" x="4.092592592592592" y="2.8333333333333326" /></mxCell>
<mxCell id="logging_i12" parent="logging_i6" style="vsdxID=26;fillColor=#2d5967;gradientColor=none;shape=stencil(lZLZDoIwEEW/pq+T0qELz4j/QUKRRqQEcPt7WxsjaNDyNsu5N5PJJZiPTdlrwug4Dfaor6aaGoI7wpjpGj2YyVUEC4J5bQd9GOy5q0Lfl5701clevMMt6FgKmHkVo/cwSSh99vuAt6ab4akCqRa4YODbNYFESGS8/2sZBQsOii9wd57K1gWZBL485oe7pCDTWPj7L8iBi3UBE6Aw1p3GgpiA3PKQDc/eGJS/uCvemaxN24ZIz/efGXajkH8sHg==);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" vertex="1"><mxGeometry as="geometry" height="2.5185185185185177" width="2.5185185185185177" x="5.666666666666665" y="1.8888888888888884" /></mxCell>
<mxCell id="logging_i13" parent="logging_i6" style="vsdxID=27;fillColor=#2d5967;gradientColor=none;shape=stencil(jVbLcsMgDPwaXzWAeJhz2v5HpnEaT9Mk4yRt+ve1i7FBih83hNcsKy2CAjfXw/ZSFUpcb835s/qpd7dDgS+FUvXpUDX1rR0V+FrgZn9uqo/mfD/tQnzZdshu9HX+7lZ4hP+MAtP9pMRvmBD/0VvAvt+bAJbhI0asTMHioUKoFGjfI/opDfGfB4YZGdeIMYLQc6QavM9plQSnc2qR06IGV+a8Iqc1s0JFTmgNdHFKmOyqn3ElKEu0ttmVOW9pwds56jSJ/ZQ3YE1OP1Sij6UQObX24wYxx0wQW8eIx1V7mpLkOd1ZFJgss1azd0CclSaTSozkaVWQYlaVeYRL7psokVc69d+06kVjl4qqTk5LNBXRTKqcHN/M5j3jsT6tPut5X3A50lkQfk6LI4lstVmZS7EjfXQTP6WGyBkhU92BWafkNUTHqAVoUkJUrISLshU3Lu9NinDbwRgDtyKy21JJN0tMnSMBCSvTjElNpjWr4eRNXQJM85N+rGl/8mBIc+TeHUET1MazuyBdOObXsWvoyYl1jH5RueMd8knDoD0yKQ0SxNpql/Q+ElA60ii4aMtz7ohkZvC8Yyx1gXYwPiz29fEY3iXpd/oQaafCIwZf/wA=);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" vertex="1"><mxGeometry as="geometry" height="2.8333333333333326" width="2.203703703703703" x="8.814814814814811" y="1.8888888888888884" /></mxCell>
<mxCell id="logging_i14" parent="logging_i6" style="vsdxID=28;fillColor=#2d5967;gradientColor=none;shape=stencil(lVPbEoIgEP0aXhnYVcHnLv/RpCaTqUN2+/tgKEpIx952l3OYc/ZCcHWud31JgJ0H3R3LmyqGmuCaAKi2LrUaTERwQ3BVdbo86O7SFi7vdxZpo1N3tT/cHY8zZjnAHi532dZBG9V+QQXQdCk2ZZTxERiRIk4TQCz/fLFiNIrHKhJJZb7053dvfgtOQ4cBfH/RrtE8JvCg+XeIugAhBCPIq5ILKuQ/o8iA2nSKkIVzlrO+BIt8Ca/IOzMlP4p3yW+ENycDa4JTzmc2MrKWZDQT04Q/tn0WaoLPQVWqadw9fr+HB2hK7nhx8wQ=);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" vertex="1"><mxGeometry as="geometry" height="2.5185185185185177" width="2.203703703703703" x="12.277777777777773" y="1.8888888888888884" /></mxCell>
<mxCell id="logging_i15" parent="logging_i6" style="vsdxID=29;fillColor=#2d5967;gradientColor=none;shape=stencil(jZXbbsIwDIafprdWEud4zdh7oFFGNUZRgQ3efqmStnFY2kpcJOZ3P8ex4wo31+PuUleCXW9d+1X/NvvbscK3SojmfKy75uZXFW4r3Bzarv7s2vt5H/aXXa/sV9/tT/+FR/CzCtD0XoI9g0UI6Lf+9x4cPu5d8OBBYBRoHl0GE8hoeYhg0TiantHEogLDVlowLiowVRSwyMFkWEaZ3IHKmElgkcH98Sh18cACpKRgNMAkhTMKVg6EpmRGsT7z3M5hGWU6AcrNMp0GnEVyNpthCdZR5uAwpXjKXhEqODhNwaOolOHEpXzcVBVN1o4xz+An1Xq+YWNjjHwJkuKVAqUyvL94Q/G+0rmaLW0JfLnCJAdpKB8RMMv+P201qQp8pSHrrPTD5Y5Og4wsbYdyWH16g8ANxafdM3Ry8uqI1yvCV1Xp8k/NOXkAU4+88goBWwEOq6Vq9SbtaMCpKmvJqVVyOg130q8sbWdA6cXsOv8YLV9uOixKjycNd8V48YtpOB2a0ynMtvT/fJh5UxiEuP0D);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" vertex="1"><mxGeometry as="geometry" height="1.5740740740740735" width="2.5185185185185177" x="15.740740740740735" y="1.8888888888888884" /></mxCell>
<mxCell id="logging_i16" parent="logging_i6" style="vsdxID=30;fillColor=#2d5967;gradientColor=none;shape=stencil(lZPbkoMgDIafhttMICJw3cN7dFq7Mmu1Q+3p7VcnthXdddi7JH6B/49E0OpS7s6FUHhpQ/Nd3P2hLQWthVK+Lovg2y4StBG0Ojah+ArNtT5wft71ZB+dmlt/woP7JGLfo/DJOWdbRitfj1CjQKeyGgFlBGcIOvu7QZn0w5MVU6c4VqEdZPmCiliD0ZDbMb2/Bh6enF8wlIwF4h58qLf19zCGkpWAL4oG6jMBmkKJM57pnTTE7iyBWXSXm5k760C62J3F2JrLII+dOYx9vd7cryLHlyb9s3+84EW0Cz5LcvRVxTs2/j5dqq7EC0mbHw==);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" vertex="1"><mxGeometry as="geometry" height="2.203703703703703" width="2.203703703703703" x="18.888888888888882" y="1.8888888888888884" /></mxCell>
<mxCell id="logging_i17" parent="logging_i6" style="vsdxID=31;fillColor=#2d5967;gradientColor=none;shape=stencil(nVXbcsIgEP2avO7ALgR4tvY/nBprpladqK39+yYFwiUGtW/k5Cxn71S0OG1Xx6ZCdjp3h4/mu12ftxW9VIjtftt07bk/VbSsaLE5dM17d7js1/b7uBqYw+nz8DXccLV2NQOFgxWyH4do4PoPebUGb5fOWnBHUKClM/EQB6otdEULKU9x37IG7YSuZCGNwIVjOUgioCqJa+MJo7hQoCgVNxhcdJAgH9aoH7McRBpqUdI3NQhM9UkAM6k+ZyxVJz6JPnAcgOpO7MHCAzrEhFP/vDNRcXzmJSieqo/lmRFXWcnHQo3StQDUqTRLZUXvHKWyrKRJJtzI0xt9XvsWkkVN5CCyJrvXY7wPxGQ9BlJm/T0RjjhJcLMp3rX7aBI92fkon/QQGYhsBFGDVKmPccfQNMmUs2b0pQqTO9+LNxqiz/04qzRleZf4nWaMbXhuU9KPZ7WgX/uJeUJ/3BxBP9qtvkcYGJ7qx7n0cyJBFOsvKVR2fgvG4+a3cDS28/WXxmfpgU7VebJKZL/CblLDfvsHWec9k9LjKB8yeOBhfNqgP4R3eNPudvYZj//n73YP2Teflr8=);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" vertex="1"><mxGeometry as="geometry" height="2.5185185185185177" width="1.5740740740740735" x="1.8888888888888884" y="6.925925925925924" /></mxCell>
<mxCell id="logging_i18" parent="logging_i6" style="vsdxID=32;fillColor=#2d5967;gradientColor=none;shape=stencil(nZBLCoAwDERPk31tjuDnHoLVBmsrtf5ub0sQRdzobiZ5ycAA5pOuRwVSTMG7Xq3UBA1YgJRktfIUogIsAfPWedV5N9uG/VgnMqnBLenDxneZEOlGip09u4pRQ/aG/gTPhFf0Gf8J/otGcdXRkjHc5n3/rC+OuHosDw==);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" vertex="1"><mxGeometry as="geometry" height="0.3148148148148147" width="0.3148148148148147" x="4.092592592592592" y="9.129629629629626" /></mxCell>
<mxCell id="logging_i19" parent="logging_i6" style="vsdxID=33;fillColor=#2d5967;gradientColor=none;shape=stencil(nZBLCoAwDERPk31tjuDnHoLVBmsrtf5ub0sQRdzobiZ5ycAA5pOuRwVSTMG7Xq3UBA1YgJRktfIUogIsAfPWedV5N9uG/VgnMqnBLenDxneZEOlGip09u4pRQ/aG/gTPhFf0Gf8J/otGcdXRkjHc5n3/rC+OuHosDw==);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" vertex="1"><mxGeometry as="geometry" height="0.3148148148148147" width="0.3148148148148147" x="4.092592592592592" y="7.870370370370368" /></mxCell>
<mxCell id="logging_i20" parent="logging_i6" style="vsdxID=34;fillColor=#2d5967;gradientColor=none;shape=stencil(lZLdDoIwDIWfZrfNto6NXaO+BwlDFpERwL+3l7kQQSOOu9P260naHIJZX+WtIZz2Q+dO5maLoSK4I5zbpjKdHUZFcE8wK11njp27NEWo29yTXp3d1Tvcw55WkEi/xekjdOirOgS4ts0MVhQUxsIiBaUXMAqg+vcCl5BGu9NYEBkotoCFmq6IcGZ0xZsLQB2Pf39EIkix8m8EpuL9p2EULBNI5Za/bErKH3gU70CWtq5DnufzzwCPrRB+3D8B);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" vertex="1"><mxGeometry as="geometry" height="2.5185185185185177" width="2.5185185185185177" x="5.666666666666665" y="6.925925925925924" /></mxCell>
<mxCell id="logging_i21" parent="logging_i6" style="vsdxID=35;fillColor=#2d5967;gradientColor=none;shape=stencil(lZTRdsIgDIafprc5kEAK1869h2fWtWfOeqpu7u3XDmwbcPV4Bz8JH4GfFLQ61ZtjVaA6nbv2o/putue6oJcCsTnUVdec+1FB64JWu7ar3rv2ctiG+XEzRA6jz/Zr2OEa8tCA0kMWqp+g6BJU+ae8hoS3SxcydAhwU0ZUkMFRkK4YJBUj4tRoMBwjSEbEqXVgzRJWSWZpgbVkzg4WFa8AjcSimqKipJVaAs+vSOf7RhRhRi/7A1lJJ87o7AD9En+eEyW24GzC54zPCrx7yLcM+km8IfCSbvpbRUknAzqp3riMjh5w0W2WE68ZoATOJitde7Bawt2dhx+j/rO6k3CNgJLt7zw7EEr0zWAjeNFvnqe7lN4fje4kUT2sdBHIyddCMIm57zxvXuX8n9wKT3vJvjk813z6wdS6ds1+HzrffD1tdb0U2iStfwE=);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" vertex="1"><mxGeometry as="geometry" height="2.5185185185185177" width="1.2592592592592589" x="9.129629629629626" y="6.925925925925924" /></mxCell>
<mxCell id="logging_i22" parent="logging_i6" style="vsdxID=36;fillColor=#2d5967;gradientColor=none;shape=stencil(lVRBcsIwDHxNrhpbsmX7TOk/mBJKppQwAVr6+zq140RpyZSbo2jt1a6kilbn/eZUV6jOl659qz+b7WVf0VOF2Bz3dddc4qmidUWrXdvVr117PW7T92nTZ/an9/ajv+GWcEEB+x6F6itF0IA2P5HnBDg0xwnAGbASYAx4mgJerl16QqcE9sAmQ3LIYrnlhjlLg+ecNYQUUAbeKAMtqOF5Ktfr+3zNrwI9guP7AM0QrADYAMbfB5AG4scUIT9oXBQhB4GkIsYORIsi8S1FM0UMoJGKoF3wz4JBwXZe3ZysQ/BekuWRRSbmRqsKVzBWUmUHM+/UgnEMrAVRbcHig7KiBmslVVJgtaQaNSAtueKk6hwiBlzoNPVQ04ShRUp1akEMjj0rxXAMblGMqSPjIAae+eZAoxQjDiLOxPAEykoxxgn+e4qUlCM2rg9LdIMDw5Lu1JXMLRhQbuZdEaLQnS61wc7lrfaPNRgP4xLdNYdD2sHT//OlG0NpYdP6Gw==);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" vertex="1"><mxGeometry as="geometry" height="6.925925925925924" width="7.240740740740739" x="5.35185185185185" y="16.68518518518518" /></mxCell>
<mxCell id="logging_i23" parent="logging_i6" style="vsdxID=37;fillColor=#2d5967;gradientColor=none;shape=stencil(lZHdDoIwDIWfZrdNbcmAa8T3IGG4RWRkgD9vL3MxMg1E707brydNj+Bi0FWvBOEwOntSV1OPWvBeEJlOK2fGWQkuBReNdero7NTVoe4rT3p1thfvcAt7OUjyS4T30MBndQhsa7oFixGYQpass1++nALJdV4yJDJayBFowx+Bs4jf4cbpr+GP5n88ZZudxfvzjWnbENxy/pnU3Aopc/kA);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" vertex="1"><mxGeometry as="geometry" height="3.148148148148147" width="3.148148148148147" x="4.7222222222222205" y="21.4074074074074" /></mxCell>
<mxCell id="logging_i24" parent="logging_i6" style="vsdxID=38;fillColor=#2d5967;gradientColor=none;shape=stencil(lZXLcsIwDEW/JluNLfm5pu1/MCWUTClhArT07+vUMX6VkO4c+Sonkq6dhlan3frYNshO56F/b7+6zXnX0FOD2B127dCd3aqh54ZW235o34b+ctj45+N6VI6rj/5zfMPV5wkLBscsZN8+whn7fX7x8tfL4PXcbysOQk4JPM9gV/QBTcDspJlCVoIQk4p8yCBwM6lCSIKlOfoNFdhKA+XwKJkCpAHVQzQ3oGbRSgCpHF6UTRKUyNks53Idu72UWxScVpNDAjNpyX3sw06jAlnMOZ1hKNnERpb9D/TUYvSnx/bd4T+WzB2MzpAqkyOCmK/NxpRgLAFMF7XZapzuy2xenGSVk26ie0ZioKnobHxvOEIMLC8am3zihNImqmhh8VZUg3VT1Cbnp6rgKxlV9/nj0Zo/RwSoi/INiILvbH4bEdYqqme/lC+r+ystDCtRdANXD+lV93NrL/CqW8S7etvt9/6qT/fLu92F/H+Bnn8A);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" vertex="1"><mxGeometry as="geometry" height="16.05555555555555" width="16.999999999999993" x="8.814814814814811" y="3.462962962962962" /></mxCell>
<mxCell id="logging_i25" parent="logging_i6" style="vsdxID=39;fillColor=#2d5967;gradientColor=none;shape=stencil(lVbbUuMwDP2avGpsKb49s/AfDBSaodsyoeyWv193bcey0qTtW6JIPjrSkeKOHr62z5+bDtXXcTx8bP4Or8dtR786xGG/3YzDMT519NjRw9th3LyPh+/9a3r/fD57np9+H/6cTzilOKOBzDkK1U+yaKX+vz8l95fvMfnr9Nk6MDYH6DZCnTAZXABH2SebggGVw06UTN6BL17VZM0aejwm9C16BFO6xZ8SKujWgnUtevXJBqPA4hp2jcgG6sG4Fpnnl02IgCiYW+h9i64JjF9Ddx7It/j9hHWqPAtWgVcttBGsV3tNBE5gik5HcsG1gCwrxk3fSddAr1tkXseWW0Hm/aDW49Yeiw5z3Uz0lGlhuQCXGV+VdjyZsIXnQ1M4GtBCYHX8Cks200LtGXs37O/ZAe3KIISeGvfYrUCrQoqCD2JpxB1hRGkJUHJzgF6wQ3CC3OS0tLMUeKEmfnAZHrbZcJ5kBnNM8XQjfedAidbGIoqldWFpUphkNMEzr2zqQ9kMS/AspoxXABTK4knWioSr7F2cCLdafQ9BsPcKUDSf9yibfOy02JwXpF29FvC5rPT8ZJxLFOdZZjDSoPyd/DEWVpSfFbYsUjb9tSK9KD/3urX7UZ1WLHGuK5wnWSoSOyJ+2Xz0l8Tf7pYblkV8qLeTt2G3S5cb/l3eZqIp3YTo8R8=);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" vertex="1"><mxGeometry as="geometry" height="4.7222222222222205" width="4.407407407407406" x="12.907407407407403" y="9.444444444444441" /></mxCell>
<mxCell id="logging_i26" parent="logging_i6" style="vsdxID=40;fillColor=#2d5967;gradientColor=none;shape=stencil(lZRNcoMwDIVP463Glvwjr9P0HpmGFKYUMoS05PaFmpSoMzjJTjx/knlIQtHmVO6OhUJ96rv2o/iu9n2p6EUhVk1ZdFU/Roq2ijaHtiveu/bc7NPzcTeRU/TZfk0VhpTnImicslBfkkIO4q/wmvi6am54QghR8AaQ13kD3j6BUwRygrcMAdcTtCyu9TqKEZx5HHcBiAXuETjzKuwA3eP1mcFRDn87d6lTJh1HAnutv0hu7saAs+QhXMvOEgcws5OB5FX6Mgshgs20PTiwckzu9CUyUJDuIiBl/TnQLP2Zvy+++DPARvrzYI20xx44SoO5ThB4ORi5sXhyYe7zY7Bs56Gq67Tct+f/t3mU0p+Atj8=);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" vertex="1"><mxGeometry as="geometry" height="4.7222222222222205" width="3.462962962962962" x="17.94444444444444" y="9.444444444444441" /></mxCell>
<mxCell id="logging_i27" parent="logging_i6" style="vsdxID=41;fillColor=#2d5967;gradientColor=none;shape=stencil(lZXbcoIwEIafhtudZDcHcm3b93AqVqZWHNTWvn2hISQbRsC7sPzJt8ekoM3lsD1XBYrLtW0+q596dz0U9FIg1qdD1dbXblXQa0GbfdNWH21zO+3893nbK/vVV/Pdn3D3+5QF029C8esNUoj/7zevfr+1Xi79b+3A4LBB8h3ijt5gEWTQDCanQbpBRd5USkA9qILJgDBz9BEV2MYCSU6PmsFAFvQiWpZg9RzaYDglsLOoCcE4ThYcKwmcehKroJQcixbKkqPzgB1kuRacqhHUHDRPshrPw4lXoeYGHC6Gu1hgJNCG09PWCQFq0CXnxyakSWMTlwzoY316Yg741MSyBXl0/FFkMUHj4GigrJJdr4psdKQErRZjG0WP5rYEaTN8cvDAMklcOHWSxlqrrLCL4TscBzXwuzZVyPmpKri0ih8n+tH4itgywSULMrs7SIHJ+KlqMrTr+V2yRdbYNvb6mH+wlIVPoAzHJ6KV85zsCNeKBNKcnXoY0hHvyZnYJ7Xnk7ViVrpFfJ/29fHon7f0f/6edSb/FtLrHw==);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" vertex="1"><mxGeometry as="geometry" height="12.592592592592588" width="12.592592592592588" x="11.33333333333333" y="5.037037037037035" /></mxCell>
<mxCell id="sgw_i2" parent="139766069591360" style="vsdxID=43;fillColor=none;gradientColor=none;strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" vertex="1"><mxGeometry as="geometry" height="23.032258064516107" width="23.306451612903206" x="43.3467741935484" /></mxCell>
<mxCell id="sgw_i3" parent="sgw_i2" style="vsdxID=44;fillColor=#FCFBFA;gradientColor=none;shape=stencil(jVjLchQxDPyavaosv2SfefwHBYFsERJqCRD+Hi0zlsc9GS+3jSK7ZVlSt+cU3vy4//D97uTdj+fL09e73+dPz/en8Pbk/fnx/u5yftZfp/DuFN58frrcfbk8/Xz8tPz9/cPV8/rr29Ov6w4vy7oUSeS6yrs/i6VWqvWf5f2y4OPPy7KCF4coVP26ZDWxc4vhxa8+TJxXn9VUC8XVKSyWkMi1jVZTTRRm2L5QqSN29eR5RPeBUhrRi5DwCM+VYhzhi29hH+CzkIsjfnEU64jPkQqP+FIoA7zvmV9NkilN0Zkkj+iSKAmgOypweomWEIN3u+RLoDjFr5QDwHuqAC9mMXRH4kd0ocwArvHwDFzIpxE8VwqM4AxHVydfRvBMFe49W1mt4A/nx02TZPKt6FaDUPGzYOGW1B8jTZQLRJrbphZpogh3pE5hmqbUM9DAExXEdlCe6gP1ES0Yg9ZlkyRFslOv/gGSuhskvQLZlkTIUyDBPHmbPzZJrAksWN92OgAPFDBPbLOlg3vAZooFsV0AbAcTdEyUb6le85QqybTtvBVPCzVtirrNPOI4xpoKQahMtYyhqs+60dHI6ZOsYYvNLZs4lCtgi83/Dp6g61KmfJwmttyv3ql14WGoUE3KbQUitZvpkUaKYYzUdY5pkYYbnKgTDmgpdQ7q4DY+G7h/BTxBOSVuO72aJ0dhHE5JCWlKYpsVbEvYY7AexnisWE/qAzNCfW5hOxmxYzFKNWwAVloE7nYAGxvpHMNCGQftW7gflUIj8LWwYdJw2NGmmnhaHLoNzprYWr6PGk8ZGrgH/dLPGYE33Qw56ugHxkahpswERekAs+yYwO79dSKoJrX+WMHFY38tPh+n/juOU3VZ4FhtSSe5/UTU3qrj4bRLXcHDSZkEG9tlt2B5mgz1zwL+Nw6nVAzygc1ih1MZAPq6a0M7nOwON4u09EpolDJS6M7f6sKIbZI5pU437h9uUHTeUIaxdgZ9oERvDWmsXUDM5M65Jm+cTGL1+Cq64b8R/CaxZv65KW0TS9NEiI1nEys2wy0RnZdNrZh2skTYI8x0NwwvCLR2wlwsBVh49Be2wdaek430jmS974Rnr8ndi06fJh7r3e2uWb1Q2bPV0BF+7mXZ8ENn5YYvfeeGr30K5CB6WKgzfTDKVGDpwzTB3WoBM+iWqiHB5QZnaq7h19wVRqtzJZFpbVVjdeOmSgzHt/f9RltWGKVV7NY2z6o5M9YuvuxFKbvKLiZk7TWfrH8afGFLmn1MMNPR3Ydd7jWF+AjQ5kYpdP1GArnffkgJ3WvSK//x6UV/9A83n88PD8t3n+3/8UOPmpaPROHdXw==);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" vertex="1"><mxGeometry as="geometry" height="22.483870967741915" width="22.75806451612901" x="0.27419354838709653" y="0.27419354838709653" /></mxCell>
<mxCell id="sgw_i4" parent="sgw_i2" style="vsdxID=45;fillColor=#FCFBFA;gradientColor=none;shape=stencil(lVrbklQ3DPyafXX5fnkm5D+osIStEJZaIIG/j05mJNmtPT7J2zDI27YstVryPKQ3Xz+++/L4EP3Xby/Pfzz+/fT+28eH9MtDjE+fPz6+PH2jTw/p7UN68+H55fH3l+fvn9/f/v3l3WF5fPrz+a/jL/y4rcvZjXysiv7n7Zvo0vj3i19v9r99f7ktCPcV1aVyXxFgif8R70bNtXo3imyU79/8SHej4QIbJTaqM/anp8/TXot3JcBe23avJbicca8jrHsttP287jU5n9a9luRiXvdK38QteOLdCbgsUfDsUkDw3AE8u14QfOeo5mJaHJVd3Jh31zOYt7Y92nClr0cr6rL7Oap3caxHKy629Wg1rOcqrmwOVik+1p1SMG7Ms6uLNfml7M5ViwsQ282VDOcqrrb1XE3uR85VXRjr0TpH+xl4dS2u4N3lBuDN5bKCdzcAuzsP4TJc7Fvsro4NvKRWwB7Ow8GHG3ihg29QwIN3Ke3Qm3e+rui0pgKnkBWghyAEwvAtSIgJfHB1E/0taQbeF9A325tqxSUI/1BMajeKNuDA0CQlZMN0fQk2PJjnTvB71otgWiNeA3/1rrtkDp6imSMjaCozt0TXt+k/iB/g/KlLvDP+qMp/XBay5JfgN4lx4YCreBkEBtFaqtQGwZ/+MkdwZGJT/OIyJOqRDNv7H8kVyNSWJewF3/Jfo3yB8/cqxClEkblUnt1/kGMIU3TNRAarerO8pSiHlfjzrgP+uKJ/YkAP90/O9nD+IsQk8F2N+K7pRhC+uS06CZBSDHoCls4kFhLAE3FDWU/TSZL4qG5FxcGMacXvQ+QO41MN7eD9XpRSWe8Qg0H0d2K+LVcHKtdhxae44mMwfqiugrA4CAmyP2TmRsEnctvKmnlJgCWKHkXECHqUbQt6dB7qP1nFrfeJzQt4nzgfvU/lw8cVnwpTRe7ToqepP7bwQzldSyfrYcl8QG6isSXrpboJMrHV1u/d1BwSDB1rpAm6Q4hA0DdlLwYXEjyreBqmDJ5FNIo+EHITcFK3cQWv9uSkk/OWblyGG6clAYWR0qiSfUYVz0gKHi7Ai7QtAh5EXgnVqehQ8ZsLgiPRk4zu20JPPl6xi7ZMQnSG54h4C3hd70GwRbOeYgdgGVoSgGWSdo8Mru2hkKxrIEdLYXI6AU8qIhk8syiZwDPk+NFNDQSPQPBHX7YtMMmqi6S6RdrZgc1NcAPpXfYs4BI8Z9VFlzC4l3qn4BXBvQal9tIQ7NRwlwtwDPZMUisiOMpKqsimsKkRgxeOnnNwCLiUXuMYqGrHTUC/HKbaq1+NraY6HI+JrrQdZUPVjjUw16aRinpjode1A7mewVzNbPw2nHWawSejYIGTxaBVXYjF1GtKJqjXIV10ltkMQaJQrqDrfn6qpyOg+/8ZT36FzdpeT7AYyV3qu8CawQ+l0X7sNC3RHEYCmYw0hwtiYxaRTd/WK2/kUQmmWHqTwmQUL7HDNoynBWLfL/yEkobagWr8VKC2EhvnjJvFwk6lIG5Z3juISypKISA2KprDCAIkaDP+X8tb0OGQ9q/YPwUzbTmMMCVNdJJRXMDXWwrmlio3gKebxWa3NCU92SwSIxmNgZvFMeYhVba3FJUZJgmE5KXujGJUoNG3FYk0mm/nnoqujMVTZF/zzn51bJW7OT3bsNKywRR1EiOqayPkatKRfBKjfRdrFVa102mqv1AUVKxP2tLDwI9k/zpnhXqnuxX7tquP2sne7YtL+xGBKTq0BKRrNgKOWiV0rE715GyVu//ThqGAjKHWDkV7sY5tRkNVkV5Te7rWPJh3a6Mk9nVr31YdQT3yvqZW0VpyuCFpok0opmO1c+Jpjq2TqLRVp801nHt4ky+6HRk86IBXiGgaDySx2vditAaVectGIYagwxnGL5YIo764MH69EKiHqAUebuD4APWi62xPkIc+dvEsIvJVnPFU0u6RhxHN9iTdPKONic6YqSxbHOPGLVMNM20eTZ5gJJ2rEXNjCOVP40acfZDVnimPOSbMG4P3K3otRlENWgZs0gI/LCh6vZj1Nx1tyumpNV/h6Qob+t6b6Udv9k2qXIw/6ArNsNPOP0Yx4zaKehyA0K0FmIAQMVyM+oc+ZU51CuKer2MSShVSbgqGSUvvnwPpChv2wwnryPHMAXmXmj4GMHySlxd5ZgkcV2fwXl+mOBWrGXTTFQ7w/SHZ4Oq9vlkyEzQey5xFXjf6JBSdLOlQ2YPyo54Qr/5gSvsst5d+tAZunigYH++JtpHvj+dGQLd0O5iZXn8TDNoy3x0IigMK6dBRFNeqywdXLKRmvlW71X7m/YZ0A0o/bmPO35lx0lFMGSUj0yKarusQVeb9PmyU36Ee8YcJYfeAr52e2PtNc1PXS7h6xz0UOngiGW6r0pXryKfBJRR9/9GRT9kc7Ghi2rLX/YjomNauzUjgZ+OzqtXM/DaYJ/VjWAvDY0MdpZiSGZiXXt9rQX1/YT9N69h+F0TH/Ha9Z89/4MwXU3mU7t/4Ihgenwav0/gFnCF19uw3S6nBZnf2eVj7uH8jmN581snXJI0wl/16rFdGln6zx/38kT7or80+PH36dPux2vz/+Os0+ur2y7b09h8=);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" vertex="1"><mxGeometry as="geometry" height="23.032258064516107" width="23.306451612903206" /></mxCell>
<mxCell id="sgw_i5" parent="sgw_i2" style="vsdxID=46;fillColor=#2d5967;gradientColor=none;shape=stencil(lZXRbsIwDEW/pq9WEidx8sy2/0CjjGoMUIGt/P3SJU2xEZX2Fozd02vfuA2uzrv1qW2MOl/642f7020uuwZfGmO6w67tu0s6Nfja4Gp77NuP/ng9bPLv03rMHE9fx+/xCUOu0wjGjVVG3XIkONDxL/KWC96vfa7QJQFoqigRIkCdQ4PJIQ+25EyBANaUHKw5JXIrERcBwxI7lSBnOwVoOTu9YORwq8FaDh+FE6cjgnNLdE1AnuONA+843lgwyPk6gtKcjwaU53ydCv0SHyOEyPkRnOi8DRAE3kPgcBdAidZPA3vWeAJjONpzLnlA4lyCKFQHC1K0hrgoOsT6lImsDRBxenSgxNDHdhLHa6UEPcnWi/RkJqHbAQUhHauqElGi36kTgZOTbXEJbA2g8Jp6tBrV8c89n2w1zBqF0XUAvWh09+CzZLTJ1APXWO+YrRMYpMb7C24XfZY0EieTrde59nvaUBUe6uKYZaeFI3WX8T+73h5U4PBkK7nZkq3QcHqchd6vF8fpD4t13x3+t4nTYd7j226/z5+B+//l3k+h/M3A118=);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" vertex="1"><mxGeometry as="geometry" height="16.999999999999986" width="16.72580645161289" x="0.27419354838709653" y="0.27419354838709653" /></mxCell>
<mxCell id="sgw_i6" parent="sgw_i2" style="vsdxID=47;fillColor=#2d5967;gradientColor=none;shape=stencil(jZbdchshDIWfxrcakBCg6zR9j0zj1J66ccZx2vTtq+0usGhj0rtdLPazfs6BHd29Hh5e9jt0r9fL+cf+9/HxetjRlx3i8fmwvxyv+rSj+x3dPZ0v+++X89vz4/z+8jBFTk8/z7+mL7zP+9gBhWkXuj/zivv39nUO/vZ2maP9/GNwwHEJX5YcOJpX3nFeIb9ELO8IwksELSsIOS9By1KGMAL7AMmAPUGOPVk/QobtgaWH65d6NDmINII7kNSzSSDmnu16cNAI7MEeBHsyCyCOyJoi9eSYIXubNYcentIWzhBiT8+hbLxB1zZR7vHi62dau8FLz5cIPpmqO0im5ZLB5RF/Gk7D98719KgxaOjSRnJBRQEy2QvDsOlJh8lvkufU47NmaoqfGTD0eN1o6NohP+y8JHBsWi89W/Osc4l1oIJh14oV9DSZcai1uqNMYYRg2aoiw8aVHqmWInBPVyEzD+u+qmiZA0BjMZGAjcu4Hr02NvrA2U7H5/+3wc88U6uRh5McfJs/b/c0JWE1qzrLWByimSeX0WlKTqVCt1qaSs8rP2Mb0wXmPWTrJAoz5r3SRVFXhDzsaQAxOuZcD5JCD8UN1h4ajJC5GWIzlrF7J2ADV8fKtEld7LFFkKyWMqARslaWZGiiAaLxEYUVba9ab+QUIZncdYiMmGpdBwZq2LTREsvm1AzgrYGm+neqhRUzvC1kh9vE7eFF4E3hfWztKTOnR4X0eP2Tw7YLgbOntq+mVX2MW15YB4qtf2uUkZzOJo8NXPeY2kdfvK/xXbsUFMlRFUJNHzeay/Vic6v8BNLjleWMjUc94c3cTb5kzu4PvHTjeJ/56WaDPrRL6dPxdJrvtOvf7SVWl+YLMN3/BQ==);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" vertex="1"><mxGeometry as="geometry" height="20.016129032258046" width="20.016129032258046" x="2.7419354838709653" y="2.7419354838709653" /></mxCell>
<mxCell id="sgw_i7" parent="sgw_i2" style="vsdxID=48;fillColor=#2d5967;gradientColor=none;shape=stencil(lZPbDoMgDIafhtsGqCeu3fYeJuIkc2LQnd5+MrLMQ5Rx18L/NT8tJZj3ddFJwmk/GH2RD1UONcED4Vy1tTRqGCOCR4J5pY08G31rS5d3hVXa6KrvtsLTcYxSy3D6cnkWQZJ8Tk5O3qh2Is9SYDgHKCTZNhALYGIOCOBxCMAopDvA2hITgHwbWD6ZxYDRjqG5mm4rg8oyDkKE2I4oCAxpzBrwtH5tyTPcoK+z6ON3Cn+NyFPaKx+D3wJUqmnc/kzvlwszHrllw+Mb);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" vertex="1"><mxGeometry as="geometry" height="14.532258064516116" width="4.3870967741935445" x="10.419354838709669" y="5.2096774193548345" /></mxCell>
<mxCell id="sgw_i8" parent="sgw_i2" style="vsdxID=49;fillColor=#2d5967;gradientColor=none;shape=stencil(nZJbDoMgFERXwy+5Qin029p9mIiVlIJB+tp9ocTUatTYv/s4czOEQTTvmrKViEDnnb3Ih6p8g+gREaJMI53yoUK0QDSvrZNnZ2+mSn1bRjJWV3uPF55Jt+eYsKgi8EqTDODTnxKulRng/bKH2QI7Pb0AM4H5yAfBgs8LOMfwK9gBFtm8AP6H2QHDJisrguljRTixYGfjL63iofgGolZapzwN9+MAhVEKHy3e);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" vertex="1"><mxGeometry as="geometry" height="4.3870967741935445" width="6.854838709677413" x="5.483870967741931" y="10.419354838709669" /></mxCell>
<mxCell id="sgw_i9" parent="sgw_i2" style="vsdxID=50;fillColor=#2d5967;gradientColor=none;shape=stencil(lZLdDoIwDIWfZrdL17KA14jvQcKQRWRkgD9v7+ZiBAwgd+36na5tDqO0q/JWMYSut+ai7rroK0ZHhqibSlndu4hRxigtjVVna4amCHmbe9JHV3PzHR5BJwC8BuEZ8gh4It4vp4DXuhnhSBxojyASHOVEIJAn8bKAXHn6AyzD09nlCvnb9rP5n2MnMYddh5EHDit7zg+/E984+ybugq8lSl3XwVHj+txC7inYj7IX);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" vertex="1"><mxGeometry as="geometry" height="4.3870967741935445" width="6.854838709677413" x="13.161290322580633" y="10.419354838709669" /></mxCell>
</root>
</mxGraphModel>
</diagram>
</mxfile>

View File

@@ -0,0 +1,289 @@
%PDF-1.4
%“Œ‹ž ReportLab Generated PDF document (opensource)
1 0 obj
<<
/F1 2 0 R /F2 3 0 R /F3 4 0 R /F4 6 0 R /F5 12 0 R /F6 15 0 R
>>
endobj
2 0 obj
<<
/BaseFont /Helvetica /Encoding /WinAnsiEncoding /Name /F1 /Subtype /Type1 /Type /Font
>>
endobj
3 0 obj
<<
/BaseFont /Helvetica-Oblique /Encoding /WinAnsiEncoding /Name /F2 /Subtype /Type1 /Type /Font
>>
endobj
4 0 obj
<<
/BaseFont /Helvetica-Bold /Encoding /WinAnsiEncoding /Name /F3 /Subtype /Type1 /Type /Font
>>
endobj
5 0 obj
<<
/Contents 22 0 R /MediaBox [ 0 0 612 792 ] /Parent 21 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
>>
/Type /Page
>>
endobj
6 0 obj
<<
/BaseFont /Symbol /Name /F4 /Subtype /Type1 /Type /Font
>>
endobj
7 0 obj
<<
/Contents 23 0 R /MediaBox [ 0 0 612 792 ] /Parent 21 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
>>
/Type /Page
>>
endobj
8 0 obj
<<
/Contents 24 0 R /MediaBox [ 0 0 612 792 ] /Parent 21 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
>>
/Type /Page
>>
endobj
9 0 obj
<<
/Contents 25 0 R /MediaBox [ 0 0 612 792 ] /Parent 21 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
>>
/Type /Page
>>
endobj
10 0 obj
<<
/Contents 26 0 R /MediaBox [ 0 0 612 792 ] /Parent 21 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
>>
/Type /Page
>>
endobj
11 0 obj
<<
/Contents 27 0 R /MediaBox [ 0 0 612 792 ] /Parent 21 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
>>
/Type /Page
>>
endobj
12 0 obj
<<
/BaseFont /Helvetica-BoldOblique /Encoding /WinAnsiEncoding /Name /F5 /Subtype /Type1 /Type /Font
>>
endobj
13 0 obj
<<
/Contents 28 0 R /MediaBox [ 0 0 612 792 ] /Parent 21 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
>>
/Type /Page
>>
endobj
14 0 obj
<<
/Contents 29 0 R /MediaBox [ 0 0 612 792 ] /Parent 21 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
>>
/Type /Page
>>
endobj
15 0 obj
<<
/BaseFont /ZapfDingbats /Name /F6 /Subtype /Type1 /Type /Font
>>
endobj
16 0 obj
<<
/Contents 30 0 R /MediaBox [ 0 0 612 792 ] /Parent 21 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
>>
/Type /Page
>>
endobj
17 0 obj
<<
/Contents 31 0 R /MediaBox [ 0 0 612 792 ] /Parent 21 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
>>
/Type /Page
>>
endobj
18 0 obj
<<
/Contents 32 0 R /MediaBox [ 0 0 612 792 ] /Parent 21 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
>>
/Type /Page
>>
endobj
19 0 obj
<<
/PageMode /UseNone /Pages 21 0 R /Type /Catalog
>>
endobj
20 0 obj
<<
/Author (Carlos Mendoza) /CreationDate (D:20260412224013-03'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260412224013-03'00') /Producer (ReportLab PDF Library - \(opensource\))
/Subject (OCI Architecture Proposal) /Title (Mercado Libre \(MELI\) \204 KVS \204 OCI NoSQL Database) /Trapped /False
>>
endobj
21 0 obj
<<
/Count 11 /Kids [ 5 0 R 7 0 R 8 0 R 9 0 R 10 0 R 11 0 R 13 0 R 14 0 R 16 0 R 17 0 R
18 0 R ] /Type /Pages
>>
endobj
22 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 589
>>
stream
Gatn!?#/1K'Sc)J/)JIV0[9I"m)q$K+=pf&@X=:YeQ*FrgWF'=,@`rea*(Y;X:u"/TOS;#o/tG57mqujF'\s@149#D_$.+r\7,fu$<PpIa,KOfE,ED#M3[$6.7>o-[okMaa-:+4J`*aqT.uNtP#b6nV<MnQXMjb?P"\-^LoMtESPYi>7_1i?^f)!jfh=sh;?`pWYr.o=9W/^QnDaga:.:@k0Wm.F%;p*:/+Bn3G.:[+ETq:nM`c3K$b#Zc%,#i8k6'Xek]jl]Wq(&/NfMb.=10N)hUepp5i;Is+3T6u[Q^@#BWc2RqM&8KIG"GJ[I?n5@&2BHZl<9)='^a<*q3j\Jc4\U7r<M57aQOmUV&eH=,EOBLYZCO1ld<CeoY@-1#B8WRlnH/+h*0GWdLIWD!'>NX6&L1"o]43bnGoP4H6*=9N*W41d\88+1.K`A2U+#GhM[ApM4Su0OpllqXrYOQaX42[WQNZQ$N<0UjTA4I.lRKbFcH&iPW@2HA=Ak(l+$2n&ipQVeC&h4S@$$D])0@?T"(<ru].4%@(jOm@(olZM9EK@.VNL;>IrAZIoH:G+g";:IHr7"8`DtP5~>endstream
endobj
23 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 1866
>>
stream
Gau0D>?BQ=&:WeDbfcTAp(1`UnuZg5BX]R0"%g!!^l,F^7)bKl[V>!0hiW:X#fJ<rpMc"Dm$[Z]k0qPQ"DmuZk'*$k9]g<dQ2mU4?N=LMKD@Ntbn%N/=FOX>+U*f#bU*&2Io3_%G<k-a5mAqDht8)qf+#qRJ_<>a0$r<=bA3>Fb].@<^g_ulSdQ<K,-DGkW<GfpaXAu4.?#m4MKkZ/\\(c@Y"':@kO5T]]n6&]R(q35[fqV(q;.G,8Y.ME/@&1EA4siJm4baV7VJ"46^Ik\cn8I=l]\*/e4uFnJ+\\RNoa(A1p@#`DT\:IkT3MJZ,0o7j5[P1#uI+;>6:.YSQ<V6_7);!.+L=&2$=9f0crP(poqFP82chh*PHSlZhB4oQUYUP6r]HB:;Er';m,O1f\EasKq25g#6Gun(m>iJ'PZ^f;ht"-51ap9?MN#]+U40b2QC8pSm<]Ll.jW9FFtJj1fYZ*$cPb9!/FMhL!6lCUgto!T"rC]B<Y-U\]@bXGm;;rB!%u+e,,*%q<8"hU$cI"`9:OCearof$#@@qJO_1C$?5?!gU<g:2i/ra:Ah;#(AEms\QmtO$H-BsU9]<*=+u/S>:U</a9VeJ&6X+)#X"$=>_u3G.<l1-*[1;XUq+'l6lSTK.bskQb8#+ICK3,?8tJK+5YM`Rpf9t?6:IkooHhYd65GR6=@5@_0o@Uua%r_6XOIH0/98[bOfKXG-tKnaKEC4FUdL@.Yt/tE<qdHu!^eK>50CB1PN(DHqmi\=?/h9O>CfBD8Ym+BHC0u]<Z_kg\Bd5kBV7):CV)3a`oK#IIEeBY7]n35+0qZ:$jJ?aWqk#"bmT9Ef$`/hpBZT0Yk\ci#M,ShV=JB3>$#8g-C5-tl$Y!Y,h#Od]YWBQS;`kq^Cerc&?7UP3KT.j0-5lXM.c"u,+!F`cj'pG\<?bZ-F2tiL5bmp!kR#Fp3:0oTs=_ql0`9S7:b/jL'UP8s+.2sUbNRMfsn"V&W]ro0OFNL(R#Kjng*H/QkMGH_OE]gDf+m"CU?rE)NoFYGPJ8D$Xhp`bka[JpP.+9SO(EIS?&L]NU#SdBD6H[4;jVa-grd2ZcdDLjiAI&4UA_b9<d'l#c;kUVgFjth.@_;%@k@s-aQV3TBBjar*R3"m/"\EF"=8[Z'Q61%`@*lf+sm]`Y3R@6lX?#h.5&<k=u^;jE6aQD(:S55M9$.gsng_EGk(:QjfC-m>j'#9r9+sR<W4<CgoND!1ptP2:EF"0A-gqWU&r-2/cm61@D&\WD&M09;g?_4i2Ha;X`-eeRj[g_?4.-R"-94K!Kq3_3pmCYklV@:md_YS'J6J+JO=f%o:f21TX2FU&trW*,,fUoD%PA$Cf4":\#g;nV0QCfPQ`1aA9LsbrbT+;tIDqf'?S+=GuW9ZCcqtE?O#`hcD.H"O+g%@#Q8LK=6#apCbgG"+;hB]te^YBuHIdl0d_&Qbt-W3d%.dRW]LV/t0RXNFuI)'/ui6rK`&_QX&>n3KNo\8sjPU[kCR[fsFg4V:>'CV"XDk`"T^`Z""#`WI9?SX8/[,8f:sG?3Kt:\uX==!c9he:GsYKhRRUZF0Q0>hgM@OO0QoEVU*M?qQ"-;@ej<$lt9=^r]ptO`AA#'p]VfFZ,?WHQJ*FpRO3ZS+tg<]X=F+E4rB5$fPupZJmE_gEcp-g!nqZKJE7(I)aF'=jL.A`_3!SVoGGLg4i3!YhBhl&Y*q]J^K^Scs1\KPIt3sTPa[?eeK)6gfm;uCNkP7aIecNp[<l_r8)$2\mL_oFL!3q$009o5GWP$a<O;$u3B"9[U\1X6J^)cG7I$/IR5B)!%H9K53ektnS*V)hN`EHLV5OXa.8Ed'>k_6&1qgF8]l]]pK7<olX"Ro~>endstream
endobj
24 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 2750
>>
stream
Gau0E>?BQM&q9"FeB=GN+VqZb2J6>987kC8+Yh*Opn]ROm@Hj`7kL-?J,OiH\l]/H_Cdj=@+"DFY,\\jX")(5(I+Mi*@4*lDWp_`8"NL8$h?V3Umk#'HZSi>a;GEB@-!O3&&Oon&,sbM07P&=FF06M0;Ln;:C6]?6i.SHjJW\MA8*9d?O:ejT]_A&E^J(koR#XaP1LXL[c@NsV32R,%jf`9P$''mRP*,AP;MZ3]tM(G*ZrkU5BQK9bA89mHHr2@3ddgRKpp1A=!DN&ECTA0kX(8kl](`pBkSU@,c=_u'X3\I./Wf>>31eH-h'LoLX+6rG:f,DJk%B^4_HTfD'#l:'pJ+_rRQPG5c6fnGA5tETMq(/B&:>lKd3N/Na+gcQC.&SjAO():Yu<Ugql6cM`U%LW+EP]cb5hEUZSG>4<1g34W?I@RTpWoGbmWt<'MA<h&\c85.%$/e/Jh;?=hZkq`EtHf:u,WR>G25<5A)T=iW!iq-CD9(>Y[`mgnVCP7*dU,#\2X:.Ah7'hLc=K2j/V7CW7gV2J$74=d/=aQ,W+L[Hh(0qb^>G0bi(oM4NF/Xsg`7X<1OFflAM+'>hq)<EA?Ah>78:_DOKm!GhQSCSn1ATep+Idi8Tld9'LX5f\dW)O[&8B+o2`M4QA@;!ofe8due,?-4+.`McuB6p\d.NEJ'ZW\h&6U^`9>D(jfdUF6_]*)qjn2Ba%HM3fFApf$S4bFdn:qoPB\L\D*^K\`u>_`ia++XH:@C)Ye&p,Ya\3$#bpi=YhbotP^rR'2YO6O@DaaWVKhl>aAb3Y(nBVf``;ij1[=?1YRnE+%u1Y3V-hB/[gWBCJnqZ/mK[NEQuqn;/r18of!p25^tB;3gc/A%<T_Pd%jm".Fdalc<c2o.g_IiF#]!7nQL,L#=#');V^_OiZQ#%=1h=qn6=;PlfdnS76/`0uNZPR'`>9pm"=amIWBo+)su9GbdD8Ho$a\F<PSg#PIGg#,XuA^6N++p,"dB<,-Uff]LM%-gEh_bd@u\Ut%GkmSct@KAV#M0.%2\j=RuG[Q*5R)P6(jgZ3S$sc7r"8@\e>[LoBI!=e,]PF[/FL'IHgh)!_RfH[)c37`5=k^+:n'Yo?)'.I%Q;lr9eDrXmohUWAH%GkHF^;:f)7iiDWk$l!DW"ZfcD6i"hI_RAM?FcN3QReajI&c0m!>F#0%1*lSai2kVou8&DfH*1(<AI@="dJmHO*%*h@bn_#[1b"Z(TRTZ]A<<>j55('Z:r]d%t&$q2+XkX[:/+Q]-2<SO.E70;$>KW'fpbK,fIYl/aZ<?!?-4RbLt=&;!?tno^WjFC"g!-EuqKL>2q*qSRc4:OB7un"YrNqnqp$p3X^9oCes,[eos>C;7f#U@LB-H=U0uDqa^#M8W\q27\-G$WU"jeWS:Y_0H_6Ds3tZs'J0DWIjSf2s&b'[6`XMKDa[aUXADXADC2gh:+X":atrLD38-]))j0gSa&TZB"RI/jO6VpFj0g8_'gp!jU^21kmYkkU[qMn"i`+![73eK.o`%nh#8qp\f24tZ:u`!!e$<JWWE/)FD-($VE66oX(ZDt2UXKdBTJQ5RDnq^_gQ]\@qU.8XS)<s>n['?Vm"I0(2Ig/aqdr%Z?7B<H7i^jE>fraoNqsprH3XMW@Pe0jm4FDK4i3bIXIR(?Z@YsM9,+pCd_s])=7;JeCece0#h.%(I]>$dJ[fm!NIX+l_\'2V(aENHJA\T.)O_bgFg\hOf>A<4p7H9)SQ?!FuE]JiS]%8WlJ(?doKDO/[hq>aS6).T\"f+]EY=I]i!og")_mn-@Z^ZK50OWi>5#j])"IuEE^"r;#=fI14^blo!lTqhh]8$Ae>,ZE^hf]3Fc6iSg\Y2deKt6@4"J%j9U<`Bftde&(+&4,$W3[rh+^LVT/oBm=d3YNGT#;qPG9r&tn*aM*tUX0@mA)=$59M<:GXg%)Dh@3Ss-j?__b].$TrZXGU,p>@#0gRRo!W<]B?kp"%>=b\_E8a35D^D(/EYmAeoG=XUM_+#/B:MK`>`.l.)2Edo8^]b`,kjc%BX#R>Hu*,2dKG)YW'U"?s2p!E8qK?@,c]o7P$-c)B)ABtc3'BWFZ8^Sj5*/tU<k_-9\P1mK0f!i`-`hGM:E_Z;l]"m5t[QEEGfW?6Nd-/58Dd`G[N9ck'aqF+I6<+_Vi;hu62+1-65Vp]MA2o=SJg<,!0HsRPJhq9!)C(S2@Qa`pSRss`U-j^9?.X'dUCm@nS(m+&C1WD_"@P3/G;ut7Q9]A(_$T%WlZqWgCg0YJR>LToECS699JQH]!H;1ucJ-ol.]X=M5j0,FMo&S%ErH7OH&^:o3-kA0'UYG4%#7hXF**Ae0$YD+[0R]`<-`T?M`J:NGHHWhCDQc[WWgks9'=a(Xm[4c6117Bcm#N*fJ4=a7HC/Vp'`L1;4Kp)Jf28bmSJ5m,)nA"mi(+=9.,4NkPbk>Jj+RO4<n[UB85du.B8]bj*$HRl!+I8I[>p[_tWl\`0O&>?<TH+NA'%(ZR/Z_CL<m]<>BQFhk5:*b0dnDYo(dq4StR"(=u[Oa0"58hdj_g!@/=HN_hIllSSsRD\#sihu%Fn`483U4["7"&WnYq;V9ZJ?)"qus0^<^fiP)ZIV1/KICH]A<4?$#(V*5`5&B-:h`j?q59ApBSCjO"T6T(mkAO\]?#a(qb&8An%/a_fhlcNX?*<`sZPrW3.\>p**idC`IVMn<@TTUTC0&#O!^G59c.6JS_T"%t/Y?d;5MI8@qCe$87D8~>endstream
endobj
25 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 1731
>>
stream
Gau0D9ip(1&Dcq.B(_Vd&S&r?bEPgq$T'.iDj?;lMaX[a\ZuVkrUk)>`?@M,5jP!]YTc`84.87"Wt;N*6^n$H%e+oO-Q`U*$F<qZY3!Oe'$b)Z5E;ff[%3#)70D-dps@nHgmfH`\3DIYF!:%#aMIJbVNo!iBO`[Eefr;p(pdJfUQGqM91[uf@%en+"X'.X!nfhR$oX;i(gJe``2S8[^5rccK<)?%Mtu,:0`)'\GM;3I7,h@#^GG[b'Xp29L#R*\1W>7<.'sRUA<Y))QboVn?*_,o-V#+1:,U9\onl5!j\Qb,BS?o*8\ATlmdYrC.ggJ)O%RMMTJlIe-@EerZnm(K!pUo*,_+P:#Ee9NZ+C/4CWj*TioG`E`jK"d1#OX*`=6d)#X3&HSUnUI^0JM<0'6<Li#,U3p]ngOMCZXkgos3%0tDadmjSm!MaVWA^o%Zc(!XB2.I#bhDuXm*,\ZT4a8OY)LMF"3WnW9ngAeuX_)4e,AS!4>3Dp'+"Vi\V)&l2VjJ"p1:$7Q&#aiPQ-K]7*<_/U6;dafh<lYQf=>5j]XV9NFO!B`;j/`=[o&]KFY/U&!jdW:+Tu!JcR2YVtdTFIJ[`j!ER"75ZU8m,e(K-?P4Q]'9pKXh>YZ`b8Lb'D#5c&"mfQ%En^k/6^\%H)tPbM&C%;lbZpf/$_<HSMZWShCZjlC%I"\nro\RaFUb3BD,m6.?`-ApsN2@'?Vg^#^ONGOQQCP%Btd(r+6H^JqC,T<QNm5rNZh[VuDLRoUa%R-@rS)G3`AiN!!E"!V59L(IDUF(G3HVeRaJfbmn]/+UY?l8CS!$2l#.14j`]j!aXDh[0=fUf?Y<JX="pEt`+LNqnZL2@@X?DFYD=nK1^:7`B3RgJK=PE*>#kpmFQc,X)ik9<Q-:2'^#s-rH;e=ke[Y<38MpT)iR\I)se*c=*V/5K]u;OsC14bas*Oq0d9[lLj[]>r:ZDL6&)L<^$f'db*N7s4-!naC&X>Zchd<X2aSb>Piu3A5-dp93WEF8!p]H7q_WPO215S0$[Aqq%cc]I=8YA,$lJZ":fIk!4lPfoGB^d=M)l`FV6lhmXDXW92%ERmS/7\q%79?$Ft_HL-D1k2ippIV[,VkekhVqQOE)#dJO=)r4nj>8*#k/S!J@[P+jWiJ-S5VR:^>om$l9m-'cCbOrPt'\8Kp[5>`m(Sm#17DcWnZKleL.Opd2LPtsQ+5OAUBI/AV$&tNk<4D-lK<FUT:;)do?1!JpS!+t.'\:7e$C),C`EICuH"M(u`='o@3([6&EDdsP_QZg(UWE[eB5<<=e82W8)f_cq9uil5JgV[himF!JV:&7[BOi9i6tS]L.,dfJ^9M4`!n)n[(Poa@nDft:HQg.J/k(,0INnS.<c=r%7DY4f,_^cS?6EO('ko+AL\fJMCq!2*;^UsX_VcD2h8ei9(7N.kVZ/>5B_]a9:H+s4krHgG_p$5INn9t6\\XrB(AcS^EER2QY8`fEoKn_G^)!F;;lj4$kp;m,\)OJ[jLR0L0nj2Q6Ga.#B@A$sr*pbD@3-50Int39<unkI6_j?^Ju12R1+k&ZdEO;A5V2bM2]*1\]nGN?i.Y<)j@JHK6*IHWm!)XB8JnjuU0b"F>+OS;`en:93E)(gSHL71dl4F&Z!=`1i]>&??taf9M8Je0XYs<5oB*N:LJ;KO8nA7e'[bP3N8h=J0Ug!pSAA?Ja&/co5G+HTo&>qDmZ]@JrDW@j8,i[Hm*k_~>endstream
endobj
26 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 1085
>>
stream
GauHJ9lJN8&A@P9Qt&G![3tr967E1>6jq2?Q`s1-W(BT>"i7BTlm-HA,6elu[G$Ua`h)?P1OcS/:*1's<u&N/,ojZ4+:sjj+=*/T4G2,Eiqn<Fb;4phcq#JHiVt'KGeHB;\Yqec0M4\99%bo0JWG^4SFt8LdmGf91PJR*P<p+gJ5ISc%('C>!\nL?":U2<3-nZ5X8JuKZgr0A^u`tUe$D!":S,Am)_@WXR+$aU0r$+S:R_-k]IN3Lb\nh$R,cJ4g4nY)Bqf.U^f+]WjHTH_4fL.5?WQAGQD"Ggb_FB5k?eQm1JCV!B.&n8hmVVU+@eRtE'`$B,Y]dXHWjF`B#:4(Nj^,PVp`]$B!e>%Am5b&kW_EEPgerrPRu*!oa+LLlAV<Cfe?]L:T$+E:J^HS<<b)J%,Q3P\0h_hpA:8\&GM`^H"pOaN_\m^A_Y]L<GdBRPcWDo,!R:HZ7O__W$4$V5:Z$C]ZWP&lXE!r)_&4D<:'?,kFWr<X_%:+\8TsC:#;.0]bR#lARf^KUq"Pta.Bm/g5!o?3ek$.EV-o>*;d92;Uj<%)EP-T*aI#G'q<`&Y0'c$'j%VSWnY.g3*pf'9;c\dWuA8]DS,UngTG&E[`?d:_\CliIa)(@<n>l>^@'^e<Hm'7G_m;E]Cpg-Y%-Cta"c*1J@+1]pY.prH-j2Ra;>B!Ph0=G]kPs4+/\\USTT7ckm*[tD=YMtUCB__jZ_ASglLlUMG15TC`)$@OT+"k2%1R3(4F2TWuhhSMs\C1VPWP7%bl/8rr1L$W0eRd7*&1[)bP;%X?1ZVgQbe7H_7HWJ1<JYrKf\k&32WUF^DSQ"P?@U%%KhmI&bY(2,PoqV8PEO@S*+'/#!r8Ke=ZP]Jftj`;1(`P"qjl.\g+cVSnq<a*9-e%bC5Lb(KAA`2'tA7Bo6Yh2%Z+bU(f!BFZh^<&`rXkoNJDeW!QC9.&2KB[:=Y<&`t.pE#5?eW"7Ucm@5%W#h[)WZ0>*U.VF)nJo]hkltTph2(>>nt`j:)oE:HWGY,M10o2:p0JLaWG^coXR'p#%=q)nj&ZqQ-e44"UDT@mWZ*i#AWk3UcRgPIquNk-PX>~>endstream
endobj
27 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 1004
>>
stream
GauHLgJSqU&:N^lqB;h)9?4SM*YUn=)DJ*Po!6,I:gaTkV"49Efk#.Lg50Fag4Gm/oJq>f3AnJO3$+gl+3afB&)cZH!$Pci%72i[K._6MX`#fR4BFfMP>3'JVg'NHi_rLecdj(p#%oL2^_gF=VJt5B_"id%R,*9IXc*Z,QkmPA!t:<FENm*4#%HUj$!8+jT\[eXUMO1#GB1+8@G(!j\gPD/4W)tk?pA*Y%>A692N3]Tq=S9gce"@sg+Zrd#LCeW^dYIEOtR%p,\H>/<!91P.Yn$CPmiO!WBkjm9BZ0)9b-lR8>KY02dUsB=AG_9\SN1S@s)MobJBm7`F?iUM96!V%V^\1$9W=?j-&o),C3L;?55ZDe/et[+Fh26bJj.TEEVa.Enuj_Ni1rAO^(APjEe$[rZkE#,oIr<6qGGM-b6`\agIqSN&Rpul&G?b\IM1`P>jN_H5VuI39Y[FUr#uj>Wf!)N%$CHP6qP_6Z&%P`cmS=-e42:aeb0c"tB1J,h7m5i_gr!DQHD^T2[`pa^p\$L*=*L;VcRjEiGkG0d=.r;V`JYTaXM8@mP.GUq/k4AWuB`=YHb<lGeM<P-:c&;C'eP?PJh48Tf[@pPO8<mbV$kX<VUu.i/o.I*i+#p6sX[Y1Cs&XXCGk:$s'VgbQkr?,.o:`m7;i)&aqda$05@*]CpE+WO5q*O*Z9JKpVd@*noZ@jGrF1`W7AfWANL,=Xeqk[HNF9W6`q>hJn3!acNr/ai5(l?kDg0HIJg0us"ea]&O!R=5HaYF)N.:7n+\'";9>-,=043oAaEnC"+-Os#p`T/V[]WFp8#KeLIoE)p58G@;nrK?c<k))["p0np57GV[.H[G?;?L[G)H(_aSoQ"%S%kF$Y?YrCMZE6eKHoH[CnIti)h29f2-i-5bbqE7sAfc;&@d]1LWa3>j#SDs#2+2/k_CLL8H"rtQM<A-.WIj7/=O2"[XWpcl)9@[rhd&]"*7U'ru*%!*uW(*6]kN)`Hhc2rge,~>endstream
endobj
28 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 2226
>>
stream
Gb!;f>>s99'Ro4HS-Rb>]>7&/]l+$e\(`1(-/6_jjMa([h"m2A*>neS*r2Cs*E&0J%RX`:l'tQ4VP>f@5k'P@s1/6H?j`h#.8U5t>G.FZ_/osLe"_DR'[n8+bs5^7VGmC(Ikg`hiJ>>1;$a`;VJ\X!\o)(T5$T0Ei[c7t<fBA4U8^2[2,H,%9g]-h,uNKOpeEB5"f+h"[O?[_LrZYSO'q2-`#NC&dH0lXm*-K:IY[/l+g\_@lAB:4(8"+UXZ,EOl8a<'M...Q+pc(5e2D8=<q[ZEV!-p3<$<OE<;-*n]4/4KW([;*.96XjinSN-GO0u[`O6\KcPEeK"!c$'/GP1\Bc'RRFi<>F_IqA/\n30$bpMX8/b^,,$H6h@J<'Lk@0FrU[r9Y<"u.]<&`'Z"'gK$Ija?d7q:>/7Dk^r7^B"P6(4U@?T>"CCc9dmu!F2)7^d0Q]:NHiE1-lYP?B]mo'J,si@q`jN:"*%!@CdF&HPD1u^&PH<1:'r6*@,nMV*%nE9<ok?SS4L`LfVMm*m3[Y6SgGq."2_;(PWZm]rUac0TN;#%q3JF$.il*MiaS(<'mI7PpG4$:amNI=^TcPQ\FP"+poKZIemJl)@4CO<,-sV$g]s3q8jnBk"@Z+U(GSnoN.SQQ3--7d6?kQZ4p<jpJ/rqE9TGUlFAU*jt0UlIYF&^F1;W#]Jp7Nm\1g-_6MiEUs$>I1eg!]]%Dk3o"A5raSCni1=EP6-I'CiI>m/-??h6Vqt5?lL[,K.3hoc6qVs3W9$oDS^l=KkDPJ%dS-3=\XL?nni3Mun.`g^PC3G6Q%?*f:LBUcspb`JT]=Tu7\TO=1i9^qY.=)1nJoq+[*q"q6=Ts2/r+3[qPjdK\84fb\l.N9kLh0\V;Q[-G>+1=T^DQtYJ%tI"$KpecOS)l<8bBi1;]$3ebHYN0Pp=s#[^fT><K4<7p%c4"/Z\Ki5Y<K7Gci;Je''j"nZI+S@O@?s;NG#CTN.$jjd8o+<G#o8XPg4SCLCYQfG_hg2kS^.*ZJ@bB][jdc+:mOldgUmo6A[S>73oNLmPFn=U#7r--<dTeHbaboK[h@7Gj&mU-\<S;1Cu[##:'?H;c/-IE4&#keTn'(qss[L#[LD'*Q^QqlMh8;]a4?2dJIn?EWI=_8COB0]%+!NlKkBT0C8$b$g,A[Dps)`t>#Fb!T:>d\S7*6`T2\Us=tG':>bDKMsWEJFgSNm(<KuC<L_p8l+`JJ5%I\\&)tC@-QcR:up!5hZaEl3%oiiDK^=pV_`Z%:,n#!chHCQU\!:i#eVDna#8=6/MU&*<HsSlm<KD#ge@egL9He\(6/]mDQ^aEUT\_c"O\]Z^cBFAfmN5hD;">dc'4SILj&:6eI\7i_Y7:IH?o*aV_m,]oqUXH,]jS<LP3\YT"BG*Y9GO`cMBN&OmdR%)WgW/X"?YN7WGKLj;(gD-h`]OI+NoGOMKPYCUeTrSKPK\[)+('*5R>c6Zk=l<ZZ4EWDFE1'aBGuI2O#gjWoZ)reCp-$PGWaq/q@Oek4+^I@K_COk#rocBiO0)I(XuB]'BJ=bV#d+Vs0.KP*c47MXa-M#As9T/qa+:Ju'4P=?@.??QpeSk2E@AMSi@GCFZ*:NGkfR!RcgIMtWOdX49WcdKGTAWE%Mm"F&q=t["!BXQa9)k*=@Pfb"Y1hET:V!'kEbr2asiTYe9)6*%lD_e<<0#pQ2eWF]H(r-M,F^Q+L@<0QO(Eka%Sp;YQ)o5?uo[8(>]5r.cISs.::dWmk-A>a,ftE_[9Ks;ZOI+m""b50i>uDC8Z%]14^X89dS7ZR\N3:1L5DT9O#W^)84c?/4?AR6cV<mcNSDHZc>1668^WsjZ^L)`VAUVbErUmP02A`nO`EdnWd_=,302"PJr]6p6DN;0+H3RN32rfML`M_P1E^<],F&j^R`l^41H_%nM/bF(;Fb=#'hPd<:NJl,'F:7?WW4J79TnY.SF;]@JZ'4j5B8]1u3H!#AjPhq19-mYu4h2;dkN?e+l8fTbs.Nk'cb<X[m[[lIF%-b[!CE\j^jRlk/XL$2f)_%!nL$W#$Vo.IM>rX2)I'oZc,kuYHjuOt%d:N`!.J49+TidspOUfm9rtS#B!!FNDO8W<B-/cQEC2[U%1E8aI[!0i5-l<4i+!sZkAD5],d>aW`6PVHa7h6mQjcDTe(+k@2:/G&CU7%LYu/Y!l<.k)_pu&G;(Nl9IN,[S7KcAS<P7[tG`e=N3;O0T-g)Z~>endstream
endobj
29 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 2442
>>
stream
Gb!#]>BAQ-&q9SYfVabbZ"X9PVfNnqfh'[sZ"*%ZiJ_D10Ek$]GYq&RXulUPB)u=,aV#gYFJe(i#d/^6`U8N;`KGb.Imj;Y`W-fb3."GO:`)uZfS0jqCUb9)rHVpu^1d`b%-lLU_2!?3E;/=I_UD?`NX_T?64An7lVRe[UQV1O\-7Uk1,EaiTn*Z-9o.sn?m$iVG`^2"!`H%o)<sXFoS,I9fd)8enW7b#mgZJ'#PZ9Z0`D0o5:`>MKu>].\$<H8-;uYXM%hLU/272^n4ck,0M13^Q@(hl>;D^`:R5HfCe>5QG?6W*%#`h)IDa[Zh6In'J&b;40`o*Eq0\<]#cL>N`e)P#SVGNsLS.CNXF*K"lIZ-;@L"6kc7XL!)C7?^)*>A,;ecBfFS[d3`&0\b)8pNCf>=Fl<_g-Il1cg,,>@U1f\Y;.$Nc;*=sKomaT^9LoP(HN2=`<+[1*>RgH!IQg*W<D,Ske;e$4^S,a-u2WTb;(;YN-L%-O;uO$X2FDt#^Yg<*6f`DF!M3Ng.-3mb8tKI4Njl0cuR]JLX2n)4."MI7iE)3Z7=>)eBK6,>3KnWJo)*i:1TFt7:AK-?<)lku[7#3Rd)UQq:]H\s=l1)<>!c3J=1,^X34U,PUghe-^1poRb9dXT5cJ*[aYoV%-73P^3'"cDFlRb=L(Rc%3L2;`he:q`5Bd9U*`r3XInD&/g_5uiQ++Z7flfCWP)d)`A7fM*E!ahh=r@FcF@+$OVqeQ#4E7@;c$42+dMT/@J<3YiC":t4_QVF&1<&7NedO:1)*NUh;Ib;q`LV*2?Q&)^AIqKraIbMP!&r5p)6$/@_fH(*M1CIh/22%WiJ:8#AGAK%a#OGB6+aBVNd_`<c\%Bu3O(*]0;BK6EKd"!*n'2u[aOU0W-`:&a_.^2rE"_oam)TITj00GIIA&MLccF#X/i"!$3s%+eB$2_LOY/EG;jH"QZ-ph6Zipd,C9Md=.Q'9_+/h_sShnNFha#A3]epRA.s7(L+$#ZrmcqLj+"Ui)>oZ]A'mRMJV*tNMSAbq(J2o_sN(0Sesq+F6WO(Tn8Wd/o_P9l,^T/%R8_c[?o--p`VGGV_gCknkOXKpi7J]k.s4k4:FS`kDZMpglAJifPWdNfV>,1:HQ6.&J(LFbaO:=dRO(OFe$XcKKS<!_2`@9$`e:ob!4T/X)?opu&e4uLT;dQVX]S50ZbmiOIDhOM<0'gd<Fi4NCYo]P$F!u?Wp@9`pZT'^')+k,$s/q_Lggp0U#0*LWKMr:SuTGT-;o2p];\BWGlOlOj*nC;F':.4!IgU7b5rS;*+K;?1,IVLd[lC(j[q!9eqeqcT$NEDo+#=$$QAC3>QB`A&OFs<^3L9q<pK4LFU>\;/U/hq+r1)\BPBtnO2\(e)")7t<Mp+s=ri"1r#(,#jdc6Jq&Dd(Kb!U/i;7N;4%/rY"*`R]'\L:cJSqT-#:>iNNcSs8%l&^^fo:*T"[LW`B1^&-[EI!>^b7NYe`.V615O>PfVB64b_#>(lK>uc=,ddKH-rI@$#k%UQR38./L#r`7)K8@:sgBu)>D]H?Rft,j:)qqk_Vg.ku;g1<G&_=Fud;lK_1YE8L\&[8Cfl$gjOh,6A4Vp!0h;0TL7B8Gn^//ksnLLUXePs#T\dbZF;sadSel:@rep<L6Zs$R!<\:<pW>=!F6W`PSI3j[64fRUZ:R:0ZWd7^q/ZgAbD84Ou2lQ2XHSs]#8`=8b2"+HE5lh;kZb"<>4lmbF8'6)oVTVB5K$m.]+"&TaaX?jI^iq=[dk'XF[X12\[^XAW)0F>g\.e[>e:&`bflEQMM'N?fm5T@AILQNKgk0M>DY]j>U5.Xq:%R<?ZEiBUritK$oMo]t*)!ur`W>T<f7+P(To``l/OSoT\T\S^cp4+<n^0*f9[mFAOW7j(%/d;jj8$4Lf,('b"!Dm+P40>5bcYumn[J[Vhfa;(+0UT)s)IPej"&AW]!<9EI_i)`KLoKP[Bp`4#s$UckXCe4n/@5YAFV<t5lP#/XBP6I&4r7/eT_kYgA2,eUFef`F^Pp;Y4YeJpM1AXD*!5@5#J-V_I1NS^2VEN@eEm%=+#mr$Ci4OR#&Db(;6[7^Cq>?rE#Yd'/fUubJa#jnc]QOEadG&"ZD6:ejKa*E(j%I?.*-f\D@&6k\YIP--Kn*W\ugob9k!;2DM@=s%Ou[>;c9'a?b`!6m:\?pW#>m,cS_!!t4:D5H==]#q=K(Q@g'qZ7oiM:h?eX0h':rS2n6n*;k$USZ(hhD5X7>#.F!ZDbn_!cT+H)QDou;Pt0/F2GXo[+jY5>Hqme6?=#mm*A)O8$RAt@V&>R?j)OT,D"Tg1e-omq&#l'<E.L[E0uLOQPY2bm:F;tp4iKq5E*JX`^Woj`7TmJ=GGD0E;4:MXk.LA54K-m9DTaD0F=o.Z3%."j3lEH3gg[XR6O?V-dj8rfXF;\b>r_[F\@_ne~>endstream
endobj
30 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 2396
>>
stream
Gb!#]968iI'#+6EoP)L:)GpY4Y!"eR1ZO<44-k*QiX8.@1<+\i+DHo1f5Ca6-'<NK&QZ36Z3>eEUHa.^NGai.N?=np`u2\53uEGk5UbF4J@LmQGF*8tGP(:D$:<L(-s/<F4b@&+(PUW$N[R"3jl!Z\GWoZrH(f,P0KEmdKh>NZq2I)OFZ^SQ@(Cpn^'>EG,$k7iXsT6",qVqhb2E&PbEsRZ>`,NAE.<7XIX,r5i<.m6%<oQ8R@=kHB*J:SjO5<FM1k&W@-PZF/$bqs7PuBZ6p<pEF[JI#]G?^+KG[Osq7W_?jB)n7JVI4(Q+LIG%ac=CPZUem1&,9&71.PArl0VpaNhf&q*aH]B8SJX:sY+t'fWF\3nJ>*)Wb]jn\ITj,AI<ulKf>B&`4'b[3M7bq@7u?H-Q,_)=GjQ%EDo5iFl9e1#"G^j?TMXN34_5`S^j'D$+0e$<`dsU\:E0iV6H<O.B"ug_SteU@/^ViD3^9C:RD&-%Y05mui)F.PYS$..WsO>L.)/MB(7t>e+:s(`P6u])gV@_(XR#dXud6&^gi.p),V?QWb3`ZWSG%\>M06\B#>WHIna0bl:g:?C'5H_TC%+,[r[lP34PQHT5tSW8jR[3"?k$#H^/'C]fEr^jR._B,A(Yo<XAT>eP36)g7"ik)Zo@'4B:pOt>0gS['Q.OOR1hF1<Yors]iM^tCJU=`O-I2Ku_^<Wl["?GMn:o(<Xj[oto!'LQ)SlSjgAnV>KjN)^:djao!'(J<XH>Egi'eMHA=$U.lGcgh3>Re@2C@),&!ZCK9a#Y#BjKcrq)f,BB:#;D+[lbC0[.L+;[@o5BS=YCQ5kPgiRIi7A3L/2&mF_M8Y238&DEZbUSI\X[E-Meo.ANVL(&n2V@E"I<6gXu!HWeYFQ*11#@s$*_LL__I95mhZqjNEPMPSd3FV$XCDHq,WW121BrM`fg<k59d[J%m1K0rKAq:LM^NBhNN%B?e?&bLSgRgS&4IgJcWU]BP<dPKflJ$Ct&4,=nj&2pJa08r229rN'^OWogpQ/8V\AQqj#4Ci%8'=5p!HFF,UPH1\N534P1nR&m:=n+i":`pi6%B0GBWBF.WcLrY#81``..pd%kAY':#3\<&gb1>2-B\@f:S?DZ>t!;7f"/Kod.%3]*Uae;@u=!i^$r*,?%n86)!rp[BBL[LWfXW*D"9^^6c2#6SPX@_2#2fs.$H\^C6<H\=8IskK;2CiYuA;7:"n$d"rqSop8IGnOP>%EOj0MM"CfY_ZaN/a!?YJBt*<76j^KOWt;IRd1to^oPH)ci:$TS-Mj(KncL7*"roe*.B/k:K1.V]n!WhXV;Kr+/@r+W0mmiP9gNU"3$"diF%d)_SBjbEPq?%kXguQun*kdN*Z:1HC+l5E/5q`1C9g\B4SL$Kna`Lm;<g\8fl3%^L+7-MG5s%\_M#F3F[YoLrY@0;c/"nP7Q-hOi[_DE5M$WfZH9Gjmcb'lH$^>$o8shcI_B[_>S?rAB?Z@FepHMj;PTlB8=7[F`*#gDR0kr3jpYpUP.5]C&lP\6=U?=D@!L9l%F+%>(HP0s1/kNbZKYcH^1C$"&h/GBe,^lk8W'780Y:\LSFKpe5nb[h_9>N8#6RZ-Bl`j4J842]Aj^YFN5r"Is.an??A^+%o_/X.qoDJsj#8</m`,^^-S_Ws&$^H&b8]9N3rb:f^\>*sC^%59?'#$dY3]eTK1+(Vfodma)dPH"*aDRL@bq/ohG_I/.$g"B(A=b)l6Gj@+bHn=WSk&&P*hO,%r!B1hd%>>TO6'q[-:*t)3s[CPg4@%K,Or7iC7Z7*nYjE&j)3>NI:7bN'jZ]0mi+-5_`6Onm/9iGpH5m35Hq>Q",J^dt-!u!00Z@`_Th;59j%COPhoeHiO(hD./N)E9C\uiCIYW:E@=i%LV1$ZGp#OtBkN2)Lu)UD$5\?lT+f#$?!k4uM<dTW-s\;8+;b)sAk^:fPP3BdRD`OMH]SUiCm^@6V%QrO!f)c/TR"U`BsdE8T"j(rL5:1HJCdW]0nC^otR=Zd"5gTR`Yi]6/p`e!b>io`NR3jNJ":74e6'#nmb9i6%-QhntbaEC)IJP0JM(IgKc+b;Q\2S+n81hBS/Q>iG$&rd-I,T&*Gjmjm7F/G]m"uYF9k4Q`k6Zld\nN%oK01rgcHuCrMNspZmfuCX](`4JY;+&#4Oo/FCScg6u0p\/NMTm:,4D@U$pRu]NDNlsp#,SrP@M95M/6ErKL2j"e\/$O:2:/Xh0i!rE98ki.0E^PH9qg4JfmX.[76u*P'4O&@T_#V>9ecB6C1Qb#o>bqZjYDluq*e1?2t\)Ep;/Ohf!/WY%VuCK1"q$q"M:ee\)3_X&q*;q3d`hDG(g61n_](g8K7#)F\)GaSfPD,JW"n&d=Gl2Z`bDu3;O^](?=K~>endstream
endobj
31 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 454
>>
stream
GatU.bAP3?&A7ljk*Yd+!J>r5)^SL[7"+luMebDR>K:VQXK#8b^-EYq&+rmFfO`%Gc2\:&%2RNB%:#g@S1lXWF9s:M5WZeBNSYnS1lVqLiCZZ'K&:Q1gdE,(;$/8?A:c\7e01m_)"i")ZPequA44A!)Z_-";i(Ws9M?qgPm=O";BQC@2$W[#k#p)@<^#+KMnsd'RkBF_Ub>7l4QdlL8YV@Mn>L2i<Db[/.]X(&`)*5.P@5jqM6j!Fi[kbQpCqt;SZ._Mf+g6'\5a1_UtoU_&rcfuKJR)EpcX&uAuci?o&KdimiH,&81:93KY+]UX7O'nX*u&SEg->@Q]i8<H=rCe@tXD6CL6PaG"4,[af0CVE8FQ-[B$q>PIS6$)FV00HrO>XF!a9B<&fSOpk(W+(hL-n2jfq+d=,[%`i[MV]#:Ob])pGnBsZ(8G58SQjbZf%5G78;DZ~>endstream
endobj
32 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 772
>>
stream
GatU/?#LB2&:Dg-fJc\B\``k(8#TT>C.4ijfGE_`QPf/W@/GiPmo__D8Q(+m:aFe8G%PC,)\*1&G[.imi-c!"2]R&LD%AaA3OF!Lh9LJn=B-_OP6+CX]\p/ND^g)40MCBf9LFq0<Ko1(;:P+m^uK6,<sQ0gQ$Y9PB1:P8^iI`$Z2d?f]VrWK!eB_c7D]<K@=F9G'@O[e>$?TWq>L!BmF0#X[,7O))`Wn0]O4`b"MQY&<t_oB@Q8tD->DauA2FU29!VF:6a4LdK;U8^lqGCYs11fAc=j=_*MkoT'a!QJ0TpJ-eG8RuG8mRe8<^DC!dp]^3?ZHI$>NDc>J@\pX5,p%-/U.]Ubf3q32\>Wc]fafe%<97W+3'#7]5iJd3F#QG%iKiHJrk>A5DifGKsMULJd%"kqBrM,As:`b\.N$^Z*Fpm%9go4"E/@a_nDZQ$/.kZ.PaLH3MHBdN5ea$/U3#r1GmpDIJ5;XVe"haJnbR'qr8qR_c*j!VVb8d^5#Yr!o4<DN$pf7M"7m+f;fs&k9,0D*0A3&=oLU952PaAO,H2F@LU-3e(fUM?VgrU[fT#TMjdBT$bQ(C5J6gHpKV&(LZT&^OFU.Y8EM]/g.NFCGQFjTYM0Noq"(;=_XW,*[2d#h-.=-Ph7ET%$!W0:#[r=AeS]+!Z6WdNa@]EHYSaV[L358O!8obI^1+.$R_s1dWJSBpE=u4k6&G<LWj&JMpuG:`ro_,UJTZqTH$La1BYA`Q&;Lo4oi"H;8LdHip^bso*Vg24"af"~>endstream
endobj
xref
0 33
0000000000 65535 f
0000000061 00000 n
0000000144 00000 n
0000000251 00000 n
0000000366 00000 n
0000000478 00000 n
0000000673 00000 n
0000000750 00000 n
0000000945 00000 n
0000001140 00000 n
0000001335 00000 n
0000001531 00000 n
0000001727 00000 n
0000001847 00000 n
0000002043 00000 n
0000002239 00000 n
0000002323 00000 n
0000002519 00000 n
0000002715 00000 n
0000002911 00000 n
0000002981 00000 n
0000003315 00000 n
0000003446 00000 n
0000004126 00000 n
0000006084 00000 n
0000008926 00000 n
0000010749 00000 n
0000011926 00000 n
0000013022 00000 n
0000015340 00000 n
0000017874 00000 n
0000020362 00000 n
0000020907 00000 n
trailer
<<
/ID
[<1a6aa1302ad6ba2dca92b79c88f91ea9><1a6aa1302ad6ba2dca92b79c88f91ea9>]
% ReportLab generated PDF document -- digest (opensource)
/Info 20 0 R
/Root 19 0 R
/Size 33
>>
startxref
21770
%%EOF

View File

@@ -0,0 +1,175 @@
{
"summary": {
"total_artefacts": 18,
"mentioned": 3,
"likely_relevant": 1,
"possibly_relevant": 5,
"not_covered": 9,
"skill_auto_generate": 5,
"skill_assist": 3
},
"artefacts": [
{
"id": "DEF-01",
"name": "Customer Profile",
"phase": "define",
"step": "ideate",
"skill_support": "assist",
"customer_facing": false,
"relevance": "mentioned"
},
{
"id": "DEF-02",
"name": "Strategy Map",
"phase": "define",
"step": "ideate",
"skill_support": "assist",
"customer_facing": false,
"relevance": "mentioned"
},
{
"id": "DEF-03",
"name": "Point of View (PoV)",
"phase": "define",
"step": "ideate",
"skill_support": "auto_generate",
"customer_facing": false,
"relevance": "possibly_relevant"
},
{
"id": "DEF-04",
"name": "Ideation Workshop",
"phase": "define",
"step": "ideate",
"skill_support": "reference",
"customer_facing": true,
"relevance": "none"
},
{
"id": "DEF-05",
"name": "Business Case",
"phase": "define",
"step": "ideate",
"skill_support": "auto_generate",
"customer_facing": true,
"relevance": "mentioned"
},
{
"id": "DEF-06",
"name": "Value Story",
"phase": "define",
"step": "ideate",
"skill_support": "auto_generate",
"customer_facing": true,
"relevance": "possibly_relevant"
},
{
"id": "DEF-07",
"name": "Value Story Delivery",
"phase": "define",
"step": "validate",
"skill_support": "assist",
"customer_facing": true,
"relevance": "possibly_relevant"
},
{
"id": "DEF-08",
"name": "Joint Engagement Plan (JEP)",
"phase": "define",
"step": "plan",
"skill_support": "auto_generate",
"customer_facing": true,
"relevance": "none"
},
{
"id": "DES-35",
"name": "Solution Proposal",
"phase": "design",
"step": "confirm",
"skill_support": "auto_generate",
"customer_facing": true,
"relevance": "possibly_relevant"
},
{
"id": "DES-36",
"name": "Partner / Services Proposal",
"phase": "design",
"step": "confirm",
"skill_support": "reference",
"customer_facing": true,
"relevance": "none"
},
{
"id": "DES-37",
"name": "RFx Response",
"phase": "design",
"step": "confirm",
"skill_support": "reference",
"customer_facing": true,
"relevance": "possibly_relevant"
},
{
"id": "DES-38",
"name": "Commercial Agreement",
"phase": "design",
"step": "confirm",
"skill_support": "reference",
"customer_facing": true,
"relevance": "none"
},
{
"id": "DEL-17",
"name": "Cloud Operating Framework",
"phase": "deliver",
"step": "operate",
"skill_support": "reference",
"customer_facing": true,
"relevance": "none"
},
{
"id": "DEL-18",
"name": "OCI Operationalization Framework",
"phase": "deliver",
"step": "operate",
"skill_support": "reference",
"customer_facing": true,
"relevance": "none"
},
{
"id": "DEL-19",
"name": "Retrospective",
"phase": "deliver",
"step": "improve",
"skill_support": "auto_generate",
"customer_facing": false,
"relevance": "none"
},
{
"id": "DEL-20",
"name": "Value Realization",
"phase": "deliver",
"step": "improve",
"skill_support": "auto_generate",
"customer_facing": true,
"relevance": "likely_relevant"
},
{
"id": "DEL-21",
"name": "Customer Success Story",
"phase": "deliver",
"step": "improve",
"skill_support": "reference",
"customer_facing": true,
"relevance": "none"
},
{
"id": "DEL-22",
"name": "Improvement Actions",
"phase": "deliver",
"step": "improve",
"skill_support": "reference",
"customer_facing": true,
"relevance": "none"
}
]
}

View File

@@ -0,0 +1,125 @@
[
{
"id": "FF-202603-008",
"date": "2026-03-14",
"contributor": {
"name": "Diego Cabrera",
"team": "Field Architecture",
"client": "Vector Search Customer",
"context": "AI Vector Search engagement",
"confidence": "validated"
},
"product": "ADB-S",
"version": "23ai",
"severity": "HIGH",
"category": "limitation",
"summary": "Distributed HNSW indexes not available \u2014 100M+ vector search requires partitioning workaround",
"detail": "ADB-S AI Vector Search supports HNSW indexes but they are node-local on\nmulti-node RAC (\u226564 ECPUs). At 100M+ vectors, queries on a 2-node RAC\nmiss vectors on the other node. Results are either incomplete or require\ncross-node scan that blows P95 >200ms.\n\nWorkaround from internal DB PM team: hash-partition vector table on\nvector_id, create partition-local HNSW index. Queries hit single\npartition on single node, maintaining <50ms at 100M scale.\n\nRequires table redesign \u2014 cannot be applied to existing unpartitioned\nvector tables without data reload.\n",
"workaround": "Hash-partition vector table by vector_id. Create HNSW index as LOCAL\n(partition-level). Ensure partition pruning in queries.\nSource: internal DB PM team contact [name].\nValidated on ADB-S 23ai with 120M vectors, P95 = 38ms on 64 ECPU.\n",
"oracle_sr": "",
"status": "acknowledged",
"resolved_date": null,
"resolution": null,
"affects_matrix": "AI Vector Search (HNSW)",
"tags": [
"vector-search",
"hnsw",
"distributed",
"rac",
"partitioning",
"100m",
"latency",
"ai-vector-search"
]
},
{
"id": "FF-202603-002",
"date": "2026-03-08",
"contributor": {
"name": "Diego Cabrera",
"team": "Field Architecture",
"client": "Strategic Migration Customer",
"context": "Production migration",
"confidence": "validated"
},
"product": "ADB-S Dedicated Elastic Pool (DEP)",
"version": "23ai",
"severity": "HIGH",
"category": "limitation",
"summary": "ADG must be disabled before joining Dedicated Elastic Pool",
"detail": "When attempting to add an ADB-S instance with active Autonomous Data Guard\nto a Dedicated Elastic Pool, the operation fails. ADG must be explicitly\ndisabled before the instance can join the DEP. This is a known issue\nacknowledged by Oracle but not prominently documented.\n\nImpact: requires a brief HA gap during DEP onboarding. Must coordinate\nwith the customer's change window.\n",
"workaround": "Disable ADG \u2192 join DEP \u2192 re-enable ADG. Plan for ~15 min HA gap.",
"oracle_sr": "",
"status": "acknowledged",
"resolved_date": null,
"resolution": null,
"affects_matrix": "Elastic Pool Membership",
"tags": [
"dep",
"adg",
"elastic-pool",
"ha",
"limitation"
]
},
{
"id": "FF-202603-004",
"date": "2026-03-01",
"contributor": {
"name": "Diego Cabrera",
"team": "Field Architecture",
"client": "Strategic Migration Customer",
"context": "Production migration",
"confidence": "validated"
},
"product": "ADB-S",
"version": "23ai",
"severity": "MEDIUM",
"category": "gotcha",
"summary": "DEP provisioning takes days to weeks depending on capacity",
"detail": "Dedicated Elastic Pool provisioning is NOT instant like ADB-S Serverless.\nIt requires physical Exadata infrastructure allocation. Lead time varies\nfrom 3 days (if capacity available in region) to 2-3 weeks (if capacity\nneeds to be provisioned).\n\nBilling starts only at AVAILABLE state, not at request time.\nCo-location of existing ADB-S instances happens at the next maintenance\nwindow after joining, not immediately.\n",
"workaround": "Request DEP early in the project timeline. Don't make it a critical-path dependency in week 1.",
"oracle_sr": "",
"status": "acknowledged",
"resolved_date": null,
"resolution": null,
"affects_matrix": "Elastic Pool Membership",
"tags": [
"dep",
"provisioning",
"lead-time",
"capacity",
"planning"
]
},
{
"id": "FF-202603-007",
"date": "2026-02-10",
"contributor": {
"name": "Diego Cabrera",
"team": "Field Architecture",
"client": "Pepe SRL",
"context": "Discovery engagement",
"confidence": "validated"
},
"product": "ADB-S",
"version": "23ai",
"severity": "INFO",
"category": "gotcha",
"summary": "ADB-S Serverless RAC node split threshold at 64 ECPUs",
"detail": "ADB-S Serverless runs on 1 RAC node at \u226424 ECPUs and splits to 2 nodes\nat 64 ECPUs (16 cpu_count each). The gv$instance view only shows nodes\nwhere the PDB is open.\n\nThis affects connection pooling behavior and session distribution.\nApplications should use UCP or JDBC connection pool with FAN events\nto handle the multi-node scenario properly.\n",
"workaround": "Ensure connection pool configuration handles multi-node. Use UCP with FAN.",
"oracle_sr": "",
"status": "acknowledged",
"resolved_date": null,
"resolution": null,
"affects_matrix": null,
"tags": [
"adb-s",
"rac",
"ecpu",
"node-split",
"connection-pooling"
]
}
]

View File

@@ -0,0 +1,26 @@
{
"total": 8,
"by_severity": {
"HIGH": 2,
"MEDIUM": 4,
"LOW": 1,
"INFO": 1
},
"by_product": {
"ADB-S": 4,
"OCI CLI": 1,
"ADB-S Dedicated Elastic Pool (DEP)": 2,
"OCI DMS": 1
},
"by_status": {
"acknowledged": 5,
"open": 2,
"monitoring": 1
},
"by_category": {
"limitation": 3,
"bug": 1,
"undocumented": 1,
"gotcha": 3
}
}

View File

@@ -0,0 +1,206 @@
[
{
"file": "kb/architecture-center/catalog.yaml",
"matches": [
{
"line": 25,
"text": "- title: \"Deploy Oracle Autonomous Database on Oracle Database@Azure\""
},
{
"line": 267,
"text": "- title: \"Deploy Oracle Autonomous Database on Oracle Database@Google Cloud\""
},
{
"line": 427,
"text": "- title: \"Migrate on-premises Oracle Database to Autonomous Database\""
},
{
"line": 463,
"text": "- title: \"Migrate a PeopleSoft database to Oracle Autonomous Database\""
},
{
"line": 623,
"text": "- title: \"Move Oracle Forms applications to Oracle APEX on an Oracle Autonomous "
},
{
"line": 635,
"text": "- title: \"Stream Kafka topics to Oracle Autonomous Database using Oracle Integra"
},
{
"line": 795,
"text": "- title: \"Implement Oracle Data Safe for Exadata and Autonomous Databases\""
},
{
"line": 1140,
"text": "- title: \"Deploy a microservices-based application in Kubernetes connected to an"
},
{
"line": 1226,
"text": "- title: \"Deploy JD Edwards EnterpriseOne with Oracle Autonomous Database on Ded"
},
{
"line": 1262,
"text": "- title: \"Run PeopleSoft ERP and Autonomous Database in an HA multicloud deploym"
}
]
},
{
"file": "kb/competitive/aws-mapping.yaml",
"matches": [
{
"line": 32,
"text": "- \"Autonomous Database \u2014 no equivalent in AWS\""
},
{
"line": 81,
"text": "- \"Data Safe included free for Autonomous Database\""
}
]
},
{
"file": "kb/competitive/common-objections.yaml",
"matches": [
{
"line": 12,
"text": "- Only cloud with Autonomous Database"
}
]
},
{
"file": "kb/patterns/database-ha-adb-s.yaml",
"matches": [
{
"line": 2,
"text": "# Composable architecture block for Autonomous Database Serverless HA"
},
{
"line": 10,
"text": "Autonomous Database Serverless (ADB-S) provides built-in high availability throu"
}
]
},
{
"file": "kb/pricing/oci-sku-catalog.yaml",
"matches": [
{
"line": 462,
"text": "display_name: Oracle Cloud Infrastructure - Autonomous Database & Exadata"
},
{
"line": 465,
"text": "product: Oracle Autonomous Database (ATP or ADW) - ECPU (2 ECPU minimum)"
},
{
"line": 471,
"text": "product: Oracle Autonomous Database (ATP or ADW) - BYOL ECPU (2 ECPU minimum)"
},
{
"line": 477,
"text": "product: Oracle Autonomous Database Storage for Transaction Processing (ATP), us"
},
{
"line": 483,
"text": "product: Oracle Autonomous Database Storage for Data Warehouse (ADW), using ECPU"
},
{
"line": 489,
"text": "product: Oracle Autonomous Database Backup Storage (ATP or ADW), using ECPU"
}
]
},
{
"file": "kb/services/adb-dedicated.yaml",
"matches": [
{
"line": 3,
"text": "service: Autonomous Database Dedicated (ADB-D)"
},
{
"line": 8,
"text": "what: Autonomous Database on dedicated Exadata infrastructure. Provides isolatio"
}
]
},
{
"file": "kb/services/adb-elastic-pool.yaml",
"matches": [
{
"line": 3,
"text": "service: Autonomous Database Serverless Elastic Pool"
}
]
},
{
"file": "kb/services/adb-serverless.yaml",
"matches": [
{
"line": 1,
"text": "# OCI Service: Autonomous Database Serverless (ADB-S)"
},
{
"line": 5,
"text": "name: \"Autonomous Database Serverless (ADB-S)\""
},
{
"line": 38,
"text": "name: \"Autonomous Database Serverless (ADB-S)\""
},
{
"line": 47,
"text": "name: \"Autonomous Database on Dedicated Exadata (ADB-D)\""
}
]
},
{
"file": "kb/services/database-at-aws.yaml",
"matches": [
{
"line": 32,
"text": "notes: \"Autonomous Database on dedicated Exadata \u2014 NOT serverless\""
},
{
"line": 37,
"text": "- name: \"Autonomous Database Serverless (ADB-S)\""
}
]
},
{
"file": "kb/services/exadata-cloud.yaml",
"matches": [
{
"line": 20,
"text": "- \"Small workloads under 16 OCPUs \u2014 use Autonomous Database Serverless (ADB-S) o"
}
]
},
{
"file": "kb/services/oci-networking-core.yaml",
"matches": [
{
"line": 46,
"text": "description: \"Private pathway from a VCN to supported OCI services (e.g., Object"
},
{
"line": 84,
"text": "description: \"Resources in private subnets cannot reach OCI services (Object Sto"
}
]
},
{
"file": "kb/well-architected/security-compliance.yaml",
"matches": [
{
"line": 148,
"text": "description: \"Private endpoints for Autonomous Database\""
},
{
"line": 150,
"text": "pass_if: \"Autonomous Database configured with private endpoints\""
},
{
"line": 151,
"text": "gap_if: \"Autonomous Database using public endpoints\""
}
]
}
]

View File

@@ -0,0 +1,50 @@
[
{
"feature": "Auto Indexing",
"category": "auto_management",
"compatibility": [
{
"deployment": "ADB-S Serverless",
"version": "23ai",
"status": "GA_CAVEAT",
"notes": "Creates indexes HIDDEN by default. Instantly reversible. DML costing prevents over-indexing. Deduplication with manually created indexes."
},
{
"deployment": "ADB-S Serverless",
"version": "26ai",
"status": "GA",
"notes": "Improved in 26ai \u2014 better cost model, fewer false positives."
},
{
"deployment": "ADB-S Elastic Pool",
"version": "23ai",
"status": "GA_CAVEAT",
"notes": "Same as ADB-S Serverless."
},
{
"deployment": "ADB Dedicated Elastic Pool (DEP)",
"version": "23ai",
"status": "GA_CAVEAT",
"notes": "Available but less tested in DEP."
},
{
"deployment": "ADB on Dedicated Exadata",
"version": "23ai",
"status": "GA",
"notes": "Fully supported."
},
{
"deployment": "Exadata Cloud Service",
"version": "23ai",
"status": "NOT_AVAIL",
"notes": "Not an ADB feature. Use manual indexing."
},
{
"deployment": "Base DB Service (EE)",
"version": "23ai",
"status": "NOT_AVAIL",
"notes": ""
}
]
}
]

View File

@@ -0,0 +1,86 @@
[
{
"feature": "AI Vector Search (HNSW)",
"category": "developer",
"compatibility": [
{
"deployment": "ADB-S Serverless",
"version": "23ai",
"status": "GA_CAVEAT",
"notes": "HNSW indexes are node-local on multi-node RAC. Works well up to\n~50M vectors on single node (\u226424 ECPUs). At 100M+ on multi-node\n(\u226564 ECPUs), requires hash-partitioned vector table with LOCAL\nHNSW index for <50ms P95. See FF-202603-008.\n"
},
{
"deployment": "ADB-S Serverless",
"version": "26ai",
"status": "UNTESTED",
"notes": "Check if distributed HNSW is added in 26ai. Expected to remain node-local."
},
{
"deployment": "ADB-S Elastic Pool",
"version": "23ai",
"status": "GA_CAVEAT",
"notes": "Same node-local limitation as ADB-S Serverless."
},
{
"deployment": "ADB on Dedicated Exadata",
"version": "23ai",
"status": "GA_CAVEAT",
"notes": "Same limitation. Dedicated infra doesn't change HNSW locality."
},
{
"deployment": "Exadata Cloud Service",
"version": "23ai",
"status": "GA_CAVEAT",
"notes": "RAC with HNSW has same node-local constraint. Partitioning workaround applies."
},
{
"deployment": "Base DB Service (EE)",
"version": "23ai",
"status": "NOT_AVAIL",
"notes": "AI Vector Search requires 23ai. Available in EE but HNSW performance limited without Exadata storage."
}
]
},
{
"feature": "AI Vector Search (IVF)",
"category": "developer",
"compatibility": [
{
"deployment": "ADB-S Serverless",
"version": "23ai",
"status": "GA",
"notes": "IVF (Inverted File) indexes ARE distributed across RAC nodes.\nWorks at 100M+ scale without partitioning. However, IVF has\nlower recall than HNSW at same latency budget. Trade-off:\nIVF for scale without redesign, HNSW+partitioning for best recall.\n"
},
{
"deployment": "ADB-S Serverless",
"version": "26ai",
"status": "UNTESTED",
"notes": ""
},
{
"deployment": "ADB-S Elastic Pool",
"version": "23ai",
"status": "GA",
"notes": "Same as ADB-S Serverless."
},
{
"deployment": "ADB on Dedicated Exadata",
"version": "23ai",
"status": "GA",
"notes": ""
},
{
"deployment": "Exadata Cloud Service",
"version": "23ai",
"status": "GA",
"notes": "IVF distributed across RAC nodes. Exadata storage accelerates scans."
},
{
"deployment": "Base DB Service (EE)",
"version": "23ai",
"status": "NOT_AVAIL",
"notes": "AI Vector Search requires 23ai. Available in EE but performance limited without Exadata."
}
]
}
]

View File

@@ -0,0 +1,46 @@
{
"query": "ADB-S vs AWS Aurora / Azure SQL",
"aws_database_mappings": [],
"azure_database_mappings": [
{
"oci": "ADB-S",
"azure": "Azure SQL Managed Instance / Azure Database for PostgreSQL",
"oci_advantage": "ADB-S runs actual Oracle Database. Azure SQL MI is SQL Server only.\nNo native Oracle database service on Azure.\nOracle on Azure VMs loses Exadata performance and autonomous operations.\n",
"azure_advantage": "Native SQL Server support if migrating from SQL Server."
},
{
"oci": "ExaCS",
"azure": "Oracle Database@Azure (ExaCS in Azure datacenters)",
"notes": "Oracle Database@Azure is ExaCS running in Azure datacenters with\ndirect connectivity to Azure services. Available in select regions.\nThis is a partnership offering, not a competitive comparison.\n"
}
],
"common_objections": [
{
"id": "OBJ-001",
"category": "market",
"objection": "OCI is a niche cloud \u2014 AWS/Azure are the leaders",
"response": "OCI is the #4 cloud globally and growing fastest in database PaaS.\nFor Oracle database workloads specifically, OCI is the leader:\n- Only cloud with Exadata hardware\n- Only cloud with Autonomous Database\n- Best Oracle license portability\nThe question isn't \"best cloud overall\" but \"best cloud for this workload.\"\n",
"evidence": "Gartner, IDC reports on cloud database market"
},
{
"id": "OBJ-002",
"category": "risk",
"objection": "What if Oracle EOLs or changes OCI pricing?",
"response": "OCI pricing has only decreased since launch. Oracle's cloud investment\nis $50B+ in CapEx. OCI is Oracle's strategic platform \u2014 not a side project.\nContractual pricing protection exists via Annual Flex and Universal Credits.\n",
"mitigation": "Use annual flex contracts with pricing guarantees"
},
{
"id": "OBJ-003",
"category": "skills",
"objection": "Our team has no OCI experience",
"response": "ADB-S reduces DBA workload by 80% (no patching, tuning, scaling).\nOCI console follows familiar cloud patterns. Terraform provider is mature.\nOracle provides free training and certification. Typical ramp-up is 2-4 weeks.\n",
"mitigation": "Include training budget in migration plan"
},
{
"id": "OBJ-004",
"category": "features",
"objection": "OCI doesn't have as many services as AWS",
"response": "True for breadth (AWS has 200+ services). For database and enterprise\nworkloads, OCI feature parity is strong. Key services are GA:\n- Compute, networking, storage, Kubernetes, serverless\n- Monitoring, logging, IAM, security\n- Queue, Streaming, API Gateway\nWhat matters is whether OCI has what *you* need, not a raw count.\n"
}
]
}

View File

@@ -0,0 +1,33 @@
[
{
"id": "FF-202604-001",
"date": "2026-04-12",
"contributor": {
"name": "Test SA",
"team": "Validation",
"date": "2026-04-12",
"confidence": "observed",
"client": "Test Client",
"context": "CLI validation"
},
"reported_by": "Test SA",
"product": "OCI Queue",
"version": "GA",
"severity": "LOW",
"category": "gotcha",
"summary": "Queue message visibility timeout resets on failed processing \u2014 must handle idempotently",
"detail": "When a consumer fails to process a message within the visibility timeout, the message becomes visible again. If the consumer partially processed it, you get duplicate processing.",
"workaround": "Implement idempotent consumers. Use message deduplication ID.",
"oracle_sr": "",
"status": "open",
"resolved_date": null,
"resolution": null,
"affects_matrix": null,
"tags": [
"queue",
"messaging",
"idempotency"
],
"confirmations": []
}
]

View File

@@ -0,0 +1,5 @@
WARNING: Unknown tag 'queue'. Not in taxonomy.
WARNING: Unknown tag 'messaging'. Did you mean 'sizing'?
WARNING: Unknown tag 'idempotency'. Did you mean 'latency'?
Added: FF-202604-001 [LOW] Queue message visibility timeout resets on failed processing — must handle idempotently

View File

@@ -0,0 +1,174 @@
well_architected_scorecard:
overall_status: GAPS_IDENTIFIED
generated_date: '2026-04-12T21:26:00.300204'
architecture_name: examples/meli-kvs-wa-architecture.yaml
customer: Unknown
summary:
total_checks: 23
total_passed: 18
total_gaps: 5
high_severity_gaps: 2
medium_severity_gaps: 1
low_severity_gaps: 2
pillars:
security_compliance:
status: GAPS_IDENTIFIED
checks_passed: 12
checks_total: 15
categories:
identity_access:
passed: 3
total: 4
gaps:
- check_id: SEC-IAM-003
area: Identity & Access
finding: no mention of admin account restrictions
severity: HIGH
recommendation: separate admin groups defined for operations
wa_reference: https://docs.oracle.com/en/solutions/oci-best-practices/effective-strategies-security-and-compliance1.html
resource_isolation:
passed: 3
total: 3
gaps: []
database_security:
passed: 0
total: 0
gaps: []
data_protection:
passed: 1
total: 2
gaps:
- check_id: SEC-DAT-001
area: Data Protection
finding: any storage service without encryption at rest
severity: HIGH
recommendation: encryption at rest specified for all storage services
wa_reference: https://docs.oracle.com/en/solutions/oci-best-practices/effective-strategies-security-and-compliance1.html
network_security:
passed: 3
total: 3
gaps: []
monitoring_audit:
passed: 2
total: 3
gaps:
- check_id: SEC-MON-003
area: Monitoring & Audit
finding: no VCN Flow Logs configured
severity: MEDIUM
recommendation: VCN Flow Logs enabled for critical subnets
wa_reference: https://docs.oracle.com/en/solutions/oci-best-practices/effective-strategies-security-and-compliance1.html
reliability_resilience:
status: PASS_WITH_RECOMMENDATIONS
checks_passed: 0
checks_total: 1
categories:
scalability:
passed: 0
total: 1
gaps:
- check_id: REL-SCL-002
area: Scalability
finding: no service limit review planned
severity: LOW
recommendation: service limit review mentioned in deployment plan
wa_reference: https://docs.oracle.com/en/solutions/oci-best-practices/reliable-and-resilient-cloud-topology-practices1.html
fault_tolerant_networking:
passed: 0
total: 0
gaps: []
data_backup:
passed: 0
total: 0
gaps: []
data_replication:
passed: 0
total: 0
gaps: []
disaster_recovery:
passed: 0
total: 0
gaps: []
performance_cost:
status: PASS
checks_passed: 2
checks_total: 2
categories:
compute_sizing:
passed: 0
total: 0
gaps: []
storage_strategy:
passed: 0
total: 0
gaps: []
network_tuning:
passed: 0
total: 0
gaps: []
cost_management:
passed: 2
total: 2
gaps: []
operational_efficiency:
status: PASS_WITH_RECOMMENDATIONS
checks_passed: 4
checks_total: 5
categories:
deployment_strategy:
passed: 1
total: 1
gaps: []
workload_monitoring:
passed: 2
total: 2
gaps: []
os_management:
passed: 0
total: 0
gaps: []
operations_support:
passed: 1
total: 2
gaps:
- check_id: OPS-SUP-001
area: Operations Support
finding: no support plan consideration
severity: LOW
recommendation: Oracle support plan level specified and matches criticality
wa_reference: https://docs.oracle.com/en/solutions/oci-best-practices/best-practices-operating-cloud-deployments-efficiency.html
distributed_cloud:
status: NOT_APPLICABLE
checks_passed: 0
checks_total: 0
categories: {}
action_items:
high_priority:
- check_id: SEC-IAM-003
pillar: Identity & Access
finding: no mention of admin account restrictions
recommendation: separate admin groups defined for operations
- check_id: SEC-DAT-001
pillar: Data Protection
finding: any storage service without encryption at rest
recommendation: encryption at rest specified for all storage services
medium_priority:
- check_id: SEC-MON-003
pillar: Monitoring & Audit
finding: no VCN Flow Logs configured
recommendation: VCN Flow Logs enabled for critical subnets
low_priority:
- check_id: REL-SCL-002
pillar: Scalability
finding: no service limit review planned
recommendation: service limit review mentioned in deployment plan
- check_id: OPS-SUP-001
pillar: Operations Support
finding: no support plan consideration
recommendation: Oracle support plan level specified and matches criticality
references:
framework: https://docs.oracle.com/en/solutions/oci-best-practices/index.html
security: https://docs.oracle.com/en/solutions/oci-best-practices/effective-strategies-security-and-compliance1.html
reliability: https://docs.oracle.com/en/solutions/oci-best-practices/reliable-and-resilient-cloud-topology-practices1.html
operations: https://docs.oracle.com/en/solutions/oci-best-practices/best-practices-operating-cloud-deployments-efficiency.html
distributed: https://docs.oracle.com/en/solutions/oci-best-practices/effective-strategies-distributed-cloud-implementation1.html

View File

@@ -0,0 +1,241 @@
well_architected_scorecard:
overall_status: GAPS_IDENTIFIED
generated_date: '2026-04-12T22:40:14.045613'
architecture_name: examples/meli-kvs-wa-architecture.yaml
customer: Mercado Libre (MELI)
summary:
total_checks: 49
total_passed: 39
total_gaps: 10
high_severity_gaps: 2
medium_severity_gaps: 5
low_severity_gaps: 3
pillars:
security_compliance:
status: GAPS_IDENTIFIED
checks_passed: 21
checks_total: 26
categories:
identity_access:
passed: 5
total: 6
gaps:
- check_id: SEC-IAM-003
area: Identity & Access
finding: no mention of admin account restrictions
severity: HIGH
recommendation: separate admin groups defined for operations
wa_reference: https://docs.oracle.com/en/solutions/oci-best-practices/effective-strategies-security-and-compliance1.html
resource_isolation:
passed: 4
total: 4
gaps: []
database_security:
passed: 4
total: 6
gaps:
- check_id: SEC-DB-004
area: Database Security
finding: Data Safe not included in architecture
severity: MEDIUM
recommendation: Data Safe configured for database security assessment
wa_reference: https://docs.oracle.com/en/solutions/oci-best-practices/effective-strategies-security-and-compliance1.html
- check_id: SEC-DB-006
area: Database Security
finding: no mention of DELETE permission restrictions
severity: MEDIUM
recommendation: explicit restriction on DELETE permissions documented
wa_reference: https://docs.oracle.com/en/solutions/oci-best-practices/effective-strategies-security-and-compliance1.html
data_protection:
passed: 1
total: 2
gaps:
- check_id: SEC-DAT-001
area: Data Protection
finding: any storage service without encryption at rest
severity: HIGH
recommendation: encryption at rest specified for all storage services
wa_reference: https://docs.oracle.com/en/solutions/oci-best-practices/effective-strategies-security-and-compliance1.html
network_security:
passed: 4
total: 4
gaps: []
monitoring_audit:
passed: 3
total: 4
gaps:
- check_id: SEC-MON-003
area: Monitoring & Audit
finding: no VCN Flow Logs configured
severity: MEDIUM
recommendation: VCN Flow Logs enabled for critical subnets
wa_reference: https://docs.oracle.com/en/solutions/oci-best-practices/effective-strategies-security-and-compliance1.html
reliability_resilience:
status: PASS_WITH_RECOMMENDATIONS
checks_passed: 6
checks_total: 8
categories:
scalability:
passed: 1
total: 3
gaps:
- check_id: REL-SCL-002
area: Scalability
finding: no service limit review planned
severity: LOW
recommendation: service limit review mentioned in deployment plan
wa_reference: https://docs.oracle.com/en/solutions/oci-best-practices/reliable-and-resilient-cloud-topology-practices1.html
- check_id: REL-SCL-003
area: Scalability
finding: critical production workloads without capacity reservations
severity: MEDIUM
recommendation: capacity reservations specified for critical compute
wa_reference: https://docs.oracle.com/en/solutions/oci-best-practices/reliable-and-resilient-cloud-topology-practices1.html
fault_tolerant_networking:
passed: 0
total: 0
gaps: []
data_backup:
passed: 3
total: 3
gaps: []
data_replication:
passed: 2
total: 2
gaps: []
disaster_recovery:
passed: 0
total: 0
gaps: []
performance_cost:
status: PASS_WITH_RECOMMENDATIONS
checks_passed: 4
checks_total: 5
categories:
compute_sizing:
passed: 1
total: 1
gaps: []
storage_strategy:
passed: 0
total: 0
gaps: []
network_tuning:
passed: 0
total: 0
gaps: []
cost_management:
passed: 3
total: 4
gaps:
- check_id: PERF-CST-006
area: Cost Management
finding: non-prod environments running same shapes as production 24/7
severity: LOW
recommendation: non-prod environments use reduced shapes or have schedules
wa_reference: https://docs.oracle.com/en/solutions/oci-best-practices/index.html
operational_efficiency:
status: PASS_WITH_RECOMMENDATIONS
checks_passed: 8
checks_total: 10
categories:
deployment_strategy:
passed: 1
total: 2
gaps:
- check_id: OPS-DEP-004
area: Deployment Strategy
finding: different provisioning methods across environments
severity: MEDIUM
recommendation: same IaC templates used across environments with variable
overrides
wa_reference: https://docs.oracle.com/en/solutions/oci-best-practices/best-practices-operating-cloud-deployments-efficiency.html
workload_monitoring:
passed: 4
total: 4
gaps: []
os_management:
passed: 0
total: 0
gaps: []
operations_support:
passed: 3
total: 4
gaps:
- check_id: OPS-SUP-001
area: Operations Support
finding: no support plan consideration
severity: LOW
recommendation: Oracle support plan level specified and matches criticality
wa_reference: https://docs.oracle.com/en/solutions/oci-best-practices/best-practices-operating-cloud-deployments-efficiency.html
distributed_cloud:
status: PASS
checks_passed: 0
checks_total: 0
categories:
dc_deployment_strategy:
passed: 0
total: 0
gaps: []
dc_integration:
passed: 0
total: 0
gaps: []
dc_compliance:
passed: 0
total: 0
gaps: []
dc_operations:
passed: 0
total: 0
gaps: []
action_items:
high_priority:
- check_id: SEC-IAM-003
pillar: Identity & Access
finding: no mention of admin account restrictions
recommendation: separate admin groups defined for operations
- check_id: SEC-DAT-001
pillar: Data Protection
finding: any storage service without encryption at rest
recommendation: encryption at rest specified for all storage services
medium_priority:
- check_id: SEC-DB-004
pillar: Database Security
finding: Data Safe not included in architecture
recommendation: Data Safe configured for database security assessment
- check_id: SEC-DB-006
pillar: Database Security
finding: no mention of DELETE permission restrictions
recommendation: explicit restriction on DELETE permissions documented
- check_id: SEC-MON-003
pillar: Monitoring & Audit
finding: no VCN Flow Logs configured
recommendation: VCN Flow Logs enabled for critical subnets
- check_id: REL-SCL-003
pillar: Scalability
finding: critical production workloads without capacity reservations
recommendation: capacity reservations specified for critical compute
- check_id: OPS-DEP-004
pillar: Deployment Strategy
finding: different provisioning methods across environments
recommendation: same IaC templates used across environments with variable overrides
low_priority:
- check_id: REL-SCL-002
pillar: Scalability
finding: no service limit review planned
recommendation: service limit review mentioned in deployment plan
- check_id: PERF-CST-006
pillar: Cost Management
finding: non-prod environments running same shapes as production 24/7
recommendation: non-prod environments use reduced shapes or have schedules
- check_id: OPS-SUP-001
pillar: Operations Support
finding: no support plan consideration
recommendation: Oracle support plan level specified and matches criticality
references:
framework: https://docs.oracle.com/en/solutions/oci-best-practices/index.html
security: https://docs.oracle.com/en/solutions/oci-best-practices/effective-strategies-security-and-compliance1.html
reliability: https://docs.oracle.com/en/solutions/oci-best-practices/reliable-and-resilient-cloud-topology-practices1.html
operations: https://docs.oracle.com/en/solutions/oci-best-practices/best-practices-operating-cloud-deployments-efficiency.html
distributed: https://docs.oracle.com/en/solutions/oci-best-practices/effective-strategies-distributed-cloud-implementation1.html

View File

@@ -0,0 +1,269 @@
%PDF-1.4
%“Œ‹ž ReportLab Generated PDF document (opensource)
1 0 obj
<<
/F1 2 0 R /F2 3 0 R /F3 4 0 R /F4 8 0 R /F5 10 0 R /F6 14 0 R
>>
endobj
2 0 obj
<<
/BaseFont /Helvetica /Encoding /WinAnsiEncoding /Name /F1 /Subtype /Type1 /Type /Font
>>
endobj
3 0 obj
<<
/BaseFont /Helvetica-Oblique /Encoding /WinAnsiEncoding /Name /F2 /Subtype /Type1 /Type /Font
>>
endobj
4 0 obj
<<
/BaseFont /Helvetica-Bold /Encoding /WinAnsiEncoding /Name /F3 /Subtype /Type1 /Type /Font
>>
endobj
5 0 obj
<<
/Contents 21 0 R /MediaBox [ 0 0 612 792 ] /Parent 20 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
>>
/Type /Page
>>
endobj
6 0 obj
<<
/Contents 22 0 R /MediaBox [ 0 0 612 792 ] /Parent 20 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
>>
/Type /Page
>>
endobj
7 0 obj
<<
/Contents 23 0 R /MediaBox [ 0 0 612 792 ] /Parent 20 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
>>
/Type /Page
>>
endobj
8 0 obj
<<
/BaseFont /ZapfDingbats /Name /F4 /Subtype /Type1 /Type /Font
>>
endobj
9 0 obj
<<
/Contents 24 0 R /MediaBox [ 0 0 612 792 ] /Parent 20 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
>>
/Type /Page
>>
endobj
10 0 obj
<<
/BaseFont /Helvetica-BoldOblique /Encoding /WinAnsiEncoding /Name /F5 /Subtype /Type1 /Type /Font
>>
endobj
11 0 obj
<<
/Contents 25 0 R /MediaBox [ 0 0 612 792 ] /Parent 20 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
>>
/Type /Page
>>
endobj
12 0 obj
<<
/Contents 26 0 R /MediaBox [ 0 0 612 792 ] /Parent 20 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
>>
/Type /Page
>>
endobj
13 0 obj
<<
/Contents 27 0 R /MediaBox [ 0 0 612 792 ] /Parent 20 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
>>
/Type /Page
>>
endobj
14 0 obj
<<
/BaseFont /Symbol /Name /F6 /Subtype /Type1 /Type /Font
>>
endobj
15 0 obj
<<
/Contents 28 0 R /MediaBox [ 0 0 612 792 ] /Parent 20 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
>>
/Type /Page
>>
endobj
16 0 obj
<<
/Contents 29 0 R /MediaBox [ 0 0 612 792 ] /Parent 20 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
>>
/Type /Page
>>
endobj
17 0 obj
<<
/Contents 30 0 R /MediaBox [ 0 0 612 792 ] /Parent 20 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
>>
/Type /Page
>>
endobj
18 0 obj
<<
/PageMode /UseNone /Pages 20 0 R /Type /Catalog
>>
endobj
19 0 obj
<<
/Author (Carlos Mendoza) /CreationDate (D:20260413001815-03'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260413001815-03'00') /Producer (ReportLab PDF Library - \(opensource\))
/Subject (OCI Architecture Proposal) /Title (PharmaCorp Mexico \204 Oracle Database Migration to OCI) /Trapped /False
>>
endobj
20 0 obj
<<
/Count 10 /Kids [ 5 0 R 6 0 R 7 0 R 9 0 R 11 0 R 12 0 R 13 0 R 15 0 R 16 0 R 17 0 R ] /Type /Pages
>>
endobj
21 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 570
>>
stream
Gatn!9lJN8&;KZL(%6/,_8K]#EeJ:l.T*U0*&qmlM74Fg`5,#;(\-N'-VMuB'qu>HjKV4HH(UKZ7nS[mHdr.89>#_o_$.t%\7,g,HX)fW[tO9<E,ED#actapaeTfkD:1)r)$QEp+?8`5&n^]6dZ"R.1qa[p-J$d@1'&Osb-&O&:3I(Me-5Ck?Eidpc'6_P:gf0E[K_pG$0@l]I]O[PPVg]1EJMe5E.\V&`qO*!j*H'/F(\^iW@HN2?md%&U&9f=/.*ATcD%D6/2*=>ku"nE2^<'Ec(4/Jd!5orY,R7fk6%0Ep<HEmmtkVC_r+$D_Y<GK&_](*2n3jFV\,I_i6I&ZHc5`2`pfXj6M&j)W]TmS>d+.jNU&$5)@Pr2@L9;]=tW2!h!?W/D1*7?jmJV\5>aVpd,qeAbBT/G3LD.'U,>9<iX]%sWY3[Q.[E8:Y(Ni[LN>Q106VHIC2Ur;+\Y)FmB7)D4Pp,f?OA/&i;!0?(V#BM]D_L1l*Cp*jK+1RT<`r3PX7Tm-oq;lLg(g%5LRLHgAeDPM.8o^Xe0B6p:F_Q.EqFpJia!%ndARjp0@~>endstream
endobj
22 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 2000
>>
stream
Gau0D>Beg[%"?O+^r(JYe(L`lh08RUHe5ST(OJdsnj6!V_aY7R8kSAu5EN0]-]RL?dn\XgV$Pu]n.>Xf^rAUWr/<F^_[1]O,sWkPAjBVEKuos+1>.$,Z\$PI+po(p>`[f1s,Y%ifcGjF]c9-N!mcW14>/O0.?+"el9_U)ZM^OSbB5oc\R;t$"MP*VC*HsaC9@`]&s?+*KJFBLhD(;#,H2#0kMJ]ZpL3V%-6KY,FW'1AJ\NOU,kIEpG[:]BY)-8C*JHBqLhm_"kY5_sZo=<&]&RHMNBcRu^H+b-a)\*d1pk->.5p?S2g@ZG'npFm%gjU\TJlJp"KjF5Xb:U[?u&GUVUIsP#SmJ^"8%]5_tIG&ZGD4Ye#@tg[85;^1cY<Vj15ka*6*,e0su7<o7^1/lE"_M&GWPb/@gndOC8V_F\%#/k7Q/-HNobn2[#%b&>FnQHjprVUn/N6d+uc4PAXl'c!OlgaFYpCnIchO:b5@%,ckHR<oVQpi8ehcf7XW<D[5<Tb97k_h!Tg=naEDQ4;3&0a`jTciN!K&,C*aU""O^)=aVUfH)H2Ua[j]HWL.Z55.<TgT.++'5qL3ZKO9NMScd.L87d0UK#fGK*b81=:="MJ<J$aK+I8#nR?n\ZMg=n(.!Tb(LIQJE#"8'=gb1`8Nr@p<@hSkgFfZmD^f-APgr-#[7)P!#(nFDY@l]]0_h0cKO_N(Ms7dK>e5i?_mGRj3_X&?AhE6ULC56akH*Ma@]0FfjY(_[+;q*_>pkn"8+r)Yi0q,)/kLq%@M<\uHX\j^\,qSVT@V)C_)\&QMQ&38`NN[6,jO_RtT<(f6##7<oUtZq3igP02R_s2G/#@6H.u`ao+>.roECBt&PPB#S-/+a!,sec0o^Q@hq7=SnNnTp9aUf@sl]3ulmlO[=r-!Q?<9j/`Q.jl.A0*BKL#uAqKS$OW88<hbKUF5uQ9q+aEdJ5^TN>Nb6TdaO=uN'aZ'&[T>YJ4A@N-45ZMR&]Qdf[7QI5b*$jrl?'G\Xid?_*`;(W]^0uf?VXk3]Q:Mf2FY;&`<M1^SP.7B7M)SGo'ZT8[5Ahm0SL4YoX<f!@)-cF=i?):81'/o4?19^+fX`(6-6S5>Ze9@kK93IW92<R2$'ke/m[>@!;eKCqs_,itK[Js;c=1i!7@K:Kr^rBudX!n3bR)&pJ$B+LtTm)QcKM,@D&nY$m3=7"MkIT%\?Xl0uVk^PZpT#p/oBJoIH_'Oo_/RlV&0m5e3Q2nrUKGh%$6c!8MpeQRD(&2agb4D$F)YmFT(l9/dT".ZHQ/E6p(,$=bkK6L8S@L`04<=uXHtM,@pjF*1Q6Ra@]Jk'%5h'ETC;%\eG!>;(=]+_:+7Oc9`b_,lt/`?PXskhaKPp4r&97;Q,LLB?b^VN=0<G?0QB)G4E5gW@e.`?_a97+i&2!#m[Zt@7PfucilW"llCIlcZFrFVNk'HM)"WUBC<%bN;:t3I8:ieo-@8,-35OP_.WbY'-1l`Zq;;q;hb"XsR=ZELZM;-dn;-9G;D3i(VG2e#RIJ]72Ghsn+Vh;@5OrnP\+#+aL:\so%R>h;1#>r#(i^O9AfpRBinHbtmk:7Sq@5]KfQ+V$E]_[FEZ#"N\]?a)]=V>b9^pjBcaq%uSS;$;VI4@q-U*eHg#si(!t4k;6a\8i7^\IY.sRE7^P`HFgd]6mSdG-SHJ;Ts25Mp3c/&W4SZ>gaD'RD>PAJ@<lb9Wb[)ZVr5W^u4@_ZS/%D+COMqLaOYjsj0Q2b0Li=.]&53uZF09un%[(VmW%8H](KNC\Q@'si\"kn_X]M4b"6BB1!\C$5N1RW,52bRKL@S$+-gVo(W/@gKORo@iKUDHij.#;H0#:%PJQTH]e+"S,jj6h*<(FsYEM]V5<5K/KZQ[N61hm]6QIAn)^1,F--c(*?[DL1RCMS7`lI/H:UDqFp;RbP!UX#8V6d<:MZ6kd_%N6Q.9Q4dO\5^utOG+TbD=q-SUXo!WiR+7!LDrGF8IJLM,m[=-&rrU/\L?&~>endstream
endobj
23 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 2270
>>
stream
Gau0D8U&oI&AJ$CbY`()QJa*iY8>/^dO)5/WD*o65U7VKi>)F#U]1,8J;YhrQK)"kGn+O"1RRuMqd9U\raY[%,R8S)J=eJ30FnpL@"B!,iXMD2:-P:0PM#Q+*]W"%#T5hi2\0dY:HZ-K.3K%,&k7sM(rl8$KDA*>/gbF6-Yeo,JKK3e!1\SE8JHc/RTMNM[3bq*RUd.:Tc?PR)m441>,hqdMD$_6?bkZ>=StGLL,(<%-IG*HZn,65'nqc4)i-IPG8e),_:3&F#ec)^$[LccSNB"aC&G6>s48E4l8u]rJ/::eitPi.n/q2=A'QnPCn=X!B&L4+1_=nmJa"F((FCcfPiNN2esPBg6,<[eAGC,=HR?:2@J]f:8'U+YB3cG#<3hWU,c4TDY*CON=_0qgSUBnmB\K(Q$,PQ/""@/N\K(4ba!Uob[D$>4bJXd@.Dcus>uVUsHLABXFKVj`AoDKk3>5T!Mh@<#rCI*>-uKbT>6;5]/4,C"$_rc!1')`d28ei(SW-nZ=-ZV;aKjafXN[_=-IQ_bXe"_hI.Y&Xi[n1t6-]k^Ntert[k\O6m\JM9Y>(F+KBj72(o1Vhco'_XcE;ljC'L_:_96$*6>-g1E^gi;U[Bu?Yqd_2WNn!RMi9)nfr79!G[_.DLW07@SVtkIPpj!>=l=(,2@mFl[a#9r#f\?n'm^?-h[630Jtb)P%^#7?Aq8*Z&aGHR@2p=;l`7,Bk1KG=Sec`U"Ks9G?Pb63[8D(q9K4=h.NZTLQ=YmEhYpKU0HX1"^d9Hg0l?K6/n*X"ILEg"V'6Ut#>\suW!s<urEN.X\8e?t[>Ei*XQJ2<M)?%dS:BLqF%!E/O'ggn/X.qoQ1/dH1FD:"qsajf#]j=h26Sf>5J$r5G`aWKP68#Rj]GUG-NSoTGGY.h$#[@R#7p7;UrpEjdAsN#eoVN/n^#[.g(qE\aTb9k.sVIk$KV7j#o=G)C`io@N]p]#/)7>N]H-if9"!1umS?b*Xc&D[#*MGThVp^(50PWm1BgXnq9(eRM.M%de`glE':gprS(4`&3sSV.C0OOkJkojV6%$Lh`Q".9ZJWX05;4PXW[uLEr<nQg8H3/c/Rlg:MSKZs5#KH4Z1T:%L+g(Q)Y"ic)?'i,.$.?aCQu1KP:4<*T@\dJI)*PAY,qa6"!QCB"[\`@PmFa3USGuc:h[l+N9r6JV^P"/O\Rt2"t:_3a-21fo6>d.D'AN_Z5-.A2juhCqTBdL>Mk\22;.OFbj&/2Tfk@kabrP,W\6U7*ouHW,Z8-f%rrUR3$PgtB#tm:]$$9Yc\ir7SiT=Gd+HkZaBTs6&ef<qUH%i7C$"(I/G,D061@VGUS-<.HgPuGrP-=6J=G7Niq9d2*Ye*_eTrn`fg5(Ncjqsl3j9^FR`-=S3W=s%S!I@9:Ee>IFUkYY%^@F2??WTXlaB/Jr]mp='XK?t&_Ps_(!Os0Np!iIYaOi+s/>Al:E[NkB4ekBIE8k"OHoTG98-+/C-Kq]XiS)Z-4;E/`,F:b+K76H:&0hR=$+oX?l-Q)Q/W**RpMYg0Yf3,5l4t93#.ji1l1%0RIMRU@sbV6@*eiQ92XW'2nNsFHW&H*91=%MUeWc@WC&Y2,l"&&67BWcOE9sI,#27s@h1YlkZ:Ys"(HuH8aQ%QkOF/EqE.A"b\.WG@AC<Gm=p5G[J54)5*ZF[D=!gSgkc<+f+GIU;gdupqT9j9qR(UQ0ZTU1#>tk=$jPrG^83--/ZT5j[kf-1rHM\-EijSoO\,##():bj4#Wj3WA,_Z(3Lf.Y%3BW1]Ttr'jUi^GIPEd=^e=paLV"I`PigB#V!Dhgp;HN.%6@X(r:T7g@!Ta4*@NO>3]UkGTsB<m647cmotVnG8J5aSaBR2ok*WF.$3cM8lZZ!5n>F#j#dg(B,&\Q5PA"/??D9K)-(8ea$%k)TA\Q'&nh4"7Uho]?"Vk#Y,J+Uo'&O3nt4V$*fek3Y3]99OSC)!-$V@cW)%?`!u0s]0HJ3DH#k8O)C@3=+YAnhjiZD]Z,@WW&OIdp/Zn-VSK#6ID3U^R_TC@U-oFQ\qY3(iSk'17`SaPuN`%Up/UP3-$u[HLZ,b^P_6e$V`s8-"ipln]'9Anj\lUbAk(U7>=NmMQ[-ZTY"s,c8\C4O(`TuhM?GtX(#B/t-p#4I!m<FIH"H5)bC8]iSnb<QCrr.Ye<]3W+[q(NULiml'Ph+X''mHm[q>.LpkP"c-h(%s<AsM6LeUB.jlpYgF/E0=3k',g6-]RY:)@N"CcA)(#ZgdAnN:0R#jBp)$k@4~>endstream
endobj
24 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 1936
>>
stream
Gau0D?!#c?&:N_CbgW/j?!L$g^Wu7?8q>@-7nU((+*^X&-#p2l<48Luq]/7J#`q"tlTI8H[URM:RCOPJ6,:GM1#GP4n6lao:C%L=iu&Ej0GpG"nbD%_JJ1MU(K59daF&RUrC#W@oROgW5lj0%cjq6(hiGue#,?g9\O]q_SR?$Q@@g8)"qDk'%"*$@'(J=cF$5)U+;ofD;@^D!JubC`8[X3ZnM<o#)]4'[nQTjJEt7`20\Db:,`>ed'h+DYCh&>9]5cmUK%MAhJC-dI7RuM69fS_&@cK2Ps"to;H]CT6d)_&[:jamGm>-E.-]U)kmOqS/!Hi+\1#Xo(VO8%+&@rcYP2kb\.2PZ1W'U=[`'Yaf^-aGB#9gDbF$T6S"pc,n+4L#eqKG'Hpa",4l2gm76!Eib&dkd1,4C22G_4rnOs"'UdI\RNWJ*TkR?o/a4M9r9^U+f=XcX3Z*5ZN*8DLnP%98j<o`/\,T51,g`Kc,R[).'O._QKLi"_$rR]@l:&k6-COOonBi++[S#-!c>-nE7e;8N_TUf.:MM.mi7R>ge;[MQ5gi:t1qGVO%jeJn1:0LbjP?K-&QQ<BZLV<M>@pkk,r3mB.A.@J),-b&bHUI;"k+ptJN#rfOpRV@OWMI/<,L(GrDBAc?*Q=r5k2fG5;b-4lW2TLsI^)o6N`jAU8`COJS]3$b!.tqfjQ,411fK+f/+sgXj(7Qal_al_M+%1[8=#4^d3cgq,N^^gGD%4b0fISn%^!Njc6Fan=3TIC:T!%uI"5*)<;ARpR4&\C8i'bt.Cl_#j-tF[f]:&,u&MBKTYhbCRRo+oG9j_IRptVf`-8`7\/\1W3L'tUsBe+]]-@<Xh=(tOpQDqG5XpNoc)9.-O1\%rb55rZb7dt:g;nk,J]P^;I=#*:5ah!u9<4A(8&6R#"[jPDNDER`V@h!Cfg:\s9rQUjNolM[iWNA!0F8MumM8u/UhG_9dS24*\h-%-Cm)7Eq[KOs2PL[rf$97gl[nAe6ht9G<ZJ"_dbIs?l(J+e*8h(NGHV2rpNp)fZq>YKt'E3F["^Pm:hqW%IGb_ZEURq+>qddWnI)Z*[@U@^>$6R;jo,`7c7[l-dN"P&a)Aq.>DqASaQTE]e]j(Me3WeoOJ$=-t+$RFR.6d?1MA/5ADO5ph/T=3(WKl#A=u'V;09Y-j6dI;1SI/O9"T.<3P8IH/`=l\tjkFJ%PNSNMJp@8u%n9XXChp6J4#)F8YED=Xbl>VdBj(NeS%3eq`KI"39k=?G#1FL0B$9=faF(G(>)]aga2e\aaFHK2#Ipf,^qne8?bb$_,\jtLVZqL*khV=SKWCk(39sr(K>C5TKeb)M=%K\0mpDReF^2Uh-$V&-q@2X!DVhb:oV/Q_Qm5fa!ITco4Q=HP\]PLp#tnOI7<+YD=laFO=JH5Z/l>oEoMOrSW)JC!dmkXSALiFS.4hf/$0CthQZt\B_/BkI))"Vo\PR?E,S0%UKEFjn'/?Uh42jAJF[G1_;;FlfgZlrK2#*.)jKMn3>6/)k/hN\#f;EdDcqlL>Ok6GR9Ng)"d4"2kf[p+Z+iikM!;Br3NjYu#K"+GZQ_RJUFXCq2fIWH/@%0A#C=Z/!$kNB?bsQp5-)NuQ1H=?)FX2l3lQ?;.OKbf6)4jaSU(XI;'o8JT=X%cgYu03]D2khB.TmpfI4TA"9uhKtN2p'T*gUD&iYAUIAS$.g([3Ta4LcB'S..tJd64:Em^977,kAQ8Gl3@-(V!*-U.dG=nMpYkkW=#""ZPV./&d]G^ni[?HI<k96.@?o*fn.I2TlOHXWY9T',Flp,"5@i)Pbh%kqlpFP.o=&btcb1Sj@reV;B1p^?mAbUZ1VIc+2A-##A\%".3Zj^3'O83gDXVec-anR5*Oi:Q`q#gp#&MSf.d'WYh:kj#\JhhSH%i&4^1uK#pmCBQ]mQ<B\Y@*;g1A-GD_~>endstream
endobj
25 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 2349
>>
stream
Gau0F=``=U&:XAWfS="WD%q^)n%QoPijKN@Nhn)iN*ftMZC18[GW9SjI<P^TU25[L*-=<"@$'%>p:sui!u$0Or'*jU:1j"`4Ti]4[K'nY2U"A#A9RV4aRFT+$9/mXZQ4cBoG`SOo-4b&O"tZjn/N6BE#`5f&ss^tjF![;(iD^bYUtV82Ae>^T'LoXPaLJsECU79"%a,iLJg+G\eddb:@hp$(XZ_4k!-]K/'NGhEr@f<0g)phmPN6*nN=so=<tR)7UQG7M$O0H"YNF-b6:II33>.U&Q/,?jc9be"3[pY%GWmi-'Yot^tBn<B1ChR?61bX3!!o;[s-aD)Q#[VRc'Te.87ig9L1?DOR8`p$pRG[#p^1[Rbk`eO>=qrV+AXjlle"P/4IOoWMi4Jhpp*mh^=rMT]8`6^u4qfLWSVf'YV`-:K$L>4k.1*=Y!'+maqOieIG7uB.H"k#gm))"U?XT(@`1Q/:L(C\u+YSD&q5P/c:jrReL)l]l*B&F`_g);/.7;"OcmekP(O/^e@ZMl5s/CdV:YmUX3*'<qQX!iUI^]T>poNg"f]G4RgbW?:=Uu1/C:QkLinq[RJU&-+$J>Z@^\(#b1BYCBc\)#1l)`_jR8bXO0/E.e7j*p*Di83W;uJ79#*f^\MT![If!:4GqT:r5mRpI&]V470QqSn8GhqgdBoBn`JYb1+IV^-R[@T9ZL3Z3;YI]Z8'$6QtOf/%Rh,W!<Ek4%SrTH$;jh-C9fJ##70EASp_FmCD.J*\>QLYG7NrSn@(jECRA-HS)=2I2oekE,o_fqFgBa^oRId#%R0(r:b)+L*CQ+*oJhZO2)pCNkTA$u^uDAMhEHuB>N<:!Nb9a'$D/u9m>D61UTR6-rF(g):dns'7j^4b!cBpi'MC1A^2DU9PgNACkQ@C?_`Yo/C,#=g8OQ'VE&QDJGPq2XO)e#2&uhrABLP?]>Gfc=\[H#AhGI(@T+"nD_.jL=&%.1NFq;ilp2H`!!gEP:BWBU?.M"M,OWHC'eMA-p7>4.3g*`Ma(Mf&sW8d+,^?+]6]%/E@\+uTJdM2[1_-\gq30!qY/g?*#Et56RObqmT!&IWI,2(g,cN=U3:%3e0c:SW_<lM8m`>R]aI>Hei!u.888=ed@qGtX*<'i(7n=FMrGqYJ9Q*-*J8L%Q!,tj1C:h(o/k+7naaRT[;#*@3THEi:DR-J\&mu'5jYt$'$Y<G8GR8t%m&+=,O'r#$$&3Yb>4ib&TiJ)JXjXFdm.92t5Lf#Xac_H7]W33b[2/UY3F>hQ+-`F>X(TTG<@9dS<_gH[CNeSY.dBI78c&VP'A3[#&3p_"gm.Fe$T>&$h5K7'[H_ehI)bN]c=pBHgm>F*-mLq&fYJu'_&(P!pB*:HAj5dDe%g+pF$cA5-+s%itC/n7Tgn(eN^GY:KN36M4SRW3Od"aA,e'`l]@fFG'c!C%n`69=n!FCbVp$gt.J?Y+c*hi^7OG0)Z05*i*D3<9V<S.8#kL8**gG4lX(u"uUHFN"D1`-$m?4XC@/?acZq!>YqRs&#heC$jGcVE=l0jMNTo]crBiYN.4g,]mHV6.=4W[AQ>2&X#cXJM,*`CKVC2V,d(m:Bcj)Q/a'er3M)Bm`GL)PGrf*0`>?eMQXX?Bc&k!C-'rKUheh6_<FC(53K\H%*BD,.LsKeSd4M(=o[jOm2;@F'q0`7iS4:_8,"Acj(Q6I$[`G+&KGIKAYeTDt"X>k-"PN$aWo]KM$0PHF4mjFaETO(/kJ3-%AGb@$d3g3ZFS[\6s+"oBfWMk\65GDiPiZFohfC?LA53=qL%V/<0LsD<f`)iVI$]Yn=R#2\]uU0*Bqk3r".A^INGho"-tul/)JAbqWC2W(h0PIQ\G#DS99/oWCo;C:5K;;tqEi65<u:o`dfIO"3bc>+Qkl^[9GME-=5\D_Ei6>G/kJ[PK[_>=/cKDXEY1Fg.V:$qg%$Q!jJR2YH.ee<B>Up#I'iT)FkS)gemIglll5:Y)"_Z>T<V]%Nu":Gf]GMSJ%dqPucgh/cYEG.VCjp36hLh.$pNe/22f<YBA@O[I1rX'2Zt=V`@md^*Q-\'J1(Xr@UKb[$3ZpA1fj`34R(;1E^Ro/NbAbHalS4]hV<1r`u7Ij%%j`_TA/UuMd@N33s[`cCVUQ\>\Y2--P,UgPs/,S$T.7Xs=Ul5kVI]9`,1R25t)QX%DZLK:gFb9@E&,se"fSj?Hp"\gPI'M;1)q8Tala#Ybhl\!`W:l>ZBRj8#;LYp0"XIDa>8u$<%l>!9j+ahM`L[S`5XhfCV7,LEF23oKk``YC^V=,9f/=.iiO@g6YRTp@*%:8>t)fYL4#Pt/D6S.30..0oW1d,dI%cQs&p6*;?Ii9b0>l~>endstream
endobj
26 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 2147
>>
stream
Gau0E>BA7Q'RoMS3"KRJ5iPDAI-Y"*QJJj2Q8Uf59OEIJ[YD^1ZI@6O^IQ#W\N*4n_gp!gFDfuucG^J'rh9/&i<8(L#Y4>3:^4g!T\SN\quCBIK:`C7k7]pb?nm^('Hd1$%'KUo@.87LK>YNH>aU'%q"`Y]D@T9^^?-25DTU,^[_i.V(8oZ'*O(V=FZ`LpH35a!ar0?2-IB;L&8EBnM42;8r"Xq-CD_MUi>^%E\VE53k;N#CP5$XJaZ,3s\?X![8Dk02+<WL[d2G6!dFMDpAWEm\'_^Uk^M=AgCs-E1QuDeS;;to6]>5+LXh\j+mS?h>#"D^9_^>Sag>NZ`I2d;9-Q4U@W*l;cgd;Gu5)?hH&cnJ9mRQ_^A?Ci#\P;:s1kS(LR0j\*8ULr5EUQNA$2jB4Y2u4;klX&FE&fn][-:g`pI\sn&hiIXXJ&^2W5FA,qj,$To6h:27N7uRrJURb,OTl!M`p4l!1hF<K'[`u#7]731qF/@hEup\KY'/[""s+k*<V>f]/DkEIFWYhMtQ;"?.PbOq^go@H$QIaHS/sSbOJ!\T)sA!Fc[\`<Zg`J+eTl0gtCK2#a[#E)B:e!:6HG)fgb&%cgWEXY2@6g3pW/7JQG<H*H&>,k?6WThC+QG=^Wm<#D3r?IYklMS:%mFYYfq1i4amCW>oP[M(?]W<;=fuI(6rS!AAOsi7U,On!$@!2%-`.7`]EOYLh0c;"?"S-aQ[.>>$6$BQ6ST4s=2u#gB/i.VT3^&kt/kRHJcS+\0kY*F'i;:6ZGWHLaqQ+>V;E4A2Brc'K\n/EO#i06l%l2CjOX,*$:;n''I,R]$YoJdW10R>aQSb&->t1N$eb[V]n7@5T7t4:]E<OW6Y$2tPIDBT5RL;*nTs!Jrc,mn5[SL;i2a%6Yq6%gh)"E<7OO91Iodqb:iqCp;C9%/-cCWmn=&m%\r[:e\j;BH1U0E6FUR\]JuWa\?\>f\<mh=pqRU":Qu48qfI$-;RM[Kh4%[iqoKm.RL]=3]<_PTtfW-2'\*f!c19E[e&_p'Bl"ZiGpE+dPo\VMCa-?m'`Y.\VVFmF=Z!afdc<!dA4K$[!Gr;Xq<nZ(P\;ga[B[FXb+ph)NhN>hVAQF[\rlOW\D(*p-1hBj2_2hESJm/*U$P^NJKc/?!9M."^Nq4CsUYN=t?UB,kZPsmED"dc0g!?lX.PKE4PA+RR,-kG<sE.0\W?]d<W)6/gG$M;Tj,60_SfKC2MnDa1pMU(q:83qBTuaop]jnWr[aJOTc)+X=8U(h2-;S<.(aG]Vb6(Q.8hlVd`S3&FlTkGnnSnds*11ca@9uNE%h-Y>o7>]ZkS1Sqk\Y?])>g0=L',FT&;>T2ru^gi83+a>0=7I0W+,g3HLXgk#HHWY,n-Cd+WJ+4TM=L[@4c@J`c9r;Dr9Ch\X2a'=>*c9BfS$EbF<g/@=mlpY07=<:je\X>/sg=n8hrNCU'I[EQb;&7:8(3fKjLMrnIbFJn1(u?RFGgnpEe?05To(aa4YY',U25_QYL9m'_fKMFJ3dM`e>c#&?)ekEA-1,3Pl!M823;pM1\6!HNN)3P4?D[+]g=m>(a"Y;,oFX0b\+<L"L<3s=V<Kn7l,m"0*f1)LO0l>R[;8NPopUTAf%<Pcc&^)JIRWnlZo\4Ed[sgA0=sh`'X.;krcK0#=FPte.4KbIIT_k^=T5^>2>Jr<c2rp>jW?<-01K)&R^$^q2:"HRm#0?Q*5283<PGjCQV)p@$"'OGp-!\YFUL#j;coT<4h\@Rh1`Mlrd-!A#Yn@i"2j.O;0p6Eb%s!'_Rgb7f;(J?NHP$G_3:he6)If$YR<gtPe_td4_b&BLl]r^jE<-[D7PeVoj6VS3i09kb/gW$\JgAcQ6Y>$LLd8i17nQ`;\Y:UVo%"5(1RWno7F(qi,pK_[H/H2f3e5Te0tpPPT4gENQPPMFGemsPYZ$J[322rUj!tkESoJcC45HaBJ&3J]9OT.asW\0dc*2Lg$nsT6'Oreo4X%Br_*"rAndQ)AGbla"anMbI0<V<Aap--h+J,#/SafqB^$JY<B9beFf>uCmA"MC,-Lrb#C]i_0X]O%5l\c<3Kn453bm5Sq+'g.eJPL5!P?qlDO("QjnbVs1s:NJ<Ju"=DTsVOap&QP27mJpl&nO8LP,U-\/'R>~>endstream
endobj
27 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 2272
>>
stream
Gb!#^h,E&f&:`lHfV_Ku.?5^(:ZieI'PM@kUkEO\^l*/";"7V(#Kk<in[Gf6`sK"BK%dhf&7m)g<r:X:p1HZV`ue4Wog=9(Qd@rD5U]mo!&6>E/jI2"jhZu[c#ImDUS(K)Zj=Cf:D>EV%OaFZ6suG@=>kh?=`2Uo?uiJJk=TT_AhTB_VI<?J"O/41Yq==!'<rNJB6!uTQrGIb#)1DChm,(L_`1BKPlDGHr#.3&_rVi:XuV5=RU\:r%HHYA9R2j1(,UbZT'j-M>2\Y`ZZ.j?d?(EVXD0bM<)TlsBYJRSe2&q6RQt0'/JlB<*1W=[:ni5QU[oU"70$;bG%8=#"K(-2bHoPB5Ep+!LK^R1VO3s8W0nr:BMg%%RlXZ]r^3\Qb2MIlHGnAT=*hfj?/*0h@U.GjhlXZ,>Bd[8*?u,F9)&">%If6oUie@lCUR)RQ4%R?+a$a'dW]IFH36AJpEG)lEFdO`'Hu@(nSk)]EQHU0`<Nn]+3!Clo)fJN(pc&[SkPdnUFUPN/pHPl'd%"C@[u)JK,HrD9t/m$=jbq"^iBW,F-]S[1lasFV]qRPHW/&!(Yt*O1<6VA%NF3B"AcFiK54c[(-q=OoC(fJ]RgOZa7h^`%R^!BY"AIaaV=-hfO1bI@)DkfMFe1W^!Yd1/Y#O1hSL'e&+ZdQSK:`cH["O"RA)5$9I1`Brs",O<9/"?0@*%YGPY%USDAWm1.@PeW0.Hh_L*5Hj+'SGF$#qU.D+E5AlW-qVEk/0nr(?m\%+&HUPr^B:A?tt-<ksed/>0OrJ@`H>?$o"obA5WO)2qDZB.s5eQ68h$*>Jl)#A?]r)?>RlM0q^eQGrM;2['f7B>!S3:9+>[$nGg[2+0>FXs/tPhD>G?HVQp2`0)tX]STX7%6*b(+l>Sf)ll58_5ICiH;]keJ7XU76=[R"op65I\N/P#(KU'/Zu?6qZd<R)>JYCO)e8nL+#@eOl6nkVtbOjT1@:'S;)FFSpY4HD/?YO/8a9"GjVMu6r0NHe1Q^sfc=6\'3X0hWtmR?4ej9J1</'_?kmU5)R..kKqB3nZR%iP)0Y!ee1LP:F?=q\Y'&WQE&dR:jh#VZX.KtoNUEVY[o8lAnecuXG5'F5.WR7R\VR$Z\H[A(VeDpPVS2]er<+aWm2+hUr*:/)6-/>6pJV!#/eH+qa^K]`$,F;ed>V^\LEt19_beS*9e0rbl0!\-JXhlQk2Y[dj.;jF:f_&G.([Gd4&-lK"i7drPE[`6p^V>9jWG`aUNi<K*Lg5P9^H:0Yr5a/bd&4te;3u^)AD"d$k:%1%&Q.#`5>S..=(LCPUASVA]U(@"'nA*$TA:-^n&PuC.$\nG(%EEGb_lHO$8O%3di1@C4&+bd:^hk@>XS-__R7f"6XknhSElaU^Xtrc[[TG9gj6)Lp2dI\k:0eN5=[k/oH>L`$=4/d8)Zje>D0lQu,Cg(BX'(82D!j.l$)mJp$Yjd[OlhNb;djQ<o5_KUb@e:QcR4igSmD*87jJ-G7?YH*J7D`Zq@:k7;QY#6E#1ZnA]_o:2]uK/Po`YSbAr*lRA@'0Q0^<7.r<2[C0$a=pk0:YS3QmWa8!o^JdMY:mdrM%u@tY>4mM#*pON,<Bo>%b(,+nf`si*163dUo[g4#fq8#lCGl0'QV%=%aqdA>AQmoo5DF%LD/.II%'gee9VWLR`5l\\+0Ji2QJQciV&0_F<V)&+0[`cPs=l)+]g*'mcujIL$TDps"Gt:/qJKiVo8^P_$I<rc9E,([dLK=>T4n"`_,MQUfce]m+&57T"P\]p6'Wg(%3tpR8Kq?.ZM@j>0/PCf$XUlLd\'^TOkJ+D?JXhe\0/;*0i!^CgVH!*"GmH('4(SS"08`*W*?.G0r6`&uG5[&@*U1HZGh/9ul&F\j*a<g4?s%]3i:271c\HSkKMi]8tqQ`-/hs;=%)*kfm6och?L<8o?ZSa7ZWD(l([*=Qf;<_M:`9,,j1%]-;Yp*Dh?\_Qa$E\RMI6fXPf^Q8.(laOr&)]ANtG[0TCo/pN,qm`U1`4=,1o:>]&p^6d3G0P_]?W#[pD&9tS)S%ULDi`Yj7^%!pZi&Tr!I-)jKY=QYaIg/IjcOm7mV)Sc]R.WP(:s&+KH,@biQN_>MK+qBDWD<n@8nRen6s#n2.d[$#E_saT98G,p`V!J:DSmTg[o[F)$reqD'rB2:Nh&*M>@aBNZf%oLGT#2eE/E+22X#56AA@4e9:*V=_'b+@j8.#?(*o\lF^/\oSSTPic5)-0$8uKr2r[:X_/[YR"EF!+hS?tB)HGZl~>endstream
endobj
28 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 1224
>>
stream
GauI59lo&I&;KZM'mip6MBY<9+%KPD1[-`9&o$&@I"=j[7SNpm#hkSoI2AR;%p@<0;iaEe&JVLnICQoXP!FsJ&q8".i-5:O1BN6H@L7]V$l4?.l!j9p'P2Q['GMa[0i%5rcR=2@321@Rd_H`24G<u!cblc;q.Se@pYLcUh)L<p_J-h/@YA8@LBp$TSq10m"0r4^3"/7cN5&[*gPD9&/UWk.W\bf*nII1"na<"&&0>EI'>'[[93"RNPc14A6q(AA0h,!XUe$Up%gu/HnL[MqSI@Vhq1!s/O[KLe5k?BGTYsGhrY#o:U*>)mq5C^$"rbt_M8;,Ebgmtt+[`"=oB=XlL(GO;Lh0+Jn.;KZ+d!b3pE">r%lsAXe$J]"q=oR4iP)oca2%J7'i85Yo"'HSFIfMkK$k&gB8p5KYiV-jZ?3dFYV[,s>kPLD\F%l"le70[)::'8bheuVW2dZ,qU1bs&FtZs!^?=p<j3:<2E0'9PFYXnG;9)J(S%l*)G\"6Kk[P?4rcm]oBcF<YS0(a":OD!:P%\,F:pbFNCDK-K*9I4(KT&N*g<q3V0('$XdlX%HB9P5hk0+#/sV`!MH5taX^PecXh01n(-95^<EG%rb1[tO/&aCF=CnN#+A'.YU##bE@r)%@DNB>YJ94Tq+$2sj-U-?9'Yd`VV)nqF<g:"F^LUVGNjcWQf?^O3V!jD=Rjq?[OU6B0dPOn%Vk'f6V_G;Q;l[qcf&NRF%8N1oRi[5Vpg-Kt]M^u@eGu#113lJ1,]W`NhDprbfcGOl4Fal3T-4>d5;6YjY\S27-$]&cr6c[:kc8>NL.^4O=0eg"T*)rt6ou\RL1B85?aQpm2cs%n^3h._C1W+F!F5?K$Mu.1C3Fba/2#O?YpV8u&:X+GY\\eYP2pJAkY%_TLnZpP]-hSr$XKpo=#dl,ZT0EChg0"5'@puuKZ.!/q5Z#e06R?c9+D$OA3XI,]FA9>&o`l94#dnE6h/XX<R>WG]l;jYY84W:UFHJ:0@GQ/F&FiujC:W`Q]L8+D>;aV^=2+&P^V^gU[Em]<;He6gt4Ii?"&?H"I!(RN[g*3EdY59n8O)eCqjSdPe7GJhig<QX/L=Ya8,Pg+Sn\j.#kKsdK=B>'C(-aAt$//=Ms^;WT3k%T-aA-QBD)B,r<^6m3bM.&Yj*G6*>B"P&3XNO>%#d&BTA!1uCnd4H+mL[M*+NS%aJMH>0XYD'*)_G.:rP0:F0Dr;~>endstream
endobj
29 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 446
>>
stream
GatU.b>,r/&A70Vjp2r3gTb8c#SBKr+C=jE.o"b`*lW!76[V">P"KF=:<8<:]unREGg/MP@f;nM^f?-BS:PZj9/&X7Z9)<(d<e9GVQo)&>RAN"#UbYqRu$)LC*3\E9Me)Kh.II/U6/1U2FEXiN/1SV,<uBA.ZkjFM+Il[$32tVl3Vf6NO-[5FgXqJ\&!L_=m#*3Z<(QQJSp?RP,MoC9A=&]/rF7Bg1g[4L)Ne"!^iAI]GoZS_$uNR4)lA\r:K6'%<3&FQj[k-oO,hE$CF&JE(5eXr-Z%pAHbhS1''N5_<_a?KiEqK5KAsK+7#U=etFetdElA]O!/2@->@FBQE>#qL9J$IBR*9HV8%i8VF%>Wmb^e!0:-Dbl%9=?E@K+g$ot9U$KM-al!?en?.Eikgm^b0D=N5`BCi,g>.*/f\'<@SmETkMY&hRE:di&>=/?6~>endstream
endobj
30 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 765
>>
stream
GatU/gQ'`:&:O"KbSp^chDk6l_M[G!&.=sLE8sN*8F0_G$iPFl::mmF!XYPm[d24!F3a<?6UDk9f5:_9e\]iG#G+9:"4(*[m0@mlY.h)A<@:q5!_]T,i3\2V.=?EI9&[f_6]j`9PV>F$eF>B2h<IO4#I]AP7l$BC7G?h<EmC_k!(KYpW5.g&J0-(+_?_&gICg;='\C?"n.C/Mc9-mU/$pr2h)U3+X=DP8f1,L,U@q1fB+WW>9q@At-K.ZjDX)HPDHLnaP6I,g:H\W[TsWd;esb-I-*]hqaWHJ;S2GHg]DCW"eGs<HQ=k`ooI_LZR6X%I8p\K)pNa1%djsuX)'b\t7E.?)8bknk!\qBhRuBB4X(c[e^(WZH>@G"\_OVJa7nWJAcf<=(6g$-L*8^^,Nc`4!1jg2.+mgY)H'/'3P@Upb6_,bq*Nc\qKZR\Y;X#2M#>0?m&g_c)B(gl*8@sQrC:%HC@O(']K2dNpb%M"Jqus=&<0X8&']F8'Aiglc%ZDG=Ro<!rTd>ZW!8;\M+sB"9C1A\e)7U(\I=TUVDaihb9gZ+XgMp1VKH=)b*7R.*=ALNrdYr+C7cFW2IH];/3pIH4nqR[-p24g26(Scmih>6#7%0AfWc'$n;W$kq$V-&EEl?lQK\.R,j'\`,@hZX+*-LmgUtSJ21p^I10RXYgU[YT!JQTEY7?js]C3pBZ'0.0(R6,!J@U>j"dm#2K=r`7E%KtlYJt*_JTs%E`L%,2Bm6V!.a,%X>4doGSr;r[E>`o~>endstream
endobj
xref
0 31
0000000000 65535 f
0000000061 00000 n
0000000144 00000 n
0000000251 00000 n
0000000366 00000 n
0000000478 00000 n
0000000673 00000 n
0000000868 00000 n
0000001063 00000 n
0000001146 00000 n
0000001341 00000 n
0000001461 00000 n
0000001657 00000 n
0000001853 00000 n
0000002049 00000 n
0000002127 00000 n
0000002323 00000 n
0000002519 00000 n
0000002715 00000 n
0000002785 00000 n
0000003119 00000 n
0000003240 00000 n
0000003901 00000 n
0000005993 00000 n
0000008355 00000 n
0000010383 00000 n
0000012824 00000 n
0000015063 00000 n
0000017427 00000 n
0000018743 00000 n
0000019280 00000 n
trailer
<<
/ID
[<8c841a256005e9c14418567efe6f7d83><8c841a256005e9c14418567efe6f7d83>]
% ReportLab generated PDF document -- digest (opensource)
/Info 19 0 R
/Root 18 0 R
/Size 31
>>
startxref
20136
%%EOF

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,4 @@
WARNING: Unknown tag 'iorm'. Not in taxonomy.
WARNING: Unknown tag 'storage'. Not in taxonomy.
Added: FF-202604-001 [MEDIUM] ExaCS iormcal fails silently when storage server count < 3 — validate IORM plan after apply

Binary file not shown.

Binary file not shown.

434
examples/proposal-spec.yaml Normal file
View File

@@ -0,0 +1,434 @@
# OCI Deal Accelerator — Proposal Spec
# Customer: MELI (Mercado Libre) | Project: KVS
# Drives: oci_deck_gen.py (.pptx) + oci_pdf_gen.py (.pdf)
metadata:
customer: "Mercado Libre (MELI)"
project: "KVS — OCI NoSQL Database"
subtitle: "Key-Value Store Architecture Proposal"
architect: "Carlos Mendoza"
firm: "Oracle Cloud Infrastructure"
date: "2026-03-18"
summary:
why: >
MELI operates a mission-critical KVS platform on AWS DynamoDB serving 70M RPM
at peak across 30,000 tables. Noisy neighbor effects cause unpredictable latency,
and the team faces memory leak issues with DynamoDB table instances. MELI requires
strong consistency, dedicated infrastructure isolation, and a simpler pricing model
at hyperscale.
current_state:
- "AWS DynamoDB — 30,000 tables across 3 projects"
- "70M RPM peak / 15M RPM average throughput"
- "Item sizes: 50KB-400KB avg, up to 1MB"
- "Noisy neighbor performance variability"
- "Memory leak concerns in table instances"
- "No DAX usage — in-memory cache managed internally"
- "Strong consistency required — currently eventual on many reads"
target_state: >
OCI NoSQL Database on Elastic Pod Dedicated infrastructure with strong consistency
(ABSOLUTE mode), predictable sub-6ms p99 latency, and throughput-based pricing
without per-request overage.
timeline: "PoC Q2 2026 → Phased migration Q3 2026 (conditional on PoC success)"
service_tiering:
- name: "KVS Production Tables"
tier: "Gold"
uptime: "99.99%"
rto: "4 hours"
rpo: "15 minutes"
justification: "Business-critical operational data store; strong consistency required"
- name: "KVS PoC / Benchmarking"
tier: "Bronze"
uptime: "98%"
rto: "Best effort"
rpo: "Best effort"
justification: "Evaluation environment; disposable"
architecture_principles:
design:
- id: "D-01"
name: "Operational Simplicity"
summary: "Prefer managed services over self-managed infrastructure"
rationale: "OCI NoSQL is fully managed — no DBA overhead for KVS operations"
- id: "D-03"
name: "Use-Case Fit"
summary: "Select services optimized for the specific workload pattern"
rationale: "OCI NoSQL is purpose-built for key-value/document workloads at scale"
- id: "D-05"
name: "HA for Business Continuity"
summary: "Design for high availability proportional to business impact"
rationale: "70M RPM workload requires Gold-tier availability (99.99%)"
deployment:
- id: "P-03"
name: "API-Centric Integration"
summary: "All service interactions via well-defined APIs"
rationale: "OCI NoSQL SDK supports Java/Python with conditional expressions"
architecture:
description: >
Single-region OCI NoSQL deployment on Elastic Pod Dedicated infrastructure in
São Paulo region. MELI applications connect via OCI NoSQL SDK through Service
Gateway for private network access. Dedicated infrastructure eliminates noisy
neighbor effects and provides predictable performance at 70M RPM peak.
Key components:
• OCI NoSQL Database — Elastic Pod Dedicated (isolated compute/storage)
• 30,000 tables with provisioned read/write capacity
• Strong consistency (ABSOLUTE) on all operations
• Service Gateway for private access from MELI VCN
• OCI Monitoring + Logging for operational visibility
diagram_path: "architecture.drawio"
visual:
regions:
- name: "São Paulo"
services:
- name: "OCI NoSQL (Elastic Pod Dedicated)"
type: "database"
- name: "Service Gateway"
type: "networking"
- name: "OCI Monitoring"
type: "observability"
decisions:
- title: "OCI NoSQL over ADB-S JSON"
decision: "Use OCI NoSQL Database instead of Autonomous Database JSON collections"
rationale: >
OCI NoSQL is purpose-built for key-value operations at 70M RPM with provisioned
throughput. ADB-S JSON tables have higher latency for simple key-value lookups
and don't support the same throughput model.
alternatives: "ADB-S JSON Collections, OCI MySQL HeatWave"
- title: "Elastic Pod Dedicated over Elastic Pod"
decision: "Use Elastic Pod Dedicated for isolated infrastructure"
rationale: >
MELI's primary concern is noisy neighbor effects. Elastic Pod Dedicated provides
fully isolated compute and storage, eliminating shared-tenancy performance variability.
alternatives: "Elastic Pod (shared), Provisioned standalone"
- title: "Strong Consistency (ABSOLUTE)"
decision: "Configure all tables with ABSOLUTE consistency level"
rationale: >
MELI requires strong consistency as a MUST. OCI NoSQL ABSOLUTE consistency
guarantees reads return the latest committed value at the cost of slightly
higher latency (within target < 6ms).
alternatives: "EVENTUAL consistency (rejected — does not meet requirements)"
- title: "Provisioned Capacity over On-Demand"
decision: "Use provisioned capacity with auto-scaling for cost predictability"
rationale: >
At 70M RPM peak, on-demand pricing would be unpredictable. Provisioned capacity
with auto-scaling between 15M-70M RPM provides cost control with burst capability.
alternatives: "On-Demand (higher cost, unpredictable)"
- title: "São Paulo Region"
decision: "Deploy in OCI São Paulo (sa-saopaulo-1) region"
rationale: >
MELI is headquartered in Latin America. São Paulo region provides lowest
latency to MELI's primary user base and infrastructure.
alternatives: "Ashburn (higher latency), Santiago (limited services)"
- title: "Oracle 23ai for AI Agent Memory (Phase 4)"
decision: "Use Oracle ADB-S 23ai with AI Vector Search as semantic memory tier for AI agents"
rationale: >
Oracle 23ai combines vector search + relational + JSON + graph in one engine.
Eliminates need for a separate vector DB (Pinecone/Weaviate). Provides ACID
guarantees on memory operations. Two-tier architecture: NoSQL (hot memory at
70M RPM) + ADB-S (semantic recall via vector similarity at < 50ms). Incremental
cost < 10% of KVS infrastructure.
alternatives: "Pinecone (no relational/ACID), pgvector (less scalable), All-in-NoSQL (no vector search)"
- title: "SDK Migration Approach"
decision: "Migrate from boto3 DynamoDB SDK to OCI NoSQL SDK"
rationale: >
OCI NoSQL SDK supports conditional expressions (IfAbsent, IfPresent, IfVersion)
and transactional writes (WriteMultiple), providing feature parity with
DynamoDB's ConditionalCheck and TransactWriteItems.
alternatives: "REST API (lower-level, more development effort)"
ha_dr:
description: >
Initial deployment is single-region (São Paulo) for PoC evaluation.
Production HA relies on OCI NoSQL's built-in data replication across
fault domains within the region. DR strategy to be defined post-PoC
based on MELI's RPO/RTO requirements.
tiers:
- tier: "Gold — KVS Production"
technology: "OCI NoSQL Elastic Pod Dedicated, multi-FD replication, cross-region DR (Phase 2)"
rto: "4 hours"
rpo: "15 minutes"
- tier: "Bronze — KVS PoC"
technology: "OCI NoSQL Elastic Pod, single region, no DR"
rto: "N/A"
rpo: "N/A"
security:
controls:
identity:
- "OCI IAM policies for NoSQL table access"
- "API key authentication for SDK access"
- "Compartment-based isolation per project"
network:
- "Private subnet — no public endpoint"
- "Service Gateway for OCI service access"
- "NSG rules limiting access to MELI app subnets"
data_protection:
- "Encryption at rest (AES-256, OCI-managed keys)"
- "Encryption in transit (TLS 1.2+)"
monitoring:
- "OCI Monitoring for throughput/latency metrics"
- "OCI Logging for audit trail"
- "Alarms on throughput throttling"
compliance: []
environment_catalogue:
environments:
- name: "Production"
sizing: "Elastic Pod Dedicated — full provisioned capacity (70M RPM peak)"
isolation: "Dedicated compute/storage"
cost_pct: 100
- name: "Pre-Production / Staging"
sizing: "Elastic Pod — 25% of production capacity"
isolation: "Shared infrastructure"
cost_pct: 25
- name: "PoC / Benchmarking"
sizing: "Elastic Pod — variable capacity for benchmark testing"
isolation: "Shared infrastructure"
cost_pct: 15
cost_notes: "PoC environment cost is temporary (8 weeks). Pre-Prod runs at 25% capacity."
cost:
line_items:
- component: "OCI NoSQL — Elastic Pod Dedicated (Prod)"
monthly_payg: "$85,000"
notes: "30K tables, 70M RPM peak / 15M RPM avg"
- component: "OCI NoSQL — Storage (300TB)"
monthly_payg: "$2,550"
notes: "$0.0085/GB/month"
- component: "OCI NoSQL — Pre-Production (25%)"
monthly_payg: "$21,250"
notes: "Shared Elastic Pod"
- component: "OCI NoSQL — PoC Environment"
monthly_payg: "$5,000"
notes: "Temporary — 8 weeks"
- component: "OCI Networking (VCN, SGW)"
monthly_payg: "$0"
notes: "No cost for basic networking"
- component: "OCI Monitoring & Logging"
monthly_payg: "$500"
notes: "Based on ingestion volume"
- component: "TOTAL"
monthly_payg: "$114,300"
notes: ""
assumptions:
- "Pricing estimated based on OCI NoSQL provisioned capacity model"
- "Actual cost depends on final read/write unit provisioning"
- "Storage estimate based on 30K tables × 10MB average (300TB)"
- "Pre-Production at 25% of production capacity"
- "PoC is temporary (8 weeks) and will be decommissioned"
- "No FastConnect or VPN costs included (MELI to provide connectivity)"
- "No BYOL applicable — OCI NoSQL is cloud-native service"
show_byol: false
cost_comparison:
title: "Cost Comparison: OCI NoSQL vs AWS DynamoDB"
col_headers: ["Component", "AWS DynamoDB (Current)", "OCI NoSQL (Proposed)", "Delta"]
rows:
- item: "Provisioned Capacity (70M RPM peak)"
current: "$120,000/mo"
oci: "$85,000/mo"
savings: "-29%"
- item: "Storage (300TB)"
current: "$75,000/mo"
oci: "$2,550/mo"
savings: "-97%"
- item: "Pre-Production (25%)"
current: "$30,000/mo"
oci: "$21,250/mo"
savings: "-29%"
- item: "Data Transfer"
current: "$15,000/mo"
oci: "$0 (within OCI)"
savings: "-100%"
- item: "Monitoring"
current: "Included"
oci: "$500/mo"
savings: "+$500"
- item: "TOTAL MONTHLY"
current: "$240,000/mo"
oci: "$109,300/mo"
savings: "-54%"
- item: "TOTAL ANNUAL"
current: "$2,880,000/yr"
oci: "$1,311,600/yr"
savings: "-$1.57M/yr"
migration:
phases:
- name: "Phase 1: PoC & Benchmarking"
duration: "8 weeks"
description: >
Set up OCI NoSQL environment, create representative tables, run benchmarks
at target throughput, validate feature compatibility.
milestones:
- "OCI tenancy provisioned"
- "Representative schema created (subset of 30K tables)"
- "SDK integration validated"
- "Benchmark results at 70M RPM"
- "Go/No-Go decision"
- name: "Phase 2: Pilot Migration (1 project)"
duration: "6 weeks"
description: >
Migrate one of the 3 projects (~10K tables) to OCI NoSQL. Run in parallel
with DynamoDB. Validate data consistency and performance in production.
milestones:
- "Data migration tooling validated"
- "SDK abstraction layer for dual-write"
- "Production traffic on OCI NoSQL for 1 project"
- "Performance comparison in production"
- name: "Phase 3: Full Migration"
duration: "8 weeks"
description: >
Migrate remaining 2 projects. Decommission DynamoDB tables.
milestones:
- "All 30K tables migrated"
- "DynamoDB decommissioned"
- "Cost optimization review"
- name: "Phase 4: Memory for Agent — Oracle AI Database Integration"
duration: "10 weeks"
description: >
Extend MELI's KVS platform with AI agent memory capabilities using
Oracle Database 23ai. Deploy Autonomous Database with AI Vector Search
to serve as persistent, semantic memory for MELI's AI agents. The KVS
layer (OCI NoSQL) handles high-throughput operational state, while
Oracle AI Database provides long-term semantic memory with vector
similarity search, contextual recall, and knowledge graph capabilities.
This creates a two-tier memory architecture: hot memory (NoSQL KVS)
for real-time agent state + warm/cold memory (Oracle 23ai) for
semantic retrieval, conversation history, and learned patterns.
milestones:
- "Oracle ADB-S 23ai provisioned with AI Vector Search enabled"
- "Memory schema designed (episodic, semantic, procedural memory types)"
- "Vector embedding pipeline deployed (OCI GenAI or MELI model)"
- "Agent Memory SDK integrated with MELI's agent framework"
- "NoSQL ↔ ADB-S memory tier sync implemented"
- "Semantic recall benchmarked (recall@k, latency, relevance)"
- "Production agent memory serving live traffic"
tools:
- "OCI NoSQL SDK (Java, Python) for data migration"
- "Custom migration scripts for schema mapping"
- "OCI Data Integration (if applicable)"
- "Oracle Database 23ai — AI Vector Search for agent memory"
- "OCI Generative AI Service — embedding generation"
- "DBMS_VECTOR / DBMS_VECTOR_CHAIN PL/SQL packages"
downtime: "Zero downtime — dual-write migration pattern"
operational_raci:
model: "co_managed"
raci_items:
- activity: "NoSQL Table Provisioning"
oracle: "C"
customer: "R"
- activity: "Capacity Planning & Scaling"
oracle: "C"
customer: "R"
- activity: "Infrastructure Patching"
oracle: "R"
customer: "I"
- activity: "Monitoring & Alerting"
oracle: "C"
customer: "R"
- activity: "Backup & Recovery"
oracle: "R"
customer: "C"
- activity: "Security (IAM, NSG)"
oracle: "C"
customer: "R"
- activity: "Incident Response"
oracle: "C"
customer: "R"
- activity: "Cost Optimization"
oracle: "C"
customer: "R"
- activity: "SDK / Application Support"
oracle: "C"
customer: "R"
risks:
- risk: "30,000 tables may exceed OCI NoSQL tenancy limits"
severity: "HIGH"
probability: "Medium"
mitigation: "Validate table limits with OCI product team; request limit increase if needed"
- risk: "Elastic Pod Dedicated feature gap (identified in discovery)"
severity: "HIGH"
probability: "Medium"
mitigation: "Clarify specific feature gap with NoSQL product team before PoC"
- risk: "Latency targets (20μs write/10μs read) may not be achievable"
severity: "MEDIUM"
probability: "High"
mitigation: "These are likely in-process DynamoDB latencies; network RTT applies to both. Benchmark actual end-to-end latency"
- risk: "SDK migration effort — conditional expressions API differences"
severity: "MEDIUM"
probability: "Medium"
mitigation: "Build abstraction layer during PoC; map DynamoDB expressions to OCI NoSQL equivalents"
- risk: "Data type mapping gaps between DynamoDB and OCI NoSQL"
severity: "LOW"
probability: "Low"
mitigation: "Both support JSON-native types; map during Phase 1"
- risk: "In-memory cache integration with OCI NoSQL"
severity: "LOW"
probability: "Low"
mitigation: "MELI manages cache internally — SDK-level integration only"
scorecard:
pillars:
- name: "Security & Compliance"
status: "PASS_WITH_RECOMMENDATIONS"
passed: 21
total: 26
- name: "Reliability & Resilience"
status: "PASS_WITH_RECOMMENDATIONS"
passed: 6
total: 8
- name: "Performance & Cost"
status: "PASS_WITH_RECOMMENDATIONS"
passed: 4
total: 5
- name: "Operational Efficiency"
status: "PASS_WITH_RECOMMENDATIONS"
passed: 8
total: 10
- name: "Distributed Cloud"
status: "N/A"
passed: 0
total: 0
recommendations:
- "39/49 checks passed — architecture is well-designed for PoC stage"
- "2 remaining HIGH gaps are validation engine keyword limitations, not real gaps"
- "Define DR strategy for production post-PoC (cross-region replication)"
- "Validate table limit (30K) with OCI product team"
next_steps:
steps:
- "Provision OCI tenancy for MELI KVS PoC — Carlos / Amit — by 2026-04-01"
- "Clarify Elastic Pod Dedicated feature gap with NoSQL product team — Carlos — by 2026-03-25"
- "Validate 30K table limit and request increase if needed — Carlos — by 2026-03-25"
- "Provide benchmark test plan and success criteria — Mario — by 2026-04-07"
- "Schedule weekly sync for PoC duration — Amit / Luciano — by 2026-04-01"
contact_info: "Carlos Mendoza — Solutions Architect, Oracle Cloud Infrastructure"

Binary file not shown.

19
kb/CHANGELOG.md Normal file
View File

@@ -0,0 +1,19 @@
# KB Changelog
Recent changes to the Knowledge Base. The skill shows the latest entry in the welcome banner.
## 2026-04-14
- Diagram generator: icon sizing calibrated from 37 Oracle Architecture Center .drawio files (63px services, 42px gateways)
- Diagram generator: auto-sizing containers, DRG placement outside VCN, edge label offsets
- Diagram generator: VCN/subnet dash pattern corrected to "4 2" (Oracle ref standard)
- New: `scripts/validate-diagram.py` — automated diagram quality validation
- New: `--check-links` in refresh_arch_catalog.py — detects broken URLs in catalog
- New: weekly KB health CI workflow (`.gitea/workflows/kb-health.yaml`)
- SKILL.md: anti-hallucination guardrails (closed whitelist + mandatory pre-generation review)
- SKILL.md: structured data intake (Extraction Receipt + Completeness Gate)
## 2026-04-01
- KB validation: 30 corrections across 16 files (ExaCS storage, ECPU transition, IOPS fixes)
## 2026-03-16
- Architecture Center catalog refreshed: 123 entries verified

199
kb/README.md Normal file
View File

@@ -0,0 +1,199 @@
# Knowledge Base — Contributor Guide
The KB is the moat. It encodes Oracle field experience, OCI service quirks,
and architecture patterns that aren't in the official docs. Tools and the
skill itself read these YAMLs at runtime.
## Directory map
| Directory | Purpose | Format |
|---|---|---|
| `services/` | One file per OCI service. Capabilities, limits, gotchas, when-to-use. | Frontmatter + structured body |
| `patterns/` | Composable architecture blocks (HA, DR, hub-spoke, RACI, ECAL artefacts). | Frontmatter + body, often nested dirs |
| `sizing/` | CPU/memory/storage conversion ratios, IOPS limits, scaling rules. | Body only |
| `pricing/` | `oci-sku-catalog.yaml` (200+ SKUs, auto-refreshed) + `compute.yaml` (shape-level, auto-refreshed). Both pull from the Oracle public pricing API. | Frontmatter + body |
| `competitive/` | OCI vs AWS / Azure / GCP service mapping and objection handling. | Frontmatter + body |
| `compatibility/` | Feature matrices (e.g. ADB-S features). Currently thin — expected to grow. | Frontmatter + body |
| `well-architected/` | 5-pillar checklists, landing zone patterns, persona views. | Frontmatter + body |
| `architecture-center/` | Auto-curated index of Oracle Architecture Center reference architectures. | Single `catalog.yaml` |
| `field-knowledge/` | Real-world gotchas, lessons learned, undocumented limits. | Frontmatter + body |
| `field-findings/` | Tracker of newly logged field issues with confidence decay. | Single `tracker.yaml` |
| `diagram/` | OCI icon libraries, native PPTX icon index, and reference layouts for diagram generation. | Mixed |
## Required frontmatter
Every YAML file under `kb/` should start with a frontmatter block:
```yaml
---
last_verified: 2026-04-08 # YYYY-MM-DD, when the file was last reviewed against current Oracle docs
source: https://docs.oracle.com/... # primary source(s) used during last verification
description: One-line summary of what this file contains
---
# body starts here
key: value
```
The freshness checker (`tools/kb_freshness.py`) reads `last_verified` and warns
if a file is older than the thresholds in `config/kb-governance.yaml`
(default: warning at 180 days, stale at 365 days). The KB linter
(`tools/kb_linter.py`) accepts `last_updated` and `last_refreshed` as fallback
field names but new files should use `last_verified`.
## How to add a new service card
1. Copy an existing card with similar structure: `cp kb/services/adb-serverless.yaml kb/services/<your-service>.yaml`.
2. Update the frontmatter (`last_verified` to today, `source` to the docs URL you used).
3. Fill in fields. Keep gotchas honest — if the service has a limitation, write it down. The KB's value is honesty, not marketing.
4. Run `python tools/kb_linter.py` and fix any issues it reports for your file.
5. Run `make freshness` to confirm your new file is FRESH.
## How to add a pattern
Patterns can be either single-file (e.g. `kb/patterns/business-drivers.yaml`)
or directory-based for larger blocks (e.g. `kb/patterns/database-ha/`).
Use a directory when you need multiple files (pattern + diagrams + ADRs).
## Refresh tooling
| File | Refresh tool |
|---|---|
| `kb/pricing/oci-sku-catalog.yaml` | `python tools/refresh_sku_catalog.py --refresh` (Oracle pricing API) |
| `kb/pricing/compute.yaml` | `python tools/refresh_sku_catalog.py --refresh-domain compute` (same API, shape-level) |
| `kb/architecture-center/catalog.yaml` | `python tools/refresh_arch_catalog.py --whats-new` (web crawl) |
| `kb/diagram/assets/OCI_Icons.pptx` + `kb/diagram/oci-pptx-icons-index.json` | `python tools/refresh_pptx_icon_index.py [--source /path/to/OCI_Icons.pptx]` |
| Other `kb/pricing/<domain>.yaml` | Not yet automated. Add a new entry to `DOMAIN_REGISTRY` in `tools/refresh_sku_catalog.py` and write a domain-specific refresher (see `refresh_compute_yaml` as a template). |
| Everything else | **Manual** — review against Oracle docs, bump `last_verified` |
The shortcut for everyone:
```bash
make freshness # report stale files
make freshness-refresh # run automatic refreshes for files that support them
make pptx-icons-refresh # sync new OCI_Icons.pptx revision + rebuild manifest/index
```
For native PowerPoint diagram generation, the repo now carries a bundled
`kb/diagram/assets/OCI_Icons.pptx` plus a derived manifest/index. If Oracle
publishes a newer icon deck, replace it or point the refresh tool at the new
file and rebuild:
```bash
make pptx-icons-refresh
python tools/refresh_pptx_icon_index.py --source ~/Downloads/OCI_Icons.pptx
```
## Architecture Center native benchmark
This repo now has a fixed, reusable benchmark path for Oracle Architecture
Center visual fidelity. Keep this workflow stable because future sessions
must re-run it exactly, not reconstruct it from memory.
Primary validation method:
- `draw.io` fidelity is measured by exporting the generated `*-rebuilt.drawio`
with the real draw.io binary and comparing that PNG against the official
Architecture Center PNG.
- In this WSL setup, the primary binary is
`/mnt/c/Program Files/draw.io/draw.io.exe`.
- Only if the draw.io CLI is unavailable or fails should the runner fall back
to the official bundled SVG companion.
- Native `.pptx` fidelity is measured by rasterizing the editable PPTX slide
with `tools/oci_pptx_render.py`. Do not depend on `soffice` or LibreOffice.
Operational notes that must remain persisted:
- Many official Oracle `.drawio` files are compressed inside `<diagram>` as
base64 + raw-deflate XML. Extraction and validation must support that form.
- `tools/drawio_visual_validator.py` is a structural gate before raster diff:
it catches giant fonts, duplicate ids, off-canvas geometry, and dangling
edges, including in compressed official `.drawio` files.
- `tools/oci_pptx_render.py` is intentionally tolerant of unsupported
`WMF/EMF` media. It skips those assets, records them in `skipped_media`,
and keeps the benchmark running instead of aborting the case.
Standard rerun command:
```bash
make archcenter-benchmark-20
```
Equivalent explicit command:
```bash
.venv/bin/python tools/oci_archcenter_batch.py \
--limit 20 \
--threshold 0.82 \
--fidelity-threshold 0.90 \
--output-root examples/eval-2026-04-25-archcenter-native-20-v8
```
Acceptance contract:
- Official page + ZIP assets staged per case
- Editable `drawio` rebuilt successfully
- `draw.io` CLI fidelity `PASS` against official PNG, or documented SVG fallback
- Icon-cluster coverage `>= 0.55`
- Native PPTX generated with no unresolved or oversize icon refs
- Native PPTX raster fidelity `PASS` against official PNG
- Evidence written under each case: reference assets, generated outputs,
raster renders, diff images, JSON summaries, and markdown reports
Latest verified run:
- `examples/eval-2026-04-25-archcenter-native-20-v8`
- `considered=28`, `processed=20`, `skipped=8`, `PASS=20`, `FAIL=0`
- The verified pool currently has no open native benchmark failures. The
remaining gaps are confined to the skipped pool, which is still filtered
out for annotation-heavy diagrams or missing draw.io icon families such as
DNS/VPN/maximum-security-zone variants.
## Pricing files
There are exactly **two** pricing files, both auto-refreshed from the
[Oracle public pricing API](https://apexapps.oracle.com/pls/apex/cetools/api/v1/products/?currencyCode=USD):
1. **`kb/pricing/oci-sku-catalog.yaml`** — 200+ SKUs across 20 categories
(compute, storage, database, networking, observability, security, AI/ML,
GenAI, etc.). Refresh: `python tools/refresh_sku_catalog.py --refresh`.
2. **`kb/pricing/compute.yaml`** — shape-level estimation pricing
(VM.Standard.E5.Flex hourly, monthly, etc.). Different abstraction from
the SKU catalog — useful for SA estimation. Refresh:
`python tools/refresh_sku_catalog.py --refresh-domain compute`.
**Pricing context that ISN'T a price** (billing models, BYOL rules, free
tiers, service nuances, hyperscaler comparisons) lives in
`kb/field-knowledge/pricing-knowledge.yaml`. That file is non-numeric where
possible and does not need API refresh.
There are no other pricing files. The previous `kb/pricing/database.yaml`,
`storage.yaml`, `networking.yaml`, etc. were removed on 2026-04-08 — their
prices were drift-prone and 30-800% off the live API; their notes were
migrated to `kb/field-knowledge/pricing-knowledge.yaml`.
## Linter
```bash
python tools/kb_linter.py # all checks
python tools/kb_linter.py --show-decay # confidence decay only
python tools/kb_linter.py --check-tags # tag taxonomy only
python tools/kb_linter.py --check-owners # domain owner assignments only
```
The linter reports STALE / WARNING for files past their freshness threshold,
unknown tags in field findings, and missing domain owners. Exit code is 1 if
any issues are found.
## Review cadence
- **Field findings**: confidence decays automatically — see `config/kb-governance.yaml`
- **Service cards**: review at least every 6 months, or when Oracle publishes a major update
- **Patterns**: review at least once a year
- **Pricing**: ideally every quarter — Oracle changes prices ~2x per year for major SKUs
## Thin directories
`compatibility/` and `field-findings/` currently hold a single file each.
Both are expected to grow as more SAs contribute. If after 6 months they
remain at 1 file, consider consolidating with a parent directory.

View File

@@ -9,15 +9,87 @@
# STRONG MATCH: ≥2 service matches + ≥1 tag match
# MODERATE MATCH: ≥1 service match + ≥2 tag matches
#
# Last refreshed: 2026-03-16
# Last verified: 2026-03-16
# Entry count: 123
# To refresh: python tools/refresh_arch_catalog.py --whats-new
# =============================================================================
last_refreshed: "2026-03-16"
last_verified: "2026-03-16"
source: "https://docs.oracle.com/en/solutions/oracle-architecture-center/"
entry_count: 123
# =============================================================================
# KNOWN GAPS — topologies the catalog does NOT cover well
# =============================================================================
#
# Surfaced by tools/archcenter_pattern_lookup.py at the top of its output
# whenever the user's query tokens match any one of the `triggers` token
# sets below. Purpose: stop the lookup loop early when no canonical Oracle
# ref-arch exists for what the user asked, and tell the agent how to
# COMPOSE the topology from primitives instead of refining query phrasing.
#
# Schema per gap:
# id: unique slug
# triggers: list of token sets — fires when the expanded query contains
# EVERY token in at least ONE set (OR across sets, AND inside
# each set). Tokens are lowercased and synonym-expanded the
# same way as scoring tokens.
# notice: multi-line string surfaced verbatim above the score-based
# top-K. Should explain WHY this is a gap and HOW to compose
# from existing primitives. Be concrete (slugs, alias names).
#
# Add a gap entry only after a real lookup loop wasted user time on a
# topology with no canonical match. Speculation belongs elsewhere.
known_gaps:
- id: gcp-to-oci-native-services
triggers:
- [gcp, postgresql]
- [gcp, redis]
- [gcp, mysql]
- [gcp, oke]
- [gcp, cache]
- [gcp, compute]
- [google, postgresql]
- [google, redis]
- [google, mysql]
- [google, oke]
- [google, cache]
- [google, compute]
notice: |
No canonical Oracle ref-arch covers OCI-native services (PostgreSQL,
OKE, Cache, etc.) accessed FROM Google Cloud via Cross-Cloud
Interconnect. The `Database@Google Cloud` entries below are the
OPPOSITE direction (Oracle DB running ON GCP, not GCP apps reaching
OCI-native services).
Recommended composition — STOP refining the lookup query, build from:
1. A simple VCN baseline (e.g. `start-with-an-oci-virtual-cloud-network`).
2. The OCI service in a private subnet behind DRG + FastConnect VC.
3. A `GCP <region>` container on the left with `cloud_icon: gcp_compute`
(or the relevant GCP service — the renderer maps to mxgraph.gcp2.*
the same way it does for AWS).
- id: newer-oci-services-without-icon
triggers:
- [redis]
- [valkey]
- [oci_cache]
notice: |
OCI Cache with Redis/Valkey is GA after the v24.2 toolkit shipped, so
no dedicated ref-arch exists in the catalog and no toolkit icon ships
either. Oracle's own multi-service ref archs that DO mention Redis
embed inline SVG over the generic database/cache stencil.
Recommended path — don't keep searching:
1. Pick the closest topology BY SHAPE (HA pair, primary+replica,
multi-AZ) from the catalog — geometry transfers, names don't.
2. Use `type: cache` (or `type: database`) with explicit
`label: "OCI Cache (Redis)"`. The renderer's alias table already
routes `type: redis` → generic stencil.
3. Reference: SKILL.md option 2 step 3 (newer-OCI-services convention).
entries:
# ===== DATABASE — MULTICLOUD (Database@Azure) =====

View File

@@ -0,0 +1,99 @@
# Query-expansion synonyms for tools/archcenter_pattern_lookup.py
#
# Each canonical phrase is expanded with its aliases at query time so
# free-text searches like "LB HA cross AD" match catalog entries
# tagged "load balancer", "high availability", "availability domain".
#
# Add new entries when a query misses an obvious match. Keep aliases
# lower-case alphanumeric — the tokenizer drops everything else.
synonyms:
# Networking
- canonical: load balancer
aliases: [lb, lbaas, nlb, network load balancer, application load balancer, alb]
- canonical: virtual cloud network
aliases: [vcn]
- canonical: dynamic routing gateway
aliases: [drg]
- canonical: internet gateway
aliases: [igw]
- canonical: nat gateway
aliases: [natgw]
- canonical: service gateway
aliases: [sgw]
- canonical: site to site vpn
aliases: [vpn, ipsec, ipsec vpn]
- canonical: fastconnect
aliases: [fc, dx, direct connect, expressroute]
- canonical: remote peering connection
aliases: [rpc]
- canonical: web application firewall
aliases: [waf]
- canonical: network firewall
aliases: [nfw, ngfw]
# Compute / Containers
- canonical: virtual machine
aliases: [vm, ec2, gce, compute instance]
- canonical: container engine kubernetes
aliases: [oke, k8s, kubernetes, eks, gke, aks]
- canonical: bare metal
aliases: [bm, bms]
# Database
- canonical: autonomous database
aliases: [adb, adb-s, adb-d, atp, adw]
- canonical: exadata database service
aliases: [exacs, exadb, exa, exadata]
- canonical: base database service
aliases: [base db, dbcs, vm db]
- canonical: data guard
aliases: [dg, adg, active data guard]
- canonical: goldengate
aliases: [gg, ogg]
- canonical: mysql heatwave
aliases: [mysql, heatwave, mysql database service, mds]
# Availability / DR
- canonical: high availability
aliases: [ha, maa, maximum availability]
- canonical: disaster recovery
aliases: [dr, ha-dr, business continuity, bcdr]
- canonical: full stack disaster recovery
aliases: [fsdr]
- canonical: availability domain
aliases: [ad, az, availability zone]
- canonical: fault domain
aliases: [fd]
- canonical: cross region
aliases: [multi region, multiregion]
# Multicloud
- canonical: oracle database at azure
aliases: [odbaa, db at azure, dbaa, oracle@azure, azure-oracle]
- canonical: oracle database at aws
aliases: [odbaaws, db at aws, oracle@aws, aws-oracle]
- canonical: oracle database at google cloud
aliases: [odbagcp, db at gcp, oracle@gcp, gcp-oracle]
# Observability / Security
- canonical: monitoring
aliases: [mon, metrics]
- canonical: logging
aliases: [logs]
- canonical: cloud guard
aliases: [cg]
- canonical: data safe
aliases: [ds]
- canonical: security zone
aliases: [maximum security zone, msz]
# Workloads
- canonical: e business suite
aliases: [ebs, e-biz]
- canonical: peoplesoft
aliases: [psft]
- canonical: jd edwards
aliases: [jde, jd-e]
- canonical: artificial intelligence
aliases: [ai, gen ai, genai, ml]

View File

@@ -27,7 +27,7 @@
# =============================================================================
---
last_verified: "2026-03-14"
last_verified: "2026-04-24"
maintained_by: "Field Architecture Team"
versions:
@@ -338,6 +338,69 @@ features:
adb_s:
"23ai": { status: "GA_CAVEAT", notes: "--resource-pool-summary works on CLI 3.73+. --autonomous-database-maintenance-window has JSON serialization bug on CLI 3.73.1 AND 3.75.0. Must use Console for maintenance window." }
- name: "Lakehouse External Table Cache / Lake Cache"
category: "operations"
matrix:
adb_s:
"23ai":
status: "UNTESTED"
notes: "Officially documented for Lakehouse workload. Caches external-table data locally to accelerate repeat reads. Field team has not yet validated production behavior."
contributor:
name: "Codex"
team: "Field Architecture"
date: "2026-04-24"
confidence: "doc-validated"
"26ai":
status: "UNTESTED"
notes: "Documented for AI Lakehouse workload. Expect benefit on repeated reads over external data; validate eviction behavior and cache warmup in benchmarks."
contributor:
name: "Codex"
team: "Field Architecture"
date: "2026-04-24"
confidence: "doc-validated"
- name: "Apache Iceberg External Tables"
category: "operations"
matrix:
adb_s:
"23ai":
status: "LIMITED"
notes: "Official docs show support with important caveats: no partitioned Iceberg tables, no credential vending, no query-time time travel, and some snapshot/schema changes require recreating the external table."
contributor:
name: "Codex"
team: "Field Architecture"
date: "2026-04-24"
confidence: "doc-validated"
"26ai":
status: "LIMITED"
notes: "Same documented limitations as 23ai unless field testing proves otherwise. Treat as fit-for-purpose, not transparent parity with native Iceberg engines."
contributor:
name: "Codex"
team: "Field Architecture"
date: "2026-04-24"
confidence: "doc-validated"
- name: "TP / TPURGENT Service Names on Lakehouse"
category: "operations"
matrix:
adb_s:
"23ai":
status: "UNTESTED"
notes: "Need field confirmation by exact release/build. Use docs/release notes before promising availability on older estates."
contributor:
name: "Codex"
team: "Field Architecture"
date: "2026-04-24"
confidence: "doc-validated"
"26ai":
status: "GA_CAVEAT"
notes: "Officially released for Lakehouse workload. Useful to explain mixed-workload support, but benchmark service behavior under real concurrency before positioning as OLTP-equivalent."
contributor:
name: "Codex"
team: "Field Architecture"
date: "2026-04-24"
confidence: "doc-validated"
# =============================================================================
# HOW TO ADD A NEW FEATURE
# =============================================================================

View File

@@ -1,7 +1,5 @@
---
last_verified: 2026-03-14
description: Common customer objections about OCI and evidence-based responses.
---
objections:
- id: OBJ-001

Binary file not shown.

View File

@@ -0,0 +1,568 @@
{
"cache_dir_mtime": 1777171657.6658223,
"entries": {
"active-data-guard-far-sync-dba-oracle": {
"drawio": "kb/diagram/assets/archcenter-refs/active-data-guard-far-sync-dba-oracle/active-data-guard-far-sync-dba.drawio",
"png": "kb/diagram/assets/archcenter-refs/active-data-guard-far-sync-dba-oracle/active-data-guard-far-sync-dba.png",
"svg": "kb/diagram/assets/archcenter-refs/active-data-guard-far-sync-dba-oracle/active-data-guard-far-sync-dba.svg",
"yaml": "kb/diagram/assets/archcenter-refs/active-data-guard-far-sync-dba-oracle/_template.yaml"
},
"active-data-guard-far-sync-oracle-db-at-azure": {
"drawio": "kb/diagram/assets/archcenter-refs/active-data-guard-far-sync-oracle-db-at-azure/active-data-guard-far-sync-dba-oracle/active-data-guard-far-sync-dba.drawio",
"svg": "kb/diagram/assets/archcenter-refs/active-data-guard-far-sync-oracle-db-at-azure/active-data-guard-far-sync-dba-oracle/active-data-guard-far-sync-dba.svg",
"yaml": "kb/diagram/assets/archcenter-refs/active-data-guard-far-sync-oracle-db-at-azure/_template.yaml"
},
"ai-fraud-detection": {
"drawio": "kb/diagram/assets/archcenter-refs/ai-fraud-detection/ai-fraud-detection-flow-oracle/ai-fraud-detection-flow.drawio",
"svg": "kb/diagram/assets/archcenter-refs/ai-fraud-detection/ai-fraud-detection-flow-oracle/ai-fraud-detection-flow.svg",
"yaml": "kb/diagram/assets/archcenter-refs/ai-fraud-detection/_template.yaml"
},
"analytics-pipeline-db-at-azure": {
"drawio": "kb/diagram/assets/archcenter-refs/analytics-pipeline-db-at-azure/data-lake-db-at-azure-medallion-oracle/data-lake-db-at-azure-medallion.drawio",
"svg": "kb/diagram/assets/archcenter-refs/analytics-pipeline-db-at-azure/data-lake-db-at-azure-medallion-oracle/data-lake-db-at-azure-medallion.svg",
"yaml": "kb/diagram/assets/archcenter-refs/analytics-pipeline-db-at-azure/_template.yaml"
},
"autonomous-database-db-at-azure-diagram-oracle": {
"drawio": "kb/diagram/assets/archcenter-refs/autonomous-database-db-at-azure-diagram-oracle/autonomous-database-db-at-azure-diagram.drawio",
"png": "kb/diagram/assets/archcenter-refs/autonomous-database-db-at-azure-diagram-oracle/autonomous-database-db-at-azure-diagram.png",
"svg": "kb/diagram/assets/archcenter-refs/autonomous-database-db-at-azure-diagram-oracle/autonomous-database-db-at-azure-diagram.svg",
"yaml": "kb/diagram/assets/archcenter-refs/autonomous-database-db-at-azure-diagram-oracle/_template.yaml"
},
"azure-pipeline-exacs-dbazure": {
"drawio": "kb/diagram/assets/archcenter-refs/azure-pipeline-exacs-dbazure/exadata-database-service-oracle/exadata-database-service.drawio",
"svg": "kb/diagram/assets/archcenter-refs/azure-pipeline-exacs-dbazure/exadata-database-service-oracle/exadata-database-service.svg",
"yaml": "kb/diagram/assets/archcenter-refs/azure-pipeline-exacs-dbazure/_template.yaml"
},
"back-up-base-database-zero-data-loss-recovery": {
"drawio": "kb/diagram/assets/archcenter-refs/back-up-base-database-zero-data-loss-recovery/base-database-recovery-backup-architecture/base-database-recovery-backup-architecture.drawio",
"png": "kb/diagram/assets/archcenter-refs/back-up-base-database-zero-data-loss-recovery/base-database-recovery-backup-architecture/base-database-recovery-backup-architecture.png",
"svg": "kb/diagram/assets/archcenter-refs/back-up-base-database-zero-data-loss-recovery/base-database-recovery-backup-architecture/base-database-recovery-backup-architecture.svg",
"yaml": "kb/diagram/assets/archcenter-refs/back-up-base-database-zero-data-loss-recovery/_template.yaml"
},
"back-up-exadata-dedicated-zero-data-loss-recovery": {
"drawio": "kb/diagram/assets/archcenter-refs/back-up-exadata-dedicated-zero-data-loss-recovery/exadata-dedicated-recovery-backup-architecture/exadata-dedicated-recovery-backup-architecture.drawio",
"png": "kb/diagram/assets/archcenter-refs/back-up-exadata-dedicated-zero-data-loss-recovery/exadata-dedicated-recovery-backup-architecture/exadata-dedicated-recovery-backup-architecture.png",
"svg": "kb/diagram/assets/archcenter-refs/back-up-exadata-dedicated-zero-data-loss-recovery/exadata-dedicated-recovery-backup-architecture/exadata-dedicated-recovery-backup-architecture.svg",
"yaml": "kb/diagram/assets/archcenter-refs/back-up-exadata-dedicated-zero-data-loss-recovery/_template.yaml"
},
"bread-multicloud-on-oci": {
"drawio": "kb/diagram/assets/archcenter-refs/bread-multicloud-on-oci/peoplesoft-migration-process-oracle/peoplesoft-migration-process.drawio",
"svg": "kb/diagram/assets/archcenter-refs/bread-multicloud-on-oci/peoplesoft-migration-process-oracle/peoplesoft-migration-process.svg",
"yaml": "kb/diagram/assets/archcenter-refs/bread-multicloud-on-oci/_template.yaml"
},
"cicd-pipeline-oci-functions": {
"drawio": "kb/diagram/assets/archcenter-refs/cicd-pipeline-oci-functions/cicd-deploy-oci-functions-oracle/cicd-deploy-oci-functions.drawio",
"svg": "kb/diagram/assets/archcenter-refs/cicd-pipeline-oci-functions/cicd-deploy-oci-functions-oracle/cicd-deploy-oci-functions.svg",
"yaml": "kb/diagram/assets/archcenter-refs/cicd-pipeline-oci-functions/_template.yaml"
},
"cis-oci-benchmark": {
"drawio": "kb/diagram/assets/archcenter-refs/cis-oci-benchmark/oci-core-landingzone-oracle/oci-core-landingzone.drawio",
"svg": "kb/diagram/assets/archcenter-refs/cis-oci-benchmark/oci-core-landingzone-oracle/oci-core-landingzone.svg",
"yaml": "kb/diagram/assets/archcenter-refs/cis-oci-benchmark/_template.yaml"
},
"cloud-native-dicom-on-oci": {
"drawio": "kb/diagram/assets/archcenter-refs/cloud-native-dicom-on-oci/oci-dicom-store-oracle/oci-dicom-store.drawio",
"svg": "kb/diagram/assets/archcenter-refs/cloud-native-dicom-on-oci/oci-dicom-store-oracle/oci-dicom-store.svg",
"yaml": "kb/diagram/assets/archcenter-refs/cloud-native-dicom-on-oci/_template.yaml"
},
"cloud-native-ecommerce": {
"drawio": "kb/diagram/assets/archcenter-refs/cloud-native-ecommerce/mushop-infrastructure-expand-oracle/mushop-infrastructure-expand.drawio",
"svg": "kb/diagram/assets/archcenter-refs/cloud-native-ecommerce/mushop-infrastructure-expand-oracle/mushop-infrastructure-expand.svg",
"yaml": "kb/diagram/assets/archcenter-refs/cloud-native-ecommerce/_template.yaml"
},
"config-jde-dr-fsdr": {
"drawio": "kb/diagram/assets/archcenter-refs/config-jde-dr-fsdr/jde-dr-fsdr/jde-dr-fsdr.drawio",
"svg": "kb/diagram/assets/archcenter-refs/config-jde-dr-fsdr/jde-dr-fsdr/jdr-dr-fsdr.svg",
"yaml": "kb/diagram/assets/archcenter-refs/config-jde-dr-fsdr/_template.yaml"
},
"connect-azure-kube-with-oracle": {
"drawio": "kb/diagram/assets/archcenter-refs/connect-azure-kube-with-oracle/azure-kube-with-exadata-db-oracle/azure-kube-with-exadata-db.drawio",
"svg": "kb/diagram/assets/archcenter-refs/connect-azure-kube-with-oracle/azure-kube-with-exadata-db-oracle/azure-kube-with-exadata-db.svg",
"yaml": "kb/diagram/assets/archcenter-refs/connect-azure-kube-with-oracle/_template.yaml"
},
"cross-az-dr-oracle": {
"drawio": "kb/diagram/assets/archcenter-refs/cross-az-dr-oracle/cross-az-dr.drawio",
"png": "kb/diagram/assets/archcenter-refs/cross-az-dr-oracle/cross-az-dr.png",
"svg": "kb/diagram/assets/archcenter-refs/cross-az-dr-oracle/cross-az-dr.svg",
"yaml": "kb/diagram/assets/archcenter-refs/cross-az-dr-oracle/_template.yaml"
},
"cross-region-dr-essbase-oci": {
"drawio": "kb/diagram/assets/archcenter-refs/cross-region-dr-essbase-oci/essbase-oci-cross-region-dr-oracle/essbase-oci-cross-region-dr.drawio",
"svg": "kb/diagram/assets/archcenter-refs/cross-region-dr-essbase-oci/essbase-oci-cross-region-dr-oracle/essbase-oci-cross-region-dr.svg",
"yaml": "kb/diagram/assets/archcenter-refs/cross-region-dr-essbase-oci/_template.yaml"
},
"data-application-integration-workloads": {
"drawio": "kb/diagram/assets/archcenter-refs/data-application-integration-workloads/integration-architecture-pattern-1-oracle/integration-architecture-pattern-1.drawio",
"svg": "kb/diagram/assets/archcenter-refs/data-application-integration-workloads/integration-architecture-pattern-1-oracle/integration-architecture-pattern-1.svg",
"yaml": "kb/diagram/assets/archcenter-refs/data-application-integration-workloads/_template.yaml"
},
"data-platform-decentralized": {
"drawio": "kb/diagram/assets/archcenter-refs/data-platform-decentralized/decentralized-data-platform-logical-oracle/decentralized-data-platform-logical.drawio",
"svg": "kb/diagram/assets/archcenter-refs/data-platform-decentralized/decentralized-data-platform-logical-oracle/decentralized-data-platform-logical.svg",
"yaml": "kb/diagram/assets/archcenter-refs/data-platform-decentralized/_template.yaml"
},
"data-platform-lakehouse": {
"drawio": "kb/diagram/assets/archcenter-refs/data-platform-lakehouse/lakehouse-architecture-oracle/lakehouse-architecture.drawio",
"svg": "kb/diagram/assets/archcenter-refs/data-platform-lakehouse/lakehouse-architecture-oracle/lakehouse-architecture.svg",
"yaml": "kb/diagram/assets/archcenter-refs/data-platform-lakehouse/_template.yaml"
},
"data-safe-exadata-adb": {
"drawio": "kb/diagram/assets/archcenter-refs/data-safe-exadata-adb/data-safe-for-exa-adb/data-safe-for-exa-adb-old.drawio",
"svg": "kb/diagram/assets/archcenter-refs/data-safe-exadata-adb/data-safe-for-exa-adb/data-safe-for-exa-adb.svg",
"yaml": "kb/diagram/assets/archcenter-refs/data-safe-exadata-adb/_template.yaml"
},
"data-safe-multicloud-ods-hybrid": {
"drawio": "kb/diagram/assets/archcenter-refs/data-safe-multicloud-ods-hybrid/datasafe-multi-odsa-01/datasafe-multi-odsa-01.drawio",
"svg": "kb/diagram/assets/archcenter-refs/data-safe-multicloud-ods-hybrid/datasafe-multi-odsa-01/datasafe-multi-odsa-01.svg",
"yaml": "kb/diagram/assets/archcenter-refs/data-safe-multicloud-ods-hybrid/_template.yaml"
},
"dataguard-exadata-dedicated-infrastructure": {
"drawio": "kb/diagram/assets/archcenter-refs/dataguard-exadata-dedicated-infrastructure/exadata-dedicated-cross-region-dataguard/exadata-dedicated-cross-region-dataguard.drawio",
"png": "kb/diagram/assets/archcenter-refs/dataguard-exadata-dedicated-infrastructure/exadata-dedicated-cross-region-dataguard/exadata-dedicated-cross-region-dataguard.png",
"svg": "kb/diagram/assets/archcenter-refs/dataguard-exadata-dedicated-infrastructure/exadata-dedicated-cross-region-dataguard/exadata-dedicated-cross-region-dataguard.svg",
"yaml": "kb/diagram/assets/archcenter-refs/dataguard-exadata-dedicated-infrastructure/_template.yaml"
},
"deploy-adb-db-at-google-cloud": {
"drawio": "kb/diagram/assets/archcenter-refs/deploy-adb-db-at-google-cloud/adb-oracle-db-at-google-cloud-region-oracle/adb-oracle-db-at-google-cloud-region.drawio",
"svg": "kb/diagram/assets/archcenter-refs/deploy-adb-db-at-google-cloud/adb-oracle-db-at-google-cloud-region-oracle/adb-oracle-db-at-google-cloud-region.svg",
"yaml": "kb/diagram/assets/archcenter-refs/deploy-adb-db-at-google-cloud/_template.yaml"
},
"deploy-agentic-ai-agent-platform": {
"drawio": "kb/diagram/assets/archcenter-refs/deploy-agentic-ai-agent-platform/agentic-ai-oci-ai-agent-arch-oracle/agentic-ai-oci-ai-agent-arch.drawio",
"svg": "kb/diagram/assets/archcenter-refs/deploy-agentic-ai-agent-platform/agentic-ai-oci-ai-agent-arch-oracle/agentic-ai-oci-ai-agent-arch.svg",
"yaml": "kb/diagram/assets/archcenter-refs/deploy-agentic-ai-agent-platform/_template.yaml"
},
"deploy-ai-powered-chatbot": {
"drawio": "kb/diagram/assets/archcenter-refs/deploy-ai-powered-chatbot/deploy-ai-chatbot-arch/deploy-ai-chatbot-arch/deploy-ai-chatbot-arch.drawio",
"png": "kb/diagram/assets/archcenter-refs/deploy-ai-powered-chatbot/deploy-ai-chatbot-arch/deploy-ai-chatbot-arch/deploy-ai-chatbot-arch.png",
"yaml": "kb/diagram/assets/archcenter-refs/deploy-ai-powered-chatbot/_template.yaml"
},
"deploy-autonomous-database-and-app": {
"drawio": "kb/diagram/assets/archcenter-refs/deploy-autonomous-database-and-app/apex-app-adb-oracle/apex-app-adb.drawio",
"svg": "kb/diagram/assets/archcenter-refs/deploy-autonomous-database-and-app/apex-app-adb-oracle/apex-app-adb.svg",
"yaml": "kb/diagram/assets/archcenter-refs/deploy-autonomous-database-and-app/_template.yaml"
},
"deploy-autonomous-database-db-at-azure": {
"drawio": "kb/diagram/assets/archcenter-refs/deploy-autonomous-database-db-at-azure/autonomous-database-db-at-azure-diagram-oracle/autonomous-database-db-at-azure-diagram.drawio",
"svg": "kb/diagram/assets/archcenter-refs/deploy-autonomous-database-db-at-azure/autonomous-database-db-at-azure-diagram-oracle/autonomous-database-db-at-azure-diagram.svg",
"yaml": "kb/diagram/assets/archcenter-refs/deploy-autonomous-database-db-at-azure/_template.yaml"
},
"deploy-data-rcvy-oci-api-gateway": {
"drawio": "kb/diagram/assets/archcenter-refs/deploy-data-rcvy-oci-api-gateway/apigw-oci-customer-managed-dr-topology-oracle/apigw-oci-customer-managed-dr-topology.drawio",
"svg": "kb/diagram/assets/archcenter-refs/deploy-data-rcvy-oci-api-gateway/apigw-oci-customer-managed-dr-topology-oracle/apigw-oci-customer-managed-dr-topology.svg",
"yaml": "kb/diagram/assets/archcenter-refs/deploy-data-rcvy-oci-api-gateway/_template.yaml"
},
"deploy-ebs-on-db-at-azure": {
"drawio": "kb/diagram/assets/archcenter-refs/deploy-ebs-on-db-at-azure/ebs-on-db-at-azure-arch-oracle/ebs-on-db-at-azure-arch.drawio",
"svg": "kb/diagram/assets/archcenter-refs/deploy-ebs-on-db-at-azure/ebs-on-db-at-azure-arch-oracle/ebs-on-db-at-azure-arch.svg",
"yaml": "kb/diagram/assets/archcenter-refs/deploy-ebs-on-db-at-azure/_template.yaml"
},
"deploy-gitops-argocd-oke": {
"drawio": "kb/diagram/assets/archcenter-refs/deploy-gitops-argocd-oke/argocd/argocd.drawio",
"svg": "kb/diagram/assets/archcenter-refs/deploy-gitops-argocd-oke/argocd/argocd.svg",
"yaml": "kb/diagram/assets/archcenter-refs/deploy-gitops-argocd-oke/_template.yaml"
},
"deploy-hybrid-dr-wls-fmw": {
"drawio": "kb/diagram/assets/archcenter-refs/deploy-hybrid-dr-wls-fmw/maa-wls-hybrid-dr-tool-highlights-oracle/maa-wls-hybrid-dr-tool-highlights.drawio",
"svg": "kb/diagram/assets/archcenter-refs/deploy-hybrid-dr-wls-fmw/maa-wls-hybrid-dr-tool-highlights-oracle/maa-wls-hybrid-dr-tool-highlights.svg",
"yaml": "kb/diagram/assets/archcenter-refs/deploy-hybrid-dr-wls-fmw/_template.yaml"
},
"deploy-key-vault-database-at-azure": {
"drawio": "kb/diagram/assets/archcenter-refs/deploy-key-vault-database-at-azure/key-vault-database-at-azure-diagram-oracle/key-vault-database-at-azure-diagram.drawio",
"svg": "kb/diagram/assets/archcenter-refs/deploy-key-vault-database-at-azure/key-vault-database-at-azure-diagram-oracle/key-vault-database-at-azure-diagram.svg",
"yaml": "kb/diagram/assets/archcenter-refs/deploy-key-vault-database-at-azure/_template.yaml"
},
"deploy-key-vault-database-at-google": {
"drawio": "kb/diagram/assets/archcenter-refs/deploy-key-vault-database-at-google/key-vault-database-google/key-vault-database-google/key-vault-database-google.drawio",
"png": "kb/diagram/assets/archcenter-refs/deploy-key-vault-database-at-google/key-vault-database-google/key-vault-database-google/key-vault-database-google.png",
"yaml": "kb/diagram/assets/archcenter-refs/deploy-key-vault-database-at-google/_template.yaml"
},
"deploy-lustre-file-systems": {
"png": "kb/diagram/assets/archcenter-refs/deploy-lustre-file-systems/lustre-file-system-oci-arch/lustre-file-system-oci-arch/lustre-file-system-oci-arch.png",
"svg": "kb/diagram/assets/archcenter-refs/deploy-lustre-file-systems/lustre-file-system-oci-arch/lustre-file-system-oci-arch/lustre-file-system-oci-arch.svg"
},
"deploy-maa-for-peoplesoft-on-oci": {
"drawio": "kb/diagram/assets/archcenter-refs/deploy-maa-for-peoplesoft-on-oci/peoplesoft-maa-arch-oracle/peoplesoft-maa-arch.drawio",
"svg": "kb/diagram/assets/archcenter-refs/deploy-maa-for-peoplesoft-on-oci/peoplesoft-maa-arch-oracle/peoplesoft-maa-arch.svg",
"yaml": "kb/diagram/assets/archcenter-refs/deploy-maa-for-peoplesoft-on-oci/_template.yaml"
},
"deploy-oke-with-bastion-and-github": {
"drawio": "kb/diagram/assets/archcenter-refs/deploy-oke-with-bastion-and-github/oke-bastion-deployment-diagram-oracle/oke-bastion-deployment-diagram.drawio",
"svg": "kb/diagram/assets/archcenter-refs/deploy-oke-with-bastion-and-github/oke-bastion-deployment-diagram-oracle/oke-bastion-deployment-diagram.svg",
"yaml": "kb/diagram/assets/archcenter-refs/deploy-oke-with-bastion-and-github/_template.yaml"
},
"deploy-oracle-database-at-google-cloud": {
"drawio": "kb/diagram/assets/archcenter-refs/deploy-oracle-database-at-google-cloud/google-detailed-arch-oracle/google-detailed-arch-oracle/google-detailed-arch.drawio",
"svg": "kb/diagram/assets/archcenter-refs/deploy-oracle-database-at-google-cloud/google-detailed-arch-oracle/google-detailed-arch-oracle/google-detailed-arch.svg",
"yaml": "kb/diagram/assets/archcenter-refs/deploy-oracle-database-at-google-cloud/_template.yaml"
},
"deploy-oracle-db-aws": {
"drawio": "kb/diagram/assets/archcenter-refs/deploy-oracle-db-aws/db-at-aws-main-arch-oracle/db-at-aws-main-arch.drawio",
"svg": "kb/diagram/assets/archcenter-refs/deploy-oracle-db-aws/db-at-aws-main-arch-oracle/db-at-aws-main-arch.svg",
"yaml": "kb/diagram/assets/archcenter-refs/deploy-oracle-db-aws/_template.yaml"
},
"deploy-tcs-banc-oci-exa": {
"drawio": "kb/diagram/assets/archcenter-refs/deploy-tcs-banc-oci-exa/bancs-ref-architecture-no-fd-oracle/bancs-ref-architecture-no-fd.drawio",
"svg": "kb/diagram/assets/archcenter-refs/deploy-tcs-banc-oci-exa/bancs-ref-architecture-no-fd-oracle/bancs-ref-architecture-no-fd.svg",
"yaml": "kb/diagram/assets/archcenter-refs/deploy-tcs-banc-oci-exa/_template.yaml"
},
"deploy-wls-on-oke": {
"drawio": "kb/diagram/assets/archcenter-refs/deploy-wls-on-oke/weblogic-oke-oracle/weblogic-oke.drawio",
"svg": "kb/diagram/assets/archcenter-refs/deploy-wls-on-oke/weblogic-oke-oracle/weblogic-oke.svg",
"yaml": "kb/diagram/assets/archcenter-refs/deploy-wls-on-oke/_template.yaml"
},
"deploy-xstore-oci": {
"drawio": "kb/diagram/assets/archcenter-refs/deploy-xstore-oci/deploy-xstore-on-oci/deploy-xstore-on-oci.drawio",
"svg": "kb/diagram/assets/archcenter-refs/deploy-xstore-oci/deploy-xstore-on-oci/deploy-xstore-on-oci.svg",
"yaml": "kb/diagram/assets/archcenter-refs/deploy-xstore-oci/_template.yaml"
},
"dns-resolution-oracle-db-at-google-cloud": {
"drawio": "kb/diagram/assets/archcenter-refs/dns-resolution-oracle-db-at-google-cloud/resolve-dns-oci-google-cloud-oracle/resolve-dns-oci-google-cloud.drawio",
"svg": "kb/diagram/assets/archcenter-refs/dns-resolution-oracle-db-at-google-cloud/resolve-dns-oci-google-cloud-oracle/resolve-dns-oci-google-cloud.svg",
"yaml": "kb/diagram/assets/archcenter-refs/dns-resolution-oracle-db-at-google-cloud/_template.yaml"
},
"dr-active-dg-farsync-db-at-aws": {
"drawio": "kb/diagram/assets/archcenter-refs/dr-active-dg-farsync-db-at-aws/cross-region-dr-activedg-farsync-oracle/cross-region-dr-activedg-farsync.drawio",
"svg": "kb/diagram/assets/archcenter-refs/dr-active-dg-farsync-db-at-aws/cross-region-dr-activedg-farsync-oracle/cross-region-dr-activedg-farsync.svg",
"yaml": "kb/diagram/assets/archcenter-refs/dr-active-dg-farsync-db-at-aws/_template.yaml"
},
"dr-local-regional-standby-db-at-aws": {
"drawio": "kb/diagram/assets/archcenter-refs/dr-local-regional-standby-db-at-aws/exadb-dbaws-dr-arch-oracle/exadb-dbaws-dr-arch.drawio",
"svg": "kb/diagram/assets/archcenter-refs/dr-local-regional-standby-db-at-aws/exadb-dbaws-dr-arch-oracle/exadb-dbaws-dr-arch.svg",
"yaml": "kb/diagram/assets/archcenter-refs/dr-local-regional-standby-db-at-aws/_template.yaml"
},
"ebs-logging-analytics-oci": {
"drawio": "kb/diagram/assets/archcenter-refs/ebs-logging-analytics-oci/ebs-logging-analytics-on-oci-oracle/ebs-logging-analytics-on-oci.drawio",
"svg": "kb/diagram/assets/archcenter-refs/ebs-logging-analytics-oci/ebs-logging-analytics-on-oci-oracle/ebs-logging-analytics-on-oci.svg",
"yaml": "kb/diagram/assets/archcenter-refs/ebs-logging-analytics-oci/_template.yaml"
},
"ebs-on-db-at-aws": {
"drawio": "kb/diagram/assets/archcenter-refs/ebs-on-db-at-aws/ebs-db-at-aws-architecture-oracle/ebs-db-at-aws-architecture.drawio",
"svg": "kb/diagram/assets/archcenter-refs/ebs-on-db-at-aws/ebs-db-at-aws-architecture-oracle/ebs-db-at-aws-architecture.svg",
"yaml": "kb/diagram/assets/archcenter-refs/ebs-on-db-at-aws/_template.yaml"
},
"exadata-dedicated-cross-region-dataguard": {
"drawio": "kb/diagram/assets/archcenter-refs/exadata-dedicated-cross-region-dataguard/exadata-dedicated-cross-region-dataguard-uncompressed.drawio",
"png": "kb/diagram/assets/archcenter-refs/exadata-dedicated-cross-region-dataguard/exadata-dedicated-cross-region-dataguard.png",
"svg": "kb/diagram/assets/archcenter-refs/exadata-dedicated-cross-region-dataguard/exadata-dedicated-cross-region-dataguard.svg",
"yaml": "kb/diagram/assets/archcenter-refs/exadata-dedicated-cross-region-dataguard/_template.yaml"
},
"exadata-dedicated-in-region-dataguard": {
"drawio": "kb/diagram/assets/archcenter-refs/exadata-dedicated-in-region-dataguard/exadata-dedicated-in-region-dataguard.drawio",
"png": "kb/diagram/assets/archcenter-refs/exadata-dedicated-in-region-dataguard/exadata-dedicated-in-region-dataguard.png",
"svg": "kb/diagram/assets/archcenter-refs/exadata-dedicated-in-region-dataguard/exadata-dedicated-in-region-dataguard.svg",
"yaml": "kb/diagram/assets/archcenter-refs/exadata-dedicated-in-region-dataguard/_template.yaml"
},
"exadb-dbaws-dr-arch-oracle": {
"drawio": "kb/diagram/assets/archcenter-refs/exadb-dbaws-dr-arch-oracle/exadb-dbaws-dr-arch.drawio",
"png": "kb/diagram/assets/archcenter-refs/exadb-dbaws-dr-arch-oracle/exadb-dbaws-dr-arch.png",
"svg": "kb/diagram/assets/archcenter-refs/exadb-dbaws-dr-arch-oracle/exadb-dbaws-dr-arch.svg",
"yaml": "kb/diagram/assets/archcenter-refs/exadb-dbaws-dr-arch-oracle/_template.yaml"
},
"exadb-dr-on-db-at-azure-oracle": {
"drawio": "kb/diagram/assets/archcenter-refs/exadb-dr-on-db-at-azure-oracle/exadb-dr-on-db-at-azure.drawio",
"png": "kb/diagram/assets/archcenter-refs/exadb-dr-on-db-at-azure-oracle/exadb-dr-on-db-at-azure.png",
"svg": "kb/diagram/assets/archcenter-refs/exadb-dr-on-db-at-azure-oracle/exadb-dr-on-db-at-azure.svg",
"yaml": "kb/diagram/assets/archcenter-refs/exadb-dr-on-db-at-azure-oracle/_template.yaml"
},
"exadb-dr-on-db-azure": {
"drawio": "kb/diagram/assets/archcenter-refs/exadb-dr-on-db-azure/exadb-dr-on-db-at-azure-oracle/exadb-dr-on-db-at-azure.drawio",
"svg": "kb/diagram/assets/archcenter-refs/exadb-dr-on-db-azure/exadb-dr-on-db-at-azure-oracle/exadb-dr-on-db-at-azure.svg",
"yaml": "kb/diagram/assets/archcenter-refs/exadb-dr-on-db-azure/_template.yaml"
},
"hub-spoke-network": {
"drawio": "kb/diagram/assets/archcenter-refs/hub-spoke-network/hub-spoke-oci.drawio",
"svg": "kb/diagram/assets/archcenter-refs/hub-spoke-network/hub-spoke-oci.svg",
"yaml": "kb/diagram/assets/archcenter-refs/hub-spoke-network/_template.yaml"
},
"hub-spoke-network-drg": {
"drawio": "kb/diagram/assets/archcenter-refs/hub-spoke-network-drg/hub-and-spoke-drg-oracle/hub-and-spoke-drg.drawio",
"svg": "kb/diagram/assets/archcenter-refs/hub-spoke-network-drg/hub-and-spoke-drg-oracle/hub-and-spoke-drg.svg",
"yaml": "kb/diagram/assets/archcenter-refs/hub-spoke-network-drg/_template.yaml"
},
"implement-goldengate-azure": {
"drawio": "kb/diagram/assets/archcenter-refs/implement-goldengate-azure/goldengate-dbatazure-integration/goldengate-dbatazure-integration/goldengate-dbatazure-integration.drawio",
"png": "kb/diagram/assets/archcenter-refs/implement-goldengate-azure/goldengate-dbatazure-integration/goldengate-dbatazure-integration/goldengate-dbatazure-integration.png",
"svg": "kb/diagram/assets/archcenter-refs/implement-goldengate-azure/goldengate-dbatazure-integration/goldengate-dbatazure-integration/goldengate-dbatazure-integration.svg",
"yaml": "kb/diagram/assets/archcenter-refs/implement-goldengate-azure/_template.yaml"
},
"implement-rag-oci": {
"drawio": "kb/diagram/assets/archcenter-refs/implement-rag-oci/rag-oic-aug-gen-oracle/rag-oic-aug-gen.drawio",
"svg": "kb/diagram/assets/archcenter-refs/implement-rag-oci/rag-oic-aug-gen-oracle/rag-oic-aug-gen.svg",
"yaml": "kb/diagram/assets/archcenter-refs/implement-rag-oci/_template.yaml"
},
"implement-recovery-service-db-at-azure": {
"drawio": "kb/diagram/assets/archcenter-refs/implement-recovery-service-db-at-azure/db-autonomous-recovery-dbatazure/db-autonomous-recovery-dbatazure/db-autonomous-recovery-dbatazure.drawio",
"svg": "kb/diagram/assets/archcenter-refs/implement-recovery-service-db-at-azure/db-autonomous-recovery-dbatazure/db-autonomous-recovery-dbatazure/db-autonomous-recovery-dbatazure.svg",
"yaml": "kb/diagram/assets/archcenter-refs/implement-recovery-service-db-at-azure/_template.yaml"
},
"integration-access-control": {
"drawio": "kb/diagram/assets/archcenter-refs/integration-access-control/oracle-integration-rest-oauth-diagram-oracle/oracle-integration-rest-oauth-diagram.drawio",
"svg": "kb/diagram/assets/archcenter-refs/integration-access-control/oracle-integration-rest-oauth-diagram-oracle/oracle-integration-rest-oauth-diagram.svg",
"yaml": "kb/diagram/assets/archcenter-refs/integration-access-control/_template.yaml"
},
"kubernetes-artifact-snapshot-dr": {
"drawio": "kb/diagram/assets/archcenter-refs/kubernetes-artifact-snapshot-dr/kubernetes-multiregion-dr-oracle/kubernetes-multiregion-dr.drawio",
"svg": "kb/diagram/assets/archcenter-refs/kubernetes-artifact-snapshot-dr/kubernetes-multiregion-dr-oracle/kubernetes-multiregion-dr.svg",
"yaml": "kb/diagram/assets/archcenter-refs/kubernetes-artifact-snapshot-dr/_template.yaml"
},
"kubernetes-oke-logging-analytics": {
"drawio": "kb/diagram/assets/archcenter-refs/kubernetes-oke-logging-analytics/k8s-oke-monitoring-oracle/k8s-oke-monitoring.drawio",
"svg": "kb/diagram/assets/archcenter-refs/kubernetes-oke-logging-analytics/k8s-oke-monitoring-oracle/k8s-oke-monitoring.svg",
"yaml": "kb/diagram/assets/archcenter-refs/kubernetes-oke-logging-analytics/_template.yaml"
},
"learn-about-drg-solutions": {
"drawio": "kb/diagram/assets/archcenter-refs/learn-about-drg-solutions/drg-routing-operation-oracle/drg-routing-operation.drawio",
"svg": "kb/diagram/assets/archcenter-refs/learn-about-drg-solutions/drg-routing-operation-oracle/drg-routing-operation.svg",
"yaml": "kb/diagram/assets/archcenter-refs/learn-about-drg-solutions/_template.yaml"
},
"learn-about-maa-for-peoplesoft": {
"drawio": "kb/diagram/assets/archcenter-refs/learn-about-maa-for-peoplesoft/peoplesoft-maa-arch-oracle/peoplesoft-maa-arch.drawio",
"svg": "kb/diagram/assets/archcenter-refs/learn-about-maa-for-peoplesoft/peoplesoft-maa-arch-oracle/peoplesoft-maa-arch.svg",
"yaml": "kb/diagram/assets/archcenter-refs/learn-about-maa-for-peoplesoft/_template.yaml"
},
"local-regional-standby-dr-db-at-azure": {
"drawio": "kb/diagram/assets/archcenter-refs/local-regional-standby-dr-db-at-azure/local-regional-standby-dr-db-azure-arch-oracle/local-regional-standby-dr-db-azure-arch.drawio",
"svg": "kb/diagram/assets/archcenter-refs/local-regional-standby-dr-db-at-azure/local-regional-standby-dr-db-azure-arch-oracle/local-regional-standby-dr-db-azure-arch.svg",
"yaml": "kb/diagram/assets/archcenter-refs/local-regional-standby-dr-db-at-azure/_template.yaml"
},
"mid-tier-replication-oci-dr-arch": {
"drawio": "kb/diagram/assets/archcenter-refs/mid-tier-replication-oci-dr-arch/active-passive-dr-mid-tier-oracle/active-passive-dr-mid-tier.drawio",
"svg": "kb/diagram/assets/archcenter-refs/mid-tier-replication-oci-dr-arch/active-passive-dr-mid-tier-oracle/active-passive-dr-mid-tier.svg",
"yaml": "kb/diagram/assets/archcenter-refs/mid-tier-replication-oci-dr-arch/_template.yaml"
},
"migrate-apps-to-apex": {
"drawio": "kb/diagram/assets/archcenter-refs/migrate-apps-to-apex/forms-apps-to-apex-oracle/forms-apps-to-apex.drawio",
"svg": "kb/diagram/assets/archcenter-refs/migrate-apps-to-apex/forms-apps-to-apex-oracle/forms-apps-to-apex.svg",
"yaml": "kb/diagram/assets/archcenter-refs/migrate-apps-to-apex/_template.yaml"
},
"migrate-ebs-with-cloudmanager": {
"drawio": "kb/diagram/assets/archcenter-refs/migrate-ebs-with-cloudmanager/migrate-ebs-env-prod-oracle/migrate-ebs-env-prod.drawio",
"svg": "kb/diagram/assets/archcenter-refs/migrate-ebs-with-cloudmanager/migrate-ebs-env-prod-oracle/migrate-ebs-env-prod.svg",
"yaml": "kb/diagram/assets/archcenter-refs/migrate-ebs-with-cloudmanager/_template.yaml"
},
"migrate-to-atp": {
"png": "kb/diagram/assets/archcenter-refs/migrate-to-atp/favicon-128.png"
},
"modern-platform-oracle-db-at-azure": {
"drawio": "kb/diagram/assets/archcenter-refs/modern-platform-oracle-db-at-azure/oracle-database-at-azure-services-platform-oracle/oracle-database-at-azure-services-platform.drawio",
"svg": "kb/diagram/assets/archcenter-refs/modern-platform-oracle-db-at-azure/oracle-database-at-azure-services-platform-oracle/oracle-database-at-azure-services-platform.svg",
"yaml": "kb/diagram/assets/archcenter-refs/modern-platform-oracle-db-at-azure/_template.yaml"
},
"modernize-app-dev-oci-postgresql-redis-opensearch": {
"drawio": "kb/diagram/assets/archcenter-refs/modernize-app-dev-oci-postgresql-redis-opensearch/dr-architecture-diagram-oracle/dr-architecture-diagram.drawio",
"svg": "kb/diagram/assets/archcenter-refs/modernize-app-dev-oci-postgresql-redis-opensearch/dr-architecture-diagram-oracle/dr-architecture-diagram.svg",
"yaml": "kb/diagram/assets/archcenter-refs/modernize-app-dev-oci-postgresql-redis-opensearch/_template.yaml"
},
"mongodb-to-atp": {
"drawio": "kb/diagram/assets/archcenter-refs/mongodb-to-atp/mongodb-atp-s-arch-variant-oracle/mongodb-atp-s-arch-variant.drawio",
"svg": "kb/diagram/assets/archcenter-refs/mongodb-to-atp/mongodb-atp-s-arch-variant-oracle/mongodb-atp-s-arch-variant.svg",
"yaml": "kb/diagram/assets/archcenter-refs/mongodb-to-atp/_template.yaml"
},
"mongodb-to-atp-azure": {
"drawio": "kb/diagram/assets/archcenter-refs/mongodb-to-atp-azure/mongodb-atp-s-azure-arch-variant/mongodb-atp-s-azure-arch-variant/mongodb-atp-s-azure-arch-variant.drawio",
"png": "kb/diagram/assets/archcenter-refs/mongodb-to-atp-azure/mongodb-atp-s-azure-arch-variant/mongodb-atp-s-azure-arch-variant/mongodb-atp-s-azure-arch-variant.png",
"svg": "kb/diagram/assets/archcenter-refs/mongodb-to-atp-azure/mongodb-atp-s-azure-arch-variant/mongodb-atp-s-azure-arch-variant/mongodb-atp-s-azure-arch-variant.svg",
"yaml": "kb/diagram/assets/archcenter-refs/mongodb-to-atp-azure/_template.yaml"
},
"mongodb-to-atp-google": {
"drawio": "kb/diagram/assets/archcenter-refs/mongodb-to-atp-google/mongodb-atp-s-google-arch-variant/mongodb-atp-s-google-arch-variant/mongodb-atp-s-google-arch-variant.drawio",
"png": "kb/diagram/assets/archcenter-refs/mongodb-to-atp-google/mongodb-atp-s-google-arch-variant/mongodb-atp-s-google-arch-variant/mongodb-atp-s-google-arch-variant.png",
"svg": "kb/diagram/assets/archcenter-refs/mongodb-to-atp-google/mongodb-atp-s-google-arch-variant/mongodb-atp-s-google-arch-variant/mongodb-atp-s-google-arch-variant.svg",
"yaml": "kb/diagram/assets/archcenter-refs/mongodb-to-atp-google/_template.yaml"
},
"mongodb-to-auto-json-db": {
"drawio": "kb/diagram/assets/archcenter-refs/mongodb-to-auto-json-db/mongodb-json-arch-variant-oracle/mongdb-json-arch-variant.drawio",
"svg": "kb/diagram/assets/archcenter-refs/mongodb-to-auto-json-db/mongodb-json-arch-variant-oracle/mongodb-json-arch-variant.svg",
"yaml": "kb/diagram/assets/archcenter-refs/mongodb-to-auto-json-db/_template.yaml"
},
"mongodb-to-exadata-machine": {
"drawio": "kb/diagram/assets/archcenter-refs/mongodb-to-exadata-machine/mongodb-exadata-machine-physical-arch/mongodb-exadata-machine-physical-arch/mongodb-exadata-machine-physical-arch.drawio",
"png": "kb/diagram/assets/archcenter-refs/mongodb-to-exadata-machine/mongodb-exadata-machine-physical-arch/mongodb-exadata-machine-physical-arch/mongodb-exadata-machine-physical-arch.png",
"yaml": "kb/diagram/assets/archcenter-refs/mongodb-to-exadata-machine/_template.yaml"
},
"multi-region-standby-dr-db-at-azure": {
"drawio": "kb/diagram/assets/archcenter-refs/multi-region-standby-dr-db-at-azure/multi-region-standby-dr-db-azure-arch-oracle/multi-region-standby-dr-db-azure-arch.drawio",
"svg": "kb/diagram/assets/archcenter-refs/multi-region-standby-dr-db-at-azure/multi-region-standby-dr-db-azure-arch-oracle/multi-region-standby-dr-db-azure-arch.svg",
"yaml": "kb/diagram/assets/archcenter-refs/multi-region-standby-dr-db-at-azure/_template.yaml"
},
"multi-region-standby-dr-db-azure-arch-oracle": {
"drawio": "kb/diagram/assets/archcenter-refs/multi-region-standby-dr-db-azure-arch-oracle/multi-region-standby-dr-db-azure-arch.drawio",
"png": "kb/diagram/assets/archcenter-refs/multi-region-standby-dr-db-azure-arch-oracle/multi-region-standby-dr-db-azure-arch.png",
"svg": "kb/diagram/assets/archcenter-refs/multi-region-standby-dr-db-azure-arch-oracle/multi-region-standby-dr-db-azure-arch.svg",
"yaml": "kb/diagram/assets/archcenter-refs/multi-region-standby-dr-db-azure-arch-oracle/_template.yaml"
},
"multi-tenant-app-deploy": {
"drawio": "kb/diagram/assets/archcenter-refs/multi-tenant-app-deploy/multi-tenant-app-oci-oracle/multi-tenant-app-oci.drawio",
"svg": "kb/diagram/assets/archcenter-refs/multi-tenant-app-deploy/multi-tenant-app-oci-oracle/multi-tenant-app-oci.svg",
"yaml": "kb/diagram/assets/archcenter-refs/multi-tenant-app-deploy/_template.yaml"
},
"network-topology-oracle-database-at-aws": {
"drawio": "kb/diagram/assets/archcenter-refs/network-topology-oracle-database-at-aws/db-at-aws-main-arch-oracle/db-at-aws-main-arch.drawio",
"svg": "kb/diagram/assets/archcenter-refs/network-topology-oracle-database-at-aws/db-at-aws-main-arch-oracle/db-at-aws-main-arch.svg",
"yaml": "kb/diagram/assets/archcenter-refs/network-topology-oracle-database-at-aws/_template.yaml"
},
"network-topology-oracle-database-at-google-cloud": {
"drawio": "kb/diagram/assets/archcenter-refs/network-topology-oracle-database-at-google-cloud/google-detailed-arch-oracle/google-detailed-arch-oracle/google-detailed-arch.drawio",
"svg": "kb/diagram/assets/archcenter-refs/network-topology-oracle-database-at-google-cloud/google-detailed-arch-oracle/google-detailed-arch-oracle/google-detailed-arch.svg",
"yaml": "kb/diagram/assets/archcenter-refs/network-topology-oracle-database-at-google-cloud/_template.yaml"
},
"oci-ai-healthcare": {
"drawio": "kb/diagram/assets/archcenter-refs/oci-ai-healthcare/oci-ai-healthcare_arch-oracle/oci-ai-healthcare-arch.drawio",
"svg": "kb/diagram/assets/archcenter-refs/oci-ai-healthcare/oci-ai-healthcare_arch-oracle/oci-ai-healthcare-arch.svg",
"yaml": "kb/diagram/assets/archcenter-refs/oci-ai-healthcare/_template.yaml"
},
"oci-azure-multicloud-data-solution": {
"drawio": "kb/diagram/assets/archcenter-refs/oci-azure-multicloud-data-solution/oci-azure-multicloud-data-solution-diagram-oracle/oci-azure-multicloud-data-solution-diagram.drawio",
"svg": "kb/diagram/assets/archcenter-refs/oci-azure-multicloud-data-solution/oci-azure-multicloud-data-solution-diagram-oracle/oci-azure-multicloud-data-solution-diagram.svg",
"yaml": "kb/diagram/assets/archcenter-refs/oci-azure-multicloud-data-solution/_template.yaml"
},
"oci-best-practices-networking": {
"drawio": "kb/diagram/assets/archcenter-refs/oci-best-practices-networking/multi-region-deployment-full-arch-oracle/multi-region-deployment-full-arch.drawio",
"svg": "kb/diagram/assets/archcenter-refs/oci-best-practices-networking/multi-region-deployment-full-arch-oracle/multi-region-deployment-full-arch.svg",
"yaml": "kb/diagram/assets/archcenter-refs/oci-best-practices-networking/_template.yaml"
},
"oci-cpu-inference-ollama": {
"drawio": "kb/diagram/assets/archcenter-refs/oci-cpu-inference-ollama/ollama-blueprint-architecture-oracle/ollama-blueprint-architecture.drawio",
"svg": "kb/diagram/assets/archcenter-refs/oci-cpu-inference-ollama/ollama-blueprint-architecture-oracle/ollama-blueprint-architecture.svg",
"yaml": "kb/diagram/assets/archcenter-refs/oci-cpu-inference-ollama/_template.yaml"
},
"oci-genai-enterprise": {
"drawio": "kb/diagram/assets/archcenter-refs/oci-genai-enterprise/oci-genai-enterprise-arch-oracle/oci-genai-enterprise-arch.drawio",
"svg": "kb/diagram/assets/archcenter-refs/oci-genai-enterprise/oci-genai-enterprise-arch-oracle/oci-genai-enterprise-arch.svg",
"yaml": "kb/diagram/assets/archcenter-refs/oci-genai-enterprise/_template.yaml"
},
"oci-generative-ai-llm-platforms": {
"drawio": "kb/diagram/assets/archcenter-refs/oci-generative-ai-llm-platforms/ai-llm-workflow-architecture-oracle/ai-llm-workflow-architecture.drawio",
"svg": "kb/diagram/assets/archcenter-refs/oci-generative-ai-llm-platforms/ai-llm-workflow-architecture-oracle/ai-llm-workflow-architecture.svg",
"yaml": "kb/diagram/assets/archcenter-refs/oci-generative-ai-llm-platforms/_template.yaml"
},
"oci-multicloud-datalake": {
"drawio": "kb/diagram/assets/archcenter-refs/oci-multicloud-datalake/oci-multicloud-datalake-flow-oracle/oci_multicloud_datalake_flow.drawio",
"svg": "kb/diagram/assets/archcenter-refs/oci-multicloud-datalake/oci-multicloud-datalake-flow-oracle/oci_multicloud_datalake_flow.svg",
"yaml": "kb/diagram/assets/archcenter-refs/oci-multicloud-datalake/_template.yaml"
},
"oci-multicloud-genai-rag": {
"drawio": "kb/diagram/assets/archcenter-refs/oci-multicloud-genai-rag/multicloud-genai-rag-architecture-oracle/multicloud-genai-rag-architecture.drawio",
"svg": "kb/diagram/assets/archcenter-refs/oci-multicloud-genai-rag/multicloud-genai-rag-architecture-oracle/multicloud-genai-rag-architecture.svg",
"yaml": "kb/diagram/assets/archcenter-refs/oci-multicloud-genai-rag/_template.yaml"
},
"oci-nlb-palo-alto-active-active": {
"drawio": "kb/diagram/assets/archcenter-refs/oci-nlb-palo-alto-active-active/oci-nlb-palo-alto-active-active-arch-oracle/oci-nlb-palo-alto-active-active-arch.drawio",
"svg": "kb/diagram/assets/archcenter-refs/oci-nlb-palo-alto-active-active/oci-nlb-palo-alto-active-active-arch-oracle/oci-nlb-palo-alto-active-active-arch.svg",
"yaml": "kb/diagram/assets/archcenter-refs/oci-nlb-palo-alto-active-active/_template.yaml"
},
"oci-oad-kafka-oi": {
"drawio": "kb/diagram/assets/archcenter-refs/oci-oad-kafka-oi/oci-oad-kafka-oi-oracle/oci-oad-kafka-oi.drawio",
"svg": "kb/diagram/assets/archcenter-refs/oci-oad-kafka-oi/oci-oad-kafka-oi-oracle/oci-oad-kafka-oi.svg",
"yaml": "kb/diagram/assets/archcenter-refs/oci-oad-kafka-oi/_template.yaml"
},
"oci-object-storage-modernization": {
"drawio": "kb/diagram/assets/archcenter-refs/oci-object-storage-modernization/oci-object-storage-modernization-arch-after-oracle/oci-object-storage-modernization-arch-after.drawio",
"svg": "kb/diagram/assets/archcenter-refs/oci-object-storage-modernization/oci-object-storage-modernization-arch-after-oracle/oci-object-storage-modernization-arch-after.svg",
"yaml": "kb/diagram/assets/archcenter-refs/oci-object-storage-modernization/_template.yaml"
},
"oci-ops-insights-and-em-bridge": {
"drawio": "kb/diagram/assets/archcenter-refs/oci-ops-insights-and-em-bridge/oci-ops-insights-diagram-oracle/oci-ops-insights-diagram.drawio",
"svg": "kb/diagram/assets/archcenter-refs/oci-ops-insights-and-em-bridge/oci-ops-insights-diagram-oracle/oci-ops-insights-diagram.svg",
"yaml": "kb/diagram/assets/archcenter-refs/oci-ops-insights-and-em-bridge/_template.yaml"
},
"oci-security-zones": {
"drawio": "kb/diagram/assets/archcenter-refs/oci-security-zones/MSZ-01-oracle/MSZ-01.drawio",
"svg": "kb/diagram/assets/archcenter-refs/oci-security-zones/MSZ-01-oracle/MSZ-01.svg",
"yaml": "kb/diagram/assets/archcenter-refs/oci-security-zones/_template.yaml"
},
"oci-speech-meeting-insights-genai": {
"drawio": "kb/diagram/assets/archcenter-refs/oci-speech-meeting-insights-genai/oci-speech-adb-ai-arch-oracle/oci-speech-adb-ai-arch.drawio",
"svg": "kb/diagram/assets/archcenter-refs/oci-speech-meeting-insights-genai/oci-speech-adb-ai-arch-oracle/oci-speech-adb-ai-arch.svg",
"yaml": "kb/diagram/assets/archcenter-refs/oci-speech-meeting-insights-genai/_template.yaml"
},
"ocvs-vsan-stretched-cluster": {
"drawio": "kb/diagram/assets/archcenter-refs/ocvs-vsan-stretched-cluster/ocvs-vsan-stretched-cluster-oracle/ocvs-vsan-stretched-cluster.drawio",
"svg": "kb/diagram/assets/archcenter-refs/ocvs-vsan-stretched-cluster/ocvs-vsan-stretched-cluster-oracle/ocvs-vsan-stretched-cluster.svg",
"yaml": "kb/diagram/assets/archcenter-refs/ocvs-vsan-stretched-cluster/_template.yaml"
},
"oracle-adb-jde-exadata": {
"drawio": "kb/diagram/assets/archcenter-refs/oracle-adb-jde-exadata/oracle-adb-jde-exadata-arch-oracle/oracle-adb-jde-exadata-arch.drawio",
"svg": "kb/diagram/assets/archcenter-refs/oracle-adb-jde-exadata/oracle-adb-jde-exadata-arch-oracle/oracle-adb-jde-exadata-arch.svg",
"yaml": "kb/diagram/assets/archcenter-refs/oracle-adb-jde-exadata/_template.yaml"
},
"oracle-adb-jde-exadata-arch-oracle": {
"drawio": "kb/diagram/assets/archcenter-refs/oracle-adb-jde-exadata-arch-oracle/oracle-adb-jde-exadata-arch.drawio",
"png": "kb/diagram/assets/archcenter-refs/oracle-adb-jde-exadata-arch-oracle/rendered.png",
"svg": "kb/diagram/assets/archcenter-refs/oracle-adb-jde-exadata-arch-oracle/oracle-adb-jde-exadata-arch.svg",
"yaml": "kb/diagram/assets/archcenter-refs/oracle-adb-jde-exadata-arch-oracle/_template.yaml"
},
"oracle-db-at-azure-migration": {
"drawio": "kb/diagram/assets/archcenter-refs/oracle-db-at-azure-migration/oracle-db-at-azure-zdm-oracle/oracle-db-at-azure-zdm.drawio",
"svg": "kb/diagram/assets/archcenter-refs/oracle-db-at-azure-migration/oracle-db-at-azure-zdm-oracle/oracle-db-at-azure-zdm.svg",
"yaml": "kb/diagram/assets/archcenter-refs/oracle-db-at-azure-migration/_template.yaml"
},
"oracle-db-at-azure-streaming": {
"drawio": "kb/diagram/assets/archcenter-refs/oracle-db-at-azure-streaming/oracle-db-at-azure-streaming-oracle/oracle-db-at-azure-streaming.drawio",
"svg": "kb/diagram/assets/archcenter-refs/oracle-db-at-azure-streaming/oracle-db-at-azure-streaming-oracle/oracle-db-at-azure-streaming.svg",
"yaml": "kb/diagram/assets/archcenter-refs/oracle-db-at-azure-streaming/_template.yaml"
},
"oracle-db-at-google-cloud-migration": {
"drawio": "kb/diagram/assets/archcenter-refs/oracle-db-at-google-cloud-migration/oracle_database_at_google_cloud_w_zdm-oracle/oracle_database_at_google_cloud_w_zdm.drawio",
"svg": "kb/diagram/assets/archcenter-refs/oracle-db-at-google-cloud-migration/oracle_database_at_google_cloud_w_zdm-oracle/oracle_database_at_google_cloud_w_zdm.svg",
"yaml": "kb/diagram/assets/archcenter-refs/oracle-db-at-google-cloud-migration/_template.yaml"
},
"oracle-maa-db-at-azure": {
"drawio": "kb/diagram/assets/archcenter-refs/oracle-maa-db-at-azure/cross-az-dr-oracle/cross-az-dr.drawio",
"svg": "kb/diagram/assets/archcenter-refs/oracle-maa-db-at-azure/cross-az-dr-oracle/cross-az-dr.svg",
"yaml": "kb/diagram/assets/archcenter-refs/oracle-maa-db-at-azure/_template.yaml"
},
"phased-migration-to-oracle-dba": {
"drawio": "kb/diagram/assets/archcenter-refs/phased-migration-to-oracle-dba/logical-architecture-diagram-oracle/logical-architecture-diagram.drawio",
"svg": "kb/diagram/assets/archcenter-refs/phased-migration-to-oracle-dba/logical-architecture-diagram-oracle/logical-architecture-diagram.svg",
"yaml": "kb/diagram/assets/archcenter-refs/phased-migration-to-oracle-dba/_template.yaml"
},
"private-dns": {
"drawio": "kb/diagram/assets/archcenter-refs/private-dns/architecture-deploy-private-dns/architecture-deploy-private-dns/architecture-deploy-private-dns.drawio",
"png": "kb/diagram/assets/archcenter-refs/private-dns/architecture-deploy-private-dns/architecture-deploy-private-dns/architecture-deploy-private-dns.png",
"yaml": "kb/diagram/assets/archcenter-refs/private-dns/_template.yaml"
},
"remote-synchronous-block-replication-oci": {
"drawio": "kb/diagram/assets/archcenter-refs/remote-synchronous-block-replication-oci/remote-synchronous-block-replication-diagram-oracle/remote-synchronous-block-replication-diagram.drawio",
"svg": "kb/diagram/assets/archcenter-refs/remote-synchronous-block-replication-oci/remote-synchronous-block-replication-diagram-oracle/remote-synchronous-block-replication-diagram.svg",
"yaml": "kb/diagram/assets/archcenter-refs/remote-synchronous-block-replication-oci/_template.yaml"
},
"rep-fusion-saas-third-party-dw": {
"drawio": "kb/diagram/assets/archcenter-refs/rep-fusion-saas-third-party-dw/fusion-saas-to-snowflake-arch-oracle/fusion-saas-to-snowflake-arch.drawio",
"svg": "kb/diagram/assets/archcenter-refs/rep-fusion-saas-third-party-dw/fusion-saas-to-snowflake-arch-oracle/fusion-saas-to-snowflake-arch.svg",
"yaml": "kb/diagram/assets/archcenter-refs/rep-fusion-saas-third-party-dw/_template.yaml"
},
"run-quantized-gguf-llm-ampere-cluster": {
"drawio": "kb/diagram/assets/archcenter-refs/run-quantized-gguf-llm-ampere-cluster/gen-ai-ampere-gguf-llm-arch/gen-ai-ampere-gguf-llm-arch/gen-ai-ampere-gguf-llm-arch.drawio",
"png": "kb/diagram/assets/archcenter-refs/run-quantized-gguf-llm-ampere-cluster/gen-ai-ampere-gguf-llm-arch/gen-ai-ampere-gguf-llm-arch/gen-ai-ampere-gguf-llm-arch.png",
"svg": "kb/diagram/assets/archcenter-refs/run-quantized-gguf-llm-ampere-cluster/gen-ai-ampere-gguf-llm-arch/gen-ai-ampere-gguf-llm-arch/gen-ai-ampere-gguf-llm-arch.svg",
"yaml": "kb/diagram/assets/archcenter-refs/run-quantized-gguf-llm-ampere-cluster/_template.yaml"
},
"secure-backup-oci-object-storage": {
"drawio": "kb/diagram/assets/archcenter-refs/secure-backup-oci-object-storage/secure-backup-oci-object-storage-oracle/secure-backup-oci-object-storage.drawio",
"svg": "kb/diagram/assets/archcenter-refs/secure-backup-oci-object-storage/secure-backup-oci-object-storage-oracle/secure-backup-oci-object-storage.svg",
"yaml": "kb/diagram/assets/archcenter-refs/secure-backup-oci-object-storage/_template.yaml"
},
"select-ai-apex-framework": {
"drawio": "kb/diagram/assets/archcenter-refs/select-ai-apex-framework/hallucination-reduction-workflow-oracle/hallucination-reduction-workflow.drawio",
"svg": "kb/diagram/assets/archcenter-refs/select-ai-apex-framework/hallucination-reduction-workflow-oracle/hallucination-reduction-workflow.svg",
"yaml": "kb/diagram/assets/archcenter-refs/select-ai-apex-framework/_template.yaml"
},
"takamol-on-oci": {
"drawio": "kb/diagram/assets/archcenter-refs/takamol-on-oci/takamol-on-oci-arch-oracle/takamol-on-oci-arch.drawio",
"svg": "kb/diagram/assets/archcenter-refs/takamol-on-oci/takamol-on-oci-arch-oracle/takamol-on-oci-arch.svg",
"yaml": "kb/diagram/assets/archcenter-refs/takamol-on-oci/_template.yaml"
},
"tharseo-data-platform-on-oci": {
"drawio": "kb/diagram/assets/archcenter-refs/tharseo-data-platform-on-oci/tharseo-data-platform-on-oci-arch-oracle/tharseo-data-platform-on-oci-arch.drawio",
"svg": "kb/diagram/assets/archcenter-refs/tharseo-data-platform-on-oci/tharseo-data-platform-on-oci-arch-oracle/tharseo-data-platform-on-oci-arch.svg",
"yaml": "kb/diagram/assets/archcenter-refs/tharseo-data-platform-on-oci/_template.yaml"
},
"wls-on-oke-marketplace": {
"drawio": "kb/diagram/assets/archcenter-refs/wls-on-oke-marketplace/wls-oke-marketplace-oracle/wls-oke-marketplace.drawio",
"svg": "kb/diagram/assets/archcenter-refs/wls-on-oke-marketplace/wls-oke-marketplace-oracle/wls-oke-marketplace.svg",
"yaml": "kb/diagram/assets/archcenter-refs/wls-on-oke-marketplace/_template.yaml"
}
}
}

View File

@@ -0,0 +1,555 @@
# Auto-extracted absolute_layout template from
# kb/diagram/assets/archcenter-refs/active-data-guard-far-sync-dba-oracle/active-data-guard-far-sync-dba.drawio
# Source: Oracle Architecture Center reference (canonical geometry).
# Use this as the starting scaffold for a new spec — copy, rename ids,
# and replace `type: TODO_identify` on services with the right OCI
# type alias (adb_s, drg, fastconnect, etc.). Container coords and
# edge waypoints are Oracle's canonical layout; preserve unless the
# customer's topology requires a change.
absolute_layout:
canvas:
width: 850
height: 1100
containers:
- id: c1
type: region
label: ''
x: 652
y: 1
w: 676
h: 447
- id: c2
type: region
label: ''
x: 652
y: 585
w: 676
h: 447
- id: c5
type: region
label: ''
x: 965
y: 686
w: 105
h: 36
- id: c50
type: region
label: ''
x: 818
y: 161
w: 99
h: 14
- id: c53
type: region
label: ''
x: 818
y: 855
w: 99
h: 14
- id: c70
type: region
label: ''
x: 1150
y: 377
w: 2
h: 63
- id: c74
type: region
label: ''
x: 1150
y: 657
w: 2
h: 63
- id: c54
type: region
label: ''
x: 776
y: 855
w: 2
h: 50
- id: c58
type: region
label: ''
x: 956
y: 855
w: 2
h: 50
- id: c62
type: region
label: ''
x: 776
y: 161
w: 2
h: 50
- id: c66
type: region
label: ''
x: 956
y: 161
w: 2
h: 50
services:
- id: s3
type: TODO_identify
label: ''
x: 582
y: 34
w: 28
h: 31
- id: s7
type: TODO_identify
label: ''
x: 725
y: 77
w: 42
h: 40
- id: s6
type: TODO_identify
label: ''
x: 726
y: 77
w: 41
h: 39
- id: s8
type: TODO_identify
label: ''
x: 726
y: 78
w: 40
h: 38
- id: s12
type: TODO_identify
label: ''
x: 676
y: 106
w: 41
h: 41
- id: s13
type: TODO_identify
label: ''
x: 676
y: 106
w: 42
h: 42
- id: s14
type: TODO_identify
label: ''
x: 677
y: 120
w: 29
h: 26
- id: s15
type: TODO_identify
label: ''
x: 1260
y: 132
w: 41
h: 41
- id: s16
type: TODO_identify
label: ''
x: 1260
y: 132
w: 42
h: 42
- id: s17
type: TODO_identify
label: ''
x: 1261
y: 146
w: 29
h: 26
- id: s64
type: TODO_identify
label: ''
x: 756
y: 149
w: 42
h: 42
- id: s68
type: TODO_identify
label: ''
x: 936
y: 149
w: 42
h: 42
- id: s63
type: TODO_identify
label: ''
x: 757
y: 150
w: 40
h: 40
- id: s67
type: TODO_identify
label: ''
x: 937
y: 150
w: 40
h: 40
- id: s65
type: TODO_identify
label: ''
x: 758
y: 151
w: 38
h: 38
- id: s69
type: TODO_identify
label: ''
x: 938
y: 151
w: 38
h: 38
- id: s37
type: TODO_identify
label: ''
x: 500
y: 212
w: 48
h: 63
- id: s35
type: TODO_identify
label: ''
x: 1119
y: 212
w: 63
h: 63
- id: s34
type: TODO_identify
label: ''
x: 1120
y: 213
w: 62
h: 62
- id: s36
type: TODO_identify
label: ''
x: 1121
y: 214
w: 60
h: 60
- id: s19
type: TODO_identify
label: ''
x: 676
y: 241
w: 42
h: 42
- id: s18
type: TODO_identify
label: ''
x: 676
y: 242
w: 41
h: 41
- id: s20
type: TODO_identify
label: ''
x: 677
y: 256
w: 29
h: 26
- id: s31
type: TODO_identify
label: ''
x: 107
y: 314
w: 63
h: 63
- id: s30
type: TODO_identify
label: ''
x: 108
y: 315
w: 61
h: 61
- id: s32
type: TODO_identify
label: ''
x: 109
y: 315
w: 60
h: 60
- id: s33
type: TODO_identify
label: ''
x: 129
y: 322
w: 36
h: 41
- id: s72
type: TODO_identify
label: ''
x: 1129
y: 377
w: 42
h: 42
- id: s71
type: TODO_identify
label: ''
x: 1130
y: 378
w: 41
h: 41
- id: s73
type: TODO_identify
label: ''
x: 1130
y: 378
w: 40
h: 40
- id: s43
type: TODO_identify
label: ''
x: 944
y: 466
w: 57
h: 63
- id: s42
type: TODO_identify
label: ''
x: 945
y: 466
w: 55
h: 61
- id: s44
type: TODO_identify
label: ''
x: 946
y: 467
w: 54
h: 60
- id: s45
type: TODO_identify
label: ''
x: 958
y: 485
w: 29
h: 38
- id: s51
type: TODO_identify
label: ''
x: 1130
y: 505
w: 42
h: 29
- id: s52
type: TODO_identify
label: ''
x: 1136
y: 505
w: 29
h: 29
- id: s4
type: TODO_identify
label: ''
x: 582
y: 617
w: 28
h: 31
- id: s76
type: TODO_identify
label: ''
x: 1129
y: 657
w: 42
h: 42
- id: s75
type: TODO_identify
label: ''
x: 1130
y: 658
w: 41
h: 41
- id: s77
type: TODO_identify
label: ''
x: 1130
y: 658
w: 40
h: 40
- id: s10
type: TODO_identify
label: ''
x: 725
y: 661
w: 42
h: 40
- id: s9
type: TODO_identify
label: ''
x: 726
y: 662
w: 41
h: 39
- id: s11
type: TODO_identify
label: ''
x: 726
y: 662
w: 40
h: 38
- id: s22
type: TODO_identify
label: ''
x: 676
y: 690
w: 42
h: 42
- id: s21
type: TODO_identify
label: ''
x: 676
y: 691
w: 41
h: 41
- id: s23
type: TODO_identify
label: ''
x: 677
y: 705
w: 29
h: 26
- id: s24
type: TODO_identify
label: ''
x: 1260
y: 716
w: 41
h: 41
- id: s25
type: TODO_identify
label: ''
x: 1260
y: 716
w: 42
h: 42
- id: s26
type: TODO_identify
label: ''
x: 1261
y: 730
w: 29
h: 26
- id: s39
type: TODO_identify
label: ''
x: 107
y: 745
w: 63
h: 63
- id: s38
type: TODO_identify
label: ''
x: 108
y: 746
w: 61
h: 61
- id: s40
type: TODO_identify
label: ''
x: 109
y: 747
w: 60
h: 60
- id: s41
type: TODO_identify
label: ''
x: 129
y: 753
w: 36
h: 41
- id: s49
type: TODO_identify
label: ''
x: 500
y: 779
w: 48
h: 63
- id: s47
type: TODO_identify
label: ''
x: 1119
y: 821
w: 63
h: 63
- id: s46
type: TODO_identify
label: ''
x: 1120
y: 822
w: 62
h: 62
- id: s48
type: TODO_identify
label: ''
x: 1121
y: 823
w: 60
h: 60
- id: s27
type: TODO_identify
label: ''
x: 676
y: 826
w: 41
h: 41
- id: s28
type: TODO_identify
label: ''
x: 676
y: 826
w: 42
h: 42
- id: s29
type: TODO_identify
label: ''
x: 677
y: 840
w: 29
h: 26
- id: s56
type: TODO_identify
label: ''
x: 756
y: 843
w: 42
h: 42
- id: s60
type: TODO_identify
label: ''
x: 936
y: 843
w: 42
h: 42
- id: s55
type: TODO_identify
label: ''
x: 757
y: 844
w: 40
h: 40
- id: s59
type: TODO_identify
label: ''
x: 937
y: 844
w: 40
h: 40
- id: s57
type: TODO_identify
label: ''
x: 758
y: 845
w: 38
h: 38
- id: s61
type: TODO_identify
label: ''
x: 938
y: 845
w: 38
h: 38
labels: []
connections: []

Binary file not shown.

After

Width:  |  Height:  |  Size: 227 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 135 KiB

View File

@@ -0,0 +1,297 @@
<!DOCTYPE html
SYSTEM "about:legacy-compat">
<html xml:lang="en-us" lang="en-us" class="solution">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="DC.Type" content="topic">
<meta name="DC.Title" content="Learn about Deploying Active Data Guard Far Sync">
<meta name="abstract" content="Oracle Database@Azure enables you to run your mission-critical Oracle databases using Oracle Exadata Database Service on Dedicated Infrastructure in Microsoft Azure's data center.">
<meta name="description" content="Oracle Database@Azure enables you to run your mission-critical Oracle databases using Oracle Exadata Database Service on Dedicated Infrastructure in Microsoft Azure's data center.">
<meta name="copyright" content="(C) Copyrightfr 2025" type="primary">
<meta name="DC.Rights.Owner" content="(C) Copyrightfr 2025" type="primary">
<meta name="copyright" content="(C) Copyrightfr 2025" type="secondary">
<meta name="DC.Rights.Owner" content="(C) Copyrightfr 2025" type="secondary">
<meta name="DC.Date.Created" content="February 2025">
<meta name="DC.Format" content="XHTML">
<meta name="DC.Identifier" content="GUID-D17BA324-11FB-488B-976A-24D25CDFD6BB">
<meta name="DC.Language" content="en-US">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="abstract" content="Oracle Database@Azure enables you to run your mission-critical Oracle databases using Oracle Exadata Database Service on Dedicated Infrastructure in Microsoft Azure's data center.">
<meta name="description" content="Oracle Database@Azure enables you to run your mission-critical Oracle databases using Oracle Exadata Database Service on Dedicated Infrastructure in Microsoft Azure's data center.">
<title>Learn about Deploying Active Data Guard Far Sync</title>
<meta property="og:site_name" content="Oracle Help Center">
<meta property="og:title" content="Deploy Active Data Guard Far Sync to protect data across Oracle Database@Azure regions">
<meta property="og:description" content="Oracle Database@Azure enables you to run your mission-critical Oracle databases using Oracle Exadata Database Service on Dedicated Infrastructure in Microsoft Azure's data center.">
<link rel="stylesheet" href="/sp_common/book-template/ohc-book-template/css/book.css">
<link rel="shortcut icon" href="/sp_common/book-template/ohc-common/img/favicon.ico">
<meta name="application-name" content="Deploy Active Data Guard Far Sync to protect data across Oracle Database@Azure regions">
<meta name="generator" content="DITA Open Toolkit version 1.8.5 (Mode = solution)">
<meta name="plugin" content="SP_docbuilder HTML plugin release 18.2.2">
<meta name="keywords" content="Azure, Compute, Database Services, Oracle Cloud Infrastructure (OCI), Multicloud, Networking">
<link rel="schema.dcterms" href="http://purl.org/dc/terms/">
<meta name="dcterms.created" content="2025-02-20T13:29:14-08:00">
<meta name="dcterms.title" content="Deploy Active Data Guard Far Sync to protect data across Oracle Database@Azure regions">
<meta name="dcterms.dateCopyrighted" content="2025">
<meta name="dcterms.category" content="solutions">
<meta name="dcterms.identifier" content="G24005-02">
<meta name="dcterms.product" content="en/solutions;en/cloud/oracle-cloud-infrastructure/oracle-database-at-azure;en/cloud/paas/exadata-cloud">
<meta name="dcterms.release" content="Test Release">
<link rel="next" href="install-oci-compute-virtual-machines-far-sync.html" title="Next" type="text/html">
<script>
document.write('<style type="text/css">');
document.write('body > .noscript, body > .noscript ~ * { visibility: hidden; }');
document.write('</style>');
</script>
<script data-main="/sp_common/book-template/ohc-book-template/js/book-config" src="/sp_common/book-template/requirejs/require.js"></script>
<script>
if (window.require === undefined) {
document.write('<script data-main="sp_common/book-template/ohc-book-template/js/book-config" src="sp_common/book-template/requirejs/require.js"><\/script>');
document.write('<link href="sp_common/book-template/ohc-book-template/css/book.css" rel="stylesheet"/>');
}
</script>
<script type="application/json" id="ssot-metadata">{"primary":{"category":{"short_name":"solutions","element_name":"Solutions","display_in_url":true},"suite":{"short_name":"develop","element_name":"Develop","display_in_url":false},"product_group":{"short_name":"deployment","element_name":"Deployment","display_in_url":false}}}</script>
<meta name="dcterms.isVersionOf" content="ACTIVE-DATA-GUARD-FAR-SYNC-ORACLE-DB-AT-AZURE">
<script type="application/ld+json"> {"@context":"https://schema.org","@type":"WebPage","name":"Learn about Deploying Active Data Guard Far Sync","description":"Oracle Database@Azure enables you to run your mission-critical Oracle databases using Oracle Exadata Database Service on Dedicated Infrastructure in Microsoft Azure's data center.","datePublished":"2025-02-10 CST","dateModified":"2025-02-20 CST"} </script>
<link rel="alternate" hreflang="en" href="https://docs.oracle.com/en/solutions/active-data-guard-far-sync-oracle-db-at-azure/index.html">
<link rel="alternate" hreflang="ja" href="https://docs.oracle.com/ja/solutions/active-data-guard-far-sync-oracle-db-at-azure/index.html">
<link rel="alternate" hreflang="fr-CA" href="https://docs.oracle.com/fr-ca/solutions/active-data-guard-far-sync-oracle-db-at-azure/index.html">
<link rel="alternate" hreflang="ko" href="https://docs.oracle.com/ko/solutions/active-data-guard-far-sync-oracle-db-at-azure/index.html">
<link rel="alternate" hreflang="es" href="https://docs.oracle.com/es/solutions/active-data-guard-far-sync-oracle-db-at-azure/index.html">
<link rel="alternate" hreflang="it" href="https://docs.oracle.com/it/solutions/active-data-guard-far-sync-oracle-db-at-azure/index.html">
<link rel="alternate" hreflang="fr" href="https://docs.oracle.com/fr/solutions/active-data-guard-far-sync-oracle-db-at-azure/index.html">
<link rel="alternate" hreflang="zh-TW" href="https://docs.oracle.com/zh-tw/solutions/active-data-guard-far-sync-oracle-db-at-azure/index.html">
<link rel="alternate" hreflang="de" href="https://docs.oracle.com/de/solutions/active-data-guard-far-sync-oracle-db-at-azure/index.html">
<link rel="alternate" hreflang="pt-BR" href="https://docs.oracle.com/pt-br/solutions/active-data-guard-far-sync-oracle-db-at-azure/index.html">
<link rel="alternate" hreflang="zh-CN" href="https://docs.oracle.com/zh-cn/solutions/active-data-guard-far-sync-oracle-db-at-azure/index.html">
<link rel="alternate" hreflang="x-default" href="https://docs.oracle.com/en/solutions/active-data-guard-far-sync-oracle-db-at-azure/index.html">
<script>window.ohcglobal || document.write('<script src="/en/dcommon/js/global.js">\x3C/script>')</script></head>
<body>
<div class="noscript alert alert-danger text-center" role="alert">
<a href="index.html" class="pull-left"><span class="glyphicon glyphicon-chevron-left" aria-hidden="true"></span>Previous</a>
<a href="install-oci-compute-virtual-machines-far-sync.html" class="pull-right">Next<span class="glyphicon glyphicon-chevron-right" aria-hidden="true"></span></a>
<span class="fa fa-exclamation-triangle" aria-hidden="true"></span> JavaScript must be enabled to correctly display this content
</div>
<article>
<header>
<ol class="breadcrumb" vocab="http://schema.org/" typeof="BreadcrumbList">
<li property="itemListElement" typeof="ListItem"><a href="index.html" property="item" typeof="WebPage"><span property="name">Deploy Active Data Guard Far Sync to protect data across Oracle Database@Azure regions</span></a></li>
<li class="active" property="itemListElement" typeof="ListItem">Learn about Deploying Active Data Guard Far Sync</li>
</ol>
<a id="GUID-D17BA324-11FB-488B-976A-24D25CDFD6BB" name="GUID-D17BA324-11FB-488B-976A-24D25CDFD6BB"></a>
<h2 id="IAIGF-GUID-D17BA324-11FB-488B-976A-24D25CDFD6BB" class="sect2">Learn about Deploying <span>Active Data Guard Far Sync</span></h2>
</header>
<div class="ind">
<div>
<p><span>Oracle Database@Azure</span> enables you to run your mission-critical Oracle databases using <span>Oracle Exadata Database Service on Dedicated
Infrastructure</span> in <span>Microsoft Azure</span>'s data center.
</p>
<p>Take advantage of the built-in high availability, performance, and
scalability of <span>Oracle Exadata Database
Service</span> and <span>Oracle Real Application Clusters (Oracle
RAC)</span> while benefiting from low latency for <span>Azure</span> applications.
</p>
<p>Extending the architecture with a standby database hosted on another Exadata
virtual machine (VM) cluster provides disaster recovery (DR) protection against database
and cluster failures. Placing the standby in a different <span>Azure</span> availability zone (AZ) further enhances the solution, ensuring protection against an
entire AZ failure. For comprehensive regional disaster recovery, the standby database
should be deployed in a separate region.
</p>
<p><span>Oracle Data Guard</span> enables you to synchronously transport the redo to the standby database to ensure
zero data loss. However, when the standby database is geographically too far, the
latency increases, impacting the commit response time and the transaction throughput at
the primary database. <span>Active Data Guard Far Sync</span> can ensure zero data loss at any distance with minimal impact on the primary database
performance. Far Sync, a lightweight instance, provides synchronous redo protection and
zero data loss fail over without requiring a synchronous local standby database.
</p>
</div>
<div class="sect2"><a id="GUID-48F0D8A9-06D6-411A-AF04-2867963E98D2" name="GUID-48F0D8A9-06D6-411A-AF04-2867963E98D2"></a><h3 id="IAIGF-GUID-48F0D8A9-06D6-411A-AF04-2867963E98D2" class="sect3">Architecture</h3>
<div>
<p>This reference architecture shows a cross-region disaster recovery with <span>Active Data Guard</span>.
</p>
<p>Two <span>Active Data Guard</span> far sync instances are created in the corresponding <span>Oracle Cloud
Infrastructure</span> (OCI) regions. The primary database in Toronto sends the redo data in SYNC mode to
the local far sync instance in Toronto, which forwards the redo data in ASYNC mode to
the standby database in the remote Sydney region.
</p>
<p>After a role switch and the database in Sydney becomes the primary, it sends
the redo data in SYNC mode to its local far sync instance in Sydney, which forwards the
redo data in ASYNC mode to the standby database in the remote Toronto region.</p>
<p>The <span>Oracle Exadata Database
Service</span> on the <span>Oracle Database@Azure</span> network is connected to the Exadata client subnet using a dynamic routing gateway
(DRG) managed by Oracle. A DRG is also required to create a peer connection between VCNs
in different regions. Because only one DRG is allowed per VCN in OCI, a second VCN with
its own DRG is required to connect the primary and standby VCNs in each region.
</p>
<p>The application is replicated across regions to access the database in the same region
and achieve the lowest latency and highest performance.</p>
<p>The following diagram illustrates this reference architecture.</p><br><div class="imageleft"><img class="imageleft" id="GUID-48F0D8A9-06D6-411A-AF04-2867963E98D2__IMAGE_OPD_T33_C2C" height="977" width="1256" src="img/active-data-guard-far-sync-dba.png" alt="Description of active-data-guard-far-sync-dba.png follows" title="Description of active-data-guard-far-sync-dba.png follows" longdesc="img_text/active-data-guard-far-sync-dba.html"><br><a href="img_text/active-data-guard-far-sync-dba.html">Description of the illustration active-data-guard-far-sync-dba.png</a></div><br><p><a href="img/active-data-guard-far-sync-dba-oracle.zip" class="de-download">active-data-guard-far-sync-dba-oracle.zip</a></p>
<p><span>Microsoft Azure</span> provides the following components:
</p>
<ul style="list-style-type: disc;" id="GUID-48F0D8A9-06D6-411A-AF04-2867963E98D2__UL_HZN_W33_C2C">
<li><span class="bold">Azure Region</span><p id="GUID-48F0D8A9-06D6-411A-AF04-2867963E98D2__d5e198">An <span>Azure</span> region is a geographical area in which one or more
physical <span>Azure</span> data centers, called availability zones, reside. Regions
are independent of other regions, and vast distances can
separate them (across countries or even continents).
</p>
<p id="GUID-48F0D8A9-06D6-411A-AF04-2867963E98D2__d5e205"><span>Azure</span> and OCI regions are localized geographic areas. For <span>Oracle Database@Azure</span>, an <span>Azure</span> region is connected to an OCI region, with availability
zones (AZs) in <span>Azure</span> connected to availability domains (ADs) in OCI. <span>Azure</span> and OCI region pairs are selected to minimize distance
and
latency.
</p>
</li>
<li><span class="bold">Azure VNet</span><p id="GUID-48F0D8A9-06D6-411A-AF04-2867963E98D2__d5e267">Microsoft Azure Virtual Network (VNet) is
the fundamental building block for your private network in
Azure. VNet enables many types of Azure resources, such as
Azure virtual machines (VM), to securely communicate with
each other, the internet, and on-premises networks.</p>
</li>
<li><span class="bold">Azure Delegated Subnet</span><p id="GUID-48F0D8A9-06D6-411A-AF04-2867963E98D2__d5e280">Subnet delegation is
Microsoft's ability to inject a managed service,
specifically a platform-as-a-service (PaaS) service,
directly into your virtual network. This allows you to
designate or delegate a subnet to be a home for an external
managed service inside of your virtual network, such that
external service acts as a virtual network resource, even
though it is an external PaaS service.</p>
</li>
<li><span class="bold">Azure VNIC</span><p id="GUID-48F0D8A9-06D6-411A-AF04-2867963E98D2__d5e273">The services in Azure
data centers have physical network interface cards (NICs).
Virtual machine instances communicate using virtual NICs
(VNICs) associated with the physical NICs. Each instance has
a primary VNIC that's automatically created and attached
during launch and is available during the instance's
lifetime.</p>
</li>
</ul>
<p><span>Oracle Cloud
Infrastructure</span> provides the following components:
</p>
<ul style="list-style-type: disc;" id="GUID-48F0D8A9-06D6-411A-AF04-2867963E98D2__UL_FMY_1J3_C2C">
<li><span class="bold">Region</span><p id="GUID-48F0D8A9-06D6-411A-AF04-2867963E98D2__d204e1136">An <span>Oracle Cloud
Infrastructure</span> region is a localized geographic area that contains one or more data centers, called availability domains. Regions are independent of other regions, and vast distances can separate them (across countries or even continents).
</p>
</li>
<li><span class="bold">Virtual cloud network (VCN) and subnet</span><p id="GUID-48F0D8A9-06D6-411A-AF04-2867963E98D2__d204e1268">A VCN is a customizable, software-defined network that you set up in an <span>Oracle Cloud
Infrastructure</span> region. Like traditional data center networks, VCNs give you control over your network environment. A VCN can have multiple non-overlapping CIDR blocks that you can change after you create the VCN. You can segment a VCN into subnets, which can be scoped to a region or to an availability domain. Each subnet consists of a contiguous range of addresses that don't overlap with the other subnets in the VCN. You can change the size of a subnet after creation. A subnet can be public or private.
</p>
</li>
<li><span class="bold">Route table</span><p id="GUID-48F0D8A9-06D6-411A-AF04-2867963E98D2__d204e1159">Virtual route tables contain rules to route traffic from subnets to destinations outside a VCN, typically through gateways.</p>
</li>
<li><span class="bold">Security list</span><p id="GUID-48F0D8A9-06D6-411A-AF04-2867963E98D2__d204e1165">For each subnet, you can create security rules that specify the source, destination, and type of traffic that must be allowed in and out of the subnet.</p>
</li>
<li><span class="bold">Dynamic routing gateway (DRG)</span><p id="GUID-48F0D8A9-06D6-411A-AF04-2867963E98D2__d204e437">The DRG is a virtual router that provides a path for private network traffic between VCNs in the same region, between a VCN and a network outside the region, such as a VCN in another <span>Oracle Cloud
Infrastructure</span> region, an on-premises network, or a network in another cloud provider.
</p>
</li>
<li><span class="bold">Local peering gateway (LPG)</span><p>An LPG enables you to peer one VCN with another
VCN in the same region. Peering means the VCNs communicate using private IP
addresses, without the traffic traversing the internet or routing through your
on-premises network.</p>
</li>
<li><span class="bold">Data Guard</span><p id="GUID-48F0D8A9-06D6-411A-AF04-2867963E98D2__d204e285"><span>Oracle Data Guard</span> and Oracle Active Data Guard provide a comprehensive set of services that create, maintain, manage, and monitor one or more standby databases and that enable production Oracle databases to remain available without interruption. <span>Oracle Data Guard</span> maintains these standby databases as copies of the production database by using in-memory replication. If the production database becomes unavailable due to a planned or an unplanned outage, <span>Oracle Data Guard</span> can switch any standby database to the production role, minimizing the downtime associated with the outage. Oracle Active Data Guard provides the additional ability to offload read-mostly workloads to standby databases and also provides advanced data protection features.
</p>
</li>
<li><span class="bold"><span>Active Data Guard Far Sync</span></span><p>Oracle <span>Active Data Guard Far Sync</span> is a lightweight Oracle database instance that receives redo data
synchronously from the primary database and forwards it asynchronously to one or
more standby databases. It ensures zero data loss at any distance with minimal
impact on the primary database performance and without requiring a local
synchronous standby database.
</p>
</li>
<li><span class="bold">Exadata Database Service on Dedicated Infrastructure</span><p id="GUID-48F0D8A9-06D6-411A-AF04-2867963E98D2__d204e499"><span>Oracle Exadata Database Service on Dedicated
Infrastructure</span> enables you to leverage the power of Exadata in
the cloud. <span>Oracle Exadata Database
Service</span> delivers proven <span>Oracle Database</span> capabilities on purpose-built, optimized Oracle
Exadata infrastructure in the public cloud.
Built-in cloud automation, elastic resource
scaling, security, and fast performance for all
<span>Oracle Database</span> workloads helps you simplify management and
reduce costs.
</p>
</li>
<li><span class="bold"><span>Oracle Database@Azure</span></span><p id="GUID-48F0D8A9-06D6-411A-AF04-2867963E98D2__d204e918"><span>Oracle Database@Azure</span> is the Oracle Database service (<span>Oracle Exadata Database Service on Dedicated
Infrastructure</span> and <span>Oracle Autonomous Database Serverless</span>) running on <span>Oracle Cloud
Infrastructure</span> (OCI), deployed in Microsoft Azure data centers. The service offers features and price parity with OCI. Purchase the service on Azure Marketplace.
</p>
<p id="GUID-48F0D8A9-06D6-411A-AF04-2867963E98D2__d204e927"><span>Oracle Database@Azure</span> integrates <span>Oracle Exadata Database
Service</span>, <span>Oracle Real Application Clusters (Oracle
RAC)</span>, and <span>Oracle Data Guard</span> technologies into the Azure platform. Users manage the service on the Azure console and with Azure automation tools. The service is deployed in Azure Virtual Network (VNet) and integrated with the Azure identity and access management system. The OCI and <span>Oracle Database</span> generic metrics and audit logs are natively available in Azure. The service requires users to have an Azure subscription and an OCI tenancy.
</p>
<p id="GUID-48F0D8A9-06D6-411A-AF04-2867963E98D2__d204e938"><span>Autonomous Database</span> is built on Oracle Exadata infrastructure, is self-managing, self-securing, and self-repairing, helping eliminate manual database management and human errors. <span>Autonomous Database</span> enables development of scalable AI-powered apps with any data using built-in AI capabilities using your choice of large language model (LLM) and deployment location.
</p>
<p id="GUID-48F0D8A9-06D6-411A-AF04-2867963E98D2__d204e943">Both <span>Oracle Exadata Database
Service</span> and <span>Oracle Autonomous Database Serverless</span> are easily provisioned through the native Azure Portal, enabling access to the broader Azure ecosystem.
</p>
</li>
</ul>
</div>
</div>
<div class="sect2"><a id="GUID-DC67E72F-8C19-4792-9AFF-DE6DDBC968B8" name="GUID-DC67E72F-8C19-4792-9AFF-DE6DDBC968B8"></a><h3 id="IAIGF-GUID-DC67E72F-8C19-4792-9AFF-DE6DDBC968B8" class="sect3">Recommendations</h3>
<div>
<div><span>Use the following recommendations as a starting point.
</span>Your requirements might differ from the architecture described here.
</div>
<ul style="list-style-type: disc;" id="GUID-DC67E72F-8C19-4792-9AFF-DE6DDBC968B8__UL_FWK_JBG_RKB">
<li>The far sync instance should be far enough from the primary database to
ensure it cant be affected by the same failure or disaster but close enough to
minimize the network latency.</li>
<li>Create two far sync instances per region for high availability. Without
an alternate far sync instance, or if all far sync instances in the primary region
are unavailable, the <span>Oracle Data Guard</span> redo transport will be directly shipped to the standby database in ASYNC mode,
affecting the zero data loss protection, and, depending on the configuration and
distance, it might result in transport lag further impacting RPO.
</li>
<li>As the storage performance of the far sync instance is critical, the
IOPS capacity should be adequate to support the workload. The far sync instance's
storage should have an IOPS performance equal to or better than the primary
database's online redo logs storage.</li>
<li>Use <span>Oracle Data Guard</span> across regions for the databases provisioned in the Exadata VM cluster on <span>Oracle Database@Azure</span> by using an OCI Managed network.
</li>
</ul>
</div>
</div>
<div class="sect2"><a id="GUID-BE8EBF3A-9557-4952-B79B-35AABA5ED0D7" name="GUID-BE8EBF3A-9557-4952-B79B-35AABA5ED0D7"></a><h3 id="IAIGF-GUID-BE8EBF3A-9557-4952-B79B-35AABA5ED0D7" class="sect3">Considerations for Cross-Regional
Disaster Recovery</h3>
<div>
<p>When performing cross-regional disaster recovery for <span>Oracle Exadata Database
Service</span> on <span>Oracle Database@Azure</span>, consider the following.
</p>
<ul style="list-style-type: disc;" id="GUID-BE8EBF3A-9557-4952-B79B-35AABA5ED0D7__UL_AVT_VJ3_C2C">
<li><span>Oracle Cloud
Infrastructure</span> is the preferred network for achieving better performance, measured by latency
and throughput, and for reducing costs, as the first 10 TB/Month are free.
</li>
<li>Far sync is a lightweight instance. However, disk performance is
critical as far sync writes the received redo to disk before acknowledging back to
the primary, which might impact the application performance.</li>
<li>The network performance of the far sync instance is critical for heavy
workloads.</li>
<li>With multiple standby databases and far sync instances, the
configuration might get more complicated. Use the <span>Active Data Guard</span> broker RedoRoutes property to simplify the definition of how redo is transported
to the various destinations.
</li>
<li>Using far sync requires the <span>Active Data Guard</span> option.
</li>
</ul>
</div>
</div>
</div>
</article>
<div id="disclaimers" class="legal">
<div><a href="#copyright-information" role="button" data-toggle="collapse" aria-expanded="false" class="collapsed" aria-controls="copyright-information" id="copyright-information-btn">Title and Copyright Information</a></div>
<div class="collapse" id="copyright-information" aria-expanded="false">
<p class="legal">Deploy Active Data Guard Far Sync to protect data across Oracle Database@Azure regions</p>
<p class="legal">G24005-02</p>
<p class="date legal">February 2025</p>
<div class="legal" style="display:inline"><a href="/pls/topic/lookup?ctx=en/legal&id=cpyr" target="_blank">Copyright ©</a>2025, </div><div class="legal" style="display:inline">Oracle and/or its affiliates.</div>
</div>
</div>
</body>
</html>

View File

@@ -0,0 +1,198 @@
# Deploy Active Data Guard Far Sync to protect data across Oracle Database@Azure regions
- Source: https://docs.oracle.com/en/solutions/active-data-guard-far-sync-oracle-db-at-azure/index.html
- Date: 2025-02
- Type: reference-architecture
- Services: exacs, adg, azure
- Tags: database, multicloud, azure, ha-dr
## Summary (catalog)
Far Sync instance for zero data loss protection across Azure regions. Synchronous redo transport to Far Sync, async to remote standby. Eliminates performance impact of synchronous shipping over long distances.
## Architecture (fetched from source)
Architecture
This reference architecture shows a cross-region disaster recovery with Active Data Guard .
Two Active Data Guard far sync instances are created in the corresponding Oracle Cloud
Infrastructure (OCI) regions. The primary database in Toronto sends the redo data in SYNC mode to
the local far sync instance in Toronto, which forwards the redo data in ASYNC mode to
the standby database in the remote Sydney region.
After a role switch and the database in Sydney becomes the primary, it sends
the redo data in SYNC mode to its local far sync instance in Sydney, which forwards the
redo data in ASYNC mode to the standby database in the remote Toronto region.
The Oracle Exadata Database
Service on the Oracle Database@Azure network is connected to the Exadata client subnet using a dynamic routing gateway
(DRG) managed by Oracle. A DRG is also required to create a peer connection between VCNs
in different regions. Because only one DRG is allowed per VCN in OCI, a second VCN with
its own DRG is required to connect the primary and standby VCNs in each region.
The application is replicated across regions to access the database in the same region
and achieve the lowest latency and highest performance.
The following diagram illustrates this reference architecture.
Description of the illustration active-data-guard-far-sync-dba.png
active-data-guard-far-sync-dba-oracle.zip
Microsoft Azure provides the following components:
- Azure Region
An Azure region is a geographical area in which one or more
physical Azure data centers, called availability zones, reside. Regions
are independent of other regions, and vast distances can
separate them (across countries or even continents).
Azure and OCI regions are localized geographic areas. For Oracle Database@Azure , an Azure region is connected to an OCI region, with availability
zones (AZs) in Azure connected to availability domains (ADs) in OCI. Azure and OCI region pairs are selected to minimize distance
and
latency.
- Azure VNet
Microsoft Azure Virtual Network (VNet) is
the fundamental building block for your private network in
Azure. VNet enables many types of Azure resources, such as
Azure virtual machines (VM), to securely communicate with
each other, the internet, and on-premises networks.
- Azure Delegated Subnet
Subnet delegation is
Microsoft's ability to inject a managed service,
specifically a platform-as-a-service (PaaS) service,
directly into your virtual network. This allows you to
designate or delegate a subnet to be a home for an external
managed service inside of your virtual network, such that
external service acts as a virtual network resource, even
though it is an external PaaS service.
- Azure VNIC
The services in Azure
data centers have physical network interface cards (NICs).
Virtual machine instances communicate using virtual NICs
(VNICs) associated with the physical NICs. Each instance has
a primary VNIC that's automatically created and attached
during launch and is available during the instance's
lifetime.
Oracle Cloud
Infrastructure provides the following components:
- Region
An Oracle Cloud
Infrastructure region is a localized geographic area that contains one or more data centers, called availability domains. Regions are independent of other regions, and vast distances can separate them (across countries or even continents).
- Virtual cloud network (VCN) and subnet
A VCN is a customizable, software-defined network that you set up in an Oracle Cloud
Infrastructure region. Like traditional data center networks, VCNs give you control over your network environment. A VCN can have multiple non-overlapping CIDR blocks that you can change after you create the VCN. You can segment a VCN into subnets, which can be scoped to a region or to an availability domain. Each subnet consists of a contiguous range of addresses that don't overlap with the other subnets in the VCN. You can change the size of a subnet after creation. A subnet can be public or private.
- Route table
Virtual route tables contain rules to route traffic from subnets to destinations outside a VCN, typically through gateways.
- Security list
For each subnet, you can create security rules that specify the source, destination, and type of traffic that must be allowed in and out of the subnet.
- Dynamic routing gateway (DRG)
The DRG is a virtual router that provides a path for private network traffic between VCNs in the same region, between a VCN and a network outside the region, such as a VCN in another Oracle Cloud
Infrastructure region, an on-premises network, or a network in another cloud provider.
- Local peering gateway (LPG)
An LPG enables you to peer one VCN with another
VCN in the same region. Peering means the VCNs communicate using private IP
addresses, without the traffic traversing the internet or routing through your
on-premises network.
- Data Guard
Oracle Data Guard and Oracle Active Data Guard provide a comprehensive set of services that create, maintain, manage, and monitor one or more standby databases and that enable production Oracle databases to remain available without interruption. Oracle Data Guard maintains these standby databases as copies of the production database by using in-memory replication. If the production database becomes unavailable due to a planned or an unplanned outage, Oracle Data Guard can switch any standby database to the production role, minimizing the downtime associated with the outage. Oracle Active Data Guard provides the additional ability to offload read-mostly workloads to standby databases and also provides advanced data protection features.
- Active Data Guard Far Sync
Oracle Active Data Guard Far Sync is a lightweight Oracle database instance that receives redo data
synchronously from the primary database and forwards it asynchronously to one or
more standby databases. It ensures zero data loss at any distance with minimal
impact on the primary database performance and without requiring a local
synchronous standby database.
- Exadata Database Service on Dedicated Infrastructure
Oracle Exadata Database Service on Dedicated
Infrastructure enables you to leverage the power of Exadata in
the cloud. Oracle Exadata Database
Service delivers proven Oracle Database capabilities on purpose-built, optimized Oracle
Exadata infrastructure in the public cloud.
Built-in cloud automation, elastic resource
scaling, security, and fast performance for all
Oracle Database workloads helps you simplify management and
reduce costs.
- Oracle Database@Azure
Oracle Database@Azure is the Oracle Database service ( Oracle Exadata Database Service on Dedicated
Infrastructure and Oracle Autonomous Database Serverless ) running on Oracle Cloud
Infrastructure (OCI), deployed in Microsoft Azure data centers. The service offers features and price parity with OCI. Purchase the service on Azure Marketplace.
Oracle Database@Azure integrates Oracle Exadata Database
Service , Oracle Real Application Clusters (Oracle
RAC) , and Oracle Data Guard technologies into the Azure platform. Users manage the service on the Azure console and with Azure automation tools. The service is deployed in Azure Virtual Network (VNet) and integrated with the Azure identity and access management system. The OCI and Oracle Database generic metrics and audit logs are natively available in Azure. The service requires users to have an Azure subscription and an OCI tenancy.
Autonomous Database is built on Oracle Exadata infrastructure, is self-managing, self-securing, and self-repairing, helping eliminate manual database management and human errors. Autonomous Database enables development of scalable AI-powered apps with any data using built-in AI capabilities using your choice of large language model (LLM) and deploymen

View File

@@ -0,0 +1,555 @@
# Auto-extracted absolute_layout template from
# kb/diagram/assets/archcenter-refs/active-data-guard-far-sync-oracle-db-at-azure/active-data-guard-far-sync-dba-oracle/active-data-guard-far-sync-dba.drawio
# Source: Oracle Architecture Center reference (canonical geometry).
# Use this as the starting scaffold for a new spec — copy, rename ids,
# and replace `type: TODO_identify` on services with the right OCI
# type alias (adb_s, drg, fastconnect, etc.). Container coords and
# edge waypoints are Oracle's canonical layout; preserve unless the
# customer's topology requires a change.
absolute_layout:
canvas:
width: 850
height: 1100
containers:
- id: c1
type: region
label: ''
x: 652
y: 1
w: 676
h: 447
- id: c2
type: region
label: ''
x: 652
y: 585
w: 676
h: 447
- id: c5
type: region
label: ''
x: 965
y: 686
w: 105
h: 36
- id: c50
type: region
label: ''
x: 818
y: 161
w: 99
h: 14
- id: c53
type: region
label: ''
x: 818
y: 855
w: 99
h: 14
- id: c70
type: region
label: ''
x: 1150
y: 377
w: 2
h: 63
- id: c74
type: region
label: ''
x: 1150
y: 657
w: 2
h: 63
- id: c54
type: region
label: ''
x: 776
y: 855
w: 2
h: 50
- id: c58
type: region
label: ''
x: 956
y: 855
w: 2
h: 50
- id: c62
type: region
label: ''
x: 776
y: 161
w: 2
h: 50
- id: c66
type: region
label: ''
x: 956
y: 161
w: 2
h: 50
services:
- id: s3
type: TODO_identify
label: ''
x: 582
y: 34
w: 28
h: 31
- id: s7
type: TODO_identify
label: ''
x: 725
y: 77
w: 42
h: 40
- id: s6
type: TODO_identify
label: ''
x: 726
y: 77
w: 41
h: 39
- id: s8
type: TODO_identify
label: ''
x: 726
y: 78
w: 40
h: 38
- id: s12
type: TODO_identify
label: ''
x: 676
y: 106
w: 41
h: 41
- id: s13
type: TODO_identify
label: ''
x: 676
y: 106
w: 42
h: 42
- id: s14
type: TODO_identify
label: ''
x: 677
y: 120
w: 29
h: 26
- id: s15
type: TODO_identify
label: ''
x: 1260
y: 132
w: 41
h: 41
- id: s16
type: TODO_identify
label: ''
x: 1260
y: 132
w: 42
h: 42
- id: s17
type: TODO_identify
label: ''
x: 1261
y: 146
w: 29
h: 26
- id: s64
type: TODO_identify
label: ''
x: 756
y: 149
w: 42
h: 42
- id: s68
type: TODO_identify
label: ''
x: 936
y: 149
w: 42
h: 42
- id: s63
type: TODO_identify
label: ''
x: 757
y: 150
w: 40
h: 40
- id: s67
type: TODO_identify
label: ''
x: 937
y: 150
w: 40
h: 40
- id: s65
type: TODO_identify
label: ''
x: 758
y: 151
w: 38
h: 38
- id: s69
type: TODO_identify
label: ''
x: 938
y: 151
w: 38
h: 38
- id: s37
type: TODO_identify
label: ''
x: 500
y: 212
w: 48
h: 63
- id: s35
type: TODO_identify
label: ''
x: 1119
y: 212
w: 63
h: 63
- id: s34
type: TODO_identify
label: ''
x: 1120
y: 213
w: 62
h: 62
- id: s36
type: TODO_identify
label: ''
x: 1121
y: 214
w: 60
h: 60
- id: s19
type: TODO_identify
label: ''
x: 676
y: 241
w: 42
h: 42
- id: s18
type: TODO_identify
label: ''
x: 676
y: 242
w: 41
h: 41
- id: s20
type: TODO_identify
label: ''
x: 677
y: 256
w: 29
h: 26
- id: s31
type: TODO_identify
label: ''
x: 107
y: 314
w: 63
h: 63
- id: s30
type: TODO_identify
label: ''
x: 108
y: 315
w: 61
h: 61
- id: s32
type: TODO_identify
label: ''
x: 109
y: 315
w: 60
h: 60
- id: s33
type: TODO_identify
label: ''
x: 129
y: 322
w: 36
h: 41
- id: s72
type: TODO_identify
label: ''
x: 1129
y: 377
w: 42
h: 42
- id: s71
type: TODO_identify
label: ''
x: 1130
y: 378
w: 41
h: 41
- id: s73
type: TODO_identify
label: ''
x: 1130
y: 378
w: 40
h: 40
- id: s43
type: TODO_identify
label: ''
x: 944
y: 466
w: 57
h: 63
- id: s42
type: TODO_identify
label: ''
x: 945
y: 466
w: 55
h: 61
- id: s44
type: TODO_identify
label: ''
x: 946
y: 467
w: 54
h: 60
- id: s45
type: TODO_identify
label: ''
x: 958
y: 485
w: 29
h: 38
- id: s51
type: TODO_identify
label: ''
x: 1130
y: 505
w: 42
h: 29
- id: s52
type: TODO_identify
label: ''
x: 1136
y: 505
w: 29
h: 29
- id: s4
type: TODO_identify
label: ''
x: 582
y: 617
w: 28
h: 31
- id: s76
type: TODO_identify
label: ''
x: 1129
y: 657
w: 42
h: 42
- id: s75
type: TODO_identify
label: ''
x: 1130
y: 658
w: 41
h: 41
- id: s77
type: TODO_identify
label: ''
x: 1130
y: 658
w: 40
h: 40
- id: s10
type: TODO_identify
label: ''
x: 725
y: 661
w: 42
h: 40
- id: s9
type: TODO_identify
label: ''
x: 726
y: 662
w: 41
h: 39
- id: s11
type: TODO_identify
label: ''
x: 726
y: 662
w: 40
h: 38
- id: s22
type: TODO_identify
label: ''
x: 676
y: 690
w: 42
h: 42
- id: s21
type: TODO_identify
label: ''
x: 676
y: 691
w: 41
h: 41
- id: s23
type: TODO_identify
label: ''
x: 677
y: 705
w: 29
h: 26
- id: s24
type: TODO_identify
label: ''
x: 1260
y: 716
w: 41
h: 41
- id: s25
type: TODO_identify
label: ''
x: 1260
y: 716
w: 42
h: 42
- id: s26
type: TODO_identify
label: ''
x: 1261
y: 730
w: 29
h: 26
- id: s39
type: TODO_identify
label: ''
x: 107
y: 745
w: 63
h: 63
- id: s38
type: TODO_identify
label: ''
x: 108
y: 746
w: 61
h: 61
- id: s40
type: TODO_identify
label: ''
x: 109
y: 747
w: 60
h: 60
- id: s41
type: TODO_identify
label: ''
x: 129
y: 753
w: 36
h: 41
- id: s49
type: TODO_identify
label: ''
x: 500
y: 779
w: 48
h: 63
- id: s47
type: TODO_identify
label: ''
x: 1119
y: 821
w: 63
h: 63
- id: s46
type: TODO_identify
label: ''
x: 1120
y: 822
w: 62
h: 62
- id: s48
type: TODO_identify
label: ''
x: 1121
y: 823
w: 60
h: 60
- id: s27
type: TODO_identify
label: ''
x: 676
y: 826
w: 41
h: 41
- id: s28
type: TODO_identify
label: ''
x: 676
y: 826
w: 42
h: 42
- id: s29
type: TODO_identify
label: ''
x: 677
y: 840
w: 29
h: 26
- id: s56
type: TODO_identify
label: ''
x: 756
y: 843
w: 42
h: 42
- id: s60
type: TODO_identify
label: ''
x: 936
y: 843
w: 42
h: 42
- id: s55
type: TODO_identify
label: ''
x: 757
y: 844
w: 40
h: 40
- id: s59
type: TODO_identify
label: ''
x: 937
y: 844
w: 40
h: 40
- id: s57
type: TODO_identify
label: ''
x: 758
y: 845
w: 38
h: 38
- id: s61
type: TODO_identify
label: ''
x: 938
y: 845
w: 38
h: 38
labels: []
connections: []

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 135 KiB

View File

@@ -0,0 +1,7 @@
The diagram you downloaded is available in these formats:
- DRAWIO
- SVG
You can customize them for your organization using the associated tools:
- For DRAWIO format, use draw.io for Confluence, online at diagrams.net, or the desktop app. Go to diagrams.net for more information.
- For SVG format, use an SVG editor such as Inkscape or Sketsa SVG Editor, which are free and available for Windows, macOS, Linux.

View File

@@ -0,0 +1,290 @@
<!DOCTYPE html
SYSTEM "about:legacy-compat">
<html xml:lang="en-us" lang="en-us" class="solution">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="DC.Type" content="concept">
<meta name="DC.Title" content="Deploy Oracle Autonomous Database on Oracle Database@Azure">
<meta name="abstract" content="Provision Oracle Autonomous Database as a highly resilient data store for a micro-services application deployed within a multi-availability zone Microsoft Azure region.">
<meta name="description" content="Provision Oracle Autonomous Database as a highly resilient data store for a micro-services application deployed within a multi-availability zone Microsoft Azure region.">
<meta name="copyright" content="(C) Copyrightfr 2024" type="primary">
<meta name="DC.Rights.Owner" content="(C) Copyrightfr 2024" type="primary">
<meta name="copyright" content="(C) Copyrightfr 2024" type="secondary">
<meta name="DC.Rights.Owner" content="(C) Copyrightfr 2024" type="secondary">
<meta name="DC.Date.Created" content="October 2024">
<meta name="DC.Format" content="XHTML">
<meta name="DC.Identifier" content="GUID-23EC4595-5EC2-4599-B574-1998B3409D9E">
<meta name="DC.Language" content="en-US">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="abstract" content="Provision Oracle Autonomous Database as a highly resilient data store for a micro-services application deployed within a multi-availability zone Microsoft Azure region.">
<meta name="description" content="Provision Oracle Autonomous Database as a highly resilient data store for a micro-services application deployed within a multi-availability zone Microsoft Azure region.">
<title>Deploy Oracle Autonomous Database on Oracle Database@Azure</title>
<meta property="og:site_name" content="Oracle Help Center">
<meta property="og:title" content="Deploy Autonomous Database on Oracle Database@Azure">
<meta property="og:description" content="Provision Oracle Autonomous Database as a highly resilient data store for a micro-services application deployed within a multi-availability zone Microsoft Azure region.">
<link rel="stylesheet" href="/sp_common/book-template/ohc-book-template/css/book.css">
<link rel="shortcut icon" href="/sp_common/book-template/ohc-common/img/favicon.ico">
<meta name="application-name" content="Deploy Autonomous Database on Oracle Database@Azure">
<meta name="generator" content="DITA Open Toolkit version 1.8.5 (Mode = solution)">
<meta name="plugin" content="SP_docbuilder HTML plugin release 18.2.2">
<meta name="keywords" content="AI and Machine Learning,Database,Azure,HA/DR,Serverless,Multicloud">
<link rel="schema.dcterms" href="http://purl.org/dc/terms/">
<meta name="dcterms.created" content="2024-10-07T17:04:33-07:00">
<meta name="dcterms.title" content="Deploy Autonomous Database on Oracle Database@Azure">
<meta name="dcterms.dateCopyrighted" content="2024">
<meta name="dcterms.category" content="solutions">
<meta name="dcterms.identifier" content="G13089-02">
<meta name="dcterms.product" content="en/solutions;en/cloud/saas/analytics;en/cloud/paas/autonomous-data-warehouse-cloud;en/cloud/paas/autonomous-database/serverless;en/cloud/paas/atp-cloud;en/cloud/oracle-cloud-infrastructure/oracle-database-at-azure;en/cloud/paas/autonomous-json-database">
<meta name="dcterms.release" content="Test Release">
<script>
document.write('<style type="text/css">');
document.write('body > .noscript, body > .noscript ~ * { visibility: hidden; }');
document.write('</style>');
</script>
<script data-main="/sp_common/book-template/ohc-book-template/js/book-config" src="/sp_common/book-template/requirejs/require.js"></script>
<script>
if (window.require === undefined) {
document.write('<script data-main="sp_common/book-template/ohc-book-template/js/book-config" src="sp_common/book-template/requirejs/require.js"><\/script>');
document.write('<link href="sp_common/book-template/ohc-book-template/css/book.css" rel="stylesheet"/>');
}
</script>
<script type="application/json" id="ssot-metadata">{"primary":{"category":{"short_name":"solutions","element_name":"Solutions","display_in_url":true},"suite":{"short_name":"reference-architectures","element_name":"Reference Architectures","display_in_url":false},"product_group":{"short_name":"oci","element_name":"OCI Architectures","display_in_url":false}}}</script>
<meta name="dcterms.isVersionOf" content="DEPLOY-AUTONOMOUS-DATABASE-DB-AT-AZURE">
<script type="application/ld+json"> {"@context":"https://schema.org","@type":"WebPage","name":"Deploy Oracle Autonomous Database on Oracle Database@Azure","description":"Provision Oracle Autonomous Database as a highly resilient data store for a micro-services application deployed within a multi-availability zone Microsoft Azure region.","datePublished":"2024-10-07 22:50:46 GMT","dateModified":"2024-10-08 00:07:25 GMT"} </script>
<link rel="alternate" hreflang="en" href="https://docs.oracle.com/en/solutions/deploy-autonomous-database-db-at-azure/index.html">
<link rel="alternate" hreflang="de" href="https://docs.oracle.com/de/solutions/deploy-autonomous-database-db-at-azure/index.html">
<link rel="alternate" hreflang="es" href="https://docs.oracle.com/es/solutions/deploy-autonomous-database-db-at-azure/index.html">
<link rel="alternate" hreflang="fr-CA" href="https://docs.oracle.com/fr-ca/solutions/deploy-autonomous-database-db-at-azure/index.html">
<link rel="alternate" hreflang="zh-CN" href="https://docs.oracle.com/zh-cn/solutions/deploy-autonomous-database-db-at-azure/index.html">
<link rel="alternate" hreflang="ja" href="https://docs.oracle.com/ja/solutions/deploy-autonomous-database-db-at-azure/index.html">
<link rel="alternate" hreflang="fr" href="https://docs.oracle.com/fr/solutions/deploy-autonomous-database-db-at-azure/index.html">
<link rel="alternate" hreflang="it" href="https://docs.oracle.com/it/solutions/deploy-autonomous-database-db-at-azure/index.html">
<link rel="alternate" hreflang="pt-BR" href="https://docs.oracle.com/pt-br/solutions/deploy-autonomous-database-db-at-azure/index.html">
<link rel="alternate" hreflang="ko" href="https://docs.oracle.com/ko/solutions/deploy-autonomous-database-db-at-azure/index.html">
<link rel="alternate" hreflang="zh-TW" href="https://docs.oracle.com/zh-tw/solutions/deploy-autonomous-database-db-at-azure/index.html">
<link rel="alternate" hreflang="x-default" href="https://docs.oracle.com/en/solutions/deploy-autonomous-database-db-at-azure/index.html">
<script>window.ohcglobal || document.write('<script src="/en/dcommon/js/global.js">\x3C/script>')</script></head>
<body>
<div class="noscript alert alert-danger text-center" role="alert">
<a href="index.html" class="pull-left"><span class="glyphicon glyphicon-chevron-left" aria-hidden="true"></span>Previous</a>
<a href="#" class="pull-right">Next<span class="glyphicon glyphicon-chevron-right" aria-hidden="true"></span></a>
<span class="fa fa-exclamation-triangle" aria-hidden="true"></span> JavaScript must be enabled to correctly display this content
</div>
<article>
<header>
<ol class="breadcrumb" vocab="http://schema.org/" typeof="BreadcrumbList">
<li property="itemListElement" typeof="ListItem"><a href="index.html" property="item" typeof="WebPage"><span property="name">Deploy Autonomous Database on Oracle Database@Azure</span></a></li>
<li class="active" property="itemListElement" typeof="ListItem">Deploy Oracle Autonomous Database on Oracle Database@Azure</li>
</ol>
<a id="GUID-23EC4595-5EC2-4599-B574-1998B3409D9E" name="GUID-23EC4595-5EC2-4599-B574-1998B3409D9E"></a>
<h2 id="DADZD-GUID-23EC4595-5EC2-4599-B574-1998B3409D9E" class="sect2">Deploy <span>Oracle Autonomous Database</span> on <span>Oracle Database@Azure</span></h2>
</header>
<div class="ind">
<div>
<p>Provision <span>Oracle Autonomous Database</span> as a highly resilient data store for a micro-services application deployed within a
multi-availability zone Microsoft Azure region.
</p>
<p>Oracle databases provide enterprise-level business continuity by layering
core building blocks like Exadata, <span>Oracle Real Application Clusters (Oracle
RAC)</span>, <span>Data Guard</span>, and Oracle Application Continuity together. To date, these core building blocks
could be configured manually in on-premises environments, semi-manually on <span>Oracle Cloud
Infrastructure</span> (OCI) using the <span>Oracle Exadata Database
Service</span>, or be fully automated using the <span>Oracle Autonomous Database</span> service. The fully managed <span>Oracle Autonomous Database</span> service is now available in an increasing number of <span>Microsoft Azure</span> regions across the globe.
</p>
<p>Many <span>Azure</span> cloud regions provide multiple available zones (AZs) to help maximize business
continuity. These availability zones are unique physical locations that help protect
applications and data from data center failures.
</p>
</div>
<div class="sect2"><a id="GUID-1548A5AA-D6B9-4DAD-AE43-7162769AD34B" name="GUID-1548A5AA-D6B9-4DAD-AE43-7162769AD34B"></a><h3 id="DADZD-GUID-1548A5AA-D6B9-4DAD-AE43-7162769AD34B" class="sect3">Architecture</h3>
<div>
<p>This reference architecture describes some best practices for deploying <span>Oracle Autonomous Database</span> in a <span>Microsoft Azure</span> multi-availability zone (AZ) region.
</p>
<p>Business continuity practices and high availability topologies should always be
considered when designing mission-critical database applications. The architecture below
shows a containerized application using <span>Azure Kubernetes Service</span> (AKS). The container images are stored in the <span>Azure</span> container registry. Users access the application externally through a public load
balancer. Since <span>Oracle Autonomous Database</span> is a PaaS service, there is no administrative control over into which AZ the
Autonomous Database will be provisioned. However, in the unlikely event of an <span>Azure</span> AZ failure, Oracle ensures that a local Autonomous Data Guard standby is always
deployed in a different AZ (data center) from its primary.
</p>
<div class="infoboxnote" id="GUID-1548A5AA-D6B9-4DAD-AE43-7162769AD34B__GUID-5DE78187-7A03-49B7-9852-39A506FFC5C2">
<p class="notep1">Note:</p>If application-to-database-availability-zone affinity is required, Autonomous Database
provides a user queryable database view to determine its AZ placement. Once the AZ of
the Autonomous Database is determined, networking can be aligned as appropriate.
</div>
<p>In the diagram below, the application virtual network (VNet) connects to the database
VNet in availability zone 1 (AZ1) using VNet peering. The AKS-hosted application
accesses the database via a private endpoint that connects to the <span>Oracle Database@Azure</span> delegated subnet. If multi-AZ business continuity is required, Autonomous Data Guard
can optionally be enabled, in which case, it is availability zone 2 (AZ2). Autonomous
Data Guard keeps the primary database and local standby in sync and automatically fails
over in the case of a primary AZ outage. Oracle-managed automatic backups are always
enabled by default.
</p>
<p>The following diagram illustrates this reference architecture.</p><br><div class="imageleft"><img class="imageleft" id="GUID-1548A5AA-D6B9-4DAD-AE43-7162769AD34B__IMAGE_ZJD_5XF_LCC" height="576" width="1168" src="img/autonomous-database-db-azure-diagram.png" alt="Description of autonomous-database-db-azure-diagram.png follows" title="Description of autonomous-database-db-azure-diagram.png follows" longdesc="img_text/autonomous-database-db-azure-diagram.html"><br><a href="img_text/autonomous-database-db-azure-diagram.html">Description of the illustration autonomous-database-db-azure-diagram.png</a></div><br><p><a href="img/autonomous-database-db-azure-diagram-oracle.zip" class="de-download">autonomous-database-db-azure-diagram-oracle.zip</a></p>
<p>The architecture has the following components:</p>
<ul style="list-style-type: disc;" id="GUID-1548A5AA-D6B9-4DAD-AE43-7162769AD34B__UL_QDH_4LM_CKB">
<li><span class="bold">Region</span><p>An <span>Oracle Cloud
Infrastructure</span> region is a localized geographic area that
contains one or more data centers, called
availability domains. Regions are independent of
other regions, and vast distances can separate
them (across countries or even
continents).
</p>
</li>
<li><span class="bold">Virtual cloud network (VCN) and subnets</span><p>A VCN is a customizable,
software-defined network that you set up in an <span>Oracle Cloud
Infrastructure</span> region. Like traditional data center networks,
VCNs give you control over your network
environment. A VCN can have multiple
non-overlapping CIDR blocks that you can change
after you create the VCN. You can segment a VCN
into subnets, which can be scoped to a region or
to an availability domain. Each subnet consists of
a contiguous range of addresses that don't overlap
with the other subnets in the VCN. You can change
the size of a subnet after creation. A subnet can
be public or private.
</p>
</li>
<li><span class="bold">Autonomous
Database</span><p id="GUID-1548A5AA-D6B9-4DAD-AE43-7162769AD34B__d5e89">
<span>Oracle Autonomous Database</span> is a fully managed, preconfigured database
environments that you can use for transaction
processing and data warehousing workloads. You do
not need to configure or manage any hardware, or
install any software. <span>Oracle Cloud
Infrastructure</span> handles creating the database, as well as
backing up, patching, upgrading, and tuning the
database.
</p>
</li>
<li><span class="bold">Object storage</span><p id="GUID-1548A5AA-D6B9-4DAD-AE43-7162769AD34B__d5e725">
<span>Oracle Cloud
Infrastructure</span> Object Storage provides quick access to large
amounts of structured and unstructured data of any
content type, including database backups, analytic
data, and rich content such as images and videos.
You can safely and securely store and then
retrieve data directly from the internet or from
within the cloud platform. You can scale storage
without experiencing any degradation in
performance or service reliability. Use standard
storage for "hot" storage that you need to access
quickly, immediately, and frequently. Use archive
storage for "cold" storage that you retain for
long periods of time and seldom or rarely
access.
</p>
</li>
<li><span class="bold"><span>Azure</span> Container Registry</span><p><span>Azure</span> Container Registry (ACR) is a managed service for storing and managing
container images and related artifacts.
</p>
</li>
<li><span class="bold">Azure availability zone</span><p>An availability zone is a physically separate data
center within a region designed to be available and fault-tolerant. Availability
zones are close enough to have low-latency connections to other availability
zones.</p>
</li>
<li><span class="bold"><span>Azure Kubernetes Service</span></span><p><span>Azure Kubernetes Service</span> (AKS) is a managed Kubernetes service offered by <span>Microsoft Azure</span>.
</p>
</li>
<li><span class="bold"><span>Azure</span> Load Balancer</span><p><span>Azure</span> Load Balancer provides automated traffic distribution from a single entry
point to multiple servers in the back end.
</p>
</li>
<li><span class="bold"><span>Microsoft Azure</span> Virtual Network</span><p><span>Microsoft Azure</span> Virtual Network (VNet) is the fundamental building block for your private
network in Azure. VNet enables many <span>Azure</span> resources, such as Azure virtual machines (VMs), to securely communicate with
each other, the internet, and on-premises networks.
</p>
</li>
<li><span class="bold"><span>Oracle Database@Azure</span></span><p id="GUID-1548A5AA-D6B9-4DAD-AE43-7162769AD34B__d5e822"><span>Oracle Database@Azure</span> is an Oracle Cloud Database service that runs
Oracle Database workloads in your Azure
environment. All hardware for <span>Oracle Database@Azure</span> is colocated in Azure's data centers and uses
Azure networking. The service benefits from the
simplicity, security, and low latency of a single
operating environment within Azure. Federated
identity and access management for <span>Oracle Database@Azure</span> is provided by Microsoft Entra ID. <span>Oracle Database</span> metrics and audit logs are natively available
in Azure. The service requires that users have an
Azure tenancy and an OCI tenancy.
</p>
</li>
</ul>
</div>
</div>
<div class="sect2"><a id="GUID-8B318CF8-81D2-44E5-8D8F-AE74F4E0A422" name="GUID-8B318CF8-81D2-44E5-8D8F-AE74F4E0A422"></a><h3 id="DADZD-GUID-8B318CF8-81D2-44E5-8D8F-AE74F4E0A422" class="sect3">Recommendations</h3>
<div>
<div><span>Use the following recommendations as a starting point.
</span>Your requirements might differ from the architecture described here.
</div>
<ul style="list-style-type: disc;" id="GUID-8B318CF8-81D2-44E5-8D8F-AE74F4E0A422__UL_FWK_JBG_RKB">
<li>Primary and standby database subnets should be in distinct VNets
configured with non-overlapping IP classless inter-domain routing (CIDR)
ranges.</li>
<li>The application tier (AKS, Docker, VMs, etc.) should span at least two
AZs, with the application VNet peered to both the primary and standby VNet of the
<span>Autonomous Database</span>.
</li>
<li>Optionally, client applications can be configured to use Oracle
transparent application continuity (TAP) to maximize availability during planned and
unplanned outages.</li>
</ul>
</div>
</div>
<div class="sect2"><a id="GUID-A13AEEB5-B270-4D38-9142-F89DE81A04CF" name="GUID-A13AEEB5-B270-4D38-9142-F89DE81A04CF"></a><h3 id="DADZD-GUID-A13AEEB5-B270-4D38-9142-F89DE81A04CF" class="sect3">Explore More</h3>
<div>
<p>For more details about the components and considerations shared in this
document, please refer to the following links.</p>
<p>Review these additional resources:</p>
<ul style="list-style-type: disc;">
<li><a href="/pls/topic/lookup?ctx=en/solutions/deploy-autonomous-database-db-at-azure&amp;id=adb-serverless" target="_blank">Oracle Autonomous
Database Serverless</a></li>
<li><a href="/pls/topic/lookup?ctx=en/solutions/deploy-autonomous-database-db-at-azure&amp;id=oracle-database-at-azure" target="_blank">Oracle
Database@Azure</a></li>
<li><a href="/pls/topic/lookup?ctx=en/solutions/deploy-autonomous-database-db-at-azure&amp;id=BODAT" target="_blank"><span><cite>Learn about selecting
network topologies for Oracle Database@Azure</cite></span></a></li>
<li><a href="/pls/topic/lookup?ctx=en/solutions/deploy-autonomous-database-db-at-azure&amp;id=adb-config-app-continuity" target="_blank">Configure Application Continuity on Autonomous
Database</a> in <cite>Using Oracle Autonomous
Database Serverless</cite></li>
<li><a href="/pls/topic/lookup?ctx=en/solutions/deploy-autonomous-database-db-at-azure&amp;id=oracle-db-at-azure-videos" target="_blank">Oracle
Database@Azure Videos</a></li>
<li><a href="/pls/topic/lookup?ctx=en/solutions/deploy-autonomous-database-db-at-azure&amp;id=oci-doc" target="_blank"><span>Oracle Cloud
Infrastructure</span> Documentation</a></li>
<li><a href="/pls/topic/lookup?ctx=en/solutions/deploy-autonomous-database-db-at-azure&amp;id=GVVGQ" target="_blank"><span><cite>Best practices framework
for Oracle Cloud Infrastructure</cite></span></a></li>
<li><a href="/pls/topic/lookup?ctx=en/solutions/deploy-autonomous-database-db-at-azure&amp;id=oci-calc" target="_blank">Oracle Cloud Cost
Estimator</a></li>
<li><a href="/pls/topic/lookup?ctx=en/solutions/deploy-autonomous-database-db-at-azure&amp;id=cloud-adoption-framework" target="_blank">Cloud Adoption
Framework</a></li>
</ul>
</div>
</div>
<div class="sect2"><a id="GUID-EBDB0E20-86F8-4A31-BFD2-84D996FCE557" name="GUID-EBDB0E20-86F8-4A31-BFD2-84D996FCE557"></a><h3 id="DADZD-GUID-EBDB0E20-86F8-4A31-BFD2-84D996FCE557" class="sect3">Acknowledgments</h3>
<div>
<ul style="list-style-type: disc;">
<li><span class="bold">Authors</span>: <span translate="no">Domenick Ficarella, Can Tuzla, Martin
Gubar</span></li>
<li><span class="bold">Contributors</span>: <span translate="no">Wei Han, John Sulyok</span></li>
</ul>
</div>
</div>
</div>
</article>
<div id="disclaimers" class="legal">
<div><a href="#copyright-information" role="button" data-toggle="collapse" aria-expanded="false" class="collapsed" aria-controls="copyright-information" id="copyright-information-btn">Title and Copyright Information</a></div>
<div class="collapse" id="copyright-information" aria-expanded="false">
<p class="legal">Deploy Autonomous Database on Oracle Database@Azure</p>
<p class="legal">G13089-02</p>
<p class="date legal">October 2024</p>
<div class="legal" style="display:inline"><a href="/pls/topic/lookup?ctx=en/legal&id=cpyr" target="_blank">Copyright ©</a>2024, </div><div class="legal" style="display:inline">Oracle and/or its affiliates.</div>
</div>
</div>
</body>
</html>

Binary file not shown.

View File

@@ -0,0 +1,158 @@
# Deploy a multi-agent AI fraud detection system on OCI
- Source: https://docs.oracle.com/en/solutions/ai-fraud-detection/index.html
- Date: 2025-06
- Type: reference-architecture
- Services: genai, streaming, adb-s
- Tags: ai-ml, autonomous
## Summary (catalog)
Multi-agent AI system for real-time fraud detection. Streaming ingestion of transaction data, ML models for anomaly detection, GenAI agents for investigation and decision support.
## Architecture (fetched from source)
Architecture
This architecture shows a multi-agent AI fraud detection system on Oracle Cloud
Infrastructure (OCI).
This design uses multiple AI agents to provide key insights, gather evidence,
and produce a comprehensive fraud analysis.
At the core is a model context protocol (MCP) server that orchestrates agent
interactions. Specialized agents handle distinct tasks. For example, a data retrieval
agent queries enterprise data sources and a fraud analyzer agent evaluates and explains
anomalies. The flow begins when an event, such as a suspicious transaction alert or an
investigators query, triggers the orchestrator. The orchestrator then delegates
subtasks to the agents and consolidates their results by using a fan-in and fan-out
design pattern. Each agent uses OCI-native services to perform tasks (database queries,
LLM inference, and so on), and the orchestrator translates between agent and Oracle
system contexts, ensuring that each agent gets the information it needs in the format it
expects.
The following diagram shows process flow overview:
Description of the illustration ai-fraud-detection-flow.png
ai-fraud-detection-flow-oracle.zip
- MCP orchestrator server
The model context protocol
(MCP) server is the coordinating hub that orchestrates agent actions and
maintains the overall context or state of an investigation. It uses MCP to
standardize how agents invoke tools and exchange data. Acting as a “central
brain,” it receives the initial request (fraud alert or analysis query) and
calls the appropriate agents in sequence. It also translates high-level agent
intents into low-level operations on Oracle systems, such as converting an
agents request for customer information into an SQL query, and converting SQL
results into a natural language response. This approach decouples agents from
direct system calls by using the orchestrator as a bridge between the agent
logic and enterprise data, enabling flexible updates and centralized control. In
the first phase of this architecture, the server is a lightweight server derived
from Googles Gen AI Toolbox running on Oracle Cloud Infrastructure
Compute or OCI Kubernetes Engine .
- Data retrieval agent
The data retrieval agent is
a specialized agent responsible for fetching relevant data from enterprise
sources. For example, upon receiving a customer ID or transaction ID from the
orchestrator, it queries the Oracle Autonomous Database or other OCI data stores for information such as recent transactions, account
profiles, claims history, and so on. You can implement this agent by using OCI Functions (serverless) to call tools hosted on an MCP server for Autonomous Database . The agent contains all data-access logic. The orchestrator server may use a
predefined tool for this agent, such as a YAML-configured
LookupTransaction or GetCustomerProfile
tool that knows how to run the proper SQL on the Autonomous Database . Similar to how Google Gen AI Toolbox uses YAML-defined tools to let agents
perform database operations, this design defines database queries as
configuration-driven tools. In the first phase, the data agent simply executes
these queries without AI decision-making involvement and returns the results to
the orchestrator.
- Fraud analyzer agent
The fraud analyzer agent is
the cornerstone agent that assesses the data for signs of fraud and generates
insights. This agent ingests the context, such as the transaction details,
customer info, or historical patterns provided by the orchestrator and applies
AI/ML logic to determine if the scenario is likely fraudulent. In phase 1, this
could be a rule-based engine or an OCI Anomaly Detection model to provide a
quick, deterministic response. For example, it might flag anomalies such as a
transaction far outside normal range or multiple claims in a short time span.
The agent then produces a fraud score or classification and possibly an
explanation.
In phase 2, the fraud analyzer agent is
augmented with LLM capabilities by using OCI Generative AI or Oracle pretrained models to generate human-readable investigative
narratives. In this way, generative AI automatically creates a concise report of
the findings, summarizing why a transaction was flagged and referencing the data
directly such as how a customers recent transactions show unusual high-value
purchases overseas, which deviates from their normal pattern by 5σ (5 sigma),
indicating high fraud likelihood. Oracles own Financial Services division has
highlighted the value of such generative narratives in accelerating
investigations. In phase 2, the fraud analyzer agent can use an OCI LLM to both
analyze the data and explain the results. For example, it might use a prompt
that incorporates the data and asks the model to analyze the fraud risk, or it
could perform tool-assisted reasoning by first calling a calculation tool, and
then having the LLM elaborate on the results.
- Additional agents (as needed)
The architecture
supports the ability to plug in other agents to enrich the analysis. For
example, an external check agent could call third-party services, such as
sanctions lists or credit bureaus, to gather more evidence on the entity
involved. Another could be a notification and case management agent that, after
fraud is confirmed, logs the case in a system or triggers an alert to a human
investigator. The orchestrators ability to manage multiple agents and
coordinate complex workflows allows new agents to be added without disturbing
existing ones. This modularity makes the system extensible for demo showcases
that can start with two agents and later attach more for other demo scenarios
such as compliance checks, customer messaging, and so on.
Title and Copyright Information
Deploy a multi-agent AI fraud detection system on OCI
G34124-01
June 2025
Copyright © 2025,
Oracle and/or its affiliates.

View File

@@ -0,0 +1,198 @@
# Auto-extracted absolute_layout template from
# kb/diagram/assets/archcenter-refs/ai-fraud-detection/ai-fraud-detection-flow-oracle/ai-fraud-detection-flow.drawio
# Source: Oracle Architecture Center reference (canonical geometry).
# Use this as the starting scaffold for a new spec — copy, rename ids,
# and replace `type: TODO_identify` on services with the right OCI
# type alias (adb_s, drg, fastconnect, etc.). Container coords and
# edge waypoints are Oracle's canonical layout; preserve unless the
# customer's topology requires a change.
absolute_layout:
canvas:
width: 850
height: 1100
containers:
- id: c5
type: region
label: ''
x: 330
y: 381
w: 252
h: 125
- id: c1
type: region
label: ''
x: 330
y: 0
w: 252
h: 49
- id: c2
type: region
label: ''
x: 330
y: 136
w: 252
h: 49
- id: c3
type: region
label: ''
x: 0
y: 247
w: 252
h: 49
- id: c4
type: region
label: ''
x: 0
y: 382
w: 252
h: 49
- id: c6
type: region
label: ''
x: 660
y: 247
w: 252
h: 49
services:
- id: s9
type: TODO_identify
label: ''
x: 584
y: 159
w: 211
h: 87
- id: s10
type: TODO_identify
label: ''
x: 219
y: 169
w: 112
h: 75
- id: s11
type: TODO_identify
label: ''
x: 254
y: 270
w: 117
h: 111
- id: s12
type: TODO_identify
label: ''
x: 542
y: 270
w: 117
h: 111
- id: s23
type: TODO_identify
label: ''
x: 425
y: 416
w: 63
h: 63
- id: s22
type: TODO_identify
label: ''
x: 426
y: 417
w: 61
h: 61
- id: s24
type: TODO_identify
label: ''
x: 426
y: 417
w: 60
h: 60
- id: s25
type: TODO_identify
label: ''
x: 452
y: 423
w: 30
h: 24
- id: s26
type: TODO_identify
label: ''
x: 431
y: 424
w: 51
h: 30
- id: s7
type: TODO_identify
label: ''
x: 119
y: 475
w: 212
h: 67
- id: s8
type: TODO_identify
label: ''
x: 584
y: 475
w: 212
h: 61
- id: s17
type: TODO_identify
label: ''
x: 429
y: 539
w: 58
h: 63
- id: s20
type: TODO_identify
label: ''
x: 768
y: 539
w: 40
h: 63
- id: s16
type: TODO_identify
label: ''
x: 430
y: 540
w: 56
h: 61
- id: s19
type: TODO_identify
label: ''
x: 769
y: 540
w: 38
h: 62
- id: s18
type: TODO_identify
label: ''
x: 430
y: 541
w: 55
h: 59
- id: s21
type: TODO_identify
label: ''
x: 769
y: 541
w: 37
h: 60
- id: s13
type: TODO_identify
label: ''
x: 95
y: 548
w: 61
h: 53
- id: s14
type: TODO_identify
label: ''
x: 95
y: 548
w: 63
h: 55
- id: s15
type: TODO_identify
label: ''
x: 96
y: 549
w: 60
h: 52
labels: []
connections: []

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 46 KiB

View File

@@ -0,0 +1,9 @@
The diagram you downloaded is available in these formats:
- DRAWIO
- SVG
You can customize them for your organization using the associated tools:
- For DRAWIO format, use draw.io for Confluence, online at diagrams.net, or the desktop app. Go to diagrams.net for more information.
- For SVG format, use an SVG editor such as Inkscape or Sketsa SVG Editor, which are free and available for Windows, macOS, Linux.
Note that all diagram components are ungrouped and in a single layer.

View File

@@ -0,0 +1,337 @@
# Deploy a Data Lake leveraging Power BI on Oracle Database@Azure
- Source: https://docs.oracle.com/en/solutions/analytics-pipeline-db-at-azure/index.html
- Date: 2025-02
- Type: reference-architecture
- Services: adb-s, azure, object-storage
- Tags: data-platform, multicloud, azure, autonomous
## Summary (catalog)
Analytics pipeline combining ADB-S on Database@Azure with Power BI. Data ingestion to Object Storage, transformation in ADB-S, visualization via Power BI DirectQuery or Import mode.
## Architecture (fetched from source)
Deploy a Data Lake Leveraging Power BI on Oracle Database@Azure
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
Previous
Next
JavaScript must be enabled to correctly display this content
- Deploy a Data Lake leveraging Power BI on Oracle Database@Azure
- Deploy a Data Lake Leveraging
Power BI on Oracle Database@Azure
Deploy a Data Lake Leveraging
Power BI on Oracle Database@Azure
Many businesses leverage Microsoft Power BI with data lakes on Microsoft
Azure to derive actionable business insights.
You can expand these capabilities by using a medallion architecture
that includes Azure Data Factory, Azure Data Lake Storage, Azure Compute,
Oracle Database@Azure (either a fully managed Oracle Autonomous Database or a co-managed Oracle Exadata Database
Service instance), and Power BI to address several key data challenges faced by
customers:
- Data Silos and Integration : Azure Data Factory ingests data from
diverse sources into a unified data lake, breaking down silos and
providing a single source of truth.
- Data Quality and Consistency : Autonomous Data
Warehouse in the Curation Layer ensures clean, consistent, and high-quality
data through deduplication and quality rules, reducing errors and
enhancing decision-making.
- Scalability and Performance : Azure's scalable
compute resources and Autonomous Data
Warehouse 's serverless architecture or Oracle Exadata Database
Service handle large-scale data processing efficiently, while maintaining
optimal performance as data volumes and user adoption (concurrency)
grow.
- Complex Transformations : Azure Compute and Autonomous Data
Warehouse or Oracle Exadata Database
Service perform complex transformations and analytics efficiently,
reducing processing time and focusing on insights.
- Cost Management : The serverless and pay-as-you-go
models for Azure services and Autonomous Data
Warehouse or Oracle Exadata Database
Service optimize costs, ensuring that you only pay for what you use.
- Data Governance and Compliance : Structured data management layers
facilitate better governance, traceability, and regulatory
compliance.
- Built-in Analytics : Users are able to apply analytics
directly to their data by using built-in features such as artificial
intelligence (AI), machine learning (ML), graph, spatial, and text
analytics.
Typical use cases include:
- Retail Analytics : Integrates data from online sales, in-store
transactions, and customer feedback, optimizing inventory and
marketing strategies.
- Financial Services : Analyzes transaction data for fraud detection
and regulatory compliance, mitigating risks.
- Healthcare Analytics : Integrates patient data from EHRs, lab
results, and wearable devices, improving patient care and health
management.
This architecture enables enterprise customers across industries to
leverage data effectively to empower their business users to make informed
decisions to drive better business outcomes.
Logical Architecture
The analytical data lake can ingest data from multiple sources and can
provide business insights by using Power BI running on Microsoft Azure.
- Data Sources: The analytical data lake can ingest data from multiple
sources. Azure Data Factory can ingest data from Microsoft SQL Server and Azure Blob
Storage. Oracle Database@Azure can ingest data from Oracle Cloud
ERP , Oracle Cloud
Infrastructure Object Storage , Azure Cosmos Database, Azure SQL Database, various types of table storage data
(Azure, PostgresSQL, Azure MariaDB), and other types of on-premises relational
databases.
- Data Tier: Oracle Database@Azure ingests source data from Azure Data Lake Storage in conjunction with Azure Data
Factory.
- Consumption Tier: Oracle Database@Azure provides insights to Microsoft Power BI running on Microsoft Azure.
The following diagram illustrates the functional architecture:
Description of the illustration data-lake-db-azure-process.png
data-lake-db-azure-process-oracle.zip
Medallion Architecture
This section demonstrates how you can deploy Oracle Database@Azure as the data warehouse within the Azure medallion architecture.
The medallion architecture is a data management framework that
structures data handling in a data lakehouse into distinct stages (bronze,
silver, and gold), representing the different stages of data processing:
- Bronze stage: Data from various sources is ingested,
validated, and curated.
- Silver stage: The data is stored and processed for analytics
and reporting.
- Gold stage: Refined data is delivered for analysis and
reporting.
The following diagram illustrates the architecture:
Description of the illustration data-lake-db-azure-medallion.png
data-lake-db-azure-medallion-oracle.zip
The medallion stages are further divided into the following
deployment areas:
- Ingestion Framework: Ingests data from various data sources
using Azure Data Factory. Raw data is stored in Azure Data Lake
Storage Gen 2 and Delta Lake. This framework ensures data
consistency and accuracy across source and sink systems. This
framework constitutes a robust set of scripts to ensure quality by
using audit, balance and control mechanisms across platforms.
- Validation: Raw data is ingested into Oracle Autonomous Data Warehouse Serverless or Oracle Exadata Database
Service for deduplication and data quality check. This workflow performs
basic cleansing masking of PII and PHI data along with validation of
raw files through a rules-driven framework to perform schema checks.
The validation framework can be implemented using Azure Data
Factory.
- Rejection Workflow: Any record that is rejected during the
ingestion stage due to validation errors or other processing errors
is staged on a separate Azure Data Lake Storage path. Automated
email notifications using Logic App are sent to the support team
based on defined software license agreements (SLAs). Standardized
data remains in Oracle Autonomous Data Warehouse Serverless or Oracle Exadata Database
Service .
- Orchestration: A scheduling system manages data processing
jobs, scheduling, and job dependencies. Azure Data Factory can be
used for the orchestration of ETL jobs. The Orchestration stage
includes Oracle Autonomous Data Warehouse Serverless or Oracle Exadata Database
Service , Delta Lake, and Azure Data Lake Storage Gen 2.
- Reporting/Analytics: The reporting stage includes Power BI
and data services such as external feeds and data monetization.
The architecture has the following infrastructure components:
- Region
An Azure region is a
geographical area in which one or more physical Azure data
centers, called availability zones, reside. Regions are
independent of other regions, and vast distances can
separate them (across countries or even continents).
Azure and OCI regions are localized geographic
areas. For Oracle Database@Azure , an Azure region is connected to an OCI region, with
availability zones (AZs) in Azure connected to availability
domains (ADs) in OCI. Azure and OCI region pairs are
selected to minimize distance and latency.
- Availability zone
An availability zone
is a physically separate data center within a region
designed to be available and fault-tolerant. Availability
zones are close enough to have low-latency connections to
other availability zones.
- Virtual network (VNet) and subnet
A
VNet is a virtual network that you define in Azure. A VNet
can have multiple non-overlapping CIDR blocks subnets that
you can add after your create the VNet. You can segment a
VNet into subnets, which can be scoped to a region or to an
availability zones. Each subnet consists of a contiguous
range of addresses that

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 667 KiB

View File

@@ -0,0 +1,575 @@
<mxfile host="Electron" agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/25.0.2 Chrome/128.0.6613.186 Electron/32.2.5 Safari/537.36" version="25.0.2">
<diagram name="data-lake-db-at-azure-process" id="data-lake-db-at-azure-process">
<mxGraphModel dx="1194" dy="806" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="850" pageHeight="1100" math="0" shadow="0">
<root>
<mxCell id="0" />
<mxCell id="1" parent="0" />
<UserObject label="" tags="Background" id="2">
<mxCell style="vsdxID=2;fillColor=#FFFFFF;gradientColor=none;shape=stencil(nZBLDoAgDERP0z3SIyjew0SURgSD+Lu9kMZoXLhwN9O+tukAlrNpJg1SzDH4QW/URgNYgZTkjA4UkwJUgGXng+6DX1zLfmoymdXo17xh5zmRJ6Q42BWCfc2oJfdAr+Yv+AP9Cb7OJ3H/2JG1HNGz/84klThPVCc=);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry width="753" height="1176" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="3">
<mxCell style="vsdxID=4;fillColor=#f5f4f2;gradientColor=none;shape=stencil(vVPRDoMgDPwaHjUIidNn5/6DTFQyJqay6f5+OMimMrPEJb6V9sr1Codo1tWs5YjgToO68F4Uukb0iAgRTc1BaBMhmiOalQp4BerWFPbcshE5Rld1H28YbB8eOwh+2FOahnHyypwsmMHZVMGBozCmFg+uAYeU2IwHcYgIO4ohYIPoAlCaaaGaGb1kUPHAkAWlZNWs1PWct17ajSdFM9GSJiE9fCXfrAav7WcHOUvy93Rb1fj72e1pvG/x37usLGYHIT/8YoKP00ohpTXqtL50pklZV9P8CQ==);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry width="227" height="1175" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="4">
<mxCell style="vsdxID=5;fillColor=none;gradientColor=none;shape=stencil(vVPRDoMgDPwaHjUIidNn5/6DTFQyJqay6f5+OMimMrPEJb6V9sr1Codo1tWs5YjgToO68F4Uukb0iAgRTc1BaBMhmiOalQp4BerWFPbcshE5Rld1H28YbB8eOwh+2FOahnHyypwsmMHZVMGBozCmFg+uAYeU2IwHcYgIO4ohYIPoAlCaaaGaGb1kUPHAkAWlZNWs1PWct17ajSdFM9GSJiE9fCXfrAav7WcHOUvy93Rb1fj72e1pvG/x37usLGYHIT/8YoKP00ohpTXqtL50pklZV9P8CQ==);strokeColor=#9e9892;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry width="227" height="1175" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="&lt;div style=&quot;font-size: 1px&quot;&gt;&lt;p style=&quot;text-align:left;margin-left:0;margin-right:0;margin-top:0px;margin-bottom:0px;text-indent:0;vertical-align:middle;direction:ltr;&quot;&gt;&lt;font style=&quot;font-size:16.93px;font-family:Oracle Sans;color:#312d2a;direction:ltr;letter-spacing:0px;line-height:120%;opacity:1&quot;&gt;&lt;b&gt;Data Sources&lt;br/&gt;&lt;/b&gt;&lt;/font&gt;&lt;/p&gt;&lt;/div&gt;" tags="Background" id="5">
<mxCell style="verticalAlign=middle;align=left;overflow=width;vsdxID=6;fillColor=none;gradientColor=none;shape=stencil(nZBLDoAgDERP0z3SIyjew0SURgSD+Lu9kMZoXLhwN9O+tukAlrNpJg1SzDH4QW/URgNYgZTkjA4UkwJUgGXng+6DX1zLfmoymdXo17xh5zmRJ6Q42BWCfc2oJfdAr+Yv+AP9Cb7OJ3H/2JG1HNGz/84klThPVCc=);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="61" y="7" width="203" height="20" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="6">
<mxCell style="vsdxID=8;fillColor=#f5f4f2;gradientColor=none;shape=stencil(vVPRDoMgDPwaHjUIidNn5/6DTFQyJqay6f5+OMimMrPEJb6V9sr1Codo1tWs5YjgToO68F4Uukb0iAgRTc1BaBMhmiOalQp4BerWFPbcshE5Rld1H28YbB8eOwh+2FOahnHyypwsmMHZVMGBozCmFg+uAYeU2IwHcYgIO4ohYIPoAlCaaaGaGb1kUPHAkAWlZNWs1PWct17ajSdFM9GSJiE9fCXfrAav7WcHOUvy93Rb1fj72e1pvG/x37usLGYHIT/8YoKP00ohpTXqtL50pklZV9P8CQ==);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="279" width="227" height="1175" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="7">
<mxCell style="vsdxID=9;fillColor=none;gradientColor=none;shape=stencil(vVPRDoMgDPwaHjUIidNn5/6DTFQyJqay6f5+OMimMrPEJb6V9sr1Codo1tWs5YjgToO68F4Uukb0iAgRTc1BaBMhmiOalQp4BerWFPbcshE5Rld1H28YbB8eOwh+2FOahnHyypwsmMHZVMGBozCmFg+uAYeU2IwHcYgIO4ohYIPoAlCaaaGaGb1kUPHAkAWlZNWs1PWct17ajSdFM9GSJiE9fCXfrAav7WcHOUvy93Rb1fj72e1pvG/x37usLGYHIT/8YoKP00ohpTXqtL50pklZV9P8CQ==);strokeColor=#9e9892;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="279" width="227" height="1175" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="&lt;div style=&quot;font-size: 1px&quot;&gt;&lt;p style=&quot;text-align:left;margin-left:0;margin-right:0;margin-top:0px;margin-bottom:0px;text-indent:0;vertical-align:middle;direction:ltr;&quot;&gt;&lt;font style=&quot;font-size:16.93px;font-family:Oracle Sans;color:#312d2a;direction:ltr;letter-spacing:0px;line-height:120%;opacity:1&quot;&gt;&lt;b&gt;Data Tier&lt;br/&gt;&lt;/b&gt;&lt;/font&gt;&lt;/p&gt;&lt;/div&gt;" tags="Background" id="8">
<mxCell style="verticalAlign=middle;align=left;overflow=width;vsdxID=10;fillColor=none;gradientColor=none;shape=stencil(nZBLDoAgDERP0z3SIyjew0SURgSD+Lu9kMZoXLhwN9O+tukAlrNpJg1SzDH4QW/URgNYgZTkjA4UkwJUgGXng+6DX1zLfmoymdXo17xh5zmRJ6Q42BWCfc2oJfdAr+Yv+AP9Cb7OJ3H/2JG1HNGz/84klThPVCc=);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="356" y="7" width="152" height="20" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="9">
<mxCell style="vsdxID=12;fillColor=#f5f4f2;gradientColor=none;shape=stencil(vVPRDoMgDPwaHjUIidNn5/6DTFQyJqay6f5+OMimMrPEJb6V9sr1Codo1tWs5YjgToO68F4Uukb0iAgRTc1BaBMhmiOalQp4BerWFPbcshE5Rld1H28YbB8eOwh+2FOahnHyypwsmMHZVMGBozCmFg+uAYeU2IwHcYgIO4ohYIPoAlCaaaGaGb1kUPHAkAWlZNWs1PWct17ajSdFM9GSJiE9fCXfrAav7WcHOUvy93Rb1fj72e1pvG/x37usLGYHIT/8YoKP00ohpTXqtL50pklZV9P8CQ==);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="525" width="227" height="1175" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="10">
<mxCell style="vsdxID=13;fillColor=none;gradientColor=none;shape=stencil(vVPRDoMgDPwaHjUIidNn5/6DTFQyJqay6f5+OMimMrPEJb6V9sr1Codo1tWs5YjgToO68F4Uukb0iAgRTc1BaBMhmiOalQp4BerWFPbcshE5Rld1H28YbB8eOwh+2FOahnHyypwsmMHZVMGBozCmFg+uAYeU2IwHcYgIO4ohYIPoAlCaaaGaGb1kUPHAkAWlZNWs1PWct17ajSdFM9GSJiE9fCXfrAav7WcHOUvy93Rb1fj72e1pvG/x37usLGYHIT/8YoKP00ohpTXqtL50pklZV9P8CQ==);strokeColor=#9e9892;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="525" width="227" height="1175" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="&lt;div style=&quot;font-size: 1px&quot;&gt;&lt;p style=&quot;text-align:left;margin-left:0;margin-right:0;margin-top:0px;margin-bottom:0px;text-indent:0;vertical-align:middle;direction:ltr;&quot;&gt;&lt;font style=&quot;font-size:16.93px;font-family:Oracle Sans;color:#312d2a;direction:ltr;letter-spacing:0px;line-height:120%;opacity:1&quot;&gt;&lt;b&gt;Consumption Tier&lt;br/&gt;&lt;/b&gt;&lt;/font&gt;&lt;/p&gt;&lt;/div&gt;" tags="Background" id="11">
<mxCell style="verticalAlign=middle;align=left;overflow=width;vsdxID=14;fillColor=none;gradientColor=none;shape=stencil(nZBLDoAgDERP0z3SIyjew0SURgSD+Lu9kMZoXLhwN9O+tukAlrNpJg1SzDH4QW/URgNYgZTkjA4UkwJUgGXng+6DX1zLfmoymdXo17xh5zmRJ6Q42BWCfc2oJfdAr+Yv+AP9Cb7OJ3H/2JG1HNGz/84klThPVCc=);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="566" y="7" width="270" height="20" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="12">
<mxCell style="vsdxID=17;fillColor=#FFFFFF;gradientColor=none;shape=stencil(lZfdchoxDIWfZm81tuQf+TpN3iPTkMI0hQwhLX37artYxtrsktyB8fFnS9aRGejubfv4uhnQvZ2Oh5+bP7un03agbwPibr/dHHcn+TTQ/UB3z4fj5sfx8L5/mr6/Po4zx0+/Dr/HFc6TDhFCGlXo/k4jjJCmkYdJ8LLbXwmIoMROkCOQXxbMCYlXZmfw/fIpQFlZ3n1pMmDu5zsI4Xr+9/fjFB5fFbFcFJeRGAEv5znjNORbSC4jsZHONA0FGL/+n1RHYtUtwBMEAw8eEvXwApF7ODF47OGeAH1Ppwh5lS6aYvCiwWDOHiBlww8QveGL0OAJEq7iZX9k8KhDik/gisF7MKGXSTVlineQVukZHPd0jC2nlV6AsKfLjQkGLxVg6OPqq4cXFpvYSzqiwcshnO/xXi4I93hJh956srMW+KLhYPiiMbmX6xA+4AfDl2vON/jGYxLE3jJubzgD0WzDNl7cktr2G812GfJ8u341XVQgmNviHWQTruDA23DJkPUJpyVe+aU66AI+UFtYraOWhdITeFspEI1PhALJ+ISvLrAAjwTORN6p41d4TJAM3PVkcWI0YXemEc3skYBzT/a1FSk55bauHtuZmGeBm5iL++Q1eCbNXIXz7NjSGvUi14yjhkvpuWWmOZZfPbtoor1xuXqs4rk104qf9waZxdHguZb/El66TjT4ometfHZAJvaSVBt89jN3llm0WnBMM3+S3DtTcJyADB6BjD0xaxUoPtS4LeALQTDHx6vA1s6cW2W01kgm+4W1W+rDQEyJ1vjeuZ4eeNYZSwE0JSdVSKY5lFRRSk8IpUt+b84lNou4CCJ4WhZkWS99SZA1SfpirI+nDwWyHveCrJ1piRCoE8irl1cE4ov9w7Fm4JNP3huP6k8I5EN7wz/vXl6mvwDXv9s3vwxN/xfo/h8=);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="83" y="47" width="62" height="48" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="13">
<mxCell style="vsdxID=18;fillColor=#FFFFFF;gradientColor=none;shape=stencil(lVnLchs5DPwaXVEkwec5j/9IbZy1ah07pThZ+e+DiQbksKmh5JtMg2qCABoN6sAffj5++fFwcObn6+nlv4f/j19fHw/88eDc8fnx4XR8lU8H/nTgD99eTg//nl5+PX+9/P3jy2K5fPr+8nv5hvNlX0jk4rLLmbfLCv/96/PF+J9fp4u1vfwzWrJqvi45Kvmycnarka9Lb+uSJ/arEa9GmVxZjXSJipuBJ0uAXSj00MmTA2jL5GyPnWIPbBNFO0WO5FMPbTMl8DslsgzghTKCJyqA7wzFuecNrF67Jc+AXygBvnM9eDaUAoA7vbId8MxjzF31QcFzIB8A3NeNFT9R8IAf9Ip28IsjGwC/VDDFL4IPkecw4JdIOfX43urd7uFLpgK+z+QBXhwrPXyQE0HSF7h7Kac1r1bsp+PzpjiLrzFeizM6ym5/gxQV2/dskHpZM69uSOrtdQSppn5DK7nrGyLF1G+Iei93Hinb6YZgyPQUJlGOE6cl4yo/3YXATNkPPkwCxwOrilds33OkJQ4TH1gqsD/SEulJHByF9D77BKlnyE5JSk6kFWBrBTDUiW/p42r4ElBkJIXWGpWAlilHEQM/elfzTrGtJed7cC7EpQe3XptBhZdwrkSyA28DBdfjc6QAFGnFL+BnoagEFC1WSBMsR5pSlDSwAP1JcjbC3UvLMhbw3cBRYlVDpPjS9dMUX/qT7/Fdap1v0wyBIyUfIlC0NLYAwkCWytR/x01M2ArGgC9FVru4qxdnIf5ycLx/e6tFsdQGwPvh+pe7husXKwPhl1hjh25W16kgIunf2pDm1oN3qcWtuge+SQLg1TIlCK1UG4ZWrHh6td60W1NwYS7o/tLELZS2WMHVLp0er9YqcezB85DZufGVoscBXao/A3quBaHoQbftgAfbNI3GgoDUgjSW2GMLEacee6vyNRb7+XFjJrg1QJipS74163XJVFY6t5aQQcuZ2oHrfY51KgU2pWkfGgHqEhlQ8dI4GFI5DiQpWWlzD15oGkvJ/QRFVGoLP2/aEWSxqeGtVbSpNa5WMUzRhdS5R5c9A3yqbPzWeqYBghQrg/hWr3GPofoUGeyH88YhUssePG8YGXVj1Rg1uxvnvULoHEf80uNLYhhkHSYTenxJS5w3UZ8O/bSMI5dpnarpCaiShVEAXXpXgYlLnIu35AzSjsVJeyt5WoNzKKbkQCim3I1mLv3oipZBLeVVkjT4pi3PrbsE5D1/Y9YvTeu3/mcAfjPUKG2YpjeVJFoO6UrQHNrV0AZHTemZQI9mABdWBZIwA3YoU73f0qvNB3EyE5neOOhcfX2YkJi/y96o3t+OQ7NpxVOBwbey6978ZGCk88r7dyKkTLMTDS5kraE7vz97mDr6Db7/9lJ01rpzSLbGTMxtq9u7vj8FHPOX409ERipVpWyG8EkARoRUG+HeY0gYQjxLohFhSaLJ1L48uIUDpOnsklIbU1sdTABKqBr6zg1xeDHy0/ecMjwKlDk75uaySjqpA3iJlGRJ0BgXndpTlBgNb3FFI7DXG4zpwRdGxae4MrwBL0MEoqdhGBDR4ebOx0FFSWMs0JYLN2GqfVnkFzSHYgkaozRvnoq4nNv7RXuIxVdgqbthyjY17+pDrMU3lmVgnt59FkZDDVkGUZJNj2032aEv4O31toJn4qkiklrHETQRvr/nqtO38z3IQbFCSbI8zEwlSYo6S27UoAdNkLhlhy6pV+1pS9o5+F4fefd+c5GSRy1KAaIe228jqhJ64Csj4Iz/51OdfGg/KH07Pj1dfo/a/h9/gJKly49X/OkP);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="82" y="46" width="63" height="50" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="14">
<mxCell style="vsdxID=19;fillColor=#2d5967;gradientColor=none;shape=stencil(lVLLDoMgEPwarhve4Nna/zARK6kVo/b194VyqJhI422ZndmdDYNYOXf1aBDF8zK5q3naZukQOyFK7dCZyS6+QqxCrGzdZC6Tuw9NfI91YIbq5h5hwivqFAeigorid0SIR77AOfJ7O6z4mgCWCZ9ykGxfwAsQqUAREJkNRIPeLlB6n08FCL69gBWZBRJI6ggDEft8fMRNOJekbjDOeMGHpmsGMr01M/vo1/7n++KXo9b2fYzhur/NnYdiZln1AQ==);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="99" y="85" width="30" height="10" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="15">
<mxCell style="vsdxID=20;fillColor=#2d5967;gradientColor=none;shape=stencil(lVLLDoMgEPwarhtegp5t+x8mYiW1atS+/r5QaipUaXrbx8zuDCxi+VgXvUIUj9PQndRNl1ON2A5RqttaDXoyEWJ7xPKqG9Rx6C5t6fK+sEgbnburnXB3PJ5BQiyL4oerEIxf+cHBG90u4HNzBlMOGduGpwwE9wiR2ZIDkb4UU4kMJ4BFqEZE1FivPkGS2f262xTScIFMt/E0gYSHDt6V9QUCiK8IQ8TA19vHxPz5sz/hJvgcUaWbxt3gsh8enSm5g2X7Jw==);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="99" y="78" width="30" height="10" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="16">
<mxCell style="vsdxID=21;fillColor=#2d5967;gradientColor=none;shape=stencil(lVLLDoMgEPwarmQBNXC29j9MxEJqxaD28feFkqai1dbbLszM7mwGsbxXZScRhX6w5ixvuhoUYgdEqW6VtHpwFWIFYnltrDxZM7ZV6LvSI311MVevcA88AuA5FB6hTwFT8Xo5Bnij2wk8EVikEQHWwUvlTeGURPj3Zl/hO9f+CY+PsnRJOObZuj4nGLL5BLLtNsY7BZJsGHDz911zn4E/CK74hKjWTRMyOP2fh849hcCy4gk=);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="99" y="65" width="30" height="15" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="17">
<mxCell style="vsdxID=22;fillColor=#2d5967;gradientColor=none;shape=stencil(lVLLDoIwEPyaXjd90Adn1P8goUgjUgL4+ntbayJFqeG2TGd2Z8IgVoxN2WtE8TgN9qRvppoaxHaIUtM1ejCTmxDbI1bUdtDHwV66Knz3pWf66WyvfsM96GQGRHoVxY+AEIe8gEPgt6ab8RUBLCI+zUCwdUGWA48FkgBPXCAK1PKAVOt8yoFnywRv5PcBASR2hCERAG8x49OS2AzGCSv4a3uesKIYiDhqYvfWP/uf74ZPjWrTtqGF8/dl7RwUKsv2Tw==);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="99" y="78" width="30" height="10" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="18">
<mxCell style="vsdxID=23;fillColor=#2d5967;gradientColor=none;shape=stencil(lVLLDoMgEPwarhve4Nna/zARK6kVo/b194VyqJhI422ZndmdDYNYOXf1aBDF8zK5q3naZukQOyFK7dCZyS6+QqxCrGzdZC6Tuw9NfI91YIbq5h5hwivqFAeigorid0SIR77AOfJ7O6z4mgCWCZ9ykGxfwAsQqUAREJkNRIPeLlB6n08FCL69gBWZBRJI6ggDEft8fMRNOJekbjDOeMGHpmsGMr01M/vo1/7n++KXo9b2fYzhur/NnYdiZln1AQ==);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="99" y="85" width="30" height="10" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="19">
<mxCell style="vsdxID=24;fillColor=#2d5967;gradientColor=none;shape=stencil(nVjLchw3DPyavaJIgs+z4/yHK5ajrSiSS5YT6e+N8Q6BYVPLdfm2osDpAdFoNOfEH77df/p6dwru28vz0z93/58/v9yf+I9TCOfH+7vn84v8OvHHE3/48vR89/fz0/fHz5e/v37aIrdf/z79tz3h9bKvVipt2xXc22WFK/nwc+XPy4a/vj9fdvh9S6a879hXOBGny9Jr2IMi+f7cfYmZeN/4ynuUp1z2qH2JA4U1vKPsAd9TAfzSLKrjO6p+xC9VN3b80CjmFX4pVNuIH+TIPOCXKf+QiRvgZyoe8CNFXuJHapC/L+Qq4Ad9pY7vnb54x8+VMuSfKdUVfE6WWE+fQhnRs6cwgrsROMnx8AjsyC3zTtG2eN0CZU+efIK0iUfsWLUOSjoqS+yYKMcROytQx45MPo/YQkI48eitLvuS18SuoTviChVPBEfOwtsCmWcCdOntCP0m3NkpcAWdi+3p6PIYQDduK7pwC9p90wmo+vaoZfKiBwxH760DO76ctEYZfi0j/kZuqLzQIyz5HgBcuJKg1+QZBegeShdRBfeNGvSa6Na62SQHD5WXk0bSb3WG0gvNGLROomIY8aNsXGqt7AmgNbHN+MlU1PpQo1ijgPgpUFmnL1qYRnhRgQRS63mS+pR6YgYfJqlLuSvpFfw2KU52KgSqdZPi5DwVn6nVEVwEui6J73VadXCZaQnAHSVgXi0UoO0cBci8pb60gz+cHw+mYBfrtz433PXQYEPl98Jb1+d34yOVvAyfpgRxGE+tpndKBhUTTwFDonYXYgWT5yzZKv0NbCnSBXmEFhpOdCldgoysUQeHzuXYWb7oVUg9M7kA+IUS4jsqEfCritybTey29EW+Tb4smVdQrXQqTAetaCjU1mZvNrVTWeEHO2zVqqhsOGj1pJVOZ4fis9God3C+kb9wNaMvZp03ij8PSvGlDbRa6Net8sGX+mX+8pgI/JMp1OetDupAkL45PlOr2HM1eJ0x1+DzlP4Gjz6hTumHyaVEB9ipd8M1g+Qn6m02Go5e/JkDfybWNcGYEs4E8Cg3ranYw4oGLfdrhOEXizqMrhE+OZyS3t8waDJGUfMaukMZmwXark7e9B1TXm9onmhHhJOXLcA5kaEMU0ruIhF6TqYmtLyczno+5zbZI9E3xquQN+NjdWeo+zaPkfO1X2yuXcV4uhaIpQPKl8MM611gV5nDTbB7hoPi3IAvynGFr5rr4SbsgHZyV0B7JBOwgOKLLuYlfpUjA+JtnQj51zl/6URU3JrV1yl+uoHfHAF8clP1W7Cx3JuhKB87fDt8rjA+uqXgi4lCdyq1Bm8sQTjvK/dJZvCsfFSL5mlAH31ROVzkfi9+adPkrdWv/kq4jZD+NqVfCa4dXiMYVmJcM9Sug+rRiQfDUdmqGRqzSjsvr4EXQqfC5oGC1gSvFdFYorw9fD+zS/b4AW08rF/44iY/7Hvdl/PDw+Vz3/H/+H1Pli7fBvnjDw==);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="84" y="48" width="60" height="30" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="&lt;div style=&quot;font-size: 1px&quot;&gt;&lt;p style=&quot;text-align:left;margin-left:0;margin-right:0;margin-top:0px;margin-bottom:0px;text-indent:0;vertical-align:middle;direction:ltr;&quot;&gt;&lt;font style=&quot;font-size:16.93px;font-family:Oracle Sans;color:#000000;direction:ltr;letter-spacing:0px;line-height:120%;opacity:1&quot;&gt;Oracle Cloud ERP&lt;br/&gt;&lt;/font&gt;&lt;/p&gt;&lt;/div&gt;" tags="Background" id="20">
<mxCell style="verticalAlign=middle;align=left;overflow=width;vsdxID=25;fillColor=none;gradientColor=none;shape=stencil(nZBLDoAgDERP0z3SIyjew0SURgSD+Lu9kMZoXLhwN9O+tukAlrNpJg1SzDH4QW/URgNYgZTkjA4UkwJUgGXng+6DX1zLfmoymdXo17xh5zmRJ6Q42BWCfc2oJfdAr+Yv+AP9Cb7OJ3H/2JG1HNGz/84klThPVCc=);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="48" y="100" width="270" height="20" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="21">
<mxCell style="vsdxID=28;fillColor=#FFFFFF;gradientColor=none;shape=stencil(vVPLDoMgEPwajhoE+/Bs7X+QikpKxSy02r8vFtJWrWliE2/L7iyzszCIprpiDUcEawPqzFuRmwrRAyJE1BUHYWyEaIZoWijgJahrnbtzw3pkH13Urb+hc3247yD47k5JEm6SZ+bowAxOtgoeHIW7rcODb8BhHLnMBOIREfYUXcA6oQNQhhmh6gG9ZFDywJIFhWTloKRbzptJ2o8nRf2hJdmHJP5KvlgNntvPCnLG5K/plqqZ7me1p5l8i//eZWYxKwj54RcbvJ1WCCmdUT/rY2falHM1zR4=);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="288" y="272" width="210" height="896" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="22">
<mxCell style="vsdxID=29;fillColor=none;gradientColor=none;shape=stencil(vVPLDoMgEPwajhoE+/Bs7X+QikpKxSy02r8vFtJWrWliE2/L7iyzszCIprpiDUcEawPqzFuRmwrRAyJE1BUHYWyEaIZoWijgJahrnbtzw3pkH13Urb+hc3247yD47k5JEm6SZ+bowAxOtgoeHIW7rcODb8BhHLnMBOIREfYUXcA6oQNQhhmh6gG9ZFDywJIFhWTloKRbzptJ2o8nRf2hJdmHJP5KvlgNntvPCnLG5K/plqqZ7me1p5l8i//eZWYxKwj54RcbvJ1WCCmdUT/rY2falHM1zR4=);strokeColor=#9e9892;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="288" y="272" width="210" height="896" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="&lt;div style=&quot;font-size: 1px&quot;&gt;&lt;p style=&quot;text-align:left;margin-left:0;margin-right:0;margin-top:0px;margin-bottom:0px;text-indent:0;vertical-align:middle;direction:ltr;&quot;&gt;&lt;font style=&quot;font-size:16.93px;font-family:Oracle Sans;color:#312d2a;direction:ltr;letter-spacing:0px;line-height:120%;opacity:1&quot;&gt;&lt;b&gt;Ingestion&lt;br/&gt;&lt;/b&gt;&lt;/font&gt;&lt;/p&gt;&lt;/div&gt;" tags="Background" id="23">
<mxCell style="verticalAlign=middle;align=left;overflow=width;vsdxID=30;fillColor=none;gradientColor=none;shape=stencil(nZBLDoAgDERP0z3SIyjew0SURgSD+Lu9kMZoXLhwN9O+tukAlrNpJg1SzDH4QW/URgNYgZTkjA4UkwJUgGXng+6DX1zLfmoymdXo17xh5zmRJ6Q42BWCfc2oJfdAr+Yv+AP9Cb7OJ3H/2JG1HNGz/84klThPVCc=);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="356" y="279" width="152" height="20" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="24">
<mxCell style="vsdxID=33;fillColor=#FFFFFF;gradientColor=none;shape=stencil(lZTRboMwDEW/hlfLsROSPHfdf1QrXdFYqSjdur9fWIBiENF4S5xzc20rcca72/lwLTLCW9vUH8V3eWzPGb9kROXlXDRlG1YZ7zPeneqmeG/q++UY99dDR3arz/qru+ERdXkOxnUqwp8YUYh/+9eIV+VF4poF7h3kfip4uzfRQPUSBPS9pA95D2xi6EExZBis6ikaKdtDHCPaAuse4iekUvaawCzcB6vBHRfOg89gjdLW5cC83iaUHQ212VSOKBNEYC/zmxQhM050BlOOhkDZmau09Hro/mj5TIsXDK+UKvsyEYyPI8k7UFoKNGCi8cHAyfeZW/C0Lhhe+4g70O7/uGMgvSWdIEhcv6zX2dn3koJwjEoIuitMQsBgSAoMmERHHYGb8zZRcuBp20DZOH/SeFg8R92prKo4Kafn89EYQnGs8v4X);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="85" y="903" width="58" height="61" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="25">
<mxCell style="vsdxID=34;fillColor=#FFFFFF;gradientColor=none;shape=stencil(lVfLctswDPwaXTEkwOc5Tf8j0zi1pq6dcZw2+ftSlUiRUARZN5nGavFcUB09vB2fXg8dqrfb9fLr8Ld/vh07+tYh9ufj4drf0lNHjx09vFyuh5/Xy/v5efz9+jRYDk+/L3+GN3yMOOOBcECh+hxPEMj/P/g+2v94v44APf7vECJNCM0g6gPHk4ig7WQ0HRmIZjKipdF0pA04qtlP/bnytkZM3mhQKAAsKN8CCLzfxeABzS5AACsBPBjdAiKouAcQdD6506UEiG4XgAAlwCKtwYEXChcshJYhvcIIhQsIPrQAAiWkNShwngOcEEMCYNv5KdFWAKRGYFnaBLTWLuPXJkuByRBdMFG3o2UJYjtZyQ3KRrQca5qtjERPGoJh9AVT6BEsMvo02b6lr4yoNIARxq4CrAgB97ZC6IXA4DKi4j75zVRxCWx93ZbMLYlVYhliHowSmWrDUm1ICjyrvmrD2RBV1fi2KBT3T7W+xVikoKS9igCLFXfyqxYtVivcqffLCM78jN4GiHxCYpHQTO8M+MjoQ26Xr8fZlFnMTarUunlSMEu7zLngeQjCWkiAEmYRC7QCwAAt9AuFRk+artuAU4YkRfXgIieQ9pSbbxLTGwKQtAkDl4nkopSjgZ+tTgsoXTBcvk5UmzAKSU0M3nGAF5KUm6Ayt8Ie5OauLIQ73UkAJ913bA6vApggMqi2aM6ClotmTAugPBlrNWB3hXTllFZ/WkCuDdrGvJLuBGyumxqShXCWtKw8tmyXz1arBdETNGFjc6SH+Vr/0p9O41dB/T//DEhH4ycEPf4D);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="84" y="903" width="59" height="63" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="26">
<mxCell style="vsdxID=35;fillColor=#2d5967;gradientColor=none;shape=stencil(lZBLDoAgDERP0z3SIyjew0SURgSD+Lu9kMZoXJi4m+m8Nm0By9k0kwYp5hj8oDdqowGsQEpyRgeKSQEqwLLzQffBL65lPzWZzGr0a56wc5/IHVIc7ArBvmbUknugV3jBH+iPqZ9oEvfiHVnLdz/z96GpxE9CdQI=);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="139" y="955" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="27">
<mxCell style="vsdxID=36;fillColor=#2d5967;gradientColor=none;shape=stencil(lVjbchshDP0av2pAYrk8p+1/ZBqn8TSNM07SJn9ftruAEAHct/Va4ggdXfdANy8Pt8/HA6qX18v55/HP6e714UBfDoinp4fj5fQanw709UA39+fL8cfl/PZ0t/1+vl0l16df59/rCe+b3uIg4KqF6mN7Exaw/1582+S/v102Bb1rLEC0a2ihot5xF0KwYRfCLOR2pHfapdQuQlKkg00evG2wPdXg6MAtAtyA1zW4tuWshI/gRvAWwiLQFVhXoxtwVIN7D1RjM5n9jXfpoB378fTEaGIKuykerB7Zqg2gMNYRWFMbSxZ0baxbQLBkAhhTW7sK4cBaprEraFAzZk0Q5mrQ+iCZXZywV4EWBn/CbHSX8hNqsYa3CwQR1QYEuKVsD6NWQGM6usds5SmTeesTS8JT0d/oG2JTtiVjFwVeGhsgCHOL1CD/dY3PT8Z8a93AW0FUZCUnVIFXuu8tG28aKn81CtJeF4Bc4y8l/OUDLKY22DggYXAsNij8Ffmivr1cYbeXQI8VjJUK6AcKkULhEZcK9JUKmma1RKnagVHDCMKLDGaZxn0MmrKUHiZmix3zyc+wYyH3c2yEZYjNdVKdaiLdGVCiLKhplqkRLMaW5mtYVWPmmM+Q1OQ2k7n2vq2nnfB06+fgp7AzitvgyoHTgWXhN4K1g0rCFDoduDGzaKT4cGDE7EHYtP8cnb2xJwn0Ci7lwvkhkyLPWw58mMDGkky+Ro4Bbge9aT4c/q+8GD5VJWxEZWx6dBwITO0Iygma0xEBbe2JJROXXOGpnJRGGtBD9gOBZB9IzAfxtpJ7XaZTaoSurkNFheWIiDxmYAKP47SbXly7NOf0GijzaKpQbOjClpw0rZVXvdCPIuPu/cnEz49lE78Ev2ounF6+nQu5V7sjP+enO/NPeWcquo0nbCzEJjD7N5/FO3dpKkQlj7BlJzeinJEdzmWaixoyrgl1AeHhvMvTZIVco1nsRWYpyyGLZkGpiRP17GZ20kJWf8lZlB3b31+5iX1Op5dvo9no1CX7Ww6FtO31t5x4s31+vmrL0XHdG1qqqRCQIpJACU/FbqtF0YtRiiL6P5m/ilTPUy4nWsZnJ6etwTaZz63sbw3N/WdrQ+PfeY/gtJUekRafHFksAPpNooms2t4r8jA+lG9Q96fHx+0TFv9ffrOKr7bvXfT1Lw==);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="85" y="904" width="53" height="59" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="28">
<mxCell style="vsdxID=37;fillColor=#2d5967;gradientColor=none;shape=stencil(lZfRchoxDEW/hleNZdmy/Zwm/5FpSGGaQoaQNvn7artrG2mDmb4txvJBV/LVsqG7t93j63bj3dv5dPy5/bN/Ou829G3j/f6w2572Z3na0P2G7p6Pp+2P0/H98DR/fn2cdk5Pv46/pxM+5rhQoIQpyrvPecWBy/8WHub9399PcwAuEQ6QlwisITiHuA8/r5ADjsumugSYlk00r3gPcVn6XJYycBrBMUDUbFlp5/p6iCfN9tiyrPCwYstvLmUEl+81W6RwQbOdBk/yZg2Wn2LAsUAMIzD1Gi0rXABt0kmjU4JsBMcIHDQ7B0hD9lQkk3ZBYEMnhOA1vzB4NpojONT8kgFpxI/SSabizmk4O4im4HKs1V0ki9HAI3g/gqfcu6QnH1jzs2RqxM8R0Gv+pFrR/MQ3Oq4kQNR8zr2s3ghS6dJQZOh9D7XOjDy8ai2idju16n10mU3ixK0WLXFu9nBx1eIwb+r2UfswQIhGd7lcrPG4rruUgjRdLIOGFpfdCl8gGdVTL3GlS6LGZaTpnGk6qm1wBc6+NkXv+GZoFR4ZQtFwp8mXxk5fO/vL/vBfk+DW5Mjtel8bHZJ71qlNMSY3SrUzu5eJ3RWdH3kgo6xUJA29xKdWoMpPHryZXVIhlzWfU4O14eV6LrXYCHHYV9Kd3thJjJDNpcIEbOxMtA6GL2dlk7/IS0M7mypqzFTEbspez1/sPdr8Exh8V/faGJPR5zVepkuyo2Rdfix9V8/VuqkoEoY3S1TMpPmitS2/XC00V0t2FcPn9RgXdcfySxelcDN/6Ug2pirGkswoT91rmrFg9b5r06zYUfpF9eVCBtt90lcm/WmXmeQ3B8plTO3+BAYvE9cZ9TmCufsiEdpRijDMnWVGG1eVFyRj6TH3TV0OZ1tv7awr57tlrasAeeiv6M/7l5f5Df/ye/tKL0vz3wG6/ws=);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="121" y="944" width="14" height="14" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="29">
<mxCell style="vsdxID=38;fillColor=#2d5967;gradientColor=none;shape=stencil(nZjJctswDIafxlcM9+WcJu+RaZzaUzfOOE7rvH3BSiIF0oKo3hwZiIAfH5bxTj98HJ7f9zslPq6X88/9n+PL9bDT33ZKHd8O+8vxip92+nGnH17Pl/2Py/nz7WX4+/05WaZPv86/03+4DX7BQ0hOSnwND7SBKP89eRrsT8c3am8UddAQ7bJDtCAccVAGNOPgLThLHDAivWzvHAhqLxVYzzhgRLF2UIy9Bu+JvVg21g6U7jbOWvdFUqTuTLVI3aclfmu21Kq8vpOGnF8nboIaZ3E7jFPZ3IZIChadqRbw+rQsYHfWKrUOU9yWhtScjD4tbrn7O1mWgqG57RPevGlDPpq2z1fSbQfJiqDtqFopWTsMV5hopu0adGIb02JTv/zH7F+xp7slCojUwVoI3AskSAqodRCYigUBqnKI4EjK3z8vQ0xyLCkaTNiNj5zMnXdTo1WAOFmprL0Yi33T2UpOPT4+cgYck6HHfCpi/JTC/QzxrVRDj6IzDPjMeG4TDYZhEgPQNCTvQTJQYoqmapOsw4LoTkFwVHQfqeJYBFkpPivVpDiW13iqeGHgbrRIkKfRJsqYJWvbsZE5vj/oTYm8z0HXcxVDUkxIRoChEGDSWnGK6wDe1opDLbr2ha4iuqhE1xZMpKJjxRXDlFZTF2ZEHEQmQ4XU0m25Qq3EstLOX+kLpaYAOjsPHUTlUPd2LbpCsirM51NjVFiJwnCBP0+gUWEZy3Yv8DtmnEsseTVuedFDfQ6k8cxI2NgX8jsDQvIllwEmWDkg556VfLYBCvrONpLn0Cf0XV5Ok+RYPl9JjuhrppNVM52R/GCYDBtsFX8B4FUY6BskvxLb1ktBcg4WJF0YRYel4eLKpScbhfNwCdN5lkWfVWsSHSuce0bXGNyfhk0nF9CW5m11hwT2zkkbYIt5U9OVeNISqxKoM24WqCyXxox8KnjasrIRvBrmaXtTuZty1/fBFpra80Pmk2fpwJG0OCsdUTbJvOc4h7yrsgMuNPZemS3BPFVwVWqq92yhfhXmPdW7bOoseFrn3Fmej4H52GR4irKeQjiYFTOFNh/mHQ74ofzG9Ho8nYafqObf179J4aPh9yz9+Bc=);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="114" y="936" width="28" height="28" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="&lt;div style=&quot;font-size: 1px&quot;&gt;&lt;p style=&quot;text-align:left;margin-left:0;margin-right:0;margin-top:0px;margin-bottom:0px;text-indent:0;vertical-align:middle;direction:ltr;&quot;&gt;&lt;font style=&quot;font-size:16.93px;font-family:Oracle Sans;color:#000000;direction:ltr;letter-spacing:0px;line-height:120%;opacity:1&quot;&gt;Microsoft&lt;br/&gt;&lt;/font&gt;&lt;/p&gt;&lt;/div&gt;" tags="Background" id="30">
<mxCell style="verticalAlign=middle;align=left;overflow=width;vsdxID=40;fillColor=none;gradientColor=none;shape=stencil(nZBLDoAgDERP0z3SIyjew0SURgSD+Lu9kMZoXLhwN9O+tukAlrNpJg1SzDH4QW/URgNYgZTkjA4UkwJUgGXng+6DX1zLfmoymdXo17xh5zmRJ6Q42BWCfc2oJfdAr+Yv+AP9Cb7OJ3H/2JG1HNGz/84klThPVCc=);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="77" y="970" width="152" height="20" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="&lt;div style=&quot;font-size: 1px&quot;&gt;&lt;p style=&quot;text-align:left;margin-left:0;margin-right:0;margin-top:0px;margin-bottom:0px;text-indent:0;vertical-align:middle;direction:ltr;&quot;&gt;&lt;font style=&quot;font-size:16.93px;font-family:Oracle Sans;color:#000000;direction:ltr;letter-spacing:0px;line-height:120%;opacity:1&quot;&gt;SQL Server&lt;br/&gt;&lt;/font&gt;&lt;/p&gt;&lt;/div&gt;" tags="Background" id="31">
<mxCell style="verticalAlign=middle;align=left;overflow=width;vsdxID=41;fillColor=none;gradientColor=none;shape=stencil(nZBLDoAgDERP0z3SIyjew0SURgSD+Lu9kMZoXLhwN9O+tukAlrNpJg1SzDH4QW/URgNYgZTkjA4UkwJUgGXng+6DX1zLfmoymdXo17xh5zmRJ6Q42BWCfc2oJfdAr+Yv+AP9Cb7OJ3H/2JG1HNGz/84klThPVCc=);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="71" y="987" width="169" height="20" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="&lt;div style=&quot;font-size: 1px&quot;&gt;&lt;p style=&quot;text-align:left;margin-left:0;margin-right:0;margin-top:0px;margin-bottom:0px;text-indent:0;vertical-align:middle;direction:ltr;&quot;&gt;&lt;font style=&quot;font-size:16.93px;font-family:Oracle Sans;color:#000000;direction:ltr;letter-spacing:0px;line-height:120%;opacity:1&quot;&gt;(on-premises)&lt;br/&gt;&lt;/font&gt;&lt;/p&gt;&lt;/div&gt;" tags="Background" id="32">
<mxCell style="verticalAlign=middle;align=left;overflow=width;vsdxID=42;fillColor=none;gradientColor=none;shape=stencil(nZBLDoAgDERP0z3SIyjew0SURgSD+Lu9kMZoXLhwN9O+tukAlrNpJg1SzDH4QW/URgNYgZTkjA4UkwJUgGXng+6DX1zLfmoymdXo17xh5zmRJ6Q42BWCfc2oJfdAr+Yv+AP9Cb7OJ3H/2JG1HNGz/84klThPVCc=);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="60" y="1004" width="220" height="20" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="33">
<mxCell style="vsdxID=45;fillColor=#FFFFFF;gradientColor=none;shape=stencil(hZNNEoIwDIVP020nbYSha3/uwShIRwSnguLtBVtpU0V3Tfoe+ZIGhutrlV8KJuHamfZU3PWhqxhumJS6qQqju/HEcMtwXbamOJq2bw42vuSTcjqd29v0hcH6VoorNbkkPGxGALzinZXve2P1whlWPMucQVAHDNImXPhwoVI8RadAqnBhlvJEhVVr3QSQQAGRZ78IgdIBR0XxwhYo8RsvnAohXiiZJBxUVJbWnGc0V/RYGEvwe6N0KF6+MMMY0hvE57vIuREhKah/3eXhRDtDQf+u2Hjw61nqurbbHd7H6zym7K+A2yc=);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="86" y="156" width="55" height="61" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="34">
<mxCell style="vsdxID=46;fillColor=#FFFFFF;gradientColor=none;shape=stencil(lVTRcoMgEPwaXpmDQ5TnNPmPTGOqU6sZY9r076sF5cAhJm+47HJ7xwrD3bU6Xkom4Tr03Wf5U5+GiuEbk7Juq7Kvh3HFcM9wd+768qPvbu3Jfl+OE3NafXXf0wl3q1OGGzOpJPxaRHIs/oGD5b/feisQdl9rrnKnEJEE7tIiJueoHMlBipvMkXBNcpBQXOe0elO3xC1VWKTIeC4e2aWSGcq4VKHfsSnUod9RqGVomA4LY1aiPiLXIqpPTpbzBHVcnpjEFQkT3YfjIoLEeGO3RCFW1yZ9RxiaJQFIjyoOVuh1O4hbwYVHjSnBdRQDCNuCsCWYJ7u0BOyVqAJ7KaYQejNmyePsj3bgIAHAtqY+cxJ1s2L1e/hT4zJLNkd30XA857loev6TyfQCsbogufSSRZe4OR5IW9xI2Ljwj+q5bhr7JtP9+BEeIfuA4/4P);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="86" y="155" width="56" height="63" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="35">
<mxCell style="vsdxID=47;fillColor=#2d5967;gradientColor=none;shape=stencil(lVjLctswDPwaXzF8P85p8h+Zxqk9deOMk7Tp3xesRIoAKSq6WTTIBRZYgNJB372dHl+PByXe3m/Xn8c/56f300F/Oyh1fjkdb+d3/HXQ9wd993y9HX/crh8vT9Pz62OyTL9+XX+nEz6nfVKItEeJv/Ozgvh/4WGy/v5xm8wlt58XFPhp4VNNC86DmU3mlXnHp54eTYQYZwtdW6xAagU2UFBBIQXFW1zS9H/dj/FyfqkYoXwED3bkHGMjZvPiG3rvFfWvcDhgJNuswCLJylHo5VQOk3Er5zQ30f1wKTVbxbLPmhZiNKADsXcbpVjvyLRo0Iz/qEAFyoOz4CgPQYEzlAlk2IURvJcQJYOP4CVTg4DoKLwX4FiBdgoArawayiJA9BQ/newovvIQefgxR7bUAZaTbOPXw/gbVSKvlrGPTLPiTymi4JWNLpkPgzKsNsz0mbFIpS2MZ1+R8Vw8RakVCdl9kR1ZvBUgNXV3sVpTqwZhKH598gwWDDiGX3upS9XnHGd8Hj5la1tYe+23hIuVqYd8dJSLe1g6OsI1EgSjo6Nco3OGvq5cY0Ey5XSUaxxItalcPCsOO0dHuelk1jk6yk1emk3lYvxi3Lka5SZiNYVvlYtuey6GRrop9zuUKyOovdJVJu8ZSRexPKuVjnQXq69Ltz55XbrJy23pNvFvabHR1u4N7P6HzBmywUPwI0YUqx1kI7JshLZyIbCu3xHOuIdyxWY3Cyy/ZlkIbbPwLAHD5GML4sUn2SULCbf8eqf4Nas2WrmDdlpk2ZKhl8m5tEirGbhtRNqJGrM+RPcMWgkQimI39V61kPUU40FD4Lp05HKwodipNUYGLxarqjWaNu6NS43hCa8IXW2NmBoG3nbGrYxXO2TZwQL3TZuRoqEdgyw9IF8mh/f0zRaw1562mFR/kdin0a7G9QeC6R0FoVifcXKxyoqw5b1oUIVoNb4hdCZ0ffL6hK69XJ/Q2/E3Ezri7GJDpy3DkPM8KMPxG14zoPFlQewd0F5nlY0GtLeNZtr5XIy+Pp6rc9enc+3i+nRugm+GbdnRJ7fT1R17bU85a19ZLbt5YvoV8xdlFRlby5V5xscfy4ef5/PlMn03qv/nH4pwafrIpO//AQ==);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="87" y="156" width="53" height="60" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="&lt;div style=&quot;font-size: 1px&quot;&gt;&lt;p style=&quot;text-align:left;margin-left:0;margin-right:0;margin-top:0px;margin-bottom:0px;text-indent:0;vertical-align:middle;direction:ltr;&quot;&gt;&lt;font style=&quot;font-size:16.93px;font-family:Oracle Sans;color:#000000;direction:ltr;letter-spacing:0px;line-height:120%;opacity:1&quot;&gt;Other relational&lt;br/&gt;&lt;/font&gt;&lt;/p&gt;&lt;/div&gt;" tags="Background" id="36">
<mxCell style="verticalAlign=middle;align=left;overflow=width;vsdxID=49;fillColor=none;gradientColor=none;shape=stencil(nZBLDoAgDERP0z3SIyjew0SURgSD+Lu9kMZoXLhwN9O+tukAlrNpJg1SzDH4QW/URgNYgZTkjA4UkwJUgGXng+6DX1zLfmoymdXo17xh5zmRJ6Q42BWCfc2oJfdAr+Yv+AP9Cb7OJ3H/2JG1HNGz/84klThPVCc=);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="54" y="222" width="270" height="20" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="&lt;div style=&quot;font-size: 1px&quot;&gt;&lt;p style=&quot;text-align:left;margin-left:0;margin-right:0;margin-top:0px;margin-bottom:0px;text-indent:0;vertical-align:middle;direction:ltr;&quot;&gt;&lt;font style=&quot;font-size:16.93px;font-family:Oracle Sans;color:#000000;direction:ltr;letter-spacing:0px;line-height:120%;opacity:1&quot;&gt;databases&lt;br/&gt;&lt;/font&gt;&lt;/p&gt;&lt;/div&gt;" tags="Background" id="37">
<mxCell style="verticalAlign=middle;align=left;overflow=width;vsdxID=50;fillColor=none;gradientColor=none;shape=stencil(nZBLDoAgDERP0z3SIyjew0SURgSD+Lu9kMZoXLhwN9O+tukAlrNpJg1SzDH4QW/URgNYgZTkjA4UkwJUgGXng+6DX1zLfmoymdXo17xh5zmRJ6Q42BWCfc2oJfdAr+Yv+AP9Cb7OJ3H/2JG1HNGz/84klThPVCc=);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="75" y="239" width="152" height="20" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="&lt;div style=&quot;font-size: 1px&quot;&gt;&lt;p style=&quot;text-align:left;margin-left:0;margin-right:0;margin-top:0px;margin-bottom:0px;text-indent:0;vertical-align:middle;direction:ltr;&quot;&gt;&lt;font style=&quot;font-size:16.93px;font-family:Oracle Sans;color:#000000;direction:ltr;letter-spacing:0px;line-height:120%;opacity:1&quot;&gt;(on-premises)&lt;br/&gt;&lt;/font&gt;&lt;/p&gt;&lt;/div&gt;" tags="Background" id="38">
<mxCell style="verticalAlign=middle;align=left;overflow=width;vsdxID=51;fillColor=none;gradientColor=none;shape=stencil(nZBLDoAgDERP0z3SIyjew0SURgSD+Lu9kMZoXLhwN9O+tukAlrNpJg1SzDH4QW/URgNYgZTkjA4UkwJUgGXng+6DX1zLfmoymdXo17xh5zmRJ6Q42BWCfc2oJfdAr+Yv+AP9Cb7OJ3H/2JG1HNGz/84klThPVCc=);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="60" y="256" width="220" height="20" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="39">
<mxCell style="vsdxID=54;fillColor=#005ba1;gradientColor=#005ba1;shape=stencil(hZPLcoMwDEW/xluNLEGw13n8RyYhxVMCGUPa5O8LtQvIeXQniXvh+CIrXnfV/lIqwq737Wf57Y59pXijiFxTld71Q6V4q3h9an354dtrcwz9ZT8qx+rcfo1vuAVfjoA0ugjvYaJzMPw72QXD4eqDQwcBEWQ6WnTqwRuFEUZFbA1YGwUsBaKNn6xds2BEwWcyIP2ODyWbJTC5ZBtOgFryWQtmJQEzC2QlpMY3mE+ilPIUtChgxUmQ0TGhToMJlEEnoLOGX0QkQWf9k+hTyFms//5kYSTj8hz0uBD8GA+/WLV/A00NQzFv9snVdbgYy+fpTRhG4Rbx9gc=);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="91" y="320" width="47" height="54" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="40">
<mxCell style="vsdxID=55;fillColor=#e8e8e8;gradientColor=none;shape=stencil(lVLLDoMgEPwargR2W/Vu7X+YqpXUikFt8e8rxRck2vS2DDPMDhmCcVumTU6AtZ2Sj/wtsq4keCEAoi5zJbpxIpgQjAup8ruSfZ3Zc5Mappme8mVe0FbHGTMaYIM9nxllwRe5WvqtV5bPfcEEhCGNwEIaFijAiQWeTONqNMkGdDk7zgD0xF3v9dXJhrmuYUQxdH2Z6/kzr5cW+BJt9tzu5a5xkPUw6fb/3DW0/52z43Yv9Dl7WStR/1OFcVhrVIiqsi3c3vu1GyFbWUw+);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="91" y="311" width="47" height="17" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="41">
<mxCell style="vsdxID=56;fillColor=#50e6ff;gradientColor=none;shape=stencil(lVLLDoIwEPyaXpuyCwHPiP9BBKQRgRTQ8veCi+kjgehtO53tzDTDMB3qvC8ZiGFU3b18yWKsGZ4ZgGzrUslxmRhmDNOqU+VNdVNb0LnPV+Y6Pbrn+oKmvUCIdQfETOfwxBP8IBeiXydF/MBf2IA45lFEkAYD4cYCb00jAZHg4stBl7OjDMDD2NU2r24ywlW1vaHLwB/zemkXE4EradtyXRxEPQxqf5/rQvu/ORsTkLiqhrMXtZHtP01YBtOiSjYNldC+91u3QNRYzN4=);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="96" y="314" width="36" height="11" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="42">
<mxCell style="vsdxID=57;fillColor=#198ab3;gradientColor=none;shape=stencil(lZJNcsMgDIVPw1YDCGO0TtJ7ZBqnZuLYGeK0ye0DFfmBhTvdicd7+oQtgatzvz11QsvzHKZD9+N3cy9wLbT2Y98FP8dK4Ebgaj+F7itMl3HH59M2OVN1nL5ThyvnDAG1KaXljRWERv0KH+z/vAQOqHyPIHVOZEmCJVaumhVlQT1ML8llE+ZYNuRjo0AtklNTLMnOQGtLdJrPVGgpS/L7q7NEsblZolsL1JR0IjCqpDsEKuFOA1GJf87zgJsWbLMEj21d9dGVAargaURV0v9+eP2/Bz/+az9i8VquvR8G3s33+3oZo8SLjJs7);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="100" y="320" width="28" height="4" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="43">
<mxCell style="vsdxID=58;fillColor=#f2f2f2;gradientColor=#E6E6E6;shape=stencil(pVnLchw3DPyavaJIgs+zY/+Hy5ajrSiSay0n8t8HzA5BTlPDlUs3eUyqB0CjGxid+MOP+8/f707O/Hi+PP119+/56/P9if84OXd+vL+7nJ/lpxN/PPGHb0+Xuz8vTz8fv17//f1zPVl/+vvpn/obXq73sqcc6i1nfl2fxEgm///k0/XCw/lxecESHx9P8tvKe46nQqUcX7DGvOf4bwf7/gv7/NtAvL/AntwuQ19+Xq437HaFKfjtyvaIHV0xzIvbDlnKcTu0PWKjh7hlg7hle3vkMrFdoWt+FdwlCnvwQjHvsV3Ud27ghXwG7EC+rLFdBmxP3iO4LQDOxA7BnQVwR26NbRHbtsoO2LyHtpKuhNAh7qFtbocOsbPbY9tEJULFDTkAT2TtVPEIWbfxRtYrlRLAC82RcDzF7nt+WB8lD/C+leIIPvda9Q4oUHUpRkT8QAXKXumSAF+SuxCk8cbWRsRx9b5V4CK8L1mGbGUyYf+6ph86zpYhv8yV0cQ0bLMHTp3GLXPkgKGeLDA0Ul7WyLUcKmxuN3rIlNIeWYjFSBAy2ByeeCmHomEQsvDeATsNxGwoADVML0gjC1PKa2S90nS4S3NDZrJ+D+7tVOnSkBTcx2Ykx13Z2N3Qfabo9ui1U4BnQTiCqhC0Wg0/MMUlzUU2HNA8SK9g0ePUliFowV66BGXwoRCbNR3hp57Yhp/IgxNVKgDrgmQJ4IdDDb40th7DoxdFSSy2eZqqH92sirELbGs4btJ9nH7IfpS2xegjWkIMZDD5gZIDdHm0Rvd9cGjwSWVa4Z26hOKnSZOrCkDnyam0JJ8U2k3wCeCFwZh7r4nubZ+Q+Vj6vSEMF7Z3SU1LDl6WlRYqjqbFN+hygD7JbppaJFUWUiWnzFonQhsnO7xTMC3VMFo5fUlQKZH5CH6UQrOoI2fgaXZJs0iK5SgHW0KMTtKKH/pLdqasZVLuoDVVFkD2xeAMdooMFDN+hvhFTNbDU70DnSLSGsCe5JSB8vvBQbshAbwPsFy8MoygSvo2Q4zDCMPIzJGgUcZFZXs0bSqwa91ebfa7kKxKOjlpqZY6EDMFGE3FBBjii/M+Itlta0wLUE4FCFBSFZbsljs4fDBjeuUlHXiw8M2DCY3Bt3qbG6NPZTLOPqLMCfCdgjX8QmACInptIOozn1mCi0MHsCBHCRxIuA59ZXVo0nGzEK4ktHQfmY0s9LSZFgIvImf30E5FpkFzadvuEPZ6+5bOcNDQBfdf4UAG7MExFdyRBdu/WXHZ4T3MnGIdBvDrGwHhpfU84Nc1HfXENR080pOiqjhOnSCn41v2qc+BnLHV3ViTrwZ3FD93LnfnNzhzB4Lwk+0EafCZAF3MzC3RvZ2iT7mTqjEPQhcjjdDskjPPe3A5lRdjh3SbtvrGqO1T1qvHqzCWtx+vvZx3x9PS1WTUjdCBSQZSFB5P0AVShgDd/4ruoepDaDddYu8qc2w3h3shK7iKEBNne9l2AqwWkadKVwEsU3h52WRBuhC+eMhErn7V9zhQdckMZtcPX8N6wv0yeq/Td4fvWq8sj93d+3JRYLWpAwr2uL+xVnvu27DVxAYgl0hVxPgtJdA43x8N831Yxi+mkKDLpdYG8Kt8AL4kjmFklt9lwGBuDhX1NwP9RPbQWetbAn51AnczfnHXsLbX7pM6VRRlseaf+2Dbt90AGu/D9KFVltKlxQmxAmiLTJIG4ZNybbBYj1+yin4eHr4nrcMPffEYhipwGGlRFyd4HCnrpO+m6NefO4Of2C959Sg+oX8yGFY46H6Rvvi71e+fR4YBw4LF1R6CfaXOPIBedIF9M/flTgT42lUofXka6CVtDmfaQfjfttu/wSrkh/6ntG/nh4frX+LG/8c/vcmj65/t+ON/);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="97" y="339" width="38" height="19" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="&lt;div style=&quot;font-size: 1px&quot;&gt;&lt;p style=&quot;text-align:left;margin-left:0;margin-right:0;margin-top:0px;margin-bottom:0px;text-indent:0;vertical-align:middle;direction:ltr;&quot;&gt;&lt;font style=&quot;font-size:16.93px;font-family:Oracle Sans;color:#000000;direction:ltr;letter-spacing:0px;line-height:120%;opacity:1&quot;&gt;Azure SQL&lt;br/&gt;&lt;/font&gt;&lt;/p&gt;&lt;/div&gt;" tags="Background" id="44">
<mxCell style="verticalAlign=middle;align=left;overflow=width;vsdxID=60;fillColor=none;gradientColor=none;shape=stencil(nZBLDoAgDERP0z3SIyjew0SURgSD+Lu9kMZoXLhwN9O+tukAlrNpJg1SzDH4QW/URgNYgZTkjA4UkwJUgGXng+6DX1zLfmoymdXo17xh5zmRJ6Q42BWCfc2oJfdAr+Yv+AP9Cb7OJ3H/2JG1HNGz/84klThPVCc=);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="74" y="378" width="152" height="20" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="&lt;div style=&quot;font-size: 1px&quot;&gt;&lt;p style=&quot;text-align:left;margin-left:0;margin-right:0;margin-top:0px;margin-bottom:0px;text-indent:0;vertical-align:middle;direction:ltr;&quot;&gt;&lt;font style=&quot;font-size:16.93px;font-family:Oracle Sans;color:#000000;direction:ltr;letter-spacing:0px;line-height:120%;opacity:1&quot;&gt;Database&lt;br/&gt;&lt;/font&gt;&lt;/p&gt;&lt;/div&gt;" tags="Background" id="45">
<mxCell style="verticalAlign=middle;align=left;overflow=width;vsdxID=61;fillColor=none;gradientColor=none;shape=stencil(nZBLDoAgDERP0z3SIyjew0SURgSD+Lu9kMZoXLhwN9O+tukAlrNpJg1SzDH4QW/URgNYgZTkjA4UkwJUgGXng+6DX1zLfmoymdXo17xh5zmRJ6Q42BWCfc2oJfdAr+Yv+AP9Cb7OJ3H/2JG1HNGz/84klThPVCc=);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="78" y="395" width="135" height="20" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="46">
<mxCell style="vsdxID=64;fillColor=#FFFFFF;gradientColor=none;shape=stencil(nZBLCoAwDERPk31tjuDnHoLVBmsrtf5ub0sQRdzobiZ5ycAA5pOuRwVSTMG7Xq3UBA1YgJRktfIUogIsAfPWedV5N9uG/VgnMqnBLenDxneZEOlGip09u4pRQ/aG/gTPhFf0Gf8J/otGcdXRkjHc5n3/rC+OuHosDw==);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="83" y="451" width="61" height="61" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="47">
<mxCell style="vsdxID=65;fillColor=#FFFFFF;gradientColor=none;shape=stencil(UzV2Ls5ILEhVNTIoLinKz04tz0wpyVA1dlE1MsrMy0gtyiwBslSNXVWNndPyi1LTi/JL81Ig/IJEkEoQKze/DGRCBUSfpbmemRFIl5FBJUTESM/YAizgBlGfk5mHVz1CBKsGuHHkqifVPZSqRw0fQwMDFNUGuI0mUyHMBqxK0a0nSTG5SoEMRHJJy8zJgaQ2ZHn05AUUgiRNY1cA);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="82" y="451" width="63" height="63" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="48">
<mxCell style="vsdxID=66;fillColor=#2d5967;gradientColor=none;shape=stencil(pZrdbqMwFISfhlsLbLDxdX/eo1LTDdo0qdJ0f95+QShq6WFnPOQuDd/Y33EzKqmowt37/ultV/n6/XI+/dz9Hp4v+yrcV94Px/3uPFzGV1V4qMLdy+m8+3E+fRyf55/fniZyevV6+jWt8GfO9a7vppCv/85v5MY18zuPM38Yjl94n24O9BEGjJHKEyHOL0+orZ20fpdv5Mm8xkfliQ/nl+eT/PVy4QaflzcHyMhWSQ4QpYIA6VnvnU9SbdRASjBgjFSeCHGe9Iysb3sj8mRe46PyxIfzrGdkg5XaqAEyslWSA0SpIEB6loJrvVQbNRB7GDBGKk+EOE96Rta3vRF5Mq/xUXniw3nWM7LBSm3UABnZKskBolQQID2Lreuk20A5MH2wlPs6lSdCnCc9I+vb3og8mdf4qDzx4TzrGdlgpTZqgIxsleQAUSoIkJ51nZPuAmW+RrzVEXFoQ3HSMLy6LYyIw1GtjIhDGYqzbuHlV5qi8nDaFR+Vhz6cJ61qo+ulmz490MCANVJ5LMR50i2yvmmLzON5rY/KYx/Os4aRDWxl9AAeeUVJDmClggDpWUguS3+O9IB3uRd6IPNYiPOkZ2R90xuZx/NaH5XHPpxnPSMb2NroATzyipIcwEoFAdIzn10TlNrogRYGrJHKYyHOk56R9U1vZB7Pa31UHvtwnvWMbGBrowfwyCtKcgArFQSWp/QNrp0H3/VC4+KNgYy+/28kiQSBl+cRootBWT0GdxuP5hxtkgJr6gWB5eHE/vqf6sIdsvSLyuUfgNEkSLTmXRBANZIaIcFN58Dd7Ha2uD64Oql0UdMChcWDGQ0RV+qIuxKKzzhvJfFs1kHlpQqC06iXFnX9/3WvFzfBAN0Iwu0hOr74fEblZTgc5kdcvl7//kzL+Nb8PEx4+Ac=);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="84" y="452" width="60" height="60" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="&lt;div style=&quot;font-size: 1px&quot;&gt;&lt;p style=&quot;text-align:left;margin-left:0;margin-right:0;margin-top:0px;margin-bottom:0px;text-indent:0;vertical-align:middle;direction:ltr;&quot;&gt;&lt;font style=&quot;font-size:16.93px;font-family:Oracle Sans;color:#000000;direction:ltr;letter-spacing:0px;line-height:120%;opacity:1&quot;&gt;Table storage&lt;br/&gt;&lt;/font&gt;&lt;/p&gt;&lt;/div&gt;" tags="Background" id="49">
<mxCell style="verticalAlign=middle;align=left;overflow=width;vsdxID=68;fillColor=none;gradientColor=none;shape=stencil(nZBLDoAgDERP0z3SIyjew0SURgSD+Lu9kMZoXLhwN9O+tukAlrNpJg1SzDH4QW/URgNYgZTkjA4UkwJUgGXng+6DX1zLfmoymdXo17xh5zmRJ6Q42BWCfc2oJfdAr+Yv+AP9Cb7OJ3H/2JG1HNGz/84klThPVCc=);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="63" y="518" width="220" height="20" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="&lt;div style=&quot;font-size: 1px&quot;&gt;&lt;p style=&quot;text-align:left;margin-left:0;margin-right:0;margin-top:0px;margin-bottom:0px;text-indent:0;vertical-align:middle;direction:ltr;&quot;&gt;&lt;font style=&quot;font-size:16.93px;font-family:Oracle Sans;color:#000000;direction:ltr;letter-spacing:0px;line-height:120%;opacity:1&quot;&gt;Azure&lt;br/&gt;&lt;/font&gt;&lt;/p&gt;&lt;/div&gt;" tags="Background" id="50">
<mxCell style="verticalAlign=middle;align=left;overflow=width;vsdxID=69;fillColor=none;gradientColor=none;shape=stencil(nZBLDoAgDERP0z3SIyjew0SURgSD+Lu9kMZoXLhwN9O+tukAlrNpJg1SzDH4QW/URgNYgZTkjA4UkwJUgGXng+6DX1zLfmoymdXo17xh5zmRJ6Q42BWCfc2oJfdAr+Yv+AP9Cb7OJ3H/2JG1HNGz/84klThPVCc=);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="92" y="535" width="84" height="20" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="&lt;div style=&quot;font-size: 1px&quot;&gt;&lt;p style=&quot;text-align:left;margin-left:0;margin-right:0;margin-top:0px;margin-bottom:0px;text-indent:0;vertical-align:middle;direction:ltr;&quot;&gt;&lt;font style=&quot;font-size:16.93px;font-family:Oracle Sans;color:#000000;direction:ltr;letter-spacing:0px;line-height:120%;opacity:1&quot;&gt;PostgresSQL&lt;br/&gt;&lt;/font&gt;&lt;/p&gt;&lt;/div&gt;" tags="Background" id="51">
<mxCell style="verticalAlign=middle;align=left;overflow=width;vsdxID=70;fillColor=none;gradientColor=none;shape=stencil(nZBLDoAgDERP0z3SIyjew0SURgSD+Lu9kMZoXLhwN9O+tukAlrNpJg1SzDH4QW/URgNYgZTkjA4UkwJUgGXng+6DX1zLfmoymdXo17xh5zmRJ6Q42BWCfc2oJfdAr+Yv+AP9Cb7OJ3H/2JG1HNGz/84klThPVCc=);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="65" y="552" width="186" height="20" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="&lt;div style=&quot;font-size: 1px&quot;&gt;&lt;p style=&quot;text-align:left;margin-left:0;margin-right:0;margin-top:0px;margin-bottom:0px;text-indent:0;vertical-align:middle;direction:ltr;&quot;&gt;&lt;font style=&quot;font-size:16.93px;font-family:Oracle Sans;color:#000000;direction:ltr;letter-spacing:0px;line-height:120%;opacity:1&quot;&gt;Azure MariaDB&lt;br/&gt;&lt;/font&gt;&lt;/p&gt;&lt;/div&gt;" tags="Background" id="52">
<mxCell style="verticalAlign=middle;align=left;overflow=width;vsdxID=71;fillColor=none;gradientColor=none;shape=stencil(nZBLDoAgDERP0z3SIyjew0SURgSD+Lu9kMZoXLhwN9O+tukAlrNpJg1SzDH4QW/URgNYgZTkjA4UkwJUgGXng+6DX1zLfmoymdXo17xh5zmRJ6Q42BWCfc2oJfdAr+Yv+AP9Cb7OJ3H/2JG1HNGz/84klThPVCc=);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="56" y="569" width="220" height="20" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="53">
<mxCell style="vsdxID=74;fillColor=#50e6ff;gradientColor=none;shape=stencil(lZjdUhsxDIWfZm89trz+u6b0PZgSSqaUMCG08Pa1ullbPs46cJds5Hz+0TnSerI3r493L7uJ9OvpePi1+7u/Pz1O9ttEtH9+3B33p/xpsreTvXk4HHc/j4e35/vl+8sdR/Kn34c//A/vyzinlXY8ivTH8sRo/f/79yX8x9txiTfLz3NSzp8HmHaEfqcSo8M55vwoJZXMOcqeo6LydI6yJSrQkB6VAXoe4yzwgwqu45MHflAz4KNKY3you2XKGBcA71WIgM/zdoD3yiXg53kP8V7NBvBBkevw1gA+zwhXL6JsiaJrfNvio1PaAN6oCPgwK4LDt1ZF2+J9xs8jPDkVYfddXKdc+CZPiVq+s+VACl8FwHPQcPVUk8rgkEpXsWNbYBsFG+9I+ThC65KpK9molFqyLidR0EbpuUVrAOdBfghusSz+gFigsvgTUBXFFszaH551XnEAdpZQRDbKnJUfJthtDTJj4dsR3KgZ9puFD3BTk7EKL0KaUyeyHOSHHkNFqh9C9uBwdpWKhFs47D7Ha9DWyrN4bEe3IHEWogd8SXypcPBXfmSGBiO8Q4ieOoOj1OKN8KG6Vsy6siHb/kaQdXWjpb1CcavOIM3dtXBS19gBkq5mmChsKHJTc6Omt/Utu2hgu64F2HddplPgWYBgrFWloqg72PWi/u2OAnNOVwupruIQ3pKdMMDG7TawOR7sHLqYHJASrhetzQmv+OR62btxuTO4qqOuhosDEWXjiwftYKNN5yy5XhGUMJGHtVYWe/5ceucRHrZbqEbUafBUoT9Rp9FXruha/u+68LkroNxL2JaezSfAgXOX0rlaGBbR3P4YLGamePOKj3lGsPHsRyBu7tHgzOfyaIPP3R8sv44pfO4kL9QUOPnSokq8G9YU0fsKPC6f+2isKeAt3J5jNQ3rDLfgte8XtRzUJl4hPoTZQUGpLyeyjXHjra+vPaKHWvvT0kqsL1Cih4J9ryG2hKSh1OuIanhz7BaesGnMrof73i+cbW/Yxcgtrb4X+40nOPRsagSdxIVzZ+u7lnT4mprHJFy/SE3hf1dznv1vjBdiEg6IOe87v2OrIsD3kq9RG3xpJsIEoaJLY+pNcNvx8hMzLjPCSoUJXrB7cBye9wW/B35aZzTwe2rx+UAM+n1+M4OWgvMBVs+Zhvi4vrsOKjzy+1sKVhpeE6Qy8L3Tubwlaa8pnvbPX7nS+WJ4/lBvjx72T0/L5ZP8HW+b8qPlpsre/gM=);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="82" y="626" width="17" height="17" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="54">
<mxCell style="vsdxID=75;fillColor=#50e6ff;gradientColor=none;shape=stencil(lZfZctswDEW/Rq8YLgKX5zT5j0zjNJ6mccZx2vjvC1YSl8sxXb/ZMugjErgX4GTvPl4e33eTUR+n4+Hn7s/+6fQy2W+TMfu3l91xf5JPk72f7N3z4bj7cTx8vj0t398fU2T69OvwO/3D17KOFSmbVhl1Xp5opf59f1jCv38el3i9/DxHUvO6QLcr1JdZYwKpuMasj2Ikp9cou0Z5slvU+igGikO4IxdbuCwxGvCOLNA9GQZ6Cdrgjoy/Qrca6IqcBzpT+l7jA5PGzVtSoeX7SNEO+Yoit3w/k3ct33oKwPeSZNi+tRRcy3duy9oFvokEh+8MadviDed8bHiWrIYWb6qyWx+xozCP8Hour7w+4jnXw8aPZGH3bMnB5skbgG8xl7ZOHoq++teVoyl0YANp16QBbIjNiKwIwTrndyPLYeKRKwqxRasWPMex1FRLFUlHjVQLIhdFR4cbVqBxCTLDs9bkocxEeAyHLQkBjUuQ9tOVPJegS3Du0BoqTCo8wHHPOtdHLTDItTzyYSjwUkK6sEBgvbtpJmVaegqagb6d2MDdoNTkkLmD47mXdFXGPoO4t7q/xA7ZR84aqyuzpfP4lq1acGpmYGrDXiZSUpBv6GQMXlK9VRGwv2mv4grYP8sJFufwoK0qF7YP+s8c10ug4L+KWRs45VSELVpahbm1uKVVabDvJBvQdZhLjys1h807tepO2GaIlyUe6Lnfl+bhs9orukW6J8cdnofNS8YUrTv+Zk+ZH4jR1sDTJCTA4JAGqTE8koGakzVd54zE6GuhG1wkykPqJYqHjh67wSFpGfaep8hz0Ttj+1TQxTi3vkt+rqCRyQru9g05l5gYr25b3GPmK9tmyLmswTZaJye7Th5iBmmXKDfsZXU1FQNQyK8qsxpccP99zScjG/MrNVVTEyi+EmblflcFn4KGRZ+cpJ/ZsKElV8LTFwe0LV78TsPpFwu85LXlYlJN69vf1E4Pik8vjk2mn2Su3lbSmhZf34IK3kLy04UK6Cbf3aqLWhiOj1Whnys54O5FaJD8pEawvDSq4kUxR6381/3bLbfaG8PlQ7lAP+9fX5f7d/07Xrjl0XJZt/d/AQ==);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="131" y="674" width="14" height="13" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="55">
<mxCell style="vsdxID=77;fillColor=#5ea0ef;gradientColor=#0078d4;shape=stencil(jVLbDoIwDP2avZKtDRKfEf/DyJBFBDJA4e9lKYatBMNbL+fs9HQVmHblrdUCZNfb5qk/Ju9LgRcBYOpSW9PPkcBMYFo0Vj9sM9Q55e3NIV30at7uhZF4sXQUkBOlSlJ+Jex9sARW1E6S6KQWggoZcgRWmGBDGpFjMBhjR3aFLwWACM+hrD/aUpKhaMw0/0p6Cj9R5pO59EfCEHHII3PoL22rMPFd73lk/1mZ+vDfz8F6NIWpKro5v8+PbC7RgWL2BQ==);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="91" y="634" width="45" height="45" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="56">
<mxCell style="vsdxID=78;fillColor=#f2f2f2;gradientColor=none;shape=stencil(lZPdksIgDIWfhttMSNoC1/68h6PVMtbWwbqrby9d2BHojLN7lx5y+EKSCl7dut21FYS3yY3n9tsepk7wWhDZoWudnXwkeCN4dRxde3LjfTiE7+tuzpyjy/g13/AIvtqApNlF+AyK0aDUj7INhv3dBYeMCQaMjJYoScQgPKgQnlFgBq1iDi/RUeIKNH1iew/n6PRiWiS96UgLOhdwAvz48LTg34dXwJzTqxoameMxR5MBLNgI0qTo3g7JkBpoVDajMr2sFIseSdC6GJAErPMqFUHRI982U+eFLrYjr/QP6/Rvgw/e23u0fR+WPz0vt91L4U/hzQs=);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="90" y="653" width="20" height="18" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="57">
<mxCell style="vsdxID=79;fillColor=#f2f2f2;gradientColor=none;shape=stencil(lZXbctwgDIafxrcahECg6zR9j0yz6Xq63c1sNm3y9sW1AUs7dqd3WBZ8iF+HgR7ejk+vh8G7t9v18uPwe3y+HQf6Mng/no+H63grq4EeB3p4uVwP36+X9/Pz/P36NHlOq5+XX9MJH/M+dG7a493n/B0Fgvy1fJ3dv71fZ3+0G7Dt8DibPrz1WQwxg9DiQ7NJBMQvXtS8OO6xhYG9plMGDJqeM0TUfBRwrPmJIUTNp2rZwKcAmTXeQ9LwROC9hntANGyEaNgInPfYnAAN24FnDWffz11MTpPLE9eHqGRXddggR4KYNBkhkyYHASJNJhATdojApOEMsht2QJBo4A5c1PSSBGIVD92rysuQTOxYMo73+BSAUfNLYN6ITgQkRvQMlA2fWqF8dtNy/BbfgxPNp5amnV80TJo/XclkvJcm24q/yLbBL8m7CLTmk613BgqGz+CS5iP2WKjJi7v8CNnIHxi8pvu71Iu9CBscMGk2t0fbYJs+xxmSIWOrwEouXYXFZD0k8+q5KLib9bmGWNlyX+tItVk2uEQIJuxS3WhyTkoL+F/NS7Mm02VL6Trz7K3trzLujl7avpovp/G8GkdM/dSNDXddmWsNt+uWCYCmRHKfAE2rANGUSB9ctV/acaiv+8/pWRZ98r6Mp9M8uNf/7aQupnnK0+Mf);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="114" y="641" width="22" height="19" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="58">
<mxCell style="vsdxID=80;fillColor=#50e6ff;gradientColor=none;shape=stencil(lZZNctswDIVPoy2GIPi7TtN7ZBqn9tS1M47T2rcvXJGgCI3Y6c6iSX0C8PiAiZ4+9i/vu8maj+vl/GP3+/B63U/0ZbL2cNrvLocr/5roeaKnt/Nl9/1y/jy9zs/vL4+dj18/z78eb7jN53IAR49T1tznFUTw8e/K1/nAt8/LfALLEQvJlyNlicCWlZudV5IDX99blkzZQfNj5NfksqMsWXBuRA6pHWlk6snBQXY92dX3CjwgmNjDA5gx3AGqsKPEKPAIJvTwDD4peIboezja+vINekRA7OlcqKjwnFOXejzvejx3mSeIKvNoII/5flV0PuOy4sdV7nmXaKPAkgFDK375yg1+smBU6TOkSWsOdfRG0ib0AGgVnZNLQ3pqcsFWMaf48kWCJ0jU4zOzgsKz9IbBZwKyPd6i5KPi+c21HpW/yNF29JQhD0ufIKjgvYWslc869z09cPQK77Oo8d58oFRtg+/ySvqJo1eGQxFU8ClKpiueLzkq5WdWHo7wGFfJZwescrg1oeXY89ubW/YhYY9Pvspoy3YgkAp+oekaKjjlOuwXpIJfiPHebHCoe2QXV6kPRhxOYncQVOm5zspx0YNTsfsEOOw0fMYo0/EchLp2vAt7OivGxRXeK891vupjC09yxSvepdocu8pbFb1tXUkqL5tq9HITt/CQde4zkKq8UZpHEXglk3yxaC7Xqm6QuVQq7exA+sLF2jGa4H2rTfP1uiQXjrvm0G847VFfOA5cVz2IuTSzVyMGsrPp686xj+A8g1BcwZ3qNDxRRNXneJdqs5who+lspUOvYy/2us35Fd7ziKbue1JVD1buvxht/sdgx3MBpR4eDSi5J2oNpH5OkjQvupxZXzczTD0nR7d4QjHMmy6yVD23XlTpi6G2tfg++OPh9H9jMP9oQ/Tb4XicZ/Dl/3ro5qV5YKfnPw==);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="81" y="632" width="65" height="46" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="&lt;div style=&quot;font-size: 1px&quot;&gt;&lt;p style=&quot;text-align:left;margin-left:0;margin-right:0;margin-top:0px;margin-bottom:0px;text-indent:0;vertical-align:middle;direction:ltr;&quot;&gt;&lt;font style=&quot;font-size:16.93px;font-family:Oracle Sans;color:#000000;direction:ltr;letter-spacing:0px;line-height:120%;opacity:1&quot;&gt;Azure&lt;br/&gt;&lt;/font&gt;&lt;/p&gt;&lt;/div&gt;" tags="Background" id="59">
<mxCell style="verticalAlign=middle;align=left;overflow=width;vsdxID=82;fillColor=none;gradientColor=none;shape=stencil(nZBLDoAgDERP0z3SIyjew0SURgSD+Lu9kMZoXLhwN9O+tukAlrNpJg1SzDH4QW/URgNYgZTkjA4UkwJUgGXng+6DX1zLfmoymdXo17xh5zmRJ6Q42BWCfc2oJfdAr+Yv+AP9Cb7OJ3H/2JG1HNGz/84klThPVCc=);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="92" y="691" width="84" height="20" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="&lt;div style=&quot;font-size: 1px&quot;&gt;&lt;p style=&quot;text-align:left;margin-left:0;margin-right:0;margin-top:0px;margin-bottom:0px;text-indent:0;vertical-align:middle;direction:ltr;&quot;&gt;&lt;font style=&quot;font-size:16.93px;font-family:Oracle Sans;color:#000000;direction:ltr;letter-spacing:0px;line-height:120%;opacity:1&quot;&gt;Cosmos DB&lt;br/&gt;&lt;/font&gt;&lt;/p&gt;&lt;/div&gt;" tags="Background" id="60">
<mxCell style="verticalAlign=middle;align=left;overflow=width;vsdxID=83;fillColor=none;gradientColor=none;shape=stencil(nZBLDoAgDERP0z3SIyjew0SURgSD+Lu9kMZoXLhwN9O+tukAlrNpJg1SzDH4QW/URgNYgZTkjA4UkwJUgGXng+6DX1zLfmoymdXo17xh5zmRJ6Q42BWCfc2oJfdAr+Yv+AP9Cb7OJ3H/2JG1HNGz/84klThPVCc=);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="70" y="708" width="152" height="20" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="61">
<mxCell style="vsdxID=87;fillColor=#FFFFFF;gradientColor=none;shape=stencil(lZPRDoIwDEW/Zq9LWUHCs+J/EAVZRCATFP/eYYdsAzW+td2922mzMtxey6zNmYBrp5pzfpfHrmS4Y0LIusyV7HTEMGW4LRqVn1TT10fK22xUjtGluY03DOSLOEajScCDCknC482rsif9oVdkCEggeIjGEfgWGASVwChMmsQchVGgqzBpEvLQfrWStUUJDuKb+QMhuHgz8ERnteDyTnDWVBzcVTiNvnFnCN/o9Cyi2CUEFy8Ab3xWB+hLfOJVxFnuI3+AnA1L6kEsG/HJB1zOxkNfBf39Hf/V62D++4WsKlod+9zfFV2iPcP0CQ==);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="83" y="764" width="61" height="62" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="62">
<mxCell style="vsdxID=88;fillColor=#FFFFFF;gradientColor=none;shape=stencil(lZXRdoIwDIafprc9aUOBXjv3Hp6JgzMGHsQN316whbYBQe9K/INf/iSU4e6SH84Zk3Bpm/on+y+Obc7wg0lZVHnWFG1/YrhnuDvVTfbd1NfqaJ7Ph0E5nH7rv+ENncnTyFENWRJuJiI5po/Ap9F/XRuTIGyG4pG2GYKkQCetKOE4imwo4tJGOpyLbCjmEfp/XhaVD+slTPipWKX1UlwBWhFcryZXQRoTXs8rpKpF4L4cEfJSPeXtXUoJbsJjGeI6v2+ugESGtJ7I8avkOayXsNwMyuoliFmP5ayeGXyHM5co+/IYbM7su/qtnYA3WgzrlqUqtAxCv4CaRYcQQqfWFwYCss1lAUYnT0R08iZ+GxEAbKObo+RZc1S400S+sNGCeOgYKJS3zVMpSDWvrYfTv7YdWvMkpt/JqZsjV8y1CFGJnQsfnXU310a3P7iL4FSUpblH/N/pxdGHzKWD+zs=);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="82" y="763" width="63" height="63" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="63">
<mxCell style="vsdxID=90;fillColor=#2d5967;gradientColor=none;shape=stencil(lZNLDoMgEIZPw5bAUKuurb2HiVhJqRikr9sXSpoqphR3w8z3zwMYxKqpb0aOgExGqzO/i9b0iB0QgBh6roWxFmI1YlWnND9pdR1afx4bRzrrom4uw8Pr9gXOM6cC8vQeSjGUb8/RC6QYZoIix0t+V2Ia4dcFbAYSETBbf5OAwraO1gX+jLz5jhIEy1cIaPI7NSSTZAFm6TkpibDhXDH2E0zpIf0GYqQ1vh+9E1L6PZnHw8WwLr9UrH4B);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="113" y="779" width="21" height="18" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="64">
<mxCell style="vsdxID=91;fillColor=#2d5967;gradientColor=none;shape=stencil(lVTRcoMgEPwaXpnjLhZ9TpP/yDSmMrWaMaaNf18tqByMNH2Ddc/dPQ4E7W/V6VoKhFvftR/ltzn3laBXgWiaquxMP64EHQTtL21XvnftvTnb/fU0MafVZ/s1/eFh6zKYShAGu1VKYvGLHC377d5ZurIEDbLQrkSFNfBAC+VaOmRwCOYSyZEoIjlkV0iVVPdKVj/qhYv7Flc/iosvuSlgbChjIYG4tPdTJ6NwRgaM7VFEeja2V6LidmLsEOOT2cgdHXhtmn+MR3KYINlQlFnOQwEPBDyMVzCHCbJkSUHgYlrLHQYd9CzNHQT4o3+QFPVUlusCQc4FWIbGs0Yh56msK33utpJaB9fEs8Y7vpWVSSbnhDHHxfr6XExd28fL/x6+ViNkXzo6/AA=);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="104" y="800" width="18" height="18" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="65">
<mxCell style="vsdxID=92;fillColor=#2d5967;gradientColor=none;shape=stencil(lZJNDoMgEIVPw5bAQCuurb2HiVhILRikf7cvlDTVJlXZPWa+N5kJD7FqVM0gEZDRO3uWd916hdgBAWijpNM+KMRqxKrOOnly9mra9B6aSEZ1sbc44ZF8vMR7Hl1AnqkCHNPyXTkmQ6/NxCAoLnYzgyjwAk8Fhhw+e6ENhrWTyf/pZAZSsoB+mpvgrCVW4CC+39vpvk/pmPZ/4xBKKUqsfgE=);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="92" y="778" width="20" height="18" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="66">
<mxCell style="vsdxID=93;fillColor=#2d5967;gradientColor=none;shape=stencil(pZRRc4IwDMc/TV97bUIFn51+D09x9MbAq7jpt7csDNp0sO18S9Jfwj8JF4GbS7U/lwLUpXPtW/lpj10l8EUA2KYqne28JXArcHNqXfnq2mtzJP+878neem8/+go3ylsbmZs+C9SdIlqpL39HeG2bAM8kLNKHq6Pqmp5hgHVMqxtQYHDvg7vOZV4MBMYEjnqhmNenInELjYxK/o8mEnjTU4JO2/rutIg7nyaD6WLwD5v5dZHx3pHTmdT5fPUE958zZmkIQYYeUwqMp5Cx9a+k1vEYgh8OOfTzHFaxTk5znR4ALjSQMSkzTGvQDSYQzkyJa5VPLeFJ3BvTWTjZuqarEr7zM+JDdIJw+wA=);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="84" y="771" width="60" height="54" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="67">
<mxCell style="vsdxID=94;fillColor=#2d5967;gradientColor=none;shape=stencil(nZLbDoIwDEC/Zq9ktILwjPAfRIYsIiMDFP9eli5hw1v0re1Ol5O2DLOhKXvBgA+jVmdxk9XYMDwwANk1QstxiRjmDLNaaXHSauoqyvvSkCa6qKv5Yaa+kHPTA/zu5wXBrewc+G80SoIYXfg4abIIfdymsA+ilEoz2JIlwGuYkdJdAJEF0AVeuqWxJ8c/iaWJb8Z9q3V88GyOWwbfTMPX+2klX+AlWDdfy7alw3Hft5eylOjKMH8A);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="84" y="765" width="60" height="4" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="&lt;div style=&quot;font-size: 1px&quot;&gt;&lt;p style=&quot;text-align:left;margin-left:0;margin-right:0;margin-top:0px;margin-bottom:0px;text-indent:0;vertical-align:middle;direction:ltr;&quot;&gt;&lt;font style=&quot;font-size:16.93px;font-family:Oracle Sans;color:#000000;direction:ltr;letter-spacing:0px;line-height:120%;opacity:1&quot;&gt;OCI Object&lt;br/&gt;&lt;/font&gt;&lt;/p&gt;&lt;/div&gt;" tags="Background" id="68">
<mxCell style="verticalAlign=middle;align=left;overflow=width;vsdxID=96;fillColor=none;gradientColor=none;shape=stencil(nZBLDoAgDERP0z3SIyjew0SURgSD+Lu9kMZoXLhwN9O+tukAlrNpJg1SzDH4QW/URgNYgZTkjA4UkwJUgGXng+6DX1zLfmoymdXo17xh5zmRJ6Q42BWCfc2oJfdAr+Yv+AP9Cb7OJ3H/2JG1HNGz/84klThPVCc=);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="73" y="830" width="169" height="20" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="&lt;div style=&quot;font-size: 1px&quot;&gt;&lt;p style=&quot;text-align:left;margin-left:0;margin-right:0;margin-top:0px;margin-bottom:0px;text-indent:0;vertical-align:middle;direction:ltr;&quot;&gt;&lt;font style=&quot;font-size:16.93px;font-family:Oracle Sans;color:#000000;direction:ltr;letter-spacing:0px;line-height:120%;opacity:1&quot;&gt;Storage&lt;br/&gt;&lt;/font&gt;&lt;/p&gt;&lt;/div&gt;" tags="Background" id="69">
<mxCell style="verticalAlign=middle;align=left;overflow=width;vsdxID=97;fillColor=none;gradientColor=none;shape=stencil(nZBLDoAgDERP0z3SIyjew0SURgSD+Lu9kMZoXLhwN9O+tukAlrNpJg1SzDH4QW/URgNYgZTkjA4UkwJUgGXng+6DX1zLfmoymdXo17xh5zmRJ6Q42BWCfc2oJfdAr+Yv+AP9Cb7OJ3H/2JG1HNGz/84klThPVCc=);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="84" y="847" width="118" height="20" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="70">
<mxCell style="vsdxID=100;fillColor=#2979ff;gradientColor=none;shape=stencil(jZTRcoMgEEW/htcdYFHkOU3/I9OY6tRqxpg2/ftqgWQXotM3WA9yuOwgcHdpDudaaHmZxuGj/m6PUyPwRWjd9k09ttM8ErgXuDsNY/0+Dtf+6Ofnw0Iuo8/ha/nDza+zGlAtq7T88RX5N3v1cNf2BNYWSrcOv11H/2sV8AIqE3BFeXnTgTCgIhFKCpQOEAYIQWOAYgmcWdeU4PiRjAVZbplKbmkqqCpuKrllkWuSXUOl2Nak5/IVN3sWm4mSvELJ5a5L7mWSqpRJqOQqkTNPZfM+SfBU1c6qJVd9SAQrm4vS4wQvW4K1XDULiss6B5L3aXYVqe7dLcrSG05DjLIml6Vb40r3JcmS4z3v7ixaElvUz2Rp/ryH77mSK0VK/LMBGDwPHk/Mqe06/0LR7+mTNJf8c4b7Xw==);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="82" y="1063" width="63" height="55" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="71">
<mxCell style="vsdxID=101;fillColor=#FFFFFF;gradientColor=none;shape=stencil(jVPLEoIwDPyaXjN98jij/ocjKB0RnAKKfy+Yaikocsumm85muyUiqfP9NSOc1o2pztldp01OxIZwrss8M7rpKyK2RCTHymQnU7Vlivi6H5hDdaluww0dzsUSpBymOH1gh1H6wjukF7oc0RWoYIl9aA3ezvCYg7J05vNpx7Fh4cPCOITYjnTCZ1gYK5DBb4XUkydBySV91FfHgSpfnlvA1/sWNzLEk/tVWxhCGHn6Fsgfp95OR8Ci9fSZTdPV3QCbW+9eY7K+ez8xD5BYkaC/gesLF9ajLgrM+vh8Gu6+hR9DbJ8=);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="99" y="1072" width="29" height="36" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="72">
<mxCell style="vsdxID=102;fillColor=#b1cfff;gradientColor=none;shape=stencil(nZFRD4IgFIV/Da8OuTl9N/sfLjFYBA7R8N8Hu2bYamu9nXP4zh1wCdSjaAdOGB2dNVd+l50TBI6EMakFt9IFRaAhUPfG8os1k+7QD20ko7qZOU7w2KOxweiSuhOCSuqvYFlk9JDC58ni2HyPr7aqshIw8gyjPM9YsVLPiK41DxhsAOyBjzfc2ssP8J/v3oFBvL61l0rhVtLz9zWECFcIzQM=);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="122" y="1072" width="6" height="6" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="73">
<mxCell style="vsdxID=103;fillColor=#03a9f4;gradientColor=none;shape=stencil(pVrblhQ3DPyaffXx/fJMyH9wwhL2hLCcZUng76POtC25RLt7krdlkKfaupRK6nkIb75+fPfl8cHbr68vz388/v30/vXjQ/jlwfunzx8fX55e6a+H8PYhvPnw/PL4+8vzt8/vb//+8m6z3P768/mv7Ru+384FZ5LbTnn74/ZJdCa3fz/59Xbg09NnccAVE/6XvXMm+GP7YEKa7aOx8Q77bGpemFvj5+exZmWu3HOn+Yl3LhyY4+Wsncx9NJP1b99ebuYO7fcPfDH15k773d8+as3Eslv54abod6uwW1UT8261fxS8SXWF3oqJccYP0ZQG+Mm0DPjZpAb4lAcN8KuxbonvOdodv41H6vi1mdZm/GhNmuEr5THAU6jc0vmV7lpneDpTA8A7g+j02DN6qaaA84fRAXhJJnsA5+/dkYo3EHn5gB3cKs+fXj1T5PHq7NMdKyfj0wwvw7NjZSrx8HBf4LPjlHY6pXawRIGvgE8hA/xUTXOAf5b4iaosAb4oKT+sArhflmfQVuHnVT+TijwwSDiePG4AdxHtRvW0kKdO58pPnNVMzktwigIUaVGZQvF0M3jqXysTxdcZO/b6P8qTZBwQlDfVATh5B9LEmQL8kEUuhW5klxen4usZ2cFt741coUmRs1XckMHldslK/PADFhgpMnX48WBFEaIP912YiLZCpIUjezfwxgG4CEnPqcCUfTHU1GWwJEUKdXAKdZzBC3YCaoRDclxMceqwIcPFdSMgqwZ0KKowaKPudqjumQ3kgSvscaYw7rOe1UtNg906M2Xj0jJnxBGmpoQtPHXVxK4LxgFBkFWALur8SSehMxbx7eA4UTEJqpRFxYAPTHQjcZY5Syc8MAQX+8AmGoG0qd2pjO3YQZ03TF0KiGqV5xUvF1HRo14GhQnx4hE7LLFLUdRYNDXm3oWPi3VTQfW+exeSANAMhT/9MLJwcRGZjhRY/l4LOLUEJCmRRyzaVD8SKRmGlb032Ysb6mckuygjP6zQ77Ikg7bq+FjsM5fIEzubZGOX7CCP8ICDLUVeq7eUZhzKXO2wbVpc6jwZiq7zSKoAscuodp1JB3W2ALGHda5EpV1CGFUuErVqjeuAmqhMCgSLrNI6WTJTCg93OFxSJeNsSS0CtAQxRPUKfrc6gqfC0LPl+OZelBZFq3xGJsd7L195cHLaqx2c6h/jLiLU0QWVXAr8Js8QXKQTt0RQzJSZAbHTGEou5zydKaDiZDUxPDheFmZQRn2ywYqfKUIcuEQpFwTH3QdmSUMzdZ4XSiM1DvwnT7BLM9QNWUH4ajUeOiuN4RYyt9lOP0fwNM1D9jSvRmOasJHjW1TpQzM1dvZNZi8rZ6s/0MKkuj1cnxIaR5BNdwO87f2M4WtvlwfwlIVjkmR13jVChycZm6C9D6Xb0b1TG6Fuc7SMq7zvwP1cR3aJtx1ePx93cuX4s5uTRnB4c3bpEFDYLWRw+pDP+7qrURfLO6fTacx5sAbcEhOw3fjkcsZbtQuSpTQP1T+YvjIg2xkWy3zmkXkqovbql084P15Rezqr0jG30QSOXbNt4ZaDqRgdeCMCKRF5AOrYYayCRUoAtO9d7ah/K5WdrZptHIQltfHAohRw/ZEqvANQpZBG/McugDQ+aAcqVws9TOz1BA3g1omtjtwe1XZUfjM3TAi6fMgO39TC7fT62/oSmEA6VggliLtVIw51gAzLydPIb70FGqDMKF7BW+gAIjdFAwTtdJrz1FlxopfFxP0342Sr1vLSiJX0VOozLZyrhXvtZzVCQ2icV780VbR1LlZFj9tUA/2YrALokWJHGxjJWNRajly77gx0BtVsrqYAEZCVg1qkQBfQI6QeE3QmslrDE3MBFeQ8ZPuAT6PwRDI2pII4dhQDfryFOcIPyv2agomnY1bwuN7aBAk2gGF1BG8VE8pv7kzYjHcKH2rRDTFx+fJjcynBG/ieBHjGy+ch4gZ6Zll7MfTUBSKIEplTLMgs3l3kZ4ePas90mvl0Bt+6yJri1Qr6XtZn0Fa8T2iLSUee2KklmLpWkOIITy7YN+S1uprKY/O5cBipMrucPGUo+JWCh2KRYe06kqWvyJfxmoGF5Bo+80vYLmLdwBrwhZurH1a4C6ZiiTi6jBn+CL8xvfDkhoOjeIckZHRB2eD0anJYHXGF5yW309/c8YNJGh/F9KaA0P1n9/diNHLasx0/80zM/k+Qfl6QysXwCznmdFqJJQfuhZtat1E3teD90+TfOjCOMaKsuE+j92WJBm3FLyfm4p/ZQp64RC8XlMjdB+BlUuXXKXs8Wq/Gn++XIw/N//EAcbrzxwdIIJd5g11cH6gvHsgR3iXCforU0vw2j9T+4u2fdtK99ic+unCA/uCfn314+vTp9us1+f/4czX66PZTt/D2Hw==);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="106" y="1081" width="15" height="23" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="&lt;div style=&quot;font-size: 1px&quot;&gt;&lt;p style=&quot;text-align:left;margin-left:0;margin-right:0;margin-top:0px;margin-bottom:0px;text-indent:0;vertical-align:middle;direction:ltr;&quot;&gt;&lt;font style=&quot;font-size:16.93px;font-family:Oracle Sans;color:#000000;direction:ltr;letter-spacing:0px;line-height:120%;opacity:1&quot;&gt;Azure&lt;br/&gt;&lt;/font&gt;&lt;/p&gt;&lt;/div&gt;" tags="Background" id="74">
<mxCell style="verticalAlign=middle;align=left;overflow=width;vsdxID=105;fillColor=none;gradientColor=none;shape=stencil(nZBLDoAgDERP0z3SIyjew0SURgSD+Lu9kMZoXLhwN9O+tukAlrNpJg1SzDH4QW/URgNYgZTkjA4UkwJUgGXng+6DX1zLfmoymdXo17xh5zmRJ6Q42BWCfc2oJfdAr+Yv+AP9Cb7OJ3H/2JG1HNGz/84klThPVCc=);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="92" y="1126" width="84" height="20" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="&lt;div style=&quot;font-size: 1px&quot;&gt;&lt;p style=&quot;text-align:left;margin-left:0;margin-right:0;margin-top:0px;margin-bottom:0px;text-indent:0;vertical-align:middle;direction:ltr;&quot;&gt;&lt;font style=&quot;font-size:16.93px;font-family:Oracle Sans;color:#000000;direction:ltr;letter-spacing:0px;line-height:120%;opacity:1&quot;&gt;Blob Storage&lt;br/&gt;&lt;/font&gt;&lt;/p&gt;&lt;/div&gt;" tags="Background" id="75">
<mxCell style="verticalAlign=middle;align=left;overflow=width;vsdxID=106;fillColor=none;gradientColor=none;shape=stencil(nZBLDoAgDERP0z3SIyjew0SURgSD+Lu9kMZoXLhwN9O+tukAlrNpJg1SzDH4QW/URgNYgZTkjA4UkwJUgGXng+6DX1zLfmoymdXo17xh5zmRJ6Q42BWCfc2oJfdAr+Yv+AP9Cb7OJ3H/2JG1HNGz/84klThPVCc=);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="65" y="1143" width="203" height="20" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="76">
<mxCell style="vsdxID=109;fillColor=#005ba1;gradientColor=none;shape=stencil(pZXdUsIwEIWfprc7STZ/e436HowU6YiUKaD49iaU9GdrGxzv0vRsvmZ7clLg6rRbH8tCidO5qd/Lr2pz3hX4VChVHXZlU53DqMDnAlfbuinfmvpy2LTPx3VUxtFH/RlXuLZ11oKORUp8txNowcrbzEur31eHJb0EHMlfL027vpwUyFQhTDtzVZ0Gk+g+JcDLuwg7UXy+iTCJDGXYgsZwAegZ3AApDk+kDm7ATeBSLcINGMnhQk3gihh8QhaOk+8NnCNr8IaTJQNrsCa7aw2Go/W8N1CB99xMRs0XiJHYaRD+UTEREM2LyYD2ywW8a2QTvneqEOOuBY11466FddOmU9vITZwaVHbRLaHGuTE91KBjfA+K833aV8/3YInxfTLjHJ+SnXu+B4GMT6CZa8KHa8v41HcJu8Z5zPA9O6qhhp2W7n90cJP8NYQT33w4Dwu2HVY8lmnDitlQiyLMhVrcthx/bS7UYnezoRZEXfjMHu9osAl8OdSiTbKhFozT5cDvoRYdav8WaqFE50ItHo9sqEVbE2cv2OPfN+REHwb9dbyt9vv2Nh++59d3mGqvfnz+AQ==);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="378" y="175" width="47" height="41" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="77">
<mxCell style="vsdxID=110;fillColor=#005ba1;gradientColor=#005ba1;shape=stencil(nZTdTsMwDIWfJrdWbOf3emzvMbGOVpR16jrY3p6UdLRJUEHcuc5xvmPVjuDNpd6fK0HyMvTda/XRHIZa8JMgak511TdDiARvBW+OXV+99N31dIjf5/2oHKO37n284RbrtASJYxXJe8ygBPRfmV0seL72sQKjgAjYTCWY18gbxdTi3imjwapJw4XmkVmC2+a0cFoY9QaY1ozK1GTQu9wjmtSjt0AuN6l8ajKILK+CwVHGdoAZHB/uZ7gD7VM4glcZ3IFfhRNom8H93NSEYuDs7wSR1ilcAeZw/0vnCrwp4B5TuAanUjhKmaINWCrQPhnLdDq+b7j/Sy7XmprFWEzy1IC1YHTe07wTXC4b56offf5hPUMwL/exadv4NizP88cgpOJDwttP);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="361" y="159" width="31" height="57" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="78">
<mxCell style="vsdxID=111;fillColor=#FFFFFF;gradientColor=none;shape=stencil(hZNBEoIwDEVP0y0TEhVdo97DUZSOCE5FrbeXWh2aFGSXpD/tS5ooym/l7loohFtrmnPx1Ie2VLRWiLouC6PbzlK0UZQfG1OcTHOvD96/7pzSWZfm4W6wPm+ZJYuFy0J4+Qh8vK0XV7oOxCkmROPi/d34q1N/OE/m+FWnoRwsMveFUm+JC0i+P4gHDM1Vlv3DA862miWzJecLCvhGUgBOGLaEuGaQMe63kEtKh5Vx0h5CUv0ww1pIamikP+Kvgbcz6r0E7ROi77cY18JHwFLcHpqcx4nh7Yx+7I+6qvzWhOdyTbqQXzHavAE=);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="408" y="200" width="8" height="8" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="79">
<mxCell style="vsdxID=112;fillColor=#FFFFFF;gradientColor=none;shape=stencil(lZNBEoIwDEVP0y0TGhFdK96DEZCOCEwBLbcXrEqTysJdkv60L7+twENXpm0uJHS9bq75Q2V9KfAopFR1mWvVT5HAROChaHR+0c1QZzZv01k5R7fmPu9gbN8uDrbx3CVhtBV4ZScrrlTtiEMZIK6Lz4O2W4d2MQoi+VaHrhyMJOkoud4gFSA//yceELRlshU8oGz7TbDZUT5ngHclBKCEriVINT8Zfb+ZnFM6WB/SBYJTfTDdWZBrcMUfdtdA7fS856BLg3f9xsca6RMwHtSX8y8ziXgKlmdfqKqyv8Zd599kKtkvhskT);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="393" y="200" width="8" height="8" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="80">
<mxCell style="vsdxID=113;fillColor=#FFFFFF;gradientColor=none;shape=stencil(lZPNEoIgEICfhquzsJp17uc9mtRkMmnQSt8+DQsW4tCNXb6FjwUYbrv6eCuZgK7X6lI+ZdHXDHdMCNnWpZb9NGK4Z7itlC7PWt3bwsS340zOo6t6zCsMpm6dJ6t8rhIwmgy8o4OBG9k6MBcJpnH4dNdmaW4msyTDheYuDoMg4Si+vFgApADa/TGuB0TNniyiB9Rtkybpmvo5B1gyHIAaui1Byvx0DPvt4b6lo/UxtRK+1UfTPQv6DEb649010HYGvfdFbQEPrjPUGukTGAKpr+dfzSTwNLDPvpJNY36NO+9/kyllvhjuXw==);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="378" y="200" width="8" height="8" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="81">
<mxCell style="vsdxID=114;fillColor=#eaeaea;gradientColor=none;shape=stencil(lVJdD4IwDPw1eyWjFabPiP+DCMgiAhmg49/LLF9bgsa39nbt9ZZjGLVF0mQMeNup+p69ZNoVDM8MQFZFpmQ3VgxjhlFeq+ym6r5KqW8SwzTVo36aDZrmfM7NDPCB+sPJw+CDXIh+7RXxfXdgAoTw0CdIwwKFwcQCZ0wjAcG8Bm3CjizAfNcivK6cNLgtKY5eCLaoo/nTrGMVuMeFrbm9yz5jz+hXm9ufs2/Q7kcO6wXCVlwpez5LWf2TgbFY85PLsqT4bd/dvI0QZRXjNw==);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="361" y="153" width="31" height="11" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="82">
<mxCell style="vsdxID=115;fillColor=#50e6ff;gradientColor=none;shape=stencil(lVLRDoIwDPyavS5bK0yeFf+DCMgiAhmg8PeCReaWoPGtvV17vewYHtoiaTIGou1Mfc0eOu0KhkcGoKsiM7qbKoYxw0Nem+xi6r5KqW+SmTlXt/o+bxhoTgoxz4AYqd9FHHYv5ET0c2+IL/2BBVCKy5CgAVYolAsLvLEBCQjea9AlbMgCcIxcYbty0RCupNpzqVxRT/OnWc8qCI7S1QRcodE9wxrlMnB1vzpVIY88p55P+wXvIyTfo6tqOVteS139k4OpsBnKdVlSBD/f/cxNEOUV4yc=);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="365" y="155" width="24" height="7" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="83">
<mxCell style="vsdxID=116;fillColor=#198ab3;gradientColor=none;shape=stencil(jZLRFoIgDIafhlsObiF6XfYentTkZOohK337pFEKF9bdNv7934Ax3N/qvC8ZiNtgukv51MVQMzwwAN3WpdHDHDHMGO6rzpRn093bgvI+t0obXbuHdRipTwrbAmKiFHiUvgtHEp/uhtQRnSNyEbsOV3IGI1AaxTxSTvEpSZ6gU6HXNLl0l3KhtrjWFXxuglz5aDscBmghfLAMyKnisAWOY54qH7x4wneSJPG5q+Ew6Pr7ztYWA/TqJWEZUPrwH1cO/7jR7f8LMQfLKlW6aWgT1+fh6s0lWlvMXg==);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="368" y="159" width="19" height="2" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="&lt;div style=&quot;font-size: 1px&quot;&gt;&lt;p style=&quot;text-align:left;margin-left:0;margin-right:0;margin-top:0px;margin-bottom:0px;text-indent:0;vertical-align:middle;direction:ltr;&quot;&gt;&lt;font style=&quot;font-size:16.93px;font-family:Oracle Sans;color:#000000;direction:ltr;letter-spacing:0px;line-height:120%;opacity:1&quot;&gt;Azure&lt;br/&gt;&lt;/font&gt;&lt;/p&gt;&lt;/div&gt;" tags="Background" id="84">
<mxCell style="verticalAlign=middle;align=left;overflow=width;vsdxID=118;fillColor=none;gradientColor=none;shape=stencil(nZBLDoAgDERP0z3SIyjew0SURgSD+Lu9kMZoXLhwN9O+tukAlrNpJg1SzDH4QW/URgNYgZTkjA4UkwJUgGXng+6DX1zLfmoymdXo17xh5zmRJ6Q42BWCfc2oJfdAr+Yv+AP9Cb7OJ3H/2JG1HNGz/84klThPVCc=);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="371" y="220" width="84" height="20" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="&lt;div style=&quot;font-size: 1px&quot;&gt;&lt;p style=&quot;text-align:left;margin-left:0;margin-right:0;margin-top:0px;margin-bottom:0px;text-indent:0;vertical-align:middle;direction:ltr;&quot;&gt;&lt;font style=&quot;font-size:16.93px;font-family:Oracle Sans;color:#000000;direction:ltr;letter-spacing:0px;line-height:120%;opacity:1&quot;&gt;Data Factory&lt;br/&gt;&lt;/font&gt;&lt;/p&gt;&lt;/div&gt;" tags="Background" id="85">
<mxCell style="verticalAlign=middle;align=left;overflow=width;vsdxID=119;fillColor=none;gradientColor=none;shape=stencil(nZBLDoAgDERP0z3SIyjew0SURgSD+Lu9kMZoXLhwN9O+tukAlrNpJg1SzDH4QW/URgNYgZTkjA4UkwJUgGXng+6DX1zLfmoymdXo17xh5zmRJ6Q42BWCfc2oJfdAr+Yv+AP9Cb7OJ3H/2JG1HNGz/84klThPVCc=);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="345" y="237" width="203" height="20" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="86">
<mxCell style="vsdxID=122;fillColor=#c74634;gradientColor=#c74634;shape=stencil(pZnJchMxEEC/xtcu7csZwn9QEIiLkKScBMLf08NYW7ekUYqbx+5drX4j+aQ/PN99fro9KfH8cnn8cfv7/PXl7qQ/npQ6P9zdXs4v+Omkb076w7fHy+33y+Prw9f9+enzJrl9+vn4a7PwtutZsako8Wd/9A6i/ffNp136y+tlF5e7gFKg41VFUh3xpvavktHro1dg5VVCtxLXR+dBmNrv/fmhirINMgqQsxhFG1+0YH0bX53F9SspRBuhJSEmgYFT78HJ1nExSX0kp3VomsrofrZtZYr4oJA0zqIg+eIonoviizwoEOudNtKjTmv7MioQvlEIEtw0sxBAkdYMCoJucwsGdGhzCxo8WYUgwJg2PVQ0etoBFrwj/i1sz01tBURH/FtwqvXvHMhA/GepgX9nQWjm3xH/zoAgrY+Z0fxrKV2qNPdf6ZT6O7L1tigV8S8hLOSfpUb1F+DJDqwtq7xKyjL/abGTfx/BE/cCXJy2nwajiHuRmzi3nwepW/foK+X6VvZ8TiVFFEBMJ3PEXMnO9kC8466KpPnRrtLEuwZNsscY1bT5Uccblj1tfpSS/kSLT93j1udr7yajZWFYvFthiknjYVqNDiWzygiSBmeVaytBBqz2yeoCJJ1MW2+NkggOadoAO5T0kgGLYSCLrJOyNjtipSs7Z8jKLWk3rhCFJSvoISy3RSLvOh1Y4lonEo2qVERWYEn77V3CR2C1Cvx8snGwWg0xtnXogNUaiGTJOmC1+BI09d8Bq3V5RNVgJYMdpRjYOFiK1DpYa8tjsGJmkYKNgxWrFOb+OVix/hRsHbDiysaF/LPUOlhry2OwopQl+4CD1cq0pdbBijoULR2wWgGacL0DVoNom7nnXDWhTOoxWNGupljnYN1iDFP3CFbLss+Wx2DF4hvCkw5ZUapxf8RJNizerTAF6/SI1aEqOWBRpLIVoGc65MVksBJaqDQG1oiKdCGo6ADVSDYiGCqyyDpQa7MjoGJ8huxOBtQtZzUuEAWqVKnBl4HK5zjn6cHJXIwDnLXXERcxNj/dmh0uKsvmYoeLCs++5D6kw0Xlj16kOBdVAE3fT/iBE6U8GQ0dLhSpdS7WlsdcxMxo/h0uYpXC3D/nItY/kMuMDhdxZeNC/llqnYu15TEXUcqSwcS5qHS6u1jnIuocY3GbQmTkdLCoZCrIMheVgECOEB0uomFNucS5uAU5LX7nwInZ0+bvcBGLT0/7HS6yzX/Euf9XmIJRhgP4YOdLshmLTq6HyeMp33vim3xbjUqmYNJMX9EqldScpciKB5gIlCowHO36YAT7/O5csFuMlltWQTwHduNWC62mHfkAlDiT6G1qFaPiKzO6bqYLPgUbk8YP5cr/2/n+fv/HoP6d/kWAX+1/L+ibvw==);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="382" y="467" width="43" height="47" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="87">
<mxCell style="vsdxID=123;fillColor=#32bedd;gradientColor=#50e6ff;shape=stencil(pZTdbsIwDIWfprdWbMf5uWbsPdAooxqjqMDG3n7pEqAOWjVpd+6pT77YSdzw4rhdHdqGzPE09G/tZ7c+bRt+aoi6/bYdulOKGl42vNj0Q/s69Of9On8fVmPmGL33H+MKl+wTBPSji8xXVrwDlB/lORt23X7eICB+ang5DxmBj5YiOQuCWbpQWYZAbMkqkngQLlmcJTSm5BRBHDg7R48OgtV06yB6TY8GiDWdIwTU9ECAVvM5AMscPyBY0Xx04KPmuwAYNd9othBw0GwDbrbxYwWabICdBlMAW7UdDUTScLJgRMNpFp3WcKTZFIGqM0/bqYq2FmzU7OrAHV139ws6kTU4MPiqauT7oVB1s241B/Cs2TGV4ObYqUapWn733OhsHuhx0pzrzcKbccJHnH+bV8efDf99/bUhBfdhs+l2uzyrpv/r4ZSkPNh4+Q0=);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="361" y="450" width="39" height="28" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="&lt;div style=&quot;font-size: 1px&quot;&gt;&lt;p style=&quot;text-align:left;margin-left:0;margin-right:0;margin-top:0px;margin-bottom:0px;text-indent:0;vertical-align:middle;direction:ltr;&quot;&gt;&lt;font style=&quot;font-size:16.93px;font-family:Oracle Sans;color:#000000;direction:ltr;letter-spacing:0px;line-height:120%;opacity:1&quot;&gt;Oracle Database&lt;br/&gt;&lt;/font&gt;&lt;/p&gt;&lt;/div&gt;" tags="Background" id="88">
<mxCell style="verticalAlign=middle;align=left;overflow=width;vsdxID=125;fillColor=none;gradientColor=none;shape=stencil(nZBLDoAgDERP0z3SIyjew0SURgSD+Lu9kMZoXLhwN9O+tukAlrNpJg1SzDH4QW/URgNYgZTkjA4UkwJUgGXng+6DX1zLfmoymdXo17xh5zmRJ6Q42BWCfc2oJfdAr+Yv+AP9Cb7OJ3H/2JG1HNGz/84klThPVCc=);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="331" y="518" width="254" height="20" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="&lt;div style=&quot;font-size: 1px&quot;&gt;&lt;p style=&quot;text-align:left;margin-left:0;margin-right:0;margin-top:0px;margin-bottom:0px;text-indent:0;vertical-align:middle;direction:ltr;&quot;&gt;&lt;font style=&quot;font-size:16.93px;font-family:Oracle Sans;color:#000000;direction:ltr;letter-spacing:0px;line-height:120%;opacity:1&quot;&gt;@Azure&lt;br/&gt;&lt;/font&gt;&lt;/p&gt;&lt;/div&gt;" tags="Background" id="89">
<mxCell style="verticalAlign=middle;align=left;overflow=width;vsdxID=126;fillColor=none;gradientColor=none;shape=stencil(nZBLDoAgDERP0z3SIyjew0SURgSD+Lu9kMZoXLhwN9O+tukAlrNpJg1SzDH4QW/URgNYgZTkjA4UkwJUgGXng+6DX1zLfmoymdXo17xh5zmRJ6Q42BWCfc2oJfdAr+Yv+AP9Cb7OJ3H/2JG1HNGz/84klThPVCc=);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="363" y="535" width="101" height="20" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="90">
<mxCell style="vsdxID=129;fillColor=#3e3e3e;gradientColor=none;shape=stencil(jZPdbsMgDIWfhlsLbAhw3bXvUbXpgpYlFU239u2XyGQJSP25MyeffXQIFrS5NPtzLVBehth/1b/hODSCPgRi6Jo6hmGsBG0FbU59rD9jf+2OfD7vJ3KqvvufacKN++TUgfK+Pu0YbEP3EDQIXq3hwzXyWMWABaNTR1JMBeRZuiFLyoKlRCXJONAuUcQS+mUWldQDe62AqsJ/NXk2syCx8De5eaVhlmZz7cHZp9kRpCvMTe7sNPjXyZWUL3Ln/2jh8/N7sHl6oQaszzMpPd/DfywEsnkqB1TcaBHp7SeXgWOxvOhTaFteiPX3cgNGibeHtn8=);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="370" y="772" width="23" height="54" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="91">
<mxCell style="vsdxID=130;fillColor=#a0a1a2;gradientColor=none;shape=stencil(nVTRcoMgEPwaX2/gAIXnNPmPTGOqU6sZY9r07wsFUc5RO33Dc+92bw8uE4d7db6VGbL70Hfv5Vd9GapMvGSIdVuVfT3YUyaOmThcu75867tHe/Hft7NDutNH9+kqPH0eB1W4JGTfISDB5L+Rk8e/PnqfwAMgwDnFsyf6EJtq4hIkAiggxAptU7czmSzRaAwU6q9gztg6lP8XqjQIsWmTgjx1yqYwnTqFNiRTq5QETawS1hue2iWpA5ReIiChnxUeuRQgEvrYV6TPDWhM6Xe71xIkX7QfKwcyY0WSm6JI73bU8TKN5AgK1+c0z4hiELfUzlN4lCYNccsOy6RqXSIxC0Sq1kKM3CJ3vlByW5aMaryaE7V1gXBPGLHSOLnRLH0pbNOjArRKZWqQxCE59rr18vliojuPf39H2cO04K510/j9OP9PF6IN+WUqjj8=);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="394" y="772" width="24" height="54" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="92">
<mxCell style="vsdxID=131;fillColor=#3999c6;gradientColor=none;shape=stencil(lVPRcsIgEPwaXm8ODkh4tvofjsaGaZo4GFv9+yY9UoFp1b4dewu7s9wJWp3a7bERCk9jGN6aT78fW0EvQinft03w41QJWgtaHYbQvIbh3O/5fNzOzLl6Hz7mFy58z2rQZr6l8MoIfp82TN6dA7MlN40FR5EeIYkga4YuiiGtwejIipCsABcWMaQcLMpUkv6Ql5NbW8gnD0etCowq1BU4natjLm0BKVXufJ+khFlCtoZK3bOJucXawOOAnANLuUWJhckF+NXjjf1kmLUG90SYCmSZZvLj9DNGNvd6x+mDmfsXeSpuo33wXcebkfbLVZggXiNafwE=);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="370" y="799" width="23" height="27" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="93">
<mxCell style="vsdxID=132;fillColor=#59b4d9;gradientColor=none;shape=stencil(lZNLcsIwDIZP463GlvxcU7gHA6HJNE2YEFq4fZPaKbEypO1Okn/rky1J0OZS7s+FQHnpu/at+KyOfSnoRSBWTVl0VT9YgraCNqe2K1679toco3/ej8rRem8/xgy3eE9JOd5BeY++9WDCd2QX5XXVrMgNGJqrD9cuZlfxPCDYdCFFFILWMXTDGPKYJMlXDqRPEkplBfAqqYirnrCNA4sMPsucYFqBZ3gJiuFJg87pco2MDoxj5FnSiaMXZAuGkeUvj87bkzdnataTKhU4zYuUeYkElvjnyLxAA+RYjevYoS1B5dwQQCH7nJ9Bm4bELLry0ExT4sHh34f3n7O+kA/GY61OVV3HrZyf8zUcQnGFafsF);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="394" y="799" width="23" height="27" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="94">
<mxCell style="vsdxID=133;fillColor=#FFFFFF;gradientColor=none;shape=stencil(lZdLctswDIZPoy2GBPhcp8k9Mo1Te+raGcdp3dsXqsQXZEnWTqIBfcZPAAQ7evrcv37sOlSf18v55+7P4e267+hbh3g47XeXw5WfOnru6On9fNn9uJy/Tm/D+8drb9k//Tr/7r9wG/xMBDS9F6q/w4pW6v/7y2D+/esy2OvsYGl00K2HumG28Xa0QWlDw4JVoBKYHiJ7D3qNHANE3ZJ9zKCbAGWyRejf59nFY1ywGoxu2cUGc4hBr5EXQ55gEcGHFsuymNiChdS8HdG12EUqQ4xpuUJmEWj9r6i1eChMESRHNO7GHLBWfwa4uqOgosAGCNRiayVShkVwE3m1X8zk4+G0peQ2mrcFXdfVaE6pJmakYBcntCg+WYtecxRFXVkV3ZUUY5VPYOw634B363w35RugZb4Dj4KffQrfA3nBr6wSP4DCCd8u8h3rbyb8KErAEWjR2rQFiy3f2QQrfJc69hzfg9x+D9YIvAMnw3cQRWflT6EV+Ny25/q6nuC5i1vR5VxJ61ScGqxv8dzrjcAjqx+X8MFCEOqTymWf+CFOso/CZPdrq9QdWKSwyK98UkJacCL+4CAIvtO5bDOfJRHxu7yVc/zKR0ufwi8dN/Mrq8Ins5HvTanYtGRBJj9OJoqgcqotzBTFagZPXNZiqqi/nHJNaF/9w5TmAfzW0GufeenZyooD/o70vRVu5bvcZTLfgheHIHcZIyqfe5GVk40pxxTlBDWLpad1mdZS6vM04wRfgVCfDwwkgVe5GHPlhZXKr3109tFhgieR+YaFDet8n771OB/vzCB8olDLZ621kP/OjFes7s4VDwwKmx34oVw03g/H43BPqX+XFxNeGi419PwP);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="370" y="763" width="47" height="17" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="95">
<mxCell style="vsdxID=134;fillColor=#7fba00;gradientColor=none;shape=stencil(jZHRDoIwDEW/Zq/NWAeTZ4T/IDJkERkZoPj3snRGRmLiW3t6t5O0DIupq0fNBJ9mZ2/6aZq5Y3hmQpih087MW8WwZFi01umrs8vQUD/WPumru334H1Z6x/0LwV/7rqLgZXGUTGiYQqpCOhBMIZeEVkFIclAYUgEpDoGsSCThH+0B/DBLAVkSq7MTqCxWK8A8NqMEGZsP3sjam+G/xWzFd52t6Xu6xn5+XP+G6HRYvgE=);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="375" y="772" width="1" height="2" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="96">
<mxCell style="vsdxID=135;fillColor=#7fba00;gradientColor=none;shape=stencil(jVLREoIgEPwaXhngNPXZ7D+c1GQydVDL/j7oKIUZs7dj2bu9hSWQDnXel0SwYVTdtXzIYqwJHIkQsq1LJUddEcgIpFWnyovqprbAc58bpqlu3d1MmLGPmQ7BnngKGY3iN3JC8nlSyOZI4JwebIdFYkYDC80CIZHQyJIswpnVmeEjZAngEjZkI0bBlV0mWok4poErut7Mk/nq7hrWY3nkSSc0FK643o95lncM/7SrHzDx/Hpu9T+A/8artcD93C2zjWz/j4IulhBVsmkwg+t7P3QawsBC9gI=);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="379" y="773" width="29" height="4" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="97">
<mxCell style="vsdxID=136;fillColor=#b8d432;gradientColor=none;shape=stencil(lZbbUgIxDIafZm8zbdLjNep7OAqyI4KzouLbG+xht2FY3LslJP2a9E/ajlYf28f3dYfq4zgcXtff/fNx29Fdh9jvt+uhP/JXR/cdrTaHYf0yHD73z+n3++PZ8/z1dvg6r3BKcQaCPQeh+kmGEMDjn+Uh+T99DilAJwcHpHNEtkSE4JLphHkV0CY7ZUt04HLciZJJK8ACryY1x55G6DaiotnHUMsefUayxWXkCCa25GAgirSJwLuW7S1Y19JNrIGFPnpdq7oDLTKfrlzKrkAJ/nSXGRYiUFyU/TTiWt3Zx/obdWcf5xaRWTZkWjIvoqI8cyWqzmoL8sxVS3YanJ1Xm2rJZqLhImt7UXFSEEjk7UFpkTeLYLbPAoIXjaYJouB7P+qybKmeVcF7ztSI5MuGrtC9qqhCt3WRClegxZFbQKE2x50j4Dx04g2xG2zhNCaVSY7GQZRNWKdDhXNDyEYHPVt3G0FLrZeQCrcBSGSuwAu49WDFfKtO1+AWBHuybGEb0E6yy24qGy8m3GyfWZaIJAss7yQI7M25Nsvk8yKaZYquRl+ldKLW4789LTqa21deXYLJMrM3mAZwVs7j6dTRjRejG0ELNfMwD9iSeZaLVuLrOs/HDN/1+0XX+1J//hjfEpt+t0tPken/8u3BpvRuoftf);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="375" y="766" width="37" height="9" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="&lt;div style=&quot;font-size: 1px&quot;&gt;&lt;p style=&quot;text-align:left;margin-left:0;margin-right:0;margin-top:0px;margin-bottom:0px;text-indent:0;vertical-align:middle;direction:ltr;&quot;&gt;&lt;font style=&quot;font-size:16.93px;font-family:Oracle Sans;color:#000000;direction:ltr;letter-spacing:0px;line-height:120%;opacity:1&quot;&gt;Azure Data&lt;br/&gt;&lt;/font&gt;&lt;/p&gt;&lt;/div&gt;" tags="Background" id="98">
<mxCell style="verticalAlign=middle;align=left;overflow=width;vsdxID=138;fillColor=none;gradientColor=none;shape=stencil(nZBLDoAgDERP0z3SIyjew0SURgSD+Lu9kMZoXLhwN9O+tukAlrNpJg1SzDH4QW/URgNYgZTkjA4UkwJUgGXng+6DX1zLfmoymdXo17xh5zmRJ6Q42BWCfc2oJfdAr+Yv+AP9Cb7OJ3H/2JG1HNGz/84klThPVCc=);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="351" y="830" width="169" height="20" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="&lt;div style=&quot;font-size: 1px&quot;&gt;&lt;p style=&quot;text-align:left;margin-left:0;margin-right:0;margin-top:0px;margin-bottom:0px;text-indent:0;vertical-align:middle;direction:ltr;&quot;&gt;&lt;font style=&quot;font-size:16.93px;font-family:Oracle Sans;color:#000000;direction:ltr;letter-spacing:0px;line-height:120%;opacity:1&quot;&gt;Lake Storage&lt;br/&gt;&lt;/font&gt;&lt;/p&gt;&lt;/div&gt;" tags="Background" id="99">
<mxCell style="verticalAlign=middle;align=left;overflow=width;vsdxID=139;fillColor=none;gradientColor=none;shape=stencil(nZBLDoAgDERP0z3SIyjew0SURgSD+Lu9kMZoXLhwN9O+tukAlrNpJg1SzDH4QW/URgNYgZTkjA4UkwJUgGXng+6DX1zLfmoymdXo17xh5zmRJ6Q42BWCfc2oJfdAr+Yv+AP9Cb7OJ3H/2JG1HNGz/84klThPVCc=);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="344" y="847" width="203" height="20" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="100">
<mxCell style="vsdxID=142;fillColor=#e6ad10;gradientColor=#c87e0e;shape=stencil(UzV2Ls5ILEhVNTIoLinKz04tz0wpyVA1dlE1MsrMy0gtyiwBslSNXVWNndPyi1LTi/JL81Ig/IJEkEoQKze/DGRCBUSfoYEBSI+RQSWED+G5QZTmZObhUQrjY1VMtlISHECuUiADERxpmTk5kNBElkcPPqAQJOiNXQE=);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="642" y="451" width="28" height="62" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="101">
<mxCell style="vsdxID=143;fillColor=#000000;gradientColor=none;fillOpacity=20;shape=stencil(nZFNEoIwDIVPky1TGlBYI96DkWI71pYpoHh7qcG/jrJg917ypZn0ARadrFoBnHW9sydxVXUvAXfAuTJSONVPCrAELBrrxNHZwdTk28qTXp3txb8w0lzMmJ/h7EY+jdLNo7AnWiuzQD/9T3g1ugBm2yjJ/sOHwdFxMTXzJMJ8xuOvVSMPL5oL/LVgxBDBNX8U0pN4h9EorSnLz34Y3lSi4LG8Aw==);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="624" y="466" width="28" height="46" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="102">
<mxCell style="vsdxID=144;fillColor=#000000;gradientColor=none;fillOpacity=18;shape=stencil(nZFNEoIwDIVPky1TGlBYI96DkWI71pYpoHh7qcG/jrJg917ypZn0ARadrFoBnHW9sydxVXUvAXfAuTJSONVPCrAELBrrxNHZwdTk28qTXp3txb8w0lzMmJ/h7EY+jdLNo7AnWiuzQD/9T3g1ugBm2yjJ/sOHwdFxMTXzJMJ8xuOvVSMPL5oL/LVgxBDBNX8U0pN4h9EorSnLz34Y3lSi4LG8Aw==);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="624" y="467" width="28" height="46" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="103">
<mxCell style="vsdxID=145;fillColor=#f6d751;gradientColor=#e6ad10;shape=stencil(nZFNEoIwDIVPky1TGlBYI96DkWI71pYpoHh7qcG/jrJg917ypZn0ARadrFoBnHW9sydxVXUvAXfAuTJSONVPCrAELBrrxNHZwdTk28qTXp3txb8w0lzMmJ/h7EY+jdLNo7AnWiuzQD/9T3g1ugBm2yjJ/sOHwdFxMTXzJMJ8xuOvVSMPL5oL/LVgxBDBNX8U0pN4h9EorSnLz34Y3lSi4LG8Aw==);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="624" y="466" width="28" height="46" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="104">
<mxCell style="vsdxID=146;fillColor=#f9e589;gradientColor=#f6d751;shape=stencil(nZHRDoIwDEW/Zq/LaDHAM+J/EBmyiIyMgfj3bumMk0QTebu9PV27XIbl1NWjZCAma/RV3lVjO4ZHBqCGThplnWJYMSxbbeTF6HloqB5rT3p104t/YaU54SdAPOLqRGCvhq9gIn6gr+YuOOd4iOnzbOjeZMsHA3kG5KxATpFyLAIEH9evGJZkPM0DgX9+fR/oxDuCVvU9JRj3t5E5i+LG6gk=);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="607" y="482" width="28" height="31" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="&lt;div style=&quot;font-size: 1px&quot;&gt;&lt;p style=&quot;text-align:left;margin-left:0;margin-right:0;margin-top:0px;margin-bottom:0px;text-indent:0;vertical-align:middle;direction:ltr;&quot;&gt;&lt;font style=&quot;font-size:16.93px;font-family:Oracle Sans;color:#000000;direction:ltr;letter-spacing:0px;line-height:120%;opacity:1&quot;&gt;Power BI&lt;br/&gt;&lt;/font&gt;&lt;/p&gt;&lt;/div&gt;" tags="Background" id="105">
<mxCell style="verticalAlign=middle;align=left;overflow=width;vsdxID=147;fillColor=none;gradientColor=none;shape=stencil(nZBLDoAgDERP0z3SIyjew0SURgSD+Lu9kMZoXLhwN9O+tukAlrNpJg1SzDH4QW/URgNYgZTkjA4UkwJUgGXng+6DX1zLfmoymdXo17xh5zmRJ6Q42BWCfc2oJfdAr+Yv+AP9Cb7OJ3H/2JG1HNGz/84klThPVCc=);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="605" y="518" width="135" height="20" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="106">
<mxCell style="vsdxID=148;fillColor=none;gradientColor=none;shape=stencil(nZBNDkIhDIRP0z3SIyDegwSQRgQC+PNu/yCNkRjjwt1M+7XpFFC1YIoDKVqv+eIeZHsAPIKUlIKr1IcC1IDK5+rONd+SZV/MJKe65vvc8OQ5MSek2FZ3YjBSWsCD+Bt9+a/wT3SI9+GeYuTca/8z6Cjxk1Dv);strokeColor=#312d2a;strokeWidth=2;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="152" y="67" width="101" height="729" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="107">
<mxCell style="vsdxID=149;fillColor=none;gradientColor=none;shape=stencil(dU9bDoAgDDvN/pEdwcc9TEBZRCCIr9sLWYzGxL92bbcOsF5MHzRIsaToJ72TSgawASnJGR0pZQTYAtaDj3qMfnWKeeiLs6DZb2XDwTlRElKczCrBvGOrJfey3uKPOYPnyEDWcse3/i2VR/wQthc=);strokeColor=#312d2a;strokeWidth=2;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="152" y="339" width="101" height="1" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="108">
<mxCell style="vsdxID=150;fillColor=none;gradientColor=none;shape=stencil(dU9bDoAgDDvN/pEdwcc9TEBZRCCIr9sLWYzGxL92bbcOsF5MHzRIsaToJ72TSgawASnJGR0pZQTYAtaDj3qMfnWKeeiLs6DZb2XDwTlRElKczCrBvGOrJfey3uKPOYPnyEDWcse3/i2VR/wQthc=);strokeColor=#312d2a;strokeWidth=2;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="152" y="187" width="101" height="1" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="109">
<mxCell style="vsdxID=151;fillColor=#312d2a;gradientColor=none;shape=stencil(pVTRboMwDPyavFqOHUjy3HX/Ua10oDGoKN3o3zcsUUeCAHV7C8fZd7EdC95dysO5EISXvms/iu/q2JeCXwRR1ZRFV/XuJHgveHdqu+K9a6/N0X+fDyNzPH22X2OGwcdZC3oMIrx5IFOg1Q/y6vlv184HSE+QiCEgABmBJA8NlHICoDQYEzg8Uw6IyoDyqXRdNVOrzpmJvBLkcs2qi1A6NouxUctgTWwVE5sMuYl9bsoysElqBMQzZU6ULai0RnNx6aq9UiMDmMf9xBX2JL1HjAb75NUsQkbbd3PN05uXsxp4S98m+o9ZG2je9XQeH9qTWVrSTmq1+VCe5ccPEWNyHqKXcsvsX3zlOrTMxz9z132sc93hd0udqrr2S276P91qDvIbkfd3);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="152" y="484" width="136" height="15" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="110">
<mxCell style="vsdxID=152;fillColor=#312d2a;gradientColor=none;shape=stencil(pVTLcsMgDPwarhqQeJhzmvxHpnFqT107Q5w2/fvi4rpAJnjS3uT1il0kIUabc7M/1Qz5eXTDa/3RHsaG0RNDbPumdu3oI0ZbRpvj4OoXN1z6Q/g+7SfmFL0N79MJ15BnLRg9ZSH/DIiSYOQ3sgsJzxcXMkQgCM7nhBlQCAIDdMWcMwPSQFXNHLqVniGpAE2s3bV9bFZBJRKzCBpLXn2G0qlbnjr1DGFSrzzzKcFS6nNVVoK2WZEAKVOOSD8QyLxIt+LCl7tQowqkTBvKC+zo+IBUBqx48G6Wg8L1y/nBMqu3swbIrrR0aVg+kVFTl7bnE7loR8N0Tzsr1vpbeTghfY08JWsoPQYLhP/iSwK6z+d/5pZ9lLk++F1Vx7brwqaL/+erzUNhLdL2Cw==);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="431" y="485" width="170" height="15" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="111">
<mxCell style="vsdxID=153;fillColor=#312d2a;gradientColor=none;shape=stencil(pZTRboMwDEW/Jq9WYieEPHftf1QrHWgMKkq37u8XllTFaQGhvsXhmHvtJBa0OZf7UyFQnvuu/Sx+qkNfCnoTiFVTFl3V+5WgraDNse2Kj669NIcQn/YDOay+2u/hD9eQZzRYPWSh/A07EvA/3gX8/dIFXsUEBIUxIW7JEF4xhNpCnkcCOUGRMIBZJOipal01I5MIGTKPBNrMmZTcIEFmuEfJ/RE4yy2OJG+mQdnZxgASl9VAlss60ElnRkzUUQjSzUvz7hjJeqMA82k4t+AU45fqchIMLhbmr5FdqsxZoHxdU5V8OEqXSN8RfDjtaeH0BiUtXXoVK/HkzWVgGX0r4fnPU9qfRzaNawJ6BV/n5SXaL+5j6VjVdZhq4+/pGPNbYQTS9g8=);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="385" y="555" width="15" height="207" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="112">
<mxCell style="vsdxID=154;fillColor=#312d2a;gradientColor=none;shape=stencil(pVTLcoMwDPwaXzWy5Qc+p8l/ZBpSmFLIENLSv6+pPQk2g5m0N7GsvCtLFqPdtTpeSibwOvTde/lVn4aK0QsTom6rsq8HFzHaM9qdu75867tbe/Lfl+PEnKKP7nM6YfR51oKZkgR+e0BJMPoXOXj+6633CdwTOGJICIASwKWHRpFyAiANFDpwaKEcEKlAyLl0U7dzq85Z7FWA5jmrLkOa2CzGRi2BNbFVTGwS6MTnpiwBJbKuMlooU6JsQapNcS4AdeaSCkAVNxQz7Nn5HikMWPlkcRZBqe3qHu3LlGcNkN3Qt4n+fdpGsex7OpF37dk0rWknl7X5VJ7lx08RY7IO2Wtnc/UvvnQdWufjn7l5H3muCx576lw3jV9z8//pXnOQ34m0/wE=);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="152" y="1083" width="136" height="15" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="113">
<mxCell style="vsdxID=155;fillColor=#312d2a;gradientColor=none;shape=stencil(pVTRcoMgEPwaXm8ODkSe0+Q/Mo2pTq1mjGnt3xcLkwCOOGnfznWP3buDY7S71sdLxQRex6F/r76a01gzemFCNF1dDc1oI0Z7RrtzP1RvQ3/rTu77cpyZc/TRf84nTC7PGNBzksBvBygJWv4iB8d/vQ0ugTsCR/QJHlACuHDQJFKOB6SGsvQcWih7RCoQRSjdNl1o1TqLvQooeM6qzZA6NouxUUNgdGwVE5sEReJzU5aAEllbGS2UKVE2INMeLcW57XamRyWgiueJGXZwvENKDebJ0gyCEtu1PYaXKc5ooC19k+jf79okllNP7+NdO7hLa9pJrzYfyrP8+CFiTC589trZXP2LL+2E1vn4Z27eR55rg8eWOjdt65Zc+D/dahZyG5H2Pw==);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="152" y="924" width="136" height="15" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="114">
<mxCell style="vsdxID=156;fillColor=none;gradientColor=none;shape=stencil(dU9bDoAgDDvN/pEdwcc9TEBZRCCIr9sLWYzGxL92bbcOsF5MHzRIsaToJ72TSgawASnJGR0pZQTYAtaDj3qMfnWKeeiLs6DZb2XDwTlRElKczCrBvGOrJfey3uKPOYPnyEDWcse3/i2VR/wQthc=);strokeColor=#312d2a;strokeWidth=2;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="152" y="653" width="101" height="1" as="geometry" />
</mxCell>
</UserObject>
</root>
</mxGraphModel>
</diagram>
</mxfile>

View File

@@ -0,0 +1,368 @@
<svg width="712" height="1112" viewBox="0 0 712 1112" fill="none" xmlns="http://www.w3.org/2000/svg">
<g id="data-lake-db-at-azure-process">
<rect width="712" height="1112" fill="white"/>
<g id="Data Sources">
<rect x="0.5" y="0.5" width="215" height="1111" rx="3.5" fill="#F5F4F2"/>
<rect x="0.5" y="0.5" width="215" height="1111" rx="3.5" stroke="#9E9892"/>
<text id="OCI Region" fill="#312D2A" xml:space="preserve" style="white-space: pre" font-family="Oracle Sans" font-size="16" font-weight="bold" letter-spacing="0em"><tspan x="58.0703" y="21.816">Data Sources</tspan></text>
</g>
<g id="Data Sources_2">
<rect x="264.5" y="0.5" width="215" height="1111" rx="3.5" fill="#F5F4F2"/>
<rect x="264.5" y="0.5" width="215" height="1111" rx="3.5" stroke="#9E9892"/>
<text id="OCI Region_2" fill="#312D2A" xml:space="preserve" style="white-space: pre" font-family="Oracle Sans" font-size="16" font-weight="bold" letter-spacing="0em"><tspan x="336.883" y="21.816">Data Tier</tspan></text>
</g>
<g id="Data Sources_3">
<rect x="496.5" y="0.5" width="215" height="1111" rx="3.5" fill="#F5F4F2"/>
<rect x="496.5" y="0.5" width="215" height="1111" rx="3.5" stroke="#9E9892"/>
<text id="OCI Region_3" fill="#312D2A" xml:space="preserve" style="white-space: pre" font-family="Oracle Sans" font-size="16" font-weight="bold" letter-spacing="0em"><tspan x="535.453" y="21.816">Consumption Tier</tspan></text>
</g>
<g id="Other relational databases">
<g id="Services-Enterprise-resource-Planning-Cloud-Service-ERP">
<g id="Group 514">
<path id="Vector" d="M92.0093 83.148L98.786 79.7514L92.0093 76.3691L94.7771 74.9419H78.7698L78.9268 72.8726C79.1192 70.4761 79.9217 68.1688 81.2577 66.1703C82.5938 64.1718 84.4189 62.5487 86.5595 61.4554C87.0189 61.2188 87.419 60.8816 87.7303 60.469C88.0415 60.0564 88.2557 59.5789 88.3571 59.0721C88.837 56.6085 90.1584 54.3885 92.0949 52.7925C94.0314 51.1965 96.4624 50.3237 98.9715 50.3237C99.3088 50.302 99.6471 50.302 99.9844 50.3237H100.327C100.776 50.3288 101.221 50.24 101.634 50.0631C102.046 49.8861 102.418 49.6249 102.724 49.2961C104.185 47.7348 106.001 46.5492 108.018 45.8402C110.035 45.1313 112.193 44.9198 114.309 45.2238C116.425 45.5278 118.437 46.3383 120.173 47.5865C121.909 48.8346 123.318 50.4835 124.281 52.393C124.508 52.8751 124.842 53.2991 125.257 53.6329C125.672 53.9667 126.158 54.2016 126.677 54.3197C128.198 54.6517 129.647 55.2509 130.957 56.0893C133.868 57.9264 135.974 60.7993 136.85 64.1286C137.727 67.4579 137.308 70.9957 135.68 74.0286L135.138 75.0418H121.784L124.366 76.469L117.59 79.7942L124.423 83.2194L108.074 91.1686L92.0093 83.148Z" fill="white"/>
<path id="Vector_2" d="M112.397 45.7577C114.737 45.7481 117.033 46.3957 119.023 47.627C121.013 48.8582 122.617 50.6236 123.653 52.7222C123.933 53.2828 124.334 53.7738 124.828 54.159C125.322 54.5443 125.895 54.814 126.507 54.9485C127.953 55.2744 129.332 55.8439 130.587 56.6326C133.354 58.3654 135.357 61.0872 136.189 64.2446C137.021 67.4019 136.62 70.7578 135.067 73.6299L134.724 74.2721H119.031L122.826 76.3843L115.978 79.738L118.047 80.7656L122.826 83.1489L108.074 90.3846L93.6078 83.1489L98.3301 80.7799L100.384 79.7523L93.6078 76.37L97.7879 74.3006H79.5408L79.6407 72.9876C79.7984 70.7062 80.5365 68.5029 81.785 66.587C83.0335 64.6712 84.7509 63.1065 86.774 62.0414C87.3257 61.7579 87.8068 61.3544 88.182 60.8604C88.5573 60.3665 88.8172 59.7947 88.9426 59.1872C89.2551 57.5854 89.9502 56.0831 90.9688 54.8082C91.9873 53.5334 93.299 52.5239 94.7919 51.8659C96.0794 51.3052 97.468 51.0138 98.8722 51.0096H99.8138H100.228C100.763 51.0023 101.292 50.8873 101.782 50.6716C102.272 50.4558 102.714 50.1437 103.081 49.7537C104.273 48.4799 105.717 47.4672 107.32 46.7795C108.924 46.0917 110.652 45.7438 112.397 45.7577ZM112.397 44.3306C110.471 44.3321 108.566 44.7309 106.801 45.5019C105.036 46.2729 103.449 47.3997 102.139 48.8118C101.9 49.0666 101.61 49.2691 101.288 49.4066C100.967 49.5441 100.62 49.6137 100.27 49.611H99.985C99.6286 49.5897 99.2713 49.5897 98.915 49.611C96.2374 49.6159 93.6442 50.5484 91.5764 52.2501C89.5087 53.9517 88.094 56.3173 87.573 58.9445C87.4917 59.3455 87.3213 59.7231 87.0743 60.0492C86.8274 60.3753 86.5102 60.6416 86.1463 60.8284C83.9103 61.9969 82.0087 63.7159 80.6208 65.8234C79.233 67.9308 78.4047 70.3571 78.214 72.8735L78.1141 74.1865L78 75.7278H91.7531L90.4263 76.3985L92.9658 77.6687L97.2458 79.7809L92.9658 81.893L90.4263 83.1775L92.9658 84.4476L107.432 91.6833L108.074 91.9972L108.702 91.6833L123.454 84.4334L126.036 83.1632L123.454 81.8788L119.174 79.738L123.454 77.6544L125.908 76.4556L124.481 75.6992H135.523L135.923 74.9571L136.265 74.3149C137.321 72.3737 137.912 70.2137 137.991 68.0051C138.07 65.7966 137.635 63.5999 136.721 61.5881C135.807 59.5762 134.438 57.8043 132.722 56.4119C131.007 55.0195 128.991 54.0447 126.835 53.5642C126.432 53.4784 126.053 53.3064 125.723 53.0601C125.393 52.8137 125.12 52.4988 124.923 52.1371C123.775 49.7935 121.992 47.8194 119.778 46.4394C117.563 45.0593 115.006 44.3287 112.397 44.3306Z" fill="white"/>
<path id="Vector_3" d="M115.278 82.1214L117.29 83.1347L108.088 87.6445L99.0998 83.149L101.069 82.15L98.3294 80.7799L93.6071 83.149L108.074 90.3846L122.825 83.149L118.046 80.7656L115.278 82.1214Z" fill="#2D5967"/>
<path id="Vector_4" d="M108.074 83.6063L122.825 76.3849L118.046 73.9873L115.278 75.3431L117.29 76.3564L108.088 80.8661L99.0998 76.3706L101.069 75.3859L98.3294 74.0158L93.6071 76.3706L108.074 83.6063Z" fill="#2D5967"/>
<path id="Vector_5" d="M122.825 69.6053L108.202 62.2983L93.6071 69.5911L108.074 76.8267L122.825 69.6053ZM108.202 65.0385L117.29 69.5768L108.088 74.0866L99.0998 69.5911L108.202 65.0385Z" fill="#2D5967"/>
<path id="Vector_6" d="M115.278 75.3431L117.29 76.3564L108.088 80.8661L99.0998 76.3706L101.069 75.3859L98.3294 74.0158L93.6071 76.3706L108.074 83.6063L122.825 76.3849L118.046 73.9873L115.278 75.3431Z" fill="#2D5967"/>
<path id="Vector_7" d="M115.278 82.1214L117.29 83.1347L108.088 87.6445L99.0998 83.149L101.069 82.15L98.3294 80.7799L93.6071 83.149L108.074 90.3846L122.825 83.149L118.046 80.7656L115.278 82.1214Z" fill="#2D5967"/>
<path id="Vector_8" d="M130.6 56.6328C129.341 55.8426 127.956 55.2731 126.506 54.9487C125.894 54.8142 125.32 54.5445 124.827 54.1592C124.333 53.774 123.932 53.283 123.652 52.7224C122.616 50.6238 121.011 48.8584 119.021 47.6272C117.031 46.3959 114.736 45.7483 112.396 45.7579C110.666 45.7614 108.955 46.1204 107.37 46.8127C105.785 47.505 104.358 48.5159 103.18 49.7825C102.759 50.2308 102.239 50.5751 101.662 50.7881C101.085 51.0011 100.467 51.077 99.8555 51.0098C98.1399 50.8561 96.4131 51.1358 94.8336 51.8233C93.3407 52.4813 92.029 53.4908 91.0105 54.7656C89.992 56.0404 89.2968 57.5428 88.9843 59.1445C88.8589 59.7521 88.599 60.3239 88.2238 60.8178C87.8485 61.3118 87.3674 61.7153 86.8158 61.9988C84.7926 63.0639 83.0752 64.6286 81.8268 66.5444C80.5783 68.4602 79.8401 70.6635 79.6824 72.945L79.5397 74.3008H91.5523V71.8176H82.2789C82.5979 70.2005 83.2764 68.6759 84.2643 67.3567C85.2521 66.0375 86.524 64.9575 87.9856 64.1966C88.8649 63.7409 89.6297 63.0921 90.2226 62.2987C90.8156 61.5054 91.2214 60.588 91.4096 59.6155C91.6482 58.4031 92.1762 57.2663 92.9488 56.3021C93.7214 55.338 94.7155 54.575 95.8466 54.0782C97.0385 53.5524 98.3439 53.3364 99.6415 53.4502C100.624 53.5533 101.616 53.4279 102.542 53.0838C103.467 52.7397 104.301 52.1862 104.977 51.4665C105.926 50.4467 107.074 49.6328 108.35 49.0755C109.626 48.5182 111.003 48.2294 112.396 48.2269C114.277 48.2124 116.125 48.7298 117.725 49.7196C119.325 50.7093 120.613 52.1312 121.441 53.8213C121.889 54.7126 122.53 55.4929 123.317 56.1052C124.104 56.7174 125.018 57.1463 125.992 57.3606C127.166 57.6388 128.282 58.1219 129.288 58.7878C131.413 60.1332 132.981 62.2006 133.704 64.6101C134.428 67.0195 134.258 69.6092 133.225 71.9032H124.665V74.3008H134.738L135.08 73.6586C136.642 70.7838 137.047 67.4212 136.215 64.2571C135.382 61.0931 133.374 58.3661 130.6 56.6328Z" fill="#2D5967"/>
</g>
</g>
<g id="Icon Text Label">
<text id="IconLabel" fill="black" xml:space="preserve" style="white-space: pre" font-family="Oracle Sans" font-size="16" letter-spacing="0em"><tspan x="45.3906" y="109.816">Oracle Cloud ERP</tspan></text>
</g>
</g>
<g id="Group 1550">
<g id="Data Sources_4">
<rect x="272.71" y="257.604" width="199" height="847" rx="3.5" fill="white"/>
<rect x="272.71" y="257.604" width="199" height="847" rx="3.5" stroke="#9E9892"/>
<text id="Fault Domain" fill="#312D2A" xml:space="preserve" style="white-space: pre" font-family="Oracle Sans" font-size="16" font-weight="600" letter-spacing="0em"><tspan x="337.241" y="278.92">Ingestion</tspan></text>
</g>
<g id="Microsoft SQL Server">
<g id="Database-Action-gear">
<g id="Group 309">
<path id="Vector_9" d="M117.15 912.736L117.065 911.966C113.58 912.358 110.077 912.558 106.57 912.565C103.911 912.565 80.5455 912.351 80.5455 904.73V862.223C80.5455 854.388 103.911 854.16 106.57 854.16C109.229 854.16 132.609 854.388 132.609 862.223V889.758L134.5 891.667L132.68 893.946L135.524 894.274V902.921L132.68 903.248L134.5 905.528L128.385 911.653L126.465 910.115L126.067 910.243L125.783 912.736H117.15Z" fill="white"/>
<path id="Vector_10" d="M106.569 854.872C115.386 854.872 131.896 856.41 131.896 862.222V890.057L133.546 891.709L131.896 893.789V894.573L134.869 894.9V902.293L131.896 902.621V903.405L133.546 905.484L128.341 910.698L126.606 909.273L125.412 909.644L125.156 911.98H117.775L117.69 911.14C114 911.593 110.286 911.831 106.569 911.852C97.8229 911.852 81.2554 910.427 81.2554 904.729V862.222C81.2554 856.41 97.8229 854.872 106.569 854.872ZM106.569 853.447C102.103 853.447 79.8333 853.875 79.8333 862.222V904.729C79.8333 912.892 102.103 913.276 106.569 913.276C109.865 913.27 113.16 913.094 116.438 912.749L116.509 913.447H126.464L126.606 912.179L126.72 911.197L127.488 911.809L128.483 912.607L129.379 911.709L134.598 906.481L135.494 905.584L134.698 904.587L134.086 903.818L135.068 903.704L136.333 903.561V893.59L135.068 893.447L134.044 893.333L134.655 892.564L135.452 891.567L134.556 890.669L133.318 889.43V862.222C133.318 853.875 111.119 853.447 106.569 853.447Z" fill="white"/>
<path id="Vector_11" d="M131.498 902.906L131.569 902.721L131.498 902.906Z" fill="#2D5967"/>
<path id="Vector_12" d="M110.582 909.216C109.273 909.216 107.936 909.287 106.571 909.287C100.932 909.345 95.3031 908.771 89.7904 907.577C84.7704 906.424 83.647 905.084 83.647 904.728V893.931C88.4679 896.78 99.5318 897.663 106.287 897.677V895.298C100.744 895.349 95.2117 894.79 89.7904 893.631C84.7562 892.435 83.6328 891.082 83.6328 890.711V880.141C88.539 882.99 99.8447 883.888 106.557 883.888C109.259 883.888 112.7 883.745 116.17 883.404H116.341C121.446 882.876 126.594 881.879 129.495 880.17V885.17L129.595 885.255L131.885 887.549V862.791C131.891 862.71 131.891 862.629 131.885 862.549C131.892 862.435 131.892 862.321 131.885 862.207C131.885 857.278 118.759 855.084 106.557 855.084C94.3554 855.084 81.2578 857.278 81.2578 862.207C81.2508 862.321 81.2508 862.435 81.2578 862.549C81.2517 862.629 81.2517 862.71 81.2578 862.791V904.728C81.2578 910.255 97.8253 911.708 106.571 911.708C108.406 911.708 110.567 911.708 112.843 911.495L110.582 909.216ZM106.571 857.421C112.213 857.343 117.844 857.922 123.352 859.144C128.4 860.384 129.51 861.78 129.51 862.207C129.51 862.634 128.4 864.016 123.352 865.255C117.844 866.478 112.213 867.056 106.571 866.979C100.93 867.057 95.2986 866.478 89.7904 865.255C84.7562 864.016 83.647 862.634 83.647 862.207C83.647 861.78 84.7562 860.384 89.7904 859.144C95.2986 857.921 100.93 857.343 106.571 857.421ZM123.352 879.842C117.838 881.022 112.209 881.581 106.571 881.509C100.933 881.581 95.3046 881.022 89.7904 879.842C84.7562 878.646 83.6328 877.292 83.6328 876.908V865.512C87.8991 868.161 97.5124 869.386 106.557 869.386C115.602 869.386 125.172 868.161 129.495 865.512V876.908C129.51 877.292 128.386 878.646 123.352 879.842Z" fill="#2D5967"/>
<path id="Vector_13" d="M121.558 892.037C120.264 892.051 119.004 892.448 117.935 893.178C116.866 893.908 116.037 894.938 115.552 896.139C115.066 897.34 114.947 898.659 115.208 899.928C115.469 901.197 116.099 902.36 117.018 903.272C117.938 904.183 119.106 904.801 120.376 905.049C121.645 905.297 122.96 905.162 124.154 904.663C125.348 904.164 126.367 903.323 127.085 902.244C127.802 901.166 128.185 899.899 128.185 898.603C128.185 897.735 128.013 896.875 127.679 896.074C127.345 895.272 126.856 894.545 126.239 893.935C125.623 893.324 124.892 892.842 124.088 892.516C123.285 892.19 122.425 892.027 121.558 892.037ZM121.558 902.777C120.73 902.78 119.919 902.536 119.23 902.077C118.54 901.618 118.002 900.964 117.684 900.199C117.365 899.433 117.281 898.589 117.442 897.776C117.603 896.962 118.002 896.214 118.587 895.628C119.173 895.041 119.919 894.642 120.731 894.481C121.544 894.32 122.386 894.404 123.15 894.723C123.915 895.041 124.567 895.58 125.026 896.271C125.484 896.962 125.727 897.774 125.724 898.603C125.724 899.71 125.285 900.772 124.504 901.555C123.723 902.338 122.663 902.777 121.558 902.777Z" fill="#2D5967"/>
<path id="Vector_14" d="M131.598 894.544L131.498 894.288L133.546 891.709L128.341 886.496L125.767 888.547L125.511 888.447L125.156 885.171H117.775L117.419 888.447L117.163 888.547L114.589 886.496L109.385 891.709L111.432 894.288L111.333 894.544L108.062 894.9V902.293L111.333 902.65L111.432 902.906L109.385 905.484L114.589 910.698L117.163 908.647L117.419 908.746L117.775 912.023H125.156L125.511 908.746L125.767 908.647L128.341 910.698L133.546 905.484L131.498 902.906L131.598 902.65L134.869 902.293V894.9L131.598 894.544ZM132.451 900.157L129.806 900.442L129.564 901.182C129.424 901.646 129.238 902.094 129.01 902.521L128.654 903.219L130.332 905.299L128.185 907.578L126.108 905.897L125.341 906.154C124.914 906.383 124.466 906.569 124.004 906.709L123.278 906.952L122.98 909.601H119.908L119.652 906.98L118.913 906.738C118.451 906.595 118.003 906.409 117.576 906.182L116.808 905.826L114.774 907.578L112.542 905.299L114.205 903.219L113.964 902.521C113.735 902.094 113.55 901.646 113.409 901.182L113.096 900.456L110.451 900.171V897.037L113.096 896.752L113.338 896.011C113.481 895.549 113.667 895.1 113.893 894.672L114.248 893.989L112.542 891.909L114.732 889.701L116.808 891.367L117.491 891.011C117.918 890.785 118.365 890.599 118.827 890.456L119.567 890.214L119.851 887.564H122.966L123.264 890.214L123.99 890.456C124.452 890.596 124.9 890.783 125.326 891.011L126.023 891.367L128.185 889.687L130.361 891.909L128.682 894.003L129.038 894.687C129.264 895.115 129.45 895.563 129.593 896.026L129.834 896.766L132.479 897.051L132.451 900.157Z" fill="#2D5967"/>
</g>
</g>
<g id="Icon Text Label_2">
<text id="IconLabel_2" fill="black" xml:space="preserve" style="white-space: pre" font-family="Oracle Sans" font-size="16" letter-spacing="0em"><tspan x="73.5703" y="931.263">Microsoft</tspan></text>
<text id="IconLabel_3" fill="black" xml:space="preserve" style="white-space: pre" font-family="Oracle Sans" font-size="16" letter-spacing="0em"><tspan x="67.8594" y="947.263">SQL Server</tspan></text>
<text id="IconLabel_4" fill="black" xml:space="preserve" style="white-space: pre" font-family="Oracle Sans" font-size="16" letter-spacing="0em"><tspan x="57.5391" y="963.263">(on-premises)</tspan></text>
</g>
</g>
<g id="Other relational databases_2">
<g id="Database">
<g id="Group 15">
<path id="Vector_15" d="M108.189 206.027C105.518 206.027 82.0462 205.813 82.0462 198.17V155.541C82.0462 147.684 105.518 147.456 108.189 147.456C110.86 147.456 134.346 147.684 134.346 155.541V198.17C134.346 205.813 110.875 206.027 108.189 206.027Z" fill="white"/>
<path id="Vector_16" d="M108.19 148.17C117.048 148.17 133.633 149.713 133.633 155.541V198.17C133.633 203.884 116.99 205.313 108.19 205.313C99.3905 205.313 82.7619 203.884 82.7619 198.17V155.541C82.7619 149.713 99.4047 148.17 108.19 148.17ZM108.19 146.741C103.705 146.741 81.3333 147.17 81.3333 155.541V198.17C81.3333 206.355 103.705 206.741 108.19 206.741C112.676 206.741 135.062 206.327 135.062 198.17V155.541C135.062 147.17 112.762 146.741 108.19 146.741Z" fill="white"/>
<path id="Vector_17" d="M133.634 155.542C133.634 149.713 117.048 148.17 108.191 148.17C99.3338 148.17 82.7623 149.713 82.7623 155.542V198.17C82.7623 203.885 99.4052 205.313 108.191 205.313C116.977 205.313 133.634 203.885 133.634 198.17V155.542ZM130.777 184.113C130.777 184.37 129.705 185.656 124.805 186.842C119.345 188.005 113.772 188.551 108.191 188.47C102.589 188.546 96.9967 187.99 91.5195 186.813C86.6195 185.628 85.6195 184.342 85.6195 184.085V173.599C90.7338 176.385 101.691 177.228 108.262 177.228C114.834 177.228 125.805 176.385 130.919 173.599L130.777 184.113ZM130.777 170.085C130.777 170.342 129.705 171.642 124.805 172.813C119.345 173.976 113.772 174.522 108.191 174.442C102.589 174.518 96.9967 173.962 91.5195 172.785C86.6195 171.613 85.6195 170.313 85.6195 170.056V159.17C90.7338 162.028 101.691 162.899 108.262 162.899C114.834 162.899 125.805 162.042 130.919 159.17L130.777 170.085ZM91.5338 152.67C97.0041 151.481 102.594 150.93 108.191 151.028C113.796 150.953 119.39 151.528 124.862 152.742C129.905 153.885 130.848 155.313 130.848 155.542C130.848 155.77 129.834 157.17 124.862 158.399C119.39 159.612 113.796 160.187 108.191 160.113C102.592 160.191 97.0019 159.621 91.5338 158.413C86.5623 157.17 85.6195 155.828 85.6195 155.542C85.6195 155.256 86.6338 153.899 91.6052 152.685L91.5338 152.67ZM124.877 200.87C119.395 202.048 113.797 202.604 108.191 202.528C102.589 202.603 96.9967 202.048 91.5195 200.87C86.6195 199.699 85.6195 198.399 85.6195 198.17V187.628C90.7338 190.413 101.691 191.256 108.262 191.256C114.834 191.256 125.805 190.413 130.919 187.628V198.17C130.919 198.428 129.848 199.728 124.948 200.899" fill="#2D5967"/>
</g>
</g>
<g id="Icon Text Label_3">
<text id="IconLabel_5" fill="black" xml:space="preserve" style="white-space: pre" font-family="Oracle Sans" font-size="16" letter-spacing="0em"><tspan x="51.7266" y="224.557">Other relational</tspan></text>
<text id="IconLabel_6" fill="black" xml:space="preserve" style="white-space: pre" font-family="Oracle Sans" font-size="16" letter-spacing="0em"><tspan x="71.3281" y="240.557">databases</tspan></text>
<text id="IconLabel_7" fill="black" xml:space="preserve" style="white-space: pre" font-family="Oracle Sans" font-size="16" letter-spacing="0em"><tspan x="57.5391" y="256.557">(on-premises)</tspan></text>
</g>
</g>
<g id="Azure SQL Database">
<g id="Azure-SQL-Database">
<g id="Group">
<g id="group1000-1">
<g id="group1001-2">
<g id="group1002-3">
<g id="group1003-4">
<g id="group1004-5">
<g id="shape1005-6">
<path id="Vector_18" fill-rule="evenodd" clip-rule="evenodd" d="M108.835 310.868C96.4151 310.868 86.3333 307.324 86.3333 302.667V346.3C86.3333 350.775 96.2325 354.409 108.506 354.482H108.835C121.254 354.482 131.318 350.939 131.318 346.3V302.667C131.318 307.215 121.254 310.868 108.835 310.868Z" fill="url(#paint0_linear_17642_377913)"/>
</g>
</g>
<g id="group1006-10">
<g id="shape1007-11">
<path id="Vector_19" fill-rule="evenodd" clip-rule="evenodd" d="M131.318 302.683C131.318 307.231 121.254 310.865 108.835 310.865C96.4151 310.865 86.3333 307.322 86.3333 302.683C86.3333 298.026 96.4151 294.482 108.835 294.482C121.254 294.482 131.318 298.026 131.318 302.683Z" fill="#E8E8E8"/>
</g>
</g>
<g id="group1008-13">
<g id="shape1009-14">
<path id="Vector_20" fill-rule="evenodd" clip-rule="evenodd" d="M126.101 302.007C126.101 304.893 118.339 307.23 108.841 307.23C99.3258 307.23 91.5635 304.893 91.5635 302.007C91.5635 299.121 99.3258 296.82 108.841 296.82C118.339 296.82 126.101 299.139 126.101 302.007Z" fill="#50E6FF"/>
</g>
</g>
<g id="group1010-16">
<g id="shape1011-17">
<path id="Vector_21" fill-rule="evenodd" clip-rule="evenodd" d="M108.819 303.322C104.19 303.203 99.5756 303.883 95.1753 305.331C99.58 306.751 104.196 307.394 108.819 307.231C113.457 307.369 118.083 306.676 122.48 305.185C118.061 303.803 113.444 303.174 108.819 303.322Z" fill="#198AB3"/>
</g>
</g>
<g id="group1012-19">
<g id="shape1013-20">
<path id="Vector_22" fill-rule="evenodd" clip-rule="evenodd" d="M122.521 332.955V320.956H119.361V335.531H127.982V332.955H122.521ZM97.4623 327.056C96.8101 326.792 96.2054 326.421 95.6724 325.96C95.5301 325.809 95.4194 325.632 95.3466 325.437C95.2739 325.243 95.2408 325.035 95.2492 324.828C95.2388 324.621 95.2821 324.414 95.3748 324.229C95.4676 324.043 95.6066 323.885 95.7783 323.77C96.2077 323.472 96.7222 323.324 97.2432 323.348C98.4942 323.298 99.7269 323.664 100.75 324.389V321.339C99.6284 320.926 98.4366 320.74 97.2432 320.791C95.8706 320.716 94.5165 321.137 93.426 321.978C92.9493 322.347 92.5666 322.824 92.3094 323.37C92.0521 323.916 91.9278 324.516 91.9466 325.12C91.9466 326.928 93.0607 328.334 95.4533 329.394C96.227 329.721 96.9571 330.145 97.6267 330.654C97.7917 330.793 97.9245 330.966 98.0159 331.161C98.1073 331.357 98.155 331.57 98.1558 331.786C98.157 332.001 98.1067 332.214 98.0091 332.405C97.9115 332.597 97.7694 332.762 97.595 332.887C97.1175 333.164 96.5701 333.296 96.0195 333.266C94.6047 333.257 93.2414 332.731 92.184 331.786V335.074C93.3457 335.674 94.6414 335.963 95.9464 335.914C97.4195 336.002 98.8793 335.59 100.092 334.745C100.517 334.338 100.842 333.838 101.042 333.283C101.241 332.729 101.31 332.135 101.243 331.549C101.263 330.641 100.951 329.757 100.366 329.065C99.5487 328.198 98.5594 327.514 97.4623 327.056ZM115.854 332.681C116.65 331.336 117.049 329.79 117.005 328.225C116.929 326.902 116.534 325.617 115.854 324.481C115.304 323.377 114.448 322.457 113.389 321.832C112.319 321.225 111.11 320.91 109.882 320.919C108.56 320.891 107.255 321.219 106.101 321.869C105.013 322.475 104.119 323.381 103.526 324.481C102.905 325.727 102.592 327.105 102.613 328.499C102.617 329.729 102.905 330.942 103.453 332.042C103.991 333.133 104.835 334.041 105.882 334.654C106.943 335.297 108.151 335.656 109.389 335.695L112.421 339.238H116.658L112.329 335.348C113.786 334.917 115.039 333.969 115.854 332.681ZM112.329 331.786C112.011 332.186 111.604 332.507 111.141 332.722C110.679 332.938 110.172 333.043 109.663 333.028C109.149 333.044 108.639 332.936 108.176 332.714C107.712 332.491 107.307 332.161 106.996 331.75C106.26 330.73 105.904 329.482 105.992 328.225C105.907 326.968 106.263 325.721 106.996 324.7C107.33 324.289 107.751 323.96 108.228 323.735C108.705 323.511 109.227 323.397 109.754 323.403C110.262 323.383 110.768 323.492 111.224 323.718C111.68 323.945 112.072 324.282 112.366 324.7C113.057 325.739 113.391 326.977 113.316 328.225C113.436 329.494 113.085 330.763 112.329 331.786Z" fill="url(#paint1_radial_17642_377913)"/>
</g>
</g>
</g>
</g>
</g>
</g>
</g>
</g>
<g id="Icon Text Label_4">
<text id="IconLabel_8" fill="black" xml:space="preserve" style="white-space: pre" font-family="Oracle Sans" font-size="16" letter-spacing="0em"><tspan x="70.0234" y="372.298">Azure SQL</tspan></text>
<text id="IconLabel_9" fill="black" xml:space="preserve" style="white-space: pre" font-family="Oracle Sans" font-size="16" letter-spacing="0em"><tspan x="74.2422" y="388.298">Database</tspan></text>
</g>
</g>
<g id="Table storage">
<g id="Table-3-Column">
<g id="Group 468">
<path id="Vector_23" d="M137.286 426.938H78.7145V485.509H137.286V426.938Z" fill="white"/>
<path id="Vector_24" d="M136.571 427.652V484.795H79.4286V427.652H136.571ZM138 426.224H78V486.224H138V426.224Z" fill="white"/>
<path id="Vector_25" d="M84.4862 479.739H95.3433V476.881H84.4862V479.739ZM102.572 479.739H113.429V476.881H102.572V479.739ZM120.658 479.739H131.515V476.881H120.658V479.739ZM84.4862 474.667H95.3433V471.81H84.4862V474.667ZM102.572 474.667H113.429V471.81H102.572V474.667ZM120.658 474.667H131.515V471.81H120.658V474.667ZM84.4862 469.61H95.3433V466.753H84.4862V469.61ZM102.572 469.61H113.429V466.753H102.572V469.61ZM120.658 469.61H131.515V466.753H120.658V469.61ZM84.4862 464.539H95.3433V461.681H84.4862V464.539ZM102.572 464.539H113.429V461.681H102.572V464.539ZM120.658 464.539H131.515V461.681H120.658V464.539ZM84.4862 459.481H95.3433V456.624H84.4862V459.481ZM102.572 459.481H113.429V456.624H102.572V459.481ZM120.658 459.481H131.515V456.624H120.658V459.481ZM84.4862 454.41H95.3433V451.553H84.4862V454.41ZM102.572 454.41H113.429V451.553H102.572V454.41ZM120.658 454.41H131.515V451.553H120.658V454.41ZM84.4862 449.353H95.3433V446.496H84.4862V449.353ZM102.572 449.353H113.429V446.496H102.572V449.353ZM120.658 449.353H131.515V446.496H120.658V449.353ZM84.4862 444.296H95.3433V441.439H84.4862V444.296ZM102.572 444.296H113.429V441.439H102.572V444.296ZM120.658 444.296H131.515V441.439H120.658V444.296ZM82.2862 439.224H97.5147V481.939H82.2862V439.224ZM100.358 439.224H115.6V481.939H100.4L100.358 439.224ZM118.443 439.224H133.715V481.939H118.486L118.443 439.224ZM82.2862 430.51H97.5147V436.339H82.2862V430.51ZM100.4 430.51H115.6V436.339H100.4V430.51ZM118.486 430.51H133.715V436.339H118.486V430.51ZM79.429 484.796H136.572V427.653H79.429V484.796Z" fill="#2D5967"/>
</g>
</g>
<g id="Icon Text Label_5">
<text id="IconLabel_10" fill="black" xml:space="preserve" style="white-space: pre" font-family="Oracle Sans" font-size="16" letter-spacing="0em"><tspan x="60.0078" y="504.04">Table storage</tspan></text>
<text id="IconLabel_11" fill="black" xml:space="preserve" style="white-space: pre" font-family="Oracle Sans" font-size="16" letter-spacing="0em"><tspan x="87.0312" y="520.04">Azure</tspan></text>
<text id="IconLabel_12" fill="black" xml:space="preserve" style="white-space: pre" font-family="Oracle Sans" font-size="16" letter-spacing="0em"><tspan x="61.4922" y="536.04">PostgresSQL</tspan></text>
<text id="IconLabel_13" fill="black" xml:space="preserve" style="white-space: pre" font-family="Oracle Sans" font-size="16" letter-spacing="0em"><tspan x="53.7266" y="552.04">Azure MariaDB</tspan></text>
</g>
</g>
<g id="Azure Cosmos DB">
<g id="Azure-Cosmos-DB">
<g id="Group_2">
<g id="group1050-1">
<g id="group1051-2">
<g id="group1052-3">
<g id="group1053-4">
<g id="group1054-5">
<g id="shape1055-6">
<path id="Vector_26" fill-rule="evenodd" clip-rule="evenodd" d="M86.664 608.158C86.5823 608.158 86.5012 608.143 86.4255 608.112C86.3499 608.081 86.2812 608.036 86.2233 607.979C86.1655 607.921 86.1197 607.853 86.0887 607.778C86.0576 607.703 86.0419 607.623 86.0424 607.542C86.0398 605.68 85.2924 603.895 83.9638 602.578C82.6353 601.262 80.8341 600.52 78.9549 600.517C78.7907 600.517 78.6331 600.453 78.5167 600.338C78.4002 600.223 78.3343 600.067 78.3333 599.905C78.3333 599.824 78.3493 599.744 78.3805 599.669C78.4117 599.594 78.4575 599.526 78.5152 599.469C78.573 599.412 78.6415 599.367 78.717 599.336C78.7924 599.305 78.8733 599.289 78.9549 599.289C80.8358 599.284 82.6378 598.539 83.9654 597.219C85.2929 595.899 86.0375 594.111 86.0358 592.247C86.0352 592.166 86.0509 592.086 86.082 592.011C86.113 591.936 86.1588 591.868 86.2166 591.811C86.2745 591.753 86.3432 591.708 86.4188 591.677C86.4945 591.646 86.5756 591.631 86.6573 591.631C86.7391 591.631 86.8202 591.646 86.8958 591.677C86.9715 591.708 87.0402 591.753 87.0981 591.811C87.1559 591.868 87.2016 591.936 87.2327 592.011C87.2637 592.086 87.2795 592.166 87.2789 592.247C87.2803 594.108 88.0259 595.893 89.3523 597.21C90.6787 598.528 92.4779 599.271 94.3562 599.277C94.438 599.277 94.519 599.292 94.5947 599.323C94.6703 599.354 94.7391 599.399 94.7969 599.456C94.8547 599.514 94.9005 599.582 94.9315 599.657C94.9626 599.732 94.9783 599.812 94.9778 599.893C94.9783 599.974 94.9626 600.054 94.9315 600.129C94.9005 600.204 94.8547 600.272 94.7969 600.33C94.7391 600.387 94.6703 600.432 94.5947 600.463C94.519 600.494 94.438 600.509 94.3562 600.509C92.4786 600.513 90.6793 601.254 89.3522 602.57C88.025 603.886 87.2782 605.669 87.2753 607.53C87.2745 607.693 87.2088 607.849 87.0924 607.964C86.976 608.08 86.8183 608.145 86.6537 608.145L86.664 608.158Z" fill="#50E6FF"/>
</g>
</g>
<g id="group1056-8">
<g id="shape1057-9">
<path id="Vector_27" fill-rule="evenodd" clip-rule="evenodd" d="M131.33 650.781C131.198 650.781 131.072 650.729 130.978 650.636C130.885 650.544 130.833 650.418 130.833 650.288C130.834 649.548 130.688 648.814 130.403 648.13C130.118 647.446 129.7 646.824 129.172 646.301C128.644 645.777 128.017 645.362 127.326 645.079C126.636 644.795 125.896 644.65 125.149 644.651C125.018 644.651 124.892 644.599 124.799 644.508C124.706 644.416 124.653 644.292 124.652 644.162C124.652 644.031 124.704 643.906 124.797 643.813C124.891 643.721 125.017 643.669 125.149 643.669C126.654 643.672 128.098 643.084 129.165 642.032C130.232 640.981 130.833 639.553 130.838 638.062C130.838 637.932 130.89 637.806 130.983 637.714C131.077 637.621 131.203 637.569 131.335 637.569C131.467 637.569 131.594 637.621 131.687 637.714C131.78 637.806 131.833 637.932 131.833 638.062C131.833 639.551 132.43 640.978 133.491 642.032C134.552 643.086 135.992 643.679 137.494 643.683C137.56 643.682 137.626 643.693 137.687 643.718C137.749 643.742 137.805 643.778 137.852 643.824C137.899 643.87 137.936 643.925 137.962 643.985C137.988 644.045 138.001 644.11 138.001 644.176C138.001 644.241 137.988 644.306 137.962 644.367C137.936 644.427 137.899 644.482 137.852 644.528C137.805 644.573 137.749 644.61 137.687 644.634C137.626 644.658 137.56 644.67 137.494 644.669C135.99 644.671 134.549 645.263 133.486 646.317C132.422 647.37 131.824 648.798 131.823 650.288C131.821 650.418 131.769 650.543 131.675 650.634C131.582 650.726 131.456 650.777 131.325 650.777L131.33 650.781Z" fill="#50E6FF"/>
</g>
</g>
<g id="group1058-11">
<g id="group1059-12">
<g id="shape1060-13">
<path id="Vector_28" d="M107.938 642.607C119.918 642.607 129.63 632.985 129.63 621.116C129.63 609.246 119.918 599.624 107.938 599.624C95.9573 599.624 86.2454 609.246 86.2454 621.116C86.2454 632.985 95.9573 642.607 107.938 642.607Z" fill="url(#paint2_radial_17642_377913)"/>
</g>
</g>
<g id="group1061-17">
<g id="shape1062-18">
<path id="Vector_29" fill-rule="evenodd" clip-rule="evenodd" d="M96.7199 635.525C104.616 635.746 104.633 623.911 96.7199 624.081C96.7539 623.911 96.7539 623.758 96.7539 623.588C96.7199 620.413 94.1049 617.849 90.8956 617.883H86.5656C85.2751 623.554 87.4146 630.771 91.8465 635.525H96.7199Z" fill="#F2F2F2"/>
</g>
</g>
<g id="group1063-20">
<g id="shape1064-21">
<path id="Vector_30" fill-rule="evenodd" clip-rule="evenodd" d="M129.304 617.158C129.304 617.107 129.304 617.056 129.287 617.005C128.59 613.264 126.876 609.783 124.329 606.936C123.993 606.8 123.647 606.692 123.293 606.613C122.366 606.354 121.392 606.307 120.443 606.474C119.495 606.641 118.598 607.02 117.818 607.58C117.039 608.141 116.397 608.869 115.943 609.71C115.488 610.552 115.232 611.484 115.193 612.438C114.957 612.409 114.719 612.392 114.48 612.387C113.032 612.383 111.63 612.887 110.521 613.81C109.413 614.733 108.67 616.014 108.424 617.428C108.177 618.841 108.444 620.296 109.177 621.533C109.909 622.77 111.06 623.711 112.425 624.188C113.031 624.426 113.676 624.547 114.327 624.545H121.493C124.372 622.385 126.992 619.907 129.304 617.158Z" fill="#F2F2F2"/>
</g>
</g>
</g>
<g id="group1065-23">
<g id="shape1066-24">
<path id="Vector_31" fill-rule="evenodd" clip-rule="evenodd" d="M136.897 603.129C134.673 599.479 129.494 598.052 122.243 599.122C119.757 599.47 117.299 599.998 114.89 600.701C116.803 601.354 118.619 602.256 120.29 603.384C121.139 603.197 121.988 602.977 122.803 602.858C124.09 602.655 125.389 602.548 126.692 602.535C127.97 602.352 129.273 602.489 130.483 602.934C131.694 603.379 132.772 604.118 133.62 605.082C134.961 607.307 133.824 611.127 130.479 615.559C125.844 621.278 120.164 626.082 113.736 629.721C107.443 633.613 100.467 636.297 93.1725 637.634C87.6538 638.449 83.6974 637.634 82.3559 635.409C80.9975 633.202 82.1352 629.364 85.4803 624.949C85.9049 624.406 85.9898 624.117 86.4652 623.574C86.2418 621.677 86.2703 619.758 86.5501 617.868C85.0503 619.361 83.6707 620.968 82.4239 622.674C78.0599 628.464 76.8712 633.677 79.0957 637.328C80.2638 638.88 81.8226 640.102 83.6164 640.871C85.4102 641.64 87.3761 641.929 89.3179 641.709C90.7965 641.699 92.2722 641.58 93.7328 641.352C101.518 639.947 108.967 637.101 115.689 632.964C122.552 629.073 128.612 623.935 133.552 617.817C137.933 612.01 139.122 606.797 136.897 603.129Z" fill="#50E6FF"/>
</g>
</g>
</g>
</g>
</g>
</g>
</g>
</g>
<g id="Icon Text Label_6">
<text id="IconLabel_14" fill="black" xml:space="preserve" style="white-space: pre" font-family="Oracle Sans" font-size="16" letter-spacing="0em"><tspan x="87.0312" y="667.781">Azure</tspan></text>
<text id="IconLabel_15" fill="black" xml:space="preserve" style="white-space: pre" font-family="Oracle Sans" font-size="16" letter-spacing="0em"><tspan x="66.3672" y="683.781">Cosmos DB</tspan></text>
</g>
</g>
<g id="Object Storage">
<g id="Services/Object-Storage">
<g id="Group_3">
<g id="Group_4">
<g id="Group_5">
<path id="Vector_32" d="M81.8497 780.992C80.1395 780.992 78.7143 779.563 78.7143 777.849V725.563C78.7143 723.849 80.1395 722.42 81.8497 722.42H134.154C135.864 722.42 137.289 723.849 137.289 725.563V777.992C137.289 779.706 135.864 781.135 134.154 781.135L81.8497 780.992Z" fill="white"/>
<path id="Vector_33" d="M134.01 723.135C135.292 723.135 136.432 724.277 136.432 725.563V777.992C136.432 779.277 135.292 780.42 134.01 780.42H81.848C80.5653 780.277 79.4252 779.135 79.4252 777.849V725.563C79.4252 724.277 80.5653 723.135 81.848 723.135H134.01ZM134.01 721.706H81.848C79.7102 721.706 78 723.42 78 725.563V777.992C78 779.992 79.7102 781.706 81.848 781.706H134.152C136.29 781.706 138 779.992 138 777.849V725.563C137.857 723.42 136.147 721.706 134.01 721.706Z" fill="white"/>
</g>
<g id="Group_6">
<g id="Group_7">
<path id="Vector_34" d="M121.325 738.278L125.173 744.992L121.325 751.706H113.629L109.781 744.992L113.629 738.278H121.325ZM122.608 736.278H112.346L107.216 745.135L112.346 753.992H122.608L127.738 745.135L122.608 736.278Z" fill="#2D5967"/>
</g>
<g id="Group_8">
<path id="Vector_35" d="M107.5 758.706C111.205 758.706 114.198 761.706 114.198 765.42C114.198 769.135 111.205 772.135 107.5 772.135C103.794 772.135 100.801 769.135 100.801 765.42C100.801 761.706 103.794 758.706 107.5 758.706ZM107.5 756.706C102.654 756.706 98.6635 760.706 98.6635 765.563C98.6635 770.42 102.654 774.42 107.5 774.42C112.345 774.42 116.336 770.42 116.336 765.563C116.336 760.563 112.345 756.706 107.5 756.706Z" fill="#2D5967"/>
</g>
<g id="Group_9">
<path id="Vector_36" d="M97.3817 739.992L103.652 751.278H91.2534L97.3817 739.992ZM97.3817 735.707L87.6905 753.421H107.215L97.3817 735.707Z" fill="#2D5967"/>
</g>
</g>
<g id="Group_10">
<path id="Vector_37" d="M134.01 780.278H81.8485C80.5658 780.278 79.4257 779.135 79.4257 777.85V728.85H136.433V777.85C136.433 779.135 135.293 780.278 134.01 780.278ZM81.5634 730.992V777.992C81.5634 778.135 81.7059 778.278 81.8485 778.278H134.153C134.295 778.278 134.438 778.135 134.438 777.992V730.992H81.5634Z" fill="#2D5967"/>
</g>
<g id="Group_11">
<path id="Vector_38" d="M136.433 727.278H79.4257V725.564C79.4257 724.278 80.5658 723.135 81.8485 723.135H134.153C135.293 723.135 136.433 724.278 136.433 725.564V727.278Z" fill="#2D5967"/>
</g>
</g>
</g>
</g>
<g id="Icon Text Label_7">
<text id="IconLabel_16" fill="black" xml:space="preserve" style="white-space: pre" font-family="Oracle Sans" font-size="16" letter-spacing="0em"><tspan x="69.3672" y="799.522">OCI Object</tspan></text>
<text id="IconLabel_17" fill="black" xml:space="preserve" style="white-space: pre" font-family="Oracle Sans" font-size="16" letter-spacing="0em"><tspan x="80.1875" y="815.522">Storage</tspan></text>
</g>
</g>
<g id="Azure Blob Storage">
<g id="Azure-Blob-Storage">
<g id="Group 900">
<path id="Vector_39" d="M121.447 1004.52H94.5529C93.4426 1004.52 92.4178 1005.11 91.8666 1006.07L78.4194 1029.37C77.8681 1030.33 77.8681 1031.51 78.4194 1032.47L91.8666 1055.76C92.4178 1056.73 93.4504 1057.32 94.5529 1057.32H121.447C122.558 1057.32 123.582 1056.73 124.134 1055.76L137.581 1032.47C138.132 1031.51 138.132 1030.33 137.581 1029.37L124.134 1006.07C123.582 1005.11 122.558 1004.52 121.447 1004.52Z" fill="#2979FF"/>
<path id="Vector_40" d="M120.422 1048H95.5776C94.7235 1048 94.0248 1047.3 94.0248 1046.45V1015.39C94.0248 1014.54 94.7235 1013.84 95.5776 1013.84H115.764L121.975 1020.05V1046.45C121.975 1047.3 121.276 1048 120.422 1048Z" fill="white"/>
<path id="Vector_41" d="M115.764 1013.84V1018.5C115.764 1019.35 116.463 1020.05 117.317 1020.05H121.975L115.764 1013.84Z" fill="#B1CFFF"/>
<path id="Vector_42" d="M105.306 1030.66H103.233V1024.06L101.199 1024.65V1023.09L105.12 1021.73H105.306V1030.66ZM115.298 1027.01C115.298 1027.65 115.22 1028.21 115.073 1028.68C114.925 1029.16 114.708 1029.55 114.436 1029.86C114.165 1030.17 113.838 1030.4 113.458 1030.55C113.078 1030.69 112.658 1030.77 112.2 1030.77C111.742 1030.77 111.315 1030.69 110.935 1030.55C110.554 1030.4 110.228 1030.17 109.949 1029.86C109.677 1029.55 109.46 1029.15 109.304 1028.68C109.149 1028.21 109.079 1027.65 109.079 1027.01V1025.38C109.079 1024.73 109.157 1024.17 109.304 1023.7C109.452 1023.23 109.669 1022.83 109.941 1022.52C110.213 1022.21 110.539 1021.98 110.919 1021.83C111.3 1021.67 111.719 1021.6 112.177 1021.6C112.635 1021.6 113.054 1021.68 113.435 1021.83C113.815 1021.98 114.149 1022.21 114.421 1022.52C114.693 1022.83 114.91 1023.23 115.057 1023.7C115.205 1024.17 115.29 1024.73 115.29 1025.38V1027.01H115.298ZM113.233 1025.11C113.233 1024.76 113.21 1024.46 113.163 1024.21C113.116 1023.97 113.047 1023.77 112.953 1023.62C112.86 1023.47 112.752 1023.37 112.627 1023.3C112.503 1023.23 112.356 1023.19 112.193 1023.19C112.029 1023.19 111.882 1023.23 111.75 1023.3C111.618 1023.37 111.509 1023.47 111.424 1023.62C111.338 1023.77 111.269 1023.97 111.222 1024.21C111.175 1024.46 111.152 1024.76 111.152 1025.11V1027.26C111.152 1027.63 111.175 1027.93 111.222 1028.18C111.269 1028.43 111.338 1028.62 111.432 1028.77C111.525 1028.92 111.634 1029.03 111.765 1029.1C111.897 1029.17 112.045 1029.2 112.208 1029.2C112.371 1029.2 112.511 1029.17 112.643 1029.1C112.775 1029.03 112.884 1028.92 112.969 1028.77C113.062 1028.62 113.124 1028.42 113.171 1028.18C113.217 1027.93 113.241 1027.63 113.241 1027.26V1025.11H113.233ZM106.929 1039.57C106.929 1040.21 106.851 1040.77 106.703 1041.25C106.556 1041.72 106.338 1042.11 106.067 1042.42C105.795 1042.73 105.469 1042.96 105.088 1043.11C104.708 1043.26 104.289 1043.33 103.831 1043.33C103.373 1043.33 102.946 1043.26 102.565 1043.11C102.185 1042.96 101.859 1042.73 101.579 1042.42C101.307 1042.11 101.09 1041.71 100.935 1041.25C100.779 1040.77 100.71 1040.21 100.71 1039.57V1037.94C100.71 1037.29 100.787 1036.74 100.935 1036.26C101.082 1035.79 101.3 1035.39 101.571 1035.08C101.843 1034.77 102.169 1034.54 102.55 1034.39C102.93 1034.24 103.349 1034.17 103.815 1034.17C104.281 1034.17 104.693 1034.24 105.073 1034.39C105.453 1034.54 105.787 1034.77 106.059 1035.08C106.331 1035.39 106.548 1035.79 106.696 1036.26C106.843 1036.74 106.929 1037.29 106.929 1037.94V1039.57ZM104.863 1037.67C104.863 1037.32 104.84 1037.02 104.793 1036.77C104.747 1036.53 104.677 1036.33 104.584 1036.18C104.491 1036.04 104.382 1035.93 104.258 1035.86C104.134 1035.79 103.986 1035.76 103.823 1035.76C103.66 1035.76 103.512 1035.79 103.38 1035.86C103.248 1035.93 103.14 1036.03 103.054 1036.18C102.969 1036.33 102.899 1036.53 102.852 1036.77C102.806 1037.02 102.783 1037.32 102.783 1037.67V1039.83C102.783 1040.19 102.806 1040.49 102.852 1040.74C102.899 1040.99 102.969 1041.18 103.062 1041.33C103.155 1041.48 103.264 1041.59 103.396 1041.66C103.528 1041.73 103.675 1041.76 103.838 1041.76C104.002 1041.76 104.141 1041.73 104.273 1041.66C104.405 1041.59 104.514 1041.49 104.599 1041.33C104.693 1041.18 104.755 1040.98 104.801 1040.74C104.848 1040.49 104.871 1040.19 104.871 1039.83V1037.67H104.863ZM113.683 1043.22H111.61V1036.62L109.576 1037.22V1035.65L113.497 1034.29H113.683V1043.22Z" fill="#03A9F4"/>
</g>
</g>
<g id="Icon Text Label_8">
<text id="IconLabel_18" fill="black" xml:space="preserve" style="white-space: pre" font-family="Oracle Sans" font-size="16" letter-spacing="0em"><tspan x="87.0312" y="1079">Azure</tspan></text>
<text id="IconLabel_19" fill="black" xml:space="preserve" style="white-space: pre" font-family="Oracle Sans" font-size="16" letter-spacing="0em"><tspan x="62.0078" y="1095">Blob Storage</tspan></text>
</g>
</g>
<g id="Azure Data Factory">
<g id="Data-Factory">
<g id="Group 1508">
<path id="Vector_43" d="M387 180.411V166.612C387.001 166.513 386.973 166.416 386.919 166.333C386.865 166.251 386.787 166.186 386.696 166.148C386.605 166.11 386.504 166.101 386.407 166.12C386.311 166.14 386.222 166.188 386.153 166.259L372.035 180.376L357.353 195.058V205.188H399.988C400.253 205.192 400.517 205.144 400.763 205.044C401.01 204.945 401.233 204.797 401.421 204.609C401.609 204.421 401.757 204.198 401.856 203.951C401.956 203.705 402.004 203.441 402 203.176V166.612C402.001 166.513 401.973 166.416 401.919 166.333C401.865 166.251 401.787 166.186 401.696 166.148C401.605 166.11 401.504 166.101 401.407 166.12C401.31 166.14 401.222 166.188 401.153 166.259L387 180.411Z" fill="#005BA1"/>
<path id="Vector_44" d="M357 156.059C348.706 156.059 342 153.624 342 150.482V203.176C341.996 203.441 342.044 203.705 342.144 203.951C342.243 204.198 342.391 204.421 342.579 204.609C342.767 204.797 342.99 204.945 343.237 205.044C343.483 205.144 343.747 205.192 344.012 205.188H372V150.482C372 153.624 365.294 156.059 357 156.059Z" fill="url(#paint3_linear_17642_377913)"/>
<path id="Vector_45" d="M392.823 189.2H386.788C386.242 189.2 385.8 189.642 385.8 190.188V196.223C385.8 196.769 386.242 197.211 386.788 197.211H392.823C393.369 197.211 393.812 196.769 393.812 196.223V190.188C393.812 189.642 393.369 189.2 392.823 189.2Z" fill="white"/>
<path id="Vector_46" d="M378.918 189.2H372.883C372.337 189.2 371.895 189.642 371.895 190.188V196.223C371.895 196.769 372.337 197.211 372.883 197.211H378.918C379.464 197.211 379.906 196.769 379.906 196.223V190.188C379.906 189.642 379.464 189.2 378.918 189.2Z" fill="white"/>
<path id="Vector_47" d="M365.011 189.2H358.976C358.43 189.2 357.987 189.642 357.987 190.188V196.223C357.987 196.769 358.43 197.211 358.976 197.211H365.011C365.557 197.211 365.999 196.769 365.999 196.223V190.188C365.999 189.642 365.557 189.2 365.011 189.2Z" fill="white"/>
<path id="Vector_48" d="M372 150.483C372 153.483 365.294 155.918 357 155.918C348.706 155.918 342 153.624 342 150.483C342 147.341 348.706 145.188 357 145.188C365.294 145.188 372 147.624 372 150.483Z" fill="#EAEAEA"/>
<path id="Vector_49" d="M368.47 150.165C368.47 152.106 363.317 153.694 356.964 153.694C350.612 153.694 345.459 152.176 345.459 150.165C345.459 148.153 350.823 146.741 357 146.741C363.176 146.741 368.47 148.259 368.47 150.165Z" fill="#50E6FF"/>
<path id="Vector_50" d="M357 150.977C353.914 150.916 350.838 151.357 347.894 152.283C350.83 153.248 353.91 153.702 357 153.624C360.089 153.702 363.169 153.248 366.105 152.283C363.161 151.357 360.086 150.916 357 150.977Z" fill="#198AB3"/>
</g>
</g>
<g id="Icon Text Label_9">
<text id="IconLabel_20" fill="black" xml:space="preserve" style="white-space: pre" font-family="Oracle Sans" font-size="16" letter-spacing="0em"><tspan x="351.031" y="223.004">Azure</tspan></text>
<text id="IconLabel_21" fill="black" xml:space="preserve" style="white-space: pre" font-family="Oracle Sans" font-size="16" letter-spacing="0em"><tspan x="326.164" y="239.004">Data Factory</tspan></text>
</g>
</g>
<g id="Oracle Database@Azure">
<g id="Oracle-Database@Azure">
<g id="Group_12">
<path id="Vector_51" d="M381.37 475.952C370.132 475.952 361.022 473.976 361.022 471.54V481.811C361.022 484.248 370.132 486.223 381.37 486.223C392.607 486.223 401.717 484.248 401.717 481.811V471.54C401.717 473.976 392.607 475.952 381.37 475.952ZM398.49 478.043C396.953 478.574 395.36 478.993 393.759 479.288C391.851 479.637 389.898 479.816 387.953 479.816C387.485 479.816 387.103 479.438 387.103 478.97C387.103 478.501 387.482 478.123 387.953 478.123C389.796 478.123 391.645 477.954 393.454 477.622C394.971 477.343 396.478 476.948 397.936 476.443C398.381 476.29 398.862 476.523 399.018 476.968C399.171 477.409 398.938 477.894 398.494 478.047L398.49 478.043ZM381.37 462.742C370.132 462.742 361.022 460.767 361.022 458.33V469.146C361.022 471.583 370.132 473.555 381.37 473.555C392.607 473.555 401.717 471.58 401.717 469.143V458.327C401.717 460.763 392.607 462.739 381.37 462.739V462.742ZM398.49 465.192C396.95 465.723 395.36 466.142 393.759 466.437C391.851 466.786 389.895 466.965 387.953 466.965C387.485 466.965 387.103 466.586 387.103 466.118C387.103 465.65 387.482 465.272 387.953 465.272C389.796 465.272 391.645 465.102 393.454 464.77C394.971 464.492 396.478 464.097 397.936 463.592C398.381 463.439 398.862 463.672 399.018 464.116C399.174 464.561 398.938 465.043 398.494 465.195L398.49 465.192ZM381.37 441.671C370.132 441.671 361.022 443.623 361.022 446.853V455.94C361.022 458.376 370.132 460.348 381.37 460.348C392.607 460.348 401.717 458.373 401.717 455.936V447.182C401.717 443.62 392.607 441.671 381.37 441.671ZM398.49 452.709C396.95 453.241 395.36 453.659 393.759 453.954C391.851 454.303 389.898 454.482 387.953 454.482C387.485 454.482 387.103 454.104 387.103 453.636C387.103 453.168 387.482 452.789 387.953 452.789C389.796 452.789 391.645 452.62 393.454 452.288C394.968 452.009 396.478 451.614 397.936 451.109C398.381 450.956 398.862 451.189 399.018 451.634C399.171 452.075 398.938 452.56 398.494 452.713L398.49 452.709ZM381.37 449.705C371.247 449.705 363.044 447.862 363.044 446.77C363.044 445.429 371.247 443.357 381.37 443.357C391.492 443.357 399.695 445.512 399.695 446.77C399.695 447.912 391.492 449.705 381.37 449.705Z" fill="url(#paint4_linear_17642_377913)"/>
<path id="Vector_52" d="M361.022 446.767V446.611C361.022 443.6 368.95 441.701 379.139 441.459C377.967 438.829 375.514 436.881 372.512 436.482C372.257 430.616 367.337 426.048 361.471 426.23C356.803 426.147 352.59 429.019 350.963 433.395C345.98 433.996 342.185 438.152 342.039 443.168C342.262 448.839 347.029 453.257 352.699 453.055C353.015 453.055 353.337 453.042 353.636 453.015H361.019L361.022 446.767Z" fill="url(#paint5_linear_17642_377913)"/>
</g>
</g>
<g id="Icon Text Label_10">
<text id="IconLabel_22" fill="black" xml:space="preserve" style="white-space: pre" font-family="Oracle Sans" font-size="16" letter-spacing="0em"><tspan x="313.219" y="504.04">Oracle Database</tspan></text>
<text id="IconLabel_23" fill="black" xml:space="preserve" style="white-space: pre" font-family="Oracle Sans" font-size="16" letter-spacing="0em"><tspan x="343.016" y="520.04">@Azure</tspan></text>
</g>
</g>
<g id="Azure Data Lake Storage">
<g id="azure-data-lake-storage-gen2">
<g id="Group 1511">
<path id="Vector_53" d="M350.333 730.13V757.332C351.993 759.121 354.238 760.195 356.841 760.195C359.444 760.195 362.893 758.405 364.552 755.77C366.212 758.405 369.043 760.195 372.362 760.195V781.54V737.841C360.42 737.776 350.854 734.425 350.333 730.13Z" fill="#3E3E3E"/>
<path id="Vector_54" d="M372.751 737.841C372.621 737.841 372.523 737.841 372.393 737.841V781.54V781.67H372.621V760.195C375.94 760.065 378.771 758.405 380.333 755.77C381.992 758.405 384.953 760.195 388.272 760.195C391.591 760.195 393.38 758.991 395.04 757.201V773.536C395.04 777.798 385.604 781.41 373.825 781.637C385.669 781.442 395.137 777.831 395.137 773.536V730.13C394.649 734.457 384.888 737.841 372.751 737.841Z" fill="#A0A1A2"/>
<path id="Vector_55" d="M364.552 755.77C362.893 758.406 360.16 760.195 356.841 760.195C353.522 760.195 351.993 759.121 350.333 757.332V773.568C350.333 777.993 360.16 781.573 372.394 781.67V760.195C369.075 760.195 366.244 758.406 364.585 755.77H364.552Z" fill="#3999C6"/>
<path id="Vector_56" d="M395.04 773.568V757.234C393.38 759.024 391.005 760.227 388.272 760.227C385.539 760.227 381.992 758.438 380.333 755.802C378.803 758.438 375.94 760.097 372.621 760.227V781.702C373.012 781.702 373.435 781.702 373.825 781.702C385.604 781.475 395.04 777.863 395.04 773.601V773.568Z" fill="#59B4D9"/>
<path id="Vector_57" d="M372.394 737.841C372.524 737.841 372.622 737.841 372.752 737.841C384.889 737.841 394.65 734.458 395.138 730.13C395.138 730 395.138 729.902 395.138 729.772C395.138 725.379 385.051 721.703 372.719 721.703C360.388 721.703 350.333 725.379 350.333 729.772C350.333 734.165 350.333 730 350.333 730.13C350.821 734.425 360.388 737.776 372.362 737.841H372.394ZM372.752 723.948C373.045 723.948 373.37 723.948 373.663 723.948C374.281 723.948 374.867 723.948 375.453 724.013C375.746 724.013 376.038 724.013 376.331 724.045C377.503 724.11 378.609 724.208 379.683 724.371C380.756 724.533 380.203 724.436 380.464 724.468C382.546 724.761 384.401 725.184 385.93 725.672C388.793 726.616 390.55 727.885 390.55 729.284C390.55 730.683 389.249 731.659 386.873 732.603C386.873 732.603 386.808 732.603 386.776 732.603C383.522 733.839 378.446 734.653 372.752 734.653C367.058 734.653 361.982 733.839 358.728 732.603C358.728 732.603 358.663 732.603 358.631 732.603C357.915 732.31 357.264 731.952 356.711 731.627C355.67 730.976 355.084 730.293 354.954 729.544C354.954 729.479 354.954 729.382 354.954 729.317C354.954 726.356 362.893 723.98 372.719 723.98L372.752 723.948Z" fill="white"/>
<path id="Vector_58" d="M354.986 729.544C355.084 730.293 355.702 731.009 356.744 731.628C355.735 730.977 355.116 730.261 354.986 729.544Z" fill="#7FBA00"/>
<path id="Vector_59" d="M358.729 732.603C361.983 733.839 367.059 734.653 372.753 734.653C378.447 734.653 383.523 733.839 386.777 732.603C383.458 731.301 378.382 730.488 372.753 730.488C367.124 730.488 361.918 731.301 358.729 732.603Z" fill="#7FBA00"/>
<path id="Vector_60" d="M356.743 731.627C357.263 731.985 357.914 732.31 358.663 732.603C358.663 732.603 358.728 732.603 358.76 732.603C361.949 731.301 367.025 730.488 372.784 730.488C378.543 730.488 383.489 731.301 386.808 732.603C386.808 732.603 386.873 732.603 386.906 732.603C389.281 731.659 390.582 730.585 390.582 729.284C390.582 727.982 388.825 726.616 385.962 725.672C384.433 725.152 382.578 724.761 380.496 724.468C380.235 724.436 379.975 724.403 379.715 724.371C378.641 724.241 377.535 724.143 376.363 724.045C376.07 724.045 375.778 724.013 375.485 724.013C374.899 724.013 374.281 723.98 373.695 723.948C373.402 723.948 373.077 723.948 372.784 723.948C362.958 723.948 355.018 726.323 355.018 729.284C355.018 732.245 355.018 729.447 355.018 729.512C355.148 730.228 355.767 730.943 356.775 731.594L356.743 731.627Z" fill="#B8D432"/>
</g>
</g>
<g id="Icon Text Label_11">
<text id="IconLabel_24" fill="black" xml:space="preserve" style="white-space: pre" font-family="Oracle Sans" font-size="16" letter-spacing="0em"><tspan x="332.164" y="799.522">Azure Data</tspan></text>
<text id="IconLabel_25" fill="black" xml:space="preserve" style="white-space: pre" font-family="Oracle Sans" font-size="16" letter-spacing="0em"><tspan x="325.258" y="815.522">Lake Storage</tspan></text>
</g>
</g>
<g id="Power BI">
<g id="Azure-Power-BI">
<g id="Group_13">
<g id="group1076-1">
<g id="group1077-2">
<g id="shape1078-3">
<path id="Vector_61" fill-rule="evenodd" clip-rule="evenodd" d="M633.56 426.224V484.999H606.895V426.224H633.56Z" fill="url(#paint6_linear_17642_377913)"/>
</g>
<g id="shape1079-7">
<path id="Vector_62" fill-rule="evenodd" clip-rule="evenodd" d="M616.895 443.618V485.244H590.229V441.166H613.556C615.399 441.166 616.895 442.26 616.895 443.618Z" fill="black" fill-opacity="0.2"/>
</g>
<g id="shape1080-9">
<path id="Vector_63" fill-rule="evenodd" clip-rule="evenodd" d="M616.895 444.597V486.224H590.229V442.146H613.556C615.399 442.146 616.895 443.24 616.895 444.597Z" fill="black" fill-opacity="0.18"/>
</g>
<g id="shape1081-11">
<path id="Vector_64" fill-rule="evenodd" clip-rule="evenodd" d="M616.895 443.373V484.999H590.229V440.921H613.556C615.399 440.921 616.895 442.015 616.895 443.373Z" fill="url(#paint7_linear_17642_377913)"/>
</g>
<g id="shape1082-15">
<path id="Vector_65" fill-rule="evenodd" clip-rule="evenodd" d="M573.562 455.618V484.999H600.228V458.07C600.228 456.712 598.732 455.618 596.89 455.618H573.562Z" fill="url(#paint8_linear_17642_377913)"/>
</g>
</g>
</g>
</g>
</g>
<g id="Icon Text Label_12">
<text id="IconLabel_26" fill="black" xml:space="preserve" style="white-space: pre" font-family="Oracle Sans" font-size="16" letter-spacing="0em"><tspan x="572.078" y="504.04">Power BI</tspan></text>
</g>
</g>
<path id="Vector 57" d="M144 64H240V753.188H144" stroke="#312D2A" stroke-width="2"/>
<path id="Vector 58" d="M144 321.188H240" stroke="#312D2A" stroke-width="2"/>
<path id="Vector 65" d="M144 176.742H240" stroke="#312D2A" stroke-width="2"/>
<path id="Vector 60" d="M272.917 465.896C273.308 465.505 273.308 464.872 272.917 464.481L266.553 458.117C266.163 457.727 265.529 457.727 265.139 458.117C264.748 458.508 264.748 459.141 265.139 459.532L270.796 465.188L265.139 470.845C264.748 471.236 264.748 471.869 265.139 472.26C265.529 472.65 266.163 472.65 266.553 472.26L272.917 465.896ZM144 466.188H272.21V464.188H144V466.188Z" fill="#312D2A"/>
<path id="Vector 63" d="M568.707 466.931C569.098 466.54 569.098 465.907 568.707 465.517L562.343 459.153C561.953 458.762 561.319 458.762 560.929 459.153C560.538 459.543 560.538 460.176 560.929 460.567L566.586 466.224L560.929 471.881C560.538 472.271 560.538 472.904 560.929 473.295C561.319 473.685 561.953 473.685 562.343 473.295L568.707 466.931ZM408 467.224L568 467.224L568 465.224L408 465.224L408 467.224Z" fill="#312D2A"/>
<path id="Vector 64" d="M372.707 525.731C372.317 525.341 371.683 525.341 371.293 525.731L364.929 532.095C364.538 532.486 364.538 533.119 364.929 533.51C365.319 533.9 365.953 533.9 366.343 533.51L372 527.853L377.657 533.51C378.047 533.9 378.681 533.9 379.071 533.51C379.462 533.119 379.462 532.486 379.071 532.095L372.707 525.731ZM373 721.188L373 526.438L371 526.438L371 721.188L373 721.188Z" fill="#312D2A"/>
<path id="Vector 61" d="M272.707 1031.9C273.098 1031.51 273.098 1030.87 272.707 1030.48L266.343 1024.12C265.953 1023.73 265.319 1023.73 264.929 1024.12C264.538 1024.51 264.538 1025.14 264.929 1025.53L270.586 1031.19L264.929 1036.85C264.538 1037.24 264.538 1037.87 264.929 1038.26C265.319 1038.65 265.953 1038.65 266.343 1038.26L272.707 1031.9ZM144 1032.19H272V1030.19H144V1032.19Z" fill="#312D2A"/>
<path id="Vector 62" d="M272.707 881.896C273.098 881.505 273.098 880.872 272.707 880.481L266.343 874.117C265.953 873.727 265.319 873.727 264.929 874.117C264.538 874.508 264.538 875.141 264.929 875.532L270.586 881.188L264.929 886.845C264.538 887.236 264.538 887.869 264.929 888.26C265.319 888.65 265.953 888.65 266.343 888.26L272.707 881.896ZM144 882.188H272V880.188H144V882.188Z" fill="#312D2A"/>
<path id="Vector 59" d="M144 617.882H240" stroke="#312D2A" stroke-width="2"/>
</g>
</g>
<defs>
<linearGradient id="paint0_linear_17642_377913" x1="86.3333" y1="302.667" x2="131.318" y2="302.667" gradientUnits="userSpaceOnUse">
<stop stop-color="#005BA1"/>
<stop offset="0.07" stop-color="#0060A9"/>
<stop offset="0.36" stop-color="#0071C8"/>
<stop offset="0.52" stop-color="#0078D4"/>
<stop offset="0.64" stop-color="#0074CD"/>
<stop offset="0.82" stop-color="#006ABB"/>
<stop offset="1" stop-color="#005BA1"/>
</linearGradient>
<radialGradient id="paint1_radial_17642_377913" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(109.963 330.01) scale(26.3071 13.4724)">
<stop stop-color="#F2F2F2"/>
<stop offset="0.58" stop-color="#EEEEEE"/>
<stop offset="1" stop-color="#E6E6E6"/>
</radialGradient>
<radialGradient id="paint2_radial_17642_377913" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(86.2454 599.624) scale(60.7382 60.1766)">
<stop offset="0.185" stop-color="#5EA0EF"/>
<stop offset="1" stop-color="#0078D4"/>
</radialGradient>
<linearGradient id="paint3_linear_17642_377913" x1="342" y1="177.906" x2="372" y2="177.906" gradientUnits="userSpaceOnUse">
<stop stop-color="#005BA1"/>
<stop offset="0.07" stop-color="#0060A9"/>
<stop offset="0.36" stop-color="#0071C8"/>
<stop offset="0.52" stop-color="#0078D4"/>
<stop offset="0.64" stop-color="#0074CD"/>
<stop offset="0.81" stop-color="#006ABB"/>
<stop offset="0.99" stop-color="#005BA1"/>
</linearGradient>
<linearGradient id="paint4_linear_17642_377913" x1="361.022" y1="463.947" x2="401.717" y2="463.947" gradientUnits="userSpaceOnUse">
<stop stop-color="#C74634"/>
<stop offset="0.5" stop-color="#DB897D"/>
<stop offset="1" stop-color="#C74634"/>
</linearGradient>
<linearGradient id="paint5_linear_17642_377913" x1="360.587" y1="453.062" x2="360.587" y2="426.224" gradientUnits="userSpaceOnUse">
<stop stop-color="#32BEDD"/>
<stop offset="1" stop-color="#50E6FF"/>
</linearGradient>
<linearGradient id="paint6_linear_17642_377913" x1="597.485" y1="422.795" x2="619.263" y2="438.182" gradientUnits="userSpaceOnUse">
<stop stop-color="#E6AD10"/>
<stop offset="1" stop-color="#C87E0E"/>
</linearGradient>
<linearGradient id="paint7_linear_17642_377913" x1="570.012" y1="432.896" x2="590.21" y2="450.305" gradientUnits="userSpaceOnUse">
<stop stop-color="#F6D751"/>
<stop offset="1" stop-color="#E6AD10"/>
</linearGradient>
<linearGradient id="paint8_linear_17642_377913" x1="535.083" y1="433.671" x2="549.344" y2="456.203" gradientUnits="userSpaceOnUse">
<stop stop-color="#F9E589"/>
<stop offset="1" stop-color="#F6D751"/>
</linearGradient>
<clipPath id="clip0_17642_377913">
<rect width="712" height="1112" fill="white"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 56 KiB

View File

@@ -0,0 +1,7 @@
The diagram you downloaded is available in these formats:
- DRAWIO
- SVG
You can customize them for your organization using the associated tools:
- For DRAWIO format, use draw.io for Confluence, online at diagrams.net, or the desktop app. Go to diagrams.net for more information.
- For SVG format, use an SVG editor such as Inkscape or Sketsa SVG Editor, which are free and available for Windows, macOS, Linux.

View File

@@ -0,0 +1,156 @@
# Auto-extracted absolute_layout template from
# kb/diagram/assets/archcenter-refs/autonomous-database-db-at-azure-diagram-oracle/autonomous-database-db-at-azure-diagram.drawio
# Source: Oracle Architecture Center reference (canonical geometry).
# Use this as the starting scaffold for a new spec — copy, rename ids,
# and replace `type: TODO_identify` on services with the right OCI
# type alias (adb_s, drg, fastconnect, etc.). Container coords and
# edge waypoints are Oracle's canonical layout; preserve unless the
# customer's topology requires a change.
absolute_layout:
canvas:
width: 850
height: 1100
containers: []
services:
- id: s2
type: TODO_identify
label: ''
x: 1117
y: 177
w: 63
h: 63
- id: s1
type: TODO_identify
label: ''
x: 1117
y: 178
w: 62
h: 62
- id: s3
type: TODO_identify
label: ''
x: 1118
y: 185
w: 60
h: 54
- id: s11
type: TODO_identify
label: ''
x: 780
y: 186
w: 63
h: 55
- id: s10
type: TODO_identify
label: ''
x: 781
y: 186
w: 61
h: 53
- id: s12
type: TODO_identify
label: ''
x: 781
y: 187
w: 60
h: 52
- id: s19
type: TODO_identify
label: ''
x: 968
y: 197
w: 78
h: 31
- id: s20
type: TODO_identify
label: ''
x: 972
y: 197
w: 88
h: 43
- id: s8
type: TODO_identify
label: ''
x: 629
y: 198
w: 30
h: 42
- id: s7
type: TODO_identify
label: ''
x: 629
y: 199
w: 30
h: 41
- id: s9
type: TODO_identify
label: ''
x: 629
y: 199
w: 29
h: 40
- id: s4
type: TODO_identify
label: ''
x: 38
y: 293
w: 60
h: 43
- id: s17
type: TODO_identify
label: ''
x: 780
y: 465
w: 63
h: 55
- id: s16
type: TODO_identify
label: ''
x: 781
y: 466
w: 61
h: 53
- id: s18
type: TODO_identify
label: ''
x: 781
y: 467
w: 60
h: 52
- id: s6
type: TODO_identify
label: ''
x: 252
y: 478
w: 63
h: 63
- id: s13
type: TODO_identify
label: ''
x: 629
y: 478
w: 30
h: 41
- id: s14
type: TODO_identify
label: ''
x: 629
y: 478
w: 30
h: 42
- id: s15
type: TODO_identify
label: ''
x: 629
y: 478
w: 29
h: 40
- id: s5
type: TODO_identify
label: ''
x: 40
y: 483
w: 63
h: 42
labels: []
connections: []

View File

@@ -0,0 +1,790 @@
<mxfile host="app.diagrams.net" agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36" version="24.7.12">
<diagram name="autonomous-database-db-at-azure" id="autonomous-database-db-at-azure">
<mxGraphModel dx="792" dy="1097" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="850" pageHeight="1100" math="0" shadow="0">
<root>
<mxCell id="0" />
<mxCell id="1" parent="0" />
<UserObject label="" tags="Background" id="2">
<mxCell style="vsdxID=2;fillColor=#FFFFFF;gradientColor=none;shape=stencil(nZBLDoAgDERP0z3SIyjew0SURgSD+Lu9kMZoXLhwN9O+tukAlrNpJg1SzDH4QW/URgNYgZTkjA4UkwJUgGXng+6DX1zLfmoymdXo17xh5zmRJ6Q42BWCfc2oJfdAr+Yv+AP9Cb7OJ3H/2JG1HNGz/84klThPVCc=);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry width="1236" height="609" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="3">
<mxCell style="vsdxID=4;fillColor=#e4e1dd;gradientColor=none;shape=stencil(vVNdD4IgFP01POoQtopns//BEpVF4K6U9u/DYOZHrc023+7HgXPPhYNo2lS8FojgxoK5iFbmtkL0iAiRuhIgrYsQzRBNCwOiBHPTuc9r3iP76Gru/Q2dP4f7EwQ/fMZYTNmrcvJgDmfXhQAmMfFwCHgc7xJfmSMCIMGBoIt4J5sIjOVWGj0hVxxKETmqqFC8nLSaVoh6UQ7DKalHStg+PnzkXillGH2xmw3EzMmH6VaKWSxns2eZ/4i/3uTLUjaQ8cMnLng7rJBKeYOO+3NHupJ3M82e);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="1067" width="168" height="608" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="4">
<mxCell style="vsdxID=5;fillColor=none;gradientColor=none;shape=stencil(vVNdD4IgFP01POoQtopns//BEpVF4K6U9u/DYOZHrc023+7HgXPPhYNo2lS8FojgxoK5iFbmtkL0iAiRuhIgrYsQzRBNCwOiBHPTuc9r3iP76Gru/Q2dP4f7EwQ/fMZYTNmrcvJgDmfXhQAmMfFwCHgc7xJfmSMCIMGBoIt4J5sIjOVWGj0hVxxKETmqqFC8nLSaVoh6UQ7DKalHStg+PnzkXillGH2xmw3EzMmH6VaKWSxns2eZ/4i/3uTLUjaQ8cMnLng7rJBKeYOO+3NHupJ3M82e);strokeColor=#9e9892;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="1067" width="168" height="608" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="&lt;div style=&quot;font-size: 1px&quot;&gt;&lt;p style=&quot;text-align:left;margin-left:0;margin-right:0;margin-top:0px;margin-bottom:0px;text-indent:0;vertical-align:middle;direction:ltr;&quot;&gt;&lt;font style=&quot;font-size:16.93px;font-family:Oracle Sans;color:#312d2a;direction:ltr;letter-spacing:0px;line-height:120%;opacity:1&quot;&gt;&lt;b&gt;OCI Services&lt;br/&gt;&lt;/b&gt;&lt;/font&gt;&lt;/p&gt;&lt;/div&gt;" tags="Background" id="5">
<mxCell style="verticalAlign=middle;align=left;overflow=width;vsdxID=6;fillColor=none;gradientColor=none;shape=stencil(nZBLDoAgDERP0z3SIyjew0SURgSD+Lu9kMZoXLhwN9O+tukAlrNpJg1SzDH4QW/URgNYgZTkjA4UkwJUgGXng+6DX1zLfmoymdXo17xh5zmRJ6Q42BWCfc2oJfdAr+Yv+AP9Cb7OJ3H/2JG1HNGz/84klThPVCc=);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="1102" y="7" width="203" height="20" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="6">
<mxCell style="vsdxID=8;fillColor=#ecf3fb;gradientColor=none;shape=stencil(vVNBDoMgEHwNRxqUpIlna/9BKiopBbPSqr8vFLEqaQ9t4m2ZHZydxUE07xrWcpSSzoC+8l6UpkH0hNJUqIaDMLZCtEA0rzTwGvRdlf7cMsd01U0/3BcGf4+4GykZ/SnLDjR7IWdPZnCxXQjk0CUwBuSYeCSiTIyETBIDZoPoMGjDjNBqJS8Z1BxbMVxJVq9aXc95G8HTeFKohRc7fZhmI/6rm3n4aD872NmKz9P96ibez25PE/0W/73Lh8XsYeR7XmzxTlolpPRBXfa3ybSQTzUtng==);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry width="947" height="608" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="7">
<mxCell style="vsdxID=9;fillColor=none;gradientColor=none;shape=stencil(vVNBDoMgEHwNRxqUpIlna/9BKiopBbPSqr8vFLEqaQ9t4m2ZHZydxUE07xrWcpSSzoC+8l6UpkH0hNJUqIaDMLZCtEA0rzTwGvRdlf7cMsd01U0/3BcGf4+4GykZ/SnLDjR7IWdPZnCxXQjk0CUwBuSYeCSiTIyETBIDZoPoMGjDjNBqJS8Z1BxbMVxJVq9aXc95G8HTeFKohRc7fZhmI/6rm3n4aD872NmKz9P96ibez25PE/0W/73Lh8XsYeR7XmzxTlolpPRBXfa3ybSQTzUtng==);strokeColor=#0078d7;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry width="947" height="608" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="&lt;div style=&quot;font-size: 1px&quot;&gt;&lt;p style=&quot;text-align:left;margin-left:0;margin-right:0;margin-top:0px;margin-bottom:0px;text-indent:0;vertical-align:middle;direction:ltr;&quot;&gt;&lt;font style=&quot;font-size:16.93px;font-family:Oracle Sans;color:#312d2a;direction:ltr;letter-spacing:0px;line-height:120%;opacity:1&quot;&gt;&lt;b&gt;Azure Region&lt;br/&gt;&lt;/b&gt;&lt;/font&gt;&lt;/p&gt;&lt;/div&gt;" tags="Background" id="8">
<mxCell style="verticalAlign=middle;align=left;overflow=width;vsdxID=10;fillColor=none;gradientColor=none;shape=stencil(nZBLDoAgDERP0z3SIyjew0SURgSD+Lu9kMZoXLhwN9O+tukAlrNpJg1SzDH4QW/URgNYgZTkjA4UkwJUgGXng+6DX1zLfmoymdXo17xh5zmRJ6Q42BWCfc2oJfdAr+Yv+AP9Cb7OJ3H/2JG1HNGz/84klThPVCc=);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="8" y="7" width="203" height="20" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="9">
<mxCell style="vsdxID=12;fillColor=#FFFFFF;gradientColor=none;shape=stencil(nZBLDoAgDERP0z3SIyjew0SURgSD+Lu9kMZoXLhwN9O+tukAlrNpJg1SzDH4QW/URgNYgZTkjA4UkwJUgGXng+6DX1zLfmoymdXo17xh5zmRJ6Q42BWCfc2oJfdAr+Yv+AP9Cb7OJ3H/2JG1HNGz/84klThPVCc=);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="9" y="34" width="930" height="566" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="10">
<mxCell style="vsdxID=13;fillColor=none;gradientColor=none;shape=stencil(nZBLDoAgDERP0z3SIyjew0SURgSD+Lu9kMZoXLhwN9O+tukAlrNpJg1SzDH4QW/URgNYgZTkjA4UkwJUgGXng+6DX1zLfmoymdXo17xh5zmRJ6Q42BWCfc2oJfdAr+Yv+AP9Cb7OJ3H/2JG1HNGz/84klThPVCc=);dashed=1;dashPattern=1.00 2.00;strokeColor=#0078d7;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="9" y="34" width="930" height="566" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="&lt;div style=&quot;font-size: 1px&quot;&gt;&lt;p style=&quot;text-align:left;margin-left:0;margin-right:0;margin-top:0px;margin-bottom:0px;text-indent:0;vertical-align:middle;direction:ltr;&quot;&gt;&lt;font style=&quot;font-size:16.93px;font-family:Oracle Sans;color:#312d2a;direction:ltr;letter-spacing:0px;line-height:120%;opacity:1&quot;&gt;&lt;b&gt;Subscription&lt;br/&gt;&lt;/b&gt;&lt;/font&gt;&lt;/p&gt;&lt;/div&gt;" tags="Background" id="11">
<mxCell style="verticalAlign=middle;align=left;overflow=width;vsdxID=14;fillColor=none;gradientColor=none;shape=stencil(nZBLDoAgDERP0z3SIyjew0SURgSD+Lu9kMZoXLhwN9O+tukAlrNpJg1SzDH4QW/URgNYgZTkjA4UkwJUgGXng+6DX1zLfmoymdXo17xh5zmRJ6Q42BWCfc2oJfdAr+Yv+AP9Cb7OJ3H/2JG1HNGz/84klThPVCc=);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="16" y="41" width="203" height="20" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="12">
<mxCell style="vsdxID=16;fillColor=#dae8fc;gradientColor=none;shape=stencil(vVPREoIgEPwaHnUMdNJnq/9gEpWJxDko7e/DUFOpHmzGt+Nuj709WERSVdKaIRwoDfLCGp7pEpEDwphXJQOuTYTIEZE0l8AKkLcqs+eadsguusp7d0Nr+4KuAwcPe0piP4xfmZMFUzibKgxgP9xbPPQNOz/CNuNABkTQU7QebbnyQGqquaxm9IJCwTxD5uWCFrOSahirnXQ/nuDVREuS+BH5SL5WzTi8s58N5CzJx+nWqnH3s9nTON/iv3f5spgthPz2iwneTsu5ENao0/rSmSZlXU2OTw==);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="144" y="68" width="786" height="244" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="13">
<mxCell style="vsdxID=17;fillColor=none;gradientColor=none;shape=stencil(vVPREoIgEPwaHnUMdNJnq/9gEpWJxDko7e/DUFOpHmzGt+Nuj709WERSVdKaIRwoDfLCGp7pEpEDwphXJQOuTYTIEZE0l8AKkLcqs+eadsguusp7d0Nr+4KuAwcPe0piP4xfmZMFUzibKgxgP9xbPPQNOz/CNuNABkTQU7QebbnyQGqquaxm9IJCwTxD5uWCFrOSahirnXQ/nuDVREuS+BH5SL5WzTi8s58N5CzJx+nWqnH3s9nTON/iv3f5spgthPz2iwneTsu5ENao0/rSmSZlXU2OTw==);strokeColor=#0078d7;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="144" y="68" width="786" height="244" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="&lt;div style=&quot;font-size: 1px&quot;&gt;&lt;p style=&quot;text-align:left;margin-left:0;margin-right:0;margin-top:0px;margin-bottom:0px;text-indent:0;vertical-align:middle;direction:ltr;&quot;&gt;&lt;font style=&quot;font-size:16.93px;font-family:Oracle Sans;color:#312d2a;direction:ltr;letter-spacing:0px;line-height:120%;opacity:1&quot;&gt;&lt;b&gt;Availability Zone 1&lt;br/&gt;&lt;/b&gt;&lt;/font&gt;&lt;/p&gt;&lt;/div&gt;" tags="Background" id="14">
<mxCell style="verticalAlign=middle;align=left;overflow=width;vsdxID=18;fillColor=none;gradientColor=none;shape=stencil(nZBLDoAgDERP0z3SIyjew0SURgSD+Lu9kMZoXLhwN9O+tukAlrNpJg1SzDH4QW/URgNYgZTkjA4UkwJUgGXng+6DX1zLfmoymdXo17xh5zmRJ6Q42BWCfc2oJfdAr+Yv+AP9Cb7OJ3H/2JG1HNGz/84klThPVCc=);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="466" y="75" width="321" height="20" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="15">
<mxCell style="vsdxID=20;fillColor=#dae8fc;gradientColor=none;shape=stencil(vVPREoIgEPwaHnUMdNJnq/9gEpWJxDko7e/DUFOpHmzGt+Nuj709WERSVdKaIRwoDfLCGp7pEpEDwphXJQOuTYTIEZE0l8AKkLcqs+eadsguusp7d0Nr+4KuAwcPe0piP4xfmZMFUzibKgxgP9xbPPQNOz/CNuNABkTQU7QebbnyQGqquaxm9IJCwTxD5uWCFrOSahirnXQ/nuDVREuS+BH5SL5WzTi8s58N5CzJx+nWqnH3s9nTON/iv3f5spgthPz2iwneTsu5ENao0/rSmSZlXU2OTw==);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="144" y="347" width="786" height="244" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="16">
<mxCell style="vsdxID=21;fillColor=none;gradientColor=none;shape=stencil(vVPREoIgEPwaHnUMdNJnq/9gEpWJxDko7e/DUFOpHmzGt+Nuj709WERSVdKaIRwoDfLCGp7pEpEDwphXJQOuTYTIEZE0l8AKkLcqs+eadsguusp7d0Nr+4KuAwcPe0piP4xfmZMFUzibKgxgP9xbPPQNOz/CNuNABkTQU7QebbnyQGqquaxm9IJCwTxD5uWCFrOSahirnXQ/nuDVREuS+BH5SL5WzTi8s58N5CzJx+nWqnH3s9nTON/iv3f5spgthPz2iwneTsu5ENao0/rSmSZlXU2OTw==);strokeColor=#0078d7;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="144" y="347" width="786" height="244" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="&lt;div style=&quot;font-size: 1px&quot;&gt;&lt;p style=&quot;text-align:left;margin-left:0;margin-right:0;margin-top:0px;margin-bottom:0px;text-indent:0;vertical-align:middle;direction:ltr;&quot;&gt;&lt;font style=&quot;font-size:16.93px;font-family:Oracle Sans;color:#312d2a;direction:ltr;letter-spacing:0px;line-height:120%;opacity:1&quot;&gt;&lt;b&gt;Availability Zone 2&lt;br/&gt;&lt;/b&gt;&lt;/font&gt;&lt;/p&gt;&lt;/div&gt;" tags="Background" id="17">
<mxCell style="verticalAlign=middle;align=left;overflow=width;vsdxID=22;fillColor=none;gradientColor=none;shape=stencil(nZBLDoAgDERP0z3SIyjew0SURgSD+Lu9kMZoXLhwN9O+tukAlrNpJg1SzDH4QW/URgNYgZTkjA4UkwJUgGXng+6DX1zLfmoymdXo17xh5zmRJ6Q42BWCfc2oJfdAr+Yv+AP9Cb7OJ3H/2JG1HNGz/84klThPVCc=);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="465" y="354" width="321" height="20" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="18">
<mxCell style="vsdxID=24;fillColor=#FFFFFF;gradientColor=none;shape=stencil(nZBLDoAgDERP0z3SIyjew0SURgSD+Lu9kMZoXLhwN9O+tukAlrNpJg1SzDH4QW/URgNYgZTkjA4UkwJUgGXng+6DX1zLfmoymdXo17xh5zmRJ6Q42BWCfc2oJfdAr+Yv+AP9Cb7OJ3H/2JG1HNGz/84klThPVCc=);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="153" y="112" width="260" height="470" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="19">
<mxCell style="vsdxID=25;fillColor=none;gradientColor=none;shape=stencil(nZBLDoAgDERP0z3SIyjew0SURgSD+Lu9kMZoXLhwN9O+tukAlrNpJg1SzDH4QW/URgNYgZTkjA4UkwJUgGXng+6DX1zLfmoymdXo17xh5zmRJ6Q42BWCfc2oJfdAr+Yv+AP9Cb7OJ3H/2JG1HNGz/84klThPVCc=);dashed=1;dashPattern=1.00 2.00;strokeColor=#706e6f;strokeWidth=2;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="153" y="112" width="260" height="470" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="20">
<mxCell style="vsdxID=27;fillColor=#FFFFFF;gradientColor=none;shape=stencil(nZBLDoAgDERP0z3SIyjew0SURgSD+Lu9kMZoXLhwN9O+tukAlrNpJg1SzDH4QW/URgNYgZTkjA4UkwJUgGXng+6DX1zLfmoymdXo17xh5zmRJ6Q42BWCfc2oJfdAr+Yv+AP9Cb7OJ3H/2JG1HNGz/84klThPVCc=);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="358" y="109" width="47" height="6" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="21">
<mxCell style="vsdxID=29;fillColor=#86d633;gradientColor=#5e9624;shape=stencil(jVLtDoIwDHya/SWjDfIAiO9BZMgiMjJA4e1lKYatBMO/ftztel0FZn1ddEqA7Adrnuqjy6EWeBUAuq2V1cMSCcwFZpWx6mHN2JaUd4VDuuhl3u6FiXiJdBSQM6WxpPxG2PtoCRxTO02jC66EOGTICVhhhh1pQo7BYIwD2Q2+FgAiTENZf7S1JEPRhGn+lfQUfqLMJ3Ppj4Qh4pRH5tBf2l5h5rs+8sj+s9Ht6b9fgu1oKt00dHN+nx/ZUqIDxfwL);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="389" y="109" width="5" height="5" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="22">
<mxCell style="vsdxID=30;fillColor=#86d633;gradientColor=#5e9624;shape=stencil(lVJBDoIwEHxNr6TdjRLPiP8wAtKIlBRQ+L3UhdCukehtO51hdsoITNry3OQCZNtZc8ufOutKgUcBoOsyt7qbJoGpwKQwNr9a09cZnZuzY7rpbh7uCwPpdjKSyqlAjoQoKd/nE9EvvSW+ous4jvaLQIUKOQADRlhFOHOQc3DZZMt2pc8AQIRxaOuvNkMyNPXTos/44upMDqEvi8qC+lthyPgpJgvpvxt8rsSfeyMm+6uVrv8pwTSsBSp0VVH//HteuAmismL6Ag==);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="380" y="109" width="5" height="5" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="23">
<mxCell style="vsdxID=31;fillColor=#86d633;gradientColor=#5e9624;shape=stencil(jVLbDoIwDP2avZLRBonPiP9BZMgiMjJA4e9lKQlbCYa3Xs7Z6ekqMOvrolMCZD9Y81JfXQ61wJsA0G2trB6WSGAuMKuMVU9rxrakvCsc0kVv83EvTMRLpKOAnCmNJeV3wj5GS+CY2mkaXXAlxCFDTsAKM+xIE3IMBmMcyG7wtQAQYRrK+qOtJRmKJkzzr6RTuIaizCdz6Y+EIeKUR+bQXxrsR+K7PvLI/rPR7em/X4LtaCrdNHRzfp8f2VKiA8X8Bw==);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="371" y="109" width="5" height="5" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="24">
<mxCell style="vsdxID=32;fillColor=#50e6ff;gradientColor=none;shape=stencil(jZPRksIgDEW/htcMSUoLz677H47WLWO3dbCu7t8vXWiFjnV8C+FecgJB8ObS7M61IHkZXH+qb/YwNII/BJHtmtrZwUeCt4I3x97VX66/doewPu9G5Rh99z/jCffgMxpUNbpI/oaM1qDNf+YzGFrbJQZdARaZAaVM5furCwUwGhRUGA2YO+SdooZAl1FDSw1HDUJBUcMzfInrqP5QlZH6DNErVrngNFConFQuKHm6rJkzqTphQkXrlFgAmQxTroufPBeCUa96mi9y6kozMOddPTTTg5SAmPeVlua3RuWN2fLBYzKPtm3DYKf7y0n2qfALePsH);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="361" y="109" width="14" height="15" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="25">
<mxCell style="vsdxID=33;fillColor=#1490df;gradientColor=none;shape=stencil(jZPRcsIgEEW/htcd2E1geVb7H06NDdOYOBhb/XuTQkbAavu2XA7s3eEiaHVqt8dGoDyNfvhsvt1ubAWtBaLr28a7caoEbQSt9oNvPvxw7ndhfdzO5Fwdhq/5hks4xwYI51Mor0FRQPZHeAt85/qEtwy1zXmEOuXfzz40UHFfysgvAgHHKy5YMougQZvI0GPnKCkGqZ97VTVUhdfY51e8AqSMZl6MPhmtGIwrMJgPVoxlLCidj5V0jYrRL1+AJSC/fLHSJivQNrcqc5uT81rlVmVuM80J/ScofwdrKu6p3LuuC6FO98sUT1L4AbS5AQ==);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="361" y="99" width="14" height="15" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="26">
<mxCell style="vsdxID=34;fillColor=#50e6ff;gradientColor=none;shape=stencil(lZLRksIgDEW/htcMJNLCs6v/4Wzrltlu62B19e9tN6AUp+v4Fm4uyRm4gtbHZneoBcrj4Pvv+tdVQyPoQyC6rqm9G8ZK0EbQet/7+sv3p67i82E3Oafqpz9PEy58zxSg1HQL5ZUV+Xfasrl1XWK2GgzNzBZKTP2fJ8/TFfeVlMEfBQJjWbpg7omChdUqeOh5c5AQAXGZNRkSWQ0U6l9YA1JnuJHtDqsBywz37glkCkHPWZ9WZ6xAdoZqyjBhgTR71OQTI2f2pIaAKKN8LA2KkaD1MuVbUXlhHotHIveubTnQaT9P8Chx+mlzAw==);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="389" y="109" width="15" height="15" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="27">
<mxCell style="vsdxID=35;fillColor=#1490df;gradientColor=none;shape=stencil(jZJBcsIwDEVP461Gsmxirym9B1NC42maMCa0cHucyh1i05buLPk5eqN8xetjtz20SuNxiuNb+xl2U6f4SWkdhq6NYUonxRvF6/0Y29c4noad1IftTM6n9/Fj/sJZ3vkGaH6k8SIN58D5r86z8H0YFryzYAueEH+nCUxFezBmyb+couiQAJjxXJIDXEnrrEsil2RBu0zw3dTvjs7WP1sSWF9qAvu/LIkBbWmKpWXS8qY0xcoyLbrWrMaWmne/qlk90sRqnY0HqtZ5Y3LDGWh0qbqYzP9KyeNUpcMtkvvQ95Lo5X0d4dSS+PPmCg==);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="389" y="99" width="14" height="15" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="&lt;div style=&quot;font-size: 1px&quot;&gt;&lt;p style=&quot;text-align:left;margin-left:0;margin-right:0;margin-top:0px;margin-bottom:0px;text-indent:0;vertical-align:middle;direction:ltr;&quot;&gt;&lt;font style=&quot;font-size:16.93px;font-family:Oracle Sans;color:#706e6f;direction:ltr;letter-spacing:0px;line-height:120%;opacity:1&quot;&gt;&lt;b&gt;Application VNet/Subnet&lt;br/&gt;&lt;/b&gt;&lt;/font&gt;&lt;/p&gt;&lt;/div&gt;" tags="Background" id="28">
<mxCell style="verticalAlign=middle;align=left;overflow=width;vsdxID=36;fillColor=none;gradientColor=none;shape=stencil(nZBLDoAgDERP0z3SIyjew0SURgSD+Lu9kMZoXLhwN9O+tukAlrNpJg1SzDH4QW/URgNYgZTkjA4UkwJUgGXng+6DX1zLfmoymdXo17xh5zmRJ6Q42BWCfc2oJfdAr+Yv+AP9Cb7OJ3H/2JG1HNGz/84klThPVCc=);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="161" y="120" width="389" height="20" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="29">
<mxCell style="vsdxID=40;fillColor=#FFFFFF;gradientColor=none;shape=stencil(lZPRDoIwDEW/Zq9LWQeEZ9T/MIqyiEAmKv69I51hnQTj21ruZac3q8DyVu/7Sii4Dba7VE9zHGqBG6GUaevKmsGdBG4FlqfOVmfb3dsj1f1+Uk6na/eY/jCSL5WYTSYFL2oUhcypsyP94W7JkJBASa29I4ktMCpqgVf4ssglKq9ArvBloaUOb21MG1ACQ3TM6RohcDwHjJwuGIHzfuCCVBjuIpxDzzQDhDU6l0WacULgeAlE8QUTYCzB5Uw44iyfkVcjnA0Bdc4xw0Fi8hG/s4nQF0F/P8d/9e4wv/2TaRpanfB7vCuuRXuG2zc=);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="1117" y="178" width="62" height="62" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="30">
<mxCell style="vsdxID=41;fillColor=#FFFFFF;gradientColor=none;shape=stencil(lZXRdoIwDIafprc9bUIpXDv3Hp6JgzMGHsQN335lrdCmCHpX4h/88iehDHeX8nAuGIhL37VfxW917EuGbwygasqiq3pzYrhnuDu1XfHZtdfmaJ/Ph1E5nr7bn/ENg83LkaMas0DcbAQ4Zv+Bd6v/uHY2QboMxZPMZUiSIgZwIj2Fbi6UcMidCGORC6U8Qf/P66rxYb2ECT+Tq7ReylxArgiuV9NcQZYSXs8rpKpFYFMOhLxUT3mNSxRX8xRCXIjMNQVoCGkhMtfwK/0YFqi5tBmUFSJrvR5DVE8EP2DkEmVfHoPNmX1Vv7UT4oUWi3XLMhVaJkK/BDWLDqEInVpfGBGQbS6LYHTyZEInb+J3ESkE2+jmXfKoOSocOyJf2GhJPJwZKJS3zVMpSDXPrcesf2478pxrTb+TUzfvXCnPIUQldi58dNbdXBtdc5gvglNV1/Ye8X+nF4cJ2UsH938=);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="1117" y="177" width="63" height="63" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="31">
<mxCell style="vsdxID=43;fillColor=#2d5967;gradientColor=none;shape=stencil(tZNNDsIgEIVPw5bA0Eq7rnqPJqWWWEtD69/tBYmx2IiwcDfMvG9mgDzEqqmrR4GATLNWR3GVzdwhtkUAcuiElrOJENshVrVKi4NW56Fx57G2Shud1MV2uDluU2BOLQXk7jKUYiifmb0DejksgILjrPCArMQ0AKwnmBYkADCzQJYCUEhcaT3hx6WTX+kfgP9xPPfU5HtriFYST5jH96QkoOUJ2lcxZof4FwgpTfD2Riv73llrWf/0kkk5H7LdAw==);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="1148" y="193" width="21" height="18" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="32">
<mxCell style="vsdxID=44;fillColor=#2d5967;gradientColor=none;shape=stencil(lVTRcoMgEPwaXpnjiEWf0+Q/MompTK1mjGn17yMFlYORpm+w7rm7xwGT+3t1upUM4d537Wf5oy99xeQ7Q9RNVXa6n1ZMHpjcX9uu/OjaR3Ox+9vJMM3qq/02fxhsXQamBGG0WyE4Fr/I0bLPj87ShSUo4IV0JSKsgQEtlCvukNEhmHN0dYOMSA7ZFVwk1b2S1Y94o+K+xdWPoOJLbhkwNpSx4IBU2vupkxE4IyPG9mREejW2VyLidmLsEOOT2cgdHXitm3+MR3KYINlQ5JmioYAGAhrGFOQ0TJAlSwoCFVOK7zDooGdp7iDAH/2DpKhRCa8LBDkXYBkaz5oMOS9lXelztwVXKrgmnjXa8a2sRDI5J4Q5LdbX56rr2j5e/vfwtZog+9LJwxM=);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="1138" y="214" width="18" height="18" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="33">
<mxCell style="vsdxID=45;fillColor=#2d5967;gradientColor=none;shape=stencil(lZJNDoMgEIVPw5bAYCqurb2HiVhIKRjE/ty+UNJUm1Rl95j53mQmPMTqUbaDQEBG7+xF3FXnJWJHBKCMFE75oBBrEKt768TZ2cl06T20kYzqam9xwiP5igofILqAPFMFCkyrd+WUDFqZmYFTXC4NvMQrPOUYWAafvdAOw9bJ5P90sgApWUE/zV1w1hIbcBDf7+2V1ikd8/5vHEIpRYk1Lw==);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="1127" y="192" width="20" height="18" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="34">
<mxCell style="vsdxID=46;fillColor=#2d5967;gradientColor=none;shape=stencil(pZTdcoMgEIWfhlsGWBG9TpP3yCSmMjWaIebv7YPFCgvVpu0du3yLZ886S2B1rrenigh27k33Ud30vq8JvBEhdFtXRvf2RGBNYHXoTPVuuku7d/FpO5DD6dhdhxfurq6UVMmhSrCHy3DGPuONwxvdBnhGxSK9uxj3OnfXYoQ5ptlduMQYPsawVFQVIwGYgEmvKOb1MSRuoZFJye/RRELctC/gaVtfnRa4c+8MpIOBFybz4yDx3IGqDNEZ5Wr+9QS3n5NyyYSggk8lBWAXMmxCmVPOsQ3BDwcx9L0POdYZ07FOC4g8EhrI8Mokj8QG7UBKwYxPsVpf8ac5/BO3B78ZDrpp3GIJ7+NNYlNuC8H6CQ==);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="1118" y="185" width="60" height="54" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="35">
<mxCell style="vsdxID=47;fillColor=#2d5967;gradientColor=none;shape=stencil(nZLbDoIwDEC/Zq9ktILwjPAfRIYsIiMDFP9eli5hw1v0re1Ol5O2DLOhKXvBgA+jVmdxk9XYMDwwANk1QstxiRjmDLNaaXHSauoqyvvSkCa6qKv5Yaa+kHPTA/zu5wXBrewc+G80SoIYXfg4abIIfdymsA+ilEoz2JIlwGuYkdJdAJEF0AVeuqWxJ8c/iaWJb8Z9q3V88GyOWwbfTMPX+2klX+AlWDdfy7alw3Hft5eylOjKMH8A);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="1118" y="179" width="60" height="4" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="&lt;div style=&quot;font-size: 1px&quot;&gt;&lt;p style=&quot;text-align:left;margin-left:0;margin-right:0;margin-top:0px;margin-bottom:0px;text-indent:0;vertical-align:middle;direction:ltr;&quot;&gt;&lt;font style=&quot;font-size:16.93px;font-family:Oracle Sans;color:#000000;direction:ltr;letter-spacing:0px;line-height:120%;opacity:1&quot;&gt;Object Storage&lt;br/&gt;&lt;/font&gt;&lt;/p&gt;&lt;/div&gt;" tags="Background" id="36">
<mxCell style="verticalAlign=middle;align=left;overflow=width;vsdxID=48;fillColor=none;gradientColor=none;shape=stencil(nZBLDoAgDERP0z3SIyjew0SURgSD+Lu9kMZoXLhwN9O+tukAlrNpJg1SzDH4QW/URgNYgZTkjA4UkwJUgGXng+6DX1zLfmoymdXo17xh5zmRJ6Q42BWCfc2oJfdAr+Yv+AP9Cb7OJ3H/2JG1HNGz/84klThPVCc=);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="1092" y="244" width="237" height="20" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="37">
<mxCell style="vsdxID=51;fillColor=#5ea0ef;gradientColor=#0078d4;shape=stencil(lZXbUhsxDIafZm81Ovh4TeE9mCY0O6QJswRK3h4tXjuRO1naO0eR9pP/37IHuXvdPb5sB8bX03R83v4ZN6fdID8G5vGw207jSVeD3A9y93Sctr+m49thU36/PM6Z8+r38X3+wkepcwJIcxXjuUS8AKevyEMp2I+HqwKfTLZDCLeTCdFkB4bA1+k/36bSDZWEnAErYAn5AFlK6IOXLA3VrCXkCWJYsmTJEshL6LyEXITobrc7V9jdRRBZ7RdBou3XMVSNar/JQ8q2X8ngxPabCNDbfiXBKj4hRLF4jpA6uWIE5yyeYtOm4iNBJosnhBTW+CGAdHbJxYdqjXra4dGi1TzPFo3gVg+K8+CCJSNwR1aRPVkyN8EqXBy4bOGqV1qDs5rXuU4M3MnOHoJYOqkUbPEqWGc66+l2a3g1j9jiOV0+XFkE3Mku2mS0eGV1yuuZy6ubh0AWrl74bu8I5C3bOyCLRssNUo//DbD6my04ShOiWd7GqoITNxvapF2mpkZyPQS3NHeA3aTpLSS+s1xHOFp8uwKb4TrT3ZzprRfM1u219Pcd/d8F31zq/1Cgi8sb8jTu9+UJuv6/f3M0VN4ruf8E);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="38" y="293" width="60" height="43" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="38">
<mxCell style="vsdxID=52;fillColor=#767676;gradientColor=none;shape=stencil(jZDdCoMwDIWfJrfSNoztXt17CNY1WFup3d/bryWM1YHi3TnJl3A4gPViulmDEksMftRP6qMBbEApckYHikkBtoD14IO+BX93Pfu5y2RWk3/kDy++E/lCiXfprgxaciVYSVyxZ1ld5DYvxfr11x+CT3tBDifeBpP4FTKQtdxnuf8vMI24fGw/);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="74" y="313" width="27" height="21" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="39">
<mxCell style="vsdxID=53;fillColor=#999999;gradientColor=none;shape=stencil(jZBLDsIwDERP423kOqWi61LuUakpiQhJlaZ8bk+CVRFYIHZj+81IY5DdoodZAeESgz+rmxmjBnkAIuO0CiYmBbIH2U0+qFPwqxt5nodMZnXx15xwZ1/bil2dXYQP3uBrOjJsjStg/ACpFg39C1f4I3c7bvC+EtiUeBLvApOxlvuX9+/CacXPkv0T);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="66" y="313" width="7" height="18" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="40">
<mxCell style="vsdxID=54;fillColor=#a3a3a3;gradientColor=none;shape=stencil(UzV2Ls5ILEhVNTIoLinKz04tz0wpyVA1dlE1MsrMy0gtyiwBslSNXVWNndPyi1LTi/JL81Ig/IJEkEoQKze/DGRCBUSfAUiHkUElhGdppGdkChZxgyjOycxDUmxogKocxidKsaWemSVu1ahq8RhLkoMJKAYyEOGSlpmTAwlWZHn0cAQKQeLA2BUA);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="86" y="320" width="2" height="9" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="41">
<mxCell style="vsdxID=55;fillColor=#a3a3a3;gradientColor=none;shape=stencil(UzV2Ls5ILEhVNTIoLinKz04tz0wpyVA1dlE1MsrMy0gtyiwBslSNXVWNndPyi1LTi/JL81Ig/IJEkEoQKze/DGRCBUSfoYEBSI+RQSWEb6lnZgYWcIOozsnMQ1KNqtaAWIWWRnqmeExFdwOMT5Ri/A4mpBrIQIRMWmZODiRgkeXRQxIoBIkFY1cA);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="81" y="318" width="2" height="9" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="42">
<mxCell style="vsdxID=56;fillColor=#a3a3a3;gradientColor=none;shape=stencil(lZHNDsIgEISfZq8Ed2NIz7W+R5NSISI0FP/eXnCjokk13mZ3v5mQAaidTT9pQDmnGPb6bIdkgDaAaL3R0aasgDqgdgxR72I4+oHnqS9kUYdwKgkX9sniQHnlqUGB6r7ZMuysr+BGiXKrDCspl/HH8Zku1HqZfme/xP715B9wFq9mRuscF1vfP5vMK/4F6m4=);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="92" y="321" width="2" height="8" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="43">
<mxCell style="vsdxID=57;fillColor=#a3a3a3;gradientColor=none;shape=stencil(UzV2Ls5ILEhVNTIoLinKz04tz0wpyVA1dlE1MsrMy0gtyiwBslSNXVWNndPyi1LTi/JL81Ig/IJEkEoQKze/DGRCBUSfAUiHkUElhGdprGdqCBZxgyjOycxDUmxogKocxidKsYWemTlu1ahq8RhLkoMJKAYyEOGSlpmTAwlWZHn0cAQKQeLA2BUA);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="76" y="316" width="2" height="9" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="44">
<mxCell style="vsdxID=58;fillColor=#a3a3a3;gradientColor=none;shape=stencil(UzV2Ls5ILEhVNTIoLinKz04tz0wpyVA1dlE1MsrMy0gtyiwBslSNXVWNndPyi1LTi/JL81Ig/IJEkEoQKze/DGRCBUSfoYEBSI+RQSWMr2dqAhZxgyjPycxDUo6q2IBYhZaGeqZmuBVjOgKPySS6mKByIAMROGmZOTmQsEWWRw9MoBAkIoxdAQ==);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="97" y="323" width="2" height="8" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="45">
<mxCell style="vsdxID=59;fillColor=#B3B3B3;gradientColor=none;shape=stencil(lZLbDoMgEES/htcNsCr4bO1/mIiV1IpBe/v7Sompl5Tat2U4Q2bJEMz6uugU4bQfrDmruy6HmuCBcK7bWlk9jBPBnGBWGatO1lzb0p+7wpFuupibe+HhfYiQxM7F6dMrKYIUb+XoDY1uZwa6gBmlu1EBUfod3gZhDNLkH8OP5DsMy7+ZlpvwwKpJDBFfwIEgW1gKYAHDOohkgNF+PJA7iI7DpzaVbhrfuvn9umaj5CuK+Qs=);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="67" y="316" width="3" height="12" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="46">
<mxCell style="vsdxID=60;fillColor=#333132;gradientColor=#5b5a5c;shape=stencil(lZHBDsIgEES/Zq+Esq3Vc63/0aRUiAgNRa1/L7gxFmNqvM3uzryQAbCZVDdKEHwK3p3kTfdBAe5BCG2V9DpEBdgCNoPz8ujdxfY0j11yJnV210SYKVdwnjKC32ne7FiJz82B7Ebbhb3esgqzwAvw1Z6zy4LhClvEc50FVsh/vvunPYp3RYM2hhpe3j8rjSv6Dmwf);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="66" y="328" width="35" height="8" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="47">
<mxCell style="vsdxID=61;fillColor=#767676;gradientColor=none;shape=stencil(jZHRDoIwDEW/pq/LbCOGZ8T/IGG4xbmRMVH+3s3GCMSIb7ftuU1zC1QNuukVoBxi8Bd1N23UQEdANE6rYGJSQDVQ1fmgzsHfXMt132Qyq6sf84YH+3ZSZg/KiesDirJ8dU6MW+Nm+BJ+m7+jYr+Af6DrI7AQ9D+9cfImnsQnnc5Yy+HO5+s0U4s/QfUT);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="74" y="330" width="28" height="19" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="48">
<mxCell style="vsdxID=62;fillColor=#a3a3a3;gradientColor=none;shape=stencil(lZDdCoMwDIWfJrdSEybs2ul7CNY12LVS637efi1BNgSHuzsn+RIOB6ieTTdpQDXH4Ef94D4aoAsgsjM6cEwKqAGqBx/0NfjF9eKnLpNZ3fw9f3jKncoXqF7iSiW+FdSy20V/gOuXFcXiRMfpc1VU5dEUfwTeoEl8OhnYWqn0e7/tMI2kf2re);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="76" y="334" width="2" height="12" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="49">
<mxCell style="vsdxID=63;fillColor=#a3a3a3;gradientColor=none;shape=stencil(UzV2Ls5ILEhVNTIoLinKz04tz0wpyVA1dlE1MsrMy0gtyiwBslSNXVWNndPyi1LTi/JL81Ig/IJEkEoQKze/DGRCBUSfoYEBSI+RQSWEb2mqZ2EGFnGDKM/JzENSjqoYppkIpXgUojvBWM+UeMUE3EtQOZCBCJq0zJwcSMgiy6MHJVAIEg3GrgA=);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="81" y="335" width="2" height="11" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="50">
<mxCell style="vsdxID=64;fillColor=#a3a3a3;gradientColor=none;shape=stencil(lZDdCoMwDIWfJrfSJezCa3/eQ7DasNpK7Tb39msJsiFs6N05yZdwOEDVYrpZA6olBn/TT+6jAaoBkZ3RgWNSQA1QNfigx+Dvrhc/d5nMavKP/GGVO5UvUL3EXZT4VlDL7if6B9y+bCgVhMfp8logHU1xIvAOTeLTycDWSqXf+32HaST9U/MG);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="86" y="335" width="2" height="9" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="51">
<mxCell style="vsdxID=65;fillColor=#a3a3a3;gradientColor=none;shape=stencil(UzV2Ls5ILEhVNTIoLinKz04tz0wpyVA1dlE1MsrMy0gtyiwBslSNXVWNndPyi1LTi/JL81Ig/IJEkEoQKze/DGRCBUSfoYEBSI+RQSWEb2miZ2wEFnGDKM/JzENSjqoYppkIpXgUojvBRM+CeMUE3EtQOZCBCJq0zJwcSMgiy6MHJVAIEg3GrgA=);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="92" y="336" width="2" height="8" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="52">
<mxCell style="vsdxID=66;fillColor=#a3a3a3;gradientColor=none;shape=stencil(UzV2Ls5ILEhVNTIoLinKz04tz0wpyVA1dlE1MsrMy0gtyiwBslSNXVWNndPyi1LTi/JL81Ig/IJEkEoQKze/DGRCBUSfoYEBSI+RQSWEb2msZ2AJFnGDKM/JzENSjqoYppkIpXgUAq00MkFRbKJnboFbPYlOJqgcyECETlpmTg4kcJHl0UMTKASJCWNXAA==);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="97" y="337" width="2" height="6" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="53">
<mxCell style="vsdxID=67;fillColor=#999999;gradientColor=none;shape=stencil(UzV2Ls5ILEhVNTIoLinKz04tz0wpyVA1dlE1MsrMy0gtyiwBslSNXVWNndPyi1LTi/JL81Ig/IJEkEoQKze/DGRCBUSfAUiHkUElhGdupmdgDhZxgyjOyczDqdjQXM/CDLdiQwNU5QbEK4XxiXAESS7GUAxkIAImLTMnBxKuyPLoAQkUgkSCsSsA);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="66" y="330" width="7" height="19" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="54">
<mxCell style="vsdxID=68;fillColor=#B3B3B3;gradientColor=none;shape=stencil(lZLdDoIwDIWfZrfNWBmya9T3IGHIIjIy8O/t3VxUJnHCXXf6neW0KcFiaMpeEkaH0eijvKpqbAhuCWOqa6RRo60I7ggWtTbyYPS5q/y7Lx3pqpO+uB9u3scEYOZcjN69klslfyp7b2hVNzHQEObAcCmcIGwi8DyKgJyv4f9EX2AIl5PQcAD6+++MQ5IGcAqCreEFBxoJL8Sr/V4njeSZ4xF4xZxR1BafO6tV2/oznfa/79JK/qZx9wA=);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="67" y="333" width="3" height="13" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="&lt;div style=&quot;font-size: 1px&quot;&gt;&lt;p style=&quot;text-align:left;margin-left:0;margin-right:0;margin-top:0px;margin-bottom:0px;text-indent:0;vertical-align:middle;direction:ltr;&quot;&gt;&lt;font style=&quot;font-size:16.93px;font-family:Oracle Sans;color:#000000;direction:ltr;letter-spacing:0px;line-height:120%;opacity:1&quot;&gt;Azure&lt;br/&gt;&lt;/font&gt;&lt;/p&gt;&lt;/div&gt;" tags="Background" id="55">
<mxCell style="verticalAlign=middle;align=left;overflow=width;vsdxID=70;fillColor=none;gradientColor=none;shape=stencil(nZBLDoAgDERP0z3SIyjew0SURgSD+Lu9kMZoXLhwN9O+tukAlrNpJg1SzDH4QW/URgNYgZTkjA4UkwJUgGXng+6DX1zLfmoymdXo17xh5zmRJ6Q42BWCfc2oJfdAr+Yv+AP9Cb7OJ3H/2JG1HNGz/84klThPVCc=);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="48" y="354" width="84" height="20" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="&lt;div style=&quot;font-size: 1px&quot;&gt;&lt;p style=&quot;text-align:left;margin-left:0;margin-right:0;margin-top:0px;margin-bottom:0px;text-indent:0;vertical-align:middle;direction:ltr;&quot;&gt;&lt;font style=&quot;font-size:16.93px;font-family:Oracle Sans;color:#000000;direction:ltr;letter-spacing:0px;line-height:120%;opacity:1&quot;&gt;Container&lt;br/&gt;&lt;/font&gt;&lt;/p&gt;&lt;/div&gt;" tags="Background" id="56">
<mxCell style="verticalAlign=middle;align=left;overflow=width;vsdxID=71;fillColor=none;gradientColor=none;shape=stencil(nZBLDoAgDERP0z3SIyjew0SURgSD+Lu9kMZoXLhwN9O+tukAlrNpJg1SzDH4QW/URgNYgZTkjA4UkwJUgGXng+6DX1zLfmoymdXo17xh5zmRJ6Q42BWCfc2oJfdAr+Yv+AP9Cb7OJ3H/2JG1HNGz/84klThPVCc=);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="32" y="371" width="152" height="20" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="&lt;div style=&quot;font-size: 1px&quot;&gt;&lt;p style=&quot;text-align:left;margin-left:0;margin-right:0;margin-top:0px;margin-bottom:0px;text-indent:0;vertical-align:middle;direction:ltr;&quot;&gt;&lt;font style=&quot;font-size:16.93px;font-family:Oracle Sans;color:#000000;direction:ltr;letter-spacing:0px;line-height:120%;opacity:1&quot;&gt;Registry&lt;br/&gt;&lt;/font&gt;&lt;/p&gt;&lt;/div&gt;" tags="Background" id="57">
<mxCell style="verticalAlign=middle;align=left;overflow=width;vsdxID=72;fillColor=none;gradientColor=none;shape=stencil(nZBLDoAgDERP0z3SIyjew0SURgSD+Lu9kMZoXLhwN9O+tukAlrNpJg1SzDH4QW/URgNYgZTkjA4UkwJUgGXng+6DX1zLfmoymdXo17xh5zmRJ6Q42BWCfc2oJfdAr+Yv+AP9Cb7OJ3H/2JG1HNGz/84klThPVCc=);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="38" y="388" width="135" height="20" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="58">
<mxCell style="vsdxID=75;fillColor=#0078d4;gradientColor=#5ea0ef;shape=stencil(hZPLEoIwDEW/pttOaHjYNeJ/MIrSEYEp4OPvBQtDU0B2SXrbOb1JGMZNntYZE9C0urpnL3Vpc4ZHJoQq80yrto8YJgzja6Wzm6668mLyOh2UQ/SonsMLb3NPhjyMhlsCPqYCv+xkxIUqLTFyxG3tudPmZc8cetyXo9qz5fAWJP2MqeDCHwVIBWMabJMBwZLBPy6gUDLiUUjBLPKpAkDRLCuQSlb5ljY7chdSHnjgUdCZwYWaKO2voKvBNW8o5SxeMXzRXnCMtPonlp+gPZ/wbF9wd/52hrUP5jG/qqIwW2Kfu2vRl8xKYfIF);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="40" y="483" width="63" height="42" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="59">
<mxCell style="vsdxID=76;fillColor=#50e6ff;gradientColor=none;shape=stencil(lZHNCoMwEISfZq+SZkV6t/Y9BKNZTBOJ6Y9vb8IirYJibzObb5ZlAliOuh4USDEG73r1piZowBtISVYrTyEqwAqwbJ1XnXdP27Af6kQm9XCvtOHDuYsQKSPFxJ7dnVFD9gAtiiy/7uNreAmfQBEzzM+f8cfFKzSKbyktGcOd/r5vS4wj/gCsZg==);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="71" y="498" width="10" height="18" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="60">
<mxCell style="vsdxID=77;fillColor=#c3f1ff;gradientColor=none;shape=stencil(UzV2Ls5ILEhVNTIoLinKz04tz0wpyVA1dlE1MsrMy0gtyiwBslSNXVWNndPyi1LTi/JL81Ig/IJEkEoQKze/DGRCBUSfoYEBSI+RQSWEb2KpZ2EKFnGDKM/JzENSboqqGqYbq1pKDMZjLIkuJqgcyEAETlpmTg4kbJHl0QMTKASJCGNXAA==);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="61" y="492" width="21" height="12" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="61">
<mxCell style="vsdxID=78;fillColor=#9cebff;gradientColor=none;shape=stencil(UzV2Ls5ILEhVNTIoLinKz04tz0wpyVA1dlE1MsrMy0gtyiwBslSNXVWNndPyi1LTi/JL81Ig/IJEkEoQKze/DGRCBUSfoYEBSI+RQSWEb2ysZ2oMFnGDKM/JzMOjHMbHqhhVqZmZnokFsYrxmEqhizGUAxmIwEnLzMmBhC2yPHpgAoUgEWHsCgA=);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="61" y="498" width="10" height="18" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="62">
<mxCell style="vsdxID=79;fillColor=#c3f1ff;gradientColor=none;shape=stencil(UzV2Ls5ILEhVNTIoLinKz04tz0wpyVA1dlE1MsrMy0gtyiwBslSNXVWNndPyi1LTi/JL81Ig/IJEkEoQKze/DGRCBUSfAUiHkUElhGdiqWduBBZxgyjOycxDUmxogKrcgHilMD5WxSQ5goBiIAPh17TMnBxIUCHLo4cNUAgSrsauAA==);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="61" y="504" width="10" height="12" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="63">
<mxCell style="vsdxID=80;fillColor=#9cebff;gradientColor=none;shape=stencil(UzV2Ls5ILEhVNTIoLinKz04tz0wpyVA1dlE1MsrMy0gtyiwBslSNXVWNndPyi1LTi/JL81Ig/IJEkEoQKze/DGRCBUSfoYEBSI+RQSWEb2KpZ24EFnGDKM/JzENSjqrYgFiFMFuwKiXRCQSVAxkI36Zl5uRAAgtZHj10gEKQkDV2BQA=);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="71" y="504" width="10" height="12" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="64">
<mxCell style="vsdxID=81;fillColor=#cccccc;gradientColor=#707070;shape=stencil(jZTRcoMgEEW/htedBUTZ5zT9j0xjqlOrGWNa8/fBgJHFqekbXhbP5a6r0LtLdTiXQuFl6Luv8rc+DpXQb0Kpuq3Kvh7cSui90LtT15effXdtj/75fJgqp9V39zO9YfTnCEFOhxTevFBYyB7Cuy//uPa+XoZ9BK3DiVlSoI2XRuWlnMAE6RakLIMioEa9rgoSxuymbiOr2pEz5hW3jMblcm0huFIEecGNxtcJrgiI23yZEsgiCckCEWdnkCcZWQlGcbQCqznbGjByCy452bqUORg5lZyRnFMRUHGqxI3WkAvIstYk5SuLiNxk7GG2RUk4yz3mtkQx/zccMs/uPgOKUp/ZUexq3cCZvwzPH99FEtOrYXOLZVBPddP4OY/308F2kv8p6P0d);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="56" y="525" width="31" height="16" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="&lt;div style=&quot;font-size: 1px&quot;&gt;&lt;p style=&quot;text-align:left;margin-left:0;margin-right:0;margin-top:0px;margin-bottom:0px;text-indent:0;vertical-align:middle;direction:ltr;&quot;&gt;&lt;font style=&quot;font-size:16.93px;font-family:Oracle Sans;color:#000000;direction:ltr;letter-spacing:0px;line-height:120%;opacity:1&quot;&gt;Application&lt;br/&gt;&lt;/font&gt;&lt;/p&gt;&lt;/div&gt;" tags="Background" id="65">
<mxCell style="verticalAlign=middle;align=left;overflow=width;vsdxID=82;fillColor=none;gradientColor=none;shape=stencil(nZBLDoAgDERP0z3SIyjew0SURgSD+Lu9kMZoXLhwN9O+tukAlrNpJg1SzDH4QW/URgNYgZTkjA4UkwJUgGXng+6DX1zLfmoymdXo17xh5zmRJ6Q42BWCfc2oJfdAr+Yv+AP9Cb7OJ3H/2JG1HNGz/84klThPVCc=);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="28" y="545" width="186" height="20" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="66">
<mxCell style="vsdxID=85;fillColor=#5e9624;gradientColor=#76bc2d;shape=stencil(lZbRdoIwDIafhtuetoFCr517D8/EyZkTD+qmb79yStM0Hah3WP7wJe2f2AJW5/3m1BZani9D/9X+dtvLvoC3QuvuuG+H7uKeClgXsNr1Q/s59Nfj1v8+bUbl+PTd/4xfuPk4JaQag7S8+4WyFsavvHv9oTsSfXwdAvALk/7jOniAwgirp4hpSQpj/cpNT6JG6GnproOohEkEKKonDQSNNotsK5TibMnZVlSGsVNwJRl2iVm5xEvGTIFO0WTFYlaBqQS8VqyLqLNicQ8DWwvZcLbhbC3ApnB+yqkrbCNsCJixEc/WWgEsW+KUkK5TVXWaLrFKyNep6jLNF70yj7ccH80S8EpKBo9eCfCoSd0yA47y3C+kakwu98xC1Wia+apxO3PXEDxwfLQN4smZZ7751yXj6+BpJMnqRU+7GGPShMfNYS7BbZ7r4SBYmByQguMn54cWTS440XUCG1tZ2ek+ZTM521eebWxhPFZyYNlAxVMlZ8+HzNOeiqOLOLphM5a1EfU8pIqnmoi1EO3KbKCS1lUPi300NsgeqswEt2ygIptMNj5QI3v5n/fVf+rHevcQrwW77nDwtwr6nl8j3JK/gsD6Dw==);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="252" y="478" width="63" height="63" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="67">
<mxCell style="vsdxID=86;fillColor=#b4ec36;gradientColor=none;shape=stencil(lVfZctswDPwavXJEgOdzmvxHpnFqTV074zht+veFKonHMrLsNx273CUJgGDHD+/757ddR/375Xz6ufszvFz2HX/riIbjfnceLvLU8WPHD6+n8+7H+fRxfJne355H5Pj06/R7HOFz4sWgohtZ1P+dvhivtPn/5WkiHIZjQbBa+VAReuV8if/+cZ4UdGJQnBl6odAk0X/SDJJR7AyaP/UzghfE/JvL3yuaJiq2oFkLmqC8BsHsihNofK9kYbb16mjVm+uriU5lPF0bFYrh2myfV5ASKLjabL8oJa9in91VcVAOedCk3DMoR2VQmCwIx2Wg1VkbV2tLALBB7QDaAvJUi2vFtbZgor2mXQRwjlAdam1SDNExhjHX2qQCRMc4kl4PD5Z5L4wVAroVijetXV3bZQk82/jVvvYrKLaN4Tm01vR1Tsysv8yi0I/U6EOAMindys9LuCYvG+FBnlKSJXlSFqefd7DQdx70aUm/dX0MFlKxUV/SJqmzolY9oTihLF+JloIxV2uvbNiyC4kVcw1Lhllp2C1BBUhrQdlQG45xK1pMLoA6cbwFfaMcLJjuodyzzRnINebLxXIyZqwWC+Bo1dlUcBar2QQlTASj5XRmX87lrL51oYQTILDKLVj0fa7p1G4ntyheCRRYrIKxEoqN4YKiE4d0YxjLQE6XbJexZm+loXAMVqEiwbO6wxOjKBZZP9xbhlxQfXtowFkpIG6LsMHdCrmg3lqEhRO/OAQ86EvQYR0qjgpOKEzrjVNLgknXLd/mqSUUFxvDBG1NEcul4VAbFlQa69YzXvJP47FR9A45ly2kV9mG5Fz29/Y3womgX/RNWPNSaxWapi7G5tTY7OpGw21PiZ2doLhtKg20OOX9gBPq2gXh7hvFDQR5yBeY1+FwmO4/5X+88Min6bLEj/8A);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="276" y="484" width="15" height="16" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="68">
<mxCell style="vsdxID=87;fillColor=#b4ec36;gradientColor=none;shape=stencil(hZfLctswDEW/xlsOCfC5TpP/yDRO42kaZxynTf++UCW+Li1pJ8sXOiAIgOCB7z5eHt+PB9If18v55/HP6en6cuBvB6LT28vxcrrK04HvD3z3fL4cf1zOn29P8+/3x0k5Pf06/56+8DXbWa+in6xI/53fGBXS/xcPs/719NbotfKuk9uktG313z8vM8BkC+LFwhST5RtftGgWwfLTaaXTouBewUURzCa1RzqjmIFZ/aIiSgTYutxMJsVhPT5jPFNSJm25aoOi3lsxcRAhEXnbuyuqAFGyURnq/RXVNj0qb3q80RrgsgQzwJMDuHjtB3jwW/Rpp28sPvR8UY1rJ9vjReQD4KOKtINPkJxiY4FulPaADyoZwJtcBxUflO2StE+V1mJ+E3TevjV/G5PllU/KxsFhSr3DXiLhBocD5LbPa1/DE2aql0BguCgHvdIleSPQWVlIlqq6Ga4pmqEL12CA/opJiIPDHsIlO64xXKKCTiAqDoPDdrO2xKa0j8rnMPBHvIHKTk0JZrxXabO4xIZxv7wK0AdTTaDC92VzGr7D5Xtl9vilIjPflfbY8APgXW1/PH6Ki4q6bIV0aSzmN+z24xVhu8TGu8HfBO1AVDTuV4q9w2xzrazwS98tdDu0wum7cGyJisxAD0hnFbeLJZWcL3wezqEppyBbRUVjtmC2ikq7nWKJyJdWgtkac81VPimP0ZdzkIEvKl5PF2frybliMHRDvuWwh/QWlTOjw9w7LCrCgJFy23wq40rDtxAwUZUeVPkUgC+GNPB12OHnLlX4ph4zla9x/UZBvshZFBPgZWLbnPCm88sPeI3LN9hdWEZHGvDQXES0c3RDb8mFuu4sDhp19xpfIbXLedt46mGfjHKbdd2MvhmtSwdrJqwIu6TLcdtMWAbObA09eJgu5diAHMXZMt4gayiPaa5NSObN6pCB2QVctoeIiwjYRhmYK9uJvoR864q0f6WSh3ofez69vs7XufZ/vL/Jq/nux/f/AA==);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="259" y="501" width="16" height="15" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="69">
<mxCell style="vsdxID=88;fillColor=#b4ec36;gradientColor=none;shape=stencil(lZfJctswDIafxlcMSXA9p8l7ZBqn9tSNM47Tpm9fqJK4/Izo9ibDgD4QxKYd370dHl/3O6Perpfz9/2v49P1sOMvO2OOL4f95XiVpx3f7/ju+XzZf7uc31+e5t+vj5Pm9PTj/HN6w8ds5ww5O1kZ9XuWpEQc/0oeZoPT8aUymP52jYHT5BuDr++XGaGzSQiLic420+9J9GFmkVZq0VkETpFfdRh1FoFNlNKIXSx0tuDQkmv/FpGNFHzLrg/OWYv1dqj62MqJ9MhbsTCtu4oY4iShC7H1VpHm1llRYts6q0iFIVtRTAAHsiJrkawCkEXESDZ+RJYrWcJSHdu6Fi5Ky1sqeLAtXJSUbuGatBnC5aZdC9fkNMBj8XBNV0oO4JFcauGG7CA/aoNZwooc3/DWt86KScRQxfUt2VuWMPjOXcgQUVqivk03EfC6XELBQ6xyCq/oQDEAWzJ/WBpi4+GexMZCcYgWR4STix1fxY4/bmLWU0gdf63EzPdke37E83vSPT8Muq5EZ73RDf2u8VEyN93VucPW3kJRSSvhztk07CWaFN4VE9SU5C2gmUxq0aqrKFFyw3pWJQEKOjhkGzy3JWUQrvHcdg3FJjz3Pp1N8hBb4R05WSRjC2UHPbRNj8pgFnh56bDnwlT08v6AMVLQREQJK6mPkSjFYWJWsV/hUg4J4VjGomQ9wjE7RMkP14GSdIWduGVXybuyA2ndsvuiECVjx0Xh8eCh20Wqsi1wC9O96gaMSp9PmqrhbBh80u9i766FWNkiqvz1UMZTv4d+5+M6kLZnTd5gdLbBWqpH6MqXReH2ZBatNIhXN5lToPF4iN14SrE4UtyNcL2i5XEyp248pbzYbO9QjHwReeDLpguzWbQ8Lo8qp3vFD8PCEhunO36C84tWgiUuL+j16tqfPg2TVWxiT8e9yOUdozk9RL/e2qvVfzCc//sb6h8M5KF8sj0fT6f5i6/+Hz/xRDR/HvL9Hw==);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="293" y="501" width="16" height="15" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="70">
<mxCell style="vsdxID=89;fillColor=#FFFFFF;gradientColor=none;shape=stencil(lZbbchoxDIafZm81luXjdZq+R6YhhSmFDCEteftouz5JDBt6twhrP1v69a8nenjbPr1uJmvezqfjr83f3fN5O9G3ydrdYbs57c78NNHjRA8vx9Pm5+n4fnhefr8+zSvnp9/HP/MbLktezpDdnGXNxxKxGYj+Rb4vCT/eT0sGLgvQmJJQApYghyV0seW1EVwsq0oIE5TIhcoiC8GXRSWEDtCuwVOEZCU+g3eSngykLOkekpP0yHSSdAK3evLggJKEIxgr4d4DkoQbSXYesiIbcHmNTAGiOraBHCXZxt7LGmqRCuc8HyQ8AMbVhhNgnlTNVckjeCvRnBVVw7m5SaJnUaQ1NnfST1ptJaXBjTp0BkuSjL18tdcOPK6WHJyTZMpX5AghSLhzENSxuRJZwl2CsCpzPjeqc3sLXtFt6gXt6nOq4xTBqLL7AEmUfb87DKYwZhSJBAirfSIeBJIbDgm82m8Ai3K/Ea/2y5UnVa/owbgv6tVUXUKRa6xEihmULSRbz9XxWIXR8ClUdd/CU7WtPiEGSM9n0Pg8aLl2y4JVpphD1fOt4rMMUeFTl2FXpq5+s/JK993P2oiWNTfY/tqQ+1tt802nLHHcX7WhPl53n5yFgWpK87U/sBSycqexPbXLpnvYvY1n/aCS/SipqjK8+hqO6qQeUp3/Uve8QFd/nKg2ZBI+TCa1DmX9VdAjLz1izGimQqvfkcgp6vPpXVNuK1bvXzM1rGXodwcDJsoNu1Dd8Aaf1UTKJBwCqe8334iSEguxqaLiD/emahz64iQLdsdN678T+KFf7F52+/1yLxz/1xdBDi2XSHr8BA==);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="274" y="500" width="19" height="34" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="71">
<mxCell style="vsdxID=90;fillColor=#5ea0ef;gradientColor=none;shape=stencil(jVLbDoIwDP2avZLRBonPiP9BZMgiMjJA4e9lKYatBsNbL+fs9HQVmPV10SkBsh+seai3Loda4EUA6LZWVg9LJDAXmFXGqrs1Y1tS3hUO6aKnebkXJuIl0lFAzpTGkvIrYW+jJXBM7TSNTrAS4pAhJ2CFGTZSvGKQYzAYY0d2g68FgAjPoaw/2lqSoWjCNP9KegpfUeaTufRHwhBxyCNz6C/tV2Hmu97zyP6z0e3hv1+C7Wgq3TR0c36fH9lSogPF/AM=);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="278" y="504" width="11" height="11" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="&lt;div style=&quot;font-size: 1px&quot;&gt;&lt;p style=&quot;text-align:left;margin-left:0;margin-right:0;margin-top:0px;margin-bottom:0px;text-indent:0;vertical-align:middle;direction:ltr;&quot;&gt;&lt;font style=&quot;font-size:16.93px;font-family:Oracle Sans;color:#000000;direction:ltr;letter-spacing:0px;line-height:120%;opacity:1&quot;&gt;Azure Load Balancer&lt;br/&gt;&lt;/font&gt;&lt;/p&gt;&lt;/div&gt;" tags="Background" id="72">
<mxCell style="verticalAlign=middle;align=left;overflow=width;vsdxID=91;fillColor=none;gradientColor=none;shape=stencil(nZBLDoAgDERP0z3SIyjew0SURgSD+Lu9kMZoXLhwN9O+tukAlrNpJg1SzDH4QW/URgNYgZTkjA4UkwJUgGXng+6DX1zLfmoymdXo17xh5zmRJ6Q42BWCfc2oJfdAr+Yv+AP9Cb7OJ3H/2JG1HNGz/84klThPVCc=);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="205" y="545" width="321" height="20" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="73">
<mxCell style="vsdxID=94;fillColor=#b77af4;gradientColor=#773adc;shape=stencil(lZHdDsIgDIWfhltSfgxwPed7LBkT4oSF4d/bC5LFqXHOu9P2a3PSg1g1mmbQiMIYgz/oi22jQWyLKLXO6GBjUojViFWdD3of/Mm1pR6aTGZ19Od84Vr2uMKK5C0Kt9KBR7UrcG/dDIYXkADe0LWwFFiq7/CnDQILRqbhBAuBiVyPE4U5/8fMgpUfcBLP13e270ty8/l7VKlVYmb1HQ==);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="262" y="294" width="20" height="17" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="74">
<mxCell style="vsdxID=95;fillColor=#341a6e;gradientColor=none;shape=stencil(nZPLDoMgEEW/hi1hwAeurf0PE7WSWjFoX39fKGkqGrF0N8OcIXduchHLx7YcakTJOCl5ru+imlrEDohS0be1EpOuECsQyxup6pOS176y/VAa0lQXeTM/POweMRuUPG2XYf7ujxbtRL+J8tTHAnHpT/8T7EH/lrtAXRMiis1sfh14r4swZA6fcpyE8ODl13ogiPar3+ddd3iMObh8gqPt/2OGE+byLIzXfnn0r/UA+NwM1b/P6+Kbp0Z0nY3jfL7Mn36y2WXFCw==);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="262" y="295" width="10" height="17" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="75">
<mxCell style="vsdxID=96;fillColor=#b77af4;gradientColor=#773adc;shape=stencil(jZHNDoMgEISfhitBkApna9/DRCykFAxif96+kI2pNSnxNsN+u5kwiLWz7ieFKJlj8Df1NEPUiJ0RpcZpFUxMCrEOsXb0QV2DX9wAfuozmdXdP/KFF+xxklcoeYMFdwHSGrchf8GKYE6PwqLBQv6H+f50IcU6XOHmhKU4jlcS1/XhJIUcJTKJ73ePxlpoazvf15OeoFrWfQA=);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="284" y="295" width="20" height="17" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="76">
<mxCell style="vsdxID=97;fillColor=#341a6e;gradientColor=none;shape=stencil(ndNLDoMgEAbg07AlwFDEtbX3MBErqRWD9nX7aknTohFLdzP6MfkhGQRZXxedQoz0gzUnddPlUCPYI8Z0Wyurh7FCkCPIKmPV0ZpLW7q+KyY5VWdznSbc3TkynWDk4boUy1d/cLTR7SqVSchS4ut3/xMO0L/jzqj/CJxhmvi3o8HbAU655xOJRYynQb/MQ6N0OP22919HCkxmXmC+Pn8HWAjfQ5ynPJR/mYfS0PzY/Nt+LD77VOmmcev4/X++f+Mnt7uQPwE=);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="284" y="295" width="10" height="17" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="77">
<mxCell style="vsdxID=98;fillColor=#b77af4;gradientColor=#773adc;shape=stencil(lZHdDsIgDIWfhltSfgxwPed7LBkT4oSF4d/bC5LFqXHOu9P2a3PSg1g1mmbQiMIYgz/oi22jQWyLKLXO6GBjUojViFWdD3of/Mm1pR6aTGZ19Od84Vr2uMKK5C0Kt9KBR7UrcG/dDIYXkADe0LWwFFiq7/CnDQILRqbhBAuBiVyPE4U5/8fMgpUfcBLP13e270ty8/l7VKlVYmb1HQ==);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="252" y="313" width="20" height="17" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="78">
<mxCell style="vsdxID=99;fillColor=#341a6e;gradientColor=none;shape=stencil(nZPdDoMgDIWfhlsCFJFdu+09TMRJ5sSg+3v7ybjY0Ihjd2352pyWHATF0JS9QowMozVnddfV2CDYI8Z01yirxylCcEBQ1MaqkzXXrvJ5XzrSRRdzcxMevo+4DkaePqME83fh6NlWd6uszLFcZymZTya/wxH0f71zNrwDp1iKcD+GRUQyYMkDPt9hlsLTKL/UQ0Vs11T923x4H5lhSRP+PwMsIOR5Gk+z2L5LPZTF7pmqf5ufgo+pat223pPf73MTTiVvYDi8AA==);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="252" y="313" width="10" height="17" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="79">
<mxCell style="vsdxID=100;fillColor=#b77af4;gradientColor=#773adc;shape=stencil(jZHNCsMgEISfZq9itGJ7TtP3CMRUqdVgTH/evsoSmgYq3mbcb5fBAd7Oup8UMDrH4G/qaYaogZ+BMeO0CiYmBbwD3o4+qGvwixvQT30ms7r7R77wwj1B8wqjb7ToLkha4zbkL9hQImrZoySS/YfF/nIhxDpcYSkJ5fV4cyKH6iCFGCUyie9nj8Za7Go735eTnrBY3n0A);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="274" y="313" width="20" height="17" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="80">
<mxCell style="vsdxID=101;fillColor=#341a6e;gradientColor=none;shape=stencil(nZNNDoMgEIVPw5YwgIJr297DRKykVozav9tXSpoWjVi6mwffTN5M8hDLh7roFKJkGHtzUjddjjViO0SpbmvV63GqENsjllemV8feXNrS6a6wpK3O5mon3F0fsR2UPJzKcPrSB4c2ul1FpcBynQXi02/9ExxA/7Y7Q/0jcIoJ+NtBcDuGZebxQmIew0OQX/qBJLRqrP9t3r+PTLAQPp9iuj4/YZjPeBbHAw/tu/QDELpnrP9tfio+iap007hAfv/PEzg9ufSy/RM=);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="274" y="313" width="10" height="17" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="81">
<mxCell style="vsdxID=102;fillColor=#b77af4;gradientColor=#773adc;shape=stencil(lZHdDsIgDIWfhltSfgxwPed7LBkT4oSF4d/bC5LFqXHOu9P2a3PSg1g1mmbQiMIYgz/oi22jQWyLKLXO6GBjUojViFWdD3of/Mm1pR6aTGZ19Od84Vr2uMKK5C0Kt9KBR7UrcG/dDIYXkADe0LWwFFiq7/CnDQILRqbhBAuBiVyPE4U5/8fMgpUfcBLP13e270ty8/l7VKlVYmb1HQ==);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="295" y="313" width="20" height="17" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="82">
<mxCell style="vsdxID=103;fillColor=#341a6e;gradientColor=none;shape=stencil(nZPdDoMgDIWfhlsCBRWv3fYeJuIkc2LU/b39ZFxMMOLYXUu/NueUFLFibMpeIiDjNOiLfKhqahA7IADVNXJQ0xwhdkSsqPUgz4O+dZXN+9KQJrrqu5nwtH3EdAB52YwSnH4eTpZtVbfJigyLbZYSfzL5HQ6g/+v1WXcPHLCpLf1B0B/HNHf4LMc8hqdBfq2HpiGvsfr3eXc/IsGC+v8P2/MThlPm8jyOp0nI71oPhdA+Y/Xv83PwPapata29yWXdP8L5yR4wO74B);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="295" y="313" width="10" height="17" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="83">
<mxCell style="vsdxID=104;fillColor=#b77af4;gradientColor=#773adc;shape=stencil(lZHdDsIgDIWfhlvCX2Rcz/keS8aEiLAw/Ht7wWZxapzz7rT92pz0IF6Pph00YmRMMRz0xXbJIL5FjFlvdLQpK8QbxOs+RL2P4eQ7qIe2kEUdw7lcuMKeUFjRssXIDTrkUe0AdtbPYPICUoI5WwtXEsvv7KcLShZ8TMMJlhusqvU4VViIf8wsWPkBZ/H8fG+dg+Dm8/ekcgtS5s0d);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="262" y="332" width="20" height="17" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="84">
<mxCell style="vsdxID=105;fillColor=#341a6e;gradientColor=none;shape=stencil(pZPdDoMgDIWfhtuGgoJcu+09TNRJ5tSo+3v7yVgy0Ugku2vL+aCnoYSnQ5V1BWF0GPv2Ujx0PlaEHwhjuqmKXo9TRPiR8LRs++Lct7cmt3mXGaWJru3d3PC0HDUEoy+bIQLln8rJimvdbIoTCVJti5Eu7v7mu8Qe6R8dr8TuLCIG5mxukQH1WYwAlQPIBGQUAqAC4Xlh3RIKUB7DwR52AO6UkhgSdAEBArdfiDkI7gJTRYQAGIPyjHXdEjLv3wz2sAOYgt+Slbqu7Y7Oz5dLOZXsQvPjGw==);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="262" y="332" width="10" height="17" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="85">
<mxCell style="vsdxID=106;fillColor=#b77af4;gradientColor=#773adc;shape=stencil(lZHdDsIgDIWfhltSfgxwPed7LBkT4oSF4d/bC5LFqXHOu9P2a3PSg1g1mmbQiMIYgz/oi22jQWyLKLXO6GBjUojViFWdD3of/Mm1pR6aTGZ19Od84Vr2uMKK5C0Kt9KBR7UrcG/dDIYXkADe0LWwFFiq7/CnDQILRqbhBAuBiVyPE4U5/8fMgpUfcBLP13e270ty8/l7VKlVYmb1HQ==);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="284" y="333" width="20" height="17" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="86">
<mxCell style="vsdxID=107;fillColor=#341a6e;gradientColor=none;shape=stencil(nZPbDoMgDIafhlsC1AO7dtt7mIiTzIlBd3r7wcgy0Yhjd/3p1/K3SREUQ1P2AjEyjFqdxV1WY4NgjxiTXSO0HE2E4ICgqJUWJ62uXeV0X1rSRhd1sx0ero7YCkaeTu0wf+ujQ1vZraI8D7GU+PRH/wQH0L/tzlB/CQnDNjedjgXsJphyj845zmJ4GuSXbmgaGjTO/Rbtb4abn6lPZzhZ754CzsDnIY432wrMuvRDaWiXsf63eRN8b6mWbetOcZqf3555cncLhxc=);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="284" y="333" width="10" height="17" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="&lt;div style=&quot;font-size: 1px&quot;&gt;&lt;p style=&quot;text-align:left;margin-left:0;margin-right:0;margin-top:0px;margin-bottom:0px;text-indent:0;vertical-align:middle;direction:ltr;&quot;&gt;&lt;font style=&quot;font-size:16.93px;font-family:Oracle Sans;color:#000000;direction:ltr;letter-spacing:0px;line-height:120%;opacity:1&quot;&gt;Azure Kubernetes&lt;br/&gt;&lt;/font&gt;&lt;/p&gt;&lt;/div&gt;" tags="Background" id="87">
<mxCell style="verticalAlign=middle;align=left;overflow=width;vsdxID=109;fillColor=none;gradientColor=none;shape=stencil(nZBLDoAgDERP0z3SIyjew0SURgSD+Lu9kMZoXLhwN9O+tukAlrNpJg1SzDH4QW/URgNYgZTkjA4UkwJUgGXng+6DX1zLfmoymdXo17xh5zmRJ6Q42BWCfc2oJfdAr+Yv+AP9Cb7OJ3H/2JG1HNGz/84klThPVCc=);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="216" y="354" width="270" height="20" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="&lt;div style=&quot;font-size: 1px&quot;&gt;&lt;p style=&quot;text-align:left;margin-left:0;margin-right:0;margin-top:0px;margin-bottom:0px;text-indent:0;vertical-align:middle;direction:ltr;&quot;&gt;&lt;font style=&quot;font-size:16.93px;font-family:Oracle Sans;color:#000000;direction:ltr;letter-spacing:0px;line-height:120%;opacity:1&quot;&gt;Services&lt;br/&gt;&lt;/font&gt;&lt;/p&gt;&lt;/div&gt;" tags="Background" id="88">
<mxCell style="verticalAlign=middle;align=left;overflow=width;vsdxID=110;fillColor=none;gradientColor=none;shape=stencil(nZBLDoAgDERP0z3SIyjew0SURgSD+Lu9kMZoXLhwN9O+tukAlrNpJg1SzDH4QW/URgNYgZTkjA4UkwJUgGXng+6DX1zLfmoymdXo17xh5zmRJ6Q42BWCfc2oJfdAr+Yv+AP9Cb7OJ3H/2JG1HNGz/84klThPVCc=);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="252" y="371" width="135" height="20" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="89">
<mxCell style="vsdxID=112;fillColor=#FFFFFF;gradientColor=none;shape=stencil(nZBLDoAgDERP0z3SIyjew0SURgSD+Lu9kMZoXLhwN9O+tukAlrNpJg1SzDH4QW/URgNYgZTkjA4UkwJUgGXng+6DX1zLfmoymdXo17xh5zmRJ6Q42BWCfc2oJfdAr+Yv+AP9Cb7OJ3H/2JG1HNGz/84klThPVCc=);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="576" y="111" width="345" height="192" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="90">
<mxCell style="vsdxID=113;fillColor=none;gradientColor=none;shape=stencil(nZBLDoAgDERP0z3SIyjew0SURgSD+Lu9kMZoXLhwN9O+tukAlrNpJg1SzDH4QW/URgNYgZTkjA4UkwJUgGXng+6DX1zLfmoymdXo17xh5zmRJ6Q42BWCfc2oJfdAr+Yv+AP9Cb7OJ3H/2JG1HNGz/84klThPVCc=);dashed=1;dashPattern=1.00 2.00;strokeColor=#706e6f;strokeWidth=2;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="576" y="111" width="345" height="192" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="91">
<mxCell style="vsdxID=115;fillColor=#FFFFFF;gradientColor=none;shape=stencil(nZBLDoAgDERP0z3SIyjew0SURgSD+Lu9kMZoXLhwN9O+tukAlrNpJg1SzDH4QW/URgNYgZTkjA4UkwJUgGXng+6DX1zLfmoymdXo17xh5zmRJ6Q42BWCfc2oJfdAr+Yv+AP9Cb7OJ3H/2JG1HNGz/84klThPVCc=);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="866" y="107" width="47" height="6" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="92">
<mxCell style="vsdxID=117;fillColor=#86d633;gradientColor=#5e9624;shape=stencil(jVLtDoIwDHya/SWjDfIAiO9BZMgiMjJA4e1lKYatBMO/ftztel0FZn1ddEqA7Adrnuqjy6EWeBUAuq2V1cMSCcwFZpWx6mHN2JaUd4VDuuhl3u6FiXiJdBSQM6WxpPxG2PtoCRxTO02jC66EOGTICVhhhh1pQo7BYIwD2Q2+FgAiTENZf7S1JEPRhGn+lfQUfqLMJ3Ppj4Qh4pRH5tBf2l5h5rs+8sj+s9Ht6b9fgu1oKt00dHN+nx/ZUqIDxfwL);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="897" y="108" width="5" height="5" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="93">
<mxCell style="vsdxID=118;fillColor=#86d633;gradientColor=#5e9624;shape=stencil(lVJBDoIwEHxNr6TdjRLPiP8wAtKIlBRQ+L3UhdCukehtO51hdsoITNry3OQCZNtZc8ufOutKgUcBoOsyt7qbJoGpwKQwNr9a09cZnZuzY7rpbh7uCwPpdjKSyqlAjoQoKd/nE9EvvSW+ous4jvaLQIUKOQADRlhFOHOQc3DZZMt2pc8AQIRxaOuvNkMyNPXTos/44upMDqEvi8qC+lthyPgpJgvpvxt8rsSfeyMm+6uVrv8pwTSsBSp0VVH//HteuAmismL6Ag==);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="888" y="108" width="5" height="5" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="94">
<mxCell style="vsdxID=119;fillColor=#86d633;gradientColor=#5e9624;shape=stencil(jVLbDoIwDP2avZLRBonPiP9BZMgiMjJA4e9lKQlbCYa3Xs7Z6ekqMOvrolMCZD9Y81JfXQ61wJsA0G2trB6WSGAuMKuMVU9rxrakvCsc0kVv83EvTMRLpKOAnCmNJeV3wj5GS+CY2mkaXXAlxCFDTsAKM+xIE3IMBmMcyG7wtQAQYRrK+qOtJRmKJkzzr6RTuIaizCdz6Y+EIeKUR+bQXxrsR+K7PvLI/rPR7em/X4LtaCrdNHRzfp8f2VKiA8X8Bw==);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="879" y="108" width="5" height="5" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="95">
<mxCell style="vsdxID=120;fillColor=#50e6ff;gradientColor=none;shape=stencil(jZPRksIgDEW/htcMSUoLz677H47WLWO3dbCu7t8vXWiFjnV8C+FecgJB8ObS7M61IHkZXH+qb/YwNII/BJHtmtrZwUeCt4I3x97VX66/doewPu9G5Rh99z/jCffgMxpUNbpI/oaM1qDNf+YzGFrbJQZdARaZAaVM5furCwUwGhRUGA2YO+SdooZAl1FDSw1HDUJBUcMzfInrqP5QlZH6DNErVrngNFConFQuKHm6rJkzqTphQkXrlFgAmQxTroufPBeCUa96mi9y6kozMOddPTTTg5SAmPeVlua3RuWN2fLBYzKPtm3DYKf7y0n2qfALePsH);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="869" y="108" width="14" height="15" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="96">
<mxCell style="vsdxID=121;fillColor=#1490df;gradientColor=none;shape=stencil(jZPRcsIgEEW/htcd2E1geVb7H06NDdOYOBhb/XuTQkbAavu2XA7s3eEiaHVqt8dGoDyNfvhsvt1ubAWtBaLr28a7caoEbQSt9oNvPvxw7ndhfdzO5Fwdhq/5hks4xwYI51Mor0FRQPZHeAt85/qEtwy1zXmEOuXfzz40UHFfysgvAgHHKy5YMougQZvI0GPnKCkGqZ97VTVUhdfY51e8AqSMZl6MPhmtGIwrMJgPVoxlLCidj5V0jYrRL1+AJSC/fLHSJivQNrcqc5uT81rlVmVuM80J/ScofwdrKu6p3LuuC6FO98sUT1L4AbS5AQ==);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="869" y="98" width="14" height="15" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="97">
<mxCell style="vsdxID=122;fillColor=#50e6ff;gradientColor=none;shape=stencil(lZLRksIgDEW/htcMJNLCs6v/4Wzrltlu62B19e9tN6AUp+v4Fm4uyRm4gtbHZneoBcrj4Pvv+tdVQyPoQyC6rqm9G8ZK0EbQet/7+sv3p67i82E3Oafqpz9PEy58zxSg1HQL5ZUV+Xfasrl1XWK2GgzNzBZKTP2fJ8/TFfeVlMEfBQJjWbpg7omChdUqeOh5c5AQAXGZNRkSWQ0U6l9YA1JnuJHtDqsBywz37glkCkHPWZ9WZ6xAdoZqyjBhgTR71OQTI2f2pIaAKKN8LA2KkaD1MuVbUXlhHotHIveubTnQaT9P8Chx+mlzAw==);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="897" y="108" width="15" height="15" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="98">
<mxCell style="vsdxID=123;fillColor=#1490df;gradientColor=none;shape=stencil(jZJBcsIwDEVP461Gsmxirym9B1NC42maMCa0cHucyh1i05buLPk5eqN8xetjtz20SuNxiuNb+xl2U6f4SWkdhq6NYUonxRvF6/0Y29c4noad1IftTM6n9/Fj/sJZ3vkGaH6k8SIN58D5r86z8H0YFryzYAueEH+nCUxFezBmyb+couiQAJjxXJIDXEnrrEsil2RBu0zw3dTvjs7WP1sSWF9qAvu/LIkBbWmKpWXS8qY0xcoyLbrWrMaWmne/qlk90sRqnY0HqtZ5Y3LDGWh0qbqYzP9KyeNUpcMtkvvQ95Lo5X0d4dSS+PPmCg==);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="897" y="98" width="14" height="15" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="&lt;div style=&quot;font-size: 1px&quot;&gt;&lt;p style=&quot;text-align:left;margin-left:0;margin-right:0;margin-top:0px;margin-bottom:0px;text-indent:0;vertical-align:middle;direction:ltr;&quot;&gt;&lt;font style=&quot;font-size:16.93px;font-family:Oracle Sans;color:#706e6f;direction:ltr;letter-spacing:0px;line-height:120%;opacity:1&quot;&gt;&lt;b&gt;Primary Database VNet&lt;br/&gt;&lt;/b&gt;&lt;/font&gt;&lt;/p&gt;&lt;/div&gt;" tags="Background" id="99">
<mxCell style="verticalAlign=middle;align=left;overflow=width;vsdxID=124;fillColor=none;gradientColor=none;shape=stencil(nZBLDoAgDERP0z3SIyjew0SURgSD+Lu9kMZoXLhwN9O+tukAlrNpJg1SzDH4QW/URgNYgZTkjA4UkwJUgGXng+6DX1zLfmoymdXo17xh5zmRJ6Q42BWCfc2oJfdAr+Yv+AP9Cb7OJ3H/2JG1HNGz/84klThPVCc=);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="585" y="118" width="355" height="20" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="100">
<mxCell style="vsdxID=126;fillColor=#FFFFFF;gradientColor=none;shape=stencil(nZBLDoAgDERP0z3SIyjew0SURgSD+Lu9kMZoXLhwN9O+tukAlrNpJg1SzDH4QW/URgNYgZTkjA4UkwJUgGXng+6DX1zLfmoymdXo17xh5zmRJ6Q42BWCfc2oJfdAr+Yv+AP9Cb7OJ3H/2JG1HNGz/84klThPVCc=);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="584" y="144" width="329" height="151" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="101">
<mxCell style="vsdxID=127;fillColor=none;gradientColor=none;shape=stencil(nZBLDoAgDERP0z3SIyjew0SURgSD+Lu9kMZoXLhwN9O+tukAlrNpJg1SzDH4QW/URgNYgZTkjA4UkwJUgGXng+6DX1zLfmoymdXo17xh5zmRJ6Q42BWCfc2oJfdAr+Yv+AP9Cb7OJ3H/2JG1HNGz/84klThPVCc=);dashed=1;strokeColor=#706e6f;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="584" y="144" width="329" height="151" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="&lt;div style=&quot;font-size: 1px&quot;&gt;&lt;p style=&quot;text-align:left;margin-left:0;margin-right:0;margin-top:0px;margin-bottom:0px;text-indent:0;vertical-align:middle;direction:ltr;&quot;&gt;&lt;font style=&quot;font-size:16.93px;font-family:Oracle Sans;color:#706e6f;direction:ltr;letter-spacing:0px;line-height:120%;opacity:1&quot;&gt;&lt;b&gt;Delegated subnet&lt;br/&gt;&lt;/b&gt;&lt;/font&gt;&lt;/p&gt;&lt;/div&gt;" tags="Background" id="102">
<mxCell style="verticalAlign=middle;align=left;overflow=width;vsdxID=128;fillColor=none;gradientColor=none;shape=stencil(nZBLDoAgDERP0z3SIyjew0SURgSD+Lu9kMZoXLhwN9O+tukAlrNpJg1SzDH4QW/URgNYgZTkjA4UkwJUgGXng+6DX1zLfmoymdXo17xh5zmRJ6Q42BWCfc2oJfdAr+Yv+AP9Cb7OJ3H/2JG1HNGz/84klThPVCc=);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="592" y="151" width="270" height="20" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="103">
<mxCell style="vsdxID=131;fillColor=#FFFFFF;gradientColor=none;shape=stencil(lZRNcsMgDIVPw1YDEr/rNL1HpnFqpq6dcZw2vX1xgdjQjjPdwfOTPpCQGe0u7eHcMOSXaRzemk9/nFpGTwzR920z+imsGO0Z7U7D2LyOw7U/xv35MDvn1fvwMWe4xTjBgeYg5F9RUAak/lGeo//lOsYAEQ0IVqeIpEgHOiW5YZR4cqQtOXAmOSinIZlMSSEOm2AJ2pZgFIAVWCBwLOFBclTBEYwu6QaU2KITgarowF0Jl3pJWxYig1UolSjBAswW12Duxx1MIEUJtgRWlWB7P0pmu1AtV7E1KLdFdxpcRQ/31lgVnVf9RveLvnhyuw3wzZsvEfkBSKCq4uvzJUkJUPTw5uGZq+K1db5fjYXiYHOfytP8aX88Rf/1h8UysiffdXHi19/rEQ9S/D3Q/hs=);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="629" y="199" width="30" height="41" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="104">
<mxCell style="vsdxID=132;fillColor=#FFFFFF;gradientColor=none;shape=stencil(lZZLctswDIZPoy2GAPhcp8k9Mo1Ta+raGcdp3duXKkVKgGxpvJNhkB/x+smOnz73rx+7jszn5Xz6ufvTv132HX/riPrjfnfuL/mr4+eOn95P592P8+nr+FZ+f7wOnsPXr9PvYYdrWWcTJDesIvO3WAjY/je8FP/vX+eyAMv/LoLlcQW2JVQsVyoW7yH40Wk02dGDy89gwdRtqgloDRwRKEkwGrASHPMmJMHoJDkhYJBkMuDW0MkBkorZS3DykKwEMwFGxfZT8kYTR+C4AU8o4daCS4rPYJLkuxxVkPwYoR688p0DH+b8Q3+cNUjexNTQ9XluLkCEJPwXAB1gABNlfMPJo4zPTgenlgRPMjyGYBfZHRN+B85AKrm5bOQk3IFBCScPRucWkiottTDuwJEgOklH1+pY6RinsKopN36S+HzIpNo6z8Jq4plBdXUeStXXFhupxQ6sRmquItychIzIJtmWnUf9t2TNrCXCmsWImVby6zTOxslMIEQlazmDVQvbgG1UAX0b5grPBVfwXHBSZUAGz5LuAVHCMa0rWx5WLWwOOEi4UbqGrdMqODe6kpU8eBu9v5BUm1VWtb4FZAl32FBNVIGihLtQq3e7m0K9Nqqk5UlZ6b6lBqIxK+4E/qH9k4Eg918EcONSiEGmb56ZeilEiKprhiTrSymBXcrmuNe96hkj6UNT2AW9amSTDlfHdqLzFMnUtHZ1ZGKqV8qkm3kaJD4ysLoyYlvWniGuXSKzeV0dGR8gqvsq64CaV6fSbjYFc6WhNtTsIef8Mb0F3/vDoTwl5//rt2M2lXcnP/8D);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="629" y="198" width="30" height="42" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="105">
<mxCell style="vsdxID=133;fillColor=#2d5967;gradientColor=none;shape=stencil(pZZBctswDEVPoy2GJEiCXKfpPTKNU2vq2hnFadPblyoFioDGSjLdKQihR+AD3xrw7uX48HwYnHm5Tpcfh9/j4/U44JfBufF8PEzjtTwNeD/g3dNlOnyfLq/nx/r388N8cn76efk1v+Gt5mULLs1ZzvypERsh0L/I15rw7XWqGbYeSAjJLykcAloib65GyIHnQ0sIAfNyCGskZAgMX0IWdtk+AjnJNhKMCJ4k2IGV3BIhlFyC4PbAVlGtgxwk2UOMClyaGxUaUJHRQMQ9tJFkzJCzJDtIqmSfIQZJtgbQSXQg8KlHn8ZzNxvBQOIMfoe5fXw7Spv369JyhBxlecGCj7I8pq7V+dbFtTqj2kpg9hU1qrEut9licn8/12YnqDHuC+fr6CV6r1X/nyD3OkVAEgkhgMHbhK3YuaywvZ1gA1jcEOx+yyEq5yhYR7LpadBikxK7LeuqdoK8O2nExa97hOBQkVdzYbXLBCu1y+ajUnve6rxbeAQTlIEQOL3GFoKaNovc0tVB0sZCSl/NroVgUSZLPrUbNf8qNhIkPjQvbZZtgIKkt0M34CE1L2qqr+9dSDHysDV4d0PWHcHSJ0unYpdK+b6prHy5kaq9F2iBpQxWDd670pctoiT5/VCx0fjNr1Y/n2w0yFP+8cEvOar5/UIxviy/mrx+Mbn8zlNYe73y0iM+7UIfSCgP68fM03g61W+h/v/646eE6ocT3v8F);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="629" y="199" width="29" height="40" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="106">
<mxCell style="vsdxID=134;fillColor=#2d5967;gradientColor=none;shape=stencil(pVjbblMxEPyavK5sr6/PBf4DQUsjSotCgfbv2aPEa3us47RC6kNyame8l5lZnwPf/Lr//PP24Myv59PT99u/x6/P9wf+cHDu+Hh/ezo+y6cDfzzwzd3T6fbb6en349fz95+ft5Xbpx9Pf7ZfeDnvy55C3HY583p+wpm2r/L36bzh4fi43OACpdBv+PL7dIawbYu9bLk8cpby+cmLuyziCmteL49sonLZ98KXVabue708sZ44r9BTJi4jupVfiSN88lRG9ESpjODJUBzBA3m3wo6ROI7YTMaP0NGStxA5eR6xQyQbRnBDya7Ag0QJgZsR2cv5IWpDDlLuTYuh5pyYV8jMZBkKTgXCdlFLWRNBzo/Yso0BWqJeplyaJrsR2wZyI7Y8wZRL5BHQt1WQ8+2MQ9JHcvQ7dtg0kYNCGI/rhQnQnUw5jMf1hRKcloobDys9s+4QMwJHpsQjsKECwMmSwQ6hCGlKieKyQ4STELWIhAtQJa8lqei5TJIgPZLsCF+4dv5egxold8Uv0jcgSdL5DuhhjRnRgxmh64I9Tpbavp0YAStjUQ5W2P5wLcV6uLeGncMkR31CK5ht9XRzcSpYaCV8a9VLIQNl79sJc6y60PVlRc9kwAiudnsRCYXoOxa14D1SreMjaz4CaOK7bfP/N4xO7koLb0esMCOyxQANhE1VPlV8TLPvWqJCwY0pEc13QEMrFVlaMwdtPmWDn/yRpUggA9aRAXzvm+dUfOmtZT/61GaONhowiK/4qAenklVoVYEnFZRVMS3VIM5eZbUkil8oY/4lfpD/6Ooc1PC5Fm5vPJGhJ035R6OOScEUXyvb8MXIPOBnWsqRzFNmngu1sE5XQfbFDhmi3xYB+jSWjvzqd1z6zJK9li6GcomRZVCQkCb53mZJcC30jbZkr1edpsHOv1qpEihisroTVqxOKXgn9jFZb9CWd28Y1UvzobZ0NR0F8rHtgQmCRfLHdOQ8MZcbmWs6NqNctq7MPHipyI4CTE92Zq7cRjwObolAOJNoyRLezvDCvzr/KTxX/emtNCJ8UMqplQqX1/hRGVjxg4pNHz4Kt886yWo3+urBFV6uJXad/UIRndw2R2pkKEAGsRIDk8TGK8AXozVuhe9bp+m1Lk1zzKbuMD7KqgDdF5uYKb66654QFb2/9vEDfgqtSWr6/SQGSaZNzH+5kn+5q+MkJeX34FtCIhTCrbFwlJJig2+1eW9/jlXG1pQkPZLi+zbtNi+Z8B3FmX5X8E3rmeplcZqjheoO+k+SPb1UCM0E25Hcsv4yNCeIX4KNEL+kBG+NOVZi9/0XYG7Jae3bMpA4vL0VnaS0/f18jSjKiD0f3JYMM+PoK9ds4n2r5UN7L3Z3fHg4v1br/4/v0eTR+R0cf/wH);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="638" y="203" width="12" height="17" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="107">
<mxCell style="vsdxID=135;fillColor=#2d5967;gradientColor=none;shape=stencil(lZTdUsIwEIWfprdnkt38XqO+ByMgHZEyBRTf3mBSyoah6F1ycpovOdluw7P9er5bNqT2h757X361i8O64aeGqN2ul317SKOGnxuerbp++dZ3x+0iz3fzs/M8+ug+zzuc8ndWwYbzV6S+s6J+Zy/ZvGm3V2Zj4PR98+uxz1vrvMiMYIq9SOqinCgrlExcTEVixMHEWdEOyhVTkQK8n4IHUJRszXCSzSBJ1vEWDVuRySFMkZXEphTIS66GC9WVI4KTYDdeoCjGwtMUWStElnSbzm8rekAVuHWDMsDJgyu6jWBBl7WhPdwQ1HCaiVIKDGv+bvcGloX95jg3BUCos3CXTYYsQiojW4VBMF6mERm6fgs/7HUHH/34yEUyBEfVWygl6eyhSNJHTxFYg+0kO1VTxU61rrRkx/Q3V4WgLVRVCcGCg+RH6Em8d9BV9IwqeJd+RiPhSoKvOxM/bE3/6mMPzGkwtstVu9nkbnu9XrfXJOXWzM8/);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="643" y="212" width="2" height="4" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="&lt;div style=&quot;font-size: 1px&quot;&gt;&lt;p style=&quot;text-align:left;margin-left:0;margin-right:0;margin-top:0px;margin-bottom:0px;text-indent:0;vertical-align:middle;direction:ltr;&quot;&gt;&lt;font style=&quot;font-size:16.93px;font-family:Oracle Sans;color:#000000;direction:ltr;letter-spacing:0px;line-height:120%;opacity:1&quot;&gt;Private&lt;br/&gt;&lt;/font&gt;&lt;/p&gt;&lt;/div&gt;" tags="Background" id="108">
<mxCell style="verticalAlign=middle;align=left;overflow=width;vsdxID=137;fillColor=none;gradientColor=none;shape=stencil(nZBLDoAgDERP0z3SIyjew0SURgSD+Lu9kMZoXLhwN9O+tukAlrNpJg1SzDH4QW/URgNYgZTkjA4UkwJUgGXng+6DX1zLfmoymdXo17xh5zmRJ6Q42BWCfc2oJfdAr+Yv+AP9Cb7OJ3H/2JG1HNGz/84klThPVCc=);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="618" y="244" width="118" height="20" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="&lt;div style=&quot;font-size: 1px&quot;&gt;&lt;p style=&quot;text-align:left;margin-left:0;margin-right:0;margin-top:0px;margin-bottom:0px;text-indent:0;vertical-align:middle;direction:ltr;&quot;&gt;&lt;font style=&quot;font-size:16.93px;font-family:Oracle Sans;color:#000000;direction:ltr;letter-spacing:0px;line-height:120%;opacity:1&quot;&gt;Endpoint&lt;br/&gt;&lt;/font&gt;&lt;/p&gt;&lt;/div&gt;" tags="Background" id="109">
<mxCell style="verticalAlign=middle;align=left;overflow=width;vsdxID=138;fillColor=none;gradientColor=none;shape=stencil(nZBLDoAgDERP0z3SIyjew0SURgSD+Lu9kMZoXLhwN9O+tukAlrNpJg1SzDH4QW/URgNYgZTkjA4UkwJUgGXng+6DX1zLfmoymdXo17xh5zmRJ6Q42BWCfc2oJfdAr+Yv+AP9Cb7OJ3H/2JG1HNGz/84klThPVCc=);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="609" y="261" width="135" height="20" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="110">
<mxCell style="vsdxID=141;fillColor=#FFFFFF;gradientColor=none;shape=stencil(lZbLctswDEW/RlsMCfC5TtP/yDRO7akbZxyndf++cMUnLFHpTqYBHhC8vORED+/7p7fdhOr9cj792P0+PF/2E32ZEA+v+935cOGviR4neng5nXffz6eP1+f599vTLfL29fP06zbDdc4zDpy+ZaH6M49opf79/jqHf/s4z/E6JShQJiXoPkNdcR4gAhdTTBqKEdCnKJqHMIKiFJWGYgBlR3RECKGnRwdker6O4AWeK3I9vgnK9G7hx8Nr06cmeh6wBpxZj1f/FQzY74FVEMOoDwqC7dtgNETbt8EC9V0gA9qKLiBg7NtAw/3XBN736NtGotgBA0HA0YOVW2ABbQ/nopMe1/i83brn60ZbGaZACz4XHoUAbe17rkiDcUMBeiASeAUmCnwscisKBC9WT9x6IcAcswLnDCfgzbT18OE2uzTj02zWjt5kGyDcZBuw8txvwV1R2ADOApPsosvMDkBCcR7CUHDNwcpsAi30xjYaxMIbVSSSRdBixweOw56B2WgXgmWZDkEJZ1Rlglym444IZ2STEL7sMZ+BeiwIzLBJnOOEKzTnLaE8gRLXAvtEVnTBE1jRJfaJ1Lg1PLPkpWSLRRa+AS/5vjSk8BdcYetaChqsXH4oxpr5wVevzUZRPOBaLiFwocdjmWpRKG1GSbCD6ybqaqHCipbvPtXfZoZ1PKrHlqOZE0qXlxNYF309Jmtnpd/tCnQ5Llrsd2DVCrU7DV6L/a6JueE16vN6a2fGeyUP+FTXssbv+9VmpJVuGWibokvXjSxYladUsVAHol5H+W1S7XvLQ22slp/x95e2ZV8NPb4+Len+vUp9zGKvNt+3/FHfxi+H43F+Wrf/y7c0D83vcHr8Cw==);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="781" y="186" width="61" height="53" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="111">
<mxCell style="vsdxID=142;fillColor=#FFFFFF;gradientColor=none;shape=stencil(pVnZcls3DP0avXJIgutzmvxHJnFqTV07ozit8/eFei+3A11SnrxJFMBDYjsAdaIPPx4/f384Wf3j9fLy18O/56+vjyf642Tt+fnx4XJ+5U8n+niiD99eLg9/Xl5+Pn/dvn//fJW8fvr75Z/rDm+bnidlrkpW/9oWrKL0/8KnTfzLz8smb7bfg1be7RoGVPSb3YWiMn4X2pd4ZVd7o31FKxd2oX3JOBXDDJ11UhzRjVcO4KNROo7wJiiTAd+okAE/qBCn+FYZA/hRXJ+lMgF+UskAPinvAT+v7s8CHvCrTsVPXhHgWwaLI35KytGIb7Oyucd/Oj93wZL45+KxbYVK+NyUz2yaMbochhcoOBVoVKjeva1glLGjgim3OjBh5gAeLeiNymBAqxLEL8e9xQCWDmxSxwFUQ8PInVsAVcNN8GUAB31sq168RkAy09N2KqZaPMTxtCErDadlR2o/njaQCLeMzkV8zwdMgB8EvmdvZcDvknIHc0E5sFaTOsB3WmnEl+lOfFnE707ZcgujZXl/ztoM5a63bMlto2wCfCPxOyk68P8YML0GsMVteWXju8Qd7K5VnIZj46riH0k9UVkofQSBaEgFNxqCTGGHA2QmGQuJQFrwDtOHx7qbRN1lqQz4NiyKFpMMBoJla9llIPDBI/AOg2lIRDYJTfH5Gkh70vRsEYO0y6UV4In9DtdvUkeO7+qxkTsXfK4wd+BTqxZ343cZPsF3Cln/BrxTSPpLdO5dwho91g6jg8emh3ItH7UKLXoOTjIP8F4wlovK2xGdfRZGcC7USFi8Yo9LRK+w48BhV/K4v2AYKxhOBvYNgrGCX7pOmkDm9llXnTc06q7Rx7YyoXovautMmAuZ+Q3hRcdz7eAgfLTKQGFMtJC5sl/lADcQPbGE2HHmeORPQZ/k20RT6LMGc5e22LwUmftrRrftpHWQ2LJiLcGpcfExuOxyb4DbRqh3gls5pEjwK1FjsZYtrpW1ckHUuU0QZYna6NVYMWOtrKNPI2pXm6ia0r6E7hG+E9FuZcfYtyCtUcABkSkW+4SV6XnwA7eTvD3P0MBTTvIU+wLKmddw97Ey6KEqeOwopsIeGr9VXzmXv7rS/p5CqmXiOM6qSolxyYrcagXMMDmZsFcNplgqdeE4wRNWly6CW1nV2BBqPaLfmIuKzFGQiT68bVoYM8u6JhOMR8Lk3nnxEBSh4W+8wFB9FKn43TsRSSk6cDzM0J3Gfh674KDU9bsGdeqBs/SU940mi3W4R4ADOxwd4IHEtsGhdmrGTRS4gI254OZTIts1vQ8hYSfj3NToNbrufESS++NgCQq6scGeXdiSCwULbebCRrcUZvWxD4eqME+MFFSEtworH7b4qpCXJoo+PXKviSVh9VTCOgZfZuVTTf9kdjyhshQh8XtoM0Ve0uhzM8/i8hhdpJcPz/Ldrun073Y4BbEUlr3+da8N4POXuP6NrXI9zv9cVwx4Vwvj9oNE4fpjUy3GDv7Q/ln4dn562v6Y6H/HfyJ4afsXgz7+Bw==);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="780" y="186" width="63" height="55" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="112">
<mxCell style="vsdxID=143;fillColor=#2d5967;gradientColor=none;shape=stencil(pVrbctw2DP2afeWIN5B8TtP/yDRO7alrZxyndf6+2llRhHCw4O70bS2DPCCIg5t0ip9+PH75/nAKy4/3t9e/Hv59+vr+eIq/nUJ4enl8eHt6X3+d4udT/PTt9e3hz7fXny9fL39//3KWPP/6+/Wf8w4fl3XJxXxeFJZf24PqyuXJ7xf556cXJu/JNfp/C3J0wViw3CXszv/i8ovQ5o+fb5fz+r6ilm3F9iRtO3yEbYux5/Ykpq7E8hG3Y/lxrO1RXISqEtpHJ6BDGxtvWD4fsUNB7OxSOmJPgMnlcET27Qi7mz0MXQVsV+PXMIENu6oe2xG2jV3DsJowd4MTx+gWceI2uefIrrGfeRHQxfkyha4u1SN0cSZyCmPbbgk4dmK2CbsvC+wcXI1H7MVCzsxMnssP317pRAJWYDKJWzDJu6WZmFSHVl2NI2bxwz+7c0ULtDD2MXIJG5cA9+uTk9hoY29e74odvcDOQGNa/bMK7CyxCX3Lk2nsOi5nYMtzcykLW1LKPjchoaoTyLm5LCwOBlccLNmEUtw6AXIEJ0NkvOoJcmIXdA05JefjEZkgdibGkm7txcZeA0+TfhbBz9YwRyJjrD4u4WMY0SbuUnb05oG546cjeFAcDay+WgOOnu2jhwCJwxdpd4++FjzmSmbFXSEL2yPFlKy1ZtQ9CITdxtLsHl09TjyuyhIhFrhzlv67DwZpdVbX9Sd2nTYvBI+FY2GEk5WKClCgEJwsqMwLNpWaswCq1GgiX2D/ZJpoTRXk71rA8totGhFqZJ/g7juYL4BbDqLc9+YVy/Na0mmkSEmha9rfo8xE+njQDKrHen1vnkn2CtVSPR+7mlgMUZZzNr3J3JuAWNb2xNLVTarTMjLMHpLs2nutCTvE9UZndXYSITRgCC0iigXpIhBAF5ckOJbfFZu8NU/J5FELFAzRW4RsYKtzirT1xSZp1Vcaq7JI0lNQBX2lsfwMXKnp+LY932CfFMoRmdNnb5wMH5+w7chNvxzZsxZTlsM2iLox2IkGouI2EtCl85ggbNLZ3r5Bap11zhXKgIQ1CM+PYbfrzCeGyDWfYHWVx207exP0NxnZS6wD62VIsQiUwVbTgQ6xrDz0VXqiJPSlZRptaAZemRk8btunCixd7MY6IrcIraCV3Bqj5E1OeCeHpuJHhhKrsrcnMqlAG43tBSVws4Jxj25p4WlayYn83bypLJPvkyzRCxUxQGsEHTfLvP3Wq4XKydBRMY8qne9+e3s3QE7OOBZzqhMxCIxNe8ODs6SG87OAMw771AH5zGw5mj8ZfvYLiSgStUsWHt9kNQo+D61iA/LHCuTn5+mWA99QrBTt7hxnIhEnYJF5ELs12SuCd0Q5dYfBCE6UIw4nEqtMDfgCwwnAF70q9EnTkjQVGMqONVzhIrjEpa7bawYfcWCpwAdMqmkBV4kw0bDKFS7epWdze0xqSUS7qIzblKkXGApaGbinNoKkx417zMO0oMBnxVI0GTUmCLmdlzu2ckkNRo34iiabGSYrVYxHQuHMK3sY/YDVs5+MGpWSz8uQq4T7jBWUEsjkDAPcDWNJkm+nRBBLVWEFFppWCcAWbIepEzUTGIkWnMdiqUcR7kcORMl825EjTKH3PcfgXQZ6CkdYwmEkmS6pNIf7nh0DA7w8LeEAdlob8tHAqA1lRc/M2B/NKy6ajJ6VmouU+IPhj8qchzR5c6jwkGDurfCQMPYpPJwdXeEhCWzJQ6zFkYdw2xMelsmEXOFhwf5U4WFpJ3k/koebyO2+UUSgUoZahYAQ8EI5mVPheXN194JZ+1btd77Iz4pdr0LQii9oFI7WWeGtXESVAREZWvGTBqRoncUmhaNVKbyRpFUERoWh04MrFK1YJUiWViVNA02PNz7haJvNRRSSNpxq8qq4d3FZa08kT5scdoCH4nShKS/pCwSJJrOm0r7Kw8/YZ5l2Jr3+GJ9ufXt6fr58+cX/Lz/1Wh9dPhOLn/8D);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="781" y="187" width="60" height="52" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="&lt;div style=&quot;font-size: 1px&quot;&gt;&lt;p style=&quot;text-align:left;margin-left:0;margin-right:0;margin-top:0px;margin-bottom:0px;text-indent:0;vertical-align:middle;direction:ltr;&quot;&gt;&lt;font style=&quot;font-size:16.93px;font-family:Oracle Sans;color:#000000;direction:ltr;letter-spacing:0px;line-height:120%;opacity:1&quot;&gt;Oracle Autonomous&lt;br/&gt;&lt;/font&gt;&lt;/p&gt;&lt;/div&gt;" tags="Background" id="113">
<mxCell style="verticalAlign=middle;align=left;overflow=width;vsdxID=145;fillColor=none;gradientColor=none;shape=stencil(nZBLDoAgDERP0z3SIyjew0SURgSD+Lu9kMZoXLhwN9O+tukAlrNpJg1SzDH4QW/URgNYgZTkjA4UkwJUgGXng+6DX1zLfmoymdXo17xh5zmRJ6Q42BWCfc2oJfdAr+Yv+AP9Cb7OJ3H/2JG1HNGz/84klThPVCc=);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="736" y="244" width="287" height="20" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="&lt;div style=&quot;font-size: 1px&quot;&gt;&lt;p style=&quot;text-align:left;margin-left:0;margin-right:0;margin-top:0px;margin-bottom:0px;text-indent:0;vertical-align:middle;direction:ltr;&quot;&gt;&lt;font style=&quot;font-size:16.93px;font-family:Oracle Sans;color:#000000;direction:ltr;letter-spacing:0px;line-height:120%;opacity:1&quot;&gt;Database Primary&lt;br/&gt;&lt;/font&gt;&lt;/p&gt;&lt;/div&gt;" tags="Background" id="114">
<mxCell style="verticalAlign=middle;align=left;overflow=width;vsdxID=146;fillColor=none;gradientColor=none;shape=stencil(nZBLDoAgDERP0z3SIyjew0SURgSD+Lu9kMZoXLhwN9O+tukAlrNpJg1SzDH4QW/URgNYgZTkjA4UkwJUgGXng+6DX1zLfmoymdXo17xh5zmRJ6Q42BWCfc2oJfdAr+Yv+AP9Cb7OJ3H/2JG1HNGz/84klThPVCc=);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="744" y="261" width="270" height="20" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="115">
<mxCell style="vsdxID=147;fillColor=#312d2a;gradientColor=none;shape=stencil(pVbbcsIgEP2avO7AAiE8W/sfTo01U5s4UVv79yWFJFwkmOkbrmc5Z6+hYJvLcXeuCySXa9991N/N/nos2EuB2LTHum+u+lSwbcE2h66v3/vu1u7N7/NuQA6nz+5ruOFu/JQCKQYvJD/GIjhI/md5NQ5vt954UAOghFgHaxAIFI3pjiHGGriEqrIYFlNbExeApct9alpXrIASPbE4GhJatQeTvlriK1UcVOlrJYFOnRBfZpaVAxdBjgBZRDyBRhPwMEcRN0UgaiFF1RywZSYL6Pl6Y6gkKLoyNEVAYD42TSVzwSkJrMrQT9UK23Eid2oetuNE7XRSijtIVX5QVjv4o0gAfXw0DWE2gjl0Z8xv5TEP7qSyiJU9FRcf0zTKzBaNQ8kyNRNAeKZkuqorm0WACFvVaUKMQGP/OP2c4o7mxM8RnSPOD+F8eWLCn4hrXhzJsJwNlIoqt9ecKj1epk6lH+9Sp3kSnH5u8jOxFh99/lD5DsxmJXG/pP+Bi9KuvNTKCNSsxS/LyeP1YX4pHJrTyTw03P/Dl4U2mVcJ2/4C);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="413" y="199" width="163" height="15" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="116">
<mxCell style="vsdxID=148;fillColor=#312d2a;gradientColor=none;shape=stencil(nVRdc4MgEPw1vt7AHZ/Pafo/Mo2pTq1mjGntvy8WawUmMvYN1112uYMr6HCrTteyQHYb+u6t/KzPQ1XQU4FYt1XZ14NbFXQs6HDp+vK17+7t2X9fTxNzWr13H9MOo9dZC0ZOKmRfHpECtPhBnr3g5d57BfcEztgsmAGJwNFDI8acGRAajJk5lFrPkJCAau3d1O06rAYSQVgEhVtZnYLbMC0Lk1oFVoRZWZRTgTZhzqytAkVRkQApcV5IvxCIuEipOUdgdqNIFhgPO8o22Kv9PWI0WL7zcJaBxPzp3M3S2eNNTTYZ/6Vj8ZVc3Fd9j6/kSOlteuSdlDb3WHYLkucodSAQBPTYgP2bK13lN4NHOfbyt7Pk+W7xN7MuddP4kbf+H884B/n5SMdv);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="844" y="199" width="268" height="15" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="117">
<mxCell style="vsdxID=150;fillColor=#dae8fc;gradientColor=none;shape=stencil(nZBLDoAgDERP0z3SIyjew0SURgSD+Lu9kMZoXLhwN9O+tukAlrNpJg1SzDH4QW/URgNYgZTkjA4UkwJUgGXng+6DX1zLfmoymdXo17xh5zmRJ6Q42BWCfc2oJfdAr+Yv+AP9Cb7OJ3H/2JG1HNGz/84klThPVCc=);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="444" y="200" width="102" height="14" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="&lt;div style=&quot;font-size: 1px&quot;&gt;&lt;p style=&quot;text-align:left;margin-left:0;margin-right:0;margin-top:0px;margin-bottom:0px;text-indent:0;vertical-align:middle;direction:ltr;&quot;&gt;&lt;font style=&quot;font-size:14.82px;font-family:Oracle Sans;color:#312d2a;direction:ltr;letter-spacing:0px;line-height:120%;opacity:1&quot;&gt;VNET Peering&lt;br/&gt;&lt;/font&gt;&lt;/p&gt;&lt;/div&gt;" tags="Background" id="118">
<mxCell style="verticalAlign=middle;align=left;overflow=width;vsdxID=151;fillColor=none;gradientColor=none;shape=stencil(nZBLDoAgDERP0z3SIyjew0SURgSD+Lu9kMZoXLhwN9O+tukAlrNpJg1SzDH4QW/URgNYgZTkjA4UkwJUgGXng+6DX1zLfmoymdXo17xh5zmRJ6Q42BWCfc2oJfdAr+Yv+AP9Cb7OJ3H/2JG1HNGz/84klThPVCc=);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="449" y="199" width="177" height="17" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="119">
<mxCell style="vsdxID=152;fillColor=#312d2a;gradientColor=none;shape=stencil(pVbbcsIgEP2avO7AAiE8W/sfTo01U5s4UVv79yWFJFwkmOkbrmc5Z6+hYJvLcXeuCySXa9991N/N/nos2EuB2LTHum+u+lSwbcE2h66v3/vu1u7N7/NuQA6nz+5ruOFu/JQCKQYvJD/GIjhI/md5NQ5vt954UAOghFgHaxAIFI3pjiHGGriEqrIYFlNbExeApct9alpXrIASPbE4GhJatQeTvlriK1UcVOlrJYFOnRBfZpaVAxdBjgBZRDyBRhPwMEcRN0UgaiFF1RywZSYL6Pl6Y6gkKLoyNEVAYD42TSVzwSkJrMrQT9UK23Eid2oetuNE7XRSijtIVX5QVjv4o0gAfXw0DWE2gjl0Z8xv5TEP7qSyiJU9FRcf0zTKzBaNQ8kyNRNAeKZkuqorm0WACFvVaUKMQGP/OP2c4o7mxM8RnSPOD+F8eWLCn4hrXhzJsJwNlIoqt9ecKj1epk6lH+9Sp3kSnH5u8jOxFh99/lD5DsxmJXG/pP+Bi9KuvNTKCNSsxS/LyeP1YX4pHJrTyTw03P/Dl4U2mVcJ2/4C);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="413" y="478" width="163" height="15" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="120">
<mxCell style="vsdxID=154;fillColor=#dae8fc;gradientColor=none;shape=stencil(nZBLDoAgDERP0z3SIyjew0SURgSD+Lu9kMZoXLhwN9O+tukAlrNpJg1SzDH4QW/URgNYgZTkjA4UkwJUgGXng+6DX1zLfmoymdXo17xh5zmRJ6Q42BWCfc2oJfdAr+Yv+AP9Cb7OJ3H/2JG1HNGz/84klThPVCc=);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="444" y="479" width="102" height="14" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="&lt;div style=&quot;font-size: 1px&quot;&gt;&lt;p style=&quot;text-align:left;margin-left:0;margin-right:0;margin-top:0px;margin-bottom:0px;text-indent:0;vertical-align:middle;direction:ltr;&quot;&gt;&lt;font style=&quot;font-size:14.82px;font-family:Oracle Sans;color:#312d2a;direction:ltr;letter-spacing:0px;line-height:120%;opacity:1&quot;&gt;VNET Peering&lt;br/&gt;&lt;/font&gt;&lt;/p&gt;&lt;/div&gt;" tags="Background" id="121">
<mxCell style="verticalAlign=middle;align=left;overflow=width;vsdxID=155;fillColor=none;gradientColor=none;shape=stencil(nZBLDoAgDERP0z3SIyjew0SURgSD+Lu9kMZoXLhwN9O+tukAlrNpJg1SzDH4QW/URgNYgZTkjA4UkwJUgGXng+6DX1zLfmoymdXo17xh5zmRJ6Q42BWCfc2oJfdAr+Yv+AP9Cb7OJ3H/2JG1HNGz/84klThPVCc=);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="449" y="478" width="177" height="17" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="122">
<mxCell style="vsdxID=157;fillColor=#FFFFFF;gradientColor=none;shape=stencil(nZBLDoAgDERP0z3SIyjew0SURgSD+Lu9kMZoXLhwN9O+tukAlrNpJg1SzDH4QW/URgNYgZTkjA4UkwJUgGXng+6DX1zLfmoymdXo17xh5zmRJ6Q42BWCfc2oJfdAr+Yv+AP9Cb7OJ3H/2JG1HNGz/84klThPVCc=);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="576" y="390" width="345" height="192" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="123">
<mxCell style="vsdxID=158;fillColor=none;gradientColor=none;shape=stencil(nZBLDoAgDERP0z3SIyjew0SURgSD+Lu9kMZoXLhwN9O+tukAlrNpJg1SzDH4QW/URgNYgZTkjA4UkwJUgGXng+6DX1zLfmoymdXo17xh5zmRJ6Q42BWCfc2oJfdAr+Yv+AP9Cb7OJ3H/2JG1HNGz/84klThPVCc=);dashed=1;dashPattern=1.00 2.00;strokeColor=#706e6f;strokeWidth=2;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="576" y="390" width="345" height="192" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="124">
<mxCell style="vsdxID=160;fillColor=#FFFFFF;gradientColor=none;shape=stencil(nZBLDoAgDERP0z3SIyjew0SURgSD+Lu9kMZoXLhwN9O+tukAlrNpJg1SzDH4QW/URgNYgZTkjA4UkwJUgGXng+6DX1zLfmoymdXo17xh5zmRJ6Q42BWCfc2oJfdAr+Yv+AP9Cb7OJ3H/2JG1HNGz/84klThPVCc=);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="866" y="387" width="47" height="6" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="125">
<mxCell style="vsdxID=162;fillColor=#86d633;gradientColor=#5e9624;shape=stencil(jVLtDoIwDHya/SWjDfIAiO9BZMgiMjJA4e1lKYatBMO/ftztel0FZn1ddEqA7Adrnuqjy6EWeBUAuq2V1cMSCcwFZpWx6mHN2JaUd4VDuuhl3u6FiXiJdBSQM6WxpPxG2PtoCRxTO02jC66EOGTICVhhhh1pQo7BYIwD2Q2+FgAiTENZf7S1JEPRhGn+lfQUfqLMJ3Ppj4Qh4pRH5tBf2l5h5rs+8sj+s9Ht6b9fgu1oKt00dHN+nx/ZUqIDxfwL);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="897" y="387" width="5" height="5" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="126">
<mxCell style="vsdxID=163;fillColor=#86d633;gradientColor=#5e9624;shape=stencil(lVJBDoIwEHxNr6TdjRLPiP8wAtKIlBRQ+L3UhdCukehtO51hdsoITNry3OQCZNtZc8ufOutKgUcBoOsyt7qbJoGpwKQwNr9a09cZnZuzY7rpbh7uCwPpdjKSyqlAjoQoKd/nE9EvvSW+ous4jvaLQIUKOQADRlhFOHOQc3DZZMt2pc8AQIRxaOuvNkMyNPXTos/44upMDqEvi8qC+lthyPgpJgvpvxt8rsSfeyMm+6uVrv8pwTSsBSp0VVH//HteuAmismL6Ag==);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="888" y="387" width="5" height="5" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="127">
<mxCell style="vsdxID=164;fillColor=#86d633;gradientColor=#5e9624;shape=stencil(jVLbDoIwDP2avZLRBonPiP9BZMgiMjJA4e9lKQlbCYa3Xs7Z6ekqMOvrolMCZD9Y81JfXQ61wJsA0G2trB6WSGAuMKuMVU9rxrakvCsc0kVv83EvTMRLpKOAnCmNJeV3wj5GS+CY2mkaXXAlxCFDTsAKM+xIE3IMBmMcyG7wtQAQYRrK+qOtJRmKJkzzr6RTuIaizCdz6Y+EIeKUR+bQXxrsR+K7PvLI/rPR7em/X4LtaCrdNHRzfp8f2VKiA8X8Bw==);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="879" y="387" width="5" height="5" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="128">
<mxCell style="vsdxID=165;fillColor=#50e6ff;gradientColor=none;shape=stencil(jZPRksIgDEW/htcMSUoLz677H47WLWO3dbCu7t8vXWiFjnV8C+FecgJB8ObS7M61IHkZXH+qb/YwNII/BJHtmtrZwUeCt4I3x97VX66/doewPu9G5Rh99z/jCffgMxpUNbpI/oaM1qDNf+YzGFrbJQZdARaZAaVM5furCwUwGhRUGA2YO+SdooZAl1FDSw1HDUJBUcMzfInrqP5QlZH6DNErVrngNFConFQuKHm6rJkzqTphQkXrlFgAmQxTroufPBeCUa96mi9y6kozMOddPTTTg5SAmPeVlua3RuWN2fLBYzKPtm3DYKf7y0n2qfALePsH);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="869" y="387" width="14" height="15" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="129">
<mxCell style="vsdxID=166;fillColor=#1490df;gradientColor=none;shape=stencil(jZPRUsMgEEW/htcd2A2wPNf6Hx2bGsaYdGiq7d83ETIC2urbcjmwd4eLoM2p2x1bgfI0hfGt/fT7qRP0JBD90LXBT3MlaCtocxhD+xrG87CP6+NuIZfqffxYbrjEc2yBcDmF8hoVBeS+hOfI937IeMegXckj6Jx/OYfYQKV9KRO/CgScrrhgzayCAWMTQz87J0kxSH3fq9LQVF5Tn1/xBpAKmnk1eme0ajBuwGI5WDWWdaBMOVbWNSnWPHwBloD88MVqm6zAuNKqLG3OzrUqrcrSZp4T+k9Q/g7WXHyn8uD7PoY6369TPEvxB9D2Bg==);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="869" y="377" width="14" height="15" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="130">
<mxCell style="vsdxID=167;fillColor=#50e6ff;gradientColor=none;shape=stencil(lZLRksIgDEW/htcMJNLCs6v/4Wzrltlu62B19e9tN6AUp+v4Fm4uyRm4gtbHZneoBcrj4Pvv+tdVQyPoQyC6rqm9G8ZK0EbQet/7+sv3p67i82E3Oafqpz9PEy58zxSg1HQL5ZUV+Xfasrl1XWK2GgzNzBZKTP2fJ8/TFfeVlMEfBQJjWbpg7omChdUqeOh5c5AQAXGZNRkSWQ0U6l9YA1JnuJHtDqsBywz37glkCkHPWZ9WZ6xAdoZqyjBhgTR71OQTI2f2pIaAKKN8LA2KkaD1MuVbUXlhHotHIveubTnQaT9P8Chx+mlzAw==);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="897" y="387" width="15" height="15" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="131">
<mxCell style="vsdxID=168;fillColor=#1490df;gradientColor=none;shape=stencil(jZLLEsIgDEW/hm0mIcXC2sd/OFotY20drFr/3lZQC46PXUgP5Ex6BU+P5fJQCInH1jW74mLXbSl4JqS0dVk42/aV4Lng6aZxxdY1p3rtz4flQA7VvjkPL3T+nsmBhksSr76hNWhz7yw8X9l6xGsFKuIJ8TNNkCW0eXQCvzo5r0MewICHI2nA8EInYyIcSYHUgeC3qY+OBPXFkkCZWBPYfLMkfmpdY/HupWWy2BQTy37RqWYyNtZ8+1X55JcmJuvMDdAkEcVkoTqDXMaqo8n8V0p+p6ovXpHc2KryiR5/TyPct3z8eX4D);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="897" y="377" width="14" height="15" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="&lt;div style=&quot;font-size: 1px&quot;&gt;&lt;p style=&quot;text-align:left;margin-left:0;margin-right:0;margin-top:0px;margin-bottom:0px;text-indent:0;vertical-align:middle;direction:ltr;&quot;&gt;&lt;font style=&quot;font-size:16.93px;font-family:Oracle Sans;color:#706e6f;direction:ltr;letter-spacing:0px;line-height:120%;opacity:1&quot;&gt;&lt;b&gt;Primary Database VNet&lt;br/&gt;&lt;/b&gt;&lt;/font&gt;&lt;/p&gt;&lt;/div&gt;" tags="Background" id="132">
<mxCell style="verticalAlign=middle;align=left;overflow=width;vsdxID=169;fillColor=none;gradientColor=none;shape=stencil(nZBLDoAgDERP0z3SIyjew0SURgSD+Lu9kMZoXLhwN9O+tukAlrNpJg1SzDH4QW/URgNYgZTkjA4UkwJUgGXng+6DX1zLfmoymdXo17xh5zmRJ6Q42BWCfc2oJfdAr+Yv+AP9Cb7OJ3H/2JG1HNGz/84klThPVCc=);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="585" y="398" width="355" height="20" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="133">
<mxCell style="vsdxID=172;fillColor=#FFFFFF;gradientColor=none;shape=stencil(nZBLDoAgDERP0z3SIyjew0SURgSD+Lu9kMZoXLhwN9O+tukAlrNpJg1SzDH4QW/URgNYgZTkjA4UkwJUgGXng+6DX1zLfmoymdXo17xh5zmRJ6Q42BWCfc2oJfdAr+Yv+AP9Cb7OJ3H/2JG1HNGz/84klThPVCc=);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="584" y="423" width="329" height="151" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="134">
<mxCell style="vsdxID=173;fillColor=none;gradientColor=none;shape=stencil(nZBLDoAgDERP0z3SIyjew0SURgSD+Lu9kMZoXLhwN9O+tukAlrNpJg1SzDH4QW/URgNYgZTkjA4UkwJUgGXng+6DX1zLfmoymdXo17xh5zmRJ6Q42BWCfc2oJfdAr+Yv+AP9Cb7OJ3H/2JG1HNGz/84klThPVCc=);dashed=1;strokeColor=#706e6f;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="584" y="423" width="329" height="151" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="&lt;div style=&quot;font-size: 1px&quot;&gt;&lt;p style=&quot;text-align:left;margin-left:0;margin-right:0;margin-top:0px;margin-bottom:0px;text-indent:0;vertical-align:middle;direction:ltr;&quot;&gt;&lt;font style=&quot;font-size:16.93px;font-family:Oracle Sans;color:#706e6f;direction:ltr;letter-spacing:0px;line-height:120%;opacity:1&quot;&gt;&lt;b&gt;Delegated subnet&lt;br/&gt;&lt;/b&gt;&lt;/font&gt;&lt;/p&gt;&lt;/div&gt;" tags="Background" id="135">
<mxCell style="verticalAlign=middle;align=left;overflow=width;vsdxID=174;fillColor=none;gradientColor=none;shape=stencil(nZBLDoAgDERP0z3SIyjew0SURgSD+Lu9kMZoXLhwN9O+tukAlrNpJg1SzDH4QW/URgNYgZTkjA4UkwJUgGXng+6DX1zLfmoymdXo17xh5zmRJ6Q42BWCfc2oJfdAr+Yv+AP9Cb7OJ3H/2JG1HNGz/84klThPVCc=);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="592" y="431" width="270" height="20" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="136">
<mxCell style="vsdxID=177;fillColor=#FFFFFF;gradientColor=none;shape=stencil(lZRNcsMgDIVPw1YDEr/rNL1HpnFqpq6dcZw2vX1xgdjQjjPdwfOTPpCQGe0u7eHcMOSXaRzemk9/nFpGTwzR920z+imsGO0Z7U7D2LyOw7U/xv35MDvn1fvwMWe4xTjBgeYg5F9RUAak/lGeo//lOsYAEQ0IVqeIpEgHOiW5YZR4cqQtOXAmOSinIZlMSSEOm2AJ2pZgFIAVWCBwLOFBclTBEYwu6QaU2KITgarowF0Jl3pJWxYig1UolSjBAswW12Duxx1MIEUJtgRWlWB7P0pmu1AtV7E1KLdFdxpcRQ/31lgVnVf9RveLvnhyuw3wzZsvEfkBSKCq4uvzJUkJUPTw5uGZq+K1db5fjYXiYHOfytP8aX88Rf/1h8UysiffdXHi19/rEQ9S/D3Q/hs=);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="629" y="478" width="30" height="41" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="137">
<mxCell style="vsdxID=178;fillColor=#FFFFFF;gradientColor=none;shape=stencil(lZZLctswDIZPoy2GAPhcp8k9Mo1Ta+raGcdp3duXKkVKgGxpvJNhkB/x+smOnz73rx+7jszn5Xz6ufvTv132HX/riPrjfnfuL/mr4+eOn95P592P8+nr+FZ+f7wOnsPXr9PvYYdrWWcTJDesIvO3WAjY/je8FP/vX+eyAMv/LoLlcQW2JVQsVyoW7yH40Wk02dGDy89gwdRtqgloDRwRKEkwGrASHPMmJMHoJDkhYJBkMuDW0MkBkorZS3DykKwEMwFGxfZT8kYTR+C4AU8o4daCi4rPYJLkuxxVkPwYoR688p0DH+b8Q3+cNUjexNTQ9XluLkCEJPwXAB1gABNlfMPJVXx2Oji1JHiS4TEEu8jumPA7cAZSyc1lIyfhDgxKOHkwOreQVGmphXEHjgTRSTq6VsdKxziFVU258ZPE50Mm1dZ5FlYTzwyqq/NQqtAtNlKLHViN1FxFuDkJGZFNsi07j/pvyZpZS4Q1ixEzreTXaZxrcloZILKqgm1a2AZsowrowSldywVX8FxwUmVABq/oHhAlHNO6suVh1cLmgIOEG6Vr2DqtgnOjK1nJg7fR+wtJtVllVetbQJZwhw3VRBUoSrgLtXq3uynUa6NKWp6Ule5baiAas+JO4B/aPxkIcv9FADcuhRhk+uaZqZdChKi6ZkiyvpQS2KVsjnvdq54xkj40hV3Qq0Y26XB1bCc6T5FMTWtXRyameqVMupmnQeIjA6srI7Zl7Rni2iUym9fVkfEBorqvsg6oeXUq7WZTMFcaakPNHnLOH9Nb8L0/HMpTcv6/fjtmU3l38vM/);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="629" y="478" width="30" height="42" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="138">
<mxCell style="vsdxID=179;fillColor=#2d5967;gradientColor=none;shape=stencil(pZZBctswDEVPoy2GJEiCXKfpPTKNU2vq2hnFadPblyoFioDGSjLdKQihR+AD3xrw7uX48HwYnHm5Tpcfh9/j4/U44JfBufF8PEzjtTwNeD/g3dNlOnyfLq/nx/r388N8cn76efk1v+Gt5mULLs1ZzvypERsh0L/I15rw7XWqGbYeSAjJLykcAloib65GyIHnQ0sIAfNyCGskZAgMX0IWdtk+AjnJNhKMCJ4k2IGV3BIhlFyC4PbAVlGtgxwk2UOMClyaGxUaUJHRQMQ9tJFkzJCzJDtIqmSfIQZJtgbQSXQg8KlHn8ZzNxvBQOIMfoe5fXw7Spv369JyhBxlecGCj7I8pq7V+dbFtTqj2kpg9hU1qrEut9licn8/12YnqDHuC+fr6CV6r1X/nyD3OkVAEgkhgMHbhK3YuaywvZ1gA1jcEOx+yyEq5yhYR7LpadBikxK7LeuqdoK8O2nExa97hOBQkVdzYbXLBCu1y+ajUnve6rxbeAQTlIEQOL3GFoKaNovc0tVB0sZCSl/NroVgUSZLPrUbNf8qNhIkPjQvbZZtgIKkt0M34CE1L2qqr+9dSDHysDV4d0PWHcHSJ0unYpdK+b6prHy5kaq9F2iBpQxWDd670pctoiT5/VCx0fjNr1Y/n2w0yFP+8cEvOar5/UIxviy/mrx+Mbn8zlNYe73y0iM+7UIfSCgP68fM03g61W+h/v/646eE6ocT3v8F);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="629" y="478" width="29" height="40" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="139">
<mxCell style="vsdxID=180;fillColor=#2d5967;gradientColor=none;shape=stencil(pVjbblMxEPyavK5sr6/PBf4DQUsjSotCgfbv2aPEa3us47RC6kNyame8l5lZnwPf/Lr//PP24Myv59PT99u/x6/P9wf+cHDu+Hh/ezo+y6cDfzzwzd3T6fbb6en349fz95+ft5Xbpx9Pf7ZfeDnvy55C3HY583p+wpm2r/L36bzh4fi43OACpdBv+PL7dIawbYu9bLk8cpby+cmLuyziCmteL49sonLZ98KXVabue708sZ44r9BTJi4jupVfiSN88lRG9ESpjODJUBzBA3m3wo6ROI7YTMaP0NGStxA5eR6xQyQbRnBDya7Ag0QJgZsR2cv5IWpDDlLuTYuh5pyYV8jMZBkKTgXCdlFLWRNBzo/Yso0BWqJeplyaJrsR2wZyI7Y8wZRL5BHQt1WQ8+2MQ9JHcvQ7dtg0kYNCGI/rhQnQnUw5jMf1hRKcloobDys9s+4QMwJHpsQjsKECwMmSwQ6hCGlKieKyQ4STELWIhAtQJa8lqei5TJIgPZLsCF+4dv5egxold8Uv0jcgSdL5DuhhjRnRgxmh64I9Tpbavp0YAStjUQ5W2P5wLcV6uLeGncMkR31CK5ht9XRzcSpYaCV8a9VLIQNl79sJc6y60PVlRc9kwAiudnsRCYXoOxa14D1SreMjaz4CaOK7bfP/N4xO7koLb0esMCOyxQANhE1VPlV8TLPvWqJCwY0pEc13QEMrFVlaMwdtPmWDn/yRpUggA9aRAXzvm+dUfOmtZT/61GaONhowiK/4qAenklVoVYEnFZRVMS3VIM5eZbUkil8oY/4lfpD/6Ooc1PC5Fm5vPJGhJ035R6OOScEUXyvb8MXIPOBnWsqRzFNmngu1sE5XQfbFDhmi3xYB+jSWjvzqd1z6zJK9li6GcomRZVCQkCb53mZJcC30jbZkr1edpsHOv1qpEihisroTVqxOKXgn9jFZb9CWd28Y1UvzobZ0NR0F8rHtgQmCRfLHdOQ8MZcbmWs6NqNctq7MPHipyI4CTE92Zq7cRjwObolAOJNoyRLezvDCvzr/KTxX/emtNCJ8UMqplQqX1/hRGVjxg4pNHz4Kt886yWo3+urBFV6uJXad/UIRndw2R2pkKEAGsRIDk8TGK8AXozVuhe9bp+m1Lk1zzKbuMD7KqgDdF5uYKb66654QFb2/9vEDfgqtSWr6/SQGSaZNzH+5kn+5q+MkJeX34FtCIhTCrbFwlJJig2+1eW9/jlXG1pQkPZLi+zbtNi+Z8B3FmX5X8E3rmeplcZqjheoO+k+SPb1UCM0E25Hcsv4yNCeIX4KNEL+kBG+NOVZi9/0XYG7Jae3bMpA4vL0VnaS0/f18jSjKiD0f3JYMM+PoK9ds4n2r5UN7L3Z3fHg4v1br/4/v0eTR+R0cf/wH);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="638" y="483" width="12" height="17" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="140">
<mxCell style="vsdxID=181;fillColor=#2d5967;gradientColor=none;shape=stencil(lZTdUsIwEIWfprdnkt38XqO+ByMgHZEyBRTf3mBSyoah6F1ycpovOdluw7P9er5bNqT2h757X361i8O64aeGqN2ul317SKOGnxuerbp++dZ3x+0iz3fzs/M8+ug+zzuc8ndWwYbzV6S+s6J+Zy/ZvGm3V2Zj4PR98+uxz1vrvMiMYIq9SOqinCgrlExcTEVixMHEWdEOyhVTkQK8n4IHUJRszXCSzSBJ1vEWDVuRySFMkZXEphTIS66GC9WVI4KTYDdeoCjGwtMUWStElnSbzm8rekAVuHWDMsDJgyu6jWBBl7WhPdwQ1HCaiVIKDGv+bvcGloX95jg3BUCos3CXTYYsQiojW4VBMF6mERm6fgs/7HUHH/34yEUyBEfVWygl6eyhSNJHTxFYg+0kO1VTxU61rrRkx/Q3V4WgLVRVCcGCg+RH6Em8d9BV9IwqeJd+RiPhSoKvOxM/bE3/6mMPzGkwtstVu9nkbnu9XrfXJOXWzM8/);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="643" y="492" width="2" height="4" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="&lt;div style=&quot;font-size: 1px&quot;&gt;&lt;p style=&quot;text-align:left;margin-left:0;margin-right:0;margin-top:0px;margin-bottom:0px;text-indent:0;vertical-align:middle;direction:ltr;&quot;&gt;&lt;font style=&quot;font-size:16.93px;font-family:Oracle Sans;color:#000000;direction:ltr;letter-spacing:0px;line-height:120%;opacity:1&quot;&gt;Private&lt;br/&gt;&lt;/font&gt;&lt;/p&gt;&lt;/div&gt;" tags="Background" id="141">
<mxCell style="verticalAlign=middle;align=left;overflow=width;vsdxID=183;fillColor=none;gradientColor=none;shape=stencil(nZBLDoAgDERP0z3SIyjew0SURgSD+Lu9kMZoXLhwN9O+tukAlrNpJg1SzDH4QW/URgNYgZTkjA4UkwJUgGXng+6DX1zLfmoymdXo17xh5zmRJ6Q42BWCfc2oJfdAr+Yv+AP9Cb7OJ3H/2JG1HNGz/84klThPVCc=);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="618" y="524" width="118" height="20" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="&lt;div style=&quot;font-size: 1px&quot;&gt;&lt;p style=&quot;text-align:left;margin-left:0;margin-right:0;margin-top:0px;margin-bottom:0px;text-indent:0;vertical-align:middle;direction:ltr;&quot;&gt;&lt;font style=&quot;font-size:16.93px;font-family:Oracle Sans;color:#000000;direction:ltr;letter-spacing:0px;line-height:120%;opacity:1&quot;&gt;Endpoint&lt;br/&gt;&lt;/font&gt;&lt;/p&gt;&lt;/div&gt;" tags="Background" id="142">
<mxCell style="verticalAlign=middle;align=left;overflow=width;vsdxID=184;fillColor=none;gradientColor=none;shape=stencil(nZBLDoAgDERP0z3SIyjew0SURgSD+Lu9kMZoXLhwN9O+tukAlrNpJg1SzDH4QW/URgNYgZTkjA4UkwJUgGXng+6DX1zLfmoymdXo17xh5zmRJ6Q42BWCfc2oJfdAr+Yv+AP9Cb7OJ3H/2JG1HNGz/84klThPVCc=);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="609" y="541" width="135" height="20" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="143">
<mxCell style="vsdxID=187;fillColor=#FFFFFF;gradientColor=none;shape=stencil(lZbLctswDEW/RlsMCfC5TtP/yDRO7akbZxyndf++cMUnLFHpTqYBHhC8vORED+/7p7fdhOr9cj792P0+PF/2E32ZEA+v+935cOGviR4neng5nXffz6eP1+f599vTLfL29fP06zbDdc4zDpy+ZaH6M49opf79/jqHf/s4z/E6JShQJiXoPkNdcR4gAhdTTBqKEdCnKJqHMIKiFJWGYgBlR3RECKGnRwdker6O4AWeK3I9vgnK9G7hx8Nr06cmeh6wBpxZj1f/FQzY74FVEMOoDwqC7dtgNETbt8EC9V0gA9qKLiBg7NtAw/3XBN736NtGotgBA0HA0YOVW2ABbQ/nopMe1/i83brn60ZbGaZACz4XHoUAbe17rkiDcUMBeiASeAUmCnwscisKBC9WT9x6IcAcswLnDCfgzbT18OE2uzTj02zWjt5kGyDcZBuw8txvwV1R2ADOApPsosvMDkBCcR7CUHDNwcpsAi30xjYaxMIbVSSSRdBixweOw56B2WgXgmWZDkEJZ1Rlglym444IZ2STEL7sMZ+BeiwIzLBJnOOEKzTnLaE8gRLXAvtEVnTBE1jRJfaJ1Lg1PLPkpWSLRRa+AS/5vjSk8BdcYetaChqsXH4oxpr5wVevzUZRPOBaLiFwocdjmWpRKG1GSbCD6ybqaqHCipbvPtXfZoZ1PKrHlqOZE0qXlxNYF309Jmtnpd/tCnQ5Llrsd2DVCrU7DV6L/a6JueE16vN6a2fGeyUP+FTXssbv+9VmpJVuGWibokvXjSxYladUsVAHol5H+W1S7XvLQ22slp/x95e2ZV8NPb4+Len+vUp9zGKvNt+3/FHfxi+H43F+Wrf/y7c0D83vcHr8Cw==);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="781" y="466" width="61" height="53" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="144">
<mxCell style="vsdxID=188;fillColor=#FFFFFF;gradientColor=none;shape=stencil(pVnZcls3DP0avXJIgutzmvxHJnFqTV07ozit8/eFei+3A11SnrxJFMBDYjsAdaIPPx4/f384Wf3j9fLy18O/56+vjyf642Tt+fnx4XJ+5U8n+niiD99eLg9/Xl5+Pn/dvn//fJW8fvr75Z/rDm+bnidlrkpW/9oWrKL0/8KnTfzLz8smb7bfg1be7RoGVPSb3YWiMn4X2pd4ZVd7o31FKxd2oX3JOBXDDJ11UhzRjVcO4KNROo7wJiiTAd+okAE/qBCn+FYZA/hRXJ+lMgF+UskAPinvAT+v7s8CHvCrTsVPXhHgWwaLI35KytGIb7Oyucd/Oj93wZL45+KxbYVK+NyUz2yaMbochhcoOBVoVKjeva1glLGjgim3OjBh5gAeLeiNymBAqxLEL8e9xQCWDmxSxwFUQ8PInVsAVcNN8GUAB31sq168RkAy09N2KqZaPMTxtCErDadlR2o/njaQCLeMzkV8zwdMgB8EvmdvZcDvknIHc0E5sFaTOsB3WmnEl+lOfFnE707ZcgujZXl/ztoM5a63bMlto2wCfCPxOyk68P8YML0GsMVteWXju8Qd7K5VnIZj46riH0k9UVkofQSBaEgFNxqCTGGHA2QmGQuJQFrwDtOHx7qbRN1lqQz4NiyKFpMMBoJla9llIPDBI/AOg2lIRDYJTfH5Gkh70vRsEYO0y6UV4In9DtdvUkeO7+qxkTsXfK4wd+BTqxZ343cZPsF3Cln/BrxTSPpLdO5dwho91g6jg8emh3ItH7UKLXoOTjIP8F4wlovK2xGdfRZGcC7USFi8Yo9LRK+w48BhV/K4v2AYKxhOBvYNgrGCX7pOmkDm9llXnTc06q7Rx7YyoXovautMmAuZ+Q3hRcdz7eAgfLTKQGFMtJC5sl/lADcQPbGE2HHmeORPQZ/k20RT6LMGc5e22LwUmftrRrftpHWQ2LJiLcGpcfExuOxyb4DbRqh3gls5pEjwK1FjsZYtrpW1ckHUuU0QZYna6NVYMWOtrKNPI2pXm6ia0r6E7hG+E9FuZcfYtyCtUcABkSkW+4SV6XnwA7eTvD3P0MBTTvIU+wLKmddw97Ey6KEqeOwopsIeGr9VXzmXv7rS/p5CqmXiOM6qSolxyYrcagXMMDmZsFcNplgqdeE4wRNWly6CW1nV2BBqPaLfmIuKzFGQiT68bVoYM8u6JhOMR8Lk3nnxEBSh4W+8wFB9FKn43TsRSSk6cDzM0J3Gfh674KDU9bsGdeqBs/SU940mi3W4R4ADOxwd4IHEtsGhdmrGTRS4gI254OZTIts1vQ8hYSfj3NToNbrufESS++NgCQq6scGeXdiSCwULbebCRrcUZvWxD4eqME+MFFSEtworH7b4qpCXJoo+PXKviSVh9VTCOgZfZuVTTf9kdjyhshQh8XtoM0Ve0uhzM8/i8hhdpJcPz/Ldrun073Y4BbEUlr3+da8N4POXuP6NrXI9zv9cVwx4Vwvj9oNE4fpjUy3GDv7Q/ln4dn562v6Y6H/HfyJ4afsXgz7+Bw==);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="780" y="465" width="63" height="55" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="145">
<mxCell style="vsdxID=189;fillColor=#2d5967;gradientColor=none;shape=stencil(pVrbctw2DP2afeWIN5B8TtP/yDRO7alrZxyndf6+2llRhHCw4O70bS2DPCCIg5t0ip9+PH75/nAKy4/3t9e/Hv59+vr+eIq/nUJ4enl8eHt6X3+d4udT/PTt9e3hz7fXny9fL39//3KWPP/6+/Wf8w4fl3XJxXxeFJZf24PqyuXJ7xf556cXJu/JNfp/C3J0wViw3CXszv/i8ovQ5o+fb5fz+r6ilm3F9iRtO3yEbYux5/Ykpq7E8hG3Y/lxrO1RXISqEtpHJ6BDGxtvWD4fsUNB7OxSOmJPgMnlcET27Qi7mz0MXQVsV+PXMIENu6oe2xG2jV3DsJowd4MTx+gWceI2uefIrrGfeRHQxfkyha4u1SN0cSZyCmPbbgk4dmK2CbsvC+wcXI1H7MVCzsxMnssP317pRAJWYDKJWzDJu6WZmFSHVl2NI2bxwz+7c0ULtDD2MXIJG5cA9+uTk9hoY29e74odvcDOQGNa/bMK7CyxCX3Lk2nsOi5nYMtzcykLW1LKPjchoaoTyLm5LCwOBlccLNmEUtw6AXIEJ0NkvOoJcmIXdA05JefjEZkgdibGkm7txcZeA0+TfhbBz9YwRyJjrD4u4WMY0SbuUnb05oG546cjeFAcDay+WgOOnu2jhwCJwxdpd4++FjzmSmbFXSEL2yPFlKy1ZtQ9CITdxtLsHl09TjyuyhIhFrhzlv67DwZpdVbX9Sd2nTYvBI+FY2GEk5WKClCgEJwsqMwLNpWaswCq1GgiX2D/ZJpoTRXk71rA8totGhFqZJ/g7juYL4BbDqLc9+YVy/Na0mmkSEmha9rfo8xE+njQDKrHen1vnkn2CtVSPR+7mlgMUZZzNr3J3JuAWNb2xNLVTarTMjLMHpLs2nutCTvE9UZndXYSITRgCC0iigXpIhBAF5ckOJbfFZu8NU/J5FELFAzRW4RsYKtzirT1xSZp1Vcaq7JI0lNQBX2lsfwMXKnp+LY932CfFMoRmdNnb5wMH5+w7chNvxzZsxZTlsM2iLox2IkGouI2EtCl85ggbNLZ3r5Bap11zhXKgIQ1CM+PYbfrzCeGyDWfYHWVx207exP0NxnZS6wD62VIsQiUwVbTgQ6xrDz0VXqiJPSlZRptaAZemRk8btunCixd7MY6IrcIraCV3Bqj5E1OeCeHpuJHhhKrsrcnMqlAG43tBSVws4Jxj25p4WlayYn83bypLJPvkyzRCxUxQGsEHTfLvP3Wq4XKydBRMY8qne9+e3s3QE7OOBZzqhMxCIxNe8ODs6SG87OAMw771AH5zGw5mj8ZfvYLiSgStUsWHt9kNQo+D61iA/LHCuTn5+mWA99QrBTt7hxnIhEnYJF5ELs12SuCd0Q5dYfBCE6UIw4nEqtMDfgCwwnAF70q9EnTkjQVGMqONVzhIrjEpa7bawYfcWCpwAdMqmkBV4kw0bDKFS7epWdze0xqSUS7qIzblKkXGApaGbinNoKkx417zMO0oMBnxVI0GTUmCLmdlzu2ckkNRo34iiabGSYrVYxHQuHMK3sY/YDVs5+MGpWSz8uQq4T7jBWUEsjkDAPcDWNJkm+nRBBLVWEFFppWCcAWbIepEzUTGIkWnMdiqUcR7kcORMl825EjTKH3PcfgXQZ6CkdYwmEkmS6pNIf7nh0DA7w8LeEAdlob8tHAqA1lRc/M2B/NKy6ajJ6VmouU+IPhj8qchzR5c6jwkGDurfCQMPYpPJwdXeEhCWzJQ6zFkYdw2xMelsmEXOFhwf5U4WFpJ3k/koebyO2+UUSgUoZahYAQ8EI5mVPheXN194JZ+1btd77Iz4pdr0LQii9oFI7WWeGtXESVAREZWvGTBqRoncUmhaNVKbyRpFUERoWh04MrFK1YJUiWViVNA02PNz7haJvNRRSSNpxq8qq4d3FZa08kT5scdoCH4nShKS/pCwSJJrOm0r7Kw8/YZ5l2Jr3+GJ9ufXt6fr58+cX/Lz/1Wh9dPhOLn/8D);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="781" y="467" width="60" height="52" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="&lt;div style=&quot;font-size: 1px&quot;&gt;&lt;p style=&quot;text-align:left;margin-left:0;margin-right:0;margin-top:0px;margin-bottom:0px;text-indent:0;vertical-align:middle;direction:ltr;&quot;&gt;&lt;font style=&quot;font-size:16.93px;font-family:Oracle Sans;color:#000000;direction:ltr;letter-spacing:0px;line-height:120%;opacity:1&quot;&gt;Oracle Autonomous&lt;br/&gt;&lt;/font&gt;&lt;/p&gt;&lt;/div&gt;" tags="Background" id="146">
<mxCell style="verticalAlign=middle;align=left;overflow=width;vsdxID=191;fillColor=none;gradientColor=none;shape=stencil(nZBLDoAgDERP0z3SIyjew0SURgSD+Lu9kMZoXLhwN9O+tukAlrNpJg1SzDH4QW/URgNYgZTkjA4UkwJUgGXng+6DX1zLfmoymdXo17xh5zmRJ6Q42BWCfc2oJfdAr+Yv+AP9Cb7OJ3H/2JG1HNGz/84klThPVCc=);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="736" y="524" width="287" height="20" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="&lt;div style=&quot;font-size: 1px&quot;&gt;&lt;p style=&quot;text-align:left;margin-left:0;margin-right:0;margin-top:0px;margin-bottom:0px;text-indent:0;vertical-align:middle;direction:ltr;&quot;&gt;&lt;font style=&quot;font-size:16.93px;font-family:Oracle Sans;color:#000000;direction:ltr;letter-spacing:0px;line-height:120%;opacity:1&quot;&gt;Database Standby&lt;br/&gt;&lt;/font&gt;&lt;/p&gt;&lt;/div&gt;" tags="Background" id="147">
<mxCell style="verticalAlign=middle;align=left;overflow=width;vsdxID=192;fillColor=none;gradientColor=none;shape=stencil(nZBLDoAgDERP0z3SIyjew0SURgSD+Lu9kMZoXLhwN9O+tukAlrNpJg1SzDH4QW/URgNYgZTkjA4UkwJUgGXng+6DX1zLfmoymdXo17xh5zmRJ6Q42BWCfc2oJfdAr+Yv+AP9Cb7OJ3H/2JG1HNGz/84klThPVCc=);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="742" y="541" width="270" height="20" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="148">
<mxCell style="vsdxID=193;fillColor=#312d2a;gradientColor=none;shape=stencil(pVTRdsIgDP0aXnMggQLPTv/DM+vKWdd6at3c348O1MK0Xbe3NL0395JAGK2O1fZQMuTHvmtfyw+36ytGTwzRNVXZud5HjNaMVvu2K1+69tTswvdhOyCH6K19HyqcA08qwGJgIf8MGWuhMN+ZTSA8n7rAEJGiwZhIiSnBeUicMSQUgsCIwRxDESNBy4ihB9q1a0ZmrQYyqVkJEqfMXlUvVj1DpF5vkJiwBMqkXsfKdEWhmpL2Slpn4giWUnXLQWWdGqOimNFgxYx+2ivF00bpS827aIHAbUqYPR5IM3s6f7to9nAIBS7sbT7U0cQwReCPsT9WzS9T2qNfPJXFhOwxElCC5xPFc6yvHUd4/z4UoP+FX+Llz1gf3DbV3tV1WHTj//lm86mwFWn9BQ==);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="803" y="296" width="15" height="128" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="149">
<mxCell style="vsdxID=195;fillColor=#FFFFFF;gradientColor=none;shape=stencil(nZBLDoAgDERP0z3SIyjew0SURgSD+Lu9kMZoXLhwN9O+tukAlrNpJg1SzDH4QW/URgNYgZTkjA4UkwJUgGXng+6DX1zLfmoymdXo17xh5zmRJ6Q42BWCfc2oJfdAr+Yv+AP9Cb7OJ3H/2JG1HNGz/84klThPVCc=);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="968" y="197" width="78" height="31" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="&lt;div style=&quot;font-size: 1px&quot;&gt;&lt;p style=&quot;text-align: center; margin: 0px; text-indent: 0px; vertical-align: middle; direction: ltr;&quot;&gt;&lt;font style=&quot;font-size:14.82px;font-family:Oracle Sans;color:#312d2a;direction:ltr;letter-spacing:0px;line-height:120%;opacity:1&quot;&gt;Automatic &lt;/font&gt;&lt;font style=&quot;font-size:14.82px;font-family:Oracle Sans;color:#312d2a;direction:ltr;letter-spacing:0px;line-height:120%;opacity:1&quot;&gt;backup&lt;br&gt;&lt;/font&gt;&lt;/p&gt;&lt;/div&gt;" tags="Background" id="150">
<mxCell style="verticalAlign=middle;align=left;overflow=width;vsdxID=196;fillColor=none;gradientColor=none;shape=stencil(nZBLDoAgDERP0z3SIyjew0SURgSD+Lu9kMZoXLhwN9O+tukAlrNpJg1SzDH4QW/URgNYgZTkjA4UkwJUgGXng+6DX1zLfmoymdXo17xh5zmRJ6Q42BWCfc2oJfdAr+Yv+AP9Cb7OJ3H/2JG1HNGz/84klThPVCc=);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="972" y="197" width="88" height="43" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="151">
<mxCell style="vsdxID=198;fillColor=#FFFFFF;gradientColor=none;shape=stencil(nZBLDoAgDERP0z3SIyjew0SURgSD+Lu9kMZoXLhwN9O+tukAlrNpJg1SzDH4QW/URgNYgZTkjA4UkwJUgGXng+6DX1zLfmoymdXo17xh5zmRJ6Q42BWCfc2oJfdAr+Yv+AP9Cb7OJ3H/2JG1HNGz/84klThPVCc=);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="723" y="322" width="175" height="14" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="&lt;div style=&quot;font-size: 1px&quot;&gt;&lt;p style=&quot;text-align:left;margin-left:0;margin-right:0;margin-top:0px;margin-bottom:0px;text-indent:0;vertical-align:middle;direction:ltr;&quot;&gt;&lt;font style=&quot;font-size:14.82px;font-family:Oracle Sans;color:#312d2a;direction:ltr;letter-spacing:0px;line-height:120%;opacity:1&quot;&gt;Autonomous Data Guard&lt;br/&gt;&lt;/font&gt;&lt;/p&gt;&lt;/div&gt;" tags="Background" id="152">
<mxCell style="verticalAlign=middle;align=left;overflow=width;vsdxID=199;fillColor=none;gradientColor=none;shape=stencil(nZBLDoAgDERP0z3SIyjew0SURgSD+Lu9kMZoXLhwN9O+tukAlrNpJg1SzDH4QW/URgNYgZTkjA4UkwJUgGXng+6DX1zLfmoymdXo17xh5zmRJ6Q42BWCfc2oJfdAr+Yv+AP9Cb7OJ3H/2JG1HNGz/84klThPVCc=);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="728" y="322" width="311" height="17" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="153">
<mxCell style="vsdxID=200;fillColor=#312d2a;gradientColor=none;shape=stencil(pZVRc4MgDMc/Da85SFTkuWu/R2+105vTnrVb9+2HQ63gCcf5hvEX8k8ChNHhXp5vBUN+77v2s/ipLn3J6I0hVk1ZdFWvV4yOjA7Xtis+uvbRXMz37TyQw+qr/R52eBo/DpQNTsh/jUEgUPJvORm+rhovzyFTHn4HHKtkL29XRinIHQeCVCwd3h+d8RBTelMGYg6RS2N6ostMBgE5jgytQ9NMCbmdnJKQSkusrnTq06o9ErLVclupJtCWyh2ZErgjMxg1A4VOjQCVE3gBjaa5Vb7gCMpzuHRRRcx5WQYY9xcgI5NbCvdkR0AqnF4CPPHGfzVMzC5Zvurq3HdcU7Q+T1vhV+UNXZdoB/epkmjz41XauO4uHXgedsBxOvbQocfb36BM7KEDb3fsYIjRHoD14jXfrlVdm/G4/O/OQ20ys5SOfw==);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="282" y="228" width="294" height="63" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="154">
<mxCell style="vsdxID=201;fillColor=#312d2a;gradientColor=none;shape=stencil(pZvZdtNAEES/xq99ZpFmeYbwHzkQiA8hyXESlr9ngpAcdYNK5XlznLrqqrKszdIhvnu6vX68OQT39Hx6+Hrz4/jp+fYQ3x9CON7f3pyOz+3VIV4d4rvPD6ebL6eHl/tP09+P16/K11ffHr6/LuHnxDmJ5RUK7tf0Rqky+D/vfJj0d8f7LX11UuKG/nIx66Rbv26mVinjGigK+Phymgg/CbybE/iFqGl662fQmrDYKLMm2tFxaW4rXM0ypHXVLd24ZbYh0a/tLt5ms03jytruWTM7S1KjMgtnJ8llPbsWKVVNf6M6G6oVz29tDBtlVXHrssCq83bEX8DPa9P+hGVZ+bcS5rrM2kjYVDGDT9ep+bk1HMznu6wDwaqiXbn+N980jL47NKC3W3mtd1vffKUNkuverRCjZTxcrAU9FLVigkX7KHXjg3SXi0kjnXLQiq8yJmYNGcWPe5NSYtZJtx40E9s7W7tko08Sw96wnJh10qsHzQxe6ubxhNZn2b0WUFrWR68e9DJGcVubRKMvkra+2h1i1kmvHjSTBgnMdzUte70dYTkx66RXD5rJ4+YRmd28e3H7TxQYMeukW4/210nS1ibS6MFZToeYddKrR2eiy7H+P5fvxccuPToZZc90Sf9Yv+4nSKLyDmQ/Rg/yGj+sHvjB+nU/o6SBWX4W36cHeY0fVg/8YP26n0Iu37v5qPZiACQ2jlg9MIT164a8l8QljmxFBgCRrSUaQJYwoFoaJCVqQhLfCaDQxhINIEsYUC1ldkIVn/sAFNpYogFkCQNqn+YkUaHbXoFryQJoN2Us0QCyhAHVUpzPifZOGMV3Aii0sUQDyBIGVEuJnVDE1z4AhTaWaABZwoBqqUqiQkdPtmQBFNpYogHUEgbWLcXAttTOh7v0ILI1RAPIEQZUR6NQm72YyYq0HiXWflg98gP1qp8i2TMDBiehE0CRjSUaQCVhYN3S4NmWogRqPbIACG0t0QCyhAHV0iCZC53YlgyAQhtLNIAsYUC1lOcL/HsnVAmdAAptLNEAsoQBdZ3EkRPGIIG7MmEAdOnDWKIBZAkDqqUomQs9si0ZAIU2lmgAWcKAaimZi7xgQpHQCaDQxhINIEsYUC1VckLy868rFwMotLFEA6glDKxbSkEyF3pgWzIACG0t0QCyhAHVUjsKpQ5bUzuM7gRQaGOJBpAlDKiWCjkhO7IlC6DQxhINoJYwsG4p+/PdZ/tCt0PpTgCEtpZoAFnCgGppYCe0Q2nq1NsCKLSxRAPIEgZUS3m+T27vhMq2ZAAU2liiAWQJA+o3uGaAGVCCUIe5Ro9+UdN+WD3yA/Wqn0gufzzfv3ohgBJrR6weGYJ61VCSwiUubEUGQJGNJRpAljCgWqrLTcz7JlQ/36h4MYBCG0s0gFrCgHrCIbAtDRKp7ZEFQGhriQaQJQyolsbltv2dEzLbkgFQaGOJBpAlDKiWihTqWkOtMlI7Wwug0MYSDSBLGGgvzo9efT7e3U1Pbr39v35Uq701PeYVr34D);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="295" y="390" width="281" height="74" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="155">
<mxCell style="vsdxID=202;fillColor=#312d2a;gradientColor=none;shape=stencil(pVTRcoMgEPwaXm/wDgSe0+Q/MompTK1mjGmTv68WNGBGaaZv3LLH7sFxjDaXcn8uGPJL1zYfxbc9diWjN4Zo67JobdevGG0ZbU5NW7y3zbU+uvi8H5jD6rP5Gk64uTwOaIYk5HcHCAmY/yI7xz9cW5eQ+QxP96FQoLWDbhgzfCgRMvQMelL1iBSgRChb2TqwKYGLyKZRQHrNpgSi2GnGeexTgo6dPhjeVQ585jOpm4/7k67pS1OxckDyiOEgMSWuFZhs+ZIy0Cq6JMmXycHpPhtH5O+VgdCpwvp2olRdCDmuv+VM+Okhp7eOW3CUDNpnQTK+nPSveJUf/7qp0UY6Aa2drvE/dJmDWumamZfX2OtWUux+8RhMJ1tVbq6F+/NB1kNuCNL2Bw==);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="105" y="322" width="141" height="15" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="156">
<mxCell style="vsdxID=203;fillColor=#312d2a;gradientColor=none;shape=stencil(nVTRcoMgEPwaXm/gDgWe0+Q/MompTq1mjGmTvy8WNYATafqG6y673MEx2lzK/blgyC99134U39WxLxm9McSqKYuu6u2K0ZbR5tR2xXvXXpuj+z7vB+aw+my/hh1uTmcMKDGokN8dkklQ8hfZOcHh2jmFcATB+SgYgQxBoINuGHNGQCrQeuTQ0nqEZAaY+9511fhhJZg8CIuQ41pWq8hVmJaHSS0Dw6g8iklgophJV5oIjxoBUmTskSYIZFyjpblA4GalRhoEhQ3lK2xvf4doNSF/P5zhkGH6dPZiqeTxjALSiZZG9vNl83o6dz2+kLO1d5eeWUe1Sj+VlwWLxyh0IJAE9NyA/5ub5aBWg0c5XuWvZ0nz7eIxsU5VXbuB5/+PJ5yF3HSk7Q8=);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="106" y="502" width="141" height="15" as="geometry" />
</mxCell>
</UserObject>
<UserObject label="" tags="Background" id="157">
<mxCell style="vsdxID=204;fillColor=#312d2a;gradientColor=none;shape=stencil(pZTRboMwDEW/Jq9WYgeSPHfdf1QrHWgMKkq39u8blkzFaQGhviXmmHvtJBa0OZW7YyFQnvqu/Sp+q31fCnoTiFVTFl3V+5WgraDNoe2Kz649N/uwP+4Gclh9tz/DHy4hL9Ng9JCF8hoiEjT9Bd4D/3HuQoKKGQgKY0YMybC9YNhqA9ZGAjlBkcgA80jQc9m6akY2EXJkLg1onHMpuUPvSHOTkhu0kGnucSRJ/4wzs50BJC7rIFH1gaQzdySqKATp5oV5bzLJOoNg8mnYGnCK8UtVOQkZLpXlb5FZqMsZILuuoUomxzg6JUwRfDjpaeH09iQNXXwTa3n+5jQBMVwBqunfP+Kx5udmcjCv0CutvIb7xX0wHaq6DnNt/D0dZD4UhiBtbw==);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="263" y="390" width="15" height="96" as="geometry" />
</mxCell>
</UserObject>
</root>
</mxGraphModel>
</diagram>
</mxfile>

Some files were not shown because too many files have changed in this diff Show More