This is the code I used to render the following video.

Data compiled by David Lazar (@davidthelazar) and available here. The version used to create the following video is here.

Notes from twitter:

library(tidyverse)
library(gganimate)
library(transformr)

input <- read.csv("~/Desktop/blaseball/20210723_idolBoardData-rawData.csv") 

input %>% 
  select(-c(3:22)) %>% 
  pivot_longer(cols = 3:22,
               names_to = "position",
               values_to = "player") %>% 
  mutate(position = str_remove(position, "X"),
         position = str_remove(position, fixed(".1"))) %>% 
  full_join(input %>%
              select(1:22) %>% 
              pivot_longer(cols = 3:22,
                           names_to = "position",
                           values_to = "eDensity") %>% 
              mutate(position = str_remove(position, "X")),
            by = c("timestamp", "strictlyConfidential", "position")) %>% 
  mutate(position = as.integer(position),
         timestamp = str_trunc(timestamp, 
                               width = 19, 
                               side = "right", 
                               ellipsis = ""),
         timestamp = str_replace(timestamp, pattern = "T",replacement = " "),
         timestamp = strftime(timestamp,
                              format = "%F %T"),
         timestampPOSIX = strptime(timestamp,
                                   format = "%F %T")) %>% 
  rename(noodle = strictlyConfidential) -> idols

First, I created the static image from which the frames will be extracted.

idols %>% 
  # These filters are good for testing how it responds to y-axis changes and x-axis dimensions
  #filter(timestampPOSIX > strptime("2021-06-25 02:00:01", format = "%F %T") &
  #         timestampPOSIX < strptime("2021-06-29 02:00:01", format = "%F %T")) %>% 
  mutate(timestamp_fct = as.factor(timestamp),
         position_fct = as.factor(position)) %>% 
  group_by(timestampPOSIX) %>% 
  summarise(total = sum(eDensity)) %>% 
  full_join(idols %>% 
              # Same as above.
              #filter(timestampPOSIX > strptime("2021-06-25 02:00:01", format = "%F %T") &
              #         timestampPOSIX < strptime("2021-06-29 02:00:01", format = "%F %T")) %>%
              mutate(timestamp_fct = as.factor(timestamp),
                     position_fct = as.factor(position)),
            by = "timestampPOSIX") %>% 
  # Just to keep the names consistent across all timepoints
  mutate(player_name = case_when(player == "--at-ema -lem-f-yo" ~ "Anathema Elemefayo",
                                 player == "B-by Do-le" ~ "Baby Doyle",
                                 player == "Com-issioner V-por" ~ "Commissioner Vapor",
                                 player == "Commissioner V-por" ~ "Commissioner Vapor",
                                 player == "-o- Mit-hel-" ~ "Don Mitchell",
                                 player == "-o- Mitchel-" ~ "Don Mitchell",
                                 player == "-o- Mitchell" ~ "Don Mitchell",
                                 player == "-on Mitchell" ~ "Don Mitchell",
                                 player == "-ud-ey -ueller" ~ "Dudley Mueller",
                                 player == "-ud-ey Mueller" ~ "Dudley Mueller",
                                 player == "Dud-ey Mueller" ~ "Dudley Mueller",
                                 player == "Dudley Muelle-" ~ "Dudley Mueller",
                                 player == "Dud-ey Mueller" ~ "Dudley Mueller",
                                 player == "Dudley Muelle-" ~ "Dudley Mueller",
                                 player == "G-a Holb---k" ~ "Gia Holbrook",
                                 player == "G-a Holb--ok" ~ "Gia Holbrook",
                                 player == "G-a Holbr-ok" ~ "Gia Holbrook",
                                 player == "H-t-ie-d S-z-ki" ~ "Hatfield Suzuki",
                                 player == "J-xo- B-c--ey" ~ "Jaxon Buckley",
                                 player == "J-xo- B-ck-ey" ~ "Jaxon Buckley",
                                 player == "J-xon B-ck-ey" ~ "Jaxon Buckley",
                                 player == "J-x-n B-ck--y" ~ "Jaxon Buckley",
                                 player == "J-x-n B-ckl-y" ~ "Jaxon Buckley",
                                 player == "J-x-n Buckl-y" ~ "Jaxon Buckley",
                                 player == "J-x-n Buckley" ~ "Jaxon Buckley",
                                 player == "Jax-n Buckley" ~ "Jaxon Buckley",
                                 player == "Jaxon B-ck-ey" ~ "Jaxon Buckley",
                                 player == "Jaxon Buck-ey" ~ "Jaxon Buckley",
                                 player == "Knight Triu-phant" ~ "Knight Triumphant",
                                 player == "Malik Dest-ny" ~ "Malik Destiny",
                                 player == "Mi-a -emma" ~ "Mira Lemma",
                                 player == "Mira -emma" ~ "Mira Lemma",
                                 player == "P-u-a --rn-p" ~ "Paula Turnip",
                                 player == "P-u-a --rnip" ~ "Paula Turnip",
                                 player == "Pau-a -urnip" ~ "Paula Turnip",
                                 player == "Pi-ching -ac--ne" ~ "Pitching Machine",
                                 player == "R-g-- --ie-r---" ~ "Rigby Friedrich",
                                 player == "T-oma- Drac-ena" ~ "Thomas Dracaena",
                                 player == "Thoma- Drac-ena" ~ "Thomas Dracaena",
                                 player == "Thomas Drac-ena" ~ "Thomas Dracaena",
                                 player == "--n--- Carve-" ~ "Sandie Carver",
                                 TRUE ~ player)) %>% 
  group_by(timestampPOSIX, position_fct, player_name) %>% 
  summarise(percent = eDensity/total,
            abs_percent = abs(eDensity)/total) %>% 
  mutate(log_percent = case_when(abs_percent == 0 ~ 0,
                                 abs_percent > 0 ~ log(abs_percent)+6),
         player_position = paste0(" ", as.character(position_fct), ": ", player_name)) %>% 
  # Plot begins here
  ggplot(aes(x = timestampPOSIX, 
             y = percent,
             colour = position_fct)) +
  theme_bw() +
  viridis::scale_fill_viridis(option = "plasma", discrete = TRUE) +
  viridis::scale_colour_viridis(option = "plasma", discrete = TRUE) +
  scale_y_continuous(labels = scales::percent_format()) +
  theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1),
        legend.position = "none") +
  # Layer 1 (for animation)
  geom_point(aes(#group = player_position,
                 size = percent),
             position = "stack",
             stat = "identity",
             alpha = .5) +
  # Layer 2 (to be excluded from animation's shadow/trace)
  geom_text(aes(label = player_position,
                size = log_percent),
            stat = "identity",
            position = "stack",
            check_overlap = FALSE, 
            hjust = 0) +
  ggtitle("") -> q

Next, animate the plot, which will initially compile as a gif, but only with 100 frames (for now).

q + transition_states(timestampPOSIX,
                      transition_length = 10,
                      state_length = 1) +
  ease_aes("cubic-in") +
  view_follow(fixed_x = TRUE) +
  labs(title = 'Idol Board at {closest_state}') + 
  shadow_trail(distance = 1,
               exclude_layer = 2) + 
  shadow_mark(alpha = .05,
              exclude_layer = 2) +
  enter_fade() + exit_fade() -> q1

Finally, render it as a video and save it (although I still needed to convert to .m4v using VLC and then transcode to .mp4 using HandBrake).

animate(q1, 
        nframes = 6000,
        fps = 30,
        renderer = av_renderer(),
        detail = 3,
        width = 1920,
        height = 1080)
#anim_save("20210725-big_vid")

And, if all goes well, and you have lots of time and sufficient computing power, you get something like this:

LS0tCnRpdGxlOiAiRGF0YWNyaW1lcyBWaXN1YWxpemVkIgphdXRob3I6ICJieSBMYXVyZW4gQWNrZXJtYW4iCmRhdGU6ICIyMDIxIEp1bHkgMjUiCm91dHB1dDogCiAgaHRtbF9ub3RlYm9vazoKICAgICAgaW5jbHVkZXM6IAogICAgICAgICAgaW5faGVhZGVyOiBnb29nbGVfYW5hbHl0aWNzLmh0bWwKLS0tCgpUaGlzIGlzIHRoZSBjb2RlIEkgdXNlZCB0byByZW5kZXIgdGhlIGZvbGxvd2luZyB2aWRlby4KCkRhdGEgY29tcGlsZWQgYnkgRGF2aWQgTGF6YXIgKFtcQGRhdmlkdGhlbGF6YXJdKGh0dHBzOi8vdHdpdHRlci5jb20vZGF2aWR0aGVsYXphcikpIGFuZCBhdmFpbGFibGUgW2hlcmVdKGh0dHBzOi8vZG9jcy5nb29nbGUuY29tL3NwcmVhZHNoZWV0cy9kLzFWZk0yTGFuOF9CLXRmRGxTaThxX2g0SnVJZTZmenFvOHI1STR5S0FOMU5RL2VkaXQpLiBUaGUgdmVyc2lvbiB1c2VkIHRvIGNyZWF0ZSB0aGUgZm9sbG93aW5nIHZpZGVvIGlzIFtoZXJlXSgyMDIxMDcyM19pZG9sQm9hcmREYXRhLXJhd0RhdGEuY3N2KS4KCk5vdGVzIGZyb20gdHdpdHRlcjogCgoqIHNvIGp1c3QgdG8gZG91YmxlIGNoZWNrLCBjb2x1bW5zIEM6ViBhcmUgZURlbnNpdGllcyBvZiB0aGUgY29ycmVzcG9uZGluZyBwbGF5ZXJzIGluIGNvbHVtbnMgVzpBUD8gYW5kIHN0cmljdGx5Q29uZmlkZW50aWFsIGlzLCB3aGF0LCB3aGVyZSB0aGUgbm9vZGxlIHdhcz8gCiogQWxsIGNvcnJlY3QuIEJ1dCBqdXN0IHRvIGJlIGNsZWFyLCB0aGUgZURlbnNpdGllcyBhbmQgcGxheWVyIG5hbWVzIGFyZSBhbHdheXMgaW4gb3JkZXIgZnJvbSB0b3Agb2YgaWRvbGJvYXJkIHRvIHRoZSBib3R0b20gKGxhYmVscyBpbiByb3cgMSkuIEFsc28sIHN0cmljdGx5Q29uZmlkZW50aWFsIGlzIHplcm8taW5kZXhlZCBzbyB0aGUgbm9vZGxlIGhhcyBzdHJpY3RseUNvbmZpZGVudGlhbCsxIHBsYXllcnMgYWJvdmUgaXQKCgpgYGB7ciBzZXR1cCwgZXZhbD1GQUxTRX0KbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkoZ2dhbmltYXRlKQpsaWJyYXJ5KHRyYW5zZm9ybXIpCgppbnB1dCA8LSByZWFkLmNzdigifi9EZXNrdG9wL2JsYXNlYmFsbC8yMDIxMDcyM19pZG9sQm9hcmREYXRhLXJhd0RhdGEuY3N2IikgCgppbnB1dCAlPiUgCiAgc2VsZWN0KC1jKDM6MjIpKSAlPiUgCiAgcGl2b3RfbG9uZ2VyKGNvbHMgPSAzOjIyLAogICAgICAgICAgICAgICBuYW1lc190byA9ICJwb3NpdGlvbiIsCiAgICAgICAgICAgICAgIHZhbHVlc190byA9ICJwbGF5ZXIiKSAlPiUgCiAgbXV0YXRlKHBvc2l0aW9uID0gc3RyX3JlbW92ZShwb3NpdGlvbiwgIlgiKSwKICAgICAgICAgcG9zaXRpb24gPSBzdHJfcmVtb3ZlKHBvc2l0aW9uLCBmaXhlZCgiLjEiKSkpICU+JSAKICBmdWxsX2pvaW4oaW5wdXQgJT4lCiAgICAgICAgICAgICAgc2VsZWN0KDE6MjIpICU+JSAKICAgICAgICAgICAgICBwaXZvdF9sb25nZXIoY29scyA9IDM6MjIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzX3RvID0gInBvc2l0aW9uIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzX3RvID0gImVEZW5zaXR5IikgJT4lIAogICAgICAgICAgICAgIG11dGF0ZShwb3NpdGlvbiA9IHN0cl9yZW1vdmUocG9zaXRpb24sICJYIikpLAogICAgICAgICAgICBieSA9IGMoInRpbWVzdGFtcCIsICJzdHJpY3RseUNvbmZpZGVudGlhbCIsICJwb3NpdGlvbiIpKSAlPiUgCiAgbXV0YXRlKHBvc2l0aW9uID0gYXMuaW50ZWdlcihwb3NpdGlvbiksCiAgICAgICAgIHRpbWVzdGFtcCA9IHN0cl90cnVuYyh0aW1lc3RhbXAsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGggPSAxOSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWRlID0gInJpZ2h0IiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGxpcHNpcyA9ICIiKSwKICAgICAgICAgdGltZXN0YW1wID0gc3RyX3JlcGxhY2UodGltZXN0YW1wLCBwYXR0ZXJuID0gIlQiLHJlcGxhY2VtZW50ID0gIiAiKSwKICAgICAgICAgdGltZXN0YW1wID0gc3RyZnRpbWUodGltZXN0YW1wLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQgPSAiJUYgJVQiKSwKICAgICAgICAgdGltZXN0YW1wUE9TSVggPSBzdHJwdGltZSh0aW1lc3RhbXAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0ID0gIiVGICVUIikpICU+JSAKICByZW5hbWUobm9vZGxlID0gc3RyaWN0bHlDb25maWRlbnRpYWwpIC0+IGlkb2xzCmBgYAoKRmlyc3QsIEkgY3JlYXRlZCB0aGUgc3RhdGljIGltYWdlIGZyb20gd2hpY2ggdGhlIGZyYW1lcyB3aWxsIGJlIGV4dHJhY3RlZC4KCmBgYHtyIHN0YXRpYywgZXZhbD1GQUxTRX0KaWRvbHMgJT4lIAogICMgVGhlc2UgZmlsdGVycyBhcmUgZ29vZCBmb3IgdGVzdGluZyBob3cgaXQgcmVzcG9uZHMgdG8geS1heGlzIGNoYW5nZXMgYW5kIHgtYXhpcyBkaW1lbnNpb25zCiAgI2ZpbHRlcih0aW1lc3RhbXBQT1NJWCA+IHN0cnB0aW1lKCIyMDIxLTA2LTI1IDAyOjAwOjAxIiwgZm9ybWF0ID0gIiVGICVUIikgJgogICMgICAgICAgICB0aW1lc3RhbXBQT1NJWCA8IHN0cnB0aW1lKCIyMDIxLTA2LTI5IDAyOjAwOjAxIiwgZm9ybWF0ID0gIiVGICVUIikpICU+JSAKICBtdXRhdGUodGltZXN0YW1wX2ZjdCA9IGFzLmZhY3Rvcih0aW1lc3RhbXApLAogICAgICAgICBwb3NpdGlvbl9mY3QgPSBhcy5mYWN0b3IocG9zaXRpb24pKSAlPiUgCiAgZ3JvdXBfYnkodGltZXN0YW1wUE9TSVgpICU+JSAKICBzdW1tYXJpc2UodG90YWwgPSBzdW0oZURlbnNpdHkpKSAlPiUgCiAgZnVsbF9qb2luKGlkb2xzICU+JSAKICAgICAgICAgICAgICAjIFNhbWUgYXMgYWJvdmUuCiAgICAgICAgICAgICAgI2ZpbHRlcih0aW1lc3RhbXBQT1NJWCA+IHN0cnB0aW1lKCIyMDIxLTA2LTI1IDAyOjAwOjAxIiwgZm9ybWF0ID0gIiVGICVUIikgJgogICAgICAgICAgICAgICMgICAgICAgICB0aW1lc3RhbXBQT1NJWCA8IHN0cnB0aW1lKCIyMDIxLTA2LTI5IDAyOjAwOjAxIiwgZm9ybWF0ID0gIiVGICVUIikpICU+JQogICAgICAgICAgICAgIG11dGF0ZSh0aW1lc3RhbXBfZmN0ID0gYXMuZmFjdG9yKHRpbWVzdGFtcCksCiAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uX2ZjdCA9IGFzLmZhY3Rvcihwb3NpdGlvbikpLAogICAgICAgICAgICBieSA9ICJ0aW1lc3RhbXBQT1NJWCIpICU+JSAKICAjIEp1c3QgdG8ga2VlcCB0aGUgbmFtZXMgY29uc2lzdGVudCBhY3Jvc3MgYWxsIHRpbWVwb2ludHMKICBtdXRhdGUocGxheWVyX25hbWUgPSBjYXNlX3doZW4ocGxheWVyID09ICItLWF0LWVtYSAtbGVtLWYteW8iIH4gIkFuYXRoZW1hIEVsZW1lZmF5byIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXllciA9PSAiQi1ieSBEby1sZSIgfiAiQmFieSBEb3lsZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXllciA9PSAiQ29tLWlzc2lvbmVyIFYtcG9yIiB+ICJDb21taXNzaW9uZXIgVmFwb3IiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5ZXIgPT0gIkNvbW1pc3Npb25lciBWLXBvciIgfiAiQ29tbWlzc2lvbmVyIFZhcG9yIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxheWVyID09ICItby0gTWl0LWhlbC0iIH4gIkRvbiBNaXRjaGVsbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXllciA9PSAiLW8tIE1pdGNoZWwtIiB+ICJEb24gTWl0Y2hlbGwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5ZXIgPT0gIi1vLSBNaXRjaGVsbCIgfiAiRG9uIE1pdGNoZWxsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxheWVyID09ICItb24gTWl0Y2hlbGwiIH4gIkRvbiBNaXRjaGVsbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXllciA9PSAiLXVkLWV5IC11ZWxsZXIiIH4gIkR1ZGxleSBNdWVsbGVyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxheWVyID09ICItdWQtZXkgTXVlbGxlciIgfiAiRHVkbGV5IE11ZWxsZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5ZXIgPT0gIkR1ZC1leSBNdWVsbGVyIiB+ICJEdWRsZXkgTXVlbGxlciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXllciA9PSAiRHVkbGV5IE11ZWxsZS0iIH4gIkR1ZGxleSBNdWVsbGVyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxheWVyID09ICJEdWQtZXkgTXVlbGxlciIgfiAiRHVkbGV5IE11ZWxsZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5ZXIgPT0gIkR1ZGxleSBNdWVsbGUtIiB+ICJEdWRsZXkgTXVlbGxlciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXllciA9PSAiRy1hIEhvbGItLS1rIiB+ICJHaWEgSG9sYnJvb2siLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5ZXIgPT0gIkctYSBIb2xiLS1vayIgfiAiR2lhIEhvbGJyb29rIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxheWVyID09ICJHLWEgSG9sYnItb2siIH4gIkdpYSBIb2xicm9vayIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXllciA9PSAiSC10LWllLWQgUy16LWtpIiB+ICJIYXRmaWVsZCBTdXp1a2kiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5ZXIgPT0gIkoteG8tIEItYy0tZXkiIH4gIkpheG9uIEJ1Y2tsZXkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5ZXIgPT0gIkoteG8tIEItY2stZXkiIH4gIkpheG9uIEJ1Y2tsZXkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5ZXIgPT0gIkoteG9uIEItY2stZXkiIH4gIkpheG9uIEJ1Y2tsZXkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5ZXIgPT0gIkoteC1uIEItY2stLXkiIH4gIkpheG9uIEJ1Y2tsZXkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5ZXIgPT0gIkoteC1uIEItY2tsLXkiIH4gIkpheG9uIEJ1Y2tsZXkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5ZXIgPT0gIkoteC1uIEJ1Y2tsLXkiIH4gIkpheG9uIEJ1Y2tsZXkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5ZXIgPT0gIkoteC1uIEJ1Y2tsZXkiIH4gIkpheG9uIEJ1Y2tsZXkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5ZXIgPT0gIkpheC1uIEJ1Y2tsZXkiIH4gIkpheG9uIEJ1Y2tsZXkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5ZXIgPT0gIkpheG9uIEItY2stZXkiIH4gIkpheG9uIEJ1Y2tsZXkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5ZXIgPT0gIkpheG9uIEJ1Y2stZXkiIH4gIkpheG9uIEJ1Y2tsZXkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5ZXIgPT0gIktuaWdodCBUcml1LXBoYW50IiB+ICJLbmlnaHQgVHJpdW1waGFudCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXllciA9PSAiTWFsaWsgRGVzdC1ueSIgfiAiTWFsaWsgRGVzdGlueSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXllciA9PSAiTWktYSAtZW1tYSIgfiAiTWlyYSBMZW1tYSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXllciA9PSAiTWlyYSAtZW1tYSIgfiAiTWlyYSBMZW1tYSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXllciA9PSAiUC11LWEgLS1ybi1wIiB+ICJQYXVsYSBUdXJuaXAiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5ZXIgPT0gIlAtdS1hIC0tcm5pcCIgfiAiUGF1bGEgVHVybmlwIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxheWVyID09ICJQYXUtYSAtdXJuaXAiIH4gIlBhdWxhIFR1cm5pcCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXllciA9PSAiUGktY2hpbmcgLWFjLS1uZSIgfiAiUGl0Y2hpbmcgTWFjaGluZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXllciA9PSAiUi1nLS0gLS1pZS1yLS0tIiB+ICJSaWdieSBGcmllZHJpY2giLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5ZXIgPT0gIlQtb21hLSBEcmFjLWVuYSIgfiAiVGhvbWFzIERyYWNhZW5hIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxheWVyID09ICJUaG9tYS0gRHJhYy1lbmEiIH4gIlRob21hcyBEcmFjYWVuYSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXllciA9PSAiVGhvbWFzIERyYWMtZW5hIiB+ICJUaG9tYXMgRHJhY2FlbmEiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5ZXIgPT0gIi0tbi0tLSBDYXJ2ZS0iIH4gIlNhbmRpZSBDYXJ2ZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFIH4gcGxheWVyKSkgJT4lIAogIGdyb3VwX2J5KHRpbWVzdGFtcFBPU0lYLCBwb3NpdGlvbl9mY3QsIHBsYXllcl9uYW1lKSAlPiUgCiAgc3VtbWFyaXNlKHBlcmNlbnQgPSBlRGVuc2l0eS90b3RhbCwKICAgICAgICAgICAgYWJzX3BlcmNlbnQgPSBhYnMoZURlbnNpdHkpL3RvdGFsKSAlPiUgCiAgbXV0YXRlKGxvZ19wZXJjZW50ID0gY2FzZV93aGVuKGFic19wZXJjZW50ID09IDAgfiAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYnNfcGVyY2VudCA+IDAgfiBsb2coYWJzX3BlcmNlbnQpKzYpLAogICAgICAgICBwbGF5ZXJfcG9zaXRpb24gPSBwYXN0ZTAoIiAiLCBhcy5jaGFyYWN0ZXIocG9zaXRpb25fZmN0KSwgIjogIiwgcGxheWVyX25hbWUpKSAlPiUgCiAgIyBQbG90IGJlZ2lucyBoZXJlCiAgZ2dwbG90KGFlcyh4ID0gdGltZXN0YW1wUE9TSVgsIAogICAgICAgICAgICAgeSA9IHBlcmNlbnQsCiAgICAgICAgICAgICBjb2xvdXIgPSBwb3NpdGlvbl9mY3QpKSArCiAgdGhlbWVfYncoKSArCiAgdmlyaWRpczo6c2NhbGVfZmlsbF92aXJpZGlzKG9wdGlvbiA9ICJwbGFzbWEiLCBkaXNjcmV0ZSA9IFRSVUUpICsKICB2aXJpZGlzOjpzY2FsZV9jb2xvdXJfdmlyaWRpcyhvcHRpb24gPSAicGxhc21hIiwgZGlzY3JldGUgPSBUUlVFKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IHNjYWxlczo6cGVyY2VudF9mb3JtYXQoKSkgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsIHZqdXN0ID0gMC41LCBoanVzdD0xKSwKICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICsKICAjIExheWVyIDEgKGZvciBhbmltYXRpb24pCiAgZ2VvbV9wb2ludChhZXMoI2dyb3VwID0gcGxheWVyX3Bvc2l0aW9uLAogICAgICAgICAgICAgICAgIHNpemUgPSBwZXJjZW50KSwKICAgICAgICAgICAgIHBvc2l0aW9uID0gInN0YWNrIiwKICAgICAgICAgICAgIHN0YXQgPSAiaWRlbnRpdHkiLAogICAgICAgICAgICAgYWxwaGEgPSAuNSkgKwogICMgTGF5ZXIgMiAodG8gYmUgZXhjbHVkZWQgZnJvbSBhbmltYXRpb24ncyBzaGFkb3cvdHJhY2UpCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IHBsYXllcl9wb3NpdGlvbiwKICAgICAgICAgICAgICAgIHNpemUgPSBsb2dfcGVyY2VudCksCiAgICAgICAgICAgIHN0YXQgPSAiaWRlbnRpdHkiLAogICAgICAgICAgICBwb3NpdGlvbiA9ICJzdGFjayIsCiAgICAgICAgICAgIGNoZWNrX292ZXJsYXAgPSBGQUxTRSwgCiAgICAgICAgICAgIGhqdXN0ID0gMCkgKwogIGdndGl0bGUoIiIpIC0+IHEKYGBgCgpOZXh0LCBhbmltYXRlIHRoZSBwbG90LCB3aGljaCB3aWxsIGluaXRpYWxseSBjb21waWxlIGFzIGEgZ2lmLCBidXQgb25seSB3aXRoIDEwMCBmcmFtZXMgKGZvciBub3cpLgoKYGBge3IgYW5pbWF0ZTIsIGV2YWw9RkFMU0V9CnEgKyB0cmFuc2l0aW9uX3N0YXRlcyh0aW1lc3RhbXBQT1NJWCwKICAgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25fbGVuZ3RoID0gMTAsCiAgICAgICAgICAgICAgICAgICAgICBzdGF0ZV9sZW5ndGggPSAxKSArCiAgZWFzZV9hZXMoImN1YmljLWluIikgKwogIHZpZXdfZm9sbG93KGZpeGVkX3ggPSBUUlVFKSArCiAgbGFicyh0aXRsZSA9ICdJZG9sIEJvYXJkIGF0IHtjbG9zZXN0X3N0YXRlfScpICsgCiAgc2hhZG93X3RyYWlsKGRpc3RhbmNlID0gMSwKICAgICAgICAgICAgICAgZXhjbHVkZV9sYXllciA9IDIpICsgCiAgc2hhZG93X21hcmsoYWxwaGEgPSAuMDUsCiAgICAgICAgICAgICAgZXhjbHVkZV9sYXllciA9IDIpICsKICBlbnRlcl9mYWRlKCkgKyBleGl0X2ZhZGUoKSAtPiBxMQpgYGAKCkZpbmFsbHksIHJlbmRlciBpdCBhcyBhIHZpZGVvIGFuZCBzYXZlIGl0IChhbHRob3VnaCBJIHN0aWxsIG5lZWRlZCB0byBjb252ZXJ0IHRvIC5tNHYgdXNpbmcgW1ZMQ10oaHR0cHM6Ly93d3cudmlkZW9sYW4ub3JnLykgYW5kIHRoZW4gdHJhbnNjb2RlIHRvIC5tcDQgdXNpbmcgW0hhbmRCcmFrZV0oaHR0cHM6Ly9oYW5kYnJha2UuZnIvKSkuCgpgYGB7ciByZW5kZXIyLCBldmFsPUZBTFNFfQphbmltYXRlKHExLCAKICAgICAgICBuZnJhbWVzID0gNjAwMCwKICAgICAgICBmcHMgPSAzMCwKICAgICAgICByZW5kZXJlciA9IGF2X3JlbmRlcmVyKCksCiAgICAgICAgZGV0YWlsID0gMywKICAgICAgICB3aWR0aCA9IDE5MjAsCiAgICAgICAgaGVpZ2h0ID0gMTA4MCkKI2FuaW1fc2F2ZSgiMjAyMTA3MjUtYmlnX3ZpZCIpCmBgYAoKQW5kLCBpZiBhbGwgZ29lcyB3ZWxsLCBhbmQgeW91IGhhdmUgbG90cyBvZiB0aW1lIGFuZCBzdWZmaWNpZW50IGNvbXB1dGluZyBwb3dlciwgeW91IGdldCBzb21ldGhpbmcgbGlrZSB0aGlzOgoKPHZpZGVvIHdpZHRoPSI5MDAiIGNvbnRyb2xzPgogIDxzb3VyY2Ugc3JjPSIyMDIxMDcyNS1iaWdfdmlkLm1wNCIgdHlwZT0idmlkZW8vbXA0Ij4KPC92aWRlbz4K