Data Structure

  1. /experiments: Experimental codes and instructions

This sub-folder contains Matlab codes and instructions for the duration reproduction task. The sequences of the duration reproductions are stored in the sub-folder /experiments/seqs. Those sequences were used for matched participants.

  1. /data: raw data files
  1. /figures: store figures used in the paper.

Data Analysis

1. load raw data

Show the raw trial structure:

glimpse(rawdata)

In the raw trials, there are several important columns which are relevant for further analyses.

  • Duration: The test durations generated by computer. ‘pdur’ is the actual presented durations by the computer. There were some fluctuations, but within 5 ms (within 1 refresh frame).
  • sub, group, sequence are anonymized subject number, group and the duration sequence used in the experiment.
  • Reproduction, rep_err: the reproduced durations and the reproduction errors compared to the given duration.
  • itd, preDuration: the inter-trial difference in a given trial, and the duration used in the previous trial. These were used in the sequential effect analysis.

Participants

# Total participants
print(length (unique(rawdata$sub)))
# total sequences (pairs)
print(length(unique(rawdata$sequence)))

The sampled durations and sequences

Let’s first illustrate the sequence and the distribution of the sample durations.

# ---- illustrate one sequence -----
fig11 = ggplot(rawdata, aes(Duration)) + geom_histogram(binwidth = 0.1, fill = I("white"), col = I('black')) + 
  theme_classic() + xlab('Duration (secs)')

# a typical sequence
sub1 = rawdata %>% filter(sub == 'ara27')
fig12 = ggplot(sub1, aes(trlNo, Duration, color = Volatility)) + geom_line() + 
  xlab("Trial Sequence") + theme_classic()+
  theme(legend.position = 'top')

# histogram of the typical sequence

fig13 = ggplot(sub1, aes(y=Duration, color = Volatility)) + geom_density() + theme_classic() + theme(legend.position = 'top')
fig13

fig1 = plot_grid(fig12,fig13, rel_widths =c(3,1))
fig1 
if (saveFig){
  ggsave("figures/fig_sequence.png", fig1, width=4, height=3.5)
  ggsave("figures/fig_sequence.pdf", fig1, width=4, height=3.5)
}

Explorative data analysis and outlier detection

We first estimate two key signatures - the central tendency index (ci) and the sequential dependence index (si).

# using error for regression, -slope is the central tendency index. 
ct_model <- function(df){
  lm(rep_err ~ Duration, data = df)
}

# sequential effect using the duration from the previous trial
seq_model <- function(df){
  lm(rep_err ~ preDuration, data = df)
}

# exclude extreme trials (beyond [1/3D, 3D])
vdata = rawdata %>% 
  filter(Reproduction > Duration/3, Reproduction < 3*Duration) 

# calculate slope for the central tendency as well as the sequential dependence. 
slopes_ct <- vdata %>% group_by(sub, sequence, Volatility, group, Order) %>%
  nest()  %>%  # nested data
  mutate(model = map(data, ct_model)) %>%  # linear regression
  mutate(slope = map(model, broom::tidy)) %>%  # get estimates out
  unnest(slope, .drop = TRUE) %>% # remove raw data
  select(-std.error,-statistic, -p.value) %>%  # remove unnecessary columns
  spread(term, estimate) %>%   # spread estimates
  rename(intercept_ct = `(Intercept)`, slope = Duration) %>%
  select(-data, -model)

#sequential effect
slopes_seq <- vdata %>% filter(!is.na(preDuration)) %>%
  group_by(sub, sequence, Volatility, group, Order) %>%
  nest()  %>%  # nested data
  mutate(model = map(data, seq_model)) %>%  # linear regression
  mutate(slope = map(model, broom::tidy)) %>%  # get estimates out
  unnest(slope, .drop = TRUE) %>% # remove raw data
  select(-std.error,-statistic, -p.value) %>%  # remove unnecessary columns
  spread(term, estimate) %>%   # spread estimates
  rename(intercept_seq = `(Intercept)`, seq_slope = preDuration) %>% 
  select(-data, -model)

# merge two tables together
slopes_all = left_join(slopes_ct, slopes_seq, 
                       by = c("sub", "sequence", "Volatility","group","Order")) %>% 
  mutate(ci = -slope, si = seq_slope)  #central tendency index

# estimated general biases (over-/under-estimates)

# individual mean interval (middle point): most of them were around 1 by design
mInterval  = vdata %>% group_by(sub) %>%  summarise(mDur = mean(Duration))

# join the mean interval, and estimate the general bias
slopes = slopes_all %>% left_join(., mInterval, by = c('sub')) %>% 
  mutate(gBias = (intercept_ct + slope * mDur)*1000)

# change factor order for plotting
slopes$Volatility = factor(slopes$Volatility)
slopes$Order = factor(slopes$Order)
slopes$group = factor(slopes$group)

head(slopes)

Let’s plot the histograms of the central tendency index and the sequential dependence index, which show some outliers. We visualize the outliers using 3-sigma rule. The 3-sigma rule only rule out 0.3% of the population if we assume the population is normal.

ci_3sig = mean(slopes$ci) + c(-1,1)*3*sd(slopes$ci)
si_3sig = mean(slopes$si) + c(-1,1)*3*sd(slopes$si)

hist1 = ggplot(slopes, aes(x = ci, y = ..density..)) + 
  geom_histogram(colour = 1, fill = 'white', bins = 20)  + 
  geom_vline(xintercept = ci_3sig, linetype = 'dashed', color = 'red') +
  theme_classic() + xlab('Central Tendency Index')
hist2 = ggplot(slopes, aes(x = si, y = ..density..)) + 
  geom_histogram(colour = 1, fill = 'white', bins = 20)  + 
    geom_vline(xintercept = ci_3sig, linetype = 'dashed', color = 'red') +
  theme_classic() + xlab('Sequential Dependence Index')

hist_fig = plot_grid(hist1,hist2, nrow = 2)
hist_fig
if (saveFig){
  ggsave("figures/hist_fig.png", hist_fig, width=4, height=3.5)
  ggsave("figures/hist_fig.pdf", fig1, width=4, height=3.5)
}

Note, the above outlier detection method is agnostic to the groups and conditions!

Let’s find out those outliers and exclude by sequences for further analyses (given that ASD and TD groups were paired).

slopes %>% ungroup() %>% filter(ci > ci_3sig[2] | ci < ci_3sig[1] | si > si_3sig[2] | si < si_3sig[1]) %>% select(sequence) -> outlier_seq
outlier_seq$sequence

Now let’s visualize the outliers together with their matched pairs.

# ---- plot  outliers  ----
fig_outlier = rawdata %>% ungroup() %>% filter(sequence %in% outlier_seq$sequence) %>% 
  filter(Reproduction > Duration/3, Reproduction < 3*Duration) %>% 
  group_by(sub, group,sequence, Volatility, Duration) %>%
  summarise(mRep = mean(Reproduction), sdr=sd(Reproduction), n = n(), 
            se = sd(Reproduction)/sqrt(n-1)) %>% filter(n>5) %>% #approx. for linear regression without averaging first
  ggplot(aes(Duration, mRep, color = group, 
             group = interaction(group, Volatility), 
             shape = Volatility, linetype = Volatility)) + 
  geom_point()  + geom_smooth(method = 'lm', se = FALSE) + 
  facet_wrap(~sequence, ncol = 4) +
  theme_classic() + theme(legend.pos = 'bottom') +
  geom_abline(slope = 1, linetype = 3) + 
  xlab('Duration (Secs)') + ylab(' Reproduction (Secs)') + 
  theme(strip.background = element_blank(), strip.text.x = element_blank())
fig_outlier
if (saveFig){
  ggsave("figures/fig_outlier.png", fig_outlier, width=5, height=5)
  ggsave("figures/fig_outlier.pdf", fig_outlier, width=5, height=5)
}

Mean slopes and related statistics:

slopes %>% filter(sequence %in% outlier_seq$sequence) %>% arrange(group, Volatility)
vslopes = slopes %>% filter(!(sequence %in% outlier_seq$sequence))

# outliers
oslopes = slopes %>% filter(sequence %in% outlier_seq$sequence)

# ANOVA
ezANOVA(data = oslopes, dv = ci, 
                 wid = sub, 
                 within = Volatility,
                 between = group)

Outliers and sequential dependence

Visualize the strong sequential dependence.

fig_sdep31 = rawdata %>% filter(sequence %in% c(31) ) %>% # the extreme sequential dependence pair
  mutate_at("preDuration", round, 1) %>%
  group_by(sequence, group, preDuration) %>% 
  summarise(rep_err = mean(rep_err)) %>% 
  ggplot(aes(preDuration, rep_err, color = group) ) + 
    geom_point() + geom_smooth(method = 'lm') + theme_classic() + 
    geom_abline(slope = 0, linetype = 2) + 
#  facet_wrap(~sequence) +
    xlab('Duration trial n-1') + ylab('Repr. Error (Secs)') + 
  theme(strip.background = element_blank(), strip.text.x = element_blank(), legend.position = 'bottom') 
fig_sdep31

fig_o = plot_grid(fig_outlier, fig_sdep31, nrow = 1, labels = c('a','b'), rel_widths = c(2.4,1))
if (saveFig){
  ggsave("figures/fig_o.png", fig_o, width=7, height=3)
  ggsave("figures/fig_o.pdf", fig_o, width=7, height=3)
  
}

Typical reproduction performance

And here are the two typical participants produced errors from sequence 12:

# ---- reproduction figure - an example -----
# mean analysis
mrep = rawdata %>% ungroup() %>% filter(!(sequence %in% outlier_seq$sequence)) %>% 
  filter(Reproduction > Duration/3, Reproduction < 3*Duration) %>% 
  group_by(sub, group,Order, sequence, Volatility, Duration) %>%
  summarise(mRep = mean(Reproduction), sdr=sd(Reproduction), n = n(), 
            se = sd(Reproduction)/sqrt(n-1)) %>% filter(n>3)

# individual examples
# asd
fig_asd = mrep%>% 
  filter( sequence == '11', group == 'ASD') %>% 
  ggplot(aes(Duration, mRep, color = Volatility, group = Volatility, shape = Volatility)) + 
  geom_point(size = 2) + 
  #geom_line(aes(linetype = Volatility)) + 
  geom_smooth(method = 'lm', aes(fill = Volatility), se = FALSE) +
  geom_errorbar(aes(ymin = mRep - se, ymax = mRep +se), width = 0.05) + 
  theme_classic() + theme(strip.background = element_blank()) +
  geom_abline(slope = 1, linetype = 2) + 
  theme(legend.position = 'none', plot.margin = unit(c(0,0,0,0),'cm')) +
  ylab('') + xlab('')

#td
fig_td = mrep%>% 
  filter( sequence == '11', group == 'TD') %>% 
  ggplot(aes(Duration, mRep, color = Volatility, group = Volatility, shape = Volatility)) + 
  geom_point(size = 2) + 
  geom_smooth(method = 'lm', aes(fill = Volatility), se = FALSE) +
  geom_errorbar(aes(ymin = mRep - se, ymax = mRep +se), width = 0.05) + 
  theme_classic() + theme(strip.background = element_blank()) +
  geom_abline(slope = 1, linetype = 2) + 
  theme(legend.position = 'none', plot.margin = unit(c(0,0,0,0),'cm')) +
  ylab('') + xlab('')

# group mean reproductions

fig_repd_gr = mrep%>% 
  ggplot(aes(Duration, mRep, color = Volatility, group = Volatility, shape = Volatility)) + 
  geom_point(alpha = 0.2) + 
  geom_smooth(method = 'lm', se = FALSE, aes(fill = Volatility)) +
  theme_classic() + theme(strip.background = element_blank()) +
  geom_abline(slope = 1, linetype = 2) + 
  facet_wrap(~group) + theme(legend.position = c(0.1,0.85)) +
  xlab('Duration (Secs)') + ylab('Reproduction (Secs)')

# plot individual example as inset. 

fig_mrep = ggdraw() + draw_plot(fig_repd_gr) + 
  draw_plot(fig_asd, x = 0.3, y = 0.13, width  = .2, height = .3) + 
  draw_plot(fig_td, x = 0.75, y = 0.13, width  = .2, height = .3) 
  
fig_mrep
if(saveFig){
  ggsave("figures/fig_reproduction.png", fig_mrep, width=7, height=3.5)
  ggsave("figures/fig_reproduction.pdf", fig_mrep, width=7, height=3.5)
}

As we can see from the patterns above. The ASD participant produced relative flat errors, while the TD participant showed a strong central tendency effect (shorts being overestimated and longs being underestimated).

Visulize CTE and sequential dependence

Let’s visualize the biases (central tendency and serial dependence) for two groups (ASD vs. TD)

pd = position_dodge(width = 0.05)

# plot CTI and SI together
fig_biases = vslopes%>% 
  group_by(group, Volatility, Order) %>% 
  summarise(msi = mean(si), n = n(), se_si = sd(si)/sqrt(n),
            mci = mean(ci), se_ci = sd(ci)/sqrt(n)) %>%
  ggplot(aes(msi, mci, color = group, shape = Volatility, 
              group=interaction(Order, group))) + 
  geom_hline(yintercept = 0, color = 'gray', linetype = 'dashed') + 
  geom_vline(xintercept = 0, color = 'gray', linetype = 'dashed') + 
  geom_point(size = 2) + 
  geom_line(aes(linetype = Order)) + 
  geom_errorbar(aes(ymin = mci - se_ci, ymax = mci + se_ci), width = 0.01 ) + 
  geom_errorbarh(aes(xmin = msi - se_si, xmax = msi + se_si), height = 0.01) + 
  xlab('Serial Dependence') + ylab('Central Tendency') + 
  scale_y_continuous(labels = scales::percent) + 
  scale_x_continuous(labels = scales::percent) + 
  guides(color = guide_legend(title = 'Group'), 
         linetype = guide_legend(title = 'Volatility Order'),
         ) +
  theme_classic() +
  theme(legend.position = 'bottom')
fig_biases
if (saveFig){
  ggsave("figures/fig_biases.png", fig_biases, width=5, height=4)
  ggsave("figures/fig_biases.pdf", fig_biases, width=5, height=4)
}

By visual inspection, individuals with ASD exhibited less central tendency relative to their matched TD controls (the red lines below the cyan lines in the above figure), while the local serial dependence was relatively comparable between two groups except in the low volatility condition when that condition started first. Interestingly, the central tendency and serial dependence were similar for both groups when the high-volatility session started first (the solid lines), while they differed when the low-volatility session started first (the dashed lines).

Given that the main difference was shown in CTE. We further plot the mean CTEs.

#pd = position_dodge(width = 0.5)
# separate plots for appendix
fig_cti = vslopes %>% 
  group_by(group, Volatility, Order) %>% 
  summarise(mci = mean(ci), n = n(), se = sd(ci)/sqrt(n)) %>%
  ggplot(aes(Volatility, mci, shape = Order, color = Order, group = Order)) + 
  geom_line() + geom_point(size= 2) + 
  #geom_bar(stat = 'identity', position = pd, width = 0.5) + 
  facet_wrap(~group)+
  geom_errorbar(aes(ymin = mci - se, ymax = mci + se), width = 0.2) + 
  theme_classic() + theme(legend.position = 'bottom', strip.background = element_blank()) +
  xlab('Volatility') + ylab('CTI') + 
  scale_y_continuous(labels = scales::percent) + 
  guides(color = guide_legend(title = 'Order'), fill = guide_legend(title = 'Order'))
fig_cti

Let’s do the sequential dependence as well.

pd = position_dodge(width = 0.5)
# separate plots for appendix
fig_sdi = vslopes %>% 
  group_by(group, Volatility, Order) %>% 
  summarise(msi = mean(si), n = n(), se = sd(si)/sqrt(n)) %>%
  ggplot(aes(Volatility, msi, shape = Order, color = Order, group = Order)) + 
  geom_line() + geom_point(size = 2) +
  #geom_bar(stat = 'identity', position = pd, width = 0.5) + 
  facet_wrap(~group)+
  geom_errorbar(aes(ymin = msi - se, ymax = msi + se), width = 0.2) + 
  theme_classic() + theme(legend.position = 'bottom', strip.background = element_blank()) +
  xlab('Volatility') + ylab('SDI') + 
  scale_y_continuous(labels = scales::percent) + 
  guides(color = guide_legend(title = 'Order'), fill = guide_legend(title = 'Order'))
fig_sdi
fig3 = plot_grid(fig_cti, fig_sdi, nrow = 1, labels = c("a","b"))
fig3
if (saveFig){
  ggsave('figures/fig3.pdf',fig3, width = 7, height = 3.5)
  ggsave('figures/fig3.png',fig3, width = 7, height = 3.5)
}

Statistics

  1. Central tendency effect

Average CTIs

vslopes %>% group_by(group) %>% summarise(mcti = mean(ci))
vslopes %>% group_by(Volatility) %>% summarise(mcti = mean(ci))
vslopes %>% group_by(Order) %>% summarise(mcti = mean(ci))
# calculate mean elevated CTIs between HV First vs. LV First
vslopes %>% group_by(group, Volatility, Order) %>% summarise(mcti = mean(ci)) %>%
  pivot_wider(names_from = Order, values_from = mcti) %>% 
  mutate(dCTI = `HV First` - `LV First`) %>% 
  group_by(group) %>% summarise(md = mean(dCTI))
vslopes = as.data.frame(vslopes) # required by rstatix
# ---- central tendency index----
# repeated measures ANOVA on central tendency index
anova1 = anova_test(data = vslopes, dv = ci, 
                 wid = sub, 
                 within = Volatility,
                 between = c(group, Order))
anova1

## separate for Volatility order
anova1a = anova_test(data = vslopes %>% filter(group == 'ASD'), 
                  dv = ci, 
                  wid = sub, 
                  within = Volatility,
                  between = Order)
anova1a

anova1b = anova_test(data = vslopes  %>% filter(group == 'TD'), 
                  dv = ci, 
                  wid = sub, 
                  within = Volatility,
                  between = Order)
anova1b
  1. Bayes factor analysis for pair-wise comparison

The above analysis showed that the main difference came from the central tendency. Here we further get the central tendency bias and Bayes factor analyses:


# --- Bayes t-tests
bftest = function(df){
  df = as.data.frame(df)
  # get the means
  rdf = df%>% summarise(mci = mean(ci), 
                        se_ci = sd(ci)/sqrt(n()),
                        msi = mean(si), 
                        se_si = sd(si)/sqrt(n()))
  rdf$ci_bf = ttestBF(df$ci, mu = 0) %>% extractBF() %>% .$bf
  rdf$si_bf = ttestBF(df$si, mu = 0) %>% extractBF() %>% .$bf
  return(rdf)
}

vslopes %>% group_by(group, Volatility, Order) %>% nest() %>%
  mutate(bf = map(data, bftest)) %>% unnest(bf, .drop = TRUE)

# group comparison for the low-vol-first, high-vol session
vslopes %>% filter(Volatility == 'High Vola.', Order == 'LV First') %>% as.data.frame() ->v11
t_test(data = v11, formula = ci ~ group) 
ttestBF(data = v11, formula = ci ~ group)

vslopes %>% filter(Volatility == 'Low Vola.', Order == 'LV First') %>% as.data.frame() ->v12
t_test(data = v12, formula = ci ~ group) 
ttestBF(data = v12, formula = ci ~ group)
  1. ANOVA analyses for the serial dependence indices:
# ---- Serial dependence index----
anova2 = ezANOVA(data = vslopes, dv = si, 
                 wid = sub, 
                 within = .(Volatility),
                 between = .(group, Order))
anova2$ANOVA

# Bayes factors
bf = anovaBF(si ~ Volatility + group + Order, data = vslopes, whichRandom = "sub")
bayesfactor_inclusion(bf) #bayes inclusion values

## separate for session order
anova2a = ezANOVA(data = vslopes %>% filter(Order == 'LV First'), 
                  dv = si, 
                  wid = sub, 
                  within = .(Volatility),
                  between = .(group))
anova2a$ANOVA

anova2b = ezANOVA(data = vslopes %>% filter(Order == 'HV First'), 
                  dv = si, 
                  wid = sub, 
                  within = .(Volatility),
                  between = .(group))
anova2b$ANOVA
  1. General biases

Additionally we examined the general biases:

# ---- descriptive of general bias ----
vslopes %>% group_by(group) %>% summarise(mg = mean(gBias), se = sd(gBias)/sqrt(n())) 

# ANOVA shows no differences
anova2 = ezANOVA(data = vslopes, dv = gBias, 
                 wid = sub, 
                 within = .(Volatility),
                 between = .(group, Order))
anova2$ANOVA

bf = anovaBF(gBias ~  group + Volatility + Order, 
             data = as.data.frame(vslopes), whichRandom = "sub")
bayesfactor_inclusion(bf) #bayes inclusion values

We then visualize the general biases

# --- general bias
fig_bias = vslopes %>% group_by(group, Volatility, Order) %>%
  summarise(mbias = mean(gBias), n = n(), se = sd(gBias)/sqrt(n)) %>%
  ggplot(aes(Volatility, mbias, color = Order,linetype = group, group = interaction(Order, group), shape = group)) + 
  geom_point(size = 3, position = pd) + 
  geom_line(position = pd) +
  geom_errorbar(aes(ymin = mbias - se, ymax = mbias + se), width = 0.2, position = pd) + 
  theme_classic()  + theme(legend.position = 'bottom') + xlab('Volatility') + 
  ylab('Mean overestimation (ms)') 
fig_bias

There was no difference in two groups in general biases, although both groups were positive overestimated.

Next we examined the reproduced variability:

# ---- Reproduction variability -----
msds_r <- mrep  %>% 
  filter(n>5) %>% 
  group_by(group, Order, Volatility,  sub) %>%
  summarise(msd = mean(sdr), n=n(), msd_se = sd(sdr)/sqrt(n))
  

sd_ANOVA <- ezANOVA(msds_r, dv=msd, wid=sub, between=.(group,Order), within=Volatility)
sd_ANOVA$ANOVA

mmsds_r <- msds_r %>% summarize(mmsd=mean(msd*1000), n = n(), se = sd(msd*1000)/sqrt(n))

pd = position_dodge(width = 0.5)
fig_sd <- ggplot(mmsds_r, aes(Volatility, mmsd, shape = Order, color = Order, group = Order)) + 
  geom_line() + geom_point() + 
  #geom_bar(stat = 'identity', position = pd, width = 0.5) + 
  geom_errorbar(aes(ymin = mmsd - se, ymax = mmsd + se), width = 0.3) +
  facet_wrap(~group) +
  ylab('Mean Standard Deviation (ms)') + xlab('Volatility') + theme_classic()  
#  coord_cartesian(ylim = c(140, 200)) 
fig_sd

if(saveFig){
  ggsave('figures/fig_sd.png', fig_sd, width=5, height=4)
  ggsave('figures/fig_sd.pdf', fig_sd, width=5, height=4)
}

Correlation analysis

Next we import individual participant ratings and do correlation analyses.

pinfo = read.csv('data/parinfo.csv')

# join with ctis, sdis
res = left_join(vslopes, pinfo, by = c('group','sequence'))
res$group = as.factor(res$group)

# scatter plot to see any relations
fig_corr = ggduo(res, c('AQ','EQ','BDI'), c('ci','si'), mapping = aes(color = group, shape = Order),
      types = list(continuous = 'smooth_lm', se = FALSE), 
      showStrips = FALSE, legend = 3,
      columnLabelsY = c('CTI','SDI')) + 
  theme_classic() + theme(legend.position = 'bottom', strip.background = element_blank()) 
if(saveFig){
  ggsave('figures/fig_corr.png', fig_corr, width=5, height=4)
  ggsave('figures/fig_corr.pdf', fig_corr, width=5, height=4)
}

fig_corr

Get linear regression out

ci_AQ <- function(df){
  lm(ci ~ AQ, data = df)
}
ci_EQ <- function(df){
  lm(ci ~ EQ, data = df)
}
ci_BDI <- function(df){
  lm(ci ~ BDI, data = df)
}

si_AQ <- function(df){
  lm(si ~ AQ, data = df)
}
si_EQ <- function(df){
  lm(si ~ EQ, data = df)
}
si_BDI <- function(df){
  lm(si ~ BDI, data = df)
}

# regression
reg_res <- res %>% group_by(Volatility, group, Order) %>%
  nest()  %>%  # nested data
  mutate(ci_AQ = map(data, ci_AQ), ci_EQ = map(data, ci_EQ),
         ci_BDI = map(data, ci_BDI), 
         si_AQ = map(data, si_AQ), si_EQ = map(data, si_EQ),
         si_BDI = map(data, si_BDI)) %>%
  mutate(mci_AQ = map(ci_AQ, broom::tidy), 
         mci_EQ = map(ci_EQ, broom::tidy),
         mci_BDI = map(ci_BDI, broom::tidy),
         msi_AQ = map(si_AQ, broom::tidy),
         msi_EQ = map(si_EQ, broom::tidy),
         msi_BDI = map(si_BDI, broom::tidy)  ) %>%
  unnest(cols = c(mci_AQ, mci_EQ, mci_BDI, msi_AQ, msi_EQ, msi_BDI), names_repair = 'unique' , .drop = TRUE) %>%
  select(-ci_AQ, -ci_BDI, -ci_EQ, -si_AQ, -si_EQ, -si_BDI, -data, 
         -starts_with('st')) %>% 
  filter(term == 'AQ') # remove intercept

Given there is no significant of slopes (after correction), but some difference in intercepts, we do general linear regression, without separating groups.

reg_res2 <- res %>% ungroup() %>% group_by(Order, Volatility) %>%
  nest()  %>%  # nested data
  mutate(ci_AQ = map(data, ci_AQ), ci_EQ = map(data, ci_EQ),
         ci_BDI = map(data, ci_BDI), 
         si_AQ = map(data, si_AQ), si_EQ = map(data, si_EQ),
         si_BDI = map(data, si_BDI)) %>%
  mutate(mci_AQ = map(ci_AQ, broom::tidy), 
         mci_EQ = map(ci_EQ, broom::tidy),
         mci_BDI = map(ci_BDI, broom::tidy),
         msi_AQ = map(si_AQ, broom::tidy),
         msi_EQ = map(si_EQ, broom::tidy),
         msi_BDI = map(si_BDI, broom::tidy)  ) %>%
  unnest(cols = c(mci_AQ, mci_EQ, mci_BDI, msi_AQ, msi_EQ, msi_BDI), names_repair = 'unique' , .drop = TRUE) %>%
  select(-ci_AQ, -ci_BDI, -ci_EQ, -si_AQ, -si_EQ, -si_BDI, -data, 
         -starts_with('st')) %>% 
  filter(term == 'AQ') # remove intercept

Again, there is no significant of slopes.

LS0tCnRpdGxlOiAiRGF0YSBBbmFseXNpcyBvZiBQcmVkaWN0aXZlIGNvZGluZyBpbiBBU0QiCmF1dGhvcjogIlouIFNoaSwgTC4gVGhlaXNpbmdlciwgRi4gQWxsZW5tYXJrLCBSLiBQaXN0b3JpdXMsIEguIE3DvGxsZXIsIEMuIEZhbHRlci1XYWduZXIiCm91dHB1dDogaHRtbF9ub3RlYm9vawotLS0KCiMgRGF0YSBTdHJ1Y3R1cmUKCjEuIGAvZXhwZXJpbWVudHNgOiBFeHBlcmltZW50YWwgY29kZXMgYW5kIGluc3RydWN0aW9ucwoKVGhpcyBzdWItZm9sZGVyIGNvbnRhaW5zIE1hdGxhYiBjb2RlcyBhbmQgaW5zdHJ1Y3Rpb25zIGZvciB0aGUgZHVyYXRpb24gcmVwcm9kdWN0aW9uIHRhc2suIFRoZSBzZXF1ZW5jZXMgb2YgdGhlIGR1cmF0aW9uIHJlcHJvZHVjdGlvbnMgYXJlIHN0b3JlZCBpbiB0aGUgc3ViLWZvbGRlciBgL2V4cGVyaW1lbnRzL3NlcXNgLiBUaG9zZSBzZXF1ZW5jZXMgd2VyZSB1c2VkIGZvciBtYXRjaGVkIHBhcnRpY2lwYW50cy4gCgoyLiBgL2RhdGFgOiByYXcgZGF0YSBmaWxlcwoKLSBgcmF3ZGF0YS5jc3ZgOiBSYXcgcmVwcm9kdWN0aW9uIHRyaWFscwotIGBvdXRsaWVycy5jc3ZgOiB0aG9zZSBwcm9kdWNlZCBhbG1vc3QgZmxhdCByZXByb2R1Y3Rpb24KCjMuIGAvZmlndXJlc2A6IHN0b3JlIGZpZ3VyZXMgdXNlZCBpbiB0aGUgcGFwZXIuIAoKIyBEYXRhIEFuYWx5c2lzCgojIyAxLiBsb2FkIHJhdyBkYXRhCmBgYHtyIHBhY2thZ2VzLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBpbmNsdWRlPUZBTFNFfQojIGxvYWQgcGFja2FnZXMKbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkoZXopCmxpYnJhcnkoY293cGxvdCkKbGlicmFyeShCYXllc0ZhY3RvcikgIyBpbiBjYXNlIG5lZWQgQmF5ZXMgZmFjdG9yIGFuYWx5c2lzCmxpYnJhcnkoYmF5ZXN0ZXN0UikKbGlicmFyeShyc3RhdGl4KSAjIHVzaW5nIHRpZHl2ZXJzZSBmcmllbmRseSBzdGF0aXN0aWNzCmxpYnJhcnkoR0dhbGx5KQoKIyAtLS0tIHJlYWQgZGF0YSBhbmQgcHJlcGFyYXRpb24gLS0tLS0KcmF3ZGF0YSA9IHJlYWRfY3N2KCcuL2RhdGEvcmF3ZGF0YS5jc3YnKSAKcmF3ZGF0YSRncm91cCA9IHRvdXBwZXIocmF3ZGF0YSRncm91cCkKIyBmbGFnCnNhdmVGaWcgPSBGQUxTRQpgYGAKClNob3cgdGhlIHJhdyB0cmlhbCBzdHJ1Y3R1cmU6IApgYGB7ciByYXcgdHJpYWwgc3RydWN0dXJlfQpnbGltcHNlKHJhd2RhdGEpCgpgYGAKSW4gdGhlIHJhdyB0cmlhbHMsIHRoZXJlIGFyZSBzZXZlcmFsIGltcG9ydGFudCBjb2x1bW5zIHdoaWNoIGFyZSByZWxldmFudCBmb3IgIGZ1cnRoZXIgYW5hbHlzZXMuIAoKLSBgRHVyYXRpb25gOiBUaGUgdGVzdCBkdXJhdGlvbnMgZ2VuZXJhdGVkIGJ5IGNvbXB1dGVyLiAncGR1cicgaXMgdGhlIGFjdHVhbCBwcmVzZW50ZWQgZHVyYXRpb25zIGJ5IHRoZSBjb21wdXRlci4gVGhlcmUgd2VyZSBzb21lIGZsdWN0dWF0aW9ucywgYnV0IHdpdGhpbiA1IG1zICh3aXRoaW4gMSByZWZyZXNoIGZyYW1lKS4gCi0gYHN1YmAsIGBncm91cGAsIGBzZXF1ZW5jZWAgYXJlIGFub255bWl6ZWQgc3ViamVjdCBudW1iZXIsIGdyb3VwIGFuZCB0aGUgZHVyYXRpb24gc2VxdWVuY2UgdXNlZCBpbiB0aGUgZXhwZXJpbWVudC4gCi0gYFJlcHJvZHVjdGlvbmAsIGByZXBfZXJyYDogdGhlIHJlcHJvZHVjZWQgZHVyYXRpb25zIGFuZCB0aGUgcmVwcm9kdWN0aW9uIGVycm9ycyBjb21wYXJlZCB0byB0aGUgZ2l2ZW4gZHVyYXRpb24uIAotIGBpdGRgLCBgcHJlRHVyYXRpb25gOiB0aGUgaW50ZXItdHJpYWwgZGlmZmVyZW5jZSBpbiAgYSBnaXZlbiB0cmlhbCwgYW5kIHRoZSBkdXJhdGlvbiB1c2VkIGluIHRoZSBwcmV2aW91cyB0cmlhbC4gVGhlc2Ugd2VyZSB1c2VkIGluIHRoZSBzZXF1ZW50aWFsIGVmZmVjdCBhbmFseXNpcy4gCgojIyMgUGFydGljaXBhbnRzCgpgYGB7ciBwYXJ0aWNpcGFudHN9CiMgVG90YWwgcGFydGljaXBhbnRzCnByaW50KGxlbmd0aCAodW5pcXVlKHJhd2RhdGEkc3ViKSkpCiMgdG90YWwgc2VxdWVuY2VzIChwYWlycykKcHJpbnQobGVuZ3RoKHVuaXF1ZShyYXdkYXRhJHNlcXVlbmNlKSkpCmBgYAoKIyMgVGhlIHNhbXBsZWQgZHVyYXRpb25zIGFuZCBzZXF1ZW5jZXMKCkxldCdzIGZpcnN0IGlsbHVzdHJhdGUgdGhlIHNlcXVlbmNlIGFuZCB0aGUgZGlzdHJpYnV0aW9uIG9mIHRoZSBzYW1wbGUgZHVyYXRpb25zLiAKCmBgYHtyIHNlcXVlbmNlfQojIC0tLS0gaWxsdXN0cmF0ZSBvbmUgc2VxdWVuY2UgLS0tLS0KZmlnMTEgPSBnZ3Bsb3QocmF3ZGF0YSwgYWVzKER1cmF0aW9uKSkgKyBnZW9tX2hpc3RvZ3JhbShiaW53aWR0aCA9IDAuMSwgZmlsbCA9IEkoIndoaXRlIiksIGNvbCA9IEkoJ2JsYWNrJykpICsgCiAgdGhlbWVfY2xhc3NpYygpICsgeGxhYignRHVyYXRpb24gKHNlY3MpJykKCiMgYSB0eXBpY2FsIHNlcXVlbmNlCnN1YjEgPSByYXdkYXRhICU+JSBmaWx0ZXIoc3ViID09ICdhcmEyNycpCmZpZzEyID0gZ2dwbG90KHN1YjEsIGFlcyh0cmxObywgRHVyYXRpb24sIGNvbG9yID0gVm9sYXRpbGl0eSkpICsgZ2VvbV9saW5lKCkgKyAKICB4bGFiKCJUcmlhbCBTZXF1ZW5jZSIpICsgdGhlbWVfY2xhc3NpYygpKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICd0b3AnKQoKIyBoaXN0b2dyYW0gb2YgdGhlIHR5cGljYWwgc2VxdWVuY2UKCmZpZzEzID0gZ2dwbG90KHN1YjEsIGFlcyh5PUR1cmF0aW9uLCBjb2xvciA9IFZvbGF0aWxpdHkpKSArIGdlb21fZGVuc2l0eSgpICsgdGhlbWVfY2xhc3NpYygpICsgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gJ3RvcCcpCmZpZzEzCgpmaWcxID0gcGxvdF9ncmlkKGZpZzEyLGZpZzEzLCByZWxfd2lkdGhzID1jKDMsMSkpCmZpZzEgCmlmIChzYXZlRmlnKXsKICBnZ3NhdmUoImZpZ3VyZXMvZmlnX3NlcXVlbmNlLnBuZyIsIGZpZzEsIHdpZHRoPTQsIGhlaWdodD0zLjUpCiAgZ2dzYXZlKCJmaWd1cmVzL2ZpZ19zZXF1ZW5jZS5wZGYiLCBmaWcxLCB3aWR0aD00LCBoZWlnaHQ9My41KQp9CmBgYAoKCiMjIEV4cGxvcmF0aXZlIGRhdGEgYW5hbHlzaXMgYW5kIG91dGxpZXIgZGV0ZWN0aW9uCgpXZSBmaXJzdCBlc3RpbWF0ZSB0d28ga2V5IHNpZ25hdHVyZXMgLSB0aGUgY2VudHJhbCB0ZW5kZW5jeSBpbmRleCAoY2kpIGFuZCB0aGUgc2VxdWVudGlhbCBkZXBlbmRlbmNlIGluZGV4IChzaSkuIAoKYGBge3IgbGluZWFyX21vZGVsc30KIyB1c2luZyBlcnJvciBmb3IgcmVncmVzc2lvbiwgLXNsb3BlIGlzIHRoZSBjZW50cmFsIHRlbmRlbmN5IGluZGV4LiAKY3RfbW9kZWwgPC0gZnVuY3Rpb24oZGYpewogIGxtKHJlcF9lcnIgfiBEdXJhdGlvbiwgZGF0YSA9IGRmKQp9CgojIHNlcXVlbnRpYWwgZWZmZWN0IHVzaW5nIHRoZSBkdXJhdGlvbiBmcm9tIHRoZSBwcmV2aW91cyB0cmlhbApzZXFfbW9kZWwgPC0gZnVuY3Rpb24oZGYpewogIGxtKHJlcF9lcnIgfiBwcmVEdXJhdGlvbiwgZGF0YSA9IGRmKQp9CgojIGV4Y2x1ZGUgZXh0cmVtZSB0cmlhbHMgKGJleW9uZCBbMS8zRCwgM0RdKQp2ZGF0YSA9IHJhd2RhdGEgJT4lIAogIGZpbHRlcihSZXByb2R1Y3Rpb24gPiBEdXJhdGlvbi8zLCBSZXByb2R1Y3Rpb24gPCAzKkR1cmF0aW9uKSAKCiMgY2FsY3VsYXRlIHNsb3BlIGZvciB0aGUgY2VudHJhbCB0ZW5kZW5jeSBhcyB3ZWxsIGFzIHRoZSBzZXF1ZW50aWFsIGRlcGVuZGVuY2UuIApzbG9wZXNfY3QgPC0gdmRhdGEgJT4lIGdyb3VwX2J5KHN1Yiwgc2VxdWVuY2UsIFZvbGF0aWxpdHksIGdyb3VwLCBPcmRlcikgJT4lCiAgbmVzdCgpICAlPiUgICMgbmVzdGVkIGRhdGEKICBtdXRhdGUobW9kZWwgPSBtYXAoZGF0YSwgY3RfbW9kZWwpKSAlPiUgICMgbGluZWFyIHJlZ3Jlc3Npb24KICBtdXRhdGUoc2xvcGUgPSBtYXAobW9kZWwsIGJyb29tOjp0aWR5KSkgJT4lICAjIGdldCBlc3RpbWF0ZXMgb3V0CiAgdW5uZXN0KHNsb3BlLCAuZHJvcCA9IFRSVUUpICU+JSAjIHJlbW92ZSByYXcgZGF0YQogIHNlbGVjdCgtc3RkLmVycm9yLC1zdGF0aXN0aWMsIC1wLnZhbHVlKSAlPiUgICMgcmVtb3ZlIHVubmVjZXNzYXJ5IGNvbHVtbnMKICBzcHJlYWQodGVybSwgZXN0aW1hdGUpICU+JSAgICMgc3ByZWFkIGVzdGltYXRlcwogIHJlbmFtZShpbnRlcmNlcHRfY3QgPSBgKEludGVyY2VwdClgLCBzbG9wZSA9IER1cmF0aW9uKSAlPiUKICBzZWxlY3QoLWRhdGEsIC1tb2RlbCkKCiNzZXF1ZW50aWFsIGVmZmVjdApzbG9wZXNfc2VxIDwtIHZkYXRhICU+JSBmaWx0ZXIoIWlzLm5hKHByZUR1cmF0aW9uKSkgJT4lCiAgZ3JvdXBfYnkoc3ViLCBzZXF1ZW5jZSwgVm9sYXRpbGl0eSwgZ3JvdXAsIE9yZGVyKSAlPiUKICBuZXN0KCkgICU+JSAgIyBuZXN0ZWQgZGF0YQogIG11dGF0ZShtb2RlbCA9IG1hcChkYXRhLCBzZXFfbW9kZWwpKSAlPiUgICMgbGluZWFyIHJlZ3Jlc3Npb24KICBtdXRhdGUoc2xvcGUgPSBtYXAobW9kZWwsIGJyb29tOjp0aWR5KSkgJT4lICAjIGdldCBlc3RpbWF0ZXMgb3V0CiAgdW5uZXN0KHNsb3BlLCAuZHJvcCA9IFRSVUUpICU+JSAjIHJlbW92ZSByYXcgZGF0YQogIHNlbGVjdCgtc3RkLmVycm9yLC1zdGF0aXN0aWMsIC1wLnZhbHVlKSAlPiUgICMgcmVtb3ZlIHVubmVjZXNzYXJ5IGNvbHVtbnMKICBzcHJlYWQodGVybSwgZXN0aW1hdGUpICU+JSAgICMgc3ByZWFkIGVzdGltYXRlcwogIHJlbmFtZShpbnRlcmNlcHRfc2VxID0gYChJbnRlcmNlcHQpYCwgc2VxX3Nsb3BlID0gcHJlRHVyYXRpb24pICU+JSAKICBzZWxlY3QoLWRhdGEsIC1tb2RlbCkKCiMgbWVyZ2UgdHdvIHRhYmxlcyB0b2dldGhlcgpzbG9wZXNfYWxsID0gbGVmdF9qb2luKHNsb3Blc19jdCwgc2xvcGVzX3NlcSwgCiAgICAgICAgICAgICAgICAgICAgICAgYnkgPSBjKCJzdWIiLCAic2VxdWVuY2UiLCAiVm9sYXRpbGl0eSIsImdyb3VwIiwiT3JkZXIiKSkgJT4lIAogIG11dGF0ZShjaSA9IC1zbG9wZSwgc2kgPSBzZXFfc2xvcGUpICAjY2VudHJhbCB0ZW5kZW5jeSBpbmRleAoKIyBlc3RpbWF0ZWQgZ2VuZXJhbCBiaWFzZXMgKG92ZXItL3VuZGVyLWVzdGltYXRlcykKCiMgaW5kaXZpZHVhbCBtZWFuIGludGVydmFsIChtaWRkbGUgcG9pbnQpOiBtb3N0IG9mIHRoZW0gd2VyZSBhcm91bmQgMSBieSBkZXNpZ24KbUludGVydmFsICA9IHZkYXRhICU+JSBncm91cF9ieShzdWIpICU+JSAgc3VtbWFyaXNlKG1EdXIgPSBtZWFuKER1cmF0aW9uKSkKCiMgam9pbiB0aGUgbWVhbiBpbnRlcnZhbCwgYW5kIGVzdGltYXRlIHRoZSBnZW5lcmFsIGJpYXMKc2xvcGVzID0gc2xvcGVzX2FsbCAlPiUgbGVmdF9qb2luKC4sIG1JbnRlcnZhbCwgYnkgPSBjKCdzdWInKSkgJT4lIAogIG11dGF0ZShnQmlhcyA9IChpbnRlcmNlcHRfY3QgKyBzbG9wZSAqIG1EdXIpKjEwMDApCgojIGNoYW5nZSBmYWN0b3Igb3JkZXIgZm9yIHBsb3R0aW5nCnNsb3BlcyRWb2xhdGlsaXR5ID0gZmFjdG9yKHNsb3BlcyRWb2xhdGlsaXR5KQpzbG9wZXMkT3JkZXIgPSBmYWN0b3Ioc2xvcGVzJE9yZGVyKQpzbG9wZXMkZ3JvdXAgPSBmYWN0b3Ioc2xvcGVzJGdyb3VwKQoKaGVhZChzbG9wZXMpCmBgYAoKTGV0J3MgcGxvdCB0aGUgaGlzdG9ncmFtcyBvZiB0aGUgY2VudHJhbCB0ZW5kZW5jeSBpbmRleCBhbmQgdGhlIHNlcXVlbnRpYWwgZGVwZW5kZW5jZSBpbmRleCwgd2hpY2ggc2hvdyBzb21lIG91dGxpZXJzLiBXZSB2aXN1YWxpemUgdGhlIG91dGxpZXJzIHVzaW5nIDMtc2lnbWEgcnVsZS4gVGhlIDMtc2lnbWEgcnVsZSBvbmx5IHJ1bGUgb3V0IDAuMyUgb2YgdGhlIHBvcHVsYXRpb24gaWYgd2UgYXNzdW1lIHRoZSBwb3B1bGF0aW9uIGlzIG5vcm1hbC4gCgpgYGB7cn0KY2lfM3NpZyA9IG1lYW4oc2xvcGVzJGNpKSArIGMoLTEsMSkqMypzZChzbG9wZXMkY2kpCnNpXzNzaWcgPSBtZWFuKHNsb3BlcyRzaSkgKyBjKC0xLDEpKjMqc2Qoc2xvcGVzJHNpKQoKaGlzdDEgPSBnZ3Bsb3Qoc2xvcGVzLCBhZXMoeCA9IGNpLCB5ID0gLi5kZW5zaXR5Li4pKSArIAogIGdlb21faGlzdG9ncmFtKGNvbG91ciA9IDEsIGZpbGwgPSAnd2hpdGUnLCBiaW5zID0gMjApICArIAogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IGNpXzNzaWcsIGxpbmV0eXBlID0gJ2Rhc2hlZCcsIGNvbG9yID0gJ3JlZCcpICsKICB0aGVtZV9jbGFzc2ljKCkgKyB4bGFiKCdDZW50cmFsIFRlbmRlbmN5IEluZGV4JykKaGlzdDIgPSBnZ3Bsb3Qoc2xvcGVzLCBhZXMoeCA9IHNpLCB5ID0gLi5kZW5zaXR5Li4pKSArIAogIGdlb21faGlzdG9ncmFtKGNvbG91ciA9IDEsIGZpbGwgPSAnd2hpdGUnLCBiaW5zID0gMjApICArIAogICAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gY2lfM3NpZywgbGluZXR5cGUgPSAnZGFzaGVkJywgY29sb3IgPSAncmVkJykgKwogIHRoZW1lX2NsYXNzaWMoKSArIHhsYWIoJ1NlcXVlbnRpYWwgRGVwZW5kZW5jZSBJbmRleCcpCgpoaXN0X2ZpZyA9IHBsb3RfZ3JpZChoaXN0MSxoaXN0MiwgbnJvdyA9IDIpCmhpc3RfZmlnCmlmIChzYXZlRmlnKXsKICBnZ3NhdmUoImZpZ3VyZXMvaGlzdF9maWcucG5nIiwgaGlzdF9maWcsIHdpZHRoPTQsIGhlaWdodD0zLjUpCiAgZ2dzYXZlKCJmaWd1cmVzL2hpc3RfZmlnLnBkZiIsIGZpZzEsIHdpZHRoPTQsIGhlaWdodD0zLjUpCn0KCmBgYAoKTm90ZSwgdGhlIGFib3ZlIG91dGxpZXIgZGV0ZWN0aW9uIG1ldGhvZCBpcyBhZ25vc3RpYyB0byB0aGUgZ3JvdXBzIGFuZCBjb25kaXRpb25zIQoKTGV0J3MgZmluZCBvdXQgdGhvc2Ugb3V0bGllcnMgYW5kIGV4Y2x1ZGUgYnkgc2VxdWVuY2VzIGZvciBmdXJ0aGVyIGFuYWx5c2VzIChnaXZlbiB0aGF0IEFTRCBhbmQgVEQgZ3JvdXBzIHdlcmUgcGFpcmVkKS4gCgpgYGB7cn0Kc2xvcGVzICU+JSB1bmdyb3VwKCkgJT4lIGZpbHRlcihjaSA+IGNpXzNzaWdbMl0gfCBjaSA8IGNpXzNzaWdbMV0gfCBzaSA+IHNpXzNzaWdbMl0gfCBzaSA8IHNpXzNzaWdbMV0pICU+JSBzZWxlY3Qoc2VxdWVuY2UpIC0+IG91dGxpZXJfc2VxCm91dGxpZXJfc2VxJHNlcXVlbmNlCmBgYAoKTm93IGxldCdzIHZpc3VhbGl6ZSB0aGUgb3V0bGllcnMgdG9nZXRoZXIgd2l0aCB0aGVpciBtYXRjaGVkIHBhaXJzLiAKCmBgYHtyIG91dGxpZXJzfQojIC0tLS0gcGxvdCAgb3V0bGllcnMgIC0tLS0KZmlnX291dGxpZXIgPSByYXdkYXRhICU+JSB1bmdyb3VwKCkgJT4lIGZpbHRlcihzZXF1ZW5jZSAlaW4lIG91dGxpZXJfc2VxJHNlcXVlbmNlKSAlPiUgCiAgZmlsdGVyKFJlcHJvZHVjdGlvbiA+IER1cmF0aW9uLzMsIFJlcHJvZHVjdGlvbiA8IDMqRHVyYXRpb24pICU+JSAKICBncm91cF9ieShzdWIsIGdyb3VwLHNlcXVlbmNlLCBWb2xhdGlsaXR5LCBEdXJhdGlvbikgJT4lCiAgc3VtbWFyaXNlKG1SZXAgPSBtZWFuKFJlcHJvZHVjdGlvbiksIHNkcj1zZChSZXByb2R1Y3Rpb24pLCBuID0gbigpLCAKICAgICAgICAgICAgc2UgPSBzZChSZXByb2R1Y3Rpb24pL3NxcnQobi0xKSkgJT4lIGZpbHRlcihuPjUpICU+JSAjYXBwcm94LiBmb3IgbGluZWFyIHJlZ3Jlc3Npb24gd2l0aG91dCBhdmVyYWdpbmcgZmlyc3QKICBnZ3Bsb3QoYWVzKER1cmF0aW9uLCBtUmVwLCBjb2xvciA9IGdyb3VwLCAKICAgICAgICAgICAgIGdyb3VwID0gaW50ZXJhY3Rpb24oZ3JvdXAsIFZvbGF0aWxpdHkpLCAKICAgICAgICAgICAgIHNoYXBlID0gVm9sYXRpbGl0eSwgbGluZXR5cGUgPSBWb2xhdGlsaXR5KSkgKyAKICBnZW9tX3BvaW50KCkgICsgZ2VvbV9zbW9vdGgobWV0aG9kID0gJ2xtJywgc2UgPSBGQUxTRSkgKyAKICBmYWNldF93cmFwKH5zZXF1ZW5jZSwgbmNvbCA9IDQpICsKICB0aGVtZV9jbGFzc2ljKCkgKyB0aGVtZShsZWdlbmQucG9zID0gJ2JvdHRvbScpICsKICBnZW9tX2FibGluZShzbG9wZSA9IDEsIGxpbmV0eXBlID0gMykgKyAKICB4bGFiKCdEdXJhdGlvbiAoU2VjcyknKSArIHlsYWIoJyBSZXByb2R1Y3Rpb24gKFNlY3MpJykgKyAKICB0aGVtZShzdHJpcC5iYWNrZ3JvdW5kID0gZWxlbWVudF9ibGFuaygpLCBzdHJpcC50ZXh0LnggPSBlbGVtZW50X2JsYW5rKCkpCmZpZ19vdXRsaWVyCmlmIChzYXZlRmlnKXsKICBnZ3NhdmUoImZpZ3VyZXMvZmlnX291dGxpZXIucG5nIiwgZmlnX291dGxpZXIsIHdpZHRoPTUsIGhlaWdodD01KQogIGdnc2F2ZSgiZmlndXJlcy9maWdfb3V0bGllci5wZGYiLCBmaWdfb3V0bGllciwgd2lkdGg9NSwgaGVpZ2h0PTUpCn0KYGBgCk1lYW4gc2xvcGVzIGFuZCByZWxhdGVkIHN0YXRpc3RpY3M6CgpgYGB7cn0Kc2xvcGVzICU+JSBmaWx0ZXIoc2VxdWVuY2UgJWluJSBvdXRsaWVyX3NlcSRzZXF1ZW5jZSkgJT4lIGFycmFuZ2UoZ3JvdXAsIFZvbGF0aWxpdHkpCnZzbG9wZXMgPSBzbG9wZXMgJT4lIGZpbHRlcighKHNlcXVlbmNlICVpbiUgb3V0bGllcl9zZXEkc2VxdWVuY2UpKQoKIyBvdXRsaWVycwpvc2xvcGVzID0gc2xvcGVzICU+JSBmaWx0ZXIoc2VxdWVuY2UgJWluJSBvdXRsaWVyX3NlcSRzZXF1ZW5jZSkKCiMgQU5PVkEKZXpBTk9WQShkYXRhID0gb3Nsb3BlcywgZHYgPSBjaSwgCiAgICAgICAgICAgICAgICAgd2lkID0gc3ViLCAKICAgICAgICAgICAgICAgICB3aXRoaW4gPSBWb2xhdGlsaXR5LAogICAgICAgICAgICAgICAgIGJldHdlZW4gPSBncm91cCkKCmBgYAojIyMgT3V0bGllcnMgYW5kIHNlcXVlbnRpYWwgZGVwZW5kZW5jZQoKVmlzdWFsaXplIHRoZSBzdHJvbmcgc2VxdWVudGlhbCBkZXBlbmRlbmNlLiAKCmBgYHtyfQpmaWdfc2RlcDMxID0gcmF3ZGF0YSAlPiUgZmlsdGVyKHNlcXVlbmNlICVpbiUgYygzMSkgKSAlPiUgIyB0aGUgZXh0cmVtZSBzZXF1ZW50aWFsIGRlcGVuZGVuY2UgcGFpcgogIG11dGF0ZV9hdCgicHJlRHVyYXRpb24iLCByb3VuZCwgMSkgJT4lCiAgZ3JvdXBfYnkoc2VxdWVuY2UsIGdyb3VwLCBwcmVEdXJhdGlvbikgJT4lIAogIHN1bW1hcmlzZShyZXBfZXJyID0gbWVhbihyZXBfZXJyKSkgJT4lIAogIGdncGxvdChhZXMocHJlRHVyYXRpb24sIHJlcF9lcnIsIGNvbG9yID0gZ3JvdXApICkgKyAKICAgIGdlb21fcG9pbnQoKSArIGdlb21fc21vb3RoKG1ldGhvZCA9ICdsbScpICsgdGhlbWVfY2xhc3NpYygpICsgCiAgICBnZW9tX2FibGluZShzbG9wZSA9IDAsIGxpbmV0eXBlID0gMikgKyAKIyAgZmFjZXRfd3JhcCh+c2VxdWVuY2UpICsKICAgIHhsYWIoJ0R1cmF0aW9uIHRyaWFsIG4tMScpICsgeWxhYignUmVwci4gRXJyb3IgKFNlY3MpJykgKyAKICB0aGVtZShzdHJpcC5iYWNrZ3JvdW5kID0gZWxlbWVudF9ibGFuaygpLCBzdHJpcC50ZXh0LnggPSBlbGVtZW50X2JsYW5rKCksIGxlZ2VuZC5wb3NpdGlvbiA9ICdib3R0b20nKSAKZmlnX3NkZXAzMQoKZmlnX28gPSBwbG90X2dyaWQoZmlnX291dGxpZXIsIGZpZ19zZGVwMzEsIG5yb3cgPSAxLCBsYWJlbHMgPSBjKCdhJywnYicpLCByZWxfd2lkdGhzID0gYygyLjQsMSkpCmlmIChzYXZlRmlnKXsKICBnZ3NhdmUoImZpZ3VyZXMvZmlnX28ucG5nIiwgZmlnX28sIHdpZHRoPTcsIGhlaWdodD0zKQogIGdnc2F2ZSgiZmlndXJlcy9maWdfby5wZGYiLCBmaWdfbywgd2lkdGg9NywgaGVpZ2h0PTMpCiAgCn0KCgpgYGAKCiMjIFR5cGljYWwgcmVwcm9kdWN0aW9uIHBlcmZvcm1hbmNlIAoKQW5kIGhlcmUgYXJlIHRoZSB0d28gdHlwaWNhbCBwYXJ0aWNpcGFudHMgcHJvZHVjZWQgZXJyb3JzIGZyb20gc2VxdWVuY2UgMTI6CmBgYHtyIHR5cGljYWwgcGFydGljaXBhbnRzfQojIC0tLS0gcmVwcm9kdWN0aW9uIGZpZ3VyZSAtIGFuIGV4YW1wbGUgLS0tLS0KIyBtZWFuIGFuYWx5c2lzCm1yZXAgPSByYXdkYXRhICU+JSB1bmdyb3VwKCkgJT4lIGZpbHRlcighKHNlcXVlbmNlICVpbiUgb3V0bGllcl9zZXEkc2VxdWVuY2UpKSAlPiUgCiAgZmlsdGVyKFJlcHJvZHVjdGlvbiA+IER1cmF0aW9uLzMsIFJlcHJvZHVjdGlvbiA8IDMqRHVyYXRpb24pICU+JSAKICBncm91cF9ieShzdWIsIGdyb3VwLE9yZGVyLCBzZXF1ZW5jZSwgVm9sYXRpbGl0eSwgRHVyYXRpb24pICU+JQogIHN1bW1hcmlzZShtUmVwID0gbWVhbihSZXByb2R1Y3Rpb24pLCBzZHI9c2QoUmVwcm9kdWN0aW9uKSwgbiA9IG4oKSwgCiAgICAgICAgICAgIHNlID0gc2QoUmVwcm9kdWN0aW9uKS9zcXJ0KG4tMSkpICU+JSBmaWx0ZXIobj4zKQoKIyBpbmRpdmlkdWFsIGV4YW1wbGVzCiMgYXNkCmZpZ19hc2QgPSBtcmVwJT4lIAogIGZpbHRlciggc2VxdWVuY2UgPT0gJzExJywgZ3JvdXAgPT0gJ0FTRCcpICU+JSAKICBnZ3Bsb3QoYWVzKER1cmF0aW9uLCBtUmVwLCBjb2xvciA9IFZvbGF0aWxpdHksIGdyb3VwID0gVm9sYXRpbGl0eSwgc2hhcGUgPSBWb2xhdGlsaXR5KSkgKyAKICBnZW9tX3BvaW50KHNpemUgPSAyKSArIAogICNnZW9tX2xpbmUoYWVzKGxpbmV0eXBlID0gVm9sYXRpbGl0eSkpICsgCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gJ2xtJywgYWVzKGZpbGwgPSBWb2xhdGlsaXR5KSwgc2UgPSBGQUxTRSkgKwogIGdlb21fZXJyb3JiYXIoYWVzKHltaW4gPSBtUmVwIC0gc2UsIHltYXggPSBtUmVwICtzZSksIHdpZHRoID0gMC4wNSkgKyAKICB0aGVtZV9jbGFzc2ljKCkgKyB0aGVtZShzdHJpcC5iYWNrZ3JvdW5kID0gZWxlbWVudF9ibGFuaygpKSArCiAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBsaW5ldHlwZSA9IDIpICsgCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gJ25vbmUnLCBwbG90Lm1hcmdpbiA9IHVuaXQoYygwLDAsMCwwKSwnY20nKSkgKwogIHlsYWIoJycpICsgeGxhYignJykKCiN0ZApmaWdfdGQgPSBtcmVwJT4lIAogIGZpbHRlciggc2VxdWVuY2UgPT0gJzExJywgZ3JvdXAgPT0gJ1REJykgJT4lIAogIGdncGxvdChhZXMoRHVyYXRpb24sIG1SZXAsIGNvbG9yID0gVm9sYXRpbGl0eSwgZ3JvdXAgPSBWb2xhdGlsaXR5LCBzaGFwZSA9IFZvbGF0aWxpdHkpKSArIAogIGdlb21fcG9pbnQoc2l6ZSA9IDIpICsgCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gJ2xtJywgYWVzKGZpbGwgPSBWb2xhdGlsaXR5KSwgc2UgPSBGQUxTRSkgKwogIGdlb21fZXJyb3JiYXIoYWVzKHltaW4gPSBtUmVwIC0gc2UsIHltYXggPSBtUmVwICtzZSksIHdpZHRoID0gMC4wNSkgKyAKICB0aGVtZV9jbGFzc2ljKCkgKyB0aGVtZShzdHJpcC5iYWNrZ3JvdW5kID0gZWxlbWVudF9ibGFuaygpKSArCiAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBsaW5ldHlwZSA9IDIpICsgCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gJ25vbmUnLCBwbG90Lm1hcmdpbiA9IHVuaXQoYygwLDAsMCwwKSwnY20nKSkgKwogIHlsYWIoJycpICsgeGxhYignJykKCiMgZ3JvdXAgbWVhbiByZXByb2R1Y3Rpb25zCgpmaWdfcmVwZF9nciA9IG1yZXAlPiUgCiAgZ2dwbG90KGFlcyhEdXJhdGlvbiwgbVJlcCwgY29sb3IgPSBWb2xhdGlsaXR5LCBncm91cCA9IFZvbGF0aWxpdHksIHNoYXBlID0gVm9sYXRpbGl0eSkpICsgCiAgZ2VvbV9wb2ludChhbHBoYSA9IDAuMikgKyAKICBnZW9tX3Ntb290aChtZXRob2QgPSAnbG0nLCBzZSA9IEZBTFNFLCBhZXMoZmlsbCA9IFZvbGF0aWxpdHkpKSArCiAgdGhlbWVfY2xhc3NpYygpICsgdGhlbWUoc3RyaXAuYmFja2dyb3VuZCA9IGVsZW1lbnRfYmxhbmsoKSkgKwogIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgbGluZXR5cGUgPSAyKSArIAogIGZhY2V0X3dyYXAofmdyb3VwKSArIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9IGMoMC4xLDAuODUpKSArCiAgeGxhYignRHVyYXRpb24gKFNlY3MpJykgKyB5bGFiKCdSZXByb2R1Y3Rpb24gKFNlY3MpJykKCiMgcGxvdCBpbmRpdmlkdWFsIGV4YW1wbGUgYXMgaW5zZXQuIAoKZmlnX21yZXAgPSBnZ2RyYXcoKSArIGRyYXdfcGxvdChmaWdfcmVwZF9ncikgKyAKICBkcmF3X3Bsb3QoZmlnX2FzZCwgeCA9IDAuMywgeSA9IDAuMTMsIHdpZHRoICA9IC4yLCBoZWlnaHQgPSAuMykgKyAKICBkcmF3X3Bsb3QoZmlnX3RkLCB4ID0gMC43NSwgeSA9IDAuMTMsIHdpZHRoICA9IC4yLCBoZWlnaHQgPSAuMykgCiAgCmZpZ19tcmVwCmlmKHNhdmVGaWcpewogIGdnc2F2ZSgiZmlndXJlcy9maWdfcmVwcm9kdWN0aW9uLnBuZyIsIGZpZ19tcmVwLCB3aWR0aD03LCBoZWlnaHQ9My41KQogIGdnc2F2ZSgiZmlndXJlcy9maWdfcmVwcm9kdWN0aW9uLnBkZiIsIGZpZ19tcmVwLCB3aWR0aD03LCBoZWlnaHQ9My41KQp9CmBgYAoKQXMgd2UgY2FuIHNlZSBmcm9tIHRoZSBwYXR0ZXJucyBhYm92ZS4gVGhlIEFTRCBwYXJ0aWNpcGFudCBwcm9kdWNlZCByZWxhdGl2ZSBmbGF0IGVycm9ycywgd2hpbGUgdGhlIFREIHBhcnRpY2lwYW50IHNob3dlZCBhIHN0cm9uZyBjZW50cmFsIHRlbmRlbmN5IGVmZmVjdCAoc2hvcnRzIGJlaW5nIG92ZXJlc3RpbWF0ZWQgYW5kIGxvbmdzIGJlaW5nIHVuZGVyZXN0aW1hdGVkKS4gCgoKIyMjIFZpc3VsaXplIENURSBhbmQgc2VxdWVudGlhbCBkZXBlbmRlbmNlCgpMZXQncyB2aXN1YWxpemUgdGhlIGJpYXNlcyAoY2VudHJhbCB0ZW5kZW5jeSBhbmQgc2VyaWFsIGRlcGVuZGVuY2UpIGZvciB0d28gZ3JvdXBzIChBU0QgdnMuIFREKQoKYGBge3IgcGxvdF9iaWFzZXN9CnBkID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjA1KQoKIyBwbG90IENUSSBhbmQgU0kgdG9nZXRoZXIKZmlnX2JpYXNlcyA9IHZzbG9wZXMlPiUgCiAgZ3JvdXBfYnkoZ3JvdXAsIFZvbGF0aWxpdHksIE9yZGVyKSAlPiUgCiAgc3VtbWFyaXNlKG1zaSA9IG1lYW4oc2kpLCBuID0gbigpLCBzZV9zaSA9IHNkKHNpKS9zcXJ0KG4pLAogICAgICAgICAgICBtY2kgPSBtZWFuKGNpKSwgc2VfY2kgPSBzZChjaSkvc3FydChuKSkgJT4lCiAgZ2dwbG90KGFlcyhtc2ksIG1jaSwgY29sb3IgPSBncm91cCwgc2hhcGUgPSBWb2xhdGlsaXR5LCAKICAgICAgICAgICAgICBncm91cD1pbnRlcmFjdGlvbihPcmRlciwgZ3JvdXApKSkgKyAKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBjb2xvciA9ICdncmF5JywgbGluZXR5cGUgPSAnZGFzaGVkJykgKyAKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwLCBjb2xvciA9ICdncmF5JywgbGluZXR5cGUgPSAnZGFzaGVkJykgKyAKICBnZW9tX3BvaW50KHNpemUgPSAyKSArIAogIGdlb21fbGluZShhZXMobGluZXR5cGUgPSBPcmRlcikpICsgCiAgZ2VvbV9lcnJvcmJhcihhZXMoeW1pbiA9IG1jaSAtIHNlX2NpLCB5bWF4ID0gbWNpICsgc2VfY2kpLCB3aWR0aCA9IDAuMDEgKSArIAogIGdlb21fZXJyb3JiYXJoKGFlcyh4bWluID0gbXNpIC0gc2Vfc2ksIHhtYXggPSBtc2kgKyBzZV9zaSksIGhlaWdodCA9IDAuMDEpICsgCiAgeGxhYignU2VyaWFsIERlcGVuZGVuY2UnKSArIHlsYWIoJ0NlbnRyYWwgVGVuZGVuY3knKSArIAogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBzY2FsZXM6OnBlcmNlbnQpICsgCiAgc2NhbGVfeF9jb250aW51b3VzKGxhYmVscyA9IHNjYWxlczo6cGVyY2VudCkgKyAKICBndWlkZXMoY29sb3IgPSBndWlkZV9sZWdlbmQodGl0bGUgPSAnR3JvdXAnKSwgCiAgICAgICAgIGxpbmV0eXBlID0gZ3VpZGVfbGVnZW5kKHRpdGxlID0gJ1ZvbGF0aWxpdHkgT3JkZXInKSwKICAgICAgICAgKSArCiAgdGhlbWVfY2xhc3NpYygpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAnYm90dG9tJykKZmlnX2JpYXNlcwppZiAoc2F2ZUZpZyl7CiAgZ2dzYXZlKCJmaWd1cmVzL2ZpZ19iaWFzZXMucG5nIiwgZmlnX2JpYXNlcywgd2lkdGg9NSwgaGVpZ2h0PTQpCiAgZ2dzYXZlKCJmaWd1cmVzL2ZpZ19iaWFzZXMucGRmIiwgZmlnX2JpYXNlcywgd2lkdGg9NSwgaGVpZ2h0PTQpCn0KCgpgYGAKCkJ5IHZpc3VhbCBpbnNwZWN0aW9uLCBpbmRpdmlkdWFscyB3aXRoIEFTRCBleGhpYml0ZWQgbGVzcyBjZW50cmFsIHRlbmRlbmN5IHJlbGF0aXZlIHRvIHRoZWlyIG1hdGNoZWQgVEQgY29udHJvbHMgKHRoZSByZWQgbGluZXMgYmVsb3cgdGhlIGN5YW4gbGluZXMgaW4gdGhlIGFib3ZlIGZpZ3VyZSksIHdoaWxlIHRoZSBsb2NhbCBzZXJpYWwgZGVwZW5kZW5jZSB3YXMgcmVsYXRpdmVseSBjb21wYXJhYmxlIGJldHdlZW4gdHdvIGdyb3VwcyBleGNlcHQgaW4gdGhlIGxvdyB2b2xhdGlsaXR5IGNvbmRpdGlvbiB3aGVuIHRoYXQgY29uZGl0aW9uIHN0YXJ0ZWQgZmlyc3QuIEludGVyZXN0aW5nbHksIHRoZSBjZW50cmFsIHRlbmRlbmN5IGFuZCBzZXJpYWwgZGVwZW5kZW5jZSB3ZXJlIHNpbWlsYXIgZm9yIGJvdGggZ3JvdXBzIHdoZW4gdGhlIGhpZ2gtdm9sYXRpbGl0eSBzZXNzaW9uIHN0YXJ0ZWQgZmlyc3QgKHRoZSBzb2xpZCBsaW5lcyksIHdoaWxlIHRoZXkgZGlmZmVyZWQgd2hlbiB0aGUgbG93LXZvbGF0aWxpdHkgc2Vzc2lvbiBzdGFydGVkIGZpcnN0ICh0aGUgZGFzaGVkIGxpbmVzKS4gCgpHaXZlbiB0aGF0IHRoZSBtYWluIGRpZmZlcmVuY2Ugd2FzIHNob3duIGluIENURS4gV2UgZnVydGhlciBwbG90IHRoZSBtZWFuIENURXMuIAoKYGBge3J9CiNwZCA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC41KQojIHNlcGFyYXRlIHBsb3RzIGZvciBhcHBlbmRpeApmaWdfY3RpID0gdnNsb3BlcyAlPiUgCiAgZ3JvdXBfYnkoZ3JvdXAsIFZvbGF0aWxpdHksIE9yZGVyKSAlPiUgCiAgc3VtbWFyaXNlKG1jaSA9IG1lYW4oY2kpLCBuID0gbigpLCBzZSA9IHNkKGNpKS9zcXJ0KG4pKSAlPiUKICBnZ3Bsb3QoYWVzKFZvbGF0aWxpdHksIG1jaSwgc2hhcGUgPSBPcmRlciwgY29sb3IgPSBPcmRlciwgZ3JvdXAgPSBPcmRlcikpICsgCiAgZ2VvbV9saW5lKCkgKyBnZW9tX3BvaW50KHNpemU9IDIpICsgCiAgI2dlb21fYmFyKHN0YXQgPSAnaWRlbnRpdHknLCBwb3NpdGlvbiA9IHBkLCB3aWR0aCA9IDAuNSkgKyAKICBmYWNldF93cmFwKH5ncm91cCkrCiAgZ2VvbV9lcnJvcmJhcihhZXMoeW1pbiA9IG1jaSAtIHNlLCB5bWF4ID0gbWNpICsgc2UpLCB3aWR0aCA9IDAuMikgKyAKICB0aGVtZV9jbGFzc2ljKCkgKyB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAnYm90dG9tJywgc3RyaXAuYmFja2dyb3VuZCA9IGVsZW1lbnRfYmxhbmsoKSkgKwogIHhsYWIoJ1ZvbGF0aWxpdHknKSArIHlsYWIoJ0NUSScpICsgCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IHNjYWxlczo6cGVyY2VudCkgKyAKICBndWlkZXMoY29sb3IgPSBndWlkZV9sZWdlbmQodGl0bGUgPSAnT3JkZXInKSwgZmlsbCA9IGd1aWRlX2xlZ2VuZCh0aXRsZSA9ICdPcmRlcicpKQpmaWdfY3RpCgpgYGAKTGV0J3MgZG8gdGhlIHNlcXVlbnRpYWwgZGVwZW5kZW5jZSBhcyB3ZWxsLiAKCmBgYHtyfQpwZCA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC41KQojIHNlcGFyYXRlIHBsb3RzIGZvciBhcHBlbmRpeApmaWdfc2RpID0gdnNsb3BlcyAlPiUgCiAgZ3JvdXBfYnkoZ3JvdXAsIFZvbGF0aWxpdHksIE9yZGVyKSAlPiUgCiAgc3VtbWFyaXNlKG1zaSA9IG1lYW4oc2kpLCBuID0gbigpLCBzZSA9IHNkKHNpKS9zcXJ0KG4pKSAlPiUKICBnZ3Bsb3QoYWVzKFZvbGF0aWxpdHksIG1zaSwgc2hhcGUgPSBPcmRlciwgY29sb3IgPSBPcmRlciwgZ3JvdXAgPSBPcmRlcikpICsgCiAgZ2VvbV9saW5lKCkgKyBnZW9tX3BvaW50KHNpemUgPSAyKSArCiAgI2dlb21fYmFyKHN0YXQgPSAnaWRlbnRpdHknLCBwb3NpdGlvbiA9IHBkLCB3aWR0aCA9IDAuNSkgKyAKICBmYWNldF93cmFwKH5ncm91cCkrCiAgZ2VvbV9lcnJvcmJhcihhZXMoeW1pbiA9IG1zaSAtIHNlLCB5bWF4ID0gbXNpICsgc2UpLCB3aWR0aCA9IDAuMikgKyAKICB0aGVtZV9jbGFzc2ljKCkgKyB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAnYm90dG9tJywgc3RyaXAuYmFja2dyb3VuZCA9IGVsZW1lbnRfYmxhbmsoKSkgKwogIHhsYWIoJ1ZvbGF0aWxpdHknKSArIHlsYWIoJ1NESScpICsgCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IHNjYWxlczo6cGVyY2VudCkgKyAKICBndWlkZXMoY29sb3IgPSBndWlkZV9sZWdlbmQodGl0bGUgPSAnT3JkZXInKSwgZmlsbCA9IGd1aWRlX2xlZ2VuZCh0aXRsZSA9ICdPcmRlcicpKQpmaWdfc2RpCmZpZzMgPSBwbG90X2dyaWQoZmlnX2N0aSwgZmlnX3NkaSwgbnJvdyA9IDEsIGxhYmVscyA9IGMoImEiLCJiIikpCmZpZzMKaWYgKHNhdmVGaWcpewogIGdnc2F2ZSgnZmlndXJlcy9maWczLnBkZicsZmlnMywgd2lkdGggPSA3LCBoZWlnaHQgPSAzLjUpCiAgZ2dzYXZlKCdmaWd1cmVzL2ZpZzMucG5nJyxmaWczLCB3aWR0aCA9IDcsIGhlaWdodCA9IDMuNSkKfQoKYGBgCgojIyMgU3RhdGlzdGljcwoKMS4gQ2VudHJhbCB0ZW5kZW5jeSBlZmZlY3QKCkF2ZXJhZ2UgQ1RJcwpgYGB7cn0KdnNsb3BlcyAlPiUgZ3JvdXBfYnkoZ3JvdXApICU+JSBzdW1tYXJpc2UobWN0aSA9IG1lYW4oY2kpKQp2c2xvcGVzICU+JSBncm91cF9ieShWb2xhdGlsaXR5KSAlPiUgc3VtbWFyaXNlKG1jdGkgPSBtZWFuKGNpKSkKdnNsb3BlcyAlPiUgZ3JvdXBfYnkoT3JkZXIpICU+JSBzdW1tYXJpc2UobWN0aSA9IG1lYW4oY2kpKQojIGNhbGN1bGF0ZSBtZWFuIGVsZXZhdGVkIENUSXMgYmV0d2VlbiBIViBGaXJzdCB2cy4gTFYgRmlyc3QKdnNsb3BlcyAlPiUgZ3JvdXBfYnkoZ3JvdXAsIFZvbGF0aWxpdHksIE9yZGVyKSAlPiUgc3VtbWFyaXNlKG1jdGkgPSBtZWFuKGNpKSkgJT4lCiAgcGl2b3Rfd2lkZXIobmFtZXNfZnJvbSA9IE9yZGVyLCB2YWx1ZXNfZnJvbSA9IG1jdGkpICU+JSAKICBtdXRhdGUoZENUSSA9IGBIViBGaXJzdGAgLSBgTFYgRmlyc3RgKSAlPiUgCiAgZ3JvdXBfYnkoZ3JvdXApICU+JSBzdW1tYXJpc2UobWQgPSBtZWFuKGRDVEkpKQpgYGAKCgpgYGB7ciBBTk9WQXNfY3RpfQp2c2xvcGVzID0gYXMuZGF0YS5mcmFtZSh2c2xvcGVzKSAjIHJlcXVpcmVkIGJ5IHJzdGF0aXgKIyAtLS0tIGNlbnRyYWwgdGVuZGVuY3kgaW5kZXgtLS0tCiMgcmVwZWF0ZWQgbWVhc3VyZXMgQU5PVkEgb24gY2VudHJhbCB0ZW5kZW5jeSBpbmRleAphbm92YTEgPSBhbm92YV90ZXN0KGRhdGEgPSB2c2xvcGVzLCBkdiA9IGNpLCAKICAgICAgICAgICAgICAgICB3aWQgPSBzdWIsIAogICAgICAgICAgICAgICAgIHdpdGhpbiA9IFZvbGF0aWxpdHksCiAgICAgICAgICAgICAgICAgYmV0d2VlbiA9IGMoZ3JvdXAsIE9yZGVyKSkKYW5vdmExCgojIyBzZXBhcmF0ZSBmb3IgVm9sYXRpbGl0eSBvcmRlcgphbm92YTFhID0gYW5vdmFfdGVzdChkYXRhID0gdnNsb3BlcyAlPiUgZmlsdGVyKGdyb3VwID09ICdBU0QnKSwgCiAgICAgICAgICAgICAgICAgIGR2ID0gY2ksIAogICAgICAgICAgICAgICAgICB3aWQgPSBzdWIsIAogICAgICAgICAgICAgICAgICB3aXRoaW4gPSBWb2xhdGlsaXR5LAogICAgICAgICAgICAgICAgICBiZXR3ZWVuID0gT3JkZXIpCmFub3ZhMWEKCmFub3ZhMWIgPSBhbm92YV90ZXN0KGRhdGEgPSB2c2xvcGVzICAlPiUgZmlsdGVyKGdyb3VwID09ICdURCcpLCAKICAgICAgICAgICAgICAgICAgZHYgPSBjaSwgCiAgICAgICAgICAgICAgICAgIHdpZCA9IHN1YiwgCiAgICAgICAgICAgICAgICAgIHdpdGhpbiA9IFZvbGF0aWxpdHksCiAgICAgICAgICAgICAgICAgIGJldHdlZW4gPSBPcmRlcikKYW5vdmExYgoKYGBgCgoKCjIuIEJheWVzIGZhY3RvciBhbmFseXNpcyBmb3IgcGFpci13aXNlIGNvbXBhcmlzb24KClRoZSBhYm92ZSBhbmFseXNpcyBzaG93ZWQgdGhhdCB0aGUgbWFpbiBkaWZmZXJlbmNlIGNhbWUgZnJvbSB0aGUgY2VudHJhbCB0ZW5kZW5jeS4gSGVyZSB3ZSBmdXJ0aGVyIGdldCB0aGUgY2VudHJhbCB0ZW5kZW5jeSBiaWFzIGFuZCBCYXllcyBmYWN0b3IgYW5hbHlzZXM6CmBgYHtyIGN0aV9iYXllc30KCiMgLS0tIEJheWVzIHQtdGVzdHMKYmZ0ZXN0ID0gZnVuY3Rpb24oZGYpewogIGRmID0gYXMuZGF0YS5mcmFtZShkZikKICAjIGdldCB0aGUgbWVhbnMKICByZGYgPSBkZiU+JSBzdW1tYXJpc2UobWNpID0gbWVhbihjaSksIAogICAgICAgICAgICAgICAgICAgICAgICBzZV9jaSA9IHNkKGNpKS9zcXJ0KG4oKSksCiAgICAgICAgICAgICAgICAgICAgICAgIG1zaSA9IG1lYW4oc2kpLCAKICAgICAgICAgICAgICAgICAgICAgICAgc2Vfc2kgPSBzZChzaSkvc3FydChuKCkpKQogIHJkZiRjaV9iZiA9IHR0ZXN0QkYoZGYkY2ksIG11ID0gMCkgJT4lIGV4dHJhY3RCRigpICU+JSAuJGJmCiAgcmRmJHNpX2JmID0gdHRlc3RCRihkZiRzaSwgbXUgPSAwKSAlPiUgZXh0cmFjdEJGKCkgJT4lIC4kYmYKICByZXR1cm4ocmRmKQp9Cgp2c2xvcGVzICU+JSBncm91cF9ieShncm91cCwgVm9sYXRpbGl0eSwgT3JkZXIpICU+JSBuZXN0KCkgJT4lCiAgbXV0YXRlKGJmID0gbWFwKGRhdGEsIGJmdGVzdCkpICU+JSB1bm5lc3QoYmYsIC5kcm9wID0gVFJVRSkKCiMgZ3JvdXAgY29tcGFyaXNvbiBmb3IgdGhlIGxvdy12b2wtZmlyc3QsIGhpZ2gtdm9sIHNlc3Npb24KdnNsb3BlcyAlPiUgZmlsdGVyKFZvbGF0aWxpdHkgPT0gJ0hpZ2ggVm9sYS4nLCBPcmRlciA9PSAnTFYgRmlyc3QnKSAlPiUgYXMuZGF0YS5mcmFtZSgpIC0+djExCnRfdGVzdChkYXRhID0gdjExLCBmb3JtdWxhID0gY2kgfiBncm91cCkgCnR0ZXN0QkYoZGF0YSA9IHYxMSwgZm9ybXVsYSA9IGNpIH4gZ3JvdXApCgp2c2xvcGVzICU+JSBmaWx0ZXIoVm9sYXRpbGl0eSA9PSAnTG93IFZvbGEuJywgT3JkZXIgPT0gJ0xWIEZpcnN0JykgJT4lIGFzLmRhdGEuZnJhbWUoKSAtPnYxMgp0X3Rlc3QoZGF0YSA9IHYxMiwgZm9ybXVsYSA9IGNpIH4gZ3JvdXApIAp0dGVzdEJGKGRhdGEgPSB2MTIsIGZvcm11bGEgPSBjaSB+IGdyb3VwKQpgYGAKCgozLiBBTk9WQSBhbmFseXNlcyBmb3IgdGhlIHNlcmlhbCBkZXBlbmRlbmNlIGluZGljZXM6CgpgYGB7ciBBTk9WQXNfc2RpfQojIC0tLS0gU2VyaWFsIGRlcGVuZGVuY2UgaW5kZXgtLS0tCmFub3ZhMiA9IGV6QU5PVkEoZGF0YSA9IHZzbG9wZXMsIGR2ID0gc2ksIAogICAgICAgICAgICAgICAgIHdpZCA9IHN1YiwgCiAgICAgICAgICAgICAgICAgd2l0aGluID0gLihWb2xhdGlsaXR5KSwKICAgICAgICAgICAgICAgICBiZXR3ZWVuID0gLihncm91cCwgT3JkZXIpKQphbm92YTIkQU5PVkEKCiMgQmF5ZXMgZmFjdG9ycwpiZiA9IGFub3ZhQkYoc2kgfiBWb2xhdGlsaXR5ICsgZ3JvdXAgKyBPcmRlciwgZGF0YSA9IHZzbG9wZXMsIHdoaWNoUmFuZG9tID0gInN1YiIpCmJheWVzZmFjdG9yX2luY2x1c2lvbihiZikgI2JheWVzIGluY2x1c2lvbiB2YWx1ZXMKCiMjIHNlcGFyYXRlIGZvciBzZXNzaW9uIG9yZGVyCmFub3ZhMmEgPSBlekFOT1ZBKGRhdGEgPSB2c2xvcGVzICU+JSBmaWx0ZXIoT3JkZXIgPT0gJ0xWIEZpcnN0JyksIAogICAgICAgICAgICAgICAgICBkdiA9IHNpLCAKICAgICAgICAgICAgICAgICAgd2lkID0gc3ViLCAKICAgICAgICAgICAgICAgICAgd2l0aGluID0gLihWb2xhdGlsaXR5KSwKICAgICAgICAgICAgICAgICAgYmV0d2VlbiA9IC4oZ3JvdXApKQphbm92YTJhJEFOT1ZBCgphbm92YTJiID0gZXpBTk9WQShkYXRhID0gdnNsb3BlcyAlPiUgZmlsdGVyKE9yZGVyID09ICdIViBGaXJzdCcpLCAKICAgICAgICAgICAgICAgICAgZHYgPSBzaSwgCiAgICAgICAgICAgICAgICAgIHdpZCA9IHN1YiwgCiAgICAgICAgICAgICAgICAgIHdpdGhpbiA9IC4oVm9sYXRpbGl0eSksCiAgICAgICAgICAgICAgICAgIGJldHdlZW4gPSAuKGdyb3VwKSkKYW5vdmEyYiRBTk9WQQoKYGBgCgoKCjQuIEdlbmVyYWwgYmlhc2VzCgpBZGRpdGlvbmFsbHkgd2UgZXhhbWluZWQgdGhlIGdlbmVyYWwgYmlhc2VzOgpgYGB7ciBnQmlhc30KIyAtLS0tIGRlc2NyaXB0aXZlIG9mIGdlbmVyYWwgYmlhcyAtLS0tCnZzbG9wZXMgJT4lIGdyb3VwX2J5KGdyb3VwKSAlPiUgc3VtbWFyaXNlKG1nID0gbWVhbihnQmlhcyksIHNlID0gc2QoZ0JpYXMpL3NxcnQobigpKSkgCgojIEFOT1ZBIHNob3dzIG5vIGRpZmZlcmVuY2VzCmFub3ZhMiA9IGV6QU5PVkEoZGF0YSA9IHZzbG9wZXMsIGR2ID0gZ0JpYXMsIAogICAgICAgICAgICAgICAgIHdpZCA9IHN1YiwgCiAgICAgICAgICAgICAgICAgd2l0aGluID0gLihWb2xhdGlsaXR5KSwKICAgICAgICAgICAgICAgICBiZXR3ZWVuID0gLihncm91cCwgT3JkZXIpKQphbm92YTIkQU5PVkEKCmJmID0gYW5vdmFCRihnQmlhcyB+ICBncm91cCArIFZvbGF0aWxpdHkgKyBPcmRlciwgCiAgICAgICAgICAgICBkYXRhID0gYXMuZGF0YS5mcmFtZSh2c2xvcGVzKSwgd2hpY2hSYW5kb20gPSAic3ViIikKYmF5ZXNmYWN0b3JfaW5jbHVzaW9uKGJmKSAjYmF5ZXMgaW5jbHVzaW9uIHZhbHVlcwoKCmBgYApXZSB0aGVuIHZpc3VhbGl6ZSB0aGUgZ2VuZXJhbCBiaWFzZXMKYGBge3IgcGxvdGdCaWFzfQojIC0tLSBnZW5lcmFsIGJpYXMKZmlnX2JpYXMgPSB2c2xvcGVzICU+JSBncm91cF9ieShncm91cCwgVm9sYXRpbGl0eSwgT3JkZXIpICU+JQogIHN1bW1hcmlzZShtYmlhcyA9IG1lYW4oZ0JpYXMpLCBuID0gbigpLCBzZSA9IHNkKGdCaWFzKS9zcXJ0KG4pKSAlPiUKICBnZ3Bsb3QoYWVzKFZvbGF0aWxpdHksIG1iaWFzLCBjb2xvciA9IE9yZGVyLGxpbmV0eXBlID0gZ3JvdXAsIGdyb3VwID0gaW50ZXJhY3Rpb24oT3JkZXIsIGdyb3VwKSwgc2hhcGUgPSBncm91cCkpICsgCiAgZ2VvbV9wb2ludChzaXplID0gMywgcG9zaXRpb24gPSBwZCkgKyAKICBnZW9tX2xpbmUocG9zaXRpb24gPSBwZCkgKwogIGdlb21fZXJyb3JiYXIoYWVzKHltaW4gPSBtYmlhcyAtIHNlLCB5bWF4ID0gbWJpYXMgKyBzZSksIHdpZHRoID0gMC4yLCBwb3NpdGlvbiA9IHBkKSArIAogIHRoZW1lX2NsYXNzaWMoKSAgKyB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAnYm90dG9tJykgKyB4bGFiKCdWb2xhdGlsaXR5JykgKyAKICB5bGFiKCdNZWFuIG92ZXJlc3RpbWF0aW9uIChtcyknKSAKZmlnX2JpYXMKYGBgCgpUaGVyZSB3YXMgbm8gZGlmZmVyZW5jZSBpbiB0d28gZ3JvdXBzIGluIGdlbmVyYWwgYmlhc2VzLCBhbHRob3VnaCBib3RoIGdyb3VwcyB3ZXJlIHBvc2l0aXZlIG92ZXJlc3RpbWF0ZWQuIAoKTmV4dCB3ZSBleGFtaW5lZCB0aGUgcmVwcm9kdWNlZCB2YXJpYWJpbGl0eToKYGBge3IgcmVwX3Zhcn0KIyAtLS0tIFJlcHJvZHVjdGlvbiB2YXJpYWJpbGl0eSAtLS0tLQptc2RzX3IgPC0gbXJlcCAgJT4lIAogIGZpbHRlcihuPjUpICU+JSAKICBncm91cF9ieShncm91cCwgT3JkZXIsIFZvbGF0aWxpdHksICBzdWIpICU+JQogIHN1bW1hcmlzZShtc2QgPSBtZWFuKHNkciksIG49bigpLCBtc2Rfc2UgPSBzZChzZHIpL3NxcnQobikpCiAgCgpzZF9BTk9WQSA8LSBlekFOT1ZBKG1zZHNfciwgZHY9bXNkLCB3aWQ9c3ViLCBiZXR3ZWVuPS4oZ3JvdXAsT3JkZXIpLCB3aXRoaW49Vm9sYXRpbGl0eSkKc2RfQU5PVkEkQU5PVkEKCm1tc2RzX3IgPC0gbXNkc19yICU+JSBzdW1tYXJpemUobW1zZD1tZWFuKG1zZCoxMDAwKSwgbiA9IG4oKSwgc2UgPSBzZChtc2QqMTAwMCkvc3FydChuKSkKCnBkID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjUpCmZpZ19zZCA8LSBnZ3Bsb3QobW1zZHNfciwgYWVzKFZvbGF0aWxpdHksIG1tc2QsIHNoYXBlID0gT3JkZXIsIGNvbG9yID0gT3JkZXIsIGdyb3VwID0gT3JkZXIpKSArIAogIGdlb21fbGluZSgpICsgZ2VvbV9wb2ludCgpICsgCiAgI2dlb21fYmFyKHN0YXQgPSAnaWRlbnRpdHknLCBwb3NpdGlvbiA9IHBkLCB3aWR0aCA9IDAuNSkgKyAKICBnZW9tX2Vycm9yYmFyKGFlcyh5bWluID0gbW1zZCAtIHNlLCB5bWF4ID0gbW1zZCArIHNlKSwgd2lkdGggPSAwLjMpICsKICBmYWNldF93cmFwKH5ncm91cCkgKwogIHlsYWIoJ01lYW4gU3RhbmRhcmQgRGV2aWF0aW9uIChtcyknKSArIHhsYWIoJ1ZvbGF0aWxpdHknKSArIHRoZW1lX2NsYXNzaWMoKSAgCiMgIGNvb3JkX2NhcnRlc2lhbih5bGltID0gYygxNDAsIDIwMCkpIApmaWdfc2QKCmlmKHNhdmVGaWcpewogIGdnc2F2ZSgnZmlndXJlcy9maWdfc2QucG5nJywgZmlnX3NkLCB3aWR0aD01LCBoZWlnaHQ9NCkKICBnZ3NhdmUoJ2ZpZ3VyZXMvZmlnX3NkLnBkZicsIGZpZ19zZCwgd2lkdGg9NSwgaGVpZ2h0PTQpCn0KCgoKYGBgCgojIyBDb3JyZWxhdGlvbiBhbmFseXNpcwoKTmV4dCB3ZSBpbXBvcnQgaW5kaXZpZHVhbCBwYXJ0aWNpcGFudCByYXRpbmdzIGFuZCBkbyBjb3JyZWxhdGlvbiBhbmFseXNlcy4gCgpgYGB7ciBwYXJpbmZvfQpwaW5mbyA9IHJlYWQuY3N2KCdkYXRhL3BhcmluZm8uY3N2JykKCiMgam9pbiB3aXRoIGN0aXMsIHNkaXMKcmVzID0gbGVmdF9qb2luKHZzbG9wZXMsIHBpbmZvLCBieSA9IGMoJ2dyb3VwJywnc2VxdWVuY2UnKSkKcmVzJGdyb3VwID0gYXMuZmFjdG9yKHJlcyRncm91cCkKCiMgc2NhdHRlciBwbG90IHRvIHNlZSBhbnkgcmVsYXRpb25zCmZpZ19jb3JyID0gZ2dkdW8ocmVzLCBjKCdBUScsJ0VRJywnQkRJJyksIGMoJ2NpJywnc2knKSwgbWFwcGluZyA9IGFlcyhjb2xvciA9IGdyb3VwLCBzaGFwZSA9IE9yZGVyKSwKICAgICAgdHlwZXMgPSBsaXN0KGNvbnRpbnVvdXMgPSAnc21vb3RoX2xtJywgc2UgPSBGQUxTRSksIAogICAgICBzaG93U3RyaXBzID0gRkFMU0UsIGxlZ2VuZCA9IDMsCiAgICAgIGNvbHVtbkxhYmVsc1kgPSBjKCdDVEknLCdTREknKSkgKyAKICB0aGVtZV9jbGFzc2ljKCkgKyB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAnYm90dG9tJywgc3RyaXAuYmFja2dyb3VuZCA9IGVsZW1lbnRfYmxhbmsoKSkgCmlmKHNhdmVGaWcpewogIGdnc2F2ZSgnZmlndXJlcy9maWdfY29yci5wbmcnLCBmaWdfY29yciwgd2lkdGg9NSwgaGVpZ2h0PTQpCiAgZ2dzYXZlKCdmaWd1cmVzL2ZpZ19jb3JyLnBkZicsIGZpZ19jb3JyLCB3aWR0aD01LCBoZWlnaHQ9NCkKfQoKZmlnX2NvcnIKYGBgCiBHZXQgbGluZWFyIHJlZ3Jlc3Npb24gb3V0CiAKYGBge3J9CmNpX0FRIDwtIGZ1bmN0aW9uKGRmKXsKICBsbShjaSB+IEFRLCBkYXRhID0gZGYpCn0KY2lfRVEgPC0gZnVuY3Rpb24oZGYpewogIGxtKGNpIH4gRVEsIGRhdGEgPSBkZikKfQpjaV9CREkgPC0gZnVuY3Rpb24oZGYpewogIGxtKGNpIH4gQkRJLCBkYXRhID0gZGYpCn0KCnNpX0FRIDwtIGZ1bmN0aW9uKGRmKXsKICBsbShzaSB+IEFRLCBkYXRhID0gZGYpCn0Kc2lfRVEgPC0gZnVuY3Rpb24oZGYpewogIGxtKHNpIH4gRVEsIGRhdGEgPSBkZikKfQpzaV9CREkgPC0gZnVuY3Rpb24oZGYpewogIGxtKHNpIH4gQkRJLCBkYXRhID0gZGYpCn0KCiMgcmVncmVzc2lvbgpyZWdfcmVzIDwtIHJlcyAlPiUgZ3JvdXBfYnkoVm9sYXRpbGl0eSwgZ3JvdXAsIE9yZGVyKSAlPiUKICBuZXN0KCkgICU+JSAgIyBuZXN0ZWQgZGF0YQogIG11dGF0ZShjaV9BUSA9IG1hcChkYXRhLCBjaV9BUSksIGNpX0VRID0gbWFwKGRhdGEsIGNpX0VRKSwKICAgICAgICAgY2lfQkRJID0gbWFwKGRhdGEsIGNpX0JESSksIAogICAgICAgICBzaV9BUSA9IG1hcChkYXRhLCBzaV9BUSksIHNpX0VRID0gbWFwKGRhdGEsIHNpX0VRKSwKICAgICAgICAgc2lfQkRJID0gbWFwKGRhdGEsIHNpX0JESSkpICU+JQogIG11dGF0ZShtY2lfQVEgPSBtYXAoY2lfQVEsIGJyb29tOjp0aWR5KSwgCiAgICAgICAgIG1jaV9FUSA9IG1hcChjaV9FUSwgYnJvb206OnRpZHkpLAogICAgICAgICBtY2lfQkRJID0gbWFwKGNpX0JESSwgYnJvb206OnRpZHkpLAogICAgICAgICBtc2lfQVEgPSBtYXAoc2lfQVEsIGJyb29tOjp0aWR5KSwKICAgICAgICAgbXNpX0VRID0gbWFwKHNpX0VRLCBicm9vbTo6dGlkeSksCiAgICAgICAgIG1zaV9CREkgPSBtYXAoc2lfQkRJLCBicm9vbTo6dGlkeSkgICkgJT4lCiAgdW5uZXN0KGNvbHMgPSBjKG1jaV9BUSwgbWNpX0VRLCBtY2lfQkRJLCBtc2lfQVEsIG1zaV9FUSwgbXNpX0JESSksIG5hbWVzX3JlcGFpciA9ICd1bmlxdWUnICwgLmRyb3AgPSBUUlVFKSAlPiUKICBzZWxlY3QoLWNpX0FRLCAtY2lfQkRJLCAtY2lfRVEsIC1zaV9BUSwgLXNpX0VRLCAtc2lfQkRJLCAtZGF0YSwgCiAgICAgICAgIC1zdGFydHNfd2l0aCgnc3QnKSkgJT4lIAogIGZpbHRlcih0ZXJtID09ICdBUScpICMgcmVtb3ZlIGludGVyY2VwdAoKYGBgCgpHaXZlbiB0aGVyZSBpcyBubyBzaWduaWZpY2FudCBvZiBzbG9wZXMgKGFmdGVyIGNvcnJlY3Rpb24pLCBidXQgc29tZSBkaWZmZXJlbmNlIGluIGludGVyY2VwdHMsIHdlIGRvIGdlbmVyYWwgbGluZWFyIHJlZ3Jlc3Npb24sIHdpdGhvdXQgc2VwYXJhdGluZyBncm91cHMuIAoKYGBge3J9CnJlZ19yZXMyIDwtIHJlcyAlPiUgdW5ncm91cCgpICU+JSBncm91cF9ieShPcmRlciwgVm9sYXRpbGl0eSkgJT4lCiAgbmVzdCgpICAlPiUgICMgbmVzdGVkIGRhdGEKICBtdXRhdGUoY2lfQVEgPSBtYXAoZGF0YSwgY2lfQVEpLCBjaV9FUSA9IG1hcChkYXRhLCBjaV9FUSksCiAgICAgICAgIGNpX0JESSA9IG1hcChkYXRhLCBjaV9CREkpLCAKICAgICAgICAgc2lfQVEgPSBtYXAoZGF0YSwgc2lfQVEpLCBzaV9FUSA9IG1hcChkYXRhLCBzaV9FUSksCiAgICAgICAgIHNpX0JESSA9IG1hcChkYXRhLCBzaV9CREkpKSAlPiUKICBtdXRhdGUobWNpX0FRID0gbWFwKGNpX0FRLCBicm9vbTo6dGlkeSksIAogICAgICAgICBtY2lfRVEgPSBtYXAoY2lfRVEsIGJyb29tOjp0aWR5KSwKICAgICAgICAgbWNpX0JESSA9IG1hcChjaV9CREksIGJyb29tOjp0aWR5KSwKICAgICAgICAgbXNpX0FRID0gbWFwKHNpX0FRLCBicm9vbTo6dGlkeSksCiAgICAgICAgIG1zaV9FUSA9IG1hcChzaV9FUSwgYnJvb206OnRpZHkpLAogICAgICAgICBtc2lfQkRJID0gbWFwKHNpX0JESSwgYnJvb206OnRpZHkpICApICU+JQogIHVubmVzdChjb2xzID0gYyhtY2lfQVEsIG1jaV9FUSwgbWNpX0JESSwgbXNpX0FRLCBtc2lfRVEsIG1zaV9CREkpLCBuYW1lc19yZXBhaXIgPSAndW5pcXVlJyAsIC5kcm9wID0gVFJVRSkgJT4lCiAgc2VsZWN0KC1jaV9BUSwgLWNpX0JESSwgLWNpX0VRLCAtc2lfQVEsIC1zaV9FUSwgLXNpX0JESSwgLWRhdGEsIAogICAgICAgICAtc3RhcnRzX3dpdGgoJ3N0JykpICU+JSAKICBmaWx0ZXIodGVybSA9PSAnQVEnKSAjIHJlbW92ZSBpbnRlcmNlcHQKYGBgCkFnYWluLCB0aGVyZSBpcyBubyBzaWduaWZpY2FudCBvZiBzbG9wZXMuIAoKCgo=