This is an R Markdown Notebook. When you execute code within the notebook, the results appear beneath the code.

Try executing this chunk by clicking the Run button within the chunk or by placing your cursor inside it and pressing Ctrl+Shift+Enter.

plot(cars)

typeof(cars)
ncol(cars);nrow(cars)
cars$speed
cars$dist
cars.fast <- filter(cars, speed >= 20)
cars.fast
typeof(cars.fast)

library(dplyr)

cars.speed <- select(cars, speed)
typeof(cars.speed)
names(cars.speed)

cars %>% filter(speed >= 10 & speed <= 20) %>% select(speed)


head(iris)
select(iris, contains("."))
select(iris, ends_with("Length"))
select(iris, everything())
select(iris, matches(".t.")) #RegEx
select(iris, one_of(c("Species", "Genus")))
select(iris, starts_with("Sepal"))
select(iris, Sepal.Length:Petal.Width)
select(iris, -Species)

first(cars)
last(cars)
nth(iris, 3)


cars
cars.sorted <- arrange(cars, desc(dist))
cars.sorted
cars

ncol(cars);nrow(cars)
dim(cars)
cars.unikalne <- distinct(cars)
dim(cars.unikalne)

top_n(cars,5)
sample_n(cars, 5)
sample_frac(cars, 0.2)
slice(cars, 10:20)

mutate(cars, time = dist / speed)
cars.SI <- transmute(cars, speed_kmh = speed / 1.609344, dist_km = dist / 1.609344)
cars.SI

group_by(cars, speed)

cars %>%
  filter(speed >= 10 & speed <= 15) %>%
  group_by(speed) %>% 
  summarise(srednia = mean(dist)) %>%
  arrange(desc(srednia))

summarise(cars, sum(dist))
sum(cars$dist)

dim(cars2c)
cars2r <- bind_rows(cars, cars)
cars2c <- bind_cols(cars, cars)
cars2c

Add a new chunk by clicking the Insert Chunk button on the toolbar or by pressing Ctrl+Alt+I.

When you save the notebook, an HTML file containing the code and output will be saved alongside it (click the Preview button or press Ctrl+Shift+K to preview the HTML file).

The preview shows you a rendered HTML copy of the contents of the editor. Consequently, unlike Knit, Preview does not run any R code chunks. Instead, the output of the chunk when it was last run in the editor is displayed.

d1 <- data.frame()
for(i in 1:10)
{
  values = rnorm(3)
  r <- c(i, values)
  d1 <- rbind(d1, r)
}
names(d1) <- c("i", "v1", "v2", "v3")
head(d1)

d2 <- data.frame()
for(i in 1:10)
{
  values = rnorm(3)
  #r <- c(i, values)
  r <- data.frame(i, values)
  d2 <- rbind(d2, r)
}
#names(d2) <- c("i", "v1", "v2", "v3")
head(d2)
tail(d2)

#wide -> long
d1.0 <- reshape(d1,
                varying = c("v1", "v2", "v3"), v.names="values",
                times=c("v1", "v2", "v3"), timevar="name",
                idvar="i",
                direction="long")
d1.0

#long -> wide
d2.0 <- d2
d2.0$name <- c("v1", "v2", "v3")
head(d2.0)
d2.1 <- reshape(d2.0, idvar="i", timevar = "name", direction = "wide")
d2.1

library(tidyr)
d1.a <- pivot_longer(d1, c(v1,v2,v3))
d1.a

d2.a <- d2
d2.a$name <- c("v1","v2","v3")
d2.a
d2.b <- pivot_wider(d2.a, id_cols = i, names_from = name, values_from = values)
d2.b


d3 <- data.frame()
for(i in 1:10)
{
  values = rnorm(3)
  #r <- c(i, values)
  r <- c(i, values)
  d3 <- rbind(d3, r)
}
names(d3) <- c("i", "v1", "v2", "v3")
head(d3)
tail(d3)
plot(x = iris$Sepal.Length, y = iris$Sepal.Width, xlab = "Sepal Length", ylab = "Sepal Width", main = "Sepal Length-Width")

library(ggplot2)
p <- ggplot(data = iris, aes(x = Sepal.Length, y = Sepal.Width))
p + geom_point(aes(color = Species, shape=Species)) + 
  xlab("Sepal Length") + ylab("Sepal Width") + ggtitle("Sepal Length-Width")

boxplot(Sepal.Length~Species, data = iris, xlab="Species", ylab="Sepal Length", main="iris boxplot")

b <- ggplot(data = iris, aes(x = Species, y = Sepal.Length))
b + geom_boxplot(aes(fill = Species)) + ylab("Sepal Length") + ggtitle("iris boxplot") + stat_summary(fun.y = mean, geom = "point", shape = 5, size = 4)

hist(iris$Sepal.Width, breaks = 12, xlab = "Sepal Width", ylab = "Frequency", main = "Histogram")
h <- ggplot(data = iris, aes(x = Sepal.Width))
h + geom_histogram(binwidth = 0.2, color = "black", aes(fill = Species)) + xlab("Sepal Width") + ylab("Frequency") + ggtitle("Histogram")

dh <- ggplot(data = iris, aes(x = Sepal.Width, fill=Species))
dh + geom_density(stat = "density", alpha = I(0.2)) + xlab("Sepal Width") + ylab("Frequency") + ggtitle("Histogram")

iris1 <- iris[sample(1:nrow(iris), 110),]
iris1.df <- data.frame(Species=c("setosa", "versicolor", "virginica"), max = c(50,50,50), min = c(20,25,30), v=c(30,40,45))
iris1.df

barplot(table(iris1$Species), col = "black", xlab = "Species", ylab = "Count", main = "Bar plot")
b1 <- ggplot(data = iris1, aes(x = Species))
b1 + geom_bar() + xlab("Species") + ylab("Count") + ggtitle("Bar plot") +
  geom_errorbar(data = iris1.df, aes(y = v, ymin = min, ymax = max), col="red", linetype="dashed")


q <- as.vector(table(iris1$Species))
q
qp <- cumsum(q) + q/2
qp
q.df <- data.frame(Species=c("sentosa", "versicolor", "virginica"), quantity = q, position = qp)
q.df

p1 <- ggplot(iris1, aes(x = factor(1), fill = Species)) +
  geom_bar(width = 1) +
  geom_text(data = q.df, aes(x = factor(1), y = position, label = quantity), size = 5) + labs(x = "", y = "")
p1
p1 + coord_polar(theta = "y")

#CZĘŚĆ NIEOMAWIANA W FILMIE
#Wykres liniowy
#install.packages("plyr")
library(plyr)
sepal.min <- ddply(iris, "Species", summarise, xval=min(Sepal.Length), yval=min(Sepal.Width))
sepal.max <- ddply(iris, "Species", summarise, xval=max(Sepal.Length), yval=max(Sepal.Width))
sepal <- rbind(sepal.min, sepal.max)
sepal 

ggplot(sepal, aes(x=xval, y=yval, group = Species, color=Species)) +
  geom_line(aes(linetype=Species), size = 1.2) +
  geom_point(aes(shape=Species), size = 4) +        
  scale_shape_manual(values=c(6, 5, 4)) +               
  scale_linetype_manual(values=c("dotdash", "solid", "dotted")) +
  xlab("Sepal Length") + ylab("Sepal Width") + ggtitle("Line plot of sepal length and width")

smooth <- ggplot(data=iris, aes(x=Sepal.Length, y=Sepal.Width, color=Species)) + 
  geom_point(aes(shape=Species), size=1.5) + xlab("Sepal Length") + ylab("Sepal Width") + 
  ggtitle("Scatterplot with smoothers")

smooth + geom_smooth(method="lm") #linear model
smooth + geom_smooth(method="loess") #local polynomial regression
smooth + geom_smooth(method="gam", formula= y~s(x, bs="cs")) #generalised additive model

#Podział na podwykresy
facet <- ggplot(data=iris, aes(Sepal.Length, y=Sepal.Width, color=Species)) + 
  geom_point(aes(shape=Species), size=1.5) + geom_smooth(method="lm") +
  xlab("Sepal Length") + ylab("Sepal Width") + ggtitle("Faceting")

facet + facet_grid(. ~ Species) #poziomo
facet + facet_grid(Species ~ .) #pionowo

#Wykres "wulkaniczny"
vol <- ggplot(data=iris, aes(x = Sepal.Length))
vol + stat_density(aes(ymax = ..density..,  ymin = -..density.., 
                       fill = Species, color = Species), 
                   geom = "ribbon", position = "identity") +
  facet_grid(. ~ Species) + coord_flip() + xlab("Sepal Length") 

#Wykres "rug plot"
ggplot(data=iris, aes(x=Sepal.Length, Petal.Length)) + geom_point() + 
  geom_rug(col="steelblue",alpha=0.1) + xlab("Sepal Length") + ylab("Petal Length")

#Mapa cieplna (heatmap)
library(reshape2)
dat <- iris[,1:4]
cor <- melt(cor(dat, use="p"))
head(cor)
heat <- ggplot(data=cor, aes(x=Var1, y=Var2, fill=value)) 
heat + geom_tile() + labs(x = "", y = "") + scale_fill_gradient2(limits=c(-1, 1))

#Zapis wykresu do pliku
plot <- ggplot(data=iris, aes(x=Sepal.Length, y=Sepal.Width)) + 
  geom_point(aes(shape=Species, color=Species))

setwd("d:\\TMP") #tylko na czas wykonywania bieżącego fragmentu (resetowane po jego zakończeniu)
ggsave("plot1.png")
ggsave(plot, file="plot2.png")
ggsave(plot, file="plot3.png", width=6, height=4)

#Wykres "bąbelkowy" - dane z pliku w sieci (przestępstwa z wstanach)
crime <- read.csv("http://datasets.flowingdata.com/crimeRatesByState2005.tsv", header=TRUE, sep="\t")
ggplot(data=crime, aes(x=murder, y=burglary, size=population, label=state),guide=FALSE)+
geom_point(color="white", fill="red", shape=21)+ scale_size_area(max_size = 15)+
scale_x_continuous(name="Murders per 1,000 population", limits=c(0,12))+
scale_y_continuous(name="Burglaries per 1,000 population", limits=c(0,1250))+
geom_text(size=2.5)+ theme_bw()
s0 <- ""
s <- "Uniwersytet Mikołaja KOpernika w Toruniu"
s1 <- s
s2 <- substring(s, 1, 11)

stri_isempty(s0)
stri_length(s); length(s);  nchar(s)
stri_length(s0); length(s0); nchar(s0)

s == s1
s1 == s0

stri_locale_get()

s > s1
s > s0
s1 > s2

stri_cmp(s2, s)
c(s1,s2,s,s0)
stri_sort(c(s1,s2,s,s0))

stri_paste("Uniwersytet", "Mikołaja", "Kopernika", sep = " ")

stri_dup("UMK", 3)
stri_trim("\tUMK ")

stri_pad("UMK", width=10, side="both")

toupper("Mikołaj"); stri_trans_toupper("Mikołaj")
stri_trans_char("uniwersytet mikołaja kopernika", "umk", "UMK")
stri_trans_char("załóźć gęślą jaźń", "żółćęśążźń", "zolcesazzn")

stri_sub(s, from = 13, to = 19)
stri_sub(s, -9) <- "w Bydgoszczy"
s

stri_extract_all_words(s)

stri_count_fixed(s, "aj")

endsWith(s, s2)
LS0tDQp0aXRsZTogIlIgTm90ZWJvb2siDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KDQpUaGlzIGlzIGFuIFtSIE1hcmtkb3duXShodHRwOi8vcm1hcmtkb3duLnJzdHVkaW8uY29tKSBOb3RlYm9vay4gV2hlbiB5b3UgZXhlY3V0ZSBjb2RlIHdpdGhpbiB0aGUgbm90ZWJvb2ssIHRoZSByZXN1bHRzIGFwcGVhciBiZW5lYXRoIHRoZSBjb2RlLiANCg0KVHJ5IGV4ZWN1dGluZyB0aGlzIGNodW5rIGJ5IGNsaWNraW5nIHRoZSAqUnVuKiBidXR0b24gd2l0aGluIHRoZSBjaHVuayBvciBieSBwbGFjaW5nIHlvdXIgY3Vyc29yIGluc2lkZSBpdCBhbmQgcHJlc3NpbmcgKkN0cmwrU2hpZnQrRW50ZXIqLiANCg0KYGBge3J9DQpwbG90KGNhcnMpDQoNCnR5cGVvZihjYXJzKQ0KbmNvbChjYXJzKTtucm93KGNhcnMpDQpjYXJzJHNwZWVkDQpjYXJzJGRpc3QNCmNhcnMuZmFzdCA8LSBmaWx0ZXIoY2Fycywgc3BlZWQgPj0gMjApDQpjYXJzLmZhc3QNCnR5cGVvZihjYXJzLmZhc3QpDQoNCmxpYnJhcnkoZHBseXIpDQoNCmNhcnMuc3BlZWQgPC0gc2VsZWN0KGNhcnMsIHNwZWVkKQ0KdHlwZW9mKGNhcnMuc3BlZWQpDQpuYW1lcyhjYXJzLnNwZWVkKQ0KDQpjYXJzICU+JSBmaWx0ZXIoc3BlZWQgPj0gMTAgJiBzcGVlZCA8PSAyMCkgJT4lIHNlbGVjdChzcGVlZCkNCg0KDQpoZWFkKGlyaXMpDQpzZWxlY3QoaXJpcywgY29udGFpbnMoIi4iKSkNCnNlbGVjdChpcmlzLCBlbmRzX3dpdGgoIkxlbmd0aCIpKQ0Kc2VsZWN0KGlyaXMsIGV2ZXJ5dGhpbmcoKSkNCnNlbGVjdChpcmlzLCBtYXRjaGVzKCIudC4iKSkgI1JlZ0V4DQpzZWxlY3QoaXJpcywgb25lX29mKGMoIlNwZWNpZXMiLCAiR2VudXMiKSkpDQpzZWxlY3QoaXJpcywgc3RhcnRzX3dpdGgoIlNlcGFsIikpDQpzZWxlY3QoaXJpcywgU2VwYWwuTGVuZ3RoOlBldGFsLldpZHRoKQ0Kc2VsZWN0KGlyaXMsIC1TcGVjaWVzKQ0KDQpmaXJzdChjYXJzKQ0KbGFzdChjYXJzKQ0KbnRoKGlyaXMsIDMpDQoNCg0KY2Fycw0KY2Fycy5zb3J0ZWQgPC0gYXJyYW5nZShjYXJzLCBkZXNjKGRpc3QpKQ0KY2Fycy5zb3J0ZWQNCmNhcnMNCg0KbmNvbChjYXJzKTtucm93KGNhcnMpDQpkaW0oY2FycykNCmNhcnMudW5pa2FsbmUgPC0gZGlzdGluY3QoY2FycykNCmRpbShjYXJzLnVuaWthbG5lKQ0KDQp0b3BfbihjYXJzLDUpDQpzYW1wbGVfbihjYXJzLCA1KQ0Kc2FtcGxlX2ZyYWMoY2FycywgMC4yKQ0Kc2xpY2UoY2FycywgMTA6MjApDQoNCm11dGF0ZShjYXJzLCB0aW1lID0gZGlzdCAvIHNwZWVkKQ0KY2Fycy5TSSA8LSB0cmFuc211dGUoY2Fycywgc3BlZWRfa21oID0gc3BlZWQgLyAxLjYwOTM0NCwgZGlzdF9rbSA9IGRpc3QgLyAxLjYwOTM0NCkNCmNhcnMuU0kNCg0KZ3JvdXBfYnkoY2Fycywgc3BlZWQpDQoNCmNhcnMgJT4lDQogIGZpbHRlcihzcGVlZCA+PSAxMCAmIHNwZWVkIDw9IDE1KSAlPiUNCiAgZ3JvdXBfYnkoc3BlZWQpICU+JSANCiAgc3VtbWFyaXNlKHNyZWRuaWEgPSBtZWFuKGRpc3QpKSAlPiUNCiAgYXJyYW5nZShkZXNjKHNyZWRuaWEpKQ0KDQpzdW1tYXJpc2UoY2Fycywgc3VtKGRpc3QpKQ0Kc3VtKGNhcnMkZGlzdCkNCg0KZGltKGNhcnMyYykNCmNhcnMyciA8LSBiaW5kX3Jvd3MoY2FycywgY2FycykNCmNhcnMyYyA8LSBiaW5kX2NvbHMoY2FycywgY2FycykNCmNhcnMyYw0KYGBgDQoNCkFkZCBhIG5ldyBjaHVuayBieSBjbGlja2luZyB0aGUgKkluc2VydCBDaHVuayogYnV0dG9uIG9uIHRoZSB0b29sYmFyIG9yIGJ5IHByZXNzaW5nICpDdHJsK0FsdCtJKi4NCg0KV2hlbiB5b3Ugc2F2ZSB0aGUgbm90ZWJvb2ssIGFuIEhUTUwgZmlsZSBjb250YWluaW5nIHRoZSBjb2RlIGFuZCBvdXRwdXQgd2lsbCBiZSBzYXZlZCBhbG9uZ3NpZGUgaXQgKGNsaWNrIHRoZSAqUHJldmlldyogYnV0dG9uIG9yIHByZXNzICpDdHJsK1NoaWZ0K0sqIHRvIHByZXZpZXcgdGhlIEhUTUwgZmlsZSkuDQoNClRoZSBwcmV2aWV3IHNob3dzIHlvdSBhIHJlbmRlcmVkIEhUTUwgY29weSBvZiB0aGUgY29udGVudHMgb2YgdGhlIGVkaXRvci4gQ29uc2VxdWVudGx5LCB1bmxpa2UgKktuaXQqLCAqUHJldmlldyogZG9lcyBub3QgcnVuIGFueSBSIGNvZGUgY2h1bmtzLiBJbnN0ZWFkLCB0aGUgb3V0cHV0IG9mIHRoZSBjaHVuayB3aGVuIGl0IHdhcyBsYXN0IHJ1biBpbiB0aGUgZWRpdG9yIGlzIGRpc3BsYXllZC4NCg0KYGBge3J9DQpkMSA8LSBkYXRhLmZyYW1lKCkNCmZvcihpIGluIDE6MTApDQp7DQogIHZhbHVlcyA9IHJub3JtKDMpDQogIHIgPC0gYyhpLCB2YWx1ZXMpDQogIGQxIDwtIHJiaW5kKGQxLCByKQ0KfQ0KbmFtZXMoZDEpIDwtIGMoImkiLCAidjEiLCAidjIiLCAidjMiKQ0KaGVhZChkMSkNCg0KZDIgPC0gZGF0YS5mcmFtZSgpDQpmb3IoaSBpbiAxOjEwKQ0Kew0KICB2YWx1ZXMgPSBybm9ybSgzKQ0KICAjciA8LSBjKGksIHZhbHVlcykNCiAgciA8LSBkYXRhLmZyYW1lKGksIHZhbHVlcykNCiAgZDIgPC0gcmJpbmQoZDIsIHIpDQp9DQojbmFtZXMoZDIpIDwtIGMoImkiLCAidjEiLCAidjIiLCAidjMiKQ0KaGVhZChkMikNCnRhaWwoZDIpDQoNCiN3aWRlIC0+IGxvbmcNCmQxLjAgPC0gcmVzaGFwZShkMSwNCiAgICAgICAgICAgICAgICB2YXJ5aW5nID0gYygidjEiLCAidjIiLCAidjMiKSwgdi5uYW1lcz0idmFsdWVzIiwNCiAgICAgICAgICAgICAgICB0aW1lcz1jKCJ2MSIsICJ2MiIsICJ2MyIpLCB0aW1ldmFyPSJuYW1lIiwNCiAgICAgICAgICAgICAgICBpZHZhcj0iaSIsDQogICAgICAgICAgICAgICAgZGlyZWN0aW9uPSJsb25nIikNCmQxLjANCg0KI2xvbmcgLT4gd2lkZQ0KZDIuMCA8LSBkMg0KZDIuMCRuYW1lIDwtIGMoInYxIiwgInYyIiwgInYzIikNCmhlYWQoZDIuMCkNCmQyLjEgPC0gcmVzaGFwZShkMi4wLCBpZHZhcj0iaSIsIHRpbWV2YXIgPSAibmFtZSIsIGRpcmVjdGlvbiA9ICJ3aWRlIikNCmQyLjENCg0KbGlicmFyeSh0aWR5cikNCmQxLmEgPC0gcGl2b3RfbG9uZ2VyKGQxLCBjKHYxLHYyLHYzKSkNCmQxLmENCg0KZDIuYSA8LSBkMg0KZDIuYSRuYW1lIDwtIGMoInYxIiwidjIiLCJ2MyIpDQpkMi5hDQpkMi5iIDwtIHBpdm90X3dpZGVyKGQyLmEsIGlkX2NvbHMgPSBpLCBuYW1lc19mcm9tID0gbmFtZSwgdmFsdWVzX2Zyb20gPSB2YWx1ZXMpDQpkMi5iDQoNCg0KZDMgPC0gZGF0YS5mcmFtZSgpDQpmb3IoaSBpbiAxOjEwKQ0Kew0KICB2YWx1ZXMgPSBybm9ybSgzKQ0KICAjciA8LSBjKGksIHZhbHVlcykNCiAgciA8LSBjKGksIHZhbHVlcykNCiAgZDMgPC0gcmJpbmQoZDMsIHIpDQp9DQpuYW1lcyhkMykgPC0gYygiaSIsICJ2MSIsICJ2MiIsICJ2MyIpDQpoZWFkKGQzKQ0KdGFpbChkMykNCmBgYA0KDQpgYGB7cn0NCnBsb3QoeCA9IGlyaXMkU2VwYWwuTGVuZ3RoLCB5ID0gaXJpcyRTZXBhbC5XaWR0aCwgeGxhYiA9ICJTZXBhbCBMZW5ndGgiLCB5bGFiID0gIlNlcGFsIFdpZHRoIiwgbWFpbiA9ICJTZXBhbCBMZW5ndGgtV2lkdGgiKQ0KDQpsaWJyYXJ5KGdncGxvdDIpDQpwIDwtIGdncGxvdChkYXRhID0gaXJpcywgYWVzKHggPSBTZXBhbC5MZW5ndGgsIHkgPSBTZXBhbC5XaWR0aCkpDQpwICsgZ2VvbV9wb2ludChhZXMoY29sb3IgPSBTcGVjaWVzLCBzaGFwZT1TcGVjaWVzKSkgKyANCiAgeGxhYigiU2VwYWwgTGVuZ3RoIikgKyB5bGFiKCJTZXBhbCBXaWR0aCIpICsgZ2d0aXRsZSgiU2VwYWwgTGVuZ3RoLVdpZHRoIikNCg0KYm94cGxvdChTZXBhbC5MZW5ndGh+U3BlY2llcywgZGF0YSA9IGlyaXMsIHhsYWI9IlNwZWNpZXMiLCB5bGFiPSJTZXBhbCBMZW5ndGgiLCBtYWluPSJpcmlzIGJveHBsb3QiKQ0KDQpiIDwtIGdncGxvdChkYXRhID0gaXJpcywgYWVzKHggPSBTcGVjaWVzLCB5ID0gU2VwYWwuTGVuZ3RoKSkNCmIgKyBnZW9tX2JveHBsb3QoYWVzKGZpbGwgPSBTcGVjaWVzKSkgKyB5bGFiKCJTZXBhbCBMZW5ndGgiKSArIGdndGl0bGUoImlyaXMgYm94cGxvdCIpICsgc3RhdF9zdW1tYXJ5KGZ1bi55ID0gbWVhbiwgZ2VvbSA9ICJwb2ludCIsIHNoYXBlID0gNSwgc2l6ZSA9IDQpDQoNCmhpc3QoaXJpcyRTZXBhbC5XaWR0aCwgYnJlYWtzID0gMTIsIHhsYWIgPSAiU2VwYWwgV2lkdGgiLCB5bGFiID0gIkZyZXF1ZW5jeSIsIG1haW4gPSAiSGlzdG9ncmFtIikNCmggPC0gZ2dwbG90KGRhdGEgPSBpcmlzLCBhZXMoeCA9IFNlcGFsLldpZHRoKSkNCmggKyBnZW9tX2hpc3RvZ3JhbShiaW53aWR0aCA9IDAuMiwgY29sb3IgPSAiYmxhY2siLCBhZXMoZmlsbCA9IFNwZWNpZXMpKSArIHhsYWIoIlNlcGFsIFdpZHRoIikgKyB5bGFiKCJGcmVxdWVuY3kiKSArIGdndGl0bGUoIkhpc3RvZ3JhbSIpDQoNCmRoIDwtIGdncGxvdChkYXRhID0gaXJpcywgYWVzKHggPSBTZXBhbC5XaWR0aCwgZmlsbD1TcGVjaWVzKSkNCmRoICsgZ2VvbV9kZW5zaXR5KHN0YXQgPSAiZGVuc2l0eSIsIGFscGhhID0gSSgwLjIpKSArIHhsYWIoIlNlcGFsIFdpZHRoIikgKyB5bGFiKCJGcmVxdWVuY3kiKSArIGdndGl0bGUoIkhpc3RvZ3JhbSIpDQoNCmlyaXMxIDwtIGlyaXNbc2FtcGxlKDE6bnJvdyhpcmlzKSwgMTEwKSxdDQppcmlzMS5kZiA8LSBkYXRhLmZyYW1lKFNwZWNpZXM9Yygic2V0b3NhIiwgInZlcnNpY29sb3IiLCAidmlyZ2luaWNhIiksIG1heCA9IGMoNTAsNTAsNTApLCBtaW4gPSBjKDIwLDI1LDMwKSwgdj1jKDMwLDQwLDQ1KSkNCmlyaXMxLmRmDQoNCmJhcnBsb3QodGFibGUoaXJpczEkU3BlY2llcyksIGNvbCA9ICJibGFjayIsIHhsYWIgPSAiU3BlY2llcyIsIHlsYWIgPSAiQ291bnQiLCBtYWluID0gIkJhciBwbG90IikNCmIxIDwtIGdncGxvdChkYXRhID0gaXJpczEsIGFlcyh4ID0gU3BlY2llcykpDQpiMSArIGdlb21fYmFyKCkgKyB4bGFiKCJTcGVjaWVzIikgKyB5bGFiKCJDb3VudCIpICsgZ2d0aXRsZSgiQmFyIHBsb3QiKSArDQogIGdlb21fZXJyb3JiYXIoZGF0YSA9IGlyaXMxLmRmLCBhZXMoeSA9IHYsIHltaW4gPSBtaW4sIHltYXggPSBtYXgpLCBjb2w9InJlZCIsIGxpbmV0eXBlPSJkYXNoZWQiKQ0KDQoNCnEgPC0gYXMudmVjdG9yKHRhYmxlKGlyaXMxJFNwZWNpZXMpKQ0KcQ0KcXAgPC0gY3Vtc3VtKHEpICsgcS8yDQpxcA0KcS5kZiA8LSBkYXRhLmZyYW1lKFNwZWNpZXM9Yygic2VudG9zYSIsICJ2ZXJzaWNvbG9yIiwgInZpcmdpbmljYSIpLCBxdWFudGl0eSA9IHEsIHBvc2l0aW9uID0gcXApDQpxLmRmDQoNCnAxIDwtIGdncGxvdChpcmlzMSwgYWVzKHggPSBmYWN0b3IoMSksIGZpbGwgPSBTcGVjaWVzKSkgKw0KICBnZW9tX2Jhcih3aWR0aCA9IDEpICsNCiAgZ2VvbV90ZXh0KGRhdGEgPSBxLmRmLCBhZXMoeCA9IGZhY3RvcigxKSwgeSA9IHBvc2l0aW9uLCBsYWJlbCA9IHF1YW50aXR5KSwgc2l6ZSA9IDUpICsgbGFicyh4ID0gIiIsIHkgPSAiIikNCnAxDQpwMSArIGNvb3JkX3BvbGFyKHRoZXRhID0gInkiKQ0KDQojQ1rEmMWaxIYgTklFT01BV0lBTkEgVyBGSUxNSUUNCiNXeWtyZXMgbGluaW93eQ0KI2luc3RhbGwucGFja2FnZXMoInBseXIiKQ0KbGlicmFyeShwbHlyKQ0Kc2VwYWwubWluIDwtIGRkcGx5KGlyaXMsICJTcGVjaWVzIiwgc3VtbWFyaXNlLCB4dmFsPW1pbihTZXBhbC5MZW5ndGgpLCB5dmFsPW1pbihTZXBhbC5XaWR0aCkpDQpzZXBhbC5tYXggPC0gZGRwbHkoaXJpcywgIlNwZWNpZXMiLCBzdW1tYXJpc2UsIHh2YWw9bWF4KFNlcGFsLkxlbmd0aCksIHl2YWw9bWF4KFNlcGFsLldpZHRoKSkNCnNlcGFsIDwtIHJiaW5kKHNlcGFsLm1pbiwgc2VwYWwubWF4KQ0Kc2VwYWwgDQoNCmdncGxvdChzZXBhbCwgYWVzKHg9eHZhbCwgeT15dmFsLCBncm91cCA9IFNwZWNpZXMsIGNvbG9yPVNwZWNpZXMpKSArDQogIGdlb21fbGluZShhZXMobGluZXR5cGU9U3BlY2llcyksIHNpemUgPSAxLjIpICsNCiAgZ2VvbV9wb2ludChhZXMoc2hhcGU9U3BlY2llcyksIHNpemUgPSA0KSArICAgICAgICANCiAgc2NhbGVfc2hhcGVfbWFudWFsKHZhbHVlcz1jKDYsIDUsIDQpKSArICAgICAgICAgICAgICAgDQogIHNjYWxlX2xpbmV0eXBlX21hbnVhbCh2YWx1ZXM9YygiZG90ZGFzaCIsICJzb2xpZCIsICJkb3R0ZWQiKSkgKw0KICB4bGFiKCJTZXBhbCBMZW5ndGgiKSArIHlsYWIoIlNlcGFsIFdpZHRoIikgKyBnZ3RpdGxlKCJMaW5lIHBsb3Qgb2Ygc2VwYWwgbGVuZ3RoIGFuZCB3aWR0aCIpDQoNCnNtb290aCA8LSBnZ3Bsb3QoZGF0YT1pcmlzLCBhZXMoeD1TZXBhbC5MZW5ndGgsIHk9U2VwYWwuV2lkdGgsIGNvbG9yPVNwZWNpZXMpKSArIA0KICBnZW9tX3BvaW50KGFlcyhzaGFwZT1TcGVjaWVzKSwgc2l6ZT0xLjUpICsgeGxhYigiU2VwYWwgTGVuZ3RoIikgKyB5bGFiKCJTZXBhbCBXaWR0aCIpICsgDQogIGdndGl0bGUoIlNjYXR0ZXJwbG90IHdpdGggc21vb3RoZXJzIikNCg0Kc21vb3RoICsgZ2VvbV9zbW9vdGgobWV0aG9kPSJsbSIpICNsaW5lYXIgbW9kZWwNCnNtb290aCArIGdlb21fc21vb3RoKG1ldGhvZD0ibG9lc3MiKSAjbG9jYWwgcG9seW5vbWlhbCByZWdyZXNzaW9uDQpzbW9vdGggKyBnZW9tX3Ntb290aChtZXRob2Q9ImdhbSIsIGZvcm11bGE9IHl+cyh4LCBicz0iY3MiKSkgI2dlbmVyYWxpc2VkIGFkZGl0aXZlIG1vZGVsDQoNCiNQb2R6aWHFgiBuYSBwb2R3eWtyZXN5DQpmYWNldCA8LSBnZ3Bsb3QoZGF0YT1pcmlzLCBhZXMoU2VwYWwuTGVuZ3RoLCB5PVNlcGFsLldpZHRoLCBjb2xvcj1TcGVjaWVzKSkgKyANCiAgZ2VvbV9wb2ludChhZXMoc2hhcGU9U3BlY2llcyksIHNpemU9MS41KSArIGdlb21fc21vb3RoKG1ldGhvZD0ibG0iKSArDQogIHhsYWIoIlNlcGFsIExlbmd0aCIpICsgeWxhYigiU2VwYWwgV2lkdGgiKSArIGdndGl0bGUoIkZhY2V0aW5nIikNCg0KZmFjZXQgKyBmYWNldF9ncmlkKC4gfiBTcGVjaWVzKSAjcG96aW9tbw0KZmFjZXQgKyBmYWNldF9ncmlkKFNwZWNpZXMgfiAuKSAjcGlvbm93bw0KDQojV3lrcmVzICJ3dWxrYW5pY3pueSINCnZvbCA8LSBnZ3Bsb3QoZGF0YT1pcmlzLCBhZXMoeCA9IFNlcGFsLkxlbmd0aCkpDQp2b2wgKyBzdGF0X2RlbnNpdHkoYWVzKHltYXggPSAuLmRlbnNpdHkuLiwgIHltaW4gPSAtLi5kZW5zaXR5Li4sIA0KICAgICAgICAgICAgICAgICAgICAgICBmaWxsID0gU3BlY2llcywgY29sb3IgPSBTcGVjaWVzKSwgDQogICAgICAgICAgICAgICAgICAgZ2VvbSA9ICJyaWJib24iLCBwb3NpdGlvbiA9ICJpZGVudGl0eSIpICsNCiAgZmFjZXRfZ3JpZCguIH4gU3BlY2llcykgKyBjb29yZF9mbGlwKCkgKyB4bGFiKCJTZXBhbCBMZW5ndGgiKSANCg0KI1d5a3JlcyAicnVnIHBsb3QiDQpnZ3Bsb3QoZGF0YT1pcmlzLCBhZXMoeD1TZXBhbC5MZW5ndGgsIFBldGFsLkxlbmd0aCkpICsgZ2VvbV9wb2ludCgpICsgDQogIGdlb21fcnVnKGNvbD0ic3RlZWxibHVlIixhbHBoYT0wLjEpICsgeGxhYigiU2VwYWwgTGVuZ3RoIikgKyB5bGFiKCJQZXRhbCBMZW5ndGgiKQ0KDQojTWFwYSBjaWVwbG5hIChoZWF0bWFwKQ0KbGlicmFyeShyZXNoYXBlMikNCmRhdCA8LSBpcmlzWywxOjRdDQpjb3IgPC0gbWVsdChjb3IoZGF0LCB1c2U9InAiKSkNCmhlYWQoY29yKQ0KaGVhdCA8LSBnZ3Bsb3QoZGF0YT1jb3IsIGFlcyh4PVZhcjEsIHk9VmFyMiwgZmlsbD12YWx1ZSkpIA0KaGVhdCArIGdlb21fdGlsZSgpICsgbGFicyh4ID0gIiIsIHkgPSAiIikgKyBzY2FsZV9maWxsX2dyYWRpZW50MihsaW1pdHM9YygtMSwgMSkpDQoNCiNaYXBpcyB3eWtyZXN1IGRvIHBsaWt1DQpwbG90IDwtIGdncGxvdChkYXRhPWlyaXMsIGFlcyh4PVNlcGFsLkxlbmd0aCwgeT1TZXBhbC5XaWR0aCkpICsgDQogIGdlb21fcG9pbnQoYWVzKHNoYXBlPVNwZWNpZXMsIGNvbG9yPVNwZWNpZXMpKQ0KDQpzZXR3ZCgiZDpcXFRNUCIpICN0eWxrbyBuYSBjemFzIHd5a29ueXdhbmlhIGJpZcW8xIVjZWdvIGZyYWdtZW50dSAocmVzZXRvd2FuZSBwbyBqZWdvIHpha2/FhGN6ZW5pdSkNCmdnc2F2ZSgicGxvdDEucG5nIikNCmdnc2F2ZShwbG90LCBmaWxlPSJwbG90Mi5wbmciKQ0KZ2dzYXZlKHBsb3QsIGZpbGU9InBsb3QzLnBuZyIsIHdpZHRoPTYsIGhlaWdodD00KQ0KDQojV3lrcmVzICJixIViZWxrb3d5IiAtIGRhbmUgeiBwbGlrdSB3IHNpZWNpIChwcnplc3TEmXBzdHdhIHogd3N0YW5hY2gpDQpjcmltZSA8LSByZWFkLmNzdigiaHR0cDovL2RhdGFzZXRzLmZsb3dpbmdkYXRhLmNvbS9jcmltZVJhdGVzQnlTdGF0ZTIwMDUudHN2IiwgaGVhZGVyPVRSVUUsIHNlcD0iXHQiKQ0KZ2dwbG90KGRhdGE9Y3JpbWUsIGFlcyh4PW11cmRlciwgeT1idXJnbGFyeSwgc2l6ZT1wb3B1bGF0aW9uLCBsYWJlbD1zdGF0ZSksZ3VpZGU9RkFMU0UpKw0KZ2VvbV9wb2ludChjb2xvcj0id2hpdGUiLCBmaWxsPSJyZWQiLCBzaGFwZT0yMSkrIHNjYWxlX3NpemVfYXJlYShtYXhfc2l6ZSA9IDE1KSsNCnNjYWxlX3hfY29udGludW91cyhuYW1lPSJNdXJkZXJzIHBlciAxLDAwMCBwb3B1bGF0aW9uIiwgbGltaXRzPWMoMCwxMikpKw0Kc2NhbGVfeV9jb250aW51b3VzKG5hbWU9IkJ1cmdsYXJpZXMgcGVyIDEsMDAwIHBvcHVsYXRpb24iLCBsaW1pdHM9YygwLDEyNTApKSsNCmdlb21fdGV4dChzaXplPTIuNSkrIHRoZW1lX2J3KCkNCmBgYA0KYGBge3J9DQpzMCA8LSAiIg0KcyA8LSAiVW5pd2Vyc3l0ZXQgTWlrb8WCYWphIEtPcGVybmlrYSB3IFRvcnVuaXUiDQpzMSA8LSBzDQpzMiA8LSBzdWJzdHJpbmcocywgMSwgMTEpDQoNCnN0cmlfaXNlbXB0eShzMCkNCnN0cmlfbGVuZ3RoKHMpOyBsZW5ndGgocyk7ICBuY2hhcihzKQ0Kc3RyaV9sZW5ndGgoczApOyBsZW5ndGgoczApOyBuY2hhcihzMCkNCg0KcyA9PSBzMQ0KczEgPT0gczANCg0Kc3RyaV9sb2NhbGVfZ2V0KCkNCg0KcyA+IHMxDQpzID4gczANCnMxID4gczINCg0Kc3RyaV9jbXAoczIsIHMpDQpjKHMxLHMyLHMsczApDQpzdHJpX3NvcnQoYyhzMSxzMixzLHMwKSkNCg0Kc3RyaV9wYXN0ZSgiVW5pd2Vyc3l0ZXQiLCAiTWlrb8WCYWphIiwgIktvcGVybmlrYSIsIHNlcCA9ICIgIikNCg0Kc3RyaV9kdXAoIlVNSyIsIDMpDQpzdHJpX3RyaW0oIlx0VU1LICIpDQoNCnN0cmlfcGFkKCJVTUsiLCB3aWR0aD0xMCwgc2lkZT0iYm90aCIpDQoNCnRvdXBwZXIoIk1pa2/FgmFqIik7IHN0cmlfdHJhbnNfdG91cHBlcigiTWlrb8WCYWoiKQ0Kc3RyaV90cmFuc19jaGFyKCJ1bml3ZXJzeXRldCBtaWtvxYJhamEga29wZXJuaWthIiwgInVtayIsICJVTUsiKQ0Kc3RyaV90cmFuc19jaGFyKCJ6YcWCw7PFusSHIGfEmcWbbMSFIGphxbrFhCIsICLFvMOzxYLEh8SZxZvEhcW8xbrFhCIsICJ6b2xjZXNhenpuIikNCg0Kc3RyaV9zdWIocywgZnJvbSA9IDEzLCB0byA9IDE5KQ0Kc3RyaV9zdWIocywgLTkpIDwtICJ3IEJ5ZGdvc3pjenkiDQpzDQoNCnN0cmlfZXh0cmFjdF9hbGxfd29yZHMocykNCg0Kc3RyaV9jb3VudF9maXhlZChzLCAiYWoiKQ0KDQplbmRzV2l0aChzLCBzMikNCmBgYA0KDQo=