anthodev/xeno-team-builderpublic Fork
⑂ 91e3df9
Commits
⬇ Clone ▾
git clone https://git.rickub.com/anthodev/xeno-team-builder.git
git clone ssh://git@rickub.com/anthodev/xeno-team-builder.git

Host key fingerprint (ed25519): SHA256:iycHnxEyq0Q7uyVpB7JlznP0G7JrTPXLYRcAU5CSLhc — verify it before your first connect.

Download ZIP

Merge feature/fixed-companion-builds/companions/1 into develop

rickub committed 2026-09-26T17:15:31Z Browse files
91e3df9 parent: 47d1acb
modified .gitignore +1 -0
@@ -35,6 +35,7 @@ yarn-error.log*
3535
3636 # typescript
3737 next-env.d.ts
38+/tsconfig.tsbuildinfo
3839 /dist/
3940 /.wrangler/
4041 /.sites-runtime/
@@ -35,6 +35,7 @@ yarn-error.log*
35 35
36 # typescript36 # typescript
37 next-env.d.ts37 next-env.d.ts
38+/tsconfig.tsbuildinfo
38 /dist/39 /dist/
39 /.wrangler/40 /.wrangler/
40 /.sites-runtime/41 /.sites-runtime/
renamed .rickub/workflows/deploy-bunny.yml +25 -1
similarity index 70%
rename from .github/workflows/deploy-bunny.yml
rename to .rickub/workflows/deploy-bunny.yml
@@ -43,9 +43,33 @@ jobs:
4343 name: Build and deploy static site
4444 needs: test
4545 runs-on: ubuntu-latest
46- environment: production
4746
4847 steps:
48+ - name: Check Bunny settings are configured
49+ env:
50+ BUNNY_STORAGE_ENDPOINT: ${{ vars.BUNNY_STORAGE_ENDPOINT }}
51+ BUNNY_STORAGE_PASSWORD: ${{ secrets.BUNNY_STORAGE_PASSWORD }}
52+ BUNNY_PULL_ZONE_ID: ${{ vars.BUNNY_PULL_ZONE_ID }}
53+ BUNNY_API_KEY: ${{ secrets.BUNNY_API_KEY }}
54+ run: |
55+ set -euo pipefail
56+
57+ missing=0
58+ for name in BUNNY_STORAGE_ENDPOINT BUNNY_STORAGE_PASSWORD BUNNY_PULL_ZONE_ID BUNNY_API_KEY; do
59+ if [ -z "${!name:-}" ]; then
60+ echo "Missing Rickub setting: ${name}"
61+ missing=1
62+ fi
63+ done
64+
65+ if [ "$missing" -ne 0 ]; then
66+ echo "Configure under Rickub → Settings → Variables:"
67+ echo " BUNNY_STORAGE_ENDPOINT, BUNNY_PULL_ZONE_ID"
68+ echo "Configure under Rickub → Settings → Secrets:"
69+ echo " BUNNY_STORAGE_PASSWORD, BUNNY_API_KEY"
70+ exit 1
71+ fi
72+
4973 - name: Check out repository
5074 uses: actions/checkout@v4
5175
similarity index 70%
rename from .github/workflows/deploy-bunny.yml
rename to .rickub/workflows/deploy-bunny.yml
@@ -43,9 +43,33 @@ jobs:
43 name: Build and deploy static site43 name: Build and deploy static site
44 needs: test44 needs: test
45 runs-on: ubuntu-latest45 runs-on: ubuntu-latest
46- environment: production
47 46
48 steps:47 steps:
48+ - name: Check Bunny settings are configured
49+ env:
50+ BUNNY_STORAGE_ENDPOINT: ${{ vars.BUNNY_STORAGE_ENDPOINT }}
51+ BUNNY_STORAGE_PASSWORD: ${{ secrets.BUNNY_STORAGE_PASSWORD }}
52+ BUNNY_PULL_ZONE_ID: ${{ vars.BUNNY_PULL_ZONE_ID }}
53+ BUNNY_API_KEY: ${{ secrets.BUNNY_API_KEY }}
54+ run: |
55+ set -euo pipefail
56+
57+ missing=0
58+ for name in BUNNY_STORAGE_ENDPOINT BUNNY_STORAGE_PASSWORD BUNNY_PULL_ZONE_ID BUNNY_API_KEY; do
59+ if [ -z "${!name:-}" ]; then
60+ echo "Missing Rickub setting: ${name}"
61+ missing=1
62+ fi
63+ done
64+
65+ if [ "$missing" -ne 0 ]; then
66+ echo "Configure under Rickub → Settings → Variables:"
67+ echo " BUNNY_STORAGE_ENDPOINT, BUNNY_PULL_ZONE_ID"
68+ echo "Configure under Rickub → Settings → Secrets:"
69+ echo " BUNNY_STORAGE_PASSWORD, BUNNY_API_KEY"
70+ exit 1
71+ fi
72+
49 - name: Check out repository73 - name: Check out repository
50 uses: actions/checkout@v474 uses: actions/checkout@v4
51 75
modified README.md +39 -1
@@ -26,7 +26,14 @@ your browser.
2626 tier-4 classes add their weapon types and compatible regular Arts.
2727 - **Companion-specific kits** — all 22 Definitive Edition companions, including
2828 Mia, use their own weapons, Arts, Skills, ranks and slot limits rather than a
29- generic Cross-class profile.
29+ generic Cross-class profile. Each runs one fixed, researched build
30+ (`src/data/companionBuilds.ts`): at most two TP-consuming Arts — Cross keeps
31+ its own three-Art budget — deterministic personal-rank substitutes, and
32+ character-specific, sourced weapon/armor advice. A companion's loadout never
33+ changes with Cross's class, weapons, teammates, team variant or combat mode.
34+- **Equipped-only companion scoring** — team scoring reads each companion's
35+ equipped Arts and Skills, and Skell aptitude counts equipped pilot Skills
36+ only; Skell mode never silently rewrites a companion's ground kit.
3037 - **Deterministic AUTO composition** — manual picks remain in their exact slots.
3138 AUTO slots enumerate level-eligible, non-duplicate companions and optimize
3239 tank/support/damage specialist coverage before a tie-break informed by the
@@ -56,6 +63,37 @@ The tactical preference order lives in `src/data/builds.ts`. Factual unlock
5663 tables live separately in `src/data/progression.ts` and
5764 `src/data/companions.ts`; preference data cannot grant availability.
5865
66+Companion builds are **fixed and curated, not contextual**. One canonical
67+Arts/Skills loadout per non-Cross character is kept in
68+`src/data/companionBuilds.ts`; unavailable abilities fall back to explicit,
69+ordered personal-rank substitutes, never a dynamic strategy re-ranking. Every
70+companion kit carries at most two TP-consuming Arts, strictly, including
71+substitutes — Cross's existing three-Art TP policy is unchanged. Unfilled
72+slots are legitimate: Irina deliberately equips three of her four Skill
73+slots because her remaining personal Skills depend on Sleep or Control that
74+the curated support bar never provides, and an inert fourth Skill is worse
75+than an empty slot. Character-specific
76+weapon and armor advice names verified manufacturer offerings, weight-category
77+trade-offs and availability gates; it is matchup guidance, not a universal
78+best-in-slot claim.
79+
80+These curated builds are sourced recommendations, not a universal-optimum or
81+community-consensus claim. Research preferred Definitive Edition evidence and
82+validated original sources (Xeno Series Wiki game data, Game8, Nintendo Life,
83+Reddit and GameFAQs discussions) against each character's actual weapon pair,
84+unlock ranks and TP data, counting only independent recurrence — lists that
85+share one authorship count as one cluster, not consensus. Verified guide
86+errors were rejected rather than absorbed: weapon-incompatible
87+recommendations, missing TP markers and invalid Art names were dropped in
88+favor of game data. Where evidence stays sparse — most non-flagship
89+companions have no independently recurring full build — the final bar is an
90+explicitly editorial choice. Per-character evidence, decisions and gaps are
91+recorded in four research matrices:
92+[core](docs/research/companion-builds-core.md),
93+[veterans](docs/research/companion-builds-veterans.md),
94+[specialists](docs/research/companion-builds-specialists.md),
95+[remaining](docs/research/companion-builds-remaining.md).
96+
5997 ## Run locally
6098
6199 Requirements: Node.js 20.9 or newer.
@@ -26,7 +26,14 @@ your browser.
26 tier-4 classes add their weapon types and compatible regular Arts.26 tier-4 classes add their weapon types and compatible regular Arts.
27 - **Companion-specific kits** — all 22 Definitive Edition companions, including27 - **Companion-specific kits** — all 22 Definitive Edition companions, including
28 Mia, use their own weapons, Arts, Skills, ranks and slot limits rather than a28 Mia, use their own weapons, Arts, Skills, ranks and slot limits rather than a
29- generic Cross-class profile.29+ generic Cross-class profile. Each runs one fixed, researched build
30+ (`src/data/companionBuilds.ts`): at most two TP-consuming Arts — Cross keeps
31+ its own three-Art budget — deterministic personal-rank substitutes, and
32+ character-specific, sourced weapon/armor advice. A companion's loadout never
33+ changes with Cross's class, weapons, teammates, team variant or combat mode.
34+- **Equipped-only companion scoring** — team scoring reads each companion's
35+ equipped Arts and Skills, and Skell aptitude counts equipped pilot Skills
36+ only; Skell mode never silently rewrites a companion's ground kit.
30 - **Deterministic AUTO composition** — manual picks remain in their exact slots.37 - **Deterministic AUTO composition** — manual picks remain in their exact slots.
31 AUTO slots enumerate level-eligible, non-duplicate companions and optimize38 AUTO slots enumerate level-eligible, non-duplicate companions and optimize
32 tank/support/damage specialist coverage before a tie-break informed by the39 tank/support/damage specialist coverage before a tie-break informed by the
@@ -56,6 +63,37 @@ The tactical preference order lives in `src/data/builds.ts`. Factual unlock
56 tables live separately in `src/data/progression.ts` and63 tables live separately in `src/data/progression.ts` and
57 `src/data/companions.ts`; preference data cannot grant availability.64 `src/data/companions.ts`; preference data cannot grant availability.
58 65
66+Companion builds are **fixed and curated, not contextual**. One canonical
67+Arts/Skills loadout per non-Cross character is kept in
68+`src/data/companionBuilds.ts`; unavailable abilities fall back to explicit,
69+ordered personal-rank substitutes, never a dynamic strategy re-ranking. Every
70+companion kit carries at most two TP-consuming Arts, strictly, including
71+substitutes — Cross's existing three-Art TP policy is unchanged. Unfilled
72+slots are legitimate: Irina deliberately equips three of her four Skill
73+slots because her remaining personal Skills depend on Sleep or Control that
74+the curated support bar never provides, and an inert fourth Skill is worse
75+than an empty slot. Character-specific
76+weapon and armor advice names verified manufacturer offerings, weight-category
77+trade-offs and availability gates; it is matchup guidance, not a universal
78+best-in-slot claim.
79+
80+These curated builds are sourced recommendations, not a universal-optimum or
81+community-consensus claim. Research preferred Definitive Edition evidence and
82+validated original sources (Xeno Series Wiki game data, Game8, Nintendo Life,
83+Reddit and GameFAQs discussions) against each character's actual weapon pair,
84+unlock ranks and TP data, counting only independent recurrence — lists that
85+share one authorship count as one cluster, not consensus. Verified guide
86+errors were rejected rather than absorbed: weapon-incompatible
87+recommendations, missing TP markers and invalid Art names were dropped in
88+favor of game data. Where evidence stays sparse — most non-flagship
89+companions have no independently recurring full build — the final bar is an
90+explicitly editorial choice. Per-character evidence, decisions and gaps are
91+recorded in four research matrices:
92+[core](docs/research/companion-builds-core.md),
93+[veterans](docs/research/companion-builds-veterans.md),
94+[specialists](docs/research/companion-builds-specialists.md),
95+[remaining](docs/research/companion-builds-remaining.md).
96+
59 ## Run locally97 ## Run locally
60 98
61 Requirements: Node.js 20.9 or newer.99 Requirements: Node.js 20.9 or newer.
modified app/globals.css +4 -0
@@ -73,6 +73,10 @@ select:focus { border-color:var(--cyan);box-shadow:0 0 0 2px rgba(150,239,240,.0
7373 .skell-gear-list{list-style:none;margin:0;padding:0;display:grid;gap:6px}.skell-gear-list li{display:grid;gap:2px;border-left:2px solid rgba(150,239,240,.18);padding:4px 0 4px 10px}.skell-gear-list b{font-size:13px;color:#dbeae7;font-weight:500}.skell-gear-list small{font-size:11px;color:#5d8487;letter-spacing:.08em;text-transform:uppercase}.skell-gear-acquisition{font-size:11px;color:#537477;letter-spacing:.02em;line-height:1.35;text-transform:none}
7474 .lvl-badge { display:inline-block;border:1px solid rgba(150,239,240,.35);color:var(--cyan);font-size:10px;font-style:normal;letter-spacing:.05em;padding:2px 5px;text-decoration:none;line-height:1.35 }
7575 .lvl-badge:hover,.lvl-badge:focus-visible{border-color:var(--cyan);background:rgba(150,239,240,.08)}
76+.equip-facts{display:grid;gap:0;margin:0}.equip-facts>div{border-top:1px solid rgba(150,239,240,.09);padding:9px 0}.equip-facts dt{font-size:11px;letter-spacing:.12em;color:#5f8183;text-transform:uppercase}.equip-facts dd{margin:4px 0 0;color:#9eb5b4;font-size:12px;line-height:1.5}
77+.curated-rationale{margin:0;color:#8fa9a7;font-size:12px;line-height:1.55}
78+.substitute-list{margin:0;padding-left:18px;color:#789698;font-size:12px;line-height:1.55;display:grid;gap:4px}
79+.source-list{list-style:none;margin:0;padding:0;display:grid;gap:6px}.source-list li{display:flex;align-items:baseline;gap:8px}.source-list a{color:var(--cyan);font-size:12px;text-decoration:none;border-bottom:1px solid rgba(150,239,240,.3)}.source-list a:hover,.source-list a:focus-visible{border-bottom-color:var(--cyan)}.source-list small{color:#4e7477;font-size:10px;letter-spacing:.08em}
7680 .method-note{display:grid;grid-template-columns:40px 1fr;gap:15px;margin-top:18px;border:1px solid var(--line);padding:20px;background:rgba(7,26,31,.7)}.method-note>span{width:34px;height:34px;display:grid;place-items:center;border:1px solid var(--orange);color:var(--orange)}.method-note h3{font-size:16px;margin:2px 0 7px}.method-note p{font-size:14px;line-height:1.65;color:#789698;margin:0;max-width:1200px}
7781 .contextual-controls .combat-mode-field{grid-column:1/-1;display:grid;grid-template-columns:auto minmax(150px,1fr);gap:12px}.contextual-controls .combat-mode-field select{padding-top:8px;padding-bottom:8px}.contextual-controls .special-unlock-field{grid-column:1/-1}.recommendation-tabs{display:grid;grid-template-columns:repeat(3,1fr);gap:8px;margin-bottom:12px}.recommendation-tabs button{display:grid;gap:5px;text-align:left;padding:14px 16px;border:1px solid var(--line);background:rgba(8,29,34,.58);color:#718f91;cursor:pointer}.recommendation-tabs button span{font-size:11px;letter-spacing:.15em;text-transform:uppercase}.recommendation-tabs button b{font-size:14px;color:#a8bfbd;font-weight:500}.recommendation-tabs button small{font-size:11px;color:#55787c}.recommendation-tabs button:hover{border-color:rgba(150,239,240,.45)}.recommendation-tabs button.active{border-color:var(--cyan);background:linear-gradient(120deg,rgba(150,239,240,.11),rgba(110,243,197,.04));box-shadow:inset 3px 0 var(--cyan)}.recommendation-tabs button.active span,.recommendation-tabs button.active small{color:var(--cyan)}.recommendation-tabs button.active b{color:#e5f3ef}.recommendation-context{display:grid;grid-template-columns:1.4fr auto 1fr;gap:18px;align-items:start;border:1px solid var(--line);border-top:0;background:rgba(4,18,22,.58);padding:15px 18px;margin:-12px 0 12px}.recommendation-context small,.infeasible-panel small{display:block;font-size:11px;letter-spacing:.15em;text-transform:uppercase;color:#63888a;margin-bottom:7px}.recommendation-context ul,.infeasible-panel ul{margin:0;padding-left:18px;color:#91aaa8;font-size:13px;line-height:1.5}.score-grid{display:flex;gap:7px;margin:0}.score-grid div{min-width:52px;padding:7px;border:1px solid rgba(150,239,240,.12);text-align:center}.score-grid dt{font-size:9px;color:#55787c;letter-spacing:.1em}.score-grid dd{margin:3px 0 0;color:var(--mint);font-size:13px}.recommendation-evidence{display:flex;flex-wrap:wrap;gap:6px}.recommendation-evidence small{width:100%}.recommendation-evidence a,.skell-evidence a{font-size:11px;color:#80a9aa;text-decoration:none;border:1px solid rgba(150,239,240,.15);padding:4px 6px}.recommendation-evidence a:hover,.skell-evidence a:hover{color:var(--cyan);border-color:var(--cyan)}.infeasible-panel{display:grid;grid-template-columns:1fr 1fr;gap:20px;border:1px solid rgba(255,113,79,.3);background:rgba(255,113,79,.05);padding:22px}.arts-block li.special-art{border-color:rgba(255,113,79,.3);background:rgba(255,113,79,.045)}.special-art-badge{display:inline-block;margin-left:7px;padding:2px 4px;border:1px solid rgba(255,113,79,.35);color:#ff9479;font-size:8px;font-style:normal;letter-spacing:.08em;text-transform:uppercase}.art-detail .art-fallback{display:grid;gap:2px;margin:7px 0 0;padding:6px 8px;border-left:2px solid var(--mint);background:rgba(110,243,197,.04)}.art-detail .art-fallback strong{font-size:10px;color:#98c8b8}.art-detail .art-fallback span{font-size:10px;color:#5f8180}.skell-evidence{display:flex;flex-wrap:wrap;gap:5px;margin-top:12px}
7882 .recommendation-context{grid-template-columns:1.4fr auto}
@@ -73,6 +73,10 @@ select:focus { border-color:var(--cyan);box-shadow:0 0 0 2px rgba(150,239,240,.0
73 .skell-gear-list{list-style:none;margin:0;padding:0;display:grid;gap:6px}.skell-gear-list li{display:grid;gap:2px;border-left:2px solid rgba(150,239,240,.18);padding:4px 0 4px 10px}.skell-gear-list b{font-size:13px;color:#dbeae7;font-weight:500}.skell-gear-list small{font-size:11px;color:#5d8487;letter-spacing:.08em;text-transform:uppercase}.skell-gear-acquisition{font-size:11px;color:#537477;letter-spacing:.02em;line-height:1.35;text-transform:none}73 .skell-gear-list{list-style:none;margin:0;padding:0;display:grid;gap:6px}.skell-gear-list li{display:grid;gap:2px;border-left:2px solid rgba(150,239,240,.18);padding:4px 0 4px 10px}.skell-gear-list b{font-size:13px;color:#dbeae7;font-weight:500}.skell-gear-list small{font-size:11px;color:#5d8487;letter-spacing:.08em;text-transform:uppercase}.skell-gear-acquisition{font-size:11px;color:#537477;letter-spacing:.02em;line-height:1.35;text-transform:none}
74 .lvl-badge { display:inline-block;border:1px solid rgba(150,239,240,.35);color:var(--cyan);font-size:10px;font-style:normal;letter-spacing:.05em;padding:2px 5px;text-decoration:none;line-height:1.35 }74 .lvl-badge { display:inline-block;border:1px solid rgba(150,239,240,.35);color:var(--cyan);font-size:10px;font-style:normal;letter-spacing:.05em;padding:2px 5px;text-decoration:none;line-height:1.35 }
75 .lvl-badge:hover,.lvl-badge:focus-visible{border-color:var(--cyan);background:rgba(150,239,240,.08)}75 .lvl-badge:hover,.lvl-badge:focus-visible{border-color:var(--cyan);background:rgba(150,239,240,.08)}
76+.equip-facts{display:grid;gap:0;margin:0}.equip-facts>div{border-top:1px solid rgba(150,239,240,.09);padding:9px 0}.equip-facts dt{font-size:11px;letter-spacing:.12em;color:#5f8183;text-transform:uppercase}.equip-facts dd{margin:4px 0 0;color:#9eb5b4;font-size:12px;line-height:1.5}
77+.curated-rationale{margin:0;color:#8fa9a7;font-size:12px;line-height:1.55}
78+.substitute-list{margin:0;padding-left:18px;color:#789698;font-size:12px;line-height:1.55;display:grid;gap:4px}
79+.source-list{list-style:none;margin:0;padding:0;display:grid;gap:6px}.source-list li{display:flex;align-items:baseline;gap:8px}.source-list a{color:var(--cyan);font-size:12px;text-decoration:none;border-bottom:1px solid rgba(150,239,240,.3)}.source-list a:hover,.source-list a:focus-visible{border-bottom-color:var(--cyan)}.source-list small{color:#4e7477;font-size:10px;letter-spacing:.08em}
76 .method-note{display:grid;grid-template-columns:40px 1fr;gap:15px;margin-top:18px;border:1px solid var(--line);padding:20px;background:rgba(7,26,31,.7)}.method-note>span{width:34px;height:34px;display:grid;place-items:center;border:1px solid var(--orange);color:var(--orange)}.method-note h3{font-size:16px;margin:2px 0 7px}.method-note p{font-size:14px;line-height:1.65;color:#789698;margin:0;max-width:1200px}80 .method-note{display:grid;grid-template-columns:40px 1fr;gap:15px;margin-top:18px;border:1px solid var(--line);padding:20px;background:rgba(7,26,31,.7)}.method-note>span{width:34px;height:34px;display:grid;place-items:center;border:1px solid var(--orange);color:var(--orange)}.method-note h3{font-size:16px;margin:2px 0 7px}.method-note p{font-size:14px;line-height:1.65;color:#789698;margin:0;max-width:1200px}
77 .contextual-controls .combat-mode-field{grid-column:1/-1;display:grid;grid-template-columns:auto minmax(150px,1fr);gap:12px}.contextual-controls .combat-mode-field select{padding-top:8px;padding-bottom:8px}.contextual-controls .special-unlock-field{grid-column:1/-1}.recommendation-tabs{display:grid;grid-template-columns:repeat(3,1fr);gap:8px;margin-bottom:12px}.recommendation-tabs button{display:grid;gap:5px;text-align:left;padding:14px 16px;border:1px solid var(--line);background:rgba(8,29,34,.58);color:#718f91;cursor:pointer}.recommendation-tabs button span{font-size:11px;letter-spacing:.15em;text-transform:uppercase}.recommendation-tabs button b{font-size:14px;color:#a8bfbd;font-weight:500}.recommendation-tabs button small{font-size:11px;color:#55787c}.recommendation-tabs button:hover{border-color:rgba(150,239,240,.45)}.recommendation-tabs button.active{border-color:var(--cyan);background:linear-gradient(120deg,rgba(150,239,240,.11),rgba(110,243,197,.04));box-shadow:inset 3px 0 var(--cyan)}.recommendation-tabs button.active span,.recommendation-tabs button.active small{color:var(--cyan)}.recommendation-tabs button.active b{color:#e5f3ef}.recommendation-context{display:grid;grid-template-columns:1.4fr auto 1fr;gap:18px;align-items:start;border:1px solid var(--line);border-top:0;background:rgba(4,18,22,.58);padding:15px 18px;margin:-12px 0 12px}.recommendation-context small,.infeasible-panel small{display:block;font-size:11px;letter-spacing:.15em;text-transform:uppercase;color:#63888a;margin-bottom:7px}.recommendation-context ul,.infeasible-panel ul{margin:0;padding-left:18px;color:#91aaa8;font-size:13px;line-height:1.5}.score-grid{display:flex;gap:7px;margin:0}.score-grid div{min-width:52px;padding:7px;border:1px solid rgba(150,239,240,.12);text-align:center}.score-grid dt{font-size:9px;color:#55787c;letter-spacing:.1em}.score-grid dd{margin:3px 0 0;color:var(--mint);font-size:13px}.recommendation-evidence{display:flex;flex-wrap:wrap;gap:6px}.recommendation-evidence small{width:100%}.recommendation-evidence a,.skell-evidence a{font-size:11px;color:#80a9aa;text-decoration:none;border:1px solid rgba(150,239,240,.15);padding:4px 6px}.recommendation-evidence a:hover,.skell-evidence a:hover{color:var(--cyan);border-color:var(--cyan)}.infeasible-panel{display:grid;grid-template-columns:1fr 1fr;gap:20px;border:1px solid rgba(255,113,79,.3);background:rgba(255,113,79,.05);padding:22px}.arts-block li.special-art{border-color:rgba(255,113,79,.3);background:rgba(255,113,79,.045)}.special-art-badge{display:inline-block;margin-left:7px;padding:2px 4px;border:1px solid rgba(255,113,79,.35);color:#ff9479;font-size:8px;font-style:normal;letter-spacing:.08em;text-transform:uppercase}.art-detail .art-fallback{display:grid;gap:2px;margin:7px 0 0;padding:6px 8px;border-left:2px solid var(--mint);background:rgba(110,243,197,.04)}.art-detail .art-fallback strong{font-size:10px;color:#98c8b8}.art-detail .art-fallback span{font-size:10px;color:#5f8180}.skell-evidence{display:flex;flex-wrap:wrap;gap:5px;margin-top:12px}81 .contextual-controls .combat-mode-field{grid-column:1/-1;display:grid;grid-template-columns:auto minmax(150px,1fr);gap:12px}.contextual-controls .combat-mode-field select{padding-top:8px;padding-bottom:8px}.contextual-controls .special-unlock-field{grid-column:1/-1}.recommendation-tabs{display:grid;grid-template-columns:repeat(3,1fr);gap:8px;margin-bottom:12px}.recommendation-tabs button{display:grid;gap:5px;text-align:left;padding:14px 16px;border:1px solid var(--line);background:rgba(8,29,34,.58);color:#718f91;cursor:pointer}.recommendation-tabs button span{font-size:11px;letter-spacing:.15em;text-transform:uppercase}.recommendation-tabs button b{font-size:14px;color:#a8bfbd;font-weight:500}.recommendation-tabs button small{font-size:11px;color:#55787c}.recommendation-tabs button:hover{border-color:rgba(150,239,240,.45)}.recommendation-tabs button.active{border-color:var(--cyan);background:linear-gradient(120deg,rgba(150,239,240,.11),rgba(110,243,197,.04));box-shadow:inset 3px 0 var(--cyan)}.recommendation-tabs button.active span,.recommendation-tabs button.active small{color:var(--cyan)}.recommendation-tabs button.active b{color:#e5f3ef}.recommendation-context{display:grid;grid-template-columns:1.4fr auto 1fr;gap:18px;align-items:start;border:1px solid var(--line);border-top:0;background:rgba(4,18,22,.58);padding:15px 18px;margin:-12px 0 12px}.recommendation-context small,.infeasible-panel small{display:block;font-size:11px;letter-spacing:.15em;text-transform:uppercase;color:#63888a;margin-bottom:7px}.recommendation-context ul,.infeasible-panel ul{margin:0;padding-left:18px;color:#91aaa8;font-size:13px;line-height:1.5}.score-grid{display:flex;gap:7px;margin:0}.score-grid div{min-width:52px;padding:7px;border:1px solid rgba(150,239,240,.12);text-align:center}.score-grid dt{font-size:9px;color:#55787c;letter-spacing:.1em}.score-grid dd{margin:3px 0 0;color:var(--mint);font-size:13px}.recommendation-evidence{display:flex;flex-wrap:wrap;gap:6px}.recommendation-evidence small{width:100%}.recommendation-evidence a,.skell-evidence a{font-size:11px;color:#80a9aa;text-decoration:none;border:1px solid rgba(150,239,240,.15);padding:4px 6px}.recommendation-evidence a:hover,.skell-evidence a:hover{color:var(--cyan);border-color:var(--cyan)}.infeasible-panel{display:grid;grid-template-columns:1fr 1fr;gap:20px;border:1px solid rgba(255,113,79,.3);background:rgba(255,113,79,.05);padding:22px}.arts-block li.special-art{border-color:rgba(255,113,79,.3);background:rgba(255,113,79,.045)}.special-art-badge{display:inline-block;margin-left:7px;padding:2px 4px;border:1px solid rgba(255,113,79,.35);color:#ff9479;font-size:8px;font-style:normal;letter-spacing:.08em;text-transform:uppercase}.art-detail .art-fallback{display:grid;gap:2px;margin:7px 0 0;padding:6px 8px;border-left:2px solid var(--mint);background:rgba(110,243,197,.04)}.art-detail .art-fallback strong{font-size:10px;color:#98c8b8}.art-detail .art-fallback span{font-size:10px;color:#5f8180}.skell-evidence{display:flex;flex-wrap:wrap;gap:5px;margin-top:12px}
78 .recommendation-context{grid-template-columns:1.4fr auto}82 .recommendation-context{grid-template-columns:1.4fr auto}
modified src/components/BuildCard.tsx +68 -10
@@ -31,9 +31,11 @@ export default function BuildCard({
3131 postgameFrames,
3232 }: BuildCardProps) {
3333 const strategy = buildStrategies[member.strategy];
34- const dominantAttribute = localizedGameUiText(member.dominantAttribute, lang)
35- .toLocaleUpperCase(lang === "fr" ? "fr-FR" : "en-US");
36- const armsManufacturer = armsManufacturers[member.strategy];
34+ const curatedBuild = member.kind === "companion" ? member.curatedBuild : undefined;
35+ const dominantAttribute = curatedBuild
36+ ? ""
37+ : localizedGameUiText(member.dominantAttribute, lang)
38+ .toLocaleUpperCase(lang === "fr" ? "fr-FR" : "en-US");
3739 const skell = recommendSkellFrame({
3840 strategy: member.strategy,
3941 pilotLevel: member.effectiveLevel,
@@ -65,12 +67,20 @@ export default function BuildCard({
6567 <header className="build-card-head">
6668 <span className="member-number">{String(index + 1).padStart(2, "0")}</span>
6769 <div><h3>{member.name}</h3><p>{member.className} · {t.levelShort} {member.effectiveLevel} · {t.personalRankShort} {member.rank}</p></div>
68- <div className="role-tag"><small>{t.dominantAttribute} · {dominantAttribute} ({strategy.damage})</small><b>{localized(strategy.role, lang)}</b></div>
70+ <div className="role-tag"><small>{curatedBuild ? t.researchedBuild : `${t.dominantAttribute} · ${dominantAttribute} (${strategy.damage})`}</small><b>{localized(curatedBuild ? curatedBuild.role : strategy.role, lang)}</b></div>
6971 </header>
7072 <div className="build-columns">
7173 <section className="loadout-block arts-block">
7274 <h4><span>A</span>{t.artsLoadout} · {member.arts.length}/8</h4>
7375 <p className="weapon-lock">{member.weapons.ranged} + {member.weapons.melee} · {localized(member.note, lang)}</p>
76+ {curatedBuild && (
77+ <details className="skell-detail curated-disclosure">
78+ <summary>{t.curatedRationale}</summary>
79+ <div className="skell-detail-body">
80+ <p className="curated-rationale">{localized(curatedBuild.rationale, lang)}</p>
81+ </div>
82+ </details>
83+ )}
7484 {member.arts.length > 0 ? <ol>
7585 {member.arts.slice(0, 8).map((art, artIndex) => (
7686 <li className={art.specialUnlock ? "special-art" : undefined} key={`${art.name}-${artIndex}`}>
@@ -93,6 +103,16 @@ export default function BuildCard({
93103 </li>
94104 ))}
95105 </ol> : <p className="empty-loadout">{t.noLearnedArts}</p>}
106+ {curatedBuild && curatedBuild.artSubstitutes.length > 0 && (
107+ <details className="skell-detail curated-disclosure">
108+ <summary>{t.progressionSubstitutes}<small>{curatedBuild.artSubstitutes.length}</small></summary>
109+ <div className="skell-detail-body">
110+ <ol className="substitute-list">
111+ {curatedBuild.artSubstitutes.map((name) => <li key={name}>{name}</li>)}
112+ </ol>
113+ </div>
114+ </details>
115+ )}
96116 </section>
97117
98118 <section className="loadout-block skills-block">
@@ -109,13 +129,51 @@ export default function BuildCard({
109129 ))}
110130 </div> : <p className="empty-loadout">{t.noLearnedSkills}</p>}
111131
112- <h5>{t.heuristicStatPriority}</h5>
113- <ol className="stat-priority-list">
114- {strategy.statPriority.map((stat) => <li key={stat}>{localizedGameUiText(stat, lang)}</li>)}
115- </ol>
132+ {curatedBuild ? (
133+ <>
134+ <h5>{t.curatedEquipment}</h5>
135+ <dl className="equip-facts">
136+ <div><dt>{t.equipmentWeapons}</dt><dd>{localized(curatedBuild.equipment.weapons, lang)}</dd></div>
137+ <div><dt>{t.equipmentArmor}</dt><dd>{localized(curatedBuild.equipment.armor, lang)}</dd></div>
138+ <div><dt>{t.equipmentAvailability}</dt><dd>{localized(curatedBuild.equipment.availability, lang)}</dd></div>
139+ </dl>
140+ {curatedBuild.skillSubstitutes.length > 0 && (
141+ <details className="skell-detail curated-disclosure">
142+ <summary>{t.progressionSubstitutes}<small>{curatedBuild.skillSubstitutes.length}</small></summary>
143+ <div className="skell-detail-body">
144+ <ol className="substitute-list">
145+ {curatedBuild.skillSubstitutes.map((name) => <li key={name}>{name}</li>)}
146+ </ol>
147+ </div>
148+ </details>
149+ )}
150+ {curatedBuild.sources.length > 0 && (
151+ <details className="skell-detail curated-disclosure">
152+ <summary>{t.curatedSources}<small>{curatedBuild.sources.length}</small></summary>
153+ <div className="skell-detail-body">
154+ <ul className="source-list">
155+ {curatedBuild.sources.map((source) => (
156+ <li key={source.url}>
157+ <a href={source.url} target="_blank" rel="noreferrer">{source.label}</a>
158+ <small>{source.edition.toUpperCase()}</small>
159+ </li>
160+ ))}
161+ </ul>
162+ </div>
163+ </details>
164+ )}
165+ </>
166+ ) : (
167+ <>
168+ <h5>{t.heuristicStatPriority}</h5>
169+ <ol className="stat-priority-list">
170+ {strategy.statPriority.map((stat) => <li key={stat}>{localizedGameUiText(stat, lang)}</li>)}
171+ </ol>
116172
117- <h5>{t.amRecommended}</h5>
118- <p className="am-note"><b>{armsManufacturer.name}</b><span>{localized(armsManufacturer.specialty, lang)}</span></p>
173+ <h5>{t.amRecommended}</h5>
174+ <p className="am-note"><b>{armsManufacturers[member.strategy].name}</b><span>{localized(armsManufacturers[member.strategy].specialty, lang)}</span></p>
175+ </>
176+ )}
119177
120178 <h5>{t.planReasons}</h5>
121179 <ul className="plan-reasons">
@@ -31,9 +31,11 @@ export default function BuildCard({
31 postgameFrames,31 postgameFrames,
32 }: BuildCardProps) {32 }: BuildCardProps) {
33 const strategy = buildStrategies[member.strategy];33 const strategy = buildStrategies[member.strategy];
34- const dominantAttribute = localizedGameUiText(member.dominantAttribute, lang)34+ const curatedBuild = member.kind === "companion" ? member.curatedBuild : undefined;
35- .toLocaleUpperCase(lang === "fr" ? "fr-FR" : "en-US");35+ const dominantAttribute = curatedBuild
36- const armsManufacturer = armsManufacturers[member.strategy];36+ ? ""
37+ : localizedGameUiText(member.dominantAttribute, lang)
38+ .toLocaleUpperCase(lang === "fr" ? "fr-FR" : "en-US");
37 const skell = recommendSkellFrame({39 const skell = recommendSkellFrame({
38 strategy: member.strategy,40 strategy: member.strategy,
39 pilotLevel: member.effectiveLevel,41 pilotLevel: member.effectiveLevel,
@@ -65,12 +67,20 @@ export default function BuildCard({
65 <header className="build-card-head">67 <header className="build-card-head">
66 <span className="member-number">{String(index + 1).padStart(2, "0")}</span>68 <span className="member-number">{String(index + 1).padStart(2, "0")}</span>
67 <div><h3>{member.name}</h3><p>{member.className} · {t.levelShort} {member.effectiveLevel} · {t.personalRankShort} {member.rank}</p></div>69 <div><h3>{member.name}</h3><p>{member.className} · {t.levelShort} {member.effectiveLevel} · {t.personalRankShort} {member.rank}</p></div>
68- <div className="role-tag"><small>{t.dominantAttribute} · {dominantAttribute} ({strategy.damage})</small><b>{localized(strategy.role, lang)}</b></div>70+ <div className="role-tag"><small>{curatedBuild ? t.researchedBuild : `${t.dominantAttribute} · ${dominantAttribute} (${strategy.damage})`}</small><b>{localized(curatedBuild ? curatedBuild.role : strategy.role, lang)}</b></div>
69 </header>71 </header>
70 <div className="build-columns">72 <div className="build-columns">
71 <section className="loadout-block arts-block">73 <section className="loadout-block arts-block">
72 <h4><span>A</span>{t.artsLoadout} · {member.arts.length}/8</h4>74 <h4><span>A</span>{t.artsLoadout} · {member.arts.length}/8</h4>
73 <p className="weapon-lock">{member.weapons.ranged} + {member.weapons.melee} · {localized(member.note, lang)}</p>75 <p className="weapon-lock">{member.weapons.ranged} + {member.weapons.melee} · {localized(member.note, lang)}</p>
76+ {curatedBuild && (
77+ <details className="skell-detail curated-disclosure">
78+ <summary>{t.curatedRationale}</summary>
79+ <div className="skell-detail-body">
80+ <p className="curated-rationale">{localized(curatedBuild.rationale, lang)}</p>
81+ </div>
82+ </details>
83+ )}
74 {member.arts.length > 0 ? <ol>84 {member.arts.length > 0 ? <ol>
75 {member.arts.slice(0, 8).map((art, artIndex) => (85 {member.arts.slice(0, 8).map((art, artIndex) => (
76 <li className={art.specialUnlock ? "special-art" : undefined} key={`${art.name}-${artIndex}`}>86 <li className={art.specialUnlock ? "special-art" : undefined} key={`${art.name}-${artIndex}`}>
@@ -93,6 +103,16 @@ export default function BuildCard({
93 </li>103 </li>
94 ))}104 ))}
95 </ol> : <p className="empty-loadout">{t.noLearnedArts}</p>}105 </ol> : <p className="empty-loadout">{t.noLearnedArts}</p>}
106+ {curatedBuild && curatedBuild.artSubstitutes.length > 0 && (
107+ <details className="skell-detail curated-disclosure">
108+ <summary>{t.progressionSubstitutes}<small>{curatedBuild.artSubstitutes.length}</small></summary>
109+ <div className="skell-detail-body">
110+ <ol className="substitute-list">
111+ {curatedBuild.artSubstitutes.map((name) => <li key={name}>{name}</li>)}
112+ </ol>
113+ </div>
114+ </details>
115+ )}
96 </section>116 </section>
97 117
98 <section className="loadout-block skills-block">118 <section className="loadout-block skills-block">
@@ -109,13 +129,51 @@ export default function BuildCard({
109 ))}129 ))}
110 </div> : <p className="empty-loadout">{t.noLearnedSkills}</p>}130 </div> : <p className="empty-loadout">{t.noLearnedSkills}</p>}
111 131
112- <h5>{t.heuristicStatPriority}</h5>132+ {curatedBuild ? (
113- <ol className="stat-priority-list">133+ <>
114- {strategy.statPriority.map((stat) => <li key={stat}>{localizedGameUiText(stat, lang)}</li>)}134+ <h5>{t.curatedEquipment}</h5>
115- </ol>135+ <dl className="equip-facts">
136+ <div><dt>{t.equipmentWeapons}</dt><dd>{localized(curatedBuild.equipment.weapons, lang)}</dd></div>
137+ <div><dt>{t.equipmentArmor}</dt><dd>{localized(curatedBuild.equipment.armor, lang)}</dd></div>
138+ <div><dt>{t.equipmentAvailability}</dt><dd>{localized(curatedBuild.equipment.availability, lang)}</dd></div>
139+ </dl>
140+ {curatedBuild.skillSubstitutes.length > 0 && (
141+ <details className="skell-detail curated-disclosure">
142+ <summary>{t.progressionSubstitutes}<small>{curatedBuild.skillSubstitutes.length}</small></summary>
143+ <div className="skell-detail-body">
144+ <ol className="substitute-list">
145+ {curatedBuild.skillSubstitutes.map((name) => <li key={name}>{name}</li>)}
146+ </ol>
147+ </div>
148+ </details>
149+ )}
150+ {curatedBuild.sources.length > 0 && (
151+ <details className="skell-detail curated-disclosure">
152+ <summary>{t.curatedSources}<small>{curatedBuild.sources.length}</small></summary>
153+ <div className="skell-detail-body">
154+ <ul className="source-list">
155+ {curatedBuild.sources.map((source) => (
156+ <li key={source.url}>
157+ <a href={source.url} target="_blank" rel="noreferrer">{source.label}</a>
158+ <small>{source.edition.toUpperCase()}</small>
159+ </li>
160+ ))}
161+ </ul>
162+ </div>
163+ </details>
164+ )}
165+ </>
166+ ) : (
167+ <>
168+ <h5>{t.heuristicStatPriority}</h5>
169+ <ol className="stat-priority-list">
170+ {strategy.statPriority.map((stat) => <li key={stat}>{localizedGameUiText(stat, lang)}</li>)}
171+ </ol>
116 172
117- <h5>{t.amRecommended}</h5>173+ <h5>{t.amRecommended}</h5>
118- <p className="am-note"><b>{armsManufacturer.name}</b><span>{localized(armsManufacturer.specialty, lang)}</span></p>174+ <p className="am-note"><b>{armsManufacturers[member.strategy].name}</b><span>{localized(armsManufacturers[member.strategy].specialty, lang)}</span></p>
175+ </>
176+ )}
119 177
120 <h5>{t.planReasons}</h5>178 <h5>{t.planReasons}</h5>
121 <ul className="plan-reasons">179 <ul className="plan-reasons">
renamed src/data/art-effects.json +0 -0
similarity index 100%
rename from research/art-effects.json
rename to src/data/art-effects.json
similarity index 100%
rename from research/art-effects.json
rename to src/data/art-effects.json
modified src/data/artDescriptions.ts +1 -1
@@ -3,7 +3,7 @@ import type { LocalizedText } from "@/src/lib/types";
33 /** Official in-game Art descriptions (English captions) from the Xeno Series
44 * Wiki; French text is a project translation of the canonical English — the
55 * wiki only publishes French Art names, not French descriptions.
6- * Generated from research/art-effects.json — see that file for provenance. */
6+ * Generated from src/data/art-effects.json — see that file for provenance. */
77 export const artDescriptions: Readonly<Record<string, LocalizedText>> = {
88 "Absorber Skin": ["Grants Barrier", "Octroie Barrière"],
99 "Afterburner": ["(TP) Deals weapon damage + Boosts damage in ranged combos", "(TP) Inflige des dégâts de l'arme + Augmente les dégâts en combos à distance"],
@@ -3,7 +3,7 @@ import type { LocalizedText } from "@/src/lib/types";
3 /** Official in-game Art descriptions (English captions) from the Xeno Series3 /** Official in-game Art descriptions (English captions) from the Xeno Series
4 * Wiki; French text is a project translation of the canonical English — the4 * Wiki; French text is a project translation of the canonical English — the
5 * wiki only publishes French Art names, not French descriptions.5 * wiki only publishes French Art names, not French descriptions.
6- * Generated from research/art-effects.json — see that file for provenance. */6+ * Generated from src/data/art-effects.json — see that file for provenance. */
7 export const artDescriptions: Readonly<Record<string, LocalizedText>> = {7 export const artDescriptions: Readonly<Record<string, LocalizedText>> = {
8 "Absorber Skin": ["Grants Barrier", "Octroie Barrière"],8 "Absorber Skin": ["Grants Barrier", "Octroie Barrière"],
9 "Afterburner": ["(TP) Deals weapon damage + Boosts damage in ranged combos", "(TP) Inflige des dégâts de l'arme + Augmente les dégâts en combos à distance"],9 "Afterburner": ["(TP) Deals weapon damage + Boosts damage in ranged combos", "(TP) Inflige des dégâts de l'arme + Augmente les dégâts en combos à distance"],
added src/data/companionBuilds.ts +2225 -0
new file mode 100644
@@ -0,0 +1,2225 @@
1+import type { CuratedCompanionBuild } from "@/src/lib/types";
2+
3+/**
4+ * Curated fixed AI builds (Rickub #1): editorial selections with canonical-first ordered
5+ * substitutes; Art provenance is in src/data/art-effects.json, with guide links per build.
6+ * Cross (player avatar) is intentionally excluded.
7+ */
8+export const companionBuilds: Readonly<Record<string, CuratedCompanionBuild>> = {
9+ "Elma": {
10+ "role": [
11+ "Positional dual-weapon DPS with party Decoy support",
12+ "DPS positionnel à double arme, avec Décoy de groupe"
13+ ],
14+ "rationale": [
15+ "Keep Primer and Sliding Slinger for TP flow; Violent Streak adds critical-based TP gain. Ghost Factory protects nearby allies; Executioner is ranged TP damage. Side Slash and Shadowstrike retain positional attacks, but AI positioning is unreliable. Ghost Factory and Executioner are the only equipped TP Arts.",
16+ "Garder Primer et Sliding Slinger pour générer des PT ; Violent Streak ajoute le gain de PT sur critique. Ghost Factory protège les alliés proches ; Executioner apporte des dégâts à distance contre des PT. Side Slash et Shadowstrike gardent les attaques positionnelles, mais le placement de l’IA reste peu fiable. Ghost Factory et Executioner sont les deux seuls Arts à PT équipés."
17+ ],
18+ "arts": [
19+ "Primer",
20+ "Sliding Slinger",
21+ "Shadowstrike",
22+ "Side Slash",
23+ "Violent Streak",
24+ "Electric Surge",
25+ "Ghost Factory",
26+ "Executioner"
27+ ],
28+ "skills": [
29+ "Agile Gunslinger",
30+ "Steady Hand",
31+ "Background Noise",
32+ "Master Edge"
33+ ],
34+ "artSubstitutes": [
35+ "Upper Hand",
36+ "Blood Sacrifice",
37+ "Stream Edge",
38+ "Thirsty Edge",
39+ "Hundred Shells"
40+ ],
41+ "skillSubstitutes": [
42+ "Mortal Enemy",
43+ "Hellhound",
44+ "Crisis Catalyst",
45+ "Phantom Counter"
46+ ],
47+ "equipment": {
48+ "weapons": [
49+ "Sakuraba Industries Dual Guns Series + Blades Series (Dual Swords), both AM Level 1. Alternative: Grenada Gemels Dual Guns + Ralzes Dual Swords, AM Level 1. Choose weapon attribute and Battle Traits for enemy matchup; no manufacturer grants an Elma-specific bonus.",
50+ "Sakuraba Industries, séries Dual Guns + Blades (épées doubles), AM niv. 1. Alternative : Grenada Gemels (Dual Guns) + Ralzes (épées doubles), AM niv. 1. Choisir l’attribut et les traits selon l’ennemi ; aucun fabricant ne donne de bonus propre à Elma."
51+ ],
52+ "armor": [
53+ "Candid & Credible Light Wear: Screen, Breaker, Ward, Trudgers. Light trades defense for higher attribute resistance, especially Gravity; C&C ground gear trends high-defense. Editorial DPS choice, not consensus.",
54+ "Armure légère Candid & Credible : Screen, Breaker, Ward, Trudgers. Le type léger sacrifie de la défense pour davantage de résistances, surtout Gravité ; les équipements terrestres C&C tendent vers une défense élevée. Choix éditorial pour un DPS, pas un consensus."
55+ ],
56+ "availability": [
57+ "C&C unlocks after Chapter 5; Light Wear requires AM Level 2 and 7,000 R&D. Before that use initial Sakuraba or Grenada Medium Wear at AM Level 1; C&C Medium is also AM Level 1 after its story gate.",
58+ "C&C se débloque après le chapitre 5 ; l’armure légère exige AM niv. 2 et 7 000 points de R&D. Avant cela, utiliser l’armure moyenne Sakuraba ou Grenada (fabricants initiaux, AM niv. 1) ; l’armure moyenne C&C est aussi AM niv. 1 après son déblocage scénario."
59+ ]
60+ },
61+ "sources": [
62+ {
63+ "label": "Xeno Series Wiki — Elma/Gameplay (XCX)",
64+ "url": "https://www.xenoserieswiki.org/wiki/Elma/Gameplay_(XCX)",
65+ "edition": "both"
66+ },
67+ {
68+ "label": "Game8 — Elma Best Build (DE)",
69+ "url": "https://game8.co/games/Xenoblade-Chronicles-X/archives/506520",
70+ "edition": "DE"
71+ },
72+ {
73+ "label": "Nintendo Life — Best Combat Builds for All Characters (DE)",
74+ "url": "https://www.nintendolife.com/guides/xenoblade-chronicles-x-best-combat-builds-for-all-characters",
75+ "edition": "DE"
76+ },
77+ {
78+ "label": "Reddit — A Guide to Xenoblade X DE Party Member Builds (search-indexed; direct fetch blocked)",
79+ "url": "https://www.reddit.com/r/Xenoblade_Chronicles/comments/1jnyxkz/a_guide_to_xenoblade_x_de_party_member_builds/",
80+ "edition": "DE"
81+ },
82+ {
83+ "label": "Xeno Series Wiki — Battle Art (XCX)",
84+ "url": "https://www.xenoserieswiki.org/wiki/Battle_Art_(XCX)",
85+ "edition": "both"
86+ },
87+ {
88+ "label": "Xeno Series Wiki — Skill (XCX)",
89+ "url": "https://www.xenoserieswiki.org/wiki/Skill_(XCX)",
90+ "edition": "both"
91+ },
92+ {
93+ "label": "Xeno Series Wiki — Sakuraba Industries",
94+ "url": "https://www.xenoserieswiki.org/wiki/Sakuraba_Industries",
95+ "edition": "both"
96+ },
97+ {
98+ "label": "Xeno Series Wiki — Grenada Galactic Group",
99+ "url": "https://www.xenoserieswiki.org/wiki/Grenada_Galactic_Group",
100+ "edition": "both"
101+ },
102+ {
103+ "label": "Xeno Series Wiki — Candid & Credible",
104+ "url": "https://www.xenoserieswiki.org/wiki/Candid_%26_Credible",
105+ "edition": "both"
106+ },
107+ {
108+ "label": "Xeno Series Wiki — Armor (XCX)",
109+ "url": "https://www.xenoserieswiki.org/wiki/Armor_(XCX)",
110+ "edition": "both"
111+ }
112+ ]
113+ },
114+ "Lin": {
115+ "role": [
116+ "Shield tank and Topple setup",
117+ "Tank bouclier et spécialiste du Topple"
118+ ],
119+ "rationale": [
120+ "Wild Down topples; Wild Smash and Drum Roll exploit toppled/melee-combo targets. Trash Talk supports aggro/TP; Shield Wall adds a non-TP barrier and Bullet Storm deals weapon damage, with Flinch against humanoids, without needing an aura. Wild Down and Drum Roll are the only TP Arts. Game8 omitted Drum Roll’s TP marker; XSW marks it (TP).",
121+ "Wild Down renverse l’ennemi ; Wild Smash et Drum Roll exploitent les cibles renversées et les combos au corps-à-corps. Trash Talk soutient l’aggro et les PT ; Shield Wall ajoute une barrière sans coût en PT et Bullet Storm inflige des dégâts d’arme et Flinch aux humanoïdes sans exiger d’aura. Wild Down et Drum Roll sont les deux seuls Arts à PT. Game8 a omis le marqueur PT de Drum Roll ; XSW le marque (TP)."
122+ ],
123+ "arts": [
124+ "Wild Down",
125+ "Wild Smash",
126+ "Trash Talk",
127+ "Drum Roll",
128+ "Reality Rift",
129+ "Fire Carnival",
130+ "Shield Wall",
131+ "Bullet Storm"
132+ ],
133+ "skills": [
134+ "Shield Screen",
135+ "Dirty Fighter",
136+ "Stand Strong"
137+ ],
138+ "artSubstitutes": [
139+ "Flame Cloak",
140+ "Bombardier",
141+ "Supershield",
142+ "Thermal Payload"
143+ ],
144+ "skillSubstitutes": [
145+ "Steel Flesh",
146+ "Mighty Muscle",
147+ "Dismantler",
148+ "Long Topple"
149+ ],
150+ "equipment": {
151+ "weapons": [
152+ "Sakuraba Industries Shield Series + Machine Series (Gatling Gun), AM Level 1. Grenada Paive + Repethe (AM Level 1) is an alternative; C&C Haven + Crank (AM Level 1) is available after Chapter 5.",
153+ "Sakuraba Industries, séries Shield + Machine (mitrailleuse Gatling), AM niv. 1. Alternative Grenada Paive + Repethe (AM niv. 1) ; C&C Haven + Crank (AM niv. 1) après le chapitre 5."
154+ ],
155+ "armor": [
156+ "Candid & Credible Heavy Wear: Armet, Bulwark, Wrest, Stabilizers. Heavy trades resistance for higher defense; C&C ground armor trends high-defense. Use it only when the incoming attribute profile permits.",
157+ "Armure lourde Candid & Credible : Armet, Bulwark, Wrest, Stabilizers. Le type lourd échange des résistances contre plus de défense ; les armures terrestres C&C tendent vers une défense élevée. À choisir seulement si les attributs ennemis le permettent."
158+ ],
159+ "availability": [
160+ "C&C unlocks after Chapter 5; Heavy Wear requires AM Level 3 and 12,000 R&D. Before then use Sakuraba Medium Wear at AM Level 1, or Sakuraba Heavy after its AM Level 3/5,000 R&D gate. Medium Wear is safer against elemental-heavy encounters.",
161+ "C&C se débloque après le chapitre 5 ; l’armure lourde exige AM niv. 3 et 12 000 points de R&D. Avant cela, utiliser l’armure moyenne Sakuraba AM niv. 1, ou son armure lourde après le palier AM niv. 3/5 000 points. L’armure moyenne convient mieux face à de forts dégâts élémentaires."
162+ ]
163+ },
164+ "sources": [
165+ {
166+ "label": "Xeno Series Wiki — Lin/Gameplay",
167+ "url": "https://www.xenoserieswiki.org/wiki/Lin/Gameplay",
168+ "edition": "both"
169+ },
170+ {
171+ "label": "Game8 — Lin Best Build (DE)",
172+ "url": "https://game8.co/games/Xenoblade-Chronicles-X/archives/506544",
173+ "edition": "DE"
174+ },
175+ {
176+ "label": "Nintendo Life — Best Combat Builds for All Characters (DE)",
177+ "url": "https://www.nintendolife.com/guides/xenoblade-chronicles-x-best-combat-builds-for-all-characters",
178+ "edition": "DE"
179+ },
180+ {
181+ "label": "Reddit — A Guide to Xenoblade X DE Party Member Builds (search-indexed; direct fetch blocked)",
182+ "url": "https://www.reddit.com/r/Xenoblade_Chronicles/comments/1jnyxkz/a_guide_to_xenoblade_x_de_party_member_builds/",
183+ "edition": "DE"
184+ },
185+ {
186+ "label": "Xeno Series Wiki — Battle Art (XCX)",
187+ "url": "https://www.xenoserieswiki.org/wiki/Battle_Art_(XCX)",
188+ "edition": "both"
189+ },
190+ {
191+ "label": "Xeno Series Wiki — Skill (XCX)",
192+ "url": "https://www.xenoserieswiki.org/wiki/Skill_(XCX)",
193+ "edition": "both"
194+ },
195+ {
196+ "label": "Xeno Series Wiki — Sakuraba Industries",
197+ "url": "https://www.xenoserieswiki.org/wiki/Sakuraba_Industries",
198+ "edition": "both"
199+ },
200+ {
201+ "label": "Xeno Series Wiki — Grenada Galactic Group",
202+ "url": "https://www.xenoserieswiki.org/wiki/Grenada_Galactic_Group",
203+ "edition": "both"
204+ },
205+ {
206+ "label": "Xeno Series Wiki — Candid & Credible",
207+ "url": "https://www.xenoserieswiki.org/wiki/Candid_%26_Credible",
208+ "edition": "both"
209+ },
210+ {
211+ "label": "Xeno Series Wiki — Armor (XCX)",
212+ "url": "https://www.xenoserieswiki.org/wiki/Armor_(XCX)",
213+ "edition": "both"
214+ },
215+ {
216+ "label": "Xeno Series Wiki — Cool Off aura prerequisite",
217+ "url": "https://www.xenoserieswiki.org/wiki/Cool_Off_(XCX)",
218+ "edition": "both"
219+ }
220+ ]
221+ },
222+ "Irina": {
223+ "role": [
224+ "Healing, TP, barrier and buff support",
225+ "Soutien par soins, PT, barrières et bonus"
226+ ],
227+ "rationale": [
228+ "Smooth Recovery, Repair and Absorber Skin cover healing, cleanse and Barrier. Last Stand and Energy Source provide team TP/Potential support. Quick Cannon and Flash Grenade retain ranged damage/Blackout; Assault Hammer adds non-TP Topple. Medic Free is removed to keep the strict two-TP limit. This is not the player-style Sleep/Control build. Irina has only three own Skills useful to this support bar without Sleep or Control; leave the fourth slot empty rather than equip an inert Control-specific Skill.",
229+ "Smooth Recovery, Repair et Absorber Skin assurent soins, dissipation et barrière. Last Stand et Energy Source soutiennent les PT/le Potentiel de l’équipe. Quick Cannon et Flash Grenade gardent dégâts à distance et Blackout ; Assault Hammer ajoute Topple sans coût en PT. Medic Free est retiré pour respecter la limite stricte de deux Arts à PT. Ce n’est pas le build Sommeil/Contrôle manuel. Seules trois compétences propres à Irina servent cette barre de soutien sans Sommeil ni Contrôle ; la quatrième place reste vide plutôt que d’équiper une compétence de Contrôle inactive."
230+ ],
231+ "arts": [
232+ "Smooth Recovery",
233+ "Quick Cannon",
234+ "Repair",
235+ "Assault Hammer",
236+ "Last Stand",
237+ "Energy Source",
238+ "Absorber Skin",
239+ "Flash Grenade"
240+ ],
241+ "skills": [
242+ "Inner Search",
243+ "Healing Touch",
244+ "High Tension"
245+ ],
246+ "artSubstitutes": [
247+ "Furious Blast",
248+ "Screamer",
249+ "Medic Free"
250+ ],
251+ "skillSubstitutes": [],
252+ "equipment": {
253+ "weapons": [
254+ "Sakuraba Industries Assault Series + Knife Series, AM Level 1. Grenada Avagar + Riv (AM Level 1) is a same-type alternative.",
255+ "Sakuraba Industries, séries Assault + Knife, AM niv. 1. Alternative de mêmes types : Grenada Avagar + Riv (AM niv. 1)."
256+ ],
257+ "armor": [
258+ "Grenada Medium Wear: Spex, Torse, Quantlet, Soales, AM Level 1. Grenada identifies beam-resistant ground armor as a product strength; use item resistances/traits for actual enemy matchup.",
259+ "Armure moyenne Grenada : Spex, Torse, Quantlet, Soales, AM niv. 1. Grenada identifie les armures terrestres résistantes aux lasers comme un point fort ; choisir résistances/traits selon l’ennemi."
260+ ],
261+ "availability": [
262+ "Grenada is one of the two initial AMs; Medium Wear and weapon lines are AM Level 1. Sakuraba Medium is the initial-maker alternative. C&C Medium is available at AM Level 1 only after Chapter 5.",
263+ "Grenada est l’un des deux fabricants initiaux ; l’armure moyenne et les armes sont disponibles à AM niv. 1. L’armure moyenne Sakuraba est l’alternative initiale. C&C propose l’armure moyenne à AM niv. 1 après le chapitre 5."
264+ ]
265+ },
266+ "sources": [
267+ {
268+ "label": "Xeno Series Wiki — Irina/Gameplay",
269+ "url": "https://www.xenoserieswiki.org/wiki/Irina/Gameplay",
270+ "edition": "both"
271+ },
272+ {
273+ "label": "Game8 — Irina Best Build (DE)",
274+ "url": "https://game8.co/games/Xenoblade-Chronicles-X/archives/506541",
275+ "edition": "DE"
276+ },
277+ {
278+ "label": "Nintendo Life — Best Combat Builds for All Characters (DE)",
279+ "url": "https://www.nintendolife.com/guides/xenoblade-chronicles-x-best-combat-builds-for-all-characters",
280+ "edition": "DE"
281+ },
282+ {
283+ "label": "Reddit — A Guide to Xenoblade X DE Party Member Builds (search-indexed; direct fetch blocked)",
284+ "url": "https://www.reddit.com/r/Xenoblade_Chronicles/comments/1jnyxkz/a_guide_to_xenoblade_x_de_party_member_builds/",
285+ "edition": "DE"
286+ },
287+ {
288+ "label": "Xeno Series Wiki — Battle Art (XCX)",
289+ "url": "https://www.xenoserieswiki.org/wiki/Battle_Art_(XCX)",
290+ "edition": "both"
291+ },
292+ {
293+ "label": "Xeno Series Wiki — Skill (XCX)",
294+ "url": "https://www.xenoserieswiki.org/wiki/Skill_(XCX)",
295+ "edition": "both"
296+ },
297+ {
298+ "label": "Xeno Series Wiki — Sakuraba Industries",
299+ "url": "https://www.xenoserieswiki.org/wiki/Sakuraba_Industries",
300+ "edition": "both"
301+ },
302+ {
303+ "label": "Xeno Series Wiki — Grenada Galactic Group",
304+ "url": "https://www.xenoserieswiki.org/wiki/Grenada_Galactic_Group",
305+ "edition": "both"
306+ },
307+ {
308+ "label": "Xeno Series Wiki — Candid & Credible",
309+ "url": "https://www.xenoserieswiki.org/wiki/Candid_%26_Credible",
310+ "edition": "both"
311+ },
312+ {
313+ "label": "Xeno Series Wiki — Armor (XCX)",
314+ "url": "https://www.xenoserieswiki.org/wiki/Armor_(XCX)",
315+ "edition": "both"
316+ },
317+ {
318+ "label": "Xenoblade Wiki — King's Decree Control-only effect",
319+ "url": "https://xenoblade.fandom.com/wiki/King%27s_Decree",
320+ "edition": "both"
321+ },
322+ {
323+ "label": "Xenoblade Wiki — Servant Sacrifice Control prerequisite and HP/TP restore",
324+ "url": "https://xenoblade.fandom.com/wiki/Servant_Sacrifice",
325+ "edition": "both"
326+ }
327+ ]
328+ },
329+ "Gwin": {
330+ "role": [
331+ "Thermal-leaning ranged/melee hybrid",
332+ "Hybride distance/corps-à-corps orienté thermique"
333+ ],
334+ "rationale": [
335+ "Use Gwin’s legal Longsword + Assault Rifle Arts. Defensive Stance gives an AI-safe aura; Power Dive grants Supercharge/evasion. Grenade Blitz and Burst Grenade support Thermal damage; Flash Grenade adds Electric damage/Blackout; Takedown Shot adds mechanoid Topple. Defensive Stance and Burst Grenade are the only TP Arts. Published Game8 Gwin Arts are weapon-incompatible, so this build is editorial.",
336+ "Utiliser les Arts légaux de Gwin, épée longue + fusil d’assaut. Defensive Stance apporte une aura défensive adaptée à l’IA ; Power Dive donne Supercharge/évasion. Grenade Blitz et Burst Grenade soutiennent les dégâts thermiques ; Flash Grenade ajoute dégâts électriques/Blackout ; Takedown Shot ajoute Topple contre les méchanoïdes. Defensive Stance et Burst Grenade sont les deux seuls Arts à PT. Les Arts Game8 pour Gwin sont incompatibles avec ses armes ; ce build est éditorial."
337+ ],
338+ "arts": [
339+ "Defensive Stance",
340+ "Power Dive",
341+ "Furious Blast",
342+ "Magnum Edge",
343+ "Flash Grenade",
344+ "Grenade Blitz",
345+ "Takedown Shot",
346+ "Burst Grenade"
347+ ],
348+ "skills": [
349+ "Unwavering Courage",
350+ "Flame Trigger",
351+ "Conflagrant Edge"
352+ ],
353+ "artSubstitutes": [
354+ "Rising Blade",
355+ "Ultraslash",
356+ "Tornado Blade",
357+ "Decoy Round",
358+ "Incendiary Edge",
359+ "Gunforce"
360+ ],
361+ "skillSubstitutes": [
362+ "Mighty Muscle",
363+ "Auto Melee Boost",
364+ "Healing Aura",
365+ "Weapon Guard",
366+ "Theroid Slayer"
367+ ],
368+ "equipment": {
369+ "weapons": [
370+ "Sakuraba Industries Assault Series + Sword Series (Longsword), AM Level 1. Grenada Avagar + Slair are same-type AM Level 1 alternatives.",
371+ "Sakuraba Industries, séries Assault + Sword (épée longue), AM niv. 1. Alternatives de mêmes types : Grenada Avagar + Slair, AM niv. 1."
372+ ],
373+ "armor": [
374+ "Sakuraba Medium Wear: Goggles, Bodywear, Glove, Footwear, AM Level 1. Conservative availability recommendation only; no Medium-specific numeric bonus is asserted.",
375+ "Armure moyenne Sakuraba : Goggles, Bodywear, Glove, Footwear, AM niv. 1. Recommandation prudente de disponibilité ; aucun bonus numérique propre au type moyen n’est affirmé."
376+ ],
377+ "availability": [
378+ "Sakuraba and Grenada are initial AMs; Medium Wear and weapon lines are AM Level 1. C&C Medium is an alternative after Chapter 5 and AM Level 1, with a high-defense product trend.",
379+ "Sakuraba et Grenada sont initiaux ; armes et armure moyenne disponibles à AM niv. 1. L’armure moyenne C&C est une alternative après le chapitre 5, AM niv. 1, avec une gamme terrestre orientée défense."
380+ ]
381+ },
382+ "sources": [
383+ {
384+ "label": "Xeno Series Wiki — Gwin/Gameplay",
385+ "url": "https://www.xenoserieswiki.org/wiki/Gwin/Gameplay",
386+ "edition": "both"
387+ },
388+ {
389+ "label": "Game8 — Best Builds for All Characters (DE)",
390+ "url": "https://game8.co/games/Xenoblade-Chronicles-X/archives/506659",
391+ "edition": "DE"
392+ },
393+ {
394+ "label": "Xeno Series Wiki — Battle Art (XCX)",
395+ "url": "https://www.xenoserieswiki.org/wiki/Battle_Art_(XCX)",
396+ "edition": "both"
397+ },
398+ {
399+ "label": "Xeno Series Wiki — Skill (XCX)",
400+ "url": "https://www.xenoserieswiki.org/wiki/Skill_(XCX)",
401+ "edition": "both"
402+ },
403+ {
404+ "label": "Xeno Series Wiki — Sakuraba Industries",
405+ "url": "https://www.xenoserieswiki.org/wiki/Sakuraba_Industries",
406+ "edition": "both"
407+ },
408+ {
409+ "label": "Xeno Series Wiki — Grenada Galactic Group",
410+ "url": "https://www.xenoserieswiki.org/wiki/Grenada_Galactic_Group",
411+ "edition": "both"
412+ },
413+ {
414+ "label": "Xeno Series Wiki — Candid & Credible",
415+ "url": "https://www.xenoserieswiki.org/wiki/Candid_%26_Credible",
416+ "edition": "both"
417+ },
418+ {
419+ "label": "Xeno Series Wiki — Armor (XCX)",
420+ "url": "https://www.xenoserieswiki.org/wiki/Armor_(XCX)",
421+ "edition": "both"
422+ }
423+ ]
424+ },
425+ "Doug": {
426+ "role": [
427+ "Beam-leaning Photon Saber/Raygun hybrid support",
428+ "Hybride de soutien laser au sabre photonique/pistolet laser"
429+ ],
430+ "rationale": [
431+ "Keep Doug’s legal Photon Saber + Raygun defaults, then add cleanse, healing and debuff utility. Beam Barrage gains damage with an aura; Geolibrium supplies beam resistance/regeneration; Astral Heal heals. Geolibrium and Astral Heal are the only TP Arts. This is editorial: the published Game8 Doug list uses Longsword/Gatling Arts, not Doug’s weapons.",
432+ "Garder les Arts légaux par défaut de Doug, sabre photonique + pistolet laser, puis ajouter dissipation, soins et affaiblissements. Beam Barrage gagne des dégâts avec une aura ; Geolibrium apporte résistance laser/régénération ; Astral Heal soigne. Geolibrium et Astral Heal sont les deux seuls Arts à PT. Choix éditorial : la liste Game8 publiée utilise des Arts d’épée longue/mitrailleuse, pas les armes de Doug."
433+ ],
434+ "arts": [
435+ "Starfall Blade",
436+ "Starfall Rondo",
437+ "Beam Barrage",
438+ "Geolibrium",
439+ "Myopic Screen",
440+ "Astral Purge",
441+ "Astral Heal",
442+ "Subterfuge"
443+ ],
444+ "skills": [
445+ "Inner Search",
446+ "Beam Boost",
447+ "High Tension",
448+ "Aura Assault"
449+ ],
450+ "artSubstitutes": [
451+ "Phenomenon",
452+ "Pathogen Blast",
453+ "Gravity Blast",
454+ "Ether Blast",
455+ "Novalibrium"
456+ ],
457+ "skillSubstitutes": [
458+ "Mechanoid Slayer",
459+ "Knight's Soul",
460+ "Supreme Sword"
461+ ],
462+ "equipment": {
463+ "weapons": [
464+ "Grenada Galactic Group Lastyr Raygun + Fulge Photon Saber, AM Level 1. Grenada’s product portfolio is beam-focused. Sakuraba Raygun + Saber are initial-maker alternatives.",
465+ "Grenada Galactic Group, Lastyr (pistolet laser) + Fulge (sabre photonique), AM niv. 1. Sa gamme est orientée laser. Sakuraba Raygun + Saber sont des alternatives du fabricant initial."
466+ ],
467+ "armor": [
468+ "Grenada Medium Wear: Spex, Torse, Quantlet, Soales, AM Level 1. Its ground armor trends beam-resistant. Use Light Wear at AM Level 2 if Gravity resistance matters more than defense.",
469+ "Armure moyenne Grenada : Spex, Torse, Quantlet, Soales, AM niv. 1. Ses armures terrestres tendent à résister aux lasers. Choisir l’armure légère AM niv. 2 si la résistance Gravité compte davantage que la défense."
470+ ],
471+ "availability": [
472+ "Grenada is an initial AM; Raygun/Photon Saber series and Medium Wear are AM Level 1. Light Wear requires AM Level 2 and 2,000 R&D. Sakuraba is the initial-maker alternative; its Medium Wear is AM Level 1.",
473+ "Grenada est un fabricant initial ; séries pistolet laser/sabre photonique et armure moyenne disponibles à AM niv. 1. L’armure légère exige AM niv. 2 et 2 000 points de R&D. Sakuraba est l’alternative initiale ; son armure moyenne est AM niv. 1."
474+ ]
475+ },
476+ "sources": [
477+ {
478+ "label": "Xeno Series Wiki — Doug/Gameplay",
479+ "url": "https://www.xenoserieswiki.org/wiki/Doug/Gameplay",
480+ "edition": "both"
481+ },
482+ {
483+ "label": "Game8 — Doug Best Build (DE; personal ranks and TP recommendations checked against XSW)",
484+ "url": "https://game8.co/games/Xenoblade-Chronicles-X/archives/507626",
485+ "edition": "DE"
486+ },
487+ {
488+ "label": "Game8 — Best Builds for All Characters (DE)",
489+ "url": "https://game8.co/games/Xenoblade-Chronicles-X/archives/506659",
490+ "edition": "DE"
491+ },
492+ {
493+ "label": "Xeno Series Wiki — Battle Art (XCX)",
494+ "url": "https://www.xenoserieswiki.org/wiki/Battle_Art_(XCX)",
495+ "edition": "both"
496+ },
497+ {
498+ "label": "Xeno Series Wiki — Skill (XCX)",
499+ "url": "https://www.xenoserieswiki.org/wiki/Skill_(XCX)",
500+ "edition": "both"
501+ },
502+ {
503+ "label": "Xeno Series Wiki — Sakuraba Industries",
504+ "url": "https://www.xenoserieswiki.org/wiki/Sakuraba_Industries",
505+ "edition": "both"
506+ },
507+ {
508+ "label": "Xeno Series Wiki — Grenada Galactic Group",
509+ "url": "https://www.xenoserieswiki.org/wiki/Grenada_Galactic_Group",
510+ "edition": "both"
511+ },
512+ {
513+ "label": "Xeno Series Wiki — Armor (XCX)",
514+ "url": "https://www.xenoserieswiki.org/wiki/Armor_(XCX)",
515+ "edition": "both"
516+ }
517+ ]
518+ },
519+ "Lao": {
520+ "role": [
521+ "Ranged Electric/Shock DPS; permanently unavailable after Chapter 9",
522+ "DPS électrique/Choc à distance ; indisponible définitivement après le chapitre 9"
523+ ],
524+ "rationale": [
525+ "Arcing Horn lowers Electric resistance; Trident Buster applies Shock; Conductive Strike and Electric Boost support Electric/Shock damage. Ghost Sniper adds critical/ranged accuracy/TP support. The final two TP Arts are Trident Buster and Ghost Sniper; Afterburner is dropped from Game8’s three-TP candidate list.",
526+ "Arcing Horn réduit la résistance électrique ; Trident Buster applique Choc ; Conductive Strike et Electric Boost soutiennent les dégâts Électrique/Choc. Ghost Sniper apporte critiques/précision à distance/soutien PT. Les deux Arts à PT sont Trident Buster et Ghost Sniper ; Afterburner est retiré de la liste Game8 qui en contient trois."
527+ ],
528+ "arts": [
529+ "Balance Breaker",
530+ "Arcing Horn",
531+ "Trident Buster",
532+ "Overwhelm",
533+ "Shrapnel",
534+ "Eagle Eye",
535+ "Ghost Sniper",
536+ "Intercept"
537+ ],
538+ "skills": [
539+ "Knock 'n' Shock",
540+ "Conductive Strike",
541+ "Electric Boost"
542+ ],
543+ "artSubstitutes": [
544+ "First Down",
545+ "Sidewinder",
546+ "Spiral Horn",
547+ "Hair Trigger",
548+ "Hawkeye",
549+ "Raijin",
550+ "Afterburner"
551+ ],
552+ "skillSubstitutes": [
553+ "Killshot",
554+ "Piscinoid Slayer",
555+ "Long Shot",
556+ "Quick Reload",
557+ "TP Overdrive"
558+ ],
559+ "equipment": {
560+ "weapons": [
561+ "Candid & Credible Trigger Sniper Rifle + Bolide Javelin, AM Level 1 after Chapter 5. C&C says its weapons are Electric except Dual Guns and Shield, so both match Lao’s weapon types and Electric build. Before that gate, use Sakuraba Sniper Rifle + Spear series (AM Level 1, physical alternative).",
562+ "Candid & Credible, Trigger (fusil de précision) + Bolide (javelot), AM niv. 1 après le chapitre 5. C&C précise que ses armes sont électriques, sauf Dual Guns et Shield ; les deux séries correspondent aux armes et au build électrique de Lao. Avant ce déblocage, utiliser les séries Sakuraba Sniper Rifle + Spear (AM niv. 1, alternative physique)."
563+ ],
564+ "armor": [
565+ "Candid & Credible Medium Wear: Sights, Encaser, Grip, Distancers, AM Level 1 after the Chapter 5 gate. C&C ground armor trends high-defense. Light Wear at AM Level 2/7,000 R&D trades defense for higher resistance, especially Gravity.",
566+ "Armure moyenne Candid & Credible : Sights, Encaser, Grip, Distancers, AM niv. 1 après le chapitre 5. Les armures terrestres C&C tendent vers une défense élevée. L’armure légère AM niv. 2/7 000 points de R&D échange de la défense contre des résistances accrues, surtout Gravité."
567+ ],
568+ "availability": [
569+ "C&C unlocks after Chapter 5; weapon lines and Medium Wear are AM Level 1. Light Wear needs AM Level 2 and 7,000 R&D. Before Chapter 5, Sakuraba Sniper Rifle/Spear and Medium Wear are available from the initial AM. Lao is permanently unplayable after Chapter 9.",
570+ "C&C se débloque après le chapitre 5 ; armes et armure moyenne disponibles à AM niv. 1. L’armure légère exige AM niv. 2 et 7 000 points de R&D. Avant le chapitre 5, les séries Sniper Rifle/Spear et l’armure moyenne Sakuraba sont disponibles chez le fabricant initial. Lao devient définitivement indisponible après le chapitre 9."
571+ ]
572+ },
573+ "sources": [
574+ {
575+ "label": "Xeno Series Wiki — Lao/Gameplay",
576+ "url": "https://www.xenoserieswiki.org/wiki/Lao/Gameplay",
577+ "edition": "both"
578+ },
579+ {
580+ "label": "Game8 — Lao Best Build (DE)",
581+ "url": "https://game8.co/games/Xenoblade-Chronicles-X/archives/506554",
582+ "edition": "DE"
583+ },
584+ {
585+ "label": "Nintendo Life — Best Combat Builds for All Characters (DE)",
586+ "url": "https://www.nintendolife.com/guides/xenoblade-chronicles-x-best-combat-builds-for-all-characters",
587+ "edition": "DE"
588+ },
589+ {
590+ "label": "Reddit — A Guide to Xenoblade X DE Party Member Builds (search-indexed; direct fetch blocked)",
591+ "url": "https://www.reddit.com/r/Xenoblade_Chronicles/comments/1jnyxkz/a_guide_to_xenoblade_x_de_party_member_builds/",
592+ "edition": "DE"
593+ },
594+ {
595+ "label": "Xeno Series Wiki — Battle Art (XCX)",
596+ "url": "https://www.xenoserieswiki.org/wiki/Battle_Art_(XCX)",
597+ "edition": "both"
598+ },
599+ {
600+ "label": "Xeno Series Wiki — Skill (XCX)",
601+ "url": "https://www.xenoserieswiki.org/wiki/Skill_(XCX)",
602+ "edition": "both"
603+ },
604+ {
605+ "label": "Xeno Series Wiki — Sakuraba Industries",
606+ "url": "https://www.xenoserieswiki.org/wiki/Sakuraba_Industries",
607+ "edition": "both"
608+ },
609+ {
610+ "label": "Xeno Series Wiki — Candid & Credible",
611+ "url": "https://www.xenoserieswiki.org/wiki/Candid_%26_Credible",
612+ "edition": "both"
613+ },
614+ {
615+ "label": "Xeno Series Wiki — Armor (XCX)",
616+ "url": "https://www.xenoserieswiki.org/wiki/Armor_(XCX)",
617+ "edition": "both"
618+ }
619+ ]
620+ },
621+ "L": {
622+ "role": [
623+ "Defensive tank / control-support",
624+ "Tank défensif / soutien-contrôle"
625+ ],
626+ "rationale": [
627+ "Wild Down supplies party Topple; Long Topple extends it. Shield Wall barrier, Astral Protection and Mindstorm protect/heal allies; Shooting Star adds Shock without spending TP. AI fit is steady defense/control, not burst DPS.",
628+ "Wild Down apporte Renversement ; Long Topple le prolonge. Shield Wall, Astral Protection et Mindstorm protègent/soignent ; Shooting Star ajoute Shock sans dépenser de PT. Rôle IA : défense/contrôle régulier, pas dégâts explosifs."
629+ ],
630+ "arts": [
631+ "Wild Down",
632+ "Astral Protection",
633+ "Mindstorm",
634+ "Shield Wall",
635+ "Trash Talk",
636+ "Stellar Ray",
637+ "Shooting Star",
638+ "Lightning Cloak"
639+ ],
640+ "skills": [
641+ "Steel Flesh",
642+ "Long Topple",
643+ "Shield Screen"
644+ ],
645+ "artSubstitutes": [
646+ "Wild Smash",
647+ "Reality Rift",
648+ "Bombardier",
649+ "Flame Cloak"
650+ ],
651+ "skillSubstitutes": [
652+ "Mighty Muscle",
653+ "Stand Strong"
654+ ],
655+ "equipment": {
656+ "weapons": [
657+ "Shield: Sakuraba physical Shield Series (Lv.60 320 damage, 165 TP gain) gives greater auto-attack TP than Grenada Paive (320/120). Psycho Launchers: Grenada Psylans beam (Lv.60 32 damage, 1.8 s, 5 ammo, 3 TP gain) pairs with Stellar Ray’s weapon-damage/Beam-Res-Down role. This beam model does not change Shooting Star’s fixed electric damage.",
658+ "Bouclier : Shield Series physique Sakuraba (niv. 60 : 320 dégâts, 165 PT) génère plus de PT que Paive Grenada (320/120). Lanceurs psycho : Psylans laser Grenada (niv. 60 : 32 dégâts, 1,8 s, 5 munitions, 3 PT) pour le rôle dégâts d’arme/baisse résistance laser de Stellar Ray. N’altère pas l’électricité fixe de Shooting Star."
659+ ],
660+ "armor": [
661+ "Orphean Light Wear (Yii/Yimsel/Yiys/Yiym): choose piece-specific Evasion, HP or Max-TP traits for this Astral Protection tank; Light Wear itself does not grant evasion. Representative Lv.55 torso Yimsel has Defense 40 and Gravity +20; C&C Heavy Bulwark has Defense 100, Electric +20, Gravity −15. Weigh those defense/resistance tradeoffs for the encounter; traits are not guaranteed set defaults. [Armor table](https://xenoblade.fandom.com/wiki/Armor).",
662+ "Armure légère Orphean Technologies (Yii/Yimsel/Yiys/Yiym) : viser les traits esquive/PV/PT max sur les pièces pour ce tank à Astral Protection ; la catégorie légère ne donne pas d’esquive en soi. Torse Yimsel niv. 55 : Défense 40, Gravité +20 ; Bulwark lourd C&C : Défense 100, Électricité +20, Gravité −15. Adapter défense/résistance à l’ennemi ; traits non garantis. [Table armure](https://xenoblade.fandom.com/wiki/Armor)."
663+ ],
664+ "availability": [
665+ "Orphean unlocks after Rescue at the Ensconced Citadel; AM level 2 unlocks Light, level 3 Heavy. Early fallback: currently stocked Sakuraba Light armor and legal physical Shield/available launcher until preferred models are available.",
666+ "Orphean se débloque après Rescue at the Ensconced Citadel ; niveau fabricant 2 pour léger, 3 pour lourd. Alternative précoce : armure légère Sakuraba en stock et bouclier physique/lanceur disponible."
667+ ]
668+ },
669+ "sources": [
670+ {
671+ "label": "Xeno Series Wiki personal gameplay record (weapon pair, Skill slots, Art/Skill personal ranks)",
672+ "url": "https://www.xenoserieswiki.org/wiki/L/Gameplay",
673+ "edition": "both"
674+ },
675+ {
676+ "label": "DE party-member build guide by Stuart98",
677+ "url": "https://www.reddit.com/r/Xenoblade_Chronicles/comments/1jnyxkz/a_guide_to_xenoblade_x_de_party_member_builds/",
678+ "edition": "DE"
679+ },
680+ {
681+ "label": "2015 GameFAQs party-member build thread",
682+ "url": "https://gamefaqs.gamespot.com/boards/701151-xenoblade-chronicles-x/73179135",
683+ "edition": "XCX"
684+ },
685+ {
686+ "label": "Arms Manufacturer story locks and R&D tier facts",
687+ "url": "https://www.xenoserieswiki.org/wiki/Arms_Manufacturer",
688+ "edition": "both"
689+ },
690+ {
691+ "label": "Armor / maker traits and weight details",
692+ "url": "https://xenoblade.fandom.com/wiki/Orphean_Technologies",
693+ "edition": "both"
694+ },
695+ {
696+ "label": "Nintendo Life independent role/build excerpt; direct reader returned feed",
697+ "url": "https://www.nintendolife.com/guides/xenoblade-chronicles-x-best-combat-builds-for-all-characters",
698+ "edition": "XCX"
699+ },
700+ {
701+ "label": "Shield Arts TP costs and weapon models",
702+ "url": "https://xenoblade.fandom.com/wiki/Shield",
703+ "edition": "XCX"
704+ },
705+ {
706+ "label": "Psycho Launchers Arts TP costs and weapon models",
707+ "url": "https://xenoblade.fandom.com/wiki/Psycho_Launchers",
708+ "edition": "XCX"
709+ },
710+ {
711+ "label": "Representative Lv.55 torso defense/resistance values by armor manufacturer",
712+ "url": "https://xenoblade.fandom.com/wiki/Armor",
713+ "edition": "XCX"
714+ }
715+ ]
716+ },
717+ "H.B.": {
718+ "role": [
719+ "Tank / party TP battery / Topple control",
720+ "Tank / batterie PT du groupe / contrôle Renversement"
721+ ],
722+ "rationale": [
723+ "Wild Down and Long Topple/Topple Topper form reliable control; taunts and Shield Wall protect the party. Last Stand converts H.B.’s TP into ally TP. Canonical TP spenders: Wild Down and Last Stand only.",
724+ "Wild Down et Long Topple/Topple Topper forment un contrôle fiable ; provocations et Shield Wall protègent. Last Stand convertit les PT de H.B. en PT alliés. Seuls Wild Down et Last Stand consomment des PT."
725+ ],
726+ "arts": [
727+ "Wild Down",
728+ "Shield Wall",
729+ "Decoy Round",
730+ "Last Stand",
731+ "Wild Smash",
732+ "Trash Talk",
733+ "Takedown Shot",
734+ "Power Dive"
735+ ],
736+ "skills": [
737+ "Steel Flesh",
738+ "Long Topple",
739+ "Topple Topper",
740+ "Combat Presence"
741+ ],
742+ "artSubstitutes": [
743+ "Atomic Hit",
744+ "Furious Blast",
745+ "Flash Grenade",
746+ "Bombardier"
747+ ],
748+ "skillSubstitutes": [
749+ "Mighty Muscle",
750+ "Shield Screen",
751+ "Trauma Tension",
752+ "Double Spike"
753+ ],
754+ "equipment": {
755+ "weapons": [
756+ "Shield: Candid & Credible Haven II physical, Lv.60 320 damage/3.3 s/200 TP gain, supports TP throughput. Assault Rifle: Sakuraba physical (Lv.60 16 damage/2.7 s/20 ammo/1 TP), so weapon-damage Takedown Shot stays physical. Before C&C unlock use Sakuraba Shield (320/165 TP).",
757+ "Bouclier Haven II physique C&C, niv. 60 : 320 dégâts/3,3 s/200 PT, bon débit PT. Fusil d’assaut physique Sakuraba (16/2,7 s/20 munitions/1 PT) pour Takedown Shot. Avant C&C : bouclier Sakuraba (320/165 PT)."
758+ ],
759+ "armor": [
760+ "Candid & Credible Heavy Wear (Armet/Bulwark/Wrest/Stabilizers): high-defense maker and explicit raw-defense choice for taunting frontline. Representative Lv.55 torso Bulwark has Defense 100, Electric +20, Gravity −15; Light Breaker has Defense 60, Electric +20, Gravity −5. Heavy Wear trades gravity resistance/upgrade flexibility for defense. [Armor table](https://xenoblade.fandom.com/wiki/Armor).",
761+ "Armure lourde C&C (Armet/Bulwark/Wrest/Stabilizers) : défense brute pour tank de première ligne. Torse Bulwark niv. 55 : Défense 100, Électricité +20, Gravité −15 ; Breaker léger : Défense 60, Électricité +20, Gravité −5. Lourd échange résistance gravitationnelle/flexibilité contre défense. [Table armure](https://xenoblade.fandom.com/wiki/Armor)."
762+ ],
763+ "availability": [
764+ "C&C unlocks after Chapter 5; Haven II series is AM level 2, Heavy Wear level 3. Earlier fallback: Sakuraba physical Shield/Assault Rifle and currently available armor weight.",
765+ "C&C après chapitre 5 ; Haven II au niveau fabricant 2, armure lourde au niveau 3. Alternative antérieure : bouclier/fusil physiques Sakuraba et poids d’armure disponible."
766+ ]
767+ },
768+ "sources": [
769+ {
770+ "label": "Xeno Series Wiki personal gameplay record (weapon pair, Skill slots, Art/Skill personal ranks)",
771+ "url": "https://www.xenoserieswiki.org/wiki/H.B./Gameplay",
772+ "edition": "both"
773+ },
774+ {
775+ "label": "DE party-member build guide by Stuart98",
776+ "url": "https://www.reddit.com/r/Xenoblade_Chronicles/comments/1jnyxkz/a_guide_to_xenoblade_x_de_party_member_builds/",
777+ "edition": "DE"
778+ },
779+ {
780+ "label": "2015 GameFAQs party-member build thread",
781+ "url": "https://gamefaqs.gamespot.com/boards/701151-xenoblade-chronicles-x/73179135",
782+ "edition": "XCX"
783+ },
784+ {
785+ "label": "Arms Manufacturer story locks and R&D tier facts",
786+ "url": "https://www.xenoserieswiki.org/wiki/Arms_Manufacturer",
787+ "edition": "both"
788+ },
789+ {
790+ "label": "Armor / maker traits and weight details",
791+ "url": "https://xenoblade.fandom.com/wiki/Candid_%26_Credible",
792+ "edition": "both"
793+ },
794+ {
795+ "label": "Nintendo Life independent role/build excerpt; direct reader returned feed",
796+ "url": "https://www.nintendolife.com/guides/xenoblade-chronicles-x-best-combat-builds-for-all-characters",
797+ "edition": "XCX"
798+ },
799+ {
800+ "label": "Shield Arts TP costs and weapon models",
801+ "url": "https://xenoblade.fandom.com/wiki/Shield",
802+ "edition": "XCX"
803+ },
804+ {
805+ "label": "Assault Rifle Arts TP costs and weapon models",
806+ "url": "https://xenoblade.fandom.com/wiki/Assault_Rifle",
807+ "edition": "XCX"
808+ },
809+ {
810+ "label": "Representative Lv.55 torso defense/resistance values by armor manufacturer",
811+ "url": "https://xenoblade.fandom.com/wiki/Armor",
812+ "edition": "XCX"
813+ }
814+ ]
815+ },
816+ "Alexa": {
817+ "role": [
818+ "Electric control / durable bruiser-support",
819+ "Contrôle électrique / combattante de soutien résistante"
820+ ],
821+ "rationale": [
822+ "Arcing Horn lowers Electric Resistance; Trident Buster inflicts Shock, supported by Electric Boost. Raijin adds healing/reflect, Assault Hammer adds non-TP Topple. Maximum Voltage is legal but its post-Skell-destruction bonus is situational and another TP Art would break the two-Art package.",
823+ "Arcing Horn réduit la résistance électrique ; Trident Buster applique Shock, soutenu par Electric Boost. Raijin soigne/réflecte, Assault Hammer renverse sans PT. Maximum Voltage est légal mais son bonus après destruction de Skell est situationnel et dépasserait le plafond PT."
824+ ],
825+ "arts": [
826+ "Arcing Horn",
827+ "Raijin",
828+ "Trident Buster",
829+ "Assault Hammer",
830+ "Power Dive",
831+ "Decoy Round",
832+ "Furious Blast",
833+ "Overwhelm"
834+ ],
835+ "skills": [
836+ "Fortified Flesh",
837+ "Electric Boost",
838+ "High Tension"
839+ ],
840+ "artSubstitutes": [
841+ "Spiral Horn",
842+ "Hair Trigger",
843+ "Flash Grenade"
844+ ],
845+ "skillSubstitutes": [
846+ "Steel Flesh",
847+ "Quick Reload",
848+ "TP Overdrive"
849+ ],
850+ "equipment": {
851+ "weapons": [
852+ "Candid & Credible Bolide Electric Javelin (Lv.60 312 damage/2.5 s/155 TP) and Assailer Electric Assault Rifle (Lv.60 16 damage/2.7 s/20 ammo/1 TP). These attributes support weapon-damage Arts; Arcing Horn, Trident Buster and Maximum Voltage have fixed Art elements.",
853+ "Javelin électrique Bolide C&C (niv. 60 : 312 dégâts/2,5 s/155 PT) et fusil électrique Assailer (16/2,7 s/20 munitions/1 PT). Attribut pour Arts à dégâts d’arme ; Arcing Horn, Trident Buster et Maximum Voltage ont un élément fixe."
854+ ],
855+ "armor": [
856+ "Candid & Credible Light Wear (Screen/Breaker/Ward/Trudgers): Max TP and Electric Res traits exist on relevant slots; representative Lv.55 torso Breaker is Defense 60, Electric +20, Gravity −5. Heavy Bulwark is Defense 100, Electric +20, Gravity −15; choose only if raw defense beats those tradeoffs. Inspect actual item traits. [Armor table](https://xenoblade.fandom.com/wiki/Armor).",
857+ "Armure légère C&C (Screen/Breaker/Ward/Trudgers) : traits PT max/résistance électrique sur certains emplacements ; torse Breaker niv. 55 : Défense 60, Électricité +20, Gravité −5. Bulwark lourd : Défense 100, Électricité +20, Gravité −15 ; préférer seulement si défense brute prime. Vérifier les traits. [Table armure](https://xenoblade.fandom.com/wiki/Armor)."
858+ ],
859+ "availability": [
860+ "C&C unlocks after Chapter 5; Light Wear requires AM level 2, Heavy level 3. Before then use Sakuraba physical weapons/armor; fixed-electric Arts stay electric, weapon-damage Arts inherit physical. Skell mode must not replace ground build.",
861+ "C&C après chapitre 5 ; armure légère au niveau 2, lourde au niveau 3. Avant, armes/armure physiques Sakuraba ; Arts électriques fixes inchangés, Arts de dégâts d’arme héritent du physique. Le mode Skell ne remplace pas le build au sol."
862+ ]
863+ },
864+ "sources": [
865+ {
866+ "label": "Xeno Series Wiki personal gameplay record (weapon pair, Skill slots, Art/Skill personal ranks)",
867+ "url": "https://www.xenoserieswiki.org/wiki/Alexa/Gameplay",
868+ "edition": "both"
869+ },
870+ {
871+ "label": "DE party-member build guide by Stuart98",
872+ "url": "https://www.reddit.com/r/Xenoblade_Chronicles/comments/1jnyxkz/a_guide_to_xenoblade_x_de_party_member_builds/",
873+ "edition": "DE"
874+ },
875+ {
876+ "label": "2015 GameFAQs party-member build thread",
877+ "url": "https://gamefaqs.gamespot.com/boards/701151-xenoblade-chronicles-x/73179135",
878+ "edition": "XCX"
879+ },
880+ {
881+ "label": "Arms Manufacturer story locks and R&D tier facts",
882+ "url": "https://www.xenoserieswiki.org/wiki/Arms_Manufacturer",
883+ "edition": "both"
884+ },
885+ {
886+ "label": "Armor / maker traits and weight details",
887+ "url": "https://xenoblade.fandom.com/wiki/Candid_%26_Credible",
888+ "edition": "both"
889+ },
890+ {
891+ "label": "Assault Rifle Arts TP costs and weapon models",
892+ "url": "https://xenoblade.fandom.com/wiki/Assault_Rifle",
893+ "edition": "XCX"
894+ },
895+ {
896+ "label": "Javelin Arts TP costs and weapon models",
897+ "url": "https://xenoblade.fandom.com/wiki/Javelin",
898+ "edition": "both"
899+ },
900+ {
901+ "label": "Representative Lv.55 torso defense/resistance values by armor manufacturer",
902+ "url": "https://xenoblade.fandom.com/wiki/Armor",
903+ "edition": "XCX"
904+ }
905+ ]
906+ },
907+ "Bozé": {
908+ "role": [
909+ "Long-range Electric / Shock setup",
910+ "Tir à longue portée électrique / Shock"
911+ ],
912+ "rationale": [
913+ "Arcing Horn lowers Electric Resistance, Trident Buster inflicts Shock; Electric Boost, Conductive Strike and Knock ’n’ Shock support this package. Eagle Eye boosts ranged accuracy/attack. Shock-dependent value falls against resistance/immunity; no evidence supports universal top-tier claims.",
914+ "Arcing Horn baisse la résistance électrique, Trident Buster applique Shock ; Electric Boost, Conductive Strike et Knock ’n’ Shock soutiennent le package. Eagle Eye améliore précision/attaque à distance. Valeur Shock réduite contre résistance/immunité ; aucune preuve d’une supériorité universelle."
915+ ],
916+ "arts": [
917+ "Arcing Horn",
918+ "Eagle Eye",
919+ "Sidewinder",
920+ "Shrapnel",
921+ "Trident Buster",
922+ "Hair Trigger",
923+ "Hawkeye",
924+ "Overwhelm"
925+ ],
926+ "skills": [
927+ "Electric Boost",
928+ "Conductive Strike",
929+ "Knock 'n' Shock"
930+ ],
931+ "artSubstitutes": [
932+ "Spiral Horn",
933+ "Raijin",
934+ "Vortex",
935+ "First Down",
936+ "Intercept"
937+ ],
938+ "skillSubstitutes": [
939+ "Master Edge",
940+ "Killshot",
941+ "Electric Guard",
942+ "Quick Reload",
943+ "TP Overdrive"
944+ ],
945+ "equipment": {
946+ "weapons": [
947+ "Candid & Credible Bolide Electric Javelin (Lv.60 312 damage/2.5 s/155 TP) + Trigger Electric Sniper Rifle (Lv.60 112 damage/4 s/5 ammo/7 TP). Fixed-electric Arts retain their attribute.",
948+ "Javelin électrique Bolide C&C (niv. 60 : 312 dégâts/2,5 s/155 PT) + fusil de précision électrique Trigger (112 dégâts/4 s/5 munitions/7 PT). Arts électriques fixes gardent leur attribut."
949+ ],
950+ "armor": [
951+ "Candid & Credible Light Wear: target piece-specific Electric Res/Max TP traits; representative Lv.55 torso Breaker has Defense 60, Electric +20, Gravity −5. Heavy Bulwark raises Defense to 100 but Gravity falls to −15. Light does not grant mobility; favor these verified resistances/traits for the encounter rather than assuming a universal best weight. [Armor table](https://xenoblade.fandom.com/wiki/Armor).",
952+ "Armure légère C&C : viser les traits résistance électrique/PT max sur certaines pièces ; torse Breaker niv. 55 : Défense 60, Électricité +20, Gravité −5. Bulwark lourd monte à Défense 100 mais descend à Gravité −15. Le léger ne confère pas de mobilité ; comparer ces résistances/traits selon l’ennemi plutôt que supposer un poids idéal. [Table armure](https://xenoblade.fandom.com/wiki/Armor)."
953+ ],
954+ "availability": [
955+ "C&C unlocks after Chapter 5; Light Wear AM level 2, Heavy level 3. Earlier fallback: Sakuraba physical Javelin/Sniper Rifle; fixed-electric Arts remain electric. Keep fixed build even against Shock-resistant targets.",
956+ "C&C après chapitre 5 ; armure légère niveau fabricant 2, lourde 3. Alternative antérieure : Javelin/fusil de précision physiques Sakuraba ; Arts électriques fixes inchangés. Garder le build fixe contre ennemis résistants à Shock."
957+ ]
958+ },
959+ "sources": [
960+ {
961+ "label": "Xeno Series Wiki personal gameplay record (weapon pair, Skill slots, Art/Skill personal ranks)",
962+ "url": "https://www.xenoserieswiki.org/wiki/Boz%C3%A9/Gameplay",
963+ "edition": "both"
964+ },
965+ {
966+ "label": "DE party-member build guide by Stuart98",
967+ "url": "https://www.reddit.com/r/Xenoblade_Chronicles/comments/1jnyxkz/a_guide_to_xenoblade_x_de_party_member_builds/",
968+ "edition": "DE"
969+ },
970+ {
971+ "label": "2015 GameFAQs party-member build thread",
972+ "url": "https://gamefaqs.gamespot.com/boards/701151-xenoblade-chronicles-x/73179135",
973+ "edition": "XCX"
974+ },
975+ {
976+ "label": "Arms Manufacturer story locks and R&D tier facts",
977+ "url": "https://www.xenoserieswiki.org/wiki/Arms_Manufacturer",
978+ "edition": "both"
979+ },
980+ {
981+ "label": "Armor / maker traits and weight details",
982+ "url": "https://xenoblade.fandom.com/wiki/Candid_%26_Credible",
983+ "edition": "both"
984+ },
985+ {
986+ "label": "Javelin Arts TP costs and weapon models",
987+ "url": "https://xenoblade.fandom.com/wiki/Javelin",
988+ "edition": "both"
989+ },
990+ {
991+ "label": "Sniper Rifle Arts TP costs and weapon models",
992+ "url": "https://xenoblade.fandom.com/wiki/Sniper_Rifle",
993+ "edition": "both"
994+ },
995+ {
996+ "label": "Representative Lv.55 torso defense/resistance values by armor manufacturer",
997+ "url": "https://xenoblade.fandom.com/wiki/Armor",
998+ "edition": "XCX"
999+ }
1000+ ]
1001+ },
1002+ "Celica": {
1003+ "role": [
1004+ "Ether debuff / Potential Dual Guns DPS with defense",
1005+ "Débuff Éther / DPS Potentiel aux Deux armes avec défense"
1006+ ],
1007+ "rationale": [
1008+ "Black Butterfly and Black Bane are Knife Arts with fixed Ether damage; Black Butterfly applies Ether Res Down, supporting Black Bane’s debuff scaling. Zero Zero/Executioner use weapon damage on Dual Guns; Ghostwalker adds survival. Full Specs and Executioner are the only TP Arts. Absorber Skin supplies non-TP Barrier. Sleep is fragile in party AI [editorial].",
1009+ "Black Butterfly et Black Bane sont des Arts Couteau à dégâts Éther fixes ; Black Butterfly baisse résistance Éther et prépare Black Bane. Zero Zero/Executioner utilisent dégâts d’arme aux Deux armes ; Ghostwalker protège. Full Specs et Executioner sont les seuls Arts PT. Absorber Skin apporte Barrière sans PT. Sommeil fragile en IA de groupe [éditorial]."
1010+ ],
1011+ "arts": [
1012+ "Black Butterfly",
1013+ "Black Bane",
1014+ "Full Specs",
1015+ "Zero Zero",
1016+ "Ghostwalker",
1017+ "Primer",
1018+ "Executioner",
1019+ "Absorber Skin"
1020+ ],
1021+ "skills": [
1022+ "Steady Hand",
1023+ "Inner Search",
1024+ "Mindscape"
1025+ ],
1026+ "artSubstitutes": [
1027+ "Sliding Slinger",
1028+ "Screamer",
1029+ "Violent Streak"
1030+ ],
1031+ "skillSubstitutes": [
1032+ "Aura Burst",
1033+ "Fleet Feet",
1034+ "Gentle Approach",
1035+ "Feather Touch",
1036+ "Red Zone"
1037+ ],
1038+ "equipment": {
1039+ "weapons": [
1040+ "Meredith & Co. Ether Pistolia Dual Guns (Lv.60 24 damage/2.0 s/6 ammo/2 TP) for weapon-damage Zero Zero/Executioner; Ether Pugio Knife (56 damage/1.0 s/60 TP). Critical correction: Black Butterfly is Knife-only, fixed Ether; Ether Dual Guns neither equip it nor boost its listed damage.",
1041+ "Deux armes Éther Pistolia Meredith & Co. (niv. 60 : 24 dégâts/2 s/6 munitions/2 PT) pour Zero Zero/Executioner à dégâts d’arme ; couteau Éther Pugio (56 dégâts/1 s/60 PT). Correction : Black Butterfly est Couteau uniquement, Éther fixe ; les Deux armes Éther ne l’équipent ni n’augmentent ses dégâts."
1042+ ],
1043+ "armor": [
1044+ "Orphean Light Wear: Yii head may have Potential Up/Potential Boost; other slots can supply Max HP/TP, Evasion, Overdrive traits. Representative Lv.55 torso Yimsel has Defense 40 and Gravity +20; C&C Light Breaker has Defense 60, Electric +20 and Gravity −5. Target actual traits by piece; shop stock contains only a subset. [Armor table](https://xenoblade.fandom.com/wiki/Armor).",
1045+ "Armure légère Orphean : couvre-chef Yii peut porter Potential Up/Potential Boost ; autres pièces PV/PT max, esquive, traits Overdrive. Torse Yimsel niv. 55 : Défense 40, Gravité +20 ; Breaker C&C léger : Défense 60, Électricité +20, Gravité −5. Vérifier les traits réels ; boutique limitée. [Table armure](https://xenoblade.fandom.com/wiki/Armor)."
1046+ ],
1047+ "availability": [
1048+ "Meredith unlocks after Chapter 4. Orphean armor requires Rescue at the Ensconced Citadel and AM level 2 Light Wear; C&C unlocks after Chapter 5 and also needs level 2 Light Wear. Earlier fallback: Sakuraba-compatible Dual Guns/Knife and current armor; fixed Ether Arts stay Ether.",
1049+ "Meredith après chapitre 4. Armure Orphean après Rescue at the Ensconced Citadel et niveau fabricant 2 (léger) ; C&C après chapitre 5 et niveau 2. Alternative : Deux armes/Couteau Sakuraba et armure actuelle ; Arts Éther fixes inchangés."
1050+ ]
1051+ },
1052+ "sources": [
1053+ {
1054+ "label": "Xeno Series Wiki personal gameplay record (weapon pair, Skill slots, Art/Skill personal ranks)",
1055+ "url": "https://www.xenoserieswiki.org/wiki/Celica/Gameplay",
1056+ "edition": "both"
1057+ },
1058+ {
1059+ "label": "DE party-member build guide by Stuart98",
1060+ "url": "https://www.reddit.com/r/Xenoblade_Chronicles/comments/1jnyxkz/a_guide_to_xenoblade_x_de_party_member_builds/",
1061+ "edition": "DE"
1062+ },
1063+ {
1064+ "label": "2015 GameFAQs party-member build thread",
1065+ "url": "https://gamefaqs.gamespot.com/boards/701151-xenoblade-chronicles-x/73179135",
1066+ "edition": "XCX"
1067+ },
1068+ {
1069+ "label": "Arms Manufacturer story locks and R&D tier facts",
1070+ "url": "https://www.xenoserieswiki.org/wiki/Arms_Manufacturer",
1071+ "edition": "both"
1072+ },
1073+ {
1074+ "label": "Armor / maker traits and weight details",
1075+ "url": "https://xenoblade.fandom.com/wiki/Orphean_Technologies",
1076+ "edition": "both"
1077+ },
1078+ {
1079+ "label": "Nintendo Life article excerpt says build still coming soon",
1080+ "url": "https://www.nintendolife.com/guides/xenoblade-chronicles-x-best-combat-builds-for-all-characters",
1081+ "edition": "XCX"
1082+ },
1083+ {
1084+ "label": "Meredith manufacturer / Ether weapon models",
1085+ "url": "https://xenoblade.fandom.com/wiki/Meredith_%26_Co.",
1086+ "edition": "XCX"
1087+ },
1088+ {
1089+ "label": "Dual Guns Arts TP costs and weapon models",
1090+ "url": "https://xenoblade.fandom.com/wiki/Dual_Guns",
1091+ "edition": "both"
1092+ },
1093+ {
1094+ "label": "Knife Arts TP costs and weapon models",
1095+ "url": "https://xenoblade.fandom.com/wiki/Knife",
1096+ "edition": "both"
1097+ },
1098+ {
1099+ "label": "Representative Lv.55 torso defense/resistance values by armor manufacturer",
1100+ "url": "https://xenoblade.fandom.com/wiki/Armor",
1101+ "edition": "XCX"
1102+ }
1103+ ]
1104+ },
1105+ "Frye": {
1106+ "role": [
1107+ "Thermal ranged mob clearer / aura-assisted TP economy",
1108+ "Nettoyeur thermique à distance / économie PT avec aura"
1109+ ],
1110+ "rationale": [
1111+ "Missile Volley lowers Thermal Res; Thermal Payload adds toppled-target damage. Defensive Stance supplies an Aura so Bullet Twister/Tornado Blade can gain TP; Cool Off consumes an Aura to return TP. DE guide warns Frye is less reliable against bosses and AI/skill fit is imperfect. Two TP Arts only.",
1112+ "Missile Volley baisse résistance thermique ; Thermal Payload profite des cibles renversées. Defensive Stance fournit une aura pour Bullet Twister/Tornado Blade ; Cool Off la consomme pour rendre des PT. Guide DE juge Frye moins fiable contre boss et son IA/compétences imparfaites. Deux Arts PT maximum."
1113+ ],
1114+ "arts": [
1115+ "Missile Volley",
1116+ "Bullet Twister",
1117+ "Thermal Payload",
1118+ "Defensive Stance",
1119+ "Bullet Storm",
1120+ "Cool Off",
1121+ "Burning Slash",
1122+ "Tornado Blade"
1123+ ],
1124+ "skills": [
1125+ "Machine Gunner",
1126+ "Trauma Tension",
1127+ "Mighty Muscle"
1128+ ],
1129+ "artSubstitutes": [
1130+ "Rising Blade"
1131+ ],
1132+ "skillSubstitutes": [
1133+ "Unwavering Courage",
1134+ "Iron Knuckle",
1135+ "Rising Renewal",
1136+ "Weapon Guard",
1137+ "Blazing Auto"
1138+ ],
1139+ "equipment": {
1140+ "weapons": [
1141+ "Nopon Commerce Guild Ratatatta Thermal Gatling (Lv.60 20 damage/6.7 s/48 ammo/1 TP) for inherited-weapon Gatling Arts; Six Stars Glaive Thermal Longsword (Lv.60 204 damage/2.0 s/210 TP; Glaive II 216/180 TP) for weapon-damage Tornado Blade. Burning Slash is Longsword-only, fixed Thermal; Gatling attribute cannot affect it.",
1142+ "Gatling thermique Ratatatta Nopon Commerce Guild (niv. 60 : 20 dégâts/6,7 s/48 munitions/1 PT) pour Arts Gatling à dégâts d’arme ; épée longue thermique Glaive Six Stars (204 dégâts/2 s/210 PT ; Glaive II 216/180 PT) pour Tornado Blade. Burning Slash est Épée longue uniquement, thermique fixe ; la Gatling ne l’affecte pas."
1143+ ],
1144+ "armor": [
1145+ "Orphean Light Wear suits Frye’s high personal Dodge coefficient and ranged-mob role, but the armor weight itself grants no evasion: look for Evasion Battle Traits on the specific pieces. Representative Lv.55 torso Yimsel has Defense 40 and Gravity +20; C&C Light Breaker alternative is Defense 60, Electric +20, Gravity −5. Target HP/Evasion/Max-TP by slot; weight is not universal BIS. [Armor table](https://xenoblade.fandom.com/wiki/Armor).",
1146+ "L’armure légère Orphean convient au coefficient d’esquive élevé de Frye et à son rôle à distance, mais son poids ne donne pas d’esquive : chercher le trait de combat Esquive sur chaque pièce. Torse Yimsel niv. 55 : Défense 40, Gravité +20 ; alternative Breaker léger C&C : Défense 60, Électricité +20, Gravité −5. Cibler PV/esquive/PT max selon les pièces ; aucun poids n’est meilleur universel. [Table armure](https://xenoblade.fandom.com/wiki/Armor)."
1147+ ],
1148+ "availability": [
1149+ "Nopon unlocks after BFFs; Six Stars after A Challenger Approaches. Orphean armor requires Rescue at the Ensconced Citadel and AM level 2 for Light Wear; C&C Chapter 5/AM level 2 is fallback. Earlier weapon fallback: Sakuraba physical Gatling/Longsword; fixed Thermal Arts remain thermal. Lv.60 values are catalogue comparisons, not Frye’s guaranteed story gear.",
1150+ "Nopon après BFFs ; Six Stars après A Challenger Approaches. Armure Orphean après Rescue at the Ensconced Citadel et niveau fabricant 2 ; alternative C&C après chapitre 5/niveau 2. Armes physiques Sakuraba avant accès ; Arts thermiques fixes inchangés. Stats niv. 60 de comparaison catalogue, pas équipement d’histoire garanti."
1151+ ]
1152+ },
1153+ "sources": [
1154+ {
1155+ "label": "Xeno Series Wiki personal gameplay record (weapon pair, Skill slots, Art/Skill personal ranks)",
1156+ "url": "https://www.xenoserieswiki.org/wiki/Frye/Gameplay",
1157+ "edition": "both"
1158+ },
1159+ {
1160+ "label": "DE party-member build guide by Stuart98",
1161+ "url": "https://www.reddit.com/r/Xenoblade_Chronicles/comments/1jnyxkz/a_guide_to_xenoblade_x_de_party_member_builds/",
1162+ "edition": "DE"
1163+ },
1164+ {
1165+ "label": "2015 GameFAQs party-member build thread",
1166+ "url": "https://gamefaqs.gamespot.com/boards/701151-xenoblade-chronicles-x/73179135",
1167+ "edition": "XCX"
1168+ },
1169+ {
1170+ "label": "Arms Manufacturer story locks and R&D tier facts",
1171+ "url": "https://www.xenoserieswiki.org/wiki/Arms_Manufacturer",
1172+ "edition": "both"
1173+ },
1174+ {
1175+ "label": "Armor / maker traits and weight details",
1176+ "url": "https://xenoblade.fandom.com/wiki/Orphean_Technologies",
1177+ "edition": "both"
1178+ },
1179+ {
1180+ "label": "Nintendo Life article excerpt says build still coming soon",
1181+ "url": "https://www.nintendolife.com/guides/xenoblade-chronicles-x-best-combat-builds-for-all-characters",
1182+ "edition": "XCX"
1183+ },
1184+ {
1185+ "label": "Gatling Gun Arts TP costs and weapon models",
1186+ "url": "https://xenoblade.fandom.com/wiki/Gatling_Gun",
1187+ "edition": "both"
1188+ },
1189+ {
1190+ "label": "Longsword Arts TP costs and weapon models",
1191+ "url": "https://xenoblade.fandom.com/wiki/Longsword",
1192+ "edition": "both"
1193+ },
1194+ {
1195+ "label": "Representative Lv.55 torso defense/resistance values by armor manufacturer",
1196+ "url": "https://xenoblade.fandom.com/wiki/Armor",
1197+ "edition": "XCX"
1198+ }
1199+ ]
1200+ },
1201+ "Ga Jiarg": {
1202+ "role": [
1203+ "Editorial AI ground role: debuff-aware melee/Beam striker with Topple and status spread.",
1204+ "Rôle éditorial pour l'IA au sol : attaquant mêlée/Beam exploitant les débuffs, Topple et leur propagation."
1205+ ],
1206+ "rationale": [
1207+ "Exactly two TP spenders: Astrolibrium and Sky Sunder. Starfall Blossom generates TP; Astrolibrium boosts Beam; Subterfuge lowers debuff resistance; Bahamut Wave spreads debuffs; Sky Sunder scales with debuffs. Astral Heal is displaced from Game8's three-TP candidate bar.",
1208+ "Deux Arts consomment des PT : Astrolibrium et Sky Sunder. Starfall Blossom génère des PT; Astrolibrium renforce Beam; Subterfuge réduit la résistance aux débuffs; Bahamut Wave les propage; Sky Sunder gagne en dégâts selon les débuffs. Astral Heal sort de la barre Game8 dont les trois Arts à PT dépassent notre plafond de deux."
1209+ ],
1210+ "arts": [
1211+ "Starfall Blossom",
1212+ "Starfall Rondo",
1213+ "Astrolibrium",
1214+ "Sky Sunder",
1215+ "Subterfuge",
1216+ "Bahamut Wave",
1217+ "Gravity Blast",
1218+ "Gravity Cloak"
1219+ ],
1220+ "skills": [
1221+ "Beam Boost",
1222+ "Aura Assault",
1223+ "Supreme Sword",
1224+ "Tactical Analyst"
1225+ ],
1226+ "artSubstitutes": [
1227+ "Starfall Blade",
1228+ "Beam Barrage",
1229+ "Myopic Screen",
1230+ "Astral Heal",
1231+ "Novalibrium",
1232+ "Ether Blast",
1233+ "Pathogen Blast",
1234+ "Galactic Cataclysm"
1235+ ],
1236+ "skillSubstitutes": [
1237+ "Inner Search",
1238+ "Healing Touch",
1239+ "Appendage Erosion",
1240+ "Fast Forward"
1241+ ],
1242+ "equipment": {
1243+ "weapons": [
1244+ "Keep Ga's Sakuraba Destroyer Raygun, a Beam model at level 40 with 96 attack. His default Six Stars Pulverizing Lightblade II is Thermal, level 40 with 140 attack. For a Beam weapon-attribute Photon Saber Art, use a Beam drop such as Sakuraba Advanced Iron Saber, minimum level 3; it is not guaranteed shop stock. Otherwise keep the legal default. Sky Sunder itself remains Beam because its Art attribute is fixed.",
1245+ "Garder le Destroyer Raygun Beam de Sakuraba, niveau 40 et 96 d'attaque. Le Pulverizing Lightblade II Six Stars par défaut est Thermal, niveau 40 et 140 d'attaque. Pour un Art Photon Saber à attribut Beam, utiliser un modèle Beam obtenu en drop, tel que l'Advanced Iron Saber Sakuraba, niveau minimum 3; il n'est pas garanti en boutique. Sinon garder l'arme par défaut légale. Sky Sunder reste Beam car son attribut est fixe."
1246+ ],
1247+ "armor": [
1248+ "Candid & Credible Light Reginal Breaker at level 55: Potential Up VI, Defense 60, Electric +20, Beam −5, Gravity −5, 360,000 credits. Add Beam Resistance Up if Beam defense matters. Alternative for Beam defense: Grenada Light Combat Norak, level 15, Ranged Attack Up II, Defense 13, Beam +20, Gravity −10, 19,200 credits.",
1249+ "Reginal Breaker Light de Candid & Credible au niveau 55 : Potential Up VI, Defense 60, Electric +20, Beam −5, Gravity −5, 360 000 crédits. Ajouter Beam Resistance Up si la défense Beam compte. Alternative défensive : Combat Norak Light de Grenada, niveau 15, Ranged Attack Up II, Defense 13, Beam +20, Gravity −10, 19 200 crédits."
1250+ ],
1251+ "availability": [
1252+ "Ga's default Destroyer Raygun is already Beam and meets his starting level 40. The default Photon Saber is Thermal. A Beam Saber alternative such as Advanced Iron Saber is a random enemy drop, not guaranteed shop stock; if unavailable, keep the default because Sky Sunder remains Beam. Candid & Credible unlocks after Chapter 5; its Light line needs manufacturer rank 2. Heavy Combat Bulwark is level 15 but requires C&C rank 3. Grenada is available from the start; Light stock needs rank 2.",
1253+ "Le Destroyer Raygun Beam par défaut de Ga Jiarg est utilisable dès son niveau 40. Son Photon Saber par défaut est Thermal. L'alternative Beam Advanced Iron Saber est un drop ennemi, pas un stock garanti en boutique; si indisponible, garder l'arme par défaut car Sky Sunder reste Beam. Candid & Credible se débloque après le chapitre 5; sa gamme Light demande le rang fabricant 2. Combat Bulwark Heavy demande le niveau 15 et le rang C&C 3. Grenada est disponible dès le début; sa gamme Light demande le rang 2."
1254+ ]
1255+ },
1256+ "sources": [
1257+ {
1258+ "label": "Game8 Ga Jiarg Best Build",
1259+ "url": "https://game8.co/games/Xenoblade-Chronicles-X/archives/513831",
1260+ "edition": "DE"
1261+ },
1262+ {
1263+ "label": "Xeno Series Wiki Ga Jiarg gameplay progression",
1264+ "url": "https://www.xenoserieswiki.org/wiki/Ga_Jiarg/Gameplay",
1265+ "edition": "DE"
1266+ },
1267+ {
1268+ "label": "Xeno Series Wiki Arms Manufacturer gates",
1269+ "url": "https://www.xenoserieswiki.org/wiki/Arms_Manufacturer",
1270+ "edition": "both"
1271+ },
1272+ {
1273+ "label": "Xeno Series Wiki armor rules",
1274+ "url": "https://www.xenoserieswiki.org/wiki/Armor_(XCX)",
1275+ "edition": "both"
1276+ },
1277+ {
1278+ "label": "Game8 Photon Saber catalog",
1279+ "url": "https://game8.co/games/Xenoblade-Chronicles-X/archives/504904",
1280+ "edition": "DE"
1281+ },
1282+ {
1283+ "label": "Game8 Raygun catalog",
1284+ "url": "https://game8.co/games/Xenoblade-Chronicles-X/archives/504897",
1285+ "edition": "DE"
1286+ },
1287+ {
1288+ "label": "Xeno Series Wiki Destroyer Raygun",
1289+ "url": "https://www.xenoserieswiki.org/wiki/Destroyer_Raygun",
1290+ "edition": "both"
1291+ },
1292+ {
1293+ "label": "Xeno Series Wiki Pulverizing Lightblade II",
1294+ "url": "https://www.xenoserieswiki.org/wiki/Pulverizing_Lightblade_II",
1295+ "edition": "both"
1296+ },
1297+ {
1298+ "label": "Xeno Series Wiki Advanced Iron Saber",
1299+ "url": "https://www.xenoserieswiki.org/wiki/Advanced_Iron_Saber",
1300+ "edition": "both"
1301+ },
1302+ {
1303+ "label": "Game8 Reginal Breaker",
1304+ "url": "https://game8.co/games/Xenoblade-Chronicles-X/archives/510343",
1305+ "edition": "DE"
1306+ },
1307+ {
1308+ "label": "Game8 Potential Up",
1309+ "url": "https://game8.co/games/Xenoblade-Chronicles-X/archives/505711",
1310+ "edition": "DE"
1311+ },
1312+ {
1313+ "label": "Game8 Combat Bulwark",
1314+ "url": "https://game8.co/games/Xenoblade-Chronicles-X/archives/510204",
1315+ "edition": "DE"
1316+ },
1317+ {
1318+ "label": "Game8 Combat Norak",
1319+ "url": "https://game8.co/games/Xenoblade-Chronicles-X/archives/510471",
1320+ "edition": "DE"
1321+ }
1322+ ]
1323+ },
1324+ "Hope": {
1325+ "role": [
1326+ "Editorial AI ground role: ranged support/healer, debuff cleanse, barrier, Virus, party TP.",
1327+ "Rôle éditorial pour l'IA au sol : support/soins à distance, dissipation des débuffs, barrière, Virus et PT pour l'équipe."
1328+ ],
1329+ "rationale": [
1330+ "Exactly two TP spenders: Astral Protection and Energy Source. Repair cleanses and heals; Absorber Skin grants a barrier; Astral Protection adds resistances and healing; Energy Source supplies party TP; Stellar Ray, Shooting Star, Tacit Censure, and Black Butterfly add ranged/debuff utility. Servant Sacrifice is excluded: its Control/Heroic Tale prerequisite cannot be guaranteed under the two-TP progression cap.",
1331+ "Deux Arts consomment des PT : Astral Protection et Energy Source. Repair dissipe les débuffs et soigne; Absorber Skin donne une barrière; Astral Protection ajoute résistances et soins; Energy Source fournit des PT à l'équipe; Stellar Ray, Shooting Star, Tacit Censure et Black Butterfly ajoutent dégâts et débuffs à distance. Servant Sacrifice est exclu : son prérequis Control/Heroic Tale ne peut pas être garanti avec le plafond de deux Arts à PT pendant toute la progression."
1332+ ],
1333+ "arts": [
1334+ "Repair",
1335+ "Absorber Skin",
1336+ "Stellar Ray",
1337+ "Shooting Star",
1338+ "Tacit Censure",
1339+ "Black Butterfly",
1340+ "Astral Protection",
1341+ "Energy Source"
1342+ ],
1343+ "skills": [
1344+ "Inner Search",
1345+ "Knight's Soul",
1346+ "TP Overdrive"
1347+ ],
1348+ "artSubstitutes": [
1349+ "Brainjack",
1350+ "Full Specs",
1351+ "Secondary Speed",
1352+ "Dispel",
1353+ "Starlight Kick"
1354+ ],
1355+ "skillSubstitutes": [
1356+ "Buff Heal",
1357+ "Well-Weathered",
1358+ "Mechanoid Slayer",
1359+ "King's Decree",
1360+ "Supreme Sword"
1361+ ],
1362+ "equipment": {
1363+ "weapons": [
1364+ "Keep Sakuraba Knife + Psycho Launchers. Hope starts with Chrome Knife and Warrior Launchers, both Physical Sakuraba models. Her selected support/status Arts do not require a matching weapon attribute; preserve native types and upgrade item stats/TP gain.",
1365+ "Garder Knife + Psycho Launchers Sakuraba. Hope commence avec Chrome Knife et Warrior Launchers, deux modèles physiques de Sakuraba. Ses Arts de soutien/statut ne demandent pas d'attribut d'arme particulier; conserver les types natifs et améliorer les stats/le gain de PT."
1366+ ],
1367+ "armor": [
1368+ "Medium torso baseline due to Hope's −20% Max HP. Candid & Credible Forza Encaser at level 45 gives Potential Up V, Defense 67, Electric +20, Beam −5, Gravity −10. Add Max HP Up on another compatible armor piece. Lower-level C&C Heavy Combat Bulwark at level 15 gives Potential Up II and Defense 40; use only as a story fallback, not a universal Heavy recommendation.",
1369+ "Base recommandée : torse Medium à cause du −20% de Max HP de Hope. Le Forza Encaser Medium de Candid & Credible, niveau 45, donne Potential Up V, Defense 67, Electric +20, Beam −5, Gravity −10. Ajouter Max HP Up sur une autre pièce compatible. Le Combat Bulwark Heavy C&C, niveau 15, donne Potential Up II et Defense 40; le réserver à une solution de progression, pas à une recommandation Heavy universelle."
1370+ ],
1371+ "availability": [
1372+ "Candid & Credible unlocks after Chapter 5; Forza Encaser requires level 45 and is Medium Wear. Combat Bulwark requires level 15 and Heavy stock at maker rank 3. Before C&C unlocks, use a level-appropriate Sakuraba Medium torso and a Potential Up or Max HP Up augment. Grenada Light arm pieces can add Max TP Up, but Light stock requires maker rank 2 and is optional because the Skills already support TP.",
1373+ "Candid & Credible se débloque après le chapitre 5; Forza Encaser demande le niveau 45 et est Medium. Combat Bulwark demande le niveau 15 et le stock Heavy au rang 3 du fabricant. Avant le déblocage C&C, utiliser un torse Sakuraba Medium adapté au niveau avec un augment Potential Up ou Max HP Up. Les bras Light Grenada peuvent ajouter Max TP Up, mais le stock Light demande le rang 2 et reste facultatif puisque les Skills soutiennent déjà les PT."
1374+ ]
1375+ },
1376+ "sources": [
1377+ {
1378+ "label": "Game8 Hope Best Build",
1379+ "url": "https://game8.co/games/Xenoblade-Chronicles-X/archives/507443",
1380+ "edition": "DE"
1381+ },
1382+ {
1383+ "label": "Nintendo Life all-character builds",
1384+ "url": "https://www.nintendolife.com/guides/xenoblade-chronicles-x-best-combat-builds-for-all-characters",
1385+ "edition": "DE"
1386+ },
1387+ {
1388+ "label": "Xeno Series Wiki Hope gameplay",
1389+ "url": "https://www.xenoserieswiki.org/wiki/Hope/Gameplay",
1390+ "edition": "both"
1391+ },
1392+ {
1393+ "label": "Xeno Series Wiki Chrome Knife",
1394+ "url": "https://www.xenoserieswiki.org/wiki/Chrome_Knife",
1395+ "edition": "both"
1396+ },
1397+ {
1398+ "label": "Xeno Series Wiki Warrior Launchers",
1399+ "url": "https://www.xenoserieswiki.org/wiki/Warrior_Launchers",
1400+ "edition": "both"
1401+ },
1402+ {
1403+ "label": "Xeno Series Wiki Forza Encaser",
1404+ "url": "https://www.xenoserieswiki.org/wiki/Forza_Encaser",
1405+ "edition": "both"
1406+ },
1407+ {
1408+ "label": "Xeno Series Wiki Brainjack",
1409+ "url": "https://www.xenoserieswiki.org/wiki/Brainjack",
1410+ "edition": "both"
1411+ },
1412+ {
1413+ "label": "Xeno Series Wiki Servant Sacrifice dependency",
1414+ "url": "https://www.xenoserieswiki.org/wiki/Servant_Sacrifice",
1415+ "edition": "both"
1416+ },
1417+ {
1418+ "label": "Game8 Combat Bulwark",
1419+ "url": "https://game8.co/games/Xenoblade-Chronicles-X/archives/510204",
1420+ "edition": "DE"
1421+ },
1422+ {
1423+ "label": "Xeno Series Wiki Armor",
1424+ "url": "https://www.xenoserieswiki.org/wiki/Armor_(XCX)",
1425+ "edition": "both"
1426+ },
1427+ {
1428+ "label": "Xeno Series Wiki Arms Manufacturer",
1429+ "url": "https://www.xenoserieswiki.org/wiki/Arms_Manufacturer",
1430+ "edition": "both"
1431+ }
1432+ ]
1433+ },
1434+ "Liesel": {
1435+ "role": [
1436+ "Editorial AI ground role: ranged/electric combo striker with Shock, Electric Res Down, and Decoy.",
1437+ "Rôle éditorial pour l'IA au sol : attaquante combo à distance/électricité avec Shock, Electric Res Down et Decoy."
1438+ ],
1439+ "rationale": [
1440+ "Exactly two TP spenders: Trident Buster and Early Bird. Arcing Horn and Trident Buster are fixed Electric Arts. Knock 'n' Shock can inflict Shock with the existing Melee Art Arcing Horn; Conductive Strike then has a Shock provider from its rank-13 unlock, before Trident Buster arrives at rank 15. Trigger Happy supports ranged combos. Effect Charge still has an AI sequencing caveat.",
1441+ "Deux Arts consomment des PT : Trident Buster et Early Bird. Arcing Horn et Trident Buster sont des Arts Electric fixes. Knock 'n' Shock peut appliquer Shock avec l'Art mêlée Arcing Horn; Conductive Strike dispose donc d'une source de Shock dès son déblocage au rang 13, avant Trident Buster au rang 15. Trigger Happy soutient les combos à distance. Effect Charge garde une réserve sur le séquençage par l'IA."
1442+ ],
1443+ "arts": [
1444+ "Spiral Horn",
1445+ "Arcing Horn",
1446+ "Effect Charge",
1447+ "Trident Buster",
1448+ "Primer",
1449+ "Early Bird",
1450+ "Violent Streak",
1451+ "Ghostwalker"
1452+ ],
1453+ "skills": [
1454+ "Knock 'n' Shock",
1455+ "Conductive Strike",
1456+ "Trigger Happy"
1457+ ],
1458+ "artSubstitutes": [
1459+ "Sliding Slinger",
1460+ "Overwhelm",
1461+ "Raijin",
1462+ "Speed Demon",
1463+ "Executioner",
1464+ "Mind Shift",
1465+ "Combat Limbo",
1466+ "Hair Trigger"
1467+ ],
1468+ "skillSubstitutes": [
1469+ "Electric Boost",
1470+ "Quick Reload"
1471+ ],
1472+ "equipment": {
1473+ "weapons": [
1474+ "Keep Dual Guns + Javelin. Grenada's Warrior Gemels are Beam and its Chrome Parce Javelin is Physical. For an Electric weapon-damage Javelin, switch to Candid & Credible Chrome Bolide, an Electric Javelin with 156 attack at level 20. C&C unlocks after Chapter 5. Before then, Chrome Parce remains legal; Arcing Horn and Trident Buster still deal Electric because their Art attribute is fixed.",
1475+ "Garder Dual Guns + Javelin. Les Warrior Gemels Grenada sont Beam et son Javelin Chrome Parce est Physical. Pour un Javelin Electric dont les Arts à dégâts d'arme profitent de cet attribut, passer au Chrome Bolide Electric de Candid & Credible, 156 d'attaque au niveau 20. C&C se débloque après le chapitre 5. Avant, Chrome Parce reste légal; Arcing Horn et Trident Buster restent Electric car leur attribut appartient à l'Art."
1476+ ],
1477+ "armor": [
1478+ "Grenada Light Combat Norak torso, level 15: Ranged Attack Up II, Defense 13, Beam +20, Gravity −10, three trait upgrades, 19,200 credits. This matches Liesel's +30% ranged attack. Light favors attribute resistance, but has less defense. If Grenada has not reached maker rank 2, use its Medium first-set stock at rank 1 and add Ranged Attack Up in a compatible augment slot.",
1479+ "Torse Grenada Light Combat Norak, niveau 15 : Ranged Attack Up II, Defense 13, Beam +20, Gravity −10, trois améliorations de traits, 19 200 crédits. Cela correspond au +30% de ranged attack de Liesel. Light favorise les résistances d'attribut mais offre moins de défense. Si Grenada n'a pas atteint le rang fabricant 2, utiliser son stock Medium initial au rang 1 et ajouter Ranged Attack Up dans un emplacement d'augment compatible."
1480+ ],
1481+ "availability": [
1482+ "Grenada is one of the initial manufacturers; its Light line needs maker rank 2. Candid & Credible unlocks after Chapter 5; Chrome Bolide is usable from level 20. Before C&C opens, use Grenada Chrome Parce, level 20, Physical, TP Gain 120. Do not describe this fallback as an Electric weapon.",
1483+ "Grenada est disponible dès le début; sa gamme Light demande le rang fabricant 2. Candid & Credible se débloque après le chapitre 5; Chrome Bolide est utilisable dès le niveau 20. Avant l'ouverture de C&C, utiliser Grenada Chrome Parce, niveau 20, Physical, TP Gain 120. Ne pas présenter cette solution comme une arme Electric."
1484+ ]
1485+ },
1486+ "sources": [
1487+ {
1488+ "label": "Game8 Liesel Best Build",
1489+ "url": "https://game8.co/games/Xenoblade-Chronicles-X/archives/507864",
1490+ "edition": "DE"
1491+ },
1492+ {
1493+ "label": "Nintendo Life all-character builds, Liesel marked Coming soon",
1494+ "url": "https://www.nintendolife.com/guides/xenoblade-chronicles-x-best-combat-builds-for-all-characters",
1495+ "edition": "DE"
1496+ },
1497+ {
1498+ "label": "Xeno Series Wiki Liesel gameplay progression",
1499+ "url": "https://www.xenoserieswiki.org/wiki/Liesel/Gameplay",
1500+ "edition": "DE"
1501+ },
1502+ {
1503+ "label": "Xeno Series Wiki Warrior Gemels",
1504+ "url": "https://www.xenoserieswiki.org/wiki/Warrior_Gemels",
1505+ "edition": "both"
1506+ },
1507+ {
1508+ "label": "Xeno Series Wiki Chrome Parce",
1509+ "url": "https://www.xenoserieswiki.org/wiki/Chrome_Parce",
1510+ "edition": "both"
1511+ },
1512+ {
1513+ "label": "Xeno Series Wiki Chrome Bolide",
1514+ "url": "https://www.xenoserieswiki.org/wiki/Chrome_Bolide",
1515+ "edition": "both"
1516+ },
1517+ {
1518+ "label": "Xeno Series Wiki Knock 'n' Shock",
1519+ "url": "https://www.xenoserieswiki.org/wiki/Knock_%27n%27_Shock",
1520+ "edition": "both"
1521+ },
1522+ {
1523+ "label": "Xeno Series Wiki Conductive Strike",
1524+ "url": "https://www.xenoserieswiki.org/wiki/Conductive_Strike",
1525+ "edition": "both"
1526+ },
1527+ {
1528+ "label": "Xeno Series Wiki Quick Reload",
1529+ "url": "https://www.xenoserieswiki.org/wiki/Quick_Reload",
1530+ "edition": "both"
1531+ },
1532+ {
1533+ "label": "Game8 Javelin catalog",
1534+ "url": "https://game8.co/games/Xenoblade-Chronicles-X/archives/504900",
1535+ "edition": "DE"
1536+ },
1537+ {
1538+ "label": "Game8 Combat Norak",
1539+ "url": "https://game8.co/games/Xenoblade-Chronicles-X/archives/510471",
1540+ "edition": "DE"
1541+ },
1542+ {
1543+ "label": "Xeno Series Wiki Arms Manufacturer",
1544+ "url": "https://www.xenoserieswiki.org/wiki/Arms_Manufacturer",
1545+ "edition": "both"
1546+ }
1547+ ]
1548+ },
1549+ "Murderess": {
1550+ "role": [
1551+ "Editorial AI ground role: melee pressure, Stun, and defensive Aura.",
1552+ "Rôle éditorial pour l'IA au sol : pression mêlée, Stun et Aura défensive."
1553+ ],
1554+ "rationale": [
1555+ "Exactly two TP spenders: Astral Protection and Killing Machine. Keep Seventh Edge, Side Slash, Back Slash, Electric Surge, Jetstream, and Stellar Ray as non-TP Arts. Hundred Shells is the guide's third TP Art and is ordered only as a substitute; its rear-position bonus is not assumed reliable for AI.",
1556+ "Deux Arts consomment des PT : Astral Protection et Killing Machine. Garder Seventh Edge, Side Slash, Back Slash, Electric Surge, Jetstream et Stellar Ray comme Arts sans coût en PT. Hundred Shells est le troisième Art à PT du guide; il n'est qu'un substitut ordonné, et son bonus arrière n'est pas supposé fiable avec l'IA."
1557+ ],
1558+ "arts": [
1559+ "Seventh Edge",
1560+ "Side Slash",
1561+ "Back Slash",
1562+ "Electric Surge",
1563+ "Jetstream",
1564+ "Stellar Ray",
1565+ "Astral Protection",
1566+ "Killing Machine"
1567+ ],
1568+ "skills": [
1569+ "Aura Assault",
1570+ "High Tension",
1571+ "Hellhound"
1572+ ],
1573+ "artSubstitutes": [
1574+ "Lightning Cloak",
1575+ "Shadowrunner",
1576+ "Shooting Star",
1577+ "Thirsty Edge",
1578+ "Gravity Lunge",
1579+ "Hundred Shells"
1580+ ],
1581+ "skillSubstitutes": [
1582+ "Agile Gunslinger",
1583+ "Boosted Bullets",
1584+ "Mechanoid Slayer",
1585+ "Trigger Happy",
1586+ "Lifeline"
1587+ ],
1588+ "equipment": {
1589+ "weapons": [
1590+ "Keep Sakuraba Physical Dual Swords + Psycho Launchers. Murderess starts with Chrome Blades and Warrior Launchers, both Sakuraba Physical models. Electric Surge and Jetstream keep their Art damage attribute with those weapons. Upgrade within the native types.",
1591+ "Garder Dual Swords Physical + Psycho Launchers Sakuraba. Murderess commence avec Chrome Blades et Warrior Launchers, deux modèles physiques Sakuraba. Electric Surge et Jetstream gardent l'attribut de dégâts propre à l'Art avec ces armes. Améliorer les types natifs."
1592+ ],
1593+ "armor": [
1594+ "Medium Sakuraba Combat Bodywear at level 15 gives Melee Attack Up II, Defense 28, Physical +10, Gravity −15. Murderess has −5% Max HP, so use Medium as the story baseline. At level 55, Light Sakuraba Reginal Vest gives Melee Attack Up VI, Defense 57, Physical +10, Gravity −10, 360,000 credits; use it when survival is adequate.",
1595+ "Le Combat Bodywear Medium Sakuraba au niveau 15 donne Melee Attack Up II, Defense 28, Physical +10, Gravity −15. Murderess a −5% de Max HP; utiliser Medium comme base de progression. Au niveau 55, le Reginal Vest Light Sakuraba donne Melee Attack Up VI, Defense 57, Physical +10, Gravity −10, 360 000 crédits; le choisir si sa survie est suffisante."
1596+ ],
1597+ "availability": [
1598+ "Sakuraba is available from the start. Combat Bodywear is level 15 and Medium stock is maker rank 1. Reginal Vest is level 55 and Light stock needs maker rank 2. Light trades lower base defense for better attribute resistance; do not choose it solely for the higher trait rank if Murderess is being incapacitated.",
1599+ "Sakuraba est disponible dès le début. Combat Bodywear demande le niveau 15 et le stock Medium est au rang fabricant 1. Reginal Vest demande le niveau 55 et le stock Light le rang 2. Light échange une défense de base plus faible contre de meilleures résistances d'attribut; ne pas le choisir uniquement pour son trait supérieur si Murderess est mise hors combat."
1600+ ]
1601+ },
1602+ "sources": [
1603+ {
1604+ "label": "Game8 Murderess Best Build",
1605+ "url": "https://game8.co/games/Xenoblade-Chronicles-X/archives/507456",
1606+ "edition": "DE"
1607+ },
1608+ {
1609+ "label": "Nintendo Life all-character builds",
1610+ "url": "https://www.nintendolife.com/guides/xenoblade-chronicles-x-best-combat-builds-for-all-characters",
1611+ "edition": "DE"
1612+ },
1613+ {
1614+ "label": "Xeno Series Wiki Murderess gameplay progression",
1615+ "url": "https://www.xenoserieswiki.org/wiki/Murderess/Gameplay",
1616+ "edition": "both"
1617+ },
1618+ {
1619+ "label": "Xeno Series Wiki Chrome Blades",
1620+ "url": "https://www.xenoserieswiki.org/wiki/Chrome_Blades",
1621+ "edition": "both"
1622+ },
1623+ {
1624+ "label": "Xeno Series Wiki Warrior Launchers",
1625+ "url": "https://www.xenoserieswiki.org/wiki/Warrior_Launchers",
1626+ "edition": "both"
1627+ },
1628+ {
1629+ "label": "Game8 Combat Bodywear",
1630+ "url": "https://game8.co/games/Xenoblade-Chronicles-X/archives/510709",
1631+ "edition": "DE"
1632+ },
1633+ {
1634+ "label": "Game8 Reginal Vest",
1635+ "url": "https://game8.co/games/Xenoblade-Chronicles-X/archives/510523",
1636+ "edition": "DE"
1637+ },
1638+ {
1639+ "label": "Xeno Series Wiki Armor",
1640+ "url": "https://www.xenoserieswiki.org/wiki/Armor_(XCX)",
1641+ "edition": "both"
1642+ }
1643+ ]
1644+ },
1645+ "Nagi": {
1646+ "role": [
1647+ "Editorial AI ground role: durable melee striker with Physical/Thermal setup, one TP finisher, and party TP on Overdrive.",
1648+ "Rôle éditorial pour l'IA au sol : attaquant mêlée résistant avec préparation Physical/Thermal, un finisseur à PT et des PT d'équipe en Overdrive."
1649+ ],
1650+ "rationale": [
1651+ "Exactly two TP spenders: Blossom Dance and Enhanced Stand. This keeps the TP finisher and a healing Aura that supports Yamato Spirit, while dropping guide candidate Incendiary Edge as a third TP Art. Missile Volley and Burning Slash retain Thermal Res Down; Magnum Edge supports the weapon-damage melee chain. Bullet Storm fills the eighth slot without TP cost.",
1652+ "Deux Arts consomment des PT : Blossom Dance et Enhanced Stand. La barre garde le finisseur à PT et une Aura de soins qui soutient Yamato Spirit, mais écarte Incendiary Edge, troisième Art à PT du guide. Missile Volley et Burning Slash gardent la séquence Thermal Res Down; Magnum Edge soutient les Arts mêlée à dégâts d'arme. Bullet Storm remplit le huitième emplacement sans consommer de PT."
1653+ ],
1654+ "arts": [
1655+ "Rising Blade",
1656+ "True Stream Edge",
1657+ "Blossom Dance",
1658+ "Magnum Edge",
1659+ "Enhanced Stand",
1660+ "Missile Volley",
1661+ "Burning Slash",
1662+ "Bullet Storm"
1663+ ],
1664+ "skills": [
1665+ "Steel Flesh",
1666+ "Mighty Muscle",
1667+ "Yamato Spirit",
1668+ "Fortified Flesh",
1669+ "Grand Procession"
1670+ ],
1671+ "artSubstitutes": [
1672+ "Thermal Payload",
1673+ "Cool Off",
1674+ "Defensive Stance",
1675+ "Offensive Stance",
1676+ "Samurai Soul",
1677+ "Incendiary Edge"
1678+ ],
1679+ "skillSubstitutes": [
1680+ "Trauma Tension",
1681+ "Rising Renewal",
1682+ "Machine Gunner"
1683+ ],
1684+ "equipment": {
1685+ "weapons": [
1686+ "Use Physical Longsword + Gatling Gun weapon-damage lines. Sakuraba's Sword and Machine series supply these native types. Nagi starts with Physical Signature Glaive: Fledgling, whose recorded maker is Unknown, and Physical Sakuraba Ophidian Machine. His Thermal Arts already have fixed Thermal damage.",
1687+ "Utiliser des lignes d'armes Physical Longsword + Gatling Gun pour les Arts à dégâts d'arme. Les séries Sword et Machine de Sakuraba offrent ces types natifs. Nagi commence avec le Signature Glaive: Fledgling Physical, dont le fabricant est indiqué Unknown, et le Gatling Gun Ophidian Machine Physical de Sakuraba. Ses Arts Thermal ont déjà des dégâts Thermal fixes."
1688+ ],
1689+ "armor": [
1690+ "Nagi's +25% Max HP and HP Skills support Light armor once gear is strong enough. At level 55, Sakuraba Light Reginal Vest gives Melee Attack Up VI, Defense 57, Physical +10, Gravity −10, 360,000 credits. Story fallback: Medium Combat Bodywear at level 15, Melee Attack Up II, Defense 28, Physical +10, Gravity −15, 21,000 credits.",
1691+ "Le +25% de Max HP et les Skills de vie de Nagi permettent l'armure Light lorsque son équipement est assez solide. Au niveau 55, le Reginal Vest Light Sakuraba donne Melee Attack Up VI, Defense 57, Physical +10, Gravity −10, 360 000 crédits. Solution de progression : Combat Bodywear Medium niveau 15, Melee Attack Up II, Defense 28, Physical +10, Gravity −15, 21 000 crédits."
1692+ ],
1693+ "availability": [
1694+ "Sakuraba is available from the start. Combat Bodywear is level 15 and Medium stock is maker rank 1. Reginal Vest is level 55; Light stock needs maker rank 2. Light has less base defense but better attribute resistance than Heavy. Keep the Physical default Longsword if the maker's Sword stock is unavailable.",
1695+ "Sakuraba est disponible dès le début. Combat Bodywear demande le niveau 15 et le stock Medium est au rang fabricant 1. Reginal Vest demande le niveau 55; le stock Light demande le rang 2. Light offre moins de défense de base mais de meilleures résistances d'attribut que Heavy. Garder le Longsword Physical par défaut si la série Sword du fabricant n'est pas disponible."
1696+ ]
1697+ },
1698+ "sources": [
1699+ {
1700+ "label": "Game8 Nagi Best Build",
1701+ "url": "https://game8.co/games/Xenoblade-Chronicles-X/archives/513229",
1702+ "edition": "DE"
1703+ },
1704+ {
1705+ "label": "Nintendo Life all-character builds, Nagi marked Coming soon",
1706+ "url": "https://www.nintendolife.com/guides/xenoblade-chronicles-x-best-combat-builds-for-all-characters",
1707+ "edition": "DE"
1708+ },
1709+ {
1710+ "label": "Xeno Series Wiki Nagi gameplay progression",
1711+ "url": "https://www.xenoserieswiki.org/wiki/Nagi/Gameplay",
1712+ "edition": "both"
1713+ },
1714+ {
1715+ "label": "Xeno Series Wiki Signature Glaive: Fledgling",
1716+ "url": "https://www.xenoserieswiki.org/wiki/Signature_Glaive:_Fledgling",
1717+ "edition": "both"
1718+ },
1719+ {
1720+ "label": "Xeno Series Wiki Ophidian Machine",
1721+ "url": "https://www.xenoserieswiki.org/wiki/Ophidian_Machine",
1722+ "edition": "both"
1723+ },
1724+ {
1725+ "label": "Game8 Longsword catalog",
1726+ "url": "https://game8.co/games/Xenoblade-Chronicles-X/archives/504899",
1727+ "edition": "DE"
1728+ },
1729+ {
1730+ "label": "Game8 Combat Bodywear",
1731+ "url": "https://game8.co/games/Xenoblade-Chronicles-X/archives/510709",
1732+ "edition": "DE"
1733+ },
1734+ {
1735+ "label": "Game8 Reginal Vest",
1736+ "url": "https://game8.co/games/Xenoblade-Chronicles-X/archives/510523",
1737+ "edition": "DE"
1738+ },
1739+ {
1740+ "label": "Xeno Series Wiki Arms Manufacturer",
1741+ "url": "https://www.xenoserieswiki.org/wiki/Arms_Manufacturer",
1742+ "edition": "both"
1743+ }
1744+ ]
1745+ },
1746+ "Phog": {
1747+ "role": [
1748+ "AI close-range combo attacker with melee-position damage and signature Stun/Launch. Utility via Ghostwalker; one TP burst plus TP aura.",
1749+ "Attaquant IA rapproché en combos, dégâts positionnels mêlée et étourdissement/lancement signature. Ghostwalker apporte utilitaire ; burst TP et Aura TP."
1750+ ],
1751+ "rationale": [
1752+ "AI melee combo DPS; retain physical/stun signature, utility, decoy; avoid competing risky HP-drain Arts. Blood Sacrifice generates TP (no TP cost) but stays excluded: sacrificing half of current HP is risky for the AI.",
1753+ "Damage physique en combos pour l’IA ; conserver l’Art signature physique/étourdissement, utilitaire et leurre ; éviter les Arts risqués à drain de PV. Blood Sacrifice génère PT (sans coût PT) mais reste exclu : sacrifier la moitié des PV courants est risqué pour l’IA."
1754+ ],
1755+ "arts": [
1756+ "Back Slash",
1757+ "Sliding Slinger",
1758+ "Sky High",
1759+ "Side Slash",
1760+ "Shadowrunner",
1761+ "Primer",
1762+ "Ghostwalker",
1763+ "Hundred Shells"
1764+ ],
1765+ "skills": [
1766+ "Background Noise",
1767+ "Master Edge",
1768+ "Phantom Counter"
1769+ ],
1770+ "artSubstitutes": [
1771+ "Upper Hand",
1772+ "Electric Surge",
1773+ "Combat Limbo"
1774+ ],
1775+ "skillSubstitutes": [
1776+ "Agile Gunslinger",
1777+ "Steady Hand",
1778+ "Crisis Catalyst"
1779+ ],
1780+ "equipment": {
1781+ "weapons": [
1782+ "Sakuraba Industries Dual Swords (physical Blades line, e.g. Iron Blades) + Physical Dual Guns. Prioritize Ranged Attack/accuracy for ranged physical Sky High; Melee Attack applies to Dual-Sword Side Slash/Back Slash; TP stats for Shadowrunner/Hundred Shells. Candid & Credible is not asserted as a weapon alternative where its line-specific element is uncertain.",
1783+ "Dual Swords Sakuraba Industries (série physique Blades, p. ex. Iron Blades) + Dual Guns physiques. Prioriser Attaque à distance/précision pour Sky High physique à distance ; Attaque mêlée vaut pour Side Slash/Back Slash Dual Swords ; bonus PT pour Shadowrunner/Hundred Shells. Candid & Credible n’est pas présenté comme alternative d’arme, attribut par ligne incertain."
1784+ ],
1785+ "armor": [
1786+ "Sakuraba Medium Wear at AM L1: supports frontline physical role; verified DE Combat Bodywear is Medium, min L15, defense 28, Physical +10, Gravity −15, Melee Attack Up II. Candid & Credible Light is an optional AM L2 set (Screen head Potential Up; arm Max TP/Melee Attack; leg Evasion/Max TP). Heavy Combat Bulwark is optional only for defense, after C&C unlock + AM L3: L15, defense 40, Potential Up II, Electric +20, Beam −5, Gravity −15.",
1787+ "Sakuraba Medium Wear AM L1 : soutient front physique ; Combat Bodywear DE vérifié : Medium, niv. min 15, défense 28, Physique +10, Gravité −15, Melee Attack Up II. Candid & Credible Light optionnel AM L2 (Screen tête Potential Up ; bras Max TP/Melee Attack ; jambes Evasion/Max TP). Heavy Combat Bulwark seulement pour défense après déblocage C&C + AM L3 : niv.15, défense 40, Potential Up II, Electric +20, Beam −5, Gravity −15."
1788+ ],
1789+ "availability": [
1790+ "Sakuraba Medium Wear is AM L1. Sakuraba Light requires AM L2. C&C unlocks after Chapter 5; its Light/Heavy armor require AM L2/L3 respectively. Match elemental resistances on item card.",
1791+ "Sakuraba Medium Wear AM L1. Sakuraba Light exige AM L2. C&C se débloque après chapitre 5 ; armures Light/Heavy exigent AM L2/L3. Vérifier résistances élémentaires sur fiche."
1792+ ]
1793+ },
1794+ "sources": [
1795+ {
1796+ "label": "Game8 Phog Best Build; DE, 2025",
1797+ "url": "https://game8.co/games/Xenoblade-Chronicles-X/archives/507892",
1798+ "edition": "DE"
1799+ },
1800+ {
1801+ "label": "Game8 Phog Arts, Skills, recruitment; DE, 2025",
1802+ "url": "https://game8.co/games/Xenoblade-Chronicles-X/archives/500611",
1803+ "edition": "DE"
1804+ },
1805+ {
1806+ "label": "Sakuraba manufacturer offerings; weapon types/physical stability, armor traits and catalog",
1807+ "url": "https://xenoblade.fandom.com/wiki/Sakuraba_Industries",
1808+ "edition": "both"
1809+ },
1810+ {
1811+ "label": "Candid & Credible armor catalog and traits",
1812+ "url": "https://xenoblade.fandom.com/wiki/Candid_%26_Credible",
1813+ "edition": "both"
1814+ },
1815+ {
1816+ "label": "Game8 DE weapon catalog: Dual Swords",
1817+ "url": "https://game8.co/games/Xenoblade-Chronicles-X/archives/504901",
1818+ "edition": "DE"
1819+ },
1820+ {
1821+ "label": "Game8 DE weapon catalog: Dual Guns",
1822+ "url": "https://game8.co/games/Xenoblade-Chronicles-X/archives/504895",
1823+ "edition": "DE"
1824+ },
1825+ {
1826+ "label": "Game8 DE Combat Bulwark item stats and availability",
1827+ "url": "https://game8.co/games/Xenoblade-Chronicles-X/archives/510204",
1828+ "edition": "DE"
1829+ },
1830+ {
1831+ "label": "Game8 DE Sky High page: ranged Dual Guns Art and attack scaling",
1832+ "url": "https://game8.co/games/Xenoblade-Chronicles-X/archives/506135",
1833+ "edition": "DE"
1834+ }
1835+ ]
1836+ },
1837+ "Yelv": {
1838+ "role": [
1839+ "Ground Beam-melee DPS with aura, Debuff Res Down and optional Gravity Res. Do not claim Synchrony contributes on foot.",
1840+ "DPS sol Beam mêlée avec Aura, baisse résistance aux altérations et résistance gravité optionnelle. Ne pas attribuer effet au sol à Synchrony."
1841+ ],
1842+ "rationale": [
1843+ "Ground melee Beam damage with debuff and defense utility. Fixed ground Skills exclude Synchrony; Skell package/pilot bonuses stay separate.",
1844+ "Dégâts laser au corps-à-corps au sol, avec affaiblissement et utilitaire défensif. Compétences fixes sol excluent Synchrony ; packages/bénéfices Skell restent séparés."
1845+ ],
1846+ "arts": [
1847+ "Starfall Blade",
1848+ "Starfall Rondo",
1849+ "Starfall Blossom",
1850+ "Astrolibrium",
1851+ "Astral Purge",
1852+ "Gravity Cloak",
1853+ "Subterfuge",
1854+ "Galactic Cataclysm"
1855+ ],
1856+ "skills": [
1857+ "Beam Boost",
1858+ "Supreme Sword",
1859+ "Secondary Accelerator"
1860+ ],
1861+ "artSubstitutes": [
1862+ "Beam Barrage",
1863+ "Geolibrium",
1864+ "Ether Blast",
1865+ "Myopic Screen",
1866+ "Astral Heal",
1867+ "Master Gunner",
1868+ "Novalibrium"
1869+ ],
1870+ "skillSubstitutes": [
1871+ "High Tension",
1872+ "Knight's Soul",
1873+ "Inner Search"
1874+ ],
1875+ "equipment": {
1876+ "weapons": [
1877+ "Sakuraba Industries Saber series, Beam attribute. Early model: Advanced Iron Saber (Beam, ATK 40; raw item data identifies Sakuraba MakerID 1 and equipment level 3, and Game8 DE lists the model Beam). Later option: Advanced Cermet Saber (Beam, ATK 140, min L53, random enemy drop). The ordinary Iron Saber is disputed: Game8 DE lists Physical while XSW raw data says Beam; do not rely on that ordinary model. Combat Photon Saber is an automatic Beam fallback only when no weapon item is equipped, not inventory gear.",
1878+ "Série Saber Sakuraba Industries, attribut Beam. Modèle précoce : Advanced Iron Saber (Beam, ATK 40 ; données brutes: MakerID Sakuraba 1, niveau équipement 3 ; Game8 DE le liste Beam). Option tardive : Advanced Cermet Saber (Beam, ATK 140, niveau min. 53, drop ennemi aléatoire). Iron Saber ordinaire est disputé : liste Game8 DE Physical vs XSW brut Beam ; ne pas s’appuyer sur ce modèle. Combat Photon Saber est un fallback Beam automatique sans item équipé, pas équipement d’inventaire."
1879+ ],
1880+ "armor": [
1881+ "Sakuraba Medium Wear at AM L1 for early melee baseline; Light Wear at AM L2 offers Melee Attack Up/Max TP arm traits. Slot-name examples: Goggles/Bodywear/Glove/Footwear (Medium), Visor/Vest/Guard/Boots (Light).",
1882+ "Sakuraba Medium Wear AM L1 pour base mêlée précoce ; Light Wear AM L2 offre Melee Attack Up/Max TP sur bras. Noms par slot : Goggles/Bodywear/Glove/Footwear (Medium), Visor/Vest/Guard/Boots (Light)."
1883+ ],
1884+ "availability": [
1885+ "Advanced Iron Saber is listed Beam by DE Game8 and raw XSW, with MakerID 1/AM L1/equipment level 3 in raw record; exact shop/drop acquisition not verified. Advanced Cermet Saber is random enemy drop, min L53. Ordinary Iron Saber attribute conflicts between Game8 DE (Physical) and XSW raw (Beam); do not rely on it. Combat Photon Saber is auto-fallback if no weapon is equipped, not inventory gear.",
1886+ "Advanced Iron Saber est listé Beam par Game8 DE et XSW brut ; données brutes MakerID 1/AM L1/niveau équipement 3 ; acquisition boutique/drop exacte non vérifiée. Advanced Cermet Saber est un drop aléatoire, niv. min 53. Attribut de l’Iron Saber ordinaire contradictoire Game8 DE (Physical) / XSW brut (Beam) ; ne pas s’y fier. Combat Photon Saber est fallback automatique sans arme, pas item d’inventaire."
1887+ ]
1888+ },
1889+ "sources": [
1890+ {
1891+ "label": "Game8 Yelv Best Build; DE, 2025",
1892+ "url": "https://game8.co/games/Xenoblade-Chronicles-X/archives/507260",
1893+ "edition": "DE"
1894+ },
1895+ {
1896+ "label": "Sakuraba manufacturer offerings; weapon types/physical stability, armor traits",
1897+ "url": "https://xenoblade.fandom.com/wiki/Sakuraba_Industries",
1898+ "edition": "both"
1899+ },
1900+ {
1901+ "label": "Candid & Credible armor catalog and traits",
1902+ "url": "https://xenoblade.fandom.com/wiki/Candid_%26_Credible",
1903+ "edition": "both"
1904+ },
1905+ {
1906+ "label": "Game8 DE Photon Saber inventory including Beam variants",
1907+ "url": "https://game8.co/games/Xenoblade-Chronicles-X/archives/504904",
1908+ "edition": "DE"
1909+ },
1910+ {
1911+ "label": "Game8 DE Advanced Cermet Saber (Sakuraba, Beam, min level 53)",
1912+ "url": "https://game8.co/games/Xenoblade-Chronicles-X/archives/512175",
1913+ "edition": "DE"
1914+ },
1915+ {
1916+ "label": "Game8 DE Raygun inventory",
1917+ "url": "https://game8.co/games/Xenoblade-Chronicles-X/archives/504897",
1918+ "edition": "DE"
1919+ },
1920+ {
1921+ "label": "Xeno Series Wiki raw Advanced Iron Saber game record",
1922+ "url": "https://www.xenoserieswiki.org/w/index.php?title=Advanced_Iron_Saber&action=raw",
1923+ "edition": "both"
1924+ },
1925+ {
1926+ "label": "XSW raw Iron Saber weapon record (Beam; conflicts with DE Game8 list)",
1927+ "url": "https://www.xenoserieswiki.org/w/index.php?title=Iron_Saber&action=raw",
1928+ "edition": "both"
1929+ },
1930+ {
1931+ "label": "XSW Photon Saber model/attribute table",
1932+ "url": "https://xenoblade.fandom.com/wiki/Photon_Saber",
1933+ "edition": "both"
1934+ }
1935+ ]
1936+ },
1937+ "Mia": {
1938+ "role": [
1939+ "Ranged ether/gravity debuffer-support; clears party debuffs, boosts Ether resistance, Topples, applies Debuff Res Down, damage while Aura active.",
1940+ "Soutien-affaiblissement Éther/Gravité à distance ; purifie les altérations alliées, augmente résistance Éther, renverse, réduit résistances aux altérations, dégâts sous Aura."
1941+ ],
1942+ "rationale": [
1943+ "Ranged support/debuffer with Topple, enemy debuff-resistance reduction, party cleanse/resistance, and aura-supported damage.",
1944+ "Soutien/affaiblissement à distance avec Chute, baisse de résistance aux altérations, purification/résistance d’équipe et dégâts renforcés par Aura."
1945+ ],
1946+ "arts": [
1947+ "Full Specs",
1948+ "Gravity Cloak",
1949+ "Subterfuge",
1950+ "Gravity Blast",
1951+ "Beam Barrage",
1952+ "Myopic Screen",
1953+ "Clarity Ray",
1954+ "Beam Bomber"
1955+ ],
1956+ "skills": [
1957+ "Tactical Analyst",
1958+ "Ether Boost",
1959+ "Inner Search"
1960+ ],
1961+ "artSubstitutes": [
1962+ "Black Butterfly",
1963+ "Screamer",
1964+ "Pathogen Blast"
1965+ ],
1966+ "skillSubstitutes": [
1967+ "Resistant Flesh",
1968+ "Gravity Boost",
1969+ "Beam Boost"
1970+ ],
1971+ "equipment": {
1972+ "weapons": [
1973+ "Meredith & Co. Ether Radius Raygun + Ether Pugio Knife. Matches Raygun/Knife slots and Ether damage/boost rationale; item model/level variants follow player/AM progression. For temporary shortage, use currently available same-type Raygun/Knife, but do not call it an Ether replacement.",
1974+ "Raygun Ether Radius + Knife Ether Pugio Meredith & Co. : types Raygun/Knife et justification dégâts/boost Éther ; modèle/variantes de niveau suivent progression joueur/fabricant. En attendant, utiliser Raygun/Knife disponible même type, sans le qualifier d’alternative Éther."
1975+ ],
1976+ "armor": [
1977+ "Meredith & Co. Medium Wear at AM L1 (Chapter 4 manufacturer unlock); its armor uses Ether tech/resistance. Light Wear at AM L2 adds Potential Up head, Max TP/ranged-attack arm options and Max TP legs; names: Vitra/Corpus/Chiro/Plantars (Medium), Vizard/Vestis/Armilla/Ocreis (Light).",
1978+ "Meredith & Co. Medium Wear AM L1 (fabricant débloqué chapitre 4), armure technologie/résistance Éther. Light Wear AM L2 ajoute Potentiel tête, options Max TP/Attaque distance aux bras, Max TP jambes ; noms : Vitra/Corpus/Chiro/Plantars (Medium), Vizard/Vestis/Armilla/Ocreis (Light)."
1979+ ],
1980+ "availability": [
1981+ "Meredith unlocks Chapter 4; Medium armor AM L1. Meredith Light requires AM L2. C&C optional later: Chapter 5 + Light AM L2. Armor level still must not exceed Mia’s current level.",
1982+ "Meredith débloqué chapitre 4 ; armure Medium AM L1. Meredith Light exige AM L2. C&C optionnel ensuite : chapitre 5 + Light AM L2. Niveau armure ne doit pas dépasser niveau actuel de Mia."
1983+ ]
1984+ },
1985+ "sources": [
1986+ {
1987+ "label": "Game8 Mia Best Build; DE, 2025",
1988+ "url": "https://game8.co/games/Xenoblade-Chronicles-X/archives/514627",
1989+ "edition": "DE"
1990+ },
1991+ {
1992+ "label": "Nintendo Life character builds (DE article; Mia consensus summary from search results, article full text unavailable to reader)",
1993+ "url": "https://www.nintendolife.com/guides/xenoblade-chronicles-x-best-combat-builds-for-all-characters",
1994+ "edition": "DE"
1995+ },
1996+ {
1997+ "label": "Sakuraba manufacturer offerings; weapon types/physical stability and armor traits",
1998+ "url": "https://xenoblade.fandom.com/wiki/Sakuraba_Industries",
1999+ "edition": "both"
2000+ },
2001+ {
2002+ "label": "Candid & Credible armor catalog and traits",
2003+ "url": "https://xenoblade.fandom.com/wiki/Candid_%26_Credible",
2004+ "edition": "both"
2005+ },
2006+ {
2007+ "label": "Game8 DE Raygun inventory and attribute options",
2008+ "url": "https://game8.co/games/Xenoblade-Chronicles-X/archives/504897",
2009+ "edition": "DE"
2010+ },
2011+ {
2012+ "label": "Game8 DE Knife inventory and attribute options",
2013+ "url": "https://game8.co/games/Xenoblade-Chronicles-X/archives/504903",
2014+ "edition": "DE"
2015+ },
2016+ {
2017+ "label": "Meredith & Co. Ether weapon program and Chapter 4 unlock",
2018+ "url": "https://xenoblade.fandom.com/wiki/Meredith_%26_Co.",
2019+ "edition": "both"
2020+ },
2021+ {
2022+ "label": "Raygun Ether Radius and Knife Ether Pugio model tables",
2023+ "url": "https://xenoblade.fandom.com/wiki/Raygun",
2024+ "edition": "both"
2025+ },
2026+ {
2027+ "label": "Game8 DE C&C armor item stats/weight example",
2028+ "url": "https://game8.co/games/Xenoblade-Chronicles-X/archives/510204",
2029+ "edition": "DE"
2030+ }
2031+ ]
2032+ },
2033+ "Neilnail": {
2034+ "role": [
2035+ "AI hybrid frontline: side/rear melee, Ether damage, Stun and increased allied Blaze/Shock damage, sustain aura.",
2036+ "Hybride de première ligne IA : mêlée côté/arrière, dégâts Éther, Étourdissement, dégâts Feu/Électrocution alliés accrus, Aura de maintien."
2037+ ],
2038+ "rationale": [
2039+ "AI frontline Ether hybrid: side/rear damage, team Blaze/Shock amplification and Astral Protection sustain. Inner Search boosts Potential (TP Art damage and Soul Voice healing) without requiring an Aura; omit Aura Assault since it unlocks before the chosen Astral Protection and is conditional on an active Aura, leaving ranks 9–10 inert.",
2040+ "Hybride Éther IA : dégâts côté/arrière, amplification alliée Feu/Électrocution et maintien Astral Protection. Inner Search augmente Potentiel (dégâts des Arts PT et soin Soul Voice) sans Aura ; omettre Aura Assault, débloqué avant Astral Protection et conditionnel à Aura active, afin d’éviter des rangs 9–10 inertes."
2041+ ],
2042+ "arts": [
2043+ "Side Slash",
2044+ "Back Slash",
2045+ "Electric Surge",
2046+ "Jetstream",
2047+ "Conduction Rise",
2048+ "Shooting Star",
2049+ "Astral Protection",
2050+ "Hundred Shells"
2051+ ],
2052+ "skills": [
2053+ "Ether Boost",
2054+ "Knight's Soul",
2055+ "Supreme Sword",
2056+ "Inner Search"
2057+ ],
2058+ "artSubstitutes": [
2059+ "Shadowrunner",
2060+ "Stellar Ray",
2061+ "Lightning Cloak",
2062+ "Heroic Tale",
2063+ "Upper Hand"
2064+ ],
2065+ "skillSubstitutes": [
2066+ "Fast Forward"
2067+ ],
2068+ "equipment": {
2069+ "weapons": [
2070+ "Meredith & Co. Ether Ruina II Psycho Launchers + Sakuraba physical Dual Swords (e.g. Iron Blades family). Matches Psycho Launchers + Dual Swords and Ether/weapon Arts. Meridian catalog uses Ether technology; actual AM level/weapon stock gates exact series.",
2071+ "Psycho Launchers Ether Ruina II Meredith & Co. + Dual Swords physiques Sakuraba (p. ex. série Iron Blades). Correspond aux Psycho Launchers + Dual Swords et Arts Éther/arme. Technologie Meredith à Éther ; niveau AM/stock peut verrouiller série exacte."
2072+ ],
2073+ "armor": [
2074+ "Meredith & Co. Medium Wear at AM L1; Ether-resistance profile fits Ether frontline. Light at AM L2 supplies Ether Res Up/Max TP/Ranged Attack Boost options; slot names Vitra/Corpus/Chiro/Plantars (Medium), Vizard/Vestis/Armilla/Ocreis (Light).",
2075+ "Meredith & Co. Medium Wear AM L1 ; profil résistance Éther convient front Éther. Light AM L2 fournit options Ether Res Up/Max TP/Ranged Attack Boost ; Vitra/Corpus/Chiro/Plantars (Medium), Vizard/Vestis/Armilla/Ocreis (Light)."
2076+ ],
2077+ "availability": [
2078+ "Meredith unlocks Chapter 4; its Medium armor is AM L1 and Light is L2. C&C is a later alternative (Chapter 5; Light AM L2). Armor level/stock still follow player and AM progression.",
2079+ "Meredith débloqué chapitre 4 ; armure Medium AM L1, Light AM L2. C&C est alternative ultérieure (chapitre 5 ; Light AM L2). Niveau/stock selon progression joueur/fabricant."
2080+ ]
2081+ },
2082+ "sources": [
2083+ {
2084+ "label": "Game8 Neilnail Best Build; DE, 2025",
2085+ "url": "https://game8.co/games/Xenoblade-Chronicles-X/archives/507640",
2086+ "edition": "DE"
2087+ },
2088+ {
2089+ "label": "Sakuraba manufacturer offerings; weapon type catalog/armor traits",
2090+ "url": "https://xenoblade.fandom.com/wiki/Sakuraba_Industries",
2091+ "edition": "both"
2092+ },
2093+ {
2094+ "label": "Candid & Credible Psycho Launchers/Electric weapon and armor catalog",
2095+ "url": "https://xenoblade.fandom.com/wiki/Candid_%26_Credible",
2096+ "edition": "both"
2097+ },
2098+ {
2099+ "label": "Game8 DE Psycho Launchers inventory and Arts",
2100+ "url": "https://game8.co/games/Xenoblade-Chronicles-X/archives/504898",
2101+ "edition": "DE"
2102+ },
2103+ {
2104+ "label": "Game8 DE Dual Swords inventory",
2105+ "url": "https://game8.co/games/Xenoblade-Chronicles-X/archives/504901",
2106+ "edition": "DE"
2107+ },
2108+ {
2109+ "label": "Meredith & Co. Ether weapon program and Chapter 4 unlock",
2110+ "url": "https://xenoblade.fandom.com/wiki/Meredith_%26_Co.",
2111+ "edition": "both"
2112+ },
2113+ {
2114+ "label": "Psycho Launcher Ruina II (Meredith) and Ether attribute table",
2115+ "url": "https://xenoblade.fandom.com/wiki/Psycho_Launchers",
2116+ "edition": "both"
2117+ },
2118+ {
2119+ "label": "XSW Aura Assault Skill source: requires equipped Aura",
2120+ "url": "https://www.xenoserieswiki.org/w/index.php?title=Aura_Assault&action=raw",
2121+ "edition": "both"
2122+ },
2123+ {
2124+ "label": "XSW Inner Search Skill data: Potential improves TP Arts and Soul Voice healing",
2125+ "url": "https://www.xenoserieswiki.org/w/index.php?title=Inner_Search&action=raw",
2126+ "edition": "both"
2127+ },
2128+ {
2129+ "label": "Game8 DE Aura Assault conditional Skill guidance",
2130+ "url": "https://game8.co/games/Xenoblade-Chronicles-X/archives/503868",
2131+ "edition": "DE"
2132+ }
2133+ ]
2134+ },
2135+ "Al": {
2136+ "role": [
2137+ "High-risk melee attacker and party support: Howling Soul provides party buffs/revive; no self-sustain, so retain Steel Flesh and healer synergy.",
2138+ "Attaquant mêlée à risque et soutien d’équipe : Howling Soul buff/résurrection ; aucune autonomie de soin, conserver Steel Flesh et synergie avec soigneur."
2139+ ],
2140+ "rationale": [
2141+ "Melee burst/support; Howling Soul team buff/revive, low-HP Hercules Blow with defensive Skill and ranged utility.",
2142+ "Burst mêlée/soutien ; buff/résurrection Howling Soul, Hercules Blow à faible PV, compétence défensive et utilitaire à distance."
2143+ ],
2144+ "arts": [
2145+ "Hawkeye",
2146+ "Tornado Blade",
2147+ "Offensive Stance",
2148+ "Hercules Blow",
2149+ "Eagle Eye",
2150+ "Sidewinder",
2151+ "Intercept",
2152+ "Howling Soul"
2153+ ],
2154+ "skills": [
2155+ "Steel Flesh",
2156+ "Mighty Muscle",
2157+ "Healing Touch",
2158+ "Grand Procession"
2159+ ],
2160+ "artSubstitutes": [
2161+ "Rising Blade",
2162+ "First Down",
2163+ "Magnum Edge",
2164+ "Burning Slash",
2165+ "Shrapnel"
2166+ ],
2167+ "skillSubstitutes": [
2168+ "Quick Reload",
2169+ "Conflagrant Edge",
2170+ "Boosted Bullets",
2171+ "Dismantler"
2172+ ],
2173+ "equipment": {
2174+ "weapons": [
2175+ "Sakuraba Industries Longsword, verified Iron Sword: Physical, level 1, 48 attack, 2.0 s cooldown, 230 TP gain, shop price 3000. Fits melee Arts and requires no late manufacturer unlock. Sakuraba Sniper Rifle physical line for Eagle Eye/Sidewinder/Intercept; exact model not singled out. Do not recommend unverified Thermal Glaive/Six Stars.",
2176+ "Longsword Sakuraba Industries, modèle vérifié Iron Sword : Physical, niveau 1, attaque 48, recharge 2,0 s, gain PT 230, prix boutique 3000. Convient Arts mêlée sans déblocage fabricant tardif. Ligne Sniper Rifle physique Sakuraba pour Eagle Eye/Sidewinder/Intercept ; modèle exact non choisi. Ne pas recommander Glaive thermique/Six Stars non vérifié."
2177+ ],
2178+ "armor": [
2179+ "Sakuraba Medium Wear at AM L1. Verified DE Combat Bodywear: Medium, min L15, defense 28, Physical +10, Gravity −15, Melee Attack Up II; suits melee damage and physical frontline. Light Wear at AM L2 offers arm Melee Attack Up/Max TP alternatives. C&C Heavy Combat Bulwark is a defensive option only at C&C AM L3: L15, defense 40, Potential Up II, Electric +20, Beam −5, Gravity −15.",
2180+ "Sakuraba Medium Wear AM L1. Combat Bodywear DE vérifié : Medium, niv. min 15, défense 28, Physique +10, Gravité −15, Melee Attack Up II ; convient dégâts mêlée/front physique. Light Wear AM L2 offre bras Melee Attack Up/Max TP. C&C Heavy Combat Bulwark option défensive uniquement C&C AM L3 : niv.15, défense 40, Potential Up II, Electric +20, Beam −5, Gravity −15."
2181+ ],
2182+ "availability": [
2183+ "Iron Sword shop-purchasable min level 1. Sakuraba Medium armor AM L1; Light AM L2. C&C Heavy alternative requires Chapter 5 and AM L3. No Thermal/Six Stars model remains in final recommendation.",
2184+ "Iron Sword boutique niveau min 1. Armure Sakuraba Medium AM L1 ; Light AM L2. Alternative C&C Heavy exige chapitre 5 et AM L3. Aucun modèle Thermal/Six Stars dans recommandation finale."
2185+ ]
2186+ },
2187+ "sources": [
2188+ {
2189+ "label": "Game8 Al Best Build; DE, 2025",
2190+ "url": "https://game8.co/games/Xenoblade-Chronicles-X/archives/515373",
2191+ "edition": "DE"
2192+ },
2193+ {
2194+ "label": "Sakuraba manufacturer offerings; weapon type catalog/armor traits",
2195+ "url": "https://xenoblade.fandom.com/wiki/Sakuraba_Industries",
2196+ "edition": "both"
2197+ },
2198+ {
2199+ "label": "Candid & Credible armor alternative catalog/traits",
2200+ "url": "https://xenoblade.fandom.com/wiki/Candid_%26_Credible",
2201+ "edition": "both"
2202+ },
2203+ {
2204+ "label": "Game8 DE Iron Sword (Sakuraba, Physical, min level 1)",
2205+ "url": "https://game8.co/games/Xenoblade-Chronicles-X/archives/511408",
2206+ "edition": "DE"
2207+ },
2208+ {
2209+ "label": "Game8 DE Longsword list",
2210+ "url": "https://game8.co/games/Xenoblade-Chronicles-X/archives/504899",
2211+ "edition": "DE"
2212+ },
2213+ {
2214+ "label": "Game8 DE Sniper Rifle list",
2215+ "url": "https://game8.co/games/Xenoblade-Chronicles-X/archives/504894",
2216+ "edition": "DE"
2217+ },
2218+ {
2219+ "label": "Candid & Credible Heavy Wear armor alternative and stats",
2220+ "url": "https://game8.co/games/Xenoblade-Chronicles-X/archives/510204",
2221+ "edition": "DE"
2222+ }
2223+ ]
2224+ }
2225+};
new file mode 100644
@@ -0,0 +1,2225 @@
1+import type { CuratedCompanionBuild } from "@/src/lib/types";
2+
3+/**
4+ * Curated fixed AI builds (Rickub #1): editorial selections with canonical-first ordered
5+ * substitutes; Art provenance is in src/data/art-effects.json, with guide links per build.
6+ * Cross (player avatar) is intentionally excluded.
7+ */
8+export const companionBuilds: Readonly<Record<string, CuratedCompanionBuild>> = {
9+ "Elma": {
10+ "role": [
11+ "Positional dual-weapon DPS with party Decoy support",
12+ "DPS positionnel à double arme, avec Décoy de groupe"
13+ ],
14+ "rationale": [
15+ "Keep Primer and Sliding Slinger for TP flow; Violent Streak adds critical-based TP gain. Ghost Factory protects nearby allies; Executioner is ranged TP damage. Side Slash and Shadowstrike retain positional attacks, but AI positioning is unreliable. Ghost Factory and Executioner are the only equipped TP Arts.",
16+ "Garder Primer et Sliding Slinger pour générer des PT ; Violent Streak ajoute le gain de PT sur critique. Ghost Factory protège les alliés proches ; Executioner apporte des dégâts à distance contre des PT. Side Slash et Shadowstrike gardent les attaques positionnelles, mais le placement de l’IA reste peu fiable. Ghost Factory et Executioner sont les deux seuls Arts à PT équipés."
17+ ],
18+ "arts": [
19+ "Primer",
20+ "Sliding Slinger",
21+ "Shadowstrike",
22+ "Side Slash",
23+ "Violent Streak",
24+ "Electric Surge",
25+ "Ghost Factory",
26+ "Executioner"
27+ ],
28+ "skills": [
29+ "Agile Gunslinger",
30+ "Steady Hand",
31+ "Background Noise",
32+ "Master Edge"
33+ ],
34+ "artSubstitutes": [
35+ "Upper Hand",
36+ "Blood Sacrifice",
37+ "Stream Edge",
38+ "Thirsty Edge",
39+ "Hundred Shells"
40+ ],
41+ "skillSubstitutes": [
42+ "Mortal Enemy",
43+ "Hellhound",
44+ "Crisis Catalyst",
45+ "Phantom Counter"
46+ ],
47+ "equipment": {
48+ "weapons": [
49+ "Sakuraba Industries Dual Guns Series + Blades Series (Dual Swords), both AM Level 1. Alternative: Grenada Gemels Dual Guns + Ralzes Dual Swords, AM Level 1. Choose weapon attribute and Battle Traits for enemy matchup; no manufacturer grants an Elma-specific bonus.",
50+ "Sakuraba Industries, séries Dual Guns + Blades (épées doubles), AM niv. 1. Alternative : Grenada Gemels (Dual Guns) + Ralzes (épées doubles), AM niv. 1. Choisir l’attribut et les traits selon l’ennemi ; aucun fabricant ne donne de bonus propre à Elma."
51+ ],
52+ "armor": [
53+ "Candid & Credible Light Wear: Screen, Breaker, Ward, Trudgers. Light trades defense for higher attribute resistance, especially Gravity; C&C ground gear trends high-defense. Editorial DPS choice, not consensus.",
54+ "Armure légère Candid & Credible : Screen, Breaker, Ward, Trudgers. Le type léger sacrifie de la défense pour davantage de résistances, surtout Gravité ; les équipements terrestres C&C tendent vers une défense élevée. Choix éditorial pour un DPS, pas un consensus."
55+ ],
56+ "availability": [
57+ "C&C unlocks after Chapter 5; Light Wear requires AM Level 2 and 7,000 R&D. Before that use initial Sakuraba or Grenada Medium Wear at AM Level 1; C&C Medium is also AM Level 1 after its story gate.",
58+ "C&C se débloque après le chapitre 5 ; l’armure légère exige AM niv. 2 et 7 000 points de R&D. Avant cela, utiliser l’armure moyenne Sakuraba ou Grenada (fabricants initiaux, AM niv. 1) ; l’armure moyenne C&C est aussi AM niv. 1 après son déblocage scénario."
59+ ]
60+ },
61+ "sources": [
62+ {
63+ "label": "Xeno Series Wiki — Elma/Gameplay (XCX)",
64+ "url": "https://www.xenoserieswiki.org/wiki/Elma/Gameplay_(XCX)",
65+ "edition": "both"
66+ },
67+ {
68+ "label": "Game8 — Elma Best Build (DE)",
69+ "url": "https://game8.co/games/Xenoblade-Chronicles-X/archives/506520",
70+ "edition": "DE"
71+ },
72+ {
73+ "label": "Nintendo Life — Best Combat Builds for All Characters (DE)",
74+ "url": "https://www.nintendolife.com/guides/xenoblade-chronicles-x-best-combat-builds-for-all-characters",
75+ "edition": "DE"
76+ },
77+ {
78+ "label": "Reddit — A Guide to Xenoblade X DE Party Member Builds (search-indexed; direct fetch blocked)",
79+ "url": "https://www.reddit.com/r/Xenoblade_Chronicles/comments/1jnyxkz/a_guide_to_xenoblade_x_de_party_member_builds/",
80+ "edition": "DE"
81+ },
82+ {
83+ "label": "Xeno Series Wiki — Battle Art (XCX)",
84+ "url": "https://www.xenoserieswiki.org/wiki/Battle_Art_(XCX)",
85+ "edition": "both"
86+ },
87+ {
88+ "label": "Xeno Series Wiki — Skill (XCX)",
89+ "url": "https://www.xenoserieswiki.org/wiki/Skill_(XCX)",
90+ "edition": "both"
91+ },
92+ {
93+ "label": "Xeno Series Wiki — Sakuraba Industries",
94+ "url": "https://www.xenoserieswiki.org/wiki/Sakuraba_Industries",
95+ "edition": "both"
96+ },
97+ {
98+ "label": "Xeno Series Wiki — Grenada Galactic Group",
99+ "url": "https://www.xenoserieswiki.org/wiki/Grenada_Galactic_Group",
100+ "edition": "both"
101+ },
102+ {
103+ "label": "Xeno Series Wiki — Candid & Credible",
104+ "url": "https://www.xenoserieswiki.org/wiki/Candid_%26_Credible",
105+ "edition": "both"
106+ },
107+ {
108+ "label": "Xeno Series Wiki — Armor (XCX)",
109+ "url": "https://www.xenoserieswiki.org/wiki/Armor_(XCX)",
110+ "edition": "both"
111+ }
112+ ]
113+ },
114+ "Lin": {
115+ "role": [
116+ "Shield tank and Topple setup",
117+ "Tank bouclier et spécialiste du Topple"
118+ ],
119+ "rationale": [
120+ "Wild Down topples; Wild Smash and Drum Roll exploit toppled/melee-combo targets. Trash Talk supports aggro/TP; Shield Wall adds a non-TP barrier and Bullet Storm deals weapon damage, with Flinch against humanoids, without needing an aura. Wild Down and Drum Roll are the only TP Arts. Game8 omitted Drum Roll’s TP marker; XSW marks it (TP).",
121+ "Wild Down renverse l’ennemi ; Wild Smash et Drum Roll exploitent les cibles renversées et les combos au corps-à-corps. Trash Talk soutient l’aggro et les PT ; Shield Wall ajoute une barrière sans coût en PT et Bullet Storm inflige des dégâts d’arme et Flinch aux humanoïdes sans exiger d’aura. Wild Down et Drum Roll sont les deux seuls Arts à PT. Game8 a omis le marqueur PT de Drum Roll ; XSW le marque (TP)."
122+ ],
123+ "arts": [
124+ "Wild Down",
125+ "Wild Smash",
126+ "Trash Talk",
127+ "Drum Roll",
128+ "Reality Rift",
129+ "Fire Carnival",
130+ "Shield Wall",
131+ "Bullet Storm"
132+ ],
133+ "skills": [
134+ "Shield Screen",
135+ "Dirty Fighter",
136+ "Stand Strong"
137+ ],
138+ "artSubstitutes": [
139+ "Flame Cloak",
140+ "Bombardier",
141+ "Supershield",
142+ "Thermal Payload"
143+ ],
144+ "skillSubstitutes": [
145+ "Steel Flesh",
146+ "Mighty Muscle",
147+ "Dismantler",
148+ "Long Topple"
149+ ],
150+ "equipment": {
151+ "weapons": [
152+ "Sakuraba Industries Shield Series + Machine Series (Gatling Gun), AM Level 1. Grenada Paive + Repethe (AM Level 1) is an alternative; C&C Haven + Crank (AM Level 1) is available after Chapter 5.",
153+ "Sakuraba Industries, séries Shield + Machine (mitrailleuse Gatling), AM niv. 1. Alternative Grenada Paive + Repethe (AM niv. 1) ; C&C Haven + Crank (AM niv. 1) après le chapitre 5."
154+ ],
155+ "armor": [
156+ "Candid & Credible Heavy Wear: Armet, Bulwark, Wrest, Stabilizers. Heavy trades resistance for higher defense; C&C ground armor trends high-defense. Use it only when the incoming attribute profile permits.",
157+ "Armure lourde Candid & Credible : Armet, Bulwark, Wrest, Stabilizers. Le type lourd échange des résistances contre plus de défense ; les armures terrestres C&C tendent vers une défense élevée. À choisir seulement si les attributs ennemis le permettent."
158+ ],
159+ "availability": [
160+ "C&C unlocks after Chapter 5; Heavy Wear requires AM Level 3 and 12,000 R&D. Before then use Sakuraba Medium Wear at AM Level 1, or Sakuraba Heavy after its AM Level 3/5,000 R&D gate. Medium Wear is safer against elemental-heavy encounters.",
161+ "C&C se débloque après le chapitre 5 ; l’armure lourde exige AM niv. 3 et 12 000 points de R&D. Avant cela, utiliser l’armure moyenne Sakuraba AM niv. 1, ou son armure lourde après le palier AM niv. 3/5 000 points. L’armure moyenne convient mieux face à de forts dégâts élémentaires."
162+ ]
163+ },
164+ "sources": [
165+ {
166+ "label": "Xeno Series Wiki — Lin/Gameplay",
167+ "url": "https://www.xenoserieswiki.org/wiki/Lin/Gameplay",
168+ "edition": "both"
169+ },
170+ {
171+ "label": "Game8 — Lin Best Build (DE)",
172+ "url": "https://game8.co/games/Xenoblade-Chronicles-X/archives/506544",
173+ "edition": "DE"
174+ },
175+ {
176+ "label": "Nintendo Life — Best Combat Builds for All Characters (DE)",
177+ "url": "https://www.nintendolife.com/guides/xenoblade-chronicles-x-best-combat-builds-for-all-characters",
178+ "edition": "DE"
179+ },
180+ {
181+ "label": "Reddit — A Guide to Xenoblade X DE Party Member Builds (search-indexed; direct fetch blocked)",
182+ "url": "https://www.reddit.com/r/Xenoblade_Chronicles/comments/1jnyxkz/a_guide_to_xenoblade_x_de_party_member_builds/",
183+ "edition": "DE"
184+ },
185+ {
186+ "label": "Xeno Series Wiki — Battle Art (XCX)",
187+ "url": "https://www.xenoserieswiki.org/wiki/Battle_Art_(XCX)",
188+ "edition": "both"
189+ },
190+ {
191+ "label": "Xeno Series Wiki — Skill (XCX)",
192+ "url": "https://www.xenoserieswiki.org/wiki/Skill_(XCX)",
193+ "edition": "both"
194+ },
195+ {
196+ "label": "Xeno Series Wiki — Sakuraba Industries",
197+ "url": "https://www.xenoserieswiki.org/wiki/Sakuraba_Industries",
198+ "edition": "both"
199+ },
200+ {
201+ "label": "Xeno Series Wiki — Grenada Galactic Group",
202+ "url": "https://www.xenoserieswiki.org/wiki/Grenada_Galactic_Group",
203+ "edition": "both"
204+ },
205+ {
206+ "label": "Xeno Series Wiki — Candid & Credible",
207+ "url": "https://www.xenoserieswiki.org/wiki/Candid_%26_Credible",
208+ "edition": "both"
209+ },
210+ {
211+ "label": "Xeno Series Wiki — Armor (XCX)",
212+ "url": "https://www.xenoserieswiki.org/wiki/Armor_(XCX)",
213+ "edition": "both"
214+ },
215+ {
216+ "label": "Xeno Series Wiki — Cool Off aura prerequisite",
217+ "url": "https://www.xenoserieswiki.org/wiki/Cool_Off_(XCX)",
218+ "edition": "both"
219+ }
220+ ]
221+ },
222+ "Irina": {
223+ "role": [
224+ "Healing, TP, barrier and buff support",
225+ "Soutien par soins, PT, barrières et bonus"
226+ ],
227+ "rationale": [
228+ "Smooth Recovery, Repair and Absorber Skin cover healing, cleanse and Barrier. Last Stand and Energy Source provide team TP/Potential support. Quick Cannon and Flash Grenade retain ranged damage/Blackout; Assault Hammer adds non-TP Topple. Medic Free is removed to keep the strict two-TP limit. This is not the player-style Sleep/Control build. Irina has only three own Skills useful to this support bar without Sleep or Control; leave the fourth slot empty rather than equip an inert Control-specific Skill.",
229+ "Smooth Recovery, Repair et Absorber Skin assurent soins, dissipation et barrière. Last Stand et Energy Source soutiennent les PT/le Potentiel de l’équipe. Quick Cannon et Flash Grenade gardent dégâts à distance et Blackout ; Assault Hammer ajoute Topple sans coût en PT. Medic Free est retiré pour respecter la limite stricte de deux Arts à PT. Ce n’est pas le build Sommeil/Contrôle manuel. Seules trois compétences propres à Irina servent cette barre de soutien sans Sommeil ni Contrôle ; la quatrième place reste vide plutôt que d’équiper une compétence de Contrôle inactive."
230+ ],
231+ "arts": [
232+ "Smooth Recovery",
233+ "Quick Cannon",
234+ "Repair",
235+ "Assault Hammer",
236+ "Last Stand",
237+ "Energy Source",
238+ "Absorber Skin",
239+ "Flash Grenade"
240+ ],
241+ "skills": [
242+ "Inner Search",
243+ "Healing Touch",
244+ "High Tension"
245+ ],
246+ "artSubstitutes": [
247+ "Furious Blast",
248+ "Screamer",
249+ "Medic Free"
250+ ],
251+ "skillSubstitutes": [],
252+ "equipment": {
253+ "weapons": [
254+ "Sakuraba Industries Assault Series + Knife Series, AM Level 1. Grenada Avagar + Riv (AM Level 1) is a same-type alternative.",
255+ "Sakuraba Industries, séries Assault + Knife, AM niv. 1. Alternative de mêmes types : Grenada Avagar + Riv (AM niv. 1)."
256+ ],
257+ "armor": [
258+ "Grenada Medium Wear: Spex, Torse, Quantlet, Soales, AM Level 1. Grenada identifies beam-resistant ground armor as a product strength; use item resistances/traits for actual enemy matchup.",
259+ "Armure moyenne Grenada : Spex, Torse, Quantlet, Soales, AM niv. 1. Grenada identifie les armures terrestres résistantes aux lasers comme un point fort ; choisir résistances/traits selon l’ennemi."
260+ ],
261+ "availability": [
262+ "Grenada is one of the two initial AMs; Medium Wear and weapon lines are AM Level 1. Sakuraba Medium is the initial-maker alternative. C&C Medium is available at AM Level 1 only after Chapter 5.",
263+ "Grenada est l’un des deux fabricants initiaux ; l’armure moyenne et les armes sont disponibles à AM niv. 1. L’armure moyenne Sakuraba est l’alternative initiale. C&C propose l’armure moyenne à AM niv. 1 après le chapitre 5."
264+ ]
265+ },
266+ "sources": [
267+ {
268+ "label": "Xeno Series Wiki — Irina/Gameplay",
269+ "url": "https://www.xenoserieswiki.org/wiki/Irina/Gameplay",
270+ "edition": "both"
271+ },
272+ {
273+ "label": "Game8 — Irina Best Build (DE)",
274+ "url": "https://game8.co/games/Xenoblade-Chronicles-X/archives/506541",
275+ "edition": "DE"
276+ },
277+ {
278+ "label": "Nintendo Life — Best Combat Builds for All Characters (DE)",
279+ "url": "https://www.nintendolife.com/guides/xenoblade-chronicles-x-best-combat-builds-for-all-characters",
280+ "edition": "DE"
281+ },
282+ {
283+ "label": "Reddit — A Guide to Xenoblade X DE Party Member Builds (search-indexed; direct fetch blocked)",
284+ "url": "https://www.reddit.com/r/Xenoblade_Chronicles/comments/1jnyxkz/a_guide_to_xenoblade_x_de_party_member_builds/",
285+ "edition": "DE"
286+ },
287+ {
288+ "label": "Xeno Series Wiki — Battle Art (XCX)",
289+ "url": "https://www.xenoserieswiki.org/wiki/Battle_Art_(XCX)",
290+ "edition": "both"
291+ },
292+ {
293+ "label": "Xeno Series Wiki — Skill (XCX)",
294+ "url": "https://www.xenoserieswiki.org/wiki/Skill_(XCX)",
295+ "edition": "both"
296+ },
297+ {
298+ "label": "Xeno Series Wiki — Sakuraba Industries",
299+ "url": "https://www.xenoserieswiki.org/wiki/Sakuraba_Industries",
300+ "edition": "both"
301+ },
302+ {
303+ "label": "Xeno Series Wiki — Grenada Galactic Group",
304+ "url": "https://www.xenoserieswiki.org/wiki/Grenada_Galactic_Group",
305+ "edition": "both"
306+ },
307+ {
308+ "label": "Xeno Series Wiki — Candid & Credible",
309+ "url": "https://www.xenoserieswiki.org/wiki/Candid_%26_Credible",
310+ "edition": "both"
311+ },
312+ {
313+ "label": "Xeno Series Wiki — Armor (XCX)",
314+ "url": "https://www.xenoserieswiki.org/wiki/Armor_(XCX)",
315+ "edition": "both"
316+ },
317+ {
318+ "label": "Xenoblade Wiki — King's Decree Control-only effect",
319+ "url": "https://xenoblade.fandom.com/wiki/King%27s_Decree",
320+ "edition": "both"
321+ },
322+ {
323+ "label": "Xenoblade Wiki — Servant Sacrifice Control prerequisite and HP/TP restore",
324+ "url": "https://xenoblade.fandom.com/wiki/Servant_Sacrifice",
325+ "edition": "both"
326+ }
327+ ]
328+ },
329+ "Gwin": {
330+ "role": [
331+ "Thermal-leaning ranged/melee hybrid",
332+ "Hybride distance/corps-à-corps orienté thermique"
333+ ],
334+ "rationale": [
335+ "Use Gwin’s legal Longsword + Assault Rifle Arts. Defensive Stance gives an AI-safe aura; Power Dive grants Supercharge/evasion. Grenade Blitz and Burst Grenade support Thermal damage; Flash Grenade adds Electric damage/Blackout; Takedown Shot adds mechanoid Topple. Defensive Stance and Burst Grenade are the only TP Arts. Published Game8 Gwin Arts are weapon-incompatible, so this build is editorial.",
336+ "Utiliser les Arts légaux de Gwin, épée longue + fusil d’assaut. Defensive Stance apporte une aura défensive adaptée à l’IA ; Power Dive donne Supercharge/évasion. Grenade Blitz et Burst Grenade soutiennent les dégâts thermiques ; Flash Grenade ajoute dégâts électriques/Blackout ; Takedown Shot ajoute Topple contre les méchanoïdes. Defensive Stance et Burst Grenade sont les deux seuls Arts à PT. Les Arts Game8 pour Gwin sont incompatibles avec ses armes ; ce build est éditorial."
337+ ],
338+ "arts": [
339+ "Defensive Stance",
340+ "Power Dive",
341+ "Furious Blast",
342+ "Magnum Edge",
343+ "Flash Grenade",
344+ "Grenade Blitz",
345+ "Takedown Shot",
346+ "Burst Grenade"
347+ ],
348+ "skills": [
349+ "Unwavering Courage",
350+ "Flame Trigger",
351+ "Conflagrant Edge"
352+ ],
353+ "artSubstitutes": [
354+ "Rising Blade",
355+ "Ultraslash",
356+ "Tornado Blade",
357+ "Decoy Round",
358+ "Incendiary Edge",
359+ "Gunforce"
360+ ],
361+ "skillSubstitutes": [
362+ "Mighty Muscle",
363+ "Auto Melee Boost",
364+ "Healing Aura",
365+ "Weapon Guard",
366+ "Theroid Slayer"
367+ ],
368+ "equipment": {
369+ "weapons": [
370+ "Sakuraba Industries Assault Series + Sword Series (Longsword), AM Level 1. Grenada Avagar + Slair are same-type AM Level 1 alternatives.",
371+ "Sakuraba Industries, séries Assault + Sword (épée longue), AM niv. 1. Alternatives de mêmes types : Grenada Avagar + Slair, AM niv. 1."
372+ ],
373+ "armor": [
374+ "Sakuraba Medium Wear: Goggles, Bodywear, Glove, Footwear, AM Level 1. Conservative availability recommendation only; no Medium-specific numeric bonus is asserted.",
375+ "Armure moyenne Sakuraba : Goggles, Bodywear, Glove, Footwear, AM niv. 1. Recommandation prudente de disponibilité ; aucun bonus numérique propre au type moyen n’est affirmé."
376+ ],
377+ "availability": [
378+ "Sakuraba and Grenada are initial AMs; Medium Wear and weapon lines are AM Level 1. C&C Medium is an alternative after Chapter 5 and AM Level 1, with a high-defense product trend.",
379+ "Sakuraba et Grenada sont initiaux ; armes et armure moyenne disponibles à AM niv. 1. L’armure moyenne C&C est une alternative après le chapitre 5, AM niv. 1, avec une gamme terrestre orientée défense."
380+ ]
381+ },
382+ "sources": [
383+ {
384+ "label": "Xeno Series Wiki — Gwin/Gameplay",
385+ "url": "https://www.xenoserieswiki.org/wiki/Gwin/Gameplay",
386+ "edition": "both"
387+ },
388+ {
389+ "label": "Game8 — Best Builds for All Characters (DE)",
390+ "url": "https://game8.co/games/Xenoblade-Chronicles-X/archives/506659",
391+ "edition": "DE"
392+ },
393+ {
394+ "label": "Xeno Series Wiki — Battle Art (XCX)",
395+ "url": "https://www.xenoserieswiki.org/wiki/Battle_Art_(XCX)",
396+ "edition": "both"
397+ },
398+ {
399+ "label": "Xeno Series Wiki — Skill (XCX)",
400+ "url": "https://www.xenoserieswiki.org/wiki/Skill_(XCX)",
401+ "edition": "both"
402+ },
403+ {
404+ "label": "Xeno Series Wiki — Sakuraba Industries",
405+ "url": "https://www.xenoserieswiki.org/wiki/Sakuraba_Industries",
406+ "edition": "both"
407+ },
408+ {
409+ "label": "Xeno Series Wiki — Grenada Galactic Group",
410+ "url": "https://www.xenoserieswiki.org/wiki/Grenada_Galactic_Group",
411+ "edition": "both"
412+ },
413+ {
414+ "label": "Xeno Series Wiki — Candid & Credible",
415+ "url": "https://www.xenoserieswiki.org/wiki/Candid_%26_Credible",
416+ "edition": "both"
417+ },
418+ {
419+ "label": "Xeno Series Wiki — Armor (XCX)",
420+ "url": "https://www.xenoserieswiki.org/wiki/Armor_(XCX)",
421+ "edition": "both"
422+ }
423+ ]
424+ },
425+ "Doug": {
426+ "role": [
427+ "Beam-leaning Photon Saber/Raygun hybrid support",
428+ "Hybride de soutien laser au sabre photonique/pistolet laser"
429+ ],
430+ "rationale": [
431+ "Keep Doug’s legal Photon Saber + Raygun defaults, then add cleanse, healing and debuff utility. Beam Barrage gains damage with an aura; Geolibrium supplies beam resistance/regeneration; Astral Heal heals. Geolibrium and Astral Heal are the only TP Arts. This is editorial: the published Game8 Doug list uses Longsword/Gatling Arts, not Doug’s weapons.",
432+ "Garder les Arts légaux par défaut de Doug, sabre photonique + pistolet laser, puis ajouter dissipation, soins et affaiblissements. Beam Barrage gagne des dégâts avec une aura ; Geolibrium apporte résistance laser/régénération ; Astral Heal soigne. Geolibrium et Astral Heal sont les deux seuls Arts à PT. Choix éditorial : la liste Game8 publiée utilise des Arts d’épée longue/mitrailleuse, pas les armes de Doug."
433+ ],
434+ "arts": [
435+ "Starfall Blade",
436+ "Starfall Rondo",
437+ "Beam Barrage",
438+ "Geolibrium",
439+ "Myopic Screen",
440+ "Astral Purge",
441+ "Astral Heal",
442+ "Subterfuge"
443+ ],
444+ "skills": [
445+ "Inner Search",
446+ "Beam Boost",
447+ "High Tension",
448+ "Aura Assault"
449+ ],
450+ "artSubstitutes": [
451+ "Phenomenon",
452+ "Pathogen Blast",
453+ "Gravity Blast",
454+ "Ether Blast",
455+ "Novalibrium"
456+ ],
457+ "skillSubstitutes": [
458+ "Mechanoid Slayer",
459+ "Knight's Soul",
460+ "Supreme Sword"
461+ ],
462+ "equipment": {
463+ "weapons": [
464+ "Grenada Galactic Group Lastyr Raygun + Fulge Photon Saber, AM Level 1. Grenada’s product portfolio is beam-focused. Sakuraba Raygun + Saber are initial-maker alternatives.",
465+ "Grenada Galactic Group, Lastyr (pistolet laser) + Fulge (sabre photonique), AM niv. 1. Sa gamme est orientée laser. Sakuraba Raygun + Saber sont des alternatives du fabricant initial."
466+ ],
467+ "armor": [
468+ "Grenada Medium Wear: Spex, Torse, Quantlet, Soales, AM Level 1. Its ground armor trends beam-resistant. Use Light Wear at AM Level 2 if Gravity resistance matters more than defense.",
469+ "Armure moyenne Grenada : Spex, Torse, Quantlet, Soales, AM niv. 1. Ses armures terrestres tendent à résister aux lasers. Choisir l’armure légère AM niv. 2 si la résistance Gravité compte davantage que la défense."
470+ ],
471+ "availability": [
472+ "Grenada is an initial AM; Raygun/Photon Saber series and Medium Wear are AM Level 1. Light Wear requires AM Level 2 and 2,000 R&D. Sakuraba is the initial-maker alternative; its Medium Wear is AM Level 1.",
473+ "Grenada est un fabricant initial ; séries pistolet laser/sabre photonique et armure moyenne disponibles à AM niv. 1. L’armure légère exige AM niv. 2 et 2 000 points de R&D. Sakuraba est l’alternative initiale ; son armure moyenne est AM niv. 1."
474+ ]
475+ },
476+ "sources": [
477+ {
478+ "label": "Xeno Series Wiki — Doug/Gameplay",
479+ "url": "https://www.xenoserieswiki.org/wiki/Doug/Gameplay",
480+ "edition": "both"
481+ },
482+ {
483+ "label": "Game8 — Doug Best Build (DE; personal ranks and TP recommendations checked against XSW)",
484+ "url": "https://game8.co/games/Xenoblade-Chronicles-X/archives/507626",
485+ "edition": "DE"
486+ },
487+ {
488+ "label": "Game8 — Best Builds for All Characters (DE)",
489+ "url": "https://game8.co/games/Xenoblade-Chronicles-X/archives/506659",
490+ "edition": "DE"
491+ },
492+ {
493+ "label": "Xeno Series Wiki — Battle Art (XCX)",
494+ "url": "https://www.xenoserieswiki.org/wiki/Battle_Art_(XCX)",
495+ "edition": "both"
496+ },
497+ {
498+ "label": "Xeno Series Wiki — Skill (XCX)",
499+ "url": "https://www.xenoserieswiki.org/wiki/Skill_(XCX)",
500+ "edition": "both"
501+ },
502+ {
503+ "label": "Xeno Series Wiki — Sakuraba Industries",
504+ "url": "https://www.xenoserieswiki.org/wiki/Sakuraba_Industries",
505+ "edition": "both"
506+ },
507+ {
508+ "label": "Xeno Series Wiki — Grenada Galactic Group",
509+ "url": "https://www.xenoserieswiki.org/wiki/Grenada_Galactic_Group",
510+ "edition": "both"
511+ },
512+ {
513+ "label": "Xeno Series Wiki — Armor (XCX)",
514+ "url": "https://www.xenoserieswiki.org/wiki/Armor_(XCX)",
515+ "edition": "both"
516+ }
517+ ]
518+ },
519+ "Lao": {
520+ "role": [
521+ "Ranged Electric/Shock DPS; permanently unavailable after Chapter 9",
522+ "DPS électrique/Choc à distance ; indisponible définitivement après le chapitre 9"
523+ ],
524+ "rationale": [
525+ "Arcing Horn lowers Electric resistance; Trident Buster applies Shock; Conductive Strike and Electric Boost support Electric/Shock damage. Ghost Sniper adds critical/ranged accuracy/TP support. The final two TP Arts are Trident Buster and Ghost Sniper; Afterburner is dropped from Game8’s three-TP candidate list.",
526+ "Arcing Horn réduit la résistance électrique ; Trident Buster applique Choc ; Conductive Strike et Electric Boost soutiennent les dégâts Électrique/Choc. Ghost Sniper apporte critiques/précision à distance/soutien PT. Les deux Arts à PT sont Trident Buster et Ghost Sniper ; Afterburner est retiré de la liste Game8 qui en contient trois."
527+ ],
528+ "arts": [
529+ "Balance Breaker",
530+ "Arcing Horn",
531+ "Trident Buster",
532+ "Overwhelm",
533+ "Shrapnel",
534+ "Eagle Eye",
535+ "Ghost Sniper",
536+ "Intercept"
537+ ],
538+ "skills": [
539+ "Knock 'n' Shock",
540+ "Conductive Strike",
541+ "Electric Boost"
542+ ],
543+ "artSubstitutes": [
544+ "First Down",
545+ "Sidewinder",
546+ "Spiral Horn",
547+ "Hair Trigger",
548+ "Hawkeye",
549+ "Raijin",
550+ "Afterburner"
551+ ],
552+ "skillSubstitutes": [
553+ "Killshot",
554+ "Piscinoid Slayer",
555+ "Long Shot",
556+ "Quick Reload",
557+ "TP Overdrive"
558+ ],
559+ "equipment": {
560+ "weapons": [
561+ "Candid & Credible Trigger Sniper Rifle + Bolide Javelin, AM Level 1 after Chapter 5. C&C says its weapons are Electric except Dual Guns and Shield, so both match Lao’s weapon types and Electric build. Before that gate, use Sakuraba Sniper Rifle + Spear series (AM Level 1, physical alternative).",
562+ "Candid & Credible, Trigger (fusil de précision) + Bolide (javelot), AM niv. 1 après le chapitre 5. C&C précise que ses armes sont électriques, sauf Dual Guns et Shield ; les deux séries correspondent aux armes et au build électrique de Lao. Avant ce déblocage, utiliser les séries Sakuraba Sniper Rifle + Spear (AM niv. 1, alternative physique)."
563+ ],
564+ "armor": [
565+ "Candid & Credible Medium Wear: Sights, Encaser, Grip, Distancers, AM Level 1 after the Chapter 5 gate. C&C ground armor trends high-defense. Light Wear at AM Level 2/7,000 R&D trades defense for higher resistance, especially Gravity.",
566+ "Armure moyenne Candid & Credible : Sights, Encaser, Grip, Distancers, AM niv. 1 après le chapitre 5. Les armures terrestres C&C tendent vers une défense élevée. L’armure légère AM niv. 2/7 000 points de R&D échange de la défense contre des résistances accrues, surtout Gravité."
567+ ],
568+ "availability": [
569+ "C&C unlocks after Chapter 5; weapon lines and Medium Wear are AM Level 1. Light Wear needs AM Level 2 and 7,000 R&D. Before Chapter 5, Sakuraba Sniper Rifle/Spear and Medium Wear are available from the initial AM. Lao is permanently unplayable after Chapter 9.",
570+ "C&C se débloque après le chapitre 5 ; armes et armure moyenne disponibles à AM niv. 1. L’armure légère exige AM niv. 2 et 7 000 points de R&D. Avant le chapitre 5, les séries Sniper Rifle/Spear et l’armure moyenne Sakuraba sont disponibles chez le fabricant initial. Lao devient définitivement indisponible après le chapitre 9."
571+ ]
572+ },
573+ "sources": [
574+ {
575+ "label": "Xeno Series Wiki — Lao/Gameplay",
576+ "url": "https://www.xenoserieswiki.org/wiki/Lao/Gameplay",
577+ "edition": "both"
578+ },
579+ {
580+ "label": "Game8 — Lao Best Build (DE)",
581+ "url": "https://game8.co/games/Xenoblade-Chronicles-X/archives/506554",
582+ "edition": "DE"
583+ },
584+ {
585+ "label": "Nintendo Life — Best Combat Builds for All Characters (DE)",
586+ "url": "https://www.nintendolife.com/guides/xenoblade-chronicles-x-best-combat-builds-for-all-characters",
587+ "edition": "DE"
588+ },
589+ {
590+ "label": "Reddit — A Guide to Xenoblade X DE Party Member Builds (search-indexed; direct fetch blocked)",
591+ "url": "https://www.reddit.com/r/Xenoblade_Chronicles/comments/1jnyxkz/a_guide_to_xenoblade_x_de_party_member_builds/",
592+ "edition": "DE"
593+ },
594+ {
595+ "label": "Xeno Series Wiki — Battle Art (XCX)",
596+ "url": "https://www.xenoserieswiki.org/wiki/Battle_Art_(XCX)",
597+ "edition": "both"
598+ },
599+ {
600+ "label": "Xeno Series Wiki — Skill (XCX)",
601+ "url": "https://www.xenoserieswiki.org/wiki/Skill_(XCX)",
602+ "edition": "both"
603+ },
604+ {
605+ "label": "Xeno Series Wiki — Sakuraba Industries",
606+ "url": "https://www.xenoserieswiki.org/wiki/Sakuraba_Industries",
607+ "edition": "both"
608+ },
609+ {
610+ "label": "Xeno Series Wiki — Candid & Credible",
611+ "url": "https://www.xenoserieswiki.org/wiki/Candid_%26_Credible",
612+ "edition": "both"
613+ },
614+ {
615+ "label": "Xeno Series Wiki — Armor (XCX)",
616+ "url": "https://www.xenoserieswiki.org/wiki/Armor_(XCX)",
617+ "edition": "both"
618+ }
619+ ]
620+ },
621+ "L": {
622+ "role": [
623+ "Defensive tank / control-support",
624+ "Tank défensif / soutien-contrôle"
625+ ],
626+ "rationale": [
627+ "Wild Down supplies party Topple; Long Topple extends it. Shield Wall barrier, Astral Protection and Mindstorm protect/heal allies; Shooting Star adds Shock without spending TP. AI fit is steady defense/control, not burst DPS.",
628+ "Wild Down apporte Renversement ; Long Topple le prolonge. Shield Wall, Astral Protection et Mindstorm protègent/soignent ; Shooting Star ajoute Shock sans dépenser de PT. Rôle IA : défense/contrôle régulier, pas dégâts explosifs."
629+ ],
630+ "arts": [
631+ "Wild Down",
632+ "Astral Protection",
633+ "Mindstorm",
634+ "Shield Wall",
635+ "Trash Talk",
636+ "Stellar Ray",
637+ "Shooting Star",
638+ "Lightning Cloak"
639+ ],
640+ "skills": [
641+ "Steel Flesh",
642+ "Long Topple",
643+ "Shield Screen"
644+ ],
645+ "artSubstitutes": [
646+ "Wild Smash",
647+ "Reality Rift",
648+ "Bombardier",
649+ "Flame Cloak"
650+ ],
651+ "skillSubstitutes": [
652+ "Mighty Muscle",
653+ "Stand Strong"
654+ ],
655+ "equipment": {
656+ "weapons": [
657+ "Shield: Sakuraba physical Shield Series (Lv.60 320 damage, 165 TP gain) gives greater auto-attack TP than Grenada Paive (320/120). Psycho Launchers: Grenada Psylans beam (Lv.60 32 damage, 1.8 s, 5 ammo, 3 TP gain) pairs with Stellar Ray’s weapon-damage/Beam-Res-Down role. This beam model does not change Shooting Star’s fixed electric damage.",
658+ "Bouclier : Shield Series physique Sakuraba (niv. 60 : 320 dégâts, 165 PT) génère plus de PT que Paive Grenada (320/120). Lanceurs psycho : Psylans laser Grenada (niv. 60 : 32 dégâts, 1,8 s, 5 munitions, 3 PT) pour le rôle dégâts d’arme/baisse résistance laser de Stellar Ray. N’altère pas l’électricité fixe de Shooting Star."
659+ ],
660+ "armor": [
661+ "Orphean Light Wear (Yii/Yimsel/Yiys/Yiym): choose piece-specific Evasion, HP or Max-TP traits for this Astral Protection tank; Light Wear itself does not grant evasion. Representative Lv.55 torso Yimsel has Defense 40 and Gravity +20; C&C Heavy Bulwark has Defense 100, Electric +20, Gravity −15. Weigh those defense/resistance tradeoffs for the encounter; traits are not guaranteed set defaults. [Armor table](https://xenoblade.fandom.com/wiki/Armor).",
662+ "Armure légère Orphean Technologies (Yii/Yimsel/Yiys/Yiym) : viser les traits esquive/PV/PT max sur les pièces pour ce tank à Astral Protection ; la catégorie légère ne donne pas d’esquive en soi. Torse Yimsel niv. 55 : Défense 40, Gravité +20 ; Bulwark lourd C&C : Défense 100, Électricité +20, Gravité −15. Adapter défense/résistance à l’ennemi ; traits non garantis. [Table armure](https://xenoblade.fandom.com/wiki/Armor)."
663+ ],
664+ "availability": [
665+ "Orphean unlocks after Rescue at the Ensconced Citadel; AM level 2 unlocks Light, level 3 Heavy. Early fallback: currently stocked Sakuraba Light armor and legal physical Shield/available launcher until preferred models are available.",
666+ "Orphean se débloque après Rescue at the Ensconced Citadel ; niveau fabricant 2 pour léger, 3 pour lourd. Alternative précoce : armure légère Sakuraba en stock et bouclier physique/lanceur disponible."
667+ ]
668+ },
669+ "sources": [
670+ {
671+ "label": "Xeno Series Wiki personal gameplay record (weapon pair, Skill slots, Art/Skill personal ranks)",
672+ "url": "https://www.xenoserieswiki.org/wiki/L/Gameplay",
673+ "edition": "both"
674+ },
675+ {
676+ "label": "DE party-member build guide by Stuart98",
677+ "url": "https://www.reddit.com/r/Xenoblade_Chronicles/comments/1jnyxkz/a_guide_to_xenoblade_x_de_party_member_builds/",
678+ "edition": "DE"
679+ },
680+ {
681+ "label": "2015 GameFAQs party-member build thread",
682+ "url": "https://gamefaqs.gamespot.com/boards/701151-xenoblade-chronicles-x/73179135",
683+ "edition": "XCX"
684+ },
685+ {
686+ "label": "Arms Manufacturer story locks and R&D tier facts",
687+ "url": "https://www.xenoserieswiki.org/wiki/Arms_Manufacturer",
688+ "edition": "both"
689+ },
690+ {
691+ "label": "Armor / maker traits and weight details",
692+ "url": "https://xenoblade.fandom.com/wiki/Orphean_Technologies",
693+ "edition": "both"
694+ },
695+ {
696+ "label": "Nintendo Life independent role/build excerpt; direct reader returned feed",
697+ "url": "https://www.nintendolife.com/guides/xenoblade-chronicles-x-best-combat-builds-for-all-characters",
698+ "edition": "XCX"
699+ },
700+ {
701+ "label": "Shield Arts TP costs and weapon models",
702+ "url": "https://xenoblade.fandom.com/wiki/Shield",
703+ "edition": "XCX"
704+ },
705+ {
706+ "label": "Psycho Launchers Arts TP costs and weapon models",
707+ "url": "https://xenoblade.fandom.com/wiki/Psycho_Launchers",
708+ "edition": "XCX"
709+ },
710+ {
711+ "label": "Representative Lv.55 torso defense/resistance values by armor manufacturer",
712+ "url": "https://xenoblade.fandom.com/wiki/Armor",
713+ "edition": "XCX"
714+ }
715+ ]
716+ },
717+ "H.B.": {
718+ "role": [
719+ "Tank / party TP battery / Topple control",
720+ "Tank / batterie PT du groupe / contrôle Renversement"
721+ ],
722+ "rationale": [
723+ "Wild Down and Long Topple/Topple Topper form reliable control; taunts and Shield Wall protect the party. Last Stand converts H.B.’s TP into ally TP. Canonical TP spenders: Wild Down and Last Stand only.",
724+ "Wild Down et Long Topple/Topple Topper forment un contrôle fiable ; provocations et Shield Wall protègent. Last Stand convertit les PT de H.B. en PT alliés. Seuls Wild Down et Last Stand consomment des PT."
725+ ],
726+ "arts": [
727+ "Wild Down",
728+ "Shield Wall",
729+ "Decoy Round",
730+ "Last Stand",
731+ "Wild Smash",
732+ "Trash Talk",
733+ "Takedown Shot",
734+ "Power Dive"
735+ ],
736+ "skills": [
737+ "Steel Flesh",
738+ "Long Topple",
739+ "Topple Topper",
740+ "Combat Presence"
741+ ],
742+ "artSubstitutes": [
743+ "Atomic Hit",
744+ "Furious Blast",
745+ "Flash Grenade",
746+ "Bombardier"
747+ ],
748+ "skillSubstitutes": [
749+ "Mighty Muscle",
750+ "Shield Screen",
751+ "Trauma Tension",
752+ "Double Spike"
753+ ],
754+ "equipment": {
755+ "weapons": [
756+ "Shield: Candid & Credible Haven II physical, Lv.60 320 damage/3.3 s/200 TP gain, supports TP throughput. Assault Rifle: Sakuraba physical (Lv.60 16 damage/2.7 s/20 ammo/1 TP), so weapon-damage Takedown Shot stays physical. Before C&C unlock use Sakuraba Shield (320/165 TP).",
757+ "Bouclier Haven II physique C&C, niv. 60 : 320 dégâts/3,3 s/200 PT, bon débit PT. Fusil d’assaut physique Sakuraba (16/2,7 s/20 munitions/1 PT) pour Takedown Shot. Avant C&C : bouclier Sakuraba (320/165 PT)."
758+ ],
759+ "armor": [
760+ "Candid & Credible Heavy Wear (Armet/Bulwark/Wrest/Stabilizers): high-defense maker and explicit raw-defense choice for taunting frontline. Representative Lv.55 torso Bulwark has Defense 100, Electric +20, Gravity −15; Light Breaker has Defense 60, Electric +20, Gravity −5. Heavy Wear trades gravity resistance/upgrade flexibility for defense. [Armor table](https://xenoblade.fandom.com/wiki/Armor).",
761+ "Armure lourde C&C (Armet/Bulwark/Wrest/Stabilizers) : défense brute pour tank de première ligne. Torse Bulwark niv. 55 : Défense 100, Électricité +20, Gravité −15 ; Breaker léger : Défense 60, Électricité +20, Gravité −5. Lourd échange résistance gravitationnelle/flexibilité contre défense. [Table armure](https://xenoblade.fandom.com/wiki/Armor)."
762+ ],
763+ "availability": [
764+ "C&C unlocks after Chapter 5; Haven II series is AM level 2, Heavy Wear level 3. Earlier fallback: Sakuraba physical Shield/Assault Rifle and currently available armor weight.",
765+ "C&C après chapitre 5 ; Haven II au niveau fabricant 2, armure lourde au niveau 3. Alternative antérieure : bouclier/fusil physiques Sakuraba et poids d’armure disponible."
766+ ]
767+ },
768+ "sources": [
769+ {
770+ "label": "Xeno Series Wiki personal gameplay record (weapon pair, Skill slots, Art/Skill personal ranks)",
771+ "url": "https://www.xenoserieswiki.org/wiki/H.B./Gameplay",
772+ "edition": "both"
773+ },
774+ {
775+ "label": "DE party-member build guide by Stuart98",
776+ "url": "https://www.reddit.com/r/Xenoblade_Chronicles/comments/1jnyxkz/a_guide_to_xenoblade_x_de_party_member_builds/",
777+ "edition": "DE"
778+ },
779+ {
780+ "label": "2015 GameFAQs party-member build thread",
781+ "url": "https://gamefaqs.gamespot.com/boards/701151-xenoblade-chronicles-x/73179135",
782+ "edition": "XCX"
783+ },
784+ {
785+ "label": "Arms Manufacturer story locks and R&D tier facts",
786+ "url": "https://www.xenoserieswiki.org/wiki/Arms_Manufacturer",
787+ "edition": "both"
788+ },
789+ {
790+ "label": "Armor / maker traits and weight details",
791+ "url": "https://xenoblade.fandom.com/wiki/Candid_%26_Credible",
792+ "edition": "both"
793+ },
794+ {
795+ "label": "Nintendo Life independent role/build excerpt; direct reader returned feed",
796+ "url": "https://www.nintendolife.com/guides/xenoblade-chronicles-x-best-combat-builds-for-all-characters",
797+ "edition": "XCX"
798+ },
799+ {
800+ "label": "Shield Arts TP costs and weapon models",
801+ "url": "https://xenoblade.fandom.com/wiki/Shield",
802+ "edition": "XCX"
803+ },
804+ {
805+ "label": "Assault Rifle Arts TP costs and weapon models",
806+ "url": "https://xenoblade.fandom.com/wiki/Assault_Rifle",
807+ "edition": "XCX"
808+ },
809+ {
810+ "label": "Representative Lv.55 torso defense/resistance values by armor manufacturer",
811+ "url": "https://xenoblade.fandom.com/wiki/Armor",
812+ "edition": "XCX"
813+ }
814+ ]
815+ },
816+ "Alexa": {
817+ "role": [
818+ "Electric control / durable bruiser-support",
819+ "Contrôle électrique / combattante de soutien résistante"
820+ ],
821+ "rationale": [
822+ "Arcing Horn lowers Electric Resistance; Trident Buster inflicts Shock, supported by Electric Boost. Raijin adds healing/reflect, Assault Hammer adds non-TP Topple. Maximum Voltage is legal but its post-Skell-destruction bonus is situational and another TP Art would break the two-Art package.",
823+ "Arcing Horn réduit la résistance électrique ; Trident Buster applique Shock, soutenu par Electric Boost. Raijin soigne/réflecte, Assault Hammer renverse sans PT. Maximum Voltage est légal mais son bonus après destruction de Skell est situationnel et dépasserait le plafond PT."
824+ ],
825+ "arts": [
826+ "Arcing Horn",
827+ "Raijin",
828+ "Trident Buster",
829+ "Assault Hammer",
830+ "Power Dive",
831+ "Decoy Round",
832+ "Furious Blast",
833+ "Overwhelm"
834+ ],
835+ "skills": [
836+ "Fortified Flesh",
837+ "Electric Boost",
838+ "High Tension"
839+ ],
840+ "artSubstitutes": [
841+ "Spiral Horn",
842+ "Hair Trigger",
843+ "Flash Grenade"
844+ ],
845+ "skillSubstitutes": [
846+ "Steel Flesh",
847+ "Quick Reload",
848+ "TP Overdrive"
849+ ],
850+ "equipment": {
851+ "weapons": [
852+ "Candid & Credible Bolide Electric Javelin (Lv.60 312 damage/2.5 s/155 TP) and Assailer Electric Assault Rifle (Lv.60 16 damage/2.7 s/20 ammo/1 TP). These attributes support weapon-damage Arts; Arcing Horn, Trident Buster and Maximum Voltage have fixed Art elements.",
853+ "Javelin électrique Bolide C&C (niv. 60 : 312 dégâts/2,5 s/155 PT) et fusil électrique Assailer (16/2,7 s/20 munitions/1 PT). Attribut pour Arts à dégâts d’arme ; Arcing Horn, Trident Buster et Maximum Voltage ont un élément fixe."
854+ ],
855+ "armor": [
856+ "Candid & Credible Light Wear (Screen/Breaker/Ward/Trudgers): Max TP and Electric Res traits exist on relevant slots; representative Lv.55 torso Breaker is Defense 60, Electric +20, Gravity −5. Heavy Bulwark is Defense 100, Electric +20, Gravity −15; choose only if raw defense beats those tradeoffs. Inspect actual item traits. [Armor table](https://xenoblade.fandom.com/wiki/Armor).",
857+ "Armure légère C&C (Screen/Breaker/Ward/Trudgers) : traits PT max/résistance électrique sur certains emplacements ; torse Breaker niv. 55 : Défense 60, Électricité +20, Gravité −5. Bulwark lourd : Défense 100, Électricité +20, Gravité −15 ; préférer seulement si défense brute prime. Vérifier les traits. [Table armure](https://xenoblade.fandom.com/wiki/Armor)."
858+ ],
859+ "availability": [
860+ "C&C unlocks after Chapter 5; Light Wear requires AM level 2, Heavy level 3. Before then use Sakuraba physical weapons/armor; fixed-electric Arts stay electric, weapon-damage Arts inherit physical. Skell mode must not replace ground build.",
861+ "C&C après chapitre 5 ; armure légère au niveau 2, lourde au niveau 3. Avant, armes/armure physiques Sakuraba ; Arts électriques fixes inchangés, Arts de dégâts d’arme héritent du physique. Le mode Skell ne remplace pas le build au sol."
862+ ]
863+ },
864+ "sources": [
865+ {
866+ "label": "Xeno Series Wiki personal gameplay record (weapon pair, Skill slots, Art/Skill personal ranks)",
867+ "url": "https://www.xenoserieswiki.org/wiki/Alexa/Gameplay",
868+ "edition": "both"
869+ },
870+ {
871+ "label": "DE party-member build guide by Stuart98",
872+ "url": "https://www.reddit.com/r/Xenoblade_Chronicles/comments/1jnyxkz/a_guide_to_xenoblade_x_de_party_member_builds/",
873+ "edition": "DE"
874+ },
875+ {
876+ "label": "2015 GameFAQs party-member build thread",
877+ "url": "https://gamefaqs.gamespot.com/boards/701151-xenoblade-chronicles-x/73179135",
878+ "edition": "XCX"
879+ },
880+ {
881+ "label": "Arms Manufacturer story locks and R&D tier facts",
882+ "url": "https://www.xenoserieswiki.org/wiki/Arms_Manufacturer",
883+ "edition": "both"
884+ },
885+ {
886+ "label": "Armor / maker traits and weight details",
887+ "url": "https://xenoblade.fandom.com/wiki/Candid_%26_Credible",
888+ "edition": "both"
889+ },
890+ {
891+ "label": "Assault Rifle Arts TP costs and weapon models",
892+ "url": "https://xenoblade.fandom.com/wiki/Assault_Rifle",
893+ "edition": "XCX"
894+ },
895+ {
896+ "label": "Javelin Arts TP costs and weapon models",
897+ "url": "https://xenoblade.fandom.com/wiki/Javelin",
898+ "edition": "both"
899+ },
900+ {
901+ "label": "Representative Lv.55 torso defense/resistance values by armor manufacturer",
902+ "url": "https://xenoblade.fandom.com/wiki/Armor",
903+ "edition": "XCX"
904+ }
905+ ]
906+ },
907+ "Bozé": {
908+ "role": [
909+ "Long-range Electric / Shock setup",
910+ "Tir à longue portée électrique / Shock"
911+ ],
912+ "rationale": [
913+ "Arcing Horn lowers Electric Resistance, Trident Buster inflicts Shock; Electric Boost, Conductive Strike and Knock ’n’ Shock support this package. Eagle Eye boosts ranged accuracy/attack. Shock-dependent value falls against resistance/immunity; no evidence supports universal top-tier claims.",
914+ "Arcing Horn baisse la résistance électrique, Trident Buster applique Shock ; Electric Boost, Conductive Strike et Knock ’n’ Shock soutiennent le package. Eagle Eye améliore précision/attaque à distance. Valeur Shock réduite contre résistance/immunité ; aucune preuve d’une supériorité universelle."
915+ ],
916+ "arts": [
917+ "Arcing Horn",
918+ "Eagle Eye",
919+ "Sidewinder",
920+ "Shrapnel",
921+ "Trident Buster",
922+ "Hair Trigger",
923+ "Hawkeye",
924+ "Overwhelm"
925+ ],
926+ "skills": [
927+ "Electric Boost",
928+ "Conductive Strike",
929+ "Knock 'n' Shock"
930+ ],
931+ "artSubstitutes": [
932+ "Spiral Horn",
933+ "Raijin",
934+ "Vortex",
935+ "First Down",
936+ "Intercept"
937+ ],
938+ "skillSubstitutes": [
939+ "Master Edge",
940+ "Killshot",
941+ "Electric Guard",
942+ "Quick Reload",
943+ "TP Overdrive"
944+ ],
945+ "equipment": {
946+ "weapons": [
947+ "Candid & Credible Bolide Electric Javelin (Lv.60 312 damage/2.5 s/155 TP) + Trigger Electric Sniper Rifle (Lv.60 112 damage/4 s/5 ammo/7 TP). Fixed-electric Arts retain their attribute.",
948+ "Javelin électrique Bolide C&C (niv. 60 : 312 dégâts/2,5 s/155 PT) + fusil de précision électrique Trigger (112 dégâts/4 s/5 munitions/7 PT). Arts électriques fixes gardent leur attribut."
949+ ],
950+ "armor": [
951+ "Candid & Credible Light Wear: target piece-specific Electric Res/Max TP traits; representative Lv.55 torso Breaker has Defense 60, Electric +20, Gravity −5. Heavy Bulwark raises Defense to 100 but Gravity falls to −15. Light does not grant mobility; favor these verified resistances/traits for the encounter rather than assuming a universal best weight. [Armor table](https://xenoblade.fandom.com/wiki/Armor).",
952+ "Armure légère C&C : viser les traits résistance électrique/PT max sur certaines pièces ; torse Breaker niv. 55 : Défense 60, Électricité +20, Gravité −5. Bulwark lourd monte à Défense 100 mais descend à Gravité −15. Le léger ne confère pas de mobilité ; comparer ces résistances/traits selon l’ennemi plutôt que supposer un poids idéal. [Table armure](https://xenoblade.fandom.com/wiki/Armor)."
953+ ],
954+ "availability": [
955+ "C&C unlocks after Chapter 5; Light Wear AM level 2, Heavy level 3. Earlier fallback: Sakuraba physical Javelin/Sniper Rifle; fixed-electric Arts remain electric. Keep fixed build even against Shock-resistant targets.",
956+ "C&C après chapitre 5 ; armure légère niveau fabricant 2, lourde 3. Alternative antérieure : Javelin/fusil de précision physiques Sakuraba ; Arts électriques fixes inchangés. Garder le build fixe contre ennemis résistants à Shock."
957+ ]
958+ },
959+ "sources": [
960+ {
961+ "label": "Xeno Series Wiki personal gameplay record (weapon pair, Skill slots, Art/Skill personal ranks)",
962+ "url": "https://www.xenoserieswiki.org/wiki/Boz%C3%A9/Gameplay",
963+ "edition": "both"
964+ },
965+ {
966+ "label": "DE party-member build guide by Stuart98",
967+ "url": "https://www.reddit.com/r/Xenoblade_Chronicles/comments/1jnyxkz/a_guide_to_xenoblade_x_de_party_member_builds/",
968+ "edition": "DE"
969+ },
970+ {
971+ "label": "2015 GameFAQs party-member build thread",
972+ "url": "https://gamefaqs.gamespot.com/boards/701151-xenoblade-chronicles-x/73179135",
973+ "edition": "XCX"
974+ },
975+ {
976+ "label": "Arms Manufacturer story locks and R&D tier facts",
977+ "url": "https://www.xenoserieswiki.org/wiki/Arms_Manufacturer",
978+ "edition": "both"
979+ },
980+ {
981+ "label": "Armor / maker traits and weight details",
982+ "url": "https://xenoblade.fandom.com/wiki/Candid_%26_Credible",
983+ "edition": "both"
984+ },
985+ {
986+ "label": "Javelin Arts TP costs and weapon models",
987+ "url": "https://xenoblade.fandom.com/wiki/Javelin",
988+ "edition": "both"
989+ },
990+ {
991+ "label": "Sniper Rifle Arts TP costs and weapon models",
992+ "url": "https://xenoblade.fandom.com/wiki/Sniper_Rifle",
993+ "edition": "both"
994+ },
995+ {
996+ "label": "Representative Lv.55 torso defense/resistance values by armor manufacturer",
997+ "url": "https://xenoblade.fandom.com/wiki/Armor",
998+ "edition": "XCX"
999+ }
1000+ ]
1001+ },
1002+ "Celica": {
1003+ "role": [
1004+ "Ether debuff / Potential Dual Guns DPS with defense",
1005+ "Débuff Éther / DPS Potentiel aux Deux armes avec défense"
1006+ ],
1007+ "rationale": [
1008+ "Black Butterfly and Black Bane are Knife Arts with fixed Ether damage; Black Butterfly applies Ether Res Down, supporting Black Bane’s debuff scaling. Zero Zero/Executioner use weapon damage on Dual Guns; Ghostwalker adds survival. Full Specs and Executioner are the only TP Arts. Absorber Skin supplies non-TP Barrier. Sleep is fragile in party AI [editorial].",
1009+ "Black Butterfly et Black Bane sont des Arts Couteau à dégâts Éther fixes ; Black Butterfly baisse résistance Éther et prépare Black Bane. Zero Zero/Executioner utilisent dégâts d’arme aux Deux armes ; Ghostwalker protège. Full Specs et Executioner sont les seuls Arts PT. Absorber Skin apporte Barrière sans PT. Sommeil fragile en IA de groupe [éditorial]."
1010+ ],
1011+ "arts": [
1012+ "Black Butterfly",
1013+ "Black Bane",
1014+ "Full Specs",
1015+ "Zero Zero",
1016+ "Ghostwalker",
1017+ "Primer",
1018+ "Executioner",
1019+ "Absorber Skin"
1020+ ],
1021+ "skills": [
1022+ "Steady Hand",
1023+ "Inner Search",
1024+ "Mindscape"
1025+ ],
1026+ "artSubstitutes": [
1027+ "Sliding Slinger",
1028+ "Screamer",
1029+ "Violent Streak"
1030+ ],
1031+ "skillSubstitutes": [
1032+ "Aura Burst",
1033+ "Fleet Feet",
1034+ "Gentle Approach",
1035+ "Feather Touch",
1036+ "Red Zone"
1037+ ],
1038+ "equipment": {
1039+ "weapons": [
1040+ "Meredith & Co. Ether Pistolia Dual Guns (Lv.60 24 damage/2.0 s/6 ammo/2 TP) for weapon-damage Zero Zero/Executioner; Ether Pugio Knife (56 damage/1.0 s/60 TP). Critical correction: Black Butterfly is Knife-only, fixed Ether; Ether Dual Guns neither equip it nor boost its listed damage.",
1041+ "Deux armes Éther Pistolia Meredith & Co. (niv. 60 : 24 dégâts/2 s/6 munitions/2 PT) pour Zero Zero/Executioner à dégâts d’arme ; couteau Éther Pugio (56 dégâts/1 s/60 PT). Correction : Black Butterfly est Couteau uniquement, Éther fixe ; les Deux armes Éther ne l’équipent ni n’augmentent ses dégâts."
1042+ ],
1043+ "armor": [
1044+ "Orphean Light Wear: Yii head may have Potential Up/Potential Boost; other slots can supply Max HP/TP, Evasion, Overdrive traits. Representative Lv.55 torso Yimsel has Defense 40 and Gravity +20; C&C Light Breaker has Defense 60, Electric +20 and Gravity −5. Target actual traits by piece; shop stock contains only a subset. [Armor table](https://xenoblade.fandom.com/wiki/Armor).",
1045+ "Armure légère Orphean : couvre-chef Yii peut porter Potential Up/Potential Boost ; autres pièces PV/PT max, esquive, traits Overdrive. Torse Yimsel niv. 55 : Défense 40, Gravité +20 ; Breaker C&C léger : Défense 60, Électricité +20, Gravité −5. Vérifier les traits réels ; boutique limitée. [Table armure](https://xenoblade.fandom.com/wiki/Armor)."
1046+ ],
1047+ "availability": [
1048+ "Meredith unlocks after Chapter 4. Orphean armor requires Rescue at the Ensconced Citadel and AM level 2 Light Wear; C&C unlocks after Chapter 5 and also needs level 2 Light Wear. Earlier fallback: Sakuraba-compatible Dual Guns/Knife and current armor; fixed Ether Arts stay Ether.",
1049+ "Meredith après chapitre 4. Armure Orphean après Rescue at the Ensconced Citadel et niveau fabricant 2 (léger) ; C&C après chapitre 5 et niveau 2. Alternative : Deux armes/Couteau Sakuraba et armure actuelle ; Arts Éther fixes inchangés."
1050+ ]
1051+ },
1052+ "sources": [
1053+ {
1054+ "label": "Xeno Series Wiki personal gameplay record (weapon pair, Skill slots, Art/Skill personal ranks)",
1055+ "url": "https://www.xenoserieswiki.org/wiki/Celica/Gameplay",
1056+ "edition": "both"
1057+ },
1058+ {
1059+ "label": "DE party-member build guide by Stuart98",
1060+ "url": "https://www.reddit.com/r/Xenoblade_Chronicles/comments/1jnyxkz/a_guide_to_xenoblade_x_de_party_member_builds/",
1061+ "edition": "DE"
1062+ },
1063+ {
1064+ "label": "2015 GameFAQs party-member build thread",
1065+ "url": "https://gamefaqs.gamespot.com/boards/701151-xenoblade-chronicles-x/73179135",
1066+ "edition": "XCX"
1067+ },
1068+ {
1069+ "label": "Arms Manufacturer story locks and R&D tier facts",
1070+ "url": "https://www.xenoserieswiki.org/wiki/Arms_Manufacturer",
1071+ "edition": "both"
1072+ },
1073+ {
1074+ "label": "Armor / maker traits and weight details",
1075+ "url": "https://xenoblade.fandom.com/wiki/Orphean_Technologies",
1076+ "edition": "both"
1077+ },
1078+ {
1079+ "label": "Nintendo Life article excerpt says build still coming soon",
1080+ "url": "https://www.nintendolife.com/guides/xenoblade-chronicles-x-best-combat-builds-for-all-characters",
1081+ "edition": "XCX"
1082+ },
1083+ {
1084+ "label": "Meredith manufacturer / Ether weapon models",
1085+ "url": "https://xenoblade.fandom.com/wiki/Meredith_%26_Co.",
1086+ "edition": "XCX"
1087+ },
1088+ {
1089+ "label": "Dual Guns Arts TP costs and weapon models",
1090+ "url": "https://xenoblade.fandom.com/wiki/Dual_Guns",
1091+ "edition": "both"
1092+ },
1093+ {
1094+ "label": "Knife Arts TP costs and weapon models",
1095+ "url": "https://xenoblade.fandom.com/wiki/Knife",
1096+ "edition": "both"
1097+ },
1098+ {
1099+ "label": "Representative Lv.55 torso defense/resistance values by armor manufacturer",
1100+ "url": "https://xenoblade.fandom.com/wiki/Armor",
1101+ "edition": "XCX"
1102+ }
1103+ ]
1104+ },
1105+ "Frye": {
1106+ "role": [
1107+ "Thermal ranged mob clearer / aura-assisted TP economy",
1108+ "Nettoyeur thermique à distance / économie PT avec aura"
1109+ ],
1110+ "rationale": [
1111+ "Missile Volley lowers Thermal Res; Thermal Payload adds toppled-target damage. Defensive Stance supplies an Aura so Bullet Twister/Tornado Blade can gain TP; Cool Off consumes an Aura to return TP. DE guide warns Frye is less reliable against bosses and AI/skill fit is imperfect. Two TP Arts only.",
1112+ "Missile Volley baisse résistance thermique ; Thermal Payload profite des cibles renversées. Defensive Stance fournit une aura pour Bullet Twister/Tornado Blade ; Cool Off la consomme pour rendre des PT. Guide DE juge Frye moins fiable contre boss et son IA/compétences imparfaites. Deux Arts PT maximum."
1113+ ],
1114+ "arts": [
1115+ "Missile Volley",
1116+ "Bullet Twister",
1117+ "Thermal Payload",
1118+ "Defensive Stance",
1119+ "Bullet Storm",
1120+ "Cool Off",
1121+ "Burning Slash",
1122+ "Tornado Blade"
1123+ ],
1124+ "skills": [
1125+ "Machine Gunner",
1126+ "Trauma Tension",
1127+ "Mighty Muscle"
1128+ ],
1129+ "artSubstitutes": [
1130+ "Rising Blade"
1131+ ],
1132+ "skillSubstitutes": [
1133+ "Unwavering Courage",
1134+ "Iron Knuckle",
1135+ "Rising Renewal",
1136+ "Weapon Guard",
1137+ "Blazing Auto"
1138+ ],
1139+ "equipment": {
1140+ "weapons": [
1141+ "Nopon Commerce Guild Ratatatta Thermal Gatling (Lv.60 20 damage/6.7 s/48 ammo/1 TP) for inherited-weapon Gatling Arts; Six Stars Glaive Thermal Longsword (Lv.60 204 damage/2.0 s/210 TP; Glaive II 216/180 TP) for weapon-damage Tornado Blade. Burning Slash is Longsword-only, fixed Thermal; Gatling attribute cannot affect it.",
1142+ "Gatling thermique Ratatatta Nopon Commerce Guild (niv. 60 : 20 dégâts/6,7 s/48 munitions/1 PT) pour Arts Gatling à dégâts d’arme ; épée longue thermique Glaive Six Stars (204 dégâts/2 s/210 PT ; Glaive II 216/180 PT) pour Tornado Blade. Burning Slash est Épée longue uniquement, thermique fixe ; la Gatling ne l’affecte pas."
1143+ ],
1144+ "armor": [
1145+ "Orphean Light Wear suits Frye’s high personal Dodge coefficient and ranged-mob role, but the armor weight itself grants no evasion: look for Evasion Battle Traits on the specific pieces. Representative Lv.55 torso Yimsel has Defense 40 and Gravity +20; C&C Light Breaker alternative is Defense 60, Electric +20, Gravity −5. Target HP/Evasion/Max-TP by slot; weight is not universal BIS. [Armor table](https://xenoblade.fandom.com/wiki/Armor).",
1146+ "L’armure légère Orphean convient au coefficient d’esquive élevé de Frye et à son rôle à distance, mais son poids ne donne pas d’esquive : chercher le trait de combat Esquive sur chaque pièce. Torse Yimsel niv. 55 : Défense 40, Gravité +20 ; alternative Breaker léger C&C : Défense 60, Électricité +20, Gravité −5. Cibler PV/esquive/PT max selon les pièces ; aucun poids n’est meilleur universel. [Table armure](https://xenoblade.fandom.com/wiki/Armor)."
1147+ ],
1148+ "availability": [
1149+ "Nopon unlocks after BFFs; Six Stars after A Challenger Approaches. Orphean armor requires Rescue at the Ensconced Citadel and AM level 2 for Light Wear; C&C Chapter 5/AM level 2 is fallback. Earlier weapon fallback: Sakuraba physical Gatling/Longsword; fixed Thermal Arts remain thermal. Lv.60 values are catalogue comparisons, not Frye’s guaranteed story gear.",
1150+ "Nopon après BFFs ; Six Stars après A Challenger Approaches. Armure Orphean après Rescue at the Ensconced Citadel et niveau fabricant 2 ; alternative C&C après chapitre 5/niveau 2. Armes physiques Sakuraba avant accès ; Arts thermiques fixes inchangés. Stats niv. 60 de comparaison catalogue, pas équipement d’histoire garanti."
1151+ ]
1152+ },
1153+ "sources": [
1154+ {
1155+ "label": "Xeno Series Wiki personal gameplay record (weapon pair, Skill slots, Art/Skill personal ranks)",
1156+ "url": "https://www.xenoserieswiki.org/wiki/Frye/Gameplay",
1157+ "edition": "both"
1158+ },
1159+ {
1160+ "label": "DE party-member build guide by Stuart98",
1161+ "url": "https://www.reddit.com/r/Xenoblade_Chronicles/comments/1jnyxkz/a_guide_to_xenoblade_x_de_party_member_builds/",
1162+ "edition": "DE"
1163+ },
1164+ {
1165+ "label": "2015 GameFAQs party-member build thread",
1166+ "url": "https://gamefaqs.gamespot.com/boards/701151-xenoblade-chronicles-x/73179135",
1167+ "edition": "XCX"
1168+ },
1169+ {
1170+ "label": "Arms Manufacturer story locks and R&D tier facts",
1171+ "url": "https://www.xenoserieswiki.org/wiki/Arms_Manufacturer",
1172+ "edition": "both"
1173+ },
1174+ {
1175+ "label": "Armor / maker traits and weight details",
1176+ "url": "https://xenoblade.fandom.com/wiki/Orphean_Technologies",
1177+ "edition": "both"
1178+ },
1179+ {
1180+ "label": "Nintendo Life article excerpt says build still coming soon",
1181+ "url": "https://www.nintendolife.com/guides/xenoblade-chronicles-x-best-combat-builds-for-all-characters",
1182+ "edition": "XCX"
1183+ },
1184+ {
1185+ "label": "Gatling Gun Arts TP costs and weapon models",
1186+ "url": "https://xenoblade.fandom.com/wiki/Gatling_Gun",
1187+ "edition": "both"
1188+ },
1189+ {
1190+ "label": "Longsword Arts TP costs and weapon models",
1191+ "url": "https://xenoblade.fandom.com/wiki/Longsword",
1192+ "edition": "both"
1193+ },
1194+ {
1195+ "label": "Representative Lv.55 torso defense/resistance values by armor manufacturer",
1196+ "url": "https://xenoblade.fandom.com/wiki/Armor",
1197+ "edition": "XCX"
1198+ }
1199+ ]
1200+ },
1201+ "Ga Jiarg": {
1202+ "role": [
1203+ "Editorial AI ground role: debuff-aware melee/Beam striker with Topple and status spread.",
1204+ "Rôle éditorial pour l'IA au sol : attaquant mêlée/Beam exploitant les débuffs, Topple et leur propagation."
1205+ ],
1206+ "rationale": [
1207+ "Exactly two TP spenders: Astrolibrium and Sky Sunder. Starfall Blossom generates TP; Astrolibrium boosts Beam; Subterfuge lowers debuff resistance; Bahamut Wave spreads debuffs; Sky Sunder scales with debuffs. Astral Heal is displaced from Game8's three-TP candidate bar.",
1208+ "Deux Arts consomment des PT : Astrolibrium et Sky Sunder. Starfall Blossom génère des PT; Astrolibrium renforce Beam; Subterfuge réduit la résistance aux débuffs; Bahamut Wave les propage; Sky Sunder gagne en dégâts selon les débuffs. Astral Heal sort de la barre Game8 dont les trois Arts à PT dépassent notre plafond de deux."
1209+ ],
1210+ "arts": [
1211+ "Starfall Blossom",
1212+ "Starfall Rondo",
1213+ "Astrolibrium",
1214+ "Sky Sunder",
1215+ "Subterfuge",
1216+ "Bahamut Wave",
1217+ "Gravity Blast",
1218+ "Gravity Cloak"
1219+ ],
1220+ "skills": [
1221+ "Beam Boost",
1222+ "Aura Assault",
1223+ "Supreme Sword",
1224+ "Tactical Analyst"
1225+ ],
1226+ "artSubstitutes": [
1227+ "Starfall Blade",
1228+ "Beam Barrage",
1229+ "Myopic Screen",
1230+ "Astral Heal",
1231+ "Novalibrium",
1232+ "Ether Blast",
1233+ "Pathogen Blast",
1234+ "Galactic Cataclysm"
1235+ ],
1236+ "skillSubstitutes": [
1237+ "Inner Search",
1238+ "Healing Touch",
1239+ "Appendage Erosion",
1240+ "Fast Forward"
1241+ ],
1242+ "equipment": {
1243+ "weapons": [
1244+ "Keep Ga's Sakuraba Destroyer Raygun, a Beam model at level 40 with 96 attack. His default Six Stars Pulverizing Lightblade II is Thermal, level 40 with 140 attack. For a Beam weapon-attribute Photon Saber Art, use a Beam drop such as Sakuraba Advanced Iron Saber, minimum level 3; it is not guaranteed shop stock. Otherwise keep the legal default. Sky Sunder itself remains Beam because its Art attribute is fixed.",
1245+ "Garder le Destroyer Raygun Beam de Sakuraba, niveau 40 et 96 d'attaque. Le Pulverizing Lightblade II Six Stars par défaut est Thermal, niveau 40 et 140 d'attaque. Pour un Art Photon Saber à attribut Beam, utiliser un modèle Beam obtenu en drop, tel que l'Advanced Iron Saber Sakuraba, niveau minimum 3; il n'est pas garanti en boutique. Sinon garder l'arme par défaut légale. Sky Sunder reste Beam car son attribut est fixe."
1246+ ],
1247+ "armor": [
1248+ "Candid & Credible Light Reginal Breaker at level 55: Potential Up VI, Defense 60, Electric +20, Beam −5, Gravity −5, 360,000 credits. Add Beam Resistance Up if Beam defense matters. Alternative for Beam defense: Grenada Light Combat Norak, level 15, Ranged Attack Up II, Defense 13, Beam +20, Gravity −10, 19,200 credits.",
1249+ "Reginal Breaker Light de Candid & Credible au niveau 55 : Potential Up VI, Defense 60, Electric +20, Beam −5, Gravity −5, 360 000 crédits. Ajouter Beam Resistance Up si la défense Beam compte. Alternative défensive : Combat Norak Light de Grenada, niveau 15, Ranged Attack Up II, Defense 13, Beam +20, Gravity −10, 19 200 crédits."
1250+ ],
1251+ "availability": [
1252+ "Ga's default Destroyer Raygun is already Beam and meets his starting level 40. The default Photon Saber is Thermal. A Beam Saber alternative such as Advanced Iron Saber is a random enemy drop, not guaranteed shop stock; if unavailable, keep the default because Sky Sunder remains Beam. Candid & Credible unlocks after Chapter 5; its Light line needs manufacturer rank 2. Heavy Combat Bulwark is level 15 but requires C&C rank 3. Grenada is available from the start; Light stock needs rank 2.",
1253+ "Le Destroyer Raygun Beam par défaut de Ga Jiarg est utilisable dès son niveau 40. Son Photon Saber par défaut est Thermal. L'alternative Beam Advanced Iron Saber est un drop ennemi, pas un stock garanti en boutique; si indisponible, garder l'arme par défaut car Sky Sunder reste Beam. Candid & Credible se débloque après le chapitre 5; sa gamme Light demande le rang fabricant 2. Combat Bulwark Heavy demande le niveau 15 et le rang C&C 3. Grenada est disponible dès le début; sa gamme Light demande le rang 2."
1254+ ]
1255+ },
1256+ "sources": [
1257+ {
1258+ "label": "Game8 Ga Jiarg Best Build",
1259+ "url": "https://game8.co/games/Xenoblade-Chronicles-X/archives/513831",
1260+ "edition": "DE"
1261+ },
1262+ {
1263+ "label": "Xeno Series Wiki Ga Jiarg gameplay progression",
1264+ "url": "https://www.xenoserieswiki.org/wiki/Ga_Jiarg/Gameplay",
1265+ "edition": "DE"
1266+ },
1267+ {
1268+ "label": "Xeno Series Wiki Arms Manufacturer gates",
1269+ "url": "https://www.xenoserieswiki.org/wiki/Arms_Manufacturer",
1270+ "edition": "both"
1271+ },
1272+ {
1273+ "label": "Xeno Series Wiki armor rules",
1274+ "url": "https://www.xenoserieswiki.org/wiki/Armor_(XCX)",
1275+ "edition": "both"
1276+ },
1277+ {
1278+ "label": "Game8 Photon Saber catalog",
1279+ "url": "https://game8.co/games/Xenoblade-Chronicles-X/archives/504904",
1280+ "edition": "DE"
1281+ },
1282+ {
1283+ "label": "Game8 Raygun catalog",
1284+ "url": "https://game8.co/games/Xenoblade-Chronicles-X/archives/504897",
1285+ "edition": "DE"
1286+ },
1287+ {
1288+ "label": "Xeno Series Wiki Destroyer Raygun",
1289+ "url": "https://www.xenoserieswiki.org/wiki/Destroyer_Raygun",
1290+ "edition": "both"
1291+ },
1292+ {
1293+ "label": "Xeno Series Wiki Pulverizing Lightblade II",
1294+ "url": "https://www.xenoserieswiki.org/wiki/Pulverizing_Lightblade_II",
1295+ "edition": "both"
1296+ },
1297+ {
1298+ "label": "Xeno Series Wiki Advanced Iron Saber",
1299+ "url": "https://www.xenoserieswiki.org/wiki/Advanced_Iron_Saber",
1300+ "edition": "both"
1301+ },
1302+ {
1303+ "label": "Game8 Reginal Breaker",
1304+ "url": "https://game8.co/games/Xenoblade-Chronicles-X/archives/510343",
1305+ "edition": "DE"
1306+ },
1307+ {
1308+ "label": "Game8 Potential Up",
1309+ "url": "https://game8.co/games/Xenoblade-Chronicles-X/archives/505711",
1310+ "edition": "DE"
1311+ },
1312+ {
1313+ "label": "Game8 Combat Bulwark",
1314+ "url": "https://game8.co/games/Xenoblade-Chronicles-X/archives/510204",
1315+ "edition": "DE"
1316+ },
1317+ {
1318+ "label": "Game8 Combat Norak",
1319+ "url": "https://game8.co/games/Xenoblade-Chronicles-X/archives/510471",
1320+ "edition": "DE"
1321+ }
1322+ ]
1323+ },
1324+ "Hope": {
1325+ "role": [
1326+ "Editorial AI ground role: ranged support/healer, debuff cleanse, barrier, Virus, party TP.",
1327+ "Rôle éditorial pour l'IA au sol : support/soins à distance, dissipation des débuffs, barrière, Virus et PT pour l'équipe."
1328+ ],
1329+ "rationale": [
1330+ "Exactly two TP spenders: Astral Protection and Energy Source. Repair cleanses and heals; Absorber Skin grants a barrier; Astral Protection adds resistances and healing; Energy Source supplies party TP; Stellar Ray, Shooting Star, Tacit Censure, and Black Butterfly add ranged/debuff utility. Servant Sacrifice is excluded: its Control/Heroic Tale prerequisite cannot be guaranteed under the two-TP progression cap.",
1331+ "Deux Arts consomment des PT : Astral Protection et Energy Source. Repair dissipe les débuffs et soigne; Absorber Skin donne une barrière; Astral Protection ajoute résistances et soins; Energy Source fournit des PT à l'équipe; Stellar Ray, Shooting Star, Tacit Censure et Black Butterfly ajoutent dégâts et débuffs à distance. Servant Sacrifice est exclu : son prérequis Control/Heroic Tale ne peut pas être garanti avec le plafond de deux Arts à PT pendant toute la progression."
1332+ ],
1333+ "arts": [
1334+ "Repair",
1335+ "Absorber Skin",
1336+ "Stellar Ray",
1337+ "Shooting Star",
1338+ "Tacit Censure",
1339+ "Black Butterfly",
1340+ "Astral Protection",
1341+ "Energy Source"
1342+ ],
1343+ "skills": [
1344+ "Inner Search",
1345+ "Knight's Soul",
1346+ "TP Overdrive"
1347+ ],
1348+ "artSubstitutes": [
1349+ "Brainjack",
1350+ "Full Specs",
1351+ "Secondary Speed",
1352+ "Dispel",
1353+ "Starlight Kick"
1354+ ],
1355+ "skillSubstitutes": [
1356+ "Buff Heal",
1357+ "Well-Weathered",
1358+ "Mechanoid Slayer",
1359+ "King's Decree",
1360+ "Supreme Sword"
1361+ ],
1362+ "equipment": {
1363+ "weapons": [
1364+ "Keep Sakuraba Knife + Psycho Launchers. Hope starts with Chrome Knife and Warrior Launchers, both Physical Sakuraba models. Her selected support/status Arts do not require a matching weapon attribute; preserve native types and upgrade item stats/TP gain.",
1365+ "Garder Knife + Psycho Launchers Sakuraba. Hope commence avec Chrome Knife et Warrior Launchers, deux modèles physiques de Sakuraba. Ses Arts de soutien/statut ne demandent pas d'attribut d'arme particulier; conserver les types natifs et améliorer les stats/le gain de PT."
1366+ ],
1367+ "armor": [
1368+ "Medium torso baseline due to Hope's −20% Max HP. Candid & Credible Forza Encaser at level 45 gives Potential Up V, Defense 67, Electric +20, Beam −5, Gravity −10. Add Max HP Up on another compatible armor piece. Lower-level C&C Heavy Combat Bulwark at level 15 gives Potential Up II and Defense 40; use only as a story fallback, not a universal Heavy recommendation.",
1369+ "Base recommandée : torse Medium à cause du −20% de Max HP de Hope. Le Forza Encaser Medium de Candid & Credible, niveau 45, donne Potential Up V, Defense 67, Electric +20, Beam −5, Gravity −10. Ajouter Max HP Up sur une autre pièce compatible. Le Combat Bulwark Heavy C&C, niveau 15, donne Potential Up II et Defense 40; le réserver à une solution de progression, pas à une recommandation Heavy universelle."
1370+ ],
1371+ "availability": [
1372+ "Candid & Credible unlocks after Chapter 5; Forza Encaser requires level 45 and is Medium Wear. Combat Bulwark requires level 15 and Heavy stock at maker rank 3. Before C&C unlocks, use a level-appropriate Sakuraba Medium torso and a Potential Up or Max HP Up augment. Grenada Light arm pieces can add Max TP Up, but Light stock requires maker rank 2 and is optional because the Skills already support TP.",
1373+ "Candid & Credible se débloque après le chapitre 5; Forza Encaser demande le niveau 45 et est Medium. Combat Bulwark demande le niveau 15 et le stock Heavy au rang 3 du fabricant. Avant le déblocage C&C, utiliser un torse Sakuraba Medium adapté au niveau avec un augment Potential Up ou Max HP Up. Les bras Light Grenada peuvent ajouter Max TP Up, mais le stock Light demande le rang 2 et reste facultatif puisque les Skills soutiennent déjà les PT."
1374+ ]
1375+ },
1376+ "sources": [
1377+ {
1378+ "label": "Game8 Hope Best Build",
1379+ "url": "https://game8.co/games/Xenoblade-Chronicles-X/archives/507443",
1380+ "edition": "DE"
1381+ },
1382+ {
1383+ "label": "Nintendo Life all-character builds",
1384+ "url": "https://www.nintendolife.com/guides/xenoblade-chronicles-x-best-combat-builds-for-all-characters",
1385+ "edition": "DE"
1386+ },
1387+ {
1388+ "label": "Xeno Series Wiki Hope gameplay",
1389+ "url": "https://www.xenoserieswiki.org/wiki/Hope/Gameplay",
1390+ "edition": "both"
1391+ },
1392+ {
1393+ "label": "Xeno Series Wiki Chrome Knife",
1394+ "url": "https://www.xenoserieswiki.org/wiki/Chrome_Knife",
1395+ "edition": "both"
1396+ },
1397+ {
1398+ "label": "Xeno Series Wiki Warrior Launchers",
1399+ "url": "https://www.xenoserieswiki.org/wiki/Warrior_Launchers",
1400+ "edition": "both"
1401+ },
1402+ {
1403+ "label": "Xeno Series Wiki Forza Encaser",
1404+ "url": "https://www.xenoserieswiki.org/wiki/Forza_Encaser",
1405+ "edition": "both"
1406+ },
1407+ {
1408+ "label": "Xeno Series Wiki Brainjack",
1409+ "url": "https://www.xenoserieswiki.org/wiki/Brainjack",
1410+ "edition": "both"
1411+ },
1412+ {
1413+ "label": "Xeno Series Wiki Servant Sacrifice dependency",
1414+ "url": "https://www.xenoserieswiki.org/wiki/Servant_Sacrifice",
1415+ "edition": "both"
1416+ },
1417+ {
1418+ "label": "Game8 Combat Bulwark",
1419+ "url": "https://game8.co/games/Xenoblade-Chronicles-X/archives/510204",
1420+ "edition": "DE"
1421+ },
1422+ {
1423+ "label": "Xeno Series Wiki Armor",
1424+ "url": "https://www.xenoserieswiki.org/wiki/Armor_(XCX)",
1425+ "edition": "both"
1426+ },
1427+ {
1428+ "label": "Xeno Series Wiki Arms Manufacturer",
1429+ "url": "https://www.xenoserieswiki.org/wiki/Arms_Manufacturer",
1430+ "edition": "both"
1431+ }
1432+ ]
1433+ },
1434+ "Liesel": {
1435+ "role": [
1436+ "Editorial AI ground role: ranged/electric combo striker with Shock, Electric Res Down, and Decoy.",
1437+ "Rôle éditorial pour l'IA au sol : attaquante combo à distance/électricité avec Shock, Electric Res Down et Decoy."
1438+ ],
1439+ "rationale": [
1440+ "Exactly two TP spenders: Trident Buster and Early Bird. Arcing Horn and Trident Buster are fixed Electric Arts. Knock 'n' Shock can inflict Shock with the existing Melee Art Arcing Horn; Conductive Strike then has a Shock provider from its rank-13 unlock, before Trident Buster arrives at rank 15. Trigger Happy supports ranged combos. Effect Charge still has an AI sequencing caveat.",
1441+ "Deux Arts consomment des PT : Trident Buster et Early Bird. Arcing Horn et Trident Buster sont des Arts Electric fixes. Knock 'n' Shock peut appliquer Shock avec l'Art mêlée Arcing Horn; Conductive Strike dispose donc d'une source de Shock dès son déblocage au rang 13, avant Trident Buster au rang 15. Trigger Happy soutient les combos à distance. Effect Charge garde une réserve sur le séquençage par l'IA."
1442+ ],
1443+ "arts": [
1444+ "Spiral Horn",
1445+ "Arcing Horn",
1446+ "Effect Charge",
1447+ "Trident Buster",
1448+ "Primer",
1449+ "Early Bird",
1450+ "Violent Streak",
1451+ "Ghostwalker"
1452+ ],
1453+ "skills": [
1454+ "Knock 'n' Shock",
1455+ "Conductive Strike",
1456+ "Trigger Happy"
1457+ ],
1458+ "artSubstitutes": [
1459+ "Sliding Slinger",
1460+ "Overwhelm",
1461+ "Raijin",
1462+ "Speed Demon",
1463+ "Executioner",
1464+ "Mind Shift",
1465+ "Combat Limbo",
1466+ "Hair Trigger"
1467+ ],
1468+ "skillSubstitutes": [
1469+ "Electric Boost",
1470+ "Quick Reload"
1471+ ],
1472+ "equipment": {
1473+ "weapons": [
1474+ "Keep Dual Guns + Javelin. Grenada's Warrior Gemels are Beam and its Chrome Parce Javelin is Physical. For an Electric weapon-damage Javelin, switch to Candid & Credible Chrome Bolide, an Electric Javelin with 156 attack at level 20. C&C unlocks after Chapter 5. Before then, Chrome Parce remains legal; Arcing Horn and Trident Buster still deal Electric because their Art attribute is fixed.",
1475+ "Garder Dual Guns + Javelin. Les Warrior Gemels Grenada sont Beam et son Javelin Chrome Parce est Physical. Pour un Javelin Electric dont les Arts à dégâts d'arme profitent de cet attribut, passer au Chrome Bolide Electric de Candid & Credible, 156 d'attaque au niveau 20. C&C se débloque après le chapitre 5. Avant, Chrome Parce reste légal; Arcing Horn et Trident Buster restent Electric car leur attribut appartient à l'Art."
1476+ ],
1477+ "armor": [
1478+ "Grenada Light Combat Norak torso, level 15: Ranged Attack Up II, Defense 13, Beam +20, Gravity −10, three trait upgrades, 19,200 credits. This matches Liesel's +30% ranged attack. Light favors attribute resistance, but has less defense. If Grenada has not reached maker rank 2, use its Medium first-set stock at rank 1 and add Ranged Attack Up in a compatible augment slot.",
1479+ "Torse Grenada Light Combat Norak, niveau 15 : Ranged Attack Up II, Defense 13, Beam +20, Gravity −10, trois améliorations de traits, 19 200 crédits. Cela correspond au +30% de ranged attack de Liesel. Light favorise les résistances d'attribut mais offre moins de défense. Si Grenada n'a pas atteint le rang fabricant 2, utiliser son stock Medium initial au rang 1 et ajouter Ranged Attack Up dans un emplacement d'augment compatible."
1480+ ],
1481+ "availability": [
1482+ "Grenada is one of the initial manufacturers; its Light line needs maker rank 2. Candid & Credible unlocks after Chapter 5; Chrome Bolide is usable from level 20. Before C&C opens, use Grenada Chrome Parce, level 20, Physical, TP Gain 120. Do not describe this fallback as an Electric weapon.",
1483+ "Grenada est disponible dès le début; sa gamme Light demande le rang fabricant 2. Candid & Credible se débloque après le chapitre 5; Chrome Bolide est utilisable dès le niveau 20. Avant l'ouverture de C&C, utiliser Grenada Chrome Parce, niveau 20, Physical, TP Gain 120. Ne pas présenter cette solution comme une arme Electric."
1484+ ]
1485+ },
1486+ "sources": [
1487+ {
1488+ "label": "Game8 Liesel Best Build",
1489+ "url": "https://game8.co/games/Xenoblade-Chronicles-X/archives/507864",
1490+ "edition": "DE"
1491+ },
1492+ {
1493+ "label": "Nintendo Life all-character builds, Liesel marked Coming soon",
1494+ "url": "https://www.nintendolife.com/guides/xenoblade-chronicles-x-best-combat-builds-for-all-characters",
1495+ "edition": "DE"
1496+ },
1497+ {
1498+ "label": "Xeno Series Wiki Liesel gameplay progression",
1499+ "url": "https://www.xenoserieswiki.org/wiki/Liesel/Gameplay",
1500+ "edition": "DE"
1501+ },
1502+ {
1503+ "label": "Xeno Series Wiki Warrior Gemels",
1504+ "url": "https://www.xenoserieswiki.org/wiki/Warrior_Gemels",
1505+ "edition": "both"
1506+ },
1507+ {
1508+ "label": "Xeno Series Wiki Chrome Parce",
1509+ "url": "https://www.xenoserieswiki.org/wiki/Chrome_Parce",
1510+ "edition": "both"
1511+ },
1512+ {
1513+ "label": "Xeno Series Wiki Chrome Bolide",
1514+ "url": "https://www.xenoserieswiki.org/wiki/Chrome_Bolide",
1515+ "edition": "both"
1516+ },
1517+ {
1518+ "label": "Xeno Series Wiki Knock 'n' Shock",
1519+ "url": "https://www.xenoserieswiki.org/wiki/Knock_%27n%27_Shock",
1520+ "edition": "both"
1521+ },
1522+ {
1523+ "label": "Xeno Series Wiki Conductive Strike",
1524+ "url": "https://www.xenoserieswiki.org/wiki/Conductive_Strike",
1525+ "edition": "both"
1526+ },
1527+ {
1528+ "label": "Xeno Series Wiki Quick Reload",
1529+ "url": "https://www.xenoserieswiki.org/wiki/Quick_Reload",
1530+ "edition": "both"
1531+ },
1532+ {
1533+ "label": "Game8 Javelin catalog",
1534+ "url": "https://game8.co/games/Xenoblade-Chronicles-X/archives/504900",
1535+ "edition": "DE"
1536+ },
1537+ {
1538+ "label": "Game8 Combat Norak",
1539+ "url": "https://game8.co/games/Xenoblade-Chronicles-X/archives/510471",
1540+ "edition": "DE"
1541+ },
1542+ {
1543+ "label": "Xeno Series Wiki Arms Manufacturer",
1544+ "url": "https://www.xenoserieswiki.org/wiki/Arms_Manufacturer",
1545+ "edition": "both"
1546+ }
1547+ ]
1548+ },
1549+ "Murderess": {
1550+ "role": [
1551+ "Editorial AI ground role: melee pressure, Stun, and defensive Aura.",
1552+ "Rôle éditorial pour l'IA au sol : pression mêlée, Stun et Aura défensive."
1553+ ],
1554+ "rationale": [
1555+ "Exactly two TP spenders: Astral Protection and Killing Machine. Keep Seventh Edge, Side Slash, Back Slash, Electric Surge, Jetstream, and Stellar Ray as non-TP Arts. Hundred Shells is the guide's third TP Art and is ordered only as a substitute; its rear-position bonus is not assumed reliable for AI.",
1556+ "Deux Arts consomment des PT : Astral Protection et Killing Machine. Garder Seventh Edge, Side Slash, Back Slash, Electric Surge, Jetstream et Stellar Ray comme Arts sans coût en PT. Hundred Shells est le troisième Art à PT du guide; il n'est qu'un substitut ordonné, et son bonus arrière n'est pas supposé fiable avec l'IA."
1557+ ],
1558+ "arts": [
1559+ "Seventh Edge",
1560+ "Side Slash",
1561+ "Back Slash",
1562+ "Electric Surge",
1563+ "Jetstream",
1564+ "Stellar Ray",
1565+ "Astral Protection",
1566+ "Killing Machine"
1567+ ],
1568+ "skills": [
1569+ "Aura Assault",
1570+ "High Tension",
1571+ "Hellhound"
1572+ ],
1573+ "artSubstitutes": [
1574+ "Lightning Cloak",
1575+ "Shadowrunner",
1576+ "Shooting Star",
1577+ "Thirsty Edge",
1578+ "Gravity Lunge",
1579+ "Hundred Shells"
1580+ ],
1581+ "skillSubstitutes": [
1582+ "Agile Gunslinger",
1583+ "Boosted Bullets",
1584+ "Mechanoid Slayer",
1585+ "Trigger Happy",
1586+ "Lifeline"
1587+ ],
1588+ "equipment": {
1589+ "weapons": [
1590+ "Keep Sakuraba Physical Dual Swords + Psycho Launchers. Murderess starts with Chrome Blades and Warrior Launchers, both Sakuraba Physical models. Electric Surge and Jetstream keep their Art damage attribute with those weapons. Upgrade within the native types.",
1591+ "Garder Dual Swords Physical + Psycho Launchers Sakuraba. Murderess commence avec Chrome Blades et Warrior Launchers, deux modèles physiques Sakuraba. Electric Surge et Jetstream gardent l'attribut de dégâts propre à l'Art avec ces armes. Améliorer les types natifs."
1592+ ],
1593+ "armor": [
1594+ "Medium Sakuraba Combat Bodywear at level 15 gives Melee Attack Up II, Defense 28, Physical +10, Gravity −15. Murderess has −5% Max HP, so use Medium as the story baseline. At level 55, Light Sakuraba Reginal Vest gives Melee Attack Up VI, Defense 57, Physical +10, Gravity −10, 360,000 credits; use it when survival is adequate.",
1595+ "Le Combat Bodywear Medium Sakuraba au niveau 15 donne Melee Attack Up II, Defense 28, Physical +10, Gravity −15. Murderess a −5% de Max HP; utiliser Medium comme base de progression. Au niveau 55, le Reginal Vest Light Sakuraba donne Melee Attack Up VI, Defense 57, Physical +10, Gravity −10, 360 000 crédits; le choisir si sa survie est suffisante."
1596+ ],
1597+ "availability": [
1598+ "Sakuraba is available from the start. Combat Bodywear is level 15 and Medium stock is maker rank 1. Reginal Vest is level 55 and Light stock needs maker rank 2. Light trades lower base defense for better attribute resistance; do not choose it solely for the higher trait rank if Murderess is being incapacitated.",
1599+ "Sakuraba est disponible dès le début. Combat Bodywear demande le niveau 15 et le stock Medium est au rang fabricant 1. Reginal Vest demande le niveau 55 et le stock Light le rang 2. Light échange une défense de base plus faible contre de meilleures résistances d'attribut; ne pas le choisir uniquement pour son trait supérieur si Murderess est mise hors combat."
1600+ ]
1601+ },
1602+ "sources": [
1603+ {
1604+ "label": "Game8 Murderess Best Build",
1605+ "url": "https://game8.co/games/Xenoblade-Chronicles-X/archives/507456",
1606+ "edition": "DE"
1607+ },
1608+ {
1609+ "label": "Nintendo Life all-character builds",
1610+ "url": "https://www.nintendolife.com/guides/xenoblade-chronicles-x-best-combat-builds-for-all-characters",
1611+ "edition": "DE"
1612+ },
1613+ {
1614+ "label": "Xeno Series Wiki Murderess gameplay progression",
1615+ "url": "https://www.xenoserieswiki.org/wiki/Murderess/Gameplay",
1616+ "edition": "both"
1617+ },
1618+ {
1619+ "label": "Xeno Series Wiki Chrome Blades",
1620+ "url": "https://www.xenoserieswiki.org/wiki/Chrome_Blades",
1621+ "edition": "both"
1622+ },
1623+ {
1624+ "label": "Xeno Series Wiki Warrior Launchers",
1625+ "url": "https://www.xenoserieswiki.org/wiki/Warrior_Launchers",
1626+ "edition": "both"
1627+ },
1628+ {
1629+ "label": "Game8 Combat Bodywear",
1630+ "url": "https://game8.co/games/Xenoblade-Chronicles-X/archives/510709",
1631+ "edition": "DE"
1632+ },
1633+ {
1634+ "label": "Game8 Reginal Vest",
1635+ "url": "https://game8.co/games/Xenoblade-Chronicles-X/archives/510523",
1636+ "edition": "DE"
1637+ },
1638+ {
1639+ "label": "Xeno Series Wiki Armor",
1640+ "url": "https://www.xenoserieswiki.org/wiki/Armor_(XCX)",
1641+ "edition": "both"
1642+ }
1643+ ]
1644+ },
1645+ "Nagi": {
1646+ "role": [
1647+ "Editorial AI ground role: durable melee striker with Physical/Thermal setup, one TP finisher, and party TP on Overdrive.",
1648+ "Rôle éditorial pour l'IA au sol : attaquant mêlée résistant avec préparation Physical/Thermal, un finisseur à PT et des PT d'équipe en Overdrive."
1649+ ],
1650+ "rationale": [
1651+ "Exactly two TP spenders: Blossom Dance and Enhanced Stand. This keeps the TP finisher and a healing Aura that supports Yamato Spirit, while dropping guide candidate Incendiary Edge as a third TP Art. Missile Volley and Burning Slash retain Thermal Res Down; Magnum Edge supports the weapon-damage melee chain. Bullet Storm fills the eighth slot without TP cost.",
1652+ "Deux Arts consomment des PT : Blossom Dance et Enhanced Stand. La barre garde le finisseur à PT et une Aura de soins qui soutient Yamato Spirit, mais écarte Incendiary Edge, troisième Art à PT du guide. Missile Volley et Burning Slash gardent la séquence Thermal Res Down; Magnum Edge soutient les Arts mêlée à dégâts d'arme. Bullet Storm remplit le huitième emplacement sans consommer de PT."
1653+ ],
1654+ "arts": [
1655+ "Rising Blade",
1656+ "True Stream Edge",
1657+ "Blossom Dance",
1658+ "Magnum Edge",
1659+ "Enhanced Stand",
1660+ "Missile Volley",
1661+ "Burning Slash",
1662+ "Bullet Storm"
1663+ ],
1664+ "skills": [
1665+ "Steel Flesh",
1666+ "Mighty Muscle",
1667+ "Yamato Spirit",
1668+ "Fortified Flesh",
1669+ "Grand Procession"
1670+ ],
1671+ "artSubstitutes": [
1672+ "Thermal Payload",
1673+ "Cool Off",
1674+ "Defensive Stance",
1675+ "Offensive Stance",
1676+ "Samurai Soul",
1677+ "Incendiary Edge"
1678+ ],
1679+ "skillSubstitutes": [
1680+ "Trauma Tension",
1681+ "Rising Renewal",
1682+ "Machine Gunner"
1683+ ],
1684+ "equipment": {
1685+ "weapons": [
1686+ "Use Physical Longsword + Gatling Gun weapon-damage lines. Sakuraba's Sword and Machine series supply these native types. Nagi starts with Physical Signature Glaive: Fledgling, whose recorded maker is Unknown, and Physical Sakuraba Ophidian Machine. His Thermal Arts already have fixed Thermal damage.",
1687+ "Utiliser des lignes d'armes Physical Longsword + Gatling Gun pour les Arts à dégâts d'arme. Les séries Sword et Machine de Sakuraba offrent ces types natifs. Nagi commence avec le Signature Glaive: Fledgling Physical, dont le fabricant est indiqué Unknown, et le Gatling Gun Ophidian Machine Physical de Sakuraba. Ses Arts Thermal ont déjà des dégâts Thermal fixes."
1688+ ],
1689+ "armor": [
1690+ "Nagi's +25% Max HP and HP Skills support Light armor once gear is strong enough. At level 55, Sakuraba Light Reginal Vest gives Melee Attack Up VI, Defense 57, Physical +10, Gravity −10, 360,000 credits. Story fallback: Medium Combat Bodywear at level 15, Melee Attack Up II, Defense 28, Physical +10, Gravity −15, 21,000 credits.",
1691+ "Le +25% de Max HP et les Skills de vie de Nagi permettent l'armure Light lorsque son équipement est assez solide. Au niveau 55, le Reginal Vest Light Sakuraba donne Melee Attack Up VI, Defense 57, Physical +10, Gravity −10, 360 000 crédits. Solution de progression : Combat Bodywear Medium niveau 15, Melee Attack Up II, Defense 28, Physical +10, Gravity −15, 21 000 crédits."
1692+ ],
1693+ "availability": [
1694+ "Sakuraba is available from the start. Combat Bodywear is level 15 and Medium stock is maker rank 1. Reginal Vest is level 55; Light stock needs maker rank 2. Light has less base defense but better attribute resistance than Heavy. Keep the Physical default Longsword if the maker's Sword stock is unavailable.",
1695+ "Sakuraba est disponible dès le début. Combat Bodywear demande le niveau 15 et le stock Medium est au rang fabricant 1. Reginal Vest demande le niveau 55; le stock Light demande le rang 2. Light offre moins de défense de base mais de meilleures résistances d'attribut que Heavy. Garder le Longsword Physical par défaut si la série Sword du fabricant n'est pas disponible."
1696+ ]
1697+ },
1698+ "sources": [
1699+ {
1700+ "label": "Game8 Nagi Best Build",
1701+ "url": "https://game8.co/games/Xenoblade-Chronicles-X/archives/513229",
1702+ "edition": "DE"
1703+ },
1704+ {
1705+ "label": "Nintendo Life all-character builds, Nagi marked Coming soon",
1706+ "url": "https://www.nintendolife.com/guides/xenoblade-chronicles-x-best-combat-builds-for-all-characters",
1707+ "edition": "DE"
1708+ },
1709+ {
1710+ "label": "Xeno Series Wiki Nagi gameplay progression",
1711+ "url": "https://www.xenoserieswiki.org/wiki/Nagi/Gameplay",
1712+ "edition": "both"
1713+ },
1714+ {
1715+ "label": "Xeno Series Wiki Signature Glaive: Fledgling",
1716+ "url": "https://www.xenoserieswiki.org/wiki/Signature_Glaive:_Fledgling",
1717+ "edition": "both"
1718+ },
1719+ {
1720+ "label": "Xeno Series Wiki Ophidian Machine",
1721+ "url": "https://www.xenoserieswiki.org/wiki/Ophidian_Machine",
1722+ "edition": "both"
1723+ },
1724+ {
1725+ "label": "Game8 Longsword catalog",
1726+ "url": "https://game8.co/games/Xenoblade-Chronicles-X/archives/504899",
1727+ "edition": "DE"
1728+ },
1729+ {
1730+ "label": "Game8 Combat Bodywear",
1731+ "url": "https://game8.co/games/Xenoblade-Chronicles-X/archives/510709",
1732+ "edition": "DE"
1733+ },
1734+ {
1735+ "label": "Game8 Reginal Vest",
1736+ "url": "https://game8.co/games/Xenoblade-Chronicles-X/archives/510523",
1737+ "edition": "DE"
1738+ },
1739+ {
1740+ "label": "Xeno Series Wiki Arms Manufacturer",
1741+ "url": "https://www.xenoserieswiki.org/wiki/Arms_Manufacturer",
1742+ "edition": "both"
1743+ }
1744+ ]
1745+ },
1746+ "Phog": {
1747+ "role": [
1748+ "AI close-range combo attacker with melee-position damage and signature Stun/Launch. Utility via Ghostwalker; one TP burst plus TP aura.",
1749+ "Attaquant IA rapproché en combos, dégâts positionnels mêlée et étourdissement/lancement signature. Ghostwalker apporte utilitaire ; burst TP et Aura TP."
1750+ ],
1751+ "rationale": [
1752+ "AI melee combo DPS; retain physical/stun signature, utility, decoy; avoid competing risky HP-drain Arts. Blood Sacrifice generates TP (no TP cost) but stays excluded: sacrificing half of current HP is risky for the AI.",
1753+ "Damage physique en combos pour l’IA ; conserver l’Art signature physique/étourdissement, utilitaire et leurre ; éviter les Arts risqués à drain de PV. Blood Sacrifice génère PT (sans coût PT) mais reste exclu : sacrifier la moitié des PV courants est risqué pour l’IA."
1754+ ],
1755+ "arts": [
1756+ "Back Slash",
1757+ "Sliding Slinger",
1758+ "Sky High",
1759+ "Side Slash",
1760+ "Shadowrunner",
1761+ "Primer",
1762+ "Ghostwalker",
1763+ "Hundred Shells"
1764+ ],
1765+ "skills": [
1766+ "Background Noise",
1767+ "Master Edge",
1768+ "Phantom Counter"
1769+ ],
1770+ "artSubstitutes": [
1771+ "Upper Hand",
1772+ "Electric Surge",
1773+ "Combat Limbo"
1774+ ],
1775+ "skillSubstitutes": [
1776+ "Agile Gunslinger",
1777+ "Steady Hand",
1778+ "Crisis Catalyst"
1779+ ],
1780+ "equipment": {
1781+ "weapons": [
1782+ "Sakuraba Industries Dual Swords (physical Blades line, e.g. Iron Blades) + Physical Dual Guns. Prioritize Ranged Attack/accuracy for ranged physical Sky High; Melee Attack applies to Dual-Sword Side Slash/Back Slash; TP stats for Shadowrunner/Hundred Shells. Candid & Credible is not asserted as a weapon alternative where its line-specific element is uncertain.",
1783+ "Dual Swords Sakuraba Industries (série physique Blades, p. ex. Iron Blades) + Dual Guns physiques. Prioriser Attaque à distance/précision pour Sky High physique à distance ; Attaque mêlée vaut pour Side Slash/Back Slash Dual Swords ; bonus PT pour Shadowrunner/Hundred Shells. Candid & Credible n’est pas présenté comme alternative d’arme, attribut par ligne incertain."
1784+ ],
1785+ "armor": [
1786+ "Sakuraba Medium Wear at AM L1: supports frontline physical role; verified DE Combat Bodywear is Medium, min L15, defense 28, Physical +10, Gravity −15, Melee Attack Up II. Candid & Credible Light is an optional AM L2 set (Screen head Potential Up; arm Max TP/Melee Attack; leg Evasion/Max TP). Heavy Combat Bulwark is optional only for defense, after C&C unlock + AM L3: L15, defense 40, Potential Up II, Electric +20, Beam −5, Gravity −15.",
1787+ "Sakuraba Medium Wear AM L1 : soutient front physique ; Combat Bodywear DE vérifié : Medium, niv. min 15, défense 28, Physique +10, Gravité −15, Melee Attack Up II. Candid & Credible Light optionnel AM L2 (Screen tête Potential Up ; bras Max TP/Melee Attack ; jambes Evasion/Max TP). Heavy Combat Bulwark seulement pour défense après déblocage C&C + AM L3 : niv.15, défense 40, Potential Up II, Electric +20, Beam −5, Gravity −15."
1788+ ],
1789+ "availability": [
1790+ "Sakuraba Medium Wear is AM L1. Sakuraba Light requires AM L2. C&C unlocks after Chapter 5; its Light/Heavy armor require AM L2/L3 respectively. Match elemental resistances on item card.",
1791+ "Sakuraba Medium Wear AM L1. Sakuraba Light exige AM L2. C&C se débloque après chapitre 5 ; armures Light/Heavy exigent AM L2/L3. Vérifier résistances élémentaires sur fiche."
1792+ ]
1793+ },
1794+ "sources": [
1795+ {
1796+ "label": "Game8 Phog Best Build; DE, 2025",
1797+ "url": "https://game8.co/games/Xenoblade-Chronicles-X/archives/507892",
1798+ "edition": "DE"
1799+ },
1800+ {
1801+ "label": "Game8 Phog Arts, Skills, recruitment; DE, 2025",
1802+ "url": "https://game8.co/games/Xenoblade-Chronicles-X/archives/500611",
1803+ "edition": "DE"
1804+ },
1805+ {
1806+ "label": "Sakuraba manufacturer offerings; weapon types/physical stability, armor traits and catalog",
1807+ "url": "https://xenoblade.fandom.com/wiki/Sakuraba_Industries",
1808+ "edition": "both"
1809+ },
1810+ {
1811+ "label": "Candid & Credible armor catalog and traits",
1812+ "url": "https://xenoblade.fandom.com/wiki/Candid_%26_Credible",
1813+ "edition": "both"
1814+ },
1815+ {
1816+ "label": "Game8 DE weapon catalog: Dual Swords",
1817+ "url": "https://game8.co/games/Xenoblade-Chronicles-X/archives/504901",
1818+ "edition": "DE"
1819+ },
1820+ {
1821+ "label": "Game8 DE weapon catalog: Dual Guns",
1822+ "url": "https://game8.co/games/Xenoblade-Chronicles-X/archives/504895",
1823+ "edition": "DE"
1824+ },
1825+ {
1826+ "label": "Game8 DE Combat Bulwark item stats and availability",
1827+ "url": "https://game8.co/games/Xenoblade-Chronicles-X/archives/510204",
1828+ "edition": "DE"
1829+ },
1830+ {
1831+ "label": "Game8 DE Sky High page: ranged Dual Guns Art and attack scaling",
1832+ "url": "https://game8.co/games/Xenoblade-Chronicles-X/archives/506135",
1833+ "edition": "DE"
1834+ }
1835+ ]
1836+ },
1837+ "Yelv": {
1838+ "role": [
1839+ "Ground Beam-melee DPS with aura, Debuff Res Down and optional Gravity Res. Do not claim Synchrony contributes on foot.",
1840+ "DPS sol Beam mêlée avec Aura, baisse résistance aux altérations et résistance gravité optionnelle. Ne pas attribuer effet au sol à Synchrony."
1841+ ],
1842+ "rationale": [
1843+ "Ground melee Beam damage with debuff and defense utility. Fixed ground Skills exclude Synchrony; Skell package/pilot bonuses stay separate.",
1844+ "Dégâts laser au corps-à-corps au sol, avec affaiblissement et utilitaire défensif. Compétences fixes sol excluent Synchrony ; packages/bénéfices Skell restent séparés."
1845+ ],
1846+ "arts": [
1847+ "Starfall Blade",
1848+ "Starfall Rondo",
1849+ "Starfall Blossom",
1850+ "Astrolibrium",
1851+ "Astral Purge",
1852+ "Gravity Cloak",
1853+ "Subterfuge",
1854+ "Galactic Cataclysm"
1855+ ],
1856+ "skills": [
1857+ "Beam Boost",
1858+ "Supreme Sword",
1859+ "Secondary Accelerator"
1860+ ],
1861+ "artSubstitutes": [
1862+ "Beam Barrage",
1863+ "Geolibrium",
1864+ "Ether Blast",
1865+ "Myopic Screen",
1866+ "Astral Heal",
1867+ "Master Gunner",
1868+ "Novalibrium"
1869+ ],
1870+ "skillSubstitutes": [
1871+ "High Tension",
1872+ "Knight's Soul",
1873+ "Inner Search"
1874+ ],
1875+ "equipment": {
1876+ "weapons": [
1877+ "Sakuraba Industries Saber series, Beam attribute. Early model: Advanced Iron Saber (Beam, ATK 40; raw item data identifies Sakuraba MakerID 1 and equipment level 3, and Game8 DE lists the model Beam). Later option: Advanced Cermet Saber (Beam, ATK 140, min L53, random enemy drop). The ordinary Iron Saber is disputed: Game8 DE lists Physical while XSW raw data says Beam; do not rely on that ordinary model. Combat Photon Saber is an automatic Beam fallback only when no weapon item is equipped, not inventory gear.",
1878+ "Série Saber Sakuraba Industries, attribut Beam. Modèle précoce : Advanced Iron Saber (Beam, ATK 40 ; données brutes: MakerID Sakuraba 1, niveau équipement 3 ; Game8 DE le liste Beam). Option tardive : Advanced Cermet Saber (Beam, ATK 140, niveau min. 53, drop ennemi aléatoire). Iron Saber ordinaire est disputé : liste Game8 DE Physical vs XSW brut Beam ; ne pas s’appuyer sur ce modèle. Combat Photon Saber est un fallback Beam automatique sans item équipé, pas équipement d’inventaire."
1879+ ],
1880+ "armor": [
1881+ "Sakuraba Medium Wear at AM L1 for early melee baseline; Light Wear at AM L2 offers Melee Attack Up/Max TP arm traits. Slot-name examples: Goggles/Bodywear/Glove/Footwear (Medium), Visor/Vest/Guard/Boots (Light).",
1882+ "Sakuraba Medium Wear AM L1 pour base mêlée précoce ; Light Wear AM L2 offre Melee Attack Up/Max TP sur bras. Noms par slot : Goggles/Bodywear/Glove/Footwear (Medium), Visor/Vest/Guard/Boots (Light)."
1883+ ],
1884+ "availability": [
1885+ "Advanced Iron Saber is listed Beam by DE Game8 and raw XSW, with MakerID 1/AM L1/equipment level 3 in raw record; exact shop/drop acquisition not verified. Advanced Cermet Saber is random enemy drop, min L53. Ordinary Iron Saber attribute conflicts between Game8 DE (Physical) and XSW raw (Beam); do not rely on it. Combat Photon Saber is auto-fallback if no weapon is equipped, not inventory gear.",
1886+ "Advanced Iron Saber est listé Beam par Game8 DE et XSW brut ; données brutes MakerID 1/AM L1/niveau équipement 3 ; acquisition boutique/drop exacte non vérifiée. Advanced Cermet Saber est un drop aléatoire, niv. min 53. Attribut de l’Iron Saber ordinaire contradictoire Game8 DE (Physical) / XSW brut (Beam) ; ne pas s’y fier. Combat Photon Saber est fallback automatique sans arme, pas item d’inventaire."
1887+ ]
1888+ },
1889+ "sources": [
1890+ {
1891+ "label": "Game8 Yelv Best Build; DE, 2025",
1892+ "url": "https://game8.co/games/Xenoblade-Chronicles-X/archives/507260",
1893+ "edition": "DE"
1894+ },
1895+ {
1896+ "label": "Sakuraba manufacturer offerings; weapon types/physical stability, armor traits",
1897+ "url": "https://xenoblade.fandom.com/wiki/Sakuraba_Industries",
1898+ "edition": "both"
1899+ },
1900+ {
1901+ "label": "Candid & Credible armor catalog and traits",
1902+ "url": "https://xenoblade.fandom.com/wiki/Candid_%26_Credible",
1903+ "edition": "both"
1904+ },
1905+ {
1906+ "label": "Game8 DE Photon Saber inventory including Beam variants",
1907+ "url": "https://game8.co/games/Xenoblade-Chronicles-X/archives/504904",
1908+ "edition": "DE"
1909+ },
1910+ {
1911+ "label": "Game8 DE Advanced Cermet Saber (Sakuraba, Beam, min level 53)",
1912+ "url": "https://game8.co/games/Xenoblade-Chronicles-X/archives/512175",
1913+ "edition": "DE"
1914+ },
1915+ {
1916+ "label": "Game8 DE Raygun inventory",
1917+ "url": "https://game8.co/games/Xenoblade-Chronicles-X/archives/504897",
1918+ "edition": "DE"
1919+ },
1920+ {
1921+ "label": "Xeno Series Wiki raw Advanced Iron Saber game record",
1922+ "url": "https://www.xenoserieswiki.org/w/index.php?title=Advanced_Iron_Saber&action=raw",
1923+ "edition": "both"
1924+ },
1925+ {
1926+ "label": "XSW raw Iron Saber weapon record (Beam; conflicts with DE Game8 list)",
1927+ "url": "https://www.xenoserieswiki.org/w/index.php?title=Iron_Saber&action=raw",
1928+ "edition": "both"
1929+ },
1930+ {
1931+ "label": "XSW Photon Saber model/attribute table",
1932+ "url": "https://xenoblade.fandom.com/wiki/Photon_Saber",
1933+ "edition": "both"
1934+ }
1935+ ]
1936+ },
1937+ "Mia": {
1938+ "role": [
1939+ "Ranged ether/gravity debuffer-support; clears party debuffs, boosts Ether resistance, Topples, applies Debuff Res Down, damage while Aura active.",
1940+ "Soutien-affaiblissement Éther/Gravité à distance ; purifie les altérations alliées, augmente résistance Éther, renverse, réduit résistances aux altérations, dégâts sous Aura."
1941+ ],
1942+ "rationale": [
1943+ "Ranged support/debuffer with Topple, enemy debuff-resistance reduction, party cleanse/resistance, and aura-supported damage.",
1944+ "Soutien/affaiblissement à distance avec Chute, baisse de résistance aux altérations, purification/résistance d’équipe et dégâts renforcés par Aura."
1945+ ],
1946+ "arts": [
1947+ "Full Specs",
1948+ "Gravity Cloak",
1949+ "Subterfuge",
1950+ "Gravity Blast",
1951+ "Beam Barrage",
1952+ "Myopic Screen",
1953+ "Clarity Ray",
1954+ "Beam Bomber"
1955+ ],
1956+ "skills": [
1957+ "Tactical Analyst",
1958+ "Ether Boost",
1959+ "Inner Search"
1960+ ],
1961+ "artSubstitutes": [
1962+ "Black Butterfly",
1963+ "Screamer",
1964+ "Pathogen Blast"
1965+ ],
1966+ "skillSubstitutes": [
1967+ "Resistant Flesh",
1968+ "Gravity Boost",
1969+ "Beam Boost"
1970+ ],
1971+ "equipment": {
1972+ "weapons": [
1973+ "Meredith & Co. Ether Radius Raygun + Ether Pugio Knife. Matches Raygun/Knife slots and Ether damage/boost rationale; item model/level variants follow player/AM progression. For temporary shortage, use currently available same-type Raygun/Knife, but do not call it an Ether replacement.",
1974+ "Raygun Ether Radius + Knife Ether Pugio Meredith & Co. : types Raygun/Knife et justification dégâts/boost Éther ; modèle/variantes de niveau suivent progression joueur/fabricant. En attendant, utiliser Raygun/Knife disponible même type, sans le qualifier d’alternative Éther."
1975+ ],
1976+ "armor": [
1977+ "Meredith & Co. Medium Wear at AM L1 (Chapter 4 manufacturer unlock); its armor uses Ether tech/resistance. Light Wear at AM L2 adds Potential Up head, Max TP/ranged-attack arm options and Max TP legs; names: Vitra/Corpus/Chiro/Plantars (Medium), Vizard/Vestis/Armilla/Ocreis (Light).",
1978+ "Meredith & Co. Medium Wear AM L1 (fabricant débloqué chapitre 4), armure technologie/résistance Éther. Light Wear AM L2 ajoute Potentiel tête, options Max TP/Attaque distance aux bras, Max TP jambes ; noms : Vitra/Corpus/Chiro/Plantars (Medium), Vizard/Vestis/Armilla/Ocreis (Light)."
1979+ ],
1980+ "availability": [
1981+ "Meredith unlocks Chapter 4; Medium armor AM L1. Meredith Light requires AM L2. C&C optional later: Chapter 5 + Light AM L2. Armor level still must not exceed Mia’s current level.",
1982+ "Meredith débloqué chapitre 4 ; armure Medium AM L1. Meredith Light exige AM L2. C&C optionnel ensuite : chapitre 5 + Light AM L2. Niveau armure ne doit pas dépasser niveau actuel de Mia."
1983+ ]
1984+ },
1985+ "sources": [
1986+ {
1987+ "label": "Game8 Mia Best Build; DE, 2025",
1988+ "url": "https://game8.co/games/Xenoblade-Chronicles-X/archives/514627",
1989+ "edition": "DE"
1990+ },
1991+ {
1992+ "label": "Nintendo Life character builds (DE article; Mia consensus summary from search results, article full text unavailable to reader)",
1993+ "url": "https://www.nintendolife.com/guides/xenoblade-chronicles-x-best-combat-builds-for-all-characters",
1994+ "edition": "DE"
1995+ },
1996+ {
1997+ "label": "Sakuraba manufacturer offerings; weapon types/physical stability and armor traits",
1998+ "url": "https://xenoblade.fandom.com/wiki/Sakuraba_Industries",
1999+ "edition": "both"
2000+ },
2001+ {
2002+ "label": "Candid & Credible armor catalog and traits",
2003+ "url": "https://xenoblade.fandom.com/wiki/Candid_%26_Credible",
2004+ "edition": "both"
2005+ },
2006+ {
2007+ "label": "Game8 DE Raygun inventory and attribute options",
2008+ "url": "https://game8.co/games/Xenoblade-Chronicles-X/archives/504897",
2009+ "edition": "DE"
2010+ },
2011+ {
2012+ "label": "Game8 DE Knife inventory and attribute options",
2013+ "url": "https://game8.co/games/Xenoblade-Chronicles-X/archives/504903",
2014+ "edition": "DE"
2015+ },
2016+ {
2017+ "label": "Meredith & Co. Ether weapon program and Chapter 4 unlock",
2018+ "url": "https://xenoblade.fandom.com/wiki/Meredith_%26_Co.",
2019+ "edition": "both"
2020+ },
2021+ {
2022+ "label": "Raygun Ether Radius and Knife Ether Pugio model tables",
2023+ "url": "https://xenoblade.fandom.com/wiki/Raygun",
2024+ "edition": "both"
2025+ },
2026+ {
2027+ "label": "Game8 DE C&C armor item stats/weight example",
2028+ "url": "https://game8.co/games/Xenoblade-Chronicles-X/archives/510204",
2029+ "edition": "DE"
2030+ }
2031+ ]
2032+ },
2033+ "Neilnail": {
2034+ "role": [
2035+ "AI hybrid frontline: side/rear melee, Ether damage, Stun and increased allied Blaze/Shock damage, sustain aura.",
2036+ "Hybride de première ligne IA : mêlée côté/arrière, dégâts Éther, Étourdissement, dégâts Feu/Électrocution alliés accrus, Aura de maintien."
2037+ ],
2038+ "rationale": [
2039+ "AI frontline Ether hybrid: side/rear damage, team Blaze/Shock amplification and Astral Protection sustain. Inner Search boosts Potential (TP Art damage and Soul Voice healing) without requiring an Aura; omit Aura Assault since it unlocks before the chosen Astral Protection and is conditional on an active Aura, leaving ranks 9–10 inert.",
2040+ "Hybride Éther IA : dégâts côté/arrière, amplification alliée Feu/Électrocution et maintien Astral Protection. Inner Search augmente Potentiel (dégâts des Arts PT et soin Soul Voice) sans Aura ; omettre Aura Assault, débloqué avant Astral Protection et conditionnel à Aura active, afin d’éviter des rangs 9–10 inertes."
2041+ ],
2042+ "arts": [
2043+ "Side Slash",
2044+ "Back Slash",
2045+ "Electric Surge",
2046+ "Jetstream",
2047+ "Conduction Rise",
2048+ "Shooting Star",
2049+ "Astral Protection",
2050+ "Hundred Shells"
2051+ ],
2052+ "skills": [
2053+ "Ether Boost",
2054+ "Knight's Soul",
2055+ "Supreme Sword",
2056+ "Inner Search"
2057+ ],
2058+ "artSubstitutes": [
2059+ "Shadowrunner",
2060+ "Stellar Ray",
2061+ "Lightning Cloak",
2062+ "Heroic Tale",
2063+ "Upper Hand"
2064+ ],
2065+ "skillSubstitutes": [
2066+ "Fast Forward"
2067+ ],
2068+ "equipment": {
2069+ "weapons": [
2070+ "Meredith & Co. Ether Ruina II Psycho Launchers + Sakuraba physical Dual Swords (e.g. Iron Blades family). Matches Psycho Launchers + Dual Swords and Ether/weapon Arts. Meridian catalog uses Ether technology; actual AM level/weapon stock gates exact series.",
2071+ "Psycho Launchers Ether Ruina II Meredith & Co. + Dual Swords physiques Sakuraba (p. ex. série Iron Blades). Correspond aux Psycho Launchers + Dual Swords et Arts Éther/arme. Technologie Meredith à Éther ; niveau AM/stock peut verrouiller série exacte."
2072+ ],
2073+ "armor": [
2074+ "Meredith & Co. Medium Wear at AM L1; Ether-resistance profile fits Ether frontline. Light at AM L2 supplies Ether Res Up/Max TP/Ranged Attack Boost options; slot names Vitra/Corpus/Chiro/Plantars (Medium), Vizard/Vestis/Armilla/Ocreis (Light).",
2075+ "Meredith & Co. Medium Wear AM L1 ; profil résistance Éther convient front Éther. Light AM L2 fournit options Ether Res Up/Max TP/Ranged Attack Boost ; Vitra/Corpus/Chiro/Plantars (Medium), Vizard/Vestis/Armilla/Ocreis (Light)."
2076+ ],
2077+ "availability": [
2078+ "Meredith unlocks Chapter 4; its Medium armor is AM L1 and Light is L2. C&C is a later alternative (Chapter 5; Light AM L2). Armor level/stock still follow player and AM progression.",
2079+ "Meredith débloqué chapitre 4 ; armure Medium AM L1, Light AM L2. C&C est alternative ultérieure (chapitre 5 ; Light AM L2). Niveau/stock selon progression joueur/fabricant."
2080+ ]
2081+ },
2082+ "sources": [
2083+ {
2084+ "label": "Game8 Neilnail Best Build; DE, 2025",
2085+ "url": "https://game8.co/games/Xenoblade-Chronicles-X/archives/507640",
2086+ "edition": "DE"
2087+ },
2088+ {
2089+ "label": "Sakuraba manufacturer offerings; weapon type catalog/armor traits",
2090+ "url": "https://xenoblade.fandom.com/wiki/Sakuraba_Industries",
2091+ "edition": "both"
2092+ },
2093+ {
2094+ "label": "Candid & Credible Psycho Launchers/Electric weapon and armor catalog",
2095+ "url": "https://xenoblade.fandom.com/wiki/Candid_%26_Credible",
2096+ "edition": "both"
2097+ },
2098+ {
2099+ "label": "Game8 DE Psycho Launchers inventory and Arts",
2100+ "url": "https://game8.co/games/Xenoblade-Chronicles-X/archives/504898",
2101+ "edition": "DE"
2102+ },
2103+ {
2104+ "label": "Game8 DE Dual Swords inventory",
2105+ "url": "https://game8.co/games/Xenoblade-Chronicles-X/archives/504901",
2106+ "edition": "DE"
2107+ },
2108+ {
2109+ "label": "Meredith & Co. Ether weapon program and Chapter 4 unlock",
2110+ "url": "https://xenoblade.fandom.com/wiki/Meredith_%26_Co.",
2111+ "edition": "both"
2112+ },
2113+ {
2114+ "label": "Psycho Launcher Ruina II (Meredith) and Ether attribute table",
2115+ "url": "https://xenoblade.fandom.com/wiki/Psycho_Launchers",
2116+ "edition": "both"
2117+ },
2118+ {
2119+ "label": "XSW Aura Assault Skill source: requires equipped Aura",
2120+ "url": "https://www.xenoserieswiki.org/w/index.php?title=Aura_Assault&action=raw",
2121+ "edition": "both"
2122+ },
2123+ {
2124+ "label": "XSW Inner Search Skill data: Potential improves TP Arts and Soul Voice healing",
2125+ "url": "https://www.xenoserieswiki.org/w/index.php?title=Inner_Search&action=raw",
2126+ "edition": "both"
2127+ },
2128+ {
2129+ "label": "Game8 DE Aura Assault conditional Skill guidance",
2130+ "url": "https://game8.co/games/Xenoblade-Chronicles-X/archives/503868",
2131+ "edition": "DE"
2132+ }
2133+ ]
2134+ },
2135+ "Al": {
2136+ "role": [
2137+ "High-risk melee attacker and party support: Howling Soul provides party buffs/revive; no self-sustain, so retain Steel Flesh and healer synergy.",
2138+ "Attaquant mêlée à risque et soutien d’équipe : Howling Soul buff/résurrection ; aucune autonomie de soin, conserver Steel Flesh et synergie avec soigneur."
2139+ ],
2140+ "rationale": [
2141+ "Melee burst/support; Howling Soul team buff/revive, low-HP Hercules Blow with defensive Skill and ranged utility.",
2142+ "Burst mêlée/soutien ; buff/résurrection Howling Soul, Hercules Blow à faible PV, compétence défensive et utilitaire à distance."
2143+ ],
2144+ "arts": [
2145+ "Hawkeye",
2146+ "Tornado Blade",
2147+ "Offensive Stance",
2148+ "Hercules Blow",
2149+ "Eagle Eye",
2150+ "Sidewinder",
2151+ "Intercept",
2152+ "Howling Soul"
2153+ ],
2154+ "skills": [
2155+ "Steel Flesh",
2156+ "Mighty Muscle",
2157+ "Healing Touch",
2158+ "Grand Procession"
2159+ ],
2160+ "artSubstitutes": [
2161+ "Rising Blade",
2162+ "First Down",
2163+ "Magnum Edge",
2164+ "Burning Slash",
2165+ "Shrapnel"
2166+ ],
2167+ "skillSubstitutes": [
2168+ "Quick Reload",
2169+ "Conflagrant Edge",
2170+ "Boosted Bullets",
2171+ "Dismantler"
2172+ ],
2173+ "equipment": {
2174+ "weapons": [
2175+ "Sakuraba Industries Longsword, verified Iron Sword: Physical, level 1, 48 attack, 2.0 s cooldown, 230 TP gain, shop price 3000. Fits melee Arts and requires no late manufacturer unlock. Sakuraba Sniper Rifle physical line for Eagle Eye/Sidewinder/Intercept; exact model not singled out. Do not recommend unverified Thermal Glaive/Six Stars.",
2176+ "Longsword Sakuraba Industries, modèle vérifié Iron Sword : Physical, niveau 1, attaque 48, recharge 2,0 s, gain PT 230, prix boutique 3000. Convient Arts mêlée sans déblocage fabricant tardif. Ligne Sniper Rifle physique Sakuraba pour Eagle Eye/Sidewinder/Intercept ; modèle exact non choisi. Ne pas recommander Glaive thermique/Six Stars non vérifié."
2177+ ],
2178+ "armor": [
2179+ "Sakuraba Medium Wear at AM L1. Verified DE Combat Bodywear: Medium, min L15, defense 28, Physical +10, Gravity −15, Melee Attack Up II; suits melee damage and physical frontline. Light Wear at AM L2 offers arm Melee Attack Up/Max TP alternatives. C&C Heavy Combat Bulwark is a defensive option only at C&C AM L3: L15, defense 40, Potential Up II, Electric +20, Beam −5, Gravity −15.",
2180+ "Sakuraba Medium Wear AM L1. Combat Bodywear DE vérifié : Medium, niv. min 15, défense 28, Physique +10, Gravité −15, Melee Attack Up II ; convient dégâts mêlée/front physique. Light Wear AM L2 offre bras Melee Attack Up/Max TP. C&C Heavy Combat Bulwark option défensive uniquement C&C AM L3 : niv.15, défense 40, Potential Up II, Electric +20, Beam −5, Gravity −15."
2181+ ],
2182+ "availability": [
2183+ "Iron Sword shop-purchasable min level 1. Sakuraba Medium armor AM L1; Light AM L2. C&C Heavy alternative requires Chapter 5 and AM L3. No Thermal/Six Stars model remains in final recommendation.",
2184+ "Iron Sword boutique niveau min 1. Armure Sakuraba Medium AM L1 ; Light AM L2. Alternative C&C Heavy exige chapitre 5 et AM L3. Aucun modèle Thermal/Six Stars dans recommandation finale."
2185+ ]
2186+ },
2187+ "sources": [
2188+ {
2189+ "label": "Game8 Al Best Build; DE, 2025",
2190+ "url": "https://game8.co/games/Xenoblade-Chronicles-X/archives/515373",
2191+ "edition": "DE"
2192+ },
2193+ {
2194+ "label": "Sakuraba manufacturer offerings; weapon type catalog/armor traits",
2195+ "url": "https://xenoblade.fandom.com/wiki/Sakuraba_Industries",
2196+ "edition": "both"
2197+ },
2198+ {
2199+ "label": "Candid & Credible armor alternative catalog/traits",
2200+ "url": "https://xenoblade.fandom.com/wiki/Candid_%26_Credible",
2201+ "edition": "both"
2202+ },
2203+ {
2204+ "label": "Game8 DE Iron Sword (Sakuraba, Physical, min level 1)",
2205+ "url": "https://game8.co/games/Xenoblade-Chronicles-X/archives/511408",
2206+ "edition": "DE"
2207+ },
2208+ {
2209+ "label": "Game8 DE Longsword list",
2210+ "url": "https://game8.co/games/Xenoblade-Chronicles-X/archives/504899",
2211+ "edition": "DE"
2212+ },
2213+ {
2214+ "label": "Game8 DE Sniper Rifle list",
2215+ "url": "https://game8.co/games/Xenoblade-Chronicles-X/archives/504894",
2216+ "edition": "DE"
2217+ },
2218+ {
2219+ "label": "Candid & Credible Heavy Wear armor alternative and stats",
2220+ "url": "https://game8.co/games/Xenoblade-Chronicles-X/archives/510204",
2221+ "edition": "DE"
2222+ }
2223+ ]
2224+ }
2225+};
modified src/data/i18n.ts +26 -2
@@ -68,6 +68,14 @@ export interface Copy {
6868 amRecommended: string;
6969 recommendedUpgrade: string;
7070 planReasons: string;
71+ researchedBuild: string;
72+ curatedRationale: string;
73+ curatedEquipment: string;
74+ equipmentWeapons: string;
75+ equipmentArmor: string;
76+ equipmentAvailability: string;
77+ progressionSubstitutes: string;
78+ curatedSources: string;
7179 skellSection: string;
7280 skellFrame: string;
7381 skellAlternatives: string;
@@ -155,6 +163,14 @@ export const copy: Record<Lang, Copy> = {
155163 amRecommended: "RECOMMENDED AM",
156164 recommendedUpgrade: "Recommended BP upgrade level (canonical max: 5) — heuristic from selection priority and squad level",
157165 planReasons: "PLAN REASONS",
166+ researchedBuild: "RESEARCHED BUILD",
167+ curatedRationale: "Build rationale",
168+ curatedEquipment: "Researched equipment advice",
169+ equipmentWeapons: "Arms manufacturers",
170+ equipmentArmor: "Armor",
171+ equipmentAvailability: "Availability & alternatives",
172+ progressionSubstitutes: "Progression substitutes",
173+ curatedSources: "Sources",
158174 skellSection: "SKELL",
159175 skellFrame: "FRAME",
160176 skellAlternatives: "Alternatives",
@@ -167,7 +183,7 @@ export const copy: Record<Lang, Copy> = {
167183 skellNoLicense: "No frame is recommended without the Skell License.",
168184 skellLowLevel: "No frame is recommended before pilot level 20.",
169185 methodTitle: "Scope and method",
170- methodBody: "Contextual scores enforce level, rank, weapon, and slot constraints before comparing role balance, offense, safety, progression, Skell aptitude, and a moderate community prior. Results are explainable progression-safe recommendations—not universal clear guarantees. Signature Arts appear only when enabled and always show a regular-Art fallback; equipment advice names AMs, stats, traits, and augment families without inventing owned gear.",
186+ methodBody: "Contextual scores enforce level, rank, weapon, and slot constraints before comparing teams. Companion scores use their equipped, fixed builds, with ordered progression substitutes and at most two TP-consuming Arts. Cross's Signature Arts require the unlock option and show a regular-Art fallback. Equipment advice includes sources and availability limits; editorial choices are not universal best builds.",
171187 footerTagline: "© 2026 BLADE Team Architect. Unofficial fan project, not affiliated with, endorsed by, or sponsored by Nintendo or MONOLITHSOFT. Xenoblade Chronicles and related names, characters, and assets belong to their respective rights holders.",
172188 rankDown: "Decrease rank",
173189 rankUp: "Increase rank",
@@ -240,6 +256,14 @@ export const copy: Record<Lang, Copy> = {
240256 amRecommended: "AM RECOMMANDÉ",
241257 recommendedUpgrade: "Niveau d'amélioration BP recommandé (maximum canonique : 5) — heuristique selon la priorité du plan et le niveau d'escouade",
242258 planReasons: "RAISONS DU PLAN",
259+ researchedBuild: "BUILD DOCUMENTÉ",
260+ curatedRationale: "Justification du build",
261+ curatedEquipment: "Conseils d'équipement documentés",
262+ equipmentWeapons: "Fabricants d'armes",
263+ equipmentArmor: "Armure",
264+ equipmentAvailability: "Disponibilité et alternatives",
265+ progressionSubstitutes: "Substituts de progression",
266+ curatedSources: "Sources",
243267 skellSection: "SKELL",
244268 skellFrame: "CHÂSSIS",
245269 skellAlternatives: "Alternatives",
@@ -252,7 +276,7 @@ export const copy: Record<Lang, Copy> = {
252276 skellNoLicense: "Aucun châssis n’est recommandé sans la Licence Skell.",
253277 skellLowLevel: "Aucun châssis n’est recommandé avant le niveau de pilote 20.",
254278 methodTitle: "Portée et méthode",
255- methodBody: "Les scores contextuels appliquent d'abord les contraintes de niveau, rang, armes et slots, puis comparent équilibre des rôles, offense, sécurité, progression, aptitude Skell et un a priori communautaire modéré. Ce sont des recommandations explicables et sûres pour la progression, pas des garanties universelles. Les Arts signature n'apparaissent que si activés et affichent toujours un Art régulier de remplacement ; les conseils d'équipement nomment AM, stats, traits et familles d'augments sans inventer l'inventaire possédé.",
279+ methodBody: "Les scores contextuels respectent les contraintes de niveau, rang, armes et emplacements avant de comparer les équipes. Les compagnons sont évalués sur leur build fixe équipé, avec des remplacements de progression ordonnés et au plus deux Arts consommant des PT. Les Arts signature de Cross nécessitent l'option de déblocage et indiquent un Art régulier de remplacement. Les conseils d'équipement précisent leurs sources et leurs limites de disponibilité ; les choix éditoriaux ne sont pas des builds universellement optimaux.",
256280 footerTagline: "© 2026 BLADE Team Architect. Projet de fans non officiel, sans affiliation, approbation ni parrainage de Nintendo ou MONOLITHSOFT. Xenoblade Chronicles ainsi que les noms, personnages et éléments associés appartiennent à leurs ayants droit respectifs.",
257281 rankDown: "Diminuer le rang",
258282 rankUp: "Augmenter le rang",
@@ -68,6 +68,14 @@ export interface Copy {
68 amRecommended: string;68 amRecommended: string;
69 recommendedUpgrade: string;69 recommendedUpgrade: string;
70 planReasons: string;70 planReasons: string;
71+ researchedBuild: string;
72+ curatedRationale: string;
73+ curatedEquipment: string;
74+ equipmentWeapons: string;
75+ equipmentArmor: string;
76+ equipmentAvailability: string;
77+ progressionSubstitutes: string;
78+ curatedSources: string;
71 skellSection: string;79 skellSection: string;
72 skellFrame: string;80 skellFrame: string;
73 skellAlternatives: string;81 skellAlternatives: string;
@@ -155,6 +163,14 @@ export const copy: Record<Lang, Copy> = {
155 amRecommended: "RECOMMENDED AM",163 amRecommended: "RECOMMENDED AM",
156 recommendedUpgrade: "Recommended BP upgrade level (canonical max: 5) — heuristic from selection priority and squad level",164 recommendedUpgrade: "Recommended BP upgrade level (canonical max: 5) — heuristic from selection priority and squad level",
157 planReasons: "PLAN REASONS",165 planReasons: "PLAN REASONS",
166+ researchedBuild: "RESEARCHED BUILD",
167+ curatedRationale: "Build rationale",
168+ curatedEquipment: "Researched equipment advice",
169+ equipmentWeapons: "Arms manufacturers",
170+ equipmentArmor: "Armor",
171+ equipmentAvailability: "Availability & alternatives",
172+ progressionSubstitutes: "Progression substitutes",
173+ curatedSources: "Sources",
158 skellSection: "SKELL",174 skellSection: "SKELL",
159 skellFrame: "FRAME",175 skellFrame: "FRAME",
160 skellAlternatives: "Alternatives",176 skellAlternatives: "Alternatives",
@@ -167,7 +183,7 @@ export const copy: Record<Lang, Copy> = {
167 skellNoLicense: "No frame is recommended without the Skell License.",183 skellNoLicense: "No frame is recommended without the Skell License.",
168 skellLowLevel: "No frame is recommended before pilot level 20.",184 skellLowLevel: "No frame is recommended before pilot level 20.",
169 methodTitle: "Scope and method",185 methodTitle: "Scope and method",
170- methodBody: "Contextual scores enforce level, rank, weapon, and slot constraints before comparing role balance, offense, safety, progression, Skell aptitude, and a moderate community prior. Results are explainable progression-safe recommendations—not universal clear guarantees. Signature Arts appear only when enabled and always show a regular-Art fallback; equipment advice names AMs, stats, traits, and augment families without inventing owned gear.",186+ methodBody: "Contextual scores enforce level, rank, weapon, and slot constraints before comparing teams. Companion scores use their equipped, fixed builds, with ordered progression substitutes and at most two TP-consuming Arts. Cross's Signature Arts require the unlock option and show a regular-Art fallback. Equipment advice includes sources and availability limits; editorial choices are not universal best builds.",
171 footerTagline: "© 2026 BLADE Team Architect. Unofficial fan project, not affiliated with, endorsed by, or sponsored by Nintendo or MONOLITHSOFT. Xenoblade Chronicles and related names, characters, and assets belong to their respective rights holders.",187 footerTagline: "© 2026 BLADE Team Architect. Unofficial fan project, not affiliated with, endorsed by, or sponsored by Nintendo or MONOLITHSOFT. Xenoblade Chronicles and related names, characters, and assets belong to their respective rights holders.",
172 rankDown: "Decrease rank",188 rankDown: "Decrease rank",
173 rankUp: "Increase rank",189 rankUp: "Increase rank",
@@ -240,6 +256,14 @@ export const copy: Record<Lang, Copy> = {
240 amRecommended: "AM RECOMMANDÉ",256 amRecommended: "AM RECOMMANDÉ",
241 recommendedUpgrade: "Niveau d'amélioration BP recommandé (maximum canonique : 5) — heuristique selon la priorité du plan et le niveau d'escouade",257 recommendedUpgrade: "Niveau d'amélioration BP recommandé (maximum canonique : 5) — heuristique selon la priorité du plan et le niveau d'escouade",
242 planReasons: "RAISONS DU PLAN",258 planReasons: "RAISONS DU PLAN",
259+ researchedBuild: "BUILD DOCUMENTÉ",
260+ curatedRationale: "Justification du build",
261+ curatedEquipment: "Conseils d'équipement documentés",
262+ equipmentWeapons: "Fabricants d'armes",
263+ equipmentArmor: "Armure",
264+ equipmentAvailability: "Disponibilité et alternatives",
265+ progressionSubstitutes: "Substituts de progression",
266+ curatedSources: "Sources",
243 skellSection: "SKELL",267 skellSection: "SKELL",
244 skellFrame: "CHÂSSIS",268 skellFrame: "CHÂSSIS",
245 skellAlternatives: "Alternatives",269 skellAlternatives: "Alternatives",
@@ -252,7 +276,7 @@ export const copy: Record<Lang, Copy> = {
252 skellNoLicense: "Aucun châssis n’est recommandé sans la Licence Skell.",276 skellNoLicense: "Aucun châssis n’est recommandé sans la Licence Skell.",
253 skellLowLevel: "Aucun châssis n’est recommandé avant le niveau de pilote 20.",277 skellLowLevel: "Aucun châssis n’est recommandé avant le niveau de pilote 20.",
254 methodTitle: "Portée et méthode",278 methodTitle: "Portée et méthode",
255- methodBody: "Les scores contextuels appliquent d'abord les contraintes de niveau, rang, armes et slots, puis comparent équilibre des rôles, offense, sécurité, progression, aptitude Skell et un a priori communautaire modéré. Ce sont des recommandations explicables et sûres pour la progression, pas des garanties universelles. Les Arts signature n'apparaissent que si activés et affichent toujours un Art régulier de remplacement ; les conseils d'équipement nomment AM, stats, traits et familles d'augments sans inventer l'inventaire possédé.",279+ methodBody: "Les scores contextuels respectent les contraintes de niveau, rang, armes et emplacements avant de comparer les équipes. Les compagnons sont évalués sur leur build fixe équipé, avec des remplacements de progression ordonnés et au plus deux Arts consommant des PT. Les Arts signature de Cross nécessitent l'option de déblocage et indiquent un Art régulier de remplacement. Les conseils d'équipement précisent leurs sources et leurs limites de disponibilité ; les choix éditoriaux ne sont pas des builds universellement optimaux.",
256 footerTagline: "© 2026 BLADE Team Architect. Projet de fans non officiel, sans affiliation, approbation ni parrainage de Nintendo ou MONOLITHSOFT. Xenoblade Chronicles ainsi que les noms, personnages et éléments associés appartiennent à leurs ayants droit respectifs.",280 footerTagline: "© 2026 BLADE Team Architect. Projet de fans non officiel, sans affiliation, approbation ni parrainage de Nintendo ou MONOLITHSOFT. Xenoblade Chronicles ainsi que les noms, personnages et éléments associés appartiennent à leurs ayants droit respectifs.",
257 rankDown: "Diminuer le rang",281 rankDown: "Diminuer le rang",
258 rankUp: "Augmenter le rang",282 rankUp: "Augmenter le rang",
modified src/lib/contextualEngine.test.ts +16 -85
@@ -1,6 +1,6 @@
11 import assert from "node:assert/strict";
22 import test from "node:test";
3-import artEffectsData from "@/research/art-effects.json";
3+import artEffectsData from "@/src/data/art-effects.json";
44 import { companionByName, companions } from "@/src/data/companions";
55 import {
66 evaluateCompanionContext,
@@ -8,7 +8,7 @@ import {
88 recommendContextualSkellLoadout,
99 recommendContextualTeams,
1010 } from "@/src/lib/contextualEngine";
11-import { classRanksForActiveClass, editClassRank } from "@/src/lib/engine";
11+import { classRanksForActiveClass, editClassRank, planCompanion } from "@/src/lib/engine";
1212 import type {
1313 ClassRanks,
1414 CombatMode,
@@ -58,13 +58,11 @@ function essentialRoleCoverage(
5858 selectedName,
5959 effectiveLevel,
6060 20,
61- combatMode,
6261 ).roles;
6362 const replacement = evaluateCompanionContext(
6463 replacementName,
6564 effectiveLevel,
6665 20,
67- combatMode,
6866 ).roles;
6967 const keys = combatMode === "skell"
7068 ? [...REPLACEMENT_ROLE_KEYS, "skell" as const]
@@ -224,39 +222,7 @@ test("a primary slot alternative maximizes the mono-substitution team score", ()
224222 assert.equal(primary.team.slots[slotIndex].alternativeName, scored[0]?.name);
225223 });
226224
227-test("guide consensus softly breaks a mechanically near-tied primary team", () => {
228- const activeClassId = "galactic-knight";
229- const result = recommendContextualTeams(request({
230- activeClassId,
231- avatarLevel: 30,
232- classRanks: ranksFor(activeClassId),
233- }));
234-
235- assert.equal(result.kind, "success");
236- if (result.kind !== "success") return;
237- assert.ok(result.recommendations[0].team.names.includes("Irina"));
238- assert.ok(result.recommendations[0].team.names.includes("H.B."));
239- assert.ok(result.recommendations[0].score.community >= 9);
240-});
241225
242-test("Skell specialists omit alternatives when no credible pilot remains", () => {
243- const activeClassId = "mastermind";
244- const result = recommendContextualTeams(request({
245- activeClassId,
246- avatarLevel: 30,
247- classRanks: ranksFor(activeClassId),
248- combatMode: "skell",
249- }));
250-
251- assert.equal(result.kind, "success");
252- if (result.kind !== "success") return;
253- const primary = result.recommendations[0];
254- for (const name of ["Alexa", "Yelv"]) {
255- const slotIndex = primary.team.names.indexOf(name);
256- assert.notEqual(slotIndex, -1);
257- assert.equal(primary.team.slots[slotIndex].alternativeName, undefined);
258- }
259-});
260226
261227 test("visible contextual scores retain spread below the ten-point ceiling", () => {
262228 const result = recommendContextualTeams(request());
@@ -350,8 +316,8 @@ test("manual companions remain fixed in every contextual alternative", () => {
350316 });
351317
352318 test("slot rank changes the companion's contextual progression and role profile", () => {
353- const lowRank = evaluateCompanionContext("Irina", 50, 3, "general");
354- const maxRank = evaluateCompanionContext("Irina", 50, 20, "general");
319+ const lowRank = evaluateCompanionContext("Irina", 50, 3);
320+ const maxRank = evaluateCompanionContext("Irina", 50, 20);
355321
356322 assert.ok(lowRank.progression < maxRank.progression);
357323 assert.ok(lowRank.roles.support < maxRank.roles.support);
@@ -468,25 +434,11 @@ test("independent weapon overrides rebuild Cross and contextual recommendations"
468434 assert.deepEqual(result.recommendations[0].roster[0].weapons, mixed.weapons);
469435 });
470436
471-test("General exposes Skell aptitude and Skell mode equips relevant Skills", () => {
472- const generalYelv = evaluateCompanionContext("Yelv", 50, 20, "general");
473- const skellYelv = evaluateCompanionContext("Yelv", 50, 20, "skell");
474- assert.ok(generalYelv.roles.skell > 0);
475- assert.equal(generalYelv.roles.skell, skellYelv.roles.skell);
476-
477- const result = recommendContextualTeams(request({ combatMode: "skell" }));
478- assert.equal(result.kind, "success");
479- if (result.kind !== "success") return;
480-
481- const primary = result.recommendations[0];
482- assert.ok(
483- primary.team.names.some((name) => name === "Alexa" || name === "Yelv"),
484- );
485- assert.ok(primary.score.skell > 0);
486- const skellPilots = primary.roster.filter((member) =>
487- member.skills.some((skill) => skill.name === "Synchrony" || skill.name === "Stellar Entry"),
488- );
489- assert.ok(skellPilots.length > 0);
437+test("Skell aptitude only reflects equipped pilot Skills, not unlocked reserves", () => {
438+ const yelv = planCompanion("Yelv", 50, 20);
439+ assert.ok(!yelv.skills.some((skill) => skill.name === "Synchrony"));
440+ const profile = evaluateCompanionContext("Yelv", 50, 20);
441+ assert.equal(profile.roles.skell, 0);
490442 });
491443
492444 test("General mode keeps Skell aptitude as a minor tie-breaker", () => {
@@ -532,36 +484,15 @@ test("licensed General teams retain baseline Skell utility without pilot Skills"
532484 assert.equal(withoutLicense.recommendations[0].score.skell, 0);
533485 });
534486
535-test("General Skell score has no aptitude dead zone above the licensed baseline", () => {
536- const baseline = recommendContextualTeams(request({
537- slots: ["H.B.", "Irina", "Lin"],
538- hasSkellLicense: true,
539- }));
540- const stellarEntry = recommendContextualTeams(request({
541- slots: ["H.B.", "Irina", "Doug"],
542- hasSkellLicense: true,
543- }));
544- const synchrony = recommendContextualTeams(request({
545- slots: ["H.B.", "Irina", "Alexa"],
487+test("Skell teams without equipped pilot Skills retain only licensed baseline", () => {
488+ const result = recommendContextualTeams(request({
489+ slots: ["Yelv", "Lin", "Irina"],
490+ combatMode: "skell",
546491 hasSkellLicense: true,
547492 }));
548-
549- assert.equal(baseline.kind, "success");
550- assert.equal(stellarEntry.kind, "success");
551- assert.equal(synchrony.kind, "success");
552- if (
553- baseline.kind !== "success"
554- || stellarEntry.kind !== "success"
555- || synchrony.kind !== "success"
556- ) return;
557-
558- const baselineScore = baseline.recommendations[0].score.skell;
559- const stellarEntryScore = stellarEntry.recommendations[0].score.skell;
560- const synchronyScore = synchrony.recommendations[0].score.skell;
561- assert.equal(baselineScore, 1);
562- assert.ok(stellarEntryScore > baselineScore);
563- assert.ok(synchronyScore > stellarEntryScore);
564- assert.ok(synchronyScore > 5);
493+ assert.equal(result.kind, "success");
494+ if (result.kind !== "success") return;
495+ assert.equal(result.recommendations[0].score.skell, 1);
565496 });
566497
567498 test("contextual Skill upgrade recommendations never exceed level 5", () => {
@@ -1,6 +1,6 @@
1 import assert from "node:assert/strict";1 import assert from "node:assert/strict";
2 import test from "node:test";2 import test from "node:test";
3-import artEffectsData from "@/research/art-effects.json";3+import artEffectsData from "@/src/data/art-effects.json";
4 import { companionByName, companions } from "@/src/data/companions";4 import { companionByName, companions } from "@/src/data/companions";
5 import {5 import {
6 evaluateCompanionContext,6 evaluateCompanionContext,
@@ -8,7 +8,7 @@ import {
8 recommendContextualSkellLoadout,8 recommendContextualSkellLoadout,
9 recommendContextualTeams,9 recommendContextualTeams,
10 } from "@/src/lib/contextualEngine";10 } from "@/src/lib/contextualEngine";
11-import { classRanksForActiveClass, editClassRank } from "@/src/lib/engine";11+import { classRanksForActiveClass, editClassRank, planCompanion } from "@/src/lib/engine";
12 import type {12 import type {
13 ClassRanks,13 ClassRanks,
14 CombatMode,14 CombatMode,
@@ -58,13 +58,11 @@ function essentialRoleCoverage(
58 selectedName,58 selectedName,
59 effectiveLevel,59 effectiveLevel,
60 20,60 20,
61- combatMode,
62 ).roles;61 ).roles;
63 const replacement = evaluateCompanionContext(62 const replacement = evaluateCompanionContext(
64 replacementName,63 replacementName,
65 effectiveLevel,64 effectiveLevel,
66 20,65 20,
67- combatMode,
68 ).roles;66 ).roles;
69 const keys = combatMode === "skell"67 const keys = combatMode === "skell"
70 ? [...REPLACEMENT_ROLE_KEYS, "skell" as const]68 ? [...REPLACEMENT_ROLE_KEYS, "skell" as const]
@@ -224,39 +222,7 @@ test("a primary slot alternative maximizes the mono-substitution team score", ()
224 assert.equal(primary.team.slots[slotIndex].alternativeName, scored[0]?.name);222 assert.equal(primary.team.slots[slotIndex].alternativeName, scored[0]?.name);
225 });223 });
226 224
227-test("guide consensus softly breaks a mechanically near-tied primary team", () => {
228- const activeClassId = "galactic-knight";
229- const result = recommendContextualTeams(request({
230- activeClassId,
231- avatarLevel: 30,
232- classRanks: ranksFor(activeClassId),
233- }));
234-
235- assert.equal(result.kind, "success");
236- if (result.kind !== "success") return;
237- assert.ok(result.recommendations[0].team.names.includes("Irina"));
238- assert.ok(result.recommendations[0].team.names.includes("H.B."));
239- assert.ok(result.recommendations[0].score.community >= 9);
240-});
241 225
242-test("Skell specialists omit alternatives when no credible pilot remains", () => {
243- const activeClassId = "mastermind";
244- const result = recommendContextualTeams(request({
245- activeClassId,
246- avatarLevel: 30,
247- classRanks: ranksFor(activeClassId),
248- combatMode: "skell",
249- }));
250-
251- assert.equal(result.kind, "success");
252- if (result.kind !== "success") return;
253- const primary = result.recommendations[0];
254- for (const name of ["Alexa", "Yelv"]) {
255- const slotIndex = primary.team.names.indexOf(name);
256- assert.notEqual(slotIndex, -1);
257- assert.equal(primary.team.slots[slotIndex].alternativeName, undefined);
258- }
259-});
260 226
261 test("visible contextual scores retain spread below the ten-point ceiling", () => {227 test("visible contextual scores retain spread below the ten-point ceiling", () => {
262 const result = recommendContextualTeams(request());228 const result = recommendContextualTeams(request());
@@ -350,8 +316,8 @@ test("manual companions remain fixed in every contextual alternative", () => {
350 });316 });
351 317
352 test("slot rank changes the companion's contextual progression and role profile", () => {318 test("slot rank changes the companion's contextual progression and role profile", () => {
353- const lowRank = evaluateCompanionContext("Irina", 50, 3, "general");319+ const lowRank = evaluateCompanionContext("Irina", 50, 3);
354- const maxRank = evaluateCompanionContext("Irina", 50, 20, "general");320+ const maxRank = evaluateCompanionContext("Irina", 50, 20);
355 321
356 assert.ok(lowRank.progression < maxRank.progression);322 assert.ok(lowRank.progression < maxRank.progression);
357 assert.ok(lowRank.roles.support < maxRank.roles.support);323 assert.ok(lowRank.roles.support < maxRank.roles.support);
@@ -468,25 +434,11 @@ test("independent weapon overrides rebuild Cross and contextual recommendations"
468 assert.deepEqual(result.recommendations[0].roster[0].weapons, mixed.weapons);434 assert.deepEqual(result.recommendations[0].roster[0].weapons, mixed.weapons);
469 });435 });
470 436
471-test("General exposes Skell aptitude and Skell mode equips relevant Skills", () => {437+test("Skell aptitude only reflects equipped pilot Skills, not unlocked reserves", () => {
472- const generalYelv = evaluateCompanionContext("Yelv", 50, 20, "general");438+ const yelv = planCompanion("Yelv", 50, 20);
473- const skellYelv = evaluateCompanionContext("Yelv", 50, 20, "skell");439+ assert.ok(!yelv.skills.some((skill) => skill.name === "Synchrony"));
474- assert.ok(generalYelv.roles.skell > 0);440+ const profile = evaluateCompanionContext("Yelv", 50, 20);
475- assert.equal(generalYelv.roles.skell, skellYelv.roles.skell);441+ assert.equal(profile.roles.skell, 0);
476-
477- const result = recommendContextualTeams(request({ combatMode: "skell" }));
478- assert.equal(result.kind, "success");
479- if (result.kind !== "success") return;
480-
481- const primary = result.recommendations[0];
482- assert.ok(
483- primary.team.names.some((name) => name === "Alexa" || name === "Yelv"),
484- );
485- assert.ok(primary.score.skell > 0);
486- const skellPilots = primary.roster.filter((member) =>
487- member.skills.some((skill) => skill.name === "Synchrony" || skill.name === "Stellar Entry"),
488- );
489- assert.ok(skellPilots.length > 0);
490 });442 });
491 443
492 test("General mode keeps Skell aptitude as a minor tie-breaker", () => {444 test("General mode keeps Skell aptitude as a minor tie-breaker", () => {
@@ -532,36 +484,15 @@ test("licensed General teams retain baseline Skell utility without pilot Skills"
532 assert.equal(withoutLicense.recommendations[0].score.skell, 0);484 assert.equal(withoutLicense.recommendations[0].score.skell, 0);
533 });485 });
534 486
535-test("General Skell score has no aptitude dead zone above the licensed baseline", () => {487+test("Skell teams without equipped pilot Skills retain only licensed baseline", () => {
536- const baseline = recommendContextualTeams(request({488+ const result = recommendContextualTeams(request({
537- slots: ["H.B.", "Irina", "Lin"],489+ slots: ["Yelv", "Lin", "Irina"],
538- hasSkellLicense: true,490+ combatMode: "skell",
539- }));
540- const stellarEntry = recommendContextualTeams(request({
541- slots: ["H.B.", "Irina", "Doug"],
542- hasSkellLicense: true,
543- }));
544- const synchrony = recommendContextualTeams(request({
545- slots: ["H.B.", "Irina", "Alexa"],
546 hasSkellLicense: true,491 hasSkellLicense: true,
547 }));492 }));
548-493+ assert.equal(result.kind, "success");
549- assert.equal(baseline.kind, "success");494+ if (result.kind !== "success") return;
550- assert.equal(stellarEntry.kind, "success");495+ assert.equal(result.recommendations[0].score.skell, 1);
551- assert.equal(synchrony.kind, "success");
552- if (
553- baseline.kind !== "success"
554- || stellarEntry.kind !== "success"
555- || synchrony.kind !== "success"
556- ) return;
557-
558- const baselineScore = baseline.recommendations[0].score.skell;
559- const stellarEntryScore = stellarEntry.recommendations[0].score.skell;
560- const synchronyScore = synchrony.recommendations[0].score.skell;
561- assert.equal(baselineScore, 1);
562- assert.ok(stellarEntryScore > baselineScore);
563- assert.ok(synchronyScore > stellarEntryScore);
564- assert.ok(synchronyScore > 5);
565 });496 });
566 497
567 test("contextual Skill upgrade recommendations never exceed level 5", () => {498 test("contextual Skill upgrade recommendations never exceed level 5", () => {
modified src/lib/contextualEngine.ts +5 -96
@@ -1,4 +1,4 @@
1-import artEffectsData from "@/research/art-effects.json";
1+import artEffectsData from "@/src/data/art-effects.json";
22 import { buildStrategies } from "@/src/data/builds";
33 import { companions, companionByName } from "@/src/data/companions";
44 import {
@@ -397,105 +397,20 @@ function companionProgression(plan: CompanionPlan): number {
397397 return (artFill + skillFill) / 2;
398398 }
399399
400-function firstSourceUrl(citation: string): string {
401- const match = citation.match(/https?:\/\/[^\s)]+/);
402- return match?.[0] ?? citation;
403-}
404-
405-function planCompanionForMode(
406- name: string,
407- effectiveLevel: number,
408- personalRank: number,
409- combatMode: CombatMode,
410- lang: Lang,
411-): CompanionPlan {
412- const plan = planCompanion(name, effectiveLevel, personalRank, lang);
413- if (combatMode !== "skell") return plan;
414- const companion = companionByName.get(name);
415- if (!companion) return plan;
416- const selectedByName = new Map(plan.skills.map((skill) => [skill.name, skill]));
417- const skellSkills = companion.skills
418- .filter((skill) =>
419- skill.rank <= plan.personalRank && (skillRoleSignals[skill.name]?.skell ?? 0) > 0,
420- )
421- .sort((left, right) =>
422- (skillRoleSignals[right.name]?.skell ?? 0)
423- - (skillRoleSignals[left.name]?.skell ?? 0)
424- || left.rank - right.rank,
425- )
426- .map((skill): SkillSelection =>
427- selectedByName.get(skill.name) ?? {
428- name: skill.name,
429- unlockRank: skill.rank,
430- recommendedLevel: 1,
431- source: {
432- kind: "companion",
433- id: companion.name,
434- url: firstSourceUrl(companion.source),
435- citation: companion.source,
436- },
437- reason: translated(
438- lang,
439- "Equipped because this Skill is active in Skell combat",
440- "Équipé car ce Skill est actif en combat Skell",
441- ),
442- }
443- );
444- if (skellSkills.length === 0) return plan;
445- const seen = new Set<string>();
446- const skills = [...skellSkills, ...plan.skills]
447- .filter((skill) => {
448- if (seen.has(skill.name)) return false;
449- seen.add(skill.name);
450- return true;
451- })
452- .slice(0, plan.skillSlots)
453- .map((skill, index) => ({
454- ...skill,
455- recommendedLevel: preferredUpgradeLevel(index, effectiveLevel),
456- }));
457- return {
458- ...plan,
459- skills,
460- planReasons: [
461- ...plan.planReasons,
462- translated(
463- lang,
464- "Skell-active Skills replace ground-only preferences in Skell mode",
465- "Les Skills actifs en Skell remplacent les préférences terrestres en mode Skell",
466- ),
467- ],
468- };
469-}
470400
471401 export function evaluateCompanionContext(
472402 name: string,
473403 effectiveLevel: number,
474404 personalRank: number,
475- combatMode: CombatMode,
476405 ): CompanionContextEvaluation {
477- const plan = planCompanionForMode(
478- name,
479- effectiveLevel,
480- personalRank,
481- combatMode,
482- "en",
483- );
406+ const plan = planCompanion(name, effectiveLevel, personalRank, "en");
484407 const progression = companionProgression(plan);
485408 const roles = rolesFromSelections(
486409 plan.capabilities,
487- plan.potentialArts,
410+ plan.arts,
488411 plan.skills,
489412 progression,
490413 );
491- const companion = companionByName.get(name);
492- const availableSkellAptitude = (companion?.skills ?? [])
493- .filter((skill) => skill.rank <= plan.personalRank)
494- .reduce(
495- (total, skill) => total + (skillRoleSignals[skill.name]?.skell ?? 0),
496- 0,
497- );
498- if (combatMode === "general") roles.skell = availableSkellAptitude;
499414 return {
500415 name,
501416 personalRank: plan.personalRank,
@@ -664,6 +579,7 @@ function buildRoster(
664579 strategy: plan.strategy,
665580 dominantAttribute: buildStrategies[plan.strategy].dominantAttribute,
666581 note: plan.note,
582+ curatedBuild: plan.curatedBuild,
667583 planReasons: plan.planReasons,
668584 source: plan.source,
669585 });
@@ -938,13 +854,7 @@ export function recommendContextualTeams(
938854 const key = `${slotIndex}:${name}`;
939855 let plan = planCache.get(key);
940856 if (!plan) {
941- plan = planCompanionForMode(
942- name,
943- level,
944- request.personalRanks[slotIndex],
945- request.combatMode,
946- lang,
947- );
857+ plan = planCompanion(name, level, request.personalRanks[slotIndex], lang);
948858 planCache.set(key, plan);
949859 }
950860 return plan;
@@ -960,7 +870,6 @@ export function recommendContextualTeams(
960870 name,
961871 level,
962872 request.personalRanks[slotIndex],
963- request.combatMode,
964873 );
965874 profileCache.set(key, profile);
966875 }
@@ -1,4 +1,4 @@
1-import artEffectsData from "@/research/art-effects.json";1+import artEffectsData from "@/src/data/art-effects.json";
2 import { buildStrategies } from "@/src/data/builds";2 import { buildStrategies } from "@/src/data/builds";
3 import { companions, companionByName } from "@/src/data/companions";3 import { companions, companionByName } from "@/src/data/companions";
4 import {4 import {
@@ -397,105 +397,20 @@ function companionProgression(plan: CompanionPlan): number {
397 return (artFill + skillFill) / 2;397 return (artFill + skillFill) / 2;
398 }398 }
399 399
400-function firstSourceUrl(citation: string): string {
401- const match = citation.match(/https?:\/\/[^\s)]+/);
402- return match?.[0] ?? citation;
403-}
404-
405-function planCompanionForMode(
406- name: string,
407- effectiveLevel: number,
408- personalRank: number,
409- combatMode: CombatMode,
410- lang: Lang,
411-): CompanionPlan {
412- const plan = planCompanion(name, effectiveLevel, personalRank, lang);
413- if (combatMode !== "skell") return plan;
414- const companion = companionByName.get(name);
415- if (!companion) return plan;
416- const selectedByName = new Map(plan.skills.map((skill) => [skill.name, skill]));
417- const skellSkills = companion.skills
418- .filter((skill) =>
419- skill.rank <= plan.personalRank && (skillRoleSignals[skill.name]?.skell ?? 0) > 0,
420- )
421- .sort((left, right) =>
422- (skillRoleSignals[right.name]?.skell ?? 0)
423- - (skillRoleSignals[left.name]?.skell ?? 0)
424- || left.rank - right.rank,
425- )
426- .map((skill): SkillSelection =>
427- selectedByName.get(skill.name) ?? {
428- name: skill.name,
429- unlockRank: skill.rank,
430- recommendedLevel: 1,
431- source: {
432- kind: "companion",
433- id: companion.name,
434- url: firstSourceUrl(companion.source),
435- citation: companion.source,
436- },
437- reason: translated(
438- lang,
439- "Equipped because this Skill is active in Skell combat",
440- "Équipé car ce Skill est actif en combat Skell",
441- ),
442- }
443- );
444- if (skellSkills.length === 0) return plan;
445- const seen = new Set<string>();
446- const skills = [...skellSkills, ...plan.skills]
447- .filter((skill) => {
448- if (seen.has(skill.name)) return false;
449- seen.add(skill.name);
450- return true;
451- })
452- .slice(0, plan.skillSlots)
453- .map((skill, index) => ({
454- ...skill,
455- recommendedLevel: preferredUpgradeLevel(index, effectiveLevel),
456- }));
457- return {
458- ...plan,
459- skills,
460- planReasons: [
461- ...plan.planReasons,
462- translated(
463- lang,
464- "Skell-active Skills replace ground-only preferences in Skell mode",
465- "Les Skills actifs en Skell remplacent les préférences terrestres en mode Skell",
466- ),
467- ],
468- };
469-}
470 400
471 export function evaluateCompanionContext(401 export function evaluateCompanionContext(
472 name: string,402 name: string,
473 effectiveLevel: number,403 effectiveLevel: number,
474 personalRank: number,404 personalRank: number,
475- combatMode: CombatMode,
476 ): CompanionContextEvaluation {405 ): CompanionContextEvaluation {
477- const plan = planCompanionForMode(406+ const plan = planCompanion(name, effectiveLevel, personalRank, "en");
478- name,
479- effectiveLevel,
480- personalRank,
481- combatMode,
482- "en",
483- );
484 const progression = companionProgression(plan);407 const progression = companionProgression(plan);
485 const roles = rolesFromSelections(408 const roles = rolesFromSelections(
486 plan.capabilities,409 plan.capabilities,
487- plan.potentialArts,410+ plan.arts,
488 plan.skills,411 plan.skills,
489 progression,412 progression,
490 );413 );
491- const companion = companionByName.get(name);
492- const availableSkellAptitude = (companion?.skills ?? [])
493- .filter((skill) => skill.rank <= plan.personalRank)
494- .reduce(
495- (total, skill) => total + (skillRoleSignals[skill.name]?.skell ?? 0),
496- 0,
497- );
498- if (combatMode === "general") roles.skell = availableSkellAptitude;
499 return {414 return {
500 name,415 name,
501 personalRank: plan.personalRank,416 personalRank: plan.personalRank,
@@ -664,6 +579,7 @@ function buildRoster(
664 strategy: plan.strategy,579 strategy: plan.strategy,
665 dominantAttribute: buildStrategies[plan.strategy].dominantAttribute,580 dominantAttribute: buildStrategies[plan.strategy].dominantAttribute,
666 note: plan.note,581 note: plan.note,
582+ curatedBuild: plan.curatedBuild,
667 planReasons: plan.planReasons,583 planReasons: plan.planReasons,
668 source: plan.source,584 source: plan.source,
669 });585 });
@@ -938,13 +854,7 @@ export function recommendContextualTeams(
938 const key = `${slotIndex}:${name}`;854 const key = `${slotIndex}:${name}`;
939 let plan = planCache.get(key);855 let plan = planCache.get(key);
940 if (!plan) {856 if (!plan) {
941- plan = planCompanionForMode(857+ plan = planCompanion(name, level, request.personalRanks[slotIndex], lang);
942- name,
943- level,
944- request.personalRanks[slotIndex],
945- request.combatMode,
946- lang,
947- );
948 planCache.set(key, plan);858 planCache.set(key, plan);
949 }859 }
950 return plan;860 return plan;
@@ -960,7 +870,6 @@ export function recommendContextualTeams(
960 name,870 name,
961 level,871 level,
962 request.personalRanks[slotIndex],872 request.personalRanks[slotIndex],
963- request.combatMode,
964 );873 );
965 profileCache.set(key, profile);874 profileCache.set(key, profile);
966 }875 }
modified src/lib/engine.test.ts +10 -10
@@ -15,7 +15,7 @@ import {
1515 recommendSkellLoadout,
1616 resolveTeam,
1717 } from "@/src/lib/engine";
18-import artEffectsData from "@/research/art-effects.json";
18+import artEffectsData from "@/src/data/art-effects.json";
1919
2020 const tpCostingArtNames: Record<string, true> = {};
2121 for (const art of artEffectsData.arts as { name: string; effects: { tp: boolean } }[]) {
@@ -207,17 +207,17 @@ test("mixed team selection preserves manual slots and fills only AUTO slots", ()
207207 test("companion loadout follows personal rank and fixed slot cap", () => {
208208 const lin = planCompanion("Lin", 20, 3);
209209
210- assert.deepEqual(lin.arts.map((art) => art.name), [
211- "Wild Down",
212- "Wild Smash",
213- "Flame Cloak",
214- "Fire Carnival",
215- ]);
210+ const learned = companions.find((companion) => companion.name === "Lin")!.arts;
211+ assert.ok(lin.arts.length > 0 && lin.arts.length <= 8);
212+ assert.ok(lin.arts.every((art) =>
213+ learned.some((fact) => fact.name === art.name && fact.rank <= lin.personalRank)
214+ && (art.weapon === lin.weapons.ranged || art.weapon === lin.weapons.melee)));
216215 assert.equal(lin.skills.length, 0);
217216 assert.equal(lin.skillSlots, 3);
217+ assert.ok(planCompanion("Lin", 20, 20).skills.length > lin.skills.length);
218218 });
219219
220-test("avatar and companion loadouts respect the TP budget", () => {
220+test("Cross retains its three-TP policy while companions never exceed two", () => {
221221 const plan = planAvatar("galactic-knight", { "galactic-knight": 10 }, undefined, "en", 50);
222222 const galacticTpArts = plan.arts.filter((art) => tpCostingArtNames[art.name]);
223223 assert.ok(
@@ -230,8 +230,8 @@ test("avatar and companion loadouts respect the TP budget", () => {
230230 const doug = planCompanion("Doug", 20, 50);
231231 const dougTpArts = doug.arts.filter((art) => tpCostingArtNames[art.name]);
232232 assert.ok(
233- dougTpArts.length <= 3,
234- `expected <=3 TP-costing Arts, got ${dougTpArts.length}: ${dougTpArts.map((art) => art.name).join(", ")}`,
233+ dougTpArts.length <= 2,
234+ `expected <=2 TP-costing Arts, got ${dougTpArts.length}: ${dougTpArts.map((art) => art.name).join(", ")}`,
235235 );
236236 });
237237
@@ -15,7 +15,7 @@ import {
15 recommendSkellLoadout,15 recommendSkellLoadout,
16 resolveTeam,16 resolveTeam,
17 } from "@/src/lib/engine";17 } from "@/src/lib/engine";
18-import artEffectsData from "@/research/art-effects.json";18+import artEffectsData from "@/src/data/art-effects.json";
19 19
20 const tpCostingArtNames: Record<string, true> = {};20 const tpCostingArtNames: Record<string, true> = {};
21 for (const art of artEffectsData.arts as { name: string; effects: { tp: boolean } }[]) {21 for (const art of artEffectsData.arts as { name: string; effects: { tp: boolean } }[]) {
@@ -207,17 +207,17 @@ test("mixed team selection preserves manual slots and fills only AUTO slots", ()
207 test("companion loadout follows personal rank and fixed slot cap", () => {207 test("companion loadout follows personal rank and fixed slot cap", () => {
208 const lin = planCompanion("Lin", 20, 3);208 const lin = planCompanion("Lin", 20, 3);
209 209
210- assert.deepEqual(lin.arts.map((art) => art.name), [210+ const learned = companions.find((companion) => companion.name === "Lin")!.arts;
211- "Wild Down",211+ assert.ok(lin.arts.length > 0 && lin.arts.length <= 8);
212- "Wild Smash",212+ assert.ok(lin.arts.every((art) =>
213- "Flame Cloak",213+ learned.some((fact) => fact.name === art.name && fact.rank <= lin.personalRank)
214- "Fire Carnival",214+ && (art.weapon === lin.weapons.ranged || art.weapon === lin.weapons.melee)));
215- ]);
216 assert.equal(lin.skills.length, 0);215 assert.equal(lin.skills.length, 0);
217 assert.equal(lin.skillSlots, 3);216 assert.equal(lin.skillSlots, 3);
217+ assert.ok(planCompanion("Lin", 20, 20).skills.length > lin.skills.length);
218 });218 });
219 219
220-test("avatar and companion loadouts respect the TP budget", () => {220+test("Cross retains its three-TP policy while companions never exceed two", () => {
221 const plan = planAvatar("galactic-knight", { "galactic-knight": 10 }, undefined, "en", 50);221 const plan = planAvatar("galactic-knight", { "galactic-knight": 10 }, undefined, "en", 50);
222 const galacticTpArts = plan.arts.filter((art) => tpCostingArtNames[art.name]);222 const galacticTpArts = plan.arts.filter((art) => tpCostingArtNames[art.name]);
223 assert.ok(223 assert.ok(
@@ -230,8 +230,8 @@ test("avatar and companion loadouts respect the TP budget", () => {
230 const doug = planCompanion("Doug", 20, 50);230 const doug = planCompanion("Doug", 20, 50);
231 const dougTpArts = doug.arts.filter((art) => tpCostingArtNames[art.name]);231 const dougTpArts = doug.arts.filter((art) => tpCostingArtNames[art.name]);
232 assert.ok(232 assert.ok(
233- dougTpArts.length <= 3,233+ dougTpArts.length <= 2,
234- `expected <=3 TP-costing Arts, got ${dougTpArts.length}: ${dougTpArts.map((art) => art.name).join(", ")}`,234+ `expected <=2 TP-costing Arts, got ${dougTpArts.length}: ${dougTpArts.map((art) => art.name).join(", ")}`,
235 );235 );
236 });236 });
237 237
modified src/lib/engine.ts +148 -80
@@ -1,8 +1,9 @@
11 import { buildStrategies, classStrategy, companionSelectionPriority } from "@/src/data/builds";
22 import { classes } from "@/src/data/classes";
33 import { companionByName, companions } from "@/src/data/companions";
4+import { companionBuilds } from "@/src/data/companionBuilds";
45 import { classProgression, classProgressionById } from "@/src/data/progression";
5-import artEffectsData from "@/research/art-effects.json";
6+import artEffectsData from "@/src/data/art-effects.json";
67 import {
78 frameStats,
89 licenseFrame,
@@ -22,6 +23,8 @@ import type {
2223 ClassEntry,
2324 ClassRanks,
2425 CompanionPlan,
26+ CuratedCompanionBuild,
27+ CompanionUnlockFact,
2528 Lang,
2629 LocalizedText,
2730 RosterMember,
@@ -329,6 +332,7 @@ function compareNumericScore(left: readonly number[], right: readonly number[]):
329332 }
330333
331334 export const TP_ART_BUDGET = 3;
335+const COMPANION_TP_ART_BUDGET = 2;
332336
333337 const tpCostingArtNames: Record<string, true> = {};
334338 for (const art of artEffectsData.arts as { name: string; effects: { tp: boolean } }[]) {
@@ -558,83 +562,150 @@ export function planAvatar(
558562 };
559563 }
560564
561-function selectCompanionArts(
562- companion: (typeof companions)[number],
563- personalRank: number,
564- lang: Lang,
565- level: number,
566-): { arts: ArtSelection[]; potentialArts: ArtSelection[]; trimmedTpArts: number } {
567- const strategy = buildStrategies[companion.strategy];
568- const ranked = companion.arts
569- .filter((art) => art.rank <= personalRank)
570- .slice()
571- .sort((left, right) =>
572- preferenceIndex(left.name, companion.defaultArts)
573- - preferenceIndex(right.name, companion.defaultArts)
574- || preferenceIndex(left.name, strategy.preferredArts)
575- - preferenceIndex(right.name, strategy.preferredArts)
576- || compareText(left.name, right.name)
577- || left.rank - right.rank);
578- const toSelection = (art: (typeof companion.arts)[number], index: number): ArtSelection => {
579- const defaultAt = preferenceIndex(art.name, companion.defaultArts);
580- const preferredAt = preferenceIndex(art.name, strategy.preferredArts);
581- return {
582- name: art.name,
583- unlockRank: art.rank,
584- recommendedLevel: recommendedUpgradeLevel(index, level),
585- source: {
586- kind: "companion",
587- id: companion.name,
588- url: firstSourceUrl(companion.source),
589- citation: companion.source,
590- },
591- reason: defaultAt < companion.defaultArts.length
592- ? translated(lang, `Canonical default Art #${defaultAt + 1}`, `Art par défaut canonique n°${defaultAt + 1}`)
593- : preferredAt < strategy.preferredArts.length
594- ? translated(lang, `Strategy preference #${preferredAt + 1}`, `Préférence stratégique n°${preferredAt + 1}`)
595- : translated(lang, `Unlocked at personal rank ${art.rank}`, `Débloqué au rang personnel ${art.rank}`),
596- };
565+type CuratedChoice = { name: string; rank: number; replaces?: string };
566+
567+function selectCuratedChoices(
568+ canonical: readonly string[],
569+ substitutes: readonly string[],
570+ facts: readonly CompanionUnlockFact[],
571+ rank: number,
572+ limit: number,
573+ costOf: (name: string) => number,
574+): { choices: CuratedChoice[]; unavailable: { name: string; rank: number; replacement?: string }[] } {
575+ if (canonical.length > limit) throw new Error("Curated build exceeds available ability slots");
576+ const selected = new Set<string>();
577+ const choices: Array<CuratedChoice | undefined> = new Array(canonical.length);
578+ const unavailable: { name: string; rank: number; replacement?: string }[] = [];
579+ let spent = 0;
580+ const trySelect = (name: string, replaces?: string): CuratedChoice | undefined => {
581+ const fact = facts.find((entry) => entry.name === name);
582+ if (!fact) throw new Error(`Curated ability ${name} is absent from companion unlocks`);
583+ if (fact.rank > rank || selected.has(name)) return undefined;
584+ const cost = costOf(name);
585+ if (spent + cost > COMPANION_TP_ART_BUDGET) return undefined;
586+ spent += cost;
587+ selected.add(name);
588+ return { name, rank: fact.rank, replaces };
597589 };
598- const { selected, trimmedTpArts } = applyTpArtBudget(ranked, (art) => art.name);
599- return {
600- arts: selected.map(toSelection),
601- potentialArts: ranked.slice(0, 8).map(toSelection),
602- trimmedTpArts,
590+
591+ for (let index = 0; index < canonical.length; index += 1) {
592+ choices[index] = trySelect(canonical[index]);
593+ }
594+ let substituteIndex = 0;
595+ const nextSubstitute = (replaces?: string): CuratedChoice | undefined => {
596+ while (substituteIndex < substitutes.length) {
597+ const choice = trySelect(substitutes[substituteIndex], replaces);
598+ substituteIndex += 1;
599+ if (choice) return choice;
600+ }
601+ return undefined;
603602 };
603+ for (let index = 0; index < choices.length; index += 1) {
604+ if (choices[index]) continue;
605+ const name = canonical[index];
606+ const fact = facts.find((entry) => entry.name === name);
607+ if (!fact) throw new Error(`Curated ability ${name} is absent from companion unlocks`);
608+ const replacement = nextSubstitute(name);
609+ choices[index] = replacement;
610+ unavailable.push({ name, rank: fact.rank, replacement: replacement?.name });
611+ }
612+ const result = choices.filter((choice): choice is CuratedChoice => choice !== undefined);
613+ while (result.length < limit) {
614+ const filler = nextSubstitute();
615+ if (!filler) break;
616+ result.push(filler);
617+ }
618+ return { choices: result, unavailable };
604619 }
605620
606-function selectCompanionSkills(
621+const companionArtEffects = new Map(
622+ (artEffectsData.arts as { name: string; weapon: string; url: string; effects: { tp: boolean } }[])
623+ .map((art) => [art.name, art]),
624+);
625+
626+function companionArtCost(name: string, companion: (typeof companions)[number]): number {
627+ const art = companionArtEffects.get(name);
628+ if (!art) throw new Error(`Missing verified Art facts for ${name}`);
629+ if (art.weapon !== companion.ranged && art.weapon !== companion.melee) {
630+ throw new Error(`${companion.name} cannot equip ${name} (${art.weapon})`);
631+ }
632+ return art.effects.tp ? 1 : 0;
633+}
634+
635+function companionProgressionReasons(
636+ lang: Lang,
637+ unavailable: readonly { name: string; rank: number; replacement?: string }[],
638+ personalRank: number,
639+): string[] {
640+ return unavailable.map(({ name, rank, replacement }) => translated(
641+ lang,
642+ `${name} ${rank > personalRank ? `unlocks at personal rank ${rank}` : `exceeds the ${COMPANION_TP_ART_BUDGET}-TP Art limit`}; ${replacement ? `${replacement} equipped instead` : "no legal progression substitute available"}`,
643+ `${name} ${rank > personalRank ? `se débloque au rang personnel ${rank}` : `dépasse la limite de ${COMPANION_TP_ART_BUDGET} Arts à PT`}; ${replacement ? `${replacement} équipé à la place` : "aucun substitut de progression légal disponible"}`,
644+ ));
645+}
646+
647+function selectCompanionArts(
607648 companion: (typeof companions)[number],
649+ build: CuratedCompanionBuild,
608650 personalRank: number,
609651 lang: Lang,
610652 level: number,
611-): SkillSelection[] {
612- const preferences = buildStrategies[companion.strategy].preferredSkills;
613- return companion.skills
614- .filter((skill) => skill.rank <= personalRank)
615- .slice()
616- .sort((left, right) =>
617- preferenceIndex(left.name, preferences) - preferenceIndex(right.name, preferences)
618- || compareText(left.name, right.name)
619- || left.rank - right.rank)
620- .slice(0, companion.skillSlots)
621- .map((skill, index) => {
622- const preferredAt = preferenceIndex(skill.name, preferences);
653+): { arts: ArtSelection[]; reasons: string[] } {
654+ const { choices, unavailable } = selectCuratedChoices(
655+ build.arts, build.artSubstitutes, companion.arts, personalRank, 8,
656+ (name) => companionArtCost(name, companion),
657+ );
658+ return {
659+ arts: choices.map(({ name, rank, replaces }, index): ArtSelection => {
660+ const effect = companionArtEffects.get(name)!;
623661 return {
624- name: skill.name,
625- unlockRank: skill.rank,
662+ name,
663+ weapon: effect.weapon,
664+ unlockRank: rank,
626665 recommendedLevel: recommendedUpgradeLevel(index, level),
627666 source: {
628667 kind: "companion",
629668 id: companion.name,
630- url: firstSourceUrl(companion.source),
669+ url: effect.url,
631670 citation: companion.source,
632671 },
633- reason: preferredAt < preferences.length
634- ? translated(lang, `Strategy preference #${preferredAt + 1}`, `Préférence stratégique n°${preferredAt + 1}`)
635- : translated(lang, `Unlocked at personal rank ${skill.rank}`, `Débloqué au rang personnel ${skill.rank}`),
672+ reason: replaces
673+ ? translated(lang, `Progression substitute for ${replaces}`, `Substitut de progression pour ${replaces}`)
674+ : translated(lang, "Character-specific curated Art", "Art choisi pour ce personnage"),
636675 };
637- });
676+ }),
677+ reasons: companionProgressionReasons(lang, unavailable, personalRank),
678+ };
679+}
680+
681+function selectCompanionSkills(
682+ companion: (typeof companions)[number],
683+ build: CuratedCompanionBuild,
684+ personalRank: number,
685+ lang: Lang,
686+ level: number,
687+): { skills: SkillSelection[]; reasons: string[] } {
688+ const { choices, unavailable } = selectCuratedChoices(
689+ build.skills, build.skillSubstitutes, companion.skills, personalRank,
690+ companion.skillSlots, () => 0,
691+ );
692+ return {
693+ skills: choices.map(({ name, rank, replaces }, index): SkillSelection => ({
694+ name,
695+ unlockRank: rank,
696+ recommendedLevel: recommendedUpgradeLevel(index, level),
697+ source: {
698+ kind: "companion",
699+ id: companion.name,
700+ url: firstSourceUrl(companion.source),
701+ citation: companion.source,
702+ },
703+ reason: replaces
704+ ? translated(lang, `Progression substitute for ${replaces}`, `Substitut de progression pour ${replaces}`)
705+ : translated(lang, "Character-specific curated Skill", "Skill choisi pour ce personnage"),
706+ })),
707+ reasons: companionProgressionReasons(lang, unavailable, personalRank),
708+ };
638709 }
639710
640711 /** Plans only the named companion's canonical personal kit. */
@@ -652,8 +723,14 @@ export function planCompanion(
652723 clampRank(personalClassRank, companion.maxRank),
653724 );
654725 const level = clampLevel(effectiveLevel);
655- const { arts, potentialArts, trimmedTpArts } = selectCompanionArts(companion, personalRank, lang, level);
656- const skills = selectCompanionSkills(companion, personalRank, lang, level);
726+ const curatedBuild = companionBuilds[companion.name];
727+ if (!curatedBuild) throw new Error(`Missing curated build for ${companion.name}`);
728+ const { arts, reasons: artReasons } = selectCompanionArts(
729+ companion, curatedBuild, personalRank, lang, level,
730+ );
731+ const { skills, reasons: skillReasons } = selectCompanionSkills(
732+ companion, curatedBuild, personalRank, lang, level,
733+ );
657734 return {
658735 name: companion.name,
659736 className: companion.className,
@@ -663,29 +740,19 @@ export function planCompanion(
663740 strategy: companion.strategy,
664741 capabilities: { ...companion.capabilities },
665742 arts,
666- potentialArts,
667743 skills,
744+ curatedBuild,
668745 skillSlots: companion.skillSlots,
669- note: buildStrategies[companion.strategy].role,
746+ note: curatedBuild.role,
670747 source: companion.source,
671748 planReasons: [
672749 translated(
673750 lang,
674- `Personal rank ${personalRank}: ${arts.length} learned Arts and ${skills.length}/${companion.skillSlots} Skills`,
675- `Rang personnel ${personalRank} : ${arts.length} Arts appris et ${skills.length}/${companion.skillSlots} Skills`,
676- ),
677- ...(trimmedTpArts > 0
678- ? [translated(
679- lang,
680- `${trimmedTpArts} TP-cost Arts set aside to preserve the TP economy (max ${TP_ART_BUDGET} per build)`,
681- `${trimmedTpArts} Arts à PT écartés pour préserver l'économie de PT (max ${TP_ART_BUDGET} par build)`,
682- )]
683- : []),
684- translated(
685- lang,
686- "Canonical default Arts precede strategy preferences",
687- "Les Arts par défaut canoniques priment sur les préférences stratégiques",
751+ `Personal rank ${personalRank}: ${arts.length} equipped Arts and ${skills.length}/${companion.skillSlots} Skills (max ${COMPANION_TP_ART_BUDGET} TP Arts)`,
752+ `Rang personnel ${personalRank} : ${arts.length} Arts équipés et ${skills.length}/${companion.skillSlots} Skills (max ${COMPANION_TP_ART_BUDGET} Arts à PT)`,
688753 ),
754+ ...artReasons,
755+ ...skillReasons,
689756 ],
690757 };
691758 }
@@ -910,6 +977,7 @@ export function buildRoster(
910977 strategy: companion.strategy,
911978 dominantAttribute: buildStrategies[companion.strategy].dominantAttribute,
912979 note: companion.note,
980+ curatedBuild: companion.curatedBuild,
913981 planReasons: companion.planReasons,
914982 source: companion.source,
915983 });
@@ -1,8 +1,9 @@
1 import { buildStrategies, classStrategy, companionSelectionPriority } from "@/src/data/builds";1 import { buildStrategies, classStrategy, companionSelectionPriority } from "@/src/data/builds";
2 import { classes } from "@/src/data/classes";2 import { classes } from "@/src/data/classes";
3 import { companionByName, companions } from "@/src/data/companions";3 import { companionByName, companions } from "@/src/data/companions";
4+import { companionBuilds } from "@/src/data/companionBuilds";
4 import { classProgression, classProgressionById } from "@/src/data/progression";5 import { classProgression, classProgressionById } from "@/src/data/progression";
5-import artEffectsData from "@/research/art-effects.json";6+import artEffectsData from "@/src/data/art-effects.json";
6 import {7 import {
7 frameStats,8 frameStats,
8 licenseFrame,9 licenseFrame,
@@ -22,6 +23,8 @@ import type {
22 ClassEntry,23 ClassEntry,
23 ClassRanks,24 ClassRanks,
24 CompanionPlan,25 CompanionPlan,
26+ CuratedCompanionBuild,
27+ CompanionUnlockFact,
25 Lang,28 Lang,
26 LocalizedText,29 LocalizedText,
27 RosterMember,30 RosterMember,
@@ -329,6 +332,7 @@ function compareNumericScore(left: readonly number[], right: readonly number[]):
329 }332 }
330 333
331 export const TP_ART_BUDGET = 3;334 export const TP_ART_BUDGET = 3;
335+const COMPANION_TP_ART_BUDGET = 2;
332 336
333 const tpCostingArtNames: Record<string, true> = {};337 const tpCostingArtNames: Record<string, true> = {};
334 for (const art of artEffectsData.arts as { name: string; effects: { tp: boolean } }[]) {338 for (const art of artEffectsData.arts as { name: string; effects: { tp: boolean } }[]) {
@@ -558,83 +562,150 @@ export function planAvatar(
558 };562 };
559 }563 }
560 564
561-function selectCompanionArts(565+type CuratedChoice = { name: string; rank: number; replaces?: string };
562- companion: (typeof companions)[number],566+
563- personalRank: number,567+function selectCuratedChoices(
564- lang: Lang,568+ canonical: readonly string[],
565- level: number,569+ substitutes: readonly string[],
566-): { arts: ArtSelection[]; potentialArts: ArtSelection[]; trimmedTpArts: number } {570+ facts: readonly CompanionUnlockFact[],
567- const strategy = buildStrategies[companion.strategy];571+ rank: number,
568- const ranked = companion.arts572+ limit: number,
569- .filter((art) => art.rank <= personalRank)573+ costOf: (name: string) => number,
570- .slice()574+): { choices: CuratedChoice[]; unavailable: { name: string; rank: number; replacement?: string }[] } {
571- .sort((left, right) =>575+ if (canonical.length > limit) throw new Error("Curated build exceeds available ability slots");
572- preferenceIndex(left.name, companion.defaultArts)576+ const selected = new Set<string>();
573- - preferenceIndex(right.name, companion.defaultArts)577+ const choices: Array<CuratedChoice | undefined> = new Array(canonical.length);
574- || preferenceIndex(left.name, strategy.preferredArts)578+ const unavailable: { name: string; rank: number; replacement?: string }[] = [];
575- - preferenceIndex(right.name, strategy.preferredArts)579+ let spent = 0;
576- || compareText(left.name, right.name)580+ const trySelect = (name: string, replaces?: string): CuratedChoice | undefined => {
577- || left.rank - right.rank);581+ const fact = facts.find((entry) => entry.name === name);
578- const toSelection = (art: (typeof companion.arts)[number], index: number): ArtSelection => {582+ if (!fact) throw new Error(`Curated ability ${name} is absent from companion unlocks`);
579- const defaultAt = preferenceIndex(art.name, companion.defaultArts);583+ if (fact.rank > rank || selected.has(name)) return undefined;
580- const preferredAt = preferenceIndex(art.name, strategy.preferredArts);584+ const cost = costOf(name);
581- return {585+ if (spent + cost > COMPANION_TP_ART_BUDGET) return undefined;
582- name: art.name,586+ spent += cost;
583- unlockRank: art.rank,587+ selected.add(name);
584- recommendedLevel: recommendedUpgradeLevel(index, level),588+ return { name, rank: fact.rank, replaces };
585- source: {
586- kind: "companion",
587- id: companion.name,
588- url: firstSourceUrl(companion.source),
589- citation: companion.source,
590- },
591- reason: defaultAt < companion.defaultArts.length
592- ? translated(lang, `Canonical default Art #${defaultAt + 1}`, `Art par défaut canonique n°${defaultAt + 1}`)
593- : preferredAt < strategy.preferredArts.length
594- ? translated(lang, `Strategy preference #${preferredAt + 1}`, `Préférence stratégique n°${preferredAt + 1}`)
595- : translated(lang, `Unlocked at personal rank ${art.rank}`, `Débloqué au rang personnel ${art.rank}`),
596- };
597 };589 };
598- const { selected, trimmedTpArts } = applyTpArtBudget(ranked, (art) => art.name);590+
599- return {591+ for (let index = 0; index < canonical.length; index += 1) {
600- arts: selected.map(toSelection),592+ choices[index] = trySelect(canonical[index]);
601- potentialArts: ranked.slice(0, 8).map(toSelection),593+ }
602- trimmedTpArts,594+ let substituteIndex = 0;
595+ const nextSubstitute = (replaces?: string): CuratedChoice | undefined => {
596+ while (substituteIndex < substitutes.length) {
597+ const choice = trySelect(substitutes[substituteIndex], replaces);
598+ substituteIndex += 1;
599+ if (choice) return choice;
600+ }
601+ return undefined;
603 };602 };
603+ for (let index = 0; index < choices.length; index += 1) {
604+ if (choices[index]) continue;
605+ const name = canonical[index];
606+ const fact = facts.find((entry) => entry.name === name);
607+ if (!fact) throw new Error(`Curated ability ${name} is absent from companion unlocks`);
608+ const replacement = nextSubstitute(name);
609+ choices[index] = replacement;
610+ unavailable.push({ name, rank: fact.rank, replacement: replacement?.name });
611+ }
612+ const result = choices.filter((choice): choice is CuratedChoice => choice !== undefined);
613+ while (result.length < limit) {
614+ const filler = nextSubstitute();
615+ if (!filler) break;
616+ result.push(filler);
617+ }
618+ return { choices: result, unavailable };
604 }619 }
605 620
606-function selectCompanionSkills(621+const companionArtEffects = new Map(
622+ (artEffectsData.arts as { name: string; weapon: string; url: string; effects: { tp: boolean } }[])
623+ .map((art) => [art.name, art]),
624+);
625+
626+function companionArtCost(name: string, companion: (typeof companions)[number]): number {
627+ const art = companionArtEffects.get(name);
628+ if (!art) throw new Error(`Missing verified Art facts for ${name}`);
629+ if (art.weapon !== companion.ranged && art.weapon !== companion.melee) {
630+ throw new Error(`${companion.name} cannot equip ${name} (${art.weapon})`);
631+ }
632+ return art.effects.tp ? 1 : 0;
633+}
634+
635+function companionProgressionReasons(
636+ lang: Lang,
637+ unavailable: readonly { name: string; rank: number; replacement?: string }[],
638+ personalRank: number,
639+): string[] {
640+ return unavailable.map(({ name, rank, replacement }) => translated(
641+ lang,
642+ `${name} ${rank > personalRank ? `unlocks at personal rank ${rank}` : `exceeds the ${COMPANION_TP_ART_BUDGET}-TP Art limit`}; ${replacement ? `${replacement} equipped instead` : "no legal progression substitute available"}`,
643+ `${name} ${rank > personalRank ? `se débloque au rang personnel ${rank}` : `dépasse la limite de ${COMPANION_TP_ART_BUDGET} Arts à PT`}; ${replacement ? `${replacement} équipé à la place` : "aucun substitut de progression légal disponible"}`,
644+ ));
645+}
646+
647+function selectCompanionArts(
607 companion: (typeof companions)[number],648 companion: (typeof companions)[number],
649+ build: CuratedCompanionBuild,
608 personalRank: number,650 personalRank: number,
609 lang: Lang,651 lang: Lang,
610 level: number,652 level: number,
611-): SkillSelection[] {653+): { arts: ArtSelection[]; reasons: string[] } {
612- const preferences = buildStrategies[companion.strategy].preferredSkills;654+ const { choices, unavailable } = selectCuratedChoices(
613- return companion.skills655+ build.arts, build.artSubstitutes, companion.arts, personalRank, 8,
614- .filter((skill) => skill.rank <= personalRank)656+ (name) => companionArtCost(name, companion),
615- .slice()657+ );
616- .sort((left, right) =>658+ return {
617- preferenceIndex(left.name, preferences) - preferenceIndex(right.name, preferences)659+ arts: choices.map(({ name, rank, replaces }, index): ArtSelection => {
618- || compareText(left.name, right.name)660+ const effect = companionArtEffects.get(name)!;
619- || left.rank - right.rank)
620- .slice(0, companion.skillSlots)
621- .map((skill, index) => {
622- const preferredAt = preferenceIndex(skill.name, preferences);
623 return {661 return {
624- name: skill.name,662+ name,
625- unlockRank: skill.rank,663+ weapon: effect.weapon,
664+ unlockRank: rank,
626 recommendedLevel: recommendedUpgradeLevel(index, level),665 recommendedLevel: recommendedUpgradeLevel(index, level),
627 source: {666 source: {
628 kind: "companion",667 kind: "companion",
629 id: companion.name,668 id: companion.name,
630- url: firstSourceUrl(companion.source),669+ url: effect.url,
631 citation: companion.source,670 citation: companion.source,
632 },671 },
633- reason: preferredAt < preferences.length672+ reason: replaces
634- ? translated(lang, `Strategy preference #${preferredAt + 1}`, `Préférence stratégique n°${preferredAt + 1}`)673+ ? translated(lang, `Progression substitute for ${replaces}`, `Substitut de progression pour ${replaces}`)
635- : translated(lang, `Unlocked at personal rank ${skill.rank}`, `Débloqué au rang personnel ${skill.rank}`),674+ : translated(lang, "Character-specific curated Art", "Art choisi pour ce personnage"),
636 };675 };
637- });676+ }),
677+ reasons: companionProgressionReasons(lang, unavailable, personalRank),
678+ };
679+}
680+
681+function selectCompanionSkills(
682+ companion: (typeof companions)[number],
683+ build: CuratedCompanionBuild,
684+ personalRank: number,
685+ lang: Lang,
686+ level: number,
687+): { skills: SkillSelection[]; reasons: string[] } {
688+ const { choices, unavailable } = selectCuratedChoices(
689+ build.skills, build.skillSubstitutes, companion.skills, personalRank,
690+ companion.skillSlots, () => 0,
691+ );
692+ return {
693+ skills: choices.map(({ name, rank, replaces }, index): SkillSelection => ({
694+ name,
695+ unlockRank: rank,
696+ recommendedLevel: recommendedUpgradeLevel(index, level),
697+ source: {
698+ kind: "companion",
699+ id: companion.name,
700+ url: firstSourceUrl(companion.source),
701+ citation: companion.source,
702+ },
703+ reason: replaces
704+ ? translated(lang, `Progression substitute for ${replaces}`, `Substitut de progression pour ${replaces}`)
705+ : translated(lang, "Character-specific curated Skill", "Skill choisi pour ce personnage"),
706+ })),
707+ reasons: companionProgressionReasons(lang, unavailable, personalRank),
708+ };
638 }709 }
639 710
640 /** Plans only the named companion's canonical personal kit. */711 /** Plans only the named companion's canonical personal kit. */
@@ -652,8 +723,14 @@ export function planCompanion(
652 clampRank(personalClassRank, companion.maxRank),723 clampRank(personalClassRank, companion.maxRank),
653 );724 );
654 const level = clampLevel(effectiveLevel);725 const level = clampLevel(effectiveLevel);
655- const { arts, potentialArts, trimmedTpArts } = selectCompanionArts(companion, personalRank, lang, level);726+ const curatedBuild = companionBuilds[companion.name];
656- const skills = selectCompanionSkills(companion, personalRank, lang, level);727+ if (!curatedBuild) throw new Error(`Missing curated build for ${companion.name}`);
728+ const { arts, reasons: artReasons } = selectCompanionArts(
729+ companion, curatedBuild, personalRank, lang, level,
730+ );
731+ const { skills, reasons: skillReasons } = selectCompanionSkills(
732+ companion, curatedBuild, personalRank, lang, level,
733+ );
657 return {734 return {
658 name: companion.name,735 name: companion.name,
659 className: companion.className,736 className: companion.className,
@@ -663,29 +740,19 @@ export function planCompanion(
663 strategy: companion.strategy,740 strategy: companion.strategy,
664 capabilities: { ...companion.capabilities },741 capabilities: { ...companion.capabilities },
665 arts,742 arts,
666- potentialArts,
667 skills,743 skills,
744+ curatedBuild,
668 skillSlots: companion.skillSlots,745 skillSlots: companion.skillSlots,
669- note: buildStrategies[companion.strategy].role,746+ note: curatedBuild.role,
670 source: companion.source,747 source: companion.source,
671 planReasons: [748 planReasons: [
672 translated(749 translated(
673 lang,750 lang,
674- `Personal rank ${personalRank}: ${arts.length} learned Arts and ${skills.length}/${companion.skillSlots} Skills`,751+ `Personal rank ${personalRank}: ${arts.length} equipped Arts and ${skills.length}/${companion.skillSlots} Skills (max ${COMPANION_TP_ART_BUDGET} TP Arts)`,
675- `Rang personnel ${personalRank} : ${arts.length} Arts appris et ${skills.length}/${companion.skillSlots} Skills`,752+ `Rang personnel ${personalRank} : ${arts.length} Arts équipés et ${skills.length}/${companion.skillSlots} Skills (max ${COMPANION_TP_ART_BUDGET} Arts à PT)`,
676- ),
677- ...(trimmedTpArts > 0
678- ? [translated(
679- lang,
680- `${trimmedTpArts} TP-cost Arts set aside to preserve the TP economy (max ${TP_ART_BUDGET} per build)`,
681- `${trimmedTpArts} Arts à PT écartés pour préserver l'économie de PT (max ${TP_ART_BUDGET} par build)`,
682- )]
683- : []),
684- translated(
685- lang,
686- "Canonical default Arts precede strategy preferences",
687- "Les Arts par défaut canoniques priment sur les préférences stratégiques",
688 ),753 ),
754+ ...artReasons,
755+ ...skillReasons,
689 ],756 ],
690 };757 };
691 }758 }
@@ -910,6 +977,7 @@ export function buildRoster(
910 strategy: companion.strategy,977 strategy: companion.strategy,
911 dominantAttribute: buildStrategies[companion.strategy].dominantAttribute,978 dominantAttribute: buildStrategies[companion.strategy].dominantAttribute,
912 note: companion.note,979 note: companion.note,
980+ curatedBuild: companion.curatedBuild,
913 planReasons: companion.planReasons,981 planReasons: companion.planReasons,
914 source: companion.source,982 source: companion.source,
915 });983 });
added src/lib/fixedCompanionBuilds.test.ts +557 -0
new file mode 100644
@@ -0,0 +1,557 @@
1+import assert from "node:assert/strict";
2+import test from "node:test";
3+import artEffectsData from "@/src/data/art-effects.json";
4+import { companionByName, companions } from "@/src/data/companions";
5+import { recommendContextualTeams } from "@/src/lib/contextualEngine";
6+import {
7+ classRanksForActiveClass,
8+ editClassRank,
9+ planCompanion,
10+} from "@/src/lib/engine";
11+import type {
12+ CompanionPlan,
13+ ContextualRecommendationRequest,
14+ ContextualTeamRecommendation,
15+ CuratedCompanionBuild,
16+ RosterMember,
17+} from "@/src/lib/types";
18+
19+/**
20+ * Fixed companion contract: emitted legal kits, progression precedence,
21+ * companion-only TP cap and invariance through both public planning paths.
22+ */
23+
24+const tpCostingArtNames: Record<string, true> = {};
25+/** Verified per-Art weapon from the research fact table (issue #1 requires it on every selection). */
26+const weaponByArtName: Record<string, string> = {};
27+for (const art of artEffectsData.arts as {
28+ name: string;
29+ weapon: string;
30+ effects: { tp: boolean };
31+}[]) {
32+ if (art.effects.tp) tpCostingArtNames[art.name] = true;
33+ weaponByArtName[art.name] = art.weapon;
34+}
35+
36+type CompanionFact = (typeof companions)[number];
37+type Kit = { arts: string[]; skills: string[] };
38+
39+function kitOf(member: Pick<RosterMember, "arts" | "skills">): Kit {
40+ return {
41+ arts: member.arts.map((art) => art.name),
42+ skills: member.skills.map((skill) => skill.name),
43+ };
44+}
45+
46+/** Every rank at or around an unlock boundary, plus out-of-range clamps. */
47+function rankSamples(companion: CompanionFact): number[] {
48+ const ranks = new Set<number>([0, companion.startRank, companion.maxRank, 99]);
49+ for (const art of companion.arts) {
50+ ranks.add(art.rank);
51+ ranks.add(Math.max(0, art.rank - 1));
52+ }
53+ for (const skill of companion.skills) {
54+ ranks.add(skill.rank);
55+ ranks.add(Math.max(0, skill.rank - 1));
56+ }
57+ return [...ranks].sort((left, right) => left - right);
58+}
59+
60+function expectedPersonalRank(companion: CompanionFact, requested: number): number {
61+ if (!Number.isFinite(requested)) return companion.startRank;
62+ return Math.max(
63+ companion.startRank,
64+ Math.min(companion.maxRank, Math.trunc(requested)),
65+ );
66+}
67+
68+function assertLegalKit(
69+ plan: CompanionPlan,
70+ companion: CompanionFact,
71+ context: string,
72+): void {
73+ assert.equal(plan.name, companion.name, `${context}: wrong companion`);
74+ const artNames = plan.arts.map((art) => art.name);
75+ const skillNames = plan.skills.map((skill) => skill.name);
76+ assert.equal(
77+ new Set(artNames).size,
78+ artNames.length,
79+ `${context}: duplicate Arts (${artNames.join(", ")})`,
80+ );
81+ assert.equal(
82+ new Set(skillNames).size,
83+ skillNames.length,
84+ `${context}: duplicate Skills (${skillNames.join(", ")})`,
85+ );
86+ assert.ok(artNames.length >= 1, `${context}: expected at least one Art`);
87+ assert.ok(
88+ artNames.length <= 8,
89+ `${context}: ${artNames.length} Arts exceeds the eight-slot limit`,
90+ );
91+ assert.ok(
92+ skillNames.length <= plan.skillSlots,
93+ `${context}: ${skillNames.length} Skills exceeds the ${plan.skillSlots}-slot limit`,
94+ );
95+ assert.equal(
96+ plan.skillSlots,
97+ companion.skillSlots,
98+ `${context}: wrong Skill slot count`,
99+ );
100+ for (const art of plan.arts) {
101+ const fact = companion.arts.find((entry) => entry.name === art.name);
102+ assert.ok(fact, `${context}: Art "${art.name}" is not in ${companion.name}'s kit`);
103+ assert.equal(
104+ art.unlockRank,
105+ fact.rank,
106+ `${context}: Art "${art.name}" reports wrong unlock rank`,
107+ );
108+ assert.ok(
109+ fact.rank <= plan.personalRank,
110+ `${context}: Art "${art.name}" unlocks at rank ${fact.rank}, above personal rank ${plan.personalRank}`,
111+ );
112+ assert.ok(
113+ art.recommendedLevel >= 1 && art.recommendedLevel <= 5,
114+ `${context}: Art "${art.name}" recommends upgrade level ${art.recommendedLevel} outside 1..5`,
115+ );
116+ assert.ok(
117+ weaponByArtName[art.name] !== undefined,
118+ `${context}: Art "${art.name}" has no weapon record in the research fact table`,
119+ );
120+ assert.ok(
121+ art.weapon === weaponByArtName[art.name],
122+ `${context}: Art "${art.name}" claims weapon "${art.weapon}" but the research fact table verifies "${weaponByArtName[art.name]}"`,
123+ );
124+ assert.ok(
125+ art.weapon === companion.ranged || art.weapon === companion.melee,
126+ `${context}: Art "${art.name}" claims weapon "${art.weapon}" outside ${companion.name}'s ${companion.ranged}/${companion.melee}`,
127+ );
128+ }
129+ for (const skill of plan.skills) {
130+ const fact = companion.skills.find((entry) => entry.name === skill.name);
131+ assert.ok(fact, `${context}: Skill "${skill.name}" is not in ${companion.name}'s kit`);
132+ assert.equal(
133+ skill.unlockRank,
134+ fact.rank,
135+ `${context}: Skill "${skill.name}" reports wrong unlock rank`,
136+ );
137+ assert.ok(
138+ fact.rank <= plan.personalRank,
139+ `${context}: Skill "${skill.name}" unlocks at rank ${fact.rank}, above personal rank ${plan.personalRank}`,
140+ );
141+ assert.ok(
142+ skill.recommendedLevel >= 1 && skill.recommendedLevel <= 5,
143+ `${context}: Skill "${skill.name}" recommends upgrade level ${skill.recommendedLevel} outside 1..5`,
144+ );
145+ }
146+}
147+
148+function requestFor(
149+ overrides: Partial<ContextualRecommendationRequest> = {},
150+): ContextualRecommendationRequest {
151+ return {
152+ slots: ["Doug", "", ""],
153+ activeClassId: "duelist",
154+ avatarLevel: 30,
155+ classRanks: editClassRank(classRanksForActiveClass("duelist", {}), "duelist", 10),
156+ personalRanks: [20, 20, 20],
157+ combatMode: "general",
158+ hasSkellLicense: false,
159+ postgameFrames: false,
160+ assumeSpecialUnlocks: false,
161+ lang: "en",
162+ ...overrides,
163+ };
164+}
165+
166+function recommendationsOrThrow(
167+ request: ContextualRecommendationRequest,
168+ context: string,
169+): readonly ContextualTeamRecommendation[] {
170+ const result = recommendContextualTeams(request);
171+ assert.equal(result.kind, "success", `${context}: recommendations became infeasible`);
172+ if (result.kind !== "success") return [];
173+ return result.recommendations;
174+}
175+
176+function kitsByCompanion(
177+ request: ContextualRecommendationRequest,
178+ context: string,
179+): Map<string, Kit> {
180+ const kits = new Map<string, Kit>();
181+ for (const recommendation of recommendationsOrThrow(request, context)) {
182+ for (const member of recommendation.roster) {
183+ if (member.kind !== "companion") continue;
184+ const kit = kitOf(member);
185+ const seen = kits.get(member.name);
186+ assert.deepEqual(
187+ seen ?? kit,
188+ kit,
189+ `${context}: ${member.name} received different kits across variants/placements`,
190+ );
191+ kits.set(member.name, kit);
192+ }
193+ }
194+ return kits;
195+}
196+
197+test("the companion roster covers the 22 non-Cross characters exactly once", () => {
198+ const names = companions.map((companion) => companion.name);
199+ assert.equal(companions.length, 22, "the roster must cover all 22 non-Cross characters");
200+ assert.equal(new Set(names).size, 22, "companion names must be unique");
201+ assert.ok(!names.includes("Cross"), "Cross must not be part of the companion roster");
202+ for (const name of names) {
203+ assert.ok(companionByName.get(name), `companionByName must index ${name}`);
204+ }
205+});
206+
207+test("every companion plan selects only legal, unlocked, unique Arts and Skills", () => {
208+ for (const companion of companions) {
209+ for (const level of [1, 30, 60, 99]) {
210+ for (const requestedRank of rankSamples(companion)) {
211+ const context = `${companion.name} level ${level} requested rank ${requestedRank}`;
212+ const plan = planCompanion(companion.name, level, requestedRank);
213+ assert.equal(
214+ plan.personalRank,
215+ expectedPersonalRank(companion, requestedRank),
216+ `${context}: personal rank is not clamped to the companion's own progression`,
217+ );
218+ assertLegalKit(plan, companion, context);
219+ }
220+ }
221+ }
222+});
223+
224+test("companion loadouts keep at most two TP-consuming Arts", () => {
225+ for (const companion of companions) {
226+ for (const requestedRank of [companion.startRank, 10, companion.maxRank, 99]) {
227+ const plan = planCompanion(companion.name, 30, requestedRank);
228+ const tpArts = plan.arts.filter((art) => tpCostingArtNames[art.name]);
229+ assert.ok(
230+ tpArts.length <= 2,
231+ `${companion.name} at personal rank ${plan.personalRank} carries ${tpArts.length} TP-costing Arts (strict max 2): ${tpArts.map((art) => art.name).join(", ")}`,
232+ );
233+ }
234+ }
235+});
236+
237+test("Celica fills unlocked progression slots with useful non-TP Arts", () => {
238+ const rankSix = planCompanion("Celica", 30, 6).arts.map((art) => art.name);
239+ const rankTen = planCompanion("Celica", 30, 10).arts.map((art) => art.name);
240+ assert.ok(rankSix.includes("Violent Streak"));
241+ assert.equal(rankSix.length, 7);
242+ assert.ok(rankTen.includes("Violent Streak"));
243+ assert.equal(rankTen.length, 8);
244+});
245+
246+test("Al includes his unlocked physical-resistance Art in the early bar", () => {
247+ const arts = planCompanion("Al", 50, 3).arts.map((art) => art.name);
248+ assert.equal(arts.length, 4);
249+ assert.ok(arts.includes("Magnum Edge"));
250+});
251+
252+test("Skell mode keeps the canonical ground Skills instead of substituting them", () => {
253+ const ground = kitsByCompanion(
254+ requestFor({ combatMode: "general" }),
255+ "general mode",
256+ );
257+ const skell = kitsByCompanion(requestFor({ combatMode: "skell" }), "skell mode");
258+ assert.ok(ground.has("Doug"), "Doug must appear in the general-mode roster");
259+ assert.ok(skell.has("Doug"), "Doug must appear in the skell-mode roster");
260+ for (const [name, kit] of ground) {
261+ const skellKit = skell.get(name);
262+ // Team composition may legitimately differ across modes; kits may not.
263+ if (!skellKit) continue;
264+ assert.deepEqual(
265+ skellKit.skills,
266+ kit.skills,
267+ `${name}: Skell mode must not substitute canonical ground Skills`,
268+ );
269+ assert.deepEqual(
270+ skellKit.arts,
271+ kit.arts,
272+ `${name}: Skell mode must not change the Arts loadout`,
273+ );
274+ const companion = companionByName.get(name);
275+ assert.ok(companion, `unknown roster companion ${name}`);
276+ for (const skillName of skellKit.skills) {
277+ const fact = companion.skills.find((entry) => entry.name === skillName);
278+ assert.ok(
279+ fact && fact.rank <= 20,
280+ `${name}: Skill "${skillName}" equipped in Skell mode is illegal at personal rank 20`,
281+ );
282+ }
283+ }
284+});
285+
286+test("companion kits stay fixed across Cross classes, ranks, weapons, teammates and placements", () => {
287+ const configurations: ContextualRecommendationRequest[] = [
288+ requestFor(),
289+ requestFor({
290+ activeClassId: "galactic-knight",
291+ classRanks: editClassRank(
292+ classRanksForActiveClass("galactic-knight", {}),
293+ "galactic-knight",
294+ 10,
295+ ),
296+ }),
297+ requestFor({
298+ classRanks: editClassRank(classRanksForActiveClass("duelist", {}), "duelist", 5),
299+ }),
300+ requestFor({
301+ activeClassId: "galactic-knight",
302+ // Tier-4 mastery on BOTH branches: galactic-knight active (beam Arts)
303+ // plus full-metal-jaguar rank 10 so the Photon Saber override is legal.
304+ classRanks: editClassRank(
305+ editClassRank(
306+ classRanksForActiveClass("galactic-knight", {}),
307+ "galactic-knight",
308+ 10,
309+ ),
310+ "full-metal-jaguar",
311+ 10,
312+ ),
313+ avatarLevel: 60,
314+ weaponOverrides: { ranged: "Dual Guns", melee: "Photon Saber" },
315+ }),
316+ requestFor({ avatarLevel: 50 }),
317+ requestFor({ slots: ["", "Doug", ""] }),
318+ requestFor({ slots: ["", "", "Doug"] }),
319+ requestFor({ slots: ["", "", ""] }),
320+ ];
321+ const kits = new Map<string, Kit>();
322+ for (const [index, request] of configurations.entries()) {
323+ for (const [name, kit] of kitsByCompanion(request, `configuration #${index + 1}`)) {
324+ const seen = kits.get(name);
325+ assert.deepEqual(
326+ seen ?? kit,
327+ kit,
328+ `${name}: kit changed when the Cross configuration, teammates or placement changed`,
329+ );
330+ kits.set(name, kit);
331+ }
332+ }
333+ assert.ok(kits.has("Doug"), "Doug must appear in at least one roster");
334+ for (const [name, kit] of kits) {
335+ const direct = planCompanion(name, 30, 20);
336+ assert.deepEqual(
337+ kit.arts,
338+ direct.arts.map((art) => art.name),
339+ `${name}: roster Arts must match the direct companion planner`,
340+ );
341+ assert.deepEqual(
342+ kit.skills,
343+ direct.skills.map((skill) => skill.name),
344+ `${name}: roster Skills must match the direct companion planner`,
345+ );
346+ }
347+});
348+
349+test("companion planning is deterministic and clamps out-of-range ranks", () => {
350+ for (const companion of companions) {
351+ const canonical = planCompanion(companion.name, 30, companion.maxRank);
352+ assert.deepEqual(
353+ planCompanion(companion.name, 30, companion.maxRank),
354+ canonical,
355+ `${companion.name}: repeated planning at equal progression differs`,
356+ );
357+ const above = planCompanion(companion.name, 30, 99);
358+ assert.equal(above.personalRank, companion.maxRank);
359+ assert.deepEqual(
360+ above.arts.map((art) => art.name),
361+ canonical.arts.map((art) => art.name),
362+ `${companion.name}: ranks above maxRank must not change the Arts`,
363+ );
364+ const below = planCompanion(companion.name, 30, 0);
365+ assert.equal(below.personalRank, companion.startRank);
366+ assert.deepEqual(
367+ below.arts.map((art) => art.name),
368+ planCompanion(companion.name, 30, companion.startRank).arts.map((art) => art.name),
369+ `${companion.name}: ranks below startRank must not change the Arts`,
370+ );
371+ }
372+});
373+
374+test("language only changes presentation, never the loadout", () => {
375+ for (const companion of companions) {
376+ const english = planCompanion(companion.name, 30, companion.maxRank, "en");
377+ const french = planCompanion(companion.name, 30, companion.maxRank, "fr");
378+ assert.deepEqual(
379+ french.arts.map((art) => art.name),
380+ english.arts.map((art) => art.name),
381+ `${companion.name}: Arts changed between languages`,
382+ );
383+ assert.deepEqual(
384+ french.skills.map((skill) => skill.name),
385+ english.skills.map((skill) => skill.name),
386+ `${companion.name}: Skills changed between languages`,
387+ );
388+ }
389+});
390+
391+test("every companion exposes a curated fixed build with sourced equipment advice", () => {
392+ for (const companion of companions) {
393+ const plan = planCompanion(companion.name, 30, companion.maxRank);
394+ const curated: CuratedCompanionBuild = plan.curatedBuild;
395+ assert.ok(
396+ curated.arts.length >= 1,
397+ `${companion.name}: curated build lists no Arts`,
398+ );
399+ assert.equal(
400+ new Set(curated.arts).size,
401+ curated.arts.length,
402+ `${companion.name}: curated Arts contain duplicates`,
403+ );
404+ assert.equal(
405+ new Set(curated.skills).size,
406+ curated.skills.length,
407+ `${companion.name}: curated Skills contain duplicates`,
408+ );
409+ const curatedTpArts = curated.arts.filter(
410+ (art) => tpCostingArtNames[art],
411+ );
412+ assert.ok(
413+ curatedTpArts.length <= 2,
414+ `${companion.name}: curated build lists ${curatedTpArts.length} TP-costing Arts (max 2): ${curatedTpArts.join(", ")}`,
415+ );
416+ const artUniverse = new Set([...curated.arts, ...curated.artSubstitutes]);
417+ for (const art of plan.arts) {
418+ assert.ok(
419+ artUniverse.has(art.name),
420+ `${companion.name}: equipped Art "${art.name}" is outside the curated build and its substitutes`,
421+ );
422+ }
423+ const skillUniverse = new Set([
424+ ...curated.skills,
425+ ...curated.skillSubstitutes,
426+ ]);
427+ for (const skill of plan.skills) {
428+ assert.ok(
429+ skillUniverse.has(skill.name),
430+ `${companion.name}: equipped Skill "${skill.name}" is outside the curated build and its substitutes`,
431+ );
432+ }
433+ for (const key of ["role", "rationale"] as const) {
434+ const text = curated[key];
435+ assert.ok(
436+ text.length === 2 && text.every((part) => part.length > 0),
437+ `${companion.name}: curated ${key} must be present in English and French`,
438+ );
439+ }
440+ for (const key of ["weapons", "armor", "availability"] as const) {
441+ const text = curated.equipment[key];
442+ assert.ok(
443+ text.length === 2 && text.every((part) => part.length > 0),
444+ `${companion.name}: curated equipment ${key} must be present in English and French`,
445+ );
446+ }
447+ assert.ok(
448+ curated.sources.length >= 1,
449+ `${companion.name}: curated build cites no sources`,
450+ );
451+ for (const source of curated.sources) {
452+ assert.ok(
453+ /^https?:\/\//.test(source.url),
454+ `${companion.name}: source "${source.label}" has no URL`,
455+ );
456+ assert.ok(
457+ source.edition === "DE" || source.edition === "XCX" || source.edition === "both",
458+ `${companion.name}: source "${source.label}" must declare its game edition`,
459+ );
460+ }
461+ }
462+});
463+
464+test("companion kits change only when a progression rank unlocks something", () => {
465+ for (const companion of companions) {
466+ const unlockRanks = new Set<number>([
467+ ...companion.arts.map((art) => art.rank),
468+ ...companion.skills.map((skill) => skill.rank),
469+ ]);
470+ for (let rank = companion.startRank; rank < companion.maxRank; rank += 1) {
471+ if (unlockRanks.has(rank + 1)) continue;
472+ const before = planCompanion(companion.name, 30, rank);
473+ const after = planCompanion(companion.name, 30, rank + 1);
474+ assert.deepEqual(
475+ after.arts.map((art) => art.name),
476+ before.arts.map((art) => art.name),
477+ `${companion.name}: Arts changed between ranks ${rank} and ${rank + 1} although nothing unlocks there`,
478+ );
479+ assert.deepEqual(
480+ after.skills.map((skill) => skill.name),
481+ before.skills.map((skill) => skill.name),
482+ `${companion.name}: Skills changed between ranks ${rank} and ${rank + 1} although nothing unlocks there`,
483+ );
484+ }
485+ }
486+});
487+
488+test("curated canonical Arts take precedence over substitutes once they unlock", () => {
489+ let assertedBoundaries = 0;
490+ for (const companion of companions) {
491+ const plan = planCompanion(companion.name, 30, companion.maxRank);
492+ const curated: CuratedCompanionBuild = plan.curatedBuild;
493+ /** Canonical Art -> unlock rank, proving every curated canonical is a real fact. */
494+ const unlockRankByCanonical = new Map<string, number>();
495+ for (const name of curated.arts) {
496+ const fact = companion.arts.find((art) => art.name === name);
497+ assert.ok(
498+ fact !== undefined,
499+ `${companion.name}: curated canonical Art "${name}" is not an unlockable Art of the character`,
500+ );
501+ unlockRankByCanonical.set(name, fact.rank);
502+ }
503+ // Substitutes stay legal Arts of the character's own weapon families.
504+ for (const name of curated.artSubstitutes) {
505+ const weapon = weaponByArtName[name];
506+ assert.ok(
507+ weapon !== undefined,
508+ `${companion.name}: substitute Art "${name}" is missing from the research fact table`,
509+ );
510+ assert.ok(
511+ weapon === companion.ranged || weapon === companion.melee,
512+ `${companion.name}: substitute Art "${name}" needs ${weapon}, outside ${companion.name}'s ${companion.ranged}/${companion.melee}`,
513+ );
514+ }
515+ for (const [art, rank] of unlockRankByCanonical) {
516+ if (rank <= companion.startRank) continue;
517+ // With more canonical Arts unlocked than loadout slots, some omission
518+ // is unavoidable and no precedence claim is possible for a specific Art.
519+ const canonicalsAvailable = [...unlockRankByCanonical.values()].filter(
520+ (unlockRank) => unlockRank <= rank,
521+ ).length;
522+ if (canonicalsAvailable > 8) continue;
523+ const after = planCompanion(companion.name, 30, rank).arts.map(
524+ (selection) => selection.name,
525+ );
526+ const canonicalTpArts = after.filter((name) => {
527+ const canonicalRank = unlockRankByCanonical.get(name);
528+ return tpCostingArtNames[name] && canonicalRank !== undefined && canonicalRank <= rank;
529+ });
530+ // Two canonical TP Arts already reserve the TP budget: the freshly
531+ // unlocked TP Art may legitimately stay out in favour of non-TP filler.
532+ const tpBudgetReserved =
533+ Boolean(tpCostingArtNames[art]) &&
534+ canonicalTpArts.length >= 2 &&
535+ !after.includes(art);
536+ if (tpBudgetReserved) continue;
537+ assert.ok(
538+ after.includes(art),
539+ `${companion.name}: canonical "${art}" unlocks at rank ${rank} but the plan still serves substitutes`,
540+ );
541+ assertedBoundaries += 1;
542+ }
543+ }
544+ assert.ok(
545+ assertedBoundaries >= 1,
546+ "no companion exercised a canonical unlock boundary; the precedence contract is untested",
547+ );
548+});
549+
550+test("Phog replaces his first progression filler with Side Slash at rank 5", () => {
551+ const before = planCompanion("Phog", 30, 4);
552+ const after = planCompanion("Phog", 30, 5);
553+ assert.equal(before.arts[3]?.name, "Upper Hand");
554+ assert.equal(after.arts[3]?.name, "Side Slash");
555+ assert.equal(planCompanion("Phog", 30, 10).skills[0]?.name, "Agile Gunslinger");
556+ assert.equal(planCompanion("Phog", 30, 11).skills[0]?.name, "Background Noise");
557+});
new file mode 100644
@@ -0,0 +1,557 @@
1+import assert from "node:assert/strict";
2+import test from "node:test";
3+import artEffectsData from "@/src/data/art-effects.json";
4+import { companionByName, companions } from "@/src/data/companions";
5+import { recommendContextualTeams } from "@/src/lib/contextualEngine";
6+import {
7+ classRanksForActiveClass,
8+ editClassRank,
9+ planCompanion,
10+} from "@/src/lib/engine";
11+import type {
12+ CompanionPlan,
13+ ContextualRecommendationRequest,
14+ ContextualTeamRecommendation,
15+ CuratedCompanionBuild,
16+ RosterMember,
17+} from "@/src/lib/types";
18+
19+/**
20+ * Fixed companion contract: emitted legal kits, progression precedence,
21+ * companion-only TP cap and invariance through both public planning paths.
22+ */
23+
24+const tpCostingArtNames: Record<string, true> = {};
25+/** Verified per-Art weapon from the research fact table (issue #1 requires it on every selection). */
26+const weaponByArtName: Record<string, string> = {};
27+for (const art of artEffectsData.arts as {
28+ name: string;
29+ weapon: string;
30+ effects: { tp: boolean };
31+}[]) {
32+ if (art.effects.tp) tpCostingArtNames[art.name] = true;
33+ weaponByArtName[art.name] = art.weapon;
34+}
35+
36+type CompanionFact = (typeof companions)[number];
37+type Kit = { arts: string[]; skills: string[] };
38+
39+function kitOf(member: Pick<RosterMember, "arts" | "skills">): Kit {
40+ return {
41+ arts: member.arts.map((art) => art.name),
42+ skills: member.skills.map((skill) => skill.name),
43+ };
44+}
45+
46+/** Every rank at or around an unlock boundary, plus out-of-range clamps. */
47+function rankSamples(companion: CompanionFact): number[] {
48+ const ranks = new Set<number>([0, companion.startRank, companion.maxRank, 99]);
49+ for (const art of companion.arts) {
50+ ranks.add(art.rank);
51+ ranks.add(Math.max(0, art.rank - 1));
52+ }
53+ for (const skill of companion.skills) {
54+ ranks.add(skill.rank);
55+ ranks.add(Math.max(0, skill.rank - 1));
56+ }
57+ return [...ranks].sort((left, right) => left - right);
58+}
59+
60+function expectedPersonalRank(companion: CompanionFact, requested: number): number {
61+ if (!Number.isFinite(requested)) return companion.startRank;
62+ return Math.max(
63+ companion.startRank,
64+ Math.min(companion.maxRank, Math.trunc(requested)),
65+ );
66+}
67+
68+function assertLegalKit(
69+ plan: CompanionPlan,
70+ companion: CompanionFact,
71+ context: string,
72+): void {
73+ assert.equal(plan.name, companion.name, `${context}: wrong companion`);
74+ const artNames = plan.arts.map((art) => art.name);
75+ const skillNames = plan.skills.map((skill) => skill.name);
76+ assert.equal(
77+ new Set(artNames).size,
78+ artNames.length,
79+ `${context}: duplicate Arts (${artNames.join(", ")})`,
80+ );
81+ assert.equal(
82+ new Set(skillNames).size,
83+ skillNames.length,
84+ `${context}: duplicate Skills (${skillNames.join(", ")})`,
85+ );
86+ assert.ok(artNames.length >= 1, `${context}: expected at least one Art`);
87+ assert.ok(
88+ artNames.length <= 8,
89+ `${context}: ${artNames.length} Arts exceeds the eight-slot limit`,
90+ );
91+ assert.ok(
92+ skillNames.length <= plan.skillSlots,
93+ `${context}: ${skillNames.length} Skills exceeds the ${plan.skillSlots}-slot limit`,
94+ );
95+ assert.equal(
96+ plan.skillSlots,
97+ companion.skillSlots,
98+ `${context}: wrong Skill slot count`,
99+ );
100+ for (const art of plan.arts) {
101+ const fact = companion.arts.find((entry) => entry.name === art.name);
102+ assert.ok(fact, `${context}: Art "${art.name}" is not in ${companion.name}'s kit`);
103+ assert.equal(
104+ art.unlockRank,
105+ fact.rank,
106+ `${context}: Art "${art.name}" reports wrong unlock rank`,
107+ );
108+ assert.ok(
109+ fact.rank <= plan.personalRank,
110+ `${context}: Art "${art.name}" unlocks at rank ${fact.rank}, above personal rank ${plan.personalRank}`,
111+ );
112+ assert.ok(
113+ art.recommendedLevel >= 1 && art.recommendedLevel <= 5,
114+ `${context}: Art "${art.name}" recommends upgrade level ${art.recommendedLevel} outside 1..5`,
115+ );
116+ assert.ok(
117+ weaponByArtName[art.name] !== undefined,
118+ `${context}: Art "${art.name}" has no weapon record in the research fact table`,
119+ );
120+ assert.ok(
121+ art.weapon === weaponByArtName[art.name],
122+ `${context}: Art "${art.name}" claims weapon "${art.weapon}" but the research fact table verifies "${weaponByArtName[art.name]}"`,
123+ );
124+ assert.ok(
125+ art.weapon === companion.ranged || art.weapon === companion.melee,
126+ `${context}: Art "${art.name}" claims weapon "${art.weapon}" outside ${companion.name}'s ${companion.ranged}/${companion.melee}`,
127+ );
128+ }
129+ for (const skill of plan.skills) {
130+ const fact = companion.skills.find((entry) => entry.name === skill.name);
131+ assert.ok(fact, `${context}: Skill "${skill.name}" is not in ${companion.name}'s kit`);
132+ assert.equal(
133+ skill.unlockRank,
134+ fact.rank,
135+ `${context}: Skill "${skill.name}" reports wrong unlock rank`,
136+ );
137+ assert.ok(
138+ fact.rank <= plan.personalRank,
139+ `${context}: Skill "${skill.name}" unlocks at rank ${fact.rank}, above personal rank ${plan.personalRank}`,
140+ );
141+ assert.ok(
142+ skill.recommendedLevel >= 1 && skill.recommendedLevel <= 5,
143+ `${context}: Skill "${skill.name}" recommends upgrade level ${skill.recommendedLevel} outside 1..5`,
144+ );
145+ }
146+}
147+
148+function requestFor(
149+ overrides: Partial<ContextualRecommendationRequest> = {},
150+): ContextualRecommendationRequest {
151+ return {
152+ slots: ["Doug", "", ""],
153+ activeClassId: "duelist",
154+ avatarLevel: 30,
155+ classRanks: editClassRank(classRanksForActiveClass("duelist", {}), "duelist", 10),
156+ personalRanks: [20, 20, 20],
157+ combatMode: "general",
158+ hasSkellLicense: false,
159+ postgameFrames: false,
160+ assumeSpecialUnlocks: false,
161+ lang: "en",
162+ ...overrides,
163+ };
164+}
165+
166+function recommendationsOrThrow(
167+ request: ContextualRecommendationRequest,
168+ context: string,
169+): readonly ContextualTeamRecommendation[] {
170+ const result = recommendContextualTeams(request);
171+ assert.equal(result.kind, "success", `${context}: recommendations became infeasible`);
172+ if (result.kind !== "success") return [];
173+ return result.recommendations;
174+}
175+
176+function kitsByCompanion(
177+ request: ContextualRecommendationRequest,
178+ context: string,
179+): Map<string, Kit> {
180+ const kits = new Map<string, Kit>();
181+ for (const recommendation of recommendationsOrThrow(request, context)) {
182+ for (const member of recommendation.roster) {
183+ if (member.kind !== "companion") continue;
184+ const kit = kitOf(member);
185+ const seen = kits.get(member.name);
186+ assert.deepEqual(
187+ seen ?? kit,
188+ kit,
189+ `${context}: ${member.name} received different kits across variants/placements`,
190+ );
191+ kits.set(member.name, kit);
192+ }
193+ }
194+ return kits;
195+}
196+
197+test("the companion roster covers the 22 non-Cross characters exactly once", () => {
198+ const names = companions.map((companion) => companion.name);
199+ assert.equal(companions.length, 22, "the roster must cover all 22 non-Cross characters");
200+ assert.equal(new Set(names).size, 22, "companion names must be unique");
201+ assert.ok(!names.includes("Cross"), "Cross must not be part of the companion roster");
202+ for (const name of names) {
203+ assert.ok(companionByName.get(name), `companionByName must index ${name}`);
204+ }
205+});
206+
207+test("every companion plan selects only legal, unlocked, unique Arts and Skills", () => {
208+ for (const companion of companions) {
209+ for (const level of [1, 30, 60, 99]) {
210+ for (const requestedRank of rankSamples(companion)) {
211+ const context = `${companion.name} level ${level} requested rank ${requestedRank}`;
212+ const plan = planCompanion(companion.name, level, requestedRank);
213+ assert.equal(
214+ plan.personalRank,
215+ expectedPersonalRank(companion, requestedRank),
216+ `${context}: personal rank is not clamped to the companion's own progression`,
217+ );
218+ assertLegalKit(plan, companion, context);
219+ }
220+ }
221+ }
222+});
223+
224+test("companion loadouts keep at most two TP-consuming Arts", () => {
225+ for (const companion of companions) {
226+ for (const requestedRank of [companion.startRank, 10, companion.maxRank, 99]) {
227+ const plan = planCompanion(companion.name, 30, requestedRank);
228+ const tpArts = plan.arts.filter((art) => tpCostingArtNames[art.name]);
229+ assert.ok(
230+ tpArts.length <= 2,
231+ `${companion.name} at personal rank ${plan.personalRank} carries ${tpArts.length} TP-costing Arts (strict max 2): ${tpArts.map((art) => art.name).join(", ")}`,
232+ );
233+ }
234+ }
235+});
236+
237+test("Celica fills unlocked progression slots with useful non-TP Arts", () => {
238+ const rankSix = planCompanion("Celica", 30, 6).arts.map((art) => art.name);
239+ const rankTen = planCompanion("Celica", 30, 10).arts.map((art) => art.name);
240+ assert.ok(rankSix.includes("Violent Streak"));
241+ assert.equal(rankSix.length, 7);
242+ assert.ok(rankTen.includes("Violent Streak"));
243+ assert.equal(rankTen.length, 8);
244+});
245+
246+test("Al includes his unlocked physical-resistance Art in the early bar", () => {
247+ const arts = planCompanion("Al", 50, 3).arts.map((art) => art.name);
248+ assert.equal(arts.length, 4);
249+ assert.ok(arts.includes("Magnum Edge"));
250+});
251+
252+test("Skell mode keeps the canonical ground Skills instead of substituting them", () => {
253+ const ground = kitsByCompanion(
254+ requestFor({ combatMode: "general" }),
255+ "general mode",
256+ );
257+ const skell = kitsByCompanion(requestFor({ combatMode: "skell" }), "skell mode");
258+ assert.ok(ground.has("Doug"), "Doug must appear in the general-mode roster");
259+ assert.ok(skell.has("Doug"), "Doug must appear in the skell-mode roster");
260+ for (const [name, kit] of ground) {
261+ const skellKit = skell.get(name);
262+ // Team composition may legitimately differ across modes; kits may not.
263+ if (!skellKit) continue;
264+ assert.deepEqual(
265+ skellKit.skills,
266+ kit.skills,
267+ `${name}: Skell mode must not substitute canonical ground Skills`,
268+ );
269+ assert.deepEqual(
270+ skellKit.arts,
271+ kit.arts,
272+ `${name}: Skell mode must not change the Arts loadout`,
273+ );
274+ const companion = companionByName.get(name);
275+ assert.ok(companion, `unknown roster companion ${name}`);
276+ for (const skillName of skellKit.skills) {
277+ const fact = companion.skills.find((entry) => entry.name === skillName);
278+ assert.ok(
279+ fact && fact.rank <= 20,
280+ `${name}: Skill "${skillName}" equipped in Skell mode is illegal at personal rank 20`,
281+ );
282+ }
283+ }
284+});
285+
286+test("companion kits stay fixed across Cross classes, ranks, weapons, teammates and placements", () => {
287+ const configurations: ContextualRecommendationRequest[] = [
288+ requestFor(),
289+ requestFor({
290+ activeClassId: "galactic-knight",
291+ classRanks: editClassRank(
292+ classRanksForActiveClass("galactic-knight", {}),
293+ "galactic-knight",
294+ 10,
295+ ),
296+ }),
297+ requestFor({
298+ classRanks: editClassRank(classRanksForActiveClass("duelist", {}), "duelist", 5),
299+ }),
300+ requestFor({
301+ activeClassId: "galactic-knight",
302+ // Tier-4 mastery on BOTH branches: galactic-knight active (beam Arts)
303+ // plus full-metal-jaguar rank 10 so the Photon Saber override is legal.
304+ classRanks: editClassRank(
305+ editClassRank(
306+ classRanksForActiveClass("galactic-knight", {}),
307+ "galactic-knight",
308+ 10,
309+ ),
310+ "full-metal-jaguar",
311+ 10,
312+ ),
313+ avatarLevel: 60,
314+ weaponOverrides: { ranged: "Dual Guns", melee: "Photon Saber" },
315+ }),
316+ requestFor({ avatarLevel: 50 }),
317+ requestFor({ slots: ["", "Doug", ""] }),
318+ requestFor({ slots: ["", "", "Doug"] }),
319+ requestFor({ slots: ["", "", ""] }),
320+ ];
321+ const kits = new Map<string, Kit>();
322+ for (const [index, request] of configurations.entries()) {
323+ for (const [name, kit] of kitsByCompanion(request, `configuration #${index + 1}`)) {
324+ const seen = kits.get(name);
325+ assert.deepEqual(
326+ seen ?? kit,
327+ kit,
328+ `${name}: kit changed when the Cross configuration, teammates or placement changed`,
329+ );
330+ kits.set(name, kit);
331+ }
332+ }
333+ assert.ok(kits.has("Doug"), "Doug must appear in at least one roster");
334+ for (const [name, kit] of kits) {
335+ const direct = planCompanion(name, 30, 20);
336+ assert.deepEqual(
337+ kit.arts,
338+ direct.arts.map((art) => art.name),
339+ `${name}: roster Arts must match the direct companion planner`,
340+ );
341+ assert.deepEqual(
342+ kit.skills,
343+ direct.skills.map((skill) => skill.name),
344+ `${name}: roster Skills must match the direct companion planner`,
345+ );
346+ }
347+});
348+
349+test("companion planning is deterministic and clamps out-of-range ranks", () => {
350+ for (const companion of companions) {
351+ const canonical = planCompanion(companion.name, 30, companion.maxRank);
352+ assert.deepEqual(
353+ planCompanion(companion.name, 30, companion.maxRank),
354+ canonical,
355+ `${companion.name}: repeated planning at equal progression differs`,
356+ );
357+ const above = planCompanion(companion.name, 30, 99);
358+ assert.equal(above.personalRank, companion.maxRank);
359+ assert.deepEqual(
360+ above.arts.map((art) => art.name),
361+ canonical.arts.map((art) => art.name),
362+ `${companion.name}: ranks above maxRank must not change the Arts`,
363+ );
364+ const below = planCompanion(companion.name, 30, 0);
365+ assert.equal(below.personalRank, companion.startRank);
366+ assert.deepEqual(
367+ below.arts.map((art) => art.name),
368+ planCompanion(companion.name, 30, companion.startRank).arts.map((art) => art.name),
369+ `${companion.name}: ranks below startRank must not change the Arts`,
370+ );
371+ }
372+});
373+
374+test("language only changes presentation, never the loadout", () => {
375+ for (const companion of companions) {
376+ const english = planCompanion(companion.name, 30, companion.maxRank, "en");
377+ const french = planCompanion(companion.name, 30, companion.maxRank, "fr");
378+ assert.deepEqual(
379+ french.arts.map((art) => art.name),
380+ english.arts.map((art) => art.name),
381+ `${companion.name}: Arts changed between languages`,
382+ );
383+ assert.deepEqual(
384+ french.skills.map((skill) => skill.name),
385+ english.skills.map((skill) => skill.name),
386+ `${companion.name}: Skills changed between languages`,
387+ );
388+ }
389+});
390+
391+test("every companion exposes a curated fixed build with sourced equipment advice", () => {
392+ for (const companion of companions) {
393+ const plan = planCompanion(companion.name, 30, companion.maxRank);
394+ const curated: CuratedCompanionBuild = plan.curatedBuild;
395+ assert.ok(
396+ curated.arts.length >= 1,
397+ `${companion.name}: curated build lists no Arts`,
398+ );
399+ assert.equal(
400+ new Set(curated.arts).size,
401+ curated.arts.length,
402+ `${companion.name}: curated Arts contain duplicates`,
403+ );
404+ assert.equal(
405+ new Set(curated.skills).size,
406+ curated.skills.length,
407+ `${companion.name}: curated Skills contain duplicates`,
408+ );
409+ const curatedTpArts = curated.arts.filter(
410+ (art) => tpCostingArtNames[art],
411+ );
412+ assert.ok(
413+ curatedTpArts.length <= 2,
414+ `${companion.name}: curated build lists ${curatedTpArts.length} TP-costing Arts (max 2): ${curatedTpArts.join(", ")}`,
415+ );
416+ const artUniverse = new Set([...curated.arts, ...curated.artSubstitutes]);
417+ for (const art of plan.arts) {
418+ assert.ok(
419+ artUniverse.has(art.name),
420+ `${companion.name}: equipped Art "${art.name}" is outside the curated build and its substitutes`,
421+ );
422+ }
423+ const skillUniverse = new Set([
424+ ...curated.skills,
425+ ...curated.skillSubstitutes,
426+ ]);
427+ for (const skill of plan.skills) {
428+ assert.ok(
429+ skillUniverse.has(skill.name),
430+ `${companion.name}: equipped Skill "${skill.name}" is outside the curated build and its substitutes`,
431+ );
432+ }
433+ for (const key of ["role", "rationale"] as const) {
434+ const text = curated[key];
435+ assert.ok(
436+ text.length === 2 && text.every((part) => part.length > 0),
437+ `${companion.name}: curated ${key} must be present in English and French`,
438+ );
439+ }
440+ for (const key of ["weapons", "armor", "availability"] as const) {
441+ const text = curated.equipment[key];
442+ assert.ok(
443+ text.length === 2 && text.every((part) => part.length > 0),
444+ `${companion.name}: curated equipment ${key} must be present in English and French`,
445+ );
446+ }
447+ assert.ok(
448+ curated.sources.length >= 1,
449+ `${companion.name}: curated build cites no sources`,
450+ );
451+ for (const source of curated.sources) {
452+ assert.ok(
453+ /^https?:\/\//.test(source.url),
454+ `${companion.name}: source "${source.label}" has no URL`,
455+ );
456+ assert.ok(
457+ source.edition === "DE" || source.edition === "XCX" || source.edition === "both",
458+ `${companion.name}: source "${source.label}" must declare its game edition`,
459+ );
460+ }
461+ }
462+});
463+
464+test("companion kits change only when a progression rank unlocks something", () => {
465+ for (const companion of companions) {
466+ const unlockRanks = new Set<number>([
467+ ...companion.arts.map((art) => art.rank),
468+ ...companion.skills.map((skill) => skill.rank),
469+ ]);
470+ for (let rank = companion.startRank; rank < companion.maxRank; rank += 1) {
471+ if (unlockRanks.has(rank + 1)) continue;
472+ const before = planCompanion(companion.name, 30, rank);
473+ const after = planCompanion(companion.name, 30, rank + 1);
474+ assert.deepEqual(
475+ after.arts.map((art) => art.name),
476+ before.arts.map((art) => art.name),
477+ `${companion.name}: Arts changed between ranks ${rank} and ${rank + 1} although nothing unlocks there`,
478+ );
479+ assert.deepEqual(
480+ after.skills.map((skill) => skill.name),
481+ before.skills.map((skill) => skill.name),
482+ `${companion.name}: Skills changed between ranks ${rank} and ${rank + 1} although nothing unlocks there`,
483+ );
484+ }
485+ }
486+});
487+
488+test("curated canonical Arts take precedence over substitutes once they unlock", () => {
489+ let assertedBoundaries = 0;
490+ for (const companion of companions) {
491+ const plan = planCompanion(companion.name, 30, companion.maxRank);
492+ const curated: CuratedCompanionBuild = plan.curatedBuild;
493+ /** Canonical Art -> unlock rank, proving every curated canonical is a real fact. */
494+ const unlockRankByCanonical = new Map<string, number>();
495+ for (const name of curated.arts) {
496+ const fact = companion.arts.find((art) => art.name === name);
497+ assert.ok(
498+ fact !== undefined,
499+ `${companion.name}: curated canonical Art "${name}" is not an unlockable Art of the character`,
500+ );
501+ unlockRankByCanonical.set(name, fact.rank);
502+ }
503+ // Substitutes stay legal Arts of the character's own weapon families.
504+ for (const name of curated.artSubstitutes) {
505+ const weapon = weaponByArtName[name];
506+ assert.ok(
507+ weapon !== undefined,
508+ `${companion.name}: substitute Art "${name}" is missing from the research fact table`,
509+ );
510+ assert.ok(
511+ weapon === companion.ranged || weapon === companion.melee,
512+ `${companion.name}: substitute Art "${name}" needs ${weapon}, outside ${companion.name}'s ${companion.ranged}/${companion.melee}`,
513+ );
514+ }
515+ for (const [art, rank] of unlockRankByCanonical) {
516+ if (rank <= companion.startRank) continue;
517+ // With more canonical Arts unlocked than loadout slots, some omission
518+ // is unavoidable and no precedence claim is possible for a specific Art.
519+ const canonicalsAvailable = [...unlockRankByCanonical.values()].filter(
520+ (unlockRank) => unlockRank <= rank,
521+ ).length;
522+ if (canonicalsAvailable > 8) continue;
523+ const after = planCompanion(companion.name, 30, rank).arts.map(
524+ (selection) => selection.name,
525+ );
526+ const canonicalTpArts = after.filter((name) => {
527+ const canonicalRank = unlockRankByCanonical.get(name);
528+ return tpCostingArtNames[name] && canonicalRank !== undefined && canonicalRank <= rank;
529+ });
530+ // Two canonical TP Arts already reserve the TP budget: the freshly
531+ // unlocked TP Art may legitimately stay out in favour of non-TP filler.
532+ const tpBudgetReserved =
533+ Boolean(tpCostingArtNames[art]) &&
534+ canonicalTpArts.length >= 2 &&
535+ !after.includes(art);
536+ if (tpBudgetReserved) continue;
537+ assert.ok(
538+ after.includes(art),
539+ `${companion.name}: canonical "${art}" unlocks at rank ${rank} but the plan still serves substitutes`,
540+ );
541+ assertedBoundaries += 1;
542+ }
543+ }
544+ assert.ok(
545+ assertedBoundaries >= 1,
546+ "no companion exercised a canonical unlock boundary; the precedence contract is untested",
547+ );
548+});
549+
550+test("Phog replaces his first progression filler with Side Slash at rank 5", () => {
551+ const before = planCompanion("Phog", 30, 4);
552+ const after = planCompanion("Phog", 30, 5);
553+ assert.equal(before.arts[3]?.name, "Upper Hand");
554+ assert.equal(after.arts[3]?.name, "Side Slash");
555+ assert.equal(planCompanion("Phog", 30, 10).skills[0]?.name, "Agile Gunslinger");
556+ assert.equal(planCompanion("Phog", 30, 11).skills[0]?.name, "Background Noise");
557+});
modified src/lib/types.ts +25 -2
@@ -3,6 +3,29 @@ export type Lang = "en" | "fr";
33 /** Bilingual label: [English, French] — game terms in official English first. */
44 export type LocalizedText = readonly [string, string];
55
6+export interface CompanionBuildSource {
7+ label: string;
8+ url: string;
9+ edition: "DE" | "XCX" | "both";
10+}
11+
12+export interface CompanionEquipmentAdvice {
13+ weapons: LocalizedText;
14+ armor: LocalizedText;
15+ availability: LocalizedText;
16+}
17+
18+export interface CuratedCompanionBuild {
19+ role: LocalizedText;
20+ rationale: LocalizedText;
21+ arts: readonly string[];
22+ skills: readonly string[];
23+ artSubstitutes: readonly string[];
24+ skillSubstitutes: readonly string[];
25+ equipment: CompanionEquipmentAdvice;
26+ sources: readonly CompanionBuildSource[];
27+}
28+
629 export interface ClassEntry {
730 id: string;
831 en: string;
@@ -162,8 +185,7 @@ export interface CompanionPlan {
162185 strategy: StrategyKey;
163186 capabilities: CapabilityVector;
164187 arts: readonly ArtSelection[];
165- /** Unbudgeted top-Arts pool; role scoring uses potential while display respects the TP budget. */
166- potentialArts: readonly ArtSelection[];
188+ curatedBuild: CuratedCompanionBuild;
167189 skills: readonly SkillSelection[];
168190 skillSlots: number;
169191 note: LocalizedText;
@@ -212,6 +234,7 @@ export interface RosterMember {
212234 skillSlots: number;
213235 strategy: StrategyKey;
214236 note: LocalizedText;
237+ curatedBuild?: CuratedCompanionBuild;
215238 planReasons: readonly string[];
216239 source?: string;
217240 }
@@ -3,6 +3,29 @@ export type Lang = "en" | "fr";
3 /** Bilingual label: [English, French] — game terms in official English first. */3 /** Bilingual label: [English, French] — game terms in official English first. */
4 export type LocalizedText = readonly [string, string];4 export type LocalizedText = readonly [string, string];
5 5
6+export interface CompanionBuildSource {
7+ label: string;
8+ url: string;
9+ edition: "DE" | "XCX" | "both";
10+}
11+
12+export interface CompanionEquipmentAdvice {
13+ weapons: LocalizedText;
14+ armor: LocalizedText;
15+ availability: LocalizedText;
16+}
17+
18+export interface CuratedCompanionBuild {
19+ role: LocalizedText;
20+ rationale: LocalizedText;
21+ arts: readonly string[];
22+ skills: readonly string[];
23+ artSubstitutes: readonly string[];
24+ skillSubstitutes: readonly string[];
25+ equipment: CompanionEquipmentAdvice;
26+ sources: readonly CompanionBuildSource[];
27+}
28+
6 export interface ClassEntry {29 export interface ClassEntry {
7 id: string;30 id: string;
8 en: string;31 en: string;
@@ -162,8 +185,7 @@ export interface CompanionPlan {
162 strategy: StrategyKey;185 strategy: StrategyKey;
163 capabilities: CapabilityVector;186 capabilities: CapabilityVector;
164 arts: readonly ArtSelection[];187 arts: readonly ArtSelection[];
165- /** Unbudgeted top-Arts pool; role scoring uses potential while display respects the TP budget. */188+ curatedBuild: CuratedCompanionBuild;
166- potentialArts: readonly ArtSelection[];
167 skills: readonly SkillSelection[];189 skills: readonly SkillSelection[];
168 skillSlots: number;190 skillSlots: number;
169 note: LocalizedText;191 note: LocalizedText;
@@ -212,6 +234,7 @@ export interface RosterMember {
212 skillSlots: number;234 skillSlots: number;
213 strategy: StrategyKey;235 strategy: StrategyKey;
214 note: LocalizedText;236 note: LocalizedText;
237+ curatedBuild?: CuratedCompanionBuild;
215 planReasons: readonly string[];238 planReasons: readonly string[];
216 source?: string;239 source?: string;
217 }240 }
deleted tsconfig.tsbuildinfo +0 -1
deleted file mode 100644
@@ -1 +0,0 @@
1-{"fileNames":["./node_modules/typescript/lib/lib.es5.d.ts","./node_modules/typescript/lib/lib.es2015.d.ts","./node_modules/typescript/lib/lib.es2016.d.ts","./node_modules/typescript/lib/lib.es2017.d.ts","./node_modules/typescript/lib/lib.es2018.d.ts","./node_modules/typescript/lib/lib.es2019.d.ts","./node_modules/typescript/lib/lib.es2020.d.ts","./node_modules/typescript/lib/lib.es2021.d.ts","./node_modules/typescript/lib/lib.es2022.d.ts","./node_modules/typescript/lib/lib.es2023.d.ts","./node_modules/typescript/lib/lib.es2024.d.ts","./node_modules/typescript/lib/lib.esnext.d.ts","./node_modules/typescript/lib/lib.dom.d.ts","./node_modules/typescript/lib/lib.dom.iterable.d.ts","./node_modules/typescript/lib/lib.es2015.core.d.ts","./node_modules/typescript/lib/lib.es2015.collection.d.ts","./node_modules/typescript/lib/lib.es2015.generator.d.ts","./node_modules/typescript/lib/lib.es2015.iterable.d.ts","./node_modules/typescript/lib/lib.es2015.promise.d.ts","./node_modules/typescript/lib/lib.es2015.proxy.d.ts","./node_modules/typescript/lib/lib.es2015.reflect.d.ts","./node_modules/typescript/lib/lib.es2015.symbol.d.ts","./node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","./node_modules/typescript/lib/lib.es2016.array.include.d.ts","./node_modules/typescript/lib/lib.es2016.intl.d.ts","./node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts","./node_modules/typescript/lib/lib.es2017.date.d.ts","./node_modules/typescript/lib/lib.es2017.object.d.ts","./node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","./node_modules/typescript/lib/lib.es2017.string.d.ts","./node_modules/typescript/lib/lib.es2017.intl.d.ts","./node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","./node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","./node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","./node_modules/typescript/lib/lib.es2018.intl.d.ts","./node_modules/typescript/lib/lib.es2018.promise.d.ts","./node_modules/typescript/lib/lib.es2018.regexp.d.ts","./node_modules/typescript/lib/lib.es2019.array.d.ts","./node_modules/typescript/lib/lib.es2019.object.d.ts","./node_modules/typescript/lib/lib.es2019.string.d.ts","./node_modules/typescript/lib/lib.es2019.symbol.d.ts","./node_modules/typescript/lib/lib.es2019.intl.d.ts","./node_modules/typescript/lib/lib.es2020.bigint.d.ts","./node_modules/typescript/lib/lib.es2020.date.d.ts","./node_modules/typescript/lib/lib.es2020.promise.d.ts","./node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","./node_modules/typescript/lib/lib.es2020.string.d.ts","./node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","./node_modules/typescript/lib/lib.es2020.intl.d.ts","./node_modules/typescript/lib/lib.es2020.number.d.ts","./node_modules/typescript/lib/lib.es2021.promise.d.ts","./node_modules/typescript/lib/lib.es2021.string.d.ts","./node_modules/typescript/lib/lib.es2021.weakref.d.ts","./node_modules/typescript/lib/lib.es2021.intl.d.ts","./node_modules/typescript/lib/lib.es2022.array.d.ts","./node_modules/typescript/lib/lib.es2022.error.d.ts","./node_modules/typescript/lib/lib.es2022.intl.d.ts","./node_modules/typescript/lib/lib.es2022.object.d.ts","./node_modules/typescript/lib/lib.es2022.string.d.ts","./node_modules/typescript/lib/lib.es2022.regexp.d.ts","./node_modules/typescript/lib/lib.es2023.array.d.ts","./node_modules/typescript/lib/lib.es2023.collection.d.ts","./node_modules/typescript/lib/lib.es2023.intl.d.ts","./node_modules/typescript/lib/lib.es2024.arraybuffer.d.ts","./node_modules/typescript/lib/lib.es2024.collection.d.ts","./node_modules/typescript/lib/lib.es2024.object.d.ts","./node_modules/typescript/lib/lib.es2024.promise.d.ts","./node_modules/typescript/lib/lib.es2024.regexp.d.ts","./node_modules/typescript/lib/lib.es2024.sharedmemory.d.ts","./node_modules/typescript/lib/lib.es2024.string.d.ts","./node_modules/typescript/lib/lib.esnext.array.d.ts","./node_modules/typescript/lib/lib.esnext.collection.d.ts","./node_modules/typescript/lib/lib.esnext.intl.d.ts","./node_modules/typescript/lib/lib.esnext.disposable.d.ts","./node_modules/typescript/lib/lib.esnext.promise.d.ts","./node_modules/typescript/lib/lib.esnext.decorators.d.ts","./node_modules/typescript/lib/lib.esnext.iterator.d.ts","./node_modules/typescript/lib/lib.esnext.float16.d.ts","./node_modules/typescript/lib/lib.esnext.error.d.ts","./node_modules/typescript/lib/lib.esnext.sharedmemory.d.ts","./node_modules/typescript/lib/lib.decorators.d.ts","./node_modules/typescript/lib/lib.decorators.legacy.d.ts","./node_modules/@types/react/global.d.ts","./node_modules/csstype/index.d.ts","./node_modules/@types/react/index.d.ts","./node_modules/next/dist/styled-jsx/types/css.d.ts","./node_modules/next/dist/styled-jsx/types/macro.d.ts","./node_modules/next/dist/styled-jsx/types/style.d.ts","./node_modules/next/dist/styled-jsx/types/global.d.ts","./node_modules/next/dist/styled-jsx/types/index.d.ts","./node_modules/next/dist/server/get-page-files.d.ts","./node_modules/@types/node/compatibility/disposable.d.ts","./node_modules/@types/node/compatibility/indexable.d.ts","./node_modules/@types/node/compatibility/iterators.d.ts","./node_modules/@types/node/compatibility/index.d.ts","./node_modules/@types/node/globals.typedarray.d.ts","./node_modules/@types/node/buffer.buffer.d.ts","./node_modules/@types/node/globals.d.ts","./node_modules/@types/node/web-globals/abortcontroller.d.ts","./node_modules/@types/node/web-globals/domexception.d.ts","./node_modules/@types/node/web-globals/events.d.ts","./node_modules/undici-types/header.d.ts","./node_modules/undici-types/readable.d.ts","./node_modules/undici-types/file.d.ts","./node_modules/undici-types/fetch.d.ts","./node_modules/undici-types/formdata.d.ts","./node_modules/undici-types/connector.d.ts","./node_modules/undici-types/client.d.ts","./node_modules/undici-types/errors.d.ts","./node_modules/undici-types/dispatcher.d.ts","./node_modules/undici-types/global-dispatcher.d.ts","./node_modules/undici-types/global-origin.d.ts","./node_modules/undici-types/pool-stats.d.ts","./node_modules/undici-types/pool.d.ts","./node_modules/undici-types/handlers.d.ts","./node_modules/undici-types/balanced-pool.d.ts","./node_modules/undici-types/agent.d.ts","./node_modules/undici-types/mock-interceptor.d.ts","./node_modules/undici-types/mock-agent.d.ts","./node_modules/undici-types/mock-client.d.ts","./node_modules/undici-types/mock-pool.d.ts","./node_modules/undici-types/mock-errors.d.ts","./node_modules/undici-types/proxy-agent.d.ts","./node_modules/undici-types/env-http-proxy-agent.d.ts","./node_modules/undici-types/retry-handler.d.ts","./node_modules/undici-types/retry-agent.d.ts","./node_modules/undici-types/api.d.ts","./node_modules/undici-types/interceptors.d.ts","./node_modules/undici-types/util.d.ts","./node_modules/undici-types/cookies.d.ts","./node_modules/undici-types/patch.d.ts","./node_modules/undici-types/websocket.d.ts","./node_modules/undici-types/eventsource.d.ts","./node_modules/undici-types/filereader.d.ts","./node_modules/undici-types/diagnostics-channel.d.ts","./node_modules/undici-types/content-type.d.ts","./node_modules/undici-types/cache.d.ts","./node_modules/undici-types/index.d.ts","./node_modules/@types/node/web-globals/fetch.d.ts","./node_modules/@types/node/web-globals/navigator.d.ts","./node_modules/@types/node/web-globals/storage.d.ts","./node_modules/@types/node/web-globals/streams.d.ts","./node_modules/@types/node/assert.d.ts","./node_modules/@types/node/assert/strict.d.ts","./node_modules/@types/node/async_hooks.d.ts","./node_modules/@types/node/buffer.d.ts","./node_modules/@types/node/child_process.d.ts","./node_modules/@types/node/cluster.d.ts","./node_modules/@types/node/console.d.ts","./node_modules/@types/node/constants.d.ts","./node_modules/@types/node/crypto.d.ts","./node_modules/@types/node/dgram.d.ts","./node_modules/@types/node/diagnostics_channel.d.ts","./node_modules/@types/node/dns.d.ts","./node_modules/@types/node/dns/promises.d.ts","./node_modules/@types/node/domain.d.ts","./node_modules/@types/node/events.d.ts","./node_modules/@types/node/fs.d.ts","./node_modules/@types/node/fs/promises.d.ts","./node_modules/@types/node/http.d.ts","./node_modules/@types/node/http2.d.ts","./node_modules/@types/node/https.d.ts","./node_modules/@types/node/inspector.d.ts","./node_modules/@types/node/inspector.generated.d.ts","./node_modules/@types/node/module.d.ts","./node_modules/@types/node/net.d.ts","./node_modules/@types/node/os.d.ts","./node_modules/@types/node/path.d.ts","./node_modules/@types/node/perf_hooks.d.ts","./node_modules/@types/node/process.d.ts","./node_modules/@types/node/punycode.d.ts","./node_modules/@types/node/querystring.d.ts","./node_modules/@types/node/readline.d.ts","./node_modules/@types/node/readline/promises.d.ts","./node_modules/@types/node/repl.d.ts","./node_modules/@types/node/sea.d.ts","./node_modules/@types/node/sqlite.d.ts","./node_modules/@types/node/stream.d.ts","./node_modules/@types/node/stream/promises.d.ts","./node_modules/@types/node/stream/consumers.d.ts","./node_modules/@types/node/stream/web.d.ts","./node_modules/@types/node/string_decoder.d.ts","./node_modules/@types/node/test.d.ts","./node_modules/@types/node/timers.d.ts","./node_modules/@types/node/timers/promises.d.ts","./node_modules/@types/node/tls.d.ts","./node_modules/@types/node/trace_events.d.ts","./node_modules/@types/node/tty.d.ts","./node_modules/@types/node/url.d.ts","./node_modules/@types/node/util.d.ts","./node_modules/@types/node/v8.d.ts","./node_modules/@types/node/vm.d.ts","./node_modules/@types/node/wasi.d.ts","./node_modules/@types/node/worker_threads.d.ts","./node_modules/@types/node/zlib.d.ts","./node_modules/@types/node/index.d.ts","./node_modules/@types/react/canary.d.ts","./node_modules/@types/react/experimental.d.ts","./node_modules/@types/react-dom/index.d.ts","./node_modules/@types/react-dom/canary.d.ts","./node_modules/@types/react-dom/experimental.d.ts","./node_modules/next/dist/lib/fallback.d.ts","./node_modules/next/dist/compiled/webpack/webpack.d.ts","./node_modules/next/dist/shared/lib/modern-browserslist-target.d.ts","./node_modules/next/dist/shared/lib/entry-constants.d.ts","./node_modules/next/dist/shared/lib/constants.d.ts","./node_modules/next/dist/lib/bundler.d.ts","./node_modules/next/dist/server/config.d.ts","./node_modules/next/dist/lib/load-custom-routes.d.ts","./node_modules/next/dist/shared/lib/image-config.d.ts","./node_modules/next/dist/build/webpack/plugins/subresource-integrity-plugin.d.ts","./node_modules/next/dist/server/body-streams.d.ts","./node_modules/next/dist/server/request/search-params.d.ts","./node_modules/next/dist/shared/lib/segment-cache/vary-params-decoding.d.ts","./node_modules/next/dist/server/app-render/vary-params.d.ts","./node_modules/next/dist/server/request/params.d.ts","./node_modules/next/dist/server/route-kind.d.ts","./node_modules/next/dist/server/route-definitions/route-definition.d.ts","./node_modules/next/dist/server/route-matches/route-match.d.ts","./node_modules/next/dist/client/components/app-router-headers.d.ts","./node_modules/next/dist/server/lib/cache-control.d.ts","./node_modules/next/dist/shared/lib/app-router-types.d.ts","./node_modules/next/dist/server/lib/cache-handlers/types.d.ts","./node_modules/next/dist/server/use-cache/use-cache-wrapper.d.ts","./node_modules/next/dist/server/resume-data-cache/cache-store.d.ts","./node_modules/next/dist/server/resume-data-cache/resume-data-cache.d.ts","./node_modules/next/dist/lib/constants.d.ts","./node_modules/next/dist/server/render-result.d.ts","./node_modules/next/dist/server/response-cache/types.d.ts","./node_modules/next/dist/server/response-cache/index.d.ts","./node_modules/@types/react/jsx-runtime.d.ts","./node_modules/next/dist/next-devtools/userspace/pages/pages-dev-overlay-setup.d.ts","./node_modules/next/dist/build/static-paths/types.d.ts","./node_modules/next/dist/server/route-definitions/app-page-route-definition.d.ts","./node_modules/next/dist/build/adapter/setup-node-env.external.d.ts","./node_modules/next/dist/server/instrumentation/types.d.ts","./node_modules/next/dist/lib/setup-exception-listeners.d.ts","./node_modules/next/dist/lib/worker.d.ts","./node_modules/next/dist/server/lib/experimental/ppr.d.ts","./node_modules/next/dist/lib/page-types.d.ts","./node_modules/next/dist/build/segment-config/app/app-segment-config.d.ts","./node_modules/next/dist/build/segment-config/pages/pages-segment-config.d.ts","./node_modules/next/dist/build/analysis/get-page-static-info.d.ts","./node_modules/next/dist/build/webpack/loaders/get-module-build-info.d.ts","./node_modules/next/dist/build/webpack/plugins/middleware-plugin.d.ts","./node_modules/next/dist/server/require-hook.d.ts","./node_modules/next/dist/server/node-polyfill-crypto.d.ts","./node_modules/next/dist/server/node-environment-baseline.d.ts","./node_modules/next/dist/server/node-environment-extensions/error-inspect.d.ts","./node_modules/next/dist/server/node-environment-extensions/console-file.d.ts","./node_modules/next/dist/server/node-environment-extensions/console-exit.d.ts","./node_modules/next/dist/server/node-environment-extensions/console-dim.external.d.ts","./node_modules/next/dist/server/node-environment-extensions/unhandled-rejection.external.d.ts","./node_modules/next/dist/server/node-environment-extensions/random.d.ts","./node_modules/next/dist/server/node-environment-extensions/date.d.ts","./node_modules/next/dist/server/node-environment-extensions/web-crypto.d.ts","./node_modules/next/dist/server/node-environment-extensions/node-crypto.d.ts","./node_modules/next/dist/server/node-environment-extensions/fast-set-immediate.external.d.ts","./node_modules/next/dist/server/node-environment.d.ts","./node_modules/next/dist/build/page-extensions-type.d.ts","./node_modules/next/dist/server/route-modules/app-page/module.compiled.d.ts","./node_modules/next/dist/server/route-definitions/app-route-route-definition.d.ts","./node_modules/next/dist/server/lib/i18n-provider.d.ts","./node_modules/next/dist/server/web/next-url.d.ts","./node_modules/next/dist/compiled/@edge-runtime/cookies/index.d.ts","./node_modules/next/dist/server/web/spec-extension/cookies.d.ts","./node_modules/next/dist/server/web/spec-extension/request.d.ts","./node_modules/next/dist/shared/lib/deep-readonly.d.ts","./node_modules/next/dist/server/lib/incremental-cache/index.d.ts","./node_modules/next/dist/shared/lib/router/utils/middleware-route-matcher.d.ts","./node_modules/next/dist/build/webpack/plugins/flight-manifest-plugin.d.ts","./node_modules/next/dist/build/webpack/plugins/next-font-manifest-plugin.d.ts","./node_modules/next/dist/server/route-definitions/locale-route-definition.d.ts","./node_modules/next/dist/server/route-definitions/pages-route-definition.d.ts","./node_modules/next/dist/shared/lib/mitt.d.ts","./node_modules/next/dist/client/with-router.d.ts","./node_modules/next/dist/client/router.d.ts","./node_modules/next/dist/client/route-loader.d.ts","./node_modules/next/dist/client/page-loader.d.ts","./node_modules/next/dist/shared/lib/bloom-filter.d.ts","./node_modules/next/dist/shared/lib/router/router.d.ts","./node_modules/next/dist/shared/lib/router-context.shared-runtime.d.ts","./node_modules/next/dist/shared/lib/loadable-context.shared-runtime.d.ts","./node_modules/next/dist/shared/lib/loadable.shared-runtime.d.ts","./node_modules/next/dist/shared/lib/image-config-context.shared-runtime.d.ts","./node_modules/next/dist/client/components/readonly-url-search-params.d.ts","./node_modules/next/dist/shared/lib/hooks-client-context.shared-runtime.d.ts","./node_modules/next/dist/shared/lib/head-manager-context.shared-runtime.d.ts","./node_modules/next/dist/client/flight-data-helpers.d.ts","./node_modules/next/dist/client/components/segment-cache/cache-key.d.ts","./node_modules/next/dist/client/components/router-reducer/fetch-server-response.d.ts","./node_modules/next/dist/client/components/segment-cache/types.d.ts","./node_modules/next/dist/shared/lib/segment-cache/segment-value-encoding.d.ts","./node_modules/next/dist/client/components/segment-cache/scheduler.d.ts","./node_modules/next/dist/client/components/segment-cache/cache-map.d.ts","./node_modules/next/dist/client/components/segment-cache/vary-path.d.ts","./node_modules/next/dist/client/components/segment-cache/cache.d.ts","./node_modules/next/dist/client/components/router-reducer/ppr-navigations.d.ts","./node_modules/next/dist/client/components/segment-cache/navigation.d.ts","./node_modules/next/dist/client/components/router-reducer/router-reducer-types.d.ts","./node_modules/next/dist/shared/lib/app-router-context.shared-runtime.d.ts","./node_modules/next/dist/shared/lib/server-inserted-html.shared-runtime.d.ts","./node_modules/next/dist/server/route-modules/pages/vendored/contexts/entrypoints.d.ts","./node_modules/next/dist/server/route-modules/pages/module.compiled.d.ts","./node_modules/next/dist/build/templates/pages.d.ts","./node_modules/next/dist/server/route-modules/pages/module.d.ts","./node_modules/next/dist/server/render.d.ts","./node_modules/next/dist/build/webpack/plugins/pages-manifest-plugin.d.ts","./node_modules/next/dist/server/route-definitions/pages-api-route-definition.d.ts","./node_modules/next/dist/server/route-matches/pages-api-route-match.d.ts","./node_modules/next/dist/server/route-matchers/route-matcher.d.ts","./node_modules/next/dist/server/route-matcher-providers/route-matcher-provider.d.ts","./node_modules/next/dist/server/route-matcher-managers/route-matcher-manager.d.ts","./node_modules/next/dist/server/normalizers/normalizer.d.ts","./node_modules/next/dist/server/normalizers/locale-route-normalizer.d.ts","./node_modules/next/dist/server/normalizers/request/pathname-normalizer.d.ts","./node_modules/next/dist/server/normalizers/request/suffix.d.ts","./node_modules/next/dist/server/normalizers/request/rsc.d.ts","./node_modules/next/dist/server/normalizers/request/next-data.d.ts","./node_modules/next/dist/server/after/builtin-request-context.d.ts","./node_modules/next/dist/server/normalizers/request/segment-prefix-rsc.d.ts","./node_modules/next/dist/server/route-modules/pages/builtin/_error.d.ts","./node_modules/next/dist/server/load-default-error-components.d.ts","./node_modules/next/dist/server/base-server.d.ts","./node_modules/next/dist/server/after/after.d.ts","./node_modules/next/dist/server/after/after-context.d.ts","./node_modules/next/dist/server/use-cache/cache-life.d.ts","./node_modules/next/dist/server/app-render/work-async-storage-instance.d.ts","./node_modules/next/dist/server/lib/lazy-result.d.ts","./node_modules/next/dist/server/app-render/create-error-handler.d.ts","./node_modules/next/dist/shared/lib/action-revalidation-kind.d.ts","./node_modules/next/dist/server/app-render/work-async-storage.external.d.ts","./node_modules/next/dist/server/async-storage/work-store.d.ts","./node_modules/next/dist/server/web/http.d.ts","./node_modules/next/dist/client/components/hooks-server-context.d.ts","./node_modules/next/dist/server/route-modules/app-route/shared-modules.d.ts","./node_modules/next/dist/client/components/redirect-status-code.d.ts","./node_modules/next/dist/client/components/redirect-error.d.ts","./node_modules/next/dist/server/web/spec-extension/adapters/request-cookies.d.ts","./node_modules/next/dist/server/async-storage/draft-mode-provider.d.ts","./node_modules/next/dist/server/web/spec-extension/adapters/headers.d.ts","./node_modules/next/dist/server/app-render/cache-signal.d.ts","./node_modules/next/dist/server/app-render/instant-validation/boundary-tracking.d.ts","./node_modules/next/dist/server/app-render/instant-validation/instant-validation-error.d.ts","./node_modules/next/dist/shared/lib/router/utils/parse-relative-url.d.ts","./node_modules/next/dist/server/app-render/instant-validation/instant-samples.d.ts","./node_modules/next/dist/server/app-render/dynamic-rendering.d.ts","./node_modules/next/dist/server/app-render/work-unit-async-storage-instance.d.ts","./node_modules/next/dist/server/lib/implicit-tags.d.ts","./node_modules/next/dist/server/app-render/staged-rendering.d.ts","./node_modules/next/dist/server/app-render/work-unit-async-storage.external.d.ts","./node_modules/next/dist/build/templates/app-route.d.ts","./node_modules/next/dist/server/app-render/action-async-storage-instance.d.ts","./node_modules/next/dist/server/app-render/action-async-storage.external.d.ts","./node_modules/next/dist/server/route-modules/app-route/module.d.ts","./node_modules/next/dist/server/route-modules/app-route/module.compiled.d.ts","./node_modules/next/dist/build/segment-config/app/app-segments.d.ts","./node_modules/next/dist/build/get-supported-browsers.d.ts","./node_modules/next/dist/build/utils.d.ts","./node_modules/next/dist/build/rendering-mode.d.ts","./node_modules/next/dist/server/lib/router-utils/build-prefetch-segment-data-route.d.ts","./node_modules/next/dist/server/lib/cpu-profile.d.ts","./node_modules/next/dist/build/turborepo-access-trace/types.d.ts","./node_modules/next/dist/build/turborepo-access-trace/result.d.ts","./node_modules/next/dist/build/turborepo-access-trace/helpers.d.ts","./node_modules/next/dist/build/turborepo-access-trace/index.d.ts","./node_modules/next/dist/export/routes/types.d.ts","./node_modules/next/dist/export/types.d.ts","./node_modules/next/dist/export/worker.d.ts","./node_modules/next/dist/build/worker.d.ts","./node_modules/next/dist/build/index.d.ts","./node_modules/next/dist/lib/coalesced-function.d.ts","./node_modules/next/dist/server/lib/router-utils/types.d.ts","./node_modules/next/dist/trace/types.d.ts","./node_modules/next/dist/trace/trace.d.ts","./node_modules/next/dist/trace/shared.d.ts","./node_modules/next/dist/trace/index.d.ts","./node_modules/next/dist/build/load-jsconfig.d.ts","./node_modules/@next/env/dist/index.d.ts","./node_modules/next/dist/build/webpack/plugins/telemetry-plugin/use-cache-tracker-utils.d.ts","./node_modules/next/dist/build/webpack/plugins/telemetry-plugin/telemetry-plugin.d.ts","./node_modules/next/dist/telemetry/storage.d.ts","./node_modules/next/dist/build/build-context.d.ts","./node_modules/next/dist/build/webpack-config.d.ts","./node_modules/next/dist/build/swc/generated-native.d.ts","./node_modules/next/dist/build/define-env.d.ts","./node_modules/next/dist/build/swc/index.d.ts","./node_modules/next/dist/build/swc/types.d.ts","./node_modules/next/dist/server/dev/parse-version-info.d.ts","./node_modules/next/dist/next-devtools/shared/types.d.ts","./node_modules/next/dist/server/dev/dev-indicator-server-state.d.ts","./node_modules/next/dist/next-devtools/dev-overlay/cache-indicator.d.ts","./node_modules/next/dist/server/lib/parse-stack.d.ts","./node_modules/next/dist/next-devtools/server/shared.d.ts","./node_modules/next/dist/next-devtools/shared/stack-frame.d.ts","./node_modules/next/dist/next-devtools/dev-overlay/utils/get-error-by-type.d.ts","./node_modules/next/dist/next-devtools/dev-overlay/container/runtime-error/render-error.d.ts","./node_modules/next/dist/next-devtools/dev-overlay/shared.d.ts","./node_modules/next/dist/server/dev/debug-channel.d.ts","./node_modules/next/dist/server/dev/hot-reloader-types.d.ts","./node_modules/next/dist/server/web/spec-extension/fetch-event.d.ts","./node_modules/next/dist/server/web/spec-extension/response.d.ts","./node_modules/next/dist/build/segment-config/middleware/middleware-config.d.ts","./node_modules/next/dist/server/web/types.d.ts","./node_modules/next/dist/shared/lib/router/utils/parse-url.d.ts","./node_modules/next/dist/server/base-http/node.d.ts","./node_modules/next/dist/server/lib/async-callback-set.d.ts","./node_modules/next/dist/shared/lib/router/utils/route-regex.d.ts","./node_modules/next/dist/shared/lib/router/utils/route-matcher.d.ts","./node_modules/sharp/lib/index.d.ts","./node_modules/next/dist/server/image-optimizer.d.ts","./node_modules/next/dist/server/next-server.d.ts","./node_modules/next/dist/server/lib/types.d.ts","./node_modules/next/dist/server/lib/lru-cache.d.ts","./node_modules/next/dist/server/lib/dev-bundler-service.d.ts","./node_modules/next/dist/server/dev/static-paths-worker.d.ts","./node_modules/next/dist/server/dev/next-dev-server.d.ts","./node_modules/next/dist/server/next.d.ts","./node_modules/next/dist/server/lib/render-server.d.ts","./node_modules/next/dist/server/lib/router-server.d.ts","./node_modules/next/dist/shared/lib/router/utils/path-match.d.ts","./node_modules/next/dist/server/lib/router-utils/filesystem.d.ts","./node_modules/next/dist/server/lib/router-utils/setup-dev-bundler.d.ts","./node_modules/next/dist/server/lib/router-utils/router-server-context.d.ts","./node_modules/next/dist/server/route-modules/route-module.d.ts","./node_modules/next/dist/server/load-components.d.ts","./node_modules/next/dist/server/web/adapter.d.ts","./node_modules/next/dist/server/app-render/types.d.ts","./node_modules/next/dist/build/webpack/loaders/metadata/types.d.ts","./node_modules/next/dist/build/webpack/loaders/next-app-loader/index.d.ts","./node_modules/next/dist/server/lib/app-dir-module.d.ts","./node_modules/next/dist/server/app-render/app-render.d.ts","./node_modules/next/dist/server/route-modules/app-page/vendored/contexts/entrypoints.d.ts","./node_modules/next/dist/client/components/error-boundary.d.ts","./node_modules/next/dist/client/components/layout-router.d.ts","./node_modules/next/dist/client/components/render-from-template-context.d.ts","./node_modules/next/dist/client/components/client-page.d.ts","./node_modules/next/dist/client/components/client-segment.d.ts","./node_modules/next/dist/client/components/http-access-fallback/error-boundary.d.ts","./node_modules/next/dist/lib/metadata/types/alternative-urls-types.d.ts","./node_modules/next/dist/lib/metadata/types/extra-types.d.ts","./node_modules/next/dist/lib/metadata/types/metadata-types.d.ts","./node_modules/next/dist/lib/metadata/types/manifest-types.d.ts","./node_modules/next/dist/lib/metadata/types/opengraph-types.d.ts","./node_modules/next/dist/lib/metadata/types/twitter-types.d.ts","./node_modules/next/dist/lib/metadata/types/metadata-interface.d.ts","./node_modules/next/dist/lib/metadata/types/resolvers.d.ts","./node_modules/next/dist/lib/metadata/types/icons.d.ts","./node_modules/next/dist/lib/metadata/resolve-metadata.d.ts","./node_modules/next/dist/lib/metadata/metadata.d.ts","./node_modules/next/dist/lib/framework/boundary-components.d.ts","./node_modules/next/dist/server/app-render/rsc/preloads.d.ts","./node_modules/next/dist/server/app-render/rsc/postpone.d.ts","./node_modules/next/dist/server/app-render/rsc/taint.d.ts","./node_modules/next/dist/server/app-render/collect-segment-data.d.ts","./node_modules/next/dist/server/app-render/instant-validation/instant-validation.d.ts","./node_modules/next/dist/next-devtools/userspace/app/segment-explorer-node.d.ts","./node_modules/next/dist/server/app-render/entry-base.d.ts","./node_modules/next/dist/build/templates/app-page.d.ts","./node_modules/next/dist/server/route-modules/app-page/helpers/prerender-manifest-matcher.d.ts","./node_modules/@types/react/jsx-dev-runtime.d.ts","./node_modules/@types/react/compiler-runtime.d.ts","./node_modules/next/dist/server/route-modules/app-page/vendored/rsc/entrypoints.d.ts","./node_modules/@types/react-dom/client.d.ts","./node_modules/@types/react-dom/static.d.ts","./node_modules/@types/react-dom/server.d.ts","./node_modules/next/dist/server/route-modules/app-page/vendored/ssr/entrypoints.d.ts","./node_modules/next/dist/server/route-modules/app-page/module.d.ts","./node_modules/next/dist/server/request/fallback-params.d.ts","./node_modules/next/dist/server/web/spec-extension/image-response.d.ts","./node_modules/next/dist/server/web/spec-extension/user-agent.d.ts","./node_modules/next/dist/server/web/spec-extension/url-pattern.d.ts","./node_modules/next/dist/server/after/index.d.ts","./node_modules/next/dist/server/request/connection.d.ts","./node_modules/next/dist/server/web/exports/index.d.ts","./node_modules/next/dist/server/request-meta.d.ts","./node_modules/next/dist/cli/next-test.d.ts","./node_modules/next/dist/shared/lib/size-limit.d.ts","./node_modules/next/dist/server/config-shared.d.ts","./node_modules/next/dist/server/base-http/index.d.ts","./node_modules/next/dist/server/api-utils/index.d.ts","./node_modules/next/dist/build/adapter/build-complete.d.ts","./node_modules/next/dist/types.d.ts","./node_modules/next/dist/shared/lib/html-context.shared-runtime.d.ts","./node_modules/next/dist/shared/lib/utils.d.ts","./node_modules/next/dist/pages/_app.d.ts","./node_modules/next/app.d.ts","./node_modules/next/dist/server/web/spec-extension/unstable-cache.d.ts","./node_modules/next/dist/server/web/spec-extension/revalidate.d.ts","./node_modules/next/dist/server/web/spec-extension/unstable-no-store.d.ts","./node_modules/next/dist/server/use-cache/cache-tag.d.ts","./node_modules/next/cache.d.ts","./node_modules/next/dist/pages/_document.d.ts","./node_modules/next/document.d.ts","./node_modules/next/dist/shared/lib/dynamic.d.ts","./node_modules/next/dynamic.d.ts","./node_modules/next/dist/pages/_error.d.ts","./node_modules/next/dist/client/components/catch-error.d.ts","./node_modules/next/dist/api/error.d.ts","./node_modules/next/error.d.ts","./node_modules/next/dist/shared/lib/head.d.ts","./node_modules/next/head.d.ts","./node_modules/next/dist/server/request/cookies.d.ts","./node_modules/next/dist/server/request/headers.d.ts","./node_modules/next/dist/server/request/draft-mode.d.ts","./node_modules/next/headers.d.ts","./node_modules/next/dist/shared/lib/get-img-props.d.ts","./node_modules/next/dist/client/image-component.d.ts","./node_modules/next/dist/shared/lib/image-external.d.ts","./node_modules/next/image.d.ts","./node_modules/next/dist/client/link.d.ts","./node_modules/next/link.d.ts","./node_modules/next/dist/client/components/unrecognized-action-error.d.ts","./node_modules/next/dist/client/components/redirect.d.ts","./node_modules/next/dist/client/components/not-found.d.ts","./node_modules/next/dist/client/components/forbidden.d.ts","./node_modules/next/dist/client/components/unauthorized.d.ts","./node_modules/next/dist/client/components/unstable-rethrow.server.d.ts","./node_modules/next/dist/client/components/unstable-rethrow.d.ts","./node_modules/next/dist/client/components/navigation.react-server.d.ts","./node_modules/next/dist/client/components/navigation.d.ts","./node_modules/next/navigation.d.ts","./node_modules/next/router.d.ts","./node_modules/next/dist/client/script.d.ts","./node_modules/next/script.d.ts","./node_modules/next/dist/compiled/@edge-runtime/primitives/url.d.ts","./node_modules/next/dist/compiled/@vercel/og/satori/index.d.ts","./node_modules/next/dist/compiled/@vercel/og/types.d.ts","./node_modules/next/server.d.ts","./node_modules/next/types/global.d.ts","./node_modules/next/types/compiled.d.ts","./node_modules/next/types.d.ts","./node_modules/next/index.d.ts","./node_modules/next/image-types/global.d.ts","./.next/dev/types/routes.d.ts","./next-env.d.ts","./next.config.ts","./src/lib/types.ts","./src/data/arms.ts","./src/data/artDescriptions.ts","./src/data/builds.ts","./src/data/classes.ts","./src/data/companions.ts","./src/data/skellWeapons.ts","./src/data/contextual.ts","./src/data/i18n.ts","./src/data/progression.ts","./src/data/skells.ts","./research/art-effects.json","./src/lib/engine.ts","./src/lib/buildPersistence.ts","./src/lib/buildPersistence.test.ts","./src/lib/contextualEngine.ts","./src/lib/contextualEngine.test.ts","./src/lib/engine.test.ts","./node_modules/next/dist/compiled/@next/font/dist/types.d.ts","./node_modules/next/dist/compiled/@next/font/dist/google/index.d.ts","./node_modules/next/font/google/index.d.ts","./app/layout.tsx","./src/components/ControlPanel.tsx","./src/components/BuildCard.tsx","./src/components/ResultsSection.tsx","./src/components/SiteFooter.tsx","./src/components/SquadPanel.tsx","./src/components/Topbar.tsx","./src/components/TeamBuilder.tsx","./app/page.tsx","./.next/types/cache-life.d.ts","./.next/types/routes.d.ts","./.next/types/validator.ts","./.next/dev/types/cache-life.d.ts","./.next/dev/types/validator.ts","./node_modules/@types/estree/index.d.ts","./node_modules/@types/json-schema/index.d.ts","./node_modules/@types/json5/index.d.ts"],"fileIdsList":[[97,146,163,164,488,489,490,491,568],[97,146,163,164,568,571],[97,146,163,164,231,532,535,559,567,568,571],[97,146,163,164,488,489,490,491,571],[97,146,163,164,231,532,559,567,568,569,571],[97,146,163,164,231,530,533,558,568,571],[97,146,163,164,231,566,568,571],[97,146,163,164,533,534,535,568,571],[97,146,163,164,231,533,568,571],[97,143,144,146,163,164,568,571],[97,145,146,163,164,568,571],[146,163,164,568,571],[97,146,151,163,164,181,568,571],[97,146,147,152,157,163,164,166,178,189,568,571],[97,146,147,148,157,163,164,166,568,571],[92,93,94,97,146,163,164,568,571],[97,146,149,163,164,190,568,571],[97,146,150,151,158,163,164,167,568,571],[97,146,151,163,164,178,186,568,571],[97,146,152,154,157,163,164,166,568,571],[97,145,146,153,163,164,568,571],[97,146,154,155,163,164,568,571],[97,146,156,157,163,164,568,571],[97,145,146,157,163,164,568,571],[97,146,157,158,159,163,164,178,189,568,571],[97,146,157,158,159,163,164,173,178,181,568,571],[97,138,146,154,157,160,163,164,166,178,189,568,571],[97,146,157,158,160,161,163,164,166,178,186,189,568,571],[97,146,160,162,163,164,178,186,189,568,571],[95,96,97,98,99,100,101,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,568,571],[97,146,157,163,164,568,571],[97,146,163,164,165,189,568,571],[97,146,154,157,163,164,166,178,568,571],[97,146,163,164,167,568,571],[97,146,163,164,168,568,571],[97,145,146,163,164,169,568,571],[97,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,568,571],[97,146,163,164,171,568,571],[97,146,163,164,172,568,571],[97,146,157,163,164,173,174,568,571],[97,146,163,164,173,175,190,192,568,571],[97,146,158,163,164,568,571],[97,146,157,163,164,178,179,181,568,571],[97,146,163,164,180,181,568,571],[97,146,163,164,178,179,568,571],[97,146,163,164,181,568,571],[97,146,163,164,182,568,571],[97,143,146,163,164,178,183,189,568,571],[97,146,157,163,164,184,185,568,571],[97,146,163,164,184,185,568,571],[97,146,151,163,164,166,178,186,568,571],[97,146,163,164,187,568,571],[97,146,163,164,166,188,568,571],[97,146,160,163,164,172,189,568,571],[97,146,151,163,164,190,568,571],[97,146,163,164,178,191,568,571],[97,146,163,164,165,192,568,571],[97,146,163,164,193,568,571],[97,138,146,163,164,568,571],[97,138,146,157,159,163,164,169,178,181,189,191,192,194,568,571],[97,146,163,164,178,195,568,571],[85,89,97,146,163,164,197,198,199,200,201,483,528,568,571],[85,97,146,163,164,568,571],[85,89,97,146,163,164,197,198,199,200,464,483,528,568,571],[85,89,97,146,163,164,197,198,200,201,483,528,568,571],[85,97,146,163,164,201,464,465,568,571],[85,97,146,163,164,201,464,568,571],[85,89,97,146,163,164,198,199,200,201,483,528,568,571],[85,89,97,146,163,164,197,199,200,201,483,528,568,571],[83,84,97,146,163,164,568,571],[97,146,163,164,486,568,571],[97,146,163,164,488,489,490,491,568,571],[97,146,163,164,434,497,498,568,571],[97,146,163,164,206,207,209,221,245,360,371,479,568,571],[97,146,163,164,209,240,241,242,244,479,568,571],[97,146,163,164,209,377,379,381,382,384,479,481,568,571],[97,146,163,164,209,243,280,479,568,571],[97,146,163,164,207,209,220,221,227,233,238,359,360,361,370,479,481,568,571],[97,146,163,164,479,568,571],[97,146,163,164,216,222,241,261,356,568,571],[97,146,163,164,209,568,571],[97,146,163,164,202,216,222,568,571],[97,146,163,164,388,568,571],[97,146,163,164,385,386,388,568,571],[97,146,163,164,385,387,479,568,571],[97,146,160,163,164,261,458,476,568,571],[97,146,160,163,164,332,335,351,356,476,568,571],[97,146,160,163,164,304,476,568,571],[97,146,163,164,364,568,571],[97,146,163,164,363,364,365,568,571],[97,146,163,164,363,568,571],[91,97,146,160,163,164,202,209,221,227,233,239,241,245,246,259,260,327,357,358,371,479,483,568,571],[97,146,163,164,206,209,243,280,377,378,383,479,531,568,571],[97,146,163,164,243,531,568,571],[97,146,163,164,206,260,429,479,531,568,571],[97,146,163,164,531,568,571],[97,146,163,164,209,243,244,531,568,571],[97,146,163,164,380,531,568,571],[97,146,163,164,246,359,362,369,568,571],[85,97,146,163,164,434,568,571],[97,146,163,164,172,216,231,568,571],[97,146,163,164,216,231,568,571],[85,97,146,163,164,301,568,571],[85,97,146,163,164,231,568,571],[85,97,146,163,164,222,231,434,568,571],[97,146,163,164,216,287,301,302,513,520,568,571],[97,146,163,164,286,514,515,516,517,519,568,571],[97,146,163,164,337,568,571],[97,146,163,164,337,338,568,571],[97,146,163,164,220,222,289,290,568,571],[97,146,163,164,222,296,297,568,571],[97,146,163,164,222,291,299,568,571],[97,146,163,164,296,568,571],[97,146,163,164,214,222,289,290,291,292,293,294,295,296,299,568,571],[97,146,163,164,222,289,296,297,298,300,568,571],[97,146,163,164,222,290,292,293,568,571],[97,146,163,164,290,292,295,297,568,571],[97,146,163,164,518,568,571],[97,146,163,164,222,568,571],[85,97,146,163,164,210,507,568,571],[85,97,146,163,164,189,568,571],[85,97,146,163,164,243,278,568,571],[85,97,146,163,164,243,371,568,571],[97,146,163,164,276,281,568,571],[85,97,146,163,164,277,485,568,571],[97,146,163,164,556,568,571],[85,89,97,146,160,163,164,197,198,199,200,201,483,527,568,571],[97,146,160,163,164,222,568,571],[97,146,160,163,164,221,226,307,324,366,367,371,426,428,479,480,568,571],[97,146,163,164,259,368,568,571],[97,146,163,164,483,568,571],[97,146,163,164,208,568,571],[85,97,146,163,164,213,216,431,447,449,568,571],[97,146,163,164,172,216,431,446,447,448,530,568,571],[97,146,163,164,440,441,442,443,444,445,568,571],[97,146,163,164,442,568,571],[97,146,163,164,446,568,571],[97,146,163,164,231,395,396,398,568,571],[85,97,146,163,164,222,389,390,391,392,397,568,571],[97,146,163,164,395,397,568,571],[97,146,163,164,393,568,571],[97,146,163,164,394,568,571],[85,97,146,163,164,231,277,485,568,571],[85,97,146,163,164,231,484,485,568,571],[85,97,146,163,164,231,485,568,571],[97,146,163,164,324,325,568,571],[97,146,163,164,325,568,571],[97,146,160,163,164,480,485,568,571],[97,146,163,164,354,568,571],[97,145,146,163,164,353,568,571],[97,146,163,164,216,222,228,230,332,345,349,351,428,431,468,469,476,480,568,571],[97,146,163,164,222,271,293,568,571],[97,146,163,164,332,343,346,351,568,571],[85,97,146,163,164,213,216,332,335,351,354,388,435,436,437,438,439,450,451,452,453,454,455,456,457,531,568,571],[97,146,163,164,213,216,241,332,339,340,341,344,345,568,571],[97,146,163,164,178,222,241,343,350,431,432,476,568,571],[97,146,163,164,347,568,571],[97,146,160,163,164,172,210,222,226,236,268,269,272,324,327,392,426,427,468,479,480,481,483,531,568,571],[97,146,163,164,213,214,216,568,571],[97,146,163,164,332,568,571],[97,145,146,163,164,241,268,269,326,327,328,329,330,331,480,568,571],[97,146,163,164,351,568,571],[97,145,146,163,164,215,216,226,230,266,332,339,340,341,342,343,346,347,348,349,350,469,568,571],[97,146,160,163,164,266,267,339,480,481,568,571],[97,146,163,164,241,269,324,327,332,428,480,568,571],[97,146,160,163,164,479,481,568,571],[97,146,160,163,164,178,476,480,481,568,571],[97,146,160,163,164,172,202,216,221,228,230,233,236,243,263,268,269,270,271,272,307,308,310,313,315,318,319,320,321,323,371,426,428,476,479,480,481,568,571],[97,146,160,163,164,178,568,571],[97,146,163,164,209,210,211,239,476,477,478,483,485,531,568,571],[97,146,163,164,206,207,479,568,571],[97,146,163,164,400,568,571],[97,146,160,163,164,178,189,218,384,388,389,390,391,392,398,399,531,568,571],[97,146,163,164,172,189,202,216,218,230,233,269,308,313,323,324,377,404,405,406,412,415,416,426,428,476,479,568,571],[97,146,163,164,233,239,246,259,269,327,479,568,571],[97,146,160,163,164,189,210,221,230,269,410,476,479,568,571],[97,146,163,164,430,568,571],[97,146,160,163,164,400,413,414,423,568,571],[97,146,163,164,476,479,568,571],[97,146,163,164,329,469,568,571],[97,146,163,164,230,268,371,485,568,571],[97,146,160,163,164,172,208,313,373,377,406,412,415,418,476,568,571],[97,146,160,163,164,246,259,377,419,568,571],[97,146,163,164,209,270,371,421,479,481,568,571],[97,146,160,163,164,189,392,479,568,571],[97,146,160,163,164,243,270,371,372,373,382,400,420,422,479,568,571],[91,97,146,160,163,164,268,425,483,485,568,571],[97,146,163,164,322,426,568,571],[97,146,160,163,164,172,216,219,221,222,228,230,236,245,246,259,269,272,308,310,320,323,324,371,404,405,406,407,409,411,426,428,476,485,568,571],[97,146,160,163,164,178,246,412,417,423,476,568,571],[97,146,163,164,249,250,251,252,253,254,255,256,257,258,568,571],[97,146,163,164,263,314,568,571],[97,146,163,164,316,568,571],[97,146,163,164,314,568,571],[97,146,163,164,316,317,568,571],[97,146,160,163,164,220,221,222,226,227,480,568,571],[97,146,160,163,164,172,208,210,228,232,268,271,272,306,426,476,481,483,485,568,571],[97,146,160,163,164,172,189,212,219,220,230,232,269,424,469,475,480,568,571],[97,146,163,164,339,568,571],[97,146,163,164,340,568,571],[97,146,163,164,222,233,468,568,571],[97,146,163,164,341,568,571],[97,146,163,164,215,568,571],[97,146,163,164,217,229,568,571],[97,146,160,163,164,217,221,228,568,571],[97,146,163,164,224,229,568,571],[97,146,163,164,225,568,571],[97,146,163,164,217,218,568,571],[97,146,163,164,217,273,568,571],[97,146,163,164,217,568,571],[97,146,163,164,219,263,312,568,571],[97,146,163,164,311,568,571],[97,146,163,164,216,218,219,568,571],[97,146,163,164,219,309,568,571],[97,146,163,164,216,218,568,571],[97,146,163,164,268,371,568,571],[97,146,163,164,468,568,571],[97,146,160,163,164,189,228,230,234,268,371,425,428,431,432,433,459,460,463,467,469,476,480,568,571],[97,146,163,164,282,285,287,288,301,302,568,571],[85,97,146,163,164,199,200,201,231,461,462,568,571],[85,97,146,163,164,199,200,201,231,461,462,466,568,571],[97,146,163,164,355,568,571],[97,146,163,164,241,262,267,268,332,333,334,335,336,338,351,352,354,357,425,428,479,481,568,571],[97,146,163,164,301,568,571],[97,146,160,163,164,306,476,568,571],[97,146,163,164,306,568,571],[97,146,160,163,164,228,274,303,305,307,425,476,483,485,568,571],[97,146,163,164,282,283,284,285,287,288,301,302,484,568,571],[91,97,146,160,163,164,172,189,217,218,230,236,268,269,272,371,423,424,426,476,479,480,483,568,571],[97,146,163,164,213,216,223,568,571],[97,146,163,164,267,269,401,404,568,571],[97,146,163,164,267,402,470,471,472,473,474,568,571],[97,146,160,163,164,263,479,568,571],[97,146,160,163,164,568,571],[97,146,163,164,266,351,568,571],[97,146,163,164,265,568,571],[97,146,163,164,267,320,568,571],[97,146,163,164,264,266,479,568,571],[97,146,160,163,164,212,267,401,402,403,476,479,480,568,571],[85,97,146,163,164,216,222,300,568,571],[85,97,146,163,164,214,568,571],[97,146,163,164,204,205,568,571],[85,97,146,163,164,210,568,571],[85,97,146,163,164,216,286,568,571],[85,91,97,146,163,164,268,272,483,485,568,571],[97,146,163,164,210,507,508,568,571],[85,97,146,163,164,281,568,571],[85,97,146,163,164,172,189,208,275,277,279,280,485,568,571],[97,146,163,164,216,243,480,568,571],[97,146,163,164,216,408,568,571],[85,97,146,158,160,163,164,172,206,208,281,379,483,484,568,571],[85,97,146,163,164,197,198,199,200,201,483,528,568,571],[85,86,87,88,89,97,146,163,164,568,571],[97,146,151,163,164,568,571],[97,146,163,164,374,375,376,568,571],[97,146,163,164,374,568,571],[85,89,97,146,160,162,163,164,172,196,197,198,199,200,201,202,208,236,241,418,446,481,482,485,528,568,571],[97,146,163,164,493,568,571],[97,146,163,164,495,568,571],[97,146,163,164,499,568,571],[97,146,163,164,557,568,571],[97,146,163,164,501,568,571],[97,146,163,164,503,504,505,568,571],[97,146,163,164,509,568,571],[90,97,146,163,164,487,492,494,496,500,502,506,510,512,522,523,525,529,530,531,532,568,571],[97,146,163,164,511,568,571],[97,146,163,164,521,568,571],[97,146,163,164,277,568,571],[97,146,163,164,524,568,571],[97,145,146,163,164,267,401,402,404,470,471,473,474,526,528,568,571],[97,146,163,164,196,568,571],[97,146,163,164,178,196,568,571],[97,110,114,146,163,164,189,568,571],[97,110,146,163,164,178,189,568,571],[97,105,146,163,164,568,571],[97,107,110,146,163,164,186,189,568,571],[97,146,163,164,166,186,568,571],[97,105,146,163,164,196,568,571],[97,107,110,146,163,164,166,189,568,571],[97,102,103,106,109,146,157,163,164,178,189,568,571],[97,110,117,146,163,164,568,571],[97,102,108,146,163,164,568,571],[97,110,131,132,146,163,164,568,571],[97,106,110,146,163,164,181,189,196,568,571],[97,131,146,163,164,196,568,571],[97,104,105,146,163,164,196,568,571],[97,110,146,163,164,568,571],[97,104,105,106,107,108,109,110,111,112,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,132,133,134,135,136,137,146,163,164,568,571],[97,110,125,146,163,164,568,571],[97,110,117,118,146,163,164,568,571],[97,108,110,118,119,146,163,164,568,571],[97,109,146,163,164,568,571],[97,102,105,110,146,163,164,568,571],[97,110,114,118,119,146,163,164,568,571],[97,114,146,163,164,568,571],[97,108,110,113,146,163,164,189,568,571],[97,102,107,110,117,146,163,164,568,571],[97,146,163,164,178,568,571],[97,105,110,131,146,163,164,194,196,568,571],[97,146,163,164,231,568,571],[97,146,163,164,231,538,539,540,541,546,550,553,568,571],[97,146,163,164,231,538,542,546,550,568,571],[85,97,146,163,164,231,538,546,550,561,568,571],[97,146,163,164,231,546,568,571],[97,146,163,164,231,538,543,546,568,571],[85,97,146,163,164,231,538,542,546,550,551,553,560,562,563,564,565,568,571],[97,146,163,164,231,538,546,568,571],[97,146,163,164,231,538,568,571],[97,146,163,164,231,538,544,568,571],[97,144,146,163,164,183,231,550,551,568,571],[97,146,163,164,231,538,542,543,550,568,571],[97,144,146,163,164,183,231,538,543,549,550,553,568,571],[97,146,163,164,231,538,541,543,545,547,549,550,568,571],[97,144,146,163,164,183,231,543,547,549,550,568,571],[97,146,163,164,231,538,541,542,543,544,547,548,549,568,571]],"fileInfos":[{"version":"c430d44666289dae81f30fa7b2edebf186ecc91a2d4c71266ea6ae76388792e1","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"e44bb8bbac7f10ecc786703fe0a6a4b952189f908707980ba8f3c8975a760962","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"feecb1be483ed332fad555aff858affd90a48ab19ba7272ee084704eb7167569","impliedFormat":1},{"version":"ee7bad0c15b58988daa84371e0b89d313b762ab83cb5b31b8a2d1162e8eb41c2","impliedFormat":1},{"version":"27bdc30a0e32783366a5abeda841bc22757c1797de8681bbe81fbc735eeb1c10","impliedFormat":1},{"version":"8fd575e12870e9944c7e1d62e1f5a73fcf23dd8d3a321f2a2c74c20d022283fe","impliedFormat":1},{"version":"2ab096661c711e4a81cc464fa1e6feb929a54f5340b46b0a07ac6bbf857471f0","impliedFormat":1},{"version":"080941d9f9ff9307f7e27a83bcd888b7c8270716c39af943532438932ec1d0b9","affectsGlobalScope":true,"impliedFormat":1},{"version":"2e80ee7a49e8ac312cc11b77f1475804bee36b3b2bc896bead8b6e1266befb43","affectsGlobalScope":true,"impliedFormat":1},{"version":"c57796738e7f83dbc4b8e65132f11a377649c00dd3eee333f672b8f0a6bea671","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"515d0b7b9bea2e31ea4ec968e9edd2c39d3eebf4a2d5cbd04e88639819ae3b71","affectsGlobalScope":true,"impliedFormat":1},{"version":"0559b1f683ac7505ae451f9a96ce4c3c92bdc71411651ca6ddb0e88baaaad6a3","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"fb0f136d372979348d59b3f5020b4cdb81b5504192b1cacff5d1fbba29378aa1","affectsGlobalScope":true,"impliedFormat":1},{"version":"d15bea3d62cbbdb9797079416b8ac375ae99162a7fba5de2c6c505446486ac0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"68d18b664c9d32a7336a70235958b8997ebc1c3b8505f4f1ae2b7e7753b87618","affectsGlobalScope":true,"impliedFormat":1},{"version":"eb3d66c8327153d8fa7dd03f9c58d351107fe824c79e9b56b462935176cdf12a","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"69ab18c3b76cd9b1be3d188eaf8bba06112ebbe2f47f6c322b5105a6fbc45a2e","affectsGlobalScope":true,"impliedFormat":1},{"version":"a680117f487a4d2f30ea46f1b4b7f58bef1480456e18ba53ee85c2746eeca012","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"954296b30da6d508a104a3a0b5d96b76495c709785c1d11610908e63481ee667","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac9538681b19688c8eae65811b329d3744af679e0bdfa5d842d0e32524c73e1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a969edff4bd52585473d24995c5ef223f6652d6ef46193309b3921d65dd4376","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"d6d7ae4d1f1f3772e2a3cde568ed08991a8ae34a080ff1151af28b7f798e22ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"52ada8e0b6e0482b728070b7639ee42e83a9b1c22d205992756fe020fd9f4a47","affectsGlobalScope":true,"impliedFormat":1},{"version":"3bdefe1bfd4d6dee0e26f928f93ccc128f1b64d5d501ff4a8cf3c6371200e5e6","affectsGlobalScope":true,"impliedFormat":1},{"version":"59fb2c069260b4ba00b5643b907ef5d5341b167e7d1dbf58dfd895658bda2867","affectsGlobalScope":true,"impliedFormat":1},{"version":"639e512c0dfc3fad96a84caad71b8834d66329a1f28dc95e3946c9b58176c73a","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"af3dd424cf267428f30ccfc376f47a2c0114546b55c44d8c0f1d57d841e28d74","affectsGlobalScope":true,"impliedFormat":1},{"version":"995c005ab91a498455ea8dfb63aa9f83fa2ea793c3d8aa344be4a1678d06d399","affectsGlobalScope":true,"impliedFormat":1},{"version":"959d36cddf5e7d572a65045b876f2956c973a586da58e5d26cde519184fd9b8a","affectsGlobalScope":true,"impliedFormat":1},{"version":"965f36eae237dd74e6cca203a43e9ca801ce38824ead814728a2807b1910117d","affectsGlobalScope":true,"impliedFormat":1},{"version":"3925a6c820dcb1a06506c90b1577db1fdbf7705d65b62b99dce4be75c637e26b","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a3d63ef2b853447ec4f749d3f368ce642264246e02911fcb1590d8c161b8005","affectsGlobalScope":true,"impliedFormat":1},{"version":"8cdf8847677ac7d20486e54dd3fcf09eda95812ac8ace44b4418da1bbbab6eb8","affectsGlobalScope":true,"impliedFormat":1},{"version":"8444af78980e3b20b49324f4a16ba35024fef3ee069a0eb67616ea6ca821c47a","affectsGlobalScope":true,"impliedFormat":1},{"version":"3287d9d085fbd618c3971944b65b4be57859f5415f495b33a6adc994edd2f004","affectsGlobalScope":true,"impliedFormat":1},{"version":"b4b67b1a91182421f5df999988c690f14d813b9850b40acd06ed44691f6727ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"df83c2a6c73228b625b0beb6669c7ee2a09c914637e2d35170723ad49c0f5cd4","affectsGlobalScope":true,"impliedFormat":1},{"version":"436aaf437562f276ec2ddbee2f2cdedac7664c1e4c1d2c36839ddd582eeb3d0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e3c06ea092138bf9fa5e874a1fdbc9d54805d074bee1de31b99a11e2fec239d","affectsGlobalScope":true,"impliedFormat":1},{"version":"87dc0f382502f5bbce5129bdc0aea21e19a3abbc19259e0b43ae038a9fc4e326","affectsGlobalScope":true,"impliedFormat":1},{"version":"b1cb28af0c891c8c96b2d6b7be76bd394fddcfdb4709a20ba05a7c1605eea0f9","affectsGlobalScope":true,"impliedFormat":1},{"version":"2fef54945a13095fdb9b84f705f2b5994597640c46afeb2ce78352fab4cb3279","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac77cb3e8c6d3565793eb90a8373ee8033146315a3dbead3bde8db5eaf5e5ec6","affectsGlobalScope":true,"impliedFormat":1},{"version":"56e4ed5aab5f5920980066a9409bfaf53e6d21d3f8d020c17e4de584d29600ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ece9f17b3866cc077099c73f4983bddbcb1dc7ddb943227f1ec070f529dedd1","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a6282c8827e4b9a95f4bf4f5c205673ada31b982f50572d27103df8ceb8013c","affectsGlobalScope":true,"impliedFormat":1},{"version":"1c9319a09485199c1f7b0498f2988d6d2249793ef67edda49d1e584746be9032","affectsGlobalScope":true,"impliedFormat":1},{"version":"e3a2a0cee0f03ffdde24d89660eba2685bfbdeae955a6c67e8c4c9fd28928eeb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811c71eee4aa0ac5f7adf713323a5c41b0cf6c4e17367a34fbce379e12bbf0a4","affectsGlobalScope":true,"impliedFormat":1},{"version":"51ad4c928303041605b4d7ae32e0c1ee387d43a24cd6f1ebf4a2699e1076d4fa","affectsGlobalScope":true,"impliedFormat":1},{"version":"60037901da1a425516449b9a20073aa03386cce92f7a1fd902d7602be3a7c2e9","affectsGlobalScope":true,"impliedFormat":1},{"version":"d4b1d2c51d058fc21ec2629fff7a76249dec2e36e12960ea056e3ef89174080f","affectsGlobalScope":true,"impliedFormat":1},{"version":"22adec94ef7047a6c9d1af3cb96be87a335908bf9ef386ae9fd50eeb37f44c47","affectsGlobalScope":true,"impliedFormat":1},{"version":"196cb558a13d4533a5163286f30b0509ce0210e4b316c56c38d4c0fd2fb38405","affectsGlobalScope":true,"impliedFormat":1},{"version":"73f78680d4c08509933daf80947902f6ff41b6230f94dd002ae372620adb0f60","affectsGlobalScope":true,"impliedFormat":1},{"version":"c5239f5c01bcfa9cd32f37c496cf19c61d69d37e48be9de612b541aac915805b","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e7f8264d0fb4c5339605a15daadb037bf238c10b654bb3eee14208f860a32ea","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"7e29f41b158de217f94cb9676bf9cbd0cd9b5a46e1985141ed36e075c52bf6ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac51dd7d31333793807a6abaa5ae168512b6131bd41d9c5b98477fc3b7800f9f","impliedFormat":1},{"version":"814d5c7384f3ca276e9dc4bcfde5545801a3ea0bfae09916b3336774e662fd1b","impliedFormat":1},{"version":"acd8fd5090ac73902278889c38336ff3f48af6ba03aa665eb34a75e7ba1dccc4","impliedFormat":1},{"version":"d6258883868fb2680d2ca96bc8b1352cab69874581493e6d52680c5ffecdb6cc","impliedFormat":1},{"version":"1b61d259de5350f8b1e5db06290d31eaebebc6baafd5f79d314b5af9256d7153","impliedFormat":1},{"version":"f258e3960f324a956fc76a3d3d9e964fff2244ff5859dcc6ce5951e5413ca826","impliedFormat":1},{"version":"643f7232d07bf75e15bd8f658f664d6183a0efaca5eb84b48201c7671a266979","impliedFormat":1},{"version":"21da358700a3893281ce0c517a7a30cbd46be020d9f0c3f2834d0a8ad1f5fc75","impliedFormat":1},{"version":"6c7176368037af28cb72f2392010fa1cef295d6d6744bca8cfb54985f3a18c3e","affectsGlobalScope":true,"impliedFormat":1},{"version":"ab41ef1f2cdafb8df48be20cd969d875602483859dc194e9c97c8a576892c052","affectsGlobalScope":true,"impliedFormat":1},{"version":"437e20f2ba32abaeb7985e0afe0002de1917bc74e949ba585e49feba65da6ca1","affectsGlobalScope":true,"impliedFormat":1},{"version":"21d819c173c0cf7cc3ce57c3276e77fd9a8a01d35a06ad87158781515c9a438a","impliedFormat":1},{"version":"98cffbf06d6bab333473c70a893770dbe990783904002c4f1a960447b4b53dca","affectsGlobalScope":true,"impliedFormat":1},{"version":"3af97acf03cc97de58a3a4bc91f8f616408099bc4233f6d0852e72a8ffb91ac9","affectsGlobalScope":true,"impliedFormat":1},{"version":"808069bba06b6768b62fd22429b53362e7af342da4a236ed2d2e1c89fcca3b4a","affectsGlobalScope":true,"impliedFormat":1},{"version":"1db0b7dca579049ca4193d034d835f6bfe73096c73663e5ef9a0b5779939f3d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"9798340ffb0d067d69b1ae5b32faa17ab31b82466a3fc00d8f2f2df0c8554aaa","affectsGlobalScope":true,"impliedFormat":1},{"version":"f26b11d8d8e4b8028f1c7d618b22274c892e4b0ef5b3678a8ccbad85419aef43","affectsGlobalScope":true,"impliedFormat":1},{"version":"5929864ce17fba74232584d90cb721a89b7ad277220627cc97054ba15a98ea8f","impliedFormat":1},{"version":"763fe0f42b3d79b440a9b6e51e9ba3f3f91352469c1e4b3b67bfa4ff6352f3f4","impliedFormat":1},{"version":"25c8056edf4314820382a5fdb4bb7816999acdcb929c8f75e3f39473b87e85bc","impliedFormat":1},{"version":"c464d66b20788266e5353b48dc4aa6bc0dc4a707276df1e7152ab0c9ae21fad8","impliedFormat":1},{"version":"78d0d27c130d35c60b5e5566c9f1e5be77caf39804636bc1a40133919a949f21","impliedFormat":1},{"version":"c6fd2c5a395f2432786c9cb8deb870b9b0e8ff7e22c029954fabdd692bff6195","impliedFormat":1},{"version":"1d6e127068ea8e104a912e42fc0a110e2aa5a66a356a917a163e8cf9a65e4a75","impliedFormat":1},{"version":"5ded6427296cdf3b9542de4471d2aa8d3983671d4cac0f4bf9c637208d1ced43","impliedFormat":1},{"version":"7f182617db458e98fc18dfb272d40aa2fff3a353c44a89b2c0ccb3937709bfb5","impliedFormat":1},{"version":"cadc8aced301244057c4e7e73fbcae534b0f5b12a37b150d80e5a45aa4bebcbd","impliedFormat":1},{"version":"385aab901643aa54e1c36f5ef3107913b10d1b5bb8cbcd933d4263b80a0d7f20","impliedFormat":1},{"version":"9670d44354bab9d9982eca21945686b5c24a3f893db73c0dae0fd74217a4c219","impliedFormat":1},{"version":"0b8a9268adaf4da35e7fa830c8981cfa22adbbe5b3f6f5ab91f6658899e657a7","impliedFormat":1},{"version":"11396ed8a44c02ab9798b7dca436009f866e8dae3c9c25e8c1fbc396880bf1bb","impliedFormat":1},{"version":"ba7bc87d01492633cb5a0e5da8a4a42a1c86270e7b3d2dea5d156828a84e4882","impliedFormat":1},{"version":"4893a895ea92c85345017a04ed427cbd6a1710453338df26881a6019432febdd","impliedFormat":1},{"version":"c21dc52e277bcfc75fac0436ccb75c204f9e1b3fa5e12729670910639f27343e","impliedFormat":1},{"version":"13f6f39e12b1518c6650bbb220c8985999020fe0f21d818e28f512b7771d00f9","impliedFormat":1},{"version":"9b5369969f6e7175740bf51223112ff209f94ba43ecd3bb09eefff9fd675624a","impliedFormat":1},{"version":"4fe9e626e7164748e8769bbf74b538e09607f07ed17c2f20af8d680ee49fc1da","impliedFormat":1},{"version":"24515859bc0b836719105bb6cc3d68255042a9f02a6022b3187948b204946bd2","impliedFormat":1},{"version":"ea0148f897b45a76544ae179784c95af1bd6721b8610af9ffa467a518a086a43","impliedFormat":1},{"version":"24c6a117721e606c9984335f71711877293a9651e44f59f3d21c1ea0856f9cc9","impliedFormat":1},{"version":"dd3273ead9fbde62a72949c97dbec2247ea08e0c6952e701a483d74ef92d6a17","impliedFormat":1},{"version":"405822be75ad3e4d162e07439bac80c6bcc6dbae1929e179cf467ec0b9ee4e2e","impliedFormat":1},{"version":"0db18c6e78ea846316c012478888f33c11ffadab9efd1cc8bcc12daded7a60b6","impliedFormat":1},{"version":"e61be3f894b41b7baa1fbd6a66893f2579bfad01d208b4ff61daef21493ef0a8","impliedFormat":1},{"version":"bd0532fd6556073727d28da0edfd1736417a3f9f394877b6d5ef6ad88fba1d1a","impliedFormat":1},{"version":"89167d696a849fce5ca508032aabfe901c0868f833a8625d5a9c6e861ef935d2","impliedFormat":1},{"version":"615ba88d0128ed16bf83ef8ccbb6aff05c3ee2db1cc0f89ab50a4939bfc1943f","impliedFormat":1},{"version":"a4d551dbf8746780194d550c88f26cf937caf8d56f102969a110cfaed4b06656","impliedFormat":1},{"version":"8bd86b8e8f6a6aa6c49b71e14c4ffe1211a0e97c80f08d2c8cc98838006e4b88","impliedFormat":1},{"version":"317e63deeb21ac07f3992f5b50cdca8338f10acd4fbb7257ebf56735bf52ab00","impliedFormat":1},{"version":"4732aec92b20fb28c5fe9ad99521fb59974289ed1e45aecb282616202184064f","impliedFormat":1},{"version":"2e85db9e6fd73cfa3d7f28e0ab6b55417ea18931423bd47b409a96e4a169e8e6","impliedFormat":1},{"version":"c46e079fe54c76f95c67fb89081b3e399da2c7d109e7dca8e4b58d83e332e605","impliedFormat":1},{"version":"bf67d53d168abc1298888693338cb82854bdb2e69ef83f8a0092093c2d562107","impliedFormat":1},{"version":"b52476feb4a0cbcb25e5931b930fc73cb6643fb1a5060bf8a3dda0eeae5b4b68","affectsGlobalScope":true,"impliedFormat":1},{"version":"f9501cc13ce624c72b61f12b3963e84fad210fbdf0ffbc4590e08460a3f04eba","affectsGlobalScope":true,"impliedFormat":1},{"version":"e7721c4f69f93c91360c26a0a84ee885997d748237ef78ef665b153e622b36c1","affectsGlobalScope":true,"impliedFormat":1},{"version":"d97fb21da858fb18b8ae72c314e9743fd52f73ebe2764e12af1db32fc03f853f","affectsGlobalScope":true,"impliedFormat":1},{"version":"0fa06ada475b910e2106c98c68b10483dc8811d0c14a8a8dd36efb2672485b29","impliedFormat":1},{"version":"33e5e9aba62c3193d10d1d33ae1fa75c46a1171cf76fef750777377d53b0303f","impliedFormat":1},{"version":"2b06b93fd01bcd49d1a6bd1f9b65ddcae6480b9a86e9061634d6f8e354c1468f","impliedFormat":1},{"version":"6a0cd27e5dc2cfbe039e731cf879d12b0e2dded06d1b1dedad07f7712de0d7f4","affectsGlobalScope":true,"impliedFormat":1},{"version":"13f5c844119c43e51ce777c509267f14d6aaf31eafb2c2b002ca35584cd13b29","impliedFormat":1},{"version":"e60477649d6ad21542bd2dc7e3d9ff6853d0797ba9f689ba2f6653818999c264","impliedFormat":1},{"version":"c2510f124c0293ab80b1777c44d80f812b75612f297b9857406468c0f4dafe29","affectsGlobalScope":true,"impliedFormat":1},{"version":"5524481e56c48ff486f42926778c0a3cce1cc85dc46683b92b1271865bcf015a","impliedFormat":1},{"version":"4c829ab315f57c5442c6667b53769975acbf92003a66aef19bce151987675bd1","affectsGlobalScope":true,"impliedFormat":1},{"version":"b2ade7657e2db96d18315694789eff2ddd3d8aea7215b181f8a0b303277cc579","impliedFormat":1},{"version":"78dbea00e90d2df8ea3dbef0cc379d95b8be9b71cd6bde4c28728f306811803b","impliedFormat":1},{"version":"4d631b81fa2f07a0e63a9a143d6a82c25c5f051298651a9b69176ba28930756d","impliedFormat":1},{"version":"836a356aae992ff3c28a0212e3eabcb76dd4b0cc06bcb9607aeef560661b860d","impliedFormat":1},{"version":"1e0d1f8b0adfa0b0330e028c7941b5a98c08b600efe7f14d2d2a00854fb2f393","impliedFormat":1},{"version":"41670ee38943d9cbb4924e436f56fc19ee94232bc96108562de1a734af20dc2c","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e1e46d0a9837ee058c100501080c920fa98081ea3956af0374308ba6f22a33e","impliedFormat":1},{"version":"272ca407e0c9068bdc5152552d876e68037ceae3de62e529306403e973dec8e1","impliedFormat":1},{"version":"fa7834c715d5357e4540cee40ce96c3250ddb67a7b879a6b7fa0e86d6696f121","impliedFormat":1},{"version":"22dfb07a7ab15b66ac043829056fe70124844636ae719551812ac631ba04985b","impliedFormat":1},{"version":"a10f0e1854f3316d7ee437b79649e5a6ae3ae14ffe6322b02d4987071a95362e","impliedFormat":1},{"version":"e208f73ef6a980104304b0d2ca5f6bf1b85de6009d2c7e404028b875020fa8f2","impliedFormat":1},{"version":"d163b6bc2372b4f07260747cbc6c0a6405ab3fbcea3852305e98ac43ca59f5bc","impliedFormat":1},{"version":"e6fa9ad47c5f71ff733744a029d1dc472c618de53804eae08ffc243b936f87ff","affectsGlobalScope":true,"impliedFormat":1},{"version":"a6f137d651076822d4fe884287e68fd61785a0d3d1fdb250a5059b691fa897db","impliedFormat":1},{"version":"24826ed94a78d5c64bd857570fdbd96229ad41b5cb654c08d75a9845e3ab7dde","impliedFormat":1},{"version":"8b479a130ccb62e98f11f136d3ac80f2984fdc07616516d29881f3061f2dd472","impliedFormat":1},{"version":"928af3d90454bf656a52a48679f199f64c1435247d6189d1caf4c68f2eaf921f","affectsGlobalScope":true,"impliedFormat":1},{"version":"bceb58df66ab8fb00170df20cd813978c5ab84be1d285710c4eb005d8e9d8efb","affectsGlobalScope":true,"impliedFormat":1},{"version":"3f16a7e4deafa527ed9995a772bb380eb7d3c2c0fd4ae178c5263ed18394db2c","impliedFormat":1},{"version":"933921f0bb0ec12ef45d1062a1fc0f27635318f4d294e4d99de9a5493e618ca2","impliedFormat":1},{"version":"71a0f3ad612c123b57239a7749770017ecfe6b66411488000aba83e4546fde25","impliedFormat":1},{"version":"77fbe5eecb6fac4b6242bbf6eebfc43e98ce5ccba8fa44e0ef6a95c945ff4d98","impliedFormat":1},{"version":"4f9d8ca0c417b67b69eeb54c7ca1bedd7b56034bb9bfd27c5d4f3bc4692daca7","impliedFormat":1},{"version":"0cb167c371eaa8c869f8a7656a7296f2e4fae43b4d8b803a680236b24794e5f9","impliedFormat":1},{"version":"0a839dba0287cc0481ad4beedd48a1c64acf1e212ae865d1315f7007ca215161","impliedFormat":1},{"version":"38dc4655376cd1a4bd6bb3763d92949233e33d38d3dd3cbea7bbf218175a38ef","impliedFormat":1},{"version":"37ba7b45141a45ce6e80e66f2a96c8a5ab1bcef0fc2d0f56bb58df96ec67e972","impliedFormat":1},{"version":"45650f47bfb376c8a8ed39d4bcda5902ab899a3150029684ee4c10676d9fbaee","impliedFormat":1},{"version":"d61e0a64cd175208ac0b83670151a9a6b5916f0d1ffcdc5c29c90b1cebfc5045","affectsGlobalScope":true,"impliedFormat":1},{"version":"18fd40412d102c5564136f29735e5d1c3b455b8a37f920da79561f1fde068208","impliedFormat":1},{"version":"48a679952eefe4cb776d5a0e1ccba2d3eb53b57448bbb7abc1fcebcbd5440188","impliedFormat":1},{"version":"f0be1b8078cd549d91f37c30c222c2a187ac1cf981d994fb476a1adc61387b14","affectsGlobalScope":true,"impliedFormat":1},{"version":"0aaed1d72199b01234152f7a60046bc947f1f37d78d182e9ae09c4289e06a592","impliedFormat":1},{"version":"2d14da6ecb49bf828d83948765ec2d3a579d476bbb9645e749610baa6ec880ca","impliedFormat":1},{"version":"66ba1b2c3e3a3644a1011cd530fb444a96b1b2dfe2f5e837a002d41a1a799e60","impliedFormat":1},{"version":"7e514f5b852fdbc166b539fdd1f4e9114f29911592a5eb10a94bb3a13ccac3c4","impliedFormat":1},{"version":"5b7aa3c4c1a5d81b411e8cb302b45507fea9358d3569196b27eb1a27ae3a90ef","affectsGlobalScope":true,"impliedFormat":1},{"version":"5987a903da92c7462e0b35704ce7da94d7fdc4b89a984871c0e2b87a8aae9e69","affectsGlobalScope":true,"impliedFormat":1},{"version":"ea08a0345023ade2b47fbff5a76d0d0ed8bff10bc9d22b83f40858a8e941501c","impliedFormat":1},{"version":"0aef708fb4c7a6b915e8305cbfac40cd207b032dbaabe9a01889a5fff3254681","impliedFormat":1},{"version":"ae062ce7d9510060c5d7e7952ae379224fb3f8f2dd74e88959878af2057c143b","impliedFormat":1},{"version":"ad9bdafb4e7abf14cc53ce7970486a84c87831e62891e5dfe798ddcd55e84701","affectsGlobalScope":true,"impliedFormat":1},{"version":"358765d5ea8afd285d4fd1532e78b88273f18cb3f87403a9b16fef61ac9fdcfe","impliedFormat":1},{"version":"71d3ae6a5e73ca4130762560425e00984ebaff64d5353a3333d1bb7eb86ef336","impliedFormat":1},{"version":"2beff543f6e9a9701df88daeee3cdd70a34b4a1c11cb4c734472195a5cb2af54","impliedFormat":1},{"version":"2e07abf27aa06353d46f4448c0bbac73431f6065eef7113128a5cd804d0c384d","impliedFormat":1},{"version":"be1cc4d94ea60cbe567bc29ed479d42587bf1e6cba490f123d329976b0fe4ee5","impliedFormat":1},{"version":"66be1299a7a3129ceb488b340c291cf575bebb0e337f92e169dec38231472e34","impliedFormat":1},{"version":"9894dafe342b976d251aac58e616ac6df8db91fb9d98934ff9dd103e9e82578f","impliedFormat":1},{"version":"413df52d4ea14472c2fa5bee62f7a40abd1eb49be0b9722ee01ee4e52e63beb2","impliedFormat":1},{"version":"db6d2d9daad8a6d83f281af12ce4355a20b9a3e71b82b9f57cddcca0a8964a96","impliedFormat":1},{"version":"446a50749b24d14deac6f8843e057a6355dd6437d1fac4f9e5ce4a5071f34bff","impliedFormat":1},{"version":"182e9fcbe08ac7c012e0a6e2b5798b4352470be29a64fdc114d23c2bab7d5106","impliedFormat":1},{"version":"2f4e6b4d39426a1b85ecf4bdeb9dddbf4d9b3397d95d8555d46f925c9519ec7d","impliedFormat":1},{"version":"78a2869ad0cbf3f9045dda08c0d4562b7e1b2bfe07b19e0db072f5c3c56e9584","impliedFormat":1},{"version":"89d5d28d4f57e000b836ac273079be1b75710e28ce14750d081fb420d37e2ca5","impliedFormat":1},{"version":"fd4e24ccff3966390600d7f5d6aa1fed5a512e92ada735ea5fbc933d313ad3d3","impliedFormat":1},{"version":"b7cddfe1aa6b86b5fad3c9ccb30d05b3ccb165aebbf112f48d2d8a5f69dd98b1","impliedFormat":1},{"version":"a86f82d646a739041d6702101afa82dcb935c416dd93cbca7fd754fd0282ce1f","impliedFormat":1},{"version":"ad0d1d75d129b1c80f911be438d6b61bfa8703930a8ff2be2f0e1f8a91841c64","impliedFormat":1},{"version":"bd2c7ada3dee03653d3f601011d30072194bc3970cd93208f9588fbdc0c69347","impliedFormat":1},{"version":"e480da45d32313e7174b265674da504f075f59ef326852f0c5a5d863b438ae85","impliedFormat":1},{"version":"ad54850f61fcf5d014e11be80d2f46fea9265cfa7e77456da876f7833ef81769","impliedFormat":1},{"version":"6f7c9e8bd2b5b6a080b07080065f94900bd3c7e5ebbd3047bc33fcce2fab1dd8","impliedFormat":1},{"version":"3e7efde639c6a6c3edb9847b3f61e308bf7a69685b92f665048c45132f51c218","impliedFormat":1},{"version":"df45ca1176e6ac211eae7ddf51336dc075c5314bc5c253651bae639defd5eec5","impliedFormat":1},{"version":"8a0e762ceb20c7e72504feef83d709468a70af4abccb304f32d6b9bac1129b2c","impliedFormat":1},{"version":"da5950ee2a90721df6f3fba45f5d05308f7e4c35835392215dd2cd404505e2de","impliedFormat":1},{"version":"ce75b1aebb33d510ff28af960a9221410a3eaf7f18fc5f21f9404075fba77256","impliedFormat":1},{"version":"f42d5fed19610d485c646a0c430e768115567d078c7fc855c57b0c578b3d6cd3","impliedFormat":1},{"version":"ee8df1cb8d0faaca4013a1b442e99130769ce06f438d18d510fed95890067563","impliedFormat":1},{"version":"d5630f2ad9b4541e5ce891648121022f9412ecdca1820baa1f0104f70fd7eff7","impliedFormat":1},{"version":"4d15375ab13497104bc8fe56fdef2b5fd6853f29255737d23a33fa306ff7fd69","impliedFormat":1},{"version":"2cd3fc1d0d6a1e85baffd2d4f50f5efb192b5446eef567e97c94765402f0aad4","impliedFormat":1},{"version":"e4cbf2f1e89ecccaddd2c045e600ae41b732295953fb06247c7dcbc2d281ed30","impliedFormat":1},{"version":"6dcedaef57dff0d79a05ab0ab602cde74db803d1e765468bf91263786a383e1b","impliedFormat":1},{"version":"8c1697d90c394a6fd955b98eae01238eff628e129b987a68aea10f898a48e7da","impliedFormat":1},{"version":"7580e62139cb2b44a0270c8d01abcbfcba2819a02514a527342447fa69b34ef1","impliedFormat":1},{"version":"b838d4c72740eb0afd284bf7575b74c624b105eff2e8c7b4aeead57e7ac320ff","impliedFormat":1},{"version":"f374cb24e93e7798c4d9e83ff872fa52d2cdb36306392b840a6ddf46cb925cb6","impliedFormat":1},{"version":"d10d63718e1646c2279e3b33831f82c60e31f622b2b7020f1196409ca4c09242","impliedFormat":1},{"version":"106c6025f1d99fd468fd8bf6e5bda724e11e5905a4076c5d29790b6c3745e50c","impliedFormat":1},{"version":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","impliedFormat":1},{"version":"148679c6d0f449210a96e7d2e562d589e56fcde87f843a92808b3ff103f1a774","impliedFormat":1},{"version":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","impliedFormat":1},{"version":"02436d7e9ead85e09a2f8e27d5f47d9464bced31738dec138ca735390815c9f0","impliedFormat":1},{"version":"f8d5ff8eafd37499f2b6a98659dd9b45a321de186b8db6b6142faed0fea3de77","impliedFormat":1},{"version":"c86fe861cf1b4c46a0fb7d74dffe596cf679a2e5e8b1456881313170f092e3fa","impliedFormat":1},{"version":"a22dd55aa4d39906252000ab8e8a1b83b195eef7f4274eb51e457c1f11cf6580","impliedFormat":1},{"version":"540cc83ab772a2c6bc509fe1354f314825b5dba3669efdfbe4693ecd3048e34f","impliedFormat":1},{"version":"121b0696021ab885c570bbeb331be8ad82c6efe2f3b93a6e63874901bebc13e3","impliedFormat":1},{"version":"612d9da66bb046a9c1e2e8d026245ded881fc4b9f98cbfae714415d57ee0ae0b","impliedFormat":1},{"version":"32c2ad9494dad5d11b0564a619fee18f388db6c1e9e2cd3c360b3122549691eb","impliedFormat":1},{"version":"6c301d40aec56a74ec7bd7324e31a728dadf9bfba3e96def02938d3d973534ec","impliedFormat":1},{"version":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","impliedFormat":1},{"version":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","impliedFormat":1},{"version":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881","impliedFormat":1},{"version":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881","impliedFormat":1},{"version":"aa14cee20aa0db79f8df101fc027d929aec10feb5b8a8da3b9af3895d05b7ba2","impliedFormat":1},{"version":"493c700ac3bd317177b2eb913805c87fe60d4e8af4fb39c41f04ba81fae7e170","impliedFormat":1},{"version":"aeb554d876c6b8c818da2e118d8b11e1e559adbe6bf606cc9a611c1b6c09f670","impliedFormat":1},{"version":"acf5a2ac47b59ca07afa9abbd2b31d001bf7448b041927befae2ea5b1951d9f9","impliedFormat":1},{"version":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881","impliedFormat":1},{"version":"d71291eff1e19d8762a908ba947e891af44749f3a2cbc5bd2ec4b72f72ea795f","impliedFormat":1},{"version":"c0480e03db4b816dff2682b347c95f2177699525c54e7e6f6aa8ded890b76be7","impliedFormat":1},{"version":"25a5f6fd3a2243c859eddc99ab5fba11d970af2fe7a5df9c32b7668f76f97b01","impliedFormat":1},{"version":"8d207e1f9d2c30d6f77dfa693f3827c3fbf0d89240297e10bdfe1041d433df68","impliedFormat":1},{"version":"b620391fe8060cf9bedc176a4d01366e6574d7a71e0ac0ab344a4e76576fcbb8","impliedFormat":1},{"version":"6ac6715916fa75a1f7ebdfeacac09513b4d904b667d827b7535e84ff59679aff","impliedFormat":1},{"version":"2652448ac55a2010a1f71dd141f828b682298d39728f9871e1cdf8696ef443fd","impliedFormat":1},{"version":"d682336018141807fb602709e2d95a192828fcb8d5ba06dda3833a8ea98f69e3","impliedFormat":1},{"version":"6124e973eab8c52cabf3c07575204efc1784aca6b0a30c79eb85fe240a857efa","impliedFormat":1},{"version":"0d891735a21edc75df51f3eb995e18149e119d1ce22fd40db2b260c5960b914e","impliedFormat":1},{"version":"3b414b99a73171e1c4b7b7714e26b87d6c5cb03d200352da5342ab4088a54c85","impliedFormat":1},{"version":"4fbd3116e00ed3a6410499924b6403cc9367fdca303e34838129b328058ede40","impliedFormat":1},{"version":"9c82171d836c47486074e4ca8e059735bf97b205e70b196535b5efd40cbe1bc5","impliedFormat":1},{"version":"48dcc919f76c040a999c0d46d2bf25ab089645ca21b837f120b222f56a86cd76","impliedFormat":1},{"version":"2f9c89cbb29d362290531b48880a4024f258c6033aaeb7e59fbc62db26819650","impliedFormat":1},{"version":"a365c4d3bed3be4e4e20793c999c51f5cd7e6792322f14650949d827fbcd170f","impliedFormat":1},{"version":"c5426dbfc1cf90532f66965a7aa8c1136a78d4d0f96d8180ecbfc11d7722f1a5","impliedFormat":1},{"version":"65a15fc47900787c0bd18b603afb98d33ede930bed1798fc984d5ebb78b26cf9","impliedFormat":1},{"version":"9d202701f6e0744adb6314d03d2eb8fc994798fc83d91b691b75b07626a69801","impliedFormat":1},{"version":"de9d2df7663e64e3a91bf495f315a7577e23ba088f2949d5ce9ec96f44fba37d","impliedFormat":1},{"version":"c7af78a2ea7cb1cd009cfb5bdb48cd0b03dad3b54f6da7aab615c2e9e9d570c5","impliedFormat":1},{"version":"1ee45496b5f8bdee6f7abc233355898e5bf9bd51255db65f5ff7ede617ca0027","impliedFormat":1},{"version":"273782b8454e78f6a8b30d2cfbf6860499c930595095fcc1689637115f0eddda","affectsGlobalScope":true,"impliedFormat":1},{"version":"3fbdd025f9d4d820414417eeb4107ffa0078d454a033b506e22d3a23bc3d9c41","affectsGlobalScope":true,"impliedFormat":1},{"version":"dba114fb6a32b355a9cfc26ca2276834d72fe0e94cd2c3494005547025015369","impliedFormat":1},{"version":"a8f8e6ab2fa07b45251f403548b78eaf2022f3c2254df3dc186cb2671fe4996d","affectsGlobalScope":true,"impliedFormat":1},{"version":"fa6c12a7c0f6b84d512f200690bfc74819e99efae69e4c95c4cd30f6884c526e","impliedFormat":1},{"version":"f1c32f9ce9c497da4dc215c3bc84b722ea02497d35f9134db3bb40a8d918b92b","impliedFormat":1},{"version":"b73c319af2cc3ef8f6421308a250f328836531ea3761823b4cabbd133047aefa","affectsGlobalScope":true,"impliedFormat":1},{"version":"e433b0337b8106909e7953015e8fa3f2d30797cea27141d1c5b135365bb975a6","impliedFormat":1},{"version":"9f9bb6755a8ce32d656ffa4763a8144aa4f274d6b69b59d7c32811031467216e","impliedFormat":1},{"version":"5c32bdfbd2d65e8fffbb9fbda04d7165e9181b08dad61154961852366deb7540","impliedFormat":1},{"version":"ddff7fc6edbdc5163a09e22bf8df7bef75f75369ebd7ecea95ba55c4386e2441","impliedFormat":1},{"version":"0c05e9842ec4f8b7bfebfd3ca61604bb8c914ba8da9b5337c4f25da427a005f2","impliedFormat":1},{"version":"faed7a5153215dbd6ebe76dfdcc0af0cfe760f7362bed43284be544308b114cf","impliedFormat":1},{"version":"7029e566b8df176f703fb59fd437a38670c7a0e02c58b2d66dfb5b2e2b2defdb","impliedFormat":1},{"version":"7f2aa4d4989a82530aaac3f72b3dceca90e9c25bee0b1a327e8a08a1262435ad","impliedFormat":1},{"version":"d96b39301d0ded3f1a27b47759676a33a02f6f5049bfcbde81e533fd10f50dcb","impliedFormat":1},{"version":"e9f147ecca73d9346a4c073432843c159ccbe50bdcb678a78f6da10eae2cecf4","impliedFormat":1},{"version":"de061f7d72bd65c06fc1419f841dfdcb29a8e22fe6fa527d1e6eb20b897d4de0","impliedFormat":1},{"version":"663beafc2446079574570cba86e9b15f986f908ddb1b01274509970126fee945","impliedFormat":1},{"version":"a3102887d5058bf4cb5b37fa6964c09e9527c42053b3b5c642b89878620748de","impliedFormat":1},{"version":"0aaaa1727edd29673d85c9b26d7ca4d54e5407a48586903c51b48b7f7d196f61","impliedFormat":1},{"version":"d35bca0b261bff02635758c48e8ab99c61c420d0dfabbcf467e847171d876b7d","impliedFormat":1},{"version":"3bc12c40d90c342ff88a3d876996c555ed5cbee5fe8c3308a240b321f401ee46","impliedFormat":1},{"version":"ba130768aae855a5477e9e148e5c879548e6e7ccbcc56fd1934c8a18ea5b7569","impliedFormat":1},{"version":"2e4f37ffe8862b14d8e24ae8763daaa8340c0df0b859d9a9733def0eee7562d9","impliedFormat":1},{"version":"d38530db0601215d6d767f280e3a3c54b2a83b709e8d9001acb6f61c67e965fc","impliedFormat":1},{"version":"6ac6715916fa75a1f7ebdfeacac09513b4d904b667d827b7535e84ff59679aff","impliedFormat":1},{"version":"b499af2054a037a162b3b72cd886f48bbf32a3502c865c6e29fac7d2ab3ce0b5","impliedFormat":1},{"version":"b83cb14474fa60c5f3ec660146b97d122f0735627f80d82dd03e8caa39b4388c","impliedFormat":1},{"version":"48773ca557b0319c2ee62ae249cf52a81709e8be139920d6479a66274de7c4ed","impliedFormat":1},{"version":"7274fbffbd7c9589d8d0ffba68157237afd5cecff1e99881ea3399127e60572f","impliedFormat":1},{"version":"b73cbf0a72c8800cf8f96a9acfe94f3ad32ca71342a8908b8ae484d61113f647","impliedFormat":1},{"version":"bae6dd176832f6423966647382c0d7ba9e63f8c167522f09a982f086cd4e8b23","impliedFormat":1},{"version":"20865ac316b8893c1a0cc383ccfc1801443fbcc2a7255be166cf90d03fac88c9","impliedFormat":1},{"version":"c9958eb32126a3843deedda8c22fb97024aa5d6dd588b90af2d7f2bfac540f23","impliedFormat":1},{"version":"461d0ad8ae5f2ff981778af912ba71b37a8426a33301daa00f21c6ccb27f8156","impliedFormat":1},{"version":"e927c2c13c4eaf0a7f17e6022eee8519eb29ef42c4c13a31e81a611ab8c95577","impliedFormat":1},{"version":"fcafff163ca5e66d3b87126e756e1b6dfa8c526aa9cd2a2b0a9da837d81bbd72","impliedFormat":1},{"version":"70246ad95ad8a22bdfe806cb5d383a26c0c6e58e7207ab9c431f1cb175aca657","impliedFormat":1},{"version":"f00f3aa5d64ff46e600648b55a79dcd1333458f7a10da2ed594d9f0a44b76d0b","impliedFormat":1},{"version":"772d8d5eb158b6c92412c03228bd9902ccb1457d7a705b8129814a5d1a6308fc","impliedFormat":1},{"version":"802e797bcab5663b2c9f63f51bdf67eff7c41bc64c0fd65e6da3e7941359e2f7","impliedFormat":1},{"version":"b01bd582a6e41457bc56e6f0f9de4cb17f33f5f3843a7cf8210ac9c18472fb0f","impliedFormat":1},{"version":"8b4327413e5af38cd8cb97c59f48c3c866015d5d642f28518e3a891c469f240e","impliedFormat":1},{"version":"4cceef18d7f088e797a463e90b7a9dad10c6bc667724b7686e3e740ae00122be","impliedFormat":1},{"version":"7ee86fbb3754388e004de0ef9e6505485ddfb3be7640783d6d015711c03d302d","impliedFormat":1},{"version":"cc1954b539604b1e562319119ac7e888172208b32ca873f9a357a92c826bd046","impliedFormat":1},{"version":"a67b87d0281c97dfc1197ef28dfe397fc2c865ccd41f7e32b53f647184cc7307","impliedFormat":1},{"version":"771ffb773f1ddd562492a6b9aaca648192ac3f056f0e1d997678ff97dbb6bf9b","impliedFormat":1},{"version":"43e96a3d5d1411ab40ba2f61d6a3192e58177bcf3b133a80ad2a16591611726d","impliedFormat":1},{"version":"232f70c0cf2b432f3a6e56a8dc3417103eb162292a9fd376d51a3a9ea5fbbf6f","impliedFormat":1},{"version":"bb8f2dbc03533abca2066ce4655c119bff353dd4514375beb93c08590c03e023","impliedFormat":1},{"version":"706dd95827e7ebaabda91d5db2b755233e0952d98570e9c032b0f066a15c1177","affectsGlobalScope":true,"impliedFormat":1},{"version":"0b103e9abfe82d14c0ad06a55d9f91d6747154ef7cacc73cf27ecad2bfb3afcf","impliedFormat":1},{"version":"cd9304972e6d616197fb44fce00540a904f38b54306a1951b5dbeaf3c01ab5bd","impliedFormat":1},{"version":"77438e2c397a3db78407621cfc57241a305b310ddea2c185f1d555248297f587","impliedFormat":1},{"version":"120599fd965257b1f4d0ff794bc696162832d9d8467224f4665f713a3119078b","impliedFormat":1},{"version":"43ba4f2fa8c698f5c304d21a3ef596741e8e85a810b7c1f9b692653791d8d97a","impliedFormat":1},{"version":"5433f33b0a20300cca35d2f229a7fc20b0e8477c44be2affeb21cb464af60c76","impliedFormat":1},{"version":"db036c56f79186da50af66511d37d9fe77fa6793381927292d17f81f787bb195","impliedFormat":1},{"version":"a6805fcafed712aea7759f8bc731014f9d22738c1d6ef9d43b8091d1d48346d5","impliedFormat":1},{"version":"c49469a5349b3cc1965710b5b0f98ed6c028686aa8450bcb3796728873eb923e","impliedFormat":1},{"version":"4a889f2c763edb4d55cb624257272ac10d04a1cad2ed2948b10ed4a7fda2a428","impliedFormat":1},{"version":"7bb79aa2fead87d9d56294ef71e056487e848d7b550c9a367523ee5416c44cfa","impliedFormat":1},{"version":"d88ea80a6447d7391f52352ec97e56b52ebec934a4a4af6e2464cfd8b39c3ba8","impliedFormat":1},{"version":"142617b3cdf902b69c6464c9fbd942b60ab3e733ca18c032b19e0f7e2adbefe8","impliedFormat":1},{"version":"0b603555f1881f87256ffd6344d3e3ed6d466c2e701eabf381f28be8c2125892","impliedFormat":1},{"version":"897e4f7662488e3ecc79e743bdd3b78f13bdb69a97851afa5b440c4211e32ea9","impliedFormat":1},{"version":"e2e1c6d3b2d93add5200bd7bc1a8cccb4e446836b2111ece45db8683a2c765de","impliedFormat":1},{"version":"251b03d5cd243854ce870d9a9a39f491faf69898c5d6b5eee28cc7649c57417b","impliedFormat":1},{"version":"27ff4196654e6373c9af16b6165120e2dd2169f9ad6abb5c935af5abd8c7938c","impliedFormat":1},{"version":"2c4de79f406d137390608e8c0a44fba2ff8e00bacfcae7c9d1781fef10e9440d","impliedFormat":1},{"version":"07ba23a10465791be5d22deaf5ef7de7658774ddff53721e5ea17fedea1bc721","impliedFormat":1},{"version":"dca8c645c5afeb03b1ecedbf16323f33e7d0afaa6256c8e047e6e38087a97f53","impliedFormat":1},{"version":"775f181bd4a533d6f8b5e55ec1d9f1624559720ae8a70e9432258da26b38d27c","impliedFormat":1},{"version":"796273b2edc72e78a04e86d7c58ae94d370ab93a0ddf40b1aa85a37a1c29ecd7","impliedFormat":1},{"version":"5df15a69187d737d6d8d066e189ae4f97e41f4d53712a46b2710ff9f8563ec9f","impliedFormat":1},{"version":"7715134a0cf07dd41a9da2895d708625a3a303a0385e355ecaaf0b8bfaef2550","impliedFormat":1},{"version":"6ac6715916fa75a1f7ebdfeacac09513b4d904b667d827b7535e84ff59679aff","impliedFormat":1},{"version":"622694a8522b46f6310c2a9b5d2530dde1e2854cb5829354e6d1ff8f371cf469","impliedFormat":1},{"version":"cd8ce8d68567f62dd580b3c3c37777ac3f5b81944c7417f5ea83030eab533385","impliedFormat":1},{"version":"e5c939d896565dcac0f6fbdbada11284e7728ef26a069561c09aa5aa4a788393","impliedFormat":1},{"version":"9e2739b32f741859263fdba0244c194ca8e96da49b430377930b8f721d77c000","impliedFormat":1},{"version":"a9e6c0ff3f8186fccd05752cf75fc94e147c02645087ac6de5cc16403323d870","impliedFormat":1},{"version":"49af4b52f0d4d2304c5f2c6fe5fab3e153e0acc38830d0202821b877c097dd02","impliedFormat":1},{"version":"49c346823ba6d4b12278c12c977fb3a31c06b9ca719015978cb145eb86da1c61","impliedFormat":1},{"version":"bfac6e50eaa7e73bb66b7e052c38fdc8ccfc8dbde2777648642af33cf349f7f1","impliedFormat":1},{"version":"92f7c1a4da7fbfd67a2228d1687d5c2e1faa0ba865a94d3550a3941d7527a45d","impliedFormat":1},{"version":"f53b120213a9289d9a26f5af90c4c686dd71d91487a0aa5451a38366c70dc64b","impliedFormat":1},{"version":"e68b8e5a1df7c1be2bc105141456ecba70215806e1c28bfbc5c12bfce4be6e68","impliedFormat":1},{"version":"511c8f02329808d47d00b859c532ae9115590048b17325a946c74dac48428650","impliedFormat":1},{"version":"57d67b72e06059adc5e9454de26bbfe567d412b962a501d263c75c2db430f40e","impliedFormat":1},{"version":"b5f9e66625783eefcbe3d2da074b2e7ba2066d61ce3fc6ef4f22805ad946cab4","impliedFormat":1},{"version":"e37115962d284b9f7a37c2bdd2add50f88365dde41f5e0ff591ffc48a8ec7575","impliedFormat":1},{"version":"6459054aabb306821a043e02b89d54da508e3a6966601a41e71c166e4ea1474f","impliedFormat":1},{"version":"bb37588926aba35c9283fe8d46ebf4e79ffe976343105f5c6d45f282793352b2","impliedFormat":1},{"version":"f89488602bec98a142072fae7ea5ba99431a569ff580c64b7be39896474799d8","impliedFormat":1},{"version":"bbbc47961f39a57df103cf4ca3bb8f8732b4b6678a18225a0aa76d59c466956c","impliedFormat":1},{"version":"2e6114a7dd6feeef85b2c80120fdbfb59a5529c0dcc5bfa8447b6996c97a69f5","impliedFormat":1},{"version":"2ffb043dc5163458e473b7010859f86e01dc4edffcae0a93d885d028b426a546","impliedFormat":1},{"version":"c8f004e6036aa1c764ad4ec543cf89a5c1893a9535c80ef3f2b653e370de45e6","impliedFormat":1},{"version":"dd80b1e600d00f5c6a6ba23f455b84a7db121219e68f89f10552c54ba46e4dc9","impliedFormat":1},{"version":"b064c36f35de7387d71c599bfcf28875849a1dbc733e82bd26cae3d1cd060521","impliedFormat":1},{"version":"05c7280d72f3ed26f346cbe7cbbbb002fb7f15739197cbbee6ab3fd1a6cb9347","impliedFormat":1},{"version":"8de9fe97fa9e00ec00666fa77ab6e91b35d25af8ca75dabcb01e14ad3299b150","impliedFormat":1},{"version":"04b7b2e0832dfd3c31e81df3975e8d8fda28e7ff999b0aa2932608a8f6661d5c","impliedFormat":1},{"version":"ca2d34c6ed5cbd3070b8b6f32f42ae54adcc6499c1e4b99f0a5798b3f27cc653","impliedFormat":1},{"version":"9ec68995e66dd6b9dac834bf5ae85fde802714ea2e82151a5d1d53ef01b463ef","impliedFormat":1},{"version":"5c4d626b4902f2ef8a1cc146d761d276cef988016dc674e3b98fbad70e64bc9f","impliedFormat":1},{"version":"fdfaa0aad899524962e2955287b5b991ffe3be50f64e02eb60c933ca44644a94","impliedFormat":1},{"version":"53c972a0f9bc3a4ec70fff7314123ea8cfcf75b3703046f767d2dc1eea87b2fb","impliedFormat":1},{"version":"f974e4a06953682a2c15d5bd5114c0284d5abf8bc0fe4da25cb9159427b70072","impliedFormat":1},{"version":"50256e9c31318487f3752b7ac12ff365c8949953e04568009c8705db802776fb","impliedFormat":1},{"version":"7d73b24e7bf31dfb8a931ca6c4245f6bb0814dfae17e4b60c9e194a631fe5f7b","impliedFormat":1},{"version":"d130c5f73768de51402351d5dc7d1b36eaec980ca697846e53156e4ea9911476","impliedFormat":1},{"version":"413586add0cfe7369b64979d4ec2ed56c3f771c0667fbde1bf1f10063ede0b08","impliedFormat":1},{"version":"06472528e998d152375ad3bd8ebcb69ff4694fd8d2effaf60a9d9f25a37a097a","impliedFormat":1},{"version":"7303b45138d2511035056a5901a1490ebdcbf055cbb1276f8629c5121cbe733e","impliedFormat":1},{"version":"27f874cd5327507eeff699a74567f60c1215b94509f4308633a7b01922471ed2","impliedFormat":1},{"version":"a401617604fa1f6ce437b81689563dfdc377069e4c58465dbd8d16069aede0a5","impliedFormat":1},{"version":"2c6cf04bc525caf6546e859e8ef10bfb9573837ec0bc5ec7b53a7b1b8ca72781","impliedFormat":1},{"version":"8695dec09ad439b0ceef3776ea68a232e381135b516878f0901ed2ea114fd0fe","impliedFormat":1},{"version":"304b44b1e97dd4c94697c3313df89a578dca4930a104454c99863f1784a54357","impliedFormat":1},{"version":"0a437ae178f999b46b6153d79095b60c42c996bc0458c04955f1c996dc68b971","impliedFormat":1},{"version":"74b2a5e5197bd0f2e0077a1ea7c07455bbea67b87b0869d9786d55104006784f","impliedFormat":1},{"version":"4a7baeb6325920044f66c0f8e5e6f1f52e06e6d87588d837bdf44feb6f35c664","impliedFormat":1},{"version":"87cc05fe13108f02e12da7e3efd8e360fef78d96a0c9e11408ea1b1b9fb3e03d","impliedFormat":1},{"version":"1abbf67c218d23c2ce76887caac2df6c7dab3d97ba2b65348432b876f510002a","impliedFormat":1},{"version":"1a82deef4c1d39f6882f28d275cad4c01f907b9b39be9cbc472fcf2cf051e05b","impliedFormat":1},{"version":"4b20fcf10a5413680e39f5666464859fc56b1003e7dfe2405ced82371ebd49b6","impliedFormat":1},{"version":"c06ef3b2569b1c1ad99fcd7fe5fba8d466e2619da5375dfa940a94e0feea899b","impliedFormat":1},{"version":"f7d628893c9fa52ba3ab01bcb5e79191636c4331ee5667ecc6373cbccff8ae12","impliedFormat":1},{"version":"1d879125d1ec570bf04bc1f362fdbe0cb538315c7ac4bcfcdf0c1e9670846aa6","impliedFormat":1},{"version":"5a16e93d5d53d987dddda1ec606c9821f6bd31d1bdf0635e05e3841312cefa8b","impliedFormat":1},{"version":"a6dba407fc287f1e25454e75028c91bbc00675f2d1c4e8b3edcc36c08611a486","impliedFormat":1},{"version":"d663134457d8d669ae0df34eabd57028bddc04fc444c4bc04bc5215afc91e1f4","impliedFormat":1},{"version":"e91f7b1344577a02f051b9b471f33044fef8334a76dc9e1de003d17595a5219b","impliedFormat":1},{"version":"c0723195c85e19656d6b5b9fdb81d3f3403c1ae4679e722c6ea058c516b38d12","impliedFormat":1},{"version":"b55eb9f72166093b5460d34b34f5d8699c968de3bc3fc696e40f2c93f2ebf650","impliedFormat":1},{"version":"71d9eb4c4e99456b78ae182fb20a5dfc20eb1667f091dbb9335b3c017dd1c783","impliedFormat":1},{"version":"cfa846a7b7847a1d973605fbb8c91f47f3a0f0643c18ac05c47077ebc72e71c7","impliedFormat":1},{"version":"1594da19968752a22b2ac48c2d0e60575700e745c577a8a4a676b841238ad5bb","impliedFormat":1},{"version":"e0cee12109e0a10a4c3d6769fcc7644b7c1ea7f52365bea51728f5af29f8a137","impliedFormat":1},{"version":"7d4254b4c6c67a29d5e7f65e67d72540480ac2cfb041ca484847f5ae70480b62","impliedFormat":1},{"version":"3536968defef8a75514f547ead5e2e9c1e984820290ec9b00c5fdfb6ef786535","impliedFormat":1},{"version":"d83773870080c30a230e322ce13a9c6f3398e8dacea4ea8a83e26370f3bac23e","impliedFormat":1},{"version":"dcfeaf98d66314fec29a9076c4290e45d0b196a65827becc19138e9c7b855f37","impliedFormat":1},{"version":"6849fe9210fe4946d5f085bfed36758f33dc6ae15a751338d178dd4daa017c46","impliedFormat":1},{"version":"888cda0fa66d7f74e985a3f7b1af1f64b8ff03eb3d5e80d051c3cbdeb7f32ab7","impliedFormat":1},{"version":"60681e13f3545be5e9477acb752b741eae6eaf4cc01658a25ec05bff8b82a2ef","impliedFormat":1},{"version":"ffae4e1e06aa848a1e4bcef162cd1c48e5909b26223515981310af9c036bdfc7","impliedFormat":1},{"version":"a57b1802794433adec9ff3fed12aa79d671faed86c49b09e02e1ac41b4f1d33a","impliedFormat":1},{"version":"34e16eb7c31768a11a08aebcfb3d70d7b8f0b016197e98d8419e566ceae6d6c8","impliedFormat":1},{"version":"f94ec1f7e4b709d26960306c9082a7a1b728a6e13089346aa48ba57c74cbf47e","impliedFormat":1},{"version":"9a11cb4033405e96c247cd5aa29790212aaffdd127869e8a5219103f0b389fd5","impliedFormat":1},{"version":"01479d9d5a5dda16d529b91811375187f61a06e74be294a35ecce77e0b9e8d6c","impliedFormat":1},{"version":"aff5213585cb72e94054dfe17250ff315f3569b3919d1ef1ad235f37c4ee894e","impliedFormat":1},{"version":"fb2ea35e1be6388d722d7725e2b49c697d34d9c890c3b96758faaeb86d35cef8","impliedFormat":1},{"version":"ce0df82a9ae6f914ba08409d4d883983cc08e6d59eb2df02d8e4d68309e7848b","impliedFormat":1},{"version":"1a4dc28334a926d90ba6a2d811ba0ff6c22775fcc13679521f034c124269fd40","impliedFormat":1},{"version":"f05315ff85714f0b87cc0b54bcd3dde2716e5a6b99aedcc19cad02bf2403e08c","impliedFormat":1},{"version":"5fad3b31fc17a5bc58095118a8b160f5260964787c52e7eb51e3d4fcf5d4a6f0","impliedFormat":1},{"version":"72105519d0390262cf0abe84cf41c926ade0ff475d35eb21307b2f94de985778","impliedFormat":1},{"version":"456006a6975b26c0a1785feddae165f6d307e2d601ffde27e21fc4a790e448a4","impliedFormat":1},{"version":"c857e0aae3f5f444abd791ec81206020fbcc1223e187316677e026d1c1d6fe08","impliedFormat":1},{"version":"ccf6dd45b708fb74ba9ed0f2478d4eb9195c9dfef0ff83a6092fa3cf2ff53b4f","impliedFormat":1},{"version":"1fe0d18b111e1145a7e7601855bccd4ca20f24e3b9a5aba6bb1fa9d1a7059170","impliedFormat":1},{"version":"5632c3c26d420c063eebe64c45b1248b9492a67bf44f1d0c57e9dc8f6cf449bb","impliedFormat":1},{"version":"0df5aa619ab12993a39ea6dae062ee46eadbb4d738916460e636ada52bced75b","impliedFormat":1},{"version":"8fca3039857709484e5893c05c1f9126ab7451fa6c29e19bb8c2411a2e937345","impliedFormat":1},{"version":"35069c2c417bd7443ae7c7cafd1de02f665bf015479fec998985ffbbf500628c","impliedFormat":1},{"version":"10ab7be91f87ebe8916b62cf28af2e45b5601fc7b0e311adf838f912c6b31dd8","impliedFormat":1},{"version":"bc636fbc08e0979ceb7eb0731a33000283d77a33b62e1f71ee65be50394e40ba","impliedFormat":1},{"version":"7e0b7f91c5ab6e33f511efc640d36e6f933510b11be24f98836a20a2dc914c2d","impliedFormat":1},{"version":"045b752f44bf9bbdcaffd882424ab0e15cb8d11fa94e1448942e338c8ef19fba","impliedFormat":1},{"version":"2894c56cad581928bb37607810af011764a2f511f575d28c9f4af0f2ef02d1ab","impliedFormat":1},{"version":"0a72186f94215d020cb386f7dca81d7495ab6c17066eb07d0f44a5bf33c1b21a","impliedFormat":1},{"version":"75bbd3be047d539988a0ff0b56384ef7a6a25f3b676ad96bee547d44c31622a7","impliedFormat":1},{"version":"42960001a776b089ade681ab5cfddc936e0afb0615133ec1841f3dee89d3e1bf","impliedFormat":1},{"version":"0aedb02516baf3e66b2c1db9fef50666d6ed257edac0f866ea32f1aa05aa474f","impliedFormat":1},{"version":"da47712b394d944328245482603bc6f416d3949b67c9392279caab595076b510","affectsGlobalScope":true,"impliedFormat":1},{"version":"37d0071d8f0a06dc55c2c5e0ec3391affd4fd107c53410bf358196ec0bf3923f","impliedFormat":1},{"version":"b213dad76ca37fd552274c9499056e1c0d9c1bd38a55bb7f68b22ba6b84c3ad7","impliedFormat":1},{"version":"c30436b130b6218b7714314dc41d3f459590db4bdf099eecd51cb1bda32109a8","impliedFormat":1},{"version":"20fa37b636fdcc1746ea0738f733d0aed17890d1cd7cb1b2f37010222c23f13e","impliedFormat":1},{"version":"d90b9f1520366d713a73bd30c5a9eb0040d0fb6076aff370796bc776fd705943","impliedFormat":1},{"version":"bc03c3c352f689e38c0ddd50c39b1e65d59273991bfc8858a9e3c0ebb79c023b","impliedFormat":1},{"version":"19df3488557c2fc9b4d8f0bac0fd20fb59aa19dec67c81f93813951a81a867f8","affectsGlobalScope":true,"impliedFormat":1},{"version":"b25350193e103ae90423c5418ddb0ad1168dc9c393c9295ef34980b990030617","affectsGlobalScope":true,"impliedFormat":1},{"version":"bef86adb77316505c6b471da1d9b8c9e428867c2566270e8894d4d773a1c4dc2","impliedFormat":1},{"version":"5a49adaef698b7ad7e6127949fa1b0bbd3d46b7cbd11c54e392a4dcdd51f5190","impliedFormat":1},{"version":"6ee598cdfdd0fa52039dca135b3dfff7b49035dc13292143e0a93843e3861967","impliedFormat":1},{"version":"27be6622e2922a1b412eb057faa854831b95db9db5035c3f6d4b677b902ab3b7","impliedFormat":1},{"version":"5c634644d45a1b6bc7b05e71e05e52ec04f3d73d9ac85d5927f647a5f965181a","impliedFormat":1},{"version":"2489bf04d77dc025ba67f49f1a56eb24b9db477d5ff88123d887e163ed1776aa","impliedFormat":1},{"version":"63a7595a5015e65262557f883463f934904959da563b4f788306f699411e9bac","impliedFormat":1},{"version":"4ba137d6553965703b6b55fd2000b4e07ba365f8caeb0359162ad7247f9707a6","impliedFormat":1},{"version":"0b77b819b5417775fccb20c678293cf614c054a5b1a65421a5b933a9124ba998","impliedFormat":1},{"version":"eb5acb58487367e502d994b57e2c58255d8241f481ea8efa8e79af23af3f41c2","impliedFormat":1},{"version":"9252d498a77517aab5d8d4b5eb9d71e4b225bbc7123df9713e08181de63180f6","impliedFormat":1},{"version":"b1f1d57fde8247599731b24a733395c880a6561ec0c882efaaf20d7df968c5af","impliedFormat":1},{"version":"f282cb0bc62e0cc771d4c2e7ece6359a5f4a3dff664584e97476fd37154816bb","impliedFormat":1},{"version":"35e6379c3f7cb27b111ad4c1aa69538fd8e788ab737b8ff7596a1b40e96f4f90","impliedFormat":1},{"version":"1fffe726740f9787f15b532e1dc870af3cd964dbe29e191e76121aa3dd8693f2","impliedFormat":1},{"version":"5a3ea721d03a361ccbdd7390ccd75f6e84cbca3a3f01f4b331ecc9af31890c49","impliedFormat":1},{"version":"e7dfaee4af38d45b1cab8a1ee0b3bc1f85ddcf64545ed391d675d78ae6526274","affectsGlobalScope":true,"impliedFormat":1},{"version":"e8daa443eaf9a27fd382cc1f8ebe30330c0f4d89511cfb469166874806751d35","impliedFormat":1},{"version":"af48e58339188d5737b608d41411a9c054685413d8ae88b8c1d0d9bfabdf6e7e","impliedFormat":1},{"version":"616775f16134fa9d01fc677ad3f76e68c051a056c22ab552c64cc281a9686790","impliedFormat":1},{"version":"65c24a8baa2cca1de069a0ba9fba82a173690f52d7e2d0f1f7542d59d5eb4db0","impliedFormat":1},{"version":"f9fe6af238339a0e5f7563acee3178f51db37f32a2e7c09f85273098cee7ec49","impliedFormat":1},{"version":"1de8c302fd35220d8f29dea378a4ae45199dc8ff83ca9923aca1400f2b28848a","impliedFormat":1},{"version":"77e71242e71ebf8528c5802993697878f0533db8f2299b4d36aa015bae08a79c","impliedFormat":1},{"version":"98a787be42bd92f8c2a37d7df5f13e5992da0d967fab794adbb7ee18370f9849","impliedFormat":1},{"version":"332248ee37cca52903572e66c11bef755ccc6e235835e63d3c3e60ddda3e9b93","impliedFormat":1},{"version":"94e8cc88ae2ef3d920bb3bdc369f48436db123aa2dc07f683309ad8c9968a1e1","impliedFormat":1},{"version":"4545c1a1ceca170d5d83452dd7c4994644c35cf676a671412601689d9a62da35","impliedFormat":1},{"version":"320f4091e33548b554d2214ce5fc31c96631b513dffa806e2e3a60766c8c49d9","impliedFormat":1},{"version":"a2d648d333cf67b9aeac5d81a1a379d563a8ffa91ddd61c6179f68de724260ff","impliedFormat":1},{"version":"d90d5f524de38889d1e1dbc2aeef00060d779f8688c02766ddb9ca195e4a713d","impliedFormat":1},{"version":"07ed3ddab975995eea41b22f3010506fb9f5fb301d04820b07d7a1aee5477d7c","impliedFormat":1},{"version":"969d8b0965849f4bae7cab0ba90bd1e1220e95999c2c6f01117fa7500901c017","impliedFormat":1},{"version":"6ec840ee5e2bc103f557fe38b1d585ee250540468713d7634ee066de372bf332","impliedFormat":1},{"version":"b0309e1eda99a9e76f87c18992d9c3689b0938266242835dd4611f2b69efe456","impliedFormat":1},{"version":"47699512e6d8bebf7be488182427189f999affe3addc1c87c882d36b7f2d0b0e","impliedFormat":1},{"version":"6ceb10ca57943be87ff9debe978f4ab73593c0c85ee802c051a93fc96aaf7a20","impliedFormat":1},{"version":"1de3ffe0cc28a9fe2ac761ece075826836b5a02f340b412510a59ba1d41a505a","impliedFormat":1},{"version":"e46d6cc08d243d8d0d83986f609d830991f00450fb234f5b2f861648c42dc0d8","impliedFormat":1},{"version":"1c0a98de1323051010ce5b958ad47bc1c007f7921973123c999300e2b7b0ecc0","impliedFormat":1},{"version":"ff863d17c6c659440f7c5c536e4db7762d8c2565547b2608f36b798a743606ca","impliedFormat":1},{"version":"5412ad0043cd60d1f1406fc12cb4fb987e9a734decbdd4db6f6acf71791e36fe","impliedFormat":1},{"version":"ad036a85efcd9e5b4f7dd5c1a7362c8478f9a3b6c3554654ca24a29aa850a9c5","impliedFormat":1},{"version":"fedebeae32c5cdd1a85b4e0504a01996e4a8adf3dfa72876920d3dd6e42978e7","impliedFormat":1},{"version":"e297c0a524edee7677939122f90027bfbe5f2698939d9a85728e5044b39c7124","impliedFormat":1},{"version":"cdf21eee8007e339b1b9945abf4a7b44930b1d695cc528459e68a3adc39a622e","impliedFormat":1},{"version":"bc9ee0192f056b3d5527bcd78dc3f9e527a9ba2bdc0a2c296fbc9027147df4b2","impliedFormat":1},{"version":"b62381cae176db34f003cc6172ee8f3e0122014889d66391aa73698105cf4934","impliedFormat":1},{"version":"1d9c0a9a6df4e8f29dc84c25c5aa0bb1da5456ebede7a03e03df08bb8b27bae6","impliedFormat":1},{"version":"84380af21da938a567c65ef95aefb5354f676368ee1a1cbb4cae81604a4c7d17","impliedFormat":1},{"version":"1af3e1f2a5d1332e136f8b0b95c0e6c0a02aaabd5092b36b64f3042a03debf28","impliedFormat":1},{"version":"30d8da250766efa99490fc02801047c2c6d72dd0da1bba6581c7e80d1d8842a4","impliedFormat":1},{"version":"03566202f5553bd2d9de22dfab0c61aa163cabb64f0223c08431fb3fc8f70280","impliedFormat":1},{"version":"41eb514d9ce0a6e87957f08a4b7af70d93f87637f37dee706e2d92a6601c25a9","impliedFormat":1},{"version":"e7765aa8bcb74a38b3230d212b4547686eb9796621ffb4367a104451c3f9614f","impliedFormat":1},{"version":"1de80059b8078ea5749941c9f863aa970b4735bdbb003be4925c853a8b6b4450","impliedFormat":1},{"version":"1d079c37fa53e3c21ed3fa214a27507bda9991f2a41458705b19ed8c2b61173d","impliedFormat":1},{"version":"5bf5c7a44e779790d1eb54c234b668b15e34affa95e78eada73e5757f61ed76a","impliedFormat":1},{"version":"5835a6e0d7cd2738e56b671af0e561e7c1b4fb77751383672f4b009f4e161d70","impliedFormat":1},{"version":"4b7f74b772140395e7af67c4841be1ab867c11b3b82a51b1aeb692822b76c872","impliedFormat":1},{"version":"7bd01f0f28cd3aeb2046274d85208e245965f6f2948edf4f7b2057bcf9f22ccc","impliedFormat":99},{"version":"d2f2cf2b8cc92bea913cda4a076e0f790b23a21e84f989d12f0116a7fe3906e0","impliedFormat":99},{"version":"6de125ea94866c736c6d58d68eb15272cf7d1020a5b459fea1c660027eca9a90","affectsGlobalScope":true,"impliedFormat":1},{"version":"f5b20bc288ee49989c95b20847fc93b96bf61cc0845598897a6a53a967dd7d07","affectsGlobalScope":true,"impliedFormat":1},{"version":"064ac1c2ac4b2867c2ceaa74bbdce0cb6a4c16e7c31a6497097159c18f74aa7c","impliedFormat":1},{"version":"3dc14e1ab45e497e5d5e4295271d54ff689aeae00b4277979fdd10fa563540ae","impliedFormat":1},{"version":"d3b315763d91265d6b0e7e7fa93cfdb8a80ce7cdd2d9f55ba0f37a22db00bdb8","impliedFormat":1},{"version":"b789bf89eb19c777ed1e956dbad0925ca795701552d22e68fd130a032008b9f9","impliedFormat":1},{"version":"a384610388221cd70cffb4503cee7853b8b076f2b4a55324b20a4bdbd25a3538","affectsGlobalScope":true},"7ad303e40d4fddf44f156129e397511953a71481c5cfd86b1862649aaaf240cc",{"version":"f5a1676c44601c4291320391570b3a9aafbae9a6bea721b62dd186da9a827911","signature":"435a1e418e8338be3f39614b96b81a9aa2700bc8c27bc6b98f064ff9ce17c363"},{"version":"d9d7f0858b623dba11cdf642ca99e2cb23b1ddf832989e93df2b4dacea93b936","signature":"dcf142e7b7f155862558f7a1149fe9f0dacb2b561e14c47c2964b75dd166586d"},"c91b304a3ac178ac2f76b66849e748f24e02c6590d20822f16d043a0128195b0","63665042aa6e4788fe56b0625b04125b27d8d17e05763b4179f279003eec8f28","a2d898cef1881fa251aa8459521de4a061c2936b765ec6021bfb3d335d3714af","d2a550e6c7f7b40bbe0d1edf75cf75c0d7786ce13995942be1b91cc94a2d3ebd","212641fbc18ca00ce5b86a1d38b8d2b6bdb25edb0a4b33aa0b1f432e451a7fe0","c9f1d9193a614dd7f25e516d5d6b5479df106c01d9a51b279026295d9a4fa62d","a5abfa63e6b44cb949186540bf2205d2a8980f49abece42a01394ec9560bc96e","f9227ecc2b115053686d47c3308ceac221ce597a0262f5667965cb8e78ad0278","48e6b3f0bd8522db70ffadce7163f4f32cdc94caa5f4123069476373b1bbdb07","1274bf3731eddb838f9b5342ebd837ccd26695d6019bf7e615d47c97fb642f88",{"version":"cdac9a85ae7d25e2e8167de3b07e77442b4aa65c088615a88e5bc2ca2ce139d9","signature":"a07a0fd66a61890bd69f2b8aa7afa4794023f1d9981f8eb0e4d36f06be62bbd2"},{"version":"870b69e8b455b6cbc2a1b92aa47929d9aae348d7e9275c291fed5edb67613e7d","signature":"9b30dbc15207de149eb756a6ba05fccb04408c73500a717b604b66143250a4b5"},"40a5becad931bcab37e811405ae86c94001e97709566f33d2ac9ae44f5890c61","79d9869fcccdee7ac6efe4c80d70e89a82c5a35aa4c86d16a1acefcb4d552a9f","4e663229d0f5dcc916ea9dd2d377222ce193be437173b911d60518c3fff612b4",{"version":"93afb3d171c8c5d1b3eb1a8756ccdfdd89b2d2305295cf9d48f78b27bf4bb1ad","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"e1c249ef011ea3d40bd158bd782167a090135d438b5c1eaeb6518642f3ac4968","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"fe93c474ab38ac02e30e3af073412b4f92b740152cf3a751fdaee8cbea982341","impliedFormat":1},{"version":"3255b97f3f24af29c79cc1aa88004efb13b6285ebdde0a567bf32e19bb65250d","impliedFormat":1},{"version":"1e00b8bf9e3766c958218cd6144ffe08418286f89ff44ba5a2cc830c03dd22c7","impliedFormat":1},{"version":"01d3478be006d10a3abefe929996ed5decf8d809c242bfe7f6de3741e4e761f2","signature":"01a977ade994fe0de990222140f158a0dc3b03529994c449aa39333d0facac02"},"11ed2b0b52af52f3eaff37b9d41c9565f5565dfe8b864d7fb334e21c3fc3df0a","ca4fc772f4db439a193a1f3404d38bb6de729e46486f69fab01645a9b6bf2e57","e50b6be34e50998e01623e5881c639ec09edd7d607079055e856d7188ad1e824","e4fcca12421e8066c464bbaf2525b1a881998ab147f85023bce0964d7e0d5248","078e6873248c46d496d62935b4ce7e6fc92f8deaef314b382fb6f4de5c70ca5e","c331b7056801e4bc7b46732e77173277b55e0367de6618bae2f85c7c7ce27b56","5e8be2b46e016ff19698fe2279e9187b7fc1b9548b4876a624dcf8cb01f9b457","d46f111f0daf006ae96e904cd3c8e24d4e3ca682b455001af31e8207a1b352fd","d1986184a09a52db8228cb2bb2a61a8c05c9354e5b93cec8e2628d8579c892d7",{"version":"a384610388221cd70cffb4503cee7853b8b076f2b4a55324b20a4bdbd25a3538","affectsGlobalScope":true},"8c738d7ab02122bec55d98eab2f5e875f5306ebffe56a6be96f2da0916a7ea71","d1986184a09a52db8228cb2bb2a61a8c05c9354e5b93cec8e2628d8579c892d7","ac965c40df1c4a3d53cebda90c50063ebda4522b0a054741dc3d2bd98bc852e6",{"version":"751764bb94219b4ce8f5475dc35d3de2e432fea01a0c9610cd7f69ad05e398c6","impliedFormat":1},{"version":"f3d8c757e148ad968f0d98697987db363070abada5f503da3c06aefd9d4248c1","impliedFormat":1},{"version":"96d14f21b7652903852eef49379d04dbda28c16ed36468f8c9fa08f7c14c9538","impliedFormat":1}],"root":[[535,548],[550,555],[559,572]],"options":{"allowJs":true,"esModuleInterop":true,"jsx":4,"module":99,"skipLibCheck":true,"strict":true,"target":4},"referencedMap":[[571,1],[535,2],[572,3],[568,4],[569,2],[570,5],[559,6],[567,7],[536,8],[537,9],[379,2],[573,2],[574,2],[575,2],[143,10],[144,10],[145,11],[97,12],[146,13],[147,14],[148,15],[92,2],[95,16],[93,2],[94,2],[149,17],[150,18],[151,19],[152,20],[153,21],[154,22],[155,22],[156,23],[157,24],[158,25],[159,26],[98,2],[96,2],[160,27],[161,28],[162,29],[196,30],[163,31],[164,2],[165,32],[166,33],[167,34],[168,35],[169,36],[170,37],[171,38],[172,39],[173,40],[174,40],[175,41],[176,2],[177,42],[178,43],[180,44],[179,45],[181,46],[182,47],[183,48],[184,49],[185,50],[186,51],[187,52],[188,53],[189,54],[190,55],[191,56],[192,57],[193,58],[99,2],[100,2],[101,2],[139,59],[140,2],[141,2],[142,46],[194,60],[195,61],[200,62],[464,63],[201,64],[199,65],[466,66],[465,67],[197,68],[462,2],[198,69],[83,2],[85,70],[461,63],[231,63],[84,2],[487,71],[492,72],[499,73],[482,74],[235,2],[243,75],[383,76],[386,77],[358,2],[371,78],[378,79],[260,2],[360,2],[241,2],[357,80],[403,81],[242,2],[233,82],[385,83],[387,84],[388,85],[459,86],[352,87],[305,88],[365,89],[366,90],[364,91],[363,2],[359,92],[384,93],[244,94],[429,2],[430,95],[271,96],[245,97],[272,96],[308,96],[211,96],[381,98],[380,2],[370,99],[477,2],[220,2],[498,100],[437,101],[438,102],[434,103],[516,2],[335,2],[439,104],[435,105],[521,106],[520,107],[515,2],[286,2],[338,108],[337,2],[514,109],[436,63],[291,110],[298,111],[300,112],[290,2],[295,113],[297,114],[299,115],[294,116],[292,2],[296,117],[517,2],[513,2],[519,118],[518,2],[289,119],[508,120],[511,121],[279,122],[278,123],[277,124],[524,63],[276,125],[265,2],[526,2],[557,126],[556,2],[527,63],[528,127],[203,2],[367,128],[368,129],[369,130],[207,2],[372,2],[227,131],[202,2],[451,63],[209,132],[450,133],[449,134],[440,2],[441,2],[448,2],[443,2],[446,135],[442,2],[444,136],[447,137],[445,136],[240,2],[237,2],[238,96],[392,2],[397,138],[398,139],[396,140],[394,141],[395,142],[390,2],[457,104],[232,104],[486,143],[493,144],[497,145],[326,146],[325,2],[320,2],[473,147],[481,148],[353,149],[354,150],[432,151],[342,2],[455,152],[330,63],[347,153],[458,154],[343,2],[346,155],[344,2],[456,156],[453,157],[452,2],[454,2],[350,2],[428,158],[215,159],[328,160],[332,161],[348,162],[351,163],[340,164],[333,165],[480,166],[406,167],[324,168],[212,169],[479,170],[208,171],[399,172],[391,2],[400,173],[417,174],[389,2],[416,175],[91,2],[411,176],[236,2],[431,177],[407,2],[221,2],[223,2],[362,2],[415,178],[239,2],[263,179],[349,180],[269,181],[329,2],[414,2],[393,2],[419,182],[420,183],[361,2],[422,184],[424,185],[423,186],[373,2],[413,169],[426,187],[323,188],[412,189],[418,190],[248,2],[252,2],[251,2],[250,2],[255,2],[249,2],[258,2],[257,2],[254,2],[253,2],[256,2],[259,191],[247,2],[315,192],[314,2],[319,193],[316,194],[318,195],[321,193],[317,194],[228,196],[307,197],[476,198],[474,2],[503,199],[505,200],[469,201],[504,202],[216,203],[213,203],[246,2],[230,204],[229,205],[225,206],[226,207],[234,208],[262,208],[273,208],[309,209],[274,209],[218,210],[217,2],[313,211],[312,212],[311,213],[310,214],[219,215],[460,216],[261,217],[468,218],[433,219],[463,220],[467,221],[356,222],[355,223],[336,224],[322,225],[304,226],[306,227],[303,228],[425,229],[327,2],[491,2],[224,230],[427,231],[475,232],[334,2],[264,233],[341,234],[339,235],[266,236],[401,237],[470,2],[267,238],[402,238],[489,2],[488,2],[490,2],[472,2],[471,2],[404,239],[331,2],[301,240],[222,241],[280,2],[206,242],[268,2],[495,63],[205,2],[507,243],[288,63],[501,104],[287,244],[484,245],[285,243],[210,2],[509,246],[283,63],[284,63],[275,2],[204,2],[282,247],[281,248],[270,249],[345,39],[405,39],[421,2],[409,250],[408,2],[293,119],[214,2],[302,63],[478,131],[485,251],[86,63],[89,252],[90,253],[87,63],[88,2],[382,254],[377,255],[376,2],[375,256],[374,2],[483,257],[494,258],[496,259],[500,260],[558,261],[502,262],[506,263],[534,264],[510,264],[533,265],[512,266],[522,267],[523,268],[525,269],[529,270],[532,131],[531,2],[530,271],[410,272],[81,2],[82,2],[13,2],[14,2],[16,2],[15,2],[2,2],[17,2],[18,2],[19,2],[20,2],[21,2],[22,2],[23,2],[24,2],[3,2],[25,2],[26,2],[4,2],[27,2],[31,2],[28,2],[29,2],[30,2],[32,2],[33,2],[34,2],[5,2],[35,2],[36,2],[37,2],[38,2],[6,2],[42,2],[39,2],[40,2],[41,2],[43,2],[7,2],[44,2],[49,2],[50,2],[45,2],[46,2],[47,2],[48,2],[8,2],[54,2],[51,2],[52,2],[53,2],[55,2],[9,2],[56,2],[57,2],[58,2],[60,2],[59,2],[61,2],[62,2],[10,2],[63,2],[64,2],[65,2],[11,2],[66,2],[67,2],[68,2],[69,2],[70,2],[1,2],[71,2],[72,2],[12,2],[76,2],[74,2],[79,2],[78,2],[73,2],[77,2],[75,2],[80,2],[117,273],[127,274],[116,273],[137,275],[108,276],[107,277],[136,271],[130,278],[135,279],[110,280],[124,281],[109,282],[133,283],[105,284],[104,271],[134,285],[106,286],[111,287],[112,2],[115,287],[102,2],[138,288],[128,289],[119,290],[120,291],[122,292],[118,293],[121,294],[131,271],[113,295],[114,296],[123,297],[103,298],[126,289],[125,287],[129,2],[132,299],[549,300],[561,301],[560,302],[562,303],[563,304],[564,305],[566,306],[565,307],[539,308],[540,308],[541,308],[542,308],[543,308],[545,309],[546,308],[547,308],[544,308],[548,308],[552,310],[551,311],[554,312],[553,313],[555,314],[550,315],[538,300]],"affectedFilesPendingEmit":[572,570,559,567,537,561,560,562,563,564,566,565,539,540,541,542,543,545,546,547,544,548,552,551,554,553,555,550,538],"version":"5.9.3"}
\ No newline at end of file
deleted file mode 100644
@@ -1 +0,0 @@
1-{"fileNames":["./node_modules/typescript/lib/lib.es5.d.ts","./node_modules/typescript/lib/lib.es2015.d.ts","./node_modules/typescript/lib/lib.es2016.d.ts","./node_modules/typescript/lib/lib.es2017.d.ts","./node_modules/typescript/lib/lib.es2018.d.ts","./node_modules/typescript/lib/lib.es2019.d.ts","./node_modules/typescript/lib/lib.es2020.d.ts","./node_modules/typescript/lib/lib.es2021.d.ts","./node_modules/typescript/lib/lib.es2022.d.ts","./node_modules/typescript/lib/lib.es2023.d.ts","./node_modules/typescript/lib/lib.es2024.d.ts","./node_modules/typescript/lib/lib.esnext.d.ts","./node_modules/typescript/lib/lib.dom.d.ts","./node_modules/typescript/lib/lib.dom.iterable.d.ts","./node_modules/typescript/lib/lib.es2015.core.d.ts","./node_modules/typescript/lib/lib.es2015.collection.d.ts","./node_modules/typescript/lib/lib.es2015.generator.d.ts","./node_modules/typescript/lib/lib.es2015.iterable.d.ts","./node_modules/typescript/lib/lib.es2015.promise.d.ts","./node_modules/typescript/lib/lib.es2015.proxy.d.ts","./node_modules/typescript/lib/lib.es2015.reflect.d.ts","./node_modules/typescript/lib/lib.es2015.symbol.d.ts","./node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","./node_modules/typescript/lib/lib.es2016.array.include.d.ts","./node_modules/typescript/lib/lib.es2016.intl.d.ts","./node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts","./node_modules/typescript/lib/lib.es2017.date.d.ts","./node_modules/typescript/lib/lib.es2017.object.d.ts","./node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","./node_modules/typescript/lib/lib.es2017.string.d.ts","./node_modules/typescript/lib/lib.es2017.intl.d.ts","./node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","./node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","./node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","./node_modules/typescript/lib/lib.es2018.intl.d.ts","./node_modules/typescript/lib/lib.es2018.promise.d.ts","./node_modules/typescript/lib/lib.es2018.regexp.d.ts","./node_modules/typescript/lib/lib.es2019.array.d.ts","./node_modules/typescript/lib/lib.es2019.object.d.ts","./node_modules/typescript/lib/lib.es2019.string.d.ts","./node_modules/typescript/lib/lib.es2019.symbol.d.ts","./node_modules/typescript/lib/lib.es2019.intl.d.ts","./node_modules/typescript/lib/lib.es2020.bigint.d.ts","./node_modules/typescript/lib/lib.es2020.date.d.ts","./node_modules/typescript/lib/lib.es2020.promise.d.ts","./node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","./node_modules/typescript/lib/lib.es2020.string.d.ts","./node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","./node_modules/typescript/lib/lib.es2020.intl.d.ts","./node_modules/typescript/lib/lib.es2020.number.d.ts","./node_modules/typescript/lib/lib.es2021.promise.d.ts","./node_modules/typescript/lib/lib.es2021.string.d.ts","./node_modules/typescript/lib/lib.es2021.weakref.d.ts","./node_modules/typescript/lib/lib.es2021.intl.d.ts","./node_modules/typescript/lib/lib.es2022.array.d.ts","./node_modules/typescript/lib/lib.es2022.error.d.ts","./node_modules/typescript/lib/lib.es2022.intl.d.ts","./node_modules/typescript/lib/lib.es2022.object.d.ts","./node_modules/typescript/lib/lib.es2022.string.d.ts","./node_modules/typescript/lib/lib.es2022.regexp.d.ts","./node_modules/typescript/lib/lib.es2023.array.d.ts","./node_modules/typescript/lib/lib.es2023.collection.d.ts","./node_modules/typescript/lib/lib.es2023.intl.d.ts","./node_modules/typescript/lib/lib.es2024.arraybuffer.d.ts","./node_modules/typescript/lib/lib.es2024.collection.d.ts","./node_modules/typescript/lib/lib.es2024.object.d.ts","./node_modules/typescript/lib/lib.es2024.promise.d.ts","./node_modules/typescript/lib/lib.es2024.regexp.d.ts","./node_modules/typescript/lib/lib.es2024.sharedmemory.d.ts","./node_modules/typescript/lib/lib.es2024.string.d.ts","./node_modules/typescript/lib/lib.esnext.array.d.ts","./node_modules/typescript/lib/lib.esnext.collection.d.ts","./node_modules/typescript/lib/lib.esnext.intl.d.ts","./node_modules/typescript/lib/lib.esnext.disposable.d.ts","./node_modules/typescript/lib/lib.esnext.promise.d.ts","./node_modules/typescript/lib/lib.esnext.decorators.d.ts","./node_modules/typescript/lib/lib.esnext.iterator.d.ts","./node_modules/typescript/lib/lib.esnext.float16.d.ts","./node_modules/typescript/lib/lib.esnext.error.d.ts","./node_modules/typescript/lib/lib.esnext.sharedmemory.d.ts","./node_modules/typescript/lib/lib.decorators.d.ts","./node_modules/typescript/lib/lib.decorators.legacy.d.ts","./node_modules/@types/react/global.d.ts","./node_modules/csstype/index.d.ts","./node_modules/@types/react/index.d.ts","./node_modules/next/dist/styled-jsx/types/css.d.ts","./node_modules/next/dist/styled-jsx/types/macro.d.ts","./node_modules/next/dist/styled-jsx/types/style.d.ts","./node_modules/next/dist/styled-jsx/types/global.d.ts","./node_modules/next/dist/styled-jsx/types/index.d.ts","./node_modules/next/dist/server/get-page-files.d.ts","./node_modules/@types/node/compatibility/disposable.d.ts","./node_modules/@types/node/compatibility/indexable.d.ts","./node_modules/@types/node/compatibility/iterators.d.ts","./node_modules/@types/node/compatibility/index.d.ts","./node_modules/@types/node/globals.typedarray.d.ts","./node_modules/@types/node/buffer.buffer.d.ts","./node_modules/@types/node/globals.d.ts","./node_modules/@types/node/web-globals/abortcontroller.d.ts","./node_modules/@types/node/web-globals/domexception.d.ts","./node_modules/@types/node/web-globals/events.d.ts","./node_modules/undici-types/header.d.ts","./node_modules/undici-types/readable.d.ts","./node_modules/undici-types/file.d.ts","./node_modules/undici-types/fetch.d.ts","./node_modules/undici-types/formdata.d.ts","./node_modules/undici-types/connector.d.ts","./node_modules/undici-types/client.d.ts","./node_modules/undici-types/errors.d.ts","./node_modules/undici-types/dispatcher.d.ts","./node_modules/undici-types/global-dispatcher.d.ts","./node_modules/undici-types/global-origin.d.ts","./node_modules/undici-types/pool-stats.d.ts","./node_modules/undici-types/pool.d.ts","./node_modules/undici-types/handlers.d.ts","./node_modules/undici-types/balanced-pool.d.ts","./node_modules/undici-types/agent.d.ts","./node_modules/undici-types/mock-interceptor.d.ts","./node_modules/undici-types/mock-agent.d.ts","./node_modules/undici-types/mock-client.d.ts","./node_modules/undici-types/mock-pool.d.ts","./node_modules/undici-types/mock-errors.d.ts","./node_modules/undici-types/proxy-agent.d.ts","./node_modules/undici-types/env-http-proxy-agent.d.ts","./node_modules/undici-types/retry-handler.d.ts","./node_modules/undici-types/retry-agent.d.ts","./node_modules/undici-types/api.d.ts","./node_modules/undici-types/interceptors.d.ts","./node_modules/undici-types/util.d.ts","./node_modules/undici-types/cookies.d.ts","./node_modules/undici-types/patch.d.ts","./node_modules/undici-types/websocket.d.ts","./node_modules/undici-types/eventsource.d.ts","./node_modules/undici-types/filereader.d.ts","./node_modules/undici-types/diagnostics-channel.d.ts","./node_modules/undici-types/content-type.d.ts","./node_modules/undici-types/cache.d.ts","./node_modules/undici-types/index.d.ts","./node_modules/@types/node/web-globals/fetch.d.ts","./node_modules/@types/node/web-globals/navigator.d.ts","./node_modules/@types/node/web-globals/storage.d.ts","./node_modules/@types/node/web-globals/streams.d.ts","./node_modules/@types/node/assert.d.ts","./node_modules/@types/node/assert/strict.d.ts","./node_modules/@types/node/async_hooks.d.ts","./node_modules/@types/node/buffer.d.ts","./node_modules/@types/node/child_process.d.ts","./node_modules/@types/node/cluster.d.ts","./node_modules/@types/node/console.d.ts","./node_modules/@types/node/constants.d.ts","./node_modules/@types/node/crypto.d.ts","./node_modules/@types/node/dgram.d.ts","./node_modules/@types/node/diagnostics_channel.d.ts","./node_modules/@types/node/dns.d.ts","./node_modules/@types/node/dns/promises.d.ts","./node_modules/@types/node/domain.d.ts","./node_modules/@types/node/events.d.ts","./node_modules/@types/node/fs.d.ts","./node_modules/@types/node/fs/promises.d.ts","./node_modules/@types/node/http.d.ts","./node_modules/@types/node/http2.d.ts","./node_modules/@types/node/https.d.ts","./node_modules/@types/node/inspector.d.ts","./node_modules/@types/node/inspector.generated.d.ts","./node_modules/@types/node/module.d.ts","./node_modules/@types/node/net.d.ts","./node_modules/@types/node/os.d.ts","./node_modules/@types/node/path.d.ts","./node_modules/@types/node/perf_hooks.d.ts","./node_modules/@types/node/process.d.ts","./node_modules/@types/node/punycode.d.ts","./node_modules/@types/node/querystring.d.ts","./node_modules/@types/node/readline.d.ts","./node_modules/@types/node/readline/promises.d.ts","./node_modules/@types/node/repl.d.ts","./node_modules/@types/node/sea.d.ts","./node_modules/@types/node/sqlite.d.ts","./node_modules/@types/node/stream.d.ts","./node_modules/@types/node/stream/promises.d.ts","./node_modules/@types/node/stream/consumers.d.ts","./node_modules/@types/node/stream/web.d.ts","./node_modules/@types/node/string_decoder.d.ts","./node_modules/@types/node/test.d.ts","./node_modules/@types/node/timers.d.ts","./node_modules/@types/node/timers/promises.d.ts","./node_modules/@types/node/tls.d.ts","./node_modules/@types/node/trace_events.d.ts","./node_modules/@types/node/tty.d.ts","./node_modules/@types/node/url.d.ts","./node_modules/@types/node/util.d.ts","./node_modules/@types/node/v8.d.ts","./node_modules/@types/node/vm.d.ts","./node_modules/@types/node/wasi.d.ts","./node_modules/@types/node/worker_threads.d.ts","./node_modules/@types/node/zlib.d.ts","./node_modules/@types/node/index.d.ts","./node_modules/@types/react/canary.d.ts","./node_modules/@types/react/experimental.d.ts","./node_modules/@types/react-dom/index.d.ts","./node_modules/@types/react-dom/canary.d.ts","./node_modules/@types/react-dom/experimental.d.ts","./node_modules/next/dist/lib/fallback.d.ts","./node_modules/next/dist/compiled/webpack/webpack.d.ts","./node_modules/next/dist/shared/lib/modern-browserslist-target.d.ts","./node_modules/next/dist/shared/lib/entry-constants.d.ts","./node_modules/next/dist/shared/lib/constants.d.ts","./node_modules/next/dist/lib/bundler.d.ts","./node_modules/next/dist/server/config.d.ts","./node_modules/next/dist/lib/load-custom-routes.d.ts","./node_modules/next/dist/shared/lib/image-config.d.ts","./node_modules/next/dist/build/webpack/plugins/subresource-integrity-plugin.d.ts","./node_modules/next/dist/server/body-streams.d.ts","./node_modules/next/dist/server/request/search-params.d.ts","./node_modules/next/dist/shared/lib/segment-cache/vary-params-decoding.d.ts","./node_modules/next/dist/server/app-render/vary-params.d.ts","./node_modules/next/dist/server/request/params.d.ts","./node_modules/next/dist/server/route-kind.d.ts","./node_modules/next/dist/server/route-definitions/route-definition.d.ts","./node_modules/next/dist/server/route-matches/route-match.d.ts","./node_modules/next/dist/client/components/app-router-headers.d.ts","./node_modules/next/dist/server/lib/cache-control.d.ts","./node_modules/next/dist/shared/lib/app-router-types.d.ts","./node_modules/next/dist/server/lib/cache-handlers/types.d.ts","./node_modules/next/dist/server/use-cache/use-cache-wrapper.d.ts","./node_modules/next/dist/server/resume-data-cache/cache-store.d.ts","./node_modules/next/dist/server/resume-data-cache/resume-data-cache.d.ts","./node_modules/next/dist/lib/constants.d.ts","./node_modules/next/dist/server/render-result.d.ts","./node_modules/next/dist/server/response-cache/types.d.ts","./node_modules/next/dist/server/response-cache/index.d.ts","./node_modules/@types/react/jsx-runtime.d.ts","./node_modules/next/dist/next-devtools/userspace/pages/pages-dev-overlay-setup.d.ts","./node_modules/next/dist/build/static-paths/types.d.ts","./node_modules/next/dist/server/route-definitions/app-page-route-definition.d.ts","./node_modules/next/dist/build/adapter/setup-node-env.external.d.ts","./node_modules/next/dist/server/instrumentation/types.d.ts","./node_modules/next/dist/lib/setup-exception-listeners.d.ts","./node_modules/next/dist/lib/worker.d.ts","./node_modules/next/dist/server/lib/experimental/ppr.d.ts","./node_modules/next/dist/lib/page-types.d.ts","./node_modules/next/dist/build/segment-config/app/app-segment-config.d.ts","./node_modules/next/dist/build/segment-config/pages/pages-segment-config.d.ts","./node_modules/next/dist/build/analysis/get-page-static-info.d.ts","./node_modules/next/dist/build/webpack/loaders/get-module-build-info.d.ts","./node_modules/next/dist/build/webpack/plugins/middleware-plugin.d.ts","./node_modules/next/dist/server/require-hook.d.ts","./node_modules/next/dist/server/node-polyfill-crypto.d.ts","./node_modules/next/dist/server/node-environment-baseline.d.ts","./node_modules/next/dist/server/node-environment-extensions/error-inspect.d.ts","./node_modules/next/dist/server/node-environment-extensions/console-file.d.ts","./node_modules/next/dist/server/node-environment-extensions/console-exit.d.ts","./node_modules/next/dist/server/node-environment-extensions/console-dim.external.d.ts","./node_modules/next/dist/server/node-environment-extensions/unhandled-rejection.external.d.ts","./node_modules/next/dist/server/node-environment-extensions/random.d.ts","./node_modules/next/dist/server/node-environment-extensions/date.d.ts","./node_modules/next/dist/server/node-environment-extensions/web-crypto.d.ts","./node_modules/next/dist/server/node-environment-extensions/node-crypto.d.ts","./node_modules/next/dist/server/node-environment-extensions/fast-set-immediate.external.d.ts","./node_modules/next/dist/server/node-environment.d.ts","./node_modules/next/dist/build/page-extensions-type.d.ts","./node_modules/next/dist/server/route-modules/app-page/module.compiled.d.ts","./node_modules/next/dist/server/route-definitions/app-route-route-definition.d.ts","./node_modules/next/dist/server/lib/i18n-provider.d.ts","./node_modules/next/dist/server/web/next-url.d.ts","./node_modules/next/dist/compiled/@edge-runtime/cookies/index.d.ts","./node_modules/next/dist/server/web/spec-extension/cookies.d.ts","./node_modules/next/dist/server/web/spec-extension/request.d.ts","./node_modules/next/dist/shared/lib/deep-readonly.d.ts","./node_modules/next/dist/server/lib/incremental-cache/index.d.ts","./node_modules/next/dist/shared/lib/router/utils/middleware-route-matcher.d.ts","./node_modules/next/dist/build/webpack/plugins/flight-manifest-plugin.d.ts","./node_modules/next/dist/build/webpack/plugins/next-font-manifest-plugin.d.ts","./node_modules/next/dist/server/route-definitions/locale-route-definition.d.ts","./node_modules/next/dist/server/route-definitions/pages-route-definition.d.ts","./node_modules/next/dist/shared/lib/mitt.d.ts","./node_modules/next/dist/client/with-router.d.ts","./node_modules/next/dist/client/router.d.ts","./node_modules/next/dist/client/route-loader.d.ts","./node_modules/next/dist/client/page-loader.d.ts","./node_modules/next/dist/shared/lib/bloom-filter.d.ts","./node_modules/next/dist/shared/lib/router/router.d.ts","./node_modules/next/dist/shared/lib/router-context.shared-runtime.d.ts","./node_modules/next/dist/shared/lib/loadable-context.shared-runtime.d.ts","./node_modules/next/dist/shared/lib/loadable.shared-runtime.d.ts","./node_modules/next/dist/shared/lib/image-config-context.shared-runtime.d.ts","./node_modules/next/dist/client/components/readonly-url-search-params.d.ts","./node_modules/next/dist/shared/lib/hooks-client-context.shared-runtime.d.ts","./node_modules/next/dist/shared/lib/head-manager-context.shared-runtime.d.ts","./node_modules/next/dist/client/flight-data-helpers.d.ts","./node_modules/next/dist/client/components/segment-cache/cache-key.d.ts","./node_modules/next/dist/client/components/router-reducer/fetch-server-response.d.ts","./node_modules/next/dist/client/components/segment-cache/types.d.ts","./node_modules/next/dist/shared/lib/segment-cache/segment-value-encoding.d.ts","./node_modules/next/dist/client/components/segment-cache/scheduler.d.ts","./node_modules/next/dist/client/components/segment-cache/cache-map.d.ts","./node_modules/next/dist/client/components/segment-cache/vary-path.d.ts","./node_modules/next/dist/client/components/segment-cache/cache.d.ts","./node_modules/next/dist/client/components/router-reducer/ppr-navigations.d.ts","./node_modules/next/dist/client/components/segment-cache/navigation.d.ts","./node_modules/next/dist/client/components/router-reducer/router-reducer-types.d.ts","./node_modules/next/dist/shared/lib/app-router-context.shared-runtime.d.ts","./node_modules/next/dist/shared/lib/server-inserted-html.shared-runtime.d.ts","./node_modules/next/dist/server/route-modules/pages/vendored/contexts/entrypoints.d.ts","./node_modules/next/dist/server/route-modules/pages/module.compiled.d.ts","./node_modules/next/dist/build/templates/pages.d.ts","./node_modules/next/dist/server/route-modules/pages/module.d.ts","./node_modules/next/dist/server/render.d.ts","./node_modules/next/dist/build/webpack/plugins/pages-manifest-plugin.d.ts","./node_modules/next/dist/server/route-definitions/pages-api-route-definition.d.ts","./node_modules/next/dist/server/route-matches/pages-api-route-match.d.ts","./node_modules/next/dist/server/route-matchers/route-matcher.d.ts","./node_modules/next/dist/server/route-matcher-providers/route-matcher-provider.d.ts","./node_modules/next/dist/server/route-matcher-managers/route-matcher-manager.d.ts","./node_modules/next/dist/server/normalizers/normalizer.d.ts","./node_modules/next/dist/server/normalizers/locale-route-normalizer.d.ts","./node_modules/next/dist/server/normalizers/request/pathname-normalizer.d.ts","./node_modules/next/dist/server/normalizers/request/suffix.d.ts","./node_modules/next/dist/server/normalizers/request/rsc.d.ts","./node_modules/next/dist/server/normalizers/request/next-data.d.ts","./node_modules/next/dist/server/after/builtin-request-context.d.ts","./node_modules/next/dist/server/normalizers/request/segment-prefix-rsc.d.ts","./node_modules/next/dist/server/route-modules/pages/builtin/_error.d.ts","./node_modules/next/dist/server/load-default-error-components.d.ts","./node_modules/next/dist/server/base-server.d.ts","./node_modules/next/dist/server/after/after.d.ts","./node_modules/next/dist/server/after/after-context.d.ts","./node_modules/next/dist/server/use-cache/cache-life.d.ts","./node_modules/next/dist/server/app-render/work-async-storage-instance.d.ts","./node_modules/next/dist/server/lib/lazy-result.d.ts","./node_modules/next/dist/server/app-render/create-error-handler.d.ts","./node_modules/next/dist/shared/lib/action-revalidation-kind.d.ts","./node_modules/next/dist/server/app-render/work-async-storage.external.d.ts","./node_modules/next/dist/server/async-storage/work-store.d.ts","./node_modules/next/dist/server/web/http.d.ts","./node_modules/next/dist/client/components/hooks-server-context.d.ts","./node_modules/next/dist/server/route-modules/app-route/shared-modules.d.ts","./node_modules/next/dist/client/components/redirect-status-code.d.ts","./node_modules/next/dist/client/components/redirect-error.d.ts","./node_modules/next/dist/server/web/spec-extension/adapters/request-cookies.d.ts","./node_modules/next/dist/server/async-storage/draft-mode-provider.d.ts","./node_modules/next/dist/server/web/spec-extension/adapters/headers.d.ts","./node_modules/next/dist/server/app-render/cache-signal.d.ts","./node_modules/next/dist/server/app-render/instant-validation/boundary-tracking.d.ts","./node_modules/next/dist/server/app-render/instant-validation/instant-validation-error.d.ts","./node_modules/next/dist/shared/lib/router/utils/parse-relative-url.d.ts","./node_modules/next/dist/server/app-render/instant-validation/instant-samples.d.ts","./node_modules/next/dist/server/app-render/dynamic-rendering.d.ts","./node_modules/next/dist/server/app-render/work-unit-async-storage-instance.d.ts","./node_modules/next/dist/server/lib/implicit-tags.d.ts","./node_modules/next/dist/server/app-render/staged-rendering.d.ts","./node_modules/next/dist/server/app-render/work-unit-async-storage.external.d.ts","./node_modules/next/dist/build/templates/app-route.d.ts","./node_modules/next/dist/server/app-render/action-async-storage-instance.d.ts","./node_modules/next/dist/server/app-render/action-async-storage.external.d.ts","./node_modules/next/dist/server/route-modules/app-route/module.d.ts","./node_modules/next/dist/server/route-modules/app-route/module.compiled.d.ts","./node_modules/next/dist/build/segment-config/app/app-segments.d.ts","./node_modules/next/dist/build/get-supported-browsers.d.ts","./node_modules/next/dist/build/utils.d.ts","./node_modules/next/dist/build/rendering-mode.d.ts","./node_modules/next/dist/server/lib/router-utils/build-prefetch-segment-data-route.d.ts","./node_modules/next/dist/server/lib/cpu-profile.d.ts","./node_modules/next/dist/build/turborepo-access-trace/types.d.ts","./node_modules/next/dist/build/turborepo-access-trace/result.d.ts","./node_modules/next/dist/build/turborepo-access-trace/helpers.d.ts","./node_modules/next/dist/build/turborepo-access-trace/index.d.ts","./node_modules/next/dist/export/routes/types.d.ts","./node_modules/next/dist/export/types.d.ts","./node_modules/next/dist/export/worker.d.ts","./node_modules/next/dist/build/worker.d.ts","./node_modules/next/dist/build/index.d.ts","./node_modules/next/dist/lib/coalesced-function.d.ts","./node_modules/next/dist/server/lib/router-utils/types.d.ts","./node_modules/next/dist/trace/types.d.ts","./node_modules/next/dist/trace/trace.d.ts","./node_modules/next/dist/trace/shared.d.ts","./node_modules/next/dist/trace/index.d.ts","./node_modules/next/dist/build/load-jsconfig.d.ts","./node_modules/@next/env/dist/index.d.ts","./node_modules/next/dist/build/webpack/plugins/telemetry-plugin/use-cache-tracker-utils.d.ts","./node_modules/next/dist/build/webpack/plugins/telemetry-plugin/telemetry-plugin.d.ts","./node_modules/next/dist/telemetry/storage.d.ts","./node_modules/next/dist/build/build-context.d.ts","./node_modules/next/dist/build/webpack-config.d.ts","./node_modules/next/dist/build/swc/generated-native.d.ts","./node_modules/next/dist/build/define-env.d.ts","./node_modules/next/dist/build/swc/index.d.ts","./node_modules/next/dist/build/swc/types.d.ts","./node_modules/next/dist/server/dev/parse-version-info.d.ts","./node_modules/next/dist/next-devtools/shared/types.d.ts","./node_modules/next/dist/server/dev/dev-indicator-server-state.d.ts","./node_modules/next/dist/next-devtools/dev-overlay/cache-indicator.d.ts","./node_modules/next/dist/server/lib/parse-stack.d.ts","./node_modules/next/dist/next-devtools/server/shared.d.ts","./node_modules/next/dist/next-devtools/shared/stack-frame.d.ts","./node_modules/next/dist/next-devtools/dev-overlay/utils/get-error-by-type.d.ts","./node_modules/next/dist/next-devtools/dev-overlay/container/runtime-error/render-error.d.ts","./node_modules/next/dist/next-devtools/dev-overlay/shared.d.ts","./node_modules/next/dist/server/dev/debug-channel.d.ts","./node_modules/next/dist/server/dev/hot-reloader-types.d.ts","./node_modules/next/dist/server/web/spec-extension/fetch-event.d.ts","./node_modules/next/dist/server/web/spec-extension/response.d.ts","./node_modules/next/dist/build/segment-config/middleware/middleware-config.d.ts","./node_modules/next/dist/server/web/types.d.ts","./node_modules/next/dist/shared/lib/router/utils/parse-url.d.ts","./node_modules/next/dist/server/base-http/node.d.ts","./node_modules/next/dist/server/lib/async-callback-set.d.ts","./node_modules/next/dist/shared/lib/router/utils/route-regex.d.ts","./node_modules/next/dist/shared/lib/router/utils/route-matcher.d.ts","./node_modules/sharp/lib/index.d.ts","./node_modules/next/dist/server/image-optimizer.d.ts","./node_modules/next/dist/server/next-server.d.ts","./node_modules/next/dist/server/lib/types.d.ts","./node_modules/next/dist/server/lib/lru-cache.d.ts","./node_modules/next/dist/server/lib/dev-bundler-service.d.ts","./node_modules/next/dist/server/dev/static-paths-worker.d.ts","./node_modules/next/dist/server/dev/next-dev-server.d.ts","./node_modules/next/dist/server/next.d.ts","./node_modules/next/dist/server/lib/render-server.d.ts","./node_modules/next/dist/server/lib/router-server.d.ts","./node_modules/next/dist/shared/lib/router/utils/path-match.d.ts","./node_modules/next/dist/server/lib/router-utils/filesystem.d.ts","./node_modules/next/dist/server/lib/router-utils/setup-dev-bundler.d.ts","./node_modules/next/dist/server/lib/router-utils/router-server-context.d.ts","./node_modules/next/dist/server/route-modules/route-module.d.ts","./node_modules/next/dist/server/load-components.d.ts","./node_modules/next/dist/server/web/adapter.d.ts","./node_modules/next/dist/server/app-render/types.d.ts","./node_modules/next/dist/build/webpack/loaders/metadata/types.d.ts","./node_modules/next/dist/build/webpack/loaders/next-app-loader/index.d.ts","./node_modules/next/dist/server/lib/app-dir-module.d.ts","./node_modules/next/dist/server/app-render/app-render.d.ts","./node_modules/next/dist/server/route-modules/app-page/vendored/contexts/entrypoints.d.ts","./node_modules/next/dist/client/components/error-boundary.d.ts","./node_modules/next/dist/client/components/layout-router.d.ts","./node_modules/next/dist/client/components/render-from-template-context.d.ts","./node_modules/next/dist/client/components/client-page.d.ts","./node_modules/next/dist/client/components/client-segment.d.ts","./node_modules/next/dist/client/components/http-access-fallback/error-boundary.d.ts","./node_modules/next/dist/lib/metadata/types/alternative-urls-types.d.ts","./node_modules/next/dist/lib/metadata/types/extra-types.d.ts","./node_modules/next/dist/lib/metadata/types/metadata-types.d.ts","./node_modules/next/dist/lib/metadata/types/manifest-types.d.ts","./node_modules/next/dist/lib/metadata/types/opengraph-types.d.ts","./node_modules/next/dist/lib/metadata/types/twitter-types.d.ts","./node_modules/next/dist/lib/metadata/types/metadata-interface.d.ts","./node_modules/next/dist/lib/metadata/types/resolvers.d.ts","./node_modules/next/dist/lib/metadata/types/icons.d.ts","./node_modules/next/dist/lib/metadata/resolve-metadata.d.ts","./node_modules/next/dist/lib/metadata/metadata.d.ts","./node_modules/next/dist/lib/framework/boundary-components.d.ts","./node_modules/next/dist/server/app-render/rsc/preloads.d.ts","./node_modules/next/dist/server/app-render/rsc/postpone.d.ts","./node_modules/next/dist/server/app-render/rsc/taint.d.ts","./node_modules/next/dist/server/app-render/collect-segment-data.d.ts","./node_modules/next/dist/server/app-render/instant-validation/instant-validation.d.ts","./node_modules/next/dist/next-devtools/userspace/app/segment-explorer-node.d.ts","./node_modules/next/dist/server/app-render/entry-base.d.ts","./node_modules/next/dist/build/templates/app-page.d.ts","./node_modules/next/dist/server/route-modules/app-page/helpers/prerender-manifest-matcher.d.ts","./node_modules/@types/react/jsx-dev-runtime.d.ts","./node_modules/@types/react/compiler-runtime.d.ts","./node_modules/next/dist/server/route-modules/app-page/vendored/rsc/entrypoints.d.ts","./node_modules/@types/react-dom/client.d.ts","./node_modules/@types/react-dom/static.d.ts","./node_modules/@types/react-dom/server.d.ts","./node_modules/next/dist/server/route-modules/app-page/vendored/ssr/entrypoints.d.ts","./node_modules/next/dist/server/route-modules/app-page/module.d.ts","./node_modules/next/dist/server/request/fallback-params.d.ts","./node_modules/next/dist/server/web/spec-extension/image-response.d.ts","./node_modules/next/dist/server/web/spec-extension/user-agent.d.ts","./node_modules/next/dist/server/web/spec-extension/url-pattern.d.ts","./node_modules/next/dist/server/after/index.d.ts","./node_modules/next/dist/server/request/connection.d.ts","./node_modules/next/dist/server/web/exports/index.d.ts","./node_modules/next/dist/server/request-meta.d.ts","./node_modules/next/dist/cli/next-test.d.ts","./node_modules/next/dist/shared/lib/size-limit.d.ts","./node_modules/next/dist/server/config-shared.d.ts","./node_modules/next/dist/server/base-http/index.d.ts","./node_modules/next/dist/server/api-utils/index.d.ts","./node_modules/next/dist/build/adapter/build-complete.d.ts","./node_modules/next/dist/types.d.ts","./node_modules/next/dist/shared/lib/html-context.shared-runtime.d.ts","./node_modules/next/dist/shared/lib/utils.d.ts","./node_modules/next/dist/pages/_app.d.ts","./node_modules/next/app.d.ts","./node_modules/next/dist/server/web/spec-extension/unstable-cache.d.ts","./node_modules/next/dist/server/web/spec-extension/revalidate.d.ts","./node_modules/next/dist/server/web/spec-extension/unstable-no-store.d.ts","./node_modules/next/dist/server/use-cache/cache-tag.d.ts","./node_modules/next/cache.d.ts","./node_modules/next/dist/pages/_document.d.ts","./node_modules/next/document.d.ts","./node_modules/next/dist/shared/lib/dynamic.d.ts","./node_modules/next/dynamic.d.ts","./node_modules/next/dist/pages/_error.d.ts","./node_modules/next/dist/client/components/catch-error.d.ts","./node_modules/next/dist/api/error.d.ts","./node_modules/next/error.d.ts","./node_modules/next/dist/shared/lib/head.d.ts","./node_modules/next/head.d.ts","./node_modules/next/dist/server/request/cookies.d.ts","./node_modules/next/dist/server/request/headers.d.ts","./node_modules/next/dist/server/request/draft-mode.d.ts","./node_modules/next/headers.d.ts","./node_modules/next/dist/shared/lib/get-img-props.d.ts","./node_modules/next/dist/client/image-component.d.ts","./node_modules/next/dist/shared/lib/image-external.d.ts","./node_modules/next/image.d.ts","./node_modules/next/dist/client/link.d.ts","./node_modules/next/link.d.ts","./node_modules/next/dist/client/components/unrecognized-action-error.d.ts","./node_modules/next/dist/client/components/redirect.d.ts","./node_modules/next/dist/client/components/not-found.d.ts","./node_modules/next/dist/client/components/forbidden.d.ts","./node_modules/next/dist/client/components/unauthorized.d.ts","./node_modules/next/dist/client/components/unstable-rethrow.server.d.ts","./node_modules/next/dist/client/components/unstable-rethrow.d.ts","./node_modules/next/dist/client/components/navigation.react-server.d.ts","./node_modules/next/dist/client/components/navigation.d.ts","./node_modules/next/navigation.d.ts","./node_modules/next/router.d.ts","./node_modules/next/dist/client/script.d.ts","./node_modules/next/script.d.ts","./node_modules/next/dist/compiled/@edge-runtime/primitives/url.d.ts","./node_modules/next/dist/compiled/@vercel/og/satori/index.d.ts","./node_modules/next/dist/compiled/@vercel/og/types.d.ts","./node_modules/next/server.d.ts","./node_modules/next/types/global.d.ts","./node_modules/next/types/compiled.d.ts","./node_modules/next/types.d.ts","./node_modules/next/index.d.ts","./node_modules/next/image-types/global.d.ts","./.next/dev/types/routes.d.ts","./next-env.d.ts","./next.config.ts","./src/lib/types.ts","./src/data/arms.ts","./src/data/artDescriptions.ts","./src/data/builds.ts","./src/data/classes.ts","./src/data/companions.ts","./src/data/skellWeapons.ts","./src/data/contextual.ts","./src/data/i18n.ts","./src/data/progression.ts","./src/data/skells.ts","./research/art-effects.json","./src/lib/engine.ts","./src/lib/buildPersistence.ts","./src/lib/buildPersistence.test.ts","./src/lib/contextualEngine.ts","./src/lib/contextualEngine.test.ts","./src/lib/engine.test.ts","./node_modules/next/dist/compiled/@next/font/dist/types.d.ts","./node_modules/next/dist/compiled/@next/font/dist/google/index.d.ts","./node_modules/next/font/google/index.d.ts","./app/layout.tsx","./src/components/ControlPanel.tsx","./src/components/BuildCard.tsx","./src/components/ResultsSection.tsx","./src/components/SiteFooter.tsx","./src/components/SquadPanel.tsx","./src/components/Topbar.tsx","./src/components/TeamBuilder.tsx","./app/page.tsx","./.next/types/cache-life.d.ts","./.next/types/routes.d.ts","./.next/types/validator.ts","./.next/dev/types/cache-life.d.ts","./.next/dev/types/validator.ts","./node_modules/@types/estree/index.d.ts","./node_modules/@types/json-schema/index.d.ts","./node_modules/@types/json5/index.d.ts"],"fileIdsList":[[97,146,163,164,488,489,490,491,568],[97,146,163,164,568,571],[97,146,163,164,231,532,535,559,567,568,571],[97,146,163,164,488,489,490,491,571],[97,146,163,164,231,532,559,567,568,569,571],[97,146,163,164,231,530,533,558,568,571],[97,146,163,164,231,566,568,571],[97,146,163,164,533,534,535,568,571],[97,146,163,164,231,533,568,571],[97,143,144,146,163,164,568,571],[97,145,146,163,164,568,571],[146,163,164,568,571],[97,146,151,163,164,181,568,571],[97,146,147,152,157,163,164,166,178,189,568,571],[97,146,147,148,157,163,164,166,568,571],[92,93,94,97,146,163,164,568,571],[97,146,149,163,164,190,568,571],[97,146,150,151,158,163,164,167,568,571],[97,146,151,163,164,178,186,568,571],[97,146,152,154,157,163,164,166,568,571],[97,145,146,153,163,164,568,571],[97,146,154,155,163,164,568,571],[97,146,156,157,163,164,568,571],[97,145,146,157,163,164,568,571],[97,146,157,158,159,163,164,178,189,568,571],[97,146,157,158,159,163,164,173,178,181,568,571],[97,138,146,154,157,160,163,164,166,178,189,568,571],[97,146,157,158,160,161,163,164,166,178,186,189,568,571],[97,146,160,162,163,164,178,186,189,568,571],[95,96,97,98,99,100,101,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,568,571],[97,146,157,163,164,568,571],[97,146,163,164,165,189,568,571],[97,146,154,157,163,164,166,178,568,571],[97,146,163,164,167,568,571],[97,146,163,164,168,568,571],[97,145,146,163,164,169,568,571],[97,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,568,571],[97,146,163,164,171,568,571],[97,146,163,164,172,568,571],[97,146,157,163,164,173,174,568,571],[97,146,163,164,173,175,190,192,568,571],[97,146,158,163,164,568,571],[97,146,157,163,164,178,179,181,568,571],[97,146,163,164,180,181,568,571],[97,146,163,164,178,179,568,571],[97,146,163,164,181,568,571],[97,146,163,164,182,568,571],[97,143,146,163,164,178,183,189,568,571],[97,146,157,163,164,184,185,568,571],[97,146,163,164,184,185,568,571],[97,146,151,163,164,166,178,186,568,571],[97,146,163,164,187,568,571],[97,146,163,164,166,188,568,571],[97,146,160,163,164,172,189,568,571],[97,146,151,163,164,190,568,571],[97,146,163,164,178,191,568,571],[97,146,163,164,165,192,568,571],[97,146,163,164,193,568,571],[97,138,146,163,164,568,571],[97,138,146,157,159,163,164,169,178,181,189,191,192,194,568,571],[97,146,163,164,178,195,568,571],[85,89,97,146,163,164,197,198,199,200,201,483,528,568,571],[85,97,146,163,164,568,571],[85,89,97,146,163,164,197,198,199,200,464,483,528,568,571],[85,89,97,146,163,164,197,198,200,201,483,528,568,571],[85,97,146,163,164,201,464,465,568,571],[85,97,146,163,164,201,464,568,571],[85,89,97,146,163,164,198,199,200,201,483,528,568,571],[85,89,97,146,163,164,197,199,200,201,483,528,568,571],[83,84,97,146,163,164,568,571],[97,146,163,164,486,568,571],[97,146,163,164,488,489,490,491,568,571],[97,146,163,164,434,497,498,568,571],[97,146,163,164,206,207,209,221,245,360,371,479,568,571],[97,146,163,164,209,240,241,242,244,479,568,571],[97,146,163,164,209,377,379,381,382,384,479,481,568,571],[97,146,163,164,209,243,280,479,568,571],[97,146,163,164,207,209,220,221,227,233,238,359,360,361,370,479,481,568,571],[97,146,163,164,479,568,571],[97,146,163,164,216,222,241,261,356,568,571],[97,146,163,164,209,568,571],[97,146,163,164,202,216,222,568,571],[97,146,163,164,388,568,571],[97,146,163,164,385,386,388,568,571],[97,146,163,164,385,387,479,568,571],[97,146,160,163,164,261,458,476,568,571],[97,146,160,163,164,332,335,351,356,476,568,571],[97,146,160,163,164,304,476,568,571],[97,146,163,164,364,568,571],[97,146,163,164,363,364,365,568,571],[97,146,163,164,363,568,571],[91,97,146,160,163,164,202,209,221,227,233,239,241,245,246,259,260,327,357,358,371,479,483,568,571],[97,146,163,164,206,209,243,280,377,378,383,479,531,568,571],[97,146,163,164,243,531,568,571],[97,146,163,164,206,260,429,479,531,568,571],[97,146,163,164,531,568,571],[97,146,163,164,209,243,244,531,568,571],[97,146,163,164,380,531,568,571],[97,146,163,164,246,359,362,369,568,571],[85,97,146,163,164,434,568,571],[97,146,163,164,172,216,231,568,571],[97,146,163,164,216,231,568,571],[85,97,146,163,164,301,568,571],[85,97,146,163,164,231,568,571],[85,97,146,163,164,222,231,434,568,571],[97,146,163,164,216,287,301,302,513,520,568,571],[97,146,163,164,286,514,515,516,517,519,568,571],[97,146,163,164,337,568,571],[97,146,163,164,337,338,568,571],[97,146,163,164,220,222,289,290,568,571],[97,146,163,164,222,296,297,568,571],[97,146,163,164,222,291,299,568,571],[97,146,163,164,296,568,571],[97,146,163,164,214,222,289,290,291,292,293,294,295,296,299,568,571],[97,146,163,164,222,289,296,297,298,300,568,571],[97,146,163,164,222,290,292,293,568,571],[97,146,163,164,290,292,295,297,568,571],[97,146,163,164,518,568,571],[97,146,163,164,222,568,571],[85,97,146,163,164,210,507,568,571],[85,97,146,163,164,189,568,571],[85,97,146,163,164,243,278,568,571],[85,97,146,163,164,243,371,568,571],[97,146,163,164,276,281,568,571],[85,97,146,163,164,277,485,568,571],[97,146,163,164,556,568,571],[85,89,97,146,160,163,164,197,198,199,200,201,483,527,568,571],[97,146,160,163,164,222,568,571],[97,146,160,163,164,221,226,307,324,366,367,371,426,428,479,480,568,571],[97,146,163,164,259,368,568,571],[97,146,163,164,483,568,571],[97,146,163,164,208,568,571],[85,97,146,163,164,213,216,431,447,449,568,571],[97,146,163,164,172,216,431,446,447,448,530,568,571],[97,146,163,164,440,441,442,443,444,445,568,571],[97,146,163,164,442,568,571],[97,146,163,164,446,568,571],[97,146,163,164,231,395,396,398,568,571],[85,97,146,163,164,222,389,390,391,392,397,568,571],[97,146,163,164,395,397,568,571],[97,146,163,164,393,568,571],[97,146,163,164,394,568,571],[85,97,146,163,164,231,277,485,568,571],[85,97,146,163,164,231,484,485,568,571],[85,97,146,163,164,231,485,568,571],[97,146,163,164,324,325,568,571],[97,146,163,164,325,568,571],[97,146,160,163,164,480,485,568,571],[97,146,163,164,354,568,571],[97,145,146,163,164,353,568,571],[97,146,163,164,216,222,228,230,332,345,349,351,428,431,468,469,476,480,568,571],[97,146,163,164,222,271,293,568,571],[97,146,163,164,332,343,346,351,568,571],[85,97,146,163,164,213,216,332,335,351,354,388,435,436,437,438,439,450,451,452,453,454,455,456,457,531,568,571],[97,146,163,164,213,216,241,332,339,340,341,344,345,568,571],[97,146,163,164,178,222,241,343,350,431,432,476,568,571],[97,146,163,164,347,568,571],[97,146,160,163,164,172,210,222,226,236,268,269,272,324,327,392,426,427,468,479,480,481,483,531,568,571],[97,146,163,164,213,214,216,568,571],[97,146,163,164,332,568,571],[97,145,146,163,164,241,268,269,326,327,328,329,330,331,480,568,571],[97,146,163,164,351,568,571],[97,145,146,163,164,215,216,226,230,266,332,339,340,341,342,343,346,347,348,349,350,469,568,571],[97,146,160,163,164,266,267,339,480,481,568,571],[97,146,163,164,241,269,324,327,332,428,480,568,571],[97,146,160,163,164,479,481,568,571],[97,146,160,163,164,178,476,480,481,568,571],[97,146,160,163,164,172,202,216,221,228,230,233,236,243,263,268,269,270,271,272,307,308,310,313,315,318,319,320,321,323,371,426,428,476,479,480,481,568,571],[97,146,160,163,164,178,568,571],[97,146,163,164,209,210,211,239,476,477,478,483,485,531,568,571],[97,146,163,164,206,207,479,568,571],[97,146,163,164,400,568,571],[97,146,160,163,164,178,189,218,384,388,389,390,391,392,398,399,531,568,571],[97,146,163,164,172,189,202,216,218,230,233,269,308,313,323,324,377,404,405,406,412,415,416,426,428,476,479,568,571],[97,146,163,164,233,239,246,259,269,327,479,568,571],[97,146,160,163,164,189,210,221,230,269,410,476,479,568,571],[97,146,163,164,430,568,571],[97,146,160,163,164,400,413,414,423,568,571],[97,146,163,164,476,479,568,571],[97,146,163,164,329,469,568,571],[97,146,163,164,230,268,371,485,568,571],[97,146,160,163,164,172,208,313,373,377,406,412,415,418,476,568,571],[97,146,160,163,164,246,259,377,419,568,571],[97,146,163,164,209,270,371,421,479,481,568,571],[97,146,160,163,164,189,392,479,568,571],[97,146,160,163,164,243,270,371,372,373,382,400,420,422,479,568,571],[91,97,146,160,163,164,268,425,483,485,568,571],[97,146,163,164,322,426,568,571],[97,146,160,163,164,172,216,219,221,222,228,230,236,245,246,259,269,272,308,310,320,323,324,371,404,405,406,407,409,411,426,428,476,485,568,571],[97,146,160,163,164,178,246,412,417,423,476,568,571],[97,146,163,164,249,250,251,252,253,254,255,256,257,258,568,571],[97,146,163,164,263,314,568,571],[97,146,163,164,316,568,571],[97,146,163,164,314,568,571],[97,146,163,164,316,317,568,571],[97,146,160,163,164,220,221,222,226,227,480,568,571],[97,146,160,163,164,172,208,210,228,232,268,271,272,306,426,476,481,483,485,568,571],[97,146,160,163,164,172,189,212,219,220,230,232,269,424,469,475,480,568,571],[97,146,163,164,339,568,571],[97,146,163,164,340,568,571],[97,146,163,164,222,233,468,568,571],[97,146,163,164,341,568,571],[97,146,163,164,215,568,571],[97,146,163,164,217,229,568,571],[97,146,160,163,164,217,221,228,568,571],[97,146,163,164,224,229,568,571],[97,146,163,164,225,568,571],[97,146,163,164,217,218,568,571],[97,146,163,164,217,273,568,571],[97,146,163,164,217,568,571],[97,146,163,164,219,263,312,568,571],[97,146,163,164,311,568,571],[97,146,163,164,216,218,219,568,571],[97,146,163,164,219,309,568,571],[97,146,163,164,216,218,568,571],[97,146,163,164,268,371,568,571],[97,146,163,164,468,568,571],[97,146,160,163,164,189,228,230,234,268,371,425,428,431,432,433,459,460,463,467,469,476,480,568,571],[97,146,163,164,282,285,287,288,301,302,568,571],[85,97,146,163,164,199,200,201,231,461,462,568,571],[85,97,146,163,164,199,200,201,231,461,462,466,568,571],[97,146,163,164,355,568,571],[97,146,163,164,241,262,267,268,332,333,334,335,336,338,351,352,354,357,425,428,479,481,568,571],[97,146,163,164,301,568,571],[97,146,160,163,164,306,476,568,571],[97,146,163,164,306,568,571],[97,146,160,163,164,228,274,303,305,307,425,476,483,485,568,571],[97,146,163,164,282,283,284,285,287,288,301,302,484,568,571],[91,97,146,160,163,164,172,189,217,218,230,236,268,269,272,371,423,424,426,476,479,480,483,568,571],[97,146,163,164,213,216,223,568,571],[97,146,163,164,267,269,401,404,568,571],[97,146,163,164,267,402,470,471,472,473,474,568,571],[97,146,160,163,164,263,479,568,571],[97,146,160,163,164,568,571],[97,146,163,164,266,351,568,571],[97,146,163,164,265,568,571],[97,146,163,164,267,320,568,571],[97,146,163,164,264,266,479,568,571],[97,146,160,163,164,212,267,401,402,403,476,479,480,568,571],[85,97,146,163,164,216,222,300,568,571],[85,97,146,163,164,214,568,571],[97,146,163,164,204,205,568,571],[85,97,146,163,164,210,568,571],[85,97,146,163,164,216,286,568,571],[85,91,97,146,163,164,268,272,483,485,568,571],[97,146,163,164,210,507,508,568,571],[85,97,146,163,164,281,568,571],[85,97,146,163,164,172,189,208,275,277,279,280,485,568,571],[97,146,163,164,216,243,480,568,571],[97,146,163,164,216,408,568,571],[85,97,146,158,160,163,164,172,206,208,281,379,483,484,568,571],[85,97,146,163,164,197,198,199,200,201,483,528,568,571],[85,86,87,88,89,97,146,163,164,568,571],[97,146,151,163,164,568,571],[97,146,163,164,374,375,376,568,571],[97,146,163,164,374,568,571],[85,89,97,146,160,162,163,164,172,196,197,198,199,200,201,202,208,236,241,418,446,481,482,485,528,568,571],[97,146,163,164,493,568,571],[97,146,163,164,495,568,571],[97,146,163,164,499,568,571],[97,146,163,164,557,568,571],[97,146,163,164,501,568,571],[97,146,163,164,503,504,505,568,571],[97,146,163,164,509,568,571],[90,97,146,163,164,487,492,494,496,500,502,506,510,512,522,523,525,529,530,531,532,568,571],[97,146,163,164,511,568,571],[97,146,163,164,521,568,571],[97,146,163,164,277,568,571],[97,146,163,164,524,568,571],[97,145,146,163,164,267,401,402,404,470,471,473,474,526,528,568,571],[97,146,163,164,196,568,571],[97,146,163,164,178,196,568,571],[97,110,114,146,163,164,189,568,571],[97,110,146,163,164,178,189,568,571],[97,105,146,163,164,568,571],[97,107,110,146,163,164,186,189,568,571],[97,146,163,164,166,186,568,571],[97,105,146,163,164,196,568,571],[97,107,110,146,163,164,166,189,568,571],[97,102,103,106,109,146,157,163,164,178,189,568,571],[97,110,117,146,163,164,568,571],[97,102,108,146,163,164,568,571],[97,110,131,132,146,163,164,568,571],[97,106,110,146,163,164,181,189,196,568,571],[97,131,146,163,164,196,568,571],[97,104,105,146,163,164,196,568,571],[97,110,146,163,164,568,571],[97,104,105,106,107,108,109,110,111,112,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,132,133,134,135,136,137,146,163,164,568,571],[97,110,125,146,163,164,568,571],[97,110,117,118,146,163,164,568,571],[97,108,110,118,119,146,163,164,568,571],[97,109,146,163,164,568,571],[97,102,105,110,146,163,164,568,571],[97,110,114,118,119,146,163,164,568,571],[97,114,146,163,164,568,571],[97,108,110,113,146,163,164,189,568,571],[97,102,107,110,117,146,163,164,568,571],[97,146,163,164,178,568,571],[97,105,110,131,146,163,164,194,196,568,571],[97,146,163,164,231,568,571],[97,146,163,164,231,538,539,540,541,546,550,553,568,571],[97,146,163,164,231,538,542,546,550,568,571],[85,97,146,163,164,231,538,546,550,561,568,571],[97,146,163,164,231,546,568,571],[97,146,163,164,231,538,543,546,568,571],[85,97,146,163,164,231,538,542,546,550,551,553,560,562,563,564,565,568,571],[97,146,163,164,231,538,546,568,571],[97,146,163,164,231,538,568,571],[97,146,163,164,231,538,544,568,571],[97,144,146,163,164,183,231,550,551,568,571],[97,146,163,164,231,538,542,543,550,568,571],[97,144,146,163,164,183,231,538,543,549,550,553,568,571],[97,146,163,164,231,538,541,543,545,547,549,550,568,571],[97,144,146,163,164,183,231,543,547,549,550,568,571],[97,146,163,164,231,538,541,542,543,544,547,548,549,568,571]],"fileInfos":[{"version":"c430d44666289dae81f30fa7b2edebf186ecc91a2d4c71266ea6ae76388792e1","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"e44bb8bbac7f10ecc786703fe0a6a4b952189f908707980ba8f3c8975a760962","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"feecb1be483ed332fad555aff858affd90a48ab19ba7272ee084704eb7167569","impliedFormat":1},{"version":"ee7bad0c15b58988daa84371e0b89d313b762ab83cb5b31b8a2d1162e8eb41c2","impliedFormat":1},{"version":"27bdc30a0e32783366a5abeda841bc22757c1797de8681bbe81fbc735eeb1c10","impliedFormat":1},{"version":"8fd575e12870e9944c7e1d62e1f5a73fcf23dd8d3a321f2a2c74c20d022283fe","impliedFormat":1},{"version":"2ab096661c711e4a81cc464fa1e6feb929a54f5340b46b0a07ac6bbf857471f0","impliedFormat":1},{"version":"080941d9f9ff9307f7e27a83bcd888b7c8270716c39af943532438932ec1d0b9","affectsGlobalScope":true,"impliedFormat":1},{"version":"2e80ee7a49e8ac312cc11b77f1475804bee36b3b2bc896bead8b6e1266befb43","affectsGlobalScope":true,"impliedFormat":1},{"version":"c57796738e7f83dbc4b8e65132f11a377649c00dd3eee333f672b8f0a6bea671","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"515d0b7b9bea2e31ea4ec968e9edd2c39d3eebf4a2d5cbd04e88639819ae3b71","affectsGlobalScope":true,"impliedFormat":1},{"version":"0559b1f683ac7505ae451f9a96ce4c3c92bdc71411651ca6ddb0e88baaaad6a3","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"fb0f136d372979348d59b3f5020b4cdb81b5504192b1cacff5d1fbba29378aa1","affectsGlobalScope":true,"impliedFormat":1},{"version":"d15bea3d62cbbdb9797079416b8ac375ae99162a7fba5de2c6c505446486ac0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"68d18b664c9d32a7336a70235958b8997ebc1c3b8505f4f1ae2b7e7753b87618","affectsGlobalScope":true,"impliedFormat":1},{"version":"eb3d66c8327153d8fa7dd03f9c58d351107fe824c79e9b56b462935176cdf12a","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"69ab18c3b76cd9b1be3d188eaf8bba06112ebbe2f47f6c322b5105a6fbc45a2e","affectsGlobalScope":true,"impliedFormat":1},{"version":"a680117f487a4d2f30ea46f1b4b7f58bef1480456e18ba53ee85c2746eeca012","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"954296b30da6d508a104a3a0b5d96b76495c709785c1d11610908e63481ee667","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac9538681b19688c8eae65811b329d3744af679e0bdfa5d842d0e32524c73e1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a969edff4bd52585473d24995c5ef223f6652d6ef46193309b3921d65dd4376","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"d6d7ae4d1f1f3772e2a3cde568ed08991a8ae34a080ff1151af28b7f798e22ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"52ada8e0b6e0482b728070b7639ee42e83a9b1c22d205992756fe020fd9f4a47","affectsGlobalScope":true,"impliedFormat":1},{"version":"3bdefe1bfd4d6dee0e26f928f93ccc128f1b64d5d501ff4a8cf3c6371200e5e6","affectsGlobalScope":true,"impliedFormat":1},{"version":"59fb2c069260b4ba00b5643b907ef5d5341b167e7d1dbf58dfd895658bda2867","affectsGlobalScope":true,"impliedFormat":1},{"version":"639e512c0dfc3fad96a84caad71b8834d66329a1f28dc95e3946c9b58176c73a","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"af3dd424cf267428f30ccfc376f47a2c0114546b55c44d8c0f1d57d841e28d74","affectsGlobalScope":true,"impliedFormat":1},{"version":"995c005ab91a498455ea8dfb63aa9f83fa2ea793c3d8aa344be4a1678d06d399","affectsGlobalScope":true,"impliedFormat":1},{"version":"959d36cddf5e7d572a65045b876f2956c973a586da58e5d26cde519184fd9b8a","affectsGlobalScope":true,"impliedFormat":1},{"version":"965f36eae237dd74e6cca203a43e9ca801ce38824ead814728a2807b1910117d","affectsGlobalScope":true,"impliedFormat":1},{"version":"3925a6c820dcb1a06506c90b1577db1fdbf7705d65b62b99dce4be75c637e26b","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a3d63ef2b853447ec4f749d3f368ce642264246e02911fcb1590d8c161b8005","affectsGlobalScope":true,"impliedFormat":1},{"version":"8cdf8847677ac7d20486e54dd3fcf09eda95812ac8ace44b4418da1bbbab6eb8","affectsGlobalScope":true,"impliedFormat":1},{"version":"8444af78980e3b20b49324f4a16ba35024fef3ee069a0eb67616ea6ca821c47a","affectsGlobalScope":true,"impliedFormat":1},{"version":"3287d9d085fbd618c3971944b65b4be57859f5415f495b33a6adc994edd2f004","affectsGlobalScope":true,"impliedFormat":1},{"version":"b4b67b1a91182421f5df999988c690f14d813b9850b40acd06ed44691f6727ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"df83c2a6c73228b625b0beb6669c7ee2a09c914637e2d35170723ad49c0f5cd4","affectsGlobalScope":true,"impliedFormat":1},{"version":"436aaf437562f276ec2ddbee2f2cdedac7664c1e4c1d2c36839ddd582eeb3d0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e3c06ea092138bf9fa5e874a1fdbc9d54805d074bee1de31b99a11e2fec239d","affectsGlobalScope":true,"impliedFormat":1},{"version":"87dc0f382502f5bbce5129bdc0aea21e19a3abbc19259e0b43ae038a9fc4e326","affectsGlobalScope":true,"impliedFormat":1},{"version":"b1cb28af0c891c8c96b2d6b7be76bd394fddcfdb4709a20ba05a7c1605eea0f9","affectsGlobalScope":true,"impliedFormat":1},{"version":"2fef54945a13095fdb9b84f705f2b5994597640c46afeb2ce78352fab4cb3279","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac77cb3e8c6d3565793eb90a8373ee8033146315a3dbead3bde8db5eaf5e5ec6","affectsGlobalScope":true,"impliedFormat":1},{"version":"56e4ed5aab5f5920980066a9409bfaf53e6d21d3f8d020c17e4de584d29600ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ece9f17b3866cc077099c73f4983bddbcb1dc7ddb943227f1ec070f529dedd1","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a6282c8827e4b9a95f4bf4f5c205673ada31b982f50572d27103df8ceb8013c","affectsGlobalScope":true,"impliedFormat":1},{"version":"1c9319a09485199c1f7b0498f2988d6d2249793ef67edda49d1e584746be9032","affectsGlobalScope":true,"impliedFormat":1},{"version":"e3a2a0cee0f03ffdde24d89660eba2685bfbdeae955a6c67e8c4c9fd28928eeb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811c71eee4aa0ac5f7adf713323a5c41b0cf6c4e17367a34fbce379e12bbf0a4","affectsGlobalScope":true,"impliedFormat":1},{"version":"51ad4c928303041605b4d7ae32e0c1ee387d43a24cd6f1ebf4a2699e1076d4fa","affectsGlobalScope":true,"impliedFormat":1},{"version":"60037901da1a425516449b9a20073aa03386cce92f7a1fd902d7602be3a7c2e9","affectsGlobalScope":true,"impliedFormat":1},{"version":"d4b1d2c51d058fc21ec2629fff7a76249dec2e36e12960ea056e3ef89174080f","affectsGlobalScope":true,"impliedFormat":1},{"version":"22adec94ef7047a6c9d1af3cb96be87a335908bf9ef386ae9fd50eeb37f44c47","affectsGlobalScope":true,"impliedFormat":1},{"version":"196cb558a13d4533a5163286f30b0509ce0210e4b316c56c38d4c0fd2fb38405","affectsGlobalScope":true,"impliedFormat":1},{"version":"73f78680d4c08509933daf80947902f6ff41b6230f94dd002ae372620adb0f60","affectsGlobalScope":true,"impliedFormat":1},{"version":"c5239f5c01bcfa9cd32f37c496cf19c61d69d37e48be9de612b541aac915805b","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e7f8264d0fb4c5339605a15daadb037bf238c10b654bb3eee14208f860a32ea","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"7e29f41b158de217f94cb9676bf9cbd0cd9b5a46e1985141ed36e075c52bf6ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac51dd7d31333793807a6abaa5ae168512b6131bd41d9c5b98477fc3b7800f9f","impliedFormat":1},{"version":"814d5c7384f3ca276e9dc4bcfde5545801a3ea0bfae09916b3336774e662fd1b","impliedFormat":1},{"version":"acd8fd5090ac73902278889c38336ff3f48af6ba03aa665eb34a75e7ba1dccc4","impliedFormat":1},{"version":"d6258883868fb2680d2ca96bc8b1352cab69874581493e6d52680c5ffecdb6cc","impliedFormat":1},{"version":"1b61d259de5350f8b1e5db06290d31eaebebc6baafd5f79d314b5af9256d7153","impliedFormat":1},{"version":"f258e3960f324a956fc76a3d3d9e964fff2244ff5859dcc6ce5951e5413ca826","impliedFormat":1},{"version":"643f7232d07bf75e15bd8f658f664d6183a0efaca5eb84b48201c7671a266979","impliedFormat":1},{"version":"21da358700a3893281ce0c517a7a30cbd46be020d9f0c3f2834d0a8ad1f5fc75","impliedFormat":1},{"version":"6c7176368037af28cb72f2392010fa1cef295d6d6744bca8cfb54985f3a18c3e","affectsGlobalScope":true,"impliedFormat":1},{"version":"ab41ef1f2cdafb8df48be20cd969d875602483859dc194e9c97c8a576892c052","affectsGlobalScope":true,"impliedFormat":1},{"version":"437e20f2ba32abaeb7985e0afe0002de1917bc74e949ba585e49feba65da6ca1","affectsGlobalScope":true,"impliedFormat":1},{"version":"21d819c173c0cf7cc3ce57c3276e77fd9a8a01d35a06ad87158781515c9a438a","impliedFormat":1},{"version":"98cffbf06d6bab333473c70a893770dbe990783904002c4f1a960447b4b53dca","affectsGlobalScope":true,"impliedFormat":1},{"version":"3af97acf03cc97de58a3a4bc91f8f616408099bc4233f6d0852e72a8ffb91ac9","affectsGlobalScope":true,"impliedFormat":1},{"version":"808069bba06b6768b62fd22429b53362e7af342da4a236ed2d2e1c89fcca3b4a","affectsGlobalScope":true,"impliedFormat":1},{"version":"1db0b7dca579049ca4193d034d835f6bfe73096c73663e5ef9a0b5779939f3d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"9798340ffb0d067d69b1ae5b32faa17ab31b82466a3fc00d8f2f2df0c8554aaa","affectsGlobalScope":true,"impliedFormat":1},{"version":"f26b11d8d8e4b8028f1c7d618b22274c892e4b0ef5b3678a8ccbad85419aef43","affectsGlobalScope":true,"impliedFormat":1},{"version":"5929864ce17fba74232584d90cb721a89b7ad277220627cc97054ba15a98ea8f","impliedFormat":1},{"version":"763fe0f42b3d79b440a9b6e51e9ba3f3f91352469c1e4b3b67bfa4ff6352f3f4","impliedFormat":1},{"version":"25c8056edf4314820382a5fdb4bb7816999acdcb929c8f75e3f39473b87e85bc","impliedFormat":1},{"version":"c464d66b20788266e5353b48dc4aa6bc0dc4a707276df1e7152ab0c9ae21fad8","impliedFormat":1},{"version":"78d0d27c130d35c60b5e5566c9f1e5be77caf39804636bc1a40133919a949f21","impliedFormat":1},{"version":"c6fd2c5a395f2432786c9cb8deb870b9b0e8ff7e22c029954fabdd692bff6195","impliedFormat":1},{"version":"1d6e127068ea8e104a912e42fc0a110e2aa5a66a356a917a163e8cf9a65e4a75","impliedFormat":1},{"version":"5ded6427296cdf3b9542de4471d2aa8d3983671d4cac0f4bf9c637208d1ced43","impliedFormat":1},{"version":"7f182617db458e98fc18dfb272d40aa2fff3a353c44a89b2c0ccb3937709bfb5","impliedFormat":1},{"version":"cadc8aced301244057c4e7e73fbcae534b0f5b12a37b150d80e5a45aa4bebcbd","impliedFormat":1},{"version":"385aab901643aa54e1c36f5ef3107913b10d1b5bb8cbcd933d4263b80a0d7f20","impliedFormat":1},{"version":"9670d44354bab9d9982eca21945686b5c24a3f893db73c0dae0fd74217a4c219","impliedFormat":1},{"version":"0b8a9268adaf4da35e7fa830c8981cfa22adbbe5b3f6f5ab91f6658899e657a7","impliedFormat":1},{"version":"11396ed8a44c02ab9798b7dca436009f866e8dae3c9c25e8c1fbc396880bf1bb","impliedFormat":1},{"version":"ba7bc87d01492633cb5a0e5da8a4a42a1c86270e7b3d2dea5d156828a84e4882","impliedFormat":1},{"version":"4893a895ea92c85345017a04ed427cbd6a1710453338df26881a6019432febdd","impliedFormat":1},{"version":"c21dc52e277bcfc75fac0436ccb75c204f9e1b3fa5e12729670910639f27343e","impliedFormat":1},{"version":"13f6f39e12b1518c6650bbb220c8985999020fe0f21d818e28f512b7771d00f9","impliedFormat":1},{"version":"9b5369969f6e7175740bf51223112ff209f94ba43ecd3bb09eefff9fd675624a","impliedFormat":1},{"version":"4fe9e626e7164748e8769bbf74b538e09607f07ed17c2f20af8d680ee49fc1da","impliedFormat":1},{"version":"24515859bc0b836719105bb6cc3d68255042a9f02a6022b3187948b204946bd2","impliedFormat":1},{"version":"ea0148f897b45a76544ae179784c95af1bd6721b8610af9ffa467a518a086a43","impliedFormat":1},{"version":"24c6a117721e606c9984335f71711877293a9651e44f59f3d21c1ea0856f9cc9","impliedFormat":1},{"version":"dd3273ead9fbde62a72949c97dbec2247ea08e0c6952e701a483d74ef92d6a17","impliedFormat":1},{"version":"405822be75ad3e4d162e07439bac80c6bcc6dbae1929e179cf467ec0b9ee4e2e","impliedFormat":1},{"version":"0db18c6e78ea846316c012478888f33c11ffadab9efd1cc8bcc12daded7a60b6","impliedFormat":1},{"version":"e61be3f894b41b7baa1fbd6a66893f2579bfad01d208b4ff61daef21493ef0a8","impliedFormat":1},{"version":"bd0532fd6556073727d28da0edfd1736417a3f9f394877b6d5ef6ad88fba1d1a","impliedFormat":1},{"version":"89167d696a849fce5ca508032aabfe901c0868f833a8625d5a9c6e861ef935d2","impliedFormat":1},{"version":"615ba88d0128ed16bf83ef8ccbb6aff05c3ee2db1cc0f89ab50a4939bfc1943f","impliedFormat":1},{"version":"a4d551dbf8746780194d550c88f26cf937caf8d56f102969a110cfaed4b06656","impliedFormat":1},{"version":"8bd86b8e8f6a6aa6c49b71e14c4ffe1211a0e97c80f08d2c8cc98838006e4b88","impliedFormat":1},{"version":"317e63deeb21ac07f3992f5b50cdca8338f10acd4fbb7257ebf56735bf52ab00","impliedFormat":1},{"version":"4732aec92b20fb28c5fe9ad99521fb59974289ed1e45aecb282616202184064f","impliedFormat":1},{"version":"2e85db9e6fd73cfa3d7f28e0ab6b55417ea18931423bd47b409a96e4a169e8e6","impliedFormat":1},{"version":"c46e079fe54c76f95c67fb89081b3e399da2c7d109e7dca8e4b58d83e332e605","impliedFormat":1},{"version":"bf67d53d168abc1298888693338cb82854bdb2e69ef83f8a0092093c2d562107","impliedFormat":1},{"version":"b52476feb4a0cbcb25e5931b930fc73cb6643fb1a5060bf8a3dda0eeae5b4b68","affectsGlobalScope":true,"impliedFormat":1},{"version":"f9501cc13ce624c72b61f12b3963e84fad210fbdf0ffbc4590e08460a3f04eba","affectsGlobalScope":true,"impliedFormat":1},{"version":"e7721c4f69f93c91360c26a0a84ee885997d748237ef78ef665b153e622b36c1","affectsGlobalScope":true,"impliedFormat":1},{"version":"d97fb21da858fb18b8ae72c314e9743fd52f73ebe2764e12af1db32fc03f853f","affectsGlobalScope":true,"impliedFormat":1},{"version":"0fa06ada475b910e2106c98c68b10483dc8811d0c14a8a8dd36efb2672485b29","impliedFormat":1},{"version":"33e5e9aba62c3193d10d1d33ae1fa75c46a1171cf76fef750777377d53b0303f","impliedFormat":1},{"version":"2b06b93fd01bcd49d1a6bd1f9b65ddcae6480b9a86e9061634d6f8e354c1468f","impliedFormat":1},{"version":"6a0cd27e5dc2cfbe039e731cf879d12b0e2dded06d1b1dedad07f7712de0d7f4","affectsGlobalScope":true,"impliedFormat":1},{"version":"13f5c844119c43e51ce777c509267f14d6aaf31eafb2c2b002ca35584cd13b29","impliedFormat":1},{"version":"e60477649d6ad21542bd2dc7e3d9ff6853d0797ba9f689ba2f6653818999c264","impliedFormat":1},{"version":"c2510f124c0293ab80b1777c44d80f812b75612f297b9857406468c0f4dafe29","affectsGlobalScope":true,"impliedFormat":1},{"version":"5524481e56c48ff486f42926778c0a3cce1cc85dc46683b92b1271865bcf015a","impliedFormat":1},{"version":"4c829ab315f57c5442c6667b53769975acbf92003a66aef19bce151987675bd1","affectsGlobalScope":true,"impliedFormat":1},{"version":"b2ade7657e2db96d18315694789eff2ddd3d8aea7215b181f8a0b303277cc579","impliedFormat":1},{"version":"78dbea00e90d2df8ea3dbef0cc379d95b8be9b71cd6bde4c28728f306811803b","impliedFormat":1},{"version":"4d631b81fa2f07a0e63a9a143d6a82c25c5f051298651a9b69176ba28930756d","impliedFormat":1},{"version":"836a356aae992ff3c28a0212e3eabcb76dd4b0cc06bcb9607aeef560661b860d","impliedFormat":1},{"version":"1e0d1f8b0adfa0b0330e028c7941b5a98c08b600efe7f14d2d2a00854fb2f393","impliedFormat":1},{"version":"41670ee38943d9cbb4924e436f56fc19ee94232bc96108562de1a734af20dc2c","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e1e46d0a9837ee058c100501080c920fa98081ea3956af0374308ba6f22a33e","impliedFormat":1},{"version":"272ca407e0c9068bdc5152552d876e68037ceae3de62e529306403e973dec8e1","impliedFormat":1},{"version":"fa7834c715d5357e4540cee40ce96c3250ddb67a7b879a6b7fa0e86d6696f121","impliedFormat":1},{"version":"22dfb07a7ab15b66ac043829056fe70124844636ae719551812ac631ba04985b","impliedFormat":1},{"version":"a10f0e1854f3316d7ee437b79649e5a6ae3ae14ffe6322b02d4987071a95362e","impliedFormat":1},{"version":"e208f73ef6a980104304b0d2ca5f6bf1b85de6009d2c7e404028b875020fa8f2","impliedFormat":1},{"version":"d163b6bc2372b4f07260747cbc6c0a6405ab3fbcea3852305e98ac43ca59f5bc","impliedFormat":1},{"version":"e6fa9ad47c5f71ff733744a029d1dc472c618de53804eae08ffc243b936f87ff","affectsGlobalScope":true,"impliedFormat":1},{"version":"a6f137d651076822d4fe884287e68fd61785a0d3d1fdb250a5059b691fa897db","impliedFormat":1},{"version":"24826ed94a78d5c64bd857570fdbd96229ad41b5cb654c08d75a9845e3ab7dde","impliedFormat":1},{"version":"8b479a130ccb62e98f11f136d3ac80f2984fdc07616516d29881f3061f2dd472","impliedFormat":1},{"version":"928af3d90454bf656a52a48679f199f64c1435247d6189d1caf4c68f2eaf921f","affectsGlobalScope":true,"impliedFormat":1},{"version":"bceb58df66ab8fb00170df20cd813978c5ab84be1d285710c4eb005d8e9d8efb","affectsGlobalScope":true,"impliedFormat":1},{"version":"3f16a7e4deafa527ed9995a772bb380eb7d3c2c0fd4ae178c5263ed18394db2c","impliedFormat":1},{"version":"933921f0bb0ec12ef45d1062a1fc0f27635318f4d294e4d99de9a5493e618ca2","impliedFormat":1},{"version":"71a0f3ad612c123b57239a7749770017ecfe6b66411488000aba83e4546fde25","impliedFormat":1},{"version":"77fbe5eecb6fac4b6242bbf6eebfc43e98ce5ccba8fa44e0ef6a95c945ff4d98","impliedFormat":1},{"version":"4f9d8ca0c417b67b69eeb54c7ca1bedd7b56034bb9bfd27c5d4f3bc4692daca7","impliedFormat":1},{"version":"0cb167c371eaa8c869f8a7656a7296f2e4fae43b4d8b803a680236b24794e5f9","impliedFormat":1},{"version":"0a839dba0287cc0481ad4beedd48a1c64acf1e212ae865d1315f7007ca215161","impliedFormat":1},{"version":"38dc4655376cd1a4bd6bb3763d92949233e33d38d3dd3cbea7bbf218175a38ef","impliedFormat":1},{"version":"37ba7b45141a45ce6e80e66f2a96c8a5ab1bcef0fc2d0f56bb58df96ec67e972","impliedFormat":1},{"version":"45650f47bfb376c8a8ed39d4bcda5902ab899a3150029684ee4c10676d9fbaee","impliedFormat":1},{"version":"d61e0a64cd175208ac0b83670151a9a6b5916f0d1ffcdc5c29c90b1cebfc5045","affectsGlobalScope":true,"impliedFormat":1},{"version":"18fd40412d102c5564136f29735e5d1c3b455b8a37f920da79561f1fde068208","impliedFormat":1},{"version":"48a679952eefe4cb776d5a0e1ccba2d3eb53b57448bbb7abc1fcebcbd5440188","impliedFormat":1},{"version":"f0be1b8078cd549d91f37c30c222c2a187ac1cf981d994fb476a1adc61387b14","affectsGlobalScope":true,"impliedFormat":1},{"version":"0aaed1d72199b01234152f7a60046bc947f1f37d78d182e9ae09c4289e06a592","impliedFormat":1},{"version":"2d14da6ecb49bf828d83948765ec2d3a579d476bbb9645e749610baa6ec880ca","impliedFormat":1},{"version":"66ba1b2c3e3a3644a1011cd530fb444a96b1b2dfe2f5e837a002d41a1a799e60","impliedFormat":1},{"version":"7e514f5b852fdbc166b539fdd1f4e9114f29911592a5eb10a94bb3a13ccac3c4","impliedFormat":1},{"version":"5b7aa3c4c1a5d81b411e8cb302b45507fea9358d3569196b27eb1a27ae3a90ef","affectsGlobalScope":true,"impliedFormat":1},{"version":"5987a903da92c7462e0b35704ce7da94d7fdc4b89a984871c0e2b87a8aae9e69","affectsGlobalScope":true,"impliedFormat":1},{"version":"ea08a0345023ade2b47fbff5a76d0d0ed8bff10bc9d22b83f40858a8e941501c","impliedFormat":1},{"version":"0aef708fb4c7a6b915e8305cbfac40cd207b032dbaabe9a01889a5fff3254681","impliedFormat":1},{"version":"ae062ce7d9510060c5d7e7952ae379224fb3f8f2dd74e88959878af2057c143b","impliedFormat":1},{"version":"ad9bdafb4e7abf14cc53ce7970486a84c87831e62891e5dfe798ddcd55e84701","affectsGlobalScope":true,"impliedFormat":1},{"version":"358765d5ea8afd285d4fd1532e78b88273f18cb3f87403a9b16fef61ac9fdcfe","impliedFormat":1},{"version":"71d3ae6a5e73ca4130762560425e00984ebaff64d5353a3333d1bb7eb86ef336","impliedFormat":1},{"version":"2beff543f6e9a9701df88daeee3cdd70a34b4a1c11cb4c734472195a5cb2af54","impliedFormat":1},{"version":"2e07abf27aa06353d46f4448c0bbac73431f6065eef7113128a5cd804d0c384d","impliedFormat":1},{"version":"be1cc4d94ea60cbe567bc29ed479d42587bf1e6cba490f123d329976b0fe4ee5","impliedFormat":1},{"version":"66be1299a7a3129ceb488b340c291cf575bebb0e337f92e169dec38231472e34","impliedFormat":1},{"version":"9894dafe342b976d251aac58e616ac6df8db91fb9d98934ff9dd103e9e82578f","impliedFormat":1},{"version":"413df52d4ea14472c2fa5bee62f7a40abd1eb49be0b9722ee01ee4e52e63beb2","impliedFormat":1},{"version":"db6d2d9daad8a6d83f281af12ce4355a20b9a3e71b82b9f57cddcca0a8964a96","impliedFormat":1},{"version":"446a50749b24d14deac6f8843e057a6355dd6437d1fac4f9e5ce4a5071f34bff","impliedFormat":1},{"version":"182e9fcbe08ac7c012e0a6e2b5798b4352470be29a64fdc114d23c2bab7d5106","impliedFormat":1},{"version":"2f4e6b4d39426a1b85ecf4bdeb9dddbf4d9b3397d95d8555d46f925c9519ec7d","impliedFormat":1},{"version":"78a2869ad0cbf3f9045dda08c0d4562b7e1b2bfe07b19e0db072f5c3c56e9584","impliedFormat":1},{"version":"89d5d28d4f57e000b836ac273079be1b75710e28ce14750d081fb420d37e2ca5","impliedFormat":1},{"version":"fd4e24ccff3966390600d7f5d6aa1fed5a512e92ada735ea5fbc933d313ad3d3","impliedFormat":1},{"version":"b7cddfe1aa6b86b5fad3c9ccb30d05b3ccb165aebbf112f48d2d8a5f69dd98b1","impliedFormat":1},{"version":"a86f82d646a739041d6702101afa82dcb935c416dd93cbca7fd754fd0282ce1f","impliedFormat":1},{"version":"ad0d1d75d129b1c80f911be438d6b61bfa8703930a8ff2be2f0e1f8a91841c64","impliedFormat":1},{"version":"bd2c7ada3dee03653d3f601011d30072194bc3970cd93208f9588fbdc0c69347","impliedFormat":1},{"version":"e480da45d32313e7174b265674da504f075f59ef326852f0c5a5d863b438ae85","impliedFormat":1},{"version":"ad54850f61fcf5d014e11be80d2f46fea9265cfa7e77456da876f7833ef81769","impliedFormat":1},{"version":"6f7c9e8bd2b5b6a080b07080065f94900bd3c7e5ebbd3047bc33fcce2fab1dd8","impliedFormat":1},{"version":"3e7efde639c6a6c3edb9847b3f61e308bf7a69685b92f665048c45132f51c218","impliedFormat":1},{"version":"df45ca1176e6ac211eae7ddf51336dc075c5314bc5c253651bae639defd5eec5","impliedFormat":1},{"version":"8a0e762ceb20c7e72504feef83d709468a70af4abccb304f32d6b9bac1129b2c","impliedFormat":1},{"version":"da5950ee2a90721df6f3fba45f5d05308f7e4c35835392215dd2cd404505e2de","impliedFormat":1},{"version":"ce75b1aebb33d510ff28af960a9221410a3eaf7f18fc5f21f9404075fba77256","impliedFormat":1},{"version":"f42d5fed19610d485c646a0c430e768115567d078c7fc855c57b0c578b3d6cd3","impliedFormat":1},{"version":"ee8df1cb8d0faaca4013a1b442e99130769ce06f438d18d510fed95890067563","impliedFormat":1},{"version":"d5630f2ad9b4541e5ce891648121022f9412ecdca1820baa1f0104f70fd7eff7","impliedFormat":1},{"version":"4d15375ab13497104bc8fe56fdef2b5fd6853f29255737d23a33fa306ff7fd69","impliedFormat":1},{"version":"2cd3fc1d0d6a1e85baffd2d4f50f5efb192b5446eef567e97c94765402f0aad4","impliedFormat":1},{"version":"e4cbf2f1e89ecccaddd2c045e600ae41b732295953fb06247c7dcbc2d281ed30","impliedFormat":1},{"version":"6dcedaef57dff0d79a05ab0ab602cde74db803d1e765468bf91263786a383e1b","impliedFormat":1},{"version":"8c1697d90c394a6fd955b98eae01238eff628e129b987a68aea10f898a48e7da","impliedFormat":1},{"version":"7580e62139cb2b44a0270c8d01abcbfcba2819a02514a527342447fa69b34ef1","impliedFormat":1},{"version":"b838d4c72740eb0afd284bf7575b74c624b105eff2e8c7b4aeead57e7ac320ff","impliedFormat":1},{"version":"f374cb24e93e7798c4d9e83ff872fa52d2cdb36306392b840a6ddf46cb925cb6","impliedFormat":1},{"version":"d10d63718e1646c2279e3b33831f82c60e31f622b2b7020f1196409ca4c09242","impliedFormat":1},{"version":"106c6025f1d99fd468fd8bf6e5bda724e11e5905a4076c5d29790b6c3745e50c","impliedFormat":1},{"version":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","impliedFormat":1},{"version":"148679c6d0f449210a96e7d2e562d589e56fcde87f843a92808b3ff103f1a774","impliedFormat":1},{"version":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","impliedFormat":1},{"version":"02436d7e9ead85e09a2f8e27d5f47d9464bced31738dec138ca735390815c9f0","impliedFormat":1},{"version":"f8d5ff8eafd37499f2b6a98659dd9b45a321de186b8db6b6142faed0fea3de77","impliedFormat":1},{"version":"c86fe861cf1b4c46a0fb7d74dffe596cf679a2e5e8b1456881313170f092e3fa","impliedFormat":1},{"version":"a22dd55aa4d39906252000ab8e8a1b83b195eef7f4274eb51e457c1f11cf6580","impliedFormat":1},{"version":"540cc83ab772a2c6bc509fe1354f314825b5dba3669efdfbe4693ecd3048e34f","impliedFormat":1},{"version":"121b0696021ab885c570bbeb331be8ad82c6efe2f3b93a6e63874901bebc13e3","impliedFormat":1},{"version":"612d9da66bb046a9c1e2e8d026245ded881fc4b9f98cbfae714415d57ee0ae0b","impliedFormat":1},{"version":"32c2ad9494dad5d11b0564a619fee18f388db6c1e9e2cd3c360b3122549691eb","impliedFormat":1},{"version":"6c301d40aec56a74ec7bd7324e31a728dadf9bfba3e96def02938d3d973534ec","impliedFormat":1},{"version":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","impliedFormat":1},{"version":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","impliedFormat":1},{"version":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881","impliedFormat":1},{"version":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881","impliedFormat":1},{"version":"aa14cee20aa0db79f8df101fc027d929aec10feb5b8a8da3b9af3895d05b7ba2","impliedFormat":1},{"version":"493c700ac3bd317177b2eb913805c87fe60d4e8af4fb39c41f04ba81fae7e170","impliedFormat":1},{"version":"aeb554d876c6b8c818da2e118d8b11e1e559adbe6bf606cc9a611c1b6c09f670","impliedFormat":1},{"version":"acf5a2ac47b59ca07afa9abbd2b31d001bf7448b041927befae2ea5b1951d9f9","impliedFormat":1},{"version":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881","impliedFormat":1},{"version":"d71291eff1e19d8762a908ba947e891af44749f3a2cbc5bd2ec4b72f72ea795f","impliedFormat":1},{"version":"c0480e03db4b816dff2682b347c95f2177699525c54e7e6f6aa8ded890b76be7","impliedFormat":1},{"version":"25a5f6fd3a2243c859eddc99ab5fba11d970af2fe7a5df9c32b7668f76f97b01","impliedFormat":1},{"version":"8d207e1f9d2c30d6f77dfa693f3827c3fbf0d89240297e10bdfe1041d433df68","impliedFormat":1},{"version":"b620391fe8060cf9bedc176a4d01366e6574d7a71e0ac0ab344a4e76576fcbb8","impliedFormat":1},{"version":"6ac6715916fa75a1f7ebdfeacac09513b4d904b667d827b7535e84ff59679aff","impliedFormat":1},{"version":"2652448ac55a2010a1f71dd141f828b682298d39728f9871e1cdf8696ef443fd","impliedFormat":1},{"version":"d682336018141807fb602709e2d95a192828fcb8d5ba06dda3833a8ea98f69e3","impliedFormat":1},{"version":"6124e973eab8c52cabf3c07575204efc1784aca6b0a30c79eb85fe240a857efa","impliedFormat":1},{"version":"0d891735a21edc75df51f3eb995e18149e119d1ce22fd40db2b260c5960b914e","impliedFormat":1},{"version":"3b414b99a73171e1c4b7b7714e26b87d6c5cb03d200352da5342ab4088a54c85","impliedFormat":1},{"version":"4fbd3116e00ed3a6410499924b6403cc9367fdca303e34838129b328058ede40","impliedFormat":1},{"version":"9c82171d836c47486074e4ca8e059735bf97b205e70b196535b5efd40cbe1bc5","impliedFormat":1},{"version":"48dcc919f76c040a999c0d46d2bf25ab089645ca21b837f120b222f56a86cd76","impliedFormat":1},{"version":"2f9c89cbb29d362290531b48880a4024f258c6033aaeb7e59fbc62db26819650","impliedFormat":1},{"version":"a365c4d3bed3be4e4e20793c999c51f5cd7e6792322f14650949d827fbcd170f","impliedFormat":1},{"version":"c5426dbfc1cf90532f66965a7aa8c1136a78d4d0f96d8180ecbfc11d7722f1a5","impliedFormat":1},{"version":"65a15fc47900787c0bd18b603afb98d33ede930bed1798fc984d5ebb78b26cf9","impliedFormat":1},{"version":"9d202701f6e0744adb6314d03d2eb8fc994798fc83d91b691b75b07626a69801","impliedFormat":1},{"version":"de9d2df7663e64e3a91bf495f315a7577e23ba088f2949d5ce9ec96f44fba37d","impliedFormat":1},{"version":"c7af78a2ea7cb1cd009cfb5bdb48cd0b03dad3b54f6da7aab615c2e9e9d570c5","impliedFormat":1},{"version":"1ee45496b5f8bdee6f7abc233355898e5bf9bd51255db65f5ff7ede617ca0027","impliedFormat":1},{"version":"273782b8454e78f6a8b30d2cfbf6860499c930595095fcc1689637115f0eddda","affectsGlobalScope":true,"impliedFormat":1},{"version":"3fbdd025f9d4d820414417eeb4107ffa0078d454a033b506e22d3a23bc3d9c41","affectsGlobalScope":true,"impliedFormat":1},{"version":"dba114fb6a32b355a9cfc26ca2276834d72fe0e94cd2c3494005547025015369","impliedFormat":1},{"version":"a8f8e6ab2fa07b45251f403548b78eaf2022f3c2254df3dc186cb2671fe4996d","affectsGlobalScope":true,"impliedFormat":1},{"version":"fa6c12a7c0f6b84d512f200690bfc74819e99efae69e4c95c4cd30f6884c526e","impliedFormat":1},{"version":"f1c32f9ce9c497da4dc215c3bc84b722ea02497d35f9134db3bb40a8d918b92b","impliedFormat":1},{"version":"b73c319af2cc3ef8f6421308a250f328836531ea3761823b4cabbd133047aefa","affectsGlobalScope":true,"impliedFormat":1},{"version":"e433b0337b8106909e7953015e8fa3f2d30797cea27141d1c5b135365bb975a6","impliedFormat":1},{"version":"9f9bb6755a8ce32d656ffa4763a8144aa4f274d6b69b59d7c32811031467216e","impliedFormat":1},{"version":"5c32bdfbd2d65e8fffbb9fbda04d7165e9181b08dad61154961852366deb7540","impliedFormat":1},{"version":"ddff7fc6edbdc5163a09e22bf8df7bef75f75369ebd7ecea95ba55c4386e2441","impliedFormat":1},{"version":"0c05e9842ec4f8b7bfebfd3ca61604bb8c914ba8da9b5337c4f25da427a005f2","impliedFormat":1},{"version":"faed7a5153215dbd6ebe76dfdcc0af0cfe760f7362bed43284be544308b114cf","impliedFormat":1},{"version":"7029e566b8df176f703fb59fd437a38670c7a0e02c58b2d66dfb5b2e2b2defdb","impliedFormat":1},{"version":"7f2aa4d4989a82530aaac3f72b3dceca90e9c25bee0b1a327e8a08a1262435ad","impliedFormat":1},{"version":"d96b39301d0ded3f1a27b47759676a33a02f6f5049bfcbde81e533fd10f50dcb","impliedFormat":1},{"version":"e9f147ecca73d9346a4c073432843c159ccbe50bdcb678a78f6da10eae2cecf4","impliedFormat":1},{"version":"de061f7d72bd65c06fc1419f841dfdcb29a8e22fe6fa527d1e6eb20b897d4de0","impliedFormat":1},{"version":"663beafc2446079574570cba86e9b15f986f908ddb1b01274509970126fee945","impliedFormat":1},{"version":"a3102887d5058bf4cb5b37fa6964c09e9527c42053b3b5c642b89878620748de","impliedFormat":1},{"version":"0aaaa1727edd29673d85c9b26d7ca4d54e5407a48586903c51b48b7f7d196f61","impliedFormat":1},{"version":"d35bca0b261bff02635758c48e8ab99c61c420d0dfabbcf467e847171d876b7d","impliedFormat":1},{"version":"3bc12c40d90c342ff88a3d876996c555ed5cbee5fe8c3308a240b321f401ee46","impliedFormat":1},{"version":"ba130768aae855a5477e9e148e5c879548e6e7ccbcc56fd1934c8a18ea5b7569","impliedFormat":1},{"version":"2e4f37ffe8862b14d8e24ae8763daaa8340c0df0b859d9a9733def0eee7562d9","impliedFormat":1},{"version":"d38530db0601215d6d767f280e3a3c54b2a83b709e8d9001acb6f61c67e965fc","impliedFormat":1},{"version":"6ac6715916fa75a1f7ebdfeacac09513b4d904b667d827b7535e84ff59679aff","impliedFormat":1},{"version":"b499af2054a037a162b3b72cd886f48bbf32a3502c865c6e29fac7d2ab3ce0b5","impliedFormat":1},{"version":"b83cb14474fa60c5f3ec660146b97d122f0735627f80d82dd03e8caa39b4388c","impliedFormat":1},{"version":"48773ca557b0319c2ee62ae249cf52a81709e8be139920d6479a66274de7c4ed","impliedFormat":1},{"version":"7274fbffbd7c9589d8d0ffba68157237afd5cecff1e99881ea3399127e60572f","impliedFormat":1},{"version":"b73cbf0a72c8800cf8f96a9acfe94f3ad32ca71342a8908b8ae484d61113f647","impliedFormat":1},{"version":"bae6dd176832f6423966647382c0d7ba9e63f8c167522f09a982f086cd4e8b23","impliedFormat":1},{"version":"20865ac316b8893c1a0cc383ccfc1801443fbcc2a7255be166cf90d03fac88c9","impliedFormat":1},{"version":"c9958eb32126a3843deedda8c22fb97024aa5d6dd588b90af2d7f2bfac540f23","impliedFormat":1},{"version":"461d0ad8ae5f2ff981778af912ba71b37a8426a33301daa00f21c6ccb27f8156","impliedFormat":1},{"version":"e927c2c13c4eaf0a7f17e6022eee8519eb29ef42c4c13a31e81a611ab8c95577","impliedFormat":1},{"version":"fcafff163ca5e66d3b87126e756e1b6dfa8c526aa9cd2a2b0a9da837d81bbd72","impliedFormat":1},{"version":"70246ad95ad8a22bdfe806cb5d383a26c0c6e58e7207ab9c431f1cb175aca657","impliedFormat":1},{"version":"f00f3aa5d64ff46e600648b55a79dcd1333458f7a10da2ed594d9f0a44b76d0b","impliedFormat":1},{"version":"772d8d5eb158b6c92412c03228bd9902ccb1457d7a705b8129814a5d1a6308fc","impliedFormat":1},{"version":"802e797bcab5663b2c9f63f51bdf67eff7c41bc64c0fd65e6da3e7941359e2f7","impliedFormat":1},{"version":"b01bd582a6e41457bc56e6f0f9de4cb17f33f5f3843a7cf8210ac9c18472fb0f","impliedFormat":1},{"version":"8b4327413e5af38cd8cb97c59f48c3c866015d5d642f28518e3a891c469f240e","impliedFormat":1},{"version":"4cceef18d7f088e797a463e90b7a9dad10c6bc667724b7686e3e740ae00122be","impliedFormat":1},{"version":"7ee86fbb3754388e004de0ef9e6505485ddfb3be7640783d6d015711c03d302d","impliedFormat":1},{"version":"cc1954b539604b1e562319119ac7e888172208b32ca873f9a357a92c826bd046","impliedFormat":1},{"version":"a67b87d0281c97dfc1197ef28dfe397fc2c865ccd41f7e32b53f647184cc7307","impliedFormat":1},{"version":"771ffb773f1ddd562492a6b9aaca648192ac3f056f0e1d997678ff97dbb6bf9b","impliedFormat":1},{"version":"43e96a3d5d1411ab40ba2f61d6a3192e58177bcf3b133a80ad2a16591611726d","impliedFormat":1},{"version":"232f70c0cf2b432f3a6e56a8dc3417103eb162292a9fd376d51a3a9ea5fbbf6f","impliedFormat":1},{"version":"bb8f2dbc03533abca2066ce4655c119bff353dd4514375beb93c08590c03e023","impliedFormat":1},{"version":"706dd95827e7ebaabda91d5db2b755233e0952d98570e9c032b0f066a15c1177","affectsGlobalScope":true,"impliedFormat":1},{"version":"0b103e9abfe82d14c0ad06a55d9f91d6747154ef7cacc73cf27ecad2bfb3afcf","impliedFormat":1},{"version":"cd9304972e6d616197fb44fce00540a904f38b54306a1951b5dbeaf3c01ab5bd","impliedFormat":1},{"version":"77438e2c397a3db78407621cfc57241a305b310ddea2c185f1d555248297f587","impliedFormat":1},{"version":"120599fd965257b1f4d0ff794bc696162832d9d8467224f4665f713a3119078b","impliedFormat":1},{"version":"43ba4f2fa8c698f5c304d21a3ef596741e8e85a810b7c1f9b692653791d8d97a","impliedFormat":1},{"version":"5433f33b0a20300cca35d2f229a7fc20b0e8477c44be2affeb21cb464af60c76","impliedFormat":1},{"version":"db036c56f79186da50af66511d37d9fe77fa6793381927292d17f81f787bb195","impliedFormat":1},{"version":"a6805fcafed712aea7759f8bc731014f9d22738c1d6ef9d43b8091d1d48346d5","impliedFormat":1},{"version":"c49469a5349b3cc1965710b5b0f98ed6c028686aa8450bcb3796728873eb923e","impliedFormat":1},{"version":"4a889f2c763edb4d55cb624257272ac10d04a1cad2ed2948b10ed4a7fda2a428","impliedFormat":1},{"version":"7bb79aa2fead87d9d56294ef71e056487e848d7b550c9a367523ee5416c44cfa","impliedFormat":1},{"version":"d88ea80a6447d7391f52352ec97e56b52ebec934a4a4af6e2464cfd8b39c3ba8","impliedFormat":1},{"version":"142617b3cdf902b69c6464c9fbd942b60ab3e733ca18c032b19e0f7e2adbefe8","impliedFormat":1},{"version":"0b603555f1881f87256ffd6344d3e3ed6d466c2e701eabf381f28be8c2125892","impliedFormat":1},{"version":"897e4f7662488e3ecc79e743bdd3b78f13bdb69a97851afa5b440c4211e32ea9","impliedFormat":1},{"version":"e2e1c6d3b2d93add5200bd7bc1a8cccb4e446836b2111ece45db8683a2c765de","impliedFormat":1},{"version":"251b03d5cd243854ce870d9a9a39f491faf69898c5d6b5eee28cc7649c57417b","impliedFormat":1},{"version":"27ff4196654e6373c9af16b6165120e2dd2169f9ad6abb5c935af5abd8c7938c","impliedFormat":1},{"version":"2c4de79f406d137390608e8c0a44fba2ff8e00bacfcae7c9d1781fef10e9440d","impliedFormat":1},{"version":"07ba23a10465791be5d22deaf5ef7de7658774ddff53721e5ea17fedea1bc721","impliedFormat":1},{"version":"dca8c645c5afeb03b1ecedbf16323f33e7d0afaa6256c8e047e6e38087a97f53","impliedFormat":1},{"version":"775f181bd4a533d6f8b5e55ec1d9f1624559720ae8a70e9432258da26b38d27c","impliedFormat":1},{"version":"796273b2edc72e78a04e86d7c58ae94d370ab93a0ddf40b1aa85a37a1c29ecd7","impliedFormat":1},{"version":"5df15a69187d737d6d8d066e189ae4f97e41f4d53712a46b2710ff9f8563ec9f","impliedFormat":1},{"version":"7715134a0cf07dd41a9da2895d708625a3a303a0385e355ecaaf0b8bfaef2550","impliedFormat":1},{"version":"6ac6715916fa75a1f7ebdfeacac09513b4d904b667d827b7535e84ff59679aff","impliedFormat":1},{"version":"622694a8522b46f6310c2a9b5d2530dde1e2854cb5829354e6d1ff8f371cf469","impliedFormat":1},{"version":"cd8ce8d68567f62dd580b3c3c37777ac3f5b81944c7417f5ea83030eab533385","impliedFormat":1},{"version":"e5c939d896565dcac0f6fbdbada11284e7728ef26a069561c09aa5aa4a788393","impliedFormat":1},{"version":"9e2739b32f741859263fdba0244c194ca8e96da49b430377930b8f721d77c000","impliedFormat":1},{"version":"a9e6c0ff3f8186fccd05752cf75fc94e147c02645087ac6de5cc16403323d870","impliedFormat":1},{"version":"49af4b52f0d4d2304c5f2c6fe5fab3e153e0acc38830d0202821b877c097dd02","impliedFormat":1},{"version":"49c346823ba6d4b12278c12c977fb3a31c06b9ca719015978cb145eb86da1c61","impliedFormat":1},{"version":"bfac6e50eaa7e73bb66b7e052c38fdc8ccfc8dbde2777648642af33cf349f7f1","impliedFormat":1},{"version":"92f7c1a4da7fbfd67a2228d1687d5c2e1faa0ba865a94d3550a3941d7527a45d","impliedFormat":1},{"version":"f53b120213a9289d9a26f5af90c4c686dd71d91487a0aa5451a38366c70dc64b","impliedFormat":1},{"version":"e68b8e5a1df7c1be2bc105141456ecba70215806e1c28bfbc5c12bfce4be6e68","impliedFormat":1},{"version":"511c8f02329808d47d00b859c532ae9115590048b17325a946c74dac48428650","impliedFormat":1},{"version":"57d67b72e06059adc5e9454de26bbfe567d412b962a501d263c75c2db430f40e","impliedFormat":1},{"version":"b5f9e66625783eefcbe3d2da074b2e7ba2066d61ce3fc6ef4f22805ad946cab4","impliedFormat":1},{"version":"e37115962d284b9f7a37c2bdd2add50f88365dde41f5e0ff591ffc48a8ec7575","impliedFormat":1},{"version":"6459054aabb306821a043e02b89d54da508e3a6966601a41e71c166e4ea1474f","impliedFormat":1},{"version":"bb37588926aba35c9283fe8d46ebf4e79ffe976343105f5c6d45f282793352b2","impliedFormat":1},{"version":"f89488602bec98a142072fae7ea5ba99431a569ff580c64b7be39896474799d8","impliedFormat":1},{"version":"bbbc47961f39a57df103cf4ca3bb8f8732b4b6678a18225a0aa76d59c466956c","impliedFormat":1},{"version":"2e6114a7dd6feeef85b2c80120fdbfb59a5529c0dcc5bfa8447b6996c97a69f5","impliedFormat":1},{"version":"2ffb043dc5163458e473b7010859f86e01dc4edffcae0a93d885d028b426a546","impliedFormat":1},{"version":"c8f004e6036aa1c764ad4ec543cf89a5c1893a9535c80ef3f2b653e370de45e6","impliedFormat":1},{"version":"dd80b1e600d00f5c6a6ba23f455b84a7db121219e68f89f10552c54ba46e4dc9","impliedFormat":1},{"version":"b064c36f35de7387d71c599bfcf28875849a1dbc733e82bd26cae3d1cd060521","impliedFormat":1},{"version":"05c7280d72f3ed26f346cbe7cbbbb002fb7f15739197cbbee6ab3fd1a6cb9347","impliedFormat":1},{"version":"8de9fe97fa9e00ec00666fa77ab6e91b35d25af8ca75dabcb01e14ad3299b150","impliedFormat":1},{"version":"04b7b2e0832dfd3c31e81df3975e8d8fda28e7ff999b0aa2932608a8f6661d5c","impliedFormat":1},{"version":"ca2d34c6ed5cbd3070b8b6f32f42ae54adcc6499c1e4b99f0a5798b3f27cc653","impliedFormat":1},{"version":"9ec68995e66dd6b9dac834bf5ae85fde802714ea2e82151a5d1d53ef01b463ef","impliedFormat":1},{"version":"5c4d626b4902f2ef8a1cc146d761d276cef988016dc674e3b98fbad70e64bc9f","impliedFormat":1},{"version":"fdfaa0aad899524962e2955287b5b991ffe3be50f64e02eb60c933ca44644a94","impliedFormat":1},{"version":"53c972a0f9bc3a4ec70fff7314123ea8cfcf75b3703046f767d2dc1eea87b2fb","impliedFormat":1},{"version":"f974e4a06953682a2c15d5bd5114c0284d5abf8bc0fe4da25cb9159427b70072","impliedFormat":1},{"version":"50256e9c31318487f3752b7ac12ff365c8949953e04568009c8705db802776fb","impliedFormat":1},{"version":"7d73b24e7bf31dfb8a931ca6c4245f6bb0814dfae17e4b60c9e194a631fe5f7b","impliedFormat":1},{"version":"d130c5f73768de51402351d5dc7d1b36eaec980ca697846e53156e4ea9911476","impliedFormat":1},{"version":"413586add0cfe7369b64979d4ec2ed56c3f771c0667fbde1bf1f10063ede0b08","impliedFormat":1},{"version":"06472528e998d152375ad3bd8ebcb69ff4694fd8d2effaf60a9d9f25a37a097a","impliedFormat":1},{"version":"7303b45138d2511035056a5901a1490ebdcbf055cbb1276f8629c5121cbe733e","impliedFormat":1},{"version":"27f874cd5327507eeff699a74567f60c1215b94509f4308633a7b01922471ed2","impliedFormat":1},{"version":"a401617604fa1f6ce437b81689563dfdc377069e4c58465dbd8d16069aede0a5","impliedFormat":1},{"version":"2c6cf04bc525caf6546e859e8ef10bfb9573837ec0bc5ec7b53a7b1b8ca72781","impliedFormat":1},{"version":"8695dec09ad439b0ceef3776ea68a232e381135b516878f0901ed2ea114fd0fe","impliedFormat":1},{"version":"304b44b1e97dd4c94697c3313df89a578dca4930a104454c99863f1784a54357","impliedFormat":1},{"version":"0a437ae178f999b46b6153d79095b60c42c996bc0458c04955f1c996dc68b971","impliedFormat":1},{"version":"74b2a5e5197bd0f2e0077a1ea7c07455bbea67b87b0869d9786d55104006784f","impliedFormat":1},{"version":"4a7baeb6325920044f66c0f8e5e6f1f52e06e6d87588d837bdf44feb6f35c664","impliedFormat":1},{"version":"87cc05fe13108f02e12da7e3efd8e360fef78d96a0c9e11408ea1b1b9fb3e03d","impliedFormat":1},{"version":"1abbf67c218d23c2ce76887caac2df6c7dab3d97ba2b65348432b876f510002a","impliedFormat":1},{"version":"1a82deef4c1d39f6882f28d275cad4c01f907b9b39be9cbc472fcf2cf051e05b","impliedFormat":1},{"version":"4b20fcf10a5413680e39f5666464859fc56b1003e7dfe2405ced82371ebd49b6","impliedFormat":1},{"version":"c06ef3b2569b1c1ad99fcd7fe5fba8d466e2619da5375dfa940a94e0feea899b","impliedFormat":1},{"version":"f7d628893c9fa52ba3ab01bcb5e79191636c4331ee5667ecc6373cbccff8ae12","impliedFormat":1},{"version":"1d879125d1ec570bf04bc1f362fdbe0cb538315c7ac4bcfcdf0c1e9670846aa6","impliedFormat":1},{"version":"5a16e93d5d53d987dddda1ec606c9821f6bd31d1bdf0635e05e3841312cefa8b","impliedFormat":1},{"version":"a6dba407fc287f1e25454e75028c91bbc00675f2d1c4e8b3edcc36c08611a486","impliedFormat":1},{"version":"d663134457d8d669ae0df34eabd57028bddc04fc444c4bc04bc5215afc91e1f4","impliedFormat":1},{"version":"e91f7b1344577a02f051b9b471f33044fef8334a76dc9e1de003d17595a5219b","impliedFormat":1},{"version":"c0723195c85e19656d6b5b9fdb81d3f3403c1ae4679e722c6ea058c516b38d12","impliedFormat":1},{"version":"b55eb9f72166093b5460d34b34f5d8699c968de3bc3fc696e40f2c93f2ebf650","impliedFormat":1},{"version":"71d9eb4c4e99456b78ae182fb20a5dfc20eb1667f091dbb9335b3c017dd1c783","impliedFormat":1},{"version":"cfa846a7b7847a1d973605fbb8c91f47f3a0f0643c18ac05c47077ebc72e71c7","impliedFormat":1},{"version":"1594da19968752a22b2ac48c2d0e60575700e745c577a8a4a676b841238ad5bb","impliedFormat":1},{"version":"e0cee12109e0a10a4c3d6769fcc7644b7c1ea7f52365bea51728f5af29f8a137","impliedFormat":1},{"version":"7d4254b4c6c67a29d5e7f65e67d72540480ac2cfb041ca484847f5ae70480b62","impliedFormat":1},{"version":"3536968defef8a75514f547ead5e2e9c1e984820290ec9b00c5fdfb6ef786535","impliedFormat":1},{"version":"d83773870080c30a230e322ce13a9c6f3398e8dacea4ea8a83e26370f3bac23e","impliedFormat":1},{"version":"dcfeaf98d66314fec29a9076c4290e45d0b196a65827becc19138e9c7b855f37","impliedFormat":1},{"version":"6849fe9210fe4946d5f085bfed36758f33dc6ae15a751338d178dd4daa017c46","impliedFormat":1},{"version":"888cda0fa66d7f74e985a3f7b1af1f64b8ff03eb3d5e80d051c3cbdeb7f32ab7","impliedFormat":1},{"version":"60681e13f3545be5e9477acb752b741eae6eaf4cc01658a25ec05bff8b82a2ef","impliedFormat":1},{"version":"ffae4e1e06aa848a1e4bcef162cd1c48e5909b26223515981310af9c036bdfc7","impliedFormat":1},{"version":"a57b1802794433adec9ff3fed12aa79d671faed86c49b09e02e1ac41b4f1d33a","impliedFormat":1},{"version":"34e16eb7c31768a11a08aebcfb3d70d7b8f0b016197e98d8419e566ceae6d6c8","impliedFormat":1},{"version":"f94ec1f7e4b709d26960306c9082a7a1b728a6e13089346aa48ba57c74cbf47e","impliedFormat":1},{"version":"9a11cb4033405e96c247cd5aa29790212aaffdd127869e8a5219103f0b389fd5","impliedFormat":1},{"version":"01479d9d5a5dda16d529b91811375187f61a06e74be294a35ecce77e0b9e8d6c","impliedFormat":1},{"version":"aff5213585cb72e94054dfe17250ff315f3569b3919d1ef1ad235f37c4ee894e","impliedFormat":1},{"version":"fb2ea35e1be6388d722d7725e2b49c697d34d9c890c3b96758faaeb86d35cef8","impliedFormat":1},{"version":"ce0df82a9ae6f914ba08409d4d883983cc08e6d59eb2df02d8e4d68309e7848b","impliedFormat":1},{"version":"1a4dc28334a926d90ba6a2d811ba0ff6c22775fcc13679521f034c124269fd40","impliedFormat":1},{"version":"f05315ff85714f0b87cc0b54bcd3dde2716e5a6b99aedcc19cad02bf2403e08c","impliedFormat":1},{"version":"5fad3b31fc17a5bc58095118a8b160f5260964787c52e7eb51e3d4fcf5d4a6f0","impliedFormat":1},{"version":"72105519d0390262cf0abe84cf41c926ade0ff475d35eb21307b2f94de985778","impliedFormat":1},{"version":"456006a6975b26c0a1785feddae165f6d307e2d601ffde27e21fc4a790e448a4","impliedFormat":1},{"version":"c857e0aae3f5f444abd791ec81206020fbcc1223e187316677e026d1c1d6fe08","impliedFormat":1},{"version":"ccf6dd45b708fb74ba9ed0f2478d4eb9195c9dfef0ff83a6092fa3cf2ff53b4f","impliedFormat":1},{"version":"1fe0d18b111e1145a7e7601855bccd4ca20f24e3b9a5aba6bb1fa9d1a7059170","impliedFormat":1},{"version":"5632c3c26d420c063eebe64c45b1248b9492a67bf44f1d0c57e9dc8f6cf449bb","impliedFormat":1},{"version":"0df5aa619ab12993a39ea6dae062ee46eadbb4d738916460e636ada52bced75b","impliedFormat":1},{"version":"8fca3039857709484e5893c05c1f9126ab7451fa6c29e19bb8c2411a2e937345","impliedFormat":1},{"version":"35069c2c417bd7443ae7c7cafd1de02f665bf015479fec998985ffbbf500628c","impliedFormat":1},{"version":"10ab7be91f87ebe8916b62cf28af2e45b5601fc7b0e311adf838f912c6b31dd8","impliedFormat":1},{"version":"bc636fbc08e0979ceb7eb0731a33000283d77a33b62e1f71ee65be50394e40ba","impliedFormat":1},{"version":"7e0b7f91c5ab6e33f511efc640d36e6f933510b11be24f98836a20a2dc914c2d","impliedFormat":1},{"version":"045b752f44bf9bbdcaffd882424ab0e15cb8d11fa94e1448942e338c8ef19fba","impliedFormat":1},{"version":"2894c56cad581928bb37607810af011764a2f511f575d28c9f4af0f2ef02d1ab","impliedFormat":1},{"version":"0a72186f94215d020cb386f7dca81d7495ab6c17066eb07d0f44a5bf33c1b21a","impliedFormat":1},{"version":"75bbd3be047d539988a0ff0b56384ef7a6a25f3b676ad96bee547d44c31622a7","impliedFormat":1},{"version":"42960001a776b089ade681ab5cfddc936e0afb0615133ec1841f3dee89d3e1bf","impliedFormat":1},{"version":"0aedb02516baf3e66b2c1db9fef50666d6ed257edac0f866ea32f1aa05aa474f","impliedFormat":1},{"version":"da47712b394d944328245482603bc6f416d3949b67c9392279caab595076b510","affectsGlobalScope":true,"impliedFormat":1},{"version":"37d0071d8f0a06dc55c2c5e0ec3391affd4fd107c53410bf358196ec0bf3923f","impliedFormat":1},{"version":"b213dad76ca37fd552274c9499056e1c0d9c1bd38a55bb7f68b22ba6b84c3ad7","impliedFormat":1},{"version":"c30436b130b6218b7714314dc41d3f459590db4bdf099eecd51cb1bda32109a8","impliedFormat":1},{"version":"20fa37b636fdcc1746ea0738f733d0aed17890d1cd7cb1b2f37010222c23f13e","impliedFormat":1},{"version":"d90b9f1520366d713a73bd30c5a9eb0040d0fb6076aff370796bc776fd705943","impliedFormat":1},{"version":"bc03c3c352f689e38c0ddd50c39b1e65d59273991bfc8858a9e3c0ebb79c023b","impliedFormat":1},{"version":"19df3488557c2fc9b4d8f0bac0fd20fb59aa19dec67c81f93813951a81a867f8","affectsGlobalScope":true,"impliedFormat":1},{"version":"b25350193e103ae90423c5418ddb0ad1168dc9c393c9295ef34980b990030617","affectsGlobalScope":true,"impliedFormat":1},{"version":"bef86adb77316505c6b471da1d9b8c9e428867c2566270e8894d4d773a1c4dc2","impliedFormat":1},{"version":"5a49adaef698b7ad7e6127949fa1b0bbd3d46b7cbd11c54e392a4dcdd51f5190","impliedFormat":1},{"version":"6ee598cdfdd0fa52039dca135b3dfff7b49035dc13292143e0a93843e3861967","impliedFormat":1},{"version":"27be6622e2922a1b412eb057faa854831b95db9db5035c3f6d4b677b902ab3b7","impliedFormat":1},{"version":"5c634644d45a1b6bc7b05e71e05e52ec04f3d73d9ac85d5927f647a5f965181a","impliedFormat":1},{"version":"2489bf04d77dc025ba67f49f1a56eb24b9db477d5ff88123d887e163ed1776aa","impliedFormat":1},{"version":"63a7595a5015e65262557f883463f934904959da563b4f788306f699411e9bac","impliedFormat":1},{"version":"4ba137d6553965703b6b55fd2000b4e07ba365f8caeb0359162ad7247f9707a6","impliedFormat":1},{"version":"0b77b819b5417775fccb20c678293cf614c054a5b1a65421a5b933a9124ba998","impliedFormat":1},{"version":"eb5acb58487367e502d994b57e2c58255d8241f481ea8efa8e79af23af3f41c2","impliedFormat":1},{"version":"9252d498a77517aab5d8d4b5eb9d71e4b225bbc7123df9713e08181de63180f6","impliedFormat":1},{"version":"b1f1d57fde8247599731b24a733395c880a6561ec0c882efaaf20d7df968c5af","impliedFormat":1},{"version":"f282cb0bc62e0cc771d4c2e7ece6359a5f4a3dff664584e97476fd37154816bb","impliedFormat":1},{"version":"35e6379c3f7cb27b111ad4c1aa69538fd8e788ab737b8ff7596a1b40e96f4f90","impliedFormat":1},{"version":"1fffe726740f9787f15b532e1dc870af3cd964dbe29e191e76121aa3dd8693f2","impliedFormat":1},{"version":"5a3ea721d03a361ccbdd7390ccd75f6e84cbca3a3f01f4b331ecc9af31890c49","impliedFormat":1},{"version":"e7dfaee4af38d45b1cab8a1ee0b3bc1f85ddcf64545ed391d675d78ae6526274","affectsGlobalScope":true,"impliedFormat":1},{"version":"e8daa443eaf9a27fd382cc1f8ebe30330c0f4d89511cfb469166874806751d35","impliedFormat":1},{"version":"af48e58339188d5737b608d41411a9c054685413d8ae88b8c1d0d9bfabdf6e7e","impliedFormat":1},{"version":"616775f16134fa9d01fc677ad3f76e68c051a056c22ab552c64cc281a9686790","impliedFormat":1},{"version":"65c24a8baa2cca1de069a0ba9fba82a173690f52d7e2d0f1f7542d59d5eb4db0","impliedFormat":1},{"version":"f9fe6af238339a0e5f7563acee3178f51db37f32a2e7c09f85273098cee7ec49","impliedFormat":1},{"version":"1de8c302fd35220d8f29dea378a4ae45199dc8ff83ca9923aca1400f2b28848a","impliedFormat":1},{"version":"77e71242e71ebf8528c5802993697878f0533db8f2299b4d36aa015bae08a79c","impliedFormat":1},{"version":"98a787be42bd92f8c2a37d7df5f13e5992da0d967fab794adbb7ee18370f9849","impliedFormat":1},{"version":"332248ee37cca52903572e66c11bef755ccc6e235835e63d3c3e60ddda3e9b93","impliedFormat":1},{"version":"94e8cc88ae2ef3d920bb3bdc369f48436db123aa2dc07f683309ad8c9968a1e1","impliedFormat":1},{"version":"4545c1a1ceca170d5d83452dd7c4994644c35cf676a671412601689d9a62da35","impliedFormat":1},{"version":"320f4091e33548b554d2214ce5fc31c96631b513dffa806e2e3a60766c8c49d9","impliedFormat":1},{"version":"a2d648d333cf67b9aeac5d81a1a379d563a8ffa91ddd61c6179f68de724260ff","impliedFormat":1},{"version":"d90d5f524de38889d1e1dbc2aeef00060d779f8688c02766ddb9ca195e4a713d","impliedFormat":1},{"version":"07ed3ddab975995eea41b22f3010506fb9f5fb301d04820b07d7a1aee5477d7c","impliedFormat":1},{"version":"969d8b0965849f4bae7cab0ba90bd1e1220e95999c2c6f01117fa7500901c017","impliedFormat":1},{"version":"6ec840ee5e2bc103f557fe38b1d585ee250540468713d7634ee066de372bf332","impliedFormat":1},{"version":"b0309e1eda99a9e76f87c18992d9c3689b0938266242835dd4611f2b69efe456","impliedFormat":1},{"version":"47699512e6d8bebf7be488182427189f999affe3addc1c87c882d36b7f2d0b0e","impliedFormat":1},{"version":"6ceb10ca57943be87ff9debe978f4ab73593c0c85ee802c051a93fc96aaf7a20","impliedFormat":1},{"version":"1de3ffe0cc28a9fe2ac761ece075826836b5a02f340b412510a59ba1d41a505a","impliedFormat":1},{"version":"e46d6cc08d243d8d0d83986f609d830991f00450fb234f5b2f861648c42dc0d8","impliedFormat":1},{"version":"1c0a98de1323051010ce5b958ad47bc1c007f7921973123c999300e2b7b0ecc0","impliedFormat":1},{"version":"ff863d17c6c659440f7c5c536e4db7762d8c2565547b2608f36b798a743606ca","impliedFormat":1},{"version":"5412ad0043cd60d1f1406fc12cb4fb987e9a734decbdd4db6f6acf71791e36fe","impliedFormat":1},{"version":"ad036a85efcd9e5b4f7dd5c1a7362c8478f9a3b6c3554654ca24a29aa850a9c5","impliedFormat":1},{"version":"fedebeae32c5cdd1a85b4e0504a01996e4a8adf3dfa72876920d3dd6e42978e7","impliedFormat":1},{"version":"e297c0a524edee7677939122f90027bfbe5f2698939d9a85728e5044b39c7124","impliedFormat":1},{"version":"cdf21eee8007e339b1b9945abf4a7b44930b1d695cc528459e68a3adc39a622e","impliedFormat":1},{"version":"bc9ee0192f056b3d5527bcd78dc3f9e527a9ba2bdc0a2c296fbc9027147df4b2","impliedFormat":1},{"version":"b62381cae176db34f003cc6172ee8f3e0122014889d66391aa73698105cf4934","impliedFormat":1},{"version":"1d9c0a9a6df4e8f29dc84c25c5aa0bb1da5456ebede7a03e03df08bb8b27bae6","impliedFormat":1},{"version":"84380af21da938a567c65ef95aefb5354f676368ee1a1cbb4cae81604a4c7d17","impliedFormat":1},{"version":"1af3e1f2a5d1332e136f8b0b95c0e6c0a02aaabd5092b36b64f3042a03debf28","impliedFormat":1},{"version":"30d8da250766efa99490fc02801047c2c6d72dd0da1bba6581c7e80d1d8842a4","impliedFormat":1},{"version":"03566202f5553bd2d9de22dfab0c61aa163cabb64f0223c08431fb3fc8f70280","impliedFormat":1},{"version":"41eb514d9ce0a6e87957f08a4b7af70d93f87637f37dee706e2d92a6601c25a9","impliedFormat":1},{"version":"e7765aa8bcb74a38b3230d212b4547686eb9796621ffb4367a104451c3f9614f","impliedFormat":1},{"version":"1de80059b8078ea5749941c9f863aa970b4735bdbb003be4925c853a8b6b4450","impliedFormat":1},{"version":"1d079c37fa53e3c21ed3fa214a27507bda9991f2a41458705b19ed8c2b61173d","impliedFormat":1},{"version":"5bf5c7a44e779790d1eb54c234b668b15e34affa95e78eada73e5757f61ed76a","impliedFormat":1},{"version":"5835a6e0d7cd2738e56b671af0e561e7c1b4fb77751383672f4b009f4e161d70","impliedFormat":1},{"version":"4b7f74b772140395e7af67c4841be1ab867c11b3b82a51b1aeb692822b76c872","impliedFormat":1},{"version":"7bd01f0f28cd3aeb2046274d85208e245965f6f2948edf4f7b2057bcf9f22ccc","impliedFormat":99},{"version":"d2f2cf2b8cc92bea913cda4a076e0f790b23a21e84f989d12f0116a7fe3906e0","impliedFormat":99},{"version":"6de125ea94866c736c6d58d68eb15272cf7d1020a5b459fea1c660027eca9a90","affectsGlobalScope":true,"impliedFormat":1},{"version":"f5b20bc288ee49989c95b20847fc93b96bf61cc0845598897a6a53a967dd7d07","affectsGlobalScope":true,"impliedFormat":1},{"version":"064ac1c2ac4b2867c2ceaa74bbdce0cb6a4c16e7c31a6497097159c18f74aa7c","impliedFormat":1},{"version":"3dc14e1ab45e497e5d5e4295271d54ff689aeae00b4277979fdd10fa563540ae","impliedFormat":1},{"version":"d3b315763d91265d6b0e7e7fa93cfdb8a80ce7cdd2d9f55ba0f37a22db00bdb8","impliedFormat":1},{"version":"b789bf89eb19c777ed1e956dbad0925ca795701552d22e68fd130a032008b9f9","impliedFormat":1},{"version":"a384610388221cd70cffb4503cee7853b8b076f2b4a55324b20a4bdbd25a3538","affectsGlobalScope":true},"7ad303e40d4fddf44f156129e397511953a71481c5cfd86b1862649aaaf240cc",{"version":"f5a1676c44601c4291320391570b3a9aafbae9a6bea721b62dd186da9a827911","signature":"435a1e418e8338be3f39614b96b81a9aa2700bc8c27bc6b98f064ff9ce17c363"},{"version":"d9d7f0858b623dba11cdf642ca99e2cb23b1ddf832989e93df2b4dacea93b936","signature":"dcf142e7b7f155862558f7a1149fe9f0dacb2b561e14c47c2964b75dd166586d"},"c91b304a3ac178ac2f76b66849e748f24e02c6590d20822f16d043a0128195b0","63665042aa6e4788fe56b0625b04125b27d8d17e05763b4179f279003eec8f28","a2d898cef1881fa251aa8459521de4a061c2936b765ec6021bfb3d335d3714af","d2a550e6c7f7b40bbe0d1edf75cf75c0d7786ce13995942be1b91cc94a2d3ebd","212641fbc18ca00ce5b86a1d38b8d2b6bdb25edb0a4b33aa0b1f432e451a7fe0","c9f1d9193a614dd7f25e516d5d6b5479df106c01d9a51b279026295d9a4fa62d","a5abfa63e6b44cb949186540bf2205d2a8980f49abece42a01394ec9560bc96e","f9227ecc2b115053686d47c3308ceac221ce597a0262f5667965cb8e78ad0278","48e6b3f0bd8522db70ffadce7163f4f32cdc94caa5f4123069476373b1bbdb07","1274bf3731eddb838f9b5342ebd837ccd26695d6019bf7e615d47c97fb642f88",{"version":"cdac9a85ae7d25e2e8167de3b07e77442b4aa65c088615a88e5bc2ca2ce139d9","signature":"a07a0fd66a61890bd69f2b8aa7afa4794023f1d9981f8eb0e4d36f06be62bbd2"},{"version":"870b69e8b455b6cbc2a1b92aa47929d9aae348d7e9275c291fed5edb67613e7d","signature":"9b30dbc15207de149eb756a6ba05fccb04408c73500a717b604b66143250a4b5"},"40a5becad931bcab37e811405ae86c94001e97709566f33d2ac9ae44f5890c61","79d9869fcccdee7ac6efe4c80d70e89a82c5a35aa4c86d16a1acefcb4d552a9f","4e663229d0f5dcc916ea9dd2d377222ce193be437173b911d60518c3fff612b4",{"version":"93afb3d171c8c5d1b3eb1a8756ccdfdd89b2d2305295cf9d48f78b27bf4bb1ad","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"e1c249ef011ea3d40bd158bd782167a090135d438b5c1eaeb6518642f3ac4968","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"fe93c474ab38ac02e30e3af073412b4f92b740152cf3a751fdaee8cbea982341","impliedFormat":1},{"version":"3255b97f3f24af29c79cc1aa88004efb13b6285ebdde0a567bf32e19bb65250d","impliedFormat":1},{"version":"1e00b8bf9e3766c958218cd6144ffe08418286f89ff44ba5a2cc830c03dd22c7","impliedFormat":1},{"version":"01d3478be006d10a3abefe929996ed5decf8d809c242bfe7f6de3741e4e761f2","signature":"01a977ade994fe0de990222140f158a0dc3b03529994c449aa39333d0facac02"},"11ed2b0b52af52f3eaff37b9d41c9565f5565dfe8b864d7fb334e21c3fc3df0a","ca4fc772f4db439a193a1f3404d38bb6de729e46486f69fab01645a9b6bf2e57","e50b6be34e50998e01623e5881c639ec09edd7d607079055e856d7188ad1e824","e4fcca12421e8066c464bbaf2525b1a881998ab147f85023bce0964d7e0d5248","078e6873248c46d496d62935b4ce7e6fc92f8deaef314b382fb6f4de5c70ca5e","c331b7056801e4bc7b46732e77173277b55e0367de6618bae2f85c7c7ce27b56","5e8be2b46e016ff19698fe2279e9187b7fc1b9548b4876a624dcf8cb01f9b457","d46f111f0daf006ae96e904cd3c8e24d4e3ca682b455001af31e8207a1b352fd","d1986184a09a52db8228cb2bb2a61a8c05c9354e5b93cec8e2628d8579c892d7",{"version":"a384610388221cd70cffb4503cee7853b8b076f2b4a55324b20a4bdbd25a3538","affectsGlobalScope":true},"8c738d7ab02122bec55d98eab2f5e875f5306ebffe56a6be96f2da0916a7ea71","d1986184a09a52db8228cb2bb2a61a8c05c9354e5b93cec8e2628d8579c892d7","ac965c40df1c4a3d53cebda90c50063ebda4522b0a054741dc3d2bd98bc852e6",{"version":"751764bb94219b4ce8f5475dc35d3de2e432fea01a0c9610cd7f69ad05e398c6","impliedFormat":1},{"version":"f3d8c757e148ad968f0d98697987db363070abada5f503da3c06aefd9d4248c1","impliedFormat":1},{"version":"96d14f21b7652903852eef49379d04dbda28c16ed36468f8c9fa08f7c14c9538","impliedFormat":1}],"root":[[535,548],[550,555],[559,572]],"options":{"allowJs":true,"esModuleInterop":true,"jsx":4,"module":99,"skipLibCheck":true,"strict":true,"target":4},"referencedMap":[[571,1],[535,2],[572,3],[568,4],[569,2],[570,5],[559,6],[567,7],[536,8],[537,9],[379,2],[573,2],[574,2],[575,2],[143,10],[144,10],[145,11],[97,12],[146,13],[147,14],[148,15],[92,2],[95,16],[93,2],[94,2],[149,17],[150,18],[151,19],[152,20],[153,21],[154,22],[155,22],[156,23],[157,24],[158,25],[159,26],[98,2],[96,2],[160,27],[161,28],[162,29],[196,30],[163,31],[164,2],[165,32],[166,33],[167,34],[168,35],[169,36],[170,37],[171,38],[172,39],[173,40],[174,40],[175,41],[176,2],[177,42],[178,43],[180,44],[179,45],[181,46],[182,47],[183,48],[184,49],[185,50],[186,51],[187,52],[188,53],[189,54],[190,55],[191,56],[192,57],[193,58],[99,2],[100,2],[101,2],[139,59],[140,2],[141,2],[142,46],[194,60],[195,61],[200,62],[464,63],[201,64],[199,65],[466,66],[465,67],[197,68],[462,2],[198,69],[83,2],[85,70],[461,63],[231,63],[84,2],[487,71],[492,72],[499,73],[482,74],[235,2],[243,75],[383,76],[386,77],[358,2],[371,78],[378,79],[260,2],[360,2],[241,2],[357,80],[403,81],[242,2],[233,82],[385,83],[387,84],[388,85],[459,86],[352,87],[305,88],[365,89],[366,90],[364,91],[363,2],[359,92],[384,93],[244,94],[429,2],[430,95],[271,96],[245,97],[272,96],[308,96],[211,96],[381,98],[380,2],[370,99],[477,2],[220,2],[498,100],[437,101],[438,102],[434,103],[516,2],[335,2],[439,104],[435,105],[521,106],[520,107],[515,2],[286,2],[338,108],[337,2],[514,109],[436,63],[291,110],[298,111],[300,112],[290,2],[295,113],[297,114],[299,115],[294,116],[292,2],[296,117],[517,2],[513,2],[519,118],[518,2],[289,119],[508,120],[511,121],[279,122],[278,123],[277,124],[524,63],[276,125],[265,2],[526,2],[557,126],[556,2],[527,63],[528,127],[203,2],[367,128],[368,129],[369,130],[207,2],[372,2],[227,131],[202,2],[451,63],[209,132],[450,133],[449,134],[440,2],[441,2],[448,2],[443,2],[446,135],[442,2],[444,136],[447,137],[445,136],[240,2],[237,2],[238,96],[392,2],[397,138],[398,139],[396,140],[394,141],[395,142],[390,2],[457,104],[232,104],[486,143],[493,144],[497,145],[326,146],[325,2],[320,2],[473,147],[481,148],[353,149],[354,150],[432,151],[342,2],[455,152],[330,63],[347,153],[458,154],[343,2],[346,155],[344,2],[456,156],[453,157],[452,2],[454,2],[350,2],[428,158],[215,159],[328,160],[332,161],[348,162],[351,163],[340,164],[333,165],[480,166],[406,167],[324,168],[212,169],[479,170],[208,171],[399,172],[391,2],[400,173],[417,174],[389,2],[416,175],[91,2],[411,176],[236,2],[431,177],[407,2],[221,2],[223,2],[362,2],[415,178],[239,2],[263,179],[349,180],[269,181],[329,2],[414,2],[393,2],[419,182],[420,183],[361,2],[422,184],[424,185],[423,186],[373,2],[413,169],[426,187],[323,188],[412,189],[418,190],[248,2],[252,2],[251,2],[250,2],[255,2],[249,2],[258,2],[257,2],[254,2],[253,2],[256,2],[259,191],[247,2],[315,192],[314,2],[319,193],[316,194],[318,195],[321,193],[317,194],[228,196],[307,197],[476,198],[474,2],[503,199],[505,200],[469,201],[504,202],[216,203],[213,203],[246,2],[230,204],[229,205],[225,206],[226,207],[234,208],[262,208],[273,208],[309,209],[274,209],[218,210],[217,2],[313,211],[312,212],[311,213],[310,214],[219,215],[460,216],[261,217],[468,218],[433,219],[463,220],[467,221],[356,222],[355,223],[336,224],[322,225],[304,226],[306,227],[303,228],[425,229],[327,2],[491,2],[224,230],[427,231],[475,232],[334,2],[264,233],[341,234],[339,235],[266,236],[401,237],[470,2],[267,238],[402,238],[489,2],[488,2],[490,2],[472,2],[471,2],[404,239],[331,2],[301,240],[222,241],[280,2],[206,242],[268,2],[495,63],[205,2],[507,243],[288,63],[501,104],[287,244],[484,245],[285,243],[210,2],[509,246],[283,63],[284,63],[275,2],[204,2],[282,247],[281,248],[270,249],[345,39],[405,39],[421,2],[409,250],[408,2],[293,119],[214,2],[302,63],[478,131],[485,251],[86,63],[89,252],[90,253],[87,63],[88,2],[382,254],[377,255],[376,2],[375,256],[374,2],[483,257],[494,258],[496,259],[500,260],[558,261],[502,262],[506,263],[534,264],[510,264],[533,265],[512,266],[522,267],[523,268],[525,269],[529,270],[532,131],[531,2],[530,271],[410,272],[81,2],[82,2],[13,2],[14,2],[16,2],[15,2],[2,2],[17,2],[18,2],[19,2],[20,2],[21,2],[22,2],[23,2],[24,2],[3,2],[25,2],[26,2],[4,2],[27,2],[31,2],[28,2],[29,2],[30,2],[32,2],[33,2],[34,2],[5,2],[35,2],[36,2],[37,2],[38,2],[6,2],[42,2],[39,2],[40,2],[41,2],[43,2],[7,2],[44,2],[49,2],[50,2],[45,2],[46,2],[47,2],[48,2],[8,2],[54,2],[51,2],[52,2],[53,2],[55,2],[9,2],[56,2],[57,2],[58,2],[60,2],[59,2],[61,2],[62,2],[10,2],[63,2],[64,2],[65,2],[11,2],[66,2],[67,2],[68,2],[69,2],[70,2],[1,2],[71,2],[72,2],[12,2],[76,2],[74,2],[79,2],[78,2],[73,2],[77,2],[75,2],[80,2],[117,273],[127,274],[116,273],[137,275],[108,276],[107,277],[136,271],[130,278],[135,279],[110,280],[124,281],[109,282],[133,283],[105,284],[104,271],[134,285],[106,286],[111,287],[112,2],[115,287],[102,2],[138,288],[128,289],[119,290],[120,291],[122,292],[118,293],[121,294],[131,271],[113,295],[114,296],[123,297],[103,298],[126,289],[125,287],[129,2],[132,299],[549,300],[561,301],[560,302],[562,303],[563,304],[564,305],[566,306],[565,307],[539,308],[540,308],[541,308],[542,308],[543,308],[545,309],[546,308],[547,308],[544,308],[548,308],[552,310],[551,311],[554,312],[553,313],[555,314],[550,315],[538,300]],"affectedFilesPendingEmit":[572,570,559,567,537,561,560,562,563,564,566,565,539,540,541,542,543,545,546,547,544,548,552,551,554,553,555,550,538],"version":"5.9.3"}
\ No newline at end of file\ No newline at end of file