diff --git a/.claude/skills/bgg-api/SKILL.md b/.claude/skills/bgg-api/SKILL.md
index 00c0af7..2966d8f 100644
--- a/.claude/skills/bgg-api/SKILL.md
+++ b/.claude/skills/bgg-api/SKILL.md
@@ -51,7 +51,20 @@ The first `/collection` call typically returns **HTTP 202** with a "please retry
## Search & matching heuristics
-1. Exact normalized-name match → strong candidate.
+0. BGG's search is UNRELIABLE for generic and punctuated queries: results
+ truncate in the several-hundreds unordered (the game named "Dungeon!"
+ appears in neither the "Dungeon!" nor the "Dungeon" search), and
+ punctuation can hide matches. Every title is searched raw AND with
+ punctuation stripped, merged by id. A LONE surviving candidate never
+ auto-matches unless it's a true exact match whose owned-count clears
+ the dominance floor — the sole survivor may be an impostor standing
+ where a famous game should be, and the real match may need review's
+ manual-id entry.
+1. Exact normalized-name match → strong candidate. A name that becomes
+ exact once its trailing parenthetical is stripped ("Wiz-War (Eighth
+ Edition)") is a SIBLING EDITION — BGG files new editions as separate
+ games — and counts as exact-grade so the choice between lineages
+ reaches review instead of hiding behind a confident auto.
2. Fuzzy match: `rapidfuzz` `token_sort_ratio ≥ 90` → good candidate.
3. Ties: fetch `/thing?stats=1` for top ~5 candidates; prefer higher owned-count / better BGG rank (well-known game beats obscure duplicate of the same name).
- Search results include `boardgameexpansion` as a distinct `type` — keep expansions but tag them so review catches base/expansion confusion.
diff --git a/data/matches.csv b/data/matches.csv
index d65e011..e440485 100644
--- a/data/matches.csv
+++ b/data/matches.csv
@@ -39,7 +39,7 @@ Jenga,2452,Jenga,1983,boardgame,auto,,,version_unknown,"[{""bgg_id"": 2452, ""na
"NO THANK YOU, EVIL!",208428,"No Thank You, Evil!",2016,boardgame,auto,,,version_unknown,"[{""bgg_id"": 208428, ""name"": ""No Thank You, Evil!"", ""year"": 2016, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": null, ""rank"": null}]",[],IMG_4510.jpeg,,
CODE MASTER,42063,Code Master,1997,boardgame,auto,,,version_unknown,"[{""bgg_id"": 42063, ""name"": ""Code Master"", ""year"": 1997, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": null, ""rank"": null}]",[],IMG_4510.jpeg,,
GRAVITY MAZE,,,,,local,,,,[],[],IMG_4510.jpeg,,
-ROBOT TURTLES,147370,Robot Turtles,2013,boardgame,auto,,,version_ambiguous,"[{""bgg_id"": 147370, ""name"": ""Robot Turtles"", ""year"": 2013, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": null, ""rank"": null}]","[{""version_id"": 231664, ""name"": ""English second edition"", ""year"": 2014, ""publishers"": [""ThinkFun""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 571231, ""name"": ""Multilingual edition"", ""year"": 2021, ""publishers"": [""ThinkFun""], ""languages"": [""Dutch"", ""English"", ""French"", ""German"", ""Italian"", ""Portuguese"", ""Spanish""], ""score"": 3}, {""version_id"": 498079, ""name"": ""Korean edition"", ""year"": 2017, ""publishers"": [""Korea Boardgames"", ""ThinkFun""], ""languages"": [""Korean""], ""score"": 2}]",IMG_4510.jpeg,,
+ROBOT TURTLES,147370,Robot Turtles,2013,boardgame,auto,231664,English second edition,version_approved,"[{""bgg_id"": 147370, ""name"": ""Robot Turtles"", ""year"": 2013, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": null, ""rank"": null}]","[{""version_id"": 231664, ""name"": ""English second edition"", ""year"": 2014, ""publishers"": [""ThinkFun""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 571231, ""name"": ""Multilingual edition"", ""year"": 2021, ""publishers"": [""ThinkFun""], ""languages"": [""Dutch"", ""English"", ""French"", ""German"", ""Italian"", ""Portuguese"", ""Spanish""], ""score"": 3}, {""version_id"": 498079, ""name"": ""Korean edition"", ""year"": 2017, ""publishers"": [""Korea Boardgames"", ""ThinkFun""], ""languages"": [""Korean""], ""score"": 2}]",IMG_4510.jpeg,,
GOOGLY EYES,57215,Googly Eyes,2008,boardgame,auto,,,version_unknown,"[{""bgg_id"": 57215, ""name"": ""Googly Eyes"", ""year"": 2008, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": null, ""rank"": null}]",[],IMG_4510.jpeg,,
THROW THROW AVOCADO,340420,Throw Throw Avocado,2021,boardgame,auto,,,version_unknown,"[{""bgg_id"": 340420, ""name"": ""Throw Throw Avocado"", ""year"": 2021, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": null, ""rank"": null}]",[],IMG_4511.jpeg,,
SUPERFIGHT,139443,Superfight,2013,boardgame,auto,,,version_unknown,"[{""bgg_id"": 139443, ""name"": ""Superfight"", ""year"": 2013, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": null, ""rank"": null}]",[],IMG_4511.jpeg,,
@@ -49,7 +49,7 @@ Guillotine,116,Guillotine,1998,boardgame,auto,,,version_unknown,"[{""bgg_id"": 1
THE DOOM THAT CAME TO ATLANTIC CITY,124548,The Doom That Came to Atlantic City,2013,boardgame,auto,,,version_unknown,"[{""bgg_id"": 124548, ""name"": ""The Doom That Came to Atlantic City"", ""year"": 2013, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": null, ""rank"": null}]",[],IMG_4513.jpeg,,
Flick'em UP!,169124,Flick 'em Up!,2015,boardgame,auto,,,version_unknown,"[{""bgg_id"": 169124, ""name"": ""Flick 'em Up!"", ""year"": 2015, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": null, ""rank"": null}]",[],IMG_4513.jpeg,,
Castle Panic,43443,Castle Panic,2009,boardgame,auto,103068,"English edition, fourth printing",version_approved,"[{""bgg_id"": 43443, ""name"": ""Castle Panic"", ""year"": 2009, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": null, ""rank"": null}]","[{""version_id"": 468123, ""name"": ""English edition, eighteenth printing"", ""year"": 2018, ""publishers"": [""Fireside Games""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 222131, ""name"": ""English edition, eighth printing"", ""year"": 2013, ""publishers"": [""Fireside Games""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 265959, ""name"": ""English edition, eleventh printing"", ""year"": 2014, ""publishers"": [""Fireside Games""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 343185, ""name"": ""English edition, fifteenth printing"", ""year"": 2016, ""publishers"": [""Fireside Games""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 169933, ""name"": ""English edition, fifth printing"", ""year"": 2012, ""publishers"": [""Fireside Games""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 24624, ""name"": ""English edition, first printing"", ""year"": 2009, ""publishers"": [""Fireside Games""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 337551, ""name"": ""English edition, fourteenth printing"", ""year"": 2016, ""publishers"": [""Fireside Games""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 103068, ""name"": ""English edition, fourth printing"", ""year"": 2010, ""publishers"": [""Fireside Games""], ""languages"": [""English""], ""score"": 3}]",IMG_4513.jpeg,,
-The Red Dragon Inn,24310,The Red Dragon Inn,2007,boardgame,auto,,,version_ambiguous,"[{""bgg_id"": 24310, ""name"": ""The Red Dragon Inn"", ""year"": 2007, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": 16870, ""rank"": 2164}, {""bgg_id"": 33451, ""name"": ""The Red Dragon Inn 2"", ""year"": 2008, ""type"": ""boardgame"", ""exact"": false, ""fuzzy"": 93.3, ""owned"": 8355, ""rank"": 2056}, {""bgg_id"": 66510, ""name"": ""The Red Dragon Inn 3"", ""year"": 2011, ""type"": ""boardgame"", ""exact"": false, ""fuzzy"": 93.3, ""owned"": 6246, ""rank"": 2363}, {""bgg_id"": 142402, ""name"": ""The Red Dragon Inn 4"", ""year"": 2013, ""type"": ""boardgame"", ""exact"": false, ""fuzzy"": 93.3, ""owned"": 4107, ""rank"": 3367}, {""bgg_id"": 455834, ""name"": ""The Red Dragon Inn 10"", ""year"": 2026, ""type"": ""boardgame"", ""exact"": false, ""fuzzy"": 90.3, ""owned"": 162, ""rank"": null}]","[{""version_id"": 400341, ""name"": ""English eighth edition"", ""year"": 2017, ""publishers"": [""SlugFest Games""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 620786, ""name"": ""English eleventh edition"", ""year"": 2021, ""publishers"": [""SlugFest Games""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 762888, ""name"": ""English fifteenth edition"", ""year"": 2024, ""publishers"": [""SlugFest Games""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 374258, ""name"": ""English fifth edition"", ""year"": 2012, ""publishers"": [""SlugFest Games""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 33932, ""name"": ""English first edition"", ""year"": 2007, ""publishers"": [""SlugFest Games""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 728027, ""name"": ""English fourteenth edition"", ""year"": 2023, ""publishers"": [""SlugFest Games""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 312374, ""name"": ""English seventh edition"", ""year"": 2015, ""publishers"": [""SlugFest Games""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 389768, ""name"": ""English sixth edition"", ""year"": 2014, ""publishers"": [""SlugFest Games""], ""languages"": [""English""], ""score"": 3}]",IMG_4514.jpeg,,
+The Red Dragon Inn,24310,The Red Dragon Inn,2007,boardgame,auto,374258,English fifth edition,version_approved,"[{""bgg_id"": 24310, ""name"": ""The Red Dragon Inn"", ""year"": 2007, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": 16870, ""rank"": 2164}, {""bgg_id"": 33451, ""name"": ""The Red Dragon Inn 2"", ""year"": 2008, ""type"": ""boardgame"", ""exact"": false, ""fuzzy"": 93.3, ""owned"": 8355, ""rank"": 2056}, {""bgg_id"": 66510, ""name"": ""The Red Dragon Inn 3"", ""year"": 2011, ""type"": ""boardgame"", ""exact"": false, ""fuzzy"": 93.3, ""owned"": 6246, ""rank"": 2363}, {""bgg_id"": 142402, ""name"": ""The Red Dragon Inn 4"", ""year"": 2013, ""type"": ""boardgame"", ""exact"": false, ""fuzzy"": 93.3, ""owned"": 4107, ""rank"": 3367}, {""bgg_id"": 455834, ""name"": ""The Red Dragon Inn 10"", ""year"": 2026, ""type"": ""boardgame"", ""exact"": false, ""fuzzy"": 90.3, ""owned"": 162, ""rank"": null}]","[{""version_id"": 400341, ""name"": ""English eighth edition"", ""year"": 2017, ""publishers"": [""SlugFest Games""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 620786, ""name"": ""English eleventh edition"", ""year"": 2021, ""publishers"": [""SlugFest Games""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 762888, ""name"": ""English fifteenth edition"", ""year"": 2024, ""publishers"": [""SlugFest Games""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 374258, ""name"": ""English fifth edition"", ""year"": 2012, ""publishers"": [""SlugFest Games""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 33932, ""name"": ""English first edition"", ""year"": 2007, ""publishers"": [""SlugFest Games""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 728027, ""name"": ""English fourteenth edition"", ""year"": 2023, ""publishers"": [""SlugFest Games""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 312374, ""name"": ""English seventh edition"", ""year"": 2015, ""publishers"": [""SlugFest Games""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 389768, ""name"": ""English sixth edition"", ""year"": 2014, ""publishers"": [""SlugFest Games""], ""languages"": [""English""], ""score"": 3}]",IMG_4514.jpeg,,
Dixit,39856,Dixit,2008,boardgame,auto,296529,Asmodee/Libellud English edition 2015,version_approved,"[{""bgg_id"": 39856, ""name"": ""Dixit"", ""year"": 2008, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": null, ""rank"": null}]","[{""version_id"": 709762, ""name"": ""Libellud multilingual edition 2008"", ""year"": 2008, ""publishers"": [""Libellud""], ""languages"": [""Dutch"", ""English"", ""French"", ""German"", ""Italian"", ""Polish"", ""Portuguese"", ""Spanish""], ""score"": 3}, {""version_id"": 24804, ""name"": ""Libellud multilingual edition 2009"", ""year"": 2009, ""publishers"": [""Libellud""], ""languages"": [""Dutch"", ""English"", ""French"", ""German"", ""Italian"", ""Polish"", ""Portuguese"", ""Spanish""], ""score"": 3}, {""version_id"": 52013, ""name"": ""Libellud English third edition 2010"", ""year"": 2010, ""publishers"": [""Libellud""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 72265, ""name"": ""Libellud multilingual edition 2010 with SdJ"", ""year"": 2010, ""publishers"": [""Libellud""], ""languages"": [""Dutch"", ""English"", ""French"", ""German"", ""Italian"", ""Polish"", ""Portuguese"", ""Spanish""], ""score"": 3}, {""version_id"": 752364, ""name"": ""Libellud multilingual edition 2010 with SdJ without product code"", ""year"": 2010, ""publishers"": [""Libellud""], ""languages"": [""Dutch"", ""English"", ""French"", ""German"", ""Italian"", ""Polish"", ""Portuguese"", ""Spanish""], ""score"": 3}, {""version_id"": 160064, ""name"": ""English edition 2011"", ""year"": 2011, ""publishers"": [""Libellud""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 198912, ""name"": ""Libellud multilingual edition 2011"", ""year"": 2011, ""publishers"": [""Libellud""], ""languages"": [""Dutch"", ""English"", ""French"", ""German"", ""Italian"", ""Polish"", ""Portuguese"", ""Spanish""], ""score"": 3}, {""version_id"": 193872, ""name"": ""English edition 2012"", ""year"": 2012, ""publishers"": [""Libellud""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 290752, ""name"": ""Libellud multilingual edition 2012"", ""year"": 2012, ""publishers"": [""Libellud""], ""languages"": [""Dutch"", ""English"", ""French"", ""German"", ""Italian"", ""Polish"", ""Portuguese"", ""Spanish""], ""score"": 3}, {""version_id"": 241272, ""name"": ""English edition 2013"", ""year"": 2013, ""publishers"": [""Libellud""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 310539, ""name"": ""Libellud French/English edition with award"", ""year"": 2013, ""publishers"": [""Libellud""], ""languages"": [""English"", ""French""], ""score"": 3}, {""version_id"": 353868, ""name"": ""Libellud multilingual edition 2013"", ""year"": 2013, ""publishers"": [""Libellud""], ""languages"": [""Dutch"", ""English"", ""French"", ""German"", ""Italian"", ""Polish"", ""Portuguese"", ""Spanish""], ""score"": 3}, {""version_id"": 256721, ""name"": ""English edition 2014"", ""year"": 2014, ""publishers"": [""Libellud""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 273210, ""name"": ""English edition 2014"", ""year"": 2014, ""publishers"": [""Libellud""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 283431, ""name"": ""Libellud English UK edition 2014"", ""year"": 2014, ""publishers"": [""Libellud""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 267586, ""name"": ""Libellud English/French edition 2014"", ""year"": 2014, ""publishers"": [""Libellud""], ""languages"": [""English"", ""French""], ""score"": 3}, {""version_id"": 512383, ""name"": ""Multilingual edition 2014"", ""year"": 2014, ""publishers"": [""Libellud"", ""Morapiaf""], ""languages"": [""Dutch"", ""English"", ""French"", ""German"", ""Italian"", ""Polish"", ""Portuguese"", ""Spanish""], ""score"": 3}, {""version_id"": 296529, ""name"": ""Asmodee/Libellud English edition 2015"", ""year"": 2015, ""publishers"": [""Libellud""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 360758, ""name"": ""Libellud English edition 2016"", ""year"": 2016, ""publishers"": [""Libellud""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 360076, ""name"": ""Multilingual edition 2016"", ""year"": 2016, ""publishers"": [""KADABRA"", ""Libellud"", ""Nordic Games ehf"", ""Paladium Games""], ""languages"": [""Bulgarian"", ""English"", ""Estonian"", ""Icelandic"", ""Latvian"", ""Lithuanian""], ""score"": 3}, {""version_id"": 475048, ""name"": ""English edition 2017"", ""year"": 2017, ""publishers"": [""Libellud""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 530393, ""name"": ""English edition 2017, second printing"", ""year"": 2017, ""publishers"": [""Libellud""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 476620, ""name"": ""English edition 2018"", ""year"": 2018, ""publishers"": [""Libellud""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 482308, ""name"": ""Afrikaans/English edition"", ""year"": 2019, ""publishers"": [""Libellud""], ""languages"": [""Afrikaans"", ""English""], ""score"": 3}, {""version_id"": 488774, ""name"": ""Arabic/English edition"", ""year"": 2019, ""publishers"": [""Boardgame Space"", ""Libellud""], ""languages"": [""Arabic"", ""English""], ""score"": 3}, {""version_id"": 634801, ""name"": ""English edition 2019"", ""year"": 2019, ""publishers"": [""Libellud""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 643844, ""name"": ""English edition 2020"", ""year"": 2020, ""publishers"": [""Libellud""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 582709, ""name"": ""English edition 2021"", ""year"": 2021, ""publishers"": [""Libellud""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 739982, ""name"": ""English edition 2021 with \""8 million games sold\"""", ""year"": 2021, ""publishers"": [""Libellud""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 744604, ""name"": ""English edition 2021 with “7 million units sold”"", ""year"": 2021, ""publishers"": [""Libellud""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 730261, ""name"": ""English UK edition 2021"", ""year"": 2021, ""publishers"": [""Libellud""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 786419, ""name"": ""English edition 2025 with “12 million games sold”"", ""year"": 2025, ""publishers"": [""asmodee"", ""Libellud""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 544006, ""name"": ""Libellud Italian edition"", ""year"": 0, ""publishers"": [""Libellud""], ""languages"": [""Italian""], ""score"": 2}, {""version_id"": 661163, ""name"": ""Spanish/Portuguese/Catalan edition with \""5 millones\"""", ""year"": 0, ""publishers"": [""Libellud""], ""languages"": [""Catalan"", ""Portuguese"", ""Spanish""], ""score"": 2}, {""version_id"": 33307, ""name"": ""Libellud French first edition 2008"", ""year"": 2008, ""publishers"": [""Libellud""], ""languages"": [""French""], ""score"": 2}, {""version_id"": 22278, ""name"": ""Lautapelit.fi Nordic edition 2009"", ""year"": 2009, ""publishers"": [""Lautapelit.fi"", ""Libellud""], ""languages"": [""Danish"", ""Finnish"", ""Norwegian"", ""Swedish""], ""score"": 2}, {""version_id"": 35119, ""name"": ""Morapiaf Spanish edition 2009"", ""year"": 2009, ""publishers"": [""Libellud"", ""Morapiaf""], ""languages"": [""Spanish""], ""score"": 2}, {""version_id"": 60016, ""name"": ""Lautapelit.fi Nordic second edition 2010"", ""year"": 2010, ""publishers"": [""Lautapelit.fi"", ""Libellud""], ""languages"": [""Danish"", ""Finnish"", ""Norwegian"", ""Swedish""], ""score"": 2}, {""version_id"": 77683, ""name"": ""Libellud East-European edition 2010"", ""year"": 2010, ""publishers"": [""Libellud""], ""languages"": [""Czech"", ""Estonian"", ""Greek"", ""Hungarian"", ""Latvian"", ""Lithuanian"", ""Russian"", ""Slovak""], ""score"": 2}, {""version_id"": 69079, ""name"": ""Libellud German edition 2010 with SdJ"", ""year"": 2010, ""publishers"": [""Libellud""], ""languages"": [""German""], ""score"": 2}, {""version_id"": 154712, ""name"": ""Libellud Russian edition 2010"", ""year"": 2010, ""publishers"": [""Libellud""], ""languages"": [""Russian""], ""score"": 2}, {""version_id"": 168676, ""name"": ""Hobby Japan Japanese edition 2011"", ""year"": 2011, ""publishers"": [""Hobby Japan"", ""Libellud""], ""languages"": [""Japanese""], ""score"": 2}, {""version_id"": 132993, ""name"": ""Korean edition 2011"", ""year"": 2011, ""publishers"": [""Korea Boardgames"", ""Libellud""], ""languages"": [""Korean""], ""score"": 2}, {""version_id"": 171239, ""name"": ""Lautapelit.fi Nordic third edition 2011"", ""year"": 2011, ""publishers"": [""Lautapelit.fi"", ""Libellud""], ""languages"": [""Danish"", ""Finnish"", ""Norwegian"", ""Swedish""], ""score"": 2}, {""version_id"": 180533, ""name"": ""Swan Panasia Chinese edition 2011"", ""year"": 2011, ""publishers"": [""Libellud"", ""Swan Panasia Co., Ltd.""], ""languages"": [""Chinese""], ""score"": 2}, {""version_id"": 455396, ""name"": ""Lautapelit.fi Nordic edition 2012"", ""year"": 2012, ""publishers"": [""Lautapelit.fi"", ""Libellud""], ""languages"": [""Danish"", ""Finnish"", ""Norwegian"", ""Swedish""], ""score"": 2}, {""version_id"": 218513, ""name"": ""Galápagos Jogos Brazilian edition 2013"", ""year"": 2013, ""publishers"": [""Galápagos Jogos"", ""Libellud""], ""languages"": [""Portuguese""], ""score"": 2}, {""version_id"": 571272, ""name"": ""Korean edition 2013"", ""year"": 2013, ""publishers"": [""Korea Boardgames"", ""Libellud""], ""languages"": [""Korean""], ""score"": 2}, {""version_id"": 295526, ""name"": ""Lautapelit.fi Nordic edition 2013"", ""year"": 2013, ""publishers"": [""Lautapelit.fi"", ""Libellud""], ""languages"": [""Danish"", ""Finnish"", ""Norwegian"", ""Swedish""], ""score"": 2}, {""version_id"": 285443, ""name"": ""Asterion Press Italian edition 2014"", ""year"": 2014, ""publishers"": [""Asterion Press"", ""Libellud""], ""languages"": [""Italian""], ""score"": 2}, {""version_id"": 262742, ""name"": ""Gém Klub Hungarian edition 2014"", ""year"": 2014, ""publishers"": [""Gémklub"", ""Libellud""], ""languages"": [""Hungarian""], ""score"": 2}, {""version_id"": 241993, ""name"": ""German edition 2014"", ""year"": 2014, ""publishers"": [""Libellud""], ""languages"": [""German""], ""score"": 2}, {""version_id"": 258097, ""name"": ""Kaissa Greek second edition"", ""year"": 2014, ""publishers"": [""Kaissa Chess & Games"", ""Libellud""], ""languages"": [""Greek""], ""score"": 2}, {""version_id"": 444352, ""name"": ""Libellud Dutch/French/German/Italian edition 2014"", ""year"": 2014, ""publishers"": [""Libellud""], ""languages"": [""Dutch"", ""French"", ""German"", ""Italian""], ""score"": 2}, {""version_id"": 264541, ""name"": ""Libellud French edition 2014"", ""year"": 2014, ""publishers"": [""Libellud""], ""languages"": [""French""], ""score"": 2}, {""version_id"": 277730, ""name"": ""REBEL.pl Polish edition 2014"", ""year"": 2014, ""publishers"": [""Libellud"", ""Rebel Sp. z o.o.""], ""languages"": [""Polish""], ""score"": 2}, {""version_id"": 267692, ""name"": ""Swan Panasia Chinese second edition 2014"", ""year"": 2014, ""publishers"": [""Libellud"", ""Swan Panasia Co., Ltd.""], ""languages"": [""Chinese""], ""score"": 2}, {""version_id"": 673335, ""name"": ""German edition 2015"", ""year"": 2015, ""publishers"": [""Libellud""], ""languages"": [""German""], ""score"": 2}, {""version_id"": 329856, ""name"": ""Libellud German edition 2015"", ""year"": 2015, ""publishers"": [""Libellud""], ""languages"": [""German""], ""score"": 2}, {""version_id"": 302789, ""name"": ""Morapiaf Spanish/Portuguese/Catalan edition"", ""year"": 2015, ""publishers"": [""Libellud"", ""Morapiaf""], ""languages"": [""Catalan"", ""Portuguese"", ""Spanish""], ""score"": 2}, {""version_id"": 650415, ""name"": ""Multilingual edition 2015"", ""year"": 2015, ""publishers"": [""Libellud""], ""languages"": [""Dutch"", ""French"", ""German"", ""Italian""], ""score"": 2}, {""version_id"": 616351, ""name"": ""Ukrainian edition"", ""year"": 2015, ""publishers"": [""Libellud"", ""Ігромаг""], ""languages"": [""Ukrainian""], ""score"": 2}, {""version_id"": 740355, ""name"": ""Asterion Press Italian edition 2016"", ""year"": 2016, ""publishers"": [""Asterion Press"", ""Libellud""], ""languages"": [""Italian""], ""score"": 2}, {""version_id"": 620400, ""name"": ""Czech edition 2016"", ""year"": 2016, ""publishers"": [""ADC Blackfire Entertainment"", ""Libellud""], ""languages"": [""Czech""], ""score"": 2}, {""version_id"": 445188, ""name"": ""Galápagos Portuguese edition 2016"", ""year"": 2016, ""publishers"": [""Galápagos Jogos"", ""Libellud""], ""languages"": [""Portuguese""], ""score"": 2}, {""version_id"": 351092, ""name"": ""KADABRA Baltic edition"", ""year"": 2016, ""publishers"": [""KADABRA"", ""Libellud""], ""languages"": [""Estonian"", ""Latvian"", ""Lithuanian""], ""score"": 2}, {""version_id"": 314149, ""name"": ""Kaissa Greek third edition"", ""year"": 2016, ""publishers"": [""Kaissa Chess & Games"", ""Libellud""], ""languages"": [""Greek""], ""score"": 2}, {""version_id"": 486910, ""name"": ""Bulgarian edition"", ""year"": 2017, ""publishers"": [""Libellud""], ""languages"": [""Bulgarian""], ""score"": 2}, {""version_id"": 441974, ""name"": ""French edition 2017"", ""year"": 2017, ""publishers"": [""Libellud""], ""languages"": [""French""], ""score"": 2}, {""version_id"": 572425, ""name"": ""German edition 2017"", ""year"": 2017, ""publishers"": [""Libellud""], ""languages"": [""German""], ""score"": 2}, {""version_id"": 428190, ""name"": ""Multilingual edition 2017"", ""year"": 2017, ""publishers"": [""Libellud""], ""languages"": [""Dutch"", ""French"", ""German"", ""Italian""], ""score"": 2}, {""version_id"": 568074, ""name"": ""Turkish edition 2017"", ""year"": 2017, ""publishers"": [""Libellud""], ""languages"": [""Turkish""], ""score"": 2}, {""version_id"": 558607, ""name"": ""Chinese edition"", ""year"": 2018, ""publishers"": [""Libellud""], ""languages"": [""Chinese""], ""score"": 2}, {""version_id"": 602470, ""name"": ""German edition 2020"", ""year"": 2020, ""publishers"": [""Libellud""], ""languages"": [""German""], ""score"": 2}, {""version_id"": 709765, ""name"": ""Libellud Nordic edition 2020"", ""year"": 2020, ""publishers"": [""Libellud""], ""languages"": [""Danish"", ""Finnish"", ""Norwegian"", ""Swedish""], ""score"": 2}, {""version_id"": 710977, ""name"": ""Croatian/Macedonian/Serbian/Slovenian edition"", ""year"": 2021, ""publishers"": [""Libellud""], ""languages"": [""Croatian"", ""Macedonian"", ""Serbian"", ""Slovenian""], ""score"": 2}, {""version_id"": 592458, ""name"": ""Czech/Slovak edition 2021"", ""year"": 2021, ""publishers"": [""ADC Blackfire Entertainment"", ""Libellud""], ""languages"": [""Czech"", ""Slovak""], ""score"": 2}, {""version_id"": 636825, ""name"": ""French edition 2021"", ""year"": 2021, ""publishers"": [""Libellud""], ""languages"": [""French""], ""score"": 2}, {""version_id"": 801621, ""name"": ""French/German/Dutch edition 2021"", ""year"": 2021, ""publishers"": [""Libellud""], ""languages"": [""Dutch"", ""French"", ""German""], ""score"": 2}, {""version_id"": 624284, ""name"": ""Galápagos Portuguese edition 2021"", ""year"": 2021, ""publishers"": [""Galápagos Jogos"", ""Libellud""], ""languages"": [""Portuguese""], ""score"": 2}, {""version_id"": 645671, ""name"": ""German edition with \""Mehr als 8 Millionen verkaufte Exemplare\"""", ""year"": 2021, ""publishers"": [""Libellud""], ""languages"": [""German""], ""score"": 2}, {""version_id"": 571277, ""name"": ""Korean edition 2021"", ""year"": 2021, ""publishers"": [""Korea Boardgames"", ""Libellud""], ""languages"": [""Korean""], ""score"": 2}, {""version_id"": 580765, ""name"": ""Rebel Polish edition 2021"", ""year"": 2021, ""publishers"": [""Libellud"", ""Rebel Sp. z o.o.""], ""languages"": [""Polish""], ""score"": 2}, {""version_id"": 583823, ""name"": ""Spanish/Portuguese/Catalan edition 2021"", ""year"": 2021, ""publishers"": [""Libellud""], ""languages"": [""Catalan"", ""Portuguese"", ""Spanish""], ""score"": 2}, {""version_id"": 646232, ""name"": ""Turkish edition 2021"", ""year"": 2021, ""publishers"": [""Libellud""], ""languages"": [""Turkish""], ""score"": 2}, {""version_id"": 715849, ""name"": ""Czech/Slovak/Polish/Hungarian edition"", ""year"": 2022, ""publishers"": [""ADC Blackfire Entertainment"", ""Gémklub"", ""Libellud"", ""Rebel Sp. z o.o.""], ""languages"": [""Czech"", ""Hungarian"", ""Polish"", ""Slovak""], ""score"": 2}, {""version_id"": 694502, ""name"": ""Italian edition 2023"", ""year"": 2023, ""publishers"": [""Libellud""], ""languages"": [""Italian""], ""score"": 2}, {""version_id"": 641359, ""name"": ""Maldón Spanish edition"", ""year"": 2023, ""publishers"": [""Libellud"", ""Maldón""], ""languages"": [""Spanish""], ""score"": 2}, {""version_id"": 748806, ""name"": ""German edition 2024"", ""year"": 2024, ""publishers"": [""Libellud""], ""languages"": [""German""], ""score"": 2}, {""version_id"": 689598, ""name"": ""Arabic/English revised edition"", ""year"": 0, ""publishers"": [""Boardgame Space""], ""languages"": [""Arabic"", ""English""], ""score"": 1}, {""version_id"": 745746, ""name"": ""Gém Klub Hungarian edition 2021"", ""year"": 2021, ""publishers"": [""Gémklub""], ""languages"": [""Hungarian""], ""score"": 0}, {""version_id"": 733565, ""name"": ""Italian edition 2021"", ""year"": 2021, ""publishers"": [""asmodee""], ""languages"": [""Italian""], ""score"": 0}]",IMG_4514.jpeg,,
Huggermugger,2387,Huggermugger,1989,boardgame,auto,,,version_unknown,"[{""bgg_id"": 2387, ""name"": ""Huggermugger"", ""year"": 1989, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": null, ""rank"": null}]",[],IMG_4514.jpeg,,
The Rocky Horror Trivia Game,20866,The Rocky Horror Trivia Game,2005,boardgame,auto,,,version_unknown,"[{""bgg_id"": 20866, ""name"": ""The Rocky Horror Trivia Game"", ""year"": 2005, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": null, ""rank"": null}]",[],IMG_4514.jpeg,,
@@ -82,7 +82,7 @@ FLUXX,258,Fluxx,1997,boardgame,auto,20840,Looney Labs Version v2.1,version_appro
Poetry for Neanderthals,312786,Poetry for Neanderthals,2020,boardgame,auto,,,version_ambiguous,"[{""bgg_id"": 312786, ""name"": ""Poetry for Neanderthals"", ""year"": 2020, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": null, ""rank"": null}]","[{""version_id"": 514050, ""name"": ""English edition 2020"", ""year"": 2020, ""publishers"": [""Exploding Kittens""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 655388, ""name"": ""English edition 2022"", ""year"": 2022, ""publishers"": [""Exploding Kittens""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 782169, ""name"": ""English edition 2024"", ""year"": 2024, ""publishers"": [""Exploding Kittens""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 746180, ""name"": ""English Grab & Game edition 2023"", ""year"": 2023, ""publishers"": [""Exploding Kittens""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 786184, ""name"": ""English Grab & Game edition 2025"", ""year"": 2025, ""publishers"": [""Exploding Kittens""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 735751, ""name"": ""Dutch edition"", ""year"": 2024, ""publishers"": [""Exploding Kittens""], ""languages"": [""Dutch""], ""score"": 2}, {""version_id"": 783801, ""name"": ""French edition"", ""year"": 2023, ""publishers"": [""Exploding Kittens""], ""languages"": [""French""], ""score"": 2}, {""version_id"": 632084, ""name"": ""German edition"", ""year"": 2022, ""publishers"": [""Exploding Kittens""], ""languages"": [""German""], ""score"": 2}]",IMG_4526.jpeg,,
Elite Sportz Equipment Table Top Curling,,,,,local,,,,[],[],IMG_4526.jpeg,,
Simon's Cat Card Game,188614,Simon's Cat Card Game,2016,boardgame,auto,,,version_ambiguous,"[{""bgg_id"": 188614, ""name"": ""Simon's Cat Card Game"", ""year"": 2016, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": 1429, ""rank"": 12119}, {""bgg_id"": 330317, ""name"": ""NOM: Simon's Cat Card Game"", ""year"": 2021, ""type"": ""boardgame"", ""exact"": false, ""fuzzy"": 91.3, ""owned"": 70, ""rank"": null}]","[{""version_id"": 292307, ""name"": ""English edition, first printing"", ""year"": 2016, ""publishers"": [""Steve Jackson Games""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 779792, ""name"": ""English edition, second printing"", ""year"": 2016, ""publishers"": [""Steve Jackson Games""], ""languages"": [""English""], ""score"": 3}]",IMG_4526.jpeg,,
-The Red Dragon Inn: Smorgasbox,273240,The Red Dragon Inn Smorgasbox,2019,boardgame,auto,,,version_ambiguous,"[{""bgg_id"": 273240, ""name"": ""The Red Dragon Inn Smorgasbox"", ""year"": 2019, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": null, ""rank"": null}]","[{""version_id"": 446786, ""name"": ""Collector's edition"", ""year"": 2019, ""publishers"": [""SlugFest Games""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 446788, ""name"": ""Eco-Collector's edition"", ""year"": 2019, ""publishers"": [""SlugFest Games""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 446787, ""name"": ""Eco-Kickstarter edition"", ""year"": 2019, ""publishers"": [""SlugFest Games""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 446069, ""name"": ""Kickstarter edition"", ""year"": 2019, ""publishers"": [""SlugFest Games""], ""languages"": [""English""], ""score"": 3}]",IMG_4527.jpeg,,
+The Red Dragon Inn: Smorgasbox,273240,The Red Dragon Inn Smorgasbox,2019,boardgame,auto,446069,Kickstarter edition,version_approved,"[{""bgg_id"": 273240, ""name"": ""The Red Dragon Inn Smorgasbox"", ""year"": 2019, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": null, ""rank"": null}]","[{""version_id"": 446786, ""name"": ""Collector's edition"", ""year"": 2019, ""publishers"": [""SlugFest Games""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 446788, ""name"": ""Eco-Collector's edition"", ""year"": 2019, ""publishers"": [""SlugFest Games""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 446787, ""name"": ""Eco-Kickstarter edition"", ""year"": 2019, ""publishers"": [""SlugFest Games""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 446069, ""name"": ""Kickstarter edition"", ""year"": 2019, ""publishers"": [""SlugFest Games""], ""languages"": [""English""], ""score"": 3}]",IMG_4527.jpeg,,
WIZ-WAR,589,Wiz-War,1983,boardgame,auto,,,version_ambiguous,"[{""bgg_id"": 589, ""name"": ""Wiz-War"", ""year"": 1983, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": null, ""rank"": null}]","[{""version_id"": 360420, ""name"": ""Third edition"", ""year"": 1986, ""publishers"": [""Jolly Games""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 29214, ""name"": ""Fourth edition"", ""year"": 1987, ""publishers"": [""Jolly Games""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 26114, ""name"": ""Fifth edition"", ""year"": 1991, ""publishers"": [""Chessex""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 188937, ""name"": ""First edition"", ""year"": 1985, ""publishers"": [""Jolly Games""], ""languages"": [""English""], ""score"": 1}, {""version_id"": 360421, ""name"": ""Second edition"", ""year"": 1985, ""publishers"": [""Jolly Games""], ""languages"": [""English""], ""score"": 1}, {""version_id"": 27352, ""name"": ""Chessex sixth edition"", ""year"": 1993, ""publishers"": [""Chessex""], ""languages"": [""English""], ""score"": 1}, {""version_id"": 28612, ""name"": ""Chessex classic edition 1997"", ""year"": 1997, ""publishers"": [""Chessex""], ""languages"": [""English""], ""score"": 1}]",IMG_4528.jpeg,,
RISK THE LORD OF THE RINGS: The Middle-earth Conquest Game,4324,Risk: The Lord of the Rings,2002,boardgame,auto,26859,English edition 2002,version_approved,"[{""bgg_id"": 4324, ""name"": ""Risk: The Lord of the Rings"", ""year"": 2002, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 57.1, ""owned"": null, ""rank"": null}]","[{""version_id"": 33264, ""name"": ""English (UK) edition 2002"", ""year"": 2002, ""publishers"": [""Hasbro"", ""Parker Brothers""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 26859, ""name"": ""English edition 2002"", ""year"": 2002, ""publishers"": [""Hasbro"", ""Parker Brothers""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 26863, ""name"": ""English/French edition"", ""year"": 2002, ""publishers"": [""Parker Brothers""], ""languages"": [""English"", ""French""], ""score"": 3}, {""version_id"": 26865, ""name"": ""Danish edition"", ""year"": 2002, ""publishers"": [""Parker Brothers""], ""languages"": [""Danish""], ""score"": 2}, {""version_id"": 26861, ""name"": ""Dutch edition"", ""year"": 2002, ""publishers"": [""Parker Brothers""], ""languages"": [""Dutch""], ""score"": 2}, {""version_id"": 77144, ""name"": ""French edition 2002"", ""year"": 2002, ""publishers"": [""Hasbro"", ""Parker Brothers""], ""languages"": [""French""], ""score"": 2}, {""version_id"": 26862, ""name"": ""German edition"", ""year"": 2002, ""publishers"": [""Parker Brothers""], ""languages"": [""German""], ""score"": 2}, {""version_id"": 75135, ""name"": ""Norwegian edition"", ""year"": 2002, ""publishers"": [""Parker Brothers""], ""languages"": [""Norwegian""], ""score"": 2}]",IMG_4529.jpeg,,
Ouija,,,,,local,,,,[],[],IMG_4529.jpeg,,
@@ -94,7 +94,7 @@ Tang Garden,252153,Tang Garden,2019,boardgame,auto,404702,English edition,versio
Everdell The Complete Collection,332398,Everdell: The Complete Collection,2022,boardgame,auto,,,version_unknown,"[{""bgg_id"": 332398, ""name"": ""Everdell: The Complete Collection"", ""year"": 2022, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": null, ""rank"": null}]",[],IMG_4533.jpeg,,
Verdant,334065,Verdant,2022,boardgame,auto,,,version_unknown,"[{""bgg_id"": 334065, ""name"": ""Verdant"", ""year"": 2022, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": null, ""rank"": null}]",[],IMG_4534.jpeg,,
Calico,283155,Calico,2020,boardgame,auto,,,version_unknown,"[{""bgg_id"": 283155, ""name"": ""Calico"", ""year"": 2020, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": null, ""rank"": null}]",[],IMG_4534.jpeg,,
-Sleeping Gods,255984,Sleeping Gods,2021,boardgame,auto,,,version_ambiguous,"[{""bgg_id"": 255984, ""name"": ""Sleeping Gods"", ""year"": 2021, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": null, ""rank"": null}]","[{""version_id"": 701034, ""name"": ""English Gamefound edition"", ""year"": 2023, ""publishers"": [""Red Raven Games""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 411331, ""name"": ""English retail edition"", ""year"": 2021, ""publishers"": [""Red Raven Games""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 579776, ""name"": ""Chinese edition"", ""year"": 2022, ""publishers"": [""Banana Games"", ""Red Raven Games""], ""languages"": [""Chinese""], ""score"": 2}, {""version_id"": 602021, ""name"": ""Czech edition"", ""year"": 2023, ""publishers"": [""Red Raven Games"", ""Rexhry""], ""languages"": [""Czech""], ""score"": 2}, {""version_id"": 621916, ""name"": ""French edition"", ""year"": 2022, ""publishers"": [""Lucky Duck Games"", ""Red Raven Games""], ""languages"": [""French""], ""score"": 2}, {""version_id"": 668142, ""name"": ""Japanese edition"", ""year"": 2023, ""publishers"": [""Red Raven Games"", ""リゴレ (rigoler)""], ""languages"": [""Japanese""], ""score"": 2}, {""version_id"": 543400, ""name"": ""Korean edition"", ""year"": 2022, ""publishers"": [""Lotus Frog Games"", ""Red Raven Games""], ""languages"": [""Korean""], ""score"": 2}, {""version_id"": 588954, ""name"": ""Russian edition"", ""year"": 2023, ""publishers"": [""Lavka Games"", ""Red Raven Games""], ""languages"": [""Russian""], ""score"": 2}]",IMG_4534.jpeg,,
+Sleeping Gods,255984,Sleeping Gods,2021,boardgame,auto,701034,English Gamefound edition,version_approved,"[{""bgg_id"": 255984, ""name"": ""Sleeping Gods"", ""year"": 2021, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": null, ""rank"": null}]","[{""version_id"": 701034, ""name"": ""English Gamefound edition"", ""year"": 2023, ""publishers"": [""Red Raven Games""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 411331, ""name"": ""English retail edition"", ""year"": 2021, ""publishers"": [""Red Raven Games""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 579776, ""name"": ""Chinese edition"", ""year"": 2022, ""publishers"": [""Banana Games"", ""Red Raven Games""], ""languages"": [""Chinese""], ""score"": 2}, {""version_id"": 602021, ""name"": ""Czech edition"", ""year"": 2023, ""publishers"": [""Red Raven Games"", ""Rexhry""], ""languages"": [""Czech""], ""score"": 2}, {""version_id"": 621916, ""name"": ""French edition"", ""year"": 2022, ""publishers"": [""Lucky Duck Games"", ""Red Raven Games""], ""languages"": [""French""], ""score"": 2}, {""version_id"": 668142, ""name"": ""Japanese edition"", ""year"": 2023, ""publishers"": [""Red Raven Games"", ""リゴレ (rigoler)""], ""languages"": [""Japanese""], ""score"": 2}, {""version_id"": 543400, ""name"": ""Korean edition"", ""year"": 2022, ""publishers"": [""Lotus Frog Games"", ""Red Raven Games""], ""languages"": [""Korean""], ""score"": 2}, {""version_id"": 588954, ""name"": ""Russian edition"", ""year"": 2023, ""publishers"": [""Lavka Games"", ""Red Raven Games""], ""languages"": [""Russian""], ""score"": 2}]",IMG_4534.jpeg,,
Sleeping Gods: Tides of Ruin,283766,Sleeping Gods: Tides of Ruin,2021,boardgame,auto,463140,English edition,version_auto,"[{""bgg_id"": 283766, ""name"": ""Sleeping Gods: Tides of Ruin"", ""year"": 2021, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": null, ""rank"": null}]","[{""version_id"": 463140, ""name"": ""English edition"", ""year"": 2021, ""publishers"": [""Red Raven Games""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 643180, ""name"": ""Chinese edition"", ""year"": 2022, ""publishers"": [""Banana Games"", ""Red Raven Games""], ""languages"": [""Chinese""], ""score"": 2}, {""version_id"": 621921, ""name"": ""French edition"", ""year"": 2022, ""publishers"": [""Lucky Duck Games"", ""Red Raven Games""], ""languages"": [""French""], ""score"": 2}, {""version_id"": 594739, ""name"": ""Korean edition"", ""year"": 2022, ""publishers"": [""Lotus Frog Games"", ""Red Raven Games""], ""languages"": [""Korean""], ""score"": 2}, {""version_id"": 696922, ""name"": ""Portuguese edition"", ""year"": 2023, ""publishers"": [""Conclave Editora"", ""Red Raven Games""], ""languages"": [""Portuguese""], ""score"": 2}, {""version_id"": 590839, ""name"": ""Russian edition"", ""year"": 2023, ""publishers"": [""Lavka Games"", ""Red Raven Games""], ""languages"": [""Russian""], ""score"": 2}, {""version_id"": 641576, ""name"": ""Spanish edition"", ""year"": 2022, ""publishers"": [""Maldito Games"", ""Red Raven Games""], ""languages"": [""Spanish""], ""score"": 2}, {""version_id"": 590426, ""name"": ""Ukrainian edition"", ""year"": 2023, ""publishers"": [""Games7Days"", ""Red Raven Games""], ""languages"": [""Ukrainian""], ""score"": 2}]",IMG_4534.jpeg,,
ETHERFIELDS,280794,Etherfields,2020,boardgame,auto,458300,English edition,version_auto,"[{""bgg_id"": 280794, ""name"": ""Etherfields"", ""year"": 2020, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": null, ""rank"": null}]","[{""version_id"": 458300, ""name"": ""English edition"", ""year"": 2020, ""publishers"": [""Awaken Realms""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 518823, ""name"": ""French edition"", ""year"": 2021, ""publishers"": [""Awaken Realms""], ""languages"": [""French""], ""score"": 2}, {""version_id"": 511032, ""name"": ""German edition"", ""year"": 2021, ""publishers"": [""Awaken Realms""], ""languages"": [""German""], ""score"": 2}, {""version_id"": 518825, ""name"": ""Italian edition"", ""year"": 2021, ""publishers"": [""Awaken Realms""], ""languages"": [""Italian""], ""score"": 2}, {""version_id"": 518826, ""name"": ""Polish edition"", ""year"": 2021, ""publishers"": [""Awaken Realms""], ""languages"": [""Polish""], ""score"": 2}, {""version_id"": 518824, ""name"": ""Spanish edition"", ""year"": 2021, ""publishers"": [""Awaken Realms""], ""languages"": [""Spanish""], ""score"": 2}]",IMG_4535.jpeg,,
BOTANY,380837,Botany,2024,boardgame,auto,650545,English edition,version_auto,"[{""bgg_id"": 380837, ""name"": ""Botany"", ""year"": 2024, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": null, ""rank"": null}]","[{""version_id"": 650545, ""name"": ""English edition"", ""year"": 2024, ""publishers"": [""Dux Somnium Games""], ""languages"": [""English""], ""score"": 3}]",IMG_4536.jpeg,,
@@ -105,7 +105,7 @@ Greed Quest,9666,Greed Quest,2004,boardgame,auto,215137,English edition,version_
GLOOMHAVEN - Jaws of the Lion,291457,Gloomhaven: Jaws of the Lion,2020,boardgame,auto,,,version_unknown,"[{""bgg_id"": 291457, ""name"": ""Gloomhaven: Jaws of the Lion"", ""year"": 2020, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": null, ""rank"": null}]",[],IMG_4538.jpeg,,
SCRABBLE SLAM!,40508,Scrabble Slam!,2008,boardgame,auto,,,version_ambiguous,"[{""bgg_id"": 40508, ""name"": ""Scrabble Slam!"", ""year"": 2008, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": null, ""rank"": null}]","[{""version_id"": 39335, ""name"": ""English edition"", ""year"": 2009, ""publishers"": [""Hasbro""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 644326, ""name"": ""English edition with Hasbro logo"", ""year"": 2008, ""publishers"": [""Hasbro"", ""Parker Brothers""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 25061, ""name"": ""English edition with Parker Brothers logo"", ""year"": 2008, ""publishers"": [""Hasbro"", ""Parker Brothers""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 294332, ""name"": ""English/French edition"", ""year"": 2008, ""publishers"": [""Hasbro"", ""Parker Brothers""], ""languages"": [""English"", ""French""], ""score"": 3}, {""version_id"": 480950, ""name"": ""English/French edition"", ""year"": 2014, ""publishers"": [""Hasbro""], ""languages"": [""English"", ""French""], ""score"": 3}, {""version_id"": 116530, ""name"": ""Dutch edition"", ""year"": 2009, ""publishers"": [""Hasbro""], ""languages"": [""Dutch""], ""score"": 2}, {""version_id"": 345823, ""name"": ""French edition"", ""year"": 2009, ""publishers"": [""Hasbro""], ""languages"": [""French""], ""score"": 2}, {""version_id"": 111167, ""name"": ""German edition"", ""year"": 2010, ""publishers"": [""Hasbro""], ""languages"": [""German""], ""score"": 2}]",IMG_4543.jpeg,,
CAT STAX,,,,,local,,,,[],[],IMG_4544.jpeg,,
-POCKET FARKEL,3181,Farkle,1930,boardgame,approved,,,version_ambiguous,[],"[{""version_id"": 374844, ""name"": ""Legendary Games black flat pack edition"", ""year"": 1996, ""publishers"": [""Legendary Games, Inc.""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 390425, ""name"": ""Legendary Games blister pack editon"", ""year"": 0, ""publishers"": [""Cardinal"", ""Legendary Games, Inc.""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 87931, ""name"": ""Legendary Games cannister edition"", ""year"": 0, ""publishers"": [""Legendary Games, Inc."", ""Reveal Entertainment, Inc.""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 295385, ""name"": ""Legendary Games dice rolling tray edition"", ""year"": 2006, ""publishers"": [""Legendary Games, Inc.""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 658688, ""name"": ""Legendary Games English/Spanish \""Alaska: The Last Frontier\"" edition"", ""year"": 1999, ""publishers"": [""Legendary Games, Inc.""], ""languages"": [""English"", ""Spanish""], ""score"": 3}, {""version_id"": 374847, ""name"": ""Legendary Games flat pack edition"", ""year"": 0, ""publishers"": [""Legendary Games, Inc.""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 247184, ""name"": ""Legendary Games flat pack edition 1996"", ""year"": 1996, ""publishers"": [""Legendary Games, Inc.""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 374842, ""name"": ""Legendary Games flat pack edition 1996"", ""year"": 1996, ""publishers"": [""Legendary Games, Inc.""], ""languages"": [""English""], ""score"": 3}]",IMG_4545.jpeg,,
+POCKET FARKEL,3181,Farkle,1930,boardgame,approved,87931,Legendary Games cannister edition,version_approved,[],"[{""version_id"": 374844, ""name"": ""Legendary Games black flat pack edition"", ""year"": 1996, ""publishers"": [""Legendary Games, Inc.""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 390425, ""name"": ""Legendary Games blister pack editon"", ""year"": 0, ""publishers"": [""Cardinal"", ""Legendary Games, Inc.""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 87931, ""name"": ""Legendary Games cannister edition"", ""year"": 0, ""publishers"": [""Legendary Games, Inc."", ""Reveal Entertainment, Inc.""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 295385, ""name"": ""Legendary Games dice rolling tray edition"", ""year"": 2006, ""publishers"": [""Legendary Games, Inc.""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 658688, ""name"": ""Legendary Games English/Spanish \""Alaska: The Last Frontier\"" edition"", ""year"": 1999, ""publishers"": [""Legendary Games, Inc.""], ""languages"": [""English"", ""Spanish""], ""score"": 3}, {""version_id"": 374847, ""name"": ""Legendary Games flat pack edition"", ""year"": 0, ""publishers"": [""Legendary Games, Inc.""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 247184, ""name"": ""Legendary Games flat pack edition 1996"", ""year"": 1996, ""publishers"": [""Legendary Games, Inc.""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 374842, ""name"": ""Legendary Games flat pack edition 1996"", ""year"": 1996, ""publishers"": [""Legendary Games, Inc.""], ""languages"": [""English""], ""score"": 3}]",IMG_4545.jpeg,,
Go Fish Yourself,173057,Go Fish Yourself,2015,boardgame,auto,,,version_unknown,"[{""bgg_id"": 173057, ""name"": ""Go Fish Yourself"", ""year"": 2015, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": null, ""rank"": null}]",[],IMG_4546.jpeg,,
Hold your Breath!,150925,Hold Your Breath!,2014,boardgame,auto,,,version_unknown,"[{""bgg_id"": 150925, ""name"": ""Hold Your Breath!"", ""year"": 2014, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": null, ""rank"": null}]",[],IMG_4547.jpeg,,
Dastardly Dirigibles,193485,Dastardly Dirigibles,2016,boardgame,auto,300446,English edition,version_auto,"[{""bgg_id"": 193485, ""name"": ""Dastardly Dirigibles"", ""year"": 2016, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": null, ""rank"": null}]","[{""version_id"": 300446, ""name"": ""English edition"", ""year"": 2016, ""publishers"": [""Fireside Games""], ""languages"": [""English""], ""score"": 3}]",IMG_4548.jpeg,,
diff --git a/src/bggpipe/resolve.py b/src/bggpipe/resolve.py
index 766ef0b..ad019f7 100644
--- a/src/bggpipe/resolve.py
+++ b/src/bggpipe/resolve.py
@@ -89,6 +89,7 @@ class Candidate:
type: str
exact: bool
fuzzy: float
+ sibling: bool = False # exactness earned via edition-suffix stripping
owned: int | None = None
rank: int | None = None
publishers: list[str] = field(default_factory=list)
@@ -226,6 +227,18 @@ def _plausible_candidates(
for result in results:
norm = normalize_title(result.name)
exact = norm == entry.title_normalized
+ # BGG files new editions as SEPARATE games named "X (Nth Edition)":
+ # a name that equals the title once its trailing parenthetical is
+ # stripped is a sibling edition — exact-grade, or the match looks
+ # unanimously confident while hiding the real choice (Wiz-War has
+ # three same-named lineages; the spec's top failure mode)
+ sibling = False
+ if not exact and result.type != "boardgameexpansion":
+ sibling = (
+ normalize_title(_EDITION_SUFFIX.sub("", result.name))
+ == entry.title_normalized
+ )
+ exact = sibling
fuzzy = fuzz.token_sort_ratio(norm, entry.title_normalized)
if not exact and fuzzy < FUZZY_THRESHOLD:
if not (head_normalized and norm == head_normalized):
@@ -237,6 +250,7 @@ def _plausible_candidates(
year=result.year,
type=result.type,
exact=exact,
+ sibling=sibling,
fuzzy=fuzzy,
)
prev = by_id.get(result.bgg_id)
@@ -255,7 +269,23 @@ def _classify(client: BGGClient, entry: TitleEntry, cands: list[Candidate]) -> M
return row
if len(cands) == 1:
- chosen = cands[0]
+ # a lone candidate must still earn trust: BGG's search visibly
+ # truncates generic queries (the game named "Dungeon!" appears in
+ # NEITHER of its own searches), so the sole survivor may be an
+ # impostor standing where the famous game should be. Sibling-grade
+ # exactness never autos alone, and a true exact must clear the
+ # same ownership floor the dominance rule enforces.
+ only = cands[0]
+ stats = {t.bgg_id: t for t in client.things([only.bgg_id], stats=True)}
+ if only.bgg_id in stats:
+ only.owned = stats[only.bgg_id].owned
+ only.rank = stats[only.bgg_id].rank
+ only.publishers = list(stats[only.bgg_id].publishers)
+ row.candidates = [only]
+ if only.sibling or not only.exact or (only.owned or 0) < DOMINANCE_MIN_OWNED:
+ row.match_status = "ambiguous"
+ return row
+ chosen = only
else:
top = cands[:5]
stats = {
@@ -391,8 +421,36 @@ def resolve_version(client: BGGClient, entry: TitleEntry, row: MatchRow) -> None
row.version_status = "version_ambiguous"
+_EDITION_SUFFIX = re.compile(r"\s*\([^)]*\)\s*$")
+_PUNCT = re.compile(r"[^\w\s]", re.UNICODE)
+
+
+def _depunct(title: str) -> str:
+ """BGG's search engine can choke on punctuation — the game literally
+ named "Dungeon!" is missing from its own 824-result search. A plain
+ query recovers it."""
+ return " ".join(_PUNCT.sub(" ", title).split())
+
+
+def _merged_candidates(
+ client: BGGClient, entry: TitleEntry, query: str, types: str | None = None
+) -> list[Candidate]:
+ """Search the raw title AND its punctuation-free form, merged by id
+ (strongest evidence wins)."""
+ cands = _plausible_candidates(client, entry, query, types=types)
+ plain = _depunct(query)
+ if plain.casefold() != query.casefold():
+ by_id = {c.bgg_id: c for c in cands}
+ for c in _plausible_candidates(client, entry, plain, types=types):
+ prev = by_id.get(c.bgg_id)
+ if prev is None or (c.exact, c.fuzzy) > (prev.exact, prev.fuzzy):
+ by_id[c.bgg_id] = c
+ cands = sorted(by_id.values(), key=lambda c: (not c.exact, -c.fuzzy))
+ return cands
+
+
def resolve_entry(client: BGGClient, entry: TitleEntry) -> MatchRow:
- cands = _plausible_candidates(client, entry, entry.title_raw)
+ cands = _merged_candidates(client, entry, entry.title_raw)
if not cands:
# Long transcribed box titles ("CIVILIZATION Game of the Heroic
# Age - ...") defeat search: retry with progressively shorter heads
@@ -406,7 +464,7 @@ def resolve_entry(client: BGGClient, entry: TitleEntry) -> MatchRow:
# type=rpgitem (same API, same token). A hit becomes a LOCAL
# library citizen: identified and enriched, never uploaded (diff
# routes rpgitem rows to local_only).
- cands = _plausible_candidates(client, entry, entry.title_raw, types="rpgitem")
+ cands = _merged_candidates(client, entry, entry.title_raw, types="rpgitem")
if not cands:
for head in _truncation_heads(entry.title_raw):
cands = _plausible_candidates(
diff --git a/tests/data/titles.json b/tests/data/titles.json
index ff25601..feb8091 100644
--- a/tests/data/titles.json
+++ b/tests/data/titles.json
@@ -106,5 +106,19 @@
"source_photos": [
"hand-typed-test-list"
]
+ },
+ {
+ "title_raw": "Dungeon!",
+ "confidence": "high",
+ "source_photos": [
+ "hand-typed-test-list"
+ ]
+ },
+ {
+ "title_raw": "WIZ-WAR",
+ "confidence": "high",
+ "source_photos": [
+ "hand-typed-test-list"
+ ]
}
]
diff --git a/tests/fixtures/bgg_cache/search_query=ADVANCED-CIVILIZATION-Game-Expansion-of-the-Heroic-Age-Featuring-New-Civil_412c8dcab4.xml b/tests/fixtures/bgg_cache/search_query=ADVANCED-CIVILIZATION-Game-Expansion-of-the-Heroic-Age-Featuring-New-Civil_412c8dcab4.xml
new file mode 100644
index 0000000..9c47559
--- /dev/null
+++ b/tests/fixtures/bgg_cache/search_query=ADVANCED-CIVILIZATION-Game-Expansion-of-the-Heroic-Age-Featuring-New-Civil_412c8dcab4.xml
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/tests/fixtures/bgg_cache/search_query=ALICE-IS-MISSING-A-SILENT-ROLE-PLAYING-GAME-type=boardgame-2Cboardgameexpa_8e11e8939a.xml b/tests/fixtures/bgg_cache/search_query=ALICE-IS-MISSING-A-SILENT-ROLE-PLAYING-GAME-type=boardgame-2Cboardgameexpa_8e11e8939a.xml
new file mode 100644
index 0000000..9c47559
--- /dev/null
+++ b/tests/fixtures/bgg_cache/search_query=ALICE-IS-MISSING-A-SILENT-ROLE-PLAYING-GAME-type=boardgame-2Cboardgameexpa_8e11e8939a.xml
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/tests/fixtures/bgg_cache/search_query=ALICE-IS-MISSING-A-SILENT-ROLE-PLAYING-GAME-type=rpgitem_0e827fceb0.xml b/tests/fixtures/bgg_cache/search_query=ALICE-IS-MISSING-A-SILENT-ROLE-PLAYING-GAME-type=rpgitem_0e827fceb0.xml
new file mode 100644
index 0000000..3907bdd
--- /dev/null
+++ b/tests/fixtures/bgg_cache/search_query=ALICE-IS-MISSING-A-SILENT-ROLE-PLAYING-GAME-type=rpgitem_0e827fceb0.xml
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/tests/fixtures/bgg_cache/search_query=Blorvath-Quest-of-the-Zzyzx-type=boardgame-2Cboardgameexpansion_b9a871dba6.xml b/tests/fixtures/bgg_cache/search_query=Blorvath-Quest-of-the-Zzyzx-type=boardgame-2Cboardgameexpansion_b9a871dba6.xml
new file mode 100644
index 0000000..9c47559
--- /dev/null
+++ b/tests/fixtures/bgg_cache/search_query=Blorvath-Quest-of-the-Zzyzx-type=boardgame-2Cboardgameexpansion_b9a871dba6.xml
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/tests/fixtures/bgg_cache/search_query=Blorvath-Quest-of-the-Zzyzx-type=rpgitem_d85d73d697.xml b/tests/fixtures/bgg_cache/search_query=Blorvath-Quest-of-the-Zzyzx-type=rpgitem_d85d73d697.xml
new file mode 100644
index 0000000..3907bdd
--- /dev/null
+++ b/tests/fixtures/bgg_cache/search_query=Blorvath-Quest-of-the-Zzyzx-type=rpgitem_d85d73d697.xml
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/tests/fixtures/bgg_cache/search_query=CIVILIZATION-Game-of-the-Heroic-Age-The-Dawn-of-History-8000-BC-to-250-BC_86cd44cff6.xml b/tests/fixtures/bgg_cache/search_query=CIVILIZATION-Game-of-the-Heroic-Age-The-Dawn-of-History-8000-BC-to-250-BC_86cd44cff6.xml
new file mode 100644
index 0000000..9c47559
--- /dev/null
+++ b/tests/fixtures/bgg_cache/search_query=CIVILIZATION-Game-of-the-Heroic-Age-The-Dawn-of-History-8000-BC-to-250-BC_86cd44cff6.xml
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/tests/fixtures/bgg_cache/search_query=Dungeon-21-type=boardgame-2Cboardgameexpansion_9c49c5766f.xml b/tests/fixtures/bgg_cache/search_query=Dungeon-21-type=boardgame-2Cboardgameexpansion_9c49c5766f.xml
new file mode 100644
index 0000000..2a0b15f
--- /dev/null
+++ b/tests/fixtures/bgg_cache/search_query=Dungeon-21-type=boardgame-2Cboardgameexpansion_9c49c5766f.xml
@@ -0,0 +1,3329 @@
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+ -
+
+
+
+ -
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+ -
+
+
+
+ -
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+
\ No newline at end of file
diff --git a/tests/fixtures/bgg_cache/search_query=Dungeon-type=boardgame-2Cboardgameexpansion_119bee7b07.xml b/tests/fixtures/bgg_cache/search_query=Dungeon-type=boardgame-2Cboardgameexpansion_119bee7b07.xml
new file mode 100644
index 0000000..2a0b15f
--- /dev/null
+++ b/tests/fixtures/bgg_cache/search_query=Dungeon-type=boardgame-2Cboardgameexpansion_119bee7b07.xml
@@ -0,0 +1,3329 @@
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+ -
+
+
+
+ -
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+ -
+
+
+
+ -
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+
\ No newline at end of file
diff --git a/tests/fixtures/bgg_cache/search_query=WIZ-WAR-type=boardgame-2Cboardgameexpansion_3e23f47f79.xml b/tests/fixtures/bgg_cache/search_query=WIZ-WAR-type=boardgame-2Cboardgameexpansion_3e23f47f79.xml
new file mode 100644
index 0000000..3b0ef2e
--- /dev/null
+++ b/tests/fixtures/bgg_cache/search_query=WIZ-WAR-type=boardgame-2Cboardgameexpansion_3e23f47f79.xml
@@ -0,0 +1,45 @@
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+
\ No newline at end of file
diff --git a/tests/fixtures/bgg_cache/search_query=WIZ-WAR-type=boardgame-2Cboardgameexpansion_b85d5818a6.xml b/tests/fixtures/bgg_cache/search_query=WIZ-WAR-type=boardgame-2Cboardgameexpansion_b85d5818a6.xml
new file mode 100644
index 0000000..b6dcccd
--- /dev/null
+++ b/tests/fixtures/bgg_cache/search_query=WIZ-WAR-type=boardgame-2Cboardgameexpansion_b85d5818a6.xml
@@ -0,0 +1,165 @@
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+
\ No newline at end of file
diff --git a/tests/fixtures/bgg_cache/search_query=Wingspan-European-Expansion-type=boardgame-2Cboardgameexpansion_bef987a79b.xml b/tests/fixtures/bgg_cache/search_query=Wingspan-European-Expansion-type=boardgame-2Cboardgameexpansion_bef987a79b.xml
new file mode 100644
index 0000000..a03af8e
--- /dev/null
+++ b/tests/fixtures/bgg_cache/search_query=Wingspan-European-Expansion-type=boardgame-2Cboardgameexpansion_bef987a79b.xml
@@ -0,0 +1,9 @@
+ -
+
+
+
+ -
+
+
+
+
\ No newline at end of file
diff --git a/tests/fixtures/bgg_cache/thing_id=177-stats=1_756de61ca5.xml b/tests/fixtures/bgg_cache/thing_id=177-stats=1_756de61ca5.xml
new file mode 100644
index 0000000..2781246
--- /dev/null
+++ b/tests/fixtures/bgg_cache/thing_id=177-stats=1_756de61ca5.xml
@@ -0,0 +1,429 @@
+-
+ https://cf.geekdo-images.com/9ROB7NpxefRUmpR9UroQ8w__small/img/XDH667tVl2KjQ6szNjT7ceEmh5E=/fit-in/200x150/filters:strip_icc()/pic87459.jpg
+ https://cf.geekdo-images.com/9ROB7NpxefRUmpR9UroQ8w__original/img/--qlhvNNj8zF9cWLlihdTg0jzmE=/0x0/filters:format(jpeg)/pic87459.jpg
+
+
+
+
+ The use of the word "Advanced" to describe this expansion followed existing Avalon Hill tradition. "Enhanced" is likely more appropriate. Playing with this expansion is no more difficult than playing the base Civilization game. This expansion reworks a few of the original rules, includes a reworked version of Civilization: Expansion Trade Cards Set and adds more civilization advancements to the technology tree.
+
+Included are more civilization advancements (both quantity and type), which give the players new options for advancement, as well as a slightly restructured commodity trading round, which has new resources and disasters to be traded. The most significant aspect of the game is a restructuring of the advancement/victory conditions, which remove the limits on advancement cards. Some claim this makes the strategies more homogeneous while others claim the reverse is true.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/tests/fixtures/bgg_cache/thing_id=19503-stats=1_c271523fe1.xml b/tests/fixtures/bgg_cache/thing_id=19503-stats=1_c271523fe1.xml
new file mode 100644
index 0000000..0786153
--- /dev/null
+++ b/tests/fixtures/bgg_cache/thing_id=19503-stats=1_c271523fe1.xml
@@ -0,0 +1,195 @@
+-
+ https://cf.geekdo-images.com/GK__4vYB8dzvrKfU-rNprA__small/img/ldl758g6r68r4JYLqruQ78Q4cUA=/fit-in/200x150/filters:strip_icc()/pic118741.jpg
+ https://cf.geekdo-images.com/GK__4vYB8dzvrKfU-rNprA__original/img/-g18ZN4zsRVwDbfRg8STawXXd3o=/0x0/filters:format(jpeg)/pic118741.jpg
+
+
+
+
+ A dungeon-crawling card game for 2 to 4 players
+
+Captured and incarcerated, your only goal is to escape the underground prison you find yourself in. As you search for the hidden route to freedom, you must overcome the underworld's hostile inhabitants and dangerously unstable passages.
+
+Object: To escape from your underground prison, or be the last one alive.
+
+You Need: At least one standard deck of playing cards with Jokers. A single deck will suffice for a 3 player game, but such a game will be extended and bloody! Two decks can be combined for 3 or more players, allowing a quicker and easier multiplayer game.
+
+You and your opponent(s) take turns playing cards from your hand, trying to escape the dungeon while making it hard for the other players to escape. There are three basic card types in Dungeon:
+
+1. Passages (the value cards, 2 through 10) represent the tunnels, passages, and rooms you must navigate to escape.
+ 2. Creatures (the picture cards, Jack, Queen & King) represent creatures of the underworld.
+ 3. Aces represent your finely honed adventuring skills.
+
+If you escape the Dungeon or all of your opponents are dead, then you win!
+
+Download the rules here:
+http://www.invisible-city.com/play/392/dungeon-update
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/tests/fixtures/bgg_cache/thing_id=214-stats=1_dbe4b866d0.xml b/tests/fixtures/bgg_cache/thing_id=214-stats=1_dbe4b866d0.xml
new file mode 100644
index 0000000..21c93bf
--- /dev/null
+++ b/tests/fixtures/bgg_cache/thing_id=214-stats=1_dbe4b866d0.xml
@@ -0,0 +1,305 @@
+-
+ https://cf.geekdo-images.com/VieUvCI62VUhQ9C4agum3A__small/img/dZ4v6yOOU5E-oPFK0UbqBGoXyzU=/fit-in/200x150/filters:strip_icc()/pic3987975.png
+ https://cf.geekdo-images.com/VieUvCI62VUhQ9C4agum3A__original/img/qzA2t0vjkwoGm5yaTBog1ZmewS0=/0x0/filters:format(png)/pic3987975.png
+
+
+
+
+
+
+
+
+
+
+ This game revolves around the placement of multi-national customers in a restaurant. The board shows many different tables, each with four chairs around them. The tables are grouped by nation, so the Chinese like to sit with other Chinese. However, some of the chairs are on the border between two nations, so a person from either place could occupy the seat. To further complicate this odd tile game, each of the people is either male or female, and tables must be gender-balanced. As the game progresses some tiles become unplayable...
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/tests/fixtures/bgg_cache/thing_id=2524-stats=1_c50671afdb.xml b/tests/fixtures/bgg_cache/thing_id=2524-stats=1_c50671afdb.xml
new file mode 100644
index 0000000..e2e02e6
--- /dev/null
+++ b/tests/fixtures/bgg_cache/thing_id=2524-stats=1_c50671afdb.xml
@@ -0,0 +1,250 @@
+-
+ https://cf.geekdo-images.com/8PIdXg87V8l-VuCZAplQlQ__small/img/OTL4rEL5eQ-8jJ_JubPwIq9LBIQ=/fit-in/200x150/filters:strip_icc()/pic567384.jpg
+ https://cf.geekdo-images.com/8PIdXg87V8l-VuCZAplQlQ__original/img/JRuDUwwK8S1jG9gZISv_Hwz5Kog=/0x0/filters:format(jpeg)/pic567384.jpg
+
+
+
+
+
+
+ Adapted from the box:
+
+The game is a simulation of events within a conjectural future history in which telekinesis is used to move ships through space. It is played on a map which displays 74 star systems in a three-dimensional "sphere" of space measuring roughly 40 light years in diameter, with Earth's home system at the center. A grid of hexagons printed over the map is used to regulate movement and position of pieces. Pieces' exact locations are not known until they "meet" in the same three-dimensional "hex space".
+
+The pieces in the game represent groups of four interstellar spaceships (StarForces) and space stations (StarGates). Each Player maneuvers his pieces (via Stellar Shifting) to engage those of the enemy. Movement is plotted and executed simultaneously. The game proceeds this way (for a specified number of turns) as the players try to achieve the objectives set forth in the rules. No prior knowledge is required to play the game - just a little ingenuity and common sense.
+
+Battles take place when units are in the same three-dimensional location. In the Basic Game, the attacking Player compares the total variable strengths of the involved units and consults a simple probability table to determine the outcome of each battle. In the Advanced Game, a small tactical maneuver map is used. When enemy forces engage on the main map, they are transferred to the tactical display. Here they move (in three dimensions), attack and defend using a fixed number of action points per tactical turn.
+
+Combat outcomes result in pieces not being destroyed but being "randomised"; usually to a location far from all the action.
+
+
+Part of the StarForce Trilogy box set, along with Outreach and StarSoldier. There are also special rules to use Starsoldier as a tactical game for StarForce.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/tests/fixtures/bgg_cache/thing_id=2529-stats=1_143a082fa5.xml b/tests/fixtures/bgg_cache/thing_id=2529-stats=1_143a082fa5.xml
new file mode 100644
index 0000000..b9c87c3
--- /dev/null
+++ b/tests/fixtures/bgg_cache/thing_id=2529-stats=1_143a082fa5.xml
@@ -0,0 +1,377 @@
+-
+ https://cf.geekdo-images.com/U4aLOWpOLNtUjQ5BirlGLA__small/img/thPXwIIE3knD9igpLusCdeHVsMI=/fit-in/200x150/filters:strip_icc()/pic806423.jpg
+ https://cf.geekdo-images.com/U4aLOWpOLNtUjQ5BirlGLA__original/img/5m1hrtRgt6lst9tajA4o169D4wA=/0x0/filters:format(jpeg)/pic806423.jpg
+
+
+
+
+ Flat Top is a board wargame of high complexity that covers the battles of the Solomon Seas between the United States and Japan in 1942. It is very well researched and covers all aspects of naval and air combat as it existed in 1942. The system depicts weather, air searches, air combat, surface combat, carrier operations, submarines, air bases, supplies, and much more. The game requires intense planning and searching since movement is covert and the map is huge.
+
+The units are individual ships and submarines with each air point representing three aircraft. Hexes are twenty miles, and each turn represents one hour.
+
+The game includes thirteen hundred counters, 4 maps to create a 44" x 28" map of the South Pacific, four Allied/Japanese operations cards, three player aid cards and two log sheets.
+
+
+ First edition Battle Line has two counter card sheets containing 800 counters.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/tests/fixtures/bgg_cache/thing_id=266192-stats=1_bdcf5df353.xml b/tests/fixtures/bgg_cache/thing_id=266192-stats=1_bdcf5df353.xml
new file mode 100644
index 0000000..1cee15f
--- /dev/null
+++ b/tests/fixtures/bgg_cache/thing_id=266192-stats=1_bdcf5df353.xml
@@ -0,0 +1,1362 @@
+-
+ https://cf.geekdo-images.com/yLZJCVLlIx4c7eJEWUNJ7w__small/img/VNToqgS2-pOGU6MuvIkMPKn_y-s=/fit-in/200x150/filters:strip_icc()/pic4458123.jpg
+ https://cf.geekdo-images.com/yLZJCVLlIx4c7eJEWUNJ7w__original/img/cI782Zis9cT66j2MjSHKJGnFPNw=/0x0/filters:format(jpeg)/pic4458123.jpg
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Wingspan is a competitive, medium-weight, card-driven, engine-building board game from Stonemaier Games. It's designed by Elizabeth Hargrave and features 180 birds illustrated by Natalia Rojas and Ana Maria Martinez.
+
+You are bird enthusiasts—researchers, bird watchers, ornithologists, and collectors—seeking to discover and attract the best birds to your network of wildlife preserves. Each bird extends a chain of powerful combinations in one of your habitats (actions). These habitats focus on several key aspects of growth:
+
+
+ Gain food tokens via custom dice in a birdfeeder dice tower
+ Lay eggs using egg miniatures in a variety of colors
+ Draw from hundreds of unique bird cards and play them
+
+
+The winner is the player with the most points after 4 rounds.
+
+—description from the publisher
+
+From the 7th printing on, the base game box includes Wingspan: Swift-Start Promo Pack.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/tests/fixtures/bgg_cache/thing_id=290448-stats=1_0650ce5c82.xml b/tests/fixtures/bgg_cache/thing_id=290448-stats=1_0650ce5c82.xml
new file mode 100644
index 0000000..69cb1ef
--- /dev/null
+++ b/tests/fixtures/bgg_cache/thing_id=290448-stats=1_0650ce5c82.xml
@@ -0,0 +1,721 @@
+-
+ https://cf.geekdo-images.com/7izK8WM_bgtvBzxQvLGz-A__small/img/Q76pV0p00R8qkcS6o-nczJD7DCk=/fit-in/200x150/filters:strip_icc()/pic4982682.jpg
+ https://cf.geekdo-images.com/7izK8WM_bgtvBzxQvLGz-A__original/img/NFkKrFCKJ1YUC1x7bpx-WVDhLq0=/0x0/filters:format(jpeg)/pic4982682.jpg
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ In this first expansion to Wingspan, we increase the scope of the world to include the regal, beautiful, and varied birds of Europe. These birds feature a variety of new abilities, including a number of birds with round end abilities, abilities that increase interaction between players, and birds that benefit from excess cards/food. Along with the new bonus cards, they’re designed to be shuffled into the original decks of cards (and cards from future expansions).
+
+The European Expansion also includes an additional tray for storing the growing collection of birds (past, present, and future), as well as 15 purple eggs, extra food tokens, and a colorful new scorepad designed for both multi-player and single-player scoring. It's designed by Elizabeth Hargrave and features birds illustrated by Natalia Rojas and Ana Maria Martinez.
+
+—description from the publisher
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/tests/fixtures/bgg_cache/thing_id=311654-stats=1_c0924f0831.xml b/tests/fixtures/bgg_cache/thing_id=311654-stats=1_c0924f0831.xml
new file mode 100644
index 0000000..7fad8ff
--- /dev/null
+++ b/tests/fixtures/bgg_cache/thing_id=311654-stats=1_c0924f0831.xml
@@ -0,0 +1,242 @@
+-
+ https://cf.geekdo-images.com/211476emISgQLsa2h3BAYw__small/img/g9QMstNAY2uOVSR1rH5Hx7Gxquk=/fit-in/200x150/filters:strip_icc()/pic5625807.png
+ https://cf.geekdo-images.com/211476emISgQLsa2h3BAYw__original/img/nGOu9LrFF5udRimbJrei6HExde8=/0x0/filters:format(png)/pic5625807.png
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ From the kickstarter:
+
+Alice is Missing, a silent role-playing game about the disappearance of Alice Briarwood, a high school junior in the small town of Silent Falls.
+...
+The game is played live and without verbal communication. Players inhabit their character for the entirety of the 90-minute play session, and instead of speaking, send text messages back and forth to the other characters in a group chat, as well as individually, as though they aren’t in the same place together.
+
+Publisher's blurb:
+
+The game is played live and without verbal communication. Players inhabit their character for the entirety of the 90-minute play session, and instead of speaking, send text messages back and forth to the other characters in a group chat, as well as individually, as though they aren’t in the same place together.
+
+Haunting beautiful, deeply personal, and highly innovative Alice is Missing puts a strong focus on the emotional engagement between players, immersing them in a tense, dramatic mystery that unfolds organically through the text messages they send to one another. Right at home with games like Life Is Strange, Gone Home, Oxenfree, and Firewatch, it’s designed to feel as much like an event-style experience as it does a role-playing game.
+
+A microbadge is available
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/tests/fixtures/bgg_cache/thing_id=3585-stats=1_dce99b361b.xml b/tests/fixtures/bgg_cache/thing_id=3585-stats=1_dce99b361b.xml
new file mode 100644
index 0000000..286251b
--- /dev/null
+++ b/tests/fixtures/bgg_cache/thing_id=3585-stats=1_dce99b361b.xml
@@ -0,0 +1,270 @@
+-
+ https://cf.geekdo-images.com/NpauF7CJudER5H5nj-z-gA__small/img/Vo85InhIcQUg1myZBiHCL22uu8A=/fit-in/200x150/filters:strip_icc()/pic10078.jpg
+ https://cf.geekdo-images.com/NpauF7CJudER5H5nj-z-gA__original/img/eGfEPINMJA_0pAKWAYyjJaXmaQo=/0x0/filters:format(jpeg)/pic10078.jpg
+
+
+
+
+
+
+
+
+ Sorcerer is a fantasy wargame. Each player has an army consisting of Sorcerers, human infantry, and magical units (trolls, demons, and dragons). Sorcerers specialize in types of magic represented by 7 different colors. Sorcerer adds a twist to the old "combat differential" system (attack strength minus defense strength) by adding a circular system of combat bonuses based upon what colors of magic are attacking each other; Blue/Green/Yellow/Grey/Orange/Red/Purple with each color having a strong advantage over it's neighbor to the right (with Purple circling around to have power over Blue) and a disadvantage against it's neighbor to the left, with lessening combat bonuses the further away the color is from itself. Combat bonuses are also given based on map position as the hexes alternate colors of magic instead of representing physical terrain. Attacking from one's own color is good.
+
+Several different scenarios are included in the rulebook that range from 1 to 6 players.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/tests/fixtures/bgg_cache/thing_id=589-2C324937-2C104710-stats=1_0d309805ee.xml b/tests/fixtures/bgg_cache/thing_id=589-2C324937-2C104710-stats=1_0d309805ee.xml
new file mode 100644
index 0000000..3d766b4
--- /dev/null
+++ b/tests/fixtures/bgg_cache/thing_id=589-2C324937-2C104710-stats=1_0d309805ee.xml
@@ -0,0 +1,1008 @@
+-
+ https://cf.geekdo-images.com/TjTRyJv5BQRo9GTy3OA6Jw__small/img/Tlfd2Jdg2WTuJN_lQiqLp6mL0zM=/fit-in/200x150/filters:strip_icc()/pic184442.jpg
+ https://cf.geekdo-images.com/TjTRyJv5BQRo9GTy3OA6Jw__original/img/-E47TiT6MiucjjUwRstlOwDo6yU=/0x0/filters:format(jpeg)/pic184442.jpg
+
+
+
+
+
+
+ In the light, beer & pretzels type of game Wiz-War, players are transformed into wizards attempting to collect treasures from a twisted little maze. At the heart of the game is a deck of cards that the players use to cast spells, power-up spells, and augment movement. Each turn, players can move up to three spaces (or more with the use of number cards). However, the goal is to penetrate the other players' sections of the maze, pick up one of their treasures, and bring it back to your home base. The first player to capture two such treasures or kill all the other wizards wins.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+-
+ https://cf.geekdo-images.com/bMcEMM5qurvnJxcosswjWg__small/img/Tjj681UWYL-zhdmd6KaUSvguHQY=/fit-in/200x150/filters:strip_icc()/pic5799068.jpg
+ https://cf.geekdo-images.com/bMcEMM5qurvnJxcosswjWg__original/img/Qpbm-L1d7fSMkfZaTX-5bLdchcg=/0x0/filters:format(jpeg)/pic5799068.jpg
+
+
+
+
+ In Wiz-War, players are transformed into wizards who attempt to collect treasures from a twisted maze.
+
+At the heart of the game is a deck of cards that the players use to cast spells, power up spells, and augment movement. Each turn, players can move up to three spaces (or more with the use of number cards). However, the goal is to penetrate the other players' sections of the maze, pick up one of their treasures, and bring it back to your home base. The first player to capture two such treasures or kill all the other wizards wins.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+-
+ https://cf.geekdo-images.com/yXbWhfIuwKFJfPNg5SgPOQ__small/img/PFBGm2T4kgP7_ARhb7Zcr5j_uZU=/fit-in/200x150/filters:strip_icc()/pic1222733.jpg
+ https://cf.geekdo-images.com/yXbWhfIuwKFJfPNg5SgPOQ__original/img/C-3SceTz2k75LaIYt3sQWl7g7lU=/0x0/filters:format(jpeg)/pic1222733.jpg
+
+
+
+
+
+
+
+
+
+
+ In Wiz-War, wizards wage no-spells-barred magical duels deep in an underground labyrinth. This classic board game of magical mayhem for 2-4 players, created by Tom Jolly in 1983, pits players' wizards against each other in a stupendous struggle for magical mastery. Win by stealing other wizards' treasures and hauling them back to your base, or just score points by blasting the other wizards. The last wizard standing always wins.
+
+Staying true to the spirit of the game that has entertained players for years, as well inspiring an entire genre of games, this 2011 edition of Wiz-War caters to the imagination and the funny bone. Casting an enriched array of spells, your wizards race through an underground maze, avoiding fireballs, werewolves, and psychic storms. Subtle game enhancements by Kevin Wilson and Tom Jolly promote faster play and clarify card effects.
+
+—description from the publisher
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/tests/fixtures/bgg_cache/thing_id=71-stats=1_96b1db5f76.xml b/tests/fixtures/bgg_cache/thing_id=71-stats=1_96b1db5f76.xml
new file mode 100644
index 0000000..52dde0d
--- /dev/null
+++ b/tests/fixtures/bgg_cache/thing_id=71-stats=1_96b1db5f76.xml
@@ -0,0 +1,581 @@
+-
+ https://cf.geekdo-images.com/tUdVpt5daNITDrLXqN931Q__small/img/AI7xWgZxUCdXZHPH5WXCXWSAKUI=/fit-in/200x150/filters:strip_icc()/pic114473.jpg
+ https://cf.geekdo-images.com/tUdVpt5daNITDrLXqN931Q__original/img/121amP5yjflTHIFW017EGPe5Rjk=/0x0/filters:format(jpeg)/pic114473.jpg
+
+
+
+
+
+
+
+
+
+
+
+
+ Civilization is a game of skill for 2 to 7 players. It covers the development of ancient civilizations from the invention of agriculture c. 8000 B.C. to the emergence of Rome around the middle of the third century B.C. Each player leads a nation of peoples over a map board of the Eastern Mediterranean and Near East as they attempt to carve a niche for themselves and their culture.
+
+Although battles and territorial strategy are important, this is not a war game because it is not won by battle or conquest. Instead, the object of play is to gain a level of overall advancement involving cultural, economic, and political factors so that such conflicts that do arise are a result of rivalry and land shortage rather than a desire to eliminate other players. Nomad and farmer, warrior and merchant, artisan and citizen all have an essential part to play in the development of civilization. It is the player who most effectively changes emphasis between these various outlooks who will achieve the best balance and win.
+
+(from the Introduction to the Avalon Hill edition rulebook)
+
+This game has a huge following and is widely regarded as one of the best games about ancient civilizations. Each player takes on the role of leader of an ancient civilization, such as the Illyrians or Babylonians. Your task is to guide your people through the ages by expanding your empire and using its proceeds to finance new technological advances, such as Literacy, Metalworking, or Law. The advancements help your civilization better cope with its problems as well as help bring new advancements.
+
+Civilization is widely thought to be the first game ever to incorporate a "technology tree," allowing players to gain certain items and abilities only after particular other items were obtained. This influential mechanism has been adopted by countless other board games, card games, and computer games.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/tests/test_resolve.py b/tests/test_resolve.py
index 6ad27ec..b3b541e 100644
--- a/tests/test_resolve.py
+++ b/tests/test_resolve.py
@@ -110,11 +110,11 @@ def test_run_resolve_writes_csv_and_is_idempotent(client, tmp_path):
cfg = Config(data_dir=data_dir)
first = run_resolve(cfg, client=client)
- assert len(first) == 13
+ assert len(first) == 15
with cfg.matches_path.open(newline="") as f:
rows = list(csv.DictReader(f))
- assert len(rows) == 13
+ assert len(rows) == 15
by_title = {r["title_raw"]: r for r in rows}
assert by_title["Catan"]["match_status"] == "auto"
assert by_title["Citadels"]["match_status"] == "ambiguous"
@@ -295,6 +295,29 @@ def test_starforce_two_word_head_matches_full_title(client):
assert row.version_status == "version_ambiguous"
+def test_sibling_editions_surface_as_ambiguous(client):
+ """BGG files new editions as SEPARATE games ("Wiz-War (Eighth
+ Edition)"): a lone exact match must not hide its siblings behind a
+ confident auto — the user can't know what they never see."""
+ entry = _entry("WIZ-WAR", confidence="high")
+ row = resolve_entry(client, entry)
+ assert row.match_status == "ambiguous"
+ names = {c.name for c in row.candidates}
+ assert "Wiz-War" in names
+ assert any("Eighth Edition" in n for n in names)
+ assert any("9th Edition" in n for n in names)
+
+
+def test_lone_obscure_candidate_never_autos(client):
+ """BGG's search visibly truncates generic queries — the game named
+ "Dungeon!" appears in NEITHER of its own searches — so the sole
+ surviving candidate may be an impostor. Ambiguous, never auto."""
+ entry = _entry("Dungeon!", confidence="high")
+ row = resolve_entry(client, entry)
+ assert row.match_status == "ambiguous"
+ assert row.bgg_id is None
+
+
def test_wrong_year_hint_never_drives_a_version(client):
"""Flat Top's box says 1942 (the theme, not the print year): version
scoring must not pick any version off the back of it."""
@@ -474,11 +497,20 @@ def test_run_resolve_dedupes_and_keeps_all_rows(tmp_path):
''
""
)
- for query in ("Wingspan", "WINGSPAN!"):
+ # "WINGSPAN" is the depunct retry of "WINGSPAN!"; the stats file is
+ # the lone-candidate trust check (owned must clear the floor)
+ for query in ("Wingspan", "WINGSPAN!", "WINGSPAN"):
key = cache_key(
"search", {"query": query, "type": "boardgame,boardgameexpansion"}
)
(cache / key).write_text(wingspan_xml)
+ (cache / cache_key("thing", {"id": "266192", "stats": "1"})).write_text(
+ '- '
+ ''
+ ''
+ ''
+ "
"
+ )
data_dir = tmp_path / "data"
data_dir.mkdir()
@@ -517,7 +549,7 @@ def test_run_resolve_force_rebuilds_from_scratch(client, tmp_path):
write_matches(cfg.matches_path, rows)
forced = run_resolve(cfg, force=True, client=client)
- assert len(forced) == 13 # every title re-resolved, none skipped
+ assert len(forced) == 15 # every title re-resolved, none skipped
fresh = {r["title_raw"]: r for r in read_matches(cfg.matches_path)}
assert fresh["Catan"]["match_status"] == "auto"