1 Loading packages


library(ggplot2);library(mgcv);library(itsadug);library(tidyverse);library(gganimate)

2 Demo Linear Model vs GAM

In this demo, data obtained from a Jordanian Arabic speaker producing the word /du:d/ “worm” is used. F2 frequencies obtained at 5 ms interval from onset to midpoint of the vowel are used. Let’s plot the F2 frequencies by interval number. The second plot displays a linear regression line superimposed on the plot. As can be seen, the linear regression line is not able to cope with the curviness of the data, and is unable to cope with it. The third plot superimposes a spline obtained from a GAM model.

demoGAMProd <- read.csv("dataProd_duud.csv")
head(demoGAMProd)
ggplot.demo1 <- ggplot(demoGAMProd,aes(x=IntervalsN,y=F2))+
                geom_point()+theme_bw(base_size = 20)+coord_cartesian(ylim=c(600,1800))+
                labs(y = "F2 Hz", x = "Intervals number")
ggplot.demo1
ggplot.demo2 <- ggplot(demoGAMProd,aes(x=IntervalsN,y=F2))+
  geom_point()+theme_bw(base_size = 20)+coord_cartesian(ylim=c(600,1800))+
  labs(y = "F2 Hz", x = "Intervals number")+geom_smooth(method = lm, se=F)
ggplot.demo2
ggplot.demo3 <- ggplot(demoGAMProd,aes(x=IntervalsN,y=predict(bam(F2 ~ s(IntervalsN, bs="cr"), data = demoGAMProd))))+
  geom_point()+theme_bw(base_size = 20)+coord_cartesian(ylim=c(600,1800))+
  labs(y = "F2 Hz", x = "Intervals number")+geom_smooth(method = lm, formula = y ~ splines::bs(x, 3),se=F)
ggplot.demo3

3 Actual data analyses

This data is obtained from a single speaker producing various consonants in the frame VCV, with V = symmetric /i: a: u:/ (=vowel) and C is one of 17 consonants put into five contexts “plain”, “velar”, “uvular”, “pharyngealised” and “pharyngeal” (=context). The data is from Ultrasound Tongue Imaging. Tongue contours were obtained at the consonant onset, midpoint and offset (=time). A total of 51 words (=word) were obtained and these were repeated 3 times. Tongue splines were extracted with X-Y coordinates (=y outcome). 42 Fan positions (=Fan) were extracted and these are used as a normalisation between contexts. The outcome is y, the predictors are Fan, time, context and vowel, and the random factor is word.

3.1 Creating new variables

Before running the actual GAM model on the data, we need to:

  1. Create two new variables for context and vowel. These will be “ordered” predictors and sum coded
  2. To run an Auto-Regressive Model, we need to find the autocorrelation in the dataframe:
  • We rearrange the data by time, ID, and Fan
  • We add a new variable “start” that marks the start of Fan
pharDF <- read.csv("resultsFull.c_NoRelNoz.csv")
str(pharDF)
'data.frame':   18900 obs. of  23 variables:
 $ X.1                        : int  1 2 3 4 5 6 7 8 9 10 ...
 $ ID                         : int  1 2 3 7 8 9 10 11 12 13 ...
 $ Client.Surname             : chr  "Sara" "Sara" "Sara" "Sara" ...
 $ Time.of.sample.in.recording: num  3.84 5.37 2.37 5.3 2.26 ...
 $ Prompt                     : chr  "2aataa.... 2aataa.... 2aataa.... 2aattaa.... 2aattaa.... 2aattaa" "2aataa.... 2aataa.... 2aataa.... 2aattaa.... 2aattaa.... 2aattaa" "2aataa.... 2aataa.... 2aataa.... 2aattaa.... 2aattaa.... 2aattaa" "2aataa.... 2aataa.... 2aataa.... 2aattaa.... 2aattaa.... 2aattaa" ...
 $ word                       : chr  "2aataa" "2aataa" "2aataa" "2aataa" ...
 $ context                    : chr  "plain" "plain" "plain" "plain" ...
 $ consonant                  : chr  "t" "t" "t" "t" ...
 $ consType                   : chr  "plosive" "plosive" "plosive" "plosive" ...
 $ vowel                      : chr  "aa" "aa" "aa" "aa" ...
 $ labelNew                   : chr  "CL_Mid" "CL_Mid" "CL_Mid" "CL_Ons" ...
 $ label                      : chr  "CL_Mid" "CL_Mid" "CL_Mid" "CL_Ons" ...
 $ repetition                 : int  2 3 1 3 1 2 3 1 2 2 ...
 $ Fan                        : int  1 1 1 1 1 1 1 1 1 1 ...
 $ x                          : num  18.8 18.9 21.5 19.1 17.7 ...
 $ y                          : num  15.6 15.6 14.1 15.5 16.3 ...
 $ vowel2                     : chr  "a<U+02D0>" "a<U+02D0>" "a<U+02D0>" "a<U+02D0>" ...
 $ labelNew2                  : int  2 2 2 1 1 1 3 3 3 2 ...
 $ context.ord                : chr  "plain" "plain" "plain" "plain" ...
 $ vowel.ord                  : chr  "aa" "aa" "aa" "aa" ...
 $ fan_line                   : int  1 1 1 1 1 1 1 1 1 1 ...
 $ X                          : num  18.8 18.9 21.5 19.1 17.7 ...
 $ Y                          : num  15.6 15.6 14.1 15.5 16.3 ...
levels(pharDF$context)
NULL
pharDF$context <- factor(pharDF$context, 
                                levels = c("plain","velar","uvular","pharyngealised","pharyngeal"))
levels(pharDF$vowel)
NULL
pharDF$vowel <- factor(pharDF$vowel, 
                              levels = c("ii","aa","uu"))
levels(pharDF$labelNew)
NULL
pharDF$labelNew <- factor(pharDF$labelNew, 
                                 levels = c("CL_Ons","CL_Mid","CL_Off"))


pharDF$ID <- as.numeric(pharDF$ID)
pharDF$Fan <- as.numeric(pharDF$Fan)
pharDF$time <- pharDF$labelNew2


pharDF$context.ord <- as.ordered(pharDF$context)
contrasts(pharDF$context.ord) <- "contr.treatment"

pharDF$vowel.ord <- as.ordered(pharDF$vowel)
contrasts(pharDF$vowel.ord) <- "contr.treatment"

## to find autocorrelation in the data. Rearrange dataframe and add a variable "start" to indicate 
## when Fan == 1
pharDF <- arrange(pharDF, time, ID, Fan)
pharDF$start <- pharDF$Fan==1

3.2 Visualising the data

Before running anything, we start by visualising the data and use an animated figure

pl <- ggplot(pharDF, aes(x=Fan, y=y, col=context, frame=time)) +
  facet_grid(vowel ~ context) +
  geom_line(aes(group=ID))+theme_bw()
gganimate(pl, ani.width=800, height=300)

3.3 Running our first GAM model

This is our first GAM model. This will be used to find the level of autocorrelation in the data. Our model has double non-linear predictors (fan and time), two factor predictors (context and vowel) and one random effect (word). Interactions between fan and time are used. In addition, by context*vowel interaction is added to account for the two-way interaction with respect to each of fan and time. The function itsadug::acf_resid is used, and we display the level of autocorrelation for each of the “Fan”, the “time”, the “context”, the “vowel” finally the “word”


phar.gam.noAR <- bam(y ~ context.ord*vowel.ord +
                        ## 1d smooths
                        s(Fan, bs="cr", k=10) +
                        s(time, bs="cr", k=3) +
                        ## 1d smooths * factors
                        s(Fan, k=10, bs="cr", by=context.ord) +
                        s(Fan, k=10, bs="cr", by=vowel.ord) +
                        s(Fan, k=10, bs="cr", by=context.ord:vowel.ord) +
                        s(time, k=3, bs="cr", by=context.ord) +
                        s(time, k=3, bs="cr", by=vowel.ord) +
                        s(time, k=3, bs="cr", by=context.ord:vowel.ord) +
                        ## 2d smooths
                        ti(Fan, time, bs="cr", k=c(10,3))+
                        ## 2d smooths * factors
                        ti(Fan, time, bs="cr", k=c(10,3),by=context.ord)+
                        ti(Fan, time, bs="cr", k=c(10,3),by=vowel.ord)+
                        ti(Fan, time, bs="cr", k=c(10,3),by=context.ord:vowel.ord)+
                        ## random smooths by word
                        s(Fan, word, bs="fs", k=10, m=1) +
                        s(time, word, bs="fs", k=3, m=1),
                        data=pharDF)
summary(phar.gam.noAR)

Family: gaussian 
Link function: identity 

Formula:
y ~ context.ord * vowel.ord + s(Fan, bs = "cr", k = 10) + 
    s(time, bs = "cr", k = 3) + s(Fan, k = 10, bs = "cr", 
    by = context.ord) + s(Fan, k = 10, bs = "cr", by = vowel.ord) + 
    s(Fan, k = 10, bs = "cr", by = context.ord:vowel.ord) + 
    s(time, k = 3, bs = "cr", by = context.ord) + s(time, 
    k = 3, bs = "cr", by = vowel.ord) + s(time, k = 3, 
    bs = "cr", by = context.ord:vowel.ord) + ti(Fan, time, 
    bs = "cr", k = c(10, 3)) + ti(Fan, time, bs = "cr", 
    k = c(10, 3), by = context.ord) + ti(Fan, time, bs = "cr", 
    k = c(10, 3), by = vowel.ord) + ti(Fan, time, bs = "cr", 
    k = c(10, 3), by = context.ord:vowel.ord) + s(Fan, word, 
    bs = "fs", k = 10, m = 1) + s(time, word, bs = "fs", 
    k = 3, m = 1)

Parametric coefficients:
                                      Estimate Std. Error t value Pr(>|t|)    
(Intercept)                            35.8171     0.6348  56.422   <2e-16 ***
context.ordvelar                        1.9427     0.8882   2.187   0.0287 *  
context.orduvular                       1.8558     1.2923   1.436   0.1510    
context.ordpharyngealised               0.7096     0.8366   0.848   0.3964    
context.ordpharyngeal                   0.7807     1.0983   0.711   0.4772    
vowel.ordaa                             0.7598     0.8454   0.899   0.3688    
vowel.orduu                             0.8967     0.8357   1.073   0.2833    
context.ordvelar:vowel.ordaa           -0.9334     1.2093  -0.772   0.4402    
context.orduvular:vowel.ordaa          -2.2185     1.6007  -1.386   0.1658    
context.ordpharyngealised:vowel.ordaa  -1.3093     1.1544  -1.134   0.2567    
context.ordpharyngeal:vowel.ordaa       0.2187     1.4674   0.149   0.8815    
context.ordvelar:vowel.orduu           -2.3741     1.2207  -1.945   0.0518 .  
context.orduvular:vowel.orduu          -2.6085     1.8942  -1.377   0.1685    
context.ordpharyngealised:vowel.orduu  -1.8392     1.0893  -1.688   0.0914 .  
context.ordpharyngeal:vowel.orduu      -1.0306     1.4959  -0.689   0.4909    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Approximate significance of smooth terms:
                                                          edf    Ref.df      F
s(Fan)                                              8.657e+00 8.701e+00 97.019
s(time)                                             1.000e+00 1.000e+00  7.939
s(Fan):context.ordvelar                             7.648e+00 7.828e+00  7.293
s(Fan):context.orduvular                            7.716e+00 7.924e+00  9.315
s(Fan):context.ordpharyngealised                    8.577e+00 8.654e+00 28.667
s(Fan):context.ordpharyngeal                        1.000e+00 1.000e+00  3.486
s(Fan):vowel.ordaa                                  7.919e+00 8.070e+00 11.075
s(Fan):vowel.orduu                                  8.090e+00 8.236e+00 14.557
s(Fan):context.ord:vowel.ordplain:ii                5.927e+00 6.192e+00  7.076
s(Fan):context.ord:vowel.ordplain:aa                4.337e+00 4.580e+00  0.992
s(Fan):context.ord:vowel.ordplain:uu                1.000e+00 1.000e+00  0.051
s(Fan):context.ord:vowel.ordvelar:ii                6.347e-04 6.835e-04  0.200
s(Fan):context.ord:vowel.ordvelar:aa                2.253e+00 2.425e+00  1.104
s(Fan):context.ord:vowel.ordvelar:uu                7.454e+00 7.688e+00  7.822
s(Fan):context.ord:vowel.orduvular:ii               1.000e+00 1.000e+00  0.347
s(Fan):context.ord:vowel.orduvular:aa               1.366e-04 1.518e-04  0.297
s(Fan):context.ord:vowel.orduvular:uu               5.426e+00 5.727e+00  2.178
s(Fan):context.ord:vowel.ordpharyngealised:ii       1.000e+00 1.000e+00  2.134
s(Fan):context.ord:vowel.ordpharyngealised:aa       6.412e+00 6.703e+00  3.514
s(Fan):context.ord:vowel.ordpharyngealised:uu       1.283e-04 1.406e-04  0.008
s(Fan):context.ord:vowel.ordpharyngeal:ii           5.662e+00 5.956e+00  4.594
s(Fan):context.ord:vowel.ordpharyngeal:aa           1.000e+00 1.000e+00  0.381
s(Fan):context.ord:vowel.ordpharyngeal:uu           3.101e+00 3.348e+00  2.631
s(time):context.ordvelar                            1.837e+00 1.848e+00  7.206
s(time):context.orduvular                           1.000e+00 1.000e+00  2.293
s(time):context.ordpharyngealised                   1.000e+00 1.000e+00  0.016
s(time):context.ordpharyngeal                       1.000e+00 1.000e+00  1.495
s(time):vowel.ordaa                                 1.000e+00 1.000e+00  0.658
s(time):vowel.orduu                                 1.000e+00 1.000e+00  0.356
s(time):context.ord:vowel.ordplain:ii               7.865e-01 8.011e-01  4.599
s(time):context.ord:vowel.ordplain:aa               1.000e+00 1.000e+00  4.160
s(time):context.ord:vowel.ordplain:uu               1.482e+00 1.503e+00  0.580
s(time):context.ord:vowel.ordvelar:ii               1.173e-04 1.261e-04  0.128
s(time):context.ord:vowel.ordvelar:aa               8.014e-01 8.146e-01  4.954
s(time):context.ord:vowel.ordvelar:uu               1.000e+00 1.000e+00  0.392
s(time):context.ord:vowel.orduvular:ii              1.670e+00 1.689e+00  0.705
s(time):context.ord:vowel.orduvular:aa              3.499e-04 3.803e-04  0.666
s(time):context.ord:vowel.orduvular:uu              1.000e+00 1.000e+00  0.504
s(time):context.ord:vowel.ordpharyngealised:ii      1.000e+00 1.000e+00  0.237
s(time):context.ord:vowel.ordpharyngealised:aa      1.539e+00 1.561e+00  0.570
s(time):context.ord:vowel.ordpharyngealised:uu      6.326e-01 6.528e-01  2.638
s(time):context.ord:vowel.ordpharyngeal:ii          8.496e-01 8.608e-01  6.565
s(time):context.ord:vowel.ordpharyngeal:aa          1.000e+00 1.000e+00  0.481
s(time):context.ord:vowel.ordpharyngeal:uu          2.528e-04 2.748e-04  0.545
ti(Fan,time)                                        9.379e+00 1.097e+01  3.994
ti(Fan,time):context.ordvelar                       1.017e+01 1.241e+01  3.547
ti(Fan,time):context.orduvular                      1.466e+01 1.653e+01 13.907
ti(Fan,time):context.ordpharyngealised              9.661e+00 1.181e+01  1.892
ti(Fan,time):context.ordpharyngeal                  1.841e+00 2.019e+00 13.035
ti(Fan,time):vowel.ordaa                            1.377e+01 1.541e+01 10.850
ti(Fan,time):vowel.orduu                            1.345e+01 1.535e+01  6.194
ti(Fan,time):context.ord:vowel.ordplain:ii          6.187e+00 7.119e+00  7.741
ti(Fan,time):context.ord:vowel.ordplain:aa          1.012e+01 1.220e+01  6.141
ti(Fan,time):context.ord:vowel.ordplain:uu          9.295e+00 1.126e+01  3.991
ti(Fan,time):context.ord:vowel.ordvelar:ii          9.355e-01 9.724e-01 14.881
ti(Fan,time):context.ord:vowel.ordvelar:aa          1.362e+01 1.583e+01  3.757
ti(Fan,time):context.ord:vowel.ordvelar:uu          3.429e+00 4.311e+00  2.001
ti(Fan,time):context.ord:vowel.orduvular:ii         1.881e+00 1.970e+00  4.217
ti(Fan,time):context.ord:vowel.orduvular:aa         1.000e+00 1.000e+00  0.686
ti(Fan,time):context.ord:vowel.orduvular:uu         7.832e+00 1.004e+01  3.334
ti(Fan,time):context.ord:vowel.ordpharyngealised:ii 1.527e+01 1.681e+01 30.704
ti(Fan,time):context.ord:vowel.ordpharyngealised:aa 8.195e-01 1.069e+00  0.037
ti(Fan,time):context.ord:vowel.ordpharyngealised:uu 1.000e+00 1.000e+00  0.260
ti(Fan,time):context.ord:vowel.ordpharyngeal:ii     1.133e+01 1.350e+01 27.316
ti(Fan,time):context.ord:vowel.ordpharyngeal:aa     7.579e+00 1.000e+01  2.397
ti(Fan,time):context.ord:vowel.ordpharyngeal:uu     1.344e+01 1.555e+01 15.310
s(Fan,word)                                         3.422e+02 4.850e+02 30.764
s(time,word)                                        9.068e+01 1.200e+02 11.467
                                                     p-value    
s(Fan)                                               < 2e-16 ***
s(time)                                             0.004843 ** 
s(Fan):context.ordvelar                             1.76e-09 ***
s(Fan):context.orduvular                            1.09e-12 ***
s(Fan):context.ordpharyngealised                     < 2e-16 ***
s(Fan):context.ordpharyngeal                        0.061874 .  
s(Fan):vowel.ordaa                                  8.33e-16 ***
s(Fan):vowel.orduu                                   < 2e-16 ***
s(Fan):context.ord:vowel.ordplain:ii                1.41e-07 ***
s(Fan):context.ord:vowel.ordplain:aa                0.371509    
s(Fan):context.ord:vowel.ordplain:uu                0.821906    
s(Fan):context.ord:vowel.ordvelar:ii                0.990667    
s(Fan):context.ord:vowel.ordvelar:aa                0.283912    
s(Fan):context.ord:vowel.ordvelar:uu                4.35e-10 ***
s(Fan):context.ord:vowel.orduvular:ii               0.555667    
s(Fan):context.ord:vowel.orduvular:aa               0.994640    
s(Fan):context.ord:vowel.orduvular:uu               0.041265 *  
s(Fan):context.ord:vowel.ordpharyngealised:ii       0.144101    
s(Fan):context.ord:vowel.ordpharyngealised:aa       0.001135 ** 
s(Fan):context.ord:vowel.ordpharyngealised:uu       0.999177    
s(Fan):context.ord:vowel.ordpharyngeal:ii           9.88e-05 ***
s(Fan):context.ord:vowel.ordpharyngeal:aa           0.537254    
s(Fan):context.ord:vowel.ordpharyngeal:uu           0.042896 *  
s(time):context.ordvelar                            0.010347 *  
s(time):context.orduvular                           0.129965    
s(time):context.ordpharyngealised                   0.899964    
s(time):context.ordpharyngeal                       0.221516    
s(time):vowel.ordaa                                 0.417237    
s(time):vowel.orduu                                 0.550551    
s(time):context.ord:vowel.ordplain:ii               0.054935 .  
s(time):context.ord:vowel.ordplain:aa               0.041395 *  
s(time):context.ord:vowel.ordplain:uu               0.619221    
s(time):context.ord:vowel.ordvelar:ii               0.996792    
s(time):context.ord:vowel.ordvelar:aa               0.044560 *  
s(time):context.ord:vowel.ordvelar:uu               0.531006    
s(time):context.ord:vowel.orduvular:ii              0.356142    
s(time):context.ord:vowel.orduvular:aa              0.987300    
s(time):context.ord:vowel.orduvular:uu              0.477786    
s(time):context.ord:vowel.ordpharyngealised:ii      0.626791    
s(time):context.ord:vowel.ordpharyngealised:aa      0.358487    
s(time):context.ord:vowel.ordpharyngealised:uu      0.189473    
s(time):context.ord:vowel.ordpharyngeal:ii          0.017459 *  
s(time):context.ord:vowel.ordpharyngeal:aa          0.488045    
s(time):context.ord:vowel.ordpharyngeal:uu          0.990237    
ti(Fan,time)                                        6.97e-06 ***
ti(Fan,time):context.ordvelar                       3.65e-05 ***
ti(Fan,time):context.orduvular                       < 2e-16 ***
ti(Fan,time):context.ordpharyngealised              0.057168 .  
ti(Fan,time):context.ordpharyngeal                  0.000187 ***
ti(Fan,time):vowel.ordaa                             < 2e-16 ***
ti(Fan,time):vowel.orduu                            2.32e-13 ***
ti(Fan,time):context.ord:vowel.ordplain:ii          1.65e-09 ***
ti(Fan,time):context.ord:vowel.ordplain:aa          5.37e-11 ***
ti(Fan,time):context.ord:vowel.ordplain:uu          6.25e-06 ***
ti(Fan,time):context.ord:vowel.ordvelar:ii          0.000143 ***
ti(Fan,time):context.ord:vowel.ordvelar:aa          7.15e-07 ***
ti(Fan,time):context.ord:vowel.ordvelar:uu          0.066650 .  
ti(Fan,time):context.ord:vowel.orduvular:ii         0.020633 *  
ti(Fan,time):context.ord:vowel.orduvular:aa         0.407391    
ti(Fan,time):context.ord:vowel.orduvular:uu         0.000240 ***
ti(Fan,time):context.ord:vowel.ordpharyngealised:ii  < 2e-16 ***
ti(Fan,time):context.ord:vowel.ordpharyngealised:aa 0.829029    
ti(Fan,time):context.ord:vowel.ordpharyngealised:uu 0.610342    
ti(Fan,time):context.ord:vowel.ordpharyngeal:ii      < 2e-16 ***
ti(Fan,time):context.ord:vowel.ordpharyngeal:aa     0.007720 ** 
ti(Fan,time):context.ord:vowel.ordpharyngeal:uu      < 2e-16 ***
s(Fan,word)                                          < 2e-16 ***
s(time,word)                                         < 2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Rank: 1282/1303
R-sq.(adj) =  0.986   Deviance explained = 98.6%
fREML =  35503  Scale est. = 2.207     n = 18900
rho_est <- start_value_rho(phar.gam.noAR)
rho_est
[1] 0.9417107

3.3.1 ACF first GAM

The five plots below show the autocorrelation in the residuals. As can be see, the first plot using Fan, has a complete zero correlations. It is possible that because the various fan points obtained alongside the tongue contour are already correlated with each other, and hence the correlations between fan 1 to 2, 2 to 3, 41 to 42 are already taken into account by the model. The four additional plots show the autocorrelation in the residuals for time, context, vowel and word. All of these predictors are showing autocorrelations between their successive data points. This means that for a specific time (onset, midpoint or offset), there is already correlations between tongue splines obtained at the onset, the midpoint and the offset. It is crucial to tell the model to account for this, otherwise there is overconfidence in the estimates.

3.3.1.1 ACF by Fan

acf_resid(phar.gam.noAR,split_pred=list(pharDF$Fan),main = "Average ACF No.AR by Fan",cex.lab=1.5,cex.axis=1.5)

3.3.1.2 ACF by Time

acf_resid(phar.gam.noAR,split_pred=list(pharDF$time),main = "Average ACF No.AR by Time",cex.lab=1.5,cex.axis=1.5)

3.3.1.3 ACF by Context

acf_resid(phar.gam.noAR,split_pred=list(pharDF$context.ord),main = "Average ACF No.AR by Context",cex.lab=1.5,cex.axis=1.5)

3.3.1.4 ACF by Vowel

acf_resid(phar.gam.noAR,split_pred=list(pharDF$vowel.ord),main = "Average ACF No.AR by Vowel",cex.lab=1.5,cex.axis=1.5)

3.3.1.5 ACF by Word

acf_resid(phar.gam.noAR,split_pred=list(pharDF$word),main = "Average ACF No.AR by Word",cex.lab=1.5,cex.axis=1.5)

3.4 Running our second Autoregressive GAM

Our second GAM model is identical to the first, but takes into account the autocorrelation. By including AR.start and rho, we are using information obtained from original model to account for the autocorrelation

phar.gam.AR <- bam(y ~ context.ord*vowel.ord +
                       ## 1d smooths
                       s(Fan, bs="cr", k=10) +
                       s(time, bs="cr", k=3) +
                       ## 1d smooths * factors
                       s(Fan, k=10, bs="cr", by=context.ord) +
                       s(Fan, k=10, bs="cr", by=vowel.ord) +
                       s(Fan, k=10, bs="cr", by=context.ord:vowel.ord) +
                       s(time, k=3, bs="cr", by=context.ord) +
                       s(time, k=3, bs="cr", by=vowel.ord) +
                       s(time, k=3, bs="cr", by=context.ord:vowel.ord) +
                       ## 2d smooths
                       ti(Fan, time, bs="cr", k=c(10,3))+
                       ## 2d smooths * factors
                       ti(Fan, time, bs="cr", k=c(10,3),by=context.ord)+
                       ti(Fan, time, bs="cr", k=c(10,3),by=vowel.ord)+
                       ti(Fan, time, bs="cr", k=c(10,3),by=context.ord:vowel.ord)+
                       ## random smooths by word
                       s(Fan, word, bs="fs", k=10, m=1) +
                       s(time, word, bs="fs", k=3, m=1),
                       data=pharDF,
                       AR.start=pharDF$start, rho=rho_est)
summary(phar.gam.AR)

Family: gaussian 
Link function: identity 

Formula:
y ~ context.ord * vowel.ord + s(Fan, bs = "cr", k = 10) + 
    s(time, bs = "cr", k = 3) + s(Fan, k = 10, bs = "cr", 
    by = context.ord) + s(Fan, k = 10, bs = "cr", by = vowel.ord) + 
    s(Fan, k = 10, bs = "cr", by = context.ord:vowel.ord) + 
    s(time, k = 3, bs = "cr", by = context.ord) + s(time, 
    k = 3, bs = "cr", by = vowel.ord) + s(time, k = 3, 
    bs = "cr", by = context.ord:vowel.ord) + ti(Fan, time, 
    bs = "cr", k = c(10, 3)) + ti(Fan, time, bs = "cr", 
    k = c(10, 3), by = context.ord) + ti(Fan, time, bs = "cr", 
    k = c(10, 3), by = vowel.ord) + ti(Fan, time, bs = "cr", 
    k = c(10, 3), by = context.ord:vowel.ord) + s(Fan, word, 
    bs = "fs", k = 10, m = 1) + s(time, word, bs = "fs", 
    k = 3, m = 1)

Parametric coefficients:
                                      Estimate Std. Error t value Pr(>|t|)    
(Intercept)                            35.9560     0.6230  57.711   <2e-16 ***
context.ordvelar                        1.8550     0.8688   2.135   0.0328 *  
context.orduvular                       2.3446     1.2999   1.804   0.0713 .  
context.ordpharyngealised               0.5531     0.8208   0.674   0.5004    
context.ordpharyngeal                   0.4110     1.0741   0.383   0.7020    
vowel.ordaa                             0.8223     0.7951   1.034   0.3011    
vowel.orduu                             0.7214     0.8147   0.886   0.3759    
context.ordvelar:vowel.ordaa           -1.0865     1.1455  -0.949   0.3429    
context.orduvular:vowel.ordaa          -3.5099     1.6458  -2.133   0.0330 *  
context.ordpharyngealised:vowel.ordaa  -1.4259     1.1032  -1.293   0.1962    
context.ordpharyngeal:vowel.ordaa      -0.4642     1.2658  -0.367   0.7138    
context.ordvelar:vowel.orduu           -2.1728     1.1932  -1.821   0.0686 .  
context.orduvular:vowel.orduu          -2.8293     1.6414  -1.724   0.0848 .  
context.ordpharyngealised:vowel.orduu  -1.7135     1.0680  -1.604   0.1086    
context.ordpharyngeal:vowel.orduu      -0.5365     1.4511  -0.370   0.7116    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Approximate significance of smooth terms:
                                                          edf    Ref.df       F
s(Fan)                                              8.727e+00 8.773e+00 106.945
s(time)                                             1.000e+00 1.000e+00  16.144
s(Fan):context.ordvelar                             7.819e+00 8.017e+00   7.013
s(Fan):context.orduvular                            8.453e+00 8.588e+00  16.795
s(Fan):context.ordpharyngealised                    8.702e+00 8.766e+00  29.959
s(Fan):context.ordpharyngeal                        1.000e+00 1.000e+00   2.152
s(Fan):vowel.ordaa                                  8.074e+00 8.236e+00  10.654
s(Fan):vowel.orduu                                  8.283e+00 8.429e+00  16.564
s(Fan):context.ord:vowel.ordplain:ii                6.530e+00 6.801e+00   5.816
s(Fan):context.ord:vowel.ordplain:aa                1.000e+00 1.000e+00   0.178
s(Fan):context.ord:vowel.ordplain:uu                1.417e+00 1.522e+00   0.034
s(Fan):context.ord:vowel.ordvelar:ii                1.072e-03 1.203e-03   0.201
s(Fan):context.ord:vowel.ordvelar:aa                3.195e+00 3.562e+00   1.852
s(Fan):context.ord:vowel.ordvelar:uu                7.573e+00 7.844e+00   6.715
s(Fan):context.ord:vowel.orduvular:ii               2.466e+00 2.762e+00   0.764
s(Fan):context.ord:vowel.orduvular:aa               1.000e+00 1.000e+00   0.035
s(Fan):context.ord:vowel.orduvular:uu               1.174e-03 1.639e-03   0.057
s(Fan):context.ord:vowel.ordpharyngealised:ii       1.001e+00 1.001e+00   1.767
s(Fan):context.ord:vowel.ordpharyngealised:aa       6.074e+00 6.475e+00   2.247
s(Fan):context.ord:vowel.ordpharyngealised:uu       1.829e-04 2.159e-04   0.100
s(Fan):context.ord:vowel.ordpharyngeal:ii           6.070e+00 6.409e+00   3.069
s(Fan):context.ord:vowel.ordpharyngeal:aa           1.000e+00 1.000e+00   0.430
s(Fan):context.ord:vowel.ordpharyngeal:uu           3.653e+00 4.069e+00   2.637
s(time):context.ordvelar                            1.806e+00 1.949e+00   9.646
s(time):context.orduvular                           1.000e+00 1.000e+00   4.538
s(time):context.ordpharyngealised                   1.000e+00 1.001e+00   0.071
s(time):context.ordpharyngeal                       1.000e+00 1.001e+00   3.260
s(time):vowel.ordaa                                 1.000e+00 1.000e+00   1.090
s(time):vowel.orduu                                 1.000e+00 1.000e+00   0.601
s(time):context.ord:vowel.ordplain:ii               6.525e-01 8.735e-01   2.150
s(time):context.ord:vowel.ordplain:aa               1.000e+00 1.000e+00   8.033
s(time):context.ord:vowel.ordplain:uu               1.004e+00 1.007e+00   0.188
s(time):context.ord:vowel.ordvelar:ii               1.009e-04 1.858e-04   0.041
s(time):context.ord:vowel.ordvelar:aa               6.899e-01 8.872e-01   2.507
s(time):context.ord:vowel.ordvelar:uu               1.000e+00 1.000e+00   0.696
s(time):context.ord:vowel.orduvular:ii              1.550e+00 1.795e+00   0.590
s(time):context.ord:vowel.orduvular:aa              1.428e-04 2.842e-04   0.172
s(time):context.ord:vowel.orduvular:uu              1.000e+00 1.000e+00   0.862
s(time):context.ord:vowel.ordpharyngealised:ii      1.000e+00 1.000e+00   0.410
s(time):context.ord:vowel.ordpharyngealised:aa      1.194e+00 1.349e+00   1.005
s(time):context.ord:vowel.ordpharyngealised:uu      5.927e-01 8.317e-01   1.750
s(time):context.ord:vowel.ordpharyngeal:ii          7.732e-01 9.470e-01   3.600
s(time):context.ord:vowel.ordpharyngeal:aa          1.000e+00 1.000e+00   0.788
s(time):context.ord:vowel.ordpharyngeal:uu          2.452e-04 4.851e-04   0.312
ti(Fan,time)                                        9.463e+00 1.115e+01   2.005
ti(Fan,time):context.ordvelar                       1.119e+01 1.293e+01   3.199
ti(Fan,time):context.orduvular                      1.637e+01 1.754e+01  11.003
ti(Fan,time):context.ordpharyngealised              1.503e+01 1.659e+01   5.238
ti(Fan,time):context.ordpharyngeal                  5.918e+00 7.189e+00   5.653
ti(Fan,time):vowel.ordaa                            1.452e+01 1.602e+01   5.435
ti(Fan,time):vowel.orduu                            1.449e+01 1.590e+01   4.598
ti(Fan,time):context.ord:vowel.ordplain:ii          7.211e+00 7.715e+00   8.781
ti(Fan,time):context.ord:vowel.ordplain:aa          4.723e+00 5.693e+00   2.374
ti(Fan,time):context.ord:vowel.ordplain:uu          5.799e+00 6.764e+00   1.192
ti(Fan,time):context.ord:vowel.ordvelar:ii          7.407e+00 9.611e+00   0.963
ti(Fan,time):context.ord:vowel.ordvelar:aa          1.441e+01 1.625e+01   4.726
ti(Fan,time):context.ord:vowel.ordvelar:uu          3.930e+00 4.755e+00   1.266
ti(Fan,time):context.ord:vowel.orduvular:ii         1.000e+00 1.001e+00   0.068
ti(Fan,time):context.ord:vowel.orduvular:aa         1.000e+00 1.000e+00   0.166
ti(Fan,time):context.ord:vowel.orduvular:uu         9.215e+00 1.250e+01   1.184
ti(Fan,time):context.ord:vowel.ordpharyngealised:ii 1.638e+01 1.744e+01  14.942
ti(Fan,time):context.ord:vowel.ordpharyngealised:aa 1.088e+00 1.446e+00   0.249
ti(Fan,time):context.ord:vowel.ordpharyngealised:uu 1.351e+00 1.535e+00   0.146
ti(Fan,time):context.ord:vowel.ordpharyngeal:ii     1.396e+01 1.582e+01   4.488
ti(Fan,time):context.ord:vowel.ordpharyngeal:aa     9.527e+00 1.227e+01   2.111
ti(Fan,time):context.ord:vowel.ordpharyngeal:uu     8.056e+00 8.616e+00   8.547
s(Fan,word)                                         3.830e+02 4.850e+02  13.083
s(time,word)                                        1.522e+01 1.200e+02   0.216
                                                     p-value    
s(Fan)                                               < 2e-16 ***
s(time)                                             5.89e-05 ***
s(Fan):context.ordvelar                             3.05e-09 ***
s(Fan):context.orduvular                             < 2e-16 ***
s(Fan):context.ordpharyngealised                     < 2e-16 ***
s(Fan):context.ordpharyngeal                        0.142344    
s(Fan):vowel.ordaa                                  1.58e-15 ***
s(Fan):vowel.orduu                                   < 2e-16 ***
s(Fan):context.ord:vowel.ordplain:ii                2.40e-06 ***
s(Fan):context.ord:vowel.ordplain:aa                0.673336    
s(Fan):context.ord:vowel.ordplain:uu                0.898997    
s(Fan):context.ord:vowel.ordvelar:ii                0.987583    
s(Fan):context.ord:vowel.ordvelar:aa                0.098383 .  
s(Fan):context.ord:vowel.ordvelar:uu                1.91e-08 ***
s(Fan):context.ord:vowel.orduvular:ii               0.419912    
s(Fan):context.ord:vowel.orduvular:aa               0.850685    
s(Fan):context.ord:vowel.orduvular:uu               0.992284    
s(Fan):context.ord:vowel.ordpharyngealised:ii       0.183516    
s(Fan):context.ord:vowel.ordpharyngealised:aa       0.025824 *  
s(Fan):context.ord:vowel.ordpharyngealised:uu       0.996288    
s(Fan):context.ord:vowel.ordpharyngeal:ii           0.003906 ** 
s(Fan):context.ord:vowel.ordpharyngeal:aa           0.512159    
s(Fan):context.ord:vowel.ordpharyngeal:uu           0.027386 *  
s(time):context.ordvelar                            0.000441 ***
s(time):context.orduvular                           0.033167 *  
s(time):context.ordpharyngealised                   0.789879    
s(time):context.ordpharyngeal                       0.071024 .  
s(time):vowel.ordaa                                 0.296471    
s(time):vowel.orduu                                 0.438021    
s(time):context.ord:vowel.ordplain:ii               0.170573    
s(time):context.ord:vowel.ordplain:aa               0.004598 ** 
s(time):context.ord:vowel.ordplain:uu               0.668764    
s(time):context.ord:vowel.ordvelar:ii               0.997811    
s(time):context.ord:vowel.ordvelar:aa               0.135861    
s(time):context.ord:vowel.ordvelar:uu               0.404201    
s(time):context.ord:vowel.orduvular:ii              0.420549    
s(time):context.ord:vowel.orduvular:aa              0.994423    
s(time):context.ord:vowel.orduvular:uu              0.353279    
s(time):context.ord:vowel.ordpharyngealised:ii      0.522121    
s(time):context.ord:vowel.ordpharyngealised:aa      0.256311    
s(time):context.ord:vowel.ordpharyngealised:uu      0.227697    
s(time):context.ord:vowel.ordpharyngeal:ii          0.064837 .  
s(time):context.ord:vowel.ordpharyngeal:aa          0.374830    
s(time):context.ord:vowel.ordpharyngeal:uu          0.990186    
ti(Fan,time)                                        0.019633 *  
ti(Fan,time):context.ordvelar                       0.000107 ***
ti(Fan,time):context.orduvular                       < 2e-16 ***
ti(Fan,time):context.ordpharyngealised              1.44e-10 ***
ti(Fan,time):context.ordpharyngeal                  1.38e-06 ***
ti(Fan,time):vowel.ordaa                            7.44e-12 ***
ti(Fan,time):vowel.orduu                            2.20e-09 ***
ti(Fan,time):context.ord:vowel.ordplain:ii          7.96e-12 ***
ti(Fan,time):context.ord:vowel.ordplain:aa          0.033443 *  
ti(Fan,time):context.ord:vowel.ordplain:uu          0.327504    
ti(Fan,time):context.ord:vowel.ordvelar:ii          0.467691    
ti(Fan,time):context.ord:vowel.ordvelar:aa          4.93e-10 ***
ti(Fan,time):context.ord:vowel.ordvelar:uu          0.213464    
ti(Fan,time):context.ord:vowel.orduvular:ii         0.794583    
ti(Fan,time):context.ord:vowel.orduvular:aa         0.684143    
ti(Fan,time):context.ord:vowel.orduvular:uu         0.296132    
ti(Fan,time):context.ord:vowel.ordpharyngealised:ii  < 2e-16 ***
ti(Fan,time):context.ord:vowel.ordpharyngealised:aa 0.706603    
ti(Fan,time):context.ord:vowel.ordpharyngealised:uu 0.756240    
ti(Fan,time):context.ord:vowel.ordpharyngeal:ii     4.62e-09 ***
ti(Fan,time):context.ord:vowel.ordpharyngeal:aa     0.012872 *  
ti(Fan,time):context.ord:vowel.ordpharyngeal:uu     2.36e-12 ***
s(Fan,word)                                          < 2e-16 ***
s(time,word)                                         < 2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Rank: 1282/1303
R-sq.(adj) =  0.984   Deviance explained = 98.5%
fREML =  12790  Scale est. = 1.6966    n = 18900

3.4.1 ACF second GAM

The following five plots show (in the same order as above) the autocorrelation in the residuals. As can be seen, for all five plots, the levels of autocorrelations in the residuals are reduced massively. We have now more confidence in our estimates, and can continue work

3.4.1.1 ACF by Fan

acf_resid(phar.gam.AR,split_pred=list(pharDF$Fan),main = "Average ACF AR by Fan",cex.lab=1.5,cex.axis=1.5)

3.4.1.2 ACF by Time

acf_resid(phar.gam.AR,split_pred=list(pharDF$time),main = "Average ACF AR by Time",cex.lab=1.5,cex.axis=1.5)

3.4.1.3 ACF by Context

acf_resid(phar.gam.AR,split_pred=list(pharDF$context.ord),main = "Average ACF AR by Context",cex.lab=1.5,cex.axis=1.5)

3.4.1.4 ACF by Vowel

acf_resid(phar.gam.AR,split_pred=list(pharDF$vowel.ord),main = "Average ACF AR by Vowel",cex.lab=1.5,cex.axis=1.5)

3.4.1.5 ACF by Word

acf_resid(phar.gam.AR,split_pred=list(pharDF$word),main = "Average ACF AR by Word",cex.lab=1.5,cex.axis=1.5)

3.5 Significance testing second Autoregressive GAM

To test for significance of context, we run a model with a ML as method and evaluate significance through a maximum likelihood estimate.

3.5.1 Models

We ran three models

  1. A full model with all predictors (phar.gam.AR.ML)
  2. A reduced model without any terms associated with the predictor “context” (phar.gam.AR.ML.Min.Context)
  3. An intercept only model (=Null) without any terms associated with the predictor “vowel” (phar.gam.AR.ML.Min.ContextAndVowel)
phar.gam.AR.ML <- bam(y ~ context.ord*vowel.ord +
                           # 1d smooths
                           s(Fan, bs="cr",k=10) +
                           s(time, bs="cr", k=3) +
                           # 1d smooth * factor
                           s(Fan, k=10, bs="cr", by=context.ord) +
                           s(Fan, k=10, bs="cr", by=vowel.ord) +
                           s(Fan, k=10, bs="cr", by=context.ord:vowel.ord) +
                           s(time, k=3, bs="cr", by=context.ord) +
                           s(time, k=3, bs="cr", by=vowel.ord) +
                           s(time, k=3, bs="cr", by=context.ord:vowel.ord) +
                           # 2d smooth
                           ti(Fan, time, bs="cr", k=c(10,3))+
                           ti(Fan, time, bs="cr", k=c(10,3),by=context.ord)+
                           ti(Fan, time, bs="cr", k=c(10,3),by=vowel.ord)+
                           ti(Fan, time, bs="cr", k=c(10,3),by=context.ord:vowel.ord)+                      
                           # random smooths by word
                           s(Fan, word, bs="fs", k=10, m=1) +
                           s(time, word, bs="fs", k=3, m=1),
                           data=pharDF,
                           method="ML", 
                           AR.start=pharDF$start, rho=rho_est)

phar.gam.AR.ML.Min.Context <- bam(y ~ vowel.ord +
                                      # 1d smooths
                                      s(Fan, bs="cr",k=10) +
                                      s(time, bs="cr", k=3) +
                                      # 1d smooth * factor
                                      ##s(Fan, k=10, bs="cr", by=context.ord) +
                                      s(Fan, k=10, bs="cr", by=vowel.ord) +
                                      ##s(Fan, k=10, bs="cr", by=context.ord:vowel.ord) +
                                      ##s(time, k=3, bs="cr", by=context.ord) +
                                      s(time, k=3, bs="cr", by=vowel.ord) +
                                      ##s(time, k=3, bs="cr", by=context.ord:vowel.ord) +
                                      # 2d smooth
                                      ti(Fan, time, bs="cr", k=c(10,3))+
                                      ##ti(Fan, time, bs="cr", k=c(10,3),by=context.ord)+
                                      ###ti(Fan, time, bs="cr", k=c(10,3),by=vowel.ord)+
                                      ##ti(Fan, time, bs="cr", k=c(10,3),by=context.ord:vowel.ord)+                      
                                      # random smooths by word
                                      s(Fan, word, bs="fs", k=10, m=1) +
                                      s(time, word, bs="fs", k=3, m=1),
                                      data=pharDF,
                                      method="ML", 
                                      AR.start=pharDF$start, rho=rho_est)


phar.gam.AR.ML.Min.ContextAndVowel <- bam(y ~ 1 +
                                    # 1d smooths
                                    s(Fan, bs="cr",k=10) +
                                    s(time, bs="cr", k=3) +
                                    # 1d smooth * factor
                                    ##s(Fan, k=10, bs="cr", by=context.ord) +
                                    ###s(Fan, k=10, bs="cr", by=vowel.ord) +
                                    ##s(Fan, k=10, bs="cr", by=context.ord:vowel.ord) +
                                    ##s(time, k=3, bs="cr", by=context.ord) +
                                    ###s(time, k=3, bs="cr", by=vowel.ord) +
                                    ##s(time, k=3, bs="cr", by=context.ord:vowel.ord) +
                                    # 2d smooth
                                    ##ti(Fan, time, bs="cr", k=c(10,3),by=context.ord)+
                                    ###ti(Fan, time, bs="cr", k=c(10,3),by=vowel.ord)+
                                    ##ti(Fan, time, bs="cr", k=c(10,3),by=context.ord:vowel.ord)+                      
                                    # random smooths by word
                                    s(Fan, word, bs="fs", k=10, m=1) +
                                    s(time, word, bs="fs", k=3, m=1),
                                    data=pharDF,
                                    method="ML", 
                                    AR.start=pharDF$start, rho=rho_est)

3.5.2 Model comparison

Then we compare results of these models as below shown below.

3.5.2.1 Effect of Context vs null

compareML(phar.gam.AR.ML, phar.gam.AR.ML.Min.Context)
phar.gam.AR.ML: y ~ context.ord * vowel.ord + s(Fan, bs = "cr", k = 10) + s(time, 
    bs = "cr", k = 3) + s(Fan, k = 10, bs = "cr", by = context.ord) + 
    s(Fan, k = 10, bs = "cr", by = vowel.ord) + s(Fan, k = 10, 
    bs = "cr", by = context.ord:vowel.ord) + s(time, k = 3, bs = "cr", 
    by = context.ord) + s(time, k = 3, bs = "cr", by = vowel.ord) + 
    s(time, k = 3, bs = "cr", by = context.ord:vowel.ord) + ti(Fan, 
    time, bs = "cr", k = c(10, 3)) + ti(Fan, time, bs = "cr", 
    k = c(10, 3), by = context.ord) + ti(Fan, time, bs = "cr", 
    k = c(10, 3), by = vowel.ord) + ti(Fan, time, bs = "cr", 
    k = c(10, 3), by = context.ord:vowel.ord) + s(Fan, word, 
    bs = "fs", k = 10, m = 1) + s(time, word, bs = "fs", k = 3, 
    m = 1)

phar.gam.AR.ML.Min.Context: y ~ vowel.ord + s(Fan, bs = "cr", k = 10) + s(time, bs = "cr", 
    k = 3) + s(Fan, k = 10, bs = "cr", by = vowel.ord) + s(time, 
    k = 3, bs = "cr", by = vowel.ord) + ti(Fan, time, bs = "cr", 
    k = c(10, 3)) + s(Fan, word, bs = "fs", k = 10, m = 1) + 
    s(time, word, bs = "fs", k = 3, m = 1)

Chi-square test of ML scores
-----

AIC difference: -2716.25, model phar.gam.AR.ML has lower AIC.

3.5.2.2 Effect of Vowel vs Null

compareML(phar.gam.AR.ML,phar.gam.AR.ML.Min.ContextAndVowel)
phar.gam.AR.ML: y ~ context.ord * vowel.ord + s(Fan, bs = "cr", k = 10) + s(time, 
    bs = "cr", k = 3) + s(Fan, k = 10, bs = "cr", by = context.ord) + 
    s(Fan, k = 10, bs = "cr", by = vowel.ord) + s(Fan, k = 10, 
    bs = "cr", by = context.ord:vowel.ord) + s(time, k = 3, bs = "cr", 
    by = context.ord) + s(time, k = 3, bs = "cr", by = vowel.ord) + 
    s(time, k = 3, bs = "cr", by = context.ord:vowel.ord) + ti(Fan, 
    time, bs = "cr", k = c(10, 3)) + ti(Fan, time, bs = "cr", 
    k = c(10, 3), by = context.ord) + ti(Fan, time, bs = "cr", 
    k = c(10, 3), by = vowel.ord) + ti(Fan, time, bs = "cr", 
    k = c(10, 3), by = context.ord:vowel.ord) + s(Fan, word, 
    bs = "fs", k = 10, m = 1) + s(time, word, bs = "fs", k = 3, 
    m = 1)

phar.gam.AR.ML.Min.ContextAndVowel: y ~ 1 + s(Fan, bs = "cr", k = 10) + s(time, bs = "cr", k = 3) + 
    s(Fan, word, bs = "fs", k = 10, m = 1) + s(time, word, bs = "fs", 
    k = 3, m = 1)

Chi-square test of ML scores
-----

AIC difference: -3032.77, model phar.gam.AR.ML has lower AIC.

3.5.2.3 Effect of Context vs Vowel

compareML(phar.gam.AR.ML.Min.Context,phar.gam.AR.ML.Min.ContextAndVowel)
phar.gam.AR.ML.Min.Context: y ~ vowel.ord + s(Fan, bs = "cr", k = 10) + s(time, bs = "cr", 
    k = 3) + s(Fan, k = 10, bs = "cr", by = vowel.ord) + s(time, 
    k = 3, bs = "cr", by = vowel.ord) + ti(Fan, time, bs = "cr", 
    k = c(10, 3)) + s(Fan, word, bs = "fs", k = 10, m = 1) + 
    s(time, word, bs = "fs", k = 3, m = 1)

phar.gam.AR.ML.Min.ContextAndVowel: y ~ 1 + s(Fan, bs = "cr", k = 10) + s(time, bs = "cr", k = 3) + 
    s(Fan, word, bs = "fs", k = 10, m = 1) + s(time, word, bs = "fs", 
    k = 3, m = 1)

Chi-square test of ML scores
-----

AIC difference: -316.52, model phar.gam.AR.ML.Min.Context has lower AIC.

From the results above, both “context” and “vowel” are improving the model fit. “Context” is improving the model fit more than “vowel” (see 3rd comparison)

3.6 Visualising smooths from second Autoregressive GAM

We use the function itsadug::plot_smooth to plot the five smooths for context “plain”, “velar”, “uvular”, “pharyngealised” and “pharyngeal”, in each of the vowel contexts /i: a: u:/ at the onset, midpoint and offset.

The results show that at the midpoint and offset, the three contexts, uvular, pharyngealised and pharyngeal are different from each other: uvular has a higher tongue position (y coordinate); intermediate in pharyngealised and lower and fronted in pharyngeal. At the onset, the same pattern is see though to a lower degree in /a:/.

3.6.1 Vowel /i:/

3.6.1.1 Onset

plot_smooth(phar.gam.AR, view = "Fan",cond = list(context.ord="plain",vowel.ord="ii",time=1),col="darkmagenta",ylim = c(10,65),ylab="",xlab="",
            main="GAM smooths in /i:/ at Onset",hide.label=T,cex.axis=1.3,rm.ranef=T)
Summary:
    * context.ord : factor; set to the value(s): plain. 
    * vowel.ord : factor; set to the value(s): ii. 
    * Fan : numeric predictor; with 30 values ranging from 1.000000 to 42.000000. 
    * time : numeric predictor; set to the value(s): 1. 
    * word : factor; set to the value(s): 2aa3aa. (Might be canceled as random effect, check below.) 
    * NOTE : The following random effects columns are canceled: s(Fan,word),s(time,word)
 
plot_smooth(phar.gam.AR, view = "Fan",cond = list(context.ord="velar",vowel.ord="ii",time=1),col="gray70",add=TRUE,ylim = c(10,65),hide.label=T,cex.axis=1.3,rm.ranef=T)
Summary:
    * context.ord : factor; set to the value(s): velar. 
    * vowel.ord : factor; set to the value(s): ii. 
    * Fan : numeric predictor; with 30 values ranging from 1.000000 to 42.000000. 
    * time : numeric predictor; set to the value(s): 1. 
    * word : factor; set to the value(s): 2aa3aa. (Might be canceled as random effect, check below.) 
    * NOTE : The following random effects columns are canceled: s(Fan,word),s(time,word)
 
plot_smooth(phar.gam.AR, view = "Fan",cond = list(context.ord="uvular",vowel.ord="ii",time=1),col="green",add=TRUE,ylim = c(10,65),hide.label=T,cex.axis=1.3,rm.ranef=T)
Summary:
    * context.ord : factor; set to the value(s): uvular. 
    * vowel.ord : factor; set to the value(s): ii. 
    * Fan : numeric predictor; with 30 values ranging from 1.000000 to 42.000000. 
    * time : numeric predictor; set to the value(s): 1. 
    * word : factor; set to the value(s): 2aa3aa. (Might be canceled as random effect, check below.) 
    * NOTE : The following random effects columns are canceled: s(Fan,word),s(time,word)
 
plot_smooth(phar.gam.AR, view = "Fan",cond = list(context.ord="pharyngealised",vowel.ord="ii",time=1),col="red",add=TRUE,ylim = c(10,65),hide.label=T,cex.axis=1.3,rm.ranef=T)
Summary:
    * context.ord : factor; set to the value(s): pharyngealised. 
    * vowel.ord : factor; set to the value(s): ii. 
    * Fan : numeric predictor; with 30 values ranging from 1.000000 to 42.000000. 
    * time : numeric predictor; set to the value(s): 1. 
    * word : factor; set to the value(s): 2aa3aa. (Might be canceled as random effect, check below.) 
    * NOTE : The following random effects columns are canceled: s(Fan,word),s(time,word)
 
plot_smooth(phar.gam.AR, view = "Fan",cond = list(context.ord="pharyngeal",vowel.ord="ii",time=1),col="blue",add=TRUE,ylim = c(10,65),hide.label=T,cex.axis=1.3,rm.ranef=T)
Summary:
    * context.ord : factor; set to the value(s): pharyngeal. 
    * vowel.ord : factor; set to the value(s): ii. 
    * Fan : numeric predictor; with 30 values ranging from 1.000000 to 42.000000. 
    * time : numeric predictor; set to the value(s): 1. 
    * word : factor; set to the value(s): 2aa3aa. (Might be canceled as random effect, check below.) 
    * NOTE : The following random effects columns are canceled: s(Fan,word),s(time,word)
 
legend("topleft", legend=c("Plain", "Velar", "Uvular","Pharyngealised","Pharyngeal"), 
       col=c("darkmagenta","gray70","green","red","blue"), lwd=4)

3.6.1.2 Midpoint

plot_smooth(phar.gam.AR, view = "Fan",cond = list(context.ord="plain",vowel.ord="ii",time=2),col="darkmagenta",ylim = c(10,65),ylab="",xlab="",
            main="GAM smooths in /i:/ at Mid",hide.label=T,cex.axis=1.3,rm.ranef=T)
Summary:
    * context.ord : factor; set to the value(s): plain. 
    * vowel.ord : factor; set to the value(s): ii. 
    * Fan : numeric predictor; with 30 values ranging from 1.000000 to 42.000000. 
    * time : numeric predictor; set to the value(s): 2. 
    * word : factor; set to the value(s): 2aa3aa. (Might be canceled as random effect, check below.) 
    * NOTE : The following random effects columns are canceled: s(Fan,word),s(time,word)
 
plot_smooth(phar.gam.AR, view = "Fan",cond = list(context.ord="velar",vowel.ord="ii",time=2),col="gray70",add=TRUE,ylim = c(10,65),hide.label=T,cex.axis=1.3,rm.ranef=T)
Summary:
    * context.ord : factor; set to the value(s): velar. 
    * vowel.ord : factor; set to the value(s): ii. 
    * Fan : numeric predictor; with 30 values ranging from 1.000000 to 42.000000. 
    * time : numeric predictor; set to the value(s): 2. 
    * word : factor; set to the value(s): 2aa3aa. (Might be canceled as random effect, check below.) 
    * NOTE : The following random effects columns are canceled: s(Fan,word),s(time,word)
 
plot_smooth(phar.gam.AR, view = "Fan",cond = list(context.ord="uvular",vowel.ord="ii",time=2),col="green",add=TRUE,ylim = c(10,65),hide.label=T,cex.axis=1.3,rm.ranef=T)
Summary:
    * context.ord : factor; set to the value(s): uvular. 
    * vowel.ord : factor; set to the value(s): ii. 
    * Fan : numeric predictor; with 30 values ranging from 1.000000 to 42.000000. 
    * time : numeric predictor; set to the value(s): 2. 
    * word : factor; set to the value(s): 2aa3aa. (Might be canceled as random effect, check below.) 
    * NOTE : The following random effects columns are canceled: s(Fan,word),s(time,word)
 
plot_smooth(phar.gam.AR, view = "Fan",cond = list(context.ord="pharyngealised",vowel.ord="ii",time=2),col="red",add=TRUE,ylim = c(10,65),hide.label=T,cex.axis=1.3,rm.ranef=T)
Summary:
    * context.ord : factor; set to the value(s): pharyngealised. 
    * vowel.ord : factor; set to the value(s): ii. 
    * Fan : numeric predictor; with 30 values ranging from 1.000000 to 42.000000. 
    * time : numeric predictor; set to the value(s): 2. 
    * word : factor; set to the value(s): 2aa3aa. (Might be canceled as random effect, check below.) 
    * NOTE : The following random effects columns are canceled: s(Fan,word),s(time,word)
 
plot_smooth(phar.gam.AR, view = "Fan",cond = list(context.ord="pharyngeal",vowel.ord="ii",time=2),col="blue",add=TRUE,ylim = c(10,65),hide.label=T,cex.axis=1.3,rm.ranef=T)
Summary:
    * context.ord : factor; set to the value(s): pharyngeal. 
    * vowel.ord : factor; set to the value(s): ii. 
    * Fan : numeric predictor; with 30 values ranging from 1.000000 to 42.000000. 
    * time : numeric predictor; set to the value(s): 2. 
    * word : factor; set to the value(s): 2aa3aa. (Might be canceled as random effect, check below.) 
    * NOTE : The following random effects columns are canceled: s(Fan,word),s(time,word)
 
legend("topleft", legend=c("Plain", "Velar", "Uvular","Pharyngealised","Pharyngeal"), 
       col=c("darkmagenta","gray70","green","red","blue"), lwd=4)

3.6.1.3 Offset

plot_smooth(phar.gam.AR, view = "Fan",cond = list(context.ord="plain",vowel.ord="ii",time=3),col="darkmagenta",ylim = c(10,65),ylab="",xlab="",
            main="GAM smooths in /i:/ at Offset",hide.label=T,cex.axis=1.3,rm.ranef=T)
Summary:
    * context.ord : factor; set to the value(s): plain. 
    * vowel.ord : factor; set to the value(s): ii. 
    * Fan : numeric predictor; with 30 values ranging from 1.000000 to 42.000000. 
    * time : numeric predictor; set to the value(s): 3. 
    * word : factor; set to the value(s): 2aa3aa. (Might be canceled as random effect, check below.) 
    * NOTE : The following random effects columns are canceled: s(Fan,word),s(time,word)
 
plot_smooth(phar.gam.AR, view = "Fan",cond = list(context.ord="velar",vowel.ord="ii",time=3),col="gray70",add=TRUE,ylim = c(10,65),hide.label=T,cex.axis=1.3,rm.ranef=T)
Summary:
    * context.ord : factor; set to the value(s): velar. 
    * vowel.ord : factor; set to the value(s): ii. 
    * Fan : numeric predictor; with 30 values ranging from 1.000000 to 42.000000. 
    * time : numeric predictor; set to the value(s): 3. 
    * word : factor; set to the value(s): 2aa3aa. (Might be canceled as random effect, check below.) 
    * NOTE : The following random effects columns are canceled: s(Fan,word),s(time,word)
 
plot_smooth(phar.gam.AR, view = "Fan",cond = list(context.ord="uvular",vowel.ord="ii",time=3),col="green",add=TRUE,ylim = c(10,65),hide.label=T,cex.axis=1.3,rm.ranef=T)
Summary:
    * context.ord : factor; set to the value(s): uvular. 
    * vowel.ord : factor; set to the value(s): ii. 
    * Fan : numeric predictor; with 30 values ranging from 1.000000 to 42.000000. 
    * time : numeric predictor; set to the value(s): 3. 
    * word : factor; set to the value(s): 2aa3aa. (Might be canceled as random effect, check below.) 
    * NOTE : The following random effects columns are canceled: s(Fan,word),s(time,word)
 
plot_smooth(phar.gam.AR, view = "Fan",cond = list(context.ord="pharyngealised",vowel.ord="ii",time=3),col="red",add=TRUE,ylim = c(10,65),hide.label=T,cex.axis=1.3,rm.ranef=T)
Summary:
    * context.ord : factor; set to the value(s): pharyngealised. 
    * vowel.ord : factor; set to the value(s): ii. 
    * Fan : numeric predictor; with 30 values ranging from 1.000000 to 42.000000. 
    * time : numeric predictor; set to the value(s): 3. 
    * word : factor; set to the value(s): 2aa3aa. (Might be canceled as random effect, check below.) 
    * NOTE : The following random effects columns are canceled: s(Fan,word),s(time,word)
 
plot_smooth(phar.gam.AR, view = "Fan",cond = list(context.ord="pharyngeal",vowel.ord="ii",time=3),col="blue",add=TRUE,ylim = c(10,65),hide.label=T,cex.axis=1.3,rm.ranef=T)
Summary:
    * context.ord : factor; set to the value(s): pharyngeal. 
    * vowel.ord : factor; set to the value(s): ii. 
    * Fan : numeric predictor; with 30 values ranging from 1.000000 to 42.000000. 
    * time : numeric predictor; set to the value(s): 3. 
    * word : factor; set to the value(s): 2aa3aa. (Might be canceled as random effect, check below.) 
    * NOTE : The following random effects columns are canceled: s(Fan,word),s(time,word)
 
legend("topleft", legend=c("Plain", "Velar", "Uvular","Pharyngealised","Pharyngeal"), 
       col=c("darkmagenta","gray70","green","red","blue"), lwd=4)

3.6.2 Vowel /a:/

3.6.2.1 Onset

plot_smooth(phar.gam.AR, view = "Fan",cond = list(context.ord="plain",vowel.ord="aa",time=1),col="darkmagenta",ylim = c(10,65),ylab="",xlab="",
            main="GAM smooths in /a:/ at Onset",hide.label=T,cex.axis=1.3,rm.ranef=T)
Summary:
    * context.ord : factor; set to the value(s): plain. 
    * vowel.ord : factor; set to the value(s): aa. 
    * Fan : numeric predictor; with 30 values ranging from 1.000000 to 42.000000. 
    * time : numeric predictor; set to the value(s): 1. 
    * word : factor; set to the value(s): 2aa3aa. (Might be canceled as random effect, check below.) 
    * NOTE : The following random effects columns are canceled: s(Fan,word),s(time,word)
 
plot_smooth(phar.gam.AR, view = "Fan",cond = list(context.ord="velar",vowel.ord="aa",time=1),col="gray70",add=TRUE,ylim = c(10,65),hide.label=T,cex.axis=1.3,rm.ranef=T)
Summary:
    * context.ord : factor; set to the value(s): velar. 
    * vowel.ord : factor; set to the value(s): aa. 
    * Fan : numeric predictor; with 30 values ranging from 1.000000 to 42.000000. 
    * time : numeric predictor; set to the value(s): 1. 
    * word : factor; set to the value(s): 2aa3aa. (Might be canceled as random effect, check below.) 
    * NOTE : The following random effects columns are canceled: s(Fan,word),s(time,word)
 
plot_smooth(phar.gam.AR, view = "Fan",cond = list(context.ord="uvular",vowel.ord="aa",time=1),col="green",add=TRUE,ylim = c(10,65),hide.label=T,cex.axis=1.3,rm.ranef=T)
Summary:
    * context.ord : factor; set to the value(s): uvular. 
    * vowel.ord : factor; set to the value(s): aa. 
    * Fan : numeric predictor; with 30 values ranging from 1.000000 to 42.000000. 
    * time : numeric predictor; set to the value(s): 1. 
    * word : factor; set to the value(s): 2aa3aa. (Might be canceled as random effect, check below.) 
    * NOTE : The following random effects columns are canceled: s(Fan,word),s(time,word)
 
plot_smooth(phar.gam.AR, view = "Fan",cond = list(context.ord="pharyngealised",vowel.ord="aa",time=1),col="red",add=TRUE,ylim = c(10,65),hide.label=T,cex.axis=1.3,rm.ranef=T)
Summary:
    * context.ord : factor; set to the value(s): pharyngealised. 
    * vowel.ord : factor; set to the value(s): aa. 
    * Fan : numeric predictor; with 30 values ranging from 1.000000 to 42.000000. 
    * time : numeric predictor; set to the value(s): 1. 
    * word : factor; set to the value(s): 2aa3aa. (Might be canceled as random effect, check below.) 
    * NOTE : The following random effects columns are canceled: s(Fan,word),s(time,word)
 
plot_smooth(phar.gam.AR, view = "Fan",cond = list(context.ord="pharyngeal",vowel.ord="aa",time=1),col="blue",add=TRUE,ylim = c(10,65),hide.label=T,cex.axis=1.3,rm.ranef=T)
Summary:
    * context.ord : factor; set to the value(s): pharyngeal. 
    * vowel.ord : factor; set to the value(s): aa. 
    * Fan : numeric predictor; with 30 values ranging from 1.000000 to 42.000000. 
    * time : numeric predictor; set to the value(s): 1. 
    * word : factor; set to the value(s): 2aa3aa. (Might be canceled as random effect, check below.) 
    * NOTE : The following random effects columns are canceled: s(Fan,word),s(time,word)
 
legend("topleft", legend=c("Plain", "Velar", "Uvular","Pharyngealised","Pharyngeal"), 
       col=c("darkmagenta","gray70","green","red","blue"), lwd=4)

3.6.2.2 Midpoint

plot_smooth(phar.gam.AR, view = "Fan",cond = list(context.ord="plain",vowel.ord="aa",time=2),col="darkmagenta",ylim = c(10,65),ylab="",xlab="",
            main="GAM smooths in /a:/ at Mid",hide.label=T,cex.axis=1.3,rm.ranef=T)
Summary:
    * context.ord : factor; set to the value(s): plain. 
    * vowel.ord : factor; set to the value(s): aa. 
    * Fan : numeric predictor; with 30 values ranging from 1.000000 to 42.000000. 
    * time : numeric predictor; set to the value(s): 2. 
    * word : factor; set to the value(s): 2aa3aa. (Might be canceled as random effect, check below.) 
    * NOTE : The following random effects columns are canceled: s(Fan,word),s(time,word)
 
plot_smooth(phar.gam.AR, view = "Fan",cond = list(context.ord="velar",vowel.ord="aa",time=2),col="gray70",add=TRUE,ylim = c(10,65),hide.label=T,cex.axis=1.3,rm.ranef=T)
Summary:
    * context.ord : factor; set to the value(s): velar. 
    * vowel.ord : factor; set to the value(s): aa. 
    * Fan : numeric predictor; with 30 values ranging from 1.000000 to 42.000000. 
    * time : numeric predictor; set to the value(s): 2. 
    * word : factor; set to the value(s): 2aa3aa. (Might be canceled as random effect, check below.) 
    * NOTE : The following random effects columns are canceled: s(Fan,word),s(time,word)
 
plot_smooth(phar.gam.AR, view = "Fan",cond = list(context.ord="uvular",vowel.ord="aa",time=2),col="green",add=TRUE,ylim = c(10,65),hide.label=T,cex.axis=1.3,rm.ranef=T)
Summary:
    * context.ord : factor; set to the value(s): uvular. 
    * vowel.ord : factor; set to the value(s): aa. 
    * Fan : numeric predictor; with 30 values ranging from 1.000000 to 42.000000. 
    * time : numeric predictor; set to the value(s): 2. 
    * word : factor; set to the value(s): 2aa3aa. (Might be canceled as random effect, check below.) 
    * NOTE : The following random effects columns are canceled: s(Fan,word),s(time,word)
 
plot_smooth(phar.gam.AR, view = "Fan",cond = list(context.ord="pharyngealised",vowel.ord="aa",time=2),col="red",add=TRUE,ylim = c(10,65),hide.label=T,cex.axis=1.3,rm.ranef=T)
Summary:
    * context.ord : factor; set to the value(s): pharyngealised. 
    * vowel.ord : factor; set to the value(s): aa. 
    * Fan : numeric predictor; with 30 values ranging from 1.000000 to 42.000000. 
    * time : numeric predictor; set to the value(s): 2. 
    * word : factor; set to the value(s): 2aa3aa. (Might be canceled as random effect, check below.) 
    * NOTE : The following random effects columns are canceled: s(Fan,word),s(time,word)
 
plot_smooth(phar.gam.AR, view = "Fan",cond = list(context.ord="pharyngeal",vowel.ord="aa",time=2),col="blue",add=TRUE,ylim = c(10,65),hide.label=T,cex.axis=1.3,rm.ranef=T)
Summary:
    * context.ord : factor; set to the value(s): pharyngeal. 
    * vowel.ord : factor; set to the value(s): aa. 
    * Fan : numeric predictor; with 30 values ranging from 1.000000 to 42.000000. 
    * time : numeric predictor; set to the value(s): 2. 
    * word : factor; set to the value(s): 2aa3aa. (Might be canceled as random effect, check below.) 
    * NOTE : The following random effects columns are canceled: s(Fan,word),s(time,word)
 
legend("topleft", legend=c("Plain", "Velar", "Uvular","Pharyngealised","Pharyngeal"), 
       col=c("darkmagenta","gray70","green","red","blue"), lwd=4)

3.6.2.3 Offset

plot_smooth(phar.gam.AR, view = "Fan",cond = list(context.ord="plain",vowel.ord="aa",time=3),col="darkmagenta",ylim = c(10,65),ylab="",xlab="",
            main="GAM smooths in /a:/ at Offset",hide.label=T,cex.axis=1.3,rm.ranef=T)
Summary:
    * context.ord : factor; set to the value(s): plain. 
    * vowel.ord : factor; set to the value(s): aa. 
    * Fan : numeric predictor; with 30 values ranging from 1.000000 to 42.000000. 
    * time : numeric predictor; set to the value(s): 3. 
    * word : factor; set to the value(s): 2aa3aa. (Might be canceled as random effect, check below.) 
    * NOTE : The following random effects columns are canceled: s(Fan,word),s(time,word)
 
plot_smooth(phar.gam.AR, view = "Fan",cond = list(context.ord="velar",vowel.ord="aa",time=3),col="gray70",add=TRUE,ylim = c(10,65),hide.label=T,cex.axis=1.3,rm.ranef=T)
Summary:
    * context.ord : factor; set to the value(s): velar. 
    * vowel.ord : factor; set to the value(s): aa. 
    * Fan : numeric predictor; with 30 values ranging from 1.000000 to 42.000000. 
    * time : numeric predictor; set to the value(s): 3. 
    * word : factor; set to the value(s): 2aa3aa. (Might be canceled as random effect, check below.) 
    * NOTE : The following random effects columns are canceled: s(Fan,word),s(time,word)
 
plot_smooth(phar.gam.AR, view = "Fan",cond = list(context.ord="uvular",vowel.ord="aa",time=3),col="green",add=TRUE,ylim = c(10,65),hide.label=T,cex.axis=1.3,rm.ranef=T)
Summary:
    * context.ord : factor; set to the value(s): uvular. 
    * vowel.ord : factor; set to the value(s): aa. 
    * Fan : numeric predictor; with 30 values ranging from 1.000000 to 42.000000. 
    * time : numeric predictor; set to the value(s): 3. 
    * word : factor; set to the value(s): 2aa3aa. (Might be canceled as random effect, check below.) 
    * NOTE : The following random effects columns are canceled: s(Fan,word),s(time,word)
 
plot_smooth(phar.gam.AR, view = "Fan",cond = list(context.ord="pharyngealised",vowel.ord="aa",time=3),col="red",add=TRUE,ylim = c(10,65),hide.label=T,cex.axis=1.3,rm.ranef=T)
Summary:
    * context.ord : factor; set to the value(s): pharyngealised. 
    * vowel.ord : factor; set to the value(s): aa. 
    * Fan : numeric predictor; with 30 values ranging from 1.000000 to 42.000000. 
    * time : numeric predictor; set to the value(s): 3. 
    * word : factor; set to the value(s): 2aa3aa. (Might be canceled as random effect, check below.) 
    * NOTE : The following random effects columns are canceled: s(Fan,word),s(time,word)
 
plot_smooth(phar.gam.AR, view = "Fan",cond = list(context.ord="pharyngeal",vowel.ord="aa",time=3),col="blue",add=TRUE,ylim = c(10,65),hide.label=T,cex.axis=1.3,rm.ranef=T)
Summary:
    * context.ord : factor; set to the value(s): pharyngeal. 
    * vowel.ord : factor; set to the value(s): aa. 
    * Fan : numeric predictor; with 30 values ranging from 1.000000 to 42.000000. 
    * time : numeric predictor; set to the value(s): 3. 
    * word : factor; set to the value(s): 2aa3aa. (Might be canceled as random effect, check below.) 
    * NOTE : The following random effects columns are canceled: s(Fan,word),s(time,word)
 
legend("topleft", legend=c("Plain", "Velar", "Uvular","Pharyngealised","Pharyngeal"), 
       col=c("darkmagenta","gray70","green","red","blue"), lwd=4)

3.6.3 Vowel /u:/

3.6.3.1 Onset

plot_smooth(phar.gam.AR, view = "Fan",cond = list(context.ord="plain",vowel.ord="uu",time=1),col="darkmagenta",ylim = c(10,65),ylab="",xlab="",
            main="GAM smooths in /u:/ at Onset",hide.label=T,cex.axis=1.3,rm.ranef=T)
Summary:
    * context.ord : factor; set to the value(s): plain. 
    * vowel.ord : factor; set to the value(s): uu. 
    * Fan : numeric predictor; with 30 values ranging from 1.000000 to 42.000000. 
    * time : numeric predictor; set to the value(s): 1. 
    * word : factor; set to the value(s): 2aa3aa. (Might be canceled as random effect, check below.) 
    * NOTE : The following random effects columns are canceled: s(Fan,word),s(time,word)
 
plot_smooth(phar.gam.AR, view = "Fan",cond = list(context.ord="velar",vowel.ord="uu",time=1),col="gray70",add=TRUE,ylim = c(10,65),hide.label=T,cex.axis=1.3,rm.ranef=T)
Summary:
    * context.ord : factor; set to the value(s): velar. 
    * vowel.ord : factor; set to the value(s): uu. 
    * Fan : numeric predictor; with 30 values ranging from 1.000000 to 42.000000. 
    * time : numeric predictor; set to the value(s): 1. 
    * word : factor; set to the value(s): 2aa3aa. (Might be canceled as random effect, check below.) 
    * NOTE : The following random effects columns are canceled: s(Fan,word),s(time,word)
 
plot_smooth(phar.gam.AR, view = "Fan",cond = list(context.ord="uvular",vowel.ord="uu",time=1),col="green",add=TRUE,ylim = c(10,65),hide.label=T,cex.axis=1.3,rm.ranef=T)
Summary:
    * context.ord : factor; set to the value(s): uvular. 
    * vowel.ord : factor; set to the value(s): uu. 
    * Fan : numeric predictor; with 30 values ranging from 1.000000 to 42.000000. 
    * time : numeric predictor; set to the value(s): 1. 
    * word : factor; set to the value(s): 2aa3aa. (Might be canceled as random effect, check below.) 
    * NOTE : The following random effects columns are canceled: s(Fan,word),s(time,word)
 
plot_smooth(phar.gam.AR, view = "Fan",cond = list(context.ord="pharyngealised",vowel.ord="uu",time=1),col="red",add=TRUE,ylim = c(10,65),hide.label=T,cex.axis=1.3,rm.ranef=T)
Summary:
    * context.ord : factor; set to the value(s): pharyngealised. 
    * vowel.ord : factor; set to the value(s): uu. 
    * Fan : numeric predictor; with 30 values ranging from 1.000000 to 42.000000. 
    * time : numeric predictor; set to the value(s): 1. 
    * word : factor; set to the value(s): 2aa3aa. (Might be canceled as random effect, check below.) 
    * NOTE : The following random effects columns are canceled: s(Fan,word),s(time,word)
 
plot_smooth(phar.gam.AR, view = "Fan",cond = list(context.ord="pharyngeal",vowel.ord="uu",time=1),col="blue",add=TRUE,ylim = c(10,65),hide.label=T,cex.axis=1.3,rm.ranef=T)
Summary:
    * context.ord : factor; set to the value(s): pharyngeal. 
    * vowel.ord : factor; set to the value(s): uu. 
    * Fan : numeric predictor; with 30 values ranging from 1.000000 to 42.000000. 
    * time : numeric predictor; set to the value(s): 1. 
    * word : factor; set to the value(s): 2aa3aa. (Might be canceled as random effect, check below.) 
    * NOTE : The following random effects columns are canceled: s(Fan,word),s(time,word)
 
legend("topleft", legend=c("Plain", "Velar", "Uvular","Pharyngealised","Pharyngeal"), 
       col=c("darkmagenta","gray70","green","red","blue"), lwd=4)

3.6.3.2 Midpoint

plot_smooth(phar.gam.AR, view = "Fan",cond = list(context.ord="plain",vowel.ord="uu",time=2),col="darkmagenta",ylim = c(10,65),ylab="",xlab="",
            main="GAM smooths in /u:/ at Mid",hide.label=T,cex.axis=1.3,rm.ranef=T)
Summary:
    * context.ord : factor; set to the value(s): plain. 
    * vowel.ord : factor; set to the value(s): uu. 
    * Fan : numeric predictor; with 30 values ranging from 1.000000 to 42.000000. 
    * time : numeric predictor; set to the value(s): 2. 
    * word : factor; set to the value(s): 2aa3aa. (Might be canceled as random effect, check below.) 
    * NOTE : The following random effects columns are canceled: s(Fan,word),s(time,word)
 
plot_smooth(phar.gam.AR, view = "Fan",cond = list(context.ord="velar",vowel.ord="uu",time=2),col="gray70",add=TRUE,ylim = c(10,65),hide.label=T,cex.axis=1.3,rm.ranef=T)
Summary:
    * context.ord : factor; set to the value(s): velar. 
    * vowel.ord : factor; set to the value(s): uu. 
    * Fan : numeric predictor; with 30 values ranging from 1.000000 to 42.000000. 
    * time : numeric predictor; set to the value(s): 2. 
    * word : factor; set to the value(s): 2aa3aa. (Might be canceled as random effect, check below.) 
    * NOTE : The following random effects columns are canceled: s(Fan,word),s(time,word)
 
plot_smooth(phar.gam.AR, view = "Fan",cond = list(context.ord="uvular",vowel.ord="uu",time=2),col="green",add=TRUE,ylim = c(10,65),hide.label=T,cex.axis=1.3,rm.ranef=T)
Summary:
    * context.ord : factor; set to the value(s): uvular. 
    * vowel.ord : factor; set to the value(s): uu. 
    * Fan : numeric predictor; with 30 values ranging from 1.000000 to 42.000000. 
    * time : numeric predictor; set to the value(s): 2. 
    * word : factor; set to the value(s): 2aa3aa. (Might be canceled as random effect, check below.) 
    * NOTE : The following random effects columns are canceled: s(Fan,word),s(time,word)
 
plot_smooth(phar.gam.AR, view = "Fan",cond = list(context.ord="pharyngealised",vowel.ord="uu",time=2),col="red",add=TRUE,ylim = c(10,65),hide.label=T,cex.axis=1.3,rm.ranef=T)
Summary:
    * context.ord : factor; set to the value(s): pharyngealised. 
    * vowel.ord : factor; set to the value(s): uu. 
    * Fan : numeric predictor; with 30 values ranging from 1.000000 to 42.000000. 
    * time : numeric predictor; set to the value(s): 2. 
    * word : factor; set to the value(s): 2aa3aa. (Might be canceled as random effect, check below.) 
    * NOTE : The following random effects columns are canceled: s(Fan,word),s(time,word)
 
plot_smooth(phar.gam.AR, view = "Fan",cond = list(context.ord="pharyngeal",vowel.ord="uu",time=2),col="blue",add=TRUE,ylim = c(10,65),hide.label=T,cex.axis=1.3,rm.ranef=T)
Summary:
    * context.ord : factor; set to the value(s): pharyngeal. 
    * vowel.ord : factor; set to the value(s): uu. 
    * Fan : numeric predictor; with 30 values ranging from 1.000000 to 42.000000. 
    * time : numeric predictor; set to the value(s): 2. 
    * word : factor; set to the value(s): 2aa3aa. (Might be canceled as random effect, check below.) 
    * NOTE : The following random effects columns are canceled: s(Fan,word),s(time,word)
 
legend("topleft", legend=c("Plain", "Velar", "Uvular","Pharyngealised","Pharyngeal"), 
       col=c("darkmagenta","gray70","green","red","blue"), lwd=4)

3.6.3.3 Offset

plot_smooth(phar.gam.AR, view = "Fan",cond = list(context.ord="plain",vowel.ord="uu",time=3),col="darkmagenta",ylim = c(10,65),ylab="",xlab="",
            main="GAM smooths in /u:/ at Offset",hide.label=T,cex.axis=1.3,rm.ranef=T)
Summary:
    * context.ord : factor; set to the value(s): plain. 
    * vowel.ord : factor; set to the value(s): uu. 
    * Fan : numeric predictor; with 30 values ranging from 1.000000 to 42.000000. 
    * time : numeric predictor; set to the value(s): 3. 
    * word : factor; set to the value(s): 2aa3aa. (Might be canceled as random effect, check below.) 
    * NOTE : The following random effects columns are canceled: s(Fan,word),s(time,word)
 
plot_smooth(phar.gam.AR, view = "Fan",cond = list(context.ord="velar",vowel.ord="uu",time=3),col="gray70",add=TRUE,ylim = c(10,65),hide.label=T,cex.axis=1.3,rm.ranef=T)
Summary:
    * context.ord : factor; set to the value(s): velar. 
    * vowel.ord : factor; set to the value(s): uu. 
    * Fan : numeric predictor; with 30 values ranging from 1.000000 to 42.000000. 
    * time : numeric predictor; set to the value(s): 3. 
    * word : factor; set to the value(s): 2aa3aa. (Might be canceled as random effect, check below.) 
    * NOTE : The following random effects columns are canceled: s(Fan,word),s(time,word)
 
plot_smooth(phar.gam.AR, view = "Fan",cond = list(context.ord="uvular",vowel.ord="uu",time=3),col="green",add=TRUE,ylim = c(10,65),hide.label=T,cex.axis=1.3,rm.ranef=T)
Summary:
    * context.ord : factor; set to the value(s): uvular. 
    * vowel.ord : factor; set to the value(s): uu. 
    * Fan : numeric predictor; with 30 values ranging from 1.000000 to 42.000000. 
    * time : numeric predictor; set to the value(s): 3. 
    * word : factor; set to the value(s): 2aa3aa. (Might be canceled as random effect, check below.) 
    * NOTE : The following random effects columns are canceled: s(Fan,word),s(time,word)
 
plot_smooth(phar.gam.AR, view = "Fan",cond = list(context.ord="pharyngealised",vowel.ord="uu",time=3),col="red",add=TRUE,ylim = c(10,65),hide.label=T,cex.axis=1.3,rm.ranef=T)
Summary:
    * context.ord : factor; set to the value(s): pharyngealised. 
    * vowel.ord : factor; set to the value(s): uu. 
    * Fan : numeric predictor; with 30 values ranging from 1.000000 to 42.000000. 
    * time : numeric predictor; set to the value(s): 3. 
    * word : factor; set to the value(s): 2aa3aa. (Might be canceled as random effect, check below.) 
    * NOTE : The following random effects columns are canceled: s(Fan,word),s(time,word)
 
plot_smooth(phar.gam.AR, view = "Fan",cond = list(context.ord="pharyngeal",vowel.ord="uu",time=3),col="blue",add=TRUE,ylim = c(10,65),hide.label=T,cex.axis=1.3,rm.ranef=T)
Summary:
    * context.ord : factor; set to the value(s): pharyngeal. 
    * vowel.ord : factor; set to the value(s): uu. 
    * Fan : numeric predictor; with 30 values ranging from 1.000000 to 42.000000. 
    * time : numeric predictor; set to the value(s): 3. 
    * word : factor; set to the value(s): 2aa3aa. (Might be canceled as random effect, check below.) 
    * NOTE : The following random effects columns are canceled: s(Fan,word),s(time,word)
 
legend("topleft", legend=c("Plain", "Velar", "Uvular","Pharyngealised","Pharyngeal"), 
       col=c("darkmagenta","gray70","green","red","blue"), lwd=4)

3.7 Visualising Difference smooths from second Autoregressive GAM

We use the function itsadug::plot_diff to plot the differences between the following pairs: “pharyngealised” vs “plain”; “uvular” vs “pharyngealised” and “pharyngealised” vs “pharyngeal”, in each of the vowel contexts /i: a: u:/ at the onset, midpoint and offset.

The results show that:

  1. Pharyngealised vs Plain: pharyngealised is different in tongue shape. There is an increase in y coordinates (Fan 15-22) indicating “retraction”, decrease (Fan 25-35) indicating “depression” of the tongue and potential difference in larynx height (Fan 5-10)
  2. Uvular vs Pharyngealised: differences depend of vowels (Fan 15-34): uvular is fronter in /i:/ (Fan 22-34); “raised” in /a:/ (Fan 22-28) and /u:/ (Fan 15-25)
  3. Pharyngealised vs Pharyngeal: Pharyngealised is “retracted”/backed to mid-position (Fan 15-25), with “depression” of the tongue (Fan 22-35) and potential lowered larynx (Fan 5-10).

3.7.1 Pharyngealised vs Plain

3.7.1.1 Onset

par(oma=c(1, 0, 0, 3.5),mgp=c(2, 1, 0))
plot_diff(phar.gam.AR, view="Fan",comp=list(context.ord=c("pharyngealised","plain")),
          xlab="",cond=list(time=1,vowel.ord="ii"),main = "difference pharyngealised vs plain Onset",
          col='green',cex.main=1.1,mark.diff = TRUE,col.diff = "green",
          ylim=c(-15,15),hide.label=T,rm.ranef=T)
Summary:
    * vowel.ord : factor; set to the value(s): ii. 
    * Fan : numeric predictor; with 100 values ranging from 1.000000 to 42.000000. 
    * time : numeric predictor; set to the value(s): 1. 
    * word : factor; set to the value(s): 2aa3aa. (Might be canceled as random effect, check below.) 
    * NOTE : The following random effects columns are canceled: s(Fan,word),s(time,word)
 

Fan window(s) of significant difference(s):
    12.181818 - 22.121212
    26.676768 - 39.101010
plot_diff(phar.gam.AR, view="Fan",comp=list(context.ord=c("pharyngealised","plain")),
          xlab="",cond=list(time=1,vowel.ord="aa"),add=TRUE,
          col='red',mark.diff =  TRUE,col.diff = "red",
          ylim=c(-15,15),hide.label=T,rm.ranef=T)
Summary:
    * vowel.ord : factor; set to the value(s): aa. 
    * Fan : numeric predictor; with 100 values ranging from 1.000000 to 42.000000. 
    * time : numeric predictor; set to the value(s): 1. 
    * word : factor; set to the value(s): 2aa3aa. (Might be canceled as random effect, check below.) 
    * NOTE : The following random effects columns are canceled: s(Fan,word),s(time,word)
 

Fan window(s) of significant difference(s):
    12.595960 - 21.292929
    25.434343 - 35.787879
plot_diff(phar.gam.AR, view="Fan",comp=list(context.ord=c("pharyngealised","plain")),
          xlab="",cond=list(time=1,vowel.ord="uu"),add=TRUE,
          col='blue',mark.diff =  TRUE,col.diff = "blue",
          ylim=c(-15,15),hide.label=T,rm.ranef=T)
Summary:
    * vowel.ord : factor; set to the value(s): uu. 
    * Fan : numeric predictor; with 100 values ranging from 1.000000 to 42.000000. 
    * time : numeric predictor; set to the value(s): 1. 
    * word : factor; set to the value(s): 2aa3aa. (Might be canceled as random effect, check below.) 
    * NOTE : The following random effects columns are canceled: s(Fan,word),s(time,word)
 

Fan window(s) of significant difference(s):
    3.070707 - 8.868687
    15.909091 - 22.535354
    26.262626 - 38.272727
legend(par('usr')[2], par('usr')[4], bty='n', xpd=NA,lty=1, 
       legend=c("/i:/", "/a:/", "/u:/"),col=c("green","red","blue"), lwd=4, cex=1.2)

3.7.1.2 Midpoint

par(oma=c(1, 0, 0, 3.5),mgp=c(2, 1, 0))
plot_diff(phar.gam.AR, view="Fan",comp=list(context.ord=c("pharyngealised","plain")),
          xlab="",cond=list(time=2,vowel.ord="ii"),main = "difference pharyngealised vs plain Midpoint",
          col='green',cex.main=1.1,mark.diff = TRUE,col.diff = "green",
          ylim=c(-15,15),hide.label=T,rm.ranef=T)
Summary:
    * vowel.ord : factor; set to the value(s): ii. 
    * Fan : numeric predictor; with 100 values ranging from 1.000000 to 42.000000. 
    * time : numeric predictor; set to the value(s): 2. 
    * word : factor; set to the value(s): 2aa3aa. (Might be canceled as random effect, check below.) 
    * NOTE : The following random effects columns are canceled: s(Fan,word),s(time,word)
 

Fan window(s) of significant difference(s):
    5.141414 - 23.777778
    26.262626 - 41.585859
plot_diff(phar.gam.AR, view="Fan",comp=list(context.ord=c("pharyngealised","plain")),
          xlab="",cond=list(time=2,vowel.ord="aa"),add=TRUE,
          col='red',mark.diff =  TRUE,col.diff = "red",
          ylim=c(-15,15),hide.label=T,rm.ranef=T)
Summary:
    * vowel.ord : factor; set to the value(s): aa. 
    * Fan : numeric predictor; with 100 values ranging from 1.000000 to 42.000000. 
    * time : numeric predictor; set to the value(s): 2. 
    * word : factor; set to the value(s): 2aa3aa. (Might be canceled as random effect, check below.) 
    * NOTE : The following random effects columns are canceled: s(Fan,word),s(time,word)
 

Fan window(s) of significant difference(s):
    15.080808 - 22.535354
    25.848485 - 36.616162
plot_diff(phar.gam.AR, view="Fan",comp=list(context.ord=c("pharyngealised","plain")),
          xlab="",cond=list(time=2,vowel.ord="uu"),add=TRUE,
          col='blue',mark.diff =  TRUE,col.diff = "blue",
          ylim=c(-15,15),hide.label=T,rm.ranef=T)
Summary:
    * vowel.ord : factor; set to the value(s): uu. 
    * Fan : numeric predictor; with 100 values ranging from 1.000000 to 42.000000. 
    * time : numeric predictor; set to the value(s): 2. 
    * word : factor; set to the value(s): 2aa3aa. (Might be canceled as random effect, check below.) 
    * NOTE : The following random effects columns are canceled: s(Fan,word),s(time,word)
 

Fan window(s) of significant difference(s):
    3.484848 - 8.868687
    15.909091 - 23.363636
    26.676768 - 39.929293
legend(par('usr')[2], par('usr')[4], bty='n', xpd=NA,lty=1, 
       legend=c("/i:/", "/a:/", "/u:/"),col=c("green","red","blue"), lwd=4, cex=1.2)

3.7.1.3 Offset

par(oma=c(1, 0, 0, 3.5),mgp=c(2, 1, 0))
plot_diff(phar.gam.AR, view="Fan",comp=list(context.ord=c("pharyngealised","plain")),
          xlab="",cond=list(time=3,vowel.ord="ii"),main = "difference pharyngealised vs plain Offset",
          col='green',cex.main=1.1,mark.diff = TRUE,col.diff = "green",
          ylim=c(-15,15),hide.label=T,rm.ranef=T)
Summary:
    * vowel.ord : factor; set to the value(s): ii. 
    * Fan : numeric predictor; with 100 values ranging from 1.000000 to 42.000000. 
    * time : numeric predictor; set to the value(s): 3. 
    * word : factor; set to the value(s): 2aa3aa. (Might be canceled as random effect, check below.) 
    * NOTE : The following random effects columns are canceled: s(Fan,word),s(time,word)
 

Fan window(s) of significant difference(s):
    6.797980 - 24.606061
    27.090909 - 41.585859
plot_diff(phar.gam.AR, view="Fan",comp=list(context.ord=c("pharyngealised","plain")),
          xlab="",cond=list(time=3,vowel.ord="aa"),add=TRUE,
          col='red',mark.diff =  TRUE,col.diff = "red",
          ylim=c(-15,15),hide.label=T,rm.ranef=T)
Summary:
    * vowel.ord : factor; set to the value(s): aa. 
    * Fan : numeric predictor; with 100 values ranging from 1.000000 to 42.000000. 
    * time : numeric predictor; set to the value(s): 3. 
    * word : factor; set to the value(s): 2aa3aa. (Might be canceled as random effect, check below.) 
    * NOTE : The following random effects columns are canceled: s(Fan,word),s(time,word)
 

Fan window(s) of significant difference(s):
    1.000000 - 7.626263
    15.909091 - 22.121212
    26.262626 - 35.373737
plot_diff(phar.gam.AR, view="Fan",comp=list(context.ord=c("pharyngealised","plain")),
          xlab="",cond=list(time=3,vowel.ord="uu"),add=TRUE,
          col='blue',mark.diff =  TRUE,col.diff = "blue",
          ylim=c(-15,15),hide.label=T,rm.ranef=T)
Summary:
    * vowel.ord : factor; set to the value(s): uu. 
    * Fan : numeric predictor; with 100 values ranging from 1.000000 to 42.000000. 
    * time : numeric predictor; set to the value(s): 3. 
    * word : factor; set to the value(s): 2aa3aa. (Might be canceled as random effect, check below.) 
    * NOTE : The following random effects columns are canceled: s(Fan,word),s(time,word)
 

Fan window(s) of significant difference(s):
    15.080808 - 23.363636
    27.090909 - 39.101010
legend(par('usr')[2], par('usr')[4], bty='n', xpd=NA,lty=1, 
       legend=c("/i:/", "/a:/", "/u:/"),col=c("green","red","blue"), lwd=4, cex=1.2)

3.7.2 Uvular vs Pharyngealised

3.7.2.1 Onset

par(oma=c(1, 0, 0, 3.5),mgp=c(2, 1, 0))
plot_diff(phar.gam.AR, view="Fan",comp=list(context.ord=c("uvular","pharyngealised")),
          xlab="",cond=list(time=1,vowel.ord="ii"),main = "difference uvular vs pharyngealised Onset",
          col='green',cex.main=1.1,mark.diff = TRUE,col.diff = "green",
          ylim=c(-15,15),hide.label=T,rm.ranef=T)
Summary:
    * vowel.ord : factor; set to the value(s): ii. 
    * Fan : numeric predictor; with 100 values ranging from 1.000000 to 42.000000. 
    * time : numeric predictor; set to the value(s): 1. 
    * word : factor; set to the value(s): 2aa3aa. (Might be canceled as random effect, check below.) 
    * NOTE : The following random effects columns are canceled: s(Fan,word),s(time,word)
 

Difference is not significant.
plot_diff(phar.gam.AR, view="Fan",comp=list(context.ord=c("uvular","pharyngealised")),
          xlab="",cond=list(time=1,vowel.ord="aa"),add=TRUE,
          col='red',mark.diff =  TRUE,col.diff = "red",
          ylim=c(-15,15),hide.label=T,rm.ranef=T)
Summary:
    * vowel.ord : factor; set to the value(s): aa. 
    * Fan : numeric predictor; with 100 values ranging from 1.000000 to 42.000000. 
    * time : numeric predictor; set to the value(s): 1. 
    * word : factor; set to the value(s): 2aa3aa. (Might be canceled as random effect, check below.) 
    * NOTE : The following random effects columns are canceled: s(Fan,word),s(time,word)
 

Difference is not significant.
plot_diff(phar.gam.AR, view="Fan",comp=list(context.ord=c("uvular","pharyngealised")),
          xlab="",cond=list(time=1,vowel.ord="uu"),add=TRUE,
          col='blue',mark.diff =  TRUE,col.diff = "blue",
          ylim=c(-15,15),hide.label=T,rm.ranef=T)
Summary:
    * vowel.ord : factor; set to the value(s): uu. 
    * Fan : numeric predictor; with 100 values ranging from 1.000000 to 42.000000. 
    * time : numeric predictor; set to the value(s): 1. 
    * word : factor; set to the value(s): 2aa3aa. (Might be canceled as random effect, check below.) 
    * NOTE : The following random effects columns are canceled: s(Fan,word),s(time,word)
 

Difference is not significant.
legend(par('usr')[2], par('usr')[4], bty='n', xpd=NA,lty=1, 
       legend=c("/i:/", "/a:/", "/u:/"),col=c("green","red","blue"), lwd=4, cex=1.2)

3.7.2.2 Midpoint

par(oma=c(1, 0, 0, 3.5),mgp=c(2, 1, 0))
plot_diff(phar.gam.AR, view="Fan",comp=list(context.ord=c("uvular","pharyngealised")),
          xlab="",cond=list(time=2,vowel.ord="ii"),main = "difference uvular vs pharyngealised Midpoint",
          col='green',cex.main=1.1,mark.diff = TRUE,col.diff = "green",
          ylim=c(-15,15),hide.label=T,rm.ranef=T)
Summary:
    * vowel.ord : factor; set to the value(s): ii. 
    * Fan : numeric predictor; with 100 values ranging from 1.000000 to 42.000000. 
    * time : numeric predictor; set to the value(s): 2. 
    * word : factor; set to the value(s): 2aa3aa. (Might be canceled as random effect, check below.) 
    * NOTE : The following random effects columns are canceled: s(Fan,word),s(time,word)
 

Fan window(s) of significant difference(s):
    20.050505 - 30.404040
plot_diff(phar.gam.AR, view="Fan",comp=list(context.ord=c("uvular","pharyngealised")),
          xlab="",cond=list(time=2,vowel.ord="aa"),add=TRUE,
          col='red',mark.diff =  TRUE,col.diff = "red",
          ylim=c(-15,15),hide.label=T,rm.ranef=T)
Summary:
    * vowel.ord : factor; set to the value(s): aa. 
    * Fan : numeric predictor; with 100 values ranging from 1.000000 to 42.000000. 
    * time : numeric predictor; set to the value(s): 2. 
    * word : factor; set to the value(s): 2aa3aa. (Might be canceled as random effect, check below.) 
    * NOTE : The following random effects columns are canceled: s(Fan,word),s(time,word)
 

Fan window(s) of significant difference(s):
    20.464646 - 25.848485
    34.131313 - 39.101010
plot_diff(phar.gam.AR, view="Fan",comp=list(context.ord=c("uvular","pharyngealised")),
          xlab="",cond=list(time=2,vowel.ord="uu"),add=TRUE,
          col='blue',mark.diff =  TRUE,col.diff = "blue",
          ylim=c(-15,15),hide.label=T,rm.ranef=T)
Summary:
    * vowel.ord : factor; set to the value(s): uu. 
    * Fan : numeric predictor; with 100 values ranging from 1.000000 to 42.000000. 
    * time : numeric predictor; set to the value(s): 2. 
    * word : factor; set to the value(s): 2aa3aa. (Might be canceled as random effect, check below.) 
    * NOTE : The following random effects columns are canceled: s(Fan,word),s(time,word)
 

Fan window(s) of significant difference(s):
    21.292929 - 26.262626
legend(par('usr')[2], par('usr')[4], bty='n', xpd=NA,lty=1, 
       legend=c("/i:/", "/a:/", "/u:/"),col=c("green","red","blue"), lwd=4, cex=1.2)

3.7.2.3 Offset

par(oma=c(1, 0, 0, 3.5),mgp=c(2, 1, 0))
plot_diff(phar.gam.AR, view="Fan",comp=list(context.ord=c("uvular","pharyngealised")),
          xlab="",cond=list(time=3,vowel.ord="ii"),main = "difference uvular vs pharyngealised Offset",
          col='green',cex.main=1.1,mark.diff = TRUE,col.diff = "green",
          ylim=c(-15,15),hide.label=T,rm.ranef=T)
Summary:
    * vowel.ord : factor; set to the value(s): ii. 
    * Fan : numeric predictor; with 100 values ranging from 1.000000 to 42.000000. 
    * time : numeric predictor; set to the value(s): 3. 
    * word : factor; set to the value(s): 2aa3aa. (Might be canceled as random effect, check below.) 
    * NOTE : The following random effects columns are canceled: s(Fan,word),s(time,word)
 

Fan window(s) of significant difference(s):
    22.949495 - 32.060606
plot_diff(phar.gam.AR, view="Fan",comp=list(context.ord=c("uvular","pharyngealised")),
          xlab="",cond=list(time=3,vowel.ord="aa"),add=TRUE,
          col='red',mark.diff =  TRUE,col.diff = "red",
          ylim=c(-15,15),hide.label=T,rm.ranef=T)
Summary:
    * vowel.ord : factor; set to the value(s): aa. 
    * Fan : numeric predictor; with 100 values ranging from 1.000000 to 42.000000. 
    * time : numeric predictor; set to the value(s): 3. 
    * word : factor; set to the value(s): 2aa3aa. (Might be canceled as random effect, check below.) 
    * NOTE : The following random effects columns are canceled: s(Fan,word),s(time,word)
 

Fan window(s) of significant difference(s):
    22.535354 - 27.505051
plot_diff(phar.gam.AR, view="Fan",comp=list(context.ord=c("uvular","pharyngealised")),
          xlab="",cond=list(time=3,vowel.ord="uu"),add=TRUE,
          col='blue',mark.diff =  TRUE,col.diff = "blue",
          ylim=c(-15,15),hide.label=T,rm.ranef=T)
Summary:
    * vowel.ord : factor; set to the value(s): uu. 
    * Fan : numeric predictor; with 100 values ranging from 1.000000 to 42.000000. 
    * time : numeric predictor; set to the value(s): 3. 
    * word : factor; set to the value(s): 2aa3aa. (Might be canceled as random effect, check below.) 
    * NOTE : The following random effects columns are canceled: s(Fan,word),s(time,word)
 

Fan window(s) of significant difference(s):
    22.535354 - 26.676768
legend(par('usr')[2], par('usr')[4], bty='n', xpd=NA,lty=1, 
       legend=c("/i:/", "/a:/", "/u:/"),col=c("green","red","blue"), lwd=4, cex=1.2)

3.7.3 Pharyngealised vs Pharyngeal

3.7.3.1 Onset

par(oma=c(1, 0, 0, 3.5),mgp=c(2, 1, 0))
plot_diff(phar.gam.AR, view="Fan",comp=list(context.ord=c("pharyngealised","pharyngeal")),
          xlab="",cond=list(time=1,vowel.ord="ii"),main = "difference pharyngealised vs pharyngeal Onset",
          col='green',cex.main=1.1,mark.diff = TRUE,col.diff = "green",
          ylim=c(-15,15),hide.label=T,rm.ranef=T)
Summary:
    * vowel.ord : factor; set to the value(s): ii. 
    * Fan : numeric predictor; with 100 values ranging from 1.000000 to 42.000000. 
    * time : numeric predictor; set to the value(s): 1. 
    * word : factor; set to the value(s): 2aa3aa. (Might be canceled as random effect, check below.) 
    * NOTE : The following random effects columns are canceled: s(Fan,word),s(time,word)
 

Fan window(s) of significant difference(s):
    15.909091 - 25.434343
plot_diff(phar.gam.AR, view="Fan",comp=list(context.ord=c("pharyngealised","pharyngeal")),
          xlab="",cond=list(time=1,vowel.ord="aa"),add=TRUE,
          col='red',mark.diff =  TRUE,col.diff = "red",
          ylim=c(-15,15),hide.label=T,rm.ranef=T)
Summary:
    * vowel.ord : factor; set to the value(s): aa. 
    * Fan : numeric predictor; with 100 values ranging from 1.000000 to 42.000000. 
    * time : numeric predictor; set to the value(s): 1. 
    * word : factor; set to the value(s): 2aa3aa. (Might be canceled as random effect, check below.) 
    * NOTE : The following random effects columns are canceled: s(Fan,word),s(time,word)
 

Fan window(s) of significant difference(s):
    13.010101 - 22.535354
    26.262626 - 36.202020
plot_diff(phar.gam.AR, view="Fan",comp=list(context.ord=c("pharyngealised","pharyngeal")),
          xlab="",cond=list(time=1,vowel.ord="uu"),add=TRUE,
          col='blue',mark.diff =  TRUE,col.diff = "blue",
          ylim=c(-15,15),hide.label=T,rm.ranef=T)
Summary:
    * vowel.ord : factor; set to the value(s): uu. 
    * Fan : numeric predictor; with 100 values ranging from 1.000000 to 42.000000. 
    * time : numeric predictor; set to the value(s): 1. 
    * word : factor; set to the value(s): 2aa3aa. (Might be canceled as random effect, check below.) 
    * NOTE : The following random effects columns are canceled: s(Fan,word),s(time,word)
 

Fan window(s) of significant difference(s):
    15.909091 - 20.464646
    28.333333 - 30.404040
legend(par('usr')[2], par('usr')[4], bty='n', xpd=NA,lty=1, 
       legend=c("/i:/", "/a:/", "/u:/"),col=c("green","red","blue"), lwd=4, cex=1.2)

3.7.3.2 Midpoint

par(oma=c(1, 0, 0, 3.5),mgp=c(2, 1, 0))
plot_diff(phar.gam.AR, view="Fan",comp=list(context.ord=c("pharyngealised","pharyngeal")),
          xlab="",cond=list(time=2,vowel.ord="ii"),main = "difference pharyngealised vs pharyngeal Midpoint",
          col='green',cex.main=1.1,mark.diff = TRUE,col.diff = "green",
          ylim=c(-15,15),hide.label=T,rm.ranef=T)
Summary:
    * vowel.ord : factor; set to the value(s): ii. 
    * Fan : numeric predictor; with 100 values ranging from 1.000000 to 42.000000. 
    * time : numeric predictor; set to the value(s): 2. 
    * word : factor; set to the value(s): 2aa3aa. (Might be canceled as random effect, check below.) 
    * NOTE : The following random effects columns are canceled: s(Fan,word),s(time,word)
 

Fan window(s) of significant difference(s):
    1.414141 - 8.868687
    15.909091 - 25.434343
    30.818182 - 38.272727
plot_diff(phar.gam.AR, view="Fan",comp=list(context.ord=c("pharyngealised","pharyngeal")),
          xlab="",cond=list(time=2,vowel.ord="aa"),add=TRUE,
          col='red',mark.diff =  TRUE,col.diff = "red",
          ylim=c(-15,15),hide.label=T,rm.ranef=T)
Summary:
    * vowel.ord : factor; set to the value(s): aa. 
    * Fan : numeric predictor; with 100 values ranging from 1.000000 to 42.000000. 
    * time : numeric predictor; set to the value(s): 2. 
    * word : factor; set to the value(s): 2aa3aa. (Might be canceled as random effect, check below.) 
    * NOTE : The following random effects columns are canceled: s(Fan,word),s(time,word)
 

Fan window(s) of significant difference(s):
    4.313131 - 5.141414
    15.909091 - 22.121212
    26.262626 - 33.303030
plot_diff(phar.gam.AR, view="Fan",comp=list(context.ord=c("pharyngealised","pharyngeal")),
          xlab="",cond=list(time=2,vowel.ord="uu"),add=TRUE,
          col='blue',mark.diff =  TRUE,col.diff = "blue",
          ylim=c(-15,15),hide.label=T,rm.ranef=T)
Summary:
    * vowel.ord : factor; set to the value(s): uu. 
    * Fan : numeric predictor; with 100 values ranging from 1.000000 to 42.000000. 
    * time : numeric predictor; set to the value(s): 2. 
    * word : factor; set to the value(s): 2aa3aa. (Might be canceled as random effect, check below.) 
    * NOTE : The following random effects columns are canceled: s(Fan,word),s(time,word)
 

Fan window(s) of significant difference(s):
    1.000000 - 13.010101
    17.979798 - 23.777778
legend(par('usr')[2], par('usr')[4], bty='n', xpd=NA,lty=1, 
       legend=c("/i:/", "/a:/", "/u:/"),col=c("green","red","blue"), lwd=4, cex=1.2)

3.7.3.3 Offset

par(oma=c(1, 0, 0, 3.5),mgp=c(2, 1, 0))
plot_diff(phar.gam.AR, view="Fan",comp=list(context.ord=c("pharyngealised","pharyngeal")),
          xlab="",cond=list(time=3,vowel.ord="ii"),main = "difference pharyngealised vs pharyngeal Offset",
          col='green',cex.main=1.1,mark.diff = TRUE,col.diff = "green",
          ylim=c(-15,15),hide.label=T,rm.ranef=T)
Summary:
    * vowel.ord : factor; set to the value(s): ii. 
    * Fan : numeric predictor; with 100 values ranging from 1.000000 to 42.000000. 
    * time : numeric predictor; set to the value(s): 3. 
    * word : factor; set to the value(s): 2aa3aa. (Might be canceled as random effect, check below.) 
    * NOTE : The following random effects columns are canceled: s(Fan,word),s(time,word)
 

Fan window(s) of significant difference(s):
    15.080808 - 25.848485
    29.575758 - 39.515152
plot_diff(phar.gam.AR, view="Fan",comp=list(context.ord=c("pharyngealised","pharyngeal")),
          xlab="",cond=list(time=3,vowel.ord="aa"),add=TRUE,
          col='red',mark.diff =  TRUE,col.diff = "red",
          ylim=c(-15,15),hide.label=T,rm.ranef=T)
Summary:
    * vowel.ord : factor; set to the value(s): aa. 
    * Fan : numeric predictor; with 100 values ranging from 1.000000 to 42.000000. 
    * time : numeric predictor; set to the value(s): 3. 
    * word : factor; set to the value(s): 2aa3aa. (Might be canceled as random effect, check below.) 
    * NOTE : The following random effects columns are canceled: s(Fan,word),s(time,word)
 

Fan window(s) of significant difference(s):
    17.565657 - 20.464646
    25.848485 - 33.303030
plot_diff(phar.gam.AR, view="Fan",comp=list(context.ord=c("pharyngealised","pharyngeal")),
          xlab="",cond=list(time=3,vowel.ord="uu"),add=TRUE,
          col='blue',mark.diff =  TRUE,col.diff = "blue",
          ylim=c(-15,15),hide.label=T,rm.ranef=T)
Summary:
    * vowel.ord : factor; set to the value(s): uu. 
    * Fan : numeric predictor; with 100 values ranging from 1.000000 to 42.000000. 
    * time : numeric predictor; set to the value(s): 3. 
    * word : factor; set to the value(s): 2aa3aa. (Might be canceled as random effect, check below.) 
    * NOTE : The following random effects columns are canceled: s(Fan,word),s(time,word)
 

Fan window(s) of significant difference(s):
    1.000000 - 13.838384
    18.808081 - 24.191919
legend(par('usr')[2], par('usr')[4], bty='n', xpd=NA,lty=1, 
       legend=c("/i:/", "/a:/", "/u:/"),col=c("green","red","blue"), lwd=4, cex=1.2)

LS0tDQp0aXRsZTogIkdBTU1zIExhYlBob24gMTgiDQphdXRob3I6IA0KICBuYW1lOiAiSmFsYWwgQWwtVGFtaW1pIg0KICBhZmZpbGlhdGlvbjogIk5ld2Nhc3RsZSBVbml2ZXJzaXR5Ig0KZGF0ZTogIjYgSnVuZSAyMDE4Ig0Kb3V0cHV0OiANCiAgaHRtbF9ub3RlYm9vazoNCiAgICBudW1iZXJfc2VjdGlvbnM6IHRydWUNCiAgICB0b2M6IHRydWUNCiAgICB0b2NfZGVwdGg6IDQNCiAgICB0b2NfZmxvYXQ6DQogICAgICBjb2xsYXBzZWQ6IHRydWUNCi0tLQ0KDQojIExvYWRpbmcgcGFja2FnZXMgDQpgYGB7ciB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCBlcnJvcj1GQUxTRX0NCg0KbGlicmFyeShnZ3Bsb3QyKTtsaWJyYXJ5KG1nY3YpO2xpYnJhcnkoaXRzYWR1Zyk7bGlicmFyeSh0aWR5dmVyc2UpO2xpYnJhcnkoZ2dhbmltYXRlKQ0KYGBgDQoNCiMgRGVtbyBMaW5lYXIgTW9kZWwgdnMgR0FNDQpJbiB0aGlzIGRlbW8sIGRhdGEgb2J0YWluZWQgZnJvbSBhIEpvcmRhbmlhbiBBcmFiaWMgc3BlYWtlciBwcm9kdWNpbmcgdGhlIHdvcmQgL2R1OmQvICJ3b3JtIiBpcyB1c2VkLiBGMiBmcmVxdWVuY2llcyBvYnRhaW5lZCBhdCA1IG1zIGludGVydmFsIGZyb20gb25zZXQgdG8gbWlkcG9pbnQgb2YgdGhlIHZvd2VsIGFyZSB1c2VkLg0KTGV0J3MgcGxvdCB0aGUgRjIgZnJlcXVlbmNpZXMgYnkgaW50ZXJ2YWwgbnVtYmVyLiBUaGUgc2Vjb25kIHBsb3QgZGlzcGxheXMgYSBsaW5lYXIgcmVncmVzc2lvbiBsaW5lIHN1cGVyaW1wb3NlZCBvbiB0aGUgcGxvdC4gQXMgY2FuIGJlIHNlZW4sIHRoZSBsaW5lYXIgcmVncmVzc2lvbiBsaW5lIGlzIG5vdCBhYmxlIHRvIGNvcGUgd2l0aCB0aGUgY3VydmluZXNzIG9mIHRoZSBkYXRhLCBhbmQgaXMgdW5hYmxlIHRvIGNvcGUgd2l0aCBpdC4gVGhlIHRoaXJkIHBsb3Qgc3VwZXJpbXBvc2VzIGEgc3BsaW5lIG9idGFpbmVkIGZyb20gYSBHQU0gbW9kZWwuDQoNCmBgYHtyfQ0KZGVtb0dBTVByb2QgPC0gcmVhZC5jc3YoImRhdGFQcm9kX2R1dWQuY3N2IikNCmhlYWQoZGVtb0dBTVByb2QpDQpgYGANCg0KDQpgYGB7ciB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCBlcnJvcj1GQUxTRX0NCmdncGxvdC5kZW1vMSA8LSBnZ3Bsb3QoZGVtb0dBTVByb2QsYWVzKHg9SW50ZXJ2YWxzTix5PUYyKSkrDQogICAgICAgICAgICAgICAgZ2VvbV9wb2ludCgpK3RoZW1lX2J3KGJhc2Vfc2l6ZSA9IDIwKStjb29yZF9jYXJ0ZXNpYW4oeWxpbT1jKDYwMCwxODAwKSkrDQogICAgICAgICAgICAgICAgbGFicyh5ID0gIkYyIEh6IiwgeCA9ICJJbnRlcnZhbHMgbnVtYmVyIikNCmdncGxvdC5kZW1vMQ0KDQpnZ3Bsb3QuZGVtbzIgPC0gZ2dwbG90KGRlbW9HQU1Qcm9kLGFlcyh4PUludGVydmFsc04seT1GMikpKw0KICBnZW9tX3BvaW50KCkrdGhlbWVfYncoYmFzZV9zaXplID0gMjApK2Nvb3JkX2NhcnRlc2lhbih5bGltPWMoNjAwLDE4MDApKSsNCiAgbGFicyh5ID0gIkYyIEh6IiwgeCA9ICJJbnRlcnZhbHMgbnVtYmVyIikrZ2VvbV9zbW9vdGgobWV0aG9kID0gbG0sIHNlPUYpDQoNCmdncGxvdC5kZW1vMg0KDQpnZ3Bsb3QuZGVtbzMgPC0gZ2dwbG90KGRlbW9HQU1Qcm9kLGFlcyh4PUludGVydmFsc04seT1wcmVkaWN0KGJhbShGMiB+IHMoSW50ZXJ2YWxzTiwgYnM9ImNyIiksIGRhdGEgPSBkZW1vR0FNUHJvZCkpKSkrDQogIGdlb21fcG9pbnQoKSt0aGVtZV9idyhiYXNlX3NpemUgPSAyMCkrY29vcmRfY2FydGVzaWFuKHlsaW09Yyg2MDAsMTgwMCkpKw0KICBsYWJzKHkgPSAiRjIgSHoiLCB4ID0gIkludGVydmFscyBudW1iZXIiKStnZW9tX3Ntb290aChtZXRob2QgPSBsbSwgZm9ybXVsYSA9IHkgfiBzcGxpbmVzOjpicyh4LCAzKSxzZT1GKQ0KDQpnZ3Bsb3QuZGVtbzMNCg0KYGBgDQoNCiMgQWN0dWFsIGRhdGEgYW5hbHlzZXMNClRoaXMgZGF0YSBpcyBvYnRhaW5lZCBmcm9tIGEgc2luZ2xlIHNwZWFrZXIgcHJvZHVjaW5nIHZhcmlvdXMgY29uc29uYW50cyBpbiB0aGUgZnJhbWUgVkNWLCB3aXRoIFYgPSBzeW1tZXRyaWMgL2k6IGE6IHU6LyAoPXZvd2VsKSBhbmQgQyBpcyBvbmUgb2YgMTcgY29uc29uYW50cyBwdXQgaW50byBmaXZlIGNvbnRleHRzICJwbGFpbiIsICJ2ZWxhciIsICJ1dnVsYXIiLCAicGhhcnluZ2VhbGlzZWQiIGFuZCAicGhhcnluZ2VhbCIgKD1jb250ZXh0KS4gVGhlIGRhdGEgaXMgZnJvbSBVbHRyYXNvdW5kIFRvbmd1ZSBJbWFnaW5nLiBUb25ndWUgY29udG91cnMgd2VyZSBvYnRhaW5lZCBhdCB0aGUgY29uc29uYW50IG9uc2V0LCBtaWRwb2ludCBhbmQgb2Zmc2V0ICg9dGltZSkuIEEgdG90YWwgb2YgNTEgd29yZHMgKD13b3JkKSB3ZXJlIG9idGFpbmVkIGFuZCB0aGVzZSB3ZXJlIHJlcGVhdGVkIDMgdGltZXMuIFRvbmd1ZSBzcGxpbmVzIHdlcmUgZXh0cmFjdGVkIHdpdGggWC1ZIGNvb3JkaW5hdGVzICg9eSBvdXRjb21lKS4gNDIgRmFuIHBvc2l0aW9ucyAoPUZhbikgd2VyZSBleHRyYWN0ZWQgYW5kIHRoZXNlIGFyZSB1c2VkIGFzIGEgbm9ybWFsaXNhdGlvbiBiZXR3ZWVuIGNvbnRleHRzLg0KVGhlIG91dGNvbWUgaXMgeSwgdGhlIHByZWRpY3RvcnMgYXJlIEZhbiwgdGltZSwgY29udGV4dCBhbmQgdm93ZWwsIGFuZCB0aGUgcmFuZG9tIGZhY3RvciBpcyB3b3JkLg0KDQojIyBDcmVhdGluZyBuZXcgdmFyaWFibGVzDQpCZWZvcmUgcnVubmluZyB0aGUgYWN0dWFsIEdBTSBtb2RlbCBvbiB0aGUgZGF0YSwgd2UgbmVlZCB0bzoNCg0KMS4gQ3JlYXRlIHR3byBuZXcgdmFyaWFibGVzIGZvciBjb250ZXh0IGFuZCB2b3dlbC4gVGhlc2Ugd2lsbCBiZSAib3JkZXJlZCIgcHJlZGljdG9ycyBhbmQgc3VtIGNvZGVkDQoyLiBUbyBydW4gYW4gQXV0by1SZWdyZXNzaXZlIE1vZGVsLCB3ZSBuZWVkIHRvIGZpbmQgdGhlIGF1dG9jb3JyZWxhdGlvbiBpbiB0aGUgZGF0YWZyYW1lOg0KICArIFdlIHJlYXJyYW5nZSB0aGUgZGF0YSBieSB0aW1lLCBJRCwgYW5kIEZhbiANCiAgKyBXZSBhZGQgYSBuZXcgdmFyaWFibGUgInN0YXJ0IiB0aGF0IG1hcmtzIHRoZSBzdGFydCBvZiBGYW4NCiAgDQoNCmBgYHtyIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIGVycm9yPUZBTFNFfQ0KcGhhckRGIDwtIHJlYWQuY3N2KCJyZXN1bHRzRnVsbC5jX05vUmVsTm96LmNzdiIpDQpzdHIocGhhckRGKQ0KDQpsZXZlbHMocGhhckRGJGNvbnRleHQpDQpwaGFyREYkY29udGV4dCA8LSBmYWN0b3IocGhhckRGJGNvbnRleHQsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCJwbGFpbiIsInZlbGFyIiwidXZ1bGFyIiwicGhhcnluZ2VhbGlzZWQiLCJwaGFyeW5nZWFsIikpDQpsZXZlbHMocGhhckRGJHZvd2VsKQ0KcGhhckRGJHZvd2VsIDwtIGZhY3RvcihwaGFyREYkdm93ZWwsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygiaWkiLCJhYSIsInV1IikpDQpsZXZlbHMocGhhckRGJGxhYmVsTmV3KQ0KcGhhckRGJGxhYmVsTmV3IDwtIGZhY3RvcihwaGFyREYkbGFiZWxOZXcsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygiQ0xfT25zIiwiQ0xfTWlkIiwiQ0xfT2ZmIikpDQoNCg0KcGhhckRGJElEIDwtIGFzLm51bWVyaWMocGhhckRGJElEKQ0KcGhhckRGJEZhbiA8LSBhcy5udW1lcmljKHBoYXJERiRGYW4pDQpwaGFyREYkdGltZSA8LSBwaGFyREYkbGFiZWxOZXcyDQoNCg0KcGhhckRGJGNvbnRleHQub3JkIDwtIGFzLm9yZGVyZWQocGhhckRGJGNvbnRleHQpDQpjb250cmFzdHMocGhhckRGJGNvbnRleHQub3JkKSA8LSAiY29udHIudHJlYXRtZW50Ig0KDQpwaGFyREYkdm93ZWwub3JkIDwtIGFzLm9yZGVyZWQocGhhckRGJHZvd2VsKQ0KY29udHJhc3RzKHBoYXJERiR2b3dlbC5vcmQpIDwtICJjb250ci50cmVhdG1lbnQiDQoNCiMjIHRvIGZpbmQgYXV0b2NvcnJlbGF0aW9uIGluIHRoZSBkYXRhLiBSZWFycmFuZ2UgZGF0YWZyYW1lIGFuZCBhZGQgYSB2YXJpYWJsZSAic3RhcnQiIHRvIGluZGljYXRlIA0KIyMgd2hlbiBGYW4gPT0gMQ0KcGhhckRGIDwtIGFycmFuZ2UocGhhckRGLCB0aW1lLCBJRCwgRmFuKQ0KcGhhckRGJHN0YXJ0IDwtIHBoYXJERiRGYW49PTENCg0KYGBgDQojIyBWaXN1YWxpc2luZyB0aGUgZGF0YQ0KDQpCZWZvcmUgcnVubmluZyBhbnl0aGluZywgd2Ugc3RhcnQgYnkgdmlzdWFsaXNpbmcgdGhlIGRhdGEgYW5kIHVzZSBhbiBhbmltYXRlZCBmaWd1cmUNCg0KYGBge3Igd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgZXJyb3I9RkFMU0V9DQpwbCA8LSBnZ3Bsb3QocGhhckRGLCBhZXMoeD1GYW4sIHk9eSwgY29sPWNvbnRleHQsIGZyYW1lPXRpbWUpKSArDQogIGZhY2V0X2dyaWQodm93ZWwgfiBjb250ZXh0KSArDQogIGdlb21fbGluZShhZXMoZ3JvdXA9SUQpKSt0aGVtZV9idygpDQpnZ2FuaW1hdGUocGwsIGFuaS53aWR0aD04MDAsIGhlaWdodD0zMDApDQoNCmBgYA0KDQoNCiMjIFJ1bm5pbmcgb3VyIGZpcnN0IEdBTSBtb2RlbA0KVGhpcyBpcyBvdXIgZmlyc3QgR0FNIG1vZGVsLiBUaGlzIHdpbGwgYmUgdXNlZCB0byBmaW5kIHRoZSBsZXZlbCBvZiBhdXRvY29ycmVsYXRpb24gaW4gdGhlIGRhdGEuIE91ciBtb2RlbCBoYXMgZG91YmxlIG5vbi1saW5lYXIgcHJlZGljdG9ycyAoZmFuIGFuZCB0aW1lKSwgdHdvIGZhY3RvciBwcmVkaWN0b3JzIChjb250ZXh0IGFuZCB2b3dlbCkgYW5kIG9uZSByYW5kb20gZWZmZWN0ICh3b3JkKS4gSW50ZXJhY3Rpb25zIGJldHdlZW4gZmFuIGFuZCB0aW1lIGFyZSB1c2VkLiBJbiBhZGRpdGlvbiwgYnkgY29udGV4dCp2b3dlbCBpbnRlcmFjdGlvbiBpcyBhZGRlZCB0byBhY2NvdW50IGZvciB0aGUgdHdvLXdheSBpbnRlcmFjdGlvbiB3aXRoIHJlc3BlY3QgdG8gZWFjaCBvZiBmYW4gYW5kIHRpbWUuDQpUaGUgZnVuY3Rpb24gaXRzYWR1Zzo6YWNmX3Jlc2lkIGlzIHVzZWQsIGFuZCB3ZSBkaXNwbGF5IHRoZSBsZXZlbCBvZiBhdXRvY29ycmVsYXRpb24gZm9yIGVhY2ggb2YgdGhlICJGYW4iLCB0aGUgInRpbWUiLCB0aGUgImNvbnRleHQiLCB0aGUgInZvd2VsIiBmaW5hbGx5IHRoZSAid29yZCINCg0KYGBge3Igd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgZXJyb3I9RkFMU0V9DQoNCnBoYXIuZ2FtLm5vQVIgPC0gYmFtKHkgfiBjb250ZXh0Lm9yZCp2b3dlbC5vcmQgKw0KICAgICAgICAgICAgICAgICAgICAgICAgIyMgMWQgc21vb3Rocw0KICAgICAgICAgICAgICAgICAgICAgICAgcyhGYW4sIGJzPSJjciIsIGs9MTApICsNCiAgICAgICAgICAgICAgICAgICAgICAgIHModGltZSwgYnM9ImNyIiwgaz0zKSArDQogICAgICAgICAgICAgICAgICAgICAgICAjIyAxZCBzbW9vdGhzICogZmFjdG9ycw0KICAgICAgICAgICAgICAgICAgICAgICAgcyhGYW4sIGs9MTAsIGJzPSJjciIsIGJ5PWNvbnRleHQub3JkKSArDQogICAgICAgICAgICAgICAgICAgICAgICBzKEZhbiwgaz0xMCwgYnM9ImNyIiwgYnk9dm93ZWwub3JkKSArDQogICAgICAgICAgICAgICAgICAgICAgICBzKEZhbiwgaz0xMCwgYnM9ImNyIiwgYnk9Y29udGV4dC5vcmQ6dm93ZWwub3JkKSArDQogICAgICAgICAgICAgICAgICAgICAgICBzKHRpbWUsIGs9MywgYnM9ImNyIiwgYnk9Y29udGV4dC5vcmQpICsNCiAgICAgICAgICAgICAgICAgICAgICAgIHModGltZSwgaz0zLCBicz0iY3IiLCBieT12b3dlbC5vcmQpICsNCiAgICAgICAgICAgICAgICAgICAgICAgIHModGltZSwgaz0zLCBicz0iY3IiLCBieT1jb250ZXh0Lm9yZDp2b3dlbC5vcmQpICsNCiAgICAgICAgICAgICAgICAgICAgICAgICMjIDJkIHNtb290aHMNCiAgICAgICAgICAgICAgICAgICAgICAgIHRpKEZhbiwgdGltZSwgYnM9ImNyIiwgaz1jKDEwLDMpKSsNCiAgICAgICAgICAgICAgICAgICAgICAgICMjIDJkIHNtb290aHMgKiBmYWN0b3JzDQogICAgICAgICAgICAgICAgICAgICAgICB0aShGYW4sIHRpbWUsIGJzPSJjciIsIGs9YygxMCwzKSxieT1jb250ZXh0Lm9yZCkrDQogICAgICAgICAgICAgICAgICAgICAgICB0aShGYW4sIHRpbWUsIGJzPSJjciIsIGs9YygxMCwzKSxieT12b3dlbC5vcmQpKw0KICAgICAgICAgICAgICAgICAgICAgICAgdGkoRmFuLCB0aW1lLCBicz0iY3IiLCBrPWMoMTAsMyksYnk9Y29udGV4dC5vcmQ6dm93ZWwub3JkKSsNCiAgICAgICAgICAgICAgICAgICAgICAgICMjIHJhbmRvbSBzbW9vdGhzIGJ5IHdvcmQNCiAgICAgICAgICAgICAgICAgICAgICAgIHMoRmFuLCB3b3JkLCBicz0iZnMiLCBrPTEwLCBtPTEpICsNCiAgICAgICAgICAgICAgICAgICAgICAgIHModGltZSwgd29yZCwgYnM9ImZzIiwgaz0zLCBtPTEpLA0KICAgICAgICAgICAgICAgICAgICAgICAgZGF0YT1waGFyREYpDQpgYGANCg0KYGBge3Igd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgZXJyb3I9RkFMU0V9DQpzdW1tYXJ5KHBoYXIuZ2FtLm5vQVIpDQoNCnJob19lc3QgPC0gc3RhcnRfdmFsdWVfcmhvKHBoYXIuZ2FtLm5vQVIpDQpyaG9fZXN0DQpgYGANCg0KIyMjIEFDRiBmaXJzdCBHQU0NClRoZSBmaXZlIHBsb3RzIGJlbG93IHNob3cgdGhlIGF1dG9jb3JyZWxhdGlvbiBpbiB0aGUgcmVzaWR1YWxzLiBBcyBjYW4gYmUgc2VlLCB0aGUgZmlyc3QgcGxvdCB1c2luZyBGYW4sIGhhcyBhIGNvbXBsZXRlIHplcm8gY29ycmVsYXRpb25zLiBJdCBpcyBwb3NzaWJsZSB0aGF0IGJlY2F1c2UgdGhlIHZhcmlvdXMgZmFuIHBvaW50cyBvYnRhaW5lZCBhbG9uZ3NpZGUgdGhlIHRvbmd1ZSBjb250b3VyIGFyZSBhbHJlYWR5IGNvcnJlbGF0ZWQgd2l0aCBlYWNoIG90aGVyLCBhbmQgaGVuY2UgdGhlIGNvcnJlbGF0aW9ucyBiZXR3ZWVuIGZhbiAxIHRvIDIsIDIgdG8gMywgNDEgdG8gNDIgYXJlIGFscmVhZHkgdGFrZW4gaW50byBhY2NvdW50IGJ5IHRoZSBtb2RlbC4gDQpUaGUgZm91ciBhZGRpdGlvbmFsIHBsb3RzIHNob3cgdGhlIGF1dG9jb3JyZWxhdGlvbiBpbiB0aGUgcmVzaWR1YWxzIGZvciB0aW1lLCBjb250ZXh0LCB2b3dlbCBhbmQgd29yZC4gQWxsIG9mIHRoZXNlIHByZWRpY3RvcnMgYXJlIHNob3dpbmcgYXV0b2NvcnJlbGF0aW9ucyBiZXR3ZWVuIHRoZWlyIHN1Y2Nlc3NpdmUgZGF0YSBwb2ludHMuIFRoaXMgbWVhbnMgdGhhdCBmb3IgYSBzcGVjaWZpYyB0aW1lIChvbnNldCwgbWlkcG9pbnQgb3Igb2Zmc2V0KSwgdGhlcmUgaXMgYWxyZWFkeSBjb3JyZWxhdGlvbnMgYmV0d2VlbiB0b25ndWUgc3BsaW5lcyBvYnRhaW5lZCBhdCB0aGUgb25zZXQsIHRoZSBtaWRwb2ludCBhbmQgdGhlIG9mZnNldC4gSXQgaXMgY3J1Y2lhbCB0byB0ZWxsIHRoZSBtb2RlbCB0byBhY2NvdW50IGZvciB0aGlzLCBvdGhlcndpc2UgdGhlcmUgaXMgb3ZlcmNvbmZpZGVuY2UgaW4gdGhlIGVzdGltYXRlcy4gDQoNCiMjIyMgQUNGIGJ5IEZhbg0KDQpgYGB7ciB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCBlcnJvcj1GQUxTRX0NCmFjZl9yZXNpZChwaGFyLmdhbS5ub0FSLHNwbGl0X3ByZWQ9bGlzdChwaGFyREYkRmFuKSxtYWluID0gIkF2ZXJhZ2UgQUNGIE5vLkFSIGJ5IEZhbiIsY2V4LmxhYj0xLjUsY2V4LmF4aXM9MS41KQ0KYGBgDQoNCiMjIyMgQUNGIGJ5IFRpbWUNCg0KYGBge3Igd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgZXJyb3I9RkFMU0V9DQphY2ZfcmVzaWQocGhhci5nYW0ubm9BUixzcGxpdF9wcmVkPWxpc3QocGhhckRGJHRpbWUpLG1haW4gPSAiQXZlcmFnZSBBQ0YgTm8uQVIgYnkgVGltZSIsY2V4LmxhYj0xLjUsY2V4LmF4aXM9MS41KQ0KYGBgDQoNCiMjIyMgQUNGIGJ5IENvbnRleHQNCg0KYGBge3Igd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgZXJyb3I9RkFMU0V9DQphY2ZfcmVzaWQocGhhci5nYW0ubm9BUixzcGxpdF9wcmVkPWxpc3QocGhhckRGJGNvbnRleHQub3JkKSxtYWluID0gIkF2ZXJhZ2UgQUNGIE5vLkFSIGJ5IENvbnRleHQiLGNleC5sYWI9MS41LGNleC5heGlzPTEuNSkNCmBgYA0KDQojIyMjIEFDRiBieSBWb3dlbA0KDQpgYGB7ciB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCBlcnJvcj1GQUxTRX0NCmFjZl9yZXNpZChwaGFyLmdhbS5ub0FSLHNwbGl0X3ByZWQ9bGlzdChwaGFyREYkdm93ZWwub3JkKSxtYWluID0gIkF2ZXJhZ2UgQUNGIE5vLkFSIGJ5IFZvd2VsIixjZXgubGFiPTEuNSxjZXguYXhpcz0xLjUpDQpgYGANCg0KIyMjIyBBQ0YgYnkgV29yZA0KDQpgYGB7ciB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCBlcnJvcj1GQUxTRX0NCmFjZl9yZXNpZChwaGFyLmdhbS5ub0FSLHNwbGl0X3ByZWQ9bGlzdChwaGFyREYkd29yZCksbWFpbiA9ICJBdmVyYWdlIEFDRiBOby5BUiBieSBXb3JkIixjZXgubGFiPTEuNSxjZXguYXhpcz0xLjUpDQpgYGANCg0KDQojIyBSdW5uaW5nIG91ciBzZWNvbmQgQXV0b3JlZ3Jlc3NpdmUgR0FNDQoNCk91ciBzZWNvbmQgR0FNIG1vZGVsIGlzIGlkZW50aWNhbCB0byB0aGUgZmlyc3QsIGJ1dCB0YWtlcyBpbnRvIGFjY291bnQgdGhlIGF1dG9jb3JyZWxhdGlvbi4gQnkgaW5jbHVkaW5nIEFSLnN0YXJ0IGFuZCByaG8sIHdlIGFyZSB1c2luZyBpbmZvcm1hdGlvbiBvYnRhaW5lZCBmcm9tIG9yaWdpbmFsIG1vZGVsIHRvIGFjY291bnQgZm9yIHRoZSBhdXRvY29ycmVsYXRpb24NCmBgYHtyIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIGVycm9yPUZBTFNFfQ0KcGhhci5nYW0uQVIgPC0gYmFtKHkgfiBjb250ZXh0Lm9yZCp2b3dlbC5vcmQgKw0KICAgICAgICAgICAgICAgICAgICAgICAjIyAxZCBzbW9vdGhzDQogICAgICAgICAgICAgICAgICAgICAgIHMoRmFuLCBicz0iY3IiLCBrPTEwKSArDQogICAgICAgICAgICAgICAgICAgICAgIHModGltZSwgYnM9ImNyIiwgaz0zKSArDQogICAgICAgICAgICAgICAgICAgICAgICMjIDFkIHNtb290aHMgKiBmYWN0b3JzDQogICAgICAgICAgICAgICAgICAgICAgIHMoRmFuLCBrPTEwLCBicz0iY3IiLCBieT1jb250ZXh0Lm9yZCkgKw0KICAgICAgICAgICAgICAgICAgICAgICBzKEZhbiwgaz0xMCwgYnM9ImNyIiwgYnk9dm93ZWwub3JkKSArDQogICAgICAgICAgICAgICAgICAgICAgIHMoRmFuLCBrPTEwLCBicz0iY3IiLCBieT1jb250ZXh0Lm9yZDp2b3dlbC5vcmQpICsNCiAgICAgICAgICAgICAgICAgICAgICAgcyh0aW1lLCBrPTMsIGJzPSJjciIsIGJ5PWNvbnRleHQub3JkKSArDQogICAgICAgICAgICAgICAgICAgICAgIHModGltZSwgaz0zLCBicz0iY3IiLCBieT12b3dlbC5vcmQpICsNCiAgICAgICAgICAgICAgICAgICAgICAgcyh0aW1lLCBrPTMsIGJzPSJjciIsIGJ5PWNvbnRleHQub3JkOnZvd2VsLm9yZCkgKw0KICAgICAgICAgICAgICAgICAgICAgICAjIyAyZCBzbW9vdGhzDQogICAgICAgICAgICAgICAgICAgICAgIHRpKEZhbiwgdGltZSwgYnM9ImNyIiwgaz1jKDEwLDMpKSsNCiAgICAgICAgICAgICAgICAgICAgICAgIyMgMmQgc21vb3RocyAqIGZhY3RvcnMNCiAgICAgICAgICAgICAgICAgICAgICAgdGkoRmFuLCB0aW1lLCBicz0iY3IiLCBrPWMoMTAsMyksYnk9Y29udGV4dC5vcmQpKw0KICAgICAgICAgICAgICAgICAgICAgICB0aShGYW4sIHRpbWUsIGJzPSJjciIsIGs9YygxMCwzKSxieT12b3dlbC5vcmQpKw0KICAgICAgICAgICAgICAgICAgICAgICB0aShGYW4sIHRpbWUsIGJzPSJjciIsIGs9YygxMCwzKSxieT1jb250ZXh0Lm9yZDp2b3dlbC5vcmQpKw0KICAgICAgICAgICAgICAgICAgICAgICAjIyByYW5kb20gc21vb3RocyBieSB3b3JkDQogICAgICAgICAgICAgICAgICAgICAgIHMoRmFuLCB3b3JkLCBicz0iZnMiLCBrPTEwLCBtPTEpICsNCiAgICAgICAgICAgICAgICAgICAgICAgcyh0aW1lLCB3b3JkLCBicz0iZnMiLCBrPTMsIG09MSksDQogICAgICAgICAgICAgICAgICAgICAgIGRhdGE9cGhhckRGLA0KICAgICAgICAgICAgICAgICAgICAgICBBUi5zdGFydD1waGFyREYkc3RhcnQsIHJobz1yaG9fZXN0KQ0KYGBgDQoNCmBgYHtyIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIGVycm9yPUZBTFNFfQ0Kc3VtbWFyeShwaGFyLmdhbS5BUikNCmBgYA0KDQojIyMgQUNGIHNlY29uZCBHQU0NClRoZSBmb2xsb3dpbmcgZml2ZSBwbG90cyBzaG93IChpbiB0aGUgc2FtZSBvcmRlciBhcyBhYm92ZSkgdGhlIGF1dG9jb3JyZWxhdGlvbiBpbiB0aGUgcmVzaWR1YWxzLiBBcyBjYW4gYmUgc2VlbiwgZm9yIGFsbCBmaXZlIHBsb3RzLCB0aGUgbGV2ZWxzIG9mIGF1dG9jb3JyZWxhdGlvbnMgaW4gdGhlIHJlc2lkdWFscyBhcmUgcmVkdWNlZCBtYXNzaXZlbHkuIFdlIGhhdmUgbm93IG1vcmUgY29uZmlkZW5jZSBpbiBvdXIgZXN0aW1hdGVzLCBhbmQgY2FuIGNvbnRpbnVlIHdvcmsNCg0KIyMjIyBBQ0YgYnkgRmFuDQoNCmBgYHtyIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIGVycm9yPUZBTFNFfQ0KYWNmX3Jlc2lkKHBoYXIuZ2FtLkFSLHNwbGl0X3ByZWQ9bGlzdChwaGFyREYkRmFuKSxtYWluID0gIkF2ZXJhZ2UgQUNGIEFSIGJ5IEZhbiIsY2V4LmxhYj0xLjUsY2V4LmF4aXM9MS41KQ0KYGBgDQoNCg0KIyMjIyBBQ0YgYnkgVGltZQ0KDQpgYGB7ciB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCBlcnJvcj1GQUxTRX0NCmFjZl9yZXNpZChwaGFyLmdhbS5BUixzcGxpdF9wcmVkPWxpc3QocGhhckRGJHRpbWUpLG1haW4gPSAiQXZlcmFnZSBBQ0YgQVIgYnkgVGltZSIsY2V4LmxhYj0xLjUsY2V4LmF4aXM9MS41KQ0KYGBgDQoNCiMjIyMgQUNGIGJ5IENvbnRleHQNCg0KYGBge3Igd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgZXJyb3I9RkFMU0V9DQphY2ZfcmVzaWQocGhhci5nYW0uQVIsc3BsaXRfcHJlZD1saXN0KHBoYXJERiRjb250ZXh0Lm9yZCksbWFpbiA9ICJBdmVyYWdlIEFDRiBBUiBieSBDb250ZXh0IixjZXgubGFiPTEuNSxjZXguYXhpcz0xLjUpDQpgYGANCg0KDQojIyMjIEFDRiBieSBWb3dlbA0KDQpgYGB7ciB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCBlcnJvcj1GQUxTRX0NCmFjZl9yZXNpZChwaGFyLmdhbS5BUixzcGxpdF9wcmVkPWxpc3QocGhhckRGJHZvd2VsLm9yZCksbWFpbiA9ICJBdmVyYWdlIEFDRiBBUiBieSBWb3dlbCIsY2V4LmxhYj0xLjUsY2V4LmF4aXM9MS41KQ0KYGBgDQoNCiMjIyMgQUNGIGJ5IFdvcmQNCg0KYGBge3Igd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgZXJyb3I9RkFMU0V9DQphY2ZfcmVzaWQocGhhci5nYW0uQVIsc3BsaXRfcHJlZD1saXN0KHBoYXJERiR3b3JkKSxtYWluID0gIkF2ZXJhZ2UgQUNGIEFSIGJ5IFdvcmQiLGNleC5sYWI9MS41LGNleC5heGlzPTEuNSkNCmBgYA0KDQoNCiMjIFNpZ25pZmljYW5jZSB0ZXN0aW5nIHNlY29uZCBBdXRvcmVncmVzc2l2ZSBHQU0NClRvIHRlc3QgZm9yIHNpZ25pZmljYW5jZSBvZiBjb250ZXh0LCB3ZSBydW4gYSBtb2RlbCB3aXRoIGEgTUwgYXMgbWV0aG9kIGFuZCBldmFsdWF0ZSBzaWduaWZpY2FuY2UgdGhyb3VnaCBhIG1heGltdW0gbGlrZWxpaG9vZCBlc3RpbWF0ZS4gDQoNCiMjIyBNb2RlbHMNCldlIHJhbiB0aHJlZSBtb2RlbHMNCg0KMS4gQSBmdWxsIG1vZGVsIHdpdGggYWxsIHByZWRpY3RvcnMgKHBoYXIuZ2FtLkFSLk1MKQ0KMi4gQSByZWR1Y2VkIG1vZGVsIHdpdGhvdXQgYW55IHRlcm1zIGFzc29jaWF0ZWQgd2l0aCB0aGUgcHJlZGljdG9yICJjb250ZXh0IiAocGhhci5nYW0uQVIuTUwuTWluLkNvbnRleHQpDQozLiBBbiBpbnRlcmNlcHQgb25seSBtb2RlbCAoPU51bGwpIHdpdGhvdXQgYW55IHRlcm1zIGFzc29jaWF0ZWQgd2l0aCB0aGUgcHJlZGljdG9yICJ2b3dlbCIgKHBoYXIuZ2FtLkFSLk1MLk1pbi5Db250ZXh0QW5kVm93ZWwpDQoNCmBgYHtyIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIGVycm9yPUZBTFNFfQ0KcGhhci5nYW0uQVIuTUwgPC0gYmFtKHkgfiBjb250ZXh0Lm9yZCp2b3dlbC5vcmQgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAxZCBzbW9vdGhzDQogICAgICAgICAgICAgICAgICAgICAgICAgICBzKEZhbiwgYnM9ImNyIixrPTEwKSArDQogICAgICAgICAgICAgICAgICAgICAgICAgICBzKHRpbWUsIGJzPSJjciIsIGs9MykgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAxZCBzbW9vdGggKiBmYWN0b3INCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHMoRmFuLCBrPTEwLCBicz0iY3IiLCBieT1jb250ZXh0Lm9yZCkgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgcyhGYW4sIGs9MTAsIGJzPSJjciIsIGJ5PXZvd2VsLm9yZCkgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgcyhGYW4sIGs9MTAsIGJzPSJjciIsIGJ5PWNvbnRleHQub3JkOnZvd2VsLm9yZCkgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgcyh0aW1lLCBrPTMsIGJzPSJjciIsIGJ5PWNvbnRleHQub3JkKSArDQogICAgICAgICAgICAgICAgICAgICAgICAgICBzKHRpbWUsIGs9MywgYnM9ImNyIiwgYnk9dm93ZWwub3JkKSArDQogICAgICAgICAgICAgICAgICAgICAgICAgICBzKHRpbWUsIGs9MywgYnM9ImNyIiwgYnk9Y29udGV4dC5vcmQ6dm93ZWwub3JkKSArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAjIDJkIHNtb290aA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgdGkoRmFuLCB0aW1lLCBicz0iY3IiLCBrPWMoMTAsMykpKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgdGkoRmFuLCB0aW1lLCBicz0iY3IiLCBrPWMoMTAsMyksYnk9Y29udGV4dC5vcmQpKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgdGkoRmFuLCB0aW1lLCBicz0iY3IiLCBrPWMoMTAsMyksYnk9dm93ZWwub3JkKSsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpKEZhbiwgdGltZSwgYnM9ImNyIiwgaz1jKDEwLDMpLGJ5PWNvbnRleHQub3JkOnZvd2VsLm9yZCkrICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIyByYW5kb20gc21vb3RocyBieSB3b3JkDQogICAgICAgICAgICAgICAgICAgICAgICAgICBzKEZhbiwgd29yZCwgYnM9ImZzIiwgaz0xMCwgbT0xKSArDQogICAgICAgICAgICAgICAgICAgICAgICAgICBzKHRpbWUsIHdvcmQsIGJzPSJmcyIsIGs9MywgbT0xKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE9cGhhckRGLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kPSJNTCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgQVIuc3RhcnQ9cGhhckRGJHN0YXJ0LCByaG89cmhvX2VzdCkNCg0KcGhhci5nYW0uQVIuTUwuTWluLkNvbnRleHQgPC0gYmFtKHkgfiB2b3dlbC5vcmQgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIDFkIHNtb290aHMNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcyhGYW4sIGJzPSJjciIsaz0xMCkgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzKHRpbWUsIGJzPSJjciIsIGs9MykgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIDFkIHNtb290aCAqIGZhY3Rvcg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjI3MoRmFuLCBrPTEwLCBicz0iY3IiLCBieT1jb250ZXh0Lm9yZCkgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzKEZhbiwgaz0xMCwgYnM9ImNyIiwgYnk9dm93ZWwub3JkKSArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMjcyhGYW4sIGs9MTAsIGJzPSJjciIsIGJ5PWNvbnRleHQub3JkOnZvd2VsLm9yZCkgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjI3ModGltZSwgaz0zLCBicz0iY3IiLCBieT1jb250ZXh0Lm9yZCkgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzKHRpbWUsIGs9MywgYnM9ImNyIiwgYnk9dm93ZWwub3JkKSArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMjcyh0aW1lLCBrPTMsIGJzPSJjciIsIGJ5PWNvbnRleHQub3JkOnZvd2VsLm9yZCkgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIDJkIHNtb290aA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aShGYW4sIHRpbWUsIGJzPSJjciIsIGs9YygxMCwzKSkrDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMjdGkoRmFuLCB0aW1lLCBicz0iY3IiLCBrPWMoMTAsMyksYnk9Y29udGV4dC5vcmQpKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIyN0aShGYW4sIHRpbWUsIGJzPSJjciIsIGs9YygxMCwzKSxieT12b3dlbC5vcmQpKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjI3RpKEZhbiwgdGltZSwgYnM9ImNyIiwgaz1jKDEwLDMpLGJ5PWNvbnRleHQub3JkOnZvd2VsLm9yZCkrICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHJhbmRvbSBzbW9vdGhzIGJ5IHdvcmQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcyhGYW4sIHdvcmQsIGJzPSJmcyIsIGs9MTAsIG09MSkgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzKHRpbWUsIHdvcmQsIGJzPSJmcyIsIGs9MywgbT0xKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YT1waGFyREYsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZD0iTUwiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVIuc3RhcnQ9cGhhckRGJHN0YXJ0LCByaG89cmhvX2VzdCkNCg0KDQpwaGFyLmdhbS5BUi5NTC5NaW4uQ29udGV4dEFuZFZvd2VsIDwtIGJhbSh5IH4gMSArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIDFkIHNtb290aHMNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMoRmFuLCBicz0iY3IiLGs9MTApICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHModGltZSwgYnM9ImNyIiwgaz0zKSArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIDFkIHNtb290aCAqIGZhY3Rvcg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyNzKEZhbiwgaz0xMCwgYnM9ImNyIiwgYnk9Y29udGV4dC5vcmQpICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMjI3MoRmFuLCBrPTEwLCBicz0iY3IiLCBieT12b3dlbC5vcmQpICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMjcyhGYW4sIGs9MTAsIGJzPSJjciIsIGJ5PWNvbnRleHQub3JkOnZvd2VsLm9yZCkgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyNzKHRpbWUsIGs9MywgYnM9ImNyIiwgYnk9Y29udGV4dC5vcmQpICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMjI3ModGltZSwgaz0zLCBicz0iY3IiLCBieT12b3dlbC5vcmQpICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMjcyh0aW1lLCBrPTMsIGJzPSJjciIsIGJ5PWNvbnRleHQub3JkOnZvd2VsLm9yZCkgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAyZCBzbW9vdGgNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMjdGkoRmFuLCB0aW1lLCBicz0iY3IiLCBrPWMoMTAsMyksYnk9Y29udGV4dC5vcmQpKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyMjdGkoRmFuLCB0aW1lLCBicz0iY3IiLCBrPWMoMTAsMyksYnk9dm93ZWwub3JkKSsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMjdGkoRmFuLCB0aW1lLCBicz0iY3IiLCBrPWMoMTAsMyksYnk9Y29udGV4dC5vcmQ6dm93ZWwub3JkKSsgICAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHJhbmRvbSBzbW9vdGhzIGJ5IHdvcmQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMoRmFuLCB3b3JkLCBicz0iZnMiLCBrPTEwLCBtPTEpICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHModGltZSwgd29yZCwgYnM9ImZzIiwgaz0zLCBtPTEpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YT1waGFyREYsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2Q9Ik1MIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUi5zdGFydD1waGFyREYkc3RhcnQsIHJobz1yaG9fZXN0KQ0KYGBgDQoNCiMjIyBNb2RlbCBjb21wYXJpc29uDQpUaGVuIHdlIGNvbXBhcmUgcmVzdWx0cyBvZiB0aGVzZSBtb2RlbHMgYXMgYmVsb3cgc2hvd24gYmVsb3cuICAgIA0KDQojIyMjIEVmZmVjdCBvZiBDb250ZXh0IHZzIG51bGwNCmBgYHtyIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIGVycm9yPUZBTFNFfQ0KY29tcGFyZU1MKHBoYXIuZ2FtLkFSLk1MLCBwaGFyLmdhbS5BUi5NTC5NaW4uQ29udGV4dCkNCmBgYA0KDQojIyMjIEVmZmVjdCBvZiBWb3dlbCB2cyBOdWxsDQpgYGB7ciB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCBlcnJvcj1GQUxTRX0NCmNvbXBhcmVNTChwaGFyLmdhbS5BUi5NTCxwaGFyLmdhbS5BUi5NTC5NaW4uQ29udGV4dEFuZFZvd2VsKQ0KYGBgDQoNCiMjIyMgRWZmZWN0IG9mIENvbnRleHQgdnMgVm93ZWwNCmBgYHtyIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIGVycm9yPUZBTFNFfQ0KY29tcGFyZU1MKHBoYXIuZ2FtLkFSLk1MLk1pbi5Db250ZXh0LHBoYXIuZ2FtLkFSLk1MLk1pbi5Db250ZXh0QW5kVm93ZWwpDQpgYGANCg0KRnJvbSB0aGUgcmVzdWx0cyBhYm92ZSwgYm90aCAiY29udGV4dCIgYW5kICJ2b3dlbCIgYXJlIGltcHJvdmluZyB0aGUgbW9kZWwgZml0LiAiQ29udGV4dCIgaXMgaW1wcm92aW5nIHRoZSBtb2RlbCBmaXQgbW9yZSB0aGFuICJ2b3dlbCIgKHNlZSAzcmQgY29tcGFyaXNvbikNCg0KIyMgVmlzdWFsaXNpbmcgc21vb3RocyBmcm9tIHNlY29uZCBBdXRvcmVncmVzc2l2ZSBHQU0NCldlIHVzZSB0aGUgZnVuY3Rpb24gaXRzYWR1Zzo6cGxvdF9zbW9vdGggdG8gcGxvdCB0aGUgZml2ZSBzbW9vdGhzIGZvciBjb250ZXh0ICJwbGFpbiIsICJ2ZWxhciIsICJ1dnVsYXIiLCAicGhhcnluZ2VhbGlzZWQiIGFuZCAicGhhcnluZ2VhbCIsIGluIGVhY2ggb2YgdGhlIHZvd2VsIGNvbnRleHRzIC9pOiBhOiB1Oi8gYXQgdGhlIG9uc2V0LCBtaWRwb2ludCBhbmQgb2Zmc2V0Lg0KDQpUaGUgcmVzdWx0cyBzaG93IHRoYXQgYXQgdGhlIG1pZHBvaW50IGFuZCBvZmZzZXQsIHRoZSB0aHJlZSBjb250ZXh0cywgdXZ1bGFyLCBwaGFyeW5nZWFsaXNlZCBhbmQgcGhhcnluZ2VhbCBhcmUgZGlmZmVyZW50IGZyb20gZWFjaCBvdGhlcjogdXZ1bGFyIGhhcyBhIGhpZ2hlciB0b25ndWUgcG9zaXRpb24gKHkgY29vcmRpbmF0ZSk7IGludGVybWVkaWF0ZSBpbiBwaGFyeW5nZWFsaXNlZCBhbmQgbG93ZXIgYW5kIGZyb250ZWQgaW4gcGhhcnluZ2VhbC4gQXQgdGhlIG9uc2V0LCB0aGUgc2FtZSBwYXR0ZXJuIGlzIHNlZSB0aG91Z2ggdG8gYSBsb3dlciBkZWdyZWUgaW4gL2E6Ly4NCg0KIyMjIFZvd2VsIC9pOi8NCg0KIyMjIyBPbnNldA0KYGBge3Igd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgZXJyb3I9RkFMU0V9DQpwbG90X3Ntb290aChwaGFyLmdhbS5BUiwgdmlldyA9ICJGYW4iLGNvbmQgPSBsaXN0KGNvbnRleHQub3JkPSJwbGFpbiIsdm93ZWwub3JkPSJpaSIsdGltZT0xKSxjb2w9ImRhcmttYWdlbnRhIix5bGltID0gYygxMCw2NSkseWxhYj0iIix4bGFiPSIiLA0KICAgICAgICAgICAgbWFpbj0iR0FNIHNtb290aHMgaW4gL2k6LyBhdCBPbnNldCIsaGlkZS5sYWJlbD1ULGNleC5heGlzPTEuMyxybS5yYW5lZj1UKQ0KcGxvdF9zbW9vdGgocGhhci5nYW0uQVIsIHZpZXcgPSAiRmFuIixjb25kID0gbGlzdChjb250ZXh0Lm9yZD0idmVsYXIiLHZvd2VsLm9yZD0iaWkiLHRpbWU9MSksY29sPSJncmF5NzAiLGFkZD1UUlVFLHlsaW0gPSBjKDEwLDY1KSxoaWRlLmxhYmVsPVQsY2V4LmF4aXM9MS4zLHJtLnJhbmVmPVQpDQpwbG90X3Ntb290aChwaGFyLmdhbS5BUiwgdmlldyA9ICJGYW4iLGNvbmQgPSBsaXN0KGNvbnRleHQub3JkPSJ1dnVsYXIiLHZvd2VsLm9yZD0iaWkiLHRpbWU9MSksY29sPSJncmVlbiIsYWRkPVRSVUUseWxpbSA9IGMoMTAsNjUpLGhpZGUubGFiZWw9VCxjZXguYXhpcz0xLjMscm0ucmFuZWY9VCkNCnBsb3Rfc21vb3RoKHBoYXIuZ2FtLkFSLCB2aWV3ID0gIkZhbiIsY29uZCA9IGxpc3QoY29udGV4dC5vcmQ9InBoYXJ5bmdlYWxpc2VkIix2b3dlbC5vcmQ9ImlpIix0aW1lPTEpLGNvbD0icmVkIixhZGQ9VFJVRSx5bGltID0gYygxMCw2NSksaGlkZS5sYWJlbD1ULGNleC5heGlzPTEuMyxybS5yYW5lZj1UKQ0KcGxvdF9zbW9vdGgocGhhci5nYW0uQVIsIHZpZXcgPSAiRmFuIixjb25kID0gbGlzdChjb250ZXh0Lm9yZD0icGhhcnluZ2VhbCIsdm93ZWwub3JkPSJpaSIsdGltZT0xKSxjb2w9ImJsdWUiLGFkZD1UUlVFLHlsaW0gPSBjKDEwLDY1KSxoaWRlLmxhYmVsPVQsY2V4LmF4aXM9MS4zLHJtLnJhbmVmPVQpDQpsZWdlbmQoInRvcGxlZnQiLCBsZWdlbmQ9YygiUGxhaW4iLCAiVmVsYXIiLCAiVXZ1bGFyIiwiUGhhcnluZ2VhbGlzZWQiLCJQaGFyeW5nZWFsIiksIA0KICAgICAgIGNvbD1jKCJkYXJrbWFnZW50YSIsImdyYXk3MCIsImdyZWVuIiwicmVkIiwiYmx1ZSIpLCBsd2Q9NCkNCmBgYA0KDQojIyMjIE1pZHBvaW50DQpgYGB7ciB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCBlcnJvcj1GQUxTRX0NCnBsb3Rfc21vb3RoKHBoYXIuZ2FtLkFSLCB2aWV3ID0gIkZhbiIsY29uZCA9IGxpc3QoY29udGV4dC5vcmQ9InBsYWluIix2b3dlbC5vcmQ9ImlpIix0aW1lPTIpLGNvbD0iZGFya21hZ2VudGEiLHlsaW0gPSBjKDEwLDY1KSx5bGFiPSIiLHhsYWI9IiIsDQogICAgICAgICAgICBtYWluPSJHQU0gc21vb3RocyBpbiAvaTovIGF0IE1pZCIsaGlkZS5sYWJlbD1ULGNleC5heGlzPTEuMyxybS5yYW5lZj1UKQ0KcGxvdF9zbW9vdGgocGhhci5nYW0uQVIsIHZpZXcgPSAiRmFuIixjb25kID0gbGlzdChjb250ZXh0Lm9yZD0idmVsYXIiLHZvd2VsLm9yZD0iaWkiLHRpbWU9MiksY29sPSJncmF5NzAiLGFkZD1UUlVFLHlsaW0gPSBjKDEwLDY1KSxoaWRlLmxhYmVsPVQsY2V4LmF4aXM9MS4zLHJtLnJhbmVmPVQpDQpwbG90X3Ntb290aChwaGFyLmdhbS5BUiwgdmlldyA9ICJGYW4iLGNvbmQgPSBsaXN0KGNvbnRleHQub3JkPSJ1dnVsYXIiLHZvd2VsLm9yZD0iaWkiLHRpbWU9MiksY29sPSJncmVlbiIsYWRkPVRSVUUseWxpbSA9IGMoMTAsNjUpLGhpZGUubGFiZWw9VCxjZXguYXhpcz0xLjMscm0ucmFuZWY9VCkNCnBsb3Rfc21vb3RoKHBoYXIuZ2FtLkFSLCB2aWV3ID0gIkZhbiIsY29uZCA9IGxpc3QoY29udGV4dC5vcmQ9InBoYXJ5bmdlYWxpc2VkIix2b3dlbC5vcmQ9ImlpIix0aW1lPTIpLGNvbD0icmVkIixhZGQ9VFJVRSx5bGltID0gYygxMCw2NSksaGlkZS5sYWJlbD1ULGNleC5heGlzPTEuMyxybS5yYW5lZj1UKQ0KcGxvdF9zbW9vdGgocGhhci5nYW0uQVIsIHZpZXcgPSAiRmFuIixjb25kID0gbGlzdChjb250ZXh0Lm9yZD0icGhhcnluZ2VhbCIsdm93ZWwub3JkPSJpaSIsdGltZT0yKSxjb2w9ImJsdWUiLGFkZD1UUlVFLHlsaW0gPSBjKDEwLDY1KSxoaWRlLmxhYmVsPVQsY2V4LmF4aXM9MS4zLHJtLnJhbmVmPVQpDQpsZWdlbmQoInRvcGxlZnQiLCBsZWdlbmQ9YygiUGxhaW4iLCAiVmVsYXIiLCAiVXZ1bGFyIiwiUGhhcnluZ2VhbGlzZWQiLCJQaGFyeW5nZWFsIiksIA0KICAgICAgIGNvbD1jKCJkYXJrbWFnZW50YSIsImdyYXk3MCIsImdyZWVuIiwicmVkIiwiYmx1ZSIpLCBsd2Q9NCkNCmBgYA0KDQojIyMjIE9mZnNldA0KYGBge3Igd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgZXJyb3I9RkFMU0V9DQpwbG90X3Ntb290aChwaGFyLmdhbS5BUiwgdmlldyA9ICJGYW4iLGNvbmQgPSBsaXN0KGNvbnRleHQub3JkPSJwbGFpbiIsdm93ZWwub3JkPSJpaSIsdGltZT0zKSxjb2w9ImRhcmttYWdlbnRhIix5bGltID0gYygxMCw2NSkseWxhYj0iIix4bGFiPSIiLA0KICAgICAgICAgICAgbWFpbj0iR0FNIHNtb290aHMgaW4gL2k6LyBhdCBPZmZzZXQiLGhpZGUubGFiZWw9VCxjZXguYXhpcz0xLjMscm0ucmFuZWY9VCkNCnBsb3Rfc21vb3RoKHBoYXIuZ2FtLkFSLCB2aWV3ID0gIkZhbiIsY29uZCA9IGxpc3QoY29udGV4dC5vcmQ9InZlbGFyIix2b3dlbC5vcmQ9ImlpIix0aW1lPTMpLGNvbD0iZ3JheTcwIixhZGQ9VFJVRSx5bGltID0gYygxMCw2NSksaGlkZS5sYWJlbD1ULGNleC5heGlzPTEuMyxybS5yYW5lZj1UKQ0KcGxvdF9zbW9vdGgocGhhci5nYW0uQVIsIHZpZXcgPSAiRmFuIixjb25kID0gbGlzdChjb250ZXh0Lm9yZD0idXZ1bGFyIix2b3dlbC5vcmQ9ImlpIix0aW1lPTMpLGNvbD0iZ3JlZW4iLGFkZD1UUlVFLHlsaW0gPSBjKDEwLDY1KSxoaWRlLmxhYmVsPVQsY2V4LmF4aXM9MS4zLHJtLnJhbmVmPVQpDQpwbG90X3Ntb290aChwaGFyLmdhbS5BUiwgdmlldyA9ICJGYW4iLGNvbmQgPSBsaXN0KGNvbnRleHQub3JkPSJwaGFyeW5nZWFsaXNlZCIsdm93ZWwub3JkPSJpaSIsdGltZT0zKSxjb2w9InJlZCIsYWRkPVRSVUUseWxpbSA9IGMoMTAsNjUpLGhpZGUubGFiZWw9VCxjZXguYXhpcz0xLjMscm0ucmFuZWY9VCkNCnBsb3Rfc21vb3RoKHBoYXIuZ2FtLkFSLCB2aWV3ID0gIkZhbiIsY29uZCA9IGxpc3QoY29udGV4dC5vcmQ9InBoYXJ5bmdlYWwiLHZvd2VsLm9yZD0iaWkiLHRpbWU9MyksY29sPSJibHVlIixhZGQ9VFJVRSx5bGltID0gYygxMCw2NSksaGlkZS5sYWJlbD1ULGNleC5heGlzPTEuMyxybS5yYW5lZj1UKQ0KbGVnZW5kKCJ0b3BsZWZ0IiwgbGVnZW5kPWMoIlBsYWluIiwgIlZlbGFyIiwgIlV2dWxhciIsIlBoYXJ5bmdlYWxpc2VkIiwiUGhhcnluZ2VhbCIpLCANCiAgICAgICBjb2w9YygiZGFya21hZ2VudGEiLCJncmF5NzAiLCJncmVlbiIsInJlZCIsImJsdWUiKSwgbHdkPTQpDQpgYGANCg0KIyMjIFZvd2VsIC9hOi8NCg0KIyMjIyBPbnNldA0KYGBge3Igd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgZXJyb3I9RkFMU0V9DQpwbG90X3Ntb290aChwaGFyLmdhbS5BUiwgdmlldyA9ICJGYW4iLGNvbmQgPSBsaXN0KGNvbnRleHQub3JkPSJwbGFpbiIsdm93ZWwub3JkPSJhYSIsdGltZT0xKSxjb2w9ImRhcmttYWdlbnRhIix5bGltID0gYygxMCw2NSkseWxhYj0iIix4bGFiPSIiLA0KICAgICAgICAgICAgbWFpbj0iR0FNIHNtb290aHMgaW4gL2E6LyBhdCBPbnNldCIsaGlkZS5sYWJlbD1ULGNleC5heGlzPTEuMyxybS5yYW5lZj1UKQ0KcGxvdF9zbW9vdGgocGhhci5nYW0uQVIsIHZpZXcgPSAiRmFuIixjb25kID0gbGlzdChjb250ZXh0Lm9yZD0idmVsYXIiLHZvd2VsLm9yZD0iYWEiLHRpbWU9MSksY29sPSJncmF5NzAiLGFkZD1UUlVFLHlsaW0gPSBjKDEwLDY1KSxoaWRlLmxhYmVsPVQsY2V4LmF4aXM9MS4zLHJtLnJhbmVmPVQpDQpwbG90X3Ntb290aChwaGFyLmdhbS5BUiwgdmlldyA9ICJGYW4iLGNvbmQgPSBsaXN0KGNvbnRleHQub3JkPSJ1dnVsYXIiLHZvd2VsLm9yZD0iYWEiLHRpbWU9MSksY29sPSJncmVlbiIsYWRkPVRSVUUseWxpbSA9IGMoMTAsNjUpLGhpZGUubGFiZWw9VCxjZXguYXhpcz0xLjMscm0ucmFuZWY9VCkNCnBsb3Rfc21vb3RoKHBoYXIuZ2FtLkFSLCB2aWV3ID0gIkZhbiIsY29uZCA9IGxpc3QoY29udGV4dC5vcmQ9InBoYXJ5bmdlYWxpc2VkIix2b3dlbC5vcmQ9ImFhIix0aW1lPTEpLGNvbD0icmVkIixhZGQ9VFJVRSx5bGltID0gYygxMCw2NSksaGlkZS5sYWJlbD1ULGNleC5heGlzPTEuMyxybS5yYW5lZj1UKQ0KcGxvdF9zbW9vdGgocGhhci5nYW0uQVIsIHZpZXcgPSAiRmFuIixjb25kID0gbGlzdChjb250ZXh0Lm9yZD0icGhhcnluZ2VhbCIsdm93ZWwub3JkPSJhYSIsdGltZT0xKSxjb2w9ImJsdWUiLGFkZD1UUlVFLHlsaW0gPSBjKDEwLDY1KSxoaWRlLmxhYmVsPVQsY2V4LmF4aXM9MS4zLHJtLnJhbmVmPVQpDQpsZWdlbmQoInRvcGxlZnQiLCBsZWdlbmQ9YygiUGxhaW4iLCAiVmVsYXIiLCAiVXZ1bGFyIiwiUGhhcnluZ2VhbGlzZWQiLCJQaGFyeW5nZWFsIiksIA0KICAgICAgIGNvbD1jKCJkYXJrbWFnZW50YSIsImdyYXk3MCIsImdyZWVuIiwicmVkIiwiYmx1ZSIpLCBsd2Q9NCkNCmBgYA0KDQojIyMjIE1pZHBvaW50DQpgYGB7ciB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCBlcnJvcj1GQUxTRX0NCnBsb3Rfc21vb3RoKHBoYXIuZ2FtLkFSLCB2aWV3ID0gIkZhbiIsY29uZCA9IGxpc3QoY29udGV4dC5vcmQ9InBsYWluIix2b3dlbC5vcmQ9ImFhIix0aW1lPTIpLGNvbD0iZGFya21hZ2VudGEiLHlsaW0gPSBjKDEwLDY1KSx5bGFiPSIiLHhsYWI9IiIsDQogICAgICAgICAgICBtYWluPSJHQU0gc21vb3RocyBpbiAvYTovIGF0IE1pZCIsaGlkZS5sYWJlbD1ULGNleC5heGlzPTEuMyxybS5yYW5lZj1UKQ0KcGxvdF9zbW9vdGgocGhhci5nYW0uQVIsIHZpZXcgPSAiRmFuIixjb25kID0gbGlzdChjb250ZXh0Lm9yZD0idmVsYXIiLHZvd2VsLm9yZD0iYWEiLHRpbWU9MiksY29sPSJncmF5NzAiLGFkZD1UUlVFLHlsaW0gPSBjKDEwLDY1KSxoaWRlLmxhYmVsPVQsY2V4LmF4aXM9MS4zLHJtLnJhbmVmPVQpDQpwbG90X3Ntb290aChwaGFyLmdhbS5BUiwgdmlldyA9ICJGYW4iLGNvbmQgPSBsaXN0KGNvbnRleHQub3JkPSJ1dnVsYXIiLHZvd2VsLm9yZD0iYWEiLHRpbWU9MiksY29sPSJncmVlbiIsYWRkPVRSVUUseWxpbSA9IGMoMTAsNjUpLGhpZGUubGFiZWw9VCxjZXguYXhpcz0xLjMscm0ucmFuZWY9VCkNCnBsb3Rfc21vb3RoKHBoYXIuZ2FtLkFSLCB2aWV3ID0gIkZhbiIsY29uZCA9IGxpc3QoY29udGV4dC5vcmQ9InBoYXJ5bmdlYWxpc2VkIix2b3dlbC5vcmQ9ImFhIix0aW1lPTIpLGNvbD0icmVkIixhZGQ9VFJVRSx5bGltID0gYygxMCw2NSksaGlkZS5sYWJlbD1ULGNleC5heGlzPTEuMyxybS5yYW5lZj1UKQ0KcGxvdF9zbW9vdGgocGhhci5nYW0uQVIsIHZpZXcgPSAiRmFuIixjb25kID0gbGlzdChjb250ZXh0Lm9yZD0icGhhcnluZ2VhbCIsdm93ZWwub3JkPSJhYSIsdGltZT0yKSxjb2w9ImJsdWUiLGFkZD1UUlVFLHlsaW0gPSBjKDEwLDY1KSxoaWRlLmxhYmVsPVQsY2V4LmF4aXM9MS4zLHJtLnJhbmVmPVQpDQpsZWdlbmQoInRvcGxlZnQiLCBsZWdlbmQ9YygiUGxhaW4iLCAiVmVsYXIiLCAiVXZ1bGFyIiwiUGhhcnluZ2VhbGlzZWQiLCJQaGFyeW5nZWFsIiksIA0KICAgICAgIGNvbD1jKCJkYXJrbWFnZW50YSIsImdyYXk3MCIsImdyZWVuIiwicmVkIiwiYmx1ZSIpLCBsd2Q9NCkNCmBgYA0KDQojIyMjIE9mZnNldA0KYGBge3Igd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgZXJyb3I9RkFMU0V9DQpwbG90X3Ntb290aChwaGFyLmdhbS5BUiwgdmlldyA9ICJGYW4iLGNvbmQgPSBsaXN0KGNvbnRleHQub3JkPSJwbGFpbiIsdm93ZWwub3JkPSJhYSIsdGltZT0zKSxjb2w9ImRhcmttYWdlbnRhIix5bGltID0gYygxMCw2NSkseWxhYj0iIix4bGFiPSIiLA0KICAgICAgICAgICAgbWFpbj0iR0FNIHNtb290aHMgaW4gL2E6LyBhdCBPZmZzZXQiLGhpZGUubGFiZWw9VCxjZXguYXhpcz0xLjMscm0ucmFuZWY9VCkNCnBsb3Rfc21vb3RoKHBoYXIuZ2FtLkFSLCB2aWV3ID0gIkZhbiIsY29uZCA9IGxpc3QoY29udGV4dC5vcmQ9InZlbGFyIix2b3dlbC5vcmQ9ImFhIix0aW1lPTMpLGNvbD0iZ3JheTcwIixhZGQ9VFJVRSx5bGltID0gYygxMCw2NSksaGlkZS5sYWJlbD1ULGNleC5heGlzPTEuMyxybS5yYW5lZj1UKQ0KcGxvdF9zbW9vdGgocGhhci5nYW0uQVIsIHZpZXcgPSAiRmFuIixjb25kID0gbGlzdChjb250ZXh0Lm9yZD0idXZ1bGFyIix2b3dlbC5vcmQ9ImFhIix0aW1lPTMpLGNvbD0iZ3JlZW4iLGFkZD1UUlVFLHlsaW0gPSBjKDEwLDY1KSxoaWRlLmxhYmVsPVQsY2V4LmF4aXM9MS4zLHJtLnJhbmVmPVQpDQpwbG90X3Ntb290aChwaGFyLmdhbS5BUiwgdmlldyA9ICJGYW4iLGNvbmQgPSBsaXN0KGNvbnRleHQub3JkPSJwaGFyeW5nZWFsaXNlZCIsdm93ZWwub3JkPSJhYSIsdGltZT0zKSxjb2w9InJlZCIsYWRkPVRSVUUseWxpbSA9IGMoMTAsNjUpLGhpZGUubGFiZWw9VCxjZXguYXhpcz0xLjMscm0ucmFuZWY9VCkNCnBsb3Rfc21vb3RoKHBoYXIuZ2FtLkFSLCB2aWV3ID0gIkZhbiIsY29uZCA9IGxpc3QoY29udGV4dC5vcmQ9InBoYXJ5bmdlYWwiLHZvd2VsLm9yZD0iYWEiLHRpbWU9MyksY29sPSJibHVlIixhZGQ9VFJVRSx5bGltID0gYygxMCw2NSksaGlkZS5sYWJlbD1ULGNleC5heGlzPTEuMyxybS5yYW5lZj1UKQ0KbGVnZW5kKCJ0b3BsZWZ0IiwgbGVnZW5kPWMoIlBsYWluIiwgIlZlbGFyIiwgIlV2dWxhciIsIlBoYXJ5bmdlYWxpc2VkIiwiUGhhcnluZ2VhbCIpLCANCiAgICAgICBjb2w9YygiZGFya21hZ2VudGEiLCJncmF5NzAiLCJncmVlbiIsInJlZCIsImJsdWUiKSwgbHdkPTQpDQpgYGANCg0KIyMjIFZvd2VsIC91Oi8NCg0KIyMjIyBPbnNldA0KYGBge3Igd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgZXJyb3I9RkFMU0V9DQpwbG90X3Ntb290aChwaGFyLmdhbS5BUiwgdmlldyA9ICJGYW4iLGNvbmQgPSBsaXN0KGNvbnRleHQub3JkPSJwbGFpbiIsdm93ZWwub3JkPSJ1dSIsdGltZT0xKSxjb2w9ImRhcmttYWdlbnRhIix5bGltID0gYygxMCw2NSkseWxhYj0iIix4bGFiPSIiLA0KICAgICAgICAgICAgbWFpbj0iR0FNIHNtb290aHMgaW4gL3U6LyBhdCBPbnNldCIsaGlkZS5sYWJlbD1ULGNleC5heGlzPTEuMyxybS5yYW5lZj1UKQ0KcGxvdF9zbW9vdGgocGhhci5nYW0uQVIsIHZpZXcgPSAiRmFuIixjb25kID0gbGlzdChjb250ZXh0Lm9yZD0idmVsYXIiLHZvd2VsLm9yZD0idXUiLHRpbWU9MSksY29sPSJncmF5NzAiLGFkZD1UUlVFLHlsaW0gPSBjKDEwLDY1KSxoaWRlLmxhYmVsPVQsY2V4LmF4aXM9MS4zLHJtLnJhbmVmPVQpDQpwbG90X3Ntb290aChwaGFyLmdhbS5BUiwgdmlldyA9ICJGYW4iLGNvbmQgPSBsaXN0KGNvbnRleHQub3JkPSJ1dnVsYXIiLHZvd2VsLm9yZD0idXUiLHRpbWU9MSksY29sPSJncmVlbiIsYWRkPVRSVUUseWxpbSA9IGMoMTAsNjUpLGhpZGUubGFiZWw9VCxjZXguYXhpcz0xLjMscm0ucmFuZWY9VCkNCnBsb3Rfc21vb3RoKHBoYXIuZ2FtLkFSLCB2aWV3ID0gIkZhbiIsY29uZCA9IGxpc3QoY29udGV4dC5vcmQ9InBoYXJ5bmdlYWxpc2VkIix2b3dlbC5vcmQ9InV1Iix0aW1lPTEpLGNvbD0icmVkIixhZGQ9VFJVRSx5bGltID0gYygxMCw2NSksaGlkZS5sYWJlbD1ULGNleC5heGlzPTEuMyxybS5yYW5lZj1UKQ0KcGxvdF9zbW9vdGgocGhhci5nYW0uQVIsIHZpZXcgPSAiRmFuIixjb25kID0gbGlzdChjb250ZXh0Lm9yZD0icGhhcnluZ2VhbCIsdm93ZWwub3JkPSJ1dSIsdGltZT0xKSxjb2w9ImJsdWUiLGFkZD1UUlVFLHlsaW0gPSBjKDEwLDY1KSxoaWRlLmxhYmVsPVQsY2V4LmF4aXM9MS4zLHJtLnJhbmVmPVQpDQpsZWdlbmQoInRvcGxlZnQiLCBsZWdlbmQ9YygiUGxhaW4iLCAiVmVsYXIiLCAiVXZ1bGFyIiwiUGhhcnluZ2VhbGlzZWQiLCJQaGFyeW5nZWFsIiksIA0KICAgICAgIGNvbD1jKCJkYXJrbWFnZW50YSIsImdyYXk3MCIsImdyZWVuIiwicmVkIiwiYmx1ZSIpLCBsd2Q9NCkNCmBgYA0KDQojIyMjIE1pZHBvaW50DQpgYGB7ciB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCBlcnJvcj1GQUxTRX0NCnBsb3Rfc21vb3RoKHBoYXIuZ2FtLkFSLCB2aWV3ID0gIkZhbiIsY29uZCA9IGxpc3QoY29udGV4dC5vcmQ9InBsYWluIix2b3dlbC5vcmQ9InV1Iix0aW1lPTIpLGNvbD0iZGFya21hZ2VudGEiLHlsaW0gPSBjKDEwLDY1KSx5bGFiPSIiLHhsYWI9IiIsDQogICAgICAgICAgICBtYWluPSJHQU0gc21vb3RocyBpbiAvdTovIGF0IE1pZCIsaGlkZS5sYWJlbD1ULGNleC5heGlzPTEuMyxybS5yYW5lZj1UKQ0KcGxvdF9zbW9vdGgocGhhci5nYW0uQVIsIHZpZXcgPSAiRmFuIixjb25kID0gbGlzdChjb250ZXh0Lm9yZD0idmVsYXIiLHZvd2VsLm9yZD0idXUiLHRpbWU9MiksY29sPSJncmF5NzAiLGFkZD1UUlVFLHlsaW0gPSBjKDEwLDY1KSxoaWRlLmxhYmVsPVQsY2V4LmF4aXM9MS4zLHJtLnJhbmVmPVQpDQpwbG90X3Ntb290aChwaGFyLmdhbS5BUiwgdmlldyA9ICJGYW4iLGNvbmQgPSBsaXN0KGNvbnRleHQub3JkPSJ1dnVsYXIiLHZvd2VsLm9yZD0idXUiLHRpbWU9MiksY29sPSJncmVlbiIsYWRkPVRSVUUseWxpbSA9IGMoMTAsNjUpLGhpZGUubGFiZWw9VCxjZXguYXhpcz0xLjMscm0ucmFuZWY9VCkNCnBsb3Rfc21vb3RoKHBoYXIuZ2FtLkFSLCB2aWV3ID0gIkZhbiIsY29uZCA9IGxpc3QoY29udGV4dC5vcmQ9InBoYXJ5bmdlYWxpc2VkIix2b3dlbC5vcmQ9InV1Iix0aW1lPTIpLGNvbD0icmVkIixhZGQ9VFJVRSx5bGltID0gYygxMCw2NSksaGlkZS5sYWJlbD1ULGNleC5heGlzPTEuMyxybS5yYW5lZj1UKQ0KcGxvdF9zbW9vdGgocGhhci5nYW0uQVIsIHZpZXcgPSAiRmFuIixjb25kID0gbGlzdChjb250ZXh0Lm9yZD0icGhhcnluZ2VhbCIsdm93ZWwub3JkPSJ1dSIsdGltZT0yKSxjb2w9ImJsdWUiLGFkZD1UUlVFLHlsaW0gPSBjKDEwLDY1KSxoaWRlLmxhYmVsPVQsY2V4LmF4aXM9MS4zLHJtLnJhbmVmPVQpDQpsZWdlbmQoInRvcGxlZnQiLCBsZWdlbmQ9YygiUGxhaW4iLCAiVmVsYXIiLCAiVXZ1bGFyIiwiUGhhcnluZ2VhbGlzZWQiLCJQaGFyeW5nZWFsIiksIA0KICAgICAgIGNvbD1jKCJkYXJrbWFnZW50YSIsImdyYXk3MCIsImdyZWVuIiwicmVkIiwiYmx1ZSIpLCBsd2Q9NCkNCmBgYA0KDQojIyMjIE9mZnNldA0KYGBge3Igd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgZXJyb3I9RkFMU0V9DQoNCnBsb3Rfc21vb3RoKHBoYXIuZ2FtLkFSLCB2aWV3ID0gIkZhbiIsY29uZCA9IGxpc3QoY29udGV4dC5vcmQ9InBsYWluIix2b3dlbC5vcmQ9InV1Iix0aW1lPTMpLGNvbD0iZGFya21hZ2VudGEiLHlsaW0gPSBjKDEwLDY1KSx5bGFiPSIiLHhsYWI9IiIsDQogICAgICAgICAgICBtYWluPSJHQU0gc21vb3RocyBpbiAvdTovIGF0IE9mZnNldCIsaGlkZS5sYWJlbD1ULGNleC5heGlzPTEuMyxybS5yYW5lZj1UKQ0KcGxvdF9zbW9vdGgocGhhci5nYW0uQVIsIHZpZXcgPSAiRmFuIixjb25kID0gbGlzdChjb250ZXh0Lm9yZD0idmVsYXIiLHZvd2VsLm9yZD0idXUiLHRpbWU9MyksY29sPSJncmF5NzAiLGFkZD1UUlVFLHlsaW0gPSBjKDEwLDY1KSxoaWRlLmxhYmVsPVQsY2V4LmF4aXM9MS4zLHJtLnJhbmVmPVQpDQpwbG90X3Ntb290aChwaGFyLmdhbS5BUiwgdmlldyA9ICJGYW4iLGNvbmQgPSBsaXN0KGNvbnRleHQub3JkPSJ1dnVsYXIiLHZvd2VsLm9yZD0idXUiLHRpbWU9MyksY29sPSJncmVlbiIsYWRkPVRSVUUseWxpbSA9IGMoMTAsNjUpLGhpZGUubGFiZWw9VCxjZXguYXhpcz0xLjMscm0ucmFuZWY9VCkNCnBsb3Rfc21vb3RoKHBoYXIuZ2FtLkFSLCB2aWV3ID0gIkZhbiIsY29uZCA9IGxpc3QoY29udGV4dC5vcmQ9InBoYXJ5bmdlYWxpc2VkIix2b3dlbC5vcmQ9InV1Iix0aW1lPTMpLGNvbD0icmVkIixhZGQ9VFJVRSx5bGltID0gYygxMCw2NSksaGlkZS5sYWJlbD1ULGNleC5heGlzPTEuMyxybS5yYW5lZj1UKQ0KcGxvdF9zbW9vdGgocGhhci5nYW0uQVIsIHZpZXcgPSAiRmFuIixjb25kID0gbGlzdChjb250ZXh0Lm9yZD0icGhhcnluZ2VhbCIsdm93ZWwub3JkPSJ1dSIsdGltZT0zKSxjb2w9ImJsdWUiLGFkZD1UUlVFLHlsaW0gPSBjKDEwLDY1KSxoaWRlLmxhYmVsPVQsY2V4LmF4aXM9MS4zLHJtLnJhbmVmPVQpDQpsZWdlbmQoInRvcGxlZnQiLCBsZWdlbmQ9YygiUGxhaW4iLCAiVmVsYXIiLCAiVXZ1bGFyIiwiUGhhcnluZ2VhbGlzZWQiLCJQaGFyeW5nZWFsIiksIA0KICAgICAgIGNvbD1jKCJkYXJrbWFnZW50YSIsImdyYXk3MCIsImdyZWVuIiwicmVkIiwiYmx1ZSIpLCBsd2Q9NCkNCg0KDQpgYGANCg0KIyMgVmlzdWFsaXNpbmcgRGlmZmVyZW5jZSBzbW9vdGhzIGZyb20gc2Vjb25kIEF1dG9yZWdyZXNzaXZlIEdBTQ0KV2UgdXNlIHRoZSBmdW5jdGlvbiBpdHNhZHVnOjpwbG90X2RpZmYgdG8gcGxvdCB0aGUgZGlmZmVyZW5jZXMgYmV0d2VlbiB0aGUgZm9sbG93aW5nIHBhaXJzOiAicGhhcnluZ2VhbGlzZWQiIHZzICJwbGFpbiI7ICJ1dnVsYXIiIHZzICJwaGFyeW5nZWFsaXNlZCIgYW5kICJwaGFyeW5nZWFsaXNlZCIgdnMgInBoYXJ5bmdlYWwiLCBpbiBlYWNoIG9mIHRoZSB2b3dlbCBjb250ZXh0cyAvaTogYTogdTovIGF0IHRoZSBvbnNldCwgbWlkcG9pbnQgYW5kIG9mZnNldC4NCg0KVGhlIHJlc3VsdHMgc2hvdyB0aGF0OiANCg0KMS4gUGhhcnluZ2VhbGlzZWQgdnMgUGxhaW46IHBoYXJ5bmdlYWxpc2VkIGlzIGRpZmZlcmVudCBpbiB0b25ndWUgc2hhcGUuIFRoZXJlIGlzIGFuIGluY3JlYXNlIGluIHkgY29vcmRpbmF0ZXMgKEZhbiAxNS0yMikgaW5kaWNhdGluZyAicmV0cmFjdGlvbiIsIGRlY3JlYXNlIChGYW4gMjUtMzUpIGluZGljYXRpbmcgImRlcHJlc3Npb24iIG9mIHRoZSB0b25ndWUgYW5kIHBvdGVudGlhbCBkaWZmZXJlbmNlIGluIGxhcnlueCBoZWlnaHQgKEZhbiA1LTEwKQ0KMi4gVXZ1bGFyIHZzIFBoYXJ5bmdlYWxpc2VkOiBkaWZmZXJlbmNlcyBkZXBlbmQgb2Ygdm93ZWxzIChGYW4gMTUtMzQpOiB1dnVsYXIgaXMgZnJvbnRlciBpbiAvaTovIChGYW4gMjItMzQpOyAicmFpc2VkIiBpbiAvYTovIChGYW4gMjItMjgpIGFuZCAvdTovIChGYW4gMTUtMjUpDQozLiBQaGFyeW5nZWFsaXNlZCB2cyBQaGFyeW5nZWFsOiBQaGFyeW5nZWFsaXNlZCBpcyAicmV0cmFjdGVkIi9iYWNrZWQgdG8gbWlkLXBvc2l0aW9uIChGYW4gMTUtMjUpLCB3aXRoICJkZXByZXNzaW9uIiBvZiB0aGUgdG9uZ3VlIChGYW4gMjItMzUpIGFuZCBwb3RlbnRpYWwgbG93ZXJlZCBsYXJ5bnggKEZhbiA1LTEwKS4NCg0KIyMjIFBoYXJ5bmdlYWxpc2VkIHZzIFBsYWluDQojIyMjIE9uc2V0DQpgYGB7ciB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCBlcnJvcj1GQUxTRX0NCnBhcihvbWE9YygxLCAwLCAwLCAzLjUpLG1ncD1jKDIsIDEsIDApKQ0KcGxvdF9kaWZmKHBoYXIuZ2FtLkFSLCB2aWV3PSJGYW4iLGNvbXA9bGlzdChjb250ZXh0Lm9yZD1jKCJwaGFyeW5nZWFsaXNlZCIsInBsYWluIikpLA0KICAgICAgICAgIHhsYWI9IiIsY29uZD1saXN0KHRpbWU9MSx2b3dlbC5vcmQ9ImlpIiksbWFpbiA9ICJkaWZmZXJlbmNlIHBoYXJ5bmdlYWxpc2VkIHZzIHBsYWluIE9uc2V0IiwNCiAgICAgICAgICBjb2w9J2dyZWVuJyxjZXgubWFpbj0xLjEsbWFyay5kaWZmID0gVFJVRSxjb2wuZGlmZiA9ICJncmVlbiIsDQogICAgICAgICAgeWxpbT1jKC0xNSwxNSksaGlkZS5sYWJlbD1ULHJtLnJhbmVmPVQpDQoNCnBsb3RfZGlmZihwaGFyLmdhbS5BUiwgdmlldz0iRmFuIixjb21wPWxpc3QoY29udGV4dC5vcmQ9YygicGhhcnluZ2VhbGlzZWQiLCJwbGFpbiIpKSwNCiAgICAgICAgICB4bGFiPSIiLGNvbmQ9bGlzdCh0aW1lPTEsdm93ZWwub3JkPSJhYSIpLGFkZD1UUlVFLA0KICAgICAgICAgIGNvbD0ncmVkJyxtYXJrLmRpZmYgPSAgVFJVRSxjb2wuZGlmZiA9ICJyZWQiLA0KICAgICAgICAgIHlsaW09YygtMTUsMTUpLGhpZGUubGFiZWw9VCxybS5yYW5lZj1UKQ0KDQpwbG90X2RpZmYocGhhci5nYW0uQVIsIHZpZXc9IkZhbiIsY29tcD1saXN0KGNvbnRleHQub3JkPWMoInBoYXJ5bmdlYWxpc2VkIiwicGxhaW4iKSksDQogICAgICAgICAgeGxhYj0iIixjb25kPWxpc3QodGltZT0xLHZvd2VsLm9yZD0idXUiKSxhZGQ9VFJVRSwNCiAgICAgICAgICBjb2w9J2JsdWUnLG1hcmsuZGlmZiA9ICBUUlVFLGNvbC5kaWZmID0gImJsdWUiLA0KICAgICAgICAgIHlsaW09YygtMTUsMTUpLGhpZGUubGFiZWw9VCxybS5yYW5lZj1UKQ0KbGVnZW5kKHBhcigndXNyJylbMl0sIHBhcigndXNyJylbNF0sIGJ0eT0nbicsIHhwZD1OQSxsdHk9MSwgDQogICAgICAgbGVnZW5kPWMoIi9pOi8iLCAiL2E6LyIsICIvdTovIiksY29sPWMoImdyZWVuIiwicmVkIiwiYmx1ZSIpLCBsd2Q9NCwgY2V4PTEuMikNCmBgYA0KDQojIyMjIE1pZHBvaW50DQpgYGB7ciB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCBlcnJvcj1GQUxTRX0NCnBhcihvbWE9YygxLCAwLCAwLCAzLjUpLG1ncD1jKDIsIDEsIDApKQ0KcGxvdF9kaWZmKHBoYXIuZ2FtLkFSLCB2aWV3PSJGYW4iLGNvbXA9bGlzdChjb250ZXh0Lm9yZD1jKCJwaGFyeW5nZWFsaXNlZCIsInBsYWluIikpLA0KICAgICAgICAgIHhsYWI9IiIsY29uZD1saXN0KHRpbWU9Mix2b3dlbC5vcmQ9ImlpIiksbWFpbiA9ICJkaWZmZXJlbmNlIHBoYXJ5bmdlYWxpc2VkIHZzIHBsYWluIE1pZHBvaW50IiwNCiAgICAgICAgICBjb2w9J2dyZWVuJyxjZXgubWFpbj0xLjEsbWFyay5kaWZmID0gVFJVRSxjb2wuZGlmZiA9ICJncmVlbiIsDQogICAgICAgICAgeWxpbT1jKC0xNSwxNSksaGlkZS5sYWJlbD1ULHJtLnJhbmVmPVQpDQoNCnBsb3RfZGlmZihwaGFyLmdhbS5BUiwgdmlldz0iRmFuIixjb21wPWxpc3QoY29udGV4dC5vcmQ9YygicGhhcnluZ2VhbGlzZWQiLCJwbGFpbiIpKSwNCiAgICAgICAgICB4bGFiPSIiLGNvbmQ9bGlzdCh0aW1lPTIsdm93ZWwub3JkPSJhYSIpLGFkZD1UUlVFLA0KICAgICAgICAgIGNvbD0ncmVkJyxtYXJrLmRpZmYgPSAgVFJVRSxjb2wuZGlmZiA9ICJyZWQiLA0KICAgICAgICAgIHlsaW09YygtMTUsMTUpLGhpZGUubGFiZWw9VCxybS5yYW5lZj1UKQ0KDQpwbG90X2RpZmYocGhhci5nYW0uQVIsIHZpZXc9IkZhbiIsY29tcD1saXN0KGNvbnRleHQub3JkPWMoInBoYXJ5bmdlYWxpc2VkIiwicGxhaW4iKSksDQogICAgICAgICAgeGxhYj0iIixjb25kPWxpc3QodGltZT0yLHZvd2VsLm9yZD0idXUiKSxhZGQ9VFJVRSwNCiAgICAgICAgICBjb2w9J2JsdWUnLG1hcmsuZGlmZiA9ICBUUlVFLGNvbC5kaWZmID0gImJsdWUiLA0KICAgICAgICAgIHlsaW09YygtMTUsMTUpLGhpZGUubGFiZWw9VCxybS5yYW5lZj1UKQ0KbGVnZW5kKHBhcigndXNyJylbMl0sIHBhcigndXNyJylbNF0sIGJ0eT0nbicsIHhwZD1OQSxsdHk9MSwgDQogICAgICAgbGVnZW5kPWMoIi9pOi8iLCAiL2E6LyIsICIvdTovIiksY29sPWMoImdyZWVuIiwicmVkIiwiYmx1ZSIpLCBsd2Q9NCwgY2V4PTEuMikNCmBgYA0KDQojIyMjIE9mZnNldA0KYGBge3Igd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgZXJyb3I9RkFMU0V9DQpwYXIob21hPWMoMSwgMCwgMCwgMy41KSxtZ3A9YygyLCAxLCAwKSkNCnBsb3RfZGlmZihwaGFyLmdhbS5BUiwgdmlldz0iRmFuIixjb21wPWxpc3QoY29udGV4dC5vcmQ9YygicGhhcnluZ2VhbGlzZWQiLCJwbGFpbiIpKSwNCiAgICAgICAgICB4bGFiPSIiLGNvbmQ9bGlzdCh0aW1lPTMsdm93ZWwub3JkPSJpaSIpLG1haW4gPSAiZGlmZmVyZW5jZSBwaGFyeW5nZWFsaXNlZCB2cyBwbGFpbiBPZmZzZXQiLA0KICAgICAgICAgIGNvbD0nZ3JlZW4nLGNleC5tYWluPTEuMSxtYXJrLmRpZmYgPSBUUlVFLGNvbC5kaWZmID0gImdyZWVuIiwNCiAgICAgICAgICB5bGltPWMoLTE1LDE1KSxoaWRlLmxhYmVsPVQscm0ucmFuZWY9VCkNCg0KcGxvdF9kaWZmKHBoYXIuZ2FtLkFSLCB2aWV3PSJGYW4iLGNvbXA9bGlzdChjb250ZXh0Lm9yZD1jKCJwaGFyeW5nZWFsaXNlZCIsInBsYWluIikpLA0KICAgICAgICAgIHhsYWI9IiIsY29uZD1saXN0KHRpbWU9Myx2b3dlbC5vcmQ9ImFhIiksYWRkPVRSVUUsDQogICAgICAgICAgY29sPSdyZWQnLG1hcmsuZGlmZiA9ICBUUlVFLGNvbC5kaWZmID0gInJlZCIsDQogICAgICAgICAgeWxpbT1jKC0xNSwxNSksaGlkZS5sYWJlbD1ULHJtLnJhbmVmPVQpDQoNCnBsb3RfZGlmZihwaGFyLmdhbS5BUiwgdmlldz0iRmFuIixjb21wPWxpc3QoY29udGV4dC5vcmQ9YygicGhhcnluZ2VhbGlzZWQiLCJwbGFpbiIpKSwNCiAgICAgICAgICB4bGFiPSIiLGNvbmQ9bGlzdCh0aW1lPTMsdm93ZWwub3JkPSJ1dSIpLGFkZD1UUlVFLA0KICAgICAgICAgIGNvbD0nYmx1ZScsbWFyay5kaWZmID0gIFRSVUUsY29sLmRpZmYgPSAiYmx1ZSIsDQogICAgICAgICAgeWxpbT1jKC0xNSwxNSksaGlkZS5sYWJlbD1ULHJtLnJhbmVmPVQpDQpsZWdlbmQocGFyKCd1c3InKVsyXSwgcGFyKCd1c3InKVs0XSwgYnR5PSduJywgeHBkPU5BLGx0eT0xLCANCiAgICAgICBsZWdlbmQ9YygiL2k6LyIsICIvYTovIiwgIi91Oi8iKSxjb2w9YygiZ3JlZW4iLCJyZWQiLCJibHVlIiksIGx3ZD00LCBjZXg9MS4yKQ0KYGBgDQoNCg0KIyMjIFV2dWxhciB2cyBQaGFyeW5nZWFsaXNlZA0KDQojIyMjIE9uc2V0DQpgYGB7ciB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCBlcnJvcj1GQUxTRX0NCnBhcihvbWE9YygxLCAwLCAwLCAzLjUpLG1ncD1jKDIsIDEsIDApKQ0KcGxvdF9kaWZmKHBoYXIuZ2FtLkFSLCB2aWV3PSJGYW4iLGNvbXA9bGlzdChjb250ZXh0Lm9yZD1jKCJ1dnVsYXIiLCJwaGFyeW5nZWFsaXNlZCIpKSwNCiAgICAgICAgICB4bGFiPSIiLGNvbmQ9bGlzdCh0aW1lPTEsdm93ZWwub3JkPSJpaSIpLG1haW4gPSAiZGlmZmVyZW5jZSB1dnVsYXIgdnMgcGhhcnluZ2VhbGlzZWQgT25zZXQiLA0KICAgICAgICAgIGNvbD0nZ3JlZW4nLGNleC5tYWluPTEuMSxtYXJrLmRpZmYgPSBUUlVFLGNvbC5kaWZmID0gImdyZWVuIiwNCiAgICAgICAgICB5bGltPWMoLTE1LDE1KSxoaWRlLmxhYmVsPVQscm0ucmFuZWY9VCkNCg0KcGxvdF9kaWZmKHBoYXIuZ2FtLkFSLCB2aWV3PSJGYW4iLGNvbXA9bGlzdChjb250ZXh0Lm9yZD1jKCJ1dnVsYXIiLCJwaGFyeW5nZWFsaXNlZCIpKSwNCiAgICAgICAgICB4bGFiPSIiLGNvbmQ9bGlzdCh0aW1lPTEsdm93ZWwub3JkPSJhYSIpLGFkZD1UUlVFLA0KICAgICAgICAgIGNvbD0ncmVkJyxtYXJrLmRpZmYgPSAgVFJVRSxjb2wuZGlmZiA9ICJyZWQiLA0KICAgICAgICAgIHlsaW09YygtMTUsMTUpLGhpZGUubGFiZWw9VCxybS5yYW5lZj1UKQ0KDQpwbG90X2RpZmYocGhhci5nYW0uQVIsIHZpZXc9IkZhbiIsY29tcD1saXN0KGNvbnRleHQub3JkPWMoInV2dWxhciIsInBoYXJ5bmdlYWxpc2VkIikpLA0KICAgICAgICAgIHhsYWI9IiIsY29uZD1saXN0KHRpbWU9MSx2b3dlbC5vcmQ9InV1IiksYWRkPVRSVUUsDQogICAgICAgICAgY29sPSdibHVlJyxtYXJrLmRpZmYgPSAgVFJVRSxjb2wuZGlmZiA9ICJibHVlIiwNCiAgICAgICAgICB5bGltPWMoLTE1LDE1KSxoaWRlLmxhYmVsPVQscm0ucmFuZWY9VCkNCmxlZ2VuZChwYXIoJ3VzcicpWzJdLCBwYXIoJ3VzcicpWzRdLCBidHk9J24nLCB4cGQ9TkEsbHR5PTEsIA0KICAgICAgIGxlZ2VuZD1jKCIvaTovIiwgIi9hOi8iLCAiL3U6LyIpLGNvbD1jKCJncmVlbiIsInJlZCIsImJsdWUiKSwgbHdkPTQsIGNleD0xLjIpDQoNCmBgYA0KDQojIyMjIE1pZHBvaW50DQpgYGB7ciB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCBlcnJvcj1GQUxTRX0NCnBhcihvbWE9YygxLCAwLCAwLCAzLjUpLG1ncD1jKDIsIDEsIDApKQ0KcGxvdF9kaWZmKHBoYXIuZ2FtLkFSLCB2aWV3PSJGYW4iLGNvbXA9bGlzdChjb250ZXh0Lm9yZD1jKCJ1dnVsYXIiLCJwaGFyeW5nZWFsaXNlZCIpKSwNCiAgICAgICAgICB4bGFiPSIiLGNvbmQ9bGlzdCh0aW1lPTIsdm93ZWwub3JkPSJpaSIpLG1haW4gPSAiZGlmZmVyZW5jZSB1dnVsYXIgdnMgcGhhcnluZ2VhbGlzZWQgTWlkcG9pbnQiLA0KICAgICAgICAgIGNvbD0nZ3JlZW4nLGNleC5tYWluPTEuMSxtYXJrLmRpZmYgPSBUUlVFLGNvbC5kaWZmID0gImdyZWVuIiwNCiAgICAgICAgICB5bGltPWMoLTE1LDE1KSxoaWRlLmxhYmVsPVQscm0ucmFuZWY9VCkNCg0KcGxvdF9kaWZmKHBoYXIuZ2FtLkFSLCB2aWV3PSJGYW4iLGNvbXA9bGlzdChjb250ZXh0Lm9yZD1jKCJ1dnVsYXIiLCJwaGFyeW5nZWFsaXNlZCIpKSwNCiAgICAgICAgICB4bGFiPSIiLGNvbmQ9bGlzdCh0aW1lPTIsdm93ZWwub3JkPSJhYSIpLGFkZD1UUlVFLA0KICAgICAgICAgIGNvbD0ncmVkJyxtYXJrLmRpZmYgPSAgVFJVRSxjb2wuZGlmZiA9ICJyZWQiLA0KICAgICAgICAgIHlsaW09YygtMTUsMTUpLGhpZGUubGFiZWw9VCxybS5yYW5lZj1UKQ0KDQpwbG90X2RpZmYocGhhci5nYW0uQVIsIHZpZXc9IkZhbiIsY29tcD1saXN0KGNvbnRleHQub3JkPWMoInV2dWxhciIsInBoYXJ5bmdlYWxpc2VkIikpLA0KICAgICAgICAgIHhsYWI9IiIsY29uZD1saXN0KHRpbWU9Mix2b3dlbC5vcmQ9InV1IiksYWRkPVRSVUUsDQogICAgICAgICAgY29sPSdibHVlJyxtYXJrLmRpZmYgPSAgVFJVRSxjb2wuZGlmZiA9ICJibHVlIiwNCiAgICAgICAgICB5bGltPWMoLTE1LDE1KSxoaWRlLmxhYmVsPVQscm0ucmFuZWY9VCkNCmxlZ2VuZChwYXIoJ3VzcicpWzJdLCBwYXIoJ3VzcicpWzRdLCBidHk9J24nLCB4cGQ9TkEsbHR5PTEsIA0KICAgICAgIGxlZ2VuZD1jKCIvaTovIiwgIi9hOi8iLCAiL3U6LyIpLGNvbD1jKCJncmVlbiIsInJlZCIsImJsdWUiKSwgbHdkPTQsIGNleD0xLjIpDQpgYGANCg0KIyMjIyBPZmZzZXQNCmBgYHtyIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIGVycm9yPUZBTFNFfQ0KcGFyKG9tYT1jKDEsIDAsIDAsIDMuNSksbWdwPWMoMiwgMSwgMCkpDQpwbG90X2RpZmYocGhhci5nYW0uQVIsIHZpZXc9IkZhbiIsY29tcD1saXN0KGNvbnRleHQub3JkPWMoInV2dWxhciIsInBoYXJ5bmdlYWxpc2VkIikpLA0KICAgICAgICAgIHhsYWI9IiIsY29uZD1saXN0KHRpbWU9Myx2b3dlbC5vcmQ9ImlpIiksbWFpbiA9ICJkaWZmZXJlbmNlIHV2dWxhciB2cyBwaGFyeW5nZWFsaXNlZCBPZmZzZXQiLA0KICAgICAgICAgIGNvbD0nZ3JlZW4nLGNleC5tYWluPTEuMSxtYXJrLmRpZmYgPSBUUlVFLGNvbC5kaWZmID0gImdyZWVuIiwNCiAgICAgICAgICB5bGltPWMoLTE1LDE1KSxoaWRlLmxhYmVsPVQscm0ucmFuZWY9VCkNCg0KcGxvdF9kaWZmKHBoYXIuZ2FtLkFSLCB2aWV3PSJGYW4iLGNvbXA9bGlzdChjb250ZXh0Lm9yZD1jKCJ1dnVsYXIiLCJwaGFyeW5nZWFsaXNlZCIpKSwNCiAgICAgICAgICB4bGFiPSIiLGNvbmQ9bGlzdCh0aW1lPTMsdm93ZWwub3JkPSJhYSIpLGFkZD1UUlVFLA0KICAgICAgICAgIGNvbD0ncmVkJyxtYXJrLmRpZmYgPSAgVFJVRSxjb2wuZGlmZiA9ICJyZWQiLA0KICAgICAgICAgIHlsaW09YygtMTUsMTUpLGhpZGUubGFiZWw9VCxybS5yYW5lZj1UKQ0KDQpwbG90X2RpZmYocGhhci5nYW0uQVIsIHZpZXc9IkZhbiIsY29tcD1saXN0KGNvbnRleHQub3JkPWMoInV2dWxhciIsInBoYXJ5bmdlYWxpc2VkIikpLA0KICAgICAgICAgIHhsYWI9IiIsY29uZD1saXN0KHRpbWU9Myx2b3dlbC5vcmQ9InV1IiksYWRkPVRSVUUsDQogICAgICAgICAgY29sPSdibHVlJyxtYXJrLmRpZmYgPSAgVFJVRSxjb2wuZGlmZiA9ICJibHVlIiwNCiAgICAgICAgICB5bGltPWMoLTE1LDE1KSxoaWRlLmxhYmVsPVQscm0ucmFuZWY9VCkNCmxlZ2VuZChwYXIoJ3VzcicpWzJdLCBwYXIoJ3VzcicpWzRdLCBidHk9J24nLCB4cGQ9TkEsbHR5PTEsIA0KICAgICAgIGxlZ2VuZD1jKCIvaTovIiwgIi9hOi8iLCAiL3U6LyIpLGNvbD1jKCJncmVlbiIsInJlZCIsImJsdWUiKSwgbHdkPTQsIGNleD0xLjIpDQpgYGANCg0KDQojIyMgUGhhcnluZ2VhbGlzZWQgdnMgUGhhcnluZ2VhbA0KDQojIyMjIE9uc2V0DQpgYGB7ciB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCBlcnJvcj1GQUxTRX0NCnBhcihvbWE9YygxLCAwLCAwLCAzLjUpLG1ncD1jKDIsIDEsIDApKQ0KcGxvdF9kaWZmKHBoYXIuZ2FtLkFSLCB2aWV3PSJGYW4iLGNvbXA9bGlzdChjb250ZXh0Lm9yZD1jKCJwaGFyeW5nZWFsaXNlZCIsInBoYXJ5bmdlYWwiKSksDQogICAgICAgICAgeGxhYj0iIixjb25kPWxpc3QodGltZT0xLHZvd2VsLm9yZD0iaWkiKSxtYWluID0gImRpZmZlcmVuY2UgcGhhcnluZ2VhbGlzZWQgdnMgcGhhcnluZ2VhbCBPbnNldCIsDQogICAgICAgICAgY29sPSdncmVlbicsY2V4Lm1haW49MS4xLG1hcmsuZGlmZiA9IFRSVUUsY29sLmRpZmYgPSAiZ3JlZW4iLA0KICAgICAgICAgIHlsaW09YygtMTUsMTUpLGhpZGUubGFiZWw9VCxybS5yYW5lZj1UKQ0KDQpwbG90X2RpZmYocGhhci5nYW0uQVIsIHZpZXc9IkZhbiIsY29tcD1saXN0KGNvbnRleHQub3JkPWMoInBoYXJ5bmdlYWxpc2VkIiwicGhhcnluZ2VhbCIpKSwNCiAgICAgICAgICB4bGFiPSIiLGNvbmQ9bGlzdCh0aW1lPTEsdm93ZWwub3JkPSJhYSIpLGFkZD1UUlVFLA0KICAgICAgICAgIGNvbD0ncmVkJyxtYXJrLmRpZmYgPSAgVFJVRSxjb2wuZGlmZiA9ICJyZWQiLA0KICAgICAgICAgIHlsaW09YygtMTUsMTUpLGhpZGUubGFiZWw9VCxybS5yYW5lZj1UKQ0KDQpwbG90X2RpZmYocGhhci5nYW0uQVIsIHZpZXc9IkZhbiIsY29tcD1saXN0KGNvbnRleHQub3JkPWMoInBoYXJ5bmdlYWxpc2VkIiwicGhhcnluZ2VhbCIpKSwNCiAgICAgICAgICB4bGFiPSIiLGNvbmQ9bGlzdCh0aW1lPTEsdm93ZWwub3JkPSJ1dSIpLGFkZD1UUlVFLA0KICAgICAgICAgIGNvbD0nYmx1ZScsbWFyay5kaWZmID0gIFRSVUUsY29sLmRpZmYgPSAiYmx1ZSIsDQogICAgICAgICAgeWxpbT1jKC0xNSwxNSksaGlkZS5sYWJlbD1ULHJtLnJhbmVmPVQpDQpsZWdlbmQocGFyKCd1c3InKVsyXSwgcGFyKCd1c3InKVs0XSwgYnR5PSduJywgeHBkPU5BLGx0eT0xLCANCiAgICAgICBsZWdlbmQ9YygiL2k6LyIsICIvYTovIiwgIi91Oi8iKSxjb2w9YygiZ3JlZW4iLCJyZWQiLCJibHVlIiksIGx3ZD00LCBjZXg9MS4yKQ0KYGBgDQoNCiMjIyMgTWlkcG9pbnQNCmBgYHtyIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIGVycm9yPUZBTFNFfQ0KcGFyKG9tYT1jKDEsIDAsIDAsIDMuNSksbWdwPWMoMiwgMSwgMCkpDQpwbG90X2RpZmYocGhhci5nYW0uQVIsIHZpZXc9IkZhbiIsY29tcD1saXN0KGNvbnRleHQub3JkPWMoInBoYXJ5bmdlYWxpc2VkIiwicGhhcnluZ2VhbCIpKSwNCiAgICAgICAgICB4bGFiPSIiLGNvbmQ9bGlzdCh0aW1lPTIsdm93ZWwub3JkPSJpaSIpLG1haW4gPSAiZGlmZmVyZW5jZSBwaGFyeW5nZWFsaXNlZCB2cyBwaGFyeW5nZWFsIE1pZHBvaW50IiwNCiAgICAgICAgICBjb2w9J2dyZWVuJyxjZXgubWFpbj0xLjEsbWFyay5kaWZmID0gVFJVRSxjb2wuZGlmZiA9ICJncmVlbiIsDQogICAgICAgICAgeWxpbT1jKC0xNSwxNSksaGlkZS5sYWJlbD1ULHJtLnJhbmVmPVQpDQoNCnBsb3RfZGlmZihwaGFyLmdhbS5BUiwgdmlldz0iRmFuIixjb21wPWxpc3QoY29udGV4dC5vcmQ9YygicGhhcnluZ2VhbGlzZWQiLCJwaGFyeW5nZWFsIikpLA0KICAgICAgICAgIHhsYWI9IiIsY29uZD1saXN0KHRpbWU9Mix2b3dlbC5vcmQ9ImFhIiksYWRkPVRSVUUsDQogICAgICAgICAgY29sPSdyZWQnLG1hcmsuZGlmZiA9ICBUUlVFLGNvbC5kaWZmID0gInJlZCIsDQogICAgICAgICAgeWxpbT1jKC0xNSwxNSksaGlkZS5sYWJlbD1ULHJtLnJhbmVmPVQpDQoNCnBsb3RfZGlmZihwaGFyLmdhbS5BUiwgdmlldz0iRmFuIixjb21wPWxpc3QoY29udGV4dC5vcmQ9YygicGhhcnluZ2VhbGlzZWQiLCJwaGFyeW5nZWFsIikpLA0KICAgICAgICAgIHhsYWI9IiIsY29uZD1saXN0KHRpbWU9Mix2b3dlbC5vcmQ9InV1IiksYWRkPVRSVUUsDQogICAgICAgICAgY29sPSdibHVlJyxtYXJrLmRpZmYgPSAgVFJVRSxjb2wuZGlmZiA9ICJibHVlIiwNCiAgICAgICAgICB5bGltPWMoLTE1LDE1KSxoaWRlLmxhYmVsPVQscm0ucmFuZWY9VCkNCmxlZ2VuZChwYXIoJ3VzcicpWzJdLCBwYXIoJ3VzcicpWzRdLCBidHk9J24nLCB4cGQ9TkEsbHR5PTEsIA0KICAgICAgIGxlZ2VuZD1jKCIvaTovIiwgIi9hOi8iLCAiL3U6LyIpLGNvbD1jKCJncmVlbiIsInJlZCIsImJsdWUiKSwgbHdkPTQsIGNleD0xLjIpDQpgYGANCg0KIyMjIyBPZmZzZXQNCg0KYGBge3Igd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgZXJyb3I9RkFMU0V9DQpwYXIob21hPWMoMSwgMCwgMCwgMy41KSxtZ3A9YygyLCAxLCAwKSkNCnBsb3RfZGlmZihwaGFyLmdhbS5BUiwgdmlldz0iRmFuIixjb21wPWxpc3QoY29udGV4dC5vcmQ9YygicGhhcnluZ2VhbGlzZWQiLCJwaGFyeW5nZWFsIikpLA0KICAgICAgICAgIHhsYWI9IiIsY29uZD1saXN0KHRpbWU9Myx2b3dlbC5vcmQ9ImlpIiksbWFpbiA9ICJkaWZmZXJlbmNlIHBoYXJ5bmdlYWxpc2VkIHZzIHBoYXJ5bmdlYWwgT2Zmc2V0IiwNCiAgICAgICAgICBjb2w9J2dyZWVuJyxjZXgubWFpbj0xLjEsbWFyay5kaWZmID0gVFJVRSxjb2wuZGlmZiA9ICJncmVlbiIsDQogICAgICAgICAgeWxpbT1jKC0xNSwxNSksaGlkZS5sYWJlbD1ULHJtLnJhbmVmPVQpDQoNCnBsb3RfZGlmZihwaGFyLmdhbS5BUiwgdmlldz0iRmFuIixjb21wPWxpc3QoY29udGV4dC5vcmQ9YygicGhhcnluZ2VhbGlzZWQiLCJwaGFyeW5nZWFsIikpLA0KICAgICAgICAgIHhsYWI9IiIsY29uZD1saXN0KHRpbWU9Myx2b3dlbC5vcmQ9ImFhIiksYWRkPVRSVUUsDQogICAgICAgICAgY29sPSdyZWQnLG1hcmsuZGlmZiA9ICBUUlVFLGNvbC5kaWZmID0gInJlZCIsDQogICAgICAgICAgeWxpbT1jKC0xNSwxNSksaGlkZS5sYWJlbD1ULHJtLnJhbmVmPVQpDQoNCnBsb3RfZGlmZihwaGFyLmdhbS5BUiwgdmlldz0iRmFuIixjb21wPWxpc3QoY29udGV4dC5vcmQ9YygicGhhcnluZ2VhbGlzZWQiLCJwaGFyeW5nZWFsIikpLA0KICAgICAgICAgIHhsYWI9IiIsY29uZD1saXN0KHRpbWU9Myx2b3dlbC5vcmQ9InV1IiksYWRkPVRSVUUsDQogICAgICAgICAgY29sPSdibHVlJyxtYXJrLmRpZmYgPSAgVFJVRSxjb2wuZGlmZiA9ICJibHVlIiwNCiAgICAgICAgICB5bGltPWMoLTE1LDE1KSxoaWRlLmxhYmVsPVQscm0ucmFuZWY9VCkNCmxlZ2VuZChwYXIoJ3VzcicpWzJdLCBwYXIoJ3VzcicpWzRdLCBidHk9J24nLCB4cGQ9TkEsbHR5PTEsIA0KICAgICAgIGxlZ2VuZD1jKCIvaTovIiwgIi9hOi8iLCAiL3U6LyIpLGNvbD1jKCJncmVlbiIsInJlZCIsImJsdWUiKSwgbHdkPTQsIGNleD0xLjIpDQoNCmBgYA0KDQo=