From 2ae4d3b49fbc9b1564f273b137ae8ba132d52c65 Mon Sep 17 00:00:00 2001 From: Bobydeluxe <337467661+Bobydeluxe@users.noreply.github.com> Date: Fri, 23 Oct 2026 19:33:18 +0200 Subject: [PATCH 1/4] Add UNO with bots and customizable table rules --- .github/workflows/build.yml | 1 + .github/workflows/uno.yml | 53 + Makefile | 2 +- README.md | 5 +- docs/media/thumb_uno.png | Bin 0 -> 25578 bytes docs/play.md | 24 + games/games.json | 19 + games/uno/.gitignore | 2 + games/uno/ASSETS.md | 37 + games/uno/Makefile | 20 + games/uno/README.md | 135 ++ games/uno/VALIDATION.md | 126 ++ games/uno/docs/challenge.png | Bin 0 -> 11815 bytes games/uno/docs/gameplay.png | Bin 0 -> 22733 bytes games/uno/docs/interface.png | Bin 0 -> 37978 bytes games/uno/docs/launcher.png | Bin 0 -> 26467 bytes games/uno/docs/menu.png | Bin 0 -> 12095 bytes games/uno/docs/result.png | Bin 0 -> 10167 bytes games/uno/docs/review.png | Bin 0 -> 17820 bytes games/uno/docs/settings.png | Bin 0 -> 14623 bytes games/uno/docs/table-rules.png | Bin 0 -> 12156 bytes games/uno/docs/variants.png | Bin 0 -> 17493 bytes games/uno/src/assets.h | 2579 +++++++++++++++++++++++++++ games/uno/src/icon.png | Bin 0 -> 3732 bytes games/uno/src/main.c | 466 +++++ games/uno/src/save.h | 59 + games/uno/src/uno.c | 216 +++ games/uno/src/uno.h | 42 + games/uno/tests/eadk.h | 12 + games/uno/tests/legacy-save.bin | Bin 0 -> 768 bytes games/uno/tests/test_arm.py | 132 ++ games/uno/tests/test_engine.c | 143 ++ games/uno/tests/test_integration.py | 133 ++ games/uno/tests/test_ui.c | 100 ++ games/uno/tools/assets.json | 8 + games/uno/tools/assets.py | 59 + games/uno/tools/build.py | 59 + games/uno/tools/test.py | 11 + launcher/lang/fr.txt | 4 +- launcher/lang/zh.txt | 4 +- tests/test_games.py | 6 + 41 files changed, 4453 insertions(+), 4 deletions(-) create mode 100644 .github/workflows/uno.yml create mode 100644 docs/media/thumb_uno.png create mode 100644 games/uno/.gitignore create mode 100644 games/uno/ASSETS.md create mode 100644 games/uno/Makefile create mode 100644 games/uno/README.md create mode 100644 games/uno/VALIDATION.md create mode 100644 games/uno/docs/challenge.png create mode 100644 games/uno/docs/gameplay.png create mode 100644 games/uno/docs/interface.png create mode 100644 games/uno/docs/launcher.png create mode 100644 games/uno/docs/menu.png create mode 100644 games/uno/docs/result.png create mode 100644 games/uno/docs/review.png create mode 100644 games/uno/docs/settings.png create mode 100644 games/uno/docs/table-rules.png create mode 100644 games/uno/docs/variants.png create mode 100644 games/uno/src/assets.h create mode 100644 games/uno/src/icon.png create mode 100644 games/uno/src/main.c create mode 100644 games/uno/src/save.h create mode 100644 games/uno/src/uno.c create mode 100644 games/uno/src/uno.h create mode 100644 games/uno/tests/eadk.h create mode 100644 games/uno/tests/legacy-save.bin create mode 100644 games/uno/tests/test_arm.py create mode 100644 games/uno/tests/test_engine.c create mode 100644 games/uno/tests/test_integration.py create mode 100644 games/uno/tests/test_ui.c create mode 100644 games/uno/tools/assets.json create mode 100644 games/uno/tools/assets.py create mode 100644 games/uno/tools/build.py create mode 100644 games/uno/tools/test.py diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 0602184c..49628a8f 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -86,6 +86,7 @@ jobs: make -C games/doodlejump host test make -C games/stickmanhook host test make -C games/coreball host test + make -C games/uno test HOST_CC=gcc diff --git a/.github/workflows/uno.yml b/.github/workflows/uno.yml new file mode 100644 index 00000000..32f7a609 --- /dev/null +++ b/.github/workflows/uno.yml @@ -0,0 +1,53 @@ +name: UNO + +on: + pull_request: + paths: + - 'games/uno/**' + - 'games/common/**' + - 'launcher/src/**' + - 'games/games.json' + - 'Makefile' + - 'tools/emu.py' + - 'tools/gen_games.py' + - 'tools/npmodule.py' + - '.github/workflows/uno.yml' + workflow_dispatch: + +permissions: + contents: read + +jobs: + game: + runs-on: ubuntu-24.04 + steps: + - uses: actions/checkout@v4 + - name: ARM toolchain + run: | + v=15.2.1-1.1 + curl -fsSL "https://github.com/xpack-dev-tools/arm-none-eabi-gcc-xpack/releases/download/v$v/xpack-arm-none-eabi-gcc-$v-linux-x64.tar.gz" | tar -xz -C "$RUNNER_TEMP" + echo "$RUNNER_TEMP/xpack-arm-none-eabi-gcc-$v/bin" >> "$GITHUB_PATH" + - uses: actions/setup-node@v4 + with: + node-version: 20 + - uses: actions/setup-python@v5 + with: + python-version: '3.12' + - name: Tools + run: | + npm install -g nwlink@1.0.0 + pip install pillow==11.3.0 numpy pyelftools unicorn==2.1.4 + - name: Standalone and NumPlay module builds + run: make build/data/apps/UNO.nwa build/data/modules/uno.o NWLINK=nwlink + - name: Card rules, single-game wins and save migration + run: make -C games/uno test HOST_CC=gcc + - name: ARM controls and firmware memory guards + run: python3 games/uno/tests/test_arm.py --nwlink nwlink + - name: NumPlay launcher, shared saves and reinstall backup + run: python3 games/uno/tests/test_integration.py --nwlink nwlink + - name: Repository save-and-exit scenario + run: python3 tests/test_games.py build/data/apps --game uno + - uses: actions/upload-artifact@v4 + with: + name: UNO + path: build/data/apps/UNO.nwa diff --git a/Makefile b/Makefile index c683fb0e..ae93ef1b 100644 --- a/Makefile +++ b/Makefile @@ -52,7 +52,7 @@ APP_SPACE_APPS = HillClimbRacing # the games that fit it (NumPlay draws their text there: see launcher/src/compat.c) UPSILON_RAM = 107674 UPSILON_GAMES = crossyroad blockblast suika portal tetris dinorun doodlejump chess flappybird flappydunk towerblock coreball pacman \ - snake connectfour solitaire g2048 minesweeper breakout twoplayer invaders sudoku uttt sokoban + snake connectfour solitaire g2048 minesweeper breakout twoplayer invaders sudoku uttt sokoban uno # NumPlay and its discreet versions: the same app, with another name and icon # on the calculator's home screen. Each one is a release file. diff --git a/README.md b/README.md index ece2d770..f9541a69 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@

NumPlay

- 29 free games for your NumWorks calculator, in one app.
+ 30 free games for your NumWorks calculator, in one app.
Plus 21 big games that install on their own. For the N0110, N0115 and N0120, in English, French and Chinese.

@@ -82,6 +82,7 @@ All of these come in one app, **NumPlay.nwa**. Sudoku
Sudoku
Ultimate Tic-Tac-Toe
Ultimate Tic-Tac-Toe
Sokoban
Sokoban
+ UNO
UNO
@@ -306,6 +307,8 @@ Read **[Make your own NumWorks game](docs/make-a-game.md)** to go from there, an ## Credits +- **[Bobydeluxe](https://github.com/Bobydeluxe)** made **[UNO](games/uno/README.md)** for NumPlay: play against one to three bots, choose table rules, and win by emptying your hand. Card and table art by **[AlexDer](https://alexder.itch.io/uno-card-game-asset-pack)**. UNO belongs to Mattel; this is an unofficial fan adaptation. + NumPlay is a fan project, made out of love for these games and for the NumWorks calculator. If you enjoy a game here, go play the original and support the people who made it. NumWorks also has a great community of people making games by hand: try [Numcraft](https://github.com/yannis300307/NumcraftRust), [Celeste Classic](https://github.com/BenchatonDev/Celeste-Numworks), [Tatone26's All the Apps](https://github.com/Tatone26/Numworks-games), the apps on [Nwagyu](https://nwagyu.org/guide/) and [yannis300307's list](https://gist.github.com/yannis300307/9123136f90877107ec0d49ba96b303e5). - **[Tatone26](https://github.com/Tatone26/Numworks-games)**'s **All the Apps** inspired NumPlay's list of classics. Flappy Bird, Pac-Man, Snake, Connect Four, Solitaire and 2048 are written in C for NumPlay and keep its options, with no code copied from it. Tetris is Tatone26's own, which they released into the public domain, adapted for NumPlay. diff --git a/docs/media/thumb_uno.png b/docs/media/thumb_uno.png new file mode 100644 index 0000000000000000000000000000000000000000..73542b8e63bd3a5a2125ee8bbba657b798d25215 GIT binary patch literal 25578 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 + + +## UNO + +Play against one, two or three bots. Create a table in three steps: Players, +Rules, then Ready. The first player with no cards wins; there are no points. +Classic card effects are the default, with optional +2/+4 stacking, drawing until +playable, forced drawn play and automatic UNO. Stacked +4 disables challenges. + +| Key | What it does | +| --- | --- | +| **Left / Right** | Select a card, including while bots play | +| **OK / EXE** | Play the selected card or confirm a choice | +| **Up / Down** | Action buttons / return to your hand | +| **1** | Draw or accept a draw penalty | +| **2** | Keep the drawn card, if allowed | +| **0** | Call UNO or catch a bot that forgot | +| **Back** | Pause; return from menus | +| **Home / Power** | Save and quit | + +The turn banner and gold outline identify the current player. DRAW and DISCARD +are separate piles; the color tile names the active color. Gold dots mark cards +you can play. The selected card is enlarged, with its name and playability below. +`Play again` keeps the same table rules. [Full rules and credits](../games/uno/README.md). diff --git a/games/games.json b/games/games.json index a8a86cfb..42aa0d36 100644 --- a/games/games.json +++ b/games/games.json @@ -570,6 +570,25 @@ "app": "Sokoban.nwa", "repo": "https://github.com/Mason363/NumPlay/tree/main/games/sokoban" }, + { + "id": "uno", + "rank": 30, + "title": "UNO", + "tagline": "Empty your hand against up to three bots", + "credit": "Game made by Bobydeluxe", + "top": "0x347052", + "bottom": "0x0B2925", + "accent": "0xFFD75B", + "colors": 32, + "records": [ + "uno.sav" + ], + "shots": [ + "docs/gameplay.png" + ], + "app": "UNO.nwa", + "repo": "https://github.com/Mason363/NumPlay/tree/main/games/uno" + }, { "id": "retrogo", "rank": 30, diff --git a/games/uno/.gitignore b/games/uno/.gitignore new file mode 100644 index 00000000..fd6aad7f --- /dev/null +++ b/games/uno/.gitignore @@ -0,0 +1,2 @@ +output/ +__pycache__/ diff --git a/games/uno/ASSETS.md b/games/uno/ASSETS.md new file mode 100644 index 00000000..35d130e2 --- /dev/null +++ b/games/uno/ASSETS.md @@ -0,0 +1,37 @@ +# Asset provenance + +Card faces, card back and green table originate from **AlexDer**, +[UNO Card Game Asset Pack](https://alexder.itch.io/uno-card-game-asset-pack). +The user supplied `Uno Game Assets (1).zip`; its SHA-256 is: + +``` +873e5243b3bc15140313becdbfb33c2afc7ed858e49c6f67a6ef5f9706ad9837 +``` + +The author's public replies on that page permit use in projects without limits, +including an MIT-licensed open-source game, and appreciate attribution. The pack +does not contain a separate license text. Its font-license comments distinguish +the original Comic Kings font from the assets: this project includes no font +file from the pack and draws its interface with NumPlay's existing native fonts. +Do not describe the pack as authored by this project or as MIT-licensed code. + +`tools/assets.py` reads only named PNG entries from the supplied ZIP and generates: + +- All 52 colored faces, Wild, Wild +4 and the card back at 44 × 64 pixels, + with a shared 31-color RGB565 palette and transparent row-RLE encoding. +- A 32 × 24 RGB565 sample of `Table_2.png`, smoothly scaled when drawn. +- A 55 × 56 app icon composed from the supplied card art. + +No PDFs, Photoshop files, original-resolution textures, audio or additional +typefaces are included in the game. The pack's “ASSET PACK” banner is not used as +a game logo. The table and cards are the actual supplied artwork, adapted to the +calculator's display and color format. + +To reproduce the generated files with Pillow: + +```sh +python3 tools/assets.py '/path/to/Uno Game Assets (1).zip' +``` + +The generated size/provenance report is `tools/assets.json`. UNO belongs to +Mattel; this is an unofficial fan adaptation without Mattel affiliation. diff --git a/games/uno/Makefile b/games/uno/Makefile new file mode 100644 index 00000000..668b026d --- /dev/null +++ b/games/uno/Makefile @@ -0,0 +1,20 @@ +PYTHON ?= python3 +HOST_CC ?= cc +NWLINK ?= nwlink +TOOLCHAIN ?= +.PHONY: build check module sim-module test test-arm test-integration clean +build check module: + $(PYTHON) tools/build.py --nwlink "$(NWLINK)" $(if $(TOOLCHAIN),--toolchain "$(TOOLCHAIN)") +test: + $(PYTHON) tools/test.py --cc "$(HOST_CC)" +test-arm: build test + $(PYTHON) tests/test_arm.py --nwlink "$(NWLINK)" +test-integration: module + $(PYTHON) tests/test_integration.py --nwlink "$(NWLINK)" +sim-module: + mkdir -p output/sim + $(HOST_CC) -std=c11 -O2 -fPIC $(shell $(NWLINK) eadk-cflags-simulator) -DNP_MODULE=1 -Dmain=np_uno_main -c src/main.c -o output/sim/main.o + $(HOST_CC) -std=c11 -O2 -fPIC -c src/uno.c -o output/sim/uno.o + $(HOST_CC) -r -nostdlib output/sim/main.o output/sim/uno.o -o output/sim-module.o +clean: + $(PYTHON) -c "import shutil; shutil.rmtree('output', ignore_errors=True)" diff --git a/games/uno/README.md b/games/uno/README.md new file mode 100644 index 00000000..a399bd0e --- /dev/null +++ b/games/uno/README.md @@ -0,0 +1,135 @@ +# UNO + +A native, English-language UNO game for NumPlay and NumWorks. One human plays +against one, two or three bots on a 320 × 240 card table, using AlexDer's card art. +No browser, sound files, full-screen framebuffer or runtime asset download is needed. + +This is an unofficial fan adaptation. Game made by **Bobydeluxe**; card and table +art by **AlexDer**. See [ASSETS.md](ASSETS.md) for asset provenance. + +## Play + +Install `output/UNO.nwa` with the usual NumWorks external-app installer. +`Continue` restores the saved match; `New game` opens the table settings. +The app asks before replacing an unfinished game. Changing settings does not +alter the rules of an existing match. + +Creating a table has three visible steps: **Players**, **Rules**, then **Ready**. +The first step previews your seat and the bot seats while you choose the player +count and bot level. The second keeps all five variants on screen +with On/Off switches and an explanation for the selected rule. The last step +summarizes the whole table before `Deal cards`. Back returns to the previous +step without discarding your choices. + +During play, bots sit around the piles, with the current player outlined in +gold. A turn banner stays at the top. `DRAW` and `DISCARD` label the separate +piles, and a named color tile shows the active color, including after Wilds. +Your hand stays in its own lower area; the selected card is enlarged and drawn +in front of its neighbors. Its name, index and playability stay visible below. +You can browse your hand while the bots take their turns. Action buttons show +their shortcuts and keyboard focus skips unavailable actions. + +| Key | Action | +| --- | --- | +| Left / Right | Select a card; hold to scroll large hands | +| OK / EXE | Play the selected card or confirm a menu item | +| Up / Down | Enter the action buttons / return to your hand | +| 1 | Draw a card, or accept a pending draw penalty | +| 2 | Keep the card you just drew, if permitted | +| 0 | Call UNO, prepare the call before playing from two cards, or catch a bot | +| Back | Pause; return from menus | +| Home / Power | Save and exit safely | + +Gold dots mark playable cards. The lifted card has a readable native-text name. +The hand scrolls to show every card; it is never truncated at a small hand limit. +The color tile is the active color, including after a Wild. `S`, `R`, `+2`, `W` +and `+4` in the card corners identify the special cards. + +## Classic rules + +This version plays **one game, won by the first empty hand**, using the +classic 108-card deck and Mattel's +[classic instructions](https://service.mattel.com/instruction_sheets/B0001-Eng.pdf) +and [two-player instructions](https://service.mattel.com/instruction_sheets/53641.pdf) +for card effects. There is no point system or multi-round target. It excludes +the extra customizable cards in some newer physical editions. + +- Deal seven cards each. A high-card draw selects the initial dealer; subsequent + rounds move the dealer clockwise. Opening action cards are applied, and an + opening +4 is returned to the shuffled draw pile. +- Match color, number or symbol. You may draw instead of playing. After drawing, + you may only play the newly drawn card, or keep it and end the turn. +- Skip skips the next player. Reverse changes direction; with two players it + acts as a Skip. +2 makes the next player draw two and miss their turn. +- Wild chooses the color. +4 is legal only if its player holds no card of the + active color. Bluffing is possible: only the target may challenge. A guilty + offender draws four and the target keeps their turn; otherwise the challenger + draws six and loses their turn. A human challenge reveals the offender's hand. +- Call UNO when playing down to one card. You can prepare the call with two + cards or call immediately afterward. A missed call is only penalized when + caught before the next player draws or plays; the penalty is two cards. Bots + have a reaction delay, and sometimes miss calls or fail to catch them. +- The first player with no cards wins the game. A final +2/+4 and any challenge + are resolved before showing the winner. `Play again` starts a fresh game with + the same table rules, or you can return to the menu. +- Exhausted draw piles recycle all discards except the top card. In the rare + finite-deck situation where everyone is blocked with nothing left to draw, + redeal the cards. + +## Optional house rules + +Settings clearly label altered tables as **Custom**. Each option defaults to off. + +| Option | Behavior | +| --- | --- | +| Stack +2 | Play one +2 on a pending +2; the accumulated penalty passes on | +| Stack +4 | Play one +4 on a pending +4; the last chosen color applies | +| Draw until playable | Continue drawing until a playable card appears or the pile cannot refill | +| Force drawn play | A playable drawn card must be played; a drawn Wild still requires a color choice | +| Automatic UNO | Call UNO automatically for every player | + +Stacking never mixes +2 and +4, and stops after a last card: its penalty is paid +before the win is confirmed. **Stacked +4 disables challenges**, a stated house-rule choice +that avoids combining incompatible penalty/challenge interpretations. +`Classic` resets all variants; player count and bot difficulty remain independent +choices. Every table uses the same first-empty-hand winning condition. + +Casual bots choose less carefully. Normal bots favor their remaining colors and +prioritize action cards. Clever bots also consider public opponent card counts and +the direction of play when choosing action cards. Bots never inspect opponents' +hidden hands to decide a play or challenge. + +## Build and validate + +Requires ARM GCC, nwlink 1.0.0, Python and pyelftools. Pillow is only needed to +regenerate assets from the user's original ZIP. Generated assets are committed; +the ZIP is not needed for a normal build. + +```sh +python3 tools/build.py --toolchain /path/to/arm/bin --nwlink /path/to/nwlink +python3 tools/test.py --cc cc +python3 tests/test_arm.py --nwlink /path/to/nwlink +python3 tests/test_integration.py --nwlink /path/to/nwlink +``` + +`make build`, `make test` and `make test-arm` wrap these commands. `HOST_CC`, +`PYTHON`, `NWLINK` and `TOOLCHAIN` can be overridden. +The build creates `output/UNO.nwa`, a symbol-bearing debug NWA, installed binaries +for four firmware/RAM profiles, and `output/module.o` for NumPlay launcher +integration. NumPlay includes UNO in its catalogue and exports the standalone +app as `UNO.nwa`; the module uses the shared graphics, storage and backup. + +The engine uses a bounded 108-card deck and fixed-size hands, with no heap. +Card sprites share a 31-color palette and use transparent row RLE; only a single +44-byte row is decoded at a time. A small original table sample is smoothly +scaled, and the native fonts draw the UI directly. LCD drawing uses 16-row +strips, and an unchanged table sleeps instead of redrawing continuously. + +Saves use a versioned 768-byte record with explicit little-endian fields, CRC32 +and full deck/state validation before loading. Full-storage failures offer retry +or an explicit exit without saving. Standalone builds use NumPlay's existing +Epsilon/Upsilon safe-exit and storage helpers. +Save version 2 also reads version 1: ongoing hands are retained, old point totals +and targets are dropped, and a previously won round becomes a finished game. + +See [VALIDATION.md](VALIDATION.md) for measured size and validation limits. diff --git a/games/uno/VALIDATION.md b/games/uno/VALIDATION.md new file mode 100644 index 00000000..41ea5133 --- /dev/null +++ b/games/uno/VALIDATION.md @@ -0,0 +1,126 @@ +# UNO validation + +Validated locally on 23 October 2026. These are automated host and ARM-emulator +results, **not physical-calculator test results**. + +## Build and memory + +ARM GCC 15.2.1, `-Os`/LTO, nwlink 1.0.0. Release and debug NWAs produce identical +installed bytes for every tested profile. The standalone game and a launcher +module both compile. The catalogue, standalone export, credits and build tests +add UNO only; the other games are unchanged. + +| Measurement | Bytes | +| --- | ---: | +| Distributable `UNO.nwa` | 129,120 | +| Installed code, metadata and art | 103,624 | +| Static RAM, including LCD strip | 11,208 | +| Maximum stack observed during ARM scenarios | 1,040 | +| Save record payload | 768 | +| All 55 card sprites, palette and offsets | 60,895 | +| Table texture | 1,536 | + +Installed size comes from nwlink's actual calculator link, not ELF file size. +Static RAM is `_heap_start - _data_section_start_ram` in the installed ELF. +The observed stack maximum is a scenario measurement, not a mathematical bound. +No game code allocates heap memory. + +| ARM profile | Available application RAM | Result | +| --- | ---: | --- | +| N0120, Epsilon | 153,676 | Passed | +| N0110, Epsilon | 148,928 | Passed | +| N0115 RAM profile, Epsilon | 133,652 | Passed | +| N0110/N0115, Upsilon | 107,674 | Passed | + +The N0115 test uses the older-model CPU/memory layout with its configured RAM +limit; it is not an independently emulated physical N0115 board. Emulator work +estimates average approximately 14 ms per redraw on the N0120 profile and 36 ms +on the older profiles. These are not measured display refresh rates on hardware. +The app only redraws when its visible state changes. + +## Rules engine + +`tools/test.py` builds and runs the C tests with the host compiler. Tests cover: + +- Color, number and action matching; legal Wilds and bluffable +4 cards. +- Two-player Reverse/Skip and multiplayer direction changes. +- One-card draws, voluntary draws, keeping a drawn card, and forbidding play of + a different hand card after drawing. +- Legal and illegal +4 challenges, offender/target penalties and skipped turns. +- Direct victory on an empty hand for humans and bots, including when an + opponent holds only a zero card; last-card +2/+4 resolution before victory. +- UNO pre-call, late self-call, catching, immunity after the next action and + automatic UNO. +- Same-kind penalty stacking, no mixing, no challenge for stacked +4, and no + stacking after going out; draw-until-playable and forced drawn play. +- Exhausted-pile recycling while preserving the top discard and every card. +- 12,000 initial deals checking opening actions and deck composition. +- **1,152 complete single games**, spanning all 32 house-rule combinations, + 2/3/4 players, all three bot difficulties and four seeds per combination. + The final run used 83,450 actions, with no blocked-table redeals. Every step + checked the exact 108-card multiset; the largest simulated hand had 39 cards. +- Save round trips, truncated/invalid saves, semantic state rejection and every + individual bit flip across the entire 768-byte save, without modifying the + live state when a save is invalid. +- A real version-1 save with a 500-point target and accumulated totals migrates + to version 2 with the cards intact and former totals/targets zeroed. A won v1 + round migrates to a finished game. Point fields and calculations are removed + from the live rules engine; the reserved wire slots preserve compatibility. + +## UI and calculator execution + +The host tests validate every RLE row's bounds, real-font help wrapping, large +hands and scrolling, and render screenshots of the menus, table, settings, +variants, instructions, color selection, challenge, evidence, table rules and result. + +The visual table setup has separate Players, Rules and Ready steps, with visible +seats, five on-screen switches and a final summary. Host tests navigate each +step, every switch, the classic reset and returning to earlier steps, verifying +that editing preferences does not mutate an existing match. Text-width checks +cover switch labels, descriptions, card names, action shortcuts and the gap +between the pile labels and active-color label. Table screenshots cover two, +three and four players, bot turns and a large hand. Browsing during bot turns +and skipping unavailable action buttons are exercised too. + +`tests/test_arm.py` runs the **actual ARM application**, including Epsilon/Upsilon +system calls. Each profile exercises menu navigation, bot turns, the real key +mapping, pausing, all help pages, table rules, save-to-menu, new-game replacement +cancellation, continue, Home/Power exits and reload. +The setup scenarios select player counts, enable +2/+4 stacking, restore classic +rules, review the table and return through all setup steps after canceling a +replacement. Setup contains no point target; the HUD, pause menu, help and +result screen contain no scores. Play-again uses the completed game's rules, +even when the saved preferences for a future game differ. + +Additional engine-validated saved positions exercise actual keys for playing, +calling UNO, drawing, rejecting an old hand card after drawing, keeping the new +card, choosing a Wild color, winning and both legal/illegal +4 challenges with +the hand-reveal screen. A completed game records its win once across reloads. +Actual key tests also verify Play again and migration of the real v1 save with +its old totals removed and cards preserved. + +Root Make targets `build/data/apps/UNO.nwa` and `build/data/modules/uno.o` +pass, including a parallel request for both outputs. The module occupies +81,776 bytes of code/read-only data, 4 bytes of initialized data and 11,188 bytes +of BSS in the launcher's shared arena. Root standalone output matches the +game's release byte for byte. + +`tests/test_integration.py` builds the real current launcher with a deliberately +UNO-only test catalogue, using the production catalogue entry and generators. +On N0120/Epsilon and N0110/Upsilon, real keys launch UNO, navigate its three-step +setup, play, save, return to the carousel and re-enter the game. Home exits the +launcher cleanly. The shared `numplay_saves.py` contains the game record; +retaining only Python scripts simulates reinstalling and restores that record +exactly. The maximum observed stack in this launcher scenario is 1,064 bytes. +This focused test is not a complete build or playthrough of all existing games. +The tests also cover a held launch key, a corrupt save and full storage with +retry and explicit exit without saving. An unrelated Python record is preserved. + +Memory guards report no invalid accesses, firmware RAM changes or unintended +flash writes in these scenarios. Exit releases the Home lock where supported +and clears application RAM before returning to firmware. Upsilon makes none of +the Epsilon-only system calls. + +Reports are reproducible in `output/sizes.json` and `output/arm/report.json`. +The screenshots in `docs/` are generated from these tests. Hardware testing is +still needed to confirm firmware-version-specific installation and LCD timing. diff --git a/games/uno/docs/challenge.png b/games/uno/docs/challenge.png new file mode 100644 index 0000000000000000000000000000000000000000..15c6de95fc970483b6e07995e725dbcf37be2c94 GIT binary patch literal 11815 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 TsWgUc{QwkXRHf@B&BFgLb$ZP< literal 0 HcmV?d00001 diff --git a/games/uno/docs/gameplay.png b/games/uno/docs/gameplay.png new file mode 100644 index 0000000000000000000000000000000000000000..3a7e4bfa43ec918b139fa7c4c5c6ab24c4771c63 GIT binary patch literal 22733 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 literal 0 HcmV?d00001 diff --git a/games/uno/docs/interface.png b/games/uno/docs/interface.png new file mode 100644 index 0000000000000000000000000000000000000000..6badf07843bf568649b6865bc10fe3aef9cf76fa GIT binary patch literal 37978 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 literal 0 HcmV?d00001 diff --git a/games/uno/docs/launcher.png b/games/uno/docs/launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..275663937091c4e50cdfd18d0a6915111b559e9e GIT binary patch literal 26467 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 BatQzc literal 0 HcmV?d00001 diff --git a/games/uno/docs/menu.png b/games/uno/docs/menu.png new file mode 100644 index 0000000000000000000000000000000000000000..b3cd969bcf0737d59c41b3e3d58c5668bd24af16 GIT binary patch literal 12095 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 XWu}6==@TJ1F&-czsVGq;W*G24SyO{e literal 0 HcmV?d00001 diff --git a/games/uno/docs/result.png b/games/uno/docs/result.png new file mode 100644 index 0000000000000000000000000000000000000000..5a5a5fff4d7082c72ef3283de69df574d5f21c8b GIT binary patch literal 10167 zcma*NWl&ww5+-^$NN{(D0KwfYxCVDPxVr{8IKkcBJ-E9j1PD%WcXxN0bML%Y^=97u zn5tb}+jn=bZ};l{R!1l+N~0hWA_4#a6j>PwRR91=1hRh#4}{2fC3-;s;ESKEgs8e_ z_F0aj6_HlYLs^soaUdecX5ZKV-1xT0;GZcBl&ae*bO?uCN$zOh{{WOL_%?QM|$On>m z-fnM=B}kjTHSTFQNIm;rT9n-!j3sbx+`Qy$@VWXqvND=L^rPwJKZYpn6385qNJ&*q)cRw7ELfOqNfoXx#mlcR>*umjCQk)skD+N5X$_q68?~{ z3<vlH#S3r70yT{oPWN_?kh6lWN{yW){unek5I=JlHBc&YJOE@+l%4 zmk<>e>^IC#vh*ov`^X8unjy1bjxl?FWN8v^v5t{NNLI6nT_4U?p8W3(zUiGM*Ny33 z+Nl&_vVj^&7`+i$WZWR5UCBHLazDIp*IOe6x5%xJ(X4{TntBH5uXj{}P}v%x@$RVz z#pe(?e+gt=usmi^2ANJPzGo^L+(2T&Ed^M+kZ6})FR7x`{5@f5q1u%Yv95k5;gT++ z13>h(QZzRWj=C&3UccvA%oI8X(c^vwE`(RjJ!-0&Ja|mY>t09m6mQR1XMFC;&CbA( zB#h38j+Qc5wbEL52hk&nTk&54{AA)FT@meZsazgr?q0PZ+d`&S{kTq+U21R*vyFnwlK@&l{gsnT&8K_|*u zpz!cB!}KFzYW-{RuE?C4v>m5K&vZF74p|J-Vrb^GAKgVVzmH;>An{qgJmrD1MC-T-VPSyLN) zha34kv%QQ82ZujWgN2d{LJRLmDj`ZAxzWEz0^^_-mXk+Fa=>OqmXW? zxsBd)!`kqF?OQ)OCLgWvrQR5lG$X)cyDmsndl18d3x2ek9Wjk=lrCYea9!a*13CWD=Hr zhA?Aqx?WT?WgTCd13B)dqE-j!sKSdbhes>k{^>dw>PI=5MbS0@xYs2>xNtZ2fPDz z!xjqT&L{XI646rMz{t>^Ios4QT)4J;NyjHlh?JKo8|4jh8I6wQ`+H+uBK38Ka~z~t znMb;Fb=7q5{?{_nkP)5U99O}i4bkDvW32iVX_}z0-j=6|8;(`o_UNpcE~{p#GJSg zA`=9Ag=MMfs&F{9RuE=TnLiO1at;bPI9-rGuiR`RG zPp2Fd=CFFO5!is2DHLT?*^lyt=w}e8e@kQ0c^mg`>t(^B3^qkF2l98d zW+oS$*8*o>e_kAINUhG3V@v?0O-PCXeD7`K@Jys1Azc(`6Nu+^$<8f{`aQY5V#M>4RVc`K@r6N z`|LM0z{UbE04?$f8W$fRh^(!hk3qYslpWy=#oeB&!ow5W!7oB>6sQ-)$=h^gSe|xt zI>#`>g@&VUf4Ywvr=Ww5tak_((yV1<*3teN7;g>Pt@Tx^mNE5XWRSgZZ zs!Ovj8xBo5 z-ahcpv@t&epgTp$eiU`(ZdThi(r%WmG-}nT-mxP$K0Z>+l&^LPIA+pR??QnNeQij2 zS-rc_x;o>cpMyU2YSdoe#kAME;vL>^?}Yikn(-6HRxvV83oWPOM&=DX0cV)<12#Y` zvcBd_cmB)@#NT5C;U@O({n=sabtm>FYX`k>$ose_hm)6z1Wgkp z=D}|nYuMEXyZH1;{@gnQoHUOJ`#L-Be#$X{_id&)kLQ4q8m$Qq-D&jK)9+5TG?FBN zkELu^D?jUclkxMbC_IZ=P>E7+|A_AKS{#eOGuZP*Q-)Ih4lO6X>}y^D{fMwZf%H)N zunkI_VVB5-ygr~qjgYudYrMBxX0(96OrylopqpLDHG-4p%C-Ijr+3qxc2GDM8*F?G zJ-t@)M9l0jEbdrMK)6Q%?A3u-AD_W^h7THqX;h%d+Idt7ShIpZ$PlnhHd0)v+bB?Dpt4ltj@Vb$Q&qdTV zr@p&=yZR+#KE0eOr58B)!72IDw47?Ouh8Lp(x_8b`p_TOnb*DKlU{k24MVF59AoteiQTiuCv z+eSC~5>D;Ug>b}_Mu7sbts&XpqU#+g6?j(P*1aF(9jZBGuoA`GNbiKdm`;4v&U`E8 z1U0Gc7aAY#H&53wm6R8I&p{H5CSl?s1${yfspo6#LRBTH($=n}{(Rm2|leMwxdZN5CJrNuCFY!NFD%XgJ zKr2V<66d%rk3%YAmmVpiOIWh3b!CYczlWQJgQdG$u3sr{+Dt3z(eQGr`;8(NU0opb zB^;KO&+nRg!&%6TY=D=GcYkU;{S@(=&0T!vI0qyY_D`tadGa@xcqM*F&H9mgI+D}5 zXzei(R~xYv?rUL0`_z9TeO-WW%z+jKybF{_r?tt*=i5N2zW#uK|2v^R-ekjihiG9A zB|>z`_N_j`6$(vRd8NB8+0d&R$0y((06ceFX3>A}6&)l&{hzOfy$^kwo1Zx~l#9}8 zhB_%ixWd*+tIW4C3hw^AX~P%PCjecz9xc`a{M*5y)qXSOIJ9co6EfRF8g3dW(hV(! zJUE}jXG0XB^B!)@k(SYCY&rIKN1PemieT!~Jt{tj@sbJ)ARs^}^bSL3Sy4|Z3wB{z z?S+&BrUMPV&I6v@#%~}Ac)&u9)s*VM)&QgEIJsTfeLVN>0X+K+`J%4Rnjs>Rno!oa zm%9wg$*l8lmv+I@ z{FzpPO+mvbpkjMvMt4(ppS`O}F7=Y3tNK_FM*)2XYheOLB|i^lHOgaOg;x{VepZGV+tkd{$x|{I;o~4-bdP7UNN|IxBtA%*cfw)k>dzao;;nR{M=v(XRI2!E%R5@r; zsOLU|BAL*HzfLN?f4`ye*QsB%E+kuBqyTPM}jkC$RO&ewBBIfTW4avYEZf-|PzVlwk>eCY&qcFl zbZ6SIUlCiPq66BhsWVWOw<2Go1|;42%i*3Fm)UCf_cJQ@lnP{o;069@7_=+Ksx!N5 zm>t@rNNjzl2~PfD93TyG3Y>}hLtbNR{=a{l`T}h3>>fNFNSh@2XsbEs(j89=Ub55u zmNvFFFikM%tjdF4HGQi`HJGeb;d7$2^eAd)VToTr7zyjP*HSUR%<>xph3h=}w7qN6 zOw?Zr_&XyFtNzX@w@1(0cF7}4n@0!0Y%-21IAt=`_KtXwL zZkR+AY}_aWRpLcpNXM)&AB#fns=ds0G4kfXniCP>Q7m7-;qGLh$WGviHtZb`&>h!^ z`$>bnKOO!bnfpRk_k@jh4R+YPG}d0Z?yV5jWr+|hd|PK#eZTO!!REVZs4J7Jtm>y3 zyl2DDJcLsgB7H(n{nH+A47lYbNM6}y-&lXILlsVSM?Hl_xS)GmsxNh43rsx)1b8nB zTVh*UaG`jllxhIip{BycMy2qJy!fL)kb7?2g@%72T4 z|3w_G({g^Rgbq-IV`K$*;-mk6g_|`x5}v%Rzd*joi7gDE8>I%3r0ALbZZ75gecb{G z$e%+Onon>>!6TdeU$iZ8D z`%W+@&DV1gU)hw$J|x{9vr@3oK04|szEjk^u)g_{URxV}Yy0#*sI2ag&R5+X9p}Q* ziz0fX+aFR>eqCc})i(({wb)yEl&8=@DVBRHj;lF*@0b3eoavjd->a0WDa?4URyq|X z@!p(k!W;nekjN-N{-;>@vqJw~Eho~>B|<8-3mt0?6rKo3sU|lfDkb*T0ckbqxEgM! z!MTWN7FVV7_ARF1w~N`1dpIF=hyT9G5e%Z(AD?z5*AY5K>3w1Jk9$kizYvQe#Wyza z#jLb4{9kU+g%l8}cB_<2zT)$OzI(earmBd}%rF2~2f05!%kj8WPIZD7$ zf?cz*kjAl}yQk$-bIkHf|DYZ1?^=<|llZ@xLk)0jXcWgKun zsH{CGmvdy)?*#^99JImv4|$2ZzNVjncp}>+w__g5gShoFy*6a#Qe3^`2f1Cvya5&wm zWxf8&d{Pwfj!gOC$6?s^B!kCNk`&4Jl6%-w>pF4jUHG@CF^}QsK(o8{$1=}2Ia$2d zKlL+|k=l3AoZ*k4%>G+(YQG^@sAT-DZR2UP;yGaV@fyoq#zj*`l!@S&hJWxX_dIeu z3zX(At?RujbxCs9pUVjS(T8!LGL=2Xnxic&&~f9`AZ`mQcMFnRZ^i~S6Q4}gOz*qn zb-1Hl3L2y3H@fg_lvc8~CJU1>D>&5qr#16+y*W$f$Rx|)dJN-h1_9_phg1%lW=G(V z43Os~*J@vuVTXCuSFvugmVmbe8=Zd4U;CvppGI-_&8Ft^M1HCK2KXkCu=9NsV#Zw$ z%rZ9wtECf3Xw3}{1M4(D3_&w&G+OPI2e%ljWX7hI$|^>akkpqi6z&z`(V{#HCQyDH zjqj=?X}hVSTr6*P>xWvWyP^EMsiE)AA9%c!H_AAd63A1dc34|IxcO-B}Hx7QCYTY(}n=*bKC;L)Qj{{bGIN`ke)DqKNL{R?1@>MPm%mH zFn2CNIn=)Lp`&Z%urI(w#^cipS2y(v%&UxaMcHOV#P3Fpn(w zAX7=p@dOPHKgd((hEdE=e6vn@f8n5O)puIh@SRxwtiW+O!o}y3IEP&2Xeukhmf;$< z%4SiRXEF0Nt5q0#IAe&fq7QCQ%l|(hAMe)aAKS@_bK}y|)@jw8XX299t$}>M*rW!O zWVwN5NoGY?qWp$Y!LZtRYJlfeOUt?al)CWqq3t=A)m7zo$b;QilkK}fy06kMrZxP^ zEpV}JA*4pUpO(`JTRnZ-rkFg_U+g&ypbVvL1UO{u144_`0)TJ;w4D{M7euKLsQmt= zwP9E!WB@4~3^G8UY7_3_9m04t<-chgO|b&p$hja>q?12rd2&fZWfR@0e4(Q9mW}R=j zavAJutsq*FRu1IBf7mwi9)40bu)rtV+h4~MZ582B>GOOhvj0G$IDcaoum7xnc%|a- zE{-sZrGb4aVmi3MJ`h3XRfUYb6ke`K)wnxF@UJMIiWe&Yw&wT$HQ+|R(`1Flc zj4@$ab3c*rVlLTeC(ia?r_lCx5}xD87PZj&o^LlEf2KBT)Nw?@06<|c&H3t+hws7o z9jfj13iAeKOL{dMUn+;E86~8DRNzh9h|VFA8^yu56+R#X9q}SC*at#%*G?W}BUv-` z!fB{^=?A4`o(n%$iLj{JZG#S>J&4s?=SJI<{7PIRn!e`ZvXp4e%QmD8*Q#HsX43mO zD;!`R9m8%{))wmMwn=2l#}h|E0vsgb-ziQw=z=J_+e&TWN)N(>HD9mX4o&y0^l$@! zz;kSu6;Ee{JpV$&PNi$Ke`fxu7NmOML{sx~=zk*|7k=%cYTkq^RPy+;()S+hfi0B! z%Hx#{S@XC0F(~MhAdb5F@t^!P9t{;qw^25zj&=z!DmO~E5h}u@`?H_|el4siKasv1 zF*&-|D|!3p8jF1-t&MUwP&*)#Un$Wm6FdeN?#q2cHNZTMDRtwlm`m~H6s)02@gq-I zNi}u-S=r9VMUoop^Xe`^;6Cka>n|Xg(A3Zw_Mt85T`Y6Wk^ie|(vSCa5Gsu`6sPbA zQ&nc#1twXW7pCEO<*N1*jUpUBdR<>ml+ony=xcOi7Vg<);a%@8=9<(1dBGNL3)7`j74Z7$26 z8Or;U^jSSrlm^xK-ReAk!_S(a8~Oxk$b=UE_a!Nki*1BQSO-&PON^|r8ll>(8xdOi zP3*&f`QEl?%1}GDYhq77I%5cDP3wW;n5k3A)$#RNRde@kiDg#^$%EU1EdF#01YoK; zTDUlIxai(zqUR>m!oOTly6YmljFMVHh-*Lt_2HL_FBAvjuZCsYTYfH2$LCNxAmXaR z(aHe(IHnw?o+tl!Kf37@)A4rTtZ|A{vvMRoXhGCo85DoJ>?fl!{rrRKF)Nd105;zJ zOCf=onUz(5=WKPA(PTk05AVf_DbDD&@q5Q8f$Jfq1TR`fkb(;~INm{Cd!p;TLAy;n zNc%za%o++XRf5fWl-qO@YmWl~!#98NQUWLuE%vvV`TYU&6`|;+IvYj5k{={+9nrwS zB*XHshAKO?u3x9QLV5!=4w%PZgTEIT8++v2(l!|xd%RLE96^H5rZNmNM?K*GSCXId zrC<(v1M*#={@-}?-=Oq=7V{wvSZWtatklf(?C_*LTzHdQxq{puad!Ep}9-Fxs9i=w}<>rb3d{3K2V zD?`&syHj7K!`}J$T}@MW+Uhy#OPLRVG4nl4u5FQyvi%HlIKT#|R4{PGR z0L#o7eB>Fw!+QjSAvk3NsnLWr=T+t7NZFCG1V~5(JSe(zbv!RG_j5w(7@eW!NA$J> z!hwFrx|3@;hMt#G^})Lp3E{k~sTz$C*0`f^SDnUwUm*b_&Hk5KlDxc3P06INg0x~t z&h#pykSw#HC+%$%1)bZ?dH3Fz;YF*{Q<>Rv2%m`cEIGFsQl z1es1%4nVw3830~~FU+Ul#|-V)Z+7=PbfL!B8aUv@1jeGD$4W$}iqVmg;OC%W2;}^( ze$22b)|6N}j736k8}^c~+rd6_M>x*hSR-IvP{}+l_h`9%Ph;pI`}rV@jm`137_woE z@^MvJh<`@)(M~PglG*kt=|pWpt?N585})}tBPf6=B!Ef16!Fc~&-!YA4gAH6m?)w+ zk0Bw6eFATGJO(o4mbD;#9c?P11En$!L|I@(@05d|D_Z^P75Bj>2g29$wXCYaj|CT zW+*8s--;q`2m#vZDg-D414C#zZz7dTt{Nly`R_(ZC)1U@%+4W>V>drIluw0c`$F6e z#Xe?6^zIaEv@9f_I44$TGd?+82jVg@bRt1YswP5hOOR5}^A`rfOspo$)mQAYeYC zvb{W+8r?)2_euFi3kXmiy4RhD>iGEyla;y;lllc;nH@k3YL)EVSSdd6!3Ume>n`N? zji!akoJes-3SpN9N?%{*@;x#$1c(mJ@0`3JloEZVtc#+YY3x&%gH($`M!Cxt@!nIv zgz0A%`e|B$b^qyVSU1wfhXDd=f&W>_`St*xZceoKeyrn}EB*6JHe;|dEA2TSQvR>w zd3{QwRP!Mg8qeIa4>}aNh?}eVIipt-F~VfR>^e(W&s?(J^zgXBpP?n92;Udtnv{02 zRP8tkiDIs6+`bfSQE&$wlbn6~A$oOt@fWxZLq_@CJ$DdG_3>Vf)QDn( zMUzL*hm43QM(TG#(VWwG2T5r_f`T2D++81>viw(8v2bDIyTwM}^d>s7KkbZ|$b17*`!BNv_j>tlXis^hRH2G%+dF)4sYSCx|lM>)m zt>$UWHrl>H#U%Nvu9T5tl>VP;hAy9Fk@?GV-tE;fhi&F|@UW23QU}k>z}Iz*Bx!$R zyxs3OjGs=BCe5uQ^GE@)@U@k0Znv=6bO?d6fLEufHwU!38fNsh2OmCx#g-_sUo)n;z0`k*!Nn^RLHAE>^SAz zpW}U0F=Lm&2CZ&)Us4PlbV{9~U27$g@_aP^FoC(^<{GYH+FrETAzLYJ{ygZ^A`2;?I72P?@H_I+7UC6G)AGoRl0 z$)608Cs?6jW?!;A{#|6Q!1KG|R9ht)Y1BP2_fn5NYH@F_I7v$6|7mGZWRUBonQ#Ah zZKFEFnaO#0gl65(jy$UE*)+zA{HCQcyp~}Ae8LAY@^S>ewItCX!*`g^3oH*G>UFS^ zLww+wr1qXL0O`Z{(TDWRLepH|7T&DD^u$@x%Px)y#%>2}zwWxK#8_ua@z9RAYJ3dL z`m-G=S}SA6I_pr&t5Zb^PNp#r@#YM7*qZFs^OCa)Q=vv$6!c*`ui2hG+{VZ8{=JiP zU9g|5JoG;f&DGG@!hhnJ9AlzsVd{R%A!^3s`HABKz9p~YXp<)VO3!7OFS(hYGe+~eF8|K%r& z4deCTwV5QrcL5jeC{7v3rXr!SUR}+$9@)Jez$VIY*}P z?4%VCl^*JHoEFE|n|EOf77#TX7n74Tt~&CPNp!*>avy9twzUrW`%o`tSYEphD05KI z*N7to4hksWSg_tsSum0km*fmQv=a|&cm@)bM57PESoBGF))@X*Y z6`Md316J6XX8!jBq5#@XNU6213@Qo<-pr(Wbi`!&h2Z&|bVjW7+N=}CfkAwnk)0j{ zmDUX&q!i0ovBBcJapS-x>vOxsc5JRKd_0nfwmc}1*=4Mx3J=#?3IQJuf^1=h^Oz8Cno}i~eu8629*oE#re)Dep-mLsy(0&>Zz0xKB(v z;F^0~twJ1_AQPFyR4p}GqXLW*fGb<%#1NJGcz+o%*@OjGcz-@{pXyk|8(`FCylmt z&+O^m-Cb3^s%ll3oQxO}JRUp%06>xu|D^x`fC+-`uVKMK*H2j*UI0MEP~z85CD+W0 zP9HOT)wXMaPO}|YrPP;ve`u|lj^%A;W+it+HS;q@)wVNZKJ_pC)>c$*_0TK~w4$J2 zHVjc&47P^NRu=3Xm07pe1~43r5S*4TD7O3K8E;A09jY{3)y1*9%mYlpsf0f#fe@I- zJ+Cn-tYXQ=>UdJgR#J~IdT5i?tVhGVcbN`{ZrOLxHQ-~gdj-L&>5pF2BFc{R%RW_) zT=0)x7dlVuijAWttJ@^&Y+Z}bRO?TTHSvj2%ra@^B&r_To!#S~W$_+puz>|ZuuOh( z!%F{@E2qg+=7aca3dEKrGakNttrRGe+stx=F_H@Ulq#Axd7T@ZB?u``Z}bJ^khBu! zl*G#XqUw;S`l+k*Ifof`aU32GlluMpVa8j|?022@QLw9XoOXANNeb27!K zDt-75`XlnAT#HJJ;*Dl*LCE^|1^U7I@I)8gn4t`!$fk%BUB(VaE&=(}wK##8IPSogg$M+~>M~QjZ9+xQVMaJ2()T$3Pw##s=|8)~a zo+Bc&_#5~5+ha>f9(KIFsU{VUX!_Z74|>UMZT;q12)C6cB9j*akp1Dqs%G+P3$<(D z`88^Sp1CY}ZL$Kli@iIM{Zd279}lQk?5|DBvopdpt*(BusVuNPss- z#(1-&w&-~vLE?SQD&NX>B~TYZLlR*+h&ue%l{Yg=^V$37=4m=OK+D=@%A|lwQX>gL z5@GmHv0-nV%=T(x_!zKEb$saZ||{v zQ_d<5?5zper{2f{PWb!Q(k&WGJsa-1| zXs4G?y*UZH8QyDZUOvvrKDfNPIK8+yEuylpu(87F*ES)sxff zgyXC}nsweRJ&#vEF;?3k@q^|$%^MLM-ciYTimD&IG(9lPS5Bweav~-!ywxd1IMtuJ!Gu?VYIHlYi=V*W}4ktas1GrMQ0U$?GhLP`JC*N=Pebp3hnMi zsC|q!k~RC#;89PF=tJ0NI5M-(by?je+g@fX52KcR@MM!YEnOJ22VpuZhW$4h3#))B z>GI;2YTnLnIxja+dmC%ZYGZeni+|-KIwOCE{+3CcDIo{N<#2ck=6&sDw4x}6zg=2h zNh|VBI$&og zY6*wC%qWLdHiNcKZQns&W^BAVd5>{#g-;72U7>Fu33#Iz?E_#v7FfG-8y;L;?$G(M z%7%*xGp%84!>oRcb%5Pb_-;j76}rOrk9K9P$>|KbDiyG&PW$_Os{ra&D@nd8Y*m0= zz`F_;tSS%!>uN-3pq0Iau!XmVWavq$PonY|^8B{qprc?c*#8Q6Cs0x+OV1x=xeXsJ z6h-YBach}N^D?V2szAeiW1&7ic}G$7opr&VGm2@U8C8K&+ZQDjr1d?m-hchMl0BS# zOf2~C2$#Las9hmfg>t@{@9MOa#0wWLB(_gp?4G$_M;ai|)BUH$hGstWJ*T$cdU^du zlYV^%B0kSkMZn-rXe(&YlARf*%Wq<_^YB<73elJ9tfu!%nHA zckA~Po-G4%{DE}E5Dkqqv>Zug;Fjg@(&WO#4(d;XRtmzpF_Bw%gPH{6NDoN+S@sX- z3v0U3`-k85zyIjMFc#UlUpd@C3DH6pV+k7=dWfzlDl@*9-JA1C1Lsb}#P}O)02eK=`3b&n z&!uFo>g~LUc}KzO;6w4+3~PE+Uw?C~I74B~;dh`q?n*gqKRarAqV)PcDdpZc@*KtF zZn(T>S9y{X&1dc2=n3R`VY`d!6!paaeWpTx;`*no!%$fnU^jjtecs#V#rN=Lh`7H>hG9KkQscfG7goz^u1U$q#kR zANOMk#;ufgpDTTr7Gc3e7^xhT`!~=vd9sg#B-&;L2`>I`Jp{wO7)s9g_=j5Ke=?(r z6Vi*nW2P>?X?KrEzyQR^bLQFH2$3w+X%PTD-7f3MfW@&@Gk5y5bw05{cB>5o;oiM} zeAJoS0yA0-1?tl=HdBLLgWw1wsm>=Ged}ZptUbD^M(V-sZHX%drP~5W#0wRJ$@B5y z`8|nEd&^UwrtT=R#SOiU2W~95x|)N6tx6XNHDwe~E$O6AG}oMC-?mqGiQl?0RIUZ_ z5rivYuZwpYUs`!k!KzMiT6P($hPf9*YC{)Aw3BEzmFbkMz2R91y|PFD2c10VTPlkH zD+6f%OgaaYk<-{iZCt$`=UEXsL5D(9pq}E9^*{;{)-O$znJ;Oj!C9#d=w7MIk&Y3NH8*CJS6xf{{mN63U(m*r)d-Qvf3l((v@)| z(T~{k>=bgjk*8#hn0dmD?$}_&W5};ekQ)5UeY~7GInO^UsPeBYNr9@XbBynWv9v+f zbG8FfdDHM-X)gG+fil+u5TAZQ#iQRKXpnNHfm#>5DBSo5ACW^9|prY z%}L@{$bpYE@JysJd?krt;0*Ockw*%$B$-G`vdt<5Ux>adOZ2dW*=sqGBWG(6j;mw8 zH;DVY7ZUMwBVz>8Z=GE~wEK!s?miA>>9ioux@XRux#kn`+`5=PjEdEu!t*g++pcMt z8nr48%cEz}Dprf$>Kc-vec>JJ`mvk(eMcmg?b-c&AOzu%O->6wxQJLkm#?81X58fJ zZGIqAAy+%_IzJ&h|0uu>28qdU)G!aylcaM;F8`FbBBwzUW9MN$-q9IE^6JsJ?qBOA zgq<5*&jxgFXcLu!U19ibL>Q`t$9J9~MtqO25@pIFMUXIFM+Dezd4VRFIT3$2OqAYl zE$4ymu2~M8%(begMIN`$9d#(&fw44a0T*C@T(ysHU=sSD!rRRHG3Ghu14A=APO`3u zs{9B$f$!&AC0!W=ch0$bMFGSp&(nFZXj%|&8~ZqQn1I7=7(df5{)g)dc`@4X_w9>o z{&x$u=bzi{5`|f2v;pX&*>bv}j435K6QCE2Do@AZsBox~nZfgN$^73p`uW{-n7 zK31MYoeT>Y10L?(BMp6Nz}*=`rK2$AsGDIs1$GSditvQ#-Erf9;ru6mT{-ry(W>Hk zGhT*c|8RNI%rqpa>itiL&n}0qcB1b;e<|kxO`E8pP8=zCQ`bJtyC$;fIzUS>}+k>?s=|tctCd}Xx2NJ!*8?%_i z(lDtI&8;i8!qz-kpAPZ#d4Ky1>(=7$sj`ulAT?c@jrH4-O z0ULCNU=S$#pUC$R)T!)+PFG(r3MKTml;^a0Z+Lv#Do*XFV=rUd%97k zKNQ#G3LNr~l-@;5!pX3sjSGCDkUe?870uu07qJ1U!XC*3nrnrZ7ijya;qd~S_x?L()X;r3}7N}x5LPHre0?9+w| z$%1pN^CFxWK^KuBJ8@i|C3!iuZ3P~2?XbaD13y&nJNP=r^xZ`DT`C1-igW1A=OWUY z@l7H4u_Ym=ljYfIdWLF+Bn{6mv+~Z&NHg=!dV3DK&b`&;=M&4zfQIRVdy)#cU3??# zH6RtI3U9kRA%Ra$oM;d`hYC*)ehXLo8o=J`JyRX-B5=xb&bJ%JFHcvfZ-Z46{Nnza z|6uM4>xWy!_Cya!7OP?EZ-yzkG(7}&R^6W0`Xxal0~5atlKsk2&<}n=LzMfAr)h6KYD@ETVe()E z;d`5^PXya(w`ZMIGk6BO1HUP2_tT60x!9yhQB7^)wbb_)<&;e{)oZr^8zyHHz?uzW zV_>z^areyH-J4XABX$K!E0wTi{nG zqso}eVf;`}p@Ks#I}=o)3nc)Mk@dWoC~qhk4$oJu`a{bJx+_ky0gbxR2hlEdD{EXW zN6-ohaXi_mDMD7NYT;=(wf}GJHHw)a#yNme9i@bnz?DS$%$Z#IObA=u|K$4ui(moQ zBmJs)0tR9kL|(qx2=-B-c}l0nUp229tg)x)mGJ^h7@6qrC4a=TT3EQNL*}Wu0dx2b zULGQ&;fu0N2VVd;+VAHb9NpGqVHgohC&1VTbegoFf|DrradP_8g+;r zVo^&*9NXe2wPw<+Zl8KdOMZ-y7IZXNC&X`h;Ca!c;J-=cnSc4h1@aVUN@QryDFLfE z_%${jqF@6p^m*=qyKpp$PFSoYc&UP1%vZ$0(4WYQM?%g=jl_@`UYcvZaVaMwG3n4! zlk`k!FD4-gN7gD$3}dP5a%l12DoPOP=KC4V;5GHB`ia` z2K#Q1$$MeiLoRx{FhKV>gh}e17K+NHeggrDa9gG~EytROPQHp?s!yND6Dw{$s=qO%1g#Y;;SQ_&CWammWL(>sQX&BP~5T%Q>jK;+|Zd7R_<51kyt%v0=?s z;s9?v%YHUhM^)b|7jy>K~~9KK6L>5r@G%=WA{%scJv~OqI>_FRmZe0Rg#GL_x}F@KUpKDIN3Qj7TAip|(8h>f=roHd&=d~W zV}HzsrHFNCix{>4eNXNVK$@g}pzUm%GvQ$?aZQgX*X>&QmK`&1TTw7Wa3<->-?tVa z%6)k8&P=^m_B%FrjUH{ewXxkNfaQ(E?Z$s^yyJTO zMna#Yq;1kQra!YAQM(-_m@kf!ARuat;X_4Gxy#jP_&loQ#KvR_Wwuy86}LDC{ZrFQ z1#8loz@Q?<$s}w>IO-?q0k8@x*~5S;N;5+ zk6u;2l4ZAP-x*pz*(LaV&C7d1XTLCV`#Ghy1#o39t*mUNVsU69#8rR)`^*?lu&{dvDF zAn^uv+|{T!vDc<4_ue2gYRz&D6*e#(T`wo1>>3i>&&~)u(zKF>JMU2fE4ij5|#czWOgu;xVoxLbPdQU#(W&{$4v07skt}(i-5ZjHA zYYazl%yr(Fmjw)Yk|s>Kfz0wJ2m=00b0C0!mL?cye;@OTJBuQ$_fN&-TKaK>r*YYN ziGe{)t_)$!JH~7?y>Z~50D1$(ZQurJZ3C%xB;#?vN|m1nk(aGG>_xkF(b zxgdxueK6QqPBV&h3R)hN>BL*RpI(*H>{lYut3dFnRDjd?Px-pd{q*;4Ne#C`Xj0=s zM_-qy|`&u=1iWURjK z>y_WRX())k$tT}jo8*B8q&t~3&W)%5j!W`VroG`ea(c_|8K2Z!<-2ezhs3fdh-nY` z2+<8!SZMs~$C4iYPFTU>&-aB~jc{QB zDdy@H6A+4PpnUHjJ_>-SV>)P#C~;MMLC1y%f=bD~uEy z(bqHx+OznO-1{t@BZ)NrIp(Sqt8VsxY_-S0KslIgk%hy%q@xfw>RxMlezBp!H`u_j z|7FXA{~Hh|Xab<<5ImDi zjUs5QyX^t;t**mZs069i&^jqU7k zUF5lD1C@m7t9!{2x$qT?#U0;*!XI4nh?{=8J$;0lhBjVD7q0EAkFT$LLJ|2RTdn@F zqn(Xe(0i>sseoSe;0trGxNJY`|#npXPC|>!FZxQo=3sI}M&Y+m3zfbc4tA{X?G;9zDA|H%Z4CA906?t=_Nz zVUkMn3UsswzIs)y?W`KLM1|4?>w|IeO*XygpJ@Y^+0Qjw?;-~J7+G1Q4gAqg4!jsQ zZJSfIly6V+A=N0nnvs$fk!HYw|Z~T{^7O-0f4D=1-4V7u0HO?^6njc%Ogr$6)CWk8_Ia_^J)nhps&f4>)y7 zP_)mkFrw8Uh@%@Ls3b1yy{pHqZ3XjbtHh&CFixh=>=C-F>@f+<^oY`ntvQly>l85t z)sFo|`m<=G8&|BXE}x0jCfK4F^33tnCfI2=-x$biQqgxz8-n68|YUmhN>N$&MB4XvjsN|cldKb?8;V(7=~s-;{xxY^k`3(CuH z6=#(bEdq_zr<^;Ll(W(^aD8~RYs}2H9c_)CUvsakp1MB{Rn>n=2j=X^_s^&7DLSyG z*dP zQmEB+#q@S+zMF@0QnU8vwByn{lhn)ll`g=l6~p`XRJLP#E0#T69Vx7f&9HY3Gh7n+ z;pKrHh+~iXKd5J?1;GxlZ*M!u^dEu(q{2|!&Ol176<9JS$(G#HWr}Bj`X-eI^(a!2 zw}7tkj+K>tL8&o5_1+DY;R-l`x`I~~UgH%lVNOJ}xQKwZc>KOaH3SgeQ0u}*;%mse zV?32gXK0|7dM{p$9i;q8df4M@XKHYF&JHyZ+G^D9{tXl_JWw)UW2z-~NPnvpW5cV_ z>^#R>G&&+Hh6^JRB1RHhc)uyVfeBSZ!*tPWgt#NWLC8=isC}G)k#xURk(ZX}jz*iti1x*`$R=usy}i!B!Hu zm)?+F6>y*4@)T!IH2ZO@+r3 zB8CYE*yhw7uWfyull;(rFquSr0|oB!rlHCZA5^LklJy}z;Zz%qp%4Z(R>4W)W;6_G zj~n`Z&o$KpLV2X+9TQ<9)DtN~sU#PbISw(hfRms^3zc$O~bw}Xrg-E;uD zF!KMgkN?H8|6~79!9am9oc{*GgdzWv(+dR<%dTIw;PCZf?YQ2_&YP@Wqu6}Oa|_%H zm_579i&S88Wq6(MG3GzzOupZ=e=_)7lJ00v&wshLn8Nq9XWJJsyE62w!2hM1UO8v= zd7oN2r=o>8uooO%656&_xo_9dHMFaIZO|vLx%T zG(R@A5?`Y{ua1XKg&nZgD)bOX<>4Mmn_L^9nidQoCXR#skXlA!rsK6kqs?!ixN$bB zEC2jU(P*>@CyX7i$#Hdib`W#9F*G)pC#AP<8yD7kk|vP@d!vrrP%_(pDys8#4-l|B*GYL&IkqsS91yWCx;xskwqn%{6x`{Ad|%G|?I+fE zQ*^wBm67cWeCz`3%$$=e=e-er$<3OebV^uj*vJ-ExspR*Cn?@DlN}q-{|J0@?$Up% zElf4cuR2&Q{o?HO&gGe4GCEEy5A^uvl+F{d>dvR-m;C%hUp?q%-};Wl_oQ_J$Pd)7 zu?l%=(DXFkM<#M-sSND6VLIsiUhZ3-iaXUDFub@%B{&~P zL=m)zxV~Tlpvdizcjy_9qLeU>b~q2-OYK>Ky+SZ*dAi!)ugGea?MF^>6agZ`tw~46 zR%nK+F4wR9bt4`iv*76COB#>Wr zN4~Zo3_HTH(m|fxdS9N3))wkYlgu9>iT2)%ca3_+F>P8V=^HXKSq}_y;LM*f=GUE? zucfZEAk)@URe8(<%E6U=f)6{j*~F8hxw+~7-Egkg9XlV@ulaWjq63);X|8la(5wo~ zd1f{Q?p82tkNOeJ;<7hfWjzWEX2EL8%TA}u%f&pz|Ay|>qn}P6KV81jl!MX(CJT(4 z6NlVSFjJ$)5BkQ!gC6-(@&}a0_x(HTxWK-+$_cr1D&uqd_XvB>usf2^o;TxT116BX z4dfO&Nm{=`^!wnrBjCHg7jw?N-NEo*#@vk>KFc4M)(dj+iesn$C%*~P>Oz<(JBiAwaNNJOn+S%3+`GSKFGNf9%nNsadK@^Not|RsSjZl<{nSMlxoct z_RssV*n|^5IC%&(AbMNs|sj z!5rt_5hvLc7YnHO!#jukJ=NAId^du`KO-{-kn!yH(bP*WcEx{H-CQPzaCn&1NB;N4*?j@k`a5qyCiLeS+)htBAJmH$Ja3E%(p^+g!#5j z-lJcF12FMkU-VYn&qM;sAh`NAf6FQ}V`>1PpNV_>6K&53Gl@%B7!heFH4lrD<08=a zEYqAGzY^vS1}osi6z~-lnAIF%#A4#8k50eLD^O6giv(e94{(!Qlhk@=3d7FR86kQ? z*1WdJds^QQWJqHe<`<`IA3Goc3Tx%>|B8;SA%fZiWP!2ZxjjV5qAWw2V1{|YKyzrh zg6YQNiaJ(Y&60dtyWD^&LYcixDf~6=VL~T-b;#XN61?Y;T%M?bziP|P zJpnIWOxQ7bY99>6aYK4d{r0#T?#7AxfKmzN_LCPJ?M%rEsqJEWhnvj~%GZ9a_u0UN zD6~00ZL@NU=Cm5V64&n!r$Ps2=$YKAV2YiJqxB|{u@v0iy!)CU3zRh$P1@LbZz;6} zci1gxAM3z3q?h+Wm2%*MNV4=T&vKPGB?LpBr+@4OOa0g))oDrW|afi9PiFGbW#m zHu26n^k~$sTVrE@dwQL%p+?vi9XWy1s>BM~&+smw`!ezA)_>~qyTF0&Ij@z~H>Y2u z=1(J-jl?(zc)N%2fJ>P@J`=^ym=1LK%TYeuEixCY%#fA9`R7aC{n7nPzIF$1kP<2* zB4vc+oh;}qC1Y_l%|taRQs^6>MQr3Jal*4Nt6Rx#7W>`rCd>u9Q8f*7srT&&Qq;l* z^89ZLpoj}r97PE266D2b$L(jAxlCu8Kr^`#`=4kRCCvXq0nsr4R;(efRU~_Bsc1$- zX?&|i_DHCftv^|@&LFoxV3KBFU@TydYbf|K&xWdw4nN1Lm)?2C721%C8w75lwb*0gE_id~|D`3Eh7o`zds~#Xp*U>IszOb|~{I6+5=zAS%9=)TkDzP`zwI@R0$xHz%)>6l$ z0#gB2;U6G4dL@Fx4)1=aV@HX0N0#Xc!P*+xy(4V2VzdHF{|sBgQZ#K?98CXdt(h1r zpcnsVvT;eyZ(05{qs>AXTV!xP#PBC=l)&rN1xq!p&MS9)cpdjI1yOgY;z(Pd+LMi~ zhWde%{gXLE3WE9&BOQrpx@!Erq!8W^ccAPgRcPb|TUbUhHI}lc`GJh+4O{ zU1KW+vGi-3S7wxA9-bS~Hy>0#xM%OBesnzXv9a@G_FlQ!d$QI0oH6wfu@{@-Kk-PfYE zwacv3tg(gB=OQBY(C?Tc*RX$+oI3V$%}sVsAg%Q?Cy|E~&d5b`UG(RbM9X%G0lp(b zkhDEvD-!#Z4G#4hsr0_K+b7MbR;FA?dEIlwVPcwG(VOZXo&^v9RCkQJ6)tIE#`~Fq z8IWtZJg#UNQEx}oA+1` zJtvML2&<1*7sZh$?28Hx!0}B_FjkkI+h_OM?p!!KyMg^z{=JgqM@~os%^&APO+B!Q zjL71$+jPX=66FcyUUH5EA8INg6{rlcjM%*6w*0o1l2p>m0n%v40VN!bo#xDPDkupdg} z#oWynmop)!d8#>RYRqW(~p+kD3$(WbBAarEEW5fjf6l5E>!@e3Ewqy&`VQl z{LQ0yx3ejebCz=X{KOm}R4!2Q2pwJT@a(1g_FY9JrT^gUdN5fIW%2B`G(BBya^!c= zalJ}DBKA=)jVqzJi6YX%Eh8KR zyVC^DouHbfgF$!Y7m3EBkt&13*3k4$5=30#PBSfX7#o|cJikvLp1_@cYGWUzRve*+i4jGThmiK+MTiz z#Xlcm1JjUbGPDuHJ+7wvZoiIEpDBpKY)WQaYGvK2sqqvZX1hhq)8VvWOXZNJ#S#;X zg{VG#vq3HfZ5L`%V(~FKoATVh*9@UGK>tL|Y0V3jzUb2S^8u;t z&rxB1S<9Ixn2Qg2$mjdXByTO}I%GGK^9m<2W^8vzV;!3`Wr9R|*4fFu^rSTAc_rqE zGC!tg=HF=%O&W)>>bmhyXCTM%1(#+E;nQm*B+5B!e4HZx1kXJ-zlH18ZYC@Wgx*gL zyy+m(z1jSKQl-{%wiQtgd!utbqEGZ^RI@!|<$hAU@UqF!n|t#t6OLnj9U+yN>rZ=K zOXVTkx!K%?JJkc>70zXXux0(>md14X^Ig9hX5l8@B@J+ zSTTJhNJ#m}#Fyy*CUGo(pRWMsb$Yt=u}p0gwy0#++O(oez9c*&POiV)BOA^l*>GT- z6k%i|?AhKVDcExmUUBU=veOsYM>$uIlYda%M0G43Ogizd!$d1iHL|-kM<8;vFb>D% zD&d^Vm~GipYK4|+UIuSFvJ~Q2Qn?i1fc+jNzX+rysw_2By}sgakbQ$fY^7*!}OLe2d{=C+%J<% zo?jrqP!KUYvK0%F@C;G6q)*Ra6{!x#N7!Y?i}%5w-b{?YuDAf5TH1BVA8M5pYn`yP zb9#1(?_*DFqkw!a@chir&uUxWFaQR@f`^~#3*X3#TWp?z>s$6>#}c;M%u~HhFaf~0 zqh#h%;-;Ha`TU*;1vu>03}AwyBqp^**G;j#Ud+nVgg_O#5+MKT^+T!NVZAwQtVo*- z_(QpVGC8ic!V5N3s3^Cf+UPC9W%hA|&XgGkf0p>-;YOK}gr!mE1M@VDP?+Bz6Q zfcF6I8{>|hY}1Y%&n!ONl;&1KWc;^a&_)kPD$i}ey@~8y&KcLdaci%UpKYx@8j7Xi4h?}BycZD$mwXJ^SYD3NFxcL zkUs?w$o6#HyAY4@pydyA6N%FQYh55iC>43{J_}+Z{G4VoJ$m2xoLM4mfeTRe-+8ec z+Ax;d+8q{_8AFeuu(!1^T-me{xK))V^;vjU=(u|NkPr!*5SxK;exY%PrS*1b)n-^6 zL-yqM?eOHxyVW4-1RgrK#sT%)v0Kq)_&XL|sIPwlZ28~k`lY(Nm1qt1qr zXc0&ey`qR%QiJ1;;_`sP@!#RHMix~iC^{J!LCNIRUNs!CivHPf0&0iJa@_RZYT3ej z00bSNTW&CEVB(HxYouOSP;Eas)>bny_jM1bS&>Eh6!+eo;Do9HqP&z@qx&WRAp3E9Q*7C zAEq(I=E}?sQ!PO@NY-{oxUJ~?>9I>jZqh_E%9jHHaBj-Ust1-=#D&l*m_Y}T>u`6u z4{4Yp^3S3lgB|Qdhg?%j2jea9rx1s(yoV329Yl=rMVN86*1g~XgosgbDoq>Ed0qA$ zmm?|)7g7~y6+qP;ViT`C!Hh|Y22)<#T9O@4VVsY1?6B>RKdly&_mJH zBe^~a|8hkkc=qa=9qQ)?IQ1{rb!uaI(CZbK8(~LF`op{ce&$i9sCAv|$6Hu-2Ugs0 zCgnk1Qct(m!i)ojmzK2`aH+o)2!S?A=W_SeX#?^RuFegi&tyAJZXg`IJC#yD8m85v z6W+e2{VMODF>(>6kMm=gFw1hA<+HqaLKw&68#=Fl#pH!^OG&nj@*MrVB<)!#No3NB zJ!N3)XMkIVvHog*9o?`E+(J;5e689T?LUTs!TUv~p$YbzE(YD*qEag=^Nktt9LArN zE%&+H=rNR@-DmohbhjlEKM5SfbW-{qSo?{Q$aRlA$bnccb0v1J(ZkgNe;ZY*^pW0S z<_Xc_+(*t=3zb5Rd@Z-_j%W<`lD+|2&R`Dqvtsj$kNSmxx4!*#c|zi>h!8WvdM+d} zO;*_C85)OT^6E6?3Mma_<<<;2!`RwF1vYuwa_q_)-^#2tb2^GH|9OP$O)vg4(bzZ@ zFA()>&(ymn_dETbU{yTNfghy}p1=a)+qpH%%v6ZX%@jvP&=2atuUgSr1kuY1YNRA< z1&AptTl0o5Ch{dtQeuglR-h}`x!Y)5!@5W04#n$8ZaPWB5Bv$sN&Qy*2x90JxHexQmjBjT_?UI3>Z4NYLw5Ps-ud%%Q1DztOC#ZR`thyZ-I_zQ z>&zhO&|}-g{r02~nq5~crn*2(rb?PWYd}^OPw2-|mfev_*-62v!hE8Fpu5BRQ=La$ z5!Pyu87~OTEiW;?2_7j+fx1jY`>fjR85ERC;J5$euQIpzTJetFlj}eDbsc^h0&e=| z7OlvpJj*6Br&MaPK)bIhz5SGE-yD1xkBMleJrTn!4CmUdM@85 zB3yuCCc%zb&v3<+pwWJNS6O<)8@7meR*^79)q0Fji0gL6T6y7>;qgKHGC@Z|IA?PR zv*M?+O4HjP4fwI@@rd9c5Q{4p$qO-(0L|HKn{Nqbs(aC@<<^cn8dXU>8g>42vB+eL2r}C7}nlnw!Rfjud}ktOMYDRC_hz+LECZXL96$S95P#DYB4nS0?|-x6 zAbz#ftrdqQpA5@R4;3Q?mP@$lmgpkKn5DXCusYPCF&Lo0Ma=NVb$Nzpa^n(HH@tmm zbu=h%)<7<=T6j!$L?!P_ij!)&q{3d=Oi^*v8NtlS%G;n3PA_gqEy9FV+W;b$X+9Q8#8i6(0v zzTTa{P&jOHH}L4YdQ)-{n2RWAmsg_?-u#5R(R1nZs{F2?zk))?<-uNAcFPrb z$p1^TqP$AxIUsPbh2))@pM^M#e;P76UMJjz0J$nGVtDV;`D$jkzgA?Qwe+JuDHKj~pG(G0z}~Vxg;y zZZO8K1Eih!$uYYYnG%u`OSuMO1OA)%1*L={&0`whoh_Uf;a}U-^0E%B(yk34!Sn3@ zp^i!5=qOPfCKeK9)c)E81RHK^;Xb(3f~pM2nj!mol1Y=Ztl>MM*!@i_7obg;$K8Tk)1IG{eE5p(CJy3Fv`%W+MrN zy6=G4?)FXl;!0k5x2C{6n!dt?kSH+!g7^(E_&mjR zVG@wrzdk9C`p?AQLFC@#gtr@ir3Vo;xc|h?*&z+VIxnnhGJ;~mL(_T$r<2)^kY>*# zxNSqj7JduH_i&=^#iV&LUw$mt7xDGk$k5YpL4g|c`3l$e+;F%)R?lVU9i%LuYE5es z&xVl#9QUrk*YI@zPTkybT%Yp^!nh8WXe`h`A^la1`IVYGBNERb3bF+apL?1iZut>I zxN~lCZgRf=#`&?aj1;Mpb!>WOV9MnvSCG!foI&q+if%y<47n^u^3M>vE$?l=-tHOW{ zt9NA$>7W1M-$%MnaRvF=FwC@CTZWd^~?&f*-bKksA7-}FJ!_^rUcdd^*WfvyIIJ;fQZszN24E52rMlG2qny&7w0(w zHu`iVw`42!?6sya*><_0QweUjdV9vu?U)(QUv#ixNq?w*re&`Eo#(>BL~9Z;Ffm!E z)8PA#v~RQRlb*Wv=3cd)b7tf>g5#d!zwcHO_&KWC^yW~EjEf05uGyYVg$L1oC0I$% z;incR?_ZJrsNt5PmX@fA3rvEWzp9`0->;hDS6az+m%-r@3o-LnmBd` z!MK3s#wALQxiF!VIsFG{^BSPM3W}Sp0)~!~K)rT3qIju|U8JES=WzNuUFABTP=&vU za|vBDu`l%qOXta(UB>vA7{?_rxpcI>-L5-2Z*g9g_C~=j^u2$HmXr5mNiDXJnJ{Y}J7SW6jv@~Z~42GGQO`%}8Z>;yK{PF9YIc zuw`k_cuSPQ+oMlIeNiJ0`g~Uq{iy!o$aGWnDq4IHxY-OL4xrW$@OZ@;aG@5p_dN>yfTt z3Z`M2Z{>Yw{V)ZA1u&NFabtKkjBU>GzYxMwOwdF3Ld%lGzHJ-6J?w6G#TMgS6X)yp z<)&|IV6_cxS=yn*de8PIUW$n&QGW*|Cmv1a9<}M?e9v!@E4ZQ{`Jt^ik!3TGsf+zP zs|%Gb4N;c!vN!W2ynE+vI6I14ApEW;d%O5zoNsmxetJi*LpA#{CFDXhaA9JLF(s)4 zJ`6ftZl}u~yg8^Ol~_EEk189XBcI+@Rju!GU*F|E`IR*CDN?pcMNw0#rXq!K`_^p$fZOF_-)4CSk0)bu2asc5 zj&V&~7Dprk)w9-=AgErC>#11djln#t8c@z`pKUR8knpqdgmN> zq5bFlv3M-Lh+Z)Z|EZ^cJ*aJ{IQ__cM0zO&uLt`s_i;^VWUi*v*kXL@>6FkZm;qpI zEZ@pw`Nu@&BjS?ScjfBvr=yP3PPAt(qHSowj|TZ>UO_omv*~9`cjr?y)ra?J8>*U8 zv+6e{52lpV$u*@U8kj(!>X-iuf(ss33-TyWL|={!@*m9)5al% zQ);FbOih!H9vaV#2&@eacJ=aIy+<;mJME7-+8;`6A!!_;!O?l4*kyv?kA!iBg`@Sp z(PYvo>`$)-Hx@^e>CRJ=&)(D1*UvvX;YN}ay35^5&6Zn?G?btBI^z-?@ivqaE({kAL%Z|X(bK&`=ks`OO88& z9@c8bi)Fu>H-+J9@yo{mLTJbWQCFau^_T3)CruZ<%wpNC@ixcq2uzjpsNEGit{j#` zBD!dT{QVeVTdz^PR|a=hkj7Ml+_Fb%QUY(TyHT9+Vqlvd09PH}l{2IkTTgLBDAw$) zE+f>lT=m|X&oukBS31#TsA399ceY8w>#g?zW!xcf)4e-k&!f_#*$Jh4+|GuLU{~!Y zie!8bs3~fUcsAOU6&$Wo0t8*V1@BpF2Heu1QS=-+nl{3QHipKn`3U2|%mT8aX^aZ% zmF~O{vCYNSxRKfA^|RlFdh7I@b?k^bu7s*EdNKCM?cq0CAj|&8%n$itH$q$D{?}9# zIW|1vPLzTwJ;@*H-Y?w@JbyAfyTyZ?v^zd{5r3hzTQ+iUya%-0{K0(bH44{0W`Z}4 ztBai<2#$qjfL#BB1#V3>3hxzdspqdvKwOYb1X>;AGpeUR6jA!u`8s#P?C#O>!qNMy z4~%!ois=m6^i#beDWPB55Psn8{T(|}^V2oiZFFiEbfFy@=oeSo25yWH=js;=65505$CI{Z{-rVFvtGKl6oJGQA zV=S=~=zYn;A(Juoo+^8NU)%wvb^m`pW2zfR2avuG)BA#2PADw!tUT-kGwZ03w@}BQ z&mRjY+;4|Yw;m($1I!1#OmwyAX*u_YgpT)Y~Sw|XO`vcq_)~Cpe4pf0qn9L>}byTOz66tdNJzih&b?4 zjCh&!UrEdeX1MhpHJ*_I%E+w$Hl8>0PrN^tII0fkz(O4^<<|XWrByB|P`JT(je3uK zdge&KSf9h|JD0;1xcG#d6Tub;m#;@zLff_+5s+4yL_@=DSkbm%Ex)#(PYaB;2ap8k zFOD5GAX`Jon?~$gUhc>3#uf=1>5*=Bpu zcnFwTEIv3`;j{ciu*XqSN{)q7&-d|9$3C|eA?a!ucqnzgcD#3^&np`q=+T#nxV`Um z-M(gT%U-wX-aw5Fm{ZLXe|PO$Y2)iA$EF^~%BX}9f6-x>XhiMj!RSH_k+y&OqzJ)p zO?%fOooe3z?l0S~Fc02sHYM|LTg(g+mXqFP9L7Rj{d z2+8rvN)B0W^#}j%*4U9JXFJ0Xx~PS_AwbiCZJ*-Khc&V=^I$;N7@G#q)MwXvuL_Rk ze7-(*?=FvbIA0Iy?MrreK}j=N3jo0X!ZaCRJq|IXVC;~FDA8c?ifm+PQG5s&PbN?d zu|m0$m@Z|UcP?h*gM_Dq=Zu|bE3fKVR^gn6?Dw6?QLj6rwn-3~I{-)o~+T*Rmjsd$&!t+zD+)+{3iR?q22*e zjCC?dGb+=s=(%&OJG6usxWR^zBhy6nbWmzSu>poJtdw<)-QD6UMOwl8e%LjXe2{~= zqM;?(ZNx2L-KkB2CiF`2R#bI>C1m+w@tU~p?`fV_w&!b^dq=f436yL$q>bCkYSHf< zye!SM2>#ee0q`pFFS?SP5-{3;zUMGQIA;%b0Z;U(RK&3xUcV_HM-N-y>!OimN7M8evE+E+)ckaf9sv1jIC@;92))ji$N?Q zKRcCwvJZPoZL;dOEb#5%1r~t`u^e;T&-u}BRO{X?^`R-_lsCTb;k)8u=h4)uQP92q zBlI5%d1s)q!FV@L8B7(rJ7q1xBvW)&Lde}vsOU2byfBK0R$_1?k-76_wLa!h(0-_~ zjaK5zah|rc+bn17z&?K5fMa`93A7PuHUnXyQM*3Bk+T2iT!u>Q4JH$YEoXwXyd4*& zPw=pdyRW5swWdavsZP`YHbu_yVLgTEF3sr6bg{bgkWg`PBN4Qd*qWoQ`8%t&F{QHF z?$)p?3-$K8kZ_yEFc|j%4k82FGa@Nv7w)b4K1t=iFi5A1RuF`6iv%YrPsQYJNlUu(b za<7d~pH%fJ2Qt?S9bEnkELyNEO^dXY{Ai*5CV_a(ssI~yc~2I;y*#p#u9Tc^d~Ekx z)bRL1?4MaqR`QUnW@3Hz%!U;$PBc*?S-}3GgEk&Pq^{&u^kpvl2Js;JR}!=jeecz6w<;$Mtq@% zt(^h1q~j*tZMJ`b_X;#o&8De0g*9;tOo=;F-$4yuGbQ1{E@<H5x&FK{b=*a?2m+s7ehr|lQ#A-aF}0-5hg4Sj4LvZ)WT;H z|T<7=9T4qY+%bQ=yvS>s3`i}3;|?I;3kh0Rp@w@1T>T#^|I>Evg)1Ej`n2UA!!Svk=bIl& z$R_CVBj?M^Q^OVoXLMUXpVJlv6S)MmAdTcjr}=Ugiic#jvMTP;k#)Z#kz=D+Q~lNC z?fhw6udefi76~`2A-j&Tu`&zeV!x?0`K3UYkKST3NK_o>-(YsRd6@MUyi?ufxvv(9m~&1PiF7QkrDA)xBD^{Nd|U3he~S`y z^mGm(`w7gm%r6t^&^YDJ1Ruo}etRlQ@k{Q?dpwgHeA3=gopIVWQ zQZ%L|6zfPzIyDz1z+VvL5b1(97RH6%0mT0qXmh-5=doSu7{VrwDYX6*krP06z;i|b zAvZn&Ei_X98r2b)(9qv*j?p4|lxhCXiPU37 zI#1^GXyBd;{o@&Bx!zmlZe)ycXdhxxW@6bS13|SrpBD$6ur?!S(Xw7`=5tfGX z>>yYn30gg$9?mjc5fRlQh^^Z>6zAJbFZ5Q(8EgD7wF@FnDC=Tq|4p8(ky`zMq7vix zLbW&_qOAK0va}5v5i$p-B~ohXMd)#*b`}$%a=@do@f$O|Id77j>%46Q2vNY5#xi6D zL6W=-;hO?^hUT8*VaHCJa2q4)Bnrn?L=EVNrxOisG++aXh#B7B09`5_6NnK49C%>}D}F zlA!|Cs@8Eh2#o$m>p#6x>NpS7VA2T>B?s9VY*_{&jqy|LN=DnD13tC*TT*B5!+ON+ z$sDX8pf6@qWz&CKr~2OGbA5?AU*(jiHKkh?DYU z!9v#Ghes8QhTg*cCkzx-~& zs=@&iRY1X%_VD45x{?B4)N-}!-<~l8X#q>fC8{k;Ht&)qb7pfWdnVF7O>?>xN#SCm ziA+|Dd0ZP~xtq5wO-NjRs;AjkG$r4b{dtBrZ{<3PeYORFXbrQ9`G$}^1=ZUl{#DpY zn1>==HzU8D^CE9yW+)xwwa6_|7;a=-gbkzeWIPj%6s(`*%}DhOMrIEF+geFFa7R1YV z3nO!Qr(P>b^w_DSyU%nwkoriUuH^P|~GgDuLVRwtSb z;BxF(sHWN!Qa7UUZW$(Z&*|pI-;8Qo2eK|VyI-2Vi;LHi&;QlC4Gg&|4?>YC7fpW_9w2(`T1k< z0s%-GlJBd*HMM_+o3bVx+m-wB z7;-Xf_KXMnmFXa0Yc9Dta{#(&6A#a580gn49dl9lteKxx)eEHH{_qKU$oL{vLK0p) zWBDRmBv>ai;6-cw#k=xIIV~>__{)G3?b>)-#erTg=WgIqRetK4G!m3BqT8mn+Th6h zY{|qpR*GWAZ!RQD>^(u_lqCMKb6nRBvaBP! zs8q&4$5uBWpLmO9$1AoXb8r*05a3uf}9vYkUcM=-6}Dnk$VVUDV=#i-nRg z)5Dz5zkuX@PX43K$zUWKLRFLz7%M4`X~iB5puW> zngOTPqKy9(rJ|3N>ywLcK~%cW>4QjD9xufcdt3&-S`E!gQ$Hfk<+x%&l;RuCPg9w& zOpZel4&1_<+3TbwfGgd5`iSrifuk&xwZT=}hKavisSOU%?0{O?1Ur`d=i>QGEC4vt z`&N4}yx1sNz{zhm7u5rr6{CX~OiArg&rmRBx-V9E)&YOx> zlIgAs4NQXb{+Ma5eL(5P?3s)LK^@}gzVDM`n0*nA933)US=wLq*3+j>1h*OYU^3r2;FW&MSZ>={I2Zp zom<{r`0|IfKHA!E`0bH(o+1uN8cW&L5yf@%N^U_98-Y<);ddrGhv8#9jUVv|eGA`W zzGvS=0e35AYo!7E=k0Ygy>$RKYn@e`h)TIkZ9;_e#$(5L~@Je zH_`n$bWdK(E<;NinacP1&$eKd{PG}UtP{34=e=3bC4MdR z#=>wat0u7rB#rnKZPM2DJ1Ta~weqM~1=kTP5In=N!Nv%dVUYnNzsSFaXcgeDv`ra7 zsfEJhIdnPaRNQM67+?Vw1pj^h-^lQPnp(Di$j8R`p&|AeM~!`uq~w(a?SMxVoM6_8 zr0h4~eUqf5rQgv&5OA^TmrTjFFr9CBHE?_OO&8v7l!!FcU=eRiZkok!e#Lyx93-NQ=EXy39 zoDyx)I()R#aY26^}uewUg8Up^0pJJ%`UJ7bcLP5C-eIXXuEP``?w}Ao>vCVi@=;n{}x6d?sEl-DRr6k#|v- zxxJNx2+yAWE2mvoAV3lWHrg3Ao;5q0dGvWSW<^1%K3jksaV+8gQCX-kykLIhISyG@ z2FK|J8i(g{&`-V02nVEDWoe^}w&s#-;?T1?1o$v@lG`S%Tnv>2@z4TUAG39T_DUO$@Yer4YBaTDp zRNYS$+LNt}(Edi8tV=`9l;U;^)dS`(Y6rX#TL;+oXaB>x5)k7ZQR`J>Kw1(172j0|NGklyex!PxzA-Sn6=+tY=Fl>mPh(V5ChlKR;9aw~I9K8&xuc&{pw#Ww zaYvt3Bkw;egb2*r{Wlc|kNTe!9@`RWk%Y~Qo5;6hB5~~$A(kMX8nle9Kd3s4wrpg; zV&lx{)+zu{XG39h#};vb5wOBjU(frf09_^Nf@ri@5nxNv@1>T^x(_YF{?f?%4P9xy z!-1>6oY$AeP&?l15ouPIV#!V)JDp|D6pd6RML*w*9zp*d@v9xvG5)3odf)98qw;pf zfE5#KS&(*7TP@}LhFD!*yS@5X_ZKrR^`j7}=q9;s#dhpG4rQz#4@Aj=^hsPQFnWaS88}(Fx*#bv-n4pU3 z*DOJ0?AEyGI(J%i`&y?943m`rDI)4_>%!~o67_EjVyL~DK6^7&^vfJLrreaKW~>jO zxU+n0(9q;3YQR7UA>9~mMYdGjcP{xd$M^iS0i$4~%c5sHyWflh{SFjE+=kOq#Mgg; zWqAVLu7EcSS+ia_n(kz8>JWy?a`w$60pW6@$jrh>x4_0gk?cPV=XvR+o5)B__?-YM zomU#^36*ZM&6Q4TDVV~6UU*jx9IFOnH*{Fag%Zz}urnt(+2a2vFe&{CTg0@H1KMy25oOLp2(){RYrON z&S!rS0;v6T74v#AYV@i@`~KS8=Ds@M33APmTfX0qgOyl%oe?^MOTw`F4`l;se`; zNfRb8b*C#Ye6hU#-cEWB4?T)I;*FeSM>XO3JbaMuUiK7qx8?WTiJLvRo*@wyU-*zM zCdbXa@sQwcSBq?xS~8R7b|fd7P8xyuAhpAZXe%5gW<74~&u8*3hWyh5i?JH~LfyaH zPqP1p{Ow`J(B#hN00U7SLpI+ns&E>YMUv@(F<*Q*&(43D)%|Z7Js2_5SHUX*FyDk^ ztjpesW;DaIE8Bc%&DDwYdJ5Ga#TY|=X$xUgbGxzc6IG?d4(XU%(q%xZXgxY!|HX2W z)7alMP5}SrgnKvocW#RXY!;AJda}gf#@=S39Tte27YgalzWR3MwFAENZI{`ZMv6Sd zgwF4rZ(5GZ;v8Uk*=v<81Qes8mgZdEq=bo70<8T3^Mv%X0~t%t-wpLZUa7SN1<($B z4^MBPuWm#R{|ve2jlzq+?a;AMwJ8P>#_smjf)u+#fp%FR^z02=8f@odU7+tZ_;~?+ zUgU%BHxSirJ7-M%M_n%i;Hqi zi*i--jnB16T6r!v!{6(znAH~wBHMkm;S&I2M2JZLRSD)-WSTpZlUX%pGh%(1z=8$w zG}sJYnu#%&5Q3BSu8u^BkiGiVs#zKNaKsK08 zT_d!Uz&e25G~n7dn!dXrQ1Fi|?-dIf3im1POO(!#IsN$|Xf^e^780z|94nCwUtL$G zXZ4%uq@HKRSoL4`Tg^YtY3|7BnN4`-Mrv)seLHIiDcLBX1l3v;)F7Mvr6bO z=USFNuJRc(MgR@)K9@Bf4l}($RNw%Blo)Otd0G$ z?V=t*!|#0wR}cmY{3Z|2ePSn^v=%k}6N#t=Z=~%4QK!@;r|I5OZ^~q1fC%}K>CHSY z4W;Mn&UaVll@hk8?4jW!%x&sNl9dTNjs|SoMeL3dG+tJnF#TZ%-}FN!>36i}2*tS+ zXz1(J6s~QMQ8mpg1ztJvu*;~~1l!F{xbOtaaDHDOKU`%zJl#a;s|7EHPQ-zY$D9+u z#uph#X{knf!Gs&s88{K>GS@(S6F-oG3aHu{+b+PDUZMIT4UxmSvAbEu72uP4BXg;E zuiM!FRe`&q#otH;W6p(uCqn2+Oag-3YOXqbV;0{P42B&xM2)GPj zdO(b;Oqm4Hq5#+L#`Ts-g-b>e9y%E8w9#RTPb?|E`s7Zim*?l{XFp*KI7d&8 z_WTkDeZ-AZJ}s(7#Le`}VF-wq%yq{lQnkp{yBV7F#FFw-=h(%%uOd2MOUdr^9n%mq zTQ2@!pYV$$s;J@%j7C({uyGEqo+3J}Z$ZDa9{P|F9LiTP)CX(#i^0_uZ>XWZpNHRm zI>_|GE54l1-h7Yg?Phk(5~6LmIxzeUROGQpW5~Ar`UMS9Kx|Urk*NUC%_^E{<~SZnyT`QeG|kD4K@)T(pho&3jgq>F;&q-lgor`vQV19hQXF4DhO zc?Gf6fZ?lLT8;y+{0zUsNF=3?w#(15L^nvy+4tG%M-rS6V9xV@nB0F!U37^WhgjXf z%wSMcW6PZCq2872 zc8BA32rLm$q5R))`9I+>9?5e-+m=>$fL;UZ-_A{xHVRQZni~Ly(?tl#adC??CO#2z zd2#JeOE^xJe(kN`ls>}PBFumlZ8px5zVqDVvgx+;$YU-bI2HU=-#hzZP~?RY{&cq6 z4pyLO0Ys<|SUTjtU#ZXNvCYU!prW%^a8pa%Qwr>5f*GQUKX>(ga5Nm>w|0wGigACp z7+$h=Ft&wf$zEh6@pxG0c<$M3fvSJzh~Us54_*Z$vgd2>%*C8?yxYBF5`=yY*#z5} zS}9!}RC%05G1X zoLPRSAS_BsDvXgE5vU#PNnD_QjHb*{pcAcQ{2^9tB6s2`hnL+yK}L)p*`3Kew#qk^ zkc>kFBT(Xa@I&q+6jA#!PFd&C_{)}?sp5I!t%)Y$YK1wtTR@EPlF`2^s<_z@!n$4| z6J`z~ja}JymsEkgc7B@wnMigCuD0&~qv%qyzDO{Vl#UT?@QMnzqMB1LL`F%?&|wf% zch~^S>}?ZKcCU>cft<1yl{tNKmJ$3ff?i_LZ>_SEgQ}fI1dCddQrq2RXfGjsPO7KE zA371E>2$eAUa?mWcpTqEJ8c(E*>yajp}K^isyagM7VqryZxRs%bWzEI_lP10n7DpF7L8&ID)IGG}MT^Y# z|Dk-tpSpvp%;6p6lhVf@bsZI=n*?Jt4WZ%j{g6*KbPwsL8E^EhK7?2g9e5KPb6>%H zZ!LC$Qt^M6nCM7v{!YkW{+_kvliX2E?bk7yXF6>OvN`eRpbk-t!Yftz z?w`Nu^(qg?!I#(>B|rZxS~*^B@jKI2air#1ba7Q!1bD1BI~P}sGpD|BSRHKX_7nn^ zHEh{Gu`h=Ts=;g59j}+#*)=)6%(C#`izB=;+tyHB4YPdgl@_Z-6C-1#Ga;)UM5t;P zt8?E$GyYSP@&Dk{ByH=SRAu7qY^rpT56xcad$b%QAu!7CXvAJin=#=W7n9T6#!RcEjT&-U99m#U%$0nf?6>-o-t7z;Qj;!}G$ZxpgBK9t&VaOyjr@I>_Y{mF3@LCD$ZYl=*gyaIq ztxRHiOGKu|(rkO*NK$GqeNmNfQni3;HNQMq$4|;ANxED0w32X%5q=KmtX?;|2C%{BGblg0Z0?2DoChXKGhJG!KRe$OMuc$sX%qTT!qO5dODkvm%KLSDlTRVd zNjl-z;G~I9Dqv;-K+ECU@g26Y>%PEbj=T|2eA&`{*}_vw2#N1-+dfQyJUsKPm^=17 zY*X5R>06PShtg9x5Ai#2&AeBS^@42&a)}4OmO0t2$^cUMN@~&o>;8)mJkB5M8V)Eg z9Bf%2Tk^ClPG%b3Sxz}FlLFB3U2jon`=h!R>w;h#h{(nKJkhCom&paK%@jpu($_e5BJ2Gk}dF%xj0 zlH>2(!H>|q-;b%!v?ZXia`cQ4U>u)7Fme(PgCw!816tvWKI;04_ilK>Os}uQ>Rqfq z97Eks`x?+9JiqPFA+g45>A!a%3FW>0DZ<*FlAN= z=Jf}E2fTjuxi(I7g-4(Z{|Z!tJg+zjsO~Fvfn>f<2HzR6h(zUe1gs(?648UJ(Z{-e zxI$!;^on3QQhMk5wn;BN2CP2@bmZWQZ*_n@SK5uBb)vo1D4g^NHRw-rZ@cWhAEOV? z*{8R`G~X>nv`vdF)m>zfK_7=Cq-W+%ZhQdl@LAR(YG|vLn_zNvI8fd!E9}(duZHl%roLBO8F87We-_-u#)j6y zYp7I#aEtn%+J!D83{Fg^&g@Rku9>B*Ec@rfT)mq}@^;I6PbEb4dHqt(9sBI#Y?epX zCEHx|ucJElC@tPDz!Qtwzk=bAo$rI{+X*6i#qHW&DY>uHk7$3Gba$|0jF_syAZN{6-zPdn}8d0bo_@<~A|1VgKH_-XA-4pwwbOsRjuCQk zjDN&Ge{!hkoa=G0nQ;3o5U*#qNaM{Lsy8s?#{*^LK5cs10&Us%{WtfW-{ZKZSMKCS zGt6`pr?bO=$C%LPm}GN6r^mzR>(9cmN&A~x zYKzydkcEUJ{)SnT66y@UaWvgL*Eqja_>D{s9QfZH!1A&-6PC=?Y91L1wAlT^>o@=* zU>?jp(q(i!$D}J)W@OJ1=s$@`8c@Be+m!QT?i)EBu+wzj{4F=Hc;896Zw|033>Av* z3J5E%$xiRSa8MzDs{QDog@oN92mW`<0I&WZ>K?CQTY4I;UA+Q_Z~_BShUfl^X%+Y< z4BW56EH_LByfAkJoh`lgHy;22cF^)4Z>9}k1QOVmZ~Lc0&ZJ+uyclts@|x=3*fCW@ zbfs_S9urs0&lelnyYtN=EHD)kT%=)`1BI!KPGd!v-qlt-e3LlvU)ucN^!oXZhJ3d8 z{Kjxw;9kkE=H7RXP9xnD8zZFV2Y+D{ikew}3fJ`A=TkQ0xO5>s3B+|fqghjTNlKV?R;S2B9gzPIEDdC6Qx5S8zA z-SHjQRsq&3^~f|=lC-4RFd-^&dhb`GHFQRjw|sg0c*vSD zf(QwIA!i%77AdpUreO?5Tku#L>$7T1ucR5<+=X2-WVLNicAF7V(PVFJ?b&dSQ4p%D z^&Hqs6u?obzC(KLIV!E8zar%1K|irCZ9wr;`v#?&a&==6@*D3jzwQKi7}xZzSW}%; zqn_BU0gnJi9M574&&S-^)40+@nWYRgX@2ulk~=@rzOaCU=iVaP1;B-*K@me2Xm#}$ zAF3~wgfCQe35R<@)J%gXUqu+WqLCQHV$U9@+MT1)3VPOYHd9}VE&vGA5K+S zBy-^S2h0Vo{e8@?U@-OI!A)uX*@6TlGrE6X<~ZPbBGl70P-=RkFb)C;q>!(eIlL`y zr$?p8h8#sOLGN?oZp>Hm{=qV4mh_iU*#s(~{_NX_g(Nxj?FYvK!CPR7O`c*G+c4ho ziNI!V#)#nu6RRclL*im=qo~o1s~HMm!_tbQ3$=*6kqO{vy?GVlR^JyV6m`V6<1vn^ z7D+FR&R_Q5o*z&5rqA7isHw>l7(g1(!ax0*LD1{l*Z2*|OXcp?=W94P!^7k92;Mz? z(X|^>E!HQUTJ+m<q$s8Mrzp81p8osYq_y!KQFA%=i>Nks?;G6jpPpx6#9tEN QA0I&^Mdd`Qg$x4!4~(L7Y5)KL literal 0 HcmV?d00001 diff --git a/games/uno/docs/table-rules.png b/games/uno/docs/table-rules.png new file mode 100644 index 0000000000000000000000000000000000000000..78811582fc17f59c846d78ab23cfe36ed9c13843 GIT binary patch literal 12156 zcma)iWl$VZwB`W8Eg`_*1cxAlCJ;2ZyG?L+cZa~B2?Tcw?(Xgo+$})|7~CQFPTtmg zuXf-5*s7_Sp02*PyKdieJ~<~sSy2ibg9HNr0AR~Vi>m?v2qN&~Gc-i__p{P_0RR9b zCL{h?-817j)5wx^G3~Y}3PUQV7mJs@ZYigw`3DEK_%2H29MQr-VSCa?N@D}ioFZmJ zdbgyPaQ@A4t@uRk_rB5ehIHJ;3rM~@)kkOHd`%%}LpyiV1@f&d1i$3R7P@X98W|@N z$CwE6CuKiRzE2mP<*{ZXjbw8E{`nFVnS3q+SuX;68GM%kYlhnW0KinrW8a}Y{0V(f zUts~TvCxPBBt);-0o?5G3;~vgWMN+HP~!qkjt+V*uQ4)G0S3Wh_SqPY;7jdk^$eaH zwcJ%!POSJ5#(`||;aN8FraFuxYQrQmKMP-hQBJHpVo8D2*Iqp?vS|VMW;YlWpZ#+; zj+|QNJhN`I&JDjgeby_Fx;7T*!Y|7)qV@#JKBv?N4Aho)jSkhdn_CtJ{;BwS`z_2U zUM_@s}d ze*6wkDxd#wq^Q|8-~M^l`49Wy3FEixgq}$t=DMCszfgrcqCKL}>GKnn4$<*$MNcK4 z-vTWroCM2VpKw&W<8;K)2C`|f`j!@S>L7^UoH#R+7EPhXNPkSDV(B)&%yK^@RkS4_ zxxGvF6uW?ju7^5V`idXtGcCH%^{CRi}&iVN(kWB7*u z)-lUI_Js}8PW&Y;S0cG_{&#;h3v&nSvP0UHtfm2R9E>gNN8|xo1}3a(4yt73UAl)6 z)cW8dB;%S~Eaqnxj;N&M6X9!}(l3f*s!wdz<3)chpXGzEp+0^{_4KhsLmY?umN8Ab zXg~Ufbyx4#Lo_XhuPq&gPJ|8Vr`aP<+WlW)eOf|fHyIbhvY`k0r@8>XDQ8YAQx5de zW4u20nnd0XU1R3a{cJV5>mLs#3VggauZ>7Up@ekPnf~+)v-`R@YAtCAb7QTqMZ;OK zVzraR(9o}3jC^ueC-bvMb_w_GWReKLBWEn9Oxz83PB|h?!Yy9cUvjl-3rnUMI0$Rj zX2lT+=5o7K3!3OSb{!~|T)IQC@*cB% zG50P#9Vuu~?+)Yiw=g9v-`-E$ePHl~4Jz7W6i8r63L=CqpGg;6rtfQ^vDwMNafp+7{o=dA(d5 zOkXjM3d=*(kf`ud-9jc`{yCxW7KU-LEQmNtjBIjrdeQRd=PIjrz@Y?mtve;)Z*HOtQJ z{rv>8sYGrUk*H$!P+zO|iW#VFVAyyiO75A32Ds?K7RW&_R`n#P$#?HaCYAjZUIBf% zXV#d;2knESXbT%W*s)BW3HA%#HOP5ug7)*JkMRUo>sJdcOB(`LSut43EK9A4?6ZK{ zxuzaA<5w$qucG(7yn7Jnw6|GB74b-$`YuJAVDnh4PZ=b=X|{i(g3t zJ4Rz(|FTSLrw3BAeh8Cxzf0J`_9QK-oFabb!Ygav9Vyx-quK_&_KehH0e@f!+ZR9; zMKck&bzJ+hx&aY7R4;M^y*GRz234@BoNHNr-Oy1IE7mj;5 z9}+^1!$7tVH=bL9$LARrV~<{y_j)j-@YJe3T=!?(SC45--xL~8+EyD+D@;_0^t75~ z8|Q5a-E%7R%CnDkj@BuJ^H;L(-LtPvGWgFdJpUsP8?tf($R-=6*u)pHz@7cu5s*$~t+0dMsBN2sw(co#va_Ya|gI3@C8{-3V%V{nn?VNC0KwgB3{V zGZ$bk@e3UaCLbUt2mt{}1PKWdB@hJ#4j2jod&sjB0LPFZwEsd681M=%k#ysP!u_iR4Io7%7ket2ulx^R`YO`47!nPIE84q@E3P3Z93+Y zxMT#exsLx8CLuXMf7j@V9L9#ak7}kD!7>o}QAG^b;bX$9KyLtIC9#59QD+)Y05@`b znu`6ORF<}=xwXw}Y28f)4hgll`}Ku(#CORXxAy`Jbb>bhns@|}iGjKkB3ezuZ@XTu zT)Y;Ym?kmB1Q7&n#sqb9kbGi+#>_HacJq&=KO|~kXKW1~uUgw93nf1~s6NZh5i?uPa&^V=;w6RRj(x|J2e|2@IN_TAHOys4%;c&seqPFtN zpyi7Zp`DR=s~WZcOGebSx8GHc-=5m(&2_qgTgKJ5KUgZC3n@S|X4t1IL|MQw zu@qRVzth$Gv9NiJZ$XE0>vw^A9o+V~xCx489CaKE)^I9J6MKyGMe2p z{q=PtqW%b-$V+(&iPEWf8DJ2k*H*Gr_7A=Il-?NBG!9B1lkbvOT>4h2;SJauoDFJw z3L(~^NRaV72D7>P#V%^DAFmRM7Q~agF0ot`#DW*y?x9Rs@}9I2D3Ub_P%opR9><)r zRV)uJhY-t}sZ5=op4{H1PHPI&YaCp1>Gg(%!Ee6o&G!PC@}s8JdPI>(4Ty-9py3^| z4ty+EFA05?eeIR(ep>%ES>A*svpS1asz`qH6h(ZMgdNp4Nyi<@KjPF-c`nKeIWAVL zWfiB{Tt6>~nJ;c1>}|8hXfVIqxQ~luOM5Rn!sONmbBvmY{ffLVEoGRj_diS;yFZCv zqH80=Cm^|8lLAVCki)zi$8oSSPc6VW3n6nDXwA{uLq0vECRah@(7)o2)$M_Pr=CAX zW%87BqG;U<7*`q}Ysew;1^8)8ahwm=0)qWQ({7nJI3Yc_kM({EZTGKw1_$xUhpSbwsrg=#DDB-Dxn`3ojS&LhS< zPd?oICc4Lx`NJMJ67sV|lIogUV)6P*ItF~Jhr6|ZbnOg)`F8PiE>FAZ*}ff5q{4SG z=e_4OFa2WsRzmVB^P)dK;+a{itL-IlK?c`|TE@qV-9+$*UhC4-?JQCDkeEmP&}xZ~ zj?1Y?Vz@Jf_dbLo4yr4 zy_uBlP7|#4_2b~p6d15(sGEps>vI$Jg^F2~IR6GmuuMz)CR|r>ohj!2S58^1r~Za+ zhFfYv0}9l6hC$wJQ6+W#eVTE0UE&IV$lLP!UyKiS3ge9*`}F;VzvnUpg?DY0@P}>y zdD_3f`j`%ev>tX7=$>4gxXh2HdOm9__M>OL#J1dHqj$otwuzl z`cK>!Lh$T9jyvj1Hn||vM4$isk+^3c`bArhdARvGFffQd%#6>7OKx>DaLpCN4r=a% zMuLKXr0_j>^Y2eVL5WXHcN3n!E5v6~f!14AUmE{TQ@$gcBw22~Em#*}Db-xW2{r1O z!?C1YB2;|c*z2&7-S(t!Ad~9J`Q~BNSunb?w6sRW=k-E3sehu#E0i?i=sy@;GcqHU z`k_XT`q>wvb%RE^kdBL<@Kf%Q$PE4Xq7%qGwwR?6<>R{5NySg5m!mxCE17arxxa^Y z#HxHrf1(0oCR{cS7YFs}Rr$c+rw?n3Z*xe)Q16*(vl=-Crn>HrlbF5D@^7LYP9}Cu zcg(2Wp1$yad4fy=O%C%;$28L}@X8ISLJEf%1~i`+I?gJ5jIzv%h8W(6+UrBtwgx*> zU>%%uK4z9TDs!C$z0;&h-F|{WQ#%`T9ge4GQ%8$$7Bn)DumXhmE_$Nxg38e<+GsDt z*cevIHF$QnPLSTrQ|ilse_};Y(oNUl`kN%ZP)6g@PLCb+SFuU%?-LZc2T=-DBE@9L<0h%U08> zLKZ%Q>q;ZTc4uYjL|@DM_Pld@*=p3NRV7e^Am1Ff9Hbj#<+M`TG zT7W)@*@yI`ieQtSu?LB;F@Xnjt(Q#THp;UbbAjCMKs35;xq*?qWQC}lQ)iNY4ynx8 zUxB&1s*cQ;mGs|ZgZAsHH!vRMsNV-mGDFM1PeCzL^&%f%*zXOk?vp3 zd9!-|im)^-_3D$hz|;G|8C8 ze*)^&m5*0D)KL22+6~^3)K=IA;IuQT*ATeLna*3H^Pn%CUhCa?_TNT_K`WBfvVA`& zwl%_>Z?%+p1;r-Sj=ht7(+ZO<{C6VowL zk|5-O%jY&anG+aqDvCwdViRvu;u)u>$&tv+Jks~?!EaV24ozorS)tusy9qpIxSxqm z&&Y^0m<)fesX_Ns+oN}|7QR)q@bveI;^g!g;`%YsN$6?aHYPYTASBOM=h2Q)_y1TL zWgoHN&0Lm41puP)B|l4qopA=EKl5l6B@CIa?U7xNUmZT)^M_j9y)fe2(k_u(zXTn~+k{$}o7 zX=qa{V1p5%&>fzY)!Xox9Yf_6#DF9K64mbM{9HRjPaHV&U4}^FaHb;zM1my@Y2?iF zb1|_2*p^3%3+`N8F;O;cIhfeo?{Ur`D1n0^$Oe`GOJ(hUe2}d)lHaNuZn{KZ0b1T z%4OL_wf0_A={L3-P1)0fsM@W7%jmU@Nr&EZg8Y~b0^oQa*!nVyz9SL(m%2+C*olTZ z;jLk}N_w$@>DS#k#my(?Xs8SZwQeGGb6i3yhYi1<;!)IsxSjcc=7nM&_7&zL-6Av( zqKl%Je?=es4^8ySr{2$ehi}3SS#24mSs2~*T)Qs_lKJzq$hG7&QQhO-T5W*6-x8)rnBVZMYc$Oc<% zq~z#iq?Ul{JLJIzmgDS|!17$JMQGW_A)HxYEB!%AFV&?eb_OQajl8k}?3sDM7Co20 ziM~<~H{)8(0CsvJoMI3;9dtO?QO$T3r+t$1b3o? zhSi-&B*cw9ez`J}Eg9Y(-?|Hp<=lJOh=`D|QC2NMT-&`iQ3kdyZZH?R7dlKqu@+@GeH=?^7Ag5(B?GLau+9uaa-!oNu$CQqNxomxq zVThp^^T14Q~Y4oEv6FfV^!>tx2`G&lVNmC8`q3UgMHi)|p{Tf23bEk9L3lBA~ zq)duzakSLVsSd4B?<%Zup~#gcbzbjGM|LmWT~G5Nzp$1nYuIav=>(~e zp-ua@{sCU;4H_LBg2j6jY|1fhdL4yK8iZvfp-+qGWVi;F^3Tb_Bn~vhp}AJpu1tij zE@e%lO2>v;UEkGSEUb5Rw{V_zjz>n$(N~(hQl+PxJMQg%ue@;NrOvH=W-T1IcB#D> z|FevTd+=*|vh{TRCnlXBvJWO)pZYwlq~bbbIphSlFgvpXm+0xU3XZ4cd3&767&6{{ zNH9(((uoeUSGsb)E4aZaLv`DMNp&d*DBR%SMzl+(8yPzoeMt&N3jU|g1j;QjCU%d^ z82RUA$g6$A!l>nH_Ft$ym~$u$&mcmKmLM|?mG&+g1P0eV!c3(LF9Eufsm-v( zqRGKMK|Q&bPjEeEHmY7ZOYbqJ3)dZA!DdpA((^q?Nfx z*x>T-M^zSAzLYq%?WQ8{wnungENOFD=y2S8)3Sbu`FN>`Ldai;+TbVUv)PjsxPJK7 zi=(dcOVqMXv6VISytm(i>cCs4QGVysENALv#+|kM)PyME4h* zb^UTS-db6DR6W`%>L*ES6--xg+GXa{e>!;%9&5EOGow1*%FQQCm}XWzV~8zW(sZ6 zarjv=f!;Af|Bd|~)gUf)05!X#fFt+VVaV$sxPtP_wJ`=FB(t$1{KN3hssEv@=rj9! zy=p7RT9H3{s{o3*8k_J&mp-TSx+k#F${+^jAxv-MaI)25!+8W%^dNY+M(yd2lcdoO zaE+*dy1LOhMc|l#y#Scvt`2+VMDm_xs*g<{2(nqC2x)qGb%30PB^Cc5+V{os|B3Lm zELx}Yi~r#Nf2SA3T`wvEJ#Oru#T_<+I9Hsp7=KzMD(rBA{tLsyTzEGeeRFpd5a0kr zw&3swGhX->(z$;=k{i%v-6}F_lb@e8kmX)tDhJ71jQB*+bAYLUa<%MzhxA74*FxW= z4vNnn3L;NF=qgrMHlmKtI`ok<);m>N#b5_7#?l5Jt0Kskrch^9%3Y8HFz?>~sPH&z z2Gx?-kI@3i%iaz2CY_s81S|gSply-aD1X_4&BL7*IG=|PjF74aZ@^E8f70s_@Y-5& ziv_}i6;CPNb@acc(L3eBQV00v-pZYx{n+2}+Sz_1p|&;h%9*b(TPZT#zN%2FUMkKq zNN+s;kKNaX_bw0cp-n!rlqqK1XP-ubL03JoNoKLYC;fFp+&4-qH;>~iaJSA=zt}J< z1FTh{vAmrA=SuNth?B(gJM1527(%nXwkVYUgBgX`#S5Hv^V_oL&601{K`xW3Z|I&+ z&n@vWnivpDN!#VMhllcfAGD)-k%o0bf;tA6;3nbs`AW_Bqu`Ul+x0&I>;{e|g`^f; zS(HcUDekk-m@n1oY==yC10I8<&+Wo=Mf8|l@idfJ@X?i=50G84h;~SXYOH(108|w&w z?rD`Oh3+f6XJ^ne62Nh8PR9zb>|5yPdBE9y{TD*1J1El~QZd{X7F1RfqWMQd|HI0~ z{$`@%&~m{DqyQmw=OWy}!{-gqdF~Y&k){9A_BNc*Dxj>2cTTy(IhxwGrLzI-BN4Dv zfBK9QX-d1AHRBx`|DCAX0Tfd~-%M>@u)LEV9*(RJ=F!~(Agt?GaLu?m-f4pQkG{GE z;C$1afICie#Wjd^ckS{W6b7X z+!6TaTsTzXGg`)V(vdTZZ*J@;F&R<2H&=c+GaPp45Wb^)x(_gB^x~8Lp5Sp2Ju&hN z`nUh1hlNY6u{S7riBqSH6Ib2%qn_FJ_j0%^Y&XAW*b{maKRK8uR|8W$f*%ZgaAMFB z%=!HJ`!Qz6o#bW^Ee2e>tF|qS_!u1|*rvOAe1I-zO*6i)1P__s^jpn@jRC zGGFm%jkmASG+S_3AXcI;7qmVQ8nK^nL1Qg%tr?H0efgyk3mi8;gdDL`8*n%0QNkoQ z!s9>=&$`RNFDenB`WFxVm(%w605lZ?m>)%l;+#r%upmP8wy1~wKvutbS5}OGK2e9b zWN%@W^G0^lr|j0sC`6@>9A+OW2mX-pq~$O3ite+!?h-WgwRy>s(hK1+QlAPYpziC2 z3TmKeeV)rYmD44V!}<}kshf66s^$WLcOF7C{ina8r^H(Y0+bx%8E{$O4emNkV5r4E zXS#1^_;Rc1J;5QAq zo#F(%9;BoAm{~r-Rf{z^_B-BM>j3hikmgzZ``%kBCR|WiAyX6+@6K;Pd;$`ZRBD~# z^HVE8G_V8V&0oWAPv+)nTm${L25St$7p!CJ_8!omo%5-RU12PFMXO>+1Bmz`DWIx| z1!Hr;mSTsCxWD58KV&Nd-X-{6H?5MR*_B24Ba`3O)C-;GS_)Qz&9}r1u3LMmQRsZZ`!y&p5qr9p)lr9+&iQuE zmCz7v=KAcnh7KY?Z-c8f`Jvf?!$}|K^fo=%B!-5fsl;^_bSvAVveE>}#EwR)>2TR@ z=Av2Vs_mjHJVbM`sWY73ZRGnHZpJ{Mk-x-HiVF9Uz0;S&48NbDDE)>p>~nOlUepKU z8Pn#he!u0F#A}Ygl@OG}H>>#lW$@3IIyafp-s@kG7dst|O**%$uk7AIWH#p|Z~n5j zbct)KKj`&+$$iQ=+P^}Yf>a8V+fCecl|GX)A?+0lmCT4!fcG+Hh&gpL?kLS3ZRl=H zG)%U8*d|V$A_acozcO4Xv3m`{H;wQhhu}QFjs4BQ6?t8$B5F>5<(sl4SYjC(IE) z1YNoHrJooqNX~p3znP`?yKPBW9tN*EuyWl=t8lmTo}72|y(iK9*eK(76H#b!K1ZW5 z0VT{PiBiJmi?7RmZ38izM6X6&Gqg_Kk*YZ9AbZ7Y3E#CLDB>0d#4!@TV8}*WVzH$1 zOKr8?Z&162)eVTK9mQ1fB9Eo*@%7(xy@oSIxOwkb9|*6b4k5ojBQ#SB`=a(EDW6MDC$qJJ-O2brN zY&_G9ckNb%uYhFt+>GuIaQF=l7BlaKirFAlTZnXP6yRKEBouoK-+jyHIX*;hm(MS^ zN*W_8=I&xruuO|jgrhUJ@hVp?b#lCYE_k3KVa{A>*qYT=m~axa-rPk_0S5LfLP;K< z@qSt%veSpm#>FSXz2G0CR#gkntIMknFXRaDqE_i#?%QmL^v_06AuQ%%oeQ1>L+L5OCttbBHEf&Ke~LOg7M{>e>u6 zJsh^mek(*NpWsn*EAl5#T30@zRxa>nJ#7{}d{%LNc-`@je#KK$UDNtAKO(-i>_|dB zPU52Gafuk*V;y8e-oB;D^y}bFk6+ZZVq~L&%g1rI-PmE{U1rLdAM==yu?X(BrCIZQ zK&e^s*40;OSNJU%o0AO8bDG2tHPmt(Rg1tbO7J*isF5~T>52I1nX*9Yj}?B^7$CgH z09WZtq_*Z(4JW+kU`r=D3f6qf-~07rpaI7ZMV66m3e{RRLu>vIr)bLW5V_{_amL$~ zpD3|w*lyY$a4m(;Mpxsx4ZOfJoZujV%lV_f$0bYg+RO6Asc!RW(hZ0=A?3SCwL=H5 z2kxXWpJPI?#EO7VmDMbxmtU_MSC2fFNOeER*}%)F4#@%ajtQBHqlQY|r`HkfDPXPR z`IP{EpNHcv8W98pU~Y-nJhq8wbh`S-r{&5pBo6?wFT!&ncnS0yi%2;siIpma7S#oyo`H)A5NivGQl0Ob>gbp z%3@GLrgap{fU2{#6I*X5#L|QsvO2z{D{g&SO&Mjj3^)FNIrqY81Vs~KeT;0|)a>@# z*da`~fHxx*a08J&2zBxTz1Vql6Qb zEe)wqm8B{TNHO(rKGCI=S0ZQ+Bajh{sUL}C{tGTC%ztsF3-~|U82-DoMn(!Zp*-sW zBIG3+#ypZ6zIFo$fa0=#YkcF=;UhwNP_ex)1 zh<{2fc3jw;N*FPplo6(JrSz&kv2ZmF;d@H|boDGvGl%p9-Q-zP(T?a83l!vUUpz0u zeosLS+z7b7=)dDxjUFZ%#j4!%@sc)OvfmBoxGhRWDnZTMamq6CXN-5Y`@0^wX!mD= z3)`U?DlqBG<5DkJa}lP$7ew}k%ViR4tpFpuRK57{&7MYo@zp{UQQ=mNqsAS^?ZnMJ zm+T-b#Z6h>H9zCCepxFlDBD7J@g7&dJD4nM@o=ex0_xZiQ@n%Bs`EDlXFvSrUapbo zTegH5=Mx1!3Y+BPPSJ>c%N|X?pd1o5m5zVvL3EbKa^X{+OtMqkTk}`e6oJp%$#bS&*(#SnY1Qr8pL3tpp zGZZ&o&j(Xg1$k=_6cR!t(vj?$k?hEc$;7}!ud4LmZ{1QTuJ{gM1+TI(%JFUE-K8^> zzFx6+088}^H_`v7vMS(AUZRmlDH4hf9}}kjNg`PG+apcmq~ZG4z;iV{Nn|21pVYN3 zh<$X{ZTPSG5Bj8zctpG~aNpKAb3>O!Uyse1x$0F)lc>nS`t=lF1|+Vc&Z9R@HgD5= zOeoRR{J7YQye$%BZ*Z_&S{Q55G9we=mJ5wBBbjVOBX@{OE8G(3Yl<8Ujclrthw3aT zDlzc!jU@0Otx~Bq+MzNTE=Zgh)g+qPiS6k$!y8ZvWePbx5UIpHek;*+XXUDVh*czp zAfI2|Z|F$ZGchiQ+x?(>#WD)-Z@8cKr$OE(+Y|T2EVCmL0KG%S(?Nc3Sfil4Fj@tf z(r2t0zvAvxiz|P3ch`8RU`gQ8#X0cMdzfdtisNsOzfCql;))>W)KK>y&5aTEG&cS5 z=+2_##Z^O-b?xP*H@Y&nVBx_QXpBsf*~0|#E`ny327J2!>|2W!>0L(72Uy!H%6`YXNU4%O%-bfCw|8XCF2IhNITIZ8I{Vc zSqhbRHh&QJ9!>L*yw+kv-qH&GtgZYtY1Z0i1nWhg_#I_Lbm|}|NjN%b27i0)nKfo{ z88t_pqXFM%IU`IlYIK)Z%I)MvWOq8o=p(-7bgGWt@Vk>Cp|(B-1MfpYSHxf%z3_}R z4_cLtJSF4EpHuCgYqJ!DHPZ|=nRwcoY7sTL@z7Wt+6Fn44=DnT$wqqNZZ$-EKOtkT zs%7D1mM1FQv5KT%XT22+XN1Ym9FWVDJ>($ZoPn!1L$6nPIaAF}^S$gT3siqgH{6Br-VgaZQ>3V{@{I84 z0jTvpO7WxY@lVIEas_JQ55e4gWg9`2EHIN`0idM_y9(+QUq>{dL zpTpeO>ZGAy6yW`2(nPqY>WqtaUH)f*T1Jq%3Vy+C+>pMgCis=>Z;iBxRy=-Xl+@JU1 zUw?SgYb`BCcQjtul{F_9TDdZcOUk%H9C#2lu{CD7lgv6S1THXszXjvF?M=gSRp%JP+Q+%y-PA z!Xq;>u}(?P15Olqi2UOOvCY4n#EHUnTY1a)RqjR$*^$fKW$`9}r+znn#G%aYj-|~v zV~sl>_Ly#529n-5QkB0M9^YtTX+)<64ckawSft9MyWhPLC02-EgkHITUpIHUAb>}R zz?0uk!`bN(B50{N0KW6vNtJ#vGJx5P^$+(8iHbpb-$f3>w1x1SqCv`%1 zcctLKD`A7!2d3F~!#1)-v@@HnjYdBvE>Vb$?2rdNc(a?-^t9Z7%f%KoSeno5B_HbS&P`>XB&w>l&ZSBVMG^R`@ye{uGj8$&l4716Z(-Z+QJHc0et5!P8S0p{ rV2B}kkNHhC8`_#G(Xg@g7u3HoVu;`y=`?uHIzUE3QM^*r@az8qf^f;+ literal 0 HcmV?d00001 diff --git a/games/uno/docs/variants.png b/games/uno/docs/variants.png new file mode 100644 index 0000000000000000000000000000000000000000..fe5818b1d8ce58b01394b775820a25eb1d5fadf8 GIT binary patch literal 17493 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 ili;pr2Z6v^ivJ(~Y4ESdS7^=v0000R;b3~Ia zK`u`$k-)Yrv)MxtJ$~xcsr+u!M$Z27Wq)4HH6JyOMK3MlqKhx$Ycpr?nK4JPK9^_i zgZGgudRUem5@Jdv1DzQ z&mB2|m=ySafC|gtdd}J0+{~Oga~MBxwR7L&%NhOHH@RZc9;&wP;O@ugQdM0;F_$Bg%Mq=rq;B*`lBo)Ouf&Ar zW)>}4#6=ffgyT5I3=frj4(6-9!0E~DY>vd`mlC`1yz)(@$j^HMSz80PZT{{j0#eBo ziLNJn?`XIk_yiwXGf8?ZNNk#5o&5`2!`mF zL-o~O;Edg;QgnQM7U7<~#IO8Yic9{B;Qikts;i*q;(g4hdy^mT+QRnjJ~2B&XAp4X ztXbULJc*{2uTfn70-YTl#5=QWY&wSenKR6qdNUf>!NB!gO${Q2Q>;+O!9*emM)k)|$%)jq`F59w$)_Wdgw+fN2OPFv; z$$%xzr*YDtP!0f+2owrmZ%rw4&lUnpABrZCgS_9LC8R)kKDi(M81MD9cyFvl#GEn+ z-$$j}P`Nz9jUyXIAZn@(Y(_8W`;>%W!2=I+*@`vn{I{p^E0RPiDzK!)3IYn!=I0}i zJ18&o2j#9)Uu#RxXr!-LbBxW$^BTj8<;k=IU`0g zqoS6q3Te?XQB(c?bueJFp&}{--y1QCq_p^crq%douLB*3sG)E=E7+~HGt)1kE9 z!QXBZW+cLcC5NAYkOE6}<(hz}LXMBdxV5^TbP!OHk^eyZ+#cC9E-{aLzf)Y+l%9 znvI+^#ZbS_HAOr|uyvbB$F!F9fmoJJ%nS_>8f~ZEwa_+)HO9w1y1=%xAo}JL92txw zEhYhn8NaHvqnzhf&=CeEoa*gWNSi`Y@p@~HZG{5At=q>@R|h=%N`~vdRLQidDHHpC zvn|IDZr#qq{zS$`qX+jnt+mLM6HJgcjA?a&YaUO{i_aqK>&V&~A%5Wuxxsab+@|Qxa$~BtxZw%0ydO7 z&0!tXEW=#BpEmV<_quD4O^p;^`8na9J*bk0bJpo*NYshbk^X@1KDm|e-ttAf4NoH7 zQ3zE6C0W^#K<Yi1B^_XXs*PJYbh*znbL|? zCLU_hwV1Bw=FR&)r=IX2mz;3{-disrojNjpoOOAZggMr7@b!G1L@5Jqn^z+6eZDZF zj)#7f<(|#^&}Wie8RK88jwAg)KA&!=Fh`?=A`=8;RGC?IzB$6O`Hx&1`}`74j}oju zxJU$V&Fcp=)<>%vysWFmz4l6T^*$FxJSw>M@BfMHLw9r4dE;Q;GpyR?v#BjlrR|$Q zp{wSG>Jiw|CW>HnAxB;lnGLsBjAi}OJdTizuZg29h0yWL_j+YCwvNXp4bv%@&kx&M zOwQZ0U)B$ta9zCLt;65=7IyRaa`M|14)%lX^1=Q0dw`R66e}n&ea6i!y7bG;yy`~6 z+7efs;9&`UvJN$2ir5~3@hVVpfa%#*(7*QqwjW>^A}yQB3Y!;x`Y*inpFiW+ zaYr-m$Wb`4IGK(P-hc0X-rcr^t1i64Y*_<&ux$^|ju>M=WPP0g>q=nYLNx4pr^$-& zqxKf&wY5+kjk32-T|OY8$W+SsQ|^(uB)&egd|zu&gX#%VgYK&T`f5<$uBz5CFW~KW z*RpoQZ^{{ultiOZ;%=;5xob}l7R&Ql?rh!7{k2WBg@LKxbn)90Uf6B=Qj!!FbK6_E zt>puw{eik>16Bnp2u!ytH}?s`OqS#~u16%?{sX$_Y6ZuscFitEZ=%~RE*MX0q< zDJ>pr+eHfVRxQ(0N<;1hkpzfLZgKp?x zqICN~v!SjUWceFF^z_g0`o{GGj@Rp*fByNra)`b-KivPZ*AxH$FNyz0 yMKX*Y@6;)D9F8rO6H0000 +#include +#include "../../../launcher/src/gfx.h" +#include "uno.h" +#include "save.h" +#include "assets.h" +#if NP_MODULE +#define np_app_begin() +#define np_app_end() 0 +#else +#include "../../common/epsilon_app.h" +#include "../../common/epsilon_files.h" +#define np_file_read ef_read +#define np_file_write ef_write +const char eadk_app_name[] __attribute__((section(".rodata.eadk_app_name")))="UNO"; +const uint32_t eadk_api_level __attribute__((section(".rodata.eadk_api_level")))=0; +void np_push(int x,int y,int w,int h,const color_t*p){eadk_display_push_rect((eadk_rect_t){x,y,w,h},p);} +#endif +#define WHITE 0xffff +#define INK HEX(0x0B2925) +#define GOLD HEX(0xFFD75B) +#define MUTED HEX(0xBED2C7) +#define SAVE_NAME "uno.sav" +enum { S_MENU,S_SETTINGS,S_PLAY,S_PAUSE,S_HELP,S_CREDITS,S_REPLACE,S_EXIT,S_SAVE_ERROR,S_EVIDENCE,S_TABLE_INFO }; +static UnoSave sv; +#define G (&sv.game) +static color_t strip[SCREEN_W*STRIP_H]; +static int screen,sel,selected,action,color_sel,help_page,return_to,replace_to; +static int setup_page; +static uint32_t clock_ms,bot_at,last_action; +static bool redraw,dirty,reported,exit_after_save; +static bool attempted_uno; +static char message[84]; +static uint8_t evidence[108],evidence_count,evidence_color; +static uint32_t ui_random=1; +static const char*const WHO[4]={"You","Bot 1","Bot 2","Bot 3"}; +static const char*const COLORS[4]={"Red","Yellow","Green","Blue"}; +static const color_t COLOR[4]={HEX(0xE84D50),HEX(0xEAC643),HEX(0x33B878),HEX(0x4D9DE0)}; +static bool action_available(int i); +static uint32_t random_ui(void){ui_random^=ui_random<<13;ui_random^=ui_random>>17;return ui_random^=ui_random<<5;} +static char* number(char*p,unsigned v){char a[10];int n=0;do{a[n++]='0'+v%10;}while((v/=10));while(n)*p++=a[--n];*p=0;return p;} +static char* text(char*p,const char*s){while(*s)*p++=*s++;*p=0;return p;} +static void box(int x,int y,int w,int h,color_t c){gfx_rrect(x,y,w,h,7,c,256);} +static void label(int x,int y,const char*s,color_t c){gfx_text(&np_font_small,x,y,s,c,256);} +static void center(int x,int y,const char*s,color_t c){gfx_text_center(&np_font_body,x,y,s,c,256);} +static void title(int x,int y,const char*s){gfx_text_center(&np_font_title,x,y,s,WHITE,256);} +static void background(void){ + for(int y=gfx_y0;y54||dy>=gfx_y1||dy+h<=gfx_y0||dx>=320||dx+w<=0)return; + const uint8_t*p=card_pixels+card_offsets[id];uint8_t row[CARD_W]; + int first=NP_MAX(dy,gfx_y0),last=NP_MIN(dy+h,gfx_y1),sy=-1; + for(int y=first;y>5)+1;while(run--)row[x++]=t&31;}}p+=n;} + for(int x=NP_MAX(0,dx);xevent; + if(e==E_PLAY)attempted_uno=false; + if(e==E_START){text(p,"Seven cards. Match a color or symbol.");} + else if(e==E_STALEMATE)text(p,"No cards can move. Redeal this round."); + else{ + p=text(p,WHO[g->actor%4]); + if(e==E_PLAY){p=text(p," played ");name_card(g->card,p);} + else if(e==E_COLOR){p=text(p," chose ");text(p,COLORS[g->color&3]);} + else if(e==E_DRAW||e==E_PENALTY){p=text(p," drew ");p=number(p,g->amount);text(p,g->amount==1?" card":" cards");} + else if(e==E_PASS)text(p," kept the card"); + else if(e==E_UNO)text(p,g->count[g->actor]==2?": UNO call ready":" called UNO!"); + else if(e==E_CAUGHT)text(p," forgot UNO: draw 2"); + else if(e==E_CHALLENGE_WON)text(p,": challenge won! Offender draws 4"); + else if(e==E_CHALLENGE_LOST)text(p,": challenge lost! Draw 6"); + else text(p," won the game!"); + } + dirty=redraw=true;last_action=clock_ms;bot_at=clock_ms+1300; + if(g->uno_player==0)bot_at=clock_ms+2200; + selected=NP_CLAMP(selected,0,(int)g->count[0]-1);if(selected<0)selected=0; + if(g->turn==0&&g->phase==U_DRAWN){selected=g->drawn;action=-1;} + if(action>=0&&!action_available(action))action=-1; + if(g->phase>=U_ROUND&&!reported){ + reported=true;sel=0;if(g->phase==U_MATCH){if(sv.played<65535)sv.played++;if(g->winner==0&&sv.wins<65535)sv.wins++;} + } +} +static void start_game(UnoRules rules){ + uno_new(G,rules,random_ui());sv.active=1;reported=false;attempted_uno=false;screen=S_PLAY;selected=0;action=-1;color_sel=0;notice(); +} +static void new_game(void){start_game(sv.prefs);} +static void next_round(void){uno_next_round(G);reported=false;selected=0;action=-1;color_sel=0;notice();} +static void panel(const char*heading){gfx_fill_alpha(0,0,320,240,0,140);box(15,18,290,204,INK);title(160,48,heading);} +static const char*const HELP_TITLE[7]={"Your turn","Action cards","Wild +4 challenge","Call UNO!","Winning","House rules","Controls"}; +static const char*const HELP[7]={ + "Match the top card's color, number or symbol. Wilds choose a color. You may draw instead of playing. After drawing, only that new card can be played; you may also keep it. Seven cards each.", + "+2: the next player draws two and loses a turn. Skip: skip the next player. Reverse: change direction. With two players, Reverse acts like Skip. Official rules never stack penalties.", + "A +4 is legal only if you have no card of the active color. You may bluff. Its target may challenge: a guilty offender draws 4; an innocent offender makes the challenger draw 6. The hand is revealed on a challenge.", + "Press 0 to call UNO before playing your next-to-last card, or right after. Forget it and another player can catch you for two cards, until the next player draws or plays. Press 0 to catch a bot that forgot.", + "The first player with no cards left wins the game. A final +2 or +4 is still resolved, including a possible +4 challenge. After the result, choose Play again for another game with the same table rules, or return to the menu.", + "Options are separate from classic rules. Stack only +2 on +2, or +4 on +4. Stacked +4 has no challenge. No stacking after a last card. You may also enable drawing until playable, forced play, or automatic UNO.", + "Left / Right: select a card. OK / EXE: play. Up: action buttons; Down: hand. 1: draw or accept penalty. 2: keep drawn card. 0: call UNO or catch. Back: pause. Home / Power: save and quit." +}; +static const char*const VARIANT[5]={"Stack +2","Stack +4","Draw until playable","Force drawn play","Automatic UNO"}; +static const char*const VARIANT_HELP[6]={"Restore classic card rules; all variants off.", + "Pass accumulated +2 cards to the next player.","Pass +4 cards on. Challenges are disabled.", + "Keep drawing until a playable card appears.","A playable drawn card must be played.","Call UNO automatically for every player."}; +static bool custom_rules(const UnoRules*r){return r->flags!=0;} +static void setting_value(int row,char*s){ + const UnoRules*r=&sv.prefs; + if(row==0){number(s,r->players);text(s+1," players");} + else text(s,(const char*const[]){"Casual","Normal","Clever"}[r->difficulty]); +} +static void settings_change(int dx){ + UnoRules*r=&sv.prefs; + if(setup_page==0){ + if(sel==0)r->players=2+(r->players-2+dx+3)%3; + else if(sel==1)r->difficulty=(r->difficulty+dx+3)%3; + }else if(setup_page==1){ + if(sel==0)r->flags=0; + else if(sel<=5)r->flags^=1u<<(sel-1); + } + dirty=true; +} +static void setup_seats(int y){ + for(int p=0;p<4;p++){ + int x=12+p*76;bool active=p",c);} + } + box(12,175,296,20,INK);gfx_text_center(&np_font_small,160,189,"First empty hand wins",WHITE,256); + button(12,201,296,"Next: rules >",sel==2); + }else if(setup_page==1){ + box(12,57,296,25,sel==0?GOLD:INK); + label(22,74,custom_rules(&sv.prefs)?"Custom rules":"Classic rules",sel==0?INK:WHITE); + gfx_text_right(&np_font_small,296,74,"OK: restore classic",sel==0?INK:MUTED,256); + for(int i=0;i<5;i++){ + int y=85+i*20;box(12,y,296,20,INK); + if(sel==i+1)gfx_rrect_outline(12,y,296,20,7,1,GOLD,256); + label(23,y+14,VARIANT[i],WHITE);toggle(253,y+2,sv.prefs.flags&(1u<",sel==6); + }else{ + setup_seats(57); + char*p=number(s,sv.prefs.players-1);p=text(p,sv.prefs.players==2?" bot / ":" bots / ");setting_value(1,p); + gfx_text_center(&np_font_small,160,128,s,WHITE,256); + gfx_text_center(&np_font_body,160,151,custom_rules(&sv.prefs)?"Custom table":"Classic UNO",GOLD,256); + const char*const short_rule[5]={"+2 stacking","+4 stacking","Draw until match","Forced draw play","Auto UNO"}; + for(int i=0;i<5;i++){ + int x=12+(i%2)*152,y=158+(i/2)*15;bool on=sv.prefs.flags&(1u<turn==p&&G->phasecount[p]);text(z," cards");label(x+21,y+30,s,WHITE); + if(G->count[p]==1)label(x+w-28,y+13,"UNO",G->uno_player==p?GOLD:MUTED); +} +static bool draw_available(void){return !G->turn&&(G->phase==U_TURN||(G->phase==U_DRAWN&&!(G->rules.flags&R_FORCE)));} +static bool uno_available(void){return G->phaseuno_player!=UNO_NONE||(!G->turn&&G->count[0]==2&&(G->phase==U_TURN||G->phase==U_DRAWN)));} +static bool action_available(int i){return i==2||(i==0?draw_available():uno_available());} +static void hand_card(int i,int x,bool focus){ + int c=G->hands[0][i],y=focus?160:172,w=focus?44:38,h=focus?64:55; + if(focus)gfx_rrect_outline(x-2,y-2,w+4,h+4,7,2,G->turn?WHITE:GOLD,256); + card(c,x,y,w,h); + char s[8];int v=uno_value(c);if(v<10)number(s,v);else text(s,v==10?"S":v==11?"R":v==12?"+2":c==52?"W":"+4"); + box(x+2,y+2,23,15,c<52?COLOR[c/13]:INK);label(x+5,y+13,s,c<52&&c/13==1?INK:WHITE); + if(G->turn==0&&uno_can_play(G,i))gfx_circle(x+8,y+h-7,3,GOLD,256); +} +static void hand(void){ + Uno*g=G;int n=g->count[0],visible=NP_MIN(n,8),first=NP_CLAMP(selected-3,0,n-visible); + int spacing=visible>1?NP_MIN(38,260/(visible-1)):0,w=visible?44+(visible-1)*spacing:0,x0=(320-w)/2; + gfx_fill_alpha(0,158,320,70,INK,110); + for(int j=0;jselected?6:0),false); + if(n)hand_card(selected,x0+(selected-first)*spacing,true); + if(first)label(3,204,"<",GOLD);if(first+visible",GOLD); + char s[60];gfx_fill(0,228,320,12,INK); + if(n)name_card(g->hands[0][selected],s);else text(s,"No cards left");label(6,238,s,WHITE); + char*p=number(s,n?selected+1:0);p=text(p,"/");number(p,n);gfx_text_center(&np_font_small,160,238,s,MUTED,256); + const char*hint=g->turn?"Wait for your turn":n&&uno_can_play(g,selected)?"OK: play":"Not playable"; + if(!g->turn&&g->phase==U_DRAWN&&!uno_can_play(g,selected))hint="New card only"; + if(action>=0)hint="Down: your hand"; + gfx_text_right(&np_font_small,314,238,hint,!g->turn&&n&&uno_can_play(g,selected)?GOLD:MUTED,256); +} +static void table_action(int x,int w,const char*s,int id,bool enabled){ + bool focus=action==id;box(x,136,w,21,focus?GOLD:INK); + gfx_text_center(&np_font_small,x+w/2,151,s,focus?INK:enabled?WHITE:MUTED,256); +} +static void table(void){ + Uno*g=G;char s[60];bool human=g->turn==0&&g->phaseuno_player!=UNO_NONE&&g->phaserules)?"Custom":"Classic",bar);char*p; + p=text(s,g->phase>=U_ROUND?(g->phase==U_MATCH?"GAME OVER":"REDEAL"):human?"YOUR TURN":WHO[g->turn]); + if(!human&&g->phaseuno_player==0?"0: CALL UNO!":"0: CATCH UNO!"); + gfx_text_center(&np_font_body,153,15,s,bar,256); + p=number(s,g->rules.players);text(p," players"); + gfx_text_right(&np_font_small,313,14,s,bar,256); + if(g->rules.players==2)bot_badge(1,119,22,82); + else if(g->rules.players==3){bot_badge(1,5,77,65);bot_badge(2,250,77,65);} + else{bot_badge(1,5,77,65);bot_badge(2,119,22,82);bot_badge(3,250,77,65);} + if(g->rules.players==3){gfx_text_center(&np_font_small,160,39,custom_rules(&g->rules)?"Custom table":"Classic table",MUTED,256);} + gfx_text_center(&np_font_small,99,70,"DRAW",MUTED,256);gfx_text_center(&np_font_small,172,70,"DISCARD",MUTED,256); + card(54,80,75,38,55);card(g->discard[g->xn-1],151,72,42,61); + box(85,111,28,15,INK);number(s,g->dn);gfx_text_center(&np_font_small,99,123,s,WHITE,256); + gfx_text_center(&np_font_small,222,69,"COLOR",MUTED,256); + if(g->color<4){box(201,74,42,36,COLOR[g->color]);gfx_text_center(&np_font_small,222,96,COLORS[g->color],g->color==1?INK:WHITE,256);} + gfx_text_center(&np_font_small,222,128,g->rules.players==2?"2 players":g->direction==1?"Clockwise":"Counter-CW",MUTED,256); + hand(); + box(5,136,64,21,human?GOLD:INK);p=text(s,"YOU ");number(p,g->count[0]);gfx_text_center(&np_font_small,37,151,s,human?INK:MUTED,256); + if(g->phase==U_DRAWN)text(s,g->rules.flags&R_FORCE?"Must play":"2 Keep"); + else if(g->pending){p=text(s,"1 Draw +");number(p,g->pending);}else text(s,"1 Draw"); + table_action(74,72,s,0,draw_available()); + table_action(151,72,g->uno_player!=UNO_NONE&&g->uno_player!=0?"0 Catch!":g->uno_armed==0?"UNO ready":"0 UNO!",1,uno_available()); + table_action(228,87,"Back: pause",2,true); + if(screen==S_PLAY&&human&&g->phase==U_COLOR){ + panel("Choose a color"); + for(int i=0;i<4;i++){int x=34+i*66;box(x,84,54,58,COLOR[i]);if(i==color_sel)gfx_rrect_outline(x-3,81,60,64,9,3,WHITE,256);gfx_text_center(&np_font_small,x+27,119,COLORS[i],i==1?INK:WHITE,256);} + center(160,180,"Left / Right, then OK",MUTED); + }else if(screen==S_PLAY&&human&&g->phase==U_CHALLENGE){ + panel("Wild +4");gfx_paragraph(&np_font_small,160,73,255,16,"Did the offender have a card of the previous color? Challenge to reveal their hand.",WHITE,256); + button(36,127,248,"Accept: draw 4",sel==0);button(36,159,248,"Challenge: risk drawing 6",sel==1); + gfx_text_center(&np_font_small,160,205,"Previous color",MUTED,256);gfx_circle(246,201,6,COLOR[g->old_color&3],256); + }else if(screen==S_PLAY&&g->phase>=U_ROUND){ + if(g->winner==UNO_NONE){ + panel("Table blocked");center(160,106,"Nobody can play or draw.",WHITE); + button(36,171,248,"Redeal cards",true); + }else{ + p=text(s,g->winner?WHO[g->winner]:"You");text(p,g->winner?" wins!":" win!");panel(s); + card(g->discard[g->xn-1],138,61,44,64); + gfx_text_center(&np_font_small,160,146,"First empty hand. Game won!",GOLD,256); + button(36,160,248,"Play again",sel==0);button(36,190,248,"Back to menu",sel==1); + } + } +} +static void scene(void*unused){ + (void)unused;background();char s[90]; + if(screen==S_MENU||screen==S_SETTINGS||screen==S_REPLACE||screen==S_EXIT||screen==S_SAVE_ERROR){ + if(screen==S_MENU||screen==S_EXIT||screen==S_SAVE_ERROR){ + gfx_text(&np_font_title,24,53,"UNO",WHITE,256);label(26,75,"The classic card game",MUTED); + card(0,239,53,47,68);card(53,222,44,47,68);card(54,206,36,47,68); + static const char*const items[4]={"Continue","New game","How to play","Credits"}; + for(int i=0;i<4;i++)button(23,91+i*31,274,i==0&&!sv.active?"Continue - no saved match":items[i],sel==i); + label(24,233,"By Bobydeluxe",MUTED);gfx_text_right(&np_font_small,297,233,"Back: exit",MUTED,256); + }else setup_scene(); + }else if(screen==S_HELP||screen==S_CREDITS){ + title(160,34,screen==S_HELP?HELP_TITLE[help_page]:"Credits"); + box(14,48,292,161,INK); + gfx_paragraph(&np_font_body,160,72,266,20,screen==S_HELP?HELP[help_page]:"Game made by Bobydeluxe.\nCard and table art by AlexDer.\nUNO is a Mattel game.\nUnofficial fan adaptation.",WHITE,256); + if(screen==S_HELP){char*p=number(s,help_page+1);p=text(p," / 7 Left / Right Back");(void)p;}else text(s,"Back: return"); + gfx_text_center(&np_font_small,160,232,s,MUTED,256); + }else if(sv.active)table(); + if(screen==S_PAUSE){ + panel("Paused");static const char*const items[4]={"Resume","Table rules","Save to menu","Save and exit"}; + for(int i=0;i<4;i++)button(36,62+i*33,248,items[i],sel==i); + }else if(screen==S_REPLACE){ + panel("Replace this game?");gfx_paragraph(&np_font_body,160,83,254,21,"Starting a new game replaces your current game.",WHITE,256); + button(36,132,248,"Keep current game",sel==0);button(36,166,248,"Start new game",sel==1); + }else if(screen==S_EXIT){ + panel("Save and exit?");button(36,90,248,"Stay",sel==0);button(36,127,248,"Save and exit",sel==1); + }else if(screen==S_SAVE_ERROR){ + panel("Save failed");gfx_paragraph(&np_font_small,160,76,256,17,"Calculator storage is full or unavailable. Your existing files were kept.",WHITE,256); + button(36,119,248,"Retry saving",sel==0);button(36,153,248,exit_after_save?"Exit without saving":"Return without saving",sel==1); + }else if(screen==S_TABLE_INFO){ + panel("Table rules"); + for(int i=0;i<5;i++){int y=66+i*24;label(30,y+13,VARIANT[i],WHITE);toggle(245,y,G->rules.flags&(1u<event==E_CHALLENGE_WON?"Illegal +4: offender draws 4":"Legal +4: challenger draws 6",GOLD,256); + gfx_text_center(&np_font_small,160,211,"Left / Right: cards OK: continue",MUTED,256); + } +} +static bool key(uint64_t k,int id){return (k>>id)&1;} +static void uno_action(void){ + if(G->uno_player!=UNO_NONE&&G->uno_player!=0){if(uno_catch(G,0))notice();} + else if(uno_call(G,0))notice(); + else{set_message("Call UNO when you have two cards.");redraw=true;} +} +static void draw_action(void){ + if(G->turn)return; + if(G->phase==U_DRAWN){if(uno_keep(G))notice();} + else if(G->phase==U_TURN||G->phase==U_CHALLENGE){if(G->pending?uno_accept(G):uno_draw(G))notice();} +} +static void start_requested(void){ + if(sv.active){replace_to=S_SETTINGS;screen=S_REPLACE;sel=0;}else new_game(); +} +static void setup_input(int dx,int dy,bool ok,bool back){ + if(back){ + if(setup_page){setup_page--;sel=setup_page?6:2;} + else{screen=S_MENU;sel=1;} + return; + } + int rows=setup_page==0?3:setup_page==1?7:1; + if(dy)sel=(sel+dy+rows)%rows; + if(dx)settings_change(dx); + if(ok){ + if(setup_page==2)start_requested(); + else if(sel==rows-1){setup_page++;sel=0;} + else settings_change(1); + } +} +static void play_input(int dx,int dy,bool ok,bool draw,bool keep,bool call){ + Uno*g=G; + if(call){uno_action();return;} + if(g->phase>=U_ROUND){ + if(g->phase==U_MATCH){if(dy)sel^=1;if(ok){if(sel){sv.active=0;screen=S_MENU;sel=1;dirty=true;}else start_game(g->rules);}} + else if(ok)next_round(); + return; + } + if(g->turn==0&&g->phase==U_COLOR){color_sel=(color_sel+dx+4)%4;if(ok&&uno_choose_color(g,color_sel)){action=-1;notice();}return;} + if(g->turn==0&&g->phase==U_CHALLENGE){ + if(dy)sel^=1; + if(draw||(ok&&!sel)){uno_accept(g);notice();} + else if(ok){ + evidence_count=g->count[g->offender];memcpy(evidence,g->hands[g->offender],evidence_count);evidence_color=g->old_color; + uno_challenge(g);notice();selected=0;screen=S_EVIDENCE; + }return; + } + if(draw){draw_action();return;} + if(keep&&g->turn==0&&uno_keep(g)){notice();return;} + if(dy){action=dy<0?0:-1;while(action>=0&&!action_available(action))action++;} + if(action>=0){ + action=(action+dx+3)%3; + while(!action_available(action))action=(action+(dx<0?2:1))%3; + if(ok){if(action==0)draw_action();else if(action==1)uno_action();else{screen=S_PAUSE;sel=0;}} + }else{ + int n=g->count[0];if(dx&&n){selected=(selected+dx+n)%n;last_action=clock_ms-1800;} + if(ok&&!g->turn&&uno_play(g,selected,false)){color_sel=uno_bot_color(g,0);sel=0;notice();} + else if(ok&&!g->turn){set_message("Match the active color, number or symbol.");redraw=true;} + } +} +static void cpu_tick(void){ + Uno*g=G; + if(screen!=S_PLAY||g->phase>=U_ROUND||(int32_t)(clock_ms-bot_at)<0)return; + if(g->uno_player==0&&!attempted_uno){attempted_uno=true;if(random_ui()%100<70){uno_catch(g,1);notice();}bot_at=clock_ms+700;return;} + if(!g->turn)return; + if(g->uno_player!=UNO_NONE&&g->uno_player!=g->turn&&random_ui()%100<45){uno_catch(g,g->turn);notice();return;} + uno_bot(g);notice();color_sel=uno_bot_color(g,0);sel=0; +} +int main(void){ + np_app_begin();color_t*old_strip=gfx_buf;gfx_buf=strip; + sv.prefs=(UnoRules){4,1,0};uint32_t n=0;const uint8_t*b=np_file_read(SAVE_NAME,&n);save_decode(&sv,b,n); + uint32_t last=(uint32_t)eadk_timing_millis();ui_random=eadk_random()^last;if(!ui_random)ui_random=1; + screen=S_MENU;sel=sv.active?0:1;selected=0;action=-1;clock_ms=0;redraw=true;dirty=false; + uint64_t held=eadk_keyboard_scan(),stale=held;bool quit=false;uint32_t last_repeat=0;uint64_t repeat_keys=0; + while(!quit){ + uint32_t now=(uint32_t)eadk_timing_millis(),dt=now-last;last=now; + if(screen==S_PLAY){clock_ms+=NP_MIN(dt,100u);} + uint64_t k=eadk_keyboard_scan();stale&=k;k&=~stale;uint64_t hit=k&~held;held=k; + uint64_t arrows=(1ull<=0){hit|=repeat_keys;last_repeat=now+110;} + bool ok=key(hit,eadk_key_ok)||key(hit,eadk_key_exe),back=key(hit,eadk_key_back); + int dx=key(hit,eadk_key_right)-key(hit,eadk_key_left),dy=key(hit,eadk_key_down)-key(hit,eadk_key_up),before=screen; + if(hit)redraw=true; + if(screen!=S_SAVE_ERROR&&(key(k,eadk_key_home)||key(k,eadk_key_on_off))){ + if(save()){quit=true;continue;}exit_after_save=true;screen=S_SAVE_ERROR;sel=0;stale|=k;ok=back=false;dx=dy=0;redraw=true; + } + switch(screen){ + case S_MENU: + if(dy)sel=(sel+dy+4)%4; + if(ok){if(sel==0&&sv.active){screen=S_PLAY;reported=G->phase>=U_ROUND;bot_at=clock_ms+1300;} + else if(sel==1){screen=S_SETTINGS;setup_page=0;sel=0;} + else if(sel==2){return_to=S_MENU;screen=S_HELP;help_page=0;} + else if(sel==3){screen=S_CREDITS;return_to=S_MENU;}} + else if(back){screen=S_EXIT;sel=0;}break; + case S_SETTINGS: + setup_input(dx,dy,ok,back);break; + case S_PLAY: + if(back){screen=S_PAUSE;sel=0;} + else play_input(dx,dy,ok,key(hit,eadk_key_one),key(hit,eadk_key_two),key(hit,eadk_key_zero)); + cpu_tick();break; + case S_PAUSE: + if(dy)sel=(sel+dy+4)%4; + if(back||(ok&&!sel)){screen=S_PLAY;bot_at=clock_ms+800;} + else if(ok&&sel==1){screen=S_TABLE_INFO;} + else if(ok){exit_after_save=sel==3;if(save()){if(exit_after_save)quit=true;else screen=S_MENU,sel=0;}else screen=S_SAVE_ERROR,sel=0;} + break; + case S_HELP: + help_page=(help_page+dx+7)%7;if(back||ok){screen=return_to;sel=return_to==S_PAUSE?1:2;}break; + case S_CREDITS:if(back||ok){screen=S_MENU;sel=3;}break; + case S_TABLE_INFO: + if(back){screen=S_PAUSE;sel=1;}else if(ok){return_to=S_TABLE_INFO;screen=S_HELP;help_page=4;}break; + case S_REPLACE: + if(dy)sel^=1;if(back||(ok&&!sel)){screen=replace_to;setup_page=2;sel=0;}else if(ok)new_game();break; + case S_EXIT: + if(dy)sel^=1;if(back||(ok&&!sel)){screen=S_MENU;sel=1;}else if(ok){if(save())quit=true;else screen=S_SAVE_ERROR,sel=0,exit_after_save=true;}break; + case S_SAVE_ERROR: + if(dy)sel^=1; + if(ok){if(sel||save()){if(exit_after_save)quit=true;else screen=S_MENU,sel=0;}}break; + case S_EVIDENCE: + if(dx&&evidence_count)selected=(selected+dx+evidence_count)%evidence_count; + if(ok||back){screen=S_PLAY;selected=0;bot_at=clock_ms+1300;}break; + } + if(screen!=before){stale|=k;redraw=true;repeat_keys=0;last=(uint32_t)eadk_timing_millis();} + if(redraw){eadk_display_wait_for_vblank();gfx_render(scene,0,0,240);redraw=false;} + eadk_timing_msleep(8); + } + gfx_buf=old_strip;return np_app_end(); +} diff --git a/games/uno/src/save.h b/games/uno/src/save.h new file mode 100644 index 00000000..f18995bc --- /dev/null +++ b/games/uno/src/save.h @@ -0,0 +1,59 @@ +#ifndef UNO_SAVE_H +#define UNO_SAVE_H +#include "uno.h" +#define UNO_SAVE_BYTES 768 +typedef struct { Uno game; UnoRules prefs; uint16_t played, wins; uint8_t active; } UnoSave; +static uint32_t save_crc(const uint8_t*p,unsigned n){ + uint32_t c=~0u;while(n--){c^=*p++;for(int j=0;j<8;j++)c=(c>>1)^(0xEDB88320u&-(c&1));}return ~c; +} +static void save_encode(const UnoSave*s,uint8_t*b){ + memset(b,0,UNO_SAVE_BYTES);uint8_t*p=b; + *p++='U';*p++='N';*p++='O';*p++=2;*p++=s->active; + *p++=s->prefs.players;*p++=s->prefs.difficulty;*p++=s->prefs.flags;p++; /* reserved */ +#define PUT16(v) do {unsigned t=(v);*p++=t;*p++=t>>8;}while(0) +#define PUT32(v) do {uint32_t t=(v);for(int k=0;k<4;k++)*p++=t>>(k*8);}while(0) + PUT16(s->played);PUT16(s->wins); + const Uno*g=&s->game; + *p++=g->rules.players;*p++=g->rules.difficulty;*p++=g->rules.flags;p++; + memcpy(p,g->hands,sizeof g->hands);p+=sizeof g->hands;memcpy(p,g->count,4);p+=4; + memcpy(p,g->deck,108);p+=108;memcpy(p,g->discard,108);p+=108; + *p++=g->dn;*p++=g->xn; + p+=8; /* Former v1 point totals: always zero in v2. */ + PUT16(g->round);p+=2;PUT16(g->turns);PUT32(g->rng); +#define WRITE(f) *p++=g->f + WRITE(dealer);WRITE(turn);WRITE(color);WRITE(phase);WRITE(pending);WRITE(penalty_kind);WRITE(offender); + WRITE(guilty);WRITE(old_color);WRITE(drawn);WRITE(candidate);WRITE(winner);WRITE(uno_player);WRITE(uno_armed); + WRITE(stalls);WRITE(event);WRITE(actor);WRITE(card);WRITE(amount);WRITE(direction); +#undef WRITE + p=b+UNO_SAVE_BYTES-4;PUT32(save_crc(b,UNO_SAVE_BYTES-4)); +#undef PUT16 +#undef PUT32 +} +static bool save_decode(UnoSave*s,const uint8_t*b,unsigned n){ + if(!b||n!=UNO_SAVE_BYTES||b[0]!='U'||b[1]!='N'||b[2]!='O'||(b[3]!=1&&b[3]!=2))return false; + unsigned at=UNO_SAVE_BYTES-4;uint32_t crc=0;for(int k=0;k<4;k++)crc|=(uint32_t)b[at+k]<<(k*8); + if(crc!=save_crc(b,at))return false; + UnoSave t={0};const uint8_t*p=b+4;t.active=*p++; + t.prefs.players=*p++;t.prefs.difficulty=*p++;t.prefs.flags=*p++;p++; + if(t.active>1||t.prefs.players<2||t.prefs.players>4||t.prefs.difficulty>2||t.prefs.flags>31)return false; +#define GET16(v) do{(v)=(uint16_t)(p[0]|p[1]<<8);p+=2;}while(0) +#define GET32(v) do{(v)=0;for(int k=0;k<4;k++)(v)|=(uint32_t)*p++<<(k*8);}while(0) + GET16(t.played);GET16(t.wins);Uno*g=&t.game; + g->rules.players=*p++;g->rules.difficulty=*p++;g->rules.flags=*p++;p++; + memcpy(g->hands,p,sizeof g->hands);p+=sizeof g->hands;memcpy(g->count,p,4);p+=4; + memcpy(g->deck,p,108);p+=108;memcpy(g->discard,p,108);p+=108;g->dn=*p++;g->xn=*p++; + p+=8;GET16(g->round);p+=2;GET16(g->turns);GET32(g->rng); +#define READ(f) g->f=*p++ + READ(dealer);READ(turn);READ(color);READ(phase);READ(pending);READ(penalty_kind);READ(offender); + READ(guilty);READ(old_color);READ(drawn);READ(candidate);READ(winner);READ(uno_player);READ(uno_armed); + READ(stalls);READ(event);READ(actor);READ(card);READ(amount);READ(direction); +#undef READ +#undef GET16 +#undef GET32 + /* A won v1 round now ends the game. In-progress cards and rules survive; + old point totals and target settings are intentionally discarded. */ + if(b[3]==1&&g->phase==U_ROUND&&g->winner!=UNO_NONE){g->phase=U_MATCH;g->event=E_MATCH;} + if(t.active&&!uno_valid(g))return false; + *s=t;return true; +} +#endif diff --git a/games/uno/src/uno.c b/games/uno/src/uno.c new file mode 100644 index 00000000..6d8849db --- /dev/null +++ b/games/uno/src/uno.c @@ -0,0 +1,216 @@ +#include "uno.h" +#include +static uint32_t random32(Uno*g){uint32_t x=g->rng;x^=x<<13;x^=x>>17;x^=x<<5;return g->rng=x?x:1;} +static int next(const Uno*g,int p){return (p+g->rules.players+g->direction)%g->rules.players;} +static void event(Uno*g,int e,int p,int c,int n){g->event=e;g->actor=p;g->card=c;g->amount=n;} +static void shuffle(Uno*g){for(int i=g->dn-1;i>0;i--){int j=random32(g)%(i+1),c=g->deck[i];g->deck[i]=g->deck[j];g->deck[j]=c;}} +static bool take(Uno*g,int p){ + if(!g->dn&&g->xn>1){int c=g->discard[g->xn-1];g->dn=g->xn-1;memcpy(g->deck,g->discard,g->dn);g->discard[0]=c;g->xn=1;shuffle(g);} + if(!g->dn||g->count[p]>=UNO_CARDS)return false; + g->hands[p][g->count[p]++]=g->deck[--g->dn];return true; +} +static int take_n(Uno*g,int p,int n){int got=0;while(gotuno_player=UNO_NONE;g->uno_armed=UNO_NONE;g->turns++;} +static bool matching(const Uno*g,int c){int top=g->discard[g->xn-1];return c>=52||uno_color(c)==g->color||uno_value(c)==uno_value(top);} +static void finish(Uno*g,int w){ + g->winner=w;g->candidate=UNO_NONE;g->phase=U_MATCH; + event(g,E_MATCH,w,0,0); +} +static void check_out(Uno*g){if(g->candidate!=UNO_NONE&&!g->pending)finish(g,g->candidate);} +void uno_next_round(Uno*g){ + if(g->round)g->dealer=(g->dealer+1)%g->rules.players; + g->round++;g->direction=1;g->phase=U_TURN;g->dn=0;g->xn=0;g->pending=0;g->turns=0;g->stalls=0; + g->winner=g->candidate=g->uno_player=g->uno_armed=g->drawn=UNO_NONE; + memset(g->count,0,sizeof g->count); + for(int c=0;c<52;c++){g->deck[g->dn++]=c;if(c%13)g->deck[g->dn++]=c;} + for(int i=0;i<4;i++){g->deck[g->dn++]=UNO_WILD;g->deck[g->dn++]=UNO_DRAW4;} + shuffle(g); + for(int n=0;n<7;n++)for(int p=0;prules.players;p++)take(g,(g->dealer+1+p)%g->rules.players); + /* Opening +4 goes back in the deck; no random-retry loop. */ + int at=g->dn-1;while(at>=0&&g->deck[at]==UNO_DRAW4)at--; + bool rejected=at!=g->dn-1; + int c=g->deck[at];g->deck[at]=g->deck[g->dn-1];g->dn--;g->discard[g->xn++]=c; + if(rejected)shuffle(g); + g->color=uno_color(c);g->turn=next(g,g->dealer); + int v=uno_value(c); + if(v==UNO_REVERSE){g->direction=-1;g->turn=g->dealer;} + else if(v==UNO_SKIP)g->turn=next(g,g->turn); + else if(v==UNO_DRAW2){take_n(g,g->turn,2);g->turn=next(g,g->turn);} + else if(c==UNO_WILD)g->phase=U_COLOR; + event(g,E_START,g->turn,c,0);g->offender=UNO_NONE; +} +void uno_new(Uno*g,UnoRules r,uint32_t seed){ + memset(g,0,sizeof *g);g->rules=r;g->rules.players=r.players<2?2:r.players>4?4:r.players; + g->rules.difficulty=r.difficulty%3;g->rules.flags=r.flags&31;g->rng=seed?seed:1;g->direction=1; + /* Official dealer selection: each player draws, highest number (actions=0). + * Ties redraw only among tied players, from the same finite shuffled deck. */ + uint8_t pool[UNO_CARDS];int n=0; + for(int c=0;c<52;c++){pool[n++]=c;if(c%13)pool[n++]=c;} + for(int i=0;i<4;i++){pool[n++]=UNO_WILD;pool[n++]=UNO_DRAW4;} + for(int i=n-1;i>0;i--){int j=random32(g)%(i+1),c=pool[i];pool[i]=pool[j];pool[j]=c;} + unsigned eligible=(1u<rules.players)-1;int index=0; + while((eligible&(eligible-1))&&index+g->rules.players<=n){ + int best=-1;unsigned tied=0; + for(int p=0;prules.players;p++)if(eligible&(1u<9)v=0; + if(v>best){best=v;tied=1u<rules.players;p++)if(eligible&(1u<dealer=p;break;} + uno_next_round(g); +} +bool uno_can_play(const Uno*g,int i){ + if(i<0||i>=g->count[g->turn]||g->phase>=U_ROUND||g->phase==U_COLOR)return false; + if(g->phase==U_DRAWN&&i!=g->drawn)return false; + int c=g->hands[g->turn][i]; + if(g->pending){ + if(g->candidate!=UNO_NONE)return false; + return (g->penalty_kind==2&&(g->rules.flags&R_STACK2)&&uno_value(c)==UNO_DRAW2)|| + (g->penalty_kind==4&&(g->rules.flags&R_STACK4)&&c==UNO_DRAW4); + } + return g->phase!=U_CHALLENGE&&matching(g,c); +} +static void apply(Uno*g,int c){ + int p=g->turn,v=uno_value(c);g->phase=U_TURN; + if(v==UNO_DRAW2||c==UNO_DRAW4){ + int n=c==UNO_DRAW4?4:2;g->pending+=n;g->penalty_kind=n;g->offender=p;g->turn=next(g,p); + if(c==UNO_DRAW4&&!(g->rules.flags&R_STACK4))g->phase=U_CHALLENGE; + /* Last-card penalties cannot be stacked: the round has ended. +4 may + still be challenged before the penalty and win are settled. */ + else if(g->candidate!=UNO_NONE)uno_accept(g); + }else{ + if(v==UNO_REVERSE&&g->rules.players>2)g->direction=-g->direction; + g->turn=next(g,p); + if(v==UNO_SKIP||(v==UNO_REVERSE&&g->rules.players==2))g->turn=next(g,g->turn); + check_out(g); + } +} +bool uno_play(Uno*g,int i,bool announce){ + if(!uno_can_play(g,i))return false; + int p=g->turn,c=g->hands[p][i];bool armed=g->uno_armed==p; + /* A +4 may be bluffed; only a challenge consults this saved evidence. */ + g->old_color=g->color;g->guilty=0; + if(c==UNO_DRAW4)for(int j=0;jcount[p];j++)if(j!=i&&uno_color(g->hands[p][j])==g->color)g->guilty=1; + begin_action(g);g->stalls=0; + memmove(&g->hands[p][i],&g->hands[p][i+1],g->count[p]-i-1);g->count[p]--; + g->discard[g->xn++]=c;g->drawn=UNO_NONE; + if(g->count[p]==1){if(!(announce||armed||(g->rules.flags&R_AUTO_UNO)))g->uno_player=p;} + if(!g->count[p])g->candidate=p; + event(g,E_PLAY,p,c,0); + if(c>=52){g->phase=U_COLOR;g->offender=p;} + else{g->color=uno_color(c);apply(g,c);} + return true; +} +bool uno_choose_color(Uno*g,int color){ + if(g->phase!=U_COLOR||color<0||color>3)return false; + g->color=color; + if(g->offender==UNO_NONE){g->phase=U_TURN;event(g,E_COLOR,g->turn,0,color);} + else {int c=g->discard[g->xn-1];event(g,E_COLOR,g->turn,c,color);apply(g,c);} + return true; +} +bool uno_accept(Uno*g){ + if(!g->pending||g->phase==U_COLOR||g->phase>=U_ROUND)return false; + int p=g->turn,n=g->pending;begin_action(g);int got=take_n(g,p,n);g->pending=0;g->phase=U_TURN; + g->turn=next(g,p);event(g,E_PENALTY,p,0,got);check_out(g);return true; +} +bool uno_challenge(Uno*g){ + if(g->phase!=U_CHALLENGE)return false; + int p=g->turn,o=g->offender;begin_action(g);g->phase=U_TURN;g->pending=0; + if(g->guilty){int n=take_n(g,o,4);if(g->candidate==o)g->candidate=UNO_NONE;event(g,E_CHALLENGE_WON,p,0,n);} + else{int n=take_n(g,p,6);g->turn=next(g,p);event(g,E_CHALLENGE_LOST,p,0,n);} + check_out(g);return true; +} +bool uno_draw(Uno*g){ + if(g->phase!=U_TURN)return false; + if(g->pending)return uno_accept(g); + int p=g->turn;begin_action(g);int n=0; + do {if(!take(g,p))break;n++;g->drawn=g->count[p]-1;} + while((g->rules.flags&R_DRAW_UNTIL)&&!matching(g,g->hands[p][g->drawn])); + event(g,E_DRAW,p,0,n); + if(n&&matching(g,g->hands[p][g->drawn])){ + g->phase=U_DRAWN;g->stalls=0; + if((g->rules.flags&R_FORCE)&&g->hands[p][g->drawn]<52)uno_play(g,g->drawn,false); + /* Wild still needs the player's colour decision. */ + }else{ + g->turn=next(g,p);g->drawn=UNO_NONE; + if(!n)g->stalls++;else g->stalls=0; + if(g->stalls>=g->rules.players){g->phase=U_ROUND;g->winner=UNO_NONE;event(g,E_STALEMATE,p,0,0);} + } + return true; +} +bool uno_keep(Uno*g){ + if(g->phase!=U_DRAWN||(g->rules.flags&R_FORCE))return false; + int p=g->turn;g->drawn=UNO_NONE;g->phase=U_TURN;g->turn=next(g,p);event(g,E_PASS,p,0,0);return true; +} +bool uno_call(Uno*g,int p){ + if(g->phase>=U_ROUND||p<0||p>=g->rules.players)return false; + if(g->uno_player==p){g->uno_player=UNO_NONE;event(g,E_UNO,p,0,0);return true;} + if(g->count[p]==2&&p==g->turn&&(g->phase==U_TURN||g->phase==U_DRAWN)){g->uno_armed=p;event(g,E_UNO,p,0,0);return true;} + return false; +} +bool uno_catch(Uno*g,int p){ + int o=g->uno_player;if(o==UNO_NONE||p==o||p<0||p>=g->rules.players||g->phase>=U_ROUND)return false; + int got=take_n(g,o,2);g->uno_player=UNO_NONE;event(g,E_CAUGHT,o,0,got);return true; +} +int uno_bot_color(const Uno*g,int p){ + int counts[4]={0},best=0;for(int i=0;icount[p];i++){int c=g->hands[p][i];if(c<52)counts[c/13]++;} + for(int c=1;c<4;c++)if(counts[c]>counts[best])best=c;return best; +} +int uno_bot_card(const Uno*g){ + int best=-1,rank=-10000,p=g->turn,counts[4]={0}; + for(int i=0;icount[p];i++)if(g->hands[p][i]<52)counts[g->hands[p][i]/13]++; + for(int i=0;icount[p];i++)if(uno_can_play(g,i)){ + /* Card-selection priorities are private strategy, not a player score. */ + int c=g->hands[p][i],v=uno_value(c),r=c>=52?5:v>=10?20:v; + if(c<52)r+=counts[c/13]*(g->rules.difficulty==2?7:3); + else if(c==UNO_DRAW4&&counts[g->color])r-=150; + if(g->rules.difficulty==2&&g->count[next(g,p)]<=2&&(v>=10&&v<=12))r+=55; + if(g->rules.difficulty==2&&v==UNO_REVERSE&&g->rules.players>2&&g->count[(p+g->rules.players-g->direction)%g->rules.players]<=2)r-=45; + if(g->rules.difficulty==0)r=(int)((g->rng^(unsigned)c*2654435761u)%(r< -100?10:100)); + if(r>rank){rank=r;best=i;} + }return best; +} +void uno_bot(Uno*g){ + if(g->phase>=U_ROUND)return; + int p=g->turn; + if(g->phase==U_COLOR){uno_choose_color(g,uno_bot_color(g,p));return;} + if(g->phase==U_CHALLENGE){ + /* Decision uses RNG, difficulty and public hand sizes, never guilty or + any other player's hidden cards. The engine reveals evidence after. */ + unsigned chance=g->rules.difficulty==0?20:g->rules.difficulty==1?12:8; + if(random32(g)%100=0){ + if(g->phase==U_DRAWN&&!(g->rules.flags&R_FORCE)&&g->rules.difficulty==0&&random32(g)%12==0){uno_keep(g);return;} + bool call=random32(g)%100<(g->rules.difficulty==0?85:97); + uno_play(g,i,call); + }else if(g->phase==U_DRAWN)uno_keep(g); + else uno_draw(g); +} +bool uno_valid(const Uno*g){ + if(g->rules.players<2||g->rules.players>4||g->rules.difficulty>2||g->rules.flags>31||!g->rng|| + g->turn>=g->rules.players||g->dealer>=g->rules.players||g->phase>U_MATCH||!g->xn||g->xn>108||g->dn>108|| + (g->direction!=1&&g->direction!=-1)||g->color>4||g->pending>104||g->event>E_STALEMATE)return false; + if(g->color==4&&!(g->phase==U_COLOR&&g->offender==UNO_NONE))return false; + const uint8_t ids[]={g->offender,g->candidate,g->winner,g->uno_player,g->uno_armed}; + for(unsigned i=0;i=g->rules.players)return false; + if(g->phase==U_DRAWN&&(g->drawn>=g->count[g->turn]||g->pending))return false; + if(g->phase==U_CHALLENGE&&(!g->pending||g->penalty_kind!=4||g->offender==UNO_NONE))return false; + if(g->pending&&g->penalty_kind!=2&&g->penalty_kind!=4)return false; + if(g->phase==U_COLOR&&g->discard[g->xn-1]<52)return false; + if(g->uno_player!=UNO_NONE&&g->count[g->uno_player]!=1)return false; + if(g->candidate!=UNO_NONE&&g->count[g->candidate])return false; + if(g->phase==U_MATCH&&(g->winner==UNO_NONE||g->count[g->winner]))return false; + if(g->phase==U_ROUND&&g->winner!=UNO_NONE)return false; + uint8_t hist[54]={0};int total=g->dn+g->xn; + for(int p=0;p<4;p++){ + if(g->count[p]>108||(p>=g->rules.players&&g->count[p]))return false; + total+=g->count[p];for(int i=0;icount[p];i++){int c=g->hands[p][i];if(c>53)return false;hist[c]++;} + } + if(total!=108)return false; + for(int i=0;idn;i++){if(g->deck[i]>53)return false;hist[g->deck[i]]++;} + for(int i=0;ixn;i++){if(g->discard[i]>53)return false;hist[g->discard[i]]++;} + for(int c=0;c<54;c++)if(hist[c]!=(c>=52?4:c%13?2:1))return false; + return true; +} diff --git a/games/uno/src/uno.h b/games/uno/src/uno.h new file mode 100644 index 00000000..258db660 --- /dev/null +++ b/games/uno/src/uno.h @@ -0,0 +1,42 @@ +/* Classic 108-card UNO. The rules engine has no graphics, clock or heap. */ +#ifndef UNO_H +#define UNO_H +#include +#include +#define UNO_CARDS 108 +#define UNO_NONE 255 +enum { UNO_SKIP=10, UNO_REVERSE=11, UNO_DRAW2=12, UNO_WILD=52, UNO_DRAW4=53 }; +enum { U_TURN, U_COLOR, U_CHALLENGE, U_DRAWN, U_ROUND, U_MATCH }; +enum { R_STACK2=1, R_STACK4=2, R_DRAW_UNTIL=4, R_FORCE=8, R_AUTO_UNO=16 }; +enum { E_START, E_PLAY, E_DRAW, E_PASS, E_COLOR, E_PENALTY, E_CHALLENGE_WON, + E_CHALLENGE_LOST, E_UNO, E_CAUGHT, E_ROUND, E_MATCH, E_STALEMATE }; +typedef struct { uint8_t players, difficulty, flags; } UnoRules; +typedef struct { + UnoRules rules; + uint8_t hands[4][UNO_CARDS], count[4]; + uint8_t deck[UNO_CARDS], discard[UNO_CARDS], dn, xn; + uint16_t round, turns; + uint32_t rng; + uint8_t dealer, turn, color, phase, pending, penalty_kind, offender; + uint8_t guilty, old_color, drawn, candidate, winner, uno_player, uno_armed; + uint8_t stalls, event, actor, card, amount; + int8_t direction; +} Uno; +static inline int uno_color(int c) { return c<52?c/13:4; } +static inline int uno_value(int c) { return c<52?c%13:c; } +void uno_new(Uno*, UnoRules, uint32_t); +void uno_next_round(Uno*); +bool uno_can_play(const Uno*,int); +bool uno_play(Uno*,int,bool); +bool uno_choose_color(Uno*,int); +bool uno_draw(Uno*); +bool uno_keep(Uno*); +bool uno_accept(Uno*); +bool uno_challenge(Uno*); +bool uno_call(Uno*,int); +bool uno_catch(Uno*,int); +int uno_bot_card(const Uno*); +int uno_bot_color(const Uno*,int); +void uno_bot(Uno*); +bool uno_valid(const Uno*); +#endif diff --git a/games/uno/tests/eadk.h b/games/uno/tests/eadk.h new file mode 100644 index 00000000..d24a9127 --- /dev/null +++ b/games/uno/tests/eadk.h @@ -0,0 +1,12 @@ +#ifndef UNO_HOST_EADK +#define UNO_HOST_EADK +#include +enum { eadk_key_left=0,eadk_key_up=1,eadk_key_down=2,eadk_key_right=3,eadk_key_ok=4, + eadk_key_back=5,eadk_key_home=6,eadk_key_on_off=8,eadk_key_one=42,eadk_key_two=43, + eadk_key_zero=48,eadk_key_exe=52 }; +uint64_t eadk_timing_millis(void); +uint32_t eadk_random(void); +uint64_t eadk_keyboard_scan(void); +void eadk_display_wait_for_vblank(void); +void eadk_timing_msleep(uint32_t); +#endif diff --git a/games/uno/tests/legacy-save.bin b/games/uno/tests/legacy-save.bin new file mode 100644 index 0000000000000000000000000000000000000000..82ebf21b04943c6bae1fd034b9d6b63aa9e2b7dc GIT binary patch literal 768 zcmchS$q|A;5JkILgh5;Y!G%o_RFq9*lJKA>&t_l*CSWF38HZ`Pn}C;jm*3TWc)$1C z9io818z8|uQ%m71KLi%IrRh*XWubx$5|Jx(Ca&1FbK+@CT+)k<>{aWII5bwpWI4)e zXF+?DX-#p=FPnK^aAyIhOdAn37hOFa4m7nrZc6dGFZaS=?w2?)>Uz~}NKw*m%`FmY zy6Ss{P!W#ux#%c%Vp=woX`H!)$yZ;=4h{6+06O4jaXVcv-|+$Pcmsgscl^KC=6*gt E0R@U1rvLx| literal 0 HcmV?d00001 diff --git a/games/uno/tests/test_arm.py b/games/uno/tests/test_arm.py new file mode 100644 index 00000000..75f109bb --- /dev/null +++ b/games/uno/tests/test_arm.py @@ -0,0 +1,132 @@ +"""Run the actual Cortex-M7 app with Epsilon/Upsilon storage and exit checks.""" +import argparse,io,json,shlex,struct,tempfile,types +from pathlib import Path +ROOT=Path(__file__).resolve().parents[1];REPO=ROOT.parents[1] +emu_path=REPO/'tools/emu.py';emu=types.ModuleType('uno_emu');emu.__file__=str(emu_path);emu.io=io +source=emu_path.read_text().replace('ELFFile(open(elf, "rb"))','ELFFile(io.BytesIO(open(elf, "rb").read()))') +source=source.replace('cmd = [nwlink, "nwa-elf",','cmd = nwlink + ["nwa-elf",') +source=source.replace('chunk = CPU_HZ // 1000','chunk = CPU_HZ // 10000').replace('self.now_ms += 1\n','self.now_ms += 0.1\n') +source=source.replace(' next_frame = self.now_ms if frame_ms else None',' self.checkpoint = until_ms\n next_frame = self.now_ms if frame_ms else None') +source=source.replace(' self.slept_ms += r0\n',' self.slept_ms += r0\n if self.now_ms >= self.checkpoint: uc.emu_stop()\n') +exec(compile(source,str(emu_path),'exec'),emu.__dict__) +def storage(path,items): + data=bytearray(emu.STORAGE_SIZE);at=0 + for name,value in items: + r=name.encode()+b'\0'+value;n=2+len(r);struct.pack_into('=3 and at+n<=len(data);name,value=data[at+2:at+n].split(b'\0',1);result[name.decode()]=value;at+=n + return result +def uint(c,name):return struct.unpack(' 2 -> 3 -> 4; options change without creating a match. + key(c,'right');key(c,'right');key(c,'right') + c.save_png(str(out/(profile+'-setup.png'))) + review(c);c.save_png(str(out/(profile+'-review.png')));key(c,'ok');assert uint(c,'screen')==2 + c.run(c.now_ms+4500);check(c);c.save_png(str(out/(profile+'-table.png'))) + for _ in range(5):key(c,'right') + key(c,'0');key(c,'1');c.run(c.now_ms+2000) + key(c,'back');assert uint(c,'screen')==3 + frozen=uint(c,'clock_ms');c.run(c.now_ms+1200);assert uint(c,'clock_ms')==frozen + c.save_png(str(out/(profile+'-pause.png'))) + key(c,'down');key(c,'ok');assert uint(c,'screen')==10 + key(c,'ok');assert uint(c,'screen')==4 + for _ in range(7):key(c,'right') + key(c,'back');assert uint(c,'screen')==10 + key(c,'back');assert uint(c,'screen')==3 + key(c,'down');key(c,'ok');assert uint(c,'screen')==0 + saved=records(path.read_bytes())['uno.sav'];assert len(saved)==768 and saved[:5]==b'UNO\x02\x01' + assert not saved[8] and not saved[16] and not any(saved[671:679]) and not any(saved[681:683]) + saved_reference=saved + # Launch settings then cancel replacement, without changing the saved table. + key(c,'down');key(c,'ok');assert uint(c,'screen')==1 + review(c);key(c,'ok');assert uint(c,'screen')==6 + for _ in range(4):key(c,'back') + assert uint(c,'screen')==0 + key(c,'up');key(c,'ok');assert uint(c,'screen')==2 + key(c,'back');key(c,'home',90);c.run(c.now_ms+150);exit_check(c,system=='upsilon') + assert records(path.read_bytes())['keep.py']==sentinel + d=emu.Calculator(app,storage_file=str(path),nwlink=nw);d.enable_checks();d.run(250) + assert uint(d,'screen')==0 and uint(d,'sel')==0 + key(d,'ok');assert uint(d,'screen')==2 + before_resume=records(path.read_bytes())['uno.sav'] + key(d,'back');key(d,'onoff',90);d.run(d.now_ms+150);exit_check(d,system=='upsilon') + assert records(path.read_bytes())['uno.sav']==before_resume + frames=c.svc_counts.get(19,0)//15 + r=dict(profile=profile,static_ram=json.loads((ROOT/'output/sizes.json').read_text())['profiles'][0]['static_ram'],peak_stack_bytes=max(c.stack_used(),d.stack_used()), + average_render_work_ms=round((c.now_ms-c.slept_ms)/max(1,frames),2), + gameplay=True,pause_freezes=True,save_resume=True,firmware_memory_preserved=True,clean_exit=True) + report.append(r);print(json.dumps(r),flush=True) + emu.configure();emu.CPU_HZ=216_000_000 + # Real key paths for play, manual UNO, legal/illegal challenges, draws, + # wild colour choice and a completed match. Fixtures are engine-validated. + def start_fixture(name): + p=out/(name+'.storage');storage(p,[('keep.py',sentinel),('uno.sav',(ROOT/'output'/(name+'.sav')).read_bytes())]) + c=emu.Calculator(app,storage_file=str(p),nwlink=nw);c.enable_checks();c.run(200);key(c,'ok');assert uint(c,'screen')==2;return c,p + def finish_fixture(c,p): + key(c,'back');key(c,'home');c.run(c.now_ms+150);exit_check(c);r=records(p.read_bytes());assert r['keep.py']==sentinel;return r['uno.sav'] + c,p=start_fixture('play');key(c,'0');key(c,'ok');saved=finish_fixture(c,p) + assert saved[449]==1 and saved[701]==255 # human called UNO and played one card + c,p=start_fixture('draw');key(c,'1');key(c,'left');key(c,'ok');saved=finish_fixture(c,p) + assert saved[449]==2 and saved[692]==3 # cannot play an old hand card after drawing + c,p=start_fixture('draw');key(c,'1');key(c,'2');saved=finish_fixture(c,p) + assert saved[449]==2 and saved[692]==0 and saved[690]==1 + c,p=start_fixture('wild');key(c,'ok');key(c,'right');key(c,'ok');saved=finish_fixture(c,p) + assert saved[449]==1 and saved[691]==1 and saved[690]==1 + for fixture,guilty in [('challenge-guilty',True),('challenge-legal',False)]: + c,p=start_fixture(fixture);key(c,'down');key(c,'ok');assert uint(c,'screen')==9 + c.save_png(str(out/(fixture+'.png')));key(c,'ok');saved=finish_fixture(c,p) + assert saved[449]==(1 if guilty else 7) and saved[450]==(5 if guilty else 1) + assert saved[690]==(0 if guilty else 1) and saved[693]==0 + c,p=start_fixture('win');key(c,'ok');c.save_png(str(out/'win.png'));saved=finish_fixture(c,p) + assert saved[692]==5 and saved[700]==0 and not any(saved[671:679]) and struct.unpack_from('=7 for n in fresh[449:451]) + # Full storage: retry fails without damaging the existing record, exit explicit. + p=out/'full.storage';filler=b'x'*(emu.STORAGE_SIZE-24);storage(p,[('full.py',filler)]) + c=emu.Calculator(app,storage_file=str(p),nwlink=nw);c.enable_checks();c.run(250);key(c,'home');assert uint(c,'screen')==8 + key(c,'ok');assert uint(c,'screen')==8;key(c,'down');key(c,'ok');c.run(c.now_ms+150);exit_check(c) + assert records(p.read_bytes())=={'full.py':filler} + # Invalid checksum is ignored and never interpreted as a match. + bad=bytearray(saved_reference);bad[300]^=1;p=out/'bad.storage';storage(p,[('keep.py',sentinel),('uno.sav',bad)]) + c=emu.Calculator(app,storage_file=str(p),nwlink=nw);c.enable_checks();c.run(250);assert uint(c,'sel')==1 + key(c,'home');c.run(c.now_ms+150);exit_check(c);assert records(p.read_bytes())['keep.py']==sentinel + # A launch key held by NumPlay cannot accidentally enter New game. + c=emu.Calculator(app,nwlink=nw);c.enable_checks();c.keys=[(0,400,emu.KEYS['ok'])];c.run(550);assert uint(c,'screen')==0 + key(c,'home');c.run(c.now_ms+150);exit_check(c) + report.append(dict(full_storage=True,corrupt_save_ignored=True,held_launch_key=True,real_keys_play_and_uno=True,real_keys_challenges=True,real_keys_draw_keep_and_wild=True,real_keys_win=True,legacy_points_removed=True,real_keys_play_again=True)) + (out/'report.json').write_text(json.dumps(report,indent=2)+'\n');print('ARM tests passed',flush=True) +if __name__=='__main__':main() diff --git a/games/uno/tests/test_engine.c b/games/uno/tests/test_engine.c new file mode 100644 index 00000000..4234b010 --- /dev/null +++ b/games/uno/tests/test_engine.c @@ -0,0 +1,143 @@ +#include +#include +#include +#include "../src/uno.h" +#include "../src/save.h" +static Uno g; +static void fixture(int players,int flags,int top,int color){ + memset(&g,0,sizeof g);g.rules=(UnoRules){players,1,flags};g.direction=1;g.color=color;g.rng=12345;g.round=1; + g.candidate=g.winner=g.offender=g.uno_player=g.uno_armed=g.drawn=UNO_NONE; + for(int c=0;c<52;c++){g.deck[g.dn++]=c;if(c%13)g.deck[g.dn++]=c;} + for(int i=0;i<4;i++){g.deck[g.dn++]=52;g.deck[g.dn++]=53;} + for(int i=0;i2)give(3,g.deck[0]); + g.discard[g.xn++]=g.deck[--g.dn];g.discard[g.xn++]=g.deck[--g.dn];g.color=uno_color(g.discard[g.xn-1]);if(g.color==4)g.color=0; + int top=g.discard[g.xn-1];assert(uno_draw(&g));assert(g.discard[0]==top&&g.xn==1&&uno_valid(&g)); +} +static void challenge(void){ + fixture(4,0,3,0);give(0,53);give(0,4);give(1,20); + assert(uno_play(&g,0,false)&&g.phase==U_COLOR&&g.guilty);assert(uno_choose_color(&g,1)&&g.phase==U_CHALLENGE&&g.turn==1); + assert(uno_challenge(&g));assert(g.count[0]==5&&g.count[1]==1&&g.turn==1&&g.event==E_CHALLENGE_WON&&uno_valid(&g)); + fixture(4,0,3,0);give(0,53);give(0,16);give(1,20); + assert(uno_play(&g,0,false)&&!g.guilty);assert(uno_choose_color(&g,2));assert(uno_challenge(&g)); + assert(g.count[1]==7&&g.turn==2&&g.event==E_CHALLENGE_LOST&&uno_valid(&g)); + fixture(2,0,3,0);give(0,53);give(0,52);assert(uno_play(&g,0,false)&&!g.guilty); + assert(uno_choose_color(&g,3));assert(uno_accept(&g)&&g.count[1]==4&&g.turn==0); + /* A different-colour matching symbol is allowed alongside a legal +4. */ + fixture(2,0,3,0);give(0,53);give(0,16);assert(uno_play(&g,0,false)&&!g.guilty); +} +static void variants(void){ + fixture(4,R_STACK2,3,0);give(0,12);give(0,4);give(1,25);give(1,20);give(2,38);give(2,30); + assert(uno_play(&g,0,true)&&g.pending==2&&uno_can_play(&g,0));assert(uno_play(&g,0,true)&&g.pending==4); + assert(uno_play(&g,0,true)&&g.pending==6&&g.turn==3);assert(uno_accept(&g)&&g.count[3]==6&&g.turn==0&&uno_valid(&g)); + fixture(4,R_STACK4,3,0);give(0,53);give(0,4);give(1,53);give(1,20); + assert(uno_play(&g,0,true)&&uno_choose_color(&g,2));assert(g.phase==U_TURN&&g.pending==4&&!uno_challenge(&g)); + assert(uno_play(&g,0,true)&&uno_choose_color(&g,1));assert(g.pending==8);assert(uno_accept(&g)&&g.count[2]==8&&uno_valid(&g)); + fixture(4,R_AUTO_UNO,3,0);give(0,4);give(0,5);assert(uno_play(&g,0,false)&&g.uno_player==UNO_NONE); +} +static void uno_calls(void){ + fixture(4,0,3,0);give(0,4);give(0,5);give(1,6);give(1,7); + give(2,19);give(3,32);snapshot("play.sav"); + assert(uno_play(&g,0,false)&&g.uno_player==0);assert(uno_call(&g,0)&&g.uno_player==UNO_NONE);assert(!uno_catch(&g,1)); + fixture(4,0,3,0);give(0,4);give(0,5);assert(uno_call(&g,0)&&g.uno_armed==0);assert(uno_play(&g,0,false)&&g.uno_player==UNO_NONE); + fixture(4,0,3,0);give(0,4);give(0,5);assert(uno_play(&g,0,false));assert(uno_catch(&g,1));assert(g.count[0]==3&&!uno_catch(&g,2)&&g.turn==1); + fixture(4,0,3,0);give(0,4);give(0,5);give(1,6);give(1,7);assert(uno_play(&g,0,false));assert(uno_play(&g,0,true));assert(!uno_catch(&g,1)&&g.count[0]==1); +} +static void wins(void){ + fixture(2,0,3,0);give(0,4);give(1,50);give(1,53);snapshot("win.sav");assert(uno_play(&g,0,true));assert(g.phase==U_MATCH&&g.winner==0&&uno_valid(&g)); + fixture(2,0,3,0);give(0,12);give(1,20); + assert(uno_play(&g,0,true));assert(g.phase==U_MATCH&&g.count[1]==3&&g.winner==0&&uno_valid(&g)); + fixture(2,0,3,0);give(0,53);give(1,20);assert(uno_play(&g,0,true)&&uno_choose_color(&g,2));assert(g.phase==U_CHALLENGE&&g.candidate==0); + assert(uno_challenge(&g)&&g.phase==U_MATCH&&g.count[1]==7&&g.winner==0&&uno_valid(&g)); + fixture(2,R_STACK2,3,0);give(0,12);give(1,25);assert(uno_play(&g,0,true));assert(g.phase==U_MATCH&&g.count[1]==3); + fixture(2,0,3,0);give(0,4);give(1,0);assert(uno_play(&g,0,true)&&g.phase==U_MATCH&&g.winner==0); /* Even opponents holding only zero-valued cards. */ + fixture(4,0,3,0);give(0,4);give(1,5);assert(uno_play(&g,0,true)&&g.phase==U_MATCH);g.direction=-1;g.dealer=0;uno_next_round(&g);assert(g.dealer==1&&g.direction==1&&uno_valid(&g)); + fixture(2,0,3,0);give(0,50);give(1,4);g.turn=1;assert(uno_play(&g,0,true)&&g.phase==U_MATCH&&g.winner==1); +} +static void arm_fixtures(void){ + fixture(4,0,3,0);give(0,4);give(1,53);give(1,5);give(2,30);give(3,43); + g.turn=1;assert(uno_play(&g,0,true)&&uno_choose_color(&g,2));g.turn=0;snapshot("challenge-guilty.sav"); + fixture(4,0,3,0);give(0,4);give(1,53);give(1,16);give(2,30);give(3,43); + g.turn=1;assert(uno_play(&g,0,true)&&uno_choose_color(&g,2));g.turn=0;snapshot("challenge-legal.sav"); + fixture(2,0,3,0);give(0,4);give(1,6);on_top(5);snapshot("draw.sav"); + fixture(2,0,3,0);give(0,52);give(0,4);give(1,6);snapshot("wild.sav"); +} +static void saves(void){ + UnoSave a={0},b={0};a.prefs=(UnoRules){4,1,0};a.active=1;a.played=19;a.wins=7;uno_new(&a.game,a.prefs,98765); + uint8_t data[UNO_SAVE_BYTES];save_encode(&a,data);assert(save_decode(&b,data,sizeof data));assert(!memcmp(&a,&b,sizeof a)); + for(unsigned i=0;i>(i*8); + assert(save_decode(&b,data,sizeof data)&&b.game.phase==U_MATCH&&b.game.winner==0&&uno_valid(&b.game)); +} +static void simulations(void){ + unsigned moves=0,max_hand=0,rounds=0;bool opening[54]={0}; + for(unsigned seed=1;seed<=12000;seed++){ + UnoRules r={(seed%3)+2,seed%3,0};uno_new(&g,r,seed);assert(uno_valid(&g)); + int c=g.discard[0];opening[c]=true;assert(c!=53); + for(int p=0;pmax_hand)max_hand=g.count[p]; + if(g.phase==U_ROUND){uno_next_round(&g);rounds++;continue;} + if(g.uno_player!=UNO_NONE){int p=(g.uno_player+1)%players;if(step%3==0)uno_catch(&g,p);else uno_call(&g,g.uno_player);} + uno_bot(&g);moves++; + } + assert(g.phase==U_MATCH&&uno_valid(&g)); + } + printf("1,152 complete games, %u actions, %u blocked-table redeals; largest hand %u cards.\n",moves,rounds,max_hand); +} +int main(void){basic();draws();challenge();variants();uno_calls();wins();saves();arm_fixtures();simulations();puts("Engine, card rules, variants, direct wins, legacy migration and saves passed.");return 0;} diff --git a/games/uno/tests/test_integration.py b/games/uno/tests/test_integration.py new file mode 100644 index 00000000..168f0101 --- /dev/null +++ b/games/uno/tests/test_integration.py @@ -0,0 +1,133 @@ +"""Build the real NumPlay launcher with only this module for integration testing. + +This deliberately small test catalogue is not a release of NumPlay. Production +builds still read the complete games/games.json and use the UNO ID. +""" +import argparse +import json +import shlex +import subprocess +import sys +from elftools.elf.elffile import ELFFile +from pathlib import Path +import test_arm as arm + +ROOT = Path(__file__).resolve().parents[1] +REPO = ROOT.parents[1] + + +def main(): + ap = argparse.ArgumentParser() + ap.add_argument('--nwlink', default='nwlink') + args = ap.parse_args() + nw = ['node', args.nwlink] if Path(args.nwlink).is_file() and not args.nwlink.endswith(('.exe', '.cmd')) else shlex.split(args.nwlink) + out = ROOT / 'output/integration' + out.mkdir(parents=True, exist_ok=True) + arm.tempfile.tempdir = str(out) + + def run(*cmd): + subprocess.run([str(x) for x in cmd], cwd=REPO, check=True) + + def py(tool, *args): + run(sys.executable, REPO / 'tools' / tool, *args) + + device = shlex.split(subprocess.check_output(nw + ['eadk-cflags-device'], text=True)) + cc = ['arm-none-eabi-gcc', *device, '-std=gnu11', '-Os', '-Wall', '-Wextra', + '-Wno-unused-parameter', '-fno-math-errno', '-ffunction-sections', '-fdata-sections', + '-fno-tree-loop-distribute-patterns', '-DNP_VERSION="uno-test"', + '-I' + str(REPO / 'launcher/src')] + games = json.loads((REPO / 'games/games.json').read_text()) + index = next(i for i, g in enumerate(games, 1) if g['id'] == 'uno') + game = games[index - 1] + assert game['app'] == 'UNO.nwa' and game['records'] == ['uno.sav'] + run('arm-none-eabi-ld', '-r', '-d', '-z', 'noexecstack', '--force-group-allocation', '-T', REPO / 'tools/module.ld', + ROOT / 'output/module.o', '-o', out / 'stage1.o') + run('arm-none-eabi-objcopy', '--keep-global-symbol=main', + '--redefine-sym', 'eadk_keyboard_scan=np_keyboard_scan', + '--redefine-sym', 'eadk_event_get=np_event_get', + '--redefine-sym', 'eadk_display_draw_string=np_display_draw_string', + out / 'stage1.o', out / 'stage2.o') + py('npmodule.py', out / 'stage2.o', out / 'uno.o', '--game', 'uno', + '--index', index, '--json', out / 'uno.json') + py('gen_games.py', REPO / 'games/games.json', out, out, '--only', 'uno') + py('shots.py', '--id', 'uno', '--index', index, '--colors', 16, + out / 'shots.c', *(ROOT / p for p in game['shots'])) + objects = [out / 'uno.o'] + entry = out / 'entry_uno.c' if (out / 'entry_uno.c').exists() else out / 'gametable.c' + sources = sorted((REPO / 'launcher/src').glob('*.c')) + [entry, out / 'shots.c'] + for src in sources: + obj = out / ('launcher-' + src.stem + '.o') + run(*cc, '-c', src, '-o', obj) + objects.append(obj) + marks = 'marks_uno' if (out / 'marks_uno.s').exists() else 'marks' + for stem in ['arena', marks]: + obj = out / (stem + '.o') + run(*cc, '-c', out / (stem + '.s'), '-o', obj) + objects.append(obj) + run(*cc, '-DNP_APP_NAME="NumPlay integration test"', '-c', REPO / 'launcher/app_name.c', '-o', out / 'name.o') + run(*nw, 'png-icon-o', REPO / 'launcher/assets/icon.png', out / 'icon.o') + app = out / 'NumPlay-test.nwa' + run(*cc, '-nostartfiles', '--specs=nano.specs', '-Wl,--relocatable', '-Wl,--gc-sections', + '-Wl,-e,main', '-Wl,-u,eadk_app_name', '-Wl,-u,eadk_app_icon', '-Wl,-u,eadk_api_level', + '-Wl,-T,' + str(out / 'numplay.ld'), *objects, out / 'name.o', out / 'icon.o', '-lm', '-o', app) + report = [] + for profile, model, system, ram in [('n0120', 'n0120', 'epsilon', 153676), + ('upsilon', 'n0110', 'upsilon', 107674)]: + arm.emu.configure(model, system, ram) + st = out / (profile + '.storage') + arm.storage(st, [('keep.py', b'print(42)\n')]) + c = arm.emu.Calculator(str(app), storage_file=str(st), nwlink=nw) + # npmodule deliberately removes the module's private symbols. Recover + # their RAM offsets from its input solely for these debugger assertions. + with (out / 'stage1.o').open('rb') as f: + elf = ELFFile(f) + for sym in elf.get_section_by_name('.symtab').iter_symbols(): + if sym.name in ('screen', 'setup_page'): + section = elf.get_section(sym['st_shndx']).name + assert section == '.bss' + c.symbols[sym.name] = c.symbols['np_uno_bss'] + sym['st_value'] + c.enable_checks() + c.run(1100) + c.save_png(str(out / (profile + '-launcher.png'))) + + def key(k, wait=200): + t = int(c.now_ms) + 20 + c.keys.append((t, t + 70, arm.emu.KEYS[k])) + c.run(t + wait) + + key('ok', 650) # Real carousel -> UNO module. + assert arm.uint(c, 'screen') == 0 + key('ok'); assert arm.uint(c, 'screen') == 1 + key('up'); key('ok'); assert arm.uint(c, 'setup_page') == 1 + key('up'); key('ok'); assert arm.uint(c, 'setup_page') == 2 + key('ok'); assert arm.uint(c, 'screen') == 2 + c.save_png(str(out / (profile + '-table.png'))) + key('back'); key('down'); key('down'); key('ok') # Save to menu. + assert arm.uint(c, 'screen') == 0 + key('back'); key('down'); key('ok', 800) # Save and exit -> carousel. + assert not c.exited + c.save_png(str(out / (profile + '-returned.png'))) + key('ok', 650) # BSS resets, table restored from shared storage. + assert arm.uint(c, 'screen') == 0 + key('ok'); assert arm.uint(c, 'screen') == 2 + key('back'); key('home', 700) + assert c.exited and not c.violations and not c.firmware_ram_changes() + assert c.app_ram_clean() and c.locks == 0 and c.max_locks == (0 if system == 'upsilon' else 1) + records = arm.records(st.read_bytes()) + assert len(records['uno.sav']) == 768 and records['uno.sav'][:5] == b'UNO\x02\x01' + assert records['keep.py'] == b'print(42)\n' and b'uno.sav' in records['numplay_saves.py'] + # Simulate an installer that retains only Python scripts. + arm.storage(st, [(n, v) for n, v in records.items() if n.endswith('.py')]) + restored = arm.emu.Calculator(str(app), storage_file=str(st), nwlink=nw) + restored.enable_checks(); restored.run(1100) + t = int(restored.now_ms) + 20; restored.keys.append((t, t + 90, arm.emu.KEYS['home'])); restored.run(t + 750) + assert restored.exited and not restored.violations and not restored.firmware_ram_changes() and restored.app_ram_clean() + assert arm.records(st.read_bytes())['uno.sav'] == records['uno.sav'] + report.append(dict(profile=profile, launch_return_reenter=True, backup_and_reinstall_restore=True, + stack_bytes=max(c.stack_used(), restored.stack_used()))) + (out / 'report.json').write_text(json.dumps(report, indent=2) + '\n') + print('PASS: UNO NumPlay module launch, return, re-entry, shared saves and backup.') + + +if __name__ == '__main__': + main() diff --git a/games/uno/tests/test_ui.c b/games/uno/tests/test_ui.c new file mode 100644 index 00000000..54ae0ae6 --- /dev/null +++ b/games/uno/tests/test_ui.c @@ -0,0 +1,100 @@ +#include +#include +#include +#define NP_MODULE 1 +#define main uno_appmain +#include "../src/main.c" +#undef main +static uint16_t pixels[320*240]; +uint64_t eadk_timing_millis(void){return clock_ms;} +uint32_t eadk_random(void){return 73;} +uint64_t eadk_keyboard_scan(void){return 0;} +void eadk_display_wait_for_vblank(void){} +void eadk_timing_msleep(uint32_t n){(void)n;} +void*np_alloc(uint32_t n){return malloc(n);} +bool np_file_write(const char*n,const void*d,uint32_t z){assert(!strcmp(n,SAVE_NAME)&&z==768);return true;} +const uint8_t*np_file_read(const char*n,uint32_t*z){*z=0;return NULL;} +void np_push(int x,int y,int w,int h,const color_t*d){assert(x>=0&&y>=0&&x+w<=320&&y+h<=240);for(int i=0;i>11)*255/31,((c>>5)&63)*255/63,(c&31)*255/31};fwrite(rgb,1,3,f);}fclose(f); +} +static void art(void){ + assert(sizeof(card_palette)/2==31&&sizeof(card_offsets)/2==56); + for(int i=0;i<55;i++){ + const uint8_t*p=card_pixels+card_offsets[i]; + for(int y=0;y<64;y++){int n=*p++,x=0;assert(n>0&&n<=44);for(int j=0;j>5)+1;assert(x==44);p+=n;} + assert(p==card_pixels+card_offsets[i+1]); + } + for(int i=0;i<7;i++){ + /* Check the wrapped help really fits the panel, using the actual font. */ + const char*p=HELP[i];int lines=1,w=0; + while(*p){const char*start=p;while(*p&&*p!=' ')p++;char word[80];unsigned n=p-start;assert(n266){lines++;w=ww;}else w+=ww+(w?space:0);if(*p)p++; + } + assert(72+(lines-1)*20+4<209); + } + for(int i=0;i<5;i++)assert(gfx_text_width(&np_font_small,VARIANT[i])<218); + for(int i=0;i<6;i++)assert(gfx_text_width(&np_font_small,VARIANT_HELP[i])<296); + assert(172+gfx_text_width(&np_font_small,"DISCARD")/2+6<=222-gfx_text_width(&np_font_small,"COLOR")/2); + assert(gfx_text_width(&np_font_small,"1 Draw +16")<=64); + assert(gfx_text_width(&np_font_small,"Back: pause")<=79); + for(int c=0;c<54;c++){char s[60];name_card(c,s);assert(gfx_text_width(&np_font_small,s)<126);} +} +static void setup_navigation(void){ + screen=S_SETTINGS;setup_page=0;sel=0;Uno before=*G; + for(int i=0;i<3;i++)setup_input(1,0,false,false); + assert(sv.prefs.players==4&&setup_page==0&&sel==0); + setup_input(0,1,false,false); + for(int i=0;i<3;i++)setup_input(1,0,false,false); + assert(sv.prefs.difficulty==1); + setup_input(0,1,true,false);assert(setup_page==1&&sel==0&&screen==S_SETTINGS); + for(int i=0;i<5;i++){setup_input(0,1,true,false);assert(sv.prefs.flags==(1u<<(i+1))-1);} + assert(sv.prefs.flags==31&&custom_rules(&sv.prefs)); + setup_input(0,1,true,false);assert(setup_page==2&&screen==S_SETTINGS); + setup_input(0,0,false,true);assert(setup_page==1&&sel==6); + setup_input(0,1,true,false);assert(sel==0&&sv.prefs.flags==0); + setup_input(0,0,false,true);assert(setup_page==0&&sel==2); + setup_input(0,0,false,true);assert(screen==S_MENU); + assert(!memcmp(&before,G,sizeof before)); +} +int main(void){ + gfx_buf=strip;sv.prefs=(UnoRules){4,1,0};ui_random=5123;clock_ms=10000;last_action=0;screen=S_MENU;sel=1; + art();shot("menu.ppm"); + setup_navigation();screen=S_SETTINGS;setup_page=0;sel=0;shot("settings.ppm"); + sv.prefs.players=2;shot("settings-two.ppm");sv.prefs.players=4; + setup_page=1;sel=2;sv.prefs.flags=3;shot("variants.ppm"); + setup_page=2;sel=0;shot("review.ppm");sv.prefs.flags=0;shot("review-classic.ppm"); + for(int n=2;n<=4;n++){ + sv.prefs.players=n;new_game();while(G->phase==U_COLOR)uno_choose_color(G,0);G->turn=0;last_action=0; + char s[40];sprintf(s,"table-%d.ppm",n);shot(s);G->turn=1;selected=3;sprintf(s,"bot-turn-%d.ppm",n);shot(s); + int old=selected;play_input(1,0,false,false,false,false);assert(selected==(old+1)%G->count[0]); + } + for(int i=0;i<7;i++){screen=S_HELP;help_page=i;char s[40];sprintf(s,"help-%d.ppm",i);shot(s);} + screen=S_CREDITS;shot("credits.ppm");screen=S_PAUSE;sel=0;shot("pause.ppm");screen=S_TABLE_INFO;shot("table-rules.ppm"); + screen=S_PLAY;G->phase=U_COLOR;G->turn=0;color_sel=2;shot("color.ppm"); + G->phase=U_CHALLENGE;G->pending=4;G->old_color=1;sel=1;shot("challenge.ppm"); + evidence_count=G->count[1];memcpy(evidence,G->hands[1],evidence_count);selected=0;screen=S_EVIDENCE;shot("evidence.ppm"); + screen=S_PLAY;G->phase=U_MATCH;G->winner=0;sel=0;shot("result.ppm"); + /* Play again retains the active table, even if future-game prefs differ. */ + UnoRules rules=G->rules;sv.prefs=(UnoRules){2,0,R_AUTO_UNO}; + play_input(0,0,true,false,false,false);assert(screen==S_PLAY&&G->phaserules,sizeof rules)&&sv.prefs.flags==R_AUTO_UNO); + G->phase=U_MATCH;G->winner=1;shot("bot-wins.ppm"); + play_input(0,1,true,false,false,false);assert(screen==S_MENU&&!sv.active); + screen=S_SAVE_ERROR;sel=0;exit_after_save=true;shot("save-error.ppm"); + /* Navigate every card even when the hand is bigger than one screen. */ + new_game();G->phase=U_TURN;G->turn=0; + while(G->dn){G->hands[0][G->count[0]++]=G->deck[--G->dn];} + selected=G->count[0]-1;last_action=0;shot("large-hand.ppm");assert(uno_valid(G)); + for(int j=0;jcount[0];j++)play_input(1,0,false,false,false,false); + assert(selected==G->count[0]-1); + /* Disabled actions cannot trap focus, and returning to the hand is explicit. */ + G->turn=1;G->uno_player=UNO_NONE;action=-1;play_input(0,-1,false,false,false,false);assert(action==2); + play_input(1,0,false,false,false,false);assert(action==2); + play_input(0,1,false,false,false,false);assert(action==-1); + G->turn=0;G->phase=U_DRAWN;G->rules.flags=R_FORCE;G->drawn=selected; + play_input(0,-1,false,false,false,false);assert(action==2); + puts("Asset decoder, visual setup navigation, text layout, card browsing and UI screenshots passed.");return 0; +} diff --git a/games/uno/tools/assets.json b/games/uno/tools/assets.json new file mode 100644 index 00000000..4ae9c939 --- /dev/null +++ b/games/uno/tools/assets.json @@ -0,0 +1,8 @@ +{ + "source_sha256": "873e5243b3bc15140313becdbfb33c2afc7ed858e49c6f67a6ef5f9706ad9837", + "cards": 55, + "width": 44, + "height": 64, + "card_rom_bytes": 60895, + "table_rom_bytes": 1536 +} diff --git a/games/uno/tools/assets.py b/games/uno/tools/assets.py new file mode 100644 index 00000000..360d45de --- /dev/null +++ b/games/uno/tools/assets.py @@ -0,0 +1,59 @@ +"""Build small, shared-palette sprites from the user-supplied AlexDer ZIP. + +python tools/assets.py '/path/to/Uno Game Assets (1).zip' +No original-size textures, PDF, fonts or executable files are shipped. +""" +import argparse, hashlib, io, json, zipfile +from pathlib import Path +from PIL import Image, ImageDraw + +ROOT = Path(__file__).resolve().parents[1] +W, H = 44, 64 + +def array(name, kind, data, columns=24): + return 'static const '+kind+' '+name+'[] = {\n'+''.join( + ' '+','.join(str(x) for x in data[i:i+columns])+',\n' for i in range(0,len(data),columns))+'};\n' + +def main(): + p=argparse.ArgumentParser(); p.add_argument('zip',type=Path); a=p.parse_args() + names=[f'{c}_{v}.png' for c in ('Red','Yellow','Green','Blue') + for v in list(map(str,range(10)))+['Skip','Reverse','Draw']]+['Wild.png','Wild_Draw.png','Deck.png'] + with zipfile.ZipFile(a.zip) as z: + members={Path(n).name:n for n in z.namelist() if n.startswith('Uno Game Assets/') and n.endswith('.png')} + def read(n): return Image.open(io.BytesIO(z.read(members[n]))).convert('RGBA') + images=[read(n).resize((W,H),Image.Resampling.LANCZOS) for n in names] + sample=Image.new('RGB',(W*len(images),H),'white') + for i,im in enumerate(images): sample.paste(im,(i*W,0),im) + pal=sample.quantize(colors=31,method=Image.Quantize.MEDIANCUT) + colors=pal.getpalette()[:93] + palette=[((colors[i]&248)<<8)|((colors[i+1]&252)<<3)|(colors[i+2]>>3) for i in range(0,93,3)] + encoded=bytearray(); offsets=[] + for im in images: + offsets.append(len(encoded)) + rgb=Image.new('RGB',im.size,'white');rgb.paste(im,mask=im.getchannel('A')) + ix=list(rgb.quantize(palette=pal,dither=Image.Dither.NONE).getdata());alpha=list(im.getchannel('A').getdata()) + ix=[v if alpha[i]>=128 else 31 for i,v in enumerate(ix)] + for y in range(H): + row=ix[y*W:(y+1)*W]; tokens=[];x=0 + while x>3) for r,g,b in table.getdata()] + content='/* Generated by tools/assets.py. AlexDer card art, see ASSETS.md. */\n#define CARD_W 44\n#define CARD_H 64\n' + content+=array('card_palette','uint16_t',palette)+array('card_offsets','uint16_t',offsets) + content+=array('card_pixels','uint8_t',list(encoded))+array('table_pixels','uint16_t',packed) + (ROOT/'src/assets.h').write_text(content,encoding='utf-8') + icon=Image.new('RGBA',(55,56),(15,47,41,255)) + for name,x,y in [('Red_7.png',3,7),('Wild.png',17,3),('Deck.png',31,7)]: + im=read(name).resize((23,34),Image.Resampling.LANCZOS);icon.alpha_composite(im,(x,y+6)) + icon.save(ROOT/'src/icon.png') + report=dict(source_sha256=hashlib.sha256(a.zip.read_bytes()).hexdigest(),cards=55,width=W,height=H, + card_rom_bytes=len(encoded)+2*len(offsets)+2*len(palette),table_rom_bytes=len(packed)*2) + (ROOT/'tools/assets.json').write_text(json.dumps(report,indent=2)+'\n') + print(json.dumps(report,indent=2)) + +if __name__=='__main__':main() diff --git a/games/uno/tools/build.py b/games/uno/tools/build.py new file mode 100644 index 00000000..d9065d5f --- /dev/null +++ b/games/uno/tools/build.py @@ -0,0 +1,59 @@ +"""Portable NumWorks build. Requires ARM GCC, nwlink 1.0.0 and pyelftools.""" +import argparse, json, os, shlex, shutil, subprocess +from pathlib import Path +ROOT=Path(__file__).resolve().parents[1];REPO=ROOT.parents[1] +def main(): + ap=argparse.ArgumentParser();ap.add_argument('--toolchain',type=Path);ap.add_argument('--nwlink',default='nwlink');a=ap.parse_args() + out=ROOT/'output';out.mkdir(exist_ok=True) + # Root make can request the standalone app and module simultaneously. + # Serialize their shared compiler outputs; OS locks are released on exit. + with (out/'.build.lock').open('a+b') as lock: + if os.name=='nt': + import msvcrt + if lock.seek(0,2)==0:lock.write(b'\0');lock.flush() + lock.seek(0);msvcrt.locking(lock.fileno(),msvcrt.LK_LOCK,1) + else: + import fcntl + fcntl.flock(lock.fileno(),fcntl.LOCK_EX) + try:build(a,out) + finally: + if os.name=='nt':lock.seek(0);msvcrt.locking(lock.fileno(),msvcrt.LK_UNLCK,1) + else:fcntl.flock(lock.fileno(),fcntl.LOCK_UN) + +def build(a,out): + def run(*args,capture=False): + return subprocess.run(list(map(str,args)),cwd=ROOT,check=True,capture_output=capture,text=capture) + def tool(n): + name='arm-none-eabi-'+n+('.exe'if os.name=='nt'else'');return a.toolchain/name if a.toolchain else name + nw=['node',a.nwlink]if Path(a.nwlink).is_file()and not a.nwlink.endswith(('.exe','.cmd'))else[a.nwlink] + flags=['-std=c11','-Os','-Wall','-Wextra','-Werror','-Wno-misleading-indentation','-fno-math-errno','-ffunction-sections','-fdata-sections','-flto','-fstack-usage', + '-fno-tree-loop-distribute-patterns','-fvisibility=internal'] + flags+=shlex.split(run(*nw,'eadk-cflags-device',capture=True).stdout) + objects=[] + for src in [ROOT/'src/main.c',ROOT/'src/uno.c',REPO/'launcher/src/gfx.c',REPO/'launcher/src/font_data.c',REPO/'launcher/src/xfont.c']: + obj=out/(src.stem+'.o');run(tool('gcc'),*flags,'-c',src,'-o',obj);objects.append(obj) + run(*nw,'png-icon-o',ROOT/'src/icon.png',out/'icon.o') + link=[tool('gcc'),*flags,'-nostartfiles','--specs=nano.specs','-Wl,--relocatable,--gc-sections,-e,main','-flinker-output=nolto-rel'] + run(*link,*objects,out/'icon.o','-Wl,-u,eadk_app_name,-u,eadk_app_icon,-u,eadk_api_level','-lm','-o',out/'uno-debug.nwa') + shutil.copyfile(out/'uno-debug.nwa',out/'UNO.nwa');run(tool('strip'),'--strip-unneeded',out/'UNO.nwa') + # NumPlay's conventional standalone target reads output/.nwa. + if os.name!='nt':shutil.copyfile(out/'UNO.nwa',out/'uno.nwa') + # Module build leaves graphics, fonts and storage to the NumPlay launcher. + mod=[] + for source in ['main','uno']: + obj=out/('module-'+source+'.o');run(tool('gcc'),*flags,'-DNP_MODULE=1','-c',ROOT/'src'/(source+'.c'),'-o',obj);mod.append(obj) + run(*link,*mod,'-nostdlib','-o',out/'module.o') + from elftools.elf.elffile import ELFFile + profiles=[] + for name,base,ram in [('n0120',0x24000000,153676),('n0110',0x20000000,148928),('n0115',0x20000000,133652),('upsilon',0x20000000,107674)]: + opts=['--ram-start',hex(base+0x37000-ram),'--ram-length',str(ram)];elf=out/(name+'.elf');binary=out/(name+'.bin') + run(*nw,'nwa-elf',out/'UNO.nwa',elf,*opts);run(*nw,'nwa-bin',out/'UNO.nwa',binary,*opts) + debug=out/(name+'-debug.bin');run(*nw,'nwa-bin',out/'uno-debug.nwa',debug,*opts) + assert debug.read_bytes()==binary.read_bytes() + with elf.open('rb')as f: + e=ELFFile(f);sym={s.name:s.entry.st_value for s in e.get_section_by_name('.symtab').iter_symbols()};static_ram=sym['_heap_start']-sym['_data_section_start_ram'] + assert static_ram<20*1024,(name,static_ram) + profiles.append(dict(profile=name,static_ram=static_ram,installed_flash=binary.stat().st_size,available_ram=ram)) + result=dict(nwa_bytes=(out/'UNO.nwa').stat().st_size,save_bytes=768,profiles=profiles) + (out/'sizes.json').write_text(json.dumps(result,indent=2)+'\n');print(json.dumps(result,indent=2)) +if __name__=='__main__':main() diff --git a/games/uno/tools/test.py b/games/uno/tools/test.py new file mode 100644 index 00000000..11a119ae --- /dev/null +++ b/games/uno/tools/test.py @@ -0,0 +1,11 @@ +import argparse, subprocess, os +from pathlib import Path +ROOT=Path(__file__).resolve().parents[1] +def main(): + ap=argparse.ArgumentParser();ap.add_argument('--cc',default='cc');a=ap.parse_args();out=ROOT/'output';out.mkdir(exist_ok=True) + for name,sources in [('engine',['tests/test_engine.c','src/uno.c']),('ui',['tests/test_ui.c','src/uno.c','../../launcher/src/gfx.c','../../launcher/src/font_data.c','../../launcher/src/xfont.c'])]: + exe=out/('test-'+name+('.exe'if os.name=='nt'else'')) + subprocess.run([a.cc,'-std=c11','-O2','-Wall','-Wextra','-Werror','-Wno-misleading-indentation','-Wno-unused-parameter', + '-ffunction-sections','-fdata-sections','-Itests',*sources,'-Wl,--gc-sections','-lm','-o',str(exe)],cwd=ROOT,check=True) + subprocess.run([str(exe)],cwd=out,check=True) +if __name__=='__main__':main() diff --git a/launcher/lang/fr.txt b/launcher/lang/fr.txt index bdef86b6..fd2b329d 100644 --- a/launcher/lang/fr.txt +++ b/launcher/lang/fr.txt @@ -135,4 +135,6 @@ Needs Il manque Sokoban Sokoban Push every box home Pousse chaque caisse à sa place -Levels: Microban by David W. Skinner Niveaux : Microban de David W. Skinner \ No newline at end of file +Levels: Microban by David W. Skinner Niveaux : Microban de David W. Skinner +Empty your hand against up to three bots Vide ta main face à un, deux ou trois bots +Game made by Bobydeluxe Jeu créé par Bobydeluxe diff --git a/launcher/lang/zh.txt b/launcher/lang/zh.txt index 8194210b..d02430a1 100644 --- a/launcher/lang/zh.txt +++ b/launcher/lang/zh.txt @@ -134,4 +134,6 @@ Needs 内存还差 Sokoban 推箱子 Push every box home 把每个箱子推到位 -Levels: Microban by David W. Skinner 关卡:David W. Skinner 的 Microban \ No newline at end of file +Levels: Microban by David W. Skinner 关卡:David W. Skinner 的 Microban +Empty your hand against up to three bots 与一至三个电脑对手对战,先出完手牌获胜 +Game made by Bobydeluxe 游戏制作:Bobydeluxe diff --git a/tests/test_games.py b/tests/test_games.py index 8c397437..36b62614 100644 --- a/tests/test_games.py +++ b/tests/test_games.py @@ -42,6 +42,10 @@ def every(t0, t1, step, key, d=80): # name: (nwa, save record, first run keys, home time, second run keys, home time) GAMES = { + # Create the three-step table, deal, then resume it after reinstall. + "uno": ("UNO.nwa", "uno.sav", + presses((700,"ok"),(1000,"up"),(1300,"ok"),(1600,"up"),(1900,"ok"),(2200,"ok")), 3200, + presses((700,"ok")), 1800), "crossyroad": ("CrossyRoad.nwa", "crossyroad.sav", every(1500, 9000, 350, "up"), 12000, every(1500, 4000, 400, "up"), 6000), "chess": ("NumChess.nwa", "numchess.sav", presses((1500, "ok"), (2500, "ok")), 4000, [], 2500), @@ -330,6 +334,8 @@ def dk_frames(v): CHECKS = { + "uno": (lambda v: len(v) == 768 and v[:5] == b"UNO\2\1" and not any(v[671:679]), + lambda v: len(v) == 768 and v[:5] == b"UNO\2\1" and not any(v[671:679])), # the island remembers where Lucky was; after the reinstall, from the copy "championisland": (lambda v: v[:3] == b"CI1" and b"PLAYER_LOC" in v,) * 2, "numdrive": (lambda v: v[27] == 1, lambda v: v[27] == 0), # last played level From 171544d330e0ab2c7868ca5a5ec87fb4fa7544ed Mon Sep 17 00:00:00 2001 From: Mason363 Date: Fri, 23 Oct 2026 15:06:48 -0400 Subject: [PATCH 2/4] UNO: the official rules to 500, bots at three levels and cards drawn for the calculator The rules follow Mattel's instruction sheet: the 108-card deck, the dealer picked by a draw, the first card's effect, drawing a card you may play at once, Skip, Reverse and Draw Two, the two-player rules, the Wild Draw Four and its challenge, UNO calls and their 2-card penalty, and hands scored until someone has 500 points. A single hand stays as a choice. Stacking, drawing until you can play, having to play a drawn card and automatic UNO are house rules, all off by default. The bots see what a player sees. Easy plays any card that goes; Normal keeps its Wilds and stops a player about to go out; Hard also challenges by counting the cards it has seen, plays to the colours the next player lacks and may bluff a Wild Draw Four. The cards are drawn by the game after the classic deck, so AlexDer's pack, which has no license, is gone. Left and Right pick a card, OK plays it, Up draws, shift says UNO or catches a bot, Back pauses (Resume, New game, How to play, Quit game, which asks first) and Home saves and quits. A key line, a bright frame on the chosen card, the cards that go lit on your turn, and how to play before the first game. One save, uno.sav, with a magic, a version, a checksum and every card checked, copied into uno_saves.py. tests/play.c checks every card and rule, plays 144 bot games to 500 and 600 duels between the levels, a game to 500 through the app's keys and 300 random-key sessions, and saves, damaged saves and every key line. It's a big game of its own (51 KB installed), as NumPlay has 4.4 KB left. build.py, the ARM scripts, VALIDATION.md and uno.yml go. --- .github/workflows/uno.yml | 53 - games/uno/.gitignore | 2 +- games/uno/ASSETS.md | 37 - games/uno/Makefile | 74 +- games/uno/VALIDATION.md | 126 -- games/uno/src/assets.h | 2579 --------------------------- games/uno/src/bot.c | 161 ++ games/uno/src/draw.c | 840 +++++++++ games/uno/src/draw.h | 40 + games/uno/src/game.c | 417 +++++ games/uno/src/game.h | 109 ++ games/uno/src/icon.png | Bin 3732 -> 2441 bytes games/uno/src/main.c | 805 ++++----- games/uno/src/plat.h | 17 + games/uno/src/plat_eadk.c | 34 + games/uno/src/save.c | 120 ++ games/uno/src/save.h | 87 +- games/uno/src/uno.c | 216 --- games/uno/src/uno.h | 42 - games/uno/tests/eadk.h | 12 - games/uno/tests/legacy-save.bin | Bin 768 -> 0 bytes games/uno/tests/play.c | 937 ++++++++++ games/uno/tests/test_arm.py | 132 -- games/uno/tests/test_engine.c | 143 -- games/uno/tests/test_integration.py | 133 -- games/uno/tests/test_ui.c | 100 -- games/uno/tools/assets.json | 8 - games/uno/tools/assets.py | 59 - games/uno/tools/build.py | 59 - games/uno/tools/test.py | 11 - 30 files changed, 3136 insertions(+), 4217 deletions(-) delete mode 100644 .github/workflows/uno.yml delete mode 100644 games/uno/ASSETS.md delete mode 100644 games/uno/VALIDATION.md delete mode 100644 games/uno/src/assets.h create mode 100644 games/uno/src/bot.c create mode 100644 games/uno/src/draw.c create mode 100644 games/uno/src/draw.h create mode 100644 games/uno/src/game.c create mode 100644 games/uno/src/game.h create mode 100644 games/uno/src/plat.h create mode 100644 games/uno/src/plat_eadk.c create mode 100644 games/uno/src/save.c delete mode 100644 games/uno/src/uno.c delete mode 100644 games/uno/src/uno.h delete mode 100644 games/uno/tests/eadk.h delete mode 100644 games/uno/tests/legacy-save.bin create mode 100644 games/uno/tests/play.c delete mode 100644 games/uno/tests/test_arm.py delete mode 100644 games/uno/tests/test_engine.c delete mode 100644 games/uno/tests/test_integration.py delete mode 100644 games/uno/tests/test_ui.c delete mode 100644 games/uno/tools/assets.json delete mode 100644 games/uno/tools/assets.py delete mode 100644 games/uno/tools/build.py delete mode 100644 games/uno/tools/test.py diff --git a/.github/workflows/uno.yml b/.github/workflows/uno.yml deleted file mode 100644 index 32f7a609..00000000 --- a/.github/workflows/uno.yml +++ /dev/null @@ -1,53 +0,0 @@ -name: UNO - -on: - pull_request: - paths: - - 'games/uno/**' - - 'games/common/**' - - 'launcher/src/**' - - 'games/games.json' - - 'Makefile' - - 'tools/emu.py' - - 'tools/gen_games.py' - - 'tools/npmodule.py' - - '.github/workflows/uno.yml' - workflow_dispatch: - -permissions: - contents: read - -jobs: - game: - runs-on: ubuntu-24.04 - steps: - - uses: actions/checkout@v4 - - name: ARM toolchain - run: | - v=15.2.1-1.1 - curl -fsSL "https://github.com/xpack-dev-tools/arm-none-eabi-gcc-xpack/releases/download/v$v/xpack-arm-none-eabi-gcc-$v-linux-x64.tar.gz" | tar -xz -C "$RUNNER_TEMP" - echo "$RUNNER_TEMP/xpack-arm-none-eabi-gcc-$v/bin" >> "$GITHUB_PATH" - - uses: actions/setup-node@v4 - with: - node-version: 20 - - uses: actions/setup-python@v5 - with: - python-version: '3.12' - - name: Tools - run: | - npm install -g nwlink@1.0.0 - pip install pillow==11.3.0 numpy pyelftools unicorn==2.1.4 - - name: Standalone and NumPlay module builds - run: make build/data/apps/UNO.nwa build/data/modules/uno.o NWLINK=nwlink - - name: Card rules, single-game wins and save migration - run: make -C games/uno test HOST_CC=gcc - - name: ARM controls and firmware memory guards - run: python3 games/uno/tests/test_arm.py --nwlink nwlink - - name: NumPlay launcher, shared saves and reinstall backup - run: python3 games/uno/tests/test_integration.py --nwlink nwlink - - name: Repository save-and-exit scenario - run: python3 tests/test_games.py build/data/apps --game uno - - uses: actions/upload-artifact@v4 - with: - name: UNO - path: build/data/apps/UNO.nwa diff --git a/games/uno/.gitignore b/games/uno/.gitignore index fd6aad7f..342d9dda 100644 --- a/games/uno/.gitignore +++ b/games/uno/.gitignore @@ -1,2 +1,2 @@ output/ -__pycache__/ +build/ diff --git a/games/uno/ASSETS.md b/games/uno/ASSETS.md deleted file mode 100644 index 35d130e2..00000000 --- a/games/uno/ASSETS.md +++ /dev/null @@ -1,37 +0,0 @@ -# Asset provenance - -Card faces, card back and green table originate from **AlexDer**, -[UNO Card Game Asset Pack](https://alexder.itch.io/uno-card-game-asset-pack). -The user supplied `Uno Game Assets (1).zip`; its SHA-256 is: - -``` -873e5243b3bc15140313becdbfb33c2afc7ed858e49c6f67a6ef5f9706ad9837 -``` - -The author's public replies on that page permit use in projects without limits, -including an MIT-licensed open-source game, and appreciate attribution. The pack -does not contain a separate license text. Its font-license comments distinguish -the original Comic Kings font from the assets: this project includes no font -file from the pack and draws its interface with NumPlay's existing native fonts. -Do not describe the pack as authored by this project or as MIT-licensed code. - -`tools/assets.py` reads only named PNG entries from the supplied ZIP and generates: - -- All 52 colored faces, Wild, Wild +4 and the card back at 44 × 64 pixels, - with a shared 31-color RGB565 palette and transparent row-RLE encoding. -- A 32 × 24 RGB565 sample of `Table_2.png`, smoothly scaled when drawn. -- A 55 × 56 app icon composed from the supplied card art. - -No PDFs, Photoshop files, original-resolution textures, audio or additional -typefaces are included in the game. The pack's “ASSET PACK” banner is not used as -a game logo. The table and cards are the actual supplied artwork, adapted to the -calculator's display and color format. - -To reproduce the generated files with Pillow: - -```sh -python3 tools/assets.py '/path/to/Uno Game Assets (1).zip' -``` - -The generated size/provenance report is `tools/assets.json`. UNO belongs to -Mattel; this is an unofficial fan adaptation without Mattel affiliation. diff --git a/games/uno/Makefile b/games/uno/Makefile index 668b026d..1bb3def9 100644 --- a/games/uno/Makefile +++ b/games/uno/Makefile @@ -1,20 +1,56 @@ -PYTHON ?= python3 -HOST_CC ?= cc -NWLINK ?= nwlink -TOOLCHAIN ?= -.PHONY: build check module sim-module test test-arm test-integration clean -build check module: - $(PYTHON) tools/build.py --nwlink "$(NWLINK)" $(if $(TOOLCHAIN),--toolchain "$(TOOLCHAIN)") -test: - $(PYTHON) tools/test.py --cc "$(HOST_CC)" -test-arm: build test - $(PYTHON) tests/test_arm.py --nwlink "$(NWLINK)" -test-integration: module - $(PYTHON) tests/test_integration.py --nwlink "$(NWLINK)" -sim-module: - mkdir -p output/sim - $(HOST_CC) -std=c11 -O2 -fPIC $(shell $(NWLINK) eadk-cflags-simulator) -DNP_MODULE=1 -Dmain=np_uno_main -c src/main.c -o output/sim/main.o - $(HOST_CC) -std=c11 -O2 -fPIC -c src/uno.c -o output/sim/uno.o - $(HOST_CC) -r -nostdlib output/sim/main.o output/sim/uno.o -o output/sim-module.o +# UNO on the NumWorks calculator. +# make output/uno.nwa +# make check link it like the calculator does (output/uno.bin) +# make host build/play: the game on a computer, for tests and pictures +# make test the rules against the instruction sheet, bots playing whole games to 500, random keys, saves +# (with the sanitizers) +Q ?= @ +CC = arm-none-eabi-gcc +NWLINK ?= npx --yes -- nwlink@1.0.0 +BUILD_DIR = output +L = ../../launcher/src + +SRC = src/main.c src/game.c src/bot.c src/draw.c src/save.c src/plat_eadk.c $(L)/gfx.c $(L)/font_data.c $(L)/xfont.c +HEADERS = $(wildcard src/*.h) $(L)/gfx.h $(L)/font.h $(L)/np.h ../common/epsilon_app.h ../common/epsilon_files.h + +CFLAGS = -std=gnu11 $(shell $(NWLINK) eadk-cflags-device) -DPLATFORM_DEVICE=1 -DEPSILON_XL=1 -I$(L) +CFLAGS += -Os -Wall -Wextra -Wno-unused-parameter -fno-math-errno -fsingle-precision-constant +CFLAGS += -fno-tree-loop-distribute-patterns -flto -fno-fat-lto-objects -fwhole-program -fvisibility=internal +CFLAGS += -ffunction-sections -fdata-sections +LDFLAGS = -Wl,--relocatable -nostartfiles --specs=nano.specs +LDFLAGS += -Wl,-e,main -Wl,-u,eadk_app_name -Wl,-u,eadk_app_icon -Wl,-u,eadk_api_level +LDFLAGS += -Wl,--gc-sections -flinker-output=nolto-rel + +.PHONY: build check clean host test +build: $(BUILD_DIR)/uno.nwa + +# apps get 133652 bytes of RAM on custom builds of Epsilon 25.2 (148928 or more on official ones) +check: $(BUILD_DIR)/uno.nwa + $(Q) $(NWLINK) nwa-bin --ram-length 133652 $< $(BUILD_DIR)/uno.bin + @echo "BIN $(BUILD_DIR)/uno.bin: $$(wc -c < $(BUILD_DIR)/uno.bin) bytes" + +$(BUILD_DIR)/uno.nwa: $(SRC) $(HEADERS) $(BUILD_DIR)/icon.o + @echo "LD $@" + $(Q) $(CC) $(CFLAGS) $(LDFLAGS) $(SRC) $(BUILD_DIR)/icon.o -lm -o $@ + $(Q) arm-none-eabi-strip --strip-unneeded $@ + +$(BUILD_DIR)/icon.o: src/icon.png | $(BUILD_DIR) + @echo "ICON $<" + $(Q) $(NWLINK) png-icon-o $< $@ + +$(BUILD_DIR): + $(Q) mkdir -p $@ + +# on a computer: tests/play.c checks the rules, plays whole games with the bots and random keys, and saves pictures +HOST_SRC = tests/play.c src/game.c src/bot.c src/draw.c src/save.c $(L)/gfx.c $(L)/font_data.c $(L)/xfont.c +HOST_FLAGS = -std=gnu11 -O2 -g -Wall -Wextra -Wno-unused-parameter -ffp-contract=off -Isrc -I$(L) -DHOST +host: build/play +build/play: $(HOST_SRC) src/main.c $(wildcard src/*.h) + $(Q) mkdir -p build + $(Q) cc $(HOST_FLAGS) -fsanitize=address,undefined -fno-sanitize-recover=undefined $(HOST_SRC) -lm -o $@ + @echo "HOST $@" +test: build/play + build/play test build + clean: - $(PYTHON) -c "import shutil; shutil.rmtree('output', ignore_errors=True)" + $(Q) rm -rf $(BUILD_DIR) build diff --git a/games/uno/VALIDATION.md b/games/uno/VALIDATION.md deleted file mode 100644 index 41ea5133..00000000 --- a/games/uno/VALIDATION.md +++ /dev/null @@ -1,126 +0,0 @@ -# UNO validation - -Validated locally on 23 October 2026. These are automated host and ARM-emulator -results, **not physical-calculator test results**. - -## Build and memory - -ARM GCC 15.2.1, `-Os`/LTO, nwlink 1.0.0. Release and debug NWAs produce identical -installed bytes for every tested profile. The standalone game and a launcher -module both compile. The catalogue, standalone export, credits and build tests -add UNO only; the other games are unchanged. - -| Measurement | Bytes | -| --- | ---: | -| Distributable `UNO.nwa` | 129,120 | -| Installed code, metadata and art | 103,624 | -| Static RAM, including LCD strip | 11,208 | -| Maximum stack observed during ARM scenarios | 1,040 | -| Save record payload | 768 | -| All 55 card sprites, palette and offsets | 60,895 | -| Table texture | 1,536 | - -Installed size comes from nwlink's actual calculator link, not ELF file size. -Static RAM is `_heap_start - _data_section_start_ram` in the installed ELF. -The observed stack maximum is a scenario measurement, not a mathematical bound. -No game code allocates heap memory. - -| ARM profile | Available application RAM | Result | -| --- | ---: | --- | -| N0120, Epsilon | 153,676 | Passed | -| N0110, Epsilon | 148,928 | Passed | -| N0115 RAM profile, Epsilon | 133,652 | Passed | -| N0110/N0115, Upsilon | 107,674 | Passed | - -The N0115 test uses the older-model CPU/memory layout with its configured RAM -limit; it is not an independently emulated physical N0115 board. Emulator work -estimates average approximately 14 ms per redraw on the N0120 profile and 36 ms -on the older profiles. These are not measured display refresh rates on hardware. -The app only redraws when its visible state changes. - -## Rules engine - -`tools/test.py` builds and runs the C tests with the host compiler. Tests cover: - -- Color, number and action matching; legal Wilds and bluffable +4 cards. -- Two-player Reverse/Skip and multiplayer direction changes. -- One-card draws, voluntary draws, keeping a drawn card, and forbidding play of - a different hand card after drawing. -- Legal and illegal +4 challenges, offender/target penalties and skipped turns. -- Direct victory on an empty hand for humans and bots, including when an - opponent holds only a zero card; last-card +2/+4 resolution before victory. -- UNO pre-call, late self-call, catching, immunity after the next action and - automatic UNO. -- Same-kind penalty stacking, no mixing, no challenge for stacked +4, and no - stacking after going out; draw-until-playable and forced drawn play. -- Exhausted-pile recycling while preserving the top discard and every card. -- 12,000 initial deals checking opening actions and deck composition. -- **1,152 complete single games**, spanning all 32 house-rule combinations, - 2/3/4 players, all three bot difficulties and four seeds per combination. - The final run used 83,450 actions, with no blocked-table redeals. Every step - checked the exact 108-card multiset; the largest simulated hand had 39 cards. -- Save round trips, truncated/invalid saves, semantic state rejection and every - individual bit flip across the entire 768-byte save, without modifying the - live state when a save is invalid. -- A real version-1 save with a 500-point target and accumulated totals migrates - to version 2 with the cards intact and former totals/targets zeroed. A won v1 - round migrates to a finished game. Point fields and calculations are removed - from the live rules engine; the reserved wire slots preserve compatibility. - -## UI and calculator execution - -The host tests validate every RLE row's bounds, real-font help wrapping, large -hands and scrolling, and render screenshots of the menus, table, settings, -variants, instructions, color selection, challenge, evidence, table rules and result. - -The visual table setup has separate Players, Rules and Ready steps, with visible -seats, five on-screen switches and a final summary. Host tests navigate each -step, every switch, the classic reset and returning to earlier steps, verifying -that editing preferences does not mutate an existing match. Text-width checks -cover switch labels, descriptions, card names, action shortcuts and the gap -between the pile labels and active-color label. Table screenshots cover two, -three and four players, bot turns and a large hand. Browsing during bot turns -and skipping unavailable action buttons are exercised too. - -`tests/test_arm.py` runs the **actual ARM application**, including Epsilon/Upsilon -system calls. Each profile exercises menu navigation, bot turns, the real key -mapping, pausing, all help pages, table rules, save-to-menu, new-game replacement -cancellation, continue, Home/Power exits and reload. -The setup scenarios select player counts, enable +2/+4 stacking, restore classic -rules, review the table and return through all setup steps after canceling a -replacement. Setup contains no point target; the HUD, pause menu, help and -result screen contain no scores. Play-again uses the completed game's rules, -even when the saved preferences for a future game differ. - -Additional engine-validated saved positions exercise actual keys for playing, -calling UNO, drawing, rejecting an old hand card after drawing, keeping the new -card, choosing a Wild color, winning and both legal/illegal +4 challenges with -the hand-reveal screen. A completed game records its win once across reloads. -Actual key tests also verify Play again and migration of the real v1 save with -its old totals removed and cards preserved. - -Root Make targets `build/data/apps/UNO.nwa` and `build/data/modules/uno.o` -pass, including a parallel request for both outputs. The module occupies -81,776 bytes of code/read-only data, 4 bytes of initialized data and 11,188 bytes -of BSS in the launcher's shared arena. Root standalone output matches the -game's release byte for byte. - -`tests/test_integration.py` builds the real current launcher with a deliberately -UNO-only test catalogue, using the production catalogue entry and generators. -On N0120/Epsilon and N0110/Upsilon, real keys launch UNO, navigate its three-step -setup, play, save, return to the carousel and re-enter the game. Home exits the -launcher cleanly. The shared `numplay_saves.py` contains the game record; -retaining only Python scripts simulates reinstalling and restores that record -exactly. The maximum observed stack in this launcher scenario is 1,064 bytes. -This focused test is not a complete build or playthrough of all existing games. -The tests also cover a held launch key, a corrupt save and full storage with -retry and explicit exit without saving. An unrelated Python record is preserved. - -Memory guards report no invalid accesses, firmware RAM changes or unintended -flash writes in these scenarios. Exit releases the Home lock where supported -and clears application RAM before returning to firmware. Upsilon makes none of -the Epsilon-only system calls. - -Reports are reproducible in `output/sizes.json` and `output/arm/report.json`. -The screenshots in `docs/` are generated from these tests. Hardware testing is -still needed to confirm firmware-version-specific installation and LCD timing. diff --git a/games/uno/src/assets.h b/games/uno/src/assets.h deleted file mode 100644 index b2184d43..00000000 --- a/games/uno/src/assets.h +++ /dev/null @@ -1,2579 +0,0 @@ -/* Generated by tools/assets.py. AlexDer card art, see ASSETS.md. */ -#define CARD_W 44 -#define CARD_H 64 -static const uint16_t card_palette[] = { - 65535,65535,65535,65467,65535,61374,65196,65093,65124,65092,65092,65092,65059,56920,30196,19828,13513,13513,5371,1243,11467,60140,45608,1179, - 9353,59783,59783,59783,59751,59686,8322, -}; -static const uint16_t card_offsets[] = { - 0,1206,2361,3522,4675,5828,6985,8119,9255,10447,11595,12859,14140,15386,16518,17606,18694,19791,20884,21984,23059,24137,25278,26362, - 27549,28754,29924,30992,32028,33083,34126,35185,36241,37261,38276,39350,40382,41556,42722,43866,44924,45957,47006,48048,49108,50168,51189,52210, - 53278,54312,55466,56627,57766,58850,59787,60721, -}; -static const uint8_t card_pixels[] = { - 7,95,228,228,228,228,164,95,8,31,228,228,228,228,228,36,31,8,31,228,228,228,228,228, - 36,31,9,68,13,245,245,245,245,117,13,68,10,68,21,125,58,253,253,253,189,21,68,18, - 68,21,29,26,13,3,36,3,21,28,27,250,250,250,26,29,21,68,14,68,21,28,13,164, - 13,28,251,251,251,26,29,21,68,18,68,21,13,36,3,21,13,68,21,29,26,251,251,187, - 26,29,21,68,18,68,21,3,4,3,26,61,13,36,13,29,251,251,219,26,29,21,68,18, - 68,21,3,4,3,26,61,13,36,3,28,251,251,219,26,29,21,68,18,68,21,13,36,3, - 21,13,68,13,29,26,251,251,187,26,29,21,68,18,68,53,228,21,29,26,91,90,27,60, - 27,90,251,27,26,29,21,68,25,68,21,29,21,3,100,3,21,29,26,59,26,27,125,27, - 26,28,93,28,58,187,26,29,21,68,26,68,21,61,26,117,27,29,26,27,26,28,29,28, - 53,45,67,45,21,26,61,26,155,26,29,21,68,26,68,21,29,26,28,125,27,58,28,29, - 26,21,3,228,36,5,13,21,29,27,26,91,26,29,21,68,23,68,21,29,26,27,122,27, - 26,29,27,21,3,228,196,13,28,29,26,59,26,29,21,68,21,68,21,29,26,155,26,29, - 21,3,228,228,36,13,26,29,26,27,26,29,21,68,18,68,21,29,26,123,26,29,21,228, - 228,132,3,26,29,58,29,21,68,18,68,21,29,26,91,26,29,13,228,228,196,3,26,28, - 26,29,21,68,18,68,21,29,26,59,26,29,13,228,228,228,4,13,29,26,29,21,68,16, - 68,21,29,26,27,26,29,21,228,228,228,68,21,61,21,68,18,68,21,29,58,29,21,228, - 68,3,45,3,228,132,13,28,29,21,68,23,68,21,29,26,28,27,3,228,13,21,26,28, - 61,28,26,21,13,228,68,21,29,21,68,22,68,21,29,26,29,13,196,13,26,61,28,123, - 28,61,26,13,228,4,13,29,21,68,18,68,21,29,28,26,196,21,61,58,187,58,61,21, - 228,3,28,21,68,17,68,21,61,13,164,21,29,58,59,154,91,58,29,21,228,53,68,19, - 68,21,29,26,5,132,13,29,26,123,157,26,123,26,29,13,196,53,68,22,68,21,29,21, - 164,21,29,26,59,60,21,77,21,29,26,91,26,29,21,196,53,68,23,68,21,29,13,132, - 13,29,26,91,28,13,132,21,29,26,91,26,29,13,164,13,21,68,23,68,21,27,3,132, - 13,29,26,27,26,29,21,196,26,28,91,26,29,13,164,13,21,68,22,68,53,164,21,29, - 26,27,26,29,13,196,21,29,26,59,26,29,21,164,13,21,68,20,68,53,164,21,29,26, - 27,26,29,21,196,26,29,91,26,29,21,164,53,68,21,68,53,164,21,29,26,59,28,26, - 3,132,21,29,26,91,26,29,21,164,53,68,22,68,21,13,164,13,29,26,91,29,26,13, - 35,13,21,29,155,26,29,13,164,53,68,23,68,21,13,196,21,29,26,91,28,29,28,27, - 61,26,123,26,29,21,164,3,27,21,68,21,68,21,13,196,13,29,26,123,26,27,28,58, - 155,26,29,13,164,13,29,21,68,16,68,53,228,21,29,58,251,59,58,29,21,196,21,29, - 21,68,19,68,53,228,4,21,29,28,58,187,58,28,29,21,196,5,26,29,21,68,20,68, - 53,228,36,13,26,61,28,27,58,27,28,61,26,13,228,13,61,21,68,20,68,21,28,3, - 228,68,13,21,26,125,26,21,13,228,36,26,28,29,21,68,17,68,21,29,13,228,132,35, - 77,3,228,68,13,29,26,29,21,68,15,68,21,29,21,228,228,228,132,3,27,28,26,29, - 21,68,15,68,21,29,28,13,228,228,228,100,21,29,58,29,21,68,16,68,21,61,21,228, - 228,228,68,21,29,26,27,26,29,21,68,18,68,21,29,26,29,13,228,228,228,4,13,29, - 26,59,26,29,21,68,18,68,21,29,26,28,26,3,228,228,196,13,29,26,91,26,29,21, - 68,18,68,21,29,58,29,26,3,228,228,132,21,29,26,123,26,29,21,68,21,68,21,29, - 26,27,26,29,26,13,228,228,36,3,21,29,154,27,26,29,21,68,22,68,21,29,26,59, - 26,29,28,13,228,196,3,21,27,29,26,28,157,26,29,21,68,28,68,21,29,26,91,26, - 28,29,21,13,5,228,36,3,21,26,29,28,26,29,26,21,45,21,26,61,21,68,25,68, - 21,29,26,155,26,61,26,21,45,67,45,53,28,29,28,58,29,21,3,132,21,29,21,68, - 21,68,21,29,26,187,58,28,93,28,26,27,125,27,26,27,26,29,21,228,53,68,23,68, - 21,29,26,251,27,90,27,60,27,90,91,26,29,13,68,13,21,13,36,13,21,68,17,68, - 21,29,26,251,251,219,28,3,36,13,93,3,4,3,21,68,20,68,21,29,26,251,251,187, - 26,29,13,36,13,27,29,26,3,4,3,21,68,17,68,21,29,26,251,251,187,26,29,21, - 68,3,13,3,36,53,68,14,68,21,29,26,251,251,251,29,13,164,13,29,21,68,18,68, - 21,29,26,251,251,251,27,29,21,13,35,13,21,28,29,21,68,14,68,21,29,250,250,250, - 90,61,58,61,26,29,21,68,9,68,21,253,253,253,253,125,21,68,9,68,13,245,245,245, - 245,117,13,68,8,31,228,228,228,228,228,36,31,8,31,228,228,228,228,228,36,31,7,95, - 228,228,228,228,164,95,7,95,228,228,228,228,164,95,8,31,228,228,228,228,228,36,31,8, - 31,228,228,228,228,228,36,31,9,68,13,245,245,245,245,117,13,68,13,68,21,93,26,21, - 13,28,253,253,253,157,21,68,15,68,21,29,21,13,68,26,28,250,250,250,90,29,21,68, - 16,68,21,29,13,100,21,29,26,251,251,251,27,26,29,21,68,16,68,21,29,21,100,21, - 29,26,251,251,251,27,26,29,21,68,18,68,21,29,26,21,3,36,21,29,26,251,251,251, - 27,26,29,21,68,17,68,21,29,28,26,68,13,29,26,251,251,251,27,26,29,21,68,16, - 68,21,61,21,68,13,29,26,251,251,251,27,26,29,21,68,20,68,21,61,21,68,13,29, - 26,187,90,27,60,27,90,251,27,26,29,21,68,23,68,21,61,21,68,3,26,28,123,26, - 27,125,27,26,28,93,28,58,187,26,29,21,68,26,68,21,29,28,26,117,26,28,59,26, - 28,29,28,53,45,67,45,21,26,61,26,155,26,29,21,68,27,68,21,29,26,28,125,28, - 27,26,28,29,26,21,3,228,36,5,13,21,29,27,26,91,26,29,21,68,23,68,21,29, - 26,27,122,27,26,29,27,21,3,228,196,13,28,29,26,59,26,29,21,68,21,68,21,29, - 26,155,26,29,21,3,228,228,36,13,26,29,26,27,26,29,21,68,18,68,21,29,26,123, - 26,29,21,228,228,132,3,26,29,58,29,21,68,18,68,21,29,26,91,26,29,13,228,228, - 196,3,26,28,26,29,21,68,18,68,21,29,26,59,26,29,13,228,228,228,4,13,29,26, - 29,21,68,18,68,21,29,26,27,26,29,21,228,132,3,45,228,68,21,61,21,68,21,68, - 21,29,58,29,21,228,68,3,13,21,26,29,26,228,68,13,28,29,21,68,23,68,21,29, - 26,28,27,3,228,3,13,21,26,61,28,27,26,3,228,68,21,29,21,68,21,68,21,29, - 26,29,13,196,3,21,93,28,58,59,28,3,228,68,13,29,21,68,20,68,21,29,28,26, - 228,4,21,29,58,123,26,29,13,228,68,3,28,21,68,17,68,21,61,13,228,4,21,29, - 26,155,26,29,13,228,100,53,68,18,68,21,29,26,5,228,4,13,29,58,123,26,29,13, - 228,100,53,68,17,68,21,29,21,228,36,3,28,61,123,26,29,21,228,100,53,68,19,68, - 21,29,13,228,68,53,13,26,28,59,26,29,21,228,100,13,21,68,19,68,21,27,3,228, - 68,3,4,3,29,91,26,29,21,228,100,13,21,68,15,68,53,228,164,13,29,26,91,28, - 26,228,100,13,21,68,15,68,53,228,164,13,29,26,91,28,26,3,228,68,53,68,15,68, - 53,228,164,21,29,26,91,26,29,13,228,68,53,68,16,68,21,13,228,164,21,29,26,91, - 26,29,13,228,68,53,68,18,68,21,13,228,164,21,29,26,91,26,29,13,228,36,3,27, - 21,68,17,68,21,13,228,164,26,29,123,26,29,21,228,36,13,29,21,68,17,68,53,228, - 132,3,26,28,123,26,29,21,228,36,21,29,21,68,18,68,53,228,132,3,27,90,59,26, - 29,21,228,4,5,26,29,21,68,15,68,53,228,132,13,157,60,29,26,228,4,13,61,21, - 68,16,68,21,28,3,228,100,13,117,154,3,228,26,28,29,21,68,15,68,21,29,13,228, - 228,100,35,228,13,29,26,29,21,68,15,68,21,29,21,228,228,228,132,3,27,28,26,29, - 21,68,15,68,21,29,28,13,228,228,228,100,21,29,58,29,21,68,16,68,21,61,21,228, - 228,228,68,21,29,26,27,26,29,21,68,18,68,21,29,26,29,13,228,228,228,4,13,29, - 26,59,26,29,21,68,18,68,21,29,26,28,26,3,228,228,196,13,29,26,91,26,29,21, - 68,18,68,21,29,58,29,26,3,228,228,132,21,29,26,123,26,29,21,68,21,68,21,29, - 26,27,26,29,26,13,228,228,36,3,21,29,154,27,26,29,21,68,22,68,21,29,26,59, - 26,29,28,13,228,196,3,21,27,29,26,157,27,26,29,21,68,28,68,21,29,26,91,26, - 28,29,21,13,5,228,36,3,21,26,29,28,26,29,21,13,85,29,26,29,21,68,28,68, - 21,29,26,155,26,61,26,21,45,67,45,53,28,29,28,26,27,26,29,13,68,13,29,26, - 29,21,68,25,68,21,29,26,187,58,28,93,28,26,27,125,27,26,91,26,29,13,68,21, - 29,26,29,21,68,22,68,21,29,26,251,27,90,27,60,27,90,155,26,29,21,68,21,29, - 26,29,21,68,17,68,21,29,26,251,251,251,26,29,21,68,21,29,26,29,21,68,16,68, - 21,29,26,251,251,251,26,29,21,68,53,28,29,21,68,15,68,21,29,26,251,251,251,27, - 28,26,100,13,61,21,68,16,68,21,29,26,251,251,251,27,28,26,3,68,3,61,21,68, - 18,68,21,29,26,251,251,251,59,29,3,4,3,13,21,27,29,21,68,15,68,21,29,250, - 250,250,90,28,53,26,61,26,29,21,68,9,68,21,253,253,253,253,125,21,68,9,68,13, - 245,245,245,245,117,13,68,8,31,228,228,228,228,228,36,31,8,31,228,228,228,228,228,36, - 31,7,95,228,228,228,228,164,95,7,95,228,228,228,228,164,95,8,31,228,228,228,228,228, - 36,31,8,31,228,228,228,228,228,36,31,9,68,13,245,245,245,245,117,13,68,14,68,21, - 29,26,35,13,21,26,253,253,253,157,21,68,15,68,21,29,21,100,3,21,29,250,250,250, - 58,29,21,68,16,68,21,29,21,35,68,13,29,26,251,251,251,26,29,21,68,17,68,21, - 29,26,53,3,36,3,28,251,251,251,27,26,29,21,68,15,68,21,29,13,132,13,29,26, - 251,251,251,26,29,21,68,16,68,53,68,3,13,21,26,28,251,251,251,27,26,29,21,68, - 17,68,21,13,68,13,21,13,21,29,251,251,251,27,26,29,21,68,19,68,21,13,164,21, - 29,26,155,90,27,60,27,90,251,27,26,29,21,68,22,68,21,13,164,13,29,26,91,26, - 27,125,27,26,28,93,28,58,187,26,29,21,68,26,68,53,77,35,4,3,26,28,27,26, - 28,29,28,53,45,67,45,21,26,61,26,155,26,29,21,68,25,68,21,125,28,58,21,58, - 27,29,26,21,3,228,36,5,13,21,29,27,26,91,26,29,21,68,23,68,21,29,90,27, - 28,61,26,29,27,21,3,228,196,13,28,29,26,59,26,29,21,68,21,68,21,29,26,123, - 58,29,21,3,228,228,36,13,26,29,26,27,26,29,21,68,18,68,21,29,26,123,26,29, - 21,228,228,132,3,26,29,58,29,21,68,18,68,21,29,26,91,26,29,13,228,228,196,3, - 26,28,26,29,21,68,19,68,21,29,26,59,26,29,13,164,77,3,228,196,13,29,26,29, - 21,68,20,68,21,29,26,27,26,29,21,196,21,61,58,21,45,228,100,21,61,21,68,21, - 68,21,29,58,29,21,228,21,28,26,28,125,21,13,228,36,13,28,29,21,68,23,68,21, - 29,26,28,27,3,196,3,26,28,91,58,27,61,21,3,228,4,21,29,21,68,20,68,21, - 29,26,29,13,228,13,29,26,187,58,29,21,228,4,13,29,21,68,21,68,21,29,28,26, - 228,4,13,29,26,27,58,155,26,29,21,228,3,28,21,68,19,68,21,61,13,228,4,21, - 29,28,93,28,123,26,29,21,228,4,53,68,18,68,21,29,26,5,228,4,67,77,26,28, - 123,28,26,228,4,53,68,16,68,21,29,21,228,196,3,26,29,123,28,26,228,4,53,68, - 20,68,21,29,13,228,36,13,85,26,29,28,123,26,29,21,228,4,13,21,68,18,68,21, - 27,3,228,4,13,125,28,187,26,29,21,228,4,13,21,68,19,68,53,228,4,3,26,28, - 90,91,58,28,61,21,3,228,4,13,21,68,17,68,53,228,4,13,29,26,155,28,61,26, - 53,3,228,36,53,68,17,68,53,228,4,21,29,26,123,28,26,21,13,3,228,132,53,68, - 18,68,21,13,228,4,26,28,123,28,26,3,36,35,45,228,36,53,68,21,68,21,13,228, - 3,27,28,123,28,26,21,90,28,29,21,228,4,3,27,21,68,18,68,21,13,228,13,29, - 187,28,61,60,59,26,3,228,13,29,21,68,17,68,53,228,13,29,26,187,26,123,26,29, - 13,228,21,29,21,68,17,68,53,228,13,29,26,251,91,26,29,13,196,5,26,29,21,68, - 15,68,53,228,13,29,186,187,26,29,21,196,13,61,21,68,18,68,21,28,3,196,13,253, - 28,27,122,28,21,196,26,28,29,21,68,18,68,21,29,13,228,77,117,58,28,189,3,132, - 13,29,26,29,21,68,18,68,21,29,21,228,228,35,77,85,13,100,3,27,28,26,29,21, - 68,15,68,21,29,28,13,228,228,228,100,21,29,58,29,21,68,16,68,21,61,21,228,228, - 228,68,21,29,26,27,26,29,21,68,18,68,21,29,26,29,13,228,228,228,4,13,29,26, - 59,26,29,21,68,18,68,21,29,26,28,26,3,228,228,196,13,29,26,91,26,29,21,68, - 18,68,21,29,58,29,26,3,228,228,132,21,29,58,91,26,29,21,68,21,68,21,29,26, - 27,26,29,26,13,228,228,36,3,21,93,60,27,58,29,21,68,20,68,21,29,26,59,26, - 29,28,13,228,196,3,21,27,29,85,58,125,21,68,26,68,21,29,26,91,26,28,29,21, - 13,5,228,36,3,21,26,29,26,29,13,68,3,77,29,21,68,23,68,21,29,26,155,26, - 61,26,21,45,67,45,53,28,29,28,58,29,21,196,28,21,68,23,68,21,29,26,187,58, - 28,93,28,26,27,125,27,26,59,26,29,21,164,3,29,21,68,20,68,21,29,26,251,27, - 90,27,60,27,90,155,28,26,85,68,13,29,21,68,15,68,21,29,26,251,251,251,28,26, - 45,100,13,29,21,68,17,68,21,29,26,251,251,219,26,29,21,100,3,13,26,29,21,68, - 17,68,21,29,26,251,251,219,26,29,13,68,53,26,28,29,21,68,15,68,21,29,26,251, - 251,219,26,29,21,132,13,61,21,68,15,68,21,29,26,251,251,251,28,26,13,100,21,61, - 21,68,17,68,21,29,250,250,250,58,27,29,21,45,3,21,29,28,21,68,9,68,21,253, - 253,253,253,125,21,68,9,68,13,245,245,245,245,117,13,68,8,31,228,228,228,228,228,36, - 31,8,31,228,228,228,228,228,36,31,7,95,228,228,228,228,164,95,7,95,228,228,228,228, - 164,95,8,31,228,228,228,228,228,36,31,8,31,228,228,228,228,228,36,31,9,68,13,245, - 245,245,245,117,13,68,12,68,21,29,26,85,26,253,253,253,189,21,68,15,68,21,29,13, - 68,5,13,27,250,250,250,90,29,21,68,15,68,21,29,13,132,21,29,26,251,251,251,26, - 29,21,68,16,68,21,29,77,3,36,21,29,26,251,251,251,26,29,21,68,16,68,21,28, - 29,21,100,21,29,26,251,251,251,26,29,21,68,15,68,21,61,21,100,21,29,26,251,251, - 251,26,29,21,68,16,68,21,26,53,13,68,13,29,26,251,251,251,26,29,21,68,19,68, - 21,26,164,21,29,26,155,90,27,60,27,90,251,27,26,29,21,68,22,68,21,29,3,100, - 13,28,155,26,27,125,27,26,28,93,28,58,187,26,29,21,68,27,68,21,29,13,3,13, - 53,29,28,91,26,28,29,28,53,45,67,45,21,26,61,26,155,26,29,21,68,27,68,21, - 29,26,27,93,26,59,26,28,29,26,21,3,228,36,5,13,21,29,27,26,91,26,29,21, - 68,22,68,21,29,59,90,59,26,29,27,21,3,228,196,13,28,29,26,59,26,29,21,68, - 21,68,21,29,26,155,26,29,21,3,228,228,36,13,26,29,26,27,26,29,21,68,18,68, - 21,29,26,123,26,29,21,228,228,132,3,26,29,58,29,21,68,18,68,21,29,26,91,26, - 29,13,228,228,196,3,26,28,26,29,21,68,18,68,21,29,26,59,26,29,13,228,228,228, - 4,13,29,26,29,21,68,16,68,21,29,26,27,26,29,21,228,228,228,68,21,61,21,68, - 18,68,21,29,58,29,21,196,13,149,45,3,228,100,13,28,29,21,68,18,68,21,29,26, - 28,27,3,196,21,253,26,13,228,68,21,29,21,68,20,68,21,29,26,29,13,228,21,28, - 186,27,61,21,3,228,4,13,29,21,68,21,68,21,29,28,26,228,3,26,28,59,58,123, - 26,29,21,228,4,3,28,21,68,17,68,21,61,13,228,3,58,28,93,28,123,28,26,228, - 36,53,68,20,68,21,29,26,5,228,13,61,26,85,26,28,91,28,26,3,228,4,53,68, - 22,68,21,29,21,228,4,13,21,13,3,36,3,21,29,26,91,28,3,228,4,53,68,17, - 68,21,29,13,228,100,13,58,61,155,26,3,228,4,13,21,68,18,68,21,27,3,228,100, - 13,29,28,155,26,29,21,228,36,13,21,68,16,68,53,228,132,3,26,28,155,28,21,3, - 228,36,13,21,68,14,68,53,228,164,21,29,26,155,28,21,228,36,53,68,15,68,53,228, - 164,21,29,60,123,28,29,3,228,4,53,68,18,68,21,13,228,164,3,45,21,29,26,59, - 26,29,13,228,4,53,68,17,68,21,13,228,4,3,213,26,28,123,29,13,228,3,27,21, - 68,17,68,21,13,228,4,3,27,189,28,155,26,3,228,13,29,21,68,17,68,53,228,36, - 21,29,122,155,26,29,21,228,4,21,29,21,68,18,68,53,228,36,21,29,26,187,58,29, - 26,3,228,5,26,29,21,68,19,68,53,228,36,21,29,26,59,90,28,61,21,3,228,4, - 13,61,21,68,21,68,21,28,3,228,4,13,29,26,28,125,26,21,13,228,68,26,28,29, - 21,68,20,68,21,29,13,228,4,13,61,58,53,13,3,228,100,13,29,26,29,21,68,17, - 68,21,29,21,228,36,45,3,228,228,3,27,28,26,29,21,68,15,68,21,29,28,13,228, - 228,228,100,21,29,58,29,21,68,16,68,21,61,21,228,228,228,68,21,29,26,27,26,29, - 21,68,18,68,21,29,26,29,13,228,228,228,4,13,29,26,59,26,29,21,68,18,68,21, - 29,26,28,26,3,228,228,196,13,29,26,91,26,29,21,68,18,68,21,29,58,29,26,3, - 228,228,132,21,29,26,123,26,29,21,68,23,68,21,29,26,27,26,29,26,13,228,228,36, - 3,21,29,90,27,28,29,26,29,21,68,21,68,21,29,26,59,26,29,28,13,228,196,3, - 21,27,29,58,93,90,29,21,68,28,68,21,29,26,91,26,28,29,21,13,5,228,36,3, - 21,26,29,28,26,28,29,21,45,35,26,29,21,68,25,68,21,29,26,155,26,61,26,21, - 45,67,45,53,28,29,28,26,59,29,13,132,21,29,21,68,23,68,21,29,26,187,58,28, - 93,28,26,27,125,27,26,59,26,29,21,164,21,29,21,68,22,68,21,29,26,251,27,90, - 27,60,27,90,123,26,29,21,68,13,53,26,29,21,68,17,68,21,29,26,251,251,251,28, - 26,3,68,21,29,27,29,21,68,17,68,21,29,26,251,251,251,29,26,3,68,13,29,26, - 29,21,68,16,68,21,29,26,251,251,219,26,29,21,68,77,26,29,21,68,15,68,21,29, - 26,251,251,251,28,26,132,3,26,29,21,68,16,68,21,29,26,251,251,251,26,29,21,13, - 68,13,61,21,68,15,68,21,29,250,250,250,90,29,28,26,53,58,29,21,68,9,68,21, - 253,253,253,253,125,21,68,9,68,13,245,245,245,245,117,13,68,8,31,228,228,228,228,228, - 36,31,8,31,228,228,228,228,228,36,31,7,95,228,228,228,228,164,95,7,95,228,228,228, - 228,164,95,8,31,228,228,228,228,228,36,31,8,31,228,228,228,228,228,36,31,9,68,13, - 245,245,245,245,117,13,68,12,68,21,61,26,77,21,253,253,253,157,21,68,15,68,21,28, - 29,13,68,13,29,250,250,250,90,29,21,68,16,68,21,29,21,100,13,29,26,251,251,251, - 27,26,29,21,68,19,68,21,29,13,4,13,5,4,13,29,28,251,251,251,27,26,29,21, - 68,17,68,21,26,36,3,36,45,21,29,26,251,251,219,26,29,21,68,14,68,21,13,196, - 21,29,26,251,251,219,26,29,21,68,13,68,53,45,132,26,28,251,251,251,26,29,21,68, - 20,68,21,93,3,36,13,21,26,187,90,27,60,27,90,251,27,26,29,21,68,24,68,21, - 29,27,26,68,13,29,26,123,26,27,125,27,26,28,93,28,58,187,26,29,21,68,25,68, - 21,29,28,21,45,53,123,26,28,29,28,53,45,67,45,21,26,61,26,155,26,29,21,68, - 26,68,21,29,26,28,125,59,26,28,29,26,21,3,228,36,5,13,21,29,27,26,91,26, - 29,21,68,23,68,21,29,26,27,122,27,26,29,27,21,3,228,196,13,28,29,26,59,26, - 29,21,68,21,68,21,29,26,155,26,29,21,3,228,228,36,13,26,29,26,27,26,29,21, - 68,18,68,21,29,26,123,26,29,21,228,228,132,3,26,29,58,29,21,68,18,68,21,29, - 26,91,26,29,13,228,228,196,3,26,28,26,29,21,68,18,68,21,29,26,59,26,29,13, - 228,228,228,4,13,29,26,29,21,68,20,68,21,29,26,27,26,29,21,228,4,13,181,26, - 3,228,4,21,61,21,68,18,68,21,29,58,29,21,228,36,26,221,3,228,4,13,28,29, - 21,68,20,68,21,29,26,28,27,3,228,4,13,29,186,28,3,228,36,21,29,21,68,19, - 68,21,29,26,29,13,228,36,26,29,187,28,3,228,36,13,29,21,68,21,68,21,29,28, - 26,228,36,13,29,26,27,26,123,28,3,228,36,3,28,21,68,18,68,21,61,13,228,36, - 26,29,26,28,29,123,28,3,228,68,53,68,21,68,21,29,26,5,228,4,13,29,26,29, - 53,29,26,59,28,3,228,68,53,68,20,68,21,29,21,228,36,26,28,26,29,45,29,26, - 59,28,3,228,68,53,68,23,68,21,29,13,228,4,13,29,26,28,26,3,21,29,26,59, - 28,3,228,68,13,21,68,18,68,21,27,3,228,3,26,28,59,90,28,91,28,117,228,13, - 21,68,16,68,53,228,4,13,29,26,91,28,187,93,26,228,13,21,68,14,68,53,228,3, - 26,28,251,91,58,29,21,228,53,68,14,68,53,228,21,29,59,90,251,26,29,21,228,53, - 68,16,68,21,13,228,21,58,28,93,28,187,58,29,13,228,53,68,18,68,21,13,228,36, - 35,45,21,26,28,155,93,13,196,3,27,21,68,16,68,21,13,228,196,26,29,123,28,85, - 5,196,13,29,21,68,16,68,53,228,164,3,28,123,26,29,13,228,36,21,29,21,68,18, - 68,53,228,164,13,29,26,91,26,29,13,228,4,5,26,29,21,68,16,68,53,228,164,13, - 29,90,59,29,13,228,4,13,61,21,68,18,68,21,28,3,228,132,21,125,28,58,13,228, - 4,26,28,29,21,68,17,68,21,29,13,228,132,85,45,35,228,36,13,29,26,29,21,68, - 15,68,21,29,21,228,228,228,132,3,27,28,26,29,21,68,15,68,21,29,28,13,228,228, - 228,100,21,29,58,29,21,68,16,68,21,61,21,228,228,228,68,21,29,26,27,26,29,21, - 68,18,68,21,29,26,29,13,228,228,228,4,13,29,26,59,26,29,21,68,18,68,21,29, - 26,28,26,3,228,228,196,13,29,26,91,26,29,21,68,18,68,21,29,58,29,26,3,228, - 228,132,21,29,26,123,26,29,21,68,21,68,21,29,26,27,26,29,26,13,228,228,36,3, - 21,29,90,91,26,29,21,68,22,68,21,29,26,59,26,29,28,13,228,196,3,21,27,29, - 26,125,59,26,29,21,68,28,68,21,29,26,91,26,28,29,21,13,5,228,36,3,21,26, - 29,28,26,28,21,77,21,29,26,29,21,68,28,68,21,29,26,155,26,61,26,21,45,67, - 45,53,28,29,28,26,27,26,29,21,68,21,29,26,29,21,68,24,68,21,29,26,187,58, - 28,93,28,26,27,125,27,26,59,26,29,21,13,68,26,93,21,68,20,68,21,29,26,251, - 27,90,27,60,27,90,155,29,3,100,35,13,26,21,68,14,68,21,29,26,251,251,219,28, - 26,196,3,29,21,68,18,68,21,29,26,251,251,219,28,26,21,13,36,3,36,21,29,21, - 68,17,68,21,29,26,251,251,251,27,29,21,36,13,4,13,61,21,68,15,68,21,29,26, - 251,251,251,26,29,21,100,21,61,21,68,17,68,21,29,26,251,251,251,26,29,21,68,13, - 29,26,29,21,68,16,68,21,29,250,250,250,58,29,21,77,21,29,26,29,21,68,9,68, - 21,253,253,253,253,125,21,68,9,68,13,245,245,245,245,117,13,68,8,31,228,228,228,228, - 228,36,31,8,31,228,228,228,228,228,36,31,7,95,228,228,228,228,164,95,7,95,228,228, - 228,228,164,95,8,31,228,228,228,228,228,36,31,8,31,228,228,228,228,228,36,31,9,68, - 13,245,245,245,245,117,13,68,11,68,85,109,3,13,253,253,253,125,21,68,13,68,21,13, - 164,13,29,250,250,250,58,29,21,68,14,68,21,13,164,13,29,26,251,251,251,26,29,21, - 68,15,68,21,13,68,77,21,29,26,251,251,251,26,29,21,68,15,68,53,68,3,13,21, - 60,251,251,251,27,26,29,21,68,15,68,21,28,3,132,13,29,26,251,251,251,26,29,21, - 68,17,68,21,29,26,53,3,36,3,28,251,251,251,27,26,29,21,68,21,68,21,29,21, - 35,68,13,29,26,155,90,27,60,27,90,251,27,26,29,21,68,23,68,21,29,21,132,21, - 29,26,91,26,27,125,27,26,28,93,28,58,187,26,29,21,68,28,68,21,29,21,36,3, - 13,21,29,26,59,26,28,29,28,53,45,67,45,21,26,61,26,155,26,29,21,68,29,68, - 21,29,26,21,26,28,61,26,28,26,28,29,26,21,3,228,36,5,13,21,29,27,26,91, - 26,29,21,68,25,68,21,29,26,29,28,27,26,59,26,29,27,21,3,228,196,13,28,29, - 26,59,26,29,21,68,21,68,21,29,58,123,26,29,21,3,228,228,36,13,26,29,26,27, - 26,29,21,68,18,68,21,29,26,123,26,29,21,228,228,132,3,26,29,58,29,21,68,18, - 68,21,29,26,91,26,29,13,228,228,196,3,26,28,26,29,21,68,20,68,21,29,26,59, - 26,29,13,228,196,35,45,3,132,13,29,26,29,21,68,21,68,21,29,26,27,26,29,21, - 164,35,77,117,58,28,61,13,164,21,61,21,68,22,68,21,29,58,29,21,100,13,21,58, - 28,221,60,26,28,26,196,13,28,29,21,68,22,68,21,29,26,28,27,3,100,13,29,60, - 27,218,59,26,29,21,228,21,29,21,68,20,68,21,29,26,29,13,132,13,29,26,251,91, - 26,29,21,228,13,29,21,68,19,68,21,29,28,26,164,13,29,26,251,91,26,29,13,228, - 3,28,21,68,16,68,21,61,13,164,13,29,26,187,186,27,3,228,4,53,68,15,68,21, - 29,26,5,164,3,28,219,189,26,228,36,53,68,17,68,21,29,21,196,3,26,28,123,28, - 26,109,85,228,36,53,68,17,68,21,29,13,228,21,29,26,123,29,21,3,228,196,13,21, - 68,18,68,21,27,3,228,21,29,26,155,29,28,53,45,228,68,13,21,68,17,68,53,228, - 4,13,29,26,155,26,27,125,21,228,36,13,21,68,17,68,53,228,36,21,29,59,90,59, - 90,27,29,13,228,4,53,68,17,68,53,228,68,21,27,28,93,28,123,26,29,21,228,4, - 53,68,17,68,21,13,228,100,35,45,21,26,28,123,29,26,228,4,53,68,16,68,21,13, - 228,228,3,26,29,123,28,26,228,3,27,21,68,17,68,21,13,228,68,13,85,26,60,155, - 29,21,228,13,29,21,68,15,68,53,228,68,21,125,187,26,29,21,228,21,29,21,68,18, - 68,53,228,68,13,29,58,187,26,28,29,13,196,5,26,29,21,68,15,68,53,228,68,3, - 28,155,90,61,13,228,13,61,21,68,20,68,21,28,3,228,68,26,28,90,27,93,21,13, - 228,4,26,28,29,21,68,19,68,21,29,13,228,68,21,125,27,53,13,228,36,13,29,26, - 29,21,68,19,68,21,29,21,228,68,13,53,45,3,228,100,3,27,28,26,29,21,68,15, - 68,21,29,28,13,228,228,228,100,21,29,58,29,21,68,16,68,21,61,21,228,228,228,68, - 21,29,26,27,26,29,21,68,18,68,21,29,26,29,13,228,228,228,4,13,29,26,59,26, - 29,21,68,18,68,21,29,26,28,26,3,228,228,196,13,29,26,91,26,29,21,68,20,68, - 21,29,58,29,26,3,228,228,132,21,29,26,27,58,27,26,29,21,68,23,68,21,29,26, - 27,26,29,26,13,228,228,36,3,21,29,58,28,61,28,26,29,21,68,24,68,21,29,26, - 59,26,29,28,13,228,196,3,21,27,29,26,61,26,53,26,28,29,21,68,28,68,21,29, - 26,91,26,28,29,21,13,5,228,36,3,21,26,29,28,26,29,21,13,3,36,21,61,21, - 68,24,68,21,29,26,155,26,61,26,21,45,67,45,53,28,29,28,58,29,21,132,13,61, - 21,68,24,68,21,29,26,187,58,28,93,28,26,27,125,27,26,59,26,29,13,68,45,21, - 61,21,68,22,68,21,29,26,251,27,90,27,60,27,90,123,26,29,13,68,13,53,28,29, - 21,68,15,68,21,29,26,251,251,219,26,29,21,164,21,29,21,68,16,68,21,29,26,251, - 251,251,27,29,53,13,68,13,29,21,68,15,68,21,29,26,251,251,251,29,26,77,68,3, - 29,21,68,15,68,21,29,26,251,251,219,26,29,21,164,3,28,21,68,14,68,21,29,26, - 251,251,219,26,29,13,196,28,21,68,15,68,21,29,250,250,250,26,29,13,3,77,85,29, - 21,68,10,68,21,253,253,253,93,28,253,21,68,9,68,13,245,245,245,245,117,13,68,8, - 31,228,228,228,228,228,36,31,8,31,228,228,228,228,228,36,31,7,95,228,228,228,228,164, - 95,7,95,228,228,228,228,164,95,8,31,228,228,228,228,228,36,31,8,31,228,228,228,228, - 228,36,31,9,68,13,245,245,245,245,117,13,68,9,68,21,253,253,253,253,125,21,68,13, - 68,53,3,13,53,27,250,250,250,154,29,21,68,14,68,21,13,68,21,61,251,251,251,91, - 26,29,21,68,17,68,21,13,36,3,21,13,21,60,251,251,251,27,26,29,21,68,14,68, - 21,13,164,13,29,26,251,251,251,26,29,21,68,16,68,21,13,36,13,3,68,26,28,251, - 251,251,26,29,21,68,17,68,21,13,36,21,13,68,21,29,26,251,251,219,26,29,21,68, - 18,68,53,164,3,26,28,155,90,27,60,27,90,251,27,26,29,21,68,24,68,21,28,13, - 100,3,21,29,26,91,26,27,125,27,26,28,93,28,58,187,26,29,21,68,26,68,21,29, - 26,117,26,29,26,59,26,28,29,28,53,45,67,45,21,26,61,26,155,26,29,21,68,27, - 68,21,29,26,125,28,26,28,26,28,29,26,21,3,228,36,5,13,21,29,27,26,91,26, - 29,21,68,21,68,21,29,154,59,26,29,27,21,3,228,196,13,28,29,26,59,26,29,21, - 68,21,68,21,29,26,155,26,29,21,3,228,228,36,13,26,29,26,27,26,29,21,68,18, - 68,21,29,26,123,26,29,21,228,228,132,3,26,29,58,29,21,68,18,68,21,29,26,91, - 26,29,13,228,228,196,3,26,28,26,29,21,68,18,68,21,29,26,59,26,29,13,228,228, - 228,4,13,29,26,29,21,68,16,68,21,29,26,27,26,29,21,228,228,228,68,21,61,21, - 68,15,68,21,29,58,29,21,228,228,228,100,13,28,29,21,68,19,68,21,29,26,28,27, - 3,132,13,53,45,3,228,228,36,21,29,21,68,18,68,21,29,26,29,13,164,21,125,26, - 53,13,228,196,13,29,21,68,18,68,21,29,28,26,196,26,28,90,60,29,13,228,196,3, - 28,21,68,17,68,21,61,13,164,3,26,28,91,26,29,21,228,228,4,53,68,17,68,21, - 29,26,5,164,13,29,26,123,29,3,228,228,4,53,68,19,68,21,29,21,196,13,29,26, - 91,29,21,13,117,13,3,228,68,53,68,18,68,21,29,13,196,13,29,26,123,28,189,28, - 21,228,36,13,21,68,18,68,21,27,3,196,21,29,26,155,186,27,29,21,228,4,13,21, - 68,15,68,53,228,21,29,26,123,90,187,26,3,228,13,21,68,17,68,53,228,21,29,26, - 91,28,93,28,123,26,29,13,228,53,68,19,68,53,228,21,29,26,59,28,26,77,26,28, - 91,26,29,21,228,53,68,22,68,21,13,228,13,29,26,27,26,29,21,68,21,29,26,59, - 26,29,21,228,53,68,20,68,21,13,228,13,29,26,91,28,85,28,123,26,29,21,196,3, - 27,21,68,18,68,21,13,228,4,26,28,123,93,155,26,29,13,196,13,29,21,68,18,68, - 53,228,4,21,29,26,91,90,123,26,29,26,228,21,29,21,68,18,68,53,228,4,3,26, - 29,26,219,58,61,13,196,5,26,29,21,68,18,68,53,228,36,3,26,61,28,91,28,93, - 26,13,228,13,61,21,68,21,68,21,28,3,228,36,3,53,26,60,27,26,53,13,228,36, - 26,28,29,21,68,15,68,21,29,13,228,132,131,228,100,13,29,26,29,21,68,15,68,21, - 29,21,228,228,228,132,3,27,28,26,29,21,68,15,68,21,29,28,13,228,228,228,100,21, - 29,58,29,21,68,16,68,21,61,21,228,228,228,68,21,29,26,27,26,29,21,68,18,68, - 21,29,26,29,13,228,228,228,4,13,29,26,59,26,29,21,68,18,68,21,29,26,28,26, - 3,228,228,196,13,29,26,91,26,29,21,68,18,68,21,29,58,29,26,3,228,228,132,21, - 29,26,123,26,29,21,68,19,68,21,29,26,27,26,29,26,13,228,228,36,3,21,29,218, - 29,21,68,22,68,21,29,26,59,26,29,28,13,228,196,3,21,27,29,26,28,157,26,29, - 21,68,27,68,21,29,26,91,26,28,29,21,13,5,228,36,3,21,26,29,28,26,29,26, - 21,45,53,61,21,68,25,68,21,29,26,155,26,61,26,21,45,67,45,53,28,29,28,58, - 29,21,3,132,21,29,21,68,23,68,21,29,26,187,58,28,93,28,26,27,125,27,26,59, - 26,29,13,164,13,29,21,68,23,68,21,29,26,251,27,90,27,60,27,90,123,28,26,3, - 36,13,21,36,3,27,21,68,15,68,21,29,26,251,251,251,29,13,68,3,68,26,21,68, - 14,68,21,29,26,251,251,219,26,29,21,196,26,21,68,16,68,21,29,26,251,251,251,27, - 29,85,13,36,3,28,21,68,16,68,21,29,26,251,251,251,27,26,61,26,68,3,29,21, - 68,17,68,21,29,26,251,251,251,59,26,27,26,53,13,21,29,21,68,13,68,21,29,250, - 250,250,154,27,93,28,29,21,68,9,68,21,253,253,253,253,125,21,68,9,68,13,245,245, - 245,245,117,13,68,8,31,228,228,228,228,228,36,31,8,31,228,228,228,228,228,36,31,7, - 95,228,228,228,228,164,95,7,95,228,228,228,228,164,95,8,31,228,228,228,228,228,36,31, - 8,31,228,228,228,228,228,36,31,9,68,13,245,245,245,245,117,13,68,12,68,21,26,149, - 45,26,253,253,253,93,21,68,13,68,21,13,164,3,28,250,250,250,58,29,21,68,13,68, - 53,164,21,29,26,251,251,251,26,29,21,68,15,68,53,4,35,68,21,29,26,251,251,251, - 26,29,21,68,16,68,21,29,58,3,36,3,29,251,251,251,59,26,29,21,68,16,68,21, - 61,13,68,13,29,26,251,251,251,27,26,29,21,68,16,68,21,29,13,100,21,29,26,251, - 251,251,27,26,29,21,68,20,68,21,29,13,3,36,3,28,251,90,27,60,27,90,251,27, - 26,29,21,68,24,68,21,61,26,21,3,13,29,26,155,26,27,125,27,26,28,93,28,58, - 187,26,29,21,68,26,68,21,29,26,28,29,58,28,123,26,28,29,28,53,45,67,45,21, - 26,61,26,155,26,29,21,68,27,68,21,29,26,27,26,60,91,26,28,29,26,21,3,228, - 36,5,13,21,29,27,26,91,26,29,21,68,21,68,21,29,26,187,26,29,27,21,3,228, - 196,13,28,29,26,59,26,29,21,68,21,68,21,29,26,155,26,29,21,3,228,228,36,13, - 26,29,26,27,26,29,21,68,18,68,21,29,26,123,26,29,21,228,228,132,3,26,29,58, - 29,21,68,18,68,21,29,26,91,26,29,13,228,228,196,3,26,28,26,29,21,68,18,68, - 21,29,26,59,26,29,13,228,228,228,4,13,29,26,29,21,68,19,68,21,29,26,27,26, - 29,21,228,164,35,77,21,13,164,21,61,21,68,20,68,21,29,58,29,21,100,3,109,117, - 90,28,125,13,164,13,28,29,21,68,21,68,21,29,26,28,27,3,100,13,253,29,60,27, - 58,27,26,228,21,29,21,68,19,68,21,29,26,29,13,132,3,28,218,155,26,29,21,228, - 13,29,21,68,19,68,21,29,28,26,196,21,29,26,251,59,26,29,13,228,3,28,21,68, - 17,68,21,61,13,196,21,29,26,251,59,28,26,3,228,4,53,68,20,68,21,29,26,5, - 196,13,29,26,27,28,61,155,26,29,21,228,36,53,68,18,68,21,29,21,228,3,28,61, - 90,28,123,26,29,13,228,36,53,68,21,68,21,29,13,228,4,77,3,4,21,29,26,91, - 28,26,3,228,36,13,21,68,18,68,21,27,3,228,132,13,29,26,91,26,29,21,228,68, - 13,21,68,15,68,53,228,132,13,29,155,26,29,13,228,68,13,21,68,13,68,53,228,132, - 21,29,26,187,3,228,68,53,68,15,68,53,228,100,21,29,26,123,26,29,21,228,100,53, - 68,16,68,21,13,228,68,13,29,26,155,26,29,13,228,100,53,68,18,68,21,13,228,36, - 3,26,28,26,187,28,3,228,68,3,27,21,68,19,68,21,13,228,36,13,61,28,58,59, - 26,29,21,228,100,13,29,21,68,17,68,53,228,68,3,21,26,61,90,29,13,228,100,21, - 29,21,68,18,68,53,228,132,3,13,21,61,27,28,3,228,68,5,26,29,21,68,14,68, - 53,228,228,13,21,29,26,228,100,13,61,21,68,16,68,21,28,3,228,228,4,3,13,228, - 100,26,28,29,21,68,14,68,21,29,13,228,228,228,164,13,29,26,29,21,68,15,68,21, - 29,21,228,228,228,132,3,27,28,26,29,21,68,15,68,21,29,28,13,228,228,228,100,21, - 29,58,29,21,68,16,68,21,61,21,228,228,228,68,21,29,26,27,26,29,21,68,18,68, - 21,29,26,29,13,228,228,228,4,13,29,26,59,26,29,21,68,18,68,21,29,26,28,26, - 3,228,228,196,13,29,26,91,26,29,21,68,18,68,21,29,58,29,26,3,228,228,132,21, - 29,26,123,26,29,21,68,21,68,21,29,26,27,26,29,26,13,228,228,36,3,21,29,26, - 155,26,29,21,68,25,68,21,29,26,59,26,29,28,13,228,196,3,21,27,29,26,27,28, - 29,58,27,26,29,21,68,28,68,21,29,26,91,26,28,29,21,13,5,228,36,3,21,26, - 29,28,26,27,28,58,61,27,26,29,21,68,29,68,21,29,26,155,26,61,26,21,45,67, - 45,53,28,29,28,26,59,26,29,21,4,13,21,29,27,29,21,68,24,68,21,29,26,187, - 58,28,93,28,26,27,125,27,26,123,26,29,13,68,13,26,29,21,68,19,68,21,29,26, - 251,27,90,27,60,27,90,187,28,26,100,13,61,21,68,17,68,21,29,26,251,251,251,26, - 29,21,68,3,29,28,29,21,68,16,68,21,29,26,251,251,251,26,29,13,68,21,58,29, - 21,68,17,68,21,29,26,251,251,251,28,26,3,68,3,4,21,29,21,68,15,68,21,29, - 26,251,251,219,26,29,21,164,13,29,21,68,15,68,21,29,26,251,251,219,26,29,13,164, - 3,27,21,68,12,68,21,29,250,250,250,58,181,58,28,21,68,9,68,21,253,253,253,253, - 125,21,68,9,68,13,245,245,245,245,117,13,68,8,31,228,228,228,228,228,36,31,8,31, - 228,228,228,228,228,36,31,7,95,228,228,228,228,164,95,7,95,228,228,228,228,164,95,8, - 31,228,228,228,228,228,36,31,8,31,228,228,228,228,228,36,31,9,68,13,245,245,245,245, - 117,13,68,11,68,21,93,26,21,253,253,253,221,21,68,16,68,21,29,26,13,36,13,26, - 28,250,250,250,90,29,21,68,18,68,21,29,13,4,35,4,13,29,26,251,251,251,27,26, - 29,21,68,19,68,21,29,13,4,13,3,4,13,29,26,251,251,251,27,26,29,21,68,16, - 68,21,29,21,100,13,29,26,251,251,251,27,26,29,21,68,18,68,21,26,3,4,13,3, - 36,21,29,26,251,251,251,26,29,21,68,16,68,53,36,21,13,36,13,29,26,251,251,251, - 26,29,21,68,18,68,53,164,21,29,26,155,90,27,60,27,90,251,27,26,29,21,68,23, - 68,21,29,21,3,68,13,28,155,26,27,125,27,26,28,93,28,58,187,26,29,21,68,25, - 68,21,61,26,85,29,28,91,26,28,29,28,53,45,67,45,21,26,61,26,155,26,29,21, - 68,27,68,21,29,26,28,93,26,59,26,28,29,26,21,3,228,36,5,13,21,29,27,26, - 91,26,29,21,68,23,68,21,29,26,27,58,91,26,29,27,21,3,228,196,13,28,29,26, - 59,26,29,21,68,21,68,21,29,26,155,26,29,21,3,228,228,36,13,26,29,26,27,26, - 29,21,68,18,68,21,29,26,123,26,29,21,228,228,132,3,26,29,58,29,21,68,18,68, - 21,29,26,91,26,29,13,228,228,196,3,26,28,26,29,21,68,18,68,21,29,26,59,26, - 29,13,228,228,228,4,13,29,26,29,21,68,16,68,21,29,26,27,26,29,21,228,228,228, - 68,21,61,21,68,17,68,21,29,58,29,21,228,36,3,109,228,132,13,28,29,21,68,20, - 68,21,29,26,28,27,3,228,4,21,27,125,26,13,228,100,21,29,21,68,20,68,21,29, - 26,29,13,228,4,21,29,27,122,61,13,228,68,13,29,21,68,24,68,21,29,28,26,228, - 4,21,29,26,27,61,28,27,26,27,29,3,228,36,3,28,21,68,21,68,21,61,13,228, - 4,26,28,26,28,53,26,28,27,26,29,21,228,68,53,68,20,68,21,29,26,5,228,3, - 26,91,3,4,21,29,58,29,21,228,68,53,68,22,68,21,29,21,228,4,3,26,28,27, - 28,53,26,28,27,26,29,21,228,68,53,68,21,68,21,29,13,228,36,21,29,26,27,61, - 28,59,26,29,13,228,68,13,21,68,20,68,21,27,3,228,36,13,29,26,27,58,91,28, - 26,3,228,68,13,21,68,20,68,53,228,36,3,21,28,27,58,27,26,91,28,21,3,228, - 36,13,21,68,19,68,53,228,36,21,29,26,27,61,28,61,59,26,29,21,228,36,53,68, - 21,68,53,228,4,13,29,26,27,29,21,77,21,29,59,26,29,13,228,4,53,68,22,68, - 21,13,228,4,13,29,58,29,21,68,21,29,26,27,26,29,13,228,4,53,68,22,68,21, - 13,228,4,13,29,26,59,29,53,26,29,91,26,29,13,228,3,27,21,68,19,68,21,13, - 228,4,13,29,26,91,93,123,26,29,13,228,13,29,21,68,19,68,53,228,36,21,29,26, - 91,26,123,26,29,21,228,4,21,29,21,68,17,68,53,228,36,3,26,29,250,29,26,3, - 228,5,26,29,21,68,15,68,53,228,68,3,21,253,21,3,228,4,13,61,21,68,16,68, - 21,28,3,228,100,13,181,13,228,68,26,28,29,21,68,14,68,21,29,13,228,228,228,164, - 13,29,26,29,21,68,15,68,21,29,21,228,228,228,132,3,27,28,26,29,21,68,15,68, - 21,29,28,13,228,228,228,100,21,29,58,29,21,68,16,68,21,61,21,228,228,228,68,21, - 29,26,27,26,29,21,68,18,68,21,29,26,29,13,228,228,228,4,13,29,26,59,26,29, - 21,68,18,68,21,29,26,28,26,3,228,228,196,13,29,26,91,26,29,21,68,18,68,21, - 29,58,29,26,3,228,228,132,21,29,26,123,26,29,21,68,21,68,21,29,26,27,26,29, - 26,13,228,228,36,3,21,29,154,27,26,29,21,68,21,68,21,29,26,59,26,29,28,13, - 228,196,3,21,27,29,58,125,58,29,21,68,27,68,21,29,26,91,26,28,29,21,13,5, - 228,36,3,21,26,29,28,26,27,29,117,29,27,29,21,68,26,68,21,29,26,155,26,61, - 26,21,45,67,45,53,28,29,28,26,59,29,13,100,13,27,29,21,68,23,68,21,29,26, - 187,58,28,93,28,26,27,125,27,26,59,26,29,21,164,21,29,21,68,24,68,21,29,26, - 251,27,90,27,60,27,90,123,26,29,21,36,13,21,3,4,13,29,21,68,18,68,21,29, - 26,251,251,251,28,26,3,4,35,4,5,21,29,21,68,15,68,21,29,26,251,251,251,26, - 29,21,100,13,61,21,68,19,68,21,29,26,251,251,251,26,29,13,4,3,13,4,3,26, - 29,21,68,17,68,21,29,26,251,251,251,26,29,21,36,3,4,13,61,21,68,18,68,21, - 29,26,251,251,251,59,28,13,3,4,13,26,28,29,21,68,16,68,21,29,250,250,250,90, - 27,29,58,29,28,26,29,21,68,9,68,21,253,253,253,253,125,21,68,9,68,13,245,245, - 245,245,117,13,68,8,31,228,228,228,228,228,36,31,8,31,228,228,228,228,228,36,31,7, - 95,228,228,228,228,164,95,7,95,228,228,228,228,164,95,8,31,228,228,228,228,228,36,31, - 8,31,228,228,228,228,228,36,31,9,68,13,245,245,245,245,117,13,68,9,68,21,253,253, - 253,253,125,21,68,15,68,21,29,21,13,67,21,28,250,250,250,90,29,21,68,13,68,53, - 164,21,29,26,251,251,251,26,29,21,68,17,68,21,13,36,3,13,36,3,27,28,251,251, - 251,26,29,21,68,16,68,21,13,36,13,21,68,26,29,251,251,251,26,29,21,68,14,68, - 21,13,196,21,29,26,251,251,219,26,29,21,68,17,68,21,26,13,4,5,3,68,26,29, - 251,251,251,26,29,21,68,21,68,21,61,58,13,36,3,26,28,155,90,27,60,27,90,251, - 27,26,29,21,68,26,68,21,29,26,29,26,3,36,3,29,26,91,26,27,125,27,26,28, - 93,28,58,187,26,29,21,68,26,68,21,29,26,27,58,85,29,59,26,28,29,28,53,45, - 67,45,21,26,61,26,155,26,29,21,68,27,68,21,29,26,59,28,93,27,26,28,29,26, - 21,3,228,36,5,13,21,29,27,26,91,26,29,21,68,21,68,21,29,26,123,90,29,27, - 21,3,228,196,13,28,29,26,59,26,29,21,68,21,68,21,29,26,155,26,29,21,3,228, - 228,36,13,26,29,26,27,26,29,21,68,18,68,21,29,26,123,26,29,21,228,228,132,3, - 26,29,58,29,21,68,18,68,21,29,26,91,26,29,13,228,228,196,3,26,28,26,29,21, - 68,18,68,21,29,26,59,26,29,13,228,228,228,4,13,29,26,29,21,68,16,68,21,29, - 26,27,26,29,21,228,228,228,68,21,61,21,68,15,68,21,29,58,29,21,228,228,228,100, - 13,28,29,21,68,18,68,21,29,26,28,27,3,228,3,13,213,13,228,68,21,29,21,68, - 19,68,21,29,26,29,13,196,3,21,27,253,29,21,228,36,13,29,21,68,21,68,21,29, - 28,26,196,3,26,29,27,122,59,90,29,21,228,4,3,28,21,68,17,68,21,61,13,196, - 21,29,26,251,59,26,29,13,228,4,53,68,21,68,21,29,26,5,164,13,29,26,155,28, - 29,28,91,26,29,21,228,4,53,68,18,68,21,29,21,196,13,29,26,123,29,90,29,123, - 28,3,228,53,68,25,68,21,29,13,196,21,29,26,59,26,29,21,3,4,3,26,29,59, - 26,29,13,228,13,21,68,25,68,21,27,3,196,21,29,26,59,26,29,21,3,4,3,26, - 28,59,26,29,13,228,13,21,68,19,68,53,228,13,29,26,123,29,58,27,29,91,26,29, - 21,228,13,21,68,17,68,53,228,3,29,26,155,28,29,28,123,26,29,21,228,53,68,16, - 68,53,228,4,21,29,58,91,58,155,26,29,21,228,53,68,18,68,21,13,228,4,3,21, - 93,28,93,28,123,26,29,13,228,53,68,20,68,21,13,228,68,13,53,58,53,26,29,91, - 26,29,13,196,3,27,21,68,18,68,21,13,228,228,4,3,26,28,91,26,29,13,196,13, - 29,21,68,16,68,53,228,228,4,21,29,26,123,28,3,196,21,29,21,68,16,68,53,228, - 228,3,28,27,122,28,26,196,5,26,29,21,68,16,68,53,228,228,13,27,28,93,28,29, - 21,196,13,61,21,68,17,68,21,28,3,228,228,3,45,85,29,21,196,26,28,29,21,68, - 15,68,21,29,13,228,228,164,35,164,13,29,26,29,21,68,15,68,21,29,21,228,228,228, - 132,3,27,28,26,29,21,68,15,68,21,29,28,13,228,228,228,100,21,29,58,29,21,68, - 16,68,21,61,21,228,228,228,68,21,29,26,27,26,29,21,68,18,68,21,29,26,29,13, - 228,228,228,4,13,29,26,59,26,29,21,68,18,68,21,29,26,28,26,3,228,228,196,13, - 29,26,91,26,29,21,68,18,68,21,29,58,29,26,3,228,228,132,21,29,26,123,26,29, - 21,68,21,68,21,29,26,27,26,29,26,13,228,228,36,3,21,29,58,123,26,29,21,68, - 23,68,21,29,26,59,26,29,28,13,228,196,3,21,27,29,28,93,28,59,26,29,21,68, - 26,68,21,29,26,91,26,28,29,21,13,5,228,36,3,21,26,29,27,29,117,26,59,26, - 29,21,68,27,68,21,29,26,155,26,61,26,21,45,67,45,53,28,29,28,58,29,13,68, - 21,29,27,26,29,21,68,25,68,21,29,26,187,58,28,93,28,26,27,125,27,26,59,26, - 29,13,36,13,53,26,61,21,68,20,68,21,29,26,251,27,90,27,60,27,90,155,28,3, - 132,3,21,29,21,68,15,68,21,29,26,251,251,219,28,26,3,164,3,29,21,68,16,68, - 21,29,26,251,251,251,28,3,36,21,13,68,26,21,68,16,68,21,29,26,251,251,219,26, - 29,13,36,35,68,28,21,68,15,68,21,29,26,251,251,219,26,29,21,164,21,29,21,68, - 15,68,21,29,26,251,251,251,26,29,21,109,21,61,21,68,12,68,21,29,250,250,250,90, - 189,26,29,21,68,9,68,21,253,253,253,253,125,21,68,9,68,13,245,245,245,245,117,13, - 68,8,31,228,228,228,228,228,36,31,8,31,228,228,228,228,228,36,31,7,95,228,228,228, - 228,164,95,7,95,228,228,228,228,164,95,8,31,228,228,228,228,228,36,31,8,31,228,228, - 228,228,228,36,31,10,68,13,85,58,245,245,245,213,13,68,12,68,21,61,26,45,21,253, - 253,253,189,21,68,16,68,21,29,21,4,77,3,26,28,250,250,250,58,29,21,68,15,68, - 53,35,21,61,45,29,26,251,251,251,26,29,21,68,18,68,26,45,26,4,21,29,26,3, - 21,29,251,251,251,26,29,21,68,20,68,26,13,21,29,21,4,21,29,3,21,29,26,251, - 251,219,26,29,21,68,18,68,26,21,13,61,21,3,21,3,26,28,251,251,251,26,29,21, - 68,19,68,21,29,3,13,27,29,13,4,21,29,26,251,251,251,26,29,21,68,22,68,21, - 29,26,13,3,13,3,21,29,219,90,27,60,27,90,251,27,26,29,21,68,23,68,21,29, - 28,29,53,26,29,187,26,27,125,27,26,28,93,28,58,187,26,29,21,68,26,68,21,29, - 26,27,61,28,26,123,26,28,29,28,53,45,67,45,21,26,61,26,155,26,29,21,68,26, - 68,21,29,26,59,26,123,26,28,29,26,21,3,228,36,5,13,21,29,27,26,91,26,29, - 21,68,21,68,21,29,26,187,26,29,27,21,3,228,196,13,28,29,26,59,26,29,21,68, - 21,68,21,29,26,155,26,29,21,3,228,228,36,13,26,29,26,27,26,29,21,68,18,68, - 21,29,26,123,26,29,21,228,228,132,3,26,29,58,29,21,68,18,68,21,29,26,91,26, - 29,13,228,228,196,3,26,28,26,29,21,68,18,68,21,29,26,59,26,29,13,228,228,228, - 4,13,29,26,29,21,68,19,68,21,29,26,27,26,29,21,228,4,3,109,3,228,100,21, - 61,21,68,21,68,21,29,58,29,21,228,13,21,26,125,26,21,13,228,36,13,28,29,21, - 68,20,68,21,29,26,28,27,3,164,13,26,253,61,26,13,228,4,21,29,21,68,25,68, - 21,29,26,29,13,164,21,29,28,27,28,53,45,53,28,29,28,29,21,228,13,29,21,68, - 24,68,21,29,28,26,164,13,29,26,28,26,3,164,13,21,29,26,29,13,196,3,28,21, - 68,20,68,21,61,13,132,13,29,26,29,59,13,228,13,29,26,29,13,196,53,68,21,68, - 21,29,26,5,132,26,29,27,21,27,60,13,228,13,29,28,26,196,53,68,21,68,21,29, - 21,132,13,61,21,4,21,29,28,26,3,228,21,61,13,164,53,68,22,68,21,29,13,132, - 21,29,28,13,36,21,61,21,228,13,28,29,21,164,13,21,68,22,68,21,27,3,100,3, - 26,29,21,100,21,61,21,228,21,29,26,3,132,13,21,68,22,68,53,132,13,28,29,21, - 100,3,26,28,29,21,196,21,29,28,13,132,13,21,68,19,68,53,132,13,61,13,132,13, - 28,27,29,13,164,13,61,13,132,53,68,19,68,53,132,13,61,13,164,13,29,27,28,13, - 132,13,61,13,132,53,68,22,68,21,13,132,13,28,29,21,196,21,29,28,26,3,100,21, - 29,28,13,132,53,68,22,68,21,13,132,3,26,29,21,228,21,61,21,100,21,29,26,3, - 100,3,27,21,68,22,68,21,13,164,21,29,28,13,228,21,61,21,36,13,28,29,21,132, - 13,29,21,68,21,68,53,164,13,61,21,228,3,26,28,29,21,4,21,61,13,132,21,29, - 21,68,21,68,53,196,26,28,29,13,228,13,60,27,21,27,29,26,132,5,26,29,21,68, - 20,68,53,196,13,29,26,29,13,228,13,59,29,26,29,13,132,13,61,21,68,24,68,21, - 28,3,196,13,29,26,29,21,13,164,3,26,28,26,29,13,164,26,28,29,21,68,25,68, - 21,29,13,228,21,29,28,29,28,53,45,53,28,27,28,29,13,164,13,29,26,29,21,68, - 20,68,21,29,21,228,4,13,26,253,61,26,13,164,3,27,28,26,29,21,68,21,68,21, - 29,28,13,228,36,13,21,26,125,26,21,13,228,21,29,58,29,21,68,19,68,21,61,21, - 228,100,3,109,3,228,4,21,29,26,27,26,29,21,68,18,68,21,29,26,29,13,228,228, - 228,4,13,29,26,59,26,29,21,68,18,68,21,29,26,28,26,3,228,228,196,13,29,26, - 91,26,29,21,68,18,68,21,29,58,29,26,3,228,228,132,21,29,26,123,26,29,21,68, - 21,68,21,29,26,27,26,29,26,13,228,228,36,3,21,29,26,155,26,29,21,68,21,68, - 21,29,26,59,26,29,28,13,228,196,3,21,27,29,26,187,26,29,21,68,26,68,21,29, - 26,91,26,28,29,21,13,5,228,36,3,21,26,29,28,26,123,26,59,26,29,21,68,26, - 68,21,29,26,155,26,61,26,21,45,67,45,53,28,29,28,26,123,26,28,61,27,26,29, - 21,68,23,68,21,29,26,187,58,28,93,28,26,27,125,27,26,187,29,26,53,29,28,29, - 21,68,22,68,21,29,26,251,27,90,27,60,27,90,219,29,21,3,13,3,13,26,29,21, - 68,19,68,21,29,26,251,251,251,26,29,21,4,13,29,27,13,3,29,21,68,18,68,21, - 29,26,251,251,251,28,26,3,21,3,21,61,13,21,26,68,20,68,21,29,26,251,251,219, - 26,29,21,3,29,21,4,21,29,21,13,26,68,18,68,21,29,26,251,251,251,29,21,3, - 26,29,21,4,26,45,26,68,15,68,21,29,26,251,251,251,26,29,45,61,21,35,53,68, - 16,68,21,29,250,250,250,58,28,26,3,77,4,21,29,21,68,12,68,21,253,253,253,189, - 21,45,26,61,21,68,10,68,13,245,245,245,213,58,85,13,68,8,31,228,228,228,228,228, - 36,31,8,31,228,228,228,228,228,36,31,7,95,228,228,228,228,164,95,7,95,228,228,228, - 228,164,95,8,31,228,228,228,228,228,36,31,8,31,228,228,228,228,228,36,31,9,68,13, - 245,245,245,245,117,13,68,14,68,21,29,28,26,29,21,28,253,253,253,189,21,68,15,68, - 53,3,4,3,4,13,29,250,250,250,122,29,21,68,17,68,26,13,4,45,4,3,21,29, - 251,251,251,59,26,29,21,68,17,68,26,21,3,29,90,21,29,26,251,251,251,27,26,29, - 21,68,19,68,21,26,13,26,27,28,29,13,21,29,26,251,251,251,26,29,21,68,18,68, - 21,29,53,29,26,29,21,13,29,26,251,251,251,26,29,21,68,18,68,21,29,26,53,13, - 29,13,4,26,28,251,251,251,26,29,21,68,19,68,21,29,27,13,100,3,219,90,27,60, - 27,90,251,27,26,29,21,68,26,68,21,29,27,29,13,21,13,21,26,29,123,26,27,125, - 27,26,28,93,28,58,187,26,29,21,68,26,68,21,29,26,28,26,28,93,91,26,28,29, - 28,53,45,67,45,21,26,61,26,155,26,29,21,68,28,68,21,29,26,27,28,27,58,59, - 26,28,29,26,21,3,228,36,5,13,21,29,27,26,91,26,29,21,68,21,68,21,29,26, - 187,26,29,27,21,3,228,196,13,28,29,26,59,26,29,21,68,22,68,21,29,26,155,26, - 29,21,3,228,3,228,4,13,26,29,26,27,26,29,21,68,20,68,21,29,26,123,26,29, - 21,228,36,21,228,36,3,26,29,58,29,21,68,21,68,21,29,26,91,26,29,13,228,68, - 26,13,228,36,3,26,28,26,29,21,68,24,68,21,29,26,59,26,29,13,36,77,21,77, - 3,36,28,21,228,68,13,29,26,29,21,68,23,68,21,29,26,27,26,29,21,4,13,21, - 221,26,53,26,29,13,228,68,21,61,21,68,22,68,21,29,58,29,21,4,13,61,218,28, - 61,59,28,13,228,36,13,28,29,21,68,26,68,21,29,26,28,27,3,4,26,29,26,59, - 58,59,122,27,26,29,26,3,228,36,21,29,21,68,27,68,21,29,26,29,13,4,13,29, - 26,59,26,93,28,61,28,91,26,29,21,3,228,4,13,29,21,68,28,68,21,29,28,26, - 36,13,29,26,27,26,29,21,45,3,45,26,28,26,28,93,26,13,228,3,28,21,68,20, - 68,21,61,13,36,13,29,58,29,21,132,3,28,61,26,149,3,228,53,68,24,68,21,29, - 26,5,36,13,29,26,27,29,13,100,3,58,21,13,3,36,3,228,68,53,68,18,68,21, - 29,21,68,3,28,26,29,21,132,45,164,45,228,36,53,68,18,68,21,29,13,100,21,28, - 29,21,228,164,26,21,228,4,13,21,68,17,68,21,27,3,100,21,61,21,228,164,13,29, - 13,228,13,21,68,16,68,53,132,3,26,29,21,228,196,21,29,13,196,13,21,68,16,68, - 53,164,21,29,26,3,228,164,13,29,26,3,164,53,68,16,68,53,164,3,26,29,13,228, - 164,3,27,29,21,164,53,68,15,68,21,13,196,13,29,21,228,196,26,60,3,132,53,68, - 17,68,21,13,228,21,29,3,228,164,21,61,21,100,3,27,21,68,17,68,21,13,228,4, - 53,228,164,21,29,28,26,100,13,29,21,68,19,68,53,228,36,21,13,164,45,132,26,29, - 26,29,13,68,21,29,21,68,21,68,53,228,196,3,13,21,28,3,100,13,29,58,29,13, - 36,5,26,29,21,68,21,68,53,228,3,109,53,27,61,13,100,3,21,29,58,29,21,36, - 13,61,21,68,24,68,21,28,3,228,13,157,59,26,109,21,26,29,26,27,26,29,21,36, - 26,28,29,21,68,26,68,21,29,13,228,4,13,26,28,26,91,28,157,28,26,59,26,29, - 13,4,13,29,26,29,21,68,24,68,21,29,21,228,36,3,26,29,26,27,218,91,26,29, - 26,4,3,27,28,26,29,21,68,26,68,21,29,28,13,228,36,3,27,28,26,61,28,27, - 154,28,29,28,13,4,21,29,58,29,21,68,25,68,21,61,21,228,68,13,29,28,53,26, - 28,157,26,21,3,4,21,29,26,27,26,29,21,68,24,68,21,29,26,29,13,228,68,21, - 29,13,4,35,141,3,36,13,29,26,59,26,29,21,68,21,68,21,29,26,28,26,3,228, - 68,26,13,228,36,13,29,26,91,26,29,21,68,20,68,21,29,58,29,26,3,228,36,45, - 228,4,21,29,26,123,26,29,21,68,22,68,21,29,26,27,26,29,26,13,228,36,3,196, - 3,21,29,26,155,26,29,21,68,21,68,21,29,26,59,26,29,28,13,228,196,3,21,27, - 29,26,187,26,29,21,68,28,68,21,29,26,91,26,28,29,21,13,5,228,36,3,21,26, - 29,28,26,27,26,28,29,60,58,29,21,68,27,68,21,29,26,155,26,61,26,21,45,67, - 45,53,28,29,28,26,59,28,29,58,53,29,26,29,21,68,26,68,21,29,26,187,58,28, - 93,28,26,27,125,27,26,91,26,29,13,36,3,4,21,28,29,21,68,24,68,21,29,26, - 251,27,90,27,60,27,90,155,28,26,4,3,21,13,3,13,26,29,21,68,17,68,21,29, - 26,251,251,251,60,3,21,29,21,29,53,29,21,68,18,68,21,29,26,251,251,251,26,29, - 45,29,27,29,26,13,29,21,68,17,68,21,29,26,251,251,251,27,28,26,21,61,26,29, - 13,53,68,18,68,21,29,26,251,251,251,27,26,29,21,45,21,26,4,13,26,68,14,68, - 21,29,26,251,251,251,59,28,26,3,100,53,68,16,68,21,29,250,250,250,122,29,21,13, - 21,13,21,29,21,68,9,68,21,253,253,253,253,125,21,68,9,68,13,245,245,245,245,117, - 13,68,8,31,228,228,228,228,228,36,31,8,31,228,228,228,228,228,36,31,7,95,228,228, - 228,228,164,95,7,95,228,228,228,228,164,95,8,31,228,228,228,228,228,36,31,8,31,228, - 228,228,228,228,36,31,9,68,13,245,245,245,245,117,13,68,9,68,21,253,253,253,253,125, - 21,68,19,68,21,29,27,29,27,29,21,13,21,26,28,250,250,250,26,29,21,68,19,68, - 21,29,26,21,26,29,13,36,3,26,28,251,251,219,26,29,21,68,20,68,21,29,21,4, - 21,29,21,13,36,21,29,26,251,251,187,26,29,21,68,17,68,53,68,45,3,4,3,21, - 29,26,251,251,187,26,29,21,68,18,68,53,3,4,3,13,36,13,21,26,28,251,251,219, - 26,29,21,68,17,68,21,29,21,3,53,100,21,29,26,251,251,187,26,29,21,68,24,68, - 21,29,58,29,21,45,3,4,21,29,26,91,90,27,60,27,90,251,27,26,29,21,68,25, - 68,21,29,26,28,27,93,27,58,28,59,26,27,125,27,26,28,93,28,58,187,26,29,21, - 68,26,68,21,29,26,91,26,27,92,27,26,28,29,28,53,45,67,45,21,26,61,26,155, - 26,29,21,68,24,68,21,29,26,219,26,28,29,26,21,3,228,36,5,13,21,29,27,26, - 91,26,29,21,68,21,68,21,29,26,187,26,29,27,21,3,228,196,13,28,29,26,59,26, - 29,21,68,21,68,21,29,26,155,26,29,21,3,228,228,36,13,26,29,26,27,26,29,21, - 68,18,68,21,29,26,123,26,29,21,228,228,132,3,26,29,58,29,21,68,18,68,21,29, - 26,91,26,29,13,228,228,196,3,26,28,26,29,21,68,18,68,21,29,26,59,26,29,13, - 228,228,228,4,13,29,26,29,21,68,16,68,21,29,26,27,26,29,21,228,228,228,68,21, - 61,21,68,19,68,21,29,58,29,21,228,132,13,21,45,3,228,36,13,28,29,21,68,24, - 68,21,29,26,28,27,3,228,3,13,21,26,3,21,93,26,53,13,3,196,21,29,21,68, - 25,68,21,29,26,29,13,196,13,21,26,93,21,26,27,58,27,93,27,53,13,100,13,29, - 21,68,25,68,21,29,28,26,132,3,13,21,61,27,90,60,26,27,125,28,26,61,26,100, - 3,28,21,68,26,68,21,61,13,68,13,21,26,61,26,157,28,26,29,28,53,13,21,26, - 29,26,29,21,132,53,68,26,68,21,29,26,5,68,26,29,27,58,29,21,77,21,26,29, - 21,3,100,3,21,61,21,132,53,68,22,68,21,29,21,100,21,29,26,27,29,13,132,3, - 26,3,196,21,29,13,132,53,68,21,68,21,29,13,100,13,29,26,29,21,196,13,21,196, - 3,29,3,132,13,21,68,18,68,21,27,3,132,26,29,21,228,4,13,3,196,21,164,13, - 21,68,15,68,53,164,21,29,13,228,4,45,196,13,164,13,21,68,16,68,53,164,13,29, - 13,228,4,3,21,164,5,13,164,53,68,16,68,53,196,21,13,228,4,3,26,3,132,3, - 13,164,53,68,16,68,21,13,196,45,228,4,3,29,13,132,21,3,164,53,68,19,68,21, - 13,196,3,13,228,4,13,29,21,100,13,21,164,3,27,21,68,20,68,21,13,228,13,228, - 4,26,28,29,13,36,13,29,21,164,13,29,21,68,20,68,53,228,45,196,21,29,26,29, - 21,3,21,27,29,13,164,21,29,21,68,23,68,53,228,4,21,13,132,21,29,26,27,28, - 58,29,28,26,3,132,5,26,29,21,68,22,68,53,228,4,13,29,21,45,21,26,29,122, - 27,28,26,29,21,164,13,61,21,68,21,68,21,28,3,228,3,26,125,28,26,157,28,26, - 29,21,164,26,28,29,21,68,25,68,21,29,13,228,4,21,29,58,28,29,28,21,45,53, - 26,61,13,132,13,29,26,29,21,68,22,68,21,29,21,228,4,13,93,26,21,3,132,3, - 45,132,3,27,28,26,29,21,68,17,68,21,29,28,13,228,4,53,13,228,228,21,29,58, - 29,21,68,16,68,21,61,21,228,228,228,68,21,29,26,27,26,29,21,68,18,68,21,29, - 26,29,13,228,228,228,4,13,29,26,59,26,29,21,68,18,68,21,29,26,28,26,3,228, - 228,196,13,29,26,91,26,29,21,68,18,68,21,29,58,29,26,3,228,228,132,21,29,26, - 123,26,29,21,68,21,68,21,29,26,27,26,29,26,13,228,228,36,3,21,29,26,155,26, - 29,21,68,21,68,21,29,26,59,26,29,28,13,228,196,3,21,27,29,26,187,26,29,21, - 68,26,68,21,29,26,91,26,28,29,21,13,5,228,36,3,21,26,29,59,28,27,90,59, - 26,29,21,68,26,68,21,29,26,155,26,61,26,21,45,67,45,53,28,29,28,26,28,58, - 28,93,59,26,29,21,68,27,68,21,29,26,187,58,28,93,28,26,27,125,27,26,27,26, - 29,21,35,45,21,29,28,26,29,21,68,22,68,21,29,26,251,27,90,27,60,27,90,91, - 26,29,21,100,53,3,21,29,21,68,18,68,21,29,26,251,251,219,28,26,21,13,36,13, - 3,4,3,53,68,18,68,21,29,26,251,251,187,26,29,21,3,4,3,45,68,21,26,68, - 20,68,21,29,26,251,251,187,26,29,21,36,13,21,29,13,4,21,29,21,68,19,68,21, - 29,26,251,251,219,29,26,3,36,13,29,26,21,26,29,21,68,19,68,21,29,26,251,251, - 251,29,26,21,13,21,29,28,29,27,29,21,68,14,68,21,29,250,250,250,58,27,61,28, - 122,29,21,68,9,68,21,253,253,253,253,125,21,68,9,68,13,245,245,245,245,117,13,68, - 8,31,228,228,228,228,228,36,31,8,31,228,228,228,228,228,36,31,7,95,228,228,228,228, - 164,95,7,95,228,228,228,228,164,95,8,31,228,228,228,228,228,36,31,8,31,228,228,228, - 228,228,36,31,9,68,13,230,230,230,230,102,13,68,10,68,7,108,39,236,236,236,172,7, - 68,19,68,6,12,7,6,3,36,3,6,12,11,9,235,235,203,9,12,6,68,14,68,6, - 12,3,164,3,12,235,235,235,11,12,6,68,17,68,7,13,36,3,6,3,68,6,12,9, - 235,235,203,12,6,68,17,68,6,3,4,3,7,44,3,36,3,12,235,235,235,12,6,68, - 17,68,6,3,4,3,7,44,3,36,3,12,235,235,235,12,6,68,17,68,7,3,36,3, - 6,3,68,13,12,9,235,235,203,12,6,68,15,68,7,6,228,7,12,139,41,139,41,235, - 43,12,6,68,23,68,6,12,6,3,100,3,6,12,9,43,9,11,108,11,9,11,108,9, - 235,12,6,68,22,68,6,44,7,102,11,12,43,9,44,11,38,163,13,6,7,44,9,171, - 12,6,68,21,68,6,12,9,11,108,107,12,7,6,3,228,36,3,13,7,12,171,12,6, - 68,20,68,6,12,43,105,11,9,12,11,6,3,228,196,6,44,9,75,12,6,68,19,68, - 6,12,171,9,12,6,3,228,228,36,3,7,12,9,43,12,6,68,16,68,6,12,171,12, - 6,228,228,132,3,7,12,43,12,6,68,15,68,6,12,139,12,6,228,228,196,3,43,9, - 12,6,68,17,68,6,12,75,9,12,6,228,228,228,4,13,12,9,12,6,68,15,68,6, - 12,43,9,12,6,228,228,228,68,6,44,6,68,16,68,6,12,11,9,12,6,228,68,99, - 228,132,3,44,6,68,22,68,6,12,9,43,3,228,13,6,7,11,44,11,7,6,13,228, - 68,6,12,6,68,20,68,6,12,9,12,6,196,3,7,76,107,76,7,3,228,4,13,12, - 6,68,17,68,6,44,7,196,6,44,41,171,41,44,6,228,3,12,6,68,19,68,6,44, - 13,164,6,12,9,75,9,43,9,139,9,12,6,228,39,68,20,68,6,12,7,3,132,3, - 12,9,107,140,9,107,9,12,3,196,6,7,68,21,68,6,12,6,164,7,12,75,44,6, - 35,13,6,12,139,12,7,196,6,7,68,22,68,6,12,3,132,3,12,9,107,3,132,6, - 12,9,75,9,12,3,164,6,7,68,23,68,6,11,3,132,6,12,9,11,9,12,6,196, - 7,12,75,9,12,6,164,6,7,68,22,68,39,164,6,12,9,11,9,12,3,196,6,12, - 9,43,9,12,6,164,6,7,68,22,68,7,6,164,6,12,9,11,9,12,6,196,7,12, - 75,9,12,6,164,6,7,68,22,68,7,6,164,6,12,9,75,7,3,132,6,12,9,75, - 9,12,6,164,6,7,68,21,68,7,6,164,3,12,9,75,12,7,6,67,6,12,139,9, - 12,3,164,39,68,18,68,7,6,196,7,12,107,76,11,44,171,12,7,164,3,11,6,68, - 20,68,7,6,196,3,12,9,107,9,75,9,139,9,12,3,164,3,12,6,68,17,68,7, - 6,228,6,12,9,235,107,9,12,6,196,6,12,6,68,18,68,7,6,228,4,6,44,9, - 235,9,44,6,196,3,7,12,6,68,16,68,39,228,36,13,7,76,107,76,7,13,228,13, - 44,6,68,19,68,6,12,3,228,68,13,6,7,108,7,6,13,228,36,7,44,6,68,15, - 68,6,12,13,228,132,163,228,68,6,12,9,12,6,68,14,68,6,12,6,228,228,228,132, - 3,43,9,12,6,68,15,68,6,44,3,228,228,228,100,6,12,9,11,12,6,68,15,68, - 6,44,6,228,228,228,68,6,12,9,43,12,6,68,17,68,6,12,9,12,13,228,228,228, - 4,6,12,9,75,12,6,68,15,68,6,12,9,43,3,228,228,196,6,12,139,12,6,68, - 16,68,6,12,43,12,7,3,228,228,132,6,12,171,12,6,68,19,68,6,12,43,9,12, - 7,3,228,228,36,3,6,12,137,43,12,6,68,19,68,6,12,75,9,44,6,228,196,3, - 6,11,12,7,172,9,12,6,68,25,68,6,12,171,12,7,13,3,228,36,3,6,7,12, - 11,9,12,7,6,45,6,7,44,6,68,22,68,6,12,171,9,44,7,6,13,163,38,11, - 44,41,12,6,3,132,6,12,6,68,19,68,6,12,235,9,108,11,9,11,108,11,9,43, - 12,6,228,6,7,68,20,68,6,12,235,43,41,139,41,107,9,12,3,68,13,6,3,36, - 3,6,68,16,68,6,12,235,235,235,12,3,36,3,76,3,4,3,6,68,18,68,6,12, - 235,235,235,12,3,36,3,11,12,7,3,4,3,6,68,17,68,6,12,235,235,203,9,12, - 6,68,3,13,3,36,6,7,68,14,68,6,12,235,235,235,11,12,13,164,3,12,6,68, - 14,68,6,12,235,235,235,43,12,6,99,6,44,6,68,16,68,6,12,9,235,235,235,41, - 44,9,7,44,9,12,6,68,9,68,7,236,236,236,236,108,7,68,9,68,13,230,230,230, - 230,102,13,68,8,31,228,228,228,228,228,36,31,8,31,228,228,228,228,228,36,31,7,95, - 228,228,228,228,164,95,7,95,228,228,228,228,164,95,8,31,228,228,228,228,228,36,31,8, - 31,228,228,228,228,228,36,31,10,68,13,102,39,230,230,230,166,13,68,11,68,7,76,7, - 38,236,236,236,172,7,68,17,68,6,12,6,3,68,7,12,9,235,235,235,11,9,12,6, - 68,14,68,6,12,13,100,6,12,235,235,235,75,12,6,68,15,68,6,12,6,100,6,12, - 9,235,235,235,43,12,6,68,17,68,6,12,7,6,3,36,6,12,9,235,235,235,43,12, - 6,68,15,68,6,44,7,68,6,12,9,235,235,235,43,12,6,68,15,68,6,44,6,68, - 13,12,9,235,235,235,43,12,6,68,16,68,6,44,6,68,3,12,235,41,139,41,235,43, - 12,6,68,19,68,6,44,6,68,3,171,9,11,108,11,9,11,108,9,235,12,6,68,22, - 68,6,12,11,7,102,9,75,9,44,11,38,163,13,6,7,44,9,171,12,6,68,22,68, - 6,12,9,140,43,9,11,12,7,6,3,228,36,3,13,7,12,171,12,6,68,20,68,6, - 12,43,105,11,9,12,11,6,3,228,196,6,44,9,75,12,6,68,19,68,6,12,171,9, - 12,6,3,228,228,36,3,7,12,9,43,12,6,68,16,68,6,12,171,12,6,228,228,132, - 3,7,12,43,12,6,68,15,68,6,12,139,12,6,228,228,196,3,43,9,12,6,68,17, - 68,6,12,75,9,12,6,228,228,228,4,13,12,9,12,6,68,18,68,6,12,43,9,12, - 6,228,132,3,13,6,228,68,6,44,6,68,21,68,6,12,11,9,12,6,228,68,3,13, - 6,7,12,7,228,68,3,44,6,68,20,68,6,12,9,43,3,228,3,38,9,76,11,7, - 3,228,68,6,12,6,68,21,68,6,12,9,12,6,196,3,6,76,11,41,43,12,3,228, - 68,13,12,6,68,18,68,6,44,7,228,4,7,12,9,171,12,3,228,68,3,12,6,68, - 17,68,6,44,13,228,4,6,12,9,139,9,12,13,228,100,39,68,19,68,6,12,7,3, - 228,4,13,12,9,139,9,12,6,228,100,6,7,68,17,68,6,12,6,228,36,3,76,107, - 9,12,6,228,100,6,7,68,19,68,6,12,3,228,68,7,6,13,7,75,9,12,6,228, - 100,6,7,68,18,68,6,11,3,228,68,3,4,3,12,107,12,7,228,100,6,7,68,15, - 68,39,228,164,3,12,9,75,12,7,228,100,6,7,68,15,68,7,6,228,164,13,12,9, - 139,3,228,68,6,7,68,16,68,7,6,228,164,6,12,9,107,12,3,228,68,6,7,68, - 16,68,7,6,228,164,6,12,9,75,9,12,3,228,68,39,68,17,68,7,6,228,164,6, - 12,107,9,12,6,228,36,3,11,6,68,17,68,7,6,228,164,7,12,107,9,12,6,228, - 36,3,12,6,68,18,68,7,6,228,132,3,7,12,107,9,12,6,228,36,6,12,6,68, - 19,68,7,6,228,132,3,11,9,107,9,12,6,228,4,3,7,12,6,68,13,68,39,228, - 132,3,236,7,228,4,13,44,6,68,17,68,6,12,3,228,100,3,70,103,9,7,3,228, - 7,44,6,68,15,68,6,12,13,228,228,68,67,228,6,12,9,12,6,68,14,68,6,12, - 6,228,228,228,132,3,43,9,12,6,68,15,68,6,44,3,228,228,228,100,6,12,9,11, - 12,6,68,15,68,6,44,6,228,228,228,68,6,12,9,43,12,6,68,17,68,6,12,9, - 12,13,228,228,228,4,6,12,9,75,12,6,68,15,68,6,12,9,43,3,228,228,196,6, - 12,139,12,6,68,16,68,6,12,43,12,7,3,228,228,132,6,12,171,12,6,68,19,68, - 6,12,43,9,12,7,3,228,228,36,3,6,12,105,75,12,6,68,19,68,6,12,75,9, - 44,6,228,196,3,6,11,12,9,140,43,12,6,68,23,68,6,12,171,12,7,13,3,228, - 36,3,6,7,12,11,9,12,134,12,9,12,6,68,25,68,6,12,171,9,44,7,6,13, - 163,38,11,44,9,11,9,12,3,68,13,12,9,12,6,68,23,68,6,12,235,9,108,11, - 9,11,108,11,9,75,9,12,6,68,6,12,9,12,6,68,19,68,6,12,235,43,41,139, - 41,171,9,12,6,68,6,12,9,12,6,68,17,68,6,12,235,235,235,11,9,12,6,68, - 6,12,9,12,6,68,15,68,6,12,235,235,235,43,12,6,68,6,7,44,6,68,14,68, - 6,12,235,235,235,43,12,7,100,6,44,6,68,14,68,6,12,235,235,235,75,7,3,68, - 3,44,6,68,17,68,6,12,235,235,235,75,12,3,4,3,13,6,11,12,6,68,17,68, - 6,12,9,235,235,235,11,9,12,38,7,44,9,12,6,68,9,68,7,236,236,236,236,108, - 7,68,9,68,13,230,230,230,230,102,13,68,8,31,228,228,228,228,228,36,31,8,31,228, - 228,228,228,228,36,31,7,95,228,228,228,228,164,95,7,95,228,228,228,228,164,95,8,31, - 228,228,228,228,228,36,31,8,31,228,228,228,228,228,36,31,10,68,13,102,39,230,230,230, - 166,13,68,13,68,6,12,7,67,6,9,236,236,236,140,7,68,16,68,6,12,6,100,3, - 6,12,9,235,235,235,9,12,6,68,15,68,6,12,6,35,68,3,12,235,235,235,43,12, - 6,68,16,68,6,12,7,38,3,36,3,12,235,235,235,43,12,6,68,15,68,6,12,3, - 132,13,12,9,235,235,235,11,12,6,68,14,68,7,6,68,35,6,9,235,235,235,75,12, - 6,68,14,68,7,6,68,13,70,12,235,235,235,43,12,6,68,16,68,7,13,164,6,12, - 9,171,41,139,41,235,43,12,6,68,20,68,7,3,164,3,12,9,75,9,11,108,11,9, - 11,108,9,235,12,6,68,21,68,38,13,99,4,3,75,9,44,11,38,163,13,6,7,44, - 9,171,12,6,68,22,68,6,108,11,39,6,9,43,12,7,6,3,228,36,3,13,7,12, - 171,12,6,68,20,68,6,12,41,43,76,9,12,11,6,3,228,196,6,44,9,75,12,6, - 68,19,68,6,12,171,9,12,6,3,228,228,36,3,7,12,9,43,12,6,68,16,68,6, - 12,171,12,6,228,228,132,3,7,12,43,12,6,68,15,68,6,12,139,12,6,228,228,196, - 3,43,9,12,6,68,19,68,6,12,75,9,12,6,164,3,13,35,228,196,13,12,9,12, - 6,68,20,68,6,12,43,9,12,6,196,6,44,9,7,38,3,228,100,6,44,6,68,21, - 68,6,12,11,9,12,6,228,7,12,9,11,108,6,13,228,36,3,44,6,68,21,68,6, - 12,9,43,3,196,3,9,107,41,11,44,6,3,228,4,6,12,6,68,19,68,6,12,9, - 12,6,228,3,12,235,9,12,7,228,4,13,12,6,68,20,68,6,44,7,228,4,13,12, - 9,11,41,139,9,12,6,228,3,12,6,68,17,68,6,44,13,228,4,6,12,11,108,139, - 12,6,228,4,39,68,19,68,6,12,7,3,228,4,131,6,7,12,107,12,7,228,4,6, - 7,68,17,68,6,12,6,228,196,3,7,12,107,12,7,228,4,6,7,68,18,68,6,12, - 3,228,36,3,70,7,44,139,12,6,228,4,6,7,68,17,68,6,11,3,228,4,13,140, - 171,7,12,6,228,4,6,7,68,19,68,39,228,4,3,7,12,9,139,9,43,44,7,3, - 228,4,6,7,68,18,68,7,6,228,4,13,12,9,139,76,39,6,3,228,36,6,7,68, - 18,68,7,6,228,4,6,12,9,107,12,7,6,35,228,132,6,7,68,16,68,7,6,228, - 4,7,12,139,9,3,36,99,228,36,39,68,18,68,7,6,228,3,203,9,6,39,9,44, - 7,228,4,3,11,6,68,16,68,7,6,228,3,12,203,76,75,7,3,228,3,12,6,68, - 15,68,7,6,228,3,12,235,139,12,3,228,6,12,6,68,18,68,7,6,228,3,12,9, - 235,75,9,12,6,196,3,7,12,6,68,15,68,39,228,13,12,137,203,9,12,6,196,13, - 44,6,68,16,68,6,12,3,196,13,236,75,73,12,7,196,7,44,6,68,18,68,6,12, - 13,228,35,13,102,39,204,3,132,6,12,9,12,6,68,17,68,6,12,6,228,228,67,13, - 102,3,100,3,43,9,12,6,68,15,68,6,44,3,228,228,228,100,6,12,9,11,12,6, - 68,15,68,6,44,6,228,228,228,68,6,12,9,43,12,6,68,17,68,6,12,9,12,13, - 228,228,228,4,6,12,9,75,12,6,68,15,68,6,12,9,43,3,228,228,196,6,12,139, - 12,6,68,17,68,6,12,43,12,7,3,228,228,132,6,12,9,139,12,6,68,19,68,6, - 12,43,9,12,7,3,228,228,36,3,6,108,75,9,12,6,68,19,68,6,12,75,9,44, - 6,228,196,3,6,11,12,38,39,9,108,6,68,23,68,6,12,171,12,7,13,3,228,36, - 3,6,7,12,11,12,3,68,67,13,12,6,68,20,68,6,12,171,9,44,7,6,13,163, - 38,11,44,41,12,6,196,11,6,68,20,68,6,12,235,9,108,11,9,11,108,11,9,75, - 12,6,164,3,12,6,68,16,68,6,12,235,43,41,139,41,203,7,70,68,3,12,6,68, - 15,68,6,12,235,235,235,43,9,6,35,68,6,12,6,68,15,68,6,12,235,235,235,9, - 12,6,100,35,7,12,6,68,16,68,6,12,235,235,235,9,12,13,68,38,7,11,12,6, - 68,14,68,6,12,235,235,235,9,12,6,132,13,44,6,68,14,68,6,12,235,235,235,43, - 9,3,100,6,44,6,68,16,68,6,12,9,235,235,235,9,11,12,38,35,6,44,6,68, - 9,68,7,236,236,236,236,108,7,68,9,68,13,230,230,230,230,102,13,68,8,31,228,228, - 228,228,228,36,31,8,31,228,228,228,228,228,36,31,7,95,228,228,228,228,164,95,7,95, - 228,228,228,228,164,95,8,31,228,228,228,228,228,36,31,8,31,228,228,228,228,228,36,31, - 10,68,13,38,39,230,230,230,230,13,68,13,68,6,12,7,38,7,9,236,236,236,172,7, - 68,16,68,6,12,13,68,3,6,43,9,235,235,235,9,12,6,68,15,68,6,12,3,132, - 6,12,9,235,235,235,11,12,6,68,16,68,6,12,70,3,36,6,12,9,235,235,235,11, - 12,6,68,14,68,6,44,6,100,6,12,235,235,235,43,12,6,68,14,68,6,44,7,100, - 6,12,235,235,235,43,12,6,68,16,68,6,7,38,35,36,6,12,9,235,235,235,11,12, - 6,68,16,68,6,7,164,6,12,9,171,41,139,41,235,43,12,6,68,19,68,6,12,3, - 100,13,171,9,11,108,11,9,11,108,9,235,12,6,68,21,68,6,12,67,38,12,107,9, - 44,11,38,163,13,6,7,44,9,171,12,6,68,23,68,6,12,7,11,76,75,9,11,12, - 7,6,3,228,36,3,13,7,12,171,12,6,68,20,68,6,12,43,41,75,9,12,11,6, - 3,228,196,6,44,9,75,12,6,68,20,68,6,12,9,139,9,12,6,3,228,228,36,3, - 7,12,9,43,12,6,68,16,68,6,12,171,12,6,228,228,132,3,7,12,43,12,6,68, - 15,68,6,12,139,12,6,228,228,196,3,43,9,12,6,68,17,68,6,12,75,9,12,6, - 228,228,228,4,13,12,9,12,6,68,15,68,6,12,43,9,12,6,228,228,228,68,6,44, - 6,68,18,68,6,12,11,9,12,6,196,3,166,13,3,228,100,3,44,6,68,17,68,6, - 12,9,43,3,196,6,236,7,6,228,68,6,12,6,68,20,68,6,12,9,12,6,228,6, - 12,169,11,44,6,3,228,4,13,12,6,68,20,68,6,44,7,228,3,7,12,75,9,107, - 7,12,6,228,4,3,12,6,68,17,68,6,44,13,228,3,11,9,11,108,107,12,7,228, - 36,39,68,21,68,6,12,7,3,228,3,44,9,7,38,7,12,107,9,3,228,4,6,7, - 68,21,68,6,12,6,228,4,3,6,35,36,3,6,12,107,12,3,228,4,6,7,68,16, - 68,6,12,3,228,100,3,39,44,171,3,228,4,6,7,68,17,68,6,11,3,228,100,3, - 12,171,9,12,6,228,36,6,7,68,15,68,39,228,132,3,7,171,12,7,3,228,36,6, - 7,68,15,68,7,6,228,164,6,12,9,171,6,228,36,6,7,68,15,68,7,6,228,164, - 6,12,171,44,3,228,4,6,7,68,15,68,7,6,228,164,67,6,12,107,12,3,228,4, - 39,68,17,68,7,6,228,4,3,166,7,9,139,12,3,228,3,11,6,68,15,68,7,6, - 228,4,3,11,172,203,3,228,3,12,6,68,18,68,7,6,228,36,6,12,9,235,9,12, - 6,228,4,6,12,6,68,19,68,7,6,228,36,6,12,9,171,41,12,9,3,228,3,7, - 12,6,68,19,68,39,228,36,6,12,9,75,41,11,44,6,3,228,4,13,44,6,68,20, - 68,6,12,3,228,4,13,12,9,11,108,7,6,3,228,68,7,44,6,68,20,68,6,12, - 13,228,4,3,44,9,7,38,35,228,100,6,12,9,12,6,68,15,68,6,12,6,228,36, - 67,228,228,3,43,9,12,6,68,15,68,6,44,3,228,228,228,100,6,12,9,11,12,6, - 68,15,68,6,44,6,228,228,228,68,6,12,9,43,12,6,68,17,68,6,12,9,12,13, - 228,228,228,4,6,12,9,75,12,6,68,15,68,6,12,9,43,3,228,228,196,6,12,139, - 12,6,68,16,68,6,12,43,12,7,3,228,228,132,6,12,171,12,6,68,21,68,6,12, - 43,9,12,7,3,228,228,36,3,6,12,73,11,44,11,12,6,68,21,68,6,12,75,9, - 44,6,228,196,3,6,11,12,9,11,76,39,11,12,6,68,24,68,6,12,171,12,7,13, - 3,228,36,3,6,7,12,11,9,11,12,38,67,7,12,6,68,22,68,6,12,171,9,44, - 7,6,13,163,38,11,44,9,43,12,13,132,6,12,6,68,20,68,6,12,235,9,108,11, - 9,11,108,11,9,75,12,6,164,6,12,6,68,19,68,6,12,235,43,41,139,41,139,9, - 12,6,68,3,38,7,12,6,68,17,68,6,12,235,235,235,11,12,7,3,68,6,12,11, - 12,6,68,18,68,6,12,235,235,235,11,12,7,3,36,3,6,12,7,12,6,68,16,68, - 6,12,235,235,235,11,12,6,68,45,3,7,12,6,68,15,68,6,12,235,235,235,11,12, - 7,132,3,9,12,6,68,15,68,6,12,235,235,235,43,12,6,35,36,3,44,6,68,17, - 68,6,12,9,235,235,235,11,9,44,39,6,7,11,12,6,68,9,68,7,236,236,236,236, - 108,7,68,9,68,13,230,230,230,230,102,13,68,8,31,228,228,228,228,228,36,31,8,31, - 228,228,228,228,228,36,31,7,95,228,228,228,228,164,95,7,95,228,228,228,228,164,95,8, - 31,228,228,228,228,228,36,31,8,31,228,228,228,228,228,36,31,10,68,13,70,7,230,230, - 230,230,13,68,12,68,7,44,7,67,6,236,236,236,140,7,68,16,68,6,44,13,68,13, - 12,9,235,235,235,11,9,12,6,68,15,68,6,12,7,100,6,12,9,235,235,235,43,12, - 6,68,16,68,6,12,13,4,35,4,6,12,235,235,235,75,12,6,68,15,68,39,36,3, - 36,3,38,12,235,235,235,11,12,6,68,13,68,7,3,196,6,12,235,235,235,11,12,6, - 68,13,68,38,35,132,7,12,235,235,235,11,12,6,68,16,68,6,76,3,36,3,6,235, - 41,139,41,235,43,12,6,68,22,68,6,12,11,7,68,3,12,9,107,9,11,108,11,9, - 11,108,9,235,12,6,68,21,68,6,44,7,3,70,107,9,44,11,38,163,13,6,7,44, - 9,171,12,6,68,22,68,6,12,43,108,43,9,11,12,7,6,3,228,36,3,13,7,12, - 171,12,6,68,20,68,6,12,43,73,43,9,12,11,6,3,228,196,6,44,9,75,12,6, - 68,19,68,6,12,171,9,12,6,3,228,228,36,3,7,12,9,43,12,6,68,16,68,6, - 12,171,12,6,228,228,132,3,7,12,43,12,6,68,15,68,6,12,139,12,6,228,228,196, - 3,43,9,12,6,68,17,68,6,12,75,9,12,6,228,228,228,4,13,12,9,12,6,68, - 19,68,6,12,43,9,12,6,228,4,3,134,39,3,228,4,6,44,6,68,18,68,6,12, - 11,9,12,6,228,36,7,204,3,228,4,3,44,6,68,22,68,6,12,9,43,3,228,4, - 13,12,7,41,43,9,12,3,228,36,6,12,6,68,19,68,6,12,9,12,6,228,36,7, - 12,171,12,3,228,36,13,12,6,68,18,68,6,44,7,228,36,13,12,9,171,12,3,228, - 36,3,12,6,68,17,68,6,44,13,228,36,7,12,11,44,107,12,3,228,68,39,68,22, - 68,6,12,7,3,228,4,6,12,9,12,7,6,12,75,12,3,228,68,6,7,68,21,68, - 6,12,6,228,36,7,12,9,12,45,12,9,43,12,3,228,68,6,7,68,22,68,6,12, - 3,228,4,6,12,9,43,3,6,12,9,43,12,3,228,68,6,7,68,16,68,6,11,3, - 228,3,7,12,75,7,171,102,228,6,7,68,16,68,39,228,4,6,12,9,75,12,171,76, - 9,228,6,7,68,15,68,7,6,228,3,7,235,107,41,12,6,228,6,7,68,16,68,7, - 6,228,6,12,43,73,235,9,12,6,228,6,7,68,14,68,7,6,228,6,39,140,203,9, - 12,13,228,39,68,18,68,7,6,228,36,67,13,6,7,12,139,76,3,196,3,11,6,68, - 16,68,7,6,228,196,7,12,107,12,70,3,196,3,12,6,68,16,68,7,6,228,164,3, - 139,9,12,3,228,36,6,12,6,68,18,68,7,6,228,164,3,12,107,9,12,13,228,4, - 3,7,12,6,68,17,68,39,228,164,6,12,7,9,75,12,6,228,4,13,44,6,68,16, - 68,6,12,3,228,132,6,140,39,13,228,4,7,44,6,68,17,68,6,12,13,228,132,70, - 13,67,228,36,6,12,9,12,6,68,14,68,6,12,6,228,228,228,132,3,43,9,12,6, - 68,15,68,6,44,3,228,228,228,100,6,12,9,11,12,6,68,15,68,6,44,6,228,228, - 228,68,6,12,9,43,12,6,68,17,68,6,12,9,12,13,228,228,228,4,6,12,9,75, - 12,6,68,15,68,6,12,9,43,3,228,228,196,6,12,139,12,6,68,16,68,6,12,43, - 12,7,3,228,228,132,6,12,171,12,6,68,19,68,6,12,43,9,12,7,3,228,228,36, - 3,6,12,73,107,12,6,68,19,68,6,12,75,9,44,6,228,196,3,6,11,12,9,108, - 75,12,6,68,26,68,6,12,171,12,7,13,3,228,36,3,6,7,12,11,9,12,38,13, - 3,6,12,9,12,6,68,25,68,6,12,171,9,44,7,6,13,163,38,11,44,9,11,9, - 12,6,68,6,12,7,12,6,68,21,68,6,12,235,9,108,11,9,11,108,11,9,75,12, - 6,3,68,7,76,6,68,16,68,6,12,235,43,41,139,41,171,12,3,100,67,7,6,68, - 13,68,6,12,235,235,235,12,7,196,3,12,6,68,17,68,6,12,235,235,235,12,7,6, - 13,36,3,36,6,12,6,68,16,68,6,12,235,235,235,43,12,6,36,3,4,3,44,6, - 68,15,68,6,12,235,235,235,11,9,12,6,100,6,44,6,68,17,68,6,12,235,235,235, - 11,9,12,6,68,3,12,9,12,6,68,18,68,6,12,9,235,235,235,9,12,6,3,45, - 6,12,9,12,6,68,9,68,7,236,236,236,236,108,7,68,9,68,13,230,230,230,230,102, - 13,68,8,31,228,228,228,228,228,36,31,8,31,228,228,228,228,228,36,31,7,95,228,228, - 228,228,164,95,7,95,228,228,228,228,164,95,8,31,228,228,228,228,228,36,31,8,31,228, - 228,228,228,228,36,31,9,68,13,103,230,230,230,230,13,68,11,68,39,38,13,99,236,236, - 236,108,7,68,14,68,7,3,164,3,12,9,235,235,235,9,12,6,68,14,68,7,3,164, - 6,12,9,235,235,235,11,12,6,68,16,68,7,13,68,3,6,13,6,12,235,235,235,43, - 12,6,68,14,68,7,6,68,3,13,6,235,235,235,107,12,6,68,15,68,6,12,3,132, - 13,12,9,235,235,235,11,12,6,68,16,68,6,12,7,38,3,36,3,12,235,235,235,43, - 12,6,68,17,68,6,12,6,35,68,3,12,203,41,139,41,235,43,12,6,68,20,68,6, - 12,6,132,6,12,107,9,11,108,11,9,11,108,9,235,12,6,68,24,68,6,12,7,36, - 3,6,7,12,75,9,44,11,38,163,13,6,7,44,9,171,12,6,68,24,68,6,12,9, - 6,7,76,43,9,11,12,7,6,3,228,36,3,13,7,12,171,12,6,68,22,68,6,12, - 11,44,11,9,43,9,12,11,6,3,228,196,6,44,9,75,12,6,68,19,68,6,12,171, - 9,12,6,3,228,228,36,3,7,12,9,43,12,6,68,16,68,6,12,171,12,6,228,228, - 132,3,7,12,43,12,6,68,15,68,6,12,139,12,6,228,228,196,3,43,9,12,6,68, - 19,68,6,12,75,9,12,6,228,196,67,13,3,132,13,12,9,12,6,68,19,68,6,12, - 43,9,12,6,164,99,102,39,9,76,3,164,6,44,6,68,20,68,6,12,11,9,12,6, - 100,3,71,11,236,43,12,7,196,3,44,6,68,22,68,6,12,9,43,3,100,13,12,11, - 12,43,105,107,9,12,6,228,6,12,6,68,20,68,6,12,9,12,6,132,3,12,9,235, - 75,9,12,6,228,13,12,6,68,18,68,6,44,7,164,3,12,9,235,75,9,12,3,228, - 3,12,6,68,15,68,6,44,13,164,3,12,235,137,11,3,228,4,39,68,16,68,6,12, - 7,3,164,3,12,203,172,7,228,36,6,7,68,19,68,6,12,6,196,3,7,12,107,12, - 7,35,13,102,228,36,6,7,68,16,68,6,12,3,228,6,12,139,12,6,3,228,196,6, - 7,68,18,68,6,11,3,228,6,12,9,139,44,7,38,3,228,68,6,7,68,17,68,39, - 228,4,3,12,9,139,9,11,108,6,228,36,6,7,68,19,68,7,6,228,36,6,12,75, - 41,75,41,11,12,3,228,4,6,7,68,17,68,7,6,228,68,6,11,140,107,9,12,6, - 228,4,6,7,68,16,68,7,6,228,100,67,13,6,7,139,12,7,228,4,39,68,16,68, - 7,6,228,228,3,7,12,107,12,7,228,3,11,6,68,16,68,7,6,228,68,102,7,44, - 139,12,7,228,3,12,6,68,16,68,7,6,228,68,6,108,171,9,12,6,228,6,12,6, - 68,19,68,7,6,228,68,3,12,9,203,9,11,12,3,196,3,7,12,6,68,15,68,39, - 228,68,3,203,9,11,44,13,228,13,44,6,68,19,68,6,12,3,228,68,7,11,73,11, - 76,6,3,228,4,7,44,6,68,20,68,6,12,13,228,68,6,108,11,7,6,3,228,36, - 6,12,9,12,6,68,16,68,6,12,6,228,68,102,35,228,100,3,43,9,12,6,68,15, - 68,6,44,3,228,228,228,100,6,12,9,11,12,6,68,15,68,6,44,6,228,228,228,68, - 6,12,9,43,12,6,68,17,68,6,12,9,12,13,228,228,228,4,6,12,9,75,12,6, - 68,15,68,6,12,9,43,3,228,228,196,6,12,139,12,6,68,18,68,6,12,43,12,7, - 3,228,228,132,6,12,75,9,43,12,6,68,21,68,6,12,43,9,12,7,3,228,228,36, - 3,6,12,41,11,76,9,12,6,68,23,68,6,12,75,9,44,6,228,196,3,6,11,12, - 9,44,9,7,6,7,11,12,6,68,25,68,6,12,171,12,7,13,3,228,36,3,6,7, - 12,11,9,12,7,13,3,36,6,44,6,68,22,68,6,12,171,9,44,7,6,13,163,38, - 11,44,9,11,12,6,132,13,44,6,68,22,68,6,12,235,9,108,11,9,11,108,11,9, - 43,9,12,13,68,35,6,44,6,68,18,68,6,12,235,43,41,139,41,139,9,12,13,68, - 13,38,44,6,68,14,68,6,12,235,235,235,9,12,6,164,6,12,6,68,15,68,6,12, - 235,235,235,43,12,38,3,68,3,12,6,68,15,68,6,12,235,235,235,11,12,7,67,68, - 3,12,6,68,14,68,6,12,235,235,235,9,12,6,164,3,12,6,68,13,68,6,12,235, - 235,235,9,12,6,196,11,6,68,16,68,6,12,9,235,235,203,9,12,13,35,13,102,12, - 6,68,9,68,7,236,236,236,236,108,6,68,9,68,13,230,230,230,230,102,13,68,8,31, - 228,228,228,228,228,36,31,8,31,228,228,228,228,228,36,31,7,95,228,228,228,228,164,95, - 7,95,228,228,228,228,164,95,8,31,228,228,228,228,228,36,31,8,31,228,228,228,228,228, - 36,31,9,68,13,230,230,230,230,102,13,68,9,68,7,236,236,236,236,108,7,68,16,68, - 7,6,3,13,38,11,9,235,235,235,75,9,12,6,68,13,68,7,13,68,7,44,235,235, - 235,107,12,6,68,14,68,7,3,36,3,70,12,235,235,235,75,12,6,68,13,68,6,3, - 164,13,12,235,235,235,43,12,6,68,15,68,6,3,36,35,68,7,12,235,235,235,11,12, - 6,68,15,68,7,3,36,38,68,7,12,235,235,235,11,12,6,68,15,68,7,6,164,3, - 9,203,41,139,41,235,43,12,6,68,21,68,6,12,3,100,3,6,12,107,9,11,108,11, - 9,11,108,9,235,12,6,68,22,68,6,12,11,102,7,12,75,9,44,11,38,163,13,6, - 7,44,9,171,12,6,68,22,68,6,12,11,140,43,9,11,12,7,6,3,228,36,3,13, - 7,12,171,12,6,68,19,68,6,12,137,43,9,12,11,6,3,228,196,6,44,9,75,12, - 6,68,19,68,6,12,171,9,12,6,3,228,228,36,3,7,12,9,43,12,6,68,16,68, - 6,12,171,12,6,228,228,132,3,7,12,43,12,6,68,15,68,6,12,139,12,6,228,228, - 196,3,43,9,12,6,68,17,68,6,12,75,9,12,6,228,228,228,4,13,12,9,12,6, - 68,15,68,6,12,43,9,12,6,228,228,228,68,6,44,6,68,15,68,6,12,11,9,12, - 6,228,228,228,100,3,44,6,68,19,68,6,12,9,43,3,132,6,7,6,13,35,228,228, - 36,6,12,6,68,19,68,6,12,9,12,6,164,6,108,9,7,6,13,228,196,13,12,6, - 68,17,68,6,44,7,196,7,12,41,43,44,3,228,196,3,12,6,68,15,68,6,44,13, - 164,3,139,9,12,6,228,228,4,39,68,17,68,6,12,7,3,164,3,12,139,12,3,228, - 228,4,6,7,68,19,68,6,12,6,196,13,12,9,75,12,7,13,134,3,228,68,6,7, - 68,16,68,6,12,3,196,6,12,9,139,204,6,228,36,6,7,68,18,68,6,11,3,196, - 6,12,9,139,169,11,12,6,228,4,6,7,68,16,68,39,228,6,12,9,107,9,11,9, - 203,3,228,6,7,68,17,68,7,6,228,6,12,9,75,140,107,9,12,13,228,6,7,68, - 23,68,7,6,228,6,12,9,43,12,7,13,3,13,7,12,75,9,12,6,228,6,7,68, - 21,68,7,6,228,13,12,9,43,12,7,68,6,12,9,43,9,12,6,228,39,68,19,68, - 7,6,228,3,12,107,12,70,12,107,9,12,6,196,3,11,6,68,18,68,7,6,228,4, - 7,12,107,76,139,9,12,3,196,3,12,6,68,19,68,7,6,228,4,6,12,9,107,9, - 139,9,12,7,228,6,12,6,68,19,68,7,6,228,4,3,7,12,9,203,41,44,3,196, - 3,7,12,6,68,16,68,39,228,36,3,7,44,107,108,7,3,228,13,44,6,68,21,68, - 6,12,3,228,36,3,6,7,9,44,11,39,6,13,228,36,7,44,6,68,15,68,6,12, - 13,228,132,131,228,100,6,12,9,12,6,68,14,68,6,12,6,228,228,228,132,3,43,9, - 12,6,68,15,68,6,44,3,228,228,228,100,6,12,9,11,12,6,68,15,68,6,44,6, - 228,228,228,68,6,12,9,43,12,6,68,17,68,6,12,9,12,13,228,228,228,4,6,12, - 9,75,12,6,68,15,68,6,12,9,43,3,228,228,196,6,12,139,12,6,68,16,68,6, - 12,43,12,7,3,228,228,132,6,12,171,12,6,68,19,68,6,12,43,9,12,7,3,228, - 228,36,3,6,12,137,43,12,6,68,19,68,6,12,75,9,44,6,228,196,3,6,11,12, - 9,172,9,12,6,68,25,68,6,12,171,12,7,13,3,228,36,3,6,7,12,11,9,12, - 7,38,13,6,7,44,6,68,22,68,6,12,171,9,44,7,6,13,163,38,11,44,41,12, - 6,3,132,6,12,6,68,20,68,6,12,235,9,108,11,9,11,108,11,9,75,12,3,164, - 3,12,6,68,19,68,6,12,235,43,41,139,41,171,9,3,36,3,6,36,3,11,6,68, - 15,68,6,12,235,235,235,11,12,3,36,35,68,7,6,68,13,68,6,12,235,235,235,9, - 12,6,196,7,6,68,16,68,6,12,235,235,235,43,12,7,38,3,36,3,12,6,68,14, - 68,6,12,235,235,235,75,44,9,68,3,12,6,68,14,68,6,12,235,235,235,139,7,38, - 3,6,12,6,68,15,68,6,12,9,235,235,235,75,9,11,76,11,12,6,68,9,68,7, - 236,236,236,236,108,7,68,9,68,13,230,230,230,230,102,13,68,8,31,228,228,228,228,228, - 36,31,8,31,228,228,228,228,228,36,31,7,95,228,228,228,228,164,95,7,95,228,228,228, - 228,164,95,8,31,228,228,228,228,228,36,31,8,31,228,228,228,228,228,36,31,11,68,13, - 7,6,167,230,230,230,102,13,68,13,68,6,9,7,134,13,9,236,236,236,76,7,68,14, - 68,6,3,164,3,12,9,235,235,235,9,12,6,68,14,68,7,6,164,6,12,9,235,235, - 235,11,12,6,68,14,68,39,4,35,68,6,12,235,235,235,43,12,6,68,15,68,6,12, - 39,3,36,3,12,235,235,235,75,12,6,68,15,68,6,44,3,68,6,12,9,235,235,235, - 43,12,6,68,14,68,6,12,6,100,6,12,235,235,235,75,12,6,68,18,68,6,12,6, - 3,36,3,12,235,11,41,139,41,235,43,12,6,68,22,68,6,44,7,6,3,6,12,9, - 139,9,11,108,11,9,11,108,9,235,12,6,68,22,68,6,12,9,44,11,7,139,9,44, - 11,38,163,13,6,7,44,9,171,12,6,68,22,68,6,12,43,9,139,9,11,12,7,6, - 3,228,36,3,13,7,12,171,12,6,68,18,68,6,12,203,9,12,11,6,3,228,196,6, - 44,9,75,12,6,68,19,68,6,12,171,9,12,6,3,228,228,36,3,7,12,9,43,12, - 6,68,16,68,6,12,171,12,6,228,228,132,3,7,12,43,12,6,68,15,68,6,12,139, - 12,6,228,228,196,3,43,9,12,6,68,17,68,6,12,75,9,12,6,228,228,228,4,13, - 12,9,12,6,68,18,68,6,12,43,9,12,6,228,132,131,13,6,3,164,6,44,6,68, - 20,68,6,12,11,9,12,6,100,67,13,134,39,9,140,13,164,3,44,6,68,19,68,6, - 12,9,43,3,100,6,236,44,75,9,11,7,228,6,12,6,68,19,68,6,12,9,12,6, - 132,3,12,169,171,9,12,6,228,13,12,6,68,17,68,6,44,7,196,7,12,235,75,9, - 12,13,228,3,12,6,68,17,68,6,44,13,196,6,12,9,235,43,12,7,3,228,4,39, - 68,20,68,6,12,7,3,196,3,12,9,43,44,139,9,12,6,228,36,6,7,68,20,68, - 6,12,6,228,3,11,44,9,39,12,107,9,12,13,228,36,6,7,68,19,68,6,12,3, - 228,4,45,35,4,6,12,139,9,3,228,36,6,7,68,18,68,6,11,3,228,132,6,12, - 9,75,9,12,6,228,68,6,7,68,15,68,39,228,132,3,12,139,9,12,13,228,68,6, - 7,68,14,68,7,6,228,132,7,12,203,3,228,68,6,7,68,16,68,7,6,228,100,6, - 12,9,139,12,6,228,100,6,7,68,15,68,7,6,228,68,3,12,171,9,12,6,228,100, - 39,68,18,68,7,6,228,36,3,7,12,9,171,12,3,228,68,3,11,6,68,17,68,7, - 6,228,36,13,76,9,107,12,6,228,100,3,12,6,68,19,68,7,6,228,68,3,6,7, - 44,11,41,12,6,228,100,6,12,6,68,19,68,7,6,228,132,3,6,7,44,11,12,3, - 228,68,3,7,12,6,68,14,68,39,228,228,3,6,12,7,228,100,13,44,6,68,14,68, - 6,12,3,228,228,4,35,228,100,7,44,6,68,14,68,6,12,13,228,228,228,164,6,12, - 9,12,6,68,14,68,6,12,6,228,228,228,132,3,43,9,12,6,68,15,68,6,44,3, - 228,228,228,100,6,12,9,11,12,6,68,15,68,6,44,6,228,228,228,68,6,12,9,43, - 12,6,68,17,68,6,12,9,12,13,228,228,228,4,6,12,9,75,12,6,68,15,68,6, - 12,9,43,3,228,228,196,6,12,139,12,6,68,16,68,6,12,43,12,7,3,228,228,132, - 6,12,171,12,6,68,19,68,6,12,43,9,12,7,3,228,228,36,3,6,12,9,171,12, - 6,68,21,68,6,12,75,9,44,6,228,196,3,6,11,12,9,11,44,9,75,12,6,68, - 24,68,6,12,171,12,7,13,3,228,36,3,6,7,12,11,9,11,12,39,44,43,12,6, - 68,26,68,6,12,171,9,44,7,6,13,163,38,11,44,9,43,9,12,6,4,13,6,12, - 11,12,6,68,22,68,6,12,235,9,108,11,9,11,108,11,9,107,9,12,3,68,3,7, - 12,6,68,16,68,6,12,235,43,41,139,41,203,12,7,100,13,44,6,68,15,68,6,12, - 235,235,235,11,9,12,6,68,3,76,6,68,16,68,6,12,235,235,235,11,9,12,3,68, - 6,39,12,6,68,17,68,6,12,235,235,235,11,12,7,3,68,3,4,6,12,6,68,14, - 68,6,12,235,235,235,9,12,6,164,3,12,6,68,14,68,6,12,235,235,235,9,12,3, - 164,3,11,6,68,13,68,6,12,9,235,235,235,11,134,71,12,6,68,9,68,7,236,236, - 236,236,108,6,68,9,68,13,230,230,230,230,102,13,68,8,31,228,228,228,228,228,36,31, - 8,31,228,228,228,228,228,36,31,7,95,228,228,228,228,164,95,7,95,228,228,228,228,164, - 95,8,31,228,228,228,228,228,36,31,8,31,228,228,228,228,228,36,31,9,68,13,230,230, - 230,230,102,13,68,10,68,7,76,39,236,236,236,204,7,68,18,68,6,12,7,3,36,3, - 7,12,9,235,235,235,11,9,12,6,68,17,68,6,12,13,4,35,4,3,12,9,235,235, - 235,43,12,6,68,17,68,6,12,3,4,13,3,4,3,12,235,235,235,75,12,6,68,15, - 68,6,12,6,100,13,12,9,235,235,235,43,12,6,68,17,68,6,7,3,4,35,36,6, - 12,9,235,235,235,11,12,6,68,16,68,7,6,36,38,36,13,12,9,235,235,235,11,12, - 6,68,15,68,39,164,6,12,9,171,41,139,41,235,43,12,6,68,21,68,6,12,6,3, - 68,13,12,139,9,11,108,11,9,11,108,9,235,12,6,68,22,68,6,44,7,38,7,12, - 107,9,44,11,38,163,13,6,7,44,9,171,12,6,68,23,68,6,12,9,108,9,43,9, - 11,12,7,6,3,228,36,3,13,7,12,171,12,6,68,20,68,6,12,43,41,75,9,12, - 11,6,3,228,196,6,44,9,75,12,6,68,19,68,6,12,171,9,12,6,3,228,228,36, - 3,7,12,9,43,12,6,68,16,68,6,12,171,12,6,228,228,132,3,7,12,43,12,6, - 68,15,68,6,12,139,12,6,228,228,196,3,43,9,12,6,68,17,68,6,12,75,9,12, - 6,228,228,228,4,13,12,9,12,6,68,15,68,6,12,43,9,12,6,228,228,228,68,6, - 44,6,68,19,68,6,12,11,9,12,6,228,36,3,13,38,3,228,132,3,44,6,68,19, - 68,6,12,9,43,3,228,4,6,11,108,7,3,228,100,6,12,6,68,20,68,6,12,9, - 12,6,228,4,6,12,11,105,44,13,228,68,13,12,6,68,20,68,6,44,7,228,4,6, - 12,9,11,44,107,12,3,228,36,3,12,6,68,20,68,6,44,13,228,4,7,12,11,12, - 7,6,75,9,12,6,228,68,39,68,20,68,6,12,7,3,228,3,107,3,4,6,12,41, - 12,6,228,68,6,7,68,22,68,6,12,6,228,4,3,9,43,12,38,7,12,11,9,12, - 6,228,68,6,7,68,19,68,6,12,3,228,36,6,12,43,76,43,9,12,13,228,68,6, - 7,68,19,68,6,11,3,228,36,3,12,9,11,41,107,7,3,228,68,6,7,68,18,68, - 39,228,36,3,6,12,107,9,75,12,6,3,228,36,6,7,68,19,68,7,6,228,36,6, - 12,9,11,140,43,9,12,6,228,36,6,7,68,23,68,7,6,228,4,3,12,9,11,12, - 6,67,6,12,43,9,12,3,228,4,6,7,68,22,68,7,6,228,4,6,12,41,12,6, - 68,6,12,9,11,9,12,6,228,4,39,68,23,68,7,6,228,4,6,12,9,43,12,7, - 6,7,12,75,9,12,6,228,3,11,6,68,19,68,7,6,228,4,3,12,9,75,76,107, - 9,12,3,228,3,12,6,68,18,68,7,6,228,36,6,12,9,235,9,12,6,228,4,6, - 12,6,68,22,68,7,6,228,36,3,7,12,11,9,107,9,11,12,7,3,228,3,7,12, - 6,68,15,68,39,228,68,3,6,236,6,3,228,4,13,44,6,68,15,68,6,12,3,228, - 100,3,166,3,228,68,7,44,6,68,14,68,6,12,13,228,228,228,164,6,12,9,12,6, - 68,14,68,6,12,6,228,228,228,132,3,43,9,12,6,68,15,68,6,44,3,228,228,228, - 100,6,12,9,11,12,6,68,15,68,6,44,6,228,228,228,68,6,12,9,43,12,6,68, - 17,68,6,12,9,12,13,228,228,228,4,6,12,9,75,12,6,68,15,68,6,12,9,43, - 3,228,228,196,6,12,139,12,6,68,16,68,6,12,43,12,7,3,228,228,132,6,12,171, - 12,6,68,21,68,6,12,43,9,12,7,3,228,228,36,3,6,12,9,11,41,75,12,6, - 68,21,68,6,12,75,9,44,6,228,196,3,6,11,12,9,11,108,11,9,12,6,68,24, - 68,6,12,171,12,7,13,3,228,36,3,6,7,12,11,9,11,12,102,12,11,12,6,68, - 23,68,6,12,171,9,44,7,6,13,163,38,11,44,9,43,12,6,100,13,11,12,6,68, - 21,68,6,12,235,9,108,11,9,11,108,11,9,43,9,12,6,164,6,12,6,68,21,68, - 6,12,235,43,41,139,41,139,9,12,6,36,3,6,3,4,13,12,6,68,18,68,6,12, - 235,235,235,11,12,7,3,4,35,4,3,6,12,6,68,15,68,6,12,235,235,235,11,9, - 12,6,100,3,44,6,68,19,68,6,12,235,235,235,11,9,12,13,4,3,6,4,3,9, - 12,6,68,17,68,6,12,235,235,235,11,9,12,6,36,3,4,3,44,6,68,16,68,6, - 12,235,235,235,75,12,6,3,4,3,7,44,6,68,17,68,6,12,9,235,235,235,11,9, - 11,12,39,44,9,12,6,68,9,68,7,236,236,236,236,108,7,68,9,68,13,230,230,230, - 230,102,13,68,8,31,228,228,228,228,228,36,31,8,31,228,228,228,228,228,36,31,7,95, - 228,228,228,228,164,95,7,95,228,228,228,228,164,95,8,31,228,228,228,228,228,36,31,8, - 31,228,228,228,228,228,36,31,9,68,13,230,230,230,230,102,13,68,9,68,7,236,236,236, - 236,108,7,68,15,68,6,12,6,99,6,12,235,235,235,43,9,12,6,68,14,68,7,6, - 164,6,12,9,235,235,235,11,12,6,68,14,68,7,3,36,35,36,3,235,235,235,75,12, - 6,68,16,68,6,3,36,3,6,68,7,12,235,235,235,11,12,6,68,13,68,7,13,196, - 7,12,235,235,235,11,12,6,68,16,68,6,7,3,4,35,68,7,12,235,235,235,11,12, - 6,68,19,68,6,44,7,9,3,36,3,7,12,171,41,139,41,235,43,12,6,68,23,68, - 6,12,9,12,7,3,36,3,12,107,9,11,108,11,9,11,108,9,235,12,6,68,23,68, - 6,12,43,9,39,38,12,43,9,44,11,38,163,13,6,7,44,9,171,12,6,68,22,68, - 6,12,75,108,11,9,11,12,7,6,3,228,36,3,13,7,12,171,12,6,68,20,68,6, - 12,139,9,11,9,12,11,6,3,228,196,6,44,9,75,12,6,68,19,68,6,12,171,9, - 12,6,3,228,228,36,3,7,12,9,43,12,6,68,16,68,6,12,171,12,6,228,228,132, - 3,7,12,43,12,6,68,15,68,6,12,139,12,6,228,228,196,3,43,9,12,6,68,17, - 68,6,12,75,9,12,6,228,228,228,4,13,12,9,12,6,68,15,68,6,12,43,9,12, - 6,228,228,228,68,6,44,6,68,15,68,6,12,11,9,12,6,228,228,228,100,3,44,6, - 68,19,68,6,12,9,43,3,228,3,13,70,39,38,3,228,68,6,12,6,68,19,68,6, - 12,9,12,6,196,3,6,11,236,12,6,228,36,13,12,6,68,20,68,6,44,7,196,3, - 7,12,11,41,139,41,12,6,228,4,3,12,6,68,17,68,6,44,13,196,6,12,9,235, - 43,9,12,13,228,4,39,68,19,68,6,12,7,3,164,3,12,9,139,44,139,12,7,228, - 4,6,7,68,20,68,6,12,6,196,6,12,9,107,12,39,9,12,107,12,3,228,6,7, - 68,24,68,6,12,3,196,6,12,9,75,12,6,3,4,3,7,12,43,9,12,13,228,6, - 7,68,24,68,6,11,3,196,6,12,9,75,12,6,3,4,3,7,12,43,9,12,6,228, - 6,7,68,20,68,39,228,13,12,9,107,12,9,7,11,12,75,9,12,6,228,6,7,68, - 16,68,7,6,228,3,12,203,12,139,9,12,6,228,6,7,68,18,68,7,6,228,4,6, - 12,41,75,41,139,9,12,6,228,6,7,68,15,68,7,6,228,4,3,6,236,107,9,12, - 6,228,39,68,20,68,7,6,228,68,13,6,71,38,7,12,75,9,12,13,196,3,11,6, - 68,16,68,7,6,228,228,4,3,7,139,12,3,196,3,12,6,68,17,68,7,6,228,228, - 4,6,12,9,107,12,3,196,6,12,6,68,17,68,7,6,228,228,3,12,11,105,12,7, - 196,3,7,12,6,68,13,68,39,228,228,6,11,172,6,196,13,44,6,68,17,68,6,12, - 3,228,228,35,13,38,7,12,6,196,7,44,6,68,15,68,6,12,13,228,228,164,35,164, - 6,12,9,12,6,68,14,68,6,12,6,228,228,228,132,3,43,9,12,6,68,15,68,6, - 44,3,228,228,228,100,6,12,9,11,12,6,68,15,68,6,44,6,228,228,228,68,6,12, - 9,43,12,6,68,17,68,6,12,9,12,13,228,228,228,4,6,12,9,75,12,6,68,15, - 68,6,12,9,43,3,228,228,196,6,12,139,12,6,68,16,68,6,12,43,12,7,3,228, - 228,132,6,12,171,12,6,68,19,68,6,12,43,9,12,7,3,228,228,36,3,6,12,41, - 139,12,6,68,17,68,6,12,75,9,44,6,228,196,3,6,11,172,75,12,6,68,22,68, - 6,12,171,12,7,13,3,228,36,3,6,7,12,11,12,70,39,75,12,6,68,24,68,6, - 12,171,9,44,7,6,13,163,38,11,44,41,12,13,68,6,12,11,9,12,6,68,23,68, - 6,12,235,9,108,11,9,11,108,11,9,75,12,3,36,3,7,6,7,44,6,68,16,68, - 6,12,235,43,41,139,41,203,3,132,3,6,12,6,68,14,68,6,12,235,235,235,11,9, - 3,164,3,12,6,68,15,68,6,12,235,235,235,11,12,3,36,38,68,7,6,68,15,68, - 6,12,235,235,235,9,12,3,36,35,68,11,6,68,14,68,6,12,235,235,235,11,12,6, - 164,6,12,6,68,15,68,6,12,235,235,235,43,12,6,67,13,6,44,6,68,14,68,6, - 12,9,235,235,235,11,9,172,9,12,6,68,9,68,7,236,236,236,236,108,7,68,9,68, - 13,230,230,230,230,102,13,68,8,31,228,228,228,228,228,36,31,8,31,228,228,228,228,228, - 36,31,7,95,228,228,228,228,164,95,7,95,228,228,228,228,164,95,8,31,228,228,228,228, - 228,36,31,8,31,228,228,228,228,228,36,31,10,68,13,70,71,230,230,230,166,13,68,13, - 68,7,44,7,6,13,6,236,236,236,172,7,68,18,68,6,12,6,4,13,6,35,7,11, - 9,235,235,235,9,12,6,68,15,68,39,35,6,44,13,3,12,235,235,235,43,12,6,68, - 19,68,7,6,13,9,4,6,12,7,3,7,12,235,235,235,11,12,6,68,19,68,7,13, - 6,12,6,4,7,12,3,6,12,235,235,235,11,12,6,68,18,68,7,6,3,44,6,3, - 6,3,7,12,235,235,235,11,12,6,68,19,68,6,12,3,6,11,12,13,4,6,12,9, - 235,235,235,11,12,6,68,16,68,6,12,7,99,6,12,235,41,139,41,235,43,12,6,68, - 19,68,6,76,38,7,12,171,9,11,108,11,9,11,108,9,235,12,6,68,22,68,6,12, - 9,11,76,9,107,9,44,11,38,163,13,6,7,44,9,171,12,6,68,20,68,6,12,235, - 9,11,12,7,6,3,228,36,3,13,7,12,171,12,6,68,18,68,6,12,203,9,12,11, - 6,3,228,196,6,44,9,75,12,6,68,19,68,6,12,171,9,12,6,3,228,228,36,3, - 7,12,9,43,12,6,68,16,68,6,12,171,12,6,228,228,132,3,7,12,43,12,6,68, - 15,68,6,12,139,12,6,228,228,196,3,43,9,12,6,68,17,68,6,12,75,9,12,6, - 228,228,228,4,13,12,9,12,6,68,18,68,6,12,43,9,12,6,228,4,35,45,35,228, - 100,6,44,6,68,19,68,6,12,11,9,12,6,228,38,9,108,9,38,228,36,3,44,6, - 68,19,68,6,12,9,43,3,164,3,7,236,44,7,3,228,4,6,12,6,68,21,68,6, - 12,9,12,6,164,6,44,11,12,38,45,38,108,6,228,13,12,6,68,23,68,6,44,7, - 164,6,12,9,12,7,3,164,3,6,12,9,12,6,196,3,12,6,68,20,68,6,44,13, - 132,3,12,9,12,43,3,228,6,12,9,12,3,196,39,68,21,68,6,12,7,3,132,7, - 12,11,6,11,44,3,228,6,44,7,196,6,7,68,21,68,6,12,6,132,13,44,6,4, - 6,44,7,3,228,6,44,13,164,6,7,68,20,68,6,12,3,132,6,44,3,36,6,44, - 6,228,3,44,6,164,6,7,68,22,68,6,11,3,100,3,7,12,6,100,6,44,6,228, - 6,12,7,3,132,6,7,68,20,68,39,132,3,44,6,100,3,7,11,12,6,196,6,44, - 3,132,6,7,68,21,68,7,6,132,3,44,6,132,3,12,11,12,13,164,6,44,3,132, - 6,7,68,21,68,7,6,132,3,44,6,164,13,12,11,12,3,132,6,44,3,132,6,7, - 68,20,68,7,6,132,3,44,6,196,6,12,11,7,3,100,6,44,3,132,39,68,22,68, - 7,6,132,3,7,12,6,228,6,44,6,100,6,12,7,3,100,3,11,6,68,20,68,7, - 6,164,6,44,3,228,6,44,6,36,3,44,6,132,3,12,6,68,21,68,7,6,164,13, - 44,6,228,3,7,44,6,4,6,44,13,132,6,12,6,68,21,68,7,6,196,7,44,6, - 228,3,44,11,6,11,12,7,132,3,7,12,6,68,20,68,39,196,3,12,9,12,6,228, - 3,43,12,9,12,3,132,13,44,6,68,23,68,6,12,3,196,6,12,9,12,6,3,164, - 3,7,12,9,12,6,164,7,44,6,68,22,68,6,12,13,228,6,76,11,38,45,38,12, - 11,44,6,164,6,12,9,12,6,68,19,68,6,12,6,228,4,3,7,236,44,7,3,164, - 3,43,9,12,6,68,19,68,6,44,3,228,36,38,9,108,9,38,228,6,12,9,11,12, - 6,68,18,68,6,44,6,228,100,35,45,35,228,4,6,12,9,43,12,6,68,17,68,6, - 12,9,12,13,228,228,228,4,6,12,9,75,12,6,68,15,68,6,12,9,43,3,228,228, - 196,6,12,139,12,6,68,16,68,6,12,43,12,7,3,228,228,132,6,12,171,12,6,68, - 19,68,6,12,43,9,12,7,3,228,228,36,3,6,12,9,171,12,6,68,18,68,6,12, - 75,9,44,6,228,196,3,6,11,12,9,203,12,6,68,20,68,6,12,171,12,7,13,3, - 228,36,3,6,7,12,11,9,235,12,6,68,22,68,6,12,171,9,44,7,6,13,163,38, - 11,44,9,107,9,76,11,9,12,6,68,19,68,6,12,235,9,108,11,9,11,108,11,9, - 171,12,7,38,76,6,68,16,68,6,12,235,43,41,139,41,235,12,6,99,7,12,6,68, - 19,68,6,12,235,235,235,11,9,12,6,4,13,12,11,6,3,12,6,68,18,68,6,12, - 235,235,235,11,12,7,3,6,3,6,44,3,6,7,68,19,68,6,12,235,235,235,11,12, - 6,3,12,7,4,6,12,6,13,7,68,19,68,6,12,235,235,235,11,12,7,3,7,12, - 6,4,9,13,6,7,68,15,68,6,12,235,235,235,43,12,3,13,44,6,35,39,68,18, - 68,6,12,9,235,235,235,9,11,7,35,6,13,4,6,12,6,68,13,68,7,236,236,236, - 172,6,13,6,7,44,7,68,10,68,13,230,230,230,166,71,70,13,68,8,31,228,228,228, - 228,228,36,31,8,31,228,228,228,228,228,36,31,7,95,228,228,228,228,164,95,7,95,228, - 228,228,228,164,95,8,31,228,228,228,228,228,36,31,8,31,228,228,228,228,228,36,31,9, - 68,13,230,230,230,230,102,13,68,12,68,6,44,7,12,6,236,236,236,204,7,68,17,68, - 6,7,3,4,35,6,12,9,235,235,235,43,9,12,6,68,17,68,7,6,4,6,13,4, - 3,6,12,235,235,235,75,12,6,68,15,68,7,6,3,12,71,6,12,235,235,235,75,12, - 6,68,15,68,39,3,43,44,13,6,12,235,235,235,43,12,6,68,18,68,6,12,6,7, - 12,9,12,6,3,12,235,235,235,43,12,6,68,17,68,6,12,7,70,12,13,4,7,12, - 235,235,235,11,12,6,68,16,68,6,12,11,6,100,3,235,41,139,41,235,43,12,6,68, - 22,68,6,12,11,12,13,70,7,12,107,9,11,108,11,9,11,108,9,235,12,6,68,22, - 68,6,12,9,12,7,108,75,9,44,11,38,163,13,6,7,44,9,171,12,6,68,22,68, - 6,12,107,41,43,9,11,12,7,6,3,228,36,3,13,7,12,171,12,6,68,18,68,6, - 12,203,9,12,11,6,3,228,196,6,44,9,75,12,6,68,20,68,6,12,171,9,12,6, - 3,228,3,228,4,3,7,12,9,43,12,6,68,18,68,6,12,171,12,6,228,36,6,228, - 36,3,7,12,43,12,6,68,18,68,6,12,139,12,6,228,68,7,3,228,36,3,43,9, - 12,6,68,24,68,6,12,75,9,12,6,36,3,13,70,13,35,36,12,6,228,68,13,12, - 9,12,6,68,22,68,6,12,43,9,12,6,4,3,6,204,7,38,9,12,6,228,68,6, - 44,6,68,23,68,6,12,11,9,12,6,4,3,44,11,137,11,76,43,12,3,228,36,3, - 44,6,68,24,68,6,12,9,43,3,4,7,12,9,75,9,75,73,43,12,7,3,228,36, - 6,12,6,68,23,68,6,12,9,12,6,4,3,12,9,75,204,75,9,12,7,3,228,4, - 13,12,6,68,25,68,6,44,7,36,13,12,9,43,12,7,13,67,13,7,11,9,108,11, - 3,228,3,12,6,68,20,68,6,44,13,36,6,12,9,11,12,6,132,3,76,7,134,3, - 228,39,68,24,68,6,12,7,3,36,13,12,9,11,12,3,100,3,39,6,35,36,3,228, - 68,6,7,68,19,68,6,12,6,68,3,12,11,12,7,132,45,164,38,228,36,6,7,68, - 17,68,6,12,3,100,7,44,6,228,164,7,6,228,4,6,7,68,17,68,6,11,3,100, - 6,44,6,228,164,3,12,6,228,6,7,68,16,68,39,132,3,9,12,7,228,196,6,12, - 3,196,6,7,68,18,68,7,6,164,6,12,7,3,228,164,13,12,7,3,164,6,7,68, - 18,68,7,6,164,3,7,12,3,228,164,3,11,12,6,164,6,7,68,15,68,7,6,196, - 3,12,6,228,196,7,44,3,132,39,68,17,68,7,6,228,6,12,3,228,164,6,44,6, - 100,3,11,6,68,17,68,7,6,228,4,38,228,164,6,12,11,7,100,3,12,6,68,21, - 68,7,6,228,36,6,3,164,3,13,132,7,12,9,12,3,68,6,12,6,68,23,68,7, - 6,228,196,3,6,7,11,3,100,3,12,11,9,12,6,36,3,7,12,6,68,21,68,39, - 228,99,70,11,44,3,100,3,7,12,11,9,12,6,36,13,44,6,68,23,68,6,12,3, - 228,6,140,43,7,13,67,6,7,12,43,9,12,6,36,7,44,6,68,23,68,6,12,13, - 228,4,3,7,12,9,107,172,75,9,12,13,4,6,12,9,12,6,68,24,68,6,12,6, - 228,36,3,7,12,75,73,43,9,75,9,12,7,4,3,43,9,12,6,68,24,68,6,44, - 3,228,36,3,11,12,11,76,11,105,43,44,3,4,6,12,9,11,12,6,68,22,68,6, - 44,6,228,68,3,44,38,7,172,7,6,3,4,6,12,9,43,12,6,68,23,68,6,12, - 9,12,13,228,68,6,12,3,4,67,77,35,36,6,12,9,75,12,6,68,18,68,6,12, - 9,43,3,228,68,7,13,228,36,6,12,139,12,6,68,18,68,6,12,43,12,7,3,228, - 36,45,228,4,6,12,171,12,6,68,20,68,6,12,43,9,12,7,3,228,36,3,196,3, - 6,12,9,171,12,6,68,18,68,6,12,75,9,44,6,228,196,3,6,11,12,9,203,12, - 6,68,24,68,6,12,171,12,7,13,3,228,36,3,6,7,12,11,9,43,44,11,12,43, - 12,6,68,23,68,6,12,171,9,44,7,6,13,163,38,11,44,9,75,12,71,6,12,9, - 12,6,68,22,68,6,12,235,9,108,11,9,11,108,11,9,107,12,6,36,3,4,6,44, - 6,68,20,68,6,12,235,43,41,139,41,171,12,7,4,3,6,35,13,9,12,6,68,17, - 68,6,12,235,235,235,43,12,3,6,12,6,12,38,12,6,68,18,68,6,12,235,235,235, - 11,9,12,38,12,11,12,7,3,12,6,68,16,68,6,12,235,235,235,75,9,6,44,7, - 12,3,6,7,68,16,68,6,12,235,235,235,75,12,38,3,6,7,4,13,7,68,13,68, - 6,12,235,235,235,107,7,3,100,6,7,68,15,68,6,12,9,235,235,235,43,9,12,7, - 102,12,6,68,9,68,7,236,236,236,236,108,6,68,9,68,13,230,230,230,230,102,13,68, - 8,31,228,228,228,228,228,36,31,8,31,228,228,228,228,228,36,31,7,95,228,228,228,228, - 164,95,7,95,228,228,228,228,164,95,8,31,228,228,228,228,228,36,31,8,31,228,228,228, - 228,228,36,31,9,68,13,230,230,230,230,102,13,68,9,68,7,236,236,236,236,108,7,68, - 18,68,6,12,11,12,11,12,70,9,12,9,235,235,203,9,12,6,68,18,68,6,12,7, - 6,7,12,13,36,3,7,12,235,235,235,12,6,68,19,68,6,12,6,4,6,12,6,13, - 36,6,12,9,235,235,203,12,6,68,16,68,7,6,68,13,35,4,3,6,12,235,235,235, - 12,6,68,17,68,7,6,3,4,35,36,3,6,9,235,235,235,11,12,6,68,15,68,6, - 12,6,3,38,100,6,12,235,235,235,12,6,68,19,68,6,12,41,12,6,99,6,12,9, - 107,41,139,41,235,43,12,6,68,20,68,6,12,75,76,11,39,75,9,11,108,11,9,11, - 108,9,235,12,6,68,22,68,6,12,107,9,43,44,11,9,44,11,38,163,13,6,7,44, - 9,171,12,6,68,20,68,6,12,235,9,11,12,7,6,3,228,36,3,13,7,12,171,12, - 6,68,18,68,6,12,203,9,12,11,6,3,228,196,6,44,9,75,12,6,68,19,68,6, - 12,171,9,12,6,3,228,228,36,3,7,12,9,43,12,6,68,16,68,6,12,171,12,6, - 228,228,132,3,7,12,43,12,6,68,15,68,6,12,139,12,6,228,228,196,3,43,9,12, - 6,68,17,68,6,12,75,9,12,6,228,228,228,4,13,12,9,12,6,68,15,68,6,12, - 43,9,12,6,228,228,228,68,6,44,6,68,18,68,6,12,11,9,12,6,228,132,3,38, - 35,228,36,3,44,6,68,22,68,6,12,9,43,3,228,3,13,6,7,3,7,76,7,38, - 35,196,6,12,6,68,26,68,6,12,9,12,6,196,3,6,7,76,6,7,11,41,11,76, - 11,7,6,3,100,13,12,6,68,24,68,6,44,7,132,3,6,7,44,11,73,12,11,9, - 11,108,43,44,7,100,3,12,6,68,23,68,6,44,13,68,3,6,9,44,9,172,9,12, - 11,102,7,12,9,12,6,132,39,68,28,68,6,12,7,3,68,7,12,11,41,12,6,13, - 35,6,7,12,6,3,100,3,6,44,6,132,6,7,68,23,68,6,12,6,100,6,12,9, - 11,12,6,132,3,7,3,196,6,12,13,132,6,7,68,21,68,6,12,3,100,13,12,7, - 12,6,196,3,6,196,3,12,3,132,6,7,68,18,68,6,11,3,132,7,12,7,228,4, - 6,3,196,6,164,6,7,68,16,68,39,164,6,12,6,228,4,3,13,196,6,164,6,7, - 68,17,68,7,6,164,3,12,3,228,4,3,6,164,35,164,6,7,68,17,68,7,6,196, - 6,3,228,4,3,7,3,132,35,164,6,7,68,17,68,7,6,196,6,3,228,4,3,12, - 6,132,6,3,164,39,68,18,68,7,6,196,35,228,4,6,12,6,100,3,6,164,3,11, - 6,68,19,68,7,6,228,13,228,4,7,44,3,36,3,12,6,164,3,12,6,68,22,68, - 7,6,228,3,13,196,6,12,9,12,6,3,6,11,12,3,164,6,12,6,68,21,68,7, - 6,228,4,6,13,132,6,12,107,9,12,43,3,132,3,7,12,6,68,21,68,39,228,4, - 6,12,38,13,6,7,12,105,43,9,12,7,164,13,44,6,68,20,68,6,12,3,228,3, - 9,108,11,9,140,11,9,12,6,164,7,44,6,68,25,68,6,12,13,228,4,6,12,7, - 9,44,11,6,45,38,9,44,13,132,6,12,9,12,6,68,21,68,6,12,6,228,4,3, - 76,7,6,3,132,35,13,132,3,43,9,12,6,68,17,68,6,44,3,228,4,38,3,228, - 228,6,12,9,11,12,6,68,15,68,6,44,6,228,228,228,68,6,12,9,43,12,6,68, - 17,68,6,12,9,12,13,228,228,228,4,6,12,9,75,12,6,68,15,68,6,12,9,43, - 3,228,228,196,6,12,139,12,6,68,16,68,6,12,43,12,7,3,228,228,132,6,12,171, - 12,6,68,19,68,6,12,43,9,12,7,3,228,228,36,3,6,12,9,171,12,6,68,18, - 68,6,12,75,9,44,6,228,196,3,6,11,12,9,203,12,6,68,22,68,6,12,171,12, - 7,13,3,228,36,3,6,7,12,43,12,43,9,107,12,6,68,21,68,6,12,171,9,44, - 7,6,13,163,38,11,44,9,11,39,108,75,12,6,68,24,68,6,12,235,9,108,11,9, - 11,108,11,9,11,9,12,6,67,13,6,12,43,12,6,68,19,68,6,12,235,43,41,139, - 41,107,9,12,6,100,38,3,6,12,6,68,17,68,6,12,235,235,235,11,9,6,3,36, - 35,4,3,6,7,68,15,68,6,12,235,235,235,12,6,3,4,67,68,6,7,68,19,68, - 6,12,235,235,203,9,12,6,36,13,6,12,6,4,6,12,6,68,18,68,6,12,235,235, - 235,12,7,3,36,13,12,7,6,7,12,6,68,17,68,6,12,235,235,235,11,12,7,70, - 12,11,12,11,12,6,68,14,68,6,12,9,235,235,235,9,11,76,105,12,6,68,9,68, - 7,236,236,236,236,108,7,68,9,68,13,230,230,230,230,102,13,68,8,31,228,228,228,228, - 228,36,31,8,31,228,228,228,228,228,36,31,7,95,228,228,228,228,164,95,7,95,228,228, - 228,228,164,95,8,31,228,228,228,228,228,36,31,8,31,228,228,228,228,228,36,31,9,68, - 13,240,240,240,240,112,13,68,10,68,16,120,48,248,248,248,184,16,68,14,68,16,24,16, - 14,101,14,241,241,241,81,24,16,68,13,68,16,17,13,164,13,241,241,241,49,24,16,68, - 16,68,16,14,36,5,14,13,68,14,24,241,241,241,24,16,68,17,68,16,5,4,5,16, - 56,13,36,13,24,241,241,241,24,16,68,17,68,14,5,4,5,16,56,13,36,5,241,241, - 241,17,24,16,68,16,68,16,13,36,5,14,13,68,13,24,241,241,241,24,16,68,12,68, - 48,196,5,16,24,241,241,241,24,16,68,18,68,16,24,14,5,100,5,16,24,145,120,81, - 120,241,17,24,16,68,22,68,16,56,16,110,17,24,81,56,17,16,14,45,69,13,46,16, - 56,209,24,16,68,21,68,16,24,16,17,120,113,24,16,14,5,228,36,5,13,16,24,177, - 24,16,68,17,68,16,24,241,24,17,14,5,228,196,14,17,24,113,24,16,68,17,68,16, - 24,209,24,16,5,228,228,36,13,16,24,81,24,16,68,16,68,16,24,177,24,14,228,228, - 132,5,16,24,49,24,16,68,14,68,16,24,145,24,14,228,228,196,5,81,24,16,68,16, - 68,16,24,113,24,14,228,228,228,4,13,24,16,24,16,68,14,68,16,24,81,24,14,228, - 228,228,68,14,56,16,68,17,68,16,24,49,24,16,228,36,37,45,37,228,100,13,56,16, - 68,23,68,16,24,81,5,196,5,13,14,16,17,56,17,16,14,13,5,228,36,14,24,16, - 68,20,68,16,24,16,24,14,196,13,16,88,113,88,16,13,228,4,13,24,16,68,18,68, - 16,24,17,16,5,164,14,56,241,49,56,14,228,5,24,16,68,14,68,16,56,14,164,14, - 24,241,177,24,14,228,48,68,17,68,16,24,16,5,132,13,24,145,152,177,24,13,196,14, - 16,68,19,68,16,24,14,164,16,24,145,14,77,16,24,145,24,16,196,14,16,68,19,68, - 16,24,13,132,13,24,145,13,132,14,24,145,24,13,164,14,16,68,21,68,16,17,5,132, - 14,24,81,24,14,164,5,16,24,113,24,14,164,14,16,68,18,68,48,164,14,24,81,24, - 13,196,14,24,113,24,14,164,14,16,68,19,68,16,14,164,14,24,81,24,14,196,16,24, - 113,24,14,164,14,16,68,19,68,16,14,164,14,24,113,16,13,132,14,24,145,24,14,164, - 14,16,68,21,68,16,14,164,13,24,113,24,16,14,13,5,13,14,24,177,24,13,164,48, - 68,18,68,16,14,196,16,24,145,56,17,56,177,24,16,164,5,17,16,68,15,68,16,14, - 196,13,24,241,241,24,13,164,13,24,16,68,15,68,16,14,228,14,24,241,177,24,14,196, - 14,24,16,68,17,68,16,14,228,4,14,56,241,49,56,14,196,5,16,24,16,68,16,68, - 48,228,36,13,16,56,177,56,16,13,228,14,56,16,68,20,68,16,24,5,228,36,5,14, - 48,120,48,14,5,228,5,16,17,24,16,68,17,68,16,24,13,228,132,5,109,5,228,68, - 14,24,16,24,16,68,13,68,16,24,14,228,228,228,132,5,81,24,16,68,14,68,16,56, - 13,228,228,228,100,16,24,49,24,16,68,14,68,16,56,14,228,228,228,68,14,24,81,24, - 16,68,16,68,16,24,16,24,13,228,228,228,4,14,24,113,24,16,68,14,68,16,24,81, - 5,228,228,196,14,24,145,24,16,68,16,68,16,24,49,24,16,5,228,228,132,14,24,177, - 24,16,68,17,68,16,24,81,24,16,13,228,228,36,5,16,24,209,24,16,68,19,68,16, - 24,113,24,17,14,228,196,5,14,17,24,16,184,16,24,16,68,25,68,16,24,177,24,16, - 13,5,228,36,5,14,16,24,17,16,24,16,14,45,14,16,56,16,68,24,68,16,24,209, - 56,16,46,13,69,45,14,16,17,56,49,24,14,5,100,5,14,24,16,68,15,68,16,24, - 241,17,120,81,120,113,24,16,228,14,16,68,16,68,16,24,241,241,241,24,13,68,13,14, - 13,36,13,16,68,16,68,16,24,241,241,241,17,5,36,13,88,5,4,5,14,68,18,68, - 16,24,241,241,241,24,13,36,13,17,24,16,5,4,5,16,68,16,68,16,24,241,241,241, - 24,14,68,5,13,5,36,14,16,68,14,68,16,24,241,241,241,17,24,14,164,13,24,16, - 68,17,68,16,24,241,241,241,49,24,14,13,37,13,14,17,24,16,68,14,68,16,24,241, - 241,241,81,56,48,56,16,24,16,68,9,68,16,248,248,248,248,120,16,68,9,68,13,240, - 240,240,240,112,13,68,8,31,228,228,228,228,228,36,31,8,31,228,228,228,228,228,36,31, - 7,95,228,228,228,228,164,95,7,95,228,228,228,228,164,95,8,31,228,228,228,228,228,36, - 31,8,31,228,228,228,228,228,36,31,9,68,13,240,240,240,240,112,13,68,12,68,16,88, - 16,46,17,248,248,248,152,16,68,15,68,16,24,14,13,5,36,16,241,241,241,113,24,16, - 68,14,68,16,24,13,100,16,24,241,241,241,81,24,16,68,16,68,16,24,14,4,5,36, - 14,24,241,241,241,81,24,16,68,15,68,16,24,48,5,36,14,24,241,241,241,81,24,16, - 68,15,68,16,56,16,5,36,14,24,241,241,241,81,24,16,68,14,68,16,56,16,68,13, - 24,241,241,241,81,24,16,68,14,68,16,56,14,68,13,24,241,241,241,81,24,16,68,15, - 68,16,56,14,68,5,241,120,81,120,241,17,24,16,68,21,68,16,24,17,16,110,145,56, - 17,16,14,45,69,13,46,16,56,209,24,16,68,20,68,16,24,17,152,113,24,16,14,5, - 228,36,5,13,16,24,177,24,16,68,17,68,16,24,241,24,17,14,5,228,196,14,17,24, - 113,24,16,68,17,68,16,24,209,24,16,5,228,228,36,13,16,24,81,24,16,68,16,68, - 16,24,177,24,14,228,228,132,5,16,24,49,24,16,68,14,68,16,24,145,24,14,228,228, - 196,5,81,24,16,68,16,68,16,24,113,24,14,228,228,228,4,13,24,16,24,16,68,17, - 68,16,24,81,24,14,228,132,5,13,14,228,68,14,56,16,68,20,68,16,24,49,24,16, - 228,68,5,13,14,16,24,16,228,68,13,56,16,68,20,68,16,24,81,5,228,13,14,16, - 17,56,49,16,5,228,68,14,24,16,68,18,68,16,24,16,24,14,196,5,16,88,177,5, - 228,68,13,24,16,68,19,68,16,24,17,16,5,228,16,24,16,177,24,13,228,68,5,24, - 16,68,15,68,16,56,14,228,4,14,24,209,24,13,228,100,48,68,18,68,16,24,16,5, - 228,4,13,24,16,177,24,14,228,100,14,16,68,16,68,16,24,14,228,36,5,88,145,24, - 14,228,100,14,16,68,18,68,16,24,13,228,68,16,14,13,16,113,24,14,228,100,14,16, - 68,18,68,16,17,5,228,68,5,4,5,24,113,24,16,228,100,14,16,68,15,68,48,228, - 164,13,24,113,24,16,5,228,68,14,16,68,14,68,16,14,228,164,14,24,177,5,228,68, - 14,16,68,15,68,16,14,228,164,14,24,145,24,13,228,68,14,16,68,14,68,16,14,228, - 164,14,24,145,24,13,228,68,48,68,16,68,16,14,228,164,16,24,145,24,14,228,36,5, - 17,16,68,16,68,16,14,228,164,16,24,145,24,14,228,36,13,24,16,68,16,68,16,14, - 228,132,5,16,177,24,14,228,36,14,24,16,68,16,68,16,14,228,132,5,209,24,16,228, - 4,5,16,24,16,68,15,68,48,228,132,13,184,17,24,16,228,4,14,56,16,68,18,68, - 16,24,5,228,100,13,16,14,208,5,196,5,16,17,24,16,68,15,68,16,24,13,228,228, - 36,101,228,14,24,16,24,16,68,13,68,16,24,14,228,228,228,132,5,81,24,16,68,14, - 68,16,56,13,228,228,228,100,16,24,49,24,16,68,14,68,16,56,14,228,228,228,68,14, - 24,81,24,16,68,16,68,16,24,16,24,13,228,228,228,4,14,24,113,24,16,68,14,68, - 16,24,81,5,228,228,196,14,24,145,24,16,68,16,68,16,24,49,24,16,5,228,228,132, - 14,24,177,24,16,68,18,68,16,24,81,24,16,13,228,228,36,5,16,24,16,177,24,16, - 68,19,68,16,24,113,24,17,14,228,196,5,14,17,24,17,152,49,24,16,68,22,68,16, - 24,177,24,16,13,5,228,36,5,14,16,24,49,24,142,24,17,24,16,68,24,68,16,24, - 209,56,16,46,13,69,45,14,16,17,56,81,24,13,68,13,24,16,24,16,68,20,68,16, - 24,241,17,120,81,120,177,24,14,4,5,4,14,24,16,24,16,68,16,68,16,24,241,241, - 241,49,24,14,68,14,24,16,24,16,68,16,68,16,24,241,241,241,49,24,14,68,16,24, - 16,24,16,68,17,68,16,24,241,241,241,49,24,16,36,5,14,16,17,24,16,68,15,68, - 16,24,241,241,241,49,24,16,5,68,14,56,16,68,14,68,16,24,241,241,241,81,16,5, - 68,13,56,16,68,17,68,16,24,241,241,241,81,24,5,4,5,13,14,17,24,16,68,14, - 68,16,24,241,241,241,113,46,16,56,17,24,16,68,9,68,16,248,248,248,248,120,16,68, - 9,68,13,240,240,240,240,112,13,68,8,31,228,228,228,228,228,36,31,8,31,228,228,228, - 228,228,36,31,7,95,228,228,228,228,164,95,7,95,228,228,228,228,164,95,8,31,228,228, - 228,228,228,36,31,8,31,228,228,228,228,228,36,31,11,68,13,48,14,15,240,240,240,240, - 13,68,14,68,16,24,16,37,13,14,17,248,248,248,152,16,68,15,68,16,24,14,100,5, - 16,24,241,241,241,49,24,16,68,15,68,16,24,14,37,68,13,24,241,241,241,49,24,16, - 68,16,68,16,24,48,14,5,36,5,24,241,241,241,49,24,16,68,14,68,16,24,13,132, - 13,24,241,241,241,49,24,16,68,15,68,16,14,68,5,13,14,16,241,241,241,81,24,16, - 68,15,68,16,14,68,13,46,16,24,241,241,241,49,24,16,68,13,68,16,13,164,14,24, - 241,241,241,49,24,16,68,15,68,16,13,164,13,24,177,120,81,120,241,17,24,16,68,22, - 68,16,46,45,37,4,5,113,56,17,16,14,45,69,13,46,16,56,209,24,16,68,20,68, - 16,120,17,80,81,24,16,14,5,228,36,5,13,16,24,177,24,16,68,20,68,16,24,16, - 113,56,17,24,17,14,5,228,196,14,17,24,113,24,16,68,17,68,16,24,209,24,16,5, - 228,228,36,13,16,24,81,24,16,68,16,68,16,24,177,24,14,228,228,132,5,16,24,49, - 24,16,68,14,68,16,24,145,24,14,228,228,196,5,81,24,16,68,17,68,16,24,113,24, - 14,164,77,5,228,196,13,24,16,24,16,68,19,68,16,24,81,24,14,196,14,56,17,16, - 46,13,228,100,14,56,16,68,19,68,16,24,49,24,16,228,16,24,49,120,16,13,228,36, - 13,56,16,68,18,68,16,24,81,5,196,5,16,209,56,15,5,228,4,14,24,16,68,19, - 68,16,24,16,24,14,228,13,24,241,17,24,16,5,228,13,24,16,68,19,68,16,24,17, - 16,5,228,14,24,241,17,16,24,14,228,5,24,16,68,17,68,16,56,14,228,4,14,24, - 17,88,177,24,16,228,4,48,68,19,68,16,24,16,5,228,4,5,109,14,16,145,24,16, - 5,228,14,16,68,17,68,16,24,14,228,196,13,16,24,113,24,16,5,228,14,16,68,18, - 68,16,24,13,228,36,13,14,80,56,145,24,16,228,4,14,16,68,17,68,16,17,5,228, - 4,13,152,177,16,24,14,228,4,14,16,68,16,68,48,228,4,5,16,241,49,56,16,5, - 228,4,14,16,68,17,68,16,14,228,4,14,24,177,88,48,14,5,228,36,14,16,68,18, - 68,16,14,228,4,14,24,145,24,16,14,13,5,228,132,14,16,68,16,68,16,14,228,5, - 16,24,177,5,4,69,45,228,36,48,68,16,68,16,14,228,5,241,80,49,24,16,228,4, - 5,17,16,68,16,68,16,14,228,13,24,209,56,113,16,5,228,13,24,16,68,15,68,16, - 14,228,13,24,241,145,24,13,228,14,24,16,68,16,68,16,14,228,13,24,241,145,24,14, - 196,5,16,24,16,68,15,68,48,228,13,24,16,241,113,24,14,196,14,56,16,68,18,68, - 16,24,5,196,13,248,145,16,24,16,164,5,16,17,24,16,68,19,68,16,24,13,196,5, - 45,110,80,17,184,5,132,14,24,16,24,16,68,17,68,16,24,14,228,196,69,45,78,16, - 13,100,5,81,24,16,68,14,68,16,56,13,228,228,228,100,16,24,49,24,16,68,14,68, - 16,56,14,228,228,228,68,14,24,81,24,16,68,16,68,16,24,16,24,13,228,228,228,4, - 14,24,113,24,16,68,14,68,16,24,81,5,228,228,196,14,24,145,24,16,68,16,68,16, - 24,49,24,16,5,228,228,132,14,24,177,24,16,68,18,68,16,24,81,24,16,13,228,228, - 36,5,16,120,81,16,24,16,68,19,68,16,24,113,24,17,14,228,196,5,14,17,24,46, - 48,17,120,16,68,24,68,16,24,177,24,16,13,5,228,36,5,14,16,24,17,24,13,36, - 37,45,14,24,16,68,22,68,16,24,209,56,16,46,13,69,45,14,16,17,56,49,24,14, - 164,5,17,16,68,16,68,16,24,241,17,120,81,120,145,24,15,164,5,24,16,68,15,68, - 16,24,241,241,241,49,16,78,5,36,13,24,16,68,15,68,16,24,241,241,241,81,14,13, - 5,68,14,24,16,68,16,68,16,24,241,241,241,17,24,14,68,37,13,16,24,16,68,16, - 68,16,24,241,241,241,17,24,13,68,14,48,17,24,16,68,14,68,16,24,241,241,241,17, - 24,14,132,13,56,16,68,13,68,16,24,241,241,241,81,13,100,14,56,16,68,15,68,16, - 24,241,241,241,81,24,46,13,5,14,56,16,68,9,68,16,248,248,248,248,120,16,68,9, - 68,13,240,240,240,240,112,13,68,8,31,228,228,228,228,228,36,31,8,31,228,228,228,228, - 228,36,31,7,95,228,228,228,228,164,95,7,95,228,228,228,228,164,95,8,31,228,228,228, - 228,228,36,31,8,31,228,228,228,228,228,36,31,9,68,13,240,240,240,240,112,13,68,11, - 68,16,24,112,17,248,248,248,184,16,68,14,68,16,24,13,68,5,14,241,241,241,113,24, - 16,68,14,68,16,24,13,132,14,24,241,241,241,49,24,16,68,15,68,16,24,78,5,36, - 14,24,241,241,241,49,24,16,68,15,68,16,56,14,68,5,16,24,241,241,241,49,24,16, - 68,15,68,16,56,16,68,5,14,24,241,241,241,49,24,16,68,15,68,48,46,13,5,36, - 14,24,241,241,241,49,24,16,68,12,68,48,164,14,24,241,241,241,49,24,16,68,15,68, - 16,24,5,100,13,241,120,81,120,241,17,24,16,68,24,68,16,24,13,5,13,14,16,24, - 145,56,17,16,14,45,69,13,46,16,56,209,24,16,68,21,68,16,24,16,17,88,145,24, - 16,14,5,228,36,5,13,16,24,177,24,16,68,17,68,16,24,241,24,17,14,5,228,196, - 14,17,24,113,24,16,68,17,68,16,24,209,24,16,5,228,228,36,13,16,24,81,24,16, - 68,16,68,16,24,177,24,14,228,228,132,5,16,24,49,24,16,68,14,68,16,24,145,24, - 14,228,228,196,5,81,24,16,68,16,68,16,24,113,24,14,228,228,228,4,13,24,16,24, - 16,68,14,68,16,24,81,24,14,228,228,228,68,14,56,16,68,16,68,16,24,49,24,16, - 196,13,174,45,228,100,13,56,16,68,17,68,16,24,81,5,196,16,248,16,14,5,228,36, - 14,24,16,68,19,68,16,24,16,24,14,228,16,24,209,56,16,5,228,4,13,24,16,68, - 20,68,16,24,17,16,5,196,5,16,241,17,16,24,14,228,4,5,24,16,68,15,68,16, - 56,14,228,5,81,120,113,24,16,228,36,48,68,20,68,16,24,16,5,228,13,56,17,16, - 46,16,24,145,5,228,4,14,16,68,19,68,16,24,14,228,4,13,14,13,101,16,24,145, - 5,228,4,14,16,68,16,68,16,24,13,228,100,13,48,56,177,5,228,4,14,16,68,16, - 68,16,17,5,228,100,13,24,209,24,14,228,36,14,16,68,15,68,48,228,132,5,16,177, - 24,16,5,228,36,14,16,68,14,68,16,14,228,164,16,24,209,14,228,36,14,16,68,15, - 68,16,14,228,164,14,24,209,24,5,228,4,14,16,68,15,68,16,14,228,164,77,16,24, - 113,24,13,228,4,48,68,15,68,16,14,228,4,5,208,177,24,13,228,5,17,16,68,15, - 68,16,14,228,4,5,17,184,209,5,228,13,24,16,68,18,68,16,14,228,36,16,24,241, - 17,16,24,16,228,4,14,24,16,68,18,68,16,14,228,36,14,24,241,17,24,16,13,228, - 5,16,24,16,68,16,68,48,228,36,14,24,209,56,16,5,228,4,14,56,16,68,21,68, - 16,24,5,228,4,13,24,49,120,16,14,13,228,36,5,16,17,24,16,68,20,68,16,24, - 13,228,4,13,56,48,46,13,5,228,100,14,24,16,24,16,68,16,68,16,24,14,228,4, - 5,45,5,228,228,5,81,24,16,68,14,68,16,56,13,228,228,228,100,16,24,49,24,16, - 68,14,68,16,56,14,228,228,228,68,14,24,81,24,16,68,16,68,16,24,16,24,13,228, - 228,228,4,14,24,113,24,16,68,14,68,16,24,81,5,228,228,196,14,24,145,24,16,68, - 16,68,16,24,49,24,16,5,228,228,132,14,24,177,24,16,68,19,68,16,24,81,24,16, - 13,228,228,36,5,16,24,145,24,17,24,16,68,20,68,16,24,113,24,17,14,228,196,5, - 14,17,24,49,88,48,17,24,16,68,24,68,16,24,177,24,16,13,5,228,36,5,14,16, - 24,81,24,16,14,13,37,16,24,16,68,22,68,16,24,209,56,16,46,13,69,45,14,16, - 17,56,81,24,14,132,16,24,16,68,16,68,16,24,241,17,120,81,120,145,24,16,164,14, - 24,16,68,16,68,16,24,241,241,241,17,24,14,68,13,14,48,24,16,68,16,68,16,24, - 241,241,241,49,16,5,68,14,24,17,24,16,68,18,68,16,24,241,241,241,17,24,16,5, - 36,5,14,24,16,24,16,68,16,68,16,24,241,241,241,17,24,14,68,14,45,16,24,16, - 68,15,68,16,24,241,241,241,17,24,16,132,5,17,24,16,68,16,68,16,24,241,241,241, - 49,24,14,13,5,36,13,56,16,68,13,68,16,24,241,241,241,81,56,112,17,24,16,68, - 9,68,16,248,248,248,248,120,16,68,9,68,13,240,240,240,240,112,13,68,8,31,228,228, - 228,228,228,36,31,8,31,228,228,228,228,228,36,31,7,95,228,228,228,228,164,95,7,95, - 228,228,228,228,164,95,8,31,228,228,228,228,228,36,31,8,31,228,228,228,228,228,36,31, - 9,68,13,240,240,240,240,112,13,68,12,68,16,56,16,77,14,248,248,248,152,16,68,16, - 68,16,17,24,13,68,14,24,16,241,241,241,49,24,16,68,14,68,16,24,16,100,14,24, - 241,241,241,81,24,16,68,17,68,16,24,13,4,13,5,4,14,24,241,241,241,81,24,16, - 68,17,68,48,5,4,5,36,13,14,16,24,241,241,241,17,24,16,68,13,68,16,13,196, - 16,24,241,241,241,17,24,16,68,14,68,16,14,45,5,100,16,241,241,241,49,24,16,68, - 14,68,16,88,13,36,13,14,241,241,241,81,24,16,68,17,68,16,24,17,16,68,13,24, - 209,120,81,120,241,17,24,16,68,22,68,16,56,16,13,46,16,145,56,17,16,14,45,69, - 13,46,16,56,209,24,16,68,20,68,16,24,49,120,113,24,16,14,5,228,36,5,13,16, - 24,177,24,16,68,17,68,16,24,241,24,17,14,5,228,196,14,17,24,113,24,16,68,17, - 68,16,24,209,24,16,5,228,228,36,13,16,24,81,24,16,68,16,68,16,24,177,24,14, - 228,228,132,5,16,24,49,24,16,68,14,68,16,24,145,24,14,228,228,196,5,81,24,16, - 68,17,68,16,24,113,24,14,228,196,5,228,4,13,24,16,24,16,68,18,68,16,24,81, - 24,14,228,4,13,78,112,5,228,4,14,56,16,68,18,68,16,24,49,24,16,228,4,5, - 16,216,13,228,4,13,56,16,68,18,68,16,24,81,5,228,4,13,24,16,177,13,228,36, - 14,24,16,68,20,68,16,24,16,24,14,228,4,5,16,24,177,24,13,228,36,13,24,16, - 68,19,68,16,24,17,16,5,228,4,14,24,209,24,13,228,36,5,24,16,68,18,68,16, - 56,14,228,4,5,16,24,17,56,113,24,13,228,68,48,68,22,68,16,24,16,5,228,4, - 14,24,16,24,16,14,24,81,24,13,228,68,14,16,68,21,68,16,24,14,228,4,5,16, - 24,17,24,45,24,81,24,13,228,68,14,16,68,20,68,16,24,13,228,4,14,24,81,5, - 14,24,81,24,5,228,68,14,16,68,16,68,16,17,5,228,5,16,113,16,177,110,5,196, - 14,16,68,15,68,48,228,4,14,24,241,81,88,16,5,196,14,16,68,15,68,16,14,228, - 5,16,241,145,16,24,14,228,14,16,68,14,68,16,14,228,14,24,241,177,24,14,228,14, - 16,68,16,68,16,14,196,5,14,48,17,88,241,16,24,13,228,48,68,17,68,16,14,228, - 36,37,13,46,16,177,88,13,196,5,17,16,68,18,68,16,14,228,196,16,24,113,24,15, - 14,16,5,196,13,24,16,68,15,68,16,14,228,164,5,177,24,13,228,36,14,24,16,68, - 17,68,16,14,228,164,13,24,145,24,14,228,4,5,16,24,16,68,16,68,48,228,164,14, - 24,16,113,24,14,228,4,14,56,16,68,18,68,16,24,5,228,132,14,120,17,48,13,228, - 5,16,17,24,16,68,17,68,16,24,13,228,132,78,45,37,228,36,14,24,16,24,16,68, - 13,68,16,24,14,228,228,228,132,5,81,24,16,68,14,68,16,56,13,228,228,228,100,16, - 24,49,24,16,68,14,68,16,56,14,228,228,228,68,14,24,81,24,16,68,16,68,16,24, - 16,24,13,228,228,228,4,14,24,113,24,16,68,14,68,16,24,81,5,228,228,196,14,24, - 145,24,16,68,16,68,16,24,49,24,16,5,228,228,132,14,24,177,24,16,68,17,68,16, - 24,81,24,16,13,228,228,36,5,16,24,209,24,16,68,19,68,16,24,113,24,17,14,228, - 196,5,14,17,24,16,120,81,24,16,68,25,68,16,24,177,24,16,13,5,228,36,5,14, - 16,24,49,24,16,14,45,14,24,17,24,16,68,24,68,16,24,209,56,16,46,13,69,45, - 14,16,17,56,81,24,14,68,16,24,16,24,16,68,18,68,16,24,241,17,120,81,120,145, - 24,14,13,36,5,16,88,16,68,14,68,16,24,241,241,241,17,24,5,100,5,45,48,68, - 13,68,16,24,241,241,241,24,16,196,5,24,16,68,18,68,16,24,241,241,241,17,16,14, - 13,36,13,5,4,14,24,16,68,16,68,16,24,241,241,241,49,24,14,36,13,4,13,56, - 16,68,14,68,16,24,241,241,241,49,24,14,100,14,56,16,68,16,68,16,24,241,241,241, - 49,24,14,68,13,24,17,24,16,68,16,68,16,24,241,241,241,49,24,14,77,16,24,16, - 24,16,68,9,68,16,248,248,248,248,120,16,68,9,68,13,240,240,240,240,112,13,68,8, - 31,228,228,228,228,228,36,31,8,31,228,228,228,228,228,36,31,7,95,228,228,228,228,164, - 95,7,95,228,228,228,228,164,95,8,31,228,228,228,228,228,36,31,8,31,228,228,228,228, - 228,36,31,10,68,13,176,46,240,240,240,112,13,68,12,68,48,46,77,5,13,248,248,248, - 120,16,68,14,68,16,13,164,13,24,16,241,241,241,17,24,16,68,13,68,16,13,164,14, - 24,241,241,241,49,24,16,68,16,68,16,14,68,13,14,13,16,24,241,241,241,49,24,16, - 68,13,68,16,14,68,5,46,241,241,241,113,24,16,68,14,68,16,17,5,132,14,24,241, - 241,241,49,24,16,68,16,68,16,24,48,14,5,36,5,24,241,241,241,49,24,16,68,16, - 68,16,24,14,13,5,68,13,24,241,241,241,49,24,16,68,17,68,16,24,14,100,5,15, - 24,177,120,81,120,241,17,24,16,68,25,68,16,24,16,4,5,13,14,16,24,113,56,17, - 16,14,45,69,13,46,16,56,209,24,16,68,22,68,16,24,17,48,17,56,113,24,16,14, - 5,228,36,5,13,16,24,177,24,16,68,19,68,16,24,17,56,145,24,17,14,5,228,196, - 14,17,24,113,24,16,68,17,68,16,24,209,24,16,5,228,228,36,13,16,24,81,24,16, - 68,16,68,16,24,177,24,14,228,228,132,5,16,24,49,24,16,68,14,68,16,24,145,24, - 14,228,228,196,5,81,24,16,68,18,68,16,24,113,24,14,228,164,37,77,5,132,13,24, - 16,24,16,68,18,68,16,24,81,24,14,164,37,45,110,80,88,13,164,14,56,16,68,19, - 68,16,24,49,24,16,100,13,80,17,248,81,16,5,164,13,56,16,68,17,68,16,24,81, - 5,100,13,24,241,145,24,14,228,14,24,16,68,18,68,16,24,16,24,14,132,13,24,241, - 145,24,14,228,13,24,16,68,18,68,16,24,17,16,5,132,13,24,241,145,24,13,228,5, - 24,16,68,14,68,16,56,14,164,13,24,241,177,5,228,4,48,68,15,68,16,24,16,5, - 164,5,241,184,16,228,36,14,16,68,16,68,16,24,14,196,5,16,177,16,77,110,228,36, - 14,16,68,16,68,16,24,13,228,16,24,145,24,14,5,228,196,14,16,68,18,68,16,17, - 5,228,14,24,177,24,17,16,46,13,228,68,14,16,68,14,68,48,228,4,13,24,241,120, - 14,228,36,14,16,68,16,68,16,14,228,36,14,24,241,81,24,13,228,4,14,16,68,17, - 68,16,14,228,36,5,14,49,88,177,24,14,228,4,14,16,68,16,68,16,14,228,100,5, - 77,14,16,145,24,16,228,4,48,68,17,68,16,14,228,228,5,16,24,113,24,16,5,196, - 5,17,16,68,19,68,16,14,228,68,14,16,15,48,17,24,145,24,16,228,13,24,16,68, - 15,68,16,14,228,68,14,120,209,24,14,228,14,24,16,68,18,68,16,14,228,68,13,24, - 16,241,17,24,13,196,5,16,24,16,68,14,68,48,228,68,5,241,17,56,13,228,14,56, - 16,68,19,68,16,24,5,228,36,5,16,145,88,14,13,228,5,16,17,24,16,68,20,68, - 16,24,13,228,68,16,120,17,16,14,13,228,36,14,24,16,24,16,68,18,68,16,24,14, - 228,68,14,16,46,13,5,228,100,5,81,24,16,68,14,68,16,56,13,228,228,228,100,16, - 24,49,24,16,68,14,68,16,56,14,228,228,228,68,14,24,81,24,16,68,16,68,16,24, - 16,24,13,228,228,228,4,14,24,113,24,16,68,14,68,16,24,81,5,228,228,196,14,24, - 145,24,16,68,16,68,16,24,49,24,16,5,228,228,132,14,24,177,24,16,68,19,68,16, - 24,81,24,16,13,228,228,36,5,16,24,81,56,49,24,16,68,22,68,16,24,113,24,17, - 14,228,196,5,14,17,24,16,56,48,14,16,17,24,16,68,24,68,16,24,177,24,16,13, - 5,228,36,5,14,16,24,49,24,16,13,5,36,14,56,16,68,23,68,16,24,209,56,16, - 46,13,69,45,14,16,17,56,49,24,16,5,100,14,56,16,68,17,68,16,24,241,17,120, - 81,120,145,24,14,68,45,14,56,16,68,15,68,16,24,241,241,241,17,24,13,68,46,16, - 56,16,68,14,68,16,24,241,241,241,17,24,14,164,16,24,16,68,16,68,16,24,241,241, - 241,49,24,16,14,13,68,13,24,16,68,15,68,16,24,241,241,241,17,24,16,77,68,5, - 24,16,68,14,68,16,24,241,241,241,17,24,14,164,5,24,16,68,14,68,16,24,241,241, - 241,17,24,14,164,5,17,16,68,16,68,16,24,241,241,241,17,24,13,5,45,78,16,24, - 16,68,10,68,16,248,248,248,88,17,248,16,68,9,68,13,240,240,240,240,112,13,68,8, - 31,228,228,228,228,228,36,31,8,31,228,228,228,228,228,36,31,7,95,228,228,228,228,164, - 95,7,95,228,228,228,228,164,95,8,31,228,228,228,228,228,36,31,8,31,228,228,228,228, - 228,36,31,9,68,13,240,240,240,240,112,13,68,9,68,16,248,248,248,248,120,16,68,16, - 68,16,14,5,13,14,16,17,16,241,241,241,113,24,16,68,13,68,16,14,68,16,56,241, - 241,241,113,24,16,68,13,68,16,13,36,13,78,241,241,241,113,24,16,68,13,68,16,13, - 164,14,24,241,241,241,49,24,16,68,15,68,16,13,36,45,68,16,24,241,241,241,17,24, - 16,68,15,68,16,13,36,46,68,16,24,241,241,241,17,24,16,68,12,68,16,14,164,5, - 241,241,241,81,24,16,68,17,68,16,24,13,100,5,14,24,177,120,81,120,241,17,24,16, - 68,22,68,16,24,17,110,16,24,113,56,17,16,14,45,69,13,46,16,56,209,24,16,68, - 20,68,16,24,17,120,145,24,16,14,5,228,36,5,13,16,24,177,24,16,68,17,68,16, - 24,241,24,17,14,5,228,196,14,17,24,113,24,16,68,17,68,16,24,209,24,16,5,228, - 228,36,13,16,24,81,24,16,68,16,68,16,24,177,24,14,228,228,132,5,16,24,49,24, - 16,68,14,68,16,24,145,24,14,228,228,196,5,81,24,16,68,16,68,16,24,113,24,14, - 228,228,228,4,13,24,16,24,16,68,14,68,16,24,81,24,14,228,228,228,68,14,56,16, - 68,14,68,16,24,49,24,16,228,228,228,100,13,56,16,68,18,68,16,24,81,5,132,14, - 16,46,13,5,228,228,36,14,24,16,68,19,68,16,24,16,24,14,164,14,120,17,16,15, - 13,228,196,13,24,16,68,17,68,16,24,17,16,5,164,16,145,56,13,228,196,5,24,16, - 68,14,68,16,56,14,164,5,177,24,14,228,228,4,48,68,17,68,16,24,16,5,164,13, - 24,145,24,5,228,228,4,14,16,68,18,68,16,24,14,196,13,24,113,24,16,13,142,5, - 228,68,14,16,68,16,68,16,24,13,196,14,24,177,184,17,14,228,36,14,16,68,16,68, - 16,17,5,196,14,24,241,145,24,14,228,4,14,16,68,12,68,48,228,14,24,241,209,5, - 228,14,16,68,15,68,16,14,228,14,24,145,120,145,24,13,228,14,16,68,18,68,16,14, - 228,14,24,113,16,77,16,24,113,24,14,228,14,16,68,18,68,16,14,228,13,24,81,24, - 16,68,14,24,113,24,14,228,48,68,18,68,16,14,228,13,24,145,16,14,16,177,24,14, - 196,5,17,16,68,17,68,16,14,228,5,16,24,113,88,177,24,13,196,13,24,16,68,18, - 68,16,14,228,4,14,24,16,241,81,24,16,5,196,14,24,16,68,19,68,16,14,228,4, - 5,16,24,16,241,17,56,13,196,5,16,24,16,68,16,68,48,228,36,13,16,56,145,88, - 16,13,228,14,56,16,68,21,68,16,24,5,228,36,5,14,48,81,48,14,13,5,228,5, - 16,17,24,16,68,15,68,16,24,13,228,132,133,228,100,14,24,16,24,16,68,13,68,16, - 24,14,228,228,228,132,5,81,24,16,68,14,68,16,56,13,228,228,228,100,16,24,49,24, - 16,68,14,68,16,56,14,228,228,228,68,14,24,81,24,16,68,16,68,16,24,16,24,13, - 228,228,228,4,14,24,113,24,16,68,14,68,16,24,81,5,228,228,196,14,24,145,24,16, - 68,16,68,16,24,49,24,16,5,228,228,132,14,24,177,24,16,68,17,68,16,24,81,24, - 16,13,228,228,36,5,16,24,209,24,16,68,20,68,16,24,113,24,17,14,228,196,5,14, - 17,24,16,17,152,17,24,16,68,22,68,16,24,177,24,16,13,5,228,36,5,14,16,24, - 49,24,16,110,16,56,16,68,24,68,16,24,209,56,16,46,13,69,45,14,16,17,56,49, - 24,16,5,100,5,16,24,16,68,16,68,16,24,241,17,120,81,120,145,24,13,164,13,24, - 16,68,17,68,16,24,241,241,241,49,5,36,13,14,5,4,5,17,16,68,14,68,16,24, - 241,241,241,17,24,13,36,37,68,48,68,14,68,16,24,241,241,241,17,24,14,5,132,5, - 48,68,16,68,16,24,241,241,241,49,24,16,46,13,36,5,17,16,68,15,68,16,24,241, - 241,241,81,56,17,5,36,13,24,16,68,14,68,16,24,241,241,241,145,16,46,13,14,24, - 16,68,12,68,16,24,241,241,241,177,88,17,24,16,68,9,68,16,248,248,248,248,120,16, - 68,9,68,13,240,240,240,240,112,13,68,8,31,228,228,228,228,228,36,31,8,31,228,228, - 228,228,228,36,31,7,95,228,228,228,228,164,95,7,95,228,228,228,228,164,95,8,31,228, - 228,228,228,228,36,31,8,31,228,228,228,228,228,36,31,9,68,13,240,240,240,240,112,13, - 68,12,68,16,17,48,142,16,248,248,248,88,16,68,12,68,16,13,164,5,241,241,241,81, - 24,16,68,13,68,16,14,164,14,24,241,241,241,49,24,16,68,13,68,48,69,68,16,24, - 241,241,241,49,24,16,68,15,68,16,24,48,5,36,13,24,241,241,241,81,24,16,68,14, - 68,16,56,13,68,14,24,241,241,241,81,24,16,68,14,68,16,24,14,100,16,24,241,241, - 241,81,24,16,68,14,68,16,24,14,5,36,5,241,241,241,145,24,16,68,17,68,16,56, - 16,14,5,14,24,241,120,81,120,241,17,24,16,68,23,68,16,24,16,17,24,17,16,177, - 56,17,16,14,45,69,13,46,16,56,209,24,16,68,19,68,16,24,241,49,24,16,14,5, - 228,36,5,13,16,24,177,24,16,68,17,68,16,24,241,24,17,14,5,228,196,14,17,24, - 113,24,16,68,17,68,16,24,209,24,16,5,228,228,36,13,16,24,81,24,16,68,16,68, - 16,24,177,24,14,228,228,132,5,16,24,49,24,16,68,14,68,16,24,145,24,14,228,228, - 196,5,81,24,16,68,16,68,16,24,113,24,14,228,228,228,4,13,24,16,24,16,68,17, - 68,16,24,81,24,14,228,132,69,77,14,13,164,14,56,16,68,19,68,16,24,49,24,16, - 100,5,45,142,80,49,120,13,164,13,56,16,68,17,68,16,24,81,5,100,14,248,24,177, - 16,5,196,14,24,16,68,17,68,16,24,16,24,14,132,13,241,177,24,14,228,13,24,16, - 68,18,68,16,24,17,16,5,164,16,24,241,113,24,13,228,5,24,16,68,15,68,16,56, - 14,196,14,24,241,113,16,5,228,4,48,68,19,68,16,24,16,5,196,13,24,16,49,56, - 177,24,14,228,36,14,16,68,18,68,16,24,14,228,5,17,56,17,48,177,24,13,228,36, - 14,16,68,17,68,16,24,13,228,4,77,37,16,24,177,5,228,36,14,16,68,16,68,16, - 17,5,228,132,14,24,145,24,14,228,68,14,16,68,14,68,48,228,132,13,24,177,24,14, - 228,68,14,16,68,15,68,16,14,228,100,5,16,24,209,5,228,68,14,16,68,15,68,16, - 14,228,100,14,24,177,24,16,228,100,14,16,68,14,68,16,14,228,68,13,24,209,24,14, - 228,100,48,68,16,68,16,14,228,36,5,16,241,17,5,228,68,5,17,16,68,16,68,16, - 14,228,36,14,56,177,24,16,228,100,13,24,16,68,18,68,16,14,228,68,13,14,16,56, - 81,24,14,228,100,14,24,16,68,19,68,16,14,228,132,5,14,16,56,17,24,13,228,68, - 5,16,24,16,68,14,68,48,228,228,13,14,24,16,228,100,14,56,16,68,16,68,16,24, - 5,228,228,4,45,228,68,5,16,17,24,16,68,14,68,16,24,13,228,228,228,164,14,24, - 16,24,16,68,13,68,16,24,14,228,228,228,132,5,81,24,16,68,14,68,16,56,13,228, - 228,228,100,16,24,49,24,16,68,14,68,16,56,14,228,228,228,68,14,24,81,24,16,68, - 16,68,16,24,16,24,13,228,228,228,4,14,24,113,24,16,68,14,68,16,24,81,5,228, - 228,196,14,24,145,24,16,68,16,68,16,24,49,24,16,5,228,228,132,14,24,177,24,16, - 68,17,68,16,24,81,24,16,13,228,228,36,5,16,24,209,24,16,68,19,68,16,24,113, - 24,17,14,228,196,5,14,17,24,81,24,113,24,16,68,21,68,16,24,177,24,16,13,5, - 228,36,5,14,16,24,113,48,56,49,24,16,68,25,68,16,24,209,56,16,46,13,69,45, - 14,16,17,56,113,24,14,5,13,16,24,17,24,16,68,17,68,16,24,241,17,120,81,120, - 209,24,13,68,13,16,24,16,68,14,68,16,24,241,241,241,81,16,5,68,13,56,16,68, - 16,68,16,24,241,241,241,49,24,14,68,13,24,17,24,16,68,16,68,16,24,241,241,241, - 49,24,13,36,5,14,48,24,16,68,16,68,16,24,241,241,241,49,16,5,68,5,4,14, - 24,16,68,14,68,16,24,241,241,241,17,24,14,164,13,24,16,68,14,68,16,24,241,241, - 241,17,24,13,132,37,17,16,68,12,68,16,24,241,241,241,49,110,112,24,16,68,9,68, - 16,248,248,248,248,120,16,68,9,68,13,240,240,240,240,112,13,68,8,31,228,228,228,228, - 228,36,31,8,31,228,228,228,228,228,36,31,7,95,228,228,228,228,164,95,7,95,228,228, - 228,228,164,95,8,31,228,228,228,228,228,36,31,8,31,228,228,228,228,228,36,31,9,68, - 13,240,240,240,240,112,13,68,10,68,16,88,48,248,248,248,216,16,68,15,68,16,24,16, - 13,36,13,16,241,241,241,113,24,16,68,17,68,16,24,13,4,13,5,4,13,24,241,241, - 241,81,24,16,68,17,68,16,24,13,4,13,5,4,13,24,241,241,241,81,24,16,68,14, - 68,16,24,14,100,13,24,241,241,241,81,24,16,68,15,68,48,5,4,45,36,14,24,241, - 241,241,49,24,16,68,15,68,16,14,36,46,36,13,24,241,241,241,49,24,16,68,12,68, - 48,164,14,24,241,241,241,49,24,16,68,16,68,16,24,14,5,68,14,241,120,81,120,241, - 17,24,16,68,22,68,16,56,16,46,16,24,145,56,17,16,14,45,69,13,46,16,56,209, - 24,16,68,21,68,16,24,16,17,88,145,24,16,14,5,228,36,5,13,16,24,177,24,16, - 68,17,68,16,24,241,24,17,14,5,228,196,14,17,24,113,24,16,68,17,68,16,24,209, - 24,16,5,228,228,36,13,16,24,81,24,16,68,16,68,16,24,177,24,14,228,228,132,5, - 16,24,49,24,16,68,14,68,16,24,145,24,14,228,228,196,5,81,24,16,68,16,68,16, - 24,113,24,14,228,228,228,4,13,24,16,24,16,68,14,68,16,24,81,24,14,228,228,228, - 68,14,56,16,68,19,68,16,24,49,24,16,228,36,5,13,46,13,5,228,100,13,56,16, - 68,18,68,16,24,81,5,228,5,14,17,120,16,13,228,100,14,24,16,68,21,68,16,24, - 16,24,14,228,5,16,24,17,48,49,56,14,228,68,13,24,16,68,21,68,16,24,17,16, - 5,228,14,24,16,17,56,113,24,5,228,36,5,24,16,68,18,68,16,56,14,228,5,16, - 49,24,16,14,113,24,14,228,68,48,68,20,68,16,24,16,5,228,5,113,5,4,14,24, - 49,24,14,228,68,14,16,68,20,68,16,24,14,228,4,5,16,49,24,46,16,81,24,14, - 228,68,14,16,68,18,68,16,24,13,228,36,16,24,49,56,113,24,13,228,68,14,16,68, - 16,68,16,17,5,228,36,13,24,241,16,5,228,68,14,16,68,16,68,48,228,36,5,16, - 24,241,24,16,5,228,36,14,16,68,17,68,16,14,228,36,14,24,49,152,81,24,14,228, - 36,14,16,68,21,68,16,14,228,4,13,24,49,24,16,77,16,24,81,24,13,228,4,14, - 16,68,20,68,16,14,228,4,14,24,49,24,14,68,14,24,81,24,14,228,4,48,68,21, - 68,16,14,228,4,14,24,81,24,16,15,16,24,113,24,14,228,5,17,16,68,17,68,16, - 14,228,4,13,24,113,88,145,24,13,228,13,24,16,68,18,68,16,14,228,36,16,24,16, - 241,16,24,16,228,4,14,24,16,68,18,68,16,14,228,36,5,16,24,241,24,16,5,228, - 5,16,24,16,68,15,68,48,228,68,5,14,248,14,5,228,4,14,56,16,68,19,68,16, - 24,5,228,100,13,46,48,46,13,228,36,5,16,17,24,16,68,14,68,16,24,13,228,228, - 228,164,14,24,16,24,16,68,13,68,16,24,14,228,228,228,132,5,81,24,16,68,14,68, - 16,56,13,228,228,228,100,16,24,49,24,16,68,14,68,16,56,14,228,228,228,68,14,24, - 81,24,16,68,16,68,16,24,16,24,13,228,228,228,4,14,24,113,24,16,68,14,68,16, - 24,81,5,228,228,196,14,24,145,24,16,68,16,68,16,24,49,24,16,5,228,228,132,14, - 24,177,24,16,68,17,68,16,24,81,24,16,13,228,228,36,5,16,24,209,24,16,68,19, - 68,16,24,113,24,17,14,228,196,5,14,17,24,49,120,49,24,16,68,24,68,16,24,177, - 24,16,13,5,228,36,5,14,16,24,81,24,16,46,16,24,17,24,16,68,23,68,16,24, - 209,56,16,46,13,69,45,14,16,17,56,81,24,14,100,13,17,24,16,68,16,68,16,24, - 241,17,120,81,120,145,24,14,164,14,24,16,68,18,68,16,24,241,241,241,17,24,14,36, - 13,15,5,4,14,24,16,68,18,68,16,24,241,241,241,17,24,16,5,4,37,4,5,16, - 24,16,68,14,68,16,24,241,241,241,49,24,14,100,13,56,16,68,18,68,16,24,241,241, - 241,49,24,14,4,5,14,4,5,16,24,16,68,16,68,16,24,241,241,241,49,24,14,36, - 5,4,13,56,16,68,17,68,16,24,241,241,241,81,24,14,5,4,13,16,17,24,16,68, - 15,68,16,24,241,241,241,113,24,48,24,17,16,24,16,68,9,68,16,248,248,248,248,120, - 16,68,9,68,13,240,240,240,240,112,13,68,8,31,228,228,228,228,228,36,31,8,31,228, - 228,228,228,228,36,31,7,95,228,228,228,228,164,95,7,95,228,228,228,228,164,95,8,31, - 228,228,228,228,228,36,31,8,31,228,228,228,228,228,36,31,9,68,13,240,240,240,240,112, - 13,68,9,68,16,248,248,248,248,120,16,68,14,68,16,24,14,13,69,14,241,241,241,113, - 24,16,68,13,68,16,14,164,14,24,241,241,241,49,24,16,68,15,68,16,13,36,5,13, - 36,5,241,241,241,81,24,16,68,17,68,16,13,36,13,14,5,36,16,24,241,241,241,17, - 24,16,68,13,68,16,14,196,16,24,241,241,241,17,24,16,68,15,68,48,13,69,36,5, - 16,24,241,241,241,17,24,16,68,15,68,16,56,48,13,36,5,16,241,241,241,49,24,16, - 68,19,68,16,24,16,24,16,5,36,13,24,177,120,81,120,241,17,24,16,68,22,68,16, - 24,81,48,46,24,81,56,17,16,14,45,69,13,46,16,56,209,24,16,68,20,68,16,24, - 113,88,81,24,16,14,5,228,36,5,13,16,24,177,24,16,68,17,68,16,24,241,24,17, - 14,5,228,196,14,17,24,113,24,16,68,17,68,16,24,209,24,16,5,228,228,36,13,16, - 24,81,24,16,68,16,68,16,24,177,24,14,228,228,132,5,16,24,49,24,16,68,14,68, - 16,24,145,24,14,228,228,196,5,81,24,16,68,16,68,16,24,113,24,14,228,228,228,4, - 13,24,16,24,16,68,14,68,16,24,81,24,14,228,228,228,68,14,56,16,68,14,68,16, - 24,49,24,16,228,228,228,100,13,56,16,68,18,68,16,24,81,5,228,5,13,46,112,14, - 13,228,68,14,24,16,68,20,68,16,24,16,24,14,196,5,14,17,248,24,14,5,228,4, - 13,24,16,68,20,68,16,24,17,16,5,164,5,16,24,241,49,24,14,228,4,5,24,16, - 68,17,68,16,56,14,196,16,24,16,241,49,16,24,13,228,4,48,68,18,68,16,24,16, - 5,164,13,24,209,24,145,24,16,228,4,14,16,68,19,68,16,24,14,196,14,24,145,24, - 48,17,24,113,24,5,228,14,16,68,22,68,16,24,13,196,14,24,113,24,16,5,4,5, - 16,24,81,24,13,228,14,16,68,20,68,16,17,5,196,14,24,113,24,16,69,16,24,81, - 24,14,228,14,16,68,18,68,48,228,14,24,145,24,17,16,17,24,113,24,14,228,14,16, - 68,15,68,16,14,228,13,24,209,24,177,24,14,228,14,16,68,16,68,16,14,228,4,14, - 24,16,241,113,24,14,228,14,16,68,14,68,16,14,228,4,5,16,248,145,24,14,228,48, - 68,19,68,16,14,228,68,13,14,112,14,16,24,113,24,13,196,5,17,16,68,17,68,16, - 14,228,164,37,4,5,16,145,24,13,196,13,24,16,68,15,68,16,14,228,228,4,14,24, - 177,5,196,14,24,16,68,15,68,16,14,228,228,5,209,16,5,164,5,16,24,16,68,13, - 68,48,228,228,14,49,152,16,196,14,56,16,68,19,68,16,24,5,228,228,5,45,46,16, - 24,14,164,5,16,17,24,16,68,15,68,16,24,13,228,228,164,37,164,14,24,16,24,16, - 68,13,68,16,24,14,228,228,228,132,5,81,24,16,68,14,68,16,56,13,228,228,228,100, - 16,24,49,24,16,68,14,68,16,56,14,228,228,228,68,14,24,81,24,16,68,16,68,16, - 24,16,24,13,228,228,228,4,14,24,113,24,16,68,14,68,16,24,81,5,228,228,196,14, - 24,145,24,16,68,16,68,16,24,49,24,16,5,228,228,132,14,24,177,24,16,68,18,68, - 16,24,81,24,16,13,228,228,36,5,16,24,16,177,24,16,68,19,68,16,24,113,24,17, - 14,228,196,5,14,17,24,17,88,113,24,16,68,22,68,16,24,177,24,16,13,5,228,36, - 5,14,16,24,17,24,78,48,81,24,16,68,24,68,16,24,209,56,16,46,13,69,45,14, - 16,17,56,49,24,13,68,16,24,49,24,16,68,17,68,16,24,241,17,120,81,120,145,24, - 13,36,13,80,56,16,68,16,68,16,24,241,241,241,49,5,36,5,36,5,14,24,16,68, - 13,68,16,24,241,241,241,49,5,164,5,24,16,68,13,68,16,24,241,241,241,49,5,36, - 46,68,48,68,16,68,16,24,241,241,241,17,24,13,36,37,36,5,17,16,68,14,68,16, - 24,241,241,241,17,24,16,164,14,24,16,68,14,68,16,24,241,241,241,49,24,16,109,14, - 56,16,68,12,68,16,24,241,241,241,81,184,16,24,16,68,9,68,16,248,248,248,248,120, - 16,68,9,68,13,240,240,240,240,112,13,68,8,31,228,228,228,228,228,36,31,8,31,228, - 228,228,228,228,36,31,7,95,228,228,228,228,164,95,7,95,228,228,228,228,164,95,8,31, - 228,228,228,228,228,36,31,8,31,228,228,228,228,228,36,31,11,68,13,16,15,240,240,240, - 240,48,13,68,11,68,16,56,16,78,248,248,248,184,16,68,16,68,16,24,14,4,46,13, - 5,16,241,241,241,81,24,16,68,14,68,48,37,14,56,45,24,241,241,241,49,24,16,68, - 18,68,16,46,17,4,14,24,16,5,16,24,241,241,241,17,24,16,68,19,68,16,13,14, - 24,14,5,16,24,5,16,24,241,241,241,17,24,16,68,17,68,16,14,13,56,14,5,16, - 5,16,241,241,241,49,24,16,68,18,68,16,24,5,14,17,24,13,4,14,24,241,241,241, - 49,24,16,68,17,68,16,24,16,13,5,13,5,14,24,241,241,241,81,24,16,68,16,68, - 16,88,16,14,16,24,241,120,81,120,241,17,24,16,68,20,68,16,24,49,88,177,56,17, - 16,14,45,69,13,46,16,56,209,24,16,68,19,68,16,24,241,49,24,16,14,5,228,36, - 5,13,16,24,177,24,16,68,17,68,16,24,241,24,17,14,5,228,196,14,17,24,113,24, - 16,68,17,68,16,24,209,24,16,5,228,228,36,13,16,24,81,24,16,68,16,68,16,24, - 177,24,14,228,228,132,5,16,24,49,24,16,68,14,68,16,24,145,24,14,228,228,196,5, - 81,24,16,68,16,68,16,24,113,24,14,228,228,228,4,13,24,16,24,16,68,17,68,16, - 24,81,24,14,228,4,5,109,5,228,100,14,56,16,68,22,68,16,24,49,24,16,196,5, - 14,16,17,120,17,16,14,5,228,4,13,56,16,68,18,68,16,24,81,5,164,13,16,248, - 56,16,13,228,4,14,24,16,68,23,68,16,24,16,24,14,164,14,56,49,16,110,16,17, - 24,17,24,14,228,13,24,16,68,25,68,16,24,17,16,5,132,14,24,16,17,16,5,164, - 13,14,24,17,24,14,196,5,24,16,68,20,68,16,56,14,132,13,24,17,24,49,13,228, - 14,24,17,24,13,196,48,68,25,68,16,24,16,5,100,5,16,24,17,14,17,24,17,13, - 228,14,24,17,16,5,164,14,16,68,22,68,16,24,14,132,13,56,14,4,14,24,17,16, - 5,228,14,56,13,164,14,16,68,20,68,16,24,13,132,16,56,13,36,14,56,16,228,13, - 56,16,164,14,16,68,23,68,16,17,5,100,5,16,24,16,68,5,16,56,14,228,16,24, - 16,5,132,14,16,68,20,68,48,132,13,56,14,100,5,16,17,24,14,196,14,56,13,132, - 14,16,68,21,68,16,14,132,13,56,14,132,13,24,17,24,13,164,14,56,13,132,14,16, - 68,21,68,16,14,132,13,56,14,164,13,24,17,24,13,132,14,56,13,132,14,16,68,20, - 68,16,14,132,13,56,14,196,14,24,17,16,5,100,14,56,13,132,48,68,23,68,16,14, - 132,5,16,24,16,228,14,56,16,5,68,16,24,16,5,100,5,17,16,68,20,68,16,14, - 164,16,56,13,228,16,56,14,36,13,56,16,132,13,24,16,68,22,68,16,14,164,13,56, - 14,228,5,16,17,24,14,4,14,56,13,132,14,24,16,68,25,68,16,14,164,5,16,17, - 24,14,228,13,17,24,17,14,17,24,16,5,100,5,16,24,16,68,20,68,48,196,13,24, - 17,24,14,228,13,49,24,17,24,13,132,14,56,16,68,25,68,16,24,5,196,14,24,17, - 24,14,13,164,5,16,17,16,24,14,132,5,16,17,24,16,68,23,68,16,24,13,228,14, - 24,17,24,17,16,110,16,49,56,14,164,14,24,16,24,16,68,18,68,16,24,14,228,4, - 13,16,248,56,16,13,164,5,81,24,16,68,22,68,16,56,13,228,4,5,14,16,17,120, - 17,16,14,5,196,16,24,49,24,16,68,17,68,16,56,14,228,100,5,109,5,228,4,14, - 24,81,24,16,68,16,68,16,24,16,24,13,228,228,228,4,14,24,113,24,16,68,14,68, - 16,24,81,5,228,228,196,14,24,145,24,16,68,16,68,16,24,49,24,16,5,228,228,132, - 14,24,177,24,16,68,17,68,16,24,81,24,16,13,228,228,36,5,16,24,209,24,16,68, - 17,68,16,24,113,24,17,14,228,196,5,14,17,24,241,24,16,68,19,68,16,24,177,24, - 16,13,5,228,36,5,14,16,24,241,49,24,16,68,20,68,16,24,209,56,16,46,13,69, - 45,14,16,17,56,177,88,49,24,16,68,16,68,16,24,241,17,120,81,120,241,24,16,14, - 16,88,16,68,17,68,16,24,241,241,241,81,24,14,5,13,5,13,16,24,16,68,18,68, - 16,24,241,241,241,49,24,14,4,13,24,17,14,5,24,16,68,17,68,16,24,241,241,241, - 49,16,5,16,5,14,56,13,14,16,68,19,68,16,24,241,241,241,17,24,16,5,24,16, - 5,14,24,14,13,16,68,18,68,16,24,241,241,241,17,24,16,5,16,24,14,4,17,46, - 16,68,14,68,16,24,241,241,241,49,24,45,56,14,37,48,68,16,68,16,24,241,241,241, - 81,16,5,13,46,4,14,24,16,68,11,68,16,248,248,248,184,78,16,56,16,68,11,68, - 13,240,240,240,240,48,15,16,13,68,8,31,228,228,228,228,228,36,31,8,31,228,228,228, - 228,228,36,31,7,95,228,228,228,228,164,95,7,95,228,228,228,228,164,95,8,31,228,228, - 228,228,228,36,31,8,31,228,228,228,228,228,36,31,9,68,13,240,240,240,240,112,13,68, - 13,68,16,56,16,24,16,17,248,248,248,184,16,68,14,68,48,5,4,37,14,24,241,241, - 241,113,24,16,68,16,68,16,14,4,46,4,5,16,24,241,241,241,81,24,16,68,15,68, - 16,14,5,24,80,14,24,241,241,241,81,24,16,68,14,68,48,13,49,56,46,24,241,241, - 241,49,24,16,68,18,68,16,24,14,16,24,17,24,14,13,24,241,241,241,49,24,16,68, - 17,68,16,24,16,78,24,14,4,16,24,241,241,241,17,24,16,68,16,68,16,24,17,14, - 36,5,4,5,241,241,241,81,24,16,68,17,68,16,24,17,24,110,16,24,177,120,81,120, - 241,17,24,16,68,21,68,16,24,49,16,120,113,56,17,16,14,45,69,13,46,16,56,209, - 24,16,68,19,68,16,24,241,49,24,16,14,5,228,36,5,13,16,24,177,24,16,68,17, - 68,16,24,241,24,17,14,5,228,196,14,17,24,113,24,16,68,18,68,16,24,209,24,16, - 5,228,5,228,4,13,16,24,81,24,16,68,19,68,16,24,177,24,14,228,4,5,14,228, - 36,5,16,24,49,24,16,68,18,68,16,24,145,24,14,228,36,5,16,13,228,36,5,81, - 24,16,68,23,68,16,24,113,24,14,36,45,78,45,5,4,5,17,16,228,68,13,24,16, - 24,16,68,21,68,16,24,81,24,14,4,13,16,216,48,14,16,24,14,228,68,14,56,16, - 68,20,68,16,24,49,24,16,4,13,56,241,56,49,24,13,228,36,13,56,16,68,18,68, - 16,24,81,37,16,24,241,145,24,16,5,228,36,14,24,16,68,23,68,16,24,16,24,14, - 4,13,24,113,88,17,88,113,24,16,5,228,4,13,24,16,68,26,68,16,24,17,16,5, - 4,14,24,81,24,16,14,13,5,45,16,81,88,17,13,228,5,24,16,68,20,68,16,56, - 14,36,14,24,49,24,16,5,100,5,88,48,110,5,228,48,68,24,68,16,24,16,5,36, - 13,24,49,24,13,100,5,48,14,13,5,36,5,228,68,14,16,68,19,68,16,24,14,68, - 5,49,24,16,132,14,13,164,46,228,36,14,16,68,17,68,16,24,13,100,16,56,14,228, - 164,16,14,228,4,14,16,68,17,68,16,17,5,100,14,56,16,228,164,13,24,14,228,14, - 16,68,16,68,48,132,5,17,24,16,228,196,16,24,13,196,14,16,68,18,68,16,14,164, - 14,24,16,5,228,164,14,24,16,5,164,14,16,68,18,68,16,14,164,5,16,24,13,228, - 164,5,17,24,14,164,14,16,68,16,68,16,14,196,13,24,14,228,164,5,16,56,5,132, - 48,68,17,68,16,14,228,14,24,5,228,164,16,56,14,100,5,17,16,68,18,68,16,14, - 228,4,46,228,164,16,24,17,16,5,68,13,24,16,68,21,68,16,14,228,36,14,13,164, - 13,14,132,16,24,17,24,13,68,14,24,16,68,24,68,16,14,228,68,5,68,5,14,16, - 17,5,100,13,24,49,24,14,36,5,16,24,16,68,22,68,48,228,5,77,46,16,17,56, - 13,100,5,16,24,49,24,14,36,14,56,16,68,24,68,16,24,5,196,5,14,152,49,16, - 109,14,16,24,81,24,14,4,5,16,17,24,16,68,22,68,16,24,13,228,4,13,16,17, - 16,113,184,113,24,13,4,14,24,16,24,16,68,19,68,16,24,14,228,36,5,16,24,241, - 113,16,24,16,37,81,24,16,68,20,68,16,56,13,228,36,13,81,56,241,24,17,13,4, - 16,24,49,24,16,68,22,68,16,56,14,228,68,13,24,17,80,17,152,16,14,13,4,14, - 24,81,24,16,68,22,68,16,24,16,24,13,228,68,14,24,13,4,37,141,5,36,14,24, - 113,24,16,68,18,68,16,24,81,5,228,36,5,16,13,228,36,14,24,145,24,16,68,19, - 68,16,24,49,24,16,5,228,36,14,13,228,4,14,24,177,24,16,68,18,68,16,24,81, - 24,16,13,228,4,37,196,5,16,24,209,24,16,68,17,68,16,24,113,24,17,14,228,196, - 5,14,17,24,241,24,16,68,22,68,16,24,177,24,16,13,5,228,36,5,14,16,24,113, - 56,17,24,49,24,16,68,23,68,16,24,209,56,16,46,13,69,45,14,16,17,56,113,24, - 80,14,24,17,24,16,68,18,68,16,24,241,17,120,81,120,177,24,14,36,37,16,17,24, - 16,68,19,68,16,24,241,241,241,17,24,16,4,5,14,13,5,14,16,24,16,68,16,68, - 16,24,241,241,241,81,5,14,24,16,24,48,24,16,68,17,68,16,24,241,241,241,49,24, - 46,24,17,24,16,13,24,16,68,16,68,16,24,241,241,241,81,16,14,56,16,24,13,14, - 16,68,17,68,16,24,241,241,241,81,24,15,14,13,14,16,5,14,16,68,15,68,16,24, - 241,241,241,113,16,5,4,5,36,14,16,68,13,68,16,24,241,241,241,113,24,16,110,24, - 16,68,9,68,16,248,248,248,248,120,16,68,11,68,13,240,240,240,240,48,15,16,13,68, - 8,31,228,228,228,228,228,36,31,8,31,228,228,228,228,228,36,31,7,95,228,228,228,228, - 164,95,7,95,228,228,228,228,164,95,8,31,228,228,228,228,228,36,31,8,31,228,228,228, - 228,228,36,31,9,68,13,240,240,240,240,112,13,68,9,68,16,248,248,248,248,120,16,68, - 18,68,16,24,17,24,17,24,16,46,17,24,241,241,241,17,24,16,68,16,68,16,24,80, - 24,13,36,13,16,24,241,241,241,24,16,68,19,68,16,24,14,4,14,24,14,13,5,4, - 14,24,241,241,241,24,16,68,18,68,16,14,4,5,4,45,5,4,5,16,24,241,241,241, - 24,16,68,17,68,16,14,5,4,5,13,36,13,14,241,241,241,49,24,16,68,16,68,16, - 24,14,5,15,14,100,15,24,241,241,241,24,16,68,17,68,16,24,17,16,24,14,45,37, - 14,24,241,241,241,24,16,68,16,68,16,24,81,88,17,48,145,120,81,120,241,17,24,16, - 68,20,68,16,24,209,24,81,56,17,16,14,45,69,13,46,16,56,209,24,16,68,19,68, - 16,24,241,49,24,16,14,5,228,36,5,13,16,24,177,24,16,68,17,68,16,24,241,24, - 17,14,5,228,196,14,17,24,113,24,16,68,17,68,16,24,209,24,16,5,228,228,36,13, - 16,24,81,24,16,68,16,68,16,24,177,24,14,228,228,132,5,16,24,49,24,16,68,14, - 68,16,24,145,24,14,228,228,196,5,81,24,16,68,16,68,16,24,113,24,14,228,228,228, - 4,13,24,16,24,16,68,14,68,16,24,81,24,14,228,228,228,68,14,56,16,68,20,68, - 16,24,49,24,16,228,68,5,4,13,46,13,5,228,36,13,56,16,68,21,68,16,24,81, - 5,228,5,14,48,5,16,88,48,14,13,5,196,14,24,16,68,24,68,16,24,16,24,14, - 196,13,14,16,88,14,16,113,88,17,16,14,13,100,13,24,16,68,24,68,16,24,17,16, - 5,100,5,14,16,56,81,16,113,120,49,56,16,5,68,5,24,16,68,23,68,16,56,14, - 68,13,14,17,56,17,152,49,24,17,110,16,24,16,24,16,132,48,68,27,68,16,24,16, - 5,36,5,16,24,81,24,16,77,14,16,24,14,13,100,5,14,56,14,132,14,16,68,22, - 68,16,24,14,100,15,24,49,24,14,132,5,16,5,196,14,24,13,132,14,16,68,21,68, - 16,24,13,100,13,24,16,24,14,196,13,14,196,5,24,5,132,14,16,68,20,68,16,17, - 5,100,5,16,24,16,228,4,14,5,196,14,5,132,14,16,68,15,68,48,164,14,24,14, - 228,4,45,196,14,164,14,16,68,18,68,16,14,164,13,24,13,228,4,5,14,164,5,13, - 164,14,16,68,17,68,16,14,196,16,13,228,4,5,16,5,132,45,164,14,16,68,17,68, - 16,14,196,14,13,228,4,13,24,14,132,14,5,164,48,68,19,68,16,14,196,5,13,228, - 4,14,24,16,100,13,16,164,5,17,16,68,20,68,16,14,228,13,228,5,16,17,24,13, - 36,13,24,14,164,13,24,16,68,21,68,16,14,228,45,196,14,24,16,24,14,5,14,17, - 24,13,164,14,24,16,68,21,68,16,14,228,4,16,13,100,5,14,24,145,24,49,5,132, - 5,16,24,16,68,21,68,48,228,4,14,24,46,13,14,16,24,16,145,16,24,16,164,14, - 56,16,68,21,68,16,24,5,228,5,16,120,49,152,17,16,24,14,132,5,16,17,24,16, - 68,25,68,16,24,13,228,4,14,24,48,17,24,17,14,45,14,48,56,13,132,14,24,16, - 24,16,68,20,68,16,24,14,228,4,13,88,16,14,5,132,5,45,132,5,81,24,16,68, - 17,68,16,56,13,228,4,46,13,5,228,196,16,24,49,24,16,68,14,68,16,56,14,228, - 228,228,68,14,24,81,24,16,68,16,68,16,24,16,24,13,228,228,228,4,14,24,113,24, - 16,68,14,68,16,24,81,5,228,228,196,14,24,145,24,16,68,16,68,16,24,49,24,16, - 5,228,228,132,14,24,177,24,16,68,17,68,16,24,81,24,16,13,228,228,36,5,16,24, - 209,24,16,68,17,68,16,24,113,24,17,14,228,196,5,14,17,24,241,24,16,68,19,68, - 16,24,177,24,16,13,5,228,36,5,14,16,24,241,49,24,16,68,22,68,16,24,209,56, - 16,46,13,69,45,14,16,17,56,49,48,17,88,81,24,16,68,19,68,16,24,241,17,120, - 81,120,113,24,14,5,77,14,24,49,24,16,68,16,68,16,24,241,241,241,24,14,100,14, - 15,5,14,24,16,68,18,68,16,24,241,241,241,17,16,14,13,36,13,5,4,5,14,16, - 68,18,68,16,24,241,241,241,24,16,5,4,5,45,4,5,4,14,16,68,19,68,16,24, - 241,241,241,24,14,4,5,13,14,24,14,4,14,24,16,68,18,68,16,24,241,241,241,24, - 16,5,36,13,24,16,15,16,24,16,68,18,68,16,24,241,241,241,17,24,16,46,16,24, - 17,24,17,24,16,68,13,68,16,24,241,241,241,81,56,113,16,24,16,68,9,68,16,248, - 248,248,248,120,16,68,9,68,13,240,240,240,240,112,13,68,8,31,228,228,228,228,228,36, - 31,8,31,228,228,228,228,228,36,31,7,95,228,228,228,228,164,95,7,95,228,228,228,228, - 164,95,8,31,228,228,228,228,228,36,31,8,31,228,228,228,228,228,36,31,9,68,13,242, - 242,242,242,114,13,68,10,68,18,119,50,247,247,247,183,18,68,15,68,18,23,18,14,101, - 14,23,243,243,243,51,23,18,68,14,68,18,23,5,164,13,23,243,243,243,19,23,18,68, - 16,68,18,14,36,5,14,5,68,14,23,243,243,243,23,18,68,17,68,18,5,4,5,19, - 55,5,36,5,23,243,243,243,23,18,68,17,68,18,5,4,5,18,55,5,36,5,23,243, - 243,243,23,18,68,16,68,18,5,36,5,14,5,68,13,23,243,243,243,23,18,68,14,68, - 50,196,5,18,23,243,19,23,243,179,23,18,68,18,68,18,23,15,5,100,5,18,23,147, - 119,83,119,243,19,23,18,68,23,68,18,55,18,15,46,18,19,23,83,87,18,14,13,133, - 14,15,18,55,211,23,18,68,20,68,18,23,19,151,115,23,18,14,5,228,36,5,13,18, - 23,179,23,18,68,16,68,18,23,243,23,19,14,5,228,196,14,55,115,23,18,68,17,68, - 18,23,211,23,18,5,228,228,36,5,18,23,83,23,18,68,16,68,18,23,179,23,14,228, - 228,132,5,18,23,51,23,18,68,16,68,18,23,147,23,14,228,228,196,5,19,23,19,23, - 18,68,16,68,18,23,115,23,14,228,228,228,4,13,23,19,23,18,68,14,68,18,23,83, - 23,14,228,228,228,68,18,55,18,68,15,68,18,23,51,23,18,228,36,165,228,100,5,55, - 18,68,17,68,18,23,83,5,228,13,50,119,50,13,228,68,18,23,18,68,20,68,18,23, - 19,23,14,196,13,18,87,115,87,18,13,228,4,13,23,18,68,17,68,18,55,18,5,164, - 14,55,243,51,55,14,228,5,23,18,68,14,68,18,55,14,164,14,23,243,179,23,14,228, - 50,68,17,68,18,23,18,5,132,5,23,147,151,179,23,5,196,15,18,68,21,68,18,23, - 15,164,18,23,83,55,14,37,13,18,23,147,23,18,196,14,18,68,19,68,18,23,5,132, - 5,23,147,5,132,15,23,147,23,5,164,14,18,68,20,68,18,19,5,132,14,23,83,23, - 14,196,18,23,115,23,14,164,14,18,68,18,68,50,164,15,23,83,23,13,196,18,23,115, - 23,15,164,14,18,68,19,68,18,15,164,15,23,83,23,14,196,18,23,115,23,15,164,14, - 18,68,20,68,18,14,164,14,23,83,23,18,5,132,14,23,147,23,14,164,15,18,68,19, - 68,18,14,164,5,23,115,23,18,14,69,15,23,179,23,5,164,50,68,18,68,18,14,196, - 18,23,115,87,19,55,179,23,18,164,5,19,18,68,15,68,18,14,196,13,23,243,243,23, - 13,164,5,23,18,68,15,68,18,14,228,14,23,243,179,23,14,196,15,23,18,68,17,68, - 18,15,228,4,14,55,243,51,55,14,196,5,18,23,18,68,16,68,50,228,36,13,18,87, - 115,87,18,13,228,14,55,18,68,19,68,18,23,5,228,36,5,14,50,119,50,14,5,228, - 5,18,55,18,68,15,68,18,23,13,228,132,165,228,68,14,23,19,23,18,68,13,68,18, - 23,18,228,228,228,132,5,83,23,18,68,14,68,18,55,5,228,228,228,100,18,23,51,23, - 18,68,14,68,18,55,18,228,228,228,68,14,23,83,23,18,68,16,68,18,23,19,23,13, - 228,228,228,4,14,23,115,23,18,68,16,68,18,23,19,23,19,5,228,228,196,14,23,147, - 23,18,68,16,68,18,23,51,23,18,5,228,228,132,14,23,179,23,18,68,17,68,18,23, - 83,23,18,5,228,228,36,5,18,23,211,23,18,68,18,68,18,23,115,55,14,228,196,5, - 14,19,23,19,183,19,23,18,68,24,68,18,23,179,23,18,13,5,228,36,5,14,18,55, - 19,23,18,14,45,14,18,55,18,68,23,68,18,23,211,55,18,15,14,133,13,14,18,87, - 51,23,15,5,100,5,14,23,18,68,14,68,18,23,243,19,119,83,119,115,23,18,228,50, - 68,18,68,18,23,243,179,23,243,19,23,13,68,13,14,5,36,5,18,68,16,68,18,23, - 243,243,243,23,5,36,5,87,5,4,5,18,68,18,68,18,23,243,243,243,23,5,36,5, - 19,23,18,5,4,5,18,68,16,68,18,23,243,243,243,23,15,68,5,13,5,36,14,18, - 68,14,68,18,23,243,243,243,19,23,14,164,5,23,18,68,14,68,18,23,243,243,243,51, - 23,15,101,14,55,18,68,14,68,18,23,243,243,243,83,55,51,55,19,23,18,68,9,68, - 18,247,247,247,247,119,18,68,9,68,13,242,242,242,242,114,13,68,8,31,228,228,228,228, - 228,36,31,8,31,228,228,228,228,228,36,31,7,95,228,228,228,228,164,95,7,95,228,228, - 228,228,164,95,8,31,228,228,228,228,228,36,31,8,31,228,228,228,228,228,36,31,9,68, - 13,242,242,242,242,114,13,68,12,68,18,87,18,15,14,247,247,247,183,18,68,15,68,18, - 23,15,37,36,18,23,243,243,243,83,23,18,68,14,68,18,23,14,100,18,23,243,243,243, - 83,23,18,68,14,68,18,23,15,100,18,23,243,243,243,83,23,18,68,15,68,18,23,50, - 5,36,14,23,243,243,243,83,23,18,68,15,68,18,55,18,5,36,14,23,243,243,243,83, - 23,18,68,14,68,18,55,18,68,13,23,243,243,243,83,23,18,68,15,68,18,55,18,68, - 5,23,243,115,23,243,179,23,18,68,15,68,18,55,14,68,5,243,119,83,119,243,19,23, - 18,68,21,68,18,55,50,79,19,23,83,87,18,14,13,133,14,15,18,55,211,23,18,68, - 20,68,18,23,19,151,115,23,18,14,5,228,36,5,13,18,23,179,23,18,68,16,68,18, - 23,243,23,19,14,5,228,196,14,55,115,23,18,68,17,68,18,23,211,23,18,5,228,228, - 36,5,18,23,83,23,18,68,16,68,18,23,179,23,14,228,228,132,5,18,23,51,23,18, - 68,16,68,18,23,147,23,14,228,228,196,5,19,23,19,23,18,68,16,68,18,23,115,23, - 14,228,228,228,4,13,23,19,23,18,68,17,68,18,23,83,23,14,228,132,5,13,14,228, - 68,18,55,18,68,19,68,18,23,51,23,18,228,68,5,14,50,23,18,228,68,5,55,18, - 68,20,68,18,23,83,5,228,5,14,18,19,87,19,18,5,228,68,18,23,18,68,19,68, - 18,23,19,23,14,196,5,18,87,147,23,5,228,68,13,23,18,68,17,68,18,55,18,5, - 228,18,23,211,23,5,228,68,5,23,18,68,15,68,18,55,14,228,4,14,23,211,23,13, - 228,100,50,68,17,68,18,23,18,5,228,4,13,23,211,23,14,228,100,15,18,68,16,68, - 18,23,15,228,36,5,87,147,23,15,228,100,14,18,68,19,68,18,23,5,228,68,18,15, - 13,19,23,83,23,18,228,100,14,18,68,18,68,18,19,5,228,68,5,4,5,23,115,23, - 18,228,100,14,18,68,15,68,50,228,164,13,23,115,23,18,5,228,68,14,18,68,14,68, - 18,15,228,164,14,23,179,5,228,68,14,18,68,15,68,18,14,228,164,14,23,147,23,5, - 228,68,15,18,68,14,68,18,14,228,164,15,23,147,23,13,228,68,50,68,16,68,18,14, - 228,164,18,23,147,23,14,228,36,5,19,18,68,16,68,18,14,228,164,18,23,147,23,14, - 228,36,5,23,18,68,17,68,18,14,228,132,5,18,23,147,23,15,228,36,15,23,18,68, - 16,68,18,15,228,132,5,211,23,18,228,4,5,18,23,18,68,13,68,50,228,132,5,247, - 18,228,4,14,55,18,68,17,68,18,23,5,228,100,5,210,19,18,5,196,5,18,55,18, - 68,15,68,18,23,13,228,228,36,101,228,14,23,19,23,18,68,13,68,18,23,18,228,228, - 228,132,5,83,23,18,68,14,68,18,55,5,228,228,228,100,18,23,51,23,18,68,14,68, - 18,55,18,228,228,228,68,14,23,83,23,18,68,16,68,18,23,19,23,13,228,228,228,4, - 14,23,115,23,18,68,16,68,18,23,19,23,19,5,228,228,196,14,23,147,23,18,68,16, - 68,18,23,51,23,18,5,228,228,132,14,23,179,23,18,68,17,68,18,23,83,23,18,5, - 228,228,36,5,18,23,211,23,18,68,18,68,18,23,115,55,14,228,196,5,14,19,23,19, - 151,51,23,18,68,23,68,18,23,179,23,18,13,5,228,36,5,14,18,23,51,23,110,18, - 23,19,23,18,68,23,68,18,23,211,55,18,15,14,133,13,14,18,87,83,23,5,68,13, - 23,19,23,18,68,20,68,18,23,243,19,119,83,119,179,23,14,4,5,4,14,23,19,23, - 18,68,17,68,18,23,243,179,23,243,83,23,14,68,15,23,19,23,18,68,16,68,18,23, - 243,243,243,51,23,18,68,18,23,19,23,18,68,15,68,18,23,243,243,243,51,23,18,68, - 14,18,55,18,68,14,68,18,23,243,243,243,51,23,18,100,14,55,18,68,15,68,18,23, - 243,243,243,51,23,19,5,68,5,55,18,68,17,68,18,23,243,243,243,83,23,5,4,5, - 13,15,19,23,18,68,16,68,18,23,243,243,243,83,23,14,15,18,55,19,23,18,68,9, - 68,18,247,247,247,247,119,18,68,9,68,13,242,242,242,242,114,13,68,8,31,228,228,228, - 228,228,36,31,8,31,228,228,228,228,228,36,31,7,95,228,228,228,228,164,95,7,95,228, - 228,228,228,164,95,8,31,228,228,228,228,228,36,31,8,31,228,228,228,228,228,36,31,9, - 68,13,242,242,242,242,114,13,68,14,68,18,23,18,37,13,14,19,247,247,247,151,18,68, - 15,68,18,23,15,100,5,18,23,243,243,243,51,23,18,68,15,68,18,23,14,37,68,5, - 23,243,243,243,51,23,18,68,16,68,18,23,50,15,5,36,5,23,243,243,243,51,23,18, - 68,14,68,18,23,5,132,13,23,243,243,243,51,23,18,68,15,68,50,68,5,13,14,19, - 23,243,243,243,51,23,18,68,15,68,18,14,68,13,46,18,23,243,243,243,51,23,18,68, - 14,68,18,13,164,14,23,243,83,23,243,179,23,18,68,15,68,18,5,164,13,23,179,119, - 83,119,243,19,23,18,68,22,68,18,15,14,13,69,4,5,115,87,18,14,13,133,14,15, - 18,55,211,23,18,68,19,68,18,151,82,83,23,18,14,5,228,36,5,13,18,23,179,23, - 18,68,18,68,18,23,115,87,19,23,19,14,5,228,196,14,55,115,23,18,68,17,68,18, - 23,211,23,18,5,228,228,36,5,18,23,83,23,18,68,16,68,18,23,179,23,14,228,228, - 132,5,18,23,51,23,18,68,16,68,18,23,147,23,14,228,228,196,5,19,23,19,23,18, - 68,18,68,18,23,115,23,14,164,5,13,37,228,196,13,23,19,23,18,68,19,68,18,23, - 83,23,14,196,18,55,19,50,14,5,228,100,18,55,18,68,19,68,18,23,51,23,18,228, - 18,23,51,119,18,13,228,36,5,55,18,68,19,68,18,23,83,5,196,5,19,23,179,55, - 18,5,228,4,18,23,18,68,19,68,18,23,19,23,14,228,5,23,243,19,23,18,5,228, - 13,23,18,68,17,68,18,55,18,5,228,14,23,243,51,23,14,228,5,23,18,68,15,68, - 18,55,14,228,4,15,183,147,23,18,228,4,50,68,19,68,18,23,18,5,228,4,133,14, - 18,23,115,23,18,5,228,15,18,68,17,68,18,23,15,228,196,5,18,23,115,23,18,5, - 228,14,18,68,18,68,18,23,5,228,36,5,15,82,55,147,23,18,228,4,14,18,68,16, - 68,18,19,5,228,4,13,151,211,23,14,228,4,14,18,68,16,68,50,228,4,5,19,23, - 243,87,18,5,228,4,14,18,68,18,68,18,15,228,4,14,23,179,87,19,18,14,5,228, - 36,14,18,68,17,68,18,14,228,4,18,23,147,23,18,14,37,228,132,15,18,68,15,68, - 18,14,228,4,18,23,179,5,36,101,228,36,50,68,18,68,18,14,228,5,179,23,19,82, - 19,55,18,228,4,5,19,18,68,15,68,18,14,228,5,23,211,119,83,5,228,5,23,18, - 68,15,68,18,14,228,5,23,243,147,23,5,228,15,23,18,68,16,68,18,15,228,13,23, - 243,147,23,14,196,5,18,23,18,68,14,68,50,228,13,23,243,147,23,15,196,14,55,18, - 68,17,68,18,23,5,196,13,247,23,147,23,18,164,5,18,55,18,68,20,68,18,23,13, - 196,37,13,46,15,82,19,215,5,132,14,23,19,23,18,68,18,68,18,23,18,228,228,69, - 13,46,15,18,5,100,5,83,23,18,68,14,68,18,55,5,228,228,228,100,18,23,51,23, - 18,68,14,68,18,55,18,228,228,228,68,14,23,83,23,18,68,16,68,18,23,19,23,13, - 228,228,228,4,14,23,115,23,18,68,16,68,18,23,19,23,19,5,228,228,196,14,23,147, - 23,18,68,16,68,18,23,51,23,18,5,228,228,132,14,23,179,23,18,68,17,68,18,23, - 83,23,18,5,228,228,36,5,18,151,83,23,18,68,17,68,18,23,115,55,14,228,196,5, - 14,19,23,114,19,119,18,68,23,68,18,23,179,23,18,13,5,228,36,5,14,18,23,19, - 23,13,36,101,14,23,18,68,20,68,18,23,211,55,18,15,14,133,13,14,18,87,51,23, - 14,196,23,18,68,16,68,18,23,243,19,119,83,119,147,23,18,164,5,23,18,68,17,68, - 18,23,243,179,23,243,51,23,18,47,14,68,5,23,18,68,16,68,18,23,243,243,243,19, - 23,19,14,37,68,14,23,18,68,15,68,18,23,243,243,243,19,23,14,68,69,18,23,18, - 68,15,68,18,23,243,243,243,19,23,13,68,14,50,55,18,68,14,68,18,23,243,243,243, - 19,23,14,132,13,55,18,68,15,68,18,23,243,243,243,19,23,19,13,100,14,55,18,68, - 15,68,18,23,243,243,243,83,23,18,14,37,18,55,18,68,9,68,18,247,247,247,247,119, - 18,68,9,68,13,242,242,242,242,114,13,68,8,31,228,228,228,228,228,36,31,8,31,228, - 228,228,228,228,36,31,7,95,228,228,228,228,164,95,7,95,228,228,228,228,164,95,8,31, - 228,228,228,228,228,36,31,8,31,228,228,228,228,228,36,31,9,68,13,242,242,242,242,114, - 13,68,11,68,18,23,114,19,247,247,247,183,18,68,14,68,18,23,14,68,5,14,243,243, - 243,115,23,18,68,14,68,18,23,5,132,15,23,243,243,243,51,23,18,68,15,68,18,23, - 78,5,36,14,23,243,243,243,51,23,18,68,14,68,18,55,15,100,18,23,243,243,243,51, - 23,18,68,14,68,18,55,18,100,18,23,243,243,243,51,23,18,68,15,68,50,46,13,5, - 36,14,23,243,243,243,51,23,18,68,13,68,50,164,15,23,243,83,23,243,179,23,18,68, - 16,68,18,23,5,100,14,23,211,119,83,119,243,19,23,18,68,22,68,18,23,37,13,14, - 18,55,115,87,18,14,13,133,14,15,18,55,211,23,18,68,20,68,18,23,51,87,147,23, - 18,14,5,228,36,5,13,18,23,179,23,18,68,16,68,18,23,243,23,19,14,5,228,196, - 14,55,115,23,18,68,17,68,18,23,211,23,18,5,228,228,36,5,18,23,83,23,18,68, - 16,68,18,23,179,23,14,228,228,132,5,18,23,51,23,18,68,16,68,18,23,147,23,14, - 228,228,196,5,19,23,19,23,18,68,16,68,18,23,115,23,14,228,228,228,4,13,23,19, - 23,18,68,14,68,18,23,83,23,14,228,228,228,68,18,55,18,68,19,68,18,23,51,23, - 18,196,13,46,47,46,13,5,228,100,5,55,18,68,17,68,18,23,83,5,196,18,247,18, - 14,5,228,36,18,23,18,68,19,68,18,23,19,23,14,228,18,23,211,55,18,5,228,4, - 13,23,18,68,19,68,18,55,18,5,196,5,18,23,243,19,23,14,228,4,5,23,18,68, - 15,68,18,55,14,228,5,51,151,115,23,18,228,36,50,68,20,68,18,23,18,5,228,5, - 55,19,50,15,18,23,147,5,228,4,15,18,68,19,68,18,23,15,228,4,5,14,133,18, - 23,115,23,5,228,4,14,18,68,16,68,18,23,5,228,100,13,50,55,179,5,228,4,14, - 18,68,16,68,18,19,5,228,100,5,55,179,23,18,228,36,14,18,68,16,68,50,228,132, - 5,18,23,147,23,18,5,228,36,14,18,68,14,68,18,15,228,164,18,23,211,14,228,36, - 14,18,68,15,68,18,14,228,164,15,87,115,55,5,228,4,15,18,68,16,68,18,14,228, - 164,5,45,18,23,115,23,5,228,4,50,68,15,68,18,14,228,4,5,210,179,23,5,228, - 5,19,18,68,15,68,18,14,228,4,5,19,215,179,5,228,5,23,18,68,17,68,18,14, - 228,36,18,23,243,51,23,18,228,4,15,23,18,68,18,68,18,15,228,36,15,23,243,19, - 23,18,5,228,5,18,23,18,68,16,68,50,228,36,14,23,179,87,18,5,228,4,14,55, - 18,68,19,68,18,23,5,228,4,13,23,19,151,50,13,228,36,5,18,55,18,68,21,68, - 18,23,13,228,4,5,55,19,50,14,13,5,228,100,14,23,19,23,18,68,14,68,18,23, - 18,228,4,101,228,228,5,83,23,18,68,14,68,18,55,5,228,228,228,100,18,23,51,23, - 18,68,14,68,18,55,18,228,228,228,68,14,23,83,23,18,68,16,68,18,23,19,23,13, - 228,228,228,4,14,23,115,23,18,68,16,68,18,23,19,23,19,5,228,228,196,14,23,147, - 23,18,68,16,68,18,23,51,23,18,5,228,228,132,14,23,179,23,18,68,19,68,18,23, - 83,23,18,5,228,228,36,5,18,23,115,55,19,23,18,68,19,68,18,23,115,55,14,228, - 196,5,14,19,23,51,87,50,19,23,18,68,23,68,18,23,179,23,18,13,5,228,36,5, - 14,18,23,83,23,18,14,69,18,23,18,68,21,68,18,23,211,55,18,15,14,133,13,14, - 18,87,83,23,14,132,18,23,18,68,16,68,18,23,243,19,119,83,119,147,23,18,164,15, - 23,18,68,17,68,18,23,243,179,23,243,51,23,15,68,5,15,50,23,18,68,17,68,18, - 23,243,243,243,19,23,18,5,68,14,23,19,23,18,68,18,68,18,23,243,243,243,19,23, - 18,5,36,5,14,23,18,23,18,68,17,68,18,23,243,243,243,19,23,18,68,14,13,5, - 18,23,18,68,15,68,18,23,243,243,243,19,23,18,132,5,19,23,18,68,15,68,18,23, - 243,243,243,51,23,18,37,36,5,55,18,68,13,68,18,23,243,243,243,83,55,114,19,23, - 18,68,9,68,18,247,247,247,247,119,18,68,9,68,13,242,242,242,242,114,13,68,8,31, - 228,228,228,228,228,36,31,8,31,228,228,228,228,228,36,31,7,95,228,228,228,228,164,95, - 7,95,228,228,228,228,164,95,8,31,228,228,228,228,228,36,31,8,31,228,228,228,228,228, - 36,31,9,68,13,242,242,242,242,114,13,68,13,68,18,55,18,13,37,14,247,247,247,151, - 18,68,14,68,18,55,13,68,14,23,243,243,243,83,23,18,68,14,68,18,23,18,100,14, - 23,243,243,243,83,23,18,68,17,68,18,23,13,4,13,5,4,14,23,243,243,243,83,23, - 18,68,16,68,50,36,5,36,5,14,18,23,243,243,243,19,23,18,68,13,68,18,13,196, - 18,23,243,243,243,19,23,18,68,15,68,18,14,13,37,100,18,23,243,243,243,19,23,18, - 68,15,68,18,87,5,36,5,15,243,115,23,243,179,23,18,68,17,68,18,23,19,18,68, - 13,23,211,119,83,119,243,19,23,18,68,21,68,18,55,18,13,46,18,147,87,18,14,13, - 133,14,15,18,55,211,23,18,68,20,68,18,23,19,151,115,23,18,14,5,228,36,5,13, - 18,23,179,23,18,68,16,68,18,23,243,23,19,14,5,228,196,14,55,115,23,18,68,17, - 68,18,23,211,23,18,5,228,228,36,5,18,23,83,23,18,68,16,68,18,23,179,23,14, - 228,228,132,5,18,23,51,23,18,68,16,68,18,23,147,23,14,228,228,196,5,19,23,19, - 23,18,68,16,68,18,23,115,23,14,228,228,228,4,13,23,19,23,18,68,18,68,18,23, - 83,23,14,228,4,5,47,146,5,228,4,18,55,18,68,17,68,18,23,51,23,18,228,36, - 18,215,5,228,4,5,55,18,68,18,68,18,23,83,5,228,4,14,23,179,23,5,228,36, - 18,23,18,68,20,68,18,23,19,23,14,228,4,5,18,23,179,23,5,228,36,13,23,18, - 68,18,68,18,55,18,5,228,4,14,23,211,23,5,228,36,5,23,18,68,18,68,18,55, - 14,228,4,5,18,23,19,55,115,23,5,228,68,50,68,22,68,18,23,18,5,228,4,14, - 23,19,23,18,14,23,83,23,5,228,68,15,18,68,22,68,18,23,15,228,4,5,18,23, - 19,23,13,14,23,83,23,5,228,68,14,18,68,22,68,18,23,5,228,4,14,23,19,23, - 19,5,18,23,83,23,5,228,68,14,18,68,19,68,18,19,5,228,5,18,23,83,18,147, - 23,15,78,5,196,14,18,68,16,68,50,228,4,14,23,115,23,179,87,19,5,196,14,18, - 68,15,68,18,15,228,5,18,23,243,147,23,18,228,14,18,68,14,68,18,14,228,14,23, - 243,179,23,14,228,15,18,68,13,68,18,14,228,15,50,151,243,23,13,228,50,68,17,68, - 18,14,228,36,69,46,18,23,147,87,5,196,5,19,18,68,16,68,18,14,228,196,18,23, - 115,23,82,5,196,5,23,18,68,16,68,18,14,228,164,5,23,147,23,13,228,36,15,23, - 18,68,17,68,18,15,228,164,5,23,147,23,14,228,4,5,18,23,18,68,16,68,50,228, - 164,14,23,18,115,23,14,228,4,14,55,18,68,16,68,18,23,5,228,132,15,151,50,14, - 228,5,18,55,18,68,19,68,18,23,13,228,132,14,15,14,13,69,228,36,14,23,19,23, - 18,68,13,68,18,23,18,228,228,228,132,5,83,23,18,68,14,68,18,55,5,228,228,228, - 100,18,23,51,23,18,68,14,68,18,55,18,228,228,228,68,14,23,83,23,18,68,16,68, - 18,23,19,23,13,228,228,228,4,14,23,115,23,18,68,16,68,18,23,19,23,19,5,228, - 228,196,14,23,147,23,18,68,16,68,18,23,51,23,18,5,228,228,132,14,23,179,23,18, - 68,17,68,18,23,83,23,18,5,228,228,36,5,18,23,211,23,18,68,18,68,18,23,115, - 55,14,228,196,5,14,19,23,19,119,83,23,18,68,26,68,18,23,179,23,18,13,5,228, - 36,5,14,18,23,51,23,18,14,13,5,18,23,19,23,18,68,23,68,18,23,211,55,18, - 15,14,133,13,14,18,87,83,23,14,68,18,23,19,23,18,68,18,68,18,23,243,19,119, - 83,119,147,23,15,5,36,5,18,87,18,68,14,68,18,23,243,179,23,243,51,23,5,100, - 69,50,68,13,68,18,23,243,243,243,23,18,196,5,23,18,68,17,68,18,23,243,243,243, - 23,18,14,13,36,37,4,18,23,18,68,16,68,18,23,243,243,243,51,23,18,36,13,4, - 5,55,18,68,14,68,18,23,243,243,243,51,23,15,100,18,55,18,68,16,68,18,23,243, - 243,243,51,23,15,68,5,23,19,23,18,68,17,68,18,23,243,243,243,51,23,18,5,45, - 18,23,19,23,18,68,9,68,18,247,247,247,247,119,18,68,9,68,13,242,242,242,242,114, - 13,68,8,31,228,228,228,228,228,36,31,8,31,228,228,228,228,228,36,31,7,95,228,228, - 228,228,164,95,7,95,228,228,228,228,164,95,8,31,228,228,228,228,228,36,31,8,31,228, - 228,228,228,228,36,31,10,68,13,210,15,242,242,242,114,13,68,11,68,50,46,13,101,247, - 247,247,119,18,68,13,68,18,5,164,5,23,243,243,243,51,23,18,68,13,68,18,13,164, - 14,23,243,243,243,51,23,18,68,16,68,18,14,68,13,14,13,18,23,243,243,243,51,23, - 18,68,15,68,18,15,68,5,14,15,23,243,243,243,83,23,18,68,14,68,18,23,5,132, - 14,23,243,243,243,51,23,18,68,16,68,18,23,50,14,5,36,5,23,243,243,243,51,23, - 18,68,16,68,18,23,14,37,68,5,23,243,83,23,243,179,23,18,68,17,68,18,23,15, - 100,5,18,23,179,119,83,119,243,19,23,18,68,23,68,18,23,18,4,37,14,18,23,115, - 87,18,14,13,133,14,15,18,55,211,23,18,68,21,68,18,23,19,50,87,115,23,18,14, - 5,228,36,5,13,18,23,179,23,18,68,18,68,18,23,19,55,147,23,19,14,5,228,196, - 14,55,115,23,18,68,17,68,18,23,211,23,18,5,228,228,36,5,18,23,83,23,18,68, - 16,68,18,23,179,23,14,228,228,132,5,18,23,51,23,18,68,16,68,18,23,147,23,14, - 228,228,196,5,19,23,19,23,18,68,18,68,18,23,115,23,14,228,164,101,13,5,132,13, - 23,19,23,18,68,20,68,18,23,83,23,14,164,69,13,46,15,82,19,87,5,164,18,55, - 18,68,19,68,18,23,51,23,18,100,5,82,247,55,19,23,18,196,5,55,18,68,19,68, - 18,23,83,5,100,13,23,19,23,243,83,23,18,228,18,23,18,68,18,68,18,23,19,23, - 14,132,13,23,243,147,23,14,228,13,23,18,68,17,68,18,55,18,5,132,13,23,243,147, - 23,13,228,5,23,18,68,14,68,18,55,14,164,5,23,243,179,5,228,4,50,68,16,68, - 18,23,18,5,164,5,23,211,183,18,228,36,15,18,68,20,68,18,23,15,196,5,18,23, - 115,23,19,37,78,15,14,228,36,14,18,68,16,68,18,23,5,228,18,23,147,23,14,5, - 228,196,14,18,68,18,68,18,19,5,228,14,23,179,55,18,15,14,5,228,68,14,18,68, - 14,68,50,228,4,5,23,243,119,14,228,36,14,18,68,16,68,18,15,228,36,15,23,243, - 83,23,13,228,4,14,18,68,17,68,18,14,228,36,5,15,19,151,147,23,18,228,4,15, - 18,68,17,68,18,14,228,100,69,13,14,18,23,115,23,18,228,4,50,68,17,68,18,14, - 228,228,5,18,23,115,23,18,5,196,5,19,18,68,16,68,18,14,228,68,14,114,55,147, - 23,18,228,5,23,18,68,15,68,18,14,228,68,14,119,211,23,15,228,15,23,18,68,17, - 68,18,15,228,68,13,23,243,19,55,5,196,5,18,23,18,68,14,68,50,228,68,5,23, - 243,55,13,228,14,55,18,68,18,68,18,23,5,228,68,18,23,115,87,18,5,228,5,18, - 55,18,68,20,68,18,23,13,228,68,18,119,19,18,14,5,228,36,14,23,19,23,18,68, - 18,68,18,23,18,228,68,14,18,46,13,5,228,100,5,83,23,18,68,14,68,18,55,5, - 228,228,228,100,18,23,51,23,18,68,14,68,18,55,18,228,228,228,68,14,23,83,23,18, - 68,16,68,18,23,19,23,13,228,228,228,4,14,23,115,23,18,68,16,68,18,23,19,23, - 19,5,228,228,196,14,23,147,23,18,68,16,68,18,23,51,23,18,5,228,228,132,14,23, - 179,23,18,68,19,68,18,23,83,23,18,5,228,228,36,5,18,23,51,119,19,23,18,68, - 19,68,18,23,115,55,14,228,196,5,14,19,23,19,55,19,82,55,18,68,24,68,18,23, - 179,23,18,13,5,228,36,5,14,18,55,19,23,18,13,5,36,15,55,18,68,22,68,18, - 23,211,55,18,15,14,133,13,14,18,87,51,23,18,5,100,14,55,18,68,18,68,18,23, - 243,19,119,83,119,147,23,14,68,5,13,14,55,18,68,17,68,18,23,243,179,23,243,51, - 23,13,68,14,15,18,55,18,68,14,68,18,23,243,243,243,19,23,18,164,18,23,18,68, - 16,68,18,23,243,243,243,51,23,18,14,13,68,13,23,18,68,16,68,18,23,243,243,243, - 19,23,18,5,45,68,5,23,18,68,14,68,18,23,243,243,243,19,23,15,164,5,23,18, - 68,14,68,18,23,243,243,243,19,23,14,164,5,23,18,68,17,68,18,23,243,243,243,19, - 23,13,37,13,46,15,18,23,18,68,9,68,18,247,247,247,247,119,18,68,9,68,13,242, - 242,242,242,114,13,68,8,31,228,228,228,228,228,36,31,8,31,228,228,228,228,228,36,31, - 7,95,228,228,228,228,164,95,7,95,228,228,228,228,164,95,8,31,228,228,228,228,228,36, - 31,8,31,228,228,228,228,228,36,31,9,68,13,242,242,242,242,114,13,68,9,68,18,247, - 247,247,247,119,18,68,14,68,18,15,5,13,14,18,243,243,243,179,23,18,68,13,68,18, - 14,68,18,55,243,243,243,115,23,18,68,15,68,18,5,36,5,46,15,23,243,243,243,83, - 23,18,68,13,68,18,5,164,14,23,243,243,243,51,23,18,68,15,68,18,5,36,37,68, - 18,23,243,243,243,19,23,18,68,15,68,18,5,36,46,68,18,23,243,243,243,19,23,18, - 68,13,68,18,14,164,5,243,115,23,243,179,23,18,68,17,68,18,23,5,100,5,18,23, - 179,119,83,119,243,19,23,18,68,22,68,18,23,19,18,46,50,23,115,87,18,14,13,133, - 14,15,18,55,211,23,18,68,20,68,18,23,19,151,115,23,18,14,5,228,36,5,13,18, - 23,179,23,18,68,16,68,18,23,243,23,19,14,5,228,196,14,55,115,23,18,68,17,68, - 18,23,211,23,18,5,228,228,36,5,18,23,83,23,18,68,16,68,18,23,179,23,14,228, - 228,132,5,18,23,51,23,18,68,16,68,18,23,147,23,14,228,228,196,5,19,23,19,23, - 18,68,16,68,18,23,115,23,14,228,228,228,4,13,23,19,23,18,68,14,68,18,23,83, - 23,14,228,228,228,68,18,55,18,68,14,68,18,23,51,23,18,228,228,228,100,5,55,18, - 68,17,68,18,23,83,5,132,14,18,46,37,228,228,36,18,23,18,68,18,68,18,23,19, - 23,14,164,18,119,19,50,13,228,196,13,23,18,68,17,68,18,55,18,5,164,18,23,83, - 87,5,228,196,5,23,18,68,14,68,18,55,14,164,5,179,23,18,228,228,4,50,68,17, - 68,18,23,18,5,164,5,23,147,23,5,228,228,4,15,18,68,19,68,18,23,15,196,13, - 23,115,23,18,46,47,46,5,228,68,14,18,68,15,68,18,23,5,196,14,23,179,215,14, - 228,36,14,18,68,16,68,18,19,5,196,14,23,243,147,23,14,228,4,14,18,68,12,68, - 50,228,14,23,243,211,5,228,14,18,68,15,68,18,15,228,14,23,115,151,147,23,13,228, - 14,18,68,21,68,18,14,228,14,23,83,23,18,14,5,13,18,23,115,23,14,228,15,18, - 68,18,68,18,14,228,14,23,83,23,18,68,18,23,115,23,14,228,50,68,20,68,18,14, - 228,5,23,115,23,18,15,18,23,147,23,14,196,5,19,18,68,17,68,18,14,228,5,18, - 23,115,87,179,23,13,196,5,23,18,68,17,68,18,14,228,4,14,23,243,115,23,18,5, - 196,15,23,18,68,18,68,18,15,228,4,5,18,23,243,51,55,5,196,5,18,23,18,68, - 16,68,50,228,36,5,18,87,83,119,18,5,228,14,55,18,68,22,68,18,23,5,228,36, - 5,14,18,19,55,19,50,15,13,5,228,5,18,55,18,68,15,68,18,23,13,228,132,133, - 228,100,14,23,19,23,18,68,13,68,18,23,18,228,228,228,132,5,83,23,18,68,14,68, - 18,55,5,228,228,228,100,18,23,51,23,18,68,14,68,18,55,18,228,228,228,68,14,23, - 83,23,18,68,16,68,18,23,19,23,13,228,228,228,4,14,23,115,23,18,68,16,68,18, - 23,19,23,19,5,228,228,196,14,23,147,23,18,68,16,68,18,23,51,23,18,5,228,228, - 132,14,23,179,23,18,68,17,68,18,23,83,23,18,5,228,228,36,5,18,23,211,23,18, - 68,18,68,18,23,115,55,14,228,196,5,14,19,23,19,183,19,23,18,68,23,68,18,23, - 179,23,18,13,5,228,36,5,14,18,55,19,23,18,15,78,18,55,18,68,23,68,18,23, - 211,55,18,15,14,133,13,14,18,87,51,23,18,5,100,5,18,23,18,68,16,68,18,23, - 243,19,119,83,119,147,23,5,164,5,23,18,68,17,68,18,23,243,179,23,243,83,5,36, - 13,18,36,5,19,18,68,14,68,18,23,243,243,243,19,23,5,36,37,68,50,68,12,68, - 18,23,243,243,243,19,23,15,196,50,68,16,68,18,23,243,243,243,51,23,18,47,13,36, - 5,23,18,68,15,68,18,23,243,243,243,83,55,19,5,36,5,23,18,68,15,68,18,23, - 243,243,243,147,18,15,14,13,14,23,18,68,10,68,18,23,243,243,243,179,151,18,68,9, - 68,18,247,247,247,247,119,18,68,9,68,13,242,242,242,242,114,13,68,8,31,228,228,228, - 228,228,36,31,8,31,228,228,228,228,228,36,31,7,95,228,228,228,228,164,95,7,95,228, - 228,228,228,164,95,8,31,228,228,228,228,228,36,31,8,31,228,228,228,228,228,36,31,9, - 68,13,242,242,242,242,114,13,68,11,68,146,15,78,19,247,247,247,87,18,68,13,68,18, - 13,164,5,23,243,243,243,51,23,18,68,13,68,18,14,164,14,23,243,243,243,51,23,18, - 68,13,68,50,69,68,18,23,243,243,243,51,23,18,68,15,68,18,23,50,5,36,5,23, - 243,243,243,83,23,18,68,14,68,18,55,5,68,14,23,243,243,243,83,23,18,68,14,68, - 18,23,14,100,18,23,243,243,243,83,23,18,68,16,68,18,23,14,5,36,5,23,243,147, - 23,243,179,23,18,68,17,68,18,55,18,14,5,14,23,243,119,83,119,243,19,23,18,68, - 22,68,18,23,19,55,19,18,23,147,87,18,14,13,133,14,15,18,55,211,23,18,68,20, - 68,18,23,115,23,147,23,18,14,5,228,36,5,13,18,23,179,23,18,68,16,68,18,23, - 243,23,19,14,5,228,196,14,55,115,23,18,68,17,68,18,23,211,23,18,5,228,228,36, - 5,18,23,83,23,18,68,16,68,18,23,179,23,14,228,228,132,5,18,23,51,23,18,68, - 16,68,18,23,147,23,14,228,228,196,5,19,23,19,23,18,68,16,68,18,23,115,23,14, - 228,228,228,4,13,23,19,23,18,68,17,68,18,23,83,23,14,228,132,101,45,14,13,164, - 18,55,18,68,20,68,18,23,51,23,18,100,37,13,78,15,114,19,151,13,164,5,55,18, - 68,17,68,18,23,83,5,100,14,247,87,115,18,5,196,18,23,18,68,18,68,18,23,19, - 23,14,132,5,23,243,147,23,15,228,13,23,18,68,17,68,18,55,18,5,164,18,23,243, - 115,23,13,228,5,23,18,68,16,68,18,55,14,196,14,23,243,83,23,18,5,228,4,50, - 68,18,68,18,23,18,5,196,13,23,51,87,179,23,18,228,36,15,18,68,18,68,18,23, - 15,228,5,87,19,50,23,147,23,13,228,36,14,18,68,19,68,18,23,5,228,4,45,69, - 18,23,115,23,19,5,228,36,14,18,68,16,68,18,19,5,228,132,14,23,147,23,18,228, - 68,14,18,68,14,68,50,228,132,5,23,179,23,14,228,68,14,18,68,14,68,18,15,228, - 132,18,23,211,5,228,68,14,18,68,15,68,18,14,228,100,14,23,179,23,18,228,100,15, - 18,68,14,68,18,14,228,68,5,23,211,23,14,228,100,50,68,17,68,18,14,228,36,5, - 18,23,211,23,5,228,68,5,19,18,68,16,68,18,14,228,36,14,87,147,23,18,228,100, - 5,23,18,68,18,68,18,14,228,68,5,14,18,55,83,23,14,228,100,15,23,18,68,19, - 68,18,15,228,132,5,14,18,55,19,23,5,228,68,5,18,23,18,68,14,68,50,228,228, - 5,15,23,18,228,100,14,55,18,68,15,68,18,23,5,228,228,4,37,228,68,5,18,55, - 18,68,14,68,18,23,13,228,228,228,164,14,23,19,23,18,68,13,68,18,23,18,228,228, - 228,132,5,83,23,18,68,14,68,18,55,5,228,228,228,100,18,23,51,23,18,68,14,68, - 18,55,18,228,228,228,68,14,23,83,23,18,68,16,68,18,23,19,23,13,228,228,228,4, - 14,23,115,23,18,68,16,68,18,23,19,23,19,5,228,228,196,14,23,147,23,18,68,16, - 68,18,23,51,23,18,5,228,228,132,14,23,179,23,18,68,17,68,18,23,83,23,18,5, - 228,228,36,5,18,23,211,23,18,68,18,68,18,23,115,55,14,228,196,5,14,19,23,51, - 55,115,23,18,68,22,68,18,23,179,23,18,13,5,228,36,5,14,18,23,83,23,50,55, - 51,23,18,68,24,68,18,23,211,55,18,15,14,133,13,14,18,87,115,23,15,4,13,18, - 23,19,23,18,68,17,68,18,23,243,19,119,83,119,211,23,13,68,5,18,23,18,68,16, - 68,18,23,243,179,23,243,83,23,18,5,68,13,55,18,68,14,68,18,23,243,243,243,51, - 23,15,68,5,87,18,68,14,68,18,23,243,243,243,51,23,13,68,82,23,18,68,17,68, - 18,23,243,243,243,19,23,18,5,68,5,4,14,23,18,68,14,68,18,23,243,243,243,19, - 23,18,164,5,23,18,68,14,68,18,23,243,243,243,19,23,13,132,37,19,18,68,13,68, - 18,23,243,243,243,51,46,47,114,23,18,68,9,68,18,247,247,247,247,119,18,68,9,68, - 13,242,242,242,242,114,13,68,8,31,228,228,228,228,228,36,31,8,31,228,228,228,228,228, - 36,31,7,95,228,228,228,228,164,95,7,95,228,228,228,228,164,95,8,31,228,228,228,228, - 228,36,31,8,31,228,228,228,228,228,36,31,9,68,13,242,242,242,242,114,13,68,10,68, - 18,87,50,247,247,247,215,18,68,16,68,18,23,18,5,36,5,18,23,243,243,243,83,23, - 18,68,16,68,18,23,14,4,37,4,13,23,243,243,243,83,23,18,68,17,68,18,23,13, - 4,13,5,4,5,23,243,243,243,83,23,18,68,14,68,18,23,14,100,13,23,243,243,243, - 83,23,18,68,15,68,50,5,4,37,36,15,23,243,243,243,51,23,18,68,15,68,18,15, - 36,46,36,13,23,243,243,243,51,23,18,68,13,68,50,164,14,23,243,83,23,243,179,23, - 18,68,17,68,18,23,14,5,68,14,23,211,119,83,119,243,19,23,18,68,19,68,18,55, - 114,23,147,87,18,14,13,133,14,15,18,55,211,23,18,68,20,68,18,23,19,119,147,23, - 18,14,5,228,36,5,13,18,23,179,23,18,68,16,68,18,23,243,23,19,14,5,228,196, - 14,55,115,23,18,68,17,68,18,23,211,23,18,5,228,228,36,5,18,23,83,23,18,68, - 16,68,18,23,179,23,14,228,228,132,5,18,23,51,23,18,68,16,68,18,23,147,23,14, - 228,228,196,5,19,23,19,23,18,68,16,68,18,23,115,23,14,228,228,228,4,13,23,19, - 23,18,68,14,68,18,23,83,23,14,228,228,228,68,18,55,18,68,18,68,18,23,51,23, - 18,228,36,5,13,46,5,228,132,5,55,18,68,18,68,18,23,83,5,228,5,14,19,119, - 18,13,228,100,18,23,18,68,19,68,18,23,19,23,14,228,5,18,23,147,55,14,228,68, - 13,23,18,68,19,68,18,55,18,5,228,14,23,51,55,115,23,5,228,36,5,23,18,68, - 18,68,18,55,14,228,5,18,23,19,23,50,115,23,14,228,68,50,68,20,68,18,23,18, - 5,228,5,115,5,4,15,23,51,23,15,228,68,15,18,68,23,68,18,23,15,228,4,5, - 19,23,19,23,18,14,18,23,51,23,15,228,68,14,18,68,18,68,18,23,5,228,36,18, - 23,51,87,83,23,13,228,68,14,18,68,17,68,18,19,5,228,36,13,23,211,23,18,5, - 228,68,14,18,68,16,68,50,228,36,5,18,23,243,23,18,5,228,36,14,18,68,17,68, - 18,15,228,36,18,23,51,151,83,23,18,228,36,14,18,68,22,68,18,14,228,4,5,23, - 51,23,18,37,13,18,23,83,23,5,228,4,15,18,68,20,68,18,14,228,4,14,23,51, - 23,14,68,14,23,83,23,14,228,4,50,68,19,68,18,14,228,4,14,23,83,23,82,23, - 115,23,14,228,5,19,18,68,17,68,18,14,228,4,5,23,115,87,147,23,5,228,5,23, - 18,68,17,68,18,14,228,36,18,23,243,51,23,18,228,4,15,23,18,68,18,68,18,15, - 228,36,5,18,23,243,23,18,5,228,5,18,23,18,68,15,68,50,228,68,5,18,247,18, - 5,228,4,14,55,18,68,18,68,18,23,5,228,100,5,14,114,14,5,228,36,5,18,55, - 18,68,14,68,18,23,13,228,228,228,164,14,23,19,23,18,68,13,68,18,23,18,228,228, - 228,132,5,83,23,18,68,14,68,18,55,5,228,228,228,100,18,23,51,23,18,68,14,68, - 18,55,18,228,228,228,68,14,23,83,23,18,68,16,68,18,23,19,23,13,228,228,228,4, - 14,23,115,23,18,68,16,68,18,23,19,23,19,5,228,228,196,14,23,147,23,18,68,16, - 68,18,23,51,23,18,5,228,228,132,14,23,179,23,18,68,17,68,18,23,83,23,18,5, - 228,228,36,5,18,23,211,23,18,68,18,68,18,23,115,55,14,228,196,5,14,19,23,51, - 119,51,23,18,68,24,68,18,23,179,23,18,13,5,228,36,5,14,18,23,83,23,18,46, - 18,23,19,23,18,68,22,68,18,23,211,55,18,15,14,133,13,14,18,87,83,23,14,100, - 13,19,23,18,68,16,68,18,23,243,19,119,83,119,147,23,18,164,14,23,18,68,19,68, - 18,23,243,179,23,243,51,23,14,36,13,18,5,4,14,23,18,68,18,68,18,23,243,243, - 243,19,23,18,5,4,37,4,5,18,23,18,68,14,68,18,23,243,243,243,51,23,14,100, - 13,55,18,68,18,68,18,23,243,243,243,51,23,14,4,5,14,4,5,19,23,18,68,16, - 68,18,23,243,243,243,51,23,14,36,5,4,5,55,18,68,16,68,18,23,243,243,243,83, - 23,14,5,4,5,18,55,18,68,14,68,18,23,243,243,243,115,23,50,55,19,23,18,68, - 9,68,18,247,247,247,247,119,18,68,9,68,13,242,242,242,242,114,13,68,8,31,228,228, - 228,228,228,36,31,8,31,228,228,228,228,228,36,31,7,95,228,228,228,228,164,95,7,95, - 228,228,228,228,164,95,8,31,228,228,228,228,228,36,31,8,31,228,228,228,228,228,36,31, - 9,68,13,242,242,242,242,114,13,68,9,68,18,247,247,247,247,119,18,68,14,68,18,23, - 15,101,14,23,243,243,243,83,23,18,68,13,68,18,15,164,14,23,243,243,243,51,23,18, - 68,14,68,18,5,36,37,36,5,243,243,243,83,23,18,68,17,68,18,5,36,5,15,5, - 36,18,23,243,243,243,19,23,18,68,13,68,18,14,196,18,23,243,243,243,19,23,18,68, - 13,68,50,101,68,18,23,243,243,243,19,23,18,68,17,68,18,55,50,13,36,5,19,23, - 243,51,23,243,179,23,18,68,19,68,18,23,19,23,18,5,36,5,23,179,119,83,119,243, - 19,23,18,68,22,68,18,23,115,18,15,18,23,83,87,18,14,13,133,14,15,18,55,211, - 23,18,68,20,68,18,23,83,119,83,23,18,14,5,228,36,5,13,18,23,179,23,18,68, - 16,68,18,23,243,23,19,14,5,228,196,14,55,115,23,18,68,17,68,18,23,211,23,18, - 5,228,228,36,5,18,23,83,23,18,68,16,68,18,23,179,23,14,228,228,132,5,18,23, - 51,23,18,68,16,68,18,23,147,23,14,228,228,196,5,19,23,19,23,18,68,16,68,18, - 23,115,23,14,228,228,228,4,13,23,19,23,18,68,14,68,18,23,83,23,14,228,228,228, - 68,18,55,18,68,14,68,18,23,51,23,18,228,228,228,100,5,55,18,68,17,68,18,23, - 83,5,228,5,46,146,14,5,228,68,18,23,18,68,20,68,18,23,19,23,14,196,5,15, - 19,247,23,15,5,228,4,13,23,18,68,19,68,18,55,18,5,164,5,18,23,243,51,23, - 18,228,4,5,23,18,68,15,68,18,55,14,196,18,23,243,115,23,14,228,4,50,68,18, - 68,18,23,18,5,164,5,23,179,87,115,23,18,228,4,15,18,68,20,68,18,23,15,196, - 14,23,147,23,19,18,19,23,115,23,5,228,14,18,68,22,68,18,23,5,196,14,23,115, - 23,18,5,4,5,18,23,83,23,13,228,14,18,68,22,68,18,19,5,196,14,23,115,23, - 18,5,4,5,18,23,83,23,14,228,14,18,68,18,68,50,228,14,23,147,23,19,18,19, - 23,115,23,14,228,14,18,68,15,68,18,15,228,5,23,179,55,179,23,14,228,14,18,68, - 15,68,18,14,228,4,15,23,243,147,23,14,228,15,18,68,14,68,18,14,228,4,5,18, - 247,147,23,14,228,50,68,18,68,18,14,228,68,14,146,15,18,23,115,23,14,196,5,19, - 18,68,18,68,18,14,228,164,5,36,5,18,23,115,23,5,196,5,23,18,68,16,68,18, - 14,228,228,4,15,23,147,23,5,196,15,23,18,68,17,68,18,15,228,228,5,23,147,23, - 18,5,164,5,18,23,18,68,13,68,50,228,228,14,18,183,18,196,14,55,18,68,18,68, - 18,23,5,228,228,37,13,14,50,23,14,164,5,18,55,18,68,15,68,18,23,13,228,228, - 164,37,164,14,23,19,23,18,68,13,68,18,23,18,228,228,228,132,5,83,23,18,68,14, - 68,18,55,5,228,228,228,100,18,23,51,23,18,68,14,68,18,55,18,228,228,228,68,14, - 23,83,23,18,68,16,68,18,23,19,23,13,228,228,228,4,14,23,115,23,18,68,16,68, - 18,23,19,23,19,5,228,228,196,14,23,147,23,18,68,16,68,18,23,51,23,18,5,228, - 228,132,14,23,179,23,18,68,17,68,18,23,83,23,18,5,228,228,36,5,18,23,211,23, - 18,68,16,68,18,23,115,55,14,228,196,5,14,19,183,83,23,18,68,23,68,18,23,179, - 23,18,13,5,228,36,5,14,18,23,19,23,18,14,82,83,23,18,68,23,68,18,23,211, - 55,18,15,14,133,13,14,18,87,51,23,13,68,18,23,51,23,18,68,17,68,18,23,243, - 19,119,83,119,147,23,5,36,5,82,55,18,68,16,68,18,23,243,179,23,243,51,23,5, - 132,5,18,23,18,68,13,68,18,23,243,243,243,51,5,164,5,23,18,68,15,68,18,23, - 243,243,243,19,23,5,36,15,14,68,50,68,16,68,18,23,243,243,243,19,23,13,36,37, - 36,5,19,18,68,14,68,18,23,243,243,243,19,23,18,164,14,23,18,68,16,68,18,23, - 243,243,243,51,23,18,13,37,13,18,55,18,68,12,68,18,23,243,243,243,83,183,19,23, - 18,68,9,68,18,247,247,247,247,119,18,68,9,68,13,242,242,242,242,114,13,68,8,31, - 228,228,228,228,228,36,31,8,31,228,228,228,228,228,36,31,7,95,228,228,228,228,164,95, - 7,95,228,228,228,228,164,95,8,31,228,228,228,228,228,36,31,8,31,228,228,228,228,228, - 36,31,9,68,13,242,242,242,242,114,13,68,12,68,18,55,18,46,15,247,247,247,183,18, - 68,16,68,18,23,14,4,46,37,18,23,243,243,243,51,23,18,68,15,68,50,37,15,55, - 13,5,23,243,243,243,51,23,18,68,18,68,18,46,18,4,18,23,18,5,18,23,243,243, - 243,19,23,18,68,19,68,18,13,14,23,18,5,18,23,5,18,23,243,243,243,19,23,18, - 68,18,68,18,14,5,55,14,5,18,5,18,23,243,243,243,19,23,18,68,18,68,18,23, - 5,14,19,23,13,4,14,23,243,243,243,51,23,18,68,15,68,18,23,18,101,14,23,243, - 115,23,243,179,23,18,68,14,68,18,87,82,23,243,119,83,119,243,19,23,18,68,19,68, - 18,23,51,87,179,87,18,14,13,133,14,15,18,55,211,23,18,68,19,68,18,23,243,51, - 23,18,14,5,228,36,5,13,18,23,179,23,18,68,16,68,18,23,243,23,19,14,5,228, - 196,14,55,115,23,18,68,17,68,18,23,211,23,18,5,228,228,36,5,18,23,83,23,18, - 68,16,68,18,23,179,23,14,228,228,132,5,18,23,51,23,18,68,16,68,18,23,147,23, - 14,228,228,196,5,19,23,19,23,18,68,16,68,18,23,115,23,14,228,228,228,4,13,23, - 19,23,18,68,17,68,18,23,83,23,14,228,4,37,45,37,228,100,18,55,18,68,22,68, - 18,23,51,23,18,196,5,14,18,19,119,19,18,14,5,228,4,5,55,18,68,18,68,18, - 23,83,5,164,13,18,247,55,18,13,228,4,18,23,18,68,21,68,18,23,19,23,14,164, - 14,55,19,23,18,110,18,119,14,228,13,23,18,68,24,68,18,55,18,5,132,14,23,19, - 23,18,5,164,5,15,23,19,23,14,196,5,23,18,68,20,68,18,55,14,132,5,23,19, - 23,51,5,228,14,23,19,23,5,196,50,68,23,68,18,23,18,5,100,5,18,23,19,18, - 19,55,5,228,14,55,18,5,164,15,18,68,21,68,18,23,15,132,13,55,18,4,14,55, - 18,5,228,18,55,13,164,14,18,68,20,68,18,23,5,132,18,55,5,36,15,55,18,228, - 5,55,18,164,14,18,68,23,68,18,19,5,100,5,18,23,18,68,5,18,55,15,228,18, - 23,18,5,132,14,18,68,19,68,50,132,5,55,14,100,5,18,55,14,196,14,55,5,132, - 14,18,68,21,68,18,15,132,13,55,14,132,5,23,19,23,13,164,14,55,13,132,14,18, - 68,21,68,18,14,132,13,55,14,164,13,23,19,23,5,132,14,55,13,132,15,18,68,19, - 68,18,14,132,5,55,14,196,14,55,18,5,100,14,55,5,132,50,68,23,68,18,14,132, - 5,18,23,18,228,15,55,18,5,68,18,23,18,5,100,5,19,18,68,20,68,18,14,164, - 18,55,5,228,18,55,15,36,5,55,18,132,5,23,18,68,21,68,18,14,164,13,55,18, - 228,5,18,55,14,4,18,55,13,132,15,23,18,68,23,68,18,15,164,5,18,55,14,228, - 5,55,19,18,19,23,18,5,100,5,18,23,18,68,20,68,50,196,5,23,19,23,14,228, - 5,51,23,19,23,5,132,14,55,18,68,24,68,18,23,5,196,14,23,19,23,15,5,164, - 5,18,23,19,23,14,132,5,18,55,18,68,21,68,18,23,13,228,14,119,18,110,18,23, - 19,55,14,164,14,23,19,23,18,68,18,68,18,23,18,228,4,13,18,247,55,18,13,164, - 5,83,23,18,68,22,68,18,55,5,228,4,5,14,18,19,119,19,18,14,5,196,18,23, - 51,23,18,68,17,68,18,55,18,228,100,37,45,37,228,4,14,23,83,23,18,68,16,68, - 18,23,19,23,13,228,228,228,4,14,23,115,23,18,68,16,68,18,23,19,23,19,5,228, - 228,196,14,23,147,23,18,68,16,68,18,23,51,23,18,5,228,228,132,14,23,179,23,18, - 68,17,68,18,23,83,23,18,5,228,228,36,5,18,23,211,23,18,68,16,68,18,23,115, - 55,14,228,196,5,14,19,23,243,23,18,68,19,68,18,23,179,23,18,13,5,228,36,5, - 14,18,23,243,51,23,18,68,19,68,18,23,211,55,18,15,14,133,13,14,18,87,179,87, - 51,23,18,68,14,68,18,23,243,19,119,83,119,243,23,82,87,18,68,15,68,18,23,243, - 179,23,243,115,23,14,101,18,23,18,68,18,68,18,23,243,243,243,51,23,14,4,13,23, - 19,14,5,23,18,68,18,68,18,23,243,243,243,19,23,18,5,18,5,14,55,5,14,18, - 68,19,68,18,23,243,243,243,19,23,18,5,23,18,5,18,23,14,13,18,68,18,68,18, - 23,243,243,243,19,23,18,5,18,23,18,4,18,46,18,68,15,68,18,23,243,243,243,51, - 23,5,13,55,15,37,50,68,16,68,18,23,243,243,243,51,23,18,37,46,4,14,23,18, - 68,12,68,18,247,247,247,183,15,46,18,55,18,68,9,68,13,242,242,242,242,114,13,68, - 8,31,228,228,228,228,228,36,31,8,31,228,228,228,228,228,36,31,7,95,228,228,228,228, - 164,95,7,95,228,228,228,228,164,95,8,31,228,228,228,228,228,36,31,8,31,228,228,228, - 228,228,36,31,9,68,13,242,242,242,242,114,13,68,12,68,18,55,18,23,18,247,247,247, - 215,18,68,14,68,50,5,4,37,14,23,243,243,243,115,23,18,68,16,68,18,14,4,46, - 4,5,18,23,243,243,243,83,23,18,68,14,68,18,14,5,23,114,23,243,243,243,83,23, - 18,68,15,68,50,5,51,55,14,18,23,243,243,243,51,23,18,68,18,68,18,23,14,18, - 23,19,23,15,5,23,243,243,243,51,23,18,68,18,68,18,23,18,15,46,23,14,4,18, - 23,243,243,243,19,23,18,68,17,68,18,23,19,14,36,5,4,5,243,115,23,243,179,23, - 18,68,17,68,18,23,19,23,110,18,23,179,119,83,119,243,19,23,18,68,21,68,18,23, - 19,23,19,119,115,87,18,14,13,133,14,15,18,55,211,23,18,68,20,68,18,23,51,23, - 211,23,18,14,5,228,36,5,13,18,23,179,23,18,68,16,68,18,23,243,23,19,14,5, - 228,196,14,55,115,23,18,68,18,68,18,23,211,23,18,5,228,5,228,4,5,18,23,83, - 23,18,68,19,68,18,23,179,23,14,228,4,5,14,228,36,5,18,23,51,23,18,68,20, - 68,18,23,147,23,14,228,36,5,18,5,228,36,5,19,23,19,23,18,68,23,68,18,23, - 115,23,14,36,5,13,78,13,37,36,23,18,228,68,13,23,19,23,18,68,21,68,18,23, - 83,23,14,4,5,18,215,50,15,19,23,14,228,68,18,55,18,68,20,68,18,23,51,23, - 18,4,5,55,211,87,51,23,5,228,36,5,55,18,68,19,68,18,23,83,5,4,18,23, - 243,147,23,18,5,228,36,18,23,18,68,21,68,18,23,19,23,14,4,5,23,115,215,115, - 23,18,5,228,4,13,23,18,68,25,68,18,55,18,5,4,14,23,83,23,18,14,69,13, - 18,23,19,119,19,5,228,5,23,18,68,22,68,18,55,14,36,14,23,51,23,18,5,100, - 5,87,82,14,15,14,5,228,50,68,23,68,18,23,18,5,36,13,23,51,23,5,100,5, - 50,14,37,36,5,228,68,15,18,68,20,68,18,23,15,68,5,23,19,23,18,132,14,13, - 164,46,228,36,14,18,68,17,68,18,23,5,100,18,55,18,228,164,18,14,228,4,14,18, - 68,17,68,18,19,5,100,14,55,18,228,164,5,23,14,228,14,18,68,16,68,50,132,5, - 19,23,18,228,196,18,23,5,196,14,18,68,18,68,18,15,164,14,23,18,5,228,164,14, - 23,18,5,164,14,18,68,18,68,18,14,164,5,18,23,13,228,164,5,19,23,15,164,15, - 18,68,15,68,18,14,196,5,23,15,228,196,18,55,5,132,50,68,17,68,18,14,228,14, - 23,5,228,164,18,55,15,100,5,19,18,68,18,68,18,14,228,4,15,18,228,164,18,55, - 18,5,68,5,23,18,68,21,68,18,14,228,36,14,13,164,13,14,132,18,23,19,23,5, - 68,15,23,18,68,24,68,18,15,228,68,5,68,5,14,18,23,5,100,5,23,51,23,14, - 36,5,18,23,18,68,24,68,50,228,5,13,37,14,15,18,19,55,5,100,5,18,23,51, - 23,14,36,14,55,18,68,24,68,18,23,5,196,5,14,151,51,18,14,69,14,18,23,83, - 23,14,4,5,18,55,18,68,21,68,18,23,13,228,4,5,18,23,115,215,115,23,13,4, - 14,23,19,23,18,68,18,68,18,23,18,228,36,5,18,23,243,147,23,18,37,83,23,18, - 68,21,68,18,55,5,228,36,5,19,23,19,87,179,87,5,4,18,23,51,23,18,68,20, - 68,18,55,18,228,68,13,55,82,183,18,15,5,4,14,23,83,23,18,68,22,68,18,23, - 19,23,13,228,68,14,23,13,4,69,77,37,36,14,23,115,23,18,68,20,68,18,23,19, - 23,19,5,228,36,5,18,13,228,36,14,23,147,23,18,68,19,68,18,23,51,23,18,5, - 228,36,14,13,228,4,14,23,179,23,18,68,18,68,18,23,83,23,18,5,228,4,37,196, - 5,18,23,211,23,18,68,16,68,18,23,115,55,14,228,196,5,14,19,23,243,23,18,68, - 20,68,18,23,179,23,18,13,5,228,36,5,14,18,23,115,119,51,23,18,68,21,68,18, - 23,211,55,18,15,14,133,13,14,18,87,115,23,114,23,19,23,18,68,17,68,18,23,243, - 19,119,83,119,179,23,14,36,37,18,55,18,68,19,68,18,23,243,179,23,243,51,23,18, - 4,5,15,37,14,19,23,18,68,17,68,18,23,243,243,243,51,23,5,15,23,18,23,50, - 23,18,68,17,68,18,23,243,243,243,51,23,46,23,19,23,18,13,23,18,68,17,68,18, - 23,243,243,243,51,23,19,14,55,18,23,5,15,18,68,16,68,18,23,243,243,243,83,23, - 18,14,13,50,5,14,18,68,13,68,18,23,243,243,243,115,18,5,100,15,18,68,14,68, - 18,23,243,243,243,115,23,18,78,15,23,18,68,9,68,18,247,247,247,247,119,18,68,9, - 68,13,242,242,242,242,114,13,68,8,31,228,228,228,228,228,36,31,8,31,228,228,228,228, - 228,36,31,7,95,228,228,228,228,164,95,7,95,228,228,228,228,164,95,8,31,228,228,228, - 228,228,36,31,8,31,228,228,228,228,228,36,31,9,68,13,242,242,242,242,114,13,68,9, - 68,18,247,247,247,247,119,18,68,19,68,18,23,19,23,19,23,18,14,18,19,23,243,243, - 243,19,23,18,68,16,68,18,23,82,23,13,36,5,18,23,243,243,243,23,18,68,19,68, - 18,23,14,4,14,23,15,13,5,4,14,23,243,243,243,23,18,68,16,68,18,14,68,14, - 37,4,5,18,23,243,243,243,23,18,68,17,68,18,15,5,4,37,36,13,14,19,23,243, - 243,243,23,18,68,16,68,18,23,15,5,18,14,100,18,23,243,243,243,23,18,68,18,68, - 18,23,51,23,18,13,69,14,23,243,19,23,243,179,23,18,68,19,68,18,23,19,23,19, - 87,19,50,23,115,119,83,119,243,19,23,18,68,19,68,18,23,211,55,51,87,18,14,13, - 133,14,15,18,55,211,23,18,68,19,68,18,23,243,51,23,18,14,5,228,36,5,13,18, - 23,179,23,18,68,16,68,18,23,243,23,19,14,5,228,196,14,55,115,23,18,68,17,68, - 18,23,211,23,18,5,228,228,36,5,18,23,83,23,18,68,16,68,18,23,179,23,14,228, - 228,132,5,18,23,51,23,18,68,16,68,18,23,147,23,14,228,228,196,5,19,23,19,23, - 18,68,16,68,18,23,115,23,14,228,228,228,4,13,23,19,23,18,68,14,68,18,23,83, - 23,14,228,228,228,68,18,55,18,68,20,68,18,23,51,23,18,228,68,5,4,13,15,14, - 37,228,36,5,55,18,68,21,68,18,23,83,5,228,5,14,50,5,18,87,50,14,13,5, - 196,18,23,18,68,23,68,18,23,19,23,14,196,5,15,18,87,50,115,87,19,18,15,13, - 100,13,23,18,68,23,68,18,55,18,5,100,5,14,18,55,115,55,51,119,51,55,18,5, - 68,5,23,18,68,24,68,18,55,14,68,5,15,19,55,19,183,19,55,18,46,15,18,23, - 19,23,18,132,50,68,28,68,18,23,18,5,36,5,18,23,83,23,18,13,37,14,18,23, - 18,5,100,5,15,55,14,132,15,18,68,22,68,18,23,15,100,18,23,51,23,14,132,5, - 18,5,196,18,23,13,132,14,18,68,21,68,18,23,5,100,13,23,19,23,14,196,5,14, - 196,5,23,5,132,14,18,68,20,68,18,19,5,100,5,18,23,18,228,4,14,5,196,18, - 5,132,14,18,68,16,68,50,164,14,23,14,228,4,5,13,196,14,164,14,18,68,18,68, - 18,15,164,5,23,5,228,4,5,15,164,5,13,164,14,18,68,17,68,18,14,196,18,5, - 228,4,5,19,5,132,37,164,15,18,68,17,68,18,14,196,14,5,228,4,5,23,14,132, - 14,5,164,50,68,19,68,18,14,196,5,13,228,4,14,23,18,100,5,18,164,5,19,18, - 68,19,68,18,14,228,13,228,4,18,55,5,36,5,23,14,164,5,23,18,68,22,68,18, - 14,228,5,13,196,14,23,19,23,15,5,14,19,23,13,164,15,23,18,68,21,68,18,15, - 228,4,18,13,100,5,14,23,147,23,51,5,132,5,18,23,18,68,20,68,50,228,4,14, - 23,18,14,13,14,18,23,211,23,18,164,14,55,18,68,19,68,18,23,5,228,5,19,151, - 19,183,19,23,15,132,5,18,55,18,68,25,68,18,23,13,228,4,15,23,18,19,87,18, - 45,15,18,19,55,14,132,14,23,19,23,18,68,20,68,18,23,18,228,4,5,87,18,14, - 5,132,37,13,132,5,83,23,18,68,16,68,18,55,5,228,4,47,5,228,228,18,23,51, - 23,18,68,14,68,18,55,18,228,228,228,68,14,23,83,23,18,68,16,68,18,23,19,23, - 13,228,228,228,4,14,23,115,23,18,68,16,68,18,23,19,23,19,5,228,228,196,14,23, - 147,23,18,68,16,68,18,23,51,23,18,5,228,228,132,14,23,179,23,18,68,17,68,18, - 23,83,23,18,5,228,228,36,5,18,23,211,23,18,68,16,68,18,23,115,55,14,228,196, - 5,14,19,23,243,23,18,68,20,68,18,23,179,23,18,13,5,228,36,5,14,18,23,51, - 23,211,23,18,68,20,68,18,23,211,55,18,15,14,133,13,14,18,87,51,50,119,83,23, - 18,68,19,68,18,23,243,19,119,83,119,115,23,14,69,13,18,23,51,23,18,68,18,68, - 18,23,243,179,23,243,19,23,18,100,14,18,5,18,23,18,68,17,68,18,23,243,243,243, - 23,19,14,13,36,37,4,5,15,18,68,16,68,18,23,243,243,243,23,18,5,4,37,13, - 68,14,18,68,19,68,18,23,243,243,243,23,14,4,5,14,18,23,14,4,14,23,18,68, - 16,68,18,23,243,243,243,23,18,5,36,13,23,82,23,18,68,17,68,18,23,243,243,243, - 19,23,18,15,14,18,87,19,23,18,68,12,68,18,23,243,243,243,83,87,115,23,18,68, - 9,68,18,247,247,247,247,119,18,68,9,68,13,242,242,242,242,114,13,68,8,31,228,228, - 228,228,228,36,31,8,31,228,228,228,228,228,36,31,7,95,228,228,228,228,164,95,7,95, - 228,228,228,228,164,95,8,31,228,228,228,228,228,36,31,8,31,228,228,228,228,228,36,31, - 11,68,14,30,24,254,254,254,254,62,14,68,10,68,126,14,45,16,254,254,254,190,68,14, - 68,62,16,5,13,21,14,5,13,254,254,254,158,68,14,68,62,4,21,29,28,55,5,14, - 254,254,254,126,68,16,68,30,14,13,29,25,22,19,23,15,13,254,254,254,126,68,16,68, - 30,13,6,26,25,15,19,23,18,13,254,254,254,126,68,16,68,30,13,6,8,9,20,15, - 23,14,13,254,254,254,126,68,15,68,30,13,6,12,7,49,24,5,16,254,254,254,126,68, - 14,68,30,16,4,7,16,24,16,45,254,254,254,158,68,12,68,62,14,5,45,5,14,254, - 254,254,190,68,13,68,126,16,14,254,94,46,141,14,16,254,126,68,14,68,254,190,14,13, - 3,13,181,14,37,13,254,62,68,18,68,254,126,14,5,13,21,27,189,22,19,23,18,14, - 5,14,254,68,18,68,254,62,17,5,13,21,61,28,154,28,15,51,55,18,37,222,68,19, - 68,254,30,14,4,21,61,58,155,28,26,23,115,55,14,4,24,158,68,18,68,254,14,3, - 26,29,58,219,29,22,19,23,147,23,15,4,158,68,19,68,222,14,3,28,29,26,251,26, - 29,15,19,23,179,23,14,13,126,68,19,68,190,14,3,61,26,251,27,28,26,18,19,23, - 211,23,5,14,94,68,19,68,158,16,4,26,29,26,251,59,28,22,19,23,243,23,18,5, - 94,68,20,68,158,5,21,29,26,251,59,26,29,15,19,23,243,19,23,5,14,62,68,18, - 68,126,45,29,26,251,123,28,18,19,23,243,19,23,18,5,62,68,17,68,94,17,4,26, - 28,251,123,29,22,243,147,23,5,17,30,68,20,68,94,13,21,29,26,251,91,26,29,22, - 19,23,243,83,23,5,14,30,68,18,68,94,3,26,28,251,155,29,15,19,23,243,83,23, - 15,13,30,68,18,68,62,14,13,29,26,251,123,29,22,23,243,147,23,18,13,30,68,21, - 68,62,13,21,29,28,27,58,251,26,29,22,19,23,243,115,23,18,13,17,68,23,68,62, - 3,9,21,26,28,29,28,27,58,187,29,15,19,23,243,115,23,18,5,16,68,25,68,30, - 16,3,12,8,11,9,21,58,29,28,27,58,59,28,26,23,243,179,23,18,5,16,68,25, - 68,30,14,3,12,9,11,72,9,12,25,26,92,26,29,22,19,23,243,147,23,18,13,24, - 68,23,68,30,14,6,12,9,107,72,44,21,26,28,29,15,19,23,243,147,23,18,13,30, - 68,19,68,30,13,6,12,9,235,40,11,12,21,18,243,211,23,14,13,30,68,19,68,30, - 13,6,12,235,107,8,7,17,52,23,243,115,23,5,14,30,68,18,68,30,13,6,12,9, - 235,107,16,24,81,52,55,243,23,5,62,68,19,68,30,13,6,12,9,235,107,16,24,177, - 52,55,115,23,18,5,62,68,20,68,30,14,6,12,9,235,75,7,241,113,20,15,23,19, - 23,5,14,62,68,17,68,30,16,3,12,9,235,75,7,24,241,177,20,15,5,94,68,14, - 68,62,3,235,139,16,24,241,177,24,14,13,94,68,16,68,62,13,6,12,235,43,7,16, - 241,177,24,16,4,126,68,17,68,62,14,3,12,9,235,11,7,24,241,177,24,13,14,126, - 68,17,68,94,4,7,12,235,11,16,24,241,113,16,24,14,5,158,68,17,68,94,14,3, - 12,9,203,9,16,241,113,16,24,14,4,190,68,18,68,126,5,6,12,9,171,7,24,241, - 81,16,24,16,4,16,190,68,18,68,126,17,4,7,12,9,139,16,24,241,81,24,14,4, - 16,222,68,19,68,158,16,4,7,12,9,75,9,16,24,241,17,56,14,5,16,254,68,17, - 68,190,16,4,6,44,9,11,7,24,241,56,16,45,254,62,68,19,68,222,24,5,3,7, - 44,16,24,16,113,88,16,13,5,14,254,94,68,18,68,254,30,14,5,3,6,16,152,17, - 16,14,13,5,14,254,158,68,16,68,254,94,15,13,37,77,37,45,16,254,30,16,17,126, - 68,14,68,254,222,112,254,94,13,5,13,3,13,24,62,68,13,68,254,254,254,158,45,16, - 24,12,6,5,62,68,15,68,254,254,254,126,14,5,56,16,9,12,3,14,30,68,15,68, - 254,254,254,126,13,47,20,16,8,12,6,14,30,68,15,68,254,254,254,126,5,18,51,22, - 21,9,6,14,30,68,14,68,254,254,254,126,5,18,55,26,61,3,16,30,68,14,68,254, - 254,254,126,13,14,23,15,61,21,5,62,68,12,68,254,254,254,158,5,46,21,13,5,94, - 68,10,68,254,254,254,190,14,45,14,126,68,11,68,14,254,254,254,254,62,24,30,14,68, - 8,31,228,228,228,228,228,36,31,8,31,228,228,228,228,228,36,31,7,95,228,228,228,228, - 164,95,7,95,228,228,228,228,164,95,8,31,228,228,228,228,228,36,31,8,31,228,228,228, - 228,228,36,31,9,68,14,254,254,254,254,126,14,68,7,68,254,254,254,254,190,68,10,68, - 254,14,13,14,254,254,254,94,68,13,68,94,14,16,62,16,36,13,254,254,254,94,68,14, - 68,62,16,4,5,62,45,4,14,254,254,254,94,68,18,68,30,16,4,5,4,5,14,4, - 5,4,5,14,254,254,254,62,68,15,68,62,13,4,5,46,13,5,36,13,254,254,254,62, - 68,13,68,94,13,14,94,13,4,13,254,254,254,94,68,9,68,254,46,16,254,254,254,94, - 68,7,68,254,254,254,254,190,68,11,68,254,254,30,46,141,14,16,254,126,68,12,68,254, - 190,14,13,228,36,5,14,254,62,68,10,68,254,126,14,5,228,196,14,254,68,10,68,254, - 94,13,228,228,36,13,222,68,10,68,254,30,16,228,228,132,13,190,68,9,68,254,14,228, - 228,196,13,158,68,10,68,222,14,228,228,228,4,14,126,68,10,68,190,16,228,228,228,68, - 24,94,68,13,68,190,228,196,14,18,15,14,5,228,13,94,68,20,68,158,13,228,4,3, - 13,21,13,36,18,119,18,15,14,5,132,24,62,68,18,68,126,14,196,13,53,26,61,21, - 4,5,18,247,5,100,14,62,68,23,68,126,5,100,3,21,26,189,26,4,5,23,18,14, - 37,14,19,23,18,132,5,62,68,24,68,94,14,132,5,26,29,26,29,21,45,21,29,13, - 14,18,5,100,5,23,15,164,62,68,19,68,94,5,164,21,61,13,100,13,21,14,5,164, - 15,14,164,16,30,68,22,68,62,16,196,13,29,21,36,5,68,45,6,7,6,13,3,36, - 37,164,14,30,68,22,68,62,13,196,3,25,3,13,14,16,68,45,6,76,11,38,13,5, - 164,14,30,68,20,68,62,5,196,5,22,16,88,13,36,3,21,7,204,7,3,132,14,30, - 68,25,68,62,164,13,14,16,88,17,24,14,36,13,21,12,7,6,3,13,6,44,6,164, - 14,30,68,25,68,30,16,132,13,56,17,24,14,45,14,16,13,4,13,12,6,132,6,12, - 6,164,14,30,68,22,68,30,14,132,5,16,17,24,14,100,5,14,5,26,6,196,7,3, - 164,16,30,68,18,68,30,14,164,14,24,14,164,13,21,25,3,196,6,3,164,62,68,17, - 68,30,14,164,5,24,13,164,5,22,21,228,3,164,5,62,68,16,68,30,14,196,16,13, - 164,5,16,6,228,3,164,13,62,68,16,68,30,14,196,45,164,5,16,7,196,13,3,164, - 16,62,68,18,68,30,16,196,5,13,164,13,24,16,6,132,3,7,164,5,94,68,18,68, - 62,228,13,164,14,24,16,12,6,67,6,12,6,164,14,94,68,23,68,62,5,196,13,14, - 5,36,5,14,24,16,24,9,12,11,7,76,13,132,5,126,68,19,68,62,14,228,48,46, - 16,88,16,14,7,76,11,9,3,132,14,126,68,19,68,62,24,228,13,120,17,14,13,5, - 36,3,38,9,6,132,13,158,68,14,68,94,13,228,16,24,16,14,13,228,35,132,190,68, - 12,68,94,17,228,13,14,5,228,228,16,190,68,10,68,126,14,228,228,228,4,14,222,68, - 9,68,158,13,228,228,196,14,254,68,10,68,190,13,228,228,132,16,254,30,68,10,68,222, - 13,228,228,36,13,254,94,68,10,68,254,14,228,196,5,14,254,126,68,12,68,254,62,14, - 5,228,36,13,14,254,190,68,11,68,254,126,16,14,141,46,254,254,30,68,7,68,254,254, - 254,254,190,68,12,68,254,254,254,94,14,5,13,126,24,94,68,15,68,254,254,254,62,24, - 13,4,13,94,13,4,16,62,68,14,68,254,254,254,62,13,100,45,4,5,4,16,30,68, - 18,68,254,254,254,62,17,13,4,13,4,16,14,5,4,5,16,30,68,14,68,254,254,254, - 94,14,4,5,13,62,14,5,94,68,10,68,254,254,254,94,14,36,24,222,68,9,68,254, - 254,254,126,16,24,254,68,7,68,254,254,254,254,190,68,9,68,14,254,254,254,254,126,14, - 68,8,31,228,228,228,228,228,36,31,8,31,228,228,228,228,228,36,31,7,95,228,228,228, - 228,164,95,7,95,228,228,228,228,164,95,8,31,228,228,228,228,228,36,31,8,31,228,228, - 228,228,228,36,31,9,68,14,254,254,254,254,126,14,68,7,68,254,254,254,254,190,68,7, - 68,254,254,254,254,190,68,7,68,254,254,254,254,190,68,7,68,254,254,254,254,190,68,7, - 68,254,254,254,254,190,68,7,68,254,254,254,254,190,68,7,68,254,254,254,254,190,68,7, - 68,254,254,254,254,190,68,7,68,254,254,254,254,190,68,10,68,254,254,62,54,61,86,254, - 158,68,12,68,254,190,54,27,249,25,28,22,254,62,68,16,68,254,126,22,28,57,27,60, - 155,60,27,25,27,22,254,68,15,68,254,94,22,25,27,28,251,123,28,27,25,22,222,68, - 13,68,254,62,27,25,28,251,251,28,25,29,190,68,14,68,254,22,25,27,28,251,251,59, - 28,25,22,158,68,13,68,222,22,25,28,251,251,155,28,25,22,126,68,11,68,222,25,28, - 251,251,219,28,25,126,68,11,68,190,251,251,251,59,28,25,22,94,68,13,68,158,29,25, - 28,251,251,59,124,123,25,94,68,20,68,126,22,25,28,251,187,60,27,28,27,121,27,28, - 27,28,25,22,62,68,22,68,126,28,251,187,28,27,57,27,25,28,22,62,22,26,25,28, - 27,25,28,62,68,21,68,94,22,25,28,251,59,28,59,57,54,25,22,190,22,25,28,27, - 26,62,68,19,68,94,28,251,92,89,28,22,158,12,104,22,30,22,25,28,25,62,68,28, - 68,94,25,28,187,28,89,29,22,29,62,22,8,22,30,11,40,11,8,11,8,22,30,25, - 28,25,62,68,26,68,62,22,25,28,91,60,27,25,54,158,72,54,8,12,62,22,8,43, - 30,29,26,25,22,30,68,25,68,62,28,91,121,27,126,12,8,22,30,12,40,22,12,8, - 22,94,75,30,22,57,22,30,68,29,68,62,25,91,29,86,62,44,11,8,11,8,54,40, - 44,8,12,62,22,8,11,12,30,29,27,25,22,30,68,27,68,62,25,28,25,190,40,44, - 8,43,8,43,8,12,22,8,43,12,8,11,8,62,25,28,25,62,68,26,68,62,25,28, - 26,30,22,40,22,30,12,8,11,22,235,30,22,136,22,30,28,27,28,25,62,68,31,68, - 30,22,25,28,25,30,22,40,22,30,22,40,22,12,8,11,12,8,43,8,94,86,62,29, - 25,28,27,25,62,68,26,68,30,22,25,28,25,30,22,40,22,62,40,54,40,54,72,62, - 22,94,22,57,28,59,28,62,68,28,68,30,22,25,28,25,62,8,11,12,30,22,40,22, - 30,40,12,62,12,62,22,153,91,28,25,22,62,68,22,68,62,25,28,25,29,30,139,40, - 62,12,62,22,94,29,25,156,91,28,25,94,68,20,68,62,25,60,25,62,104,11,62,22, - 62,28,57,28,57,251,59,28,94,68,22,68,62,26,91,28,62,54,94,27,25,28,57,28, - 59,28,251,27,28,25,22,94,68,16,68,62,28,25,123,22,94,22,25,91,28,251,219,28, - 126,68,16,68,62,22,25,28,91,153,28,251,251,27,28,25,22,126,68,13,68,94,25,123, - 156,251,251,27,28,25,29,158,68,11,68,94,22,25,28,251,251,251,59,190,68,11,68,126, - 25,28,251,251,219,28,25,222,68,13,68,126,22,25,28,251,251,155,28,25,22,222,68,14, - 68,158,22,25,28,251,251,59,28,27,25,22,254,68,13,68,190,29,25,28,251,251,28,25, - 27,254,62,68,15,68,222,22,25,27,28,251,123,28,27,25,22,254,94,68,16,68,254,22, - 27,25,27,60,155,60,27,57,28,22,254,126,68,12,68,254,62,22,28,249,25,27,54,254, - 190,68,10,68,254,158,86,61,54,254,254,62,68,7,68,254,254,254,254,190,68,7,68,254, - 254,254,254,190,68,7,68,254,254,254,254,190,68,7,68,254,254,254,254,190,68,7,68,254, - 254,254,254,190,68,7,68,254,254,254,254,190,68,7,68,254,254,254,254,190,68,7,68,254, - 254,254,254,190,68,7,68,254,254,254,254,190,68,9,68,14,254,254,254,254,126,14,68,8, - 31,228,228,228,228,228,36,31,8,31,228,228,228,228,228,36,31,7,95,228,228,228,228,164, - 95, -}; -static const uint16_t table_pixels[] = { - 2209,2210,2210,4290,4290,4322,4322,4355,6435,6467,6500,6532,8612,8645,8645,8645,8645,8645,8645,8612,6532,6500,6467,6435, - 4355,4322,4322,4290,4290,2210,2210,2209,2210,2242,4290,4322,4322,4355,6467,6500,8612,8645,8677,10757,10790,10790,10822,10822, - 10822,10822,10790,10790,10757,8677,8645,8612,6500,6467,4355,4322,4322,4290,2242,2210,2242,4290,4322,4355,6435,6500,8612,8677, - 10757,10822,10854,12903,12935,12967,12967,12967,12967,12967,12967,12935,12903,10854,10822,10757,8677,8612,6500,6435,4355,4322,4290,2242, - 4290,4322,4355,6467,6532,8645,10757,10822,10854,12935,12967,12999,13000,15080,15080,15080,15080,15080,15080,13000,12999,12967,12935,10854, - 10822,10757,8645,6532,6467,4355,4322,4290,4322,4355,6467,6532,8677,10790,10854,12935,12967,13000,15080,15112,15112,15112,15112,15112, - 15144,15112,15112,15112,15112,15080,13000,12967,12935,10854,10790,8677,6532,6467,4355,4322,4355,6467,6532,8677,10790,10854,12967,12999, - 15080,15112,15112,15144,15145,15145,15145,15145,15145,15145,15145,15145,15144,15112,15112,15080,12999,12967,10854,10790,8677,6532,6467,4355, - 4387,6500,8645,10790,10854,12967,13000,15080,15112,15144,15145,15145,15177,17225,17225,17225,17225,17225,17225,15177,15145,15145,15144,15112, - 15080,13000,12967,10854,10790,8645,6500,4387,6467,8612,10757,10822,12935,12999,15080,15112,15144,15145,15177,17225,17225,17225,17225,17225, - 17225,17225,17225,17225,17225,15177,15145,15144,15112,15080,12999,12935,10822,10757,8612,6467,6532,8677,10790,12935,12967,15080,15112,15144, - 15145,15177,17225,17225,17225,17225,17225,17225,17225,17225,17225,17225,17225,17225,15177,15145,15144,15112,15080,12967,12935,10790,8677,6532, - 8612,8709,10822,12967,13000,15112,15112,15145,15177,17225,17225,17225,17225,17225,17225,17225,17225,17225,17225,17225,17225,17225,17225,15177, - 15145,15112,15112,13000,12967,10822,8709,8612,8612,10757,10854,12967,15080,15112,15144,15145,17225,17225,17225,17225,17225,17225,17225,17225, - 17225,17225,17225,17225,17225,17225,17225,17225,15145,15144,15112,15080,12967,10854,10757,8612,8645,10790,12903,12967,15080,15112,15144,15145, - 17225,17225,17225,17225,17225,17225,17225,17225,17225,17225,17225,17225,17225,17225,17225,17225,15145,15144,15112,15080,12967,12903,10790,8645, - 8645,10790,12903,12967,15080,15112,15144,15145,17225,17225,17225,17225,17225,17225,17225,17225,17225,17225,17225,17225,17225,17225,17225,17225, - 15145,15144,15112,15080,12967,12903,10790,8645,8612,10757,10854,12967,15080,15112,15144,15145,17225,17225,17225,17225,17225,17225,17225,17225, - 17225,17225,17225,17225,17225,17225,17225,17225,15145,15144,15112,15080,12967,10854,10757,8612,8612,8709,10822,12935,13000,15112,15144,15145, - 15177,17225,17225,17225,17225,17225,17225,17225,17225,17225,17225,17225,17225,17225,17225,15177,15145,15112,15112,13000,12967,10822,8709,8612, - 6532,8677,10790,12935,12967,15080,15112,15144,15145,15177,17225,17225,17225,17225,17225,17225,17225,17225,17225,17225,17225,17225,15177,15145, - 15144,15112,15080,12967,12935,10790,8677,6532,6467,8612,10757,10822,12935,12999,15080,15112,15144,15145,15177,17225,17225,17225,17225,17225, - 17225,17225,17225,17225,17225,15177,15145,15144,15112,15080,12999,12935,10822,10757,8612,6467,4387,6500,8645,10790,10854,12967,13000,15080, - 15112,15144,15145,15145,15177,17225,17225,17225,17225,17225,17225,15177,15145,15145,15144,15112,15080,13000,12967,10854,10790,8645,6500,4387, - 4355,6467,6532,8677,10790,10854,12967,12999,15080,15112,15112,15144,15145,15145,15145,15145,15145,15145,15145,15145,15144,15112,15112,15080, - 12999,12967,10854,10790,8677,6532,6467,4355,4322,4355,6467,6532,8677,10790,10854,12935,12967,13000,15080,15112,15112,15112,15112,15112, - 15144,15112,15112,15112,15112,15080,13000,12967,12935,10854,10790,8677,6532,6467,4355,4322,4290,4322,4355,6467,6532,8645,10757,10822, - 10854,12935,12967,12999,13000,15080,15080,15080,15080,15080,15080,13000,12999,12967,12935,10854,10822,10757,8645,6532,6467,4355,4322,4290, - 2242,4290,4322,4355,6435,6500,8612,8677,10757,10822,10854,12903,12935,12967,12967,12967,12967,12967,12967,12935,12903,10854,10822,10757, - 8677,8612,6500,6435,4355,4322,4290,2242,2210,2242,4290,4322,4322,4355,6467,6500,8612,8645,8677,10757,10790,10790,10822,10822, - 10822,10822,10790,10790,10757,8677,8645,8612,6500,6467,4355,4322,4322,4290,2242,2210,2209,2210,2210,4290,4290,4322,4322,4355, - 6435,6467,6500,6532,8612,8645,8645,8645,8645,8645,8645,8612,6532,6500,6467,6435,4355,4322,4322,4290,4290,2210,2210,2209, -}; diff --git a/games/uno/src/bot.c b/games/uno/src/bot.c new file mode 100644 index 00000000..35321606 --- /dev/null +++ b/games/uno/src/bot.c @@ -0,0 +1,161 @@ +/* The bots. Each one sees what a player at the table sees: its own hand, the discard pile, how many cards the + * others hold, who drew on which colour. Easy plays any card that goes and often forgets UNO; Normal keeps its + * Wilds, plays its high cards and its biggest colour, and stops a player about to go out; Hard also plays to the + * colours the next player lacks, gets rid of its points when someone is about to win, challenges by counting + * the cards it has seen, and may bluff a Wild Draw Four to stop the last card. */ +#include "game.h" + +static uint32_t brand(uno_game *g) { + uint32_t x = g->brng; + x ^= x << 13, x ^= x >> 17, x ^= x << 5; + return g->brng = x ? x : 0x2545F491u; +} +static bool chance(uno_game *g, int pct) { return (int)(brand(g) % 100) < pct; } + +static int colour_count(const uno_game *g, int p, int col) { + int n = 0; + for (int i = 0; i < g->count[p]; i++) n += uno_color(g->hand[p][i]) == col; + return n; +} + +int bot_best_color(const uno_game *g, int p, int level) { + int s[4] = {0, 0, 0, 0}; + for (int i = 0; i < g->count[p]; i++) { + int c = g->hand[p][i]; + if (c < 52) s[uno_color(c)] += 10 + uno_points(c) / 4; /* the colour it holds most, then the points */ + } + if (level == LEVEL_HARD) { + int nx = uno_next(g, p); + for (int col = 0; col < 4; col++) + if (g->lacks[nx] >> col & 1) s[col] += g->count[nx] <= 3 ? 14 : 4; + } + int best = 0; + for (int col = 1; col < 4; col++) + if (s[col] > s[best]) best = col; + return best; +} + +static bool says_uno(uno_game *g, int p, int level) { + if (g->count[p] != 2) return false; + return level == LEVEL_HARD ? true : !chance(g, level == LEVEL_EASY ? 25 : 8); +} + +static bool attacks(const uno_game *g, int c) { + int v = uno_value(c); + return v == V_SKIP || v == V_DRAW2 || c == C_WILD4 || (v == V_REVERSE && g->r.players == 2); +} + +/* Hard only: an illegal Wild Draw Four, when the next player is down to one card and nothing else stops them */ +static bool bluff_ok(const uno_game *g, int p) { + if (g->count[uno_next(g, p)] != 1) return false; + for (int i = 0; i < g->count[p]; i++) { + int c = g->hand[p][i]; + if (c != C_WILD4 && attacks(g, c) && uno_matches(g, c)) return false; + } + return true; +} + +static int score(const uno_game *g, int p, int i, int level) { + int c = g->hand[p][i], v = uno_value(c), col = uno_color(c), n = g->r.players, nx = uno_next(g, p); + bool threat = g->count[nx] <= 2; + int s; + if (c >= 52) { + s = g->count[p] <= 2 ? 60 : -40; /* Wilds are kept for when nothing else goes */ + if (c == C_WILD4 && !threat) s -= 20; + } else { + s = uno_points(c) + 6 * (colour_count(g, p, col) - 1); /* high cards first, staying in a colour it holds */ + } + if (threat && attacks(g, c)) s += level == LEVEL_HARD ? 120 : 70; + if (v == V_REVERSE && n > 2) { + int back = (p + n - g->dir) % n; /* who plays next after it */ + if (g->count[back] <= 2 && !threat) s -= 60; + else if (threat && g->count[back] > 2) s += 50; + } + if (level == LEVEL_HARD) { + if (col < 4 && (g->lacks[nx] >> col & 1)) s += 15; + bool close = false; + for (int q = 0; q < n; q++) close |= q != p && g->count[q] <= 2; + if (close && !g->r.one_hand) s += uno_points(c) / 2; /* about to lose the hand: shed the points */ + } + return s; +} + +/* how likely the Wild Draw Four's player held the colour before it, from the cards this player has seen, in + * 65536ths: their other cards drawn at random from the ones it hasn't seen */ +static uint32_t guilt(const uno_game *g, int p) { + int col = g->prev_color, unseen = UNO_DECK - g->count[p] - g->pn, left = 25 - colour_count(g, p, col); + for (int i = 0; i < g->pn; i++) left -= uno_color(g->pile[i]) == col; + uint32_t none = 65536; + for (int k = 0; k < g->count[g->offender] && none; k++) { + int a = unseen - left - k, b = unseen - k; + if (b <= 0) break; + none = a <= 0 ? 0 : (uint32_t)((uint64_t)none * (uint32_t)a / (uint32_t)b); + } + return 65536 - none; +} + +static bool challenges(uno_game *g, int level) { + if (level == LEVEL_EASY) return chance(g, 20); + /* honest players play it only without the colour: worth it on strong evidence (62.5%, Normal 80%) */ + uint32_t need = level == LEVEL_HARD ? 40960 : 52429; + return guilt(g, g->turn) >= need; +} + +uno_move bot_move(uno_game *g, int level) { + uno_move m = {M_DRAW, 0, false}; + int p = g->turn; + if (g->phase == P_COLOR) { + m.act = M_COLOR; + m.arg = (uint8_t)(level == LEVEL_EASY && chance(g, 40) ? (int)(brand(g) % 4) : bot_best_color(g, p, level)); + return m; + } + if (g->phase == P_DRAWN) { + int c = g->hand[p][g->drawn]; + bool play = true; + if (!(g->r.house & H_MUST_PLAY)) { + if (c == C_WILD4 && !uno_legal_wild4(g, p) && !(level == LEVEL_HARD && bluff_ok(g, p))) play = false; + else if (level == LEVEL_EASY && chance(g, 15)) play = false; + } + m.act = play ? M_PLAY : M_KEEP, m.arg = g->drawn, m.uno = play && says_uno(g, p, level); + return m; + } + /* P_PLAY, or P_PENALTY with a card to stack */ + int best = -1, best_s = -1000000; + for (int i = 0; i < g->count[p]; i++) { + if (!uno_can_play(g, i)) continue; + int c = g->hand[p][i]; + if (c == C_WILD4 && g->phase == P_PLAY && !uno_legal_wild4(g, p) && !(level == LEVEL_HARD && bluff_ok(g, p))) continue; + int s = level == LEVEL_EASY ? (int)(brand(g) % 1000) : score(g, p, i, level); + if (s > best_s) best_s = s, best = i; + } + if (g->phase == P_PENALTY) { + if (best >= 0 && (level != LEVEL_EASY || chance(g, 70))) { + m.act = M_PLAY, m.arg = (uint8_t)best, m.uno = says_uno(g, p, level); + } else { + m.act = g->challengeable && challenges(g, level) ? M_CHALLENGE : M_TAKE; + } + return m; + } + if (best >= 0) m.act = M_PLAY, m.arg = (uint8_t)best, m.uno = says_uno(g, p, level); + return m; +} + +bool bot_do(uno_game *g, uno_move m) { + switch (m.act) { + case M_PLAY: return uno_play(g, m.arg, m.uno); + case M_DRAW: return uno_draw(g); + case M_KEEP: return uno_keep(g); + case M_TAKE: return uno_take(g); + case M_CHALLENGE: return uno_challenge(g); + default: return uno_choose(g, m.arg); + } +} + +bool bot_catches(uno_game *g, int by, int level, uint32_t *ms) { + static const uint8_t pct[3] = {35, 70, 95}; + static const uint16_t base[3] = {1500, 1000, 600}, spread[3] = {700, 500, 400}; + if (g->uno_open == UNO_NONE || by == g->uno_open) return false; + bool yes = chance(g, pct[level]); + *ms = base[level] + brand(g) % spread[level]; + return yes; +} diff --git a/games/uno/src/draw.c b/games/uno/src/draw.c new file mode 100644 index 00000000..3c44445d --- /dev/null +++ b/games/uno/src/draw.c @@ -0,0 +1,840 @@ +/* The screens. Cards are drawn, not pictures: the white border, the colour, the tilted oval and the big number + * or symbol of the classic deck, sized for 320x240. */ +#include +#include "gfx.h" +#include "draw.h" + +void plat_push(int x, int y, int w, int h, const uint16_t *px); /* (plat.h: its key names are the launcher's too) */ + +void np_push(int x, int y, int w, int h, const color_t *px) { plat_push(x, y, w, h, px); } +static color_t strip[SCREEN_W * STRIP_H]; + +#define WHITE 0xFFFF +#define INK HEX(0x111827) +#define FOCUS HEX(0xFFD43B) +#define MUTED HEX(0xA8B3C7) +#define PANEL HEX(0x1B2436) +#define CARD_BLACK HEX(0x1C1C1E) +static const color_t CARD[5] = {HEX(0xE53935), HEX(0xF7C21B), HEX(0x2EA34F), HEX(0x1E7BD8), HEX(0x1C1C1E)}; +static const char *const COLOR_NAME[4] = {"Red", "Yellow", "Green", "Blue"}; +static const char *const NAMES[4] = {"You", "Bot 1", "Bot 2", "Bot 3"}; + +const char *uno_name(int p) { return p >= 0 && p < 4 ? NAMES[p] : ""; } + +static char *put(char *p, const char *s) { + while (*s) *p++ = *s++; + *p = 0; + return p; +} +static char *num(char *p, unsigned v) { + char t[8]; + int n = 0; + do t[n++] = (char)('0' + v % 10); while ((v /= 10) && n < 8); + while (n) *p++ = t[--n]; + *p = 0; + return p; +} + +void uno_card_name(int c, char *out) { + if (c == C_WILD) { put(out, "Wild"); return; } + if (c == C_WILD4) { put(out, "Wild +4"); return; } + char *p = put(out, COLOR_NAME[uno_color(c)]); + *p++ = ' '; + int v = uno_value(c); + if (v < 10) num(p, (unsigned)v); + else put(p, v == V_SKIP ? "Skip" : v == V_REVERSE ? "Reverse" : "+2"); +} + +/* ------------------------------------------------------------------ shapes, smoothed */ +static inline void put32(int x, int y, color_t c, int t) { + if (t <= 0 || x < 0 || x >= SCREEN_W || y < gfx_y0 || y >= gfx_y1) return; + color_t *d = &gfx_buf[(y - gfx_y0) * SCREEN_W + x]; + *d = t >= 32 ? c : gfx_mix(*d, c, t); +} +static inline void plot(int x, int y, color_t c, float cov) { put32(x, y, c, (int)(cov * 32 + 0.5f)); } +static inline float clamp01(float v) { return v < 0 ? 0 : v > 1 ? 1 : v; } +static inline float len2(float x, float y) { return __builtin_sqrtf(x * x + y * y); } + +/* rows of a box that are in the strip */ +static bool rows(float y0, float y1, int *a, int *b) { + *a = NP_MAX((int)y0 - 1, gfx_y0), *b = NP_MIN((int)y1 + 2, gfx_y1); + return *a < *b; +} + +/* an ellipse turned so that its long axis (a) points up and to the right, as on the cards; quarters: the Wild's + * four colours. Each row: the inside filled at once, the edges smoothed. */ +static void oval(float cx, float cy, float a, float b, color_t c, const color_t *quarters) { + const float ax = 0.5f, ay = -0.866f, bx = 0.866f, by = 0.5f; + float ey = __builtin_sqrtf(a * a * ay * ay + b * b * by * by); + int r0, r1; + if (!rows(cy - ey, cy + ey, &r0, &r1)) return; + /* u^2 + v^2 = 1 as A x^2 + B x y + C y^2 = 1, for the ellipse grown and shrunk by 0.75 pixel */ + float Ao[2], Bo[2], Co[2]; + for (int k = 0; k < 2; k++) { + float aa = a + (k ? -0.75f : 0.75f), bb = b + (k ? -0.75f : 0.75f); + aa = aa < 0.5f ? 0.5f : aa, bb = bb < 0.5f ? 0.5f : bb; + Ao[k] = ax * ax / (aa * aa) + bx * bx / (bb * bb); + Bo[k] = 2 * (ax * ay / (aa * aa) + bx * by / (bb * bb)); + Co[k] = ay * ay / (aa * aa) + by * by / (bb * bb); + } + for (int y = r0; y < r1; y++) { + float dy = y + 0.5f - cy, sp[2][2]; + bool has[2]; + for (int k = 0; k < 2; k++) { + float qb = Bo[k] * dy, disc = qb * qb - 4 * Ao[k] * (Co[k] * dy * dy - 1); + has[k] = disc > 0; + if (has[k]) { + float r = __builtin_sqrtf(disc); + sp[k][0] = cx + (-qb - r) / (2 * Ao[k]), sp[k][1] = cx + (-qb + r) / (2 * Ao[k]); + } + } + if (!has[0]) continue; + int xo0 = (int)sp[0][0] - 1, xo1 = (int)sp[0][1] + 2; + int xi0 = has[1] ? (int)sp[1][0] + 1 : xo1, xi1 = has[1] ? (int)sp[1][1] : xo1; + if (xi1 < xi0) xi0 = xi1 = xo1; + for (int x = NP_MAX(xo0, 0); x < NP_MIN(xo1, SCREEN_W); x++) { + bool inside = x >= xi0 && x < xi1; + float dx = x + 0.5f - cx; + float u = (dx * ax + dy * ay) / a, v = (dx * bx + dy * by) / b; + color_t k = quarters ? quarters[(u < 0) * 2 + ((u < 0) != (v > 0))] : c; + if (inside) { + if (!quarters) { /* the whole inside of the row in one go */ + color_t *d = &gfx_buf[(y - gfx_y0) * SCREEN_W + x]; + for (int n = NP_MIN(xi1, SCREEN_W) - x; n > 0; n--) *d++ = c; + x = NP_MIN(xi1, SCREEN_W) - 1; + } else { + gfx_buf[(y - gfx_y0) * SCREEN_W + x] = k; + } + continue; + } + float r = __builtin_sqrtf(u * u + v * v), l = len2(dx, dy), d = r > 0.001f ? l - l / r : -a; + plot(x, y, k, clamp01(0.5f - d)); + } + } +} + +/* a stroke from (x0, y0) to (x1, y1), w wide, round ends */ +static void stroke(float x0, float y0, float x1, float y1, float w, color_t c) { + float r = w * 0.5f; + int r0, r1; + if (!rows((y0 < y1 ? y0 : y1) - r, (y0 > y1 ? y0 : y1) + r, &r0, &r1)) return; + int xa = (int)((x0 < x1 ? x0 : x1) - r) - 1, xb = (int)((x0 > x1 ? x0 : x1) + r) + 2; + float dx = x1 - x0, dy = y1 - y0, ll = dx * dx + dy * dy; + for (int y = r0; y < r1; y++) + for (int x = xa; x < xb; x++) { + float px = x + 0.5f - x0, py = y + 0.5f - y0; + float t = ll > 0 ? clamp01((px * dx + py * dy) / ll) : 0; + plot(x, y, c, clamp01(0.5f - (len2(px - t * dx, py - t * dy) - r))); + } +} + +static void ring(float cx, float cy, float r, float w, color_t c) { + int r0, r1; + if (!rows(cy - r - w, cy + r + w, &r0, &r1)) return; + for (int y = r0; y < r1; y++) + for (int x = (int)(cx - r - w) - 1; x < (int)(cx + r + w) + 2; x++) { + float d = __builtin_fabsf(len2(x + 0.5f - cx, y + 0.5f - cy) - r) - w * 0.5f; + plot(x, y, c, clamp01(0.5f - d)); + } +} + +static void tri(float ax, float ay, float bx, float by, float qx, float qy, float grow, color_t c) { + float lo = ay < by ? ay : by, hi = ay > by ? ay : by; + lo = lo < qy ? lo : qy, hi = hi > qy ? hi : qy; + float le = ax < bx ? ax : bx, ri = ax > bx ? ax : bx; + le = le < qx ? le : qx, ri = ri > qx ? ri : qx; + lo -= grow, hi += grow, le -= grow, ri += grow; + float area = (bx - ax) * (qy - ay) - (by - ay) * (qx - ax), s = area < 0 ? -1.0f : 1.0f; + float ex[3] = {ax, bx, qx}, ey[3] = {ay, by, qy}; + int r0, r1; + if (!rows(lo, hi, &r0, &r1)) return; + for (int y = r0; y < r1; y++) + for (int x = (int)le - 1; x < (int)ri + 2; x++) { + float px = x + 0.5f, py = y + 0.5f, d = -1e9f; + for (int k = 0; k < 3; k++) { + float x0 = ex[k], y0 = ey[k], x1 = ex[(k + 1) % 3], y1 = ey[(k + 1) % 3]; + float nx = (y1 - y0) * s, ny = -(x1 - x0) * s, nl = len2(nx, ny); + float e = ((px - x0) * nx + (py - y0) * ny) / nl; /* > 0 outside this edge */ + if (e > d) d = e; + } + plot(x, y, c, clamp01(0.5f - (d - grow))); + } +} + +/* text from the font's 4-bit letters, scaled (q8: 256 = its size) and leant (shear: pixels per pixel up), with a + * dark edge e pixels wide (one at the font's own size); scaled letters are smoothed and sharpened back */ +static inline int cov_at(const uint8_t *d, const np_glyph_t *g, int i, int j) { + if ((unsigned)i >= g->w || (unsigned)j >= g->h) return 0; + int n = j * g->w + i; + return d[g->offset + (n >> 1)] >> ((n & 1) * 4) & 15; +} +static float sample(const uint8_t *d, const np_glyph_t *g, float sx, float sy) { + int ix = (int)(sx + 8) - 8, iy = (int)(sy + 8) - 8; + float fx = sx - ix, fy = sy - iy; + return (cov_at(d, g, ix, iy) * (1 - fx) + cov_at(d, g, ix + 1, iy) * fx) * (1 - fy) + + (cov_at(d, g, ix, iy + 1) * (1 - fx) + cov_at(d, g, ix + 1, iy + 1) * fx) * fy; +} +static int big_width(const np_font_t *f, const char *s, int q8) { + int w = 0; + for (; *s; s++) w += f->glyphs[(uint8_t)*s - f->first].advance; + return w * q8 >> 8; +} +static void big_text(const np_font_t *f, int x, int base, const char *s, int q8, float shear, color_t c, color_t edge, + int e) { + int top = base - (f->ascent * q8 >> 8) - 3, bot = base + (f->descent * q8 >> 8) + 3; + if (bot <= gfx_y0 || top >= gfx_y1) return; + const uint8_t *data = f->data; + float k = 256.0f / q8, pen = (float)x, ek = e * k; + for (; *s; s++) { + const np_glyph_t *g = &f->glyphs[(uint8_t)*s - f->first]; + float gx = pen + g->x * q8 / 256.0f, gy = base + g->y * q8 / 256.0f, gw = g->w * q8 / 256.0f, gh = g->h * q8 / 256.0f; + int y0 = NP_MAX((int)gy - 1 - e, gfx_y0), y1 = NP_MIN((int)(gy + gh) + 2 + e, gfx_y1); + for (int y = y0; y < y1; y++) { + float lean = (base - (y + 0.5f)) * shear; + int xa = (int)(gx + lean) - 1 - e, xb = (int)(gx + lean + gw) + 2 + e; + if (q8 == 256) { /* its own size: the letter's pixels, no smoothing needed */ + float fo = gx + lean; + int ox = (int)(fo + 8) - 8, oy = (int)(gy + 0.5f), j = y - oy, fx = (int)((fo - ox) * 16); /* (1/16ths) */ + for (int xx = xa; xx < xb; xx++) { + int i = xx - ox, v = (cov_at(data, g, i, j) * (16 - fx) + cov_at(data, g, i - 1, j) * fx + 8) >> 4; + if (e) { + int m = 0; + for (int dj = -1; dj <= 1; dj++) + for (int di = -1; di <= 1; di++) { + int w = cov_at(data, g, i + di, j + dj); + m = w > m ? w : m; + } + if (m > v) put32(xx, y, edge, (m * 32 + 7) / 15); + } + put32(xx, y, c, (v * 32 + 7) / 15); + } + continue; + } + float sy = (y + 0.5f - gy) * k - 0.5f; + for (int xx = xa; xx < xb; xx++) { + float sx = (xx + 0.5f - gx - lean) * k - 0.5f; + float v = clamp01((sample(data, g, sx, sy) / 15.0f - 0.5f) * 2.2f + 0.5f); + if (e) { + float m = sample(data, g, sx - ek, sy); + float t = sample(data, g, sx + ek, sy); + m = t > m ? t : m, t = sample(data, g, sx, sy - ek), m = t > m ? t : m, t = sample(data, g, sx, sy + ek); + m = clamp01(((t > m ? t : m) / 15.0f - 0.5f) * 2.2f + 0.5f); + if (m > v) plot(xx, y, edge, m); + } + plot(xx, y, c, v); + } + } + pen += g->advance * q8 / 256.0f; + } +} +/* the same, centred */ +static void big_label(const np_font_t *f, int cx, int base, const char *s, int q8, float shear, color_t c, color_t edge, + int e) { + big_text(f, cx - big_width(f, s, q8) / 2, base, s, q8, shear, c, edge, e); +} + +static void text(int x, int y, const char *s, color_t c) { gfx_text(&np_font_small, x, y, s, c, 256); } +static void ctext(const np_font_t *f, int x, int y, const char *s, color_t c) { gfx_text_center(f, x, y, s, c, 256); } + +/* ------------------------------------------------------------------ cards */ +/* the symbol of a card, centred at (cx, cy), s high (s: about the height of a digit) */ +static void symbol(int card, float cx, float cy, float s, color_t c, color_t edge) { + int v = uno_value(card); + float w = s * (v == V_REVERSE ? 0.13f : 0.17f) + 1.0f; + for (int pass = 0; pass < 2; pass++) { + color_t k = pass ? c : edge; + float ww = pass ? w : w + 2.0f; + if (v == V_SKIP) { + float r = s * 0.42f; + ring(cx, cy, r, ww, k); + stroke(cx - r * 0.68f, cy - r * 0.68f, cx + r * 0.68f, cy + r * 0.68f, ww, k); + } else { /* Reverse: two arrows side by side, one each way */ + const float dx = 0.7071f, dy = -0.7071f, nx = 0.7071f, ny = 0.7071f; + bool tiny = s < 14; /* (in a corner: bigger heads) */ + float L = s * (tiny ? 0.55f : 0.44f), hl = s * (tiny ? 0.5f : 0.28f), hw = s * (tiny ? 0.32f : 0.2f), o = s * 0.22f; + float g = pass ? 0 : tiny ? 0.8f : 1.0f; + if (tiny) ww = pass ? 1.4f : 2.8f; + for (int i = 0; i < 2; i++) { + float sg = i ? -1.0f : 1.0f, ox = cx - sg * nx * o, oy = cy - sg * ny * o; + float bx = ox + sg * dx * (L - hl), by = oy + sg * dy * (L - hl); + stroke(ox - sg * dx * L, oy - sg * dy * L, bx, by, ww, k); + tri(ox + sg * dx * L, oy + sg * dy * L, bx + nx * hw, by + ny * hw, bx - nx * hw, by - ny * hw, g, k); + } + } + } +} + +static void value_label(int card, char *b) { + int v = uno_value(card); + if (card == C_WILD4) put(b, "+4"); + else if (card == C_WILD) b[0] = 0; + else if (v == V_DRAW2) put(b, "+2"); + else if (v < 10) num(b, (unsigned)v); + else b[0] = 0; +} + +/* the corner index, top left (and bottom right on big cards) */ +static void corner(int card, int x, int y, int w, int h) { + char b[4]; + value_label(card, b); + int v = uno_value(card); + bool small = w < 44; + const np_font_t *f = small ? &np_font_small : &np_font_body; + int ix = x + (small ? 3 : 5), iy = y + (small ? 11 : 15); + for (int k = 0; k < (small ? 1 : 2); k++) { + int px = k ? x + w - (small ? 3 : 5) : ix, py = k ? y + h - (small ? 5 : 6) : iy; + if (card != C_WILD && (v < 10 || v == V_DRAW2 || card == C_WILD4)) { + int tw = gfx_text_width(f, b); + int tx = k ? px - tw : px; + gfx_text(f, tx + 1, py + 1, b, CARD_BLACK, 200); + gfx_text(f, tx, py, b, WHITE, 256); + } else if (card != C_WILD) { + float s = small ? 10.0f : 12.0f, cx = k ? px - s * 0.5f : px + s * 0.5f, cy = py - s * 0.4f; + symbol(card, cx, cy, s, WHITE, CARD_BLACK); + } + } +} + +static void card_face(int card, int x, int y, int w, int h) { + if (y >= gfx_y1 || y + h <= gfx_y0) return; + int r = w / 6 + 1, bd = w >= 44 ? 3 : 2; + gfx_rrect(x - 1, y - 1, w + 2, h + 2, r + 1, HEX(0x374151), 150); + gfx_rrect(x, y, w, h, r, WHITE, 256); + int col = uno_color(card); + gfx_rrect(x + bd, y + bd, w - 2 * bd, h - 2 * bd, r - 1, CARD[col], 256); + float cx = x + w * 0.5f, cy = y + h * 0.5f, a = (h - 2 * bd) * 0.47f, b = (w - 2 * bd) * 0.37f; + const np_font_t *big = &np_font_title; + int q8 = w >= 44 ? 360 : 256; /* the number's size */ + if (card == C_WILD) { + static const color_t quarters[4] = {HEX(0xE53935), HEX(0x1E7BD8), HEX(0xF7C21B), HEX(0x2EA34F)}; + oval(cx, cy, a, b, WHITE, 0); + oval(cx, cy, a - 1.5f, b - 1.5f, 0, quarters); + } else if (card == C_WILD4) { + /* four little cards, one of each colour */ + static const uint8_t order[4] = {BLUE, GREEN, RED, YELLOW}; + int mw = w * 26 / 100 + 1, mh = h * 30 / 100 + 1; + for (int i = 0; i < 4; i++) { + int mx = (int)(cx - mw * 0.5f + (i - 1.5f) * w * 0.12f), my = (int)(cy - mh * 0.5f + (1.5f - i) * h * 0.06f); + gfx_rrect(mx, my, mw, mh, 2, WHITE, 256); + gfx_rrect(mx + 1, my + 1, mw - 2, mh - 2, 2, CARD[order[i]], 256); + } + } else { + oval(cx, cy, a, b, WHITE, 0); + int v = uno_value(card); + if (v == V_SKIP || v == V_REVERSE) { + symbol(card, cx, cy, h * 0.4f, CARD[col], CARD_BLACK); + } else { + char t[4]; + value_label(card, t); + int base = (int)(cy + (big->ascent * q8 >> 8) * 0.5f); + big_label(big, (int)cx, base, t, q8, 0.18f, CARD[col], CARD_BLACK, 1); + if (v == 6 || v == 9) gfx_fill((int)cx - 3, base + 2, 7, 2, CARD[col]); /* 6 and 9 underlined */ + } + } + corner(card, x, y, w, h); +} + +static void card_back(int x, int y, int w, int h) { + if (y >= gfx_y1 || y + h <= gfx_y0) return; + int r = w / 6 + 1, bd = w >= 30 ? 3 : w >= 16 ? 2 : 1; + if (w >= 16) gfx_rrect(x - 1, y - 1, w + 2, h + 2, r + 1, HEX(0x374151), 150); + gfx_rrect(x, y, w, h, r, WHITE, 256); + gfx_rrect(x + bd, y + bd, w - 2 * bd, h - 2 * bd, r - 1, CARD_BLACK, 256); + float cx = x + w * 0.5f, cy = y + h * 0.5f; + oval(cx, cy, (h - 2 * bd) * 0.45f, (w - 2 * bd) * 0.36f, CARD[RED], 0); + if (w >= 30) { + int q8 = w * 256 / 66; + big_label(&np_font_title, (int)cx, (int)(cy + (np_font_title.ascent * q8 >> 8) * 0.5f), "UNO", q8, 0.2f, + CARD[YELLOW], CARD_BLACK, 1); + } +} + +static void dim_card(int x, int y, int w, int h) { gfx_rrect(x, y, w, h, w / 6 + 1, HEX(0x0B1020), 150); } + +/* ------------------------------------------------------------------ pieces of the screens */ +static void background(void) { gfx_vgrad(0, 0, SCREEN_W, SCREEN_H, 0x23304A, 0x0F1626); } +static void table_bg(void) { gfx_vgrad(0, 0, SCREEN_W, SCREEN_H, 0x1F6B4A, 0x0B3324); } + +static void panel(int x, int y, int w, int h) { + gfx_shadow(x, y, w, h, 10, 6, 160); + gfx_rrect(x, y, w, h, 10, PANEL, 250); + gfx_rrect_outline(x, y, w, h, 10, 1, HEX(0x3B4A66), 256); +} + +static void button(int x, int y, int w, int h, const char *s, bool focus) { + gfx_rrect(x, y, w, h, h / 2, focus ? FOCUS : HEX(0x2A3650), 256); + if (focus) gfx_rrect_outline(x - 2, y - 2, w + 4, h + 4, h / 2 + 2, 2, WHITE, 256); + ctext(&np_font_body, x + w / 2, y + h / 2 + 5, s, focus ? INK : WHITE); +} + +/* the key line: "key|what|key|what...", keys in yellow */ +static int keyline_draw(const char *s, bool draw) { + char b[24]; + int x = 6, i = 0; + while (*s) { + int n = 0; + while (*s && *s != '|' && n < 23) b[n++] = *s++; + b[n] = 0; + if (*s == '|') s++; + if (draw) gfx_text(&np_font_small, x, 236, b, i % 2 ? WHITE : FOCUS, 256); + x += gfx_text_width(&np_font_small, b) + (i % 2 ? 9 : 4); + i++; + } + return x - 9; +} +int uno_keyline_width(const char *s) { return keyline_draw(s, false); } +int uno_text_width(const char *s) { return gfx_text_width(&np_font_small, s); } +static void keyline(const char *s) { + gfx_fill(0, 226, SCREEN_W, 14, HEX(0x0A0F1A)); + keyline_draw(s, true); +} + +static void logo(int cx, int cy, int q8) { + oval((float)cx, (float)cy, 30.0f * q8 / 256, 52.0f * q8 / 256, CARD_BLACK, 0); + oval((float)cx, (float)cy, 27.0f * q8 / 256, 49.0f * q8 / 256, CARD[RED], 0); + int tq = q8 * 2; + big_label(&np_font_title, cx, cy + (np_font_title.ascent * tq >> 8) / 2, "UNO", tq, 0.22f, CARD[YELLOW], CARD_BLACK, 2); +} + +/* ------------------------------------------------------------------ the table */ +typedef struct { int x, y; } seat_t; +static seat_t seat(int n, int p) { + if (n == 2) return (seat_t){123, 4}; + if (n == 3) return p == 1 ? (seat_t){4, 50} : (seat_t){242, 50}; + return p == 1 ? (seat_t){4, 56} : p == 2 ? (seat_t){123, 4} : (seat_t){242, 56}; +} + +static void opponent(const uno_game *g, int p, bool live) { + seat_t s = seat(g->r.players, p); + int w = 74, h = 62, x = s.x, y = s.y; + if (y >= gfx_y1 || y + h <= gfx_y0) return; + bool turn = live && g->turn == p && g->phase < P_HAND_OVER; + gfx_rrect(x, y, w, h, 9, HEX(0x0B1A14), 150); + if (turn) gfx_rrect_outline(x - 2, y - 2, w + 4, h + 4, 11, 3, FOCUS, 256); + gfx_text(&np_font_body, x + 6, y + 15, uno_name(p), turn ? FOCUS : WHITE, 256); + char b[8]; + if (!g->r.one_hand) { + num(b, g->score[p]); + gfx_text_right(&np_font_small, x + w - 6, y + 14, b, MUTED, 256); + } + int n = g->count[p], fan = NP_MIN(n, 6); + for (int i = 0; i < fan; i++) card_back(x + 6 + i * 5, y + 21, 13, 19); + num(b, (unsigned)n); + big_label(&np_font_title, x + w - 16, y + 41, b, 256, 0, WHITE, 0, 0); + if (live && g->uno_open == p) { + gfx_rrect(x + 6, y + 44, w - 12, 14, 7, FOCUS, 256); + ctext(&np_font_small, x + w / 2, y + 55, "Forgot UNO!", INK); + } else if (n == 1) { + gfx_rrect(x + 6, y + 44, w - 12, 14, 7, CARD[RED], 256); + ctext(&np_font_small, x + w / 2, y + 55, "UNO!", WHITE); + } +} + +/* two arrows round in a circle: the way play goes */ +static void direction(int cx, int cy, int dir) { + float r = 11; + for (int pass = 0; pass < 2; pass++) { + color_t c = pass ? HEX(0xE8F0EA) : HEX(0x0B3324); + float w = pass ? 2.5f : 4.5f, g = pass ? 0 : 1.2f; + for (int i = 0; i < 2; i++) { + float a0 = i * 3.14159f + 0.5f, a1 = a0 + 1.75f, px = 0, py = 0; + for (int k = 0; k <= 8; k++) { + float a = a0 + (a1 - a0) * k / 8, qx = cx + r * __builtin_cosf(a), qy = cy + r * __builtin_sinf(a) * (float)dir; + if (k) stroke(px, py, qx, qy, w, c); + px = qx, py = qy; + } + /* the head, along the circle at its end */ + float tx = -__builtin_sinf(a1), ty = __builtin_cosf(a1) * (float)dir, nx = __builtin_cosf(a1), ny = __builtin_sinf(a1) * (float)dir; + tri(px + tx * 6, py + ty * 6, px + nx * 4.5f, py + ny * 4.5f, px - nx * 4.5f, py - ny * 4.5f, g, c); + } + } +} + +static int hand_layout(int n, int pick, int *first, int *shown) { + int maxn = 28; + *shown = NP_MIN(n, maxn); + *first = NP_CLAMP(pick - *shown / 2, 0, n - *shown); + return *shown > 1 ? NP_MIN(40, (310 - 36) / (*shown - 1)) : 0; +} + +static void your_hand(const uno_game *g, const uno_ui *v) { + int n = g->count[0]; + if (!n || gfx_y1 <= 156) return; + int first, shown, sp = hand_layout(n, v->pick, &first, &shown); + int w = 36, h = 54, total = w + (shown - 1) * sp, x0 = (SCREEN_W - total) / 2; + bool mine = g->turn == 0 && g->phase < P_HAND_OVER && g->phase != P_COLOR; + bool panel_up = g->phase == P_PENALTY && g->turn == 0 && g->challengeable; + for (int k = 0; k < shown; k++) { + int i = first + k, x = x0 + k * sp, y = i == v->pick ? 160 : 168; + if (i == v->pick) continue; + card_face(g->hand[0][i], x, y, w, h); + if (mine && !panel_up && !uno_can_play(g, i)) dim_card(x, y, w, h); + } + if (v->pick >= first && v->pick < first + shown) { + int x = x0 + (v->pick - first) * sp, y = 160; + card_face(g->hand[0][v->pick], x, y, w, h); + if (mine && !panel_up && !uno_can_play(g, v->pick)) dim_card(x, y, w, h); + gfx_rrect_outline(x - 3, y - 3, w + 6, h + 6, 9, 3, mine ? FOCUS : WHITE, 256); + } + if (first) text(1, 200, "<", FOCUS); + if (first + shown < n) text(313, 200, ">", FOCUS); +} + +static void uno_button(const uno_game *g, const uno_ui *v) { + (void)v; + int x = 262, y = 137, w = 54, h = 18; + if (y >= gfx_y1 || y + h <= gfx_y0) return; + bool catchable = g->uno_open != UNO_NONE && g->uno_open != 0; + bool mine = g->uno_open == 0 || (g->turn == 0 && g->count[0] == 2 && g->uno_said != 0 && + (g->phase == P_PLAY || g->phase == P_DRAWN || g->phase == P_PENALTY)); + if (g->phase >= P_HAND_OVER) catchable = mine = false; + if (catchable) { + gfx_rrect(x, y, w, h, 9, FOCUS, 256); + ctext(&np_font_body, x + w / 2, y + 14, "Catch!", INK); + } else if (mine) { + gfx_rrect(x, y, w, h, 9, CARD[RED], 256); + gfx_rrect_outline(x - 2, y - 2, w + 4, h + 4, 11, 2, FOCUS, 256); + ctext(&np_font_body, x + w / 2, y + 14, "UNO!", WHITE); + } else { + gfx_rrect_outline(x, y, w, h, 9, 1, HEX(0x5C8A73), 256); + ctext(&np_font_body, x + w / 2, y + 14, g->uno_said == 0 ? "Said!" : "UNO", HEX(0x7FA893)); + } +} + +static void info(const uno_game *g) { + if (gfx_y0 >= 44) return; + char b[24], *p; + if (g->r.one_hand) { + text(6, 14, "One hand", MUTED); + } else { + p = put(b, "Hand "); + num(p, g->hands); + text(6, 14, b, MUTED); + text(6 + gfx_text_width(&np_font_small, b) + 6, 14, "to 500", HEX(0x7FA893)); + p = put(b, "You "); + num(p, g->score[0]); + gfx_text(&np_font_body, 6, 32, b, WHITE, 256); + } +} + +static void piles(const uno_game *g) { + if (gfx_y0 >= 142 || gfx_y1 <= 46) return; + card_back(96, 58, 40, 58); + char b[8]; + num(b, g->dn); + ctext(&np_font_small, 116, 128, b, MUTED); + int top = g->pile[g->pn - 1], col = g->color; + if (col < 4) gfx_rrect_outline(143, 47, 60, 84, 12, 4, CARD[col], 256); + card_face(top, 147, 50, 52, 78); + if (col < 4) ctext(&np_font_small, 173, 140, COLOR_NAME[col], col == RED ? HEX(0xFF8A80) : CARD[col]); + if (g->r.players > 2) direction(222, 88, g->dir); +} + +static void color_picker(const uno_ui *v) { + panel(40, 54, 240, 112); + ctext(&np_font_body, 160, 76, "Call a colour", WHITE); + for (int i = 0; i < 4; i++) { + int x = 56 + i * 54, y = 88, s = 44; + bool f = v->sel == i; + if (f) y -= 3, gfx_rrect_outline(x - 4, y - 4, s + 8, s + 8, 12, 3, WHITE, 256); + gfx_rrect(x, y, s, s, 9, CARD[i], 256); + ctext(&np_font_small, x + s / 2, 152, COLOR_NAME[i], f ? WHITE : MUTED); + } +} + +int uno_pen_count(const uno_game *g) { return 2 + uno_can_stack(g); } + +static void penalty_panel(const uno_game *g, const uno_ui *v) { + panel(36, 40, 248, 136); + char b[48], *p = put(b, uno_name(g->offender)); + put(p, " played a Wild Draw Four"); + ctext(&np_font_body, 160, 60, b, WHITE); + p = put(b, "The colour was "); + put(p, COLOR_NAME[g->prev_color]); + ctext(&np_font_small, 160, 78, b, MUTED); + int n = uno_pen_count(g); + for (int i = 0; i < n; i++) { + int item = i; + const char *s = item == PEN_TAKE ? "Take 4 cards" : item == PEN_CHALLENGE ? "Challenge: a bluff?" : "Play your Wild Draw Four"; + if (item == PEN_TAKE) { + p = put(b, "Take "); + p = num(p, g->pending); + put(p, " cards"); + s = b; + } + button(56, 88 + i * 28, 208, 22, s, v->sel == i); + } +} + +static void end_panel(const uno_game *g, const uno_ui *v) { + bool over = g->phase == P_GAME_OVER; + int n = g->r.players, h = 96 + n * 18; + int y = (226 - h) / 2; + panel(28, y, 264, h); + char b[48], *p; + p = put(b, uno_name(g->winner)); + put(p, g->winner ? (over ? " wins the game" : " wins the hand") : (over ? " win the game!" : " win the hand!")); + ctext(&np_font_body, 160, y + 22, b, g->winner == 0 ? FOCUS : WHITE); + p = put(b, "+"); + p = num(p, g->gained); + put(p, " points"); + ctext(&np_font_small, 160, y + 40, b, MUTED); + for (int q = 0; q < n; q++) { + int ry = y + 50 + q * 18; + bool w = q == g->winner; + gfx_text(&np_font_body, 48, ry + 13, uno_name(q), w ? FOCUS : WHITE, 256); + num(b, g->score[q]); + gfx_text_right(&np_font_body, 140, ry + 13, b, w ? FOCUS : WHITE, 256); + if (!g->r.one_hand) { + int bw = 120, fill = NP_MIN(bw, g->score[q] * bw / UNO_GOAL); + gfx_rrect(152, ry + 5, bw, 8, 4, HEX(0x2A3650), 256); + if (fill > 0) gfx_rrect(152, ry + 5, NP_MAX(fill, 8), 8, 4, w ? FOCUS : HEX(0x7FA8D8), 256); + } + } + int by = y + 56 + n * 18; + if (over) { + button(48, by, 104, 24, "Play again", v->sel == 0); + button(168, by, 104, 24, "Menu", v->sel == 1); + } else { + button(90, by, 140, 24, "Next hand", true); + } +} + +static void reveal_panel(const uno_ui *v) { + panel(16, 36, 288, 160); + char b[56], *p = put(b, uno_name(v->reveal_who)); + put(p, "'s hand"); + ctext(&np_font_body, 160, 58, b, WHITE); + int n = v->reveal_n, sp = n > 1 ? NP_MIN(32, 228 / (n - 1)) : 0, w = 30, h = 45, x0 = 160 - (w + (n - 1) * sp) / 2; + for (int i = 0; i < n; i++) { + int c = v->reveal[i], x = x0 + i * sp; + card_face(c, x, 70, w + 2, h); + if (uno_color(c) != v->reveal_color) dim_card(x, 70, w + 2, h); + } + p = v->reveal_guilty ? put(b, "It had ") : put(b, "No "); + p = put(p, COLOR_NAME[v->reveal_color]); + put(p, v->reveal_guilty ? ": a bluff" : ": no bluff"); + ctext(&np_font_body, 160, 140, b, v->reveal_guilty ? FOCUS : WHITE); + p = v->reveal_guilty ? put(b, uno_name(v->reveal_who)) : put(b, "You"); + put(p, v->reveal_guilty ? " takes 4 cards, and you play" : " take 6 cards"); + ctext(&np_font_small, 160, 160, b, MUTED); +} + +static void table(const uno_game *g, const uno_ui *v) { + table_bg(); + bool live = v->screen == V_PLAY || v->screen == V_REVEAL; + info(g); + for (int p = 1; p < g->r.players; p++) opponent(g, p, live); + piles(g); + if (gfx_y1 > 140 && gfx_y0 < 158) { + ctext(&np_font_small, 130, 152, v->msg, WHITE); + uno_button(g, v); + } + if (g->turn == 0 && g->phase < P_HAND_OVER && gfx_y1 > 156) { /* your turn: your side lights up */ + gfx_fill_alpha(0, 157, SCREEN_W, 69, FOCUS, 30); + gfx_fill(0, 156, SCREEN_W, 2, FOCUS); + } + your_hand(g, v); + if (v->screen != V_PLAY) return; + if (g->phase == P_COLOR && g->turn == 0) color_picker(v); + else if (g->phase == P_PENALTY && g->turn == 0 && g->challengeable) penalty_panel(g, v); + else if (g->phase >= P_HAND_OVER && v->show_end) end_panel(g, v); +} + +/* ------------------------------------------------------------------ the other screens */ +int uno_menu_count(const uno_ui *v) { return v->has_game ? 3 : 2; } +int uno_menu_item(const uno_ui *v, int n) { return v->has_game ? n : n + 1; } + +static void title_screen(const uno_ui *v) { + background(); + /* a fan of cards behind the name */ + static const uint8_t fan[5] = {7, 13 + V_SKIP, 26 + V_REVERSE, 39 + V_DRAW2, C_WILD4}; + for (int i = 0; i < 5; i++) { + int x = 180 + i * 22, y = 26 + (i == 2 ? 0 : i == 1 || i == 3 ? 4 : 10); + card_face(fan[i], x, y, 44, 66); + } + logo(84, 62, 250); + int n = uno_menu_count(v); + static const char *const items[3] = {"Continue", "New game", "How to play"}; + for (int i = 0; i < n; i++) button(60, 124 + i * 32, 200, 24, items[uno_menu_item(v, i)], v->sel == i); +} + +static const char *const LEVELS[3] = {"Easy", "Normal", "Hard"}; +static const char *const HOUSE[5] = {"Stack Draw Twos", "Stack Wild Draw Fours", "Draw until you can play", + "Must play a drawn card", "UNO said for everyone"}; + +static void setup_screen(const uno_ui *v) { + background(); + ctext(&np_font_body, 160, 20, "New game", WHITE); + const uno_rules *r = &v->setup; + char b[32], *p; + for (int i = 0; i < 3; i++) { + int y = 28 + i * 21; + bool f = v->sel == i; + gfx_rrect(10, y, 300, 19, 8, f ? FOCUS : HEX(0x1E2940), 256); + static const char *const label[3] = {"Players", "Bots", "Game"}; + gfx_text(&np_font_body, 20, y + 14, label[i], f ? INK : WHITE, 256); + if (i == 0) { + p = put(b, "You + "); + p = num(p, (unsigned)(r->players - 1)); + put(p, r->players == 2 ? " bot" : " bots"); + } else if (i == 1) { + put(b, LEVELS[r->level]); + } else { + put(b, r->one_hand ? "One hand" : "To 500 points"); + } + gfx_text_right(&np_font_body, f ? 286 : 298, y + 14, b, f ? INK : WHITE, 256); + if (f) text(292, y + 13, ">", INK), text(286 - gfx_text_width(&np_font_body, b) - 10, y + 13, "<", INK); + } + text(14, 103, "House rules", MUTED); + for (int k = 0; k < 5; k++) { + int y = 107 + k * 18, row = ROW_HOUSE + k; + bool f = v->sel == row, on = r->house >> k & 1; + gfx_rrect(10, y, 300, 16, 7, f ? FOCUS : HEX(0x1E2940), 256); + gfx_text(&np_font_small, 20, y + 12, HOUSE[k], f ? INK : WHITE, 256); + gfx_rrect(262, y + 2, 40, 12, 6, on ? HEX(0x2EA34F) : f ? HEX(0xC9A92C) : HEX(0x37425A), 256); + ctext(&np_font_small, 282, y + 12, on ? "On" : "Off", WHITE); + } + button(90, 199, 140, 22, "Deal", v->sel == ROW_DEAL); +} + +static const char *const HELP_TITLE[UNO_HELP_PAGES] = {"Your turn", "Action cards", "Wild Draw Four", "UNO!", "Scoring"}; +static const char *const HELP[UNO_HELP_PAGES] = { + "Match the top card by colour, number or symbol, or play a Wild. Or draw a card, and play it if it goes. " + "Play all your cards to win the hand.", + "Skip: the next player misses a turn. Reverse: play changes direction (a Skip with two players). Draw Two: " + "the next player draws 2 and misses a turn.", + "Call a colour; the next player draws 4 and misses a turn. Only allowed with no card of the colour in play. " + "Challenge it: a bluffer draws 4, else you draw 6.", + "Press shift as you play your next-to-last card. Caught without it before the next player starts: draw 2. " + "Shift also catches a bot that forgot.", + "The winner scores the cards left in the others' hands: numbers as shown, Skip, Reverse, Draw Two 20, Wilds " + "50. First to 500 points wins."}; + +/* where page `page`'s text ends (its last baseline + a line): for the tests */ +int uno_help_bottom(int page) { + int y0 = gfx_y0, y1 = gfx_y1; + gfx_y0 = gfx_y1 = -100; + int end = gfx_paragraph(&np_font_body, 160, 86, 268, 19, HELP[page], WHITE, 256); + gfx_y0 = y0, gfx_y1 = y1; + return end; +} + +static void help_screen(const uno_ui *v) { + background(); + panel(12, 10, 296, 208); + char b[24], *p = put(b, "How to play "); + p = num(p, (unsigned)v->page + 1); + p = put(p, "/"); + num(p, UNO_HELP_PAGES); + ctext(&np_font_small, 160, 28, b, MUTED); + ctext(&np_font_title, 160, 56, HELP_TITLE[v->page], FOCUS); + gfx_paragraph(&np_font_body, 160, 86, 268, 19, HELP[v->page], WHITE, 256); + /* a card to look at on each page */ + static const uint8_t show[UNO_HELP_PAGES][3] = {{3, 16, C_WILD}, + {V_SKIP, 13 + V_REVERSE, 26 + V_DRAW2}, + {C_WILD4, C_WILD4, C_WILD4}, + {39 + 5, 39 + 5, 39 + 5}, + {9, 26 + V_SKIP, C_WILD}}; + int n = show[v->page][0] == show[v->page][1] ? 1 : 3; + for (int i = 0; i < n; i++) card_face(show[v->page][i], 160 - (n * 40 - 4) / 2 + i * 40, 158, 36, 54); +} + +static void scene(void *ctx) { + const void *const *pair = ctx; + const uno_game *g = pair[0]; + const uno_ui *v = pair[1]; + switch (v->screen) { + case V_TITLE: title_screen(v); break; + case V_SETUP: setup_screen(v); break; + case V_HELP: help_screen(v); break; + default: table(g, v); break; + } + if (v->screen == V_REVEAL) reveal_panel(v); + if (v->screen == V_PAUSE) { + panel(60, 40, 200, 160); + ctext(&np_font_body, 160, 62, "Paused", WHITE); + static const char *const items[PAUSE_COUNT] = {"Resume", "New game", "How to play", "Quit game"}; + for (int i = 0; i < PAUSE_COUNT; i++) button(84, 76 + i * 30, 152, 24, items[i], v->sel == i); + } else if (v->screen == V_QUIT) { + panel(50, 66, 220, 104); + ctext(&np_font_body, 160, 90, "Quit the game?", WHITE); + ctext(&np_font_small, 160, 108, "It's saved for next time", MUTED); + button(64, 122, 92, 24, "Keep playing", v->sel == 0); + button(164, 122, 92, 24, "Quit", v->sel == 1); + } + if (gfx_y1 > 226) keyline(uno_keys(g, v)); +} + +const char *uno_keys(const uno_game *g, const uno_ui *v) { + switch (v->screen) { + case V_TITLE: return "Up Down|choose|OK|open|Back|quit"; + case V_SETUP: return v->sel < ROW_HOUSE ? "Up Down|choose|Left Right|change|OK|deal|Back|menu" : + v->sel < ROW_DEAL ? "Up Down|choose|OK|on or off|Back|menu" : "Up Down|choose|OK|deal|Back|menu"; + case V_HELP: return v->first_run ? "Left Right|pages|OK|next|Back|skip" : "Left Right|pages|Back|close"; + case V_REVEAL: return "OK|go on"; + case V_PAUSE: return "Up Down|choose|OK|select|Back|resume"; + case V_QUIT: return "Left Right|choose|OK|select"; + default: break; + } + if (g->phase >= P_HAND_OVER) return !v->show_end ? "Back|menu" : g->phase == P_GAME_OVER ? "Left Right|choose|OK|select" : "OK|next hand|Back|menu"; + bool catchable = g->uno_open != UNO_NONE && g->uno_open != 0; + if (g->turn != 0) + return catchable ? "Left Right|look|shift|catch!|Back|menu" : g->uno_open == 0 ? "Left Right|look|shift|UNO!|Back|menu" : + "Left Right|look at your cards|Back|menu"; + switch (g->phase) { + case P_COLOR: return "Left Right|colour|OK|call it"; + case P_DRAWN: + return g->r.house & H_MUST_PLAY ? "OK|play the new card|shift|UNO|Back|menu" : "OK|play it|Up|keep it|shift|UNO|Back|menu"; + case P_PENALTY: + if (g->challengeable) return "Up Down|choose|OK|select"; + return "Left Right|pick|OK|stack|Up|take|Back|menu"; + default: + if (catchable) return "Left Right|pick|OK|play|Up|draw|shift|catch!"; + if (g->count[0] == 2) return "Left Right|pick|OK|play|Up|draw|shift|UNO!"; + return "Left Right|pick|OK|play|Up|draw|Back|menu"; + } +} + +void uno_render(const uno_game *g, const uno_ui *v) { + const void *pair[2] = {g, v}; + color_t *old = gfx_buf; + gfx_buf = strip; + gfx_render(scene, (void *)pair, 0, SCREEN_H); + gfx_buf = old; +} + +#ifdef HOST +/* every kind of card, at the hand's size and the discard pile's: for looking at them */ +static void cards_scene(void *ctx) { + (void)ctx; + table_bg(); + static const uint8_t kinds[15] = {0, 14, 28, 42, 4, 18, 32, 46, V_SKIP, 13 + V_REVERSE, 26 + V_DRAW2, C_WILD, C_WILD4, 39 + 6, 9}; + for (int i = 0; i < 8; i++) card_face(kinds[i], 4 + i * 39, 4, 36, 54); + for (int i = 8; i < 15; i++) card_face(kinds[i], 4 + (i - 8) * 39, 62, 36, 54); + for (int i = 0; i < 6; i++) card_face(kinds[8 + i], 4 + i * 53, 122, 52, 78); + card_back(4 + 6 * 53, 160, 13, 19); +} +/* the app's icon, 55 x 56, over a background colour (twice: black and white make its transparency) */ +static color_t icon_bg; +static void icon_scene(void *ctx) { + (void)ctx; + gfx_fill(0, gfx_y0, SCREEN_W, gfx_y1 - gfx_y0, icon_bg); + gfx_rrect(0, 0, 55, 56, 12, HEX(0x1F6B4A), 256); + card_face(13 + 1, 3, 11, 25, 37); + card_face(7, 13, 6, 25, 37); + card_back(23, 9, 30, 44); +} +void uno_render_icon(color_t bg) { + color_t *old = gfx_buf; + gfx_buf = strip, icon_bg = bg; + gfx_render(icon_scene, 0, 0, 64); + gfx_buf = old; +} +void uno_render_cards(void) { + color_t *old = gfx_buf; + gfx_buf = strip; + gfx_render(cards_scene, 0, 0, SCREEN_H); + gfx_buf = old; +} +#endif diff --git a/games/uno/src/draw.h b/games/uno/src/draw.h new file mode 100644 index 00000000..921c88b5 --- /dev/null +++ b/games/uno/src/draw.h @@ -0,0 +1,40 @@ +/* The screens (draw.c), drawn with NumPlay's launcher graphics and fonts, in strips. */ +#ifndef UNO_DRAW_H +#define UNO_DRAW_H +#include "game.h" + +enum { V_TITLE, V_SETUP, V_HELP, V_PLAY, V_REVEAL, V_PAUSE, V_QUIT }; +enum { MENU_CONTINUE, MENU_NEW, MENU_HELP }; +enum { PAUSE_RESUME, PAUSE_NEW, PAUSE_HELP, PAUSE_QUIT, PAUSE_COUNT }; +enum { ROW_PLAYERS, ROW_LEVEL, ROW_LENGTH, ROW_HOUSE, ROW_DEAL = ROW_HOUSE + 5, SETUP_ROWS }; +enum { PEN_TAKE, PEN_CHALLENGE, PEN_STACK }; +#define UNO_HELP_PAGES 5 + +typedef struct { + uint8_t screen, under; /* under: what a pause or how to play sits on */ + uint8_t sel; /* the menu's or the panel's choice */ + uint8_t page; /* how to play */ + uint8_t first_run; /* how to play before the first game: OK deals */ + uint8_t pick; /* the card chosen in your hand */ + uint8_t has_game; + uint8_t show_end; /* the hand's end: the scores are up */ + uno_rules setup; + /* a challenge you made: the hand you were shown */ + uint8_t reveal[UNO_DECK], reveal_n, reveal_who, reveal_color, reveal_guilty; + char msg[72]; + uint32_t clock; +} uno_ui; + +const char *uno_name(int p); +void uno_card_name(int card, char *out); +const char *uno_keys(const uno_game *g, const uno_ui *v); +void uno_render(const uno_game *g, const uno_ui *v); +int uno_keyline_width(const char *keys); /* (pixels) */ +int uno_text_width(const char *s); /* the small font's */ +int uno_help_bottom(int page); +/* the menus' items: how many there are, and the n-th */ +int uno_menu_count(const uno_ui *v); +int uno_menu_item(const uno_ui *v, int n); +/* the +4 panel's choices: PEN_TAKE, PEN_CHALLENGE and, stacking, PEN_STACK */ +int uno_pen_count(const uno_game *g); +#endif diff --git a/games/uno/src/game.c b/games/uno/src/game.c new file mode 100644 index 00000000..d5eaf4ad --- /dev/null +++ b/games/uno/src/game.c @@ -0,0 +1,417 @@ +/* UNO's rules: see game.h, and the instruction sheet's numbers in the spec kept with the reference. */ +#include +#include "game.h" + +static uint32_t next_rand(uint32_t *s) { + uint32_t x = *s; + x ^= x << 13, x ^= x >> 17, x ^= x << 5; + return *s = x ? x : 0x6C8E9CF5u; +} + +int uno_points(int c) { + if (c >= 52) return 50; + int v = uno_value(c); + return v >= 10 ? 20 : v; +} + +int uno_next(const uno_game *g, int p) { + int n = g->r.players; + return (p + n + g->dir) % n; +} + +static void event(uno_game *g, int e, int who, int card, int n) { + g->ev = (uint8_t)e, g->ev_who = (uint8_t)who, g->ev_card = (uint8_t)card, g->ev_n = (uint8_t)n; + g->ev_victim = g->ev_by = UNO_NONE; +} + +void uno_fill_deck(uint8_t *d) { + int n = 0; + for (int c = 0; c < 52; c++) { + d[n++] = (uint8_t)c; + if (c % 13) d[n++] = (uint8_t)c; /* one 0 of each colour, two of everything else */ + } + for (int i = 0; i < 4; i++) d[n++] = C_WILD, d[n++] = C_WILD4; +} + +static void shuffle(uno_game *g, uint8_t *a, int n) { + for (int i = n - 1; i > 0; i--) { + int j = (int)(next_rand(&g->rng) % (uint32_t)(i + 1)); + uint8_t t = a[i]; + a[i] = a[j], a[j] = t; + } +} + +/* one card from the draw pile into p's hand; an empty pile is made again from the discards under the top one */ +static bool take_one(uno_game *g, int p) { + if (!g->dn && g->pn > 1) { + uint8_t top = g->pile[g->pn - 1]; + g->dn = (uint8_t)(g->pn - 1); + memcpy(g->deck, g->pile, g->dn); + g->pile[0] = top, g->pn = 1; + shuffle(g, g->deck, g->dn); + } + if (!g->dn) return false; + g->hand[p][g->count[p]++] = g->deck[--g->dn]; + return true; +} + +static int take(uno_game *g, int p, int n) { + int k = 0; + while (k < n && take_one(g, p)) k++; + if (n > 1) g->lacks[p] = 0; /* new cards: what the table knew of that hand is gone */ + return k; +} + +/* the player whose turn it is starts doing something: too late to catch whoever forgot UNO */ +static void begin(uno_game *g) { g->uno_open = g->uno_said = UNO_NONE; } + +static void hand_over(uno_game *g, int w) { + int pts = 0; + for (int p = 0; p < g->r.players; p++) + if (p != w) + for (int i = 0; i < g->count[p]; i++) pts += uno_points(g->hand[p][i]); + g->winner = (uint8_t)w, g->gained = (uint16_t)pts; + g->score[w] = (uint16_t)(g->score[w] + pts > 60000 ? 60000 : g->score[w] + pts); + g->out = g->uno_open = g->uno_said = UNO_NONE; + g->pending = 0; + g->phase = g->r.one_hand || g->score[w] >= UNO_GOAL ? P_GAME_OVER : P_HAND_OVER; +} + +void uno_deal(uno_game *g) { + int n = g->r.players; + memset(g->hand, 0, sizeof g->hand); + memset(g->count, 0, sizeof g->count); + memset(g->lacks, 0, sizeof g->lacks); + g->pn = 0, g->dir = 1, g->pending = 0, g->challengeable = g->guilty = 0, g->opening = 0; + g->offender = g->drawn = g->uno_open = g->uno_said = g->out = g->winner = UNO_NONE; + g->gained = 0; + /* seven cards each, one at a time, from the dealer's left */ + for (int k = 0; k < 7; k++) + for (int i = 1; i <= n; i++) take_one(g, (g->dealer + i) % n); + /* the first card: a Wild Draw Four goes back into the deck, which is shuffled, and another is turned */ + for (int tries = 0; g->deck[g->dn - 1] == C_WILD4; tries++) { + if (tries < 32) { + shuffle(g, g->deck, g->dn); + } else { + int i = g->dn - 1; + while (g->deck[i] == C_WILD4) i--; + g->deck[g->dn - 1] = g->deck[i], g->deck[i] = C_WILD4; + } + } + int c = g->deck[--g->dn], left = uno_next(g, g->dealer), v = uno_value(c); + g->pile[g->pn++] = (uint8_t)c; + g->color = (uint8_t)uno_color(c), g->turn = (uint8_t)left, g->phase = P_PLAY; + event(g, E_DEAL, g->dealer, c, 0); + if (c == C_WILD) { + g->phase = P_COLOR, g->opening = 1; /* the player on the dealer's left calls the colour, then plays */ + } else if (v == V_SKIP) { + g->turn = (uint8_t)uno_next(g, left); + } else if (v == V_REVERSE) { + if (n > 2) g->dir = -1; /* the dealer starts, and play goes to the right */ + g->turn = g->dealer; + } else if (v == V_DRAW2) { + g->ev_n = (uint8_t)take(g, left, 2), g->ev_victim = (uint8_t)left; + g->turn = (uint8_t)uno_next(g, left); + } +} + +void uno_next_hand(uno_game *g) { + if (g->hands) g->dealer = (uint8_t)((g->dealer + 1) % g->r.players); /* the deal passes to the left */ + g->hands++; + uno_fill_deck(g->deck); + g->dn = UNO_DECK; + shuffle(g, g->deck, UNO_DECK); + uno_deal(g); +} + +void uno_new_game(uno_game *g, uno_rules r, uint32_t seed) { + memset(g, 0, sizeof *g); + g->r.players = (uint8_t)(r.players < 2 ? 2 : r.players > 4 ? 4 : r.players); + g->r.level = (uint8_t)(r.level > LEVEL_HARD ? LEVEL_NORMAL : r.level); + g->r.one_hand = r.one_hand ? 1 : 0; + g->r.house = (uint8_t)(r.house & H_ALL); + g->rng = seed ? seed : 1; + g->brng = seed * 2654435761u + 0x9E3779B9u; + if (!g->brng) g->brng = 1; + g->dir = 1; + /* the dealer: everyone picks a card, the highest number deals (a symbol counts as zero), the tied pick again */ + int n = g->r.players, at = 0; + uint8_t pool[UNO_DECK]; + uno_fill_deck(pool); + shuffle(g, pool, UNO_DECK); + unsigned in = (1u << n) - 1; + while ((in & (in - 1)) && at + n <= UNO_DECK) { + int best = -1; + unsigned tied = 0; + for (int p = 0; p < n; p++) { + if (!(in >> p & 1)) continue; + int v = uno_value(pool[at++]); + if (v > 9) v = 0; + if (v > best) best = v, tied = 1u << p; + else if (v == best) tied |= 1u << p; + } + in = tied; + } + for (int p = n - 1; p >= 0; p--) + if (in >> p & 1) g->dealer = (uint8_t)p; + uno_next_hand(g); +} + +bool uno_matches(const uno_game *g, int c) { + int top = g->pile[g->pn - 1]; + return c >= 52 || uno_color(c) == g->color || (top < 52 && uno_value(c) == uno_value(top)); +} + +static bool stacks(const uno_game *g, int c) { + if (g->out != UNO_NONE) return false; /* no stacking on a last card: the hand is over */ + if (g->pending_kind == V_DRAW2) return (g->r.house & H_STACK2) && uno_value(c) == V_DRAW2; + return (g->r.house & H_STACK4) && c == C_WILD4; +} + +bool uno_can_play(const uno_game *g, int i) { + if (g->phase == P_COLOR || g->phase >= P_HAND_OVER || i < 0 || i >= g->count[g->turn]) return false; + int c = g->hand[g->turn][i]; + if (g->phase == P_PENALTY) return stacks(g, c); + if (g->phase == P_DRAWN && i != g->drawn) return false; + return uno_matches(g, c); +} + +bool uno_can_stack(const uno_game *g) { + if (g->phase != P_PENALTY) return false; + for (int i = 0; i < g->count[g->turn]; i++) + if (stacks(g, g->hand[g->turn][i])) return true; + return false; +} + +bool uno_legal_wild4(const uno_game *g, int p) { + for (int i = 0; i < g->count[p]; i++) + if (uno_color(g->hand[p][i]) == g->color) return false; + return true; +} + +/* a card's effect, once its colour is known (p played it) */ +static void effect(uno_game *g, int p, int c) { + int v = uno_value(c); + g->phase = P_PLAY; + if (c == C_WILD4) { + g->pending = (uint8_t)(g->pending + 4), g->pending_kind = C_WILD4, g->offender = (uint8_t)p; + g->turn = (uint8_t)uno_next(g, p), g->phase = P_PENALTY; + return; + } + if (v == V_DRAW2) { + int victim = uno_next(g, p); + if ((g->r.house & H_STACK2) && g->out == UNO_NONE) { + g->pending = (uint8_t)(g->pending + 2), g->pending_kind = V_DRAW2, g->offender = (uint8_t)p; + g->challengeable = 0, g->turn = (uint8_t)victim, g->phase = P_PENALTY; + return; + } + g->ev_n = (uint8_t)take(g, victim, g->pending + 2), g->ev_victim = (uint8_t)victim; + g->pending = 0; + g->turn = (uint8_t)uno_next(g, victim); + } else if (v == V_SKIP) { + g->turn = (uint8_t)uno_next(g, uno_next(g, p)); + } else if (v == V_REVERSE) { + if (g->r.players == 2) { + g->turn = (uint8_t)p; /* with two players, a Reverse is a Skip */ + } else { + g->dir = (int8_t)-g->dir; + g->turn = (uint8_t)uno_next(g, p); + } + } else { + g->turn = (uint8_t)uno_next(g, p); + } + if (g->out != UNO_NONE) hand_over(g, g->out); +} + +bool uno_play(uno_game *g, int i, bool say_uno) { + if (!uno_can_play(g, i)) return false; + int p = g->turn, c = g->hand[p][i]; + bool stacking = g->phase == P_PENALTY; + bool said = say_uno || g->uno_said == p || (g->r.house & H_AUTO_UNO); + if (c == C_WILD4) { + /* a Wild Draw Four may be played with a card of the colour in play: that's a bluff, which only a challenge + finds out */ + g->guilty = !uno_legal_wild4(g, p); + g->prev_color = g->color; + g->challengeable = !stacking; + } + begin(g); + memmove(&g->hand[p][i], &g->hand[p][i + 1], (size_t)(g->count[p] - i - 1)); + g->count[p]--; + g->pile[g->pn++] = (uint8_t)c; + g->drawn = UNO_NONE; + if (c < 52) g->lacks[p] &= (uint8_t)~(1u << uno_color(c)); + event(g, E_PLAY, p, c, 0); + if (g->count[p] == 1) { + if (said) g->ev_by = (uint8_t)p; /* (with UNO!) */ + else g->uno_open = (uint8_t)p; + } + if (!g->count[p]) g->out = (uint8_t)p; + if (c >= 52) { + if (c == C_WILD && g->out == p) { /* out on a Wild: no colour to call */ + hand_over(g, p); + return true; + } + g->phase = P_COLOR, g->opening = 0, g->color = NO_COLOR; + return true; + } + g->color = (uint8_t)uno_color(c); + effect(g, p, c); + return true; +} + +bool uno_choose(uno_game *g, int color) { + if (g->phase != P_COLOR || color < 0 || color > 3) return false; + int p = g->turn, c = g->pile[g->pn - 1]; + g->color = (uint8_t)color; + event(g, E_COLOR, p, c, color); + if (g->opening) { + g->opening = 0, g->phase = P_PLAY; + return true; + } + effect(g, p, c); + return true; +} + +bool uno_draw(uno_game *g) { + if (g->phase != P_PLAY) return false; + int p = g->turn, k = 0; + begin(g); + g->lacks[p] |= (uint8_t)(1u << g->color); + do { + if (!take_one(g, p)) break; + k++; + } while ((g->r.house & H_DRAW_UNTIL) && !uno_matches(g, g->hand[p][g->count[p] - 1])); + event(g, E_DRAW, p, 0, k); + if (k && uno_matches(g, g->hand[p][g->count[p] - 1])) { + g->phase = P_DRAWN, g->drawn = (uint8_t)(g->count[p] - 1); + return true; + } + /* (nothing to draw: every other card is in someone's hand, so someone can play) */ + g->turn = (uint8_t)uno_next(g, p); + return true; +} + +bool uno_keep(uno_game *g) { + if (g->phase != P_DRAWN || (g->r.house & H_MUST_PLAY)) return false; + int p = g->turn; + g->drawn = UNO_NONE, g->phase = P_PLAY, g->turn = (uint8_t)uno_next(g, p); + event(g, E_KEEP, p, 0, 0); + return true; +} + +bool uno_take(uno_game *g) { + if (g->phase != P_PENALTY) return false; + int p = g->turn; + begin(g); + int k = take(g, p, g->pending); + event(g, E_TAKE, p, g->pending_kind, k); + g->pending = 0, g->challengeable = 0, g->phase = P_PLAY, g->turn = (uint8_t)uno_next(g, p); + if (g->out != UNO_NONE) hand_over(g, g->out); + return true; +} + +bool uno_challenge(uno_game *g) { + if (g->phase != P_PENALTY || !g->challengeable) return false; + int p = g->turn, o = g->offender; + begin(g); + g->phase = P_PLAY, g->challengeable = 0; + if (g->guilty) { + /* the bluffer draws the 4 instead, and the challenger plays (never someone out: a last card is always allowed) */ + int k = take(g, o, g->pending); + g->pending = 0; + event(g, E_CHALLENGE_WON, p, C_WILD4, k); + g->ev_victim = (uint8_t)o; + } else { + /* the challenger draws 4 and 2 more, and loses the turn */ + int k = take(g, p, g->pending + 2); + g->pending = 0; + event(g, E_CHALLENGE_LOST, p, C_WILD4, k); + g->ev_victim = (uint8_t)p; + g->turn = (uint8_t)uno_next(g, p); + if (g->out != UNO_NONE) hand_over(g, g->out); + } + return true; +} + +bool uno_call(uno_game *g, int p) { + if (g->phase >= P_HAND_OVER || p < 0 || p >= g->r.players) return false; + if (g->uno_open == p) { /* caught yourself before anyone else did: safe */ + g->uno_open = UNO_NONE; + event(g, E_UNO, p, 0, 0); + return true; + } + if (p == g->turn && g->count[p] == 2 && g->uno_said != p && + (g->phase == P_PLAY || g->phase == P_DRAWN || g->phase == P_PENALTY)) { + g->uno_said = (uint8_t)p; /* said with the next-to-last card */ + event(g, E_UNO, p, 0, 0); + return true; + } + return false; +} + +bool uno_catch(uno_game *g, int by) { + int o = g->uno_open; + if (o == UNO_NONE || by == o || by < 0 || by >= g->r.players || g->phase >= P_HAND_OVER) return false; + g->uno_open = UNO_NONE; + int k = take(g, o, 2); + event(g, E_CAUGHT, o, 0, k); + g->ev_by = (uint8_t)by; + return true; +} + +bool uno_valid(const uno_game *g) { + const uno_rules *r = &g->r; + int n = r->players; + if (n < 2 || n > 4 || r->level > LEVEL_HARD || r->one_hand > 1 || r->house > H_ALL) return false; + if (!g->rng || !g->brng || g->phase > P_GAME_OVER || (g->dir != 1 && g->dir != -1)) return false; + if (g->turn >= n || g->dealer >= n || !g->pn || g->pn > UNO_DECK || g->dn > UNO_DECK || g->opening > 1) return false; + if (g->color > NO_COLOR || (g->color == NO_COLOR) != (g->phase == P_COLOR)) return false; + if (g->challengeable > 1 || g->guilty > 1 || g->prev_color > 3 || g->pending > UNO_DECK) return false; + if (g->phase != P_DRAWN && g->drawn != UNO_NONE) return false; + const uint8_t who[] = {g->offender, g->uno_open, g->uno_said, g->out}; + for (unsigned i = 0; i < sizeof who; i++) + if (who[i] != UNO_NONE && who[i] >= n) return false; + if (g->winner != UNO_NONE && g->winner >= n) return false; + for (int p = 0; p < 4; p++) + if (g->score[p] > 60000 || (p >= n && (g->count[p] || g->score[p]))) return false; + int top = g->pile[g->pn - 1]; + if (top >= UNO_KINDS) return false; + switch (g->phase) { + case P_PLAY: if (g->pending || g->out != UNO_NONE) return false; break; + case P_DRAWN: if (g->pending || g->out != UNO_NONE || g->drawn >= g->count[g->turn]) return false; break; + case P_COLOR: if (top < 52 || (g->opening && g->pn != 1)) return false; break; + case P_PENALTY: + if (!g->pending || g->pending & 1 || g->offender == UNO_NONE) return false; + if (g->pending_kind != C_WILD4 && g->pending_kind != V_DRAW2) return false; + if (g->challengeable && (g->pending_kind != C_WILD4 || g->pending != 4)) return false; + break; + case P_GAME_OVER: if (g->winner == UNO_NONE) return false; break; + default: break; + } + if (g->out != UNO_NONE && (g->count[g->out] || (g->phase != P_COLOR && g->phase != P_PENALTY))) return false; + if (g->uno_open != UNO_NONE && g->count[g->uno_open] != 1) return false; + /* every card of the deck, once */ + uint8_t seen[UNO_KINDS] = {0}; + int total = g->dn + g->pn; + for (int i = 0; i < g->dn; i++) { + if (g->deck[i] >= UNO_KINDS) return false; + seen[g->deck[i]]++; + } + for (int i = 0; i < g->pn; i++) { + if (g->pile[i] >= UNO_KINDS) return false; + seen[g->pile[i]]++; + } + for (int p = 0; p < 4; p++) { + if (g->count[p] > UNO_DECK) return false; + total += g->count[p]; + for (int i = 0; i < g->count[p]; i++) { + if (g->hand[p][i] >= UNO_KINDS) return false; + seen[g->hand[p][i]]++; + } + } + if (total != UNO_DECK) return false; + for (int c = 0; c < UNO_KINDS; c++) + if (seen[c] != (c >= 52 ? 4 : c % 13 ? 2 : 1)) return false; + return true; +} diff --git a/games/uno/src/game.h b/games/uno/src/game.h new file mode 100644 index 00000000..0c207d47 --- /dev/null +++ b/games/uno/src/game.h @@ -0,0 +1,109 @@ +/* UNO's rules (game.c) and its bots (bot.c), as Mattel's instruction sheet has them: the 108-card deck, the + * action cards, the Wild Draw Four and its challenge, UNO calls and their penalty, and hands scored until + * someone has 500 points. No screen, clock or files here: the tests drive it on a computer. */ +#ifndef UNO_GAME_H +#define UNO_GAME_H +#include +#include + +#define UNO_DECK 108 +#define UNO_NONE 0xFF +#define UNO_GOAL 500 + +/* A card: colour * 13 + value for the 100 coloured ones (0 to 9, then Skip, Reverse, Draw Two), then the Wild + * and the Wild Draw Four. */ +enum { V_SKIP = 10, V_REVERSE = 11, V_DRAW2 = 12, C_WILD = 52, C_WILD4 = 53, UNO_KINDS = 54 }; +enum { RED, YELLOW, GREEN, BLUE, NO_COLOR = 4 }; +static inline int uno_color(int c) { return c < 52 ? c / 13 : NO_COLOR; } +static inline int uno_value(int c) { return c < 52 ? c % 13 : c; } + +/* house rules, none of them official: all off by default */ +enum { H_STACK2 = 1, H_STACK4 = 2, H_DRAW_UNTIL = 4, H_MUST_PLAY = 8, H_AUTO_UNO = 16, H_ALL = 31 }; +enum { LEVEL_EASY, LEVEL_NORMAL, LEVEL_HARD }; + +typedef struct { + uint8_t players; /* 2 to 4: you (player 0) and 1 to 3 bots */ + uint8_t level; /* the bots' */ + uint8_t one_hand; /* 1: a single hand; 0: hands until someone has 500 points */ + uint8_t house; +} uno_rules; + +/* what the player whose turn it is has to do */ +enum { + P_PLAY, /* play a card or draw one */ + P_DRAWN, /* play the card just drawn (only that one), or keep it */ + P_COLOR, /* call the colour of the Wild just played */ + P_PENALTY, /* a Wild Draw Four (or, stacking, a Draw Two) waits: take it, challenge it, or stack on it */ + P_HAND_OVER, /* the hand is over and scored */ + P_GAME_OVER, +}; + +/* what happened last, for the screen */ +enum { E_NONE, E_DEAL, E_PLAY, E_DRAW, E_KEEP, E_COLOR, E_TAKE, E_CHALLENGE_WON, E_CHALLENGE_LOST, E_UNO, E_CAUGHT }; + +typedef struct { + uno_rules r; + uint8_t hand[4][UNO_DECK]; + uint8_t count[4]; + uint8_t deck[UNO_DECK]; /* the draw pile, its top the last */ + uint8_t pile[UNO_DECK]; /* the discard pile, its top the last */ + uint8_t dn, pn; + uint16_t score[4]; + uint16_t hands; /* hands dealt in this game */ + uint32_t rng; /* the shuffles' */ + uint32_t brng; /* the bots' choices */ + uint8_t dealer, turn, phase; + int8_t dir; /* 1: clockwise, to the left; -1 */ + uint8_t color; /* the colour to match: the top card's, or the one called for a Wild */ + uint8_t opening; /* P_COLOR: the first player calls the colour of the first card, then plays */ + uint8_t pending; /* P_PENALTY: the cards to take */ + uint8_t pending_kind; /* V_DRAW2 or C_WILD4 */ + uint8_t offender; /* who played the Wild Draw Four waiting */ + uint8_t challengeable; /* it can be challenged (not one stacked on another) */ + uint8_t guilty; /* its player had a card of the colour before it */ + uint8_t prev_color; /* that colour */ + uint8_t drawn; /* P_DRAWN: the card's place in the hand */ + uint8_t uno_open; /* someone down to one card who did not call UNO, until the next player starts */ + uint8_t uno_said; /* the player whose turn it is called UNO before playing the next-to-last card */ + uint8_t out; /* who played the last card, while its Draw Two or Wild Draw Four waits */ + uint8_t winner; /* the hand's, or the game's at P_GAME_OVER */ + uint8_t spare0; + uint16_t gained; /* the points the hand's winner scored */ + uint8_t lacks[4]; /* colours a player drew on rather than play (what everyone at the table saw) */ + uint8_t ev, ev_who, ev_card, ev_n, ev_victim, ev_by; + uint8_t spare[2]; +} uno_game; +_Static_assert(sizeof(uno_game) == 708, "uno_game: packed bytes, no padding"); + +int uno_points(int card); +int uno_next(const uno_game *g, int p); +void uno_new_game(uno_game *g, uno_rules r, uint32_t seed); +void uno_next_hand(uno_game *g); +void uno_fill_deck(uint8_t *deck); /* the 108 cards, in order */ +void uno_deal(uno_game *g); /* deals from g->deck as it is (uno_next_hand shuffles first) */ +bool uno_matches(const uno_game *g, int card); +bool uno_can_play(const uno_game *g, int i); /* card i of the hand of the player whose turn it is */ +bool uno_legal_wild4(const uno_game *g, int p); /* p holds no card of the colour in play */ +bool uno_play(uno_game *g, int i, bool say_uno); +bool uno_choose(uno_game *g, int color); +bool uno_draw(uno_game *g); +bool uno_keep(uno_game *g); +bool uno_take(uno_game *g); +bool uno_challenge(uno_game *g); +bool uno_call(uno_game *g, int p); +bool uno_catch(uno_game *g, int by); +bool uno_can_stack(const uno_game *g); /* P_PENALTY: the player has a card to stack */ +bool uno_valid(const uno_game *g); /* every card once, every field in range (a save to trust) */ + +/* the bots (bot.c): what the player whose turn it is does, at a level, from what that player can see */ +enum { M_PLAY, M_DRAW, M_KEEP, M_TAKE, M_CHALLENGE, M_COLOR }; +typedef struct { + uint8_t act, arg; /* arg: the card's place (M_PLAY), the colour (M_COLOR) */ + bool uno; /* say UNO with this card */ +} uno_move; +uno_move bot_move(uno_game *g, int level); +bool bot_do(uno_game *g, uno_move m); +/* whether bot `by` catches the player who forgot UNO, and how long it takes (ms) */ +bool bot_catches(uno_game *g, int by, int level, uint32_t *ms); +int bot_best_color(const uno_game *g, int p, int level); +#endif diff --git a/games/uno/src/icon.png b/games/uno/src/icon.png index c685d848d1e713cc9fb541d161e51a6906ac1af2..c5bb10375aadd330e3523d91c73044719bb06596 100644 GIT binary patch delta 2431 zcmV-_34r#L9f=c=BYz1{Nkl0e`p)m9sk(7G$*FAyJ3R_HsnSIlgUQywIdSq zA66(MF8w189gDRFY^7m|v;GmQ`(slL3(Ee;><-$v8>zLxHrr#x_8-CeC$0TQhg@)H zhppI#gk2zkGeqoeOhea2i^un!PSQztvUHN!vVP#uyLWf*y?>9sKi>Df_ifwT+k+F@ zUi)T1gfMgn?fv;LaNl^Qz1@%hGXC}CiNgIm|L4be@{tN{aqqo9Z9Bc&W=D=ldAVmN zylr3n9{$IX-TUY7v-y8qu_IYUt~2`WA8?1i^h-Qt$ba_t3y+e2{8f2fd-=_mUpw)W zr;!+e#!cggoqyz>R*BV;AR|XM<~!uu!v6_&AMf^%4RUlt&cjV3gI^0Gg;=At+J+nv)9e$i@XA+}+Ery40D|A*;Jcev-00B3>MeJkS`( z#z+-OV*JS=h(C^7o~yT)p-;TY%DT^wt>ICKT@w0^O7M4zXeE?KDpO}k^kI5!5lU8L z^~8&_3xBEVaTH`@q>6eTSXf=bTvkJ%w-XLSs8h>)cKQ$-W;i8zuslV}=wAib7m*XHIX5?2zengk;48g^S1eia=B5xese zU`xy%!i6!Y4`d{NJBuN&2$AEN^Du3UB-RpQ6-eGpvbG7-7oX?t$(fD<_os?A=o$x( zZ+`)Nz_9~`0Gc?jb9F~GDJKqvcZ;~dW3pra`Owet81t5F ztTA!`0$ueFioY-hk0e39FJqyO!P#M^Lu3xAUPK%uTL(Fs#08_|6#%Z_VC)bGKz}@I zs4zj|o&QlM%yx)O-5Q18p}zJ)rOcrut|XzzY3KrZ&1#hsUM&$L^gUEC*}wqFe#mCs zdeX+peG)?C8laHbaXdWU9t49yNP&u=wzn6afpGCwd7vQqoBHRpae+t3B{2d|8fAlh zmzXm@DioeuhUeKHYxq@w@JgiWyMO4}Xw`dmpm{6OfQ{KfhwjdyFm#QVh`m2+edhC9 zq}B*1vW>fRJmpYbO$7vRA3Rcw6%|E6?6Ofd!Jiz2ThR2;3dpX>bzLkLbzO((MN7z$ zI?_bl3g`~?wQbHDf~WH(OO;yQl9z|4+kTz4vRXUnUet9&=*phLdwY(G;~6_K;mPR7Jv=K#rPl!@5J4dY@2ZUBi9gS<(M z-Y4`Gh^5~(>dgAa$#MQFsZmf(ZoY_P_WK+?-|8`9z8a8sOJ%`J?z~hUezEkdk^tTN zgzD#spBZbq`pEf)_Zc3*OMlg|L1Z+-#IfwNcNQ~m*c-+4E$e%BQZehkGHhIz-ZAdS zUjgKYrA2BT(Xa!arwn9d%C1TAAS#5C{ZtDWh7voE^xajGeODPdP~KOsH8PdCN-Z!?&!q8w!T% zBYK*v3!DqMI$yDm z!U5Vu47s%x*K4juF{RZTpTL2fUcGNJ{>C^n>K+PO^2V_foqx_yS-TvA^7# zm4I?F3MFW@TiWt#7Kw}srGbs6cH7$QMpaep^;pqS_&Y>)o+gZpl@xn@4f^~X^!FEm z&CROs*||d#n9ZszBx?liwzV1SaZn{_SDH>%a72P|<99%RaNlLGo^NbmXEnb9}OM4mr%i z(^>5abMhp5vr~|{L2P{*MmkG7W3@Y~J*C@&c9qY$Bu20f$#fJ#*f<2)i6FNd0=#tU zqXXG(AY0n`l8}PrO#u#Wdog1@4Vu-|n){5FZ?h^AE`Ls2Admzjf?$r~=uA^7808LyPD1JYfE)|i5gkJv;dn-PJFmNTIA+_G zAYL4$_J17)zGGHW4hW@6gfgv3o-sj3yyb@@8+p2#S3R@s%07t~M>&f=_$+I5l3*(` zc@i&1uQ&T09r0z9@BrK)l*1M~ZS5aR8wF5N5*#(Ao9%x33#( zuVyrYGuCg^mU$k|`nxByK8X+UI`G6cl3wuG!FZ)=nAo~2W9`!oma1VUwz2Sw3Y5x+ z0{|tyP^am&4W>4&hVn>dZBrlA7x6H&W-Xbrl#F@!5MRAV)&fv|2xa-OY=agpe^8Mg x_1R-R{R;b3~Ia zK`u`$k-)Yrv)MxtJ$~xcsr+u!M$Z27Wq)4HH6JyOMK3MlqKhx$Ycpr?nK4JPK9^_i zgZGgudRUem5@Jdv1DzQ z&mB2|m=ySafC|gtdd}J0+{~Oga~MBxwR7L&%NhOHH@RZc9;&wP;O@ugQdM0;F_$Bg%Mq=rq;B*`lBo)Ouf&Ar zW)>}4#6=ffgyT5I3=frj4(6-9!0E~DY>vd`mlC`1yz)(@$j^HMSz80PZT{{j0#eBo ziLNJn?`XIk_yiwXGf8?ZNNk#5o&5`2!`mF zL-o~O;Edg;QgnQM7U7<~#IO8Yic9{B;Qikts;i*q;(g4hdy^mT+QRnjJ~2B&XAp4X ztXbULJc*{2uTfn70-YTl#5=QWY&wSenKR6qdNUf>!NB!gO${Q2Q>;+O!9*emM)k)|$%)jq`F59w$)_Wdgw+fN2OPFv; z$$%xzr*YDtP!0f+2owrmZ%rw4&lUnpABrZCgS_9LC8R)kKDi(M81MD9cyFvl#GEn+ z-$$j}P`Nz9jUyXIAZn@(Y(_8W`;>%W!2=I+*@`vn{I{p^E0RPiDzK!)3IYn!=I0}i zJ18&o2j#9)Uu#RxXr!-LbBxW$^BTj8<;k=IU`0g zqoS6q3Te?XQB(c?bueJFp&}{--y1QCq_p^crq%douLB*3sG)E=E7+~HGt)1kE9 z!QXBZW+cLcC5NAYkOE6}<(hz}LXMBdxV5^TbP!OHk^eyZ+#cC9E-{aLzf)Y+l%9 znvI+^#ZbS_HAOr|uyvbB$F!F9fmoJJ%nS_>8f~ZEwa_+)HO9w1y1=%xAo}JL92txw zEhYhn8NaHvqnzhf&=CeEoa*gWNSi`Y@p@~HZG{5At=q>@R|h=%N`~vdRLQidDHHpC zvn|IDZr#qq{zS$`qX+jnt+mLM6HJgcjA?a&YaUO{i_aqK>&V&~A%5Wuxxsab+@|Qxa$~BtxZw%0ydO7 z&0!tXEW=#BpEmV<_quD4O^p;^`8na9J*bk0bJpo*NYshbk^X@1KDm|e-ttAf4NoH7 zQ3zE6C0W^#K<Yi1B^_XXs*PJYbh*znbL|? zCLU_hwV1Bw=FR&)r=IX2mz;3{-disrojNjpoOOAZggMr7@b!G1L@5Jqn^z+6eZDZF zj)#7f<(|#^&}Wie8RK88jwAg)KA&!=Fh`?=A`=8;RGC?IzB$6O`Hx&1`}`74j}oju zxJU$V&Fcp=)<>%vysWFmz4l6T^*$FxJSw>M@BfMHLw9r4dE;Q;GpyR?v#BjlrR|$Q zp{wSG>Jiw|CW>HnAxB;lnGLsBjAi}OJdTizuZg29h0yWL_j+YCwvNXp4bv%@&kx&M zOwQZ0U)B$ta9zCLt;65=7IyRaa`M|14)%lX^1=Q0dw`R66e}n&ea6i!y7bG;yy`~6 z+7efs;9&`UvJN$2ir5~3@hVVpfa%#*(7*QqwjW>^A}yQB3Y!;x`Y*inpFiW+ zaYr-m$Wb`4IGK(P-hc0X-rcr^t1i64Y*_<&ux$^|ju>M=WPP0g>q=nYLNx4pr^$-& zqxKf&wY5+kjk32-T|OY8$W+SsQ|^(uB)&egd|zu&gX#%VgYK&T`f5<$uBz5CFW~KW z*RpoQZ^{{ultiOZ;%=;5xob}l7R&Ql?rh!7{k2WBg@LKxbn)90Uf6B=Qj!!FbK6_E zt>puw{eik>16Bnp2u!ytH}?s`OqS#~u16%?{sX$_Y6ZuscFitEZ=%~RE*MX0q< zDJ>pr+eHfVRxQ(0N<;1hkpzfLZgKp?x zqICN~v!SjUWceFF^z_g0`o{GGj@Rp*fByNra)`b-KivPZ*AxH$FNyz0 yMKX*Y@6;)D9F8rO6H0000 +/* UNO on the NumWorks calculator: you against one to three bots, with the official rules and scoring to 500 + * points (game.c), the bots (bot.c) and the screens (draw.c). + * + * Keys: Left and Right pick a card, OK plays it, Up draws, shift says UNO (or catches a bot that forgot), Back + * pauses; Home saves and quits. */ #include -#include "../../../launcher/src/gfx.h" -#include "uno.h" +#include "draw.h" +#include "game.h" +#include "plat.h" #include "save.h" -#include "assets.h" -#if NP_MODULE -#define np_app_begin() -#define np_app_end() 0 -#else -#include "../../common/epsilon_app.h" -#include "../../common/epsilon_files.h" -#define np_file_read ef_read -#define np_file_write ef_write -const char eadk_app_name[] __attribute__((section(".rodata.eadk_app_name")))="UNO"; -const uint32_t eadk_api_level __attribute__((section(".rodata.eadk_api_level")))=0; -void np_push(int x,int y,int w,int h,const color_t*p){eadk_display_push_rect((eadk_rect_t){x,y,w,h},p);} + +static uno_progress sv; +#define G (&sv.g) +static uno_ui ui; +static uint32_t now, bot_at, catch_at, end_at, saved_at; +static uint8_t catcher = UNO_NONE, open_seen = UNO_NONE; +static bool dirty; +/* frames drawn, the slowest (ms) and those over 33 ms: read by tools/emu.py */ +#ifndef HOST +__attribute__((used, externally_visible)) #endif -#define WHITE 0xffff -#define INK HEX(0x0B2925) -#define GOLD HEX(0xFFD75B) -#define MUTED HEX(0xBED2C7) -#define SAVE_NAME "uno.sav" -enum { S_MENU,S_SETTINGS,S_PLAY,S_PAUSE,S_HELP,S_CREDITS,S_REPLACE,S_EXIT,S_SAVE_ERROR,S_EVIDENCE,S_TABLE_INFO }; -static UnoSave sv; -#define G (&sv.game) -static color_t strip[SCREEN_W*STRIP_H]; -static int screen,sel,selected,action,color_sel,help_page,return_to,replace_to; -static int setup_page; -static uint32_t clock_ms,bot_at,last_action; -static bool redraw,dirty,reported,exit_after_save; -static bool attempted_uno; -static char message[84]; -static uint8_t evidence[108],evidence_count,evidence_color; -static uint32_t ui_random=1; -static const char*const WHO[4]={"You","Bot 1","Bot 2","Bot 3"}; -static const char*const COLORS[4]={"Red","Yellow","Green","Blue"}; -static const color_t COLOR[4]={HEX(0xE84D50),HEX(0xEAC643),HEX(0x33B878),HEX(0x4D9DE0)}; -static bool action_available(int i); -static uint32_t random_ui(void){ui_random^=ui_random<<13;ui_random^=ui_random>>17;return ui_random^=ui_random<<5;} -static char* number(char*p,unsigned v){char a[10];int n=0;do{a[n++]='0'+v%10;}while((v/=10));while(n)*p++=a[--n];*p=0;return p;} -static char* text(char*p,const char*s){while(*s)*p++=*s++;*p=0;return p;} -static void box(int x,int y,int w,int h,color_t c){gfx_rrect(x,y,w,h,7,c,256);} -static void label(int x,int y,const char*s,color_t c){gfx_text(&np_font_small,x,y,s,c,256);} -static void center(int x,int y,const char*s,color_t c){gfx_text_center(&np_font_body,x,y,s,c,256);} -static void title(int x,int y,const char*s){gfx_text_center(&np_font_title,x,y,s,WHITE,256);} -static void background(void){ - for(int y=gfx_y0;y54||dy>=gfx_y1||dy+h<=gfx_y0||dx>=320||dx+w<=0)return; - const uint8_t*p=card_pixels+card_offsets[id];uint8_t row[CARD_W]; - int first=NP_MAX(dy,gfx_y0),last=NP_MIN(dy+h,gfx_y1),sy=-1; - for(int y=first;y>5)+1;while(run--)row[x++]=t&31;}}p+=n;} - for(int x=NP_MAX(0,dx);xevent; - if(e==E_PLAY)attempted_uno=false; - if(e==E_START){text(p,"Seven cards. Match a color or symbol.");} - else if(e==E_STALEMATE)text(p,"No cards can move. Redeal this round."); - else{ - p=text(p,WHO[g->actor%4]); - if(e==E_PLAY){p=text(p," played ");name_card(g->card,p);} - else if(e==E_COLOR){p=text(p," chose ");text(p,COLORS[g->color&3]);} - else if(e==E_DRAW||e==E_PENALTY){p=text(p," drew ");p=number(p,g->amount);text(p,g->amount==1?" card":" cards");} - else if(e==E_PASS)text(p," kept the card"); - else if(e==E_UNO)text(p,g->count[g->actor]==2?": UNO call ready":" called UNO!"); - else if(e==E_CAUGHT)text(p," forgot UNO: draw 2"); - else if(e==E_CHALLENGE_WON)text(p,": challenge won! Offender draws 4"); - else if(e==E_CHALLENGE_LOST)text(p,": challenge lost! Draw 6"); - else text(p," won the game!"); - } - dirty=redraw=true;last_action=clock_ms;bot_at=clock_ms+1300; - if(g->uno_player==0)bot_at=clock_ms+2200; - selected=NP_CLAMP(selected,0,(int)g->count[0]-1);if(selected<0)selected=0; - if(g->turn==0&&g->phase==U_DRAWN){selected=g->drawn;action=-1;} - if(action>=0&&!action_available(action))action=-1; - if(g->phase>=U_ROUND&&!reported){ - reported=true;sel=0;if(g->phase==U_MATCH){if(sv.played<65535)sv.played++;if(g->winner==0&&sv.wins<65535)sv.wins++;} + +/* the message line, from what just happened */ +static void describe(void) { + uno_game *g = G; + char *p = ui.msg, card[24]; + int who = g->ev_who; + switch (g->ev) { + case E_DEAL: + p = verb(p, g->dealer, "deals: ", "deal: "); + uno_card_name(g->ev_card, card); + p = cat(p, card); + if (g->ev_victim != UNO_NONE) p = cat(p, ", "), p = verb_mid(p, g->ev_victim, "draws 2", "draw 2"); + break; + case E_PLAY: + uno_card_name(g->ev_card, card); + p = verb(p, who, "played ", "played "); + p = cat(p, card); + if (g->ev_victim != UNO_NONE) { + p = cat(p, ": "); + p = verb_mid(p, g->ev_victim, "draws ", "draw "); + p = num(p, g->ev_n); + } + if (g->ev_by == who) p = cat(p, ", UNO!"); + break; + case E_COLOR: p = verb(p, who, "called ", "called "), p = cat(p, COLOR_NAME[g->ev_n & 3]); break; + case E_DRAW: + if (!g->ev_n) p = verb(p, who, "had nothing to draw", "had nothing to draw"); + else if (g->ev_n == 1) p = verb(p, who, "drew a card", "drew a card"); + else p = verb(p, who, "drew ", "drew "), p = num(p, g->ev_n), p = cat(p, " cards"); + break; + case E_KEEP: p = verb(p, who, "kept it", "kept it"); break; + case E_TAKE: p = verb(p, who, "took ", "took "), p = num(p, g->ev_n), p = cat(p, " cards"); break; + case E_CHALLENGE_WON: + p = verb(p, who, "challenged: ", "challenged: "); + p = verb_mid(p, g->ev_victim, "bluffed, draws 4", "bluffed, draw 4"); + break; + case E_CHALLENGE_LOST: p = verb(p, who, "challenged and took ", "challenged and took "), p = num(p, g->ev_n); break; + case E_UNO: p = cat(p, uno_name(who)), p = cat(p, ": UNO!"); break; + case E_CAUGHT: + p = verb(p, g->ev_by, "caught ", "caught "); + p = cat(p, who ? uno_name(who) : "you"); + p = cat(p, ": 2 cards"); + break; + default: break; } + *p = 0; } -static void start_game(UnoRules rules){ - uno_new(G,rules,random_ui());sv.active=1;reported=false;attempted_uno=false;screen=S_PLAY;selected=0;action=-1;color_sel=0;notice(); -} -static void new_game(void){start_game(sv.prefs);} -static void next_round(void){uno_next_round(G);reported=false;selected=0;action=-1;color_sel=0;notice();} -static void panel(const char*heading){gfx_fill_alpha(0,0,320,240,0,140);box(15,18,290,204,INK);title(160,48,heading);} -static const char*const HELP_TITLE[7]={"Your turn","Action cards","Wild +4 challenge","Call UNO!","Winning","House rules","Controls"}; -static const char*const HELP[7]={ - "Match the top card's color, number or symbol. Wilds choose a color. You may draw instead of playing. After drawing, only that new card can be played; you may also keep it. Seven cards each.", - "+2: the next player draws two and loses a turn. Skip: skip the next player. Reverse: change direction. With two players, Reverse acts like Skip. Official rules never stack penalties.", - "A +4 is legal only if you have no card of the active color. You may bluff. Its target may challenge: a guilty offender draws 4; an innocent offender makes the challenger draw 6. The hand is revealed on a challenge.", - "Press 0 to call UNO before playing your next-to-last card, or right after. Forget it and another player can catch you for two cards, until the next player draws or plays. Press 0 to catch a bot that forgot.", - "The first player with no cards left wins the game. A final +2 or +4 is still resolved, including a possible +4 challenge. After the result, choose Play again for another game with the same table rules, or return to the menu.", - "Options are separate from classic rules. Stack only +2 on +2, or +4 on +4. Stacked +4 has no challenge. No stacking after a last card. You may also enable drawing until playable, forced play, or automatic UNO.", - "Left / Right: select a card. OK / EXE: play. Up: action buttons; Down: hand. 1: draw or accept penalty. 2: keep drawn card. 0: call UNO or catch. Back: pause. Home / Power: save and quit." -}; -static const char*const VARIANT[5]={"Stack +2","Stack +4","Draw until playable","Force drawn play","Automatic UNO"}; -static const char*const VARIANT_HELP[6]={"Restore classic card rules; all variants off.", - "Pass accumulated +2 cards to the next player.","Pass +4 cards on. Challenges are disabled.", - "Keep drawing until a playable card appears.","A playable drawn card must be played.","Call UNO automatically for every player."}; -static bool custom_rules(const UnoRules*r){return r->flags!=0;} -static void setting_value(int row,char*s){ - const UnoRules*r=&sv.prefs; - if(row==0){number(s,r->players);text(s+1," players");} - else text(s,(const char*const[]){"Casual","Normal","Clever"}[r->difficulty]); -} -static void settings_change(int dx){ - UnoRules*r=&sv.prefs; - if(setup_page==0){ - if(sel==0)r->players=2+(r->players-2+dx+3)%3; - else if(sel==1)r->difficulty=(r->difficulty+dx+3)%3; - }else if(setup_page==1){ - if(sel==0)r->flags=0; - else if(sel<=5)r->flags^=1u<<(sel-1); + +/* someone just forgot UNO: the bots that will catch them, and when */ +static void plan_catch(void) { + uno_game *g = G; + open_seen = g->uno_open, catcher = UNO_NONE; + if (open_seen == UNO_NONE) return; + uint32_t best = 0xFFFFFFFFu; + for (int b = 1; b < g->r.players; b++) { + uint32_t ms; + if (b != open_seen && bot_catches(g, b, g->r.level, &ms) && ms < best) best = ms, catcher = (uint8_t)b; } - dirty=true; + if (catcher != UNO_NONE) catch_at = now + best; + /* time for the forgetful to catch themselves, or for you to catch a bot, before the next player starts */ + if ((int32_t)(bot_at - (now + 1800)) < 0) bot_at = now + 1800; } -static void setup_seats(int y){ - for(int p=0;p<4;p++){ - int x=12+p*76;bool active=puno_open != open_seen) plan_catch(); + if (g->phase >= P_HAND_OVER) { + end_at = now + 1500, ui.show_end = 0, ui.sel = 0; + if (g->phase == P_GAME_OVER) ui.has_game = 0; + save(); } + if (g->turn == 0 && g->phase == P_DRAWN) ui.pick = g->drawn; + if (g->count[0] && ui.pick >= g->count[0]) ui.pick = (uint8_t)(g->count[0] - 1); + if (!g->count[0]) ui.pick = 0; + dirty = true; } -static void toggle(int x,int y,bool on,bool focus){ - box(x,y,43,16,on?GOLD:HEX(0x37544B)); - gfx_circle(x+(on?34:9),y+8,5,on?INK:MUTED,256); - label(x+(on?5:17),y+12,on?"ON":"OFF",on?INK:WHITE); - if(focus)gfx_rrect_outline(x-2,y-2,47,20,8,1,WHITE,256); + +static void start(void) { + uno_new_game(G, ui.setup, plat_random() ^ now ^ 0x5EED); + ui.has_game = 1, ui.pick = 0, ui.show_end = 0, ui.screen = V_PLAY; + open_seen = catcher = UNO_NONE; + describe(); + after(1200); + save(); } -static void setup_scene(void){ - char s[90];title(160,23,"Create table"); - const char*const steps[3]={"1 Players","2 Rules","3 Ready"}; - for(int i=0;i<3;i++){ - box(12+i*102,30,92,20,i==setup_page?GOLD:INK); - gfx_text_center(&np_font_small,58+i*102,44,steps[i],i==setup_page?INK:MUTED,256); - } - if(setup_page==0){ - setup_seats(57); - for(int i=0;i<2;i++){ - int y=116+i*28;bool focus=sel==i;color_t c=focus?INK:WHITE; - box(12,y,296,23,focus?GOLD:INK);label(22,y+16,i?"Bot level":"Players",c); - if(i==0){ - for(int n=2;n<=4;n++){ - int x=178+(n-2)*37;bool chosen=n==sv.prefs.players; - box(x,y+2,30,19,chosen?INK:focus?GOLD:HEX(0x37544B));number(s,n); - gfx_text_center(&np_font_small,x+15,y+16,s,chosen?GOLD:c,256); - } - }else{setting_value(i,s);gfx_text_right(&np_font_small,285,y+16,s,c,256);label(293,y+16,">",c);} - } - box(12,175,296,20,INK);gfx_text_center(&np_font_small,160,189,"First empty hand wins",WHITE,256); - button(12,201,296,"Next: rules >",sel==2); - }else if(setup_page==1){ - box(12,57,296,25,sel==0?GOLD:INK); - label(22,74,custom_rules(&sv.prefs)?"Custom rules":"Classic rules",sel==0?INK:WHITE); - gfx_text_right(&np_font_small,296,74,"OK: restore classic",sel==0?INK:MUTED,256); - for(int i=0;i<5;i++){ - int y=85+i*20;box(12,y,296,20,INK); - if(sel==i+1)gfx_rrect_outline(12,y,296,20,7,1,GOLD,256); - label(23,y+14,VARIANT[i],WHITE);toggle(253,y+2,sv.prefs.flags&(1u<",sel==6); - }else{ - setup_seats(57); - char*p=number(s,sv.prefs.players-1);p=text(p,sv.prefs.players==2?" bot / ":" bots / ");setting_value(1,p); - gfx_text_center(&np_font_small,160,128,s,WHITE,256); - gfx_text_center(&np_font_body,160,151,custom_rules(&sv.prefs)?"Custom table":"Classic UNO",GOLD,256); - const char*const short_rule[5]={"+2 stacking","+4 stacking","Draw until match","Forced draw play","Auto UNO"}; - for(int i=0;i<5;i++){ - int x=12+(i%2)*152,y=158+(i/2)*15;bool on=sv.prefs.flags&(1u<turn==p&&G->phasecount[p]);text(z," cards");label(x+21,y+30,s,WHITE); - if(G->count[p]==1)label(x+w-28,y+13,"UNO",G->uno_player==p?GOLD:MUTED); + start(); } -static bool draw_available(void){return !G->turn&&(G->phase==U_TURN||(G->phase==U_DRAWN&&!(G->rules.flags&R_FORCE)));} -static bool uno_available(void){return G->phaseuno_player!=UNO_NONE||(!G->turn&&G->count[0]==2&&(G->phase==U_TURN||G->phase==U_DRAWN)));} -static bool action_available(int i){return i==2||(i==0?draw_available():uno_available());} -static void hand_card(int i,int x,bool focus){ - int c=G->hands[0][i],y=focus?160:172,w=focus?44:38,h=focus?64:55; - if(focus)gfx_rrect_outline(x-2,y-2,w+4,h+4,7,2,G->turn?WHITE:GOLD,256); - card(c,x,y,w,h); - char s[8];int v=uno_value(c);if(v<10)number(s,v);else text(s,v==10?"S":v==11?"R":v==12?"+2":c==52?"W":"+4"); - box(x+2,y+2,23,15,c<52?COLOR[c/13]:INK);label(x+5,y+13,s,c<52&&c/13==1?INK:WHITE); - if(G->turn==0&&uno_can_play(G,i))gfx_circle(x+8,y+h-7,3,GOLD,256); + +static void bot_step(void) { + uno_game *g = G; + int p = g->turn; + uno_move m = bot_move(g, g->r.level); + bot_do(g, m); + describe(); + if (g->phase == P_COLOR && g->turn == p) { /* its Wild: the colour at once */ + bool said = g->ev_by == p; + bot_do(g, bot_move(g, g->r.level)); + char card[24], *q = ui.msg; + uno_card_name(g->pile[g->pn - 1], card); + q = cat(q, uno_name(p)), q = cat(q, " played "), q = cat(q, card), q = cat(q, ": "); + q = cat(q, COLOR_NAME[g->color & 3]); + if (said) cat(q, ", UNO!"); + } + after(m.act == M_DRAW && g->phase == P_DRAWN ? 700 : 1000); } -static void hand(void){ - Uno*g=G;int n=g->count[0],visible=NP_MIN(n,8),first=NP_CLAMP(selected-3,0,n-visible); - int spacing=visible>1?NP_MIN(38,260/(visible-1)):0,w=visible?44+(visible-1)*spacing:0,x0=(320-w)/2; - gfx_fill_alpha(0,158,320,70,INK,110); - for(int j=0;jselected?6:0),false); - if(n)hand_card(selected,x0+(selected-first)*spacing,true); - if(first)label(3,204,"<",GOLD);if(first+visible",GOLD); - char s[60];gfx_fill(0,228,320,12,INK); - if(n)name_card(g->hands[0][selected],s);else text(s,"No cards left");label(6,238,s,WHITE); - char*p=number(s,n?selected+1:0);p=text(p,"/");number(p,n);gfx_text_center(&np_font_small,160,238,s,MUTED,256); - const char*hint=g->turn?"Wait for your turn":n&&uno_can_play(g,selected)?"OK: play":"Not playable"; - if(!g->turn&&g->phase==U_DRAWN&&!uno_can_play(g,selected))hint="New card only"; - if(action>=0)hint="Down: your hand"; - gfx_text_right(&np_font_small,314,238,hint,!g->turn&&n&&uno_can_play(g,selected)?GOLD:MUTED,256); + +static void shift_key(void) { + uno_game *g = G; + if (g->uno_open != UNO_NONE && g->uno_open != 0) { + if (uno_catch(g, 0)) describe(), after(1000); + } else if (uno_call(g, 0)) { + describe(); + after(g->turn == 0 ? 0 : 1000); + } else { + strcpy(ui.msg, "UNO is for your next-to-last card"); + dirty = true; + } } -static void table_action(int x,int w,const char*s,int id,bool enabled){ - bool focus=action==id;box(x,136,w,21,focus?GOLD:INK); - gfx_text_center(&np_font_small,x+w/2,151,s,focus?INK:enabled?WHITE:MUTED,256); + +static void human_play(int i) { + uno_game *g = G; + if (!uno_play(g, i, false)) { + strcpy(ui.msg, g->phase == P_DRAWN ? "Only the new card can be played" : "That card doesn't go"); + dirty = true; + return; + } + describe(); + if (g->phase == P_COLOR) ui.sel = (uint8_t)bot_best_color(g, 0, LEVEL_NORMAL); + after(1000); } -static void table(void){ - Uno*g=G;char s[60];bool human=g->turn==0&&g->phaseuno_player!=UNO_NONE&&g->phaserules)?"Custom":"Classic",bar);char*p; - p=text(s,g->phase>=U_ROUND?(g->phase==U_MATCH?"GAME OVER":"REDEAL"):human?"YOUR TURN":WHO[g->turn]); - if(!human&&g->phaseuno_player==0?"0: CALL UNO!":"0: CATCH UNO!"); - gfx_text_center(&np_font_body,153,15,s,bar,256); - p=number(s,g->rules.players);text(p," players"); - gfx_text_right(&np_font_small,313,14,s,bar,256); - if(g->rules.players==2)bot_badge(1,119,22,82); - else if(g->rules.players==3){bot_badge(1,5,77,65);bot_badge(2,250,77,65);} - else{bot_badge(1,5,77,65);bot_badge(2,119,22,82);bot_badge(3,250,77,65);} - if(g->rules.players==3){gfx_text_center(&np_font_small,160,39,custom_rules(&g->rules)?"Custom table":"Classic table",MUTED,256);} - gfx_text_center(&np_font_small,99,70,"DRAW",MUTED,256);gfx_text_center(&np_font_small,172,70,"DISCARD",MUTED,256); - card(54,80,75,38,55);card(g->discard[g->xn-1],151,72,42,61); - box(85,111,28,15,INK);number(s,g->dn);gfx_text_center(&np_font_small,99,123,s,WHITE,256); - gfx_text_center(&np_font_small,222,69,"COLOR",MUTED,256); - if(g->color<4){box(201,74,42,36,COLOR[g->color]);gfx_text_center(&np_font_small,222,96,COLORS[g->color],g->color==1?INK:WHITE,256);} - gfx_text_center(&np_font_small,222,128,g->rules.players==2?"2 players":g->direction==1?"Clockwise":"Counter-CW",MUTED,256); - hand(); - box(5,136,64,21,human?GOLD:INK);p=text(s,"YOU ");number(p,g->count[0]);gfx_text_center(&np_font_small,37,151,s,human?INK:MUTED,256); - if(g->phase==U_DRAWN)text(s,g->rules.flags&R_FORCE?"Must play":"2 Keep"); - else if(g->pending){p=text(s,"1 Draw +");number(p,g->pending);}else text(s,"1 Draw"); - table_action(74,72,s,0,draw_available()); - table_action(151,72,g->uno_player!=UNO_NONE&&g->uno_player!=0?"0 Catch!":g->uno_armed==0?"UNO ready":"0 UNO!",1,uno_available()); - table_action(228,87,"Back: pause",2,true); - if(screen==S_PLAY&&human&&g->phase==U_COLOR){ - panel("Choose a color"); - for(int i=0;i<4;i++){int x=34+i*66;box(x,84,54,58,COLOR[i]);if(i==color_sel)gfx_rrect_outline(x-3,81,60,64,9,3,WHITE,256);gfx_text_center(&np_font_small,x+27,119,COLORS[i],i==1?INK:WHITE,256);} - center(160,180,"Left / Right, then OK",MUTED); - }else if(screen==S_PLAY&&human&&g->phase==U_CHALLENGE){ - panel("Wild +4");gfx_paragraph(&np_font_small,160,73,255,16,"Did the offender have a card of the previous color? Challenge to reveal their hand.",WHITE,256); - button(36,127,248,"Accept: draw 4",sel==0);button(36,159,248,"Challenge: risk drawing 6",sel==1); - gfx_text_center(&np_font_small,160,205,"Previous color",MUTED,256);gfx_circle(246,201,6,COLOR[g->old_color&3],256); - }else if(screen==S_PLAY&&g->phase>=U_ROUND){ - if(g->winner==UNO_NONE){ - panel("Table blocked");center(160,106,"Nobody can play or draw.",WHITE); - button(36,171,248,"Redeal cards",true); - }else{ - p=text(s,g->winner?WHO[g->winner]:"You");text(p,g->winner?" wins!":" win!");panel(s); - card(g->discard[g->xn-1],138,61,44,64); - gfx_text_center(&np_font_small,160,146,"First empty hand. Game won!",GOLD,256); - button(36,160,248,"Play again",sel==0);button(36,190,248,"Back to menu",sel==1); + +static void play_keys(uint32_t hit) { + uno_game *g = G; + if (hit & K_BACK) { + ui.screen = V_PAUSE, ui.sel = PAUSE_RESUME; + save(); + return; + } + if (g->phase >= P_HAND_OVER) { + if (!ui.show_end) return; + if (g->phase == P_GAME_OVER) { + if (hit & (K_LEFT | K_RIGHT | K_UP | K_DOWN)) ui.sel ^= 1; + if (hit & K_OK) { + if (ui.sel == 0) start(); + else ui.screen = V_TITLE, ui.sel = 0, save(); + } + } else if (hit & K_OK) { + uno_next_hand(g); + ui.pick = 0, ui.show_end = 0; + describe(); + after(1200); } + return; } -} -static void scene(void*unused){ - (void)unused;background();char s[90]; - if(screen==S_MENU||screen==S_SETTINGS||screen==S_REPLACE||screen==S_EXIT||screen==S_SAVE_ERROR){ - if(screen==S_MENU||screen==S_EXIT||screen==S_SAVE_ERROR){ - gfx_text(&np_font_title,24,53,"UNO",WHITE,256);label(26,75,"The classic card game",MUTED); - card(0,239,53,47,68);card(53,222,44,47,68);card(54,206,36,47,68); - static const char*const items[4]={"Continue","New game","How to play","Credits"}; - for(int i=0;i<4;i++)button(23,91+i*31,274,i==0&&!sv.active?"Continue - no saved match":items[i],sel==i); - label(24,233,"By Bobydeluxe",MUTED);gfx_text_right(&np_font_small,297,233,"Back: exit",MUTED,256); - }else setup_scene(); - }else if(screen==S_HELP||screen==S_CREDITS){ - title(160,34,screen==S_HELP?HELP_TITLE[help_page]:"Credits"); - box(14,48,292,161,INK); - gfx_paragraph(&np_font_body,160,72,266,20,screen==S_HELP?HELP[help_page]:"Game made by Bobydeluxe.\nCard and table art by AlexDer.\nUNO is a Mattel game.\nUnofficial fan adaptation.",WHITE,256); - if(screen==S_HELP){char*p=number(s,help_page+1);p=text(p," / 7 Left / Right Back");(void)p;}else text(s,"Back: return"); - gfx_text_center(&np_font_small,160,232,s,MUTED,256); - }else if(sv.active)table(); - if(screen==S_PAUSE){ - panel("Paused");static const char*const items[4]={"Resume","Table rules","Save to menu","Save and exit"}; - for(int i=0;i<4;i++)button(36,62+i*33,248,items[i],sel==i); - }else if(screen==S_REPLACE){ - panel("Replace this game?");gfx_paragraph(&np_font_body,160,83,254,21,"Starting a new game replaces your current game.",WHITE,256); - button(36,132,248,"Keep current game",sel==0);button(36,166,248,"Start new game",sel==1); - }else if(screen==S_EXIT){ - panel("Save and exit?");button(36,90,248,"Stay",sel==0);button(36,127,248,"Save and exit",sel==1); - }else if(screen==S_SAVE_ERROR){ - panel("Save failed");gfx_paragraph(&np_font_small,160,76,256,17,"Calculator storage is full or unavailable. Your existing files were kept.",WHITE,256); - button(36,119,248,"Retry saving",sel==0);button(36,153,248,exit_after_save?"Exit without saving":"Return without saving",sel==1); - }else if(screen==S_TABLE_INFO){ - panel("Table rules"); - for(int i=0;i<5;i++){int y=66+i*24;label(30,y+13,VARIANT[i],WHITE);toggle(245,y,G->rules.flags&(1u<event==E_CHALLENGE_WON?"Illegal +4: offender draws 4":"Legal +4: challenger draws 6",GOLD,256); - gfx_text_center(&np_font_small,160,211,"Left / Right: cards OK: continue",MUTED,256); + if (hit & K_SHIFT) shift_key(); + int n = g->count[0]; + bool mine = g->turn == 0; + if (mine && g->phase == P_COLOR) { + if (hit & (K_LEFT | K_UP)) ui.sel = (uint8_t)((ui.sel + 3) % 4); + if (hit & (K_RIGHT | K_DOWN)) ui.sel = (uint8_t)((ui.sel + 1) % 4); + if ((hit & K_OK) && uno_choose(g, ui.sel)) describe(), after(1000); + return; } -} -static bool key(uint64_t k,int id){return (k>>id)&1;} -static void uno_action(void){ - if(G->uno_player!=UNO_NONE&&G->uno_player!=0){if(uno_catch(G,0))notice();} - else if(uno_call(G,0))notice(); - else{set_message("Call UNO when you have two cards.");redraw=true;} -} -static void draw_action(void){ - if(G->turn)return; - if(G->phase==U_DRAWN){if(uno_keep(G))notice();} - else if(G->phase==U_TURN||G->phase==U_CHALLENGE){if(G->pending?uno_accept(G):uno_draw(G))notice();} -} -static void start_requested(void){ - if(sv.active){replace_to=S_SETTINGS;screen=S_REPLACE;sel=0;}else new_game(); -} -static void setup_input(int dx,int dy,bool ok,bool back){ - if(back){ - if(setup_page){setup_page--;sel=setup_page?6:2;} - else{screen=S_MENU;sel=1;} + if (mine && g->phase == P_PENALTY && g->challengeable) { + int k = uno_pen_count(g); + if (hit & K_UP) ui.sel = (uint8_t)((ui.sel + k - 1) % k); + if (hit & K_DOWN) ui.sel = (uint8_t)((ui.sel + 1) % k); + if (!(hit & K_OK)) return; + int item = ui.sel % k; + if (item == PEN_TAKE) { + uno_take(g); + } else if (item == PEN_CHALLENGE) { + /* the challenged player shows their hand to the challenger */ + int o = g->offender; + memcpy(ui.reveal, g->hand[o], g->count[o]); + ui.reveal_n = g->count[o], ui.reveal_who = (uint8_t)o, ui.reveal_color = g->prev_color, ui.reveal_guilty = g->guilty; + uno_challenge(g); + ui.screen = V_REVEAL; + } else { + for (int i = 0; i < n; i++) + if (uno_can_play(g, i)) { + human_play(i); + return; + } + } + describe(); + after(1000); return; } - int rows=setup_page==0?3:setup_page==1?7:1; - if(dy)sel=(sel+dy+rows)%rows; - if(dx)settings_change(dx); - if(ok){ - if(setup_page==2)start_requested(); - else if(sel==rows-1){setup_page++;sel=0;} - else settings_change(1); + if (n && (hit & (K_LEFT | K_RIGHT)) && !(mine && g->phase == P_DRAWN)) { + ui.pick = (uint8_t)((ui.pick + (hit & K_RIGHT ? 1 : n - 1)) % n); + dirty = true; + } + if (!mine) return; + if (g->phase == P_DRAWN) { + if (hit & K_OK) human_play(g->drawn); + else if ((hit & K_UP) && uno_keep(g)) describe(), after(1000); + } else if (g->phase == P_PENALTY) { + if ((hit & K_OK) && n) human_play(ui.pick); + else if ((hit & K_UP) && uno_take(g)) describe(), after(1000); + } else if (g->phase == P_PLAY) { + if ((hit & K_OK) && n) human_play(ui.pick); + else if ((hit & K_UP) && uno_draw(g)) describe(), after(g->phase == P_DRAWN ? 0 : 1000); } } -static void play_input(int dx,int dy,bool ok,bool draw,bool keep,bool call){ - Uno*g=G; - if(call){uno_action();return;} - if(g->phase>=U_ROUND){ - if(g->phase==U_MATCH){if(dy)sel^=1;if(ok){if(sel){sv.active=0;screen=S_MENU;sel=1;dirty=true;}else start_game(g->rules);}} - else if(ok)next_round(); + +/* what happens by itself: the bots' turns, their catches, a penalty you can only take, the end of a hand */ +static void tick(void) { + uno_game *g = G; + if (ui.screen != V_PLAY) return; + if (g->phase >= P_HAND_OVER) { + if (!ui.show_end && (int32_t)(now - end_at) >= 0) ui.show_end = 1, dirty = true; return; } - if(g->turn==0&&g->phase==U_COLOR){color_sel=(color_sel+dx+4)%4;if(ok&&uno_choose_color(g,color_sel)){action=-1;notice();}return;} - if(g->turn==0&&g->phase==U_CHALLENGE){ - if(dy)sel^=1; - if(draw||(ok&&!sel)){uno_accept(g);notice();} - else if(ok){ - evidence_count=g->count[g->offender];memcpy(evidence,g->hands[g->offender],evidence_count);evidence_color=g->old_color; - uno_challenge(g);notice();selected=0;screen=S_EVIDENCE; - }return; - } - if(draw){draw_action();return;} - if(keep&&g->turn==0&&uno_keep(g)){notice();return;} - if(dy){action=dy<0?0:-1;while(action>=0&&!action_available(action))action++;} - if(action>=0){ - action=(action+dx+3)%3; - while(!action_available(action))action=(action+(dx<0?2:1))%3; - if(ok){if(action==0)draw_action();else if(action==1)uno_action();else{screen=S_PAUSE;sel=0;}} - }else{ - int n=g->count[0];if(dx&&n){selected=(selected+dx+n)%n;last_action=clock_ms-1800;} - if(ok&&!g->turn&&uno_play(g,selected,false)){color_sel=uno_bot_color(g,0);sel=0;notice();} - else if(ok&&!g->turn){set_message("Match the active color, number or symbol.");redraw=true;} + if (catcher != UNO_NONE && g->uno_open == open_seen && (int32_t)(now - catch_at) >= 0) { + int by = catcher; + catcher = UNO_NONE; + if (uno_catch(g, by)) describe(), after(1000); + return; } + if ((int32_t)(now - bot_at) < 0) return; + if (g->turn != 0) bot_step(); + else if (g->phase == P_PENALTY && !g->challengeable && !uno_can_stack(g)) uno_take(g), describe(), after(1000); } -static void cpu_tick(void){ - Uno*g=G; - if(screen!=S_PLAY||g->phase>=U_ROUND||(int32_t)(clock_ms-bot_at)<0)return; - if(g->uno_player==0&&!attempted_uno){attempted_uno=true;if(random_ui()%100<70){uno_catch(g,1);notice();}bot_at=clock_ms+700;return;} - if(!g->turn)return; - if(g->uno_player!=UNO_NONE&&g->uno_player!=g->turn&&random_ui()%100<45){uno_catch(g,g->turn);notice();return;} - uno_bot(g);notice();color_sel=uno_bot_color(g,0);sel=0; + +/* back to the table from a pause: the bots wait a little */ +static void resume(void) { + ui.screen = V_PLAY; + bot_at = now + 600; + if (catcher != UNO_NONE && (int32_t)(catch_at - now) < 600) catch_at = now + 600; } -int main(void){ - np_app_begin();color_t*old_strip=gfx_buf;gfx_buf=strip; - sv.prefs=(UnoRules){4,1,0};uint32_t n=0;const uint8_t*b=np_file_read(SAVE_NAME,&n);save_decode(&sv,b,n); - uint32_t last=(uint32_t)eadk_timing_millis();ui_random=eadk_random()^last;if(!ui_random)ui_random=1; - screen=S_MENU;sel=sv.active?0:1;selected=0;action=-1;clock_ms=0;redraw=true;dirty=false; - uint64_t held=eadk_keyboard_scan(),stale=held;bool quit=false;uint32_t last_repeat=0;uint64_t repeat_keys=0; - while(!quit){ - uint32_t now=(uint32_t)eadk_timing_millis(),dt=now-last;last=now; - if(screen==S_PLAY){clock_ms+=NP_MIN(dt,100u);} - uint64_t k=eadk_keyboard_scan();stale&=k;k&=~stale;uint64_t hit=k&~held;held=k; - uint64_t arrows=(1ull<=0){hit|=repeat_keys;last_repeat=now+110;} - bool ok=key(hit,eadk_key_ok)||key(hit,eadk_key_exe),back=key(hit,eadk_key_back); - int dx=key(hit,eadk_key_right)-key(hit,eadk_key_left),dy=key(hit,eadk_key_down)-key(hit,eadk_key_up),before=screen; - if(hit)redraw=true; - if(screen!=S_SAVE_ERROR&&(key(k,eadk_key_home)||key(k,eadk_key_on_off))){ - if(save()){quit=true;continue;}exit_after_save=true;screen=S_SAVE_ERROR;sel=0;stale|=k;ok=back=false;dx=dy=0;redraw=true; - } - switch(screen){ - case S_MENU: - if(dy)sel=(sel+dy+4)%4; - if(ok){if(sel==0&&sv.active){screen=S_PLAY;reported=G->phase>=U_ROUND;bot_at=clock_ms+1300;} - else if(sel==1){screen=S_SETTINGS;setup_page=0;sel=0;} - else if(sel==2){return_to=S_MENU;screen=S_HELP;help_page=0;} - else if(sel==3){screen=S_CREDITS;return_to=S_MENU;}} - else if(back){screen=S_EXIT;sel=0;}break; - case S_SETTINGS: - setup_input(dx,dy,ok,back);break; - case S_PLAY: - if(back){screen=S_PAUSE;sel=0;} - else play_input(dx,dy,ok,key(hit,eadk_key_one),key(hit,eadk_key_two),key(hit,eadk_key_zero)); - cpu_tick();break; - case S_PAUSE: - if(dy)sel=(sel+dy+4)%4; - if(back||(ok&&!sel)){screen=S_PLAY;bot_at=clock_ms+800;} - else if(ok&&sel==1){screen=S_TABLE_INFO;} - else if(ok){exit_after_save=sel==3;if(save()){if(exit_after_save)quit=true;else screen=S_MENU,sel=0;}else screen=S_SAVE_ERROR,sel=0;} + +int main(void) { + plat_begin(); + memset(&ui, 0, sizeof ui); + catcher = open_seen = UNO_NONE; + save_load(&sv); + ui.setup = sv.setup, ui.has_game = sv.has_game; + if (ui.has_game) describe(); + ui.screen = V_TITLE, ui.sel = 0; + uint32_t stale = plat_keys(), prev = stale, rep_at = 0; + uint8_t shown = 0xFF; + now = plat_millis(); + bot_at = now + 1000; + dirty = true; + for (;;) { + now = plat_millis(); + uint32_t keys = plat_keys(); + stale &= keys; /* keys still down from the screen before don't count */ + uint32_t live = keys & ~stale, hit = live & ~prev; + /* Left or Right held: again after 350 ms, then every 120 ms */ + uint32_t arrows = live & (K_LEFT | K_RIGHT); + if (hit & arrows) rep_at = now + 350; + else if (arrows && (int32_t)(now - rep_at) >= 0) hit |= arrows, rep_at = now + 120; + prev = live; + if (keys & K_HOME) break; /* Home: saved below, then out */ + if (hit) dirty = true; + bool quit = false; + switch (ui.screen) { + case V_TITLE: { + int n = uno_menu_count(&ui); + if (hit & K_UP) ui.sel = (uint8_t)((ui.sel + n - 1) % n); + if (hit & K_DOWN) ui.sel = (uint8_t)((ui.sel + 1) % n); + if (hit & K_BACK) quit = true; + else if (hit & K_OK) switch (uno_menu_item(&ui, ui.sel % n)) { + case MENU_CONTINUE: ui.screen = V_PLAY, after(1000); break; + case MENU_NEW: ui.screen = V_SETUP, ui.under = V_TITLE, ui.sel = ROW_DEAL; break; + default: ui.screen = V_HELP, ui.under = V_TITLE, ui.page = 0, ui.first_run = 0; break; + } + break; + } + case V_SETUP: { + uno_rules *r = &ui.setup; + if (hit & K_UP) ui.sel = (uint8_t)((ui.sel + SETUP_ROWS - 1) % SETUP_ROWS); + if (hit & K_DOWN) ui.sel = (uint8_t)((ui.sel + 1) % SETUP_ROWS); + int d = hit & K_RIGHT ? 1 : hit & K_LEFT ? -1 : 0; + if (d && ui.sel == ROW_PLAYERS) r->players = (uint8_t)(2 + (r->players - 2 + d + 3) % 3); + if (d && ui.sel == ROW_LEVEL) r->level = (uint8_t)((r->level + d + 3) % 3); + if (d && ui.sel == ROW_LENGTH) r->one_hand ^= 1; + bool toggle = ui.sel >= ROW_HOUSE && ui.sel < ROW_DEAL && (d || (hit & K_OK)); + if (toggle) r->house ^= (uint8_t)(1u << (ui.sel - ROW_HOUSE)); + if (hit & K_BACK) ui.screen = ui.under, ui.sel = ui.under == V_PAUSE ? PAUSE_NEW : (uint8_t)(uno_menu_count(&ui) - 2); + else if ((hit & K_OK) && !toggle) deal(); + break; + } + case V_HELP: + if (ui.first_run && (hit & K_BACK)) { + ui.first_run = 0; + start(); + } else if ((hit & K_RIGHT || (ui.first_run && (hit & K_OK))) && ui.page + 1 < UNO_HELP_PAGES) { + ui.page++; + } else if ((hit & K_LEFT) && ui.page) { + ui.page--; + } else if (ui.first_run && (hit & K_OK)) { + ui.first_run = 0; + start(); + } else if (hit & (K_BACK | K_OK)) { + ui.screen = ui.under, ui.sel = ui.under == V_PAUSE ? PAUSE_HELP : (uint8_t)(uno_menu_count(&ui) - 1); + } + break; + case V_PLAY: play_keys(hit); break; + case V_REVEAL: + if (hit & (K_OK | K_BACK)) resume(); break; - case S_HELP: - help_page=(help_page+dx+7)%7;if(back||ok){screen=return_to;sel=return_to==S_PAUSE?1:2;}break; - case S_CREDITS:if(back||ok){screen=S_MENU;sel=3;}break; - case S_TABLE_INFO: - if(back){screen=S_PAUSE;sel=1;}else if(ok){return_to=S_TABLE_INFO;screen=S_HELP;help_page=4;}break; - case S_REPLACE: - if(dy)sel^=1;if(back||(ok&&!sel)){screen=replace_to;setup_page=2;sel=0;}else if(ok)new_game();break; - case S_EXIT: - if(dy)sel^=1;if(back||(ok&&!sel)){screen=S_MENU;sel=1;}else if(ok){if(save())quit=true;else screen=S_SAVE_ERROR,sel=0,exit_after_save=true;}break; - case S_SAVE_ERROR: - if(dy)sel^=1; - if(ok){if(sel||save()){if(exit_after_save)quit=true;else screen=S_MENU,sel=0;}}break; - case S_EVIDENCE: - if(dx&&evidence_count)selected=(selected+dx+evidence_count)%evidence_count; - if(ok||back){screen=S_PLAY;selected=0;bot_at=clock_ms+1300;}break; + case V_PAUSE: + if (hit & K_UP) ui.sel = (uint8_t)((ui.sel + PAUSE_COUNT - 1) % PAUSE_COUNT); + if (hit & K_DOWN) ui.sel = (uint8_t)((ui.sel + 1) % PAUSE_COUNT); + if (hit & K_BACK) resume(); + else if (hit & K_OK) switch (ui.sel) { + case PAUSE_RESUME: resume(); break; + case PAUSE_NEW: ui.screen = V_SETUP, ui.under = V_PAUSE, ui.sel = ROW_DEAL; break; + case PAUSE_HELP: ui.screen = V_HELP, ui.under = V_PAUSE, ui.page = 0, ui.first_run = 0; break; + default: ui.screen = V_QUIT, ui.sel = 0; break; + } + break; + case V_QUIT: + if (hit & (K_LEFT | K_RIGHT | K_UP | K_DOWN)) ui.sel ^= 1; + if (hit & K_BACK) ui.screen = V_PAUSE, ui.sel = PAUSE_QUIT; + else if (hit & K_OK) { + if (ui.sel) quit = true; + else ui.screen = V_PAUSE, ui.sel = PAUSE_QUIT; + } + break; + } + if (quit) break; + tick(); + if (ui.has_game && (int32_t)(now - saved_at) >= 30000) save(); + if (ui.screen != shown) { + stale = keys, prev = 0; /* a new screen starts with all keys up */ + shown = ui.screen; + dirty = true; + } + if (dirty) { + ui.clock = now; + uint32_t t0 = plat_millis(); + uno_render(G, &ui); + uint32_t spent = plat_millis() - t0; + perf_frames++; + if (spent > perf_max) perf_max = spent; + if (spent > 33) perf_slow++; + dirty = false; + } else { + plat_sleep(10); } - if(screen!=before){stale|=k;redraw=true;repeat_keys=0;last=(uint32_t)eadk_timing_millis();} - if(redraw){eadk_display_wait_for_vblank();gfx_render(scene,0,0,240);redraw=false;} - eadk_timing_msleep(8); } - gfx_buf=old_strip;return np_app_end(); + save(); + return plat_end(); } diff --git a/games/uno/src/plat.h b/games/uno/src/plat.h new file mode 100644 index 00000000..45b5fca0 --- /dev/null +++ b/games/uno/src/plat.h @@ -0,0 +1,17 @@ +/* What the game needs from the calculator (plat_eadk.c), or from a computer for the tests. */ +#ifndef UNO_PLAT_H +#define UNO_PLAT_H +#include +#include + +enum { K_OK = 1, K_SHIFT = 2, K_UP = 4, K_DOWN = 8, K_LEFT = 16, K_RIGHT = 32, K_BACK = 64, K_HOME = 128 }; +uint32_t plat_keys(void); +uint32_t plat_millis(void); +void plat_sleep(uint32_t ms); +void plat_push(int x, int y, int w, int h, const uint16_t *px); +bool plat_save(const char *name, const void *data, uint32_t len); +const uint8_t *plat_load(const char *name, uint32_t *len); +uint32_t plat_random(void); +void plat_begin(void); +int plat_end(void); +#endif diff --git a/games/uno/src/plat_eadk.c b/games/uno/src/plat_eadk.c new file mode 100644 index 00000000..1b66fc31 --- /dev/null +++ b/games/uno/src/plat_eadk.c @@ -0,0 +1,34 @@ +/* The calculator: keys, time, the screen and files (EADK, and NumPlay's careful file helpers). */ +#include +#include "../../common/epsilon_app.h" +#include "../../common/epsilon_files.h" +#include "plat.h" + +const char eadk_app_name[] __attribute__((section(".rodata.eadk_app_name"))) = "UNO"; +const uint32_t eadk_api_level __attribute__((section(".rodata.eadk_api_level"))) = 0; + +#define KEY(k) ((uint64_t)1 << (k)) + +uint32_t plat_keys(void) { + uint64_t k = eadk_keyboard_scan(); + uint32_t r = 0; + if (k & (KEY(eadk_key_ok) | KEY(eadk_key_exe) | KEY(eadk_key_five))) r |= K_OK; + if (k & KEY(eadk_key_shift)) r |= K_SHIFT; + if (k & (KEY(eadk_key_up) | KEY(eadk_key_eight))) r |= K_UP; + if (k & (KEY(eadk_key_down) | KEY(eadk_key_two))) r |= K_DOWN; + if (k & (KEY(eadk_key_left) | KEY(eadk_key_four))) r |= K_LEFT; + if (k & (KEY(eadk_key_right) | KEY(eadk_key_six))) r |= K_RIGHT; + if (k & (KEY(eadk_key_back) | KEY(eadk_key_backspace))) r |= K_BACK; + if (k & (KEY(eadk_key_home) | KEY(eadk_key_on_off))) r |= K_HOME; + return r; +} +uint32_t plat_millis(void) { return (uint32_t)eadk_timing_millis(); } +void plat_sleep(uint32_t ms) { eadk_timing_msleep(ms); } +void plat_push(int x, int y, int w, int h, const uint16_t *px) { + eadk_display_push_rect((eadk_rect_t){(uint16_t)x, (uint16_t)y, (uint16_t)w, (uint16_t)h}, (const eadk_color_t *)px); +} +bool plat_save(const char *name, const void *data, uint32_t len) { return ef_write(name, data, len); } +const uint8_t *plat_load(const char *name, uint32_t *len) { return ef_read(name, len); } +uint32_t plat_random(void) { return eadk_random(); } +void plat_begin(void) { np_app_begin(); } +int plat_end(void) { return np_app_end(); } diff --git a/games/uno/src/save.c b/games/uno/src/save.c new file mode 100644 index 00000000..0164974e --- /dev/null +++ b/games/uno/src/save.c @@ -0,0 +1,120 @@ +/* The save (save.h): a bytes file with a magic, a version, its size and a checksum, and the game checked card by + * card; anything else (damaged, cut short, from elsewhere) is not read: the copy in the Python script is tried, + * then a fresh start. */ +#include +#include +#include "plat.h" +#include "save.h" + +void uno_fresh(uno_progress *p) { + memset(p, 0, sizeof *p); + p->setup.players = 4, p->setup.level = LEVEL_NORMAL; +} + +uint32_t uno_sum(const void *data, uint32_t n) { + const uint8_t *p = data; + uint32_t h = 2166136261u; + for (uint32_t i = 0; i < n; i++) h = (h ^ p[i]) * 16777619u; + return h; +} + +bool uno_file_ok(const uno_file *f) { + if (f->magic != UNO_MAGIC || f->version != UNO_VERSION || f->size != sizeof *f) return false; + if (f->sum != uno_sum(f, offsetof(uno_file, sum))) return false; + const uno_progress *p = &f->p; + const uno_rules *r = &p->setup; + if (r->players < 2 || r->players > 4 || r->level > LEVEL_HARD || r->one_hand > 1 || r->house > H_ALL) return false; + if (p->guide > 1 || p->has_game > 1) return false; + return !p->has_game || uno_valid(&p->g); +} + +static const char head[] = "# UNO keeps a copy of your game here,\n" + "# so that installing it again doesn't erase it.\n"; +static const char b64[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; +static uint8_t copy[1 + sizeof head + 2 + sizeof UNO_SAVE_NAME + 1 + (sizeof(uno_file) + 2) / 3 * 4 + 2]; + +/* the copy: the file in base 64, in a comment line of a script */ +static bool copy_write(const uno_file *f) { + const uint8_t *bytes = (const uint8_t *)f; + uint32_t len = sizeof *f, nl = sizeof UNO_SAVE_NAME - 1; + uint8_t *p = copy; + *p++ = 0; /* (a script's first byte: not imported) */ + memcpy(p, head, sizeof head - 1), p += sizeof head - 1; + *p++ = '#', *p++ = '>'; + memcpy(p, UNO_SAVE_NAME, nl), p += nl; + *p++ = ':'; + for (uint32_t i = 0; i < len; i += 3, p += 4) { + uint32_t left = len - i; + uint32_t v = (uint32_t)bytes[i] << 16 | (left > 1 ? (uint32_t)bytes[i + 1] << 8 : 0) | (left > 2 ? bytes[i + 2] : 0); + p[0] = (uint8_t)b64[v >> 18 & 63]; + p[1] = (uint8_t)b64[v >> 12 & 63]; + p[2] = left > 1 ? (uint8_t)b64[v >> 6 & 63] : '='; + p[3] = left > 2 ? (uint8_t)b64[v & 63] : '='; + } + *p++ = '\n'; + return plat_save(UNO_COPY_NAME, copy, (uint32_t)(p - copy)); +} + +static int b64v(uint8_t c) { + for (int i = 0; i < 64; i++) + if ((uint8_t)b64[i] == c) return i; + return -1; +} + +static bool copy_read(uno_file *f) { + uint32_t n, nl = sizeof UNO_SAVE_NAME - 1; + const uint8_t *c = plat_load(UNO_COPY_NAME, &n); + if (!c) return false; + for (uint32_t i = 0; i + nl + 3 <= n; i++) { + if (c[i] != '#' || c[i + 1] != '>' || memcmp(c + i + 2, UNO_SAVE_NAME, nl) || c[i + 2 + nl] != ':') continue; + const uint8_t *l = c + i + 3 + nl; + uint32_t m = 0; + while (l + m < c + n && l[m] != '\n' && l[m]) m++; + if (m != (sizeof *f + 2) / 3 * 4) return false; + uint8_t *bytes = (uint8_t *)f; + uint32_t o = 0; + for (uint32_t k = 0; k < m; k += 4) { + int v0 = b64v(l[k]), v1 = b64v(l[k + 1]), v2 = l[k + 2] == '=' ? 0 : b64v(l[k + 2]), + v3 = l[k + 3] == '=' ? 0 : b64v(l[k + 3]); + if (v0 < 0 || v1 < 0 || v2 < 0 || v3 < 0) return false; + uint32_t w = (uint32_t)(v0 << 18 | v1 << 12 | v2 << 6 | v3); + if (o < sizeof *f) bytes[o++] = (uint8_t)(w >> 16); + if (o < sizeof *f) bytes[o++] = (uint8_t)(w >> 8); + if (o < sizeof *f) bytes[o++] = (uint8_t)w; + } + return true; + } + return false; +} + +static uno_file file; /* (static: the stack stays small) */ + +bool save_load(uno_progress *p) { + uint32_t n; + const uint8_t *d = plat_load(UNO_SAVE_NAME, &n); + bool ok = false; + if (d && n == sizeof file) { + memcpy(&file, d, sizeof file); + ok = uno_file_ok(&file); + } + if (!ok && copy_read(&file) && uno_file_ok(&file)) { + ok = true; + plat_save(UNO_SAVE_NAME, &file, sizeof file); /* back where it belongs */ + } + if (!ok) { + uno_fresh(p); + return false; + } + *p = file.p; + return true; +} + +bool save_write(const uno_progress *p) { + memset(&file, 0, sizeof file); + file.magic = UNO_MAGIC, file.version = UNO_VERSION, file.size = sizeof file; + file.p = *p; + file.sum = uno_sum(&file, offsetof(uno_file, sum)); + bool ok = plat_save(UNO_SAVE_NAME, &file, sizeof file); + copy_write(&file); + return ok; +} diff --git a/games/uno/src/save.h b/games/uno/src/save.h index f18995bc..1d7cedf6 100644 --- a/games/uno/src/save.h +++ b/games/uno/src/save.h @@ -1,59 +1,34 @@ +/* What's kept (the new game screen's choices, whether how to play was read, the game going on), in uno.sav, + * and a copy of it in a Python script, uno_saves.py (installing apps from the NumWorks website keeps only + * scripts, so the save comes back from it). */ #ifndef UNO_SAVE_H #define UNO_SAVE_H -#include "uno.h" -#define UNO_SAVE_BYTES 768 -typedef struct { Uno game; UnoRules prefs; uint16_t played, wins; uint8_t active; } UnoSave; -static uint32_t save_crc(const uint8_t*p,unsigned n){ - uint32_t c=~0u;while(n--){c^=*p++;for(int j=0;j<8;j++)c=(c>>1)^(0xEDB88320u&-(c&1));}return ~c; -} -static void save_encode(const UnoSave*s,uint8_t*b){ - memset(b,0,UNO_SAVE_BYTES);uint8_t*p=b; - *p++='U';*p++='N';*p++='O';*p++=2;*p++=s->active; - *p++=s->prefs.players;*p++=s->prefs.difficulty;*p++=s->prefs.flags;p++; /* reserved */ -#define PUT16(v) do {unsigned t=(v);*p++=t;*p++=t>>8;}while(0) -#define PUT32(v) do {uint32_t t=(v);for(int k=0;k<4;k++)*p++=t>>(k*8);}while(0) - PUT16(s->played);PUT16(s->wins); - const Uno*g=&s->game; - *p++=g->rules.players;*p++=g->rules.difficulty;*p++=g->rules.flags;p++; - memcpy(p,g->hands,sizeof g->hands);p+=sizeof g->hands;memcpy(p,g->count,4);p+=4; - memcpy(p,g->deck,108);p+=108;memcpy(p,g->discard,108);p+=108; - *p++=g->dn;*p++=g->xn; - p+=8; /* Former v1 point totals: always zero in v2. */ - PUT16(g->round);p+=2;PUT16(g->turns);PUT32(g->rng); -#define WRITE(f) *p++=g->f - WRITE(dealer);WRITE(turn);WRITE(color);WRITE(phase);WRITE(pending);WRITE(penalty_kind);WRITE(offender); - WRITE(guilty);WRITE(old_color);WRITE(drawn);WRITE(candidate);WRITE(winner);WRITE(uno_player);WRITE(uno_armed); - WRITE(stalls);WRITE(event);WRITE(actor);WRITE(card);WRITE(amount);WRITE(direction); -#undef WRITE - p=b+UNO_SAVE_BYTES-4;PUT32(save_crc(b,UNO_SAVE_BYTES-4)); -#undef PUT16 -#undef PUT32 -} -static bool save_decode(UnoSave*s,const uint8_t*b,unsigned n){ - if(!b||n!=UNO_SAVE_BYTES||b[0]!='U'||b[1]!='N'||b[2]!='O'||(b[3]!=1&&b[3]!=2))return false; - unsigned at=UNO_SAVE_BYTES-4;uint32_t crc=0;for(int k=0;k<4;k++)crc|=(uint32_t)b[at+k]<<(k*8); - if(crc!=save_crc(b,at))return false; - UnoSave t={0};const uint8_t*p=b+4;t.active=*p++; - t.prefs.players=*p++;t.prefs.difficulty=*p++;t.prefs.flags=*p++;p++; - if(t.active>1||t.prefs.players<2||t.prefs.players>4||t.prefs.difficulty>2||t.prefs.flags>31)return false; -#define GET16(v) do{(v)=(uint16_t)(p[0]|p[1]<<8);p+=2;}while(0) -#define GET32(v) do{(v)=0;for(int k=0;k<4;k++)(v)|=(uint32_t)*p++<<(k*8);}while(0) - GET16(t.played);GET16(t.wins);Uno*g=&t.game; - g->rules.players=*p++;g->rules.difficulty=*p++;g->rules.flags=*p++;p++; - memcpy(g->hands,p,sizeof g->hands);p+=sizeof g->hands;memcpy(g->count,p,4);p+=4; - memcpy(g->deck,p,108);p+=108;memcpy(g->discard,p,108);p+=108;g->dn=*p++;g->xn=*p++; - p+=8;GET16(g->round);p+=2;GET16(g->turns);GET32(g->rng); -#define READ(f) g->f=*p++ - READ(dealer);READ(turn);READ(color);READ(phase);READ(pending);READ(penalty_kind);READ(offender); - READ(guilty);READ(old_color);READ(drawn);READ(candidate);READ(winner);READ(uno_player);READ(uno_armed); - READ(stalls);READ(event);READ(actor);READ(card);READ(amount);READ(direction); -#undef READ -#undef GET16 -#undef GET32 - /* A won v1 round now ends the game. In-progress cards and rules survive; - old point totals and target settings are intentionally discarded. */ - if(b[3]==1&&g->phase==U_ROUND&&g->winner!=UNO_NONE){g->phase=U_MATCH;g->event=E_MATCH;} - if(t.active&&!uno_valid(g))return false; - *s=t;return true; -} +#include "game.h" + +#define UNO_SAVE_NAME "uno.sav" +#define UNO_COPY_NAME "uno_saves.py" +#define UNO_MAGIC 0x314F4E55u /* "UNO1" */ +#define UNO_VERSION 1 + +typedef struct { + uno_rules setup; /* the new game screen's choices */ + uint8_t guide; /* how to play shown before the first game */ + uint8_t has_game; /* a game to go on with */ + uint8_t spare[2]; + uno_game g; +} uno_progress; + +typedef struct { + uint32_t magic; + uint16_t version, size; + uno_progress p; + uint32_t sum; /* FNV-1a of everything before it */ +} uno_file; +_Static_assert(sizeof(uno_file) == 728, "uno.sav: 728 bytes"); + +void uno_fresh(uno_progress *p); +uint32_t uno_sum(const void *data, uint32_t n); +bool uno_file_ok(const uno_file *f); +bool save_load(uno_progress *p); /* the save, its copy, or a fresh start; false: a fresh start */ +bool save_write(const uno_progress *p); #endif diff --git a/games/uno/src/uno.c b/games/uno/src/uno.c deleted file mode 100644 index 6d8849db..00000000 --- a/games/uno/src/uno.c +++ /dev/null @@ -1,216 +0,0 @@ -#include "uno.h" -#include -static uint32_t random32(Uno*g){uint32_t x=g->rng;x^=x<<13;x^=x>>17;x^=x<<5;return g->rng=x?x:1;} -static int next(const Uno*g,int p){return (p+g->rules.players+g->direction)%g->rules.players;} -static void event(Uno*g,int e,int p,int c,int n){g->event=e;g->actor=p;g->card=c;g->amount=n;} -static void shuffle(Uno*g){for(int i=g->dn-1;i>0;i--){int j=random32(g)%(i+1),c=g->deck[i];g->deck[i]=g->deck[j];g->deck[j]=c;}} -static bool take(Uno*g,int p){ - if(!g->dn&&g->xn>1){int c=g->discard[g->xn-1];g->dn=g->xn-1;memcpy(g->deck,g->discard,g->dn);g->discard[0]=c;g->xn=1;shuffle(g);} - if(!g->dn||g->count[p]>=UNO_CARDS)return false; - g->hands[p][g->count[p]++]=g->deck[--g->dn];return true; -} -static int take_n(Uno*g,int p,int n){int got=0;while(gotuno_player=UNO_NONE;g->uno_armed=UNO_NONE;g->turns++;} -static bool matching(const Uno*g,int c){int top=g->discard[g->xn-1];return c>=52||uno_color(c)==g->color||uno_value(c)==uno_value(top);} -static void finish(Uno*g,int w){ - g->winner=w;g->candidate=UNO_NONE;g->phase=U_MATCH; - event(g,E_MATCH,w,0,0); -} -static void check_out(Uno*g){if(g->candidate!=UNO_NONE&&!g->pending)finish(g,g->candidate);} -void uno_next_round(Uno*g){ - if(g->round)g->dealer=(g->dealer+1)%g->rules.players; - g->round++;g->direction=1;g->phase=U_TURN;g->dn=0;g->xn=0;g->pending=0;g->turns=0;g->stalls=0; - g->winner=g->candidate=g->uno_player=g->uno_armed=g->drawn=UNO_NONE; - memset(g->count,0,sizeof g->count); - for(int c=0;c<52;c++){g->deck[g->dn++]=c;if(c%13)g->deck[g->dn++]=c;} - for(int i=0;i<4;i++){g->deck[g->dn++]=UNO_WILD;g->deck[g->dn++]=UNO_DRAW4;} - shuffle(g); - for(int n=0;n<7;n++)for(int p=0;prules.players;p++)take(g,(g->dealer+1+p)%g->rules.players); - /* Opening +4 goes back in the deck; no random-retry loop. */ - int at=g->dn-1;while(at>=0&&g->deck[at]==UNO_DRAW4)at--; - bool rejected=at!=g->dn-1; - int c=g->deck[at];g->deck[at]=g->deck[g->dn-1];g->dn--;g->discard[g->xn++]=c; - if(rejected)shuffle(g); - g->color=uno_color(c);g->turn=next(g,g->dealer); - int v=uno_value(c); - if(v==UNO_REVERSE){g->direction=-1;g->turn=g->dealer;} - else if(v==UNO_SKIP)g->turn=next(g,g->turn); - else if(v==UNO_DRAW2){take_n(g,g->turn,2);g->turn=next(g,g->turn);} - else if(c==UNO_WILD)g->phase=U_COLOR; - event(g,E_START,g->turn,c,0);g->offender=UNO_NONE; -} -void uno_new(Uno*g,UnoRules r,uint32_t seed){ - memset(g,0,sizeof *g);g->rules=r;g->rules.players=r.players<2?2:r.players>4?4:r.players; - g->rules.difficulty=r.difficulty%3;g->rules.flags=r.flags&31;g->rng=seed?seed:1;g->direction=1; - /* Official dealer selection: each player draws, highest number (actions=0). - * Ties redraw only among tied players, from the same finite shuffled deck. */ - uint8_t pool[UNO_CARDS];int n=0; - for(int c=0;c<52;c++){pool[n++]=c;if(c%13)pool[n++]=c;} - for(int i=0;i<4;i++){pool[n++]=UNO_WILD;pool[n++]=UNO_DRAW4;} - for(int i=n-1;i>0;i--){int j=random32(g)%(i+1),c=pool[i];pool[i]=pool[j];pool[j]=c;} - unsigned eligible=(1u<rules.players)-1;int index=0; - while((eligible&(eligible-1))&&index+g->rules.players<=n){ - int best=-1;unsigned tied=0; - for(int p=0;prules.players;p++)if(eligible&(1u<9)v=0; - if(v>best){best=v;tied=1u<rules.players;p++)if(eligible&(1u<dealer=p;break;} - uno_next_round(g); -} -bool uno_can_play(const Uno*g,int i){ - if(i<0||i>=g->count[g->turn]||g->phase>=U_ROUND||g->phase==U_COLOR)return false; - if(g->phase==U_DRAWN&&i!=g->drawn)return false; - int c=g->hands[g->turn][i]; - if(g->pending){ - if(g->candidate!=UNO_NONE)return false; - return (g->penalty_kind==2&&(g->rules.flags&R_STACK2)&&uno_value(c)==UNO_DRAW2)|| - (g->penalty_kind==4&&(g->rules.flags&R_STACK4)&&c==UNO_DRAW4); - } - return g->phase!=U_CHALLENGE&&matching(g,c); -} -static void apply(Uno*g,int c){ - int p=g->turn,v=uno_value(c);g->phase=U_TURN; - if(v==UNO_DRAW2||c==UNO_DRAW4){ - int n=c==UNO_DRAW4?4:2;g->pending+=n;g->penalty_kind=n;g->offender=p;g->turn=next(g,p); - if(c==UNO_DRAW4&&!(g->rules.flags&R_STACK4))g->phase=U_CHALLENGE; - /* Last-card penalties cannot be stacked: the round has ended. +4 may - still be challenged before the penalty and win are settled. */ - else if(g->candidate!=UNO_NONE)uno_accept(g); - }else{ - if(v==UNO_REVERSE&&g->rules.players>2)g->direction=-g->direction; - g->turn=next(g,p); - if(v==UNO_SKIP||(v==UNO_REVERSE&&g->rules.players==2))g->turn=next(g,g->turn); - check_out(g); - } -} -bool uno_play(Uno*g,int i,bool announce){ - if(!uno_can_play(g,i))return false; - int p=g->turn,c=g->hands[p][i];bool armed=g->uno_armed==p; - /* A +4 may be bluffed; only a challenge consults this saved evidence. */ - g->old_color=g->color;g->guilty=0; - if(c==UNO_DRAW4)for(int j=0;jcount[p];j++)if(j!=i&&uno_color(g->hands[p][j])==g->color)g->guilty=1; - begin_action(g);g->stalls=0; - memmove(&g->hands[p][i],&g->hands[p][i+1],g->count[p]-i-1);g->count[p]--; - g->discard[g->xn++]=c;g->drawn=UNO_NONE; - if(g->count[p]==1){if(!(announce||armed||(g->rules.flags&R_AUTO_UNO)))g->uno_player=p;} - if(!g->count[p])g->candidate=p; - event(g,E_PLAY,p,c,0); - if(c>=52){g->phase=U_COLOR;g->offender=p;} - else{g->color=uno_color(c);apply(g,c);} - return true; -} -bool uno_choose_color(Uno*g,int color){ - if(g->phase!=U_COLOR||color<0||color>3)return false; - g->color=color; - if(g->offender==UNO_NONE){g->phase=U_TURN;event(g,E_COLOR,g->turn,0,color);} - else {int c=g->discard[g->xn-1];event(g,E_COLOR,g->turn,c,color);apply(g,c);} - return true; -} -bool uno_accept(Uno*g){ - if(!g->pending||g->phase==U_COLOR||g->phase>=U_ROUND)return false; - int p=g->turn,n=g->pending;begin_action(g);int got=take_n(g,p,n);g->pending=0;g->phase=U_TURN; - g->turn=next(g,p);event(g,E_PENALTY,p,0,got);check_out(g);return true; -} -bool uno_challenge(Uno*g){ - if(g->phase!=U_CHALLENGE)return false; - int p=g->turn,o=g->offender;begin_action(g);g->phase=U_TURN;g->pending=0; - if(g->guilty){int n=take_n(g,o,4);if(g->candidate==o)g->candidate=UNO_NONE;event(g,E_CHALLENGE_WON,p,0,n);} - else{int n=take_n(g,p,6);g->turn=next(g,p);event(g,E_CHALLENGE_LOST,p,0,n);} - check_out(g);return true; -} -bool uno_draw(Uno*g){ - if(g->phase!=U_TURN)return false; - if(g->pending)return uno_accept(g); - int p=g->turn;begin_action(g);int n=0; - do {if(!take(g,p))break;n++;g->drawn=g->count[p]-1;} - while((g->rules.flags&R_DRAW_UNTIL)&&!matching(g,g->hands[p][g->drawn])); - event(g,E_DRAW,p,0,n); - if(n&&matching(g,g->hands[p][g->drawn])){ - g->phase=U_DRAWN;g->stalls=0; - if((g->rules.flags&R_FORCE)&&g->hands[p][g->drawn]<52)uno_play(g,g->drawn,false); - /* Wild still needs the player's colour decision. */ - }else{ - g->turn=next(g,p);g->drawn=UNO_NONE; - if(!n)g->stalls++;else g->stalls=0; - if(g->stalls>=g->rules.players){g->phase=U_ROUND;g->winner=UNO_NONE;event(g,E_STALEMATE,p,0,0);} - } - return true; -} -bool uno_keep(Uno*g){ - if(g->phase!=U_DRAWN||(g->rules.flags&R_FORCE))return false; - int p=g->turn;g->drawn=UNO_NONE;g->phase=U_TURN;g->turn=next(g,p);event(g,E_PASS,p,0,0);return true; -} -bool uno_call(Uno*g,int p){ - if(g->phase>=U_ROUND||p<0||p>=g->rules.players)return false; - if(g->uno_player==p){g->uno_player=UNO_NONE;event(g,E_UNO,p,0,0);return true;} - if(g->count[p]==2&&p==g->turn&&(g->phase==U_TURN||g->phase==U_DRAWN)){g->uno_armed=p;event(g,E_UNO,p,0,0);return true;} - return false; -} -bool uno_catch(Uno*g,int p){ - int o=g->uno_player;if(o==UNO_NONE||p==o||p<0||p>=g->rules.players||g->phase>=U_ROUND)return false; - int got=take_n(g,o,2);g->uno_player=UNO_NONE;event(g,E_CAUGHT,o,0,got);return true; -} -int uno_bot_color(const Uno*g,int p){ - int counts[4]={0},best=0;for(int i=0;icount[p];i++){int c=g->hands[p][i];if(c<52)counts[c/13]++;} - for(int c=1;c<4;c++)if(counts[c]>counts[best])best=c;return best; -} -int uno_bot_card(const Uno*g){ - int best=-1,rank=-10000,p=g->turn,counts[4]={0}; - for(int i=0;icount[p];i++)if(g->hands[p][i]<52)counts[g->hands[p][i]/13]++; - for(int i=0;icount[p];i++)if(uno_can_play(g,i)){ - /* Card-selection priorities are private strategy, not a player score. */ - int c=g->hands[p][i],v=uno_value(c),r=c>=52?5:v>=10?20:v; - if(c<52)r+=counts[c/13]*(g->rules.difficulty==2?7:3); - else if(c==UNO_DRAW4&&counts[g->color])r-=150; - if(g->rules.difficulty==2&&g->count[next(g,p)]<=2&&(v>=10&&v<=12))r+=55; - if(g->rules.difficulty==2&&v==UNO_REVERSE&&g->rules.players>2&&g->count[(p+g->rules.players-g->direction)%g->rules.players]<=2)r-=45; - if(g->rules.difficulty==0)r=(int)((g->rng^(unsigned)c*2654435761u)%(r< -100?10:100)); - if(r>rank){rank=r;best=i;} - }return best; -} -void uno_bot(Uno*g){ - if(g->phase>=U_ROUND)return; - int p=g->turn; - if(g->phase==U_COLOR){uno_choose_color(g,uno_bot_color(g,p));return;} - if(g->phase==U_CHALLENGE){ - /* Decision uses RNG, difficulty and public hand sizes, never guilty or - any other player's hidden cards. The engine reveals evidence after. */ - unsigned chance=g->rules.difficulty==0?20:g->rules.difficulty==1?12:8; - if(random32(g)%100=0){ - if(g->phase==U_DRAWN&&!(g->rules.flags&R_FORCE)&&g->rules.difficulty==0&&random32(g)%12==0){uno_keep(g);return;} - bool call=random32(g)%100<(g->rules.difficulty==0?85:97); - uno_play(g,i,call); - }else if(g->phase==U_DRAWN)uno_keep(g); - else uno_draw(g); -} -bool uno_valid(const Uno*g){ - if(g->rules.players<2||g->rules.players>4||g->rules.difficulty>2||g->rules.flags>31||!g->rng|| - g->turn>=g->rules.players||g->dealer>=g->rules.players||g->phase>U_MATCH||!g->xn||g->xn>108||g->dn>108|| - (g->direction!=1&&g->direction!=-1)||g->color>4||g->pending>104||g->event>E_STALEMATE)return false; - if(g->color==4&&!(g->phase==U_COLOR&&g->offender==UNO_NONE))return false; - const uint8_t ids[]={g->offender,g->candidate,g->winner,g->uno_player,g->uno_armed}; - for(unsigned i=0;i=g->rules.players)return false; - if(g->phase==U_DRAWN&&(g->drawn>=g->count[g->turn]||g->pending))return false; - if(g->phase==U_CHALLENGE&&(!g->pending||g->penalty_kind!=4||g->offender==UNO_NONE))return false; - if(g->pending&&g->penalty_kind!=2&&g->penalty_kind!=4)return false; - if(g->phase==U_COLOR&&g->discard[g->xn-1]<52)return false; - if(g->uno_player!=UNO_NONE&&g->count[g->uno_player]!=1)return false; - if(g->candidate!=UNO_NONE&&g->count[g->candidate])return false; - if(g->phase==U_MATCH&&(g->winner==UNO_NONE||g->count[g->winner]))return false; - if(g->phase==U_ROUND&&g->winner!=UNO_NONE)return false; - uint8_t hist[54]={0};int total=g->dn+g->xn; - for(int p=0;p<4;p++){ - if(g->count[p]>108||(p>=g->rules.players&&g->count[p]))return false; - total+=g->count[p];for(int i=0;icount[p];i++){int c=g->hands[p][i];if(c>53)return false;hist[c]++;} - } - if(total!=108)return false; - for(int i=0;idn;i++){if(g->deck[i]>53)return false;hist[g->deck[i]]++;} - for(int i=0;ixn;i++){if(g->discard[i]>53)return false;hist[g->discard[i]]++;} - for(int c=0;c<54;c++)if(hist[c]!=(c>=52?4:c%13?2:1))return false; - return true; -} diff --git a/games/uno/src/uno.h b/games/uno/src/uno.h deleted file mode 100644 index 258db660..00000000 --- a/games/uno/src/uno.h +++ /dev/null @@ -1,42 +0,0 @@ -/* Classic 108-card UNO. The rules engine has no graphics, clock or heap. */ -#ifndef UNO_H -#define UNO_H -#include -#include -#define UNO_CARDS 108 -#define UNO_NONE 255 -enum { UNO_SKIP=10, UNO_REVERSE=11, UNO_DRAW2=12, UNO_WILD=52, UNO_DRAW4=53 }; -enum { U_TURN, U_COLOR, U_CHALLENGE, U_DRAWN, U_ROUND, U_MATCH }; -enum { R_STACK2=1, R_STACK4=2, R_DRAW_UNTIL=4, R_FORCE=8, R_AUTO_UNO=16 }; -enum { E_START, E_PLAY, E_DRAW, E_PASS, E_COLOR, E_PENALTY, E_CHALLENGE_WON, - E_CHALLENGE_LOST, E_UNO, E_CAUGHT, E_ROUND, E_MATCH, E_STALEMATE }; -typedef struct { uint8_t players, difficulty, flags; } UnoRules; -typedef struct { - UnoRules rules; - uint8_t hands[4][UNO_CARDS], count[4]; - uint8_t deck[UNO_CARDS], discard[UNO_CARDS], dn, xn; - uint16_t round, turns; - uint32_t rng; - uint8_t dealer, turn, color, phase, pending, penalty_kind, offender; - uint8_t guilty, old_color, drawn, candidate, winner, uno_player, uno_armed; - uint8_t stalls, event, actor, card, amount; - int8_t direction; -} Uno; -static inline int uno_color(int c) { return c<52?c/13:4; } -static inline int uno_value(int c) { return c<52?c%13:c; } -void uno_new(Uno*, UnoRules, uint32_t); -void uno_next_round(Uno*); -bool uno_can_play(const Uno*,int); -bool uno_play(Uno*,int,bool); -bool uno_choose_color(Uno*,int); -bool uno_draw(Uno*); -bool uno_keep(Uno*); -bool uno_accept(Uno*); -bool uno_challenge(Uno*); -bool uno_call(Uno*,int); -bool uno_catch(Uno*,int); -int uno_bot_card(const Uno*); -int uno_bot_color(const Uno*,int); -void uno_bot(Uno*); -bool uno_valid(const Uno*); -#endif diff --git a/games/uno/tests/eadk.h b/games/uno/tests/eadk.h deleted file mode 100644 index d24a9127..00000000 --- a/games/uno/tests/eadk.h +++ /dev/null @@ -1,12 +0,0 @@ -#ifndef UNO_HOST_EADK -#define UNO_HOST_EADK -#include -enum { eadk_key_left=0,eadk_key_up=1,eadk_key_down=2,eadk_key_right=3,eadk_key_ok=4, - eadk_key_back=5,eadk_key_home=6,eadk_key_on_off=8,eadk_key_one=42,eadk_key_two=43, - eadk_key_zero=48,eadk_key_exe=52 }; -uint64_t eadk_timing_millis(void); -uint32_t eadk_random(void); -uint64_t eadk_keyboard_scan(void); -void eadk_display_wait_for_vblank(void); -void eadk_timing_msleep(uint32_t); -#endif diff --git a/games/uno/tests/legacy-save.bin b/games/uno/tests/legacy-save.bin deleted file mode 100644 index 82ebf21b04943c6bae1fd034b9d6b63aa9e2b7dc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 768 zcmchS$q|A;5JkILgh5;Y!G%o_RFq9*lJKA>&t_l*CSWF38HZ`Pn}C;jm*3TWc)$1C z9io818z8|uQ%m71KLi%IrRh*XWubx$5|Jx(Ca&1FbK+@CT+)k<>{aWII5bwpWI4)e zXF+?DX-#p=FPnK^aAyIhOdAn37hOFa4m7nrZc6dGFZaS=?w2?)>Uz~}NKw*m%`FmY zy6Ss{P!W#ux#%c%Vp=woX`H!)$yZ;=4h{6+06O4jaXVcv-|+$Pcmsgscl^KC=6*gt E0R@U1rvLx| diff --git a/games/uno/tests/play.c b/games/uno/tests/play.c new file mode 100644 index 00000000..554d2932 --- /dev/null +++ b/games/uno/tests/play.c @@ -0,0 +1,937 @@ +/* UNO on a computer, for tests and pictures (make host, make test). + * + * play test DIR the rules against Mattel's instruction sheet (every card, two players, the challenge, UNO and + * its penalty, going out, scoring to 500, the house rules), the bots playing whole games to 500 + * at every level (and the same game twice, to the same hash on every computer), a few hundred + * sessions of the whole app with random keys, saves written and read back, damaged saves + * play shots DIR pictures of the screens (DIR/.ppm) + * play film DIR MS SEED MS milliseconds of a game, a bot playing your cards too (DIR/_.raw, for + * tools/record.py --frames) + */ +#define main uno_app_main +#include "../src/main.c" +#undef main +#include +#include +#include + +/* ---------------------------------------------------------------- the calculator, on a computer */ +static uint16_t fb[240][320]; +static void (*on_frame)(void); +void plat_push(int x, int y, int w, int h, const uint16_t *px) { + for (int j = 0; j < h; j++) + for (int i = 0; i < w; i++) fb[y + j][x + i] = px[j * w + i]; + if (on_frame && y + h == 240) on_frame(); +} +void *np_alloc(uint32_t n) { (void)n; return 0; } +static double clock_ms; +static uint32_t (*script)(uint32_t frame); +static uint32_t frame_no, quit_at; +static void (*watch)(void); +uint32_t plat_keys(void) { + clock_ms += 10; + frame_no++; + if (watch) watch(); + if (frame_no >= quit_at) return K_HOME; + return script ? script(frame_no) : 0; +} +uint32_t plat_millis(void) { return (uint32_t)clock_ms; } +void plat_sleep(uint32_t ms) { clock_ms += ms; } +uint32_t plat_random(void) { return 0x9E3779B9u ^ frame_no; } +void plat_begin(void) {} +int plat_end(void) { return 0; } + +static struct { char name[32]; uint8_t data[4096]; uint32_t len; bool on; } files[4]; +static bool storage_full; +bool plat_save(const char *name, const void *data, uint32_t len) { + if (storage_full) return false; + int k = -1; + for (int i = 0; i < 4; i++) + if (files[i].on && !strcmp(files[i].name, name)) k = i; + for (int i = 0; i < 4 && k < 0; i++) + if (!files[i].on) k = i; + if (k < 0 || len > sizeof files[k].data) return false; + strcpy(files[k].name, name), memcpy(files[k].data, data, len), files[k].len = len, files[k].on = true; + return true; +} +const uint8_t *plat_load(const char *name, uint32_t *len) { + for (int i = 0; i < 4; i++) + if (files[i].on && !strcmp(files[i].name, name)) return *len = files[i].len, files[i].data; + return 0; +} +static void forget(const char *name) { + for (int i = 0; i < 4; i++) + if (files[i].on && !strcmp(files[i].name, name)) files[i].on = false; +} +static uint8_t *file_data(const char *name, uint32_t *len) { + for (int i = 0; i < 4; i++) + if (files[i].on && !strcmp(files[i].name, name)) return *len = files[i].len, files[i].data; + return 0; +} + +static void shot(const char *dir, const char *name) { + char path[512]; + snprintf(path, sizeof path, "%s/%s.ppm", dir, name); + FILE *f = fopen(path, "wb"); + if (!f) exit(2); + fprintf(f, "P6 320 240 255\n"); + for (int y = 0; y < 240; y++) + for (int x = 0; x < 320; x++) { + uint16_t c = fb[y][x]; + fputc((c >> 11) * 255 / 31, f), fputc((c >> 5 & 63) * 255 / 63, f), fputc((c & 31) * 255 / 31, f); + } + fclose(f); +} + +static int fails; +#define CHECK(c, ...) do { if (!(c)) { fails++; printf("FAIL %s:%d: ", __FILE__, __LINE__); printf(__VA_ARGS__); printf("\n"); } } while (0) + +/* ---------------------------------------------------------------- tables made to order */ +#define R(c, v) ((c) * 13 + (v)) +static uno_game T; + +/* n players, the house rules, every card in the draw pile (in order, its top the last), nothing dealt; then + top(card) turns a card, give(p, card) hands one over */ +static void blank(uno_game *g, int n, int house) { + uno_new_game(g, (uno_rules){(uint8_t)n, LEVEL_NORMAL, 0, (uint8_t)house}, 7); + uno_fill_deck(g->deck); + g->dn = UNO_DECK, g->pn = 0; + memset(g->count, 0, sizeof g->count); + memset(g->hand, 0, sizeof g->hand); + g->turn = 0, g->dealer = (uint8_t)(n - 1), g->dir = 1, g->phase = P_PLAY, g->pending = 0, g->opening = 0; + g->out = g->uno_open = g->uno_said = g->winner = g->offender = g->drawn = UNO_NONE; +} +static void pull(uno_game *g, int card) { + for (int i = g->dn - 1; i >= 0; i--) + if (g->deck[i] == card) { + memmove(&g->deck[i], &g->deck[i + 1], (size_t)(g->dn - i - 1)); + g->dn--; + return; + } + printf("no %d left in the deck\n", card); + exit(1); +} +static void top(uno_game *g, int card) { + pull(g, card); + g->pile[g->pn++] = (uint8_t)card; + g->color = (uint8_t)uno_color(card); +} +static void give(uno_game *g, int p, int card) { + pull(g, card); + g->hand[p][g->count[p]++] = (uint8_t)card; +} +/* the draw pile's next card */ +static void next_draw(uno_game *g, int card) { + pull(g, card); + g->deck[g->dn++] = (uint8_t)card; +} +static int find(const uno_game *g, int p, int card) { + for (int i = 0; i < g->count[p]; i++) + if (g->hand[p][i] == card) return i; + return -1; +} + +/* ---------------------------------------------------------------- the rules */ +static void deck_and_points(void) { + uint8_t d[UNO_DECK]; + uno_fill_deck(d); + int per[5] = {0}, zero = 0, skip = 0, rev = 0, d2 = 0, wild = 0, w4 = 0; + for (int i = 0; i < UNO_DECK; i++) { + int c = d[i], v = uno_value(c); + per[uno_color(c)]++; + zero += c < 52 && v == 0, skip += c < 52 && v == V_SKIP, rev += c < 52 && v == V_REVERSE, d2 += c < 52 && v == V_DRAW2; + wild += c == C_WILD, w4 += c == C_WILD4; + } + CHECK(per[0] == 25 && per[1] == 25 && per[2] == 25 && per[3] == 25 && per[4] == 8, "25 cards a colour, 8 Wilds"); + CHECK(zero == 4 && skip == 8 && rev == 8 && d2 == 8 && wild == 4 && w4 == 4, "the action cards"); + int numbers = 0; + for (int i = 0; i < UNO_DECK; i++) numbers += d[i] < 52 && uno_value(d[i]) < 10; + CHECK(numbers == 76, "19 number cards a colour"); + CHECK(uno_points(R(RED, 0)) == 0 && uno_points(R(BLUE, 7)) == 7 && uno_points(R(GREEN, 9)) == 9, "numbers: face value"); + CHECK(uno_points(R(RED, V_SKIP)) == 20 && uno_points(R(RED, V_REVERSE)) == 20 && uno_points(R(RED, V_DRAW2)) == 20, + "Skip, Reverse, Draw Two: 20"); + CHECK(uno_points(C_WILD) == 50 && uno_points(C_WILD4) == 50, "Wilds: 50"); +} + +static void dealing(void) { + /* a new game: a dealer, seven cards each, a first card that isn't a Wild Draw Four */ + int dealers[4] = {0}; + for (uint32_t s = 1; s <= 400; s++) { + uno_new_game(&T, (uno_rules){4, LEVEL_NORMAL, 0, 0}, s); + CHECK(uno_valid(&T), "a valid deal (seed %u)", s); + CHECK(T.pn == 1 && T.pile[0] != C_WILD4, "no Wild Draw Four first (seed %u)", s); + int dealt = 0; + for (int p = 0; p < 4; p++) dealt += T.count[p]; + CHECK(dealt >= 28 && dealt <= 30 && T.dn == UNO_DECK - dealt - 1, "seven cards each (seed %u)", s); + dealers[T.dealer]++; + } + CHECK(dealers[0] > 60 && dealers[1] > 60 && dealers[2] > 60 && dealers[3] > 60, "anyone can deal: %d %d %d %d", + dealers[0], dealers[1], dealers[2], dealers[3]); + /* the first card: on a deck laid out so that it comes up after the deal */ + struct { int card, n, turn, dir, phase, victim_cards; } first[] = { + {R(RED, 5), 4, 0, 1, P_PLAY, 7}, /* the dealer (3)'s left (0) starts */ + {R(RED, V_SKIP), 4, 1, 1, P_PLAY, 7}, /* the dealer's left is skipped */ + {R(RED, V_REVERSE), 4, 3, -1, P_PLAY, 7}, /* the dealer starts, to the right */ + {R(RED, V_REVERSE), 2, 1, 1, P_PLAY, 7}, /* two players: the dealer starts */ + {R(RED, V_DRAW2), 4, 1, 1, P_PLAY, 9}, /* the dealer's left draws 2 and is skipped */ + {C_WILD, 4, 0, 1, P_COLOR, 7}, /* the dealer's left calls the colour, then plays */ + }; + for (unsigned k = 0; k < sizeof first / sizeof first[0]; k++) { + int n = first[k].n; + blank(&T, n, 0); + T.dealer = (uint8_t)(n - 1); + pull(&T, first[k].card); + memmove(&T.deck[UNO_DECK - 7 * n], &T.deck[UNO_DECK - 7 * n - 1], (size_t)(7 * n)); + T.deck[UNO_DECK - 7 * n - 1] = (uint8_t)first[k].card; + T.dn = UNO_DECK; + uno_deal(&T); + CHECK(T.pile[0] == first[k].card && T.turn == first[k].turn && T.dir == first[k].dir && T.phase == first[k].phase, + "first card %d: turn %d dir %d phase %d", first[k].card, T.turn, T.dir, T.phase); + CHECK(T.count[0] == first[k].victim_cards, "first card %d: the dealer's left has %d cards", first[k].card, T.count[0]); + CHECK(uno_valid(&T), "first card %d: valid", first[k].card); + } + /* a Wild first: the first player calls the colour, then plays */ + CHECK(uno_choose(&T, BLUE) && T.phase == P_PLAY && T.turn == 0 && T.color == BLUE, "the first Wild's colour"); + /* a Wild Draw Four turned first goes back in the deck and another is turned */ + blank(&T, 3, 0); + T.dealer = 2; + pull(&T, C_WILD4); + memmove(&T.deck[UNO_DECK - 21], &T.deck[UNO_DECK - 22], 21); + T.deck[UNO_DECK - 22] = C_WILD4; + T.dn = UNO_DECK; + uno_deal(&T); + CHECK(T.pile[0] != C_WILD4 && T.pn == 1 && uno_valid(&T), "a first Wild Draw Four is turned back"); + /* the deal goes to the left */ + uno_new_game(&T, (uno_rules){3, LEVEL_NORMAL, 0, 0}, 99); + int d0 = T.dealer; + uno_next_hand(&T); + CHECK(T.dealer == (d0 + 1) % 3 && T.hands == 2, "the deal passes to the left"); +} + +static void action_cards(void) { + /* matching */ + blank(&T, 3, 0); + top(&T, R(RED, 5)); + give(&T, 0, R(RED, 2)), give(&T, 0, R(BLUE, 5)), give(&T, 0, R(BLUE, 7)), give(&T, 0, C_WILD), give(&T, 0, C_WILD4); + CHECK(uno_can_play(&T, 0) && uno_can_play(&T, 1) && !uno_can_play(&T, 2) && uno_can_play(&T, 3) && uno_can_play(&T, 4), + "colour, number, Wilds"); + CHECK(!uno_play(&T, 2, false) && T.count[0] == 5, "a card that doesn't go"); + /* a number: the next player */ + CHECK(uno_play(&T, 0, false) && T.turn == 1 && T.color == RED && T.pile[T.pn - 1] == R(RED, 2), "a number"); + /* symbols match symbols */ + blank(&T, 3, 0); + top(&T, R(RED, V_SKIP)); + give(&T, 0, R(GREEN, V_SKIP)), give(&T, 0, R(GREEN, 1)); + CHECK(uno_can_play(&T, 0) && !uno_can_play(&T, 1), "a Skip on a Skip"); + /* Skip */ + CHECK(uno_play(&T, 0, false) && T.turn == 2 && T.color == GREEN, "Skip: player 1 misses a turn"); + /* Reverse, three and four players */ + for (int n = 3; n <= 4; n++) { + blank(&T, n, 0); + top(&T, R(RED, 1)); + give(&T, 0, R(RED, V_REVERSE)), give(&T, 0, R(RED, 3)); + CHECK(uno_play(&T, 0, false) && T.dir == -1 && T.turn == n - 1, "Reverse (%d players): to the right", n); + } + /* Draw Two */ + blank(&T, 3, 0); + top(&T, R(BLUE, 1)); + give(&T, 0, R(BLUE, V_DRAW2)), give(&T, 0, R(RED, 3)); + CHECK(uno_play(&T, 0, false) && T.count[1] == 2 && T.turn == 2 && T.phase == P_PLAY, "Draw Two: 2 cards, skipped"); + CHECK(T.ev_victim == 1 && T.ev_n == 2, "Draw Two: the message"); + /* Wild */ + blank(&T, 3, 0); + top(&T, R(BLUE, 1)); + give(&T, 0, C_WILD), give(&T, 0, R(RED, 3)); + CHECK(uno_play(&T, 0, false) && T.phase == P_COLOR && T.turn == 0 && T.color == NO_COLOR, "Wild: call a colour"); + CHECK(uno_valid(&T), "valid while calling"); + CHECK(!uno_choose(&T, 4) && uno_choose(&T, GREEN) && T.color == GREEN && T.turn == 1 && T.phase == P_PLAY, "Wild: green"); + /* Wild Draw Four, taken */ + blank(&T, 3, 0); + top(&T, R(BLUE, 1)); + give(&T, 0, C_WILD4), give(&T, 0, R(RED, 3)); + CHECK(uno_play(&T, 0, false) && T.phase == P_COLOR && uno_choose(&T, RED), "Wild Draw Four: a colour"); + CHECK(T.phase == P_PENALTY && T.turn == 1 && T.pending == 4 && T.challengeable && !T.guilty, "next player: 4 waiting"); + CHECK(uno_valid(&T), "valid with a penalty waiting"); + CHECK(!uno_draw(&T) && uno_take(&T) && T.count[1] == 4 && T.turn == 2 && T.color == RED, "taken: 4 cards, skipped"); +} + +static void challenge(void) { + /* guilty: it had a card of the colour in play */ + blank(&T, 3, 0); + top(&T, R(RED, 5)); + give(&T, 0, C_WILD4), give(&T, 0, R(RED, 8)), give(&T, 0, R(BLUE, 2)); + give(&T, 1, R(GREEN, 1)); + CHECK(!uno_legal_wild4(&T, 0), "a red card: not allowed"); + CHECK(uno_play(&T, 0, false) && uno_choose(&T, BLUE) && T.guilty && T.prev_color == RED, "a bluff"); + CHECK(uno_challenge(&T) && T.count[0] == 6 && T.count[1] == 1 && T.turn == 1 && T.phase == P_PLAY, + "challenge won: the bluffer draws 4, the challenger plays"); + CHECK(T.color == BLUE && T.ev == E_CHALLENGE_WON, "the colour called stays"); + /* not guilty: other numbers and symbols, and Wilds, don't count */ + blank(&T, 3, 0); + top(&T, R(RED, 5)); + give(&T, 0, C_WILD4), give(&T, 0, R(BLUE, 5)), give(&T, 0, C_WILD), give(&T, 0, R(GREEN, V_SKIP)); + give(&T, 1, R(GREEN, 1)); + CHECK(uno_legal_wild4(&T, 0), "no red card: allowed"); + CHECK(uno_play(&T, 0, false) && uno_choose(&T, BLUE) && !T.guilty, "honest"); + CHECK(uno_challenge(&T) && T.count[1] == 7 && T.turn == 2 && T.count[0] == 3, "challenge lost: 6 cards, skipped"); + /* only a waiting Wild Draw Four can be challenged */ + blank(&T, 3, 0); + top(&T, R(RED, 5)); + give(&T, 0, R(RED, V_DRAW2)), give(&T, 0, R(RED, 1)); + uno_play(&T, 0, false); + CHECK(!uno_challenge(&T), "no challenge on a Draw Two"); + /* two players: after a Wild Draw Four taken, the same player again */ + blank(&T, 2, 0); + top(&T, R(RED, 5)); + give(&T, 0, C_WILD4), give(&T, 0, R(BLUE, 1)); + uno_play(&T, 0, false), uno_choose(&T, BLUE); + CHECK(uno_take(&T) && T.turn == 0 && T.count[1] == 4, "two players: +4 taken, the same player plays"); +} + +static void two_players(void) { + blank(&T, 2, 0); + top(&T, R(RED, 5)); + give(&T, 0, R(RED, V_REVERSE)), give(&T, 0, R(RED, V_SKIP)), give(&T, 0, R(RED, V_DRAW2)), give(&T, 0, R(RED, 1)); + CHECK(uno_play(&T, 0, false) && T.turn == 0 && T.dir == 1, "Reverse is a Skip: play again"); + CHECK(uno_play(&T, 0, false) && T.turn == 0, "Skip: play again"); + CHECK(uno_play(&T, 0, false) && T.turn == 0 && T.count[1] == 2, "Draw Two: 2 cards, play again"); +} + +static void drawing(void) { + /* a card that goes: it may be played, and only it */ + blank(&T, 3, 0); + top(&T, R(RED, 5)); + give(&T, 0, R(BLUE, 1)), give(&T, 0, R(RED, 2)); + next_draw(&T, R(RED, 9)); + CHECK(uno_draw(&T) && T.phase == P_DRAWN && T.count[0] == 3 && T.drawn == 2 && T.turn == 0, "drew a card that goes"); + CHECK(!uno_can_play(&T, 1) && uno_can_play(&T, 2), "only the card drawn"); + CHECK(uno_play(&T, 2, false) && T.turn == 1 && T.pile[T.pn - 1] == R(RED, 9), "played at once"); + /* or kept */ + blank(&T, 3, 0); + top(&T, R(RED, 5)); + give(&T, 0, R(BLUE, 1)); + next_draw(&T, R(RED, 9)); + CHECK(uno_draw(&T) && uno_keep(&T) && T.turn == 1 && T.count[0] == 2, "kept"); + /* one that doesn't go: the turn passes */ + blank(&T, 3, 0); + top(&T, R(RED, 5)); + give(&T, 0, R(BLUE, 1)); + next_draw(&T, R(GREEN, 9)); + CHECK(uno_draw(&T) && T.turn == 1 && T.phase == P_PLAY && T.lacks[0] == 1 << RED, "no luck: next player"); + /* allowed with a card that goes */ + blank(&T, 3, 0); + top(&T, R(RED, 5)); + give(&T, 0, R(RED, 1)); + CHECK(uno_draw(&T), "drawing instead of playing"); + /* the draw pile runs out: the discards but the top one are shuffled into it */ + blank(&T, 3, 0); + top(&T, R(RED, 5)); + give(&T, 0, R(BLUE, 1)); + while (T.dn > 1) T.pile[T.pn++] = T.deck[--T.dn]; + int last = T.deck[0], topc = T.pile[T.pn - 1], before = T.pn; + T.color = (uint8_t)(uno_color(topc) < 4 ? uno_color(topc) : RED); + T.dn = 0, T.pile[T.pn++] = (uint8_t)last; + T.color = (uint8_t)(uno_color(last) < 4 ? uno_color(last) : RED); + CHECK(uno_valid(&T), "an empty draw pile: valid"); + uno_draw(&T); + CHECK(T.pn == 1 && T.pile[0] == last && T.dn == before - 1 && uno_valid(&T), "a new draw pile, the top card stays"); +} + +static void uno_calls(void) { + /* forgot: caught, 2 cards */ + blank(&T, 3, 0); + top(&T, R(RED, 5)); + give(&T, 0, R(RED, 1)), give(&T, 0, R(BLUE, 2)); + CHECK(uno_play(&T, 0, false) && T.uno_open == 0, "one card left, no UNO"); + CHECK(!uno_catch(&T, 0), "you can't catch yourself"); + CHECK(uno_catch(&T, 2) && T.count[0] == 3 && T.uno_open == UNO_NONE && T.ev == E_CAUGHT, "caught: 2 cards"); + /* said in time, after the card: safe */ + blank(&T, 3, 0); + top(&T, R(RED, 5)); + give(&T, 0, R(RED, 1)), give(&T, 0, R(BLUE, 2)); + uno_play(&T, 0, false); + CHECK(uno_call(&T, 0) && T.uno_open == UNO_NONE && !uno_catch(&T, 1), "said before anyone caught it"); + /* said with the next-to-last card */ + blank(&T, 3, 0); + top(&T, R(RED, 5)); + give(&T, 0, R(RED, 1)), give(&T, 0, R(BLUE, 2)); + CHECK(uno_call(&T, 0) && uno_play(&T, 0, false) && T.uno_open == UNO_NONE, "said first"); + blank(&T, 3, 0); + top(&T, R(RED, 5)); + give(&T, 0, R(RED, 1)), give(&T, 0, R(BLUE, 2)); + CHECK(uno_play(&T, 0, true) && T.uno_open == UNO_NONE && T.ev_by == 0, "said with the card"); + /* too late once the next player has started */ + blank(&T, 3, 0); + top(&T, R(RED, 5)); + give(&T, 0, R(RED, 1)), give(&T, 0, R(BLUE, 2)); + give(&T, 1, R(RED, 3)), give(&T, 1, R(RED, 4)); + uno_play(&T, 0, false); + CHECK(uno_play(&T, 0, true) && !uno_catch(&T, 2) && T.count[0] == 1, "too late after the next card"); + blank(&T, 3, 0); + top(&T, R(RED, 5)); + give(&T, 0, R(RED, 1)), give(&T, 0, R(BLUE, 2)); + uno_play(&T, 0, false); + CHECK(uno_draw(&T) && !uno_catch(&T, 2), "too late after the next player draws"); + /* not with more cards */ + blank(&T, 3, 0); + top(&T, R(RED, 5)); + give(&T, 0, R(RED, 1)), give(&T, 0, R(BLUE, 2)), give(&T, 0, R(BLUE, 3)); + CHECK(!uno_call(&T, 0), "UNO with three cards"); + /* the window stays open while a Wild's colour is called */ + blank(&T, 3, 0); + top(&T, R(RED, 5)); + give(&T, 0, C_WILD), give(&T, 0, R(BLUE, 2)); + uno_play(&T, 0, false); + CHECK(T.uno_open == 0 && uno_choose(&T, BLUE) && T.uno_open == 0 && uno_catch(&T, 1) && T.count[0] == 3, + "caught after the colour"); + /* house rule: UNO said for everyone */ + blank(&T, 3, H_AUTO_UNO); + top(&T, R(RED, 5)); + give(&T, 0, R(RED, 1)), give(&T, 0, R(BLUE, 2)); + CHECK(uno_play(&T, 0, false) && T.uno_open == UNO_NONE, "automatic UNO"); +} + +static void going_out(void) { + /* a number: the hand is over, the others' cards scored */ + blank(&T, 3, 0); + top(&T, R(RED, 5)); + give(&T, 0, R(RED, 1)); + give(&T, 1, R(BLUE, 7)), give(&T, 1, C_WILD), give(&T, 2, R(GREEN, V_SKIP)), give(&T, 2, R(GREEN, 3)); + CHECK(uno_play(&T, 0, false) && T.phase == P_HAND_OVER && T.winner == 0 && T.gained == 7 + 50 + 20 + 3 && + T.score[0] == 80, "out: 80 points"); + CHECK(uno_valid(&T), "valid after the hand"); + /* a Draw Two last: the next player draws and it counts */ + blank(&T, 3, 0); + top(&T, R(RED, 5)); + give(&T, 0, R(RED, V_DRAW2)); + give(&T, 1, R(BLUE, 7)), give(&T, 2, R(GREEN, 3)); + next_draw(&T, R(YELLOW, 9)), next_draw(&T, R(YELLOW, 8)); + CHECK(uno_play(&T, 0, false) && T.phase == P_HAND_OVER && T.count[1] == 3 && T.gained == 7 + 8 + 9 + 3, + "a last Draw Two counts: %d", T.gained); + /* a Wild last: no colour to call */ + blank(&T, 3, 0); + top(&T, R(RED, 5)); + give(&T, 0, C_WILD), give(&T, 1, R(BLUE, 7)), give(&T, 2, R(GREEN, 3)); + CHECK(uno_play(&T, 0, false) && T.phase == P_HAND_OVER && T.gained == 10, "out on a Wild"); + /* a Wild Draw Four last, taken: counts */ + blank(&T, 3, 0); + top(&T, R(RED, 5)); + give(&T, 0, C_WILD4), give(&T, 1, R(BLUE, 7)), give(&T, 2, R(GREEN, 3)); + next_draw(&T, R(YELLOW, 1)), next_draw(&T, R(YELLOW, 2)), next_draw(&T, R(YELLOW, 3)), next_draw(&T, R(YELLOW, 4)); + CHECK(uno_play(&T, 0, false) && T.phase == P_COLOR && uno_choose(&T, GREEN) && T.phase == P_PENALTY, "a last +4"); + CHECK(uno_valid(&T), "valid with the last +4 waiting"); + CHECK(uno_take(&T) && T.phase == P_HAND_OVER && T.gained == 7 + 10 + 3, "a last +4 taken counts: %d", T.gained); + /* a Wild Draw Four last is always allowed: challenged, the challenger draws 6 and it counts */ + blank(&T, 3, 0); + top(&T, R(RED, 5)); + give(&T, 0, C_WILD4), give(&T, 1, R(BLUE, 7)), give(&T, 2, R(GREEN, 3)); + uno_play(&T, 0, false), uno_choose(&T, GREEN); + CHECK(!T.guilty && uno_challenge(&T) && T.phase == P_HAND_OVER && T.count[1] == 7, "a last +4 challenged: 6 cards"); + /* to 500 */ + blank(&T, 2, 0); + top(&T, R(RED, 5)); + give(&T, 0, R(RED, 1)), give(&T, 1, C_WILD); + T.score[0] = 460, T.score[1] = 499; + CHECK(uno_play(&T, 0, false) && T.phase == P_GAME_OVER && T.winner == 0 && T.score[0] == 510, "500: the game is won"); + blank(&T, 2, 0); + top(&T, R(RED, 5)); + give(&T, 0, R(RED, 1)), give(&T, 1, R(BLUE, 2)); + T.score[0] = 400; + CHECK(uno_play(&T, 0, false) && T.phase == P_HAND_OVER && T.score[0] == 402, "short of 500: another hand"); + /* a single hand */ + blank(&T, 2, 0); + T.r.one_hand = 1; + top(&T, R(RED, 5)); + give(&T, 0, R(RED, 1)), give(&T, 1, R(BLUE, 2)); + CHECK(uno_play(&T, 0, false) && T.phase == P_GAME_OVER && T.winner == 0, "one hand: over"); +} + +static void house_rules(void) { + /* stacking Draw Twos */ + blank(&T, 3, H_STACK2); + top(&T, R(RED, 5)); + give(&T, 0, R(RED, V_DRAW2)), give(&T, 0, R(RED, 1)); + give(&T, 1, R(BLUE, V_DRAW2)), give(&T, 1, R(BLUE, 1)); + give(&T, 2, R(GREEN, 1)); + CHECK(uno_play(&T, 0, false) && T.phase == P_PENALTY && T.turn == 1 && T.pending == 2 && !T.challengeable, "+2 waits"); + CHECK(uno_can_stack(&T) && !uno_can_play(&T, 1) && uno_play(&T, 0, false) && T.turn == 2 && T.pending == 4, "stacked"); + CHECK(!uno_can_stack(&T) && uno_take(&T) && T.count[2] == 5 && T.turn == 0, "4 taken"); + /* stacking Wild Draw Fours: a stacked one can't be challenged */ + blank(&T, 3, H_STACK4); + top(&T, R(RED, 5)); + give(&T, 0, C_WILD4), give(&T, 0, R(GREEN, 1)), give(&T, 1, C_WILD4), give(&T, 1, R(BLUE, 1)), give(&T, 2, R(GREEN, 2)); + uno_play(&T, 0, false), uno_choose(&T, BLUE); + CHECK(T.challengeable && uno_can_stack(&T) && uno_play(&T, 0, false) && uno_choose(&T, GREEN), "+4 on +4"); + CHECK(T.turn == 2 && T.pending == 8 && !T.challengeable && !uno_challenge(&T) && uno_take(&T) && T.count[2] == 9, + "8 taken, no challenge"); + /* no stacking on a last card */ + blank(&T, 3, H_STACK2); + top(&T, R(RED, 5)); + give(&T, 0, R(RED, V_DRAW2)), give(&T, 1, R(BLUE, V_DRAW2)), give(&T, 2, R(GREEN, 1)); + CHECK(uno_play(&T, 0, false) && T.phase == P_HAND_OVER && T.count[1] == 3, "a last Draw Two is taken at once"); + /* without stacking a Draw Two can't answer a waiting Wild Draw Four */ + blank(&T, 3, 0); + top(&T, R(RED, 5)); + give(&T, 0, C_WILD4), give(&T, 0, R(GREEN, 1)), give(&T, 1, R(BLUE, V_DRAW2)), give(&T, 1, C_WILD4); + uno_play(&T, 0, false), uno_choose(&T, BLUE); + CHECK(!uno_can_stack(&T) && !uno_can_play(&T, 0) && !uno_can_play(&T, 1), "official: no stacking"); + /* draw until you can play */ + blank(&T, 3, H_DRAW_UNTIL); + top(&T, R(RED, 5)); + give(&T, 0, R(BLUE, 1)); + next_draw(&T, R(RED, 9)), next_draw(&T, R(GREEN, 2)), next_draw(&T, R(GREEN, 3)); + CHECK(uno_draw(&T) && T.count[0] == 4 && T.phase == P_DRAWN && T.ev_n == 3, "drew 3 until one goes"); + /* a playable drawn card must be played */ + blank(&T, 3, H_MUST_PLAY); + top(&T, R(RED, 5)); + give(&T, 0, R(BLUE, 1)); + next_draw(&T, R(RED, 9)); + CHECK(uno_draw(&T) && !uno_keep(&T) && uno_play(&T, 1, false), "must play it"); +} + +static void validity(void) { + uno_new_game(&T, (uno_rules){4, LEVEL_HARD, 0, H_ALL}, 5); + CHECK(uno_valid(&T), "a fresh game"); + uno_game b = T; + b.hand[1][0] = b.hand[2][0]; + CHECK(!uno_valid(&b), "a card twice"); + b = T, b.count[0]++; + CHECK(!uno_valid(&b), "a card too many"); + b = T, b.turn = 4; + CHECK(!uno_valid(&b), "a turn past the table"); + b = T, b.phase = 9; + CHECK(!uno_valid(&b), "a phase that isn't"); + b = T, b.color = NO_COLOR; + CHECK(!uno_valid(&b), "no colour outside a Wild"); +} + +/* ---------------------------------------------------------------- the bots */ +static uint32_t hash_game(const uno_game *g, uint32_t h) { + return uno_sum(g, sizeof *g) ^ (h * 16777619u); +} + +/* a whole game, bots in every seat (their levels), catches included; the hash of every step */ +static int bot_game(uno_rules r, uint32_t seed, const int *levels, uint32_t *hash, int *hands_out) { + uno_new_game(&T, r, seed); + uint32_t h = 0; + int steps = 0, gained = 0, hands = 1; + while (T.phase != P_GAME_OVER && steps < 400000) { + if (T.phase == P_HAND_OVER) { + gained += T.gained; + uno_next_hand(&T); + hands++; + CHECK(uno_valid(&T), "a new hand: valid"); + continue; + } + int p = T.turn; + uno_move m = bot_move(&T, levels[p]); + if (!bot_do(&T, m)) { + CHECK(0, "seed %u step %d: the bot's move %d (%d) was refused (phase %d)", seed, steps, m.act, m.arg, T.phase); + return -1; + } + if (T.uno_open != UNO_NONE) + for (int b = 0; b < r.players; b++) { + uint32_t ms; + if (b != T.uno_open && bot_catches(&T, b, levels[b], &ms)) { + uno_catch(&T, b); + break; + } + } + if (!uno_valid(&T)) { + CHECK(0, "seed %u step %d: not valid after move %d", seed, steps, m.act); + return -1; + } + h = hash_game(&T, h); + steps++; + } + CHECK(T.phase == P_GAME_OVER, "seed %u: the game ends (%d steps)", seed, steps); + gained += T.gained; + int total = 0; + for (int p = 0; p < r.players; p++) total += T.score[p]; + CHECK(total == gained, "seed %u: the scores add up (%d, %d)", seed, total, gained); + CHECK(r.one_hand || T.score[T.winner] >= UNO_GOAL, "seed %u: 500 reached", seed); + if (hash) *hash = h; + if (hands_out) *hands_out = hands; + return T.winner; +} + +static void bots(void) { + int games = 0, hands = 0; + for (int n = 2; n <= 4; n++) + for (int level = 0; level < 3; level++) + for (int house = 0; house < 4; house++) { + static const uint8_t mix[4] = {0, H_STACK2 | H_STACK4, H_DRAW_UNTIL | H_MUST_PLAY, H_ALL}; + int levels[4] = {level, level, level, level}; + for (uint32_t s = 1; s <= 4; s++) { + int k = 0; + bot_game((uno_rules){(uint8_t)n, (uint8_t)level, 0, mix[house]}, s * 7919 + (uint32_t)(n * 100 + level * 10 + house), + levels, 0, &k); + games++, hands += k; + } + } + printf("bots: %d games to 500 (%d hands), every step valid\n", games, hands); + /* the levels: who wins, two players to 500 */ + struct { int a, b, min; } duel[] = {{LEVEL_HARD, LEVEL_EASY, 60}, {LEVEL_NORMAL, LEVEL_EASY, 55}, {LEVEL_HARD, LEVEL_NORMAL, 50}}; + for (int d = 0; d < 3; d++) { + int wins = 0, n = 200; + for (int s = 0; s < n; s++) { + /* each seat in turn, so the dealer's luck evens out */ + int levels[4] = {duel[d].a, duel[d].b, 0, 0}; + if (s & 1) levels[0] = duel[d].b, levels[1] = duel[d].a; + int w = bot_game((uno_rules){2, LEVEL_NORMAL, 0, 0}, 1000u + (uint32_t)s, levels, 0, 0); + wins += w == (s & 1 ? 1 : 0); + } + printf("bots: %s beat %s in %d of %d games\n", (const char *[]){"Easy", "Normal", "Hard"}[duel[d].a], + (const char *[]){"Easy", "Normal", "Hard"}[duel[d].b], wins, n); + CHECK(wins * 100 >= duel[d].min * n, "level %d against %d: %d of %d", duel[d].a, duel[d].b, wins, n); + } + /* four at the table, every level, many hands: the same game twice, to the same hash on every computer */ + uint32_t h1, h2; + int levels[4] = {LEVEL_HARD, LEVEL_EASY, LEVEL_NORMAL, LEVEL_HARD}; + bot_game((uno_rules){4, LEVEL_NORMAL, 0, 0}, 2026, levels, &h1, 0); + bot_game((uno_rules){4, LEVEL_NORMAL, 0, 0}, 2026, levels, &h2, 0); + printf("bots: a game's hash %08X\n", h1); + CHECK(h1 == h2 && h1 == 0x6205C6AFu, "the same game twice, and as on every computer: %08X", h1); +} + +/* ---------------------------------------------------------------- saves */ +static void saves(void) { + memset(files, 0, sizeof files); + uno_progress a, b; + uno_fresh(&a); + CHECK(!save_load(&b) && b.setup.players == 4 && b.setup.level == LEVEL_NORMAL && !b.has_game, "no save: a fresh start"); + a.setup = (uno_rules){3, LEVEL_HARD, 1, H_STACK2 | H_AUTO_UNO}; + a.guide = 1, a.has_game = 1; + uno_new_game(&a.g, a.setup, 31337); + for (int i = 0; i < 40 && a.g.phase < P_HAND_OVER; i++) bot_do(&a.g, bot_move(&a.g, LEVEL_NORMAL)); + CHECK(save_write(&a), "written"); + uint32_t n; + uint8_t *d = file_data(UNO_SAVE_NAME, &n); + CHECK(d && n == sizeof(uno_file) && n == 728 && !memcmp(d, "UNO1", 4), "uno.sav: %u bytes", n); + CHECK(save_load(&b) && !memcmp(&a, &b, sizeof a), "read back exactly"); + /* damaged: the copy in the script brings it back */ + d[100] ^= 0x55; + CHECK(save_load(&b) && !memcmp(&a, &b, sizeof a), "a damaged save: back from the copy"); + d = file_data(UNO_SAVE_NAME, &n); + CHECK(d && !memcmp(d + 4, (uint8_t[]){1, 0, 216, 2}, 4), "and written again"); + /* cut short */ + files[0].len = 300; + CHECK(save_load(&b) && !memcmp(&a, &b, sizeof a), "a save cut short: back from the copy"); + /* both damaged: a clean fresh start */ + d = file_data(UNO_SAVE_NAME, &n); + d[200] ^= 1; + uint8_t *c = file_data(UNO_COPY_NAME, &n); + c[n - 10] = c[n - 10] == 'A' ? 'B' : 'A'; + CHECK(!save_load(&b) && !b.has_game && b.setup.players == 4, "both damaged: a fresh start"); + /* the script gone too */ + forget(UNO_COPY_NAME); + CHECK(!save_load(&b) && !b.has_game, "damaged, no copy: a fresh start"); + /* the right checksum over a wrong game: refused */ + save_write(&a); + d = file_data(UNO_SAVE_NAME, &n); + uno_file f; + memcpy(&f, d, sizeof f); + f.p.g.hand[0][0] = f.p.g.hand[1][0]; + f.sum = uno_sum(&f, offsetof(uno_file, sum)); + memcpy(d, &f, sizeof f); + forget(UNO_COPY_NAME); + CHECK(!save_load(&b) && !b.has_game, "a card twice, summed right: refused"); + /* another version: refused */ + save_write(&a); + d = file_data(UNO_SAVE_NAME, &n); + memcpy(&f, d, sizeof f); + f.version = 2; + f.sum = uno_sum(&f, offsetof(uno_file, sum)); + memcpy(d, &f, sizeof f); + forget(UNO_COPY_NAME); + CHECK(!save_load(&b), "another version: refused"); + /* where the emulator test looks: has_game, the players, the score */ + CHECK(offsetof(uno_file, p.has_game) == 13 && offsetof(uno_file, p.g.r.players) == 16 && + offsetof(uno_file, p.g.score) == 674 && offsetof(uno_file, p.g.hands) == 682, + "offsets %zu %zu %zu %zu", offsetof(uno_file, p.has_game), offsetof(uno_file, p.g.r.players), + offsetof(uno_file, p.g.score), offsetof(uno_file, p.g.hands)); +} + +/* ---------------------------------------------------------------- the whole app, with keys */ +static uint32_t lcg; +static uint32_t rnd(void) { return lcg = lcg * 1103515245u + 12345u, lcg >> 8; } +static uint32_t held_keys, held_until; +static uint32_t random_keys(uint32_t f) { + if (f >= held_until) { + static const uint32_t pick[] = {K_OK, K_OK, K_OK, K_LEFT, K_RIGHT, K_RIGHT, K_UP, K_UP, K_DOWN, K_SHIFT, K_BACK, 0, 0, 0}; + held_keys = pick[rnd() % (sizeof pick / sizeof pick[0])]; + held_until = f + 2 + rnd() % 12; + } + return held_keys; +} +static int bad_frames; +static void check_state(void) { + if (ui.has_game && !uno_valid(G)) bad_frames++; + if (ui.screen > V_QUIT || (ui.screen == V_PLAY && !ui.has_game && G->phase != P_GAME_OVER)) bad_frames++; +} + +static void fuzz(void) { + memset(files, 0, sizeof files); + int quits = 0, games = 0; + for (int s = 0; s < 300; s++) { + lcg = (uint32_t)s * 2654435761u + 1; + if (s % 50 == 0) memset(files, 0, sizeof files); + storage_full = s % 37 == 36; + script = random_keys, watch = check_state; + frame_no = 0, quit_at = 1500 + rnd() % 3000, held_until = 0; + uno_app_main(); + quits++; + storage_full = false; + uno_progress p; + if (save_load(&p)) games += p.has_game; + CHECK(!bad_frames, "session %d: %d bad frames", s, bad_frames); + bad_frames = 0; + } + script = 0, watch = 0; + printf("keys: %d sessions of random keys, quit with Home each time (%d left a game going)\n", quits, games); +} + +/* a game played through the app's own keys: the menu, how to play, a deal; your turns played by the Normal bot + through the keys a player would press */ +static bool game_done; +static uint32_t key_every = 2; /* (frames from a press to the next) */ +static uint32_t bot_keys(uint32_t f) { + if (f % key_every || game_done) return 0; /* keys up between presses */ + uno_game *g = G; + if (ui.screen != V_PLAY) return K_OK; + if (g->phase >= P_HAND_OVER) return ui.show_end ? K_OK : 0; + if (g->turn != 0) return 0; + if (g->uno_open == 0) return K_SHIFT; + uno_move m = bot_move(g, LEVEL_NORMAL); + switch (m.act) { + case M_COLOR: return ui.sel == m.arg ? K_OK : K_RIGHT; + case M_DRAW: return K_UP; + case M_KEEP: return K_UP; + case M_TAKE: return g->challengeable ? (ui.sel == PEN_TAKE ? K_OK : K_UP) : (uno_can_stack(g) ? K_UP : 0); + case M_CHALLENGE: return ui.sel == PEN_CHALLENGE ? K_OK : K_DOWN; + default: + if (g->phase == P_PENALTY && g->challengeable) return ui.sel == PEN_STACK ? K_OK : K_DOWN; + if (g->phase == P_DRAWN) return K_OK; + if (m.uno && g->uno_said != 0) return K_SHIFT; + return ui.pick == m.arg ? K_OK : K_RIGHT; + } +} + +static void until_won(void) { + check_state(); + if (!game_done && ui.screen == V_PLAY && G->phase == P_GAME_OVER && ui.show_end) game_done = true, quit_at = frame_no + 2; +} +static void through_the_keys(void) { + memset(files, 0, sizeof files); + script = bot_keys, watch = until_won; + frame_no = 0, quit_at = 2000000, game_done = false, clock_ms = 0; + uno_app_main(); + uno_progress p; + CHECK(save_load(&p) && p.guide, "how to play shown"); + CHECK(game_done && G->score[G->winner] >= UNO_GOAL, "a game to 500 through the keys"); + printf("keys: a game to 500 through the app's keys, %u hands in %.0f minutes, scores %u %u %u %u\n", G->hands, + clock_ms / 60000, G->score[0], G->score[1], G->score[2], G->score[3]); + CHECK(!bad_frames, "%d bad frames", bad_frames); + script = 0, watch = 0; +} + +/* every key line fits */ +static void texts(void) { + uno_ui v; + memset(&v, 0, sizeof v); + uno_new_game(&T, (uno_rules){4, LEVEL_NORMAL, 0, H_ALL}, 3); + int widest = 0; + for (int screen = 0; screen <= V_QUIT; screen++) + for (int phase = 0; phase <= P_GAME_OVER; phase++) + for (int sel = 0; sel < SETUP_ROWS; sel++) + for (int k = 0; k < 8; k++) { + v.screen = (uint8_t)screen, v.sel = (uint8_t)sel, v.first_run = k & 1, v.show_end = k >> 1 & 1; + T.phase = (uint8_t)phase, T.turn = (uint8_t)(k >> 2 & 1), T.challengeable = k & 1, T.count[0] = (uint8_t)(1 + (k & 2)); + T.uno_open = k == 6 ? 1 : UNO_NONE, T.r.house = k & 4 ? H_MUST_PLAY : 0; + int w = uno_keyline_width(uno_keys(&T, &v)); + if (w > widest) widest = w; + CHECK(w <= 314, "key line too wide (%d): %s", w, uno_keys(&T, &v)); + } + printf("texts: the widest key line is %d pixels\n", widest); + for (int pg = 0; pg < UNO_HELP_PAGES; pg++) + CHECK(uno_help_bottom(pg) <= 86 + 4 * 19, "how to play, page %d: more than four lines (%d)", pg + 1, uno_help_bottom(pg)); + /* the longest messages */ + static const char *const msgs[] = {"Bot 3 played Wild +4: Yellow, UNO!", "Bot 2 played Yellow +2: Bot 3 draws 2, UNO!", + "Bot 1 challenged: Bot 3 bluffed, draws 4", "UNO is for your next-to-last card", + "Bot 3 deals: Yellow +2, you draw 2", "Only the new card can be played"}; + for (unsigned i = 0; i < sizeof msgs / sizeof msgs[0]; i++) + CHECK(uno_text_width(msgs[i]) <= 252, "message too wide: %s (%d)", msgs[i], uno_text_width(msgs[i])); +} + +static void test(const char *dir) { + (void)dir; + deck_and_points(); + dealing(); + action_cards(); + challenge(); + two_players(); + drawing(); + uno_calls(); + going_out(); + house_rules(); + validity(); + printf("rules: checked\n"); + bots(); + saves(); + texts(); + through_the_keys(); + fuzz(); +} + +/* ---------------------------------------------------------------- pictures */ +static void picture(const char *dir, const char *name) { + uno_render(G, &ui); + shot(dir, name); +} + +/* the bots play on until it's your turn in phase `phase` (and `count` cards or fewer in your hand, when not 0) */ +static bool until_mine(int phase, int most) { + for (int i = 0; i < 20000; i++) { + uno_game *g = G; + if (g->phase >= P_HAND_OVER) uno_next_hand(g); + if (g->turn == 0 && g->phase == phase && (!most || g->count[0] <= most)) return true; + bot_do(g, bot_move(g, g->turn ? g->r.level : LEVEL_NORMAL)); + describe(); + } + return false; +} + +void uno_render_cards(void); +void uno_render_icon(uint16_t bg); +static void shots(const char *dir) { + uno_render_cards(); + shot(dir, "cards"); + uno_render_icon(0); + shot(dir, "icon_black"); + uno_render_icon(0xFFFF); + shot(dir, "icon_white"); + memset(files, 0, sizeof files); + memset(&ui, 0, sizeof ui); + sv.guide = 1; + ui.setup = (uno_rules){4, LEVEL_NORMAL, 0, 0}; + ui.has_game = 1; + /* the table: your turn */ + uno_new_game(G, ui.setup, 12); + for (int i = 0; i < 9; i++) bot_do(G, bot_move(G, LEVEL_NORMAL)), describe(); + until_mine(P_PLAY, 0); + ui.screen = V_PLAY, ui.pick = 2; + for (int i = 0; i < G->count[0]; i++) + if (uno_can_play(G, i)) { ui.pick = (uint8_t)i; break; } + picture(dir, "shot"); + /* a Wild: calling the colour */ + uno_new_game(G, (uno_rules){3, LEVEL_HARD, 0, 0}, 77); + for (int k = 0; k < 400; k++) { + until_mine(P_PLAY, 0); + int w = find(G, 0, C_WILD); + if (w >= 0 && uno_can_play(G, w)) { uno_play(G, w, false), describe(); break; } + bot_do(G, bot_move(G, LEVEL_NORMAL)), describe(); + } + ui.sel = (uint8_t)bot_best_color(G, 0, LEVEL_NORMAL), ui.pick = 0; + picture(dir, "colour"); + /* a Wild Draw Four played on you */ + uno_new_game(G, (uno_rules){2, LEVEL_HARD, 0, 0}, 5); + for (int k = 0; k < 100000 && !(G->turn == 0 && G->phase == P_PENALTY && G->challengeable); k++) { + if (G->phase >= P_HAND_OVER) uno_next_hand(G); + bot_do(G, bot_move(G, LEVEL_NORMAL)), describe(); + } + ui.sel = 1; + picture(dir, "challenge"); + /* the hand you were shown */ + int o = G->offender; + memcpy(ui.reveal, G->hand[o], G->count[o]); + ui.reveal_n = G->count[o], ui.reveal_who = (uint8_t)o, ui.reveal_color = G->prev_color, ui.reveal_guilty = G->guilty; + uno_challenge(G), describe(); + ui.screen = V_REVEAL; + picture(dir, "reveal"); + /* UNO! */ + uno_new_game(G, (uno_rules){4, LEVEL_NORMAL, 0, 0}, 41); + ui.screen = V_PLAY; + for (int k = 0; k < 400000; k++) { + if (G->phase >= P_HAND_OVER) uno_next_hand(G); + if (G->turn == 0 && G->phase == P_PLAY && G->count[0] == 2 && uno_can_play(G, 0)) break; + bot_do(G, bot_move(G, LEVEL_NORMAL)), describe(); + } + ui.pick = 0; + picture(dir, "uno"); + /* the end of a hand */ + uno_new_game(G, (uno_rules){4, LEVEL_NORMAL, 0, 0}, 8); + G->score[1] = 120, G->score[2] = 245, G->score[3] = 60; + for (int k = 0; k < 100000 && G->phase < P_HAND_OVER; k++) bot_do(G, bot_move(G, LEVEL_HARD)), describe(); + ui.show_end = 1, ui.sel = 0; + picture(dir, "scores"); + /* the end of a game */ + G->phase = P_GAME_OVER, G->winner = 0, G->score[0] = 512, G->gained = 96; + picture(dir, "won"); + /* two players */ + uno_new_game(G, (uno_rules){2, LEVEL_EASY, 0, 0}, 3); + until_mine(P_PLAY, 0); + ui.show_end = 0, ui.pick = 1; + picture(dir, "duel"); + /* the menus */ + ui.screen = V_PAUSE, ui.sel = 0; + picture(dir, "pause"); + ui.screen = V_QUIT, ui.sel = 0; + picture(dir, "quit"); + ui.screen = V_TITLE, ui.sel = 0, ui.has_game = 1; + picture(dir, "title"); + ui.screen = V_SETUP, ui.sel = ROW_DEAL, ui.setup = (uno_rules){4, LEVEL_NORMAL, 0, 0}; + picture(dir, "setup"); + ui.sel = ROW_HOUSE, ui.setup.house = H_STACK2; + picture(dir, "setup_house"); + for (int pg = 0; pg < UNO_HELP_PAGES; pg++) { + char name[16]; + snprintf(name, sizeof name, "help%d", pg + 1); + ui.screen = V_HELP, ui.page = (uint8_t)pg, ui.first_run = 0; + picture(dir, name); + } +} + +/* a game, your cards played by a bot, for the GIF: every frame drawn at the table, for ms milliseconds */ +static const char *film_dir; +static uint32_t film_ms, film_k; +static double film_t0 = -1; +static void film_frame(void) { + if (ui.screen != V_PLAY) return; + if (film_t0 < 0) film_t0 = clock_ms; + char path[512]; + snprintf(path, sizeof path, "%s/%06u_%06u.raw", film_dir, film_k++, (unsigned)(clock_ms - film_t0)); + FILE *f = fopen(path, "wb"); + if (!f) exit(2); + fwrite(fb, 2, 320 * 240, f); + fclose(f); + if (clock_ms - film_t0 >= film_ms) quit_at = frame_no + 1; +} + +int main(int argc, char **argv) { + if (argc > 2 && !strcmp(argv[1], "test")) { + test(argv[2]); + if (fails) printf("%d FAILED\n", fails); + else printf("all passed\n"); + return fails ? 1 : 0; + } + if (argc > 2 && !strcmp(argv[1], "shots")) { + shots(argv[2]); + return 0; + } + if (argc > 4 && !strcmp(argv[1], "film")) { + /* a table already dealt (how to play read), from seed argv[4] */ + memset(files, 0, sizeof files); + uno_progress p; + uno_fresh(&p); + p.guide = 1, p.has_game = 1; + uno_new_game(&p.g, p.setup, (uint32_t)atoi(argv[4])); + save_write(&p); + film_dir = argv[2], film_ms = (uint32_t)atoi(argv[3]); + script = bot_keys, on_frame = film_frame, key_every = 24; + frame_no = 0, quit_at = 10000000; + uno_app_main(); + return 0; + } + printf("usage: play test DIR | shots DIR | film DIR MS SEED\n"); + return 2; +} diff --git a/games/uno/tests/test_arm.py b/games/uno/tests/test_arm.py deleted file mode 100644 index 75f109bb..00000000 --- a/games/uno/tests/test_arm.py +++ /dev/null @@ -1,132 +0,0 @@ -"""Run the actual Cortex-M7 app with Epsilon/Upsilon storage and exit checks.""" -import argparse,io,json,shlex,struct,tempfile,types -from pathlib import Path -ROOT=Path(__file__).resolve().parents[1];REPO=ROOT.parents[1] -emu_path=REPO/'tools/emu.py';emu=types.ModuleType('uno_emu');emu.__file__=str(emu_path);emu.io=io -source=emu_path.read_text().replace('ELFFile(open(elf, "rb"))','ELFFile(io.BytesIO(open(elf, "rb").read()))') -source=source.replace('cmd = [nwlink, "nwa-elf",','cmd = nwlink + ["nwa-elf",') -source=source.replace('chunk = CPU_HZ // 1000','chunk = CPU_HZ // 10000').replace('self.now_ms += 1\n','self.now_ms += 0.1\n') -source=source.replace(' next_frame = self.now_ms if frame_ms else None',' self.checkpoint = until_ms\n next_frame = self.now_ms if frame_ms else None') -source=source.replace(' self.slept_ms += r0\n',' self.slept_ms += r0\n if self.now_ms >= self.checkpoint: uc.emu_stop()\n') -exec(compile(source,str(emu_path),'exec'),emu.__dict__) -def storage(path,items): - data=bytearray(emu.STORAGE_SIZE);at=0 - for name,value in items: - r=name.encode()+b'\0'+value;n=2+len(r);struct.pack_into('=3 and at+n<=len(data);name,value=data[at+2:at+n].split(b'\0',1);result[name.decode()]=value;at+=n - return result -def uint(c,name):return struct.unpack(' 2 -> 3 -> 4; options change without creating a match. - key(c,'right');key(c,'right');key(c,'right') - c.save_png(str(out/(profile+'-setup.png'))) - review(c);c.save_png(str(out/(profile+'-review.png')));key(c,'ok');assert uint(c,'screen')==2 - c.run(c.now_ms+4500);check(c);c.save_png(str(out/(profile+'-table.png'))) - for _ in range(5):key(c,'right') - key(c,'0');key(c,'1');c.run(c.now_ms+2000) - key(c,'back');assert uint(c,'screen')==3 - frozen=uint(c,'clock_ms');c.run(c.now_ms+1200);assert uint(c,'clock_ms')==frozen - c.save_png(str(out/(profile+'-pause.png'))) - key(c,'down');key(c,'ok');assert uint(c,'screen')==10 - key(c,'ok');assert uint(c,'screen')==4 - for _ in range(7):key(c,'right') - key(c,'back');assert uint(c,'screen')==10 - key(c,'back');assert uint(c,'screen')==3 - key(c,'down');key(c,'ok');assert uint(c,'screen')==0 - saved=records(path.read_bytes())['uno.sav'];assert len(saved)==768 and saved[:5]==b'UNO\x02\x01' - assert not saved[8] and not saved[16] and not any(saved[671:679]) and not any(saved[681:683]) - saved_reference=saved - # Launch settings then cancel replacement, without changing the saved table. - key(c,'down');key(c,'ok');assert uint(c,'screen')==1 - review(c);key(c,'ok');assert uint(c,'screen')==6 - for _ in range(4):key(c,'back') - assert uint(c,'screen')==0 - key(c,'up');key(c,'ok');assert uint(c,'screen')==2 - key(c,'back');key(c,'home',90);c.run(c.now_ms+150);exit_check(c,system=='upsilon') - assert records(path.read_bytes())['keep.py']==sentinel - d=emu.Calculator(app,storage_file=str(path),nwlink=nw);d.enable_checks();d.run(250) - assert uint(d,'screen')==0 and uint(d,'sel')==0 - key(d,'ok');assert uint(d,'screen')==2 - before_resume=records(path.read_bytes())['uno.sav'] - key(d,'back');key(d,'onoff',90);d.run(d.now_ms+150);exit_check(d,system=='upsilon') - assert records(path.read_bytes())['uno.sav']==before_resume - frames=c.svc_counts.get(19,0)//15 - r=dict(profile=profile,static_ram=json.loads((ROOT/'output/sizes.json').read_text())['profiles'][0]['static_ram'],peak_stack_bytes=max(c.stack_used(),d.stack_used()), - average_render_work_ms=round((c.now_ms-c.slept_ms)/max(1,frames),2), - gameplay=True,pause_freezes=True,save_resume=True,firmware_memory_preserved=True,clean_exit=True) - report.append(r);print(json.dumps(r),flush=True) - emu.configure();emu.CPU_HZ=216_000_000 - # Real key paths for play, manual UNO, legal/illegal challenges, draws, - # wild colour choice and a completed match. Fixtures are engine-validated. - def start_fixture(name): - p=out/(name+'.storage');storage(p,[('keep.py',sentinel),('uno.sav',(ROOT/'output'/(name+'.sav')).read_bytes())]) - c=emu.Calculator(app,storage_file=str(p),nwlink=nw);c.enable_checks();c.run(200);key(c,'ok');assert uint(c,'screen')==2;return c,p - def finish_fixture(c,p): - key(c,'back');key(c,'home');c.run(c.now_ms+150);exit_check(c);r=records(p.read_bytes());assert r['keep.py']==sentinel;return r['uno.sav'] - c,p=start_fixture('play');key(c,'0');key(c,'ok');saved=finish_fixture(c,p) - assert saved[449]==1 and saved[701]==255 # human called UNO and played one card - c,p=start_fixture('draw');key(c,'1');key(c,'left');key(c,'ok');saved=finish_fixture(c,p) - assert saved[449]==2 and saved[692]==3 # cannot play an old hand card after drawing - c,p=start_fixture('draw');key(c,'1');key(c,'2');saved=finish_fixture(c,p) - assert saved[449]==2 and saved[692]==0 and saved[690]==1 - c,p=start_fixture('wild');key(c,'ok');key(c,'right');key(c,'ok');saved=finish_fixture(c,p) - assert saved[449]==1 and saved[691]==1 and saved[690]==1 - for fixture,guilty in [('challenge-guilty',True),('challenge-legal',False)]: - c,p=start_fixture(fixture);key(c,'down');key(c,'ok');assert uint(c,'screen')==9 - c.save_png(str(out/(fixture+'.png')));key(c,'ok');saved=finish_fixture(c,p) - assert saved[449]==(1 if guilty else 7) and saved[450]==(5 if guilty else 1) - assert saved[690]==(0 if guilty else 1) and saved[693]==0 - c,p=start_fixture('win');key(c,'ok');c.save_png(str(out/'win.png'));saved=finish_fixture(c,p) - assert saved[692]==5 and saved[700]==0 and not any(saved[671:679]) and struct.unpack_from('=7 for n in fresh[449:451]) - # Full storage: retry fails without damaging the existing record, exit explicit. - p=out/'full.storage';filler=b'x'*(emu.STORAGE_SIZE-24);storage(p,[('full.py',filler)]) - c=emu.Calculator(app,storage_file=str(p),nwlink=nw);c.enable_checks();c.run(250);key(c,'home');assert uint(c,'screen')==8 - key(c,'ok');assert uint(c,'screen')==8;key(c,'down');key(c,'ok');c.run(c.now_ms+150);exit_check(c) - assert records(p.read_bytes())=={'full.py':filler} - # Invalid checksum is ignored and never interpreted as a match. - bad=bytearray(saved_reference);bad[300]^=1;p=out/'bad.storage';storage(p,[('keep.py',sentinel),('uno.sav',bad)]) - c=emu.Calculator(app,storage_file=str(p),nwlink=nw);c.enable_checks();c.run(250);assert uint(c,'sel')==1 - key(c,'home');c.run(c.now_ms+150);exit_check(c);assert records(p.read_bytes())['keep.py']==sentinel - # A launch key held by NumPlay cannot accidentally enter New game. - c=emu.Calculator(app,nwlink=nw);c.enable_checks();c.keys=[(0,400,emu.KEYS['ok'])];c.run(550);assert uint(c,'screen')==0 - key(c,'home');c.run(c.now_ms+150);exit_check(c) - report.append(dict(full_storage=True,corrupt_save_ignored=True,held_launch_key=True,real_keys_play_and_uno=True,real_keys_challenges=True,real_keys_draw_keep_and_wild=True,real_keys_win=True,legacy_points_removed=True,real_keys_play_again=True)) - (out/'report.json').write_text(json.dumps(report,indent=2)+'\n');print('ARM tests passed',flush=True) -if __name__=='__main__':main() diff --git a/games/uno/tests/test_engine.c b/games/uno/tests/test_engine.c deleted file mode 100644 index 4234b010..00000000 --- a/games/uno/tests/test_engine.c +++ /dev/null @@ -1,143 +0,0 @@ -#include -#include -#include -#include "../src/uno.h" -#include "../src/save.h" -static Uno g; -static void fixture(int players,int flags,int top,int color){ - memset(&g,0,sizeof g);g.rules=(UnoRules){players,1,flags};g.direction=1;g.color=color;g.rng=12345;g.round=1; - g.candidate=g.winner=g.offender=g.uno_player=g.uno_armed=g.drawn=UNO_NONE; - for(int c=0;c<52;c++){g.deck[g.dn++]=c;if(c%13)g.deck[g.dn++]=c;} - for(int i=0;i<4;i++){g.deck[g.dn++]=52;g.deck[g.dn++]=53;} - for(int i=0;i2)give(3,g.deck[0]); - g.discard[g.xn++]=g.deck[--g.dn];g.discard[g.xn++]=g.deck[--g.dn];g.color=uno_color(g.discard[g.xn-1]);if(g.color==4)g.color=0; - int top=g.discard[g.xn-1];assert(uno_draw(&g));assert(g.discard[0]==top&&g.xn==1&&uno_valid(&g)); -} -static void challenge(void){ - fixture(4,0,3,0);give(0,53);give(0,4);give(1,20); - assert(uno_play(&g,0,false)&&g.phase==U_COLOR&&g.guilty);assert(uno_choose_color(&g,1)&&g.phase==U_CHALLENGE&&g.turn==1); - assert(uno_challenge(&g));assert(g.count[0]==5&&g.count[1]==1&&g.turn==1&&g.event==E_CHALLENGE_WON&&uno_valid(&g)); - fixture(4,0,3,0);give(0,53);give(0,16);give(1,20); - assert(uno_play(&g,0,false)&&!g.guilty);assert(uno_choose_color(&g,2));assert(uno_challenge(&g)); - assert(g.count[1]==7&&g.turn==2&&g.event==E_CHALLENGE_LOST&&uno_valid(&g)); - fixture(2,0,3,0);give(0,53);give(0,52);assert(uno_play(&g,0,false)&&!g.guilty); - assert(uno_choose_color(&g,3));assert(uno_accept(&g)&&g.count[1]==4&&g.turn==0); - /* A different-colour matching symbol is allowed alongside a legal +4. */ - fixture(2,0,3,0);give(0,53);give(0,16);assert(uno_play(&g,0,false)&&!g.guilty); -} -static void variants(void){ - fixture(4,R_STACK2,3,0);give(0,12);give(0,4);give(1,25);give(1,20);give(2,38);give(2,30); - assert(uno_play(&g,0,true)&&g.pending==2&&uno_can_play(&g,0));assert(uno_play(&g,0,true)&&g.pending==4); - assert(uno_play(&g,0,true)&&g.pending==6&&g.turn==3);assert(uno_accept(&g)&&g.count[3]==6&&g.turn==0&&uno_valid(&g)); - fixture(4,R_STACK4,3,0);give(0,53);give(0,4);give(1,53);give(1,20); - assert(uno_play(&g,0,true)&&uno_choose_color(&g,2));assert(g.phase==U_TURN&&g.pending==4&&!uno_challenge(&g)); - assert(uno_play(&g,0,true)&&uno_choose_color(&g,1));assert(g.pending==8);assert(uno_accept(&g)&&g.count[2]==8&&uno_valid(&g)); - fixture(4,R_AUTO_UNO,3,0);give(0,4);give(0,5);assert(uno_play(&g,0,false)&&g.uno_player==UNO_NONE); -} -static void uno_calls(void){ - fixture(4,0,3,0);give(0,4);give(0,5);give(1,6);give(1,7); - give(2,19);give(3,32);snapshot("play.sav"); - assert(uno_play(&g,0,false)&&g.uno_player==0);assert(uno_call(&g,0)&&g.uno_player==UNO_NONE);assert(!uno_catch(&g,1)); - fixture(4,0,3,0);give(0,4);give(0,5);assert(uno_call(&g,0)&&g.uno_armed==0);assert(uno_play(&g,0,false)&&g.uno_player==UNO_NONE); - fixture(4,0,3,0);give(0,4);give(0,5);assert(uno_play(&g,0,false));assert(uno_catch(&g,1));assert(g.count[0]==3&&!uno_catch(&g,2)&&g.turn==1); - fixture(4,0,3,0);give(0,4);give(0,5);give(1,6);give(1,7);assert(uno_play(&g,0,false));assert(uno_play(&g,0,true));assert(!uno_catch(&g,1)&&g.count[0]==1); -} -static void wins(void){ - fixture(2,0,3,0);give(0,4);give(1,50);give(1,53);snapshot("win.sav");assert(uno_play(&g,0,true));assert(g.phase==U_MATCH&&g.winner==0&&uno_valid(&g)); - fixture(2,0,3,0);give(0,12);give(1,20); - assert(uno_play(&g,0,true));assert(g.phase==U_MATCH&&g.count[1]==3&&g.winner==0&&uno_valid(&g)); - fixture(2,0,3,0);give(0,53);give(1,20);assert(uno_play(&g,0,true)&&uno_choose_color(&g,2));assert(g.phase==U_CHALLENGE&&g.candidate==0); - assert(uno_challenge(&g)&&g.phase==U_MATCH&&g.count[1]==7&&g.winner==0&&uno_valid(&g)); - fixture(2,R_STACK2,3,0);give(0,12);give(1,25);assert(uno_play(&g,0,true));assert(g.phase==U_MATCH&&g.count[1]==3); - fixture(2,0,3,0);give(0,4);give(1,0);assert(uno_play(&g,0,true)&&g.phase==U_MATCH&&g.winner==0); /* Even opponents holding only zero-valued cards. */ - fixture(4,0,3,0);give(0,4);give(1,5);assert(uno_play(&g,0,true)&&g.phase==U_MATCH);g.direction=-1;g.dealer=0;uno_next_round(&g);assert(g.dealer==1&&g.direction==1&&uno_valid(&g)); - fixture(2,0,3,0);give(0,50);give(1,4);g.turn=1;assert(uno_play(&g,0,true)&&g.phase==U_MATCH&&g.winner==1); -} -static void arm_fixtures(void){ - fixture(4,0,3,0);give(0,4);give(1,53);give(1,5);give(2,30);give(3,43); - g.turn=1;assert(uno_play(&g,0,true)&&uno_choose_color(&g,2));g.turn=0;snapshot("challenge-guilty.sav"); - fixture(4,0,3,0);give(0,4);give(1,53);give(1,16);give(2,30);give(3,43); - g.turn=1;assert(uno_play(&g,0,true)&&uno_choose_color(&g,2));g.turn=0;snapshot("challenge-legal.sav"); - fixture(2,0,3,0);give(0,4);give(1,6);on_top(5);snapshot("draw.sav"); - fixture(2,0,3,0);give(0,52);give(0,4);give(1,6);snapshot("wild.sav"); -} -static void saves(void){ - UnoSave a={0},b={0};a.prefs=(UnoRules){4,1,0};a.active=1;a.played=19;a.wins=7;uno_new(&a.game,a.prefs,98765); - uint8_t data[UNO_SAVE_BYTES];save_encode(&a,data);assert(save_decode(&b,data,sizeof data));assert(!memcmp(&a,&b,sizeof a)); - for(unsigned i=0;i>(i*8); - assert(save_decode(&b,data,sizeof data)&&b.game.phase==U_MATCH&&b.game.winner==0&&uno_valid(&b.game)); -} -static void simulations(void){ - unsigned moves=0,max_hand=0,rounds=0;bool opening[54]={0}; - for(unsigned seed=1;seed<=12000;seed++){ - UnoRules r={(seed%3)+2,seed%3,0};uno_new(&g,r,seed);assert(uno_valid(&g)); - int c=g.discard[0];opening[c]=true;assert(c!=53); - for(int p=0;pmax_hand)max_hand=g.count[p]; - if(g.phase==U_ROUND){uno_next_round(&g);rounds++;continue;} - if(g.uno_player!=UNO_NONE){int p=(g.uno_player+1)%players;if(step%3==0)uno_catch(&g,p);else uno_call(&g,g.uno_player);} - uno_bot(&g);moves++; - } - assert(g.phase==U_MATCH&&uno_valid(&g)); - } - printf("1,152 complete games, %u actions, %u blocked-table redeals; largest hand %u cards.\n",moves,rounds,max_hand); -} -int main(void){basic();draws();challenge();variants();uno_calls();wins();saves();arm_fixtures();simulations();puts("Engine, card rules, variants, direct wins, legacy migration and saves passed.");return 0;} diff --git a/games/uno/tests/test_integration.py b/games/uno/tests/test_integration.py deleted file mode 100644 index 168f0101..00000000 --- a/games/uno/tests/test_integration.py +++ /dev/null @@ -1,133 +0,0 @@ -"""Build the real NumPlay launcher with only this module for integration testing. - -This deliberately small test catalogue is not a release of NumPlay. Production -builds still read the complete games/games.json and use the UNO ID. -""" -import argparse -import json -import shlex -import subprocess -import sys -from elftools.elf.elffile import ELFFile -from pathlib import Path -import test_arm as arm - -ROOT = Path(__file__).resolve().parents[1] -REPO = ROOT.parents[1] - - -def main(): - ap = argparse.ArgumentParser() - ap.add_argument('--nwlink', default='nwlink') - args = ap.parse_args() - nw = ['node', args.nwlink] if Path(args.nwlink).is_file() and not args.nwlink.endswith(('.exe', '.cmd')) else shlex.split(args.nwlink) - out = ROOT / 'output/integration' - out.mkdir(parents=True, exist_ok=True) - arm.tempfile.tempdir = str(out) - - def run(*cmd): - subprocess.run([str(x) for x in cmd], cwd=REPO, check=True) - - def py(tool, *args): - run(sys.executable, REPO / 'tools' / tool, *args) - - device = shlex.split(subprocess.check_output(nw + ['eadk-cflags-device'], text=True)) - cc = ['arm-none-eabi-gcc', *device, '-std=gnu11', '-Os', '-Wall', '-Wextra', - '-Wno-unused-parameter', '-fno-math-errno', '-ffunction-sections', '-fdata-sections', - '-fno-tree-loop-distribute-patterns', '-DNP_VERSION="uno-test"', - '-I' + str(REPO / 'launcher/src')] - games = json.loads((REPO / 'games/games.json').read_text()) - index = next(i for i, g in enumerate(games, 1) if g['id'] == 'uno') - game = games[index - 1] - assert game['app'] == 'UNO.nwa' and game['records'] == ['uno.sav'] - run('arm-none-eabi-ld', '-r', '-d', '-z', 'noexecstack', '--force-group-allocation', '-T', REPO / 'tools/module.ld', - ROOT / 'output/module.o', '-o', out / 'stage1.o') - run('arm-none-eabi-objcopy', '--keep-global-symbol=main', - '--redefine-sym', 'eadk_keyboard_scan=np_keyboard_scan', - '--redefine-sym', 'eadk_event_get=np_event_get', - '--redefine-sym', 'eadk_display_draw_string=np_display_draw_string', - out / 'stage1.o', out / 'stage2.o') - py('npmodule.py', out / 'stage2.o', out / 'uno.o', '--game', 'uno', - '--index', index, '--json', out / 'uno.json') - py('gen_games.py', REPO / 'games/games.json', out, out, '--only', 'uno') - py('shots.py', '--id', 'uno', '--index', index, '--colors', 16, - out / 'shots.c', *(ROOT / p for p in game['shots'])) - objects = [out / 'uno.o'] - entry = out / 'entry_uno.c' if (out / 'entry_uno.c').exists() else out / 'gametable.c' - sources = sorted((REPO / 'launcher/src').glob('*.c')) + [entry, out / 'shots.c'] - for src in sources: - obj = out / ('launcher-' + src.stem + '.o') - run(*cc, '-c', src, '-o', obj) - objects.append(obj) - marks = 'marks_uno' if (out / 'marks_uno.s').exists() else 'marks' - for stem in ['arena', marks]: - obj = out / (stem + '.o') - run(*cc, '-c', out / (stem + '.s'), '-o', obj) - objects.append(obj) - run(*cc, '-DNP_APP_NAME="NumPlay integration test"', '-c', REPO / 'launcher/app_name.c', '-o', out / 'name.o') - run(*nw, 'png-icon-o', REPO / 'launcher/assets/icon.png', out / 'icon.o') - app = out / 'NumPlay-test.nwa' - run(*cc, '-nostartfiles', '--specs=nano.specs', '-Wl,--relocatable', '-Wl,--gc-sections', - '-Wl,-e,main', '-Wl,-u,eadk_app_name', '-Wl,-u,eadk_app_icon', '-Wl,-u,eadk_api_level', - '-Wl,-T,' + str(out / 'numplay.ld'), *objects, out / 'name.o', out / 'icon.o', '-lm', '-o', app) - report = [] - for profile, model, system, ram in [('n0120', 'n0120', 'epsilon', 153676), - ('upsilon', 'n0110', 'upsilon', 107674)]: - arm.emu.configure(model, system, ram) - st = out / (profile + '.storage') - arm.storage(st, [('keep.py', b'print(42)\n')]) - c = arm.emu.Calculator(str(app), storage_file=str(st), nwlink=nw) - # npmodule deliberately removes the module's private symbols. Recover - # their RAM offsets from its input solely for these debugger assertions. - with (out / 'stage1.o').open('rb') as f: - elf = ELFFile(f) - for sym in elf.get_section_by_name('.symtab').iter_symbols(): - if sym.name in ('screen', 'setup_page'): - section = elf.get_section(sym['st_shndx']).name - assert section == '.bss' - c.symbols[sym.name] = c.symbols['np_uno_bss'] + sym['st_value'] - c.enable_checks() - c.run(1100) - c.save_png(str(out / (profile + '-launcher.png'))) - - def key(k, wait=200): - t = int(c.now_ms) + 20 - c.keys.append((t, t + 70, arm.emu.KEYS[k])) - c.run(t + wait) - - key('ok', 650) # Real carousel -> UNO module. - assert arm.uint(c, 'screen') == 0 - key('ok'); assert arm.uint(c, 'screen') == 1 - key('up'); key('ok'); assert arm.uint(c, 'setup_page') == 1 - key('up'); key('ok'); assert arm.uint(c, 'setup_page') == 2 - key('ok'); assert arm.uint(c, 'screen') == 2 - c.save_png(str(out / (profile + '-table.png'))) - key('back'); key('down'); key('down'); key('ok') # Save to menu. - assert arm.uint(c, 'screen') == 0 - key('back'); key('down'); key('ok', 800) # Save and exit -> carousel. - assert not c.exited - c.save_png(str(out / (profile + '-returned.png'))) - key('ok', 650) # BSS resets, table restored from shared storage. - assert arm.uint(c, 'screen') == 0 - key('ok'); assert arm.uint(c, 'screen') == 2 - key('back'); key('home', 700) - assert c.exited and not c.violations and not c.firmware_ram_changes() - assert c.app_ram_clean() and c.locks == 0 and c.max_locks == (0 if system == 'upsilon' else 1) - records = arm.records(st.read_bytes()) - assert len(records['uno.sav']) == 768 and records['uno.sav'][:5] == b'UNO\x02\x01' - assert records['keep.py'] == b'print(42)\n' and b'uno.sav' in records['numplay_saves.py'] - # Simulate an installer that retains only Python scripts. - arm.storage(st, [(n, v) for n, v in records.items() if n.endswith('.py')]) - restored = arm.emu.Calculator(str(app), storage_file=str(st), nwlink=nw) - restored.enable_checks(); restored.run(1100) - t = int(restored.now_ms) + 20; restored.keys.append((t, t + 90, arm.emu.KEYS['home'])); restored.run(t + 750) - assert restored.exited and not restored.violations and not restored.firmware_ram_changes() and restored.app_ram_clean() - assert arm.records(st.read_bytes())['uno.sav'] == records['uno.sav'] - report.append(dict(profile=profile, launch_return_reenter=True, backup_and_reinstall_restore=True, - stack_bytes=max(c.stack_used(), restored.stack_used()))) - (out / 'report.json').write_text(json.dumps(report, indent=2) + '\n') - print('PASS: UNO NumPlay module launch, return, re-entry, shared saves and backup.') - - -if __name__ == '__main__': - main() diff --git a/games/uno/tests/test_ui.c b/games/uno/tests/test_ui.c deleted file mode 100644 index 54ae0ae6..00000000 --- a/games/uno/tests/test_ui.c +++ /dev/null @@ -1,100 +0,0 @@ -#include -#include -#include -#define NP_MODULE 1 -#define main uno_appmain -#include "../src/main.c" -#undef main -static uint16_t pixels[320*240]; -uint64_t eadk_timing_millis(void){return clock_ms;} -uint32_t eadk_random(void){return 73;} -uint64_t eadk_keyboard_scan(void){return 0;} -void eadk_display_wait_for_vblank(void){} -void eadk_timing_msleep(uint32_t n){(void)n;} -void*np_alloc(uint32_t n){return malloc(n);} -bool np_file_write(const char*n,const void*d,uint32_t z){assert(!strcmp(n,SAVE_NAME)&&z==768);return true;} -const uint8_t*np_file_read(const char*n,uint32_t*z){*z=0;return NULL;} -void np_push(int x,int y,int w,int h,const color_t*d){assert(x>=0&&y>=0&&x+w<=320&&y+h<=240);for(int i=0;i>11)*255/31,((c>>5)&63)*255/63,(c&31)*255/31};fwrite(rgb,1,3,f);}fclose(f); -} -static void art(void){ - assert(sizeof(card_palette)/2==31&&sizeof(card_offsets)/2==56); - for(int i=0;i<55;i++){ - const uint8_t*p=card_pixels+card_offsets[i]; - for(int y=0;y<64;y++){int n=*p++,x=0;assert(n>0&&n<=44);for(int j=0;j>5)+1;assert(x==44);p+=n;} - assert(p==card_pixels+card_offsets[i+1]); - } - for(int i=0;i<7;i++){ - /* Check the wrapped help really fits the panel, using the actual font. */ - const char*p=HELP[i];int lines=1,w=0; - while(*p){const char*start=p;while(*p&&*p!=' ')p++;char word[80];unsigned n=p-start;assert(n266){lines++;w=ww;}else w+=ww+(w?space:0);if(*p)p++; - } - assert(72+(lines-1)*20+4<209); - } - for(int i=0;i<5;i++)assert(gfx_text_width(&np_font_small,VARIANT[i])<218); - for(int i=0;i<6;i++)assert(gfx_text_width(&np_font_small,VARIANT_HELP[i])<296); - assert(172+gfx_text_width(&np_font_small,"DISCARD")/2+6<=222-gfx_text_width(&np_font_small,"COLOR")/2); - assert(gfx_text_width(&np_font_small,"1 Draw +16")<=64); - assert(gfx_text_width(&np_font_small,"Back: pause")<=79); - for(int c=0;c<54;c++){char s[60];name_card(c,s);assert(gfx_text_width(&np_font_small,s)<126);} -} -static void setup_navigation(void){ - screen=S_SETTINGS;setup_page=0;sel=0;Uno before=*G; - for(int i=0;i<3;i++)setup_input(1,0,false,false); - assert(sv.prefs.players==4&&setup_page==0&&sel==0); - setup_input(0,1,false,false); - for(int i=0;i<3;i++)setup_input(1,0,false,false); - assert(sv.prefs.difficulty==1); - setup_input(0,1,true,false);assert(setup_page==1&&sel==0&&screen==S_SETTINGS); - for(int i=0;i<5;i++){setup_input(0,1,true,false);assert(sv.prefs.flags==(1u<<(i+1))-1);} - assert(sv.prefs.flags==31&&custom_rules(&sv.prefs)); - setup_input(0,1,true,false);assert(setup_page==2&&screen==S_SETTINGS); - setup_input(0,0,false,true);assert(setup_page==1&&sel==6); - setup_input(0,1,true,false);assert(sel==0&&sv.prefs.flags==0); - setup_input(0,0,false,true);assert(setup_page==0&&sel==2); - setup_input(0,0,false,true);assert(screen==S_MENU); - assert(!memcmp(&before,G,sizeof before)); -} -int main(void){ - gfx_buf=strip;sv.prefs=(UnoRules){4,1,0};ui_random=5123;clock_ms=10000;last_action=0;screen=S_MENU;sel=1; - art();shot("menu.ppm"); - setup_navigation();screen=S_SETTINGS;setup_page=0;sel=0;shot("settings.ppm"); - sv.prefs.players=2;shot("settings-two.ppm");sv.prefs.players=4; - setup_page=1;sel=2;sv.prefs.flags=3;shot("variants.ppm"); - setup_page=2;sel=0;shot("review.ppm");sv.prefs.flags=0;shot("review-classic.ppm"); - for(int n=2;n<=4;n++){ - sv.prefs.players=n;new_game();while(G->phase==U_COLOR)uno_choose_color(G,0);G->turn=0;last_action=0; - char s[40];sprintf(s,"table-%d.ppm",n);shot(s);G->turn=1;selected=3;sprintf(s,"bot-turn-%d.ppm",n);shot(s); - int old=selected;play_input(1,0,false,false,false,false);assert(selected==(old+1)%G->count[0]); - } - for(int i=0;i<7;i++){screen=S_HELP;help_page=i;char s[40];sprintf(s,"help-%d.ppm",i);shot(s);} - screen=S_CREDITS;shot("credits.ppm");screen=S_PAUSE;sel=0;shot("pause.ppm");screen=S_TABLE_INFO;shot("table-rules.ppm"); - screen=S_PLAY;G->phase=U_COLOR;G->turn=0;color_sel=2;shot("color.ppm"); - G->phase=U_CHALLENGE;G->pending=4;G->old_color=1;sel=1;shot("challenge.ppm"); - evidence_count=G->count[1];memcpy(evidence,G->hands[1],evidence_count);selected=0;screen=S_EVIDENCE;shot("evidence.ppm"); - screen=S_PLAY;G->phase=U_MATCH;G->winner=0;sel=0;shot("result.ppm"); - /* Play again retains the active table, even if future-game prefs differ. */ - UnoRules rules=G->rules;sv.prefs=(UnoRules){2,0,R_AUTO_UNO}; - play_input(0,0,true,false,false,false);assert(screen==S_PLAY&&G->phaserules,sizeof rules)&&sv.prefs.flags==R_AUTO_UNO); - G->phase=U_MATCH;G->winner=1;shot("bot-wins.ppm"); - play_input(0,1,true,false,false,false);assert(screen==S_MENU&&!sv.active); - screen=S_SAVE_ERROR;sel=0;exit_after_save=true;shot("save-error.ppm"); - /* Navigate every card even when the hand is bigger than one screen. */ - new_game();G->phase=U_TURN;G->turn=0; - while(G->dn){G->hands[0][G->count[0]++]=G->deck[--G->dn];} - selected=G->count[0]-1;last_action=0;shot("large-hand.ppm");assert(uno_valid(G)); - for(int j=0;jcount[0];j++)play_input(1,0,false,false,false,false); - assert(selected==G->count[0]-1); - /* Disabled actions cannot trap focus, and returning to the hand is explicit. */ - G->turn=1;G->uno_player=UNO_NONE;action=-1;play_input(0,-1,false,false,false,false);assert(action==2); - play_input(1,0,false,false,false,false);assert(action==2); - play_input(0,1,false,false,false,false);assert(action==-1); - G->turn=0;G->phase=U_DRAWN;G->rules.flags=R_FORCE;G->drawn=selected; - play_input(0,-1,false,false,false,false);assert(action==2); - puts("Asset decoder, visual setup navigation, text layout, card browsing and UI screenshots passed.");return 0; -} diff --git a/games/uno/tools/assets.json b/games/uno/tools/assets.json deleted file mode 100644 index 4ae9c939..00000000 --- a/games/uno/tools/assets.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "source_sha256": "873e5243b3bc15140313becdbfb33c2afc7ed858e49c6f67a6ef5f9706ad9837", - "cards": 55, - "width": 44, - "height": 64, - "card_rom_bytes": 60895, - "table_rom_bytes": 1536 -} diff --git a/games/uno/tools/assets.py b/games/uno/tools/assets.py deleted file mode 100644 index 360d45de..00000000 --- a/games/uno/tools/assets.py +++ /dev/null @@ -1,59 +0,0 @@ -"""Build small, shared-palette sprites from the user-supplied AlexDer ZIP. - -python tools/assets.py '/path/to/Uno Game Assets (1).zip' -No original-size textures, PDF, fonts or executable files are shipped. -""" -import argparse, hashlib, io, json, zipfile -from pathlib import Path -from PIL import Image, ImageDraw - -ROOT = Path(__file__).resolve().parents[1] -W, H = 44, 64 - -def array(name, kind, data, columns=24): - return 'static const '+kind+' '+name+'[] = {\n'+''.join( - ' '+','.join(str(x) for x in data[i:i+columns])+',\n' for i in range(0,len(data),columns))+'};\n' - -def main(): - p=argparse.ArgumentParser(); p.add_argument('zip',type=Path); a=p.parse_args() - names=[f'{c}_{v}.png' for c in ('Red','Yellow','Green','Blue') - for v in list(map(str,range(10)))+['Skip','Reverse','Draw']]+['Wild.png','Wild_Draw.png','Deck.png'] - with zipfile.ZipFile(a.zip) as z: - members={Path(n).name:n for n in z.namelist() if n.startswith('Uno Game Assets/') and n.endswith('.png')} - def read(n): return Image.open(io.BytesIO(z.read(members[n]))).convert('RGBA') - images=[read(n).resize((W,H),Image.Resampling.LANCZOS) for n in names] - sample=Image.new('RGB',(W*len(images),H),'white') - for i,im in enumerate(images): sample.paste(im,(i*W,0),im) - pal=sample.quantize(colors=31,method=Image.Quantize.MEDIANCUT) - colors=pal.getpalette()[:93] - palette=[((colors[i]&248)<<8)|((colors[i+1]&252)<<3)|(colors[i+2]>>3) for i in range(0,93,3)] - encoded=bytearray(); offsets=[] - for im in images: - offsets.append(len(encoded)) - rgb=Image.new('RGB',im.size,'white');rgb.paste(im,mask=im.getchannel('A')) - ix=list(rgb.quantize(palette=pal,dither=Image.Dither.NONE).getdata());alpha=list(im.getchannel('A').getdata()) - ix=[v if alpha[i]>=128 else 31 for i,v in enumerate(ix)] - for y in range(H): - row=ix[y*W:(y+1)*W]; tokens=[];x=0 - while x>3) for r,g,b in table.getdata()] - content='/* Generated by tools/assets.py. AlexDer card art, see ASSETS.md. */\n#define CARD_W 44\n#define CARD_H 64\n' - content+=array('card_palette','uint16_t',palette)+array('card_offsets','uint16_t',offsets) - content+=array('card_pixels','uint8_t',list(encoded))+array('table_pixels','uint16_t',packed) - (ROOT/'src/assets.h').write_text(content,encoding='utf-8') - icon=Image.new('RGBA',(55,56),(15,47,41,255)) - for name,x,y in [('Red_7.png',3,7),('Wild.png',17,3),('Deck.png',31,7)]: - im=read(name).resize((23,34),Image.Resampling.LANCZOS);icon.alpha_composite(im,(x,y+6)) - icon.save(ROOT/'src/icon.png') - report=dict(source_sha256=hashlib.sha256(a.zip.read_bytes()).hexdigest(),cards=55,width=W,height=H, - card_rom_bytes=len(encoded)+2*len(offsets)+2*len(palette),table_rom_bytes=len(packed)*2) - (ROOT/'tools/assets.json').write_text(json.dumps(report,indent=2)+'\n') - print(json.dumps(report,indent=2)) - -if __name__=='__main__':main() diff --git a/games/uno/tools/build.py b/games/uno/tools/build.py deleted file mode 100644 index d9065d5f..00000000 --- a/games/uno/tools/build.py +++ /dev/null @@ -1,59 +0,0 @@ -"""Portable NumWorks build. Requires ARM GCC, nwlink 1.0.0 and pyelftools.""" -import argparse, json, os, shlex, shutil, subprocess -from pathlib import Path -ROOT=Path(__file__).resolve().parents[1];REPO=ROOT.parents[1] -def main(): - ap=argparse.ArgumentParser();ap.add_argument('--toolchain',type=Path);ap.add_argument('--nwlink',default='nwlink');a=ap.parse_args() - out=ROOT/'output';out.mkdir(exist_ok=True) - # Root make can request the standalone app and module simultaneously. - # Serialize their shared compiler outputs; OS locks are released on exit. - with (out/'.build.lock').open('a+b') as lock: - if os.name=='nt': - import msvcrt - if lock.seek(0,2)==0:lock.write(b'\0');lock.flush() - lock.seek(0);msvcrt.locking(lock.fileno(),msvcrt.LK_LOCK,1) - else: - import fcntl - fcntl.flock(lock.fileno(),fcntl.LOCK_EX) - try:build(a,out) - finally: - if os.name=='nt':lock.seek(0);msvcrt.locking(lock.fileno(),msvcrt.LK_UNLCK,1) - else:fcntl.flock(lock.fileno(),fcntl.LOCK_UN) - -def build(a,out): - def run(*args,capture=False): - return subprocess.run(list(map(str,args)),cwd=ROOT,check=True,capture_output=capture,text=capture) - def tool(n): - name='arm-none-eabi-'+n+('.exe'if os.name=='nt'else'');return a.toolchain/name if a.toolchain else name - nw=['node',a.nwlink]if Path(a.nwlink).is_file()and not a.nwlink.endswith(('.exe','.cmd'))else[a.nwlink] - flags=['-std=c11','-Os','-Wall','-Wextra','-Werror','-Wno-misleading-indentation','-fno-math-errno','-ffunction-sections','-fdata-sections','-flto','-fstack-usage', - '-fno-tree-loop-distribute-patterns','-fvisibility=internal'] - flags+=shlex.split(run(*nw,'eadk-cflags-device',capture=True).stdout) - objects=[] - for src in [ROOT/'src/main.c',ROOT/'src/uno.c',REPO/'launcher/src/gfx.c',REPO/'launcher/src/font_data.c',REPO/'launcher/src/xfont.c']: - obj=out/(src.stem+'.o');run(tool('gcc'),*flags,'-c',src,'-o',obj);objects.append(obj) - run(*nw,'png-icon-o',ROOT/'src/icon.png',out/'icon.o') - link=[tool('gcc'),*flags,'-nostartfiles','--specs=nano.specs','-Wl,--relocatable,--gc-sections,-e,main','-flinker-output=nolto-rel'] - run(*link,*objects,out/'icon.o','-Wl,-u,eadk_app_name,-u,eadk_app_icon,-u,eadk_api_level','-lm','-o',out/'uno-debug.nwa') - shutil.copyfile(out/'uno-debug.nwa',out/'UNO.nwa');run(tool('strip'),'--strip-unneeded',out/'UNO.nwa') - # NumPlay's conventional standalone target reads output/.nwa. - if os.name!='nt':shutil.copyfile(out/'UNO.nwa',out/'uno.nwa') - # Module build leaves graphics, fonts and storage to the NumPlay launcher. - mod=[] - for source in ['main','uno']: - obj=out/('module-'+source+'.o');run(tool('gcc'),*flags,'-DNP_MODULE=1','-c',ROOT/'src'/(source+'.c'),'-o',obj);mod.append(obj) - run(*link,*mod,'-nostdlib','-o',out/'module.o') - from elftools.elf.elffile import ELFFile - profiles=[] - for name,base,ram in [('n0120',0x24000000,153676),('n0110',0x20000000,148928),('n0115',0x20000000,133652),('upsilon',0x20000000,107674)]: - opts=['--ram-start',hex(base+0x37000-ram),'--ram-length',str(ram)];elf=out/(name+'.elf');binary=out/(name+'.bin') - run(*nw,'nwa-elf',out/'UNO.nwa',elf,*opts);run(*nw,'nwa-bin',out/'UNO.nwa',binary,*opts) - debug=out/(name+'-debug.bin');run(*nw,'nwa-bin',out/'uno-debug.nwa',debug,*opts) - assert debug.read_bytes()==binary.read_bytes() - with elf.open('rb')as f: - e=ELFFile(f);sym={s.name:s.entry.st_value for s in e.get_section_by_name('.symtab').iter_symbols()};static_ram=sym['_heap_start']-sym['_data_section_start_ram'] - assert static_ram<20*1024,(name,static_ram) - profiles.append(dict(profile=name,static_ram=static_ram,installed_flash=binary.stat().st_size,available_ram=ram)) - result=dict(nwa_bytes=(out/'UNO.nwa').stat().st_size,save_bytes=768,profiles=profiles) - (out/'sizes.json').write_text(json.dumps(result,indent=2)+'\n');print(json.dumps(result,indent=2)) -if __name__=='__main__':main() diff --git a/games/uno/tools/test.py b/games/uno/tools/test.py deleted file mode 100644 index 11a119ae..00000000 --- a/games/uno/tools/test.py +++ /dev/null @@ -1,11 +0,0 @@ -import argparse, subprocess, os -from pathlib import Path -ROOT=Path(__file__).resolve().parents[1] -def main(): - ap=argparse.ArgumentParser();ap.add_argument('--cc',default='cc');a=ap.parse_args();out=ROOT/'output';out.mkdir(exist_ok=True) - for name,sources in [('engine',['tests/test_engine.c','src/uno.c']),('ui',['tests/test_ui.c','src/uno.c','../../launcher/src/gfx.c','../../launcher/src/font_data.c','../../launcher/src/xfont.c'])]: - exe=out/('test-'+name+('.exe'if os.name=='nt'else'')) - subprocess.run([a.cc,'-std=c11','-O2','-Wall','-Wextra','-Werror','-Wno-misleading-indentation','-Wno-unused-parameter', - '-ffunction-sections','-fdata-sections','-Itests',*sources,'-Wl,--gc-sections','-lm','-o',str(exe)],cwd=ROOT,check=True) - subprocess.run([str(exe)],cwd=out,check=True) -if __name__=='__main__':main() From b9e0ebe5a2e0ac04d38b33a67c679a8fd071994b Mon Sep 17 00:00:00 2001 From: Mason363 Date: Fri, 23 Oct 2026 15:06:59 -0400 Subject: [PATCH 3/4] UNO: docs and NumPlay's wiring UNO builds like Tomb of the Mask (BUILD_DIR, GAMES_REDIRECT, the apps and clean rules, BIG_APPS), with a big-game entry in games.json at rank 12, its release line, its emulator test and the CI's host test. It leaves the launcher's list and NumPlay-Upsilon, and the root README, play.md and the launcher's translations are back as they were. The game's README, its screenshots, the thumbnail and the GIF are new, made from the game's own cards. --- .github/workflows/build.yml | 2 +- Makefile | 10 +- README.md | 5 +- docs/media/thumb_uno.png | Bin 25578 -> 25312 bytes docs/media/uno.gif | Bin 0 -> 103690 bytes docs/play.md | 24 ---- games/games.json | 60 ++++----- games/uno/README.md | 221 +++++++++++++-------------------- games/uno/docs/challenge.png | Bin 11815 -> 22244 bytes games/uno/docs/colour.png | Bin 0 -> 20616 bytes games/uno/docs/gameplay.png | Bin 22733 -> 0 bytes games/uno/docs/interface.png | Bin 37978 -> 0 bytes games/uno/docs/launcher.png | Bin 26467 -> 0 bytes games/uno/docs/menu.png | Bin 12095 -> 0 bytes games/uno/docs/result.png | Bin 10167 -> 0 bytes games/uno/docs/reveal.png | Bin 0 -> 23276 bytes games/uno/docs/review.png | Bin 17820 -> 0 bytes games/uno/docs/scores.png | Bin 0 -> 19961 bytes games/uno/docs/settings.png | Bin 14623 -> 0 bytes games/uno/docs/setup.png | Bin 0 -> 13911 bytes games/uno/docs/shot.png | Bin 0 -> 27918 bytes games/uno/docs/table-rules.png | Bin 12156 -> 0 bytes games/uno/docs/title.png | Bin 0 -> 18630 bytes games/uno/docs/uno.png | Bin 0 -> 22967 bytes games/uno/docs/variants.png | Bin 17493 -> 0 bytes launcher/lang/fr.txt | 4 +- launcher/lang/zh.txt | 4 +- tests/test_games.py | 16 +-- tools/release.py | 1 + 29 files changed, 139 insertions(+), 208 deletions(-) create mode 100644 docs/media/uno.gif create mode 100644 games/uno/docs/colour.png delete mode 100644 games/uno/docs/gameplay.png delete mode 100644 games/uno/docs/interface.png delete mode 100644 games/uno/docs/launcher.png delete mode 100644 games/uno/docs/menu.png delete mode 100644 games/uno/docs/result.png create mode 100644 games/uno/docs/reveal.png delete mode 100644 games/uno/docs/review.png create mode 100644 games/uno/docs/scores.png delete mode 100644 games/uno/docs/settings.png create mode 100644 games/uno/docs/setup.png create mode 100644 games/uno/docs/shot.png delete mode 100644 games/uno/docs/table-rules.png create mode 100644 games/uno/docs/title.png create mode 100644 games/uno/docs/uno.png delete mode 100644 games/uno/docs/variants.png diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 49628a8f..dc29f093 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -86,7 +86,7 @@ jobs: make -C games/doodlejump host test make -C games/stickmanhook host test make -C games/coreball host test - make -C games/uno test HOST_CC=gcc + make -C games/uno host test diff --git a/Makefile b/Makefile index ae93ef1b..8a91de02 100644 --- a/Makefile +++ b/Makefile @@ -18,7 +18,7 @@ PY ?= python3 CARGO ?= cargo B = build/data # Conventional games honor a configurable output directory; special layouts are kept local. -GAMES_REDIRECT = balatro blockblast breakout buckshot celeste championisland chess connectfour cookieclicker coreball dinorun donkeykong doodlejump doom dune finalearth2 flappybird flappydunk fnaf g2048 hillclimb hollowknight invaders isaac jetpackjoyride leveldevil minesweeper monkeymart numblocks numpowder numvisuals pacman portal pvz snake sokoban solitaire sonic stickmanhook subway sudoku suika tombofthemask towerblock twoplayer undertale uttt +GAMES_REDIRECT = balatro blockblast breakout buckshot celeste championisland chess connectfour cookieclicker coreball dinorun donkeykong doodlejump doom dune finalearth2 flappybird flappydunk fnaf g2048 hillclimb hollowknight invaders isaac jetpackjoyride leveldevil minesweeper monkeymart numblocks numpowder numvisuals pacman portal pvz snake sokoban solitaire sonic stickmanhook subway sudoku suika tombofthemask towerblock twoplayer undertale uno uttt GAMES_OUT = dinorun GAME_REDIRECT_ARG = $(if $(filter $(1),$(GAMES_OUT)),OUT=../../$(B)/games/$(1),BUILD_DIR=../../$(B)/games/$(1)) # the RAM the oldest calculator software that runs apps gives them (23.2: 148928 bytes; 25.2 gives 153676). @@ -29,7 +29,7 @@ RAM_LIMIT = 148928 # custom builds of Epsilon 25.2's source give apps less: 133652 bytes; every game fits there too, in NumPlay and on # its own (their big buffers are on the stack, 32 KB apart from that RAM, or in the RAM the software has left) CUSTOM_RAM = 133652 -BIG_APPS = Celeste HollowKnight Undertale ChampionIsland FinalEarth2 NumPowder NumBlocks NumDrive SubwaySurfers FiveNightsAtFreddys Doom BindingOfIsaac HillClimbRacing PlantsVsZombies SonicTheHedgehog CookieClicker LevelDevil JetpackJoyride StickmanHook DonkeyKong Dune MonkeyMart TombOfTheMask +BIG_APPS = Celeste HollowKnight Undertale ChampionIsland FinalEarth2 NumPowder NumBlocks NumDrive SubwaySurfers FiveNightsAtFreddys Doom BindingOfIsaac HillClimbRacing PlantsVsZombies SonicTheHedgehog CookieClicker LevelDevil JetpackJoyride StickmanHook DonkeyKong Dune MonkeyMart TombOfTheMask UNO # the calculator's space for installed apps: from the end of its software (64 KiB aligned) to 64 KiB before the # end of its 4 MiB slot of flash, 0x903F0000. The software's size sets the start: 0x90200000 is the latest a # NumPlay counts on (1.94 MB, APP_SPACE); Epsilon 26.4 on an N0120 ends at 0x90180000 (2.44 MB, the @@ -52,7 +52,7 @@ APP_SPACE_APPS = HillClimbRacing # the games that fit it (NumPlay draws their text there: see launcher/src/compat.c) UPSILON_RAM = 107674 UPSILON_GAMES = crossyroad blockblast suika portal tetris dinorun doodlejump chess flappybird flappydunk towerblock coreball pacman \ - snake connectfour solitaire g2048 minesweeper breakout twoplayer invaders sudoku uttt sokoban uno + snake connectfour solitaire g2048 minesweeper breakout twoplayer invaders sudoku uttt sokoban # NumPlay and its discreet versions: the same app, with another name and icon # on the calculator's home screen. Each one is a release file. @@ -321,6 +321,7 @@ APP_donkeykong = $(B)/games/donkeykong/donkeykong.nwa:DonkeyKong.nwa APP_dune = $(B)/games/dune/dune.nwa:Dune.nwa APP_monkeymart = $(B)/games/monkeymart/monkeymart.nwa:MonkeyMart.nwa APP_tombofthemask = $(B)/games/tombofthemask/tombofthemask.nwa:TombOfTheMask.nwa +APP_uno = $(B)/games/uno/uno.nwa:UNO.nwa # the big games' modules are made from these (the kit) $(foreach g,$(XL_GAMES),$(eval MOD_$(g) = $$(word 1,$$(subst :, ,$$(APP_$(g)))))) @@ -354,6 +355,7 @@ apps: | $(B) $(MAKE) -C games/dune build NWLINK="$(NWLINK)" BUILD_DIR=../../$(B)/games/dune $(MAKE) -C games/monkeymart build NWLINK="$(NWLINK)" BUILD_DIR=../../$(B)/games/monkeymart $(MAKE) -C games/tombofthemask build NWLINK="$(NWLINK)" BUILD_DIR=../../$(B)/games/tombofthemask + $(MAKE) -C games/uno build NWLINK="$(NWLINK)" BUILD_DIR=../../$(B)/games/uno cd games/tetris/tetris && NWLINK="$(NWLINK)" $(CARGO) build --release --quiet cp $(word 1,$(subst :, ,$(APP_numdash))) $(B)/apps/$(word 2,$(subst :, ,$(APP_numdash))) cp $(word 1,$(subst :, ,$(APP_crossyroad))) $(B)/apps/$(word 2,$(subst :, ,$(APP_crossyroad))) @@ -385,6 +387,7 @@ apps: | $(B) cp $(word 1,$(subst :, ,$(APP_dune))) $(B)/apps/$(word 2,$(subst :, ,$(APP_dune))) cp $(word 1,$(subst :, ,$(APP_monkeymart))) $(B)/apps/$(word 2,$(subst :, ,$(APP_monkeymart))) cp $(word 1,$(subst :, ,$(APP_tombofthemask))) $(B)/apps/$(word 2,$(subst :, ,$(APP_tombofthemask))) + cp $(word 1,$(subst :, ,$(APP_uno))) $(B)/apps/$(word 2,$(subst :, ,$(APP_uno))) arm-none-eabi-strip --strip-unneeded $(B)/apps/Tetris.nwa STD_APPS = $(foreach g,$(STD_GAMES),$(B)/apps/$(NWA_$(g))) @@ -456,5 +459,6 @@ clean: -$(MAKE) -C games/dune clean -$(MAKE) -C games/monkeymart clean -$(MAKE) -C games/tombofthemask clean + -$(MAKE) -C games/uno clean -cd games/tetris/tetris && $(CARGO) clean -$(foreach g,$(STD_GAMES),$(MAKE) -C games/$(g) clean;) diff --git a/README.md b/README.md index f9541a69..ece2d770 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@

NumPlay

- 30 free games for your NumWorks calculator, in one app.
+ 29 free games for your NumWorks calculator, in one app.
Plus 21 big games that install on their own. For the N0110, N0115 and N0120, in English, French and Chinese.

@@ -82,7 +82,6 @@ All of these come in one app, **NumPlay.nwa**.
Sudoku
Sudoku
Ultimate Tic-Tac-Toe
Ultimate Tic-Tac-Toe
Sokoban
Sokoban
- UNO
UNO
@@ -307,8 +306,6 @@ Read **[Make your own NumWorks game](docs/make-a-game.md)** to go from there, an ## Credits -- **[Bobydeluxe](https://github.com/Bobydeluxe)** made **[UNO](games/uno/README.md)** for NumPlay: play against one to three bots, choose table rules, and win by emptying your hand. Card and table art by **[AlexDer](https://alexder.itch.io/uno-card-game-asset-pack)**. UNO belongs to Mattel; this is an unofficial fan adaptation. - NumPlay is a fan project, made out of love for these games and for the NumWorks calculator. If you enjoy a game here, go play the original and support the people who made it. NumWorks also has a great community of people making games by hand: try [Numcraft](https://github.com/yannis300307/NumcraftRust), [Celeste Classic](https://github.com/BenchatonDev/Celeste-Numworks), [Tatone26's All the Apps](https://github.com/Tatone26/Numworks-games), the apps on [Nwagyu](https://nwagyu.org/guide/) and [yannis300307's list](https://gist.github.com/yannis300307/9123136f90877107ec0d49ba96b303e5). - **[Tatone26](https://github.com/Tatone26/Numworks-games)**'s **All the Apps** inspired NumPlay's list of classics. Flappy Bird, Pac-Man, Snake, Connect Four, Solitaire and 2048 are written in C for NumPlay and keep its options, with no code copied from it. Tetris is Tatone26's own, which they released into the public domain, adapted for NumPlay. diff --git a/docs/media/thumb_uno.png b/docs/media/thumb_uno.png index 73542b8e63bd3a5a2125ee8bbba657b798d25215..c919692771db4dcb33baed731adcbddb0a7d1db3 100644 GIT binary patch literal 25312 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 - - -## UNO - -Play against one, two or three bots. Create a table in three steps: Players, -Rules, then Ready. The first player with no cards wins; there are no points. -Classic card effects are the default, with optional +2/+4 stacking, drawing until -playable, forced drawn play and automatic UNO. Stacked +4 disables challenges. - -| Key | What it does | -| --- | --- | -| **Left / Right** | Select a card, including while bots play | -| **OK / EXE** | Play the selected card or confirm a choice | -| **Up / Down** | Action buttons / return to your hand | -| **1** | Draw or accept a draw penalty | -| **2** | Keep the drawn card, if allowed | -| **0** | Call UNO or catch a bot that forgot | -| **Back** | Pause; return from menus | -| **Home / Power** | Save and quit | - -The turn banner and gold outline identify the current player. DRAW and DISCARD -are separate piles; the color tile names the active color. Gold dots mark cards -you can play. The selected card is enlarged, with its name and playability below. -`Play again` keeps the same table rules. [Full rules and credits](../games/uno/README.md). diff --git a/games/games.json b/games/games.json index 42aa0d36..75ccd0e6 100644 --- a/games/games.json +++ b/games/games.json @@ -570,25 +570,6 @@ "app": "Sokoban.nwa", "repo": "https://github.com/Mason363/NumPlay/tree/main/games/sokoban" }, - { - "id": "uno", - "rank": 30, - "title": "UNO", - "tagline": "Empty your hand against up to three bots", - "credit": "Game made by Bobydeluxe", - "top": "0x347052", - "bottom": "0x0B2925", - "accent": "0xFFD75B", - "colors": 32, - "records": [ - "uno.sav" - ], - "shots": [ - "docs/gameplay.png" - ], - "app": "UNO.nwa", - "repo": "https://github.com/Mason363/NumPlay/tree/main/games/uno" - }, { "id": "retrogo", "rank": 30, @@ -696,7 +677,7 @@ }, { "id": "championisland", - "rank": 18, + "rank": 19, "title": "Champion Island", "tagline": "Seven sports, one island", "credit": "Based on Google's Champion Island Games", @@ -718,7 +699,7 @@ }, { "id": "finalearth2", - "rank": 19, + "rank": 20, "title": "The Final Earth 2", "tagline": "Build a city in space", "credit": "Based on the game by Florian van Strien", @@ -740,7 +721,7 @@ }, { "id": "numpowder", - "rank": 14, + "rank": 15, "title": "NumPowder", "tagline": "Sand, water, fire and more", "credit": "Inspired by The Powder Toy", @@ -794,7 +775,7 @@ }, { "id": "fnaf", - "rank": 12, + "rank": 13, "title": "Five Nights at Freddy's", "tagline": "Survive five nights", "credit": "Based on the game by Scott Cawthon", @@ -855,7 +836,7 @@ }, { "id": "isaac", - "rank": 16, + "rank": 17, "title": "The Binding of Isaac", "tagline": "Cry through the basement", "credit": "Based on the game by Edmund McMillen", @@ -877,7 +858,7 @@ }, { "id": "hillclimb", - "rank": 17, + "rank": 18, "title": "Hill Climb Racing", "tagline": "Drive up, don't flip", "credit": "Based on Hill Climb Racing by Fingersoft", @@ -921,7 +902,7 @@ }, { "id": "sonic", - "rank": 15, + "rank": 16, "title": "Sonic the Hedgehog", "tagline": "Run through six zones", "credit": "Based on the game by Sonic Team", @@ -942,7 +923,7 @@ }, { "id": "cookieclicker", - "rank": 21, + "rank": 22, "title": "Cookie Clicker", "tagline": "Bake billions of cookies", "credit": "Based on Cookie Clicker by Orteil", @@ -963,7 +944,7 @@ }, { "id": "leveldevil", - "rank": 20, + "rank": 21, "title": "Level Devil", "tagline": "Run to the door", "credit": "Based on Level Devil by Unept", @@ -1026,7 +1007,7 @@ }, { "id": "donkeykong", - "rank": 13, + "rank": 14, "title": "Donkey Kong", "tagline": "Climb the girders and save Pauline", "credit": "Based on Donkey Kong by Nintendo", @@ -1107,5 +1088,26 @@ "repo": "https://github.com/Mason363/NumPlay/tree/main/games/tombofthemask", "default": false, "xl": true + }, + { + "id": "uno", + "rank": 12, + "title": "UNO", + "tagline": "Match the cards, shout UNO", + "credit": "Based on UNO by Mattel", + "top": "0x1F6B4A", + "bottom": "0x0B3324", + "accent": "0xE53935", + "colors": 16, + "records": [ + "uno.sav", + "uno_saves.py" + ], + "shots": [ + "docs/shot.png" + ], + "repo": "https://github.com/Mason363/NumPlay/tree/main/games/uno", + "default": false, + "xl": true } ] diff --git a/games/uno/README.md b/games/uno/README.md index a399bd0e..6cfbb98d 100644 --- a/games/uno/README.md +++ b/games/uno/README.md @@ -1,135 +1,88 @@ -# UNO - -A native, English-language UNO game for NumPlay and NumWorks. One human plays -against one, two or three bots on a 320 × 240 card table, using AlexDer's card art. -No browser, sound files, full-screen framebuffer or runtime asset download is needed. - -This is an unofficial fan adaptation. Game made by **Bobydeluxe**; card and table -art by **AlexDer**. See [ASSETS.md](ASSETS.md) for asset provenance. - -## Play - -Install `output/UNO.nwa` with the usual NumWorks external-app installer. -`Continue` restores the saved match; `New game` opens the table settings. -The app asks before replacing an unfinished game. Changing settings does not -alter the rules of an existing match. - -Creating a table has three visible steps: **Players**, **Rules**, then **Ready**. -The first step previews your seat and the bot seats while you choose the player -count and bot level. The second keeps all five variants on screen -with On/Off switches and an explanation for the selected rule. The last step -summarizes the whole table before `Deal cards`. Back returns to the previous -step without discarding your choices. - -During play, bots sit around the piles, with the current player outlined in -gold. A turn banner stays at the top. `DRAW` and `DISCARD` label the separate -piles, and a named color tile shows the active color, including after Wilds. -Your hand stays in its own lower area; the selected card is enlarged and drawn -in front of its neighbors. Its name, index and playability stay visible below. -You can browse your hand while the bots take their turns. Action buttons show -their shortcuts and keyboard focus skips unavailable actions. - -| Key | Action | +> **UNO is a [NumPlay](../../README.md) game that comes on its own.** It is too big to fit next to NumPlay on the calculator. Get `UNO.nwa` from the [latest release](https://github.com/Mason363/NumPlay/releases/latest). + +

+ UNO icon +

+ +

UNO

+ +

+ The card game against one to three bots, on the NumWorks calculator.
+ The official rules, the 108-card deck and scoring to 500 points. +

+ +
+ +

+ UNO: the bots play their cards in turn, then you pick a card in your hand and play it +

+ +## Highlights + +* **The official rules:** the 108-card deck, Skip, Reverse, Draw Two, Wild and Wild Draw Four, with the first card's effect, drawing a card you may play at once, and the two-player rules (Reverse and Skip let you play again). +* **The Wild Draw Four challenge:** it's only allowed with no card of the colour in play, but anyone can bluff. Challenge it and see the hand: a bluffer draws 4, otherwise you draw 6. +* **UNO!** Say it as you play your next-to-last card. Forget, and a bot may catch you for 2 cards. Catch a bot that forgot. +* **Scoring to 500:** the winner of each hand scores the cards left in the others' hands, and the deal moves to the left, until someone has 500 points. Or play a single hand. +* **Bots at three levels:** Easy plays any card that goes; Normal saves its Wilds and stops a player about to go out; Hard also counts the cards it has seen, plays to the colours you lack and may bluff. +* **House rules, if you want them:** stacking Draw Twos or Wild Draw Fours, drawing until you can play, having to play a drawn card, and UNO said for everyone. All off by default. +* **Saved as you go:** Home saves and quits, from anywhere. Your game is also copied into `uno_saves.py`, so installing the app again doesn't erase it. + + + + + + + + + + + + + + + + + + +
Your turn at a table of four
Your turn: the cards that go are lit
Calling a colour
A Wild: call a colour
A Wild Draw Four played on you
A Wild Draw Four: take it or challenge
The challenged hand
The challenged hand, shown to you
Two cards left
Two cards left: time to say UNO
The scores after a hand
A hand won, on the way to 500
A new game
A new game: players, bots, length and house rules
The title screen
The title screen
+ +## How to play + +Match the top card of the discard pile by colour, number or symbol, or play a Wild, which goes on anything. You can also draw a card instead; if it goes, you may play it at once. The coloured frame round the discard pile shows the colour to match, also after a Wild. + +Skip makes the next player miss a turn, Reverse turns play round, and Draw Two makes the next player draw 2 and miss a turn. With a Wild you call the colour. A Wild Draw Four also makes the next player draw 4 and miss a turn, and it's only allowed when you have no card of the colour in play. The next player may challenge it: if it was a bluff, its player draws the 4; if not, the challenger draws 6. + +Press **shift** as you play your next-to-last card, to say UNO. If you forget, anyone who catches you before the next player starts makes you draw 2; say it in time and you're safe. When a bot forgets, **shift** catches it. The first to play all their cards wins the hand and scores the cards left in the others' hands: numbers at face value, Skip, Reverse and Draw Two 20, Wilds 50. The first to 500 points wins the game. + +## Controls + +| Key | What it does | | --- | --- | -| Left / Right | Select a card; hold to scroll large hands | -| OK / EXE | Play the selected card or confirm a menu item | -| Up / Down | Enter the action buttons / return to your hand | -| 1 | Draw a card, or accept a pending draw penalty | -| 2 | Keep the card you just drew, if permitted | -| 0 | Call UNO, prepare the call before playing from two cards, or catch a bot | -| Back | Pause; return from menus | -| Home / Power | Save and exit safely | - -Gold dots mark playable cards. The lifted card has a readable native-text name. -The hand scrolls to show every card; it is never truncated at a small hand limit. -The color tile is the active color, including after a Wild. `S`, `R`, `+2`, `W` -and `+4` in the card corners identify the special cards. - -## Classic rules - -This version plays **one game, won by the first empty hand**, using the -classic 108-card deck and Mattel's -[classic instructions](https://service.mattel.com/instruction_sheets/B0001-Eng.pdf) -and [two-player instructions](https://service.mattel.com/instruction_sheets/53641.pdf) -for card effects. There is no point system or multi-round target. It excludes -the extra customizable cards in some newer physical editions. - -- Deal seven cards each. A high-card draw selects the initial dealer; subsequent - rounds move the dealer clockwise. Opening action cards are applied, and an - opening +4 is returned to the shuffled draw pile. -- Match color, number or symbol. You may draw instead of playing. After drawing, - you may only play the newly drawn card, or keep it and end the turn. -- Skip skips the next player. Reverse changes direction; with two players it - acts as a Skip. +2 makes the next player draw two and miss their turn. -- Wild chooses the color. +4 is legal only if its player holds no card of the - active color. Bluffing is possible: only the target may challenge. A guilty - offender draws four and the target keeps their turn; otherwise the challenger - draws six and loses their turn. A human challenge reveals the offender's hand. -- Call UNO when playing down to one card. You can prepare the call with two - cards or call immediately afterward. A missed call is only penalized when - caught before the next player draws or plays; the penalty is two cards. Bots - have a reaction delay, and sometimes miss calls or fail to catch them. -- The first player with no cards wins the game. A final +2/+4 and any challenge - are resolved before showing the winner. `Play again` starts a fresh game with - the same table rules, or you can return to the menu. -- Exhausted draw piles recycle all discards except the top card. In the rare - finite-deck situation where everyone is blocked with nothing left to draw, - redeal the cards. - -## Optional house rules - -Settings clearly label altered tables as **Custom**. Each option defaults to off. - -| Option | Behavior | -| --- | --- | -| Stack +2 | Play one +2 on a pending +2; the accumulated penalty passes on | -| Stack +4 | Play one +4 on a pending +4; the last chosen color applies | -| Draw until playable | Continue drawing until a playable card appears or the pile cannot refill | -| Force drawn play | A playable drawn card must be played; a drawn Wild still requires a color choice | -| Automatic UNO | Call UNO automatically for every player | - -Stacking never mixes +2 and +4, and stops after a last card: its penalty is paid -before the win is confirmed. **Stacked +4 disables challenges**, a stated house-rule choice -that avoids combining incompatible penalty/challenge interpretations. -`Classic` resets all variants; player count and bot difficulty remain independent -choices. Every table uses the same first-empty-hand winning condition. - -Casual bots choose less carefully. Normal bots favor their remaining colors and -prioritize action cards. Clever bots also consider public opponent card counts and -the direction of play when choosing action cards. Bots never inspect opponents' -hidden hands to decide a play or challenge. - -## Build and validate - -Requires ARM GCC, nwlink 1.0.0, Python and pyelftools. Pillow is only needed to -regenerate assets from the user's original ZIP. Generated assets are committed; -the ZIP is not needed for a normal build. - -```sh -python3 tools/build.py --toolchain /path/to/arm/bin --nwlink /path/to/nwlink -python3 tools/test.py --cc cc -python3 tests/test_arm.py --nwlink /path/to/nwlink -python3 tests/test_integration.py --nwlink /path/to/nwlink -``` - -`make build`, `make test` and `make test-arm` wrap these commands. `HOST_CC`, -`PYTHON`, `NWLINK` and `TOOLCHAIN` can be overridden. -The build creates `output/UNO.nwa`, a symbol-bearing debug NWA, installed binaries -for four firmware/RAM profiles, and `output/module.o` for NumPlay launcher -integration. NumPlay includes UNO in its catalogue and exports the standalone -app as `UNO.nwa`; the module uses the shared graphics, storage and backup. - -The engine uses a bounded 108-card deck and fixed-size hands, with no heap. -Card sprites share a 31-color palette and use transparent row RLE; only a single -44-byte row is decoded at a time. A small original table sample is smoothly -scaled, and the native fonts draw the UI directly. LCD drawing uses 16-row -strips, and an unchanged table sleeps instead of redrawing continuously. - -Saves use a versioned 768-byte record with explicit little-endian fields, CRC32 -and full deck/state validation before loading. Full-storage failures offer retry -or an explicit exit without saving. Standalone builds use NumPlay's existing -Epsilon/Upsilon safe-exit and storage helpers. -Save version 2 also reads version 1: ongoing hands are retained, old point totals -and targets are dropped, and a previously won round becomes a finished game. - -See [VALIDATION.md](VALIDATION.md) for measured size and validation limits. +| Left and Right | Pick a card in your hand | +| OK | Play the card | +| Up | Draw a card, keep the card you drew, or take the cards you have to | +| shift | Say UNO, or catch a bot that forgot | +| Back | Pause (Resume, New game, How to play, Quit game) | +| Home | Save and quit | + +## Good to know + +* **On its own:** UNO is too big to fit next to NumPlay. Installing it from the NumWorks website swaps out NumPlay and the other apps, and installing NumPlay again swaps it back out. +* **The classic deck:** the 108 cards of the classic game, without the blank cards and Wild Shuffle Hands of newer decks. +* **The table:** you and one to three bots. The original takes up to ten players. + +## Credits + +Inspired by [UNO](https://www.mattel.com/brands/uno), the card game by Mattel, not affiliated with Mattel. Go play the original with your friends, or the official app. + +* The rules and scoring follow Mattel's instruction sheet. The cards are drawn by the game itself, after the classic deck's look, and the text uses NumPlay's **Nunito** font (SIL Open Font License). +* The calculator adaptation is by **[Bobydeluxe](https://github.com/Bobydeluxe)**, who brought it to NumPlay. + +Made by Mason Chen as part of NumPlay. + +## License + +The game's code is licensed under the GNU General Public License v3.0: see the `LICENSE` file at the root of the repository. UNO is a trademark of Mattel. diff --git a/games/uno/docs/challenge.png b/games/uno/docs/challenge.png index 15c6de95fc970483b6e07995e725dbcf37be2c94..4b5c7a02d98e7ad4356b7e4e1824e29e96247573 100644 GIT binary patch literal 22244 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 literal 11815 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 TsWgUc{QwkXRHf@B&BFgLb$ZP< diff --git a/games/uno/docs/colour.png b/games/uno/docs/colour.png new file mode 100644 index 0000000000000000000000000000000000000000..f93acbee7c35ecaadfc681949adea804801e499f GIT binary patch literal 20616 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 diff --git a/games/uno/docs/interface.png b/games/uno/docs/interface.png deleted file mode 100644 index 6badf07843bf568649b6865bc10fe3aef9cf76fa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 37978 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 diff --git a/games/uno/docs/launcher.png b/games/uno/docs/launcher.png deleted file mode 100644 index 275663937091c4e50cdfd18d0a6915111b559e9e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26467 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 BatQzc diff --git a/games/uno/docs/menu.png b/games/uno/docs/menu.png deleted file mode 100644 index b3cd969bcf0737d59c41b3e3d58c5668bd24af16..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12095 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 XWu}6==@TJ1F&-czsVGq;W*G24SyO{e diff --git a/games/uno/docs/result.png b/games/uno/docs/result.png deleted file mode 100644 index 5a5a5fff4d7082c72ef3283de69df574d5f21c8b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10167 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 literal 0 HcmV?d00001 diff --git a/games/uno/docs/review.png b/games/uno/docs/review.png deleted file mode 100644 index 43df710af522970896617c9fdd12f484b9ca670e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17820 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 literal 0 HcmV?d00001 diff --git a/games/uno/docs/settings.png b/games/uno/docs/settings.png deleted file mode 100644 index 4d8ad0a9755d301d4633c19c034974b67786fe09..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14623 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 QA0I&^Mdd`Qg$x4!4~(L7Y5)KL diff --git a/games/uno/docs/setup.png b/games/uno/docs/setup.png new file mode 100644 index 0000000000000000000000000000000000000000..392608d5d92ae3cc7548249274980a680056b6ab GIT binary patch literal 13911 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 literal 0 HcmV?d00001 diff --git a/games/uno/docs/shot.png b/games/uno/docs/shot.png new file mode 100644 index 0000000000000000000000000000000000000000..0457c60f1b1007a7192c33bc2fa22a00f08f9e8e GIT binary patch literal 27918 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 diff --git a/games/uno/docs/title.png b/games/uno/docs/title.png new file mode 100644 index 0000000000000000000000000000000000000000..b27781794f1a3242d9339f7a42f059a8dbc9c11a GIT binary patch literal 18630 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 N002ovPDHLkV1mmLXDa{z literal 0 HcmV?d00001 diff --git a/games/uno/docs/uno.png b/games/uno/docs/uno.png new file mode 100644 index 0000000000000000000000000000000000000000..a91e730918d655e2733ce8fe302ef70d66883a12 GIT binary patch literal 22967 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 ili;pr2Z6v^ivJ(~Y4ESdS7^=v0000= 10, lambda v: v[4] == 0 and struct.unpack_from("= 1), # best kept, shake off # Air Hockey and the easy computer chosen; then the normal computer and Tanks, the tallies kept diff --git a/tools/release.py b/tools/release.py index f054f180..0b1c27c2 100644 --- a/tools/release.py +++ b/tools/release.py @@ -48,6 +48,7 @@ "dune": ("Dune", "roll down the dunes and fly over the line, with the shop's 26 balls and 7 landscapes"), "monkeymart": ("Monkey Mart", "run a grocery mart as a monkey, both marts: crops, animals, machines and workers"), "tombofthemask": ("Tomb of the Mask", "dash through the tomb: the endless arcade climb and all 200 stages, with the 16 masks"), + "uno": ("UNO", "the card game against one to three bots, with the official rules and scoring to 500"), } VARIANTS = [ ("NumPlay-Invisible.nwa", "The same app, hidden: a blank icon with no name"), From 553ceadf9c842641186371c0337f7a5614edea70 Mon Sep 17 00:00:00 2001 From: Mason363 Date: Fri, 23 Oct 2026 15:09:16 -0400 Subject: [PATCH 4/4] README: UNO, the 22nd big game --- README.md | 10 ++++++++-- docs/play.md | 16 ++++++++++++++++ 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index ece2d770..f2fc2527 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@

29 free games for your NumWorks calculator, in one app.
- Plus 21 big games that install on their own. For the N0110, N0115 and N0120, in English, French and Chinese. + Plus 22 big games that install on their own. For the N0110, N0115 and N0120, in English, French and Chinese.

@@ -130,8 +130,11 @@ These are too big to fit next to NumPlay, so each one is its own app. Install it Tomb of the Mask
Tomb of the Mask

Dash through the tomb: the arcade climb and all 200 stages
Download + UNO
UNO

The card game against one to three bots, to 500 points
Download Super Mario 64
In a repository of its own: NumWorks-Super-Mario-64 Super Mario Bros.
All 32 stages, in a repository of its own: NumWorks-Super-Mario-Bros + + More on the way
Minecraft 1.18.2 and more: see the roadmap @@ -274,6 +277,7 @@ Read **[Make your own NumWorks game](docs/make-a-game.md)** to go from there, an - [x] Dune - [x] Monkey Mart - [x] Tomb of the Mask +- [x] UNO - [x] [NumPlay Studio](https://mason363.github.io/NumPlay/customize/), the website where you pick the games in your NumPlay, with Enlarged Extra Apps to fit several big games - [ ] Full Minecraft 1.18.2 as a standalone app - [ ] Among Us, against bots @@ -337,6 +341,7 @@ NumPlay is a fan project, made out of love for these games and for the NumWorks - **Dune!** by Team Lava inspired NumPlay's Dune, which ports Dune Rider, Inlogic Software's web version: its pictures, Bango Pro lettering and numbers, and its physics, [p2.js](https://github.com/schteppe/p2.js) by Stefan Hedman (MIT License), written again in C. **[Bobydeluxe](https://github.com/Bobydeluxe)** brought it to NumPlay. Not affiliated with Team Lava or Inlogic Software. - **Monkey Mart** by TinyDobbins inspired NumPlay's Monkey Mart, which follows the rules, timings and numbers of the game's web version and uses its pictures, its monkeys and animals and the **Riffic** font from it. **[Bobydeluxe](https://github.com/Bobydeluxe)** brought it to NumPlay. Not affiliated with TinyDobbins. - **Tomb of the Mask** by Playgendary inspired NumPlay's Tomb of the Mask, which follows the rules of the game's web version and uses its stages, pictures and pixel font. **[Bobydeluxe](https://github.com/Bobydeluxe)** brought it to NumPlay. Not affiliated with Playgendary. +- **UNO** by Mattel inspired NumPlay's UNO, which plays by the official rules with cards drawn for the calculator. **[Bobydeluxe](https://github.com/Bobydeluxe)** brought it to NumPlay. Not affiliated with Mattel. - **[Level Devil](https://store.steampowered.com/app/3242750/)** by Unept: NumPlay's Level Devil is written in C with no code from the game, but its 80 rooms (their tiles, traps and timing) are the game's own, taken from its web build by games/leveldevil/tools/fetch.py, and its runner is drawn from the game's sprites. - **Pong** by Atari (1972) inspired NumPlay's 2 Players, with air hockey, tanks in a maze in the spirit of Tank Trouble and the light cycles of Tron. All four are written in C for NumPlay and drawn from shapes, with no code or art from them. @@ -365,7 +370,7 @@ NumPlay is a fan project, made out of love for these games and for the NumWorks NumPlay is licensed under the [GNU General Public License v3.0](LICENSE). Copyright (c) 2026 Mason Chen. Code and fonts from others keep their own licenses: the `UNLICENSE` files in the games' folders and the [LICENSES](LICENSES) folder. The names, artwork and music of the games NumPlay is inspired by belong to their makers and are not covered by it. -Unofficial fan games, not affiliated with NumWorks, RobTop Games (Geometry Dash), Hipster Whale (Crossy Road), the makers of Drive Mad, LocalThunk or Playstack (Balatro), Mike Klubnika or Critical Reflex (Buckshot Roulette), Hungry Studio (Block Blast!), Aladdin X (Suika Game), Voodoo (Flappy Dunk), Lima Sky (Doodle Jump), Mojang or Microsoft (Minecraft), Maddy Makes Games (Celeste), Team Cherry (Hollow Knight), Toby Fox (Undertale), id Software (Doom), Edmund McMillen, Florian Himsl or Nicalis (The Binding of Isaac), PopCap Games or Electronic Arts (Plants vs. Zombies), Scott Cawthon (Five Nights at Freddy's), SEGA (Sonic the Hedgehog, Master System, Game Gear), SYBO or Kiloo (Subway Surfers), Fingersoft (Hill Climb Racing), Unept (Level Devil), Halfbrick (Jetpack Joyride), Madbox (Stickman Hook), Nintendo (Donkey Kong, Game Boy, NES), Team Lava (Dune!), Inlogic Software (Dune Rider), TinyDobbins (Monkey Mart), Playgendary (Tomb of the Mask), Atari (Pong), Disney (Tron), Orteil or DashNet (Cookie Clicker), Taito or Midway (Space Invaders), Thinking Rabbit or Falcon (Sokoban), Florian van Strien (The Final Earth 2), The Powder Toy's developers (The Powder Toy), MateoConLechuga (Portal Returns), Valve (Portal), .GEARS (Flappy Bird), Bandai Namco (Pac-Man), Hasbro (Connect Four), Google (Snake, Solitaire, Block Breaker, Chrome Dino, Doodle Champion Island Games), STUDIO4°C or Microsoft (Minesweeper), ducalex (Retro-Go). Tetris is a trademark of The Tetris Company, Chrome of Google LLC, Minecraft of Mojang Synergies AB, Pac-Man of Bandai Namco, Connect Four of Hasbro, DOOM of ZeniMax Media, Sonic the Hedgehog, Master System and Game Gear of SEGA, Space Invaders of Taito, and Donkey Kong, Game Boy, Game Boy Color and NES of Nintendo. +Unofficial fan games, not affiliated with NumWorks, RobTop Games (Geometry Dash), Hipster Whale (Crossy Road), the makers of Drive Mad, LocalThunk or Playstack (Balatro), Mike Klubnika or Critical Reflex (Buckshot Roulette), Hungry Studio (Block Blast!), Aladdin X (Suika Game), Voodoo (Flappy Dunk), Lima Sky (Doodle Jump), Mojang or Microsoft (Minecraft), Maddy Makes Games (Celeste), Team Cherry (Hollow Knight), Toby Fox (Undertale), id Software (Doom), Edmund McMillen, Florian Himsl or Nicalis (The Binding of Isaac), PopCap Games or Electronic Arts (Plants vs. Zombies), Scott Cawthon (Five Nights at Freddy's), SEGA (Sonic the Hedgehog, Master System, Game Gear), SYBO or Kiloo (Subway Surfers), Fingersoft (Hill Climb Racing), Unept (Level Devil), Halfbrick (Jetpack Joyride), Madbox (Stickman Hook), Nintendo (Donkey Kong, Game Boy, NES), Team Lava (Dune!), Inlogic Software (Dune Rider), TinyDobbins (Monkey Mart), Playgendary (Tomb of the Mask), Mattel (UNO), Atari (Pong), Disney (Tron), Orteil or DashNet (Cookie Clicker), Taito or Midway (Space Invaders), Thinking Rabbit or Falcon (Sokoban), Florian van Strien (The Final Earth 2), The Powder Toy's developers (The Powder Toy), MateoConLechuga (Portal Returns), Valve (Portal), .GEARS (Flappy Bird), Bandai Namco (Pac-Man), Hasbro (Connect Four), Google (Snake, Solitaire, Block Breaker, Chrome Dino, Doodle Champion Island Games), STUDIO4°C or Microsoft (Minesweeper), ducalex (Retro-Go). Tetris is a trademark of The Tetris Company, Chrome of Google LLC, Minecraft of Mojang Synergies AB, Pac-Man of Bandai Namco, Connect Four of Hasbro, DOOM of ZeniMax Media, Sonic the Hedgehog, Master System and Game Gear of SEGA, Space Invaders of Taito, UNO of Mattel, and Donkey Kong, Game Boy, Game Boy Color and NES of Nintendo. ## Gallery @@ -453,5 +458,6 @@ NumPlay is licensed under the [GNU General Public License v3.0](LICENSE). Copyri Monkey Mart: the monkey carries bananas and milk to the shelves while the customers shop
Monkey Mart Tomb of the Mask: dashing up the tomb ahead of the rising flood
Tomb of the Mask + UNO: a hand against three bots, a Draw Two and a colour called
UNO diff --git a/docs/play.md b/docs/play.md index 76432b24..ae9d6b81 100644 --- a/docs/play.md +++ b/docs/play.md @@ -565,6 +565,22 @@ Dash up the tomb ahead of the rising flood, picking up dots and coins and dodgin
+## UNO + +UNO + +| Key | What it does | +| --- | --- | +| **Left, Right** | Pick a card | +| **OK** | Play it | +| **Up** | Draw | +| **shift** | Say UNO, or catch a bot that didn't | +| **Back** | Pause (with New game, How to play and Quit) | + +Match the top card by colour or number, or play a Wild. Skip, Reverse, Draw Two and Wild Draw Four work as in the official rules, and you can challenge a Wild Draw Four. Say UNO when you're down to one card. The first to empty their hand scores the others' cards; the first to 500 wins. Your game is saved. + +
+ ## Portal Returns Portal Returns: falling through a portal and flying across a test chamber

+ Download UNO.nwa +  ·  Controls +