Author

Problem Statement

In a 2006 football match between American Samoa and Australia, Australia scored 31 goals and American Samoa scored zero, link. Despite the total goal range being incredibly high in this particular football match, the range of total goals in most football matches are not. This brings into question what distribution do goals take across a ninety minute football match? To provide insight into this question, the theoretical Poisson distribution used the mean expected number of goals for a match to form a probability distribution. This was compared to the empirical distribution produced by total goals per game from a sample of football matches in the top four English leagues. Further, probabilities of parameters zero, two, three, four and greater than five goals were compared between the empirical and Poisson distributions. The Poisson distribution was chosen over other theoretical distributions because of the current study context. Data is collected over the duration of one football match of ninety minutes. The frequency of goals is counted over football match duration, goals cannot happen simultaneously and goals from one football match are independent from another football match. One thing to approach cautiously about using a Poisson distribution to model football goals is the independence of goals during a ninety minute period. For the purpose of this study, goals in one match will be considered independent.

\(P(k) = e^{-\lambda} \frac{\lambda^k} {k!}\)

Load Packages

#install.packages("devtools")
knitr::opts_chunk$set(echo = TRUE)
library(devtools)
#install_github('jalapic/engsoccerdata', username = "jalapic")
library(engsoccerdata)
library(dplyr)

Data

The dataset was obtained via the website GitHub. A package called ‘devtools’ was installed to allow access to the ‘engsoccerdata’ package. Engsoccerdata contains numerous sets of data. The set chosen for this study was ‘england’ (James P. Curley (2016). engsoccerdata: English Soccer Data 1871-2016. R package version 0.1.5). The football leagues observed in the ‘england’ dataset are the English Premier League, Football League Championship, Football League One and Football League Two. Data spans across 192004 football matches and ranges from 1888 to 2016. Data across numerous variables are collected in this dataset. Which include date, stadium, home team goals, away team goals, total goals and etc. This study is interested in observing the number of goals per match, so only the sum of goals scored per match is analysed. This was achieved by using the ‘totgoal’ variable. No manipulation to data was required and a search for missing variables in the data set did not return any results.

new<-subset(england, england$totgoal=="NA") #In an attempt to find missing observations; assign missing observations to a variable
nrow(new) #return number of rows in missing observation variable, no missing observations were found
[1] 0

The number of rows in the created varialbe new is zero. Meaning there are no missing observations in the totgoal variable.

Distribution Fitting

The following calculates the mean of the empirical distribution. It is used as a parameter in the poisson distribution.

TG <- england$totgoal #Assign variable of interest to a more accessible name
mean(TG) %>% round(3) #Calculate empirical mean
[1] 2.877

Expected mean of sample is 2.88 goals per game.

The following code plots a Poisson distribution with the mean of total goals scored across one time period; \(\lambda\) = 2.88

#Set Poisson parameters
lambda <- 2.88
mu <- lambda
# Set sequence of x values to plot
Events <- seq(ifelse(sign(round(mu-sqrt(mu)*4,0))==-1,0,round(mu-sqrt(mu)*4,0)),round(mu+sqrt(mu)*4,0))
# Calculate PMF
PMF <- dpois(x = Events, lambda = mu)
# Plot PMF
hist(TG, freq = FALSE, right = FALSE, ylim = c(0, 0.25),xlab = "Goals", ylab = "PMF", main = "Distribution of Goals \n Poisson Distribution, Mean = 2.88")
points(Events, PMF, type = "p",main = paste("Poisson Distribution, Mean = ",mu), xlim = c(0,17), col = "blue")
lines(Events, PMF, type = "l", col= "blue")

The histogram is skewed to the right, the majority of observations are between zero and five goals. As shown in the plot above, the theoretical distribution predicts the empirical distribution very closely. The Poisson distribution under predicts games with zero goals and it over predicts games with three and four goals. However, it is a near perfect prediction of games with one and two goals.

From the engsoccer sample, the majority of matches have a range of goals between zero and five. Out of interest, the probability of six or more goals happening in a match was examined.

ppois(5,2.88,lower.tail = FALSE) %>% round(3)
[1] 0.072

Using the Poisson distribution with lambda 2.88, the probability of six or more goals happening in a match is 0.072.

The following chart visuallises this.

# Set Poisson parameters. 
lambda <- 2.88
mu <- lambda
# Define PMF to highlight - Pr(X < x), Pr(X > x), or Pr(a < x < b)
x <- ""
a <- 6
b <- 12
# Set sequence of x values to plot
Events <- seq(ifelse(sign(round(mu-sqrt(mu)*4,0))==-1,0,round(mu-sqrt(mu)*4,0)),round(mu+sqrt(mu)*4,0))
# Calculate PMF
PMF <- dpois(x = Events, lambda = mu)
# Define points to highlight in plot
highlight <- ifelse(Events <= b & Events >= a | Events == x, "red", "blue")
# Plot PMF
plot(Events, PMF, type = "p", main = paste("Poisson Distribution, Mean = ",mu), col = highlight)
lines(Events, PMF, type = "h", col = highlight)

The cumulative value of the lines coloured red equals the probability of a match having more than five goals (0.072).

Next, a table presented empirical probabilities, Poisson probabilites, and the difference between them. This was done by observing matches with zero, two, three, four and greater than five goals.

#Subset sample and calcualte probabilities; assigned variables
zeroG<-nrow(subset(england, england$totgoal==0))/length(TG)
twoG<-nrow(subset(england, england$totgoal==2))/length(TG)
threeG<-nrow(subset(england, england$totgoal==3))/length(TG)
fourG<-nrow(subset(england, england$totgoal==4))/length(TG)
Grt5G<-nrow(subset(england, england$totgoal>5))/length(TG)
#create data frame of probabilities and difference
Poisson_probability <- c(dpois(0, 2.88),dpois(2, 2.88), dpois(3, 2.88),dpois(4, 2.88), ppois(5,2.88,lower.tail = FALSE)) %>% round(3)
Empirical_probability <- c(zeroG, twoG, threeG, fourG, Grt5G) %>% round(3)
Number_of_Goals<- c(0,2,3,4, "5<")
Empirical_Poisson_Difference<-(Empirical_probability-Poisson_probability) %>%round(3)
#Dataframe
df<- data.frame(Number_of_Goals, Empirical_probability, Poisson_probability,Empirical_Poisson_Difference)
#table
knitr::kable(df, caption = "Empirical, Poisson & Difference")
Number_of_Goals Empirical_probability Poisson_probability Empirical_Poisson_Difference
0 0.072 0.056 0.016
2 0.232 0.233 -0.001
3 0.208 0.223 -0.015
4 0.153 0.161 -0.008
5< 0.085 0.072 0.013

Interpretation

From output it appears the theoretical poisson distribution with \(\lambda\)=2.88 fits the empirical distribution very well. The final table stored in the df dataframe compares probability values between the empirical and Poisson distributions. Certain k points of interest between the empirical and theoretical distributions were zero, two, three, four and greater than five goals in the leagues observed. These points show the predicted accuracy in the Poisson distribution. The probability difference between the empirical and Poisson distribution in games with a total of two goals is 0.001, this difference is very small. The probability difference between games with zero, three and greater than five goals is 0.016, 0.015 and 0.013 respectively. These points display the largest probability difference between the empirical and Poisson distribution. The next largest probability difference is four goals with 0.008. Despite the existence of differences between the empirical and Poisson distributions, the Poisson distribution appears to predict the distribution of total goals per match very closely to the empirical distribution. Needless to say, limitation of using the Poisson distribution is the lack of analysis surrounding the variance of the empirical distribution. The variance could potentially be used to explain differences between empirical and theoretical distributions. Also, the Poisson distribution overlooks the independence of goals that happen within one match period of ninety minutes.

LS0tDQp0aXRsZTogIk1vZGVsbGluZyB0aGUgRGlzdHJpYnV0aW9uIG9mIEZvb3RiYWxsIEdvYWxzIg0Kb3V0cHV0OiBodG1sX25vdGVib29rDQotLS0NCg0KIyMgQXV0aG9yDQoNCiogT2xpdmVyIEVhdG9uIChvbGl2ZXJmLmVhdG9uQGdtYWlsLmNvbSkNCg0KIyMgUHJvYmxlbSBTdGF0ZW1lbnQNCkluIGEgMjAwNiBmb290YmFsbCBtYXRjaCBiZXR3ZWVuIEFtZXJpY2FuIFNhbW9hIGFuZCBBdXN0cmFsaWEsIEF1c3RyYWxpYSBzY29yZWQgMzEgZ29hbHMgYW5kIEFtZXJpY2FuIFNhbW9hIHNjb3JlZCB6ZXJvLCBbbGlua10oaHR0cHM6Ly93d3cueW91dHViZS5jb20vd2F0Y2g/dj0xd2c5b3g5RjdWdykuIA0KRGVzcGl0ZSB0aGUgdG90YWwgZ29hbCByYW5nZSBiZWluZyBpbmNyZWRpYmx5IGhpZ2ggaW4gdGhpcyBwYXJ0aWN1bGFyIGZvb3RiYWxsIG1hdGNoLCB0aGUgcmFuZ2Ugb2YgdG90YWwgZ29hbHMgaW4gbW9zdCBmb290YmFsbCBtYXRjaGVzIGFyZSBub3QuIFRoaXMgYnJpbmdzIGludG8gcXVlc3Rpb24gd2hhdCBkaXN0cmlidXRpb24gZG8gZ29hbHMgdGFrZSBhY3Jvc3MgYSBuaW5ldHkgbWludXRlIGZvb3RiYWxsIG1hdGNoPyBUbyBwcm92aWRlIGluc2lnaHQgaW50byB0aGlzIHF1ZXN0aW9uLCB0aGUgdGhlb3JldGljYWwgUG9pc3NvbiBkaXN0cmlidXRpb24gdXNlZCB0aGUgbWVhbiBleHBlY3RlZCBudW1iZXIgb2YgZ29hbHMgZm9yIGEgbWF0Y2ggdG8gZm9ybSBhIHByb2JhYmlsaXR5IGRpc3RyaWJ1dGlvbi4gVGhpcyB3YXMgY29tcGFyZWQgdG8gdGhlIGVtcGlyaWNhbCBkaXN0cmlidXRpb24gcHJvZHVjZWQgYnkgdG90YWwgZ29hbHMgcGVyIGdhbWUgZnJvbSBhIHNhbXBsZSBvZiBmb290YmFsbCBtYXRjaGVzIGluIHRoZSB0b3AgZm91ciBFbmdsaXNoIGxlYWd1ZXMuIA0KRnVydGhlciwgcHJvYmFiaWxpdGllcyBvZiBwYXJhbWV0ZXJzIHplcm8sIHR3bywgdGhyZWUsIGZvdXIgYW5kIGdyZWF0ZXIgdGhhbiBmaXZlIGdvYWxzIHdlcmUgY29tcGFyZWQgYmV0d2VlbiB0aGUgZW1waXJpY2FsIGFuZCBQb2lzc29uIGRpc3RyaWJ1dGlvbnMuIFRoZSBQb2lzc29uIGRpc3RyaWJ1dGlvbiB3YXMgY2hvc2VuIG92ZXIgb3RoZXIgdGhlb3JldGljYWwgZGlzdHJpYnV0aW9ucyBiZWNhdXNlIG9mIHRoZSBjdXJyZW50IHN0dWR5IGNvbnRleHQuIERhdGEgaXMgY29sbGVjdGVkIG92ZXIgdGhlIGR1cmF0aW9uIG9mIG9uZSBmb290YmFsbCBtYXRjaCBvZiBuaW5ldHkgbWludXRlcy4gVGhlIGZyZXF1ZW5jeSBvZiBnb2FscyBpcyBjb3VudGVkIG92ZXIgZm9vdGJhbGwgbWF0Y2ggZHVyYXRpb24sIGdvYWxzIGNhbm5vdCBoYXBwZW4gc2ltdWx0YW5lb3VzbHkgYW5kIGdvYWxzIGZyb20gb25lIGZvb3RiYWxsIG1hdGNoIGFyZSBpbmRlcGVuZGVudCBmcm9tIGFub3RoZXIgZm9vdGJhbGwgbWF0Y2guIE9uZSB0aGluZyB0byBhcHByb2FjaCBjYXV0aW91c2x5IGFib3V0IHVzaW5nIGEgUG9pc3NvbiBkaXN0cmlidXRpb24gdG8gbW9kZWwgZm9vdGJhbGwgZ29hbHMgaXMgdGhlIGluZGVwZW5kZW5jZSBvZiBnb2FscyBkdXJpbmcgYSBuaW5ldHkgbWludXRlIHBlcmlvZC4gRm9yIHRoZSBwdXJwb3NlIG9mIHRoaXMgc3R1ZHksIGdvYWxzIGluIG9uZSBtYXRjaCB3aWxsIGJlIGNvbnNpZGVyZWQgaW5kZXBlbmRlbnQuDQoNCiogVGhlIFBvaXNzb24gZGlzdHJpYnV0aW9uIGhhcyB0aGUgZm9sbG93aW5nIGNoYXJhY3RlcmlzdGljczogICAgIA0KICAgICArIEFuIGV2ZW50IGNhbiBvY2N1ciAwLCAxLCAyLC4uLCBrLTEsIGsuIHRpbWVzIGluIGFuIGludGVydmFsLiAgICAgDQogICAgKyBUaGUgYXZlcmFnZSBudW1iZXIgb2YgZXZlbnRzIGluIGFuIGludGVydmFsIGlzIGRlc2lnbmF0ZWQgcGFyYW1ldGVyICRcbGFtYmRhJCAobGFtYmRhKS4gICAgIA0KICAgICsgVGhlIHByb2JhYmlsaXR5IG9mIG9ic2VydmluZyBrIGV2ZW50cyBpbiBhbiBpbnRlcnZhbCBpcyBnaXZlbiBieSB0aGUgcHJvYmFiaWxpdHkgbWFzcyBmdW5jdGlvbiBlcXVhdGlvbi4NCg0KDQogICRQKGspID0gIGVeey1cbGFtYmRhfSBcZnJhY3tcbGFtYmRhXmt9IHtrIX0kDQoNCiogV2hlcmU6DQogICAgKyAkXGxhbWJkYSQgaXMgdGhlIGF2ZXJhZ2UgbnVtYmVyIG9mIGV2ZW50cyBwZXIgaW50ZXJ2YWwuIA0KICAgICsgKmUqIGlzIGNvbnN0YW50LCBldWxlcnMgbnVtYmVyIDIuNzgyOCANCiAgICArICprKiB0YWtlcyBkaXNjcmV0ZSB2YWx1ZXMgMCwgMSwgMiwuIA0KICAgICsgKmshID0gayB4IChrLTEpIHggKGstMikgeCAgIHggMiB4IDEqIA0KICAgICsgVGhlIGV4cGVjdGVkIG1lYW4gYW5kIHZhcmlhbmNlIG9mIGEgcmFuZG9tbHkgZGlzdHJpYnV0ZWQgcG9pc3NvbiB2YXJpYWJsZSBhcmUgYm90aCBlcXVhbCB0byBsYW1iZGEuDQoNCiMjIExvYWQgUGFja2FnZXMNCmBgYHtyfQ0KI2luc3RhbGwucGFja2FnZXMoImRldnRvb2xzIikNCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSkNCmxpYnJhcnkoZGV2dG9vbHMpDQojaW5zdGFsbF9naXRodWIoJ2phbGFwaWMvZW5nc29jY2VyZGF0YScsIHVzZXJuYW1lID0gImphbGFwaWMiKQ0KbGlicmFyeShlbmdzb2NjZXJkYXRhKQ0KbGlicmFyeShkcGx5cikNCmBgYA0KIyMgRGF0YQ0KVGhlIGRhdGFzZXQgd2FzIG9idGFpbmVkIHZpYSB0aGUgd2Vic2l0ZSBHaXRIdWIuIEEgcGFja2FnZSBjYWxsZWQgJ2RldnRvb2xzJyB3YXMgaW5zdGFsbGVkIHRvIGFsbG93IGFjY2VzcyB0byB0aGUgJ2VuZ3NvY2NlcmRhdGEnIHBhY2thZ2UuICpFbmdzb2NjZXJkYXRhKiBjb250YWlucyBudW1lcm91cyBzZXRzIG9mIGRhdGEuIFRoZSBzZXQgY2hvc2VuIGZvciB0aGlzIHN0dWR5IHdhcyAnZW5nbGFuZCcgKEphbWVzIFAuIEN1cmxleSAoMjAxNikuIGVuZ3NvY2NlcmRhdGE6IEVuZ2xpc2ggU29jY2VyIERhdGEgMTg3MS0yMDE2LiBSIHBhY2thZ2UgdmVyc2lvbiAwLjEuNSkuIFRoZSBmb290YmFsbCBsZWFndWVzIG9ic2VydmVkIGluIHRoZSAnZW5nbGFuZCcgZGF0YXNldCBhcmUgdGhlIEVuZ2xpc2ggUHJlbWllciBMZWFndWUsIEZvb3RiYWxsIExlYWd1ZSBDaGFtcGlvbnNoaXAsIEZvb3RiYWxsIExlYWd1ZSBPbmUgYW5kIEZvb3RiYWxsIExlYWd1ZSBUd28uIERhdGEgc3BhbnMgYWNyb3NzIDE5MjAwNCBmb290YmFsbCBtYXRjaGVzIGFuZCByYW5nZXMgZnJvbSAxODg4IHRvIDIwMTYuIERhdGEgYWNyb3NzIG51bWVyb3VzIHZhcmlhYmxlcyBhcmUgY29sbGVjdGVkIGluIHRoaXMgZGF0YXNldC4gV2hpY2ggaW5jbHVkZSBkYXRlLCBzdGFkaXVtLCBob21lIHRlYW0gZ29hbHMsIGF3YXkgdGVhbSBnb2FscywgdG90YWwgZ29hbHMgYW5kIGV0Yy4gVGhpcyBzdHVkeSBpcyBpbnRlcmVzdGVkIGluIG9ic2VydmluZyB0aGUgbnVtYmVyIG9mIGdvYWxzIHBlciBtYXRjaCwgc28gb25seSB0aGUgc3VtIG9mIGdvYWxzIHNjb3JlZCBwZXIgbWF0Y2ggaXMgYW5hbHlzZWQuIFRoaXMgd2FzIGFjaGlldmVkIGJ5IHVzaW5nIHRoZSAndG90Z29hbCcgdmFyaWFibGUuIE5vIG1hbmlwdWxhdGlvbiB0byBkYXRhIHdhcyByZXF1aXJlZCBhbmQgYSBzZWFyY2ggZm9yIG1pc3NpbmcgdmFyaWFibGVzIGluIHRoZSBkYXRhIHNldCBkaWQgbm90IHJldHVybiBhbnkgcmVzdWx0cy4NCg0KYGBge3J9DQpuZXc8LXN1YnNldChlbmdsYW5kLCBlbmdsYW5kJHRvdGdvYWw9PSJOQSIpICNJbiBhbiBhdHRlbXB0IHRvIGZpbmQgbWlzc2luZyBvYnNlcnZhdGlvbnM7IGFzc2lnbiBtaXNzaW5nIG9ic2VydmF0aW9ucyB0byBhIHZhcmlhYmxlDQpucm93KG5ldykgI3JldHVybiBudW1iZXIgb2Ygcm93cyBpbiBtaXNzaW5nIG9ic2VydmF0aW9uIHZhcmlhYmxlLCBubyBtaXNzaW5nIG9ic2VydmF0aW9ucyB3ZXJlIGZvdW5kDQpgYGANClRoZSBudW1iZXIgb2Ygcm93cyBpbiB0aGUgY3JlYXRlZCB2YXJpYWxiZSAqbmV3KiBpcyB6ZXJvLiBNZWFuaW5nIHRoZXJlIGFyZSBubyBtaXNzaW5nIG9ic2VydmF0aW9ucyBpbiB0aGUgKnRvdGdvYWwqIHZhcmlhYmxlLiAgIA0KDQojIyBEaXN0cmlidXRpb24gRml0dGluZw0KVGhlIGZvbGxvd2luZyBjYWxjdWxhdGVzIHRoZSBtZWFuIG9mIHRoZSBlbXBpcmljYWwgZGlzdHJpYnV0aW9uLiBJdCBpcyB1c2VkIGFzIGEgcGFyYW1ldGVyIGluIHRoZSBwb2lzc29uIGRpc3RyaWJ1dGlvbi4gDQpgYGB7cn0NClRHIDwtIGVuZ2xhbmQkdG90Z29hbCAjQXNzaWduIHZhcmlhYmxlIG9mIGludGVyZXN0IHRvIGEgbW9yZSBhY2Nlc3NpYmxlIG5hbWUNCm1lYW4oVEcpICU+JSByb3VuZCgzKSAjQ2FsY3VsYXRlIGVtcGlyaWNhbCBtZWFuDQpgYGANCkV4cGVjdGVkIG1lYW4gb2Ygc2FtcGxlIGlzIDIuODggZ29hbHMgcGVyIGdhbWUuDQoNClRoZSBmb2xsb3dpbmcgY29kZSBwbG90cyBhIFBvaXNzb24gZGlzdHJpYnV0aW9uIHdpdGggdGhlIG1lYW4gb2YgdG90YWwgZ29hbHMgc2NvcmVkIGFjcm9zcyBvbmUgdGltZSBwZXJpb2Q7ICRcbGFtYmRhJCA9IDIuODgNCmBgYHtyfQ0KI1NldCBQb2lzc29uIHBhcmFtZXRlcnMNCmxhbWJkYSA8LSAyLjg4DQptdSA8LSBsYW1iZGENCiMgU2V0IHNlcXVlbmNlIG9mIHggdmFsdWVzIHRvIHBsb3QNCkV2ZW50cyA8LSBzZXEoaWZlbHNlKHNpZ24ocm91bmQobXUtc3FydChtdSkqNCwwKSk9PS0xLDAscm91bmQobXUtc3FydChtdSkqNCwwKSkscm91bmQobXUrc3FydChtdSkqNCwwKSkNCiMgQ2FsY3VsYXRlIFBNRg0KUE1GIDwtIGRwb2lzKHggPSBFdmVudHMsIGxhbWJkYSA9IG11KQ0KIyBQbG90IFBNRg0KaGlzdChURywgZnJlcSA9IEZBTFNFLCByaWdodCA9IEZBTFNFLCB5bGltID0gYygwLCAwLjI1KSx4bGFiID0gIkdvYWxzIiwgeWxhYiA9ICJQTUYiLCBtYWluID0gIkRpc3RyaWJ1dGlvbiBvZiBHb2FscyBcbiBQb2lzc29uIERpc3RyaWJ1dGlvbiwgTWVhbiA9IDIuODgiKQ0KcG9pbnRzKEV2ZW50cywgUE1GLCB0eXBlID0gInAiLG1haW4gPSBwYXN0ZSgiUG9pc3NvbiBEaXN0cmlidXRpb24sIE1lYW4gPSAiLG11KSwgeGxpbSA9IGMoMCwxNyksIGNvbCA9ICJibHVlIikNCmxpbmVzKEV2ZW50cywgUE1GLCB0eXBlID0gImwiLCBjb2w9ICJibHVlIikNCmBgYA0KVGhlIGhpc3RvZ3JhbSBpcyBza2V3ZWQgdG8gdGhlIHJpZ2h0LCB0aGUgbWFqb3JpdHkgb2Ygb2JzZXJ2YXRpb25zIGFyZSBiZXR3ZWVuIHplcm8gYW5kIGZpdmUgZ29hbHMuIEFzIHNob3duIGluIHRoZSBwbG90IGFib3ZlLCB0aGUgdGhlb3JldGljYWwgZGlzdHJpYnV0aW9uIHByZWRpY3RzIHRoZSBlbXBpcmljYWwgZGlzdHJpYnV0aW9uIHZlcnkgY2xvc2VseS4gVGhlIFBvaXNzb24gZGlzdHJpYnV0aW9uIHVuZGVyIHByZWRpY3RzIGdhbWVzIHdpdGggemVybyBnb2FscyBhbmQgaXQgb3ZlciBwcmVkaWN0cyBnYW1lcyB3aXRoIHRocmVlIGFuZCBmb3VyIGdvYWxzLiBIb3dldmVyLCBpdCBpcyBhIG5lYXIgcGVyZmVjdCBwcmVkaWN0aW9uIG9mIGdhbWVzIHdpdGggb25lIGFuZCB0d28gZ29hbHMuIA0KDQpGcm9tIHRoZSAqZW5nc29jY2VyKiBzYW1wbGUsIHRoZSBtYWpvcml0eSBvZiBtYXRjaGVzIGhhdmUgYSByYW5nZSBvZiBnb2FscyBiZXR3ZWVuIHplcm8gYW5kIGZpdmUuIE91dCBvZiBpbnRlcmVzdCwgdGhlIHByb2JhYmlsaXR5IG9mIHNpeCBvciBtb3JlIGdvYWxzIGhhcHBlbmluZyBpbiBhIG1hdGNoIHdhcyBleGFtaW5lZC4NCmBgYHtyfQ0KcHBvaXMoNSwyLjg4LGxvd2VyLnRhaWwgPSBGQUxTRSkgJT4lIHJvdW5kKDMpDQpgYGANClVzaW5nIHRoZSBQb2lzc29uIGRpc3RyaWJ1dGlvbiB3aXRoIGxhbWJkYSAyLjg4LCB0aGUgcHJvYmFiaWxpdHkgb2Ygc2l4IG9yIG1vcmUgZ29hbHMgaGFwcGVuaW5nIGluIGEgbWF0Y2ggaXMgMC4wNzIuIA0KDQpUaGUgZm9sbG93aW5nIGNoYXJ0IHZpc3VhbGxpc2VzIHRoaXMuDQpgYGB7cn0NCiMgU2V0IFBvaXNzb24gcGFyYW1ldGVycy4gDQpsYW1iZGEgPC0gMi44OA0KbXUgPC0gbGFtYmRhDQojIERlZmluZSBQTUYgdG8gaGlnaGxpZ2h0IC0gUHIoWCA8IHgpLCBQcihYID4geCksIG9yIFByKGEgPCB4IDwgYikNCnggPC0gIiINCmEgPC0gNg0KYiA8LSAxMg0KIyBTZXQgc2VxdWVuY2Ugb2YgeCB2YWx1ZXMgdG8gcGxvdA0KRXZlbnRzIDwtIHNlcShpZmVsc2Uoc2lnbihyb3VuZChtdS1zcXJ0KG11KSo0LDApKT09LTEsMCxyb3VuZChtdS1zcXJ0KG11KSo0LDApKSxyb3VuZChtdStzcXJ0KG11KSo0LDApKQ0KIyBDYWxjdWxhdGUgUE1GDQpQTUYgPC0gZHBvaXMoeCA9IEV2ZW50cywgbGFtYmRhID0gbXUpDQojIERlZmluZSBwb2ludHMgdG8gaGlnaGxpZ2h0IGluIHBsb3QNCmhpZ2hsaWdodCA8LSBpZmVsc2UoRXZlbnRzIDw9IGIgJiBFdmVudHMgPj0gYSB8IEV2ZW50cyA9PSB4LCAicmVkIiwgImJsdWUiKQ0KIyBQbG90IFBNRg0KcGxvdChFdmVudHMsIFBNRiwgdHlwZSA9ICJwIiwgbWFpbiA9IHBhc3RlKCJQb2lzc29uIERpc3RyaWJ1dGlvbiwgTWVhbiA9ICIsbXUpLCBjb2wgPSBoaWdobGlnaHQpDQpsaW5lcyhFdmVudHMsIFBNRiwgdHlwZSA9ICJoIiwgY29sID0gaGlnaGxpZ2h0KQ0KYGBgDQpUaGUgY3VtdWxhdGl2ZSB2YWx1ZSBvZiB0aGUgbGluZXMgY29sb3VyZWQgcmVkIGVxdWFscyB0aGUgcHJvYmFiaWxpdHkgb2YgYSBtYXRjaCBoYXZpbmcgbW9yZSB0aGFuIGZpdmUgZ29hbHMgKDAuMDcyKS4NCg0KTmV4dCwgYSB0YWJsZSBwcmVzZW50ZWQgZW1waXJpY2FsIHByb2JhYmlsaXRpZXMsIFBvaXNzb24gcHJvYmFiaWxpdGVzLCBhbmQgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGVtLiBUaGlzIHdhcyBkb25lIGJ5IG9ic2VydmluZyBtYXRjaGVzIHdpdGggemVybywgdHdvLCB0aHJlZSwgZm91ciBhbmQgZ3JlYXRlciB0aGFuIGZpdmUgZ29hbHMuDQpgYGB7cn0NCiNTdWJzZXQgc2FtcGxlIGFuZCBjYWxjdWFsdGUgcHJvYmFiaWxpdGllczsgYXNzaWduZWQgdmFyaWFibGVzDQp6ZXJvRzwtbnJvdyhzdWJzZXQoZW5nbGFuZCwgZW5nbGFuZCR0b3Rnb2FsPT0wKSkvbGVuZ3RoKFRHKQ0KdHdvRzwtbnJvdyhzdWJzZXQoZW5nbGFuZCwgZW5nbGFuZCR0b3Rnb2FsPT0yKSkvbGVuZ3RoKFRHKQ0KdGhyZWVHPC1ucm93KHN1YnNldChlbmdsYW5kLCBlbmdsYW5kJHRvdGdvYWw9PTMpKS9sZW5ndGgoVEcpDQpmb3VyRzwtbnJvdyhzdWJzZXQoZW5nbGFuZCwgZW5nbGFuZCR0b3Rnb2FsPT00KSkvbGVuZ3RoKFRHKQ0KR3J0NUc8LW5yb3coc3Vic2V0KGVuZ2xhbmQsIGVuZ2xhbmQkdG90Z29hbD41KSkvbGVuZ3RoKFRHKQ0KI2NyZWF0ZSBkYXRhIGZyYW1lIG9mIHByb2JhYmlsaXRpZXMgYW5kIGRpZmZlcmVuY2UNClBvaXNzb25fcHJvYmFiaWxpdHkgPC0gYyhkcG9pcygwLCAyLjg4KSxkcG9pcygyLCAyLjg4KSwgZHBvaXMoMywgMi44OCksZHBvaXMoNCwgMi44OCksIHBwb2lzKDUsMi44OCxsb3dlci50YWlsID0gRkFMU0UpKSAlPiUgcm91bmQoMykNCkVtcGlyaWNhbF9wcm9iYWJpbGl0eSA8LSBjKHplcm9HLCB0d29HLCB0aHJlZUcsIGZvdXJHLCBHcnQ1RykgJT4lIHJvdW5kKDMpDQpOdW1iZXJfb2ZfR29hbHM8LSBjKDAsMiwzLDQsICI1PCIpDQpFbXBpcmljYWxfUG9pc3Nvbl9EaWZmZXJlbmNlPC0oRW1waXJpY2FsX3Byb2JhYmlsaXR5LVBvaXNzb25fcHJvYmFiaWxpdHkpICU+JXJvdW5kKDMpDQojRGF0YWZyYW1lDQpkZjwtIGRhdGEuZnJhbWUoTnVtYmVyX29mX0dvYWxzLCBFbXBpcmljYWxfcHJvYmFiaWxpdHksIFBvaXNzb25fcHJvYmFiaWxpdHksRW1waXJpY2FsX1BvaXNzb25fRGlmZmVyZW5jZSkNCiN0YWJsZQ0Ka25pdHI6OmthYmxlKGRmLCBjYXB0aW9uID0gIkVtcGlyaWNhbCwgUG9pc3NvbiAmIERpZmZlcmVuY2UiKQ0KYGBgDQojIyBJbnRlcnByZXRhdGlvbg0KRnJvbSBvdXRwdXQgaXQgYXBwZWFycyB0aGUgdGhlb3JldGljYWwgcG9pc3NvbiBkaXN0cmlidXRpb24gd2l0aCAkXGxhbWJkYSQ9Mi44OCBmaXRzIHRoZSBlbXBpcmljYWwgZGlzdHJpYnV0aW9uIHZlcnkgd2VsbC4gVGhlIGZpbmFsIHRhYmxlIHN0b3JlZCBpbiB0aGUgKmRmKiBkYXRhZnJhbWUgY29tcGFyZXMgcHJvYmFiaWxpdHkgdmFsdWVzIGJldHdlZW4gdGhlIGVtcGlyaWNhbCBhbmQgUG9pc3NvbiBkaXN0cmlidXRpb25zLiBDZXJ0YWluICprKiBwb2ludHMgb2YgaW50ZXJlc3QgYmV0d2VlbiB0aGUgZW1waXJpY2FsIGFuZCB0aGVvcmV0aWNhbCBkaXN0cmlidXRpb25zIHdlcmUgemVybywgdHdvLCB0aHJlZSwgZm91ciBhbmQgZ3JlYXRlciB0aGFuIGZpdmUgZ29hbHMgaW4gdGhlIGxlYWd1ZXMgb2JzZXJ2ZWQuIFRoZXNlIHBvaW50cyBzaG93IHRoZSBwcmVkaWN0ZWQgYWNjdXJhY3kgaW4gdGhlIFBvaXNzb24gZGlzdHJpYnV0aW9uLiBUaGUgcHJvYmFiaWxpdHkgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBlbXBpcmljYWwgYW5kIFBvaXNzb24gZGlzdHJpYnV0aW9uIGluIGdhbWVzIHdpdGggYSB0b3RhbCBvZiB0d28gZ29hbHMgaXMgMC4wMDEsIHRoaXMgZGlmZmVyZW5jZSBpcyB2ZXJ5IHNtYWxsLiBUaGUgcHJvYmFiaWxpdHkgZGlmZmVyZW5jZSBiZXR3ZWVuIGdhbWVzIHdpdGggemVybywgdGhyZWUgYW5kIGdyZWF0ZXIgdGhhbiBmaXZlIGdvYWxzIGlzIDAuMDE2LCAwLjAxNSBhbmQgMC4wMTMgcmVzcGVjdGl2ZWx5LiBUaGVzZSBwb2ludHMgZGlzcGxheSB0aGUgbGFyZ2VzdCBwcm9iYWJpbGl0eSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIGVtcGlyaWNhbCBhbmQgUG9pc3NvbiBkaXN0cmlidXRpb24uIFRoZSBuZXh0IGxhcmdlc3QgcHJvYmFiaWxpdHkgZGlmZmVyZW5jZSBpcyBmb3VyIGdvYWxzIHdpdGggMC4wMDguIERlc3BpdGUgdGhlIGV4aXN0ZW5jZSBvZiBkaWZmZXJlbmNlcyBiZXR3ZWVuIHRoZSBlbXBpcmljYWwgYW5kIFBvaXNzb24gZGlzdHJpYnV0aW9ucywgdGhlIFBvaXNzb24gZGlzdHJpYnV0aW9uIGFwcGVhcnMgdG8gcHJlZGljdCB0aGUgZGlzdHJpYnV0aW9uIG9mIHRvdGFsIGdvYWxzIHBlciBtYXRjaCB2ZXJ5IGNsb3NlbHkgdG8gdGhlIGVtcGlyaWNhbCBkaXN0cmlidXRpb24uIE5lZWRsZXNzIHRvIHNheSwgbGltaXRhdGlvbiBvZiB1c2luZyB0aGUgUG9pc3NvbiBkaXN0cmlidXRpb24gaXMgdGhlIGxhY2sgb2YgYW5hbHlzaXMgc3Vycm91bmRpbmcgdGhlIHZhcmlhbmNlIG9mIHRoZSBlbXBpcmljYWwgZGlzdHJpYnV0aW9uLiBUaGUgdmFyaWFuY2UgY291bGQgcG90ZW50aWFsbHkgYmUgdXNlZCB0byBleHBsYWluIGRpZmZlcmVuY2VzIGJldHdlZW4gZW1waXJpY2FsIGFuZCB0aGVvcmV0aWNhbCBkaXN0cmlidXRpb25zLiBBbHNvLCB0aGUgUG9pc3NvbiBkaXN0cmlidXRpb24gb3Zlcmxvb2tzIHRoZSBpbmRlcGVuZGVuY2Ugb2YgZ29hbHMgdGhhdCBoYXBwZW4gd2l0aGluIG9uZSBtYXRjaCBwZXJpb2Qgb2YgbmluZXR5IG1pbnV0ZXMu