Data

Libraries and Manipulations

library(ggplot2)
library(GGally)
## Registered S3 method overwritten by 'GGally':
##   method from   
##   +.gg   ggplot2
library(RCurl) 
library(tidyverse)
## ── Attaching packages ─────────────────────────────────────── tidyverse 1.3.1 ──
## ✓ tibble  3.1.6     ✓ dplyr   1.0.8
## ✓ tidyr   1.2.0     ✓ stringr 1.4.0
## ✓ readr   2.1.2     ✓ forcats 0.5.1
## ✓ purrr   0.3.4
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## x tidyr::complete() masks RCurl::complete()
## x dplyr::filter()   masks stats::filter()
## x dplyr::lag()      masks stats::lag()
nfl_kick <- read.csv("nflkick.csv")
attach(nfl_kick)
data(nfl_kick)

names(nfl_kick)
## [1] "Team"       "Year"       "GameMinute" "Kicker"     "Distance"  
## [6] "ScoreDiff"  "Grass"      "Temp"       "Success"
head(nfl_kick, 3)

Data Cleaning

nfl_kick$Success  = ifelse(nfl_kick$Success == 0, 'Miss','Make') # Create levels for Success Variable
nfl_kick$Success = as.factor(nfl_kick$Success)

class(nfl_kick$Success)
## [1] "factor"
levels(nfl_kick$Success)
## [1] "Make" "Miss"
nfl_kick$Success <- factor(nfl_kick$Success, levels =c('Miss', 'Make'))
contrasts(nfl_kick$Success)
##      Make
## Miss    0
## Make    1

Introduction

This review disects information pertaining to field goal attempts between 2005 and 2015. The information relates 11,187 kicks over eleven years in the NFL. Pre and post graphical exploration of the dataset allows for several questions of interest. In this report, the major question is the relationship of Success, or outcome, of kicks to explanatory variables offered by the dataset.

Basic Facts

nrow(nfl_kick) # how many attempted field goals included
## [1] 11187
all.dist.attempted <- sort(unique(Distance)) # sorted list of fg attempts by length
all.dist.attempted
##  [1] 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
## [26] 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 68
## [51] 69 71 76

Initial graphical interpretation sets the bar for further study. Consider the relationship between temperature (Temp) and field surface (Grass). What follows is a boxplot depicting this relationship. Notice how the median as well as interquartile values are higher for the Grass variable.

boxplot(nfl_kick$Temp ~nfl_kick$Grass, ylab ='Temperature in degrees F', 
        xlab ='Field Surface: F =Turf, T =Sod',
        main ='Boxplot of Temperature relative to Field Surface', 
        boxlwd =2, outlwd =2, col ='green', outpch =21, outbg ='red')

The most intuitive question relates outcome of any given field goal try to distance. The graph is a density plot relating exactly this, distinguished for Success level, namely ‘make’ or ‘miss’.

ggplot(nfl_kick, aes(x =nfl_kick$Distance, fill =nfl_kick$Success)) +
  geom_density(alpha =.4)

Additionally, consider the distribution of attempts relative to temperature. Note that colder temperatures seem to disuade kicking field goals, thus lending a negative skew to the histogram. Clearly, though, attempt volume to temperature is not nearly linear, whether this is strictly due to the distribution of temperature or whether or not temperature has a non-linear degree of influence on Success.

ggplot(nfl_kick, aes(x =nfl_kick$Distance, color =nfl_kick$Success, fill =nfl_kick$Success)) +
  geom_histogram(alpha =.4)
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

Methods

A simple regression model plots Success against Distance. Due to the binary composition of the response, Logistic regression is suited to discovering an equation to fit Success to the optimal subset of explanatory variables. The statistical significance of Distance (p-value, 2e-16) follows.

# Simple: Success:Distance
fg.glm <- glm(nfl_kick$Success ~nfl_kick$Distance, family =binomial)
summary(fg.glm)
## 
## Call:
## glm(formula = nfl_kick$Success ~ nfl_kick$Distance, family = binomial)
## 
## Deviance Residuals: 
##     Min       1Q   Median       3Q      Max  
## -2.7193   0.2479   0.4086   0.6297   1.5497  
## 
## Coefficients:
##                    Estimate Std. Error z value Pr(>|z|)    
## (Intercept)        5.724620   0.137223   41.72   <2e-16 ***
## nfl_kick$Distance -0.102615   0.003135  -32.73   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 10105.0  on 11186  degrees of freedom
## Residual deviance:  8748.4  on 11185  degrees of freedom
## AIC: 8752.4
## 
## Number of Fisher Scoring iterations: 5

A fuller model incorporates Year as well as Distance.

fg.prime.glm <- glm(nfl_kick$Success ~Distance + Year, family =binomial)
summary(fg.prime.glm)
## 
## Call:
## glm(formula = nfl_kick$Success ~ Distance + Year, family = binomial)
## 
## Deviance Residuals: 
##     Min       1Q   Median       3Q      Max  
## -2.7744   0.2491   0.3980   0.6431   1.5753  
## 
## Coefficients:
##               Estimate Std. Error z value Pr(>|z|)    
## (Intercept) -1.062e+02  1.731e+01  -6.137 8.39e-10 ***
## Distance    -1.046e-01  3.171e-03 -32.973  < 2e-16 ***
## Year         5.574e-02  8.620e-03   6.467 1.00e-10 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 10105.0  on 11186  degrees of freedom
## Residual deviance:  8706.3  on 11184  degrees of freedom
## AIC: 8712.3
## 
## Number of Fisher Scoring iterations: 5

Almost as interesting to me as what predictive variables suitably constitute the regression model for the log odds of made field goals is the question of what prompts a kick in the first place. One such question entertatins Distance relative to socre differential (Score Diff). The correlation coefficient follows, after which a scatterplot and linear regression line demonstrate the truth of the interaction. However, statistical significance was found insufficient to warrant a fuller model that incorporated this variable in the regression of Success

cor.test(nfl_kick$ScoreDiff, nfl_kick$Distance)
## 
##  Pearson's product-moment correlation
## 
## data:  nfl_kick$ScoreDiff and nfl_kick$Distance
## t = -5.4355, df = 11185, p-value = 5.58e-08
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
##  -0.06979159 -0.03282712
## sample estimates:
##         cor 
## -0.05132693
ggplot(nfl_kick, aes(x =ScoreDiff, y =Distance)) +
  geom_point(color ='red', size =1) +
  geom_smooth(method ='lm', formula =y ~x, se =TRUE, level =.95)

Outcomes

Predictive Percentage Incorporation

If the outcome of a field goal try is of prime importance, it would benefit the dataset to include a percentage as predicted by the regression of Success on Distance and Year.

ext.fg.d8a <- mutate(nfl_kick, Pred_Perc = round(exp(-106.2 - (.1046 *Distance) + (.05574 *Year)) / 
                                                   (1 + exp(-106.2 - (.1046 *Distance) + (.05574 *Year))), 4) *100)

head(ext.fg.d8a, 4)

Here is a scatterplot of the new Predictive Percentage (Pred_Perc) value against Distance.

attach(ext.fg.d8a)
## The following objects are masked from nfl_kick:
## 
##     Distance, GameMinute, Grass, Kicker, ScoreDiff, Success, Team,
##     Temp, Year
ggplot(ext.fg.d8a, aes(x =Distance, y =Pred_Perc, color =Year)) +
  geom_point(size =2.5, pch =21) 

A Scatterplot of Temperature’s influence on Percentage shows a nearly normal distribution.

ggplot(ext.fg.d8a, aes(x =Temp, y =Pred_Perc, color =Year)) +
  geom_point(size =2.5, pch =21) 

Correlation Coefficient for Temp and Distance

cor.test(nfl_kick$Temp, nfl_kick$Distance)
## 
##  Pearson's product-moment correlation
## 
## data:  nfl_kick$Temp and nfl_kick$Distance
## t = 3.8978, df = 9126, p-value = 9.776e-05
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
##  0.02027001 0.06123177
## sample estimates:
##        cor 
## 0.04076802

Whatever the confounding variables, progressive seasons are benefiting from increased accuracy. Speculate as to the degree of influence will not improve the findings. But additional data and/or the discovery of strong surrogate inputs for confounding variables would improve the ability of modeling techniques in predicting the outcome of a field goal attempt. The enormous improvements in field goal kicking continues to alter the tactics and results of games and play-by-play decisions.

LS0tCnRpdGxlOiAiTSAyMjVfTGFiIDEyIgphdXRob3I6ICJXYWxsLCBTZXRoIgpkYXRlOiAiNC8yMi8yMDIyIgpvdXRwdXQ6IAogIGh0bWxfZG9jdW1lbnQ6CiAgICB0aGVtZTogZmxhdGx5CiAgICBoaWdobGlnaHQ6IHplbmJ1cm4KICAgIHRvYzogeWVzCiAgICB0b2NfZmxvYXQ6IHllcwogICAgZGZfcHJpbnQ6IHBhZ2VkCiAgICBjb2RlX2Rvd25sb2FkOiB5ZXMKLS0tCgpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFLCB3YXJuaW5nID1GQUxTRSkKYGBgCgojICBEYXRhCgojIyBMaWJyYXJpZXMgYW5kIE1hbmlwdWxhdGlvbnMKCmBgYHtyfQpsaWJyYXJ5KGdncGxvdDIpCmxpYnJhcnkoR0dhbGx5KQpsaWJyYXJ5KFJDdXJsKSAKbGlicmFyeSh0aWR5dmVyc2UpCgpuZmxfa2ljayA8LSByZWFkLmNzdigibmZsa2ljay5jc3YiKQphdHRhY2gobmZsX2tpY2spCmRhdGEobmZsX2tpY2spCgpuYW1lcyhuZmxfa2ljaykKYGBgCgpgYGB7cn0KaGVhZChuZmxfa2ljaywgMykKYGBgCgoKIyMgRGF0YSBDbGVhbmluZwoKYGBge3J9Cm5mbF9raWNrJFN1Y2Nlc3MgID0gaWZlbHNlKG5mbF9raWNrJFN1Y2Nlc3MgPT0gMCwgJ01pc3MnLCdNYWtlJykgIyBDcmVhdGUgbGV2ZWxzIGZvciBTdWNjZXNzIFZhcmlhYmxlCm5mbF9raWNrJFN1Y2Nlc3MgPSBhcy5mYWN0b3IobmZsX2tpY2skU3VjY2VzcykKCmNsYXNzKG5mbF9raWNrJFN1Y2Nlc3MpCmxldmVscyhuZmxfa2ljayRTdWNjZXNzKQoKbmZsX2tpY2skU3VjY2VzcyA8LSBmYWN0b3IobmZsX2tpY2skU3VjY2VzcywgbGV2ZWxzID1jKCdNaXNzJywgJ01ha2UnKSkKY29udHJhc3RzKG5mbF9raWNrJFN1Y2Nlc3MpCmBgYAoKCgojICBJbnRyb2R1Y3Rpb24KVGhpcyByZXZpZXcgZGlzZWN0cyBpbmZvcm1hdGlvbiBwZXJ0YWluaW5nIHRvIGZpZWxkIGdvYWwgYXR0ZW1wdHMgYmV0d2VlbiAyMDA1IGFuZCAyMDE1LiAgVGhlIGluZm9ybWF0aW9uIHJlbGF0ZXMgMTEsMTg3IGtpY2tzIG92ZXIgZWxldmVuIHllYXJzIGluIHRoZSBORkwuICBQcmUgYW5kIHBvc3QgZ3JhcGhpY2FsIGV4cGxvcmF0aW9uIG9mIHRoZSBkYXRhc2V0IGFsbG93cyBmb3Igc2V2ZXJhbCBxdWVzdGlvbnMgb2YgaW50ZXJlc3QuICBJbiB0aGlzIHJlcG9ydCwgdGhlIG1ham9yIHF1ZXN0aW9uIGlzIHRoZSByZWxhdGlvbnNoaXAgb2YgU3VjY2Vzcywgb3Igb3V0Y29tZSwgb2Yga2lja3MgdG8gZXhwbGFuYXRvcnkgdmFyaWFibGVzIG9mZmVyZWQgYnkgdGhlIGRhdGFzZXQuICAKCiMjIEJhc2ljIEZhY3RzCgpgYGB7cn0KbnJvdyhuZmxfa2ljaykgIyBob3cgbWFueSBhdHRlbXB0ZWQgZmllbGQgZ29hbHMgaW5jbHVkZWQKYGBgCgpgYGB7cn0KYWxsLmRpc3QuYXR0ZW1wdGVkIDwtIHNvcnQodW5pcXVlKERpc3RhbmNlKSkgIyBzb3J0ZWQgbGlzdCBvZiBmZyBhdHRlbXB0cyBieSBsZW5ndGgKYWxsLmRpc3QuYXR0ZW1wdGVkCmBgYAoKSW5pdGlhbCBncmFwaGljYWwgaW50ZXJwcmV0YXRpb24gc2V0cyB0aGUgYmFyIGZvciBmdXJ0aGVyIHN0dWR5LiAgQ29uc2lkZXIgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHRlbXBlcmF0dXJlIChUZW1wKSBhbmQgZmllbGQgc3VyZmFjZSAoR3Jhc3MpLiAgV2hhdCBmb2xsb3dzIGlzIGEgYm94cGxvdCBkZXBpY3RpbmcgdGhpcyByZWxhdGlvbnNoaXAuICBOb3RpY2UgaG93IHRoZSBtZWRpYW4gYXMgd2VsbCBhcyBpbnRlcnF1YXJ0aWxlIHZhbHVlcyBhcmUgaGlnaGVyIGZvciB0aGUgR3Jhc3MgdmFyaWFibGUuIAoKYGBge3J9CmJveHBsb3QobmZsX2tpY2skVGVtcCB+bmZsX2tpY2skR3Jhc3MsIHlsYWIgPSdUZW1wZXJhdHVyZSBpbiBkZWdyZWVzIEYnLCAKICAgICAgICB4bGFiID0nRmllbGQgU3VyZmFjZTogRiA9VHVyZiwgVCA9U29kJywKICAgICAgICBtYWluID0nQm94cGxvdCBvZiBUZW1wZXJhdHVyZSByZWxhdGl2ZSB0byBGaWVsZCBTdXJmYWNlJywgCiAgICAgICAgYm94bHdkID0yLCBvdXRsd2QgPTIsIGNvbCA9J2dyZWVuJywgb3V0cGNoID0yMSwgb3V0YmcgPSdyZWQnKQpgYGAKClRoZSBtb3N0IGludHVpdGl2ZSBxdWVzdGlvbiByZWxhdGVzIG91dGNvbWUgb2YgYW55IGdpdmVuIGZpZWxkIGdvYWwgdHJ5IHRvIGRpc3RhbmNlLgpUaGUgZ3JhcGggaXMgYSBkZW5zaXR5IHBsb3QgcmVsYXRpbmcgZXhhY3RseSB0aGlzLCBkaXN0aW5ndWlzaGVkIGZvciBTdWNjZXNzIGxldmVsLApuYW1lbHkgJ21ha2UnIG9yICdtaXNzJy4gIAoKYGBge3J9CmdncGxvdChuZmxfa2ljaywgYWVzKHggPW5mbF9raWNrJERpc3RhbmNlLCBmaWxsID1uZmxfa2ljayRTdWNjZXNzKSkgKwogIGdlb21fZGVuc2l0eShhbHBoYSA9LjQpCmBgYAoKQWRkaXRpb25hbGx5LCBjb25zaWRlciB0aGUgZGlzdHJpYnV0aW9uIG9mIGF0dGVtcHRzIHJlbGF0aXZlIHRvIHRlbXBlcmF0dXJlLgpOb3RlIHRoYXQgY29sZGVyIHRlbXBlcmF0dXJlcyBzZWVtIHRvIGRpc3VhZGUga2lja2luZyBmaWVsZCBnb2FscywgdGh1cyBsZW5kaW5nIGEgCm5lZ2F0aXZlIHNrZXcgdG8gdGhlIGhpc3RvZ3JhbS4gIENsZWFybHksIHRob3VnaCwgYXR0ZW1wdCB2b2x1bWUgdG8gdGVtcGVyYXR1cmUgaXMgbm90Cm5lYXJseSBsaW5lYXIsIHdoZXRoZXIgdGhpcyBpcyBzdHJpY3RseSBkdWUgdG8gdGhlIGRpc3RyaWJ1dGlvbiBvZiB0ZW1wZXJhdHVyZSBvcgp3aGV0aGVyIG9yIG5vdCB0ZW1wZXJhdHVyZSBoYXMgYSBub24tbGluZWFyIGRlZ3JlZSBvZiBpbmZsdWVuY2Ugb24gU3VjY2Vzcy4KCmBgYHtyfQpnZ3Bsb3QobmZsX2tpY2ssIGFlcyh4ID1uZmxfa2ljayREaXN0YW5jZSwgY29sb3IgPW5mbF9raWNrJFN1Y2Nlc3MsIGZpbGwgPW5mbF9raWNrJFN1Y2Nlc3MpKSArCiAgZ2VvbV9oaXN0b2dyYW0oYWxwaGEgPS40KQpgYGAKCgoKIyAgTWV0aG9kcwoKQSBzaW1wbGUgcmVncmVzc2lvbiBtb2RlbCBwbG90cyBTdWNjZXNzIGFnYWluc3QgRGlzdGFuY2UuICBEdWUgdG8gdGhlIGJpbmFyeSAKY29tcG9zaXRpb24gb2YgdGhlIHJlc3BvbnNlLCBMb2dpc3RpYyByZWdyZXNzaW9uIGlzIHN1aXRlZCB0byBkaXNjb3ZlcmluZyBhbiAKZXF1YXRpb24gdG8gZml0IFN1Y2Nlc3MgdG8gdGhlIG9wdGltYWwgc3Vic2V0IG9mIGV4cGxhbmF0b3J5IHZhcmlhYmxlcy4gIFRoZSAKc3RhdGlzdGljYWwgc2lnbmlmaWNhbmNlIG9mIERpc3RhbmNlIChwLXZhbHVlLCAyZS0xNikgZm9sbG93cy4KCmBgYHtyfQojIFNpbXBsZTogU3VjY2VzczpEaXN0YW5jZQpmZy5nbG0gPC0gZ2xtKG5mbF9raWNrJFN1Y2Nlc3Mgfm5mbF9raWNrJERpc3RhbmNlLCBmYW1pbHkgPWJpbm9taWFsKQpzdW1tYXJ5KGZnLmdsbSkKYGBgCgpBIGZ1bGxlciBtb2RlbCBpbmNvcnBvcmF0ZXMgWWVhciBhcyB3ZWxsIGFzIERpc3RhbmNlLgoKYGBge3J9CmZnLnByaW1lLmdsbSA8LSBnbG0obmZsX2tpY2skU3VjY2VzcyB+RGlzdGFuY2UgKyBZZWFyLCBmYW1pbHkgPWJpbm9taWFsKQpzdW1tYXJ5KGZnLnByaW1lLmdsbSkKYGBgCgpBbG1vc3QgYXMgaW50ZXJlc3RpbmcgdG8gbWUgYXMgd2hhdCBwcmVkaWN0aXZlIHZhcmlhYmxlcyBzdWl0YWJseSBjb25zdGl0dXRlIHRoZSAKcmVncmVzc2lvbiBtb2RlbCBmb3IgdGhlIGxvZyBvZGRzIG9mIG1hZGUgZmllbGQgZ29hbHMgaXMgdGhlIHF1ZXN0aW9uIG9mIHdoYXQgcHJvbXB0cwphIGtpY2sgaW4gdGhlIGZpcnN0IHBsYWNlLiAgT25lIHN1Y2ggcXVlc3Rpb24gZW50ZXJ0YXRpbnMgRGlzdGFuY2UgcmVsYXRpdmUgdG8gCnNvY3JlIGRpZmZlcmVudGlhbCAoU2NvcmUgRGlmZikuICBUaGUgY29ycmVsYXRpb24gY29lZmZpY2llbnQgZm9sbG93cywgYWZ0ZXIgd2hpY2ggCmEgc2NhdHRlcnBsb3QgYW5kIGxpbmVhciByZWdyZXNzaW9uIGxpbmUgZGVtb25zdHJhdGUgdGhlIHRydXRoIG9mIHRoZSBpbnRlcmFjdGlvbi4KSG93ZXZlciwgc3RhdGlzdGljYWwgc2lnbmlmaWNhbmNlIHdhcyBmb3VuZCBpbnN1ZmZpY2llbnQgdG8gd2FycmFudCBhIGZ1bGxlciBtb2RlbAp0aGF0IGluY29ycG9yYXRlZCB0aGlzIHZhcmlhYmxlIGluIHRoZSByZWdyZXNzaW9uIG9mIFN1Y2Nlc3MKCmBgYHtyfQpjb3IudGVzdChuZmxfa2ljayRTY29yZURpZmYsIG5mbF9raWNrJERpc3RhbmNlKQpgYGAKCgpgYGB7cn0KZ2dwbG90KG5mbF9raWNrLCBhZXMoeCA9U2NvcmVEaWZmLCB5ID1EaXN0YW5jZSkpICsKICBnZW9tX3BvaW50KGNvbG9yID0ncmVkJywgc2l6ZSA9MSkgKwogIGdlb21fc21vb3RoKG1ldGhvZCA9J2xtJywgZm9ybXVsYSA9eSB+eCwgc2UgPVRSVUUsIGxldmVsID0uOTUpCmBgYAoKCgojICBPdXRjb21lcwoKIyMgUHJlZGljdGl2ZSBQZXJjZW50YWdlIEluY29ycG9yYXRpb24KCklmIHRoZSBvdXRjb21lIG9mIGEgZmllbGQgZ29hbCB0cnkgaXMgb2YgcHJpbWUgaW1wb3J0YW5jZSwgaXQgd291bGQgYmVuZWZpdCB0aGUgCmRhdGFzZXQgdG8gaW5jbHVkZSBhIHBlcmNlbnRhZ2UgYXMgcHJlZGljdGVkIGJ5IHRoZSByZWdyZXNzaW9uIG9mIFN1Y2Nlc3Mgb24gCkRpc3RhbmNlIGFuZCBZZWFyLiAgCgpgYGB7cn0KZXh0LmZnLmQ4YSA8LSBtdXRhdGUobmZsX2tpY2ssIFByZWRfUGVyYyA9IHJvdW5kKGV4cCgtMTA2LjIgLSAoLjEwNDYgKkRpc3RhbmNlKSArICguMDU1NzQgKlllYXIpKSAvIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMSArIGV4cCgtMTA2LjIgLSAoLjEwNDYgKkRpc3RhbmNlKSArICguMDU1NzQgKlllYXIpKSksIDQpICoxMDApCgpoZWFkKGV4dC5mZy5kOGEsIDQpCmBgYAoKSGVyZSBpcyBhIHNjYXR0ZXJwbG90IG9mIHRoZSBuZXcgUHJlZGljdGl2ZSBQZXJjZW50YWdlIChQcmVkX1BlcmMpIHZhbHVlIGFnYWluc3QKRGlzdGFuY2UuICAKYGBge3J9CmF0dGFjaChleHQuZmcuZDhhKQoKZ2dwbG90KGV4dC5mZy5kOGEsIGFlcyh4ID1EaXN0YW5jZSwgeSA9UHJlZF9QZXJjLCBjb2xvciA9WWVhcikpICsKICBnZW9tX3BvaW50KHNpemUgPTIuNSwgcGNoID0yMSkgCmBgYAoKQSBTY2F0dGVycGxvdCBvZiBUZW1wZXJhdHVyZSdzIGluZmx1ZW5jZSBvbiBQZXJjZW50YWdlIHNob3dzIGEgCm5lYXJseSBub3JtYWwgZGlzdHJpYnV0aW9uLiAgCgpgYGB7cn0KZ2dwbG90KGV4dC5mZy5kOGEsIGFlcyh4ID1UZW1wLCB5ID1QcmVkX1BlcmMsIGNvbG9yID1ZZWFyKSkgKwogIGdlb21fcG9pbnQoc2l6ZSA9Mi41LCBwY2ggPTIxKSAKYGBgCgpDb3JyZWxhdGlvbiBDb2VmZmljaWVudCBmb3IgVGVtcCBhbmQgRGlzdGFuY2UgCmBgYHtyfQpjb3IudGVzdChuZmxfa2ljayRUZW1wLCBuZmxfa2ljayREaXN0YW5jZSkKYGBgCgpXaGF0ZXZlciB0aGUgY29uZm91bmRpbmcgdmFyaWFibGVzLCBwcm9ncmVzc2l2ZSBzZWFzb25zIGFyZSBiZW5lZml0aW5nIGZyb20gCmluY3JlYXNlZCBhY2N1cmFjeS4gIFNwZWN1bGF0ZSBhcyB0byB0aGUgZGVncmVlIG9mIGluZmx1ZW5jZSB3aWxsIG5vdCBpbXByb3ZlIHRoZSAKZmluZGluZ3MuICBCdXQgYWRkaXRpb25hbCBkYXRhIGFuZC9vciB0aGUgZGlzY292ZXJ5IG9mIHN0cm9uZyBzdXJyb2dhdGUgaW5wdXRzIGZvciAKY29uZm91bmRpbmcgdmFyaWFibGVzIHdvdWxkIGltcHJvdmUgdGhlIGFiaWxpdHkgb2YgbW9kZWxpbmcgdGVjaG5pcXVlcyBpbiBwcmVkaWN0aW5nCnRoZSBvdXRjb21lIG9mIGEgZmllbGQgZ29hbCBhdHRlbXB0LiAgVGhlIGVub3Jtb3VzIGltcHJvdmVtZW50cyBpbiBmaWVsZCBnb2FsIGtpY2tpbmcKY29udGludWVzIHRvIGFsdGVyIHRoZSB0YWN0aWNzIGFuZCByZXN1bHRzIG9mIGdhbWVzIGFuZCBwbGF5LWJ5LXBsYXkgZGVjaXNpb25zLiAKCgoK