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.
This data set has 17 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
- Railroad Equipment (categorical) - type of
equipment
- 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 Testing the Models
We are 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 because they are irrelevant in this study.
3.1 Main Effects Model
The first model we are going to look at is the one with just the main
effects.
3.1.2 Inferential Statistics
First, we are going to find the inferential statistics for the main
effects model. This will show us if the variables and model are
statistically significant, and show how much of the variation in
Equipment Damage is explained by the two
variables. We will be comparing these findings with the interaction
model’s results to determine which model is sufficient.
# 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).
3.1.3 Residual Analysis
Next, we will be looking at the residual analysis for this model to
determine if the residual assumptions are met. If the assumptions are
not met and we decide to move forward with this model, then we will use
a Box–Cox transformation and bootstrap confidence intervals for robust
inference.
# 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)

The Residuals vs Fitted plot shows there is no constant variance in
the residuals. The Q-Q Residuals show 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 residual assumptions are not met.
3.2 Interaction Term
Now, we will take a look at the interaction model. If this model has
a higher R-squared value and is statistically significant, we will move
forward with this model instead of the previous one.
3.2.1 Inferential Statistics
Let’s take a look at the inferential statistics so we can find out if
this model is better than the main effect model.
# 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) and
the interaction (p < 2e-16) are statistically significant. The
Track Damage main effect by itself is not
(0.073, p = 0.095). Because the interaction is significant, the effect
of Cars Derailed on Equipment
Damage increases as Track Damage
increases. When both predictors are zero, the expected
Equipment Damage is about $3,400 (intercept
not significant). Each additional derailed car increases expected
Equipment Damage by about $17,350 when
Track Damage = 0; each additional dollar of
Track Damage is associated with about $0.07 of
additional Equipment Damage at
Cars Derailed = 0. The model explains 53.39%
of the variation (F = 997.3, p < 0.001). Because the model includes
an interaction, main-effect slopes are conditional (e.g., the
Cars Derailed slope is evaluated at
Track Damage = 0). Centering Track
Damage at its mean would make interpretation more
intuitive.
3.2.2 Residual Analysis
Now that we know that we’re going to move forward with this model,
let’s see if it meets the residual assumptions. If not, we will be using
a Box-Cox transformation to come to our conclusion.
# 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.
4 Remedies and Robust Inference
Since the residual assumptions were not met, we are going to move
forward with a Box-Cox transformation, followed by 95% bootstrap
confidence intervals.
4.3 Bootstrap Confidence Intervals
We then constructed bootstrap confidence intervals to give robust,
data-driven intervals for our interaction model, and to see if it
matches our Box-Cox transformed model.
# 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
Using 1,000-sample bootstrap confidence intervals on the
untransformed model, the effect of Cars
Derailed is clearly positive: we estimate an increase of
$12.8k–$21.7k per additional derailed car, holding Track
Damage at its reference value. The Track
Damage main effect is not statistically distinguishable
from zero (CI = [−0.124, 0.322]), while the interaction is positively
estimated (CI = [0.03, 0.06]), meaning the impact of Cars
Derailed grows as Track Damage
increases and vice versa. These conclusions match the Box–Cox (λ≈0.20)
refit in terms of signs and which effects are detectable; the
transformation mainly stabilized variance and improved diagnostics.
5 Conclusion
Equipment Damage in these railroad
accidents is driven primarily by the number of Cars
Derailed, and that result holds across methods. In the
original, raw model, 1,000-sample bootstrap confidence intervals show a
clearly positive Cars Derailed effect (about
$12.8k–$21.7k per additional car), while the Cars
Derailed × Track Damage
interaction is also reliably positive (confidence interval entirely
above zero), meaning damages rise faster when derailments coincide with
higher Track Damage. The Track
Damage main effect alone is not consistently different
from zero once the interaction is included (its CI spans zero). To
improve reliability, we applied a Box–Cox transformation to the response
with λ ≈ 0.20 (95% CI [0.20, 0.21]), which stabilized variance. Fitted
values were then back-transformed to dollars for interpretation.
These estimates should be read with a few caveats. The data is from
2010, so it may not reflect current technology and safety practices.
Coefficients in the transformed model are on a transformed scale (we
therefore interpret via back-transformed predictions), and R² on the
transformed outcome is not directly comparable to R² on the dollar
scale. Because the model includes an interaction, each main-effect slope
is conditional; centering Track Damage at its
mean would make that interpretation more intuitive.
Looking ahead, updating the analysis with recent accidents and adding
operational and engineering covariates like train speed, consist weight,
weather, track class/geometry, would likely improve explanatory power.
Practically, the results point to two levers: reduce derailments
overall, and prioritize maintenance and inspection where car derailment
risk and Track Damage risk coincide, since
their combination is associated with disproportionately higher
losses.
6 References
safetydata.fra.dot.gov
LS0tDQp0aXRsZTogIlZhcmlhYmxlcyB0aGF0IFByZWRpY3QgVHJhaW4gRXF1aXBtZW50IERhbWFnZSINCmF1dGhvcjogIkx1a2UgVm9sbSINCmRhdGU6ICIyMDI1LTA5LTIxIg0Kb3V0cHV0Og0KICBodG1sX2RvY3VtZW50OiAgICAgICAgICAgIyBvdXRwdXQgZG9jdW1lbnQgZm9ybWF0DQogICAgdG9jOiB5ZXMgICAgICAgICAgICAgICAjIGFkZCB0YWJsZSBjb250ZW50cw0KICAgIHRvY19mbG9hdDogeWVzICAgICAgICAgIyB0b2NfcHJvcGVydHk6IGZsb2F0aW5nDQogICAgdG9jX2RlcHRoOiA0ICAgICAgICAgICAjIGRlcHRoIG9mIFRPQyBoZWFkaW5ncw0KICAgIGZpZ193aWR0aDogNiAgICAgICAgICAgIyBnbG9iYWwgZmlndXJlIHdpZHRoDQogICAgZmlnX2hlaWdodDogNCAgICAgICAgICAjIGdsb2JhbCBmaWd1cmUgaGVpZ2h0DQogICAgZmlnX2NhcHRpb246IHllcyAgICAgICAjIGFkZCBmaWd1cmUgY2FwdGlvbg0KICAgIG51bWJlcl9zZWN0aW9uczogbm8gICAjIG51bWJlcmluZyBzZWN0aW9uIGhlYWRpbmdzDQogICAgdG9jX2NvbGxhcHNlZDogeWVzICAgICAjIFRPQyBzdWJoZWFkaW5nIGNvbGxhcHNpbmcNCiAgICBjb2RlX2ZvbGRpbmc6IGhpZGUgICAgICMgZm9sZGluZy9zaG93aW5nIGNvZGUgDQogICAgY29kZV9kb3dubG9hZDogeWVzICAgICAjIGFsbG93IHRvIGRvd25sb2FkIGNvbXBsZXRlIFJNYXJrZG93biBzb3VyY2UgY29kZQ0KICAgIHNtb290aF9zY3JvbGw6IHllcyAgICAgIyBzY3JvbGxpbmcgdGV4dCBvZiB0aGUgZG9jdW1lbnQNCiAgICB0aGVtZTogbHVtZW4gICAgICAgICAgICMgdmlzdWFsIHRoZW1lIGZvciBIVE1MIGRvY3VtZW50IG9ubHkNCiAgICBoaWdobGlnaHQ6IHRhbmdvICAgICAgICMgY29kZSBzeW50YXggaGlnaGxpZ2h0aW5nIHN0eWxlcw0KICBwZGZfZG9jdW1lbnQ6IA0KICAgIHRvYzogeWVzDQogICAgdG9jX2RlcHRoOiA0DQogICAgZmlnX2NhcHRpb246IHllcw0KICAgIG51bWJlcl9zZWN0aW9uczogeWVzDQogIHdvcmRfZG9jdW1lbnQ6DQogICAgdG9jOiB5ZXMNCiAgICB0b2NfZGVwdGg6ICc0Jw0KLS0tDQpgYGB7Y3NzLCBlY2hvID0gRkFMU0V9DQpkaXYjVE9DIGxpIHsgICAgIC8qIHRhYmxlIG9mIGNvbnRlbnQgICovDQogICAgbGlzdC1zdHlsZTp1cHBlci1yb21hbjsNCiAgICBiYWNrZ3JvdW5kLWltYWdlOm5vbmU7DQogICAgYmFja2dyb3VuZC1yZXBlYXQ6bm9uZTsNCiAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOjA7DQp9DQoNCmgxLnRpdGxlIHsgICAgLyogbGV2ZWwgMSBoZWFkZXIgb2YgdGl0bGUgICovDQogIGZvbnQtc2l6ZTogMjRweDsNCiAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogIGNvbG9yOiBEYXJrUmVkOw0KICB0ZXh0LWFsaWduOiBjZW50ZXI7DQp9DQoNCmg0LmF1dGhvciB7IC8qIEhlYWRlciA0IC0gYW5kIHRoZSBhdXRob3IgYW5kIGRhdGEgaGVhZGVycyB1c2UgdGhpcyB0b28gICovDQogIGZvbnQtc2l6ZTogMThweDsNCiAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICBjb2xvcjogRGFya1JlZDsNCiAgdGV4dC1hbGlnbjogY2VudGVyOw0KfQ0KDQpoNC5kYXRlIHsgLyogSGVhZGVyIDQgLSBhbmQgdGhlIGF1dGhvciBhbmQgZGF0YSBoZWFkZXJzIHVzZSB0aGlzIHRvbyAgKi8NCiAgZm9udC1zaXplOiAxOHB4Ow0KICBmb250LXdlaWdodDogYm9sZDsNCiAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7DQogIGNvbG9yOiBEYXJrQmx1ZTsNCiAgdGV4dC1hbGlnbjogY2VudGVyOw0KfQ0KDQpoMSB7IC8qIEhlYWRlciAxIC0gYW5kIHRoZSBhdXRob3IgYW5kIGRhdGEgaGVhZGVycyB1c2UgdGhpcyB0b28gICovDQogICAgZm9udC1zaXplOiAyMHB4Ow0KICAgIGZvbnQtd2VpZ2h0OiBib2xkOw0KICAgIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICAgIGNvbG9yOiBkYXJrcmVkOw0KICAgIHRleHQtYWxpZ246IGNlbnRlcjsNCn0NCg0KaDIgeyAvKiBIZWFkZXIgMiAtIGFuZCB0aGUgYXV0aG9yIGFuZCBkYXRhIGhlYWRlcnMgdXNlIHRoaXMgdG9vICAqLw0KICAgIGZvbnQtc2l6ZTogMThweDsNCiAgICBmb250LXdlaWdodDogYm9sZDsNCiAgICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsNCiAgICBjb2xvcjogbmF2eTsNCiAgICB0ZXh0LWFsaWduOiBsZWZ0Ow0KfQ0KDQpoMyB7IC8qIEhlYWRlciAzIC0gYW5kIHRoZSBhdXRob3IgYW5kIGRhdGEgaGVhZGVycyB1c2UgdGhpcyB0b28gICovDQogICAgZm9udC1zaXplOiAxNnB4Ow0KICAgIGZvbnQtd2VpZ2h0OiBib2xkOw0KICAgIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICAgIGNvbG9yOiBuYXZ5Ow0KICAgIHRleHQtYWxpZ246IGxlZnQ7DQp9DQoNCmg0IHsgLyogSGVhZGVyIDQgLSBhbmQgdGhlIGF1dGhvciBhbmQgZGF0YSBoZWFkZXJzIHVzZSB0aGlzIHRvbyAgKi8NCiAgICBmb250LXNpemU6IDE0cHg7DQogIGZvbnQtd2VpZ2h0OiBib2xkOw0KICAgIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICAgIGNvbG9yOiBkYXJrcmVkOw0KICAgIHRleHQtYWxpZ246IGxlZnQ7DQp9DQoNCi8qIEFkZCBkb3RzIGFmdGVyIG51bWJlcmVkIGhlYWRlcnMgKi8NCi5oZWFkZXItc2VjdGlvbi1udW1iZXI6OmFmdGVyIHsNCiAgY29udGVudDogIi4iOw0KfQ0KYGBgDQoNCg0KYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9DQojIGNvZGUgY2h1bmsgc3BlY2lmaWVzIHdoZXRoZXIgdGhlIFIgY29kZSwgd2FybmluZ3MsIGFuZCBvdXRwdXQgDQojIHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIG91dHB1dCBmaWxlcy4NCmxpYnJhcnkocmVhZHhsKQ0KbGlicmFyeShNQVNTKQ0KbGlicmFyeShib290KQ0KDQpteURhdGEgPC0gcmVhZF9leGNlbCgidHJhaW5fYWNjXzIwMTAgKDEpLnhscyIpDQppZiAoIXJlcXVpcmUoImtuaXRyIikpIHsgICAgICAgICAgICAgICAgICAgICAgIyB1c2UgY29uZGl0aW9uYWwgc3RhdGVtZW50IHRvIGRldGVjdA0KICAgaW5zdGFsbC5wYWNrYWdlcygia25pdHIiKSAgICAgICAgICAgICAgICAgICMgd2hldGhlciBhIHBhY2thZ2Ugd2FzIGluc3RhbGxlZCBpbg0KICAgbGlicmFyeShrbml0cikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgeW91ciBtYWNoaW5lLiBJZiBub3QsIGluc3RhbGwgaXQgYW5kDQp9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBsb2FkIGl0IHRvIHRoZSB3b3JraW5nIGRpcmVjdG9yeS4NCiMNCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSwgICAgICAgICAgICAjIGluY2x1ZGUgY29kZSBjaHVuayBpbiB0aGUgb3V0cHV0IGZpbGUNCiAgICAgICAgICAgICAgICAgICAgICB3YXJuaW5nID0gRkFMU0UsICAgICAgICAjIHNvbWV0aW1lcywgeW91IGNvZGUgbWF5IHByb2R1Y2Ugd2FybmluZyBtZXNzYWdlcywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHlvdSBjYW4gY2hvb3NlIHRvIGluY2x1ZGUgdGhlIHdhcm5pbmcgbWVzc2FnZXMgaW4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHRoZSBvdXRwdXQgZmlsZS4gDQogICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cyA9IFRSVUUsICAgICAgICAgIyB5b3UgY2FuIGFsc28gZGVjaWRlIHdoZXRoZXIgdG8gaW5jbHVkZSB0aGUgb3V0cHV0DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBpbiB0aGUgb3V0cHV0IGZpbGUuDQogICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9IEZBTFNFLCAgICAgICAgIyBzdXBwcmVzcyBtZXNzYWdlcyANCiAgICAgICAgICAgICAgICAgICAgICBjb21tZW50ID0gTkEgICAgICAgICAgICAjIHJlbW92ZSB0aGUgZGVmYXVsdCBsZWFkaW5nIGhhc2ggdGFncyBpbiB0aGUgb3V0cHV0DQogICAgICAgICAgICAgICAgICAgICAgKSAgIA0KYGBgDQoNCg0KIyAxIEludHJvZHVjdGlvbg0KDQpUaGUgZ29hbCBvZiB0aGlzIHN0dWR5IGlzIHRvIGRldGVybWluZSB3aGV0aGVyIHRoZSBudW1iZXIgb2YgKioqQ2FycyBEZXJhaWxlZCoqKiBhbmQgdGhlIGFtb3VudCBvZiAqKipUcmFjayBEYW1hZ2UqKiogY2FuIGJlIHVzZWQgdG8gcmVsaWFibHkgcHJlZGljdCAqKipFcXVpcG1lbnQgRGFtYWdlKioqIGluIFUuUy4gcmFpbHJvYWQgYWNjaWRlbnRzLiBTcGVjaWZpY2FsbHksIEkgd2FudCB0byBhbnN3ZXIgdGhlIHJlc2VhcmNoIHF1ZXN0aW9uOg0KDQpDYW4gdGhlIG51bWJlciBvZiAqKipDYXJzIERlcmFpbGVkKioqIGFuZCB0aGUgYW1vdW50IG9mICoqKlRyYWNrIERhbWFnZSoqKiBiZSB1c2VkIHRvIHJlbGlhYmx5IHByZWRpY3QgKioqRXF1aXBtZW50IERhbWFnZSoqKiBpbiB0cmFpbiBhY2NpZGVudHM/DQoNClRvIGludmVzdGlnYXRlIHRoaXMsIEkgdXNlIGFjY2lkZW50IGRhdGEgY29sbGVjdGVkIGluIDIwMTAgZnJvbSB0aGUgRmVkZXJhbCBSYWlscm9hZCBBZG1pbmlzdHJhdGlvbiAoc2FmZXR5ZGF0YS5mcmEuZG90LmdvdikuIFRoZSBkYXRhc2V0IGluY2x1ZGVzIGluZm9ybWF0aW9uIHN1Y2ggYXMgYWNjaWRlbnQgY2F1c2UsIHNwZWVkLCBpbmp1cmllcywgZmF0YWxpdGllcywgdHJhY2sgdHlwZSwgYW5kIHNldmVyYWwgbWVhc3VyZXMgb2YgZGFtYWdlLiBGcm9tIHRoZXNlIHZhcmlhYmxlcywgSSBmb2N1cyBvbiAqKipDYXJzIERlcmFpbGVkKioqIGFuZCAqKipUcmFjayBEYW1hZ2UqKiogYmVjYXVzZSBleHBsb3JhdG9yeSBhbmFseXNpcyBzaG93cyB0aGV5IGhhdmUgdGhlIHN0cm9uZ2VzdCBjb3JyZWxhdGlvbiB3aXRoICoqKkVxdWlwbWVudCBEYW1hZ2UqKiouIEkgYWxzbyBjcmVhdGUgYW4gaW50ZXJhY3Rpb24gdGVybSAoKioqQ2FycyBEZXJhaWxlZCoqKiDDlyAqKipUcmFjayBEYW1hZ2UqKiopIHRvIHRlc3Qgd2hldGhlciB0aGUgZWZmZWN0IG9mIGRlcmFpbG1lbnRzIGRlcGVuZHMgb24gdHJhY2sgY29uZGl0aW9ucy4NCg0KVGhlIGFwcHJvYWNoIHdpbGwgaW5jbHVkZSBleHBsb3JhdG9yeSBhbmFseXNpcyBvZiB0aGUgZGF0YSBzZXQsIGNvbnN0cnVjdGlvbiBvZiBzZXZlcmFsIGNhbmRpZGF0ZSByZWdyZXNzaW9uIG1vZGVscyAobWFpbiBlZmZlY3RzLCBpbnRlcmFjdGlvbiBtb2RlbCwgYW5kIHRyYW5zZm9ybWVkIG1vZGVsKSwgcmVzaWR1YWwgZGlhZ25vc3RpY3MsIGFuZCBub25wYXJhbWV0cmljIHRlY2huaXF1ZXMgc3VjaCBhcyBib290c3RyYXAgY29uZmlkZW5jZSBpbnRlcnZhbHMuIEJ5IGNvbXBhcmluZyB0aGVzZSBtb2RlbHMsIEkgd2lsbCBpZGVudGlmeSB3aGljaCBwcmVkaWN0b3JzIG1lYW5pbmdmdWxseSBleHBsYWluIHZhcmlhdGlvbiBpbiAqKipFcXVpcG1lbnQgRGFtYWdlKioqIGFuZCBldmFsdWF0ZSB0aGUgc3RhYmlsaXR5IG9mIHRoZSByZXN1bHRzLg0KDQojIDIgRGVzY3JpcHRpb24gb2YgRGF0YSBTZXQNCg0KICBUaGUgZGF0YSBzZXQgSSBjaG9zZSB3YXMgUmFpbHJvYWQgQWNjaWRlbnRzIGluIHRoZSBVLlMuIGluIDIwMTAuIFRoZSBkYXRhIHdhcyBjb2xsZWN0ZWQgdmlhIHNhZmV0eWRhdGEuZnJhLmRvdC5nb3YuIEluIGxhc3Qgd2VlaydzIHByb2plY3QsIEkgdXNlZCB0aGlzIGRhdGEgc2V0IHRvIGRldGVybWluZSBpZiB0aGUgbnVtYmVyIG9mICoqKkNhcnMgRGVyYWlsZWQqKiogcG9zaXRpdmVseSBjb3JyZWxhdGVkIHdpdGggKioqRXF1aXBtZW50IERhbWFnZSoqKiAoaW4gZG9sbGFycykuIFRoaXMgd2VlaywgSSB3YW50IHRvIGFkZCAqKipUcmFjayBEYW1hZ2UqKiogKGluIGRvbGxhcnMpIHRvIG15IG1vZGVsIGJlY2F1c2UgaXQgaGFkIHRoZSBzZWNvbmQgc3Ryb25nZXN0IGNvcnJlbGF0aW9uIGNvZWZmaWNpZW50IHIgZnJvbSBsYXN0IHdlZWsncyBjb3JyZWxhdGlvbiBtYXRyaXguIEknbSBnb2luZyB0byBzZWUgaG93IGFjY3VyYXRlbHkgKioqQ2FycyBEZXJhaWxlZCoqKiBhbmQgKioqVHJhY2sgRGFtYWdlKioqIGNhbiBwcmVkaWN0ICoqKkVxdWlwbWVudCBEYW1hZ2UqKiouDQogIA0KVGhpcyBkYXRhIHNldCBoYXMgMTcgdmFyaWFibGVzOg0KDQoxLiAqKipSYWlscm9hZCoqKiAoY2F0ZWdvcmljYWwpIC0gbmFtZSBvZiByYWlscm9hZA0KMi4gKioqTW9udGgqKiogKGNhdGVnb3JpY2FsKQ0KMy4gKioqRGF5KioqIChjYXRlZ29yaWNhbCkgLSBkYXlzIG9mIHRoZSB3ZWVrIGxhYmVsZWQgMSB0aHJvdWdoIDcNCjQuICoqKlN0YXRlKioqIChjYXRlZ29yaWNhbCkNCjUuICoqKkNvdW50eSoqKiAoY2F0ZWdvcmljYWwpDQo2LiAqKipUcmFjayBUeXBlKioqIChjYXRlZ29yaWNhbCkNCjcuICoqKlRyYWNrIE1hbmFnZW1lbnQqKiogKGNhdGVnb3JpY2FsKQ0KOC4gKioqQWNjaWRlbnQgVHlwZSoqKiAoY2F0ZWdvcmljYWwpDQo5LiAqKipBY2NpZGVudCBDYXVzZSoqKiAoY2F0ZWdvcmljYWwpDQoxMC4gKioqRXF1aXBtZW50IERhbWFnZSoqKiAobnVtZXJpY2FsKSAtIGFtb3VudCBvZiBtb25leSBzcGVudCBvbiBkYW1hZ2VzDQoxMS4gKioqVHJhY2sgRGFtYWdlKioqIChudW1lcmljYWwpIC0gYW1vdW50IG9mIG1vbmV5IHNwZW50IG9uIHRyYWNrIHJlcGFpcg0KMTIuICoqKktpbGxlZCoqKiAobnVtZXJpY2FsKSAtIG51bWJlciBvZiBwZW9wbGUga2lsbGVkIGZyb20gYWNjaWRlbnQNCjEzLiAqKipJbmp1cmVkKioqIChudW1lcmljYWwpIC0gbnVtYmVyIG9mIHBlb3BsZSBpbmp1cmVkIGZyb20gYWNjaWRlbnQNCjE0LiAqKipSYWlscm9hZCBFcXVpcG1lbnQqKiogKGNhdGVnb3JpY2FsKSAtIHR5cGUgb2YgZXF1aXBtZW50DQoxNS4gKioqU3BlZWQqKiogKG51bWVyaWNhbCkgLSBtcGggdGhlIHRyYWluIHdhcyBnb2luZyBhdCBkdXJpbmcgaW1wYWN0DQoxNi4gKioqTG9jb21vdGl2ZXMgRGVyYWlsZWQqKiogKG51bWVyaWNhbCkgLSB0aGUgbnVtYmVyIG9mIGxvY29tb3RpdmVzIGRlcmFpbGVkDQoxNy4gKioqQ2FycyBEZXJhaWxlZCoqKiAobnVtZXJpY2FsKSAtIHRoZSBudW1iZXIgb2YgKioqQ2FycyBEZXJhaWxlZCoqKg0KDQojIDMgVGVzdGluZyB0aGUgTW9kZWxzDQoNCiAgV2UgYXJlIGdvaW5nIHRvIGNyZWF0ZSB0d28gbXVsdGlwbGUgbGluZWFyIHJlZ3Jlc3Npb24gbW9kZWxzOiBvbmUgd2l0aCAqKipDYXJzIERlcmFpbGVkKioqIGFuZCAqKipUcmFjayBEYW1hZ2UqKiogYmVpbmcgYWRkZWQgdG9nZXRoZXIsIGFuZCBvbmUgd2l0aCB0aGUgdHdvIHZhcmlhYmxlcyBiZWluZyBtdWx0aXBsaWVkIChpbnRlcmFjdGVkKSB0b2dldGhlci4gVGhlcmUgaXMgYSBwb3NzaWJpbGl0eSB0aGF0IGEgc2luZ2xlIGRlcmFpbGVkIGNhciBjYXVzZXMgbW9yZSBkYW1hZ2UgaWYgdGhlIHRyYWNrIGlzIGFscmVhZHkgYmFkbHkgZGFtYWdlZC4gSWYgdGhhdCdzIHRoZSBjYXNlLCB0aGVuIHRoZSBpbnRlcmFjdGlvbiBtb2RlbCB3b3VsZCBiZSBtb3JlIGFwcHJvcHJpYXRlIHRvIHVzZS4gV2Ugd2lsbCBiZSBkcm9wcGluZyBhbGwgb2YgdGhlIG90aGVyIHZhcmlhYmxlcyBtZW50aW9uZWQgaW4gIzIgYmVjYXVzZSB0aGV5IGFyZSBpcnJlbGV2YW50IGluIHRoaXMgc3R1ZHkuDQogIA0KIyMgMy4xIE1haW4gRWZmZWN0cyBNb2RlbA0KDQogIFRoZSBmaXJzdCBtb2RlbCB3ZSBhcmUgZ29pbmcgdG8gbG9vayBhdCBpcyB0aGUgb25lIHdpdGgganVzdCB0aGUgbWFpbiBlZmZlY3RzLiANCiAgDQojIyMgMy4xLjIgSW5mZXJlbnRpYWwgU3RhdGlzdGljcw0KDQogIEZpcnN0LCB3ZSBhcmUgZ29pbmcgdG8gZmluZCB0aGUgaW5mZXJlbnRpYWwgc3RhdGlzdGljcyBmb3IgdGhlIG1haW4gZWZmZWN0cyBtb2RlbC4gVGhpcyB3aWxsIHNob3cgdXMgaWYgdGhlIHZhcmlhYmxlcyBhbmQgbW9kZWwgYXJlIHN0YXRpc3RpY2FsbHkgc2lnbmlmaWNhbnQsIGFuZCBzaG93IGhvdyBtdWNoIG9mIHRoZSB2YXJpYXRpb24gaW4gKioqRXF1aXBtZW50IERhbWFnZSoqKiBpcyBleHBsYWluZWQgYnkgdGhlIHR3byB2YXJpYWJsZXMuIFdlIHdpbGwgYmUgY29tcGFyaW5nIHRoZXNlIGZpbmRpbmdzIHdpdGggdGhlIGludGVyYWN0aW9uIG1vZGVsJ3MgcmVzdWx0cyB0byBkZXRlcm1pbmUgd2hpY2ggbW9kZWwgaXMgc3VmZmljaWVudC4NCg0KYGBge3J9DQojIE11bHRpcGxlIExpbmVhciBSZWdyZXNzaW9uDQptb2RlbDEgPC0gbG0oRXFwRGFtZyB+IENhcnNEZXIgKyBUcmtEYW1nLCBkYXRhID0gbXlEYXRhKQ0KDQojIFN1bW1hcnkgb2YgdGhlIG1vZGVsDQpzdW1tYXJ5KG1vZGVsMSkNCmBgYA0KDQpMb29raW5nIGF0IHRoZSBpbmZlcmVudGlhbCBzdGF0aXN0aWNzLCAqKipDYXJzIERlcmFpbGVkKioqIGFuZCAqKipUcmFjayBEYW1hZ2UqKiogYXJlIGJvdGggaGlnaGx5IHNpZ25pZmljYW50LiBUaGUgaW50ZXJjZXB0IGlzIG5vdCBzdGF0aXN0aWNhbGx5IHNpZ25pZmljYW50LiBGb3IgZWFjaCBhZGRpdGlvbmFsICoqKmNhciBkZXJhaWxlZCoqKiAoMjUsMzgwLCBwIDwgMmUtMTYpLCAqKipFcXVpcG1lbnQgRGFtYWdlKioqIGluY3JlYXNlcyBieSBhYm91dCBcJDI1LDM4MCwgaG9sZGluZyAqKipUcmFjayBEYW1hZ2UqKiogY29uc3RhbnQuIEZvciBlYWNoIGFkZGl0aW9uYWwgZG9sbGFyIHNwZW50IG9uICoqKlRyYWNrIERhbWFnZSoqKiAoMC41NCwgcCA8IDJlLTE2KSwgKioqRXF1aXBtZW50IERhbWFnZSoqKiBpbmNyZWFzZXMgYnkgYWJvdXQgXCQwLjU0LCBob2xkaW5nICoqKkNhcnMgRGVyYWlsZWQqKiogY29uc3RhbnQuIFRoaXMgbW9kZWwgZXhwbGFpbnMgNDcuMjklIG9mIHRoZSB2YXJpYXRpb24gaW4gKioqRXF1aXBtZW50IERhbWFnZSoqKi4gVGhlIG1vZGVsIGlzIGhpZ2hseSBzaWduaWZpY2FudCAoRiA9IDExNzYsIHAgPSAwKS4NCg0KIyMjIDMuMS4zIFJlc2lkdWFsIEFuYWx5c2lzDQoNCk5leHQsIHdlIHdpbGwgYmUgbG9va2luZyBhdCB0aGUgcmVzaWR1YWwgYW5hbHlzaXMgZm9yIHRoaXMgbW9kZWwgdG8gZGV0ZXJtaW5lIGlmIHRoZSByZXNpZHVhbCBhc3N1bXB0aW9ucyBhcmUgbWV0LiBJZiB0aGUgYXNzdW1wdGlvbnMgYXJlIG5vdCBtZXQgYW5kIHdlIGRlY2lkZSB0byBtb3ZlIGZvcndhcmQgd2l0aCB0aGlzIG1vZGVsLCB0aGVuIHdlIHdpbGwgdXNlIGEgQm944oCTQ294IHRyYW5zZm9ybWF0aW9uIGFuZCBib290c3RyYXAgY29uZmlkZW5jZSBpbnRlcnZhbHMgZm9yIHJvYnVzdCBpbmZlcmVuY2UuDQoNCmBgYHtyLCBmaWcud2lkdGg9OCwgZmlnLmhlaWdodD02fQ0KIyBGaXQgbW9kZWwgd2l0aG91dCBpbnRlcmFjdGlvbg0KbW9kZWwxIDwtIGxtKEVxcERhbWcgfiBDYXJzRGVyICsgVHJrRGFtZywgZGF0YSA9IG15RGF0YSkNCiMgUGxvdCByZXNpZHVhbHMgdnMgZml0dGVkIHRvIGNoZWNrIGFzc3VtcHRpb25zDQpwYXIobWZyb3cgPSBjKDIsMikpDQpwbG90KG1vZGVsMSkNCnBhcihtZnJvdyA9IGMoMSwxKSkNCmBgYCANCiAgDQpUaGUgUmVzaWR1YWxzIHZzIEZpdHRlZCBwbG90IHNob3dzIHRoZXJlIGlzIG5vIGNvbnN0YW50IHZhcmlhbmNlIGluIHRoZSByZXNpZHVhbHMuIFRoZSBRLVEgUmVzaWR1YWxzIHNob3cgbXVsdGlwbGUgb3V0bGllcnMgYW5kIHR3byBzdHJvbmcgdGFpbHMsIGluZGljYXRpbmcgbm9uLW5vcm1hbGl0eS4gVGhlIFNjYWxlIExvY2F0aW9uIHBsb3Qgc2hvd3MgYSBsYWNrIG9mIGNvbnN0YW50IHZhcmlhbmNlIGFuZCB0aGUgUmVzaWR1YWxzIHZzIExldmVyYWdlIHBsb3Qgc2hvd3MgYW4gb3V0bGllciBhdCAzOTAuIFRoZSByZXNpZHVhbCBhc3N1bXB0aW9ucyBhcmUgbm90IG1ldC4NCg0KIyMgMy4yIEludGVyYWN0aW9uIFRlcm0NCg0KTm93LCB3ZSB3aWxsIHRha2UgYSBsb29rIGF0IHRoZSBpbnRlcmFjdGlvbiBtb2RlbC4gSWYgdGhpcyBtb2RlbCBoYXMgYSBoaWdoZXIgUi1zcXVhcmVkIHZhbHVlIGFuZCBpcyBzdGF0aXN0aWNhbGx5IHNpZ25pZmljYW50LCB3ZSB3aWxsIG1vdmUgZm9yd2FyZCB3aXRoIHRoaXMgbW9kZWwgaW5zdGVhZCBvZiB0aGUgcHJldmlvdXMgb25lLg0KDQojIyMgMy4yLjEgSW5mZXJlbnRpYWwgU3RhdGlzdGljcw0KDQpMZXQncyB0YWtlIGEgbG9vayBhdCB0aGUgaW5mZXJlbnRpYWwgc3RhdGlzdGljcyBzbyB3ZSBjYW4gZmluZCBvdXQgaWYgdGhpcyBtb2RlbCBpcyBiZXR0ZXIgdGhhbiB0aGUgbWFpbiBlZmZlY3QgbW9kZWwuDQoNCmBgYHtyfQ0KIyBNb2RlbCAzOiBDYXJzRGVyICsgVHJrRGFtZyArIENhcnNEZXI6VHJrRGFtZw0KbW9kZWwzIDwtIGxtKEVxcERhbWcgfiBDYXJzRGVyICsgVHJrRGFtZyArIENhcnNEZXI6VHJrRGFtZywgZGF0YSA9IG15RGF0YSkNCg0KIyBTdW1tYXJ5IG9mIHRoZSBtb2RlbA0Kc3VtbWFyeShtb2RlbDMpDQpgYGANCg0KKioqQ2FycyBEZXJhaWxlZCoqKiAoMTcsMzUwLCBwIDwgMmUtMTYpIGFuZCB0aGUgaW50ZXJhY3Rpb24gKHAgPCAyZS0xNikgYXJlIHN0YXRpc3RpY2FsbHkgc2lnbmlmaWNhbnQuIFRoZSAqKipUcmFjayBEYW1hZ2UqKiogbWFpbiBlZmZlY3QgYnkgaXRzZWxmIGlzIG5vdCAoMC4wNzMsIHAgPSAwLjA5NSkuIEJlY2F1c2UgdGhlIGludGVyYWN0aW9uIGlzIHNpZ25pZmljYW50LCB0aGUgZWZmZWN0IG9mICoqKkNhcnMgRGVyYWlsZWQqKiogb24gKioqRXF1aXBtZW50IERhbWFnZSoqKiBpbmNyZWFzZXMgYXMgKioqVHJhY2sgRGFtYWdlKioqIGluY3JlYXNlcy4gV2hlbiBib3RoIHByZWRpY3RvcnMgYXJlIHplcm8sIHRoZSBleHBlY3RlZCAqKipFcXVpcG1lbnQgRGFtYWdlKioqIGlzIGFib3V0IFwkMyw0MDAgKGludGVyY2VwdCBub3Qgc2lnbmlmaWNhbnQpLiBFYWNoIGFkZGl0aW9uYWwgZGVyYWlsZWQgY2FyIGluY3JlYXNlcyBleHBlY3RlZCAqKipFcXVpcG1lbnQgRGFtYWdlKioqIGJ5IGFib3V0IFwkMTcsMzUwIHdoZW4gKioqVHJhY2sgRGFtYWdlKioqID0gMDsgZWFjaCBhZGRpdGlvbmFsIGRvbGxhciBvZiAqKipUcmFjayBEYW1hZ2UqKiogaXMgYXNzb2NpYXRlZCB3aXRoIGFib3V0IFwkMC4wNyBvZiBhZGRpdGlvbmFsICoqKkVxdWlwbWVudCBEYW1hZ2UqKiogYXQgKioqQ2FycyBEZXJhaWxlZCoqKiAgPSAwLiBUaGUgbW9kZWwgZXhwbGFpbnMgNTMuMzklIG9mIHRoZSB2YXJpYXRpb24gKEYgPSA5OTcuMywgcCA8IDAuMDAxKS4gQmVjYXVzZSB0aGUgbW9kZWwgaW5jbHVkZXMgYW4gaW50ZXJhY3Rpb24sIG1haW4tZWZmZWN0IHNsb3BlcyBhcmUgY29uZGl0aW9uYWwgKGUuZy4sIHRoZSAqKipDYXJzIERlcmFpbGVkKioqIHNsb3BlIGlzIGV2YWx1YXRlZCBhdCAqKipUcmFjayBEYW1hZ2UqKiogPSAwKS4gQ2VudGVyaW5nICoqKlRyYWNrIERhbWFnZSoqKiBhdCBpdHMgbWVhbiB3b3VsZCBtYWtlIGludGVycHJldGF0aW9uIG1vcmUgaW50dWl0aXZlLg0KDQojIyMgMy4yLjIgUmVzaWR1YWwgQW5hbHlzaXMNCg0KTm93IHRoYXQgd2Uga25vdyB0aGF0IHdlJ3JlIGdvaW5nIHRvIG1vdmUgZm9yd2FyZCB3aXRoIHRoaXMgbW9kZWwsIGxldCdzIHNlZSBpZiBpdCBtZWV0cyB0aGUgcmVzaWR1YWwgYXNzdW1wdGlvbnMuIElmIG5vdCwgd2Ugd2lsbCBiZSB1c2luZyBhIEJveC1Db3ggdHJhbnNmb3JtYXRpb24gdG8gY29tZSB0byBvdXIgY29uY2x1c2lvbi4NCg0KYGBge3J9DQojIFJlc2lkdWFsIGRpYWdub3N0aWMgcGxvdHMNCnBhcihtZnJvdyA9IGMoMiwyKSkNCnBsb3QobW9kZWwzKQ0KcGFyKG1mcm93ID0gYygxLDEpKSAgIyByZXNldA0KYGBgDQoNClRoZSBhc3N1bXB0aW9ucyBvZiBub3JtYWxpdHkgYXJlIG5vdCBtZXQuIFRoZXJlIGlzIG5vIGNvbnN0YW50IHZhcmlhbmNlIGluIHRoZSBSZXNpZHVhbHMgdnMgRml0dGVkIHBsb3QsIHRoZXJlIGlzIGEgc3Ryb25nIHJpZ2h0IHRhaWwgaW4gdGhlIFEtUSBSZXNpZHVhbHMgcGxvdCwgdGhlIFNjYWxlIExvY2F0aW9uIHBsb3QgZG9lcyBub3Qgc2hvdyBjb25zdGFudCB2YXJpYW5jZSwgYW5kIHRoZXJlIGlzIG9uZSBvdXRsaWVyLCAxNDE0LCBpbiB0aGUgUmVzaWR1YWxzIHZzIExldmVyYWdlIHBsb3QuIA0KDQojIDQgUmVtZWRpZXMgYW5kIFJvYnVzdCBJbmZlcmVuY2UNCg0KU2luY2UgdGhlIHJlc2lkdWFsIGFzc3VtcHRpb25zIHdlcmUgbm90IG1ldCwgd2UgYXJlIGdvaW5nIHRvIG1vdmUgZm9yd2FyZCB3aXRoIGEgQm94LUNveCB0cmFuc2Zvcm1hdGlvbiwgZm9sbG93ZWQgYnkgOTUlIGJvb3RzdHJhcCBjb25maWRlbmNlIGludGVydmFscy4NCg0KIyMgNC4xIEJveC1Db3ggVHJhbnNmb3JtYXRpb24NCg0KV2UgYXJlIGdvaW5nIHRvIHN0YXJ0IHdpdGggYSBCb3gtQ294IHRyYW5zZm9ybWF0aW9uLiANCg0KYGBge3IgYm94Y294X3pvb20sIGVjaG89VFJVRSwgZmlnLndpZHRoPTcsIGZpZy5oZWlnaHQ9NH0NCmxpYnJhcnkoTUFTUykNCg0KayA8LSAtbWluKG15RGF0YSRFcXBEYW1nLCBuYS5ybSA9IFRSVUUpICsgMQ0KbXlEYXRhJEVxcERhbWdfcG9zIDwtIG15RGF0YSRFcXBEYW1nICsgaw0KbW9kZWwzX3BvcyA8LSBsbShFcXBEYW1nX3BvcyB+IENhcnNEZXIgKiBUcmtEYW1nLCBkYXRhID0gbXlEYXRhKQ0KDQojIFByb2ZpbGUgb3ZlciBhIHRpZ2h0IGdyaWQgc28gzrviiYgwLjIwIGlzIG9idmlvdXMNCmJjIDwtIGJveGNveChtb2RlbDNfcG9zLCBsYW1iZGEgPSBzZXEoMC4xMCwgMC4zNSwgMC4wMDEpLCBwbG90aXQgPSBGQUxTRSkNCmxhbSA8LSBiYyR4OyBsbCA8LSBiYyR5DQpjdXRvZmYgPC0gbWF4KGxsKSAtIHFjaGlzcSgwLjk1LCBkZiA9IDEpIC8gMg0KY2kgPC0gcmFuZ2UobGFtW2xsID49IGN1dG9mZl0pDQpsYW1faGF0IDwtIGxhbVt3aGljaC5tYXgobGwpXQ0KDQpwbG90KGxhbSwgbGwsIHR5cGU9ImwiLCB4bGFiPWV4cHJlc3Npb24obGFtYmRhKSwgeWxhYj0iTG9nLUxpa2VsaWhvb2QiLA0KICAgICB4bGltPWMoMC4xMCwgMC4zNSkpDQphYmxpbmUoaCA9IGN1dG9mZiwgbHR5ID0gMykNCmFibGluZSh2ID0gY2ksIGx0eSA9IDMpDQphYmxpbmUodiA9IDAuMjAsIGx0eSA9IDIsIGx3ZCA9IDIpDQptdGV4dChzcHJpbnRmKCLOu8yCID0gJS4yZjsgOTUlJSBDSSA9IFslLjJmLCAlLjJmXSIsIGxhbV9oYXQsIGNpWzFdLCBjaVsyXSksDQogICAgICBzaWRlID0gMywgbGluZSA9IC0xKQ0KYGBgDQoNCldlIGNoZWNrZWQgd2hldGhlciBhIHNpbXBsZSBwb3dlciB0cmFuc2Zvcm0gd291bGQgbWFrZSBvdXIgaW50ZXJhY3Rpb24gbW9kZWwgbW9yZSByZWxpYWJsZSwgc2luY2UgYSBmZXcgaHVnZSBhY2NpZGVudHMgY3JlYXRlIHN0cm9uZyBza2V3IGFuZCB1bmV2ZW4gbm9pc2UuIFRoZSBCb3jigJNDb3ggY2hlY2sgcG9pbnRlZCBjbGVhcmx5IHRvIGEgZ2VudGxlIHRyYW5zZm9ybSB0byBhYm91dCBhIGZpZnRoLXJvb3QgKM67IOKJiCAwLjIwKSB3aXRoIGEgdmVyeSB0aWdodCA5NSUgY29uZmlkZW5jZSBpbnRlcnZhbCBbLjIsIC4yMV0gdGhhdCBydWxlcyBvdXQgYm90aCDigJxubyB0cmFuc2Zvcm1hdGlvbuKAnSAozrsgPSAxKSBhbmQgYSBwdXJlIGxvZyAozrsgPSAwKS4gSW4gcGxhaW4gdGVybXMsIHRoaXMgdHJhbnNmb3JtIHNsaWdodGx5IGNvbXByZXNzZXMgdGhlIGJpZ2dlc3QgZGFtYWdlIHZhbHVlcyBzbyB0aGV5IGRvbuKAmXQgZG9taW5hdGUsIHdoaWNoIGV2ZW5zIG91dCB0aGUgZXJyb3JzIGFuZCBtYWtlcyB0aGUgbW9kZWzigJlzIHVuY2VydGFpbnR5IG1vcmUgdHJ1c3R3b3J0aHkuIFdlIGZpdCB0aGUgcmVncmVzc2lvbiBvbiB0aGlzIHRyYW5zZm9ybWVkIHNjYWxlIGZvciBiZXR0ZXIgc3RhdGlzdGljYWwgYmVoYXZpb3IsIHRoZW4gd2lsbCBjb252ZXJ0IHByZWRpY3RlZCB2YWx1ZXMgYmFjayBpbnRvIGRvbGxhcnMgc28gcmVzdWx0cyBzdGF5IGludGVycHJldGFibGUuIFRoZSBzdWJzdGFudGl2ZSBzdG9yeSBkb2VzbuKAmXQgY2hhbmdlOiBDYXJzIERlcmFpbGVkIGFuZCB0aGUgaW50ZXJhY3Rpb24gcmVtYWluIHJlbGlhYmx5IHBvc2l0aXZlLCB3aGlsZSB0aGUgVHJhY2sgRGFtYWdlIG1haW4gZWZmZWN0IGFsb25lIGlzIG5vdCBjbGVhcmx5IGRpZmZlcmVudCBmcm9tIHplcm87IHRoZSB0cmFuc2Zvcm1hdGlvbiBwcmltYXJpbHkgc3RhYmlsaXplZCB2YXJpYW5jZSBhbmQgaW1wcm92ZWQgZGlhZ25vc3RpY3MuDQoNCiMjIDQuMiBUcmFuc2Zvcm1pbmcgT3VyIFJlc3BvbnNlDQoNCk5vdyB0aGF0IHdlIGtub3cgzrsg4omIIDAuMjAsIHdlIHdpbGwgYmUgdHJhbnNmb3JtaW5nIG91ciByZXNwb25zZSwgcmVmaXR0aW5nIHRoZSBpbnRlcmFjdGlvbiBtb2RlbCwgYW5kIHRoZW4gYmFjay10cmFuc2Zvcm0gcHJlZGljdGlvbnMgc28gcmVzdWx0cyByZW1haW4gaW50ZXJwcmV0YWJsZSBvbiB0aGUgZG9sbGFyIHNjYWxlLiANCg0KYGBge3J9DQoNCiMgVHJhbnNmb3JtIHJlc3BvbnNlIHdpdGggbGFtYmRhID0gMC4yMCAtLS0NCmsgPC0gLW1pbihteURhdGEkRXFwRGFtZywgbmEucm09VFJVRSkgKyAxDQpsYW0gPC0gMC4yMA0KeV9wb3MgPC0gbXlEYXRhJEVxcERhbWcgKyBrDQp5X2JjICA8LSAoeV9wb3NebGFtIC0gMSkgLyBsYW0gICAgICAgICAgICAgICAgICMgQm944oCTQ294IHRyYW5zZm9ybQ0KDQojIFJlZml0IHRoZSBpbnRlcmFjdGlvbiBtb2RlbCBvbiB0cmFuc2Zvcm1lZCBzY2FsZSAtLS0NCm1vZGVsX2JjIDwtIGxtKHlfYmMgfiBDYXJzRGVyICogVHJrRGFtZywgZGF0YSA9IG15RGF0YSkNCg0KIyBJbmZlcmVuY2UgLS0tDQpzdW1tYXJ5KG1vZGVsX2JjKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgb24gdHJhbnNmb3JtZWQgc2NhbGUNCg0KIyBCYWNrLXRyYW5zZm9ybSBmaXR0ZWQgJiBwcmVkaWN0aW9ucyB0byBkb2xsYXJzIC0tLQ0KaW52X2JveGNveCA8LSBmdW5jdGlvbih6LCBsYW0pIGlmIChhYnMobGFtKSA8IDFlLTEyKSBleHAoeikgZWxzZSAobGFtKnogKyAxKV4oMS9sYW0pDQoNCiMgTmFpdmUgYmFjay10cmFuc2Zvcm0gb2YgZml0dGVkIHZhbHVlcyAoZ29vZCBmb3IgbWVkaWFucy90eXBpY2FscykNCmZpdF9iYyAgIDwtIGZpdHRlZChtb2RlbF9iYykNCmZpdF9kb2xzIDwtIGludl9ib3hjb3goZml0X2JjLCBsYW0pIC0gaw0KYGBgDQoNClVzaW5nIHRoZSBwcmV2aW91c2x5IHNlbGVjdGVkIM67ID0gMC4yMCwgSSBmaXJzdCBhZGRlZCBhIHNtYWxsIGNvbnN0YW50IHRvICoqKkVxdWlwbWVudCBEYW1hZ2UqKiogc28gYWxsIHZhbHVlcyB3ZXJlIHBvc2l0aXZlLCB0aGVuIGFwcGxpZWQgdGhlIHBvd2VyIHRyYW5zZm9ybWF0aW9uIGFuZCBmaXQgdGhlIGludGVyYWN0aW9uIG1vZGVsICgqKipDYXJzIERlcmFpbGVkKioqLCAqKipUcmFjayBEYW1hZ2UqKiosIGFuZCB0aGVpciBwcm9kdWN0KSBvbiB0aGF0IHRyYW5zZm9ybWVkIG91dGNvbWUuIFRoaXMgc3RlcCByZWR1Y2VzIHRoZSBpbmZsdWVuY2Ugb2YgdmVyeSBsYXJnZSBsb3NzZXMgYW5kIHByb2R1Y2VzIGEgbW9yZSBldmVuIHJlc2lkdWFsIHNwcmVhZCwgd2hpY2ggbWFrZXMgc3RhbmRhcmQgZXJyb3JzIGFuZCBkaWFnbm9zdGljIGNoZWNrcyBiZWhhdmUgYmV0dGVyLiBBZnRlciBlc3RpbWF0aW5nIHRoZSBtb2RlbCwgSSBjb252ZXJ0ZWQgdGhlIGZpdHRlZCB2YWx1ZXMgYmFjayB0byBkb2xsYXJzIHdpdGggdGhlIGludmVyc2UgdHJhbnNmb3JtIGFuZCByZW1vdmVkIHRoZSBzaGlmdCBzbyByZXN1bHRzIGNhbiBiZSByZWFkIGluIHRoZWlyIG9yaWdpbmFsIHVuaXRzLiBCZWNhdXNlIEkgdXNlZCBhIGRpcmVjdCBiYWNrLXRyYW5zZm9ybSwgdGhlc2UgZml0dGVkIGRvbGxhcnMgcmVwcmVzZW50IHR5cGljYWwgb3V0Y29tZXMgcmF0aGVyIHRoYW4gdW5iaWFzZWQgbWVhbnMuDQoNCiMjIDQuMyBCb290c3RyYXAgQ29uZmlkZW5jZSBJbnRlcnZhbHMNCg0KV2UgdGhlbiBjb25zdHJ1Y3RlZCBib290c3RyYXAgY29uZmlkZW5jZSBpbnRlcnZhbHMgdG8gZ2l2ZSByb2J1c3QsIGRhdGEtZHJpdmVuIGludGVydmFscyBmb3Igb3VyIGludGVyYWN0aW9uIG1vZGVsLCBhbmQgdG8gc2VlIGlmIGl0IG1hdGNoZXMgb3VyIEJveC1Db3ggdHJhbnNmb3JtZWQgbW9kZWwuDQoNCmBgYHtyIGJvb3RzdHJhcCBzZXR1cH0NCg0KIyBEZWZpbmUgZnVuY3Rpb24gdG8gZXh0cmFjdCBjb2VmZmljaWVudHMNCmJvb3RfY29lZiA8LSBmdW5jdGlvbihkYXRhLCBpbmRpY2VzKSB7DQogIGQgPC0gZGF0YVtpbmRpY2VzLCBdICAjIHJlc2FtcGxlIHJvd3MNCiAgZml0IDwtIGxtKEVxcERhbWcgfiBDYXJzRGVyICsgVHJrRGFtZyArIENhcnNEZXI6VHJrRGFtZywgZGF0YSA9IGQpDQogIHJldHVybihjb2VmKGZpdCkpDQp9DQoNCiMgUnVuIGJvb3RzdHJhcA0Kc2V0LnNlZWQoMTIzKSAgIyBmb3IgcmVwcm9kdWNpYmlsaXR5DQpib290X3Jlc3VsdHMgPC0gYm9vdChkYXRhID0gbXlEYXRhLCBzdGF0aXN0aWMgPSBib290X2NvZWYsIFIgPSAxMDAwKSAgIyAxMDAwIHJlc2FtcGxlcw0KDQojIENyZWF0ZSBhIHRpZHkgdGFibGUgb2YgOTUlIHBlcmNlbnRpbGUgQ0lzIGZvciBhbGwgY29lZmZpY2llbnRzDQpjb2VmX25hbWVzIDwtIG5hbWVzKGNvZWYobW9kZWwzKSkNCmNpX2xpc3QgPC0gbGFwcGx5KDE6bGVuZ3RoKGNvZWZfbmFtZXMpLCBmdW5jdGlvbihpKSB7DQogIGNpIDwtIGJvb3QuY2koYm9vdF9yZXN1bHRzLCB0eXBlID0gInBlcmMiLCBpbmRleCA9IGkpJHBlcmNlbnRbNDo1XQ0KICBkYXRhLmZyYW1lKENvZWZmaWNpZW50ID0gY29lZl9uYW1lc1tpXSwNCiAgICAgICAgICAgICBMb3dlcjk1ID0gY2lbMV0sDQogICAgICAgICAgICAgVXBwZXI5NSA9IGNpWzJdKQ0KfSkNCg0KY2lfdGFibGUgPC0gZG8uY2FsbChyYmluZCwgY2lfbGlzdCkNCnByaW50KGNpX3RhYmxlKQ0KYGBgDQoNClVzaW5nIDEsMDAwLXNhbXBsZSBib290c3RyYXAgY29uZmlkZW5jZSBpbnRlcnZhbHMgb24gdGhlIHVudHJhbnNmb3JtZWQgbW9kZWwsIHRoZSBlZmZlY3Qgb2YgKioqQ2FycyBEZXJhaWxlZCoqKiBpcyBjbGVhcmx5IHBvc2l0aXZlOiB3ZSBlc3RpbWF0ZSBhbiBpbmNyZWFzZSBvZiBcJDEyLjhr4oCTXCQyMS43ayBwZXIgYWRkaXRpb25hbCBkZXJhaWxlZCBjYXIsIGhvbGRpbmcgKioqVHJhY2sgRGFtYWdlKioqIGF0IGl0cyByZWZlcmVuY2UgdmFsdWUuIFRoZSAqKipUcmFjayBEYW1hZ2UqKiogbWFpbiBlZmZlY3QgaXMgbm90IHN0YXRpc3RpY2FsbHkgZGlzdGluZ3Vpc2hhYmxlIGZyb20gemVybyAoQ0kgPSBb4oiSMC4xMjQsIDAuMzIyXSksIHdoaWxlIHRoZSBpbnRlcmFjdGlvbiBpcyBwb3NpdGl2ZWx5IGVzdGltYXRlZCAoQ0kgPSBbMC4wMywgMC4wNl0pLCBtZWFuaW5nIHRoZSBpbXBhY3Qgb2YgKioqQ2FycyBEZXJhaWxlZCoqKiBncm93cyBhcyAqKipUcmFjayBEYW1hZ2UqKiogaW5jcmVhc2VzIGFuZCB2aWNlIHZlcnNhLiBUaGVzZSBjb25jbHVzaW9ucyBtYXRjaCB0aGUgQm944oCTQ294ICjOu+KJiDAuMjApIHJlZml0IGluIHRlcm1zIG9mIHNpZ25zIGFuZCB3aGljaCBlZmZlY3RzIGFyZSBkZXRlY3RhYmxlOyB0aGUgdHJhbnNmb3JtYXRpb24gbWFpbmx5IHN0YWJpbGl6ZWQgdmFyaWFuY2UgYW5kIGltcHJvdmVkIGRpYWdub3N0aWNzLg0KDQojIDUgQ29uY2x1c2lvbg0KDQoqKipFcXVpcG1lbnQgRGFtYWdlKioqIGluIHRoZXNlIHJhaWxyb2FkIGFjY2lkZW50cyBpcyBkcml2ZW4gcHJpbWFyaWx5IGJ5IHRoZSBudW1iZXIgb2YgKioqQ2FycyBEZXJhaWxlZCoqKiwgYW5kIHRoYXQgcmVzdWx0IGhvbGRzIGFjcm9zcyBtZXRob2RzLiBJbiB0aGUgb3JpZ2luYWwsIHJhdyBtb2RlbCwgMSwwMDAtc2FtcGxlIGJvb3RzdHJhcCBjb25maWRlbmNlIGludGVydmFscyBzaG93IGEgY2xlYXJseSBwb3NpdGl2ZSAqKipDYXJzIERlcmFpbGVkKioqIGVmZmVjdCAoYWJvdXQgXCQxMi44a+KAkyQyMS43ayBwZXIgYWRkaXRpb25hbCBjYXIpLCB3aGlsZSB0aGUgKioqQ2FycyBEZXJhaWxlZCoqKiDDlyAqKipUcmFjayBEYW1hZ2UqKiogaW50ZXJhY3Rpb24gaXMgYWxzbyByZWxpYWJseSBwb3NpdGl2ZSAoY29uZmlkZW5jZSBpbnRlcnZhbCBlbnRpcmVseSBhYm92ZSB6ZXJvKSwgbWVhbmluZyBkYW1hZ2VzIHJpc2UgZmFzdGVyIHdoZW4gZGVyYWlsbWVudHMgY29pbmNpZGUgd2l0aCBoaWdoZXIgKioqVHJhY2sgRGFtYWdlKioqLiBUaGUgKioqVHJhY2sgRGFtYWdlKioqIG1haW4gZWZmZWN0IGFsb25lIGlzIG5vdCBjb25zaXN0ZW50bHkgZGlmZmVyZW50IGZyb20gemVybyBvbmNlIHRoZSBpbnRlcmFjdGlvbiBpcyBpbmNsdWRlZCAoaXRzIENJIHNwYW5zIHplcm8pLiBUbyBpbXByb3ZlIHJlbGlhYmlsaXR5LCB3ZSBhcHBsaWVkIGEgQm944oCTQ294IHRyYW5zZm9ybWF0aW9uIHRvIHRoZSByZXNwb25zZSB3aXRoIM67IOKJiCAwLjIwICg5NSUgQ0kgWzAuMjAsIDAuMjFdKSwgd2hpY2ggc3RhYmlsaXplZCB2YXJpYW5jZS4gRml0dGVkIHZhbHVlcyB3ZXJlIHRoZW4gYmFjay10cmFuc2Zvcm1lZCB0byBkb2xsYXJzIGZvciBpbnRlcnByZXRhdGlvbi4NCg0KVGhlc2UgZXN0aW1hdGVzIHNob3VsZCBiZSByZWFkIHdpdGggYSBmZXcgY2F2ZWF0cy4gVGhlIGRhdGEgaXMgZnJvbSAyMDEwLCBzbyBpdCBtYXkgbm90IHJlZmxlY3QgY3VycmVudCB0ZWNobm9sb2d5IGFuZCBzYWZldHkgcHJhY3RpY2VzLiBDb2VmZmljaWVudHMgaW4gdGhlIHRyYW5zZm9ybWVkIG1vZGVsIGFyZSBvbiBhIHRyYW5zZm9ybWVkIHNjYWxlICh3ZSB0aGVyZWZvcmUgaW50ZXJwcmV0IHZpYSBiYWNrLXRyYW5zZm9ybWVkIHByZWRpY3Rpb25zKSwgYW5kIFLCsiBvbiB0aGUgdHJhbnNmb3JtZWQgb3V0Y29tZSBpcyBub3QgZGlyZWN0bHkgY29tcGFyYWJsZSB0byBSwrIgb24gdGhlIGRvbGxhciBzY2FsZS4gQmVjYXVzZSB0aGUgbW9kZWwgaW5jbHVkZXMgYW4gaW50ZXJhY3Rpb24sIGVhY2ggbWFpbi1lZmZlY3Qgc2xvcGUgaXMgY29uZGl0aW9uYWw7IGNlbnRlcmluZyAqKipUcmFjayBEYW1hZ2UqKiogYXQgaXRzIG1lYW4gd291bGQgbWFrZSB0aGF0IGludGVycHJldGF0aW9uIG1vcmUgaW50dWl0aXZlLg0KDQpMb29raW5nIGFoZWFkLCB1cGRhdGluZyB0aGUgYW5hbHlzaXMgd2l0aCByZWNlbnQgYWNjaWRlbnRzIGFuZCBhZGRpbmcgb3BlcmF0aW9uYWwgYW5kIGVuZ2luZWVyaW5nIGNvdmFyaWF0ZXMgbGlrZSB0cmFpbiBzcGVlZCwgY29uc2lzdCB3ZWlnaHQsIHdlYXRoZXIsIHRyYWNrIGNsYXNzL2dlb21ldHJ5LCB3b3VsZCBsaWtlbHkgaW1wcm92ZSBleHBsYW5hdG9yeSBwb3dlci4gUHJhY3RpY2FsbHksIHRoZSByZXN1bHRzIHBvaW50IHRvIHR3byBsZXZlcnM6IHJlZHVjZSBkZXJhaWxtZW50cyBvdmVyYWxsLCBhbmQgcHJpb3JpdGl6ZSBtYWludGVuYW5jZSBhbmQgaW5zcGVjdGlvbiB3aGVyZSBjYXIgZGVyYWlsbWVudCByaXNrIGFuZCAqKipUcmFjayBEYW1hZ2UqKiogcmlzayBjb2luY2lkZSwgc2luY2UgdGhlaXIgY29tYmluYXRpb24gaXMgYXNzb2NpYXRlZCB3aXRoIGRpc3Byb3BvcnRpb25hdGVseSBoaWdoZXIgbG9zc2VzLg0KDQojIDYgUmVmZXJlbmNlcw0KDQpzYWZldHlkYXRhLmZyYS5kb3QuZ292DQoNCg0KDQo=