library(tidyverse)
library(ggrepel)
library(extrafont)
library(viridis)
library(summarytools)
library(xtable)
library(knitr)
options(prompt="R> ", digits=2)

1 Sector ISIC18LC-stch

1.1 Sigma and Beta Convergence Analysis

# Data import
stch18 <- read_csv(" ISIC18LC-stch/inputs/dataMobility.csv")
stch18 <- stch18 %>% 
  mutate(id = as.factor(id))
# Compute average annual growth rates (use approximations)
stch18 <- stch18 %>% 
  mutate(growth1 = ((ln_y - ln_x)/6)*100,
         growth2 =  ((y/x)^(1/6)-1)*100)
stch18
# Descriptive statistics of continous variables
stch18Growth <- stch18 %>% 
  select(x, y, ln_x, ln_y, growth1, growth2, r_x, r_y, ln_r_x, ln_r_y) 
kable(descr(stch18Growth))
x y ln_x ln_y growth1 growth2 r_x r_y ln_r_x ln_r_y
Mean 3.01 3.19 0.76 0.79 0.44 2.07 1.00 1.00 -0.34 -0.37
Std.Dev 2.98 4.26 0.80 0.73 17.86 19.11 0.99 1.33 0.80 0.73
Min 0.35 0.63 -1.04 -0.46 -38.47 -31.93 0.12 0.20 -2.14 -1.63
Median 2.19 1.87 0.78 0.62 0.59 0.60 0.73 0.58 -0.32 -0.54
Max 15.69 22.76 2.75 3.13 49.63 64.26 5.22 7.12 1.65 1.96
MAD 1.40 0.78 0.70 0.46 12.10 11.69 0.47 0.24 0.70 0.46
IQR 1.68 1.16 0.85 0.61 17.28 16.86 0.56 0.36 0.85 0.61
CV 1.01 0.75 0.96 1.09 0.02 0.11 1.01 0.75 -0.42 -0.51
Skewness 2.29 3.42 0.29 1.44 0.37 1.05 2.29 3.42 0.29 1.44
SE.Skewness 0.33 0.33 0.33 0.33 0.33 0.33 0.33 0.33 0.33 0.33
Kurtosis 5.54 11.80 0.03 2.11 0.64 1.67 5.54 11.80 0.03 2.11
N.Valid 53.00 53.00 53.00 53.00 53.00 53.00 53.00 53.00 53.00 53.00
Pct.Valid 100.00 100.00 100.00 100.00 100.00 100.00 100.00 100.00 100.00 100.00
# Create long panel and recode year
stch18Panel <- stch18 %>%
  gather(year, ln_tfp, ln_x:ln_y)
# Recode year variable
stch18Panel$year <- fct_recode(stch18Panel$year,
                               "2003" = "ln_x",
                               "2009" = "ln_y")
# Plot basic Boxplot
stch18Panel %>% 
  ggplot(aes(x = year, y = ln_tfp, fill = year)) +
  geom_boxplot(outlier.colour="black", 
               outlier.shape=16,
               outlier.size=1,
               notch=TRUE) +
  scale_fill_brewer(palette="Blues") +
  theme_classic() +
  theme(legend.position = 'none') +
  theme(text=element_text(size=10, family="Palatino"))

# Beta convergence scatterplot 
stch18Growth %>% 
  ggplot(aes(x = ln_x, y = growth1)) +
  geom_point(size = 4) + 
  geom_smooth(size = 2) +
  # Change the theme to viridis colors and black and white background
  scale_color_viridis(discrete = TRUE) +
  theme_bw() +
  # Change the font of the theme
  theme(text=element_text(size=20, family="Palatino")) +
  # Hide the lenged
  theme(legend.position = 'none') +
  # Change plot titles
  labs(x = "Log of TFP in 2003",
       y = "TFP Growth")

1.2 Mobility Analysis

# Select and rename variables
stch18 <- stch18 %>% 
  select(id, ln_r_x, ln_r_y) %>% 
  rename(initial = ln_r_x, final = ln_r_y)
# Identify forward and backward mobility
stch18 <- stch18 %>% 
  mutate(mobility0 = as.factor(final > initial))
# Identify mobility across quadrants
stch18 <- stch18 %>% 
  mutate(mobility = as.factor(case_when(final > 0 & initial > 0 ~ 1, 
                              final > 0 & initial < 0 ~ 2,
                              final < 0 & initial < 0 ~ 3,
                              final < 0 & initial > 0 ~ 4,
                              TRUE ~ 0))
                              )
# Identify observation in the first quadrant (uppper right corner)
stch18 <- stch18 %>% 
  mutate(mobility1 = as.factor(final > 0 & initial > 0))
  
# Identify observation in the second quadrant (lower right corner)
stch18 <- stch18 %>% 
  mutate(mobility2 = as.factor(final > 0 & initial < 0))
# Identify observation in the third quadrant (lower left corner)
stch18 <- stch18 %>% 
  mutate(mobility3 = as.factor(final < 0 & initial < 0))
# Identify observation in the third quadrant (upper left corner)
stch18 <- stch18 %>% 
  mutate(mobility4 = as.factor(final < 0 & initial > 0))
# Print table
stch18
# Create scatterplot 
stch18 %>% 
ggplot(aes(x = final , y = initial, color = mobility0, shape = mobility)) +
  geom_point(size = 4) + 
  # Add 45 degree line and reference lines
  geom_abline(aes(intercept = 0, slope = 1)) +
  geom_hline(yintercept=0, linetype="dashed") + 
  geom_vline(xintercept=0, linetype="dashed") +
  # Add labels that do not overlap
  # geom_text_repel(aes(label = id), size = 3) +
  # Change axis limits
  xlim(-3, 3) + 
  ylim(-3, 3) +
  # Change the theme to viridis colors and black and white background
  scale_color_viridis(discrete = TRUE) +
  theme_bw() +
  # Change the font of the theme
  theme(text=element_text(size=20, family="Palatino")) +
  # Hide the lenged
  theme(legend.position = 'none') +
  # Change plot titles
  labs(x = "Log of Relative TFP in 2009",
       y = "Log of Relative TFP in 2003")

# Create scatterplot with bivarate density
stch18 %>% 
ggplot(aes(x = final , y = initial)) +
  stat_density_2d(aes(fill = ..level..), geom = "polygon") +
  scale_fill_gradientn(colors = c("#FFEDA0", "#FEB24C", "#F03B20"))+
  geom_point(size = 2) + 
  # Add 45 degree line and reference lines
  geom_abline(aes(intercept = 0, slope = 1)) +
  geom_hline(yintercept=0, linetype="dashed") + 
  geom_vline(xintercept=0, linetype="dashed") +
  # Add labels that do not overlap
  # geom_text_repel(aes(label = id), size = 3) +
  # Change axis limits
  xlim(-3, 3) + 
  ylim(-3, 3) +
  # Change the theme to viridis colors and black and white background
  scale_color_viridis(discrete = TRUE) +
  theme_bw() +
  # Change the font of the theme
  theme(text=element_text(size=20, family="Palatino")) +
  # Hide the lenged
  theme(legend.position = 'none') +
  # Change plot titles
  labs(x = "Log of Relative TFP in 2009",
       y = "Log of Relative TFP in 2003")

# Descriptive statistics for continuous variables
kable(descr(stch18))
initial final
Mean -0.34 -0.37
Std.Dev 0.80 0.73
Min -2.14 -1.63
Median -0.32 -0.54
Max 1.65 1.96
MAD 0.70 0.46
IQR 0.85 0.61
CV -0.42 -0.51
Skewness 0.29 1.44
SE.Skewness 0.33 0.33
Kurtosis 0.03 2.11
N.Valid 53.00 53.00
Pct.Valid 100.00 100.00
# Frequency table for forward and backward mobility
kable(freq(stch18$mobility0))
Freq % Valid % Valid Cum. % Total % Total Cum.
FALSE 27 51 51 51 51
TRUE 26 49 100 49 100
0 NA NA 0 100
Total 53 100 100 100 100
# Frequency table for mobility across quadrants
freq(stch18$mobility)
Frequencies   
mobility     
Data frame: stch18   
Type: Factor (unordered)   

              Freq   % Valid   % Valid Cum.   % Total   % Total Cum.
----------- ------ --------- -------------- --------- --------------
          1      4      7.55           7.55      7.55           7.55
          2      8     15.09          22.64     15.09          22.64
          3     32     60.38          83.02     60.38          83.02
          4      9     16.98         100.00     16.98         100.00
       <NA>      0                               0.00         100.00
      Total     53    100.00         100.00    100.00         100.00
# Simple mobility matrix
kable(with(stch18, ctable(mobility0, mobility, prop = "r")) )
1 2 3 4 Total
FALSE 4 0 14 9 27
TRUE 0 8 18 0 26
Total 4 8 32 9 53
1 2 3 4 Total
FALSE 0.15 0.00 0.52 0.33 1
TRUE 0.00 0.31 0.69 0.00 1
Total 0.08 0.15 0.60 0.17 1

2 Sector ISIC18LC-lp

2.1 Sigma and Beta Convergence Analysis

# Data import
lp18 <- read_csv(" ISIC18LC-lp/inputs/dataMobility.csv")
lp18 <- lp18 %>% 
  mutate(id = as.factor(id))
# Compute average annual growth rates (use approximations)
lp18 <- lp18 %>% 
  mutate(growth1 = ((ln_y - ln_x)/6)*100,
         growth2 =  ((y/x)^(1/6)-1)*100)
lp18
# Descriptive statistics of continous variables
lp18Growth <- lp18 %>% 
  select(x, y, ln_x, ln_y, growth1, growth2, r_x, r_y, ln_r_x, ln_r_y) 
kable(descr(lp18Growth))
x y ln_x ln_y growth1 growth2 r_x r_y ln_r_x ln_r_y
Mean 3.20 3.15 0.81 0.79 -0.31 1.29 1.00 1.00 -0.35 -0.36
Std.Dev 3.24 3.78 0.81 0.75 17.85 18.66 1.01 1.20 0.81 0.75
Min 0.44 0.53 -0.81 -0.63 -43.22 -35.09 0.14 0.17 -1.98 -1.78
Median 2.18 1.95 0.78 0.67 0.83 0.84 0.68 0.62 -0.38 -0.48
Max 16.86 20.82 2.82 3.04 47.85 61.36 5.27 6.61 1.66 1.89
MAD 1.44 0.91 0.78 0.54 12.32 12.95 0.45 0.29 0.78 0.54
IQR 2.16 1.13 1.02 0.61 22.23 21.65 0.68 0.36 1.02 0.61
CV 0.99 0.83 1.00 1.06 -0.02 0.07 0.99 0.83 -0.43 -0.48
Skewness 2.23 3.01 0.43 1.10 0.22 0.86 2.23 3.01 0.43 1.10
SE.Skewness 0.33 0.33 0.33 0.33 0.33 0.33 0.33 0.33 0.33 0.33
Kurtosis 5.18 9.43 -0.23 1.05 0.35 1.27 5.18 9.43 -0.23 1.05
N.Valid 53.00 53.00 53.00 53.00 53.00 53.00 53.00 53.00 53.00 53.00
Pct.Valid 100.00 100.00 100.00 100.00 100.00 100.00 100.00 100.00 100.00 100.00
# Create long panel and recode year
lp18Panel <- lp18 %>%
  gather(year, ln_tfp, ln_x:ln_y)
# Recode year variable
lp18Panel$year <- fct_recode(lp18Panel$year,
                               "2003" = "ln_x",
                               "2009" = "ln_y")
# Plot basic Boxplot
lp18Panel %>% 
  ggplot(aes(x = year, y = ln_tfp, fill = year)) +
  geom_boxplot(outlier.colour="black", 
               outlier.shape=16,
               outlier.size=1,
               notch=TRUE) +
  scale_fill_brewer(palette="Blues") +
  theme_classic() +
  theme(legend.position = 'none') +
  theme(text=element_text(size=10, family="Palatino"))

# Beta convergence scatterplot 
lp18Growth %>% 
  ggplot(aes(x = ln_x, y = growth1)) +
  geom_point(size = 4) + 
  geom_smooth(size = 2) +
  # Change the theme to viridis colors and black and white background
  scale_color_viridis(discrete = TRUE) +
  theme_bw() +
  # Change the font of the theme
  theme(text=element_text(size=20, family="Palatino")) +
  # Hide the lenged
  theme(legend.position = 'none') +
  # Change plot titles
  labs(x = "Log of TFP in 2003",
       y = "TFP Growth")

2.2 Mobility Analysis

# Select and rename variables
lp18 <- lp18 %>% 
  select(id, ln_r_x, ln_r_y) %>% 
  rename(initial = ln_r_x, final = ln_r_y)
# Identify forward and backward mobility
lp18 <- lp18 %>% 
  mutate(mobility0 = as.factor(final > initial))
# Identify mobility across quadrants
lp18 <- lp18 %>% 
  mutate(mobility = as.factor(case_when(final > 0 & initial > 0 ~ 1, 
                              final > 0 & initial < 0 ~ 2,
                              final < 0 & initial < 0 ~ 3,
                              final < 0 & initial > 0 ~ 4,
                              TRUE ~ 0))
                              )
# Identify observation in the first quadrant (uppper right corner)
lp18 <- lp18 %>% 
  mutate(mobility1 = as.factor(final > 0 & initial > 0))
  
# Identify observation in the second quadrant (lower right corner)
lp18 <- lp18 %>% 
  mutate(mobility2 = as.factor(final > 0 & initial < 0))
# Identify observation in the third quadrant (lower left corner)
lp18 <- lp18 %>% 
  mutate(mobility3 = as.factor(final < 0 & initial < 0))
# Identify observation in the third quadrant (upper left corner)
lp18 <- lp18 %>% 
  mutate(mobility4 = as.factor(final < 0 & initial > 0))
# Print table
lp18
# Create scatterplot 
lp18 %>% 
ggplot(aes(x = final , y = initial, color = mobility0, shape = mobility)) +
  geom_point(size = 4) + 
  # Add 45 degree line and reference lines
  geom_abline(aes(intercept = 0, slope = 1)) +
  geom_hline(yintercept=0, linetype="dashed") + 
  geom_vline(xintercept=0, linetype="dashed") +
  # Add labels that do not overlap
  # geom_text_repel(aes(label = id), size = 3) +
  # Change axis limits
  xlim(-3, 3) + 
  ylim(-3, 3) +
  # Change the theme to viridis colors and black and white background
  scale_color_viridis(discrete = TRUE) +
  theme_bw() +
  # Change the font of the theme
  theme(text=element_text(size=20, family="Palatino")) +
  # Hide the lenged
  theme(legend.position = 'none') +
  # Change plot titles
  labs(x = "Log of Relative TFP in 2009",
       y = "Log of Relative TFP in 2003")

# Create scatterplot with bivarate density
lp18 %>% 
ggplot(aes(x = final , y = initial)) +
  stat_density_2d(aes(fill = ..level..), geom = "polygon") +
  scale_fill_gradientn(colors = c("#FFEDA0", "#FEB24C", "#F03B20"))+
  geom_point(size = 2) + 
  # Add 45 degree line and reference lines
  geom_abline(aes(intercept = 0, slope = 1)) +
  geom_hline(yintercept=0, linetype="dashed") + 
  geom_vline(xintercept=0, linetype="dashed") +
  # Add labels that do not overlap
  # geom_text_repel(aes(label = id), size = 3) +
  # Change axis limits
  xlim(-3, 3) + 
  ylim(-3, 3) +
  # Change the theme to viridis colors and black and white background
  scale_color_viridis(discrete = TRUE) +
  theme_bw() +
  # Change the font of the theme
  theme(text=element_text(size=20, family="Palatino")) +
  # Hide the lenged
  theme(legend.position = 'none') +
  # Change plot titles
  labs(x = "Log of Relative TFP in 2009",
       y = "Log of Relative TFP in 2003")

# Descriptive statistics for continuous variables
kable(descr(lp18))
initial final
Mean -0.35 -0.36
Std.Dev 0.81 0.75
Min -1.98 -1.78
Median -0.38 -0.48
Max 1.66 1.89
MAD 0.78 0.54
IQR 1.02 0.61
CV -0.43 -0.48
Skewness 0.43 1.10
SE.Skewness 0.33 0.33
Kurtosis -0.23 1.05
N.Valid 53.00 53.00
Pct.Valid 100.00 100.00
# Frequency table for forward and backward mobility
kable(freq(lp18$mobility0))
Freq % Valid % Valid Cum. % Total % Total Cum.
FALSE 24 45 45 45 45
TRUE 29 55 100 55 100
0 NA NA 0 100
Total 53 100 100 100 100
# Frequency table for mobility across quadrants
freq(lp18$mobility)
Frequencies   
mobility     
Data frame: lp18   
Type: Factor (unordered)   

              Freq   % Valid   % Valid Cum.   % Total   % Total Cum.
----------- ------ --------- -------------- --------- --------------
          1      4      7.55           7.55      7.55           7.55
          2      7     13.21          20.75     13.21          20.75
          3     31     58.49          79.25     58.49          79.25
          4     11     20.75         100.00     20.75         100.00
       <NA>      0                               0.00         100.00
      Total     53    100.00         100.00    100.00         100.00
# Simple mobility matrix
kable(with(lp18, ctable(mobility0, mobility, prop = "r")) )
1 2 3 4 Total
FALSE 2 0 11 11 24
TRUE 2 7 20 0 29
Total 4 7 31 11 53
1 2 3 4 Total
FALSE 0.08 0.00 0.46 0.46 1
TRUE 0.07 0.24 0.69 0.00 1
Total 0.08 0.13 0.58 0.21 1

3 Sector ISIC18LC-acf

3.1 Sigma and Beta Convergence Analysis

# Data import
acf18 <- read_csv(" ISIC18LC-acf/inputs/dataMobility.csv")
acf18 <- acf18 %>% 
  mutate(id = as.factor(id))
# Compute average annual growth rates (use approximations)
acf18 <- acf18 %>% 
  mutate(growth1 = ((ln_y - ln_x)/6)*100,
         growth2 =  ((y/x)^(1/6)-1)*100)
acf18
# Descriptive statistics of continous variables
acf18Growth <- acf18 %>% 
  select(x, y, ln_x, ln_y, growth1, growth2, r_x, r_y, ln_r_x, ln_r_y) 
kable(descr(acf18Growth))
x y ln_x ln_y growth1 growth2 r_x r_y ln_r_x ln_r_y
Mean 0.57 0.74 -0.94 -0.81 2.04 4.36 1.00 1.00 -0.37 -0.51
Std.Dev 0.57 1.25 0.87 0.85 21.11 23.13 1.00 1.68 0.87 0.85
Min 0.03 0.09 -3.41 -2.45 -54.56 -42.05 0.06 0.12 -2.85 -2.15
Median 0.40 0.35 -0.92 -1.04 2.14 2.16 0.70 0.48 -0.36 -0.74
Max 2.60 7.11 0.95 1.96 53.41 70.58 4.55 9.59 1.52 2.26
MAD 0.28 0.19 0.72 0.65 14.67 14.89 0.50 0.25 0.72 0.65
IQR 0.38 0.35 0.98 0.83 20.79 20.52 0.67 0.47 0.98 0.83
CV 1.00 0.59 -1.07 -0.96 0.10 0.19 1.00 0.59 -0.43 -0.60
Skewness 2.02 3.92 -0.03 1.26 0.28 1.04 2.02 3.92 -0.03 1.26
SE.Skewness 0.33 0.33 0.33 0.33 0.33 0.33 0.33 0.33 0.33 0.33
Kurtosis 3.52 15.57 0.31 1.95 0.67 1.22 3.52 15.57 0.31 1.95
N.Valid 53.00 53.00 53.00 53.00 53.00 53.00 53.00 53.00 53.00 53.00
Pct.Valid 100.00 100.00 100.00 100.00 100.00 100.00 100.00 100.00 100.00 100.00
# Create long panel and recode year
acf18Panel <- acf18 %>%
  gather(year, ln_tfp, ln_x:ln_y)
# Recode year variable
acf18Panel$year <- fct_recode(acf18Panel$year,
                               "2003" = "ln_x",
                               "2009" = "ln_y")
# Plot basic Boxplot
acf18Panel %>% 
  ggplot(aes(x = year, y = ln_tfp, fill = year)) +
  geom_boxplot(outlier.colour="black", 
               outlier.shape=16,
               outlier.size=1,
               notch=TRUE) +
  scale_fill_brewer(palette="Blues") +
  theme_classic() +
  theme(legend.position = 'none') +
  theme(text=element_text(size=10, family="Palatino"))

# Beta convergence scatterplot 
acf18Growth %>% 
  ggplot(aes(x = ln_x, y = growth1)) +
  geom_point(size = 4) + 
  geom_smooth(size = 2) +
  # Change the theme to viridis colors and black and white background
  scale_color_viridis(discrete = TRUE) +
  theme_bw() +
  # Change the font of the theme
  theme(text=element_text(size=20, family="Palatino")) +
  # Hide the lenged
  theme(legend.position = 'none') +
  # Change plot titles
  labs(x = "Log of TFP in 2003",
       y = "TFP Growth")

3.2 Mobility Analysis

# Select and rename variables
acf18 <- acf18 %>% 
  select(id, ln_r_x, ln_r_y) %>% 
  rename(initial = ln_r_x, final = ln_r_y)
# Identify forward and backward mobility
acf18 <- acf18 %>% 
  mutate(mobility0 = as.factor(final > initial))
# Identify mobility across quadrants
acf18 <- acf18 %>% 
  mutate(mobility = as.factor(case_when(final > 0 & initial > 0 ~ 1, 
                              final > 0 & initial < 0 ~ 2,
                              final < 0 & initial < 0 ~ 3,
                              final < 0 & initial > 0 ~ 4,
                              TRUE ~ 0))
                              )
# Identify observation in the first quadrant (uppper right corner)
acf18 <- acf18 %>% 
  mutate(mobility1 = as.factor(final > 0 & initial > 0))
  
# Identify observation in the second quadrant (lower right corner)
acf18 <- acf18 %>% 
  mutate(mobility2 = as.factor(final > 0 & initial < 0))
# Identify observation in the third quadrant (lower left corner)
acf18 <- acf18 %>% 
  mutate(mobility3 = as.factor(final < 0 & initial < 0))
# Identify observation in the third quadrant (upper left corner)
acf18 <- acf18 %>% 
  mutate(mobility4 = as.factor(final < 0 & initial > 0))
# Print table
acf18
# Create scatterplot 
acf18 %>% 
ggplot(aes(x = final , y = initial, color = mobility0, shape = mobility)) +
  geom_point(size = 4) + 
  # Add 45 degree line and reference lines
  geom_abline(aes(intercept = 0, slope = 1)) +
  geom_hline(yintercept=0, linetype="dashed") + 
  geom_vline(xintercept=0, linetype="dashed") +
  # Add labels that do not overlap
  # geom_text_repel(aes(label = id), size = 3) +
  # Change axis limits
  xlim(-3, 3) + 
  ylim(-3, 3) +
  # Change the theme to viridis colors and black and white background
  scale_color_viridis(discrete = TRUE) +
  theme_bw() +
  # Change the font of the theme
  theme(text=element_text(size=20, family="Palatino")) +
  # Hide the lenged
  theme(legend.position = 'none') +
  # Change plot titles
  labs(x = "Log of Relative TFP in 2009",
       y = "Log of Relative TFP in 2003")

# Create scatterplot with bivarate density
acf18 %>% 
ggplot(aes(x = final , y = initial)) +
  stat_density_2d(aes(fill = ..level..), geom = "polygon") +
  scale_fill_gradientn(colors = c("#FFEDA0", "#FEB24C", "#F03B20"))+
  geom_point(size = 2) + 
  # Add 45 degree line and reference lines
  geom_abline(aes(intercept = 0, slope = 1)) +
  geom_hline(yintercept=0, linetype="dashed") + 
  geom_vline(xintercept=0, linetype="dashed") +
  # Add labels that do not overlap
  # geom_text_repel(aes(label = id), size = 3) +
  # Change axis limits
  xlim(-3, 3) + 
  ylim(-3, 3) +
  # Change the theme to viridis colors and black and white background
  scale_color_viridis(discrete = TRUE) +
  theme_bw() +
  # Change the font of the theme
  theme(text=element_text(size=20, family="Palatino")) +
  # Hide the lenged
  theme(legend.position = 'none') +
  # Change plot titles
  labs(x = "Log of Relative TFP in 2009",
       y = "Log of Relative TFP in 2003")

# Descriptive statistics for continuous variables
kable(descr(acf18))
initial final
Mean -0.37 -0.51
Std.Dev 0.87 0.85
Min -2.85 -2.15
Median -0.36 -0.74
Max 1.52 2.26
MAD 0.72 0.65
IQR 0.98 0.83
CV -0.43 -0.60
Skewness -0.03 1.26
SE.Skewness 0.33 0.33
Kurtosis 0.31 1.95
N.Valid 53.00 53.00
Pct.Valid 100.00 100.00
# Frequency table for forward and backward mobility
kable(freq(acf18$mobility0))
Freq % Valid % Valid Cum. % Total % Total Cum.
FALSE 31 58 58 58 58
TRUE 22 42 100 42 100
0 NA NA 0 100
Total 53 100 100 100 100
# Frequency table for mobility across quadrants
freq(acf18$mobility)
Frequencies   
mobility     
Data frame: acf18   
Type: Factor (unordered)   

              Freq   % Valid   % Valid Cum.   % Total   % Total Cum.
----------- ------ --------- -------------- --------- --------------
          1      3      5.66           5.66      5.66           5.66
          2      8     15.09          20.75     15.09          20.75
          3     29     54.72          75.47     54.72          75.47
          4     13     24.53         100.00     24.53         100.00
       <NA>      0                               0.00         100.00
      Total     53    100.00         100.00    100.00         100.00
# Simple mobility matrix
kable(with(acf18, ctable(mobility0, mobility, prop = "r")) )
1 2 3 4 Total
FALSE 1 0 17 13 31
TRUE 2 8 12 0 22
Total 3 8 29 13 53
1 2 3 4 Total
FALSE 0.03 0.00 0.55 0.42 1
TRUE 0.09 0.36 0.55 0.00 1
Total 0.06 0.15 0.55 0.25 1

4 Sector ISIC36LC-stch

4.1 Sigma and Beta Convergence Analysis

# Data import
stch36 <- read_csv(" ISIC36LC-stch/inputs/dataMobility.csv")
stch36 <- stch36 %>% 
  mutate(id = as.factor(id))
# Compute average annual growth rates (use approximations)
stch36 <- stch36 %>% 
  mutate(growth1 = ((ln_y - ln_x)/6)*100,
         growth2 =  ((y/x)^(1/6)-1)*100)
stch36
# Descriptive statistics of continous variables
stch36Growth <- stch36 %>% 
  select(x, y, ln_x, ln_y, growth1, growth2, r_x, r_y, ln_r_x, ln_r_y) 
kable(descr(stch36Growth))
x y ln_x ln_y growth1 growth2 r_x r_y ln_r_x ln_r_y
Mean 3.0 3.66 0.88 0.98 1.66 2.85 1.00 1.00 -0.21 -0.32
Std.Dev 2.2 4.03 0.65 0.73 14.95 16.58 0.73 1.10 0.65 0.73
Min 0.5 0.67 -0.69 -0.40 -24.90 -22.04 0.17 0.18 -1.78 -1.70
Median 2.4 2.43 0.87 0.89 -0.44 -0.44 0.80 0.66 -0.22 -0.41
Max 12.7 25.98 2.54 3.26 51.25 66.95 4.26 7.09 1.45 1.96
MAD 1.6 1.44 0.72 0.67 12.05 11.58 0.55 0.39 0.72 0.67
IQR 2.3 2.27 0.93 0.90 15.52 15.39 0.78 0.62 0.93 0.90
CV 1.4 0.91 1.35 1.34 0.11 0.17 1.37 0.91 -0.32 -0.44
Skewness 2.1 3.35 0.04 0.82 0.89 1.42 2.09 3.35 0.04 0.82
SE.Skewness 0.3 0.30 0.30 0.30 0.30 0.30 0.30 0.30 0.30 0.30
Kurtosis 5.7 13.72 -0.14 0.56 0.95 2.68 5.71 13.72 -0.14 0.56
N.Valid 62.0 62.00 62.00 62.00 62.00 62.00 62.00 62.00 62.00 62.00
Pct.Valid 100.0 100.00 100.00 100.00 100.00 100.00 100.00 100.00 100.00 100.00
# Create long panel and recode year
stch36Panel <- stch36 %>%
  gather(year, ln_tfp, ln_x:ln_y)
# Recode year variable
stch36Panel$year <- fct_recode(stch36Panel$year,
                               "2003" = "ln_x",
                               "2009" = "ln_y")
# Plot basic Boxplot
stch36Panel %>% 
  ggplot(aes(x = year, y = ln_tfp, fill = year)) +
  geom_boxplot(outlier.colour="black", 
               outlier.shape=16,
               outlier.size=1,
               notch=TRUE) +
  scale_fill_brewer(palette="Blues") +
  theme_classic() +
  theme(legend.position = 'none') +
  theme(text=element_text(size=10, family="Palatino"))

# Beta convergence scatterplot 
stch36Growth %>% 
  ggplot(aes(x = ln_x, y = growth1)) +
  geom_point(size = 4) + 
  geom_smooth(size = 2) +
  # Change the theme to viridis colors and black and white background
  scale_color_viridis(discrete = TRUE) +
  theme_bw() +
  # Change the font of the theme
  theme(text=element_text(size=20, family="Palatino")) +
  # Hide the lenged
  theme(legend.position = 'none') +
  # Change plot titles
  labs(x = "Log of TFP in 2003",
       y = "TFP Growth")

4.2 Mobility Analysis

# Select and rename variables
stch36 <- stch36 %>% 
  select(id, ln_r_x, ln_r_y) %>% 
  rename(initial = ln_r_x, final = ln_r_y)
# Identify forward and backward mobility
stch36 <- stch36 %>% 
  mutate(mobility0 = as.factor(final > initial))
# Identify mobility across quadrants
stch36 <- stch36 %>% 
  mutate(mobility = as.factor(case_when(final > 0 & initial > 0 ~ 1, 
                              final > 0 & initial < 0 ~ 2,
                              final < 0 & initial < 0 ~ 3,
                              final < 0 & initial > 0 ~ 4,
                              TRUE ~ 0))
                              )
# Identify observation in the first quadrant (uppper right corner)
stch36 <- stch36 %>% 
  mutate(mobility1 = as.factor(final > 0 & initial > 0))
  
# Identify observation in the second quadrant (lower right corner)
stch36 <- stch36 %>% 
  mutate(mobility2 = as.factor(final > 0 & initial < 0))
# Identify observation in the third quadrant (lower left corner)
stch36 <- stch36 %>% 
  mutate(mobility3 = as.factor(final < 0 & initial < 0))
# Identify observation in the third quadrant (upper left corner)
stch36 <- stch36 %>% 
  mutate(mobility4 = as.factor(final < 0 & initial > 0))
# Print table
stch36
# Create scatterplot 
stch36 %>% 
ggplot(aes(x = final , y = initial, color = mobility0, shape = mobility)) +
  geom_point(size = 4) + 
  # Add 45 degree line and reference lines
  geom_abline(aes(intercept = 0, slope = 1)) +
  geom_hline(yintercept=0, linetype="dashed") + 
  geom_vline(xintercept=0, linetype="dashed") +
  # Add labels that do not overlap
  # geom_text_repel(aes(label = id), size = 3) +
  # Change axis limits
  xlim(-3, 3) + 
  ylim(-3, 3) +
  # Change the theme to viridis colors and black and white background
  scale_color_viridis(discrete = TRUE) +
  theme_bw() +
  # Change the font of the theme
  theme(text=element_text(size=20, family="Palatino")) +
  # Hide the lenged
  theme(legend.position = 'none') +
  # Change plot titles
  labs(x = "Log of Relative TFP in 2009",
       y = "Log of Relative TFP in 2003")

# Create scatterplot with bivarate density
stch36 %>% 
ggplot(aes(x = final , y = initial)) +
  stat_density_2d(aes(fill = ..level..), geom = "polygon") +
  scale_fill_gradientn(colors = c("#FFEDA0", "#FEB24C", "#F03B20"))+
  geom_point(size = 2) + 
  # Add 45 degree line and reference lines
  geom_abline(aes(intercept = 0, slope = 1)) +
  geom_hline(yintercept=0, linetype="dashed") + 
  geom_vline(xintercept=0, linetype="dashed") +
  # Add labels that do not overlap
  # geom_text_repel(aes(label = id), size = 3) +
  # Change axis limits
  xlim(-3, 3) + 
  ylim(-3, 3) +
  # Change the theme to viridis colors and black and white background
  scale_color_viridis(discrete = TRUE) +
  theme_bw() +
  # Change the font of the theme
  theme(text=element_text(size=20, family="Palatino")) +
  # Hide the lenged
  theme(legend.position = 'none') +
  # Change plot titles
  labs(x = "Log of Relative TFP in 2009",
       y = "Log of Relative TFP in 2003")

# Descriptive statistics for continuous variables
kable(descr(stch36))
initial final
Mean -0.21 -0.32
Std.Dev 0.65 0.73
Min -1.78 -1.70
Median -0.22 -0.41
Max 1.45 1.96
MAD 0.72 0.67
IQR 0.93 0.90
CV -0.32 -0.44
Skewness 0.04 0.82
SE.Skewness 0.30 0.30
Kurtosis -0.14 0.56
N.Valid 62.00 62.00
Pct.Valid 100.00 100.00
# Frequency table for forward and backward mobility
kable(freq(stch36$mobility0))
Freq % Valid % Valid Cum. % Total % Total Cum.
FALSE 38 61 61 61 61
TRUE 24 39 100 39 100
0 NA NA 0 100
Total 62 100 100 100 100
# Frequency table for mobility across quadrants
freq(stch36$mobility)
Frequencies   
mobility     
Data frame: stch36   
Type: Factor (unordered)   

              Freq   % Valid   % Valid Cum.   % Total   % Total Cum.
----------- ------ --------- -------------- --------- --------------
          1      8     12.90          12.90     12.90          12.90
          2      9     14.52          27.42     14.52          27.42
          3     33     53.23          80.65     53.23          80.65
          4     12     19.35         100.00     19.35         100.00
       <NA>      0                               0.00         100.00
      Total     62    100.00         100.00    100.00         100.00
# Simple mobility matrix
kable(with(stch36, ctable(mobility0, mobility, prop = "r")) )
1 2 3 4 Total
FALSE 6 0 20 12 38
TRUE 2 9 13 0 24
Total 8 9 33 12 62
1 2 3 4 Total
FALSE 0.16 0.00 0.53 0.32 1
TRUE 0.08 0.38 0.54 0.00 1
Total 0.13 0.15 0.53 0.19 1

5 Sector ISIC36LC-lp

5.1 Sigma and Beta Convergence Analysis

# Data import
lp36 <- read_csv(" ISIC36LC-lp/inputs/dataMobility.csv")
lp36 <- lp36 %>% 
  mutate(id = as.factor(id))
# Compute average annual growth rates (use approximations)
lp36 <- lp36 %>% 
  mutate(growth1 = ((ln_y - ln_x)/6)*100,
         growth2 =  ((y/x)^(1/6)-1)*100)
lp36
# Descriptive statistics of continous variables
lp36Growth <- lp36 %>% 
  select(x, y, ln_x, ln_y, growth1, growth2, r_x, r_y, ln_r_x, ln_r_y) 
kable(descr(lp36Growth))
x y ln_x ln_y growth1 growth2 r_x r_y ln_r_x ln_r_y
Mean 42.8 47.9 3.43 3.51 1.48 2.46 1.00 1.00 -0.33 -0.35
Std.Dev 38.1 45.7 0.82 0.85 13.72 14.65 0.89 0.95 0.82 0.85
Min 6.2 5.3 1.82 1.67 -29.71 -25.70 0.14 0.11 -1.94 -2.19
Median 28.5 35.0 3.35 3.56 -0.25 -0.25 0.67 0.73 -0.41 -0.31
Max 196.4 254.5 5.28 5.54 36.64 44.25 4.59 5.31 1.52 1.67
MAD 21.1 26.6 0.88 0.88 10.61 10.57 0.49 0.55 0.88 0.88
IQR 40.8 38.8 1.26 1.14 14.42 14.46 0.95 0.81 1.26 1.14
CV 1.1 1.1 4.20 4.14 0.11 0.17 1.12 1.05 -0.41 -0.42
Skewness 1.7 2.2 0.21 0.09 0.51 0.93 1.71 2.19 0.21 0.09
SE.Skewness 0.3 0.3 0.30 0.30 0.30 0.30 0.30 0.30 0.30 0.30
Kurtosis 3.0 5.7 -0.79 -0.45 0.36 0.79 3.04 5.74 -0.79 -0.45
N.Valid 62.0 62.0 62.00 62.00 62.00 62.00 62.00 62.00 62.00 62.00
Pct.Valid 100.0 100.0 100.00 100.00 100.00 100.00 100.00 100.00 100.00 100.00
# Create long panel and recode year
lp36Panel <- lp36 %>%
  gather(year, ln_tfp, ln_x:ln_y)
# Recode year variable
lp36Panel$year <- fct_recode(lp36Panel$year,
                               "2003" = "ln_x",
                               "2009" = "ln_y")
# Plot basic Boxplot
lp36Panel %>% 
  ggplot(aes(x = year, y = ln_tfp, fill = year)) +
  geom_boxplot(outlier.colour="black", 
               outlier.shape=16,
               outlier.size=1,
               notch=TRUE) +
  scale_fill_brewer(palette="Blues") +
  theme_classic() +
  theme(legend.position = 'none') +
  theme(text=element_text(size=10, family="Palatino"))

# Beta convergence scatterplot 
lp36Growth %>% 
  ggplot(aes(x = ln_x, y = growth1)) +
  geom_point(size = 4) + 
  geom_smooth(size = 2) +
  # Change the theme to viridis colors and black and white background
  scale_color_viridis(discrete = TRUE) +
  theme_bw() +
  # Change the font of the theme
  theme(text=element_text(size=20, family="Palatino")) +
  # Hide the lenged
  theme(legend.position = 'none') +
  # Change plot titles
  labs(x = "Log of TFP in 2003",
       y = "TFP Growth")

5.2 Mobility Analysis

# Select and rename variables
lp36 <- lp36 %>% 
  select(id, ln_r_x, ln_r_y) %>% 
  rename(initial = ln_r_x, final = ln_r_y)
# Identify forward and backward mobility
lp36 <- lp36 %>% 
  mutate(mobility0 = as.factor(final > initial))
# Identify mobility across quadrants
lp36 <- lp36 %>% 
  mutate(mobility = as.factor(case_when(final > 0 & initial > 0 ~ 1, 
                              final > 0 & initial < 0 ~ 2,
                              final < 0 & initial < 0 ~ 3,
                              final < 0 & initial > 0 ~ 4,
                              TRUE ~ 0))
                              )
# Identify observation in the first quadrant (uppper right corner)
lp36 <- lp36 %>% 
  mutate(mobility1 = as.factor(final > 0 & initial > 0))
  
# Identify observation in the second quadrant (lower right corner)
lp36 <- lp36 %>% 
  mutate(mobility2 = as.factor(final > 0 & initial < 0))
# Identify observation in the third quadrant (lower left corner)
lp36 <- lp36 %>% 
  mutate(mobility3 = as.factor(final < 0 & initial < 0))
# Identify observation in the third quadrant (upper left corner)
lp36 <- lp36 %>% 
  mutate(mobility4 = as.factor(final < 0 & initial > 0))
# Print table
lp36
# Create scatterplot 
lp36 %>% 
ggplot(aes(x = final , y = initial, color = mobility0, shape = mobility)) +
  geom_point(size = 4) + 
  # Add 45 degree line and reference lines
  geom_abline(aes(intercept = 0, slope = 1)) +
  geom_hline(yintercept=0, linetype="dashed") + 
  geom_vline(xintercept=0, linetype="dashed") +
  # Add labels that do not overlap
  # geom_text_repel(aes(label = id), size = 3) +
  # Change axis limits
  xlim(-3, 3) + 
  ylim(-3, 3) +
  # Change the theme to viridis colors and black and white background
  scale_color_viridis(discrete = TRUE) +
  theme_bw() +
  # Change the font of the theme
  theme(text=element_text(size=20, family="Palatino")) +
  # Hide the lenged
  theme(legend.position = 'none') +
  # Change plot titles
  labs(x = "Log of Relative TFP in 2009",
       y = "Log of Relative TFP in 2003")

# Create scatterplot with bivarate density
lp36 %>% 
ggplot(aes(x = final , y = initial)) +
  stat_density_2d(aes(fill = ..level..), geom = "polygon") +
  scale_fill_gradientn(colors = c("#FFEDA0", "#FEB24C", "#F03B20"))+
  geom_point(size = 2) + 
  # Add 45 degree line and reference lines
  geom_abline(aes(intercept = 0, slope = 1)) +
  geom_hline(yintercept=0, linetype="dashed") + 
  geom_vline(xintercept=0, linetype="dashed") +
  # Add labels that do not overlap
  # geom_text_repel(aes(label = id), size = 3) +
  # Change axis limits
  xlim(-3, 3) + 
  ylim(-3, 3) +
  # Change the theme to viridis colors and black and white background
  scale_color_viridis(discrete = TRUE) +
  theme_bw() +
  # Change the font of the theme
  theme(text=element_text(size=20, family="Palatino")) +
  # Hide the lenged
  theme(legend.position = 'none') +
  # Change plot titles
  labs(x = "Log of Relative TFP in 2009",
       y = "Log of Relative TFP in 2003")

# Descriptive statistics for continuous variables
kable(descr(lp36))
initial final
Mean -0.33 -0.35
Std.Dev 0.82 0.85
Min -1.94 -2.19
Median -0.41 -0.31
Max 1.52 1.67
MAD 0.88 0.88
IQR 1.26 1.14
CV -0.41 -0.42
Skewness 0.21 0.09
SE.Skewness 0.30 0.30
Kurtosis -0.79 -0.45
N.Valid 62.00 62.00
Pct.Valid 100.00 100.00
# Frequency table for forward and backward mobility
kable(freq(lp36$mobility0))
Freq % Valid % Valid Cum. % Total % Total Cum.
FALSE 35 56 56 56 56
TRUE 27 44 100 44 100
0 NA NA 0 100
Total 62 100 100 100 100
# Frequency table for mobility across quadrants
freq(lp36$mobility)
Frequencies   
mobility     
Data frame: lp36   
Type: Factor (unordered)   

              Freq   % Valid   % Valid Cum.   % Total   % Total Cum.
----------- ------ --------- -------------- --------- --------------
          1     11     17.74          17.74     17.74          17.74
          2     11     17.74          35.48     17.74          35.48
          3     31     50.00          85.48     50.00          85.48
          4      9     14.52         100.00     14.52         100.00
       <NA>      0                               0.00         100.00
      Total     62    100.00         100.00    100.00         100.00
# Simple mobility matrix
kable(with(lp36, ctable(mobility0, mobility, prop = "r")) )
1 2 3 4 Total
FALSE 7 0 19 9 35
TRUE 4 11 12 0 27
Total 11 11 31 9 62
1 2 3 4 Total
FALSE 0.20 0.00 0.54 0.26 1
TRUE 0.15 0.41 0.44 0.00 1
Total 0.18 0.18 0.50 0.15 1

6 Sector ISIC36LC-acf

6.1 Sigma and Beta Convergence Analysis

# Data import
acf36 <- read_csv(" ISIC36LC-acf/inputs/dataMobility.csv")
acf36 <- acf36 %>% 
  mutate(id = as.factor(id))
# Compute average annual growth rates (use approximations)
acf36 <- acf36 %>% 
  mutate(growth1 = ((ln_y - ln_x)/6)*100,
         growth2 =  ((y/x)^(1/6)-1)*100)
acf36
# Descriptive statistics of continous variables
acf36Growth <- acf36 %>% 
  select(x, y, ln_x, ln_y, growth1, growth2, r_x, r_y, ln_r_x, ln_r_y) 
kable(descr(acf36Growth))
x y ln_x ln_y growth1 growth2 r_x r_y ln_r_x ln_r_y
Mean 0.49 1.43 -1.36 -0.81 9.17 12.95 1.00 1.00 -0.65 -1.17
Std.Dev 0.86 6.32 1.02 1.04 23.60 31.48 1.74 4.41 1.02 1.04
Min 0.05 0.10 -3.09 -2.34 -35.61 -29.96 0.09 0.07 -2.38 -2.70
Median 0.23 0.38 -1.45 -0.96 6.70 6.92 0.48 0.27 -0.74 -1.32
Max 5.46 49.88 1.70 3.91 96.25 161.83 11.09 34.82 2.41 3.55
MAD 0.19 0.24 0.92 0.77 21.21 21.85 0.40 0.17 0.92 0.77
IQR 0.30 0.42 1.23 1.02 27.84 29.99 0.62 0.29 1.23 1.02
CV 0.57 0.23 -1.33 -0.78 0.39 0.41 0.57 0.23 -0.64 -1.13
Skewness 3.99 7.28 0.79 1.79 1.10 2.29 3.99 7.28 0.79 1.79
SE.Skewness 0.30 0.30 0.30 0.30 0.30 0.30 0.30 0.30 0.30 0.30
Kurtosis 17.87 52.83 0.43 5.48 2.12 7.42 17.87 52.83 0.43 5.48
N.Valid 62.00 62.00 62.00 62.00 62.00 62.00 62.00 62.00 62.00 62.00
Pct.Valid 100.00 100.00 100.00 100.00 100.00 100.00 100.00 100.00 100.00 100.00
# Create long panel and recode year
acf36Panel <- acf36 %>%
  gather(year, ln_tfp, ln_x:ln_y)
# Recode year variable
acf36Panel$year <- fct_recode(acf36Panel$year,
                               "2003" = "ln_x",
                               "2009" = "ln_y")
# Plot basic Boxplot
acf36Panel %>% 
  ggplot(aes(x = year, y = ln_tfp, fill = year)) +
  geom_boxplot(outlier.colour="black", 
               outlier.shape=16,
               outlier.size=1,
               notch=TRUE) +
  scale_fill_brewer(palette="Blues") +
  theme_classic() +
  theme(legend.position = 'none') +
  theme(text=element_text(size=10, family="Palatino"))

# Beta convergence scatterplot 
acf36Growth %>% 
  ggplot(aes(x = ln_x, y = growth1)) +
  geom_point(size = 4) + 
  geom_smooth(size = 2) +
  # Change the theme to viridis colors and black and white background
  scale_color_viridis(discrete = TRUE) +
  theme_bw() +
  # Change the font of the theme
  theme(text=element_text(size=20, family="Palatino")) +
  # Hide the lenged
  theme(legend.position = 'none') +
  # Change plot titles
  labs(x = "Log of TFP in 2003",
       y = "TFP Growth")

6.2 Mobility Analysis

# Select and rename variables
acf36 <- acf36 %>% 
  select(id, ln_r_x, ln_r_y) %>% 
  rename(initial = ln_r_x, final = ln_r_y)
# Identify forward and backward mobility
acf36 <- acf36 %>% 
  mutate(mobility0 = as.factor(final > initial))
# Identify mobility across quadrants
acf36 <- acf36 %>% 
  mutate(mobility = as.factor(case_when(final > 0 & initial > 0 ~ 1, 
                              final > 0 & initial < 0 ~ 2,
                              final < 0 & initial < 0 ~ 3,
                              final < 0 & initial > 0 ~ 4,
                              TRUE ~ 0))
                              )
# Identify observation in the first quadrant (uppper right corner)
acf36 <- acf36 %>% 
  mutate(mobility1 = as.factor(final > 0 & initial > 0))
  
# Identify observation in the second quadrant (lower right corner)
acf36 <- acf36 %>% 
  mutate(mobility2 = as.factor(final > 0 & initial < 0))
# Identify observation in the third quadrant (lower left corner)
acf36 <- acf36 %>% 
  mutate(mobility3 = as.factor(final < 0 & initial < 0))
# Identify observation in the third quadrant (upper left corner)
acf36 <- acf36 %>% 
  mutate(mobility4 = as.factor(final < 0 & initial > 0))
# Print table
acf36
# Create scatterplot 
acf36 %>% 
ggplot(aes(x = final , y = initial, color = mobility0, shape = mobility)) +
  geom_point(size = 4) + 
  # Add 45 degree line and reference lines
  geom_abline(aes(intercept = 0, slope = 1)) +
  geom_hline(yintercept=0, linetype="dashed") + 
  geom_vline(xintercept=0, linetype="dashed") +
  # Add labels that do not overlap
  # geom_text_repel(aes(label = id), size = 3) +
  # Change axis limits
  xlim(-3, 3) + 
  ylim(-3, 3) +
  # Change the theme to viridis colors and black and white background
  scale_color_viridis(discrete = TRUE) +
  theme_bw() +
  # Change the font of the theme
  theme(text=element_text(size=20, family="Palatino")) +
  # Hide the lenged
  theme(legend.position = 'none') +
  # Change plot titles
  labs(x = "Log of Relative TFP in 2009",
       y = "Log of Relative TFP in 2003")

# Create scatterplot with bivarate density
acf36 %>% 
ggplot(aes(x = final , y = initial)) +
  stat_density_2d(aes(fill = ..level..), geom = "polygon") +
  scale_fill_gradientn(colors = c("#FFEDA0", "#FEB24C", "#F03B20"))+
  geom_point(size = 2) + 
  # Add 45 degree line and reference lines
  geom_abline(aes(intercept = 0, slope = 1)) +
  geom_hline(yintercept=0, linetype="dashed") + 
  geom_vline(xintercept=0, linetype="dashed") +
  # Add labels that do not overlap
  # geom_text_repel(aes(label = id), size = 3) +
  # Change axis limits
  xlim(-3, 3) + 
  ylim(-3, 3) +
  # Change the theme to viridis colors and black and white background
  scale_color_viridis(discrete = TRUE) +
  theme_bw() +
  # Change the font of the theme
  theme(text=element_text(size=20, family="Palatino")) +
  # Hide the lenged
  theme(legend.position = 'none') +
  # Change plot titles
  labs(x = "Log of Relative TFP in 2009",
       y = "Log of Relative TFP in 2003")

# Descriptive statistics for continuous variables
kable(descr(acf36))
initial final
Mean -0.65 -1.17
Std.Dev 1.02 1.04
Min -2.38 -2.70
Median -0.74 -1.32
Max 2.41 3.55
MAD 0.92 0.77
IQR 1.23 1.02
CV -0.64 -1.13
Skewness 0.79 1.79
SE.Skewness 0.30 0.30
Kurtosis 0.43 5.48
N.Valid 62.00 62.00
Pct.Valid 100.00 100.00
# Frequency table for forward and backward mobility
kable(freq(acf36$mobility0))
Freq % Valid % Valid Cum. % Total % Total Cum.
FALSE 44 71 71 71 71
TRUE 18 29 100 29 100
0 NA NA 0 100
Total 62 100 100 100 100
# Frequency table for mobility across quadrants
freq(acf36$mobility)
Frequencies   
mobility     
Data frame: acf36   
Type: Factor (unordered)   

              Freq   % Valid   % Valid Cum.   % Total   % Total Cum.
----------- ------ --------- -------------- --------- --------------
          1      1      1.61           1.61      1.61           1.61
          2      4      6.45           8.06      6.45           8.06
          3     45     72.58          80.65     72.58          80.65
          4     12     19.35         100.00     19.35         100.00
       <NA>      0                               0.00         100.00
      Total     62    100.00         100.00    100.00         100.00
# Simple mobility matrix
kable(with(acf36, ctable(mobility0, mobility, prop = "r")) )
1 2 3 4 Total
FALSE 1 0 31 12 44
TRUE 0 4 14 0 18
Total 1 4 45 12 62
1 2 3 4 Total
FALSE 0.02 0.00 0.70 0.27 1
TRUE 0.00 0.22 0.78 0.00 1
Total 0.02 0.06 0.73 0.19 1
Ci0tLQp0aXRsZTogIlNvbWUgQ29udmVyZ2VuY2UgYW5kIE1vYmlsaXR5IEZhY3RzIgpvdXRwdXQ6IAogIGh0bWxfbm90ZWJvb2s6CiAgICB0aGVtZTogY29zbW8KICAgIGhpZ2hsaWdodDogbW9ub2Nocm9tZQogICAgdG9jOiB0cnVlCiAgICB0b2NfZmxvYXQ6IHRydWUKICAgIHRvY19kZXB0aDogNAogICAgbnVtYmVyX3NlY3Rpb25zOiB0cnVlCiAgICBjb2RlX2ZvbGRpbmc6IGhpZGUKICAgIGRmX3ByaW50OiBrYWJsZQogIGdpdGh1Yl9kb2N1bWVudDogZGVmYXVsdAotLS0KCjxzdHlsZT4KCmgxLnRpdGxlIHsgCiAgZm9udC1zaXplOiAxOHB0OyAKICBjb2xvcjogRGFya0JsdWU7IAp9IAoKYm9keSwgaDEsIGgyLCBoMywgaDQgewogICAgZm9udC1mYW1pbHk6ICJQYWxhdGlubyIsIHNlcmlmOwp9Cgpib2R5IHsKICAgIGZvbnQtc2l6ZTogMTJwdDsKfQoKLyogSGVhZGVycyAqLwpoMSxoMixoMyxoNCxoNSxoNnsKICBmb250LXNpemU6IDE0cHQ7CiAgY29sb3I6ICMwMDAwOEI7Cn0KCmJvZHkgewogICAgY29sb3I6ICMzMzMzMzM7Cn0KYSwgYTpob3ZlciB7CiAgICBjb2xvcjogIzhCM0E2MjsKfQpwcmUgewogICAgZm9udC1zaXplOiAxMnB4Owp9Cjwvc3R5bGU+CgoKYGBge3Igc2V0dXAsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KGdncmVwZWwpCmxpYnJhcnkoZXh0cmFmb250KQpsaWJyYXJ5KHZpcmlkaXMpCmxpYnJhcnkoc3VtbWFyeXRvb2xzKQpsaWJyYXJ5KHh0YWJsZSkKbGlicmFyeShrbml0cikKb3B0aW9ucyhwcm9tcHQ9IlI+ICIsIGRpZ2l0cz0yKQpgYGAKCgoKIyBTZWN0b3IgSVNJQzE4TEMtc3RjaAoKIyMgU2lnbWEgYW5kIEJldGEgQ29udmVyZ2VuY2UgQW5hbHlzaXMKCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CiMgRGF0YSBpbXBvcnQKc3RjaDE4IDwtIHJlYWRfY3N2KCIgSVNJQzE4TEMtc3RjaC9pbnB1dHMvZGF0YU1vYmlsaXR5LmNzdiIpCnN0Y2gxOCA8LSBzdGNoMTggJT4lIAogIG11dGF0ZShpZCA9IGFzLmZhY3RvcihpZCkpCmBgYAoKYGBge3J9CiMgQ29tcHV0ZSBhdmVyYWdlIGFubnVhbCBncm93dGggcmF0ZXMgKHVzZSBhcHByb3hpbWF0aW9ucykKc3RjaDE4IDwtIHN0Y2gxOCAlPiUgCiAgbXV0YXRlKGdyb3d0aDEgPSAoKGxuX3kgLSBsbl94KS82KSoxMDAsCiAgICAgICAgIGdyb3d0aDIgPSAgKCh5L3gpXigxLzYpLTEpKjEwMCkKc3RjaDE4CmBgYAoKCmBgYHtyfQojIERlc2NyaXB0aXZlIHN0YXRpc3RpY3Mgb2YgY29udGlub3VzIHZhcmlhYmxlcwpzdGNoMThHcm93dGggPC0gc3RjaDE4ICU+JSAKICBzZWxlY3QoeCwgeSwgbG5feCwgbG5feSwgZ3Jvd3RoMSwgZ3Jvd3RoMiwgcl94LCByX3ksIGxuX3JfeCwgbG5fcl95KSAKCmthYmxlKGRlc2NyKHN0Y2gxOEdyb3d0aCkpCgoKYGBgCgoKYGBge3J9CiMgQ3JlYXRlIGxvbmcgcGFuZWwgYW5kIHJlY29kZSB5ZWFyCnN0Y2gxOFBhbmVsIDwtIHN0Y2gxOCAlPiUKICBnYXRoZXIoeWVhciwgbG5fdGZwLCBsbl94OmxuX3kpCmBgYAoKYGBge3J9CiMgUmVjb2RlIHllYXIgdmFyaWFibGUKc3RjaDE4UGFuZWwkeWVhciA8LSBmY3RfcmVjb2RlKHN0Y2gxOFBhbmVsJHllYXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMjAwMyIgPSAibG5feCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMjAwOSIgPSAibG5feSIpCmBgYAoKCgpgYGB7ciBmaWcuaGVpZ2h0PTEuNSwgZmlnLndpZHRoPTF9CiMgUGxvdCBiYXNpYyBCb3hwbG90CnN0Y2gxOFBhbmVsICU+JSAKICBnZ3Bsb3QoYWVzKHggPSB5ZWFyLCB5ID0gbG5fdGZwLCBmaWxsID0geWVhcikpICsKICBnZW9tX2JveHBsb3Qob3V0bGllci5jb2xvdXI9ImJsYWNrIiwgCiAgICAgICAgICAgICAgIG91dGxpZXIuc2hhcGU9MTYsCiAgICAgICAgICAgICAgIG91dGxpZXIuc2l6ZT0xLAogICAgICAgICAgICAgICBub3RjaD1UUlVFKSArCiAgc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZT0iQmx1ZXMiKSArCiAgdGhlbWVfY2xhc3NpYygpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAnbm9uZScpICsKICB0aGVtZSh0ZXh0PWVsZW1lbnRfdGV4dChzaXplPTEwLCBmYW1pbHk9IlBhbGF0aW5vIikpCmBgYAoKCmBgYHtyIGZpZy5oZWlnaHQ9NCwgZmlnLndpZHRoPTZ9CiMgQmV0YSBjb252ZXJnZW5jZSBzY2F0dGVycGxvdCAKc3RjaDE4R3Jvd3RoICU+JSAKICBnZ3Bsb3QoYWVzKHggPSBsbl94LCB5ID0gZ3Jvd3RoMSkpICsKICBnZW9tX3BvaW50KHNpemUgPSA0KSArIAogIGdlb21fc21vb3RoKHNpemUgPSAyKSArCiAgIyBDaGFuZ2UgdGhlIHRoZW1lIHRvIHZpcmlkaXMgY29sb3JzIGFuZCBibGFjayBhbmQgd2hpdGUgYmFja2dyb3VuZAogIHNjYWxlX2NvbG9yX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFKSArCiAgdGhlbWVfYncoKSArCiAgIyBDaGFuZ2UgdGhlIGZvbnQgb2YgdGhlIHRoZW1lCiAgdGhlbWUodGV4dD1lbGVtZW50X3RleHQoc2l6ZT0yMCwgZmFtaWx5PSJQYWxhdGlubyIpKSArCiAgIyBIaWRlIHRoZSBsZW5nZWQKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAnbm9uZScpICsKICAjIENoYW5nZSBwbG90IHRpdGxlcwogIGxhYnMoeCA9ICJMb2cgb2YgVEZQIGluIDIwMDMiLAogICAgICAgeSA9ICJURlAgR3Jvd3RoIikKCmBgYAoKCiMjIE1vYmlsaXR5IEFuYWx5c2lzCgoKYGBge3J9CiMgU2VsZWN0IGFuZCByZW5hbWUgdmFyaWFibGVzCnN0Y2gxOCA8LSBzdGNoMTggJT4lIAogIHNlbGVjdChpZCwgbG5fcl94LCBsbl9yX3kpICU+JSAKICByZW5hbWUoaW5pdGlhbCA9IGxuX3JfeCwgZmluYWwgPSBsbl9yX3kpCmBgYAoKCmBgYHtyfQojIElkZW50aWZ5IGZvcndhcmQgYW5kIGJhY2t3YXJkIG1vYmlsaXR5CnN0Y2gxOCA8LSBzdGNoMTggJT4lIAogIG11dGF0ZShtb2JpbGl0eTAgPSBhcy5mYWN0b3IoZmluYWwgPiBpbml0aWFsKSkKYGBgCgpgYGB7cn0KIyBJZGVudGlmeSBtb2JpbGl0eSBhY3Jvc3MgcXVhZHJhbnRzCnN0Y2gxOCA8LSBzdGNoMTggJT4lIAogIG11dGF0ZShtb2JpbGl0eSA9IGFzLmZhY3RvcihjYXNlX3doZW4oZmluYWwgPiAwICYgaW5pdGlhbCA+IDAgfiAxLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgPiAwICYgaW5pdGlhbCA8IDAgfiAyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCA8IDAgJiBpbml0aWFsIDwgMCB+IDMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIDwgMCAmIGluaXRpYWwgPiAwIH4gNCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSB+IDApKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCgojIElkZW50aWZ5IG9ic2VydmF0aW9uIGluIHRoZSBmaXJzdCBxdWFkcmFudCAodXBwcGVyIHJpZ2h0IGNvcm5lcikKc3RjaDE4IDwtIHN0Y2gxOCAlPiUgCiAgbXV0YXRlKG1vYmlsaXR5MSA9IGFzLmZhY3RvcihmaW5hbCA+IDAgJiBpbml0aWFsID4gMCkpCiAgCiMgSWRlbnRpZnkgb2JzZXJ2YXRpb24gaW4gdGhlIHNlY29uZCBxdWFkcmFudCAobG93ZXIgcmlnaHQgY29ybmVyKQpzdGNoMTggPC0gc3RjaDE4ICU+JSAKICBtdXRhdGUobW9iaWxpdHkyID0gYXMuZmFjdG9yKGZpbmFsID4gMCAmIGluaXRpYWwgPCAwKSkKCiMgSWRlbnRpZnkgb2JzZXJ2YXRpb24gaW4gdGhlIHRoaXJkIHF1YWRyYW50IChsb3dlciBsZWZ0IGNvcm5lcikKc3RjaDE4IDwtIHN0Y2gxOCAlPiUgCiAgbXV0YXRlKG1vYmlsaXR5MyA9IGFzLmZhY3RvcihmaW5hbCA8IDAgJiBpbml0aWFsIDwgMCkpCgojIElkZW50aWZ5IG9ic2VydmF0aW9uIGluIHRoZSB0aGlyZCBxdWFkcmFudCAodXBwZXIgbGVmdCBjb3JuZXIpCnN0Y2gxOCA8LSBzdGNoMTggJT4lIAogIG11dGF0ZShtb2JpbGl0eTQgPSBhcy5mYWN0b3IoZmluYWwgPCAwICYgaW5pdGlhbCA+IDApKQoKYGBgCgoKYGBge3J9CiMgUHJpbnQgdGFibGUKc3RjaDE4CmBgYAoKCgoKYGBge3IgZmlnLmhlaWdodD01LCBmaWcud2lkdGg9NX0KIyBDcmVhdGUgc2NhdHRlcnBsb3QgCnN0Y2gxOCAlPiUgCmdncGxvdChhZXMoeCA9IGZpbmFsICwgeSA9IGluaXRpYWwsIGNvbG9yID0gbW9iaWxpdHkwLCBzaGFwZSA9IG1vYmlsaXR5KSkgKwogIGdlb21fcG9pbnQoc2l6ZSA9IDQpICsgCiAgIyBBZGQgNDUgZGVncmVlIGxpbmUgYW5kIHJlZmVyZW5jZSBsaW5lcwogIGdlb21fYWJsaW5lKGFlcyhpbnRlcmNlcHQgPSAwLCBzbG9wZSA9IDEpKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0PTAsIGxpbmV0eXBlPSJkYXNoZWQiKSArIAogIGdlb21fdmxpbmUoeGludGVyY2VwdD0wLCBsaW5ldHlwZT0iZGFzaGVkIikgKwogICMgQWRkIGxhYmVscyB0aGF0IGRvIG5vdCBvdmVybGFwCiAgIyBnZW9tX3RleHRfcmVwZWwoYWVzKGxhYmVsID0gaWQpLCBzaXplID0gMykgKwogICMgQ2hhbmdlIGF4aXMgbGltaXRzCiAgeGxpbSgtMywgMykgKyAKICB5bGltKC0zLCAzKSArCiAgIyBDaGFuZ2UgdGhlIHRoZW1lIHRvIHZpcmlkaXMgY29sb3JzIGFuZCBibGFjayBhbmQgd2hpdGUgYmFja2dyb3VuZAogIHNjYWxlX2NvbG9yX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFKSArCiAgdGhlbWVfYncoKSArCiAgIyBDaGFuZ2UgdGhlIGZvbnQgb2YgdGhlIHRoZW1lCiAgdGhlbWUodGV4dD1lbGVtZW50X3RleHQoc2l6ZT0yMCwgZmFtaWx5PSJQYWxhdGlubyIpKSArCiAgIyBIaWRlIHRoZSBsZW5nZWQKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAnbm9uZScpICsKICAjIENoYW5nZSBwbG90IHRpdGxlcwogIGxhYnMoeCA9ICJMb2cgb2YgUmVsYXRpdmUgVEZQIGluIDIwMDkiLAogICAgICAgeSA9ICJMb2cgb2YgUmVsYXRpdmUgVEZQIGluIDIwMDMiKQpgYGAKCgoKCmBgYHtyIGZpZy5oZWlnaHQ9NSwgZmlnLndpZHRoPTV9CiMgQ3JlYXRlIHNjYXR0ZXJwbG90IHdpdGggYml2YXJhdGUgZGVuc2l0eQpzdGNoMTggJT4lIApnZ3Bsb3QoYWVzKHggPSBmaW5hbCAsIHkgPSBpbml0aWFsKSkgKwogIHN0YXRfZGVuc2l0eV8yZChhZXMoZmlsbCA9IC4ubGV2ZWwuLiksIGdlb20gPSAicG9seWdvbiIpICsKICBzY2FsZV9maWxsX2dyYWRpZW50bihjb2xvcnMgPSBjKCIjRkZFREEwIiwgIiNGRUIyNEMiLCAiI0YwM0IyMCIpKSsKICBnZW9tX3BvaW50KHNpemUgPSAyKSArIAogICMgQWRkIDQ1IGRlZ3JlZSBsaW5lIGFuZCByZWZlcmVuY2UgbGluZXMKICBnZW9tX2FibGluZShhZXMoaW50ZXJjZXB0ID0gMCwgc2xvcGUgPSAxKSkgKwogIGdlb21faGxpbmUoeWludGVyY2VwdD0wLCBsaW5ldHlwZT0iZGFzaGVkIikgKyAKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQ9MCwgbGluZXR5cGU9ImRhc2hlZCIpICsKICAjIEFkZCBsYWJlbHMgdGhhdCBkbyBub3Qgb3ZlcmxhcAogICMgZ2VvbV90ZXh0X3JlcGVsKGFlcyhsYWJlbCA9IGlkKSwgc2l6ZSA9IDMpICsKICAjIENoYW5nZSBheGlzIGxpbWl0cwogIHhsaW0oLTMsIDMpICsgCiAgeWxpbSgtMywgMykgKwogICMgQ2hhbmdlIHRoZSB0aGVtZSB0byB2aXJpZGlzIGNvbG9ycyBhbmQgYmxhY2sgYW5kIHdoaXRlIGJhY2tncm91bmQKICBzY2FsZV9jb2xvcl92aXJpZGlzKGRpc2NyZXRlID0gVFJVRSkgKwogIHRoZW1lX2J3KCkgKwogICMgQ2hhbmdlIHRoZSBmb250IG9mIHRoZSB0aGVtZQogIHRoZW1lKHRleHQ9ZWxlbWVudF90ZXh0KHNpemU9MjAsIGZhbWlseT0iUGFsYXRpbm8iKSkgKwogICMgSGlkZSB0aGUgbGVuZ2VkCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gJ25vbmUnKSArCiAgIyBDaGFuZ2UgcGxvdCB0aXRsZXMKICBsYWJzKHggPSAiTG9nIG9mIFJlbGF0aXZlIFRGUCBpbiAyMDA5IiwKICAgICAgIHkgPSAiTG9nIG9mIFJlbGF0aXZlIFRGUCBpbiAyMDAzIikKYGBgCgpgYGB7cn0KIyBEZXNjcmlwdGl2ZSBzdGF0aXN0aWNzIGZvciBjb250aW51b3VzIHZhcmlhYmxlcwprYWJsZShkZXNjcihzdGNoMTgpKQpgYGAKCgoKCmBgYHtyfQojIEZyZXF1ZW5jeSB0YWJsZSBmb3IgZm9yd2FyZCBhbmQgYmFja3dhcmQgbW9iaWxpdHkKa2FibGUoZnJlcShzdGNoMTgkbW9iaWxpdHkwKSkKCmBgYAoKYGBge3J9CiMgRnJlcXVlbmN5IHRhYmxlIGZvciBtb2JpbGl0eSBhY3Jvc3MgcXVhZHJhbnRzCmZyZXEoc3RjaDE4JG1vYmlsaXR5KQoKYGBgCgoKYGBge3J9CiMgU2ltcGxlIG1vYmlsaXR5IG1hdHJpeAprYWJsZSh3aXRoKHN0Y2gxOCwgY3RhYmxlKG1vYmlsaXR5MCwgbW9iaWxpdHksIHByb3AgPSAiciIpKSApCmBgYAoKCgojIFNlY3RvciBJU0lDMThMQy1scAoKIyMgU2lnbWEgYW5kIEJldGEgQ29udmVyZ2VuY2UgQW5hbHlzaXMKCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CiMgRGF0YSBpbXBvcnQKbHAxOCA8LSByZWFkX2NzdigiIElTSUMxOExDLWxwL2lucHV0cy9kYXRhTW9iaWxpdHkuY3N2IikKbHAxOCA8LSBscDE4ICU+JSAKICBtdXRhdGUoaWQgPSBhcy5mYWN0b3IoaWQpKQpgYGAKCmBgYHtyfQojIENvbXB1dGUgYXZlcmFnZSBhbm51YWwgZ3Jvd3RoIHJhdGVzICh1c2UgYXBwcm94aW1hdGlvbnMpCmxwMTggPC0gbHAxOCAlPiUgCiAgbXV0YXRlKGdyb3d0aDEgPSAoKGxuX3kgLSBsbl94KS82KSoxMDAsCiAgICAgICAgIGdyb3d0aDIgPSAgKCh5L3gpXigxLzYpLTEpKjEwMCkKbHAxOApgYGAKCgpgYGB7cn0KIyBEZXNjcmlwdGl2ZSBzdGF0aXN0aWNzIG9mIGNvbnRpbm91cyB2YXJpYWJsZXMKbHAxOEdyb3d0aCA8LSBscDE4ICU+JSAKICBzZWxlY3QoeCwgeSwgbG5feCwgbG5feSwgZ3Jvd3RoMSwgZ3Jvd3RoMiwgcl94LCByX3ksIGxuX3JfeCwgbG5fcl95KSAKCmthYmxlKGRlc2NyKGxwMThHcm93dGgpKQoKCmBgYAoKCmBgYHtyfQojIENyZWF0ZSBsb25nIHBhbmVsIGFuZCByZWNvZGUgeWVhcgpscDE4UGFuZWwgPC0gbHAxOCAlPiUKICBnYXRoZXIoeWVhciwgbG5fdGZwLCBsbl94OmxuX3kpCmBgYAoKYGBge3J9CiMgUmVjb2RlIHllYXIgdmFyaWFibGUKbHAxOFBhbmVsJHllYXIgPC0gZmN0X3JlY29kZShscDE4UGFuZWwkeWVhciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIyMDAzIiA9ICJsbl94IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIyMDA5IiA9ICJsbl95IikKYGBgCgoKYGBge3IgZmlnLmhlaWdodD0xLjUsIGZpZy53aWR0aD0xfQojIFBsb3QgYmFzaWMgQm94cGxvdApscDE4UGFuZWwgJT4lIAogIGdncGxvdChhZXMoeCA9IHllYXIsIHkgPSBsbl90ZnAsIGZpbGwgPSB5ZWFyKSkgKwogIGdlb21fYm94cGxvdChvdXRsaWVyLmNvbG91cj0iYmxhY2siLCAKICAgICAgICAgICAgICAgb3V0bGllci5zaGFwZT0xNiwKICAgICAgICAgICAgICAgb3V0bGllci5zaXplPTEsCiAgICAgICAgICAgICAgIG5vdGNoPVRSVUUpICsKICBzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlPSJCbHVlcyIpICsKICB0aGVtZV9jbGFzc2ljKCkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICdub25lJykgKwogIHRoZW1lKHRleHQ9ZWxlbWVudF90ZXh0KHNpemU9MTAsIGZhbWlseT0iUGFsYXRpbm8iKSkKYGBgCgoKYGBge3IgZmlnLmhlaWdodD00LCBmaWcud2lkdGg9Nn0KIyBCZXRhIGNvbnZlcmdlbmNlIHNjYXR0ZXJwbG90IApscDE4R3Jvd3RoICU+JSAKICBnZ3Bsb3QoYWVzKHggPSBsbl94LCB5ID0gZ3Jvd3RoMSkpICsKICBnZW9tX3BvaW50KHNpemUgPSA0KSArIAogIGdlb21fc21vb3RoKHNpemUgPSAyKSArCiAgIyBDaGFuZ2UgdGhlIHRoZW1lIHRvIHZpcmlkaXMgY29sb3JzIGFuZCBibGFjayBhbmQgd2hpdGUgYmFja2dyb3VuZAogIHNjYWxlX2NvbG9yX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFKSArCiAgdGhlbWVfYncoKSArCiAgIyBDaGFuZ2UgdGhlIGZvbnQgb2YgdGhlIHRoZW1lCiAgdGhlbWUodGV4dD1lbGVtZW50X3RleHQoc2l6ZT0yMCwgZmFtaWx5PSJQYWxhdGlubyIpKSArCiAgIyBIaWRlIHRoZSBsZW5nZWQKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAnbm9uZScpICsKICAjIENoYW5nZSBwbG90IHRpdGxlcwogIGxhYnMoeCA9ICJMb2cgb2YgVEZQIGluIDIwMDMiLAogICAgICAgeSA9ICJURlAgR3Jvd3RoIikKCmBgYAoKCiMjIE1vYmlsaXR5IEFuYWx5c2lzCgoKYGBge3J9CiMgU2VsZWN0IGFuZCByZW5hbWUgdmFyaWFibGVzCmxwMTggPC0gbHAxOCAlPiUgCiAgc2VsZWN0KGlkLCBsbl9yX3gsIGxuX3JfeSkgJT4lIAogIHJlbmFtZShpbml0aWFsID0gbG5fcl94LCBmaW5hbCA9IGxuX3JfeSkKYGBgCgoKYGBge3J9CiMgSWRlbnRpZnkgZm9yd2FyZCBhbmQgYmFja3dhcmQgbW9iaWxpdHkKbHAxOCA8LSBscDE4ICU+JSAKICBtdXRhdGUobW9iaWxpdHkwID0gYXMuZmFjdG9yKGZpbmFsID4gaW5pdGlhbCkpCmBgYAoKYGBge3J9CiMgSWRlbnRpZnkgbW9iaWxpdHkgYWNyb3NzIHF1YWRyYW50cwpscDE4IDwtIGxwMTggJT4lIAogIG11dGF0ZShtb2JpbGl0eSA9IGFzLmZhY3RvcihjYXNlX3doZW4oZmluYWwgPiAwICYgaW5pdGlhbCA+IDAgfiAxLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgPiAwICYgaW5pdGlhbCA8IDAgfiAyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCA8IDAgJiBpbml0aWFsIDwgMCB+IDMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIDwgMCAmIGluaXRpYWwgPiAwIH4gNCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSB+IDApKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCgojIElkZW50aWZ5IG9ic2VydmF0aW9uIGluIHRoZSBmaXJzdCBxdWFkcmFudCAodXBwcGVyIHJpZ2h0IGNvcm5lcikKbHAxOCA8LSBscDE4ICU+JSAKICBtdXRhdGUobW9iaWxpdHkxID0gYXMuZmFjdG9yKGZpbmFsID4gMCAmIGluaXRpYWwgPiAwKSkKICAKIyBJZGVudGlmeSBvYnNlcnZhdGlvbiBpbiB0aGUgc2Vjb25kIHF1YWRyYW50IChsb3dlciByaWdodCBjb3JuZXIpCmxwMTggPC0gbHAxOCAlPiUgCiAgbXV0YXRlKG1vYmlsaXR5MiA9IGFzLmZhY3RvcihmaW5hbCA+IDAgJiBpbml0aWFsIDwgMCkpCgojIElkZW50aWZ5IG9ic2VydmF0aW9uIGluIHRoZSB0aGlyZCBxdWFkcmFudCAobG93ZXIgbGVmdCBjb3JuZXIpCmxwMTggPC0gbHAxOCAlPiUgCiAgbXV0YXRlKG1vYmlsaXR5MyA9IGFzLmZhY3RvcihmaW5hbCA8IDAgJiBpbml0aWFsIDwgMCkpCgojIElkZW50aWZ5IG9ic2VydmF0aW9uIGluIHRoZSB0aGlyZCBxdWFkcmFudCAodXBwZXIgbGVmdCBjb3JuZXIpCmxwMTggPC0gbHAxOCAlPiUgCiAgbXV0YXRlKG1vYmlsaXR5NCA9IGFzLmZhY3RvcihmaW5hbCA8IDAgJiBpbml0aWFsID4gMCkpCmBgYAoKCmBgYHtyfQojIFByaW50IHRhYmxlCmxwMTgKYGBgCgpgYGB7ciBmaWcuaGVpZ2h0PTUsIGZpZy53aWR0aD01fQojIENyZWF0ZSBzY2F0dGVycGxvdCAKbHAxOCAlPiUgCmdncGxvdChhZXMoeCA9IGZpbmFsICwgeSA9IGluaXRpYWwsIGNvbG9yID0gbW9iaWxpdHkwLCBzaGFwZSA9IG1vYmlsaXR5KSkgKwogIGdlb21fcG9pbnQoc2l6ZSA9IDQpICsgCiAgIyBBZGQgNDUgZGVncmVlIGxpbmUgYW5kIHJlZmVyZW5jZSBsaW5lcwogIGdlb21fYWJsaW5lKGFlcyhpbnRlcmNlcHQgPSAwLCBzbG9wZSA9IDEpKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0PTAsIGxpbmV0eXBlPSJkYXNoZWQiKSArIAogIGdlb21fdmxpbmUoeGludGVyY2VwdD0wLCBsaW5ldHlwZT0iZGFzaGVkIikgKwogICMgQWRkIGxhYmVscyB0aGF0IGRvIG5vdCBvdmVybGFwCiAgIyBnZW9tX3RleHRfcmVwZWwoYWVzKGxhYmVsID0gaWQpLCBzaXplID0gMykgKwogICMgQ2hhbmdlIGF4aXMgbGltaXRzCiAgeGxpbSgtMywgMykgKyAKICB5bGltKC0zLCAzKSArCiAgIyBDaGFuZ2UgdGhlIHRoZW1lIHRvIHZpcmlkaXMgY29sb3JzIGFuZCBibGFjayBhbmQgd2hpdGUgYmFja2dyb3VuZAogIHNjYWxlX2NvbG9yX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFKSArCiAgdGhlbWVfYncoKSArCiAgIyBDaGFuZ2UgdGhlIGZvbnQgb2YgdGhlIHRoZW1lCiAgdGhlbWUodGV4dD1lbGVtZW50X3RleHQoc2l6ZT0yMCwgZmFtaWx5PSJQYWxhdGlubyIpKSArCiAgIyBIaWRlIHRoZSBsZW5nZWQKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAnbm9uZScpICsKICAjIENoYW5nZSBwbG90IHRpdGxlcwogIGxhYnMoeCA9ICJMb2cgb2YgUmVsYXRpdmUgVEZQIGluIDIwMDkiLAogICAgICAgeSA9ICJMb2cgb2YgUmVsYXRpdmUgVEZQIGluIDIwMDMiKQpgYGAKCmBgYHtyIGZpZy5oZWlnaHQ9NSwgZmlnLndpZHRoPTV9CiMgQ3JlYXRlIHNjYXR0ZXJwbG90IHdpdGggYml2YXJhdGUgZGVuc2l0eQpscDE4ICU+JSAKZ2dwbG90KGFlcyh4ID0gZmluYWwgLCB5ID0gaW5pdGlhbCkpICsKICBzdGF0X2RlbnNpdHlfMmQoYWVzKGZpbGwgPSAuLmxldmVsLi4pLCBnZW9tID0gInBvbHlnb24iKSArCiAgc2NhbGVfZmlsbF9ncmFkaWVudG4oY29sb3JzID0gYygiI0ZGRURBMCIsICIjRkVCMjRDIiwgIiNGMDNCMjAiKSkrCiAgZ2VvbV9wb2ludChzaXplID0gMikgKyAKICAjIEFkZCA0NSBkZWdyZWUgbGluZSBhbmQgcmVmZXJlbmNlIGxpbmVzCiAgZ2VvbV9hYmxpbmUoYWVzKGludGVyY2VwdCA9IDAsIHNsb3BlID0gMSkpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQ9MCwgbGluZXR5cGU9ImRhc2hlZCIpICsgCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0PTAsIGxpbmV0eXBlPSJkYXNoZWQiKSArCiAgIyBBZGQgbGFiZWxzIHRoYXQgZG8gbm90IG92ZXJsYXAKICAjIGdlb21fdGV4dF9yZXBlbChhZXMobGFiZWwgPSBpZCksIHNpemUgPSAzKSArCiAgIyBDaGFuZ2UgYXhpcyBsaW1pdHMKICB4bGltKC0zLCAzKSArIAogIHlsaW0oLTMsIDMpICsKICAjIENoYW5nZSB0aGUgdGhlbWUgdG8gdmlyaWRpcyBjb2xvcnMgYW5kIGJsYWNrIGFuZCB3aGl0ZSBiYWNrZ3JvdW5kCiAgc2NhbGVfY29sb3JfdmlyaWRpcyhkaXNjcmV0ZSA9IFRSVUUpICsKICB0aGVtZV9idygpICsKICAjIENoYW5nZSB0aGUgZm9udCBvZiB0aGUgdGhlbWUKICB0aGVtZSh0ZXh0PWVsZW1lbnRfdGV4dChzaXplPTIwLCBmYW1pbHk9IlBhbGF0aW5vIikpICsKICAjIEhpZGUgdGhlIGxlbmdlZAogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICdub25lJykgKwogICMgQ2hhbmdlIHBsb3QgdGl0bGVzCiAgbGFicyh4ID0gIkxvZyBvZiBSZWxhdGl2ZSBURlAgaW4gMjAwOSIsCiAgICAgICB5ID0gIkxvZyBvZiBSZWxhdGl2ZSBURlAgaW4gMjAwMyIpCmBgYAoKYGBge3J9CiMgRGVzY3JpcHRpdmUgc3RhdGlzdGljcyBmb3IgY29udGludW91cyB2YXJpYWJsZXMKa2FibGUoZGVzY3IobHAxOCkpCmBgYAoKYGBge3J9CiMgRnJlcXVlbmN5IHRhYmxlIGZvciBmb3J3YXJkIGFuZCBiYWNrd2FyZCBtb2JpbGl0eQprYWJsZShmcmVxKGxwMTgkbW9iaWxpdHkwKSkKYGBgCgpgYGB7cn0KIyBGcmVxdWVuY3kgdGFibGUgZm9yIG1vYmlsaXR5IGFjcm9zcyBxdWFkcmFudHMKZnJlcShscDE4JG1vYmlsaXR5KQpgYGAKCgpgYGB7cn0KIyBTaW1wbGUgbW9iaWxpdHkgbWF0cml4CmthYmxlKHdpdGgobHAxOCwgY3RhYmxlKG1vYmlsaXR5MCwgbW9iaWxpdHksIHByb3AgPSAiciIpKSApCmBgYAoKCgoKCiMgU2VjdG9yIElTSUMxOExDLWFjZgoKCiMjIFNpZ21hIGFuZCBCZXRhIENvbnZlcmdlbmNlIEFuYWx5c2lzCgpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQojIERhdGEgaW1wb3J0CmFjZjE4IDwtIHJlYWRfY3N2KCIgSVNJQzE4TEMtYWNmL2lucHV0cy9kYXRhTW9iaWxpdHkuY3N2IikKYWNmMTggPC0gYWNmMTggJT4lIAogIG11dGF0ZShpZCA9IGFzLmZhY3RvcihpZCkpCmBgYAoKYGBge3J9CiMgQ29tcHV0ZSBhdmVyYWdlIGFubnVhbCBncm93dGggcmF0ZXMgKHVzZSBhcHByb3hpbWF0aW9ucykKYWNmMTggPC0gYWNmMTggJT4lIAogIG11dGF0ZShncm93dGgxID0gKChsbl95IC0gbG5feCkvNikqMTAwLAogICAgICAgICBncm93dGgyID0gICgoeS94KV4oMS82KS0xKSoxMDApCmFjZjE4CmBgYAoKCmBgYHtyfQojIERlc2NyaXB0aXZlIHN0YXRpc3RpY3Mgb2YgY29udGlub3VzIHZhcmlhYmxlcwphY2YxOEdyb3d0aCA8LSBhY2YxOCAlPiUgCiAgc2VsZWN0KHgsIHksIGxuX3gsIGxuX3ksIGdyb3d0aDEsIGdyb3d0aDIsIHJfeCwgcl95LCBsbl9yX3gsIGxuX3JfeSkgCgprYWJsZShkZXNjcihhY2YxOEdyb3d0aCkpCgoKYGBgCgoKYGBge3J9CiMgQ3JlYXRlIGxvbmcgcGFuZWwgYW5kIHJlY29kZSB5ZWFyCmFjZjE4UGFuZWwgPC0gYWNmMTggJT4lCiAgZ2F0aGVyKHllYXIsIGxuX3RmcCwgbG5feDpsbl95KQpgYGAKCmBgYHtyfQojIFJlY29kZSB5ZWFyIHZhcmlhYmxlCmFjZjE4UGFuZWwkeWVhciA8LSBmY3RfcmVjb2RlKGFjZjE4UGFuZWwkeWVhciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIyMDAzIiA9ICJsbl94IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIyMDA5IiA9ICJsbl95IikKYGBgCgoKYGBge3IgZmlnLmhlaWdodD0xLjUsIGZpZy53aWR0aD0xfQojIFBsb3QgYmFzaWMgQm94cGxvdAphY2YxOFBhbmVsICU+JSAKICBnZ3Bsb3QoYWVzKHggPSB5ZWFyLCB5ID0gbG5fdGZwLCBmaWxsID0geWVhcikpICsKICBnZW9tX2JveHBsb3Qob3V0bGllci5jb2xvdXI9ImJsYWNrIiwgCiAgICAgICAgICAgICAgIG91dGxpZXIuc2hhcGU9MTYsCiAgICAgICAgICAgICAgIG91dGxpZXIuc2l6ZT0xLAogICAgICAgICAgICAgICBub3RjaD1UUlVFKSArCiAgc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZT0iQmx1ZXMiKSArCiAgdGhlbWVfY2xhc3NpYygpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAnbm9uZScpICsKICB0aGVtZSh0ZXh0PWVsZW1lbnRfdGV4dChzaXplPTEwLCBmYW1pbHk9IlBhbGF0aW5vIikpCmBgYAoKCmBgYHtyIGZpZy5oZWlnaHQ9NCwgZmlnLndpZHRoPTZ9CiMgQmV0YSBjb252ZXJnZW5jZSBzY2F0dGVycGxvdCAKYWNmMThHcm93dGggJT4lIAogIGdncGxvdChhZXMoeCA9IGxuX3gsIHkgPSBncm93dGgxKSkgKwogIGdlb21fcG9pbnQoc2l6ZSA9IDQpICsgCiAgZ2VvbV9zbW9vdGgoc2l6ZSA9IDIpICsKICAjIENoYW5nZSB0aGUgdGhlbWUgdG8gdmlyaWRpcyBjb2xvcnMgYW5kIGJsYWNrIGFuZCB3aGl0ZSBiYWNrZ3JvdW5kCiAgc2NhbGVfY29sb3JfdmlyaWRpcyhkaXNjcmV0ZSA9IFRSVUUpICsKICB0aGVtZV9idygpICsKICAjIENoYW5nZSB0aGUgZm9udCBvZiB0aGUgdGhlbWUKICB0aGVtZSh0ZXh0PWVsZW1lbnRfdGV4dChzaXplPTIwLCBmYW1pbHk9IlBhbGF0aW5vIikpICsKICAjIEhpZGUgdGhlIGxlbmdlZAogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICdub25lJykgKwogICMgQ2hhbmdlIHBsb3QgdGl0bGVzCiAgbGFicyh4ID0gIkxvZyBvZiBURlAgaW4gMjAwMyIsCiAgICAgICB5ID0gIlRGUCBHcm93dGgiKQoKYGBgCgoKIyMgTW9iaWxpdHkgQW5hbHlzaXMKCgpgYGB7cn0KIyBTZWxlY3QgYW5kIHJlbmFtZSB2YXJpYWJsZXMKYWNmMTggPC0gYWNmMTggJT4lIAogIHNlbGVjdChpZCwgbG5fcl94LCBsbl9yX3kpICU+JSAKICByZW5hbWUoaW5pdGlhbCA9IGxuX3JfeCwgZmluYWwgPSBsbl9yX3kpCmBgYAoKCmBgYHtyfQojIElkZW50aWZ5IGZvcndhcmQgYW5kIGJhY2t3YXJkIG1vYmlsaXR5CmFjZjE4IDwtIGFjZjE4ICU+JSAKICBtdXRhdGUobW9iaWxpdHkwID0gYXMuZmFjdG9yKGZpbmFsID4gaW5pdGlhbCkpCmBgYAoKYGBge3J9CiMgSWRlbnRpZnkgbW9iaWxpdHkgYWNyb3NzIHF1YWRyYW50cwphY2YxOCA8LSBhY2YxOCAlPiUgCiAgbXV0YXRlKG1vYmlsaXR5ID0gYXMuZmFjdG9yKGNhc2Vfd2hlbihmaW5hbCA+IDAgJiBpbml0aWFsID4gMCB+IDEsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCA+IDAgJiBpbml0aWFsIDwgMCB+IDIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIDwgMCAmIGluaXRpYWwgPCAwIH4gMywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgPCAwICYgaW5pdGlhbCA+IDAgfiA0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFIH4gMCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKCiMgSWRlbnRpZnkgb2JzZXJ2YXRpb24gaW4gdGhlIGZpcnN0IHF1YWRyYW50ICh1cHBwZXIgcmlnaHQgY29ybmVyKQphY2YxOCA8LSBhY2YxOCAlPiUgCiAgbXV0YXRlKG1vYmlsaXR5MSA9IGFzLmZhY3RvcihmaW5hbCA+IDAgJiBpbml0aWFsID4gMCkpCiAgCiMgSWRlbnRpZnkgb2JzZXJ2YXRpb24gaW4gdGhlIHNlY29uZCBxdWFkcmFudCAobG93ZXIgcmlnaHQgY29ybmVyKQphY2YxOCA8LSBhY2YxOCAlPiUgCiAgbXV0YXRlKG1vYmlsaXR5MiA9IGFzLmZhY3RvcihmaW5hbCA+IDAgJiBpbml0aWFsIDwgMCkpCgojIElkZW50aWZ5IG9ic2VydmF0aW9uIGluIHRoZSB0aGlyZCBxdWFkcmFudCAobG93ZXIgbGVmdCBjb3JuZXIpCmFjZjE4IDwtIGFjZjE4ICU+JSAKICBtdXRhdGUobW9iaWxpdHkzID0gYXMuZmFjdG9yKGZpbmFsIDwgMCAmIGluaXRpYWwgPCAwKSkKCiMgSWRlbnRpZnkgb2JzZXJ2YXRpb24gaW4gdGhlIHRoaXJkIHF1YWRyYW50ICh1cHBlciBsZWZ0IGNvcm5lcikKYWNmMTggPC0gYWNmMTggJT4lIAogIG11dGF0ZShtb2JpbGl0eTQgPSBhcy5mYWN0b3IoZmluYWwgPCAwICYgaW5pdGlhbCA+IDApKQpgYGAKCgpgYGB7cn0KIyBQcmludCB0YWJsZQphY2YxOApgYGAKCmBgYHtyIGZpZy5oZWlnaHQ9NSwgZmlnLndpZHRoPTV9CiMgQ3JlYXRlIHNjYXR0ZXJwbG90IAphY2YxOCAlPiUgCmdncGxvdChhZXMoeCA9IGZpbmFsICwgeSA9IGluaXRpYWwsIGNvbG9yID0gbW9iaWxpdHkwLCBzaGFwZSA9IG1vYmlsaXR5KSkgKwogIGdlb21fcG9pbnQoc2l6ZSA9IDQpICsgCiAgIyBBZGQgNDUgZGVncmVlIGxpbmUgYW5kIHJlZmVyZW5jZSBsaW5lcwogIGdlb21fYWJsaW5lKGFlcyhpbnRlcmNlcHQgPSAwLCBzbG9wZSA9IDEpKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0PTAsIGxpbmV0eXBlPSJkYXNoZWQiKSArIAogIGdlb21fdmxpbmUoeGludGVyY2VwdD0wLCBsaW5ldHlwZT0iZGFzaGVkIikgKwogICMgQWRkIGxhYmVscyB0aGF0IGRvIG5vdCBvdmVybGFwCiAgIyBnZW9tX3RleHRfcmVwZWwoYWVzKGxhYmVsID0gaWQpLCBzaXplID0gMykgKwogICMgQ2hhbmdlIGF4aXMgbGltaXRzCiAgeGxpbSgtMywgMykgKyAKICB5bGltKC0zLCAzKSArCiAgIyBDaGFuZ2UgdGhlIHRoZW1lIHRvIHZpcmlkaXMgY29sb3JzIGFuZCBibGFjayBhbmQgd2hpdGUgYmFja2dyb3VuZAogIHNjYWxlX2NvbG9yX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFKSArCiAgdGhlbWVfYncoKSArCiAgIyBDaGFuZ2UgdGhlIGZvbnQgb2YgdGhlIHRoZW1lCiAgdGhlbWUodGV4dD1lbGVtZW50X3RleHQoc2l6ZT0yMCwgZmFtaWx5PSJQYWxhdGlubyIpKSArCiAgIyBIaWRlIHRoZSBsZW5nZWQKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAnbm9uZScpICsKICAjIENoYW5nZSBwbG90IHRpdGxlcwogIGxhYnMoeCA9ICJMb2cgb2YgUmVsYXRpdmUgVEZQIGluIDIwMDkiLAogICAgICAgeSA9ICJMb2cgb2YgUmVsYXRpdmUgVEZQIGluIDIwMDMiKQpgYGAKCmBgYHtyIGZpZy5oZWlnaHQ9NSwgZmlnLndpZHRoPTV9CiMgQ3JlYXRlIHNjYXR0ZXJwbG90IHdpdGggYml2YXJhdGUgZGVuc2l0eQphY2YxOCAlPiUgCmdncGxvdChhZXMoeCA9IGZpbmFsICwgeSA9IGluaXRpYWwpKSArCiAgc3RhdF9kZW5zaXR5XzJkKGFlcyhmaWxsID0gLi5sZXZlbC4uKSwgZ2VvbSA9ICJwb2x5Z29uIikgKwogIHNjYWxlX2ZpbGxfZ3JhZGllbnRuKGNvbG9ycyA9IGMoIiNGRkVEQTAiLCAiI0ZFQjI0QyIsICIjRjAzQjIwIikpKwogIGdlb21fcG9pbnQoc2l6ZSA9IDIpICsgCiAgIyBBZGQgNDUgZGVncmVlIGxpbmUgYW5kIHJlZmVyZW5jZSBsaW5lcwogIGdlb21fYWJsaW5lKGFlcyhpbnRlcmNlcHQgPSAwLCBzbG9wZSA9IDEpKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0PTAsIGxpbmV0eXBlPSJkYXNoZWQiKSArIAogIGdlb21fdmxpbmUoeGludGVyY2VwdD0wLCBsaW5ldHlwZT0iZGFzaGVkIikgKwogICMgQWRkIGxhYmVscyB0aGF0IGRvIG5vdCBvdmVybGFwCiAgIyBnZW9tX3RleHRfcmVwZWwoYWVzKGxhYmVsID0gaWQpLCBzaXplID0gMykgKwogICMgQ2hhbmdlIGF4aXMgbGltaXRzCiAgeGxpbSgtMywgMykgKyAKICB5bGltKC0zLCAzKSArCiAgIyBDaGFuZ2UgdGhlIHRoZW1lIHRvIHZpcmlkaXMgY29sb3JzIGFuZCBibGFjayBhbmQgd2hpdGUgYmFja2dyb3VuZAogIHNjYWxlX2NvbG9yX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFKSArCiAgdGhlbWVfYncoKSArCiAgIyBDaGFuZ2UgdGhlIGZvbnQgb2YgdGhlIHRoZW1lCiAgdGhlbWUodGV4dD1lbGVtZW50X3RleHQoc2l6ZT0yMCwgZmFtaWx5PSJQYWxhdGlubyIpKSArCiAgIyBIaWRlIHRoZSBsZW5nZWQKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAnbm9uZScpICsKICAjIENoYW5nZSBwbG90IHRpdGxlcwogIGxhYnMoeCA9ICJMb2cgb2YgUmVsYXRpdmUgVEZQIGluIDIwMDkiLAogICAgICAgeSA9ICJMb2cgb2YgUmVsYXRpdmUgVEZQIGluIDIwMDMiKQpgYGAKCmBgYHtyfQojIERlc2NyaXB0aXZlIHN0YXRpc3RpY3MgZm9yIGNvbnRpbnVvdXMgdmFyaWFibGVzCmthYmxlKGRlc2NyKGFjZjE4KSkKYGBgCgpgYGB7cn0KIyBGcmVxdWVuY3kgdGFibGUgZm9yIGZvcndhcmQgYW5kIGJhY2t3YXJkIG1vYmlsaXR5CmthYmxlKGZyZXEoYWNmMTgkbW9iaWxpdHkwKSkKYGBgCgpgYGB7cn0KIyBGcmVxdWVuY3kgdGFibGUgZm9yIG1vYmlsaXR5IGFjcm9zcyBxdWFkcmFudHMKZnJlcShhY2YxOCRtb2JpbGl0eSkKYGBgCgoKYGBge3J9CiMgU2ltcGxlIG1vYmlsaXR5IG1hdHJpeAprYWJsZSh3aXRoKGFjZjE4LCBjdGFibGUobW9iaWxpdHkwLCBtb2JpbGl0eSwgcHJvcCA9ICJyIikpICkKYGBgCgoKCiMgU2VjdG9yIElTSUMzNkxDLXN0Y2gKCgojIyBTaWdtYSBhbmQgQmV0YSBDb252ZXJnZW5jZSBBbmFseXNpcwoKYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KIyBEYXRhIGltcG9ydApzdGNoMzYgPC0gcmVhZF9jc3YoIiBJU0lDMzZMQy1zdGNoL2lucHV0cy9kYXRhTW9iaWxpdHkuY3N2IikKc3RjaDM2IDwtIHN0Y2gzNiAlPiUgCiAgbXV0YXRlKGlkID0gYXMuZmFjdG9yKGlkKSkKYGBgCgpgYGB7cn0KIyBDb21wdXRlIGF2ZXJhZ2UgYW5udWFsIGdyb3d0aCByYXRlcyAodXNlIGFwcHJveGltYXRpb25zKQpzdGNoMzYgPC0gc3RjaDM2ICU+JSAKICBtdXRhdGUoZ3Jvd3RoMSA9ICgobG5feSAtIGxuX3gpLzYpKjEwMCwKICAgICAgICAgZ3Jvd3RoMiA9ICAoKHkveCleKDEvNiktMSkqMTAwKQpzdGNoMzYKYGBgCgoKYGBge3J9CiMgRGVzY3JpcHRpdmUgc3RhdGlzdGljcyBvZiBjb250aW5vdXMgdmFyaWFibGVzCnN0Y2gzNkdyb3d0aCA8LSBzdGNoMzYgJT4lIAogIHNlbGVjdCh4LCB5LCBsbl94LCBsbl95LCBncm93dGgxLCBncm93dGgyLCByX3gsIHJfeSwgbG5fcl94LCBsbl9yX3kpIAoKa2FibGUoZGVzY3Ioc3RjaDM2R3Jvd3RoKSkKCgpgYGAKCgpgYGB7cn0KIyBDcmVhdGUgbG9uZyBwYW5lbCBhbmQgcmVjb2RlIHllYXIKc3RjaDM2UGFuZWwgPC0gc3RjaDM2ICU+JQogIGdhdGhlcih5ZWFyLCBsbl90ZnAsIGxuX3g6bG5feSkKYGBgCgpgYGB7cn0KIyBSZWNvZGUgeWVhciB2YXJpYWJsZQpzdGNoMzZQYW5lbCR5ZWFyIDwtIGZjdF9yZWNvZGUoc3RjaDM2UGFuZWwkeWVhciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIyMDAzIiA9ICJsbl94IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIyMDA5IiA9ICJsbl95IikKYGBgCgoKYGBge3IgZmlnLmhlaWdodD0xLjUsIGZpZy53aWR0aD0xfQojIFBsb3QgYmFzaWMgQm94cGxvdApzdGNoMzZQYW5lbCAlPiUgCiAgZ2dwbG90KGFlcyh4ID0geWVhciwgeSA9IGxuX3RmcCwgZmlsbCA9IHllYXIpKSArCiAgZ2VvbV9ib3hwbG90KG91dGxpZXIuY29sb3VyPSJibGFjayIsIAogICAgICAgICAgICAgICBvdXRsaWVyLnNoYXBlPTE2LAogICAgICAgICAgICAgICBvdXRsaWVyLnNpemU9MSwKICAgICAgICAgICAgICAgbm90Y2g9VFJVRSkgKwogIHNjYWxlX2ZpbGxfYnJld2VyKHBhbGV0dGU9IkJsdWVzIikgKwogIHRoZW1lX2NsYXNzaWMoKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gJ25vbmUnKSArCiAgdGhlbWUodGV4dD1lbGVtZW50X3RleHQoc2l6ZT0xMCwgZmFtaWx5PSJQYWxhdGlubyIpKQpgYGAKCgpgYGB7ciBmaWcuaGVpZ2h0PTQsIGZpZy53aWR0aD02fQojIEJldGEgY29udmVyZ2VuY2Ugc2NhdHRlcnBsb3QgCnN0Y2gzNkdyb3d0aCAlPiUgCiAgZ2dwbG90KGFlcyh4ID0gbG5feCwgeSA9IGdyb3d0aDEpKSArCiAgZ2VvbV9wb2ludChzaXplID0gNCkgKyAKICBnZW9tX3Ntb290aChzaXplID0gMikgKwogICMgQ2hhbmdlIHRoZSB0aGVtZSB0byB2aXJpZGlzIGNvbG9ycyBhbmQgYmxhY2sgYW5kIHdoaXRlIGJhY2tncm91bmQKICBzY2FsZV9jb2xvcl92aXJpZGlzKGRpc2NyZXRlID0gVFJVRSkgKwogIHRoZW1lX2J3KCkgKwogICMgQ2hhbmdlIHRoZSBmb250IG9mIHRoZSB0aGVtZQogIHRoZW1lKHRleHQ9ZWxlbWVudF90ZXh0KHNpemU9MjAsIGZhbWlseT0iUGFsYXRpbm8iKSkgKwogICMgSGlkZSB0aGUgbGVuZ2VkCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gJ25vbmUnKSArCiAgIyBDaGFuZ2UgcGxvdCB0aXRsZXMKICBsYWJzKHggPSAiTG9nIG9mIFRGUCBpbiAyMDAzIiwKICAgICAgIHkgPSAiVEZQIEdyb3d0aCIpCgpgYGAKCgojIyBNb2JpbGl0eSBBbmFseXNpcwoKCmBgYHtyfQojIFNlbGVjdCBhbmQgcmVuYW1lIHZhcmlhYmxlcwpzdGNoMzYgPC0gc3RjaDM2ICU+JSAKICBzZWxlY3QoaWQsIGxuX3JfeCwgbG5fcl95KSAlPiUgCiAgcmVuYW1lKGluaXRpYWwgPSBsbl9yX3gsIGZpbmFsID0gbG5fcl95KQpgYGAKCgpgYGB7cn0KIyBJZGVudGlmeSBmb3J3YXJkIGFuZCBiYWNrd2FyZCBtb2JpbGl0eQpzdGNoMzYgPC0gc3RjaDM2ICU+JSAKICBtdXRhdGUobW9iaWxpdHkwID0gYXMuZmFjdG9yKGZpbmFsID4gaW5pdGlhbCkpCmBgYAoKYGBge3J9CiMgSWRlbnRpZnkgbW9iaWxpdHkgYWNyb3NzIHF1YWRyYW50cwpzdGNoMzYgPC0gc3RjaDM2ICU+JSAKICBtdXRhdGUobW9iaWxpdHkgPSBhcy5mYWN0b3IoY2FzZV93aGVuKGZpbmFsID4gMCAmIGluaXRpYWwgPiAwIH4gMSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsID4gMCAmIGluaXRpYWwgPCAwIH4gMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgPCAwICYgaW5pdGlhbCA8IDAgfiAzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCA8IDAgJiBpbml0aWFsID4gMCB+IDQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiAwKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQoKIyBJZGVudGlmeSBvYnNlcnZhdGlvbiBpbiB0aGUgZmlyc3QgcXVhZHJhbnQgKHVwcHBlciByaWdodCBjb3JuZXIpCnN0Y2gzNiA8LSBzdGNoMzYgJT4lIAogIG11dGF0ZShtb2JpbGl0eTEgPSBhcy5mYWN0b3IoZmluYWwgPiAwICYgaW5pdGlhbCA+IDApKQogIAojIElkZW50aWZ5IG9ic2VydmF0aW9uIGluIHRoZSBzZWNvbmQgcXVhZHJhbnQgKGxvd2VyIHJpZ2h0IGNvcm5lcikKc3RjaDM2IDwtIHN0Y2gzNiAlPiUgCiAgbXV0YXRlKG1vYmlsaXR5MiA9IGFzLmZhY3RvcihmaW5hbCA+IDAgJiBpbml0aWFsIDwgMCkpCgojIElkZW50aWZ5IG9ic2VydmF0aW9uIGluIHRoZSB0aGlyZCBxdWFkcmFudCAobG93ZXIgbGVmdCBjb3JuZXIpCnN0Y2gzNiA8LSBzdGNoMzYgJT4lIAogIG11dGF0ZShtb2JpbGl0eTMgPSBhcy5mYWN0b3IoZmluYWwgPCAwICYgaW5pdGlhbCA8IDApKQoKIyBJZGVudGlmeSBvYnNlcnZhdGlvbiBpbiB0aGUgdGhpcmQgcXVhZHJhbnQgKHVwcGVyIGxlZnQgY29ybmVyKQpzdGNoMzYgPC0gc3RjaDM2ICU+JSAKICBtdXRhdGUobW9iaWxpdHk0ID0gYXMuZmFjdG9yKGZpbmFsIDwgMCAmIGluaXRpYWwgPiAwKSkKYGBgCgoKYGBge3J9CiMgUHJpbnQgdGFibGUKc3RjaDM2CmBgYAoKYGBge3IgZmlnLmhlaWdodD01LCBmaWcud2lkdGg9NX0KIyBDcmVhdGUgc2NhdHRlcnBsb3QgCnN0Y2gzNiAlPiUgCmdncGxvdChhZXMoeCA9IGZpbmFsICwgeSA9IGluaXRpYWwsIGNvbG9yID0gbW9iaWxpdHkwLCBzaGFwZSA9IG1vYmlsaXR5KSkgKwogIGdlb21fcG9pbnQoc2l6ZSA9IDQpICsgCiAgIyBBZGQgNDUgZGVncmVlIGxpbmUgYW5kIHJlZmVyZW5jZSBsaW5lcwogIGdlb21fYWJsaW5lKGFlcyhpbnRlcmNlcHQgPSAwLCBzbG9wZSA9IDEpKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0PTAsIGxpbmV0eXBlPSJkYXNoZWQiKSArIAogIGdlb21fdmxpbmUoeGludGVyY2VwdD0wLCBsaW5ldHlwZT0iZGFzaGVkIikgKwogICMgQWRkIGxhYmVscyB0aGF0IGRvIG5vdCBvdmVybGFwCiAgIyBnZW9tX3RleHRfcmVwZWwoYWVzKGxhYmVsID0gaWQpLCBzaXplID0gMykgKwogICMgQ2hhbmdlIGF4aXMgbGltaXRzCiAgeGxpbSgtMywgMykgKyAKICB5bGltKC0zLCAzKSArCiAgIyBDaGFuZ2UgdGhlIHRoZW1lIHRvIHZpcmlkaXMgY29sb3JzIGFuZCBibGFjayBhbmQgd2hpdGUgYmFja2dyb3VuZAogIHNjYWxlX2NvbG9yX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFKSArCiAgdGhlbWVfYncoKSArCiAgIyBDaGFuZ2UgdGhlIGZvbnQgb2YgdGhlIHRoZW1lCiAgdGhlbWUodGV4dD1lbGVtZW50X3RleHQoc2l6ZT0yMCwgZmFtaWx5PSJQYWxhdGlubyIpKSArCiAgIyBIaWRlIHRoZSBsZW5nZWQKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAnbm9uZScpICsKICAjIENoYW5nZSBwbG90IHRpdGxlcwogIGxhYnMoeCA9ICJMb2cgb2YgUmVsYXRpdmUgVEZQIGluIDIwMDkiLAogICAgICAgeSA9ICJMb2cgb2YgUmVsYXRpdmUgVEZQIGluIDIwMDMiKQpgYGAKCmBgYHtyIGZpZy5oZWlnaHQ9NSwgZmlnLndpZHRoPTV9CiMgQ3JlYXRlIHNjYXR0ZXJwbG90IHdpdGggYml2YXJhdGUgZGVuc2l0eQpzdGNoMzYgJT4lIApnZ3Bsb3QoYWVzKHggPSBmaW5hbCAsIHkgPSBpbml0aWFsKSkgKwogIHN0YXRfZGVuc2l0eV8yZChhZXMoZmlsbCA9IC4ubGV2ZWwuLiksIGdlb20gPSAicG9seWdvbiIpICsKICBzY2FsZV9maWxsX2dyYWRpZW50bihjb2xvcnMgPSBjKCIjRkZFREEwIiwgIiNGRUIyNEMiLCAiI0YwM0IyMCIpKSsKICBnZW9tX3BvaW50KHNpemUgPSAyKSArIAogICMgQWRkIDQ1IGRlZ3JlZSBsaW5lIGFuZCByZWZlcmVuY2UgbGluZXMKICBnZW9tX2FibGluZShhZXMoaW50ZXJjZXB0ID0gMCwgc2xvcGUgPSAxKSkgKwogIGdlb21faGxpbmUoeWludGVyY2VwdD0wLCBsaW5ldHlwZT0iZGFzaGVkIikgKyAKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQ9MCwgbGluZXR5cGU9ImRhc2hlZCIpICsKICAjIEFkZCBsYWJlbHMgdGhhdCBkbyBub3Qgb3ZlcmxhcAogICMgZ2VvbV90ZXh0X3JlcGVsKGFlcyhsYWJlbCA9IGlkKSwgc2l6ZSA9IDMpICsKICAjIENoYW5nZSBheGlzIGxpbWl0cwogIHhsaW0oLTMsIDMpICsgCiAgeWxpbSgtMywgMykgKwogICMgQ2hhbmdlIHRoZSB0aGVtZSB0byB2aXJpZGlzIGNvbG9ycyBhbmQgYmxhY2sgYW5kIHdoaXRlIGJhY2tncm91bmQKICBzY2FsZV9jb2xvcl92aXJpZGlzKGRpc2NyZXRlID0gVFJVRSkgKwogIHRoZW1lX2J3KCkgKwogICMgQ2hhbmdlIHRoZSBmb250IG9mIHRoZSB0aGVtZQogIHRoZW1lKHRleHQ9ZWxlbWVudF90ZXh0KHNpemU9MjAsIGZhbWlseT0iUGFsYXRpbm8iKSkgKwogICMgSGlkZSB0aGUgbGVuZ2VkCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gJ25vbmUnKSArCiAgIyBDaGFuZ2UgcGxvdCB0aXRsZXMKICBsYWJzKHggPSAiTG9nIG9mIFJlbGF0aXZlIFRGUCBpbiAyMDA5IiwKICAgICAgIHkgPSAiTG9nIG9mIFJlbGF0aXZlIFRGUCBpbiAyMDAzIikKYGBgCgpgYGB7cn0KIyBEZXNjcmlwdGl2ZSBzdGF0aXN0aWNzIGZvciBjb250aW51b3VzIHZhcmlhYmxlcwprYWJsZShkZXNjcihzdGNoMzYpKQpgYGAKCmBgYHtyfQojIEZyZXF1ZW5jeSB0YWJsZSBmb3IgZm9yd2FyZCBhbmQgYmFja3dhcmQgbW9iaWxpdHkKa2FibGUoZnJlcShzdGNoMzYkbW9iaWxpdHkwKSkKYGBgCgpgYGB7cn0KIyBGcmVxdWVuY3kgdGFibGUgZm9yIG1vYmlsaXR5IGFjcm9zcyBxdWFkcmFudHMKZnJlcShzdGNoMzYkbW9iaWxpdHkpCmBgYAoKCmBgYHtyfQojIFNpbXBsZSBtb2JpbGl0eSBtYXRyaXgKa2FibGUod2l0aChzdGNoMzYsIGN0YWJsZShtb2JpbGl0eTAsIG1vYmlsaXR5LCBwcm9wID0gInIiKSkgKQpgYGAKCgoKCiMgU2VjdG9yIElTSUMzNkxDLWxwCgoKIyMgU2lnbWEgYW5kIEJldGEgQ29udmVyZ2VuY2UgQW5hbHlzaXMKCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CiMgRGF0YSBpbXBvcnQKbHAzNiA8LSByZWFkX2NzdigiIElTSUMzNkxDLWxwL2lucHV0cy9kYXRhTW9iaWxpdHkuY3N2IikKbHAzNiA8LSBscDM2ICU+JSAKICBtdXRhdGUoaWQgPSBhcy5mYWN0b3IoaWQpKQpgYGAKCmBgYHtyfQojIENvbXB1dGUgYXZlcmFnZSBhbm51YWwgZ3Jvd3RoIHJhdGVzICh1c2UgYXBwcm94aW1hdGlvbnMpCmxwMzYgPC0gbHAzNiAlPiUgCiAgbXV0YXRlKGdyb3d0aDEgPSAoKGxuX3kgLSBsbl94KS82KSoxMDAsCiAgICAgICAgIGdyb3d0aDIgPSAgKCh5L3gpXigxLzYpLTEpKjEwMCkKbHAzNgpgYGAKCgpgYGB7cn0KIyBEZXNjcmlwdGl2ZSBzdGF0aXN0aWNzIG9mIGNvbnRpbm91cyB2YXJpYWJsZXMKbHAzNkdyb3d0aCA8LSBscDM2ICU+JSAKICBzZWxlY3QoeCwgeSwgbG5feCwgbG5feSwgZ3Jvd3RoMSwgZ3Jvd3RoMiwgcl94LCByX3ksIGxuX3JfeCwgbG5fcl95KSAKCmthYmxlKGRlc2NyKGxwMzZHcm93dGgpKQoKCmBgYAoKCmBgYHtyfQojIENyZWF0ZSBsb25nIHBhbmVsIGFuZCByZWNvZGUgeWVhcgpscDM2UGFuZWwgPC0gbHAzNiAlPiUKICBnYXRoZXIoeWVhciwgbG5fdGZwLCBsbl94OmxuX3kpCmBgYAoKYGBge3J9CiMgUmVjb2RlIHllYXIgdmFyaWFibGUKbHAzNlBhbmVsJHllYXIgPC0gZmN0X3JlY29kZShscDM2UGFuZWwkeWVhciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIyMDAzIiA9ICJsbl94IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIyMDA5IiA9ICJsbl95IikKYGBgCgoKYGBge3IgZmlnLmhlaWdodD0xLjUsIGZpZy53aWR0aD0xfQojIFBsb3QgYmFzaWMgQm94cGxvdApscDM2UGFuZWwgJT4lIAogIGdncGxvdChhZXMoeCA9IHllYXIsIHkgPSBsbl90ZnAsIGZpbGwgPSB5ZWFyKSkgKwogIGdlb21fYm94cGxvdChvdXRsaWVyLmNvbG91cj0iYmxhY2siLCAKICAgICAgICAgICAgICAgb3V0bGllci5zaGFwZT0xNiwKICAgICAgICAgICAgICAgb3V0bGllci5zaXplPTEsCiAgICAgICAgICAgICAgIG5vdGNoPVRSVUUpICsKICBzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlPSJCbHVlcyIpICsKICB0aGVtZV9jbGFzc2ljKCkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICdub25lJykgKwogIHRoZW1lKHRleHQ9ZWxlbWVudF90ZXh0KHNpemU9MTAsIGZhbWlseT0iUGFsYXRpbm8iKSkKYGBgCgoKYGBge3IgZmlnLmhlaWdodD00LCBmaWcud2lkdGg9Nn0KIyBCZXRhIGNvbnZlcmdlbmNlIHNjYXR0ZXJwbG90IApscDM2R3Jvd3RoICU+JSAKICBnZ3Bsb3QoYWVzKHggPSBsbl94LCB5ID0gZ3Jvd3RoMSkpICsKICBnZW9tX3BvaW50KHNpemUgPSA0KSArIAogIGdlb21fc21vb3RoKHNpemUgPSAyKSArCiAgIyBDaGFuZ2UgdGhlIHRoZW1lIHRvIHZpcmlkaXMgY29sb3JzIGFuZCBibGFjayBhbmQgd2hpdGUgYmFja2dyb3VuZAogIHNjYWxlX2NvbG9yX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFKSArCiAgdGhlbWVfYncoKSArCiAgIyBDaGFuZ2UgdGhlIGZvbnQgb2YgdGhlIHRoZW1lCiAgdGhlbWUodGV4dD1lbGVtZW50X3RleHQoc2l6ZT0yMCwgZmFtaWx5PSJQYWxhdGlubyIpKSArCiAgIyBIaWRlIHRoZSBsZW5nZWQKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAnbm9uZScpICsKICAjIENoYW5nZSBwbG90IHRpdGxlcwogIGxhYnMoeCA9ICJMb2cgb2YgVEZQIGluIDIwMDMiLAogICAgICAgeSA9ICJURlAgR3Jvd3RoIikKCmBgYAoKCiMjIE1vYmlsaXR5IEFuYWx5c2lzCgoKYGBge3J9CiMgU2VsZWN0IGFuZCByZW5hbWUgdmFyaWFibGVzCmxwMzYgPC0gbHAzNiAlPiUgCiAgc2VsZWN0KGlkLCBsbl9yX3gsIGxuX3JfeSkgJT4lIAogIHJlbmFtZShpbml0aWFsID0gbG5fcl94LCBmaW5hbCA9IGxuX3JfeSkKYGBgCgoKYGBge3J9CiMgSWRlbnRpZnkgZm9yd2FyZCBhbmQgYmFja3dhcmQgbW9iaWxpdHkKbHAzNiA8LSBscDM2ICU+JSAKICBtdXRhdGUobW9iaWxpdHkwID0gYXMuZmFjdG9yKGZpbmFsID4gaW5pdGlhbCkpCmBgYAoKYGBge3J9CiMgSWRlbnRpZnkgbW9iaWxpdHkgYWNyb3NzIHF1YWRyYW50cwpscDM2IDwtIGxwMzYgJT4lIAogIG11dGF0ZShtb2JpbGl0eSA9IGFzLmZhY3RvcihjYXNlX3doZW4oZmluYWwgPiAwICYgaW5pdGlhbCA+IDAgfiAxLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgPiAwICYgaW5pdGlhbCA8IDAgfiAyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCA8IDAgJiBpbml0aWFsIDwgMCB+IDMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIDwgMCAmIGluaXRpYWwgPiAwIH4gNCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSB+IDApKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCgojIElkZW50aWZ5IG9ic2VydmF0aW9uIGluIHRoZSBmaXJzdCBxdWFkcmFudCAodXBwcGVyIHJpZ2h0IGNvcm5lcikKbHAzNiA8LSBscDM2ICU+JSAKICBtdXRhdGUobW9iaWxpdHkxID0gYXMuZmFjdG9yKGZpbmFsID4gMCAmIGluaXRpYWwgPiAwKSkKICAKIyBJZGVudGlmeSBvYnNlcnZhdGlvbiBpbiB0aGUgc2Vjb25kIHF1YWRyYW50IChsb3dlciByaWdodCBjb3JuZXIpCmxwMzYgPC0gbHAzNiAlPiUgCiAgbXV0YXRlKG1vYmlsaXR5MiA9IGFzLmZhY3RvcihmaW5hbCA+IDAgJiBpbml0aWFsIDwgMCkpCgojIElkZW50aWZ5IG9ic2VydmF0aW9uIGluIHRoZSB0aGlyZCBxdWFkcmFudCAobG93ZXIgbGVmdCBjb3JuZXIpCmxwMzYgPC0gbHAzNiAlPiUgCiAgbXV0YXRlKG1vYmlsaXR5MyA9IGFzLmZhY3RvcihmaW5hbCA8IDAgJiBpbml0aWFsIDwgMCkpCgojIElkZW50aWZ5IG9ic2VydmF0aW9uIGluIHRoZSB0aGlyZCBxdWFkcmFudCAodXBwZXIgbGVmdCBjb3JuZXIpCmxwMzYgPC0gbHAzNiAlPiUgCiAgbXV0YXRlKG1vYmlsaXR5NCA9IGFzLmZhY3RvcihmaW5hbCA8IDAgJiBpbml0aWFsID4gMCkpCmBgYAoKCmBgYHtyfQojIFByaW50IHRhYmxlCmxwMzYKYGBgCgpgYGB7ciBmaWcuaGVpZ2h0PTUsIGZpZy53aWR0aD01fQojIENyZWF0ZSBzY2F0dGVycGxvdCAKbHAzNiAlPiUgCmdncGxvdChhZXMoeCA9IGZpbmFsICwgeSA9IGluaXRpYWwsIGNvbG9yID0gbW9iaWxpdHkwLCBzaGFwZSA9IG1vYmlsaXR5KSkgKwogIGdlb21fcG9pbnQoc2l6ZSA9IDQpICsgCiAgIyBBZGQgNDUgZGVncmVlIGxpbmUgYW5kIHJlZmVyZW5jZSBsaW5lcwogIGdlb21fYWJsaW5lKGFlcyhpbnRlcmNlcHQgPSAwLCBzbG9wZSA9IDEpKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0PTAsIGxpbmV0eXBlPSJkYXNoZWQiKSArIAogIGdlb21fdmxpbmUoeGludGVyY2VwdD0wLCBsaW5ldHlwZT0iZGFzaGVkIikgKwogICMgQWRkIGxhYmVscyB0aGF0IGRvIG5vdCBvdmVybGFwCiAgIyBnZW9tX3RleHRfcmVwZWwoYWVzKGxhYmVsID0gaWQpLCBzaXplID0gMykgKwogICMgQ2hhbmdlIGF4aXMgbGltaXRzCiAgeGxpbSgtMywgMykgKyAKICB5bGltKC0zLCAzKSArCiAgIyBDaGFuZ2UgdGhlIHRoZW1lIHRvIHZpcmlkaXMgY29sb3JzIGFuZCBibGFjayBhbmQgd2hpdGUgYmFja2dyb3VuZAogIHNjYWxlX2NvbG9yX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFKSArCiAgdGhlbWVfYncoKSArCiAgIyBDaGFuZ2UgdGhlIGZvbnQgb2YgdGhlIHRoZW1lCiAgdGhlbWUodGV4dD1lbGVtZW50X3RleHQoc2l6ZT0yMCwgZmFtaWx5PSJQYWxhdGlubyIpKSArCiAgIyBIaWRlIHRoZSBsZW5nZWQKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAnbm9uZScpICsKICAjIENoYW5nZSBwbG90IHRpdGxlcwogIGxhYnMoeCA9ICJMb2cgb2YgUmVsYXRpdmUgVEZQIGluIDIwMDkiLAogICAgICAgeSA9ICJMb2cgb2YgUmVsYXRpdmUgVEZQIGluIDIwMDMiKQpgYGAKCmBgYHtyIGZpZy5oZWlnaHQ9NSwgZmlnLndpZHRoPTV9CiMgQ3JlYXRlIHNjYXR0ZXJwbG90IHdpdGggYml2YXJhdGUgZGVuc2l0eQpscDM2ICU+JSAKZ2dwbG90KGFlcyh4ID0gZmluYWwgLCB5ID0gaW5pdGlhbCkpICsKICBzdGF0X2RlbnNpdHlfMmQoYWVzKGZpbGwgPSAuLmxldmVsLi4pLCBnZW9tID0gInBvbHlnb24iKSArCiAgc2NhbGVfZmlsbF9ncmFkaWVudG4oY29sb3JzID0gYygiI0ZGRURBMCIsICIjRkVCMjRDIiwgIiNGMDNCMjAiKSkrCiAgZ2VvbV9wb2ludChzaXplID0gMikgKyAKICAjIEFkZCA0NSBkZWdyZWUgbGluZSBhbmQgcmVmZXJlbmNlIGxpbmVzCiAgZ2VvbV9hYmxpbmUoYWVzKGludGVyY2VwdCA9IDAsIHNsb3BlID0gMSkpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQ9MCwgbGluZXR5cGU9ImRhc2hlZCIpICsgCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0PTAsIGxpbmV0eXBlPSJkYXNoZWQiKSArCiAgIyBBZGQgbGFiZWxzIHRoYXQgZG8gbm90IG92ZXJsYXAKICAjIGdlb21fdGV4dF9yZXBlbChhZXMobGFiZWwgPSBpZCksIHNpemUgPSAzKSArCiAgIyBDaGFuZ2UgYXhpcyBsaW1pdHMKICB4bGltKC0zLCAzKSArIAogIHlsaW0oLTMsIDMpICsKICAjIENoYW5nZSB0aGUgdGhlbWUgdG8gdmlyaWRpcyBjb2xvcnMgYW5kIGJsYWNrIGFuZCB3aGl0ZSBiYWNrZ3JvdW5kCiAgc2NhbGVfY29sb3JfdmlyaWRpcyhkaXNjcmV0ZSA9IFRSVUUpICsKICB0aGVtZV9idygpICsKICAjIENoYW5nZSB0aGUgZm9udCBvZiB0aGUgdGhlbWUKICB0aGVtZSh0ZXh0PWVsZW1lbnRfdGV4dChzaXplPTIwLCBmYW1pbHk9IlBhbGF0aW5vIikpICsKICAjIEhpZGUgdGhlIGxlbmdlZAogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICdub25lJykgKwogICMgQ2hhbmdlIHBsb3QgdGl0bGVzCiAgbGFicyh4ID0gIkxvZyBvZiBSZWxhdGl2ZSBURlAgaW4gMjAwOSIsCiAgICAgICB5ID0gIkxvZyBvZiBSZWxhdGl2ZSBURlAgaW4gMjAwMyIpCmBgYAoKYGBge3J9CiMgRGVzY3JpcHRpdmUgc3RhdGlzdGljcyBmb3IgY29udGludW91cyB2YXJpYWJsZXMKa2FibGUoZGVzY3IobHAzNikpCmBgYAoKYGBge3J9CiMgRnJlcXVlbmN5IHRhYmxlIGZvciBmb3J3YXJkIGFuZCBiYWNrd2FyZCBtb2JpbGl0eQprYWJsZShmcmVxKGxwMzYkbW9iaWxpdHkwKSkKYGBgCgpgYGB7cn0KIyBGcmVxdWVuY3kgdGFibGUgZm9yIG1vYmlsaXR5IGFjcm9zcyBxdWFkcmFudHMKZnJlcShscDM2JG1vYmlsaXR5KQpgYGAKCgpgYGB7cn0KIyBTaW1wbGUgbW9iaWxpdHkgbWF0cml4CmthYmxlKHdpdGgobHAzNiwgY3RhYmxlKG1vYmlsaXR5MCwgbW9iaWxpdHksIHByb3AgPSAiciIpKSApCmBgYAoKCgoKIyBTZWN0b3IgSVNJQzM2TEMtYWNmCgoKIyMgU2lnbWEgYW5kIEJldGEgQ29udmVyZ2VuY2UgQW5hbHlzaXMKCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CiMgRGF0YSBpbXBvcnQKYWNmMzYgPC0gcmVhZF9jc3YoIiBJU0lDMzZMQy1hY2YvaW5wdXRzL2RhdGFNb2JpbGl0eS5jc3YiKQphY2YzNiA8LSBhY2YzNiAlPiUgCiAgbXV0YXRlKGlkID0gYXMuZmFjdG9yKGlkKSkKYGBgCgpgYGB7cn0KIyBDb21wdXRlIGF2ZXJhZ2UgYW5udWFsIGdyb3d0aCByYXRlcyAodXNlIGFwcHJveGltYXRpb25zKQphY2YzNiA8LSBhY2YzNiAlPiUgCiAgbXV0YXRlKGdyb3d0aDEgPSAoKGxuX3kgLSBsbl94KS82KSoxMDAsCiAgICAgICAgIGdyb3d0aDIgPSAgKCh5L3gpXigxLzYpLTEpKjEwMCkKYWNmMzYKYGBgCgoKYGBge3J9CiMgRGVzY3JpcHRpdmUgc3RhdGlzdGljcyBvZiBjb250aW5vdXMgdmFyaWFibGVzCmFjZjM2R3Jvd3RoIDwtIGFjZjM2ICU+JSAKICBzZWxlY3QoeCwgeSwgbG5feCwgbG5feSwgZ3Jvd3RoMSwgZ3Jvd3RoMiwgcl94LCByX3ksIGxuX3JfeCwgbG5fcl95KSAKCmthYmxlKGRlc2NyKGFjZjM2R3Jvd3RoKSkKCgpgYGAKCgpgYGB7cn0KIyBDcmVhdGUgbG9uZyBwYW5lbCBhbmQgcmVjb2RlIHllYXIKYWNmMzZQYW5lbCA8LSBhY2YzNiAlPiUKICBnYXRoZXIoeWVhciwgbG5fdGZwLCBsbl94OmxuX3kpCmBgYAoKYGBge3J9CiMgUmVjb2RlIHllYXIgdmFyaWFibGUKYWNmMzZQYW5lbCR5ZWFyIDwtIGZjdF9yZWNvZGUoYWNmMzZQYW5lbCR5ZWFyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjIwMDMiID0gImxuX3giLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjIwMDkiID0gImxuX3kiKQpgYGAKCgpgYGB7ciBmaWcuaGVpZ2h0PTEuNSwgZmlnLndpZHRoPTF9CiMgUGxvdCBiYXNpYyBCb3hwbG90CmFjZjM2UGFuZWwgJT4lIAogIGdncGxvdChhZXMoeCA9IHllYXIsIHkgPSBsbl90ZnAsIGZpbGwgPSB5ZWFyKSkgKwogIGdlb21fYm94cGxvdChvdXRsaWVyLmNvbG91cj0iYmxhY2siLCAKICAgICAgICAgICAgICAgb3V0bGllci5zaGFwZT0xNiwKICAgICAgICAgICAgICAgb3V0bGllci5zaXplPTEsCiAgICAgICAgICAgICAgIG5vdGNoPVRSVUUpICsKICBzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlPSJCbHVlcyIpICsKICB0aGVtZV9jbGFzc2ljKCkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICdub25lJykgKwogIHRoZW1lKHRleHQ9ZWxlbWVudF90ZXh0KHNpemU9MTAsIGZhbWlseT0iUGFsYXRpbm8iKSkKYGBgCgoKYGBge3IgZmlnLmhlaWdodD00LCBmaWcud2lkdGg9Nn0KIyBCZXRhIGNvbnZlcmdlbmNlIHNjYXR0ZXJwbG90IAphY2YzNkdyb3d0aCAlPiUgCiAgZ2dwbG90KGFlcyh4ID0gbG5feCwgeSA9IGdyb3d0aDEpKSArCiAgZ2VvbV9wb2ludChzaXplID0gNCkgKyAKICBnZW9tX3Ntb290aChzaXplID0gMikgKwogICMgQ2hhbmdlIHRoZSB0aGVtZSB0byB2aXJpZGlzIGNvbG9ycyBhbmQgYmxhY2sgYW5kIHdoaXRlIGJhY2tncm91bmQKICBzY2FsZV9jb2xvcl92aXJpZGlzKGRpc2NyZXRlID0gVFJVRSkgKwogIHRoZW1lX2J3KCkgKwogICMgQ2hhbmdlIHRoZSBmb250IG9mIHRoZSB0aGVtZQogIHRoZW1lKHRleHQ9ZWxlbWVudF90ZXh0KHNpemU9MjAsIGZhbWlseT0iUGFsYXRpbm8iKSkgKwogICMgSGlkZSB0aGUgbGVuZ2VkCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gJ25vbmUnKSArCiAgIyBDaGFuZ2UgcGxvdCB0aXRsZXMKICBsYWJzKHggPSAiTG9nIG9mIFRGUCBpbiAyMDAzIiwKICAgICAgIHkgPSAiVEZQIEdyb3d0aCIpCgpgYGAKCgojIyBNb2JpbGl0eSBBbmFseXNpcwoKCmBgYHtyfQojIFNlbGVjdCBhbmQgcmVuYW1lIHZhcmlhYmxlcwphY2YzNiA8LSBhY2YzNiAlPiUgCiAgc2VsZWN0KGlkLCBsbl9yX3gsIGxuX3JfeSkgJT4lIAogIHJlbmFtZShpbml0aWFsID0gbG5fcl94LCBmaW5hbCA9IGxuX3JfeSkKYGBgCgoKYGBge3J9CiMgSWRlbnRpZnkgZm9yd2FyZCBhbmQgYmFja3dhcmQgbW9iaWxpdHkKYWNmMzYgPC0gYWNmMzYgJT4lIAogIG11dGF0ZShtb2JpbGl0eTAgPSBhcy5mYWN0b3IoZmluYWwgPiBpbml0aWFsKSkKYGBgCgpgYGB7cn0KIyBJZGVudGlmeSBtb2JpbGl0eSBhY3Jvc3MgcXVhZHJhbnRzCmFjZjM2IDwtIGFjZjM2ICU+JSAKICBtdXRhdGUobW9iaWxpdHkgPSBhcy5mYWN0b3IoY2FzZV93aGVuKGZpbmFsID4gMCAmIGluaXRpYWwgPiAwIH4gMSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsID4gMCAmIGluaXRpYWwgPCAwIH4gMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgPCAwICYgaW5pdGlhbCA8IDAgfiAzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCA8IDAgJiBpbml0aWFsID4gMCB+IDQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiAwKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQoKIyBJZGVudGlmeSBvYnNlcnZhdGlvbiBpbiB0aGUgZmlyc3QgcXVhZHJhbnQgKHVwcHBlciByaWdodCBjb3JuZXIpCmFjZjM2IDwtIGFjZjM2ICU+JSAKICBtdXRhdGUobW9iaWxpdHkxID0gYXMuZmFjdG9yKGZpbmFsID4gMCAmIGluaXRpYWwgPiAwKSkKICAKIyBJZGVudGlmeSBvYnNlcnZhdGlvbiBpbiB0aGUgc2Vjb25kIHF1YWRyYW50IChsb3dlciByaWdodCBjb3JuZXIpCmFjZjM2IDwtIGFjZjM2ICU+JSAKICBtdXRhdGUobW9iaWxpdHkyID0gYXMuZmFjdG9yKGZpbmFsID4gMCAmIGluaXRpYWwgPCAwKSkKCiMgSWRlbnRpZnkgb2JzZXJ2YXRpb24gaW4gdGhlIHRoaXJkIHF1YWRyYW50IChsb3dlciBsZWZ0IGNvcm5lcikKYWNmMzYgPC0gYWNmMzYgJT4lIAogIG11dGF0ZShtb2JpbGl0eTMgPSBhcy5mYWN0b3IoZmluYWwgPCAwICYgaW5pdGlhbCA8IDApKQoKIyBJZGVudGlmeSBvYnNlcnZhdGlvbiBpbiB0aGUgdGhpcmQgcXVhZHJhbnQgKHVwcGVyIGxlZnQgY29ybmVyKQphY2YzNiA8LSBhY2YzNiAlPiUgCiAgbXV0YXRlKG1vYmlsaXR5NCA9IGFzLmZhY3RvcihmaW5hbCA8IDAgJiBpbml0aWFsID4gMCkpCmBgYAoKCmBgYHtyfQojIFByaW50IHRhYmxlCmFjZjM2CmBgYAoKYGBge3IgZmlnLmhlaWdodD01LCBmaWcud2lkdGg9NX0KIyBDcmVhdGUgc2NhdHRlcnBsb3QgCmFjZjM2ICU+JSAKZ2dwbG90KGFlcyh4ID0gZmluYWwgLCB5ID0gaW5pdGlhbCwgY29sb3IgPSBtb2JpbGl0eTAsIHNoYXBlID0gbW9iaWxpdHkpKSArCiAgZ2VvbV9wb2ludChzaXplID0gNCkgKyAKICAjIEFkZCA0NSBkZWdyZWUgbGluZSBhbmQgcmVmZXJlbmNlIGxpbmVzCiAgZ2VvbV9hYmxpbmUoYWVzKGludGVyY2VwdCA9IDAsIHNsb3BlID0gMSkpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQ9MCwgbGluZXR5cGU9ImRhc2hlZCIpICsgCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0PTAsIGxpbmV0eXBlPSJkYXNoZWQiKSArCiAgIyBBZGQgbGFiZWxzIHRoYXQgZG8gbm90IG92ZXJsYXAKICAjIGdlb21fdGV4dF9yZXBlbChhZXMobGFiZWwgPSBpZCksIHNpemUgPSAzKSArCiAgIyBDaGFuZ2UgYXhpcyBsaW1pdHMKICB4bGltKC0zLCAzKSArIAogIHlsaW0oLTMsIDMpICsKICAjIENoYW5nZSB0aGUgdGhlbWUgdG8gdmlyaWRpcyBjb2xvcnMgYW5kIGJsYWNrIGFuZCB3aGl0ZSBiYWNrZ3JvdW5kCiAgc2NhbGVfY29sb3JfdmlyaWRpcyhkaXNjcmV0ZSA9IFRSVUUpICsKICB0aGVtZV9idygpICsKICAjIENoYW5nZSB0aGUgZm9udCBvZiB0aGUgdGhlbWUKICB0aGVtZSh0ZXh0PWVsZW1lbnRfdGV4dChzaXplPTIwLCBmYW1pbHk9IlBhbGF0aW5vIikpICsKICAjIEhpZGUgdGhlIGxlbmdlZAogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICdub25lJykgKwogICMgQ2hhbmdlIHBsb3QgdGl0bGVzCiAgbGFicyh4ID0gIkxvZyBvZiBSZWxhdGl2ZSBURlAgaW4gMjAwOSIsCiAgICAgICB5ID0gIkxvZyBvZiBSZWxhdGl2ZSBURlAgaW4gMjAwMyIpCmBgYAoKYGBge3IgZmlnLmhlaWdodD01LCBmaWcud2lkdGg9NX0KIyBDcmVhdGUgc2NhdHRlcnBsb3Qgd2l0aCBiaXZhcmF0ZSBkZW5zaXR5CmFjZjM2ICU+JSAKZ2dwbG90KGFlcyh4ID0gZmluYWwgLCB5ID0gaW5pdGlhbCkpICsKICBzdGF0X2RlbnNpdHlfMmQoYWVzKGZpbGwgPSAuLmxldmVsLi4pLCBnZW9tID0gInBvbHlnb24iKSArCiAgc2NhbGVfZmlsbF9ncmFkaWVudG4oY29sb3JzID0gYygiI0ZGRURBMCIsICIjRkVCMjRDIiwgIiNGMDNCMjAiKSkrCiAgZ2VvbV9wb2ludChzaXplID0gMikgKyAKICAjIEFkZCA0NSBkZWdyZWUgbGluZSBhbmQgcmVmZXJlbmNlIGxpbmVzCiAgZ2VvbV9hYmxpbmUoYWVzKGludGVyY2VwdCA9IDAsIHNsb3BlID0gMSkpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQ9MCwgbGluZXR5cGU9ImRhc2hlZCIpICsgCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0PTAsIGxpbmV0eXBlPSJkYXNoZWQiKSArCiAgIyBBZGQgbGFiZWxzIHRoYXQgZG8gbm90IG92ZXJsYXAKICAjIGdlb21fdGV4dF9yZXBlbChhZXMobGFiZWwgPSBpZCksIHNpemUgPSAzKSArCiAgIyBDaGFuZ2UgYXhpcyBsaW1pdHMKICB4bGltKC0zLCAzKSArIAogIHlsaW0oLTMsIDMpICsKICAjIENoYW5nZSB0aGUgdGhlbWUgdG8gdmlyaWRpcyBjb2xvcnMgYW5kIGJsYWNrIGFuZCB3aGl0ZSBiYWNrZ3JvdW5kCiAgc2NhbGVfY29sb3JfdmlyaWRpcyhkaXNjcmV0ZSA9IFRSVUUpICsKICB0aGVtZV9idygpICsKICAjIENoYW5nZSB0aGUgZm9udCBvZiB0aGUgdGhlbWUKICB0aGVtZSh0ZXh0PWVsZW1lbnRfdGV4dChzaXplPTIwLCBmYW1pbHk9IlBhbGF0aW5vIikpICsKICAjIEhpZGUgdGhlIGxlbmdlZAogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICdub25lJykgKwogICMgQ2hhbmdlIHBsb3QgdGl0bGVzCiAgbGFicyh4ID0gIkxvZyBvZiBSZWxhdGl2ZSBURlAgaW4gMjAwOSIsCiAgICAgICB5ID0gIkxvZyBvZiBSZWxhdGl2ZSBURlAgaW4gMjAwMyIpCmBgYAoKYGBge3J9CiMgRGVzY3JpcHRpdmUgc3RhdGlzdGljcyBmb3IgY29udGludW91cyB2YXJpYWJsZXMKa2FibGUoZGVzY3IoYWNmMzYpKQpgYGAKCmBgYHtyfQojIEZyZXF1ZW5jeSB0YWJsZSBmb3IgZm9yd2FyZCBhbmQgYmFja3dhcmQgbW9iaWxpdHkKa2FibGUoZnJlcShhY2YzNiRtb2JpbGl0eTApKQpgYGAKCmBgYHtyfQojIEZyZXF1ZW5jeSB0YWJsZSBmb3IgbW9iaWxpdHkgYWNyb3NzIHF1YWRyYW50cwpmcmVxKGFjZjM2JG1vYmlsaXR5KQpgYGAKCgpgYGB7cn0KIyBTaW1wbGUgbW9iaWxpdHkgbWF0cml4CmthYmxlKHdpdGgoYWNmMzYsIGN0YWJsZShtb2JpbGl0eTAsIG1vYmlsaXR5LCBwcm9wID0gInIiKSkgKQpgYGAKCgo=