Introduction
This data set includes the box scores for each WNBA team for every
game of the 2025 season. The team I will be analyzing is the Indiana
Fever. The goal of this project is to build the best model to predict
team score in a median game for the Indiana Fever.
Tables
The Summary Table provides the mean and standard deviation for each
teams score, rebounds, field goal percentage, 3 point field goal
percentage, and steals over the 2025 season for every WNBA team. My Team
Summary Table provides these same statistics for each game result, a win
or a loss, for the Indiana Fever.
summary_score %>%
kable(digits = 2, caption = "Summary Table") %>%
kable_paper(full_width = F, html_font = "Times New Roman")
Summary Table
|
team_name
|
mean_score
|
sd_score
|
mean_reb
|
sd_reb
|
mean_fgp
|
sd_fgp
|
mean_3fgp
|
sd_3fgp
|
mean_stl
|
sd_stl
|
|
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
|
my_team_result %>%
kable(digits = 2, caption = "My Team Summary Table") %>%
kable_paper(full_width = F, html_font = "Times New Roman")
My Team Summary Table
|
team_winner
|
mean_score
|
sd_score
|
mean_reb
|
sd_reb
|
mean_fgp
|
sd_fgp
|
mean_3fgp
|
sd_3fgp
|
mean_stl
|
sd_stl
|
|
FALSE
|
79.18
|
7.85
|
33.82
|
5.94
|
43.58
|
5.13
|
32.72
|
8.11
|
5.68
|
2.59
|
|
TRUE
|
90.35
|
9.29
|
36.50
|
4.71
|
47.74
|
4.87
|
37.50
|
9.44
|
6.10
|
1.94
|
Graphs
This section provides two graphs to analyze team score and game
results. The first graph is a histogram that shows the number of games
with certain scores, separated by wins(green) and losses(red). The next
graph is a box plot for scores of games, once again separated by wins
and losses.
p = df_hist %>%
ggplot(aes(x = team_score, fill = result)) +
geom_histogram(color="#e9ecef", alpha=0.6, position = "identity", binwidth = 2) +
scale_fill_manual(values = c("red", "green")) +
labs(fill="result",
title = "Histogram of Team Score by Game Result",
x = "Team Score",
y = "Number of games") +
theme(plot.title = element_text(hjust = 0.5))
p

boxplot(team_score ~ result, data = df_hist,
col = c("red", "green", "black"),
main = "Box Plot of Points Scored by Game Result",
xlab = "Result", ylab = "Points")

Models
\(~\)
To create my final model, I began with a first order model with 4
terms. I then created a correlation matrix to see that none of my
variables were highly correlated, and therefore could remain in the
model. Then I created a full interaction model with 6 interaction terms
and the original 4 first order terms. The only Interaction terms with a
p>0.15 were field_goal_pct:three_point_field_goal_pct and
total_rebounds:three_point_field_goal_pct, so they remained in the
modell while the other four were removed.
My final model is team_score = -84.9750256 + 2.1844956*
field_goal_pct + 1.5768015 * total_rebounds + 3.2460005 *
three_point_field_goal_pct + 0.285595 steals + -0.0347063*
field_goal_pctthree_point_field_goal_pct + -0.0364072
total_rebounds*three_point_field_goal_pct
This model significantly predicts team score, F(6,35)= 9.7732521,
p<0.001, adjusted R^2=0.5621506.
The following table summarizes this model:
|
|
|
|
Dependent variable:
|
|
|
|
|
|
team_score
|
|
|
|
field_goal_pct
|
2.184***
|
|
|
(0.784)
|
|
|
|
|
total_rebounds
|
1.577*
|
|
|
(0.787)
|
|
|
|
|
three_point_field_goal_pct
|
3.246**
|
|
|
(1.221)
|
|
|
|
|
steals
|
0.286
|
|
|
(0.499)
|
|
|
|
|
field_goal_pct:three_point_field_goal_pct
|
-0.035
|
|
|
(0.021)
|
|
|
|
|
total_rebounds:three_point_field_goal_pct
|
-0.036
|
|
|
(0.022)
|
|
|
|
|
Constant
|
-84.975*
|
|
|
(41.879)
|
|
|
|
|
|
|
Observations
|
42
|
|
R2
|
0.626
|
|
Adjusted R2
|
0.562
|
|
Residual Std. Error
|
6.729 (df = 35)
|
|
F Statistic
|
9.773*** (df = 6; 35)
|
|
|
|
Note:
|
p<0.1; p<0.05;
p<0.01
|
Residuals
This section provides the following residual plots: histogram, versus
fits plot, studentized residual plot, leverage plot, and a Cook’s
distance bar chart. The histogram shows a bell-shaped curve and the
versus fits plot shows no pattern or correlation. This indicates that
the conditions of normality and constant variance are met for this
model. The remaining plots show that observation 4 is an outlier with
high leverage. This game was played on 2024-09-15, when the fever faced
the wings. In this game, the Indiana Fever had a team score of 110
points, tying a franchise record for points scored in a game.
ols_plot_resid_fit(model4)

ols_plot_resid_hist(model4)

ols_plot_resid_stud(model4)

ols_plot_resid_lev(model4, threshold = 3)

ols_plot_cooksd_chart(model4)

Prediction
I built this model to predict my teams points for a game in which
they achieve the median value for each variable. The predicted team
score is 84.0296441, with a 95% confidence interval (81.4983101,
86.5609781 ).
LS0tDQp0aXRsZTogIlIgQXNzaWdubWVudCA2Ig0KYXV0aG9yOiAiTm9haCBLaW5nIg0KZGF0ZTogImByIFN5cy5EYXRlKClgIg0Kb3V0cHV0Og0KICBodG1sX2RvY3VtZW50OiANCiAgICB0b2M6IHllcw0KICAgIHRvY19kZXB0aDogNA0KICAgIHRvY19mbG9hdDogeWVzDQogICAgbnVtYmVyX3NlY3Rpb25zOiB5ZXMNCiAgICB0b2NfY29sbGFwc2VkOiB5ZXMNCiAgICBjb2RlX2ZvbGRpbmc6IGhpZGUNCiAgICBjb2RlX2Rvd25sb2FkOiB5ZXMNCiAgICBzbW9vdGhfc2Nyb2xsOiB5ZXMNCiAgICB0aGVtZTogbHVtZW4NCiAgcGRmX2RvY3VtZW50OiANCiAgICB0b2M6IHllcw0KICAgIHRvY19kZXB0aDogNA0KICAgIGZpZ19jYXB0aW9uOiB5ZXMNCiAgICBudW1iZXJfc2VjdGlvbnM6IHllcw0KICAgIGZpZ193aWR0aDogMw0KICAgIGZpZ19oZWlnaHQ6IDMNCiAgd29yZF9kb2N1bWVudDogDQogICAgdG9jOiB5ZXMNCiAgICB0b2NfZGVwdGg6IDQNCiAgICBmaWdfY2FwdGlvbjogeWVzDQogICAga2VlcF9tZDogeWVzDQplZGl0b3Jfb3B0aW9uczogDQogIGNodW5rX291dHB1dF90eXBlOiBpbmxpbmUNCi0tLQ0KDQoNCmBgYHtjc3MsIGVjaG8gPSBGQUxTRX0NCiNUT0M6OmJlZm9yZSB7DQogIGNvbnRlbnQ6ICJUYWJsZSBvZiBDb250ZW50cyI7DQogIGZvbnQtd2VpZ2h0OiBib2xkOw0KICBmb250LXNpemU6IDEuMmVtOw0KICBkaXNwbGF5OiBibG9jazsNCiAgY29sb3I6IGJsYWNrOw0KICBtYXJnaW4tYm90dG9tOiAxMHB4Ow0KfQ0KDQoNCmRpdiNUT0MgbGkgeyAgICAgLyogdGFibGUgb2YgY29udGVudCAgKi8NCiAgICBsaXN0LXN0eWxlOnVwcGVyLXJvbWFuOw0KICAgIGJhY2tncm91bmQtaW1hZ2U6bm9uZTsNCiAgICBiYWNrZ3JvdW5kLXJlcGVhdDpub25lOw0KICAgIGJhY2tncm91bmQtcG9zaXRpb246MDsNCn0NCg0KDQpoMS50aXRsZSB7IC8qIGxldmVsIDEgaGVhZGVyIG9mIHRpdGxlICAqLw0KICAgIGZvbnQtc2l6ZTogMjJweDsNCiAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogIGNvbG9yOiBibGFjazsNCiAgdGV4dC1hbGlnbjogY2VudGVyICFpbXBvcnRhbnQ7DQogIGZvbnQtZmFtaWx5OiAiR2lsbCBTYW5zIiwgc2Fucy1zZXJpZjsNCn0NCg0KDQpoNC5hdXRob3IgeyAvKiBIZWFkZXIgNCAtIGFuZCB0aGUgYXV0aG9yIGFuZCBkYXRhIGhlYWRlcnMgdXNlIHRoaXMgdG9vICAqLw0KICAgIGZvbnQtc2l6ZTogMTVweDsNCiAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogIGZvbnQtZmFtaWx5OiBzeXN0ZW0tdWk7DQogIGNvbG9yOiBncmV5Ow0KICB0ZXh0LWFsaWduOiBjZW50ZXIgIWltcG9ydGFudDsNCn0NCg0KDQpoNC5kYXRlIHsgLyogSGVhZGVyIDQgLSBhbmQgdGhlIGF1dGhvciBhbmQgZGF0YSBoZWFkZXJzIHVzZSB0aGlzIHRvbyAgKi8NCiAgICBmb250LXNpemU6IDE4cHg7DQogIGZvbnQtd2VpZ2h0OiBib2xkOw0KICBmb250LWZhbWlseTogIkdpbGwgU2FucyIsIHNhbnMtc2VyaWY7DQogIGNvbG9yOiBncmV5Ow0KICB0ZXh0LWFsaWduOiBjZW50ZXIgIWltcG9ydGFudDsNCn0NCg0KDQpoMSB7IC8qIEhlYWRlciAxIC0gYW5kIHRoZSBhdXRob3IgYW5kIGRhdGEgaGVhZGVycyB1c2UgdGhpcyB0b28gICovDQogICAgZm9udC1zaXplOiAyMHB4Ow0KICAgIGZvbnQtd2VpZ2h0OiBib2xkOw0KICAgIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICAgIGNvbG9yOiBibGFjazsNCiAgICB0ZXh0LWFsaWduOiBsZWZ0Ow0KfQ0KDQpoMiB7IC8qIEhlYWRlciAyIC0gYW5kIHRoZSBhdXRob3IgYW5kIGRhdGEgaGVhZGVycyB1c2UgdGhpcyB0b28gICovDQogICAgZm9udC1zaXplOiAxOHB4Ow0KICAgIGZvbnQtd2VpZ2h0OiBib2xkOw0KICAgIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICAgIGNvbG9yOiBibGFjazsNCiAgICB0ZXh0LWFsaWduOiBsZWZ0Ow0KfQ0KDQpoMyB7IC8qIEhlYWRlciAzIC0gYW5kIHRoZSBhdXRob3IgYW5kIGRhdGEgaGVhZGVycyB1c2UgdGhpcyB0b28gICovDQogICAgZm9udC1zaXplOiAxNnB4Ow0KICAgIGZvbnQtd2VpZ2h0OiBib2xkOw0KICAgIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICAgIGNvbG9yOiBCbGFjazsNCiAgICB0ZXh0LWFsaWduOiBsZWZ0Ow0KfQ0KDQpoNCB7IC8qIEhlYWRlciA0IC0gYW5kIHRoZSBhdXRob3IgYW5kIGRhdGEgaGVhZGVycyB1c2UgdGhpcyB0b28gICovDQogICAgZm9udC1zaXplOiAxNHB4Ow0KICBmb250LXdlaWdodDogYm9sZDsNCiAgICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsNCiAgICBjb2xvcjogZGFya3JlZDsNCiAgICB0ZXh0LWFsaWduOiBsZWZ0Ow0KfQ0KDQovKiBBZGQgZG90cyBhZnRlciBudW1iZXJlZCBoZWFkZXJzICovDQouaGVhZGVyLXNlY3Rpb24tbnVtYmVyOjphZnRlciB7DQogIGNvbnRlbnQ6ICIuIjsNCn0NCmJvZHkgeyBiYWNrZ3JvdW5kLWNvbG9yOndoaXRlOyB9DQoNCi5oaWdobGlnaHRtZSB7IGJhY2tncm91bmQtY29sb3I6eWVsbG93OyB9DQoNCnAgeyBiYWNrZ3JvdW5kLWNvbG9yOndoaXRlOyB9DQoNCg0KYGBgDQoNCmBgYHtSIHNldHVwLCBpbmNsdWRlPUZ9DQoNCnNldHdkKCJ+L1NUQSAzMTkiKQ0KDQpkYXRhPXJlYWQuY3N2KCJXTkJBXzIwMjVfYm94LXNjb3Jlcy5jc3YiLCBoZWFkZXI9VCkNCg0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkoY2FyKQ0KbGlicmFyeShvbHNycikNCmxpYnJhcnkoa2FibGVFeHRyYSkNCg0KDQoNCg0KYGBgDQoNCmBgYHtSIFdyYW5nbGluZywgaW5jbHVkZSA9IEZ9DQpzdW1tYXJ5KGRhdGEpDQoNCiNBbGwgV05CQSB0ZWFtcyBpbmNsdWRlZCAsIHJlbW92ZSBzY29yZXMgZnJvbSBhbGwgc3RhcnQgZ2FtZQ0KZGF0YSA9IGRhdGEgJT4lDQogIGZpbHRlcih0ZWFtX25hbWUhPSJUZWFtIFdOQkEiICYgdGVhbV9uYW1lIT0iVGVhbSBVU0EiKQ0KDQojZ3JvdXAgZGF0YSBieSB0ZWFtLCBmaW5kIG1lYW4vc2Qgb2YgYWxsIHZhcmlhYmxlcw0Kc3VtbWFyeV9zY29yZT1kYXRhICU+JQ0KICBncm91cF9ieSh0ZWFtX25hbWUpICU+JQ0KICBzdW1tYXJpc2UobWVhbl9zY29yZT1tZWFuKHRlYW1fc2NvcmUpLCBzZF9zY29yZT1zZCh0ZWFtX3Njb3JlKSwNCiAgICAgICAgICAgIG1lYW5fcmViPW1lYW4odG90YWxfcmVib3VuZHMpLCBzZF9yZWI9c2QodG90YWxfcmVib3VuZHMpLA0KICAgICAgICAgICAgbWVhbl9mZ3A9bWVhbihmaWVsZF9nb2FsX3BjdCksIHNkX2ZncD1zZChmaWVsZF9nb2FsX3BjdCksDQogICAgICAgICAgICBtZWFuXzNmZ3A9bWVhbih0aHJlZV9wb2ludF9maWVsZF9nb2FsX3BjdCksIHNkXzNmZ3A9c2QodGhyZWVfcG9pbnRfZmllbGRfZ29hbF9wY3QpLA0KICAgICAgICAgICAgbWVhbl9zdGw9bWVhbihzdGVhbHMpLCBzZF9zdGw9c2Qoc3RlYWxzKSkNCg0KDQojc2VsZWN0IG9ubHkgdmFyaWFibGVzIHdlIG5lZWQgYW5kIGZpbHRlciBvbiBteSB0ZWFtDQpteV90ZWFtPWRhdGEgJT4lDQogIHNlbGVjdCh0ZWFtX3Njb3JlLCBmaWVsZF9nb2FsX3BjdCwgdG90YWxfcmVib3VuZHMsIA0KICAgICAgICAgdGhyZWVfcG9pbnRfZmllbGRfZ29hbF9wY3QsIHN0ZWFscywgdGVhbV9uYW1lLCB0ZWFtX3dpbm5lcikgJT4lDQogIGZpbHRlcih0ZWFtX25hbWU9PSJGZXZlciIpDQogIA0KI2dyb3VwcyBjYXNlcyBieSB3aW4gdnMuIGxvc3MNCiNzdW1tYXJpemUgYWxsIHZhcmlhYmxlcyB3aXRoIG1lYW4gYW5kIHNkDQpteV90ZWFtX3Jlc3VsdD1teV90ZWFtJT4lDQogIGdyb3VwX2J5KHRlYW1fd2lubmVyKSAlPiUNCiAgc3VtbWFyaXNlKG1lYW5fc2NvcmU9bWVhbih0ZWFtX3Njb3JlKSwgc2Rfc2NvcmU9c2QodGVhbV9zY29yZSksDQogICAgICAgICAgICBtZWFuX3JlYj1tZWFuKHRvdGFsX3JlYm91bmRzKSwgc2RfcmViPXNkKHRvdGFsX3JlYm91bmRzKSwNCiAgICAgICAgICAgIG1lYW5fZmdwPW1lYW4oZmllbGRfZ29hbF9wY3QpLCBzZF9mZ3A9c2QoZmllbGRfZ29hbF9wY3QpLA0KICAgICAgICAgICAgbWVhbl8zZmdwPW1lYW4odGhyZWVfcG9pbnRfZmllbGRfZ29hbF9wY3QpLCBzZF8zZmdwPXNkKHRocmVlX3BvaW50X2ZpZWxkX2dvYWxfcGN0KSwNCiAgICAgICAgICAgIG1lYW5fc3RsPW1lYW4oc3RlYWxzKSwgc2Rfc3RsPXNkKHN0ZWFscykpDQoNCmRmX2hpc3Q9ZGF0YSU+JQ0KICBmaWx0ZXIodGVhbV9uYW1lPT0iRmV2ZXIiKSU+JQ0KICBtdXRhdGUocmVzdWx0PWNhc2Vfd2hlbih0ZWFtX3dpbm5lcj09VFJVRX4id2luIix0ZWFtX3dpbm5lcj09RkFMU0V+Imxvc3MiKSkNCmBgYA0KDQojIEludHJvZHVjdGlvbg0KDQpUaGlzIGRhdGEgc2V0IGluY2x1ZGVzIHRoZSBib3ggc2NvcmVzIGZvciBlYWNoIFdOQkEgdGVhbSBmb3IgZXZlcnkgZ2FtZSBvZiB0aGUgMjAyNSBzZWFzb24uIFRoZSB0ZWFtIEkgd2lsbCBiZSBhbmFseXppbmcgaXMgdGhlIEluZGlhbmEgRmV2ZXIuIFRoZSBnb2FsIG9mIHRoaXMgcHJvamVjdCBpcyB0byBidWlsZCB0aGUgYmVzdCBtb2RlbCB0byBwcmVkaWN0IHRlYW0gc2NvcmUgaW4gYSBtZWRpYW4gZ2FtZSBmb3IgdGhlIEluZGlhbmEgRmV2ZXIuIA0KDQoNCg0KIyBUYWJsZXMNCg0KVGhlIFN1bW1hcnkgVGFibGUgcHJvdmlkZXMgdGhlIG1lYW4gYW5kIHN0YW5kYXJkIGRldmlhdGlvbiBmb3IgZWFjaCB0ZWFtcyBzY29yZSwgcmVib3VuZHMsIGZpZWxkIGdvYWwgcGVyY2VudGFnZSwgMyBwb2ludCBmaWVsZCBnb2FsIHBlcmNlbnRhZ2UsIGFuZCBzdGVhbHMgb3ZlciB0aGUgMjAyNSBzZWFzb24gZm9yIGV2ZXJ5IFdOQkEgdGVhbS4gTXkgVGVhbSBTdW1tYXJ5IFRhYmxlIHByb3ZpZGVzIHRoZXNlIHNhbWUgc3RhdGlzdGljcyBmb3IgZWFjaCBnYW1lIHJlc3VsdCwgYSB3aW4gb3IgYSBsb3NzLCBmb3IgdGhlIEluZGlhbmEgRmV2ZXIuDQpgYGB7ciBUYWJsZXMsIGluY2x1ZGUgPSBUfQ0KDQpzdW1tYXJ5X3Njb3JlICU+JQ0KICBrYWJsZShkaWdpdHMgPSAyLCBjYXB0aW9uID0gIlN1bW1hcnkgVGFibGUiKSAlPiUNCiAga2FibGVfcGFwZXIoZnVsbF93aWR0aCA9IEYsIGh0bWxfZm9udCA9ICJUaW1lcyBOZXcgUm9tYW4iKQ0KICANCm15X3RlYW1fcmVzdWx0ICU+JQ0KICBrYWJsZShkaWdpdHMgPSAyLCBjYXB0aW9uID0gIk15IFRlYW0gU3VtbWFyeSBUYWJsZSIpICU+JQ0KICBrYWJsZV9wYXBlcihmdWxsX3dpZHRoID0gRiwgaHRtbF9mb250ID0gIlRpbWVzIE5ldyBSb21hbiIpDQoNCmBgYA0KDQojIEdyYXBocw0KDQpUaGlzIHNlY3Rpb24gcHJvdmlkZXMgdHdvIGdyYXBocyB0byBhbmFseXplIHRlYW0gc2NvcmUgYW5kIGdhbWUgcmVzdWx0cy4gVGhlIGZpcnN0IGdyYXBoIGlzIGEgaGlzdG9ncmFtIHRoYXQgc2hvd3MgdGhlIG51bWJlciBvZiBnYW1lcyB3aXRoIGNlcnRhaW4gc2NvcmVzLCBzZXBhcmF0ZWQgYnkgd2lucyhncmVlbikgYW5kIGxvc3NlcyhyZWQpLiBUaGUgbmV4dCBncmFwaCBpcyBhIGJveCBwbG90IGZvciBzY29yZXMgb2YgZ2FtZXMsIG9uY2UgYWdhaW4gc2VwYXJhdGVkIGJ5IHdpbnMgYW5kIGxvc3Nlcy4gDQpgYGB7ciBHcmFwaHMsIGluY2x1ZGUgPSBULCBmaWcud2lkdGg9NCwgZmlnLmhlaWdodD01LCBmaWcuYWxpZ249J2NlbnRlcid9DQoNCnAgPSBkZl9oaXN0ICU+JQ0KICBnZ3Bsb3QoYWVzKHggPSB0ZWFtX3Njb3JlLCBmaWxsID0gcmVzdWx0KSkgKw0KICBnZW9tX2hpc3RvZ3JhbShjb2xvcj0iI2U5ZWNlZiIsIGFscGhhPTAuNiwgcG9zaXRpb24gPSAiaWRlbnRpdHkiLCBiaW53aWR0aCA9IDIpICsNCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygicmVkIiwgImdyZWVuIikpICsNCiAgbGFicyhmaWxsPSJyZXN1bHQiLA0KICAgICAgIHRpdGxlID0gIkhpc3RvZ3JhbSBvZiBUZWFtIFNjb3JlIGJ5IEdhbWUgUmVzdWx0IiwNCiAgICAgICB4ID0gIlRlYW0gU2NvcmUiLA0KICAgICAgIHkgPSAiTnVtYmVyIG9mIGdhbWVzIikgKw0KICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkNCiAgICAgIA0KcA0KDQogDQogYm94cGxvdCh0ZWFtX3Njb3JlIH4gcmVzdWx0LCBkYXRhID0gZGZfaGlzdCwNCiAgICAgIGNvbCA9IGMoInJlZCIsICJncmVlbiIsICJibGFjayIpLA0KICAgICAgbWFpbiA9ICJCb3ggUGxvdCBvZiBQb2ludHMgU2NvcmVkIGJ5IEdhbWUgUmVzdWx0IiwNCiAgICAgIHhsYWIgPSAiUmVzdWx0IiwgeWxhYiA9ICJQb2ludHMiKQ0KDQogDQoNCmBgYA0KDQojIE1vZGVscw0KDQpgYGB7ciBGaXJzdCBPcmRlciBNb2RlbCwgaW5jbHVkZT1GQUxTRX0NCg0KI21vZGVsIDEgaXMgYSBmaXJzdCBvcmRlciBtb2RlbCB3aXRoIDQgdGVybXMNCm1vZGVsMT1sbSh0ZWFtX3Njb3JlfmZpZWxkX2dvYWxfcGN0K3RvdGFsX3JlYm91bmRzKw0KICAgICAgICAgdGhyZWVfcG9pbnRfZmllbGRfZ29hbF9wY3Qrc3RlYWxzLCBkYXRhPW15X3RlYW0pDQpzdW1tYXJ5KG1vZGVsMSkNCg0KI2NvcnJlbGF0aW9uIG1hdHJpeCByZXF1aXJlcyBvbmx5IHF1YW50aXRhdGl2ZSB2YXJpYWJsZXMNCmNvcl9kYXRhPW15X3RlYW0gJT4lDQogIHNlbGVjdChmaWVsZF9nb2FsX3BjdCwgdG90YWxfcmVib3VuZHMsIA0KICAgICAgICAgdGhyZWVfcG9pbnRfZmllbGRfZ29hbF9wY3QsIHN0ZWFscykNCg0KI2NvcnJlbGF0aW9uIG1hdHJpeA0KY29yKGNvcl9kYXRhKQ0KDQojVklGIHZhbHVlcw0KdmlmKG1vZGVsMSkNCmBgYA0KDQoNCg0KYGBge3IgSW50ZXJhY3Rpb24gTW9kZWwsIHJlc3VsdHM9J2FzaXMnLCBlY2hvPUYsIGluY2x1ZGU9RiwgY29tbWVudD1UfQ0KI21vZGVsIDMgaXMgYW4gaW50ZXJhY3Rpb24gbW9kZWwgd2l0aCA2IGludGVyYWN0aW9uIHRlcm1zIGFuZCA0IGZpcnN0IG9yZGVyIHRlcm1zDQptb2RlbDMgPSBsbSh0ZWFtX3Njb3JlIH4NCiAgICAgICAgICAgICAgIGZpZWxkX2dvYWxfcGN0ICsNCiAgICAgICAgICAgICAgIHRvdGFsX3JlYm91bmRzICsNCiAgICAgICAgICAgICAgIHRocmVlX3BvaW50X2ZpZWxkX2dvYWxfcGN0ICsNCiAgICAgICAgICAgICAgIHN0ZWFscyArDQogICAgICAgICAgICAgICBmaWVsZF9nb2FsX3BjdDp0b3RhbF9yZWJvdW5kcyArDQogICAgICAgICAgICAgICBmaWVsZF9nb2FsX3BjdDp0aHJlZV9wb2ludF9maWVsZF9nb2FsX3BjdCArDQogICAgICAgICAgICAgICBmaWVsZF9nb2FsX3BjdDpzdGVhbHMgKw0KICAgICAgICAgICAgICAgdG90YWxfcmVib3VuZHM6dGhyZWVfcG9pbnRfZmllbGRfZ29hbF9wY3QgKw0KICAgICAgICAgICAgICAgdG90YWxfcmVib3VuZHM6c3RlYWxzICsNCiAgICAgICAgICAgICAgIHRocmVlX3BvaW50X2ZpZWxkX2dvYWxfcGN0OnN0ZWFscywNCiAgICAgICAgICAgICBkYXRhID0gbXlfdGVhbSkNCnN1bW1hcnkobW9kZWwzKQ0KDQojbW9kZWwgNCBpcyB0aGUgcmVkdWNlZCBtb2RlbCB3aGVyZSB0ZXJtcyBmcm9tIG1vZGVsMyB3aXRoIGE8MC4xNSBhcmUgcmVtb3ZlZA0KbW9kZWw0ID0gbG0odGVhbV9zY29yZSB+DQogICAgICAgICAgICAgICBmaWVsZF9nb2FsX3BjdCArDQogICAgICAgICAgICAgICB0b3RhbF9yZWJvdW5kcyArDQogICAgICAgICAgICAgICB0aHJlZV9wb2ludF9maWVsZF9nb2FsX3BjdCArDQogICAgICAgICAgICAgICBzdGVhbHMgKw0KICAgICAgICAgICAgICAgZmllbGRfZ29hbF9wY3Q6dGhyZWVfcG9pbnRfZmllbGRfZ29hbF9wY3QgKw0KICAgICAgICAgICAgICAgdG90YWxfcmVib3VuZHM6dGhyZWVfcG9pbnRfZmllbGRfZ29hbF9wY3QsDQogICAgICAgICAgICAgZGF0YSA9IG15X3RlYW0pDQptb2RlbDRzdW09c3VtbWFyeShtb2RlbDQpDQoNCg0KDQpgYGANCg0KJH4kDQoNClRvIGNyZWF0ZSBteSBmaW5hbCBtb2RlbCwgSSBiZWdhbiB3aXRoIGEgZmlyc3Qgb3JkZXIgbW9kZWwgd2l0aCA0IHRlcm1zLiBJIHRoZW4gY3JlYXRlZCBhIGNvcnJlbGF0aW9uIG1hdHJpeCB0byBzZWUgdGhhdCBub25lIG9mIG15IHZhcmlhYmxlcyB3ZXJlIGhpZ2hseSBjb3JyZWxhdGVkLCBhbmQgdGhlcmVmb3JlIGNvdWxkIHJlbWFpbiBpbiB0aGUgbW9kZWwuIFRoZW4gSSBjcmVhdGVkIGEgZnVsbCBpbnRlcmFjdGlvbiBtb2RlbCB3aXRoIDYgaW50ZXJhY3Rpb24gdGVybXMgYW5kIHRoZSBvcmlnaW5hbCA0IGZpcnN0IG9yZGVyIHRlcm1zLiBUaGUgb25seSBJbnRlcmFjdGlvbiB0ZXJtcyB3aXRoIGEgcD4wLjE1IHdlcmUgZmllbGRfZ29hbF9wY3Q6dGhyZWVfcG9pbnRfZmllbGRfZ29hbF9wY3QgYW5kIHRvdGFsX3JlYm91bmRzOnRocmVlX3BvaW50X2ZpZWxkX2dvYWxfcGN0LCBzbyB0aGV5IHJlbWFpbmVkIGluIHRoZSBtb2RlbGwgd2hpbGUgdGhlIG90aGVyIGZvdXIgd2VyZSByZW1vdmVkLiANCg0KTXkgZmluYWwgbW9kZWwgaXMgdGVhbV9zY29yZSA9IGByIG1vZGVsNCRjb2VmZmljaWVudHNbMV1gICsgYHIgbW9kZWw0JGNvZWZmaWNpZW50c1syXWAqIGZpZWxkX2dvYWxfcGN0ICsgDQpgciBtb2RlbDQkY29lZmZpY2llbnRzWzNdYCAqIHRvdGFsX3JlYm91bmRzICsgYHIgbW9kZWw0JGNvZWZmaWNpZW50c1s0XWAgKiB0aHJlZV9wb2ludF9maWVsZF9nb2FsX3BjdCArDQpgciBtb2RlbDQkY29lZmZpY2llbnRzWzVdYCBzdGVhbHMgKyBgciBtb2RlbDQkY29lZmZpY2llbnRzWzZdYCogZmllbGRfZ29hbF9wY3QqdGhyZWVfcG9pbnRfZmllbGRfZ29hbF9wY3QgKw0KYHIgbW9kZWw0JGNvZWZmaWNpZW50c1s3XWAgKiB0b3RhbF9yZWJvdW5kcyp0aHJlZV9wb2ludF9maWVsZF9nb2FsX3BjdA0KDQpUaGlzIG1vZGVsIHNpZ25pZmljYW50bHkgcHJlZGljdHMgdGVhbSBzY29yZSwgRihgciBtb2RlbDRzdW0kZnN0YXRpc3RpY1syXWAsYHIgbW9kZWw0c3VtJGZzdGF0aXN0aWNbM11gKT0gYHIgbW9kZWw0c3VtJGZzdGF0aXN0aWNbMV1gLCBwPDAuMDAxLCBhZGp1c3RlZCBSXjI9YHIgbW9kZWw0c3VtJGFkai5yLnNxdWFyZWRgLg0KDQpUaGUgZm9sbG93aW5nIHRhYmxlIHN1bW1hcml6ZXMgdGhpcyBtb2RlbDoNCmBgYHtyLCBpbmNsdWRlPVRSVUUsIHJlc3VsdHM9J2FzaXMnLCBlY2hvPUZBTFNFLCBjb21tZW50PVQsIG1lc3NhZ2U9RkFMU0UsfQ0KbGlicmFyeShzdGFyZ2F6ZXIpDQpzdGFyZ2F6ZXIobW9kZWw0LCB0eXBlID0gImh0bWwiKQ0KYGBgDQoNCg0KIyBSZXNpZHVhbHMNCg0KVGhpcyBzZWN0aW9uIHByb3ZpZGVzIHRoZSBmb2xsb3dpbmcgcmVzaWR1YWwgcGxvdHM6IGhpc3RvZ3JhbSwgdmVyc3VzIGZpdHMgcGxvdCwgc3R1ZGVudGl6ZWQgcmVzaWR1YWwgcGxvdCwgbGV2ZXJhZ2UgcGxvdCwgYW5kIGEgQ29va+KAmXMgZGlzdGFuY2UgYmFyIGNoYXJ0LiBUaGUgaGlzdG9ncmFtIHNob3dzIGEgYmVsbC1zaGFwZWQgY3VydmUgYW5kIHRoZSB2ZXJzdXMgZml0cyBwbG90IHNob3dzIG5vIHBhdHRlcm4gb3IgY29ycmVsYXRpb24uIFRoaXMgaW5kaWNhdGVzIHRoYXQgdGhlIGNvbmRpdGlvbnMgb2Ygbm9ybWFsaXR5IGFuZCBjb25zdGFudCB2YXJpYW5jZSBhcmUgbWV0IGZvciB0aGlzIG1vZGVsLiBUaGUgcmVtYWluaW5nIHBsb3RzIHNob3cgdGhhdCBvYnNlcnZhdGlvbiA0IGlzIGFuIG91dGxpZXIgd2l0aCBoaWdoIGxldmVyYWdlLiBUaGlzIGdhbWUgd2FzIHBsYXllZCBvbiAyMDI0LTA5LTE1LCB3aGVuIHRoZSBmZXZlciBmYWNlZCB0aGUgd2luZ3MuIEluIHRoaXMgZ2FtZSwgdGhlIEluZGlhbmEgRmV2ZXIgaGFkIGEgdGVhbSBzY29yZSBvZiAxMTAgcG9pbnRzLCB0eWluZyBhIGZyYW5jaGlzZSByZWNvcmQgZm9yIHBvaW50cyBzY29yZWQgaW4gYSBnYW1lLiANCmBgYHtyIFJlc2lkdWFscywgZmlnLndpZHRoPTQsIGZpZy5oZWlnaHQ9NSwgZmlnLmFsaWduPSdjZW50ZXInfQ0KDQpvbHNfcGxvdF9yZXNpZF9maXQobW9kZWw0KQ0Kb2xzX3Bsb3RfcmVzaWRfaGlzdChtb2RlbDQpDQpvbHNfcGxvdF9yZXNpZF9zdHVkKG1vZGVsNCkNCm9sc19wbG90X3Jlc2lkX2xldihtb2RlbDQsIHRocmVzaG9sZCA9IDMpDQpvbHNfcGxvdF9jb29rc2RfY2hhcnQobW9kZWw0KQ0KDQoNCmBgYA0KDQoNCiMgUHJlZGljdGlvbg0KDQpgYGB7ciBQcmVkaWN0aW9uLCBpbmNsdWRlPUZ9DQojRm9yIGZpbmRpbmcgbWVkaWFuIHZhbHVlcw0Kc3VtbWFyeShjb3JfZGF0YSkNCg0KI1RoaXMgaXMgYSBuZXcgZGF0YSBmcmFtZSBmb3IgdGhlIG1lZGlhbiBnYW1lDQpuZXdkYXRhPWRhdGEuZnJhbWUoZmllbGRfZ29hbF9wY3Q9NDQuOTAsIHRvdGFsX3JlYm91bmRzPTM1LCANCiAgICAgICAgICAgICAgICAgICB0aHJlZV9wb2ludF9maWVsZF9nb2FsX3BjdD0zNC42LCBzdGVhbHM9NSkNCiANCiNwcmVkaWN0aW5nDQpwcmVkaWN0aW9uPXByZWRpY3QobW9kZWw0LCBuZXdkYXRhLCBpbnRlcnZhbCA9ICJjb25maWRlbmNlIiwgbGV2ZWwgPSAuOTUpDQpgYGANCg0KSSBidWlsdCB0aGlzIG1vZGVsIHRvIHByZWRpY3QgbXkgdGVhbXMgcG9pbnRzIGZvciBhIGdhbWUgaW4gd2hpY2ggdGhleSBhY2hpZXZlIHRoZSBtZWRpYW4gdmFsdWUgZm9yIGVhY2ggdmFyaWFibGUuIFRoZSBwcmVkaWN0ZWQgdGVhbSBzY29yZSBpcyBgciBwcmVkaWN0aW9uWzFdYCwgd2l0aCBhIDk1JSBjb25maWRlbmNlIGludGVydmFsIChgciBwcmVkaWN0aW9uWzJdYCwgYHIgcHJlZGljdGlvblszXWAgKS4g