From d37aef1dac703dcc61a8658617c37b4a3c4150be Mon Sep 17 00:00:00 2001 From: Pk11 Date: Tue, 12 Nov 2024 09:52:05 -0600 Subject: [PATCH] Update for libnds 2.0.0 -- DSi Wi-Fi!! --- Makefile | 62 +++++++++++++++++++++++---------------------- source/game.cpp | 8 +++--- source/howto.cpp | 2 +- source/settings.cpp | 16 ++++++------ source/stats.cpp | 6 ++--- source/wifi.cpp | 52 ++++++++++++++++++++++++------------- source/words.cpp | 2 +- 7 files changed, 84 insertions(+), 64 deletions(-) diff --git a/Makefile b/Makefile index e889987..a4f9273 100644 --- a/Makefile +++ b/Makefile @@ -48,10 +48,10 @@ NITRO := #--------------------------------------------------------------------------------- # options for code generation #--------------------------------------------------------------------------------- -ARCH := -marm -mthumb-interwork -march=armv5te -mtune=arm946e-s +ARCH := -march=armv5te -mtune=arm946e-s -CFLAGS := -g -Wall -Wno-psabi -O3\ - $(ARCH) $(INCLUDE) -DARM9 +CFLAGS := -g -Wall -O2 -ffunction-sections -fdata-sections\ + $(ARCH) $(INCLUDE) -DARM9 CXXFLAGS := $(CFLAGS) -fno-rtti -fno-exceptions ASFLAGS := -g $(ARCH) LDFLAGS = -specs=ds_arm9.specs -g $(ARCH) -Wl,-Map,$(notdir $*.map) @@ -59,7 +59,12 @@ LDFLAGS = -specs=ds_arm9.specs -g $(ARCH) -Wl,-Map,$(notdir $*.map) #--------------------------------------------------------------------------------- # any extra libraries we wish to link with the project (order is important) #--------------------------------------------------------------------------------- -LIBS := -lqrencode -lfat -ldswifi9 -lmm9 -lnds9 +LIBS := -lqrencode -lfat -ldswifi9 -lnds9 + +# automagically add maxmod library +ifneq ($(strip $(AUDIO)),) +LIBS := -lmm9 $(LIBS) +endif #--------------------------------------------------------------------------------- # list of directories containing libraries, this must be the top level containing @@ -77,9 +82,9 @@ ifneq ($(BUILD),$(notdir $(CURDIR))) export OUTPUT := $(CURDIR)/$(TARGET) export VPATH := $(CURDIR)/$(subst /,,$(dir $(ICON)))\ - $(foreach dir,$(SOURCES),$(CURDIR)/$(dir))\ - $(foreach dir,$(DATA),$(CURDIR)/$(dir))\ - $(foreach dir,$(GRAPHICS),$(CURDIR)/$(dir)) + $(foreach dir,$(SOURCES),$(CURDIR)/$(dir))\ + $(foreach dir,$(DATA),$(CURDIR)/$(dir))\ + $(foreach dir,$(GRAPHICS),$(CURDIR)/$(dir)) export DEPSDIR := $(CURDIR)/$(BUILD) @@ -91,22 +96,22 @@ BINFILES := $(foreach dir,$(DATA),$(notdir $(wildcard $(dir)/*.*))) $(PNGFILES:. # prepare NitroFS directory ifneq ($(strip $(NITRO)),) - export NITRO_FILES := $(CURDIR)/$(NITRO) + export NITRO_FILES := $(CURDIR)/$(NITRO) endif # get audio list for maxmod ifneq ($(strip $(AUDIO)),) - export MODFILES := $(foreach dir,$(notdir $(wildcard $(AUDIO)/*.*)),$(CURDIR)/$(AUDIO)/$(dir)) + export MODFILES := $(foreach dir,$(notdir $(wildcard $(AUDIO)/*.*)),$(CURDIR)/$(AUDIO)/$(dir)) - # place the soundbank file in NitroFS if using it - ifneq ($(strip $(NITRO)),) - export SOUNDBANK := $(NITRO_FILES)/soundbank.bin + # place the soundbank file in NitroFS if using it + ifneq ($(strip $(NITRO)),) + export SOUNDBANK := $(NITRO_FILES)/soundbank.bin - # otherwise, needs to be loaded from memory - else - export SOUNDBANK := soundbank.bin - BINFILES += $(SOUNDBANK) - endif + # otherwise, needs to be loaded from memory + else + export SOUNDBANK := soundbank.bin + BINFILES += $(SOUNDBANK) + endif endif #--------------------------------------------------------------------------------- @@ -114,11 +119,11 @@ endif #--------------------------------------------------------------------------------- ifeq ($(strip $(CPPFILES)),) #--------------------------------------------------------------------------------- - export LD := $(CC) + export LD := $(CC) #--------------------------------------------------------------------------------- else #--------------------------------------------------------------------------------- - export LD := $(CXX) + export LD := $(CXX) #--------------------------------------------------------------------------------- endif #--------------------------------------------------------------------------------- @@ -131,10 +136,10 @@ export OFILES := $(OFILES_BIN) $(OFILES_SOURCES) export HFILES := $(addsuffix .h,$(subst .,_,$(BINFILES))) -export INCLUDE := $(foreach dir,$(INCLUDES),-iquote $(CURDIR)/$(dir))\ - $(foreach dir,$(LIBDIRS),-I$(dir)/include)\ - -I$(CURDIR)/$(BUILD) -export LIBPATHS := $(foreach dir,$(LIBDIRS),-L$(dir)/lib) +export INCLUDE := $(foreach dir,$(INCLUDES),-iquote $(CURDIR)/$(dir))\ + $(foreach dir,$(LIBDIRS),-I$(dir)/include)\ + -I$(CURDIR)/$(BUILD) +export LIBPATHS := $(foreach dir,$(LIBDIRS),-L$(dir)/lib) .PHONY: $(BUILD) all clean @@ -171,15 +176,15 @@ endif all: $(OUTPUT).nds $(OUTPUT).dsi $(OUTPUT).nds: $(OUTPUT).elf $(NITRO_FILES) $(GAME_ICON) - $(SILENTCMD)ndstool -c $@ -9 $(OUTPUT).elf $(_ADDFILES) \ + $(SILENTCMD)ndstool -c $@ -9 $(OUTPUT).elf $(_ARM7_ELF) $(_ADDFILES) \ -z 80040000 - $(SILENTCMD)$(PYTHON) ../animatedbannerpatch.py $@ ../banner.bin + $(SILENTCMD)$(PYTHON) ../animatedbannerpatch.py $@ $(BANNER) @echo built ... $(notdir $@) $(OUTPUT).dsi: $(OUTPUT).elf $(NITRO_FILES) $(GAME_ICON) - $(SILENTCMD)ndstool -c $@ -9 $(OUTPUT).elf $(_ADDFILES) \ + $(SILENTCMD)ndstool -c $@ -9 $(OUTPUT).elf $(_ARM7_ELF) $(_ADDFILES) \ -g $(GAME_CODE) 00 "WORDLE DS" -z 80040000 -u 00030004 - $(SILENTCMD)$(PYTHON) ../animatedbannerpatch.py $@ ../banner.bin + $(SILENTCMD)$(PYTHON) ../animatedbannerpatch.py $@ $(BANNER) @echo built ... $(notdir $@) $(OUTPUT).elf: $(OFILES) @@ -190,9 +195,6 @@ $(OFILES_SOURCES) : $(HFILES) # need to build soundbank first $(OFILES): $(SOUNDBANK) -banner.bin: - @python3 - #--------------------------------------------------------------------------------- # rule to build solution from music files #--------------------------------------------------------------------------------- diff --git a/source/game.cpp b/source/game.cpp index 7368fd9..59f5348 100644 --- a/source/game.cpp +++ b/source/game.cpp @@ -85,8 +85,8 @@ Game::Game() : // Check if bootstub exists extern char *fake_heap_end; - __bootstub *bootstub = (struct __bootstub *)fake_heap_end; - _bootstubExists = bootstub->bootsig == BOOTSIG; + EnvNdsBootstubHeader *bootstub = (struct EnvNdsBootstubHeader *)fake_heap_end; + _bootstubExists = bootstub->magic == ENV_NDS_BOOTSTUB_MAGIC; } Game::~Game() { @@ -141,7 +141,7 @@ bool Game::run() { u16 pressed, held; char16_t key = NOKEY; touchPosition touch; - while(1) { + while(pmMainLoop()) { do { swiWaitForVBlank(); scanKeys(); @@ -160,7 +160,7 @@ bool Game::run() { if(!Gfx::popupVisible() && _showRefresh && !_data.refreshSprite().visible()) _data.refreshSprite().visible(true).update(); - } while(!pressed && key == Kbd::NOKEY); + } while(pmMainLoop() && (!pressed && key == Kbd::NOKEY)); // Process keyboard switch(key) { diff --git a/source/howto.cpp b/source/howto.cpp index f7ca2e8..dc5e01b 100644 --- a/source/howto.cpp +++ b/source/howto.cpp @@ -49,7 +49,7 @@ void howtoMenu(bool slowFade) { scanKeys(); pressed = keysDown(); touchRead(&touch); - } while(!((pressed & (KEY_A | KEY_B)) || ((pressed & KEY_TOUCH) && (touch.px > 232 && touch.py < 24)))); + } while(pmMainLoop() && (!((pressed & (KEY_A | KEY_B)) || ((pressed & KEY_TOUCH) && (touch.px > 232 && touch.py < 24))))); Gfx::fadeOut(FADE_FAST, FADE_TOP | FADE_BOTTOM); diff --git a/source/settings.cpp b/source/settings.cpp index affebac..ef5640b 100644 --- a/source/settings.cpp +++ b/source/settings.cpp @@ -188,7 +188,7 @@ void Settings::showMenu() { Gfx::fadeIn(FADE_FAST, FADE_BOTTOM); - while(1) { + while(pmMainLoop()) { if(game->data().oldSettingsMenu()) { hardToggle .gfx(_hardMode ? game->data().toggleOnGfx() : game->data().toggleOffGfx()) @@ -207,7 +207,7 @@ void Settings::showMenu() { swiWaitForVBlank(); scanKeys(); pressed = keysDown(); - } while(!(pressed & (KEY_B | KEY_TOUCH))); + } while(pmMainLoop() && !(pressed & (KEY_B | KEY_TOUCH))); if(pressed & KEY_B) { break; @@ -346,7 +346,7 @@ void Settings::gameSettings() { Sprite musicToggle(false, SpriteSize_32x16, SpriteColorFormat_16Color); musicToggle.move(game->data().musicToggle()); - while(1) { + while(pmMainLoop()) { hardModeToggle .gfx(_hardMode ? game->data().toggleOnGfx() : game->data().toggleOffGfx()) .palette(_hardMode ? TilePalette::green : TilePalette::gray); @@ -367,7 +367,7 @@ void Settings::gameSettings() { swiWaitForVBlank(); scanKeys(); pressed = keysDown(); - } while(!(pressed & (KEY_B | KEY_TOUCH))); + } while(pmMainLoop() && !(pressed & (KEY_B | KEY_TOUCH))); if(pressed & KEY_B) { break; @@ -417,7 +417,7 @@ void Settings::shareMsgSettings() { Sprite urlToggle(false, SpriteSize_32x16, SpriteColorFormat_16Color); urlToggle.move(game->data().shareUrlToggle()); - while(1) { + while(pmMainLoop()) { timerToggle .gfx(_shareTimer ? game->data().toggleOnGfx() : game->data().toggleOffGfx()) .palette(_shareTimer ? TilePalette::green : TilePalette::gray); @@ -435,7 +435,7 @@ void Settings::shareMsgSettings() { swiWaitForVBlank(); scanKeys(); pressed = keysDown(); - } while(!(pressed & (KEY_B | KEY_TOUCH))); + } while(pmMainLoop() && !(pressed & (KEY_B | KEY_TOUCH))); if(pressed & KEY_B) { break; @@ -501,7 +501,7 @@ void Settings::selectMod() { break; } } - while(1) { + while(pmMainLoop()) { // Scroll if needed if(cursorPos < scrollPos) scrollPos = cursorPos; @@ -521,7 +521,7 @@ void Settings::selectMod() { scanKeys(); pressed = keysDown(); held = keysDownRepeat(); - } while(!(held & (KEY_UP | KEY_DOWN | KEY_LEFT | KEY_RIGHT) || pressed & (KEY_A | KEY_B | KEY_TOUCH))); + } while(pmMainLoop() && !(held & (KEY_UP | KEY_DOWN | KEY_LEFT | KEY_RIGHT) || pressed & (KEY_A | KEY_B | KEY_TOUCH))); if(held & KEY_UP) { if(cursorPos > 0) diff --git a/source/stats.cpp b/source/stats.cpp index 31ea7b5..9af2da9 100644 --- a/source/stats.cpp +++ b/source/stats.cpp @@ -150,7 +150,7 @@ bool Stats::showQr() { do { swiWaitForVBlank(); scanKeys(); - } while(!(keysDown() & (KEY_A | KEY_B | KEY_TOUCH))); + } while(pmMainLoop() && !(keysDown() & (KEY_A | KEY_B | KEY_TOUCH))); return true; } @@ -211,7 +211,7 @@ void Stats::showMenu() { // Change to stats menu background game->data().statsBottom().decompressAll(BG_SUB(0)); - while(1) { + while(pmMainLoop()) { // Print stats if(game->data().oldStatsMenu()) { // Old version without the average time @@ -261,7 +261,7 @@ void Stats::showMenu() { scanKeys(); pressed = keysDown(); touchRead(&touch); - } while(!(pressed & (KEY_A | KEY_B | KEY_TOUCH))); + } while(pmMainLoop() && !(pressed & (KEY_A | KEY_B | KEY_TOUCH))); if(pressed & (KEY_A | KEY_B)) { break; diff --git a/source/wifi.cpp b/source/wifi.cpp index f08bfdb..3f3373b 100644 --- a/source/wifi.cpp +++ b/source/wifi.cpp @@ -4,6 +4,7 @@ #include "json.hpp" #include +#include #include #include #include @@ -18,7 +19,7 @@ struct HttpResponse { HttpResponse httpGet(const char *host, const char *path) { char request[256]; - snprintf(request, sizeof(request), "GET %s HTTP/1.0\r\nHost: %s\r\nUser-Agent: Wordle DS\r\n\r\n", path, host); + snprintf(request, sizeof(request), "GET %s HTTP/1.1\r\nHost: %s\r\nUser-Agent: Wordle DS\r\n\r\n", path, host); hostent *hostEnt = gethostbyname(host); int sock = socket(AF_INET, SOCK_STREAM, 0); @@ -35,13 +36,19 @@ HttpResponse httpGet(const char *host, const char *path) { while(true) { char buffer[256]; int len = recv(sock, buffer, 255, 0); - if(len > 0) { - buffer[len] = '\0'; - res.content += buffer; - if(len < 255) - break; - } + buffer[len] = '\0'; + res.content += buffer; + + // Seems dumb, but waiting for the socket to timeout takes + // much longer than waiting a few vblanks + // (and if you don't add a bit of delay, it doesn't always + // have 255 ready) + // TODO: something better + swiWaitForVBlank(); + + if(len < 255) + break; } shutdown(sock, 0); @@ -50,24 +57,35 @@ HttpResponse httpGet(const char *host, const char *path) { if(res.content.compare(0, 9, "HTTP/1.1 ") == 0) { res.status = atoi(res.content.c_str() + 9); // Get status code number res.content = res.content.substr(res.content.find("\r\n\r\n") + 4); // Get content (after the headers) + + // Parse chunked transfer + std::string parsed; + while(true) { + uint len = strtol(res.content.c_str(), NULL, 16); + if(len == 0) + break; + + if(len > res.content.size()) + return {0, "Request failed"}; + + parsed += res.content.substr(res.content.find("\r\n") + 2, len); + res.content = res.content.substr(res.content.find("\r\n") + 2 + len + 2); + } + res.content = parsed; + return res; } else { return {0, "Request failed"}; } - } void WiFi::getWords(const char *url) { Gfx::showPopup("Connecting to Wi-Fi"); - if(!Wifi_CheckInit()) { - if(Wifi_InitDefault(WFC_CONNECT)) { - Gfx::showPopup("Connected to Wi-Fi!"); - } else { - Gfx::showPopup("Failed to connect to Wi-Fi", 120); - return; - } + if(Wifi_InitDefault(WFC_CONNECT)) { + Gfx::showPopup("Connected to Wi-Fi!"); } else { - Wifi_EnableWifi(); + Gfx::showPopup("Failed to connect to Wi-Fi", 120); + return; } // Parse out the host and request path @@ -90,7 +108,7 @@ void WiFi::getWords(const char *url) { // Try get the page Gfx::showPopup("Updating words..."); HttpResponse res = httpGet(host, path); - Wifi_DisableWifi(); + Wifi_DisconnectAP(); if(res.status == 200) { // We should now have a JSON array of new IDs diff --git a/source/words.cpp b/source/words.cpp index 2e64ff0..d5d239f 100644 --- a/source/words.cpp +++ b/source/words.cpp @@ -1,6 +1,6 @@ #include "words.hpp" -std::vector Words::order = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, 1623, 514, 530, 507, 1249, 537, 523, 1255, 508, 509, 510, 511, 539, 969, 1685, 929, 2166, 1438, 1680, 736, 2180, 2268, 559, 552, 2276, 1311, 2265, 1106, 849, 2008, 1246, 1149, 840, 2256, 923, 1168, 895, 621, 2278, 1591, 801, 962, 853, 1045, 694, 952, 2281, 1155, 2257, 2283, 2258, 2208, 1279, 771, 2251, 2191, 2263, 2117, 818, 2269, 1847, 2110, 1969, 1132, 2026, 560, 1836, 570, 1343, 1277, 1062, 965, 1686, 1332, 1483, 1049, 825, 713, 546, 1517, 1384, 1074, 1211, 1159, 525, 1007, 1502, 1182, 1075, 2301, 1556, 1245, 590, 1927, 730, 1129, 1873, 1717, 1154, 838, 1584, 776, 1312, 1207, 815, 1104, 1439, 1528, 1881, 805, 1715, 1462, 1805, 2261, 2116, 1852, 1240, 1834, 1795, 1879, 1977, 975, 1052, 1867, 1488, 1754, 2239, 1718, 883, 1342, 1922, 2022, 1172, 839, 566, 1344, 2221, 1471, 1738, 2279, -4208, 2104, 773, 1002, 977, 803, 1305, 1412, 1809, 1229, 887, 1307, 1895, -10139}; +std::vector Words::order = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, 1623, 514, 530, 507, 1249, 537, 523, 1255, 508, 509, 510, 511, 539, 969, 1685, 929, 2166, 1438, 1680, 736, 2180, 2268, 559, 552, 2276, 1311, 2265, 1106, 849, 2008, 1246, 1149, 840, 2256, 923, 1168, 895, 621, 2278, 1591, 801, 962, 853, 1045, 694, 952, 2281, 1155, 2257, 2283, 2258, 2208, 1279, 771, 2251, 2191, 2263, 2117, 818, 2269, 1847, 2110, 1969, 1132, 2026, 560, 1836, 570, 1343, 1277, 1062, 965, 1686, 1332, 1483, 1049, 825, 713, 546, 1517, 1384, 1074, 1211, 1159, 525, 1007, 1502, 1182, 1075, 2301, 1556, 1245, 590, 1927, 730, 1129, 1873, 1717, 1154, 838, 1584, 776, 1312, 1207, 815, 1104, 1439, 1528, 1881, 805, 1715, 1462, 1805, 2261, 2116, 1852, 1240, 1834, 1795, 1879, 1977, 975, 1052, 1867, 1488, 1754, 2239, 1718, 883, 1342, 1922, 2022, 1172, 839, 566, 1344, 2221, 1471, 1738, 2279, -4208, 2104, 773, 1002, 977, 803, 1305, 1412, 1809, 1229, 887, 1307, 1895, -10139, 1648, 726, 699, 2010, 1271, 1025, 852, 1522, 2233, 798, 1216, 2075, 1782, 955, 618, 875, 2081, 1316, 1978, 1297, 1894, 785, 1333, 1300, 2121, 1389, 2165, 1663, 1265, 1530, 1660, 1476, 1858, 1128, 1441, 567, 2142, 1636, 2106, 1050, 2038, 1392, 1450, 1657, 1493, 1682, 562, 1146, 528, 1331, 755, 1714, 661, 657, 613, 1491, 817, 1877, 682, 1459, -794, 1480, 2246, 1536, 1218, 1875, 1823, 1117, 2108, 1268, -5200, 1888, 1704, 1694, 569, 2083, 2245, 976, 703, 1992, 633, 1041, 2171, 2220, 1546, 847, 674, 1447, 988, 1931, 963, 515, 890, 2162, 824, 1315, 2218, 622, 1215, 765, 1948, 1252, 1378, 2113, 1454, 1490, 1190, 631, 1051, 1486, 1296, 926, 2115, 2056, 1189, 1091, 1784, 1874, 958, 1713, 1199, 937, 1354, 2252, 578, 1914, 1241, 723, 992, 1837, 2128, 2154, 1674, 837, 1398, 792, 1786, 845, 893, 2272, 668, 1201, 1564, 1487, 1206, 635, 2209, 1954, 688, 2097, 1224, 862, 689, 1958, 1668, 786, 1338, 2262, 1983, 1819, 2169, 1995, 2055, 696, 1885, 1703, 1366, 2001, 1274, 1210, 641, 601, 835, 533, 1963, 1926, 1166, 1569, 2144, 2133, 1039, 1833, 2129, 745, 1339, 1870, 1284, 1599, 584, 1755, 1996, 2267, 764, 2087, 1535, 580, 1214, 1263, 1417, 532, 1485, 767, 1405, 2059, 1294, 1964, 961, 612, 683, 1972, 1077, 1630, 625, 2072, 1554, 1910, 906, 1698, 1053, 1781, 2003, 1107, 1808, 774, 800, 1140, 1544, 956, 1608, 1645, 855, 1436, 841, 793, 1541, 1731, 543, 2259, 882, 1113, 2156, 611, 1401, 1175, 2088, 698, 1494, 1525, 1021, 1701, 860, 1900, 556, 1534, 1724, 648, 1092, 1291, 617, 642, 1814, 912, 1253, 964, 1179, 1563, 1705, 536, 781, 1855, 1205, 1901, 953, 593, 1561, 520, 1328, 1400, 1818, 768, 572, 816, 1815, 1193, 2102, 1023, 1853, 1896, 677, 2183, 905, 1780, 1565, 1351, 1934, 1849, 1975, 867, 1887, 1250, 1637, 2145, 1017, 1349, 719, 1893, 2023, 1329, 1776, 2250, 1868, 1032, 2201, 1148, 738, 604, 2266, 1139, 1513, 1666, 1500, 2065, 872, 1716, 1959, 2125, 1282, 1991, 2031, 1778, 1543, 1783, 2060, 1574, 1681, 2032, 1482, 1999, 1076, 602, 876, 705, 1367, 600, 1038, 1293, 632, 731, 582, 1387, 1449, 1151, 812, 2214, 1119, 1594, 1956, 1116, 1178, 2194, 1654, 858, 1078, 1747, 1309, 1360, 2149, 516, 1507, 1067, 1313, 565, 1014, 1473, 1558, 1643, 1771, 859, -5607, 843, 761, 2243, 1097, 1985, 1723, 1767, 1270, 1125, 1602, 1741, 1397, 1419, 2287, 531, 1987, 1382, 1335, 1444, 931, 1304, 1044, 2223, 1915, 1047, 1671, 1112, 700, 998, 702, 1285, 1153, 1770, 1288, 1937, 1768, 1928, 2179, 568, 802, 811, 1952, 1110, 2254, 1161, 1744, 2222, 1362, 575, 1466, 551, 1100, 518, 1691, 585, 1869, 866, 1463, 1523, 1560, 780, 804, 873, 1791, 2161, 1596, 1162, 823, 797, 1073, 708, 1970, 1595, 1988, 759, 1174, 1188, 1588, 1081, 1647, 607, 1083, 1726, 1029, 1746, 1310, 1451, 1655, 1340, 734, 1828, 1065, 2189, 997, 1857, 1923, 1358, 1347, 2255, 1136, 1437, 1872, 1667, 1102, 878, 2146, 789, 1396, 1865, 1899, 1393, 1634, 1742, 2111, 678, 2092, 960, 710, 2148, 897, 542, 1933, 2054, 970, 1244, 1223, 1034, 1712, 1721, 1225, 791, 1750, 1816, 1369, 1272, 1600, 1673, 1350, 1678, 1242, 1251, 1633, 930, 1689, 1684, 1357, 592, -917, 2079, 2210, 557, 1123, 1886, 1916, 616, 1478, 749, 2264, 796, 2172, 2052, 1943, 1020, 945, 813, 1697, 1407, 1371, 1510, -6644, 586, 564, 808, 629, 1465, 2011, 1898, 1068, 1165, 752, 1769, 1590, 1024, 2167, 1708, 654, 1866, 1827, 1402, 706, 1395, 1758, 1495, 1090, 1325, 1070, 581, 1281, 877, 1115, 1408, 983, 1381, 746, -8440, -11617, 1618, 2205, 1442, 1860, 2230, 1921, 1826, 995, 1098, 1891, 2198, 2143, 1169, 1882, 1431, 1422, 1659, 563, 1364, 1303, 2044, 1232, 1664, 1807}; std::vector Words::choices = {u"CIGAR", u"REBUT", u"SISSY", u"HUMPH", u"AWAKE", u"BLUSH", u"FOCAL", u"EVADE", u"NAVAL", u"SERVE", u"HEATH", u"DWARF", u"MODEL", u"KARMA", u"STINK", u"GRADE", u"QUIET", u"BENCH", u"ABATE", u"FEIGN", u"MAJOR", u"DEATH", u"FRESH", u"CRUST", u"STOOL", u"COLON", u"ABASE", u"MARRY", u"REACT", u"BATTY", u"PRIDE", u"FLOSS", u"HELIX", u"CROAK", u"STAFF", u"PAPER", u"UNFED", u"WHELP", u"TRAWL", u"OUTDO", u"ADOBE", u"CRAZY", u"SOWER", u"REPAY", u"DIGIT", u"CRATE", u"CLUCK", u"SPIKE", u"MIMIC", u"POUND", u"MAXIM", u"LINEN", u"UNMET", u"FLESH", u"BOOBY", u"FORTH", u"FIRST", u"STAND", u"BELLY", u"IVORY", u"SEEDY", u"PRINT", u"YEARN", u"DRAIN", u"BRIBE", u"STOUT", u"PANEL", u"CRASS", u"FLUME", u"OFFAL", u"AGREE", u"ERROR", u"SWIRL", u"ARGUE", u"BLEED", u"DELTA", u"FLICK", u"TOTEM", u"WOOER", u"FRONT", u"SHRUB", u"PARRY", u"BIOME", u"LAPEL", u"START", u"GREET", u"GONER", u"GOLEM", u"LUSTY", u"LOOPY", u"ROUND", u"AUDIT", u"LYING", u"GAMMA", u"LABOR", u"ISLET", u"CIVIC", u"FORGE", u"CORNY", u"MOULT", u"BASIC", u"SALAD", u"AGATE", u"SPICY", u"SPRAY", u"ESSAY", u"FJORD", u"SPEND", u"KEBAB", u"GUILD", u"ABACK", u"MOTOR", u"ALONE", u"HATCH", u"HYPER", u"THUMB", u"DOWRY", u"OUGHT", u"BELCH", u"DUTCH", u"PILOT", u"TWEED", u"COMET", u"JAUNT", u"ENEMA", u"STEED", u"ABYSS", u"GROWL", u"FLING", u"DOZEN", u"BOOZY", u"ERODE", u"WORLD", u"GOUGE", u"CLICK", u"BRIAR", u"GREAT", u"ALTAR", u"PULPY", u"BLURT", u"COAST", u"DUCHY", u"GROIN", u"FIXER", u"GROUP", u"ROGUE", u"BADLY", u"SMART", u"PITHY", u"GAUDY", u"CHILL", u"HERON", u"VODKA", u"FINER", u"SURER", u"RADIO", u"ROUGE", u"PERCH", u"RETCH", u"WROTE", u"CLOCK", u"TILDE", u"STORE", u"PROVE", u"BRING", u"SOLVE", u"CHEAT", u"GRIME", u"EXULT", u"USHER", u"EPOCH", u"TRIAD", u"BREAK", u"RHINO", u"VIRAL", u"CONIC", u"MASSE", u"SONIC", u"VITAL", u"TRACE", u"USING", u"PEACH", u"CHAMP", u"BATON", u"BRAKE", u"PLUCK", u"CRAZE", u"GRIPE", u"WEARY", u"PICKY", u"ACUTE", u"FERRY", u"ASIDE", u"TAPIR", u"TROLL", u"UNIFY", u"REBUS", u"BOOST", u"TRUSS", u"SIEGE", u"TIGER", u"BANAL", u"SLUMP", u"CRANK", u"GORGE", u"QUERY", u"DRINK", u"FAVOR", u"ABBEY", u"TANGY", u"PANIC", u"SOLAR", u"SHIRE", u"PROXY", u"POINT", u"ROBOT", u"PRICK", u"WINCE", u"CRIMP", u"KNOLL", u"SUGAR", u"WHACK", u"MOUNT", u"PERKY", u"COULD", u"WRUNG", u"LIGHT", u"THOSE", u"MOIST", u"SHARD", u"PLEAT", u"ALOFT", u"SKILL", u"ELDER", u"FRAME", u"HUMOR", u"PAUSE", u"ULCER", u"ULTRA", u"ROBIN", u"CYNIC", u"AROMA", u"CAULK", u"SHAKE", u"DODGE", u"SWILL", u"TACIT", u"OTHER", u"THORN", u"TROVE", u"BLOKE", u"VIVID", u"SPILL", u"CHANT", u"CHOKE", u"RUPEE", u"NASTY", u"MOURN", u"AHEAD", u"BRINE", u"CLOTH", u"HOARD", u"SWEET", u"MONTH", u"LAPSE", u"WATCH", u"TODAY", u"FOCUS", u"SMELT", u"TEASE", u"CATER", u"MOVIE", u"SAUTE", u"ALLOW", u"RENEW", u"THEIR", u"SLOSH", u"PURGE", u"CHEST", u"DEPOT", u"EPOXY", u"NYMPH", u"FOUND", u"SHALL", u"STOVE", u"LOWLY", u"SNOUT", u"TROPE", u"FEWER", u"SHAWL", u"NATAL", u"COMMA", u"FORAY", u"SCARE", u"STAIR", u"BLACK", u"SQUAD", u"ROYAL", u"CHUNK", u"MINCE", u"SHAME", u"CHEEK", u"AMPLE", u"FLAIR", u"FOYER", u"CARGO", u"OXIDE", u"PLANT", u"OLIVE", u"INERT", u"ASKEW", u"HEIST", u"SHOWN", u"ZESTY", u"TRASH", u"LARVA", u"FORGO", u"STORY", u"HAIRY", u"TRAIN", u"HOMER", u"BADGE", u"MIDST", u"CANNY", u"SHINE", u"GECKO", u"FARCE", u"SLUNG", u"TIPSY", u"METAL", u"YIELD", u"DELVE", u"BEING", u"SCOUR", u"GLASS", u"GAMER", u"SCRAP", u"MONEY", u"HINGE", u"ALBUM", u"VOUCH", u"ASSET", u"TIARA", u"CREPT", u"BAYOU", u"ATOLL", u"MANOR", u"CREAK", u"SHOWY", u"PHASE", u"FROTH", u"DEPTH", u"GLOOM", u"FLOOD", u"TRAIT", u"GIRTH", u"PIETY", u"GOOSE", u"FLOAT", u"DONOR", u"ATONE", u"PRIMO", u"APRON", u"BLOWN", u"CACAO", u"LOSER", u"INPUT", u"GLOAT", u"AWFUL", u"BRINK", u"SMITE", u"BEADY", u"RUSTY", u"RETRO", u"DROLL", u"GAWKY", u"HUTCH", u"PINTO", u"EGRET", u"LILAC", u"SEVER", u"FIELD", u"FLUFF", u"AGAPE", u"VOICE", u"STEAD", u"BERTH", u"MADAM", u"NIGHT", u"BLAND", u"LIVER", u"WEDGE", u"ROOMY", u"WACKY", u"FLOCK", u"ANGRY", u"TRITE", u"APHID", u"TRYST", u"MIDGE", u"POWER", u"ELOPE", u"CINCH", u"MOTTO", u"STOMP", u"UPSET", u"BLUFF", u"CRAMP", u"QUART", u"COYLY", u"YOUTH", u"RHYME", u"BUGGY", u"ALIEN", u"SMEAR", u"UNFIT", u"PATTY", u"CLING", u"GLEAN", u"LABEL", u"HUNKY", u"KHAKI", u"POKER", u"GRUEL", u"TWICE", u"TWANG", u"SHRUG", u"TREAT", u"WASTE", u"MERIT", u"WOVEN", u"NEEDY", u"CLOWN", u"IRONY", u"RUDER", u"GAUZE", u"CHIEF", u"ONSET", u"PRIZE", u"FUNGI", u"CHARM", u"GULLY", u"INTER", u"WHOOP", u"TAUNT", u"LEERY", u"CLASS", u"THEME", u"LOFTY", u"TIBIA", u"BOOZE", u"ALPHA", u"THYME", u"DOUBT", u"PARER", u"CHUTE", u"STICK", u"TRICE", u"ALIKE", u"RECAP", u"SAINT", u"GLORY", u"GRATE", u"ADMIT", u"BRISK", u"SOGGY", u"USURP", u"SCALD", u"SCORN", u"LEAVE", u"TWINE", u"STING", u"BOUGH", u"MARSH", u"SLOTH", u"DANDY", u"VIGOR", u"HOWDY", u"ENJOY", u"VALID", u"IONIC", u"EQUAL", u"FLOOR", u"CATCH", u"SPADE", u"STEIN", u"EXIST", u"QUIRK", u"DENIM", u"GROVE", u"SPIEL", u"MUMMY", u"FAULT", u"FOGGY", u"FLOUT", u"CARRY", u"SNEAK", u"LIBEL", u"WALTZ", u"APTLY", u"PINEY", u"INEPT", u"ALOUD", u"PHOTO", u"DREAM", u"STALE", u"UNITE", u"SNARL", u"BAKER", u"THERE", u"GLYPH", u"POOCH", u"HIPPY", u"SPELL", u"FOLLY", u"LOUSE", u"GULCH", u"VAULT", u"GODLY", u"THREW", u"FLEET", u"GRAVE", u"INANE", u"SHOCK", u"CRAVE", u"SPITE", u"VALVE", u"SKIMP", u"CLAIM", u"RAINY", u"MUSTY", u"PIQUE", u"DADDY", u"QUASI", u"ARISE", u"AGING", u"VALET", u"OPIUM", u"AVERT", u"STUCK", u"RECUT", u"MULCH", u"GENRE", u"PLUME", u"RIFLE", u"COUNT", u"INCUR", u"TOTAL", u"WREST", u"MOCHA", u"DETER", u"STUDY", u"LOVER", u"SAFER", u"RIVET", u"FUNNY", u"SMOKE", u"MOUND", u"UNDUE", u"SEDAN", u"PAGAN", u"SWINE", u"GUILE", u"GUSTY", u"EQUIP", u"TOUGH", u"CANOE", u"CHAOS", u"COVET", u"HUMAN", u"UDDER", u"LUNCH", u"BLAST", u"STRAY", u"MANGA", u"MELEE", u"LEFTY", u"QUICK", u"PASTE", u"GIVEN", u"OCTET", u"RISEN", u"GROAN", u"LEAKY", u"GRIND", u"CARVE", u"LOOSE", u"SADLY", u"SPILT", u"APPLE", u"SLACK", u"HONEY", u"FINAL", u"SHEEN", u"EERIE", u"MINTY", u"SLICK", u"DERBY", u"WHARF", u"SPELT", u"COACH", u"ERUPT", u"SINGE", u"PRICE", u"SPAWN", u"FAIRY", u"JIFFY", u"FILMY", u"STACK", u"CHOSE", u"SLEEP", u"ARDOR", u"NANNY", u"NIECE", u"WOOZY", u"HANDY", u"GRACE", u"DITTO", u"STANK", u"CREAM", u"USUAL", u"DIODE", u"VALOR", u"ANGLE", u"NINJA", u"MUDDY", u"CHASE", u"REPLY", u"PRONE", u"SPOIL", u"HEART", u"SHADE", u"DINER", u"ARSON", u"ONION", u"SLEET", u"DOWEL", u"COUCH", u"PALSY", u"BOWEL", u"SMILE", u"EVOKE", u"CREEK", u"LANCE", u"EAGLE", u"IDIOT", u"SIREN", u"BUILT", u"EMBED", u"AWARD", u"DROSS", u"ANNUL", u"GOODY", u"FROWN", u"PATIO", u"LADEN", u"HUMID", u"ELITE", u"LYMPH", u"EDIFY", u"MIGHT", u"RESET", u"VISIT", u"GUSTO", u"PURSE", u"VAPOR", u"CROCK", u"WRITE", u"SUNNY", u"LOATH", u"CHAFF", u"SLIDE", u"QUEER", u"VENOM", u"STAMP", u"SORRY", u"STILL", u"ACORN", u"APING", u"PUSHY", u"TAMER", u"HATER", u"MANIA", u"AWOKE", u"BRAWN", u"SWIFT", u"EXILE", u"BIRCH", u"LUCKY", u"FREER", u"RISKY", u"GHOST", u"PLIER", u"LUNAR", u"WINCH", u"SNARE", u"NURSE", u"HOUSE", u"BORAX", u"NICER", u"LURCH", u"EXALT", u"ABOUT", u"SAVVY", u"TOXIN", u"TUNIC", u"PRIED", u"INLAY", u"CHUMP", u"LANKY", u"CRESS", u"EATER", u"ELUDE", u"CYCLE", u"KITTY", u"BOULE", u"MORON", u"TENET", u"PLACE", u"LOBBY", u"PLUSH", u"VIGIL", u"INDEX", u"BLINK", u"CLUNG", u"QUALM", u"CROUP", u"CLINK", u"JUICY", u"STAGE", u"DECAY", u"NERVE", u"FLIER", u"SHAFT", u"CROOK", u"CLEAN", u"CHINA", u"RIDGE", u"VOWEL", u"GNOME", u"SNUCK", u"ICING", u"SPINY", u"RIGOR", u"SNAIL", u"FLOWN", u"RABID", u"PROSE", u"THANK", u"POPPY", u"BUDGE", u"FIBER", u"MOLDY", u"DOWDY", u"KNEEL", u"TRACK", u"CADDY", u"QUELL", u"DUMPY", u"PALER", u"SWORE", u"REBAR", u"SCUBA", u"SPLAT", u"FLYER", u"HORNY", u"MASON", u"DOING", u"OZONE", u"AMPLY", u"MOLAR", u"OVARY", u"BESET", u"QUEUE", u"CLIFF", u"MAGIC", u"TRUCE", u"SPORT", u"FRITZ", u"EDICT", u"TWIRL", u"VERSE", u"LLAMA", u"EATEN", u"RANGE", u"WHISK", u"HOVEL", u"REHAB", u"MACAW", u"SIGMA", u"SPOUT", u"VERVE", u"SUSHI", u"DYING", u"FETID", u"BRAIN", u"BUDDY", u"THUMP", u"SCION", u"CANDY", u"CHORD", u"BASIN", u"MARCH", u"CROWD", u"ARBOR", u"GAYLY", u"MUSKY", u"STAIN", u"DALLY", u"BLESS", u"BRAVO", u"STUNG", u"TITLE", u"RULER", u"KIOSK", u"BLOND", u"ENNUI", u"LAYER", u"FLUID", u"TATTY", u"SCORE", u"CUTIE", u"ZEBRA", u"BARGE", u"MATEY", u"BLUER", u"AIDER", u"SHOOK", u"RIVER", u"PRIVY", u"BETEL", u"FRISK", u"BONGO", u"BEGUN", u"AZURE", u"WEAVE", u"GENIE", u"SOUND", u"GLOVE", u"BRAID", u"SCOPE", u"WRYLY", u"ROVER", u"ASSAY", u"OCEAN", u"BLOOM", u"IRATE", u"LATER", u"WOKEN", u"SILKY", u"WRECK", u"DWELT", u"SLATE", u"SMACK", u"SOLID", u"AMAZE", u"HAZEL", u"WRIST", u"JOLLY", u"GLOBE", u"FLINT", u"ROUSE", u"CIVIL", u"VISTA", u"RELAX", u"COVER", u"ALIVE", u"BEECH", u"JETTY", u"BLISS", u"VOCAL", u"OFTEN", u"DOLLY", u"EIGHT", u"JOKER", u"SINCE", u"EVENT", u"ENSUE", u"SHUNT", u"DIVER", u"POSER", u"WORST", u"SWEEP", u"ALLEY", u"CREED", u"ANIME", u"LEAFY", u"BOSOM", u"DUNCE", u"STARE", u"PUDGY", u"WAIVE", u"CHOIR", u"STOOD", u"SPOKE", u"OUTGO", u"DELAY", u"BILGE", u"IDEAL", u"CLASP", u"SEIZE", u"HOTLY", u"LAUGH", u"SIEVE", u"BLOCK", u"MEANT", u"GRAPE", u"NOOSE", u"HARDY", u"SHIED", u"DRAWL", u"DAISY", u"PUTTY", u"STRUT", u"BURNT", u"TULIP", u"CRICK", u"IDYLL", u"VIXEN", u"FUROR", u"GEEKY", u"COUGH", u"NAIVE", u"SHOAL", u"STORK", u"BATHE", u"AUNTY", u"CHECK", u"PRIME", u"BRASS", u"OUTER", u"FURRY", u"RAZOR", u"ELECT", u"EVICT", u"IMPLY", u"DEMUR", u"QUOTA", u"HAVEN", u"CAVIL", u"SWEAR", u"CRUMP", u"DOUGH", u"GAVEL", u"WAGON", u"SALON", u"NUDGE", u"HAREM", u"PITCH", u"SWORN", u"PUPIL", u"EXCEL", u"STONY", u"CABIN", u"UNZIP", u"QUEEN", u"TROUT", u"POLYP", u"EARTH", u"STORM", u"UNTIL", u"TAPER", u"ENTER", u"CHILD", u"ADOPT", u"MINOR", u"FATTY", u"HUSKY", u"BRAVE", u"FILET", u"SLIME", u"GLINT", u"TREAD", u"STEAL", u"REGAL", u"GUEST", u"EVERY", u"MURKY", u"SHARE", u"SPORE", u"HOIST", u"BUXOM", u"INNER", u"OTTER", u"DIMLY", u"LEVEL", u"SUMAC", u"DONUT", u"STILT", u"ARENA", u"SHEET", u"SCRUB", u"FANCY", u"SLIMY", u"PEARL", u"SILLY", u"PORCH", u"DINGO", u"SEPIA", u"AMBLE", u"SHADY", u"BREAD", u"FRIAR", u"REIGN", u"DAIRY", u"QUILL", u"CROSS", u"BROOD", u"TUBER", u"SHEAR", u"POSIT", u"BLANK", u"VILLA", u"SHANK", u"PIGGY", u"FREAK", u"WHICH", u"AMONG", u"FECAL", u"SHELL", u"WOULD", u"ALGAE", u"LARGE", u"RABBI", u"AGONY", u"AMUSE", u"BUSHY", u"COPSE", u"SWOON", u"KNIFE", u"POUCH", u"ASCOT", u"PLANE", u"CROWN", u"URBAN", u"SNIDE", u"RELAY", u"ABIDE", u"VIOLA", u"RAJAH", u"STRAW", u"DILLY", u"CRASH", u"AMASS", u"THIRD", u"TRICK", u"TUTOR", u"WOODY", u"BLURB", u"GRIEF", u"DISCO", u"WHERE", u"SASSY", u"BEACH", u"SAUNA", u"COMIC", u"CLUED", u"CREEP", u"CASTE", u"GRAZE", u"SNUFF", u"FROCK", u"GONAD", u"DRUNK", u"PRONG", u"LURID", u"STEEL", u"HALVE", u"BUYER", u"VINYL", u"UTILE", u"SMELL", u"ADAGE", u"WORRY", u"TASTY", u"LOCAL", u"TRADE", u"FINCH", u"ASHEN", u"MODAL", u"GAUNT", u"CLOVE", u"ENACT", u"ADORN", u"ROAST", u"SPECK", u"SHEIK", u"MISSY", u"GRUNT", u"SNOOP", u"PARTY", u"TOUCH", u"MAFIA", u"EMCEE", u"ARRAY", u"SOUTH", u"VAPID", u"JELLY", u"SKULK", u"ANGST", u"TUBAL", u"LOWER", u"CREST", u"SWEAT", u"CYBER", u"ADORE", u"TARDY", u"SWAMI", u"NOTCH", u"GROOM", u"ROACH", u"HITCH", u"YOUNG", u"ALIGN", u"READY", u"FROND", u"STRAP", u"PUREE", u"REALM", u"VENUE", u"SWARM", u"OFFER", u"SEVEN", u"DRYER", u"DIARY", u"DRYLY", u"DRANK", u"ACRID", u"HEADY", u"THETA", u"JUNTO", u"PIXIE", u"QUOTH", u"BONUS", u"SHALT", u"PENNE", u"AMEND", u"DATUM", u"BUILD", u"PIANO", u"SHELF", u"LODGE", u"SUING", u"REARM", u"CORAL", u"RAMEN", u"WORTH", u"PSALM", u"INFER", u"OVERT", u"MAYOR", u"OVOID", u"GLIDE", u"USAGE", u"POISE", u"RANDY", u"CHUCK", u"PRANK", u"FISHY", u"TOOTH", u"ETHER", u"DROVE", u"IDLER", u"SWATH", u"STINT", u"WHILE", u"BEGAT", u"APPLY", u"SLANG", u"TAROT", u"RADAR", u"CREDO", u"AWARE", u"CANON", u"SHIFT", u"TIMER", u"BYLAW", u"SERUM", u"THREE", u"STEAK", u"ILIAC", u"SHIRK", u"BLUNT", u"PUPPY", u"PENAL", u"JOIST", u"BUNNY", u"SHAPE", u"BEGET", u"WHEEL", u"ADEPT", u"STUNT", u"STOLE", u"TOPAZ", u"CHORE", u"FLUKE", u"AFOOT", u"BLOAT", u"BULLY", u"DENSE", u"CAPER", u"SNEER", u"BOXER", u"JUMBO", u"LUNGE", u"SPACE", u"AVAIL", u"SHORT", u"SLURP", u"LOYAL", u"FLIRT", u"PIZZA", u"CONCH", u"TEMPO", u"DROOP", u"PLATE", u"BIBLE", u"PLUNK", u"AFOUL", u"SAVOY", u"STEEP", u"AGILE", u"STAKE", u"DWELL", u"KNAVE", u"BEARD", u"AROSE", u"MOTIF", u"SMASH", u"BROIL", u"GLARE", u"SHOVE", u"BAGGY", u"MAMMY", u"SWAMP", u"ALONG", u"RUGBY", u"WAGER", u"QUACK", u"SQUAT", u"SNAKY", u"DEBIT", u"MANGE", u"SKATE", u"NINTH", u"JOUST", u"TRAMP", u"SPURN", u"MEDAL", u"MICRO", u"REBEL", u"FLANK", u"LEARN", u"NADIR", u"MAPLE", u"COMFY", u"REMIT", u"GRUFF", u"ESTER", u"LEAST", u"MOGUL", u"FETCH", u"CAUSE", u"OAKEN", u"AGLOW", u"MEATY", u"GAFFE", u"SHYLY", u"RACER", u"PROWL", u"THIEF", u"STERN", u"POESY", u"ROCKY", u"TWEET", u"WAIST", u"SPIRE", u"GROPE", u"HAVOC", u"PATSY", u"TRULY", u"FORTY", u"DEITY", u"UNCLE", u"SWISH", u"GIVER", u"PREEN", u"BEVEL", u"LEMUR", u"DRAFT", u"SLOPE", u"ANNOY", u"LINGO", u"BLEAK", u"DITTY", u"CURLY", u"CEDAR", u"DIRGE", u"GROWN", u"HORDE", u"DROOL", u"SHUCK", u"CRYPT", u"CUMIN", u"STOCK", u"GRAVY", u"LOCUS", u"WIDER", u"BREED", u"QUITE", u"CHAFE", u"CACHE", u"BLIMP", u"DEIGN", u"FIEND", u"LOGIC", u"CHEAP", u"ELIDE", u"RIGID", u"FALSE", u"RENAL", u"PENCE", u"ROWDY", u"SHOOT", u"BLAZE", u"ENVOY", u"POSSE", u"BRIEF", u"NEVER", u"ABORT", u"MOUSE", u"MUCKY", u"SULKY", u"FIERY", u"MEDIA", u"TRUNK", u"YEAST", u"CLEAR", u"SKUNK", u"SCALP", u"BITTY", u"CIDER", u"KOALA", u"DUVET", u"SEGUE", u"CREME", u"SUPER", u"GRILL", u"AFTER", u"OWNER", u"EMBER", u"REACH", u"NOBLY", u"EMPTY", u"SPEED", u"GIPSY", u"RECUR", u"SMOCK", u"DREAD", u"MERGE", u"BURST", u"KAPPA", u"AMITY", u"SHAKY", u"HOVER", u"CAROL", u"SNORT", u"SYNOD", u"FAINT", u"HAUNT", u"FLOUR", u"CHAIR", u"DETOX", u"SHREW", u"TENSE", u"PLIED", u"QUARK", u"BURLY", u"NOVEL", u"WAXEN", u"STOIC", u"JERKY", u"BLITZ", u"BEEFY", u"LYRIC", u"HUSSY", u"TOWEL", u"QUILT", u"BELOW", u"BINGO", u"WISPY", u"BRASH", u"SCONE", u"TOAST", u"EASEL", u"SAUCY", u"VALUE", u"SPICE", u"HONOR", u"ROUTE", u"SHARP", u"BAWDY", u"RADII", u"SKULL", u"PHONY", u"ISSUE", u"LAGER", u"SWELL", u"URINE", u"GASSY", u"TRIAL", u"FLORA", u"UPPER", u"LATCH", u"WIGHT", u"BRICK", u"RETRY", u"HOLLY", u"DECAL", u"GRASS", u"SHACK", u"DOGMA", u"MOVER", u"DEFER", u"SOBER", u"OPTIC", u"CRIER", u"VYING", u"NOMAD", u"FLUTE", u"HIPPO", u"SHARK", u"DRIER", u"OBESE", u"BUGLE", u"TAWNY", u"CHALK", u"FEAST", u"RUDDY", u"PEDAL", u"SCARF", u"CRUEL", u"BLEAT", u"TIDAL", u"SLUSH", u"SEMEN", u"WINDY", u"DUSTY", u"SALLY", u"IGLOO", u"NERDY", u"JEWEL", u"SHONE", u"WHALE", u"HYMEN", u"ABUSE", u"FUGUE", u"ELBOW", u"CRUMB", u"PANSY", u"WELSH", u"SYRUP", u"TERSE", u"SUAVE", u"GAMUT", u"SWUNG", u"DRAKE", u"FREED", u"AFIRE", u"SHIRT", u"GROUT", u"ODDLY", u"TITHE", u"PLAID", u"DUMMY", u"BROOM", u"BLIND", u"TORCH", u"ENEMY", u"AGAIN", u"TYING", u"PESKY", u"ALTER", u"GAZER", u"NOBLE", u"ETHOS", u"BRIDE", u"EXTOL", u"DECOR", u"HOBBY", u"BEAST", u"IDIOM", u"UTTER", u"THESE", u"SIXTH", u"ALARM", u"ERASE", u"ELEGY", u"SPUNK", u"PIPER", u"SCALY", u"SCOLD", u"HEFTY", u"CHICK", u"SOOTY", u"CANAL", u"WHINY", u"SLASH", u"QUAKE", u"JOINT", u"SWEPT", u"PRUDE", u"HEAVY", u"WIELD", u"FEMME", u"LASSO", u"MAIZE", u"SHALE", u"SCREW", u"SPREE", u"SMOKY", u"WHIFF", u"SCENT", u"GLADE", u"SPENT", u"PRISM", u"STOKE", u"RIPER", u"ORBIT", u"COCOA", u"GUILT", u"HUMUS", u"SHUSH", u"TABLE", u"SMIRK", u"WRONG", u"NOISY", u"ALERT", u"SHINY", u"ELATE", u"RESIN", u"WHOLE", u"HUNCH", u"PIXEL", u"POLAR", u"HOTEL", u"SWORD", u"CLEAT", u"MANGO", u"RUMBA", u"PUFFY", u"FILLY", u"BILLY", u"LEASH", u"CLOUT", u"DANCE", u"OVATE", u"FACET", u"CHILI", u"PAINT", u"LINER", u"CURIO", u"SALTY", u"AUDIO", u"SNAKE", u"FABLE", u"CLOAK", u"NAVEL", u"SPURT", u"PESTO", u"BALMY", u"FLASH", u"UNWED", u"EARLY", u"CHURN", u"WEEDY", u"STUMP", u"LEASE", u"WITTY", u"WIMPY", u"SPOOF", u"SANER", u"BLEND", u"SALSA", u"THICK", u"WARTY", u"MANIC", u"BLARE", u"SQUIB", u"SPOON", u"PROBE", u"CREPE", u"KNACK", u"FORCE", u"DEBUT", u"ORDER", u"HASTE", u"TEETH", u"AGENT", u"WIDEN", u"ICILY", u"SLICE", u"INGOT", u"CLASH", u"JUROR", u"BLOOD", u"ABODE", u"THROW", u"UNITY", u"PIVOT", u"SLEPT", u"TROOP", u"SPARE", u"SEWER", u"PARSE", u"MORPH", u"CACTI", u"TACKY", u"SPOOL", u"DEMON", u"MOODY", u"ANNEX", u"BEGIN", u"FUZZY", u"PATCH", u"WATER", u"LUMPY", u"ADMIN", u"OMEGA", u"LIMIT", u"TABBY", u"MACHO", u"AISLE", u"SKIFF", u"BASIS", u"PLANK", u"VERGE", u"BOTCH", u"CRAWL", u"LOUSY", u"SLAIN", u"CUBIC", u"RAISE", u"WRACK", u"GUIDE", u"FOIST", u"CAMEO", u"UNDER", u"ACTOR", u"REVUE", u"FRAUD", u"HARPY", u"SCOOP", u"CLIMB", u"REFER", u"OLDEN", u"CLERK", u"DEBAR", u"TALLY", u"ETHIC", u"CAIRN", u"TULLE", u"GHOUL", u"HILLY", u"CRUDE", u"APART", u"SCALE", u"OLDER", u"PLAIN", u"SPERM", u"BRINY", u"ABBOT", u"RERUN", u"QUEST", u"CRISP", u"BOUND", u"BEFIT", u"DRAWN", u"SUITE", u"ITCHY", u"CHEER", u"BAGEL", u"GUESS", u"BROAD", u"AXIOM", u"CHARD", u"CAPUT", u"LEANT", u"HARSH", u"CURSE", u"PROUD", u"SWING", u"OPINE", u"TASTE", u"LUPUS", u"GUMBO", u"MINER", u"GREEN", u"CHASM", u"LIPID", u"TOPIC", u"ARMOR", u"BRUSH", u"CRANE", u"MURAL", u"ABLED", u"HABIT", u"BOSSY", u"MAKER", u"DUSKY", u"DIZZY", u"LITHE", u"BROOK", u"JAZZY", u"FIFTY", u"SENSE", u"GIANT", u"SURLY", u"LEGAL", u"FATAL", u"FLUNK", u"BEGAN", u"PRUNE", u"SMALL", u"SLANT", u"SCOFF", u"TORUS", u"NINNY", u"COVEY", u"VIPER", u"TAKEN", u"MORAL", u"VOGUE", u"OWING", u"TOKEN", u"ENTRY", u"BOOTH", u"VOTER", u"CHIDE", u"ELFIN", u"EBONY", u"NEIGH", u"MINIM", u"MELON", u"KNEED", u"DECOY", u"VOILA", u"ANKLE", u"ARROW", u"MUSHY", u"TRIBE", u"CEASE", u"EAGER", u"BIRTH", u"GRAPH", u"ODDER", u"TERRA", u"WEIRD", u"TRIED", u"CLACK", u"COLOR", u"ROUGH", u"WEIGH", u"UNCUT", u"LADLE", u"STRIP", u"CRAFT", u"MINUS", u"DICEY", u"TITAN", u"LUCID", u"VICAR", u"DRESS", u"DITCH", u"GYPSY", u"PASTA", u"TAFFY", u"FLAME", u"SWOOP", u"ALOOF", u"SIGHT", u"BROKE", u"TEARY", u"CHART", u"SIXTY", u"WORDY", u"SHEER", u"LEPER", u"NOSEY", u"BULGE", u"SAVOR", u"CLAMP", u"FUNKY", u"FOAMY", u"TOXIC", u"BRAND", u"PLUMB", u"DINGY", u"BUTTE", u"DRILL", u"TRIPE", u"BICEP", u"TENOR", u"KRILL", u"WORSE", u"DRAMA", u"HYENA", u"THINK", u"RATIO", u"COBRA", u"BASIL", u"SCRUM", u"BUSED", u"PHONE", u"COURT", u"CAMEL", u"PROOF", u"HEARD", u"ANGEL", u"PETAL", u"POUTY", u"THROB", u"MAYBE", u"FETAL", u"SPRIG", u"SPINE", u"SHOUT", u"CADET", u"MACRO", u"DODGY", u"SATYR", u"RARER", u"BINGE", u"TREND", u"NUTTY", u"LEAPT", u"AMISS", u"SPLIT", u"MYRRH", u"WIDTH", u"SONAR", u"TOWER", u"BARON", u"FEVER", u"WAVER", u"SPARK", u"BELIE", u"SLOOP", u"EXPEL", u"SMOTE", u"BALER", u"ABOVE", u"NORTH", u"WAFER", u"SCANT", u"FRILL", u"AWASH", u"SNACK", u"SCOWL", u"FRAIL", u"DRIFT", u"LIMBO", u"FENCE", u"MOTEL", u"OUNCE", u"WREAK", u"REVEL", u"TALON", u"PRIOR", u"KNELT", u"CELLO", u"FLAKE", u"DEBUG", u"ANODE", u"CRIME", u"SALVE", u"SCOUT", u"IMBUE", u"PINKY", u"STAVE", u"VAGUE", u"CHOCK", u"FIGHT", u"VIDEO", u"STONE", u"TEACH", u"CLEFT", u"FROST", u"PRAWN", u"BOOTY", u"TWIST", u"APNEA", u"STIFF", u"PLAZA", u"LEDGE", u"TWEAK", u"BOARD", u"GRANT", u"MEDIC", u"BACON", u"CABLE", u"BRAWL", u"SLUNK", u"RASPY", u"FORUM", u"DRONE", u"WOMEN", u"MUCUS", u"BOAST", u"TODDY", u"COVEN", u"TUMOR", u"TRUER", u"WRATH", u"STALL", u"STEAM", u"AXIAL", u"PURER", u"DAILY", u"TRAIL", u"NICHE", u"MEALY", u"JUICE", u"NYLON", u"PLUMP", u"MERRY", u"FLAIL", u"PAPAL", u"WHEAT", u"BERRY", u"COWER", u"ERECT", u"BRUTE", u"LEGGY", u"SNIPE", u"SINEW", u"SKIER", u"PENNY", u"JUMPY", u"RALLY", u"UMBRA", u"SCARY", u"MODEM", u"GROSS", u"AVIAN", u"GREED", u"SATIN", u"TONIC", u"PARKA", u"SNIFF", u"LIVID", u"STARK", u"TRUMP", u"GIDDY", u"REUSE", u"TABOO", u"AVOID", u"QUOTE", u"DEVIL", u"LIKEN", u"GLOSS", u"GAYER", u"BERET", u"NOISE", u"GLAND", u"DEALT", u"SLING", u"RUMOR", u"OPERA", u"THIGH", u"TONGA", u"FLARE", u"WOUND", u"WHITE", u"BULKY", u"ETUDE", u"HORSE", u"CIRCA", u"PADDY", u"INBOX", u"FIZZY", u"GRAIN", u"EXERT", u"SURGE", u"GLEAM", u"BELLE", u"SALVO", u"CRUSH", u"FRUIT", u"SAPPY", u"TAKER", u"TRACT", u"OVINE", u"SPIKY", u"FRANK", u"REEDY", u"FILTH", u"SPASM", u"HEAVE", u"MAMBO", u"RIGHT", u"CLANK", u"TRUST", u"LUMEN", u"BORNE", u"SPOOK", u"SAUCE", u"AMBER", u"LATHE", u"CARAT", u"CORER", u"DIRTY", u"SLYLY", u"AFFIX", u"ALLOY", u"TAINT", u"SHEEP", u"KINKY", u"WOOLY", u"MAUVE", u"FLUNG", u"YACHT", u"FRIED", u"QUAIL", u"BRUNT", u"GRIMY", u"CURVY", u"CAGEY", u"RINSE", u"DEUCE", u"STATE", u"GRASP", u"MILKY", u"BISON", u"GRAFT", u"SANDY", u"BASTE", u"FLASK", u"HEDGE", u"GIRLY", u"SWASH", u"BONEY", u"COUPE", u"ENDOW", u"ABHOR", u"WELCH", u"BLADE", u"TIGHT", u"GEESE", u"MISER", u"MIRTH", u"CLOUD", u"CABAL", u"LEECH", u"CLOSE", u"TENTH", u"PECAN", u"DROIT", u"GRAIL", u"CLONE", u"GUISE", u"RALPH", u"TANGO", u"BIDDY", u"SMITH", u"MOWER", u"PAYEE", u"SERIF", u"DRAPE", u"FIFTH", u"SPANK", u"GLAZE", u"ALLOT", u"TRUCK", u"KAYAK", u"VIRUS", u"TESTY", u"TEPEE", u"FULLY", u"ZONAL", u"METRO", u"CURRY", u"GRAND", u"BANJO", u"AXION", u"BEZEL", u"OCCUR", u"CHAIN", u"NASAL", u"GOOEY", u"FILER", u"BRACE", u"ALLAY", u"PUBIC", u"RAVEN", u"PLEAD", u"GNASH", u"FLAKY", u"MUNCH", u"DULLY", u"EKING", u"THING", u"SLINK", u"HURRY", u"THEFT", u"SHORN", u"PYGMY", u"RANCH", u"WRING", u"LEMON", u"SHORE", u"MAMMA", u"FROZE", u"NEWER", u"STYLE", u"MOOSE", u"ANTIC", u"DROWN", u"VEGAN", u"CHESS", u"GUPPY", u"UNION", u"LEVER", u"LORRY", u"IMAGE", u"CABBY", u"DRUID", u"EXACT", u"TRUTH", u"DOPEY", u"SPEAR", u"CRIED", u"CHIME", u"CRONY", u"STUNK", u"TIMID", u"BATCH", u"GAUGE", u"ROTOR", u"CRACK", u"CURVE", u"LATTE", u"WITCH", u"BUNCH", u"REPEL", u"ANVIL", u"SOAPY", u"METER", u"BROTH", u"MADLY", u"DRIED", u"SCENE", u"KNOWN", u"MAGMA", u"ROOST", u"WOMAN", u"THONG", u"PUNCH", u"PASTY", u"DOWNY", u"KNEAD", u"WHIRL", u"RAPID", u"CLANG", u"ANGER", u"DRIVE", u"GOOFY", u"EMAIL", u"MUSIC", u"STUFF", u"BLEEP", u"RIDER", u"MECCA", u"FOLIO", u"SETUP", u"VERSO", u"QUASH", u"FAUNA", u"GUMMY", u"HAPPY", u"NEWLY", u"FUSSY", u"RELIC", u"GUAVA", u"RATTY", u"FUDGE", u"FEMUR", u"CHIRP", u"FORTE", u"ALIBI", u"WHINE", u"PETTY", u"GOLLY", u"PLAIT", u"FLECK", u"FELON", u"GOURD", u"BROWN", u"THRUM", u"FICUS", u"STASH", u"DECRY", u"WISER", u"JUNTA", u"VISOR", u"DAUNT", u"SCREE", u"IMPEL", u"AWAIT", u"PRESS", u"WHOSE", u"TURBO", u"STOOP", u"SPEAK", u"MANGY", u"EYING", u"INLET", u"CRONE", u"PULSE", u"MOSSY", u"STAID", u"HENCE", u"PINCH", u"TEDDY", u"SULLY", u"SNORE", u"RIPEN", u"SNOWY", u"ATTIC", u"GOING", u"LEACH", u"MOUTH", u"HOUND", u"CLUMP", u"TONAL", u"BIGOT", u"PERIL", u"PIECE", u"BLAME", u"HAUTE", u"SPIED", u"UNDID", u"INTRO", u"BASAL", u"RODEO", u"GUARD", u"STEER", u"LOAMY", u"SCAMP", u"SCRAM", u"MANLY", u"HELLO", u"VAUNT", u"ORGAN", u"FERAL", u"KNOCK", u"EXTRA", u"CONDO", u"ADAPT", u"WILLY", u"POLKA", u"RAYON", u"SKIRT", u"FAITH", u"TORSO", u"MATCH", u"MERCY", u"TEPID", u"SLEEK", u"RISER", u"TWIXT", u"PEACE", u"FLUSH", u"CATTY", u"LOGIN", u"EJECT", u"ROGER", u"RIVAL", u"UNTIE", u"REFIT", u"AORTA", u"ADULT", u"JUDGE", u"ROWER", u"ARTSY", u"RURAL", u"SHAVE", u"BOBBY", u"ECLAT", u"FELLA", u"GAILY", u"HARRY", u"HASTY", u"HYDRO", u"LIEGE", u"OCTAL", u"OMBRE", u"PAYER", u"SOOTH", u"UNSET", u"UNLIT", u"VOMIT", u"FANNY", u"FETUS", u"BUTCH", u"STALK", u"FLACK", u"WIDOW", u"AUGUR"};