Data
This data set is all about all 2025 WNBA games which includes all
star games. \(~\)
The filtered data set takes out the all star games and only looks at
the teams within the WNBA. \(~\)
After filtering out the all star games, we want to predict
specifically the team score of the median Seattle Storms game using a
statistical model.
# Keep in case, below creates a simple table
#kable(summaryC)
# "Fancy Table" for league summary
summaryC %>%
kbl(digits = 2, caption = "2025 League Stats") %>%
kable_classic_2(full_width = F)
2025 League Stats
|
team_name
|
mean_score
|
sd_score
|
mean_rebounds
|
sd_rebounds
|
mean_fgp
|
sd_fgp
|
mean_3pp
|
sd_3pp
|
mean_steals
|
sd_steals
|
|
Aces
|
85.52
|
9.56
|
33.78
|
5.88
|
45.27
|
5.82
|
35.27
|
7.08
|
6.80
|
2.67
|
|
Dream
|
76.93
|
10.59
|
35.95
|
4.41
|
41.28
|
6.78
|
30.83
|
9.32
|
7.14
|
2.82
|
|
Fever
|
84.50
|
10.17
|
35.10
|
5.49
|
45.56
|
5.38
|
35.00
|
8.99
|
5.88
|
2.29
|
|
Liberty
|
84.98
|
9.92
|
36.90
|
5.77
|
44.53
|
5.61
|
35.38
|
10.06
|
7.75
|
2.19
|
|
Lynx
|
82.36
|
11.39
|
33.15
|
5.06
|
45.21
|
6.34
|
37.80
|
9.43
|
8.36
|
3.17
|
|
Mercury
|
81.93
|
12.60
|
32.26
|
5.39
|
44.28
|
7.34
|
32.97
|
10.34
|
6.55
|
2.12
|
|
Mystics
|
79.30
|
8.69
|
31.85
|
4.66
|
43.36
|
4.82
|
36.64
|
8.69
|
7.28
|
2.24
|
|
Sky
|
77.40
|
9.62
|
36.60
|
5.57
|
42.44
|
5.22
|
31.74
|
11.62
|
7.00
|
3.30
|
|
Sparks
|
78.40
|
10.57
|
32.67
|
5.52
|
42.63
|
6.15
|
32.09
|
11.00
|
7.30
|
2.78
|
|
Storm
|
82.67
|
9.65
|
34.67
|
6.02
|
43.43
|
5.39
|
28.35
|
9.03
|
9.24
|
3.27
|
|
Sun
|
80.36
|
9.89
|
33.43
|
4.62
|
44.30
|
5.28
|
32.84
|
11.67
|
7.89
|
3.29
|
|
Wings
|
84.20
|
11.47
|
34.75
|
4.65
|
44.47
|
5.24
|
32.06
|
11.75
|
7.12
|
2.95
|
# Keep in case, below creates a simple table
#kable(my_team_s)
# "Fancy Table" for win and loss median/variance
my_team_s %>%
kbl(digits = 2, caption = "2025 Seattle Storms Win/Loss Means and Standard Deviations") %>%
kable_classic(full_width = F)
2025 Seattle Storms Win/Loss Means and Standard Deviations
|
team_winner
|
mean
|
sd
|
|
FALSE
|
76.35
|
8.36
|
|
TRUE
|
86.96
|
8.08
|
Histogram and
Boxplot
###Side by side histograms
p = df_hist %>%
ggplot( aes(x=team_score, fill=result)) +
geom_histogram( color="#e9ecef", alpha=0.6, position = 'identity') +
scale_fill_manual(values=c("#2C5234", "#FBE122"))
p

boxplot(team_score ~ result, data = df_hist,
col = c("#2C5234", "#FBE122"),
main = "Points scored by game result",
xlab = "Result", ylab = "Points")

These graphs show us that the average team score for a win is higher
than a loss. This can be seen easier in the box plot since the median is
higher in the box plot representing the winning games team score.
\(~\)
Models
Our first order model consists of a dependent variable team_score and
independent variables field_goal_pct (fg%), total_rebounds (tr),
three_point_field_goal_pct (3-pt %), and steals.
The equation for this first order model is team_score = -7.7862548 +
1.4083407 * fg% + 0.53063 * tr + 0.1411404 * 3-pt % + 0.746605 *
steals.
\(~\)
After using the vif command, we found no multicollinearity issues
within our variables as all values were between 1 and 2.
\(~\)
Looking at the correlation matrix, we found that no variables were
highly correlated with each other. The highest correlation coefficient
seen was 0.52 but that is under the threshold for high correlation.
\(~\)
Interaction Model
The full interaction model for predicting team score for the Seattle
Storms is team_score = 28.937801 + 0.6626619 * fg% + -0.0405748 * tr +
-0.3439152 * 3-pt % + -0.9288016 * steals + 0.0039546 * fg% * tr +
-0.0024727 * fg% * 3-pt % + 0.0839728 * fg% * steals + 0.0240574 * tr *
3-pt% + -0.0249502 * tr * steals + -0.0293786 * 3-pt% * steals.
\(~\)
For a cleaner look for the full interaction model, look below.
|
|
|
|
Dependent variable:
|
|
|
|
|
|
team_score
|
|
|
|
field_goal_pct
|
0.663
|
|
|
(2.900)
|
|
|
|
|
total_rebounds
|
-0.041
|
|
|
(2.714)
|
|
|
|
|
three_point_field_goal_pct
|
-0.344
|
|
|
(2.074)
|
|
|
|
|
steals
|
-0.929
|
|
|
(6.695)
|
|
|
|
|
field_goal_pct:total_rebounds
|
0.004
|
|
|
(0.053)
|
|
|
|
|
field_goal_pct:three_point_field_goal_pct
|
-0.002
|
|
|
(0.024)
|
|
|
|
|
field_goal_pct:steals
|
0.084
|
|
|
(0.122)
|
|
|
|
|
total_rebounds:three_point_field_goal_pct
|
0.024
|
|
|
(0.029)
|
|
|
|
|
total_rebounds:steals
|
-0.025
|
|
|
(0.071)
|
|
|
|
|
three_point_field_goal_pct:steals
|
-0.029
|
|
|
(0.055)
|
|
|
|
|
Constant
|
28.938
|
|
|
(147.927)
|
|
|
|
|
|
|
Observations
|
42
|
|
R2
|
0.701
|
|
Adjusted R2
|
0.605
|
|
Residual Std. Error
|
6.069 (df = 31)
|
|
F Statistic
|
7.274*** (df = 10; 31)
|
|
|
|
Note:
|
p<0.1; p<0.05;
p<0.01
|
\(~\)
When reducing this model, we were given the limit of \(\alpha\) = 0.15. While reducing, I kept
note of the adjusted R2 value just to see if an interaction
term was not significant but predicted team score better.
\(~\)
While reducing, I ended up reducing all interaction terms except for
total rebounds (tr) and 3-pt % and took note that while the interaction
term was not significant at \(\alpha\)
= 0.15, adjusted R2 was 0.6429 which was higher than the base
model.
\(~\)
My final model is team_score = -7.7862548 + 1.4083407 * fg% + 0.53063
* tr + 0.1411404 * 3-pt % + 0.746605 * steals.
This model significantly predicts team score, f(4,37) = 18.9870959,
p, adjusted R2 = 0.6370023
See table below for a clearer look for the final model.
|
|
|
|
Dependent variable:
|
|
|
|
|
|
team_score
|
|
|
|
field_goal_pct
|
1.408***
|
|
|
(0.223)
|
|
|
|
|
total_rebounds
|
0.531***
|
|
|
(0.173)
|
|
|
|
|
three_point_field_goal_pct
|
0.141
|
|
|
(0.124)
|
|
|
|
|
steals
|
0.747**
|
|
|
(0.287)
|
|
|
|
|
Constant
|
-7.786
|
|
|
(12.729)
|
|
|
|
|
|
|
Observations
|
42
|
|
R2
|
0.672
|
|
Adjusted R2
|
0.637
|
|
Residual Std. Error
|
5.817 (df = 37)
|
|
F Statistic
|
18.987*** (df = 4; 37)
|
|
|
|
Note:
|
p<0.1; p<0.05;
p<0.01
|
\(~\)
Residual Analysis
# Gives us the versus fits plot to asses constant variance
ols_plot_resid_fit(model4)

# Gives us the histogram of the residuals to asses normality of the residuals
ols_plot_resid_hist(model4)

# Gives us the view for any outliers in the data
ols_plot_resid_stud(model4)

# Gives us both leverage and outliers in the data
ols_plot_resid_lev(model4, threshold = 3)

# Gives us the cooks d chart for significant values
ols_plot_cooksd_chart(model4)

\(~\)
For our residual analysis, from the histogram, we can tell that the
distribution of the residuals is approximately normal with some skewness
from the left. From our versus fits plot, we cannot see a pattern within
the variance so we can say that there is constant variance for our
residuals as well. Even with a slightly skewed histogram, I think that
we can use this regression line as a solid predictor for the Seattle
Storms team score.
We have influential values at games 10, 12, 37, and 41. \(~\)
We also have leverage points at games 12, 37, and 41. \(~\)
Game 10 was against the Connecticut Suns. \(~\)
Game 12 was against the New York Liberties. \(~\)
Game 37 was against the Washington Mystics. \(~\)
Game 41 was against the Minnesota Lynx.
\(~\)
Prediction
I built the model to predict my team’s points for a game in which
they achieve the median value for each variable. \(~\)
The predicted team score is 82.0419787, with 95% confidence interval
(80.1458374, 83.93812).
LS0tDQp0aXRsZTogIjIwMjUgV05CQSBTZWF0dGxlIFN0b3JtcyBBbmFseXNpcyINCmF1dGhvcjogIk1hcml1cyBEYXZpZCBGaXJ1bG92aWNpIg0KZGF0ZTogImByIFN5cy5EYXRlKClgIg0Kb3V0cHV0Og0KICBodG1sX2RvY3VtZW50OiANCiAgICB0b2M6IHllcw0KICAgIHRvY19kZXB0aDogNA0KICAgIHRvY19mbG9hdDogeWVzDQogICAgbnVtYmVyX3NlY3Rpb25zOiB5ZXMNCiAgICB0b2NfY29sbGFwc2VkOiB5ZXMNCiAgICBjb2RlX2ZvbGRpbmc6IGhpZGUNCiAgICBjb2RlX2Rvd25sb2FkOiB5ZXMNCiAgICBzbW9vdGhfc2Nyb2xsOiB5ZXMNCiAgICB0aGVtZTogbHVtZW4NCiAgcGRmX2RvY3VtZW50OiANCiAgICB0b2M6IHllcw0KICAgIHRvY19kZXB0aDogNA0KICAgIGZpZ19jYXB0aW9uOiB5ZXMNCiAgICBudW1iZXJfc2VjdGlvbnM6IHllcw0KICAgIGZpZ193aWR0aDogMw0KICAgIGZpZ19oZWlnaHQ6IDMNCiAgd29yZF9kb2N1bWVudDogDQogICAgdG9jOiB5ZXMNCiAgICB0b2NfZGVwdGg6IDQNCiAgICBmaWdfY2FwdGlvbjogeWVzDQogICAga2VlcF9tZDogeWVzDQplZGl0b3Jfb3B0aW9uczogDQogIGNodW5rX291dHB1dF90eXBlOiBpbmxpbmUNCi0tLQ0KDQpgYGB7Y3NzLCBlY2hvID0gRkFMU0V9DQojVE9DOjpiZWZvcmUgew0KICBjb250ZW50OiAiVGFibGUgb2YgQ29udGVudHMiOw0KICBmb250LXdlaWdodDogYm9sZDsNCiAgZm9udC1zaXplOiAxLjJlbTsNCiAgZGlzcGxheTogYmxvY2s7DQogIGNvbG9yOiBuYXZ5Ow0KICBtYXJnaW4tYm90dG9tOiAxMHB4Ow0KfQ0KDQoNCmRpdiNUT0MgbGkgeyAgICAgLyogdGFibGUgb2YgY29udGVudCAgKi8NCiAgICBsaXN0LXN0eWxlOnVwcGVyLXJvbWFuOw0KICAgIGJhY2tncm91bmQtaW1hZ2U6bm9uZTsNCiAgICBiYWNrZ3JvdW5kLXJlcGVhdDpub25lOw0KICAgIGJhY2tncm91bmQtcG9zaXRpb246MDsNCn0NCg0KaDEudGl0bGUgeyAgICAvKiBsZXZlbCAxIGhlYWRlciBvZiB0aXRsZSAgKi8NCiAgZm9udC1zaXplOiAyMnB4Ow0KICBmb250LXdlaWdodDogYm9sZDsNCiAgY29sb3I6IERhcmtSZWQ7DQogIHRleHQtYWxpZ246IGNlbnRlcjsNCiAgZm9udC1mYW1pbHk6ICJHaWxsIFNhbnMiLCBzYW5zLXNlcmlmOw0KfQ0KDQpoNC5hdXRob3IgeyAvKiBIZWFkZXIgNCAtIGFuZCB0aGUgYXV0aG9yIGFuZCBkYXRhIGhlYWRlcnMgdXNlIHRoaXMgdG9vICAqLw0KICBmb250LXNpemU6IDE1cHg7DQogIGZvbnQtd2VpZ2h0OiBib2xkOw0KICBmb250LWZhbWlseTogc3lzdGVtLXVpOw0KICBjb2xvcjogbmF2eTsNCiAgdGV4dC1hbGlnbjogY2VudGVyOw0KfQ0KDQpoNC5kYXRlIHsgLyogSGVhZGVyIDQgLSBhbmQgdGhlIGF1dGhvciBhbmQgZGF0YSBoZWFkZXJzIHVzZSB0aGlzIHRvbyAgKi8NCiAgZm9udC1zaXplOiAxOHB4Ow0KICBmb250LXdlaWdodDogYm9sZDsNCiAgZm9udC1mYW1pbHk6ICJHaWxsIFNhbnMiLCBzYW5zLXNlcmlmOw0KICBjb2xvcjogRGFya0JsdWU7DQogIHRleHQtYWxpZ246IGNlbnRlcjsNCn0NCg0KaDEgeyAvKiBIZWFkZXIgMSAtIGFuZCB0aGUgYXV0aG9yIGFuZCBkYXRhIGhlYWRlcnMgdXNlIHRoaXMgdG9vICAqLw0KICAgIGZvbnQtc2l6ZTogMjBweDsNCiAgICBmb250LXdlaWdodDogYm9sZDsNCiAgICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsNCiAgICBjb2xvcjogZGFya3JlZDsNCiAgICB0ZXh0LWFsaWduOiBsZWZ0Ow0KfQ0KDQpoMiB7IC8qIEhlYWRlciAyIC0gYW5kIHRoZSBhdXRob3IgYW5kIGRhdGEgaGVhZGVycyB1c2UgdGhpcyB0b28gICovDQogICAgZm9udC1zaXplOiAxOHB4Ow0KICAgIGZvbnQtd2VpZ2h0OiBib2xkOw0KICAgIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICAgIGNvbG9yOiBuYXZ5Ow0KICAgIHRleHQtYWxpZ246IGxlZnQ7DQp9DQoNCmgzIHsgLyogSGVhZGVyIDMgLSBhbmQgdGhlIGF1dGhvciBhbmQgZGF0YSBoZWFkZXJzIHVzZSB0aGlzIHRvbyAgKi8NCiAgICBmb250LXNpemU6IDE2cHg7DQogICAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogICAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7DQogICAgY29sb3I6IG5hdnk7DQogICAgdGV4dC1hbGlnbjogbGVmdDsNCn0NCg0KaDQgeyAvKiBIZWFkZXIgNCAtIGFuZCB0aGUgYXV0aG9yIGFuZCBkYXRhIGhlYWRlcnMgdXNlIHRoaXMgdG9vICAqLw0KICAgIGZvbnQtc2l6ZTogMTRweDsNCiAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogICAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7DQogICAgY29sb3I6IGRhcmtyZWQ7DQogICAgdGV4dC1hbGlnbjogbGVmdDsNCn0NCg0KLyogQWRkIGRvdHMgYWZ0ZXIgbnVtYmVyZWQgaGVhZGVycyAqLw0KLmhlYWRlci1zZWN0aW9uLW51bWJlcjo6YWZ0ZXIgew0KICBjb250ZW50OiAiLiI7DQoNCmJvZHkgeyBiYWNrZ3JvdW5kLWNvbG9yOndoaXRlOyB9DQoNCi5oaWdobGlnaHRtZSB7IGJhY2tncm91bmQtY29sb3I6eWVsbG93OyB9DQoNCnAgeyBiYWNrZ3JvdW5kLWNvbG9yOndoaXRlOyB9DQoNCn0NCmBgYA0KDQoNCmBgYCB7ciBzZXR1cCwgaW5jbHVkZT1GfQ0KIyBTZXR1cCBDaHVuaw0KDQojIFNldHMgdGhlIHdvcmtpbmcgZGlyZWN0b3J5ICh3ZCkgYXMgdGhlIHdvcmtpbmcgZm9sZGVyDQpzZXR3ZCgifi9TVEEgMzE5IFNwcmluZyAyMDI2IikNCg0KIyBJbXBvcnQgdGhlIFdOQkEgZGF0YSBzZXQgdG8gZ2V0IGluZm9ybWF0aW9uIGFib3V0IHRoZSBTZWF0dGxlIFN0b3Jtcw0KZGF0YSA9IHJlYWQuY3N2KCJXTkJBXzIwMjVfYm94LXNjb3Jlcy5jc3YiLCBoZWFkZXIgPSBUKQ0KDQojIExpYnJhcmllcyB3ZSB3aWxsIGJlIHVzaW5nIHRocm91Z2hvdXQgdGhpcyBwcm9qZWN0DQojIA0KbGlicmFyeShnZ3Bsb3QyKQ0KIyANCmxpYnJhcnkoZHBseXIpDQojIFZJRiBpbiBjYXIgcGFja2FnZQ0KbGlicmFyeShjYXIpDQojIA0KbGlicmFyeShvbHNycikNCg0KIyBQYWNrYWdlIGZvciBuaWNlciBtYXJrZG93biB0YWJsZXMNCmxpYnJhcnkoa2FibGVFeHRyYSkNCg0KIyBOaWNlciBUYWJsZXMgZm9yIFJlZ3Jlc3Npb24gYW5kIHN0dWZmDQpsaWJyYXJ5KHN0YXJnYXplcikNCg0KDQpgYGANCg0KIyBEYXRhDQoNCmBgYCB7ciB3cmFuZ2xpbmcsIGluY2x1ZGUgPSBGfQ0KIyBEYXRhIFdyYW5nbGluZyBDaHVuaw0KDQpzdW1tYXJ5KGRhdGEpDQoNCiMgRmlsdGVyaW5nIG91dCBBbGwgU3RhciBHYW1lcyAoUHJpbWFyeSB1c2UgaGVyZSkNCmRmID0gZGF0YSAlPiUNCiAgZmlsdGVyKHRlYW1faWQgPCAyMSkNCg0KIyBBbHRlcm5hdGUgd2F5IG9mIGZpbHRlcmluZyBvdXQgdGhlIEFsbCBTdGFyIEdhbWVzDQpkZjIgPSBkYXRhICU+JQ0KICBmaWx0ZXIoKHRlYW1fbmFtZSAhPSAiVGVhbSBXTkJBIiAmIHRlYW1fbmFtZSAhPSAiVGVhbSBVU0EiKSkNCg0KIyBHcm91cCBkYXRhIGJ5IHRlYW0sIGZpbmRzIG1lYW4vc2Qgb2YgYWxsIHZhcmlhYmxlcw0KDQpzdW1tYXJ5QyA9IGRmICU+JQ0KICBncm91cF9ieSh0ZWFtX25hbWUpICU+JQ0KICBzdW1tYXJpc2UobWVhbl9zY29yZSA9IG1lYW4odGVhbV9zY29yZSksIHNkX3Njb3JlID0gc2QodGVhbV9zY29yZSksIA0KICAgICAgICAgICAgbWVhbl9yZWJvdW5kcz1tZWFuKHRvdGFsX3JlYm91bmRzKSwgc2RfcmVib3VuZHM9c2QodG90YWxfcmVib3VuZHMpLA0KICAgICAgICAgICAgbWVhbl9mZ3A9bWVhbihmaWVsZF9nb2FsX3BjdCksIHNkX2ZncD1zZChmaWVsZF9nb2FsX3BjdCksDQogICAgICAgICAgICBtZWFuXzNwcD1tZWFuKHRocmVlX3BvaW50X2ZpZWxkX2dvYWxfcGN0KSwgc2RfM3BwPXNkKHRocmVlX3BvaW50X2ZpZWxkX2dvYWxfcGN0KSwNCiAgICAgICAgICAgIG1lYW5fc3RlYWxzPW1lYW4oc3RlYWxzKSwgc2Rfc3RlYWxzPXNkKHN0ZWFscykpDQoNCiMgR2l2ZXMgYSBzdW1tYXJ5IG9mIHRoZSB2YXJpYWJsZXMNCnN1bW1hcnlDDQoNCg0KIyBOZXcgRGF0YSBGcmFtZSBvbmx5IHVzaW5nIHRlYW1fc2NvcmUsIGZpZWxkX2dvYWxfcGVyY2VudCwgcmVib3VuZHMsIDMtUG9pbnQNCiMgUGVyY2VudGFnZSwgYW5kIFN0ZWFscw0KIyBGaWx0ZXJzIG91dCBldmVyeSB0ZWFtIGJ1dCB0aGUgU2VhdHRsZSBTdG9ybXMgIlN0b3JtIg0KDQpteV90ZWFtID0gZGYgJT4lDQogIHNlbGVjdCh0ZWFtX3Njb3JlLCBmaWVsZF9nb2FsX3BjdCwgdG90YWxfcmVib3VuZHMsIA0KICAgICAgICAgdGhyZWVfcG9pbnRfZmllbGRfZ29hbF9wY3QsIHN0ZWFscywgdGVhbV9uYW1lLCB0ZWFtX3dpbm5lcikgJT4lDQogIGZpbHRlcih0ZWFtX25hbWUgPT0gIlN0b3JtIikNCg0KIyBHcm91cHMgY2FzZXMgYnkgd2luIHZzLiBsb3NzDQojIFN1bW1hcml6ZXMgYWxsIHZhcmlhYmxlcyB3aXRoIG1lYW4gYW5kIHNkDQoNCm15X3RlYW1fcyA9IG15X3RlYW0gJT4lDQogIGdyb3VwX2J5KHRlYW1fd2lubmVyKSAlPiUNCiAgc3VtbWFyaXNlKG1lYW4gPSBtZWFuKHRlYW1fc2NvcmUpLCBzZCA9IHNkKHRlYW1fc2NvcmUpKQ0KDQpteV90ZWFtX3MNCg0KDQojTXV0YXRlIGFuZCBjYXNlX3doZW4NCg0KZGZfaGlzdCA9IGRmICU+JQ0KICBmaWx0ZXIodGVhbV9uYW1lID09ICJTdG9ybSIpICU+JQ0KICBtdXRhdGUocmVzdWx0ID0gY2FzZV93aGVuKHRlYW1fd2lubmVyID09IFRSVUUgfiAiV2luIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlYW1fd2lubmVyID09IEZBTFNFIH4gIkxvc3MiKSkNCg0KDQoNCmBgYA0KDQoNClRoaXMgZGF0YSBzZXQgaXMgYWxsIGFib3V0IGFsbCAyMDI1IFdOQkEgZ2FtZXMgd2hpY2ggaW5jbHVkZXMgYWxsIHN0YXIgZ2FtZXMuDQokfiQNCg0KVGhlIGZpbHRlcmVkIGRhdGEgc2V0IHRha2VzIG91dCB0aGUgYWxsIHN0YXIgZ2FtZXMgYW5kIG9ubHkgbG9va3MgYXQgdGhlIHRlYW1zIHdpdGhpbiB0aGUgV05CQS4NCiR+JA0KDQpBZnRlciBmaWx0ZXJpbmcgb3V0IHRoZSBhbGwgc3RhciBnYW1lcywgd2Ugd2FudCB0byBwcmVkaWN0IHNwZWNpZmljYWxseSB0aGUgdGVhbSBzY29yZSBvZiB0aGUNCm1lZGlhbiBTZWF0dGxlIFN0b3JtcyBnYW1lIHVzaW5nIGEgc3RhdGlzdGljYWwgbW9kZWwuDQoNCmBgYHtyIHRhYmxlcywgaW5jbHVkZT1UUlVFLCBjb21tZW50PU5BfQ0KDQojIEtlZXAgaW4gY2FzZSwgYmVsb3cgY3JlYXRlcyBhIHNpbXBsZSB0YWJsZQ0KI2thYmxlKHN1bW1hcnlDKQ0KDQojICJGYW5jeSBUYWJsZSIgZm9yIGxlYWd1ZSBzdW1tYXJ5DQpzdW1tYXJ5QyAlPiUNCiAga2JsKGRpZ2l0cyA9IDIsIGNhcHRpb24gPSAiMjAyNSBMZWFndWUgU3RhdHMiKSAlPiUNCiAga2FibGVfY2xhc3NpY18yKGZ1bGxfd2lkdGggPSBGKQ0KDQojIEtlZXAgaW4gY2FzZSwgYmVsb3cgY3JlYXRlcyBhIHNpbXBsZSB0YWJsZQ0KI2thYmxlKG15X3RlYW1fcykNCg0KIyAiRmFuY3kgVGFibGUiIGZvciB3aW4gYW5kIGxvc3MgbWVkaWFuL3ZhcmlhbmNlDQpteV90ZWFtX3MgJT4lDQogIGtibChkaWdpdHMgPSAyLCBjYXB0aW9uID0gIjIwMjUgU2VhdHRsZSBTdG9ybXMgV2luL0xvc3MgTWVhbnMgYW5kIFN0YW5kYXJkIERldmlhdGlvbnMiKSAlPiUNCiAga2FibGVfY2xhc3NpYyhmdWxsX3dpZHRoID0gRikNCg0KDQpgYGANCg0KIyBIaXN0b2dyYW0gYW5kIEJveHBsb3QNCg0KYGBge3IgZ3JhcGhzLCBpbmNsdWRlID0gVCwgZmlnLndpZHRoID0gNCwgZmlnLmhlaWdodCA9IDQsIG1lc3NhZ2UgPSBGfQ0KIyMjU2lkZSBieSBzaWRlIGhpc3RvZ3JhbXMNCg0KcCA9IGRmX2hpc3QgJT4lDQogIGdncGxvdCggYWVzKHg9dGVhbV9zY29yZSwgZmlsbD1yZXN1bHQpKSArDQogIGdlb21faGlzdG9ncmFtKCBjb2xvcj0iI2U5ZWNlZiIsIGFscGhhPTAuNiwgcG9zaXRpb24gPSAnaWRlbnRpdHknKSArDQogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcz1jKCIjMkM1MjM0IiwgIiNGQkUxMjIiKSkNCnANCg0KYm94cGxvdCh0ZWFtX3Njb3JlIH4gcmVzdWx0LCBkYXRhID0gZGZfaGlzdCwNCiAgICAgICAgY29sID0gYygiIzJDNTIzNCIsICIjRkJFMTIyIiksDQogICAgICAgIG1haW4gPSAiUG9pbnRzIHNjb3JlZCBieSBnYW1lIHJlc3VsdCIsDQogICAgICAgIHhsYWIgPSAiUmVzdWx0IiwgeWxhYiA9ICJQb2ludHMiKQ0KDQpgYGANCg0KVGhlc2UgZ3JhcGhzIHNob3cgdXMgdGhhdCB0aGUgYXZlcmFnZSB0ZWFtIHNjb3JlIGZvciBhIHdpbiBpcyBoaWdoZXIgdGhhbiBhIGxvc3MuIA0KVGhpcyBjYW4gYmUgc2VlbiBlYXNpZXIgaW4gdGhlIGJveCBwbG90IHNpbmNlIHRoZSBtZWRpYW4gaXMgaGlnaGVyIGluIHRoZSBib3ggcGxvdCByZXByZXNlbnRpbmcgdGhlIHdpbm5pbmcgZ2FtZXMgdGVhbSBzY29yZS4NCg0KJH4kDQoNCiMgTW9kZWxzDQoNCg0KYGBgIHtyIGZpcnN0IG9yZGVyIG1vZGVsLCBlY2hvID0gRiwgaW5jbHVkZSA9IEZ9DQoNCiMgRmlyc3QgT3JkZXIgTW9kZWwNCm1vZGVsMSA9IGxtKHRlYW1fc2NvcmUgfiBmaWVsZF9nb2FsX3BjdCArIHRvdGFsX3JlYm91bmRzKyANCiAgICAgICAgIHRocmVlX3BvaW50X2ZpZWxkX2dvYWxfcGN0KyBzdGVhbHMsDQogICAgICAgICBkYXRhID0gbXlfdGVhbSkNCg0Kc3VtbWFyeShtb2RlbDEpDQoNCiMgR2l2ZXMgdXMgdGhlIFZJRiBmb3Igb3VyIDFzdCBtb2RlbCB0byBmaW5kIG11bHRpY29sbGluZWFyaXR5DQp2aWYobW9kZWwxKQ0KDQojIEdpdmVzIHVzIG9ubHkgaW5kZXBlbmRlbnQgdmFyaWFibGVzDQpjb3JfZGF0YSA9IG15X3RlYW0gJT4lDQogIHNlbGVjdChmaWVsZF9nb2FsX3BjdCwgdG90YWxfcmVib3VuZHMsIHRocmVlX3BvaW50X2ZpZWxkX2dvYWxfcGN0LA0KICAgICAgICAgc3RlYWxzKQ0KDQojIEdpdmVzIHVzIGEgY29ycmVsYXRpb24gbWF0cml4IGJldHdlZW4gb3VyIGluZGVwZW5kZW50IHZhcmlhYmxlcw0KY29yKGNvcl9kYXRhKQ0KDQoNCiMgTm8gbmVlZCBmb3IgbW9kZWwgMiBhcyB0aGVyZSB3ZXJlIG5vIGhpZ2hseSBjb3JyZWxhdGVkIHBhaXJzICh8cnw+IDAuOCkNCiMgVklGIHZhbHVlcyBhbHNvIGxvb2sgZmluZSwgbm90aGluZyBhYm92ZSA0DQojIFNob3J0ZW5lZCB0b3RhbCByZWJvdW5kcyB0byB0ciBmb3Igd3JpdGluZyBwdXJwb3NlcyBpbiBuYXJyYXRpdmUNCg0KYGBgDQoNCk91ciBmaXJzdCBvcmRlciBtb2RlbCBjb25zaXN0cyBvZiBhIGRlcGVuZGVudCB2YXJpYWJsZSB0ZWFtX3Njb3JlIGFuZCBpbmRlcGVuZGVudA0KdmFyaWFibGVzIGZpZWxkX2dvYWxfcGN0IChmZyUpLCB0b3RhbF9yZWJvdW5kcyAodHIpLCB0aHJlZV9wb2ludF9maWVsZF9nb2FsX3BjdCAoMy1wdCAlKSwNCmFuZCBzdGVhbHMuDQoNClRoZSBlcXVhdGlvbiBmb3IgdGhpcyBmaXJzdCBvcmRlciBtb2RlbCBpcyB0ZWFtX3Njb3JlID0gYHIgbW9kZWwxJGNvZWZmaWNpZW50c1sxXWAgKyBgciBtb2RlbDEkY29lZmZpY2llbnRzWzJdYCAqIGZnJSArDQpgciBtb2RlbDEkY29lZmZpY2llbnRzWzNdYCAqIHRyICsgYHIgbW9kZWwxJGNvZWZmaWNpZW50c1s0XWAgKiAzLXB0ICUgKw0KYHIgbW9kZWwxJGNvZWZmaWNpZW50c1s1XWAgKiBzdGVhbHMuDQoNCiR+JA0KDQpBZnRlciB1c2luZyB0aGUgdmlmIGNvbW1hbmQsIHdlIGZvdW5kIG5vIG11bHRpY29sbGluZWFyaXR5IGlzc3VlcyB3aXRoaW4gb3VyIHZhcmlhYmxlcw0KYXMgYWxsIHZhbHVlcyB3ZXJlIGJldHdlZW4gMSBhbmQgMi4NCg0KJH4kDQoNCkxvb2tpbmcgYXQgdGhlIGNvcnJlbGF0aW9uIG1hdHJpeCwgd2UgZm91bmQgdGhhdCBubyB2YXJpYWJsZXMgd2VyZSBoaWdobHkgY29ycmVsYXRlZA0Kd2l0aCBlYWNoIG90aGVyLiBUaGUgaGlnaGVzdCBjb3JyZWxhdGlvbiBjb2VmZmljaWVudCBzZWVuIHdhcyAwLjUyIGJ1dCB0aGF0IGlzIHVuZGVyDQp0aGUgdGhyZXNob2xkIGZvciBoaWdoIGNvcnJlbGF0aW9uLg0KDQokfiQNCg0KIyBJbnRlcmFjdGlvbiBNb2RlbA0KDQpgYGAge3IgaW50ZXJhY3Rpb24gbW9kZWwsIHJlc3VsdHMgPSAnYXNpcycsIGVjaG8gPSBGLCBpbmNsdWRlID0gRiwgY29tbWVudD1OQX0NCg0KIyBGdWxsIGludGVyYWN0aW9uIG1vZGVsIChDb25zaWRlcmVkIE1vZGVsIDMgZHVlIHRvIGFzc2lnbm1lbnQpDQptb2RlbDMgPSBsbSh0ZWFtX3Njb3JlIH4gZmllbGRfZ29hbF9wY3QgKyB0b3RhbF9yZWJvdW5kcyANCiAgICAgICAgICsgdGhyZWVfcG9pbnRfZmllbGRfZ29hbF9wY3QrIHN0ZWFscw0KICAgICAgICAgKyBmaWVsZF9nb2FsX3BjdCAqIHRvdGFsX3JlYm91bmRzIA0KICAgICAgICAgKyBmaWVsZF9nb2FsX3BjdCAqIHRocmVlX3BvaW50X2ZpZWxkX2dvYWxfcGN0DQogICAgICAgICArIGZpZWxkX2dvYWxfcGN0ICogc3RlYWxzDQogICAgICAgICArIHRvdGFsX3JlYm91bmRzICogdGhyZWVfcG9pbnRfZmllbGRfZ29hbF9wY3QNCiAgICAgICAgICsgdG90YWxfcmVib3VuZHMgKiBzdGVhbHMNCiAgICAgICAgICsgdGhyZWVfcG9pbnRfZmllbGRfZ29hbF9wY3QgKiBzdGVhbHMgDQogICAgICAgICAsIGRhdGEgPSBteV90ZWFtKQ0KDQojIFN1bW1hcml6ZXMgbW9kZWwgMw0Kc3VtbWFyeShtb2RlbDMpDQoNCg0KDQojIEludGVyYWN0aW9uIE1vZGVsIEFkanVzdGVkIGZvciB3aGVuIGFscGhhID0gMC4xNSAoQWthIFAgPiAwLjE1KQ0KIyBObyBpbnRlcmFjdGlvbiB0ZXJtIHdhcyBzaWduaWZpY2FudCBhdCBhbHBoYSA9IDAuMTUNCiMgQ2xvc2VzdCBvbmUgd2FzIHRvdGFsX3JlYm91bmRzICogdGhyZWVfcG9pbnRfZmllbGRfZ29hbF9wY3QgYXQgcCA9IDAuMjEyNDMNCg0KbW9kZWw0ID0gbG0odGVhbV9zY29yZSB+IGZpZWxkX2dvYWxfcGN0ICsgdG90YWxfcmVib3VuZHMgDQogICAgICAgICArIHRocmVlX3BvaW50X2ZpZWxkX2dvYWxfcGN0KyBzdGVhbHMsIGRhdGEgPSBteV90ZWFtKQ0KDQojIFN1bW1hcml6ZXMgbW9kZWwgNCBmb3IgdmlzdWFsaXphdGlvbg0KbW9kZWw0c3VtID0gc3VtbWFyeShtb2RlbDQpDQoNCmBgYA0KDQpgYGB7ciBleHBlcmltZW50LCBpbmNsdWRlID0gRiwgZWNobyA9IEZ9DQojIEV4cGVyaW1lbnRhbCBNb2RlbCwgbm90IGZvciBhY3R1YWwgZ3JhZGluZw0KIyBXYW50ZWQgdG8gc2VlIGlmIHRoZXJlIHdlcmUgYW55IHRlcm1zIHRoYXQgaGFkIGEgYmV0dGVyDQojIGFkai4gUl4yIHRoYW4gdGhlIGJhc2UgbW9kZWwNCm1vZGVsRSA9IGxtKHRlYW1fc2NvcmUgfiBmaWVsZF9nb2FsX3BjdCArIHRvdGFsX3JlYm91bmRzIA0KICAgICAgICAgKyB0aHJlZV9wb2ludF9maWVsZF9nb2FsX3BjdCsgc3RlYWxzDQogICAgICAgICArIHRvdGFsX3JlYm91bmRzICogdGhyZWVfcG9pbnRfZmllbGRfZ29hbF9wY3QNCiAgICAgICAgICwgZGF0YSA9IG15X3RlYW0pDQoNCnN1bW1hcnkobW9kZWxFKQ0KDQpzdW1tYXJ5KG1vZGVsNCkNCg0KYGBgDQoNCmBgYCB7ciBpbmxpbmUgY29kZSwgaW5jbHVkZT1GfQ0KIyBUaGUgc3R1ZmYgaW4gcmVkIGlzIHRha2VuIGZyb20gdGhlIGdsb2JhbCBlbnZpcm9ubWVudCwgZm9ybWF0dGluZyBpcw0KIyBhIGxpdHRsZSB3ZWlyZCB0aG8sIG1ha2Ugc3VyZSB0byBjaGVjayBhbnkgZm9ybWF0dGluZyBlcnJvcnMNCiMgU3VwZXIgc2NyaXB0cyBhcmUgZG9uZSBieSBeZnVubnl0aGluZ14NCiMgJH4kIGNyZWF0ZXMgYSBibGFuayBzcGFjZQ0KIyA8YnI+IGNyZWF0ZXMgYSA8YnI+ZWFrLCB1c2VmdWwgZm9yIHRoZSBncmFwaCBsYXRlciBvbg0KYGBgDQoNClRoZSBmdWxsIGludGVyYWN0aW9uIG1vZGVsIGZvciBwcmVkaWN0aW5nIHRlYW0gc2NvcmUgZm9yIHRoZSBTZWF0dGxlIFN0b3JtcyBpcw0KdGVhbV9zY29yZSA9IGByIG1vZGVsMyRjb2VmZmljaWVudHNbMV1gICsgIGByIG1vZGVsMyRjb2VmZmljaWVudHNbMl1gICogZmclICsNCiBgciBtb2RlbDMkY29lZmZpY2llbnRzWzNdYCAqIHRyICsgIGByIG1vZGVsMyRjb2VmZmljaWVudHNbNF1gICogMy1wdCAlICsNCiBgciBtb2RlbDMkY29lZmZpY2llbnRzWzVdYCAqIHN0ZWFscyArICBgciBtb2RlbDMkY29lZmZpY2llbnRzWzZdYCAqIGZnJSAqIHRyICsNCiBgciBtb2RlbDMkY29lZmZpY2llbnRzWzddYCAqIGZnJSAqIDMtcHQgJSArIGByIG1vZGVsMyRjb2VmZmljaWVudHNbOF1gICogZmclICogc3RlYWxzICsNCiBgciBtb2RlbDMkY29lZmZpY2llbnRzWzldYCAqIHRyICogMy1wdCUgKw0KIGByIG1vZGVsMyRjb2VmZmljaWVudHNbMTBdYCAqIHRyICogc3RlYWxzICsNCiBgciBtb2RlbDMkY29lZmZpY2llbnRzWzExXWAgKiAzLXB0JSAqIHN0ZWFscy4NCiANCiR+JA0KDQpGb3IgYSBjbGVhbmVyIGxvb2sgZm9yIHRoZSBmdWxsIGludGVyYWN0aW9uIG1vZGVsLCBsb29rIGJlbG93Lg0KDQpgYGAge3IgZnVsbGludGVyYWN0aW9uZ3JhcGgsIGluY2x1ZGUgPSAgVCwgZWNobyA9IEYsIHJlc3VsdHMgPSAnYXNpcyd9DQojIG1lc3NhZ2UgPSBGIGdldHMgcmlkIG9mIGEgZnV0dXJlIG1lc3NhZ2UsIEkgZGlkbid0IGhhdmUgdGhhdCBwcm9ibGVtIGhlcmUNCmxpYnJhcnkoc3RhcmdhemVyKQ0KDQojIE1ha2VzIGEgbmljZSBsb29raW5nIHRhYmxlIGZvciBvdXIgZmluYWwgbW9kZWwNCnN0YXJnYXplcihtb2RlbDMsIHR5cGUgPSAiaHRtbCIpDQpgYGANCg0KJH4kDQoNCldoZW4gcmVkdWNpbmcgdGhpcyBtb2RlbCwgd2Ugd2VyZSBnaXZlbiB0aGUgbGltaXQgb2YgJFxhbHBoYSQgPSAwLjE1Lg0KV2hpbGUgcmVkdWNpbmcsIEkga2VwdCBub3RlIG9mIHRoZSBhZGp1c3RlZCBSXjJeIHZhbHVlIGp1c3QgdG8gc2VlIGlmIGFuIGludGVyYWN0aW9uDQp0ZXJtIHdhcyBub3Qgc2lnbmlmaWNhbnQgYnV0IHByZWRpY3RlZCB0ZWFtIHNjb3JlIGJldHRlci4NCg0KJH4kDQoNCldoaWxlIHJlZHVjaW5nLCBJIGVuZGVkIHVwIHJlZHVjaW5nIGFsbCBpbnRlcmFjdGlvbiB0ZXJtcyBleGNlcHQgZm9yIHRvdGFsIHJlYm91bmRzICh0cikNCmFuZCAzLXB0ICUgYW5kIHRvb2sgbm90ZSB0aGF0IHdoaWxlIHRoZSBpbnRlcmFjdGlvbiB0ZXJtIHdhcyBub3Qgc2lnbmlmaWNhbnQgYXQNCiRcYWxwaGEkID0gMC4xNSwgYWRqdXN0ZWQgUl4yXiB3YXMgMC42NDI5IHdoaWNoIHdhcyBoaWdoZXIgdGhhbiB0aGUgYmFzZSBtb2RlbC4NCg0KJH4kDQoNCk15IGZpbmFsIG1vZGVsIGlzIHRlYW1fc2NvcmUgPSBgciBtb2RlbDQkY29lZmZpY2llbnRzWzFdYCArIGByIG1vZGVsNCRjb2VmZmljaWVudHNbMl1gICogZmclICsNCmByIG1vZGVsNCRjb2VmZmljaWVudHNbM11gICogdHIgKyBgciBtb2RlbDQkY29lZmZpY2llbnRzWzRdYCAqIDMtcHQgJSArDQpgciBtb2RlbDQkY29lZmZpY2llbnRzWzVdYCAqIHN0ZWFscy4NCg0KDQpUaGlzIG1vZGVsIHNpZ25pZmljYW50bHkgcHJlZGljdHMgdGVhbSBzY29yZSwgZihgciBtb2RlbDRzdW0kZnN0YXRpc3RpY1syXWAsYHIgbW9kZWw0c3VtJGZzdGF0aXN0aWNbM11gKSA9IGByIG1vZGVsNHN1bSRmc3RhdGlzdGljWzFdYCwgDQpwLCBhZGp1c3RlZCBSXjJeID0gYHIgbW9kZWw0c3VtJGFkai5yLnNxdWFyZWRgDQoNClNlZSB0YWJsZSBiZWxvdyBmb3IgYSBjbGVhcmVyIGxvb2sgZm9yIHRoZSBmaW5hbCBtb2RlbC4NCg0KYGBgIHtyLCBpbmNsdWRlID0gVCwgZWNobyA9IEYsIHJlc3VsdHMgPSAnYXNpcyd9DQojIG1lc3NhZ2UgPSBGIGdldHMgcmlkIG9mIGEgZnV0dXJlIG1lc3NhZ2UsIEkgZGlkbid0IGhhdmUgdGhhdCBwcm9ibGVtIHRob3VnaCBoZXJlDQpsaWJyYXJ5KHN0YXJnYXplcikNCg0KIyBNYWtlcyBhIG5pY2UgbG9va2luZyB0YWJsZSBmb3Igb3VyIGZpbmFsIG1vZGVsDQpzdGFyZ2F6ZXIobW9kZWw0LCB0eXBlID0gImh0bWwiKQ0KYGBgDQoNCiR+JA0KDQojIFJlc2lkdWFsIEFuYWx5c2lzDQoNCmBgYCB7ciByZXNpZHVhbCBhbmFseXNpcywgaW5jbHVkZSA9IFQsIGZpZy53aWR0aCA9IDQsIGZpZy5oZWlnaHQgPSA0fQ0KDQojIEdpdmVzIHVzIHRoZSB2ZXJzdXMgZml0cyBwbG90IHRvIGFzc2VzIGNvbnN0YW50IHZhcmlhbmNlDQpvbHNfcGxvdF9yZXNpZF9maXQobW9kZWw0KQ0KDQojIEdpdmVzIHVzIHRoZSBoaXN0b2dyYW0gb2YgdGhlIHJlc2lkdWFscyB0byBhc3NlcyBub3JtYWxpdHkgb2YgdGhlIHJlc2lkdWFscw0Kb2xzX3Bsb3RfcmVzaWRfaGlzdChtb2RlbDQpDQoNCiMgR2l2ZXMgdXMgdGhlIHZpZXcgZm9yIGFueSBvdXRsaWVycyBpbiB0aGUgZGF0YQ0Kb2xzX3Bsb3RfcmVzaWRfc3R1ZChtb2RlbDQpDQoNCiMgR2l2ZXMgdXMgYm90aCBsZXZlcmFnZSBhbmQgb3V0bGllcnMgaW4gdGhlIGRhdGENCm9sc19wbG90X3Jlc2lkX2xldihtb2RlbDQsIHRocmVzaG9sZCA9IDMpDQoNCiMgR2l2ZXMgdXMgdGhlIGNvb2tzIGQgY2hhcnQgZm9yIHNpZ25pZmljYW50IHZhbHVlcw0Kb2xzX3Bsb3RfY29va3NkX2NoYXJ0KG1vZGVsNCkNCg0KDQoNCg0KYGBgDQoNCjxicj4NCiR+JA0KDQpGb3Igb3VyIHJlc2lkdWFsIGFuYWx5c2lzLCBmcm9tIHRoZSBoaXN0b2dyYW0sIHdlIGNhbiB0ZWxsIHRoYXQgdGhlIGRpc3RyaWJ1dGlvbiBvZiB0aGUgcmVzaWR1YWxzIGlzIGFwcHJveGltYXRlbHkgbm9ybWFsIHdpdGggc29tZSBza2V3bmVzcyBmcm9tIHRoZSBsZWZ0LiBGcm9tIG91ciB2ZXJzdXMgZml0cyBwbG90LCB3ZSBjYW5ub3Qgc2VlIGEgcGF0dGVybiB3aXRoaW4gdGhlIHZhcmlhbmNlIHNvIHdlIGNhbiBzYXkgdGhhdCB0aGVyZSBpcyBjb25zdGFudCB2YXJpYW5jZSBmb3Igb3VyIHJlc2lkdWFscyBhcyB3ZWxsLiBFdmVuIHdpdGggYSBzbGlnaHRseSBza2V3ZWQgaGlzdG9ncmFtLCBJIHRoaW5rIHRoYXQgd2UgY2FuIHVzZSB0aGlzIHJlZ3Jlc3Npb24gbGluZSBhcyBhIHNvbGlkIHByZWRpY3RvciBmb3IgdGhlIFNlYXR0bGUgU3Rvcm1zIHRlYW0gc2NvcmUuDQoNCldlIGhhdmUgaW5mbHVlbnRpYWwgdmFsdWVzIGF0IGdhbWVzIDEwLCAxMiwgMzcsIGFuZCA0MS4NCiR+JA0KDQpXZSBhbHNvIGhhdmUgbGV2ZXJhZ2UgcG9pbnRzIGF0IGdhbWVzIDEyLCAzNywgYW5kIDQxLg0KJH4kDQoNCkdhbWUgMTAgd2FzIGFnYWluc3QgdGhlIENvbm5lY3RpY3V0IFN1bnMuDQokfiQNCg0KR2FtZSAxMiB3YXMgYWdhaW5zdCB0aGUgTmV3IFlvcmsgTGliZXJ0aWVzLg0KJH4kDQoNCkdhbWUgMzcgd2FzIGFnYWluc3QgdGhlIFdhc2hpbmd0b24gTXlzdGljcy4NCiR+JA0KDQpHYW1lIDQxIHdhcyBhZ2FpbnN0IHRoZSBNaW5uZXNvdGEgTHlueC4NCg0KJH4kDQoNCiMgUHJlZGljdGlvbg0KDQpgYGAge3IgcHJlZGljdGlvbiwgaW5jbHVkZSA9IEZ9DQoNCiMgU3VtbWFyaXplcyBvdXIgdmFyaWFibGVzIHRvIGdyYWIgdGhlIGV4cGVyaW1lbnRhbCByZWdpb24gYW5kDQojIHRoZSBtZWRpYW4gZm9yIG91ciB2YXJpYWJsZXMNCnN1bW1hcnkoY29yX2RhdGEpDQoNCiMgTmV3IGRhdGEgZnJhbWUgZm9yIHRoZSBtZWRpYW4gZ2FtZXMNCm5ld2RhdGEgPSBkYXRhLmZyYW1lKGZpZWxkX2dvYWxfcGN0ID0gNDMuMDAsIHRvdGFsX3JlYm91bmRzID0gMzQuMDAsDQogICAgICAgICAgICAgICAgICAgICB0aHJlZV9wb2ludF9maWVsZF9nb2FsX3BjdCA9IDI5LjMwLCBzdGVhbHMgPSA5LjUpDQoNCiMgUHJlZGljdGluZyB0aGUgbWVkaWFuIGdhbWUgd2l0aCBhIDk1JSBjb25maWRlbmNlIGludGVydmFsDQptZWRpYW5fZ2FtZSA9IHByZWRpY3QobW9kZWw0LCBuZXdkYXRhLCBpbnRlcnZhbCA9ICJjb25maWRlbmNlIiwgbGV2ZWwgPSAuOTUpDQoNCmBgYA0KDQpJIGJ1aWx0IHRoZSBtb2RlbCB0byBwcmVkaWN0IG15IHRlYW0ncyBwb2ludHMgZm9yIGEgZ2FtZSBpbiB3aGljaCB0aGV5IGFjaGlldmUgdGhlIG1lZGlhbiB2YWx1ZSBmb3IgZWFjaCB2YXJpYWJsZS4gDQokfiQNCg0KVGhlIHByZWRpY3RlZCB0ZWFtIHNjb3JlIGlzIGByIG1lZGlhbl9nYW1lWzFdYCwgd2l0aCANCjk1JSBjb25maWRlbmNlIGludGVydmFsIChgciBtZWRpYW5fZ2FtZVsyXWAsIGByIG1lZGlhbl9nYW1lWzNdYCkuDQoNCg0KDQoNCg0K