Introduction
For this project, we will be creating a Poisson regression model. The
data set for this project looks at the daily total of cyclists on the
Williamsburg Bridge on a given day. This data set looks at the total
number of cyclists on the Williamsburg Bridge in Brooklyn, New York, in
order to keep track of the total number of cyclists entering and leaving
this cycling route on a specific day. We will look at the various
factors affecting the number of cyclists on each day, with factors such
as the weather conditions on that particular day. We will also create a
Quassi-Poisson regression model and analyze the dispersion of our
model.
Data Description
The data set in this project looks at the total number of cyclists on
the Williamsburg Bridge on a given day along with the weather conditions
of that day such as temperature and precipitation. This data set also
includes the total number of cyclists on all four of the major New York
bridges the Brooklyn Bridge, the Manhattan Bridge, the Williamsburg
Bridge, and the Queensboro Bridge.
First, I will find the data set which will be used for this
assignment. I ran the code which was given in the assignment
description, and the data set I received was for the Williamsburg
Bridge, so that is what we will use for this Poisson regression modeling
project. When opening the downloaded data set, I noticed some issues
with the data set not being properly stored. The Date and Day variable
had the exact same values, and these values did not make sense within
the context of this situation. I went through and fixed these values
with how the appeared in the original data set, which was given under
the tab data2 in the w09-AssignDataSet.xlsx file. I replaced the
improper values in the Date and Day variable with what was in the
original data set. Now, the Date variable is an identification of the
date on which the observation occurred. And, the Day variable represents
the day of the week on which the observation occurred. I also checked
all of the other variables to ensure their values were not also messed
up in the formatting of the excel file, but they all appeared to be all
good without anything having gotten changed during the downloading
process.
The data set has been uploaded to Github and now can be read in
directly from the Github repository.
We will read in the data set from Github and we will call it
“cycling”.
cycling <- read.csv("https://raw.githubusercontent.com/JosieGallop/STA321/refs/heads/main/dataset/WilliamsburgBridge.csv", header = TRUE)
str(cycling)
'data.frame': 30 obs. of 7 variables:
$ Date : chr "4/1" "4/2" "4/3" "4/4" ...
$ Day : chr "Saturday" "Sunday" "Monday" "Tuesday" ...
$ HighTemp : num 46 62.1 63 51.1 63 48.9 48 55.9 66 73.9 ...
$ LowTemp : num 37 41 50 46 46 41 43 39.9 45 55 ...
$ Precipitation : num 0 0 0.03 1.18 0 0.73 0.21 0 0 0 ...
$ WilliamsburgBridge: int 1915 4207 5178 2279 5711 1739 3399 4082 4886 6881 ...
$ Total : int 5397 13033 16325 6581 17991 4896 10341 11610 14899 21295 ...
We will use this cycling data set to create two Poisson regression
models, one for the frequency counts of cyclists on the Williamsburg
Bridge on a given observation, and another for the rates of cyclists
entering and leaving via the Williamsburg Bridge offset by the total
number of cyclists on all of the major New York bridges.
Variables
There are 7 total variables in the cycling data set. These variables
include:
Date: This represents the date on which a given observation was
collected. This is the observation ID number. This variable is just for
identification purposes of the observations, not for actual prediction.
The date is given in the format of month/day.
Day: This is a character predictor variable which represents the
day of the week on which a given observation was collected. For
instance, Monday, Tuesday, etc.
HighTemp: A quantitative predictor variable representing the high
temperature on the given day, given in degrees Fahrenheit.
LowTemp: A quantitative predictor variable representing the low
temperature on the given day, given in degrees Fahrenheit.
Precipitation: A quantitative predictor variable representing the
amount of precipitation, rain, which occurred on the given day, given in
inches.
WilliamsburgBridge: A quantitative variable representing the
total number of cyclists on the Williamsburg Bridge on a given
observation. This will be our response variable for the Poisson
regression models.
Total: The total number of cyclists on all bridges on a given
observation. This will be the variable which is offset for our Poisson
regression model of the rates and for the Quassi-Poisson regression
model.
We also will create two new variables within our analysis later on to
use for the Poisson regression model building process. These two
variables include:
AvgTemp: A quantitative predictor variable representing the
average temperature for a given observation, given in degrees
Fahrenheit. This variable will be the average of HighTemp and LowTemp,
found by calculating (HighTemp + LowTemp)/2.
NewPrecip: A discretized version of the Precipitation variable.
This will be a binary predictor variable, where 0 represents a
precipitation value equal to 0 inches, and where 1 represents a
precipitation value greater than 0 inches.
For the Poisson regression model for the frequency counts, the
Williamsburg Bridge variable will serve as the response variable. For
the Poisson regression model for the rates, the Williamsburg Bridge
variable will again serve as the response variable, and it will be
offset by the Total variable for this model.
Research
Questions
The main goal for this project is to create a Poisson regression
model for both the frequency counts and the rates of the cyclists
entering and leaving Brooklyn, New York through the Williamsburg Bridge.
So, the focus for this project will be on creating two Poisson
regression models which can successfully predict the frequency counts
and the rates of the cyclists on the Williamsburg Bridge.
Some key questions for this project include:
Does the data set meet all of the necessary conditions required
for a Poisson regression model? If not, is there any potential
explanation for this discrepancy?
Can we create Poisson regression models which provide statistical
significance for predicting both the frequency counts and for the rates
of cyclists on the Williamsburg Bridge on a given day?
Is the Quasi-Poisson regression model a better choice than the
either of the standard Poisson regression models for frequency counts
and for rates? How dispersed is this Quasi-Poisson regression
model?
We will work on creating our Poisson regression models for both the
frequency counts and rates in order to see if we can in fact create
models which provide statistical significance in their predictive
ability. We will also create a Quasi-Poisson regression model and we
will find how dispered it is. We will determine which of these models is
the ideal choice for our final regression model.
Exploratory Data
Analysis
Let’s take a look at the first few entries within this cycling data
set for the Williamsburg Bridge.
kable(head(cycling), caption = "First Few Observations in the Data Set")
First Few Observations in the Data Set
4/1 |
Saturday |
46.0 |
37 |
0.00 |
1915 |
5397 |
4/2 |
Sunday |
62.1 |
41 |
0.00 |
4207 |
13033 |
4/3 |
Monday |
63.0 |
50 |
0.03 |
5178 |
16325 |
4/4 |
Tuesday |
51.1 |
46 |
1.18 |
2279 |
6581 |
4/5 |
Wednesday |
63.0 |
46 |
0.00 |
5711 |
17991 |
4/6 |
Thursday |
48.9 |
41 |
0.73 |
1739 |
4896 |
This data set includes various factors which may have an influence on
the number of individuals cycling, along with the date on which this
data was collected. Additionally, this data set includes variables for
both the number of cyclists on the Williamsburg Bridge on that given
day, along with the total number of cyclists on all bridges on that
given day.
First, let’s check if there are any missing variables in our data
set.
colSums(is.na(cycling))
Date Day HighTemp LowTemp
0 0 0 0
Precipitation WilliamsburgBridge Total
0 0 0
It turns out that all of the variables in the data set have exactly
zero missing values. So, there are no missing values in our data set.
This is very good and means we can move on with further analyzing the
data set and the variables within it.
Checking the Variable
Distributions
We have three predictor variables which we want to use in our final
model, Day, AvgTemp, and NewPrecip. Out of these variables, Day is a
categorical character variable, AvgTemp is a quantitative variable, and
NewPrecip is a binary variable. We will check that the distributions of
all of these variables appear to be random, without any noticeable
patterns or concerns which could cause issues with the model building
process.
First, let’s look at our Day variable. This is a categorical
character variable. In order to check that this variable is properly
distributed without any major concerns, we will look for if there are
any potential imbalances within this variable. An imbalance would occur
if there were a significantly greater number of observations occuring on
one day as opposed to another day. We will check that there are not any
substantial imbalances within the Day variable.
table(cycling$Day)
Friday Monday Saturday Sunday Thursday Tuesday Wednesday
4 4 5 5 4 4 4
It appears that all days of the week from Monday to Friday have
exactly four observations in our data set. The weekend days of Saturday
and Sunday both have exactly five observations in our data set. As we
can see, the observations appear to be distributed very evenly amongst
the days of the week, with the weekend days only having one more
observation each than the weekdays. Overall, this variable appears to be
overall evenly distributed, and so there are not any imbalances to be
concerned about for our Day predictor variable.
Next, let’s check the distribution of our AvgTemp variable. This is a
quantitative predictor variable and so we can check its distribution by
using a histogram. We will check to see if this variable has an overall
normal distribution without any notable skew or outliers.
ylimit = max(density(cycling$AvgTemp)$y)
hist(cycling$AvgTemp, probability = TRUE, main = "AvgTemp Distribution", xlab="AvgTemp",
col = "aliceblue", border="cornflowerblue")
lines(density(cycling$AvgTemp, adjust=2), col="darkorchid")

It appears that our distribution histogram of the AvgTemp variable is
unimodal with majority of the data being centered at an average
temperature between 55 and 60 degrees Fahrenheit. The distribution
appears to follow an approximately normal distribution without any
noteable skew or outliers. It does appear like perhaps there is slightly
more entries on the left side of the histogram, but it is only by a very
slight amount and is not significant enough to cause a noticeable skew
in the distribution. Overall, it appears safe to say that our AvgTemp
variable follows an approximately normal distribution, and so this
variable will be all good to use in our model building process.
Lastly, let’s check our NewPrecip variable. This is a binary
predictor variable, and so we can expect it to have values of only 0 and
1. In order to check the reliability of this variable in its use for
prediction, we will make sure it appears to meet this criteria of a
binary variable. We can take a look at a table to ensure that there are
only two possible entries for this NewPrecip variable, 0 and 1, because
these are the only two values which a binary variable can be.
table(cycling$NewPrecip)
0 1
18 12
As we can see, this NewPrecip variable has only two entries, 0 and 1.
This is exactly what we wanted to see because these are the only two
variables which a binary variable can be. We can see that there are
slightly more days with no precipitation, a value of 0, with 18 total
observations, than days with precipitation, a value of 1, with 12 total
observations. However, this difference is not large enough to be a cause
for concern. And so, we can conclude that everything is alright with
with our binary predictor variable of NewPrecip, and that we can
continue with the model building process.
Now, we have checked the distributions of all three of our predictor
variables, Day, AvgTemp, and NewPrecip, and ensured that there are not
any apparent issues with any of these variables or their distributions.
So, we can continue with using these predictor variables in our model
building process.
Asumptions and
Conditions
Before we begin with building our model, we must check the
assumptions and conditions which are required for a Poisson regression
model.
There are four assumptions which must be met in order to create a
Poisson regression model. These assumptions include:
The response variable is a count described by a Poisson
distribution.
Observations are independent of one another.
The mean of the Poisson random variable is equal to the variance
of said Poisson random variable.
The log of the mean rate, log (λ), must be a linear function of
x.
We will check whether all of these four conditions have been
successfully met by our cycling data set before beginning with the model
building process for our Poisson regression model.
We will go through and check all four of the necessary conditions
required for a Poisson Regression Model.
Condition 1: The
response variable is a count described by a Poisson distribution.
The response variable in this data set was stated to be the
WilliamsburgBridge variable, representing the total number of cyclists
on the Williamsburg Bridge on a given observation. This variable is
described as a count, representing the number of cyclists on a given
observation. This fits the criteria for this assumption, because we can
conclude that we have a response variable that is a count.
Condition 2:
Observations are independent of one another.
Each observation was collected on a given date, and we can safely
assume that the conditions of one day did not affect the conditions of
another day. The number of cyclists on the Williamsburg Bridge for a
given observation is independent on this number of a different
observation. So, we can safely conclude that that observations are all
independent and separate from one another.
Condition 3: The
mean of the Poisson random variable is equal to the variance of said
Poisson random variable.
In order for a variable to be a Poisson random variable, its mean
must be equal to its variance. We previously stated that the
WilliamsburgBridge variable will be our response variable. Therefore, we
must check that this variable meets the criteria for a Poisson random
variable, having a mean which is equal to its variance.
# Finding the mean.
mean <- mean(cycling$WilliamsburgBridge)
print(mean)
[1] 4942.267
The mean of the WilliamsburgBridge variable is 4,942.267. This
represents the mean number of individuals on the Williamsburg Bridge on
a given observation. This means that the mean number of individuals on
the Williamsburg Bridge on any given date is around 4,943 people. We
round this value up because the number of individuals is a whole number
and so the decimal must be rounded up to the next whole number to
represent that part as an individual.
Next, let’s find the variance of our response variable.
# Finding the variance.
variance <- var(cycling$WilliamsburgBridge)
print(variance)
[1] 3005665
The variance of the WilliamsburgBridge variable is 3,005,665. This
does not match up with the value of the mean, and indicates a violation
of one the neccessary conditions for a Poisson regression model. This
implies that our response variable is in fact not a Poisson random
variable because the value of its mean is not equivalent to the value of
its variance.
Condition 4: The
log of the mean rate, log (λ), must be a linear function of x.
We will take a look at the plot of the mean rate against the
predictor variables to check this condition.
Since our first predictor variable is Day, and this a categorical,
character variable, it would not create a linear function because it is
made up of categorical inputs. So, instead, we will look at the
numerical predictor variable instead to check this condition.
Let’s look at the predictor variable of average temperature vs our
response variable of WilliamsburgBridge. AvgTemp is a quantitative,
numeric variable so we can use it to check this condition.
plot(cycling$AvgTemp, cycling$WilliamsburgBridge, main = "AvgTemp vs. Williamsburg Bridge", xlab = "AvgTemp", ylab = "WilliamsburgBridge")

The scatterplot of the two variables of AvgTemp and
WilliamsburgBridge shows what does appear to be a linear relationship of
these two variables. We can see a positive relationship between the two
variables, as average temperature increases, so does the number of
cyclists on the Williamsburg Bridge. This seems logical as it makes
sense that more people would want to go outside and go cycling on a day
that is warmer outside rather than a day that is colder outside. The
relationship of the two variables does appear to have a moderate
strength, but the linear pattern can definitely be seen. So, it does
appear that WilliamsburgBridge is a linear function of AvgTemp, which
verifies this necessary condition for a Poisson regression model.
Lastly, we have our predictor variable of NewPrecip. This is a binary
predictor variable, so we will only see points at x = 0 and x = 1 if we
were to create a scatterplot of this binary predictor variable of
NewPrecip. So, we can not expect to see a linear relationship between
NewPrecip and WilliamsburgBridge, because NewPrecip can only have values
of 0 and 1, not anything in between due to it being a binary predictor
variable.
Overall, we can consider this condition satisfied since our numerical
predictor variable of AvgTemp showed that it does indeed have a linear
relationship with our response variable.
Summary of
Violations
Overall, it seems that we do have one notable violation of the
conditions of a Poisson regression model within our data set. We found
that the response variable, WilliamsburgBridge, does not meet the
necessary criteria of a Poisson random variable, because its mean is not
equal to its variance. This is a major concern, because it points to a
major violation of the conditions required for a Poisson regression
model.
This violation of the conditions for a Poisson regression model
suggests a major concern with our data set, as it fails to meet a major
condition which is required for a Poisson regression model. This suggest
that perhaps a Poisson regression model may not be the best model choice
for this data set after all.
We will still continue with building the Poisson regression models
for this project, but it is important to keep in mind that this
violation may mean that the Poisson regression model is not the best
model choice for this data set due to the necessary condition of the
mean of the response variable equaling the variance of the response
variable having been failed to have been met.
Poisson Regression
Models on the Original Variables
First, we will look at the Poisson regression models which were
created in the previous week’s assignment and look at the corrected
versions of these models. We will use the original predictor variables
first, and then in later steps of this project we will use the new
predictor variables of AvgTemp and NewPrecip.
In the previous week’s assignment, we created two Poisson regression
models, one on frequency counts and one of the rates. We will create
these again to see the proper, corrected models. Since in the previous
week’s assingment, we did not alter any of the predictor variables for
these two models, we will use the original variables for now and then
create models using the new predictor variables of AvgTemp and
NewPrecip.
For now, we will use the old predictor variables of Day, HighTemp,
LowTemp, and Precipitation. These were the predictor variables used in
the previous week’s assignment, so we will first begin by correcting the
models which were created in that assignment before we been creating the
new models for this project.
Poisson Regression
Model on Frequency Counts
We will begin with creating a Poisson regression model of the
frequency counts. This model will be on the frequency counts of
individuals on the Williamsburg Bridge for a given observations. Our
goal is to create a Poisson regression model which can statistically
significantly predict the count of the number of individuals on the
Williamsburg Bridge for a given observation, based upon the various
factors in this data set.
We will create our Poisson regression model on the frequency
counts.
# Poisson Regression Model of Counts
model.counts <- glm(WilliamsburgBridge ~ Day + HighTemp + LowTemp + Precipitation, family = poisson(link = "log"), data = cycling)
pois.count.coef = summary(model.counts)$coef
kable(pois.count.coef, caption = "Poisson Regression Model for the Counts of Cyclists \n on the Williamsburg Bridge")
Poisson Regression Model for the Counts of Cyclists on the
Williamsburg Bridge
(Intercept) |
7.6535762 |
0.0220219 |
347.544093 |
0.0000000 |
DayMonday |
0.0545822 |
0.0099489 |
5.486232 |
0.0000000 |
DaySaturday |
-0.2743978 |
0.0101644 |
-26.996022 |
0.0000000 |
DaySunday |
-0.2345666 |
0.0097363 |
-24.091886 |
0.0000000 |
DayThursday |
0.0319064 |
0.0102933 |
3.099730 |
0.0019370 |
DayTuesday |
0.1988133 |
0.0103531 |
19.203340 |
0.0000000 |
DayWednesday |
0.0511286 |
0.0100775 |
5.073556 |
0.0000004 |
HighTemp |
0.0170556 |
0.0005874 |
29.037387 |
0.0000000 |
LowTemp |
-0.0023861 |
0.0007830 |
-3.047372 |
0.0023085 |
Precipitation |
-1.0320675 |
0.0165996 |
-62.174240 |
0.0000000 |
The regression equation for the Poisson regression model on the
frequency counts is given as:
log(μ) = 7.6538 + 0.0546 * DayMonday - 0.2744 * DaySaturday - 0.2346
* DaySunday + 0.0319 * DayThursday + 0.1988 * DayTuesday + 0.0511 *
DayWednesday + 0.0171 * HighTemp - 0.0024 * LowTemp - 1.0321 *
Precipitation
All of the predictor variables, DayMonday, DaySaturday, DaySunday,
DayThursday, DayTuesday, DayWednesday, HighTemp, LowTemp, and
Precipitation, all have p-values of p < .001. This indicates that all
of the predictor in our model variables are statistically significant in
predicting the total expected counts of cyclists on the Williamsburg
Bridge on a given day.
The significance of these variables in regards to predicting the
expected counts can likely be attributed to potential adverse weather
conditions, such as excessive heat or cold, along with intense
precipitation and storms making cycling non ideal on those days with
poor conditions for outdoors activities such as cycling. These predictor
variables all being statistically significant shows that the weather and
temperature conditions do suggest a discrepancy in the number of
cyclists on the Williamsburg Bridge from day to day due to these changes
in temperature and precipitation.
Overall, this Poisson model of the frequency counts of the cyclists
on the Williamsburg Bridge showed statistical significance in its
prediction of the expected log counts for the number of cyclists on the
Williamsburg Bridge for a given observation.
For our categorical predictor variable of Day, Friday was chosen as
the base line level, which can be seen by how there is not a “DayFriday”
variable in the regression equation output. This is because of the seven
days, Friday is the one which comes first alphabetically and R chooses
the level which comes first alphabetically as the base line level.
Therefore, for our regression coefficient interpretations for the
different levels of the Day variable, these values will be compared
against the base line level of Friday.
Regression
Coefficients Interpretation
We will analysis the regression coefficients for the variables in
this Poisson regression model on frequency counts.
The value of the y-intercept is given as 7.6536. This represents
the baseline of the mean of log(μ) when all predictor variables are
equal to 0. However, the y-intercept does not have a practical
interpretation or meaning in this scenario so we are not interested in
its meaning for the Poisson regression model.
DayMonday (p < .001): The regression coefficient for the
variable DayMonday was found to be 0.0546. This means that the mean log
count of cyclists on the Williamsburgs Bridge was 0.0546 greater on
Monday than on Friday. We can also say this means that the count of
cyclists is 1.0561 times greater on Monday than on Friday, holding all
other variables constant.
DaySaturday (p < .001): The regression coefficient for the
variable DaySaturday was found to be -0.2744. This means that the mean
log count of cyclists on the Williamsburgs Bridge was 0.2744 less on
Saturday than on Friday. We can also say this means that the count of
cyclists is 0.7600 times greater on Saturday than on Friday, holding all
other variables constant.
DaySunday (p < .001): The regression coefficient for the
variable DaySunday was found to be -0.2346. This means that the mean log
count of cyclists on the Williamsburgs Bridge was 0.2346 less on Sunday
than on Friday. We can also say this means that the count of cyclists is
0.7909 times greater on Sunday than on Friday, holding all other
variables constant.
DayThursday (p = 0.0019): The regression coefficient for the
variable DayThursday was found to be 0.0319. This means that the mean
log count of cyclists on the Williamsburgs Bridge was 0.0319 greater on
Thursday than on Friday. We can also say this means that the count of
cyclists is 1.0324 times greater on Thursday than on Friday, holding all
other variables constant.
DayTuesday (p < .001): The regression coefficient for the
variable DayTuesday was found to be 0.1988. This means that the mean log
count of cyclists on the Williamsburgs Bridge was 0.1988 greater on
Tuesday than on Friday. We can also say this means that the count of
cyclists is 1.2199 times greater on Tuesday than on Friday, holding all
other variables constant.
DayWednesday (p <.001): The regression coefficient for the
variable DayWednesday was found to be 0.0511. This means that the mean
log count of cyclists on the Williamsburgs Bridge was 0.0511 greater on
Wednesday than on Friday. We can also say this means that the count of
cyclists is 1.0524 times greater on Wednesday than on Friday, holding
all other variables constant.
HighTemp (p <.001): The regression coefficient of the HighTemp
variable in this model is 0.0171. This means that the mean log of the
counts increases by 0.0171 units for every 1 degree Fahrenheit increase
in the high temperature for the given observation, holding all other
variables constant.
LowTemp (p = 0.0023): The regression coefficient of the LowTemp
variable in this model is -0.0024. This means that the mean log of the
counts decreases by 0.0024 units for every 1 degree Fahrenheit increase
in the low temperature for the given observation, holding all other
variables constant.
Precipitation (p < .001): The regression coefficient of the
Precipitation variable in this model is -1.0321. This means that the
mean log of the counts decreases by 1.0321 units for every 1 inch
increase in the amount of precipitation for the given observation,
holding all other variables constant.
Poisson Regression
Model on Rates
Now, we will create a Poisson regression model of the rates at which
cyclists enter and leave via the Williamsburg Bridge offset by the total
number of cyclists on all four of the major New York bridges. This
model, unlike the previous model which just focused on the frequency
counts of cyclists on the Williamsburg Bridge, will also account for the
total number of cyclists on all four of the major New York bridges, the
Brooklyn Bridge, the Manhattan Bridge, the Williamsburg Bridge, and the
Queensboro Bridge. This Poisson model will look at the rates of the
number of cyclists on the Williamsburg Bridge for a given observation as
a rate out of the total number of cyclists on all four of these major
bridges for that specific observation.
We will build our Poisson regression model for the rates. This time,
we will still use the WilliamsburgBridge variable as our response
variable, but we will offset the model by the Total variable to make our
Poisson model for the rates of cyclists on the Williamsburg Bridge out
of the total number of cyclists on all four of the bridges.
# Poisson Model of Rates
model.rates <- glm(WilliamsburgBridge ~ Day + HighTemp + LowTemp + Precipitation, offset = log(Total),
family = poisson(link = "log"), data = cycling)
kable(summary(model.rates)$coef, caption = "Poisson Regression Model of the Rates of Cyclists \n on the Williamsburg Bridge out of all Four Bridges")
Poisson Regression Model of the Rates of Cyclists on the
Williamsburg Bridge out of all Four Bridges
(Intercept) |
-1.0682224 |
0.0223058 |
-47.8899346 |
0.0000000 |
DayMonday |
0.0003873 |
0.0099397 |
0.0389685 |
0.9689155 |
DaySaturday |
0.0375055 |
0.0100984 |
3.7140004 |
0.0002040 |
DaySunday |
0.0051455 |
0.0097487 |
0.5278112 |
0.5976304 |
DayThursday |
0.0205573 |
0.0102839 |
1.9989823 |
0.0456103 |
DayTuesday |
0.0138077 |
0.0103909 |
1.3288272 |
0.1839050 |
DayWednesday |
0.0233018 |
0.0100672 |
2.3146274 |
0.0206333 |
HighTemp |
-0.0011895 |
0.0005867 |
-2.0272588 |
0.0426359 |
LowTemp |
0.0003500 |
0.0007846 |
0.4460900 |
0.6555322 |
Precipitation |
0.0505341 |
0.0161127 |
3.1362935 |
0.0017110 |
The regression equation for the Poisson regression model on the rates
is given as:
log(μ/t) = -1.0682 + 0.0004 * DayMonday + 0.0375 * DaySaturday +
0.0051 * DaySunday + 0.0206 * DayThursday + 0.0138 * DayTuesday + 0.0233
* DayWednesday - 0.0012 * HighTemp + 0.0004 * LowTemp + 0.0505 *
Precipitation
All of the predictor variables in this Poisson model, Date, HighTemp,
LowTemp, and Precipitation, all have p-values of p < .001. This
indicates that all of the predictor in our model variables are
statistically significant in predicting the total expected counts of
cyclists on the Williamsburg Bridge on a given day, offset by the total
number of cyclists on all four of the major New York bridges.
This model shows statistical significance in predicting the expected
counts of the cyclists on the Williamsburg Bridge by using the rates for
the prediction. This indicates that this model for the rates shows
statistical significance in its predictive power and provides good
utility for prediction and estimation.
Like was stated for the Poisson regression model on frequency counts,
Friday was chosen by R to be the base line level of the Day variable,
and so we will compare the regression coefficients against this base
line level.
Regression
Coefficients Interpretation
We will analysis the regression coefficients for the variables in
this Poisson regression model on rates.
The value of the y-intercept is given as -1.0682. This represents
the baseline of the mean of the log counts multiplied by t, when all
predictor variables are equal to 0. However, the y-intercept does not
have a practical interpretation or meaning in this scenario so we are
not interested in its meaning for the Poisson regression model.
DayMonday (p = 0.9689): The regression coefficient for the
variable DayMonday was found to be 0.0004. This means that the mean log
count of cyclists on the Williamsburgs Bridge was 0.0004 greater on
Monday than on Friday. We can also say this means that the count of
cyclists is 1.0056 times greater on Monday than on Friday, holding all
other variables constant.
DaySaturday (p < .001): The regression coefficient for the
variable DaySaturday was found to be 0.0375. This means that the mean
log count of cyclists on the Williamsburgs Bridge was 0.0375 greater on
Saturday than on Friday. We can also say this means that the count of
cyclists is 1.0382 times greater on Saturday than on Friday, holding all
other variables constant.
DaySunday (p = 0.5976): The regression coefficient for the
variable DaySunday was found to be 0.0051. This means that the mean log
count of cyclists on the Williamsburgs Bridge was 0.0051 greater on
Sunday than on Friday. We can also say this means that the count of
cyclists on Sunday is 1.005 times greater on Sunday than on Friday,
holding all other variables constant.
DayThursday (p = 0.0456): The regression coefficient for the
variable DayThursday was found to be 0.0206. This means that the mean
log count of cyclists on the Williamsburgs Bridge was 0.0206 greater on
Thursday than on Friday. We can also say this means that the count of
cyclists is 1.0208 times greater on Thursday than on Friday, holding all
other variables constant.
DayTuesday (p = 0.1839): The regression coefficient for the
variable DayTuesday was found to be 0.0138. This means that the mean log
count of cyclists on the Williamsburgs Bridge was 0.0138 greater on
Tuesday than on Friday. We can also say this means that the count of
cyclists is 1.0139 times greater on Tuesday than on Friday, holding all
other variables constant.
DayWednesday (p 0.0206): The regression coefficient for the
variable DayThursday was found to be 0.0233. This means that the mean
log count of cyclists on the Williamsburgs Bridge was 0.0233 greater on
Wednesday than on Friday. We can also say this means that the count of
cyclists is 1.0236 times greater on Wednesday than on Friday, holding
all other variables constant.
HighTemp (p = 0.0426): The regression coefficient of the HighTemp
variable in this model is -0.0012. This means that the mean of the log
counts multiplied by t decreases by 0.0012 units for every 1 degree
Fahrenheit increase in the high temperature for the given observation,
holding all other variables constant.
LowTemp (p = 0.6555): The regression coefficient of the LowTemp
variable in this model is 0.0004. This means that the log counts
multipled by t increases by 0.0004 units for every 1 degree Fahrenheit
increase in the low temperature for the given observation, holding all
other variables constant.
Precipitation (p = 0.0017): The regression coefficient of the
Precipitation variable in this model is 0.0505. This means that the log
counts multiplied by t increases by 0.0505 units for every 1 inch
increase in the amount of precipitation for the given observation,
holding all other variables constant.
Summary and
Comparisons of the Two Models
Both of the two Poisson regression model we created, the model for
the frequency counts and the model for the rates, provided statistical
significance for prediction and showed good utility overall. In both of
these models, we looked into the total number of cyclists on the
Williamsburg Bridge in New York for a specific observation, and we
looked into the various factors of that specific date. We looked at the
date of the observation along with some factors which may affect the
total number of cyclists out on that specific date. These factors
included the high temperature, the low temperature, and the amount of
precipitation for that given date. It turned out that all of these
factors were indeed statistically significant for both of the two
Poisson regression models, indicating that these weather related
conditions have a statistically significant impact on both the counts
and the rates of cyclists out on the Williamsburg Bridge for a given
observation. This can be attributed to certain weather conditions making
it more or less ideal for individuals to be cycling outdoors. For
instance, a day with incredibly high temperatures, incredibly cold
temperatures, or severe storms with heavy precipitation would be less
ideal and likely lead to less cyclists being out on that given day as
opposed to a day with pleasant weather.
Overall, both of the Poisson regression models showed statistical
significance and good utility in their prediction. However, as was
previously stated, there were some violations of this conditions for a
Poisson regression model within our data set. First, it was found that
the mean of the response variable, WilliamsburgBridge, was not equal to
its variance. This suggests that this response variable in fact is not
Poisson distributed, due to it failing to meet the condition for a
Poisson random variable of its mean being equal to its variance.
Additionally, all four predictor variables were checked, and it was
found that the response variable in fact was not a linear function of
any of these predictor variables. This indicates another major violation
of this data set. These violations suggest that perhaps a Poisson model
was not the best model choice for this data set, and that it is
important to be mindful of these violations when using either of the
Poisson regression models we created for prediction.
Poisson Regression
Model on Frequency Counts
We will begin with creating a Poisson regression model of the
frequency counts using the new variables we created for this project.
Specifically, this model will be on the frequency counts of individuals
on the Williamsburg Bridge for a given observations. Our goal is to
create a Poisson regression model which can statistically significantly
predict the count of the number of individuals on the Williamsburg
Bridge for a given observation, based upon the various factors in this
data set.
We will create our Poisson regression model on the frequency
counts.
# Poisson Regression Model of Counts
model.counts <- glm(WilliamsburgBridge ~ Day + AvgTemp + NewPrecip,
family = poisson(link = "log"), data = cycling)
pois.count.coef = summary(model.counts)$coef
kable(pois.count.coef, caption = "Poisson Regression Model for the Counts of Cyclists \n on the Williamsburg Bridge")
Poisson Regression Model for the Counts of Cyclists on the
Williamsburg Bridge
(Intercept) |
7.2024973 |
0.0209663 |
343.527497 |
0.0000000 |
DayMonday |
0.0301551 |
0.0095684 |
3.151542 |
0.0016241 |
DaySaturday |
-0.1944899 |
0.0100224 |
-19.405597 |
0.0000000 |
DaySunday |
-0.2450724 |
0.0097649 |
-25.097317 |
0.0000000 |
DayThursday |
-0.0298802 |
0.0101579 |
-2.941565 |
0.0032656 |
DayTuesday |
-0.0604242 |
0.0100400 |
-6.018322 |
0.0000000 |
DayWednesday |
0.1714460 |
0.0101413 |
16.905694 |
0.0000000 |
AvgTemp |
0.0253493 |
0.0003233 |
78.418600 |
0.0000000 |
NewPrecip |
-0.3407990 |
0.0063666 |
-53.528941 |
0.0000000 |
The regression equation for the Poisson regression model on the
frequency counts is given as:
log(μ) = 7.2025 + 0.0302 * DayMonday - 0.1945 * DaySaturday - 0.2451
* DaySunday - 0.0299 * DayThursday - 0.0604 * DayTuesday + 0.1714 *
DayWednesday + 0.0253 * AvgTemp - 0.3408 * NewPrecip
All of the predictor variables, Day, AvgTemp, and NewPrecip, all have
p-values of p < .001. This indicates that all of the predictor in our
model variables are statistically significant in predicting the total
expected counts of cyclists on the Williamsburg Bridge on a given
day.
For our categorical predictor variable of Day, Friday was chosen as
the base line level, which can be seen by how there is not a “DayFriday”
variable in the regression equation output. This is because of the seven
days, Friday is the one which comes first alphabetically and R chooses
the level which comes first alphabetically as the base line level.
Therefore, for our regression coefficient interpretations for the
different levels of the Day variable, these values will be compared
against the base line level of Friday.
Regression
Coefficients Interpretation
We will analysis the regression coefficients for the variables in
this Poisson regression model on frequency counts.
The value of the y-intercept is given as 7.2025 This represnts
the baseline of the mean of log(μ) when all predictor variables are
equal to 0. However, the y-intercept does not have a practical
interpretation or meaning in this scenario so we are not interested in
its meaning for the Poisson regression model.
DayMonday (p < .001): The regression coefficient of the
DayMonday variable in this model is 0.0302. This means that the mean log
count of cyclists on the Williamsburgs Bridge was 0.0302 greater on
Monday than on Friday. We can also say this means that the count of
cyclists is 1.0307 times greater on Monday than on Friday, holding all
other variables constant.
DaySaturday (p < .001): The regression coefficient of the
DaySaturday variable in this model is -0.1945. This means that the mean
log count of cyclists on the Williamsburgs Bridge was 0.1945 less on
Monday than on Friday. We can also say this means that the count of
cyclists is 0.8232 times greater on Monday than on Friday, holding all
other variables constant.
DaySunday (p < .001): The regression coefficient of the
DaySunday variable in this model is -0.2451. This means that the mean
log count of cyclists on the Williamsburgs Bridge was 0.2451 less on
Sunday than on Friday. We can also say this means that the count of
cyclists is 0.7826 times greater on Sunday than on Friday, holding all
other variables constant.
DayThursday (p < .001): The regression coefficient of the
DayThursday variable in this model is -0.0299. This means that the mean
log count of cyclists on the Williamsburgs Bridge was 0.0299 less on
Thursday than on Friday. We can also say this means that the count of
cyclists is 0.9705 times greater on Thursday than on Friday, holding all
other variables constant.
DayTuesday (p < .001): The regression coefficient of the
DayTuesday variable in this model is -0.0604. This means that the mean
log count of cyclists on the Williamsburgs Bridge was 0.0604 less on
Tuesday than on Friday. We can also say this means that the count of
cyclists is 0.9414 times greater on Tuesday than on Friday, holding all
other variables constant.
DayWednesday (p < .001): The regression coefficient of the
DayWednesday variable in this model is 0.1714. This means that the mean
log count of cyclists on the Williamsburgs Bridge was 0.1714 greater on
Monday than on Friday. We can also say this means that the count of
cyclists is 1.1870 times greater on Monday than on Friday, holding all
other variables constant.
AvgTemp (p < .001): The regression coefficient of the AvgTemp
variable in this model is 0.0253. This means that the mean log of the
counts increases by 0.0253 units for every 1 degree Fahrenheit increase
in the average temperature for the given observation, holding all other
variables constant.
NewPrecip (p < .001): The regression coefficient of the
NewPrecip variable in this model is -0.3408. This means that the mean
log of the count of cyclists on the Williamsburg Bridge is 0.3408 less
on days where there is precipitation than on days where there is no
precipitation. We can also say that the count of cyclists is 0.7112
greater on days with precipitation than on days with no
precipitation.
All of the predictor variables in this Poisson regression model on
frequency counts were statistically significant with all of their
p-values being equal to p < .001.
Poisson Regression
Model on Rates
Now, we will create a Poisson regression model of the rates at which
cyclists enter and leave via the Williamsburg Bridge offset by the total
number of cyclists on all four of the major New York bridges, using the
new variables we created in this project.
This model, unlike the previous model which just focused on the
frequency counts of cyclists on the Williamsburg Bridge, will also
account for the total number of cyclists on all four of the major New
York bridges, the Brooklyn Bridge, the Manhattan Bridge, the
Williamsburg Bridge, and the Queensboro Bridge. This Poisson model will
look at the rates of the number of cyclists on the Williamsburg Bridge
for a given observation as a rate out of the total number of cyclists on
all four of these major bridges for that specific observation.
We will build our Poisson regression model for the rates. This time,
we will still use the WilliamsburgBridge variable as our response
variable, but we will offset the model by the Total variable to make our
Poisson model for the rates of cyclists on the Williamsburg Bridge out
of the total number of cyclists on all four of the bridges.
# Poisson Model of Rates
model.rates <- glm(WilliamsburgBridge ~ Day + AvgTemp + NewPrecip,
offset = log(Total),
family = poisson(link = "log"), data = cycling)
kable(summary(model.rates)$coef, caption = "Poisson Regression Model of the Rates of Cyclists \n on the Williamsburg Bridge out of all Four Bridges")
Poisson Regression Model of the Rates of Cyclists on the
Williamsburg Bridge out of all Four Bridges
(Intercept) |
-1.0435841 |
0.0210730 |
-49.5222689 |
0.0000000 |
DayMonday |
0.0018152 |
0.0095668 |
0.1897380 |
0.8495145 |
DaySaturday |
0.0345382 |
0.0100162 |
3.4482277 |
0.0005643 |
DaySunday |
0.0034566 |
0.0098102 |
0.3523466 |
0.7245783 |
DayThursday |
0.0236982 |
0.0101422 |
2.3365925 |
0.0194604 |
DayTuesday |
0.0252916 |
0.0101088 |
2.5019260 |
0.0123520 |
DayWednesday |
0.0183518 |
0.0101291 |
1.8117867 |
0.0700192 |
AvgTemp |
-0.0014673 |
0.0003301 |
-4.4449423 |
0.0000088 |
NewPrecip |
0.0136632 |
0.0063769 |
2.1426111 |
0.0321443 |
The regression equation for the Poisson regression model on the rates
is given as:
log(μ/t) = -1.0436 + 0.0018 * DayMonday + 0.0345 * DaySaturday +
0.0035 * DaySunday + 0.0237 * DayThursday + 0.0253 * DayTuesday + 0.0184
* DayWednesday - 0.0015 * AvgTemp + 0.0137 * NewPrecip
The variables DaySaturday, DayThursday, DayTuesday, AvgTemp, and
NewPrecip all had p-values less than the alpha value of 0.05, meaning
that these are the variables which are statistically significant in this
model.
Like was stated for the Poisson regression model on frequency counts,
Friday was chosen by R to be the base line level of the Day variable,
and so we will compare the regression coefficients against this base
line level.
Regression
Coefficients Interpretation
We will analysis the regression coefficients for the variables in
this Poisson regression model on frequency counts.
The value of the y-intercept is given as -1.0436. This represents
the baseline of the mean of the log counts multiplied by t, when all
predictor variables are equal to 0. However, the y-intercept does not
have a practical interpretation or meaning in this scenario so we are
not interested in its meaning for the Poisson regression model.
DayMonday (p = .8495): The regression coefficient of the
DayMonday variable in this model is 0.0018. This means that the mean log
count of cyclists on the Williamsburgs Bridge was 0.0018 greater on
Monday than on Friday. We can also say this means that the count of
cyclists is 1.0018 times greater on Monday than on Friday, holding all
other variables constant.
DaySaturday (p < .001): The regression coefficient of the
DaySaturday variable in this model is 0.0345. This means that the mean
log count of cyclists on the Williamsburgs Bridge was 0.0345 greater on
Saturday than on Friday. We can also say this means that the count of
cyclists is 1.0351 times greater on Saturday than on Friday, holding all
other variables constant.
DaySunday (p = 0.7246): The regression coefficient of the
DaySunday variable in this model is 0.0035. This means that the mean log
count of cyclists on the Williamsburgs Bridge was 0.0035 greater on
Sunday than on Friday. We can also say this means that the count of
cyclists is 1.0035 times greater on Sunday than on Friday, holding all
other variables constant.
DayThursday (p = 0.0195): The regression coefficient of the
DayThursday variable in this model is 0.0237. This means that the mean
log count of cyclists on the Williamsburgs Bridge was 0.0237 greater on
Thursday than on Friday. We can also say this means that the count of
cyclists is 1.0240 times greater on Thursday than on Friday, holding all
other variables constant.
DayTuesday (p = 0.0124): The regression coefficient of the
DayTuesday variable in this model is 0.0253. This means that the mean
log count of cyclists on the Williamsburgs Bridge was 0.0253 greater on
Tuesday than on Friday. We can also say this means that the count of
cyclists is 1.0256 times greater on Tuesday than on Friday, holding all
other variables constant.
DayWednesday (p = 0.0700): The regression coefficient of the
DayWednesday variable in this model is 0.0184. This means that the mean
log count of cyclists on the Williamsburgs Bridge was 0.0184 greater on
Wednesday than on Friday. We can also say this means that the count of
cyclists is 1.0186 times greater on Wednesday than on Friday, holding
all other variables constant.
AvgTemp (p < .001): The regression coefficient of the AvgTemp
variable in this model is -0.0015. This means that the mean log of the
counts decreases by 0.0015 units for every 1 degree Fahrenheit increase
in the average temperature for the given observation, holding all other
variables constant.
NewPrecip (p = .0321): The regression coefficient of the
NewPrecip variable in this model is 0.0137. This means that the mean log
of the count of cyclists on the Williamsburg Bridge is 0.0137 greater on
days where there is precipitation than on days where there is no
precipitation. We can also say that the count of cyclists is 1.0138
greater on days with precipitation than on days with no
precipitation.
Out of all of the predictor variables, the ones which showed
statistical significance were DaySaturday (p < .001), DayThursday (p
= 0.019), DayTuesday (p = 0.0124), AvgTemp (p < .001), and NewPrecip
(p = .0321). All of the predictor variables have p-values less than the
alpha value of 0.05, indicating they are statistically significant to
the model.
The variables of DayMonday (p = .8495), DaySunday (p = 0.7246), and
DayWednesday (p = 0.0700) did not show statistical significance as they
have p-values greater than the alpha value of 0.05, indicating they are
not statistically significant to the model.
Quassi-Poisson
Regression Model
Next, we will create a Quasi-Poisson regression model. This
Quassi-Poisson regression model will be done on the rates, and so it
will be offset by the Total variable, while still using
WilliamsburgBridge as its response variable for this model.
# Quasi-Poisson Regression Model
quasimodel.rates <- glm(WilliamsburgBridge ~ Day + AvgTemp + NewPrecip,
offset = log(Total),
family = quasipoisson, data = cycling)
summary(quasimodel.rates)
Call:
glm(formula = WilliamsburgBridge ~ Day + AvgTemp + NewPrecip,
family = quasipoisson, data = cycling, offset = log(Total))
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -1.043584 0.043411 -24.040 <2e-16 ***
DayMonday 0.001815 0.019708 0.092 0.9275
DaySaturday 0.034538 0.020633 1.674 0.1090
DaySunday 0.003457 0.020209 0.171 0.8658
DayThursday 0.023698 0.020893 1.134 0.2695
DayTuesday 0.025292 0.020824 1.215 0.2380
DayWednesday 0.018352 0.020866 0.880 0.3891
AvgTemp -0.001467 0.000680 -2.158 0.0427 *
NewPrecip 0.013663 0.013137 1.040 0.3101
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
(Dispersion parameter for quasipoisson family taken to be 4.243634)
Null deviance: 151.051 on 29 degrees of freedom
Residual deviance: 89.094 on 21 degrees of freedom
AIC: NA
Number of Fisher Scoring iterations: 3
pander(summary(quasimodel.rates)$coef, caption = "Quasi-Poisson Regression Model")
Quasi-Poisson Regression Model
(Intercept) |
-1.044 |
0.04341 |
-24.04 |
9.198e-17 |
DayMonday |
0.001815 |
0.01971 |
0.09211 |
0.9275 |
DaySaturday |
0.03454 |
0.02063 |
1.674 |
0.109 |
DaySunday |
0.003457 |
0.02021 |
0.171 |
0.8658 |
DayThursday |
0.0237 |
0.02089 |
1.134 |
0.2695 |
DayTuesday |
0.02529 |
0.02082 |
1.215 |
0.238 |
DayWednesday |
0.01835 |
0.02087 |
0.8795 |
0.3891 |
AvgTemp |
-0.001467 |
0.00068 |
-2.158 |
0.04268 |
NewPrecip |
0.01366 |
0.01314 |
1.04 |
0.3101 |
The regression equation of the Quasi-Poisson Regression Model is
given as follows:
log(μ/t) = -1.0436 + 0.0018 * DayMonday + 0.0345 * DaySaturday +
0.0035 * DaySunday + 0.0237 * DayThursday + 0.0253 * DayTuesday + 0.0184
* DayWednesday - 0.0015 * AvgTemp + 0.0137 * NewPrecip
As we can see, the Quassi-Poisson regression model has the same
coefficient estimates as the standard Poisson regression model on rates,
however, the p-values for these regression coefficients are different
between these two models.
So, the regression coefficients for this Quassi-Poisson regression
model would be the exact same as they were for the previous model we
just found on the Poisson regression model of rates for the new
predictor variables of Day, AvgTemp, and NewPrecip.
Out of all of the predictor variables in our Quassi-Poisson
regression model on rates, only the variable of AvgTemp (p = 0.043) was
statistically significant, as it was the only predictor variable with a
p-value less than the alpha value of 0.05. This means, AvgTemp is the
only statistically significant predictor variable in predicting the
cyclists on the Williamsburg Bridge.
All of the other predictor variables, DayMonday, DaySaturday,
DaySunday, DayThursday, DayTuesday, DayWednesday, and NewPrecip, were
not statistically significant in the Quassi-Poisson regression model,
because they all had p-values greater than the alpha value of 0.05.
Dispersion
Now, we will look at the dispersion parameter for the Quassi-Poisson
regression model in order to see how dispersed it is.
In this output of the model summary, we were given that the
dispersion parameter for the Quasi-Poisson model is 4.2436. This
dispersion parameter given in the model summary is the Pearson
dispersion parameter.
We can also calculate the Deviance dispersion parameter to compare
these two dispersion parameters for our Quassi-Poisson regression model
on rates.
# Dispersion Parameters
yhat = quasimodel.rates$fitted.values
pearson.resid = (cycling$WilliamsburgBridge - yhat)/sqrt(yhat)
Pearson.dispersion = sum(pearson.resid^2)/quasimodel.rates$df.residual
Deviance.dispersion = (quasimodel.rates$deviance)/quasimodel.rates$df.residual
disp = cbind(Pearson.dispersion = Pearson.dispersion,
Deviance.dispersion = Deviance.dispersion)
kable(disp, caption="Dispersion parameter", align = 'c')
Dispersion parameter
4.243633 |
4.242561 |
As we can see, the value of the Pearson dispersion parameter for our
Quassi-Poisson regression model is 4.2436. The value of the Deviance
dispersion parameter for our Quassi-Poisson regression model is
4.2426.
These dispersion parameters show that our model is indeed fairly
dispersed, as these dispersion indexes do differ from the value of 1 by
quite a fair amount. We can conclude that our model is signficantly
dispered and therefore, using the standard Poisson regression model
would likely not be an ideal choice due to the potential of
over-dispersion leading to innaccurate results for prediction. The
dispersion in our model significantly differing from a value of 1
indicates that the Quassi-Poisson model likely is the better choice as
we do have some significant dispersion.
Final Model
Now, for our final model we must choose between the standard Poisson
regression model on rates and the Quassi-Poisson regression model.
One important thing to note when making this choice, is that the
regular Poisson model assumes that the mean of the response variable is
equal to its variance while the Quassi-Poisson model does not. When we
checked the conditions of the standard Poisson regression model earlier,
we found that the mean of the response variable does not equal its
variance, indicating a major violation. This violation would cause some
concern for the regular Poisson regression model as it suggest that the
response variable is, in fact, not a Poisson random variable, and
therefore a standard Poisson regression model may not be the best choice
for this data set.
Here, the Quassi-Poisson model has the advantage as it does not
assume that the mean of the response variable is equal to its variance,
which is good for our data set since it failed to meet this required
condition for a standard Poisson regression model.
Both models have advantages in disadvantages which must be considered
when making the choice of a final model. The standard Poisson regression
model on rates showed strong statistical significance for the majority
of its predictor variables. However, the data set failed to meet the
condition of the mean of the predictor variable equaling its variance
which raises concern for the fit of this model. On the other hand, the
Quassi-Poisson regression model does not require this condition of the
mean of the response variable equaling its variance. However, in the
Quassi-Poisson model, only one single predictor variable showed any
statistical significance, indicating that this model may not be
significant in its predictions after all.
Additionally, we found that our data is significantly dispersed, with
a dispersion parameter of 4.2436, which is significantly different from
1. Since our data is signficantly dispersed, it is likely that a
standard Poisson regression model is not the ideal choice as this
over-dispersion can lead to inaccruate results from this standard
Poisson regression model. When the data is signficantly dispersed, the
Quassi-Poisson regression model should be used. So, even though the
Quassi-Poisson regression model in this case did not show very good
statistical signficance within the variables for prediction, it is
likely the better choice as our data is significantly dispersed.
In the end, it seems to be a choice between the standard Poisson
regression model which is more statistically significant, but likely has
poorer accuracy in its predictions due to over-dispersion, and the
Quassi-Poisson regression model, which shows worse statistical
significance, but accounts for dispersion and is not affected by our
data set failing to meet all of the conditions required for Poisson
regression.
Overall, I would say that the Quassi-Poisson regression model is the
safer choice of the two, as it does not require the condition of the
mean of the response variable to equal its variance, as this was
something our data set failed. Additionally, using a standard Poisson
regression model on over-dispersed data can lead to inaccuracy in the
results of its predictions. However, this Quassi-Poisson regression
model shows much poorer significance which means that the results it
provides may not be significant after all. But, the Quassi-Poisson
regression model reamins the better choice in this situation as our data
fails the required condition for the response variable to be a Poisson
random variable, and we did see significant dispersion as well.
Visual Comparisons
Now, let’s look at some visual comparisons of the data within our
models.
I chose to create a graph which illustrated the predicted rates of
the cyclists on the Williamsburg Bridge based upon the day of the week
and whether or not it rained for that given day. This graph will create
two lines, one for precipitation (blue), and one for no precipitation
(red).
graph <- expand.grid(
Day = cycling$Day,
NewPrecip = cycling$NewPrecip,
AvgTemp = mean(cycling$AvgTemp, na.rm = TRUE),
Total = mean(cycling$Total, na.rm = TRUE)
)
graph$predicted_rate <- predict(quasimodel.rates, newdata = graph, type = "response")
graph$NewPrecip <- factor(graph$NewPrecip, levels = c(0, 1), labels = c("No Precipitation", "Precipitation"))
ggplot(graph, aes(x = Day, y = predicted_rate, color = NewPrecip, group = NewPrecip)) +
geom_line(size = 1) +
geom_point(size = 2) +
labs(title = "Predicted Rates of the Cyclists \n on the Williamsburg Bridge by the \n Day of the Week and the Precipitation \n Conditions",
x = "Day",
y = "Rate of Cyclists",
color = "Precipitation Conditions") +
theme_minimal() + theme(axis.text.x = element_text(angle = 45, hjust = 1))

As we can see, this graph illustrates the predicts the rate of the
cyclists on the Williamsburg Bridge out of all four of the total major
New York bridges. This graph predicts this rate of the cyclists on the
Williamsburg Bridge based on the day of the week and whether there was
precipitation or not. This graph creates two lines, one for
precipitation (blue), and one for no precipitation (red). This graph
creates points for each of the seven days of the week and for whether
there was precipiation or not on those days.
As we can see by looking at our graph, it is predicted that the
highest rate of cyclists on the Williamsburg Bridge occurs on Saturdays
with precipitation, and the lowest rate of cyclists on the Williamsburg
Bridge occurs on Fridays with no precipitation.
Conclusion
Overall, we looked at various Poisson regression models in this
project to predict the frequency counts and the rates of the cyclists on
the Williamsburg Bridge. We also looked at a Quassi-Poisson regression
model to account for the dispersion of the data along with the
violations that were seen which indicated that a standard Poisson
regression model may not be the ideal fit for our data.
It was found that our standard Poisson regression model on rates had
several variables which showed statistical significance, indicating that
these predictor variables were statistically significant in predicting
the rates of cyclists on the Williamsburg Bridge. In our Quassi-Poisson
regression model, only one of the predictor variables showed statistical
significance in predicting the rates of cyclists on the Williamsburg
Bridge. This made it seem like the standard Poisson regression model
provided better significance for prediction.
However, we looked at the dispersion parameter of the Quassi-Poisson
regression model and found that our data is in fact significantly
dispersed. This indicates that a standard Poisson regression model is
likely not an ideal choice due to it not accounting for this
over-dispersion which can lead to innacury in the results of its
prediction. This over-dispersion along with the fact that our data set
violated the condition of the mean of the response variable equaling its
variance, showed that the standard Poisson regression model is not an
ideal choice after all. Due to this significant dispersion, the
Quassi-Poisson regression model would be the better and safer choice
than the standard regression model, despite it having less statistically
significant variables. Even though the Quassi-Poisson regression model
was less statistically significant, it provides better accuracy due to
the data being dispersed, even though it shows that the majority of the
predictor variables were not statistcially significant in their
prediction of the rates of cyclists on the Williamsburg Bridge.
Recommendations
Some recommendations I would make for future projects include:
Look further into the violation that was found within this data
set and look into possible explanations for why this violation occurred.
It was found that the mean of the response variable is not equal to its
variance, which violates one of the necessities of a Poisson regression
model. It should be further considered whether a Poisson regression
model in fact is the best choice for this data set and if it is
sufficient to use this model for prediction despite these
violations.
Consider other variables which may affect the number of cyclists
out on a given observation. Perhaps there are other factors which may
provide further significance for model building which may strengthen the
regression model. For instance, maybe a variable looking at whether
there are any holidays or other notable events occurring on the day of a
given observation could be useful. This could be a binary predictor
variable with a value of 1 if there are any events or holidays, and a
value of 0 if there are not. This could perhaps be useful as there may
tend to be less cyclists out if there is a major holiday or an event
occurring in the city on that given observation.
Further expand the data set to ensure the accuracy of the
predictions and to further strengthen the Poisson regression models. By
collecting more observations over a longer period of time, this could
help to further strenghten the Poisson regression models are provide
better accuracy and reliability in the results found by the model
building process. This would help strengthen the conclusions and
findings found in the process of bulding the Poisson regression models
of this data set.
LS0tDQp0aXRsZTogIlF1YXNzaSBQb2lzc29uIFJlZ3Jlc3Npb24gTW9kZWwgb2YgdGhlIEN5Y2xpc3RzIG9uIHRoZSBXaWxsaWFtc2J1cmcgQnJpZGdlIg0KYXV0aG9yOiAiSm9zaWUgR2FsbG9wIg0KZGF0ZTogIjIwMjQtMTEtMDgiDQpvdXRwdXQ6DQogIGh0bWxfZG9jdW1lbnQ6IA0KICAgIHRvYzogeWVzDQogICAgdG9jX2RlcHRoOiA0DQogICAgdG9jX2Zsb2F0OiB5ZXMNCiAgICBmaWdfd2lkdGg6IDYNCiAgICBmaWdfY2FwdGlvbjogeWVzDQogICAgbnVtYmVyX3NlY3Rpb25zOiB5ZXMNCiAgICB0b2NfY29sbGFwc2VkOiB5ZXMNCiAgICBjb2RlX2ZvbGRpbmc6IGhpZGUNCiAgICBjb2RlX2Rvd25sb2FkOiB5ZXMNCiAgICBzbW9vdGhfc2Nyb2xsOiB5ZXMNCiAgICB0aGVtZTogbHVtZW4NCiAgd29yZF9kb2N1bWVudDogDQogICAgdG9jOiB5ZXMNCiAgICB0b2NfZGVwdGg6IDQNCiAgICBmaWdfY2FwdGlvbjogeWVzDQogICAga2VlcF9tZDogeWVzDQogIHBkZl9kb2N1bWVudDogDQogICAgdG9jOiB5ZXMNCiAgICB0b2NfZGVwdGg6IDQNCiAgICBmaWdfY2FwdGlvbjogeWVzDQogICAgbnVtYmVyX3NlY3Rpb25zOiB5ZXMNCmVkaXRvcl9vcHRpb25zOiANCiAgY2h1bmtfb3V0cHV0X3R5cGU6IGNvbnNvbGUNCi0tLQ0KDQpgYGB7PWh0bWx9DQoNCjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+DQoNCi8qIENhc2NhZGluZyBTdHlsZSBTaGVldHMgKENTUykgaXMgYSBzdHlsZXNoZWV0IGxhbmd1YWdlIHVzZWQgdG8gZGVzY3JpYmUgdGhlIHByZXNlbnRhdGlvbiBvZiBhIGRvY3VtZW50IHdyaXR0ZW4gaW4gSFRNTCBvciBYTUwuIGl0IGlzIGEgc2ltcGxlIG1lY2hhbmlzbSBmb3IgYWRkaW5nIHN0eWxlIChlLmcuLCBmb250cywgY29sb3JzLCBzcGFjaW5nKSB0byBXZWIgZG9jdW1lbnRzLiAqLw0KDQpoMS50aXRsZSB7ICAvKiBUaXRsZSAtIGZvbnQgc3BlY2lmaWNhdGlvbnMgb2YgdGhlIHJlcG9ydCB0aXRsZSAqLw0KICBmb250LXNpemU6IDI0cHg7DQogIGNvbG9yOiBEYXJrUmVkOw0KICB0ZXh0LWFsaWduOiBjZW50ZXI7DQogIGZvbnQtZmFtaWx5OiAiR2lsbCBTYW5zIiwgc2Fucy1zZXJpZjsNCn0NCmg0LmF1dGhvciB7IC8qIEhlYWRlciA0IC0gZm9udCBzcGVjaWZpY2F0aW9ucyBmb3IgYXV0aG9ycyAgKi8NCiAgZm9udC1zaXplOiAyMHB4Ow0KICBmb250LWZhbWlseTogc3lzdGVtLXVpOw0KICBjb2xvcjogRGFya1JlZDsNCiAgdGV4dC1hbGlnbjogY2VudGVyOw0KfQ0KaDQuZGF0ZSB7IC8qIEhlYWRlciA0IC0gZm9udCBzcGVjaWZpY2F0aW9ucyBmb3IgdGhlIGRhdGUgICovDQogIGZvbnQtc2l6ZTogMThweDsNCiAgZm9udC1mYW1pbHk6IHN5c3RlbS11aTsNCiAgY29sb3I6IERhcmtCbHVlOw0KICB0ZXh0LWFsaWduOiBjZW50ZXI7DQp9DQpoMSB7IC8qIEhlYWRlciAxIC0gZm9udCBzcGVjaWZpY2F0aW9ucyBmb3IgbGV2ZWwgMSBzZWN0aW9uIHRpdGxlICAqLw0KICAgIGZvbnQtc2l6ZTogMjJweDsNCiAgICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsNCiAgICBjb2xvcjogbmF2eTsNCiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7DQp9DQpoMiB7IC8qIEhlYWRlciAyIC0gZm9udCBzcGVjaWZpY2F0aW9ucyBmb3IgbGV2ZWwgMiBzZWN0aW9uIHRpdGxlICovDQogICAgZm9udC1zaXplOiAyMHB4Ow0KICAgIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICAgIGNvbG9yOiBuYXZ5Ow0KICAgIHRleHQtYWxpZ246IGxlZnQ7DQp9DQoNCmgzIHsgLyogSGVhZGVyIDMgLSBmb250IHNwZWNpZmljYXRpb25zIG9mIGxldmVsIDMgc2VjdGlvbiB0aXRsZSAgKi8NCiAgICBmb250LXNpemU6IDE4cHg7DQogICAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7DQogICAgY29sb3I6IG5hdnk7DQogICAgdGV4dC1hbGlnbjogbGVmdDsNCn0NCg0KaDQgeyAvKiBIZWFkZXIgNCAtIGZvbnQgc3BlY2lmaWNhdGlvbnMgb2YgbGV2ZWwgNCBzZWN0aW9uIHRpdGxlICAqLw0KICAgIGZvbnQtc2l6ZTogMThweDsNCiAgICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsNCiAgICBjb2xvcjogZGFya3JlZDsNCiAgICB0ZXh0LWFsaWduOiBsZWZ0Ow0KfQ0KDQpib2R5IHsgYmFja2dyb3VuZC1jb2xvcjp3aGl0ZTsgfQ0KDQouaGlnaGxpZ2h0bWUgeyBiYWNrZ3JvdW5kLWNvbG9yOnllbGxvdzsgfQ0KDQpwIHsgYmFja2dyb3VuZC1jb2xvcjp3aGl0ZTsgfQ0KDQo8L3N0eWxlPg0KYGBgDQpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0NCiMgRGV0ZWN0LCBpbnN0YWxsLCBhbmQgbG9hZCBwYWNrYWdlcyBpZiBuZWVkZWQuDQppZiAoIXJlcXVpcmUoImtuaXRyIikpIHsNCiAgIGluc3RhbGwucGFja2FnZXMoImtuaXRyIikNCiAgIGxpYnJhcnkoa25pdHIpDQp9DQppZiAoIXJlcXVpcmUoImxlYWZsZXQiKSkgew0KICAgaW5zdGFsbC5wYWNrYWdlcygibGVhZmxldCIpDQogICBsaWJyYXJ5KGxlYWZsZXQpDQp9DQppZiAoIXJlcXVpcmUoIkVudlN0YXRzIikpIHsNCiAgIGluc3RhbGwucGFja2FnZXMoIkVudlN0YXRzIikNCiAgIGxpYnJhcnkoRW52U3RhdHMpDQp9DQppZiAoIXJlcXVpcmUoIk1BU1MiKSkgew0KICAgaW5zdGFsbC5wYWNrYWdlcygiTUFTUyIpDQogICBsaWJyYXJ5KE1BU1MpDQp9DQppZiAoIXJlcXVpcmUoInBoeXRvb2xzIikpIHsNCiAgIGluc3RhbGwucGFja2FnZXMoInBoeXRvb2xzIikNCiAgIGxpYnJhcnkocGh5dG9vbHMpDQp9DQppZighcmVxdWlyZSgiZHBseXIiKSkgew0KICAgaW5zdGFsbC5wYWNrYWdlcygiZHBseXIiKQ0KICAgbGlicmFyeShkcGx5cikNCn0NCmlmKCFyZXF1aXJlKCJ0aWR5dmVyc2UiKSkgew0KICAgaW5zdGFsbC5wYWNrYWdlcygidGlkeXZlcnNlIikNCiAgIGxpYnJhcnkodGlkeXZlcnNlKQ0KfQ0KaWYoIXJlcXVpcmUoIkdHYWxseSIpKSB7DQogICBpbnN0YWxsLnBhY2thZ2VzKCJHR2FsbHkiKQ0KICAgbGlicmFyeShHR2FsbHkpDQp9DQppZiAoIXJlcXVpcmUoImJvb3QiKSkgew0KICAgaW5zdGFsbC5wYWNrYWdlcygiYm9vdCIpDQogICBsaWJyYXJ5KGJvb3QpDQp9DQppZighcmVxdWlyZSgicGFuZGVyIikpIHsNCiAgIGluc3RhbGwucGFja2FnZXMoInBhbmRlciIpDQogICBsaWJyYXJ5KHBhbmRlcikNCn0NCmlmKCFyZXF1aXJlKCJtbGJlbmNoIikpIHsNCiAgIGluc3RhbGwucGFja2FnZXMoIm1sYmVuY2giKQ0KICAgbGlicmFyeShtbGJlbmNoKQ0KfQ0KaWYoIXJlcXVpcmUoInBzeWNoIikpIHsNCiAgIGluc3RhbGwucGFja2FnZXMoInBzeWNoIikNCiAgIGxpYnJhcnkocHN5Y2gpDQp9DQppZighcmVxdWlyZSgiYnJvb20ubWl4ZWQiKSkgew0KICAgaW5zdGFsbC5wYWNrYWdlcygiYnJvb20ubWl4ZWQiKQ0KICAgbGlicmFyeShicm9vbS5taXhlZCkNCn0NCmlmKCFyZXF1aXJlKCJHR2FsbHkiKSkgew0KICAgaW5zdGFsbC5wYWNrYWdlcygiR0dhbGx5IikNCiAgIGxpYnJhcnkoR0dhbGx5KQ0KfQ0KaWYgKCFyZXF1aXJlKCJwUk9DIikpIHsNCiAgIGluc3RhbGwucGFja2FnZXMoInBST0MiKQ0KICAgbGlicmFyeShwUk9DKQ0KfQ0KaWYgKCFyZXF1aXJlKCJvcGVueGxzeCIpKSB7DQogICBpbnN0YWxsLnBhY2thZ2VzKCJvcGVueGxzeCIpDQogICBsaWJyYXJ5KG9wZW54bHN4KQ0KfQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFLCAgDQogICAgICAgICAgICAgICAgICAgd2FybmluZyA9IEZBTFNFLCAgIA0KICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBGQUxTRSwgIA0KICAgICAgICAgICAgICAgICAgIHJlc3VsdHMgPSBUUlVFLCAgDQogICAgICAgICAgICAgICAgICAgY29tbWVudCA9IE5BICAgDQogICAgICAgICAgICAgICAgICAgICAgKSAgIA0KYGBgDQoNCg0KIyBJbnRyb2R1Y3Rpb24NCg0KRm9yIHRoaXMgcHJvamVjdCwgd2Ugd2lsbCBiZSBjcmVhdGluZyBhIFBvaXNzb24gcmVncmVzc2lvbiBtb2RlbC4gVGhlIGRhdGEgc2V0IGZvciB0aGlzIHByb2plY3QgbG9va3MgYXQgdGhlIGRhaWx5IHRvdGFsIG9mIGN5Y2xpc3RzIG9uIHRoZSBXaWxsaWFtc2J1cmcgQnJpZGdlIG9uIGEgZ2l2ZW4gZGF5LiBUaGlzIGRhdGEgc2V0IGxvb2tzIGF0IHRoZSB0b3RhbCBudW1iZXIgb2YgY3ljbGlzdHMgb24gdGhlIFdpbGxpYW1zYnVyZyBCcmlkZ2UgaW4gQnJvb2tseW4sIE5ldyBZb3JrLCBpbiBvcmRlciB0byBrZWVwIHRyYWNrIG9mIHRoZSB0b3RhbCBudW1iZXIgb2YgY3ljbGlzdHMgZW50ZXJpbmcgYW5kIGxlYXZpbmcgdGhpcyBjeWNsaW5nIHJvdXRlIG9uIGEgc3BlY2lmaWMgZGF5LiBXZSB3aWxsIGxvb2sgYXQgdGhlIHZhcmlvdXMgZmFjdG9ycyBhZmZlY3RpbmcgdGhlIG51bWJlciBvZiBjeWNsaXN0cyBvbiBlYWNoIGRheSwgd2l0aCBmYWN0b3JzIHN1Y2ggYXMgdGhlIHdlYXRoZXIgY29uZGl0aW9ucyBvbiB0aGF0IHBhcnRpY3VsYXIgZGF5LiBXZSB3aWxsIGFsc28gY3JlYXRlIGEgUXVhc3NpLVBvaXNzb24gcmVncmVzc2lvbiBtb2RlbCBhbmQgYW5hbHl6ZSB0aGUgZGlzcGVyc2lvbiBvZiBvdXIgbW9kZWwuIA0KDQoNCg0KIyMgRGF0YSBEZXNjcmlwdGlvbg0KDQpUaGUgZGF0YSBzZXQgaW4gdGhpcyBwcm9qZWN0IGxvb2tzIGF0IHRoZSB0b3RhbCBudW1iZXIgb2YgY3ljbGlzdHMgb24gdGhlIFdpbGxpYW1zYnVyZyBCcmlkZ2Ugb24gYSBnaXZlbiBkYXkgYWxvbmcgd2l0aCB0aGUgd2VhdGhlciBjb25kaXRpb25zIG9mIHRoYXQgZGF5IHN1Y2ggYXMgdGVtcGVyYXR1cmUgYW5kIHByZWNpcGl0YXRpb24uIFRoaXMgZGF0YSBzZXQgYWxzbyBpbmNsdWRlcyB0aGUgdG90YWwgbnVtYmVyIG9mIGN5Y2xpc3RzIG9uIGFsbCBmb3VyIG9mIHRoZSBtYWpvciBOZXcgWW9yayBicmlkZ2VzIHRoZSBCcm9va2x5biBCcmlkZ2UsIHRoZSBNYW5oYXR0YW4gQnJpZGdlLCB0aGUgV2lsbGlhbXNidXJnIEJyaWRnZSwgYW5kIHRoZSBRdWVlbnNib3JvIEJyaWRnZS4NCg0KRmlyc3QsIEkgd2lsbCBmaW5kIHRoZSBkYXRhIHNldCB3aGljaCB3aWxsIGJlIHVzZWQgZm9yIHRoaXMgYXNzaWdubWVudC4gSSByYW4gdGhlIGNvZGUgd2hpY2ggd2FzIGdpdmVuIGluIHRoZSBhc3NpZ25tZW50IGRlc2NyaXB0aW9uLCBhbmQgdGhlIGRhdGEgc2V0IEkgcmVjZWl2ZWQgd2FzIGZvciB0aGUgV2lsbGlhbXNidXJnIEJyaWRnZSwgc28gdGhhdCBpcyB3aGF0IHdlIHdpbGwgdXNlIGZvciB0aGlzIFBvaXNzb24gcmVncmVzc2lvbiBtb2RlbGluZyBwcm9qZWN0LiBXaGVuIG9wZW5pbmcgdGhlIGRvd25sb2FkZWQgZGF0YSBzZXQsIEkgbm90aWNlZCBzb21lIGlzc3VlcyB3aXRoIHRoZSBkYXRhIHNldCBub3QgYmVpbmcgcHJvcGVybHkgc3RvcmVkLiBUaGUgRGF0ZSBhbmQgRGF5IHZhcmlhYmxlIGhhZCB0aGUgZXhhY3Qgc2FtZSB2YWx1ZXMsIGFuZCB0aGVzZSB2YWx1ZXMgZGlkIG5vdCBtYWtlIHNlbnNlIHdpdGhpbiB0aGUgY29udGV4dCBvZiB0aGlzIHNpdHVhdGlvbi4gSSB3ZW50IHRocm91Z2ggYW5kIGZpeGVkIHRoZXNlIHZhbHVlcyB3aXRoIGhvdyB0aGUgYXBwZWFyZWQgaW4gdGhlIG9yaWdpbmFsIGRhdGEgc2V0LCB3aGljaCB3YXMgZ2l2ZW4gdW5kZXIgdGhlIHRhYiBkYXRhMiBpbiB0aGUgdzA5LUFzc2lnbkRhdGFTZXQueGxzeCBmaWxlLiBJIHJlcGxhY2VkIHRoZSBpbXByb3BlciB2YWx1ZXMgaW4gdGhlIERhdGUgYW5kIERheSB2YXJpYWJsZSB3aXRoIHdoYXQgd2FzIGluIHRoZSBvcmlnaW5hbCBkYXRhIHNldC4gTm93LCB0aGUgRGF0ZSB2YXJpYWJsZSBpcyBhbiBpZGVudGlmaWNhdGlvbiBvZiB0aGUgZGF0ZSBvbiB3aGljaCB0aGUgb2JzZXJ2YXRpb24gb2NjdXJyZWQuIEFuZCwgdGhlIERheSB2YXJpYWJsZSByZXByZXNlbnRzIHRoZSBkYXkgb2YgdGhlIHdlZWsgb24gd2hpY2ggdGhlIG9ic2VydmF0aW9uIG9jY3VycmVkLiBJIGFsc28gY2hlY2tlZCBhbGwgb2YgdGhlIG90aGVyIHZhcmlhYmxlcyB0byBlbnN1cmUgdGhlaXIgdmFsdWVzIHdlcmUgbm90IGFsc28gbWVzc2VkIHVwIGluIHRoZSBmb3JtYXR0aW5nIG9mIHRoZSBleGNlbCBmaWxlLCBidXQgdGhleSBhbGwgYXBwZWFyZWQgdG8gYmUgYWxsIGdvb2Qgd2l0aG91dCBhbnl0aGluZyBoYXZpbmcgZ290dGVuIGNoYW5nZWQgZHVyaW5nIHRoZSBkb3dubG9hZGluZyBwcm9jZXNzLiANCg0KVGhlIGRhdGEgc2V0IGhhcyBiZWVuIHVwbG9hZGVkIHRvIEdpdGh1YiBhbmQgbm93IGNhbiBiZSByZWFkIGluIGRpcmVjdGx5IGZyb20gdGhlIEdpdGh1YiByZXBvc2l0b3J5LiANCg0KV2Ugd2lsbCByZWFkIGluIHRoZSBkYXRhIHNldCBmcm9tIEdpdGh1YiBhbmQgd2Ugd2lsbCBjYWxsIGl0ICJjeWNsaW5nIi4NCg0KYGBge3J9DQpjeWNsaW5nIDwtIHJlYWQuY3N2KCJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vSm9zaWVHYWxsb3AvU1RBMzIxL3JlZnMvaGVhZHMvbWFpbi9kYXRhc2V0L1dpbGxpYW1zYnVyZ0JyaWRnZS5jc3YiLCBoZWFkZXIgPSBUUlVFKQ0KDQpzdHIoY3ljbGluZykNCmBgYA0KDQpXZSB3aWxsIHVzZSB0aGlzIGN5Y2xpbmcgZGF0YSBzZXQgdG8gY3JlYXRlIHR3byBQb2lzc29uIHJlZ3Jlc3Npb24gbW9kZWxzLCBvbmUgZm9yIHRoZSBmcmVxdWVuY3kgY291bnRzIG9mIGN5Y2xpc3RzIG9uIHRoZSBXaWxsaWFtc2J1cmcgQnJpZGdlIG9uIGEgZ2l2ZW4gb2JzZXJ2YXRpb24sIGFuZCBhbm90aGVyIGZvciB0aGUgcmF0ZXMgb2YgY3ljbGlzdHMgZW50ZXJpbmcgYW5kIGxlYXZpbmcgdmlhIHRoZSBXaWxsaWFtc2J1cmcgQnJpZGdlIG9mZnNldCBieSB0aGUgdG90YWwgbnVtYmVyIG9mIGN5Y2xpc3RzIG9uIGFsbCBvZiB0aGUgbWFqb3IgTmV3IFlvcmsgYnJpZGdlcy4gDQoNCg0KIyMgVmFyaWFibGVzDQoNCg0KVGhlcmUgYXJlIDcgdG90YWwgdmFyaWFibGVzIGluIHRoZSBjeWNsaW5nIGRhdGEgc2V0LiBUaGVzZSB2YXJpYWJsZXMgaW5jbHVkZToNCg0KKiBEYXRlOiBUaGlzIHJlcHJlc2VudHMgdGhlIGRhdGUgb24gd2hpY2ggYSBnaXZlbiBvYnNlcnZhdGlvbiB3YXMgY29sbGVjdGVkLiBUaGlzIGlzIHRoZSBvYnNlcnZhdGlvbiBJRCBudW1iZXIuIFRoaXMgdmFyaWFibGUgaXMganVzdCBmb3IgaWRlbnRpZmljYXRpb24gcHVycG9zZXMgb2YgdGhlIG9ic2VydmF0aW9ucywgbm90IGZvciBhY3R1YWwgcHJlZGljdGlvbi4gVGhlIGRhdGUgaXMgZ2l2ZW4gaW4gdGhlIGZvcm1hdCBvZiBtb250aC9kYXkuIA0KDQoqIERheTogVGhpcyBpcyBhIGNoYXJhY3RlciBwcmVkaWN0b3IgdmFyaWFibGUgd2hpY2ggcmVwcmVzZW50cyB0aGUgZGF5IG9mIHRoZSB3ZWVrIG9uIHdoaWNoIGEgZ2l2ZW4gb2JzZXJ2YXRpb24gd2FzIGNvbGxlY3RlZC4gRm9yIGluc3RhbmNlLCBNb25kYXksIFR1ZXNkYXksIGV0Yy4gDQoNCiogSGlnaFRlbXA6IEEgcXVhbnRpdGF0aXZlIHByZWRpY3RvciB2YXJpYWJsZSByZXByZXNlbnRpbmcgdGhlIGhpZ2ggdGVtcGVyYXR1cmUgb24gdGhlIGdpdmVuIGRheSwgZ2l2ZW4gaW4gZGVncmVlcyBGYWhyZW5oZWl0LiANCg0KKiBMb3dUZW1wOiBBIHF1YW50aXRhdGl2ZSBwcmVkaWN0b3IgdmFyaWFibGUgcmVwcmVzZW50aW5nIHRoZSBsb3cgdGVtcGVyYXR1cmUgb24gdGhlIGdpdmVuIGRheSwgZ2l2ZW4gaW4gZGVncmVlcyBGYWhyZW5oZWl0Lg0KDQoqIFByZWNpcGl0YXRpb246IEEgcXVhbnRpdGF0aXZlIHByZWRpY3RvciB2YXJpYWJsZSByZXByZXNlbnRpbmcgdGhlIGFtb3VudCBvZiBwcmVjaXBpdGF0aW9uLCByYWluLCB3aGljaCBvY2N1cnJlZCBvbiB0aGUgZ2l2ZW4gZGF5LCBnaXZlbiBpbiBpbmNoZXMuIA0KDQoqIFdpbGxpYW1zYnVyZ0JyaWRnZTogQSBxdWFudGl0YXRpdmUgdmFyaWFibGUgcmVwcmVzZW50aW5nIHRoZSB0b3RhbCBudW1iZXIgb2YgY3ljbGlzdHMgb24gdGhlIFdpbGxpYW1zYnVyZyBCcmlkZ2Ugb24gYSBnaXZlbiBvYnNlcnZhdGlvbi4gVGhpcyB3aWxsIGJlIG91ciByZXNwb25zZSB2YXJpYWJsZSBmb3IgdGhlIFBvaXNzb24gcmVncmVzc2lvbiBtb2RlbHMuIA0KDQoqIFRvdGFsOiBUaGUgdG90YWwgbnVtYmVyIG9mIGN5Y2xpc3RzIG9uIGFsbCBicmlkZ2VzIG9uIGEgZ2l2ZW4gb2JzZXJ2YXRpb24uIFRoaXMgd2lsbCBiZSB0aGUgdmFyaWFibGUgd2hpY2ggaXMgb2Zmc2V0IGZvciBvdXIgUG9pc3NvbiByZWdyZXNzaW9uIG1vZGVsIG9mIHRoZSByYXRlcyBhbmQgZm9yIHRoZSBRdWFzc2ktUG9pc3NvbiByZWdyZXNzaW9uIG1vZGVsLg0KDQoNCldlIGFsc28gd2lsbCBjcmVhdGUgdHdvIG5ldyB2YXJpYWJsZXMgd2l0aGluIG91ciBhbmFseXNpcyBsYXRlciBvbiB0byB1c2UgZm9yIHRoZSBQb2lzc29uIHJlZ3Jlc3Npb24gbW9kZWwgYnVpbGRpbmcgcHJvY2Vzcy4gVGhlc2UgdHdvIHZhcmlhYmxlcyBpbmNsdWRlOg0KDQoqIEF2Z1RlbXA6IEEgcXVhbnRpdGF0aXZlIHByZWRpY3RvciB2YXJpYWJsZSByZXByZXNlbnRpbmcgdGhlIGF2ZXJhZ2UgdGVtcGVyYXR1cmUgZm9yIGEgZ2l2ZW4gb2JzZXJ2YXRpb24sIGdpdmVuIGluIGRlZ3JlZXMgRmFocmVuaGVpdC4gVGhpcyB2YXJpYWJsZSB3aWxsIGJlIHRoZSBhdmVyYWdlIG9mIEhpZ2hUZW1wIGFuZCBMb3dUZW1wLCBmb3VuZCBieSBjYWxjdWxhdGluZyAoSGlnaFRlbXAgKyBMb3dUZW1wKS8yLiANCg0KKiBOZXdQcmVjaXA6IEEgZGlzY3JldGl6ZWQgdmVyc2lvbiBvZiB0aGUgUHJlY2lwaXRhdGlvbiB2YXJpYWJsZS4gVGhpcyB3aWxsIGJlIGEgYmluYXJ5IHByZWRpY3RvciB2YXJpYWJsZSwgd2hlcmUgMCByZXByZXNlbnRzIGEgcHJlY2lwaXRhdGlvbiB2YWx1ZSBlcXVhbCB0byAwIGluY2hlcywgYW5kIHdoZXJlIDEgcmVwcmVzZW50cyBhIHByZWNpcGl0YXRpb24gdmFsdWUgZ3JlYXRlciB0aGFuIDAgaW5jaGVzLiANCg0KDQpGb3IgdGhlIFBvaXNzb24gcmVncmVzc2lvbiBtb2RlbCBmb3IgdGhlIGZyZXF1ZW5jeSBjb3VudHMsIHRoZSBXaWxsaWFtc2J1cmcgQnJpZGdlIHZhcmlhYmxlIHdpbGwgc2VydmUgYXMgdGhlIHJlc3BvbnNlIHZhcmlhYmxlLiBGb3IgdGhlIFBvaXNzb24gcmVncmVzc2lvbiBtb2RlbCBmb3IgdGhlIHJhdGVzLCB0aGUgV2lsbGlhbXNidXJnIEJyaWRnZSB2YXJpYWJsZSB3aWxsIGFnYWluIHNlcnZlIGFzIHRoZSByZXNwb25zZSB2YXJpYWJsZSwgYW5kIGl0IHdpbGwgYmUgb2Zmc2V0IGJ5IHRoZSBUb3RhbCB2YXJpYWJsZSBmb3IgdGhpcyBtb2RlbC4gDQoNCg0KIyMgUmVzZWFyY2ggUXVlc3Rpb25zDQoNClRoZSBtYWluIGdvYWwgZm9yIHRoaXMgcHJvamVjdCBpcyB0byBjcmVhdGUgYSBQb2lzc29uIHJlZ3Jlc3Npb24gbW9kZWwgZm9yIGJvdGggdGhlIGZyZXF1ZW5jeSBjb3VudHMgYW5kIHRoZSByYXRlcyBvZiB0aGUgY3ljbGlzdHMgZW50ZXJpbmcgYW5kIGxlYXZpbmcgQnJvb2tseW4sIE5ldyBZb3JrIHRocm91Z2ggdGhlIFdpbGxpYW1zYnVyZyBCcmlkZ2UuIFNvLCB0aGUgZm9jdXMgZm9yIHRoaXMgcHJvamVjdCB3aWxsIGJlIG9uIGNyZWF0aW5nIHR3byBQb2lzc29uIHJlZ3Jlc3Npb24gbW9kZWxzIHdoaWNoIGNhbiBzdWNjZXNzZnVsbHkgcHJlZGljdCB0aGUgZnJlcXVlbmN5IGNvdW50cyBhbmQgdGhlIHJhdGVzIG9mIHRoZSBjeWNsaXN0cyBvbiB0aGUgV2lsbGlhbXNidXJnIEJyaWRnZS4gDQoNClNvbWUga2V5IHF1ZXN0aW9ucyBmb3IgdGhpcyBwcm9qZWN0IGluY2x1ZGU6DQoNCiogRG9lcyB0aGUgZGF0YSBzZXQgbWVldCBhbGwgb2YgdGhlIG5lY2Vzc2FyeSBjb25kaXRpb25zIHJlcXVpcmVkIGZvciBhIFBvaXNzb24gcmVncmVzc2lvbiBtb2RlbD8gSWYgbm90LCBpcyB0aGVyZSBhbnkgcG90ZW50aWFsIGV4cGxhbmF0aW9uIGZvciB0aGlzIGRpc2NyZXBhbmN5PyANCg0KKiBDYW4gd2UgY3JlYXRlIFBvaXNzb24gcmVncmVzc2lvbiBtb2RlbHMgd2hpY2ggcHJvdmlkZSBzdGF0aXN0aWNhbCBzaWduaWZpY2FuY2UgZm9yIHByZWRpY3RpbmcgYm90aCB0aGUgZnJlcXVlbmN5IGNvdW50cyBhbmQgZm9yIHRoZSByYXRlcyBvZiBjeWNsaXN0cyBvbiB0aGUgV2lsbGlhbXNidXJnIEJyaWRnZSBvbiBhIGdpdmVuIGRheT8NCg0KKiBJcyB0aGUgUXVhc2ktUG9pc3NvbiByZWdyZXNzaW9uIG1vZGVsIGEgYmV0dGVyIGNob2ljZSB0aGFuIHRoZSBlaXRoZXIgb2YgdGhlIHN0YW5kYXJkIFBvaXNzb24gcmVncmVzc2lvbiBtb2RlbHMgZm9yIGZyZXF1ZW5jeSBjb3VudHMgYW5kIGZvciByYXRlcz8gSG93IGRpc3BlcnNlZCBpcyB0aGlzIFF1YXNpLVBvaXNzb24gcmVncmVzc2lvbiBtb2RlbD8NCg0KDQpXZSB3aWxsIHdvcmsgb24gY3JlYXRpbmcgb3VyIFBvaXNzb24gcmVncmVzc2lvbiBtb2RlbHMgZm9yIGJvdGggdGhlIGZyZXF1ZW5jeSBjb3VudHMgYW5kIHJhdGVzIGluIG9yZGVyIHRvIHNlZSBpZiB3ZSBjYW4gaW4gZmFjdCBjcmVhdGUgbW9kZWxzIHdoaWNoIHByb3ZpZGUgc3RhdGlzdGljYWwgc2lnbmlmaWNhbmNlIGluIHRoZWlyIHByZWRpY3RpdmUgYWJpbGl0eS4gV2Ugd2lsbCBhbHNvIGNyZWF0ZSBhIFF1YXNpLVBvaXNzb24gcmVncmVzc2lvbiBtb2RlbCBhbmQgd2Ugd2lsbCBmaW5kIGhvdyBkaXNwZXJlZCBpdCBpcy4gV2Ugd2lsbCBkZXRlcm1pbmUgd2hpY2ggb2YgdGhlc2UgbW9kZWxzIGlzIHRoZSBpZGVhbCBjaG9pY2UgZm9yIG91ciBmaW5hbCByZWdyZXNzaW9uIG1vZGVsLiANCg0KDQoNCiMgRXhwbG9yYXRvcnkgRGF0YSBBbmFseXNpcw0KDQpMZXQncyB0YWtlIGEgbG9vayBhdCB0aGUgZmlyc3QgZmV3IGVudHJpZXMgd2l0aGluIHRoaXMgY3ljbGluZyBkYXRhIHNldCBmb3IgdGhlIFdpbGxpYW1zYnVyZyBCcmlkZ2UuDQoNCmBgYHtyfQ0Ka2FibGUoaGVhZChjeWNsaW5nKSwgY2FwdGlvbiA9ICJGaXJzdCBGZXcgT2JzZXJ2YXRpb25zIGluIHRoZSBEYXRhIFNldCIpIA0KYGBgDQoNClRoaXMgZGF0YSBzZXQgaW5jbHVkZXMgdmFyaW91cyBmYWN0b3JzIHdoaWNoIG1heSBoYXZlIGFuIGluZmx1ZW5jZSBvbiB0aGUgbnVtYmVyIG9mIGluZGl2aWR1YWxzIGN5Y2xpbmcsIGFsb25nIHdpdGggdGhlIGRhdGUgb24gd2hpY2ggdGhpcyBkYXRhIHdhcyBjb2xsZWN0ZWQuIEFkZGl0aW9uYWxseSwgdGhpcyBkYXRhIHNldCBpbmNsdWRlcyB2YXJpYWJsZXMgZm9yIGJvdGggdGhlIG51bWJlciBvZiBjeWNsaXN0cyBvbiB0aGUgV2lsbGlhbXNidXJnIEJyaWRnZSBvbiB0aGF0IGdpdmVuIGRheSwgYWxvbmcgd2l0aCB0aGUgdG90YWwgbnVtYmVyIG9mIGN5Y2xpc3RzIG9uIGFsbCBicmlkZ2VzIG9uIHRoYXQgZ2l2ZW4gZGF5LiAgDQoNCg0KRmlyc3QsIGxldCdzIGNoZWNrIGlmIHRoZXJlIGFyZSBhbnkgbWlzc2luZyB2YXJpYWJsZXMgaW4gb3VyIGRhdGEgc2V0Lg0KDQpgYGB7cn0NCmNvbFN1bXMoaXMubmEoY3ljbGluZykpDQpgYGANCg0KSXQgdHVybnMgb3V0IHRoYXQgYWxsIG9mIHRoZSB2YXJpYWJsZXMgaW4gdGhlIGRhdGEgc2V0IGhhdmUgZXhhY3RseSB6ZXJvIG1pc3NpbmcgdmFsdWVzLiBTbywgdGhlcmUgYXJlIG5vIG1pc3NpbmcgdmFsdWVzIGluIG91ciBkYXRhIHNldC4gVGhpcyBpcyB2ZXJ5IGdvb2QgYW5kIG1lYW5zIHdlIGNhbiBtb3ZlIG9uIHdpdGggZnVydGhlciBhbmFseXppbmcgdGhlIGRhdGEgc2V0IGFuZCB0aGUgdmFyaWFibGVzIHdpdGhpbiBpdC4NCg0KDQojIyBWYXJpYWJsZSBUcmFuc2Zvcm1hdGlvbnMNCg0KV2Ugd2lsbCB0cmFuc2Zvcm0gc29tZSBvZiBvdXIgcHJlZGljdG9yIHZhcmlhYmxlcyBiZWZvcmUgYmVnaW5uaW5nIHdpdGggb3VyIGFuYWx5c2lzIGFuZCBidWlsZGluZyB0aGUgUG9pc3NvbiByZWdyZXNzaW9uIG1vZGVscy4NCg0KRmlyc3QsIHdlIHdpbGwgY3JlYXRlIGEgbmV3IHZhcmlhYmxlIGZvciB0aGUgdGVtcGVyYXR1cmUgd2hpY2ggaXMgYW4gYXZlcmFnZSBvZiB0aGUgaGlnaCB0ZW1wZXJhdHVyZSBhbmQgdGhlIGxvdyB0ZW1wZXJhdHVyZSBmb3IgdGhhdCBnaXZlbiBvYnNlcnZhdGlvbi4gV2Ugd2lsbCBjYWxsIG91ciBuZXcgdmFyaWFibGUgQXZnVGVtcCBhbmQgdGhpcyB3aWxsIHNlcnZlIGFzIHRoZSBhdmVyYWdlIG9mIHRoZSBIaWdoVGVtcCBhbmQgdGhlIExvd1RlbXAgdmFyaWFibGVzLiANCg0KYGBge3J9DQojIENyZWF0aW5nIHRoZSBuZXcgQXZnVGVtcCB2YXJpYWJsZS4NCmN5Y2xpbmckQXZnVGVtcCA8LSAoY3ljbGluZyRIaWdoVGVtcCArIGN5Y2xpbmckTG93VGVtcCkvMg0KYGBgDQoNCk5vdywgd2UgaGF2ZSBhIG5ldyB2YXJpYWJsZSwgQXZnVGVtcCwgcmVwcmVzZW50aW5nIHRoZSBhdmVyYWdlIG9mIHRoZSBoaWdoIHRlbXBlcmF0dXJlIGFuZCB0aGUgbG93IHRlbXBlcmF0dXJlIGZvciBhIGdpdmVuIG9ic2VydmF0aW9uLg0KDQoNCk5leHQsIHdlIHdpbGwgZGlzY3JldGl6ZSB0aGUgUHJlY2lwaXRhdGlvbiB2YXJpYWJsZS4gV2Ugd2lsbCBjcmVhdGUgYSB2YXJpYWJsZSBjYWxsZWQgTmV3UHJlY2lwIHdoaWNoIHdpbGwgYmUgYSBkaXNjcmV0aXplZCB2ZXJzaW9uIG9mIHRoZSBvcmlnaW5hbCBQcmVjaXBpdGF0aW9uIHZhcmlhYmxlLiBGb3IgdGhpcyBkaXNjcmV0aXplZCB2YXJpYWJsZSwgTmV3UHJlY2lwIHdpbGwgZXF1YWwgMCBpZiBQcmVjaXBpdGF0aW9uIGVxdWFscyAwIGZvciB0aGF0IG9ic2VydmF0aW9uLCBhbmQgTmV3UHJlY2lwIHdpbGwgZXF1YWwgMSBpZiBQcmVjaXBpdGF0aW9uIGlzIGdyZWF0ZXIgdGhhbiAwIGZvciB0aGF0IG9ic2VydmF0aW9uLiANCg0KV2Ugd2lsbCBtYWtlIHRoZSBOZXdQcmVjaXAgdmFyaWFibGUgYSBiaW5hcnkgdmFyaWFibGUgd2l0aCAwIHJlcHJlc2VudGluZyBwcmVjaXBpdGF0aW9uIG9mIDAgaW5jaGVzLCBhbmQgMSByZXByZXNlbnRpbmcgcHJlY2lwaXRhdGlvbiBncmVhdGVyIHRoYW4gMCBpbmNoZXMuIFdlIHdpbGwgYWxzbyBjb252ZXJ0IHRoaXMgYmluYXJ5IE5ld1ByZWNpcCB2YXJpYWJsZSBpbnRvIGFuIGludGVnZXIgdmFyaWFibGUgaW5zdGVhZCBvZiBhIG51bWVyaWMgdmFyaWFibGUuIA0KDQpgYGB7cn0NCiMgQ3JlYXRpbmcgdGhlIE5ld1ByZWNpcCB2YXJpYWJsZS4NCmN5Y2xpbmckTmV3UHJlY2lwIDwtIGlmZWxzZShjeWNsaW5nJFByZWNpcGl0YXRpb24gPT0gMCwgMCwgMSkNCg0KIyBNYWtpbmcgdGhlIGJpbmFyeSB2YXJpYWJsZSBhbiBpbnQuDQpjeWNsaW5nJE5ld1ByZWNpcCA8LSBhcy5pbnRlZ2VyKGN5Y2xpbmckTmV3UHJlY2lwKQ0KYGBgDQoNCk5vdywgd2UgaGF2ZSBhIGRpc2NyZXRpemVkIE5ld1ByZWNpcCB2YXJpYWJsZSBpbiBvdXIgZGF0YSBzZXQgd2hpY2ggcmVwcmVzZW50cyBhIGJpbmFyeSBwcmVkaWN0b3IgdmFyaWFibGUgd2hlcmUgMCBpcyBmb3IgYSBwcmVjaXBpdGF0aW9uIG9mIDAgaW5jaGVzIGFuZCAxIGlzIGZvciBhIHByZWNpcGl0YXRpb24gZ3JlYXRlciB0aGFuIDAgaW5jaGVzLiANCg0KDQoNCiMjIENoZWNraW5nIHRoZSBWYXJpYWJsZSBEaXN0cmlidXRpb25zDQoNCldlIGhhdmUgdGhyZWUgcHJlZGljdG9yIHZhcmlhYmxlcyB3aGljaCB3ZSB3YW50IHRvIHVzZSBpbiBvdXIgZmluYWwgbW9kZWwsIERheSwgQXZnVGVtcCwgYW5kIE5ld1ByZWNpcC4gT3V0IG9mIHRoZXNlIHZhcmlhYmxlcywgRGF5IGlzIGEgY2F0ZWdvcmljYWwgY2hhcmFjdGVyIHZhcmlhYmxlLCBBdmdUZW1wIGlzIGEgcXVhbnRpdGF0aXZlIHZhcmlhYmxlLCBhbmQgTmV3UHJlY2lwIGlzIGEgYmluYXJ5IHZhcmlhYmxlLiBXZSB3aWxsIGNoZWNrIHRoYXQgdGhlIGRpc3RyaWJ1dGlvbnMgb2YgYWxsIG9mIHRoZXNlIHZhcmlhYmxlcyBhcHBlYXIgdG8gYmUgcmFuZG9tLCB3aXRob3V0IGFueSBub3RpY2VhYmxlIHBhdHRlcm5zIG9yIGNvbmNlcm5zIHdoaWNoIGNvdWxkIGNhdXNlIGlzc3VlcyB3aXRoIHRoZSBtb2RlbCBidWlsZGluZyBwcm9jZXNzLiANCg0KRmlyc3QsIGxldCdzIGxvb2sgYXQgb3VyIERheSB2YXJpYWJsZS4gVGhpcyBpcyBhIGNhdGVnb3JpY2FsIGNoYXJhY3RlciB2YXJpYWJsZS4gSW4gb3JkZXIgdG8gY2hlY2sgdGhhdCB0aGlzIHZhcmlhYmxlIGlzIHByb3Blcmx5IGRpc3RyaWJ1dGVkIHdpdGhvdXQgYW55IG1ham9yIGNvbmNlcm5zLCB3ZSB3aWxsIGxvb2sgZm9yIGlmIHRoZXJlIGFyZSBhbnkgcG90ZW50aWFsIGltYmFsYW5jZXMgd2l0aGluIHRoaXMgdmFyaWFibGUuIEFuIGltYmFsYW5jZSB3b3VsZCBvY2N1ciBpZiB0aGVyZSB3ZXJlIGEgc2lnbmlmaWNhbnRseSBncmVhdGVyIG51bWJlciBvZiBvYnNlcnZhdGlvbnMgb2NjdXJpbmcgb24gb25lIGRheSBhcyBvcHBvc2VkIHRvIGFub3RoZXIgZGF5LiBXZSB3aWxsIGNoZWNrIHRoYXQgdGhlcmUgYXJlIG5vdCBhbnkgc3Vic3RhbnRpYWwgaW1iYWxhbmNlcyB3aXRoaW4gdGhlIERheSB2YXJpYWJsZS4NCg0KYGBge3J9DQp0YWJsZShjeWNsaW5nJERheSkNCmBgYA0KDQpJdCBhcHBlYXJzIHRoYXQgYWxsIGRheXMgb2YgdGhlIHdlZWsgZnJvbSBNb25kYXkgdG8gRnJpZGF5IGhhdmUgZXhhY3RseSBmb3VyIG9ic2VydmF0aW9ucyBpbiBvdXIgZGF0YSBzZXQuIFRoZSB3ZWVrZW5kIGRheXMgb2YgU2F0dXJkYXkgYW5kIFN1bmRheSBib3RoIGhhdmUgZXhhY3RseSBmaXZlIG9ic2VydmF0aW9ucyBpbiBvdXIgZGF0YSBzZXQuIEFzIHdlIGNhbiBzZWUsIHRoZSBvYnNlcnZhdGlvbnMgYXBwZWFyIHRvIGJlIGRpc3RyaWJ1dGVkIHZlcnkgZXZlbmx5IGFtb25nc3QgdGhlIGRheXMgb2YgdGhlIHdlZWssIHdpdGggdGhlIHdlZWtlbmQgZGF5cyBvbmx5IGhhdmluZyBvbmUgbW9yZSBvYnNlcnZhdGlvbiBlYWNoIHRoYW4gdGhlIHdlZWtkYXlzLiBPdmVyYWxsLCB0aGlzIHZhcmlhYmxlIGFwcGVhcnMgdG8gYmUgb3ZlcmFsbCBldmVubHkgZGlzdHJpYnV0ZWQsIGFuZCBzbyB0aGVyZSBhcmUgbm90IGFueSBpbWJhbGFuY2VzIHRvIGJlIGNvbmNlcm5lZCBhYm91dCBmb3Igb3VyIERheSBwcmVkaWN0b3IgdmFyaWFibGUuDQoNCk5leHQsIGxldCdzIGNoZWNrIHRoZSBkaXN0cmlidXRpb24gb2Ygb3VyIEF2Z1RlbXAgdmFyaWFibGUuIFRoaXMgaXMgYSBxdWFudGl0YXRpdmUgcHJlZGljdG9yIHZhcmlhYmxlIGFuZCBzbyB3ZSBjYW4gY2hlY2sgaXRzIGRpc3RyaWJ1dGlvbiBieSB1c2luZyBhIGhpc3RvZ3JhbS4gV2Ugd2lsbCBjaGVjayB0byBzZWUgaWYgdGhpcyB2YXJpYWJsZSBoYXMgYW4gb3ZlcmFsbCBub3JtYWwgZGlzdHJpYnV0aW9uIHdpdGhvdXQgYW55IG5vdGFibGUgc2tldyBvciBvdXRsaWVycy4gDQoNCmBgYHtyfQ0KeWxpbWl0ID0gbWF4KGRlbnNpdHkoY3ljbGluZyRBdmdUZW1wKSR5KQ0KaGlzdChjeWNsaW5nJEF2Z1RlbXAsIHByb2JhYmlsaXR5ID0gVFJVRSwgbWFpbiA9ICJBdmdUZW1wIERpc3RyaWJ1dGlvbiIsIHhsYWI9IkF2Z1RlbXAiLCANCiAgICAgICBjb2wgPSAiYWxpY2VibHVlIiwgYm9yZGVyPSJjb3JuZmxvd2VyYmx1ZSIpDQogIGxpbmVzKGRlbnNpdHkoY3ljbGluZyRBdmdUZW1wLCBhZGp1c3Q9MiksIGNvbD0iZGFya29yY2hpZCIpDQpgYGANCg0KSXQgYXBwZWFycyB0aGF0IG91ciBkaXN0cmlidXRpb24gaGlzdG9ncmFtIG9mIHRoZSBBdmdUZW1wIHZhcmlhYmxlIGlzIHVuaW1vZGFsIHdpdGggbWFqb3JpdHkgb2YgdGhlIGRhdGEgYmVpbmcgY2VudGVyZWQgYXQgYW4gYXZlcmFnZSB0ZW1wZXJhdHVyZSBiZXR3ZWVuIDU1IGFuZCA2MCBkZWdyZWVzIEZhaHJlbmhlaXQuIFRoZSBkaXN0cmlidXRpb24gYXBwZWFycyB0byBmb2xsb3cgYW4gYXBwcm94aW1hdGVseSBub3JtYWwgZGlzdHJpYnV0aW9uIHdpdGhvdXQgYW55IG5vdGVhYmxlIHNrZXcgb3Igb3V0bGllcnMuIEl0IGRvZXMgYXBwZWFyIGxpa2UgcGVyaGFwcyB0aGVyZSBpcyBzbGlnaHRseSBtb3JlIGVudHJpZXMgb24gdGhlIGxlZnQgc2lkZSBvZiB0aGUgaGlzdG9ncmFtLCBidXQgaXQgaXMgb25seSBieSBhIHZlcnkgc2xpZ2h0IGFtb3VudCBhbmQgaXMgbm90IHNpZ25pZmljYW50IGVub3VnaCB0byBjYXVzZSBhIG5vdGljZWFibGUgc2tldyBpbiB0aGUgZGlzdHJpYnV0aW9uLiBPdmVyYWxsLCBpdCBhcHBlYXJzIHNhZmUgdG8gc2F5IHRoYXQgb3VyIEF2Z1RlbXAgdmFyaWFibGUgZm9sbG93cyBhbiBhcHByb3hpbWF0ZWx5IG5vcm1hbCBkaXN0cmlidXRpb24sIGFuZCBzbyB0aGlzIHZhcmlhYmxlIHdpbGwgYmUgYWxsIGdvb2QgdG8gdXNlIGluIG91ciBtb2RlbCBidWlsZGluZyBwcm9jZXNzLiAgDQoNCkxhc3RseSwgbGV0J3MgY2hlY2sgb3VyIE5ld1ByZWNpcCB2YXJpYWJsZS4gVGhpcyBpcyBhIGJpbmFyeSBwcmVkaWN0b3IgdmFyaWFibGUsIGFuZCBzbyB3ZSBjYW4gZXhwZWN0IGl0IHRvIGhhdmUgdmFsdWVzIG9mIG9ubHkgMCBhbmQgMS4gSW4gb3JkZXIgdG8gY2hlY2sgdGhlIHJlbGlhYmlsaXR5IG9mIHRoaXMgdmFyaWFibGUgaW4gaXRzIHVzZSBmb3IgcHJlZGljdGlvbiwgd2Ugd2lsbCBtYWtlIHN1cmUgaXQgYXBwZWFycyB0byBtZWV0IHRoaXMgY3JpdGVyaWEgb2YgYSBiaW5hcnkgdmFyaWFibGUuIFdlIGNhbiB0YWtlIGEgbG9vayBhdCBhIHRhYmxlIHRvIGVuc3VyZSB0aGF0IHRoZXJlIGFyZSBvbmx5IHR3byBwb3NzaWJsZSBlbnRyaWVzIGZvciB0aGlzIE5ld1ByZWNpcCB2YXJpYWJsZSwgMCBhbmQgMSwgYmVjYXVzZSB0aGVzZSBhcmUgdGhlIG9ubHkgdHdvIHZhbHVlcyB3aGljaCBhIGJpbmFyeSB2YXJpYWJsZSBjYW4gYmUuDQoNCmBgYHtyfQ0KdGFibGUoY3ljbGluZyROZXdQcmVjaXApDQpgYGANCg0KQXMgd2UgY2FuIHNlZSwgdGhpcyBOZXdQcmVjaXAgdmFyaWFibGUgaGFzIG9ubHkgdHdvIGVudHJpZXMsIDAgYW5kIDEuIFRoaXMgaXMgZXhhY3RseSB3aGF0IHdlIHdhbnRlZCB0byBzZWUgYmVjYXVzZSB0aGVzZSBhcmUgdGhlIG9ubHkgdHdvIHZhcmlhYmxlcyB3aGljaCBhIGJpbmFyeSB2YXJpYWJsZSBjYW4gYmUuIFdlIGNhbiBzZWUgdGhhdCB0aGVyZSBhcmUgc2xpZ2h0bHkgbW9yZSBkYXlzIHdpdGggbm8gcHJlY2lwaXRhdGlvbiwgYSB2YWx1ZSBvZiAwLCB3aXRoIDE4IHRvdGFsIG9ic2VydmF0aW9ucywgdGhhbiBkYXlzIHdpdGggcHJlY2lwaXRhdGlvbiwgYSB2YWx1ZSBvZiAxLCB3aXRoIDEyIHRvdGFsIG9ic2VydmF0aW9ucy4gSG93ZXZlciwgdGhpcyBkaWZmZXJlbmNlIGlzIG5vdCBsYXJnZSBlbm91Z2ggdG8gYmUgYSBjYXVzZSBmb3IgY29uY2Vybi4gQW5kIHNvLCB3ZSBjYW4gY29uY2x1ZGUgdGhhdCBldmVyeXRoaW5nIGlzIGFscmlnaHQgd2l0aCB3aXRoIG91ciBiaW5hcnkgcHJlZGljdG9yIHZhcmlhYmxlIG9mIE5ld1ByZWNpcCwgYW5kIHRoYXQgd2UgY2FuIGNvbnRpbnVlIHdpdGggdGhlIG1vZGVsIGJ1aWxkaW5nIHByb2Nlc3MuDQoNCk5vdywgd2UgaGF2ZSBjaGVja2VkIHRoZSBkaXN0cmlidXRpb25zIG9mIGFsbCB0aHJlZSBvZiBvdXIgcHJlZGljdG9yIHZhcmlhYmxlcywgRGF5LCBBdmdUZW1wLCBhbmQgTmV3UHJlY2lwLCBhbmQgZW5zdXJlZCB0aGF0IHRoZXJlIGFyZSBub3QgYW55IGFwcGFyZW50IGlzc3VlcyB3aXRoIGFueSBvZiB0aGVzZSB2YXJpYWJsZXMgb3IgdGhlaXIgZGlzdHJpYnV0aW9ucy4gU28sIHdlIGNhbiBjb250aW51ZSB3aXRoIHVzaW5nIHRoZXNlIHByZWRpY3RvciB2YXJpYWJsZXMgaW4gb3VyIG1vZGVsIGJ1aWxkaW5nIHByb2Nlc3MuDQoNCg0KIyMgQXN1bXB0aW9ucyBhbmQgQ29uZGl0aW9ucw0KDQpCZWZvcmUgd2UgYmVnaW4gd2l0aCBidWlsZGluZyBvdXIgbW9kZWwsIHdlIG11c3QgY2hlY2sgdGhlIGFzc3VtcHRpb25zIGFuZCBjb25kaXRpb25zIHdoaWNoIGFyZSByZXF1aXJlZCBmb3IgYSBQb2lzc29uIHJlZ3Jlc3Npb24gbW9kZWwuDQoNClRoZXJlIGFyZSBmb3VyIGFzc3VtcHRpb25zIHdoaWNoIG11c3QgYmUgbWV0IGluIG9yZGVyIHRvIGNyZWF0ZSBhIFBvaXNzb24gcmVncmVzc2lvbiBtb2RlbC4gVGhlc2UgYXNzdW1wdGlvbnMgaW5jbHVkZToNCg0KMS4gVGhlIHJlc3BvbnNlIHZhcmlhYmxlIGlzIGEgY291bnQgZGVzY3JpYmVkIGJ5IGEgUG9pc3NvbiBkaXN0cmlidXRpb24uDQoNCjIuIE9ic2VydmF0aW9ucyBhcmUgaW5kZXBlbmRlbnQgb2Ygb25lIGFub3RoZXIuDQoNCjMuIFRoZSBtZWFuIG9mIHRoZSBQb2lzc29uIHJhbmRvbSB2YXJpYWJsZSBpcyBlcXVhbCB0byB0aGUgdmFyaWFuY2Ugb2Ygc2FpZCBQb2lzc29uIHJhbmRvbSB2YXJpYWJsZS4NCg0KNC4gVGhlIGxvZyBvZiB0aGUgbWVhbiByYXRlLCBsb2cgKM67KSwgbXVzdCBiZSBhIGxpbmVhciBmdW5jdGlvbiBvZiB4Lg0KDQoNCldlIHdpbGwgY2hlY2sgd2hldGhlciBhbGwgb2YgdGhlc2UgZm91ciBjb25kaXRpb25zIGhhdmUgYmVlbiBzdWNjZXNzZnVsbHkgbWV0IGJ5IG91ciBjeWNsaW5nIGRhdGEgc2V0IGJlZm9yZSBiZWdpbm5pbmcgd2l0aCB0aGUgbW9kZWwgYnVpbGRpbmcgcHJvY2VzcyBmb3Igb3VyIFBvaXNzb24gcmVncmVzc2lvbiBtb2RlbC4NCg0KV2Ugd2lsbCBnbyB0aHJvdWdoIGFuZCBjaGVjayBhbGwgZm91ciBvZiB0aGUgbmVjZXNzYXJ5IGNvbmRpdGlvbnMgcmVxdWlyZWQgZm9yIGEgUG9pc3NvbiBSZWdyZXNzaW9uIE1vZGVsLg0KDQoNCiMjIyBDb25kaXRpb24gMTogVGhlIHJlc3BvbnNlIHZhcmlhYmxlIGlzIGEgY291bnQgZGVzY3JpYmVkIGJ5IGEgUG9pc3NvbiBkaXN0cmlidXRpb24uDQoNClRoZSByZXNwb25zZSB2YXJpYWJsZSBpbiB0aGlzIGRhdGEgc2V0IHdhcyBzdGF0ZWQgdG8gYmUgdGhlIFdpbGxpYW1zYnVyZ0JyaWRnZSB2YXJpYWJsZSwgcmVwcmVzZW50aW5nIHRoZSB0b3RhbCBudW1iZXIgb2YgY3ljbGlzdHMgb24gdGhlIFdpbGxpYW1zYnVyZyBCcmlkZ2Ugb24gYSBnaXZlbiBvYnNlcnZhdGlvbi4gVGhpcyB2YXJpYWJsZSBpcyBkZXNjcmliZWQgYXMgYSBjb3VudCwgcmVwcmVzZW50aW5nIHRoZSBudW1iZXIgb2YgY3ljbGlzdHMgb24gYSBnaXZlbiBvYnNlcnZhdGlvbi4gVGhpcyBmaXRzIHRoZSBjcml0ZXJpYSBmb3IgdGhpcyBhc3N1bXB0aW9uLCBiZWNhdXNlIHdlIGNhbiBjb25jbHVkZSB0aGF0IHdlIGhhdmUgYSByZXNwb25zZSB2YXJpYWJsZSB0aGF0IGlzIGEgY291bnQuDQoNCg0KIyMjIENvbmRpdGlvbiAyOiBPYnNlcnZhdGlvbnMgYXJlIGluZGVwZW5kZW50IG9mIG9uZSBhbm90aGVyLg0KDQpFYWNoIG9ic2VydmF0aW9uIHdhcyBjb2xsZWN0ZWQgb24gYSBnaXZlbiBkYXRlLCBhbmQgd2UgY2FuIHNhZmVseSBhc3N1bWUgdGhhdCB0aGUgY29uZGl0aW9ucyBvZiBvbmUgZGF5IGRpZCBub3QgYWZmZWN0IHRoZSBjb25kaXRpb25zIG9mIGFub3RoZXIgZGF5LiBUaGUgbnVtYmVyIG9mIGN5Y2xpc3RzIG9uIHRoZSBXaWxsaWFtc2J1cmcgQnJpZGdlIGZvciBhIGdpdmVuIG9ic2VydmF0aW9uIGlzIGluZGVwZW5kZW50IG9uIHRoaXMgbnVtYmVyIG9mIGEgZGlmZmVyZW50IG9ic2VydmF0aW9uLiBTbywgd2UgY2FuIHNhZmVseSBjb25jbHVkZSB0aGF0IHRoYXQgb2JzZXJ2YXRpb25zIGFyZSBhbGwgaW5kZXBlbmRlbnQgYW5kIHNlcGFyYXRlIGZyb20gb25lIGFub3RoZXIuIA0KDQoNCiMjIyBDb25kaXRpb24gMzogVGhlIG1lYW4gb2YgdGhlIFBvaXNzb24gcmFuZG9tIHZhcmlhYmxlIGlzIGVxdWFsIHRvIHRoZSB2YXJpYW5jZSBvZiBzYWlkIFBvaXNzb24gcmFuZG9tIHZhcmlhYmxlLg0KDQpJbiBvcmRlciBmb3IgYSB2YXJpYWJsZSB0byBiZSBhIFBvaXNzb24gcmFuZG9tIHZhcmlhYmxlLCBpdHMgbWVhbiBtdXN0IGJlIGVxdWFsIHRvIGl0cyB2YXJpYW5jZS4gV2UgcHJldmlvdXNseSBzdGF0ZWQgdGhhdCB0aGUgV2lsbGlhbXNidXJnQnJpZGdlIHZhcmlhYmxlIHdpbGwgYmUgb3VyIHJlc3BvbnNlIHZhcmlhYmxlLiBUaGVyZWZvcmUsIHdlIG11c3QgY2hlY2sgdGhhdCB0aGlzIHZhcmlhYmxlIG1lZXRzIHRoZSBjcml0ZXJpYSBmb3IgYSBQb2lzc29uIHJhbmRvbSB2YXJpYWJsZSwgaGF2aW5nIGEgbWVhbiB3aGljaCBpcyBlcXVhbCB0byBpdHMgdmFyaWFuY2UuDQoNCmBgYHtyfQ0KIyBGaW5kaW5nIHRoZSBtZWFuLg0KbWVhbiA8LSBtZWFuKGN5Y2xpbmckV2lsbGlhbXNidXJnQnJpZGdlKQ0KcHJpbnQobWVhbikNCmBgYA0KDQpUaGUgbWVhbiBvZiB0aGUgV2lsbGlhbXNidXJnQnJpZGdlIHZhcmlhYmxlIGlzIDQsOTQyLjI2Ny4gVGhpcyByZXByZXNlbnRzIHRoZSBtZWFuIG51bWJlciBvZiBpbmRpdmlkdWFscyBvbiB0aGUgV2lsbGlhbXNidXJnIEJyaWRnZSBvbiBhIGdpdmVuIG9ic2VydmF0aW9uLiBUaGlzIG1lYW5zIHRoYXQgdGhlIG1lYW4gbnVtYmVyIG9mIGluZGl2aWR1YWxzIG9uIHRoZSBXaWxsaWFtc2J1cmcgQnJpZGdlIG9uIGFueSBnaXZlbiBkYXRlIGlzIGFyb3VuZCA0LDk0MyBwZW9wbGUuIFdlIHJvdW5kIHRoaXMgdmFsdWUgdXAgYmVjYXVzZSB0aGUgbnVtYmVyIG9mIGluZGl2aWR1YWxzIGlzIGEgd2hvbGUgbnVtYmVyIGFuZCBzbyB0aGUgZGVjaW1hbCBtdXN0IGJlIHJvdW5kZWQgdXAgdG8gdGhlIG5leHQgd2hvbGUgbnVtYmVyIHRvIHJlcHJlc2VudCB0aGF0IHBhcnQgYXMgYW4gaW5kaXZpZHVhbC4gDQoNCk5leHQsIGxldCdzIGZpbmQgdGhlIHZhcmlhbmNlIG9mIG91ciByZXNwb25zZSB2YXJpYWJsZS4NCg0KYGBge3J9DQojIEZpbmRpbmcgdGhlIHZhcmlhbmNlLg0KdmFyaWFuY2UgPC0gdmFyKGN5Y2xpbmckV2lsbGlhbXNidXJnQnJpZGdlKQ0KcHJpbnQodmFyaWFuY2UpDQpgYGANCg0KVGhlIHZhcmlhbmNlIG9mIHRoZSBXaWxsaWFtc2J1cmdCcmlkZ2UgdmFyaWFibGUgaXMgMywwMDUsNjY1LiBUaGlzIGRvZXMgbm90IG1hdGNoIHVwIHdpdGggdGhlIHZhbHVlIG9mIHRoZSBtZWFuLCBhbmQgaW5kaWNhdGVzIGEgdmlvbGF0aW9uIG9mIG9uZSB0aGUgbmVjY2Vzc2FyeSBjb25kaXRpb25zIGZvciBhIFBvaXNzb24gcmVncmVzc2lvbiBtb2RlbC4gVGhpcyBpbXBsaWVzIHRoYXQgb3VyIHJlc3BvbnNlIHZhcmlhYmxlIGlzIGluIGZhY3Qgbm90IGEgUG9pc3NvbiByYW5kb20gdmFyaWFibGUgYmVjYXVzZSB0aGUgdmFsdWUgb2YgaXRzIG1lYW4gaXMgbm90IGVxdWl2YWxlbnQgdG8gdGhlIHZhbHVlIG9mIGl0cyB2YXJpYW5jZS4gDQoNCg0KIyMjIENvbmRpdGlvbiA0OiBUaGUgbG9nIG9mIHRoZSBtZWFuIHJhdGUsIGxvZyAozrspLCBtdXN0IGJlIGEgbGluZWFyIGZ1bmN0aW9uIG9mIHguDQoNCldlIHdpbGwgdGFrZSBhIGxvb2sgYXQgdGhlIHBsb3Qgb2YgdGhlIG1lYW4gcmF0ZSBhZ2FpbnN0IHRoZSBwcmVkaWN0b3IgdmFyaWFibGVzIHRvIGNoZWNrIHRoaXMgY29uZGl0aW9uLiANCg0KU2luY2Ugb3VyIGZpcnN0IHByZWRpY3RvciB2YXJpYWJsZSBpcyBEYXksIGFuZCB0aGlzIGEgY2F0ZWdvcmljYWwsIGNoYXJhY3RlciB2YXJpYWJsZSwgaXQgd291bGQgbm90IGNyZWF0ZSBhIGxpbmVhciBmdW5jdGlvbiBiZWNhdXNlIGl0IGlzIG1hZGUgdXAgb2YgY2F0ZWdvcmljYWwgaW5wdXRzLiBTbywgaW5zdGVhZCwgd2Ugd2lsbCBsb29rIGF0IHRoZSBudW1lcmljYWwgcHJlZGljdG9yIHZhcmlhYmxlIGluc3RlYWQgdG8gY2hlY2sgdGhpcyBjb25kaXRpb24uDQoNCkxldCdzIGxvb2sgYXQgdGhlIHByZWRpY3RvciB2YXJpYWJsZSBvZiBhdmVyYWdlIHRlbXBlcmF0dXJlIHZzIG91ciByZXNwb25zZSB2YXJpYWJsZSBvZiBXaWxsaWFtc2J1cmdCcmlkZ2UuIEF2Z1RlbXAgaXMgYSBxdWFudGl0YXRpdmUsIG51bWVyaWMgdmFyaWFibGUgc28gd2UgY2FuIHVzZSBpdCB0byBjaGVjayB0aGlzIGNvbmRpdGlvbi4NCg0KYGBge3J9DQpwbG90KGN5Y2xpbmckQXZnVGVtcCwgY3ljbGluZyRXaWxsaWFtc2J1cmdCcmlkZ2UsIG1haW4gPSAiQXZnVGVtcCB2cy4gV2lsbGlhbXNidXJnIEJyaWRnZSIsIHhsYWIgPSAiQXZnVGVtcCIsIHlsYWIgPSAiV2lsbGlhbXNidXJnQnJpZGdlIikNCmBgYA0KDQpUaGUgc2NhdHRlcnBsb3Qgb2YgdGhlIHR3byB2YXJpYWJsZXMgb2YgQXZnVGVtcCBhbmQgV2lsbGlhbXNidXJnQnJpZGdlIHNob3dzIHdoYXQgZG9lcyBhcHBlYXIgdG8gYmUgYSBsaW5lYXIgcmVsYXRpb25zaGlwIG9mIHRoZXNlIHR3byB2YXJpYWJsZXMuIFdlIGNhbiBzZWUgYSBwb3NpdGl2ZSByZWxhdGlvbnNoaXAgYmV0d2VlbiB0aGUgdHdvIHZhcmlhYmxlcywgYXMgYXZlcmFnZSB0ZW1wZXJhdHVyZSBpbmNyZWFzZXMsIHNvIGRvZXMgdGhlIG51bWJlciBvZiBjeWNsaXN0cyBvbiB0aGUgV2lsbGlhbXNidXJnIEJyaWRnZS4gVGhpcyBzZWVtcyBsb2dpY2FsIGFzIGl0IG1ha2VzIHNlbnNlIHRoYXQgbW9yZSBwZW9wbGUgd291bGQgd2FudCB0byBnbyBvdXRzaWRlIGFuZCBnbyBjeWNsaW5nIG9uIGEgZGF5IHRoYXQgaXMgd2FybWVyIG91dHNpZGUgcmF0aGVyIHRoYW4gYSBkYXkgdGhhdCBpcyBjb2xkZXIgb3V0c2lkZS4gVGhlIHJlbGF0aW9uc2hpcCBvZiB0aGUgdHdvIHZhcmlhYmxlcyBkb2VzIGFwcGVhciB0byBoYXZlIGEgbW9kZXJhdGUgc3RyZW5ndGgsIGJ1dCB0aGUgbGluZWFyIHBhdHRlcm4gY2FuIGRlZmluaXRlbHkgYmUgc2Vlbi4gU28sIGl0IGRvZXMgYXBwZWFyIHRoYXQgV2lsbGlhbXNidXJnQnJpZGdlIGlzIGEgbGluZWFyIGZ1bmN0aW9uIG9mIEF2Z1RlbXAsIHdoaWNoIHZlcmlmaWVzIHRoaXMgbmVjZXNzYXJ5IGNvbmRpdGlvbiBmb3IgYSBQb2lzc29uIHJlZ3Jlc3Npb24gbW9kZWwuDQoNCg0KTGFzdGx5LCB3ZSBoYXZlIG91ciBwcmVkaWN0b3IgdmFyaWFibGUgb2YgTmV3UHJlY2lwLiBUaGlzIGlzIGEgYmluYXJ5IHByZWRpY3RvciB2YXJpYWJsZSwgc28gd2Ugd2lsbCBvbmx5IHNlZSBwb2ludHMgYXQgeCA9IDAgYW5kIHggPSAxIGlmIHdlIHdlcmUgdG8gY3JlYXRlIGEgc2NhdHRlcnBsb3Qgb2YgdGhpcyBiaW5hcnkgcHJlZGljdG9yIHZhcmlhYmxlIG9mIE5ld1ByZWNpcC4gU28sIHdlIGNhbiBub3QgZXhwZWN0IHRvIHNlZSBhIGxpbmVhciByZWxhdGlvbnNoaXAgYmV0d2VlbiBOZXdQcmVjaXAgYW5kIFdpbGxpYW1zYnVyZ0JyaWRnZSwgYmVjYXVzZSBOZXdQcmVjaXAgY2FuIG9ubHkgaGF2ZSB2YWx1ZXMgb2YgMCBhbmQgMSwgbm90IGFueXRoaW5nIGluIGJldHdlZW4gZHVlIHRvIGl0IGJlaW5nIGEgYmluYXJ5IHByZWRpY3RvciB2YXJpYWJsZS4NCg0KT3ZlcmFsbCwgd2UgY2FuIGNvbnNpZGVyIHRoaXMgY29uZGl0aW9uIHNhdGlzZmllZCBzaW5jZSBvdXIgbnVtZXJpY2FsIHByZWRpY3RvciB2YXJpYWJsZSBvZiBBdmdUZW1wIHNob3dlZCB0aGF0IGl0IGRvZXMgaW5kZWVkIGhhdmUgYSBsaW5lYXIgcmVsYXRpb25zaGlwIHdpdGggb3VyIHJlc3BvbnNlIHZhcmlhYmxlLiANCg0KDQoNCiMjIyBTdW1tYXJ5IG9mIFZpb2xhdGlvbnMNCg0KT3ZlcmFsbCwgaXQgc2VlbXMgdGhhdCB3ZSBkbyBoYXZlIG9uZSBub3RhYmxlIHZpb2xhdGlvbiBvZiB0aGUgY29uZGl0aW9ucyBvZiBhIFBvaXNzb24gcmVncmVzc2lvbiBtb2RlbCB3aXRoaW4gb3VyIGRhdGEgc2V0LiBXZSBmb3VuZCB0aGF0IHRoZSByZXNwb25zZSB2YXJpYWJsZSwgV2lsbGlhbXNidXJnQnJpZGdlLCBkb2VzIG5vdCBtZWV0IHRoZSBuZWNlc3NhcnkgY3JpdGVyaWEgb2YgYSBQb2lzc29uIHJhbmRvbSB2YXJpYWJsZSwgYmVjYXVzZSBpdHMgbWVhbiBpcyBub3QgZXF1YWwgdG8gaXRzIHZhcmlhbmNlLiBUaGlzIGlzIGEgbWFqb3IgY29uY2VybiwgYmVjYXVzZSBpdCBwb2ludHMgdG8gYSBtYWpvciB2aW9sYXRpb24gb2YgdGhlIGNvbmRpdGlvbnMgcmVxdWlyZWQgZm9yIGEgUG9pc3NvbiByZWdyZXNzaW9uIG1vZGVsLiANCg0KVGhpcyB2aW9sYXRpb24gb2YgdGhlIGNvbmRpdGlvbnMgZm9yIGEgUG9pc3NvbiByZWdyZXNzaW9uIG1vZGVsIHN1Z2dlc3RzIGEgbWFqb3IgY29uY2VybiB3aXRoIG91ciBkYXRhIHNldCwgYXMgaXQgZmFpbHMgdG8gbWVldCBhIG1ham9yIGNvbmRpdGlvbiB3aGljaCBpcyByZXF1aXJlZCBmb3IgYSBQb2lzc29uIHJlZ3Jlc3Npb24gbW9kZWwuIFRoaXMgc3VnZ2VzdCB0aGF0IHBlcmhhcHMgYSBQb2lzc29uIHJlZ3Jlc3Npb24gbW9kZWwgbWF5IG5vdCBiZSB0aGUgYmVzdCBtb2RlbCBjaG9pY2UgZm9yIHRoaXMgZGF0YSBzZXQgYWZ0ZXIgYWxsLiAgDQoNCldlIHdpbGwgc3RpbGwgY29udGludWUgd2l0aCBidWlsZGluZyB0aGUgUG9pc3NvbiByZWdyZXNzaW9uIG1vZGVscyBmb3IgdGhpcyBwcm9qZWN0LCBidXQgaXQgaXMgaW1wb3J0YW50IHRvIGtlZXAgaW4gbWluZCB0aGF0IHRoaXMgdmlvbGF0aW9uIG1heSBtZWFuIHRoYXQgdGhlIFBvaXNzb24gcmVncmVzc2lvbiBtb2RlbCBpcyBub3QgdGhlIGJlc3QgbW9kZWwgY2hvaWNlIGZvciB0aGlzIGRhdGEgc2V0IGR1ZSB0byB0aGUgbmVjZXNzYXJ5IGNvbmRpdGlvbiBvZiB0aGUgbWVhbiBvZiB0aGUgcmVzcG9uc2UgdmFyaWFibGUgZXF1YWxpbmcgdGhlIHZhcmlhbmNlIG9mIHRoZSByZXNwb25zZSB2YXJpYWJsZSBoYXZpbmcgYmVlbiBmYWlsZWQgdG8gaGF2ZSBiZWVuIG1ldC4gDQoNCg0KDQoNCiMgUG9pc3NvbiBSZWdyZXNzaW9uIE1vZGVscyBvbiB0aGUgT3JpZ2luYWwgVmFyaWFibGVzDQoNCkZpcnN0LCB3ZSB3aWxsIGxvb2sgYXQgdGhlIFBvaXNzb24gcmVncmVzc2lvbiBtb2RlbHMgd2hpY2ggd2VyZSBjcmVhdGVkIGluIHRoZSBwcmV2aW91cyB3ZWVrJ3MgYXNzaWdubWVudCBhbmQgbG9vayBhdCB0aGUgY29ycmVjdGVkIHZlcnNpb25zIG9mIHRoZXNlIG1vZGVscy4gV2Ugd2lsbCB1c2UgdGhlIG9yaWdpbmFsIHByZWRpY3RvciB2YXJpYWJsZXMgZmlyc3QsIGFuZCB0aGVuIGluIGxhdGVyIHN0ZXBzIG9mIHRoaXMgcHJvamVjdCB3ZSB3aWxsIHVzZSB0aGUgbmV3IHByZWRpY3RvciB2YXJpYWJsZXMgb2YgQXZnVGVtcCBhbmQgTmV3UHJlY2lwLg0KDQpJbiB0aGUgcHJldmlvdXMgd2VlaydzIGFzc2lnbm1lbnQsIHdlIGNyZWF0ZWQgdHdvIFBvaXNzb24gcmVncmVzc2lvbiBtb2RlbHMsIG9uZSBvbiBmcmVxdWVuY3kgY291bnRzIGFuZCBvbmUgb2YgdGhlIHJhdGVzLiBXZSB3aWxsIGNyZWF0ZSB0aGVzZSBhZ2FpbiB0byBzZWUgdGhlIHByb3BlciwgY29ycmVjdGVkIG1vZGVscy4gU2luY2UgaW4gdGhlIHByZXZpb3VzIHdlZWsncyBhc3NpbmdtZW50LCB3ZSBkaWQgbm90IGFsdGVyIGFueSBvZiB0aGUgcHJlZGljdG9yIHZhcmlhYmxlcyBmb3IgdGhlc2UgdHdvIG1vZGVscywgd2Ugd2lsbCB1c2UgdGhlIG9yaWdpbmFsIHZhcmlhYmxlcyBmb3Igbm93IGFuZCB0aGVuIGNyZWF0ZSBtb2RlbHMgdXNpbmcgdGhlIG5ldyBwcmVkaWN0b3IgdmFyaWFibGVzIG9mIEF2Z1RlbXAgYW5kIE5ld1ByZWNpcC4NCg0KRm9yIG5vdywgd2Ugd2lsbCB1c2UgdGhlIG9sZCBwcmVkaWN0b3IgdmFyaWFibGVzIG9mIERheSwgSGlnaFRlbXAsIExvd1RlbXAsIGFuZCBQcmVjaXBpdGF0aW9uLiBUaGVzZSB3ZXJlIHRoZSBwcmVkaWN0b3IgdmFyaWFibGVzIHVzZWQgaW4gdGhlIHByZXZpb3VzIHdlZWsncyBhc3NpZ25tZW50LCBzbyB3ZSB3aWxsIGZpcnN0IGJlZ2luIGJ5IGNvcnJlY3RpbmcgdGhlIG1vZGVscyB3aGljaCB3ZXJlIGNyZWF0ZWQgaW4gdGhhdCBhc3NpZ25tZW50IGJlZm9yZSB3ZSBiZWVuIGNyZWF0aW5nIHRoZSBuZXcgbW9kZWxzIGZvciB0aGlzIHByb2plY3QuDQoNCiMjIFBvaXNzb24gUmVncmVzc2lvbiBNb2RlbCBvbiBGcmVxdWVuY3kgQ291bnRzIA0KDQpXZSB3aWxsIGJlZ2luIHdpdGggY3JlYXRpbmcgYSBQb2lzc29uIHJlZ3Jlc3Npb24gbW9kZWwgb2YgdGhlIGZyZXF1ZW5jeSBjb3VudHMuIFRoaXMgbW9kZWwgd2lsbCBiZSBvbiB0aGUgZnJlcXVlbmN5IGNvdW50cyBvZiBpbmRpdmlkdWFscyBvbiB0aGUgV2lsbGlhbXNidXJnIEJyaWRnZSBmb3IgYSBnaXZlbiBvYnNlcnZhdGlvbnMuIE91ciBnb2FsIGlzIHRvIGNyZWF0ZSBhIFBvaXNzb24gcmVncmVzc2lvbiBtb2RlbCB3aGljaCBjYW4gc3RhdGlzdGljYWxseSBzaWduaWZpY2FudGx5IHByZWRpY3QgdGhlIGNvdW50IG9mIHRoZSBudW1iZXIgb2YgaW5kaXZpZHVhbHMgb24gdGhlIFdpbGxpYW1zYnVyZyBCcmlkZ2UgZm9yIGEgZ2l2ZW4gb2JzZXJ2YXRpb24sIGJhc2VkIHVwb24gdGhlIHZhcmlvdXMgZmFjdG9ycyBpbiB0aGlzIGRhdGEgc2V0LiANCg0KV2Ugd2lsbCBjcmVhdGUgb3VyIFBvaXNzb24gcmVncmVzc2lvbiBtb2RlbCBvbiB0aGUgZnJlcXVlbmN5IGNvdW50cy4NCg0KYGBge3J9DQojIFBvaXNzb24gUmVncmVzc2lvbiBNb2RlbCBvZiBDb3VudHMNCm1vZGVsLmNvdW50cyA8LSBnbG0oV2lsbGlhbXNidXJnQnJpZGdlIH4gRGF5ICsgSGlnaFRlbXAgKyBMb3dUZW1wICsgUHJlY2lwaXRhdGlvbiwgZmFtaWx5ID0gcG9pc3NvbihsaW5rID0gImxvZyIpLCBkYXRhID0gY3ljbGluZykNCnBvaXMuY291bnQuY29lZiA9IHN1bW1hcnkobW9kZWwuY291bnRzKSRjb2VmDQprYWJsZShwb2lzLmNvdW50LmNvZWYsIGNhcHRpb24gPSAiUG9pc3NvbiBSZWdyZXNzaW9uIE1vZGVsIGZvciB0aGUgQ291bnRzIG9mIEN5Y2xpc3RzIFxuIG9uIHRoZSBXaWxsaWFtc2J1cmcgQnJpZGdlIikNCmBgYA0KDQpUaGUgcmVncmVzc2lvbiBlcXVhdGlvbiBmb3IgdGhlIFBvaXNzb24gcmVncmVzc2lvbiBtb2RlbCBvbiB0aGUgZnJlcXVlbmN5IGNvdW50cyBpcyBnaXZlbiBhczoNCg0KbG9nKM68KSA9IDcuNjUzOCArIDAuMDU0NiAqIERheU1vbmRheSAtIDAuMjc0NCAqIERheVNhdHVyZGF5IC0gMC4yMzQ2ICogRGF5U3VuZGF5ICsgMC4wMzE5ICogRGF5VGh1cnNkYXkgKyAwLjE5ODggKiBEYXlUdWVzZGF5ICsgMC4wNTExICogRGF5V2VkbmVzZGF5ICsgMC4wMTcxICogSGlnaFRlbXAgLSAwLjAwMjQgKiBMb3dUZW1wIC0gMS4wMzIxICogUHJlY2lwaXRhdGlvbg0KDQoNCkFsbCBvZiB0aGUgcHJlZGljdG9yIHZhcmlhYmxlcywgRGF5TW9uZGF5LCBEYXlTYXR1cmRheSwgRGF5U3VuZGF5LCBEYXlUaHVyc2RheSwgRGF5VHVlc2RheSwgRGF5V2VkbmVzZGF5LCBIaWdoVGVtcCwgTG93VGVtcCwgYW5kIFByZWNpcGl0YXRpb24sIGFsbCBoYXZlIHAtdmFsdWVzIG9mIHAgPCAuMDAxLiBUaGlzIGluZGljYXRlcyB0aGF0IGFsbCBvZiB0aGUgcHJlZGljdG9yIGluIG91ciBtb2RlbCB2YXJpYWJsZXMgYXJlIHN0YXRpc3RpY2FsbHkgc2lnbmlmaWNhbnQgaW4gcHJlZGljdGluZyB0aGUgdG90YWwgZXhwZWN0ZWQgY291bnRzIG9mIGN5Y2xpc3RzIG9uIHRoZSBXaWxsaWFtc2J1cmcgQnJpZGdlIG9uIGEgZ2l2ZW4gZGF5LiANCg0KVGhlIHNpZ25pZmljYW5jZSBvZiB0aGVzZSB2YXJpYWJsZXMgaW4gcmVnYXJkcyB0byBwcmVkaWN0aW5nIHRoZSBleHBlY3RlZCBjb3VudHMgY2FuIGxpa2VseSBiZSBhdHRyaWJ1dGVkIHRvIHBvdGVudGlhbCBhZHZlcnNlIHdlYXRoZXIgY29uZGl0aW9ucywgc3VjaCBhcyBleGNlc3NpdmUgaGVhdCBvciBjb2xkLCBhbG9uZyB3aXRoIGludGVuc2UgcHJlY2lwaXRhdGlvbiBhbmQgc3Rvcm1zIG1ha2luZyBjeWNsaW5nIG5vbiBpZGVhbCBvbiB0aG9zZSBkYXlzIHdpdGggcG9vciBjb25kaXRpb25zIGZvciBvdXRkb29ycyBhY3Rpdml0aWVzIHN1Y2ggYXMgY3ljbGluZy4gVGhlc2UgcHJlZGljdG9yIHZhcmlhYmxlcyBhbGwgYmVpbmcgc3RhdGlzdGljYWxseSBzaWduaWZpY2FudCBzaG93cyB0aGF0IHRoZSB3ZWF0aGVyIGFuZCB0ZW1wZXJhdHVyZSBjb25kaXRpb25zIGRvIHN1Z2dlc3QgYSBkaXNjcmVwYW5jeSBpbiB0aGUgbnVtYmVyIG9mIGN5Y2xpc3RzIG9uIHRoZSBXaWxsaWFtc2J1cmcgQnJpZGdlIGZyb20gZGF5IHRvIGRheSBkdWUgdG8gdGhlc2UgY2hhbmdlcyBpbiB0ZW1wZXJhdHVyZSBhbmQgcHJlY2lwaXRhdGlvbi4gDQoNCk92ZXJhbGwsIHRoaXMgUG9pc3NvbiBtb2RlbCBvZiB0aGUgZnJlcXVlbmN5IGNvdW50cyBvZiB0aGUgY3ljbGlzdHMgb24gdGhlIFdpbGxpYW1zYnVyZyBCcmlkZ2Ugc2hvd2VkIHN0YXRpc3RpY2FsIHNpZ25pZmljYW5jZSBpbiBpdHMgcHJlZGljdGlvbiBvZiB0aGUgZXhwZWN0ZWQgbG9nIGNvdW50cyBmb3IgdGhlIG51bWJlciBvZiBjeWNsaXN0cyBvbiB0aGUgV2lsbGlhbXNidXJnIEJyaWRnZSBmb3IgYSBnaXZlbiBvYnNlcnZhdGlvbi4NCg0KRm9yIG91ciBjYXRlZ29yaWNhbCBwcmVkaWN0b3IgdmFyaWFibGUgb2YgRGF5LCBGcmlkYXkgd2FzIGNob3NlbiBhcyB0aGUgYmFzZSBsaW5lIGxldmVsLCB3aGljaCBjYW4gYmUgc2VlbiBieSBob3cgdGhlcmUgaXMgbm90IGEgIkRheUZyaWRheSIgdmFyaWFibGUgaW4gdGhlIHJlZ3Jlc3Npb24gZXF1YXRpb24gb3V0cHV0LiBUaGlzIGlzIGJlY2F1c2Ugb2YgdGhlIHNldmVuIGRheXMsIEZyaWRheSBpcyB0aGUgb25lIHdoaWNoIGNvbWVzIGZpcnN0IGFscGhhYmV0aWNhbGx5IGFuZCBSIGNob29zZXMgdGhlIGxldmVsIHdoaWNoIGNvbWVzIGZpcnN0IGFscGhhYmV0aWNhbGx5IGFzIHRoZSBiYXNlIGxpbmUgbGV2ZWwuIFRoZXJlZm9yZSwgZm9yIG91ciByZWdyZXNzaW9uIGNvZWZmaWNpZW50IGludGVycHJldGF0aW9ucyBmb3IgdGhlIGRpZmZlcmVudCBsZXZlbHMgb2YgdGhlIERheSB2YXJpYWJsZSwgdGhlc2UgdmFsdWVzIHdpbGwgYmUgY29tcGFyZWQgYWdhaW5zdCB0aGUgYmFzZSBsaW5lIGxldmVsIG9mIEZyaWRheS4NCg0KDQojIyMgUmVncmVzc2lvbiBDb2VmZmljaWVudHMgSW50ZXJwcmV0YXRpb24NCg0KV2Ugd2lsbCBhbmFseXNpcyB0aGUgcmVncmVzc2lvbiBjb2VmZmljaWVudHMgZm9yIHRoZSB2YXJpYWJsZXMgaW4gdGhpcyBQb2lzc29uIHJlZ3Jlc3Npb24gbW9kZWwgb24gZnJlcXVlbmN5IGNvdW50cy4NCg0KKiBUaGUgdmFsdWUgb2YgdGhlIHktaW50ZXJjZXB0IGlzIGdpdmVuIGFzIDcuNjUzNi4gVGhpcyByZXByZXNlbnRzIHRoZSBiYXNlbGluZSBvZiB0aGUgbWVhbiBvZiBsb2cozrwpIHdoZW4gYWxsIHByZWRpY3RvciB2YXJpYWJsZXMgYXJlIGVxdWFsIHRvIDAuIEhvd2V2ZXIsIHRoZSB5LWludGVyY2VwdCBkb2VzIG5vdCBoYXZlIGEgcHJhY3RpY2FsIGludGVycHJldGF0aW9uIG9yIG1lYW5pbmcgaW4gdGhpcyBzY2VuYXJpbyBzbyB3ZSBhcmUgbm90IGludGVyZXN0ZWQgaW4gaXRzIG1lYW5pbmcgZm9yIHRoZSBQb2lzc29uIHJlZ3Jlc3Npb24gbW9kZWwuDQoNCiogRGF5TW9uZGF5IChwIDwgLjAwMSk6IFRoZSByZWdyZXNzaW9uIGNvZWZmaWNpZW50IGZvciB0aGUgdmFyaWFibGUgRGF5TW9uZGF5IHdhcyBmb3VuZCB0byBiZSAwLjA1NDYuIFRoaXMgbWVhbnMgdGhhdCB0aGUgbWVhbiBsb2cgY291bnQgb2YgY3ljbGlzdHMgb24gdGhlIFdpbGxpYW1zYnVyZ3MgQnJpZGdlIHdhcyAwLjA1NDYgZ3JlYXRlciBvbiBNb25kYXkgdGhhbiBvbiBGcmlkYXkuIFdlIGNhbiBhbHNvIHNheSB0aGlzIG1lYW5zIHRoYXQgdGhlIGNvdW50IG9mIGN5Y2xpc3RzIGlzIDEuMDU2MSB0aW1lcyBncmVhdGVyIG9uIE1vbmRheSB0aGFuIG9uIEZyaWRheSwgaG9sZGluZyBhbGwgb3RoZXIgdmFyaWFibGVzIGNvbnN0YW50Lg0KDQoqIERheVNhdHVyZGF5IChwIDwgLjAwMSk6IFRoZSByZWdyZXNzaW9uIGNvZWZmaWNpZW50IGZvciB0aGUgdmFyaWFibGUgRGF5U2F0dXJkYXkgd2FzIGZvdW5kIHRvIGJlIC0wLjI3NDQuIFRoaXMgbWVhbnMgdGhhdCB0aGUgbWVhbiBsb2cgY291bnQgb2YgY3ljbGlzdHMgb24gdGhlIFdpbGxpYW1zYnVyZ3MgQnJpZGdlIHdhcyAwLjI3NDQgbGVzcyBvbiBTYXR1cmRheSB0aGFuIG9uIEZyaWRheS4gV2UgY2FuIGFsc28gc2F5IHRoaXMgbWVhbnMgdGhhdCB0aGUgY291bnQgb2YgY3ljbGlzdHMgaXMgMC43NjAwIHRpbWVzIGdyZWF0ZXIgb24gU2F0dXJkYXkgdGhhbiBvbiBGcmlkYXksIGhvbGRpbmcgYWxsIG90aGVyIHZhcmlhYmxlcyBjb25zdGFudC4NCg0KKiBEYXlTdW5kYXkgKHAgPCAuMDAxKTogVGhlIHJlZ3Jlc3Npb24gY29lZmZpY2llbnQgZm9yIHRoZSB2YXJpYWJsZSBEYXlTdW5kYXkgd2FzIGZvdW5kIHRvIGJlIC0wLjIzNDYuIFRoaXMgbWVhbnMgdGhhdCB0aGUgbWVhbiBsb2cgY291bnQgb2YgY3ljbGlzdHMgb24gdGhlIFdpbGxpYW1zYnVyZ3MgQnJpZGdlIHdhcyAwLjIzNDYgbGVzcyBvbiBTdW5kYXkgdGhhbiBvbiBGcmlkYXkuIFdlIGNhbiBhbHNvIHNheSB0aGlzIG1lYW5zIHRoYXQgdGhlIGNvdW50IG9mIGN5Y2xpc3RzIGlzIDAuNzkwOSB0aW1lcyBncmVhdGVyIG9uIFN1bmRheSB0aGFuIG9uIEZyaWRheSwgaG9sZGluZyBhbGwgb3RoZXIgdmFyaWFibGVzIGNvbnN0YW50Lg0KDQoqIERheVRodXJzZGF5IChwID0gMC4wMDE5KTogVGhlIHJlZ3Jlc3Npb24gY29lZmZpY2llbnQgZm9yIHRoZSB2YXJpYWJsZSBEYXlUaHVyc2RheSB3YXMgZm91bmQgdG8gYmUgMC4wMzE5LiBUaGlzIG1lYW5zIHRoYXQgdGhlIG1lYW4gbG9nIGNvdW50IG9mIGN5Y2xpc3RzIG9uIHRoZSBXaWxsaWFtc2J1cmdzIEJyaWRnZSB3YXMgMC4wMzE5IGdyZWF0ZXIgb24gVGh1cnNkYXkgdGhhbiBvbiBGcmlkYXkuIFdlIGNhbiBhbHNvIHNheSB0aGlzIG1lYW5zIHRoYXQgdGhlIGNvdW50IG9mIGN5Y2xpc3RzIGlzIDEuMDMyNCB0aW1lcyBncmVhdGVyIG9uIFRodXJzZGF5IHRoYW4gb24gRnJpZGF5LCBob2xkaW5nIGFsbCBvdGhlciB2YXJpYWJsZXMgY29uc3RhbnQuDQoNCiogRGF5VHVlc2RheSAocCA8IC4wMDEpOiBUaGUgcmVncmVzc2lvbiBjb2VmZmljaWVudCBmb3IgdGhlIHZhcmlhYmxlIERheVR1ZXNkYXkgd2FzIGZvdW5kIHRvIGJlIDAuMTk4OC4gVGhpcyBtZWFucyB0aGF0IHRoZSBtZWFuIGxvZyBjb3VudCBvZiBjeWNsaXN0cyBvbiB0aGUgV2lsbGlhbXNidXJncyBCcmlkZ2Ugd2FzIDAuMTk4OCBncmVhdGVyIG9uIFR1ZXNkYXkgdGhhbiBvbiBGcmlkYXkuIFdlIGNhbiBhbHNvIHNheSB0aGlzIG1lYW5zIHRoYXQgdGhlIGNvdW50IG9mIGN5Y2xpc3RzIGlzIDEuMjE5OSB0aW1lcyBncmVhdGVyIG9uIFR1ZXNkYXkgdGhhbiBvbiBGcmlkYXksIGhvbGRpbmcgYWxsIG90aGVyIHZhcmlhYmxlcyBjb25zdGFudC4NCg0KKiBEYXlXZWRuZXNkYXkgKHAgPC4wMDEpOiBUaGUgcmVncmVzc2lvbiBjb2VmZmljaWVudCBmb3IgdGhlIHZhcmlhYmxlIERheVdlZG5lc2RheSB3YXMgZm91bmQgdG8gYmUgMC4wNTExLiBUaGlzIG1lYW5zIHRoYXQgdGhlIG1lYW4gbG9nIGNvdW50IG9mIGN5Y2xpc3RzIG9uIHRoZSBXaWxsaWFtc2J1cmdzIEJyaWRnZSB3YXMgMC4wNTExIGdyZWF0ZXIgb24gV2VkbmVzZGF5IHRoYW4gb24gRnJpZGF5LiBXZSBjYW4gYWxzbyBzYXkgdGhpcyBtZWFucyB0aGF0IHRoZSBjb3VudCBvZiBjeWNsaXN0cyBpcyAxLjA1MjQgdGltZXMgZ3JlYXRlciBvbiBXZWRuZXNkYXkgdGhhbiBvbiBGcmlkYXksIGhvbGRpbmcgYWxsIG90aGVyIHZhcmlhYmxlcyBjb25zdGFudC4NCg0KKiBIaWdoVGVtcCAocCA8LjAwMSk6IFRoZSByZWdyZXNzaW9uIGNvZWZmaWNpZW50IG9mIHRoZSBIaWdoVGVtcCB2YXJpYWJsZSBpbiB0aGlzIG1vZGVsIGlzIDAuMDE3MS4gVGhpcyBtZWFucyB0aGF0IHRoZSBtZWFuIGxvZyBvZiB0aGUgY291bnRzIGluY3JlYXNlcyBieSAwLjAxNzEgdW5pdHMgZm9yIGV2ZXJ5IDEgZGVncmVlIEZhaHJlbmhlaXQgaW5jcmVhc2UgaW4gdGhlIGhpZ2ggdGVtcGVyYXR1cmUgZm9yIHRoZSBnaXZlbiBvYnNlcnZhdGlvbiwgaG9sZGluZyBhbGwgb3RoZXIgdmFyaWFibGVzIGNvbnN0YW50LiANCg0KKiBMb3dUZW1wIChwID0gMC4wMDIzKTogVGhlIHJlZ3Jlc3Npb24gY29lZmZpY2llbnQgb2YgdGhlIExvd1RlbXAgdmFyaWFibGUgaW4gdGhpcyBtb2RlbCBpcyAtMC4wMDI0LiBUaGlzIG1lYW5zIHRoYXQgdGhlIG1lYW4gbG9nIG9mIHRoZSBjb3VudHMgZGVjcmVhc2VzIGJ5IDAuMDAyNCB1bml0cyBmb3IgZXZlcnkgMSBkZWdyZWUgRmFocmVuaGVpdCBpbmNyZWFzZSBpbiB0aGUgbG93IHRlbXBlcmF0dXJlIGZvciB0aGUgZ2l2ZW4gb2JzZXJ2YXRpb24sIGhvbGRpbmcgYWxsIG90aGVyIHZhcmlhYmxlcyBjb25zdGFudC4gDQoNCiogUHJlY2lwaXRhdGlvbiAocCA8IC4wMDEpOiBUaGUgcmVncmVzc2lvbiBjb2VmZmljaWVudCBvZiB0aGUgUHJlY2lwaXRhdGlvbiB2YXJpYWJsZSBpbiB0aGlzIG1vZGVsIGlzIC0xLjAzMjEuIFRoaXMgbWVhbnMgdGhhdCB0aGUgbWVhbiBsb2cgb2YgdGhlIGNvdW50cyBkZWNyZWFzZXMgYnkgMS4wMzIxIHVuaXRzIGZvciBldmVyeSAxIGluY2ggaW5jcmVhc2UgaW4gdGhlIGFtb3VudCBvZiBwcmVjaXBpdGF0aW9uIGZvciB0aGUgZ2l2ZW4gb2JzZXJ2YXRpb24sIGhvbGRpbmcgYWxsIG90aGVyIHZhcmlhYmxlcyBjb25zdGFudC4gDQoNCg0KIyMgUG9pc3NvbiBSZWdyZXNzaW9uIE1vZGVsIG9uIFJhdGVzDQoNCk5vdywgd2Ugd2lsbCBjcmVhdGUgYSBQb2lzc29uIHJlZ3Jlc3Npb24gbW9kZWwgb2YgdGhlIHJhdGVzIGF0IHdoaWNoIGN5Y2xpc3RzIGVudGVyIGFuZCBsZWF2ZSB2aWEgdGhlIFdpbGxpYW1zYnVyZyBCcmlkZ2Ugb2Zmc2V0IGJ5IHRoZSB0b3RhbCBudW1iZXIgb2YgY3ljbGlzdHMgb24gYWxsIGZvdXIgb2YgdGhlIG1ham9yIE5ldyBZb3JrIGJyaWRnZXMuIFRoaXMgbW9kZWwsIHVubGlrZSB0aGUgcHJldmlvdXMgbW9kZWwgd2hpY2gganVzdCBmb2N1c2VkIG9uIHRoZSBmcmVxdWVuY3kgY291bnRzIG9mIGN5Y2xpc3RzIG9uIHRoZSBXaWxsaWFtc2J1cmcgQnJpZGdlLCB3aWxsIGFsc28gYWNjb3VudCBmb3IgdGhlIHRvdGFsIG51bWJlciBvZiBjeWNsaXN0cyBvbiBhbGwgZm91ciBvZiB0aGUgbWFqb3IgTmV3IFlvcmsgYnJpZGdlcywgdGhlIEJyb29rbHluIEJyaWRnZSwgdGhlIE1hbmhhdHRhbiBCcmlkZ2UsIHRoZSBXaWxsaWFtc2J1cmcgQnJpZGdlLCBhbmQgdGhlIFF1ZWVuc2Jvcm8gQnJpZGdlLiBUaGlzIFBvaXNzb24gbW9kZWwgd2lsbCBsb29rIGF0IHRoZSByYXRlcyBvZiB0aGUgbnVtYmVyIG9mIGN5Y2xpc3RzIG9uIHRoZSBXaWxsaWFtc2J1cmcgQnJpZGdlIGZvciBhIGdpdmVuIG9ic2VydmF0aW9uIGFzIGEgcmF0ZSBvdXQgb2YgdGhlIHRvdGFsIG51bWJlciBvZiBjeWNsaXN0cyBvbiBhbGwgZm91ciBvZiB0aGVzZSBtYWpvciBicmlkZ2VzIGZvciB0aGF0IHNwZWNpZmljIG9ic2VydmF0aW9uLg0KDQpXZSB3aWxsIGJ1aWxkIG91ciBQb2lzc29uIHJlZ3Jlc3Npb24gbW9kZWwgZm9yIHRoZSByYXRlcy4gVGhpcyB0aW1lLCB3ZSB3aWxsIHN0aWxsIHVzZSB0aGUgV2lsbGlhbXNidXJnQnJpZGdlIHZhcmlhYmxlIGFzIG91ciByZXNwb25zZSB2YXJpYWJsZSwgYnV0IHdlIHdpbGwgb2Zmc2V0IHRoZSBtb2RlbCBieSB0aGUgVG90YWwgdmFyaWFibGUgdG8gbWFrZSBvdXIgUG9pc3NvbiBtb2RlbCBmb3IgdGhlIHJhdGVzIG9mIGN5Y2xpc3RzIG9uIHRoZSBXaWxsaWFtc2J1cmcgQnJpZGdlIG91dCBvZiB0aGUgdG90YWwgbnVtYmVyIG9mIGN5Y2xpc3RzIG9uIGFsbCBmb3VyIG9mIHRoZSBicmlkZ2VzLiANCg0KDQpgYGB7cn0NCiMgUG9pc3NvbiBNb2RlbCBvZiBSYXRlcw0KbW9kZWwucmF0ZXMgPC0gZ2xtKFdpbGxpYW1zYnVyZ0JyaWRnZSB+IERheSArIEhpZ2hUZW1wICsgTG93VGVtcCArIFByZWNpcGl0YXRpb24sIG9mZnNldCA9IGxvZyhUb3RhbCksIA0KICAgICAgICAgICAgICAgICAgIGZhbWlseSA9IHBvaXNzb24obGluayA9ICJsb2ciKSwgZGF0YSA9IGN5Y2xpbmcpDQprYWJsZShzdW1tYXJ5KG1vZGVsLnJhdGVzKSRjb2VmLCBjYXB0aW9uID0gIlBvaXNzb24gUmVncmVzc2lvbiBNb2RlbCBvZiB0aGUgUmF0ZXMgb2YgQ3ljbGlzdHMgXG4gb24gdGhlIFdpbGxpYW1zYnVyZyBCcmlkZ2Ugb3V0IG9mIGFsbCBGb3VyIEJyaWRnZXMiKQ0KYGBgDQoNClRoZSByZWdyZXNzaW9uIGVxdWF0aW9uIGZvciB0aGUgUG9pc3NvbiByZWdyZXNzaW9uIG1vZGVsIG9uIHRoZSByYXRlcyBpcyBnaXZlbiBhczoNCg0KbG9nKM68L3QpID0gLTEuMDY4MiArIDAuMDAwNCAqIERheU1vbmRheSArIDAuMDM3NSAqIERheVNhdHVyZGF5ICsgMC4wMDUxICogRGF5U3VuZGF5ICsgMC4wMjA2ICogRGF5VGh1cnNkYXkgKyAwLjAxMzggKiBEYXlUdWVzZGF5ICsgMC4wMjMzICogRGF5V2VkbmVzZGF5IC0gMC4wMDEyICogSGlnaFRlbXAgKyAwLjAwMDQgKiBMb3dUZW1wICsgMC4wNTA1ICogUHJlY2lwaXRhdGlvbg0KDQpBbGwgb2YgdGhlIHByZWRpY3RvciB2YXJpYWJsZXMgaW4gdGhpcyBQb2lzc29uIG1vZGVsLCBEYXRlLCBIaWdoVGVtcCwgTG93VGVtcCwgYW5kIFByZWNpcGl0YXRpb24sIGFsbCBoYXZlIHAtdmFsdWVzIG9mIHAgPCAuMDAxLiBUaGlzIGluZGljYXRlcyB0aGF0IGFsbCBvZiB0aGUgcHJlZGljdG9yIGluIG91ciBtb2RlbCB2YXJpYWJsZXMgYXJlIHN0YXRpc3RpY2FsbHkgc2lnbmlmaWNhbnQgaW4gcHJlZGljdGluZyB0aGUgdG90YWwgZXhwZWN0ZWQgY291bnRzIG9mIGN5Y2xpc3RzIG9uIHRoZSBXaWxsaWFtc2J1cmcgQnJpZGdlIG9uIGEgZ2l2ZW4gZGF5LCBvZmZzZXQgYnkgdGhlIHRvdGFsIG51bWJlciBvZiBjeWNsaXN0cyBvbiBhbGwgZm91ciBvZiB0aGUgbWFqb3IgTmV3IFlvcmsgYnJpZGdlcy4gDQoNClRoaXMgbW9kZWwgc2hvd3Mgc3RhdGlzdGljYWwgc2lnbmlmaWNhbmNlIGluIHByZWRpY3RpbmcgdGhlIGV4cGVjdGVkIGNvdW50cyBvZiB0aGUgY3ljbGlzdHMgb24gdGhlIFdpbGxpYW1zYnVyZyBCcmlkZ2UgYnkgdXNpbmcgdGhlIHJhdGVzIGZvciB0aGUgcHJlZGljdGlvbi4gVGhpcyBpbmRpY2F0ZXMgdGhhdCB0aGlzIG1vZGVsIGZvciB0aGUgcmF0ZXMgc2hvd3Mgc3RhdGlzdGljYWwgc2lnbmlmaWNhbmNlIGluIGl0cyBwcmVkaWN0aXZlIHBvd2VyIGFuZCBwcm92aWRlcyBnb29kIHV0aWxpdHkgZm9yIHByZWRpY3Rpb24gYW5kIGVzdGltYXRpb24uIA0KDQpMaWtlIHdhcyBzdGF0ZWQgZm9yIHRoZSBQb2lzc29uIHJlZ3Jlc3Npb24gbW9kZWwgb24gZnJlcXVlbmN5IGNvdW50cywgRnJpZGF5IHdhcyBjaG9zZW4gYnkgUiB0byBiZSB0aGUgYmFzZSBsaW5lIGxldmVsIG9mIHRoZSBEYXkgdmFyaWFibGUsIGFuZCBzbyB3ZSB3aWxsIGNvbXBhcmUgdGhlIHJlZ3Jlc3Npb24gY29lZmZpY2llbnRzIGFnYWluc3QgdGhpcyBiYXNlIGxpbmUgbGV2ZWwuDQoNCg0KDQojIyMgUmVncmVzc2lvbiBDb2VmZmljaWVudHMgSW50ZXJwcmV0YXRpb24NCg0KV2Ugd2lsbCBhbmFseXNpcyB0aGUgcmVncmVzc2lvbiBjb2VmZmljaWVudHMgZm9yIHRoZSB2YXJpYWJsZXMgaW4gdGhpcyBQb2lzc29uIHJlZ3Jlc3Npb24gbW9kZWwgb24gcmF0ZXMuDQoNCiogVGhlIHZhbHVlIG9mIHRoZSB5LWludGVyY2VwdCBpcyBnaXZlbiBhcyAtMS4wNjgyLiBUaGlzIHJlcHJlc2VudHMgdGhlIGJhc2VsaW5lIG9mIHRoZSBtZWFuIG9mIHRoZSBsb2cgY291bnRzIG11bHRpcGxpZWQgYnkgdCwgd2hlbiBhbGwgcHJlZGljdG9yIHZhcmlhYmxlcyBhcmUgZXF1YWwgdG8gMC4gSG93ZXZlciwgdGhlIHktaW50ZXJjZXB0IGRvZXMgbm90IGhhdmUgYSBwcmFjdGljYWwgaW50ZXJwcmV0YXRpb24gb3IgbWVhbmluZyBpbiB0aGlzIHNjZW5hcmlvIHNvIHdlIGFyZSBub3QgaW50ZXJlc3RlZCBpbiBpdHMgbWVhbmluZyBmb3IgdGhlIFBvaXNzb24gcmVncmVzc2lvbiBtb2RlbC4NCg0KKiBEYXlNb25kYXkgKHAgPSAwLjk2ODkpOiBUaGUgcmVncmVzc2lvbiBjb2VmZmljaWVudCBmb3IgdGhlIHZhcmlhYmxlIERheU1vbmRheSB3YXMgZm91bmQgdG8gYmUgMC4wMDA0LiBUaGlzIG1lYW5zIHRoYXQgdGhlIG1lYW4gbG9nIGNvdW50IG9mIGN5Y2xpc3RzIG9uIHRoZSBXaWxsaWFtc2J1cmdzIEJyaWRnZSB3YXMgMC4wMDA0IGdyZWF0ZXIgb24gTW9uZGF5IHRoYW4gb24gRnJpZGF5LiBXZSBjYW4gYWxzbyBzYXkgdGhpcyBtZWFucyB0aGF0IHRoZSBjb3VudCBvZiBjeWNsaXN0cyBpcyAxLjAwNTYgdGltZXMgZ3JlYXRlciBvbiBNb25kYXkgdGhhbiBvbiBGcmlkYXksIGhvbGRpbmcgYWxsIG90aGVyIHZhcmlhYmxlcyBjb25zdGFudC4gDQoNCiogRGF5U2F0dXJkYXkgKHAgPCAuMDAxKTogVGhlIHJlZ3Jlc3Npb24gY29lZmZpY2llbnQgZm9yIHRoZSB2YXJpYWJsZSBEYXlTYXR1cmRheSB3YXMgZm91bmQgdG8gYmUgMC4wMzc1LiBUaGlzIG1lYW5zIHRoYXQgdGhlIG1lYW4gbG9nIGNvdW50IG9mIGN5Y2xpc3RzIG9uIHRoZSBXaWxsaWFtc2J1cmdzIEJyaWRnZSB3YXMgMC4wMzc1IGdyZWF0ZXIgb24gU2F0dXJkYXkgdGhhbiBvbiBGcmlkYXkuIFdlIGNhbiBhbHNvIHNheSB0aGlzIG1lYW5zIHRoYXQgdGhlIGNvdW50IG9mIGN5Y2xpc3RzIGlzIDEuMDM4MiB0aW1lcyBncmVhdGVyIG9uIFNhdHVyZGF5IHRoYW4gb24gRnJpZGF5LCBob2xkaW5nIGFsbCBvdGhlciB2YXJpYWJsZXMgY29uc3RhbnQuIA0KDQoqIERheVN1bmRheSAocCA9IDAuNTk3Nik6IFRoZSByZWdyZXNzaW9uIGNvZWZmaWNpZW50IGZvciB0aGUgdmFyaWFibGUgRGF5U3VuZGF5IHdhcyBmb3VuZCB0byBiZSAwLjAwNTEuIFRoaXMgbWVhbnMgdGhhdCB0aGUgbWVhbiBsb2cgY291bnQgb2YgY3ljbGlzdHMgb24gdGhlIFdpbGxpYW1zYnVyZ3MgQnJpZGdlIHdhcyAwLjAwNTEgZ3JlYXRlciBvbiBTdW5kYXkgdGhhbiBvbiBGcmlkYXkuIFdlIGNhbiBhbHNvIHNheSB0aGlzIG1lYW5zIHRoYXQgdGhlIGNvdW50IG9mIGN5Y2xpc3RzIG9uIFN1bmRheSBpcyAxLjAwNSB0aW1lcyBncmVhdGVyIG9uIFN1bmRheSB0aGFuIG9uIEZyaWRheSwgaG9sZGluZyBhbGwgb3RoZXIgdmFyaWFibGVzIGNvbnN0YW50LiANCg0KKiBEYXlUaHVyc2RheSAocCA9IDAuMDQ1Nik6IFRoZSByZWdyZXNzaW9uIGNvZWZmaWNpZW50IGZvciB0aGUgdmFyaWFibGUgRGF5VGh1cnNkYXkgd2FzIGZvdW5kIHRvIGJlIDAuMDIwNi4gVGhpcyBtZWFucyB0aGF0IHRoZSBtZWFuIGxvZyBjb3VudCBvZiBjeWNsaXN0cyBvbiB0aGUgV2lsbGlhbXNidXJncyBCcmlkZ2Ugd2FzIDAuMDIwNiBncmVhdGVyIG9uIFRodXJzZGF5IHRoYW4gb24gRnJpZGF5LiBXZSBjYW4gYWxzbyBzYXkgdGhpcyBtZWFucyB0aGF0IHRoZSBjb3VudCBvZiBjeWNsaXN0cyBpcyAxLjAyMDggdGltZXMgZ3JlYXRlciBvbiBUaHVyc2RheSB0aGFuIG9uIEZyaWRheSwgaG9sZGluZyBhbGwgb3RoZXIgdmFyaWFibGVzIGNvbnN0YW50LiANCg0KKiBEYXlUdWVzZGF5IChwID0gMC4xODM5KTogVGhlIHJlZ3Jlc3Npb24gY29lZmZpY2llbnQgZm9yIHRoZSB2YXJpYWJsZSBEYXlUdWVzZGF5IHdhcyBmb3VuZCB0byBiZSAwLjAxMzguIFRoaXMgbWVhbnMgdGhhdCB0aGUgbWVhbiBsb2cgY291bnQgb2YgY3ljbGlzdHMgb24gdGhlIFdpbGxpYW1zYnVyZ3MgQnJpZGdlIHdhcyAwLjAxMzggZ3JlYXRlciBvbiBUdWVzZGF5IHRoYW4gb24gRnJpZGF5LiBXZSBjYW4gYWxzbyBzYXkgdGhpcyBtZWFucyB0aGF0IHRoZSBjb3VudCBvZiBjeWNsaXN0cyBpcyAxLjAxMzkgdGltZXMgZ3JlYXRlciBvbiBUdWVzZGF5IHRoYW4gb24gRnJpZGF5LCBob2xkaW5nIGFsbCBvdGhlciB2YXJpYWJsZXMgY29uc3RhbnQuIA0KDQoqIERheVdlZG5lc2RheSAocCAwLjAyMDYpOiBUaGUgcmVncmVzc2lvbiBjb2VmZmljaWVudCBmb3IgdGhlIHZhcmlhYmxlIERheVRodXJzZGF5IHdhcyBmb3VuZCB0byBiZSAwLjAyMzMuIFRoaXMgbWVhbnMgdGhhdCB0aGUgbWVhbiBsb2cgY291bnQgb2YgY3ljbGlzdHMgb24gdGhlIFdpbGxpYW1zYnVyZ3MgQnJpZGdlIHdhcyAwLjAyMzMgZ3JlYXRlciBvbiBXZWRuZXNkYXkgdGhhbiBvbiBGcmlkYXkuIFdlIGNhbiBhbHNvIHNheSB0aGlzIG1lYW5zIHRoYXQgdGhlIGNvdW50IG9mIGN5Y2xpc3RzIGlzIDEuMDIzNiB0aW1lcyBncmVhdGVyIG9uIFdlZG5lc2RheSB0aGFuIG9uIEZyaWRheSwgaG9sZGluZyBhbGwgb3RoZXIgdmFyaWFibGVzIGNvbnN0YW50LiANCg0KKiBIaWdoVGVtcCAocCA9IDAuMDQyNik6IFRoZSByZWdyZXNzaW9uIGNvZWZmaWNpZW50IG9mIHRoZSBIaWdoVGVtcCB2YXJpYWJsZSBpbiB0aGlzIG1vZGVsIGlzIC0wLjAwMTIuIFRoaXMgbWVhbnMgdGhhdCB0aGUgbWVhbiBvZiB0aGUgbG9nIGNvdW50cyBtdWx0aXBsaWVkIGJ5IHQgZGVjcmVhc2VzIGJ5IDAuMDAxMiB1bml0cyBmb3IgZXZlcnkgMSBkZWdyZWUgRmFocmVuaGVpdCBpbmNyZWFzZSBpbiB0aGUgaGlnaCB0ZW1wZXJhdHVyZSBmb3IgdGhlIGdpdmVuIG9ic2VydmF0aW9uLCBob2xkaW5nIGFsbCBvdGhlciB2YXJpYWJsZXMgY29uc3RhbnQuIA0KDQoqIExvd1RlbXAgKHAgPSAwLjY1NTUpOiBUaGUgcmVncmVzc2lvbiBjb2VmZmljaWVudCBvZiB0aGUgTG93VGVtcCB2YXJpYWJsZSBpbiB0aGlzIG1vZGVsIGlzIDAuMDAwNC4gVGhpcyBtZWFucyB0aGF0IHRoZSBsb2cgY291bnRzIG11bHRpcGxlZCBieSB0IGluY3JlYXNlcyBieSAwLjAwMDQgdW5pdHMgZm9yIGV2ZXJ5IDEgZGVncmVlIEZhaHJlbmhlaXQgaW5jcmVhc2UgaW4gdGhlIGxvdyB0ZW1wZXJhdHVyZSBmb3IgdGhlIGdpdmVuIG9ic2VydmF0aW9uLCBob2xkaW5nIGFsbCBvdGhlciB2YXJpYWJsZXMgY29uc3RhbnQuIA0KDQoqIFByZWNpcGl0YXRpb24gKHAgPSAwLjAwMTcpOiBUaGUgcmVncmVzc2lvbiBjb2VmZmljaWVudCBvZiB0aGUgUHJlY2lwaXRhdGlvbiB2YXJpYWJsZSBpbiB0aGlzIG1vZGVsIGlzIDAuMDUwNS4gVGhpcyBtZWFucyB0aGF0IHRoZSBsb2cgY291bnRzIG11bHRpcGxpZWQgYnkgdCBpbmNyZWFzZXMgYnkgMC4wNTA1IHVuaXRzIGZvciBldmVyeSAxIGluY2ggaW5jcmVhc2UgaW4gdGhlIGFtb3VudCBvZiBwcmVjaXBpdGF0aW9uIGZvciB0aGUgZ2l2ZW4gb2JzZXJ2YXRpb24sIGhvbGRpbmcgYWxsIG90aGVyIHZhcmlhYmxlcyBjb25zdGFudC4NCg0KDQojIyBTdW1tYXJ5IGFuZCBDb21wYXJpc29ucyBvZiB0aGUgVHdvIE1vZGVscw0KDQpCb3RoIG9mIHRoZSB0d28gUG9pc3NvbiByZWdyZXNzaW9uIG1vZGVsIHdlIGNyZWF0ZWQsIHRoZSBtb2RlbCBmb3IgdGhlIGZyZXF1ZW5jeSBjb3VudHMgYW5kIHRoZSBtb2RlbCBmb3IgdGhlIHJhdGVzLCBwcm92aWRlZCBzdGF0aXN0aWNhbCBzaWduaWZpY2FuY2UgZm9yIHByZWRpY3Rpb24gYW5kIHNob3dlZCBnb29kIHV0aWxpdHkgb3ZlcmFsbC4gSW4gYm90aCBvZiB0aGVzZSBtb2RlbHMsIHdlIGxvb2tlZCBpbnRvIHRoZSB0b3RhbCBudW1iZXIgb2YgY3ljbGlzdHMgb24gdGhlIFdpbGxpYW1zYnVyZyBCcmlkZ2UgaW4gTmV3IFlvcmsgZm9yIGEgc3BlY2lmaWMgb2JzZXJ2YXRpb24sIGFuZCB3ZSBsb29rZWQgaW50byB0aGUgdmFyaW91cyBmYWN0b3JzIG9mIHRoYXQgc3BlY2lmaWMgZGF0ZS4gV2UgbG9va2VkIGF0IHRoZSBkYXRlIG9mIHRoZSBvYnNlcnZhdGlvbiBhbG9uZyB3aXRoIHNvbWUgZmFjdG9ycyB3aGljaCBtYXkgYWZmZWN0IHRoZSB0b3RhbCBudW1iZXIgb2YgY3ljbGlzdHMgb3V0IG9uIHRoYXQgc3BlY2lmaWMgZGF0ZS4gVGhlc2UgZmFjdG9ycyBpbmNsdWRlZCB0aGUgaGlnaCB0ZW1wZXJhdHVyZSwgdGhlIGxvdyB0ZW1wZXJhdHVyZSwgYW5kIHRoZSBhbW91bnQgb2YgcHJlY2lwaXRhdGlvbiBmb3IgdGhhdCBnaXZlbiBkYXRlLiBJdCB0dXJuZWQgb3V0IHRoYXQgYWxsIG9mIHRoZXNlIGZhY3RvcnMgd2VyZSBpbmRlZWQgc3RhdGlzdGljYWxseSBzaWduaWZpY2FudCBmb3IgYm90aCBvZiB0aGUgdHdvIFBvaXNzb24gcmVncmVzc2lvbiBtb2RlbHMsIGluZGljYXRpbmcgdGhhdCB0aGVzZSB3ZWF0aGVyIHJlbGF0ZWQgY29uZGl0aW9ucyBoYXZlIGEgc3RhdGlzdGljYWxseSBzaWduaWZpY2FudCBpbXBhY3Qgb24gYm90aCB0aGUgY291bnRzIGFuZCB0aGUgcmF0ZXMgb2YgY3ljbGlzdHMgb3V0IG9uIHRoZSBXaWxsaWFtc2J1cmcgQnJpZGdlIGZvciBhIGdpdmVuIG9ic2VydmF0aW9uLiBUaGlzIGNhbiBiZSBhdHRyaWJ1dGVkIHRvIGNlcnRhaW4gd2VhdGhlciBjb25kaXRpb25zIG1ha2luZyBpdCBtb3JlIG9yIGxlc3MgaWRlYWwgZm9yIGluZGl2aWR1YWxzIHRvIGJlIGN5Y2xpbmcgb3V0ZG9vcnMuIEZvciBpbnN0YW5jZSwgYSBkYXkgd2l0aCBpbmNyZWRpYmx5IGhpZ2ggdGVtcGVyYXR1cmVzLCBpbmNyZWRpYmx5IGNvbGQgdGVtcGVyYXR1cmVzLCBvciBzZXZlcmUgc3Rvcm1zIHdpdGggaGVhdnkgcHJlY2lwaXRhdGlvbiB3b3VsZCBiZSBsZXNzIGlkZWFsIGFuZCBsaWtlbHkgbGVhZCB0byBsZXNzIGN5Y2xpc3RzIGJlaW5nIG91dCBvbiB0aGF0IGdpdmVuIGRheSBhcyBvcHBvc2VkIHRvIGEgZGF5IHdpdGggcGxlYXNhbnQgd2VhdGhlci4gDQoNCk92ZXJhbGwsIGJvdGggb2YgdGhlIFBvaXNzb24gcmVncmVzc2lvbiBtb2RlbHMgc2hvd2VkIHN0YXRpc3RpY2FsIHNpZ25pZmljYW5jZSBhbmQgZ29vZCB1dGlsaXR5IGluIHRoZWlyIHByZWRpY3Rpb24uIEhvd2V2ZXIsIGFzIHdhcyBwcmV2aW91c2x5IHN0YXRlZCwgdGhlcmUgd2VyZSBzb21lIHZpb2xhdGlvbnMgb2YgdGhpcyBjb25kaXRpb25zIGZvciBhIFBvaXNzb24gcmVncmVzc2lvbiBtb2RlbCB3aXRoaW4gb3VyIGRhdGEgc2V0LiBGaXJzdCwgaXQgd2FzIGZvdW5kIHRoYXQgdGhlIG1lYW4gb2YgdGhlIHJlc3BvbnNlIHZhcmlhYmxlLCBXaWxsaWFtc2J1cmdCcmlkZ2UsIHdhcyBub3QgZXF1YWwgdG8gaXRzIHZhcmlhbmNlLiBUaGlzIHN1Z2dlc3RzIHRoYXQgdGhpcyByZXNwb25zZSB2YXJpYWJsZSBpbiBmYWN0IGlzIG5vdCBQb2lzc29uIGRpc3RyaWJ1dGVkLCBkdWUgdG8gaXQgZmFpbGluZyB0byBtZWV0IHRoZSBjb25kaXRpb24gZm9yIGEgUG9pc3NvbiByYW5kb20gdmFyaWFibGUgb2YgaXRzIG1lYW4gYmVpbmcgZXF1YWwgdG8gaXRzIHZhcmlhbmNlLiBBZGRpdGlvbmFsbHksIGFsbCBmb3VyIHByZWRpY3RvciB2YXJpYWJsZXMgd2VyZSBjaGVja2VkLCBhbmQgaXQgd2FzIGZvdW5kIHRoYXQgdGhlIHJlc3BvbnNlIHZhcmlhYmxlIGluIGZhY3Qgd2FzIG5vdCBhIGxpbmVhciBmdW5jdGlvbiBvZiBhbnkgb2YgdGhlc2UgcHJlZGljdG9yIHZhcmlhYmxlcy4gVGhpcyBpbmRpY2F0ZXMgYW5vdGhlciBtYWpvciB2aW9sYXRpb24gb2YgdGhpcyBkYXRhIHNldC4gVGhlc2UgdmlvbGF0aW9ucyBzdWdnZXN0IHRoYXQgcGVyaGFwcyBhIFBvaXNzb24gbW9kZWwgd2FzIG5vdCB0aGUgYmVzdCBtb2RlbCBjaG9pY2UgZm9yIHRoaXMgZGF0YSBzZXQsIGFuZCB0aGF0IGl0IGlzIGltcG9ydGFudCB0byBiZSBtaW5kZnVsIG9mIHRoZXNlIHZpb2xhdGlvbnMgd2hlbiB1c2luZyBlaXRoZXIgb2YgdGhlIFBvaXNzb24gcmVncmVzc2lvbiBtb2RlbHMgd2UgY3JlYXRlZCBmb3IgcHJlZGljdGlvbi4gDQoNCg0KDQoNCg0KIyBQb2lzc29uIFJlZ3Jlc3Npb24gTW9kZWwgb24gRnJlcXVlbmN5IENvdW50cw0KDQoNCldlIHdpbGwgYmVnaW4gd2l0aCBjcmVhdGluZyBhIFBvaXNzb24gcmVncmVzc2lvbiBtb2RlbCBvZiB0aGUgZnJlcXVlbmN5IGNvdW50cyB1c2luZyB0aGUgbmV3IHZhcmlhYmxlcyB3ZSBjcmVhdGVkIGZvciB0aGlzIHByb2plY3QuIFNwZWNpZmljYWxseSwgdGhpcyBtb2RlbCB3aWxsIGJlIG9uIHRoZSBmcmVxdWVuY3kgY291bnRzIG9mIGluZGl2aWR1YWxzIG9uIHRoZSBXaWxsaWFtc2J1cmcgQnJpZGdlIGZvciBhIGdpdmVuIG9ic2VydmF0aW9ucy4gT3VyIGdvYWwgaXMgdG8gY3JlYXRlIGEgUG9pc3NvbiByZWdyZXNzaW9uIG1vZGVsIHdoaWNoIGNhbiBzdGF0aXN0aWNhbGx5IHNpZ25pZmljYW50bHkgcHJlZGljdCB0aGUgY291bnQgb2YgdGhlIG51bWJlciBvZiBpbmRpdmlkdWFscyBvbiB0aGUgV2lsbGlhbXNidXJnIEJyaWRnZSBmb3IgYSBnaXZlbiBvYnNlcnZhdGlvbiwgYmFzZWQgdXBvbiB0aGUgdmFyaW91cyBmYWN0b3JzIGluIHRoaXMgZGF0YSBzZXQuIA0KDQpXZSB3aWxsIGNyZWF0ZSBvdXIgUG9pc3NvbiByZWdyZXNzaW9uIG1vZGVsIG9uIHRoZSBmcmVxdWVuY3kgY291bnRzLg0KDQpgYGB7cn0NCiMgUG9pc3NvbiBSZWdyZXNzaW9uIE1vZGVsIG9mIENvdW50cw0KbW9kZWwuY291bnRzIDwtIGdsbShXaWxsaWFtc2J1cmdCcmlkZ2UgfiBEYXkgKyBBdmdUZW1wICsgTmV3UHJlY2lwLCANCiAgICAgICAgICAgICAgICAgICAgZmFtaWx5ID0gcG9pc3NvbihsaW5rID0gImxvZyIpLCBkYXRhID0gY3ljbGluZykNCnBvaXMuY291bnQuY29lZiA9IHN1bW1hcnkobW9kZWwuY291bnRzKSRjb2VmDQprYWJsZShwb2lzLmNvdW50LmNvZWYsIGNhcHRpb24gPSAiUG9pc3NvbiBSZWdyZXNzaW9uIE1vZGVsIGZvciB0aGUgQ291bnRzIG9mIEN5Y2xpc3RzIFxuIG9uIHRoZSBXaWxsaWFtc2J1cmcgQnJpZGdlIikNCmBgYA0KDQpUaGUgcmVncmVzc2lvbiBlcXVhdGlvbiBmb3IgdGhlIFBvaXNzb24gcmVncmVzc2lvbiBtb2RlbCBvbiB0aGUgZnJlcXVlbmN5IGNvdW50cyBpcyBnaXZlbiBhczoNCg0KbG9nKM68KSA9IDcuMjAyNSArIDAuMDMwMiAqIERheU1vbmRheSAtIDAuMTk0NSAqIERheVNhdHVyZGF5IC0gMC4yNDUxICogRGF5U3VuZGF5IC0gMC4wMjk5ICogRGF5VGh1cnNkYXkgLSAwLjA2MDQgKiBEYXlUdWVzZGF5ICsgMC4xNzE0ICogRGF5V2VkbmVzZGF5ICsgMC4wMjUzICogQXZnVGVtcCAtIDAuMzQwOCAqIE5ld1ByZWNpcA0KDQpBbGwgb2YgdGhlIHByZWRpY3RvciB2YXJpYWJsZXMsIERheSwgQXZnVGVtcCwgYW5kIE5ld1ByZWNpcCwgYWxsIGhhdmUgcC12YWx1ZXMgb2YgcCA8IC4wMDEuIFRoaXMgaW5kaWNhdGVzIHRoYXQgYWxsIG9mIHRoZSBwcmVkaWN0b3IgaW4gb3VyIG1vZGVsIHZhcmlhYmxlcyBhcmUgc3RhdGlzdGljYWxseSBzaWduaWZpY2FudCBpbiBwcmVkaWN0aW5nIHRoZSB0b3RhbCBleHBlY3RlZCBjb3VudHMgb2YgY3ljbGlzdHMgb24gdGhlIFdpbGxpYW1zYnVyZyBCcmlkZ2Ugb24gYSBnaXZlbiBkYXkuIA0KDQpGb3Igb3VyIGNhdGVnb3JpY2FsIHByZWRpY3RvciB2YXJpYWJsZSBvZiBEYXksIEZyaWRheSB3YXMgY2hvc2VuIGFzIHRoZSBiYXNlIGxpbmUgbGV2ZWwsIHdoaWNoIGNhbiBiZSBzZWVuIGJ5IGhvdyB0aGVyZSBpcyBub3QgYSAiRGF5RnJpZGF5IiB2YXJpYWJsZSBpbiB0aGUgcmVncmVzc2lvbiBlcXVhdGlvbiBvdXRwdXQuIFRoaXMgaXMgYmVjYXVzZSBvZiB0aGUgc2V2ZW4gZGF5cywgRnJpZGF5IGlzIHRoZSBvbmUgd2hpY2ggY29tZXMgZmlyc3QgYWxwaGFiZXRpY2FsbHkgYW5kIFIgY2hvb3NlcyB0aGUgbGV2ZWwgd2hpY2ggY29tZXMgZmlyc3QgYWxwaGFiZXRpY2FsbHkgYXMgdGhlIGJhc2UgbGluZSBsZXZlbC4gVGhlcmVmb3JlLCBmb3Igb3VyIHJlZ3Jlc3Npb24gY29lZmZpY2llbnQgaW50ZXJwcmV0YXRpb25zIGZvciB0aGUgZGlmZmVyZW50IGxldmVscyBvZiB0aGUgRGF5IHZhcmlhYmxlLCB0aGVzZSB2YWx1ZXMgd2lsbCBiZSBjb21wYXJlZCBhZ2FpbnN0IHRoZSBiYXNlIGxpbmUgbGV2ZWwgb2YgRnJpZGF5Lg0KDQoNCiMjIFJlZ3Jlc3Npb24gQ29lZmZpY2llbnRzIEludGVycHJldGF0aW9uDQoNCldlIHdpbGwgYW5hbHlzaXMgdGhlIHJlZ3Jlc3Npb24gY29lZmZpY2llbnRzIGZvciB0aGUgdmFyaWFibGVzIGluIHRoaXMgUG9pc3NvbiByZWdyZXNzaW9uIG1vZGVsIG9uIGZyZXF1ZW5jeSBjb3VudHMuDQoNCiogVGhlIHZhbHVlIG9mIHRoZSB5LWludGVyY2VwdCBpcyBnaXZlbiBhcyA3LjIwMjUgVGhpcyByZXByZXNudHMgdGhlIGJhc2VsaW5lIG9mIHRoZSBtZWFuIG9mIGxvZyjOvCkgd2hlbiBhbGwgcHJlZGljdG9yIHZhcmlhYmxlcyBhcmUgZXF1YWwgdG8gMC4gSG93ZXZlciwgdGhlIHktaW50ZXJjZXB0IGRvZXMgbm90IGhhdmUgYSBwcmFjdGljYWwgaW50ZXJwcmV0YXRpb24gb3IgbWVhbmluZyBpbiB0aGlzIHNjZW5hcmlvIHNvIHdlIGFyZSBub3QgaW50ZXJlc3RlZCBpbiBpdHMgbWVhbmluZyBmb3IgdGhlIFBvaXNzb24gcmVncmVzc2lvbiBtb2RlbC4NCg0KKiBEYXlNb25kYXkgKHAgPCAuMDAxKTogVGhlIHJlZ3Jlc3Npb24gY29lZmZpY2llbnQgb2YgdGhlIERheU1vbmRheSB2YXJpYWJsZSBpbiB0aGlzIG1vZGVsIGlzIDAuMDMwMi4gVGhpcyBtZWFucyB0aGF0IHRoZSBtZWFuIGxvZyBjb3VudCBvZiBjeWNsaXN0cyBvbiB0aGUgV2lsbGlhbXNidXJncyBCcmlkZ2Ugd2FzIDAuMDMwMiBncmVhdGVyIG9uIE1vbmRheSB0aGFuIG9uIEZyaWRheS4gV2UgY2FuIGFsc28gc2F5IHRoaXMgbWVhbnMgdGhhdCB0aGUgY291bnQgb2YgY3ljbGlzdHMgaXMgMS4wMzA3IHRpbWVzIGdyZWF0ZXIgb24gTW9uZGF5IHRoYW4gb24gRnJpZGF5LCBob2xkaW5nIGFsbCBvdGhlciB2YXJpYWJsZXMgY29uc3RhbnQuIA0KDQoqIERheVNhdHVyZGF5IChwIDwgLjAwMSk6IFRoZSByZWdyZXNzaW9uIGNvZWZmaWNpZW50IG9mIHRoZSBEYXlTYXR1cmRheSB2YXJpYWJsZSBpbiB0aGlzIG1vZGVsIGlzIC0wLjE5NDUuIFRoaXMgbWVhbnMgdGhhdCB0aGUgbWVhbiBsb2cgY291bnQgb2YgY3ljbGlzdHMgb24gdGhlIFdpbGxpYW1zYnVyZ3MgQnJpZGdlIHdhcyAwLjE5NDUgbGVzcyBvbiBNb25kYXkgdGhhbiBvbiBGcmlkYXkuIFdlIGNhbiBhbHNvIHNheSB0aGlzIG1lYW5zIHRoYXQgdGhlIGNvdW50IG9mIGN5Y2xpc3RzIGlzIDAuODIzMiB0aW1lcyBncmVhdGVyIG9uIE1vbmRheSB0aGFuIG9uIEZyaWRheSwgaG9sZGluZyBhbGwgb3RoZXIgdmFyaWFibGVzIGNvbnN0YW50LiANCg0KKiBEYXlTdW5kYXkgKHAgPCAuMDAxKTogVGhlIHJlZ3Jlc3Npb24gY29lZmZpY2llbnQgb2YgdGhlIERheVN1bmRheSB2YXJpYWJsZSBpbiB0aGlzIG1vZGVsIGlzIC0wLjI0NTEuIFRoaXMgbWVhbnMgdGhhdCB0aGUgbWVhbiBsb2cgY291bnQgb2YgY3ljbGlzdHMgb24gdGhlIFdpbGxpYW1zYnVyZ3MgQnJpZGdlIHdhcyAwLjI0NTEgbGVzcyBvbiBTdW5kYXkgdGhhbiBvbiBGcmlkYXkuIFdlIGNhbiBhbHNvIHNheSB0aGlzIG1lYW5zIHRoYXQgdGhlIGNvdW50IG9mIGN5Y2xpc3RzIGlzIDAuNzgyNiB0aW1lcyBncmVhdGVyIG9uIFN1bmRheSB0aGFuIG9uIEZyaWRheSwgaG9sZGluZyBhbGwgb3RoZXIgdmFyaWFibGVzIGNvbnN0YW50LiANCg0KKiBEYXlUaHVyc2RheSAocCA8IC4wMDEpOiBUaGUgcmVncmVzc2lvbiBjb2VmZmljaWVudCBvZiB0aGUgRGF5VGh1cnNkYXkgdmFyaWFibGUgaW4gdGhpcyBtb2RlbCBpcyAtMC4wMjk5LiBUaGlzIG1lYW5zIHRoYXQgdGhlIG1lYW4gbG9nIGNvdW50IG9mIGN5Y2xpc3RzIG9uIHRoZSBXaWxsaWFtc2J1cmdzIEJyaWRnZSB3YXMgMC4wMjk5IGxlc3Mgb24gVGh1cnNkYXkgdGhhbiBvbiBGcmlkYXkuIFdlIGNhbiBhbHNvIHNheSB0aGlzIG1lYW5zIHRoYXQgdGhlIGNvdW50IG9mIGN5Y2xpc3RzIGlzIDAuOTcwNSB0aW1lcyBncmVhdGVyIG9uIFRodXJzZGF5IHRoYW4gb24gRnJpZGF5LCBob2xkaW5nIGFsbCBvdGhlciB2YXJpYWJsZXMgY29uc3RhbnQuIA0KDQoqIERheVR1ZXNkYXkgKHAgPCAuMDAxKTogVGhlIHJlZ3Jlc3Npb24gY29lZmZpY2llbnQgb2YgdGhlIERheVR1ZXNkYXkgdmFyaWFibGUgaW4gdGhpcyBtb2RlbCBpcyAtMC4wNjA0LiBUaGlzIG1lYW5zIHRoYXQgdGhlIG1lYW4gbG9nIGNvdW50IG9mIGN5Y2xpc3RzIG9uIHRoZSBXaWxsaWFtc2J1cmdzIEJyaWRnZSB3YXMgMC4wNjA0IGxlc3Mgb24gVHVlc2RheSB0aGFuIG9uIEZyaWRheS4gV2UgY2FuIGFsc28gc2F5IHRoaXMgbWVhbnMgdGhhdCB0aGUgY291bnQgb2YgY3ljbGlzdHMgaXMgMC45NDE0IHRpbWVzIGdyZWF0ZXIgb24gVHVlc2RheSB0aGFuIG9uIEZyaWRheSwgaG9sZGluZyBhbGwgb3RoZXIgdmFyaWFibGVzIGNvbnN0YW50LiANCg0KKiBEYXlXZWRuZXNkYXkgKHAgPCAuMDAxKTogVGhlIHJlZ3Jlc3Npb24gY29lZmZpY2llbnQgb2YgdGhlIERheVdlZG5lc2RheSB2YXJpYWJsZSBpbiB0aGlzIG1vZGVsIGlzIDAuMTcxNC4gVGhpcyBtZWFucyB0aGF0IHRoZSBtZWFuIGxvZyBjb3VudCBvZiBjeWNsaXN0cyBvbiB0aGUgV2lsbGlhbXNidXJncyBCcmlkZ2Ugd2FzIDAuMTcxNCBncmVhdGVyIG9uIE1vbmRheSB0aGFuIG9uIEZyaWRheS4gV2UgY2FuIGFsc28gc2F5IHRoaXMgbWVhbnMgdGhhdCB0aGUgY291bnQgb2YgY3ljbGlzdHMgaXMgMS4xODcwIHRpbWVzIGdyZWF0ZXIgb24gTW9uZGF5IHRoYW4gb24gRnJpZGF5LCBob2xkaW5nIGFsbCBvdGhlciB2YXJpYWJsZXMgY29uc3RhbnQuIA0KDQoqIEF2Z1RlbXAgKHAgPCAuMDAxKTogVGhlIHJlZ3Jlc3Npb24gY29lZmZpY2llbnQgb2YgdGhlIEF2Z1RlbXAgdmFyaWFibGUgaW4gdGhpcyBtb2RlbCBpcyAwLjAyNTMuIFRoaXMgbWVhbnMgdGhhdCB0aGUgbWVhbiBsb2cgb2YgdGhlIGNvdW50cyBpbmNyZWFzZXMgYnkgMC4wMjUzIHVuaXRzIGZvciBldmVyeSAxIGRlZ3JlZSBGYWhyZW5oZWl0IGluY3JlYXNlIGluIHRoZSBhdmVyYWdlIHRlbXBlcmF0dXJlIGZvciB0aGUgZ2l2ZW4gb2JzZXJ2YXRpb24sIGhvbGRpbmcgYWxsIG90aGVyIHZhcmlhYmxlcyBjb25zdGFudC4gDQoNCiogTmV3UHJlY2lwIChwIDwgLjAwMSk6IFRoZSByZWdyZXNzaW9uIGNvZWZmaWNpZW50IG9mIHRoZSBOZXdQcmVjaXAgdmFyaWFibGUgaW4gdGhpcyBtb2RlbCBpcyAtMC4zNDA4LiBUaGlzIG1lYW5zIHRoYXQgdGhlIG1lYW4gbG9nIG9mIHRoZSBjb3VudCBvZiBjeWNsaXN0cyBvbiB0aGUgV2lsbGlhbXNidXJnIEJyaWRnZSBpcyAwLjM0MDggbGVzcyBvbiBkYXlzIHdoZXJlIHRoZXJlIGlzIHByZWNpcGl0YXRpb24gdGhhbiBvbiBkYXlzIHdoZXJlIHRoZXJlIGlzIG5vIHByZWNpcGl0YXRpb24uIFdlIGNhbiBhbHNvIHNheSB0aGF0IHRoZSBjb3VudCBvZiBjeWNsaXN0cyBpcyAwLjcxMTIgZ3JlYXRlciBvbiBkYXlzIHdpdGggcHJlY2lwaXRhdGlvbiB0aGFuIG9uIGRheXMgd2l0aCBubyBwcmVjaXBpdGF0aW9uLg0KDQoNCkFsbCBvZiB0aGUgcHJlZGljdG9yIHZhcmlhYmxlcyBpbiB0aGlzIFBvaXNzb24gcmVncmVzc2lvbiBtb2RlbCBvbiBmcmVxdWVuY3kgY291bnRzIHdlcmUgc3RhdGlzdGljYWxseSBzaWduaWZpY2FudCB3aXRoIGFsbCBvZiB0aGVpciBwLXZhbHVlcyBiZWluZyBlcXVhbCB0byBwIDwgLjAwMS4gDQoNCg0KDQoNCiMgUG9pc3NvbiBSZWdyZXNzaW9uIE1vZGVsIG9uIFJhdGVzDQoNCg0KTm93LCB3ZSB3aWxsIGNyZWF0ZSBhIFBvaXNzb24gcmVncmVzc2lvbiBtb2RlbCBvZiB0aGUgcmF0ZXMgYXQgd2hpY2ggY3ljbGlzdHMgZW50ZXIgYW5kIGxlYXZlIHZpYSB0aGUgV2lsbGlhbXNidXJnIEJyaWRnZSBvZmZzZXQgYnkgdGhlIHRvdGFsIG51bWJlciBvZiBjeWNsaXN0cyBvbiBhbGwgZm91ciBvZiB0aGUgbWFqb3IgTmV3IFlvcmsgYnJpZGdlcywgdXNpbmcgdGhlIG5ldyB2YXJpYWJsZXMgd2UgY3JlYXRlZCBpbiB0aGlzIHByb2plY3QuIA0KDQpUaGlzIG1vZGVsLCB1bmxpa2UgdGhlIHByZXZpb3VzIG1vZGVsIHdoaWNoIGp1c3QgZm9jdXNlZCBvbiB0aGUgZnJlcXVlbmN5IGNvdW50cyBvZiBjeWNsaXN0cyBvbiB0aGUgV2lsbGlhbXNidXJnIEJyaWRnZSwgd2lsbCBhbHNvIGFjY291bnQgZm9yIHRoZSB0b3RhbCBudW1iZXIgb2YgY3ljbGlzdHMgb24gYWxsIGZvdXIgb2YgdGhlIG1ham9yIE5ldyBZb3JrIGJyaWRnZXMsIHRoZSBCcm9va2x5biBCcmlkZ2UsIHRoZSBNYW5oYXR0YW4gQnJpZGdlLCB0aGUgV2lsbGlhbXNidXJnIEJyaWRnZSwgYW5kIHRoZSBRdWVlbnNib3JvIEJyaWRnZS4gVGhpcyBQb2lzc29uIG1vZGVsIHdpbGwgbG9vayBhdCB0aGUgcmF0ZXMgb2YgdGhlIG51bWJlciBvZiBjeWNsaXN0cyBvbiB0aGUgV2lsbGlhbXNidXJnIEJyaWRnZSBmb3IgYSBnaXZlbiBvYnNlcnZhdGlvbiBhcyBhIHJhdGUgb3V0IG9mIHRoZSB0b3RhbCBudW1iZXIgb2YgY3ljbGlzdHMgb24gYWxsIGZvdXIgb2YgdGhlc2UgbWFqb3IgYnJpZGdlcyBmb3IgdGhhdCBzcGVjaWZpYyBvYnNlcnZhdGlvbi4NCg0KV2Ugd2lsbCBidWlsZCBvdXIgUG9pc3NvbiByZWdyZXNzaW9uIG1vZGVsIGZvciB0aGUgcmF0ZXMuIFRoaXMgdGltZSwgd2Ugd2lsbCBzdGlsbCB1c2UgdGhlIFdpbGxpYW1zYnVyZ0JyaWRnZSB2YXJpYWJsZSBhcyBvdXIgcmVzcG9uc2UgdmFyaWFibGUsIGJ1dCB3ZSB3aWxsIG9mZnNldCB0aGUgbW9kZWwgYnkgdGhlIFRvdGFsIHZhcmlhYmxlIHRvIG1ha2Ugb3VyIFBvaXNzb24gbW9kZWwgZm9yIHRoZSByYXRlcyBvZiBjeWNsaXN0cyBvbiB0aGUgV2lsbGlhbXNidXJnIEJyaWRnZSBvdXQgb2YgdGhlIHRvdGFsIG51bWJlciBvZiBjeWNsaXN0cyBvbiBhbGwgZm91ciBvZiB0aGUgYnJpZGdlcy4gDQoNCg0KYGBge3J9DQojIFBvaXNzb24gTW9kZWwgb2YgUmF0ZXMNCm1vZGVsLnJhdGVzIDwtIGdsbShXaWxsaWFtc2J1cmdCcmlkZ2UgfiBEYXkgKyBBdmdUZW1wICsgTmV3UHJlY2lwLCANCiAgICAgICAgICAgICAgICAgICBvZmZzZXQgPSBsb2coVG90YWwpLCANCiAgICAgICAgICAgICAgICAgICBmYW1pbHkgPSBwb2lzc29uKGxpbmsgPSAibG9nIiksIGRhdGEgPSBjeWNsaW5nKQ0Ka2FibGUoc3VtbWFyeShtb2RlbC5yYXRlcykkY29lZiwgY2FwdGlvbiA9ICJQb2lzc29uIFJlZ3Jlc3Npb24gTW9kZWwgb2YgdGhlIFJhdGVzIG9mIEN5Y2xpc3RzIFxuIG9uIHRoZSBXaWxsaWFtc2J1cmcgQnJpZGdlIG91dCBvZiBhbGwgRm91ciBCcmlkZ2VzIikNCmBgYA0KDQpUaGUgcmVncmVzc2lvbiBlcXVhdGlvbiBmb3IgdGhlIFBvaXNzb24gcmVncmVzc2lvbiBtb2RlbCBvbiB0aGUgcmF0ZXMgaXMgZ2l2ZW4gYXM6DQoNCmxvZyjOvC90KSA9IC0xLjA0MzYgKyAwLjAwMTggKiBEYXlNb25kYXkgKyAwLjAzNDUgKiBEYXlTYXR1cmRheSArIDAuMDAzNSAqIERheVN1bmRheSArIDAuMDIzNyAqIERheVRodXJzZGF5ICsgMC4wMjUzICogRGF5VHVlc2RheSArIDAuMDE4NCAqIERheVdlZG5lc2RheSAtIDAuMDAxNSAqIEF2Z1RlbXAgKyAwLjAxMzcgKiBOZXdQcmVjaXANCg0KDQpUaGUgdmFyaWFibGVzIERheVNhdHVyZGF5LCBEYXlUaHVyc2RheSwgRGF5VHVlc2RheSwgQXZnVGVtcCwgYW5kIE5ld1ByZWNpcCBhbGwgaGFkIHAtdmFsdWVzIGxlc3MgdGhhbiB0aGUgYWxwaGEgdmFsdWUgb2YgMC4wNSwgbWVhbmluZyB0aGF0IHRoZXNlIGFyZSB0aGUgdmFyaWFibGVzIHdoaWNoIGFyZSBzdGF0aXN0aWNhbGx5IHNpZ25pZmljYW50IGluIHRoaXMgbW9kZWwuIA0KDQpMaWtlIHdhcyBzdGF0ZWQgZm9yIHRoZSBQb2lzc29uIHJlZ3Jlc3Npb24gbW9kZWwgb24gZnJlcXVlbmN5IGNvdW50cywgRnJpZGF5IHdhcyBjaG9zZW4gYnkgUiB0byBiZSB0aGUgYmFzZSBsaW5lIGxldmVsIG9mIHRoZSBEYXkgdmFyaWFibGUsIGFuZCBzbyB3ZSB3aWxsIGNvbXBhcmUgdGhlIHJlZ3Jlc3Npb24gY29lZmZpY2llbnRzIGFnYWluc3QgdGhpcyBiYXNlIGxpbmUgbGV2ZWwuDQoNCg0KDQojIyBSZWdyZXNzaW9uIENvZWZmaWNpZW50cyBJbnRlcnByZXRhdGlvbg0KDQpXZSB3aWxsIGFuYWx5c2lzIHRoZSByZWdyZXNzaW9uIGNvZWZmaWNpZW50cyBmb3IgdGhlIHZhcmlhYmxlcyBpbiB0aGlzIFBvaXNzb24gcmVncmVzc2lvbiBtb2RlbCBvbiBmcmVxdWVuY3kgY291bnRzLg0KDQoqIFRoZSB2YWx1ZSBvZiB0aGUgeS1pbnRlcmNlcHQgaXMgZ2l2ZW4gYXMgLTEuMDQzNi4gVGhpcyByZXByZXNlbnRzIHRoZSBiYXNlbGluZSBvZiB0aGUgbWVhbiBvZiB0aGUgbG9nIGNvdW50cyBtdWx0aXBsaWVkIGJ5IHQsIHdoZW4gYWxsIHByZWRpY3RvciB2YXJpYWJsZXMgYXJlIGVxdWFsIHRvIDAuIEhvd2V2ZXIsIHRoZSB5LWludGVyY2VwdCBkb2VzIG5vdCBoYXZlIGEgcHJhY3RpY2FsIGludGVycHJldGF0aW9uIG9yIG1lYW5pbmcgaW4gdGhpcyBzY2VuYXJpbyBzbyB3ZSBhcmUgbm90IGludGVyZXN0ZWQgaW4gaXRzIG1lYW5pbmcgZm9yIHRoZSBQb2lzc29uIHJlZ3Jlc3Npb24gbW9kZWwuDQoNCiogRGF5TW9uZGF5IChwID0gLjg0OTUpOiBUaGUgcmVncmVzc2lvbiBjb2VmZmljaWVudCBvZiB0aGUgRGF5TW9uZGF5IHZhcmlhYmxlIGluIHRoaXMgbW9kZWwgaXMgMC4wMDE4LiBUaGlzIG1lYW5zIHRoYXQgdGhlIG1lYW4gbG9nIGNvdW50IG9mIGN5Y2xpc3RzIG9uIHRoZSBXaWxsaWFtc2J1cmdzIEJyaWRnZSB3YXMgMC4wMDE4IGdyZWF0ZXIgb24gTW9uZGF5IHRoYW4gb24gRnJpZGF5LiBXZSBjYW4gYWxzbyBzYXkgdGhpcyBtZWFucyB0aGF0IHRoZSBjb3VudCBvZiBjeWNsaXN0cyBpcyAxLjAwMTggdGltZXMgZ3JlYXRlciBvbiBNb25kYXkgdGhhbiBvbiBGcmlkYXksIGhvbGRpbmcgYWxsIG90aGVyIHZhcmlhYmxlcyBjb25zdGFudC4gDQoNCiogRGF5U2F0dXJkYXkgKHAgPCAuMDAxKTogVGhlIHJlZ3Jlc3Npb24gY29lZmZpY2llbnQgb2YgdGhlIERheVNhdHVyZGF5IHZhcmlhYmxlIGluIHRoaXMgbW9kZWwgaXMgMC4wMzQ1LiBUaGlzIG1lYW5zIHRoYXQgdGhlIG1lYW4gbG9nIGNvdW50IG9mIGN5Y2xpc3RzIG9uIHRoZSBXaWxsaWFtc2J1cmdzIEJyaWRnZSB3YXMgMC4wMzQ1IGdyZWF0ZXIgb24gU2F0dXJkYXkgdGhhbiBvbiBGcmlkYXkuIFdlIGNhbiBhbHNvIHNheSB0aGlzIG1lYW5zIHRoYXQgdGhlIGNvdW50IG9mIGN5Y2xpc3RzIGlzIDEuMDM1MSB0aW1lcyBncmVhdGVyIG9uIFNhdHVyZGF5IHRoYW4gb24gRnJpZGF5LCBob2xkaW5nIGFsbCBvdGhlciB2YXJpYWJsZXMgY29uc3RhbnQuICANCg0KKiBEYXlTdW5kYXkgKHAgPSAwLjcyNDYpOiBUaGUgcmVncmVzc2lvbiBjb2VmZmljaWVudCBvZiB0aGUgRGF5U3VuZGF5IHZhcmlhYmxlIGluIHRoaXMgbW9kZWwgaXMgMC4wMDM1LiBUaGlzIG1lYW5zIHRoYXQgdGhlIG1lYW4gbG9nIGNvdW50IG9mIGN5Y2xpc3RzIG9uIHRoZSBXaWxsaWFtc2J1cmdzIEJyaWRnZSB3YXMgMC4wMDM1IGdyZWF0ZXIgb24gU3VuZGF5IHRoYW4gb24gRnJpZGF5LiBXZSBjYW4gYWxzbyBzYXkgdGhpcyBtZWFucyB0aGF0IHRoZSBjb3VudCBvZiBjeWNsaXN0cyBpcyAxLjAwMzUgdGltZXMgZ3JlYXRlciBvbiBTdW5kYXkgdGhhbiBvbiBGcmlkYXksIGhvbGRpbmcgYWxsIG90aGVyIHZhcmlhYmxlcyBjb25zdGFudC4gDQoNCiogRGF5VGh1cnNkYXkgKHAgPSAwLjAxOTUpOiBUaGUgcmVncmVzc2lvbiBjb2VmZmljaWVudCBvZiB0aGUgRGF5VGh1cnNkYXkgdmFyaWFibGUgaW4gdGhpcyBtb2RlbCBpcyAwLjAyMzcuIFRoaXMgbWVhbnMgdGhhdCB0aGUgbWVhbiBsb2cgY291bnQgb2YgY3ljbGlzdHMgb24gdGhlIFdpbGxpYW1zYnVyZ3MgQnJpZGdlIHdhcyAwLjAyMzcgZ3JlYXRlciBvbiBUaHVyc2RheSB0aGFuIG9uIEZyaWRheS4gV2UgY2FuIGFsc28gc2F5IHRoaXMgbWVhbnMgdGhhdCB0aGUgY291bnQgb2YgY3ljbGlzdHMgaXMgMS4wMjQwIHRpbWVzIGdyZWF0ZXIgb24gVGh1cnNkYXkgdGhhbiBvbiBGcmlkYXksIGhvbGRpbmcgYWxsIG90aGVyIHZhcmlhYmxlcyBjb25zdGFudC4gDQoNCiogRGF5VHVlc2RheSAocCA9IDAuMDEyNCk6IFRoZSByZWdyZXNzaW9uIGNvZWZmaWNpZW50IG9mIHRoZSBEYXlUdWVzZGF5IHZhcmlhYmxlIGluIHRoaXMgbW9kZWwgaXMgMC4wMjUzLiBUaGlzIG1lYW5zIHRoYXQgdGhlIG1lYW4gbG9nIGNvdW50IG9mIGN5Y2xpc3RzIG9uIHRoZSBXaWxsaWFtc2J1cmdzIEJyaWRnZSB3YXMgMC4wMjUzIGdyZWF0ZXIgb24gVHVlc2RheSB0aGFuIG9uIEZyaWRheS4gV2UgY2FuIGFsc28gc2F5IHRoaXMgbWVhbnMgdGhhdCB0aGUgY291bnQgb2YgY3ljbGlzdHMgaXMgMS4wMjU2IHRpbWVzIGdyZWF0ZXIgb24gVHVlc2RheSB0aGFuIG9uIEZyaWRheSwgaG9sZGluZyBhbGwgb3RoZXIgdmFyaWFibGVzIGNvbnN0YW50LiANCg0KKiBEYXlXZWRuZXNkYXkgKHAgPSAwLjA3MDApOiBUaGUgcmVncmVzc2lvbiBjb2VmZmljaWVudCBvZiB0aGUgRGF5V2VkbmVzZGF5IHZhcmlhYmxlIGluIHRoaXMgbW9kZWwgaXMgMC4wMTg0LiBUaGlzIG1lYW5zIHRoYXQgdGhlIG1lYW4gbG9nIGNvdW50IG9mIGN5Y2xpc3RzIG9uIHRoZSBXaWxsaWFtc2J1cmdzIEJyaWRnZSB3YXMgMC4wMTg0IGdyZWF0ZXIgb24gV2VkbmVzZGF5IHRoYW4gb24gRnJpZGF5LiBXZSBjYW4gYWxzbyBzYXkgdGhpcyBtZWFucyB0aGF0IHRoZSBjb3VudCBvZiBjeWNsaXN0cyBpcyAxLjAxODYgdGltZXMgZ3JlYXRlciBvbiBXZWRuZXNkYXkgdGhhbiBvbiBGcmlkYXksIGhvbGRpbmcgYWxsIG90aGVyIHZhcmlhYmxlcyBjb25zdGFudC4gDQoNCiogQXZnVGVtcCAocCA8IC4wMDEpOiBUaGUgcmVncmVzc2lvbiBjb2VmZmljaWVudCBvZiB0aGUgQXZnVGVtcCB2YXJpYWJsZSBpbiB0aGlzIG1vZGVsIGlzIC0wLjAwMTUuIFRoaXMgbWVhbnMgdGhhdCB0aGUgbWVhbiBsb2cgb2YgdGhlIGNvdW50cyBkZWNyZWFzZXMgYnkgMC4wMDE1IHVuaXRzIGZvciBldmVyeSAxIGRlZ3JlZSBGYWhyZW5oZWl0IGluY3JlYXNlIGluIHRoZSBhdmVyYWdlIHRlbXBlcmF0dXJlIGZvciB0aGUgZ2l2ZW4gb2JzZXJ2YXRpb24sIGhvbGRpbmcgYWxsIG90aGVyIHZhcmlhYmxlcyBjb25zdGFudC4NCg0KKiBOZXdQcmVjaXAgKHAgPSAuMDMyMSk6IFRoZSByZWdyZXNzaW9uIGNvZWZmaWNpZW50IG9mIHRoZSBOZXdQcmVjaXAgdmFyaWFibGUgaW4gdGhpcyBtb2RlbCBpcyAwLjAxMzcuIFRoaXMgbWVhbnMgdGhhdCB0aGUgbWVhbiBsb2cgb2YgdGhlIGNvdW50IG9mIGN5Y2xpc3RzIG9uIHRoZSBXaWxsaWFtc2J1cmcgQnJpZGdlIGlzIDAuMDEzNyBncmVhdGVyIG9uIGRheXMgd2hlcmUgdGhlcmUgaXMgcHJlY2lwaXRhdGlvbiB0aGFuIG9uIGRheXMgd2hlcmUgdGhlcmUgaXMgbm8gcHJlY2lwaXRhdGlvbi4gV2UgY2FuIGFsc28gc2F5IHRoYXQgdGhlIGNvdW50IG9mIGN5Y2xpc3RzIGlzIDEuMDEzOCBncmVhdGVyIG9uIGRheXMgd2l0aCBwcmVjaXBpdGF0aW9uIHRoYW4gb24gZGF5cyB3aXRoIG5vIHByZWNpcGl0YXRpb24uDQoNCg0KDQpPdXQgb2YgYWxsIG9mIHRoZSBwcmVkaWN0b3IgdmFyaWFibGVzLCB0aGUgb25lcyB3aGljaCBzaG93ZWQgc3RhdGlzdGljYWwgc2lnbmlmaWNhbmNlIHdlcmUgRGF5U2F0dXJkYXkgKHAgPCAuMDAxKSwgRGF5VGh1cnNkYXkgKHAgPSAwLjAxOSksIERheVR1ZXNkYXkgKHAgPSAwLjAxMjQpLCBBdmdUZW1wIChwIDwgLjAwMSksIGFuZCBOZXdQcmVjaXAgKHAgPSAuMDMyMSkuIEFsbCBvZiB0aGUgcHJlZGljdG9yIHZhcmlhYmxlcyBoYXZlIHAtdmFsdWVzIGxlc3MgdGhhbiB0aGUgYWxwaGEgdmFsdWUgb2YgMC4wNSwgaW5kaWNhdGluZyB0aGV5IGFyZSBzdGF0aXN0aWNhbGx5IHNpZ25pZmljYW50IHRvIHRoZSBtb2RlbC4gDQoNClRoZSB2YXJpYWJsZXMgb2YgRGF5TW9uZGF5IChwID0gLjg0OTUpLCBEYXlTdW5kYXkgKHAgPSAwLjcyNDYpLCBhbmQgRGF5V2VkbmVzZGF5IChwID0gMC4wNzAwKSBkaWQgbm90IHNob3cgc3RhdGlzdGljYWwgc2lnbmlmaWNhbmNlIGFzIHRoZXkgaGF2ZSBwLXZhbHVlcyBncmVhdGVyIHRoYW4gdGhlIGFscGhhIHZhbHVlIG9mIDAuMDUsIGluZGljYXRpbmcgdGhleSBhcmUgbm90IHN0YXRpc3RpY2FsbHkgc2lnbmlmaWNhbnQgdG8gdGhlIG1vZGVsLg0KDQoNCg0KIyBRdWFzc2ktUG9pc3NvbiBSZWdyZXNzaW9uIE1vZGVsIA0KDQoNCk5leHQsIHdlIHdpbGwgY3JlYXRlIGEgUXVhc2ktUG9pc3NvbiByZWdyZXNzaW9uIG1vZGVsLiBUaGlzIFF1YXNzaS1Qb2lzc29uIHJlZ3Jlc3Npb24gbW9kZWwgd2lsbCBiZSBkb25lIG9uIHRoZSByYXRlcywgYW5kIHNvIGl0IHdpbGwgYmUgb2Zmc2V0IGJ5IHRoZSBUb3RhbCB2YXJpYWJsZSwgd2hpbGUgc3RpbGwgdXNpbmcgV2lsbGlhbXNidXJnQnJpZGdlIGFzIGl0cyByZXNwb25zZSB2YXJpYWJsZSBmb3IgdGhpcyBtb2RlbC4NCg0KYGBge3J9DQojIFF1YXNpLVBvaXNzb24gUmVncmVzc2lvbiBNb2RlbA0KcXVhc2ltb2RlbC5yYXRlcyA8LSBnbG0oV2lsbGlhbXNidXJnQnJpZGdlIH4gRGF5ICsgQXZnVGVtcCArIE5ld1ByZWNpcCwgDQogICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgPSBsb2coVG90YWwpLCANCiAgICAgICAgICAgICAgICAgICAgICAgIGZhbWlseSA9IHF1YXNpcG9pc3NvbiwgZGF0YSA9IGN5Y2xpbmcpDQpzdW1tYXJ5KHF1YXNpbW9kZWwucmF0ZXMpDQoNCnBhbmRlcihzdW1tYXJ5KHF1YXNpbW9kZWwucmF0ZXMpJGNvZWYsIGNhcHRpb24gPSAiUXVhc2ktUG9pc3NvbiBSZWdyZXNzaW9uIE1vZGVsIikNCmBgYA0KDQoNClRoZSByZWdyZXNzaW9uIGVxdWF0aW9uIG9mIHRoZSBRdWFzaS1Qb2lzc29uIFJlZ3Jlc3Npb24gTW9kZWwgaXMgZ2l2ZW4gYXMgZm9sbG93czoNCg0KbG9nKM68L3QpID0gLTEuMDQzNiArIDAuMDAxOCAqIERheU1vbmRheSArIDAuMDM0NSAqIERheVNhdHVyZGF5ICsgMC4wMDM1ICogRGF5U3VuZGF5ICsgMC4wMjM3ICogRGF5VGh1cnNkYXkgKyAwLjAyNTMgKiBEYXlUdWVzZGF5ICsgMC4wMTg0ICogRGF5V2VkbmVzZGF5IC0gMC4wMDE1ICogQXZnVGVtcCArIDAuMDEzNyAqIE5ld1ByZWNpcA0KIA0KIA0KQXMgd2UgY2FuIHNlZSwgdGhlIFF1YXNzaS1Qb2lzc29uIHJlZ3Jlc3Npb24gbW9kZWwgaGFzIHRoZSBzYW1lIGNvZWZmaWNpZW50IGVzdGltYXRlcyBhcyB0aGUgc3RhbmRhcmQgUG9pc3NvbiByZWdyZXNzaW9uIG1vZGVsIG9uIHJhdGVzLCBob3dldmVyLCB0aGUgcC12YWx1ZXMgZm9yIHRoZXNlIHJlZ3Jlc3Npb24gY29lZmZpY2llbnRzIGFyZSBkaWZmZXJlbnQgYmV0d2VlbiB0aGVzZSB0d28gbW9kZWxzLiANCg0KU28sIHRoZSByZWdyZXNzaW9uIGNvZWZmaWNpZW50cyBmb3IgdGhpcyBRdWFzc2ktUG9pc3NvbiByZWdyZXNzaW9uIG1vZGVsIHdvdWxkIGJlIHRoZSBleGFjdCBzYW1lIGFzIHRoZXkgd2VyZSBmb3IgdGhlIHByZXZpb3VzIG1vZGVsIHdlIGp1c3QgZm91bmQgb24gdGhlIFBvaXNzb24gcmVncmVzc2lvbiBtb2RlbCBvZiByYXRlcyBmb3IgdGhlIG5ldyBwcmVkaWN0b3IgdmFyaWFibGVzIG9mIERheSwgQXZnVGVtcCwgYW5kIE5ld1ByZWNpcC4NCg0KT3V0IG9mIGFsbCBvZiB0aGUgcHJlZGljdG9yIHZhcmlhYmxlcyBpbiBvdXIgUXVhc3NpLVBvaXNzb24gcmVncmVzc2lvbiBtb2RlbCBvbiByYXRlcywgb25seSB0aGUgdmFyaWFibGUgb2YgQXZnVGVtcCAocCA9IDAuMDQzKSB3YXMgc3RhdGlzdGljYWxseSBzaWduaWZpY2FudCwgYXMgaXQgd2FzIHRoZSBvbmx5IHByZWRpY3RvciB2YXJpYWJsZSB3aXRoIGEgcC12YWx1ZSBsZXNzIHRoYW4gdGhlIGFscGhhIHZhbHVlIG9mIDAuMDUuIFRoaXMgbWVhbnMsIEF2Z1RlbXAgaXMgdGhlIG9ubHkgc3RhdGlzdGljYWxseSBzaWduaWZpY2FudCBwcmVkaWN0b3IgdmFyaWFibGUgaW4gcHJlZGljdGluZyB0aGUgY3ljbGlzdHMgb24gdGhlIFdpbGxpYW1zYnVyZyBCcmlkZ2UuIA0KDQpBbGwgb2YgdGhlIG90aGVyIHByZWRpY3RvciB2YXJpYWJsZXMsIERheU1vbmRheSwgRGF5U2F0dXJkYXksIERheVN1bmRheSwgRGF5VGh1cnNkYXksIERheVR1ZXNkYXksIERheVdlZG5lc2RheSwgYW5kIE5ld1ByZWNpcCwgd2VyZSBub3Qgc3RhdGlzdGljYWxseSBzaWduaWZpY2FudCBpbiB0aGUgUXVhc3NpLVBvaXNzb24gcmVncmVzc2lvbiBtb2RlbCwgYmVjYXVzZSB0aGV5IGFsbCBoYWQgcC12YWx1ZXMgZ3JlYXRlciB0aGFuIHRoZSBhbHBoYSB2YWx1ZSBvZiAwLjA1Lg0KDQoNCg0KIyMgRGlzcGVyc2lvbg0KDQpOb3csIHdlIHdpbGwgbG9vayBhdCB0aGUgZGlzcGVyc2lvbiBwYXJhbWV0ZXIgZm9yIHRoZSBRdWFzc2ktUG9pc3NvbiByZWdyZXNzaW9uIG1vZGVsIGluIG9yZGVyIHRvIHNlZSBob3cgZGlzcGVyc2VkIGl0IGlzLiANCg0KSW4gdGhpcyBvdXRwdXQgb2YgdGhlIG1vZGVsIHN1bW1hcnksIHdlIHdlcmUgZ2l2ZW4gdGhhdCB0aGUgZGlzcGVyc2lvbiBwYXJhbWV0ZXIgZm9yIHRoZSBRdWFzaS1Qb2lzc29uIG1vZGVsIGlzIDQuMjQzNi4gVGhpcyBkaXNwZXJzaW9uIHBhcmFtZXRlciBnaXZlbiBpbiB0aGUgbW9kZWwgc3VtbWFyeSBpcyB0aGUgUGVhcnNvbiBkaXNwZXJzaW9uIHBhcmFtZXRlci4gDQoNCldlIGNhbiBhbHNvIGNhbGN1bGF0ZSB0aGUgRGV2aWFuY2UgZGlzcGVyc2lvbiBwYXJhbWV0ZXIgdG8gY29tcGFyZSB0aGVzZSB0d28gZGlzcGVyc2lvbiBwYXJhbWV0ZXJzIGZvciBvdXIgUXVhc3NpLVBvaXNzb24gcmVncmVzc2lvbiBtb2RlbCBvbiByYXRlcy4gDQoNCmBgYHtyfQ0KIyBEaXNwZXJzaW9uIFBhcmFtZXRlcnMNCnloYXQgPSBxdWFzaW1vZGVsLnJhdGVzJGZpdHRlZC52YWx1ZXMNCnBlYXJzb24ucmVzaWQgPSAoY3ljbGluZyRXaWxsaWFtc2J1cmdCcmlkZ2UgLSB5aGF0KS9zcXJ0KHloYXQpDQpQZWFyc29uLmRpc3BlcnNpb24gPSBzdW0ocGVhcnNvbi5yZXNpZF4yKS9xdWFzaW1vZGVsLnJhdGVzJGRmLnJlc2lkdWFsDQpEZXZpYW5jZS5kaXNwZXJzaW9uID0gKHF1YXNpbW9kZWwucmF0ZXMkZGV2aWFuY2UpL3F1YXNpbW9kZWwucmF0ZXMkZGYucmVzaWR1YWwNCmRpc3AgPSBjYmluZChQZWFyc29uLmRpc3BlcnNpb24gPSBQZWFyc29uLmRpc3BlcnNpb24sIA0KICAgICAgICAgICAgIERldmlhbmNlLmRpc3BlcnNpb24gPSBEZXZpYW5jZS5kaXNwZXJzaW9uKQ0Ka2FibGUoZGlzcCwgY2FwdGlvbj0iRGlzcGVyc2lvbiBwYXJhbWV0ZXIiLCBhbGlnbiA9ICdjJykNCmBgYA0KDQpBcyB3ZSBjYW4gc2VlLCB0aGUgdmFsdWUgb2YgdGhlIFBlYXJzb24gZGlzcGVyc2lvbiBwYXJhbWV0ZXIgZm9yIG91ciBRdWFzc2ktUG9pc3NvbiByZWdyZXNzaW9uIG1vZGVsIGlzIDQuMjQzNi4gVGhlIHZhbHVlIG9mIHRoZSBEZXZpYW5jZSBkaXNwZXJzaW9uIHBhcmFtZXRlciBmb3Igb3VyIFF1YXNzaS1Qb2lzc29uIHJlZ3Jlc3Npb24gbW9kZWwgaXMgNC4yNDI2LiANCg0KVGhlc2UgZGlzcGVyc2lvbiBwYXJhbWV0ZXJzIHNob3cgdGhhdCBvdXIgbW9kZWwgaXMgaW5kZWVkIGZhaXJseSBkaXNwZXJzZWQsIGFzIHRoZXNlIGRpc3BlcnNpb24gaW5kZXhlcyBkbyBkaWZmZXIgZnJvbSB0aGUgdmFsdWUgb2YgMSBieSBxdWl0ZSBhIGZhaXIgYW1vdW50LiBXZSBjYW4gY29uY2x1ZGUgdGhhdCBvdXIgbW9kZWwgaXMgc2lnbmZpY2FudGx5IGRpc3BlcmVkIGFuZCB0aGVyZWZvcmUsIHVzaW5nIHRoZSBzdGFuZGFyZCBQb2lzc29uIHJlZ3Jlc3Npb24gbW9kZWwgd291bGQgbGlrZWx5IG5vdCBiZSBhbiBpZGVhbCBjaG9pY2UgZHVlIHRvIHRoZSBwb3RlbnRpYWwgb2Ygb3Zlci1kaXNwZXJzaW9uIGxlYWRpbmcgdG8gaW5uYWNjdXJhdGUgcmVzdWx0cyBmb3IgcHJlZGljdGlvbi4gVGhlIGRpc3BlcnNpb24gaW4gb3VyIG1vZGVsIHNpZ25pZmljYW50bHkgZGlmZmVyaW5nIGZyb20gYSB2YWx1ZSBvZiAxIGluZGljYXRlcyB0aGF0IHRoZSBRdWFzc2ktUG9pc3NvbiBtb2RlbCBsaWtlbHkgaXMgdGhlIGJldHRlciBjaG9pY2UgYXMgd2UgZG8gaGF2ZSBzb21lIHNpZ25pZmljYW50IGRpc3BlcnNpb24uIA0KDQoNCg0KIyBGaW5hbCBNb2RlbCANCg0KTm93LCBmb3Igb3VyIGZpbmFsIG1vZGVsIHdlIG11c3QgY2hvb3NlIGJldHdlZW4gdGhlIHN0YW5kYXJkIFBvaXNzb24gcmVncmVzc2lvbiBtb2RlbCBvbiByYXRlcyBhbmQgdGhlIFF1YXNzaS1Qb2lzc29uIHJlZ3Jlc3Npb24gbW9kZWwuIA0KDQpPbmUgaW1wb3J0YW50IHRoaW5nIHRvIG5vdGUgd2hlbiBtYWtpbmcgdGhpcyBjaG9pY2UsIGlzIHRoYXQgdGhlIHJlZ3VsYXIgUG9pc3NvbiBtb2RlbCBhc3N1bWVzIHRoYXQgdGhlIG1lYW4gb2YgdGhlIHJlc3BvbnNlIHZhcmlhYmxlIGlzIGVxdWFsIHRvIGl0cyB2YXJpYW5jZSB3aGlsZSB0aGUgUXVhc3NpLVBvaXNzb24gbW9kZWwgZG9lcyBub3QuIFdoZW4gd2UgY2hlY2tlZCB0aGUgY29uZGl0aW9ucyBvZiB0aGUgc3RhbmRhcmQgUG9pc3NvbiByZWdyZXNzaW9uIG1vZGVsIGVhcmxpZXIsIHdlIGZvdW5kIHRoYXQgdGhlIG1lYW4gb2YgdGhlIHJlc3BvbnNlIHZhcmlhYmxlIGRvZXMgbm90IGVxdWFsIGl0cyB2YXJpYW5jZSwgaW5kaWNhdGluZyBhIG1ham9yIHZpb2xhdGlvbi4gVGhpcyB2aW9sYXRpb24gd291bGQgY2F1c2Ugc29tZSBjb25jZXJuIGZvciB0aGUgcmVndWxhciBQb2lzc29uIHJlZ3Jlc3Npb24gbW9kZWwgYXMgaXQgc3VnZ2VzdCB0aGF0IHRoZSByZXNwb25zZSB2YXJpYWJsZSBpcywgaW4gZmFjdCwgbm90IGEgUG9pc3NvbiByYW5kb20gdmFyaWFibGUsIGFuZCB0aGVyZWZvcmUgYSBzdGFuZGFyZCBQb2lzc29uIHJlZ3Jlc3Npb24gbW9kZWwgbWF5IG5vdCBiZSB0aGUgYmVzdCBjaG9pY2UgZm9yIHRoaXMgZGF0YSBzZXQuIA0KDQpIZXJlLCB0aGUgUXVhc3NpLVBvaXNzb24gbW9kZWwgaGFzIHRoZSBhZHZhbnRhZ2UgYXMgaXQgZG9lcyBub3QgYXNzdW1lIHRoYXQgdGhlIG1lYW4gb2YgdGhlIHJlc3BvbnNlIHZhcmlhYmxlIGlzIGVxdWFsIHRvIGl0cyB2YXJpYW5jZSwgd2hpY2ggaXMgZ29vZCBmb3Igb3VyIGRhdGEgc2V0IHNpbmNlIGl0IGZhaWxlZCB0byBtZWV0IHRoaXMgcmVxdWlyZWQgY29uZGl0aW9uIGZvciBhIHN0YW5kYXJkIFBvaXNzb24gcmVncmVzc2lvbiBtb2RlbC4gDQoNCkJvdGggbW9kZWxzIGhhdmUgYWR2YW50YWdlcyBpbiBkaXNhZHZhbnRhZ2VzIHdoaWNoIG11c3QgYmUgY29uc2lkZXJlZCB3aGVuIG1ha2luZyB0aGUgY2hvaWNlIG9mIGEgZmluYWwgbW9kZWwuIFRoZSBzdGFuZGFyZCBQb2lzc29uIHJlZ3Jlc3Npb24gbW9kZWwgb24gcmF0ZXMgc2hvd2VkIHN0cm9uZyBzdGF0aXN0aWNhbCBzaWduaWZpY2FuY2UgZm9yIHRoZSBtYWpvcml0eSBvZiBpdHMgcHJlZGljdG9yIHZhcmlhYmxlcy4gSG93ZXZlciwgdGhlIGRhdGEgc2V0IGZhaWxlZCB0byBtZWV0IHRoZSBjb25kaXRpb24gb2YgdGhlIG1lYW4gb2YgdGhlIHByZWRpY3RvciB2YXJpYWJsZSBlcXVhbGluZyBpdHMgdmFyaWFuY2Ugd2hpY2ggcmFpc2VzIGNvbmNlcm4gZm9yIHRoZSBmaXQgb2YgdGhpcyBtb2RlbC4gT24gdGhlIG90aGVyIGhhbmQsIHRoZSBRdWFzc2ktUG9pc3NvbiByZWdyZXNzaW9uIG1vZGVsIGRvZXMgbm90IHJlcXVpcmUgdGhpcyBjb25kaXRpb24gb2YgdGhlIG1lYW4gb2YgdGhlIHJlc3BvbnNlIHZhcmlhYmxlIGVxdWFsaW5nIGl0cyB2YXJpYW5jZS4gSG93ZXZlciwgaW4gdGhlIFF1YXNzaS1Qb2lzc29uIG1vZGVsLCBvbmx5IG9uZSBzaW5nbGUgcHJlZGljdG9yIHZhcmlhYmxlIHNob3dlZCBhbnkgc3RhdGlzdGljYWwgc2lnbmlmaWNhbmNlLCBpbmRpY2F0aW5nIHRoYXQgdGhpcyBtb2RlbCBtYXkgbm90IGJlIHNpZ25pZmljYW50IGluIGl0cyBwcmVkaWN0aW9ucyBhZnRlciBhbGwuIA0KDQpBZGRpdGlvbmFsbHksIHdlIGZvdW5kIHRoYXQgb3VyIGRhdGEgaXMgc2lnbmlmaWNhbnRseSBkaXNwZXJzZWQsIHdpdGggYSBkaXNwZXJzaW9uIHBhcmFtZXRlciBvZiA0LjI0MzYsIHdoaWNoIGlzIHNpZ25pZmljYW50bHkgZGlmZmVyZW50IGZyb20gMS4gU2luY2Ugb3VyIGRhdGEgaXMgc2lnbmZpY2FudGx5IGRpc3BlcnNlZCwgaXQgaXMgbGlrZWx5IHRoYXQgYSBzdGFuZGFyZCBQb2lzc29uIHJlZ3Jlc3Npb24gbW9kZWwgaXMgbm90IHRoZSBpZGVhbCBjaG9pY2UgYXMgdGhpcyBvdmVyLWRpc3BlcnNpb24gY2FuIGxlYWQgdG8gaW5hY2NydWF0ZSByZXN1bHRzIGZyb20gdGhpcyBzdGFuZGFyZCBQb2lzc29uIHJlZ3Jlc3Npb24gbW9kZWwuIFdoZW4gdGhlIGRhdGEgaXMgc2lnbmZpY2FudGx5IGRpc3BlcnNlZCwgdGhlIFF1YXNzaS1Qb2lzc29uIHJlZ3Jlc3Npb24gbW9kZWwgc2hvdWxkIGJlIHVzZWQuIFNvLCBldmVuIHRob3VnaCB0aGUgUXVhc3NpLVBvaXNzb24gcmVncmVzc2lvbiBtb2RlbCBpbiB0aGlzIGNhc2UgZGlkIG5vdCBzaG93IHZlcnkgZ29vZCBzdGF0aXN0aWNhbCBzaWduZmljYW5jZSB3aXRoaW4gdGhlIHZhcmlhYmxlcyBmb3IgcHJlZGljdGlvbiwgaXQgaXMgbGlrZWx5IHRoZSBiZXR0ZXIgY2hvaWNlIGFzIG91ciBkYXRhIGlzIHNpZ25pZmljYW50bHkgZGlzcGVyc2VkLiANCg0KSW4gdGhlIGVuZCwgaXQgc2VlbXMgdG8gYmUgYSBjaG9pY2UgYmV0d2VlbiB0aGUgc3RhbmRhcmQgUG9pc3NvbiByZWdyZXNzaW9uIG1vZGVsIHdoaWNoIGlzIG1vcmUgc3RhdGlzdGljYWxseSBzaWduaWZpY2FudCwgYnV0IGxpa2VseSBoYXMgcG9vcmVyIGFjY3VyYWN5IGluIGl0cyBwcmVkaWN0aW9ucyBkdWUgdG8gb3Zlci1kaXNwZXJzaW9uLCBhbmQgdGhlIFF1YXNzaS1Qb2lzc29uIHJlZ3Jlc3Npb24gbW9kZWwsIHdoaWNoIHNob3dzIHdvcnNlIHN0YXRpc3RpY2FsIHNpZ25pZmljYW5jZSwgYnV0IGFjY291bnRzIGZvciBkaXNwZXJzaW9uIGFuZCBpcyBub3QgYWZmZWN0ZWQgYnkgb3VyIGRhdGEgc2V0IGZhaWxpbmcgdG8gbWVldCBhbGwgb2YgdGhlIGNvbmRpdGlvbnMgcmVxdWlyZWQgZm9yIFBvaXNzb24gcmVncmVzc2lvbi4NCg0KT3ZlcmFsbCwgSSB3b3VsZCBzYXkgdGhhdCB0aGUgUXVhc3NpLVBvaXNzb24gcmVncmVzc2lvbiBtb2RlbCBpcyB0aGUgc2FmZXIgY2hvaWNlIG9mIHRoZSB0d28sIGFzIGl0IGRvZXMgbm90IHJlcXVpcmUgdGhlIGNvbmRpdGlvbiBvZiB0aGUgbWVhbiBvZiB0aGUgcmVzcG9uc2UgdmFyaWFibGUgdG8gZXF1YWwgaXRzIHZhcmlhbmNlLCBhcyB0aGlzIHdhcyBzb21ldGhpbmcgb3VyIGRhdGEgc2V0IGZhaWxlZC4gQWRkaXRpb25hbGx5LCB1c2luZyBhIHN0YW5kYXJkIFBvaXNzb24gcmVncmVzc2lvbiBtb2RlbCBvbiBvdmVyLWRpc3BlcnNlZCBkYXRhIGNhbiBsZWFkIHRvIGluYWNjdXJhY3kgaW4gdGhlIHJlc3VsdHMgb2YgaXRzIHByZWRpY3Rpb25zLiBIb3dldmVyLCB0aGlzIFF1YXNzaS1Qb2lzc29uIHJlZ3Jlc3Npb24gbW9kZWwgc2hvd3MgbXVjaCBwb29yZXIgc2lnbmlmaWNhbmNlIHdoaWNoIG1lYW5zIHRoYXQgdGhlIHJlc3VsdHMgaXQgcHJvdmlkZXMgbWF5IG5vdCBiZSBzaWduaWZpY2FudCBhZnRlciBhbGwuIEJ1dCwgdGhlIFF1YXNzaS1Qb2lzc29uIHJlZ3Jlc3Npb24gbW9kZWwgcmVhbWlucyB0aGUgYmV0dGVyIGNob2ljZSBpbiB0aGlzIHNpdHVhdGlvbiBhcyBvdXIgZGF0YSBmYWlscyB0aGUgcmVxdWlyZWQgY29uZGl0aW9uIGZvciB0aGUgcmVzcG9uc2UgdmFyaWFibGUgdG8gYmUgYSBQb2lzc29uIHJhbmRvbSB2YXJpYWJsZSwgYW5kIHdlIGRpZCBzZWUgc2lnbmlmaWNhbnQgZGlzcGVyc2lvbiBhcyB3ZWxsLiANCg0KDQoNCiMgVmlzdWFsIENvbXBhcmlzb25zDQoNCk5vdywgbGV0J3MgbG9vayBhdCBzb21lIHZpc3VhbCBjb21wYXJpc29ucyBvZiB0aGUgZGF0YSB3aXRoaW4gb3VyIG1vZGVscy4gDQoNCkkgY2hvc2UgdG8gY3JlYXRlIGEgZ3JhcGggd2hpY2ggaWxsdXN0cmF0ZWQgdGhlIHByZWRpY3RlZCByYXRlcyBvZiB0aGUgY3ljbGlzdHMgb24gdGhlIFdpbGxpYW1zYnVyZyBCcmlkZ2UgYmFzZWQgdXBvbiB0aGUgZGF5IG9mIHRoZSB3ZWVrIGFuZCB3aGV0aGVyIG9yIG5vdCBpdCByYWluZWQgZm9yIHRoYXQgZ2l2ZW4gZGF5LiBUaGlzIGdyYXBoIHdpbGwgY3JlYXRlIHR3byBsaW5lcywgb25lIGZvciBwcmVjaXBpdGF0aW9uIChibHVlKSwgYW5kIG9uZSBmb3Igbm8gcHJlY2lwaXRhdGlvbiAocmVkKS4gDQoNCmBgYHtyfQ0KZ3JhcGggPC0gZXhwYW5kLmdyaWQoDQogIERheSA9IGN5Y2xpbmckRGF5LCANCiAgTmV3UHJlY2lwID0gY3ljbGluZyROZXdQcmVjaXAsIA0KICBBdmdUZW1wID0gbWVhbihjeWNsaW5nJEF2Z1RlbXAsIG5hLnJtID0gVFJVRSksICANCiAgVG90YWwgPSBtZWFuKGN5Y2xpbmckVG90YWwsIG5hLnJtID0gVFJVRSkgICAgICANCikNCmdyYXBoJHByZWRpY3RlZF9yYXRlIDwtIHByZWRpY3QocXVhc2ltb2RlbC5yYXRlcywgbmV3ZGF0YSA9IGdyYXBoLCB0eXBlID0gInJlc3BvbnNlIikNCg0KZ3JhcGgkTmV3UHJlY2lwIDwtIGZhY3RvcihncmFwaCROZXdQcmVjaXAsIGxldmVscyA9IGMoMCwgMSksIGxhYmVscyA9IGMoIk5vIFByZWNpcGl0YXRpb24iLCAiUHJlY2lwaXRhdGlvbiIpKQ0KDQpnZ3Bsb3QoZ3JhcGgsIGFlcyh4ID0gRGF5LCB5ID0gcHJlZGljdGVkX3JhdGUsIGNvbG9yID0gTmV3UHJlY2lwLCBncm91cCA9IE5ld1ByZWNpcCkpICsNCiAgZ2VvbV9saW5lKHNpemUgPSAxKSArICAgDQogIGdlb21fcG9pbnQoc2l6ZSA9IDIpICsgICANCiAgbGFicyh0aXRsZSA9ICJQcmVkaWN0ZWQgUmF0ZXMgb2YgdGhlIEN5Y2xpc3RzIFxuIG9uIHRoZSBXaWxsaWFtc2J1cmcgQnJpZGdlIGJ5IHRoZSBcbiBEYXkgb2YgdGhlIFdlZWsgYW5kIHRoZSBQcmVjaXBpdGF0aW9uIFxuIENvbmRpdGlvbnMiLA0KICAgICAgIHggPSAiRGF5IiwgDQogICAgICAgeSA9ICJSYXRlIG9mIEN5Y2xpc3RzIiwNCiAgICAgICBjb2xvciA9ICJQcmVjaXBpdGF0aW9uIENvbmRpdGlvbnMiKSArDQogIHRoZW1lX21pbmltYWwoKSArIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSkpDQpgYGANCg0KQXMgd2UgY2FuIHNlZSwgdGhpcyBncmFwaCBpbGx1c3RyYXRlcyB0aGUgcHJlZGljdHMgdGhlIHJhdGUgb2YgdGhlIGN5Y2xpc3RzIG9uIHRoZSBXaWxsaWFtc2J1cmcgQnJpZGdlIG91dCBvZiBhbGwgZm91ciBvZiB0aGUgdG90YWwgbWFqb3IgTmV3IFlvcmsgYnJpZGdlcy4gVGhpcyBncmFwaCBwcmVkaWN0cyB0aGlzIHJhdGUgb2YgdGhlIGN5Y2xpc3RzIG9uIHRoZSBXaWxsaWFtc2J1cmcgQnJpZGdlIGJhc2VkIG9uIHRoZSBkYXkgb2YgdGhlIHdlZWsgYW5kIHdoZXRoZXIgdGhlcmUgd2FzIHByZWNpcGl0YXRpb24gb3Igbm90LiBUaGlzIGdyYXBoIGNyZWF0ZXMgdHdvIGxpbmVzLCBvbmUgZm9yIHByZWNpcGl0YXRpb24gKGJsdWUpLCBhbmQgb25lIGZvciBubyBwcmVjaXBpdGF0aW9uIChyZWQpLiBUaGlzIGdyYXBoIGNyZWF0ZXMgcG9pbnRzIGZvciBlYWNoIG9mIHRoZSBzZXZlbiBkYXlzIG9mIHRoZSB3ZWVrIGFuZCBmb3Igd2hldGhlciB0aGVyZSB3YXMgcHJlY2lwaWF0aW9uIG9yIG5vdCBvbiB0aG9zZSBkYXlzLg0KDQpBcyB3ZSBjYW4gc2VlIGJ5IGxvb2tpbmcgYXQgb3VyIGdyYXBoLCBpdCBpcyBwcmVkaWN0ZWQgdGhhdCB0aGUgaGlnaGVzdCByYXRlIG9mIGN5Y2xpc3RzIG9uIHRoZSBXaWxsaWFtc2J1cmcgQnJpZGdlIG9jY3VycyBvbiBTYXR1cmRheXMgd2l0aCBwcmVjaXBpdGF0aW9uLCBhbmQgdGhlIGxvd2VzdCByYXRlIG9mIGN5Y2xpc3RzIG9uIHRoZSBXaWxsaWFtc2J1cmcgQnJpZGdlIG9jY3VycyBvbiBGcmlkYXlzIHdpdGggbm8gcHJlY2lwaXRhdGlvbi4gDQoNCg0KDQoNCg0KIyBDb25jbHVzaW9uDQoNCk92ZXJhbGwsIHdlIGxvb2tlZCBhdCB2YXJpb3VzIFBvaXNzb24gcmVncmVzc2lvbiBtb2RlbHMgaW4gdGhpcyBwcm9qZWN0IHRvIHByZWRpY3QgdGhlIGZyZXF1ZW5jeSBjb3VudHMgYW5kIHRoZSByYXRlcyBvZiB0aGUgY3ljbGlzdHMgb24gdGhlIFdpbGxpYW1zYnVyZyBCcmlkZ2UuIFdlIGFsc28gbG9va2VkIGF0IGEgUXVhc3NpLVBvaXNzb24gcmVncmVzc2lvbiBtb2RlbCB0byBhY2NvdW50IGZvciB0aGUgZGlzcGVyc2lvbiBvZiB0aGUgZGF0YSBhbG9uZyB3aXRoIHRoZSB2aW9sYXRpb25zIHRoYXQgd2VyZSBzZWVuIHdoaWNoIGluZGljYXRlZCB0aGF0IGEgc3RhbmRhcmQgUG9pc3NvbiByZWdyZXNzaW9uIG1vZGVsIG1heSBub3QgYmUgdGhlIGlkZWFsIGZpdCBmb3Igb3VyIGRhdGEuDQoNCkl0IHdhcyBmb3VuZCB0aGF0IG91ciBzdGFuZGFyZCBQb2lzc29uIHJlZ3Jlc3Npb24gbW9kZWwgb24gcmF0ZXMgaGFkIHNldmVyYWwgdmFyaWFibGVzIHdoaWNoIHNob3dlZCBzdGF0aXN0aWNhbCBzaWduaWZpY2FuY2UsIGluZGljYXRpbmcgdGhhdCB0aGVzZSBwcmVkaWN0b3IgdmFyaWFibGVzIHdlcmUgc3RhdGlzdGljYWxseSBzaWduaWZpY2FudCBpbiBwcmVkaWN0aW5nIHRoZSByYXRlcyBvZiBjeWNsaXN0cyBvbiB0aGUgV2lsbGlhbXNidXJnIEJyaWRnZS4gSW4gb3VyIFF1YXNzaS1Qb2lzc29uIHJlZ3Jlc3Npb24gbW9kZWwsIG9ubHkgb25lIG9mIHRoZSBwcmVkaWN0b3IgdmFyaWFibGVzIHNob3dlZCBzdGF0aXN0aWNhbCBzaWduaWZpY2FuY2UgaW4gcHJlZGljdGluZyB0aGUgcmF0ZXMgb2YgY3ljbGlzdHMgb24gdGhlIFdpbGxpYW1zYnVyZyBCcmlkZ2UuIFRoaXMgbWFkZSBpdCBzZWVtIGxpa2UgdGhlIHN0YW5kYXJkIFBvaXNzb24gcmVncmVzc2lvbiBtb2RlbCBwcm92aWRlZCBiZXR0ZXIgc2lnbmlmaWNhbmNlIGZvciBwcmVkaWN0aW9uLg0KDQpIb3dldmVyLCB3ZSBsb29rZWQgYXQgdGhlIGRpc3BlcnNpb24gcGFyYW1ldGVyIG9mIHRoZSBRdWFzc2ktUG9pc3NvbiByZWdyZXNzaW9uIG1vZGVsIGFuZCBmb3VuZCB0aGF0IG91ciBkYXRhIGlzIGluIGZhY3Qgc2lnbmlmaWNhbnRseSBkaXNwZXJzZWQuIFRoaXMgaW5kaWNhdGVzIHRoYXQgYSBzdGFuZGFyZCBQb2lzc29uIHJlZ3Jlc3Npb24gbW9kZWwgaXMgbGlrZWx5IG5vdCBhbiBpZGVhbCBjaG9pY2UgZHVlIHRvIGl0IG5vdCBhY2NvdW50aW5nIGZvciB0aGlzIG92ZXItZGlzcGVyc2lvbiB3aGljaCBjYW4gbGVhZCB0byBpbm5hY3VyeSBpbiB0aGUgcmVzdWx0cyBvZiBpdHMgcHJlZGljdGlvbi4gVGhpcyBvdmVyLWRpc3BlcnNpb24gYWxvbmcgd2l0aCB0aGUgZmFjdCB0aGF0IG91ciBkYXRhIHNldCB2aW9sYXRlZCB0aGUgY29uZGl0aW9uIG9mIHRoZSBtZWFuIG9mIHRoZSByZXNwb25zZSB2YXJpYWJsZSBlcXVhbGluZyBpdHMgdmFyaWFuY2UsIHNob3dlZCB0aGF0IHRoZSBzdGFuZGFyZCBQb2lzc29uIHJlZ3Jlc3Npb24gbW9kZWwgaXMgbm90IGFuIGlkZWFsIGNob2ljZSBhZnRlciBhbGwuIER1ZSB0byB0aGlzIHNpZ25pZmljYW50IGRpc3BlcnNpb24sIHRoZSBRdWFzc2ktUG9pc3NvbiByZWdyZXNzaW9uIG1vZGVsIHdvdWxkIGJlIHRoZSBiZXR0ZXIgYW5kIHNhZmVyIGNob2ljZSB0aGFuIHRoZSBzdGFuZGFyZCByZWdyZXNzaW9uIG1vZGVsLCBkZXNwaXRlIGl0IGhhdmluZyBsZXNzIHN0YXRpc3RpY2FsbHkgc2lnbmlmaWNhbnQgdmFyaWFibGVzLiBFdmVuIHRob3VnaCB0aGUgUXVhc3NpLVBvaXNzb24gcmVncmVzc2lvbiBtb2RlbCB3YXMgbGVzcyBzdGF0aXN0aWNhbGx5IHNpZ25pZmljYW50LCBpdCBwcm92aWRlcyBiZXR0ZXIgYWNjdXJhY3kgZHVlIHRvIHRoZSBkYXRhIGJlaW5nIGRpc3BlcnNlZCwgZXZlbiB0aG91Z2ggaXQgc2hvd3MgdGhhdCB0aGUgbWFqb3JpdHkgb2YgdGhlIHByZWRpY3RvciB2YXJpYWJsZXMgd2VyZSBub3Qgc3RhdGlzdGNpYWxseSBzaWduaWZpY2FudCBpbiB0aGVpciBwcmVkaWN0aW9uIG9mIHRoZSByYXRlcyBvZiBjeWNsaXN0cyBvbiB0aGUgV2lsbGlhbXNidXJnIEJyaWRnZS4gDQoNCg0KIyMgUmVjb21tZW5kYXRpb25zIA0KDQoNClNvbWUgcmVjb21tZW5kYXRpb25zIEkgd291bGQgbWFrZSBmb3IgZnV0dXJlIHByb2plY3RzIGluY2x1ZGU6DQoNCiogTG9vayBmdXJ0aGVyIGludG8gdGhlIHZpb2xhdGlvbiB0aGF0IHdhcyBmb3VuZCB3aXRoaW4gdGhpcyBkYXRhIHNldCBhbmQgbG9vayBpbnRvIHBvc3NpYmxlIGV4cGxhbmF0aW9ucyBmb3Igd2h5IHRoaXMgdmlvbGF0aW9uIG9jY3VycmVkLiBJdCB3YXMgZm91bmQgdGhhdCB0aGUgbWVhbiBvZiB0aGUgcmVzcG9uc2UgdmFyaWFibGUgaXMgbm90IGVxdWFsIHRvIGl0cyB2YXJpYW5jZSwgd2hpY2ggdmlvbGF0ZXMgb25lIG9mIHRoZSBuZWNlc3NpdGllcyBvZiBhIFBvaXNzb24gcmVncmVzc2lvbiBtb2RlbC4gSXQgc2hvdWxkIGJlIGZ1cnRoZXIgY29uc2lkZXJlZCB3aGV0aGVyIGEgUG9pc3NvbiByZWdyZXNzaW9uIG1vZGVsIGluIGZhY3QgaXMgdGhlIGJlc3QgY2hvaWNlIGZvciB0aGlzIGRhdGEgc2V0IGFuZCBpZiBpdCBpcyBzdWZmaWNpZW50IHRvIHVzZSB0aGlzIG1vZGVsIGZvciBwcmVkaWN0aW9uIGRlc3BpdGUgdGhlc2UgdmlvbGF0aW9ucy4NCg0KKiBDb25zaWRlciBvdGhlciB2YXJpYWJsZXMgd2hpY2ggbWF5IGFmZmVjdCB0aGUgbnVtYmVyIG9mIGN5Y2xpc3RzIG91dCBvbiBhIGdpdmVuIG9ic2VydmF0aW9uLiBQZXJoYXBzIHRoZXJlIGFyZSBvdGhlciBmYWN0b3JzIHdoaWNoIG1heSBwcm92aWRlIGZ1cnRoZXIgc2lnbmlmaWNhbmNlIGZvciBtb2RlbCBidWlsZGluZyB3aGljaCBtYXkgc3RyZW5ndGhlbiB0aGUgcmVncmVzc2lvbiBtb2RlbC4gRm9yIGluc3RhbmNlLCBtYXliZSBhIHZhcmlhYmxlIGxvb2tpbmcgYXQgd2hldGhlciB0aGVyZSBhcmUgYW55IGhvbGlkYXlzIG9yIG90aGVyIG5vdGFibGUgZXZlbnRzIG9jY3VycmluZyBvbiB0aGUgZGF5IG9mIGEgZ2l2ZW4gb2JzZXJ2YXRpb24gY291bGQgYmUgdXNlZnVsLiBUaGlzIGNvdWxkIGJlIGEgYmluYXJ5IHByZWRpY3RvciB2YXJpYWJsZSB3aXRoIGEgdmFsdWUgb2YgMSBpZiB0aGVyZSBhcmUgYW55IGV2ZW50cyBvciBob2xpZGF5cywgYW5kIGEgdmFsdWUgb2YgMCBpZiB0aGVyZSBhcmUgbm90LiBUaGlzIGNvdWxkIHBlcmhhcHMgYmUgdXNlZnVsIGFzIHRoZXJlIG1heSB0ZW5kIHRvIGJlIGxlc3MgY3ljbGlzdHMgb3V0IGlmIHRoZXJlIGlzIGEgbWFqb3IgaG9saWRheSBvciBhbiBldmVudCBvY2N1cnJpbmcgaW4gdGhlIGNpdHkgb24gdGhhdCBnaXZlbiBvYnNlcnZhdGlvbi4NCg0KKiBGdXJ0aGVyIGV4cGFuZCB0aGUgZGF0YSBzZXQgdG8gZW5zdXJlIHRoZSBhY2N1cmFjeSBvZiB0aGUgcHJlZGljdGlvbnMgYW5kIHRvIGZ1cnRoZXIgc3RyZW5ndGhlbiB0aGUgUG9pc3NvbiByZWdyZXNzaW9uIG1vZGVscy4gQnkgY29sbGVjdGluZyBtb3JlIG9ic2VydmF0aW9ucyBvdmVyIGEgbG9uZ2VyIHBlcmlvZCBvZiB0aW1lLCB0aGlzIGNvdWxkIGhlbHAgdG8gZnVydGhlciBzdHJlbmdodGVuIHRoZSBQb2lzc29uIHJlZ3Jlc3Npb24gbW9kZWxzIGFyZSBwcm92aWRlIGJldHRlciBhY2N1cmFjeSBhbmQgcmVsaWFiaWxpdHkgaW4gdGhlIHJlc3VsdHMgZm91bmQgYnkgdGhlIG1vZGVsIGJ1aWxkaW5nIHByb2Nlc3MuIFRoaXMgd291bGQgaGVscCBzdHJlbmd0aGVuIHRoZSBjb25jbHVzaW9ucyBhbmQgZmluZGluZ3MgZm91bmQgaW4gdGhlIHByb2Nlc3Mgb2YgYnVsZGluZyB0aGUgUG9pc3NvbiByZWdyZXNzaW9uIG1vZGVscyBvZiB0aGlzIGRhdGEgc2V0LiAgDQo=