library(tidyverse)
library(arrow)
library(gt)
library(ggrepel)
library(scales)
# This file holds ONLY the three exhibits used in the written piece. The full
# analytical workbook lives in 2026_wk01_review.Rmd -- that is where the story
# gets found; this is where it gets published.
source("../R/04_storyline_engine.R")
source("../R/05_viz_style.R")

TEAM   <- "Syracuse"
SEASON <- params$season
WEEK   <- params$week

FIG_DIR <- sprintf("figures/%d_wk%02d_story", SEASON, WEEK)
hist <- read_parquet("~/cfb-data/processed/team_game_metrics.parquet")
cur  <- read_parquet("~/cfb-data/processed/team_game_metrics_2026.parquet")

fbs_teams <- unique(hist$team[hist$is_fbs_matchup])

# The reference class: FBS teams playing FCS opponents, all seasons on record.
ref <- hist |>
  filter(team %in% fbs_teams, !is_fbs_matchup, !low_volume,
         is.finite(off_avg_start_ytg))

# This week's peer group: the same situation, the same weekend.
peers <- cur |>
  filter(team %in% fbs_teams, !low_volume, !is_fbs_matchup, week == WEEK)

su <- peers |> filter(team == TEAM)

# Helper: yards-to-goal reads as field position for a general audience.
as_field_pos <- function(ytg) sprintf("own %.1f", 100 - ytg)

n_seasons <- dplyr::n_distinct(ref$season)
su_rank   <- rank(ref$off_avg_start_ytg)[0]  # placeholder, computed below
su_rank   <- rank(peers$off_avg_start_ytg)[peers$team == TEAM]

Exhibit 1 — The historical baseline

q <- quantile(ref$off_avg_start_ytg, c(0.10, 0.50), na.rm = TRUE)

# Computed, not hardcoded, so the projection can never drift out of sync with
# the table around it.
proj <- build_expectations(hist, TEAM, SEASON - 1, fbs_only = FALSE) |>
  filter(metric == "off_avg_start_ytg")
proj_expected <- mean(c(proj$proj_form, proj$proj_own), na.rm = TRUE)

tibble::tibble(
  Measure = c(
    sprintf("Typical FBS team vs an FCS opponent (median of %s games)",
            format(nrow(ref), big.mark = ",")),
    "\"Notable\" bar, set before kickoff (top 10%)",
    sprintf("%s — projected before the game", TEAM),
    sprintf("%s — actual", TEAM)
  ),
  `Yards to goal` = c(q[[2]], q[[1]], proj_expected, su$off_avg_start_ytg),
) |>
  mutate(`Field position` = as_field_pos(`Yards to goal`)) |>
  gt() |>
  tab_header(
    title = md("**Syracuse started 13 yards closer to the end zone than a typical FBS team does against an FCS opponent**"),
    subtitle = md(sprintf(
      "Average drive start | %d seasons of FBS-vs-FCS matchups (%d–%d), %s team-games",
      n_seasons, min(ref$season), max(ref$season),
      format(nrow(ref), big.mark = ",")))
  ) |>
  fmt_number(columns = `Yards to goal`, decimals = 1) |>
  cols_align("center", columns = -Measure) |>
  cols_align("left", columns = Measure) |>
  tab_style(
    style = list(cell_fill(color = "#FFF3E6"), cell_text(weight = "bold")),
    locations = cells_body(rows = grepl("actual", Measure))
  ) |>
  tab_source_note(md(paste0(
    "**", su_caption("2026 Week 1 | Syracuse vs New Hampshire"),
    "** — lower yards-to-goal means better field position."))) |>
  gt_theme_su()
Syracuse started 13 yards closer to the end zone than a typical FBS team does against an FCS opponent
Average drive start | 12 seasons of FBS-vs-FCS matchups (2014–2025), 1,332 team-games
Measure Yards to goal Field position
Typical FBS team vs an FCS opponent (median of 1,332 games) 66.6 own 33.4
"Notable" bar, set before kickoff (top 10%) 58.1 own 41.9
Syracuse — projected before the game 66.4 own 33.6
Syracuse — actual 53.5 own 46.5
Data: CollegeFootballData via cfbfastR | 2026 Week 1 | Syracuse vs New Hampshire — lower yards-to-goal means better field position.

Exhibit 2 — Third of 47 this week

fp <- peers |>
  mutate(is_su = team == TEAM) |>
  arrange(off_avg_start_ytg) |>
  mutate(team = factor(team, levels = team))

p_fieldpos <- ggplot(fp, aes(x = off_avg_start_ytg, y = team, color = is_su)) +
  geom_vline(xintercept = median(fp$off_avg_start_ytg), linetype = "dashed",
             color = SU$muted, linewidth = 0.4) +
  geom_point(aes(size = is_su)) +
  ggrepel::geom_text_repel(
    data = filter(fp, is_su),
    aes(label = sprintf("%s — %.1f yards to goal\n(own %.1f)",
                        team, off_avg_start_ytg, 100 - off_avg_start_ytg)),
    nudge_x = 2, nudge_y=2, size = 3.5, fontface = "bold", segment.color = NA,
    lineheight = 0.95
  ) +
  scale_color_manual(values = c(`FALSE` = SU$muted, `TRUE` = SU$orange), guide = "none") +
  scale_size_manual(values = c(`FALSE` = 2, `TRUE` = 4), guide = "none") +
  scale_x_reverse() +
  labs(
    title = sprintf("%s had the %s-best starting field position of any FBS team facing an FCS opponent in Week 1",
                    TEAM, scales::ordinal(su_rank)),
    subtitle = sprintf(
      "Average drive start, yards to goal — further right is better | %d comparable teams | Dashed line = group median",
      nrow(fp)),
    x = "Average yards to goal at drive start", y = NULL,
    caption = su_caption("2026 Week 1 | FBS teams facing FCS opponents")
  ) +
  theme_su(legend_pos = "none") +
  theme(axis.text.y = element_text(size = 8))

save_fig(p_fieldpos, "field_position_vs_peers", height = 6.5)

Exhibit 3 — What each starting position produced

raw_wk <- sprintf("~/cfb-data/raw/pbp_inseason/pbp_%d_wk%02d.parquet", SEASON, WEEK)

drives <- read_parquet(raw_wk) |>
  filter(pos_team == TEAM) |>
  group_by(drive_id) |>
  summarise(start_ytg = first(drive_start_yards_to_goal),
            pts = first(drive_pts), .groups = "drop") |>
  filter(!is.na(start_ytg), !is.na(pts))

drives |>
  mutate(bucket = case_when(
    start_ytg <= 50 ~ "1",
    start_ytg <= 65 ~ "2",
    TRUE            ~ "3"
  )) |>
  group_by(bucket) |>
  summarise(Drives = n(), Points = sum(pts), .groups = "drop") |>
  mutate(
    `Starting field position` = c(
      "New Hampshire's side of midfield",
      "Own 35 to midfield",
      "Inside own 35"
    )[as.integer(bucket)],
    `Points per drive` = Points / Drives
  ) |>
  select(`Starting field position`, Drives, Points, `Points per drive`) |>
  gt() |>
  tab_header(
    title = md("**Short fields produced the most points, but the offense scored from everywhere**"),
    subtitle = md(sprintf(
      "%s offensive drives only | %d drives, %d points | Not split by score margin or time of game",
      TEAM, nrow(drives), sum(drives$pts)))
  ) |>
  fmt_number(columns = `Points per drive`, decimals = 2) |>
  cols_align("center", columns = -`Starting field position`) |>
  cols_align("left", columns = `Starting field position`) |>
  tab_style(style = cell_text(weight = "bold"),
            locations = cells_body(columns = `Starting field position`)) |>
  data_color(columns = Points, method = "numeric", palette = SU_SEQ) |>
  tab_source_note(md(paste0(
    "**", su_caption("2026 Week 1 | Syracuse vs New Hampshire"),
    "** — excludes the fumble-return touchdown and the safety, which were not offensive drives."))) |>
  gt_theme_su()
Short fields produced the most points, but the offense scored from everywhere
Syracuse offensive drives only | 15 drives, 54 points | Not split by score margin or time of game
Starting field position Drives Points Points per drive
New Hampshire's side of midfield 6 26 4.33
Own 35 to midfield 3 17 5.67
Inside own 35 6 11 1.83
Data: CollegeFootballData via cfbfastR | 2026 Week 1 | Syracuse vs New Hampshire — excludes the fumble-return touchdown and the safety, which were not offensive drives.

Figures written to disk

figs <- list.files(FIG_DIR, pattern = "\\.png$", full.names = TRUE)
if (length(figs) == 0) {
  cat("No figures written.\n")
} else {
  cat("300-dpi PNGs ready to drop into the piece:\n\n")
  for (f in figs) cat("  ", f, "  (", round(file.info(f)$size / 1024), " KB)\n", sep = "")
  cat("\nThe two gt tables render above; screenshot them from this page, or\n")
  cat("install webshot2 to export them as images automatically.\n")
}
## 300-dpi PNGs ready to drop into the piece:
## 
##   figures/2026_wk01_story/field_position_vs_peers.png  (278 KB)
## 
## The two gt tables render above; screenshot them from this page, or
## install webshot2 to export them as images automatically.
LS0tCnRpdGxlOiAiRmllbGQgUG9zaXRpb24gYW5kIHRoZSBTeXJhY3VzZSBXaW4iCnN1YnRpdGxlOiAiV2VlayAxIDIwMjYg4oCUIGV4aGliaXRzIGZvciBwdWJsaWNhdGlvbiIKYXV0aG9yOiAiQ2hyaXMgSmltZW5leiIKZGF0ZTogImByIGZvcm1hdChTeXMuRGF0ZSgpLCAnJUIgJWQsICVZJylgIgpwYXJhbXM6CiAgc2Vhc29uOiAyMDI2CiAgd2VlazogMQpvdXRwdXQ6CiAgaHRtbF9kb2N1bWVudDoKICAgIHRoZW1lOiBmbGF0bHkKICAgIGhpZ2hsaWdodDogemVuYnVybgogICAgY29kZV9mb2xkaW5nOiBoaWRlCiAgICB0b2M6IHllcwogICAgdG9jX2Zsb2F0OiB5ZXMKICAgIGRmX3ByaW50OiBwYWdlZAogICAgY29kZV9kb3dubG9hZDogeWVzCi0tLQoKYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9CiMgRU5DT0RJTkc6IGEgc2hlbGwgd2l0aCBubyBMQU5HIHNldCBzdGFydHMgUiBpbiB0aGUgQyAvIFVTLUFTQ0lJIGxvY2FsZSwgYW5kCiMgZ3QgYW5kIGdncGxvdCB0aGVuIEVTQ0FQRSBldmVyeSBub24tQVNDSUkgY2hhcmFjdGVyIC0tIGVtIGRhc2hlcyBjb21lIG91dCBhcwojIGEgbGl0ZXJhbCAiPFUrMjAxND4iIGluIHRoZSByZW5kZXJlZCBvdXRwdXQuIEZvcmNpbmcgVVRGLTggaGVyZSBrZWVwcwojIHR5cG9ncmFwaGljIGNoYXJhY3RlcnMgaW50YWN0LCB3aGljaCBtYXR0ZXJzIGZvciBwdWJsaWNhdGlvbi1yZWFkeSBleGhpYml0cy4KZm9yIChsb2MgaW4gYygiZW5fVVMuVVRGLTgiLCAiQy5VVEYtOCIsICJVVEYtOCIpKSB7CiAgaWYgKG56Y2hhcihzdXBwcmVzc1dhcm5pbmdzKFN5cy5zZXRsb2NhbGUoIkxDX0FMTCIsIGxvYykpKSkgYnJlYWsKfQoKa25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFLCBtZXNzYWdlID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRSwKICAgICAgICAgICAgICAgICAgICAgIGZpZy53aWR0aCA9IDEwLCBmaWcuaGVpZ2h0ID0gNiwgZHBpID0gMTUwKQpgYGAKCmBgYHtyIGxpYnJhcmllc30KbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkoYXJyb3cpCmxpYnJhcnkoZ3QpCmxpYnJhcnkoZ2dyZXBlbCkKbGlicmFyeShzY2FsZXMpCmBgYAoKYGBge3Igc3R5bGV9CiMgVGhpcyBmaWxlIGhvbGRzIE9OTFkgdGhlIHRocmVlIGV4aGliaXRzIHVzZWQgaW4gdGhlIHdyaXR0ZW4gcGllY2UuIFRoZSBmdWxsCiMgYW5hbHl0aWNhbCB3b3JrYm9vayBsaXZlcyBpbiAyMDI2X3drMDFfcmV2aWV3LlJtZCAtLSB0aGF0IGlzIHdoZXJlIHRoZSBzdG9yeQojIGdldHMgZm91bmQ7IHRoaXMgaXMgd2hlcmUgaXQgZ2V0cyBwdWJsaXNoZWQuCnNvdXJjZSgiLi4vUi8wNF9zdG9yeWxpbmVfZW5naW5lLlIiKQpzb3VyY2UoIi4uL1IvMDVfdml6X3N0eWxlLlIiKQoKVEVBTSAgIDwtICJTeXJhY3VzZSIKU0VBU09OIDwtIHBhcmFtcyRzZWFzb24KV0VFSyAgIDwtIHBhcmFtcyR3ZWVrCgpGSUdfRElSIDwtIHNwcmludGYoImZpZ3VyZXMvJWRfd2slMDJkX3N0b3J5IiwgU0VBU09OLCBXRUVLKQpgYGAKCmBgYHtyIGRhdGF9Cmhpc3QgPC0gcmVhZF9wYXJxdWV0KCJ+L2NmYi1kYXRhL3Byb2Nlc3NlZC90ZWFtX2dhbWVfbWV0cmljcy5wYXJxdWV0IikKY3VyICA8LSByZWFkX3BhcnF1ZXQoIn4vY2ZiLWRhdGEvcHJvY2Vzc2VkL3RlYW1fZ2FtZV9tZXRyaWNzXzIwMjYucGFycXVldCIpCgpmYnNfdGVhbXMgPC0gdW5pcXVlKGhpc3QkdGVhbVtoaXN0JGlzX2Zic19tYXRjaHVwXSkKCiMgVGhlIHJlZmVyZW5jZSBjbGFzczogRkJTIHRlYW1zIHBsYXlpbmcgRkNTIG9wcG9uZW50cywgYWxsIHNlYXNvbnMgb24gcmVjb3JkLgpyZWYgPC0gaGlzdCB8PgogIGZpbHRlcih0ZWFtICVpbiUgZmJzX3RlYW1zLCAhaXNfZmJzX21hdGNodXAsICFsb3dfdm9sdW1lLAogICAgICAgICBpcy5maW5pdGUob2ZmX2F2Z19zdGFydF95dGcpKQoKIyBUaGlzIHdlZWsncyBwZWVyIGdyb3VwOiB0aGUgc2FtZSBzaXR1YXRpb24sIHRoZSBzYW1lIHdlZWtlbmQuCnBlZXJzIDwtIGN1ciB8PgogIGZpbHRlcih0ZWFtICVpbiUgZmJzX3RlYW1zLCAhbG93X3ZvbHVtZSwgIWlzX2Zic19tYXRjaHVwLCB3ZWVrID09IFdFRUspCgpzdSA8LSBwZWVycyB8PiBmaWx0ZXIodGVhbSA9PSBURUFNKQoKIyBIZWxwZXI6IHlhcmRzLXRvLWdvYWwgcmVhZHMgYXMgZmllbGQgcG9zaXRpb24gZm9yIGEgZ2VuZXJhbCBhdWRpZW5jZS4KYXNfZmllbGRfcG9zIDwtIGZ1bmN0aW9uKHl0Zykgc3ByaW50Zigib3duICUuMWYiLCAxMDAgLSB5dGcpCgpuX3NlYXNvbnMgPC0gZHBseXI6Om5fZGlzdGluY3QocmVmJHNlYXNvbikKc3VfcmFuayAgIDwtIHJhbmsocmVmJG9mZl9hdmdfc3RhcnRfeXRnKVswXSAgIyBwbGFjZWhvbGRlciwgY29tcHV0ZWQgYmVsb3cKc3VfcmFuayAgIDwtIHJhbmsocGVlcnMkb2ZmX2F2Z19zdGFydF95dGcpW3BlZXJzJHRlYW0gPT0gVEVBTV0KYGBgCgojIyBFeGhpYml0IDEg4oCUIFRoZSBoaXN0b3JpY2FsIGJhc2VsaW5lCgpgYGB7ciBleGhpYml0LTF9CnEgPC0gcXVhbnRpbGUocmVmJG9mZl9hdmdfc3RhcnRfeXRnLCBjKDAuMTAsIDAuNTApLCBuYS5ybSA9IFRSVUUpCgojIENvbXB1dGVkLCBub3QgaGFyZGNvZGVkLCBzbyB0aGUgcHJvamVjdGlvbiBjYW4gbmV2ZXIgZHJpZnQgb3V0IG9mIHN5bmMgd2l0aAojIHRoZSB0YWJsZSBhcm91bmQgaXQuCnByb2ogPC0gYnVpbGRfZXhwZWN0YXRpb25zKGhpc3QsIFRFQU0sIFNFQVNPTiAtIDEsIGZic19vbmx5ID0gRkFMU0UpIHw+CiAgZmlsdGVyKG1ldHJpYyA9PSAib2ZmX2F2Z19zdGFydF95dGciKQpwcm9qX2V4cGVjdGVkIDwtIG1lYW4oYyhwcm9qJHByb2pfZm9ybSwgcHJvaiRwcm9qX293biksIG5hLnJtID0gVFJVRSkKCnRpYmJsZTo6dGliYmxlKAogIE1lYXN1cmUgPSBjKAogICAgc3ByaW50ZigiVHlwaWNhbCBGQlMgdGVhbSB2cyBhbiBGQ1Mgb3Bwb25lbnQgKG1lZGlhbiBvZiAlcyBnYW1lcykiLAogICAgICAgICAgICBmb3JtYXQobnJvdyhyZWYpLCBiaWcubWFyayA9ICIsIikpLAogICAgIlwiTm90YWJsZVwiIGJhciwgc2V0IGJlZm9yZSBraWNrb2ZmICh0b3AgMTAlKSIsCiAgICBzcHJpbnRmKCIlcyDigJQgcHJvamVjdGVkIGJlZm9yZSB0aGUgZ2FtZSIsIFRFQU0pLAogICAgc3ByaW50ZigiJXMg4oCUIGFjdHVhbCIsIFRFQU0pCiAgKSwKICBgWWFyZHMgdG8gZ29hbGAgPSBjKHFbWzJdXSwgcVtbMV1dLCBwcm9qX2V4cGVjdGVkLCBzdSRvZmZfYXZnX3N0YXJ0X3l0ZyksCikgfD4KICBtdXRhdGUoYEZpZWxkIHBvc2l0aW9uYCA9IGFzX2ZpZWxkX3BvcyhgWWFyZHMgdG8gZ29hbGApKSB8PgogIGd0KCkgfD4KICB0YWJfaGVhZGVyKAogICAgdGl0bGUgPSBtZCgiKipTeXJhY3VzZSBzdGFydGVkIDEzIHlhcmRzIGNsb3NlciB0byB0aGUgZW5kIHpvbmUgdGhhbiBhIHR5cGljYWwgRkJTIHRlYW0gZG9lcyBhZ2FpbnN0IGFuIEZDUyBvcHBvbmVudCoqIiksCiAgICBzdWJ0aXRsZSA9IG1kKHNwcmludGYoCiAgICAgICJBdmVyYWdlIGRyaXZlIHN0YXJ0IHwgJWQgc2Vhc29ucyBvZiBGQlMtdnMtRkNTIG1hdGNodXBzICglZOKAkyVkKSwgJXMgdGVhbS1nYW1lcyIsCiAgICAgIG5fc2Vhc29ucywgbWluKHJlZiRzZWFzb24pLCBtYXgocmVmJHNlYXNvbiksCiAgICAgIGZvcm1hdChucm93KHJlZiksIGJpZy5tYXJrID0gIiwiKSkpCiAgKSB8PgogIGZtdF9udW1iZXIoY29sdW1ucyA9IGBZYXJkcyB0byBnb2FsYCwgZGVjaW1hbHMgPSAxKSB8PgogIGNvbHNfYWxpZ24oImNlbnRlciIsIGNvbHVtbnMgPSAtTWVhc3VyZSkgfD4KICBjb2xzX2FsaWduKCJsZWZ0IiwgY29sdW1ucyA9IE1lYXN1cmUpIHw+CiAgdGFiX3N0eWxlKAogICAgc3R5bGUgPSBsaXN0KGNlbGxfZmlsbChjb2xvciA9ICIjRkZGM0U2IiksIGNlbGxfdGV4dCh3ZWlnaHQgPSAiYm9sZCIpKSwKICAgIGxvY2F0aW9ucyA9IGNlbGxzX2JvZHkocm93cyA9IGdyZXBsKCJhY3R1YWwiLCBNZWFzdXJlKSkKICApIHw+CiAgdGFiX3NvdXJjZV9ub3RlKG1kKHBhc3RlMCgKICAgICIqKiIsIHN1X2NhcHRpb24oIjIwMjYgV2VlayAxIHwgU3lyYWN1c2UgdnMgTmV3IEhhbXBzaGlyZSIpLAogICAgIioqIOKAlCBsb3dlciB5YXJkcy10by1nb2FsIG1lYW5zIGJldHRlciBmaWVsZCBwb3NpdGlvbi4iKSkpIHw+CiAgZ3RfdGhlbWVfc3UoKQpgYGAKCiMjIEV4aGliaXQgMiDigJQgVGhpcmQgb2YgNDcgdGhpcyB3ZWVrCgpgYGB7ciBleGhpYml0LTIsIGZpZy5hc3AgPSAwLjYyfQpmcCA8LSBwZWVycyB8PgogIG11dGF0ZShpc19zdSA9IHRlYW0gPT0gVEVBTSkgfD4KICBhcnJhbmdlKG9mZl9hdmdfc3RhcnRfeXRnKSB8PgogIG11dGF0ZSh0ZWFtID0gZmFjdG9yKHRlYW0sIGxldmVscyA9IHRlYW0pKQoKcF9maWVsZHBvcyA8LSBnZ3Bsb3QoZnAsIGFlcyh4ID0gb2ZmX2F2Z19zdGFydF95dGcsIHkgPSB0ZWFtLCBjb2xvciA9IGlzX3N1KSkgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IG1lZGlhbihmcCRvZmZfYXZnX3N0YXJ0X3l0ZyksIGxpbmV0eXBlID0gImRhc2hlZCIsCiAgICAgICAgICAgICBjb2xvciA9IFNVJG11dGVkLCBsaW5ld2lkdGggPSAwLjQpICsKICBnZW9tX3BvaW50KGFlcyhzaXplID0gaXNfc3UpKSArCiAgZ2dyZXBlbDo6Z2VvbV90ZXh0X3JlcGVsKAogICAgZGF0YSA9IGZpbHRlcihmcCwgaXNfc3UpLAogICAgYWVzKGxhYmVsID0gc3ByaW50ZigiJXMg4oCUICUuMWYgeWFyZHMgdG8gZ29hbFxuKG93biAlLjFmKSIsCiAgICAgICAgICAgICAgICAgICAgICAgIHRlYW0sIG9mZl9hdmdfc3RhcnRfeXRnLCAxMDAgLSBvZmZfYXZnX3N0YXJ0X3l0ZykpLAogICAgbnVkZ2VfeCA9IDIsIG51ZGdlX3k9Miwgc2l6ZSA9IDMuNSwgZm9udGZhY2UgPSAiYm9sZCIsIHNlZ21lbnQuY29sb3IgPSBOQSwKICAgIGxpbmVoZWlnaHQgPSAwLjk1CiAgKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoYEZBTFNFYCA9IFNVJG11dGVkLCBgVFJVRWAgPSBTVSRvcmFuZ2UpLCBndWlkZSA9ICJub25lIikgKwogIHNjYWxlX3NpemVfbWFudWFsKHZhbHVlcyA9IGMoYEZBTFNFYCA9IDIsIGBUUlVFYCA9IDQpLCBndWlkZSA9ICJub25lIikgKwogIHNjYWxlX3hfcmV2ZXJzZSgpICsKICBsYWJzKAogICAgdGl0bGUgPSBzcHJpbnRmKCIlcyBoYWQgdGhlICVzLWJlc3Qgc3RhcnRpbmcgZmllbGQgcG9zaXRpb24gb2YgYW55IEZCUyB0ZWFtIGZhY2luZyBhbiBGQ1Mgb3Bwb25lbnQgaW4gV2VlayAxIiwKICAgICAgICAgICAgICAgICAgICBURUFNLCBzY2FsZXM6Om9yZGluYWwoc3VfcmFuaykpLAogICAgc3VidGl0bGUgPSBzcHJpbnRmKAogICAgICAiQXZlcmFnZSBkcml2ZSBzdGFydCwgeWFyZHMgdG8gZ29hbCDigJQgZnVydGhlciByaWdodCBpcyBiZXR0ZXIgfCAlZCBjb21wYXJhYmxlIHRlYW1zIHwgRGFzaGVkIGxpbmUgPSBncm91cCBtZWRpYW4iLAogICAgICBucm93KGZwKSksCiAgICB4ID0gIkF2ZXJhZ2UgeWFyZHMgdG8gZ29hbCBhdCBkcml2ZSBzdGFydCIsIHkgPSBOVUxMLAogICAgY2FwdGlvbiA9IHN1X2NhcHRpb24oIjIwMjYgV2VlayAxIHwgRkJTIHRlYW1zIGZhY2luZyBGQ1Mgb3Bwb25lbnRzIikKICApICsKICB0aGVtZV9zdShsZWdlbmRfcG9zID0gIm5vbmUiKSArCiAgdGhlbWUoYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDgpKQoKc2F2ZV9maWcocF9maWVsZHBvcywgImZpZWxkX3Bvc2l0aW9uX3ZzX3BlZXJzIiwgaGVpZ2h0ID0gNi41KQpgYGAKCiMjIEV4aGliaXQgMyDigJQgV2hhdCBlYWNoIHN0YXJ0aW5nIHBvc2l0aW9uIHByb2R1Y2VkCgpgYGB7ciBleGhpYml0LTN9CnJhd193ayA8LSBzcHJpbnRmKCJ+L2NmYi1kYXRhL3Jhdy9wYnBfaW5zZWFzb24vcGJwXyVkX3drJTAyZC5wYXJxdWV0IiwgU0VBU09OLCBXRUVLKQoKZHJpdmVzIDwtIHJlYWRfcGFycXVldChyYXdfd2spIHw+CiAgZmlsdGVyKHBvc190ZWFtID09IFRFQU0pIHw+CiAgZ3JvdXBfYnkoZHJpdmVfaWQpIHw+CiAgc3VtbWFyaXNlKHN0YXJ0X3l0ZyA9IGZpcnN0KGRyaXZlX3N0YXJ0X3lhcmRzX3RvX2dvYWwpLAogICAgICAgICAgICBwdHMgPSBmaXJzdChkcml2ZV9wdHMpLCAuZ3JvdXBzID0gImRyb3AiKSB8PgogIGZpbHRlcighaXMubmEoc3RhcnRfeXRnKSwgIWlzLm5hKHB0cykpCgpkcml2ZXMgfD4KICBtdXRhdGUoYnVja2V0ID0gY2FzZV93aGVuKAogICAgc3RhcnRfeXRnIDw9IDUwIH4gIjEiLAogICAgc3RhcnRfeXRnIDw9IDY1IH4gIjIiLAogICAgVFJVRSAgICAgICAgICAgIH4gIjMiCiAgKSkgfD4KICBncm91cF9ieShidWNrZXQpIHw+CiAgc3VtbWFyaXNlKERyaXZlcyA9IG4oKSwgUG9pbnRzID0gc3VtKHB0cyksIC5ncm91cHMgPSAiZHJvcCIpIHw+CiAgbXV0YXRlKAogICAgYFN0YXJ0aW5nIGZpZWxkIHBvc2l0aW9uYCA9IGMoCiAgICAgICJOZXcgSGFtcHNoaXJlJ3Mgc2lkZSBvZiBtaWRmaWVsZCIsCiAgICAgICJPd24gMzUgdG8gbWlkZmllbGQiLAogICAgICAiSW5zaWRlIG93biAzNSIKICAgIClbYXMuaW50ZWdlcihidWNrZXQpXSwKICAgIGBQb2ludHMgcGVyIGRyaXZlYCA9IFBvaW50cyAvIERyaXZlcwogICkgfD4KICBzZWxlY3QoYFN0YXJ0aW5nIGZpZWxkIHBvc2l0aW9uYCwgRHJpdmVzLCBQb2ludHMsIGBQb2ludHMgcGVyIGRyaXZlYCkgfD4KICBndCgpIHw+CiAgdGFiX2hlYWRlcigKICAgIHRpdGxlID0gbWQoIioqU2hvcnQgZmllbGRzIHByb2R1Y2VkIHRoZSBtb3N0IHBvaW50cywgYnV0IHRoZSBvZmZlbnNlIHNjb3JlZCBmcm9tIGV2ZXJ5d2hlcmUqKiIpLAogICAgc3VidGl0bGUgPSBtZChzcHJpbnRmKAogICAgICAiJXMgb2ZmZW5zaXZlIGRyaXZlcyBvbmx5IHwgJWQgZHJpdmVzLCAlZCBwb2ludHMgfCBOb3Qgc3BsaXQgYnkgc2NvcmUgbWFyZ2luIG9yIHRpbWUgb2YgZ2FtZSIsCiAgICAgIFRFQU0sIG5yb3coZHJpdmVzKSwgc3VtKGRyaXZlcyRwdHMpKSkKICApIHw+CiAgZm10X251bWJlcihjb2x1bW5zID0gYFBvaW50cyBwZXIgZHJpdmVgLCBkZWNpbWFscyA9IDIpIHw+CiAgY29sc19hbGlnbigiY2VudGVyIiwgY29sdW1ucyA9IC1gU3RhcnRpbmcgZmllbGQgcG9zaXRpb25gKSB8PgogIGNvbHNfYWxpZ24oImxlZnQiLCBjb2x1bW5zID0gYFN0YXJ0aW5nIGZpZWxkIHBvc2l0aW9uYCkgfD4KICB0YWJfc3R5bGUoc3R5bGUgPSBjZWxsX3RleHQod2VpZ2h0ID0gImJvbGQiKSwKICAgICAgICAgICAgbG9jYXRpb25zID0gY2VsbHNfYm9keShjb2x1bW5zID0gYFN0YXJ0aW5nIGZpZWxkIHBvc2l0aW9uYCkpIHw+CiAgZGF0YV9jb2xvcihjb2x1bW5zID0gUG9pbnRzLCBtZXRob2QgPSAibnVtZXJpYyIsIHBhbGV0dGUgPSBTVV9TRVEpIHw+CiAgdGFiX3NvdXJjZV9ub3RlKG1kKHBhc3RlMCgKICAgICIqKiIsIHN1X2NhcHRpb24oIjIwMjYgV2VlayAxIHwgU3lyYWN1c2UgdnMgTmV3IEhhbXBzaGlyZSIpLAogICAgIioqIOKAlCBleGNsdWRlcyB0aGUgZnVtYmxlLXJldHVybiB0b3VjaGRvd24gYW5kIHRoZSBzYWZldHksIHdoaWNoIHdlcmUgbm90IG9mZmVuc2l2ZSBkcml2ZXMuIikpKSB8PgogIGd0X3RoZW1lX3N1KCkKYGBgCgojIyBGaWd1cmVzIHdyaXR0ZW4gdG8gZGlzawoKYGBge3IgbWFuaWZlc3R9CmZpZ3MgPC0gbGlzdC5maWxlcyhGSUdfRElSLCBwYXR0ZXJuID0gIlxcLnBuZyQiLCBmdWxsLm5hbWVzID0gVFJVRSkKaWYgKGxlbmd0aChmaWdzKSA9PSAwKSB7CiAgY2F0KCJObyBmaWd1cmVzIHdyaXR0ZW4uXG4iKQp9IGVsc2UgewogIGNhdCgiMzAwLWRwaSBQTkdzIHJlYWR5IHRvIGRyb3AgaW50byB0aGUgcGllY2U6XG5cbiIpCiAgZm9yIChmIGluIGZpZ3MpIGNhdCgiICAiLCBmLCAiICAoIiwgcm91bmQoZmlsZS5pbmZvKGYpJHNpemUgLyAxMDI0KSwgIiBLQilcbiIsIHNlcCA9ICIiKQogIGNhdCgiXG5UaGUgdHdvIGd0IHRhYmxlcyByZW5kZXIgYWJvdmU7IHNjcmVlbnNob3QgdGhlbSBmcm9tIHRoaXMgcGFnZSwgb3JcbiIpCiAgY2F0KCJpbnN0YWxsIHdlYnNob3QyIHRvIGV4cG9ydCB0aGVtIGFzIGltYWdlcyBhdXRvbWF0aWNhbGx5LlxuIikKfQpgYGAK