1 Introduction

The goal of this study is to determine whether the number of Cars Derailed and the amount of Track Damage can be used to reliably predict Equipment Damage in U.S. railroad accidents. Specifically, I want to answer the research question:

Can the number of Cars Derailed and the amount of Track Damage be used to reliably predict Equipment Damage in train accidents?

To investigate this, I use accident data collected in 2010 from the Federal Railroad Administration (safetydata.fra.dot.gov). The dataset includes information such as accident cause, speed, injuries, fatalities, track type, and several measures of damage. From these variables, I focus on Cars Derailed and Track Damage because exploratory analysis shows they have the strongest correlation with Equipment Damage. I also create an interaction term (Cars Derailed × Track Damage) to test whether the effect of derailments depends on track conditions.

The approach will include exploratory analysis of the data set, construction of several candidate regression models (main effects, interaction model, and transformed model), residual diagnostics, and nonparametric techniques such as bootstrap confidence intervals. By comparing these models, I will identify which predictors meaningfully explain variation in Equipment Damage and evaluate the stability of the results.

2 Description of Data Set

The data set I chose was Railroad Accidents in the U.S. in 2010. The data was collected via safetydata.fra.dot.gov. In last week’s project, I used this data set to determine if the number of Cars Derailed positively correlated with Equipment Damage (in dollars). This week, I want to add Track Damage (in dollars) to my model because it had the second strongest correlation coefficient r from last week’s correlation matrix. I’m going to see how accurately Cars Derailed and Track Damage can predict Equipment Damage.

2.1 Variables

  • Railroad (categorical) - name of railroad
  • Month (categorical)
  • Day (categorical) - days of the week labeled 1 through 7
  • State (categorical)
  • County (categorical)
  • Track Type (categorical)
  • Track Management (categorical)
  • Accident Type (categorical)
  • Accident Cause (categorical)
  • Equipment Damage (numerical) - amount of money spent on damages
  • Track Damage (numerical) - amount of money spent on track repair
  • Killed (numerical) - number of people killed from accident
  • Injured (numerical) - number of people injured from accident
  • RREquip (categorical) - type of train
  • Speed (numerical) - mph the train was going at during impact
  • Locomotives Derailed (numerical) - the number of locomotives derailed
  • Cars Derailed (numerical) - the number of Cars Derailed

3 Methodology and Analysis

I am going to create two multiple linear regression models: one with Cars Derailed and Track Damage being added together, and one with the two variables being multiplied (interacted) together. There is a possibility that a single derailed car causes more damage if the track is already badly damaged. If that’s the case, then the interaction model would be more appropriate to use. We will be dropping all of the other variables mentioned in #2.

4 Model 1: Main Effects Model

We are going to start with the MLR model without the interaction term.

4.1 Inferential Statistics

# Multiple Linear Regression
model1 <- lm(EqpDamg ~ CarsDer + TrkDamg, data = myData)

# Summary of the model
summary(model1)

Call:
lm(formula = EqpDamg ~ CarsDer + TrkDamg, data = myData)

Residuals:
     Min       1Q   Median       3Q      Max 
-1019731   -48772     9400    32944  3143734 

Coefficients:
              Estimate Std. Error t value Pr(>|t|)    
(Intercept) -1.988e+04  4.001e+03  -4.968 7.19e-07 ***
CarsDer      2.538e+04  7.260e+02  34.961  < 2e-16 ***
TrkDamg      5.387e-01  3.819e-02  14.108  < 2e-16 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 180500 on 2618 degrees of freedom
Multiple R-squared:  0.4733,    Adjusted R-squared:  0.4729 
F-statistic:  1176 on 2 and 2618 DF,  p-value: < 2.2e-16

Looking at the inferential statistics, Cars Derailed and Track Damage are both highly significant. The intercept is not statistically significant. For each additional car derailed (25,380, p < 2e-16), Equipment Damage increases by about $25,380, holding Track Damage constant. For each additional dollar spent on Track Damage (0.54, p < 2e-16), Equipment Damage increases by about $0.54, holding Cars Derailed constant. This model explains 47.29% of the variation in Equipment Damage. The model is highly significant (F = 1176, p = 0)

4.2 Residual Analysis

# Fit model without interaction
model1 <- lm(EqpDamg ~ CarsDer + TrkDamg, data = myData)
# Plot residuals vs fitted to check assumptions
par(mfrow = c(2,2))
plot(model1)

par(mfrow = c(1,1))

The Residuals vs Fitted plot shows there is no constant variance in the residuals. The Q-Q Residuals shows multiple outliers and two strong tails, indicating non-normality. The Scale Location plot shows a lack of constant variance and the Residuals vs Leverage plot shows an outlier at 390. The assumptions for normality are not met.

5 Model 2: Interaction Term

Now, I am going to incorporate the interaction term, CarsDer:TrkDamg, exclude the main effects, and see if the R-squared value increased and if the interaction term is statistically significant. I’ll also be looking to see if the model as a whole is significant. If it’s not, then I’ll be removing the term and go forward with the MLR model.

5.1 Inferential Statistics

# Multiple Linear Regression with Interaction
model2 <- lm(EqpDamg ~ CarsDer:TrkDamg, data = myData)

# Summary of the model
summary(model2)

Call:
lm(formula = EqpDamg ~ CarsDer:TrkDamg, data = myData)

Residuals:
     Min       1Q   Median       3Q      Max 
-1799092   -44483   -33634   -15771  3153755 

Coefficients:
                 Estimate Std. Error t value Pr(>|t|)    
(Intercept)     4.624e+04  3.635e+03   12.72   <2e-16 ***
CarsDer:TrkDamg 7.002e-02  1.508e-03   46.42   <2e-16 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 184200 on 2619 degrees of freedom
Multiple R-squared:  0.4514,    Adjusted R-squared:  0.4512 
F-statistic:  2155 on 1 and 2619 DF,  p-value: < 2.2e-16

For each additional unit increase in CarsDer:TrkDamg, Equipment Damage increases by $0.07. The interaction term is highly significant (F = 2155, p = 0). This model explains 45.12% of the variation in Equipment Damage.

5.2 Residual Analysis

# Fit the interaction model
model2 <- lm(EqpDamg ~ CarsDer:TrkDamg, data = myData)

# Residual diagnostics
par(mfrow = c(2,2))  # show 4 plots together
plot(model2)

par(mfrow = c(1,1))  # reset layout

The Residuals vs Fitted plot shows there is no constant variance in the residuals. The Q-Q Residuals shows multiple outliers and one strong tail, showing non-normality. The Scale Location plot shows a lack of constant variance and the Residuals vs Leverage plot shows an outlier at 1414. All in all, the assumptions for normality are not met.

6 Model 3: Interaction Term with Main Effects

Finally, I will be using both main effects and their interaction term to create Model 3.

6.1 Inferential Statistics

# Model 3: CarsDer + TrkDamg + CarsDer:TrkDamg
model3 <- lm(EqpDamg ~ CarsDer + TrkDamg + CarsDer:TrkDamg, data = myData)

# Summary of the model
summary(model3)

Call:
lm(formula = EqpDamg ~ CarsDer + TrkDamg + CarsDer:TrkDamg, data = myData)

Residuals:
     Min       1Q   Median       3Q      Max 
-1084820   -37763    -3774    11799  3144550 

Coefficients:
                 Estimate Std. Error t value Pr(>|t|)    
(Intercept)     3.401e+03  3.974e+03   0.856    0.392    
CarsDer         1.735e+04  8.114e+02  21.382   <2e-16 ***
TrkDamg         7.346e-02  4.398e-02   1.670    0.095 .  
CarsDer:TrkDamg 4.165e-02  2.268e-03  18.363   <2e-16 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 169900 on 2617 degrees of freedom
Multiple R-squared:  0.5334,    Adjusted R-squared:  0.5329 
F-statistic: 997.3 on 3 and 2617 DF,  p-value: < 2.2e-16

Cars Derailed (17,350, p < 2e-16), Track Damage (0.073, p = 0.095), and their interaction term (p = 0) are all statistically significant. Since the interaction term is significant, this means that the variables depend on each other. The effect of Cars Derailed on Equipment Damage grows as Track Damage grows. When both Cars Derailed and Track Damage are zero, the expected Equipment Damage is $3400. The intercept is not statistically significant. For each additional car derailed, Equipment Damage increases by about $17,350 on average, holding Track Damage constant at zero. Each additional dollar of Track Damage is associated with about $0.07 of additional Equipment Damage. This model explains 53.39% of the variation in Equipment Damage. The model is highly significant (F = 997.3, p = 0).

6.2 Residual Analysis

# Residual diagnostic plots
par(mfrow = c(2,2))
plot(model3)

par(mfrow = c(1,1))  # reset

The assumptions of normality are not met. There is no constant variance in the Residuals vs Fitted plot, there is a strong right tail in the Q-Q Residuals plot, the Scale Location plot does not show constant variance, and there is one outlier, 1414, in the Residuals vs Leverage plot.

7 ANOVA

anova(model1, model2, model3)
Analysis of Variance Table

Model 1: EqpDamg ~ CarsDer + TrkDamg
Model 2: EqpDamg ~ CarsDer:TrkDamg
Model 3: EqpDamg ~ CarsDer + TrkDamg + CarsDer:TrkDamg
  Res.Df        RSS Df   Sum of Sq      F    Pr(>F)    
1   2618 8.5269e+13                                    
2   2619 8.8817e+13 -1 -3.5477e+12 122.91 < 2.2e-16 ***
3   2617 7.5536e+13  2  1.3281e+13 230.06 < 2.2e-16 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

The ANOVA table shows that adding the interaction term to the main effects significantly improves the model. As a result, Model 3 is the best model because it reduces residual variation the most. Model 2 is the worst of the three models because it doesn’t take into account the influence that the independent main effects have on the model. Model 2 also has the highest residual sum of squares, meaning there is more unexplained variation in this model compared to the other two.

8 Nonparametric Tests

We are going to move forward with Model 3 because we established it as the best of the three. I will be conducting a Box-Cox transformation and Bootstrap confidence intervals because the assumptions for normality were not met.

8.1 Box-Cox Transformation

library(MASS)

# Shift the response to make all values positive
myData$EqpDamg_pos <- myData$EqpDamg + abs(min(myData$EqpDamg)) + 1

# Fit Model 3: CarsDer + TrkDamg + interaction
model3_pos <- lm(EqpDamg_pos ~ CarsDer + TrkDamg + CarsDer:TrkDamg, data = myData)

# Box-Cox transformation
bc <- boxcox(model3_pos,
             lambda = seq(-2, 2, 0.1),
             lambda.lab = "Lambda",
             ylab = "Log-Likelihood",
             main = "Box-Cox Transformation for Model 3")

# Identify lambda that maximizes log-likelihood
lambda_opt <- bc$x[which.max(bc$y)]
lambda_opt
[1] 0.2222222

I conducted a Box-Cox transformation to assess whether transforming Equipment Damage would improve the model assumptions. Since λ = 1 is within the confidence interval, no transformation is needed.

8.2 Bootstrap Confidence Intervals

library(boot)

# Define function to extract coefficients
boot_coef <- function(data, indices) {
  d <- data[indices, ]  # resample rows
  fit <- lm(EqpDamg ~ CarsDer + TrkDamg + CarsDer:TrkDamg, data = d)
  return(coef(fit))
}

# Run bootstrap
set.seed(123)  # for reproducibility
boot_results <- boot(data = myData, statistic = boot_coef, R = 1000)  # 1000 resamples

# Create a tidy table of 95% percentile CIs for all coefficients
coef_names <- names(coef(model3))
ci_list <- lapply(1:length(coef_names), function(i) {
  ci <- boot.ci(boot_results, type = "perc", index = i)$percent[4:5]
  data.frame(Coefficient = coef_names[i],
             Lower95 = ci[1],
             Upper95 = ci[2])
})

ci_table <- do.call(rbind, ci_list)
print(ci_table)
      Coefficient       Lower95      Upper95
1     (Intercept) -5542.0358228 1.329135e+04
2         CarsDer 12827.1587568 2.172305e+04
3         TrkDamg    -0.1240326 3.215833e-01
4 CarsDer:TrkDamg     0.0289688 6.334345e-02

The Cars Derailed interval is entirely positive. This indicates strong evidence of a positive effect. We are 95% confident that the slope of Cars Derailed is between 12,800 and 21,700. The interval for Track Damage includes 0, which means the effect alone may not have a consistent effect on Equipment Damage. We are 95% confident that the slope of Track Damage is between -0.124 and 0.322. The interval for the interaction term is entirely positive, meaning the interaction is meaningful. We are 95% confident that the slope of the interaction term is between 0.03 and 0.06.

9 Conclusion

The main finding of this analysis is that Equipment Damage in railroad accidents is overwhelmingly explained by the number of Cars Derailed. Both classical regression and bootstrap methods consistently showed that Cars Derailed is a strong and highly significant predictor, with narrow confidence intervals that exclude zero. In contrast, Track Damage alone and its interaction with Cars Derailed were not reliable predictors once Cars Derailed was included, as both residual and bootstrap intervals collapsed to zero. This indicates that derailments themselves, rather than track repair costs, are the primary drivers of equipment damage.

A few drawbacks limit this study. First, the data set comes from 2010, so the results may not fully generalize to today’s accidents given technological and safety improvements since then. Second, the residual analysis showed clear heteroscedasticity and outliers, which we attempted to address with a Box-Cox transformation, but that came at the cost of a lower R². Third, the model was limited to variables available in the dataset and did not include other potentially important predictors such as train speed, weather conditions, or train load.

There are several future improvements worth considering. Collecting more recent accident data would make the model more relevant to current conditions. Adding additional predictors such as weather, maintenance practices, or cargo weight may improve explanatory power. Exploring nonlinear models or robust regression could also help address heteroscedasticity and outliers more effectively.

In terms of applications, this model provides clear guidance for rail safety analysts and policymakers. Since the number of Cars Derailed is the most consistent predictor of costly equipment damage, mitigation strategies should focus on reducing derailments through improved inspection protocols, stronger track maintenance, and upgraded braking systems. While Track Damage itself was not a strong predictor in this analysis, it remains a real financial burden, and future models could integrate engineering assessments to capture its true costs more fully. Overall, this project demonstrates how statistical modeling can guide data-driven decision-making to reduce accident losses.

10 References

safetydata.fra.dot.gov

LS0tDQp0aXRsZTogIlZhcmlhYmxlcyB0aGF0IFByZWRpY3QgVHJhaW4gRXF1aXBtZW50IERhbWFnZSINCmF1dGhvcjogIkx1a2UgVm9sbSINCmRhdGU6ICIyMDI1LTA5LTIxIg0Kb3V0cHV0Og0KICBodG1sX2RvY3VtZW50OiAgICAgICAgICAgIyBvdXRwdXQgZG9jdW1lbnQgZm9ybWF0DQogICAgdG9jOiB5ZXMgICAgICAgICAgICAgICAjIGFkZCB0YWJsZSBjb250ZW50cw0KICAgIHRvY19mbG9hdDogeWVzICAgICAgICAgIyB0b2NfcHJvcGVydHk6IGZsb2F0aW5nDQogICAgdG9jX2RlcHRoOiA0ICAgICAgICAgICAjIGRlcHRoIG9mIFRPQyBoZWFkaW5ncw0KICAgIGZpZ193aWR0aDogNiAgICAgICAgICAgIyBnbG9iYWwgZmlndXJlIHdpZHRoDQogICAgZmlnX2hlaWdodDogNCAgICAgICAgICAjIGdsb2JhbCBmaWd1cmUgaGVpZ2h0DQogICAgZmlnX2NhcHRpb246IHllcyAgICAgICAjIGFkZCBmaWd1cmUgY2FwdGlvbg0KICAgIG51bWJlcl9zZWN0aW9uczogbm8gICAjIG51bWJlcmluZyBzZWN0aW9uIGhlYWRpbmdzDQogICAgdG9jX2NvbGxhcHNlZDogeWVzICAgICAjIFRPQyBzdWJoZWFkaW5nIGNvbGxhcHNpbmcNCiAgICBjb2RlX2ZvbGRpbmc6IGhpZGUgICAgICMgZm9sZGluZy9zaG93aW5nIGNvZGUgDQogICAgY29kZV9kb3dubG9hZDogeWVzICAgICAjIGFsbG93IHRvIGRvd25sb2FkIGNvbXBsZXRlIFJNYXJrZG93biBzb3VyY2UgY29kZQ0KICAgIHNtb290aF9zY3JvbGw6IHllcyAgICAgIyBzY3JvbGxpbmcgdGV4dCBvZiB0aGUgZG9jdW1lbnQNCiAgICB0aGVtZTogbHVtZW4gICAgICAgICAgICMgdmlzdWFsIHRoZW1lIGZvciBIVE1MIGRvY3VtZW50IG9ubHkNCiAgICBoaWdobGlnaHQ6IHRhbmdvICAgICAgICMgY29kZSBzeW50YXggaGlnaGxpZ2h0aW5nIHN0eWxlcw0KICBwZGZfZG9jdW1lbnQ6IA0KICAgIHRvYzogeWVzDQogICAgdG9jX2RlcHRoOiA0DQogICAgZmlnX2NhcHRpb246IHllcw0KICAgIG51bWJlcl9zZWN0aW9uczogeWVzDQogIHdvcmRfZG9jdW1lbnQ6DQogICAgdG9jOiB5ZXMNCiAgICB0b2NfZGVwdGg6ICc0Jw0KLS0tDQpgYGB7Y3NzLCBlY2hvID0gRkFMU0V9DQpkaXYjVE9DIGxpIHsgICAgIC8qIHRhYmxlIG9mIGNvbnRlbnQgICovDQogICAgbGlzdC1zdHlsZTp1cHBlci1yb21hbjsNCiAgICBiYWNrZ3JvdW5kLWltYWdlOm5vbmU7DQogICAgYmFja2dyb3VuZC1yZXBlYXQ6bm9uZTsNCiAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOjA7DQp9DQoNCmgxLnRpdGxlIHsgICAgLyogbGV2ZWwgMSBoZWFkZXIgb2YgdGl0bGUgICovDQogIGZvbnQtc2l6ZTogMjRweDsNCiAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogIGNvbG9yOiBEYXJrUmVkOw0KICB0ZXh0LWFsaWduOiBjZW50ZXI7DQp9DQoNCmg0LmF1dGhvciB7IC8qIEhlYWRlciA0IC0gYW5kIHRoZSBhdXRob3IgYW5kIGRhdGEgaGVhZGVycyB1c2UgdGhpcyB0b28gICovDQogIGZvbnQtc2l6ZTogMThweDsNCiAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICBjb2xvcjogRGFya1JlZDsNCiAgdGV4dC1hbGlnbjogY2VudGVyOw0KfQ0KDQpoNC5kYXRlIHsgLyogSGVhZGVyIDQgLSBhbmQgdGhlIGF1dGhvciBhbmQgZGF0YSBoZWFkZXJzIHVzZSB0aGlzIHRvbyAgKi8NCiAgZm9udC1zaXplOiAxOHB4Ow0KICBmb250LXdlaWdodDogYm9sZDsNCiAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7DQogIGNvbG9yOiBEYXJrQmx1ZTsNCiAgdGV4dC1hbGlnbjogY2VudGVyOw0KfQ0KDQpoMSB7IC8qIEhlYWRlciAxIC0gYW5kIHRoZSBhdXRob3IgYW5kIGRhdGEgaGVhZGVycyB1c2UgdGhpcyB0b28gICovDQogICAgZm9udC1zaXplOiAyMHB4Ow0KICAgIGZvbnQtd2VpZ2h0OiBib2xkOw0KICAgIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICAgIGNvbG9yOiBkYXJrcmVkOw0KICAgIHRleHQtYWxpZ246IGNlbnRlcjsNCn0NCg0KaDIgeyAvKiBIZWFkZXIgMiAtIGFuZCB0aGUgYXV0aG9yIGFuZCBkYXRhIGhlYWRlcnMgdXNlIHRoaXMgdG9vICAqLw0KICAgIGZvbnQtc2l6ZTogMThweDsNCiAgICBmb250LXdlaWdodDogYm9sZDsNCiAgICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsNCiAgICBjb2xvcjogbmF2eTsNCiAgICB0ZXh0LWFsaWduOiBsZWZ0Ow0KfQ0KDQpoMyB7IC8qIEhlYWRlciAzIC0gYW5kIHRoZSBhdXRob3IgYW5kIGRhdGEgaGVhZGVycyB1c2UgdGhpcyB0b28gICovDQogICAgZm9udC1zaXplOiAxNnB4Ow0KICAgIGZvbnQtd2VpZ2h0OiBib2xkOw0KICAgIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICAgIGNvbG9yOiBuYXZ5Ow0KICAgIHRleHQtYWxpZ246IGxlZnQ7DQp9DQoNCmg0IHsgLyogSGVhZGVyIDQgLSBhbmQgdGhlIGF1dGhvciBhbmQgZGF0YSBoZWFkZXJzIHVzZSB0aGlzIHRvbyAgKi8NCiAgICBmb250LXNpemU6IDE0cHg7DQogIGZvbnQtd2VpZ2h0OiBib2xkOw0KICAgIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICAgIGNvbG9yOiBkYXJrcmVkOw0KICAgIHRleHQtYWxpZ246IGxlZnQ7DQp9DQoNCi8qIEFkZCBkb3RzIGFmdGVyIG51bWJlcmVkIGhlYWRlcnMgKi8NCi5oZWFkZXItc2VjdGlvbi1udW1iZXI6OmFmdGVyIHsNCiAgY29udGVudDogIi4iOw0KfQ0KYGBgDQoNCg0KYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9DQojIGNvZGUgY2h1bmsgc3BlY2lmaWVzIHdoZXRoZXIgdGhlIFIgY29kZSwgd2FybmluZ3MsIGFuZCBvdXRwdXQgDQojIHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIG91dHB1dCBmaWxlcy4NCnNldHdkKCJDOi9Vc2Vycy92b2xtMS9PbmVEcml2ZS9Eb2N1bWVudHMiKQ0KbGlicmFyeShyZWFkeGwpDQpteURhdGEgPC0gcmVhZF9leGNlbCgidHJhaW5fYWNjXzIwMTAgKDEpLnhscyIpDQpteWRhdGEgPC0gbXlEYXRhWywgLTFdDQppZiAoIXJlcXVpcmUoImtuaXRyIikpIHsgICAgICAgICAgICAgICAgICAgICAgIyB1c2UgY29uZGl0aW9uYWwgc3RhdGVtZW50IHRvIGRldGVjdA0KICAgaW5zdGFsbC5wYWNrYWdlcygia25pdHIiKSAgICAgICAgICAgICAgICAgICMgd2hldGhlciBhIHBhY2thZ2Ugd2FzIGluc3RhbGxlZCBpbg0KICAgbGlicmFyeShrbml0cikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgeW91ciBtYWNoaW5lLiBJZiBub3QsIGluc3RhbGwgaXQgYW5kDQp9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBsb2FkIGl0IHRvIHRoZSB3b3JraW5nIGRpcmVjdG9yeS4NCiMNCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSwgICAgICAgICAgICAjIGluY2x1ZGUgY29kZSBjaHVuayBpbiB0aGUgb3V0cHV0IGZpbGUNCiAgICAgICAgICAgICAgICAgICAgICB3YXJuaW5nID0gRkFMU0UsICAgICAgICAjIHNvbWV0aW1lcywgeW91IGNvZGUgbWF5IHByb2R1Y2Ugd2FybmluZyBtZXNzYWdlcywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHlvdSBjYW4gY2hvb3NlIHRvIGluY2x1ZGUgdGhlIHdhcm5pbmcgbWVzc2FnZXMgaW4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHRoZSBvdXRwdXQgZmlsZS4gDQogICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cyA9IFRSVUUsICAgICAgICAgIyB5b3UgY2FuIGFsc28gZGVjaWRlIHdoZXRoZXIgdG8gaW5jbHVkZSB0aGUgb3V0cHV0DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBpbiB0aGUgb3V0cHV0IGZpbGUuDQogICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9IEZBTFNFLCAgICAgICAgIyBzdXBwcmVzcyBtZXNzYWdlcyANCiAgICAgICAgICAgICAgICAgICAgICBjb21tZW50ID0gTkEgICAgICAgICAgICAjIHJlbW92ZSB0aGUgZGVmYXVsdCBsZWFkaW5nIGhhc2ggdGFncyBpbiB0aGUgb3V0cHV0DQogICAgICAgICAgICAgICAgICAgICAgKSAgIA0KYGBgDQoNCg0KIyAxIEludHJvZHVjdGlvbg0KDQpUaGUgZ29hbCBvZiB0aGlzIHN0dWR5IGlzIHRvIGRldGVybWluZSB3aGV0aGVyIHRoZSBudW1iZXIgb2YgQ2FycyBEZXJhaWxlZCBhbmQgdGhlIGFtb3VudCBvZiBUcmFjayBEYW1hZ2UgY2FuIGJlIHVzZWQgdG8gcmVsaWFibHkgcHJlZGljdCBFcXVpcG1lbnQgRGFtYWdlIGluIFUuUy4gcmFpbHJvYWQgYWNjaWRlbnRzLiBTcGVjaWZpY2FsbHksIEkgd2FudCB0byBhbnN3ZXIgdGhlIHJlc2VhcmNoIHF1ZXN0aW9uOg0KDQpDYW4gdGhlIG51bWJlciBvZiBDYXJzIERlcmFpbGVkIGFuZCB0aGUgYW1vdW50IG9mIFRyYWNrIERhbWFnZSBiZSB1c2VkIHRvIHJlbGlhYmx5IHByZWRpY3QgRXF1aXBtZW50IERhbWFnZSBpbiB0cmFpbiBhY2NpZGVudHM/DQoNClRvIGludmVzdGlnYXRlIHRoaXMsIEkgdXNlIGFjY2lkZW50IGRhdGEgY29sbGVjdGVkIGluIDIwMTAgZnJvbSB0aGUgRmVkZXJhbCBSYWlscm9hZCBBZG1pbmlzdHJhdGlvbiAoc2FmZXR5ZGF0YS5mcmEuZG90LmdvdikuIFRoZSBkYXRhc2V0IGluY2x1ZGVzIGluZm9ybWF0aW9uIHN1Y2ggYXMgYWNjaWRlbnQgY2F1c2UsIHNwZWVkLCBpbmp1cmllcywgZmF0YWxpdGllcywgdHJhY2sgdHlwZSwgYW5kIHNldmVyYWwgbWVhc3VyZXMgb2YgZGFtYWdlLiBGcm9tIHRoZXNlIHZhcmlhYmxlcywgSSBmb2N1cyBvbiBDYXJzIERlcmFpbGVkIGFuZCBUcmFjayBEYW1hZ2UgYmVjYXVzZSBleHBsb3JhdG9yeSBhbmFseXNpcyBzaG93cyB0aGV5IGhhdmUgdGhlIHN0cm9uZ2VzdCBjb3JyZWxhdGlvbiB3aXRoIEVxdWlwbWVudCBEYW1hZ2UuIEkgYWxzbyBjcmVhdGUgYW4gaW50ZXJhY3Rpb24gdGVybSAoQ2FycyBEZXJhaWxlZCDDlyBUcmFjayBEYW1hZ2UpIHRvIHRlc3Qgd2hldGhlciB0aGUgZWZmZWN0IG9mIGRlcmFpbG1lbnRzIGRlcGVuZHMgb24gdHJhY2sgY29uZGl0aW9ucy4NCg0KVGhlIGFwcHJvYWNoIHdpbGwgaW5jbHVkZSBleHBsb3JhdG9yeSBhbmFseXNpcyBvZiB0aGUgZGF0YSBzZXQsIGNvbnN0cnVjdGlvbiBvZiBzZXZlcmFsIGNhbmRpZGF0ZSByZWdyZXNzaW9uIG1vZGVscyAobWFpbiBlZmZlY3RzLCBpbnRlcmFjdGlvbiBtb2RlbCwgYW5kIHRyYW5zZm9ybWVkIG1vZGVsKSwgcmVzaWR1YWwgZGlhZ25vc3RpY3MsIGFuZCBub25wYXJhbWV0cmljIHRlY2huaXF1ZXMgc3VjaCBhcyBib290c3RyYXAgY29uZmlkZW5jZSBpbnRlcnZhbHMuIEJ5IGNvbXBhcmluZyB0aGVzZSBtb2RlbHMsIEkgd2lsbCBpZGVudGlmeSB3aGljaCBwcmVkaWN0b3JzIG1lYW5pbmdmdWxseSBleHBsYWluIHZhcmlhdGlvbiBpbiBFcXVpcG1lbnQgRGFtYWdlIGFuZCBldmFsdWF0ZSB0aGUgc3RhYmlsaXR5IG9mIHRoZSByZXN1bHRzLg0KDQojIDIgRGVzY3JpcHRpb24gb2YgRGF0YSBTZXQNCg0KICBUaGUgZGF0YSBzZXQgSSBjaG9zZSB3YXMgUmFpbHJvYWQgQWNjaWRlbnRzIGluIHRoZSBVLlMuIGluIDIwMTAuIFRoZSBkYXRhIHdhcyBjb2xsZWN0ZWQgdmlhIHNhZmV0eWRhdGEuZnJhLmRvdC5nb3YuIEluIGxhc3Qgd2VlaydzIHByb2plY3QsIEkgdXNlZCB0aGlzIGRhdGEgc2V0IHRvIGRldGVybWluZSBpZiB0aGUgbnVtYmVyIG9mIENhcnMgRGVyYWlsZWQgcG9zaXRpdmVseSBjb3JyZWxhdGVkIHdpdGggRXF1aXBtZW50IERhbWFnZSAoaW4gZG9sbGFycykuIFRoaXMgd2VlaywgSSB3YW50IHRvIGFkZCBUcmFjayBEYW1hZ2UgKGluIGRvbGxhcnMpIHRvIG15IG1vZGVsIGJlY2F1c2UgaXQgaGFkIHRoZSBzZWNvbmQgc3Ryb25nZXN0IGNvcnJlbGF0aW9uIGNvZWZmaWNpZW50IHIgZnJvbSBsYXN0IHdlZWsncyBjb3JyZWxhdGlvbiBtYXRyaXguIEknbSBnb2luZyB0byBzZWUgaG93IGFjY3VyYXRlbHkgQ2FycyBEZXJhaWxlZCBhbmQgVHJhY2sgRGFtYWdlIGNhbiBwcmVkaWN0IEVxdWlwbWVudCBEYW1hZ2UuDQogIA0KIyMgMi4xIFZhcmlhYmxlcw0KDQogICogUmFpbHJvYWQgKGNhdGVnb3JpY2FsKSAtIG5hbWUgb2YgcmFpbHJvYWQNCiAgKiBNb250aCAoY2F0ZWdvcmljYWwpDQogICogRGF5IChjYXRlZ29yaWNhbCkgLSBkYXlzIG9mIHRoZSB3ZWVrIGxhYmVsZWQgMSB0aHJvdWdoIDcNCiAgKiBTdGF0ZSAoY2F0ZWdvcmljYWwpDQogICogQ291bnR5IChjYXRlZ29yaWNhbCkNCiAgKiBUcmFjayBUeXBlIChjYXRlZ29yaWNhbCkNCiAgKiBUcmFjayBNYW5hZ2VtZW50IChjYXRlZ29yaWNhbCkNCiAgKiBBY2NpZGVudCBUeXBlIChjYXRlZ29yaWNhbCkNCiAgKiBBY2NpZGVudCBDYXVzZSAoY2F0ZWdvcmljYWwpDQogICogRXF1aXBtZW50IERhbWFnZSAobnVtZXJpY2FsKSAtIGFtb3VudCBvZiBtb25leSBzcGVudCBvbiBkYW1hZ2VzDQogICogVHJhY2sgRGFtYWdlIChudW1lcmljYWwpIC0gYW1vdW50IG9mIG1vbmV5IHNwZW50IG9uIHRyYWNrIHJlcGFpcg0KICAqIEtpbGxlZCAobnVtZXJpY2FsKSAtIG51bWJlciBvZiBwZW9wbGUga2lsbGVkIGZyb20gYWNjaWRlbnQNCiAgKiBJbmp1cmVkIChudW1lcmljYWwpIC0gbnVtYmVyIG9mIHBlb3BsZSBpbmp1cmVkIGZyb20gYWNjaWRlbnQNCiAgKiBSUkVxdWlwIChjYXRlZ29yaWNhbCkgLSB0eXBlIG9mIHRyYWluDQogICogU3BlZWQgKG51bWVyaWNhbCkgLSBtcGggdGhlIHRyYWluIHdhcyBnb2luZyBhdCBkdXJpbmcgaW1wYWN0DQogICogTG9jb21vdGl2ZXMgRGVyYWlsZWQgKG51bWVyaWNhbCkgLSB0aGUgbnVtYmVyIG9mIGxvY29tb3RpdmVzIGRlcmFpbGVkDQogICogQ2FycyBEZXJhaWxlZCAobnVtZXJpY2FsKSAtIHRoZSBudW1iZXIgb2YgQ2FycyBEZXJhaWxlZA0KDQojIDMgTWV0aG9kb2xvZ3kgYW5kIEFuYWx5c2lzDQoNCiAgSSBhbSBnb2luZyB0byBjcmVhdGUgdHdvIG11bHRpcGxlIGxpbmVhciByZWdyZXNzaW9uIG1vZGVsczogb25lIHdpdGggQ2FycyBEZXJhaWxlZCBhbmQgVHJhY2sgRGFtYWdlIGJlaW5nIGFkZGVkIHRvZ2V0aGVyLCBhbmQgb25lIHdpdGggdGhlIHR3byB2YXJpYWJsZXMgYmVpbmcgbXVsdGlwbGllZCAoaW50ZXJhY3RlZCkgdG9nZXRoZXIuIFRoZXJlIGlzIGEgcG9zc2liaWxpdHkgdGhhdCBhIHNpbmdsZSBkZXJhaWxlZCBjYXIgY2F1c2VzIG1vcmUgZGFtYWdlIGlmIHRoZSB0cmFjayBpcyBhbHJlYWR5IGJhZGx5IGRhbWFnZWQuIElmIHRoYXQncyB0aGUgY2FzZSwgdGhlbiB0aGUgaW50ZXJhY3Rpb24gbW9kZWwgd291bGQgYmUgbW9yZSBhcHByb3ByaWF0ZSB0byB1c2UuIFdlIHdpbGwgYmUgZHJvcHBpbmcgYWxsIG9mIHRoZSBvdGhlciB2YXJpYWJsZXMgbWVudGlvbmVkIGluICMyLiANCiAgDQojIDQgTW9kZWwgMTogTWFpbiBFZmZlY3RzIE1vZGVsDQoNCiAgV2UgYXJlIGdvaW5nIHRvIHN0YXJ0IHdpdGggdGhlIE1MUiBtb2RlbCB3aXRob3V0IHRoZSBpbnRlcmFjdGlvbiB0ZXJtLiANCiAgDQojIyA0LjEgSW5mZXJlbnRpYWwgU3RhdGlzdGljcw0KDQpgYGB7cn0NCiMgTXVsdGlwbGUgTGluZWFyIFJlZ3Jlc3Npb24NCm1vZGVsMSA8LSBsbShFcXBEYW1nIH4gQ2Fyc0RlciArIFRya0RhbWcsIGRhdGEgPSBteURhdGEpDQoNCiMgU3VtbWFyeSBvZiB0aGUgbW9kZWwNCnN1bW1hcnkobW9kZWwxKQ0KYGBgDQoNCkxvb2tpbmcgYXQgdGhlIGluZmVyZW50aWFsIHN0YXRpc3RpY3MsIENhcnMgRGVyYWlsZWQgYW5kIFRyYWNrIERhbWFnZSBhcmUgYm90aCBoaWdobHkgc2lnbmlmaWNhbnQuIFRoZSBpbnRlcmNlcHQgaXMgbm90IHN0YXRpc3RpY2FsbHkgc2lnbmlmaWNhbnQuIEZvciBlYWNoIGFkZGl0aW9uYWwgY2FyIGRlcmFpbGVkICgyNSwzODAsIHAgPCAyZS0xNiksIEVxdWlwbWVudCBEYW1hZ2UgaW5jcmVhc2VzIGJ5IGFib3V0IFwkMjUsMzgwLCBob2xkaW5nIFRyYWNrIERhbWFnZSBjb25zdGFudC4gRm9yIGVhY2ggYWRkaXRpb25hbCBkb2xsYXIgc3BlbnQgb24gVHJhY2sgRGFtYWdlICgwLjU0LCBwIDwgMmUtMTYpLCBFcXVpcG1lbnQgRGFtYWdlIGluY3JlYXNlcyBieSBhYm91dCBcJDAuNTQsIGhvbGRpbmcgQ2FycyBEZXJhaWxlZCBjb25zdGFudC4gVGhpcyBtb2RlbCBleHBsYWlucyA0Ny4yOSUgb2YgdGhlIHZhcmlhdGlvbiBpbiBFcXVpcG1lbnQgRGFtYWdlLiBUaGUgbW9kZWwgaXMgaGlnaGx5IHNpZ25pZmljYW50IChGID0gMTE3NiwgcCA9IDApDQoNCiMjIDQuMiBSZXNpZHVhbCBBbmFseXNpcw0KDQpgYGB7ciwgZmlnLndpZHRoPTgsIGZpZy5oZWlnaHQ9Nn0NCiMgRml0IG1vZGVsIHdpdGhvdXQgaW50ZXJhY3Rpb24NCm1vZGVsMSA8LSBsbShFcXBEYW1nIH4gQ2Fyc0RlciArIFRya0RhbWcsIGRhdGEgPSBteURhdGEpDQojIFBsb3QgcmVzaWR1YWxzIHZzIGZpdHRlZCB0byBjaGVjayBhc3N1bXB0aW9ucw0KcGFyKG1mcm93ID0gYygyLDIpKQ0KcGxvdChtb2RlbDEpDQpwYXIobWZyb3cgPSBjKDEsMSkpDQpgYGAgDQogIA0KVGhlIFJlc2lkdWFscyB2cyBGaXR0ZWQgcGxvdCBzaG93cyB0aGVyZSBpcyBubyBjb25zdGFudCB2YXJpYW5jZSBpbiB0aGUgcmVzaWR1YWxzLiBUaGUgUS1RIFJlc2lkdWFscyBzaG93cyBtdWx0aXBsZSBvdXRsaWVycyBhbmQgdHdvIHN0cm9uZyB0YWlscywgaW5kaWNhdGluZyBub24tbm9ybWFsaXR5LiBUaGUgU2NhbGUgTG9jYXRpb24gcGxvdCBzaG93cyBhIGxhY2sgb2YgY29uc3RhbnQgdmFyaWFuY2UgYW5kIHRoZSBSZXNpZHVhbHMgdnMgTGV2ZXJhZ2UgcGxvdCBzaG93cyBhbiBvdXRsaWVyIGF0IDM5MC4gVGhlIGFzc3VtcHRpb25zIGZvciBub3JtYWxpdHkgYXJlIG5vdCBtZXQuIA0KDQojIDUgTW9kZWwgMjogSW50ZXJhY3Rpb24gVGVybSANCg0KICBOb3csIEkgYW0gZ29pbmcgdG8gaW5jb3Jwb3JhdGUgdGhlIGludGVyYWN0aW9uIHRlcm0sIENhcnNEZXI6VHJrRGFtZywgZXhjbHVkZSB0aGUgbWFpbiBlZmZlY3RzLCBhbmQgc2VlIGlmIHRoZSBSLXNxdWFyZWQgdmFsdWUgaW5jcmVhc2VkIGFuZCBpZiB0aGUgaW50ZXJhY3Rpb24gdGVybSBpcyBzdGF0aXN0aWNhbGx5IHNpZ25pZmljYW50LiBJJ2xsIGFsc28gYmUgbG9va2luZyB0byBzZWUgaWYgdGhlIG1vZGVsIGFzIGEgd2hvbGUgaXMgc2lnbmlmaWNhbnQuIElmIGl0J3Mgbm90LCB0aGVuIEknbGwgYmUgcmVtb3ZpbmcgdGhlIHRlcm0gYW5kIGdvIGZvcndhcmQgd2l0aCB0aGUgTUxSIG1vZGVsLiANCg0KIyA1LjEgSW5mZXJlbnRpYWwgU3RhdGlzdGljcw0KDQpgYGB7cn0NCiMgTXVsdGlwbGUgTGluZWFyIFJlZ3Jlc3Npb24gd2l0aCBJbnRlcmFjdGlvbg0KbW9kZWwyIDwtIGxtKEVxcERhbWcgfiBDYXJzRGVyOlRya0RhbWcsIGRhdGEgPSBteURhdGEpDQoNCiMgU3VtbWFyeSBvZiB0aGUgbW9kZWwNCnN1bW1hcnkobW9kZWwyKQ0KYGBgDQoNCkZvciBlYWNoIGFkZGl0aW9uYWwgdW5pdCBpbmNyZWFzZSBpbiBDYXJzRGVyOlRya0RhbWcsIEVxdWlwbWVudCBEYW1hZ2UgaW5jcmVhc2VzIGJ5ICQwLjA3LiBUaGUgaW50ZXJhY3Rpb24gdGVybSBpcyBoaWdobHkgc2lnbmlmaWNhbnQgKEYgPSAyMTU1LCBwID0gMCkuIFRoaXMgbW9kZWwgZXhwbGFpbnMgNDUuMTIlIG9mIHRoZSB2YXJpYXRpb24gaW4gRXF1aXBtZW50IERhbWFnZS4gDQoNCiMjIDUuMiBSZXNpZHVhbCBBbmFseXNpcw0KDQpgYGB7cn0NCiMgRml0IHRoZSBpbnRlcmFjdGlvbiBtb2RlbA0KbW9kZWwyIDwtIGxtKEVxcERhbWcgfiBDYXJzRGVyOlRya0RhbWcsIGRhdGEgPSBteURhdGEpDQoNCiMgUmVzaWR1YWwgZGlhZ25vc3RpY3MNCnBhcihtZnJvdyA9IGMoMiwyKSkgICMgc2hvdyA0IHBsb3RzIHRvZ2V0aGVyDQpwbG90KG1vZGVsMikNCnBhcihtZnJvdyA9IGMoMSwxKSkgICMgcmVzZXQgbGF5b3V0DQpgYGANCg0KVGhlIFJlc2lkdWFscyB2cyBGaXR0ZWQgcGxvdCBzaG93cyB0aGVyZSBpcyBubyBjb25zdGFudCB2YXJpYW5jZSBpbiB0aGUgcmVzaWR1YWxzLiBUaGUgUS1RIFJlc2lkdWFscyBzaG93cyBtdWx0aXBsZSBvdXRsaWVycyBhbmQgb25lIHN0cm9uZyB0YWlsLCBzaG93aW5nIG5vbi1ub3JtYWxpdHkuIFRoZSBTY2FsZSBMb2NhdGlvbiBwbG90IHNob3dzIGEgbGFjayBvZiBjb25zdGFudCB2YXJpYW5jZSBhbmQgdGhlIFJlc2lkdWFscyB2cyBMZXZlcmFnZSBwbG90IHNob3dzIGFuIG91dGxpZXIgYXQgMTQxNC4gQWxsIGluIGFsbCwgdGhlIGFzc3VtcHRpb25zIGZvciBub3JtYWxpdHkgYXJlIG5vdCBtZXQuDQoNCiMgNiBNb2RlbCAzOiBJbnRlcmFjdGlvbiBUZXJtIHdpdGggTWFpbiBFZmZlY3RzDQoNCkZpbmFsbHksIEkgd2lsbCBiZSB1c2luZyBib3RoIG1haW4gZWZmZWN0cyBhbmQgdGhlaXIgaW50ZXJhY3Rpb24gdGVybSB0byBjcmVhdGUgTW9kZWwgMy4NCg0KIyMgNi4xIEluZmVyZW50aWFsIFN0YXRpc3RpY3MNCg0KYGBge3J9DQojIE1vZGVsIDM6IENhcnNEZXIgKyBUcmtEYW1nICsgQ2Fyc0RlcjpUcmtEYW1nDQptb2RlbDMgPC0gbG0oRXFwRGFtZyB+IENhcnNEZXIgKyBUcmtEYW1nICsgQ2Fyc0RlcjpUcmtEYW1nLCBkYXRhID0gbXlEYXRhKQ0KDQojIFN1bW1hcnkgb2YgdGhlIG1vZGVsDQpzdW1tYXJ5KG1vZGVsMykNCmBgYA0KDQpDYXJzIERlcmFpbGVkICgxNywzNTAsIHAgPCAyZS0xNiksIFRyYWNrIERhbWFnZSAoMC4wNzMsIHAgPSAwLjA5NSksIGFuZCB0aGVpciBpbnRlcmFjdGlvbiB0ZXJtIChwID0gMCkgYXJlIGFsbCBzdGF0aXN0aWNhbGx5IHNpZ25pZmljYW50LiBTaW5jZSB0aGUgaW50ZXJhY3Rpb24gdGVybSBpcyBzaWduaWZpY2FudCwgdGhpcyBtZWFucyB0aGF0IHRoZSB2YXJpYWJsZXMgZGVwZW5kIG9uIGVhY2ggb3RoZXIuIFRoZSBlZmZlY3Qgb2YgQ2FycyBEZXJhaWxlZCBvbiBFcXVpcG1lbnQgRGFtYWdlIGdyb3dzIGFzIFRyYWNrIERhbWFnZSBncm93cy4gV2hlbiBib3RoIENhcnMgRGVyYWlsZWQgYW5kIFRyYWNrIERhbWFnZSBhcmUgemVybywgdGhlIGV4cGVjdGVkIEVxdWlwbWVudCBEYW1hZ2UgaXMgXCQzNDAwLiBUaGUgaW50ZXJjZXB0IGlzIG5vdCBzdGF0aXN0aWNhbGx5IHNpZ25pZmljYW50LiBGb3IgZWFjaCBhZGRpdGlvbmFsIGNhciBkZXJhaWxlZCwgRXF1aXBtZW50IERhbWFnZSBpbmNyZWFzZXMgYnkgYWJvdXQgXCQxNywzNTAgb24gYXZlcmFnZSwgaG9sZGluZyBUcmFjayBEYW1hZ2UgY29uc3RhbnQgYXQgemVyby4gRWFjaCBhZGRpdGlvbmFsIGRvbGxhciBvZiBUcmFjayBEYW1hZ2UgaXMgYXNzb2NpYXRlZCB3aXRoIGFib3V0IFwkMC4wNyBvZiBhZGRpdGlvbmFsIEVxdWlwbWVudCBEYW1hZ2UuIFRoaXMgbW9kZWwgZXhwbGFpbnMgNTMuMzklIG9mIHRoZSB2YXJpYXRpb24gaW4gRXF1aXBtZW50IERhbWFnZS4gVGhlIG1vZGVsIGlzIGhpZ2hseSBzaWduaWZpY2FudCAoRiA9IDk5Ny4zLCBwID0gMCkuDQoNCiMjIDYuMiBSZXNpZHVhbCBBbmFseXNpcw0KDQpgYGB7cn0NCiMgUmVzaWR1YWwgZGlhZ25vc3RpYyBwbG90cw0KcGFyKG1mcm93ID0gYygyLDIpKQ0KcGxvdChtb2RlbDMpDQpwYXIobWZyb3cgPSBjKDEsMSkpICAjIHJlc2V0DQpgYGANCg0KVGhlIGFzc3VtcHRpb25zIG9mIG5vcm1hbGl0eSBhcmUgbm90IG1ldC4gVGhlcmUgaXMgbm8gY29uc3RhbnQgdmFyaWFuY2UgaW4gdGhlIFJlc2lkdWFscyB2cyBGaXR0ZWQgcGxvdCwgdGhlcmUgaXMgYSBzdHJvbmcgcmlnaHQgdGFpbCBpbiB0aGUgUS1RIFJlc2lkdWFscyBwbG90LCB0aGUgU2NhbGUgTG9jYXRpb24gcGxvdCBkb2VzIG5vdCBzaG93IGNvbnN0YW50IHZhcmlhbmNlLCBhbmQgdGhlcmUgaXMgb25lIG91dGxpZXIsIDE0MTQsIGluIHRoZSBSZXNpZHVhbHMgdnMgTGV2ZXJhZ2UgcGxvdC4gDQoNCiMgNyBBTk9WQQ0KDQpgYGB7cn0NCmFub3ZhKG1vZGVsMSwgbW9kZWwyLCBtb2RlbDMpDQpgYGANCg0KVGhlIEFOT1ZBIHRhYmxlIHNob3dzIHRoYXQgYWRkaW5nIHRoZSBpbnRlcmFjdGlvbiB0ZXJtIHRvIHRoZSBtYWluIGVmZmVjdHMgc2lnbmlmaWNhbnRseSBpbXByb3ZlcyB0aGUgbW9kZWwuIEFzIGEgcmVzdWx0LCBNb2RlbCAzIGlzIHRoZSBiZXN0IG1vZGVsIGJlY2F1c2UgaXQgcmVkdWNlcyByZXNpZHVhbCB2YXJpYXRpb24gdGhlIG1vc3QuIE1vZGVsIDIgaXMgdGhlIHdvcnN0IG9mIHRoZSB0aHJlZSBtb2RlbHMgYmVjYXVzZSBpdCBkb2Vzbid0IHRha2UgaW50byBhY2NvdW50IHRoZSBpbmZsdWVuY2UgdGhhdCB0aGUgaW5kZXBlbmRlbnQgbWFpbiBlZmZlY3RzIGhhdmUgb24gdGhlIG1vZGVsLiBNb2RlbCAyIGFsc28gaGFzIHRoZSBoaWdoZXN0IHJlc2lkdWFsIHN1bSBvZiBzcXVhcmVzLCBtZWFuaW5nIHRoZXJlIGlzIG1vcmUgdW5leHBsYWluZWQgdmFyaWF0aW9uIGluIHRoaXMgbW9kZWwgY29tcGFyZWQgdG8gdGhlIG90aGVyIHR3by4NCg0KIyA4IE5vbnBhcmFtZXRyaWMgVGVzdHMNCg0KV2UgYXJlIGdvaW5nIHRvIG1vdmUgZm9yd2FyZCB3aXRoIE1vZGVsIDMgYmVjYXVzZSB3ZSBlc3RhYmxpc2hlZCBpdCBhcyB0aGUgYmVzdCBvZiB0aGUgdGhyZWUuIEkgd2lsbCBiZSBjb25kdWN0aW5nIGEgQm94LUNveCB0cmFuc2Zvcm1hdGlvbiBhbmQgQm9vdHN0cmFwIGNvbmZpZGVuY2UgaW50ZXJ2YWxzIGJlY2F1c2UgdGhlIGFzc3VtcHRpb25zIGZvciBub3JtYWxpdHkgd2VyZSBub3QgbWV0Lg0KDQojIyA4LjEgQm94LUNveCBUcmFuc2Zvcm1hdGlvbg0KDQpgYGB7cn0NCg0KbGlicmFyeShNQVNTKQ0KDQojIFNoaWZ0IHRoZSByZXNwb25zZSB0byBtYWtlIGFsbCB2YWx1ZXMgcG9zaXRpdmUNCm15RGF0YSRFcXBEYW1nX3BvcyA8LSBteURhdGEkRXFwRGFtZyArIGFicyhtaW4obXlEYXRhJEVxcERhbWcpKSArIDENCg0KIyBGaXQgTW9kZWwgMzogQ2Fyc0RlciArIFRya0RhbWcgKyBpbnRlcmFjdGlvbg0KbW9kZWwzX3BvcyA8LSBsbShFcXBEYW1nX3BvcyB+IENhcnNEZXIgKyBUcmtEYW1nICsgQ2Fyc0RlcjpUcmtEYW1nLCBkYXRhID0gbXlEYXRhKQ0KDQojIEJveC1Db3ggdHJhbnNmb3JtYXRpb24NCmJjIDwtIGJveGNveChtb2RlbDNfcG9zLA0KICAgICAgICAgICAgIGxhbWJkYSA9IHNlcSgtMiwgMiwgMC4xKSwNCiAgICAgICAgICAgICBsYW1iZGEubGFiID0gIkxhbWJkYSIsDQogICAgICAgICAgICAgeWxhYiA9ICJMb2ctTGlrZWxpaG9vZCIsDQogICAgICAgICAgICAgbWFpbiA9ICJCb3gtQ294IFRyYW5zZm9ybWF0aW9uIGZvciBNb2RlbCAzIikNCg0KIyBJZGVudGlmeSBsYW1iZGEgdGhhdCBtYXhpbWl6ZXMgbG9nLWxpa2VsaWhvb2QNCmxhbWJkYV9vcHQgPC0gYmMkeFt3aGljaC5tYXgoYmMkeSldDQpsYW1iZGFfb3B0DQpgYGANCg0KSSBjb25kdWN0ZWQgYSBCb3gtQ294IHRyYW5zZm9ybWF0aW9uIHRvIGFzc2VzcyB3aGV0aGVyIHRyYW5zZm9ybWluZyBFcXVpcG1lbnQgRGFtYWdlIHdvdWxkIGltcHJvdmUgdGhlIG1vZGVsIGFzc3VtcHRpb25zLiBTaW5jZSDOuyA9IDEgaXMgd2l0aGluIHRoZSBjb25maWRlbmNlIGludGVydmFsLCBubyB0cmFuc2Zvcm1hdGlvbiBpcyBuZWVkZWQuDQoNCiMjIDguMiBCb290c3RyYXAgQ29uZmlkZW5jZSBJbnRlcnZhbHMNCg0KYGBge3IgYm9vdHN0cmFwIHNldHVwfQ0KbGlicmFyeShib290KQ0KDQojIERlZmluZSBmdW5jdGlvbiB0byBleHRyYWN0IGNvZWZmaWNpZW50cw0KYm9vdF9jb2VmIDwtIGZ1bmN0aW9uKGRhdGEsIGluZGljZXMpIHsNCiAgZCA8LSBkYXRhW2luZGljZXMsIF0gICMgcmVzYW1wbGUgcm93cw0KICBmaXQgPC0gbG0oRXFwRGFtZyB+IENhcnNEZXIgKyBUcmtEYW1nICsgQ2Fyc0RlcjpUcmtEYW1nLCBkYXRhID0gZCkNCiAgcmV0dXJuKGNvZWYoZml0KSkNCn0NCg0KIyBSdW4gYm9vdHN0cmFwDQpzZXQuc2VlZCgxMjMpICAjIGZvciByZXByb2R1Y2liaWxpdHkNCmJvb3RfcmVzdWx0cyA8LSBib290KGRhdGEgPSBteURhdGEsIHN0YXRpc3RpYyA9IGJvb3RfY29lZiwgUiA9IDEwMDApICAjIDEwMDAgcmVzYW1wbGVzDQoNCiMgQ3JlYXRlIGEgdGlkeSB0YWJsZSBvZiA5NSUgcGVyY2VudGlsZSBDSXMgZm9yIGFsbCBjb2VmZmljaWVudHMNCmNvZWZfbmFtZXMgPC0gbmFtZXMoY29lZihtb2RlbDMpKQ0KY2lfbGlzdCA8LSBsYXBwbHkoMTpsZW5ndGgoY29lZl9uYW1lcyksIGZ1bmN0aW9uKGkpIHsNCiAgY2kgPC0gYm9vdC5jaShib290X3Jlc3VsdHMsIHR5cGUgPSAicGVyYyIsIGluZGV4ID0gaSkkcGVyY2VudFs0OjVdDQogIGRhdGEuZnJhbWUoQ29lZmZpY2llbnQgPSBjb2VmX25hbWVzW2ldLA0KICAgICAgICAgICAgIExvd2VyOTUgPSBjaVsxXSwNCiAgICAgICAgICAgICBVcHBlcjk1ID0gY2lbMl0pDQp9KQ0KDQpjaV90YWJsZSA8LSBkby5jYWxsKHJiaW5kLCBjaV9saXN0KQ0KcHJpbnQoY2lfdGFibGUpDQpgYGANCg0KVGhlIENhcnMgRGVyYWlsZWQgaW50ZXJ2YWwgaXMgZW50aXJlbHkgcG9zaXRpdmUuIFRoaXMgaW5kaWNhdGVzIHN0cm9uZyBldmlkZW5jZSBvZiBhIHBvc2l0aXZlIGVmZmVjdC4gV2UgYXJlIDk1JSBjb25maWRlbnQgdGhhdCB0aGUgc2xvcGUgb2YgQ2FycyBEZXJhaWxlZCBpcyBiZXR3ZWVuIDEyLDgwMCBhbmQgMjEsNzAwLiBUaGUgaW50ZXJ2YWwgZm9yIFRyYWNrIERhbWFnZSBpbmNsdWRlcyAwLCB3aGljaCBtZWFucyB0aGUgZWZmZWN0IGFsb25lIG1heSBub3QgaGF2ZSBhIGNvbnNpc3RlbnQgZWZmZWN0IG9uIEVxdWlwbWVudCBEYW1hZ2UuIFdlIGFyZSA5NSUgY29uZmlkZW50IHRoYXQgdGhlIHNsb3BlIG9mIFRyYWNrIERhbWFnZSBpcyBiZXR3ZWVuIC0wLjEyNCBhbmQgMC4zMjIuIFRoZSBpbnRlcnZhbCBmb3IgdGhlIGludGVyYWN0aW9uIHRlcm0gaXMgZW50aXJlbHkgcG9zaXRpdmUsIG1lYW5pbmcgdGhlIGludGVyYWN0aW9uIGlzIG1lYW5pbmdmdWwuIFdlIGFyZSA5NSUgY29uZmlkZW50IHRoYXQgdGhlIHNsb3BlIG9mIHRoZSBpbnRlcmFjdGlvbiB0ZXJtIGlzIGJldHdlZW4gMC4wMyBhbmQgMC4wNi4NCg0KIyA5IENvbmNsdXNpb24NCg0KVGhlIG1haW4gZmluZGluZyBvZiB0aGlzIGFuYWx5c2lzIGlzIHRoYXQgRXF1aXBtZW50IERhbWFnZSBpbiByYWlscm9hZCBhY2NpZGVudHMgaXMgb3ZlcndoZWxtaW5nbHkgZXhwbGFpbmVkIGJ5IHRoZSBudW1iZXIgb2YgQ2FycyBEZXJhaWxlZC4gQm90aCBjbGFzc2ljYWwgcmVncmVzc2lvbiBhbmQgYm9vdHN0cmFwIG1ldGhvZHMgY29uc2lzdGVudGx5IHNob3dlZCB0aGF0IENhcnMgRGVyYWlsZWQgaXMgYSBzdHJvbmcgYW5kIGhpZ2hseSBzaWduaWZpY2FudCBwcmVkaWN0b3IsIHdpdGggbmFycm93IGNvbmZpZGVuY2UgaW50ZXJ2YWxzIHRoYXQgZXhjbHVkZSB6ZXJvLiBJbiBjb250cmFzdCwgVHJhY2sgRGFtYWdlIGFsb25lIGFuZCBpdHMgaW50ZXJhY3Rpb24gd2l0aCBDYXJzIERlcmFpbGVkIHdlcmUgbm90IHJlbGlhYmxlIHByZWRpY3RvcnMgb25jZSBDYXJzIERlcmFpbGVkIHdhcyBpbmNsdWRlZCwgYXMgYm90aCByZXNpZHVhbCBhbmQgYm9vdHN0cmFwIGludGVydmFscyBjb2xsYXBzZWQgdG8gemVyby4gVGhpcyBpbmRpY2F0ZXMgdGhhdCBkZXJhaWxtZW50cyB0aGVtc2VsdmVzLCByYXRoZXIgdGhhbiB0cmFjayByZXBhaXIgY29zdHMsIGFyZSB0aGUgcHJpbWFyeSBkcml2ZXJzIG9mIGVxdWlwbWVudCBkYW1hZ2UuDQoNCkEgZmV3IGRyYXdiYWNrcyBsaW1pdCB0aGlzIHN0dWR5LiBGaXJzdCwgdGhlIGRhdGEgc2V0IGNvbWVzIGZyb20gMjAxMCwgc28gdGhlIHJlc3VsdHMgbWF5IG5vdCBmdWxseSBnZW5lcmFsaXplIHRvIHRvZGF54oCZcyBhY2NpZGVudHMgZ2l2ZW4gdGVjaG5vbG9naWNhbCBhbmQgc2FmZXR5IGltcHJvdmVtZW50cyBzaW5jZSB0aGVuLiBTZWNvbmQsIHRoZSByZXNpZHVhbCBhbmFseXNpcyBzaG93ZWQgY2xlYXIgaGV0ZXJvc2NlZGFzdGljaXR5IGFuZCBvdXRsaWVycywgd2hpY2ggd2UgYXR0ZW1wdGVkIHRvIGFkZHJlc3Mgd2l0aCBhIEJveC1Db3ggdHJhbnNmb3JtYXRpb24sIGJ1dCB0aGF0IGNhbWUgYXQgdGhlIGNvc3Qgb2YgYSBsb3dlciBSwrIuIFRoaXJkLCB0aGUgbW9kZWwgd2FzIGxpbWl0ZWQgdG8gdmFyaWFibGVzIGF2YWlsYWJsZSBpbiB0aGUgZGF0YXNldCBhbmQgZGlkIG5vdCBpbmNsdWRlIG90aGVyIHBvdGVudGlhbGx5IGltcG9ydGFudCBwcmVkaWN0b3JzIHN1Y2ggYXMgdHJhaW4gc3BlZWQsIHdlYXRoZXIgY29uZGl0aW9ucywgb3IgdHJhaW4gbG9hZC4NCg0KVGhlcmUgYXJlIHNldmVyYWwgZnV0dXJlIGltcHJvdmVtZW50cyB3b3J0aCBjb25zaWRlcmluZy4gQ29sbGVjdGluZyBtb3JlIHJlY2VudCBhY2NpZGVudCBkYXRhIHdvdWxkIG1ha2UgdGhlIG1vZGVsIG1vcmUgcmVsZXZhbnQgdG8gY3VycmVudCBjb25kaXRpb25zLiBBZGRpbmcgYWRkaXRpb25hbCBwcmVkaWN0b3JzIHN1Y2ggYXMgd2VhdGhlciwgbWFpbnRlbmFuY2UgcHJhY3RpY2VzLCBvciBjYXJnbyB3ZWlnaHQgbWF5IGltcHJvdmUgZXhwbGFuYXRvcnkgcG93ZXIuIEV4cGxvcmluZyBub25saW5lYXIgbW9kZWxzIG9yIHJvYnVzdCByZWdyZXNzaW9uIGNvdWxkIGFsc28gaGVscCBhZGRyZXNzIGhldGVyb3NjZWRhc3RpY2l0eSBhbmQgb3V0bGllcnMgbW9yZSBlZmZlY3RpdmVseS4NCg0KSW4gdGVybXMgb2YgYXBwbGljYXRpb25zLCB0aGlzIG1vZGVsIHByb3ZpZGVzIGNsZWFyIGd1aWRhbmNlIGZvciByYWlsIHNhZmV0eSBhbmFseXN0cyBhbmQgcG9saWN5bWFrZXJzLiBTaW5jZSB0aGUgbnVtYmVyIG9mIENhcnMgRGVyYWlsZWQgaXMgdGhlIG1vc3QgY29uc2lzdGVudCBwcmVkaWN0b3Igb2YgY29zdGx5IGVxdWlwbWVudCBkYW1hZ2UsIG1pdGlnYXRpb24gc3RyYXRlZ2llcyBzaG91bGQgZm9jdXMgb24gcmVkdWNpbmcgZGVyYWlsbWVudHMgdGhyb3VnaCBpbXByb3ZlZCBpbnNwZWN0aW9uIHByb3RvY29scywgc3Ryb25nZXIgdHJhY2sgbWFpbnRlbmFuY2UsIGFuZCB1cGdyYWRlZCBicmFraW5nIHN5c3RlbXMuIFdoaWxlIFRyYWNrIERhbWFnZSBpdHNlbGYgd2FzIG5vdCBhIHN0cm9uZyBwcmVkaWN0b3IgaW4gdGhpcyBhbmFseXNpcywgaXQgcmVtYWlucyBhIHJlYWwgZmluYW5jaWFsIGJ1cmRlbiwgYW5kIGZ1dHVyZSBtb2RlbHMgY291bGQgaW50ZWdyYXRlIGVuZ2luZWVyaW5nIGFzc2Vzc21lbnRzIHRvIGNhcHR1cmUgaXRzIHRydWUgY29zdHMgbW9yZSBmdWxseS4gT3ZlcmFsbCwgdGhpcyBwcm9qZWN0IGRlbW9uc3RyYXRlcyBob3cgc3RhdGlzdGljYWwgbW9kZWxpbmcgY2FuIGd1aWRlIGRhdGEtZHJpdmVuIGRlY2lzaW9uLW1ha2luZyB0byByZWR1Y2UgYWNjaWRlbnQgbG9zc2VzLg0KDQojIDEwIFJlZmVyZW5jZXMNCg0Kc2FmZXR5ZGF0YS5mcmEuZG90Lmdvdg0KDQoNCg0K