1 Introduction

The data set for this study was collected from the Traffic Information Management System. It keeps track of the number of cyclists entering and leaving the Queensboro Bridge from the dates July 1st to July 31st. This data set includes a total of 31 observations and seven variables. The response variable is the total number of cyclist that pass through the Queensboro bridge on each given day. The explanatory variables for this data set involve the specific conditions of each day, such as the weather.

1.1 Variable Description

Here are what the seven variables in the data set represent:

  • Date (x1) - note this represents the observation ID

  • Day (x2) - The day of the week

  • HighTemp (x3) - the temperature high for the day in degrees Fahrenheit

  • LowTemp (x4) - the temperature high for the day in degrees Fahrenheit

  • Precipitation (x5) - the total precipitation for the day in inches

  • Queensboro Bridge (Y) - The number of cyclists on the Queensboro bridge.

  • Total (x6) - the total number of cyclists who enter and leave the bridges in NYC each day

1.2 Practical Question

Do the conditions surrounding the day the cyclists are recorded affect the number of them enter and leave the QueensboroBridge?

1.3 Data Download and Cleaning

First, we are going to download the data. Since it is a small data set, we can look at the data and conclude there are no missing values. We are also going to remove to commas from the variables “Total” and “QueensboroBridge” so R Studio classifies them as numeric.

cycle <- read.csv("https://raw.githubusercontent.com/AvaDeSt/STA-321/refs/heads/main/Assignment%205%20data(Sheet1).csv", header = TRUE)
          
cycle$Total <- as.numeric(gsub(",", "", cycle$Total))
cycle$QueensboroBridge <- as.numeric(gsub(",", "", cycle$QueensboroBridge))


data(cycle)
## Warning in data(cycle): data set 'cycle' not found
kable(head(cycle), caption = "First few records in the data set")
First few records in the data set
Date Day HighTemp LowTemp Precipitation QueensboroBridge Total
1-Jul Saturday 84.9 72.0 0.23 3216 11867
2-Jul Sunday 87.1 73.0 0.00 3579 13995
3-Jul Monday 87.1 71.1 0.45 4230 16067
4-Jul Tuesday 82.9 70.0 0.00 3861 13925
5-Jul Wednesday 84.9 71.1 0.00 5862 23110
6-Jul Thursday 75.0 71.1 0.00 5251 21861

2 Model Building

For this study, a poisson regression model will be used. The poisson regression model has four basic assumptions that are as follows:

  • The response variable is a count per unit of time or space. ( In our case it is the count of cyclists per day).

  • The observations are independent of one another.

  • The mean of the poisson random variable is equal to the variance.

  • The log of the mean rate, log(λ), is a linear function of x

2.1 Poisson Regression on Queensboro Bridge Cyclists Only

Here we are building a poisson frequancy regression model for our data set. The variable “Date” was left out of this model since it is only an observation ID. The variable “Total” was left of because we can assume that the total amount of bikers that pass the Queensboro Bridge and the total amount of bikers overall are proportional to each other.

model.freq <- glm(QueensboroBridge ~ Day + HighTemp + LowTemp + Precipitation, family = poisson(link = "log"), data = cycle)



pois.count.coef = summary(model.freq)$coef
kable(pois.count.coef, caption = "The Poisson regression model for the counts of cyclist entering and leaving the Queensboro Bridge.")
The Poisson regression model for the counts of cyclist entering and leaving the Queensboro Bridge.
Estimate Std. Error z value Pr(>|z|)
(Intercept) 8.5517234 0.0479068 178.507570 0e+00
DayMonday 0.0541753 0.0108546 4.991021 6e-07
DaySaturday -0.1953380 0.0111460 -17.525400 0e+00
DaySunday -0.2226164 0.0115879 -19.211108 0e+00
DayThursday 0.1157122 0.0113093 10.231628 0e+00
DayTuesday 0.0965569 0.0113512 8.506349 0e+00
DayWednesday 0.1836698 0.0110677 16.595046 0e+00
HighTemp 0.0158199 0.0008034 19.691515 0e+00
LowTemp -0.0197465 0.0011701 -16.876092 0e+00
Precipitation -0.3221763 0.0105342 -30.583731 0e+00

The table indicates that the day of the week, the daily high and low temperatures, and the precipitation levels are all highly significant. This means that the weather and day of the week ar4e good indicators of how many bikers will pass through the Queensboro bridge on a given day. However, it is important to keep in mind that this does not necessarily mean the model is important. For example, the sample size for this study is small and may not represent the entire population. Another way to interpret this is that the cyclist counts on the Queensboro bridge are not dependent on the total number of cyclists on all the New York bridges. Because all these variables are highly significant, they will be included in the following models. We can see that the coefficient for the temperature high is about 0.158. This means that for every one degree increase in the temperature high, the log of the expected count of cyclists increases by 0.158. Since exp(0.158) = 1.173, for each one-unit increase in the predictor variable, the expected count of the outcome variable increases by about 17.3%, holding other variables constant.

2.2 Poisson Regression on Rates with the Total Count

This model looks at the relationship between the rate of cyclists and the day of the week as well as temperature. Here we will also look at the total number of cyclists that cross all the bridges in New York.

model.rates <- glm(QueensboroBridge ~ Day + HighTemp +LowTemp + Precipitation, offset = log(Total), 
                   family = poisson(link = "log"), data = cycle)
kable(summary(model.rates)$coef, caption = "Poisson regression on the rate of cyclists.")
Poisson regression on the rate of cyclists.
Estimate Std. Error z value Pr(>|z|)
(Intercept) -1.2497959 0.0481655 -25.947936 0.0000000
DayMonday -0.0673728 0.0109257 -6.166450 0.0000000
DaySaturday -0.0264248 0.0112172 -2.355741 0.0184858
DaySunday -0.0771257 0.0117421 -6.568307 0.0000000
DayThursday -0.0166461 0.0114600 -1.452543 0.1463505
DayTuesday -0.0410056 0.0115661 -3.545335 0.0003921
DayWednesday -0.0420583 0.0111611 -3.768289 0.0001644
HighTemp 0.0020227 0.0008231 2.457506 0.0139906
LowTemp -0.0042179 0.0011624 -3.628492 0.0002851
Precipitation 0.0451435 0.0097403 4.634702 0.0000036

The table shows that the log of bikers crossing the bridge is not the same across all days of the week. The log rates for the day Friday are higher than the rest of the days of the week. The intercept represents the log base cyclist rate for the baseline day Friday. The rest of the coefficients are the difference of log rates between the baseline day Friday and the rest of the days of the week. We can see from the table that -0.067 is the coefficient for Monday so:

log(RMonday / RFriday) = -0.067 ⇒ RMonday / RFriday = e^−0.067 ≈ 0.935

This means that the rate of bikers on Monday is about 6.5% lower on Monday than on Friday.

Next, we are building a quasi poison model. This is generally a better model to use when the mean and the variance of the data are not the same.

model.rates <- glm(QueensboroBridge ~ Day + HighTemp + LowTemp + Precipitation, offset = log(Total), 
                   family = quasipoisson, data = cycle)
summary(model.rates)
## 
## Call:
## glm(formula = QueensboroBridge ~ Day + HighTemp + LowTemp + Precipitation, 
##     family = quasipoisson, data = cycle, offset = log(Total))
## 
## Coefficients:
##                Estimate Std. Error t value Pr(>|t|)    
## (Intercept)   -1.249796   0.195999  -6.377 2.54e-06 ***
## DayMonday     -0.067373   0.044460  -1.515    0.145    
## DaySaturday   -0.026425   0.045646  -0.579    0.569    
## DaySunday     -0.077126   0.047782  -1.614    0.121    
## DayThursday   -0.016646   0.046634  -0.357    0.725    
## DayTuesday    -0.041006   0.047066  -0.871    0.393    
## DayWednesday  -0.042058   0.045418  -0.926    0.365    
## HighTemp       0.002023   0.003349   0.604    0.552    
## LowTemp       -0.004218   0.004730  -0.892    0.383    
## Precipitation  0.045143   0.039636   1.139    0.268    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for quasipoisson family taken to be 16.559)
## 
##     Null deviance: 467.32  on 30  degrees of freedom
## Residual deviance: 343.68  on 21  degrees of freedom
## AIC: NA
## 
## Number of Fisher Scoring iterations: 3

We can see from this model that none of the variables are no longer significant. This suggests that the mean and the variance of the data set are equal, and a quasi poisson model is not needed.

2.3 Final Model

Given the data that we have, the best model to use is the first poisson frequency regression model that does not take into account the total number of cyclists that cross every bridge. While this variable can help predict the number of cyclists on the Queensboro bridge, it is not needed for a successful model, and the response variable is not reliant on it. The poisson frequency regression model can be written as

QueensboroBridge = 8.552 - 0.227 * DaySunday + 0.054 * DayMonday + 0.097 * DayTuesday + 0.184 * DayWednesday + 0.116 * DayThursday - 0.193 * DaySaturday + 0.016 * HighTemp - 0.020 * LowTemp - 0.322 * Precipitation

3 Summary and Conclusion

To summarize, we looked at a data set that looks at how many bikers cross over the Queensboro Bridge in NYC every day for the month of July, leaving us with 31 observations. The 4 explanatory variables look at the day of the week and the weather conditions on each day. Our goal was to see what the relationship was between these variables and the number of cyclists. We also wanted to see if taking into account the total number of cyclists that cross several major bridges in NYC. To figure this out, we built a Poisson frequency regression model, a Poisson Model on rates, and a quasi poisson model. Based on our small sample, we found that the poisson frequency regression model performed the best. This would indicate that the total number of cyclists in Queensboroo is not reliant on the total number of cyclists on the other bridges although including still makes a good model.

LS0tDQp0aXRsZTogJ1BvaXNzb24gTW9kZWxzIEZvciBDeWNsaXN0IERhdGEnDQphdXRob3I6ICdBdmEgRGVTdGVmYW5vJw0KZGF0ZTogIjEwLTI5LTI0Ig0Kb3V0cHV0Og0KICBodG1sX2RvY3VtZW50OiANCiAgICB0b2M6IHllcw0KICAgIHRvY19mbG9hdDogeWVzDQogICAgdG9jX2RlcHRoOiA0DQogICAgZmlnX3dpZHRoOiA2DQogICAgZmlnX2hlaWdodDogNA0KICAgIGZpZ19jYXB0aW9uOiB5ZXMNCiAgICBudW1iZXJfc2VjdGlvbnM6IHllcw0KICAgIHRvY19jb2xsYXBzZWQ6IHllcw0KICAgIGNvZGVfZm9sZGluZzogaGlkZQ0KICAgIGNvZGVfZG93bmxvYWQ6IHllcw0KICAgIHNtb290aF9zY3JvbGw6IHllcw0KICAgIHRoZW1lOiBsdW1lbg0KICB3b3JkX2RvY3VtZW50OiANCiAgICB0b2M6IHllcw0KICAgIHRvY19kZXB0aDogNA0KICAgIGZpZ19jYXB0aW9uOiB5ZXMNCiAgICBrZWVwX21kOiB5ZXMNCiAgcGRmX2RvY3VtZW50OiANCiAgICB0b2M6IHllcw0KICAgIHRvY19kZXB0aDogNA0KICAgIGZpZ19jYXB0aW9uOiB5ZXMNCiAgICBudW1iZXJfc2VjdGlvbnM6IHllcw0KICAgIGZpZ193aWR0aDogNQ0KICAgIGZpZ19oZWlnaHQ6IDQNCi0tLQ0KDQpgYGB7PWh0bWx9DQoNCjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+DQoNCi8qIENhc2NhZGluZyBTdHlsZSBTaGVldHMgKENTUykgaXMgYSBzdHlsZXNoZWV0IGxhbmd1YWdlIHVzZWQgdG8gZGVzY3JpYmUgdGhlIHByZXNlbnRhdGlvbiBvZiBhIGRvY3VtZW50IHdyaXR0ZW4gaW4gSFRNTCBvciBYTUwuIGl0IGlzIGEgc2ltcGxlIG1lY2hhbmlzbSBmb3IgYWRkaW5nIHN0eWxlIChlLmcuLCBmb250cywgY29sb3JzLCBzcGFjaW5nKSB0byBXZWIgZG9jdW1lbnRzLiAqLw0KDQpoMS50aXRsZSB7ICAvKiBUaXRsZSAtIGZvbnQgc3BlY2lmaWNhdGlvbnMgb2YgdGhlIHJlcG9ydCB0aXRsZSAqLw0KICBmb250LXNpemU6IDI0cHg7DQogIGNvbG9yOiBEYXJrUmVkOw0KICB0ZXh0LWFsaWduOiBjZW50ZXI7DQogIGZvbnQtZmFtaWx5OiAiR2lsbCBTYW5zIiwgc2Fucy1zZXJpZjsNCn0NCmg0LmF1dGhvciB7IC8qIEhlYWRlciA0IC0gZm9udCBzcGVjaWZpY2F0aW9ucyBmb3IgYXV0aG9ycyAgKi8NCiAgZm9udC1zaXplOiAyMHB4Ow0KICBmb250LWZhbWlseTogc3lzdGVtLXVpOw0KICBjb2xvcjogRGFya1JlZDsNCiAgdGV4dC1hbGlnbjogY2VudGVyOw0KfQ0KaDQuZGF0ZSB7IC8qIEhlYWRlciA0IC0gZm9udCBzcGVjaWZpY2F0aW9ucyBmb3IgdGhlIGRhdGUgICovDQogIGZvbnQtc2l6ZTogMThweDsNCiAgZm9udC1mYW1pbHk6IHN5c3RlbS11aTsNCiAgY29sb3I6IERhcmtCbHVlOw0KICB0ZXh0LWFsaWduOiBjZW50ZXI7DQp9DQpoMSB7IC8qIEhlYWRlciAxIC0gZm9udCBzcGVjaWZpY2F0aW9ucyBmb3IgbGV2ZWwgMSBzZWN0aW9uIHRpdGxlICAqLw0KICAgIGZvbnQtc2l6ZTogMjJweDsNCiAgICBmb250LWZhbWlseTogc3lzdGVtLXVpOw0KICAgIGNvbG9yOiBuYXZ5Ow0KICAgIHRleHQtYWxpZ246IGxlZnQ7DQp9DQpoMiB7IC8qIEhlYWRlciAyIC0gZm9udCBzcGVjaWZpY2F0aW9ucyBmb3IgbGV2ZWwgMiBzZWN0aW9uIHRpdGxlICovDQogICAgZm9udC1zaXplOiAyMHB4Ow0KICAgIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICAgIGNvbG9yOiBuYXZ5Ow0KICAgIHRleHQtYWxpZ246IGxlZnQ7DQp9DQoNCmgzIHsgLyogSGVhZGVyIDMgLSBmb250IHNwZWNpZmljYXRpb25zIG9mIGxldmVsIDMgc2VjdGlvbiB0aXRsZSAgKi8NCiAgICBmb250LXNpemU6IDE4cHg7DQogICAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7DQogICAgY29sb3I6IG5hdnk7DQogICAgdGV4dC1hbGlnbjogbGVmdDsNCn0NCg0KaDQgeyAvKiBIZWFkZXIgNCAtIGZvbnQgc3BlY2lmaWNhdGlvbnMgb2YgbGV2ZWwgNCBzZWN0aW9uIHRpdGxlICAqLw0KICAgIGZvbnQtc2l6ZTogMThweDsNCiAgICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsNCiAgICBjb2xvcjogZGFya3JlZDsNCiAgICB0ZXh0LWFsaWduOiBsZWZ0Ow0KfQ0KDQpib2R5IHsgYmFja2dyb3VuZC1jb2xvcjp3aGl0ZTsgfQ0KDQouaGlnaGxpZ2h0bWUgeyBiYWNrZ3JvdW5kLWNvbG9yOnllbGxvdzsgfQ0KDQpwIHsgYmFja2dyb3VuZC1jb2xvcjp3aGl0ZTsgfQ0KDQo8L3N0eWxlPg0KYGBgDQpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0NCiMgRGV0ZWN0LCBpbnN0YWxsIGFuZCBsb2FkIHBhY2thZ2VzIGlmIG5lZWRlZC4NCmlmICghcmVxdWlyZSgia25pdHIiKSkgew0KICAgaW5zdGFsbC5wYWNrYWdlcygia25pdHIiKQ0KICAgbGlicmFyeShrbml0cikNCn0NCmlmICghcmVxdWlyZSgicGFuZGVyIikpIHsNCiAgIGluc3RhbGwucGFja2FnZXMoInBhbmRlciIpDQogICBsaWJyYXJ5KHBhbmRlcikNCn0NCmlmICghcmVxdWlyZSgibWxiZW5jaCIpKSB7DQogICBpbnN0YWxsLnBhY2thZ2VzKCJtbGJlbmNoIikNCiAgIGxpYnJhcnkobWxiZW5jaCkNCn0NCmlmICghcmVxdWlyZSgiTUFTUyIpKSB7DQogICBpbnN0YWxsLnBhY2thZ2VzKCJNQVNTIikNCiAgIGxpYnJhcnkoTUFTUykNCn0NCmlmICghcmVxdWlyZSgicFJPQyIpKSB7DQogICBpbnN0YWxsLnBhY2thZ2VzKCJwUk9DIikNCiAgIGxpYnJhcnkocFJPQykNCn0NCmlmICghcmVxdWlyZSgidGlkeXZlcnNlIikpIHsNCiAgIGluc3RhbGwucGFja2FnZXMoInRpZHl2ZXJzZSIpDQogICBsaWJyYXJ5KGtuaXRyKQ0KfQ0KaWYgKCFyZXF1aXJlKCJwc3ljaCIpKSB7DQogICBpbnN0YWxsLnBhY2thZ2VzKCJwc3ljaCIpDQogICBsaWJyYXJ5KGtuaXRyKQ0KfQ0KaWYgKCFyZXF1aXJlKCJJU3dSIikpIHsNCiAgIGluc3RhbGwucGFja2FnZXMoIklTd1IiKQ0KICAgbGlicmFyeShJU3dSKQ0KfQ0KDQojIHNwZWNpZmljYXRpb25zIG9mIG91dHB1dHMgb2YgY29kZSBpbiBjb2RlIGNodW5rcw0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFLCAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgIHdhcm5pbmdzID0gRkFMU0UsICAgDQogICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZXMgPSBGQUxTRSwgIA0KICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMgPSBUUlVFICAgICANCiAgICAgICAgICAgICAgICAgICAgICApICAgDQpgYGANCg0KIyBJbnRyb2R1Y3Rpb24gDQoNClRoZSBkYXRhIHNldCBmb3IgdGhpcyBzdHVkeSB3YXMgY29sbGVjdGVkIGZyb20gdGhlIFRyYWZmaWMgSW5mb3JtYXRpb24gTWFuYWdlbWVudCBTeXN0ZW0uIEl0IGtlZXBzIHRyYWNrIG9mIHRoZSBudW1iZXIgb2YgY3ljbGlzdHMgZW50ZXJpbmcgYW5kIGxlYXZpbmcgdGhlIFF1ZWVuc2Jvcm8gQnJpZGdlIGZyb20gdGhlIGRhdGVzIEp1bHkgMXN0IHRvIEp1bHkgMzFzdC4gVGhpcyBkYXRhIHNldCBpbmNsdWRlcyBhIHRvdGFsIG9mIDMxIG9ic2VydmF0aW9ucyBhbmQgc2V2ZW4gdmFyaWFibGVzLiBUaGUgcmVzcG9uc2UgdmFyaWFibGUgaXMgdGhlIHRvdGFsIG51bWJlciBvZiBjeWNsaXN0IHRoYXQgcGFzcyB0aHJvdWdoIHRoZSAgUXVlZW5zYm9ybyBicmlkZ2Ugb24gZWFjaCBnaXZlbiBkYXkuIFRoZSBleHBsYW5hdG9yeSB2YXJpYWJsZXMgZm9yIHRoaXMgZGF0YSBzZXQgaW52b2x2ZSB0aGUgc3BlY2lmaWMgY29uZGl0aW9ucyBvZiBlYWNoIGRheSwgc3VjaCBhcyB0aGUgd2VhdGhlci4NCg0KIyMgVmFyaWFibGUgRGVzY3JpcHRpb24NCg0KSGVyZSBhcmUgd2hhdCB0aGUgc2V2ZW4gdmFyaWFibGVzIGluIHRoZSBkYXRhIHNldCByZXByZXNlbnQ6DQoNCiogRGF0ZSAoeDEpIC0gbm90ZSB0aGlzIHJlcHJlc2VudHMgdGhlIG9ic2VydmF0aW9uIElEDQoNCiogRGF5ICh4MikgLSBUaGUgZGF5IG9mIHRoZSB3ZWVrDQoNCiogSGlnaFRlbXAgKHgzKSAtIHRoZSB0ZW1wZXJhdHVyZSBoaWdoIGZvciB0aGUgZGF5IGluIGRlZ3JlZXMgRmFocmVuaGVpdA0KDQoqIExvd1RlbXAgKHg0KSAtIHRoZSB0ZW1wZXJhdHVyZSBoaWdoIGZvciB0aGUgZGF5IGluIGRlZ3JlZXMgRmFocmVuaGVpdA0KDQoqIFByZWNpcGl0YXRpb24gKHg1KSAtIHRoZSB0b3RhbCBwcmVjaXBpdGF0aW9uIGZvciB0aGUgZGF5IGluIGluY2hlcw0KDQoqIFF1ZWVuc2Jvcm8gQnJpZGdlIChZKSAtIFRoZSBudW1iZXIgb2YgY3ljbGlzdHMgb24gdGhlIFF1ZWVuc2Jvcm8gYnJpZGdlLg0KDQoqIFRvdGFsICh4NikgLSB0aGUgdG90YWwgbnVtYmVyIG9mIGN5Y2xpc3RzIHdobyBlbnRlciBhbmQgbGVhdmUgdGhlIGJyaWRnZXMgaW4gTllDIGVhY2ggZGF5DQoNCiMjIFByYWN0aWNhbCBRdWVzdGlvbiANCg0KRG8gdGhlIGNvbmRpdGlvbnMgc3Vycm91bmRpbmcgdGhlIGRheSB0aGUgY3ljbGlzdHMgYXJlIHJlY29yZGVkIGFmZmVjdCB0aGUgbnVtYmVyIG9mIHRoZW0gZW50ZXIgYW5kIGxlYXZlIHRoZSBRdWVlbnNib3JvQnJpZGdlPw0KDQojIyBEYXRhIERvd25sb2FkIGFuZCBDbGVhbmluZw0KDQpGaXJzdCwgd2UgYXJlIGdvaW5nIHRvIGRvd25sb2FkIHRoZSBkYXRhLiBTaW5jZSBpdCBpcyBhIHNtYWxsIGRhdGEgc2V0LCB3ZSBjYW4gbG9vayBhdCB0aGUgZGF0YSBhbmQgY29uY2x1ZGUgdGhlcmUgYXJlIG5vIG1pc3NpbmcgdmFsdWVzLiBXZSBhcmUgYWxzbyBnb2luZyB0byByZW1vdmUgdG8gY29tbWFzIGZyb20gdGhlIHZhcmlhYmxlcyAiVG90YWwiIGFuZCAiUXVlZW5zYm9yb0JyaWRnZSIgc28gUiBTdHVkaW8gY2xhc3NpZmllcyB0aGVtIGFzIG51bWVyaWMuDQoNCmBgYHtyfQ0KY3ljbGUgPC0gcmVhZC5jc3YoImh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9BdmFEZVN0L1NUQS0zMjEvcmVmcy9oZWFkcy9tYWluL0Fzc2lnbm1lbnQlMjA1JTIwZGF0YShTaGVldDEpLmNzdiIsIGhlYWRlciA9IFRSVUUpDQogICAgICAgICAgDQpjeWNsZSRUb3RhbCA8LSBhcy5udW1lcmljKGdzdWIoIiwiLCAiIiwgY3ljbGUkVG90YWwpKQ0KY3ljbGUkUXVlZW5zYm9yb0JyaWRnZSA8LSBhcy5udW1lcmljKGdzdWIoIiwiLCAiIiwgY3ljbGUkUXVlZW5zYm9yb0JyaWRnZSkpDQoNCg0KZGF0YShjeWNsZSkNCmthYmxlKGhlYWQoY3ljbGUpLCBjYXB0aW9uID0gIkZpcnN0IGZldyByZWNvcmRzIGluIHRoZSBkYXRhIHNldCIpDQoNCmBgYA0KDQoNCiMgTW9kZWwgQnVpbGRpbmcgDQoNCkZvciB0aGlzIHN0dWR5LCBhIHBvaXNzb24gcmVncmVzc2lvbiBtb2RlbCB3aWxsIGJlIHVzZWQuIFRoZSBwb2lzc29uIHJlZ3Jlc3Npb24gbW9kZWwgaGFzIGZvdXIgYmFzaWMgYXNzdW1wdGlvbnMgdGhhdCBhcmUgYXMgZm9sbG93czoNCg0KLSBUaGUgcmVzcG9uc2UgdmFyaWFibGUgaXMgYSBjb3VudCBwZXIgdW5pdCBvZiB0aW1lIG9yIHNwYWNlLiAoIEluIG91ciBjYXNlIGl0IGlzIHRoZSBjb3VudCBvZiBjeWNsaXN0cyBwZXIgZGF5KS4NCg0KLSBUaGUgb2JzZXJ2YXRpb25zIGFyZSBpbmRlcGVuZGVudCBvZiBvbmUgYW5vdGhlci4NCg0KLSBUaGUgbWVhbiBvZiB0aGUgcG9pc3NvbiByYW5kb20gdmFyaWFibGUgaXMgZXF1YWwgdG8gdGhlIHZhcmlhbmNlLg0KDQotIFRoZSBsb2cgb2YgdGhlIG1lYW4gcmF0ZSwgbG9nKM67KSwgaXMgYSBsaW5lYXIgZnVuY3Rpb24gb2YgeA0KDQoNCiMjIFBvaXNzb24gUmVncmVzc2lvbiBvbiBRdWVlbnNib3JvIEJyaWRnZSBDeWNsaXN0cyBPbmx5DQoNCkhlcmUgd2UgYXJlIGJ1aWxkaW5nIGEgcG9pc3NvbiBmcmVxdWFuY3kgcmVncmVzc2lvbiBtb2RlbCBmb3Igb3VyIGRhdGEgc2V0LiBUaGUgdmFyaWFibGUgIkRhdGUiIHdhcyBsZWZ0IG91dCBvZiB0aGlzIG1vZGVsIHNpbmNlIGl0IGlzIG9ubHkgYW4gb2JzZXJ2YXRpb24gSUQuIFRoZSB2YXJpYWJsZSAiVG90YWwiIHdhcyBsZWZ0IG9mIGJlY2F1c2Ugd2UgY2FuIGFzc3VtZSB0aGF0IHRoZSB0b3RhbCBhbW91bnQgb2YgYmlrZXJzIHRoYXQgcGFzcyB0aGUgUXVlZW5zYm9ybyBCcmlkZ2UgYW5kIHRoZSB0b3RhbCBhbW91bnQgb2YgYmlrZXJzIG92ZXJhbGwgYXJlIHByb3BvcnRpb25hbCB0byBlYWNoIG90aGVyLiANCmBgYHtyfQ0KbW9kZWwuZnJlcSA8LSBnbG0oUXVlZW5zYm9yb0JyaWRnZSB+IERheSArIEhpZ2hUZW1wICsgTG93VGVtcCArIFByZWNpcGl0YXRpb24sIGZhbWlseSA9IHBvaXNzb24obGluayA9ICJsb2ciKSwgZGF0YSA9IGN5Y2xlKQ0KDQoNCg0KcG9pcy5jb3VudC5jb2VmID0gc3VtbWFyeShtb2RlbC5mcmVxKSRjb2VmDQprYWJsZShwb2lzLmNvdW50LmNvZWYsIGNhcHRpb24gPSAiVGhlIFBvaXNzb24gcmVncmVzc2lvbiBtb2RlbCBmb3IgdGhlIGNvdW50cyBvZiBjeWNsaXN0IGVudGVyaW5nIGFuZCBsZWF2aW5nIHRoZSBRdWVlbnNib3JvIEJyaWRnZS4iKQ0KDQpgYGANClRoZSB0YWJsZSBpbmRpY2F0ZXMgdGhhdCB0aGUgZGF5IG9mIHRoZSB3ZWVrLCB0aGUgZGFpbHkgaGlnaCBhbmQgbG93IHRlbXBlcmF0dXJlcywgYW5kIHRoZSBwcmVjaXBpdGF0aW9uIGxldmVscyBhcmUgYWxsIGhpZ2hseSBzaWduaWZpY2FudC4gVGhpcyBtZWFucyB0aGF0IHRoZSB3ZWF0aGVyIGFuZCBkYXkgb2YgdGhlIHdlZWsgYXI0ZSBnb29kIGluZGljYXRvcnMgb2YgaG93IG1hbnkgYmlrZXJzIHdpbGwgcGFzcyB0aHJvdWdoIHRoZSBRdWVlbnNib3JvIGJyaWRnZSBvbiBhIGdpdmVuIGRheS4gSG93ZXZlciwgaXQgaXMgaW1wb3J0YW50IHRvIGtlZXAgaW4gbWluZCB0aGF0IHRoaXMgZG9lcyBub3QgbmVjZXNzYXJpbHkgbWVhbiB0aGUgbW9kZWwgaXMgaW1wb3J0YW50LiBGb3IgZXhhbXBsZSwgdGhlIHNhbXBsZSBzaXplIGZvciB0aGlzIHN0dWR5IGlzIHNtYWxsIGFuZCBtYXkgbm90IHJlcHJlc2VudCB0aGUgZW50aXJlIHBvcHVsYXRpb24uIEFub3RoZXIgd2F5IHRvIGludGVycHJldCB0aGlzIGlzIHRoYXQgdGhlIGN5Y2xpc3QgY291bnRzIG9uIHRoZSBRdWVlbnNib3JvIGJyaWRnZSBhcmUgbm90IGRlcGVuZGVudCBvbiB0aGUgdG90YWwgbnVtYmVyIG9mIGN5Y2xpc3RzIG9uIGFsbCB0aGUgTmV3IFlvcmsgYnJpZGdlcy4gQmVjYXVzZSBhbGwgdGhlc2UgdmFyaWFibGVzIGFyZSBoaWdobHkgc2lnbmlmaWNhbnQsIHRoZXkgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgZm9sbG93aW5nIG1vZGVscy4gV2UgY2FuIHNlZSB0aGF0IHRoZSBjb2VmZmljaWVudCBmb3IgdGhlIHRlbXBlcmF0dXJlIGhpZ2ggaXMgYWJvdXQgMC4xNTguIFRoaXMgbWVhbnMgdGhhdCBmb3IgZXZlcnkgb25lIGRlZ3JlZSBpbmNyZWFzZSBpbiB0aGUgdGVtcGVyYXR1cmUgaGlnaCwgdGhlIGxvZyBvZiB0aGUgZXhwZWN0ZWQgY291bnQgb2YgY3ljbGlzdHMgaW5jcmVhc2VzIGJ5IDAuMTU4LiBTaW5jZSBleHAoMC4xNTgpID0gMS4xNzMsIGZvciBlYWNoIG9uZS11bml0IGluY3JlYXNlIGluIHRoZSBwcmVkaWN0b3IgdmFyaWFibGUsIHRoZSBleHBlY3RlZCBjb3VudCBvZiB0aGUgb3V0Y29tZSB2YXJpYWJsZSBpbmNyZWFzZXMgYnkgYWJvdXQgMTcuMyUsIGhvbGRpbmcgb3RoZXIgdmFyaWFibGVzIGNvbnN0YW50Lg0KDQoNCg0KIyMgUG9pc3NvbiBSZWdyZXNzaW9uIG9uIFJhdGVzIHdpdGggdGhlIFRvdGFsIENvdW50DQoNClRoaXMgbW9kZWwgbG9va3MgYXQgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHRoZSByYXRlIG9mIGN5Y2xpc3RzIGFuZCB0aGUgZGF5IG9mIHRoZSB3ZWVrIGFzIHdlbGwgYXMgdGVtcGVyYXR1cmUuIEhlcmUgd2Ugd2lsbCBhbHNvIGxvb2sgYXQgdGhlIHRvdGFsIG51bWJlciBvZiBjeWNsaXN0cyB0aGF0IGNyb3NzIGFsbCB0aGUgYnJpZGdlcyBpbiBOZXcgWW9yay4NCg0KYGBge3J9DQptb2RlbC5yYXRlcyA8LSBnbG0oUXVlZW5zYm9yb0JyaWRnZSB+IERheSArIEhpZ2hUZW1wICtMb3dUZW1wICsgUHJlY2lwaXRhdGlvbiwgb2Zmc2V0ID0gbG9nKFRvdGFsKSwgDQogICAgICAgICAgICAgICAgICAgZmFtaWx5ID0gcG9pc3NvbihsaW5rID0gImxvZyIpLCBkYXRhID0gY3ljbGUpDQprYWJsZShzdW1tYXJ5KG1vZGVsLnJhdGVzKSRjb2VmLCBjYXB0aW9uID0gIlBvaXNzb24gcmVncmVzc2lvbiBvbiB0aGUgcmF0ZSBvZiBjeWNsaXN0cy4iKQ0KYGBgDQoNClRoZSB0YWJsZSBzaG93cyB0aGF0IHRoZSBsb2cgb2YgYmlrZXJzIGNyb3NzaW5nIHRoZSBicmlkZ2UgaXMgbm90IHRoZSBzYW1lIGFjcm9zcyBhbGwgZGF5cyBvZiB0aGUgd2Vlay4gVGhlIGxvZyByYXRlcyBmb3IgdGhlIGRheSBGcmlkYXkgYXJlIGhpZ2hlciB0aGFuIHRoZSByZXN0IG9mIHRoZSBkYXlzIG9mIHRoZSB3ZWVrLiBUaGUgaW50ZXJjZXB0IHJlcHJlc2VudHMgdGhlIGxvZyBiYXNlIGN5Y2xpc3QgcmF0ZSBmb3IgdGhlIGJhc2VsaW5lIGRheSBGcmlkYXkuIFRoZSByZXN0IG9mIHRoZSBjb2VmZmljaWVudHMgYXJlIHRoZSBkaWZmZXJlbmNlIG9mIGxvZyByYXRlcyBiZXR3ZWVuIHRoZSBiYXNlbGluZSBkYXkgRnJpZGF5IGFuZCB0aGUgcmVzdCBvZiB0aGUgZGF5cyBvZiB0aGUgd2Vlay4gV2UgY2FuIHNlZSBmcm9tIHRoZSB0YWJsZSB0aGF0IC0wLjA2NyBpcyB0aGUgY29lZmZpY2llbnQgZm9yIE1vbmRheSBzbzoNCg0KbG9nKFJNb25kYXkgLyBSRnJpZGF5KSA9IC0wLjA2NyDih5IgICBSTW9uZGF5IC8gUkZyaWRheSA9IGVe4oiSMC4wNjcg4omIIDAuOTM1DQoNClRoaXMgbWVhbnMgdGhhdCB0aGUgcmF0ZSBvZiBiaWtlcnMgb24gTW9uZGF5IGlzIGFib3V0IDYuNSUgbG93ZXIgb24gTW9uZGF5IHRoYW4gb24gRnJpZGF5Lg0KDQpOZXh0LCB3ZSBhcmUgYnVpbGRpbmcgYSBxdWFzaSBwb2lzb24gbW9kZWwuIFRoaXMgaXMgZ2VuZXJhbGx5IGEgYmV0dGVyIG1vZGVsIHRvIHVzZSB3aGVuIHRoZSBtZWFuIGFuZCB0aGUgdmFyaWFuY2Ugb2YgdGhlIGRhdGEgYXJlIG5vdCB0aGUgc2FtZS4gDQoNCmBgYHtyfQ0KbW9kZWwucmF0ZXMgPC0gZ2xtKFF1ZWVuc2Jvcm9CcmlkZ2UgfiBEYXkgKyBIaWdoVGVtcCArIExvd1RlbXAgKyBQcmVjaXBpdGF0aW9uLCBvZmZzZXQgPSBsb2coVG90YWwpLCANCiAgICAgICAgICAgICAgICAgICBmYW1pbHkgPSBxdWFzaXBvaXNzb24sIGRhdGEgPSBjeWNsZSkNCnN1bW1hcnkobW9kZWwucmF0ZXMpDQpgYGANCldlIGNhbiBzZWUgZnJvbSB0aGlzIG1vZGVsIHRoYXQgbm9uZSBvZiB0aGUgdmFyaWFibGVzIGFyZSBubyBsb25nZXIgc2lnbmlmaWNhbnQuIFRoaXMgc3VnZ2VzdHMgdGhhdCB0aGUgbWVhbiBhbmQgdGhlIHZhcmlhbmNlIG9mIHRoZSBkYXRhIHNldCBhcmUgZXF1YWwsIGFuZCBhIHF1YXNpIHBvaXNzb24gbW9kZWwgaXMgbm90IG5lZWRlZC4gDQoNCg0KIyMgRmluYWwgTW9kZWwgDQoNCkdpdmVuIHRoZSBkYXRhIHRoYXQgd2UgaGF2ZSwgdGhlIGJlc3QgbW9kZWwgdG8gdXNlIGlzIHRoZSBmaXJzdCBwb2lzc29uIGZyZXF1ZW5jeSByZWdyZXNzaW9uIG1vZGVsIHRoYXQgZG9lcyBub3QgdGFrZSBpbnRvIGFjY291bnQgdGhlIHRvdGFsIG51bWJlciBvZiBjeWNsaXN0cyB0aGF0IGNyb3NzIGV2ZXJ5IGJyaWRnZS4gV2hpbGUgdGhpcyB2YXJpYWJsZSBjYW4gaGVscCBwcmVkaWN0IHRoZSBudW1iZXIgb2YgY3ljbGlzdHMgb24gdGhlIFF1ZWVuc2Jvcm8gYnJpZGdlLCBpdCBpcyBub3QgbmVlZGVkIGZvciBhIHN1Y2Nlc3NmdWwgbW9kZWwsIGFuZCB0aGUgcmVzcG9uc2UgdmFyaWFibGUgaXMgbm90IHJlbGlhbnQgb24gaXQuIFRoZSBwb2lzc29uIGZyZXF1ZW5jeSByZWdyZXNzaW9uIG1vZGVsIGNhbiBiZSB3cml0dGVuIGFzIA0KDQpRdWVlbnNib3JvQnJpZGdlID0gOC41NTIgLSAwLjIyNyAqIERheVN1bmRheSArIDAuMDU0ICogRGF5TW9uZGF5ICsgMC4wOTcgKiBEYXlUdWVzZGF5ICsgMC4xODQgKiBEYXlXZWRuZXNkYXkgKyAwLjExNiAqIERheVRodXJzZGF5IC0gMC4xOTMgKiBEYXlTYXR1cmRheSArIDAuMDE2ICogSGlnaFRlbXAgLSAwLjAyMCAqIExvd1RlbXAgLSAwLjMyMiAqIFByZWNpcGl0YXRpb24NCg0KIyBTdW1tYXJ5IGFuZCBDb25jbHVzaW9uDQoNClRvIHN1bW1hcml6ZSwgd2UgbG9va2VkIGF0IGEgZGF0YSBzZXQgdGhhdCBsb29rcyBhdCBob3cgbWFueSBiaWtlcnMgY3Jvc3Mgb3ZlciB0aGUgUXVlZW5zYm9ybyBCcmlkZ2UgaW4gTllDIGV2ZXJ5IGRheSBmb3IgdGhlIG1vbnRoIG9mIEp1bHksIGxlYXZpbmcgdXMgd2l0aCAzMSBvYnNlcnZhdGlvbnMuIFRoZSA0IGV4cGxhbmF0b3J5IHZhcmlhYmxlcyBsb29rIGF0IHRoZSBkYXkgb2YgdGhlIHdlZWsgYW5kIHRoZSB3ZWF0aGVyIGNvbmRpdGlvbnMgb24gZWFjaCBkYXkuIE91ciBnb2FsIHdhcyB0byBzZWUgd2hhdCB0aGUgcmVsYXRpb25zaGlwIHdhcyBiZXR3ZWVuIHRoZXNlIHZhcmlhYmxlcyBhbmQgdGhlIG51bWJlciBvZiBjeWNsaXN0cy4gV2UgYWxzbyB3YW50ZWQgdG8gc2VlIGlmIHRha2luZyBpbnRvIGFjY291bnQgdGhlIHRvdGFsIG51bWJlciBvZiBjeWNsaXN0cyB0aGF0IGNyb3NzIHNldmVyYWwgbWFqb3IgYnJpZGdlcyBpbiBOWUMuIFRvIGZpZ3VyZSB0aGlzIG91dCwgd2UgYnVpbHQgYSBQb2lzc29uIGZyZXF1ZW5jeSByZWdyZXNzaW9uIG1vZGVsLCBhIFBvaXNzb24gTW9kZWwgb24gcmF0ZXMsIGFuZCBhIHF1YXNpIHBvaXNzb24gbW9kZWwuIEJhc2VkIG9uIG91ciBzbWFsbCBzYW1wbGUsIHdlIGZvdW5kIHRoYXQgdGhlIHBvaXNzb24gZnJlcXVlbmN5IHJlZ3Jlc3Npb24gbW9kZWwgcGVyZm9ybWVkIHRoZSBiZXN0LiBUaGlzIHdvdWxkIGluZGljYXRlIHRoYXQgdGhlIHRvdGFsIG51bWJlciBvZiBjeWNsaXN0cyBpbiBRdWVlbnNib3JvbyBpcyBub3QgcmVsaWFudCBvbiB0aGUgdG90YWwgbnVtYmVyIG9mIGN5Y2xpc3RzIG9uIHRoZSBvdGhlciBicmlkZ2VzIGFsdGhvdWdoIGluY2x1ZGluZyBzdGlsbCBtYWtlcyBhIGdvb2QgbW9kZWwuDQo=