knitr::opts_chunk$set(echo = TRUE)

This is my approach to solving/cheating at the Russian Wordle, mildly editing my English one over there.

Package(s)

First, get the {tidyverse} loaded:

library(tidyverse)
Registered S3 methods overwritten by 'dbplyr':
  method         from
  print.tbl_lazy     
  print.tbl_sql      
-- Attaching packages ------------------- tidyverse 1.3.1 --
v ggplot2 3.3.5     v purrr   0.3.4
v tibble  3.1.6     v dplyr   1.0.7
v tidyr   1.2.0     v stringr 1.4.0
v readr   2.1.2     v forcats 0.5.1
-- Conflicts ---------------------- tidyverse_conflicts() --
x dplyr::filter() masks stats::filter()
x dplyr::lag()    masks stats::lag()

Check that the basics are working:

str_detect("когда", "..гд.")
[1] TRUE
tolower("КОГДА")
[1] "когда"

Words

I’m using the Russian version of the word list previously discussed over here, directly from the GitHub repo:

words <-
  read.csv(
    "https://raw.githubusercontent.com/hermitdave/FrequencyWords/master/content/2016/ru/ru_full.txt",
    sep = " ",
    encoding="UTF-8",
    header = FALSE
  ) %>%
  as_tibble()
names(words) <- c("word", "freq")
head(words)

The words don’t display properly; however, printing the vector works okay:

head(words) %>%
  pull(word)
[1] "я"   "не"  "что" "в"   "и"   "ты" 

Make the wordles as before:

wordles <- words %>%
  filter(str_length(word) == 5) %>%
  mutate(word = str_to_lower(word)) %>%
  arrange(desc(freq))
wordles %>%
  slice_head(n = 500) %>%
  slice_sample(n = 5) %>%
  pull(word)
[1] "убьет" "штука" "моими" "мадам" "твоём"

Helpers

Tidyverse and base R already have all the functions I need to filter this word list as we learn more about what letters are and are not in a wordle. I just want some helper functions to make them easier to use.

All words that have particular letters somewhere

all_lets_somewhere <- Vectorize(function(str, lets) {
  all(str_detect(str, strsplit(lets, "")[[1]]))
}, vectorize.args = "str")

Here’s how it works – test whether “о” is in each word:

all_lets_somewhere(c("очень", "когда"), "о")
очень когда 
 TRUE  TRUE 

Test whether “о” and “ч” are in each word:

all_lets_somewhere(c("очень", "когда"), "оч")
очень когда 
 TRUE FALSE 

All words that don’t have particular letters anywhere

no_lets_anywhere <- Vectorize(function(str, lets) {
  !any(str_detect(str, strsplit(lets, "")[[1]]))
}, vectorize.args = "str")

Here’s how it works – test whether neither “д” nor “а” are in each word:

no_lets_anywhere(c("очень", "когда"), "да")
очень когда 
 TRUE FALSE 

Filter/keep words with letters in particular positions

Wordle’s feedback can tell us that a letter is there somewhere but not in the position we guessed. str_detect already does what we need easily enough: a “.” in a regex matches any letter, so we can negate that. This is a wrapper for ease of piping:

ditch_pattern <- function(data, match) {
  data %>%
    filter(!str_detect(word, match))
}

Here’s how to use it. First, here’s the top of the wordles data:

wordles %>%
  head() %>%
  pull(word)
[1] "чтобы" "когда" "здесь" "может" "будет" "очень"

Let’s remove the word with “гд” in their third and fourth characters:

wordles %>% 
  head() %>%
  ditch_pattern("..гд.") %>%
  pull(word)
[1] "чтобы" "здесь" "может" "будет" "очень"

keep_pattern works similarly:

keep_pattern <- function(data, match) {
  data %>%
    filter(str_detect(word, match))
}

Here’s an example:

wordles %>% 
  head() %>%
  keep_pattern("..гд.") %>%
  pull(word)
[1] "когда"

Final filter helpers

These functions just make it easier to use functions above in a pipe:

ditch_letters <- function(data, match) {
  data %>%
    filter(no_lets_anywhere(word, match))
}

keep_letters <- function(data, match) {
  data %>%
    filter(all_lets_somewhere(word, match))
}

Letter frequencies

long_wordles <- function(wordles) {
  wordle_chars <- sapply(str_split(wordles$word, ""),
                         c) %>% 
  t()
  
  colnames(wordle_chars) <- paste("c", 1:5, sep = "_")
  
  bind_cols(wordles, wordle_chars %>% as_tibble()) %>%
  pivot_longer(cols = c_1:c_5,
               names_prefix = "c_",
               names_to = "pos",
               values_to = "let")
}
letter_freqs <- function(wordles) {
  n_words <- nrow(wordles)
  
  wordles %>%
    long_wordles() %>%
    group_by(word, freq, let) %>%
    summarise(n = n()) %>%
    mutate(b = as.numeric(n > 0)) %>%
    ungroup() %>%
    group_by(let) %>%
    summarise(n = n()) %>%
    ungroup() %>%
    mutate(perc = 100*n/n_words) %>%
    arrange(desc(n))    
}

Get letter frequencies for 1000 most frequent words:

wordles %>%
  head(1000) %>%
  letter_freqs() %>%
  pull(let)
`summarise()` has grouped output by 'word', 'freq'. You can override using the `.groups` argument.
 [1] "о" "а" "е" "и" "т" "л" "н" "р" "м" "с" "у" "д" "в" "к"
[15] "п" "б" "й" "ы" "ь" "з" "ж" "ш" "г" "ч" "я" "х" "ю" "ц"
[29] "ф" "э" "ё" "щ" "e" "h" "r" "t"

The most frequent letters are “о”, “а”, “е”, “и”, and “т”. Let’s find a word with as many as possible of those letters…

wordles %>%
  keep_letters("оае") %>%
  head() %>%
  pull(word)
[1] "такое" "самое" "какое" "обеда" "океан" "озера"

I’ll spare you all the steps - this was the final one:

wordles %>%
  keep_letters("ам") %>%
  keep_pattern("ма...") %>%
  ditch_letters("ткоепрняд") %>%
  ditch_pattern("...а.") %>%
  pull(word)
  [1] "малыш" "магии" "майлз" "масла" "магию" "малый"
  [7] "масса" "мафии" "майлс" "массу" "массы" "маслу"
 [13] "малым" "малых" "майли" "малую" "мафию" "мауса"
 [19] "мамма" "мамба" "масси" "мазью" "маффи" "майма"
 [25] "маюми" "магма" "малли" "магмы" "маззи" "малла"
 [31] "малум" "малии" "маймы" "мауча" "майми" "маюсь"
 [37] "мамбу" "мамчу" "магги" "малус" "маэль" "мамьi"
 [43] "мауси" "малию" "майму" "магму" "маиса" "мамми"
 [49] "мавис" "малул" "мамбы" "мааса" "маусу" "мамцы"
 [55] "мамoй" "малви" "мальц" "малэм" "маилс" "маилз"
 [61] "магси" "мафий" "маглы" "маггл" "майла" "маучу"
 [67] "малуа" "майлο" "малва" "майбл" "маглс" "маглз"
 [73] "маэла" "магли" "мацуи" "малюй" "мачли" "малюю"
 [79] "магий" "мамул" "магзи" "мамзи" "мамфи" "мацис"
 [85] "мальм" "маама" "малву" "магус" "маэза" "маммс"
 [91] "массé" "мацца" "маэлю" "майлc" "малиа" "маасу"
 [97] "мамии" "масли" "магла" "маухи" "майлу" "малха"
[103] "машиу" "маэлз" "масуи" "маббс" "мамьы" "мацуu"
[109] "малчш" "майлы" "маазы" "малйз" "мамси" "мамша"
[115] "мацзу" "маучи" "мафиг" "махis" "маблс" "маллы"
[121] "малль" "маццу" "магжи" "маcлa" "массю" "масуа"
[127] "мальы" "маcлo" "магис" "машуа" "мамбл" "массл"
[133] "маисы" "маига" "майус" "маллз" "майзл" "малуф"
[139] "маиша" "маммы" "малми" "мальй" "магсl" "машиы"
[145] "маgiс" "малич" "маггз" "мамуз" "маиии" "мазуи"
[151] "майзи" "малиш" "мазль" "маллу" "малыф" "маусы"
[157] "малфи" "мальш" "маусс" "малёх" "малуш" "магич"
[163] "мафуз"

Here’s the route I took:

LS0tDQp0aXRsZTogIldvcmRsZSBpbiBSdXNzaWFuIg0KYXV0aG9yOiAiQW5kaSBGdWdhcmQiDQpkYXRlOiAiMDQvMDIvMjAyMiINCm91dHB1dDogDQogIGh0bWxfbm90ZWJvb2s6IA0KICAgIGNvZGVfZm9sZGluZzogbm9uZQ0KLS0tDQoNCmBgYHtyIHNldHVwLCBpbmNsdWRlPVRSVUV9DQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUpDQpgYGANCg0KDQpUaGlzIGlzIG15IGFwcHJvYWNoIHRvIHNvbHZpbmcvY2hlYXRpbmcgYXQgdGhlIFtSdXNzaWFuIFdvcmRsZV0oaHR0cHM6Ly93b3JkbGUuYmVsb3Vzb3Yub25lLyksIG1pbGRseSBlZGl0aW5nIG15IEVuZ2xpc2ggb25lIG92ZXIgW3RoZXJlXShodHRwczovL2luZHVjdGl2ZXN0ZXAuZ2l0aHViLmlvL3dvcmRsZS8pLg0KDQoNCiMjIyBQYWNrYWdlKHMpDQoNCkZpcnN0LCBnZXQgdGhlIHt0aWR5dmVyc2V9IGxvYWRlZDoNCg0KYGBge3J9DQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmBgYA0KDQpDaGVjayB0aGF0IHRoZSBiYXNpY3MgYXJlIHdvcmtpbmc6DQoNCmBgYHtyfQ0Kc3RyX2RldGVjdCgi0LrQvtCz0LTQsCIsICIuLtCz0LQuIikNCmBgYA0KYGBge3J9DQp0b2xvd2VyKCLQmtCe0JPQlNCQIikNCmBgYA0KDQojIyMgV29yZHMNCg0KSSdtIHVzaW5nIHRoZSBSdXNzaWFuIHZlcnNpb24gb2YgdGhlIHdvcmQgbGlzdCBwcmV2aW91c2x5IGRpc2N1c3NlZCBvdmVyIFtoZXJlXShodHRwczovL2luZHVjdGl2ZXN0ZXAuZ2l0aHViLmlvL3dvcmRsZS8pLCBkaXJlY3RseSBmcm9tIHRoZSBHaXRIdWIgcmVwbzoNCg0KYGBge3J9DQp3b3JkcyA8LQ0KICByZWFkLmNzdigNCiAgICAiaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL2hlcm1pdGRhdmUvRnJlcXVlbmN5V29yZHMvbWFzdGVyL2NvbnRlbnQvMjAxNi9ydS9ydV9mdWxsLnR4dCIsDQogICAgc2VwID0gIiAiLA0KICAgIGVuY29kaW5nPSJVVEYtOCIsDQogICAgaGVhZGVyID0gRkFMU0UNCiAgKSAlPiUNCiAgYXNfdGliYmxlKCkNCm5hbWVzKHdvcmRzKSA8LSBjKCJ3b3JkIiwgImZyZXEiKQ0KYGBgDQoNCg0KYGBge3J9DQpoZWFkKHdvcmRzKQ0KYGBgDQoNClRoZSB3b3JkcyBkb24ndCBkaXNwbGF5IHByb3Blcmx5OyBob3dldmVyLCBwcmludGluZyB0aGUgdmVjdG9yIHdvcmtzIG9rYXk6DQoNCmBgYHtyfQ0KaGVhZCh3b3JkcykgJT4lDQogIHB1bGwod29yZCkNCmBgYA0KDQpNYWtlIHRoZSB3b3JkbGVzIGFzIGJlZm9yZToNCg0KYGBge3J9DQp3b3JkbGVzIDwtIHdvcmRzICU+JQ0KICBmaWx0ZXIoc3RyX2xlbmd0aCh3b3JkKSA9PSA1KSAlPiUNCiAgbXV0YXRlKHdvcmQgPSBzdHJfdG9fbG93ZXIod29yZCkpICU+JQ0KICBhcnJhbmdlKGRlc2MoZnJlcSkpDQpgYGANCg0KYGBge3J9DQp3b3JkbGVzICU+JQ0KICBzbGljZV9oZWFkKG4gPSA1MDApICU+JQ0KICBzbGljZV9zYW1wbGUobiA9IDUpICU+JQ0KICBwdWxsKHdvcmQpDQpgYGANCg0KDQojIyMgSGVscGVycw0KDQpUaWR5dmVyc2UgYW5kIGJhc2UgUiBhbHJlYWR5IGhhdmUgYWxsIHRoZSBmdW5jdGlvbnMgSSBuZWVkIHRvIGZpbHRlciB0aGlzIHdvcmQgbGlzdCBhcyB3ZSBsZWFybiBtb3JlIGFib3V0IHdoYXQgbGV0dGVycyBhcmUgYW5kIGFyZSBub3QgaW4gYSB3b3JkbGUuIEkganVzdCB3YW50IHNvbWUgaGVscGVyIGZ1bmN0aW9ucyB0byBtYWtlIHRoZW0gZWFzaWVyIHRvIHVzZS4NCg0KDQoNCiMjIyMgQWxsIHdvcmRzIHRoYXQgaGF2ZSBwYXJ0aWN1bGFyIGxldHRlcnMgc29tZXdoZXJlDQoNCmBgYHtyfQ0KYWxsX2xldHNfc29tZXdoZXJlIDwtIFZlY3Rvcml6ZShmdW5jdGlvbihzdHIsIGxldHMpIHsNCiAgYWxsKHN0cl9kZXRlY3Qoc3RyLCBzdHJzcGxpdChsZXRzLCAiIilbWzFdXSkpDQp9LCB2ZWN0b3JpemUuYXJncyA9ICJzdHIiKQ0KYGBgDQoNCkhlcmUncyBob3cgaXQgd29ya3MgLS0gdGVzdCB3aGV0aGVyICLQviIgaXMgaW4gZWFjaCB3b3JkOg0KDQpgYGB7cn0NCmFsbF9sZXRzX3NvbWV3aGVyZShjKCLQvtGH0LXQvdGMIiwgItC60L7Qs9C00LAiKSwgItC+IikNCmBgYA0KDQpUZXN0IHdoZXRoZXIgItC+IiBhbmQgItGHIiBhcmUgaW4gZWFjaCB3b3JkOg0KDQpgYGB7cn0NCmFsbF9sZXRzX3NvbWV3aGVyZShjKCLQvtGH0LXQvdGMIiwgItC60L7Qs9C00LAiKSwgItC+0YciKQ0KYGBgDQoNCg0KIyMjIyBBbGwgd29yZHMgdGhhdCBkb24ndCBoYXZlIHBhcnRpY3VsYXIgbGV0dGVycyBhbnl3aGVyZQ0KDQpgYGB7cn0NCm5vX2xldHNfYW55d2hlcmUgPC0gVmVjdG9yaXplKGZ1bmN0aW9uKHN0ciwgbGV0cykgew0KICAhYW55KHN0cl9kZXRlY3Qoc3RyLCBzdHJzcGxpdChsZXRzLCAiIilbWzFdXSkpDQp9LCB2ZWN0b3JpemUuYXJncyA9ICJzdHIiKQ0KYGBgDQoNCkhlcmUncyBob3cgaXQgd29ya3MgLS0gdGVzdCB3aGV0aGVyIG5laXRoZXIgItC0IiBub3IgItCwIiBhcmUgaW4gZWFjaCB3b3JkOg0KDQpgYGB7cn0NCm5vX2xldHNfYW55d2hlcmUoYygi0L7Rh9C10L3RjCIsICLQutC+0LPQtNCwIiksICLQtNCwIikNCmBgYA0KDQoNCg0KDQojIyMjIEZpbHRlci9rZWVwIHdvcmRzIHdpdGggbGV0dGVycyBpbiBwYXJ0aWN1bGFyIHBvc2l0aW9ucw0KDQpXb3JkbGUncyBmZWVkYmFjayBjYW4gdGVsbCB1cyB0aGF0IGEgbGV0dGVyIGlzIHRoZXJlIHNvbWV3aGVyZSBidXQgbm90IGluIHRoZSBwb3NpdGlvbiB3ZSBndWVzc2VkLiBgc3RyX2RldGVjdGAgYWxyZWFkeSBkb2VzIHdoYXQgd2UgbmVlZCBlYXNpbHkgZW5vdWdoOiBhICIuIiBpbiBhIFtyZWdleF0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvUmVndWxhcl9leHByZXNzaW9uKSBtYXRjaGVzIGFueSBsZXR0ZXIsIHNvIHdlIGNhbiBuZWdhdGUgdGhhdC4gVGhpcyBpcyBhIHdyYXBwZXIgZm9yIGVhc2Ugb2YgcGlwaW5nOg0KDQpgYGB7cn0NCmRpdGNoX3BhdHRlcm4gPC0gZnVuY3Rpb24oZGF0YSwgbWF0Y2gpIHsNCiAgZGF0YSAlPiUNCiAgICBmaWx0ZXIoIXN0cl9kZXRlY3Qod29yZCwgbWF0Y2gpKQ0KfQ0KYGBgDQoNCg0KSGVyZSdzIGhvdyB0byB1c2UgaXQuIEZpcnN0LCBoZXJlJ3MgdGhlIHRvcCBvZiB0aGUgd29yZGxlcyBkYXRhOg0KDQpgYGB7cn0NCndvcmRsZXMgJT4lDQogIGhlYWQoKSAlPiUNCiAgcHVsbCh3b3JkKQ0KYGBgDQoNCg0KTGV0J3MgcmVtb3ZlIHRoZSB3b3JkIHdpdGggItCz0LQiIGluIHRoZWlyIHRoaXJkIGFuZCBmb3VydGggY2hhcmFjdGVyczoNCg0KDQpgYGB7cn0NCndvcmRsZXMgJT4lIA0KICBoZWFkKCkgJT4lDQogIGRpdGNoX3BhdHRlcm4oIi4u0LPQtC4iKSAlPiUNCiAgcHVsbCh3b3JkKQ0KYGBgDQoNCg0KYGtlZXBfcGF0dGVybmAgd29ya3Mgc2ltaWxhcmx5Og0KDQpgYGB7cn0NCmtlZXBfcGF0dGVybiA8LSBmdW5jdGlvbihkYXRhLCBtYXRjaCkgew0KICBkYXRhICU+JQ0KICAgIGZpbHRlcihzdHJfZGV0ZWN0KHdvcmQsIG1hdGNoKSkNCn0NCmBgYA0KDQpIZXJlJ3MgYW4gZXhhbXBsZToNCg0KYGBge3J9DQp3b3JkbGVzICU+JSANCiAgaGVhZCgpICU+JQ0KICBrZWVwX3BhdHRlcm4oIi4u0LPQtC4iKSAlPiUNCiAgcHVsbCh3b3JkKQ0KYGBgDQoNCg0KDQojIyMjIEZpbmFsIGZpbHRlciBoZWxwZXJzDQoNClRoZXNlIGZ1bmN0aW9ucyBqdXN0IG1ha2UgaXQgZWFzaWVyIHRvIHVzZSBmdW5jdGlvbnMgYWJvdmUgaW4gYSBwaXBlOg0KDQpgYGB7cn0NCmRpdGNoX2xldHRlcnMgPC0gZnVuY3Rpb24oZGF0YSwgbWF0Y2gpIHsNCiAgZGF0YSAlPiUNCiAgICBmaWx0ZXIobm9fbGV0c19hbnl3aGVyZSh3b3JkLCBtYXRjaCkpDQp9DQoNCmtlZXBfbGV0dGVycyA8LSBmdW5jdGlvbihkYXRhLCBtYXRjaCkgew0KICBkYXRhICU+JQ0KICAgIGZpbHRlcihhbGxfbGV0c19zb21ld2hlcmUod29yZCwgbWF0Y2gpKQ0KfQ0KYGBgDQoNCg0KDQoNCiMjIyBMZXR0ZXIgZnJlcXVlbmNpZXMNCg0KYGBge3J9DQpsb25nX3dvcmRsZXMgPC0gZnVuY3Rpb24od29yZGxlcykgew0KICB3b3JkbGVfY2hhcnMgPC0gc2FwcGx5KHN0cl9zcGxpdCh3b3JkbGVzJHdvcmQsICIiKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICBjKSAlPiUgDQogIHQoKQ0KICANCiAgY29sbmFtZXMod29yZGxlX2NoYXJzKSA8LSBwYXN0ZSgiYyIsIDE6NSwgc2VwID0gIl8iKQ0KICANCiAgYmluZF9jb2xzKHdvcmRsZXMsIHdvcmRsZV9jaGFycyAlPiUgYXNfdGliYmxlKCkpICU+JQ0KICBwaXZvdF9sb25nZXIoY29scyA9IGNfMTpjXzUsDQogICAgICAgICAgICAgICBuYW1lc19wcmVmaXggPSAiY18iLA0KICAgICAgICAgICAgICAgbmFtZXNfdG8gPSAicG9zIiwNCiAgICAgICAgICAgICAgIHZhbHVlc190byA9ICJsZXQiKQ0KfQ0KYGBgDQoNCmBgYHtyfQ0KbGV0dGVyX2ZyZXFzIDwtIGZ1bmN0aW9uKHdvcmRsZXMpIHsNCiAgbl93b3JkcyA8LSBucm93KHdvcmRsZXMpDQogIA0KICB3b3JkbGVzICU+JQ0KICAgIGxvbmdfd29yZGxlcygpICU+JQ0KICAgIGdyb3VwX2J5KHdvcmQsIGZyZXEsIGxldCkgJT4lDQogICAgc3VtbWFyaXNlKG4gPSBuKCkpICU+JQ0KICAgIG11dGF0ZShiID0gYXMubnVtZXJpYyhuID4gMCkpICU+JQ0KICAgIHVuZ3JvdXAoKSAlPiUNCiAgICBncm91cF9ieShsZXQpICU+JQ0KICAgIHN1bW1hcmlzZShuID0gbigpKSAlPiUNCiAgICB1bmdyb3VwKCkgJT4lDQogICAgbXV0YXRlKHBlcmMgPSAxMDAqbi9uX3dvcmRzKSAlPiUNCiAgICBhcnJhbmdlKGRlc2MobikpICAgIA0KfQ0KYGBgDQoNCkdldCBsZXR0ZXIgZnJlcXVlbmNpZXMgZm9yIDEwMDAgbW9zdCBmcmVxdWVudCB3b3JkczoNCg0KYGBge3J9DQp3b3JkbGVzICU+JQ0KICBoZWFkKDEwMDApICU+JQ0KICBsZXR0ZXJfZnJlcXMoKSAlPiUNCiAgcHVsbChsZXQpDQpgYGANCg0KVGhlIG1vc3QgZnJlcXVlbnQgbGV0dGVycyBhcmUgItC+IiwgItCwIiwgItC1IiwgItC4IiwgYW5kICLRgiIuIExldCdzIGZpbmQgYSB3b3JkIHdpdGggYXMgbWFueSBhcyBwb3NzaWJsZSBvZiB0aG9zZSBsZXR0ZXJzLi4uDQoNCmBgYHtyfQ0Kd29yZGxlcyAlPiUNCiAga2VlcF9sZXR0ZXJzKCLQvtCw0LUiKSAlPiUNCiAgaGVhZCgpICU+JQ0KICBwdWxsKHdvcmQpDQpgYGANCg0KSSdsbCBzcGFyZSB5b3UgYWxsIHRoZSBzdGVwcyAtIHRoaXMgd2FzIHRoZSBmaW5hbCBvbmU6DQoNCmBgYHtyfQ0Kd29yZGxlcyAlPiUNCiAga2VlcF9sZXR0ZXJzKCLQsNC8IikgJT4lDQogIGtlZXBfcGF0dGVybigi0LzQsC4uLiIpICU+JQ0KICBkaXRjaF9sZXR0ZXJzKCLRgtC60L7QtdC/0YDQvdGP0LQiKSAlPiUNCiAgZGl0Y2hfcGF0dGVybigiLi4u0LAuIikgJT4lDQogIHB1bGwod29yZCkNCmBgYA0KDQpIZXJlJ3MgdGhlIHJvdXRlIEkgdG9vazoNCg0KIVtdKHJ1c3NpYW5fd29yZGxlLnBuZyl7d2lkdGg9MjAwcHh9DQoNCg==