Introduction
This report analyzes the 2025 WNBA season using official game box
scores, with a focus on the Washington Mystics’ performance.
The goal of this analysis is to build the most accurate statistical
model possible to predict the Mystics’ team score, ultimately evaluating
their performance in a ‘median’ game where all independent variables are
held at their median values.
Season Summary
(tables)
Table 1 provides an aggregated statistical summary of all teams
across the league, while Table 2 isolates the Mystics’ statistics,
comparing their average scores in wins versus losses.
During the 2025 season, the Mystics struggled offensively, averaging
79.30 points per game, placing them in the lower half of the league in
scoring and ultimately failing to qualify for the playoffs.
2025 WNBA Team Stats
|
team_name
|
mean_score
|
sd_score
|
mean_field_goal
|
sd_field_goal
|
mean_rebounds
|
sd_rebounds
|
mean_threepoint
|
sd_threepoint
|
mean_steals
|
sd_steals
|
|
Aces
|
85.52
|
9.56
|
45.27
|
5.82
|
33.78
|
5.88
|
35.27
|
7.08
|
6.80
|
2.67
|
|
Dream
|
76.93
|
10.59
|
41.28
|
6.78
|
35.95
|
4.41
|
30.83
|
9.32
|
7.14
|
2.82
|
|
Fever
|
84.50
|
10.17
|
45.56
|
5.38
|
35.10
|
5.49
|
35.00
|
8.99
|
5.88
|
2.29
|
|
Liberty
|
84.98
|
9.92
|
44.53
|
5.61
|
36.90
|
5.77
|
35.38
|
10.06
|
7.75
|
2.19
|
|
Lynx
|
82.36
|
11.39
|
45.21
|
6.34
|
33.15
|
5.06
|
37.80
|
9.43
|
8.36
|
3.17
|
|
Mercury
|
81.93
|
12.60
|
44.28
|
7.34
|
32.26
|
5.39
|
32.97
|
10.34
|
6.55
|
2.12
|
|
Mystics
|
79.30
|
8.69
|
43.36
|
4.82
|
31.85
|
4.66
|
36.64
|
8.69
|
7.28
|
2.24
|
|
Sky
|
77.40
|
9.62
|
42.44
|
5.22
|
36.60
|
5.57
|
31.74
|
11.62
|
7.00
|
3.30
|
|
Sparks
|
78.40
|
10.57
|
42.63
|
6.15
|
32.67
|
5.52
|
32.09
|
11.00
|
7.30
|
2.78
|
|
Storm
|
82.67
|
9.65
|
43.43
|
5.39
|
34.67
|
6.02
|
28.35
|
9.03
|
9.24
|
3.27
|
|
Sun
|
80.36
|
9.89
|
44.30
|
5.28
|
33.43
|
4.62
|
32.84
|
11.67
|
7.89
|
3.29
|
|
Wings
|
84.20
|
11.47
|
44.47
|
5.24
|
34.75
|
4.65
|
32.06
|
11.75
|
7.12
|
2.95
|
Washington Mystics 2025 win vs. loss Stats
|
team_winner
|
mean
|
sd
|
|
FALSE
|
76.19
|
7.62
|
|
TRUE
|
85.07
|
7.73
|
Boxplot
Boxplot for team score by game result

Models
There was no multicollinearity observed among the independent
variables, as no pairs showed a high correlation (all were well below
the absolute value of 0.8). Variance Inflation Factor (VIF) values
supported this claim, as all were under 3 (around 1). Therefore, there
was no need to remove any variables or recalculate a second model, as
none of the predictors were highly correlated with one another.
Model1 Summary
|
|
|
|
Dependent variable:
|
|
|
|
|
|
team_score
|
|
|
|
field_goal_pct
|
p = 0.00002
|
|
|
|
|
total_rebounds
|
p = 0.175
|
|
|
|
|
three_point_field_goal_pct
|
p = 0.086
|
|
|
|
|
steals
|
p = 0.902
|
|
|
|
|
Constant
|
p = 0.343
|
|
|
|
|
|
|
Observations
|
40
|
|
R2
|
0.616
|
|
Adjusted R2
|
0.572
|
|
Residual Std. Error
|
5.684 (df = 35)
|
|
F Statistic
|
14.052*** (df = 4; 35)
|
|
|
|
Note:
|
p<0.1; p<0.05;
p<0.01
|
Correlation Matrix
|
|
|
|
team_score
|
field_goal_pct
|
total_rebounds
|
three_point_field_goal_pct
|
steals
|
|
|
|
team_score
|
1
|
0.755
|
0.011
|
0.544
|
0.048
|
|
field_goal_pct
|
0.755
|
1
|
-0.121
|
0.546
|
0.119
|
|
total_rebounds
|
0.011
|
-0.121
|
1
|
-0.265
|
-0.099
|
|
three_point_field_goal_pct
|
0.544
|
0.546
|
-0.265
|
1
|
-0.114
|
|
steals
|
0.048
|
0.119
|
-0.099
|
-0.114
|
1
|
|
|
Variation Inflation Factor
Matrix
|
|
|
field_goal_pct
|
total_rebounds
|
three_point_field_goal_pct
|
steals
|
|
|
|
1.500
|
1.099
|
1.606
|
1.086
|
|
|
Interaction Model
We extend the model to include all 2 way interactions.
From the model2 summary, we see that only the two way interaction of
total_rebounds*steals was found to be significant (p = .080) at alpha =
.15. This led us to reduce our model to include only significant
terms.
My final model is team_score= 55.3304037 + 1.1320374 * field_goal_pct
+ -1.0610145 * total_rebounds + 0.258809 * three_point_field_goal_pct +
-5.8310382 * steals + 0.1803988 * total_rebounds:steals
Displayed in the model3 summary table, this model significantly
predicts team score, F(5, 34) = 13.0540405, p<.0001, adjusted R^2=
0.6071329
library(stargazer)
stargazer(model2, type = "html", report = "vp*", digits = 6, title = "<b style='color:darkblue;'>Model2 Summary</b>") #pretty table
Model2 Summary
|
|
|
|
Dependent variable:
|
|
|
|
|
|
team_score
|
|
|
|
field_goal_pct
|
p = 0.206449
|
|
|
|
|
total_rebounds
|
p = 0.696185
|
|
|
|
|
three_point_field_goal_pct
|
p = 0.916709
|
|
|
|
|
steals
|
p = 0.095906*
|
|
|
|
|
field_goal_pct:total_rebounds
|
p = 0.500611
|
|
|
|
|
field_goal_pct:three_point_field_goal_pct
|
p = 0.345700
|
|
|
|
|
field_goal_pct:steals
|
p = 0.600198
|
|
|
|
|
total_rebounds:three_point_field_goal_pct
|
p = 0.274806
|
|
|
|
|
total_rebounds:steals
|
p = 0.080013*
|
|
|
|
|
three_point_field_goal_pct:steals
|
p = 0.633155
|
|
|
|
|
Constant
|
p = 0.742463
|
|
|
|
|
|
|
Observations
|
40
|
|
R2
|
0.678942
|
|
Adjusted R2
|
0.568233
|
|
Residual Std. Error
|
5.711345 (df = 29)
|
|
F Statistic
|
6.132646*** (df = 10; 29)
|
|
|
|
Note:
|
p<0.1; p<0.05;
p<0.01
|
stargazer(model3, type = "html", report = "vp*", digits = 6, title = "<b style='color:darkblue;'>Model3 Summary</b>") #pretty table
Model3 Summary
|
|
|
|
Dependent variable:
|
|
|
|
|
|
team_score
|
|
|
|
field_goal_pct
|
p = 0.000013***
|
|
|
|
|
total_rebounds
|
p = 0.135006
|
|
|
|
|
three_point_field_goal_pct
|
p = 0.050722*
|
|
|
|
|
steals
|
p = 0.055127*
|
|
|
|
|
total_rebounds:steals
|
p = 0.050941*
|
|
|
|
|
Constant
|
p = 0.030452**
|
|
|
|
|
|
|
Observations
|
40
|
|
R2
|
0.657500
|
|
Adjusted R2
|
0.607133
|
|
Residual Std. Error
|
5.447991 (df = 34)
|
|
F Statistic
|
13.054040*** (df = 5; 34)
|
|
|
|
Note:
|
p<0.1; p<0.05;
p<0.01
|
Residual Analysis
Residual analysis shows us, via the histogram below, that the
distribution is normally distributed. The versus fits plot indicates
constant variance proven by random scatter and no funneling.
Utilizing studentized residuals plot, leverage plot, and cook’s
distance, there was no influential values detected.
There are some leverage points (observation 32, 11, 12, 37, 28) and
an outlier (observation 17) but not enough to alter our regression line
or cause alarm.
ols_plot_resid_hist(model3) #Residual Histogram

ols_plot_resid_fit(model3) #Residual vs. Fitted Values (versus fits plot)

ols_plot_resid_stud(model3) #Studentized residuals

ols_plot_resid_lev(model3, threshold = 3) #leverage plot

ols_plot_cooksd_chart(model3) #cook's distance/outlier plot

Prediction
Experimental Region for Model 3 is:
Field_Goal_Pct = [31.30, 52.90]
Total_Rebounds = [22.00, 42.00]
Three_Point_Field_Goal_Pct = [20.70, 57.10]
Steals = [3.00, 13.00]
I built a model to predict the teams points for a game in which they
achieve the median values for each variable. The predicted team score is
78.9117116, which has a 95% confidence interval of (77.0588701,
80.7645532).
LS0tDQp0aXRsZTogIlRoZSBXYXNoaW5ndG9uIE15c3RpY3M6IEEgMjAyNSBXTkJBIEFuYWx5c2lzIFJlcG9ydCINCmF1dGhvcjogIkthZWxpIEFuZHJld3MiDQpkYXRlOiAiYHIgU3lzLkRhdGUoKWAiDQpvdXRwdXQ6DQogIGh0bWxfZG9jdW1lbnQ6IA0KICAgIHRvYzogeWVzDQogICAgdG9jX2RlcHRoOiA0DQogICAgdG9jX2Zsb2F0OiB5ZXMNCiAgICBudW1iZXJfc2VjdGlvbnM6IHllcw0KICAgIHRvY19jb2xsYXBzZWQ6IHllcw0KICAgIGNvZGVfZm9sZGluZzogaGlkZQ0KICAgIGNvZGVfZG93bmxvYWQ6IHllcw0KICAgIHNtb290aF9zY3JvbGw6IHllcw0KICAgIHRoZW1lOiBsdW1lbg0KICBwZGZfZG9jdW1lbnQ6IA0KICAgIHRvYzogeWVzDQogICAgdG9jX2RlcHRoOiA0DQogICAgZmlnX2NhcHRpb246IHllcw0KICAgIG51bWJlcl9zZWN0aW9uczogeWVzDQogICAgZmlnX3dpZHRoOiAzDQogICAgZmlnX2hlaWdodDogMw0KICB3b3JkX2RvY3VtZW50OiANCiAgICB0b2M6IHllcw0KICAgIHRvY19kZXB0aDogNA0KICAgIGZpZ19jYXB0aW9uOiB5ZXMNCiAgICBrZWVwX21kOiB5ZXMNCmVkaXRvcl9vcHRpb25zOiANCiAgY2h1bmtfb3V0cHV0X3R5cGU6IGlubGluZQ0KLS0tDQoNCmBgYHtjc3MsIGVjaG8gPSBGQUxTRX0NCiNUT0M6OmJlZm9yZSB7DQogIGNvbnRlbnQ6ICJUYWJsZSBvZiBDb250ZW50cyI7DQogIGZvbnQtd2VpZ2h0OiBib2xkOw0KICBmb250LXNpemU6IDEuMmVtOw0KICBkaXNwbGF5OiBibG9jazsNCiAgY29sb3I6IG5hdnk7DQogIG1hcmdpbi1ib3R0b206IDEwcHg7DQp9DQoNCg0KZGl2I1RPQyBsaSB7ICAgICAvKiB0YWJsZSBvZiBjb250ZW50ICAqLw0KICAgIGxpc3Qtc3R5bGU6dXBwZXItcm9tYW47DQogICAgYmFja2dyb3VuZC1pbWFnZTpub25lOw0KICAgIGJhY2tncm91bmQtcmVwZWF0Om5vbmU7DQogICAgYmFja2dyb3VuZC1wb3NpdGlvbjowOw0KfQ0KDQpoMS50aXRsZSB7ICAgIC8qIGxldmVsIDEgaGVhZGVyIG9mIHRpdGxlICAqLw0KICBmb250LXNpemU6IDIycHg7DQogIGZvbnQtd2VpZ2h0OiBib2xkOw0KICBjb2xvcjogUHVycGxlOw0KICB0ZXh0LWFsaWduOiBjZW50ZXI7DQogIGZvbnQtZmFtaWx5OiAiR2lsbCBTYW5zIiwgc2Fucy1zZXJpZjsNCn0NCg0KaDQuYXV0aG9yIHsgLyogSGVhZGVyIDQgLSBhbmQgdGhlIGF1dGhvciBhbmQgZGF0YSBoZWFkZXJzIHVzZSB0aGlzIHRvbyAgKi8NCiAgZm9udC1zaXplOiAxNXB4Ow0KICBmb250LXdlaWdodDogYm9sZDsNCiAgZm9udC1mYW1pbHk6IHN5c3RlbS11aTsNCiAgY29sb3I6IG5hdnk7DQogIHRleHQtYWxpZ246IGNlbnRlcjsNCn0NCg0KaDQuZGF0ZSB7IC8qIEhlYWRlciA0IC0gYW5kIHRoZSBhdXRob3IgYW5kIGRhdGEgaGVhZGVycyB1c2UgdGhpcyB0b28gICovDQogIGZvbnQtc2l6ZTogMThweDsNCiAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogIGZvbnQtZmFtaWx5OiAiR2lsbCBTYW5zIiwgc2Fucy1zZXJpZjsNCiAgY29sb3I6IERhcmtCbHVlOw0KICB0ZXh0LWFsaWduOiBjZW50ZXI7DQp9DQoNCmgxIHsgLyogSGVhZGVyIDEgLSBhbmQgdGhlIGF1dGhvciBhbmQgZGF0YSBoZWFkZXJzIHVzZSB0aGlzIHRvbyAgKi8NCiAgICBmb250LXNpemU6IDIwcHg7DQogICAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogICAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7DQogICAgY29sb3I6IFB1cnBsZTsNCiAgICB0ZXh0LWFsaWduOiBsZWZ0Ow0KfQ0KDQpoMiB7IC8qIEhlYWRlciAyIC0gYW5kIHRoZSBhdXRob3IgYW5kIGRhdGEgaGVhZGVycyB1c2UgdGhpcyB0b28gICovDQogICAgZm9udC1zaXplOiAxOHB4Ow0KICAgIGZvbnQtd2VpZ2h0OiBib2xkOw0KICAgIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICAgIGNvbG9yOiBuYXZ5Ow0KICAgIHRleHQtYWxpZ246IGxlZnQ7DQp9DQoNCmgzIHsgLyogSGVhZGVyIDMgLSBhbmQgdGhlIGF1dGhvciBhbmQgZGF0YSBoZWFkZXJzIHVzZSB0aGlzIHRvbyAgKi8NCiAgICBmb250LXNpemU6IDE2cHg7DQogICAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogICAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7DQogICAgY29sb3I6IG5hdnk7DQogICAgdGV4dC1hbGlnbjogbGVmdDsNCn0NCg0KaDQgeyAvKiBIZWFkZXIgNCAtIGFuZCB0aGUgYXV0aG9yIGFuZCBkYXRhIGhlYWRlcnMgdXNlIHRoaXMgdG9vICAqLw0KICAgIGZvbnQtc2l6ZTogMTRweDsNCiAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogICAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7DQogICAgY29sb3I6IHB1cnBsZTsNCiAgICB0ZXh0LWFsaWduOiBsZWZ0Ow0KfQ0KDQovKiBBZGQgZG90cyBhZnRlciBudW1iZXJlZCBoZWFkZXJzICovDQouaGVhZGVyLXNlY3Rpb24tbnVtYmVyOjphZnRlciB7DQogIGNvbnRlbnQ6ICIuIjsNCg0KYm9keSB7IGJhY2tncm91bmQtY29sb3I6d2hpdGU7IH0NCg0KLmhpZ2hsaWdodG1lIHsgYmFja2dyb3VuZC1jb2xvcjp5ZWxsb3c7IH0NCg0KcCB7IGJhY2tncm91bmQtY29sb3I6d2hpdGU7IH0NCg0KfQ0KYGBgDQoNCmBgYHtyIFNldHVwLCBpbmNsdWRlPUZBTFNFLCBlY2hvID0gRn0NCg0Kc2V0d2QoIkM6L1VzZXJzL2thZWxpL0Rvd25sb2Fkcy9zdGF0MzE5c3ByaW5nMjAyNlIiKQ0KDQojbGlicmFyaWVzDQpsaWJyYXJ5KGdncGxvdDIpICNwbG90cw0KbGlicmFyeShkcGx5cikgI0RhdGEgd3JhbmdsaW5nIA0KbGlicmFyeShjYXIpICNWSUYNCmxpYnJhcnkob2xzcnIpICNSZXNpZHVhbCBhbmFseXNpcyBwbG90cw0KbGlicmFyeShrYWJsZUV4dHJhKSAjZmFuY3kgdGFibGVzDQpgYGANCg0KYGBge3IgRGF0YSBXcmFuZ2xpbmcgdy8gRFBMWVIsIGluY2x1ZGU9RiwgZWNobyA9IEZ9DQoNCiNkYXRhc2V0DQpkYXRhIDwtIHJlYWQuY3N2KCJXTkJBXzIwMjVfYm94LXNjb3Jlcy5jc3YiLCBoZWFkZXIgPSBUKQ0KDQojZmlsdGVyIG91dCBhbGwgc3RhciBnYW1lIChvbmx5IGluY2x1ZGUgb2ZmaWNpYWwgV05CQSBnYW1lcyksIGtlZXAgbmFtZSBhcyBkYXRhIGZvciB0aGlzIGlzIHRoZSB0cnVlIGRhdGFzZXQgd2Ugd2FudCB0byBvYnNlcnZlIA0KZGF0YSA9IGRhdGEgJT4lIA0KICBmaWx0ZXIodGVhbV9uYW1lICE9ICJUZWFtIFdOQkEiICYgdGVhbV9uYW1lICE9IlRlYW0gVVNBIikgDQoNCiNncm91cCBkYXRhIGJ5IHRlYW0sIGZpbmQgbWVhbi9zZCBvZiBzZWxlY3RlZCB2YXJpYWJsZXMNCnN1bW1hcnkgPSBkYXRhICU+JQ0KICBncm91cF9ieSh0ZWFtX25hbWUpICU+JSANCiAgc3VtbWFyaXNlKG1lYW5fc2NvcmU9bWVhbih0ZWFtX3Njb3JlKSwgc2Rfc2NvcmU9c2QodGVhbV9zY29yZSksIA0KICAgICAgICAgICAgbWVhbl9maWVsZF9nb2FsPW1lYW4oZmllbGRfZ29hbF9wY3QpLCBzZF9maWVsZF9nb2FsPXNkKGZpZWxkX2dvYWxfcGN0KSwNCiAgICAgICAgICAgIG1lYW5fcmVib3VuZHM9bWVhbih0b3RhbF9yZWJvdW5kcyksIHNkX3JlYm91bmRzPXNkKHRvdGFsX3JlYm91bmRzKSwNCiAgICAgICAgICAgIG1lYW5fdGhyZWVwb2ludD1tZWFuKHRocmVlX3BvaW50X2ZpZWxkX2dvYWxfcGN0KSwgc2RfdGhyZWVwb2ludD1zZCh0aHJlZV9wb2ludF9maWVsZF9nb2FsX3BjdCksDQogICAgICAgICAgICBtZWFuX3N0ZWFscz1tZWFuKHN0ZWFscyksIHNkX3N0ZWFscz1zZChzdGVhbHMpKQ0KDQojc2VsZWN0IG9ubHkgdmFyaWFibGVzIHdlIG5lZWQgYW5kIGZpbHRlciBvbiBteSB0ZWFtIChNeXN0aWNzKQ0KbXlfdGVhbSA9IGRhdGEgJT4lDQogIHNlbGVjdCh0ZWFtX3Njb3JlLCBmaWVsZF9nb2FsX3BjdCwgdG90YWxfcmVib3VuZHMsDQogICAgICAgICB0aHJlZV9wb2ludF9maWVsZF9nb2FsX3BjdCwgc3RlYWxzLCB0ZWFtX25hbWUsIHRlYW1fd2lubmVyKSAlPiUNCiAgZmlsdGVyKHRlYW1fbmFtZSA9PSAiTXlzdGljcyIpDQoNCiNncm91cHMgY2FzZXMgYnkgd2luIHZzLiBsb3NzLCBzdW1tYXJpemVzIHZhcmlhYmxlcyB3aXRoIG1lYW4gYW5kIFNEIA0KbXlfdGVhbSA9IG15X3RlYW0gJT4lDQogIGdyb3VwX2J5KHRlYW1fd2lubmVyKSAlPiUNCiAgc3VtbWFyaXplKG1lYW49bWVhbih0ZWFtX3Njb3JlKSwgc2Q9c2QodGVhbV9zY29yZSkpDQoNCmRmX2hpc3QgPSBkYXRhICU+JQ0KICBmaWx0ZXIodGVhbV9uYW1lID09ICJNeXN0aWNzIikgJT4lDQogIG11dGF0ZShyZXN1bHQ9Y2FzZV93aGVuKHRlYW1fd2lubmVyPT1UUlVFIH4gIldpbiIsICNGaWx0ZXIgbXkgdGVhbSBhbmQgbGFiZWwgd2luIGFuZCBsb3NzIA0KICAgICAgICAgICAgICAgICAgICAgICAgICB0ZWFtX3dpbm5lcj09RkFMU0V+Ikxvc3MiKSkNCg0KZGZfbW9kZWwxID0gZGF0YSAlPiUNCiAgZmlsdGVyKHRlYW1fbmFtZSA9PSAiTXlzdGljcyIpICNGaWx0ZXIgb3V0IGp1c3QgbXkgdGVhbSBmb3IgbW9kZWwgYnVpbGRpbmcNCg0KYGBgDQoNCiMgSW50cm9kdWN0aW9uDQoNClRoaXMgcmVwb3J0IGFuYWx5emVzIHRoZSAyMDI1IFdOQkEgc2Vhc29uIHVzaW5nIG9mZmljaWFsIGdhbWUgYm94IHNjb3Jlcywgd2l0aCBhIGZvY3VzIG9uIHRoZSBXYXNoaW5ndG9uIE15c3RpY3MnIHBlcmZvcm1hbmNlLg0KDQpUaGUgZ29hbCBvZiB0aGlzIGFuYWx5c2lzIGlzIHRvIGJ1aWxkIHRoZSBtb3N0IGFjY3VyYXRlIHN0YXRpc3RpY2FsIG1vZGVsIHBvc3NpYmxlIHRvIHByZWRpY3QgdGhlIE15c3RpY3MnIHRlYW0gc2NvcmUsIHVsdGltYXRlbHkgZXZhbHVhdGluZyB0aGVpciBwZXJmb3JtYW5jZSBpbiBhICdtZWRpYW4nIGdhbWUgd2hlcmUgYWxsIGluZGVwZW5kZW50IHZhcmlhYmxlcyBhcmUgaGVsZCBhdCB0aGVpciBtZWRpYW4gdmFsdWVzLg0KDQojIFNlYXNvbiBTdW1tYXJ5ICh0YWJsZXMpDQoNClRhYmxlIDEgcHJvdmlkZXMgYW4gYWdncmVnYXRlZCBzdGF0aXN0aWNhbCBzdW1tYXJ5IG9mIGFsbCB0ZWFtcyBhY3Jvc3MgdGhlIGxlYWd1ZSwgd2hpbGUgVGFibGUgMiBpc29sYXRlcyB0aGUgTXlzdGljcycgc3RhdGlzdGljcywgY29tcGFyaW5nIHRoZWlyIGF2ZXJhZ2Ugc2NvcmVzIGluIHdpbnMgdmVyc3VzIGxvc3Nlcy4gDQoNCkR1cmluZyB0aGUgMjAyNSBzZWFzb24sIHRoZSBNeXN0aWNzIHN0cnVnZ2xlZCBvZmZlbnNpdmVseSwgYXZlcmFnaW5nIDc5LjMwIHBvaW50cyBwZXIgZ2FtZSwgcGxhY2luZyB0aGVtIGluIHRoZSBsb3dlciBoYWxmIG9mIHRoZSBsZWFndWUgaW4gc2NvcmluZyBhbmQgdWx0aW1hdGVseSBmYWlsaW5nIHRvIHF1YWxpZnkgZm9yIHRoZSBwbGF5b2Zmcy4NCg0KYGBge3IgVGFibGVzLCBJbmNsdWRlID0gVCwgZWNobyA9IEZ9DQpzdW1tYXJ5ICU+JQ0KICBrYmwoZGlnaXRzID0gMiwgY2FwdGlvbiA9ICIyMDI1IFdOQkEgVGVhbSBTdGF0cyIpICU+JSAjVGFibGUgc3VtbWFyeSBvZiBXTkJBIHN0YXRzDQogIGthYmxlX3N0eWxpbmcoKSAlPiUNCiAga2FibGVfY2xhc3NpYygiaG92ZXIiLCBodG1sX2ZvbnQgPSAiVGltZXMtTmV3LVJvbWFuIiwgZnVsbF93aWR0aCA9IEYpDQoNCm15X3RlYW0gJT4lDQogIGtibChkaWdpdHMgPSAyLCBjYXB0aW9uID0gIldhc2hpbmd0b24gTXlzdGljcyAyMDI1IHdpbiB2cy4gbG9zcyBTdGF0cyIpICU+JSAjVGFibGUgc3VtbWFyeSBvZiBteXN0aWNzIHdpbiB2cyBsb3NzIHN0YXRzDQogIGthYmxlX3N0eWxpbmcoKSAlPiUNCiAga2FibGVfY2xhc3NpYygiaG92ZXIiLCBodG1sX2ZvbnQgPSAiVGltZXMtTmV3LVJvbWFuIiwgZnVsbF93aWR0aCA9IEYpDQoNCmBgYA0KIyBCb3hwbG90DQoNCkJveHBsb3QgZm9yIHRlYW0gc2NvcmUgYnkgZ2FtZSByZXN1bHQgDQoNCg0KYGBge3IgZ3JhcGhzLCBJbmNsdWRlID0gVCwgZmlnLndpZHRoPSAxMCwgZmlnLmhlaWdodCA9IDUsIGVjaG8gPSBGfQ0KDQpwID0gZGZfaGlzdCAlPiUgI0NyZWF0ZXMgYSBwcmV0dHkgaGlzdG9ncmFtIA0KICBnZ3Bsb3QoIGFlcyh4PXRlYW1fc2NvcmUsIGZpbGw9cmVzdWx0KSkgKw0KICBnZW9tX2hpc3RvZ3JhbShiaW53aWR0aCA9IDEsIGNvbG9yPSIjZTllY2VmIiwgYWxwaGE9MC42LCBwb3NpdGlvbiA9ICdpZGVudGl0eScpICsNCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzPWMoIiM2OWIzYTIiLCAiIzQwNDA4MCIpKSANCg0KYm94cGxvdCh0ZWFtX3Njb3JlIH4gcmVzdWx0LCBkYXRhID0gZGZfaGlzdCwgbm90Y2ggPSBGQUxTRSwNCiAgICAgICAgY29sID0gYygiI2UwM2EzZSIsICIjMDAyYjVjIiksDQogICAgICAgIG1haW4gPSAiUG9pbnRzIFNjb3JlIGJ5IEdhbWUgUmVzdWx0IiwNCiAgICAgICAgeGxhYiA9ICJSZXN1bHQiLCB5bGFiID0gIlBvaW50cyIpDQoNCg0KYGBgDQoNCiMgTW9kZWxzIA0KDQpUaGVyZSB3YXMgbm8gbXVsdGljb2xsaW5lYXJpdHkgb2JzZXJ2ZWQgYW1vbmcgdGhlIGluZGVwZW5kZW50IHZhcmlhYmxlcywgYXMgbm8gcGFpcnMgc2hvd2VkIGEgaGlnaCBjb3JyZWxhdGlvbiAoYWxsIHdlcmUgd2VsbCBiZWxvdyB0aGUgYWJzb2x1dGUgdmFsdWUgb2YgMC44KS4gVmFyaWFuY2UgSW5mbGF0aW9uIEZhY3RvciAoVklGKSB2YWx1ZXMgc3VwcG9ydGVkIHRoaXMgY2xhaW0sIGFzIGFsbCB3ZXJlIHVuZGVyIDMgKGFyb3VuZCAxKS4gVGhlcmVmb3JlLCB0aGVyZSB3YXMgbm8gbmVlZCB0byByZW1vdmUgYW55IHZhcmlhYmxlcyBvciByZWNhbGN1bGF0ZSBhIHNlY29uZCBtb2RlbCwgYXMgbm9uZSBvZiB0aGUgcHJlZGljdG9ycyB3ZXJlIGhpZ2hseSBjb3JyZWxhdGVkIHdpdGggb25lIGFub3RoZXIuIA0KDQpgYGB7ciBGaXJzdCBPcmRlciBNb2RlbCwgZWNobyA9IEZBTFNFLCBtZXNzYWdlPUYsIHJlc3VsdHM9ImFzaXMifQ0KDQpjb3JfZGF0YT0gZGZfbW9kZWwxICU+JSAjbXlfdGVhbSB3aXRoIGp1c3QgbnVtZXJpYyB2YWx1ZXMgcGVydGFpbmluZyB0byB0aGUgbW9kZWwNCiAgc2VsZWN0KHRlYW1fc2NvcmUsIGZpZWxkX2dvYWxfcGN0LCB0b3RhbF9yZWJvdW5kcywNCiAgICAgICAgIHRocmVlX3BvaW50X2ZpZWxkX2dvYWxfcGN0LCBzdGVhbHMpDQoNCm1vZGVsMSA9IGxtKHRlYW1fc2NvcmV+ZmllbGRfZ29hbF9wY3QgKyB0b3RhbF9yZWJvdW5kcyArIHRocmVlX3BvaW50X2ZpZWxkX2dvYWxfcGN0ICtzdGVhbHMsIGRhdGEgPSBkZl9tb2RlbDEpICNmaXJzdCBvcmRlciBtb2RlbA0KbGlicmFyeShzdGFyZ2F6ZXIpICNwcmV0dHkgdGFibGVzIQ0Kc3RhcmdhemVyKG1vZGVsMSwgdHlwZSA9ICJodG1sIiwgcmVwb3J0ID0gInYqcCIsIHRpdGxlID0gIjxiIHN0eWxlPSdjb2xvcjpkYXJrYmx1ZTsnPk1vZGVsMSBTdW1tYXJ5PC9iPiIpDQoNCiNubyBuZWVkIHRvIHJlZHVjZSBtb2RlbCwgbm8gbXVsdGljb2xsaW5lYXJpdHkgDQoNCiNjb3IoY29yX2RhdGEpICNjb3JyZWxhdGlvbiBtYXRyaXgNCnN0YXJnYXplcihjb3IoY29yX2RhdGEpLCB0eXBlID0gImh0bWwiLCB0aXRsZSA9ICI8YiBzdHlsZT0nY29sb3I6ZGFya2JsdWU7Jz5Db3JyZWxhdGlvbiBNYXRyaXg8L2I+IikNCg0Kc3RhcmdhemVyKHZpZihtb2RlbDEpLCB0eXBlID0gImh0bWwiLCB0aXRsZSA9ICI8YiBzdHlsZT0nY29sb3I6ZGFya2JsdWU7Jz5WYXJpYXRpb24gSW5mbGF0aW9uIEZhY3RvciBNYXRyaXg8L2I+IikgI1ZhcmlhbmNlIGluZmxhdGlvbiBmYWN0b3IgDQoNCmBgYA0KDQojIEludGVyYWN0aW9uIE1vZGVsDQoNCldlIGV4dGVuZCB0aGUgbW9kZWwgdG8gaW5jbHVkZSBhbGwgMiB3YXkgaW50ZXJhY3Rpb25zLiANCg0KYGBge3IgSW50ZXJhY3Rpb24gTW9kZWwsIGVjaG8gPSBGLCBpbmNsdWRlID1GLCBtZXNzYWdlPUZBTFNFfQ0KDQptb2RlbDIgPSBsbSh0ZWFtX3Njb3JlfmZpZWxkX2dvYWxfcGN0ICsgdG90YWxfcmVib3VuZHMgKyB0aHJlZV9wb2ludF9maWVsZF9nb2FsX3BjdCArIHN0ZWFscyArIA0KICAgICAgICAgICAgICBmaWVsZF9nb2FsX3BjdCp0b3RhbF9yZWJvdW5kcyArICBmaWVsZF9nb2FsX3BjdCp0aHJlZV9wb2ludF9maWVsZF9nb2FsX3BjdCArICBmaWVsZF9nb2FsX3BjdCpzdGVhbHMgKw0KICAgICAgICAgICAgICB0b3RhbF9yZWJvdW5kcyp0aHJlZV9wb2ludF9maWVsZF9nb2FsX3BjdCArIHRvdGFsX3JlYm91bmRzKnN0ZWFscyArIHRocmVlX3BvaW50X2ZpZWxkX2dvYWxfcGN0KnN0ZWFscywgZGF0YSA9IA0KICAgICAgICAgICAgICBkZl9tb2RlbDEpICNNb2RlbDIgaXMgTW9kZWwxICsgYWxsIHR3by13YXkgaW50ZXJhY3Rpb25zDQpzdW1tYXJ5KG1vZGVsMikNCg0KbW9kZWwzID0gbG0odGVhbV9zY29yZX5maWVsZF9nb2FsX3BjdCArIHRvdGFsX3JlYm91bmRzICsgdGhyZWVfcG9pbnRfZmllbGRfZ29hbF9wY3QgKyBzdGVhbHMgKyB0b3RhbF9yZWJvdW5kcypzdGVhbHMsIGRhdGEgPSANCiAgICAgICAgICAgICAgZGZfbW9kZWwxKSAjbW9kZWwyIGJ1dCByZW1vdmluZyBhbGwgaW5zaWduaWZpY2FudCB0d28td2F5IGludGVyYWN0aW9ucw0KDQptb2RlbDNzdW0gPSBzdW1tYXJ5KG1vZGVsMykgI3B1dCBtb2RlbCBzdW1tYXJ5IGludG8gYW4gb2JqZWN0L3ZhcmlhYmxlIG5hbWVzIG1vZGVsM3N1bQ0KDQptb2RlbDNzdW0NCg0KYGBgDQpGcm9tIHRoZSBtb2RlbDIgc3VtbWFyeSwgd2Ugc2VlIHRoYXQgb25seSB0aGUgdHdvIHdheSBpbnRlcmFjdGlvbiBvZiB0b3RhbF9yZWJvdW5kcypzdGVhbHMgd2FzIGZvdW5kIHRvIGJlIHNpZ25pZmljYW50IChwID0gLjA4MCkgYXQgYWxwaGEgPSAuMTUuIFRoaXMgbGVkIHVzIHRvIHJlZHVjZSBvdXIgbW9kZWwgdG8gaW5jbHVkZSBvbmx5IHNpZ25pZmljYW50IHRlcm1zLg0KDQpNeSBmaW5hbCBtb2RlbCBpcyB0ZWFtX3Njb3JlPSBgciBtb2RlbDMkY29lZmZpY2llbnRzWzFdYCArIGByIG1vZGVsMyRjb2VmZmljaWVudHNbMl1gICogZmllbGRfZ29hbF9wY3QgKyBgciBtb2RlbDMkY29lZmZpY2llbnRzWzNdYCAqIHRvdGFsX3JlYm91bmRzICsgYHIgbW9kZWwzJGNvZWZmaWNpZW50c1s0XWAgKiB0aHJlZV9wb2ludF9maWVsZF9nb2FsX3BjdCArIGByIG1vZGVsMyRjb2VmZmljaWVudHNbNV1gICogc3RlYWxzICsgYHIgbW9kZWwzJGNvZWZmaWNpZW50c1s2XWAgKiB0b3RhbF9yZWJvdW5kczpzdGVhbHMNCg0KRGlzcGxheWVkIGluIHRoZSBtb2RlbDMgc3VtbWFyeSB0YWJsZSwgdGhpcyBtb2RlbCBzaWduaWZpY2FudGx5IHByZWRpY3RzIHRlYW0gc2NvcmUsIEYoYHIgbW9kZWwzc3VtJGZzdGF0aXN0aWNbMl1gLCBgciBtb2RlbDNzdW0kZnN0YXRpc3RpY1szXWApID0gYHIgbW9kZWwzc3VtJGZzdGF0aXN0aWNbMV1gLCBwPC4wMDAxLCBhZGp1c3RlZCBSXjI9IGByIG1vZGVsM3N1bSRhZGouci5zcXVhcmVkYA0KDQoNCmBgYHtyICwgcmVzdWx0cyA9ICJhc2lzIiwgaW5jbHVkZSA9IFRSVUUsIG1lc3NhZ2UgPSBGQUxTRX0NCmxpYnJhcnkoc3RhcmdhemVyKQ0Kc3RhcmdhemVyKG1vZGVsMiwgdHlwZSA9ICJodG1sIiwgcmVwb3J0ID0gInZwKiIsIGRpZ2l0cyA9IDYsIHRpdGxlID0gIjxiIHN0eWxlPSdjb2xvcjpkYXJrYmx1ZTsnPk1vZGVsMiBTdW1tYXJ5PC9iPiIpICNwcmV0dHkgdGFibGUNCnN0YXJnYXplcihtb2RlbDMsIHR5cGUgPSAiaHRtbCIsIHJlcG9ydCA9ICJ2cCoiLCBkaWdpdHMgPSA2LCB0aXRsZSA9ICI8YiBzdHlsZT0nY29sb3I6ZGFya2JsdWU7Jz5Nb2RlbDMgU3VtbWFyeTwvYj4iKSAjcHJldHR5IHRhYmxlDQpgYGANCg0KDQojIFJlc2lkdWFsIEFuYWx5c2lzDQoNClJlc2lkdWFsIGFuYWx5c2lzIHNob3dzIHVzLCB2aWEgdGhlIGhpc3RvZ3JhbSBiZWxvdywgdGhhdCB0aGUgZGlzdHJpYnV0aW9uIGlzIG5vcm1hbGx5IGRpc3RyaWJ1dGVkLiBUaGUgdmVyc3VzIGZpdHMgcGxvdCBpbmRpY2F0ZXMgY29uc3RhbnQgdmFyaWFuY2UgcHJvdmVuIGJ5IHJhbmRvbSBzY2F0dGVyIGFuZCBubyBmdW5uZWxpbmcuDQoNClV0aWxpemluZyBzdHVkZW50aXplZCByZXNpZHVhbHMgcGxvdCwgbGV2ZXJhZ2UgcGxvdCwgYW5kIGNvb2sncyBkaXN0YW5jZSwgdGhlcmUgd2FzIG5vIGluZmx1ZW50aWFsIHZhbHVlcyBkZXRlY3RlZC4gDQoNClRoZXJlIGFyZSBzb21lIGxldmVyYWdlIHBvaW50cyAob2JzZXJ2YXRpb24gMzIsIDExLCAxMiwgMzcsIDI4KSBhbmQgYW4gb3V0bGllciAob2JzZXJ2YXRpb24gMTcpIGJ1dCBub3QgZW5vdWdoIHRvIGFsdGVyIG91ciByZWdyZXNzaW9uIGxpbmUgb3IgY2F1c2UgYWxhcm0uIA0KDQpgYGB7ciBSZXNpZHVhbHMsIEluY2x1ZGUgPSBULCBmaWcud2lkdGg9IDYsIGZpZy5oZWlnaHQ9IDR9DQpvbHNfcGxvdF9yZXNpZF9oaXN0KG1vZGVsMykgI1Jlc2lkdWFsIEhpc3RvZ3JhbQ0Kb2xzX3Bsb3RfcmVzaWRfZml0KG1vZGVsMykgI1Jlc2lkdWFsIHZzLiBGaXR0ZWQgVmFsdWVzICh2ZXJzdXMgZml0cyBwbG90KQ0Kb2xzX3Bsb3RfcmVzaWRfc3R1ZChtb2RlbDMpICNTdHVkZW50aXplZCByZXNpZHVhbHMNCm9sc19wbG90X3Jlc2lkX2xldihtb2RlbDMsIHRocmVzaG9sZCA9IDMpICNsZXZlcmFnZSBwbG90DQpvbHNfcGxvdF9jb29rc2RfY2hhcnQobW9kZWwzKSAjY29vaydzIGRpc3RhbmNlL291dGxpZXIgcGxvdA0KDQpgYGANCg0KIyBQcmVkaWN0aW9uDQoNCkV4cGVyaW1lbnRhbCBSZWdpb24gZm9yIE1vZGVsIDMgaXM6IA0KICAgICAgICANCi0gRmllbGRfR29hbF9QY3QgPSBbMzEuMzAsIDUyLjkwXQ0KICAgICAgICANCi0gVG90YWxfUmVib3VuZHMgPSBbMjIuMDAsIDQyLjAwXQ0KICAgICAgICANCi0gVGhyZWVfUG9pbnRfRmllbGRfR29hbF9QY3QgPSBbMjAuNzAsIDU3LjEwXQ0KICAgICAgICANCi0gU3RlYWxzID0gWzMuMDAsIDEzLjAwXQ0KICAgICAgICANCmBgYHtyIFByZWRpY3Rpb24sIGluY2x1ZGU9Rn0NCnN1bW1hcnkoY29yX2RhdGEpICNnZXQgbWVkaWFuIHZhbHVlcw0KDQojY3JlYXRlIG5ldyBkYXRhZnJhbWUgb2YgcHJlZGljdGVkIHZhbHVlcyB0byBwbHVnIGludG8gbW9kZWwNCm5ld2RhdGE9ZGF0YS5mcmFtZShmaWVsZF9nb2FsX3BjdCA9IDQzLjIwLCB0b3RhbF9yZWJvdW5kcz0zMS4wMCwgdGhyZWVfcG9pbnRfZmllbGRfZ29hbF9wY3Q9MzUuNzAsIHN0ZWFscyA9IDcpICNtZWRpYW4gdmFsdWVzIGZvciBlYWNoIGluZGVwZW5kZW50IHZhcmlhYmxlDQoNCiNwcmVkaWN0aW9uIG1vZGVsDQpwcmVkaWN0aW9uID0gcHJlZGljdChtb2RlbDMsIG5ld2RhdGEsIGludGVydmFsID0gImNvbmZpZGVuY2UiLCBsZXZlbCA9IC45NSkgI3ByZWRpY3RpbmcgdGhlIG1vZGVsIHdpdGggYWJvdmUgKG1lZGlhbikgdmFsdWVzDQoNCmBgYA0KSSBidWlsdCBhIG1vZGVsIHRvIHByZWRpY3QgdGhlIHRlYW1zIHBvaW50cyBmb3IgYSBnYW1lIGluIHdoaWNoIHRoZXkgYWNoaWV2ZSB0aGUgbWVkaWFuIHZhbHVlcyBmb3IgZWFjaCB2YXJpYWJsZS4gVGhlIHByZWRpY3RlZCB0ZWFtIHNjb3JlIGlzIGByIHByZWRpY3Rpb25bMV1gLCB3aGljaCBoYXMgYSA5NSUgY29uZmlkZW5jZSBpbnRlcnZhbCBvZiAoYHIgcHJlZGljdGlvblsyXWAsIGByIHByZWRpY3Rpb25bM11gKS4NCg0KDQoNCg==