Tidy Tuesday week 28 Independence Days, data from Wikipedia.
# load libraries
library(tidyverse)
library(ggtext)
library(lubridate)
library(colorspace)
library(maps)
library(patchwork)
# theme set
theme_set(theme_minimal(base_size = 10))
# import data
holidays <- readr::read_csv('https://raw.githubusercontent.com/rfordatascience/tidytuesday/master/data/2021/2021-07-06/holidays.csv')
── Column specification ─────────────────────────────────────────────────────────────────────────
cols(
country = col_character(),
date_parsed = col_date(format = ""),
weekday = col_character(),
day = col_double(),
month = col_character(),
name_of_holiday = col_character(),
date_of_holiday = col_character(),
year_of_event = col_double(),
independence_from = col_character(),
event_commemorated_and_notes = col_character(),
year = col_double(),
date_mdy = col_character()
)
glimpse(holidays)
Rows: 216
Columns: 12
$ country <chr> "Afghanistan", "Albania", "Algeria", "Andorra", "Angola", …
$ date_parsed <date> 1919-08-19, 1912-11-28, 1962-07-05, NA, 1975-11-11, 1981-…
$ weekday <chr> "Tuesday", "Thursday", "Thursday", NA, "Tuesday", "Sunday"…
$ day <dbl> 19, 28, 5, NA, 11, 1, 9, 28, 21, NA, 26, 28, 18, 10, 16, 2…
$ month <chr> "Aug", "Nov", "Jul", NA, "Nov", "Nov", "Jul", "May", "Sep"…
$ name_of_holiday <chr> "Afghan Independence Day (Afghan Victory Day)", "Flag Day …
$ date_of_holiday <chr> "August 19", "November 28", "July 5", NA, "November 11", "…
$ year_of_event <dbl> 1919, 1912, 1962, NA, 1975, 1981, NA, NA, 1991, NA, 1955, …
$ independence_from <chr> "United Kingdom", "Ottoman Empire", "France", NA, "Portuga…
$ event_commemorated_and_notes <chr> "Anglo-Afghan Treaty of 1919 or Treaty of Rawalpindi, an a…
$ year <dbl> 1919, 1912, 1962, NA, 1975, 1981, 1816, 1918, 1991, NA, 19…
$ date_mdy <chr> "August 19, 1919", "November 28, 1912", "July 5, 1962", NA…
# number of countries in dataset
n_distinct(holidays$country)
[1] 195
Independence event count: year
# independence year
ind_year = holidays %>% count(year) %>%
drop_na()
lab = ind_year %>% arrange(desc(n)) %>% slice(1:4)
ind_year %>%
ggplot(aes(x=year, y=n)) +
geom_segment(aes(x=year, xend=year, y=0, yend=n, color=I(ifelse(n==max(n),"#9d0208","black")))) +
geom_point(aes(size=n, color=I(ifelse(n==max(n),"#9d0208","black")))) +
geom_text(data = lab,aes(label=n), color="white",size=3) +
annotate(geom="text",x=1291, y=2.2, label="Switzerland",hjust = "left",size=2.2, angle=50) +
annotate(geom="text",x=1523, y=2.2, label="Sweden",hjust = "left",size=2.2, angle=50) +
annotate(geom="text",x=1581, y=2.2, label="The Netherlands",hjust = "left",size=2.2, angle=50) +
annotate(geom="text",x=1635, y=2.2, label="Portugal",hjust = "left",size=2.2, angle=50) +
annotate(geom="text",x=1655, y=2.2, label="Oman",hjust = "left",size=2.2, angle=50) +
annotate(geom="text", x= 1780, y=17,
label="17 countries in 1960",size=2.7, hjust="left") +
annotate(
geom = "curve", x = 1900, y = 17, xend = 1940, yend = 17,
curvature = 0, arrow = arrow(length = unit(1.5, "mm"))
) +
theme(panel.grid.minor = element_blank(),
legend.position = "none",
axis.title=element_blank(),
panel.grid.major=element_line(size=0.3),
plot.margin=ggplot2::margin(0.5,0.5,0.5,0.5,"cm"),
plot.caption = element_text(size=7.5, color="#495057"),
plot.title=element_markdown(
margin=margin(t=15,b=-60),hjust=0,face="bold",size=26,color="black")) +
scale_y_continuous(position="right") +
scale_x_continuous(breaks=c(1291,1523, 1581, 1640, 1776,1821,1918,2011)) +
labs(caption= "\nTidy Tuesdy Week 28 | Data from Wikipedia") +
ggtitle("195 COUNTRIES<br><span style = 'color:#9d0208'>INDEPENDENCE YEAR</span>")

Countries with 2 independence events
# countries with 2 independence events
c2 = holidays %>% count(country) %>% arrange(desc(n)) %>% filter(n==2)
n_distinct(c2$country)
[1] 21
# map data
world= map_data("world")
# check for differences
setdiff(c2$country, world$region)
[1] "Congo, Republic of the"
# recode
c2 = c2 %>% mutate(region= ifelse(country=="Congo, Republic of the","Republic of Congo",country))
# join
joined = left_join(world, c2, by="region") %>%
mutate(col = ifelse(is.na(n),"0","2"))
# plot
joined %>% ggplot(aes(x = long, y = lat, group = group)) +
geom_polygon(aes(fill=col)) +
coord_fixed(1.3) +
theme(legend.position = "none") +
scale_fill_manual(values=c("grey90","#ee9b00")) +
theme_void() +
theme(legend.position = "none",
plot.title = element_text(face="bold",color="#ee9b00",size=12,hjust=0.5),
plot.margin=ggplot2::margin(0.5,0,0.5,0,"cm")) +
labs(title = "21 Countries With Two Independence Events\n")

Independence event count: day of month
# day of month
holidays %>% count(day) %>%
drop_na() %>%
ggplot(aes(x=day, y=n)) +
geom_segment(aes(x=day, xend=day, y=0, yend=n)) +
geom_point(aes(size=n, color=n)) +
theme(panel.grid.minor = element_blank(),
legend.position = "none",
plot.title.position = "plot",
plot.subtitle = element_text(face="bold"),
panel.grid.major=element_line(size=0.3),
axis.title=element_text(face="bold",size=9),
plot.margin=ggplot2::margin(0.5,0.5,0.5,0.5,"cm")) +
scale_x_continuous(limits=c(1,31), breaks=seq(1,31,10)) +
labs(subtitle="Independence event count, by day of month\n", x="Day of month",y="Count") +
scale_color_continuous_sequential(palette="Viridis", trans="reverse")

Independence event count: month and week day
# prepare data
holidays2 = holidays %>%
mutate(date = mdy(date_mdy),
wday = wday(date, week_start = 1, label=T),
wday_n = wday(date, week_start = 1),
mth_n = month(date),
mth = month(date, label=T))
# month
p1 = holidays2 %>% group_by(mth, mth_n) %>% tally() %>% drop_na() %>%
ggplot(aes(x=mth_n-0.5, y=n)) +
geom_step() +
geom_segment(aes(x=mth_n-0.5, xend=mth_n+0.5, y=n, yend=n)) +
geom_text(aes(x=mth_n, y=n,label=mth), vjust=2, size=3.2) +
geom_text(aes(x=mth_n, y=n, label=n), vjust=-1.5, size=3.2) +
scale_x_continuous(breaks=c(1,4,7,10)) +
scale_y_continuous(limits=c(5,31)) +
theme_void() +
theme(plot.margin=ggplot2::margin(0.5,0.5,0.5,0.5,"cm"),
plot.subtitle = element_text(face="bold",size=9)) +
labs(subtitle="Independence event count by month")
# wday
p2 = holidays2 %>% group_by(wday, wday_n) %>% tally() %>% drop_na() %>%
ggplot(aes(x=wday_n-0.5, y=n)) +
geom_step() +
geom_segment(aes(x=wday_n-0.5, xend=wday_n+0.5, y=n, yend=n)) +
geom_text(aes(x=wday_n, y=n,label=wday), vjust=2, size=3.2) +
geom_text(aes(x=wday_n, y=n, label=n), vjust=-1.5, size=3.2) +
scale_y_continuous(limits=c(20,35)) +
theme_void() +
theme(plot.margin=ggplot2::margin(0.5,0.5,0.5,0.5,"cm"),
plot.subtitle = element_text(face="bold",size=9)) +
labs(subtitle="Independence event count by week day")
# combine plot
p1/
p2

LS0tCnRpdGxlOiAiVGlkeSBUdWVzZGF5IFdlZWsgMjgvMjAyMSIKZGF0ZTogIjIwMjEvMDcvMDYiCm91dHB1dDogaHRtbF9ub3RlYm9vawotLS0KClRpZHkgVHVlc2RheSB3ZWVrIDI4IFtJbmRlcGVuZGVuY2UgRGF5c10oaHR0cHM6Ly9naXRodWIuY29tL3Jmb3JkYXRhc2NpZW5jZS90aWR5dHVlc2RheS9ibG9iL21hc3Rlci9kYXRhLzIwMjEvMjAyMS0wNy0wNi9yZWFkbWUubWQpLCBkYXRhIGZyb20gW1dpa2lwZWRpYV0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvTGlzdF9vZl9uYXRpb25hbF9pbmRlcGVuZGVuY2VfZGF5cykuCgoKYGBge3J9CiMgbG9hZCBsaWJyYXJpZXMKbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkoZ2d0ZXh0KQpsaWJyYXJ5KGx1YnJpZGF0ZSkKbGlicmFyeShjb2xvcnNwYWNlKQpsaWJyYXJ5KG1hcHMpCmxpYnJhcnkocGF0Y2h3b3JrKQoKIyB0aGVtZSBzZXQKdGhlbWVfc2V0KHRoZW1lX21pbmltYWwoYmFzZV9zaXplID0gMTApKQpgYGAKCgpgYGB7cn0KIyBpbXBvcnQgZGF0YQpob2xpZGF5cyA8LSByZWFkcjo6cmVhZF9jc3YoJ2h0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9yZm9yZGF0YXNjaWVuY2UvdGlkeXR1ZXNkYXkvbWFzdGVyL2RhdGEvMjAyMS8yMDIxLTA3LTA2L2hvbGlkYXlzLmNzdicpCmdsaW1wc2UoaG9saWRheXMpCmBgYAoKCmBgYHtyfQojIG51bWJlciBvZiBjb3VudHJpZXMgaW4gZGF0YXNldApuX2Rpc3RpbmN0KGhvbGlkYXlzJGNvdW50cnkpCmBgYAoKCiMjIyBJbmRlcGVuZGVuY2UgZXZlbnQgY291bnQ6IHllYXIKKiBzaGFyZWQgb24gW1R3aXR0ZXJdKGh0dHBzOi8vdHdpdHRlci5jb20vbGVlb2xuZXkzL3N0YXR1cy8xNDEyMzEwMjQ1MTI5NTI3Mjk3L3Bob3RvLzEpCgpgYGB7cn0KIyBpbmRlcGVuZGVuY2UgeWVhcgppbmRfeWVhciA9IGhvbGlkYXlzICU+JSBjb3VudCh5ZWFyKSAlPiUKICBkcm9wX25hKCkgCgpsYWIgPSBpbmRfeWVhciAlPiUgYXJyYW5nZShkZXNjKG4pKSAlPiUgc2xpY2UoMTo0KQoKaW5kX3llYXIgJT4lCiAgZ2dwbG90KGFlcyh4PXllYXIsIHk9bikpICsgCiAgZ2VvbV9zZWdtZW50KGFlcyh4PXllYXIsIHhlbmQ9eWVhciwgeT0wLCB5ZW5kPW4sIGNvbG9yPUkoaWZlbHNlKG49PW1heChuKSwiIzlkMDIwOCIsImJsYWNrIikpKSkgKwogIGdlb21fcG9pbnQoYWVzKHNpemU9biwgY29sb3I9SShpZmVsc2Uobj09bWF4KG4pLCIjOWQwMjA4IiwiYmxhY2siKSkpKSArIAogIGdlb21fdGV4dChkYXRhID0gbGFiLGFlcyhsYWJlbD1uKSwgY29sb3I9IndoaXRlIixzaXplPTMpICsKICBhbm5vdGF0ZShnZW9tPSJ0ZXh0Iix4PTEyOTEsIHk9Mi4yLCBsYWJlbD0iU3dpdHplcmxhbmQiLGhqdXN0ID0gImxlZnQiLHNpemU9Mi4yLCBhbmdsZT01MCkgKyAKICBhbm5vdGF0ZShnZW9tPSJ0ZXh0Iix4PTE1MjMsIHk9Mi4yLCBsYWJlbD0iU3dlZGVuIixoanVzdCA9ICJsZWZ0IixzaXplPTIuMiwgYW5nbGU9NTApICsgCiAgYW5ub3RhdGUoZ2VvbT0idGV4dCIseD0xNTgxLCB5PTIuMiwgbGFiZWw9IlRoZSBOZXRoZXJsYW5kcyIsaGp1c3QgPSAibGVmdCIsc2l6ZT0yLjIsIGFuZ2xlPTUwKSArIAogIGFubm90YXRlKGdlb209InRleHQiLHg9MTYzNSwgeT0yLjIsIGxhYmVsPSJQb3J0dWdhbCIsaGp1c3QgPSAibGVmdCIsc2l6ZT0yLjIsIGFuZ2xlPTUwKSArCiAgYW5ub3RhdGUoZ2VvbT0idGV4dCIseD0xNjU1LCB5PTIuMiwgbGFiZWw9Ik9tYW4iLGhqdXN0ID0gImxlZnQiLHNpemU9Mi4yLCBhbmdsZT01MCkgKwogIGFubm90YXRlKGdlb209InRleHQiLCB4PSAxNzgwLCB5PTE3LCAKICAgICAgICAgICBsYWJlbD0iMTcgY291bnRyaWVzIGluIDE5NjAiLHNpemU9Mi43LCBoanVzdD0ibGVmdCIpICsKICBhbm5vdGF0ZSgKICAgIGdlb20gPSAiY3VydmUiLCB4ID0gMTkwMCwgeSA9IDE3LCB4ZW5kID0gMTk0MCwgeWVuZCA9IDE3LCAKICAgIGN1cnZhdHVyZSA9IDAsIGFycm93ID0gYXJyb3cobGVuZ3RoID0gdW5pdCgxLjUsICJtbSIpKQogICkgKwogIHRoZW1lKHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLAogICAgICAgIGF4aXMudGl0bGU9ZWxlbWVudF9ibGFuaygpLAogICAgICAgIHBhbmVsLmdyaWQubWFqb3I9ZWxlbWVudF9saW5lKHNpemU9MC4zKSwKICAgICAgICBwbG90Lm1hcmdpbj1nZ3Bsb3QyOjptYXJnaW4oMC41LDAuNSwwLjUsMC41LCJjbSIpLAogICAgICAgIHBsb3QuY2FwdGlvbiA9IGVsZW1lbnRfdGV4dChzaXplPTcuNSwgY29sb3I9IiM0OTUwNTciKSwKICAgICAgICBwbG90LnRpdGxlPWVsZW1lbnRfbWFya2Rvd24oCiAgICAgICAgICBtYXJnaW49bWFyZ2luKHQ9MTUsYj0tNjApLGhqdXN0PTAsZmFjZT0iYm9sZCIsc2l6ZT0yNixjb2xvcj0iYmxhY2siKSkgKyAKICBzY2FsZV95X2NvbnRpbnVvdXMocG9zaXRpb249InJpZ2h0IikgKyAKICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzPWMoMTI5MSwxNTIzLCAxNTgxLCAxNjQwLCAxNzc2LDE4MjEsMTkxOCwyMDExKSkgKwogIGxhYnMoY2FwdGlvbj0gIlxuVGlkeSBUdWVzZHkgV2VlayAyOCB8IERhdGEgZnJvbSBXaWtpcGVkaWEiKSArIAogIGdndGl0bGUoIjE5NSBDT1VOVFJJRVM8YnI+PHNwYW4gc3R5bGUgPSAnY29sb3I6IzlkMDIwOCc+SU5ERVBFTkRFTkNFIFlFQVI8L3NwYW4+IikKYGBgCgojIyMgQ291bnRyaWVzIHdpdGggMiBpbmRlcGVuZGVuY2UgZXZlbnRzCmBgYHtyfQojIGNvdW50cmllcyB3aXRoIDIgaW5kZXBlbmRlbmNlIGV2ZW50cwpjMiA9IGhvbGlkYXlzICU+JSBjb3VudChjb3VudHJ5KSAlPiUgYXJyYW5nZShkZXNjKG4pKSAlPiUgZmlsdGVyKG49PTIpCm5fZGlzdGluY3QoYzIkY291bnRyeSkKCiMgbWFwIGRhdGEKd29ybGQ9IG1hcF9kYXRhKCJ3b3JsZCIpCgojIGNoZWNrIGZvciBkaWZmZXJlbmNlcwpzZXRkaWZmKGMyJGNvdW50cnksIHdvcmxkJHJlZ2lvbikKCiMgcmVjb2RlIApjMiA9IGMyICU+JSBtdXRhdGUocmVnaW9uPSBpZmVsc2UoY291bnRyeT09IkNvbmdvLCBSZXB1YmxpYyBvZiB0aGUiLCJSZXB1YmxpYyBvZiBDb25nbyIsY291bnRyeSkpCgojIGpvaW4Kam9pbmVkID0gbGVmdF9qb2luKHdvcmxkLCBjMiwgYnk9InJlZ2lvbiIpICU+JSAKICBtdXRhdGUoY29sID0gaWZlbHNlKGlzLm5hKG4pLCIwIiwiMiIpKQoKIyBwbG90CmpvaW5lZCAlPiUgZ2dwbG90KGFlcyh4ID0gbG9uZywgeSA9IGxhdCwgZ3JvdXAgPSBncm91cCkpICsKICBnZW9tX3BvbHlnb24oYWVzKGZpbGw9Y29sKSkgKyAKICBjb29yZF9maXhlZCgxLjMpICsgCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArIAogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcz1jKCJncmV5OTAiLCIjZWU5YjAwIikpICsgCiAgdGhlbWVfdm9pZCgpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsCiAgICAgICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChmYWNlPSJib2xkIixjb2xvcj0iI2VlOWIwMCIsc2l6ZT0xMixoanVzdD0wLjUpLAogICAgICAgIHBsb3QubWFyZ2luPWdncGxvdDI6Om1hcmdpbigwLjUsMCwwLjUsMCwiY20iKSkgKyAKICBsYWJzKHRpdGxlID0gIjIxIENvdW50cmllcyBXaXRoIFR3byBJbmRlcGVuZGVuY2UgRXZlbnRzXG4iKQpgYGAKCiMjIyBJbmRlcGVuZGVuY2UgZXZlbnQgY291bnQ6IGRheSBvZiBtb250aApgYGB7cn0KIyBkYXkgb2YgbW9udGgKaG9saWRheXMgJT4lIGNvdW50KGRheSkgJT4lCiAgZHJvcF9uYSgpICU+JQogIGdncGxvdChhZXMoeD1kYXksIHk9bikpICsgCiAgZ2VvbV9zZWdtZW50KGFlcyh4PWRheSwgeGVuZD1kYXksIHk9MCwgeWVuZD1uKSkgKyAKICBnZW9tX3BvaW50KGFlcyhzaXplPW4sIGNvbG9yPW4pKSArIAogIHRoZW1lKHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLAogICAgICAgIHBsb3QudGl0bGUucG9zaXRpb24gPSAicGxvdCIsCiAgICAgICAgcGxvdC5zdWJ0aXRsZSA9IGVsZW1lbnRfdGV4dChmYWNlPSJib2xkIiksCiAgICAgICAgcGFuZWwuZ3JpZC5tYWpvcj1lbGVtZW50X2xpbmUoc2l6ZT0wLjMpLAogICAgICAgIGF4aXMudGl0bGU9ZWxlbWVudF90ZXh0KGZhY2U9ImJvbGQiLHNpemU9OSksCiAgICAgICAgcGxvdC5tYXJnaW49Z2dwbG90Mjo6bWFyZ2luKDAuNSwwLjUsMC41LDAuNSwiY20iKSkgKyAKICBzY2FsZV94X2NvbnRpbnVvdXMobGltaXRzPWMoMSwzMSksIGJyZWFrcz1zZXEoMSwzMSwxMCkpICsgCiAgbGFicyhzdWJ0aXRsZT0iSW5kZXBlbmRlbmNlIGV2ZW50IGNvdW50LCBieSBkYXkgb2YgbW9udGhcbiIsIHg9IkRheSBvZiBtb250aCIseT0iQ291bnQiKSArIAogIHNjYWxlX2NvbG9yX2NvbnRpbnVvdXNfc2VxdWVudGlhbChwYWxldHRlPSJWaXJpZGlzIiwgdHJhbnM9InJldmVyc2UiKQpgYGAKCiMjIyBJbmRlcGVuZGVuY2UgZXZlbnQgY291bnQ6IG1vbnRoIGFuZCB3ZWVrIGRheSAKCmBgYHtyfQojIHByZXBhcmUgZGF0YQpob2xpZGF5czIgPSBob2xpZGF5cyAlPiUKICBtdXRhdGUoZGF0ZSA9IG1keShkYXRlX21keSksCiAgICAgICAgIHdkYXkgPSB3ZGF5KGRhdGUsIHdlZWtfc3RhcnQgPSAxLCBsYWJlbD1UKSwKICAgICAgICAgd2RheV9uID0gd2RheShkYXRlLCB3ZWVrX3N0YXJ0ID0gMSksCiAgICAgICAgIG10aF9uID0gbW9udGgoZGF0ZSksCiAgICAgICAgIG10aCA9IG1vbnRoKGRhdGUsIGxhYmVsPVQpKSAKCiMgbW9udGggCnAxID0gaG9saWRheXMyICU+JSBncm91cF9ieShtdGgsIG10aF9uKSAlPiUgdGFsbHkoKSAlPiUgZHJvcF9uYSgpICU+JQogIGdncGxvdChhZXMoeD1tdGhfbi0wLjUsIHk9bikpICsgCiAgZ2VvbV9zdGVwKCkgKyAKICBnZW9tX3NlZ21lbnQoYWVzKHg9bXRoX24tMC41LCB4ZW5kPW10aF9uKzAuNSwgeT1uLCB5ZW5kPW4pKSArIAogIGdlb21fdGV4dChhZXMoeD1tdGhfbiwgeT1uLGxhYmVsPW10aCksIHZqdXN0PTIsIHNpemU9My4yKSArCiAgZ2VvbV90ZXh0KGFlcyh4PW10aF9uLCB5PW4sIGxhYmVsPW4pLCB2anVzdD0tMS41LCBzaXplPTMuMikgKwogIHNjYWxlX3hfY29udGludW91cyhicmVha3M9YygxLDQsNywxMCkpICsgCiAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cz1jKDUsMzEpKSArIAogIHRoZW1lX3ZvaWQoKSArIAogIHRoZW1lKHBsb3QubWFyZ2luPWdncGxvdDI6Om1hcmdpbigwLjUsMC41LDAuNSwwLjUsImNtIiksCiAgICAgICAgcGxvdC5zdWJ0aXRsZSA9IGVsZW1lbnRfdGV4dChmYWNlPSJib2xkIixzaXplPTkpKSArIAogIGxhYnMoc3VidGl0bGU9IkluZGVwZW5kZW5jZSBldmVudCBjb3VudCBieSBtb250aCIpCgojIHdkYXkgCnAyID0gaG9saWRheXMyICU+JSBncm91cF9ieSh3ZGF5LCB3ZGF5X24pICU+JSB0YWxseSgpICU+JSBkcm9wX25hKCkgJT4lCiAgZ2dwbG90KGFlcyh4PXdkYXlfbi0wLjUsIHk9bikpICsgCiAgZ2VvbV9zdGVwKCkgKyAKICBnZW9tX3NlZ21lbnQoYWVzKHg9d2RheV9uLTAuNSwgeGVuZD13ZGF5X24rMC41LCB5PW4sIHllbmQ9bikpICsgCiAgZ2VvbV90ZXh0KGFlcyh4PXdkYXlfbiwgeT1uLGxhYmVsPXdkYXkpLCB2anVzdD0yLCBzaXplPTMuMikgKwogIGdlb21fdGV4dChhZXMoeD13ZGF5X24sIHk9biwgbGFiZWw9biksIHZqdXN0PS0xLjUsIHNpemU9My4yKSArIAogIHNjYWxlX3lfY29udGludW91cyhsaW1pdHM9YygyMCwzNSkpICsgCiAgdGhlbWVfdm9pZCgpICsgCiAgdGhlbWUocGxvdC5tYXJnaW49Z2dwbG90Mjo6bWFyZ2luKDAuNSwwLjUsMC41LDAuNSwiY20iKSwKICAgICAgICBwbG90LnN1YnRpdGxlID0gZWxlbWVudF90ZXh0KGZhY2U9ImJvbGQiLHNpemU9OSkpICsgCiAgbGFicyhzdWJ0aXRsZT0iSW5kZXBlbmRlbmNlIGV2ZW50IGNvdW50IGJ5IHdlZWsgZGF5IikKCiMgY29tYmluZSBwbG90CnAxLwogIHAyCmBgYAoKCgoKCg==