This is an R Markdown Notebook. In this file, we will sort the burrowing depth data and make the plots by heatwave phases.

1. loading packages and function

library(tidyr)

Attaching package: ‘tidyr’

The following objects are masked from ‘package:Matrix’:

    expand, pack, unpack
library(gtools)
library(ggplot2)
Need help getting started? Try the R Graphics Cookbook: https://r-graphics.org
library(RColorBrewer)
library(ggpubr)
Registered S3 method overwritten by 'data.table':
  method           from
  print.data.table     
library(lme4)
library(lmerTest)
library(car)
Loading required package: carData

Attaching package: ‘car’

The following object is masked from ‘package:gtools’:

    logit
source('summ_function.R')

2. loading data

depth.hf = read.csv('hf_deltaD.csv', header = T, stringsAsFactors=FALSE)
depth.hf$newtime = depth.hf$time
depth.hf$newtime = as.character(depth.hf$newtime)
depth.hf$newtime[depth.hf$newtime == 'T1'] = '9:00'
depth.hf$newtime[depth.hf$newtime == 'T2'] = '11:00'
depth.hf$newtime[depth.hf$newtime == 'T3'] = '12:30'
depth.hf$newtime[depth.hf$newtime == 'T4'] = '14:00'
depth.hf$newtime[depth.hf$newtime == 'T5'] = '16:00'
depth.hf$datetime = paste0(depth.hf$date, " ", depth.hf$newtime)
depth.hf = subset(depth.hf, phases != 'lumino')

depth.lf = read.csv('lf_deltaD.csv', header = T, stringsAsFactors=FALSE)
depth.lf$newtime = depth.lf$time
depth.lf$newtime = as.character(depth.lf$newtime)
depth.lf$newtime[depth.lf$newtime == 'T1'] = '9:00'
depth.lf$newtime[depth.lf$newtime == 'T2'] = '11:00'
depth.lf$newtime[depth.lf$newtime == 'T3'] = '12:30'
depth.lf$newtime[depth.lf$newtime == 'T4'] = '14:00'
depth.lf$newtime[depth.lf$newtime == 'T5'] = '16:00'
depth.lf$datetime = paste0(depth.lf$date, " ", depth.lf$newtime)
depth.lf = subset(depth.lf, phases != 'lumino')

3. subset data by heatwave types and phases

hf.calm = depth.hf[depth.hf$phases == 'cooling1' | 
                     depth.hf$phases == 'cooling2' | 
                     depth.hf$phases == 'cooling3' | 
                     depth.hf$phases == 'cooling4', ]
hf.hws = depth.hf[depth.hf$phases == 'heating1' | 
                     depth.hf$phases == 'heating2' | 
                     depth.hf$phases == 'heating3' | 
                     depth.hf$phases == 'heating4' |
                     depth.hf$phases == 'heating5', ]

lf.calm = depth.lf[depth.lf$phases == 'cooling1' | 
                     depth.lf$phases == 'cooling2', ]
lf.hws = depth.lf[depth.lf$phases == 'heating1' | 
                     depth.lf$phases == 'heating2' | 
                     depth.lf$phases == 'heating3', ]

4. summarize data (check)

hf.calm.c = hf.calm[hf.calm$treatment == 'control',]
hf.calm.h = hf.calm[hf.calm$treatment == 'heating',]

hf.hws.c = hf.hws[hf.hws$treatment == 'control',]
hf.hws.h = hf.hws[hf.hws$treatment == 'heating',]

lf.calm.c = lf.calm[lf.calm$treatment == 'control',]
lf.calm.h = lf.calm[lf.calm$treatment == 'heating',]

lf.hws.c = lf.hws[lf.hws$treatment == 'control',]
lf.hws.h = lf.hws[lf.hws$treatment == 'heating',]

abt.c = rbind(hf.calm.c, hf.hws.c, lf.calm.c, lf.hws.c)
abt.c$group = rep('ambient', length(abt.c$deltaL))

hf.calm.h$group = rep('calm_hf', length(hf.calm.h$deltaL))
lf.calm.h$group = rep('calm_lf', length(lf.calm.h$deltaL))

hf.hws.h$group = rep('hws_hf', length(hf.hws.h$deltaL))
lf.hws.h$group = rep('hws_lf', length(lf.hws.h$deltaL))

df.calm = rbind(abt.c, hf.calm.h, lf.calm.h)
df.hws = rbind(abt.c, hf.hws.h, lf.hws.h)

###########################################################
df.calm.summ = summarySE(df.calm, measurevar='deltaL', groupvars=c('group','time'), na.rm=T)

Attaching package: ‘plyr’

The following object is masked from ‘package:ggpubr’:

    mutate
df.hws.summ = summarySE(df.hws, measurevar='deltaL', groupvars=c('group','time'), na.rm=T)

df.calm.summ$group[df.calm.summ$group == 'calm_hf'] = 'heatwaves: 3-day cycle'
df.calm.summ$group[df.calm.summ$group == 'calm_lf'] = 'heatwaves: 6-day cycle'

df.hws.summ$group[df.hws.summ$group == 'hws_hf'] = 'heatwaves: 3-day cycle'
df.hws.summ$group[df.hws.summ$group == 'hws_lf'] = 'heatwaves: 6-day cycle'

4. summarize data (optionnal)

# hf.calm.sum = summarySE(hf.calm, measurevar='deltaL', groupvars=c('treatment','time'), na.rm=T)
# hf.calm.sum$treatment[hf.calm.sum$treatment == 'control'] = 'control: 3-day cycle'
# hf.calm.sum$treatment[hf.calm.sum$treatment == 'heating'] = 'heatwaves: 3-day cycle'
# 
# hf.hws.sum = summarySE(hf.hws, measurevar='deltaL', groupvars=c('treatment','time'), na.rm=T)
# hf.hws.sum$treatment[hf.hws.sum$treatment == 'control'] = 'control: 3-day cycle'
# hf.hws.sum$treatment[hf.hws.sum$treatment == 'heating'] = 'heatwaves: 3-day cycle'
# 
# lf.calm.sum = summarySE(lf.calm, measurevar="deltaL", groupvars=c("treatment",'time'),na.rm=T)
# lf.calm.sum$treatment[lf.calm.sum$treatment == 'control'] = 'control: 6-day cycle'
# lf.calm.sum$treatment[lf.calm.sum$treatment == 'heating'] = 'heatwaves: 6-day cycle'
# 
# lf.hws.sum = summarySE(lf.hws, measurevar="deltaL", groupvars=c("treatment",'time'),na.rm=T)
# lf.hws.sum$treatment[lf.hws.sum$treatment == 'control'] = 'control: 6-day cycle'
# lf.hws.sum$treatment[lf.hws.sum$treatment == 'heating'] = 'heatwaves: 6-day cycle'
# 
# calm.sum = rbind(lf.calm.sum, hf.calm.sum)
# hws.sum = rbind(lf.hws.sum, hf.hws.sum)

5. change time format

df.calm.summ$time[df.calm.summ$time == 'T1'] = '9:00'
df.calm.summ$time[df.calm.summ$time == 'T2'] = '11:00'
df.calm.summ$time[df.calm.summ$time == 'T3'] = '12:30'
df.calm.summ$time[df.calm.summ$time == 'T4'] = '14:00'
df.calm.summ$time[df.calm.summ$time == 'T5'] = '16:00'

df.hws.summ$time[df.hws.summ$time == 'T1'] = '9:00'
df.hws.summ$time[df.hws.summ$time == 'T2'] = '11:00'
df.hws.summ$time[df.hws.summ$time == 'T3'] = '12:30'
df.hws.summ$time[df.hws.summ$time == 'T4'] = '14:00'
df.hws.summ$time[df.hws.summ$time == 'T5'] = '16:00'

6. save data

write.csv(df.calm.summ, 'df_calm_summ.csv', row.names = F)
write.csv(df.hws.summ, 'df_hws_summ.csv', row.names = F)

7. loading data

calm.profile = read.csv('df_calm_summ.csv', header = T)
calm.profile$time = factor(calm.profile$time, levels = c('9:00', '11:00', '12:30', '14:00', '16:00'))

hws.profile = read.csv('df_hws_summ.csv', header = T)
hws.profile$time = factor(hws.profile$time, levels = c('9:00', '11:00', '12:30', '14:00', '16:00'))

8. setting plot parameters

pd = position_dodge(0.05)

hw_frame = data.frame(start = 1.25, end = 4.75)

9. plotting for calm profile

plot.calm = ggplot(calm.profile, aes(x=time, y=deltaL, colour=group, group = group)) + 
  geom_errorbar(aes(ymin=deltaL-se, ymax=deltaL+se), colour="black", width=0.3, position=pd) +
  geom_line(position=pd, size = 2.5, aes(group = group)) +
  geom_point(position=pd, size=3, shape=16) + 
  geom_vline(xintercept = 1.5, color = "#9F6554", size=1.0) +
  geom_vline(xintercept = 4.5, linetype="dashed", color = "#9F6554", size=1.0) +
  xlab("measurement time") +
  ylab('depth change (mm)') +
  scale_y_continuous(limits = c(-3,4), breaks = c(-2,-1,0,1,2,3))+
  scale_colour_manual(name="Treatments", 
                      breaks = c('ambient', 'heatwaves: 3-day cycle', 'heatwaves: 6-day cycle'), 
                      values= c('#3399FF', '#FF9900', '#FF0000'), 
                      labels = c('Ambient temperature', 'Heatwaves: 3-day cycle','Heatwaves: 6-day cycle')) +
  theme(
    plot.title = element_blank(),
    panel.background = element_rect(fill = 'white', colour = 'white'),
    legend.title = element_text(size=28, face="bold", color = "black"), 
    legend.text = element_text(size=28, face="bold"),
    legend.position=c(0.3, 0.85),
    legend.background = element_rect(fill=alpha('white', 0.8),
                                     size=0.5, linetype="solid", 
                                     colour ="black"),
    legend.margin=margin(r = 1, unit='inch'),
    legend.key = element_blank(),
    legend.key.width = unit(0.5, 'inch'),
    legend.key.height = unit(0.5, 'inch'),
    panel.border = element_rect(colour = "black", fill=NA, size=2),
    axis.title.x = element_text(size = 32, face="bold"),
    axis.title.y = element_text(size = 32, face="bold"),
    axis.text.x = element_text(size = 27, face="bold"),
    axis.text.y = element_text(size = 28, face="bold"),
    plot.margin = unit(c(0.1,0.6,0.1,0.1), "in"))+
  guides(color = guide_legend(override.aes = list(size = 4)))
plot.calm

10. plotting for heatwave profiles

plot.hws = ggplot(hws.profile, aes(x=time, y=deltaL, colour=group, group = group)) +
  geom_errorbar(aes(ymin=deltaL-se, ymax=deltaL+se), colour="black", width=0.3, position=pd) +
  geom_line(position=pd, size = 2.5, aes(group = group)) +
  geom_point(position=pd, size=3, shape=16) + 
  geom_vline(xintercept = 1.5, color = "#9F6554", size=1.0) +
  geom_vline(xintercept = 4.5, linetype="dashed", color = "#9F6554", size=1.0) +
  xlab("measurement time") +
  ylab('depth change (mm)') +
  scale_y_continuous(limits = c(-3,4), breaks = c(-2,-1,0,1,2,3))+
  scale_colour_manual(name="Treatments", 
                      breaks = c('ambient', 'heatwaves: 3-day cycle', 'heatwaves: 6-day cycle'), 
                      values= c('#3399FF', '#FF9900', '#FF0000'), 
                      labels = c('Ambient temperature', 'Heatwaves: 3-day cycle','Heatwaves: 6-day cycle')) +
  theme(
    plot.title = element_blank(),
    panel.background = element_rect(fill = 'white', colour = 'white'),
    legend.title = element_text(size=28, face="bold", color = "black"), 
    legend.text = element_text(size=28, face="bold"),
    legend.position=c(0.3, 0.85),
    legend.background = element_rect(fill=alpha('white', 0.8),
                                     size=0.5, linetype="solid", 
                                     colour ="black"),
    legend.margin=margin(r = 1, unit='inch'),
    legend.key = element_blank(),
    legend.key.width = unit(0.5, 'inch'),
    legend.key.height = unit(0.5, 'inch'),
    panel.border = element_rect(colour = "black", fill=NA, size=2),
    axis.title.x = element_text(size = 32, face="bold"),
    axis.title.y = element_text(size = 32, face="bold"),
    axis.text.x = element_text(size = 27, face="bold"),
    axis.text.y = element_text(size = 28, face="bold"),
    plot.margin = unit(c(0.1,0.6,0.1,0.1), "in"))+
  guides(color = guide_legend(override.aes = list(size = 4)))
plot.hws = plot.hws + annotate("rect", xmin = 1.25, xmax = 4.75, ymin = -Inf, ymax = Inf, alpha = .15, fill = "#E3242B")

11. save images

ggsave('plot.calm.png', plot.calm, units = 'in', dpi = 300, width = 16, height = 12)
ggsave('plot.hws.png', plot.hws, units = 'in', dpi = 300, width = 16, height = 12)

12. merge plots

plot.merge = ggarrange(plot.calm, plot.hws, 
          labels = c("a", "b"),
          ncol = 1, nrow = 2, font.label = list(size = 35))
ggsave('plot_merge.png', plot.merge, units = 'in', dpi = 300, width = 16, height = 24)

13. statistics

ks.test(df.calm$deltaL, "pnorm")
Warning: ties should not be present for the Kolmogorov-Smirnov test

    One-sample Kolmogorov-Smirnov test

data:  df.calm$deltaL
D = 0.39201, p-value < 2.2e-16
alternative hypothesis: two-sided
LS0tCnRpdGxlOiAiUiBOb3RlYm9vayBmb3IgRmlnLjQgaW4gc2Vjb25kIG1hbnVzY3JpcHQiCm91dHB1dDogaHRtbF9ub3RlYm9vawotLS0KClRoaXMgaXMgYW4gW1IgTWFya2Rvd25dKGh0dHA6Ly9ybWFya2Rvd24ucnN0dWRpby5jb20pIE5vdGVib29rLiBJbiB0aGlzIGZpbGUsIHdlIHdpbGwgc29ydCB0aGUgYnVycm93aW5nIGRlcHRoIGRhdGEgYW5kIG1ha2UgdGhlIHBsb3RzIGJ5IGhlYXR3YXZlIHBoYXNlcy4KCiMjIDEuIGxvYWRpbmcgcGFja2FnZXMgYW5kIGZ1bmN0aW9uCmBgYHtyfQpsaWJyYXJ5KHRpZHlyKQpsaWJyYXJ5KGd0b29scykKbGlicmFyeShnZ3Bsb3QyKQpsaWJyYXJ5KFJDb2xvckJyZXdlcikKbGlicmFyeShnZ3B1YnIpCmxpYnJhcnkobG1lNCkKbGlicmFyeShsbWVyVGVzdCkKbGlicmFyeShjYXIpCgpzb3VyY2UoJ3N1bW1fZnVuY3Rpb24uUicpCgpgYGAKCiMjIDIuIGxvYWRpbmcgZGF0YQpgYGB7cn0KZGVwdGguaGYgPSByZWFkLmNzdignaGZfZGVsdGFELmNzdicsIGhlYWRlciA9IFQsIHN0cmluZ3NBc0ZhY3RvcnM9RkFMU0UpCmRlcHRoLmhmJG5ld3RpbWUgPSBkZXB0aC5oZiR0aW1lCmRlcHRoLmhmJG5ld3RpbWUgPSBhcy5jaGFyYWN0ZXIoZGVwdGguaGYkbmV3dGltZSkKZGVwdGguaGYkbmV3dGltZVtkZXB0aC5oZiRuZXd0aW1lID09ICdUMSddID0gJzk6MDAnCmRlcHRoLmhmJG5ld3RpbWVbZGVwdGguaGYkbmV3dGltZSA9PSAnVDInXSA9ICcxMTowMCcKZGVwdGguaGYkbmV3dGltZVtkZXB0aC5oZiRuZXd0aW1lID09ICdUMyddID0gJzEyOjMwJwpkZXB0aC5oZiRuZXd0aW1lW2RlcHRoLmhmJG5ld3RpbWUgPT0gJ1Q0J10gPSAnMTQ6MDAnCmRlcHRoLmhmJG5ld3RpbWVbZGVwdGguaGYkbmV3dGltZSA9PSAnVDUnXSA9ICcxNjowMCcKZGVwdGguaGYkZGF0ZXRpbWUgPSBwYXN0ZTAoZGVwdGguaGYkZGF0ZSwgIiAiLCBkZXB0aC5oZiRuZXd0aW1lKQpkZXB0aC5oZiA9IHN1YnNldChkZXB0aC5oZiwgcGhhc2VzICE9ICdsdW1pbm8nKQoKZGVwdGgubGYgPSByZWFkLmNzdignbGZfZGVsdGFELmNzdicsIGhlYWRlciA9IFQsIHN0cmluZ3NBc0ZhY3RvcnM9RkFMU0UpCmRlcHRoLmxmJG5ld3RpbWUgPSBkZXB0aC5sZiR0aW1lCmRlcHRoLmxmJG5ld3RpbWUgPSBhcy5jaGFyYWN0ZXIoZGVwdGgubGYkbmV3dGltZSkKZGVwdGgubGYkbmV3dGltZVtkZXB0aC5sZiRuZXd0aW1lID09ICdUMSddID0gJzk6MDAnCmRlcHRoLmxmJG5ld3RpbWVbZGVwdGgubGYkbmV3dGltZSA9PSAnVDInXSA9ICcxMTowMCcKZGVwdGgubGYkbmV3dGltZVtkZXB0aC5sZiRuZXd0aW1lID09ICdUMyddID0gJzEyOjMwJwpkZXB0aC5sZiRuZXd0aW1lW2RlcHRoLmxmJG5ld3RpbWUgPT0gJ1Q0J10gPSAnMTQ6MDAnCmRlcHRoLmxmJG5ld3RpbWVbZGVwdGgubGYkbmV3dGltZSA9PSAnVDUnXSA9ICcxNjowMCcKZGVwdGgubGYkZGF0ZXRpbWUgPSBwYXN0ZTAoZGVwdGgubGYkZGF0ZSwgIiAiLCBkZXB0aC5sZiRuZXd0aW1lKQpkZXB0aC5sZiA9IHN1YnNldChkZXB0aC5sZiwgcGhhc2VzICE9ICdsdW1pbm8nKQoKYGBgCgojIyAzLiBzdWJzZXQgZGF0YSBieSBoZWF0d2F2ZSB0eXBlcyBhbmQgcGhhc2VzCmBgYHtyfQpoZi5jYWxtID0gZGVwdGguaGZbZGVwdGguaGYkcGhhc2VzID09ICdjb29saW5nMScgfCAKICAgICAgICAgICAgICAgICAgICAgZGVwdGguaGYkcGhhc2VzID09ICdjb29saW5nMicgfCAKICAgICAgICAgICAgICAgICAgICAgZGVwdGguaGYkcGhhc2VzID09ICdjb29saW5nMycgfCAKICAgICAgICAgICAgICAgICAgICAgZGVwdGguaGYkcGhhc2VzID09ICdjb29saW5nNCcsIF0KaGYuaHdzID0gZGVwdGguaGZbZGVwdGguaGYkcGhhc2VzID09ICdoZWF0aW5nMScgfCAKICAgICAgICAgICAgICAgICAgICAgZGVwdGguaGYkcGhhc2VzID09ICdoZWF0aW5nMicgfCAKICAgICAgICAgICAgICAgICAgICAgZGVwdGguaGYkcGhhc2VzID09ICdoZWF0aW5nMycgfCAKICAgICAgICAgICAgICAgICAgICAgZGVwdGguaGYkcGhhc2VzID09ICdoZWF0aW5nNCcgfAogICAgICAgICAgICAgICAgICAgICBkZXB0aC5oZiRwaGFzZXMgPT0gJ2hlYXRpbmc1JywgXQoKbGYuY2FsbSA9IGRlcHRoLmxmW2RlcHRoLmxmJHBoYXNlcyA9PSAnY29vbGluZzEnIHwgCiAgICAgICAgICAgICAgICAgICAgIGRlcHRoLmxmJHBoYXNlcyA9PSAnY29vbGluZzInLCBdCmxmLmh3cyA9IGRlcHRoLmxmW2RlcHRoLmxmJHBoYXNlcyA9PSAnaGVhdGluZzEnIHwgCiAgICAgICAgICAgICAgICAgICAgIGRlcHRoLmxmJHBoYXNlcyA9PSAnaGVhdGluZzInIHwgCiAgICAgICAgICAgICAgICAgICAgIGRlcHRoLmxmJHBoYXNlcyA9PSAnaGVhdGluZzMnLCBdCgpgYGAKCiMjIDQuIHN1bW1hcml6ZSBkYXRhIChjaGVjaykKYGBge3J9CmhmLmNhbG0uYyA9IGhmLmNhbG1baGYuY2FsbSR0cmVhdG1lbnQgPT0gJ2NvbnRyb2wnLF0KaGYuY2FsbS5oID0gaGYuY2FsbVtoZi5jYWxtJHRyZWF0bWVudCA9PSAnaGVhdGluZycsXQoKaGYuaHdzLmMgPSBoZi5od3NbaGYuaHdzJHRyZWF0bWVudCA9PSAnY29udHJvbCcsXQpoZi5od3MuaCA9IGhmLmh3c1toZi5od3MkdHJlYXRtZW50ID09ICdoZWF0aW5nJyxdCgpsZi5jYWxtLmMgPSBsZi5jYWxtW2xmLmNhbG0kdHJlYXRtZW50ID09ICdjb250cm9sJyxdCmxmLmNhbG0uaCA9IGxmLmNhbG1bbGYuY2FsbSR0cmVhdG1lbnQgPT0gJ2hlYXRpbmcnLF0KCmxmLmh3cy5jID0gbGYuaHdzW2xmLmh3cyR0cmVhdG1lbnQgPT0gJ2NvbnRyb2wnLF0KbGYuaHdzLmggPSBsZi5od3NbbGYuaHdzJHRyZWF0bWVudCA9PSAnaGVhdGluZycsXQoKYWJ0LmMgPSByYmluZChoZi5jYWxtLmMsIGhmLmh3cy5jLCBsZi5jYWxtLmMsIGxmLmh3cy5jKQphYnQuYyRncm91cCA9IHJlcCgnYW1iaWVudCcsIGxlbmd0aChhYnQuYyRkZWx0YUwpKQoKaGYuY2FsbS5oJGdyb3VwID0gcmVwKCdjYWxtX2hmJywgbGVuZ3RoKGhmLmNhbG0uaCRkZWx0YUwpKQpsZi5jYWxtLmgkZ3JvdXAgPSByZXAoJ2NhbG1fbGYnLCBsZW5ndGgobGYuY2FsbS5oJGRlbHRhTCkpCgpoZi5od3MuaCRncm91cCA9IHJlcCgnaHdzX2hmJywgbGVuZ3RoKGhmLmh3cy5oJGRlbHRhTCkpCmxmLmh3cy5oJGdyb3VwID0gcmVwKCdod3NfbGYnLCBsZW5ndGgobGYuaHdzLmgkZGVsdGFMKSkKCmRmLmNhbG0gPSByYmluZChhYnQuYywgaGYuY2FsbS5oLCBsZi5jYWxtLmgpCmRmLmh3cyA9IHJiaW5kKGFidC5jLCBoZi5od3MuaCwgbGYuaHdzLmgpCgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkZi5jYWxtLnN1bW0gPSBzdW1tYXJ5U0UoZGYuY2FsbSwgbWVhc3VyZXZhcj0nZGVsdGFMJywgZ3JvdXB2YXJzPWMoJ2dyb3VwJywndGltZScpLCBuYS5ybT1UKQpkZi5od3Muc3VtbSA9IHN1bW1hcnlTRShkZi5od3MsIG1lYXN1cmV2YXI9J2RlbHRhTCcsIGdyb3VwdmFycz1jKCdncm91cCcsJ3RpbWUnKSwgbmEucm09VCkKCmRmLmNhbG0uc3VtbSRncm91cFtkZi5jYWxtLnN1bW0kZ3JvdXAgPT0gJ2NhbG1faGYnXSA9ICdoZWF0d2F2ZXM6IDMtZGF5IGN5Y2xlJwpkZi5jYWxtLnN1bW0kZ3JvdXBbZGYuY2FsbS5zdW1tJGdyb3VwID09ICdjYWxtX2xmJ10gPSAnaGVhdHdhdmVzOiA2LWRheSBjeWNsZScKCmRmLmh3cy5zdW1tJGdyb3VwW2RmLmh3cy5zdW1tJGdyb3VwID09ICdod3NfaGYnXSA9ICdoZWF0d2F2ZXM6IDMtZGF5IGN5Y2xlJwpkZi5od3Muc3VtbSRncm91cFtkZi5od3Muc3VtbSRncm91cCA9PSAnaHdzX2xmJ10gPSAnaGVhdHdhdmVzOiA2LWRheSBjeWNsZScKCmBgYAoKIyMgNC4gc3VtbWFyaXplIGRhdGEgKG9wdGlvbm5hbCkKYGBge3J9CiMgaGYuY2FsbS5zdW0gPSBzdW1tYXJ5U0UoaGYuY2FsbSwgbWVhc3VyZXZhcj0nZGVsdGFMJywgZ3JvdXB2YXJzPWMoJ3RyZWF0bWVudCcsJ3RpbWUnKSwgbmEucm09VCkKIyBoZi5jYWxtLnN1bSR0cmVhdG1lbnRbaGYuY2FsbS5zdW0kdHJlYXRtZW50ID09ICdjb250cm9sJ10gPSAnY29udHJvbDogMy1kYXkgY3ljbGUnCiMgaGYuY2FsbS5zdW0kdHJlYXRtZW50W2hmLmNhbG0uc3VtJHRyZWF0bWVudCA9PSAnaGVhdGluZyddID0gJ2hlYXR3YXZlczogMy1kYXkgY3ljbGUnCiMgCiMgaGYuaHdzLnN1bSA9IHN1bW1hcnlTRShoZi5od3MsIG1lYXN1cmV2YXI9J2RlbHRhTCcsIGdyb3VwdmFycz1jKCd0cmVhdG1lbnQnLCd0aW1lJyksIG5hLnJtPVQpCiMgaGYuaHdzLnN1bSR0cmVhdG1lbnRbaGYuaHdzLnN1bSR0cmVhdG1lbnQgPT0gJ2NvbnRyb2wnXSA9ICdjb250cm9sOiAzLWRheSBjeWNsZScKIyBoZi5od3Muc3VtJHRyZWF0bWVudFtoZi5od3Muc3VtJHRyZWF0bWVudCA9PSAnaGVhdGluZyddID0gJ2hlYXR3YXZlczogMy1kYXkgY3ljbGUnCiMgCiMgbGYuY2FsbS5zdW0gPSBzdW1tYXJ5U0UobGYuY2FsbSwgbWVhc3VyZXZhcj0iZGVsdGFMIiwgZ3JvdXB2YXJzPWMoInRyZWF0bWVudCIsJ3RpbWUnKSxuYS5ybT1UKQojIGxmLmNhbG0uc3VtJHRyZWF0bWVudFtsZi5jYWxtLnN1bSR0cmVhdG1lbnQgPT0gJ2NvbnRyb2wnXSA9ICdjb250cm9sOiA2LWRheSBjeWNsZScKIyBsZi5jYWxtLnN1bSR0cmVhdG1lbnRbbGYuY2FsbS5zdW0kdHJlYXRtZW50ID09ICdoZWF0aW5nJ10gPSAnaGVhdHdhdmVzOiA2LWRheSBjeWNsZScKIyAKIyBsZi5od3Muc3VtID0gc3VtbWFyeVNFKGxmLmh3cywgbWVhc3VyZXZhcj0iZGVsdGFMIiwgZ3JvdXB2YXJzPWMoInRyZWF0bWVudCIsJ3RpbWUnKSxuYS5ybT1UKQojIGxmLmh3cy5zdW0kdHJlYXRtZW50W2xmLmh3cy5zdW0kdHJlYXRtZW50ID09ICdjb250cm9sJ10gPSAnY29udHJvbDogNi1kYXkgY3ljbGUnCiMgbGYuaHdzLnN1bSR0cmVhdG1lbnRbbGYuaHdzLnN1bSR0cmVhdG1lbnQgPT0gJ2hlYXRpbmcnXSA9ICdoZWF0d2F2ZXM6IDYtZGF5IGN5Y2xlJwojIAojIGNhbG0uc3VtID0gcmJpbmQobGYuY2FsbS5zdW0sIGhmLmNhbG0uc3VtKQojIGh3cy5zdW0gPSByYmluZChsZi5od3Muc3VtLCBoZi5od3Muc3VtKQoKYGBgCgojIyA1LiBjaGFuZ2UgdGltZSBmb3JtYXQKYGBge3J9CmRmLmNhbG0uc3VtbSR0aW1lW2RmLmNhbG0uc3VtbSR0aW1lID09ICdUMSddID0gJzk6MDAnCmRmLmNhbG0uc3VtbSR0aW1lW2RmLmNhbG0uc3VtbSR0aW1lID09ICdUMiddID0gJzExOjAwJwpkZi5jYWxtLnN1bW0kdGltZVtkZi5jYWxtLnN1bW0kdGltZSA9PSAnVDMnXSA9ICcxMjozMCcKZGYuY2FsbS5zdW1tJHRpbWVbZGYuY2FsbS5zdW1tJHRpbWUgPT0gJ1Q0J10gPSAnMTQ6MDAnCmRmLmNhbG0uc3VtbSR0aW1lW2RmLmNhbG0uc3VtbSR0aW1lID09ICdUNSddID0gJzE2OjAwJwoKZGYuaHdzLnN1bW0kdGltZVtkZi5od3Muc3VtbSR0aW1lID09ICdUMSddID0gJzk6MDAnCmRmLmh3cy5zdW1tJHRpbWVbZGYuaHdzLnN1bW0kdGltZSA9PSAnVDInXSA9ICcxMTowMCcKZGYuaHdzLnN1bW0kdGltZVtkZi5od3Muc3VtbSR0aW1lID09ICdUMyddID0gJzEyOjMwJwpkZi5od3Muc3VtbSR0aW1lW2RmLmh3cy5zdW1tJHRpbWUgPT0gJ1Q0J10gPSAnMTQ6MDAnCmRmLmh3cy5zdW1tJHRpbWVbZGYuaHdzLnN1bW0kdGltZSA9PSAnVDUnXSA9ICcxNjowMCcKCmBgYAoKIyMgNi4gc2F2ZSBkYXRhCmBgYHtyfQp3cml0ZS5jc3YoZGYuY2FsbS5zdW1tLCAnZGZfY2FsbV9zdW1tLmNzdicsIHJvdy5uYW1lcyA9IEYpCndyaXRlLmNzdihkZi5od3Muc3VtbSwgJ2RmX2h3c19zdW1tLmNzdicsIHJvdy5uYW1lcyA9IEYpCgpgYGAKCiMjIDcuIGxvYWRpbmcgZGF0YQpgYGB7cn0KY2FsbS5wcm9maWxlID0gcmVhZC5jc3YoJ2RmX2NhbG1fc3VtbS5jc3YnLCBoZWFkZXIgPSBUKQpjYWxtLnByb2ZpbGUkdGltZSA9IGZhY3RvcihjYWxtLnByb2ZpbGUkdGltZSwgbGV2ZWxzID0gYygnOTowMCcsICcxMTowMCcsICcxMjozMCcsICcxNDowMCcsICcxNjowMCcpKQoKaHdzLnByb2ZpbGUgPSByZWFkLmNzdignZGZfaHdzX3N1bW0uY3N2JywgaGVhZGVyID0gVCkKaHdzLnByb2ZpbGUkdGltZSA9IGZhY3Rvcihod3MucHJvZmlsZSR0aW1lLCBsZXZlbHMgPSBjKCc5OjAwJywgJzExOjAwJywgJzEyOjMwJywgJzE0OjAwJywgJzE2OjAwJykpCgpgYGAKCiMjIDguIHNldHRpbmcgcGxvdCBwYXJhbWV0ZXJzCmBgYHtyfQpwZCA9IHBvc2l0aW9uX2RvZGdlKDAuMDUpCgpod19mcmFtZSA9IGRhdGEuZnJhbWUoc3RhcnQgPSAxLjI1LCBlbmQgPSA0Ljc1KQoKYGBgCgojIyA5LiBwbG90dGluZyBmb3IgY2FsbSBwcm9maWxlCmBgYHtyfQpwbG90LmNhbG0gPSBnZ3Bsb3QoY2FsbS5wcm9maWxlLCBhZXMoeD10aW1lLCB5PWRlbHRhTCwgY29sb3VyPWdyb3VwLCBncm91cCA9IGdyb3VwKSkgKyAKICBnZW9tX2Vycm9yYmFyKGFlcyh5bWluPWRlbHRhTC1zZSwgeW1heD1kZWx0YUwrc2UpLCBjb2xvdXI9ImJsYWNrIiwgd2lkdGg9MC4zLCBwb3NpdGlvbj1wZCkgKwogIGdlb21fbGluZShwb3NpdGlvbj1wZCwgc2l6ZSA9IDIuNSwgYWVzKGdyb3VwID0gZ3JvdXApKSArCiAgZ2VvbV9wb2ludChwb3NpdGlvbj1wZCwgc2l6ZT0zLCBzaGFwZT0xNikgKyAKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAxLjUsIGNvbG9yID0gIiM5RjY1NTQiLCBzaXplPTEuMCkgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDQuNSwgbGluZXR5cGU9ImRhc2hlZCIsIGNvbG9yID0gIiM5RjY1NTQiLCBzaXplPTEuMCkgKwogIHhsYWIoIm1lYXN1cmVtZW50IHRpbWUiKSArCiAgeWxhYignZGVwdGggY2hhbmdlIChtbSknKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoLTMsNCksIGJyZWFrcyA9IGMoLTIsLTEsMCwxLDIsMykpKwogIHNjYWxlX2NvbG91cl9tYW51YWwobmFtZT0iVHJlYXRtZW50cyIsIAogICAgICAgICAgICAgICAgICAgICAgYnJlYWtzID0gYygnYW1iaWVudCcsICdoZWF0d2F2ZXM6IDMtZGF5IGN5Y2xlJywgJ2hlYXR3YXZlczogNi1kYXkgY3ljbGUnKSwgCiAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXM9IGMoJyMzMzk5RkYnLCAnI0ZGOTkwMCcsICcjRkYwMDAwJyksIAogICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygnQW1iaWVudCB0ZW1wZXJhdHVyZScsICdIZWF0d2F2ZXM6IDMtZGF5IGN5Y2xlJywnSGVhdHdhdmVzOiA2LWRheSBjeWNsZScpKSArCiAgdGhlbWUoCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF9ibGFuaygpLAogICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gJ3doaXRlJywgY29sb3VyID0gJ3doaXRlJyksCiAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0yOCwgZmFjZT0iYm9sZCIsIGNvbG9yID0gImJsYWNrIiksIAogICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZT0yOCwgZmFjZT0iYm9sZCIpLAogICAgbGVnZW5kLnBvc2l0aW9uPWMoMC4zLCAwLjg1KSwKICAgIGxlZ2VuZC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGw9YWxwaGEoJ3doaXRlJywgMC44KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU9MC41LCBsaW5ldHlwZT0ic29saWQiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG91ciA9ImJsYWNrIiksCiAgICBsZWdlbmQubWFyZ2luPW1hcmdpbihyID0gMSwgdW5pdD0naW5jaCcpLAogICAgbGVnZW5kLmtleSA9IGVsZW1lbnRfYmxhbmsoKSwKICAgIGxlZ2VuZC5rZXkud2lkdGggPSB1bml0KDAuNSwgJ2luY2gnKSwKICAgIGxlZ2VuZC5rZXkuaGVpZ2h0ID0gdW5pdCgwLjUsICdpbmNoJyksCiAgICBwYW5lbC5ib3JkZXIgPSBlbGVtZW50X3JlY3QoY29sb3VyID0gImJsYWNrIiwgZmlsbD1OQSwgc2l6ZT0yKSwKICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMzIsIGZhY2U9ImJvbGQiKSwKICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMzIsIGZhY2U9ImJvbGQiKSwKICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAyNywgZmFjZT0iYm9sZCIpLAogICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDI4LCBmYWNlPSJib2xkIiksCiAgICBwbG90Lm1hcmdpbiA9IHVuaXQoYygwLjEsMC42LDAuMSwwLjEpLCAiaW4iKSkrCiAgZ3VpZGVzKGNvbG9yID0gZ3VpZGVfbGVnZW5kKG92ZXJyaWRlLmFlcyA9IGxpc3Qoc2l6ZSA9IDQpKSkKcGxvdC5jYWxtCgpgYGAKCiMjIDEwLiBwbG90dGluZyBmb3IgaGVhdHdhdmUgcHJvZmlsZXMKYGBge3J9CnBsb3QuaHdzID0gZ2dwbG90KGh3cy5wcm9maWxlLCBhZXMoeD10aW1lLCB5PWRlbHRhTCwgY29sb3VyPWdyb3VwLCBncm91cCA9IGdyb3VwKSkgKwogIGdlb21fZXJyb3JiYXIoYWVzKHltaW49ZGVsdGFMLXNlLCB5bWF4PWRlbHRhTCtzZSksIGNvbG91cj0iYmxhY2siLCB3aWR0aD0wLjMsIHBvc2l0aW9uPXBkKSArCiAgZ2VvbV9saW5lKHBvc2l0aW9uPXBkLCBzaXplID0gMi41LCBhZXMoZ3JvdXAgPSBncm91cCkpICsKICBnZW9tX3BvaW50KHBvc2l0aW9uPXBkLCBzaXplPTMsIHNoYXBlPTE2KSArIAogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDEuNSwgY29sb3IgPSAiIzlGNjU1NCIsIHNpemU9MS4wKSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gNC41LCBsaW5ldHlwZT0iZGFzaGVkIiwgY29sb3IgPSAiIzlGNjU1NCIsIHNpemU9MS4wKSArCiAgeGxhYigibWVhc3VyZW1lbnQgdGltZSIpICsKICB5bGFiKCdkZXB0aCBjaGFuZ2UgKG1tKScpICsKICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gYygtMyw0KSwgYnJlYWtzID0gYygtMiwtMSwwLDEsMiwzKSkrCiAgc2NhbGVfY29sb3VyX21hbnVhbChuYW1lPSJUcmVhdG1lbnRzIiwgCiAgICAgICAgICAgICAgICAgICAgICBicmVha3MgPSBjKCdhbWJpZW50JywgJ2hlYXR3YXZlczogMy1kYXkgY3ljbGUnLCAnaGVhdHdhdmVzOiA2LWRheSBjeWNsZScpLCAKICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcz0gYygnIzMzOTlGRicsICcjRkY5OTAwJywgJyNGRjAwMDAnKSwgCiAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCdBbWJpZW50IHRlbXBlcmF0dXJlJywgJ0hlYXR3YXZlczogMy1kYXkgY3ljbGUnLCdIZWF0d2F2ZXM6IDYtZGF5IGN5Y2xlJykpICsKICB0aGVtZSgKICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X2JsYW5rKCksCiAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAnd2hpdGUnLCBjb2xvdXIgPSAnd2hpdGUnKSwKICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTI4LCBmYWNlPSJib2xkIiwgY29sb3IgPSAiYmxhY2siKSwgCiAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplPTI4LCBmYWNlPSJib2xkIiksCiAgICBsZWdlbmQucG9zaXRpb249YygwLjMsIDAuODUpLAogICAgbGVnZW5kLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbD1hbHBoYSgnd2hpdGUnLCAwLjgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZT0wLjUsIGxpbmV0eXBlPSJzb2xpZCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3VyID0iYmxhY2siKSwKICAgIGxlZ2VuZC5tYXJnaW49bWFyZ2luKHIgPSAxLCB1bml0PSdpbmNoJyksCiAgICBsZWdlbmQua2V5ID0gZWxlbWVudF9ibGFuaygpLAogICAgbGVnZW5kLmtleS53aWR0aCA9IHVuaXQoMC41LCAnaW5jaCcpLAogICAgbGVnZW5kLmtleS5oZWlnaHQgPSB1bml0KDAuNSwgJ2luY2gnKSwKICAgIHBhbmVsLmJvcmRlciA9IGVsZW1lbnRfcmVjdChjb2xvdXIgPSAiYmxhY2siLCBmaWxsPU5BLCBzaXplPTIpLAogICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAzMiwgZmFjZT0iYm9sZCIpLAogICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAzMiwgZmFjZT0iYm9sZCIpLAogICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDI3LCBmYWNlPSJib2xkIiksCiAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMjgsIGZhY2U9ImJvbGQiKSwKICAgIHBsb3QubWFyZ2luID0gdW5pdChjKDAuMSwwLjYsMC4xLDAuMSksICJpbiIpKSsKICBndWlkZXMoY29sb3IgPSBndWlkZV9sZWdlbmQob3ZlcnJpZGUuYWVzID0gbGlzdChzaXplID0gNCkpKQpwbG90Lmh3cyA9IHBsb3QuaHdzICsgYW5ub3RhdGUoInJlY3QiLCB4bWluID0gMS4yNSwgeG1heCA9IDQuNzUsIHltaW4gPSAtSW5mLCB5bWF4ID0gSW5mLCBhbHBoYSA9IC4xNSwgZmlsbCA9ICIjRTMyNDJCIikKCmBgYAoKIyMgMTEuIHNhdmUgaW1hZ2VzCmBgYHtyfQpnZ3NhdmUoJ3Bsb3QuY2FsbS5wbmcnLCBwbG90LmNhbG0sIHVuaXRzID0gJ2luJywgZHBpID0gMzAwLCB3aWR0aCA9IDE2LCBoZWlnaHQgPSAxMikKZ2dzYXZlKCdwbG90Lmh3cy5wbmcnLCBwbG90Lmh3cywgdW5pdHMgPSAnaW4nLCBkcGkgPSAzMDAsIHdpZHRoID0gMTYsIGhlaWdodCA9IDEyKQoKYGBgCgojIyAxMi4gbWVyZ2UgcGxvdHMKYGBge3J9CnBsb3QubWVyZ2UgPSBnZ2FycmFuZ2UocGxvdC5jYWxtLCBwbG90Lmh3cywgCiAgICAgICAgICBsYWJlbHMgPSBjKCJhIiwgImIiKSwKICAgICAgICAgIG5jb2wgPSAxLCBucm93ID0gMiwgZm9udC5sYWJlbCA9IGxpc3Qoc2l6ZSA9IDM1KSkKZ2dzYXZlKCdwbG90X21lcmdlLnBuZycsIHBsb3QubWVyZ2UsIHVuaXRzID0gJ2luJywgZHBpID0gMzAwLCB3aWR0aCA9IDE2LCBoZWlnaHQgPSAyNCkKCmBgYAoKIyMgMTMuIHN0YXRpc3RpY3MKYGBge3J9CmNhbG0uYW92IDwtIGFvdihkZWx0YUwgfiBncm91cCArIHRpbWUsIGRhdGEgPSBkZi5jYWxtKQpzdW1tYXJ5KGNhbG0uYW92KQoKaHdzLmFvdiA8LSBhb3YoZGVsdGFMIH4gZ3JvdXAgKyB0aW1lLCBkYXRhID0gZGYuaHdzKQpzdW1tYXJ5KGh3cy5hb3YpCgpUdWtleUhTRChod3MuYW92KQoKCgojIHJldmlzZWQgZGF0YSBhbmFseXNpcwptMiA8LSBsbWVyKGRlbHRhTCB+IGdyb3VwICsgZGF5ICsgKDF8aW5kaXZpZHVhbCksIGRmLmNhbG0pCnN1bW1hcnkobTIpCmFub3ZhKG0yKQoKbTMgPC0gbG1lcihkZWx0YUwgfiBncm91cCArIGRheSArICgxfGluZGl2aWR1YWwpLCBkZi5od3MpCnN1bW1hcnkobTMpCmFub3ZhKG0zKQoKbGlicmFyeShtdWx0Y29tcCkKc3VtbWFyeShnbGh0KG0zLCBsaW5mY3QgPSBtY3AoZ3JvdXAgPSAiVHVrZXkiKSksIHRlc3QgPSBhZGp1c3RlZCgiaG9sbSIpKQpzdW1tYXJ5KGdsaHQobTIsIGxpbmZjdCA9IG1jcChncm91cCA9ICJUdWtleSIpKSwgdGVzdCA9IGFkanVzdGVkKCJob2xtIikpCgojY2hlY2sgZGF0YQpsZXZlbmVUZXN0KGRlbHRhTCB+IGdyb3VwLCBkYXRhID0gZGYuY2FsbSkgCnBsb3QobTIpCmFvdl9yZXNpZHVhbHMgPC0gcmVzaWR1YWxzKG9iamVjdCA9IG0yKQpzaGFwaXJvLnRlc3QoeCA9IGFvdl9yZXNpZHVhbHMpCmtzLnRlc3QoZGYuY2FsbSRkZWx0YUwsICJwbm9ybSIpCgoKYGBgCg==