Every Wednesday and Friday I publish a Substack newsletter called Monte Carlo Football Picks. On Wednesday I publish projections for the Thursday Night game and Friday includes the picks for the rest of the week. If you are interested in the NFL, please subscribe, it’s FREE!
This file uses the early power ratings for Week 6 to simulate the Thursday Night Football game. The ratings are updated for injuries before publishing full picks on Fridays.
Load packages
library(tidyverse)
library(tidyquant)
library(ggimage)
library(ggrepel)
library(knitr)
library(kableExtra)
Load required data files
ratings <- read_csv("Week 06/inputs/power_ratings.csv")
schedule <- read_csv("Week 06/inputs/schedule_tnf.csv")
scores <- read_csv("Week 06/inputs/common_scores.csv", col_types = "n")
df.logos <- read.csv("Week 06/inputs/nfl_logos.csv")
Function to simulate scores. Default line is 0, number of simulations is 100,000, home field advantage is 0 and average power rating is 25. These values will be used if not supplied in the schedule_tnf.csv file.
mc_sim <- function(home, away, data = ratings, line = 0, n = 100000, hfa = 0, mean = 25){
#pull ratings together for both teams in matchup
h_off <-ratings %>%
filter(Team == home & Type == "off_rating") %>%
select(Team, Type, MC_PR, MC_STD)
h_def <-ratings %>%
filter(Team == home & Type == "def_rating") %>%
select(Team, Type, MC_PR, MC_STD)
a_off <-ratings %>%
filter(Team == away & Type == "off_rating") %>%
select(Team, Type, MC_PR, MC_STD)
a_def <-ratings %>%
filter(Team == away & Type == "def_rating") %>%
select(Team, Type, MC_PR, MC_STD)
#generate scores
set.seed(13)
h_score <- round(rnorm(n, mean = h_off$MC_PR, sd = h_off$MC_STD) +
hfa +
rnorm(n, mean = a_def$MC_PR, sd = a_def$MC_STD) - mean, digits = 0)
a_score <- round(rnorm(n, mean = a_off$MC_PR, sd = a_off$MC_STD) +
rnorm(n, mean = h_def$MC_PR, sd = h_def$MC_STD) - mean, digits = 0)
matchup <<- bind_cols(hm = h_score, aw = a_score) %>%
mutate(home_pf = VLOOKUP(hm, scores, rating, score)) %>%
mutate(away_pf = VLOOKUP(aw, scores, rating, score)) %>%
mutate(margin = home_pf - away_pf) %>%
mutate(cover = if_else(margin + line > 0, 1, 0)) %>%
mutate(win = if_else(margin > 0, 1, 0)) %>%
mutate(home_team = home, away_team = away) %>%
select(home_team, home_pf, away_team, away_pf, margin, cover, win)
win_pct <- sum(matchup$win)/n
cover_pct <- sum(matchup$cover)/n
tibble(home, away, line, win_pct, cover_pct) %>%
pivot_longer(cols = win_pct:cover_pct, names_to = "Type",
values_to = "Home_Confidence") %>%
mutate(Away_Confidence = 1 - Home_Confidence)
}
Iterate mc_sim function over schedule.csv to get results for all games in the schedule_tnf.csv file.
predictions <- pmap_dfr(schedule, mc_sim)
hwp <- predictions %>%
filter(Type == "win_pct") %>%
mutate(type = "SU", location = "home") %>%
select(type, team = home, opponent = away, line, location, confidence = Home_Confidence)
awp <- predictions %>%
filter(Type == "win_pct") %>%
mutate(type = "SU", location = "away", line = line * -1) %>%
select(type, team = away, opponent = home, line, location, confidence = Away_Confidence)
hcp <- predictions %>%
filter(Type == "cover_pct") %>%
mutate(type = "ATS", location = "home") %>%
select(type, team = home, opponent = away, line, location, confidence = Home_Confidence)
acp <- predictions %>%
filter(Type == "cover_pct") %>%
mutate(type = "ATS", location = "away", line = line * -1) %>%
select(type, team = away, opponent = home, line, location, confidence = Away_Confidence)
predictions2 <- bind_rows(hwp, awp, hcp, acp) %>%
pivot_wider(names_from = type, values_from = confidence)
write_csv(predictions2, file = "Week 06/tnf_predictions.csv")
predictions2
The variable “matchup” is a global variable created when mc_sim is run. It saves the data of the last game that was run through the function. Use this data to plot score frequencies.
ggplot(matchup, aes(x = margin)) +
geom_histogram(binwidth = 1, color = "black", fill = "white") +
geom_vline(aes(xintercept = mean(margin)), color = "blue", linetype = "dashed", size = 1) +
geom_vline(aes(xintercept = -6.5), color = "red", linetype = "dashed", size = 1) +
ggtitle("Tampa Bay at Philadelphia \n Distribution of Projected Margin of Victory") +
xlab("Eagles score minus Bucs score \n blue line = average margin \n red line = betting line") + ylab("Count") +
scale_x_continuous(breaks = c(-35, -25, -20, -14, -10, -7, -3, 0, 3, 7, 10, 14, 20, 25)) +
theme_classic() +
theme_linedraw() +
theme(
plot.title = element_text(color="red", size=14, face="bold.italic"),
axis.title.x = element_text(color="blue", size=14, face="bold"),
axis.title.y = element_text(color="#993333", size=14, face="bold"),
panel.grid.major = element_blank(),
panel.grid.minor = element_blank()
)

Top 10 Scores
score_n <- matchup %>% count(home_pf, away_pf) %>% arrange(desc(n)) %>%
rename("Home" = home_pf, "Away" = away_pf, "Count" = n)
kable(head(score_n, 10)) %>%
kable_styling(font_size = 24, bootstrap_options = c("striped", "hover", "condensed"),
full_width = FALSE)
| Home |
Away |
Count |
| 20 |
38 |
2786 |
| 24 |
38 |
2712 |
| 27 |
38 |
2633 |
| 20 |
31 |
2609 |
| 17 |
38 |
2568 |
| 24 |
31 |
2506 |
| 20 |
27 |
2479 |
| 24 |
27 |
2430 |
| 27 |
27 |
2410 |
| 14 |
38 |
2398 |
NA
Top 10 Margins of Victory (Home score minus Away score)
margin_n <- matchup %>% count(margin) %>% arrange(desc(n)) %>%
rename("Count" = n)
kable(head(margin_n, 10)) %>%
kable_styling(font_size = 24, bootstrap_options = c("striped", "hover", "condensed"),
full_width = FALSE)
| margin |
Count |
| -7 |
10637 |
| 0 |
8673 |
| -14 |
8523 |
| -10 |
6506 |
| -17 |
5724 |
| -3 |
5591 |
| -11 |
5540 |
| -4 |
4840 |
| -21 |
4585 |
| 7 |
4132 |
LS0tDQp0aXRsZTogIk1vbnRlIENhcmxvIFNpbXVsYXRpb25zOiBXZWVrIDYgVE5GIChCdWNzIEAgRWFnbGVzKSINCm91dHB1dDogaHRtbF9ub3RlYm9vaw0KLS0tDQoNCkV2ZXJ5IFdlZG5lc2RheSBhbmQgRnJpZGF5IEkgcHVibGlzaCBhIFN1YnN0YWNrIG5ld3NsZXR0ZXIgY2FsbGVkIFtNb250ZSBDYXJsbyBGb290YmFsbCBQaWNrc10oaHR0cHM6Ly9tY2ZwLnN1YnN0YWNrLmNvbS8pLiBPbiBXZWRuZXNkYXkgSSBwdWJsaXNoIHByb2plY3Rpb25zIGZvciB0aGUgVGh1cnNkYXkgTmlnaHQgZ2FtZSBhbmQgRnJpZGF5IGluY2x1ZGVzIHRoZSBwaWNrcyBmb3IgdGhlIHJlc3Qgb2YgdGhlIHdlZWsuIElmIHlvdSBhcmUgaW50ZXJlc3RlZCBpbiB0aGUgTkZMLCBwbGVhc2UgW3N1YnNjcmliZV0oaHR0cHM6Ly9tY2ZwLnN1YnN0YWNrLmNvbS8pLCBpdCdzIEZSRUUhDQoNClRoaXMgZmlsZSB1c2VzIHRoZSBlYXJseSBwb3dlciByYXRpbmdzIGZvciBXZWVrIDYgdG8gc2ltdWxhdGUgdGhlIFRodXJzZGF5IE5pZ2h0IEZvb3RiYWxsIGdhbWUuIFRoZSByYXRpbmdzIGFyZSB1cGRhdGVkIGZvciBpbmp1cmllcyBiZWZvcmUgcHVibGlzaGluZyBmdWxsIHBpY2tzIG9uIEZyaWRheXMuDQoNCg0KDQpMb2FkIHBhY2thZ2VzDQoNCmBgYHtyfQ0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KHRpZHlxdWFudCkNCmxpYnJhcnkoZ2dpbWFnZSkNCmxpYnJhcnkoZ2dyZXBlbCkNCmxpYnJhcnkoa25pdHIpDQpsaWJyYXJ5KGthYmxlRXh0cmEpDQoNCmBgYA0KDQoNCg0KTG9hZCByZXF1aXJlZCBkYXRhIGZpbGVzDQoNCmBgYHtyfQ0KcmF0aW5ncyA8LSByZWFkX2NzdigiV2VlayAwNi9pbnB1dHMvcG93ZXJfcmF0aW5ncy5jc3YiKSANCnNjaGVkdWxlIDwtIHJlYWRfY3N2KCJXZWVrIDA2L2lucHV0cy9zY2hlZHVsZV90bmYuY3N2IikNCnNjb3JlcyA8LSByZWFkX2NzdigiV2VlayAwNi9pbnB1dHMvY29tbW9uX3Njb3Jlcy5jc3YiLCBjb2xfdHlwZXMgPSAibiIpDQpkZi5sb2dvcyA8LSByZWFkLmNzdigiV2VlayAwNi9pbnB1dHMvbmZsX2xvZ29zLmNzdiIpDQpgYGANCg0KDQoNCkZ1bmN0aW9uIHRvIHNpbXVsYXRlIHNjb3Jlcy4gRGVmYXVsdCBsaW5lIGlzIDAsIG51bWJlciBvZiBzaW11bGF0aW9ucyBpcyAxMDAsMDAwLCBob21lIGZpZWxkIGFkdmFudGFnZSBpcyAwIGFuZCBhdmVyYWdlIHBvd2VyIHJhdGluZyBpcyAyNS4gVGhlc2UgdmFsdWVzIHdpbGwgYmUgdXNlZCBpZiBub3Qgc3VwcGxpZWQgaW4gdGhlIHNjaGVkdWxlX3RuZi5jc3YgZmlsZS4NCg0KYGBge3J9DQptY19zaW0gPC0gZnVuY3Rpb24oaG9tZSwgYXdheSwgZGF0YSA9IHJhdGluZ3MsIGxpbmUgPSAwLCBuID0gMTAwMDAwLCBoZmEgPSAwLCBtZWFuID0gMjUpew0KICANCiAgI3B1bGwgcmF0aW5ncyB0b2dldGhlciBmb3IgYm90aCB0ZWFtcyBpbiBtYXRjaHVwDQogIGhfb2ZmIDwtcmF0aW5ncyAlPiUNCiAgICBmaWx0ZXIoVGVhbSA9PSBob21lICYgVHlwZSA9PSAib2ZmX3JhdGluZyIpICU+JQ0KICAgIHNlbGVjdChUZWFtLCBUeXBlLCBNQ19QUiwgTUNfU1REKQ0KICANCiAgaF9kZWYgPC1yYXRpbmdzICU+JQ0KICAgIGZpbHRlcihUZWFtID09IGhvbWUgJiBUeXBlID09ICJkZWZfcmF0aW5nIikgJT4lDQogICAgc2VsZWN0KFRlYW0sIFR5cGUsIE1DX1BSLCBNQ19TVEQpDQogIA0KICANCiAgYV9vZmYgPC1yYXRpbmdzICU+JQ0KICAgIGZpbHRlcihUZWFtID09IGF3YXkgJiBUeXBlID09ICJvZmZfcmF0aW5nIikgJT4lDQogICAgc2VsZWN0KFRlYW0sIFR5cGUsIE1DX1BSLCBNQ19TVEQpDQogIA0KICBhX2RlZiA8LXJhdGluZ3MgJT4lDQogICAgZmlsdGVyKFRlYW0gPT0gYXdheSAmIFR5cGUgPT0gImRlZl9yYXRpbmciKSAlPiUNCiAgICBzZWxlY3QoVGVhbSwgVHlwZSwgTUNfUFIsIE1DX1NURCkNCiAgDQogIA0KICAjZ2VuZXJhdGUgc2NvcmVzDQogIHNldC5zZWVkKDEzKQ0KICANCiAgaF9zY29yZSA8LSByb3VuZChybm9ybShuLCBtZWFuID0gaF9vZmYkTUNfUFIsIHNkID0gaF9vZmYkTUNfU1REKSArIA0KICAgIGhmYSArDQogICAgcm5vcm0obiwgbWVhbiA9IGFfZGVmJE1DX1BSLCBzZCA9IGFfZGVmJE1DX1NURCkgLSBtZWFuLCBkaWdpdHMgPSAwKQ0KICANCiAgYV9zY29yZSA8LSByb3VuZChybm9ybShuLCBtZWFuID0gYV9vZmYkTUNfUFIsIHNkID0gYV9vZmYkTUNfU1REKSArDQogICAgcm5vcm0obiwgbWVhbiA9IGhfZGVmJE1DX1BSLCBzZCA9IGhfZGVmJE1DX1NURCkgLSBtZWFuLCBkaWdpdHMgPSAwKQ0KICANCiAgbWF0Y2h1cCA8PC0gYmluZF9jb2xzKGhtID0gaF9zY29yZSwgYXcgPSBhX3Njb3JlKSAlPiUNCiAgICBtdXRhdGUoaG9tZV9wZiA9IFZMT09LVVAoaG0sIHNjb3JlcywgcmF0aW5nLCBzY29yZSkpICU+JQ0KICAgIG11dGF0ZShhd2F5X3BmID0gVkxPT0tVUChhdywgc2NvcmVzLCByYXRpbmcsIHNjb3JlKSkgJT4lDQogICAgbXV0YXRlKG1hcmdpbiA9IGhvbWVfcGYgLSBhd2F5X3BmKSAlPiUNCiAgICBtdXRhdGUoY292ZXIgPSBpZl9lbHNlKG1hcmdpbiArIGxpbmUgPiAwLCAxLCAwKSkgJT4lDQogICAgbXV0YXRlKHdpbiA9IGlmX2Vsc2UobWFyZ2luID4gMCwgMSwgMCkpICU+JQ0KICAgIG11dGF0ZShob21lX3RlYW0gPSBob21lLCBhd2F5X3RlYW0gPSBhd2F5KSAlPiUNCiAgICBzZWxlY3QoaG9tZV90ZWFtLCBob21lX3BmLCBhd2F5X3RlYW0sIGF3YXlfcGYsIG1hcmdpbiwgY292ZXIsIHdpbikNCiAgICANCiAgd2luX3BjdCA8LSBzdW0obWF0Y2h1cCR3aW4pL24NCiAgY292ZXJfcGN0IDwtIHN1bShtYXRjaHVwJGNvdmVyKS9uDQogIA0KICB0aWJibGUoaG9tZSwgYXdheSwgbGluZSwgd2luX3BjdCwgY292ZXJfcGN0KSAlPiUNCiAgICBwaXZvdF9sb25nZXIoY29scyA9IHdpbl9wY3Q6Y292ZXJfcGN0LCBuYW1lc190byA9ICJUeXBlIiwNCiAgICAgICAgICAgICAgICAgdmFsdWVzX3RvID0gIkhvbWVfQ29uZmlkZW5jZSIpICU+JQ0KICAgIG11dGF0ZShBd2F5X0NvbmZpZGVuY2UgPSAxIC0gSG9tZV9Db25maWRlbmNlKQ0KDQp9DQoNCmBgYA0KDQoNCg0KSXRlcmF0ZSBtY19zaW0gZnVuY3Rpb24gb3ZlciBzY2hlZHVsZS5jc3YgdG8gZ2V0IHJlc3VsdHMgZm9yIGFsbCBnYW1lcyBpbiB0aGUgc2NoZWR1bGVfdG5mLmNzdiBmaWxlLg0KDQpgYGB7cn0NCnByZWRpY3Rpb25zIDwtIHBtYXBfZGZyKHNjaGVkdWxlLCBtY19zaW0pDQoNCmh3cCA8LSBwcmVkaWN0aW9ucyAlPiUNCiAgZmlsdGVyKFR5cGUgPT0gIndpbl9wY3QiKSAlPiUNCiAgbXV0YXRlKHR5cGUgPSAiU1UiLCBsb2NhdGlvbiA9ICJob21lIikgJT4lDQogIHNlbGVjdCh0eXBlLCB0ZWFtID0gaG9tZSwgb3Bwb25lbnQgPSBhd2F5LCBsaW5lLCBsb2NhdGlvbiwgY29uZmlkZW5jZSA9IEhvbWVfQ29uZmlkZW5jZSkNCg0KYXdwIDwtIHByZWRpY3Rpb25zICU+JQ0KICBmaWx0ZXIoVHlwZSA9PSAid2luX3BjdCIpICU+JQ0KICBtdXRhdGUodHlwZSA9ICJTVSIsIGxvY2F0aW9uID0gImF3YXkiLCBsaW5lID0gbGluZSAqIC0xKSAlPiUNCiAgc2VsZWN0KHR5cGUsIHRlYW0gPSBhd2F5LCBvcHBvbmVudCA9IGhvbWUsIGxpbmUsIGxvY2F0aW9uLCBjb25maWRlbmNlID0gQXdheV9Db25maWRlbmNlKQ0KDQpoY3AgPC0gcHJlZGljdGlvbnMgJT4lDQogIGZpbHRlcihUeXBlID09ICJjb3Zlcl9wY3QiKSAlPiUNCiAgbXV0YXRlKHR5cGUgPSAiQVRTIiwgbG9jYXRpb24gPSAiaG9tZSIpICU+JQ0KICBzZWxlY3QodHlwZSwgdGVhbSA9IGhvbWUsIG9wcG9uZW50ID0gYXdheSwgbGluZSwgbG9jYXRpb24sIGNvbmZpZGVuY2UgPSBIb21lX0NvbmZpZGVuY2UpDQoNCmFjcCA8LSBwcmVkaWN0aW9ucyAlPiUNCiAgZmlsdGVyKFR5cGUgPT0gImNvdmVyX3BjdCIpICU+JQ0KICBtdXRhdGUodHlwZSA9ICJBVFMiLCBsb2NhdGlvbiA9ICJhd2F5IiwgbGluZSA9IGxpbmUgKiAtMSkgJT4lDQogIHNlbGVjdCh0eXBlLCB0ZWFtID0gYXdheSwgb3Bwb25lbnQgPSBob21lLCBsaW5lLCBsb2NhdGlvbiwgY29uZmlkZW5jZSA9IEF3YXlfQ29uZmlkZW5jZSkgDQoNCnByZWRpY3Rpb25zMiA8LSBiaW5kX3Jvd3MoaHdwLCBhd3AsIGhjcCwgYWNwKSAlPiUNCiAgcGl2b3Rfd2lkZXIobmFtZXNfZnJvbSA9IHR5cGUsIHZhbHVlc19mcm9tID0gY29uZmlkZW5jZSkNCg0Kd3JpdGVfY3N2KHByZWRpY3Rpb25zMiwgZmlsZSA9ICJXZWVrIDA2L3RuZl9wcmVkaWN0aW9ucy5jc3YiKQ0KDQpwcmVkaWN0aW9uczINCmBgYA0KDQoNCg0KVGhlIHZhcmlhYmxlICJtYXRjaHVwIiBpcyBhIGdsb2JhbCB2YXJpYWJsZSBjcmVhdGVkIHdoZW4gbWNfc2ltIGlzIHJ1bi4gSXQgc2F2ZXMgdGhlIGRhdGEgb2YgdGhlIGxhc3QgZ2FtZSB0aGF0IHdhcyBydW4gdGhyb3VnaCB0aGUgZnVuY3Rpb24uIFVzZSB0aGlzIGRhdGEgdG8gcGxvdCBzY29yZSBmcmVxdWVuY2llcy4NCg0KYGBge3J9DQpnZ3Bsb3QobWF0Y2h1cCwgYWVzKHggPSBtYXJnaW4pKSArDQogIGdlb21faGlzdG9ncmFtKGJpbndpZHRoID0gMSwgY29sb3IgPSAiYmxhY2siLCBmaWxsID0gIndoaXRlIikgKw0KICBnZW9tX3ZsaW5lKGFlcyh4aW50ZXJjZXB0ID0gbWVhbihtYXJnaW4pKSwgY29sb3IgPSAiYmx1ZSIsIGxpbmV0eXBlID0gImRhc2hlZCIsIHNpemUgPSAxKSArDQogIGdlb21fdmxpbmUoYWVzKHhpbnRlcmNlcHQgPSAtNi41KSwgY29sb3IgPSAicmVkIiwgbGluZXR5cGUgPSAiZGFzaGVkIiwgc2l6ZSA9IDEpICsNCiAgZ2d0aXRsZSgiVGFtcGEgQmF5IGF0IFBoaWxhZGVscGhpYSBcbiBEaXN0cmlidXRpb24gb2YgUHJvamVjdGVkIE1hcmdpbiBvZiBWaWN0b3J5IikgKw0KICB4bGFiKCJFYWdsZXMgc2NvcmUgbWludXMgQnVjcyBzY29yZSBcbiBibHVlIGxpbmUgPSBhdmVyYWdlIG1hcmdpbiBcbiByZWQgbGluZSA9IGJldHRpbmcgbGluZSIpICsgeWxhYigiQ291bnQiKSArDQogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBjKC0zNSwgLTI1LCAtMjAsIC0xNCwgLTEwLCAtNywgLTMsIDAsIDMsIDcsIDEwLCAxNCwgMjAsIDI1KSkgKw0KICB0aGVtZV9jbGFzc2ljKCkgKw0KICB0aGVtZV9saW5lZHJhdygpICsNCiAgdGhlbWUoDQogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChjb2xvcj0icmVkIiwgc2l6ZT0xNCwgZmFjZT0iYm9sZC5pdGFsaWMiKSwNCiAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoY29sb3I9ImJsdWUiLCBzaXplPTE0LCBmYWNlPSJib2xkIiksDQogICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KGNvbG9yPSIjOTkzMzMzIiwgc2l6ZT0xNCwgZmFjZT0iYm9sZCIpLA0KICAgIHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgICAgcGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKQ0KKQ0KDQpgYGANCg0KDQoNClRvcCAxMCBTY29yZXMNCg0KYGBge3J9DQpzY29yZV9uIDwtIG1hdGNodXAgJT4lIGNvdW50KGhvbWVfcGYsIGF3YXlfcGYpICU+JSBhcnJhbmdlKGRlc2MobikpICU+JQ0KICByZW5hbWUoIkhvbWUiID0gaG9tZV9wZiwgIkF3YXkiID0gYXdheV9wZiwgIkNvdW50IiA9IG4pDQoNCmthYmxlKGhlYWQoc2NvcmVfbiwgMTApKSAlPiUNCiAga2FibGVfc3R5bGluZyhmb250X3NpemUgPSAyNCwgYm9vdHN0cmFwX29wdGlvbnMgPSBjKCJzdHJpcGVkIiwgImhvdmVyIiwgImNvbmRlbnNlZCIpLA0KICAgICAgICAgICAgICAgIGZ1bGxfd2lkdGggPSBGQUxTRSkNCg0KYGBgDQoNCg0KDQpUb3AgMTAgTWFyZ2lucyBvZiBWaWN0b3J5IChIb21lIHNjb3JlIG1pbnVzIEF3YXkgc2NvcmUpDQoNCmBgYHtyfQ0KbWFyZ2luX24gPC0gbWF0Y2h1cCAlPiUgY291bnQobWFyZ2luKSAlPiUgYXJyYW5nZShkZXNjKG4pKSAlPiUNCiAgcmVuYW1lKCJDb3VudCIgPSBuKQ0KDQprYWJsZShoZWFkKG1hcmdpbl9uLCAxMCkpICU+JQ0KICBrYWJsZV9zdHlsaW5nKGZvbnRfc2l6ZSA9IDI0LCBib290c3RyYXBfb3B0aW9ucyA9IGMoInN0cmlwZWQiLCAiaG92ZXIiLCAiY29uZGVuc2VkIiksDQogICAgICAgICAgICAgICAgZnVsbF93aWR0aCA9IEZBTFNFKQ0KYGBgDQoNCg==