1 Reading in packages

rm(list=ls())
library(tidyverse)
library(ggplot2)
library(ggpubr)
library()

2 Reading in data

load(file="H:/processed_data/df_mmfc.rda")

df_mmfc$t2 <- df_mmfc$t^2
df_mmfc$t3 <- df_mmfc$t^3
df_mmfc$t4 <- df_mmfc$t^4
df_mmfc$t5 <- df_mmfc$t^5
df_mmfc$t6 <- df_mmfc$t^6

levels(as.factor(df_mmfc$phd_disci))
summary(as.factor(df_mmfc$phd_disci))

df_mmfc$phd_disci <- factor(df_mmfc$phd_disci, levels=c("Health sciences", "Social sciences", "Natural sciences and mathematics", "Engineering", "Humanities", "Agriculture and animal sciences"))

df_mmfc <- df_mmfc %>% 
  mutate(gender = ifelse(gender==1, "men", "women"))

df_mmfc$gender <- factor(df_mmfc$gender, levels=c("men", "women"))


# Overall
load(file="F:/GPE_salaris/results/overall/log_hrs/M0.rda")
load(file="F:/GPE_salaris/results/overall/log_hrs/M1.rda")
load(file="F:/GPE_salaris/results/overall/log_hrs/M2.rda")

# By gender
load(file="F:/GPE_salaris/results/bygender/log_hrs/M0m.rda")
load(file="F:/GPE_salaris/results/bygender/log_hrs/M1m.rda")
load(file="F:/GPE_salaris/results/bygender/log_hrs/M2m.rda")
load(file="F:/GPE_salaris/results/bygender/log_hrs/M0w.rda")
load(file="F:/GPE_salaris/results/bygender/log_hrs/M1w.rda")
load(file="F:/GPE_salaris/results/bygender/log_hrs/M2w.rda")

3 colors

mnc <- "#e49159" 
mtc <- "#bd5600" 
wnc <- "#519adb" 
wtc <- "#00427a" 

mc <- "#D1742D"
wc <- "#296EAB"

mo <- "#EDA150"
wo <- "#609DD4"
mn <- "#964822"
wn <- "#194469"

4 Salaries

5 Plot for M1

Salary differences over time per gender

df_mmfc %>%
  group_by(gender, t) %>%
  summarize(meanpay = mean(realpay_corr2),
            n = n()) %>%
  ungroup() -> fig1


write.csv(fig1, file="F:/GPE_salaris/R&R_v2/datafig1.csv")
fig1 <- read.csv(file="datafig1.csv")

We cannot derive the box plots here, because they require the original data, but we can replicate the line plots of the average inflation-corrected pay for men and women.

ggplot() +
  # geom_boxplot(data=df_mmfc, aes(x=as.factor(t), y=realpay_corr2), alpha=0.2, size=0.4, width=0.4, outlier.shape=NA, fill="grey95") +
  geom_line(data=fig1, aes(x=as.factor(t), y=meanpay, color=gender, group=gender), size=1.5) +
  labs(y="Mean inflation-corrected pay", x="Time in years since PhD") +
  scale_color_manual(values=c(mc, wc), name="Gender") +
  scale_x_discrete(breaks=c(0,5,10,15)) +
  ylim(0, 20000) +
  theme_minimal() +
  theme(legend.position = "right",
        axis.text=element_text(size=11),
        axis.title = element_text(size=11, face="bold"),
        legend.title = element_text(size=11, face="bold"),
        legend.text = element_text(size=11),
        panel.grid.minor.x = element_blank(),
        panel.grid.major.x = element_blank())
## 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.

6 Plot for M2

Salary split out by gender and transition status

df_mmfc %>%
  mutate(evertrans = ifelse(trans_lt_b>0, 1, 0)) %>%
  group_by(gender, t, evertrans) %>%
  summarize(meanpay = mean(realpay_corr2),
            n = n()) %>%
  ungroup() -> fig2

fig2$grouping <- as.factor(paste0(str_to_title(fig2$gender), " - ", ifelse(fig2$evertrans==1, "Will transition", "Will not transition")))
fig2$grouping <- factor(fig2$grouping, levels=c("Men - Will not transition", "Men - Will transition", "Women - Will not transition", "Women - Will transition"))

write.csv(fig2, file="F:/GPE_salaris/R&R_v2/datafig2.csv")
fig2 <- read.csv(file="datafig2.csv")
ggplot() +
  #geom_boxplot(data=df_mmfc, aes(x=as.factor(t), y=realpay_corr2), alpha=0.2, size=0.4, width=0.4, outlier.shape=NA, fill="grey95") +
  geom_line(data=fig2, aes(x=as.factor(t), y=meanpay, color=grouping, group=grouping), size=1, alpha=0.95) +
  labs(y="Mean inflation-corrected pay", x="Time in years since PhD") +
  scale_color_manual(values=c(mnc, mtc, wnc, wtc), name="") +
  scale_x_discrete(breaks=c(0,5,10,15)) +
  ylim(0, 20000) +
  theme_minimal() +
  theme(legend.position = "inside",
        legend.position.inside = c(0.2, 0.9),
        legend.box.background = element_rect(fill="white", colour = "white"),
        legend.direction = "vertical",
        axis.text=element_text(size=11),
        axis.title = element_text(size=11, face="bold"),
        legend.title = element_text(size=11, face="bold"),
        legend.text = element_text(size=11),
        panel.grid.minor.x = element_blank(),
        panel.grid.major.x = element_blank())

7 Appendix: Higher order transition effects

7.1 Graphical comparison original versus transition*t2/t3 model

load(file="H:/processed_data/df_mmfc.rda")

df_mmfc$t2 <- df_mmfc$t^2
df_mmfc$t3 <- df_mmfc$t^3
df_mmfc$t4 <- df_mmfc$t^4
df_mmfc$t5 <- df_mmfc$t^5
df_mmfc$t6 <- df_mmfc$t^6

levels(as.factor(df_mmfc$phd_disci))
summary(as.factor(df_mmfc$phd_disci))

df_mmfc$phd_disci <- factor(df_mmfc$phd_disci, levels=c("Health sciences", "Social sciences", "Natural sciences and mathematics", "Engineering", "Humanities", "Agriculture and animal sciences"))

df_mmfc <- df_mmfc %>% 
  mutate(gender = ifelse(gender==1, "men", "women"))

df_mmfc$gender <- factor(df_mmfc$gender, levels=c("men", "women"))

df_mmfc$temporary_emp <- haven::zap_labels(df_mmfc$temporary_emp)

df_men <- df_mmfc %>% filter(gender=="men")
df_wom <- df_mmfc %>% filter(gender=="women")

load(file="F:/GPE_salaris/results/bygender/log_hrs/M2m.rda")
load(file="F:/GPE_salaris/results/bygender/log_hrs/M2w.rda")
load(file="F:/GPE_salaris/results/bygender/log_hrs/R7_M2m.rda")
load(file="F:/GPE_salaris/results/bygender/log_hrs/R7_M2w.rda")


# Check in which years people transition
df_mmfc %>% filter(trans_st==1) -> will_trans

summary(as.factor(will_trans$t))
# median transition year = 3


# Select: transition in year 3,4,5
df_men %>% 
  filter(trans_st==1 & t>2 & t<6) -> men_sel

df_wom %>% 
  filter(trans_st==1 & t>2 & t<6) -> wom_sel
f3_ori_w <- as.data.frame(predict(M2w, newdata=df_wom, se.fit=TRUE))
f3_ori_m <- as.data.frame(predict(M2m, newdata=df_men, se.fit=TRUE))
f3_new_w <- as.data.frame(predict(R7_M2w, newdata=df_wom, se.fit=TRUE))
f3_new_m <- as.data.frame(predict(R7_M2m, newdata=df_men, se.fit=TRUE))

f3_ori_w$RINPERSOON <- df_wom$RINPERSOON
f3_ori_m$RINPERSOON <- df_men$RINPERSOON
f3_new_w$RINPERSOON <- df_wom$RINPERSOON
f3_new_m$RINPERSOON <- df_men$RINPERSOON

f3_ori_w$t <- df_wom$t
f3_ori_w$t2 <- df_wom$t2
f3_ori_w$t3 <- df_wom$t3
f3_ori_w$trans_lt <- df_wom$trans_lt
f3_ori_w$trans_st <- df_wom$trans_st
f3_ori_w$lower <- exp(f3_ori_w$fit - 1.96*f3_ori_w$se.fit)
f3_ori_w$upper <- exp(f3_ori_w$fit + 1.96*f3_ori_w$se.fit)
f3_ori_w$salary <- exp(f3_ori_w$fit)



f3_ori_m$t <- df_men$t
f3_ori_m$t2 <- df_men$t2
f3_ori_m$t3 <- df_men$t3
f3_ori_m$trans_lt <- df_men$trans_lt
f3_ori_m$trans_st <- df_men$trans_st
f3_ori_m$lower <- exp(f3_ori_m$fit - 1.96*f3_ori_m$se.fit)
f3_ori_m$upper <- exp(f3_ori_m$fit + 1.96*f3_ori_m$se.fit)
f3_ori_m$salary <- exp(f3_ori_m$fit)


f3_new_w$t <- df_wom$t
f3_new_w$t2 <- df_wom$t2
f3_new_w$t3 <- df_wom$t3
f3_new_w$trans_lt <- df_wom$trans_lt
f3_new_w$trans_st <- df_wom$trans_st
f3_new_w$lower <- exp(f3_new_w$fit - 1.96*f3_new_w$se.fit)
f3_new_w$upper <- exp(f3_new_w$fit + 1.96*f3_new_w$se.fit)
f3_new_w$salary <- exp(f3_new_w$fit)


f3_new_m$t <- df_men$t
f3_new_m$t2 <- df_men$t2
f3_new_m$t3 <- df_men$t3
f3_new_m$trans_lt <- df_men$trans_lt
f3_new_m$trans_st <- df_men$trans_st
f3_new_m$lower <- exp(f3_new_m$fit - 1.96*f3_new_m$se.fit)
f3_new_m$upper <- exp(f3_new_m$fit + 1.96*f3_new_m$se.fit)
f3_new_m$salary <- exp(f3_new_m$fit)

f3_ori_w <- f3_ori_w[f3_ori_w$RINPERSOON%in%wom_sel$RINPERSOON,]
f3_ori_m <- f3_ori_m[f3_ori_m$RINPERSOON%in%men_sel$RINPERSOON,]
f3_new_w <- f3_new_w[f3_new_w$RINPERSOON%in%wom_sel$RINPERSOON,]
f3_new_m <- f3_new_m[f3_new_m$RINPERSOON%in%men_sel$RINPERSOON,]

# adding variable with t at transition (transition time variable), gender
# select only up to time 15, to maintain big enough sample
f3_ori_w %>%
  filter(trans_st>0) %>%
  mutate(trans_y = t) %>%
  select(RINPERSOON, trans_y) %>%
  right_join(f3_ori_w, by="RINPERSOON") %>%
  mutate(gender="women",
         model = "original") -> fig3_wo

f3_ori_m %>%
  filter(trans_st>0) %>%
  mutate(trans_y = t) %>%
  select(RINPERSOON, trans_y) %>%
  right_join(f3_ori_m, by="RINPERSOON") %>%
  mutate(gender="men",
         model = "original") -> fig3_mo

f3_new_w %>%
  filter(trans_st>0) %>%
  mutate(trans_y = t) %>%
  select(RINPERSOON, trans_y) %>%
  right_join(f3_new_w, by="RINPERSOON") %>%
  mutate(gender="women",
         model = "extended") -> fig3_wn

f3_new_m %>%
  filter(trans_st>0) %>%
  mutate(trans_y = t) %>%
  select(RINPERSOON, trans_y) %>%
  right_join(f3_new_m, by="RINPERSOON") %>%
  mutate(gender="men",
         model = "extended") -> fig3_mn



rbind.data.frame(fig3_wo, fig3_mo) -> fig3_1
rbind.data.frame(fig3_wn, fig3_mn) -> fig3_2
rbind.data.frame(fig3_1, fig3_2) -> fig3

rm(fig3_wo, fig3_mo, fig3_wn, fig3_mn, fig3_1, fig3_2)


fig3 %>%
  filter(t<16) %>%
  group_by(gender, model, t) %>%
  summarise(salary = mean(salary),
            lower = mean(lower),
            upper = mean(upper),
            n = n(),
            .groups = "drop") -> fig3_summ

write.csv(fig3_summ, file="F:/GPE_salaris/R&R_v2/datafig3.csv")
fig3_summ <- read.csv(file="datafig3.csv", header=TRUE, check.names = FALSE)

fig3_summ %>% select(gender, model, t, salary, lower, upper, n) -> fig3_summ

fig3_summ %>% filter(gender=="men") -> fig3_summ_m
fig3_summ %>% filter(gender=="women") -> fig3_summ_w

fig3_summ %>% filter(gender=="men" & model=="original") -> fig3_summ_mo
fig3_summ %>% filter(gender=="women" & model=="original") -> fig3_summ_wo
fig3_summ %>% filter(gender=="men" & model=="extended") -> fig3_summ_mn
fig3_summ %>% filter(gender=="women" & model=="extended") -> fig3_summ_wn

Men

fig3a <- ggplot(fig3_summ_m, aes(x=t, y=salary, color=model, fill=model, linetype=model)) +
  geom_line(size=1) +
  geom_errorbar(aes(ymin=lower, ymax=upper), lwd=.4, alpha=.35, width=0) +
  labs(x = "Time in years since PhD", y = "Predicted mean salary", color="Model", linetype="Model") +
  scale_color_manual(values=c("original"=mo, "extended"=mn)) +
  scale_linetype_manual(values=c("extended"="solid", "original"="dashed")) +
  scale_x_continuous(breaks=c(0,5,10,15)) +
  ylim(0, 13000) +
  theme_minimal() +
   theme(axis.text=element_text(size=11),
        axis.title = element_text(size=11, face="bold"),
        legend.title = element_text(size=11, face="bold"),
        legend.text = element_text(size=11),
        panel.grid.minor.x = element_blank(),
        panel.grid.major.x = element_blank())

Women

fig3b <- ggplot(fig3_summ_w, aes(x=t, y=salary, color=model, fill=model, linetype=model)) +
  geom_line(size=1) +
  geom_errorbar(aes(ymin=lower, ymax=upper), lwd=.4, alpha=.35, width=0) +
  labs(x = "Time in years since PhD", y = "Predicted mean salary", color="Model", linetype="Model")+
  scale_color_manual(values=c("extended"=wn, "original"=wo)) +
  scale_linetype_manual(values=c("extended"="solid", "original"="dashed")) +
  scale_x_continuous(breaks=c(0,5,10,15)) +
  ylim(0, 13000) +
  theme_minimal() +
  theme(axis.text=element_text(size=11),
        axis.title = element_text(size=11, face="bold"),
        legend.title = element_text(size=11, face="bold"),
        legend.text = element_text(size=11),
        panel.grid.minor.x = element_blank(),
        panel.grid.major.x = element_blank())
fig3a

fig3b

7.2 all four together

ggplot(fig3_summ_wo, aes(x=t, y=salary)) +
  geom_line(size=1, color=wo) +
  geom_errorbar(aes(ymin=lower, ymax=upper), lwd=.4, alpha=.35, width=0) +
  labs(x = "Time in years since PhD", y = "Predicted mean salary")+
  scale_x_continuous(breaks=c(0,5,10,15)) +
  ylim(0, 13000) +
  theme_minimal() +
  theme(axis.text=element_text(size=10),
        axis.title = element_text(size=10),
        panel.grid.minor.x = element_blank(),
        panel.grid.major.x = element_blank()) -> wom_ori
  

ggplot(fig3_summ_mo, aes(x=t, y=salary)) +
  geom_line(size=1, color=mo) +
  geom_errorbar(aes(ymin=lower, ymax=upper), lwd=.4, alpha=.35, width=0) +
  labs(x = "Time in years since PhD", y = "Predicted mean salary")+
  scale_x_continuous(breaks=c(0,5,10,15)) +
  ylim(0, 13000) +
  theme_minimal() +
  theme(axis.text=element_text(size=10),
        axis.title = element_text(size=10),
        panel.grid.minor.x = element_blank(),
        panel.grid.major.x = element_blank()) -> men_ori
  
ggplot(fig3_summ_wn, aes(x=t, y=salary)) +
  geom_line(size=1, color=wn) +
  geom_errorbar(aes(ymin=lower, ymax=upper), lwd=.4, alpha=.35, width=0) +
  labs(x = "Time in years since PhD", y = "Predicted mean salary")+
  scale_x_continuous(breaks=c(0,5,10,15)) +
  ylim(0, 13000) +
  theme_minimal() +
  theme(axis.text=element_text(size=10),
        axis.title = element_text(size=10),
        panel.grid.minor.x = element_blank(),
        panel.grid.major.x = element_blank()) -> wom_new
  
ggplot(fig3_summ_mn, aes(x=t, y=salary)) +
  geom_line(size=1, color=mn) +
  geom_errorbar(aes(ymin=lower, ymax=upper), lwd=.4, alpha=.35, width=0) +
  labs(x = "Time in years since PhD", y = "Predicted mean salary")+
  scale_x_continuous(breaks=c(0,5,10,15)) +
  ylim(0, 13000) +
  theme_minimal() +
  theme(axis.text=element_text(size=10),
        axis.title = element_text(size=10),
        panel.grid.minor.x = element_blank(),
        panel.grid.major.x = element_blank()) -> men_new
  

ggpubr::ggarrange(
  wom_ori,
  wom_new,
  men_ori,
  men_new,
  ncol=2, nrow=2,
  labels=c("Women - Original", "Women - Extended", "Men - Original", "Men - Extended"),
  font.label = list(size=12, face="bold"),
  label.x = 0.6, 
  label.y = 1.01,
  hjust = 0.5
)

LS0tDQp0aXRsZTogIkxlYXZpbmcgZm9yIG1vcmUgb3Igc2V0dGxpbmcgZm9yIGxlc3M6IEZpZ3VyZXMiDQpkYXRlOiAiTGFzdCBjb21waWxlZCBvbiBgciBTeXMuRGF0ZSgpYCINCm91dHB1dDogDQogIGh0bWxfZG9jdW1lbnQ6DQogICAgY3NzOiB0d2Vha3MuY3NzDQogICAgdG9jOiAgdHJ1ZQ0KICAgIHRvY19mbG9hdDogdHJ1ZQ0KICAgIG51bWJlcl9zZWN0aW9uczogdHJ1ZQ0KICAgIGNvZGVfZm9sZGluZzogc2hvdw0KICAgIGNvZGVfZG93bmxvYWQ6IHllcw0KLS0tDQoNCg0KIyBSZWFkaW5nIGluIHBhY2thZ2VzDQoNCmBgYHtyLCBldmFsPUZBTFNFfQ0KDQpybShsaXN0PWxzKCkpDQoNCmBgYA0KDQoNCmBgYHtyLCBldmFsPUZBTFNFfQ0KDQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkoZ2dwdWJyKQ0KbGlicmFyeSgpDQoNCmBgYA0KDQoNCiMgUmVhZGluZyBpbiBkYXRhDQoNCmBgYHtyLCBldmFsPUZBTFNFfQ0KDQpsb2FkKGZpbGU9Ikg6L3Byb2Nlc3NlZF9kYXRhL2RmX21tZmMucmRhIikNCg0KZGZfbW1mYyR0MiA8LSBkZl9tbWZjJHReMg0KZGZfbW1mYyR0MyA8LSBkZl9tbWZjJHReMw0KZGZfbW1mYyR0NCA8LSBkZl9tbWZjJHReNA0KZGZfbW1mYyR0NSA8LSBkZl9tbWZjJHReNQ0KZGZfbW1mYyR0NiA8LSBkZl9tbWZjJHReNg0KDQpsZXZlbHMoYXMuZmFjdG9yKGRmX21tZmMkcGhkX2Rpc2NpKSkNCnN1bW1hcnkoYXMuZmFjdG9yKGRmX21tZmMkcGhkX2Rpc2NpKSkNCg0KZGZfbW1mYyRwaGRfZGlzY2kgPC0gZmFjdG9yKGRmX21tZmMkcGhkX2Rpc2NpLCBsZXZlbHM9YygiSGVhbHRoIHNjaWVuY2VzIiwgIlNvY2lhbCBzY2llbmNlcyIsICJOYXR1cmFsIHNjaWVuY2VzIGFuZCBtYXRoZW1hdGljcyIsICJFbmdpbmVlcmluZyIsICJIdW1hbml0aWVzIiwgIkFncmljdWx0dXJlIGFuZCBhbmltYWwgc2NpZW5jZXMiKSkNCg0KZGZfbW1mYyA8LSBkZl9tbWZjICU+JSANCiAgbXV0YXRlKGdlbmRlciA9IGlmZWxzZShnZW5kZXI9PTEsICJtZW4iLCAid29tZW4iKSkNCg0KZGZfbW1mYyRnZW5kZXIgPC0gZmFjdG9yKGRmX21tZmMkZ2VuZGVyLCBsZXZlbHM9YygibWVuIiwgIndvbWVuIikpDQoNCg0KIyBPdmVyYWxsDQpsb2FkKGZpbGU9IkY6L0dQRV9zYWxhcmlzL3Jlc3VsdHMvb3ZlcmFsbC9sb2dfaHJzL00wLnJkYSIpDQpsb2FkKGZpbGU9IkY6L0dQRV9zYWxhcmlzL3Jlc3VsdHMvb3ZlcmFsbC9sb2dfaHJzL00xLnJkYSIpDQpsb2FkKGZpbGU9IkY6L0dQRV9zYWxhcmlzL3Jlc3VsdHMvb3ZlcmFsbC9sb2dfaHJzL00yLnJkYSIpDQoNCiMgQnkgZ2VuZGVyDQpsb2FkKGZpbGU9IkY6L0dQRV9zYWxhcmlzL3Jlc3VsdHMvYnlnZW5kZXIvbG9nX2hycy9NMG0ucmRhIikNCmxvYWQoZmlsZT0iRjovR1BFX3NhbGFyaXMvcmVzdWx0cy9ieWdlbmRlci9sb2dfaHJzL00xbS5yZGEiKQ0KbG9hZChmaWxlPSJGOi9HUEVfc2FsYXJpcy9yZXN1bHRzL2J5Z2VuZGVyL2xvZ19ocnMvTTJtLnJkYSIpDQpsb2FkKGZpbGU9IkY6L0dQRV9zYWxhcmlzL3Jlc3VsdHMvYnlnZW5kZXIvbG9nX2hycy9NMHcucmRhIikNCmxvYWQoZmlsZT0iRjovR1BFX3NhbGFyaXMvcmVzdWx0cy9ieWdlbmRlci9sb2dfaHJzL00xdy5yZGEiKQ0KbG9hZChmaWxlPSJGOi9HUEVfc2FsYXJpcy9yZXN1bHRzL2J5Z2VuZGVyL2xvZ19ocnMvTTJ3LnJkYSIpDQoNCmBgYA0KDQoNCiMgY29sb3JzIA0KDQpgYGB7cn0NCg0KbW5jIDwtICIjZTQ5MTU5IiANCm10YyA8LSAiI2JkNTYwMCIgDQp3bmMgPC0gIiM1MTlhZGIiIA0Kd3RjIDwtICIjMDA0MjdhIiANCg0KbWMgPC0gIiNEMTc0MkQiDQp3YyA8LSAiIzI5NkVBQiINCg0KbW8gPC0gIiNFREExNTAiDQp3byA8LSAiIzYwOURENCINCm1uIDwtICIjOTY0ODIyIg0Kd24gPC0gIiMxOTQ0NjkiDQoNCg0KYGBgDQoNCg0KIyBTYWxhcmllcw0KDQoNCiMgUGxvdCBmb3IgTTEgDQoNClNhbGFyeSBkaWZmZXJlbmNlcyBvdmVyIHRpbWUgcGVyIGdlbmRlcg0KDQoNCmBgYHtyLCBldmFsPUZBTFNFfQ0KDQpkZl9tbWZjICU+JQ0KICBncm91cF9ieShnZW5kZXIsIHQpICU+JQ0KICBzdW1tYXJpemUobWVhbnBheSA9IG1lYW4ocmVhbHBheV9jb3JyMiksDQogICAgICAgICAgICBuID0gbigpKSAlPiUNCiAgdW5ncm91cCgpIC0+IGZpZzENCg0KDQp3cml0ZS5jc3YoZmlnMSwgZmlsZT0iRjovR1BFX3NhbGFyaXMvUiZSX3YyL2RhdGFmaWcxLmNzdiIpDQoNCmBgYA0KDQoNCmBgYHtyfQ0KDQpmaWcxIDwtIHJlYWQuY3N2KGZpbGU9ImRhdGFmaWcxLmNzdiIpDQoNCmBgYA0KDQoNCg0KV2UgY2Fubm90IGRlcml2ZSB0aGUgYm94IHBsb3RzIGhlcmUsIGJlY2F1c2UgdGhleSByZXF1aXJlIHRoZSBvcmlnaW5hbCBkYXRhLCBidXQgd2UgY2FuIHJlcGxpY2F0ZSB0aGUgbGluZSBwbG90cyBvZiB0aGUgYXZlcmFnZSBpbmZsYXRpb24tY29ycmVjdGVkIHBheSBmb3IgbWVuIGFuZCB3b21lbi4NCg0KDQpgYGB7cn0NCg0KZ2dwbG90KCkgKw0KICAjIGdlb21fYm94cGxvdChkYXRhPWRmX21tZmMsIGFlcyh4PWFzLmZhY3Rvcih0KSwgeT1yZWFscGF5X2NvcnIyKSwgYWxwaGE9MC4yLCBzaXplPTAuNCwgd2lkdGg9MC40LCBvdXRsaWVyLnNoYXBlPU5BLCBmaWxsPSJncmV5OTUiKSArDQogIGdlb21fbGluZShkYXRhPWZpZzEsIGFlcyh4PWFzLmZhY3Rvcih0KSwgeT1tZWFucGF5LCBjb2xvcj1nZW5kZXIsIGdyb3VwPWdlbmRlciksIHNpemU9MS41KSArDQogIGxhYnMoeT0iTWVhbiBpbmZsYXRpb24tY29ycmVjdGVkIHBheSIsIHg9IlRpbWUgaW4geWVhcnMgc2luY2UgUGhEIikgKw0KICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzPWMobWMsIHdjKSwgbmFtZT0iR2VuZGVyIikgKw0KICBzY2FsZV94X2Rpc2NyZXRlKGJyZWFrcz1jKDAsNSwxMCwxNSkpICsNCiAgeWxpbSgwLCAyMDAwMCkgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAicmlnaHQiLA0KICAgICAgICBheGlzLnRleHQ9ZWxlbWVudF90ZXh0KHNpemU9MTEpLA0KICAgICAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEsIGZhY2U9ImJvbGQiKSwNCiAgICAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEsIGZhY2U9ImJvbGQiKSwNCiAgICAgICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZT0xMSksDQogICAgICAgIHBhbmVsLmdyaWQubWlub3IueCA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgcGFuZWwuZ3JpZC5tYWpvci54ID0gZWxlbWVudF9ibGFuaygpKQ0KDQpgYGANCg0KDQoNCiMgUGxvdCBmb3IgTTINCg0KU2FsYXJ5IHNwbGl0IG91dCBieSBnZW5kZXIgYW5kIHRyYW5zaXRpb24gc3RhdHVzDQoNCmBgYHtyLCBldmFsPUZBTFNFfQ0KDQpkZl9tbWZjICU+JQ0KICBtdXRhdGUoZXZlcnRyYW5zID0gaWZlbHNlKHRyYW5zX2x0X2I+MCwgMSwgMCkpICU+JQ0KICBncm91cF9ieShnZW5kZXIsIHQsIGV2ZXJ0cmFucykgJT4lDQogIHN1bW1hcml6ZShtZWFucGF5ID0gbWVhbihyZWFscGF5X2NvcnIyKSwNCiAgICAgICAgICAgIG4gPSBuKCkpICU+JQ0KICB1bmdyb3VwKCkgLT4gZmlnMg0KDQpmaWcyJGdyb3VwaW5nIDwtIGFzLmZhY3RvcihwYXN0ZTAoc3RyX3RvX3RpdGxlKGZpZzIkZ2VuZGVyKSwgIiAtICIsIGlmZWxzZShmaWcyJGV2ZXJ0cmFucz09MSwgIldpbGwgdHJhbnNpdGlvbiIsICJXaWxsIG5vdCB0cmFuc2l0aW9uIikpKQ0KZmlnMiRncm91cGluZyA8LSBmYWN0b3IoZmlnMiRncm91cGluZywgbGV2ZWxzPWMoIk1lbiAtIFdpbGwgbm90IHRyYW5zaXRpb24iLCAiTWVuIC0gV2lsbCB0cmFuc2l0aW9uIiwgIldvbWVuIC0gV2lsbCBub3QgdHJhbnNpdGlvbiIsICJXb21lbiAtIFdpbGwgdHJhbnNpdGlvbiIpKQ0KDQp3cml0ZS5jc3YoZmlnMiwgZmlsZT0iRjovR1BFX3NhbGFyaXMvUiZSX3YyL2RhdGFmaWcyLmNzdiIpDQoNCg0KYGBgDQoNCg0KDQpgYGB7cn0NCg0KZmlnMiA8LSByZWFkLmNzdihmaWxlPSJkYXRhZmlnMi5jc3YiKQ0KDQpgYGANCg0KDQoNCmBgYHtyfQ0KDQpnZ3Bsb3QoKSArDQogICNnZW9tX2JveHBsb3QoZGF0YT1kZl9tbWZjLCBhZXMoeD1hcy5mYWN0b3IodCksIHk9cmVhbHBheV9jb3JyMiksIGFscGhhPTAuMiwgc2l6ZT0wLjQsIHdpZHRoPTAuNCwgb3V0bGllci5zaGFwZT1OQSwgZmlsbD0iZ3JleTk1IikgKw0KICBnZW9tX2xpbmUoZGF0YT1maWcyLCBhZXMoeD1hcy5mYWN0b3IodCksIHk9bWVhbnBheSwgY29sb3I9Z3JvdXBpbmcsIGdyb3VwPWdyb3VwaW5nKSwgc2l6ZT0xLCBhbHBoYT0wLjk1KSArDQogIGxhYnMoeT0iTWVhbiBpbmZsYXRpb24tY29ycmVjdGVkIHBheSIsIHg9IlRpbWUgaW4geWVhcnMgc2luY2UgUGhEIikgKw0KICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzPWMobW5jLCBtdGMsIHduYywgd3RjKSwgbmFtZT0iIikgKw0KICBzY2FsZV94X2Rpc2NyZXRlKGJyZWFrcz1jKDAsNSwxMCwxNSkpICsNCiAgeWxpbSgwLCAyMDAwMCkgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiaW5zaWRlIiwNCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uLmluc2lkZSA9IGMoMC4yLCAwLjkpLA0KICAgICAgICBsZWdlbmQuYm94LmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbD0id2hpdGUiLCBjb2xvdXIgPSAid2hpdGUiKSwNCiAgICAgICAgbGVnZW5kLmRpcmVjdGlvbiA9ICJ2ZXJ0aWNhbCIsDQogICAgICAgIGF4aXMudGV4dD1lbGVtZW50X3RleHQoc2l6ZT0xMSksDQogICAgICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0xMSwgZmFjZT0iYm9sZCIpLA0KICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0xMSwgZmFjZT0iYm9sZCIpLA0KICAgICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplPTExKSwNCiAgICAgICAgcGFuZWwuZ3JpZC5taW5vci54ID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBwYW5lbC5ncmlkLm1ham9yLnggPSBlbGVtZW50X2JsYW5rKCkpDQoNCmBgYA0KDQoNCg0KIyBBcHBlbmRpeDogSGlnaGVyIG9yZGVyIHRyYW5zaXRpb24gZWZmZWN0cw0KDQoNCiMjIEdyYXBoaWNhbCBjb21wYXJpc29uIG9yaWdpbmFsIHZlcnN1cyB0cmFuc2l0aW9uKnQyL3QzIG1vZGVsDQoNCmBgYHtyLCBldmFsPUZBTFNFfQ0KDQpsb2FkKGZpbGU9Ikg6L3Byb2Nlc3NlZF9kYXRhL2RmX21tZmMucmRhIikNCg0KZGZfbW1mYyR0MiA8LSBkZl9tbWZjJHReMg0KZGZfbW1mYyR0MyA8LSBkZl9tbWZjJHReMw0KZGZfbW1mYyR0NCA8LSBkZl9tbWZjJHReNA0KZGZfbW1mYyR0NSA8LSBkZl9tbWZjJHReNQ0KZGZfbW1mYyR0NiA8LSBkZl9tbWZjJHReNg0KDQpsZXZlbHMoYXMuZmFjdG9yKGRmX21tZmMkcGhkX2Rpc2NpKSkNCnN1bW1hcnkoYXMuZmFjdG9yKGRmX21tZmMkcGhkX2Rpc2NpKSkNCg0KZGZfbW1mYyRwaGRfZGlzY2kgPC0gZmFjdG9yKGRmX21tZmMkcGhkX2Rpc2NpLCBsZXZlbHM9YygiSGVhbHRoIHNjaWVuY2VzIiwgIlNvY2lhbCBzY2llbmNlcyIsICJOYXR1cmFsIHNjaWVuY2VzIGFuZCBtYXRoZW1hdGljcyIsICJFbmdpbmVlcmluZyIsICJIdW1hbml0aWVzIiwgIkFncmljdWx0dXJlIGFuZCBhbmltYWwgc2NpZW5jZXMiKSkNCg0KZGZfbW1mYyA8LSBkZl9tbWZjICU+JSANCiAgbXV0YXRlKGdlbmRlciA9IGlmZWxzZShnZW5kZXI9PTEsICJtZW4iLCAid29tZW4iKSkNCg0KZGZfbW1mYyRnZW5kZXIgPC0gZmFjdG9yKGRmX21tZmMkZ2VuZGVyLCBsZXZlbHM9YygibWVuIiwgIndvbWVuIikpDQoNCmRmX21tZmMkdGVtcG9yYXJ5X2VtcCA8LSBoYXZlbjo6emFwX2xhYmVscyhkZl9tbWZjJHRlbXBvcmFyeV9lbXApDQoNCmRmX21lbiA8LSBkZl9tbWZjICU+JSBmaWx0ZXIoZ2VuZGVyPT0ibWVuIikNCmRmX3dvbSA8LSBkZl9tbWZjICU+JSBmaWx0ZXIoZ2VuZGVyPT0id29tZW4iKQ0KDQpsb2FkKGZpbGU9IkY6L0dQRV9zYWxhcmlzL3Jlc3VsdHMvYnlnZW5kZXIvbG9nX2hycy9NMm0ucmRhIikNCmxvYWQoZmlsZT0iRjovR1BFX3NhbGFyaXMvcmVzdWx0cy9ieWdlbmRlci9sb2dfaHJzL00ydy5yZGEiKQ0KbG9hZChmaWxlPSJGOi9HUEVfc2FsYXJpcy9yZXN1bHRzL2J5Z2VuZGVyL2xvZ19ocnMvUjdfTTJtLnJkYSIpDQpsb2FkKGZpbGU9IkY6L0dQRV9zYWxhcmlzL3Jlc3VsdHMvYnlnZW5kZXIvbG9nX2hycy9SN19NMncucmRhIikNCg0KDQojIENoZWNrIGluIHdoaWNoIHllYXJzIHBlb3BsZSB0cmFuc2l0aW9uDQpkZl9tbWZjICU+JSBmaWx0ZXIodHJhbnNfc3Q9PTEpIC0+IHdpbGxfdHJhbnMNCg0Kc3VtbWFyeShhcy5mYWN0b3Iod2lsbF90cmFucyR0KSkNCiMgbWVkaWFuIHRyYW5zaXRpb24geWVhciA9IDMNCg0KDQojIFNlbGVjdDogdHJhbnNpdGlvbiBpbiB5ZWFyIDMsNCw1DQpkZl9tZW4gJT4lIA0KICBmaWx0ZXIodHJhbnNfc3Q9PTEgJiB0PjIgJiB0PDYpIC0+IG1lbl9zZWwNCg0KZGZfd29tICU+JSANCiAgZmlsdGVyKHRyYW5zX3N0PT0xICYgdD4yICYgdDw2KSAtPiB3b21fc2VsDQoNCg0KYGBgDQoNCg0KYGBge3IsIGV2YWw9RkFMU0V9DQoNCg0KZjNfb3JpX3cgPC0gYXMuZGF0YS5mcmFtZShwcmVkaWN0KE0ydywgbmV3ZGF0YT1kZl93b20sIHNlLmZpdD1UUlVFKSkNCmYzX29yaV9tIDwtIGFzLmRhdGEuZnJhbWUocHJlZGljdChNMm0sIG5ld2RhdGE9ZGZfbWVuLCBzZS5maXQ9VFJVRSkpDQpmM19uZXdfdyA8LSBhcy5kYXRhLmZyYW1lKHByZWRpY3QoUjdfTTJ3LCBuZXdkYXRhPWRmX3dvbSwgc2UuZml0PVRSVUUpKQ0KZjNfbmV3X20gPC0gYXMuZGF0YS5mcmFtZShwcmVkaWN0KFI3X00ybSwgbmV3ZGF0YT1kZl9tZW4sIHNlLmZpdD1UUlVFKSkNCg0KZjNfb3JpX3ckUklOUEVSU09PTiA8LSBkZl93b20kUklOUEVSU09PTg0KZjNfb3JpX20kUklOUEVSU09PTiA8LSBkZl9tZW4kUklOUEVSU09PTg0KZjNfbmV3X3ckUklOUEVSU09PTiA8LSBkZl93b20kUklOUEVSU09PTg0KZjNfbmV3X20kUklOUEVSU09PTiA8LSBkZl9tZW4kUklOUEVSU09PTg0KDQpmM19vcmlfdyR0IDwtIGRmX3dvbSR0DQpmM19vcmlfdyR0MiA8LSBkZl93b20kdDINCmYzX29yaV93JHQzIDwtIGRmX3dvbSR0Mw0KZjNfb3JpX3ckdHJhbnNfbHQgPC0gZGZfd29tJHRyYW5zX2x0DQpmM19vcmlfdyR0cmFuc19zdCA8LSBkZl93b20kdHJhbnNfc3QNCmYzX29yaV93JGxvd2VyIDwtIGV4cChmM19vcmlfdyRmaXQgLSAxLjk2KmYzX29yaV93JHNlLmZpdCkNCmYzX29yaV93JHVwcGVyIDwtIGV4cChmM19vcmlfdyRmaXQgKyAxLjk2KmYzX29yaV93JHNlLmZpdCkNCmYzX29yaV93JHNhbGFyeSA8LSBleHAoZjNfb3JpX3ckZml0KQ0KDQoNCg0KZjNfb3JpX20kdCA8LSBkZl9tZW4kdA0KZjNfb3JpX20kdDIgPC0gZGZfbWVuJHQyDQpmM19vcmlfbSR0MyA8LSBkZl9tZW4kdDMNCmYzX29yaV9tJHRyYW5zX2x0IDwtIGRmX21lbiR0cmFuc19sdA0KZjNfb3JpX20kdHJhbnNfc3QgPC0gZGZfbWVuJHRyYW5zX3N0DQpmM19vcmlfbSRsb3dlciA8LSBleHAoZjNfb3JpX20kZml0IC0gMS45NipmM19vcmlfbSRzZS5maXQpDQpmM19vcmlfbSR1cHBlciA8LSBleHAoZjNfb3JpX20kZml0ICsgMS45NipmM19vcmlfbSRzZS5maXQpDQpmM19vcmlfbSRzYWxhcnkgPC0gZXhwKGYzX29yaV9tJGZpdCkNCg0KDQpmM19uZXdfdyR0IDwtIGRmX3dvbSR0DQpmM19uZXdfdyR0MiA8LSBkZl93b20kdDINCmYzX25ld193JHQzIDwtIGRmX3dvbSR0Mw0KZjNfbmV3X3ckdHJhbnNfbHQgPC0gZGZfd29tJHRyYW5zX2x0DQpmM19uZXdfdyR0cmFuc19zdCA8LSBkZl93b20kdHJhbnNfc3QNCmYzX25ld193JGxvd2VyIDwtIGV4cChmM19uZXdfdyRmaXQgLSAxLjk2KmYzX25ld193JHNlLmZpdCkNCmYzX25ld193JHVwcGVyIDwtIGV4cChmM19uZXdfdyRmaXQgKyAxLjk2KmYzX25ld193JHNlLmZpdCkNCmYzX25ld193JHNhbGFyeSA8LSBleHAoZjNfbmV3X3ckZml0KQ0KDQoNCmYzX25ld19tJHQgPC0gZGZfbWVuJHQNCmYzX25ld19tJHQyIDwtIGRmX21lbiR0Mg0KZjNfbmV3X20kdDMgPC0gZGZfbWVuJHQzDQpmM19uZXdfbSR0cmFuc19sdCA8LSBkZl9tZW4kdHJhbnNfbHQNCmYzX25ld19tJHRyYW5zX3N0IDwtIGRmX21lbiR0cmFuc19zdA0KZjNfbmV3X20kbG93ZXIgPC0gZXhwKGYzX25ld19tJGZpdCAtIDEuOTYqZjNfbmV3X20kc2UuZml0KQ0KZjNfbmV3X20kdXBwZXIgPC0gZXhwKGYzX25ld19tJGZpdCArIDEuOTYqZjNfbmV3X20kc2UuZml0KQ0KZjNfbmV3X20kc2FsYXJ5IDwtIGV4cChmM19uZXdfbSRmaXQpDQoNCmYzX29yaV93IDwtIGYzX29yaV93W2YzX29yaV93JFJJTlBFUlNPT04laW4ld29tX3NlbCRSSU5QRVJTT09OLF0NCmYzX29yaV9tIDwtIGYzX29yaV9tW2YzX29yaV9tJFJJTlBFUlNPT04laW4lbWVuX3NlbCRSSU5QRVJTT09OLF0NCmYzX25ld193IDwtIGYzX25ld193W2YzX25ld193JFJJTlBFUlNPT04laW4ld29tX3NlbCRSSU5QRVJTT09OLF0NCmYzX25ld19tIDwtIGYzX25ld19tW2YzX25ld19tJFJJTlBFUlNPT04laW4lbWVuX3NlbCRSSU5QRVJTT09OLF0NCg0KIyBhZGRpbmcgdmFyaWFibGUgd2l0aCB0IGF0IHRyYW5zaXRpb24gKHRyYW5zaXRpb24gdGltZSB2YXJpYWJsZSksIGdlbmRlcg0KIyBzZWxlY3Qgb25seSB1cCB0byB0aW1lIDE1LCB0byBtYWludGFpbiBiaWcgZW5vdWdoIHNhbXBsZQ0KZjNfb3JpX3cgJT4lDQogIGZpbHRlcih0cmFuc19zdD4wKSAlPiUNCiAgbXV0YXRlKHRyYW5zX3kgPSB0KSAlPiUNCiAgc2VsZWN0KFJJTlBFUlNPT04sIHRyYW5zX3kpICU+JQ0KICByaWdodF9qb2luKGYzX29yaV93LCBieT0iUklOUEVSU09PTiIpICU+JQ0KICBtdXRhdGUoZ2VuZGVyPSJ3b21lbiIsDQogICAgICAgICBtb2RlbCA9ICJvcmlnaW5hbCIpIC0+IGZpZzNfd28NCg0KZjNfb3JpX20gJT4lDQogIGZpbHRlcih0cmFuc19zdD4wKSAlPiUNCiAgbXV0YXRlKHRyYW5zX3kgPSB0KSAlPiUNCiAgc2VsZWN0KFJJTlBFUlNPT04sIHRyYW5zX3kpICU+JQ0KICByaWdodF9qb2luKGYzX29yaV9tLCBieT0iUklOUEVSU09PTiIpICU+JQ0KICBtdXRhdGUoZ2VuZGVyPSJtZW4iLA0KICAgICAgICAgbW9kZWwgPSAib3JpZ2luYWwiKSAtPiBmaWczX21vDQoNCmYzX25ld193ICU+JQ0KICBmaWx0ZXIodHJhbnNfc3Q+MCkgJT4lDQogIG11dGF0ZSh0cmFuc195ID0gdCkgJT4lDQogIHNlbGVjdChSSU5QRVJTT09OLCB0cmFuc195KSAlPiUNCiAgcmlnaHRfam9pbihmM19uZXdfdywgYnk9IlJJTlBFUlNPT04iKSAlPiUNCiAgbXV0YXRlKGdlbmRlcj0id29tZW4iLA0KICAgICAgICAgbW9kZWwgPSAiZXh0ZW5kZWQiKSAtPiBmaWczX3duDQoNCmYzX25ld19tICU+JQ0KICBmaWx0ZXIodHJhbnNfc3Q+MCkgJT4lDQogIG11dGF0ZSh0cmFuc195ID0gdCkgJT4lDQogIHNlbGVjdChSSU5QRVJTT09OLCB0cmFuc195KSAlPiUNCiAgcmlnaHRfam9pbihmM19uZXdfbSwgYnk9IlJJTlBFUlNPT04iKSAlPiUNCiAgbXV0YXRlKGdlbmRlcj0ibWVuIiwNCiAgICAgICAgIG1vZGVsID0gImV4dGVuZGVkIikgLT4gZmlnM19tbg0KDQoNCg0KcmJpbmQuZGF0YS5mcmFtZShmaWczX3dvLCBmaWczX21vKSAtPiBmaWczXzENCnJiaW5kLmRhdGEuZnJhbWUoZmlnM193biwgZmlnM19tbikgLT4gZmlnM18yDQpyYmluZC5kYXRhLmZyYW1lKGZpZzNfMSwgZmlnM18yKSAtPiBmaWczDQoNCnJtKGZpZzNfd28sIGZpZzNfbW8sIGZpZzNfd24sIGZpZzNfbW4sIGZpZzNfMSwgZmlnM18yKQ0KDQoNCmZpZzMgJT4lDQogIGZpbHRlcih0PDE2KSAlPiUNCiAgZ3JvdXBfYnkoZ2VuZGVyLCBtb2RlbCwgdCkgJT4lDQogIHN1bW1hcmlzZShzYWxhcnkgPSBtZWFuKHNhbGFyeSksDQogICAgICAgICAgICBsb3dlciA9IG1lYW4obG93ZXIpLA0KICAgICAgICAgICAgdXBwZXIgPSBtZWFuKHVwcGVyKSwNCiAgICAgICAgICAgIG4gPSBuKCksDQogICAgICAgICAgICAuZ3JvdXBzID0gImRyb3AiKSAtPiBmaWczX3N1bW0NCg0Kd3JpdGUuY3N2KGZpZzNfc3VtbSwgZmlsZT0iRjovR1BFX3NhbGFyaXMvUiZSX3YyL2RhdGFmaWczLmNzdiIpDQoNCg0KYGBgDQoNCg0KDQpgYGB7cn0NCg0KZmlnM19zdW1tIDwtIHJlYWQuY3N2KGZpbGU9ImRhdGFmaWczLmNzdiIsIGhlYWRlcj1UUlVFLCBjaGVjay5uYW1lcyA9IEZBTFNFKQ0KDQpmaWczX3N1bW0gJT4lIHNlbGVjdChnZW5kZXIsIG1vZGVsLCB0LCBzYWxhcnksIGxvd2VyLCB1cHBlciwgbikgLT4gZmlnM19zdW1tDQoNCmZpZzNfc3VtbSAlPiUgZmlsdGVyKGdlbmRlcj09Im1lbiIpIC0+IGZpZzNfc3VtbV9tDQpmaWczX3N1bW0gJT4lIGZpbHRlcihnZW5kZXI9PSJ3b21lbiIpIC0+IGZpZzNfc3VtbV93DQoNCmZpZzNfc3VtbSAlPiUgZmlsdGVyKGdlbmRlcj09Im1lbiIgJiBtb2RlbD09Im9yaWdpbmFsIikgLT4gZmlnM19zdW1tX21vDQpmaWczX3N1bW0gJT4lIGZpbHRlcihnZW5kZXI9PSJ3b21lbiIgJiBtb2RlbD09Im9yaWdpbmFsIikgLT4gZmlnM19zdW1tX3dvDQpmaWczX3N1bW0gJT4lIGZpbHRlcihnZW5kZXI9PSJtZW4iICYgbW9kZWw9PSJleHRlbmRlZCIpIC0+IGZpZzNfc3VtbV9tbg0KZmlnM19zdW1tICU+JSBmaWx0ZXIoZ2VuZGVyPT0id29tZW4iICYgbW9kZWw9PSJleHRlbmRlZCIpIC0+IGZpZzNfc3VtbV93bg0KDQoNCmBgYA0KDQoNCg0KTWVuDQoNCmBgYHtyfQ0KDQpmaWczYSA8LSBnZ3Bsb3QoZmlnM19zdW1tX20sIGFlcyh4PXQsIHk9c2FsYXJ5LCBjb2xvcj1tb2RlbCwgZmlsbD1tb2RlbCwgbGluZXR5cGU9bW9kZWwpKSArDQogIGdlb21fbGluZShzaXplPTEpICsNCiAgZ2VvbV9lcnJvcmJhcihhZXMoeW1pbj1sb3dlciwgeW1heD11cHBlciksIGx3ZD0uNCwgYWxwaGE9LjM1LCB3aWR0aD0wKSArDQogIGxhYnMoeCA9ICJUaW1lIGluIHllYXJzIHNpbmNlIFBoRCIsIHkgPSAiUHJlZGljdGVkIG1lYW4gc2FsYXJ5IiwgY29sb3I9Ik1vZGVsIiwgbGluZXR5cGU9Ik1vZGVsIikgKw0KICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzPWMoIm9yaWdpbmFsIj1tbywgImV4dGVuZGVkIj1tbikpICsNCiAgc2NhbGVfbGluZXR5cGVfbWFudWFsKHZhbHVlcz1jKCJleHRlbmRlZCI9InNvbGlkIiwgIm9yaWdpbmFsIj0iZGFzaGVkIikpICsNCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcz1jKDAsNSwxMCwxNSkpICsNCiAgeWxpbSgwLCAxMzAwMCkgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICAgdGhlbWUoYXhpcy50ZXh0PWVsZW1lbnRfdGV4dChzaXplPTExKSwNCiAgICAgICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTExLCBmYWNlPSJib2xkIiksDQogICAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTExLCBmYWNlPSJib2xkIiksDQogICAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemU9MTEpLA0KICAgICAgICBwYW5lbC5ncmlkLm1pbm9yLnggPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIHBhbmVsLmdyaWQubWFqb3IueCA9IGVsZW1lbnRfYmxhbmsoKSkNCg0KYGBgDQoNCg0KV29tZW4NCg0KYGBge3J9DQoNCmZpZzNiIDwtIGdncGxvdChmaWczX3N1bW1fdywgYWVzKHg9dCwgeT1zYWxhcnksIGNvbG9yPW1vZGVsLCBmaWxsPW1vZGVsLCBsaW5ldHlwZT1tb2RlbCkpICsNCiAgZ2VvbV9saW5lKHNpemU9MSkgKw0KICBnZW9tX2Vycm9yYmFyKGFlcyh5bWluPWxvd2VyLCB5bWF4PXVwcGVyKSwgbHdkPS40LCBhbHBoYT0uMzUsIHdpZHRoPTApICsNCiAgbGFicyh4ID0gIlRpbWUgaW4geWVhcnMgc2luY2UgUGhEIiwgeSA9ICJQcmVkaWN0ZWQgbWVhbiBzYWxhcnkiLCBjb2xvcj0iTW9kZWwiLCBsaW5ldHlwZT0iTW9kZWwiKSsNCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcz1jKCJleHRlbmRlZCI9d24sICJvcmlnaW5hbCI9d28pKSArDQogIHNjYWxlX2xpbmV0eXBlX21hbnVhbCh2YWx1ZXM9YygiZXh0ZW5kZWQiPSJzb2xpZCIsICJvcmlnaW5hbCI9ImRhc2hlZCIpKSArDQogIHNjYWxlX3hfY29udGludW91cyhicmVha3M9YygwLDUsMTAsMTUpKSArDQogIHlsaW0oMCwgMTMwMDApICsNCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgdGhlbWUoYXhpcy50ZXh0PWVsZW1lbnRfdGV4dChzaXplPTExKSwNCiAgICAgICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTExLCBmYWNlPSJib2xkIiksDQogICAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTExLCBmYWNlPSJib2xkIiksDQogICAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemU9MTEpLA0KICAgICAgICBwYW5lbC5ncmlkLm1pbm9yLnggPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIHBhbmVsLmdyaWQubWFqb3IueCA9IGVsZW1lbnRfYmxhbmsoKSkNCg0KYGBgDQoNCg0KYGBge3J9DQoNCmZpZzNhDQoNCmBgYA0KDQpgYGB7cn0NCg0KZmlnM2INCg0KYGBgDQoNCg0KIyMgYWxsIGZvdXIgdG9nZXRoZXINCg0KYGBge3J9DQoNCmdncGxvdChmaWczX3N1bW1fd28sIGFlcyh4PXQsIHk9c2FsYXJ5KSkgKw0KICBnZW9tX2xpbmUoc2l6ZT0xLCBjb2xvcj13bykgKw0KICBnZW9tX2Vycm9yYmFyKGFlcyh5bWluPWxvd2VyLCB5bWF4PXVwcGVyKSwgbHdkPS40LCBhbHBoYT0uMzUsIHdpZHRoPTApICsNCiAgbGFicyh4ID0gIlRpbWUgaW4geWVhcnMgc2luY2UgUGhEIiwgeSA9ICJQcmVkaWN0ZWQgbWVhbiBzYWxhcnkiKSsNCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcz1jKDAsNSwxMCwxNSkpICsNCiAgeWxpbSgwLCAxMzAwMCkgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICB0aGVtZShheGlzLnRleHQ9ZWxlbWVudF90ZXh0KHNpemU9MTApLA0KICAgICAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTApLA0KICAgICAgICBwYW5lbC5ncmlkLm1pbm9yLnggPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIHBhbmVsLmdyaWQubWFqb3IueCA9IGVsZW1lbnRfYmxhbmsoKSkgLT4gd29tX29yaQ0KICANCg0KZ2dwbG90KGZpZzNfc3VtbV9tbywgYWVzKHg9dCwgeT1zYWxhcnkpKSArDQogIGdlb21fbGluZShzaXplPTEsIGNvbG9yPW1vKSArDQogIGdlb21fZXJyb3JiYXIoYWVzKHltaW49bG93ZXIsIHltYXg9dXBwZXIpLCBsd2Q9LjQsIGFscGhhPS4zNSwgd2lkdGg9MCkgKw0KICBsYWJzKHggPSAiVGltZSBpbiB5ZWFycyBzaW5jZSBQaEQiLCB5ID0gIlByZWRpY3RlZCBtZWFuIHNhbGFyeSIpKw0KICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzPWMoMCw1LDEwLDE1KSkgKw0KICB5bGltKDAsIDEzMDAwKSArDQogIHRoZW1lX21pbmltYWwoKSArDQogIHRoZW1lKGF4aXMudGV4dD1lbGVtZW50X3RleHQoc2l6ZT0xMCksDQogICAgICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0xMCksDQogICAgICAgIHBhbmVsLmdyaWQubWlub3IueCA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgcGFuZWwuZ3JpZC5tYWpvci54ID0gZWxlbWVudF9ibGFuaygpKSAtPiBtZW5fb3JpDQogIA0KZ2dwbG90KGZpZzNfc3VtbV93biwgYWVzKHg9dCwgeT1zYWxhcnkpKSArDQogIGdlb21fbGluZShzaXplPTEsIGNvbG9yPXduKSArDQogIGdlb21fZXJyb3JiYXIoYWVzKHltaW49bG93ZXIsIHltYXg9dXBwZXIpLCBsd2Q9LjQsIGFscGhhPS4zNSwgd2lkdGg9MCkgKw0KICBsYWJzKHggPSAiVGltZSBpbiB5ZWFycyBzaW5jZSBQaEQiLCB5ID0gIlByZWRpY3RlZCBtZWFuIHNhbGFyeSIpKw0KICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzPWMoMCw1LDEwLDE1KSkgKw0KICB5bGltKDAsIDEzMDAwKSArDQogIHRoZW1lX21pbmltYWwoKSArDQogIHRoZW1lKGF4aXMudGV4dD1lbGVtZW50X3RleHQoc2l6ZT0xMCksDQogICAgICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0xMCksDQogICAgICAgIHBhbmVsLmdyaWQubWlub3IueCA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgcGFuZWwuZ3JpZC5tYWpvci54ID0gZWxlbWVudF9ibGFuaygpKSAtPiB3b21fbmV3DQogIA0KZ2dwbG90KGZpZzNfc3VtbV9tbiwgYWVzKHg9dCwgeT1zYWxhcnkpKSArDQogIGdlb21fbGluZShzaXplPTEsIGNvbG9yPW1uKSArDQogIGdlb21fZXJyb3JiYXIoYWVzKHltaW49bG93ZXIsIHltYXg9dXBwZXIpLCBsd2Q9LjQsIGFscGhhPS4zNSwgd2lkdGg9MCkgKw0KICBsYWJzKHggPSAiVGltZSBpbiB5ZWFycyBzaW5jZSBQaEQiLCB5ID0gIlByZWRpY3RlZCBtZWFuIHNhbGFyeSIpKw0KICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzPWMoMCw1LDEwLDE1KSkgKw0KICB5bGltKDAsIDEzMDAwKSArDQogIHRoZW1lX21pbmltYWwoKSArDQogIHRoZW1lKGF4aXMudGV4dD1lbGVtZW50X3RleHQoc2l6ZT0xMCksDQogICAgICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0xMCksDQogICAgICAgIHBhbmVsLmdyaWQubWlub3IueCA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgcGFuZWwuZ3JpZC5tYWpvci54ID0gZWxlbWVudF9ibGFuaygpKSAtPiBtZW5fbmV3DQogIA0KDQpnZ3B1YnI6OmdnYXJyYW5nZSgNCiAgd29tX29yaSwNCiAgd29tX25ldywNCiAgbWVuX29yaSwNCiAgbWVuX25ldywNCiAgbmNvbD0yLCBucm93PTIsDQogIGxhYmVscz1jKCJXb21lbiAtIE9yaWdpbmFsIiwgIldvbWVuIC0gRXh0ZW5kZWQiLCAiTWVuIC0gT3JpZ2luYWwiLCAiTWVuIC0gRXh0ZW5kZWQiKSwNCiAgZm9udC5sYWJlbCA9IGxpc3Qoc2l6ZT0xMiwgZmFjZT0iYm9sZCIpLA0KICBsYWJlbC54ID0gMC42LCANCiAgbGFiZWwueSA9IDEuMDEsDQogIGhqdXN0ID0gMC41DQopDQoNCg0KYGBgDQoNCg==


Copyright © 2025