#load libraries
#install.packages("")
  library(glmulti)
  library(ggplot2)
  library(psycho)
  library(tidyverse)
  library(psych)
  library(magrittr) 
  library(dplyr) 
  library(apaTables)

EMA correlation table

#first create a correlation table with the various affective dynamics metrics

  #create a new mini ema dataset
  #columns 20:33 are the unweighted EMA AD metrics, 5 is number of responses, 4 is gender
  #omit rmssd and leave in mssd...
  #create two ancillary dataframes by valence...
  ema <- cog.ema[c(22,23,20,21,24,25,28:33,5,4)]
  neg.ema <- cog.ema[c(22,20,24,28,30,32,5,4)]
  pos.ema <- cog.ema[c(23,21,25,29,31,33,5,4)]
  
  #table to look at
  ema.correlations <- ema %>% 
    correlation(adjust = "none", i_am_cheating = T)
  summary(ema.correlations)
     #by valence: 
     neg.ema.correlations <- neg.ema %>% 
      correlation(adjust = "fdr")
     summary(neg.ema.correlations)
     pos.ema.correlations <- pos.ema %>% 
      correlation(adjust = "fdr")
     summary(pos.ema.correlations)
  
  #table to write out in APA format!
  #getwd()
  #apa.cor.table(neg.ema, filename="Table3_negEMAcorrs_APA.doc", table.number=1)
  #apa.cor.table(pos.ema, filename="Table2_posEMAcorrs_APA.doc", table.number=2)
#use glmulti to do some model comparisons

#create dataframe for negative model
# colnames(cog.ema)
# neg.ema <- cog.ema[c(22,20,24,28,30,32,5,4)]
# pos.ema <- cog.ema[c(23,21,25,29,21,33,5,4)]

#lets start with a model of negative affect EMA predictors of PTQ
#constrainted to 6 terms....
#neg.ema.ptq.model <- glmulti(total ~ UW.NAmean*UW.NASD*UW.NAmssd*UW.NAskew*UW.NAinertia*UW.NAkurt, data = cog.ema, fitfunc = lm, crit = aic, method = "h", minsize = 1, maxsize = 6)

#total~1 + UW.NAmean + UW.NAmssd:UW.NAmean + UW.NAkurt:UW.NAmean + UW.NAkurt:UW.NAinertia
#summary(neg.ema.ptq.model)
#coef(neg.ema.ptq.model)
#plot(neg.ema.ptq.model)

GLMULTI + LM to regress cognitive factors on EMA vars

model selection: PTQ on NA

#use glmulti to do some model comparisons: PTQ on NA EMA metrics: main effects only
#lets try one that does not contain interactions.... # level = 1 (versus default level = 2)
neg.ema.ptq.noX.model <- glmulti(total ~ UW.NAmean+UW.NASD+UW.NAmssd+UW.NAskew+UW.NAinertia+UW.NAkurt, data = cog.ema, fitfunc = lm, crit = aic, method = "h", level = 1)
Initialization...
TASK: Exhaustive screening of candidate set.
Fitting...

After 50 models:
Best model: total~1+UW.NAmean+UW.NASD+UW.NAinertia
Crit= 5494.2019827052
Mean crit= 5521.77149593281
Completed.

summary(neg.ema.ptq.noX.model)
$name
[1] "glmulti.analysis"

$method
[1] "h"

$fitting
[1] "lm"

$crit
[1] "aic"

$level
[1] 1

$marginality
[1] FALSE

$confsetsize
[1] 100

$bestic
[1] 5493.902

$icvalues
 [1] 5493.902 5494.202 5495.275 5495.638 5495.702 5495.897 5496.100 5496.104 5497.272 5497.568 5497.699 5498.003 5498.535 5500.483 5501.038
[16] 5513.475 5513.838 5514.094 5514.202 5514.437 5515.327 5515.353 5515.448 5515.555 5515.836 5516.092 5516.125 5516.250 5516.717 5516.960
[31] 5517.039 5517.076 5517.308 5517.555 5517.677 5517.811 5518.246 5518.280 5518.413 5518.497 5518.694 5519.159 5519.234 5520.060 5520.071
[46] 5520.192 5533.296 5533.893 5535.394 5535.747 5536.620 5536.695 5536.868 5536.962 5537.322 5537.336 5537.661 5537.759 5538.450 5538.785
[61] 5538.810 5539.397 5539.471 5552.901

$bestmodel
[1] "total ~ 1 + UW.NAmean + UW.NASD + UW.NAinertia + UW.NAkurt"

$modelweights
 [1] 1.994816e-01 1.716700e-01 1.004132e-01 8.372437e-02 8.111043e-02 7.356183e-02 6.645172e-02 6.634042e-02 3.699194e-02 3.189580e-02
[11] 2.987768e-02 2.566237e-02 1.967260e-02 7.425833e-03 5.626615e-03 1.121225e-05 9.348400e-06 8.225455e-06 7.792080e-06 6.930296e-06
[21] 4.440580e-06 4.383887e-06 4.179945e-06 3.962198e-06 3.443145e-06 3.029738e-06 2.979033e-06 2.798998e-06 2.216784e-06 1.962755e-06
[31] 1.886656e-06 1.851842e-06 1.649114e-06 1.457703e-06 1.371312e-06 1.282342e-06 1.031934e-06 1.014259e-06 9.490487e-07 9.099606e-07
[41] 8.248925e-07 6.535317e-07 6.297144e-07 4.166221e-07 4.142938e-07 3.898914e-07 5.565068e-10 4.129412e-10 1.950117e-10 1.634522e-10
[51] 1.056155e-10 1.017095e-10 9.330490e-11 8.901701e-11 7.436170e-11 7.383919e-11 6.274852e-11 5.976345e-11 4.230454e-11 3.578368e-11
[61] 3.532973e-11 2.634226e-11 2.539341e-11 3.079362e-14

$includeobjects
[1] TRUE
#coef(neg.ema.ptq.noX.model)
#plot(neg.ema.ptq.noX.model)

model fitting: PTQ on NA

#Now fit the best model
best.model.PTQ.NA.noX <- lm(total ~ 1 + UW.NAmean + UW.NASD + UW.NAinertia + UW.NAkurt, data = cog.ema)
summary(best.model.PTQ.NA.noX)

Call:
lm(formula = total ~ 1 + UW.NAmean + UW.NASD + UW.NAinertia + 
    UW.NAkurt, data = cog.ema)

Residuals:
    Min      1Q  Median      3Q     Max 
-26.091  -9.314   0.067   8.643  39.569 

Coefficients:
             Estimate Std. Error t value Pr(>|t|)    
(Intercept)   2.02023    3.83411   0.527   0.5984    
UW.NAmean     0.35497    0.07298   4.864 1.43e-06 ***
UW.NASD       0.52744    0.20505   2.572   0.0103 *  
UW.NAinertia -2.85619    2.02403  -1.411   0.1587    
UW.NAkurt    -0.43730    0.28914  -1.512   0.1309    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 12.82 on 686 degrees of freedom
  (16 observations deleted due to missingness)
Multiple R-squared:  0.04611,   Adjusted R-squared:  0.04055 
F-statistic:  8.29 on 4 and 686 DF,  p-value: 1.561e-06
# getwd()
# apa.reg.table(best.model.PTQ.NA.noX, "/Volumes/Groups/AHeller_Lab/Administrator/Analysis/S-EMA/Structural Model/JAS additional analyses 01.2020/Table3_Reg_best.model.PTQ.NA.noX_APA.doc", table.number=3 )

Now repeat these steps for PA

model selection: PTQ on PA

# PTQ on PA (main effects only)
pos.ema.ptq.noX.model <- glmulti(total ~ UW.PAmean+UW.PASD+UW.PAmssd+UW.PAskew+UW.PAinertia+UW.PAkurt, data = cog.ema, fitfunc = lm, crit = aic, method = "h", level = 1)
Initialization...
TASK: Exhaustive screening of candidate set.
Fitting...

After 50 models:
Best model: total~1+UW.PAmean+UW.PAmssd+UW.PAskew+UW.PAinertia
Crit= 5480.80605389709
Mean crit= 5514.9148203069
Completed.

summary(pos.ema.ptq.noX.model)
$name
[1] "glmulti.analysis"

$method
[1] "h"

$fitting
[1] "lm"

$crit
[1] "aic"

$level
[1] 1

$marginality
[1] FALSE

$confsetsize
[1] 100

$bestic
[1] 5480.806

$icvalues
 [1] 5480.806 5481.060 5481.425 5481.707 5481.716 5481.753 5483.038 5483.584 5484.039 5484.279 5484.873 5486.247 5486.872 5488.371 5489.849
[16] 5501.424 5501.565 5502.613 5502.711 5503.089 5503.368 5503.419 5503.468 5503.513 5504.147 5504.698 5505.040 5505.356 5507.600 5507.902
[31] 5509.594 5514.094 5515.402 5515.432 5515.742 5516.112 5516.850 5517.024 5517.190 5517.472 5517.484 5518.665 5519.269 5520.267 5521.904
[46] 5522.262 5522.839 5531.790 5532.855 5533.088 5533.439 5533.705 5534.288 5534.557 5535.027 5535.047 5535.396 5535.512 5536.248 5536.998
[61] 5538.291 5539.359 5540.267 5552.901

$bestmodel
[1] "total ~ 1 + UW.PAmean + UW.PAmssd + UW.PAskew + UW.PAinertia"

$modelweights
 [1] 1.742317e-01 1.534927e-01 1.278579e-01 1.110220e-01 1.105196e-01 1.085330e-01 5.707678e-02 4.343371e-02 3.459351e-02 3.068347e-02
[11] 2.279959e-02 1.146945e-02 8.392023e-03 3.967186e-03 1.893952e-03 5.807374e-06 5.411964e-06 3.204445e-06 3.051276e-06 2.526690e-06
[21] 2.197340e-06 2.141974e-06 2.089955e-06 2.043040e-06 1.488472e-06 1.130065e-06 9.525069e-07 8.130093e-07 2.648238e-07 2.276804e-07
[31] 9.771347e-08 1.029844e-08 5.355252e-09 5.275859e-09 4.517462e-09 3.754240e-09 2.595271e-09 2.379827e-09 2.189884e-09 1.902096e-09
[41] 1.890957e-09 1.047439e-09 7.746181e-10 4.702320e-10 2.074573e-10 1.733861e-10 1.299516e-10 1.479653e-12 8.686007e-13 7.731957e-13
[51] 6.486860e-13 5.678361e-13 4.242802e-13 3.709808e-13 2.931798e-13 2.902785e-13 2.438604e-13 2.301105e-13 1.592081e-13 1.094248e-13
[61] 5.734193e-14 3.360617e-14 2.134383e-14 3.854825e-17

$includeobjects
[1] TRUE

model fitting: PTQ on PA

#Now fit the best model
best.model.PTQ.PA.noX <- lm(total ~ 1 + UW.PAmean + UW.PAmssd + UW.PAskew + UW.PAinertia, data = cog.ema)
summary(best.model.PTQ.PA.noX)

Call:
lm(formula = total ~ 1 + UW.PAmean + UW.PAmssd + UW.PAskew + 
    UW.PAinertia, data = cog.ema)

Residuals:
    Min      1Q  Median      3Q     Max 
-31.156  -9.496  -0.040   8.275  37.406 

Coefficients:
              Estimate Std. Error t value Pr(>|t|)    
(Intercept)  35.568351   2.788150  12.757  < 2e-16 ***
UW.PAmean    -0.306657   0.050204  -6.108 1.69e-09 ***
UW.PAmssd     0.005449   0.001762   3.092  0.00207 ** 
UW.PAskew    -1.280636   0.855506  -1.497  0.13487    
UW.PAinertia  2.919575   1.929879   1.513  0.13078    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 12.7 on 686 degrees of freedom
  (16 observations deleted due to missingness)
Multiple R-squared:  0.06402,   Adjusted R-squared:  0.05856 
F-statistic: 11.73 on 4 and 686 DF,  p-value: 3.203e-09
# getwd()
# apa.reg.table(best.model.PTQ.PA.noX, "/Volumes/Groups/AHeller_Lab/Administrator/Analysis/S-EMA/Structural Model/JAS additional analyses 01.2020/Table4_Reg_best.model.PTQ.PA.noX_APA.doc", table.number=4 )

Now repeat these steps for ASI

model selection: ASI on NA

#### NA
# ASI on NA 

neg.ema.ASI.NA.noX.model <- glmulti(asi.short ~ UW.NAmean+UW.NASD+UW.NAmssd+UW.NAskew+UW.NAinertia+UW.NAkurt, data = cog.ema, fitfunc = lm, crit = aic, method = "h", level = 1)
Initialization...
TASK: Exhaustive screening of candidate set.
Fitting...

After 50 models:
Best model: asi.short~1+UW.NAmean
Crit= 2220.83460452512
Mean crit= 2228.88450483384
Completed.

summary(neg.ema.ASI.NA.noX.model)
$name
[1] "glmulti.analysis"

$method
[1] "h"

$fitting
[1] "lm"

$crit
[1] "aic"

$level
[1] 1

$marginality
[1] FALSE

$confsetsize
[1] 100

$bestic
[1] 2220.835

$icvalues
 [1] 2220.835 2222.359 2222.637 2222.766 2222.782 2222.803 2223.560 2224.249 2224.291 2224.312 2224.317 2224.433 2224.555 2224.606 2224.626
[16] 2224.753 2224.755 2225.211 2225.492 2226.157 2226.222 2226.228 2226.250 2226.289 2226.290 2226.348 2226.548 2226.601 2227.180 2228.138
[31] 2228.211 2228.235 2230.258 2230.691 2231.018 2231.883 2231.902 2232.192 2232.236 2232.569 2232.592 2232.687 2232.760 2232.982 2233.013
[46] 2233.389 2233.775 2233.785 2233.813 2233.849 2233.901 2234.175 2234.217 2234.347 2234.402 2234.568 2234.591 2234.716 2234.979 2235.187
[61] 2235.502 2235.716 2235.849 2236.233

$bestmodel
[1] "asi.short ~ 1 + UW.NAmean"

$modelweights
 [1] 1.707761e-01 7.968013e-02 6.934400e-02 6.501804e-02 6.449432e-02 6.382796e-02 4.370393e-02 3.097988e-02 3.032333e-02 3.001861e-02
[11] 2.993402e-02 2.824999e-02 2.658538e-02 2.591443e-02 2.565838e-02 2.406880e-02 2.404749e-02 1.914852e-02 1.663579e-02 1.193076e-02
[21] 1.154879e-02 1.151730e-02 1.138744e-02 1.116939e-02 1.116580e-02 1.084347e-02 9.814497e-03 9.554383e-03 7.153695e-03 4.431201e-03
[31] 4.273289e-03 4.222335e-03 1.535426e-03 1.236240e-03 1.049995e-03 6.811851e-04 6.746641e-04 5.838144e-04 5.709662e-04 4.833577e-04
[41] 4.780149e-04 4.556832e-04 4.393412e-04 3.931428e-04 3.872148e-04 3.208977e-04 2.644975e-04 2.632203e-04 2.595720e-04 2.548516e-04
[51] 2.483314e-04 2.165348e-04 2.120780e-04 1.986903e-04 1.933172e-04 1.779230e-04 1.759421e-04 1.652743e-04 1.448614e-04 1.305659e-04
[61] 1.115679e-04 1.002406e-04 9.376069e-05 7.737917e-05

$includeobjects
[1] TRUE

model fitting: ASI on NA

best.model.ASI.NA.noX <- lm(asi.short ~ 1 + UW.NAmean, data = cog.ema)
summary(best.model.ASI.NA.noX)

Call:
lm(formula = asi.short ~ 1 + UW.NAmean, data = cog.ema)

Residuals:
     Min       1Q   Median       3Q      Max 
-12.7024  -6.2998  -0.6354   5.1025  24.9407 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept)  1.82182    2.72954   0.667 0.504974    
UW.NAmean    0.20936    0.06158   3.400 0.000761 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 7.813 on 317 degrees of freedom
  (388 observations deleted due to missingness)
Multiple R-squared:  0.03518,   Adjusted R-squared:  0.03213 
F-statistic: 11.56 on 1 and 317 DF,  p-value: 0.0007612
# getwd()
# apa.reg.table(best.model.ASI.NA.noX, "/Volumes/Groups/AHeller_Lab/Administrator/Analysis/S-EMA/Structural Model/JAS additional analyses 01.2020/Table5_Reg_best.model.ASI.NA.noX_APA.doc", table.number=5 )

model selection: ASI on PA

#### PA
# ASI on PA 
pos.ema.ASI.PA.noX.model <- glmulti(asi.short ~ UW.PAmean+UW.PASD+UW.PAmssd+UW.PAskew+UW.PAinertia+UW.PAkurt, data = cog.ema, fitfunc = lm, crit = aic, method = "h", level = 1)
Initialization...
TASK: Exhaustive screening of candidate set.
Fitting...

After 50 models:
Best model: asi.short~1+UW.PAmean+UW.PAmssd+UW.PAinertia
Crit= 2217.48809164997
Mean crit= 2226.53263853055
Completed.

summary(pos.ema.ASI.PA.noX.model)
$name
[1] "glmulti.analysis"

$method
[1] "h"

$fitting
[1] "lm"

$crit
[1] "aic"

$level
[1] 1

$marginality
[1] FALSE

$confsetsize
[1] 100

$bestic
[1] 2217.488

$icvalues
 [1] 2217.488 2217.744 2217.971 2218.029 2218.183 2218.209 2218.397 2218.676 2218.955 2219.121 2219.134 2219.314 2219.341 2219.487 2219.511
[16] 2219.594 2219.806 2220.055 2220.066 2220.183 2220.229 2220.386 2220.395 2220.476 2221.088 2221.115 2221.124 2221.201 2221.207 2221.820
[31] 2222.226 2222.985 2230.258 2231.049 2231.165 2231.489 2231.616 2231.741 2232.025 2232.111 2232.505 2232.835 2232.871 2232.988 2233.143
[46] 2233.170 2233.234 2233.284 2233.347 2233.430 2233.668 2233.849 2233.896 2234.465 2234.782 2234.817 2234.968 2234.993 2235.043 2235.063
[61] 2235.276 2235.760 2236.765 2236.894

$bestmodel
[1] "asi.short ~ 1 + UW.PAmean + UW.PAmssd + UW.PAinertia"

$modelweights
 [1] 8.050748e-02 7.083510e-02 6.323522e-02 6.141726e-02 5.688648e-02 5.614501e-02 5.110860e-02 4.444869e-02 3.865475e-02 3.558756e-02
[11] 3.535020e-02 3.231026e-02 3.188418e-02 2.963163e-02 2.928601e-02 2.808568e-02 2.526073e-02 2.230987e-02 2.218077e-02 2.092782e-02
[21] 2.044317e-02 1.890563e-02 1.882267e-02 1.807457e-02 1.330515e-02 1.312802e-02 1.307230e-02 1.257506e-02 1.254276e-02 9.228809e-03
[31] 7.534338e-03 5.155667e-03 1.358163e-04 9.143832e-05 8.627051e-05 7.337532e-05 6.886090e-05 6.469415e-05 5.612505e-05 5.375944e-05
[41] 4.416001e-05 3.744206e-05 3.676739e-05 3.467578e-05 3.210053e-05 3.165701e-05 3.066540e-05 2.991400e-05 2.898400e-05 2.780756e-05
[51] 2.468159e-05 2.254768e-05 2.201920e-05 1.656956e-05 1.414194e-05 1.389743e-05 1.288373e-05 1.272541e-05 1.241325e-05 1.228533e-05
[61] 1.104753e-05 8.671266e-06 5.246887e-06 4.920062e-06

$includeobjects
[1] TRUE

model fitting: ASI on PA

#Now fit the best model
best.model.PTQ.PA.noX <- lm(asi.short ~ 1 + UW.PAmean + UW.PAmssd + UW.PAinertia, data = cog.ema)
summary(best.model.PTQ.PA.noX)

Call:
lm(formula = asi.short ~ 1 + UW.PAmean + UW.PAmssd + UW.PAinertia, 
    data = cog.ema)

Residuals:
     Min       1Q   Median       3Q      Max 
-14.3638  -6.4327  -0.6741   5.3878  26.3848 

Coefficients:
              Estimate Std. Error t value Pr(>|t|)    
(Intercept)  19.127544   2.407412   7.945 3.47e-14 ***
UW.PAmean    -0.169229   0.041871  -4.042 6.68e-05 ***
UW.PAmssd     0.002452   0.001640   1.495    0.136    
UW.PAinertia  3.529147   1.854615   1.903    0.058 .  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 7.748 on 315 degrees of freedom
  (388 observations deleted due to missingness)
Multiple R-squared:  0.05714,   Adjusted R-squared:  0.04816 
F-statistic: 6.363 on 3 and 315 DF,  p-value: 0.0003365
# getwd()
# apa.reg.table(best.model.PTQ.PA.noX, "/Volumes/Groups/AHeller_Lab/Administrator/Analysis/S-EMA/Structural Model/JAS additional analyses 01.2020/Table6_Reg_best.model.ASI.PA.noX_APA.doc", table.number=6 )
LS0tCnRpdGxlOiAnSkFTIGFuYWx5c2VzOiBFTUEgZHluYW1pY3MgbWV0cmljcyBjb3JyZWxhdGlvbnMgKyBQVFEgYW5kIEFTSSBtb2RlbCBjb21wYXJpc29ucwogIGZvciBiZXN0IEVNQSBwcmVkaWN0b3JzJwpvdXRwdXQ6CiAgaHRtbF9ub3RlYm9vazogZGVmYXVsdAogIGh0bWxfZG9jdW1lbnQ6CiAgICBkZl9wcmludDogcGFnZWQKICB3b3JkX2RvY3VtZW50OiBkZWZhdWx0Ci0tLQoKYGBge3J9CiNpbXBvcnQgZGF0YXNldCAoc2luZ2xlIHJvdyBwZXIgc3ViKQoKICAjY29nLmVtYSA8LSByZWFkLmNzdigiLy9kYXRhc3RvcmUwMS5wc3kubWlhbWkuZWR1L0dyb3Vwcy9BSGVsbGVyX0xhYi9BZG1pbmlzdHJhdG9yL0FuYWx5c2lzL1MtRU1BL1N0cnVjdHVyYWwgTW9kZWwvSkFTIGFkZGl0aW9uYWwgYW5hbHlzZXMgMDEuMjAyMC9KQVNwYXBlcl9QVFFfQVNJX0VNQW1ldHJpY3NfMDExODIwLmNzdiIpCiAgI2NvbG5hbWVzKGNvZy5lbWEpCmNvZy5lbWEgPC0gcmVhZC5jc3YoIi9Wb2x1bWVzL0dyb3Vwcy9BSGVsbGVyX0xhYi9BZG1pbmlzdHJhdG9yL0FuYWx5c2lzL1MtRU1BL1N0cnVjdHVyYWwgTW9kZWwvSkFTIGFkZGl0aW9uYWwgYW5hbHlzZXMgMDEuMjAyMC9KQVNwYXBlcl9QVFFfQVNJX0VNQW1ldHJpY3NfMDExODIwLmNzdiIpCgpgYGAKCmBgYHtyfQojbG9hZCBsaWJyYXJpZXMKI2luc3RhbGwucGFja2FnZXMoIiIpCiAgbGlicmFyeShnbG11bHRpKQogIGxpYnJhcnkoZ2dwbG90MikKICBsaWJyYXJ5KHBzeWNobykKICBsaWJyYXJ5KHRpZHl2ZXJzZSkKICBsaWJyYXJ5KHBzeWNoKQogIGxpYnJhcnkobWFncml0dHIpIAogIGxpYnJhcnkoZHBseXIpIAogIGxpYnJhcnkoYXBhVGFibGVzKQpgYGAKCiMgRU1BIGNvcnJlbGF0aW9uIHRhYmxlCmBgYHtyfQojZmlyc3QgY3JlYXRlIGEgY29ycmVsYXRpb24gdGFibGUgd2l0aCB0aGUgdmFyaW91cyBhZmZlY3RpdmUgZHluYW1pY3MgbWV0cmljcwoKICAjY3JlYXRlIGEgbmV3IG1pbmkgZW1hIGRhdGFzZXQKICAjY29sdW1ucyAyMDozMyBhcmUgdGhlIHVud2VpZ2h0ZWQgRU1BIEFEIG1ldHJpY3MsIDUgaXMgbnVtYmVyIG9mIHJlc3BvbnNlcywgNCBpcyBnZW5kZXIKICAjb21pdCBybXNzZCBhbmQgbGVhdmUgaW4gbXNzZC4uLgogICNjcmVhdGUgdHdvIGFuY2lsbGFyeSBkYXRhZnJhbWVzIGJ5IHZhbGVuY2UuLi4KICBlbWEgPC0gY29nLmVtYVtjKDIyLDIzLDIwLDIxLDI0LDI1LDI4OjMzLDUsNCldCiAgbmVnLmVtYSA8LSBjb2cuZW1hW2MoMjIsMjAsMjQsMjgsMzAsMzIsNSw0KV0KICBwb3MuZW1hIDwtIGNvZy5lbWFbYygyMywyMSwyNSwyOSwzMSwzMyw1LDQpXQogIAogICN0YWJsZSB0byBsb29rIGF0CiAgZW1hLmNvcnJlbGF0aW9ucyA8LSBlbWEgJT4lIAogICAgY29ycmVsYXRpb24oYWRqdXN0ID0gIm5vbmUiLCBpX2FtX2NoZWF0aW5nID0gVCkKICBzdW1tYXJ5KGVtYS5jb3JyZWxhdGlvbnMpCiAgICAgI2J5IHZhbGVuY2U6IAogICAgIG5lZy5lbWEuY29ycmVsYXRpb25zIDwtIG5lZy5lbWEgJT4lIAogICAgICBjb3JyZWxhdGlvbihhZGp1c3QgPSAiZmRyIikKICAgICBzdW1tYXJ5KG5lZy5lbWEuY29ycmVsYXRpb25zKQogICAgIHBvcy5lbWEuY29ycmVsYXRpb25zIDwtIHBvcy5lbWEgJT4lIAogICAgICBjb3JyZWxhdGlvbihhZGp1c3QgPSAiZmRyIikKICAgICBzdW1tYXJ5KHBvcy5lbWEuY29ycmVsYXRpb25zKQogIAogICN0YWJsZSB0byB3cml0ZSBvdXQgaW4gQVBBIGZvcm1hdCEKICAjZ2V0d2QoKQogICNhcGEuY29yLnRhYmxlKG5lZy5lbWEsIGZpbGVuYW1lPSJUYWJsZTNfbmVnRU1BY29ycnNfQVBBLmRvYyIsIHRhYmxlLm51bWJlcj0xKQogICNhcGEuY29yLnRhYmxlKHBvcy5lbWEsIGZpbGVuYW1lPSJUYWJsZTJfcG9zRU1BY29ycnNfQVBBLmRvYyIsIHRhYmxlLm51bWJlcj0yKQpgYGAKCgpgYGB7cn0KI3VzZSBnbG11bHRpIHRvIGRvIHNvbWUgbW9kZWwgY29tcGFyaXNvbnMKCiNjcmVhdGUgZGF0YWZyYW1lIGZvciBuZWdhdGl2ZSBtb2RlbAojIGNvbG5hbWVzKGNvZy5lbWEpCiMgbmVnLmVtYSA8LSBjb2cuZW1hW2MoMjIsMjAsMjQsMjgsMzAsMzIsNSw0KV0KIyBwb3MuZW1hIDwtIGNvZy5lbWFbYygyMywyMSwyNSwyOSwyMSwzMyw1LDQpXQoKI2xldHMgc3RhcnQgd2l0aCBhIG1vZGVsIG9mIG5lZ2F0aXZlIGFmZmVjdCBFTUEgcHJlZGljdG9ycyBvZiBQVFEKI2NvbnN0cmFpbnRlZCB0byA2IHRlcm1zLi4uLgojbmVnLmVtYS5wdHEubW9kZWwgPC0gZ2xtdWx0aSh0b3RhbCB+IFVXLk5BbWVhbipVVy5OQVNEKlVXLk5BbXNzZCpVVy5OQXNrZXcqVVcuTkFpbmVydGlhKlVXLk5Ba3VydCwgZGF0YSA9IGNvZy5lbWEsIGZpdGZ1bmMgPSBsbSwgY3JpdCA9IGFpYywgbWV0aG9kID0gImgiLCBtaW5zaXplID0gMSwgbWF4c2l6ZSA9IDYpCgojdG90YWx+MSArIFVXLk5BbWVhbiArIFVXLk5BbXNzZDpVVy5OQW1lYW4gKyBVVy5OQWt1cnQ6VVcuTkFtZWFuICsgVVcuTkFrdXJ0OlVXLk5BaW5lcnRpYQojc3VtbWFyeShuZWcuZW1hLnB0cS5tb2RlbCkKI2NvZWYobmVnLmVtYS5wdHEubW9kZWwpCiNwbG90KG5lZy5lbWEucHRxLm1vZGVsKQpgYGAKCiMgR0xNVUxUSSArIExNIHRvIHJlZ3Jlc3MgY29nbml0aXZlIGZhY3RvcnMgb24gRU1BIHZhcnMKCiMjIyBtb2RlbCBzZWxlY3Rpb246IFBUUSBvbiBOQQpgYGB7cn0KI3VzZSBnbG11bHRpIHRvIGRvIHNvbWUgbW9kZWwgY29tcGFyaXNvbnM6IFBUUSBvbiBOQSBFTUEgbWV0cmljczogbWFpbiBlZmZlY3RzIG9ubHkKI2xldHMgdHJ5IG9uZSB0aGF0IGRvZXMgbm90IGNvbnRhaW4gaW50ZXJhY3Rpb25zLi4uLiAjIGxldmVsID0gMSAodmVyc3VzIGRlZmF1bHQgbGV2ZWwgPSAyKQpuZWcuZW1hLnB0cS5ub1gubW9kZWwgPC0gZ2xtdWx0aSh0b3RhbCB+IFVXLk5BbWVhbitVVy5OQVNEK1VXLk5BbXNzZCtVVy5OQXNrZXcrVVcuTkFpbmVydGlhK1VXLk5Ba3VydCwgZGF0YSA9IGNvZy5lbWEsIGZpdGZ1bmMgPSBsbSwgY3JpdCA9IGFpYywgbWV0aG9kID0gImgiLCBsZXZlbCA9IDEpCgpzdW1tYXJ5KG5lZy5lbWEucHRxLm5vWC5tb2RlbCkKI2NvZWYobmVnLmVtYS5wdHEubm9YLm1vZGVsKQojcGxvdChuZWcuZW1hLnB0cS5ub1gubW9kZWwpCmBgYAoKIyMjIG1vZGVsIGZpdHRpbmc6IFBUUSBvbiBOQQpgYGB7cn0KI05vdyBmaXQgdGhlIGJlc3QgbW9kZWwKYmVzdC5tb2RlbC5QVFEuTkEubm9YIDwtIGxtKHRvdGFsIH4gMSArIFVXLk5BbWVhbiArIFVXLk5BU0QgKyBVVy5OQWluZXJ0aWEgKyBVVy5OQWt1cnQsIGRhdGEgPSBjb2cuZW1hKQpzdW1tYXJ5KGJlc3QubW9kZWwuUFRRLk5BLm5vWCkKCiMgZ2V0d2QoKQojIGFwYS5yZWcudGFibGUoYmVzdC5tb2RlbC5QVFEuTkEubm9YLCAiL1ZvbHVtZXMvR3JvdXBzL0FIZWxsZXJfTGFiL0FkbWluaXN0cmF0b3IvQW5hbHlzaXMvUy1FTUEvU3RydWN0dXJhbCBNb2RlbC9KQVMgYWRkaXRpb25hbCBhbmFseXNlcyAwMS4yMDIwL1RhYmxlM19SZWdfYmVzdC5tb2RlbC5QVFEuTkEubm9YX0FQQS5kb2MiLCB0YWJsZS5udW1iZXI9MyApCgpgYGAKCiMjIE5vdyByZXBlYXQgdGhlc2Ugc3RlcHMgZm9yIFBBIAojIyMgbW9kZWwgc2VsZWN0aW9uOiBQVFEgb24gUEEKYGBge3J9CiMgUFRRIG9uIFBBIChtYWluIGVmZmVjdHMgb25seSkKcG9zLmVtYS5wdHEubm9YLm1vZGVsIDwtIGdsbXVsdGkodG90YWwgfiBVVy5QQW1lYW4rVVcuUEFTRCtVVy5QQW1zc2QrVVcuUEFza2V3K1VXLlBBaW5lcnRpYStVVy5QQWt1cnQsIGRhdGEgPSBjb2cuZW1hLCBmaXRmdW5jID0gbG0sIGNyaXQgPSBhaWMsIG1ldGhvZCA9ICJoIiwgbGV2ZWwgPSAxKQpzdW1tYXJ5KHBvcy5lbWEucHRxLm5vWC5tb2RlbCkKCmBgYAoKIyMjIG1vZGVsIGZpdHRpbmc6IFBUUSBvbiBQQQpgYGB7cn0KI05vdyBmaXQgdGhlIGJlc3QgbW9kZWwKYmVzdC5tb2RlbC5QVFEuUEEubm9YIDwtIGxtKHRvdGFsIH4gMSArIFVXLlBBbWVhbiArIFVXLlBBbXNzZCArIFVXLlBBc2tldyArIFVXLlBBaW5lcnRpYSwgZGF0YSA9IGNvZy5lbWEpCnN1bW1hcnkoYmVzdC5tb2RlbC5QVFEuUEEubm9YKQoKIyBnZXR3ZCgpCiMgYXBhLnJlZy50YWJsZShiZXN0Lm1vZGVsLlBUUS5QQS5ub1gsICIvVm9sdW1lcy9Hcm91cHMvQUhlbGxlcl9MYWIvQWRtaW5pc3RyYXRvci9BbmFseXNpcy9TLUVNQS9TdHJ1Y3R1cmFsIE1vZGVsL0pBUyBhZGRpdGlvbmFsIGFuYWx5c2VzIDAxLjIwMjAvVGFibGU0X1JlZ19iZXN0Lm1vZGVsLlBUUS5QQS5ub1hfQVBBLmRvYyIsIHRhYmxlLm51bWJlcj00ICkKYGBgCgojIyBOb3cgcmVwZWF0IHRoZXNlIHN0ZXBzIGZvciBBU0kKIyMjIG1vZGVsIHNlbGVjdGlvbjogQVNJIG9uIE5BCmBgYHtyfQojIyMjIE5BCiMgQVNJIG9uIE5BIAoKbmVnLmVtYS5BU0kuTkEubm9YLm1vZGVsIDwtIGdsbXVsdGkoYXNpLnNob3J0IH4gVVcuTkFtZWFuK1VXLk5BU0QrVVcuTkFtc3NkK1VXLk5Bc2tldytVVy5OQWluZXJ0aWErVVcuTkFrdXJ0LCBkYXRhID0gY29nLmVtYSwgZml0ZnVuYyA9IGxtLCBjcml0ID0gYWljLCBtZXRob2QgPSAiaCIsIGxldmVsID0gMSkKCnN1bW1hcnkobmVnLmVtYS5BU0kuTkEubm9YLm1vZGVsKQpgYGAKCiMjIyBtb2RlbCBmaXR0aW5nOiBBU0kgb24gTkEKYGBge3J9CmJlc3QubW9kZWwuQVNJLk5BLm5vWCA8LSBsbShhc2kuc2hvcnQgfiAxICsgVVcuTkFtZWFuLCBkYXRhID0gY29nLmVtYSkKc3VtbWFyeShiZXN0Lm1vZGVsLkFTSS5OQS5ub1gpCgojIGdldHdkKCkKIyBhcGEucmVnLnRhYmxlKGJlc3QubW9kZWwuQVNJLk5BLm5vWCwgIi9Wb2x1bWVzL0dyb3Vwcy9BSGVsbGVyX0xhYi9BZG1pbmlzdHJhdG9yL0FuYWx5c2lzL1MtRU1BL1N0cnVjdHVyYWwgTW9kZWwvSkFTIGFkZGl0aW9uYWwgYW5hbHlzZXMgMDEuMjAyMC9UYWJsZTVfUmVnX2Jlc3QubW9kZWwuQVNJLk5BLm5vWF9BUEEuZG9jIiwgdGFibGUubnVtYmVyPTUgKQpgYGAKCiMjIyBtb2RlbCBzZWxlY3Rpb246IEFTSSBvbiBQQQpgYGB7cn0KIyMjIyBQQQojIEFTSSBvbiBQQSAKcG9zLmVtYS5BU0kuUEEubm9YLm1vZGVsIDwtIGdsbXVsdGkoYXNpLnNob3J0IH4gVVcuUEFtZWFuK1VXLlBBU0QrVVcuUEFtc3NkK1VXLlBBc2tldytVVy5QQWluZXJ0aWErVVcuUEFrdXJ0LCBkYXRhID0gY29nLmVtYSwgZml0ZnVuYyA9IGxtLCBjcml0ID0gYWljLCBtZXRob2QgPSAiaCIsIGxldmVsID0gMSkKc3VtbWFyeShwb3MuZW1hLkFTSS5QQS5ub1gubW9kZWwpCmBgYAoKIyMjIG1vZGVsIGZpdHRpbmc6IEFTSSBvbiBQQQpgYGB7cn0KI05vdyBmaXQgdGhlIGJlc3QgbW9kZWwKYmVzdC5tb2RlbC5QVFEuUEEubm9YIDwtIGxtKGFzaS5zaG9ydCB+IDEgKyBVVy5QQW1lYW4gKyBVVy5QQW1zc2QgKyBVVy5QQWluZXJ0aWEsIGRhdGEgPSBjb2cuZW1hKQpzdW1tYXJ5KGJlc3QubW9kZWwuUFRRLlBBLm5vWCkKCiMgZ2V0d2QoKQojIGFwYS5yZWcudGFibGUoYmVzdC5tb2RlbC5QVFEuUEEubm9YLCAiL1ZvbHVtZXMvR3JvdXBzL0FIZWxsZXJfTGFiL0FkbWluaXN0cmF0b3IvQW5hbHlzaXMvUy1FTUEvU3RydWN0dXJhbCBNb2RlbC9KQVMgYWRkaXRpb25hbCBhbmFseXNlcyAwMS4yMDIwL1RhYmxlNl9SZWdfYmVzdC5tb2RlbC5BU0kuUEEubm9YX0FQQS5kb2MiLCB0YWJsZS5udW1iZXI9NiApCgpgYGAKCg==