About
Clearly show and organize your work. Each answer should appear below the corresponding question. Be careful not to modify existing text and code. For multiple choice questions you can place an (x) mark next to the text to mark your selection. Where necessary execute the already included code chunk, and add yours to perform required calculations. Best to view first in Preview mode!
Problem 1: (6 points)
Answer the below by typing your answer following each question. Each question is graded as marked.
1. Which one(s) of the following statements is(are) true with regards to a star schema? (1pt)
Each table has to have a primary key
Fact table is the biggest transactional table
Dimension tables are best suited for categorical data
All dimension tables are connected to fact table
All above (x)
2. A set of data has a median much larger than the mean. What can we say about the data distribution? (1pt)
Skew left (x)
Symmetrical
Skew Right
Normal
3. Which of the below is not a suited format for textual data? (1pt)
JSON
HTML
JPEG (x)
ASCII
CSV
4. You are given the following linear regression model describing the cost C of heating bill in $ versus the temperature T in Fahrenheit: C = 2T + 50. What are the units of the intercept and the slope? (1pt) The intercept and slope must also be in dollars. This is because no matter what the T (temperature) is, we will come out to a C value in dollars, therefore the intercept and slope must be in dollars as well to output the dollar value we need for C. Although the T is in degrees farhenheit, this is the only variable that will be in a different unit, but the slope and intercept will be dollars to coincide with C, or our output value.
5. The closer data values are to the mean, the more potential for noise to occur (1pt)
True
False (x)
6. You are given a data set with 100 entries. Twenty entries have zero values. When do we use the formula sum(data)/100 to compute the average of the data set? (1pt)
When zero values mean true values (x)
When zero values represent missing values
When zero values mean true as well as missing values
None of the above
Problem 2: (13 points)
Read the description of the dataset “EuroPetStore.csv” in the pdf file provided to you.
Read the dataset in R studio and solve the answers below.
mydata = read.csv("EuroPetStore.csv", header=TRUE, sep=",")
head(mydata)
Answer the below by inserting your code and typing your answer following each question. Each question is graded as marked.
1. Does the data in “Fuel Volume” contain any outliers?. Show your calculations, and explain your answer (2pts)
#Identify Fuel Volume Variable
fuelvolume = mydata$Fuel.Volume
Upper_lim_fuelvolume = mean(fuelvolume)+3*sd(fuelvolume)
Upper_lim_fuelvolume
[1] 69834.69
lower_lim_fuelvolume = mean(fuelvolume)-3*sd(fuelvolume)
lower_lim_fuelvolume
[1] 55870.83
After finding the values of our upper and lower limits, I used conditional formatting in exel to highlight any outliers in the data, and then I scrolled through to see if any values were highlighted. No values are highlighted, and I manually double checked, of which I could find no outliers.
2. Draw a scatter plot between “Sales” and “Fuel Price”; make Sales the dependent variable. Clearly label the x- and y- axis (1pt)
sales = mydata$Sales
fuelprice = mydata$Fuel.Price
plot(fuelprice, sales, xlab='Price', ylab='Sales', main='Plot of Fuel Price vs Sales')

3. Calculate the correlation coefficient between “Sales” and “Temperature”. What can you tell about the relationship? (1pt)
temp = mydata$Temp
cor(temp, sales)
[1] 0.60106
4. Which of the following is a better predictor of “Sales” a) Fuel Price b) TV c) Radio or d) Temperature? And why? To answer this question, you need to create multiple models and compare them. You need to derive and display the summary of the results from the models; you need to compare the results and explain which of the four variables above is a better predictor of Sales and why; you need to write down the equation representation of the best predicting model; you need to explain the meaning of the coefficients in the equation of the best predicting model. (5pts)
TV = mydata$TV
radio = mydata$Radio
lm1= lm (sales ~ fuelprice)
summary(lm1)
Call:
lm(formula = sales ~ fuelprice)
Residuals:
Min 1Q Median 3Q Max
-4422 -1732 -235 2084 5124
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 10836.88 3212.67 3.373 0.001062 **
fuelprice 105.85 27.74 3.816 0.000237 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 2300 on 99 degrees of freedom
Multiple R-squared: 0.1282, Adjusted R-squared: 0.1194
F-statistic: 14.56 on 1 and 99 DF, p-value: 0.0002367
lm2 = lm(sales ~ TV)
summary(lm2)
Call:
lm(formula = sales ~ TV)
Residuals:
Min 1Q Median 3Q Max
-5144.2 -1740.8 4.2 1399.7 4906.2
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 22372.760 250.939 89.16 <2e-16 ***
TV 16.740 3.112 5.38 5e-07 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 2167 on 99 degrees of freedom
Multiple R-squared: 0.2262, Adjusted R-squared: 0.2184
F-statistic: 28.94 on 1 and 99 DF, p-value: 5.003e-07
lm3 = lm(sales ~ radio)
summary(lm3)
Call:
lm(formula = sales ~ radio)
Residuals:
Min 1Q Median 3Q Max
-4952.0 -1999.2 -46.5 1945.3 4644.5
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 22228.547 285.692 77.806 < 2e-16 ***
radio 10.379 2.234 4.646 1.04e-05 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 2232 on 99 degrees of freedom
Multiple R-squared: 0.179, Adjusted R-squared: 0.1707
F-statistic: 21.59 on 1 and 99 DF, p-value: 1.043e-05
lm4 = lm(sales ~ temp)
summary(lm4)
Call:
lm(formula = sales ~ temp)
Residuals:
Min 1Q Median 3Q Max
-5260.9 -1261.4 -208.5 1439.0 4618.6
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 18998.48 577.49 32.898 < 2e-16 ***
temp 226.47 30.26 7.483 3.02e-11 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 1968 on 99 degrees of freedom
Multiple R-squared: 0.3613, Adjusted R-squared: 0.3548
F-statistic: 56 on 1 and 99 DF, p-value: 3.019e-11
Based on our calculations, we can see that the model that is best fit and best predictor of sales is model 4, comparing sales and temperature. Although this is strange, it is the best correlation given our linear models. From it, we can derive the equation: sales = 18998.48+226.47*xtemp The first coefficient is the intercept of our model, which means that this is the starting point of our line. The second coefficient is the slope, or the amount by which sales will increase for every single increase in temperature that we have in our model.
6. Use the best predicting model from question 4, and calculate the error squared in the fitted/predicted “Sales” if the independent variable = 15 ?(1pt)
salespredict = 18998.48 + 226.47*(15)
salespredict
[1] 22395.53
error = salespredict - 26873
error
[1] -4477.47
errorsquared = error^2
errorsquared
[1] 20047738
7. Use the best predicting model from question 4, and predict the value of “Sales” if the independent variable = 33 (1pt)
salespredict2 = 18998.48 + 226.47*(33)
salespredict2
[1] 26471.99
8. The output of the model you have chosen always passes through the mean of x and y. Show calculations to prove this is true in this case (2pts)
mean(sales)
[1] 23063.73
mean(temp)
[1] 17.9505
proof = 18998.48+226.47*(17.9505)
proof
[1] 23063.73
Problem 3: (6 points)
A manufacturing company produces two types of desks, deluxe (X) and standard (Y). Each deluxe desk requires 2.5 hours to assemble, 3 hours for polishing, and 1 hour to package. Each standard desk requires 1 hour to assemble, 3 hours for polishing, and 2 hours to package. The firm can only do 20 hours for assembling, 30 hours for polishing, and 16 hours of packaging per week. Profit is $3 per deluxe and $4 per standard. The company needs to optimize the profit by deciding on how much to produce from each type of desks.
Answer the below by inserting your code and typing your answer following each question. Each question is graded as marked.
# Require will load the package only if not installed
# Dependencies = TRUE makes sure that dependencies are install
if(!require("lpSolveAPI",quietly = TRUE))
install.packages("lpSolveAPI",dependencies = TRUE, repos = "https://cloud.r-project.org")
1. What is the linear programming formulation of this problem? Define the decision variables, objective function, and constraints. (4pts)
# We start by creating an object with `0` constraint and `2` decision variables. The object name `lpdesk` is discretionary.
lpdesk <- make.lp(0, 2)
# Decision variables are X, which is number of X deluxe desks, and Y, which is number of standard desks produced. We will look to maximize Z. Maximizing profit, so objective function is Z = 3x+4y.
#Assembling Constraint = 2.5X + 1Y <= 20
#Polishing Constraint = 3X + 3Y <= 30
#Packaging Constraint = 1X + 2Y <= 16
#Non negativity constraints = X >= 0, Y >= 0
# Define type of optimization as maximum and to avoid the unnecessary screen outputs in the worksheet dump the screen output into a variable called `dump`
dump = lp.control(lpdesk, sense="max")
# Set the objective function with the proper coefficients associated with the decision variables
set.objfn(lpdesk, c(3, 4))
# add a constraint for the maximum allowed time budgets of 20 assembling hrs, 30 polish hrs, and 16 packaging hrs respectively. Then, non negativity constraints.
add.constraint(lpdesk, c(2.5, 1), "<=", 20)
add.constraint(lpdesk, c(3, 3), "<=", 30)
add.constraint(lpdesk, c(1, 2), "<=", 16)
add.constraint(lpdesk, c(1, 0), ">=", 0)
add.constraint(lpdesk, c(0, 1), ">=", 0)
2. Solve for the optimal solution. Write down the optimal values of the objective function and decision variables (2pts)
# View the problem formulation in tabular/matrix form
lpdesk
Model name:
C1 C2
Maximize 3 4
R1 2.5 1 <= 20
R2 3 3 <= 30
R3 1 2 <= 16
R4 1 0 >= 0
R5 0 1 >= 0
Kind Std Std
Type Real Real
Upper Inf Inf
Lower 0 0
# Solve
solve(lpdesk)
[1] 0
# Display the objective function optimum value
get.objective(lpdesk)
[1] 36
# Display the decision variables optimum values
get.variables(lpdesk)
[1] 4 6
Based on our model, it seems that the max profit we can attain given our constraints of time is a profit of $36. This is done by producing 4 deluxe and 6 standard desks.
LS0tDQp0aXRsZTogIkZpbmFsIEV4YW0iDQphdXRob3I6ICJVcmllbCBSZXllcyBWYXpxdWV6Ig0KZGF0ZTogIjQvMjkvMjAyMCINCm91dHB1dDoNCiAgaHRtbF9ub3RlYm9vazogZGVmYXVsdA0KICBodG1sX2RvY3VtZW50OiBkZWZhdWx0DQogIHBkZl9kb2N1bWVudDogZGVmYXVsdA0Kc3VidGl0bGU6IEJTQUQgMzQzLCBCdXNpbmVzcyBBbmFseXRpY3MsIFNwcmluZyAyMDIwDQotLS0NCg0KIyMjIEFib3V0IA0KQ2xlYXJseSBzaG93IGFuZCBvcmdhbml6ZSB5b3VyIHdvcmsuIEVhY2ggYW5zd2VyIHNob3VsZCBhcHBlYXIgYmVsb3cgdGhlIGNvcnJlc3BvbmRpbmcgcXVlc3Rpb24uIEJlIGNhcmVmdWwgbm90IHRvIG1vZGlmeSBleGlzdGluZyB0ZXh0IGFuZCBjb2RlLiBGb3IgbXVsdGlwbGUgY2hvaWNlIHF1ZXN0aW9ucyB5b3UgY2FuIHBsYWNlIGFuICh4KSBtYXJrIG5leHQgdG8gdGhlIHRleHQgdG8gbWFyayB5b3VyIHNlbGVjdGlvbi4gV2hlcmUgbmVjZXNzYXJ5IGV4ZWN1dGUgdGhlIGFscmVhZHkgaW5jbHVkZWQgIGNvZGUgY2h1bmssIGFuZCBhZGQgeW91cnMgdG8gcGVyZm9ybSByZXF1aXJlZCBjYWxjdWxhdGlvbnMuIEJlc3QgdG8gdmlldyBmaXJzdCBpbiBQcmV2aWV3IG1vZGUhDQoNCg0KIyMjIFByb2JsZW0gMTogKDYgcG9pbnRzKQ0KDQo8c3BhbiBzdHlsZT0iY29sb3I6cmVkIj4NCkFuc3dlciB0aGUgYmVsb3cgYnkgdHlwaW5nIHlvdXIgYW5zd2VyIGZvbGxvd2luZyBlYWNoIHF1ZXN0aW9uLiBFYWNoIHF1ZXN0aW9uIGlzIGdyYWRlZCBhcyBtYXJrZWQuIA0KPC9zcGFuPg0KDQoqKjEuCVdoaWNoIG9uZShzKSBvZiB0aGUgZm9sbG93aW5nIHN0YXRlbWVudHMgaXMoYXJlKSB0cnVlIHdpdGggcmVnYXJkcyB0byBhIHN0YXIgc2NoZW1hPyAoMXB0KSAqKg0KDQphLiBFYWNoIHRhYmxlIGhhcyB0byBoYXZlIGEgcHJpbWFyeSBrZXkNCg0KYi4gRmFjdCB0YWJsZSBpcyB0aGUgYmlnZ2VzdCB0cmFuc2FjdGlvbmFsIHRhYmxlDQoNCmMuIERpbWVuc2lvbiB0YWJsZXMgYXJlIGJlc3Qgc3VpdGVkIGZvciBjYXRlZ29yaWNhbCBkYXRhDQoNCmQuIEFsbCBkaW1lbnNpb24gdGFibGVzIGFyZSBjb25uZWN0ZWQgdG8gZmFjdCB0YWJsZQ0KDQplLiBBbGwgYWJvdmUgKHgpDQoNCioqMi4JQSBzZXQgb2YgZGF0YSBoYXMgYSBtZWRpYW4gbXVjaCBsYXJnZXIgdGhhbiB0aGUgbWVhbi4gV2hhdCBjYW4gd2Ugc2F5IGFib3V0IHRoZSBkYXRhIGRpc3RyaWJ1dGlvbj8gKDFwdCkqKg0KDQphLiBTa2V3IGxlZnQgKHgpDQoNCmIuIFN5bW1ldHJpY2FsCQkNCg0KYy4gU2tldyBSaWdodAkJDQoNCmQuIE5vcm1hbAkNCg0KDQoNCioqMy4JV2hpY2ggb2YgdGhlIGJlbG93IGlzIG5vdCBhIHN1aXRlZCBmb3JtYXQgZm9yIHRleHR1YWwgZGF0YT8gKDFwdCkqKg0KDQphLiBKU09OCQkNCg0KYi4gSFRNTAkJDQoNCmMuIEpQRUcJKHgpCQ0KDQpkLiBBU0NJSQkJDQoNCmUuIENTVg0KDQoJDQoqKjQuCVlvdSBhcmUgZ2l2ZW4gdGhlIGZvbGxvd2luZyBsaW5lYXIgcmVncmVzc2lvbiBtb2RlbCBkZXNjcmliaW5nIHRoZSBjb3N0IEMgb2YgaGVhdGluZyBiaWxsIGluICQgdmVyc3VzIHRoZSB0ZW1wZXJhdHVyZSBUIGluIEZhaHJlbmhlaXQ6IEMgPSAyVCArIDUwLiAgV2hhdCBhcmUgdGhlIHVuaXRzIG9mIHRoZSBpbnRlcmNlcHQgYW5kIHRoZSBzbG9wZT8gKDFwdCkqKg0KVGhlIGludGVyY2VwdCBhbmQgc2xvcGUgbXVzdCBhbHNvIGJlIGluIGRvbGxhcnMuIFRoaXMgaXMgYmVjYXVzZSBubyBtYXR0ZXIgd2hhdCB0aGUgVCAodGVtcGVyYXR1cmUpIGlzLCB3ZSB3aWxsIGNvbWUgb3V0IHRvIGEgQyB2YWx1ZSBpbiBkb2xsYXJzLCB0aGVyZWZvcmUgdGhlIGludGVyY2VwdCBhbmQgc2xvcGUgbXVzdCBiZSBpbiBkb2xsYXJzIGFzIHdlbGwgdG8gb3V0cHV0IHRoZSBkb2xsYXIgdmFsdWUgd2UgbmVlZCBmb3IgQy4gQWx0aG91Z2ggdGhlIFQgaXMgaW4gZGVncmVlcyBmYXJoZW5oZWl0LCB0aGlzIGlzIHRoZSBvbmx5IHZhcmlhYmxlIHRoYXQgd2lsbCBiZSBpbiBhIGRpZmZlcmVudCB1bml0LCBidXQgdGhlIHNsb3BlIGFuZCBpbnRlcmNlcHQgd2lsbCBiZSBkb2xsYXJzIHRvIGNvaW5jaWRlIHdpdGggQywgb3Igb3VyIG91dHB1dCB2YWx1ZS4NCg0KKio1LglUaGUgY2xvc2VyIGRhdGEgdmFsdWVzIGFyZSB0byB0aGUgbWVhbiwgdGhlIG1vcmUgcG90ZW50aWFsIGZvciBub2lzZSB0byBvY2N1ciAoMXB0KSoqDQoNCmEuIFRydWUgCQ0KDQpiLiBGYWxzZSAoeCkNCg0KKio2LglZb3UgYXJlIGdpdmVuIGEgZGF0YSBzZXQgd2l0aCAxMDAgZW50cmllcy4gVHdlbnR5IGVudHJpZXMgaGF2ZSB6ZXJvIHZhbHVlcy4gV2hlbiBkbyB3ZSB1c2UgdGhlIGZvcm11bGEgc3VtKGRhdGEpLzEwMCB0byBjb21wdXRlIHRoZSBhdmVyYWdlIG9mIHRoZSBkYXRhIHNldD8gKDFwdCkqKg0KDQphLiBXaGVuIHplcm8gdmFsdWVzIG1lYW4gdHJ1ZSB2YWx1ZXMgKHgpDQoNCmIuIFdoZW4gemVybyB2YWx1ZXMgcmVwcmVzZW50IG1pc3NpbmcgdmFsdWVzDQoNCmMuIFdoZW4gemVybyB2YWx1ZXMgbWVhbiB0cnVlIGFzIHdlbGwgYXMgbWlzc2luZyB2YWx1ZXMNCg0KZC4gTm9uZSBvZiB0aGUgYWJvdmUNCg0KDQoNCiMjIyBQcm9ibGVtIDI6ICgxMyBwb2ludHMpDQoNClJlYWQgdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBkYXRhc2V0ICJFdXJvUGV0U3RvcmUuY3N2IiBpbiB0aGUgcGRmIGZpbGUgcHJvdmlkZWQgdG8geW91Lg0KDQpSZWFkIHRoZSBkYXRhc2V0IGluIFIgc3R1ZGlvIGFuZCBzb2x2ZSB0aGUgYW5zd2VycyBiZWxvdy4gICANCg0KYGBge3J9DQpteWRhdGEgPSByZWFkLmNzdigiRXVyb1BldFN0b3JlLmNzdiIsIGhlYWRlcj1UUlVFLCBzZXA9IiwiKQ0KaGVhZChteWRhdGEpDQpgYGANCg0KDQo8c3BhbiBzdHlsZT0iY29sb3I6cmVkIj4NCkFuc3dlciB0aGUgYmVsb3cgYnkgaW5zZXJ0aW5nIHlvdXIgY29kZSBhbmQgdHlwaW5nIHlvdXIgYW5zd2VyIGZvbGxvd2luZyBlYWNoIHF1ZXN0aW9uLiBFYWNoIHF1ZXN0aW9uIGlzIGdyYWRlZCBhcyBtYXJrZWQuIA0KPC9zcGFuPg0KDQoqKjEuCURvZXMgdGhlIGRhdGEgaW4gIkZ1ZWwgVm9sdW1lIiBjb250YWluIGFueSBvdXRsaWVycz8uIFNob3cgeW91ciBjYWxjdWxhdGlvbnMsIGFuZCBleHBsYWluIHlvdXIgYW5zd2VyICgycHRzKSoqDQpgYGB7cn0NCiNJZGVudGlmeSBGdWVsIFZvbHVtZSBWYXJpYWJsZQ0KZnVlbHZvbHVtZSA9IG15ZGF0YSRGdWVsLlZvbHVtZQ0KI0NhbGN1bGF0ZSBmb3Igb3V0bGllcnMNClVwcGVyX2xpbV9mdWVsdm9sdW1lID0gbWVhbihmdWVsdm9sdW1lKSszKnNkKGZ1ZWx2b2x1bWUpDQpVcHBlcl9saW1fZnVlbHZvbHVtZQ0KbG93ZXJfbGltX2Z1ZWx2b2x1bWUgPSBtZWFuKGZ1ZWx2b2x1bWUpLTMqc2QoZnVlbHZvbHVtZSkNCmxvd2VyX2xpbV9mdWVsdm9sdW1lDQpgYGANCiBBZnRlciBmaW5kaW5nIHRoZSB2YWx1ZXMgb2Ygb3VyIHVwcGVyIGFuZCBsb3dlciBsaW1pdHMsIEkgdXNlZCBjb25kaXRpb25hbCBmb3JtYXR0aW5nIGluIGV4ZWwgdG8gaGlnaGxpZ2h0IGFueSBvdXRsaWVycyBpbiB0aGUgZGF0YSwgYW5kIHRoZW4gSSBzY3JvbGxlZCB0aHJvdWdoIHRvIHNlZSBpZiBhbnkgdmFsdWVzIHdlcmUgaGlnaGxpZ2h0ZWQuIE5vIHZhbHVlcyBhcmUgaGlnaGxpZ2h0ZWQsIGFuZCBJIG1hbnVhbGx5IGRvdWJsZSBjaGVja2VkLCBvZiB3aGljaCBJIGNvdWxkIGZpbmQgbm8gb3V0bGllcnMuDQogDQoNCioqMi4JRHJhdyBhIHNjYXR0ZXIgcGxvdCBiZXR3ZWVuICJTYWxlcyIgYW5kICJGdWVsIFByaWNlIjsgbWFrZSBTYWxlcyB0aGUgZGVwZW5kZW50IHZhcmlhYmxlLiBDbGVhcmx5IGxhYmVsIHRoZSB4LSBhbmQgeS0gYXhpcyAoMXB0KSoqDQpgYGB7cn0NCnNhbGVzID0gbXlkYXRhJFNhbGVzDQpmdWVscHJpY2UgPSBteWRhdGEkRnVlbC5QcmljZQ0KcGxvdChmdWVscHJpY2UsIHNhbGVzLCB4bGFiPSdQcmljZScsIHlsYWI9J1NhbGVzJywgbWFpbj0nUGxvdCBvZiBGdWVsIFByaWNlIHZzIFNhbGVzJykNCmBgYA0KDQoNCioqMy4JQ2FsY3VsYXRlIHRoZSBjb3JyZWxhdGlvbiBjb2VmZmljaWVudCBiZXR3ZWVuICJTYWxlcyIgYW5kICJUZW1wZXJhdHVyZSIuIFdoYXQgY2FuIHlvdSB0ZWxsIGFib3V0IHRoZSByZWxhdGlvbnNoaXA/ICgxcHQpKioNCmBgYHtyfQ0KdGVtcCA9IG15ZGF0YSRUZW1wDQpjb3IodGVtcCwgc2FsZXMpDQpgYGANCg0KDQoqKjQuCVdoaWNoIG9mIHRoZSBmb2xsb3dpbmcgaXMgYSBiZXR0ZXIgcHJlZGljdG9yIG9mIOKAnFNhbGVz4oCdIGEpIEZ1ZWwgUHJpY2UgYikgVFYgYykgUmFkaW8gb3IgZCkgVGVtcGVyYXR1cmU/IEFuZCB3aHk/IFRvIGFuc3dlciB0aGlzIHF1ZXN0aW9uLCB5b3UgbmVlZCB0byBjcmVhdGUgbXVsdGlwbGUgbW9kZWxzIGFuZCBjb21wYXJlIHRoZW0uIFlvdSBuZWVkIHRvIGRlcml2ZSBhbmQgZGlzcGxheSB0aGUgc3VtbWFyeSBvZiB0aGUgcmVzdWx0cyBmcm9tIHRoZSBtb2RlbHM7IHlvdSBuZWVkIHRvIGNvbXBhcmUgdGhlIHJlc3VsdHMgYW5kIGV4cGxhaW4gd2hpY2ggb2YgdGhlIGZvdXIgdmFyaWFibGVzIGFib3ZlIGlzIGEgYmV0dGVyIHByZWRpY3RvciBvZiBTYWxlcyBhbmQgd2h5OyB5b3UgbmVlZCB0byB3cml0ZSBkb3duIHRoZSBlcXVhdGlvbiByZXByZXNlbnRhdGlvbiBvZiB0aGUgYmVzdCBwcmVkaWN0aW5nIG1vZGVsOyB5b3UgbmVlZCB0byBleHBsYWluIHRoZSBtZWFuaW5nIG9mIHRoZSBjb2VmZmljaWVudHMgaW4gdGhlIGVxdWF0aW9uIG9mIHRoZSBiZXN0IHByZWRpY3RpbmcgbW9kZWwuICg1cHRzKSoqDQoNCmBgYHtyfQ0KVFYgPSBteWRhdGEkVFYNCnJhZGlvID0gbXlkYXRhJFJhZGlvDQpsbTE9IGxtIChzYWxlcyB+IGZ1ZWxwcmljZSkNCnN1bW1hcnkobG0xKQ0KDQpsbTIgPSBsbShzYWxlcyB+IFRWKQ0Kc3VtbWFyeShsbTIpDQoNCmxtMyA9IGxtKHNhbGVzIH4gcmFkaW8pDQpzdW1tYXJ5KGxtMykNCg0KbG00ID0gbG0oc2FsZXMgfiB0ZW1wKQ0Kc3VtbWFyeShsbTQpDQpgYGANCkJhc2VkIG9uIG91ciBjYWxjdWxhdGlvbnMsIHdlIGNhbiBzZWUgdGhhdCB0aGUgbW9kZWwgdGhhdCBpcyBiZXN0IGZpdCBhbmQgYmVzdCBwcmVkaWN0b3Igb2Ygc2FsZXMgaXMgbW9kZWwgNCwgY29tcGFyaW5nIHNhbGVzIGFuZCB0ZW1wZXJhdHVyZS4gQWx0aG91Z2ggdGhpcyBpcyBzdHJhbmdlLCBpdCBpcyB0aGUgYmVzdCBjb3JyZWxhdGlvbiBnaXZlbiBvdXIgbGluZWFyIG1vZGVscy4gRnJvbSBpdCwgd2UgY2FuIGRlcml2ZSB0aGUgZXF1YXRpb246DQpzYWxlcyA9IDE4OTk4LjQ4KzIyNi40Nyp4dGVtcA0KVGhlIGZpcnN0IGNvZWZmaWNpZW50IGlzIHRoZSBpbnRlcmNlcHQgb2Ygb3VyIG1vZGVsLCB3aGljaCBtZWFucyB0aGF0IHRoaXMgaXMgdGhlIHN0YXJ0aW5nIHBvaW50IG9mIG91ciBsaW5lLiBUaGUgc2Vjb25kIGNvZWZmaWNpZW50IGlzIHRoZSBzbG9wZSwgb3IgdGhlIGFtb3VudCBieSB3aGljaCBzYWxlcyB3aWxsIGluY3JlYXNlIGZvciBldmVyeSBzaW5nbGUgaW5jcmVhc2UgaW4gdGVtcGVyYXR1cmUgdGhhdCB3ZSBoYXZlIGluIG91ciBtb2RlbC4NCg0KKio2LglVc2UgdGhlIGJlc3QgcHJlZGljdGluZyBtb2RlbCBmcm9tIHF1ZXN0aW9uIDQsIGFuZCBjYWxjdWxhdGUgdGhlIGVycm9yIHNxdWFyZWQgaW4gdGhlIGZpdHRlZC9wcmVkaWN0ZWQgIlNhbGVzIiBpZiB0aGUgaW5kZXBlbmRlbnQgdmFyaWFibGUgPSAxNSA/KDFwdCkqKg0KDQpgYGB7cn0NCnNhbGVzcHJlZGljdCA9IDE4OTk4LjQ4ICsgMjI2LjQ3KigxNSkNCnNhbGVzcHJlZGljdA0KYGBgDQpgYGB7cn0NCmVycm9yID0gc2FsZXNwcmVkaWN0IC0gMjY4NzMNCmVycm9yDQplcnJvcnNxdWFyZWQgPSBlcnJvcl4yDQplcnJvcnNxdWFyZWQNCmBgYA0KDQoNCioqNy4JVXNlIHRoZSBiZXN0IHByZWRpY3RpbmcgbW9kZWwgZnJvbSBxdWVzdGlvbiA0LCBhbmQgcHJlZGljdCB0aGUgdmFsdWUgb2YgIlNhbGVzIiBpZiB0aGUgaW5kZXBlbmRlbnQgdmFyaWFibGUgPSAzMyAoMXB0KSoqDQoNCmBgYHtyfQ0Kc2FsZXNwcmVkaWN0MiA9IDE4OTk4LjQ4ICsgMjI2LjQ3KigzMykNCnNhbGVzcHJlZGljdDINCmBgYA0KDQoqKjguCVRoZSBvdXRwdXQgb2YgdGhlIG1vZGVsIHlvdSBoYXZlIGNob3NlbiBhbHdheXMgcGFzc2VzIHRocm91Z2ggdGhlIG1lYW4gb2YgeCBhbmQgeS4gIFNob3cgY2FsY3VsYXRpb25zIHRvIHByb3ZlIHRoaXMgaXMgdHJ1ZSBpbiB0aGlzIGNhc2UgKDJwdHMpKioNCmBgYHtyfQ0KbWVhbihzYWxlcykNCm1lYW4odGVtcCkNCmBgYA0KYGBge3J9DQpwcm9vZiA9IDE4OTk4LjQ4KzIyNi40NyooMTcuOTUwNSkNCnByb29mDQpgYGANCg0KDQojIyMgUHJvYmxlbSAzOiAoNiBwb2ludHMpDQoNCkEgbWFudWZhY3R1cmluZyBjb21wYW55IHByb2R1Y2VzIHR3byB0eXBlcyBvZiBkZXNrcywgZGVsdXhlIChYKSBhbmQgc3RhbmRhcmQgKFkpLiBFYWNoIGRlbHV4ZSBkZXNrIHJlcXVpcmVzIDIuNSBob3VycyB0byBhc3NlbWJsZSwgMyBob3VycyBmb3IgcG9saXNoaW5nLCBhbmQgMSBob3VyIHRvIHBhY2thZ2UuICBFYWNoIHN0YW5kYXJkIGRlc2sgcmVxdWlyZXMgMSBob3VyIHRvIGFzc2VtYmxlLCAzIGhvdXJzIGZvciBwb2xpc2hpbmcsIGFuZCAyIGhvdXJzIHRvIHBhY2thZ2UuICBUaGUgZmlybSBjYW4gb25seSBkbyAyMCBob3VycyBmb3IgYXNzZW1ibGluZywgMzAgaG91cnMgZm9yIHBvbGlzaGluZywgYW5kIDE2IGhvdXJzIG9mIHBhY2thZ2luZyBwZXIgd2Vlay4gIFByb2ZpdCBpcyAkMyBwZXIgZGVsdXhlIGFuZCAkNCBwZXIgc3RhbmRhcmQuIFRoZSBjb21wYW55IG5lZWRzIHRvIG9wdGltaXplIHRoZSBwcm9maXQgYnkgZGVjaWRpbmcgb24gaG93IG11Y2ggdG8gcHJvZHVjZSBmcm9tIGVhY2ggdHlwZSBvZiBkZXNrcy4gDQoNCjxzcGFuIHN0eWxlPSJjb2xvcjpyZWQiPg0KQW5zd2VyIHRoZSBiZWxvdyBieSBpbnNlcnRpbmcgeW91ciBjb2RlIGFuZCB0eXBpbmcgeW91ciBhbnN3ZXIgZm9sbG93aW5nIGVhY2ggcXVlc3Rpb24uIEVhY2ggcXVlc3Rpb24gaXMgZ3JhZGVkIGFzIG1hcmtlZC4gDQo8L3NwYW4+DQpgYGB7cn0NCiMgUmVxdWlyZSB3aWxsIGxvYWQgdGhlIHBhY2thZ2Ugb25seSBpZiBub3QgaW5zdGFsbGVkIA0KIyBEZXBlbmRlbmNpZXMgPSBUUlVFIG1ha2VzIHN1cmUgdGhhdCBkZXBlbmRlbmNpZXMgYXJlIGluc3RhbGwNCmlmKCFyZXF1aXJlKCJscFNvbHZlQVBJIixxdWlldGx5ID0gVFJVRSkpDQogIGluc3RhbGwucGFja2FnZXMoImxwU29sdmVBUEkiLGRlcGVuZGVuY2llcyA9IFRSVUUsIHJlcG9zID0gImh0dHBzOi8vY2xvdWQuci1wcm9qZWN0Lm9yZyIpDQpgYGANCg0KDQoqKjEuICBXaGF0IGlzIHRoZSBsaW5lYXIgcHJvZ3JhbW1pbmcgZm9ybXVsYXRpb24gb2YgdGhpcyBwcm9ibGVtPyBEZWZpbmUgdGhlIGRlY2lzaW9uIHZhcmlhYmxlcywgb2JqZWN0aXZlIGZ1bmN0aW9uLCBhbmQgY29uc3RyYWludHMuICg0cHRzKSoqDQpgYGB7cn0NCiMgV2Ugc3RhcnQgYnkgY3JlYXRpbmcgYW4gb2JqZWN0IHdpdGggYDBgIGNvbnN0cmFpbnQgYW5kIGAyYCBkZWNpc2lvbiB2YXJpYWJsZXMuDQpscGRlc2sgPC0gbWFrZS5scCgwLCAyKSANCg0KIyBEZWNpc2lvbiB2YXJpYWJsZXMgYXJlIFgsIHdoaWNoIGlzIG51bWJlciBvZiBYIGRlbHV4ZSBkZXNrcywgYW5kIFksIHdoaWNoIGlzIG51bWJlciBvZiBzdGFuZGFyZCBkZXNrcyBwcm9kdWNlZC4gV2Ugd2lsbCBsb29rIHRvIG1heGltaXplIFouIE1heGltaXppbmcgcHJvZml0LCBzbyBvYmplY3RpdmUgZnVuY3Rpb24gaXMgWiA9IDN4KzR5Lg0KDQojQXNzZW1ibGluZyBDb25zdHJhaW50ID0gMi41WCArIDFZIDw9IDIwDQojUG9saXNoaW5nIENvbnN0cmFpbnQgPSAzWCArIDNZIDw9IDMwDQojUGFja2FnaW5nIENvbnN0cmFpbnQgPSAxWCArIDJZIDw9IDE2DQojTm9uIG5lZ2F0aXZpdHkgY29uc3RyYWludHMgPSBYID49IDAsIFkgPj0gMA0KDQojIERlZmluZSB0eXBlIG9mIG9wdGltaXphdGlvbiBhcyBtYXhpbXVtIGFuZCB0byBhdm9pZCB0aGUgdW5uZWNlc3Nhcnkgc2NyZWVuIG91dHB1dHMgaW4gdGhlIHdvcmtzaGVldCBkdW1wIHRoZSBzY3JlZW4gb3V0cHV0IGludG8gYSB2YXJpYWJsZSBjYWxsZWQgYGR1bXBgDQpkdW1wID0gbHAuY29udHJvbChscGRlc2ssIHNlbnNlPSJtYXgiKQ0KIyBTZXQgdGhlIG9iamVjdGl2ZSBmdW5jdGlvbiB3aXRoIHRoZSBwcm9wZXIgY29lZmZpY2llbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGUgZGVjaXNpb24gdmFyaWFibGVzDQpzZXQub2JqZm4obHBkZXNrLCBjKDMsIDQpKQ0KDQojIGFkZCBhIGNvbnN0cmFpbnQgZm9yIHRoZSBtYXhpbXVtIGFsbG93ZWQgdGltZSBidWRnZXRzIG9mIDIwIGFzc2VtYmxpbmcgaHJzLCAzMCBwb2xpc2ggaHJzLCBhbmQgMTYgcGFja2FnaW5nIGhycyByZXNwZWN0aXZlbHkuIFRoZW4sIG5vbiBuZWdhdGl2aXR5IGNvbnN0cmFpbnRzLg0KYWRkLmNvbnN0cmFpbnQobHBkZXNrLCBjKDIuNSwgMSksICI8PSIsIDIwKQ0KYWRkLmNvbnN0cmFpbnQobHBkZXNrLCBjKDMsIDMpLCAiPD0iLCAzMCkNCmFkZC5jb25zdHJhaW50KGxwZGVzaywgYygxLCAyKSwgIjw9IiwgMTYpDQphZGQuY29uc3RyYWludChscGRlc2ssIGMoMSwgMCksICI+PSIsIDApDQphZGQuY29uc3RyYWludChscGRlc2ssIGMoMCwgMSksICI+PSIsIDApDQpgYGANCg0KDQoqKjIuICBTb2x2ZSBmb3IgdGhlIG9wdGltYWwgc29sdXRpb24uIFdyaXRlIGRvd24gdGhlIG9wdGltYWwgdmFsdWVzIG9mIHRoZSBvYmplY3RpdmUgZnVuY3Rpb24gYW5kIGRlY2lzaW9uIHZhcmlhYmxlcyAoMnB0cykqKg0KYGBge3J9DQojIFZpZXcgdGhlIHByb2JsZW0gZm9ybXVsYXRpb24gaW4gdGFidWxhci9tYXRyaXggZm9ybQ0KbHBkZXNrDQoNCiMgU29sdmUgDQpzb2x2ZShscGRlc2spIA0KDQojIERpc3BsYXkgdGhlIG9iamVjdGl2ZSBmdW5jdGlvbiBvcHRpbXVtIHZhbHVlDQpnZXQub2JqZWN0aXZlKGxwZGVzaykNCg0KIyBEaXNwbGF5IHRoZSBkZWNpc2lvbiB2YXJpYWJsZXMgb3B0aW11bSB2YWx1ZXMNCmdldC52YXJpYWJsZXMobHBkZXNrKSANCmBgYA0KQmFzZWQgb24gb3VyIG1vZGVsLCBpdCBzZWVtcyB0aGF0IHRoZSBtYXggcHJvZml0IHdlIGNhbiBhdHRhaW4gZ2l2ZW4gb3VyIGNvbnN0cmFpbnRzIG9mIHRpbWUgaXMgYSBwcm9maXQgb2YgJDM2LiBUaGlzIGlzIGRvbmUgYnkgcHJvZHVjaW5nIDQgZGVsdXhlIGFuZCA2IHN0YW5kYXJkIGRlc2tzLg0KDQo=