Artículo científico

Datos

Lectura de datos

Objetivos

Resultados del paper

Correlaciones

  • Aunque fueron numerosos los resultados obtenidos por los autores, para el objetivo de este documento se destacan los siguientes:
    • La relación entre el área transversal relativa (CSA) del recto abdominal (AR) del lado de la pierna de despegue y el mejor registro personal para el salto largo.
      • Correlación: 0.674
      • Valor p: 0.004 (estadísticamente significativo)
  • Las correlaciones (con intervalo de confianza del 95%) se presentan en la siguiente tabla:

Predichos vs Reales (paper)

Resultados adicionales con R

Comparativos

  • Se comparan registros de cross-sectional area (CSA) de la pierna de despeque (takeoff) vs la pierna libre (free). Las variables (músculos) a comparar son las siguientes:
    • RA: recto abdominal.
    • OB: oblicuos internos y externos.
    • PM: psoas mayor.
    • QL: cuadrado lumbar.
    • ES: erector spinae.
    • Gmax: gluteo mayor.
    • Gmed: gluteos medio y mínimo.
    • IL: iliaco

Shapiro Wilk

Se comprueba la normalidad de las variables (\(\alpha = 0.05\)), bajo el siguiente juego de hipótesis:

\[H_0: X \sim N(\mu, \sigma^2)\\ H1: x \nsim N(\mu, \sigma^2)\]

  • Nota: aunque los autores mencionan que fueron aplicadas las pruebas de Shapiro Wilk para comprobar el supuesto de normalidad, en la tabla anterior se evidencia que algunas variables (ej. distancia de salto, grasa subcutanea, entre otras) no se distribuyen de forma normal. Este resultado tiene connotaciones de importancia, ya que las correlaciones podrían ser obtenidas mediante métodos no paramétricos.

Matriz de correlaciones

  • Se construye la matriz de correlaciones (método de Pearson).
  • La variable que presente mayor correlación lineal con la longitud del salto, será tenida en cuenta para estructurar el modelo de regresión lineal simple (RLS). Con las demás variables se construyen modelos de regresión lineal múltiple (RLM).

  • Notas:
    • Se evidencia alta correlación entre algunas variables. Este patrón sugiere problemas de multicolinealidad al ajustar un modelo de RLM.
    • Atletas con mayor altura tienden a presentar saltos de menor distancia. Este comportamiento es obtenido de igual forma en aquellos que aumentan la velocidad del sprint al saltar, es decir, que a mayor velocidad, menor longitud de salto.
    • Atletas con el músculo recto abdominal de mayor longitud, presentan mayores distancias en sus saltos. Con esta variable se ajusta el modelo de RLS.

Regresión Lineal Simple (RLS)

Modelo Lineal con lm()


Call:
lm(formula = dist_salto_cm ~ RA_takeof_leg, data = datos)

Residuals:
   Min     1Q Median     3Q    Max 
-72.26 -22.41   8.38  22.24  65.10 

Coefficients:
              Estimate Std. Error t value Pr(>|t|)    
(Intercept)    589.584     49.894  11.817 9.66e-11 ***
RA_takeof_leg   11.928      4.443   2.685   0.0139 *  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 40.89 on 21 degrees of freedom
  (22 observations deleted due to missingness)
Multiple R-squared:  0.2555,    Adjusted R-squared:  0.2201 
F-statistic: 7.208 on 1 and 21 DF,  p-value: 0.01387
  • Nota: el resultado anterior sugiere que la variable RA_takeof_leg es estadísticamente significativa (\(valor\ p =0.0139\)) sobre la variabilidad observada en la distancia del salto. Además, se puede inferir que por cada unidad que aumenta RA_takeof_leg, la distancia de salto es 11.928 centímetros mayor. La variable RA_takeof_leg explica 22.01% de la variabilidad observada en la distancia de salto.

Significancia Estadística

Analysis of Variance Table

Response: dist_salto_cm
              Df Sum Sq Mean Sq F value  Pr(>F)  
RA_takeof_leg  1  12050 12050.0  7.2078 0.01387 *
Residuals     21  35108  1671.8                  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residuales

  • Normalidad (Shapiro Wilk) de los residuales:

    Shapiro-Wilk normality test

data:  residuals(mod_rls)
W = 0.96191, p-value = 0.5029

    studentized Breusch-Pagan test

data:  mod_rls
BP = 0.0025838, df = 1, p-value = 0.9595

    Durbin-Watson test

data:  mod_rls
DW = 2.1677, p-value = 0.7123
alternative hypothesis: true autocorrelation is greater than 0
  • Se comprueba que existe normalidad de los residuos, son homocedasticos y no existe autocorrelación de los mismos.

Regresión Lineal Múltiple (RLM)

Modelo 0


Call:
lm(formula = dist_salto_cm ~ ., data = datos %>% select_if(is.numeric) %>% 
    select(-id))

Residuals:
       1        2        3        4        5        6        7        8        9 
-0.24001 -1.43196 -0.91660 -0.75285 -0.04370  1.48290 -0.44264  1.69525 -0.39388 
      10       11       12       13       14       15       16       17       18 
 1.11512 -1.41008  0.27780 -0.83303 -0.28836  1.11155 -0.39267  0.08616  1.18270 
      19       20       21       22       23 
 0.62738 -0.80017  1.33190 -1.93656  0.97174 

Coefficients:
                     Estimate Std. Error t value Pr(>|t|)  
(Intercept)         1266.6968   182.3241   6.948   0.0910 .
edad                 -23.4171     3.4665  -6.755   0.0936 .
altura_cm              6.1246     1.3465   4.549   0.1378  
imc                   -2.7528     1.3980  -1.969   0.2992  
sprint_100m_seconds  -92.8684     5.1288 -18.107   0.0351 *
RA_takeof_leg        124.1035    12.0047  10.338   0.0614 .
OB_takeof_leg          7.1425     2.1907   3.260   0.1895  
PM_takeof_leg          9.0525     2.7581   3.282   0.1883  
QL_takeof_leg          7.8868     1.4157   5.571   0.1131  
ES_takeof_leg         35.5716     5.3988   6.589   0.0959 .
Gmax_takeof_leg       -1.0174     0.8984  -1.132   0.4605  
Gmed_takeof_leg      -10.5371     0.9414 -11.193   0.0567 .
IL_takeof_leg         -0.4193     2.4356  -0.172   0.8915  
RA_free_leg          -86.7869     9.1217  -9.514   0.0667 .
OB_free_leg           -2.4849     1.2159  -2.044   0.2897  
PM_free_leg          -17.9138     3.3439  -5.357   0.1175  
QL_free_leg           -7.7265     3.9823  -1.940   0.3030  
ES_free_leg          -49.2399     6.2703  -7.853   0.0806 .
Gmax_free_leg          2.4543     0.5668   4.330   0.1445  
Gmed_free_leg         12.7940     0.9606  13.319   0.0477 *
IL_free_leg            2.8488     2.3869   1.194   0.4440  
grasa_subcut_cm2      -2.3272     0.3648  -6.379   0.0990 .
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 4.83 on 1 degrees of freedom
  (22 observations deleted due to missingness)
Multiple R-squared:  0.9995,    Adjusted R-squared:  0.9891 
F-statistic: 96.23 on 21 and 1 DF,  p-value: 0.08023
  • El R2 ajustado es próximo a 1, sin embargo, pocas variables independientes (predictoras) son estadísticamente significativas (\(p<0.05\)), patron de comportamiento que sugiere problemas de multicolinealidad. La siguiente gráfica muestra anomalías en los residuales del modelo.

  • Estos resultados evidencian que el modelo ajustado no es adecuado para explicar la variabilidad observada en la distancia de salto. Es importante resaltar que el R2 no es la mejor medida de bondad de ajuste, ya que éste aumenta en función del número de predictores.

Modelo 1

  • Selección de predictores teniendo en cuenta valores iguales o inferiores a 0.70 de correlación. La selección es posible con la bibliteca usdm que posee funciones flexibles para diagnósticos de multicolinealidad.
10 variables from the 21 input variables have collinearity problem: 
 
ES_free_leg RA_takeof_leg OB_takeof_leg PM_takeof_leg Gmed_takeof_leg imc Gmax_free_leg Gmax_takeof_leg ES_takeof_leg QL_free_leg 

After excluding the collinear variables, the linear correlation coefficients ranges between: 
min correlation ( OB_free_leg ~ sprint_100m_seconds ):  -0.001734317 
max correlation ( IL_free_leg ~ IL_takeof_leg ):  0.6817036 

---------- VIFs of the remained variables -------- 
  • Este resultado muestra que de las 21 variables consideradas en el modelo inicial (modelo 0) 10 de ellas presentan problemas de colinealidad. Tomando un límite de 0.70 de correlación como criterio de exclusión de predictores, la correlación máxima presente en las variables seleccionadas es de 0.68. La tabla anterior muestra los predictores que podrían hacer parte del modelo.

  • Nuevo modelo:


Call:
lm(formula = dist_salto_cm ~ edad + altura_cm + sprint_100m_seconds + 
    QL_takeof_leg + IL_takeof_leg + RA_free_leg + OB_free_leg + 
    PM_free_leg + Gmed_free_leg + IL_free_leg + grasa_subcut_cm2, 
    data = datos)

Residuals:
    Min      1Q  Median      3Q     Max 
-39.024 -13.760  -0.812  13.552  38.971 

Coefficients:
                     Estimate Std. Error t value Pr(>|t|)    
(Intercept)         1859.2274   339.7523   5.472 0.000194 ***
edad                   4.8879     5.8586   0.834 0.421854    
altura_cm             -3.8708     1.5704  -2.465 0.031409 *  
sprint_100m_seconds  -58.9174    20.8987  -2.819 0.016692 *  
QL_takeof_leg         -2.5243     5.5584  -0.454 0.658553    
IL_takeof_leg         10.7345     6.0471   1.775 0.103514    
RA_free_leg            6.0558     5.5662   1.088 0.299875    
OB_free_leg           -0.4214     2.0322  -0.207 0.839505    
PM_free_leg           -0.1120     3.1732  -0.035 0.972481    
Gmed_free_leg         -0.6212     1.5826  -0.393 0.702176    
IL_free_leg           -4.6031     6.7318  -0.684 0.508261    
grasa_subcut_cm2       0.4789     0.8361   0.573 0.578311    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 29.51 on 11 degrees of freedom
  (22 observations deleted due to missingness)
Multiple R-squared:  0.7968,    Adjusted R-squared:  0.5936 
F-statistic: 3.921 on 11 and 11 DF,  p-value: 0.01622
  • El R2 ajustado es igual a 0.5936 y sólo son estadísticamente significativas las variables altura y sprint. En general, el modelo es estadísticamente significativo (\(p = 0.01622\)) para explicar la variabilidad en la distancia de salto.

Modelo 2

  • Son excluidas variables que presenten VIF por encima de 10.
6 variables from the 21 input variables have collinearity problem: 
 
ES_free_leg RA_takeof_leg imc OB_takeof_leg Gmax_takeof_leg PM_takeof_leg 

After excluding the collinear variables, the linear correlation coefficients ranges between: 
min correlation ( OB_free_leg ~ sprint_100m_seconds ):  -0.001734317 
max correlation ( Gmed_free_leg ~ Gmed_takeof_leg ):  0.8683011 

---------- VIFs of the remained variables -------- 
  • Este método de selección arroja que 6 de las 21 variables totales (mod_rlm0) tienen problemas de colinealidad. El modelo considera 15 variables como independientes, con valores máximos de VIF que no superan 9.64.

  • Nuevo modelo:


Call:
lm(formula = dist_salto_cm ~ edad + altura_cm + sprint_100m_seconds + 
    QL_takeof_leg + IL_takeof_leg + RA_free_leg + OB_free_leg + 
    PM_free_leg + Gmed_free_leg + IL_free_leg + grasa_subcut_cm2 + 
    ES_takeof_leg + Gmed_takeof_leg + QL_free_leg + Gmax_free_leg, 
    data = datos)

Residuals:
    Min      1Q  Median      3Q     Max 
-31.787  -9.943   0.621   8.825  41.008 

Coefficients:
                      Estimate Std. Error t value Pr(>|t|)   
(Intercept)         2148.78930  411.69356   5.219  0.00123 **
edad                   2.60937    6.48691   0.402  0.69950   
altura_cm             -4.05747    1.69627  -2.392  0.04803 * 
sprint_100m_seconds  -75.17773   24.48274  -3.071  0.01805 * 
QL_takeof_leg          2.87009    8.02411   0.358  0.73112   
IL_takeof_leg         11.95805    7.06408   1.693  0.13433   
RA_free_leg            7.78298    6.68455   1.164  0.28244   
OB_free_leg            0.49818    2.85436   0.175  0.86639   
PM_free_leg            1.05675    3.95723   0.267  0.79713   
Gmed_free_leg          3.73730    3.50620   1.066  0.32184   
IL_free_leg           -8.81768    7.69175  -1.146  0.28931   
grasa_subcut_cm2       0.61986    0.97455   0.636  0.54497   
ES_takeof_leg         -3.66857    2.95889  -1.240  0.25498   
Gmed_takeof_leg       -3.10319    3.03813  -1.021  0.34105   
QL_free_leg           -7.34943   10.65306  -0.690  0.51248   
Gmax_free_leg          0.08009    2.32387   0.034  0.97347   
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 31.11 on 7 degrees of freedom
  (22 observations deleted due to missingness)
Multiple R-squared:  0.8564,    Adjusted R-squared:  0.5486 
F-statistic: 2.782 on 15 and 7 DF,  p-value: 0.08803
  • El R2 ajustado es igual a 0.5486 y sólo son estadísticamente significativas las variables altura y sprint. En general, el modelo no es estadísticamente significativo (\(p = 0.08803\)) para explicar la variabilidad en la distancia de salto. Dado que aún hay presencia de un número elevado de predictores, se construye el modelo final luego de aplicar el método Stepwise, basado en el Criterio de Información de Akaike.
Start:  AIC=162.76
dist_salto_cm ~ edad + altura_cm + sprint_100m_seconds + QL_takeof_leg + 
    IL_takeof_leg + RA_free_leg + OB_free_leg + PM_free_leg + 
    Gmed_free_leg + IL_free_leg + grasa_subcut_cm2 + ES_takeof_leg + 
    Gmed_takeof_leg + QL_free_leg + Gmax_free_leg

                      Df Sum of Sq     RSS    AIC
- Gmax_free_leg        1       1.1  6774.8 160.77
- OB_free_leg          1      29.5  6803.1 160.86
- PM_free_leg          1      69.0  6842.6 161.00
- QL_takeof_leg        1     123.8  6897.4 161.18
- edad                 1     156.6  6930.2 161.29
- grasa_subcut_cm2     1     391.5  7165.1 162.05
- QL_free_leg          1     460.6  7234.2 162.28
<none>                              6773.6 162.76
- Gmed_takeof_leg      1    1009.6  7783.2 163.96
- Gmed_free_leg        1    1099.4  7873.1 164.22
- IL_free_leg          1    1271.7  8045.3 164.72
- RA_free_leg          1    1311.8  8085.5 164.83
- ES_takeof_leg        1    1487.5  8261.2 165.33
- IL_takeof_leg        1    2772.9  9546.5 168.65
- altura_cm            1    5536.6 12310.3 174.50
- sprint_100m_seconds  1    9123.9 15897.6 180.38

Step:  AIC=160.77
dist_salto_cm ~ edad + altura_cm + sprint_100m_seconds + QL_takeof_leg + 
    IL_takeof_leg + RA_free_leg + OB_free_leg + PM_free_leg + 
    Gmed_free_leg + IL_free_leg + grasa_subcut_cm2 + ES_takeof_leg + 
    Gmed_takeof_leg + QL_free_leg

                      Df Sum of Sq     RSS    AIC
- OB_free_leg          1      35.5  6810.3 158.89
- PM_free_leg          1      99.7  6874.5 159.10
- QL_takeof_leg        1     126.0  6900.8 159.19
- edad                 1     155.8  6930.6 159.29
- grasa_subcut_cm2     1     440.8  7215.6 160.22
- QL_free_leg          1     462.1  7236.9 160.28
<none>                              6774.8 160.77
- Gmed_free_leg        1    1218.9  7993.6 162.57
+ Gmax_free_leg        1       1.1  6773.6 162.76
- IL_free_leg          1    1293.7  8068.4 162.78
- RA_free_leg          1    1349.1  8123.8 162.94
- Gmed_takeof_leg      1    1367.9  8142.7 163.00
- ES_takeof_leg        1    1816.1  8590.9 164.23
- IL_takeof_leg        1    3018.5  9793.3 167.24
- altura_cm            1    5693.6 12468.4 172.80
- sprint_100m_seconds  1    9166.3 15941.1 178.45

Step:  AIC=158.89
dist_salto_cm ~ edad + altura_cm + sprint_100m_seconds + QL_takeof_leg + 
    IL_takeof_leg + RA_free_leg + PM_free_leg + Gmed_free_leg + 
    IL_free_leg + grasa_subcut_cm2 + ES_takeof_leg + Gmed_takeof_leg + 
    QL_free_leg

                      Df Sum of Sq     RSS    AIC
- PM_free_leg          1      79.0  6889.4 157.15
- QL_takeof_leg        1     102.9  6913.2 157.23
- edad                 1     207.8  7018.2 157.58
- grasa_subcut_cm2     1     414.3  7224.6 158.24
- QL_free_leg          1     508.6  7318.9 158.54
<none>                              6810.3 158.89
- Gmed_free_leg        1    1202.6  8012.9 160.63
+ OB_free_leg          1      35.5  6774.8 160.77
+ Gmax_free_leg        1       7.2  6803.1 160.86
- IL_free_leg          1    1288.8  8099.1 160.87
- Gmed_takeof_leg      1    1341.6  8151.9 161.02
- ES_takeof_leg        1    1786.2  8596.5 162.24
- RA_free_leg          1    1909.5  8719.8 162.57
- IL_takeof_leg        1    3197.1 10007.5 165.74
- altura_cm            1    5844.6 12654.9 171.14
- sprint_100m_seconds  1    9529.2 16339.5 177.01

Step:  AIC=157.15
dist_salto_cm ~ edad + altura_cm + sprint_100m_seconds + QL_takeof_leg + 
    IL_takeof_leg + RA_free_leg + Gmed_free_leg + IL_free_leg + 
    grasa_subcut_cm2 + ES_takeof_leg + Gmed_takeof_leg + QL_free_leg

                      Df Sum of Sq     RSS    AIC
- QL_takeof_leg        1     149.4  7038.8 155.65
- edad                 1     421.9  7311.2 156.52
- grasa_subcut_cm2     1     518.3  7407.6 156.82
- QL_free_leg          1     579.2  7468.5 157.01
<none>                              6889.4 157.15
+ PM_free_leg          1      79.0  6810.3 158.89
+ Gmax_free_leg        1      38.0  6851.3 159.02
- Gmed_free_leg        1    1288.9  8178.2 159.10
+ OB_free_leg          1      14.8  6874.5 159.10
- Gmed_takeof_leg      1    1348.2  8237.6 159.26
- IL_free_leg          1    1368.2  8257.6 159.32
- ES_takeof_leg        1    1710.1  8599.5 160.25
- RA_free_leg          1    1830.5  8719.8 160.57
- IL_takeof_leg        1    3448.0 10337.3 164.48
- altura_cm            1    6137.7 13027.0 169.80
- sprint_100m_seconds  1   10215.0 17104.4 176.07

Step:  AIC=155.65
dist_salto_cm ~ edad + altura_cm + sprint_100m_seconds + IL_takeof_leg + 
    RA_free_leg + Gmed_free_leg + IL_free_leg + grasa_subcut_cm2 + 
    ES_takeof_leg + Gmed_takeof_leg + QL_free_leg

                      Df Sum of Sq     RSS    AIC
- edad                 1     365.4  7404.1 154.81
- QL_free_leg          1     440.4  7479.2 155.04
- grasa_subcut_cm2     1     606.6  7645.4 155.55
<none>                              7038.8 155.65
- Gmed_free_leg        1    1157.1  8195.9 157.15
+ QL_takeof_leg        1     149.4  6889.4 157.15
+ PM_free_leg          1     125.6  6913.2 157.23
- Gmed_takeof_leg      1    1225.7  8264.5 157.34
+ Gmax_free_leg        1      12.2  7026.6 157.60
+ OB_free_leg          1       0.2  7038.6 157.64
- IL_free_leg          1    1370.9  8409.7 157.74
- ES_takeof_leg        1    1589.8  8628.5 158.33
- RA_free_leg          1    1979.9  9018.7 159.35
- IL_takeof_leg        1    3493.6 10532.4 162.91
- altura_cm            1    6405.2 13443.9 168.53
- sprint_100m_seconds  1   10188.9 17227.6 174.23

Step:  AIC=154.81
dist_salto_cm ~ altura_cm + sprint_100m_seconds + IL_takeof_leg + 
    RA_free_leg + Gmed_free_leg + IL_free_leg + grasa_subcut_cm2 + 
    ES_takeof_leg + Gmed_takeof_leg + QL_free_leg

                      Df Sum of Sq     RSS    AIC
- grasa_subcut_cm2     1     585.1  7989.3 154.56
<none>                              7404.1 154.81
- QL_free_leg          1     791.7  8195.9 155.15
+ edad                 1     365.4  7038.8 155.65
+ PM_free_leg          1     332.1  7072.1 155.75
+ QL_takeof_leg        1      92.9  7311.2 156.52
+ Gmax_free_leg        1      44.0  7360.2 156.67
- Gmed_free_leg        1    1355.5  8759.6 156.68
+ OB_free_leg          1      17.6  7386.6 156.75
- IL_free_leg          1    1498.2  8902.3 157.05
- ES_takeof_leg        1    1552.0  8956.1 157.19
- Gmed_takeof_leg      1    1793.9  9198.0 157.80
- IL_takeof_leg        1    3493.9 10898.0 161.70
- RA_free_leg          1    3552.7 10956.8 161.82
- altura_cm            1    6309.8 13714.0 166.99
- sprint_100m_seconds  1   14910.2 22314.4 178.18

Step:  AIC=154.56
dist_salto_cm ~ altura_cm + sprint_100m_seconds + IL_takeof_leg + 
    RA_free_leg + Gmed_free_leg + IL_free_leg + ES_takeof_leg + 
    Gmed_takeof_leg + QL_free_leg

                      Df Sum of Sq     RSS    AIC
- QL_free_leg          1     454.7  8444.0 153.83
<none>                              7989.3 154.56
+ grasa_subcut_cm2     1     585.1  7404.1 154.81
+ PM_free_leg          1     520.3  7468.9 155.01
- IL_free_leg          1     947.6  8936.9 155.14
- ES_takeof_leg        1    1107.1  9096.4 155.54
+ edad                 1     343.9  7645.4 155.55
- Gmed_free_leg        1    1283.8  9273.1 155.99
+ Gmax_free_leg        1     170.2  7819.1 156.06
+ QL_takeof_leg        1     164.9  7824.3 156.08
+ OB_free_leg          1       1.4  7987.9 156.55
- Gmed_takeof_leg      1    1978.0  9967.3 157.65
- IL_takeof_leg        1    2914.2 10903.4 159.71
- RA_free_leg          1    3510.1 11499.4 160.94
- altura_cm            1    6059.0 14048.3 165.54
- sprint_100m_seconds  1   16150.3 24139.5 177.99

Step:  AIC=153.83
dist_salto_cm ~ altura_cm + sprint_100m_seconds + IL_takeof_leg + 
    RA_free_leg + Gmed_free_leg + IL_free_leg + ES_takeof_leg + 
    Gmed_takeof_leg

                      Df Sum of Sq     RSS    AIC
<none>                              8444.0 153.83
+ PM_free_leg          1     603.1  7840.8 154.13
+ edad                 1     600.6  7843.4 154.13
- Gmed_free_leg        1     935.8  9379.8 154.25
+ QL_free_leg          1     454.7  7989.3 154.56
- IL_free_leg          1    1063.8  9507.8 154.56
+ grasa_subcut_cm2     1     248.1  8195.9 155.15
- ES_takeof_leg        1    1366.9  9810.9 155.28
+ OB_free_leg          1     164.7  8279.3 155.38
+ Gmax_free_leg        1      61.2  8382.8 155.66
+ QL_takeof_leg        1      28.1  8415.9 155.75
- Gmed_takeof_leg      1    1615.8 10059.7 155.86
- IL_takeof_leg        1    3156.5 11600.5 159.14
- RA_free_leg          1    4051.8 12495.8 160.85
- altura_cm            1    5609.7 14053.7 163.55
- sprint_100m_seconds  1   16115.0 24559.0 176.39
  • Este método sugiere que el mejor modelo alcanza un valor mínimo de AIC igual a 153.83, cuando son consideradas las variables altura, sprint, IL_takeoff, RA_free, Gmed_free, IL_free, ES_takeoff y Gmed_takeoff. Son estadísticamente significativas la altura, sprint, IL_takeoff y RA_free; con R2 ajustado igual a 0.7186 (cercano al valor (0.763) reportado por los autores en el paper).

Call:
lm(formula = dist_salto_cm ~ altura_cm + sprint_100m_seconds + 
    IL_takeof_leg + RA_free_leg + Gmed_free_leg + IL_free_leg + 
    ES_takeof_leg + Gmed_takeof_leg, data = datos)

Residuals:
    Min      1Q  Median      3Q     Max 
-37.963  -9.854   1.429  12.784  38.271 

Coefficients:
                    Estimate Std. Error t value Pr(>|t|)    
(Intercept)         2117.013    232.811   9.093 2.99e-07 ***
altura_cm             -3.298      1.081  -3.050 0.008654 ** 
sprint_100m_seconds  -79.567     15.393  -5.169 0.000142 ***
IL_takeof_leg         10.107      4.418   2.288 0.038232 *  
RA_free_leg           10.418      4.020   2.592 0.021311 *  
Gmed_free_leg          2.936      2.357   1.246 0.233340    
IL_free_leg           -6.554      4.935  -1.328 0.205398    
ES_takeof_leg         -2.534      1.683  -1.505 0.154437    
Gmed_takeof_leg       -2.973      1.816  -1.637 0.123959    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 24.56 on 14 degrees of freedom
  (22 observations deleted due to missingness)
Multiple R-squared:  0.8209,    Adjusted R-squared:  0.7186 
F-statistic: 8.023 on 8 and 14 DF,  p-value: 0.0004255

Modelo 3

  • La función plsr() del paquete pls permite ajustar modelos con Partial Least Squares, además, incluye la posibilidad de recurrir a validación cruzada para identificar el número adecuado de componentes con el cual minimizar el cuadrado medio del error. En este caso particular usé la opción de cross-validation y se identifica un sólo componente principal como óptimo. La biblioteca caret también permite ajustar modelos de mínimos cuadrados parciales (PLS) y regresión por componentes principales (PCR).

Comparación de modelos

\[CME = \frac{1}{n}\sum^{n}_{i = 1}(y_i - \hat{y_i})^2\]

Conclusiones

Anexos

Biblioteca car

  • Con la biblioteca car, haciendo uso de la función vif, es posible conocer los valores del Factor de Inflación de Varianza.
               edad           altura_cm                 imc sprint_100m_seconds 
          30.551616           46.551051           78.222318            3.767064 
      RA_takeof_leg       OB_takeof_leg       PM_takeof_leg       QL_takeof_leg 
         523.233517           69.187078           67.892841            4.960818 
      ES_takeof_leg     Gmax_takeof_leg     Gmed_takeof_leg       IL_takeof_leg 
         661.053994           32.048069           35.930840           15.504385 
        RA_free_leg         OB_free_leg         PM_free_leg         QL_free_leg 
         322.636871           29.338158           82.874550           26.189789 
        ES_free_leg       Gmax_free_leg       Gmed_free_leg         IL_free_leg 
         853.136657           16.326639           30.031175           16.590305 
   grasa_subcut_cm2 
          15.271952 
  • Estos mismos valores se pueden obtener manualmente con la diagonal de la inversa de la matriz de correlaciones.
               edad           altura_cm                 imc sprint_100m_seconds 
          30.551616           46.551051           78.222318            3.767064 
      RA_takeof_leg       OB_takeof_leg       PM_takeof_leg       QL_takeof_leg 
         523.233517           69.187078           67.892841            4.960818 
      ES_takeof_leg     Gmax_takeof_leg     Gmed_takeof_leg       IL_takeof_leg 
         661.053994           32.048069           35.930840           15.504385 
        RA_free_leg         OB_free_leg         PM_free_leg         QL_free_leg 
         322.636871           29.338158           82.874550           26.189789 
        ES_free_leg       Gmax_free_leg       Gmed_free_leg         IL_free_leg 
         853.136657           16.326639           30.031175           16.590305 
   grasa_subcut_cm2 
          15.271952 
LS0tDQp0aXRsZTogIkFuw6FsaXNpcyBkZSBSZWdyZXNpw7NuIGNvbiBSIg0Kc3VidGl0bGU6ICJDb21wYXJhY2nDs24gZGUgbW9kZWxvcyBkZSByZWdyZXNpw7NuIGNvbiBSIg0KYXV0aG9yOiAiRWRpbWVyIERhdmlkIEphcmFtaWxsbyINCm91dHB1dDoNCiAgaHRtbF9ub3RlYm9vazoNCiAgICB0b2M6IHRydWUNCiAgICBjc3M6IGNzcy9lc3RpbG8uY3NzDQogICAgdGhlbWU6IGNvc21vDQogICAgaGlnaGxpZ2h0OiB6ZW5idXJuDQogICAgZGZfcHJpbnQ6IHBhZ2VkDQogICAgY29kZV9mb2xkaW5nOiBoaWRlDQotLS0NCg0KYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9DQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUsDQogICAgICAgICAgICAgICAgICAgICAgd2FybmluZyA9IEZBTFNFLA0KICAgICAgICAgICAgICAgICAgICAgIGVycm9yID0gRkFMU0UsDQogICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9IEZBTFNFLA0KICAgICAgICAgICAgICAgICAgICAgIGZpZy5hbGlnbiA9ICJjZW50ZXIiLA0KICAgICAgICAgICAgICAgICAgICAgIGZpZy53aWR0aCA9IDguNSwNCiAgICAgICAgICAgICAgICAgICAgICBmaWcuaGVpZ2h0ID0gNSkNCmBgYA0KDQo8aW1nIHNyYz0iaW1nL3NjaWVuY2UucG5nIiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjBweDtyaWdodDozMHB4OyB3aWR0aDoxNTBweCIgLz4NCg0KIyBBcnTDrWN1bG8gY2llbnTDrWZpY28NCg0KPGNlbnRlcj4NCjxpbWcgc3JjID0gImltZy9wYXBlci5wbmciIC8+DQo8L2NlbnRlcj4NCg0KIyBEYXRvcw0KDQotIERhdG9zIHRvbWFkb3MgZGVsIGFydMOtY3VsbyByZWZlcmVuY2lhZG8gcHJldmlhbWVudGUuDQotIFtGdWVudGUgZGUgZGF0b3MgLSBBcnTDrWN1bG8gZW4gUExPUyB8IE9ORS5dKGh0dHBzOi8vam91cm5hbHMucGxvcy5vcmcvcGxvc29uZS9hcnRpY2xlP2lkPTEwLjEzNzEvam91cm5hbC5wb25lLjAyMjU0MTMjcG9uZS0wMjI1NDEzLWcwMDEpDQotIEVuIGxhIGJhc2UgZGUgZGF0b3Mgc2UgdGllbmVuIGRvcyBncnVwb3MgYmFqbyBhbsOhbGlzaXM6DQogICAgLSAqKkdydXBvICpMb25nIGp1bXBlcnMqOioqIGlkIDEgYSAyMy4NCiAgICAtICoqR3J1cG8gKnVudHJhaW5lZCBtZW4qOioqIGlkIDI0LTQ1Lg0KDQojIExlY3R1cmEgZGUgZGF0b3MNCg0KYGBge3J9DQpsaWJyYXJ5KHJlYWR4bCkNCmxpYnJhcnkodGlkeXZlcnNlKQ0KZGF0b3MgPC0gcmVhZF94bHN4KCIuLi9kYXRhL0RhdGFfUGFwZXJfUGxvc19PbmVfTXVzY2xlLnhsc3giLCBza2lwID0gMywNCiAgICAgICAgICAgICAgICAgICBuYSA9ICJOL0EiLCBuX21heCA9IDQ3KSAlPiUgDQogIHJlbmFtZShSQV90YWtlb2ZfbGVnID0gUkEuLi43LA0KICAgICAgICAgT0JfdGFrZW9mX2xlZyA9IE9CLi4uOCwNCiAgICAgICAgIFBNX3Rha2VvZl9sZWcgPSBQTS4uLjksDQogICAgICAgICBRTF90YWtlb2ZfbGVnID0gUUwuLi4xMCwNCiAgICAgICAgIEVTX3Rha2VvZl9sZWcgPSBFUy4uLjExLA0KICAgICAgICAgR21heF90YWtlb2ZfbGVnID0gR21heC4uLjEyLA0KICAgICAgICAgR21lZF90YWtlb2ZfbGVnID0gR21lZC4uLjEzLA0KICAgICAgICAgSUxfdGFrZW9mX2xlZyA9IElMLi4uMTQsDQogICAgICAgICBSQV9mcmVlX2xlZyA9IFJBLi4uMTUsDQogICAgICAgICBPQl9mcmVlX2xlZyA9IE9CLi4uMTYsDQogICAgICAgICBQTV9mcmVlX2xlZyA9IFBNLi4uMTcsDQogICAgICAgICBRTF9mcmVlX2xlZyA9IFFMLi4uMTgsDQogICAgICAgICBFU19mcmVlX2xlZyA9IEVTLi4uMTksDQogICAgICAgICBHbWF4X2ZyZWVfbGVnID0gR21heC4uLjIwLA0KICAgICAgICAgR21lZF9mcmVlX2xlZyA9IEdtZWQuLi4yMSwNCiAgICAgICAgIElMX2ZyZWVfbGVnID0gSUwuLi4yMiwNCiAgICAgICAgIGlkID0gSUQsDQogICAgICAgICBlZGFkID0gYEFnZSAoeWVhcnMpYCwNCiAgICAgICAgIGFsdHVyYV9jbSA9IGBIZWlnaHQgKGNtKWAsDQogICAgICAgICBpbWMgPSBgQm9keSBtYXNzIChrZylgLA0KICAgICAgICAgZGlzdF9zYWx0b19jbSA9IGBsb25nIGp1bXAgZGlzdGFuY2UgKGNtKWAsDQogICAgICAgICBzcHJpbnRfMTAwbV9zZWNvbmRzID0gYDEwMC1tIHNwcmludCB0aW1lIChzKWAsDQogICAgICAgICBncmFzYV9zdWJjdXRfY20yID0gYFN1YmN1dGFuZW91cyBmYXQgQ1NBIChhYnNvbHV0ZSB2YWx1ZSwgY20yKWApICU+JSANCiAgbXV0YXRlKHR5cGUgPSBpZl9lbHNlKGlkICVpbiUgYygxOjIzKSwgdHJ1ZSA9ICJMb25nIGp1bXBlcnMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UgPSAiVW50cmFpbmVkIG1lbiIpKQ0KZGF0b3MNCmBgYA0KDQojIE9iamV0aXZvcw0KDQotIFJlcGxpY2FyIGFuw6FsaXNpcyBlc3RhZMOtc3RpY29zIGFwbGljYWRvcyBlbiBlbCBhcnTDrWN1bG8gY2llbnTDrWZpY28gZGUgaW50ZXLDqXMuDQotIEV2aWRlbmNpYXIgbGEgcmVsYWNpw7NuIGV4aXN0ZW50ZSBlbnRyZSBjYXJhY3RlcsOtc3RpY2FzIGFuYXTDs21pY2FzIGRlIGF0bGV0YXMgdnMgcmVuZGltaWVudG8gZW4gc2FsdG8gbGFyZ28uDQotIEV2YWx1YXIgb3Ryb3MgbcOpdG9kb3MgZGUgWypzdGF0aXN0aWNhbCBsZWFybmluZypdKGh0dHBzOi8vZWRpbWVyLmdpdGh1Yi5pby9kb2N1bWVudHNfUi9MaW5lYXJNb2RlbHNfTGVhc3RTcXVhcmVzL0xpbmVhck1vZGVsc19MZWFzdFNxYXVhcmVzLmh0bWwjMSkgeSBjb21wYXJhcmxvcyBjb24gbG9zIHJlc3VsdGFkb3Mgb2J0ZW5pZG9zIHBvciBsb3MgYXV0b3Jlcy4NCg0KIyBSZXN1bHRhZG9zIGRlbCAqcGFwZXIqIA0KDQojIyBDb3JyZWxhY2lvbmVzIA0KDQotIEF1bnF1ZSBmdWVyb24gbnVtZXJvc29zIGxvcyByZXN1bHRhZG9zIG9idGVuaWRvcyBwb3IgbG9zIGF1dG9yZXMsIHBhcmEgZWwgb2JqZXRpdm8gZGUgZXN0ZSBkb2N1bWVudG8gc2UgZGVzdGFjYW4gbG9zIHNpZ3VpZW50ZXM6DQogICAgLSBMYSByZWxhY2nDs24gZW50cmUgZWwgw6FyZWEgdHJhbnN2ZXJzYWwgcmVsYXRpdmEgKENTQSkgZGVsIHJlY3RvIGFiZG9taW5hbCAoQVIpIGRlbCBsYWRvIGRlIGxhIHBpZXJuYSBkZSBkZXNwZWd1ZSB5IGVsIG1lam9yIHJlZ2lzdHJvIHBlcnNvbmFsIHBhcmEgZWwgc2FsdG8gbGFyZ28uDQogICAgICAgIC0gKipDb3JyZWxhY2nDs246KiogMC42NzQNCiAgICAgICAgLSAqKlZhbG9yIHA6KiogMC4wMDQgKGVzdGFkw61zdGljYW1lbnRlIHNpZ25pZmljYXRpdm8pDQoNCi0gTGFzIGNvcnJlbGFjaW9uZXMgKGNvbiBpbnRlcnZhbG8gZGUgY29uZmlhbnphIGRlbCA5NSUpIHNlIHByZXNlbnRhbiBlbiBsYSBzaWd1aWVudGUgdGFibGE6DQoNCjxjZW50ZXI+DQo8aW1nIHNyYyA9ICJpbWcvY29ycmVsYXRpb25zLnBuZyIvPg0KPC9jZW50ZXI+DQoNCiMjIEdyw6FmaWNvIGRlIGRpc3BlcnNpw7NuIHsudGFic2V0IC50YWJzZXQtZmFkZSAudGFic2V0LXBpbGxzfQ0KDQojIyMgT3JpZ2luYWwNCg0KPGNlbnRlcj4NCjxpbWcgc3JjID0gImltZy9wYXBlcjIucG5nIiB3aWR0aD0iNDAwIiAvPg0KPC9jZW50ZXI+DQoNCiMjIyBSw6lwbGljYSBjb24gUg0KDQpgYGB7cn0NCmxpYnJhcnkoZ2dwbG90MikNCmRhdG9zICU+JSANCiAgZ2dwbG90KGRhdGEgPSAuLCBhZXMoeCA9IFJBX3Rha2VvZl9sZWcsIHkgPSBkaXN0X3NhbHRvX2NtKSkgKw0KICBnZW9tX3BvaW50KHNpemUgPSAzKSArDQogIGxhYnMoeCA9IGV4cHJlc3Npb24oJ1JlbGF0aXZlIENTQSBvZiBSQSB0YWtlb2ZmIGxlZyBzaWRlIC0gY20nXiIyIi8na2cnXiIyLzMiKSwNCiAgICAgICB5ID0gIlBlcnNvbmFsIGJlc3QgcmVjb3JkIG9mIGxvbmcganVtcCAoY20pIikgKw0KICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLCBzZSA9IEZBTFNFLCBsdHkgPSAzLCBsd2QgPSAxLCBjb2xvciA9ICJibGFjayIpICsNCiAgdGhlbWVfbGlnaHQoKQ0KYGBgDQoNCiMjIFByZWRpY2hvcyB2cyBSZWFsZXMgKCpwYXBlciopDQoNCjxjZW50ZXI+DQo8aW1nIHNyYyA9ICJpbWcvcGFwZXIzLnBuZyIgd2lkdGg9IjQwMCIgLz4NCjwvY2VudGVyPg0KDQojIFJlc3VsdGFkb3MgYWRpY2lvbmFsZXMgY29uIFINCg0KIyMgRGlzdHJpYnVjaW9uZXMNCg0KYGBge3IsIGZpZy5oZWlnaHQ9MTB9DQpkYXRvcyAlPiUgDQogIHNlbGVjdF9pZihpcy5udW1lcmljKSAlPiUgDQogIHNlbGVjdCgtaWQpICU+JSANCiAgZ2F0aGVyKGtleSA9ICJ2YXJpYWJsZSIsIHZhbHVlID0gInZhbG9yIikgJT4lIA0KICBnZ3Bsb3QoZGF0YSA9IC4sIGFlcyh4ID0gdmFsb3IpKSArDQogIGZhY2V0X3dyYXAoZmFjZXRzID0gfnZhcmlhYmxlLCBzY2FsZXMgPSAiZnJlZSIsIG5jb2wgPSA0KSArDQogIGdlb21faGlzdG9ncmFtKGFlcyh5ID0gLi5kZW5zaXR5Li4pLCBiaW5zID0gMTAsIGNvbG9yID0gImJsYWNrIiwgDQogICAgICAgICAgICAgICAgIGZpbGwgPSAiZ3JheTYwIikgKw0KICBnZW9tX2RlbnNpdHkoZmlsbCA9ICJncmF5NTAiLCBhbHBoYSA9IDAuMTgpICsNCiAgZ2VvbV9ydWcoKSArDQogIGxhYnMoeCA9ICIiLCB5ID0gIkRlbnNpZGFkIikgKw0KICB0aGVtZV9saWdodCgpICsNCiAgdGhlbWUoc3RyaXAuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gImRlZXBza3libHVlNCIpLA0KICAgICAgICBzdHJpcC50ZXh0ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIikpDQpgYGANCg0KIyMgR3LDoWZpY29zIGN1YW50aWwgY3VhbnRpbA0KDQpgYGB7ciwgZmlnLmhlaWdodD0xMH0NCmxpYnJhcnkocXFwbG90cikNCmRhdG9zICU+JSANCiAgc2VsZWN0X2lmKGlzLm51bWVyaWMpICU+JSANCiAgc2VsZWN0KC1pZCkgJT4lIA0KICBnYXRoZXIoa2V5ID0gInZhcmlhYmxlIiwgdmFsdWUgPSAidmFsb3IiKSAlPiUgDQogIGdncGxvdChkYXRhID0gLiwgYWVzKHNhbXBsZSA9IHZhbG9yKSkgKw0KICBmYWNldF93cmFwKGZhY2V0cyA9IH52YXJpYWJsZSwgc2NhbGVzID0gImZyZWUiLCBuY29sID0gNCkgKw0KICBnZW9tX3FxX2JhbmQoZmlsbCA9ICJncmF5MjUiKSArDQogIHN0YXRfcXFfbGluZShjb2xvciA9ICJkYXJrZ3JlZW4iKSArDQogIHN0YXRfcXFfcG9pbnQoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMC44KSArDQogIGxhYnMoeCA9ICJDdWFudGlsZXMgdGXDs3JpY29zIiwgeSA9ICJDdWFudGlsZXMgbXVlc3RyYWxlcyIpICsNCiAgdGhlbWVfbGlnaHQoKSArDQogIHRoZW1lKHN0cmlwLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJkZWVwc2t5Ymx1ZTQiKSwNCiAgICAgICAgc3RyaXAudGV4dCA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIpKQ0KYGBgDQoNCiMjIENvbXBhcmF0aXZvcyB7LnRhYnNldCAudGFic2V0LWZhZGUgLnRhYnNldC1waWxsc30NCg0KLSBTZSBjb21wYXJhbiByZWdpc3Ryb3MgIGRlICpjcm9zcy1zZWN0aW9uYWwgYXJlYSAoQ1NBKSogZGUgbGEgcGllcm5hIGRlIGRlc3BlcXVlICgqdGFrZW9mZiopIHZzIGxhIHBpZXJuYSBsaWJyZSAoKmZyZWUqKS4gTGFzIHZhcmlhYmxlcyAobcO6c2N1bG9zKSBhIGNvbXBhcmFyIHNvbiBsYXMgc2lndWllbnRlczoNCiAgICAtICoqUkE6KiogcmVjdG8gYWJkb21pbmFsLg0KICAgIC0gKipPQjoqKiBvYmxpY3VvcyBpbnRlcm5vcyB5IGV4dGVybm9zLg0KICAgIC0gKipQTToqKiBwc29hcyBtYXlvci4NCiAgICAtICoqUUw6KiogY3VhZHJhZG8gbHVtYmFyLg0KICAgIC0gKipFUzoqKiBlcmVjdG9yICpzcGluYWUqLg0KICAgIC0gKipHbWF4OioqIGdsdXRlbyBtYXlvci4NCiAgICAtICoqR21lZDoqKiBnbHV0ZW9zIG1lZGlvIHkgbcOtbmltby4NCiAgICAtICoqSUw6KiogaWxpYWNvDQoNCiMjIyAqVGFrZW9mZiB2cyBGcmVlKg0KDQpgYGB7ciwgZmlnLmhlaWdodD01LjV9DQpkZl90YWtlb2ZmX2xlZyA8LSBkYXRvcyAlPiUgDQogIHNlbGVjdChSQV90YWtlb2ZfbGVnOklMX3Rha2VvZl9sZWcpICU+JSANCiAgZ2F0aGVyKGtleSA9ICJ2YXJpYWJsZSIsIHZhbHVlID0gInZhbG9yIikgJT4lIA0KICBtdXRhdGUodGlwbyA9ICJUYWtlb2ZmTGVnIikNCg0KZGZfZnJlZV9sZWcgPC0gZGF0b3MgJT4lIA0KICBzZWxlY3QoUkFfZnJlZV9sZWc6SUxfZnJlZV9sZWcpICU+JSANCiAgZ2F0aGVyKGtleSA9ICJ2YXJpYWJsZSIsIHZhbHVlID0gInZhbG9yIikgJT4lIA0KICBtdXRhdGUodGlwbyA9ICJGcmVlTGVnIikNCg0KZGZfdGFrZW9mZl9mcmVlIDwtIGRmX3Rha2VvZmZfbGVnICU+JSANCiAgYmluZF9yb3dzKGRmX2ZyZWVfbGVnKQ0KDQpkZl90YWtlb2ZmX2ZyZWUgJT4lIA0KICBzZXBhcmF0ZShjb2wgPSB2YXJpYWJsZSwgaW50byA9IGMoInZhcmlhYmxlIiwgInYxIiwgInYyIikpICU+JSANCiAgc2VsZWN0KC1jKHYxLCB2MikpICAlPiUgDQogIGdncGxvdChkYXRhID0gLiwgYWVzKHggPSB0aXBvLCB5ID0gdmFsb3IsIGZpbGwgPSB0aXBvKSkgKw0KICBmYWNldF93cmFwKGZhY2V0cyA9IH52YXJpYWJsZSwgc2NhbGVzID0gImZyZWUiLCBuY29sID0gNCkgKw0KICBnZW9tX2JveHBsb3QoY29sb3IgPSAiYmxhY2siKSArDQogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoImRhcmtncmVlbiIsICJnb2xkNCIpKSArDQogIGxhYnMoeCA9ICJUaXBvIGRlIHBpZXJuYSIsIHkgPSAiIikgKw0KICB0aGVtZV9saWdodCgpICsNCiAgdGhlbWUoc3RyaXAuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gImRlZXBza3libHVlNCIpLA0KICAgICAgICBzdHJpcC50ZXh0ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiksDQogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikNCmBgYA0KDQojIyMgKkxvbmcgSnVtcGVycyB2cyBVbnRyYWluZWQgTWVuKg0KDQpgYGB7ciwgZmlnLmhlaWdodD0xMCwgZmlnLndpZHRoPTl9DQpkYXRvcyAlPiUgDQogIGRwbHlyOjpzZWxlY3QoLWMoaWQsIGRpc3Rfc2FsdG9fY20pKSAgJT4lIA0KICBnYXRoZXIoa2V5ID0gInZhcmlhYmxlIiwgdmFsdWUgPSAidmFsb3IiLCAtdHlwZSkgJT4lIA0KICBnZ3Bsb3QoZGF0YSA9IC4sIGFlcyh4ID0gdHlwZSwgeSA9IHZhbG9yLCBmaWxsID0gdHlwZSkpICsNCiAgZmFjZXRfd3JhcChmYWNldHMgPSB+dmFyaWFibGUsIHNjYWxlcyA9ICJmcmVlIiwgbmNvbCA9IDMpICsNCiAgZ2VvbV9ib3hwbG90KGNvbG9yID0gImJsYWNrIikgKw0KICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCJkYXJrZ3JlZW4iLCAiZ29sZDQiKSkgKw0KICBsYWJzKHggPSAiR3J1cG8iLCB5ID0gIiIpICsNCiAgdGhlbWVfbGlnaHQoKSArDQogIHRoZW1lKHN0cmlwLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJkZWVwc2t5Ymx1ZTQiKSwNCiAgICAgICAgc3RyaXAudGV4dCA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIpLA0KICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpDQpgYGANCg0KDQojIyBTaGFwaXJvIFdpbGsNCg0KU2UgY29tcHJ1ZWJhIGxhIG5vcm1hbGlkYWQgZGUgbGFzIHZhcmlhYmxlcyAoJFxhbHBoYSA9IDAuMDUkKSwgYmFqbyBlbCBzaWd1aWVudGUganVlZ28gZGUgaGlww7N0ZXNpczoNCg0KJCRIXzA6IFggXHNpbSBOKFxtdSwgXHNpZ21hXjIpXFwNCkgxOiB4IFxuc2ltIE4oXG11LCBcc2lnbWFeMikkJA0KDQpgYGB7cn0NCmRhdG9zICU+JSANCiAgc2VsZWN0X2lmKGlzLm51bWVyaWMpICU+JSANCiAgc2VsZWN0KC1pZCkgJT4lIA0KICBnYXRoZXIoa2V5ID0gInZhcmlhYmxlIiwgdmFsdWUgPSAidmFsb3IiKSAlPiUgDQogIGdyb3VwX2J5KHZhcmlhYmxlKSAlPiUgDQogIHN1bW1hcmlzZSh2YWxvciA9IGxpc3QodmFsb3IpKSAlPiUgDQogIHVuZ3JvdXAoKSAlPiUgDQogIGdyb3VwX2J5KHZhcmlhYmxlKSAlPiUgDQogIG11dGF0ZShzaGFwaXJvX3ZhbG9yUCA9IHJvdW5kKHNoYXBpcm8udGVzdCh1bmxpc3QodmFsb3IpKSRwLnZhbHVlLCBkaWdpdHMgPSA1KSwNCiAgICAgICAgIFJlc3VsdGFkbyA9IGlmX2Vsc2Uoc2hhcGlyb192YWxvclAgPD0gMC4wNSwgdHJ1ZSA9ICJObyBub3JtYWxpZGFkIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UgPSAiU8OtIG5vcm1hbGlkYWQiKSkgICU+JSANCiAgc2VsZWN0KC12YWxvcikNCmBgYA0KDQotIDx0cmVkPioqTm90YToqKjwvdHJlZD4gYXVucXVlIGxvcyBhdXRvcmVzIG1lbmNpb25hbiBxdWUgZnVlcm9uIGFwbGljYWRhcyBsYXMgcHJ1ZWJhcyBkZSAqU2hhcGlybyBXaWxrKiBwYXJhIGNvbXByb2JhciBlbCBzdXB1ZXN0byBkZSBub3JtYWxpZGFkLCBlbiBsYSB0YWJsYSBhbnRlcmlvciBzZSBldmlkZW5jaWEgcXVlIGFsZ3VuYXMgdmFyaWFibGVzICgqZWouKiAgZGlzdGFuY2lhIGRlIHNhbHRvLCBncmFzYSBzdWJjdXRhbmVhLCBlbnRyZSBvdHJhcykgbm8gc2UgZGlzdHJpYnV5ZW4gZGUgZm9ybWEgbm9ybWFsLiBFc3RlIHJlc3VsdGFkbyB0aWVuZSBjb25ub3RhY2lvbmVzIGRlIGltcG9ydGFuY2lhLCB5YSBxdWUgbGFzIGNvcnJlbGFjaW9uZXMgcG9kcsOtYW4gc2VyIG9idGVuaWRhcyBtZWRpYW50ZSBtw6l0b2RvcyAqbm8gcGFyYW3DqXRyaWNvcyouDQogICAgDQojIyBNYXRyaXogZGUgY29ycmVsYWNpb25lcw0KDQotIFNlIGNvbnN0cnV5ZSBsYSBtYXRyaXogZGUgY29ycmVsYWNpb25lcyAobcOpdG9kbyBkZSAqUGVhcnNvbiopLg0KLSBMYSB2YXJpYWJsZSBxdWUgcHJlc2VudGUgbWF5b3IgY29ycmVsYWNpw7NuIGxpbmVhbCBjb24gbGEgbG9uZ2l0dWQgZGVsIHNhbHRvLCBzZXLDoSB0ZW5pZGEgZW4gY3VlbnRhIHBhcmEgZXN0cnVjdHVyYXIgZWwgKm1vZGVsbyBkZSByZWdyZXNpw7NuIGxpbmVhbCBzaW1wbGUgKFJMUykqLiBDb24gbGFzIGRlbcOhcyB2YXJpYWJsZXMgc2UgY29uc3RydXllbiAgKm1vZGVsb3MgZGUgcmVncmVzacOzbiBsaW5lYWwgbcO6bHRpcGxlIChSTE0pKi4NCiAgICANCmBgYHtyLCBmaWcud2lkdGg9OSwgZmlnLmhlaWdodD04fQ0KbGlicmFyeShjb3JycGxvdCkNCmxpYnJhcnkoUkNvbG9yQnJld2VyKQ0KZGF0b3MgJT4lIA0KICBzZWxlY3RfaWYoaXMubnVtZXJpYykgJT4lIA0KICBzZWxlY3QoLWlkKSAlPiUgDQogIGNvcih1c2UgPSAiY29tcGxldGUub2JzIikgJT4lIA0KICBjb3JycGxvdChtZXRob2QgPSAicGllIiwNCiAgICAgICAgICAgdHlwZSA9ICJ1cHBlciIsDQogICAgICAgICAgIGRpYWcgPSBGQUxTRSwNCiAgICAgICAgICAgdGwuY2V4ID0gMC44LA0KICAgICAgICAgICB0bC5zcnQgPSA0NSwNCiAgICAgICAgICAgYWRkZ3JpZC5jb2wgPSAiYmxhY2siLA0KICAgICAgICAgICBvcmRlciA9ICJoY2x1c3QiLA0KICAgICAgICAgICBjb2wgPSBicmV3ZXIucGFsKG4gPSAxMCwgbmFtZSA9ICJTcGVjdHJhbCIpKQ0KYGBgDQogICAgDQotIDx0cmVkPioqTm90YXM6Kio8L3RyZWQ+IA0KICAgIC0gU2UgZXZpZGVuY2lhIGFsdGEgY29ycmVsYWNpw7NuIGVudHJlIGFsZ3VuYXMgdmFyaWFibGVzLiBFc3RlIHBhdHLDs24gc3VnaWVyZSBwcm9ibGVtYXMgZGUgKm11bHRpY29saW5lYWxpZGFkKiBhbCBhanVzdGFyIHVuIG1vZGVsbyBkZSAqUkxNKi4NCiAgICAtIEF0bGV0YXMgY29uIG1heW9yIGFsdHVyYSB0aWVuZGVuIGEgcHJlc2VudGFyIHNhbHRvcyBkZSBtZW5vciBkaXN0YW5jaWEuIEVzdGUgY29tcG9ydGFtaWVudG8gZXMgb2J0ZW5pZG8gZGUgaWd1YWwgZm9ybWEgZW4gYXF1ZWxsb3MgcXVlIGF1bWVudGFuIGxhIHZlbG9jaWRhZCBkZWwgKnNwcmludCogYWwgc2FsdGFyLCBlcyBkZWNpciwgcXVlIGEgbWF5b3IgdmVsb2NpZGFkLCBtZW5vciBsb25naXR1ZCBkZSBzYWx0by4NCiAgICAtIEF0bGV0YXMgY29uIGVsIG3DunNjdWxvIHJlY3RvIGFiZG9taW5hbCBkZSBtYXlvciBsb25naXR1ZCwgcHJlc2VudGFuIG1heW9yZXMgZGlzdGFuY2lhcyBlbiBzdXMgc2FsdG9zLiBDb24gZXN0YSB2YXJpYWJsZSBzZSBhanVzdGEgZWwgbW9kZWxvIGRlICpSTFMqLg0KICAgIA0KIyBSZWdyZXNpw7NuIExpbmVhbCBTaW1wbGUgKFJMUykgey50YWJzZXQgLnRhYnNldC1mYWRlIC50YWJzZXQtcGlsbHN9DQoNCi0gU2UgcHJvcG9uZSBjdWFudGlmaWNhciBsYSB1bmlkYWQgZGUgY2FtYmlvIGVuIGxhIGRpc3RhbmNpYSBkZWwgc2FsdG8gdnMgbGEgbG9uZ2l0dWQgKGNtXjJeL2tnXjIvM14pIGRlbCBtw7pzY3VsbyByZWN0byBhYmRvbWluYWwgKFJBKSwgcGFyYSBsYSBwaWVybmEgZGUgZGVzcGVndWUgKCp0YWtlb2ZmKikuDQotIEVsIG1vZGVsbyBkZSAqUkxTKiBwdWVkZSBzZXIgZXhwcmVzYWRvIGRlIGxhIHNpZ3VpZW50ZSBtYW5lcmE6DQokJFkgPSBcYmV0YV8wXCArIFxiZXRhXzFYIFxcDQpcaGF0e1l9ID0gXGhhdHtcYmV0YV8wfVwgKyBcaGF0e1xiZXRhXzF9WFwgKyBcZXBzaWxvbiQkDQotIEVzY3JpdG8gZGUgY2FyYSBhbCBmZW7Ds21lbm8gYmFqbyBlc3R1ZGlvLCBlbCBtb2RlbG8gcXVlZGEgZXhwcmVzYWRvIGNvbW8gc2lndWU6DQokJERpc3RhbmNpYSA9IFxoYXR7XGJldGFfMH1cICsgKFxoYXR7XGJldGFfMX1cdGltZXMgUkEpICsgXGVwc2lsb24kJA0KLSBFc3RlIG1vZGVsbyBkZSAqUkxTKiBlcyBhanVzdGFkbyBhIHRyYXbDqXMgZGVsIFsqTcOpdG9kbyBkZSBNw61uaW1vcyBDdWFkcmFkb3MuKl0oaHR0cHM6Ly9lZGltZXIuZ2l0aHViLmlvL2RvY3VtZW50c19SL0xpbmVhck1vZGVsc19MZWFzdFNxdWFyZXMvTGluZWFyTW9kZWxzX0xlYXN0U3FhdWFyZXMuaHRtbCMxKQ0KDQojIyBNb2RlbG8gTGluZWFsIGNvbiBgbG0oKWANCg0KYGBge3J9DQptb2RfcmxzIDwtIGxtKGRpc3Rfc2FsdG9fY20gfiBSQV90YWtlb2ZfbGVnLCBkYXRhID0gZGF0b3MpDQpzdW1tYXJ5KG1vZF9ybHMpDQpgYGANCg0KLSA8dHJlZD4qKk5vdGE6Kio8L3RyZWQ+IGVsIHJlc3VsdGFkbyBhbnRlcmlvciBzdWdpZXJlIHF1ZSBsYSB2YXJpYWJsZSBgUkFfdGFrZW9mX2xlZ2AgZXMgZXN0YWTDrXN0aWNhbWVudGUgc2lnbmlmaWNhdGl2YSAoJHZhbG9yXCBwID0wLjAxMzkkKSBzb2JyZSBsYSB2YXJpYWJpbGlkYWQgb2JzZXJ2YWRhIGVuIGxhIGRpc3RhbmNpYSBkZWwgc2FsdG8uIEFkZW3DoXMsIHNlIHB1ZWRlIGluZmVyaXIgcXVlIHBvciBjYWRhIHVuaWRhZCBxdWUgYXVtZW50YSBgUkFfdGFrZW9mX2xlZ2AsIGxhIGRpc3RhbmNpYSBkZSBzYWx0byBlcyAxMS45MjggY2VudMOtbWV0cm9zIG1heW9yLiBMYSB2YXJpYWJsZSBgUkFfdGFrZW9mX2xlZ2AgZXhwbGljYSAyMi4wMSUgZGUgbGEgdmFyaWFiaWxpZGFkIG9ic2VydmFkYSBlbiBsYSBkaXN0YW5jaWEgZGUgc2FsdG8uDQoNCiMjIFNpZ25pZmljYW5jaWEgRXN0YWTDrXN0aWNhDQoNCmBgYHtyfQ0KYW5vdmEobW9kX3JscykNCmBgYA0KDQojIyBSZXNpZHVhbGVzDQoNCmBgYHtyfQ0KcGFyKG1mcm93ID0gYygyLCAyKSkNCnBsb3QobW9kX3JscykNCmBgYA0KDQotICoqTm9ybWFsaWRhZCAoU2hhcGlybyBXaWxrKSBkZSBsb3MgcmVzaWR1YWxlczoqKiANCg0KYGBge3J9DQpzaGFwaXJvLnRlc3QocmVzaWR1YWxzKG1vZF9ybHMpKQ0KYGBgDQoNCi0gKipIZXRlcm9jZWRhc3RpY2lkYWQgLSBbKkJyZXVzY2ggUGFnYW4gVGVzdCpdKGh0dHBzOi8vZXMud2lraXBlZGlhLm9yZy93aWtpL1Rlc3RfZGVfQnJldXNjaC1QYWdhbik6KioNCg0KYGBge3J9DQpsaWJyYXJ5KGxtdGVzdCkNCmJwdGVzdChtb2RfcmxzKQ0KYGBgDQoNCi0gKipBdXRvY29ycmVsYWNpw7NuIC0gKltUZXN0IGRlIER1cmJpIFdhdHNvbl0oaHR0cHM6Ly9lcy53aWtpcGVkaWEub3JnL3dpa2kvRXN0YWQlQzMlQURzdGljb19kZV9EdXJiaW4tV2F0c29uKSo6KioNCg0KYGBge3J9DQpkd3Rlc3QobW9kX3JscykNCmBgYA0KDQotIFNlIGNvbXBydWViYSBxdWUgZXhpc3RlIG5vcm1hbGlkYWQgZGUgbG9zIHJlc2lkdW9zLCBzb24gaG9tb2NlZGFzdGljb3MgeSBubyBleGlzdGUgYXV0b2NvcnJlbGFjacOzbiBkZSBsb3MgbWlzbW9zLg0KDQojIyBSZWFsZXMgdnMgUHJlZGljaG9zDQoNCmBgYHtyfQ0KcmVhbGVzIDwtIGRhdG9zJGRpc3Rfc2FsdG9fY21bIWlzLm5hKGRhdG9zJGRpc3Rfc2FsdG9fY20pXQ0KcHJlZGljaG9zX3JscyA8LSBtb2RfcmxzJGZpdHRlZC52YWx1ZXMNCmRhdGEuZnJhbWUoDQogIFJlYWwgPSByZWFsZXMsDQogIFByZWRpY2hvcyA9IHByZWRpY2hvc19ybHMNCikgJT4lIA0KICBnZ3Bsb3QoZGF0YSA9IC4sIGFlcyh4ID0gUHJlZGljaG9zLCB5ID0gUmVhbCkpICsNCiAgZ2VvbV9wb2ludCgpICsNCiAgbGFicyh4ID0gKCJWYWxvcmVzIHByZWRpY2hvcyBkZSBkaXN0YW5jaWEgKGNtKSIpLA0KICAgICAgIHkgPSAiVmFsb3JlcyByZWFsZXMgZGUgZGlzdGFuY2lhIChjbSkiKSArDQogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIHNlID0gRkFMU0UsIGx0eSA9IDMsIGx3ZCA9IDEsIGNvbG9yID0gImJsYWNrIikgKw0KICB0aGVtZV9saWdodCgpDQpgYGANCg0KLSBMYSBjb3JyZWxhY2nDs24gZW50cmUgbG9zICoqdmFsb3JlcyByZWFsZXMqKiB5ICoqdmFsb3JlcyBwcmVkaWNob3MqKiBwb3IgZWwgbW9kZWxvIGRlICpSTFMqIGVzOiBgciByb3VuZChjb3IocmVhbGVzLCBwcmVkaWNob3NfcmxzKSwgZGlnaXRzID0gMylgOyBtw6FzIGJhamEgcXVlIGxhIHJlcG9ydGFkYSBwb3IgbG9zIGF1dG9yZXMgYWwgYWp1c3RhciB1biBtb2RlbG8gZGUgKlJMTSosIGN1eW8gdmFsb3IgZXMgaWd1YWwgYSAwLjg5Mg0KDQojIFJlZ3Jlc2nDs24gTGluZWFsIE3Dumx0aXBsZSAoUkxNKSB7LnRhYnNldCAudGFic2V0LWZhZGUgLnRhYnNldC1waWxsc30NCg0KLSBQYXJhIGxhIGNvbnN0cnVjY2nDs24gZGVsIG1vZGVsbyBkZSAqUkxNKiBzZSBjb21wcnVlYmEgbGEgbXVsdGljb2xpbmVhbGlkYWQgZGUgbGFzIHZhcmlhYmxlcyB5IHNlIHByb3BvbmVuIGN1YXRybyBhbHRlcm5hdGl2YXM6DQogICAgLSA8dHJlZD4qKk1vZGVsbyAwIChzb2JyZXBhcmFtZXRyaXphZG8pOioqPC90cmVkPiBtb2RlbG8gY29uIHRvZGFzIGxhcyB2YXJpYWJsZXMgaW5jbHVpZGFzIGNvbW8gcHJlZGljdG9yYXMuDQogICAgLSA8dHJlZD4qKk1vZGVsbyAxOioqPC90cmVkPiBNb2RlbG8gZGUgKlJMTSogY29uIGVsaW1pbmFjacOzbiBkZSB2YXJpYWJsZXMgcG9yIHZhbG9yZXMgZGUgY29ycmVsYWNpw7NuIHkgWypmYWN0b3IgaW5mbGFjaW9uYXJpbyBkZSB2YXJpYW56YSAtIFZJRi4qXShodHRwczovL2VzLndpa2lwZWRpYS5vcmcvd2lraS9GYWN0b3JfZGVfaW5mbGFjaSVDMyVCM25fZGVfbGFfdmFyaWFuemEpLg0KICAgIC0gPHRyZWQ+KipNb2RlbG8gMjoqKjwvdHJlZD4gTW9kZWxvIGRlICpSTE0qIGNvbiBlbGltaW5hY2nDs24gZGUgdmFyaWFibGVzIHBvciAqVklGKiBhIHRyYXbDqXMgZGVsIG3DqXRvZG8gKlN0ZXB3aXNlKiAodXRpbGl6YWRvIHBvciBsb3MgYXV0b3JlcyBkZWwgYXJ0w61jdWxvKS4NCiAgICAtIDx0cmVkPioqTW9kZWxvIDM6Kio8L3RyZWQ+IE1vZGVsbyBkZSByZWdyZXNpw7NuIHBvciBbKm3DrW5pbW9zIGN1YWRyYWRvcyBwYXJjaWFsZXMgLSBQTFMqXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9QYXJ0aWFsX2xlYXN0X3NxdWFyZXNfcmVncmVzc2lvbikuDQoNCiMjIE1vZGVsbyAwDQoNCmBgYHtyfQ0KbW9kX3JsbTAgPC0gbG0oZGlzdF9zYWx0b19jbSB+IC4sDQogICAgICAgICAgICAgICBkYXRhID0gZGF0b3MgJT4lIHNlbGVjdF9pZihpcy5udW1lcmljKSAlPiUgc2VsZWN0KC1pZCkpDQpzdW1tYXJ5KG1vZF9ybG0wKQ0KYGBgDQoNCi0gRWwgUl4yXiBhanVzdGFkbyBlcyBwcsOzeGltbyBhIDEsIHNpbiBlbWJhcmdvLCBwb2NhcyB2YXJpYWJsZXMgaW5kZXBlbmRpZW50ZXMgKHByZWRpY3RvcmFzKSBzb24gZXN0YWTDrXN0aWNhbWVudGUgc2lnbmlmaWNhdGl2YXMgKCRwPDAuMDUkKSwgcGF0cm9uIGRlIGNvbXBvcnRhbWllbnRvIHF1ZSBzdWdpZXJlIHByb2JsZW1hcyBkZSBtdWx0aWNvbGluZWFsaWRhZC4gTGEgc2lndWllbnRlIGdyw6FmaWNhIG11ZXN0cmEgYW5vbWFsw61hcyBlbiBsb3MgcmVzaWR1YWxlcyBkZWwgbW9kZWxvLg0KDQpgYGB7cn0NCnBhcihtZnJvdyA9IGMoMiwgMikpDQpwbG90KG1vZF9ybG0wKQ0KYGBgDQoNCi0gRXN0b3MgcmVzdWx0YWRvcyBldmlkZW5jaWFuIHF1ZSBlbCBtb2RlbG8gYWp1c3RhZG8gbm8gZXMgYWRlY3VhZG8gcGFyYSBleHBsaWNhciBsYSB2YXJpYWJpbGlkYWQgb2JzZXJ2YWRhIGVuIGxhIGRpc3RhbmNpYSBkZSBzYWx0by4gRXMgaW1wb3J0YW50ZSByZXNhbHRhciBxdWUgZWwgUl4yXiBubyBlcyBsYSBtZWpvciBtZWRpZGEgZGUgYm9uZGFkIGRlIGFqdXN0ZSwgeWEgcXVlIMOpc3RlIGF1bWVudGEgZW4gZnVuY2nDs24gZGVsIG7Dum1lcm8gZGUgcHJlZGljdG9yZXMuDQoNCmBgYHtyfQ0KIyBWYWxvcmVzIHByZWRpY2hvcyBwb3IgbW9kX3JsbTANCnByZWRpY2hvc19ybG0wIDwtIG1vZF9ybG0wJGZpdHRlZC52YWx1ZXMgDQpgYGANCg0KIyMgTW9kZWxvIDENCg0KLSBTZWxlY2Npw7NuIGRlIHByZWRpY3RvcmVzIHRlbmllbmRvIGVuIGN1ZW50YSB2YWxvcmVzIGlndWFsZXMgbyBpbmZlcmlvcmVzIGEgMC43MCBkZSBjb3JyZWxhY2nDs24uIExhIHNlbGVjY2nDs24gZXMgcG9zaWJsZSBjb24gbGEgYmlibGl0ZWNhIFtgdXNkbWBdKGh0dHBzOi8vY3Jhbi5yLXByb2plY3Qub3JnL3dlYi9wYWNrYWdlcy91c2RtL3VzZG0ucGRmKSBxdWUgcG9zZWUgZnVuY2lvbmVzIGZsZXhpYmxlcyBwYXJhIGRpYWduw7NzdGljb3MgZGUgbXVsdGljb2xpbmVhbGlkYWQuDQoNCmBgYHtyfQ0KIyBWYXJpYWJsZXMgcHJlZGljdG9yYXMNCmRmX3ByZWRpY3RvcmFzIDwtZGF0b3MgJT4lDQogIHNlbGVjdF9pZihpcy5udW1lcmljKSAlPiUgZHBseXI6OnNlbGVjdCgtYyhpZCwgZGlzdF9zYWx0b19jbSkpICU+JSANCiAgYXMubWF0cml4KCkNCg0KbGlicmFyeSh1c2RtKQ0KdmlmY29yKHggPSBkZl9wcmVkaWN0b3JhcywgdGggPSAwLjcwKQ0KYGBgDQoNCi0gRXN0ZSByZXN1bHRhZG8gbXVlc3RyYSBxdWUgZGUgbGFzIDIxIHZhcmlhYmxlcyBjb25zaWRlcmFkYXMgZW4gZWwgbW9kZWxvIGluaWNpYWwgKCptb2RlbG8gMCopIDEwIGRlIGVsbGFzIHByZXNlbnRhbiBwcm9ibGVtYXMgZGUgY29saW5lYWxpZGFkLiBUb21hbmRvIHVuIGzDrW1pdGUgZGUgMC43MCBkZSBjb3JyZWxhY2nDs24gY29tbyBjcml0ZXJpbyBkZSBleGNsdXNpw7NuIGRlIHByZWRpY3RvcmVzLCBsYSBjb3JyZWxhY2nDs24gbcOheGltYSBwcmVzZW50ZSBlbiBsYXMgdmFyaWFibGVzIHNlbGVjY2lvbmFkYXMgZXMgZGUgMC42OC4gTGEgdGFibGEgYW50ZXJpb3IgbXVlc3RyYSBsb3MgcHJlZGljdG9yZXMgcXVlIHBvZHLDrWFuIGhhY2VyIHBhcnRlIGRlbCBtb2RlbG8uDQoNCi0gKipOdWV2byBtb2RlbG86KioNCg0KYGBge3J9DQptb2RfcmxtMSA8LSBsbShkaXN0X3NhbHRvX2NtIH4gZWRhZCArIGFsdHVyYV9jbSArIHNwcmludF8xMDBtX3NlY29uZHMNCiAgICAgICAgICAgICAgICsgUUxfdGFrZW9mX2xlZyArIElMX3Rha2VvZl9sZWcgKyBSQV9mcmVlX2xlZyArIE9CX2ZyZWVfbGVnDQogICAgICAgICAgICAgICArIFBNX2ZyZWVfbGVnICsgR21lZF9mcmVlX2xlZyArIElMX2ZyZWVfbGVnICsgZ3Jhc2Ffc3ViY3V0X2NtMiwNCiAgICAgICAgICAgICAgIGRhdGEgPSBkYXRvcykNCnN1bW1hcnkobW9kX3JsbTEpDQpgYGANCg0KLSBFbCBSXjJeIGFqdXN0YWRvIGVzIGlndWFsIGEgMC41OTM2IHkgc8OzbG8gc29uIGVzdGFkw61zdGljYW1lbnRlIHNpZ25pZmljYXRpdmFzIGxhcyB2YXJpYWJsZXMgYWx0dXJhIHkgc3ByaW50LiBFbiBnZW5lcmFsLCBlbCBtb2RlbG8gZXMgZXN0YWTDrXN0aWNhbWVudGUgc2lnbmlmaWNhdGl2byAoJHAgPSAwLjAxNjIyJCkgcGFyYSBleHBsaWNhciBsYSB2YXJpYWJpbGlkYWQgZW4gbGEgZGlzdGFuY2lhIGRlIHNhbHRvLiANCg0KYGBge3J9DQojIFZhbG9yZXMgcHJlZGljaG9zIHBvciBtb2RfcmxtMQ0KcHJlZGljaG9zX3JsbTEgPC0gbW9kX3JsbTEkZml0dGVkLnZhbHVlcw0KYGBgDQoNCiMjIE1vZGVsbyAyDQoNCi0gU29uIGV4Y2x1aWRhcyB2YXJpYWJsZXMgcXVlIHByZXNlbnRlbiAqVklGKiBwb3IgZW5jaW1hIGRlIDEwLg0KDQpgYGB7cn0NCnZpZnN0ZXAoeCA9IGRmX3ByZWRpY3RvcmFzLCB0aCA9IDEwKQ0KYGBgDQoNCi0gRXN0ZSBtw6l0b2RvIGRlIHNlbGVjY2nDs24gYXJyb2phIHF1ZSA2IGRlIGxhcyAyMSB2YXJpYWJsZXMgdG90YWxlcyAoYG1vZF9ybG0wYCkgdGllbmVuIHByb2JsZW1hcyBkZSBjb2xpbmVhbGlkYWQuIEVsIG1vZGVsbyBjb25zaWRlcmEgMTUgdmFyaWFibGVzIGNvbW8gaW5kZXBlbmRpZW50ZXMsIGNvbiB2YWxvcmVzIG3DoXhpbW9zIGRlICpWSUYqIHF1ZSBubyBzdXBlcmFuIDkuNjQuDQoNCi0gKipOdWV2byBtb2RlbG86KioNCg0KYGBge3J9DQptb2RfcmxtMiA8LSBsbShkaXN0X3NhbHRvX2NtIH4gZWRhZCArIGFsdHVyYV9jbSArIHNwcmludF8xMDBtX3NlY29uZHMNCiAgICAgICAgICAgICAgICsgUUxfdGFrZW9mX2xlZyArIElMX3Rha2VvZl9sZWcgKyBSQV9mcmVlX2xlZyArIE9CX2ZyZWVfbGVnDQogICAgICAgICAgICAgICArIFBNX2ZyZWVfbGVnICsgR21lZF9mcmVlX2xlZyArIElMX2ZyZWVfbGVnICsgZ3Jhc2Ffc3ViY3V0X2NtMg0KICAgICAgICAgICAgICAgKyBFU190YWtlb2ZfbGVnICsgR21lZF90YWtlb2ZfbGVnICsgUUxfZnJlZV9sZWcgKyBHbWF4X2ZyZWVfbGVnLA0KICAgICAgICAgICAgICAgZGF0YSA9IGRhdG9zKQ0Kc3VtbWFyeShtb2RfcmxtMikNCmBgYA0KDQotIEVsIFJeMl4gYWp1c3RhZG8gZXMgaWd1YWwgYSAwLjU0ODYgeSBzw7NsbyBzb24gZXN0YWTDrXN0aWNhbWVudGUgc2lnbmlmaWNhdGl2YXMgbGFzIHZhcmlhYmxlcyBhbHR1cmEgeSBzcHJpbnQuIEVuIGdlbmVyYWwsIGVsIG1vZGVsbyBubyBlcyBlc3RhZMOtc3RpY2FtZW50ZSBzaWduaWZpY2F0aXZvICgkcCA9IDAuMDg4MDMkKSBwYXJhIGV4cGxpY2FyIGxhIHZhcmlhYmlsaWRhZCBlbiBsYSBkaXN0YW5jaWEgZGUgc2FsdG8uIERhZG8gcXVlIGHDum4gaGF5IHByZXNlbmNpYSBkZSB1biBuw7ptZXJvIGVsZXZhZG8gZGUgcHJlZGljdG9yZXMsIHNlIGNvbnN0cnV5ZSBlbCBtb2RlbG8gZmluYWwgbHVlZ28gZGUgYXBsaWNhciBlbCBtw6l0b2RvICpTdGVwd2lzZSosIGJhc2FkbyBlbiBlbCBbKkNyaXRlcmlvIGRlIEluZm9ybWFjacOzbiBkZSBBa2Fpa2UqXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9Ba2Fpa2VfaW5mb3JtYXRpb25fY3JpdGVyaW9uKS4NCg0KYGBge3J9DQptb2RfcmxtMi4xIDwtIHN0ZXAob2JqZWN0ID0gbW9kX3JsbTIsIGRpcmVjdGlvbiA9ICJib3RoIikNCmBgYA0KDQotIEVzdGUgbcOpdG9kbyBzdWdpZXJlIHF1ZSBlbCBtZWpvciBtb2RlbG8gYWxjYW56YSB1biB2YWxvciBtw61uaW1vIGRlICpBSUMqIGlndWFsIGEgMTUzLjgzLCBjdWFuZG8gc29uIGNvbnNpZGVyYWRhcyBsYXMgdmFyaWFibGVzIGFsdHVyYSwgc3ByaW50LCBJTF90YWtlb2ZmLCBSQV9mcmVlLCBHbWVkX2ZyZWUsIElMX2ZyZWUsIEVTX3Rha2VvZmYgeSBHbWVkX3Rha2VvZmYuIFNvbiBlc3RhZMOtc3RpY2FtZW50ZSBzaWduaWZpY2F0aXZhcyBsYSBhbHR1cmEsIHNwcmludCwgSUxfdGFrZW9mZiB5IFJBX2ZyZWU7IGNvbiBSXjJeIGFqdXN0YWRvIGlndWFsIGEgMC43MTg2ICg8dHJlZD5jZXJjYW5vIGFsIHZhbG9yICgwLjc2MykgcmVwb3J0YWRvIHBvciBsb3MgYXV0b3JlcyBlbiBlbCBwYXBlcjwvdHJlZD4pLg0KDQpgYGB7cn0NCnN1bW1hcnkobW9kX3JsbTIuMSkNCmBgYA0KDQoNCmBgYHtyfQ0KIyBWYWxvcmVzIHByZWRpY2hvcyBjb24gbW9kX3JsbTIuMQ0KcHJlZGljaG9zX3JsbTIgPC0gbW9kX3JsbTIuMSRmaXR0ZWQudmFsdWVzDQpgYGANCg0KIyMgTW9kZWxvIDMNCg0KLSBMYSBmdW5jacOzbiBgcGxzcigpYCBkZWwgcGFxdWV0ZSBgcGxzYCBwZXJtaXRlIGFqdXN0YXIgbW9kZWxvcyBjb24gKlBhcnRpYWwgTGVhc3QgU3F1YXJlcyosIGFkZW3DoXMsIGluY2x1eWUgbGEgcG9zaWJpbGlkYWQgZGUgcmVjdXJyaXIgYSB2YWxpZGFjacOzbiBjcnV6YWRhIHBhcmEgaWRlbnRpZmljYXIgZWwgbsO6bWVybyBhZGVjdWFkbyBkZSBjb21wb25lbnRlcyBjb24gZWwgY3VhbCBtaW5pbWl6YXIgZWwgY3VhZHJhZG8gbWVkaW8gZGVsIGVycm9yLiBFbiBlc3RlIGNhc28gcGFydGljdWxhciB1c8OpIGxhIG9wY2nDs24gZGUgKmNyb3NzLXZhbGlkYXRpb24qIHkgc2UgaWRlbnRpZmljYSB1biBzw7NsbyBjb21wb25lbnRlIHByaW5jaXBhbCBjb21vIMOzcHRpbW8uIExhIGJpYmxpb3RlY2EgYGNhcmV0YCB0YW1iacOpbiBwZXJtaXRlIGFqdXN0YXIgbW9kZWxvcyBkZSBtw61uaW1vcyBjdWFkcmFkb3MgcGFyY2lhbGVzICgqUExTKikgeSByZWdyZXNpw7NuIHBvciBjb21wb25lbnRlcyBwcmluY2lwYWxlcyAoKlBDUiopLg0KDQpgYGB7cn0NCiMgQ2FyZ2FuZG8gYmlibGlvdGVjYQ0KbGlicmFyeShwbHMpDQoNCiMgQWp1c3RhbmRvIGVsIG1vZGVsbyBjb24gdmFsaWRhY2nDs24gY3J1emFkYQ0Kc2V0LnNlZWQoMTIzKQ0KbW9kX3JsbTMgPC0gcGxzcihmb3JtdWxhID0gZGlzdF9zYWx0b19jbSB+IC4sIA0KICAgICAgICAgICAgICAgICBkYXRhID0gZGF0b3MgJT4lIHNlbGVjdF9pZihpcy5udW1lcmljKSAlPiUgZHBseXI6OnNlbGVjdCgtaWQpLA0KICAgICAgICAgICAgICAgICBzY2FsZS4gPSBUUlVFLCB2YWxpZGF0aW9uID0gIkNWIikNCg0KIyBFc3RpbWFuZG8gZWwgQ01FIChjdWFkcmFkbyBtZWRpbyBkZWwgZXJyb3IpDQptb2RfcGxzX0NWIDwtIE1TRVAobW9kX3JsbTMsIGVzdGltYXRlID0gIkNWIikNCg0KIyBOw7ptZXJvIGRlIGNvbXBvbmVudGVzIMOzcHRpbW8NCnBsb3QobW9kX3Bsc19DViR2YWwsIHhsYWIgPSAiTsO6bWVybyBkZSBjb21wb25lbnRlcyIsIHlsYWIgPSAiQ01FIikNCmBgYA0KDQoNCmBgYHtyfQ0KcHJlZGljaG9zX3JsbTMgPC0gcHJlZGljdChvYmplY3QgPSBtb2RfcmxtMywgbmV3ZGF0YSA9IGRmX3ByZWRpY3RvcmFzLA0KICAgICAgICAgICAgICAgICAgICAgICAgICBuY29tcCA9IDEpWzE6MjNdDQpgYGANCg0KIyBDb21wYXJhY2nDs24gZGUgbW9kZWxvcw0KDQotIENvbXVubWVudGUgc2UgdXRpbGl6YW4gZGlmZXJlbnRlcyBtw6l0cmljYXMgcGFyYSBjb21wYXJhciBsb3MgbW9kZWxvczoNCiAgICAtIFsqQ29lZmljaWVudGUgZGUgZGV0ZXJtaW5hY2nDs24gYWp1c3RhZG8gLSBSXjJeIGFqdXN0YWRvKl0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQ29lZmZpY2llbnRfb2ZfZGV0ZXJtaW5hdGlvbikNCiAgICAtIFsqQ3VhZHJhZG8gTWVkaW8gZGVsIEVycm9yIChDTUUpKl0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvTWVhbl9zcXVhcmVkX2Vycm9yKQ0KICAgIC0gWypDcml0ZXJpbyBkZSBJbmZvcm1hY2nDs24gZGUgQWthaWtlIChBSUMpKl0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQWthaWtlX2luZm9ybWF0aW9uX2NyaXRlcmlvbikNCiAgICAtIFsqQ3JpdGVyaW8gZGUgaW5mb3JtYWNpw7NuIGJheWVzaWFubyAoQklDKSpdKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0JheWVzaWFuX2luZm9ybWF0aW9uX2NyaXRlcmlvbikNCiAgICAtIFsqRXJyb3IgUG9yY2VudHVhbCBBYnNvbHV0byBNZWRpbyAtIE1BUEUqXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9NZWFuX2Fic29sdXRlX3BlcmNlbnRhZ2VfZXJyb3IpDQogICAgLSBbKk1hbGxvd3MgQ1AqXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9NYWxsb3dzJTI3c19DcCkNCi0gUGFyYSBlc3RlIGNhc28gZXNwZWPDrWZpY28gdXRpbGl6YXLDqSBlbCBDTUU6DQoNCiQkQ01FID0gXGZyYWN7MX17bn1cc3VtXntufV97aSA9IDF9KHlfaSAtIFxoYXR7eV9pfSleMiQkDQoNCmBgYHtyfQ0KIyBDdWFkcmFkbyBtZWRpbyBkZWwgZXJyb3INCmNtZSA8LSBmdW5jdGlvbihwcmVkaWNob3MsIHJlYWwpIHsNCiAgY21lID0gbWVhbigocmVhbCAtIHByZWRpY2hvcyleMikNCiAgcmV0dXJuKGNtZSkNCn0NCg0KIyBDTUUgZGUgNCBtb2RlbG9zDQpjbWVfcmxzICA8LSBjbWUocHJlZGljaG9zX3JscywgcmVhbGVzKQ0KY21lX3JsbTEgPC0gY21lKHByZWRpY2hvc19ybG0xLCByZWFsZXMpDQpjbWVfcmxtMiA8LSBjbWUocHJlZGljaG9zX3JsbTIsIHJlYWxlcykNCmNtZV9ybG0zIDwtIGNtZShwcmVkaWNob3NfcmxtMywgcmVhbGVzKQ0KYGBgDQoNCiAgLSBFc3RhIG3DqXRyaWNhIChNU0UpIGVzdMOhIGRpc3BvbmlibGUgZW4gbcO6bHRpcGxlcyBiaWJsaXRlY2FzIGRlIFIsIGVudHJlIGxhcyBjdWFsZXMgZXN0w6FuIGBsaW1lYCwgYE1MbWV0cmljc2AsIGBtbHRvb2xzYCwgYGh5ZHJvR09GYCwgZW50cmUgb3RyYXMuDQoNCmBgYHtyfQ0KZGF0YS5mcmFtZSgNCiAgTW9kZWxvID0gYygiUkxTIiwgIlJMTTEiLCAiUkxNMiIsICJSTE0zIiksDQogIENNRSAgICA9IGMoY21lX3JscywgY21lX3JsbTEsIGNtZV9ybG0yLCBjbWVfcmxtMykNCikgJT4lIA0KICBnZ3Bsb3QoZGF0YSA9IC4sIGFlcyh4ID0gTW9kZWxvLCB5ID0gQ01FKSkgKw0KICBnZW9tX2NvbCh3aWR0aCA9IDAuNSwgY29sb3IgPSAiYmxhY2siLCBmaWxsID0gImRvZGdlcmJsdWUzIikgKw0KICBnZW9tX3RleHQoYWVzKGxhYmVsID0gcm91bmQoQ01FLCBkaWdpdHMgPSAyKSksIHZqdXN0ID0gLTAuMikgKw0KICB0aGVtZV9saWdodCgpDQpgYGANCg0KIyBDb25jbHVzaW9uZXMNCg0KLSBGdWUgcG9zaWJsZSB2YWxpZGFyICg8dHJlZD5hdW5xdWUgbm8gZGllcmFuIGV4YWN0YW1lbnRlIGxvcyBtaXNtb3MgcmVzdWx0YWRvczwvdHJlZD4pIGxvcyBtw6l0b2RvcyBlc3RhZMOtc3RpY29zIGltcGxlbWVudGFkb3MgcG9yIGxvcyBhdXRvcmVzIHF1ZSBjb25zdHJ1eWVyb24gZWwgKnBhcGVyKi4NCi0gRW4gY29uZ3J1ZW5jaWEgY29uIGxvIGhhbGxhZG8gcG9yIGxvcyBpbnZlc3RpZ2Fkb3JlcywgZWwgbWVqb3IgbW9kZWxvIGRlIGxvcyBjdWF0cm8gcXVlIGFxdcOtIHNlIGV2YWx1YXJvbiwgZnVlIGVsIG9idGVuaWRvIGEgdHJhdsOpcyBkZSAqbcOpdG9kb3MgcGFzbyBhIHBhc28qICgqU3RlcHdpc2UqKSB5ICpWSUYqIGNvbW8gY3JpdGVyaW8gZGUgZXhjbHVzacOzbi4NCi0gRXMgZGUgdml0YWwgaW1wb3J0YW5jaWEgcXVlIGVuIGZvcm1hIG1hc2l2YSwgbGFzIHJldmlzdGFzIGFkZW3DoXMgZGUgc2VyICpvcGVuIGFjY2VzKiwgcGVybWl0YW4gYWNjZWRlciBhIHNvcG9ydGVzIGRlIGluZm9ybWFjacOzbiAoY29tbyBiYXNlcyBkZSBkYXRvcykgYWRpY2lvbmFsZXMgYWwgZG9jdW1lbnRvIGNpZW50w61maWNvLCBkZSB0YWwgbWFuZXJhIHF1ZSA8dHJlZD5sYSBjaWVuY2lhIHNlYSB2ZXJkYWRlcmFtZW50ZSByZXBsaWNhYmxlPC90cmVkPi4NCi0gQXVucXVlIGV4aXN0ZSBzaW1pbGl0dWQgZW4gbG9zIHJlc3VsdGFkb3MgcmVwbGljYWRvcyBlbiBlc3RlIGRvY3VtZW50byByZXNwZWN0byBhbCAqcGFwZXIqIG9yaWdpbmFsLCBzdXJnZW4gaW5xdWlldHVkZXMgZGUgcHJvY2VzYW1pZW50byBlc3RhZMOtc3RpY28gcXVlIG5vIHNvbiBkZWwgdG9kbyBjbGFyYXMuDQoNCiMgQW5leG9zDQoNCiMjIEJpYmxpb3RlY2EgYGNhcmANCg0KLSBDb24gbGEgYmlibGlvdGVjYSBgY2FyYCwgaGFjaWVuZG8gdXNvIGRlIGxhIGZ1bmNpw7NuIHZpZiwgZXMgcG9zaWJsZSBjb25vY2VyIGxvcyB2YWxvcmVzIGRlbCAqRmFjdG9yIGRlIEluZmxhY2nDs24gZGUgVmFyaWFuemEqLg0KDQpgYGB7cn0NCmxpYnJhcnkoY2FyKQ0KdmlmKG1vZF9ybG0wKSAgICMgQXBsaWNhZG8gc29icmUgbW9kZWxvIHNvYnJlcGFyYW1ldHJpemFkbw0KYGBgDQoNCi0gRXN0b3MgbWlzbW9zIHZhbG9yZXMgc2UgcHVlZGVuIG9idGVuZXIgbWFudWFsbWVudGUgY29uIGxhIGRpYWdvbmFsIGRlIGxhIGludmVyc2EgZGUgbGEgbWF0cml6IGRlIGNvcnJlbGFjaW9uZXMuDQoNCmBgYHtyfQ0KIyBNYXRyaXogZGUgY29ycmVsYWNpb25lcw0KbXR4X2NvciA8LSBjb3IoZGZfcHJlZGljdG9yYXMsIHVzZSA9ICJjb21wbGV0ZS5vYnMiKQ0KDQojIEludmVyc2EgZGUgbXR4X2Nvcg0KaW52ZXJzYV9jb3IgPC0gc29sdmUobXR4X2NvcikNCg0KIyBWSUZzDQpkaWFnKGludmVyc2FfY29yKQ0KYGBgDQoNCiMjIEJpYmxpb3RlY2EgYG1jdGVzdGANCg0KLSBDb24gbGEgYmlibGlvdGVjYSBgbWN0ZXN0YCBlcyBwb3NpYmxlIGdyYWZpY2FyIGxvcyAqVklGcyogeSB2YWxvcmVzIHByb3Bpb3MgKCpFaWdlbiBWYWx1ZXMqKS4NCg0KYGBge3J9DQpsaWJyYXJ5KG1jdGVzdCkNCm1jLnBsb3QoeCA9IGRmX3ByZWRpY3RvcmFzLCB5ID0gZGF0b3MkZGlzdF9zYWx0b19jbSwgdmlmID0gMTApDQpgYGANCg0KLSBFbCBncsOhZmljbyBhbnRlcmlvciBwdWVkZSBzZXIgY29uc3RydWlkbyBtYW51YWxtZW50ZSBjb24gZWwgc2lndWllbnRlIGPDs2RpZ286DQoNCmBgYHtyfQ0KZGF0YS5mcmFtZSgNCiAgdmFyaWFibGUgPSBuYW1lcyhkaWFnKGludmVyc2FfY29yKSksDQogIFZJRiAgICAgID0gZGlhZyhpbnZlcnNhX2NvcikNCikgJT4lIA0KICBnZ3Bsb3QoZGF0YSA9IC4sIGFlcyh4ID0gdmFyaWFibGUsIHkgPSBWSUYpKSArDQogIGdlb21fcG9pbnQoKSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDEwLCBjb2xvciA9ICJyZWQiLCBsdHkgPSAyKSArDQogIGxhYnMoeCA9ICJWYXJpYWJsZSIsIHkgPSAiVklGIiwNCiAgICAgICB0aXRsZSA9ICJGYWN0b3IgSW5mbGFjaW9uYXJpbyBkZSBWYXJpYW56YSAoVklGKSIpICsNCiAgdGhlbWVfbGlnaHQoKSArDQogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSwgY29sb3IgPSAiYmxhY2siKSwNCiAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siKSkNCmBgYA0KDQoNCg==