課本第四章習題:第7題、第8題、第9題、第12題、第13題

4.7

Suppose that we wish to predict whether a given stock will issue a dividend this year (“Yes” or “No”) based on \(X\), last year’s percent profit. We examine a large number of companies and discover that the mean value of \(X\) for companies that issued a dividend was \(\overline{X}\) = 10, while the mean for those that didn’t was \(\overline{X}\) = 0. In addition, the variance of X for these two sets of companies was \(\sigma^2\) = 36. Finally, 80 % of companies issued dividends. Assuming that X follows a normal distribution, predict the probability that a company will issue a dividend this year given that its percentage profit was \(X\) = 4 last year.

Hint: Recall that the density function for a normal random variable is \[f(x) = \frac{1}{\sqrt{2\pi\sigma^2}}e^{\frac{-(x-\mu)^2}{2\sigma^2}}\] You will need to use Bayes’ theorem.

(4.12)

x = 4
mean1 = 10
mean2 = 0
variance = 36
prior1 = 0.8
prior2 = 0.2
#fk1 = 1/sqrt(2*prior*variance)*exp(-(x-mean)^2 / 2*variance);fk1
fk1 = (prior1*exp(-(x-mean1)^2 / 2*variance))/(prior1*exp(-(x-mean1)^2 / 2*variance) + prior2*exp(-(x-mean2)^2 / 2*variance)) ; fk1
[1] 1.803211e-156

4.8

Suppose that we take a data set, divide it into equally-sized training and test sets, and then try out two different classification procedures. First we use logistic regression and get an error rate of 20 % on the training data and 30 % on the test data. Next we use 1-nearest neigh- bors (i.e. K = 1) and get an average error rate (averaged over both test and training data sets) of 18 %. Based on these results, which method should we prefer to use for classification of new observations? Why?

logistic是線性的、paramatric的,knn是非線性、non-paramatric的,knn不論在test或train中error rate都比logistic小,代表這份資料是適合使用knn這類型的方式。

4.9

This problem has to do with odds.

  1. On average, what fraction of people with an odds of 0.37 of defaulting on their credit card payment will in fact default?

\[odds = \frac {P(X)}{1-P(X)}\]

p = 0.37/(1+0.37);p
[1] 0.270073

由odds算出約有27%的人會違約

  1. Suppose that an individual has a 16 % chance of defaulting on her credit card payment. What are the odds that she will de- fault?
odds = 0.16/(1-0.16);odds
[1] 0.1904762

4.12

This problem involves writing functions. (a) Write a function, Power(), that prints out the result of raising 2 to the 3rd power. In other words, your function should compute \(2^3\) and print out the results. Hint: Recall that x^a raises x to the power a. Use the print() function to output the result.

power <- function(x){
  print (x^3)
}
  1. Create a new function, Power2(), that allows you to pass any two numbers, x and a, and prints out the value of x^a. You can do this by beginning your function with the line

    Power2=function(x,a){

You should be able to call your function by entering, for instance,

Power2(3,8)

on the command line. This should output the value of 38, namely, 6, 561.

power2 <- function(x,a){
  print(x^a)
}
  1. Using the Power2() function that you just wrote, compute \(10^3\), \(8^17\), and \(131^3\).
power2(10,3)
[1] 1000
power2(8,17)
[1] 2.2518e+15
power2(131,3)
[1] 2248091
  1. Now create a new function, Power3(), that actually returns the result x^a as an R object, rather than simply printing it to the screen. That is, if you store the value x^a in an object called result within your function, then you can simply return() this

    return()

result, using the following line:

return(result)

The line above should be the last line in your function, before the } symbol.

power3 <- function(x,a){
  result = x^a
  return(result)
}
  1. Now using the Power3() function, create a plot of f(x) = \(x^2\). The x-axis should display a range of integers from 1 to 10, and the y-axis should display \(x^2\). Label the axes appropriately, and use an appropriate title for the figure. Consider displaying either the x-axis, the y-axis, or both on the log-scale. You can do this by using log=‘‘x’’, log=‘‘y’’, or log=‘‘xy’’ as arguments to the plot() function.
x = c(1:10)
plot(x,power3(x, 2),xlab="Log of x",ylab="Log of x^2", main = "Log of x^2 vs Log of x",log = "xy")

  1. Create a function, PlotPower(), that allows you to create a plot of x against x^a for a fixed a and for a range of values of x. For instance, if you call

    PlotPower (1:10,3)

then a plot should be created with an x-axis taking on values 1, 2, . . . , 10, and a y-axis taking on values \(1^3\), \(2^3\), . . . , \(10^3\).

PlotPower<- function(x,a){
  yt = paste("Log of x^",a)
  maint = paste(yt,"vs Log of x")
  plot(x,power3(x, a),xlab="Log of x",ylab=yt, main = maint,log = "xy")
}
PlotPower(c(1:10),3)

4.13

Using the Boston data set, fit classification models in order to predict whether a given suburb has a crime rate above or below the median. Explore logistic regression, LDA, and KNN models using various sub- sets of the predictors. Describe your findings.

library(ISLR)
data(Boston)
summary(Boston$crim)
    Min.  1st Qu.   Median     Mean  3rd Qu.     Max. 
 0.00632  0.08204  0.25651  3.61352  3.67708 88.97620 
#median = 0.25651
Boston$below <- ifelse(Boston$crim > 0.25651,1,0)
Boston$below <-  as.factor(Boston$below)
# below = 1 :高於平均 / 0 : 低於平均
library(corrplot)
Boston$below <- as.numeric(Boston$below)
cor <- cor(Boston)
corrplot(cor)

set.seed(144)
library(caTools)
split = sample.split(Boston$below,SplitRatio = 0.7)
TR = subset(Boston,split == TRUE)
TS = subset(Boston,split == FALSE)
glm1 <- glm(below~zn+indus+nox+age+dis+rad+tax+black+lstat,TR,family = "binomial")#correlation高的
pred = predict(glm1, newdata=TS, type="response")
x = table(actual = TS$below,predict = pred > 0.5);x
      predict
actual FALSE TRUE
     0    67    9
     1     9   67
acc = sum(diag(x))/sum(x);acc
[1] 0.8815789
library(MASS)
lda1 <- lda(below~zn+indus+nox+age+dis+rad+tax+black+lstat,TR)
pred <- predict(lda1, TS)
x <- table(actual = TS$below , pred = pred$class);x
      pred
actual  0  1
     0 68  8
     1 16 60
acc = sum(diag(x))/sum(x) ; acc
[1] 0.8421053
library(class)
TR.X <- as.matrix(TR$below)
TS.X <- as.matrix(TS$below)
set.seed(1)
pred <- knn(TR.X,TS.X,TR$below, k = 1)
x <- table(pred = pred,actual = TS$below);x
    actual
pred  0  1
   0 76  0
   1  0 76
acc = sum(diag(x))/sum(x) ; acc
[1] 1

在同樣的predictor組合下,準確率是 knn(k=1) > logistic > lda,代表這份資料適合使用non-parametric,非線性的方法

LS0tDQp0aXRsZTogIlN0YXRpc3RpY2FsIGxlYXJuaW5nIEhXOCINCmF1dGhvcjogIk0wNzQwMjAwMTAg6Zmz6Z+75Y2JIg0Kb3V0cHV0Og0KICBodG1sX25vdGVib29rOiBkZWZhdWx0DQogIHdvcmRfZG9jdW1lbnQ6IGRlZmF1bHQNCi0tLQ0KDQroqrLmnKznrKzlm5vnq6Dnv5LpoYzvvJrnrKw36aGM44CB56ysOOmhjOOAgeesrDnpoYzjgIHnrKwxMumhjOOAgeesrDEz6aGMDQoNCg0KIyMgNC43DQpTdXBwb3NlIHRoYXQgd2Ugd2lzaCB0byBwcmVkaWN0IHdoZXRoZXIgYSBnaXZlbiBzdG9jayB3aWxsIGlzc3VlIGENCmRpdmlkZW5kIHRoaXMgeWVhciAo4oCcWWVz4oCdIG9yIOKAnE5v4oCdKSBiYXNlZCBvbiAkWCQsIGxhc3QgeWVhcuKAmXMgcGVyY2VudA0KcHJv76yBdC4gV2UgZXhhbWluZSBhIGxhcmdlIG51bWJlciBvZiBjb21wYW5pZXMgYW5kIGRpc2NvdmVyIHRoYXQgdGhlDQptZWFuIHZhbHVlIG9mICRYJCBmb3IgY29tcGFuaWVzIHRoYXQgaXNzdWVkIGEgZGl2aWRlbmQgd2FzICRcb3ZlcmxpbmV7WH0kID0gMTAsDQp3aGlsZSB0aGUgbWVhbiBmb3IgdGhvc2UgdGhhdCBkaWRu4oCZdCB3YXMgJFxvdmVybGluZXtYfSQgPSAwLiBJbiBhZGRpdGlvbiwgdGhlIHZhcmlhbmNlIG9mIFggZm9yIHRoZXNlIHR3byBzZXRzIG9mIGNvbXBhbmllcyB3YXMgJFxzaWdtYV4yJCA9IDM2LiBGaW5hbGx5LCA4MCAlIG9mIGNvbXBhbmllcyBpc3N1ZWQgZGl2aWRlbmRzLiBBc3N1bWluZyB0aGF0IFggZm9sbG93cyBhIG5vcm1hbCBkaXN0cmlidXRpb24sIHByZWRpY3QgdGhlIHByb2JhYmlsaXR5IHRoYXQgYSBjb21wYW55IHdpbGwgaXNzdWUNCmEgZGl2aWRlbmQgdGhpcyB5ZWFyIGdpdmVuIHRoYXQgaXRzIHBlcmNlbnRhZ2UgcHJv76yBdCB3YXMgJFgkID0gNCBsYXN0DQp5ZWFyLg0KDQpIaW50OiBSZWNhbGwgdGhhdCB0aGUgZGVuc2l0eSBmdW5jdGlvbiBmb3IgYSBub3JtYWwgcmFuZG9tIHZhcmlhYmxlDQppcyANCiQkZih4KSA9IFxmcmFjezF9e1xzcXJ0ezJccGlcc2lnbWFeMn19ZV57XGZyYWN7LSh4LVxtdSleMn17MlxzaWdtYV4yfX0kJCANCllvdSB3aWxsIG5lZWQgdG8gdXNlIEJheWVz4oCZIHRoZW9yZW0uPGJyPg0KDQohW10oLi8xLlBORykNCig0LjEyKQ0KDQpgYGB7cn0NCnggPSA0DQptZWFuMSA9IDEwDQptZWFuMiA9IDANCnZhcmlhbmNlID0gMzYNCnByaW9yMSA9IDAuOA0KcHJpb3IyID0gMC4yDQojZmsxID0gMS9zcXJ0KDIqcHJpb3IqdmFyaWFuY2UpKmV4cCgtKHgtbWVhbileMiAvIDIqdmFyaWFuY2UpO2ZrMQ0KZmsxID0gKHByaW9yMSpleHAoLSh4LW1lYW4xKV4yIC8gMip2YXJpYW5jZSkpLyhwcmlvcjEqZXhwKC0oeC1tZWFuMSleMiAvIDIqdmFyaWFuY2UpICsgcHJpb3IyKmV4cCgtKHgtbWVhbjIpXjIgLyAyKnZhcmlhbmNlKSkgOyBmazENCmBgYA0KDQoNCiMjIDQuOA0KDQpTdXBwb3NlIHRoYXQgd2UgdGFrZSBhIGRhdGEgc2V0LCBkaXZpZGUgaXQgaW50byBlcXVhbGx5LXNpemVkIHRyYWluaW5nDQphbmQgdGVzdCBzZXRzLCBhbmQgdGhlbiB0cnkgb3V0IHR3byBkae+sgGVyZW50IGNsYXNzae+sgWNhdGlvbiBwcm9jZWR1cmVzLg0KRmlyc3Qgd2UgdXNlIGxvZ2lzdGljIHJlZ3Jlc3Npb24gYW5kIGdldCBhbiBlcnJvciByYXRlIG9mIDIwICUgb24gdGhlDQp0cmFpbmluZyBkYXRhIGFuZCAzMCAlIG9uIHRoZSB0ZXN0IGRhdGEuIE5leHQgd2UgdXNlIDEtbmVhcmVzdCBuZWlnaC0NCmJvcnMgKGkuZS4gSyA9IDEpIGFuZCBnZXQgYW4gYXZlcmFnZSBlcnJvciByYXRlIChhdmVyYWdlZCBvdmVyIGJvdGgNCnRlc3QgYW5kIHRyYWluaW5nIGRhdGEgc2V0cykgb2YgMTggJS4gQmFzZWQgb24gdGhlc2UgcmVzdWx0cywgd2hpY2gNCm1ldGhvZCBzaG91bGQgd2UgcHJlZmVyIHRvIHVzZSBmb3IgY2xhc3Np76yBY2F0aW9uIG9mIG5ldyBvYnNlcnZhdGlvbnM/DQpXaHk/DQoNCmxvZ2lzdGlj5piv57ea5oCn55qE44CBcGFyYW1hdHJpY+eahO+8jGtubuaYr+mdnue3muaAp+OAgW5vbi1wYXJhbWF0cmlj55qE77yMa25u5LiN6KuW5ZyodGVzdOaIlnRyYWlu5LitZXJyb3IgcmF0ZemDveavlGxvZ2lzdGlj5bCP77yM5Luj6KGo6YCZ5Lu96LOH5paZ5piv6YGp5ZCI5L2/55Soa25u6YCZ6aGe5Z6L55qE5pa55byP44CCDQoNCiMjIDQuOQ0KVGhpcyBwcm9ibGVtIGhhcyB0byBkbyB3aXRoIG9kZHMuDQoNCihhKSBPbiBhdmVyYWdlLCB3aGF0IGZyYWN0aW9uIG9mIHBlb3BsZSB3aXRoIGFuIG9kZHMgb2YgMC4zNyBvZg0KZGVmYXVsdGluZyBvbiB0aGVpciBjcmVkaXQgY2FyZCBwYXltZW50IHdpbGwgaW4gZmFjdCBkZWZhdWx0Pw0KDQokJG9kZHMgPSBcZnJhYyB7UChYKX17MS1QKFgpfSQkDQoNCmBgYHtyfQ0KcCA9IDAuMzcvKDErMC4zNyk7cA0KYGBgDQrnlLFvZGRz566X5Ye657SE5pyJMjcl55qE5Lq65pyD6YGV57SEDQoNCihiKSBTdXBwb3NlIHRoYXQgYW4gaW5kaXZpZHVhbCBoYXMgYSAxNiAlIGNoYW5jZSBvZiBkZWZhdWx0aW5nIG9uDQpoZXIgY3JlZGl0IGNhcmQgcGF5bWVudC4gV2hhdCBhcmUgdGhlIG9kZHMgdGhhdCBzaGUgd2lsbCBkZS0NCmZhdWx0Pw0KDQpgYGB7cn0NCm9kZHMgPSAwLjE2LygxLTAuMTYpO29kZHMNCmBgYA0KDQoNCiMjIDQuMTINCg0KIFRoaXMgcHJvYmxlbSBpbnZvbHZlcyB3cml0aW5nIGZ1bmN0aW9ucy4NCihhKSBXcml0ZSBhIGZ1bmN0aW9uLCBQb3dlcigpLCB0aGF0IHByaW50cyBvdXQgdGhlIHJlc3VsdCBvZiByYWlzaW5nIDINCnRvIHRoZSAzcmQgcG93ZXIuIEluIG90aGVyIHdvcmRzLCB5b3VyIGZ1bmN0aW9uIHNob3VsZCBjb21wdXRlDQokMl4zJCBhbmQgcHJpbnQgb3V0IHRoZSByZXN1bHRzLg0KSGludDogUmVjYWxsIHRoYXQgeF5hIHJhaXNlcyB4IHRvIHRoZSBwb3dlciBhLiBVc2UgdGhlIHByaW50KCkNCmZ1bmN0aW9uIHRvIG91dHB1dCB0aGUgcmVzdWx0Lg0KDQpgYGB7cn0NCnBvd2VyIDwtIGZ1bmN0aW9uKHgpew0KICBwcmludCAoeF4zKQ0KfQ0KYGBgDQoNCg0KKGIpIENyZWF0ZSBhIG5ldyBmdW5jdGlvbiwgUG93ZXIyKCksIHRoYXQgYWxsb3dzIHlvdSB0byBwYXNzIGFueQ0KdHdvIG51bWJlcnMsIHggYW5kIGEsIGFuZCBwcmludHMgb3V0IHRoZSB2YWx1ZSBvZiB4XmEuIFlvdSBjYW4NCmRvIHRoaXMgYnkgYmVnaW5uaW5nIHlvdXIgZnVuY3Rpb24gd2l0aCB0aGUgbGluZQ0KDQogICAgUG93ZXIyPWZ1bmN0aW9uKHgsYSl7DQogICAgDQpZb3Ugc2hvdWxkIGJlIGFibGUgdG8gY2FsbCB5b3VyIGZ1bmN0aW9uIGJ5IGVudGVyaW5nLCBmb3IgaW5zdGFuY2UsDQoNCiAgICBQb3dlcjIoMyw4KQ0KDQpvbiB0aGUgY29tbWFuZCBsaW5lLiBUaGlzIHNob3VsZCBvdXRwdXQgdGhlIHZhbHVlIG9mIDM4LCBuYW1lbHksDQo2LCA1NjEuDQoNCmBgYHtyfQ0KcG93ZXIyIDwtIGZ1bmN0aW9uKHgsYSl7DQogIHByaW50KHheYSkNCn0NCmBgYA0KDQooYykgVXNpbmcgdGhlIFBvd2VyMigpIGZ1bmN0aW9uIHRoYXQgeW91IGp1c3Qgd3JvdGUsIGNvbXB1dGUgJDEwXjMkLA0KJDheMTckLCBhbmQgJDEzMV4zJC4NCg0KYGBge3J9DQpwb3dlcjIoMTAsMykNCnBvd2VyMig4LDE3KQ0KcG93ZXIyKDEzMSwzKQ0KYGBgDQoNCihkKSBOb3cgY3JlYXRlIGEgbmV3IGZ1bmN0aW9uLCBQb3dlcjMoKSwgdGhhdCBhY3R1YWxseSByZXR1cm5zIHRoZQ0KcmVzdWx0IHheYSBhcyBhbiBSIG9iamVjdCwgcmF0aGVyIHRoYW4gc2ltcGx5IHByaW50aW5nIGl0IHRvIHRoZQ0Kc2NyZWVuLiBUaGF0IGlzLCBpZiB5b3Ugc3RvcmUgdGhlIHZhbHVlIHheYSBpbiBhbiBvYmplY3QgY2FsbGVkDQpyZXN1bHQgd2l0aGluIHlvdXIgZnVuY3Rpb24sIHRoZW4geW91IGNhbiBzaW1wbHkgcmV0dXJuKCkgdGhpcw0KDQogICAgcmV0dXJuKCkNCg0KcmVzdWx0LCB1c2luZyB0aGUgZm9sbG93aW5nIGxpbmU6DQoNCiAgICByZXR1cm4ocmVzdWx0KQ0KDQpUaGUgbGluZSBhYm92ZSBzaG91bGQgYmUgdGhlIGxhc3QgbGluZSBpbiB5b3VyIGZ1bmN0aW9uLCBiZWZvcmUNCnRoZSB9IHN5bWJvbC4NCg0KYGBge3J9DQpwb3dlcjMgPC0gZnVuY3Rpb24oeCxhKXsNCiAgcmVzdWx0ID0geF5hDQogIHJldHVybihyZXN1bHQpDQp9DQpgYGANCg0KKGUpIE5vdyB1c2luZyB0aGUgUG93ZXIzKCkgZnVuY3Rpb24sIGNyZWF0ZSBhIHBsb3Qgb2YgZih4KSA9ICR4XjIkLg0KVGhlIHgtYXhpcyBzaG91bGQgZGlzcGxheSBhIHJhbmdlIG9mIGludGVnZXJzIGZyb20gMSB0byAxMCwgYW5kDQp0aGUgeS1heGlzIHNob3VsZCBkaXNwbGF5ICR4XjIkLiBMYWJlbCB0aGUgYXhlcyBhcHByb3ByaWF0ZWx5LCBhbmQNCnVzZSBhbiBhcHByb3ByaWF0ZSB0aXRsZSBmb3IgdGhlIO+sgWd1cmUuIENvbnNpZGVyIGRpc3BsYXlpbmcgZWl0aGVyDQp0aGUgeC1heGlzLCB0aGUgeS1heGlzLCBvciBib3RoIG9uIHRoZSBsb2ctc2NhbGUuIFlvdSBjYW4gZG8gdGhpcw0KYnkgdXNpbmcgbG9nPeKAmOKAmHjigJnigJksIGxvZz3igJjigJh54oCZ4oCZLCBvciBsb2c94oCY4oCYeHnigJnigJkgYXMgYXJndW1lbnRzIHRvDQp0aGUgcGxvdCgpIGZ1bmN0aW9uLg0KDQpgYGB7cn0NCnggPSBjKDE6MTApDQpwbG90KHgscG93ZXIzKHgsIDIpLHhsYWI9IkxvZyBvZiB4Iix5bGFiPSJMb2cgb2YgeF4yIiwgbWFpbiA9ICJMb2cgb2YgeF4yIHZzIExvZyBvZiB4Iixsb2cgPSAieHkiKQ0KDQpgYGANCg0KDQooZikgQ3JlYXRlIGEgZnVuY3Rpb24sIFBsb3RQb3dlcigpLCB0aGF0IGFsbG93cyB5b3UgdG8gY3JlYXRlIGEgcGxvdA0Kb2YgeCBhZ2FpbnN0IHheYSBmb3IgYSDvrIF4ZWQgYSBhbmQgZm9yIGEgcmFuZ2Ugb2YgdmFsdWVzIG9mIHguIEZvcg0KaW5zdGFuY2UsIGlmIHlvdSBjYWxsDQoNCiAgICBQbG90UG93ZXIgKDE6MTAsMykNCg0KdGhlbiBhIHBsb3Qgc2hvdWxkIGJlIGNyZWF0ZWQgd2l0aCBhbiB4LWF4aXMgdGFraW5nIG9uIHZhbHVlcw0KMSwgMiwgLiAuIC4gLCAxMCwgYW5kIGEgeS1heGlzIHRha2luZyBvbiB2YWx1ZXMgJDFeMyQsICQyXjMkLCAuIC4gLiAsICQxMF4zJC4NCg0KYGBge3J9DQpQbG90UG93ZXI8LSBmdW5jdGlvbih4LGEpew0KICB5dCA9IHBhc3RlKCJMb2cgb2YgeF4iLGEpDQogIG1haW50ID0gcGFzdGUoeXQsInZzIExvZyBvZiB4IikNCiAgcGxvdCh4LHBvd2VyMyh4LCBhKSx4bGFiPSJMb2cgb2YgeCIseWxhYj15dCwgbWFpbiA9IG1haW50LGxvZyA9ICJ4eSIpDQp9DQpgYGANCg0KDQpgYGB7cn0NClBsb3RQb3dlcihjKDE6MTApLDMpDQpgYGANCg0KIyMgNC4xMw0KDQpVc2luZyB0aGUgQm9zdG9uIGRhdGEgc2V0LCDvrIF0IGNsYXNzae+sgWNhdGlvbiBtb2RlbHMgaW4gb3JkZXIgdG8gcHJlZGljdA0Kd2hldGhlciBhIGdpdmVuIHN1YnVyYiBoYXMgYSBjcmltZSByYXRlIGFib3ZlIG9yIGJlbG93IHRoZSBtZWRpYW4uDQpFeHBsb3JlIGxvZ2lzdGljIHJlZ3Jlc3Npb24sIExEQSwgYW5kIEtOTiBtb2RlbHMgdXNpbmcgdmFyaW91cyBzdWItDQpzZXRzIG9mIHRoZSBwcmVkaWN0b3JzLiBEZXNjcmliZSB5b3VyIO+sgW5kaW5ncy4NCg0KYGBge3J9DQpsaWJyYXJ5KElTTFIpDQpkYXRhKEJvc3RvbikNCg0Kc3VtbWFyeShCb3N0b24kY3JpbSkNCg0KYGBgDQoNCmBgYHtyfQ0KI21lZGlhbiA9IDAuMjU2NTENCkJvc3RvbiRiZWxvdyA8LSBpZmVsc2UoQm9zdG9uJGNyaW0gPiAwLjI1NjUxLDEsMCkNCiMgYmVsb3cgPSAxIDrpq5jmlrzlubPlnYcgLyAwIDog5L2O5pa85bmz5Z2HDQpgYGANCg0KYGBge3J9DQpsaWJyYXJ5KGNvcnJwbG90KQ0KQm9zdG9uJGJlbG93IDwtIGFzLm51bWVyaWMoQm9zdG9uJGJlbG93KQ0KY29yIDwtIGNvcihCb3N0b24pDQpjb3JycGxvdChjb3IpDQpgYGANCg0KDQpgYGB7cn0NCnNldC5zZWVkKDE0NCkNCmxpYnJhcnkoY2FUb29scykNCkJvc3RvbiRiZWxvdyA8LSAgYXMuZmFjdG9yKEJvc3RvbiRiZWxvdykNCnNwbGl0ID0gc2FtcGxlLnNwbGl0KEJvc3RvbiRiZWxvdyxTcGxpdFJhdGlvID0gMC43KQ0KVFIgPSBzdWJzZXQoQm9zdG9uLHNwbGl0ID09IFRSVUUpDQpUUyA9IHN1YnNldChCb3N0b24sc3BsaXQgPT0gRkFMU0UpDQpgYGANCg0KYGBge3J9DQoNCmdsbTEgPC0gZ2xtKGJlbG93fnpuK2luZHVzK25veCthZ2UrZGlzK3JhZCt0YXgrYmxhY2srbHN0YXQsVFIsZmFtaWx5ID0gImJpbm9taWFsIikjY29ycmVsYXRpb27pq5jnmoQNCmBgYA0KDQoNCmBgYHtyfQ0KcHJlZCA9IHByZWRpY3QoZ2xtMSwgbmV3ZGF0YT1UUywgdHlwZT0icmVzcG9uc2UiKQ0KeCA9IHRhYmxlKGFjdHVhbCA9IFRTJGJlbG93LHByZWRpY3QgPSBwcmVkID4gMC41KTt4DQphY2MgPSBzdW0oZGlhZyh4KSkvc3VtKHgpO2FjYw0KYGBgDQoNCg0KYGBge3J9DQpsaWJyYXJ5KE1BU1MpDQpsZGExIDwtIGxkYShiZWxvd356bitpbmR1cytub3grYWdlK2RpcytyYWQrdGF4K2JsYWNrK2xzdGF0LFRSKQ0KYGBgDQoNCg0KYGBge3J9DQpwcmVkIDwtIHByZWRpY3QobGRhMSwgVFMpDQp4IDwtIHRhYmxlKGFjdHVhbCA9IFRTJGJlbG93ICwgcHJlZCA9IHByZWQkY2xhc3MpO3gNCmFjYyA9IHN1bShkaWFnKHgpKS9zdW0oeCkgOyBhY2MNCmBgYA0KDQpgYGB7cn0NCmxpYnJhcnkoY2xhc3MpDQpUUi5YIDwtIGFzLm1hdHJpeChUUiRiZWxvdykNClRTLlggPC0gYXMubWF0cml4KFRTJGJlbG93KQ0Kc2V0LnNlZWQoMSkNCnByZWQgPC0ga25uKFRSLlgsVFMuWCxUUiRiZWxvdywgayA9IDEpDQp4IDwtIHRhYmxlKHByZWQgPSBwcmVkLGFjdHVhbCA9IFRTJGJlbG93KTt4DQphY2MgPSBzdW0oZGlhZyh4KSkvc3VtKHgpIDsgYWNjDQpgYGANCg0K5Zyo5ZCM5qij55qEcHJlZGljdG9y57WE5ZCI5LiL77yM5rqW56K6546H5pivIGtubihrPTEpID4gbG9naXN0aWMgPiBsZGHvvIzku6PooajpgJnku73os4fmlpnpganlkIjkvb/nlKhub24tcGFyYW1ldHJpYyzpnZ7nt5rmgKfnmoTmlrnms5UNCg0K