No-Go-Liste
+ keine Umlaute im Pfad
+ keine Umlaut in der Benennung der Datei
+ keine doppelte Benennung der Daten
Ich bin eine Überschrift
Ich bin eine Überschrift
Ich bin eine Überschrift
Ich bin eine Überschrift
Ich bin ein Haus!
Ich bin ein Haus!
Ausgabe
print("Hello world")
[1] "Hello world"
a <- 1
b <- 5
a<- 4
b<- 5
a+b
[1] 9
zahl <-sqrt (9)
sprintf("Wurzel aus 9 ist %d", zahl)
[1] "Wurzel aus 9 ist 3"
# install.packages("psych")
library(psych)
Paket 㤼㸱psych㤼㸲 wurde unter R Version 3.6.3 erstellt
Einlesen -> File->Import Dataset ->From Excel
optional
library(readxl)
pearson <- read_excel("D:/tests/pearson.xlsx",
sheet = "Tabelle1")
describe(pearson)
NA
NA
NA
NA
Der IQ liegt in dieser Studie bei 102,47(SD=11.39, n=104). Der Projekterfolg liegt bei 62,38% (SD= 11,52, n = 104).
describe.by(pearson$IQ)
describe.by is deprecated. Please use the describeBy functionno grouping variable requested
# Kommtar
hist(pearson$IQ, main='Histogramm des IQs', xlab="IQ"
, ylab = "Anzahl", col = "deepskyblue")

Anlegen eines Zufallsdatensätzes
data <- data.frame(
name=c( rep("A",50), rep("B",50), rep("C",50), rep("D",50), rep("E", 50)),
value=c( rnorm(50, 8, 5), rnorm(50, 10, 1), rnorm(50, 28, 1), rnorm(50, 31, 4), rnorm(50, 37, 1) )
)
View(data)
psych::describeBy(data$value, group = data$name)
Descriptive statistics by group
group: A
-------------------------------------------------------------------
group: B
-------------------------------------------------------------------
group: C
-------------------------------------------------------------------
group: D
-------------------------------------------------------------------
group: E
attach(data)
name[1]
[1] A
Levels: A B C D E
detach(data)
Datentypen
Vector
# Numeric
var1 = c(15,85.15,9999999)
print(var1)
[1] 15.00 85.15 9999999.00
# logical /boolean
var2 = c(TRUE, FALSE)
print(var2)
[1] TRUE FALSE
#Mischen
var3 = c("Maier", "Klein", 18, 18.14)
print(var3)
[1] "Maier" "Klein" "18" "18.14"
typeof(var3)
[1] "character"
Matrix
# matrix(data, nrow, ncol, byrow, dimnames)
arr = array(c(1:9), dim=c(3,3,4,2))
arr
Meine erste Liste
mylist <- list(var1, var2, var3)
mylist
Mein erster erzeugter Datensatz
var4 <- c("Haus2","Haus3","Haus4","Haus1")
var5 <- c(5,6,7,8)
var6 <- c(9,10,11,12)
Tab1 <- data.frame(var4,var5, var6)
View(Tab1)
Meine erste if- Bedingung
#Wie alt bist du?
alter <- 51
if( 20 > alter ) {
print("Du Teenager!!! ")
}else if (50 > alter && alter > 21 ) {
print("Du wirst auch nicht mehr jünger.")
}else{
print("Ich zähle die Tage bis zur Rente.")
}
Schleifen
# Es gibt drei Schleifenarten
# 1. repeat
revar1 = 1
repeat{
print(revar1)
revar1 = revar1 +2
if (revar1 > 9)
break
}
# 2. Schleife While
whilevar1=0
while(whilevar1 < 15)
{
print(whilevar1)
whilevar1 = whilevar1 +1;
}
anzahl <- 5
# 3. Schleife For
for (i in 10:anzahl)
{
#anzahl = anzahl +1;
print (i)
}
Finden und Löschen von Missing-Values (NA)
Titanic <- read.csv("C:/Users/Alfa-Dozent/Downloads/Titanic.csv")
View(Titanic)
# Finden der NA-Werte
is.na(Titanic$Age)
# wie viele NA-Werte
sum(is.na(Titanic))
# Auslassen der NA-Werte
Titanic <- na.omit(Titanic)
hist(Titanic$Age)
Welcher Datentyp hat mein Variable?
#Version 1
typeof(t_testUN$Selbststaendig)
#Version 2
class(t_testUN$Selbststaendig)
Erzeuge neue Variable
# Differenz erstellen
zwischen <- ttestVER$Fremdeinschaetzung -ttestVER$Selbsteinschaetzung
zwischen
# Die Spalte "Differenz" wird zum Datensatz hinzugefügt
ttestVER <- cbind(ttestVER, "Differenz" = zwischen)
View(ttestVER)
Eine Spalte löschen
# Eine Spalte löschen
ttestVER$Differenz <- NULL
View(ttestVER)
Zeilen löschen
attach(Levene)
# Diese Zeilen sollen entfernt werden
drops <- c(248,798,929,995,1207)
# Zeilen löschen
Levene <- Levene[-drops,]
View(Levene)
Type festlegen
NCBirth$Smoke <- as.factor(NCBirth$Smoke)
Fehler in is.factor(x) : Objekt 'NCBirth' nicht gefunden
Umbenennen
library(psych)
describeBy(NCbirths$BirthWeightGm,NCbirths$Smoke)
NCbirths <- rename(NCbirths, c(1 ="Ja",0 ="Nein"))
Datenstruktur ändern
library(reshape2)
ANOVA_mit_MW$Proband <- as.factor(ANOVA_mit_MW$Proband)
anovamituebung<- melt(ANOVA_mit_MW,
id.vars = c("Proband"),
measure.vars = c("Morgen","Mittag", "Abend"),
variable.name = "Zeit",
value.name = "Konz"
)
Datenauswahl
# select variables v1, v2, v3
myvars <- c("v1", "v2", "v3")
newdata <- mydata[myvars]
# another method
myvars <- paste("v", 1:3, sep="")
newdata <- mydata[myvars]
# select 1st and 5th thru 10th variables
newdata <- mydata[c(1,5:10)]
# exclude variables v1, v2, v3
myvars <- names(mydata) %in% c("v1", "v2", "v3")
newdata <- mydata[!myvars]
# exclude 3rd and 5th variable
newdata <- mydata[c(-3,-5)]
# delete variables v3 and v5
mydata$v3 <- mydata$v5 <- NULL
# first 5 observations
newdata <- mydata[1:5,]
# based on variable values
newdata <- mydata[ which(mydata$gender=='F'
& mydata$age > 65), ]
# or
attach(mydata)
newdata <- mydata[ which(gender=='F' & age > 65),]
detach(mydata)
# using subset function
newdata <- subset(mydata, age >= 20 | age < 10,
select=c(ID, Weight))
# using subset function (part 2)
newdata <- subset(mydata, sex=="m" & age > 25,
select=weight:income)
LS0tDQp0aXRsZTogIkVpbmbDvGhydW5nIg0Kb3V0cHV0OiBodG1sX25vdGVib29rDQotLS0NCg0KDQoNCiMgTm8tR28tTGlzdGUNCiAgICArIGtlaW5lIFVtbGF1dGUgaW0gUGZhZA0KICAgICsga2VpbmUgVW1sYXV0IGluIGRlciBCZW5lbm51bmcgZGVyIERhdGVpDQogICAgKyBrZWluZSBkb3BwZWx0ZSBCZW5lbm51bmcgZGVyIERhdGVuDQoNCg0KIyBJY2ggYmluIGVpbmUgw5xiZXJzY2hyaWZ0DQojIyBJY2ggYmluIGVpbmUgw5xiZXJzY2hyaWZ0DQojIyMgSWNoIGJpbiBlaW5lIMOcYmVyc2NocmlmdA0KIyMjIyBJY2ggYmluIGVpbmUgw5xiZXJzY2hyaWZ0DQoNCkljaCBiaW4gKmVpbiBIYXVzKiE8YnI+DQpJY2ggYmluICoqZWluIEhhdXMqKiENCg0KIyBBdXNnYWJlIA0KYGBge3J9DQoNCnByaW50KCJIZWxsbyB3b3JsZCIpDQoNCmEgPC0gMSANCmIgPC0gNQ0KDQpgYGANCg0KYGBge3J9DQoNCmE8LSA0DQpiPC0gNQ0KDQphK2INCg0KYGBgDQoNCg0KYGBge3J9DQp6YWhsIDwtc3FydCAoOSkNCnNwcmludGYoIld1cnplbCBhdXMgOSBpc3QgJWQiLCB6YWhsKQ0KDQpgYGANCg0KDQoNCg0KYGBge3J9DQoNCiMgaW5zdGFsbC5wYWNrYWdlcygicHN5Y2giKQ0KDQpsaWJyYXJ5KHBzeWNoKQ0KYGBgDQoNCkVpbmxlc2VuIC0+IEZpbGUtPkltcG9ydCBEYXRhc2V0IC0+RnJvbSBFeGNlbA0KDQoNCiMjIyBvcHRpb25hbA0KYGBge3J9DQpsaWJyYXJ5KHJlYWR4bCkNCnBlYXJzb24gPC0gcmVhZF9leGNlbCgiRDovdGVzdHMvcGVhcnNvbi54bHN4IiwgDQogICAgc2hlZXQgPSAiVGFiZWxsZTEiKQ0KYGBgDQoNCg0KYGBge3J9DQpjaGkkdm9yaGVyID0gYXMuZmFjdG9yKGNoaSR2b3JoZXIpDQpjaGkkbmFjaGhlciA9IGFzLmZhY3RvcihjaGkkbmFjaGhlcikNCmRlc2NyaWJlKHBlYXJzb24pDQpgYGANCg0KDQpEZXIgSVEgbGllZ3QgaW4gZGllc2VyIFN0dWRpZSBiZWkgMTAyLDQ3KFNEPTExLjM5LCBuPTEwNCkuIERlciBQcm9qZWt0ZXJmb2xnIGxpZWd0IGJlaSA2MiwzOCUgKFNEPSAxMSw1MiwgbiA9IDEwNCkuDQoNCg0KYGBge3J9DQoNCmRlc2NyaWJlLmJ5KHBlYXJzb24kSVEpDQpgYGANCg0KDQpgYGB7cn0NCg0KaGlzdChwZWFyc29uJElRLCBtYWluPSdIaXN0b2dyYW1tIGRlcyBJUXMnLCB4bGFiPSJJUSIgLCB5bGFiID0gIkFuemFobCIsIGNvbCA9ICJkZWVwc2t5Ymx1ZSIpDQoNCmBgYA0KDQoNCiMgQW5sZWdlbiBlaW5lcyBadWZhbGxzZGF0ZW5zw6R0emVzDQpgYGB7cn0NCmRhdGEgPC0gZGF0YS5mcmFtZSgNCiAgbmFtZT1jKCByZXAoIkEiLDUwKSwgcmVwKCJCIiw1MCksIHJlcCgiQyIsNTApLCByZXAoIkQiLDUwKSwgcmVwKCJFIiwgMzApKSwNCiAgdmFsdWU9Yyggcm5vcm0oNTAsIDgsIDUpLCBybm9ybSg1MCwgMTAsIDEpLCBybm9ybSg1MCwgMjgsIDEpLCBybm9ybSg1MCwgMzEsIDQpLCBybm9ybSgzMCwgMzcsIDEpICkNCikNCg0KYGBgDQoNCg0KDQoNCmBgYHtyfQ0KVmlldyhkYXRhKQ0KYGBgDQoNCmBgYHtyfQ0KcHN5Y2g6OmRlc2NyaWJlQnkoZGF0YSR2YWx1ZSwgZ3JvdXAgPSBkYXRhJG5hbWUpDQpgYGANCg0KDQoNCmBgYHtyfQ0KYXR0YWNoKGRhdGEpDQpgYGANCg0KYGBge3J9DQpuYW1lWzFdDQpgYGANCg0KDQoNCmBgYHtyfQ0KZGV0YWNoKGRhdGEpDQpgYGANCg0KDQojIERhdGVudHlwZW4NCg0KDQojIyMgVmVjdG9yDQoNCmBgYHtyfQ0KDQojIE51bWVyaWMNCnZhcjEgPSBjKDE1LDg1LjE1LDk5OTk5OTkpDQoNCnByaW50KHZhcjEpDQoNCg0KIyBsb2dpY2FsIC9ib29sZWFuDQoNCnZhcjIgPSBjKFRSVUUsIEZBTFNFKQ0KDQpwcmludCh2YXIyKQ0KDQojTWlzY2hlbg0KDQoNCnZhcjMgPSBjKCJNYWllciIsICJLbGVpbiIsIDE4LCAxOC4xNCkNCg0KcHJpbnQodmFyMykNCg0KDQpgYGANCmBgYHtyfQ0KdHlwZW9mKHZhcjMpDQpgYGANCg0KDQoNCg0KDQoNCiMjIyBNYXRyaXggDQoNCmBgYHtyfQ0KDQojIG1hdHJpeChkYXRhLCBucm93LCBuY29sLCBieXJvdywgZGltbmFtZXMpDQoNCg0KYXJyICA9IGFycmF5KGMoMTo5KSwgZGltPWMoMywzLDQsMikpDQphcnINCg0KDQpgYGANCiMjIyBNZWluZSBlcnN0ZSBMaXN0ZQ0KDQpgYGB7cn0NCg0KbXlsaXN0IDwtICBsaXN0KHZhcjEsIHZhcjIsIHZhcjMpDQoNCm15bGlzdA0KDQoNCmBgYA0KIyMjIE1laW4gZXJzdGVyIGVyemV1Z3RlciBEYXRlbnNhdHoNCg0KYGBge3J9DQoNCnZhcjQgPC0gYygiSGF1czIiLCJIYXVzMyIsIkhhdXM0IiwiSGF1czEiKSANCnZhcjUgPC0gYyg1LDYsNyw4KSANCnZhcjYgPC0gYyg5LDEwLDExLDEyKSANCg0KVGFiMSA8LSBkYXRhLmZyYW1lKHZhcjQsdmFyNSwgdmFyNikNCg0KVmlldyhUYWIxKQ0KDQpgYGANCiANCiMjIyAgTWVpbmUgZXJzdGUgaWYtIEJlZGluZ3VuZyAgDQogDQpgYGB7cn0NCg0KI1dpZSBhbHQgYmlzdCBkdT8gDQphbHRlciA8LSAgNTENCg0KaWYoIDIwID4gYWx0ZXIgKSB7DQogICAgICAgICAgIHByaW50KCJEdSBUZWVuYWdlciEhISAiKQ0KfWVsc2UgaWYgKDUwID4gYWx0ZXIgJiYgYWx0ZXIgPiAyMSApIHsNCiAgICAgICAgICAgcHJpbnQoIkR1IHdpcnN0IGF1Y2ggbmljaHQgbWVociBqw7xuZ2VyLiIpDQp9ZWxzZXsgDQogICAgICAgICAgIHByaW50KCJJY2ggesOkaGxlIGRpZSBUYWdlIGJpcyB6dXIgUmVudGUuIikNCiAgfQ0KDQoNCmBgYA0KDQoNCiMjIyBTY2hsZWlmZW4NCg0KYGBge3J9DQojIEVzIGdpYnQgZHJlaSBTY2hsZWlmZW5hcnRlbg0KDQojIDEuIHJlcGVhdA0KcmV2YXIxID0gMQ0KDQoNCnJlcGVhdHsNCg0KICAgICAgICAgIHByaW50KHJldmFyMSkNCiAgICAgICAgICByZXZhcjEgPSByZXZhcjEgKzINCiAgICAgICAgICANCiAgICAgICAgICBpZiAocmV2YXIxID4gOSkNCiAgICAgICAgICAgIGJyZWFrDQogICAgICAgICAgDQogIA0KfQ0KDQoNCg0KDQpgYGANCg0KYGBge3J9DQojIDIuIFNjaGxlaWZlIFdoaWxlDQoNCndoaWxldmFyMT0wDQoNCndoaWxlKHdoaWxldmFyMSA8IDE1KQ0Kew0KICANCiAgcHJpbnQod2hpbGV2YXIxKQ0KICB3aGlsZXZhcjEgPSB3aGlsZXZhcjEgKzE7DQogIA0KfQ0KDQoNCmBgYA0KDQpgYGB7cn0NCmFuemFobCA8LSA1DQojIDMuIFNjaGxlaWZlIEZvcg0KZm9yIChpIGluIDEwOmFuemFobCkNCnsNCiAgDQogI2FuemFobCA9IGFuemFobCArMTsNCiAgcHJpbnQgKGkpDQogIA0KfQ0KDQoNCg0KDQpgYGANCg0KDQoNCg0KIyBGaW5kZW4gdW5kIEzDtnNjaGVuIHZvbiBNaXNzaW5nLVZhbHVlcyAoTkEpDQoNCmBgYHtyfQ0KDQpUaXRhbmljIDwtIHJlYWQuY3N2KCJDOi9Vc2Vycy9BbGZhLURvemVudC9Eb3dubG9hZHMvVGl0YW5pYy5jc3YiKSANCmBgYA0KDQoNCmBgYHtyfQ0KVmlldyhUaXRhbmljKQ0KYGBgDQoNCg0KYGBge3J9DQojIEZpbmRlbiBkZXIgTkEtV2VydGUgDQppcy5uYShUaXRhbmljJEFnZSkNCmBgYA0KDQpgYGB7cn0NCiMgd2llIHZpZWxlIE5BLVdlcnRlDQpzdW0oaXMubmEoVGl0YW5pYykpDQpgYGANCg0KYGBge3J9DQojIEF1c2xhc3NlbiBkZXIgTkEtV2VydGUgDQpUaXRhbmljIDwtIG5hLm9taXQoVGl0YW5pYykNCmBgYA0KYGBge3J9DQpoaXN0KFRpdGFuaWMkQWdlKQ0KYGBgDQoNCg0KIyMjIFdlbGNoZXIgRGF0ZW50eXAgaGF0IG1laW4gVmFyaWFibGU/DQoNCmBgYHtyfQ0KI1ZlcnNpb24gMQ0KdHlwZW9mKHRfdGVzdFVOJFNlbGJzdHN0YWVuZGlnKQ0KI1ZlcnNpb24gMg0KY2xhc3ModF90ZXN0VU4kU2VsYnN0c3RhZW5kaWcpDQpgYGANCg0KDQoNCg0KIyMjIEVyemV1Z2UgbmV1ZSBWYXJpYWJsZQ0KDQpgYGB7cn0NCiMgRGlmZmVyZW56IGVyc3RlbGxlbg0Kendpc2NoZW4gPC0gdHRlc3RWRVIkRnJlbWRlaW5zY2hhZXR6dW5nIC10dGVzdFZFUiRTZWxic3RlaW5zY2hhZXR6dW5nIA0Kendpc2NoZW4NCg0KIyBEaWUgU3BhbHRlICJEaWZmZXJlbnoiIHdpcmQgenVtIERhdGVuc2F0eiBoaW56dWdlZsO8Z3QNCnR0ZXN0VkVSIDwtIGNiaW5kKHR0ZXN0VkVSLCAiRGlmZmVyZW56IiA9IHp3aXNjaGVuKQ0KVmlldyh0dGVzdFZFUikNCg0KYGBgDQoNCiMgRWluZSBTcGFsdGUgbMO2c2NoZW4NCg0KYGBge3J9DQojIEVpbmUgU3BhbHRlIGzDtnNjaGVuDQogDQp0dGVzdFZFUiREaWZmZXJlbnogPC0gTlVMTA0KVmlldyh0dGVzdFZFUikNCg0KYGBgDQoNCiMgWmVpbGVuIGzDtnNjaGVuDQpgYGB7cn0NCg0KYXR0YWNoKExldmVuZSkNCg0KIyBEaWVzZSBaZWlsZW4gc29sbGVuIGVudGZlcm50IHdlcmRlbg0KZHJvcHMgPC0gYygyNDgsNzk4LDkyOSw5OTUsMTIwNykNCg0KIyBaZWlsZW4gbMO2c2NoZW4NCkxldmVuZSA8LSBMZXZlbmVbLWRyb3BzLF0NClZpZXcoTGV2ZW5lKQ0KDQoNCmBgYA0KDQoNCg0KIyBUeXBlIGZlc3RsZWdlbg0KYGBge3J9DQoNCk5DQmlydGgkU21va2UgPC0gYXMuZmFjdG9yKE5DQmlydGgkU21va2UpDQpOQ0JpcnRoJEJpcnRoZ20gPC0gYXMubnVtZXJpYyhOQ0JpcnRoJEJpcnRoZ20pDQpgYGANCg0KIyBVbWJlbmVubmVuDQoNCmBgYHtyfQ0KbGlicmFyeShwc3ljaCkNCmRlc2NyaWJlQnkoTkNiaXJ0aHMkQmlydGhXZWlnaHRHbSxOQ2JpcnRocyRTbW9rZSkNCmBgYA0KDQoNCmBgYHtyfQ0KTkNiaXJ0aHMgPC0gcmVuYW1lKE5DYmlydGhzLCBjKDEgPSJKYSIsMCA9Ik5laW4iKSkNCmBgYA0KDQoNCiMgRGF0ZW5zdHJ1a3R1ciDDpG5kZXJuDQoNCg0KYGBge3J9DQpsaWJyYXJ5KHJlc2hhcGUyKQ0KYGBgDQoNCg0KYGBge3J9DQpBTk9WQV9taXRfTVckUHJvYmFuZCA8LSBhcy5mYWN0b3IoQU5PVkFfbWl0X01XJFByb2JhbmQpDQpgYGANCg0KYGBge3J9DQphbm92YW1pdHVlYnVuZzwtIG1lbHQoQU5PVkFfbWl0X01XLCANCiAgICAgICAgICAgICAgICAgICAgICBpZC52YXJzID0gYygiUHJvYmFuZCIpLCANCiAgICAgICAgICAgICAgICAgICAgICBtZWFzdXJlLnZhcnMgPSBjKCJNb3JnZW4iLCJNaXR0YWciLCAiQWJlbmQiKSwgDQogICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGUubmFtZSA9ICJaZWl0IiwNCiAgICAgICAgICAgICAgICAgICAgICB2YWx1ZS5uYW1lID0gIktvbnoiDQogICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICApDQpgYGANCg0KIyBEYXRlbmF1c3dhaGwgDQoNCmBgYHtyfQ0KIyBzZWxlY3QgdmFyaWFibGVzIHYxLCB2MiwgdjMNCm15dmFycyA8LSBjKCJ2MSIsICJ2MiIsICJ2MyIpDQpuZXdkYXRhIDwtIG15ZGF0YVtteXZhcnNdDQoNCiMgYW5vdGhlciBtZXRob2QNCm15dmFycyA8LSBwYXN0ZSgidiIsIDE6Mywgc2VwPSIiKQ0KbmV3ZGF0YSA8LSBteWRhdGFbbXl2YXJzXQ0KDQojIHNlbGVjdCAxc3QgYW5kIDV0aCB0aHJ1IDEwdGggdmFyaWFibGVzDQpuZXdkYXRhIDwtIG15ZGF0YVtjKDEsNToxMCldIA0KDQojIGV4Y2x1ZGUgdmFyaWFibGVzIHYxLCB2MiwgdjMNCm15dmFycyA8LSBuYW1lcyhteWRhdGEpICVpbiUgYygidjEiLCAidjIiLCAidjMiKQ0KbmV3ZGF0YSA8LSBteWRhdGFbIW15dmFyc10NCg0KIyBleGNsdWRlIDNyZCBhbmQgNXRoIHZhcmlhYmxlDQpuZXdkYXRhIDwtIG15ZGF0YVtjKC0zLC01KV0NCg0KIyBkZWxldGUgdmFyaWFibGVzIHYzIGFuZCB2NQ0KbXlkYXRhJHYzIDwtIG15ZGF0YSR2NSA8LSBOVUxMIA0KDQoNCiMgZmlyc3QgNSBvYnNlcnZhdGlvbnMNCm5ld2RhdGEgPC0gbXlkYXRhWzE6NSxdDQoNCiMgYmFzZWQgb24gdmFyaWFibGUgdmFsdWVzDQpuZXdkYXRhIDwtIG15ZGF0YVsgd2hpY2gobXlkYXRhJGdlbmRlcj09J0YnDQomIG15ZGF0YSRhZ2UgPiA2NSksIF0NCg0KIyBvcg0KYXR0YWNoKG15ZGF0YSkNCm5ld2RhdGEgPC0gbXlkYXRhWyB3aGljaChnZW5kZXI9PSdGJyAmIGFnZSA+IDY1KSxdDQpkZXRhY2gobXlkYXRhKSANCg0KIA0KDQojIHVzaW5nIHN1YnNldCBmdW5jdGlvbg0KbmV3ZGF0YSA8LSBzdWJzZXQobXlkYXRhLCBhZ2UgPj0gMjAgfCBhZ2UgPCAxMCwNCnNlbGVjdD1jKElELCBXZWlnaHQpKSANCg0KDQoNCiMgdXNpbmcgc3Vic2V0IGZ1bmN0aW9uIChwYXJ0IDIpDQpuZXdkYXRhIDwtIHN1YnNldChteWRhdGEsIHNleD09Im0iICYgYWdlID4gMjUsDQpzZWxlY3Q9d2VpZ2h0OmluY29tZSkgDQpgYGANCg0KDQoNCg0K