Phillips 5.4 Q1-Q9
- Create the vector [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] in three ways: once using c(), once using a:b, and once using seq().
x<- c(1,2,3,4,5,6,7,8,9,10) #Using the c function
x
[1] 1 2 3 4 5 6 7 8 9 10
y<- 1:10 #Using the a:b function
y
[1] 1 2 3 4 5 6 7 8 9 10
z<- seq(from=1, to=10, by=1) #Using the seq function
z
[1] 1 2 3 4 5 6 7 8 9 10
zm<-seq(1,10) #You do not need to specify arguments within the code
zm
[1] 1 2 3 4 5 6 7 8 9 10
- Create the vector [2.1, 4.1, 6.1, 8.1] in two ways, once using c() and once using seq()
a<- c(2.1,4.1,6.1,8.1) #Using the c function
a
[1] 2.1 4.1 6.1 8.1
b<- seq(from= 2.1, to= 8.1, by= 2) #Using the seq function
b
[1] 2.1 4.1 6.1 8.1
- Create the vector [0, 5, 10, 15] in 3 ways: using c(), seq() with a by argument, and seq() with a length.out argument.
c<- c(0,5,10,15) #Using the c function
c
[1] 0 5 10 15
d<- seq(from= 0, to=15, by=5) #Using the seq function and by argument
d
[1] 0 5 10 15
e<- seq(from= 0, to= 15, length.out =4) #Using the seq function and length.out argument
e
[1] 0 5 10 15
The seq() with the by argument tells R to create the sequence once ever x amount of numbers. The seq() wit the length.out argument tells R to create the sequence with a total amount of x breaks.
- Create the vector [101, 102, 103, 200, 205, 210, 1000, 1100, 1200] using a combination of the c() and seq() functions
f<- c(seq(from= 101, to=103, by= 1), seq(from=200, to=210, length.out =3), seq(from= 1000, to=1200, by=100)) #Must add three different seq functions. Cannot combine all seq functions into one
f
[1] 101 102 103 200 205 210 1000 1100 1200
r<- seq(101,103)
m<-seq(200,210,5)
n<-seq(1000,1200,100)
o<-(c(r,m,n))
o
[1] 101 102 103 200 205 210 1000 1100 1200
I used both length.out and by arguments to show that it can be done with a combination and still yield the same results. The second set of codes is a bit longer but is an easier example to understand how to connect multiple vector function into one.
- A new batch of 100 pirates are boarding your ship and need new swords. You have 10 scimitars, 40 broadswords, and 50 cutlasses that you need to distribute evenly to the 100 pirates as they board. Create a vector of length 100 where there is 1 scimitar, 4 broadswords, and 5 cutlasses in each group of 10. That is, in the first 10 elements there should be exactly 1 scimitar, 4 broadswords and 5 cutlasses. The next 10 elements should also have the same number of each sword (and so on).
swords10 <- c(rep("s", times= 1), rep("b", times= 4), rep("c", times =5)) #setting up a function that gives 10 pirates the exact amount needed of each sword, where "s" stands for scimitars, "b" stands for broadswords, and "c" stands for "cutlasses"
swords10
[1] "s" "b" "b" "b" "b" "c" "c" "c" "c" "c"
swords100 <- rep(swords10, times=10) #setting up a function that repeats the previous function 10 times so all the pirates have a sword.
swords100
[1] "s" "b" "b" "b" "b" "c" "c" "c" "c" "c" "s" "b" "b" "b" "b" "c" "c"
[18] "c" "c" "c" "s" "b" "b" "b" "b" "c" "c" "c" "c" "c" "s" "b" "b" "b"
[35] "b" "c" "c" "c" "c" "c" "s" "b" "b" "b" "b" "c" "c" "c" "c" "c" "s"
[52] "b" "b" "b" "b" "c" "c" "c" "c" "c" "s" "b" "b" "b" "b" "c" "c" "c"
[69] "c" "c" "s" "b" "b" "b" "b" "c" "c" "c" "c" "c" "s" "b" "b" "b" "b"
[86] "c" "c" "c" "c" "c" "s" "b" "b" "b" "b" "c" "c" "c" "c" "c"
swords10 creates a vector with 10 swords and the right amount of each type per 10 pirates. swords100 repeats the previous vector 10 times to give all pirates swords. These are alternative ways of solving the problem:
swordstry2 <-rep(c(rep("s", times= 1), rep("b", times= 4), rep("c", times =5)), times=10)
swordstry2
[1] "s" "b" "b" "b" "b" "c" "c" "c" "c" "c" "s" "b" "b" "b" "b" "c" "c"
[18] "c" "c" "c" "s" "b" "b" "b" "b" "c" "c" "c" "c" "c" "s" "b" "b" "b"
[35] "b" "c" "c" "c" "c" "c" "s" "b" "b" "b" "b" "c" "c" "c" "c" "c" "s"
[52] "b" "b" "b" "b" "c" "c" "c" "c" "c" "s" "b" "b" "b" "b" "c" "c" "c"
[69] "c" "c" "s" "b" "b" "b" "b" "c" "c" "c" "c" "c" "s" "b" "b" "b" "b"
[86] "c" "c" "c" "c" "c" "s" "b" "b" "b" "b" "c" "c" "c" "c" "c"
In swordstry2, I joined the two previous codes into one string, To do that, I simply pasted the code for the swords10 vector into the rep() function used to create the swords100. This code is less wordy, but a little bit harder to understand at first.
swordstry3 <-rep(c("s","b","c"), c(1,4,5)) #This is a faster, easier to understand version of swords10.
swordstry3
[1] "s" "b" "b" "b" "b" "c" "c" "c" "c" "c"
swordstry4 <-c(rep(rep(c("s","b","c"), c(1,4,5)), times=10)) #This is swords 100 in an easier format.
swordstry4
[1] "s" "b" "b" "b" "b" "c" "c" "c" "c" "c" "s" "b" "b" "b" "b" "c" "c"
[18] "c" "c" "c" "s" "b" "b" "b" "b" "c" "c" "c" "c" "c" "s" "b" "b" "b"
[35] "b" "c" "c" "c" "c" "c" "s" "b" "b" "b" "b" "c" "c" "c" "c" "c" "s"
[52] "b" "b" "b" "b" "c" "c" "c" "c" "c" "s" "b" "b" "b" "b" "c" "c" "c"
[69] "c" "c" "s" "b" "b" "b" "b" "c" "c" "c" "c" "c" "s" "b" "b" "b" "b"
[86] "c" "c" "c" "c" "c" "s" "b" "b" "b" "b" "c" "c" "c" "c" "c"
swordstry5<- rep(c("scimitar","broadsword","cutlasses"),times=c(1,4,5))
swordstry6<-rep(swordstry5,length.out=100)
swordstry6
[1] "scimitar" "broadsword" "broadsword" "broadsword" "broadsword"
[6] "cutlasses" "cutlasses" "cutlasses" "cutlasses" "cutlasses"
[11] "scimitar" "broadsword" "broadsword" "broadsword" "broadsword"
[16] "cutlasses" "cutlasses" "cutlasses" "cutlasses" "cutlasses"
[21] "scimitar" "broadsword" "broadsword" "broadsword" "broadsword"
[26] "cutlasses" "cutlasses" "cutlasses" "cutlasses" "cutlasses"
[31] "scimitar" "broadsword" "broadsword" "broadsword" "broadsword"
[36] "cutlasses" "cutlasses" "cutlasses" "cutlasses" "cutlasses"
[41] "scimitar" "broadsword" "broadsword" "broadsword" "broadsword"
[46] "cutlasses" "cutlasses" "cutlasses" "cutlasses" "cutlasses"
[51] "scimitar" "broadsword" "broadsword" "broadsword" "broadsword"
[56] "cutlasses" "cutlasses" "cutlasses" "cutlasses" "cutlasses"
[61] "scimitar" "broadsword" "broadsword" "broadsword" "broadsword"
[66] "cutlasses" "cutlasses" "cutlasses" "cutlasses" "cutlasses"
[71] "scimitar" "broadsword" "broadsword" "broadsword" "broadsword"
[76] "cutlasses" "cutlasses" "cutlasses" "cutlasses" "cutlasses"
[81] "scimitar" "broadsword" "broadsword" "broadsword" "broadsword"
[86] "cutlasses" "cutlasses" "cutlasses" "cutlasses" "cutlasses"
[91] "scimitar" "broadsword" "broadsword" "broadsword" "broadsword"
[96] "cutlasses" "cutlasses" "cutlasses" "cutlasses" "cutlasses"
swordstry3 is an easier format in which the rep() function is only one, and the arguments for the repetition are given in two c() vectors. swordstry4 is the repetition of swordstry3 10 times.
6 Create a vector that repeats the integers from 1 to 5, 10 times. That is [1, 2, 3, 4, 5, 1, 2, 3, 4, 5, …]. The length of the vector should be 50!
g<- rep(1:5, times =10)
g
[1] 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5
[36] 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5
galt <- c(1:5)
galt
[1] 1 2 3 4 5
galt2 <- rep(galt, times =10) #wordier code but more clear to understand if I forget the gist of it
galt2
[1] 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5
[36] 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5
galt3<-rep(c(1,2,3,4,5),length.out=50)
galt3
[1] 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5
[36] 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5
galt is used within galt2 to create the same result as g did. The code is wordier, but it is easier to understand how the vectors come together
- Now, create the same vector as before, but this time repeat 1, 10 times, then 2, 10 times, etc., That is [1, 1, 1, …, 2, 2, 2, …, … 5, 5, 5]. The length of the vector should also be 50
h <- rep(c(1:5), each =10) #no need to put times =1 as a repeat of only once is understood
h
[1] 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 4 4 4 4 4
[36] 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5
w<-rep(c(1,2,3,4,5),each=10,length.out=50)
w
[1] 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 4 4 4 4 4
[36] 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5
This is the same function as galt2, except that the argument times is defaulted as one, and I have added the argument each=10 to repeat each number 10 times.
- Create a vector containing 50 samples from a Normal distribution with a population mean of 20 and standard deviation of 2.
i<- rnorm(50, mean= 20, sd=2)
i
[1] 18.83234 21.01646 19.82972 21.29045 18.81231 21.94318 18.84860
[8] 19.45026 21.72308 21.14108 18.00189 19.65106 17.80373 18.94642
[15] 20.22401 22.12111 23.72048 19.52390 19.02718 18.09501 22.84299
[22] 16.97512 20.41328 21.96479 18.96943 20.57759 17.81581 21.37442
[29] 22.09976 20.89112 21.92272 20.45444 20.90367 20.25653 17.51852
[36] 18.46248 20.28065 20.71817 22.93471 20.04638 21.88571 19.33634
[43] 22.07797 17.26762 23.67309 18.98197 20.10185 21.05183 22.72083
[50] 19.60263
- Create a vector containing 25 samples from a Uniform distribution with a lower bound of -100 and an upper bound of -50.
j<- runif(25, -100, -50) #I dont need to add min= and max=, since the function understands those arguments as implied in that order.
j
[1] -78.22388 -95.21501 -96.19566 -95.46194 -65.86185 -94.98939 -68.98670
[8] -87.11942 -64.96901 -59.96831 -79.39296 -59.20089 -59.83845 -78.76075
[15] -97.63543 -69.06691 -61.44043 -91.18795 -84.28111 -62.61370 -74.85105
[22] -96.76955 -70.47684 -53.02273 -96.20513
Drennan Ch.1
KRV <- data.frame(Area=c(12.8, 11.5, 14, 1.3, 10.3, 9.8, 2.3, 15.3, 11.2, 3.4, 12.8, 13.9, 9, 10.6, 9.9, 13.4, 8.7, 3.8, 11.7, 1.7, 12.3, 11, 2.9, 10.7, 7.4, 8.2, 2, 2.2, 4.5))
This is the data from the Drennan chapter. It needs to be run in the console before it can be used to create a histogram. I also loaded the data set called Scrapers
- Recreate the Kiskiminetas River Valley histogram in the chapter.Note the number of bins and how the bin members are decided. Is the cutoff at the bottom or top of the range? How can you adjust this?
KRV$Area #Subset only the area portion of the data frame in order to have a numeric value for the histogram
[1] 12.8 11.5 14.0 1.3 10.3 9.8 2.3 15.3 11.2 3.4 12.8 13.9 9.0 10.6
[15] 9.9 13.4 8.7 3.8 11.7 1.7 12.3 11.0 2.9 10.7 7.4 8.2 2.0 2.2
[29] 4.5
KRVhist<- hist(KRV$Area, main= "Areas of 29 Sites in the Kiskiminetas River Valley", xlab= "Area", breaks = c(1:16)) #Create a histogram. Making it an object and then running the object gives a breakdown summary of the histogram

KRVhist
$breaks
[1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
$counts
[1] 3 3 2 1 0 0 1 3 2 4 3 3 3 0 1
$density
[1] 0.10344828 0.10344828 0.06896552 0.03448276 0.00000000 0.00000000
[7] 0.03448276 0.10344828 0.06896552 0.13793103 0.10344828 0.10344828
[13] 0.10344828 0.00000000 0.03448276
$mids
[1] 1.5 2.5 3.5 4.5 5.5 6.5 7.5 8.5 9.5 10.5 11.5 12.5 13.5 14.5
[15] 15.5
$xname
[1] "KRV$Area"
$equidist
[1] TRUE
attr(,"class")
[1] "histogram"
This one has 12 bins and 16 breaks. I had to ensure the breaks were 16 for the histogram to have the same cuts as the one on the book. This histogram has the cutoff at the bottom of the bin, since the margin value is added to the next bin and not the preceding one. This is why the histogram is not exactly like the one in the book. By readjusting the argument, I can readjust the bin cutoff to be at the top of the bin.


The right=FALSE argument ensures the cells are left-closed intervals or cutoff at the top of the range
- Make two histogram of the scraper length data with different bin sizes. Do you notice anything different in the data distribution when you change the number of breaks?
Scrapers$Length #Subset only the length data to have numeric values and plot them on a histogram
[1] 25.8 6.3 44.6 21.3 25.7 20.6 22.2 10.5 18.9 25.9 23.8 22.0 10.6 33.2
[15] 16.8 21.8 48.3 15.8 39.4 43.5 39.8 16.3 40.5 91.7 21.7 17.9 29.3 39.1
[29] 42.5 49.6 13.7 19.1 40.6 49.1 41.7 15.2 21.2 30.2 40.0 20.2 31.9 42.3
[43] 47.2 50.5 10.6 23.1 44.1 45.8
Scrapershist <- hist(Scrapers$Length, main= "Scraper Lengths from Pine Ridge Cave and Willow Flats Site",xlab = "Scraper Length") #Create histogram. You can also run the object to find the breakdown of the histogram (i.e the breaks for the bins)

Scarperhist5 <- hist(Scrapers$Length, main= "Scraper Lengths 5 breaks",xlab = "Scraper Length", breaks= 5)

Scrapershist2 <- hist(Scrapers$Length, main= "Scraper Lengths 2 breaks",xlab = "Scraper Length", breaks= 2)

Scrapershit20 <- hist(Scrapers$Length,main= "Scraper Lengths 20 breaks",xlab = "Scraper Length", breaks= 20)

Alternative way to subset the data:
slength<- Scrapers[,3]
slength
[1] 25.8 6.3 44.6 21.3 25.7 20.6 22.2 10.5 18.9 25.9 23.8 22.0 10.6 33.2
[15] 16.8 21.8 48.3 15.8 39.4 43.5 39.8 16.3 40.5 91.7 21.7 17.9 29.3 39.1
[29] 42.5 49.6 13.7 19.1 40.6 49.1 41.7 15.2 21.2 30.2 40.0 20.2 31.9 42.3
[43] 47.2 50.5 10.6 23.1 44.1 45.8
hist(slength,main= "Scraper Lengths 48 breaks",xlab = "Scraper Length",breaks = 48)

hist(slength,main= "Scraper Lengths 30 breaks",xlab = "Scraper Length",breaks = 30)

LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQojIFBoaWxsaXBzIDQuNSBRMS1RNQoKMS4gQ3JlYXRlIGEgbmV3IFIgc2NyaXB0LiBVc2luZyBjb21tZW50cywgd3JpdGUgeW91ciBuYW1lLCB0aGUgZGF0ZSwgYW5kIOKAnFRlc3RpbmcgbXkgQ2hhcHRlciAyIFIgTWlnaHTigJ0gYXQgdGhlIHRvcCBvZiB0aGUgc2NyaXB0LgpgYGB7cn0KI1NpbHZhbmEgTW9udGFub2xhIAojSmFudWFyeSAyMgojVGVzdGluZyBteSBDaGFwdGVyIDIgUiBNaWdodAoKI01heWEgV2lsbGV5IDEvMjgvMjEgVGVzdGluZyBteSBjaGFwdGVyIDIgUiBNaWdodApgYGAKCjIuIFdoaWNoIChpZiBhbnkpIG9mIHRoZSBmb2xsb3dpbmcgb2JqZWN0cyBuYW1lcyBpcy9hcmUgaW52YWxpZD8KYGBge3J9CnRoaXNvbmUgPC0gMQpUSElTT05FIDwtIDIKIzFUaGlzIDwtIDMgI0ludmFsaWQgTmFtZS4gU3RhcnRzIHdpdGggMQp0aGlzLm9uZSA8LSA0ClRoaXMuMSA8LSA1ClRoSVMuLi4uLk9OLi4uRSA8LSA2CiNUaGlzIU9uIWUgPC0gNyAjSW52YWxpZCBuYW1lLkNvbnRhaW5zIGNoYXJhY3RlcnMgdGhhdCBhcmUgbm90IGFjY2VwdGVkCmxramFzZGZranNkZiA8LSA4IApgYGAKMVRoaXMgYW5kIFRoaXMhT24hZSBhcmUgaW52YWxpZCBvYmplY3QgbmFtZXMsIHNpbmNlIG9iamVjdCBuYW1lcyBjYW5ub3Qgc3RhcnQgd2l0aCBudW1iZXJzIG9yIGNvbnRhaW4gY2hhcmFjdGVycyBsaWtlICEKCjMuIDIwMTUgd2FzIGEgZ29vZCB5ZWFyIGZvciBwaXJhdGUgYm9vdHkgLSB5b3VyIHNoaXAgY29sbGVjdGVkIDEwMCw4MDAgZ29sZCBjb2lucy4gQ3JlYXRlIGFuIG9iamVjdCBjYWxsZWQgZ29sZC5pbi4yMDE1IGFuZCBhc3NpZ24gdGhlIGNvcnJlY3QgdmFsdWUgdG8gaXQuCmBgYHtyfQpnb2xkLmluLjIwMTUgPC0xMDA4MDAgI0RvIG5vdCB1c2UgLCBhcyBkaXZpZGVycyBpbiBudW1iZXJzCiNZb3UgbXVzdCBjcmVhdGUgdGhlIG9iamVjdCBhbmQgcnVuIHRoZSBjb2RlIGJlZm9yZSB5b3UgY2FuIHJlY2FsbCBpdCBpbiB0aGUgY29uc29sZSAKZ29sZC5pbi4yMDE1CmBgYAoKNC4gT29wcywgZHVyaW5nIHRoZSBsYXN0IGluc3BlY3Rpb24gd2UgZGlzY292ZXJlZCB0aGF0IG9uZSBvZiB5b3VyIHBpcmF0ZXMgU2tpcHB5IE1jR2VlIGhpZCA4MDAgZ29sZCBjb2lucyBpbiBoaXMgdW5kZXJ3ZWFyLiBHbyBhaGVhZCBhbmQgYWRkIHRob3NlIGdvbGQgY29pbnMgdG8gdGhlIG9iamVjdCBnb2xkLmluLjIwMTUuIE5leHQsIGNyZWF0ZSBhbiBvYmplY3QgY2FsbGVkIHBsYW5rLmxpc3Qgd2l0aCB0aGUgbmFtZSBvZiB0aGUgcGlyYXRlIHRoaWVmLgpgYGB7cn0KdiA8LWdvbGQuaW4uMjAxNSArIDgwMAojdW5jbGVhciBpZiBJIHNob3VsZCBjaGFuZ2UgdGhlIHZhcmlhYmxlcyB1bHRpbWF0ZSB2YWx1ZSBidXQgaXQgb25seSBzYXlzIHRvIGFkZCB0byB0aGUgb2JqZWN0IG5vdCBjb3JyZWN0IGl0cyB2YWx1ZQpnb2xkLmluLjIwMTUgPC0gZ29sZC5pbi4yMDE1ICsgODAwICM4MDAgY29pbnMgaGlkZGVuIGJ5IFNraXBweSBNY0dlZQpnb2xkLmluLjIwMTUKYGBgCmdvbGQuaW4uMjAxNSBub3cgaGFzIGEgZGlmZmVyZW50IHZhbHVlIHRoYW4gdGhlIHByZXZpb3VzIGNvZGUsIHNvIHJlY2FsbGluZyB0aGUgcHJldmlvdXMgY29kZSBuYW1lIHdpbGwgcHJvdmlkZSBtZSB3aXRoIGEgZGlzc2ltaWxhciB2YWx1ZS4gCmBgYHtyfQpwbGFuay5saXN0IDwtICJza2lwcHltY2dlZSIgI0Fsd2F5cyB1c2UgIiIgZm9yIHN0cmluZyBkYXRhLiBVc2VkIGFsbCBsb3dlcmNhc2Ugb24gbmFtZSB0byBwcmV2ZW50IGNhcGl0YWxpemF0aW9uIG1pc3Rha2VzCnBsYW5rLmxpc3QKYGBgCgo1LiBMb29rIGF0IHRoZSBjb2RlIGJlbG93LiBXaGF0IHdpbGwgUiByZXR1cm4gYWZ0ZXIgdGhlIHRoaXJkIGxpbmU/IE1ha2UgYSBwcmVkaWN0aW9uLCB0aGVuIHRlc3QgdGhlIGNvZGUgeW91cnNlbGYuCmEgPC0gMTAKYSArIDEwCmEKSSBwcmVkaWN0IHRoYXQgYWZ0ZXIgdGhlIHRoaXJkIGxpbmUsIFIgd2lsbCByZXR1cm4gYSBhcyAxMCwgc2luY2UgYSsxMCBkaWQgbm90IHJlYXNzaWduIGEgZGlmZmVyZW50IHZhbHVlIHRvIGEuCmBgYHtyfQphIDwtIDEwCmErMTAKYQpgYGAKTXkgcHJlZGljdGlvbiB3YXMgY29ycmVjdC4gQXMgUGhpbGxpcHMgc3RhdGVzLCBBU1NJR04gSVQgQUdBSU4gaWYgeW91IHdhbnQgdGhlIHZlY3RvciB0byBoYXZlIGEgZGlmZmVyZW50IHZhbHVlCgojIFBoaWxsaXBzIDUuNCBRMS1ROQoKMS4gQ3JlYXRlIHRoZSB2ZWN0b3IgWzEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwXSBpbiB0aHJlZSB3YXlzOiBvbmNlIHVzaW5nIGMoKSwgb25jZSB1c2luZyBhOmIsIGFuZCBvbmNlIHVzaW5nIHNlcSgpLgpgYGB7cn0KeDwtIGMoMSwyLDMsNCw1LDYsNyw4LDksMTApICNVc2luZyB0aGUgYyBmdW5jdGlvbgp4Cnk8LSAxOjEwICNVc2luZyB0aGUgYTpiIGZ1bmN0aW9uCnkKejwtIHNlcShmcm9tPTEsIHRvPTEwLCBieT0xKSAjVXNpbmcgdGhlIHNlcSBmdW5jdGlvbgp6CnptPC1zZXEoMSwxMCkgI1lvdSBkbyBub3QgbmVlZCB0byBzcGVjaWZ5IGFyZ3VtZW50cyB3aXRoaW4gdGhlIGNvZGUKem0KYGBgCgoyLiBDcmVhdGUgdGhlIHZlY3RvciBbMi4xLCA0LjEsIDYuMSwgOC4xXSBpbiB0d28gd2F5cywgb25jZSB1c2luZyBjKCkgYW5kIG9uY2UgdXNpbmcgc2VxKCkKYGBge3J9CmE8LSBjKDIuMSw0LjEsNi4xLDguMSkgI1VzaW5nIHRoZSBjIGZ1bmN0aW9uCmEKYjwtIHNlcShmcm9tPSAyLjEsIHRvPSA4LjEsIGJ5PSAyKSAjVXNpbmcgdGhlIHNlcSBmdW5jdGlvbgpiCmBgYAoKMy4gQ3JlYXRlIHRoZSB2ZWN0b3IgWzAsIDUsIDEwLCAxNV0gaW4gMyB3YXlzOiB1c2luZyBjKCksIHNlcSgpIHdpdGggYSBieSBhcmd1bWVudCwgYW5kIHNlcSgpIHdpdGggYSBsZW5ndGgub3V0IGFyZ3VtZW50LgpgYGB7cn0KYzwtIGMoMCw1LDEwLDE1KSAjVXNpbmcgdGhlIGMgZnVuY3Rpb24KYwpkPC0gc2VxKGZyb209IDAsIHRvPTE1LCBieT01KSAjVXNpbmcgdGhlIHNlcSBmdW5jdGlvbiBhbmQgYnkgYXJndW1lbnQKZAplPC0gc2VxKGZyb209IDAsIHRvPSAxNSwgbGVuZ3RoLm91dCA9NCkgI1VzaW5nIHRoZSBzZXEgZnVuY3Rpb24gYW5kIGxlbmd0aC5vdXQgYXJndW1lbnQKZQpgYGAKClRoZSBzZXEoKSB3aXRoIHRoZSBieSBhcmd1bWVudCB0ZWxscyBSIHRvIGNyZWF0ZSB0aGUgc2VxdWVuY2Ugb25jZSBldmVyIHggYW1vdW50IG9mIG51bWJlcnMuIFRoZSBzZXEoKSB3aXQgdGhlIGxlbmd0aC5vdXQgYXJndW1lbnQgdGVsbHMgUiB0byBjcmVhdGUgdGhlIHNlcXVlbmNlIHdpdGggYSB0b3RhbCBhbW91bnQgb2YgeCBicmVha3MuIAoKNC4gQ3JlYXRlIHRoZSB2ZWN0b3IgWzEwMSwgMTAyLCAxMDMsIDIwMCwgMjA1LCAyMTAsIDEwMDAsIDExMDAsIDEyMDBdIHVzaW5nIGEgY29tYmluYXRpb24gb2YgdGhlIGMoKSBhbmQgc2VxKCkgZnVuY3Rpb25zCmBgYHtyfQpmPC0gYyhzZXEoZnJvbT0gMTAxLCB0bz0xMDMsIGJ5PSAxKSwgc2VxKGZyb209MjAwLCB0bz0yMTAsIGxlbmd0aC5vdXQgPTMpLCBzZXEoZnJvbT0gMTAwMCwgdG89MTIwMCwgYnk9MTAwKSkgI011c3QgYWRkIHRocmVlIGRpZmZlcmVudCBzZXEgZnVuY3Rpb25zLiBDYW5ub3QgY29tYmluZSBhbGwgc2VxIGZ1bmN0aW9ucyBpbnRvIG9uZSAKZgpyPC0gc2VxKDEwMSwxMDMpCm08LXNlcSgyMDAsMjEwLDUpCm48LXNlcSgxMDAwLDEyMDAsMTAwKQpvPC0oYyhyLG0sbikpCm8KYGBgCkkgdXNlZCBib3RoIGxlbmd0aC5vdXQgYW5kIGJ5IGFyZ3VtZW50cyB0byBzaG93IHRoYXQgaXQgY2FuIGJlIGRvbmUgd2l0aCBhIGNvbWJpbmF0aW9uIGFuZCBzdGlsbCB5aWVsZCB0aGUgc2FtZSByZXN1bHRzLiAKVGhlIHNlY29uZCBzZXQgb2YgY29kZXMgaXMgYSBiaXQgbG9uZ2VyIGJ1dCBpcyBhbiBlYXNpZXIgZXhhbXBsZSB0byB1bmRlcnN0YW5kIGhvdyB0byBjb25uZWN0IG11bHRpcGxlIHZlY3RvciBmdW5jdGlvbiBpbnRvIG9uZS4gCgo1LiBBIG5ldyBiYXRjaCBvZiAxMDAgcGlyYXRlcyBhcmUgYm9hcmRpbmcgeW91ciBzaGlwIGFuZCBuZWVkIG5ldyBzd29yZHMuIApZb3UgaGF2ZSAxMCBzY2ltaXRhcnMsIDQwIGJyb2Fkc3dvcmRzLCBhbmQgNTAgY3V0bGFzc2VzIHRoYXQgeW91IG5lZWQgdG8gZGlzdHJpYnV0ZSBldmVubHkgdG8gdGhlIDEwMCBwaXJhdGVzIGFzIHRoZXkgYm9hcmQuIENyZWF0ZSBhIHZlY3RvciBvZiBsZW5ndGggMTAwIHdoZXJlIHRoZXJlIGlzIDEgc2NpbWl0YXIsIDQgYnJvYWRzd29yZHMsIGFuZCA1IGN1dGxhc3NlcyBpbiBlYWNoIGdyb3VwIG9mIDEwLiBUaGF0IGlzLCBpbiB0aGUgZmlyc3QgMTAgZWxlbWVudHMgdGhlcmUgc2hvdWxkIGJlIGV4YWN0bHkgMSBzY2ltaXRhciwgNCBicm9hZHN3b3JkcyBhbmQgNSBjdXRsYXNzZXMuIFRoZSBuZXh0IDEwIGVsZW1lbnRzIHNob3VsZCBhbHNvIGhhdmUgdGhlIHNhbWUgbnVtYmVyIG9mIGVhY2ggc3dvcmQgKGFuZCBzbyBvbikuCmBgYHtyfQpzd29yZHMxMCA8LSBjKHJlcCgicyIsIHRpbWVzPSAxKSwgcmVwKCJiIiwgdGltZXM9IDQpLCByZXAoImMiLCB0aW1lcyA9NSkpICNzZXR0aW5nIHVwIGEgZnVuY3Rpb24gdGhhdCBnaXZlcyAxMCBwaXJhdGVzIHRoZSBleGFjdCBhbW91bnQgbmVlZGVkIG9mIGVhY2ggc3dvcmQsIHdoZXJlICJzIiBzdGFuZHMgZm9yIHNjaW1pdGFycywgImIiIHN0YW5kcyBmb3IgYnJvYWRzd29yZHMsIGFuZCAiYyIgc3RhbmRzIGZvciAiY3V0bGFzc2VzIgpzd29yZHMxMApzd29yZHMxMDAgPC0gcmVwKHN3b3JkczEwLCB0aW1lcz0xMCkgI3NldHRpbmcgdXAgYSBmdW5jdGlvbiB0aGF0IHJlcGVhdHMgdGhlIHByZXZpb3VzIGZ1bmN0aW9uIDEwIHRpbWVzIHNvIGFsbCB0aGUgcGlyYXRlcyBoYXZlIGEgc3dvcmQuCnN3b3JkczEwMApgYGAKc3dvcmRzMTAgY3JlYXRlcyBhIHZlY3RvciB3aXRoIDEwIHN3b3JkcyBhbmQgdGhlIHJpZ2h0IGFtb3VudCBvZiBlYWNoIHR5cGUgcGVyIDEwIHBpcmF0ZXMuIHN3b3JkczEwMCByZXBlYXRzIHRoZSBwcmV2aW91cyB2ZWN0b3IgMTAgdGltZXMgdG8gZ2l2ZSBhbGwgcGlyYXRlcyBzd29yZHMuClRoZXNlIGFyZSBhbHRlcm5hdGl2ZSB3YXlzIG9mIHNvbHZpbmcgdGhlIHByb2JsZW06IApgYGB7cn0Kc3dvcmRzdHJ5MiA8LXJlcChjKHJlcCgicyIsIHRpbWVzPSAxKSwgcmVwKCJiIiwgdGltZXM9IDQpLCByZXAoImMiLCB0aW1lcyA9NSkpLCB0aW1lcz0xMCkKc3dvcmRzdHJ5MgpgYGAKSW4gc3dvcmRzdHJ5MiwgSSBqb2luZWQgdGhlIHR3byBwcmV2aW91cyBjb2RlcyBpbnRvIG9uZSBzdHJpbmcsIFRvIGRvIHRoYXQsIEkgc2ltcGx5IHBhc3RlZCB0aGUgY29kZSBmb3IgdGhlIHN3b3JkczEwIHZlY3RvciBpbnRvIHRoZSByZXAoKSBmdW5jdGlvbiB1c2VkIHRvIGNyZWF0ZSB0aGUgc3dvcmRzMTAwLiBUaGlzIGNvZGUgaXMgbGVzcyB3b3JkeSwgYnV0IGEgbGl0dGxlIGJpdCBoYXJkZXIgdG8gdW5kZXJzdGFuZCBhdCBmaXJzdC4gCgpgYGB7cn0Kc3dvcmRzdHJ5MyA8LXJlcChjKCJzIiwiYiIsImMiKSwgYygxLDQsNSkpICNUaGlzIGlzIGEgZmFzdGVyLCBlYXNpZXIgdG8gdW5kZXJzdGFuZCB2ZXJzaW9uIG9mIHN3b3JkczEwLiAKc3dvcmRzdHJ5Mwpzd29yZHN0cnk0IDwtYyhyZXAocmVwKGMoInMiLCJiIiwiYyIpLCBjKDEsNCw1KSksIHRpbWVzPTEwKSkgI1RoaXMgaXMgc3dvcmRzIDEwMCBpbiBhbiBlYXNpZXIgZm9ybWF0LiAKc3dvcmRzdHJ5NApzd29yZHN0cnk1PC0gcmVwKGMoInNjaW1pdGFyIiwiYnJvYWRzd29yZCIsImN1dGxhc3NlcyIpLHRpbWVzPWMoMSw0LDUpKQpzd29yZHN0cnk2PC1yZXAoc3dvcmRzdHJ5NSxsZW5ndGgub3V0PTEwMCkKc3dvcmRzdHJ5NgpgYGAKc3dvcmRzdHJ5MyBpcyBhbiBlYXNpZXIgZm9ybWF0IGluIHdoaWNoIHRoZSByZXAoKSBmdW5jdGlvbiBpcyBvbmx5IG9uZSwgYW5kIHRoZSBhcmd1bWVudHMgZm9yIHRoZSByZXBldGl0aW9uIGFyZSBnaXZlbiBpbiB0d28gYygpIHZlY3RvcnMuCnN3b3Jkc3RyeTQgaXMgdGhlIHJlcGV0aXRpb24gb2Ygc3dvcmRzdHJ5MyAxMCB0aW1lcy4KCjYgQ3JlYXRlIGEgdmVjdG9yIHRoYXQgcmVwZWF0cyB0aGUgaW50ZWdlcnMgZnJvbSAxIHRvIDUsIDEwIHRpbWVzLiBUaGF0IGlzIFsxLCAyLCAzLCA0LCA1LCAxLCAyLCAzLCA0LCA1LCDigKZdLiBUaGUgbGVuZ3RoIG9mIHRoZSB2ZWN0b3Igc2hvdWxkIGJlIDUwIQpgYGB7cn0KZzwtIHJlcCgxOjUsIHRpbWVzID0xMCkKZwpnYWx0IDwtIGMoMTo1KQpnYWx0CmdhbHQyIDwtIHJlcChnYWx0LCB0aW1lcyA9MTApICN3b3JkaWVyIGNvZGUgYnV0IG1vcmUgY2xlYXIgdG8gdW5kZXJzdGFuZCBpZiBJIGZvcmdldCB0aGUgZ2lzdCBvZiBpdApnYWx0MgpnYWx0MzwtcmVwKGMoMSwyLDMsNCw1KSxsZW5ndGgub3V0PTUwKQpnYWx0MwpgYGAKZ2FsdCBpcyB1c2VkIHdpdGhpbiBnYWx0MiB0byBjcmVhdGUgdGhlIHNhbWUgcmVzdWx0IGFzIGcgZGlkLiBUaGUgY29kZSBpcyB3b3JkaWVyLCBidXQgaXQgaXMgZWFzaWVyIHRvIHVuZGVyc3RhbmQgaG93IHRoZSB2ZWN0b3JzIGNvbWUgdG9nZXRoZXIKCjcuIE5vdywgY3JlYXRlIHRoZSBzYW1lIHZlY3RvciBhcyBiZWZvcmUsIGJ1dCB0aGlzIHRpbWUgcmVwZWF0IDEsIDEwIHRpbWVzLCB0aGVuIDIsIDEwIHRpbWVzLCBldGMuLCBUaGF0IGlzIFsxLCAxLCAxLCDigKYsIDIsIDIsIDIsIOKApiwg4oCmIDUsIDUsIDVdLiBUaGUgbGVuZ3RoIG9mIHRoZSB2ZWN0b3Igc2hvdWxkIGFsc28gYmUgNTAKYGBge3J9CmggPC0gcmVwKGMoMTo1KSwgZWFjaCA9MTApICNubyBuZWVkIHRvIHB1dCB0aW1lcyA9MSBhcyBhIHJlcGVhdCBvZiBvbmx5IG9uY2UgaXMgdW5kZXJzdG9vZApoCnc8LXJlcChjKDEsMiwzLDQsNSksZWFjaD0xMCxsZW5ndGgub3V0PTUwKQp3CmBgYApUaGlzIGlzIHRoZSBzYW1lIGZ1bmN0aW9uIGFzIGdhbHQyLCBleGNlcHQgdGhhdCB0aGUgYXJndW1lbnQgdGltZXMgaXMgZGVmYXVsdGVkIGFzIG9uZSwgYW5kIEkgaGF2ZSBhZGRlZCB0aGUgYXJndW1lbnQgZWFjaD0xMCB0byByZXBlYXQgZWFjaCBudW1iZXIgMTAgdGltZXMuIAoKOC4gQ3JlYXRlIGEgdmVjdG9yIGNvbnRhaW5pbmcgNTAgc2FtcGxlcyBmcm9tIGEgTm9ybWFsIGRpc3RyaWJ1dGlvbiB3aXRoIGEgcG9wdWxhdGlvbiBtZWFuIG9mIDIwIGFuZCBzdGFuZGFyZCBkZXZpYXRpb24gb2YgMi4KYGBge3J9Cmk8LSBybm9ybSg1MCwgbWVhbj0gMjAsIHNkPTIpCmkKYGBgCgo5LiBDcmVhdGUgYSB2ZWN0b3IgY29udGFpbmluZyAyNSBzYW1wbGVzIGZyb20gYSBVbmlmb3JtIGRpc3RyaWJ1dGlvbiB3aXRoIGEgbG93ZXIgYm91bmQgb2YgLTEwMCBhbmQgYW4gdXBwZXIgYm91bmQgb2YgLTUwLgpgYGB7cn0KajwtIHJ1bmlmKDI1LCAtMTAwLCAtNTApICNJIGRvbnQgbmVlZCB0byBhZGQgbWluPSBhbmQgbWF4PSwgc2luY2UgdGhlIGZ1bmN0aW9uIHVuZGVyc3RhbmRzIHRob3NlIGFyZ3VtZW50cyBhcyBpbXBsaWVkIGluIHRoYXQgb3JkZXIuCmoKYGBgCgojIERyZW5uYW4gQ2guMSAKYGBge3J9CktSViA8LSBkYXRhLmZyYW1lKEFyZWE9YygxMi44LCAxMS41LCAxNCwgMS4zLCAxMC4zLCA5LjgsIDIuMywgMTUuMywgMTEuMiwgMy40LCAxMi44LCAxMy45LCA5LCAxMC42LCA5LjksIDEzLjQsIDguNywgMy44LCAxMS43LCAxLjcsIDEyLjMsIDExLCAyLjksIDEwLjcsIDcuNCwgOC4yLCAyLCAyLjIsIDQuNSkpCmBgYApUaGlzIGlzIHRoZSBkYXRhIGZyb20gdGhlIERyZW5uYW4gY2hhcHRlci4gSXQgbmVlZHMgdG8gYmUgcnVuIGluIHRoZSBjb25zb2xlIGJlZm9yZSBpdCBjYW4gYmUgdXNlZCB0byBjcmVhdGUgYSBoaXN0b2dyYW0uIEkgYWxzbyBsb2FkZWQgdGhlIGRhdGEgc2V0IGNhbGxlZCBTY3JhcGVycyAKCgoxLiBSZWNyZWF0ZSB0aGUgS2lza2ltaW5ldGFzIFJpdmVyIFZhbGxleSBoaXN0b2dyYW0gaW4gdGhlIGNoYXB0ZXIuTm90ZSB0aGUgbnVtYmVyIG9mIGJpbnMgYW5kIGhvdyB0aGUgYmluIG1lbWJlcnMgYXJlIGRlY2lkZWQuIElzIHRoZSBjdXRvZmYgYXQgdGhlIGJvdHRvbSBvciB0b3Agb2YgdGhlIHJhbmdlPyBIb3cgY2FuIHlvdSBhZGp1c3QgdGhpcz8KYGBge3J9CktSViRBcmVhICNTdWJzZXQgb25seSB0aGUgYXJlYSBwb3J0aW9uIG9mIHRoZSBkYXRhIGZyYW1lIGluIG9yZGVyIHRvIGhhdmUgYSBudW1lcmljIHZhbHVlIGZvciB0aGUgaGlzdG9ncmFtCktSVmhpc3Q8LSBoaXN0KEtSViRBcmVhLCBtYWluPSAiQXJlYXMgb2YgMjkgU2l0ZXMgaW4gdGhlIEtpc2tpbWluZXRhcyBSaXZlciBWYWxsZXkiLCB4bGFiPSAiQXJlYSIsIGJyZWFrcyA9IGMoMToxNikpICNDcmVhdGUgYSBoaXN0b2dyYW0uIE1ha2luZyBpdCBhbiBvYmplY3QgYW5kIHRoZW4gcnVubmluZyB0aGUgb2JqZWN0IGdpdmVzIGEgYnJlYWtkb3duIHN1bW1hcnkgb2YgdGhlIGhpc3RvZ3JhbQpLUlZoaXN0CmBgYApUaGlzIG9uZSBoYXMgMTIgYmlucyBhbmQgMTYgYnJlYWtzLiBJIGhhZCB0byBlbnN1cmUgdGhlIGJyZWFrcyB3ZXJlIDE2IGZvciB0aGUgaGlzdG9ncmFtIHRvIGhhdmUgdGhlIHNhbWUgY3V0cyBhcyB0aGUgb25lIG9uIHRoZSBib29rLiBUaGlzIGhpc3RvZ3JhbSBoYXMgdGhlIGN1dG9mZiBhdCB0aGUgYm90dG9tIG9mIHRoZSBiaW4sIHNpbmNlIHRoZSBtYXJnaW4gdmFsdWUgaXMgYWRkZWQgdG8gdGhlIG5leHQgYmluIGFuZCBub3QgdGhlIHByZWNlZGluZyBvbmUuIFRoaXMgaXMgd2h5IHRoZSBoaXN0b2dyYW0gaXMgbm90IGV4YWN0bHkgbGlrZSB0aGUgb25lIGluIHRoZSBib29rLiBCeSByZWFkanVzdGluZyB0aGUgYXJndW1lbnQsIEkgY2FuIHJlYWRqdXN0IHRoZSBiaW4gY3V0b2ZmIHRvIGJlIGF0IHRoZSB0b3Agb2YgdGhlIGJpbi4gCmBgYHtyfQpLUlYxIDwtaGlzdChLUlYkQXJlYSwgbWFpbj0gIkFyZWFzIG9mIFNpdGVzIFJpZ2h0PVRydWUiLCB4bGFiPSAiQXJlYSIsYnJlYWtzID0gYygxOjE2KSwgcmlnaHQ9VFJVRSkKYGBgCmBgYHtyfQpLUlYyIDwtaGlzdChLUlYkQXJlYSwgbWFpbj0gIkFyZWFzIG9mIFNpdGVzIFJpZ2h0ID1GYWxzZSIsIHhsYWI9ICJBcmVhIiwgYnJlYWtzPWMoMToxNiksIHJpZ2h0PUZBTFNFKQpgYGAKVGhlIHJpZ2h0PUZBTFNFIGFyZ3VtZW50IGVuc3VyZXMgdGhlIGNlbGxzIGFyZSBsZWZ0LWNsb3NlZCBpbnRlcnZhbHMgb3IgY3V0b2ZmIGF0IHRoZSB0b3Agb2YgdGhlIHJhbmdlCgoyLiBNYWtlIHR3byBoaXN0b2dyYW0gb2YgdGhlIHNjcmFwZXIgbGVuZ3RoIGRhdGEgd2l0aCBkaWZmZXJlbnQgYmluIHNpemVzLiBEbyB5b3Ugbm90aWNlIGFueXRoaW5nIGRpZmZlcmVudCBpbiB0aGUgZGF0YSBkaXN0cmlidXRpb24gd2hlbiB5b3UgY2hhbmdlIHRoZSBudW1iZXIgb2YgYnJlYWtzPyAKCmBgYHtyfQpTY3JhcGVycyRMZW5ndGggI1N1YnNldCBvbmx5IHRoZSBsZW5ndGggZGF0YSB0byBoYXZlIG51bWVyaWMgdmFsdWVzIGFuZCBwbG90IHRoZW0gb24gYSBoaXN0b2dyYW0KU2NyYXBlcnNoaXN0IDwtIGhpc3QoU2NyYXBlcnMkTGVuZ3RoLCBtYWluPSAiU2NyYXBlciBMZW5ndGhzIGZyb20gUGluZSBSaWRnZSBDYXZlIGFuZCBXaWxsb3cgRmxhdHMgU2l0ZSIseGxhYiA9ICJTY3JhcGVyIExlbmd0aCIpICNDcmVhdGUgaGlzdG9ncmFtLiBZb3UgY2FuIGFsc28gcnVuIHRoZSBvYmplY3QgdG8gZmluZCB0aGUgYnJlYWtkb3duIG9mIHRoZSBoaXN0b2dyYW0gKGkuZSB0aGUgYnJlYWtzIGZvciB0aGUgYmlucykKU2NhcnBlcmhpc3Q1IDwtIGhpc3QoU2NyYXBlcnMkTGVuZ3RoLCBtYWluPSAiU2NyYXBlciBMZW5ndGhzIDUgYnJlYWtzIix4bGFiID0gIlNjcmFwZXIgTGVuZ3RoIiwgYnJlYWtzPSA1KQpTY3JhcGVyc2hpc3QyIDwtIGhpc3QoU2NyYXBlcnMkTGVuZ3RoLCBtYWluPSAiU2NyYXBlciBMZW5ndGhzIDIgYnJlYWtzIix4bGFiID0gIlNjcmFwZXIgTGVuZ3RoIiwgYnJlYWtzPSAyKQpTY3JhcGVyc2hpdDIwIDwtIGhpc3QoU2NyYXBlcnMkTGVuZ3RoLG1haW49ICJTY3JhcGVyIExlbmd0aHMgMjAgYnJlYWtzIix4bGFiID0gIlNjcmFwZXIgTGVuZ3RoIiwgYnJlYWtzPSAyMCkKYGBgCgpBbHRlcm5hdGl2ZSB3YXkgdG8gc3Vic2V0IHRoZSBkYXRhOiAKYGBge3J9CnNsZW5ndGg8LSBTY3JhcGVyc1ssM10Kc2xlbmd0aApoaXN0KHNsZW5ndGgsbWFpbj0gIlNjcmFwZXIgTGVuZ3RocyA0OCBicmVha3MiLHhsYWIgPSAiU2NyYXBlciBMZW5ndGgiLGJyZWFrcyA9IDQ4KQpoaXN0KHNsZW5ndGgsbWFpbj0gIlNjcmFwZXIgTGVuZ3RocyAzMCBicmVha3MiLHhsYWIgPSAiU2NyYXBlciBMZW5ndGgiLGJyZWFrcyA9IDMwKQpgYGAKCgoK