The categorizations are based on https://unstats.un.org/unsd/gender/timeuse/23012019%20ICATUS.pdf

1 Average sleep over the ages

timeuse_df %>%
  filter(activity == "Sleep", age < 90) %>%
  group_by(person_id, age, mult) %>%
  summarise(total_sleep_mins = sum(duration_mins, na.rm = TRUE),
            .groups = 'drop') %>% group_by(age) %>%
  summarise(avg_sleep_weighted_mins = weighted.mean(total_sleep_mins, w = mult, na.rm = TRUE)) %>%
  mutate(avg_sleep_hours = avg_sleep_weighted_mins / 60) %>%
  ggplot(aes(x = age, y = avg_sleep_hours)) +
  geom_smooth(
    method = "loess",
    se = TRUE,
    color = "black",
    fill = "gray80"
  ) +
  #geom_line()+
  scale_y_continuous(limits = c(8, 13), breaks = seq(8, 13, by = 1)) +
  scale_x_continuous(breaks = seq(0, 90, by = 10), limits = c(6, 95)) +
    labs(
    title = "Average Daily Sleep Declines Through Adolescence",
    x = "Age",
    y = "Average Sleep (hours per day)",
    caption = "Source: MoSPI Time Use Survey, 2024"
  ) +
    theme_fivethirtyeight() +
    theme(
    text = element_text(family = "ath"),
    plot.title = element_text(
      family = "ath",
      face = "bold",
      size = 18,
      margin = margin(b = 20)
    ),
    plot.caption = element_text(
      family = "ath",
      size = 10,
      color = "gray50"
    ),
    axis.title = element_text(family = "ath", size = 12),
    axis.title.y = element_text(margin = margin(r = 15)),
    axis.title.x = element_text(margin = margin(t = 15)),
    axis.text.y = element_text(
      family = "ath",
      size = 12,
      margin = margin(r = 8)
    ),
    axis.text.x = element_text(
      family = "ath",
      size = 12,
      margin = margin(t = 8)
    ),
    
    panel.grid.major = element_line(linewidth = 0.5, color = "gray90"),
    panel.grid.minor = element_blank()
  )
## `geom_smooth()` using formula = 'y ~ x'

1.1 Difference in activities by gender

all_persons <- timeuse_df %>%
  distinct(person_id, gender, mult)

person_activity_summary <- timeuse_df %>%
  filter(!is.na(activity) & activity != "Unclassified") %>%
  group_by(person_id, activity) %>%
  summarise(total_duration_mins = sum(duration_mins, na.rm = TRUE), .groups = 'drop')

gender_summary <- all_persons %>%
  tidyr::crossing(activity = unique(person_activity_summary$activity)) %>%
  left_join(person_activity_summary, by = c("person_id", "activity")) %>%
  mutate(total_duration_mins = ifelse(is.na(total_duration_mins), 0, total_duration_mins)) %>%
  group_by(gender, activity) %>%
  summarise(
    avg_hours_per_person = weighted.mean(total_duration_mins, w = mult, na.rm = TRUE) / 60,
    .groups = 'drop'
  )

gender_summary_wide <- gender_summary %>%
  pivot_wider(names_from = gender, values_from = avg_hours_per_person) %>%
  mutate(gap = female - male) %>%
  slice_max(order_by = abs(gap), n = 15) %>%
  mutate(activity = fct_reorder(activity, gap))

ggplot(gender_summary_wide, aes(y = activity)) +
  geom_segment(aes(x = male, xend = female), color = "gray", linewidth = 1.5, alpha = 0.5) +
  geom_point(aes(x = female, color = "Female"), size = 4) +
  geom_point(aes(x = male, color = "Male"), size = 4) +
  
  theme_fivethirtyeight() +
  scale_color_manual(name = "", values = c("Female" = "#0072B2", "Male" = "#D55E00")) +
  labs(
    title = "Unpaid Work Accounts for the Largest Gender Gap in Time Use",
    subtitle = "Comparing the average daily hours for men and women",
    x = "Average Hours Per Day (per person)",
    y = "",
    caption = "Source: MoSPI Time Use Survey, 2024"
  ) +
    theme(
    text = element_text(family = "ath"),
    plot.title = element_text(family = "ath", size = 16, margin = margin(b = 10, l = -130)),
    plot.subtitle = element_text(family = "ath", size = 14, margin = margin(b = 20, l = -130), color = "gray40"),
    plot.caption = element_text(family = "ath", size = 10, color = "gray50", margin = margin(t = 20)),
    axis.title = element_text(family = "ath", size = 12),
    axis.text = element_text(family = "ath", size = 11),
    plot.margin = margin(15, 50, 10, 0),
    
    legend.position = "top",
    legend.direction = "horizontal", 
    legend.background = element_rect(fill = "transparent"),
    legend.key = element_rect(fill = "transparent", color = NA), 
    legend.title = element_blank(), 
    legend.text = element_text(size = 10, family = "ath")
  )

all_persons_sector <- timeuse_df %>%
  distinct(person_id, sector, mult)

person_activity_summary_sector <- timeuse_df %>%
  filter(!is.na(activity) & activity != "Unclassified") %>%
  group_by(person_id, activity) %>%
  summarise(total_duration_mins = sum(duration_mins, na.rm = TRUE), .groups = 'drop')

sector_summary <- all_persons_sector %>%
  tidyr::crossing(activity = unique(person_activity_summary_sector$activity)) %>%
  left_join(person_activity_summary_sector, by = c("person_id", "activity")) %>%
  mutate(total_duration_mins = ifelse(is.na(total_duration_mins), 0, total_duration_mins)) %>%
  group_by(sector, activity) %>%
  summarise(
    avg_hours_per_person = weighted.mean(total_duration_mins, w = mult, na.rm = TRUE) / 60,
    .groups = 'drop'
  )

sector_summary_wide <- sector_summary %>%
  pivot_wider(names_from = sector, values_from = avg_hours_per_person) %>%
  mutate(gap = Urban - Rural) %>%
  slice_max(order_by = abs(gap), n = 15) %>%
  mutate(activity = fct_reorder(activity, gap))

ggplot(sector_summary_wide, aes(y = activity)) +
  geom_segment(aes(x = Rural, xend = Urban), color = "gray", linewidth = 1.5, alpha = 0.5) +
  geom_point(aes(x = Urban, color = "Urban"), size = 4) +
  geom_point(aes(x = Rural, color = "Rural"), size = 4) +
  
  theme_fivethirtyeight() +
  scale_color_manual(name = "", values = c("Urban" = "#0072B2", "Rural" = "#D55E00")) +
  
  labs(
    title = "Rural-Urban Divide in Daily Time Use",
    subtitle = "Comparing daily hours for the 15 activities with the largest urban-rural disparities",
    x = "Average Hours Per Day (per person)",
    y = "",
    caption = "Source: MoSPI Time Use Survey, 2024"
  ) +
  
  theme(
    text = element_text(family = "ath"),
    plot.title = element_text(family = "ath", size = 20, margin = margin(b = 10)),
    plot.subtitle = element_text(family = "ath", size = 14, margin = margin(b = 20), color = "gray40"),
    plot.caption = element_text(family = "ath", size = 10, color = "gray50", margin = margin(t = 20)),
    axis.title = element_text(family = "ath", size = 12),
    axis.text = element_text(family = "ath", size = 11),
    plot.margin = margin(15, 15, 10, 15),
    
    legend.position = "top",
    legend.direction = "horizontal", 
    legend.background = element_rect(fill = "transparent"),
    legend.key = element_rect(fill = "transparent", color = NA), 
    legend.title = element_blank(), 
    legend.text = element_text(size = 14, family = "ath")
  )

2 Activity strips by age groups

high_level_summary <- timeuse_df %>%
  filter(!is.na(activity) & activity != "Unclassified") %>%
  mutate(
    activity_group = case_when(
      activity == "Sleep" ~ "Sleep",
      activity %in% c("Eating & Drinking", "Personal Hygiene & Health", "Receiving Care") ~ "Personal Care",
      activity %in% c(
        "Formal Employment",
        "Household Enterprise (Goods)",
        "Household Enterprise (Services)",
        "Work-Related Training",
        "Seeking Employment",
        "Setting up a Business"
      ) ~ "Paid Work",
      activity %in% c(
        "Food & Meal Management",
        "Cleaning & Maintenance",
        "Childcare & Instruction",
        "Shopping",
        "Agriculture & Fishing (Own-Use)",
        "Community Volunteering",
        "Direct Volunteering"
      ) ~ "Unpaid Work & Care",
      activity %in% c("Formal Education", "Homework", "Additional Study") ~ "Learning",
      # Group all leisure, social, and travel into one bucket for this high-level view
      TRUE ~ "Leisure, Social & Travel"
    )
  )

age_group_summary <- high_level_summary %>%
  mutate(age_group = cut(
    age,
    breaks = c(5, 14, 24, 59, Inf),
    labels = c(
      "Children (6-14)",
      "Youth (15-24)",
      "Adults (25-59)",
      "Seniors (60+)"
    ),
    right = TRUE,
    include.lowest = TRUE
  )) %>%
  filter(!is.na(age_group)) %>%
  group_by(person_id, age_group, activity_group, mult) %>%
  summarise(total_duration = sum(duration_mins, na.rm = TRUE),
            .groups = "drop") %>%
  group_by(age_group, activity_group) %>%
  summarise(avg_hours = weighted.mean(total_duration, w = mult, na.rm = TRUE) / 60,
            .groups = "drop")

stacking_order <- c(
  "Sleep",
  "Personal Care",
  "Paid Work",
  "Unpaid Work & Care",
  "Learning",
  "Leisure, Social & Travel"
)

age_group_summary$activity_group <- factor(age_group_summary$activity_group, levels = stacking_order)


ggplot(age_group_summary,
       aes(x = age_group, y = avg_hours, fill = activity_group)) +
  geom_col(position = "fill", colour = "transparent") +
  scale_y_continuous(labels = scales::percent) +
  
  scale_fill_brewer(palette = "Dark2", name = "") +
  labs(
    title = "Share of a 24-hour day spent on major activities, by age group",
    x = "",
    y = "Percentage of Day",
    caption = "Source: MoSPI Time Use Survey, 2024"
  ) +
  theme_fivethirtyeight() +
  
  theme(
    text = element_text(family = "ath"),
    plot.title = element_text(
      family = "ath",
      size = 20,
      margin = margin(b = 10)
    ),
    plot.subtitle = element_text(
      family = "ath",
      size = 14,
      margin = margin(b = 20),
      color = "gray40"
    ),
    plot.caption = element_text(
      family = "ath",
      size = 10,
      color = "gray50",
      margin = margin(t = 20)
    ),
    axis.title = element_text(family = "ath", size = 12),
    axis.text = element_text(family = "ath", size = 11),
    plot.margin = margin(15, 15, 10, 15),
    
    legend.position = "bottom",
    legend.direction = "horizontal",
    legend.background = element_rect(fill = "transparent"),
    legend.key = element_rect(fill = "transparent", color = NA),
    legend.title = element_blank(),
    legend.text = element_text(size = 14, family = "ath")
  )

3 Time use on key activities in children and youth

“children” are defined as persons under 15 years of age, and “youth” are defined as those aged 15–24.

youth_activities <- c(
  "Formal Education", "Homework", 
  "Food & Meal Management", "Cleaning & Maintenance", "Childcare & Instruction",
  "Mass Media", "Sports & Exercise", "Hobbies & Games",
  "Socializing & Communication"
  )

youth_summary <- timeuse_df %>%
  filter(age >= 6 & age <= 24, activity %in% youth_activities, gender %in% c('male', 'female')) %>%
  group_by(person_id, age, gender, activity, mult) %>%
  summarise(total_duration = sum(duration_mins, na.rm = TRUE), .groups = "drop") %>%
  group_by(age, gender, activity) %>%
  summarise(avg_hours = weighted.mean(total_duration, w = mult, na.rm = TRUE) / 60, .groups = "drop")

ggplot(youth_summary, aes(x = age, y = avg_hours, color = gender)) +
  geom_smooth(se = FALSE, size = 1.2) +
  facet_wrap(~ activity, scales = "free", ncol = 3) + 
  
  scale_color_manual(name = "Gender", values = c("female" = "#0072B2", "male" = "#D55E00")) +
  labs(
    title = "Average daily hours spent on key activities for ages 6-24, by gender",
    x = "Age (years)",
    y = "Average Hours Per Day",
    caption = "Source: MoSPI Time Use Survey, 2024"
  ) +
  theme_minimal(base_family = "ath") +
  theme(
    plot.title = element_text(face = "bold", size = 20, margin = margin(b = 10)),
    plot.subtitle = element_text(size = 14, color = "gray40", margin = margin(b = 20)),
    strip.text = element_text(face = "bold", size = 11, hjust = 0),
    legend.position = "top",
    panel.spacing = unit(1.5, "lines")
  ) +
theme_fivethirtyeight() +
  
  theme(
    text = element_text(family = "ath"),
    plot.title = element_text(
      family = "ath",
      size = 20,
      margin = margin(b = 10)
    ),
    plot.subtitle = element_text(
      family = "ath",
      size = 14,
      margin = margin(b = 20),
      color = "gray40"
    ),
    plot.caption = element_text(
      family = "ath",
      size = 10,
      color = "gray50",
      margin = margin(t = 20)
    ),
    axis.title = element_text(family = "ath", size = 12),
    axis.text = element_text(family = "ath", size = 11),
    plot.margin = margin(15, 15, 10, 15),
    
    legend.position = "bottom",
    legend.direction = "horizontal",
    legend.background = element_rect(fill = "transparent"),
    legend.key = element_rect(fill = "transparent", color = NA),
    legend.title = element_blank(),
    legend.text = element_text(size = 14, family = "ath")
  )
## Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
## ℹ Please use `linewidth` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
## `geom_smooth()` using method = 'loess' and formula = 'y ~ x'

LS0tCnRpdGxlOiAiVGltZSBVc2UgQW5hbHlzaXMiCm91dHB1dDoKICBodG1sX2RvY3VtZW50OgogICAgdGhlbWU6IHJlYWRhYmxlCiAgICBoaWdobGlnaHQ6IHRhbmdvCiAgICB0b2M6IHRydWUKICAgIHRvY19kZXB0aDogMwogICAgdG9jX2Zsb2F0OgogICAgICBjb2xsYXBzZWQ6IGZhbHNlCiAgICAgIHNtb290aF9zY3JvbGw6IHRydWUKICAgIGNvZGVfZm9sZGluZzogc2hvdwogICAgY29kZV9kb3dubG9hZDogdHJ1ZQogICAgZGZfcHJpbnQ6IHBhZ2VkCiAgICBudW1iZXJfc2VjdGlvbnM6IHRydWUKICAgIGZpZ193aWR0aDogMTAKICAgIGZpZ19oZWlnaHQ6IDYKICAgIGZpZ19jYXB0aW9uOiB0cnVlCiAgICBzZWxmX2NvbnRhaW5lZDogdHJ1ZQogICAga2VlcF9tZDogZmFsc2UKZWRpdG9yX29wdGlvbnM6CiAgY2h1bmtfb3V0cHV0X3R5cGU6IGNvbnNvbGUKLS0tCgpUaGUgY2F0ZWdvcml6YXRpb25zIGFyZSBiYXNlZCBvbiBodHRwczovL3Vuc3RhdHMudW4ub3JnL3Vuc2QvZ2VuZGVyL3RpbWV1c2UvMjMwMTIwMTklMjBJQ0FUVVMucGRmCgpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0KCmxpYnJhcnkoYXJyb3cpCmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KGhyYnJ0aGVtZXMpCmxpYnJhcnkoc2hvd3RleHQpCmxpYnJhcnkoc3RyaW5ncikKbGlicmFyeShnZ3RleHQpCmxpYnJhcnkoZ2x1ZSkKbGlicmFyeShnZ3RoZW1lcykKCmZvbnRfYWRkX2dvb2dsZSgiQXRraW5zb24gSHlwZXJsZWdpYmxlIiwgImF0aCIpCnNob3d0ZXh0X2F1dG8oKQoKCnRyeUNhdGNoKHsKICB0aW1ldXNlX2RmIDwtIGFycm93OjpyZWFkX3BhcnF1ZXQoInRpbWV1c2UucGFycXVldCIpCiAgcHJpbnQoIlN1Y2Nlc3NmdWxseSBsb2FkZWQgdGhlIHRpbWV1c2UucGFycXVldCBmaWxlLiIpCiAgcHJpbnQoaGVhZCh0aW1ldXNlX2RmKSkKfSwgZXJyb3IgPSBmdW5jdGlvbihlKSB7CiAgcHJpbnQoCiAgICAiRXJyb3IgbG9hZGluZyBwYXJxdWV0IGZpbGUuIE1ha2Ugc3VyZSB0aGUgZmlsZSAndGltZXVzZS5wYXJxdWV0JyBpcyBpbiB5b3VyIHdvcmtpbmcgZGlyZWN0b3J5LiIKICApCiAgcHJpbnQoZSkKfSkKCmNhbGN1bGF0ZV9kdXJhdGlvbiA8LSBmdW5jdGlvbihkZikgewogIGRmICU+JQogICAgbXV0YXRlKAogICAgICBzdGFydF9zZWNzID0gbHVicmlkYXRlOjpwZXJpb2RfdG9fc2Vjb25kcyhsdWJyaWRhdGU6OmhtKHRpbWVfZnJvbSkpLAogICAgICBlbmRfc2VjcyA9IGx1YnJpZGF0ZTo6cGVyaW9kX3RvX3NlY29uZHMobHVicmlkYXRlOjpobSh0aW1lX3RvKSksCiAgICAgIAogICAgICBkdXJhdGlvbl9taW5zID0gKGVuZF9zZWNzIC0gc3RhcnRfc2VjcykgLyA2MCwKICAgICAgZHVyYXRpb25fbWlucyA9IGlmZWxzZShkdXJhdGlvbl9taW5zIDwgMCwgZHVyYXRpb25fbWlucyArIDE0NDAsIGR1cmF0aW9uX21pbnMpICMgMTQ0MCBtaW51dGVzIGluIGEgZGF5CiAgICApCn0KCnRpbWV1c2VfZGYgPC0gY2FsY3VsYXRlX2R1cmF0aW9uKHRpbWV1c2VfZGYpCgp0aW1ldXNlX2RmIDwtIHRpbWV1c2VfZGYgJT4lCiAgbXV0YXRlKAogICAgYWN0aXZpdHkgPSBjYXNlX3doZW4oCiAgICAgICMgLS0tIDE6IEVtcGxveW1lbnQgYW5kIHJlbGF0ZWQgYWN0aXZpdGllcyAtLS0KICAgICAgYWN0aXZpdHlfY29kZSAlaW4lIGMoCiAgICAgICAgIkVtcGxveW1lbnQgaW4gY29ycG9yYXRpb25zLCBnb3Zlcm5tZW50IGFuZCBub24tcHJvZml0IGluc3RpdHV0aW9ucyIKICAgICAgKSB+ICJGb3JtYWwgRW1wbG95bWVudCIsCiAgICAgIGFjdGl2aXR5X2NvZGUgJWluJSBjKAogICAgICAgICJHcm93aW5nIG9mIGNyb3BzIGZvciB0aGUgbWFya2V0IGluIGhvdXNlaG9sZCBlbnRlcnByaXNlcyIsCiAgICAgICAgIlJhaXNpbmcgYW5pbWFscyBmb3IgdGhlIG1hcmtldCBpbiBob3VzZWhvbGQgZW50ZXJwcmlzZXMiLAogICAgICAgICJGb3Jlc3RyeSBhbmQgbG9nZ2luZyBmb3IgdGhlIG1hcmtldCBpbiBob3VzZWhvbGQgZW50ZXJwcmlzZXMiLAogICAgICAgICJGaXNoaW5nIGZvciB0aGUgbWFya2V0IGluIGhvdXNlaG9sZCBlbnRlcnByaXNlcyIsCiAgICAgICAgIkFxdWFjdWx0dXJlIGZvciB0aGUgbWFya2V0IGluIGhvdXNlaG9sZCBlbnRlcnByaXNlcyIsCiAgICAgICAgIk1pbmluZyBhbmQgcXVhcnJ5aW5nIGZvciB0aGUgbWFya2V0IGluIGhvdXNlaG9sZCBlbnRlcnByaXNlcyIsCiAgICAgICAgIk1ha2luZyBhbmQgcHJvY2Vzc2luZyBnb29kcyBmb3IgdGhlIG1hcmtldCBpbiBob3VzZWhvbGQgZW50ZXJwcmlzZXMiLAogICAgICAgICJDb25zdHJ1Y3Rpb24gYWN0aXZpdGllcyBmb3IgdGhlIG1hcmtldCBpbiBob3VzZWhvbGQgZW50ZXJwcmlzZXMiLAogICAgICAgICJPdGhlciBhY3Rpdml0aWVzIHJlbGF0ZWQgdG8gZW1wbG95bWVudCBpbiBob3VzZWhvbGQgZW50ZXJwcmlzZXMgdG8gcHJvZHVjZSBnb29kcyIKICAgICAgKSB+ICJIb3VzZWhvbGQgRW50ZXJwcmlzZSAoR29vZHMpIiwKICAgICAgYWN0aXZpdHlfY29kZSAlaW4lIGMoCiAgICAgICAgIlZlbmRpbmcgYW5kIHRyYWRpbmcgb2YgZ29vZHMgaW4gaG91c2Vob2xkIGVudGVycHJpc2VzIiwKICAgICAgICAiUHJvdmlkaW5nIHBhaWQgcmVwYWlyLCBpbnN0YWxsYXRpb24sIG1haW50ZW5hbmNlIGFuZCBkaXNwb3NhbCBpbiBob3VzZWhvbGQgZW50ZXJwcmlzZXMiLAogICAgICAgICJQcm92aWRpbmcgcGFpZCBidXNpbmVzcyBhbmQgcHJvZmVzc2lvbmFsIHNlcnZpY2VzIGluIGhvdXNlaG9sZCBlbnRlcnByaXNlcyIsCiAgICAgICAgIlRyYW5zcG9ydGluZyBnb29kcyBhbmQgcGFzc2VuZ2VycyBmb3IgcGF5IG9yIHByb2ZpdCBpbiBob3VzZWhvbGQgZW50ZXJwcmlzZXMiLAogICAgICAgICJQcm92aWRpbmcgcGFpZCBwZXJzb25hbCBjYXJlIHNlcnZpY2VzIGluIGhvdXNlaG9sZCBlbnRlcnByaXNlcyIsCiAgICAgICAgIlByb3ZpZGluZyBwYWlkIGRvbWVzdGljIHNlcnZpY2VzIiwKICAgICAgICAiT3RoZXIgYWN0aXZpdGllcyByZWxhdGVkIHRvIGVtcGxveW1lbnQgaW4gaG91c2Vob2xkIGVudGVycHJpc2VzIHByb3ZpZGluZyBzZXJ2aWNlcyIKICAgICAgKSB+ICJIb3VzZWhvbGQgRW50ZXJwcmlzZSAoU2VydmljZXMpIiwKICAgICAgYWN0aXZpdHlfY29kZSAlaW4lIGMoCiAgICAgICAgIkFjdGl2aXRpZXMgYW5jaWxsYXJ5IHRvIGVtcGxveW1lbnQiLAogICAgICAgICJCcmVha3MgZHVyaW5nIHdvcmtpbmcgdGltZSB3aXRoaW4gZW1wbG95bWVudCIKICAgICAgKSB+ICJBbmNpbGxhcnkgJiBCcmVha3MgKFdvcmspIiwKICAgICAgYWN0aXZpdHlfY29kZSAlaW4lIGMoIlRyYWluaW5nIGFuZCBzdHVkaWVzIGluIHJlbGF0aW9uIHRvIGVtcGxveW1lbnQiKSB+ICJXb3JrLVJlbGF0ZWQgVHJhaW5pbmciLAogICAgICBhY3Rpdml0eV9jb2RlICVpbiUgYygiU2Vla2luZyBlbXBsb3ltZW50IikgfiAiU2Vla2luZyBFbXBsb3ltZW50IiwKICAgICAgYWN0aXZpdHlfY29kZSAlaW4lIGMoIlNldHRpbmcgdXAgYSBidXNpbmVzcyIpIH4gIlNldHRpbmcgdXAgYSBCdXNpbmVzcyIsCiAgICAgIGFjdGl2aXR5X2NvZGUgJWluJSBjKCJFbXBsb3ltZW50LXJlbGF0ZWQgdHJhdmVsIiwgIkNvbW11dGluZyIpIH4gIlRyYXZlbCAoV29yaykiLAogICAgICAKICAgICAgIyAtLS0gMjogUHJvZHVjdGlvbiBvZiBnb29kcyBmb3Igb3duIGZpbmFsIHVzZSAtLS0KICAgICAgYWN0aXZpdHlfY29kZSAlaW4lIGMoCiAgICAgICAgIkdyb3dpbmcgY3JvcHMgYW5kIGtpdGNoZW4gZ2FyZGVuaW5nLCBmb3Igb3duIGZpbmFsIHVzZSIsCiAgICAgICAgIkZhcm1pbmcgb2YgYW5pbWFscyBhbmQgcHJvZHVjdGlvbiBvZiBhbmltYWwgcHJvZHVjdHMgZm9yIG93biBmaW5hbCB1c2UiLAogICAgICAgICJIdW50aW5nLCB0cmFwcGluZyBhbmQgcHJvZHVjdGlvbiBvZiBhbmltYWwgc2tpbnMgZm9yIG93biBmaW5hbCB1c2UiLAogICAgICAgICJGb3Jlc3RyeSBhbmQgbG9nZ2luZyBmb3Igb3duIGZpbmFsIHVzZSIsCiAgICAgICAgIkdhdGhlcmluZyB3aWxkIHByb2R1Y3RzIGZvciBvd24gZmluYWwgdXNlIiwKICAgICAgICAiRmlzaGluZyBmb3Igb3duIGZpbmFsIHVzZSIsCiAgICAgICAgIkFxdWFjdWx0dXJlIGZvciBvd24gZmluYWwgdXNlIiwKICAgICAgICAiTWluaW5nIGFuZCBxdWFycnlpbmcgZm9yIG93biBmaW5hbCB1c2UiCiAgICAgICkgfiAiQWdyaWN1bHR1cmUgJiBGaXNoaW5nIChPd24tVXNlKSIsCiAgICAgIGFjdGl2aXR5X2NvZGUgJWluJSBjKAogICAgICAgICJNYWtpbmcsIHByb2Nlc3NpbmcgZm9vZCBwcm9kdWN0cywgYmV2ZXJhZ2VzIGFuZCB0b2JhY2NvIGZvciBvd24gZmluYWwgdXNlIiwKICAgICAgICAiTWFraW5nLCBwcm9jZXNzaW5nIHRleHRpbGVzLCB3ZWFyaW5nIGFwcGFyZWwsIGxlYXRoZXIgYW5kIHJlbGF0ZWQgcHJvZHVjdHMgZm9yIG93biBmaW5hbCB1c2UiLAogICAgICAgICJNYWtpbmcsIHByb2Nlc3Npbmcgb2Ygd29vZCBhbmQgYmFyayBwcm9kdWN0cyBmb3Igb3duIGZpbmFsIHVzZSIsCiAgICAgICAgIk1ha2luZywgcHJvY2Vzc2luZyBicmlja3MsIGNvbmNyZXRlIHNsYWJzLCBob2xsb3cgYmxvY2tzLCB0aWxlcyBmb3Igb3duIGZpbmFsIHVzZSIsCiAgICAgICAgIk1ha2luZywgcHJvY2Vzc2luZyBoZXJiYWwgYW5kIG1lZGljaW5hbCBwcmVwYXJhdGlvbnMgZm9yIG93biBmaW5hbCB1c2UiLAogICAgICAgICJNYWtpbmcsIHByb2Nlc3NpbmcgbWV0YWxzIGFuZCBtZXRhbCBwcm9kdWN0cyBmb3Igb3duIGZpbmFsIHVzZSIsCiAgICAgICAgIk1ha2luZywgcHJvY2Vzc2luZyBvZiBwcm9kdWN0cyB1c2luZyBvdGhlciBtYXRlcmlhbHMgZm9yIG93biBmaW5hbCB1c2UiLAogICAgICAgICJBY3F1aXJpbmcgc3VwcGxpZXMgYW5kIGRpc3Bvc2luZyBvZiBwcm9kdWN0cyBhbmQgb3RoZXIgYWN0aXZpdGllcyByZWxhdGVkIHRvIG1ha2luZyBhbmQgcHJvY2Vzc2luZyBnb29kcyBmb3Igb3duIGZpbmFsIHVzZSIKICAgICAgKSB+ICJQcm9jZXNzaW5nIEdvb2RzIChPd24tVXNlKSIsCiAgICAgIGFjdGl2aXR5X2NvZGUgJWluJSBjKCJDb25zdHJ1Y3Rpb24gYWN0aXZpdGllcyBmb3Igb3duIGZpbmFsIHVzZSIpIH4gIkNvbnN0cnVjdGlvbiAoT3duLVVzZSkiLAogICAgICBhY3Rpdml0eV9jb2RlICVpbiUgYygKICAgICAgICAiR2F0aGVyaW5nIGZpcmV3b29kIGFuZCBvdGhlciBuYXR1cmFsIHByb2R1Y3RzIHVzZWQgYXMgZnVlbCBmb3Igb3duIGZpbmFsIHVzZSIsCiAgICAgICAgIkZldGNoaW5nIHdhdGVyIGZyb20gbmF0dXJhbCBhbmQgb3RoZXIgc291cmNlcyBmb3Igb3duIGZpbmFsIHVzZSIKICAgICAgKSB+ICJDb2xsZWN0aW5nIFdhdGVyICYgRnVlbCAoT3duLVVzZSkiLAogICAgICBhY3Rpdml0eV9jb2RlICVpbiUgYygKICAgICAgICAiVHJhdmVsbGluZywgbW92aW5nLCB0cmFuc3BvcnRpbmcgb3IgYWNjb21wYW55aW5nIGdvb2RzIG9yIHBlcnNvbnMgcmVsYXRlZCB0byBvd24tdXNlIHByb2R1Y3Rpb24gb2YgZ29vZHMiCiAgICAgICkgfiAiVHJhdmVsIChPd24tVXNlIFByb2R1Y3Rpb24pIiwKICAgICAgCiAgICAgICMgLS0tIDM6IFVucGFpZCBkb21lc3RpYyBzZXJ2aWNlcyAtLS0KICAgICAgYWN0aXZpdHlfY29kZSAlaW4lIGMoCiAgICAgICAgIlByZXBhcmluZyBtZWFscy9zbmFja3MiLAogICAgICAgICJTZXJ2aW5nIG1lYWxzL3NuYWNrcyIsCiAgICAgICAgIkNsZWFuaW5nIHVwIGFmdGVyIGZvb2QgcHJlcGFyYXRpb24vbWVhbHMvc25hY2tzIiwKICAgICAgICAiU3RvcmluZywgYXJyYW5naW5nLCBwcmVzZXJ2aW5nIGZvb2Qgc3RvY2tzIiwKICAgICAgICAiT3RoZXIgYWN0aXZpdGllcyByZWxhdGVkIHRvIGZvb2QgYW5kIG1lYWxzIG1hbmFnZW1lbnQgYW5kIHByZXBhcmF0aW9uIgogICAgICApIH4gIkZvb2QgJiBNZWFsIE1hbmFnZW1lbnQiLAogICAgICBhY3Rpdml0eV9jb2RlICVpbiUgYygKICAgICAgICAiSW5kb29yIGNsZWFuaW5nIiwKICAgICAgICAiT3V0ZG9vciBjbGVhbmluZyIsCiAgICAgICAgIlJlY3ljbGluZyBhbmQgZGlzcG9zYWwgb2YgZ2FyYmFnZSIsCiAgICAgICAgIlVwa2VlcCBvZiBpbmRvb3Ivb3V0ZG9vciBwbGFudHMsIGhlZGdlcywgZ2FyZGVuLCBncm91bmRzLCBsYW5kc2NhcGUsIGV0Yy4iLAogICAgICAgICJUZW5kaW5nIGZ1cm5hY2UsIGJvaWxlciwgZmlyZXBsYWNlIGZvciBoZWF0aW5nIGFuZCB3YXRlciBzdXBwbHkiLAogICAgICAgICJPdGhlciBhY3Rpdml0aWVzIHJlbGF0ZWQgdG8gY2xlYW5pbmcgYW5kIHVwa2VlcCBvZiBkd2VsbGluZyBhbmQgc3Vycm91bmRpbmdzIgogICAgICApIH4gIkNsZWFuaW5nICYgTWFpbnRlbmFuY2UiLAogICAgICBhY3Rpdml0eV9jb2RlICVpbiUgYygKICAgICAgICAiRG8taXQteW91cnNlbGYgaW1wcm92ZW1lbnQsIG1haW50ZW5hbmNlIGFuZCByZXBhaXIgb2Ygb3duIGR3ZWxsaW5nIiwKICAgICAgICAiSW5zdGFsbGF0aW9uLCBzZXJ2aWNpbmcgYW5kIHJlcGFpciBvZiBwZXJzb25hbCBhbmQgaG91c2Vob2xkIGdvb2RzIGluY2x1ZGluZyBJQ1QgZXF1aXBtZW50IiwKICAgICAgICAiVmVoaWNsZSBtYWludGVuYW5jZSBhbmQgcmVwYWlycyIsCiAgICAgICAgIk90aGVyIGFjdGl2aXRpZXMgcmVsYXRlZCB0byBkby1pdC15b3Vyc2VsZiBkZWNvcmF0aW9uLCBtYWludGVuYW5jZSBhbmQgcmVwYWlyIgogICAgICApIH4gIkRJWSBNYWludGVuYW5jZSAmIFJlcGFpciIsCiAgICAgIGFjdGl2aXR5X2NvZGUgJWluJSBjKAogICAgICAgICJIYW5kL21hY2hpbmUtd2FzaGluZyIsCiAgICAgICAgIkRyeWluZyB0ZXh0aWxlcyBhbmQgY2xvdGhpbmciLAogICAgICAgICJJcm9uaW5nL3ByZXNzaW5nL2ZvbGRpbmciLAogICAgICAgICJNZW5kaW5nL3JlcGFpcmluZyBhbmQgY2FyZSBvZiBjbG90aGVzIGFuZCBzaG9lczsgY2xlYW5pbmcgYW5kIHBvbGlzaGluZyBzaG9lcyIsCiAgICAgICAgIk90aGVyIGFjdGl2aXRpZXMgcmVsYXRlZCB0byBjYXJlIG9mIHRleHRpbGVzIGFuZCBmb290d2VhciIKICAgICAgKSB+ICJUZXh0aWxlcyAmIEZvb3R3ZWFyIENhcmUiLAogICAgICBhY3Rpdml0eV9jb2RlICVpbiUgYygKICAgICAgICAiUGF5aW5nIGhvdXNlaG9sZCBiaWxscyIsCiAgICAgICAgIkJ1ZGdldGluZywgcGxhbm5pbmcsIG9yZ2FuaXppbmcgZHV0aWVzIGFuZCBhY3Rpdml0aWVzIGluIHRoZSBob3VzZWhvbGQiLAogICAgICAgICJPdGhlciBhY3Rpdml0aWVzIHJlbGF0ZWQgdG8gaG91c2Vob2xkIG1hbmFnZW1lbnQiCiAgICAgICkgfiAiSG91c2Vob2xkIE1hbmFnZW1lbnQiLAogICAgICBhY3Rpdml0eV9jb2RlICVpbiUgYygKICAgICAgICAiRGFpbHkgcGV0IGNhcmUiLAogICAgICAgICJVc2luZyB2ZXRlcmluYXJ5IGNhcmUgb3Igb3RoZXIgcGV0IGNhcmUgc2VydmljZXMgKGdyb29taW5nLCBzdGFibGluZywgaG9saWRheSBvciBkYXkgY2FyZSkiLAogICAgICAgICJPdGhlciBhY3Rpdml0aWVzIHJlbGF0ZWQgdG8gcGV0IGNhcmUiCiAgICAgICkgfiAiUGV0IENhcmUiLAogICAgICBhY3Rpdml0eV9jb2RlICVpbiUgYygKICAgICAgICAiU2hvcHBpbmcgZm9yL3B1cmNoYXNpbmcgb2YgZ29vZHMgYW5kIHJlbGF0ZWQgYWN0aXZpdGllcyIsCiAgICAgICAgIlNob3BwaW5nIGZvci9hdmFpbGluZyBvZiBzZXJ2aWNlcyBhbmQgcmVsYXRlZCBhY3Rpdml0eSIKICAgICAgKSB+ICJTaG9wcGluZyIsCiAgICAgIGFjdGl2aXR5X2NvZGUgJWluJSBjKAogICAgICAgICJUcmF2ZWxsaW5nLCBtb3ZpbmcsIHRyYW5zcG9ydGluZyBvciBhY2NvbXBhbnlpbmcgZ29vZHMgb3IgcGVyc29ucyByZWxhdGVkIHRvIHVucGFpZCBkb21lc3RpYyBzZXJ2aWNlcyBmb3IgaG91c2Vob2xkIG1lbWJlcnMiCiAgICAgICkgfiAiVHJhdmVsIChEb21lc3RpYyBTZXJ2aWNlcykiLAogICAgICBhY3Rpdml0eV9jb2RlICVpbiUgYygiT3RoZXIgdW5wYWlkIGRvbWVzdGljIHNlcnZpY2VzIGZvciBob3VzZWhvbGQgbWVtYmVycyIpIH4gIk90aGVyIERvbWVzdGljIFNlcnZpY2VzIiwKICAgICAgCiAgICAgICMgLS0tIDQ6IFVucGFpZCBjYXJlZ2l2aW5nIHNlcnZpY2VzIC0tLQogICAgICBhY3Rpdml0eV9jb2RlICVpbiUgYygKICAgICAgICAiQ2FyaW5nIGZvciBjaGlsZHJlbiBpbmNsdWRpbmcgZmVlZGluZywgY2xlYW5pbmcsIHBoeXNpY2FsIGNhcmUiLAogICAgICAgICJQcm92aWRpbmcgbWVkaWNhbCBjYXJlIHRvIGNoaWxkcmVuIiwKICAgICAgICAiSW5zdHJ1Y3RpbmcsIHRlYWNoaW5nLCB0cmFpbmluZywgaGVscGluZyBjaGlsZHJlbiIsCiAgICAgICAgIlRhbGtpbmcgd2l0aCBhbmQgcmVhZGluZyB0byBjaGlsZHJlbiIsCiAgICAgICAgIlBsYXlpbmcgYW5kIHNwb3J0cyB3aXRoIGNoaWxkcmVuIiwKICAgICAgICAiTWluZGluZyBjaGlsZHJlbiAocGFzc2l2ZSBjYXJlKSIsCiAgICAgICAgIk1lZXRpbmdzIGFuZCBhcnJhbmdlbWVudHMgd2l0aCBzY2hvb2xzIGFuZCBjaGlsZCBjYXJlIHNlcnZpY2UgcHJvdmlkZXJzIiwKICAgICAgICAiT3RoZXIgYWN0aXZpdGllcyByZWxhdGVkIHRvIGNoaWxkY2FyZSBhbmQgaW5zdHJ1Y3Rpb24iCiAgICAgICkgfiAiQ2hpbGRjYXJlICYgSW5zdHJ1Y3Rpb24iLAogICAgICBhY3Rpdml0eV9jb2RlICVpbiUgYygKICAgICAgICAiQXNzaXN0aW5nIGRlcGVuZGVudCBhZHVsdHMgd2l0aCB0YXNrcyBvZiBkYWlseSBsaXZpbmciLAogICAgICAgICJBc3Npc3RpbmcgZGVwZW5kZW50IGFkdWx0cyB3aXRoIG1lZGljYWwgY2FyZSIsCiAgICAgICAgIkFzc2lzdGluZyBkZXBlbmRlbnQgYWR1bHRzIHdpdGggZm9ybXMsIGFkbWluaXN0cmF0aW9uLCBhY2NvdW50cyIsCiAgICAgICAgIkFmZmVjdGl2ZS9lbW90aW9uYWwgc3VwcG9ydCBmb3IgZGVwZW5kZW50IGFkdWx0cyIsCiAgICAgICAgIlBhc3NpdmUgY2FyZSBvZiBkZXBlbmRlbnQgYWR1bHQiLAogICAgICAgICJNZWV0aW5ncyBhbmQgYXJyYW5nZW1lbnRzIHdpdGggYWR1bHQgY2FyZSBzZXJ2aWNlIHByb3ZpZGVycyIsCiAgICAgICAgIk90aGVyIGFjdGl2aXRpZXMgcmVsYXRlZCB0byBjYXJlIGZvciBkZXBlbmRlbnQgYWR1bHRzIgogICAgICApIH4gIkNhcmUgZm9yIERlcGVuZGVudCBBZHVsdHMiLAogICAgICBhY3Rpdml0eV9jb2RlICVpbiUgYygKICAgICAgICAiRmVlZGluZywgY2xlYW5pbmcsIHBoeXNpY2FsIGNhcmUgZm9yIG5vbi1kZXBlbmRlbnQgYWR1bHQgaG91c2Vob2xkIG1lbWJlcnMgaW5jbHVkaW5nIGZvciB0ZW1wb3JhcnkgaWxsbmVzcyIsCiAgICAgICAgIkFmZmVjdGl2ZS9lbW90aW9uYWwgc3VwcG9ydCBmb3Igbm9uLWRlcGVuZGVudCBhZHVsdCBob3VzZWhvbGQgbWVtYmVycyIsCiAgICAgICAgIk90aGVyIGFjdGl2aXRpZXMgcmVsYXRlZCB0byBjYXJlIGZvciBub24tZGVwZW5kZW50IGFkdWx0IGhvdXNlaG9sZCBtZW1iZXJzIgogICAgICApIH4gIkhlbHAgdG8gTm9uLURlcGVuZGVudCBBZHVsdHMiLAogICAgICBhY3Rpdml0eV9jb2RlICVpbiUgYygKICAgICAgICAiVHJhdmVsbGluZyByZWxhdGVkIHRvIGNhcmUtZ2l2aW5nIHNlcnZpY2VzIGZvciBob3VzZWhvbGQgbWVtYmVycyIsCiAgICAgICAgIkFjY29tcGFueWluZyBvd24gY2hpbGRyZW4iLAogICAgICAgICJBY2NvbXBhbnlpbmcgZGVwZW5kZW50IGFkdWx0cyIsCiAgICAgICAgIkFjY29tcGFueWluZyBub24tZGVwZW5kZW50IGFkdWx0IGhvdXNlaG9sZCBtZW1iZXJzIgogICAgICApIH4gIlRyYXZlbCAoQ2FyZWdpdmluZykiLAogICAgICBhY3Rpdml0eV9jb2RlICVpbiUgYygKICAgICAgICAiT3RoZXIgYWN0aXZpdGllcyByZWxhdGVkIHRvIHVucGFpZCBjYXJlZ2l2aW5nIHNlcnZpY2VzIGZvciBob3VzZWhvbGQgbWVtYmVycyIKICAgICAgKSB+ICJPdGhlciBDYXJlZ2l2aW5nIiwKICAgICAgCiAgICAgICMgLS0tIDU6IFVucGFpZCB2b2x1bnRlZXIsIHRyYWluZWUgYW5kIG90aGVyIHVucGFpZCB3b3JrIC0tLQogICAgICBhY3Rpdml0eV9jb2RlICVpbiUgYygKICAgICAgICAiVW5wYWlkIHZvbHVudGVlciBob3VzZWhvbGQgbWFpbnRlbmFuY2UsIG1hbmFnZW1lbnQsIGNvbnN0cnVjdGlvbiwgcmVub3ZhdGlvbiBhbmQgcmVwYWlyIiwKICAgICAgICAiVW5wYWlkIHZvbHVudGVlciBzaG9wcGluZy9wdXJjaGFzaW5nIGdvb2RzIGFuZCBzZXJ2aWNlcyIsCiAgICAgICAgIlVucGFpZCB2b2x1bnRlZXIgY2hpbGRjYXJlIGFuZCBpbnN0cnVjdGlvbiIsCiAgICAgICAgIlVucGFpZCB2b2x1bnRlZXIgY2FyZSBmb3IgYWR1bHRzIiwKICAgICAgICAiVW5wYWlkIHZvbHVudGVlciBhY3Rpdml0aWVzIGluIGVudGVycHJpc2VzIG93bmVkIGJ5IG90aGVyIGhvdXNlaG9sZHMiLAogICAgICAgICJPdGhlciBhY3Rpdml0aWVzIHJlbGF0ZWQgdG8gZGlyZWN0IHVucGFpZCB2b2x1bnRlZXJpbmcgZm9yIG90aGVyIGhvdXNlaG9sZHMiCiAgICAgICkgfiAiRGlyZWN0IFZvbHVudGVlcmluZyIsCiAgICAgIGFjdGl2aXR5X2NvZGUgJWluJSBjKAogICAgICAgICJVbnBhaWQgdm9sdW50ZWVyIHdvcmsgb24gcm9hZC9idWlsZGluZyByZXBhaXIsIGNsZWFyaW5nIGFuZCBwcmVwYXJpbmcgbGFuZCwgY2xlYW5pbmcgKHN0cmVldHMsIG1hcmtldHMsIGV0Yy4pLCBhbmQgY29uc3RydWN0aW9uIiwKICAgICAgICAiVW5wYWlkIHZvbHVudGVlciBwcmVwYXJpbmcvc2VydmluZyBtZWFscywgY2xlYW5pbmcgdXAiLAogICAgICAgICJVbnBhaWQgdm9sdW50ZWVyIGN1bHR1cmFsIGFjdGl2aXRpZXMsIHJlY3JlYXRpb24gYW5kIHNwb3J0cyBhY3Rpdml0aWVzIiwKICAgICAgICAiVW5wYWlkIHZvbHVudGVlciBvZmZpY2UvYWRtaW5pc3RyYXRpdmUgd29yayIsCiAgICAgICAgIk90aGVyIGFjdGl2aXRpZXMgcmVsYXRlZCB0byBjb21tdW5pdHktIGFuZCBvcmdhbml6YXRpb25iYXNlZCB1bnBhaWQgdm9sdW50ZWVyaW5nIgogICAgICApIH4gIkNvbW11bml0eSBWb2x1bnRlZXJpbmciLAogICAgICBhY3Rpdml0eV9jb2RlICVpbiUgYygiVW5wYWlkIHRyYWluZWUgd29yayBhbmQgcmVsYXRlZCBhY3Rpdml0aWVzIikgfiAiVHJhaW5lZSBXb3JrIiwKICAgICAgYWN0aXZpdHlfY29kZSAlaW4lIGMoCiAgICAgICAgIlRyYXZlbGxpbmcgdGltZSByZWxhdGVkIHRvIHVucGFpZCB2b2x1bnRlZXIsIHRyYWluZWUgYW5kIG90aGVyIHVucGFpZCB3b3JrIgogICAgICApIH4gIlRyYXZlbCAoVm9sdW50ZWVyaW5nKSIsCiAgICAgIGFjdGl2aXR5X2NvZGUgJWluJSBjKCJPdGhlciB1bnBhaWQgd29yayBhY3Rpdml0aWVzIikgfiAiT3RoZXIgVW5wYWlkIFdvcmsiLAogICAgICAKICAgICAgIyAtLS0gNjogTGVhcm5pbmcgLS0tCiAgICAgIGFjdGl2aXR5X2NvZGUgJWluJSBjKAogICAgICAgICJTY2hvb2wvdW5pdmVyc2l0eSBhdHRlbmRhbmNlIiwKICAgICAgICAiRXh0cmEtY3VycmljdWxhciBhY3Rpdml0aWVzIiwKICAgICAgICAiQnJlYWtzIGF0IHBsYWNlIG9mIGZvcm1hbCBlZHVjYXRpb24iLAogICAgICAgICJTZWxmLXN0dWR5IGZvciBkaXN0YW5jZSBlZHVjYXRpb24gY291cnNlIHdvcmsgKHZpZGVvLCBhdWRpbywgb25saW5lKSIsCiAgICAgICAgIk90aGVyIGFjdGl2aXRpZXMgcmVsYXRlZCB0byBmb3JtYWwgZWR1Y2F0aW9uIgogICAgICApIH4gIkZvcm1hbCBFZHVjYXRpb24iLAogICAgICBhY3Rpdml0eV9jb2RlICVpbiUgYygKICAgICAgICAiSG9tZXdvcmssIGJlaW5nIHR1dG9yZWQsIGNvdXJzZSByZXZpZXcsIHJlc2VhcmNoIGFuZCBhY3Rpdml0aWVzIHJlbGF0ZWQgdG8gZm9ybWFsIGVkdWNhdGlvbiIKICAgICAgKSB+ICJIb21ld29yayIsCiAgICAgIGFjdGl2aXR5X2NvZGUgJWluJSBjKCJBZGRpdGlvbmFsIHN0dWR5LCBub24tZm9ybWFsIGVkdWNhdGlvbiBhbmQgY291cnNlcyIpIH4gIkFkZGl0aW9uYWwgU3R1ZHkiLAogICAgICBhY3Rpdml0eV9jb2RlICVpbiUgYygiVHJhdmVsbGluZyB0aW1lIHJlbGF0ZWQgdG8gbGVhcm5pbmciKSB+ICJUcmF2ZWwgKExlYXJuaW5nKSIsCiAgICAgIGFjdGl2aXR5X2NvZGUgJWluJSBjKCJPdGhlciBhY3Rpdml0aWVzIHJlbGF0ZWQgdG8gbGVhcm5pbmciKSB+ICJPdGhlciBMZWFybmluZyIsCiAgICAgIAogICAgICAjIC0tLSA3OiBTb2NpYWxpemluZyBhbmQgY29tbXVuaWNhdGlvbiwgY29tbXVuaXR5IHBhcnRpY2lwYXRpb24gYW5kIHJlbGlnaW91cyBwcmFjdGljZSAtLS0KICAgICAgYWN0aXZpdHlfY29kZSAlaW4lIGMoCiAgICAgICAgIlRhbGtpbmcsIGNvbnZlcnNpbmcsIGNoYXR0aW5nIiwKICAgICAgICAiU29jaWFsaXppbmcvZ2V0dGluZyB0b2dldGhlci9nYXRoZXJpbmcgYWN0aXZpdGllcyIsCiAgICAgICAgIlJlYWRpbmcgYW5kIHdyaXRpbmcgbWFpbCAoaW5jbHVkaW5nIGVtYWlsKSIsCiAgICAgICAgIk90aGVyIGFjdGl2aXRpZXMgcmVsYXRlZCB0byBzb2NpYWxpemluZyBhbmQgY29tbXVuaWNhdGlvbiIKICAgICAgKSB+ICJTb2NpYWxpemluZyAmIENvbW11bmljYXRpb24iLAogICAgICBhY3Rpdml0eV9jb2RlICVpbiUgYygKICAgICAgICAiUGFydGljaXBhdGluZyBpbiBjb21tdW5pdHkgY2VsZWJyYXRpb25zIG9mIGN1bHR1cmFsL2hpc3RvcmljIGV2ZW50cyIsCiAgICAgICAgIlBhcnRpY2lwYXRpbmcgaW4gY29tbXVuaXR5IHJpdGVzL2V2ZW50cyAobm9uLXJlbGlnaW91cykgb2Ygd2VkZGluZ3MsIGZ1bmVyYWxzLCBiaXJ0aHMgYW5kIHNpbWlsYXIgcml0ZXMtb2ZwYXNzYWdlIiwKICAgICAgICAiUGFydGljaXBhdGluZyBpbiBjb21tdW5pdHkgc29jaWFsIGZ1bmN0aW9ucyAobXVzaWMsIGRhbmNlLCBldGMuKSIsCiAgICAgICAgIk90aGVyIGFjdGl2aXRpZXMgcmVsYXRlZCB0byBjb21tdW5pdHkgcGFydGljaXBhdGlvbiIKICAgICAgKSB+ICJDb21tdW5pdHkgRXZlbnRzIiwKICAgICAgYWN0aXZpdHlfY29kZSAlaW4lIGMoIkludm9sdmVtZW50IGluIGNpdmljIGFuZCByZWxhdGVkIHJlc3BvbnNpYmlsaXRpZXMiKSB+ICJDaXZpYyBSZXNwb25zaWJpbGl0aWVzIiwKICAgICAgYWN0aXZpdHlfY29kZSAlaW4lIGMoCiAgICAgICAgIlByaXZhdGUgcHJheWVyLCBtZWRpdGF0aW9uIGFuZCBvdGhlciBzcGlyaXR1YWwgYWN0aXZpdGllcyIsCiAgICAgICAgIlBhcnRpY2lwYXRpbmcgaW4gY29sbGVjdGl2ZSByZWxpZ2lvdXMgcHJhY3RpY2UiLAogICAgICAgICJPdGhlciBhY3Rpdml0aWVzIHJlbGF0ZWQgdG8gcmVsaWdpb3VzIHByYWN0aWNlIgogICAgICApIH4gIlJlbGlnaW91cyBQcmFjdGljZXMiLAogICAgICBhY3Rpdml0eV9jb2RlICVpbiUgYygKICAgICAgICAiVHJhdmVsbGluZyB0aW1lIHJlbGF0ZWQgdG8gc29jaWFsaXppbmcgYW5kIGNvbW11bmljYXRpb24sIGNvbW11bml0eSBwYXJ0aWNpcGF0aW9uIGFuZCByZWxpZ2lvdXMgcHJhY3RpY2UiCiAgICAgICkgfiAiVHJhdmVsIChTb2NpYWwvQ29tbXVuaXR5KSIsCiAgICAgIAogICAgICAjIC0tLSA4OiBDdWx0dXJlLCBsZWlzdXJlLCBtYXNzIG1lZGlhIGFuZCBzcG9ydHMgcHJhY3RpY2VzIC0tLQogICAgICBhY3Rpdml0eV9jb2RlICVpbiUgYygKICAgICAgICAiQXR0ZW5kYW5jZSBhdCBvcmdhbml6ZWQvbWFzcyBjdWx0dXJhbCBldmVudHMgYW5kIHNob3dzIiwKICAgICAgICAiQXR0ZW5kYW5jZSBhdCBwYXJrcy9nYXJkZW5zIiwKICAgICAgICAiQXR0ZW5kYW5jZSBhdCBzcG9ydHMgZXZlbnRzIiwKICAgICAgICAiT3RoZXIgYWN0aXZpdGllcyByZWxhdGVkIHRvIGF0dGVuZGFuY2UgYXQgY3VsdHVyYWwsIGVudGVydGFpbm1lbnQgYW5kIHNwb3J0cyBldmVudHMiCiAgICAgICkgfiAiQXR0ZW5kaW5nIEV2ZW50cyIsCiAgICAgIGFjdGl2aXR5X2NvZGUgJWluJSBjKAogICAgICAgICJWaXN1YWwsIGxpdGVyYXJ5IGFuZCBwZXJmb3JtaW5nIGFydHMgKGFzIGhvYmJ5KSIsCiAgICAgICAgIkhvYmJpZXMiLAogICAgICAgICJQbGF5aW5nIGdhbWVzIGFuZCBvdGhlciBwYXN0aW1lIGFjdGl2aXRpZXMiLAogICAgICAgICJPdGhlciBhY3Rpdml0aWVzIHJlbGF0ZWQgdG8gY3VsdHVyYWwgcGFydGljaXBhdGlvbiwgaG9iYmllcywgZ2FtZXMiCiAgICAgICkgfiAiSG9iYmllcyAmIEdhbWVzIiwKICAgICAgYWN0aXZpdHlfY29kZSAlaW4lIGMoIlBhcnRpY2lwYXRpbmcgaW4gc3BvcnRzIiwgIkV4ZXJjaXNpbmciKSB+ICJTcG9ydHMgJiBFeGVyY2lzZSIsCiAgICAgIGFjdGl2aXR5X2NvZGUgJWluJSBjKAogICAgICAgICJSZWFkaW5nIGZvciBsZWlzdXJlIiwKICAgICAgICAiV2F0Y2hpbmcvbGlzdGVuaW5nIHRvIHRlbGV2aXNpb24gYW5kIHZpZGVvIiwKICAgICAgICAiTGlzdGVuaW5nIHRvIHJhZGlvIGFuZCBhdWRpbyBkZXZpY2VzIiwKICAgICAgICAiT3RoZXIgYWN0aXZpdGllcyByZWxhdGVkIHRvIG1hc3MgbWVkaWEgdXNlIgogICAgICApIH4gIk1hc3MgTWVkaWEiLAogICAgICBhY3Rpdml0eV9jb2RlICVpbiUgYygiQWN0aXZpdGllcyBhc3NvY2lhdGVkIHdpdGggcmVmbGVjdGluZywgcmVzdGluZywgcmVsYXhpbmciKSB+ICJSZXN0aW5nICYgUmVsYXhpbmciLAogICAgICBhY3Rpdml0eV9jb2RlICVpbiUgYygKICAgICAgICAiVHJhdmVsbGluZyB0aW1lIHJlbGF0ZWQgdG8gY3VsdHVyZSwgbGVpc3VyZSwgbWFzcy1tZWRpYSBhbmQgc3BvcnRzIHByYWN0aWNlcyIKICAgICAgKSB+ICJUcmF2ZWwgKExlaXN1cmUpIiwKICAgICAgYWN0aXZpdHlfY29kZSAlaW4lIGMoCiAgICAgICAgIk90aGVyIGFjdGl2aXRpZXMgcmVsYXRlZCB0byBjdWx0dXJlLCBsZWlzdXJlLCBtYXNzLW1lZGlhIGFuZCBzcG9ydHMgcHJhY3RpY2VzIiwKICAgICAgICAiQ3VsdHVyZSwgbGVpc3VyZSwgbWFzcy1tZWRpYSBhbmQgc3BvcnRzIHByYWN0aWNlcyIKICAgICAgKSB+ICJPdGhlciBMZWlzdXJlIiwKICAgICAgCiAgICAgICMgLS0tIDk6IFNlbGYtY2FyZSBhbmQgbWFpbnRlbmFuY2UgLS0tCiAgICAgIGFjdGl2aXR5X2NvZGUgJWluJSBjKAogICAgICAgICJOaWdodCBzbGVlcC9lc3NlbnRpYWwgc2xlZXAiLAogICAgICAgICJJbmNpZGVudGFsIHNsZWVwL25hcHMiLAogICAgICAgICJTbGVlcGxlc3NuZXNzIiwKICAgICAgICAiT3RoZXIgc2xlZXAgYW5kIHJlbGF0ZWQgYWN0aXZpdGllcyIKICAgICAgKSB+ICJTbGVlcCIsCiAgICAgIGFjdGl2aXR5X2NvZGUgJWluJSBjKCJFYXRpbmcgbWVhbHMvc25hY2siLCAiRHJpbmtpbmcgb3RoZXIgdGhhbiB3aXRoIG1lYWwgb3Igc25hY2siKSB+ICJFYXRpbmcgJiBEcmlua2luZyIsCiAgICAgIGFjdGl2aXR5X2NvZGUgJWluJSBjKAogICAgICAgICJQZXJzb25hbCBoeWdpZW5lIGFuZCBjYXJlIiwKICAgICAgICAiSGVhbHRoL21lZGljYWwgY2FyZSB0byBvbmVzZWxmIiwKICAgICAgICAiT3RoZXIgYWN0aXZpdGllcyByZWxhdGVkIHRvIHBlcnNvbmFsIGh5Z2llbmUgYW5kIGNhcmUiCiAgICAgICkgfiAiUGVyc29uYWwgSHlnaWVuZSAmIEhlYWx0aCIsCiAgICAgIGFjdGl2aXR5X2NvZGUgJWluJSBjKAogICAgICAgICJSZWNlaXZpbmcgcGVyc29uYWwgY2FyZSBmcm9tIG90aGVycyIsCiAgICAgICAgIlJlY2VpdmluZyBoZWFsdGgvbWVkaWNhbCBjYXJlIGZyb20gb3RoZXJzIiwKICAgICAgICAiT3RoZXIgYWN0aXZpdGllcyByZWxhdGVkIHRvIHJlY2VpdmluZyBwZXJzb25hbCBhbmQgaGVhbHRoL21lZGljYWwgY2FyZSIKICAgICAgKSB+ICJSZWNlaXZpbmcgQ2FyZSIsCiAgICAgIGFjdGl2aXR5X2NvZGUgJWluJSBjKCJUcmF2ZWxsaW5nIHRpbWUgcmVsYXRlZCB0byBzZWxmLWNhcmUgYW5kIG1haW50ZW5hbmNlIGFjdGl2aXRpZXMiKSB+ICJUcmF2ZWwgKFNlbGYtQ2FyZSkiLAogICAgICBhY3Rpdml0eV9jb2RlICVpbiUgYygiT3RoZXIgc2VsZi1jYXJlIGFuZCBtYWludGVuYW5jZSBhY3Rpdml0aWVzIikgfiAiT3RoZXIgU2VsZi1DYXJlIiwKICAgICAgCiAgICAgIFRSVUUgfiAiVW5jbGFzc2lmaWVkIgogICAgKQogICkKCmBgYAoKIyMgQXZlcmFnZSBzbGVlcCBvdmVyIHRoZSBhZ2VzCgpgYGB7cn0KdGltZXVzZV9kZiAlPiUKICBmaWx0ZXIoYWN0aXZpdHkgPT0gIlNsZWVwIiwgYWdlIDwgOTApICU+JQogIGdyb3VwX2J5KHBlcnNvbl9pZCwgYWdlLCBtdWx0KSAlPiUKICBzdW1tYXJpc2UodG90YWxfc2xlZXBfbWlucyA9IHN1bShkdXJhdGlvbl9taW5zLCBuYS5ybSA9IFRSVUUpLAogICAgICAgICAgICAuZ3JvdXBzID0gJ2Ryb3AnKSAlPiUgZ3JvdXBfYnkoYWdlKSAlPiUKICBzdW1tYXJpc2UoYXZnX3NsZWVwX3dlaWdodGVkX21pbnMgPSB3ZWlnaHRlZC5tZWFuKHRvdGFsX3NsZWVwX21pbnMsIHcgPSBtdWx0LCBuYS5ybSA9IFRSVUUpKSAlPiUKICBtdXRhdGUoYXZnX3NsZWVwX2hvdXJzID0gYXZnX3NsZWVwX3dlaWdodGVkX21pbnMgLyA2MCkgJT4lCiAgZ2dwbG90KGFlcyh4ID0gYWdlLCB5ID0gYXZnX3NsZWVwX2hvdXJzKSkgKwogIGdlb21fc21vb3RoKAogICAgbWV0aG9kID0gImxvZXNzIiwKICAgIHNlID0gVFJVRSwKICAgIGNvbG9yID0gImJsYWNrIiwKICAgIGZpbGwgPSAiZ3JheTgwIgogICkgKwogICNnZW9tX2xpbmUoKSsKICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gYyg4LCAxMyksIGJyZWFrcyA9IHNlcSg4LCAxMywgYnkgPSAxKSkgKwogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBzZXEoMCwgOTAsIGJ5ID0gMTApLCBsaW1pdHMgPSBjKDYsIDk1KSkgKwogICAgbGFicygKICAgIHRpdGxlID0gIkF2ZXJhZ2UgRGFpbHkgU2xlZXAgRGVjbGluZXMgVGhyb3VnaCBBZG9sZXNjZW5jZSIsCiAgICB4ID0gIkFnZSIsCiAgICB5ID0gIkF2ZXJhZ2UgU2xlZXAgKGhvdXJzIHBlciBkYXkpIiwKICAgIGNhcHRpb24gPSAiU291cmNlOiBNb1NQSSBUaW1lIFVzZSBTdXJ2ZXksIDIwMjQiCiAgKSArCiAgICB0aGVtZV9maXZldGhpcnR5ZWlnaHQoKSArCiAgICB0aGVtZSgKICAgIHRleHQgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gImF0aCIpLAogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dCgKICAgICAgZmFtaWx5ID0gImF0aCIsCiAgICAgIGZhY2UgPSAiYm9sZCIsCiAgICAgIHNpemUgPSAxOCwKICAgICAgbWFyZ2luID0gbWFyZ2luKGIgPSAyMCkKICAgICksCiAgICBwbG90LmNhcHRpb24gPSBlbGVtZW50X3RleHQoCiAgICAgIGZhbWlseSA9ICJhdGgiLAogICAgICBzaXplID0gMTAsCiAgICAgIGNvbG9yID0gImdyYXk1MCIKICAgICksCiAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KGZhbWlseSA9ICJhdGgiLCBzaXplID0gMTIpLAogICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KG1hcmdpbiA9IG1hcmdpbihyID0gMTUpKSwKICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChtYXJnaW4gPSBtYXJnaW4odCA9IDE1KSksCiAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dCgKICAgICAgZmFtaWx5ID0gImF0aCIsCiAgICAgIHNpemUgPSAxMiwKICAgICAgbWFyZ2luID0gbWFyZ2luKHIgPSA4KQogICAgKSwKICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KAogICAgICBmYW1pbHkgPSAiYXRoIiwKICAgICAgc2l6ZSA9IDEyLAogICAgICBtYXJnaW4gPSBtYXJnaW4odCA9IDgpCiAgICApLAogICAgCiAgICBwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9saW5lKGxpbmV3aWR0aCA9IDAuNSwgY29sb3IgPSAiZ3JheTkwIiksCiAgICBwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpCiAgKQpgYGAKCiMjIyBEaWZmZXJlbmNlIGluIGFjdGl2aXRpZXMgYnkgZ2VuZGVyCgpgYGB7cn0KYWxsX3BlcnNvbnMgPC0gdGltZXVzZV9kZiAlPiUKICBkaXN0aW5jdChwZXJzb25faWQsIGdlbmRlciwgbXVsdCkKCnBlcnNvbl9hY3Rpdml0eV9zdW1tYXJ5IDwtIHRpbWV1c2VfZGYgJT4lCiAgZmlsdGVyKCFpcy5uYShhY3Rpdml0eSkgJiBhY3Rpdml0eSAhPSAiVW5jbGFzc2lmaWVkIikgJT4lCiAgZ3JvdXBfYnkocGVyc29uX2lkLCBhY3Rpdml0eSkgJT4lCiAgc3VtbWFyaXNlKHRvdGFsX2R1cmF0aW9uX21pbnMgPSBzdW0oZHVyYXRpb25fbWlucywgbmEucm0gPSBUUlVFKSwgLmdyb3VwcyA9ICdkcm9wJykKCmdlbmRlcl9zdW1tYXJ5IDwtIGFsbF9wZXJzb25zICU+JQogIHRpZHlyOjpjcm9zc2luZyhhY3Rpdml0eSA9IHVuaXF1ZShwZXJzb25fYWN0aXZpdHlfc3VtbWFyeSRhY3Rpdml0eSkpICU+JQogIGxlZnRfam9pbihwZXJzb25fYWN0aXZpdHlfc3VtbWFyeSwgYnkgPSBjKCJwZXJzb25faWQiLCAiYWN0aXZpdHkiKSkgJT4lCiAgbXV0YXRlKHRvdGFsX2R1cmF0aW9uX21pbnMgPSBpZmVsc2UoaXMubmEodG90YWxfZHVyYXRpb25fbWlucyksIDAsIHRvdGFsX2R1cmF0aW9uX21pbnMpKSAlPiUKICBncm91cF9ieShnZW5kZXIsIGFjdGl2aXR5KSAlPiUKICBzdW1tYXJpc2UoCiAgICBhdmdfaG91cnNfcGVyX3BlcnNvbiA9IHdlaWdodGVkLm1lYW4odG90YWxfZHVyYXRpb25fbWlucywgdyA9IG11bHQsIG5hLnJtID0gVFJVRSkgLyA2MCwKICAgIC5ncm91cHMgPSAnZHJvcCcKICApCgpnZW5kZXJfc3VtbWFyeV93aWRlIDwtIGdlbmRlcl9zdW1tYXJ5ICU+JQogIHBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSBnZW5kZXIsIHZhbHVlc19mcm9tID0gYXZnX2hvdXJzX3Blcl9wZXJzb24pICU+JQogIG11dGF0ZShnYXAgPSBmZW1hbGUgLSBtYWxlKSAlPiUKICBzbGljZV9tYXgob3JkZXJfYnkgPSBhYnMoZ2FwKSwgbiA9IDE1KSAlPiUKICBtdXRhdGUoYWN0aXZpdHkgPSBmY3RfcmVvcmRlcihhY3Rpdml0eSwgZ2FwKSkKCmdncGxvdChnZW5kZXJfc3VtbWFyeV93aWRlLCBhZXMoeSA9IGFjdGl2aXR5KSkgKwogIGdlb21fc2VnbWVudChhZXMoeCA9IG1hbGUsIHhlbmQgPSBmZW1hbGUpLCBjb2xvciA9ICJncmF5IiwgbGluZXdpZHRoID0gMS41LCBhbHBoYSA9IDAuNSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSBmZW1hbGUsIGNvbG9yID0gIkZlbWFsZSIpLCBzaXplID0gNCkgKwogIGdlb21fcG9pbnQoYWVzKHggPSBtYWxlLCBjb2xvciA9ICJNYWxlIiksIHNpemUgPSA0KSArCiAgCiAgdGhlbWVfZml2ZXRoaXJ0eWVpZ2h0KCkgKwogIHNjYWxlX2NvbG9yX21hbnVhbChuYW1lID0gIiIsIHZhbHVlcyA9IGMoIkZlbWFsZSIgPSAiIzAwNzJCMiIsICJNYWxlIiA9ICIjRDU1RTAwIikpICsKICBsYWJzKAogICAgdGl0bGUgPSAiVW5wYWlkIFdvcmsgQWNjb3VudHMgZm9yIHRoZSBMYXJnZXN0IEdlbmRlciBHYXAgaW4gVGltZSBVc2UiLAogICAgc3VidGl0bGUgPSAiQ29tcGFyaW5nIHRoZSBhdmVyYWdlIGRhaWx5IGhvdXJzIGZvciBtZW4gYW5kIHdvbWVuIiwKICAgIHggPSAiQXZlcmFnZSBIb3VycyBQZXIgRGF5IChwZXIgcGVyc29uKSIsCiAgICB5ID0gIiIsCiAgICBjYXB0aW9uID0gIlNvdXJjZTogTW9TUEkgVGltZSBVc2UgU3VydmV5LCAyMDI0IgogICkgKwogICAgdGhlbWUoCiAgICB0ZXh0ID0gZWxlbWVudF90ZXh0KGZhbWlseSA9ICJhdGgiKSwKICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gImF0aCIsIHNpemUgPSAxNiwgbWFyZ2luID0gbWFyZ2luKGIgPSAxMCwgbCA9IC0xMzApKSwKICAgIHBsb3Quc3VidGl0bGUgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gImF0aCIsIHNpemUgPSAxNCwgbWFyZ2luID0gbWFyZ2luKGIgPSAyMCwgbCA9IC0xMzApLCBjb2xvciA9ICJncmF5NDAiKSwKICAgIHBsb3QuY2FwdGlvbiA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSAiYXRoIiwgc2l6ZSA9IDEwLCBjb2xvciA9ICJncmF5NTAiLCBtYXJnaW4gPSBtYXJnaW4odCA9IDIwKSksCiAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KGZhbWlseSA9ICJhdGgiLCBzaXplID0gMTIpLAogICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KGZhbWlseSA9ICJhdGgiLCBzaXplID0gMTEpLAogICAgcGxvdC5tYXJnaW4gPSBtYXJnaW4oMTUsIDUwLCAxMCwgMCksCiAgICAKICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJ0b3AiLAogICAgbGVnZW5kLmRpcmVjdGlvbiA9ICJob3Jpem9udGFsIiwgCiAgICBsZWdlbmQuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gInRyYW5zcGFyZW50IiksCiAgICBsZWdlbmQua2V5ID0gZWxlbWVudF9yZWN0KGZpbGwgPSAidHJhbnNwYXJlbnQiLCBjb2xvciA9IE5BKSwgCiAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X2JsYW5rKCksIAogICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwLCBmYW1pbHkgPSAiYXRoIikKICApCmBgYAoKYGBge3Igc2VjdG9yLWdhcC1wbG90fQoKYWxsX3BlcnNvbnNfc2VjdG9yIDwtIHRpbWV1c2VfZGYgJT4lCiAgZGlzdGluY3QocGVyc29uX2lkLCBzZWN0b3IsIG11bHQpCgpwZXJzb25fYWN0aXZpdHlfc3VtbWFyeV9zZWN0b3IgPC0gdGltZXVzZV9kZiAlPiUKICBmaWx0ZXIoIWlzLm5hKGFjdGl2aXR5KSAmIGFjdGl2aXR5ICE9ICJVbmNsYXNzaWZpZWQiKSAlPiUKICBncm91cF9ieShwZXJzb25faWQsIGFjdGl2aXR5KSAlPiUKICBzdW1tYXJpc2UodG90YWxfZHVyYXRpb25fbWlucyA9IHN1bShkdXJhdGlvbl9taW5zLCBuYS5ybSA9IFRSVUUpLCAuZ3JvdXBzID0gJ2Ryb3AnKQoKc2VjdG9yX3N1bW1hcnkgPC0gYWxsX3BlcnNvbnNfc2VjdG9yICU+JQogIHRpZHlyOjpjcm9zc2luZyhhY3Rpdml0eSA9IHVuaXF1ZShwZXJzb25fYWN0aXZpdHlfc3VtbWFyeV9zZWN0b3IkYWN0aXZpdHkpKSAlPiUKICBsZWZ0X2pvaW4ocGVyc29uX2FjdGl2aXR5X3N1bW1hcnlfc2VjdG9yLCBieSA9IGMoInBlcnNvbl9pZCIsICJhY3Rpdml0eSIpKSAlPiUKICBtdXRhdGUodG90YWxfZHVyYXRpb25fbWlucyA9IGlmZWxzZShpcy5uYSh0b3RhbF9kdXJhdGlvbl9taW5zKSwgMCwgdG90YWxfZHVyYXRpb25fbWlucykpICU+JQogIGdyb3VwX2J5KHNlY3RvciwgYWN0aXZpdHkpICU+JQogIHN1bW1hcmlzZSgKICAgIGF2Z19ob3Vyc19wZXJfcGVyc29uID0gd2VpZ2h0ZWQubWVhbih0b3RhbF9kdXJhdGlvbl9taW5zLCB3ID0gbXVsdCwgbmEucm0gPSBUUlVFKSAvIDYwLAogICAgLmdyb3VwcyA9ICdkcm9wJwogICkKCnNlY3Rvcl9zdW1tYXJ5X3dpZGUgPC0gc2VjdG9yX3N1bW1hcnkgJT4lCiAgcGl2b3Rfd2lkZXIobmFtZXNfZnJvbSA9IHNlY3RvciwgdmFsdWVzX2Zyb20gPSBhdmdfaG91cnNfcGVyX3BlcnNvbikgJT4lCiAgbXV0YXRlKGdhcCA9IFVyYmFuIC0gUnVyYWwpICU+JQogIHNsaWNlX21heChvcmRlcl9ieSA9IGFicyhnYXApLCBuID0gMTUpICU+JQogIG11dGF0ZShhY3Rpdml0eSA9IGZjdF9yZW9yZGVyKGFjdGl2aXR5LCBnYXApKQoKZ2dwbG90KHNlY3Rvcl9zdW1tYXJ5X3dpZGUsIGFlcyh5ID0gYWN0aXZpdHkpKSArCiAgZ2VvbV9zZWdtZW50KGFlcyh4ID0gUnVyYWwsIHhlbmQgPSBVcmJhbiksIGNvbG9yID0gImdyYXkiLCBsaW5ld2lkdGggPSAxLjUsIGFscGhhID0gMC41KSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IFVyYmFuLCBjb2xvciA9ICJVcmJhbiIpLCBzaXplID0gNCkgKwogIGdlb21fcG9pbnQoYWVzKHggPSBSdXJhbCwgY29sb3IgPSAiUnVyYWwiKSwgc2l6ZSA9IDQpICsKICAKICB0aGVtZV9maXZldGhpcnR5ZWlnaHQoKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKG5hbWUgPSAiIiwgdmFsdWVzID0gYygiVXJiYW4iID0gIiMwMDcyQjIiLCAiUnVyYWwiID0gIiNENTVFMDAiKSkgKwogIAogIGxhYnMoCiAgICB0aXRsZSA9ICJSdXJhbC1VcmJhbiBEaXZpZGUgaW4gRGFpbHkgVGltZSBVc2UiLAogICAgc3VidGl0bGUgPSAiQ29tcGFyaW5nIGRhaWx5IGhvdXJzIGZvciB0aGUgMTUgYWN0aXZpdGllcyB3aXRoIHRoZSBsYXJnZXN0IHVyYmFuLXJ1cmFsIGRpc3Bhcml0aWVzIiwKICAgIHggPSAiQXZlcmFnZSBIb3VycyBQZXIgRGF5IChwZXIgcGVyc29uKSIsCiAgICB5ID0gIiIsCiAgICBjYXB0aW9uID0gIlNvdXJjZTogTW9TUEkgVGltZSBVc2UgU3VydmV5LCAyMDI0IgogICkgKwogIAogIHRoZW1lKAogICAgdGV4dCA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSAiYXRoIiksCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGZhbWlseSA9ICJhdGgiLCBzaXplID0gMjAsIG1hcmdpbiA9IG1hcmdpbihiID0gMTApKSwKICAgIHBsb3Quc3VidGl0bGUgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gImF0aCIsIHNpemUgPSAxNCwgbWFyZ2luID0gbWFyZ2luKGIgPSAyMCksIGNvbG9yID0gImdyYXk0MCIpLAogICAgcGxvdC5jYXB0aW9uID0gZWxlbWVudF90ZXh0KGZhbWlseSA9ICJhdGgiLCBzaXplID0gMTAsIGNvbG9yID0gImdyYXk1MCIsIG1hcmdpbiA9IG1hcmdpbih0ID0gMjApKSwKICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gImF0aCIsIHNpemUgPSAxMiksCiAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gImF0aCIsIHNpemUgPSAxMSksCiAgICBwbG90Lm1hcmdpbiA9IG1hcmdpbigxNSwgMTUsIDEwLCAxNSksCiAgICAKICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJ0b3AiLAogICAgbGVnZW5kLmRpcmVjdGlvbiA9ICJob3Jpem9udGFsIiwgCiAgICBsZWdlbmQuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gInRyYW5zcGFyZW50IiksCiAgICBsZWdlbmQua2V5ID0gZWxlbWVudF9yZWN0KGZpbGwgPSAidHJhbnNwYXJlbnQiLCBjb2xvciA9IE5BKSwgCiAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X2JsYW5rKCksIAogICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0LCBmYW1pbHkgPSAiYXRoIikKICApCmBgYAoKIyMgQWN0aXZpdHkgc3RyaXBzIGJ5IGFnZSBncm91cHMKCmBgYHtyfQpoaWdoX2xldmVsX3N1bW1hcnkgPC0gdGltZXVzZV9kZiAlPiUKICBmaWx0ZXIoIWlzLm5hKGFjdGl2aXR5KSAmIGFjdGl2aXR5ICE9ICJVbmNsYXNzaWZpZWQiKSAlPiUKICBtdXRhdGUoCiAgICBhY3Rpdml0eV9ncm91cCA9IGNhc2Vfd2hlbigKICAgICAgYWN0aXZpdHkgPT0gIlNsZWVwIiB+ICJTbGVlcCIsCiAgICAgIGFjdGl2aXR5ICVpbiUgYygiRWF0aW5nICYgRHJpbmtpbmciLCAiUGVyc29uYWwgSHlnaWVuZSAmIEhlYWx0aCIsICJSZWNlaXZpbmcgQ2FyZSIpIH4gIlBlcnNvbmFsIENhcmUiLAogICAgICBhY3Rpdml0eSAlaW4lIGMoCiAgICAgICAgIkZvcm1hbCBFbXBsb3ltZW50IiwKICAgICAgICAiSG91c2Vob2xkIEVudGVycHJpc2UgKEdvb2RzKSIsCiAgICAgICAgIkhvdXNlaG9sZCBFbnRlcnByaXNlIChTZXJ2aWNlcykiLAogICAgICAgICJXb3JrLVJlbGF0ZWQgVHJhaW5pbmciLAogICAgICAgICJTZWVraW5nIEVtcGxveW1lbnQiLAogICAgICAgICJTZXR0aW5nIHVwIGEgQnVzaW5lc3MiCiAgICAgICkgfiAiUGFpZCBXb3JrIiwKICAgICAgYWN0aXZpdHkgJWluJSBjKAogICAgICAgICJGb29kICYgTWVhbCBNYW5hZ2VtZW50IiwKICAgICAgICAiQ2xlYW5pbmcgJiBNYWludGVuYW5jZSIsCiAgICAgICAgIkNoaWxkY2FyZSAmIEluc3RydWN0aW9uIiwKICAgICAgICAiU2hvcHBpbmciLAogICAgICAgICJBZ3JpY3VsdHVyZSAmIEZpc2hpbmcgKE93bi1Vc2UpIiwKICAgICAgICAiQ29tbXVuaXR5IFZvbHVudGVlcmluZyIsCiAgICAgICAgIkRpcmVjdCBWb2x1bnRlZXJpbmciCiAgICAgICkgfiAiVW5wYWlkIFdvcmsgJiBDYXJlIiwKICAgICAgYWN0aXZpdHkgJWluJSBjKCJGb3JtYWwgRWR1Y2F0aW9uIiwgIkhvbWV3b3JrIiwgIkFkZGl0aW9uYWwgU3R1ZHkiKSB+ICJMZWFybmluZyIsCiAgICAgICMgR3JvdXAgYWxsIGxlaXN1cmUsIHNvY2lhbCwgYW5kIHRyYXZlbCBpbnRvIG9uZSBidWNrZXQgZm9yIHRoaXMgaGlnaC1sZXZlbCB2aWV3CiAgICAgIFRSVUUgfiAiTGVpc3VyZSwgU29jaWFsICYgVHJhdmVsIgogICAgKQogICkKCmFnZV9ncm91cF9zdW1tYXJ5IDwtIGhpZ2hfbGV2ZWxfc3VtbWFyeSAlPiUKICBtdXRhdGUoYWdlX2dyb3VwID0gY3V0KAogICAgYWdlLAogICAgYnJlYWtzID0gYyg1LCAxNCwgMjQsIDU5LCBJbmYpLAogICAgbGFiZWxzID0gYygKICAgICAgIkNoaWxkcmVuICg2LTE0KSIsCiAgICAgICJZb3V0aCAoMTUtMjQpIiwKICAgICAgIkFkdWx0cyAoMjUtNTkpIiwKICAgICAgIlNlbmlvcnMgKDYwKykiCiAgICApLAogICAgcmlnaHQgPSBUUlVFLAogICAgaW5jbHVkZS5sb3dlc3QgPSBUUlVFCiAgKSkgJT4lCiAgZmlsdGVyKCFpcy5uYShhZ2VfZ3JvdXApKSAlPiUKICBncm91cF9ieShwZXJzb25faWQsIGFnZV9ncm91cCwgYWN0aXZpdHlfZ3JvdXAsIG11bHQpICU+JQogIHN1bW1hcmlzZSh0b3RhbF9kdXJhdGlvbiA9IHN1bShkdXJhdGlvbl9taW5zLCBuYS5ybSA9IFRSVUUpLAogICAgICAgICAgICAuZ3JvdXBzID0gImRyb3AiKSAlPiUKICBncm91cF9ieShhZ2VfZ3JvdXAsIGFjdGl2aXR5X2dyb3VwKSAlPiUKICBzdW1tYXJpc2UoYXZnX2hvdXJzID0gd2VpZ2h0ZWQubWVhbih0b3RhbF9kdXJhdGlvbiwgdyA9IG11bHQsIG5hLnJtID0gVFJVRSkgLyA2MCwKICAgICAgICAgICAgLmdyb3VwcyA9ICJkcm9wIikKCnN0YWNraW5nX29yZGVyIDwtIGMoCiAgIlNsZWVwIiwKICAiUGVyc29uYWwgQ2FyZSIsCiAgIlBhaWQgV29yayIsCiAgIlVucGFpZCBXb3JrICYgQ2FyZSIsCiAgIkxlYXJuaW5nIiwKICAiTGVpc3VyZSwgU29jaWFsICYgVHJhdmVsIgopCgphZ2VfZ3JvdXBfc3VtbWFyeSRhY3Rpdml0eV9ncm91cCA8LSBmYWN0b3IoYWdlX2dyb3VwX3N1bW1hcnkkYWN0aXZpdHlfZ3JvdXAsIGxldmVscyA9IHN0YWNraW5nX29yZGVyKQoKCmdncGxvdChhZ2VfZ3JvdXBfc3VtbWFyeSwKICAgICAgIGFlcyh4ID0gYWdlX2dyb3VwLCB5ID0gYXZnX2hvdXJzLCBmaWxsID0gYWN0aXZpdHlfZ3JvdXApKSArCiAgZ2VvbV9jb2wocG9zaXRpb24gPSAiZmlsbCIsIGNvbG91ciA9ICJ0cmFuc3BhcmVudCIpICsKICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gc2NhbGVzOjpwZXJjZW50KSArCiAgCiAgc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZSA9ICJEYXJrMiIsIG5hbWUgPSAiIikgKwogIGxhYnMoCiAgICB0aXRsZSA9ICJTaGFyZSBvZiBhIDI0LWhvdXIgZGF5IHNwZW50IG9uIG1ham9yIGFjdGl2aXRpZXMsIGJ5IGFnZSBncm91cCIsCiAgICB4ID0gIiIsCiAgICB5ID0gIlBlcmNlbnRhZ2Ugb2YgRGF5IiwKICAgIGNhcHRpb24gPSAiU291cmNlOiBNb1NQSSBUaW1lIFVzZSBTdXJ2ZXksIDIwMjQiCiAgKSArCiAgdGhlbWVfZml2ZXRoaXJ0eWVpZ2h0KCkgKwogIAogIHRoZW1lKAogICAgdGV4dCA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSAiYXRoIiksCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KAogICAgICBmYW1pbHkgPSAiYXRoIiwKICAgICAgc2l6ZSA9IDIwLAogICAgICBtYXJnaW4gPSBtYXJnaW4oYiA9IDEwKQogICAgKSwKICAgIHBsb3Quc3VidGl0bGUgPSBlbGVtZW50X3RleHQoCiAgICAgIGZhbWlseSA9ICJhdGgiLAogICAgICBzaXplID0gMTQsCiAgICAgIG1hcmdpbiA9IG1hcmdpbihiID0gMjApLAogICAgICBjb2xvciA9ICJncmF5NDAiCiAgICApLAogICAgcGxvdC5jYXB0aW9uID0gZWxlbWVudF90ZXh0KAogICAgICBmYW1pbHkgPSAiYXRoIiwKICAgICAgc2l6ZSA9IDEwLAogICAgICBjb2xvciA9ICJncmF5NTAiLAogICAgICBtYXJnaW4gPSBtYXJnaW4odCA9IDIwKQogICAgKSwKICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gImF0aCIsIHNpemUgPSAxMiksCiAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gImF0aCIsIHNpemUgPSAxMSksCiAgICBwbG90Lm1hcmdpbiA9IG1hcmdpbigxNSwgMTUsIDEwLCAxNSksCiAgICAKICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iLAogICAgbGVnZW5kLmRpcmVjdGlvbiA9ICJob3Jpem9udGFsIiwKICAgIGxlZ2VuZC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAidHJhbnNwYXJlbnQiKSwKICAgIGxlZ2VuZC5rZXkgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ0cmFuc3BhcmVudCIsIGNvbG9yID0gTkEpLAogICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF9ibGFuaygpLAogICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0LCBmYW1pbHkgPSAiYXRoIikKICApCmBgYAoKCiMjIFRpbWUgdXNlIG9uIGtleSBhY3Rpdml0aWVzIGluIGNoaWxkcmVuIGFuZCB5b3V0aAoK4oCcY2hpbGRyZW7igJ0gYXJlIGRlZmluZWQgYXMgcGVyc29ucyB1bmRlciAxNSB5ZWFycyBvZiBhZ2UsIGFuZCDigJx5b3V0aOKAnSBhcmUgZGVmaW5lZCBhcyB0aG9zZSBhZ2VkIDE14oCTMjQuCgpgYGB7cn0KCnlvdXRoX2FjdGl2aXRpZXMgPC0gYygKICAiRm9ybWFsIEVkdWNhdGlvbiIsICJIb21ld29yayIsIAogICJGb29kICYgTWVhbCBNYW5hZ2VtZW50IiwgIkNsZWFuaW5nICYgTWFpbnRlbmFuY2UiLCAiQ2hpbGRjYXJlICYgSW5zdHJ1Y3Rpb24iLAogICJNYXNzIE1lZGlhIiwgIlNwb3J0cyAmIEV4ZXJjaXNlIiwgIkhvYmJpZXMgJiBHYW1lcyIsCiAgIlNvY2lhbGl6aW5nICYgQ29tbXVuaWNhdGlvbiIKICApCgp5b3V0aF9zdW1tYXJ5IDwtIHRpbWV1c2VfZGYgJT4lCiAgZmlsdGVyKGFnZSA+PSA2ICYgYWdlIDw9IDI0LCBhY3Rpdml0eSAlaW4lIHlvdXRoX2FjdGl2aXRpZXMsIGdlbmRlciAlaW4lIGMoJ21hbGUnLCAnZmVtYWxlJykpICU+JQogIGdyb3VwX2J5KHBlcnNvbl9pZCwgYWdlLCBnZW5kZXIsIGFjdGl2aXR5LCBtdWx0KSAlPiUKICBzdW1tYXJpc2UodG90YWxfZHVyYXRpb24gPSBzdW0oZHVyYXRpb25fbWlucywgbmEucm0gPSBUUlVFKSwgLmdyb3VwcyA9ICJkcm9wIikgJT4lCiAgZ3JvdXBfYnkoYWdlLCBnZW5kZXIsIGFjdGl2aXR5KSAlPiUKICBzdW1tYXJpc2UoYXZnX2hvdXJzID0gd2VpZ2h0ZWQubWVhbih0b3RhbF9kdXJhdGlvbiwgdyA9IG11bHQsIG5hLnJtID0gVFJVRSkgLyA2MCwgLmdyb3VwcyA9ICJkcm9wIikKCmdncGxvdCh5b3V0aF9zdW1tYXJ5LCBhZXMoeCA9IGFnZSwgeSA9IGF2Z19ob3VycywgY29sb3IgPSBnZW5kZXIpKSArCiAgZ2VvbV9zbW9vdGgoc2UgPSBGQUxTRSwgc2l6ZSA9IDEuMikgKwogIGZhY2V0X3dyYXAofiBhY3Rpdml0eSwgc2NhbGVzID0gImZyZWUiLCBuY29sID0gMykgKyAKICAKICBzY2FsZV9jb2xvcl9tYW51YWwobmFtZSA9ICJHZW5kZXIiLCB2YWx1ZXMgPSBjKCJmZW1hbGUiID0gIiMwMDcyQjIiLCAibWFsZSIgPSAiI0Q1NUUwMCIpKSArCiAgbGFicygKICAgIHRpdGxlID0gIkF2ZXJhZ2UgZGFpbHkgaG91cnMgc3BlbnQgb24ga2V5IGFjdGl2aXRpZXMgZm9yIGFnZXMgNi0yNCwgYnkgZ2VuZGVyIiwKICAgIHggPSAiQWdlICh5ZWFycykiLAogICAgeSA9ICJBdmVyYWdlIEhvdXJzIFBlciBEYXkiLAogICAgY2FwdGlvbiA9ICJTb3VyY2U6IE1vU1BJIFRpbWUgVXNlIFN1cnZleSwgMjAyNCIKICApICsKICB0aGVtZV9taW5pbWFsKGJhc2VfZmFtaWx5ID0gImF0aCIpICsKICB0aGVtZSgKICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoZmFjZSA9ICJib2xkIiwgc2l6ZSA9IDIwLCBtYXJnaW4gPSBtYXJnaW4oYiA9IDEwKSksCiAgICBwbG90LnN1YnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCwgY29sb3IgPSAiZ3JheTQwIiwgbWFyZ2luID0gbWFyZ2luKGIgPSAyMCkpLAogICAgc3RyaXAudGV4dCA9IGVsZW1lbnRfdGV4dChmYWNlID0gImJvbGQiLCBzaXplID0gMTEsIGhqdXN0ID0gMCksCiAgICBsZWdlbmQucG9zaXRpb24gPSAidG9wIiwKICAgIHBhbmVsLnNwYWNpbmcgPSB1bml0KDEuNSwgImxpbmVzIikKICApICsKdGhlbWVfZml2ZXRoaXJ0eWVpZ2h0KCkgKwogIAogIHRoZW1lKAogICAgdGV4dCA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSAiYXRoIiksCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KAogICAgICBmYW1pbHkgPSAiYXRoIiwKICAgICAgc2l6ZSA9IDIwLAogICAgICBtYXJnaW4gPSBtYXJnaW4oYiA9IDEwKQogICAgKSwKICAgIHBsb3Quc3VidGl0bGUgPSBlbGVtZW50X3RleHQoCiAgICAgIGZhbWlseSA9ICJhdGgiLAogICAgICBzaXplID0gMTQsCiAgICAgIG1hcmdpbiA9IG1hcmdpbihiID0gMjApLAogICAgICBjb2xvciA9ICJncmF5NDAiCiAgICApLAogICAgcGxvdC5jYXB0aW9uID0gZWxlbWVudF90ZXh0KAogICAgICBmYW1pbHkgPSAiYXRoIiwKICAgICAgc2l6ZSA9IDEwLAogICAgICBjb2xvciA9ICJncmF5NTAiLAogICAgICBtYXJnaW4gPSBtYXJnaW4odCA9IDIwKQogICAgKSwKICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gImF0aCIsIHNpemUgPSAxMiksCiAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gImF0aCIsIHNpemUgPSAxMSksCiAgICBwbG90Lm1hcmdpbiA9IG1hcmdpbigxNSwgMTUsIDEwLCAxNSksCiAgICAKICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iLAogICAgbGVnZW5kLmRpcmVjdGlvbiA9ICJob3Jpem9udGFsIiwKICAgIGxlZ2VuZC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAidHJhbnNwYXJlbnQiKSwKICAgIGxlZ2VuZC5rZXkgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ0cmFuc3BhcmVudCIsIGNvbG9yID0gTkEpLAogICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF9ibGFuaygpLAogICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0LCBmYW1pbHkgPSAiYXRoIikKICApCmBgYAoK