@journey-to-code/games 0.0.0-stage → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/dist/backgammon.d.ts +146 -0
- package/dist/backgammon.js +1221 -0
- package/dist/backgammon.js.map +1 -0
- package/dist/blackjack.d.ts +66 -0
- package/dist/blackjack.js +452 -0
- package/dist/blackjack.js.map +1 -0
- package/dist/bluff.d.ts +60 -0
- package/dist/bluff.js +239 -0
- package/dist/bluff.js.map +1 -0
- package/dist/board.d.ts +387 -0
- package/dist/board.js +105 -0
- package/dist/board.js.map +1 -0
- package/dist/bridge.d.ts +86 -0
- package/dist/bridge.js +494 -0
- package/dist/bridge.js.map +1 -0
- package/dist/canasta.d.ts +88 -0
- package/dist/canasta.js +646 -0
- package/dist/canasta.js.map +1 -0
- package/dist/checkers.d.ts +108 -0
- package/dist/checkers.js +756 -0
- package/dist/checkers.js.map +1 -0
- package/dist/chess.d.ts +162 -0
- package/dist/chess.js +904 -0
- package/dist/chess.js.map +1 -0
- package/dist/chesscore.d.ts +136 -0
- package/dist/chesscore.js +1121 -0
- package/dist/chesscore.js.map +1 -0
- package/dist/combat.d.ts +102 -0
- package/dist/combat.js +772 -0
- package/dist/combat.js.map +1 -0
- package/dist/contractrummy.d.ts +77 -0
- package/dist/contractrummy.js +430 -0
- package/dist/contractrummy.js.map +1 -0
- package/dist/crazy8.d.ts +65 -0
- package/dist/crazy8.js +366 -0
- package/dist/crazy8.js.map +1 -0
- package/dist/cribbage.d.ts +75 -0
- package/dist/cribbage.js +428 -0
- package/dist/cribbage.js.map +1 -0
- package/dist/cuckoo.d.ts +43 -0
- package/dist/cuckoo.js +216 -0
- package/dist/cuckoo.js.map +1 -0
- package/dist/drinkingpyramid.d.ts +54 -0
- package/dist/drinkingpyramid.js +213 -0
- package/dist/drinkingpyramid.js.map +1 -0
- package/dist/drinks.d.ts +25 -0
- package/dist/drinks.js +40 -0
- package/dist/drinks.js.map +1 -0
- package/dist/dropfour.d.ts +103 -0
- package/dist/dropfour.js +577 -0
- package/dist/dropfour.js.map +1 -0
- package/dist/durak.d.ts +58 -0
- package/dist/durak.js +332 -0
- package/dist/durak.js.map +1 -0
- package/dist/euchre.d.ts +80 -0
- package/dist/euchre.js +453 -0
- package/dist/euchre.js.map +1 -0
- package/dist/fivedraw.d.ts +50 -0
- package/dist/fivedraw.js +289 -0
- package/dist/fivedraw.js.map +1 -0
- package/dist/fivehundred.d.ts +90 -0
- package/dist/fivehundred.js +504 -0
- package/dist/fivehundred.js.map +1 -0
- package/dist/freecell.d.ts +50 -0
- package/dist/freecell.js +327 -0
- package/dist/freecell.js.map +1 -0
- package/dist/fruitsalad.d.ts +69 -0
- package/dist/fruitsalad.js +427 -0
- package/dist/fruitsalad.js.map +1 -0
- package/dist/gin.d.ts +72 -0
- package/dist/gin.js +393 -0
- package/dist/gin.js.map +1 -0
- package/dist/go.d.ts +132 -0
- package/dist/go.js +659 -0
- package/dist/go.js.map +1 -0
- package/dist/goboard.d.ts +218 -0
- package/dist/goboard.js +880 -0
- package/dist/goboard.js.map +1 -0
- package/dist/gofish.d.ts +37 -0
- package/dist/gofish.js +235 -0
- package/dist/gofish.js.map +1 -0
- package/dist/golf.d.ts +64 -0
- package/dist/golf.js +343 -0
- package/dist/golf.js.map +1 -0
- package/dist/handfoot.d.ts +86 -0
- package/dist/handfoot.js +515 -0
- package/dist/handfoot.js.map +1 -0
- package/dist/hearts.d.ts +65 -0
- package/dist/hearts.js +390 -0
- package/dist/hearts.js.map +1 -0
- package/dist/holdem.d.ts +45 -0
- package/dist/holdem.js +286 -0
- package/dist/holdem.js.map +1 -0
- package/dist/horserace.d.ts +49 -0
- package/dist/horserace.js +207 -0
- package/dist/horserace.js.map +1 -0
- package/dist/index.d.ts +65 -0
- package/dist/index.js +66 -0
- package/dist/index.js.map +1 -0
- package/dist/kingscorner.d.ts +59 -0
- package/dist/kingscorner.js +374 -0
- package/dist/kingscorner.js.map +1 -0
- package/dist/kingscup.d.ts +44 -0
- package/dist/kingscup.js +185 -0
- package/dist/kingscup.js.map +1 -0
- package/dist/kit.d.ts +283 -0
- package/dist/kit.js +73 -0
- package/dist/kit.js.map +1 -0
- package/dist/klondike.d.ts +57 -0
- package/dist/klondike.js +314 -0
- package/dist/klondike.js.map +1 -0
- package/dist/liarspoker.d.ts +61 -0
- package/dist/liarspoker.js +298 -0
- package/dist/liarspoker.js.map +1 -0
- package/dist/memory.d.ts +36 -0
- package/dist/memory.js +181 -0
- package/dist/memory.js.map +1 -0
- package/dist/minigolf.d.ts +104 -0
- package/dist/minigolf.js +724 -0
- package/dist/minigolf.js.map +1 -0
- package/dist/minigolfcourse.d.ts +127 -0
- package/dist/minigolfcourse.js +470 -0
- package/dist/minigolfcourse.js.map +1 -0
- package/dist/offers.d.ts +136 -0
- package/dist/offers.js +279 -0
- package/dist/offers.js.map +1 -0
- package/dist/ohhell.d.ts +66 -0
- package/dist/ohhell.js +331 -0
- package/dist/ohhell.js.map +1 -0
- package/dist/oldmaid.d.ts +40 -0
- package/dist/oldmaid.js +186 -0
- package/dist/oldmaid.js.map +1 -0
- package/dist/pinochle.d.ts +94 -0
- package/dist/pinochle.js +466 -0
- package/dist/pinochle.js.map +1 -0
- package/dist/pitch.d.ts +77 -0
- package/dist/pitch.js +362 -0
- package/dist/pitch.js.map +1 -0
- package/dist/poker.d.ts +79 -0
- package/dist/poker.js +268 -0
- package/dist/poker.js.map +1 -0
- package/dist/president.d.ts +56 -0
- package/dist/president.js +339 -0
- package/dist/president.js.map +1 -0
- package/dist/pyramid.d.ts +39 -0
- package/dist/pyramid.js +200 -0
- package/dist/pyramid.js.map +1 -0
- package/dist/registry.d.ts +17 -0
- package/dist/registry.js +70 -0
- package/dist/registry.js.map +1 -0
- package/dist/reversi.d.ts +69 -0
- package/dist/reversi.js +584 -0
- package/dist/reversi.js.map +1 -0
- package/dist/ridethebus.d.ts +48 -0
- package/dist/ridethebus.js +257 -0
- package/dist/ridethebus.js.map +1 -0
- package/dist/rummy500.d.ts +89 -0
- package/dist/rummy500.js +474 -0
- package/dist/rummy500.js.map +1 -0
- package/dist/sevens.d.ts +48 -0
- package/dist/sevens.js +221 -0
- package/dist/sevens.js.map +1 -0
- package/dist/slapjack.d.ts +42 -0
- package/dist/slapjack.js +224 -0
- package/dist/slapjack.js.map +1 -0
- package/dist/speed.d.ts +44 -0
- package/dist/speed.js +201 -0
- package/dist/speed.js.map +1 -0
- package/dist/spider.d.ts +51 -0
- package/dist/spider.js +320 -0
- package/dist/spider.js.map +1 -0
- package/dist/spite.d.ts +75 -0
- package/dist/spite.js +372 -0
- package/dist/spite.js.map +1 -0
- package/dist/sport.d.ts +266 -0
- package/dist/sport.js +48 -0
- package/dist/sport.js.map +1 -0
- package/dist/switch.d.ts +69 -0
- package/dist/switch.js +393 -0
- package/dist/switch.js.map +1 -0
- package/dist/table.d.ts +284 -0
- package/dist/table.js +67 -0
- package/dist/table.js.map +1 -0
- package/dist/talk.d.ts +17 -0
- package/dist/talk.js +44 -0
- package/dist/talk.js.map +1 -0
- package/dist/thirtyone.d.ts +66 -0
- package/dist/thirtyone.js +372 -0
- package/dist/thirtyone.js.map +1 -0
- package/dist/tictactoe.d.ts +68 -0
- package/dist/tictactoe.js +541 -0
- package/dist/tictactoe.js.map +1 -0
- package/dist/tricks.d.ts +21 -0
- package/dist/tricks.js +48 -0
- package/dist/tricks.js.map +1 -0
- package/dist/war.d.ts +44 -0
- package/dist/war.js +185 -0
- package/dist/war.js.map +1 -0
- package/dist/whist.d.ts +52 -0
- package/dist/whist.js +218 -0
- package/dist/whist.js.map +1 -0
- package/dist/yacht.d.ts +96 -0
- package/dist/yacht.js +653 -0
- package/dist/yacht.js.map +1 -0
- package/package.json +41 -4
- package/README.md +0 -3
|
@@ -0,0 +1,541 @@
|
|
|
1
|
+
import { settleMatch, withOffers } from "./offers.js";
|
|
2
|
+
import { cellAt, cellName, chessCoords, colOf, lineThrough, rowOf } from "./board.js";
|
|
3
|
+
import { careless, clone, GameError, markReady, nextHandChoices, nextRandom, pickRandom, thinkFor, who } from "./table.js";
|
|
4
|
+
export const classicTicTacToe = { id: "tictactoe-classic", name: "Classic 3×3", board: "single", size: 3, line: 3, first: "random", games: 1 };
|
|
5
|
+
export const ultimateTicTacToe = { id: "tictactoe-ultimate", name: "Ultimate (nine boards)", board: "ultimate", size: 3, line: 3, first: "random", games: 1 };
|
|
6
|
+
export const fourTicTacToe = { id: "tictactoe-four", name: "Four in a row on 6×6", board: "single", size: 6, line: 4, first: "random", games: 1 };
|
|
7
|
+
export const gomoku = { id: "tictactoe-gomoku", name: "Gomoku (15×15, five in a row)", board: "single", size: 15, line: 5, first: "random", games: 1 };
|
|
8
|
+
const PRESETS = [classicTicTacToe, ultimateTicTacToe, fourTicTacToe, gomoku];
|
|
9
|
+
const SIZES = [3, 4, 5, 6, 7, 9, 11, 13, 15];
|
|
10
|
+
const ultimate = (s) => s.rules.board === "ultimate";
|
|
11
|
+
/** Cells along one side of the whole grid. */
|
|
12
|
+
export const sideOf = (rules) => (rules.board === "ultimate" ? 9 : rules.size);
|
|
13
|
+
const other = (seat) => 1 - seat;
|
|
14
|
+
function startRound(s) {
|
|
15
|
+
const n = sideOf(s.rules);
|
|
16
|
+
s.cells = Array(n * n).fill(null);
|
|
17
|
+
s.blocks = ultimate(s) ? Array(9).fill(null) : null;
|
|
18
|
+
s.forced = null;
|
|
19
|
+
s.turn = s.first;
|
|
20
|
+
s.last = null;
|
|
21
|
+
s.won = null;
|
|
22
|
+
s.roundWinner = null;
|
|
23
|
+
s.phase = "playing";
|
|
24
|
+
s.ready = Array(s.seats).fill(false);
|
|
25
|
+
s.narration = null;
|
|
26
|
+
}
|
|
27
|
+
export function newTicTacToe(rules, seats, seed) {
|
|
28
|
+
const s = { game: "tictactoe", rules, seats: 2, rng: seed >>> 0, round: 1, wins: [0, 0], draws: 0 };
|
|
29
|
+
s.first = rules.first === "seat1" ? 0 : rules.first === "seat2" ? 1 : nextRandom(s)() < 0.5 ? 0 : 1;
|
|
30
|
+
startRound(s);
|
|
31
|
+
return s;
|
|
32
|
+
}
|
|
33
|
+
// ---- Ultimate's geometry --------------------------------------------------------------------------
|
|
34
|
+
/** The small board a cell of the 9×9 is in, and its place within that board (both 0–8). */
|
|
35
|
+
export const blockOf = (cell) => Math.floor(rowOf(9, cell) / 3) * 3 + Math.floor(colOf(9, cell) / 3);
|
|
36
|
+
export const spotOf = (cell) => (rowOf(9, cell) % 3) * 3 + (colOf(9, cell) % 3);
|
|
37
|
+
/** The 9×9 cell at a spot of a small board. */
|
|
38
|
+
export const cellIn = (block, spot) => cellAt(9, Math.floor(block / 3) * 3 + Math.floor(spot / 3), (block % 3) * 3 + (spot % 3));
|
|
39
|
+
const LINES3 = [[0, 1, 2], [3, 4, 5], [6, 7, 8], [0, 3, 6], [1, 4, 7], [2, 5, 8], [0, 4, 8], [2, 4, 6]];
|
|
40
|
+
const SPOTS = [0, 1, 2, 3, 4, 5, 6, 7, 8];
|
|
41
|
+
const lineOf3 = (at, who) => LINES3.find((l) => l.every((i) => at(i) === who)) ?? null;
|
|
42
|
+
/** The cells a move can go in now. */
|
|
43
|
+
export function openCells(s) {
|
|
44
|
+
if (s.phase !== "playing")
|
|
45
|
+
return [];
|
|
46
|
+
if (!ultimate(s))
|
|
47
|
+
return s.cells.flatMap((m, i) => (m === null ? [i] : []));
|
|
48
|
+
return s.cells.flatMap((m, i) => (m === null && s.blocks[blockOf(i)] === null && (s.forced === null || s.forced === blockOf(i)) ? [i] : []));
|
|
49
|
+
}
|
|
50
|
+
/** Put a mark down and work out what it did. Changes `s`: callers pass a copy. */
|
|
51
|
+
function place(s, seat, cell) {
|
|
52
|
+
s.cells[cell] = seat;
|
|
53
|
+
s.last = cell;
|
|
54
|
+
if (!ultimate(s)) {
|
|
55
|
+
const n = s.rules.size;
|
|
56
|
+
const line = lineThrough(n, n, cell, s.rules.line, (c) => s.cells[c] === seat);
|
|
57
|
+
if (line) {
|
|
58
|
+
s.won = line;
|
|
59
|
+
return "won";
|
|
60
|
+
}
|
|
61
|
+
return s.cells.every((m) => m !== null) ? "draw" : null;
|
|
62
|
+
}
|
|
63
|
+
const block = blockOf(cell);
|
|
64
|
+
const blocks = s.blocks;
|
|
65
|
+
if (lineOf3((i) => s.cells[cellIn(block, i)], seat))
|
|
66
|
+
blocks[block] = seat;
|
|
67
|
+
else if (SPOTS.every((i) => s.cells[cellIn(block, i)] !== null))
|
|
68
|
+
blocks[block] = "draw";
|
|
69
|
+
// The square played says where the other player goes, unless that small board is finished.
|
|
70
|
+
s.forced = blocks[spotOf(cell)] === null ? spotOf(cell) : null;
|
|
71
|
+
const big = lineOf3((i) => blocks[i], seat);
|
|
72
|
+
if (big) {
|
|
73
|
+
s.won = big.flatMap((b) => SPOTS.map((i) => cellIn(b, i)));
|
|
74
|
+
return "won";
|
|
75
|
+
}
|
|
76
|
+
return blocks.every((b) => b !== null) ? "draw" : null;
|
|
77
|
+
}
|
|
78
|
+
// ---- Moves --------------------------------------------------------------------------------------
|
|
79
|
+
/** How a match stands once this game is in: finished when the games run out or one side can't be caught. */
|
|
80
|
+
function matchOver(s) {
|
|
81
|
+
const left = s.rules.games - s.round;
|
|
82
|
+
return left <= 0 || Math.abs(s.wins[0] - s.wins[1]) > left;
|
|
83
|
+
}
|
|
84
|
+
function apply(state, seat, move) {
|
|
85
|
+
if (move?.type === "next") {
|
|
86
|
+
if (state.phase !== "scored")
|
|
87
|
+
throw new GameError("There's a game going on.");
|
|
88
|
+
const s = clone(state);
|
|
89
|
+
if (markReady(s.ready, seat)) {
|
|
90
|
+
// Take turns going first.
|
|
91
|
+
s.round += 1;
|
|
92
|
+
s.first = other(s.first);
|
|
93
|
+
startRound(s);
|
|
94
|
+
}
|
|
95
|
+
return s;
|
|
96
|
+
}
|
|
97
|
+
if (move?.type !== "mark")
|
|
98
|
+
throw new GameError("That's not a move in Tic-Tac-Toe.");
|
|
99
|
+
if (state.phase !== "playing")
|
|
100
|
+
throw new GameError("This game is over.");
|
|
101
|
+
if (state.turn !== seat)
|
|
102
|
+
throw new GameError("It's not your turn.");
|
|
103
|
+
const cell = Number(move.cell);
|
|
104
|
+
if (!Number.isInteger(cell) || cell < 0 || cell >= state.cells.length)
|
|
105
|
+
throw new GameError("That's not on the board.");
|
|
106
|
+
if (state.cells[cell] !== null)
|
|
107
|
+
throw new GameError("That square is taken.");
|
|
108
|
+
if (ultimate(state)) {
|
|
109
|
+
if (state.blocks[blockOf(cell)] !== null)
|
|
110
|
+
throw new GameError("That small board is finished.");
|
|
111
|
+
if (state.forced !== null && state.forced !== blockOf(cell))
|
|
112
|
+
throw new GameError("You have to play in the lit-up board.");
|
|
113
|
+
}
|
|
114
|
+
const s = clone(state);
|
|
115
|
+
const end = place(s, seat, cell);
|
|
116
|
+
const grid = gridOf(s);
|
|
117
|
+
s.narration = `${who(seat)} plays ${markOf(s, seat).label} ${nameOf(grid, cell)}`;
|
|
118
|
+
if (!end) {
|
|
119
|
+
s.turn = other(seat);
|
|
120
|
+
return s;
|
|
121
|
+
}
|
|
122
|
+
if (end === "won") {
|
|
123
|
+
s.wins[seat] += 1;
|
|
124
|
+
s.roundWinner = seat;
|
|
125
|
+
}
|
|
126
|
+
else
|
|
127
|
+
s.draws += 1;
|
|
128
|
+
const many = s.rules.games > 1;
|
|
129
|
+
s.narration = end === "won" ? `${who(seat)} wins${many ? ` game ${s.round}` : ""}!` : many ? `Game ${s.round} is a draw` : "It's a draw!";
|
|
130
|
+
s.phase = matchOver(s) ? "finished" : "scored";
|
|
131
|
+
return s;
|
|
132
|
+
}
|
|
133
|
+
/** Best first. A drawn match lists the player who went second in the last game first: holding X to a draw is the better result. */
|
|
134
|
+
function order(s) {
|
|
135
|
+
const [a, b] = s.wins;
|
|
136
|
+
if (a !== b)
|
|
137
|
+
return a > b ? [0, 1] : [1, 0];
|
|
138
|
+
return [other(s.first), s.first];
|
|
139
|
+
}
|
|
140
|
+
const winners = (s) => (s.wins[0] === s.wins[1] ? [0, 1] : [s.wins[0] > s.wins[1] ? 0 : 1]);
|
|
141
|
+
// ---- What a seat sees ---------------------------------------------------------------------------
|
|
142
|
+
const X = { kind: "x", glyph: "✕", label: "X", tone: "red" };
|
|
143
|
+
const O = { kind: "o", glyph: "◯", label: "O", tone: "blue" };
|
|
144
|
+
const markOf = (s, seat) => ({ ...(seat === s.first ? X : O), owner: seat });
|
|
145
|
+
const ROWS3 = ["top", "middle", "bottom"];
|
|
146
|
+
const COLS3 = ["left", "middle", "right"];
|
|
147
|
+
const spotName = (spot) => (spot === 4 ? "centre" : `${ROWS3[Math.floor(spot / 3)]} ${COLS3[spot % 3]}`);
|
|
148
|
+
/** The board without its pieces: enough to name a cell. */
|
|
149
|
+
function gridOf(s) {
|
|
150
|
+
if (ultimate(s))
|
|
151
|
+
return { cols: 9, names: s.cells.map((_, i) => `${spotName(spotOf(i))} of the ${spotName(blockOf(i))} board`) };
|
|
152
|
+
if (s.rules.size === 3)
|
|
153
|
+
return { cols: 3, names: s.cells.map((_, i) => spotName(i)) };
|
|
154
|
+
return { cols: s.rules.size, coords: chessCoords(s.rules.size, s.rules.size) };
|
|
155
|
+
}
|
|
156
|
+
const nameOf = (grid, cell) => (grid.names ? `in the ${grid.names[cell]}` : `at ${cellName(grid, cell)}`);
|
|
157
|
+
const goal = (r) => (r.board === "ultimate" ? "Three small boards in a row wins" : `${["Three", "Four", "Five", "Six"][r.line - 3] ?? r.line} in a row wins`);
|
|
158
|
+
function view(s, seat) {
|
|
159
|
+
const over = s.phase === "finished";
|
|
160
|
+
const mine = s.phase === "playing" && s.turn === seat;
|
|
161
|
+
const many = s.rules.games > 1;
|
|
162
|
+
const n = sideOf(s.rules);
|
|
163
|
+
const w = over ? winners(s) : [];
|
|
164
|
+
const marks = [];
|
|
165
|
+
if (s.last !== null)
|
|
166
|
+
marks.push({ cell: s.last, mark: "last" });
|
|
167
|
+
for (const cell of s.won ?? [])
|
|
168
|
+
marks.push({ cell, mark: "win" });
|
|
169
|
+
const open = openCells(s);
|
|
170
|
+
const grid = {
|
|
171
|
+
id: "board",
|
|
172
|
+
label: "Board",
|
|
173
|
+
rows: n,
|
|
174
|
+
...gridOf(s),
|
|
175
|
+
cells: s.cells.map((m) => (m === null ? null : markOf(s, m))),
|
|
176
|
+
marks,
|
|
177
|
+
tap: mine ? { type: "mark", cells: open } : null,
|
|
178
|
+
};
|
|
179
|
+
if (ultimate(s)) {
|
|
180
|
+
grid.blocks = {
|
|
181
|
+
rows: 3,
|
|
182
|
+
cols: 3,
|
|
183
|
+
states: s.blocks.map((b, i) => ({
|
|
184
|
+
owner: typeof b === "number" ? b : null,
|
|
185
|
+
glyph: typeof b === "number" ? markOf(s, b).glyph : undefined,
|
|
186
|
+
label: typeof b === "number" ? `won by ${markOf(s, b).label}` : b === "draw" ? "drawn" : undefined,
|
|
187
|
+
closed: b !== null,
|
|
188
|
+
active: s.phase === "playing" && b === null && (s.forced === null || s.forced === i),
|
|
189
|
+
})),
|
|
190
|
+
};
|
|
191
|
+
}
|
|
192
|
+
const scoreTitle = s.roundWinner === null ? `Game ${s.round} is a draw` : `${who(s.roundWinner)} wins game ${s.round}`;
|
|
193
|
+
return {
|
|
194
|
+
game: "tictactoe",
|
|
195
|
+
seats: s.seats,
|
|
196
|
+
me: seat,
|
|
197
|
+
teams: false,
|
|
198
|
+
phase: s.phase,
|
|
199
|
+
turn: s.phase === "playing" ? s.turn : null,
|
|
200
|
+
grids: [grid],
|
|
201
|
+
reserves: [],
|
|
202
|
+
choices: s.phase === "scored" ? nextHandChoices(s.ready, seat, false, "Next game") : null,
|
|
203
|
+
players: s.wins.map((wins, i) => ({ line: many ? `${wins} win${wins === 1 ? "" : "s"}` : "", piece: markOf(s, i), badge: s.phase === "playing" && s.last === null && i === s.first ? "Goes first" : undefined })),
|
|
204
|
+
info: [goal(s.rules), ...(many ? [`Game ${s.round} of ${s.rules.games}`] : []), ...(ultimate(s) && s.phase === "playing" ? [s.forced === null ? "Play in any open board" : `Play in the ${spotName(s.forced)} board`] : [])],
|
|
205
|
+
narration: s.narration ?? (mine ? "You're X: you go first" : null),
|
|
206
|
+
scores: s.wins.map((value, i) => ({ seats: [i], value })),
|
|
207
|
+
result: many && s.phase !== "playing"
|
|
208
|
+
? { key: `game-${s.round}`, title: scoreTitle, sides: [[0], [1]], rows: [{ label: "Wins", values: s.wins.map(String), tone: "total" }, ...(s.draws ? [{ label: "Draws", values: [String(s.draws), String(s.draws)] }] : [])] }
|
|
209
|
+
: null,
|
|
210
|
+
over: over ? { winners: w, title: w.length > 1 ? "It's a draw!" : `${who(w[0])} wins${many ? ` ${s.wins[w[0]]} to ${s.wins[other(w[0])]}` : ""}!` } : null,
|
|
211
|
+
};
|
|
212
|
+
}
|
|
213
|
+
// ---- Computer players ---------------------------------------------------------------------------
|
|
214
|
+
// Three brains. 3×3 is small enough to know completely, so at full skill it never loses. Bigger
|
|
215
|
+
// boards are scored square by square (what a mark there would build, and what it would stop) with
|
|
216
|
+
// a look at the other player's best answer. Ultimate looks a few moves ahead. A careless player
|
|
217
|
+
// (see `careless`) plays the first square that comes to mind instead, which is how the easier
|
|
218
|
+
// tables get beaten.
|
|
219
|
+
// -- 3×3: the whole game tree, remembered. The value is for the player about to move: 1 win, 0 draw, -1 loss.
|
|
220
|
+
const solved = new Map();
|
|
221
|
+
function solve3(cells, turn) {
|
|
222
|
+
const key = cells.map((m) => (m === null ? "." : m)).join("") + turn;
|
|
223
|
+
const known = solved.get(key);
|
|
224
|
+
if (known !== undefined)
|
|
225
|
+
return known;
|
|
226
|
+
let best = -2;
|
|
227
|
+
for (let i = 0; i < 9 && best < 1; i++) {
|
|
228
|
+
if (cells[i] !== null)
|
|
229
|
+
continue;
|
|
230
|
+
cells[i] = turn;
|
|
231
|
+
const value = lineOf3((j) => cells[j], turn) ? 1 : cells.every((m) => m !== null) ? 0 : -solve3(cells, other(turn));
|
|
232
|
+
cells[i] = null;
|
|
233
|
+
best = Math.max(best, value);
|
|
234
|
+
}
|
|
235
|
+
solved.set(key, best);
|
|
236
|
+
return best;
|
|
237
|
+
}
|
|
238
|
+
/** Every best move on a 3×3 board: the squares that keep the best result that can still be had. */
|
|
239
|
+
export function bestClassicMoves(cells, turn) {
|
|
240
|
+
const board = [...cells];
|
|
241
|
+
let best = -2;
|
|
242
|
+
let moves = [];
|
|
243
|
+
for (let i = 0; i < 9; i++) {
|
|
244
|
+
if (board[i] !== null)
|
|
245
|
+
continue;
|
|
246
|
+
board[i] = turn;
|
|
247
|
+
const value = lineOf3((j) => board[j], turn) ? 1 : board.every((m) => m !== null) ? 0 : -solve3(board, other(turn));
|
|
248
|
+
board[i] = null;
|
|
249
|
+
if (value > best)
|
|
250
|
+
[best, moves] = [value, [i]];
|
|
251
|
+
else if (value === best)
|
|
252
|
+
moves.push(i);
|
|
253
|
+
}
|
|
254
|
+
return moves;
|
|
255
|
+
}
|
|
256
|
+
// -- Bigger boards. Every run of `line` squares through a square counts: a run with only my marks
|
|
257
|
+
// in it is one I'm building (worth more the fuller it is), a run with only theirs is one to stop.
|
|
258
|
+
const WORTH = [1, 6, 40, 400, 6000, 90000];
|
|
259
|
+
const WIN = 1e9;
|
|
260
|
+
/** What a mark in `cell` would do for `seat`: [what it builds, what it stops]. WIN in either means a line finished or denied. */
|
|
261
|
+
function rate(cells, n, line, cell, seat) {
|
|
262
|
+
const r0 = rowOf(n, cell);
|
|
263
|
+
const c0 = colOf(n, cell);
|
|
264
|
+
let build = 0;
|
|
265
|
+
let stop = 0;
|
|
266
|
+
for (const [dr, dc] of [[0, 1], [1, 0], [1, 1], [1, -1]]) {
|
|
267
|
+
for (let start = 1 - line; start <= 0; start++) {
|
|
268
|
+
const r1 = r0 + dr * start;
|
|
269
|
+
const c1 = c0 + dc * start;
|
|
270
|
+
const r2 = r1 + dr * (line - 1);
|
|
271
|
+
const c2 = c1 + dc * (line - 1);
|
|
272
|
+
if (r1 < 0 || r1 >= n || c1 < 0 || c1 >= n || r2 < 0 || r2 >= n || c2 < 0 || c2 >= n)
|
|
273
|
+
continue;
|
|
274
|
+
let mine = 0;
|
|
275
|
+
let theirs = 0;
|
|
276
|
+
for (let k = 0; k < line; k++) {
|
|
277
|
+
const m = cells[cellAt(n, r1 + dr * k, c1 + dc * k)];
|
|
278
|
+
if (m === seat)
|
|
279
|
+
mine++;
|
|
280
|
+
else if (m !== null && m !== undefined)
|
|
281
|
+
theirs++;
|
|
282
|
+
}
|
|
283
|
+
if (!theirs)
|
|
284
|
+
build += mine === line - 1 ? WIN : WORTH[Math.min(mine, 5)];
|
|
285
|
+
if (!mine && theirs)
|
|
286
|
+
stop += theirs === line - 1 ? WIN : WORTH[Math.min(theirs, 5)] * 0.8;
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
return [build, stop];
|
|
290
|
+
}
|
|
291
|
+
/** Squares worth thinking about: all of a small board; on a big one, those within two of a mark. */
|
|
292
|
+
function candidates(cells, n) {
|
|
293
|
+
const empty = cells.flatMap((m, i) => (m === null ? [i] : []));
|
|
294
|
+
if (n <= 7)
|
|
295
|
+
return empty;
|
|
296
|
+
if (empty.length === cells.length)
|
|
297
|
+
return [cellAt(n, Math.floor(n / 2), Math.floor(n / 2))];
|
|
298
|
+
const near = empty.filter((i) => {
|
|
299
|
+
const r = rowOf(n, i);
|
|
300
|
+
const c = colOf(n, i);
|
|
301
|
+
for (let dr = -2; dr <= 2; dr++)
|
|
302
|
+
for (let dc = -2; dc <= 2; dc++)
|
|
303
|
+
if (r + dr >= 0 && r + dr < n && c + dc >= 0 && c + dc < n && cells[cellAt(n, r + dr, c + dc)] !== null)
|
|
304
|
+
return true;
|
|
305
|
+
return false;
|
|
306
|
+
});
|
|
307
|
+
return near.length ? near : empty;
|
|
308
|
+
}
|
|
309
|
+
function bestBigMove(s, seat, rand) {
|
|
310
|
+
const n = s.rules.size;
|
|
311
|
+
const line = s.rules.line;
|
|
312
|
+
const cells = [...s.cells];
|
|
313
|
+
const scored = candidates(cells, n)
|
|
314
|
+
.map((cell) => {
|
|
315
|
+
const [build, stop] = rate(cells, n, line, cell, seat);
|
|
316
|
+
return { cell, build, stop, value: build + stop + rand() };
|
|
317
|
+
})
|
|
318
|
+
.sort((a, b) => b.value - a.value);
|
|
319
|
+
// Finish my own line if I can; failing that, stop theirs.
|
|
320
|
+
const win = scored.find((o) => o.build >= WIN);
|
|
321
|
+
if (win)
|
|
322
|
+
return win.cell;
|
|
323
|
+
const block = scored.find((o) => o.stop >= WIN);
|
|
324
|
+
if (block)
|
|
325
|
+
return block.cell;
|
|
326
|
+
// Otherwise weigh the best few against what each leaves the other player.
|
|
327
|
+
let best = scored[0];
|
|
328
|
+
let bestNet = -Infinity;
|
|
329
|
+
for (const option of scored.slice(0, 8)) {
|
|
330
|
+
cells[option.cell] = seat;
|
|
331
|
+
const after = candidates(cells, n);
|
|
332
|
+
const wins = after.filter((c) => rate(cells, n, line, c, seat)[0] >= WIN);
|
|
333
|
+
// Two ways to finish next turn can't both be stopped.
|
|
334
|
+
if (wins.length >= 2)
|
|
335
|
+
return option.cell;
|
|
336
|
+
// One way to finish forces their answer; otherwise they play whatever builds the most.
|
|
337
|
+
const answers = (wins.length ? wins : after).map((cell) => ({ cell, build: rate(cells, n, line, cell, other(seat))[0] })).sort((a, b) => b.build - a.build);
|
|
338
|
+
let net = option.value - Math.min(answers[0]?.build ?? 0, WIN / 10) * 0.6;
|
|
339
|
+
// And an answer that leaves them two ways to finish is one I can't come back from.
|
|
340
|
+
for (const answer of answers.slice(0, 5)) {
|
|
341
|
+
cells[answer.cell] = other(seat);
|
|
342
|
+
if (candidates(cells, n).filter((c) => rate(cells, n, line, c, other(seat))[0] >= WIN).length >= 2)
|
|
343
|
+
net -= WIN / 100;
|
|
344
|
+
cells[answer.cell] = null;
|
|
345
|
+
}
|
|
346
|
+
cells[option.cell] = null;
|
|
347
|
+
if (net > bestNet)
|
|
348
|
+
[best, bestNet] = [option, net];
|
|
349
|
+
}
|
|
350
|
+
return best.cell;
|
|
351
|
+
}
|
|
352
|
+
// -- Ultimate: look a few moves ahead, and judge what's left by the small boards held and the
|
|
353
|
+
// lines of them still open.
|
|
354
|
+
const SPOT_WEIGHT = [1.2, 1, 1.2, 1, 1.4, 1, 1.2, 1, 1.2];
|
|
355
|
+
function judge(s, seat) {
|
|
356
|
+
const blocks = s.blocks;
|
|
357
|
+
let total = 0;
|
|
358
|
+
for (let b = 0; b < 9; b++) {
|
|
359
|
+
const held = blocks[b];
|
|
360
|
+
if (held === seat)
|
|
361
|
+
total += 100 * SPOT_WEIGHT[b];
|
|
362
|
+
else if (typeof held === "number")
|
|
363
|
+
total -= 100 * SPOT_WEIGHT[b];
|
|
364
|
+
else if (held === null) {
|
|
365
|
+
for (const l of LINES3) {
|
|
366
|
+
let mine = 0;
|
|
367
|
+
let theirs = 0;
|
|
368
|
+
for (const i of l) {
|
|
369
|
+
const m = s.cells[cellIn(b, i)];
|
|
370
|
+
if (m === seat)
|
|
371
|
+
mine++;
|
|
372
|
+
else if (m !== null)
|
|
373
|
+
theirs++;
|
|
374
|
+
}
|
|
375
|
+
if (!theirs)
|
|
376
|
+
total += [0, 1, 6][mine] * SPOT_WEIGHT[b];
|
|
377
|
+
if (!mine)
|
|
378
|
+
total -= [0, 1, 6][theirs] * SPOT_WEIGHT[b];
|
|
379
|
+
}
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
for (const l of LINES3) {
|
|
383
|
+
const held = l.map((i) => blocks[i]);
|
|
384
|
+
const mine = held.filter((h) => h === seat).length;
|
|
385
|
+
const theirs = held.filter((h) => typeof h === "number" && h !== seat).length;
|
|
386
|
+
const dead = held.some((h) => h === "draw");
|
|
387
|
+
if (!dead && !theirs)
|
|
388
|
+
total += [0, 30, 250][mine] ?? 0;
|
|
389
|
+
if (!dead && !mine)
|
|
390
|
+
total -= [0, 30, 250][theirs] ?? 0;
|
|
391
|
+
}
|
|
392
|
+
return total;
|
|
393
|
+
}
|
|
394
|
+
/** The value of the position for `seat`, who is about to move, looking `depth` moves ahead. */
|
|
395
|
+
function search(s, seat, depth, alpha, beta) {
|
|
396
|
+
const moves = openCells(s);
|
|
397
|
+
if (depth === 0)
|
|
398
|
+
return judge(s, seat);
|
|
399
|
+
let best = -Infinity;
|
|
400
|
+
for (const cell of moves) {
|
|
401
|
+
const next = { ...s, cells: [...s.cells], blocks: [...s.blocks] };
|
|
402
|
+
const end = place(next, seat, cell);
|
|
403
|
+
// Sooner wins are better than later ones.
|
|
404
|
+
const value = end === "won" ? 100000 + depth : end === "draw" ? 0 : -search(next, other(seat), depth - 1, -beta, -alpha);
|
|
405
|
+
if (value > best)
|
|
406
|
+
best = value;
|
|
407
|
+
if (best > alpha)
|
|
408
|
+
alpha = best;
|
|
409
|
+
if (alpha >= beta)
|
|
410
|
+
break;
|
|
411
|
+
}
|
|
412
|
+
return best;
|
|
413
|
+
}
|
|
414
|
+
function bestUltimateMove(s, seat, depth, rand) {
|
|
415
|
+
const moves = openCells(s);
|
|
416
|
+
// A free choice of all nine boards is a lot of moves: look one move less far.
|
|
417
|
+
const deep = moves.length > 27 ? depth - 1 : depth;
|
|
418
|
+
let best = moves[0];
|
|
419
|
+
let bestValue = -Infinity;
|
|
420
|
+
for (const cell of moves) {
|
|
421
|
+
const next = { ...s, cells: [...s.cells], blocks: [...s.blocks] };
|
|
422
|
+
const end = place(next, seat, cell);
|
|
423
|
+
const value = (end === "won" ? 100000 + deep : end === "draw" ? 0 : -search(next, other(seat), deep - 1, -Infinity, Infinity)) + rand();
|
|
424
|
+
if (value > bestValue)
|
|
425
|
+
[best, bestValue] = [cell, value];
|
|
426
|
+
}
|
|
427
|
+
return best;
|
|
428
|
+
}
|
|
429
|
+
function bot(s, seat, style, rand = Math.random) {
|
|
430
|
+
if (s.phase === "scored")
|
|
431
|
+
return s.ready[seat] ? null : { type: "next" };
|
|
432
|
+
if (s.phase !== "playing" || s.turn !== seat)
|
|
433
|
+
return null;
|
|
434
|
+
const open = openCells(s);
|
|
435
|
+
if (ultimate(s)) {
|
|
436
|
+
if (careless(style, rand))
|
|
437
|
+
return { type: "mark", cell: pickRandom(open, rand) };
|
|
438
|
+
return { type: "mark", cell: bestUltimateMove(s, seat, (style.skill ?? 1) >= 0.9 ? 4 : (style.skill ?? 1) >= 0.5 ? 3 : 2, rand) };
|
|
439
|
+
}
|
|
440
|
+
if (s.rules.size === 3 && s.rules.line === 3) {
|
|
441
|
+
if (careless(style, rand))
|
|
442
|
+
return { type: "mark", cell: pickRandom(open, rand) };
|
|
443
|
+
return { type: "mark", cell: pickRandom(bestClassicMoves(s.cells, seat), rand) };
|
|
444
|
+
}
|
|
445
|
+
// A careless move on a big board is still somewhere near the action, just not thought through.
|
|
446
|
+
if (careless(style, rand))
|
|
447
|
+
return { type: "mark", cell: pickRandom(candidates(s.cells, s.rules.size), rand) };
|
|
448
|
+
return { type: "mark", cell: bestBigMove(s, seat, rand) };
|
|
449
|
+
}
|
|
450
|
+
// ---- The game -----------------------------------------------------------------------------------
|
|
451
|
+
function normalize(rules) {
|
|
452
|
+
const given = (rules && typeof rules === "object" ? rules : {});
|
|
453
|
+
const base = PRESETS.find((p) => p.id === given.id) ?? classicTicTacToe;
|
|
454
|
+
const r = { ...base, ...given };
|
|
455
|
+
const board = r.board === "ultimate" ? "ultimate" : "single";
|
|
456
|
+
// Ultimate is always 3×3 boards and three in a row, whatever was saved with it.
|
|
457
|
+
const size = board === "ultimate" ? 3 : Math.min(15, Math.max(3, Math.round(Number(r.size)) || 3));
|
|
458
|
+
const line = board === "ultimate" ? 3 : Math.min(6, Math.max(3, Math.round(Number(r.line)) || 3));
|
|
459
|
+
return {
|
|
460
|
+
id: String(r.id),
|
|
461
|
+
name: String(r.name),
|
|
462
|
+
board,
|
|
463
|
+
size,
|
|
464
|
+
line,
|
|
465
|
+
first: r.first === "seat1" || r.first === "seat2" ? r.first : "random",
|
|
466
|
+
games: [1, 3, 5, 7].includes(Number(r.games)) ? Number(r.games) : 1,
|
|
467
|
+
};
|
|
468
|
+
}
|
|
469
|
+
const rules = {
|
|
470
|
+
id: "tictactoe",
|
|
471
|
+
name: "Tic-Tac-Toe",
|
|
472
|
+
emoji: "⭕",
|
|
473
|
+
blurb: "Three in a row, or nine boards at once",
|
|
474
|
+
tagline: "Xs and Os: get yours in a row first. Try Ultimate when three in a row gets too easy.",
|
|
475
|
+
seats: { min: 2, max: 2, default: 2 },
|
|
476
|
+
teams: false,
|
|
477
|
+
presets: PRESETS,
|
|
478
|
+
fields: [
|
|
479
|
+
{ key: "board", label: "Board", kind: "choice", options: [["single", "One board"], ["ultimate", "Ultimate: nine small boards"]] },
|
|
480
|
+
{ key: "size", label: "Board size (one board)", kind: "choice", options: SIZES.map((n) => [n, `${n}×${n}`]) },
|
|
481
|
+
{ key: "line", label: "In a row to win (one board)", kind: "choice", options: [[3, "Three"], [4, "Four"], [5, "Five"], [6, "Six"]] },
|
|
482
|
+
{ key: "first", label: "Who goes first", kind: "choice", options: [["random", "Luck of the draw"], ["seat1", "The first seat"], ["seat2", "The second seat"]] },
|
|
483
|
+
{ key: "games", label: "Games in a match", kind: "choice", options: [[1, "Just one"], [3, "Three"], [5, "Five"], [7, "Seven"]] },
|
|
484
|
+
],
|
|
485
|
+
normalize,
|
|
486
|
+
validate(r) {
|
|
487
|
+
return r.board === "single" && r.line > r.size ? [`${r.line} in a row doesn't fit on a ${r.size}×${r.size} board.`] : [];
|
|
488
|
+
},
|
|
489
|
+
describe(r) {
|
|
490
|
+
const match = r.games > 1 ? [`A match is ${r.games} games; most wins takes it. Players take turns going first.`] : [];
|
|
491
|
+
const first = r.first === "random" ? "X goes first; who gets to be X is the luck of the draw." : `X goes first, and the ${r.first === "seat1" ? "first" : "second"} seat is X.`;
|
|
492
|
+
if (r.board === "ultimate") {
|
|
493
|
+
return [
|
|
494
|
+
"Nine small Tic-Tac-Toe boards make one big one. Take turns putting your mark in a square.",
|
|
495
|
+
"The square you pick says where the other player goes next: play the top-right square of a small board, and they must play in the top-right small board.",
|
|
496
|
+
"Three in a row in a small board wins that board. If you're sent to a board that's finished, play in any open one.",
|
|
497
|
+
"Win three small boards in a row to win. If every board is finished first, it's a draw.",
|
|
498
|
+
first,
|
|
499
|
+
...match,
|
|
500
|
+
];
|
|
501
|
+
}
|
|
502
|
+
return [
|
|
503
|
+
`Take turns putting your mark on a ${r.size}×${r.size} board.`,
|
|
504
|
+
`${["Three", "Four", "Five", "Six"][r.line - 3]} in a row wins: across, down or on a slant.${r.line < r.size ? " More than that in a row wins too." : ""}`,
|
|
505
|
+
"If the board fills up first, it's a draw.",
|
|
506
|
+
first,
|
|
507
|
+
...match,
|
|
508
|
+
];
|
|
509
|
+
},
|
|
510
|
+
newGame: newTicTacToe,
|
|
511
|
+
apply,
|
|
512
|
+
view,
|
|
513
|
+
bot,
|
|
514
|
+
// The big boards are searched; three in a row is known by heart.
|
|
515
|
+
heavy: (s, seat) => s.phase === "playing" && s.turn === seat && !(s.rules.size === 3 && s.rules.line === 3 && !ultimate(s)),
|
|
516
|
+
thinkingTime: (s) => thinkFor(Math.min(openCells(s).length, 6), s.last === null ? 0.7 : 1),
|
|
517
|
+
summary(s) {
|
|
518
|
+
const over = s.phase === "finished";
|
|
519
|
+
return {
|
|
520
|
+
game: "tictactoe",
|
|
521
|
+
rules: s.rules.name,
|
|
522
|
+
phase: s.phase,
|
|
523
|
+
over,
|
|
524
|
+
hand: s.round,
|
|
525
|
+
scoreLine: `${s.wins[0]} to ${s.wins[1]}${s.draws ? ` · ${s.draws} drawn` : ""}`,
|
|
526
|
+
order: over ? order(s) : null,
|
|
527
|
+
winners: over ? winners(s) : null,
|
|
528
|
+
teams: false,
|
|
529
|
+
seats: s.seats,
|
|
530
|
+
};
|
|
531
|
+
},
|
|
532
|
+
};
|
|
533
|
+
/** Tic-Tac-Toe, with resigning, draw offers and taking a move back (see offers.ts). */
|
|
534
|
+
export const ticTacToe = withOffers(rules, {
|
|
535
|
+
takeBack: true,
|
|
536
|
+
settle: settleMatch,
|
|
537
|
+
// The 3×3 game is known to the end, so a level position is a drawn one however early; the bigger boards aren't judged.
|
|
538
|
+
levelAfter: 2,
|
|
539
|
+
standing: (s, seat) => (s.rules.board === "single" && s.rules.size === 3 && s.rules.line === 3 ? solve3([...s.cells], s.turn) * (s.turn === seat ? 1 : -1) : null),
|
|
540
|
+
});
|
|
541
|
+
//# sourceMappingURL=tictactoe.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tictactoe.js","sourceRoot":"","sources":["../src/tictactoe.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,KAAK,EAAE,WAAW,EAAE,KAAK,EAAmE,MAAM,YAAY,CAAC;AACvJ,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,eAAe,EAAE,UAAU,EAAE,UAAU,EAAE,QAAQ,EAAE,GAAG,EAAkB,MAAM,YAAY,CAAC;AAe3I,MAAM,CAAC,MAAM,gBAAgB,GAAmB,EAAE,EAAE,EAAE,mBAAmB,EAAE,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;AAC/J,MAAM,CAAC,MAAM,iBAAiB,GAAmB,EAAE,EAAE,EAAE,oBAAoB,EAAE,IAAI,EAAE,wBAAwB,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;AAC9K,MAAM,CAAC,MAAM,aAAa,GAAmB,EAAE,EAAE,EAAE,gBAAgB,EAAE,IAAI,EAAE,sBAAsB,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;AAClK,MAAM,CAAC,MAAM,MAAM,GAAmB,EAAE,EAAE,EAAE,kBAAkB,EAAE,IAAI,EAAE,+BAA+B,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;AACvK,MAAM,OAAO,GAAG,CAAC,gBAAgB,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,CAAC,CAAC;AAC7E,MAAM,KAAK,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;AAmC7C,MAAM,QAAQ,GAAG,CAAC,CAA4B,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,KAAK,UAAU,CAAC;AAChF,8CAA8C;AAC9C,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,KAAqB,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,KAAK,KAAK,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;AAC/F,MAAM,KAAK,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC;AAEzC,SAAS,UAAU,CAAC,CAAiB;IACnC,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IAC1B,CAAC,CAAC,KAAK,GAAG,KAAK,CAAO,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACxC,CAAC,CAAC,MAAM,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAO,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC1D,CAAC,CAAC,MAAM,GAAG,IAAI,CAAC;IAChB,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC;IACjB,CAAC,CAAC,IAAI,GAAG,IAAI,CAAC;IACd,CAAC,CAAC,GAAG,GAAG,IAAI,CAAC;IACb,CAAC,CAAC,WAAW,GAAG,IAAI,CAAC;IACrB,CAAC,CAAC,KAAK,GAAG,SAAS,CAAC;IACpB,CAAC,CAAC,KAAK,GAAG,KAAK,CAAU,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC9C,CAAC,CAAC,SAAS,GAAG,IAAI,CAAC;AACrB,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,KAAqB,EAAE,KAAa,EAAE,IAAY;IAC7E,MAAM,CAAC,GAAG,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,IAAI,KAAK,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAoB,CAAC;IACtH,CAAC,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpG,UAAU,CAAC,CAAC,CAAC,CAAC;IACd,OAAO,CAAC,CAAC;AACX,CAAC;AAED,sGAAsG;AAEtG,2FAA2F;AAC3F,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAC7G,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AACxF,+CAA+C;AAC/C,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,KAAa,EAAE,IAAY,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC,EAAE,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC;AACjJ,MAAM,MAAM,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAU,CAAC;AACjH,MAAM,KAAK,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;AAC1C,MAAM,OAAO,GAAG,CAAC,EAA0B,EAAE,GAAY,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC;AAExH,sCAAsC;AACtC,MAAM,UAAU,SAAS,CAAC,CAA0E;IAClG,IAAI,CAAC,CAAC,KAAK,KAAK,SAAS;QAAE,OAAO,EAAE,CAAC;IACrC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;QAAE,OAAO,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC5E,OAAO,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,MAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,MAAM,KAAK,IAAI,IAAI,CAAC,CAAC,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAChJ,CAAC;AAED,kFAAkF;AAClF,SAAS,KAAK,CAAC,CAAiB,EAAE,IAAY,EAAE,IAAY;IAC1D,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IACrB,CAAC,CAAC,IAAI,GAAG,IAAI,CAAC;IACd,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;QACjB,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC;QACvB,MAAM,IAAI,GAAG,WAAW,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC;QAC/E,IAAI,IAAI,EAAE,CAAC;YACT,CAAC,CAAC,GAAG,GAAG,IAAI,CAAC;YACb,OAAO,KAAK,CAAC;QACf,CAAC;QACD,OAAO,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;IAC1D,CAAC;IACD,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5B,MAAM,MAAM,GAAG,CAAC,CAAC,MAAO,CAAC;IACzB,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC;QAAE,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC;SACrE,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC;QAAE,MAAM,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC;IACxF,2FAA2F;IAC3F,CAAC,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC/D,MAAM,GAAG,GAAG,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;IAC5C,IAAI,GAAG,EAAE,CAAC;QACR,CAAC,CAAC,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QAC3D,OAAO,KAAK,CAAC;IACf,CAAC;IACD,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;AACzD,CAAC;AAED,oGAAoG;AAEpG,4GAA4G;AAC5G,SAAS,SAAS,CAAC,CAAiB;IAClC,MAAM,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC;IACrC,OAAO,IAAI,IAAI,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAE,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAE,CAAC,GAAG,IAAI,CAAC;AAC/D,CAAC;AAED,SAAS,KAAK,CAAC,KAAqB,EAAE,IAAY,EAAE,IAAmB;IACrE,IAAI,IAAI,EAAE,IAAI,KAAK,MAAM,EAAE,CAAC;QAC1B,IAAI,KAAK,CAAC,KAAK,KAAK,QAAQ;YAAE,MAAM,IAAI,SAAS,CAAC,0BAA0B,CAAC,CAAC;QAC9E,MAAM,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC;QACvB,IAAI,SAAS,CAAC,CAAC,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,CAAC;YAC7B,0BAA0B;YAC1B,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC;YACb,CAAC,CAAC,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;YACzB,UAAU,CAAC,CAAC,CAAC,CAAC;QAChB,CAAC;QACD,OAAO,CAAC,CAAC;IACX,CAAC;IACD,IAAI,IAAI,EAAE,IAAI,KAAK,MAAM;QAAE,MAAM,IAAI,SAAS,CAAC,mCAAmC,CAAC,CAAC;IACpF,IAAI,KAAK,CAAC,KAAK,KAAK,SAAS;QAAE,MAAM,IAAI,SAAS,CAAC,oBAAoB,CAAC,CAAC;IACzE,IAAI,KAAK,CAAC,IAAI,KAAK,IAAI;QAAE,MAAM,IAAI,SAAS,CAAC,qBAAqB,CAAC,CAAC;IACpE,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC/B,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,IAAI,GAAG,CAAC,IAAI,IAAI,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM;QAAE,MAAM,IAAI,SAAS,CAAC,0BAA0B,CAAC,CAAC;IACvH,IAAI,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI;QAAE,MAAM,IAAI,SAAS,CAAC,uBAAuB,CAAC,CAAC;IAC7E,IAAI,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACpB,IAAI,KAAK,CAAC,MAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,IAAI;YAAE,MAAM,IAAI,SAAS,CAAC,+BAA+B,CAAC,CAAC;QAChG,IAAI,KAAK,CAAC,MAAM,KAAK,IAAI,IAAI,KAAK,CAAC,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC;YAAE,MAAM,IAAI,SAAS,CAAC,uCAAuC,CAAC,CAAC;IAC5H,CAAC;IACD,MAAM,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC;IACvB,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IACjC,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;IACvB,CAAC,CAAC,SAAS,GAAG,GAAG,GAAG,CAAC,IAAI,CAAC,UAAU,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,KAAK,IAAI,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC;IAClF,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,CAAC,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC;QACrB,OAAO,CAAC,CAAC;IACX,CAAC;IACD,IAAI,GAAG,KAAK,KAAK,EAAE,CAAC;QAClB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAE,IAAI,CAAC,CAAC;QACnB,CAAC,CAAC,WAAW,GAAG,IAAI,CAAC;IACvB,CAAC;;QAAM,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC;IACpB,MAAM,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC;IAC/B,CAAC,CAAC,SAAS,GAAG,GAAG,KAAK,KAAK,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,IAAI,CAAC,QAAQ,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,KAAK,YAAY,CAAC,CAAC,CAAC,cAAc,CAAC;IAC1I,CAAC,CAAC,KAAK,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC;IAC/C,OAAO,CAAC,CAAC;AACX,CAAC;AAED,mIAAmI;AACnI,SAAS,KAAK,CAAC,CAAiB;IAC9B,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,IAAwB,CAAC;IAC1C,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC5C,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC;AACnC,CAAC;AACD,MAAM,OAAO,GAAG,CAAC,CAAiB,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAE,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAE9G,oGAAoG;AAEpG,MAAM,CAAC,GAA8B,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;AACxF,MAAM,CAAC,GAA8B,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;AACzF,MAAM,MAAM,GAAG,CAAC,CAAiB,EAAE,IAAY,EAAc,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;AAEjH,MAAM,KAAK,GAAG,CAAC,KAAK,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;AAC1C,MAAM,KAAK,GAAG,CAAC,MAAM,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;AAC1C,MAAM,QAAQ,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC;AAEjH,2DAA2D;AAC3D,SAAS,MAAM,CAAC,CAAiB;IAC/B,IAAI,QAAQ,CAAC,CAAC,CAAC;QAAE,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC;IACjI,IAAI,CAAC,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC;QAAE,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACtF,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;AACjF,CAAC;AACD,MAAM,MAAM,GAAG,CAAC,IAA+B,EAAE,IAAY,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,UAAU,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;AAE7I,MAAM,IAAI,GAAG,CAAC,CAAiB,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,KAAK,UAAU,CAAC,CAAC,CAAC,kCAAkC,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,gBAAgB,CAAC,CAAC;AAE9K,SAAS,IAAI,CAAC,CAAiB,EAAE,IAAY;IAC3C,MAAM,IAAI,GAAG,CAAC,CAAC,KAAK,KAAK,UAAU,CAAC;IACpC,MAAM,IAAI,GAAG,CAAC,CAAC,KAAK,KAAK,SAAS,IAAI,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC;IACtD,MAAM,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC;IAC/B,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IAC1B,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACjC,MAAM,KAAK,GAAoC,EAAE,CAAC;IAClD,IAAI,CAAC,CAAC,IAAI,KAAK,IAAI;QAAE,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IAChE,KAAK,MAAM,IAAI,IAAI,CAAC,CAAC,GAAG,IAAI,EAAE;QAAE,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAClE,MAAM,IAAI,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;IAC1B,MAAM,IAAI,GAAc;QACtB,EAAE,EAAE,OAAO;QACX,KAAK,EAAE,OAAO;QACd,IAAI,EAAE,CAAC;QACP,GAAG,MAAM,CAAC,CAAC,CAAC;QACZ,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAC7D,KAAK;QACL,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI;KACjD,CAAC;IACF,IAAI,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;QAChB,IAAI,CAAC,MAAM,GAAG;YACZ,IAAI,EAAE,CAAC;YACP,IAAI,EAAE,CAAC;YACP,MAAM,EAAE,CAAC,CAAC,MAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;gBAC/B,KAAK,EAAE,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI;gBACvC,KAAK,EAAE,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS;gBAC7D,KAAK,EAAE,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,UAAU,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS;gBAClG,MAAM,EAAE,CAAC,KAAK,IAAI;gBAClB,MAAM,EAAE,CAAC,CAAC,KAAK,KAAK,SAAS,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,MAAM,KAAK,IAAI,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC;aACrF,CAAC,CAAC;SACJ,CAAC;IACJ,CAAC;IACD,MAAM,UAAU,GAAG,CAAC,CAAC,WAAW,KAAK,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,KAAK,YAAY,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,WAAW,CAAC,cAAc,CAAC,CAAC,KAAK,EAAE,CAAC;IACvH,OAAO;QACL,IAAI,EAAE,WAAW;QACjB,KAAK,EAAE,CAAC,CAAC,KAAK;QACd,EAAE,EAAE,IAAI;QACR,KAAK,EAAE,KAAK;QACZ,KAAK,EAAE,CAAC,CAAC,KAAK;QACd,IAAI,EAAE,CAAC,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI;QAC3C,KAAK,EAAE,CAAC,IAAI,CAAC;QACb,QAAQ,EAAE,EAAE;QACZ,OAAO,EAAE,CAAC,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI;QACzF,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,OAAO,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,KAAK,SAAS,IAAI,CAAC,CAAC,IAAI,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC;QACjN,IAAI,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,KAAK,OAAO,CAAC,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,wBAAwB,CAAC,CAAC,CAAC,eAAe,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAC5N,SAAS,EAAE,CAAC,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,wBAAwB,CAAC,CAAC,CAAC,IAAI,CAAC;QAClE,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;QACzD,MAAM,EACJ,IAAI,IAAI,CAAC,CAAC,KAAK,KAAK,SAAS;YAC3B,CAAC,CAAC,EAAE,GAAG,EAAE,QAAQ,CAAC,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE;YAC9N,CAAC,CAAC,IAAI;QACV,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAE,CAAC,QAAQ,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAE,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI;KAC9J,CAAC;AACJ,CAAC;AAED,oGAAoG;AACpG,gGAAgG;AAChG,kGAAkG;AAClG,gGAAgG;AAChG,8FAA8F;AAC9F,qBAAqB;AAErB,8GAA8G;AAC9G,MAAM,MAAM,GAAG,IAAI,GAAG,EAAkB,CAAC;AACzC,SAAS,MAAM,CAAC,KAAa,EAAE,IAAY;IACzC,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC;IACrE,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC9B,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,KAAK,CAAC;IACtC,IAAI,IAAI,GAAG,CAAC,CAAC,CAAC;IACd,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QACvC,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,IAAI;YAAE,SAAS;QAChC,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;QAChB,MAAM,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;QACpH,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;QAChB,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAC/B,CAAC;IACD,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IACtB,OAAO,IAAI,CAAC;AACd,CAAC;AAED,mGAAmG;AACnG,MAAM,UAAU,gBAAgB,CAAC,KAAa,EAAE,IAAY;IAC1D,MAAM,KAAK,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC;IACzB,IAAI,IAAI,GAAG,CAAC,CAAC,CAAC;IACd,IAAI,KAAK,GAAa,EAAE,CAAC;IACzB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3B,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,IAAI;YAAE,SAAS;QAChC,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;QAChB,MAAM,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;QACpH,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;QAChB,IAAI,KAAK,GAAG,IAAI;YAAE,CAAC,IAAI,EAAE,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;aAC1C,IAAI,KAAK,KAAK,IAAI;YAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACzC,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,kGAAkG;AAClG,kGAAkG;AAClG,MAAM,KAAK,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;AAC3C,MAAM,GAAG,GAAG,GAAG,CAAC;AAChB,iIAAiI;AACjI,SAAS,IAAI,CAAC,KAAa,EAAE,CAAS,EAAE,IAAY,EAAE,IAAY,EAAE,IAAY;IAC9E,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;IAC1B,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;IAC1B,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,KAAK,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAU,EAAE,CAAC;QAClE,KAAK,IAAI,KAAK,GAAG,CAAC,GAAG,IAAI,EAAE,KAAK,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC;YAC/C,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,KAAK,CAAC;YAC3B,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,KAAK,CAAC;YAC3B,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC;YAChC,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC;YAChC,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC;gBAAE,SAAS;YAC/F,IAAI,IAAI,GAAG,CAAC,CAAC;YACb,IAAI,MAAM,GAAG,CAAC,CAAC;YACf,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC9B,MAAM,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;gBACrD,IAAI,CAAC,KAAK,IAAI;oBAAE,IAAI,EAAE,CAAC;qBAClB,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,SAAS;oBAAE,MAAM,EAAE,CAAC;YACnD,CAAC;YACD,IAAI,CAAC,MAAM;gBAAE,KAAK,IAAI,IAAI,KAAK,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAE,CAAC;YAC1E,IAAI,CAAC,IAAI,IAAI,MAAM;gBAAE,IAAI,IAAI,MAAM,KAAK,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,CAAE,GAAG,GAAG,CAAC;QAC7F,CAAC;IACH,CAAC;IACD,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;AACvB,CAAC;AAED,oGAAoG;AACpG,SAAS,UAAU,CAAC,KAAa,EAAE,CAAS;IAC1C,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC/D,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,KAAK,CAAC;IACzB,IAAI,KAAK,CAAC,MAAM,KAAK,KAAK,CAAC,MAAM;QAAE,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5F,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE;QAC9B,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACtB,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACtB,KAAK,IAAI,EAAE,GAAG,CAAC,CAAC,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,EAAE;YAAE,KAAK,IAAI,EAAE,GAAG,CAAC,CAAC,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,EAAE;gBAAE,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC,KAAK,IAAI;oBAAE,OAAO,IAAI,CAAC;QACvL,OAAO,KAAK,CAAC;IACf,CAAC,CAAC,CAAC;IACH,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC;AACpC,CAAC;AAED,SAAS,WAAW,CAAC,CAAiB,EAAE,IAAY,EAAE,IAAkB;IACtE,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC;IACvB,MAAM,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC;IAC1B,MAAM,KAAK,GAAG,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;IAC3B,MAAM,MAAM,GAAG,UAAU,CAAC,KAAK,EAAE,CAAC,CAAC;SAChC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QACZ,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;QACvD,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,GAAG,IAAI,GAAG,IAAI,EAAE,EAAE,CAAC;IAC7D,CAAC,CAAC;SACD,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;IACrC,0DAA0D;IAC1D,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,IAAI,GAAG,CAAC,CAAC;IAC/C,IAAI,GAAG;QAAE,OAAO,GAAG,CAAC,IAAI,CAAC;IACzB,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,GAAG,CAAC,CAAC;IAChD,IAAI,KAAK;QAAE,OAAO,KAAK,CAAC,IAAI,CAAC;IAC7B,0EAA0E;IAC1E,IAAI,IAAI,GAAG,MAAM,CAAC,CAAC,CAAE,CAAC;IACtB,IAAI,OAAO,GAAG,CAAC,QAAQ,CAAC;IACxB,KAAK,MAAM,MAAM,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;QACxC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;QAC1B,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QACnC,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC;QAC1E,sDAAsD;QACtD,IAAI,IAAI,CAAC,MAAM,IAAI,CAAC;YAAE,OAAO,MAAM,CAAC,IAAI,CAAC;QACzC,uFAAuF;QACvF,MAAM,OAAO,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;QAC5J,IAAI,GAAG,GAAG,MAAM,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,CAAC,GAAG,GAAG,CAAC;QAC1E,mFAAmF;QACnF,KAAK,MAAM,MAAM,IAAI,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;YACzC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC;YACjC,IAAI,UAAU,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,MAAM,IAAI,CAAC;gBAAE,GAAG,IAAI,GAAG,GAAG,GAAG,CAAC;YACrH,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;QAC5B,CAAC;QACD,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;QAC1B,IAAI,GAAG,GAAG,OAAO;YAAE,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACrD,CAAC;IACD,OAAO,IAAI,CAAC,IAAI,CAAC;AACnB,CAAC;AAED,8FAA8F;AAC9F,4BAA4B;AAC5B,MAAM,WAAW,GAAG,CAAC,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC;AAC1D,SAAS,KAAK,CAAC,CAAiB,EAAE,IAAY;IAC5C,MAAM,MAAM,GAAG,CAAC,CAAC,MAAO,CAAC;IACzB,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3B,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;QACvB,IAAI,IAAI,KAAK,IAAI;YAAE,KAAK,IAAI,GAAG,GAAG,WAAW,CAAC,CAAC,CAAE,CAAC;aAC7C,IAAI,OAAO,IAAI,KAAK,QAAQ;YAAE,KAAK,IAAI,GAAG,GAAG,WAAW,CAAC,CAAC,CAAE,CAAC;aAC7D,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;YACvB,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;gBACvB,IAAI,IAAI,GAAG,CAAC,CAAC;gBACb,IAAI,MAAM,GAAG,CAAC,CAAC;gBACf,KAAK,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;oBAClB,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;oBAChC,IAAI,CAAC,KAAK,IAAI;wBAAE,IAAI,EAAE,CAAC;yBAClB,IAAI,CAAC,KAAK,IAAI;wBAAE,MAAM,EAAE,CAAC;gBAChC,CAAC;gBACD,IAAI,CAAC,MAAM;oBAAE,KAAK,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAE,GAAG,WAAW,CAAC,CAAC,CAAE,CAAC;gBACzD,IAAI,CAAC,IAAI;oBAAE,KAAK,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAE,GAAG,WAAW,CAAC,CAAC,CAAE,CAAC;YAC3D,CAAC;QACH,CAAC;IACH,CAAC;IACD,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;QACvB,MAAM,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QACrC,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,MAAM,CAAC;QACnD,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC,MAAM,CAAC;QAC9E,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC;QAC5C,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM;YAAE,KAAK,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACvD,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI;YAAE,KAAK,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,GAAG,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACzD,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,+FAA+F;AAC/F,SAAS,MAAM,CAAC,CAAiB,EAAE,IAAY,EAAE,KAAa,EAAE,KAAa,EAAE,IAAY;IACzF,MAAM,KAAK,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;IAC3B,IAAI,KAAK,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;IACvC,IAAI,IAAI,GAAG,CAAC,QAAQ,CAAC;IACrB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,IAAI,GAAG,EAAE,GAAG,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,MAAO,CAAC,EAAE,CAAC;QACnE,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;QACpC,0CAA0C;QAC1C,MAAM,KAAK,GAAG,GAAG,KAAK,KAAK,CAAC,CAAC,CAAC,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC;QACzH,IAAI,KAAK,GAAG,IAAI;YAAE,IAAI,GAAG,KAAK,CAAC;QAC/B,IAAI,IAAI,GAAG,KAAK;YAAE,KAAK,GAAG,IAAI,CAAC;QAC/B,IAAI,KAAK,IAAI,IAAI;YAAE,MAAM;IAC3B,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,gBAAgB,CAAC,CAAiB,EAAE,IAAY,EAAE,KAAa,EAAE,IAAkB;IAC1F,MAAM,KAAK,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;IAC3B,8EAA8E;IAC9E,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;IACnD,IAAI,IAAI,GAAG,KAAK,CAAC,CAAC,CAAE,CAAC;IACrB,IAAI,SAAS,GAAG,CAAC,QAAQ,CAAC;IAC1B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,IAAI,GAAG,EAAE,GAAG,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,MAAO,CAAC,EAAE,CAAC;QACnE,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;QACpC,MAAM,KAAK,GAAG,CAAC,GAAG,KAAK,KAAK,CAAC,CAAC,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,GAAG,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,GAAG,IAAI,EAAE,CAAC;QACxI,IAAI,KAAK,GAAG,SAAS;YAAE,CAAC,IAAI,EAAE,SAAS,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAC3D,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,GAAG,CAAC,CAAiB,EAAE,IAAY,EAAE,KAAgB,EAAE,OAAqB,IAAI,CAAC,MAAM;IAC9F,IAAI,CAAC,CAAC,KAAK,KAAK,QAAQ;QAAE,OAAO,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;IACzE,IAAI,CAAC,CAAC,KAAK,KAAK,SAAS,IAAI,CAAC,CAAC,IAAI,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAC1D,MAAM,IAAI,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;IAC1B,IAAI,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;QAChB,IAAI,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC;YAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC;QACjF,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,gBAAgB,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC;IACpI,CAAC;IACD,IAAI,CAAC,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;QAC7C,IAAI,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC;YAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC;QACjF,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,CAAC,gBAAgB,CAAC,CAAC,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC;IACnF,CAAC;IACD,+FAA+F;IAC/F,IAAI,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC;QAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC;IAC9G,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC;AAC5D,CAAC;AAED,oGAAoG;AAEpG,SAAS,SAAS,CAAC,KAAc;IAC/B,MAAM,KAAK,GAAG,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAA4B,CAAC;IAC3F,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,KAAK,CAAC,EAAE,CAAC,IAAI,gBAAgB,CAAC;IACxE,MAAM,CAAC,GAAG,EAAE,GAAG,IAAI,EAAE,GAAG,KAAK,EAAE,CAAC;IAChC,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,KAAK,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC;IAC7D,gFAAgF;IAChF,MAAM,IAAI,GAAG,KAAK,KAAK,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACnG,MAAM,IAAI,GAAG,KAAK,KAAK,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClG,OAAO;QACL,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;QAChB,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;QACpB,KAAK;QACL,IAAI;QACJ,IAAI;QACJ,KAAK,EAAE,CAAC,CAAC,KAAK,KAAK,OAAO,IAAI,CAAC,CAAC,KAAK,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ;QACtE,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;KACpE,CAAC;AACJ,CAAC;AAED,MAAM,KAAK,GAA6D;IACtE,EAAE,EAAE,WAAW;IACf,IAAI,EAAE,aAAa;IACnB,KAAK,EAAE,GAAG;IACV,KAAK,EAAE,wCAAwC;IAC/C,OAAO,EAAE,sFAAsF;IAC/F,KAAK,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE;IACrC,KAAK,EAAE,KAAK;IACZ,OAAO,EAAE,OAAO;IAChB,MAAM,EAAE;QACN,EAAE,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC,QAAQ,EAAE,WAAW,CAAC,EAAE,CAAC,UAAU,EAAE,6BAA6B,CAAC,CAAC,EAAE;QACjI,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,wBAAwB,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE;QAC7G,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,6BAA6B,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE;QACpI,EAAE,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,gBAAgB,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC,QAAQ,EAAE,kBAAkB,CAAC,EAAE,CAAC,OAAO,EAAE,gBAAgB,CAAC,EAAE,CAAC,OAAO,EAAE,iBAAiB,CAAC,CAAC,EAAE;QAC/J,EAAE,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,kBAAkB,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,UAAU,CAAC,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,EAAE;KACjI;IACD,SAAS;IACT,QAAQ,CAAC,CAAC;QACR,OAAO,CAAC,CAAC,KAAK,KAAK,QAAQ,IAAI,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,8BAA8B,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAC3H,CAAC;IACD,QAAQ,CAAC,CAAC;QACR,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,KAAK,6DAA6D,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACtH,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,yDAAyD,CAAC,CAAC,CAAC,yBAAyB,CAAC,CAAC,KAAK,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,aAAa,CAAC;QAChL,IAAI,CAAC,CAAC,KAAK,KAAK,UAAU,EAAE,CAAC;YAC3B,OAAO;gBACL,2FAA2F;gBAC3F,yJAAyJ;gBACzJ,mHAAmH;gBACnH,wFAAwF;gBACxF,KAAK;gBACL,GAAG,KAAK;aACT,CAAC;QACJ,CAAC;QACD,OAAO;YACL,qCAAqC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,SAAS;YAC9D,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,8CAA8C,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,oCAAoC,CAAC,CAAC,CAAC,EAAE,EAAE;YAC1J,2CAA2C;YAC3C,KAAK;YACL,GAAG,KAAK;SACT,CAAC;IACJ,CAAC;IACD,OAAO,EAAE,YAAY;IACrB,KAAK;IACL,IAAI;IACJ,GAAG;IACH,iEAAiE;IACjE,KAAK,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,SAAS,IAAI,CAAC,CAAC,IAAI,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;IAC3H,YAAY,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1F,OAAO,CAAC,CAAC;QACP,MAAM,IAAI,GAAG,CAAC,CAAC,KAAK,KAAK,UAAU,CAAC;QACpC,OAAO;YACL,IAAI,EAAE,WAAW;YACjB,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI;YACnB,KAAK,EAAE,CAAC,CAAC,KAAK;YACd,IAAI;YACJ,IAAI,EAAE,CAAC,CAAC,KAAK;YACb,SAAS,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,EAAE;YAChF,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI;YAC7B,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI;YACjC,KAAK,EAAE,KAAK;YACZ,KAAK,EAAE,CAAC,CAAC,KAAK;SACf,CAAC;IACJ,CAAC;CACF,CAAC;AAEF,uFAAuF;AACvF,MAAM,CAAC,MAAM,SAAS,GAAG,UAAU,CAAgD,KAAK,EAAE;IACxF,QAAQ,EAAE,IAAI;IACd,MAAM,EAAE,WAAW;IACnB,uHAAuH;IACvH,UAAU,EAAE,CAAC;IACb,QAAQ,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,KAAK,QAAQ,IAAI,CAAC,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;CACnK,CAAC,CAAC"}
|
package/dist/tricks.d.ts
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { Suit } from "@journey-to-code/rules";
|
|
2
|
+
import type { KCard } from "./kit.js";
|
|
3
|
+
export interface Play {
|
|
4
|
+
seat: number;
|
|
5
|
+
card: KCard;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* The winning play: the highest trump if any was played, else the highest card of the suit led.
|
|
9
|
+
* `suitOf` says which suit a card counts as (Euchre's left bower is a trump), `power` how high it is.
|
|
10
|
+
*/
|
|
11
|
+
export declare function trickWinner(plays: Play[], trump: Suit | null, suitOf: (c: KCard) => Suit, power: (c: KCard) => number): Play;
|
|
12
|
+
/** Cards that follow the suit led, or every card when you have none of it. */
|
|
13
|
+
export declare function following(hand: KCard[], plays: Play[], suitOf: (c: KCard) => Suit): KCard[];
|
|
14
|
+
/** Would this card win the trick if played now? */
|
|
15
|
+
export declare function wouldWin(card: KCard, seat: number, plays: Play[], trump: Suit | null, suitOf: (c: KCard) => Suit, power: (c: KCard) => number): boolean;
|
|
16
|
+
/** For a player who wants this trick: the cheapest card that wins it now, or null. */
|
|
17
|
+
export declare function cheapestWinner(legal: KCard[], seat: number, plays: Play[], trump: Suit | null, suitOf: (c: KCard) => Suit, power: (c: KCard) => number): KCard | null;
|
|
18
|
+
/** For a player who doesn't want it: the strongest card that still loses, else the weakest card. */
|
|
19
|
+
export declare function bestLoser(legal: KCard[], seat: number, plays: Play[], trump: Suit | null, suitOf: (c: KCard) => Suit, power: (c: KCard) => number): KCard;
|
|
20
|
+
/** One number for how strong a card is overall: trumps above everything else. */
|
|
21
|
+
export declare const strength: (c: KCard, trump: Suit | null, suitOf: (c: KCard) => Suit, power: (c: KCard) => number) => number;
|