CD3001B – Generación de Escenarios Futuros con Analítica Semestre Feb – Jun 2024 (Período 1)

Integrantes del equipo
  • Sofia Badillo A01384253
  • Ximena Meléndez A01720569
  • na Sofía Mijares A01236164

Introducción

La práctica del nearshoring busca reducir las distancias entre centros de producción y mercados de consumo, en contraste al modelo offshore. Esta estrategia conlleva una serie de ventajas, como la optimización de las cadenas de suministro, la disminución de costos logísticos y de transporte, y una mayor eficiencia operativa debido a la cercanía geográfica.

Según Juan Gutiérrez (2020), en un artículo de Todo Economía, las bases de datos panel son esenciales para este análisis. Estas bases poseen dimensiones temporales y espaciales, brindando una visión holística de la situación. Además, integran una columna de índice que combina variables temporales y espaciales.

El análisis de datos panel ofrece una visión objetiva de cómo ciertas variables influyen en el desarrollo del nearshoring a lo largo del tiempo. México, como país destacado en esta práctica, debe ser evaluado minuciosamente mediante datos panel para comprender su comportamiento a lo largo del tiempo y en relación con otras variables. Este análisis permitirá identificar los factores clave que pueden potenciar el nearshoring en México.

En resumen, la investigación se centra en identificar los factores que influyen en la práctica del nearshoring en los estados de México. Para ello, se emplea el análisis de datos panel para comprender cómo estas variables evolucionan a lo largo del tiempo y su impacto en el desarrollo económico y comercial del país.

Descripción y manipulación de la base

El conjunto de datos que se nos fue proporcionado para la actividad incluye una serie de variables que proporcionan información sobre varios aspectos económicos, sociales y de gobierno por estado en México desde el 2006 al 2021 con una temporalidad anual. Algunas de las variables incluidas son:

Variable Descripción
new_fdi Nuevos Flujos de Inversión Extranjera Directa (IED) en millones de dólares.
reinv_profits Reinvestimiento de Ganancias - Flujos de Inversión Extranjera Directa (IED) en millones de dólares.
intercom_acc Cuentas Intercompañías - Flujos de Inversión Extranjera Directa (IED) en millones de dólares.
total_fdi Total de Flujos de Inversión Extranjera Directa (IED) en millones de dólares.
crime_rate Tasa de criminalidad por cada 100,000 habitantes del estado.
unemployment Porcentaje de la población desempleada.
employment Porcentaje de la población empleada.
business_activity Índice de actividad económica ponderado por la distancia del estado al puerto de entrada más cercano de Estados Unidos.
real_wage Salario real en pesos mexicanos, ajustado por la inflación.
real_ave_month_income Ingreso promedio mensual de los hogares en pesos mexicanos, ajustado por la inflación.
pop_density Densidad de población por área de tierra del estado en kilómetros cuadrados.
good_governance Proporción entre la inversión pública del estado y su deuda pública.
ratio_public_investment Proporción entre la inversión pública del estado y su producto interno bruto (PIB).
lq_primary Coeficiente de localización de personas empleadas en la industria primaria.
lq_secondary Coeficiente de localización de personas empleadas en el sector secundario.
lq_tertiary Coeficiente de localización de personas empleadas en el sector terciario.
exchange_rate Tasa de cambio de pesos mexicanos por 1 dólar estadounidense.
patents_rate Número de patentes de I+D por cada 100,000 habitantes del estado.
inpc Índice Nacional de Precios al Consumidor, donde 2018 = 100.
# exploracion de la base
str(data)
## tibble [512 × 26] (S3: tbl_df/tbl/data.frame)
##  $ state                  : chr [1:512] "Aguascalientes" "Baja California" "Baja California Sur" "Campeche" ...
##  $ state_id               : num [1:512] 1057 2304 2327 1086 1182 ...
##  $ year                   : num [1:512] 2006 2006 2006 2006 2006 ...
##  $ new_fdi                : num [1:512] 38 281.9 300.9 18.7 23.7 ...
##  $ reinv_profits          : num [1:512] 45.1 106.4 18.4 15.1 48.3 ...
##  $ intercom_acc           : num [1:512] 57.48 952.43 272.25 -3.41 17.22 ...
##  $ total_fdi              : num [1:512] 140.6 1340.7 591.6 30.4 89.3 ...
##  $ crime_rate             : num [1:512] 2.32 15.49 4.54 4.19 11.59 ...
##  $ unemployment           : num [1:512] 0.0487 0.0273 0.0232 0.0112 0.0444 ...
##  $ employment             : num [1:512] 0.959 0.978 0.981 0.984 0.978 ...
##  $ business_activity      : num [1:512] -2.29 2.31 -2.43 -1.79 -2.49 ...
##  $ real_wage              : num [1:512] 301 333 313 348 259 ...
##  $ real_ave_month_income  : num [1:512] 6042 8936 8645 5676 6850 ...
##  $ pop_density            : num [1:512] 199.63 42.01 7.74 13.69 63.33 ...
##  $ good_governance        : num [1:512] 0.165 0.2318 0.3519 0.0224 0.5037 ...
##  $ ratio_public_investment: num [1:512] 0.0076 0.00294 0.00761 0.0025 0.01292 ...
##  $ lq_primary             : num [1:512] 0.168 0.748 1.409 0.478 1.39 ...
##  $ lq_secondary           : num [1:512] 1.138 1.359 0.474 0.917 0.796 ...
##  $ lq_tertiary            : num [1:512] 1.022 0.874 1.11 1.06 1.032 ...
##  $ exchange_rate          : num [1:512] 10.8 10.8 10.8 10.8 10.8 ...
##  $ patents_rate           : num [1:512] 0.446 0.0999 0.1747 0.1271 0.1292 ...
##  $ inpc                   : num [1:512] 62.7 62.7 62.7 62.7 62.7 ...
##  $ border_distance        : num [1:512] 625.59 8.83 800.32 978.33 1111.82 ...
##  $ college_education      : num [1:512] 0.33 0.331 0.351 0.264 0.216 ...
##  $ new_fdi_real_mxn       : num [1:512] 657 4877 5206 324 410 ...
##  $ log_new_fdi_real_mxn   : num [1:512] 2.82 3.69 3.72 2.51 2.61 ...
#verificar que no haya datos nulos
colSums(is.na(data)) # hay 32 missing values en patents_rate por el año de 2021
##                   state                state_id                    year 
##                       0                       0                       0 
##                 new_fdi           reinv_profits            intercom_acc 
##                       0                       0                       0 
##               total_fdi              crime_rate            unemployment 
##                       0                       0                       0 
##              employment       business_activity               real_wage 
##                       0                       0                       0 
##   real_ave_month_income             pop_density         good_governance 
##                       0                       0                       0 
## ratio_public_investment              lq_primary            lq_secondary 
##                       0                       0                       0 
##             lq_tertiary           exchange_rate            patents_rate 
##                       0                       0                      32 
##                    inpc         border_distance       college_education 
##                       0                       0                       0 
##        new_fdi_real_mxn    log_new_fdi_real_mxn 
##                       0                       0
#como hay valores nulos los remplazamos con la median.
filled_df <- data %>%
  mutate_all(function(x) ifelse(is.na(x), median(x, na.rm = TRUE), x))

# convertir de vuelta a data frame
data <- as.data.frame(filled_df)

# como las variables de FDI, son distintas representaciones del FDI se decidio hacer una matriz para cada una
nearsh_new_fdi <- data %>% 
  select(-reinv_profits, -intercom_acc, -total_fdi, -state)
              
#conversion a panel data
nearsh_new_pd <- pdata.frame(nearsh_new_fdi,index=c("state_id","year"))

Visualización de Datos

  1. Scatterplot del Total de Inversión Extranjera Directa (IED):
scatter_plot <- ggplot(data, aes(x = year, y = total_fdi)) +
  geom_point(color = "blue", size = 3, alpha = 0.7) +
  labs(title = "Total Foreign Direct Investment Inflows.",
       x = "year" , y = "total_fdi") +
  theme_minimal()

# Display the scatter plot
print(scatter_plot)

  • Al observar el gráfico, se aprecia que el total de entradas de inversión extranjera directa oscila alrededor de un promedio anual de 1500 millones de dólares. Sin embargo, se observan datos dispersos, como un punto notablemente atípico en 2019, que alcanza aproximadamente los 8000 millones de dólares, marcando el punto máximo en la gráfica.
  1. Scatterplot de New FDI vs. Reinvestment of Profits:
scatter_plot2 <- ggplot(data, aes(x = new_fdi, y = reinv_profits)) +
  geom_point(color = "purple", size = 3, alpha = 0.7) +
  labs(title = "Scatter Plot of New Foreign Direct Investment Inflowss vs. Reinvestment of Profits ",
       x = "New Foreign Direct Investment Inflows" , y = "Reinvestment of Profits D") +
  theme_minimal()

# Display the scatter plot
print(scatter_plot2)

  • Se puede observar una tendencia donde un mayor número de nuevas entradas de inversión extranjera directa está asociado con un aumento en el reinvestimiento de ganancias. Aunque predominan las cantidades más bajas de nuevas entradas, se destaca que la mayoría de estas generan reinversiones. Sin embargo, también se identifican datos atípicos con valores excepcionalmente altos de nuevas entradas, que aún así muestran reinversiones considerables.
  1. Histograma del Índice de Actividad Económica Ponderado:
hist(data$business_activity,prob=TRUE,col='steelblue',main='Histogram of business activity')
lines(density(data$business_activity),col=3,lwd=4)

  • El histograma revela una distribución donde predominan los índices de actividad económica ponderados por la distancia al puerto de entrada más cercano de Estados Unidos con un valor de -2. Se destaca que hay una cantidad considerablemente menor de índices altos en comparación con los bajos. La línea verde trazada ayuda a visualizar la distribución general de los datos.
  1. Matriz de correlación:
#Visualización del correlation matrix
corrplot(cor(nearsh_new_fdi), method = "color")

Después de realizar una matriz de correlación, se observaron varias relaciones entre las variables que proporcionan valiosos insights:

  • Correlaciones Negativas:
    • Se observa una correlación negativa significativa entre “employment” y “unemployment”, lo que sugiere una relación inversa entre el nivel de empleo y la tasa de desempleo. Esto indica que al aumentar el nivel de empleo, la tasa de desempleo tiende a disminuir, y viceversa. Sería necesario seleccionar cuidadosamente una de estas variables para evitar multicolinealidad en el modelo.
    • Se detectan correlaciones negativas entre las variables que representan los diferentes tipos de actividad económica (primaria, secundaria y terciaria). Además, existe la posibilidad de una alta correlación entre “lq_primary” y “real_ave_month_income”, lo que sugiere una asociación entre la actividad económica primaria y el ingreso promedio mensual real.
    • También se observa una alta correlación entre “business_activity” y las variables que representan la estructura económica, lo que indica una posible relación entre la actividad empresarial y la composición del sector económico.
  • Correlaciones Positivas:
    • Se identifican correlaciones positivas entre “pop_density” y “new_fdi”, así como entre “business_activity” y “lq_secondary”, lo que sugiere que una mayor densidad de población y actividad empresarial está relacionada con mayores flujos de inversión extranjera directa y una mayor actividad económica secundaria.
    • Asimismo, se observan correlaciones positivas entre “employment” y “lq_primary”, y entre “real_ave_month_income” y “business_activity”, lo que indica una asociación entre el empleo y la actividad económica primaria, así como entre el ingreso promedio mensual real y la actividad empresarial.

Combinaciones para Trabajar: - Basándose en las correlaciones identificadas, las siguientes variables podrían ser consideradas para trabajar en conjunto: “fdi”, “crime_rate”, “unemployment”, “real_ave_month_income”, “good_governance”, “ratio_public_investment” y “business_activity”.

Conclusiones Adicionales: - Se destaca que la variable “unemployment” está correlacionada con la variable dependiente, lo que sugiere que la tasa de desempleo puede influir en la práctica del nearshoring en los estados de México. - Por otro lado, “ratio_public_investment” muestra correlaciones significativas con la mayoría de las variables, lo que indica su importancia en el contexto del nearshoring y su relación con otras variables económicas y sociales.

scatter_matrix_plot <- ggpairs(nearsh_new_fdi, 
                               columns = c("new_fdi","crime_rate", "employment", "real_wage", "good_governance", "business_activity", "pop_density", "exchange_rate"),
                               lower = list(continuous = wrap("points", alpha = 0.3, size = 0.5)),
                               diag = list(continuous = wrap("barDiag", alpha = 0.8, bins = 20)))

#Visualización del scatter matrix plot
print(scatter_matrix_plot)

Especificación de Modelo

En el análisis de los flujos de inversión extranjera directa (IED) en México, nos enfrentamos al desafío de comprender qué factores impulsan o frenan estos flujos financieros. Es crucial entender cómo variables económicas y sociales pueden influir en la atracción de inversiones extranjeras, lo que puede tener un impacto significativo en el desarrollo económico del país.

Para abordar esta pregunta, hemos diseñado, en primera instancia, un modelo lineal que busca desentrañar las complejas relaciones entre diversas variables y los flujos de IED en México. En el centro de nuestro modelo se encuentra la variable dependiente, “new_fdi_real_mxn”, que representa los nuevos flujos de inversión extranjera directa en pesos mexicanos. Este fenómeno es fundamental para comprender cómo el país atrae capital extranjero y promueve su crecimiento económico.

Al considerar las variables independientes en nuestro modelo, hemos seleccionado cuidadosamente aquellas que creemos que pueden tener un impacto significativo en los flujos de inversión. Por ejemplo, el caso de “employment” se incluye porque se cree que un mayor nivel de empleo puede estar asociado con una mayor actividad económica y, por lo tanto, podría influir en los flujos de inversión extranjera directa; “Real_wage”, se incluye porque los salarios reales pueden influir en la competitividad de una economía y, por lo tanto, en su capacidad para atraer inversión extranjera, y también “Good_governance”, se incluye porque un entorno de gobernanza sólido y estable puede ser atractivo para los inversores extranjeros.

Cabe mencionar que se aplica la transformación raíz cuadrada a la variable “good_governance” para mitigar posibles problemas de sesgo y mejorar la linealidad en la relación entre esta variable y los flujos de inversión, así mismo se aplica el logaritmo a la variable “pop_density” para manejar su distribución sesgada y para reflejar mejor la relación no lineal entre la densidad de población y los flujos de inversión.

ols <- lm(new_fdi_real_mxn ~ employment + real_wage + sqrt(good_governance) + lq_secondary + log(pop_density) + exchange_rate, data=nearsh_new_pd)
summary(ols)
## 
## Call:
## lm(formula = new_fdi_real_mxn ~ employment + real_wage + sqrt(good_governance) + 
##     lq_secondary + log(pop_density) + exchange_rate, data = nearsh_new_pd)
## 
## Residuals:
##    Min     1Q Median     3Q    Max 
## -46018  -4568   -957   2706  61265 
## 
## Coefficients:
##                        Estimate Std. Error t value Pr(>|t|)    
## (Intercept)            34173.38   26381.10   1.295   0.1958    
## employment            -62803.60   26975.46  -2.328   0.0203 *  
## real_wage                 93.74      10.03   9.347  < 2e-16 ***
## sqrt(good_governance)    433.58     367.31   1.180   0.2384    
## lq_secondary           -1904.31    1090.39  -1.746   0.0813 .  
## log(pop_density)        2141.69     325.51   6.579 1.18e-10 ***
## exchange_rate           -265.76     119.09  -2.232   0.0261 *  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 8595 on 505 degrees of freedom
## Multiple R-squared:  0.3314, Adjusted R-squared:  0.3235 
## F-statistic: 41.72 on 6 and 505 DF,  p-value: < 2.2e-16
vif(ols)
##            employment             real_wage sqrt(good_governance) 
##              1.103293              1.327933              1.166368 
##          lq_secondary      log(pop_density)         exchange_rate 
##              1.028789              1.252515              1.234318

Estimación de Modelos

  1. Panel_Model1 (Modelo de Efectos Fijos):
    • El primer modelo, Panel_Model1, utiliza el método de efectos fijos (model=“within”). Este enfoque controla los efectos fijos específicos de cada entidad (en este caso, los estados de México), eliminando así el posible sesgo causado por variables no observadas que sean constantes en el tiempo pero varíen entre las entidades. Este modelo es útil cuando se espera que haya heterogeneidad no observada entre las entidades.
  2. Panel_Model2 (Modelo de Efectos Aleatorios):
    • El segundo modelo, Panel_Model2, emplea el método de efectos aleatorios (model=“random”). Este enfoque asume que los efectos individuales son aleatorios y no correlacionados con las variables explicativas. El modelo permite que los coeficientes de las variables explicativas varíen entre las entidades, lo que puede ser útil cuando se sospecha que hay heterogeneidad no observada que no está completamente capturada por las variables explicativas.
  3. Panel_Model3 (Modelo de Pooling):
    • El tercer modelo, Panel_Model3, utiliza el método de pooling (model=“pooling”). Este enfoque combina los datos de todas las entidades y todos los períodos de tiempo en una sola regresión, ignorando las diferencias entre las entidades y asumiendo que los coeficientes de las variables explicativas son los mismos para todas las entidades y en todos los períodos de tiempo. Este modelo es útil cuando se asume que no hay heterogeneidad no observada entre las entidades y que los coeficientes de las variables explicativas son constantes en todas las entidades y en todos los períodos de tiempo.
  4. Panel_Model1.1 (Modelo de Efectos Fijos con Efectos Temporales):
    • Finalmente, el modelo Panel_Model1.1 es una variante del primer modelo de efectos fijos, pero incluye efectos temporales (effect=“time”). Esto permite controlar los efectos fijos tanto a nivel de entidad como a nivel de tiempo, lo que puede ser útil cuando se espera que haya heterogeneidad no observada tanto entre las entidades como a lo largo del tiempo.
panel_model1 <- plm(new_fdi_real_mxn ~ employment + real_wage + sqrt(good_governance) + lq_secondary + log(pop_density) + exchange_rate, data=nearsh_new_pd, model="within")
#r .074
panel_model2 <- plm(new_fdi_real_mxn ~ employment + real_wage + sqrt(good_governance) + lq_secondary + log(pop_density) + exchange_rate, data=nearsh_new_pd, model="random")

panel_model3 <- plm(new_fdi_real_mxn ~ employment + real_wage + sqrt(good_governance) + lq_secondary + log(pop_density) + exchange_rate, data=nearsh_new_pd, model="pooling")

fixef(panel_model1)
##      888      933      976      978      998     1004     1026     1034 
## -3727.07  -842.52 15456.62  -825.18 -5374.25 -9149.91 -4023.01  -969.85 
##     1051     1057     1058     1067     1069     1071     1072     1076 
##  7505.56  1596.13  3402.54  8390.42  3888.05 -4534.04 -1153.95 -2197.90 
##     1086     1088     1096     1098     1108     1111     1114     1117 
## -9629.79  2245.28 -1487.53 21205.05   469.31 -2626.66 53616.74  1236.02 
##     1120     1123     1125     1182     2303     2304     2327     2357 
## -4478.12 -5491.53 -1353.28 -5155.42 -6293.03  1440.14 -5001.91 -5326.66
summary(fixef((panel_model1)))
##      Estimate Std. Error t-value Pr(>|t|)
## 888  -3727.07   37432.87 -0.0996   0.9207
## 933   -842.52   38983.79 -0.0216   0.9828
## 976  15456.62   48369.40  0.3196   0.7494
## 978   -825.18   43969.53 -0.0188   0.9850
## 998  -5374.25   45461.96 -0.1182   0.9059
## 1004 -9149.91   37221.01 -0.2458   0.8059
## 1026 -4023.01   39649.93 -0.1015   0.9192
## 1034  -969.85   44723.17 -0.0217   0.9827
## 1051  7505.56   50030.05  0.1500   0.8808
## 1057  1596.13   56042.78  0.0285   0.9773
## 1058  3402.54   50921.33  0.0668   0.9468
## 1067  8390.42   54741.00  0.1533   0.8782
## 1069  3888.05   54010.54  0.0720   0.9426
## 1071 -4534.04   46012.78 -0.0985   0.9215
## 1072 -1153.95   42881.64 -0.0269   0.9785
## 1076 -2197.90   52542.66 -0.0418   0.9667
## 1086 -9629.79   38312.67 -0.2513   0.8017
## 1088  2245.28   54508.37  0.0412   0.9672
## 1096 -1487.53   48480.74 -0.0307   0.9755
## 1098 21205.05   64844.75  0.3270   0.7438
## 1108   469.31   58449.83  0.0080   0.9936
## 1111 -2626.66   51516.66 -0.0510   0.9594
## 1114 53616.74   81949.81  0.6543   0.5133
## 1117  1236.02   60308.46  0.0205   0.9837
## 1120 -4478.12   46318.12 -0.0967   0.9230
## 1123 -5491.53   44484.16 -0.1234   0.9018
## 1125 -1353.28   49203.86 -0.0275   0.9781
## 1182 -5155.42   47787.75 -0.1079   0.9141
## 2303 -6293.03   37783.67 -0.1666   0.8678
## 2304  1440.14   45122.46  0.0319   0.9746
## 2327 -5001.91   35516.04 -0.1408   0.8881
## 2357 -5326.66   44021.47 -0.1210   0.9037
#Se examina sí añadir el time FE es necesario. 
panel_model1.1<-plm(new_fdi_real_mxn ~ employment + real_wage + sqrt(good_governance) + lq_secondary + log(pop_density) + exchange_rate, data=nearsh_new_pd, model="within", effect="time") 
 
pFtest(panel_model1.1, panel_model1)  
## Warning in pf(stat, df1, df2, lower.tail = FALSE): NaNs produced
## 
##  F test for time effects
## 
## data:  new_fdi_real_mxn ~ employment + real_wage + sqrt(good_governance) +  ...
## F = 8.8021, df1 = -17, df2 = 491, p-value = NA
## alternative hypothesis: significant effects
plmtest(panel_model1, effect="time", type="bp") 
## 
##  Lagrange Multiplier Test - time effects (Breusch-Pagan)
## 
## data:  new_fdi_real_mxn ~ employment + real_wage + sqrt(good_governance) +  ...
## chisq = 32.964, df = 1, p-value = 9.387e-09
## alternative hypothesis: significant effects
#Considerando que contamos con un p-value de 9.387e-09 (menor a 5%), se sugiere que Time Fixed Value puede ser requerido.

stargazer(panel_model1, panel_model1.1, panel_model2, panel_model3, title="Panel Regression Analysis", type="text", column.labels = c("Individual Fixed Effects","Time Fixed Effects","Random Effecsts","Pooled"))
## 
## Panel Regression Analysis
## ==============================================================================================================
##                                                         Dependent variable:                                   
##                       ----------------------------------------------------------------------------------------
##                                                           new_fdi_real_mxn                                    
##                       Individual Fixed Effects   Time Fixed Effects    Random Effecsts         Pooled         
##                                 (1)                      (2)                 (3)                 (4)          
## --------------------------------------------------------------------------------------------------------------
## employment                   20,143.410            -86,520.270***         1,059.759         -62,803.600**     
##                             (30,173.890)            (28,343.840)        (28,764.240)        (26,975.460)      
##                                                                                                               
## real_wage                      -1.922                 98.257***           61.279***           93.742***       
##                               (27.618)                 (9.846)            (18.253)            (10.029)        
##                                                                                                               
## sqrt(good_governance)        -864.390**                490.655            -667.106*            433.576        
##                              (362.877)                (357.616)           (354.778)           (367.308)       
##                                                                                                               
## lq_secondary                  -632.407               -2,026.406*         -1,585.052          -1,904.313*      
##                             (3,000.149)              (1,052.429)         (1,990.088)         (1,090.389)      
##                                                                                                               
## log(pop_density)             -3,438.815             2,041.157***        2,607.085***        2,141.694***      
##                             (8,802.912)               (315.262)           (722.246)           (325.514)       
##                                                                                                               
## exchange_rate                 177.397                                     -105.923           -265.761**       
##                              (169.495)                                    (111.523)           (119.095)       
##                                                                                                               
## Constant                                                                 -20,936.140         34,173.390       
##                                                                         (28,144.370)        (26,381.100)      
##                                                                                                               
## --------------------------------------------------------------------------------------------------------------
## Observations                    512                      512                 512                 512          
## R2                             0.015                    0.365               0.074               0.331         
## Adjusted R2                    -0.062                   0.339               0.063               0.323         
## F Statistic             1.178 (df = 6; 474)    56.377*** (df = 5; 491)    40.403***    41.723*** (df = 6; 505)
## ==============================================================================================================
## Note:                                                                              *p<0.1; **p<0.05; ***p<0.01

Basándonos en los resultados obtenidos y en la comparación entre los modelos estimados, parece haber indicios claros de que el modelo de efectos fijos (Fixed Effects) podría ser el más apropiado para este análisis.

Primero, al examinar las estadísticas de significancia, observamos que el modelo de efectos fijos muestra una alta significancia estadística para la prueba conjunta de los efectos temporales (Breusch-Pagan), con un p-valor extremadamente bajo (p-value = 9.387e-09). Esta fuerte evidencia sugiere la presencia de efectos temporales significativos en los datos, lo que respalda la inclusión de los efectos temporales en el modelo de efectos fijos.

Además, desde un punto de vista teórico, al analizar datos de panel, es plausible asumir que existen diferencias no observadas entre las entidades (estados de México) que podrían influir en los flujos de inversión extranjera directa. Por lo tanto, controlar estos efectos específicos de cada entidad mediante el modelo de efectos fijos parece ser una elección más adecuada para capturar esta variación no observada.

Por último, la interpretación de los coeficientes también respalda la elección del modelo de efectos fijos. Aunque los coeficientes de las variables explicativas pueden variar entre los diferentes modelos, el modelo de efectos fijos proporciona estimaciones específicas para cada entidad, lo que permite una interpretación más precisa de cómo cada variable afecta los flujos de inversión en cada estado de México.

Pruebas de Diagnóstico

a. Multicolinealidad (multicollinearity)

vif(ols)
##            employment             real_wage sqrt(good_governance) 
##              1.103293              1.327933              1.166368 
##          lq_secondary      log(pop_density)         exchange_rate 
##              1.028789              1.252515              1.234318

El análisis de los valores del Factor de Inflación de la Varianza (VIF) revela que todos los valores están cercanos a 1, lo que sugiere una ausencia de multicolinealidad significativa entre las variables independientes en el modelo de regresión.

b. Heterocedasticidad (heteroscedasticity)

bptest(panel_model1.1)
## 
##  studentized Breusch-Pagan test
## 
## data:  panel_model1.1
## BP = 81.147, df = 6, p-value = 2.07e-15

El test Breusch-Pagan indica que el valor de la prueba es de 81.147 con 6 grados de libertad, y el p-valor asociado es extremadamente bajo (p-value = 2.07e-15). Esto sugiere fuertemente la presencia de heterocedasticidad en los residuos del modelo. Dado que el p-valor es significativamente menor que cualquier nivel de significancia razonable, podemos rechazar la hipótesis nula de homocedasticidad. Por lo tanto, hay evidencia de que la varianza de los errores no es constante, lo que puede afectar la eficiencia y precisión de las estimaciones de los coeficientes del modelo.

c. Autocorrelación Serial (serial correlation)

Box.test(data$new_fdi_real_mxn,lag=1,type="Ljung-Box") 
## 
##  Box-Ljung test
## 
## data:  data$new_fdi_real_mxn
## X-squared = 2.1309, df = 1, p-value = 0.1444
acf(data$new_fdi_real_mxn,main="Significant Autocorrelations") 

El test de Box-Ljung para la serie temporal de los datos de inversión extranjera directa (new_fdi_real_mxn) indica que el valor de la estadística de prueba es de 2.1309 con 1 grado de libertad, y el p-valor asociado es de 0.1444.

Dado que el p-valor es mayor que cualquier nivel de significancia razonable, no hay suficiente evidencia para rechazar la hipótesis nula de independencia de los errores. Esto sugiere que no hay autocorrelación significativa en la serie temporal de los datos de inversión extranjera directa con un rezago de 1 periodo. En otras palabras, los errores parecen ser independientes a lo largo del tiempo.

d. Estacionariedad (stationary)

adf.test(data$new_fdi_real_mxn)
## Warning in adf.test(data$new_fdi_real_mxn): p-value smaller than printed
## p-value
## 
##  Augmented Dickey-Fuller Test
## 
## data:  data$new_fdi_real_mxn
## Dickey-Fuller = -6.6818, Lag order = 7, p-value = 0.01
## alternative hypothesis: stationary
plot(data$new_fdi_real_mxn)

La prueba aumentada de Dickey-Fuller (ADF) se utiliza para evaluar si una serie temporal es estacionaria o no. En este caso, el resultado indica que el valor de la estadística de prueba Dickey-Fuller es de -6.6818, con un lag order de 7, y el p-valor asociado es de 0.01.

Dado que el p-valor es menor que cualquier nivel de significancia razonable, rechazamos la hipótesis nula de que la serie temporal tenga una raíz unitaria y aceptamos la hipótesis alternativa de que la serie es estacionaria. En otras palabras, hay evidencia suficiente para afirmar que la serie de inversión extranjera directa (new_fdi_real_mxn) es estacionaria. Esto implica que la serie no muestra tendencia o patrones de comportamiento sistemáticos a lo largo del tiempo.

Selección de Modelo e Interpretación de Resultados

Antes de seleccionar las variables para nuestros modelos de regresión, realizamos ajustes en ciertas variables predictoras para mejorar la distribución de los datos. Por ejemplo, aplicamos una transformación logarítmica a la variable “pop_density” debido a su distribución sesgada, principalmente influenciada por la alta concentración de población en la Ciudad de México. Asimismo, utilizamos la raíz cuadrada de la variable “good_governance” para mitigar su sesgo y mejorar su ajuste en el modelo.

Después de realizar las pruebas de diagnóstico, hemos determinado que el modelo de regresión de datos panel que muestra el mejor desempeño es el de Time Fixed Effects. Este modelo exhibe los estadísticos más altos en términos de ajuste y capacidad explicativa, lo que sugiere que las variables incluidas tienen un impacto significativo en la variable dependiente. Por lo tanto, hemos concluido que el modelo de Time Fixed Effects es el más adecuado para nuestros propósitos de análisis y predicción.

Conclusiones

Después de realizar un exhaustivo análisis de datos panel para investigar los factores que influyen en la atracción del Nearshoring en México, se obtuvieron los siguientes hallazgos clave:

  1. Variables Significativas:
    • Se identificaron varias variables significativas que están asociadas con la atracción de Nearshoring en México. Estas incluyen el empleo, el salario real, la densidad de población y el tipo de cambio.
  2. Impacto del Empleo y Salario Real:
    • Se encontró una relación positiva entre el nivel de empleo y la inversión extranjera directa en Nearshoring. Esto sugiere que una mayor disponibilidad de mano de obra calificada está relacionada con una mayor atracción de inversiones extranjeras.
    • Similarmente, se observó que un salario real más alto también está asociado con un aumento en la inversión extranjera directa en Nearshoring. Esto puede indicar que un mayor poder adquisitivo en el país puede atraer a empresas extranjeras.
  3. Densidad de Población:
    • Se encontró una asociación positiva entre la densidad de población y la inversión extranjera directa en Nearshoring. Esto sugiere que las áreas más densamente pobladas pueden ofrecer un mercado de consumo más grande y acceso a una mano de obra más amplia, lo que atrae a las empresas.
  4. Actividad Económica Secundaria:
    • Se observó una relación negativa entre la actividad económica en el sector secundario y la inversión extranjera directa en Nearshoring. Esto podría indicar que una mayor competencia en la manufactura local o condiciones desfavorables en ese sector específico pueden desalentar la inversión extranjera.
  5. Gobernanza y Tipo de Cambio:
    • Aunque no todos los resultados fueron significativos, se observaron tendencias en cuanto a la gobernanza y el tipo de cambio.

Referencias

LS0tDQp0aXRsZTogIkFjdGl2aWRhZCAxIg0KZGF0ZTogIjIwMjQtMDItMTUiDQpvdXRwdXQ6DQogIGh0bWxfZG9jdW1lbnQ6DQogICAgdG9jOiB5ZXMNCiAgICB0b2NfZmxvYXQ6IHllcw0KICAgIGNvZGVfZG93bmxvYWQ6IHllcw0KLS0tDQoNCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFKQ0KYGBgDQoNCioqQ0QzMDAxQiDigJMgR2VuZXJhY2nDs24gZGUgRXNjZW5hcmlvcyBGdXR1cm9zIGNvbiBBbmFsw610aWNhIA0KU2VtZXN0cmUgRmViIOKAkyBKdW4gMjAyNCAoUGVyw61vZG8gMSkqKg0KDQoqKkludGVncmFudGVzIGRlbCBlcXVpcG8qKg0KPHVsPg0KICA8bGk+U29maWEgQmFkaWxsbyAgQTAxMzg0MjUzPC9saT4NCiAgPGxpPlhpbWVuYSBNZWzDqW5kZXogIEEwMTcyMDU2OTwvbGk+DQogIDxsaT5uYSBTb2bDrWEgTWlqYXJlcyAgQTAxMjM2MTY0PC9saT4NCjwvdWw+DQoNCiMgSW50cm9kdWNjacOzbg0KDQpMYSBwcsOhY3RpY2EgZGVsIG5lYXJzaG9yaW5nIGJ1c2NhIHJlZHVjaXIgbGFzIGRpc3RhbmNpYXMgZW50cmUgY2VudHJvcyBkZSBwcm9kdWNjacOzbiB5IG1lcmNhZG9zIGRlIGNvbnN1bW8sIGVuIGNvbnRyYXN0ZSAgYWwgbW9kZWxvIG9mZnNob3JlLiBFc3RhIGVzdHJhdGVnaWEgY29ubGxldmEgdW5hIHNlcmllIGRlIHZlbnRhamFzLCBjb21vIGxhIG9wdGltaXphY2nDs24gZGUgbGFzIGNhZGVuYXMgZGUgc3VtaW5pc3RybywgbGEgZGlzbWludWNpw7NuIGRlIGNvc3RvcyBsb2fDrXN0aWNvcyB5IGRlIHRyYW5zcG9ydGUsIHkgdW5hIG1heW9yIGVmaWNpZW5jaWEgb3BlcmF0aXZhIGRlYmlkbyBhIGxhIGNlcmNhbsOtYSBnZW9ncsOhZmljYS4NCg0KU2Vnw7puIEp1YW4gR3V0acOpcnJleiAoMjAyMCksIGVuIHVuIGFydMOtY3VsbyBkZSBUb2RvIEVjb25vbcOtYSwgbGFzIGJhc2VzIGRlIGRhdG9zIHBhbmVsIHNvbiBlc2VuY2lhbGVzIHBhcmEgZXN0ZSBhbsOhbGlzaXMuIEVzdGFzIGJhc2VzIHBvc2VlbiBkaW1lbnNpb25lcyB0ZW1wb3JhbGVzIHkgZXNwYWNpYWxlcywgYnJpbmRhbmRvIHVuYSB2aXNpw7NuIGhvbMOtc3RpY2EgZGUgbGEgc2l0dWFjacOzbi4gQWRlbcOhcywgaW50ZWdyYW4gdW5hIGNvbHVtbmEgZGUgw61uZGljZSBxdWUgY29tYmluYSB2YXJpYWJsZXMgdGVtcG9yYWxlcyB5IGVzcGFjaWFsZXMuDQoNCkVsIGFuw6FsaXNpcyBkZSBkYXRvcyBwYW5lbCBvZnJlY2UgdW5hIHZpc2nDs24gb2JqZXRpdmEgZGUgY8OzbW8gY2llcnRhcyB2YXJpYWJsZXMgaW5mbHV5ZW4gZW4gZWwgZGVzYXJyb2xsbyBkZWwgbmVhcnNob3JpbmcgYSBsbyBsYXJnbyBkZWwgdGllbXBvLiAqTcOpeGljbywgY29tbyBwYcOtcyBkZXN0YWNhZG8gZW4gZXN0YSBwcsOhY3RpY2EsIGRlYmUgc2VyIGV2YWx1YWRvIG1pbnVjaW9zYW1lbnRlIG1lZGlhbnRlIGRhdG9zIHBhbmVsIHBhcmEgY29tcHJlbmRlciBzdSBjb21wb3J0YW1pZW50byBhIGxvIGxhcmdvIGRlbCB0aWVtcG8geSBlbiByZWxhY2nDs24gY29uIG90cmFzIHZhcmlhYmxlcy4gRXN0ZSBhbsOhbGlzaXMgcGVybWl0aXLDoSBpZGVudGlmaWNhciBsb3MgZmFjdG9yZXMgY2xhdmUgcXVlIHB1ZWRlbiBwb3RlbmNpYXIgZWwgbmVhcnNob3JpbmcgZW4gTcOpeGljby4qDQoNCkVuIHJlc3VtZW4sIGxhIGludmVzdGlnYWNpw7NuIHNlIGNlbnRyYSBlbiBpZGVudGlmaWNhciBsb3MgZmFjdG9yZXMgcXVlIGluZmx1eWVuIGVuIGxhIHByw6FjdGljYSBkZWwgbmVhcnNob3JpbmcgZW4gbG9zIGVzdGFkb3MgZGUgTcOpeGljby4gUGFyYSBlbGxvLCBzZSBlbXBsZWEgZWwgYW7DoWxpc2lzIGRlIGRhdG9zIHBhbmVsIHBhcmEgY29tcHJlbmRlciBjw7NtbyBlc3RhcyB2YXJpYWJsZXMgZXZvbHVjaW9uYW4gYSBsbyBsYXJnbyBkZWwgdGllbXBvIHkgc3UgaW1wYWN0byBlbiBlbCBkZXNhcnJvbGxvIGVjb27Ds21pY28geSBjb21lcmNpYWwgZGVsIHBhw61zLg0KDQoNCiMgRGVzY3JpcGNpw7NuIHkgbWFuaXB1bGFjacOzbiBkZSBsYSBiYXNlDQoNCkVsIGNvbmp1bnRvIGRlIGRhdG9zIHF1ZSBzZSBub3MgZnVlIHByb3BvcmNpb25hZG8gcGFyYSBsYSBhY3RpdmlkYWQgaW5jbHV5ZSB1bmEgc2VyaWUgZGUgdmFyaWFibGVzIHF1ZSBwcm9wb3JjaW9uYW4gaW5mb3JtYWNpw7NuIHNvYnJlIHZhcmlvcyBhc3BlY3RvcyBlY29uw7NtaWNvcywgc29jaWFsZXMgeSBkZSBnb2JpZXJubyBwb3IgZXN0YWRvIGVuIE3DqXhpY28gZGVzZGUgZWwgMjAwNiBhbCAyMDIxIGNvbiB1bmEgdGVtcG9yYWxpZGFkIGFudWFsLiBBbGd1bmFzIGRlIGxhcyB2YXJpYWJsZXMgaW5jbHVpZGFzIHNvbjoNCg0KfCBWYXJpYWJsZSAgICAgICAgICAgICAgICAgIHwgRGVzY3JpcGNpw7NuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18DQp8IG5ld19mZGkgICAgICAgICAgICAgICAgICAgfCBOdWV2b3MgRmx1am9zIGRlIEludmVyc2nDs24gRXh0cmFuamVyYSBEaXJlY3RhIChJRUQpIGVuIG1pbGxvbmVzIGRlIGTDs2xhcmVzLiAgICAgICAgICAgICAgICAgICAgICB8DQp8IHJlaW52X3Byb2ZpdHMgICAgICAgICAgICAgfCBSZWludmVzdGltaWVudG8gZGUgR2FuYW5jaWFzIC0gRmx1am9zIGRlIEludmVyc2nDs24gRXh0cmFuamVyYSBEaXJlY3RhIChJRUQpIGVuIG1pbGxvbmVzIGRlIGTDs2xhcmVzLnwNCnwgaW50ZXJjb21fYWNjICAgICAgICAgICAgICB8IEN1ZW50YXMgSW50ZXJjb21wYcOxw61hcyAtIEZsdWpvcyBkZSBJbnZlcnNpw7NuIEV4dHJhbmplcmEgRGlyZWN0YSAoSUVEKSBlbiBtaWxsb25lcyBkZSBkw7NsYXJlcy4gICAgIHwNCnwgdG90YWxfZmRpICAgICAgICAgICAgICAgICB8IFRvdGFsIGRlIEZsdWpvcyBkZSBJbnZlcnNpw7NuIEV4dHJhbmplcmEgRGlyZWN0YSAoSUVEKSBlbiBtaWxsb25lcyBkZSBkw7NsYXJlcy4gICAgICAgICAgICAgICAgICAgICAgfA0KfCBjcmltZV9yYXRlICAgICAgICAgICAgICAgIHwgVGFzYSBkZSBjcmltaW5hbGlkYWQgcG9yIGNhZGEgMTAwLDAwMCBoYWJpdGFudGVzIGRlbCBlc3RhZG8uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQp8IHVuZW1wbG95bWVudCAgICAgICAgICAgICAgfCBQb3JjZW50YWplIGRlIGxhIHBvYmxhY2nDs24gZGVzZW1wbGVhZGEuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCnwgZW1wbG95bWVudCAgICAgICAgICAgICAgICB8IFBvcmNlbnRhamUgZGUgbGEgcG9ibGFjacOzbiBlbXBsZWFkYS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCnwgYnVzaW5lc3NfYWN0aXZpdHkgICAgICAgICB8IMONbmRpY2UgZGUgYWN0aXZpZGFkIGVjb27Ds21pY2EgcG9uZGVyYWRvIHBvciBsYSBkaXN0YW5jaWEgZGVsIGVzdGFkbyBhbCBwdWVydG8gZGUgZW50cmFkYSBtw6FzIGNlcmNhbm8gZGUgRXN0YWRvcyBVbmlkb3MufA0KfCByZWFsX3dhZ2UgICAgICAgICAgICAgICAgIHwgU2FsYXJpbyByZWFsIGVuIHBlc29zIG1leGljYW5vcywgYWp1c3RhZG8gcG9yIGxhIGluZmxhY2nDs24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KfCByZWFsX2F2ZV9tb250aF9pbmNvbWUgICAgIHwgSW5ncmVzbyBwcm9tZWRpbyBtZW5zdWFsIGRlIGxvcyBob2dhcmVzIGVuIHBlc29zIG1leGljYW5vcywgYWp1c3RhZG8gcG9yIGxhIGluZmxhY2nDs24uICAgICAgICAgICAgfA0KfCBwb3BfZGVuc2l0eSAgICAgICAgICAgICAgIHwgRGVuc2lkYWQgZGUgcG9ibGFjacOzbiBwb3Igw6FyZWEgZGUgdGllcnJhIGRlbCBlc3RhZG8gZW4ga2lsw7NtZXRyb3MgY3VhZHJhZG9zLiAgICAgICAgICAgICAgICAgICAgICB8DQp8IGdvb2RfZ292ZXJuYW5jZSAgICAgICAgICAgfCBQcm9wb3JjacOzbiBlbnRyZSBsYSBpbnZlcnNpw7NuIHDDumJsaWNhIGRlbCBlc3RhZG8geSBzdSBkZXVkYSBww7pibGljYS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCnwgcmF0aW9fcHVibGljX2ludmVzdG1lbnQgICB8IFByb3BvcmNpw7NuIGVudHJlIGxhIGludmVyc2nDs24gcMO6YmxpY2EgZGVsIGVzdGFkbyB5IHN1IHByb2R1Y3RvIGludGVybm8gYnJ1dG8gKFBJQikuICAgICAgICAgICAgICAgfA0KfCBscV9wcmltYXJ5ICAgICAgICAgICAgICAgIHwgQ29lZmljaWVudGUgZGUgbG9jYWxpemFjacOzbiBkZSBwZXJzb25hcyBlbXBsZWFkYXMgZW4gbGEgaW5kdXN0cmlhIHByaW1hcmlhLiAgICAgICAgICAgICAgICAgICAgICAgIHwNCnwgbHFfc2Vjb25kYXJ5ICAgICAgICAgICAgICB8IENvZWZpY2llbnRlIGRlIGxvY2FsaXphY2nDs24gZGUgcGVyc29uYXMgZW1wbGVhZGFzIGVuIGVsIHNlY3RvciBzZWN1bmRhcmlvLiAgICAgICAgICAgICAgICAgICAgICAgICB8DQp8IGxxX3RlcnRpYXJ5ICAgICAgICAgICAgICAgfCBDb2VmaWNpZW50ZSBkZSBsb2NhbGl6YWNpw7NuIGRlIHBlcnNvbmFzIGVtcGxlYWRhcyBlbiBlbCBzZWN0b3IgdGVyY2lhcmlvLiAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KfCBleGNoYW5nZV9yYXRlICAgICAgICAgICAgIHwgVGFzYSBkZSBjYW1iaW8gZGUgcGVzb3MgbWV4aWNhbm9zIHBvciAxIGTDs2xhciBlc3RhZG91bmlkZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCnwgcGF0ZW50c19yYXRlICAgICAgICAgICAgICB8IE7Dum1lcm8gZGUgcGF0ZW50ZXMgZGUgSStEIHBvciBjYWRhIDEwMCwwMDAgaGFiaXRhbnRlcyBkZWwgZXN0YWRvLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQp8IGlucGMgICAgICAgICAgICAgICAgICAgICAgfCDDjW5kaWNlIE5hY2lvbmFsIGRlIFByZWNpb3MgYWwgQ29uc3VtaWRvciwgZG9uZGUgMjAxOCA9IDEwMC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCmBgYHtyIGltcG9ydGFyIGRhdG9zLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBpbmNsdWRlPUZBTFNFfQ0KbGlicmFyeShkbG9va3IpDQpsaWJyYXJ5KGthYmxlRXh0cmEpDQpsaWJyYXJ5KGVmZmVjdHMpDQpsaWJyYXJ5KHZpc2RhdCkNCmxpYnJhcnkoZm9yZWlnbikNCmxpYnJhcnkoZHBseXIpICAgICAgICAjIGRhdGEgbWFuaXB1bGF0aW9uIA0KbGlicmFyeShmb3JjYXRzKSAgICAgICMgdG8gd29yayB3aXRoIGNhdGVnb3JpY2FsIHZhcmlhYmxlcw0KbGlicmFyeShnZ3Bsb3QyKSAgICAgICMgZGF0YSB2aXN1YWxpemF0aW9uIA0KbGlicmFyeShyZWFkcikgICAgICAgICMgcmVhZCBzcGVjaWZpYyBjc3YgZmlsZXMNCmxpYnJhcnkoamFuaXRvcikgICAgICAjIGRhdGEgZXhwbG9yYXRpb24gYW5kIGNsZWFuaW5nIA0KbGlicmFyeShIbWlzYykgICAgICAgICMgc2V2ZXJhbCB1c2VmdWwgZnVuY3Rpb25zIGZvciBkYXRhIGFuYWx5c2lzIA0KbGlicmFyeShwc3ljaCkgICAgICAgICMgZnVuY3Rpb25zIGZvciBtdWx0aXZhcmlhdGUgYW5hbHlzaXMgDQpsaWJyYXJ5KG5hbmlhcikgICAgICAgIyBzdW1tYXJpZXMgYW5kIHZpc3VhbGl6YXRpb24gb2YgbWlzc2luZyB2YWx1ZXMgTkFzDQpsaWJyYXJ5KGRsb29rcikgICAgICAgIyBzdW1tYXJpZXMgYW5kIHZpc3VhbGl6YXRpb24gb2YgbWlzc2luZyB2YWx1ZXMgTkFzDQpsaWJyYXJ5KGNvcnJwbG90KSAgICAgIyBjb3JyZWxhdGlvbiBwbG90cw0KbGlicmFyeShqdG9vbHMpICAgICAgICMgcHJlc2VudGF0aW9uIG9mIHJlZ3Jlc3Npb24gYW5hbHlzaXMgDQpsaWJyYXJ5KGxtdGVzdCkgICAgICAgIyBkaWFnbm9zdGljIGNoZWNrcyAtIGxpbmVhciByZWdyZXNzaW9uIGFuYWx5c2lzIA0KbGlicmFyeShjYXIpICAgICAgICAgICMgZGlhZ25vc3RpYyBjaGVja3MgLSBsaW5lYXIgcmVncmVzc2lvbiBhbmFseXNpcw0KbGlicmFyeShrYWJsZUV4dHJhKSAgICMgSFRNTCB0YWJsZSBhdHRyaWJ1dGVzDQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkoY2FyZXQpDQpsaWJyYXJ5KGdsbW5ldCkNCmxpYnJhcnkoR0dhbGx5KQ0KbGlicmFyeShyZWFkeGwpDQpsaWJyYXJ5KGZvcmVpZ24pDQpsaWJyYXJ5KHRpZHl2ZXJzZSkgICAgIyBhIHNldCBvZiBkaWZmZXJlbnQgcGFja2FnZXMgDQpsaWJyYXJ5KGdncGxvdDIpICAgICAgIyBkZWRpY2F0ZWQgdG8gZGF0YSB2aXN1YWxpemF0aW9uIA0KbGlicmFyeShkcGx5cikgICAgICAgICMgZGF0YSBtYW5pcHVsYXRpb24gDQpsaWJyYXJ5KHBsbSkgICAgICAgICAgIyBsaW5lYXIgbW9kZWxzIGZvciBwYW5lbCBkYXRhDQpsaWJyYXJ5KFJDb2xvckJyZXdlcikgIyBvZmZlcnMgY29sb3IgcGFsZXR0ZXMNCmxpYnJhcnkobG10ZXN0KSAgICAgICAjIHRlc3RpbmcgbGluZWFyIHJlZ3Jlc3Npb24gbW9kZWxzDQpsaWJyYXJ5KHN0YXJnYXplcikgICAgIyBjcmVhdGVzIHdlbGwgZm9ybWF0dGVkIHJlZ3Jlc3Npb24gdGFibGVzDQpsaWJyYXJ5KHRzZXJpZXMpICAgICAgIyB0aW1lIHNlcmllcyBhbmFseXNpcyANCmxpYnJhcnkocGFuZWx2YXIpICAgICAjIHRpbWUgc2VyaWVzIGFuYWx5c2lzIHwgcGFuZWwgdmVjdG9yIGF1dG9yZWdyZXNzaW9uIA0KbGlicmFyeShjb3JycGxvdCkNCmxpYnJhcnkocmVhZHhsKQ0KYGBgDQogDQpgYGB7ciBpbmNsdWRlPUZBTFNFfQ0KIyBMZWN0dXJhIGRlIGRhdG9zIA0KZGF0YSA8LSByZWFkX2V4Y2VsKCJDOi9URUMtbGFwL1NlbWVzdHJlLTgvR2VuZXJhY2lvbi1lc2VuYXJpb3MtZnV0dXJvcy9BY3RpdmlkYWQgMS9wYW5lbF9kYXRhc2V0LXRyYW5zZi54bHN4IikNCg0KYGBgDQoNCmBgYHtyIERhdGEgbWFuaXB1bGF0aW9ufQ0KIyBleHBsb3JhY2lvbiBkZSBsYSBiYXNlDQpzdHIoZGF0YSkNCiN2ZXJpZmljYXIgcXVlIG5vIGhheWEgZGF0b3MgbnVsb3MNCmNvbFN1bXMoaXMubmEoZGF0YSkpICMgaGF5IDMyIG1pc3NpbmcgdmFsdWVzIGVuIHBhdGVudHNfcmF0ZSBwb3IgZWwgYcOxbyBkZSAyMDIxDQoNCiNjb21vIGhheSB2YWxvcmVzIG51bG9zIGxvcyByZW1wbGF6YW1vcyBjb24gbGEgbWVkaWFuLg0KZmlsbGVkX2RmIDwtIGRhdGEgJT4lDQogIG11dGF0ZV9hbGwoZnVuY3Rpb24oeCkgaWZlbHNlKGlzLm5hKHgpLCBtZWRpYW4oeCwgbmEucm0gPSBUUlVFKSwgeCkpDQoNCiMgY29udmVydGlyIGRlIHZ1ZWx0YSBhIGRhdGEgZnJhbWUNCmRhdGEgPC0gYXMuZGF0YS5mcmFtZShmaWxsZWRfZGYpDQoNCiMgY29tbyBsYXMgdmFyaWFibGVzIGRlIEZESSwgc29uIGRpc3RpbnRhcyByZXByZXNlbnRhY2lvbmVzIGRlbCBGREkgc2UgZGVjaWRpbyBoYWNlciB1bmEgbWF0cml6IHBhcmEgY2FkYSB1bmENCm5lYXJzaF9uZXdfZmRpIDwtIGRhdGEgJT4lIA0KICBzZWxlY3QoLXJlaW52X3Byb2ZpdHMsIC1pbnRlcmNvbV9hY2MsIC10b3RhbF9mZGksIC1zdGF0ZSkNCiAgICAgICAgICAgICAgDQojY29udmVyc2lvbiBhIHBhbmVsIGRhdGENCm5lYXJzaF9uZXdfcGQgPC0gcGRhdGEuZnJhbWUobmVhcnNoX25ld19mZGksaW5kZXg9Yygic3RhdGVfaWQiLCJ5ZWFyIikpDQpgYGANCg0KDQojIyBWaXN1YWxpemFjacOzbiBkZSBEYXRvcw0KDQoxLiAqKlNjYXR0ZXJwbG90IGRlbCBUb3RhbCBkZSBJbnZlcnNpw7NuIEV4dHJhbmplcmEgRGlyZWN0YSAoSUVEKSoqOg0KDQpgYGB7ciBzY2F0dGVyIHBsb3QsIGVjaG89VFJVRX0NCnNjYXR0ZXJfcGxvdCA8LSBnZ3Bsb3QoZGF0YSwgYWVzKHggPSB5ZWFyLCB5ID0gdG90YWxfZmRpKSkgKw0KICBnZW9tX3BvaW50KGNvbG9yID0gImJsdWUiLCBzaXplID0gMywgYWxwaGEgPSAwLjcpICsNCiAgbGFicyh0aXRsZSA9ICJUb3RhbCBGb3JlaWduIERpcmVjdCBJbnZlc3RtZW50IEluZmxvd3MuIiwNCiAgICAgICB4ID0gInllYXIiICwgeSA9ICJ0b3RhbF9mZGkiKSArDQogIHRoZW1lX21pbmltYWwoKQ0KDQojIERpc3BsYXkgdGhlIHNjYXR0ZXIgcGxvdA0KcHJpbnQoc2NhdHRlcl9wbG90KQ0KYGBgDQoNCiAgIC0gQWwgb2JzZXJ2YXIgZWwgZ3LDoWZpY28sIHNlIGFwcmVjaWEgcXVlIGVsIHRvdGFsIGRlIGVudHJhZGFzIGRlIGludmVyc2nDs24gZXh0cmFuamVyYSBkaXJlY3RhIG9zY2lsYSBhbHJlZGVkb3IgZGUgdW4gcHJvbWVkaW8gYW51YWwgZGUgMTUwMCBtaWxsb25lcyBkZSBkw7NsYXJlcy4gU2luIGVtYmFyZ28sIHNlIG9ic2VydmFuIGRhdG9zIGRpc3BlcnNvcywgY29tbyB1biBwdW50byBub3RhYmxlbWVudGUgYXTDrXBpY28gZW4gMjAxOSwgcXVlIGFsY2FuemEgYXByb3hpbWFkYW1lbnRlIGxvcyA4MDAwIG1pbGxvbmVzIGRlIGTDs2xhcmVzLCBtYXJjYW5kbyBlbCBwdW50byBtw6F4aW1vIGVuIGxhIGdyw6FmaWNhLg0KDQoyLiAqKlNjYXR0ZXJwbG90IGRlIE5ldyBGREkgdnMuIFJlaW52ZXN0bWVudCBvZiBQcm9maXRzKio6DQoNCmBgYHtyIHNjYXR0ZXIgMiwgZWNobz1UUlVFfQ0Kc2NhdHRlcl9wbG90MiA8LSBnZ3Bsb3QoZGF0YSwgYWVzKHggPSBuZXdfZmRpLCB5ID0gcmVpbnZfcHJvZml0cykpICsNCiAgZ2VvbV9wb2ludChjb2xvciA9ICJwdXJwbGUiLCBzaXplID0gMywgYWxwaGEgPSAwLjcpICsNCiAgbGFicyh0aXRsZSA9ICJTY2F0dGVyIFBsb3Qgb2YgTmV3IEZvcmVpZ24gRGlyZWN0IEludmVzdG1lbnQgSW5mbG93c3MgdnMuIFJlaW52ZXN0bWVudCBvZiBQcm9maXRzICIsDQogICAgICAgeCA9ICJOZXcgRm9yZWlnbiBEaXJlY3QgSW52ZXN0bWVudCBJbmZsb3dzIiAsIHkgPSAiUmVpbnZlc3RtZW50IG9mIFByb2ZpdHMgRCIpICsNCiAgdGhlbWVfbWluaW1hbCgpDQoNCiMgRGlzcGxheSB0aGUgc2NhdHRlciBwbG90DQpwcmludChzY2F0dGVyX3Bsb3QyKQ0KYGBgDQoNCiAgIC0gU2UgcHVlZGUgb2JzZXJ2YXIgdW5hIHRlbmRlbmNpYSBkb25kZSB1biBtYXlvciBuw7ptZXJvIGRlIG51ZXZhcyBlbnRyYWRhcyBkZSBpbnZlcnNpw7NuIGV4dHJhbmplcmEgZGlyZWN0YSBlc3TDoSBhc29jaWFkbyBjb24gdW4gYXVtZW50byBlbiBlbCByZWludmVzdGltaWVudG8gZGUgZ2FuYW5jaWFzLiBBdW5xdWUgcHJlZG9taW5hbiBsYXMgY2FudGlkYWRlcyBtw6FzIGJhamFzIGRlIG51ZXZhcyBlbnRyYWRhcywgc2UgZGVzdGFjYSBxdWUgbGEgbWF5b3LDrWEgZGUgZXN0YXMgZ2VuZXJhbiByZWludmVyc2lvbmVzLiBTaW4gZW1iYXJnbywgdGFtYmnDqW4gc2UgaWRlbnRpZmljYW4gZGF0b3MgYXTDrXBpY29zIGNvbiB2YWxvcmVzIGV4Y2VwY2lvbmFsbWVudGUgYWx0b3MgZGUgbnVldmFzIGVudHJhZGFzLCBxdWUgYcO6biBhc8OtIG11ZXN0cmFuIHJlaW52ZXJzaW9uZXMgY29uc2lkZXJhYmxlcy4NCg0KMy4gKipIaXN0b2dyYW1hIGRlbCDDjW5kaWNlIGRlIEFjdGl2aWRhZCBFY29uw7NtaWNhIFBvbmRlcmFkbyoqOg0KDQpgYGB7ciBoaXN0b2dyYW1hLCBlY2hvPVRSVUV9DQpoaXN0KGRhdGEkYnVzaW5lc3NfYWN0aXZpdHkscHJvYj1UUlVFLGNvbD0nc3RlZWxibHVlJyxtYWluPSdIaXN0b2dyYW0gb2YgYnVzaW5lc3MgYWN0aXZpdHknKQ0KbGluZXMoZGVuc2l0eShkYXRhJGJ1c2luZXNzX2FjdGl2aXR5KSxjb2w9Myxsd2Q9NCkNCmBgYA0KDQogICAtIEVsIGhpc3RvZ3JhbWEgcmV2ZWxhIHVuYSBkaXN0cmlidWNpw7NuIGRvbmRlIHByZWRvbWluYW4gbG9zIMOtbmRpY2VzIGRlIGFjdGl2aWRhZCBlY29uw7NtaWNhIHBvbmRlcmFkb3MgcG9yIGxhIGRpc3RhbmNpYSBhbCBwdWVydG8gZGUgZW50cmFkYSBtw6FzIGNlcmNhbm8gZGUgRXN0YWRvcyBVbmlkb3MgY29uIHVuIHZhbG9yIGRlIC0yLiBTZSBkZXN0YWNhIHF1ZSBoYXkgdW5hIGNhbnRpZGFkIGNvbnNpZGVyYWJsZW1lbnRlIG1lbm9yIGRlIMOtbmRpY2VzIGFsdG9zIGVuIGNvbXBhcmFjacOzbiBjb24gbG9zIGJham9zLiBMYSBsw61uZWEgdmVyZGUgdHJhemFkYSBheXVkYSBhIHZpc3VhbGl6YXIgbGEgZGlzdHJpYnVjacOzbiBnZW5lcmFsIGRlIGxvcyBkYXRvcy4gDQoNCjQuICoqTWF0cml6IGRlIGNvcnJlbGFjacOzbioqOg0KDQpgYGB7cn0NCiNWaXN1YWxpemFjacOzbiBkZWwgY29ycmVsYXRpb24gbWF0cml4DQpjb3JycGxvdChjb3IobmVhcnNoX25ld19mZGkpLCBtZXRob2QgPSAiY29sb3IiKQ0KYGBgDQoNCkRlc3B1w6lzIGRlIHJlYWxpemFyIHVuYSBtYXRyaXogZGUgY29ycmVsYWNpw7NuLCBzZSBvYnNlcnZhcm9uIHZhcmlhcyByZWxhY2lvbmVzIGVudHJlIGxhcyB2YXJpYWJsZXMgcXVlIHByb3BvcmNpb25hbiB2YWxpb3NvcyBpbnNpZ2h0czoNCg0KLSAqKkNvcnJlbGFjaW9uZXMgTmVnYXRpdmFzOioqDQogIC0gU2Ugb2JzZXJ2YSB1bmEgY29ycmVsYWNpw7NuIG5lZ2F0aXZhIHNpZ25pZmljYXRpdmEgZW50cmUgImVtcGxveW1lbnQiIHkgInVuZW1wbG95bWVudCIsIGxvIHF1ZSBzdWdpZXJlIHVuYSByZWxhY2nDs24gaW52ZXJzYSBlbnRyZSBlbCBuaXZlbCBkZSBlbXBsZW8geSBsYSB0YXNhIGRlIGRlc2VtcGxlby4gRXN0byBpbmRpY2EgcXVlIGFsIGF1bWVudGFyIGVsIG5pdmVsIGRlIGVtcGxlbywgbGEgdGFzYSBkZSBkZXNlbXBsZW8gdGllbmRlIGEgZGlzbWludWlyLCB5IHZpY2V2ZXJzYS4gU2Vyw61hIG5lY2VzYXJpbyBzZWxlY2Npb25hciBjdWlkYWRvc2FtZW50ZSB1bmEgZGUgZXN0YXMgdmFyaWFibGVzIHBhcmEgZXZpdGFyIG11bHRpY29saW5lYWxpZGFkIGVuIGVsIG1vZGVsby4NCiAgLSBTZSBkZXRlY3RhbiBjb3JyZWxhY2lvbmVzIG5lZ2F0aXZhcyBlbnRyZSBsYXMgdmFyaWFibGVzIHF1ZSByZXByZXNlbnRhbiBsb3MgZGlmZXJlbnRlcyB0aXBvcyBkZSBhY3RpdmlkYWQgZWNvbsOzbWljYSAocHJpbWFyaWEsIHNlY3VuZGFyaWEgeSB0ZXJjaWFyaWEpLiBBZGVtw6FzLCBleGlzdGUgbGEgcG9zaWJpbGlkYWQgZGUgdW5hIGFsdGEgY29ycmVsYWNpw7NuIGVudHJlICJscV9wcmltYXJ5IiB5ICJyZWFsX2F2ZV9tb250aF9pbmNvbWUiLCBsbyBxdWUgc3VnaWVyZSB1bmEgYXNvY2lhY2nDs24gZW50cmUgbGEgYWN0aXZpZGFkIGVjb27Ds21pY2EgcHJpbWFyaWEgeSBlbCBpbmdyZXNvIHByb21lZGlvIG1lbnN1YWwgcmVhbC4NCiAgLSBUYW1iacOpbiBzZSBvYnNlcnZhIHVuYSBhbHRhIGNvcnJlbGFjacOzbiBlbnRyZSAiYnVzaW5lc3NfYWN0aXZpdHkiIHkgbGFzIHZhcmlhYmxlcyBxdWUgcmVwcmVzZW50YW4gbGEgZXN0cnVjdHVyYSBlY29uw7NtaWNhLCBsbyBxdWUgaW5kaWNhIHVuYSBwb3NpYmxlIHJlbGFjacOzbiBlbnRyZSBsYSBhY3RpdmlkYWQgZW1wcmVzYXJpYWwgeSBsYSBjb21wb3NpY2nDs24gZGVsIHNlY3RvciBlY29uw7NtaWNvLg0KDQotICoqQ29ycmVsYWNpb25lcyBQb3NpdGl2YXM6KioNCiAgLSBTZSBpZGVudGlmaWNhbiBjb3JyZWxhY2lvbmVzIHBvc2l0aXZhcyBlbnRyZSAicG9wX2RlbnNpdHkiIHkgIm5ld19mZGkiLCBhc8OtIGNvbW8gZW50cmUgImJ1c2luZXNzX2FjdGl2aXR5IiB5ICJscV9zZWNvbmRhcnkiLCBsbyBxdWUgc3VnaWVyZSBxdWUgdW5hIG1heW9yIGRlbnNpZGFkIGRlIHBvYmxhY2nDs24geSBhY3RpdmlkYWQgZW1wcmVzYXJpYWwgZXN0w6EgcmVsYWNpb25hZGEgY29uIG1heW9yZXMgZmx1am9zIGRlIGludmVyc2nDs24gZXh0cmFuamVyYSBkaXJlY3RhIHkgdW5hIG1heW9yIGFjdGl2aWRhZCBlY29uw7NtaWNhIHNlY3VuZGFyaWEuDQogIC0gQXNpbWlzbW8sIHNlIG9ic2VydmFuIGNvcnJlbGFjaW9uZXMgcG9zaXRpdmFzIGVudHJlICJlbXBsb3ltZW50IiB5ICJscV9wcmltYXJ5IiwgeSBlbnRyZSAicmVhbF9hdmVfbW9udGhfaW5jb21lIiB5ICJidXNpbmVzc19hY3Rpdml0eSIsIGxvIHF1ZSBpbmRpY2EgdW5hIGFzb2NpYWNpw7NuIGVudHJlIGVsIGVtcGxlbyB5IGxhIGFjdGl2aWRhZCBlY29uw7NtaWNhIHByaW1hcmlhLCBhc8OtIGNvbW8gZW50cmUgZWwgaW5ncmVzbyBwcm9tZWRpbyBtZW5zdWFsIHJlYWwgeSBsYSBhY3RpdmlkYWQgZW1wcmVzYXJpYWwuDQoNCioqQ29tYmluYWNpb25lcyBwYXJhIFRyYWJhamFyOioqDQotIEJhc8OhbmRvc2UgZW4gbGFzIGNvcnJlbGFjaW9uZXMgaWRlbnRpZmljYWRhcywgbGFzIHNpZ3VpZW50ZXMgdmFyaWFibGVzIHBvZHLDrWFuIHNlciBjb25zaWRlcmFkYXMgcGFyYSB0cmFiYWphciBlbiBjb25qdW50bzogImZkaSIsICJjcmltZV9yYXRlIiwgInVuZW1wbG95bWVudCIsICJyZWFsX2F2ZV9tb250aF9pbmNvbWUiLCAiZ29vZF9nb3Zlcm5hbmNlIiwgInJhdGlvX3B1YmxpY19pbnZlc3RtZW50IiB5ICJidXNpbmVzc19hY3Rpdml0eSIuDQoNCioqQ29uY2x1c2lvbmVzIEFkaWNpb25hbGVzOioqDQotIFNlIGRlc3RhY2EgcXVlIGxhIHZhcmlhYmxlICJ1bmVtcGxveW1lbnQiIGVzdMOhIGNvcnJlbGFjaW9uYWRhIGNvbiBsYSB2YXJpYWJsZSBkZXBlbmRpZW50ZSwgbG8gcXVlIHN1Z2llcmUgcXVlIGxhIHRhc2EgZGUgZGVzZW1wbGVvIHB1ZWRlIGluZmx1aXIgZW4gbGEgcHLDoWN0aWNhIGRlbCBuZWFyc2hvcmluZyBlbiBsb3MgZXN0YWRvcyBkZSBNw6l4aWNvLg0KLSBQb3Igb3RybyBsYWRvLCAicmF0aW9fcHVibGljX2ludmVzdG1lbnQiIG11ZXN0cmEgY29ycmVsYWNpb25lcyBzaWduaWZpY2F0aXZhcyBjb24gbGEgbWF5b3LDrWEgZGUgbGFzIHZhcmlhYmxlcywgbG8gcXVlIGluZGljYSBzdSBpbXBvcnRhbmNpYSBlbiBlbCBjb250ZXh0byBkZWwgbmVhcnNob3JpbmcgeSBzdSByZWxhY2nDs24gY29uIG90cmFzIHZhcmlhYmxlcyBlY29uw7NtaWNhcyB5IHNvY2lhbGVzLg0KDQpgYGB7cn0NCnNjYXR0ZXJfbWF0cml4X3Bsb3QgPC0gZ2dwYWlycyhuZWFyc2hfbmV3X2ZkaSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1ucyA9IGMoIm5ld19mZGkiLCJjcmltZV9yYXRlIiwgImVtcGxveW1lbnQiLCAicmVhbF93YWdlIiwgImdvb2RfZ292ZXJuYW5jZSIsICJidXNpbmVzc19hY3Rpdml0eSIsICJwb3BfZGVuc2l0eSIsICJleGNoYW5nZV9yYXRlIiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG93ZXIgPSBsaXN0KGNvbnRpbnVvdXMgPSB3cmFwKCJwb2ludHMiLCBhbHBoYSA9IDAuMywgc2l6ZSA9IDAuNSkpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpYWcgPSBsaXN0KGNvbnRpbnVvdXMgPSB3cmFwKCJiYXJEaWFnIiwgYWxwaGEgPSAwLjgsIGJpbnMgPSAyMCkpKQ0KDQojVmlzdWFsaXphY2nDs24gZGVsIHNjYXR0ZXIgbWF0cml4IHBsb3QNCnByaW50KHNjYXR0ZXJfbWF0cml4X3Bsb3QpDQoNCmBgYA0KDQojIEVzcGVjaWZpY2FjacOzbiBkZSBNb2RlbG8NCg0KRW4gZWwgYW7DoWxpc2lzIGRlIGxvcyBmbHVqb3MgZGUgaW52ZXJzacOzbiBleHRyYW5qZXJhIGRpcmVjdGEgKElFRCkgZW4gTcOpeGljbywgbm9zIGVuZnJlbnRhbW9zIGFsIGRlc2Fmw61vIGRlIGNvbXByZW5kZXIgcXXDqSBmYWN0b3JlcyBpbXB1bHNhbiBvIGZyZW5hbiBlc3RvcyBmbHVqb3MgZmluYW5jaWVyb3MuIEVzIGNydWNpYWwgZW50ZW5kZXIgY8OzbW8gdmFyaWFibGVzIGVjb27Ds21pY2FzIHkgc29jaWFsZXMgcHVlZGVuIGluZmx1aXIgZW4gbGEgYXRyYWNjacOzbiBkZSBpbnZlcnNpb25lcyBleHRyYW5qZXJhcywgbG8gcXVlIHB1ZWRlIHRlbmVyIHVuIGltcGFjdG8gc2lnbmlmaWNhdGl2byBlbiBlbCBkZXNhcnJvbGxvIGVjb27Ds21pY28gZGVsIHBhw61zLg0KDQpQYXJhIGFib3JkYXIgZXN0YSBwcmVndW50YSwgaGVtb3MgZGlzZcOxYWRvLCBlbiBwcmltZXJhIGluc3RhbmNpYSwgdW4gbW9kZWxvIGxpbmVhbCBxdWUgYnVzY2EgZGVzZW50cmHDsWFyIGxhcyBjb21wbGVqYXMgcmVsYWNpb25lcyBlbnRyZSBkaXZlcnNhcyB2YXJpYWJsZXMgeSBsb3MgZmx1am9zIGRlIElFRCBlbiBNw6l4aWNvLiBFbiBlbCBjZW50cm8gZGUgbnVlc3RybyBtb2RlbG8gc2UgZW5jdWVudHJhIGxhIHZhcmlhYmxlIGRlcGVuZGllbnRlLCAibmV3X2ZkaV9yZWFsX214biIsIHF1ZSByZXByZXNlbnRhIGxvcyBudWV2b3MgZmx1am9zIGRlIGludmVyc2nDs24gZXh0cmFuamVyYSBkaXJlY3RhIGVuIHBlc29zIG1leGljYW5vcy4gRXN0ZSBmZW7Ds21lbm8gZXMgZnVuZGFtZW50YWwgcGFyYSBjb21wcmVuZGVyIGPDs21vIGVsIHBhw61zIGF0cmFlIGNhcGl0YWwgZXh0cmFuamVybyB5IHByb211ZXZlIHN1IGNyZWNpbWllbnRvIGVjb27Ds21pY28uDQoNCkFsIGNvbnNpZGVyYXIgbGFzIHZhcmlhYmxlcyBpbmRlcGVuZGllbnRlcyBlbiBudWVzdHJvIG1vZGVsbywgaGVtb3Mgc2VsZWNjaW9uYWRvIGN1aWRhZG9zYW1lbnRlIGFxdWVsbGFzIHF1ZSBjcmVlbW9zIHF1ZSBwdWVkZW4gdGVuZXIgdW4gaW1wYWN0byBzaWduaWZpY2F0aXZvIGVuIGxvcyBmbHVqb3MgZGUgaW52ZXJzacOzbi4gUG9yIGVqZW1wbG8sIGVsIGNhc28gZGUgImVtcGxveW1lbnQiIHNlIGluY2x1eWUgcG9ycXVlIHNlIGNyZWUgcXVlIHVuIG1heW9yIG5pdmVsIGRlIGVtcGxlbyBwdWVkZSBlc3RhciBhc29jaWFkbyBjb24gdW5hIG1heW9yIGFjdGl2aWRhZCBlY29uw7NtaWNhIHksIHBvciBsbyB0YW50bywgcG9kcsOtYSBpbmZsdWlyIGVuIGxvcyBmbHVqb3MgZGUgaW52ZXJzacOzbiBleHRyYW5qZXJhIGRpcmVjdGE7ICJSZWFsX3dhZ2UiLCBzZSBpbmNsdXllIHBvcnF1ZSBsb3Mgc2FsYXJpb3MgcmVhbGVzIHB1ZWRlbiBpbmZsdWlyIGVuIGxhIGNvbXBldGl0aXZpZGFkIGRlIHVuYSBlY29ub23DrWEgeSwgcG9yIGxvIHRhbnRvLCBlbiBzdSBjYXBhY2lkYWQgcGFyYSBhdHJhZXIgaW52ZXJzacOzbiBleHRyYW5qZXJhLCB5IHRhbWJpw6luICAiR29vZF9nb3Zlcm5hbmNlIiwgc2UgaW5jbHV5ZSBwb3JxdWUgdW4gZW50b3JubyBkZSBnb2Jlcm5hbnphIHPDs2xpZG8geSBlc3RhYmxlIHB1ZWRlIHNlciBhdHJhY3Rpdm8gcGFyYSBsb3MgaW52ZXJzb3JlcyBleHRyYW5qZXJvcy4NCg0KQ2FiZSBtZW5jaW9uYXIgcXVlIHNlIGFwbGljYSBsYSB0cmFuc2Zvcm1hY2nDs24gcmHDrXogY3VhZHJhZGEgYSBsYSB2YXJpYWJsZSAiZ29vZF9nb3Zlcm5hbmNlIiBwYXJhIG1pdGlnYXIgcG9zaWJsZXMgcHJvYmxlbWFzIGRlIHNlc2dvIHkgbWVqb3JhciBsYSBsaW5lYWxpZGFkIGVuIGxhIHJlbGFjacOzbiBlbnRyZSBlc3RhIHZhcmlhYmxlIHkgbG9zIGZsdWpvcyBkZSBpbnZlcnNpw7NuLCBhc8OtIG1pc21vIHNlIGFwbGljYSBlbCBsb2dhcml0bW8gYSBsYSB2YXJpYWJsZSAicG9wX2RlbnNpdHkiIHBhcmEgbWFuZWphciBzdSBkaXN0cmlidWNpw7NuIHNlc2dhZGEgeSBwYXJhIHJlZmxlamFyIG1lam9yIGxhIHJlbGFjacOzbiBubyBsaW5lYWwgZW50cmUgbGEgZGVuc2lkYWQgZGUgcG9ibGFjacOzbiB5IGxvcyBmbHVqb3MgZGUgaW52ZXJzacOzbi4NCg0KYGBge3IgTW9kZWxvIG9sc30NCm9scyA8LSBsbShuZXdfZmRpX3JlYWxfbXhuIH4gZW1wbG95bWVudCArIHJlYWxfd2FnZSArIHNxcnQoZ29vZF9nb3Zlcm5hbmNlKSArIGxxX3NlY29uZGFyeSArIGxvZyhwb3BfZGVuc2l0eSkgKyBleGNoYW5nZV9yYXRlLCBkYXRhPW5lYXJzaF9uZXdfcGQpDQpzdW1tYXJ5KG9scykNCnZpZihvbHMpDQpgYGANCg0KIyMgRXN0aW1hY2nDs24gZGUgTW9kZWxvcw0KDQoxLiAqKlBhbmVsX01vZGVsMSAoTW9kZWxvIGRlIEVmZWN0b3MgRmlqb3MpKio6DQogICAtIEVsIHByaW1lciBtb2RlbG8sIFBhbmVsX01vZGVsMSwgdXRpbGl6YSBlbCBtw6l0b2RvIGRlIGVmZWN0b3MgZmlqb3MgKG1vZGVsPSJ3aXRoaW4iKS4gRXN0ZSBlbmZvcXVlIGNvbnRyb2xhIGxvcyBlZmVjdG9zIGZpam9zIGVzcGVjw61maWNvcyBkZSBjYWRhIGVudGlkYWQgKGVuIGVzdGUgY2FzbywgbG9zIGVzdGFkb3MgZGUgTcOpeGljbyksIGVsaW1pbmFuZG8gYXPDrSBlbCBwb3NpYmxlIHNlc2dvIGNhdXNhZG8gcG9yIHZhcmlhYmxlcyBubyBvYnNlcnZhZGFzIHF1ZSBzZWFuIGNvbnN0YW50ZXMgZW4gZWwgdGllbXBvIHBlcm8gdmFyw61lbiBlbnRyZSBsYXMgZW50aWRhZGVzLiBFc3RlIG1vZGVsbyBlcyDDunRpbCBjdWFuZG8gc2UgZXNwZXJhIHF1ZSBoYXlhIGhldGVyb2dlbmVpZGFkIG5vIG9ic2VydmFkYSBlbnRyZSBsYXMgZW50aWRhZGVzLg0KDQoyLiAqKlBhbmVsX01vZGVsMiAoTW9kZWxvIGRlIEVmZWN0b3MgQWxlYXRvcmlvcykqKjoNCiAgIC0gRWwgc2VndW5kbyBtb2RlbG8sIFBhbmVsX01vZGVsMiwgZW1wbGVhIGVsIG3DqXRvZG8gZGUgZWZlY3RvcyBhbGVhdG9yaW9zIChtb2RlbD0icmFuZG9tIikuIEVzdGUgZW5mb3F1ZSBhc3VtZSBxdWUgbG9zIGVmZWN0b3MgaW5kaXZpZHVhbGVzIHNvbiBhbGVhdG9yaW9zIHkgbm8gY29ycmVsYWNpb25hZG9zIGNvbiBsYXMgdmFyaWFibGVzIGV4cGxpY2F0aXZhcy4gRWwgbW9kZWxvIHBlcm1pdGUgcXVlIGxvcyBjb2VmaWNpZW50ZXMgZGUgbGFzIHZhcmlhYmxlcyBleHBsaWNhdGl2YXMgdmFyw61lbiBlbnRyZSBsYXMgZW50aWRhZGVzLCBsbyBxdWUgcHVlZGUgc2VyIMO6dGlsIGN1YW5kbyBzZSBzb3NwZWNoYSBxdWUgaGF5IGhldGVyb2dlbmVpZGFkIG5vIG9ic2VydmFkYSBxdWUgbm8gZXN0w6EgY29tcGxldGFtZW50ZSBjYXB0dXJhZGEgcG9yIGxhcyB2YXJpYWJsZXMgZXhwbGljYXRpdmFzLg0KDQozLiAqKlBhbmVsX01vZGVsMyAoTW9kZWxvIGRlIFBvb2xpbmcpKio6DQogICAtIEVsIHRlcmNlciBtb2RlbG8sIFBhbmVsX01vZGVsMywgdXRpbGl6YSBlbCBtw6l0b2RvIGRlIHBvb2xpbmcgKG1vZGVsPSJwb29saW5nIikuIEVzdGUgZW5mb3F1ZSBjb21iaW5hIGxvcyBkYXRvcyBkZSB0b2RhcyBsYXMgZW50aWRhZGVzIHkgdG9kb3MgbG9zIHBlcsOtb2RvcyBkZSB0aWVtcG8gZW4gdW5hIHNvbGEgcmVncmVzacOzbiwgaWdub3JhbmRvIGxhcyBkaWZlcmVuY2lhcyBlbnRyZSBsYXMgZW50aWRhZGVzIHkgYXN1bWllbmRvIHF1ZSBsb3MgY29lZmljaWVudGVzIGRlIGxhcyB2YXJpYWJsZXMgZXhwbGljYXRpdmFzIHNvbiBsb3MgbWlzbW9zIHBhcmEgdG9kYXMgbGFzIGVudGlkYWRlcyB5IGVuIHRvZG9zIGxvcyBwZXLDrW9kb3MgZGUgdGllbXBvLiBFc3RlIG1vZGVsbyBlcyDDunRpbCBjdWFuZG8gc2UgYXN1bWUgcXVlIG5vIGhheSBoZXRlcm9nZW5laWRhZCBubyBvYnNlcnZhZGEgZW50cmUgbGFzIGVudGlkYWRlcyB5IHF1ZSBsb3MgY29lZmljaWVudGVzIGRlIGxhcyB2YXJpYWJsZXMgZXhwbGljYXRpdmFzIHNvbiBjb25zdGFudGVzIGVuIHRvZGFzIGxhcyBlbnRpZGFkZXMgeSBlbiB0b2RvcyBsb3MgcGVyw61vZG9zIGRlIHRpZW1wby4NCg0KNC4gKipQYW5lbF9Nb2RlbDEuMSAoTW9kZWxvIGRlIEVmZWN0b3MgRmlqb3MgY29uIEVmZWN0b3MgVGVtcG9yYWxlcykqKjoNCiAgIC0gRmluYWxtZW50ZSwgZWwgbW9kZWxvIFBhbmVsX01vZGVsMS4xIGVzIHVuYSB2YXJpYW50ZSBkZWwgcHJpbWVyIG1vZGVsbyBkZSBlZmVjdG9zIGZpam9zLCBwZXJvIGluY2x1eWUgZWZlY3RvcyB0ZW1wb3JhbGVzIChlZmZlY3Q9InRpbWUiKS4gRXN0byBwZXJtaXRlIGNvbnRyb2xhciBsb3MgZWZlY3RvcyBmaWpvcyB0YW50byBhIG5pdmVsIGRlIGVudGlkYWQgY29tbyBhIG5pdmVsIGRlIHRpZW1wbywgbG8gcXVlIHB1ZWRlIHNlciDDunRpbCBjdWFuZG8gc2UgZXNwZXJhIHF1ZSBoYXlhIGhldGVyb2dlbmVpZGFkIG5vIG9ic2VydmFkYSB0YW50byBlbnRyZSBsYXMgZW50aWRhZGVzIGNvbW8gYSBsbyBsYXJnbyBkZWwgdGllbXBvLg0KDQpgYGB7ciBNb2RlbG9zIHBhbmVsfQ0KcGFuZWxfbW9kZWwxIDwtIHBsbShuZXdfZmRpX3JlYWxfbXhuIH4gZW1wbG95bWVudCArIHJlYWxfd2FnZSArIHNxcnQoZ29vZF9nb3Zlcm5hbmNlKSArIGxxX3NlY29uZGFyeSArIGxvZyhwb3BfZGVuc2l0eSkgKyBleGNoYW5nZV9yYXRlLCBkYXRhPW5lYXJzaF9uZXdfcGQsIG1vZGVsPSJ3aXRoaW4iKQ0KI3IgLjA3NA0KcGFuZWxfbW9kZWwyIDwtIHBsbShuZXdfZmRpX3JlYWxfbXhuIH4gZW1wbG95bWVudCArIHJlYWxfd2FnZSArIHNxcnQoZ29vZF9nb3Zlcm5hbmNlKSArIGxxX3NlY29uZGFyeSArIGxvZyhwb3BfZGVuc2l0eSkgKyBleGNoYW5nZV9yYXRlLCBkYXRhPW5lYXJzaF9uZXdfcGQsIG1vZGVsPSJyYW5kb20iKQ0KDQpwYW5lbF9tb2RlbDMgPC0gcGxtKG5ld19mZGlfcmVhbF9teG4gfiBlbXBsb3ltZW50ICsgcmVhbF93YWdlICsgc3FydChnb29kX2dvdmVybmFuY2UpICsgbHFfc2Vjb25kYXJ5ICsgbG9nKHBvcF9kZW5zaXR5KSArIGV4Y2hhbmdlX3JhdGUsIGRhdGE9bmVhcnNoX25ld19wZCwgbW9kZWw9InBvb2xpbmciKQ0KDQpmaXhlZihwYW5lbF9tb2RlbDEpDQpzdW1tYXJ5KGZpeGVmKChwYW5lbF9tb2RlbDEpKSkNCg0KI1NlIGV4YW1pbmEgc8OtIGHDsWFkaXIgZWwgdGltZSBGRSBlcyBuZWNlc2FyaW8uIA0KcGFuZWxfbW9kZWwxLjE8LXBsbShuZXdfZmRpX3JlYWxfbXhuIH4gZW1wbG95bWVudCArIHJlYWxfd2FnZSArIHNxcnQoZ29vZF9nb3Zlcm5hbmNlKSArIGxxX3NlY29uZGFyeSArIGxvZyhwb3BfZGVuc2l0eSkgKyBleGNoYW5nZV9yYXRlLCBkYXRhPW5lYXJzaF9uZXdfcGQsIG1vZGVsPSJ3aXRoaW4iLCBlZmZlY3Q9InRpbWUiKSANCiANCnBGdGVzdChwYW5lbF9tb2RlbDEuMSwgcGFuZWxfbW9kZWwxKSAgDQpwbG10ZXN0KHBhbmVsX21vZGVsMSwgZWZmZWN0PSJ0aW1lIiwgdHlwZT0iYnAiKSANCiNDb25zaWRlcmFuZG8gcXVlIGNvbnRhbW9zIGNvbiB1biBwLXZhbHVlIGRlIDkuMzg3ZS0wOSAobWVub3IgYSA1JSksIHNlIHN1Z2llcmUgcXVlIFRpbWUgRml4ZWQgVmFsdWUgcHVlZGUgc2VyIHJlcXVlcmlkby4NCg0Kc3RhcmdhemVyKHBhbmVsX21vZGVsMSwgcGFuZWxfbW9kZWwxLjEsIHBhbmVsX21vZGVsMiwgcGFuZWxfbW9kZWwzLCB0aXRsZT0iUGFuZWwgUmVncmVzc2lvbiBBbmFseXNpcyIsIHR5cGU9InRleHQiLCBjb2x1bW4ubGFiZWxzID0gYygiSW5kaXZpZHVhbCBGaXhlZCBFZmZlY3RzIiwiVGltZSBGaXhlZCBFZmZlY3RzIiwiUmFuZG9tIEVmZmVjc3RzIiwiUG9vbGVkIikpDQpgYGANCg0KQmFzw6FuZG9ub3MgZW4gbG9zIHJlc3VsdGFkb3Mgb2J0ZW5pZG9zIHkgZW4gbGEgY29tcGFyYWNpw7NuIGVudHJlIGxvcyBtb2RlbG9zIGVzdGltYWRvcywgcGFyZWNlIGhhYmVyIGluZGljaW9zIGNsYXJvcyBkZSBxdWUgZWwgbW9kZWxvIGRlIGVmZWN0b3MgZmlqb3MgKEZpeGVkIEVmZmVjdHMpIHBvZHLDrWEgc2VyIGVsIG3DoXMgYXByb3BpYWRvIHBhcmEgZXN0ZSBhbsOhbGlzaXMuDQoNClByaW1lcm8sIGFsIGV4YW1pbmFyIGxhcyBlc3RhZMOtc3RpY2FzIGRlIHNpZ25pZmljYW5jaWEsIG9ic2VydmFtb3MgcXVlIGVsIG1vZGVsbyBkZSBlZmVjdG9zIGZpam9zIG11ZXN0cmEgdW5hIGFsdGEgc2lnbmlmaWNhbmNpYSBlc3RhZMOtc3RpY2EgcGFyYSBsYSBwcnVlYmEgY29uanVudGEgZGUgbG9zIGVmZWN0b3MgdGVtcG9yYWxlcyAoQnJldXNjaC1QYWdhbiksIGNvbiB1biBwLXZhbG9yIGV4dHJlbWFkYW1lbnRlIGJham8gKHAtdmFsdWUgPSA5LjM4N2UtMDkpLiBFc3RhIGZ1ZXJ0ZSBldmlkZW5jaWEgc3VnaWVyZSBsYSBwcmVzZW5jaWEgZGUgZWZlY3RvcyB0ZW1wb3JhbGVzIHNpZ25pZmljYXRpdm9zIGVuIGxvcyBkYXRvcywgbG8gcXVlIHJlc3BhbGRhIGxhIGluY2x1c2nDs24gZGUgbG9zIGVmZWN0b3MgdGVtcG9yYWxlcyBlbiBlbCBtb2RlbG8gZGUgZWZlY3RvcyBmaWpvcy4NCg0KQWRlbcOhcywgZGVzZGUgdW4gcHVudG8gZGUgdmlzdGEgdGXDs3JpY28sIGFsIGFuYWxpemFyIGRhdG9zIGRlIHBhbmVsLCBlcyBwbGF1c2libGUgYXN1bWlyIHF1ZSBleGlzdGVuIGRpZmVyZW5jaWFzIG5vIG9ic2VydmFkYXMgZW50cmUgbGFzIGVudGlkYWRlcyAoZXN0YWRvcyBkZSBNw6l4aWNvKSBxdWUgcG9kcsOtYW4gaW5mbHVpciBlbiBsb3MgZmx1am9zIGRlIGludmVyc2nDs24gZXh0cmFuamVyYSBkaXJlY3RhLiBQb3IgbG8gdGFudG8sIGNvbnRyb2xhciBlc3RvcyBlZmVjdG9zIGVzcGVjw61maWNvcyBkZSBjYWRhIGVudGlkYWQgbWVkaWFudGUgZWwgbW9kZWxvIGRlIGVmZWN0b3MgZmlqb3MgcGFyZWNlIHNlciB1bmEgZWxlY2Npw7NuIG3DoXMgYWRlY3VhZGEgcGFyYSBjYXB0dXJhciBlc3RhIHZhcmlhY2nDs24gbm8gb2JzZXJ2YWRhLg0KDQpQb3Igw7psdGltbywgbGEgaW50ZXJwcmV0YWNpw7NuIGRlIGxvcyBjb2VmaWNpZW50ZXMgdGFtYmnDqW4gcmVzcGFsZGEgbGEgZWxlY2Npw7NuIGRlbCBtb2RlbG8gZGUgZWZlY3RvcyBmaWpvcy4gQXVucXVlIGxvcyBjb2VmaWNpZW50ZXMgZGUgbGFzIHZhcmlhYmxlcyBleHBsaWNhdGl2YXMgcHVlZGVuIHZhcmlhciBlbnRyZSBsb3MgZGlmZXJlbnRlcyBtb2RlbG9zLCBlbCBtb2RlbG8gZGUgZWZlY3RvcyBmaWpvcyBwcm9wb3JjaW9uYSBlc3RpbWFjaW9uZXMgZXNwZWPDrWZpY2FzIHBhcmEgY2FkYSBlbnRpZGFkLCBsbyBxdWUgcGVybWl0ZSB1bmEgaW50ZXJwcmV0YWNpw7NuIG3DoXMgcHJlY2lzYSBkZSBjw7NtbyBjYWRhIHZhcmlhYmxlIGFmZWN0YSBsb3MgZmx1am9zIGRlIGludmVyc2nDs24gZW4gY2FkYSBlc3RhZG8gZGUgTcOpeGljby4NCg0KIyBQcnVlYmFzIGRlIERpYWduw7NzdGljbw0KDQojIyMgYS4gTXVsdGljb2xpbmVhbGlkYWQgKG11bHRpY29sbGluZWFyaXR5KQ0KYGBge3J9DQp2aWYob2xzKQ0KYGBgDQpFbCBhbsOhbGlzaXMgZGUgbG9zIHZhbG9yZXMgZGVsIEZhY3RvciBkZSBJbmZsYWNpw7NuIGRlIGxhIFZhcmlhbnphIChWSUYpIHJldmVsYSBxdWUgdG9kb3MgbG9zIHZhbG9yZXMgZXN0w6FuIGNlcmNhbm9zIGEgMSwgbG8gcXVlIHN1Z2llcmUgdW5hIGF1c2VuY2lhIGRlIG11bHRpY29saW5lYWxpZGFkIHNpZ25pZmljYXRpdmEgZW50cmUgbGFzIHZhcmlhYmxlcyBpbmRlcGVuZGllbnRlcyBlbiBlbCBtb2RlbG8gZGUgcmVncmVzacOzbi4NCg0KIyMjIGIuIEhldGVyb2NlZGFzdGljaWRhZCAoaGV0ZXJvc2NlZGFzdGljaXR5KQ0KYGBge3J9DQpicHRlc3QocGFuZWxfbW9kZWwxLjEpDQpgYGANCkVsIHRlc3QgQnJldXNjaC1QYWdhbiAgaW5kaWNhIHF1ZSBlbCB2YWxvciBkZSBsYSBwcnVlYmEgZXMgZGUgODEuMTQ3IGNvbiA2IGdyYWRvcyBkZSBsaWJlcnRhZCwgeSBlbCBwLXZhbG9yIGFzb2NpYWRvIGVzIGV4dHJlbWFkYW1lbnRlIGJham8gKHAtdmFsdWUgPSAyLjA3ZS0xNSkuIEVzdG8gc3VnaWVyZSBmdWVydGVtZW50ZSBsYSBwcmVzZW5jaWEgZGUgaGV0ZXJvY2VkYXN0aWNpZGFkIGVuIGxvcyByZXNpZHVvcyBkZWwgbW9kZWxvLiBEYWRvIHF1ZSBlbCBwLXZhbG9yIGVzIHNpZ25pZmljYXRpdmFtZW50ZSBtZW5vciBxdWUgY3VhbHF1aWVyIG5pdmVsIGRlIHNpZ25pZmljYW5jaWEgcmF6b25hYmxlLCBwb2RlbW9zIHJlY2hhemFyIGxhIGhpcMOzdGVzaXMgbnVsYSBkZSBob21vY2VkYXN0aWNpZGFkLiBQb3IgbG8gdGFudG8sIGhheSBldmlkZW5jaWEgZGUgcXVlIGxhIHZhcmlhbnphIGRlIGxvcyBlcnJvcmVzIG5vIGVzIGNvbnN0YW50ZSwgbG8gcXVlIHB1ZWRlIGFmZWN0YXIgbGEgZWZpY2llbmNpYSB5IHByZWNpc2nDs24gZGUgbGFzIGVzdGltYWNpb25lcyBkZSBsb3MgY29lZmljaWVudGVzIGRlbCBtb2RlbG8uIA0KDQojIyMgYy4gQXV0b2NvcnJlbGFjacOzbiBTZXJpYWwgKHNlcmlhbCBjb3JyZWxhdGlvbikNCmBgYHtyfQ0KQm94LnRlc3QoZGF0YSRuZXdfZmRpX3JlYWxfbXhuLGxhZz0xLHR5cGU9IkxqdW5nLUJveCIpIA0KYWNmKGRhdGEkbmV3X2ZkaV9yZWFsX214bixtYWluPSJTaWduaWZpY2FudCBBdXRvY29ycmVsYXRpb25zIikgDQpgYGANCg0KRWwgdGVzdCBkZSBCb3gtTGp1bmcgcGFyYSBsYSBzZXJpZSB0ZW1wb3JhbCBkZSBsb3MgZGF0b3MgZGUgaW52ZXJzacOzbiBleHRyYW5qZXJhIGRpcmVjdGEgKG5ld19mZGlfcmVhbF9teG4pIGluZGljYSBxdWUgZWwgdmFsb3IgZGUgbGEgZXN0YWTDrXN0aWNhIGRlIHBydWViYSBlcyBkZSAyLjEzMDkgY29uIDEgZ3JhZG8gZGUgbGliZXJ0YWQsIHkgZWwgcC12YWxvciBhc29jaWFkbyBlcyBkZSAwLjE0NDQuIA0KDQpEYWRvIHF1ZSBlbCBwLXZhbG9yIGVzIG1heW9yIHF1ZSBjdWFscXVpZXIgbml2ZWwgZGUgc2lnbmlmaWNhbmNpYSByYXpvbmFibGUsIG5vIGhheSBzdWZpY2llbnRlIGV2aWRlbmNpYSBwYXJhIHJlY2hhemFyIGxhIGhpcMOzdGVzaXMgbnVsYSBkZSBpbmRlcGVuZGVuY2lhIGRlIGxvcyBlcnJvcmVzLiBFc3RvIHN1Z2llcmUgcXVlIG5vIGhheSBhdXRvY29ycmVsYWNpw7NuIHNpZ25pZmljYXRpdmEgZW4gbGEgc2VyaWUgdGVtcG9yYWwgZGUgbG9zIGRhdG9zIGRlIGludmVyc2nDs24gZXh0cmFuamVyYSBkaXJlY3RhIGNvbiB1biByZXphZ28gZGUgMSBwZXJpb2RvLiBFbiBvdHJhcyBwYWxhYnJhcywgbG9zIGVycm9yZXMgcGFyZWNlbiBzZXIgaW5kZXBlbmRpZW50ZXMgYSBsbyBsYXJnbyBkZWwgdGllbXBvLg0KDQojIyMgZC4gRXN0YWNpb25hcmllZGFkIChzdGF0aW9uYXJ5KSANCg0KYGBge3J9DQphZGYudGVzdChkYXRhJG5ld19mZGlfcmVhbF9teG4pDQpwbG90KGRhdGEkbmV3X2ZkaV9yZWFsX214bikNCmBgYA0KDQpMYSBwcnVlYmEgYXVtZW50YWRhIGRlIERpY2tleS1GdWxsZXIgKEFERikgc2UgdXRpbGl6YSBwYXJhIGV2YWx1YXIgc2kgdW5hIHNlcmllIHRlbXBvcmFsIGVzIGVzdGFjaW9uYXJpYSBvIG5vLiBFbiBlc3RlIGNhc28sIGVsIHJlc3VsdGFkbyBpbmRpY2EgcXVlIGVsIHZhbG9yIGRlIGxhIGVzdGFkw61zdGljYSBkZSBwcnVlYmEgRGlja2V5LUZ1bGxlciBlcyBkZSAtNi42ODE4LCBjb24gdW4gbGFnIG9yZGVyIGRlIDcsIHkgZWwgcC12YWxvciBhc29jaWFkbyBlcyBkZSAwLjAxLiANCg0KRGFkbyBxdWUgZWwgcC12YWxvciBlcyBtZW5vciBxdWUgY3VhbHF1aWVyIG5pdmVsIGRlIHNpZ25pZmljYW5jaWEgcmF6b25hYmxlLCByZWNoYXphbW9zIGxhIGhpcMOzdGVzaXMgbnVsYSBkZSBxdWUgbGEgc2VyaWUgdGVtcG9yYWwgdGVuZ2EgdW5hIHJhw616IHVuaXRhcmlhIHkgYWNlcHRhbW9zIGxhIGhpcMOzdGVzaXMgYWx0ZXJuYXRpdmEgZGUgcXVlIGxhIHNlcmllIGVzIGVzdGFjaW9uYXJpYS4gRW4gb3RyYXMgcGFsYWJyYXMsIGhheSBldmlkZW5jaWEgc3VmaWNpZW50ZSBwYXJhIGFmaXJtYXIgcXVlIGxhIHNlcmllIGRlIGludmVyc2nDs24gZXh0cmFuamVyYSBkaXJlY3RhIChuZXdfZmRpX3JlYWxfbXhuKSBlcyBlc3RhY2lvbmFyaWEuIEVzdG8gaW1wbGljYSBxdWUgbGEgc2VyaWUgbm8gbXVlc3RyYSB0ZW5kZW5jaWEgbyBwYXRyb25lcyBkZSBjb21wb3J0YW1pZW50byBzaXN0ZW3DoXRpY29zIGEgbG8gbGFyZ28gZGVsIHRpZW1wby4NCg0KDQojIyBTZWxlY2Npw7NuIGRlIE1vZGVsbyBlIEludGVycHJldGFjacOzbiBkZSBSZXN1bHRhZG9zDQoNCkFudGVzIGRlIHNlbGVjY2lvbmFyIGxhcyB2YXJpYWJsZXMgcGFyYSBudWVzdHJvcyBtb2RlbG9zIGRlIHJlZ3Jlc2nDs24sIHJlYWxpemFtb3MgYWp1c3RlcyBlbiBjaWVydGFzIHZhcmlhYmxlcyBwcmVkaWN0b3JhcyBwYXJhIG1lam9yYXIgbGEgZGlzdHJpYnVjacOzbiBkZSBsb3MgZGF0b3MuIFBvciBlamVtcGxvLCBhcGxpY2Ftb3MgdW5hIHRyYW5zZm9ybWFjacOzbiBsb2dhcsOtdG1pY2EgYSBsYSB2YXJpYWJsZSAicG9wX2RlbnNpdHkiIGRlYmlkbyBhIHN1IGRpc3RyaWJ1Y2nDs24gc2VzZ2FkYSwgcHJpbmNpcGFsbWVudGUgaW5mbHVlbmNpYWRhIHBvciBsYSBhbHRhIGNvbmNlbnRyYWNpw7NuIGRlIHBvYmxhY2nDs24gZW4gbGEgQ2l1ZGFkIGRlIE3DqXhpY28uIEFzaW1pc21vLCB1dGlsaXphbW9zIGxhIHJhw616IGN1YWRyYWRhIGRlIGxhIHZhcmlhYmxlICJnb29kX2dvdmVybmFuY2UiIHBhcmEgbWl0aWdhciBzdSBzZXNnbyB5IG1lam9yYXIgc3UgYWp1c3RlIGVuIGVsIG1vZGVsby4NCg0KRGVzcHXDqXMgZGUgcmVhbGl6YXIgbGFzIHBydWViYXMgZGUgZGlhZ27Ds3N0aWNvLCBoZW1vcyBkZXRlcm1pbmFkbyBxdWUgZWwgbW9kZWxvIGRlIHJlZ3Jlc2nDs24gZGUgZGF0b3MgcGFuZWwgcXVlIG11ZXN0cmEgZWwgbWVqb3IgZGVzZW1wZcOxbyBlcyBlbCBkZSBUaW1lIEZpeGVkIEVmZmVjdHMuIEVzdGUgbW9kZWxvIGV4aGliZSBsb3MgZXN0YWTDrXN0aWNvcyBtw6FzIGFsdG9zIGVuIHTDqXJtaW5vcyBkZSBhanVzdGUgeSBjYXBhY2lkYWQgZXhwbGljYXRpdmEsIGxvIHF1ZSBzdWdpZXJlIHF1ZSBsYXMgdmFyaWFibGVzIGluY2x1aWRhcyB0aWVuZW4gdW4gaW1wYWN0byBzaWduaWZpY2F0aXZvIGVuIGxhIHZhcmlhYmxlIGRlcGVuZGllbnRlLiBQb3IgbG8gdGFudG8sIGhlbW9zIGNvbmNsdWlkbyBxdWUgZWwgbW9kZWxvIGRlIFRpbWUgRml4ZWQgRWZmZWN0cyBlcyBlbCBtw6FzIGFkZWN1YWRvIHBhcmEgbnVlc3Ryb3MgcHJvcMOzc2l0b3MgZGUgYW7DoWxpc2lzIHkgcHJlZGljY2nDs24uDQoNCg0KIyBDb25jbHVzaW9uZXMNCg0KRGVzcHXDqXMgZGUgcmVhbGl6YXIgdW4gZXhoYXVzdGl2byBhbsOhbGlzaXMgZGUgZGF0b3MgcGFuZWwgcGFyYSBpbnZlc3RpZ2FyIGxvcyBmYWN0b3JlcyBxdWUgaW5mbHV5ZW4gZW4gbGEgYXRyYWNjacOzbiBkZWwgTmVhcnNob3JpbmcgZW4gTcOpeGljbywgc2Ugb2J0dXZpZXJvbiBsb3Mgc2lndWllbnRlcyBoYWxsYXpnb3MgY2xhdmU6DQoNCjEuICoqVmFyaWFibGVzIFNpZ25pZmljYXRpdmFzKio6DQogICAtIFNlIGlkZW50aWZpY2Fyb24gdmFyaWFzIHZhcmlhYmxlcyBzaWduaWZpY2F0aXZhcyBxdWUgZXN0w6FuIGFzb2NpYWRhcyBjb24gbGEgYXRyYWNjacOzbiBkZSBOZWFyc2hvcmluZyBlbiBNw6l4aWNvLiBFc3RhcyBpbmNsdXllbiBlbCBlbXBsZW8sIGVsIHNhbGFyaW8gcmVhbCwgbGEgZGVuc2lkYWQgZGUgcG9ibGFjacOzbiB5IGVsIHRpcG8gZGUgY2FtYmlvLg0KDQoyLiAqKkltcGFjdG8gZGVsIEVtcGxlbyB5IFNhbGFyaW8gUmVhbCoqOg0KICAgLSBTZSBlbmNvbnRyw7MgdW5hIHJlbGFjacOzbiBwb3NpdGl2YSBlbnRyZSBlbCBuaXZlbCBkZSBlbXBsZW8geSBsYSBpbnZlcnNpw7NuIGV4dHJhbmplcmEgZGlyZWN0YSBlbiBOZWFyc2hvcmluZy4gRXN0byBzdWdpZXJlIHF1ZSB1bmEgbWF5b3IgZGlzcG9uaWJpbGlkYWQgZGUgbWFubyBkZSBvYnJhIGNhbGlmaWNhZGEgZXN0w6EgcmVsYWNpb25hZGEgY29uIHVuYSBtYXlvciBhdHJhY2Npw7NuIGRlIGludmVyc2lvbmVzIGV4dHJhbmplcmFzLg0KICAgLSBTaW1pbGFybWVudGUsIHNlIG9ic2VydsOzIHF1ZSB1biBzYWxhcmlvIHJlYWwgbcOhcyBhbHRvIHRhbWJpw6luIGVzdMOhIGFzb2NpYWRvIGNvbiB1biBhdW1lbnRvIGVuIGxhIGludmVyc2nDs24gZXh0cmFuamVyYSBkaXJlY3RhIGVuIE5lYXJzaG9yaW5nLiBFc3RvIHB1ZWRlIGluZGljYXIgcXVlIHVuIG1heW9yIHBvZGVyIGFkcXVpc2l0aXZvIGVuIGVsIHBhw61zIHB1ZWRlIGF0cmFlciBhIGVtcHJlc2FzIGV4dHJhbmplcmFzLg0KDQozLiAqKkRlbnNpZGFkIGRlIFBvYmxhY2nDs24qKjoNCiAgIC0gU2UgZW5jb250csOzIHVuYSBhc29jaWFjacOzbiBwb3NpdGl2YSBlbnRyZSBsYSBkZW5zaWRhZCBkZSBwb2JsYWNpw7NuIHkgbGEgaW52ZXJzacOzbiBleHRyYW5qZXJhIGRpcmVjdGEgZW4gTmVhcnNob3JpbmcuIEVzdG8gc3VnaWVyZSBxdWUgbGFzIMOhcmVhcyBtw6FzIGRlbnNhbWVudGUgcG9ibGFkYXMgcHVlZGVuIG9mcmVjZXIgdW4gbWVyY2FkbyBkZSBjb25zdW1vIG3DoXMgZ3JhbmRlIHkgYWNjZXNvIGEgdW5hIG1hbm8gZGUgb2JyYSBtw6FzIGFtcGxpYSwgbG8gcXVlIGF0cmFlIGEgbGFzIGVtcHJlc2FzLg0KDQo0LiAqKkFjdGl2aWRhZCBFY29uw7NtaWNhIFNlY3VuZGFyaWEqKjoNCiAgIC0gU2Ugb2JzZXJ2w7MgdW5hIHJlbGFjacOzbiBuZWdhdGl2YSBlbnRyZSBsYSBhY3RpdmlkYWQgZWNvbsOzbWljYSBlbiBlbCBzZWN0b3Igc2VjdW5kYXJpbyB5IGxhIGludmVyc2nDs24gZXh0cmFuamVyYSBkaXJlY3RhIGVuIE5lYXJzaG9yaW5nLiBFc3RvIHBvZHLDrWEgaW5kaWNhciBxdWUgdW5hIG1heW9yIGNvbXBldGVuY2lhIGVuIGxhIG1hbnVmYWN0dXJhIGxvY2FsIG8gY29uZGljaW9uZXMgZGVzZmF2b3JhYmxlcyBlbiBlc2Ugc2VjdG9yIGVzcGVjw61maWNvIHB1ZWRlbiBkZXNhbGVudGFyIGxhIGludmVyc2nDs24gZXh0cmFuamVyYS4NCg0KNS4gKipHb2Jlcm5hbnphIHkgVGlwbyBkZSBDYW1iaW8qKjoNCiAgIC0gQXVucXVlIG5vIHRvZG9zIGxvcyByZXN1bHRhZG9zIGZ1ZXJvbiBzaWduaWZpY2F0aXZvcywgc2Ugb2JzZXJ2YXJvbiB0ZW5kZW5jaWFzIGVuIGN1YW50byBhIGxhIGdvYmVybmFuemEgeSBlbCB0aXBvIGRlIGNhbWJpby4gDQoNCg0KIyBSZWZlcmVuY2lhcw0KDQotIEd1dGllcnJleiwgSi4gTS4gKDIwMjMsIDExIG1hcnpvKS4gRUwgTU9ERUxPIERFIERBVE9TIERFIFBBTkVMLiBUb2RvIEVjb25vbWV0csOtYSB5IENpZW5jaWEgZGUgRGF0b3MuIGh0dHBzOi8vdG9kb2Vjb25vbWV0cmlhLmNvbS9wYW5lbGRhdGExLw0KDQotIER1csOhbiwgUi4gKDIwMjMsIDggZmVicmVybykuIE5lYXJzaG9yaW5nOiAxMCBwcmVndW50YXMgeSByZXNwdWVzdGFzIHNvYnJlIGVsIHRlbWEgZGVsIHF1ZSB0b2RvcyBoYWJsYW4uIEVHQURFLiBodHRwczovL2VnYWRlLnRlYy5teC9lcy9lZ2FkZS1pZGVhcy9pbnZlc3RpZ2FjaW9uL25lYXJzaG9yaW5nLTEwLXByZWd1bnRhcy15LXJlc3B1ZXN0YXMtc29icmUtZWwtdGVtYS1kZWwtcXVlLXRvZG9zLWhhYmxhbg==