1

Umfrage <- read.table("Umfragedaten.txt")
str(Umfrage)
'data.frame':   3471 obs. of  17 variables:
 $ ID              : int  1359 2455 200 1280 2384 2258 837 1343 3129 2961 ...
 $ GESCHL          : Factor w/ 2 levels "MAENNLICH","WEIBLICH": 2 2 1 1 2 1 1 1 1 2 ...
 $ GEBJAHR         : int  1967 1964 1980 1968 1995 1992 1967 1989 1960 1952 ...
 $ BERUFSTAETIG    : Factor w/ 4 levels "HAUPTBERUFL.GANZTAGS",..: 4 2 4 1 4 2 1 3 1 2 ...
 $ ARBEITSSTD      : num  NA 30 NA 50 NA 13 47 NA 37 30 ...
 $ ARZTBES         : int  1 1 3 0 1 0 0 1 0 4 ...
 $ RAUCH           : Factor w/ 2 levels "JA","NEIN": 1 2 2 2 2 2 2 2 2 2 ...
 $ GRO             : int  162 165 166 180 161 187 194 173 175 170 ...
 $ GEW             : int  79 59 86 95 46 93 96 70 85 110 ...
 $ SCHULABSCHLUSS  : Factor w/ 7 levels "ANDERER ABSCHLUSS",..: 4 4 3 2 5 2 1 7 7 2 ...
 $ SCHULABSCHLUSS_V: Factor w/ 6 levels "ANDERER ABSCHLUSS",..: 4 6 3 4 4 NA 6 5 6 6 ...
 $ SCHULABSCHLUSS_M: Factor w/ 6 levels "ANDERER ABSCHLUSS",..: 3 6 3 4 6 NA 6 5 6 6 ...
 $ HOE_ABSCHLUSS   : Factor w/ 7 levels "ANDERER ABSCHLUSS",..: 5 5 3 2 7 4 6 4 5 3 ...
 $ HOE_ABSCHLUSS_V : Factor w/ 7 levels "ANDERER ABSCHLUSS",..: 3 7 4 5 3 NA 3 6 3 3 ...
 $ HOE_ABSCHLUSS_M : Factor w/ 7 levels "ANDERER ABSCHLUSS",..: 7 5 4 5 3 NA 6 5 5 5 ...
 $ NETTO           : int  475 780 NA NA NA NA 4000 400 1100 2000 ...
 $ ZUFR            : int  10 9 8 8 7 9 8 9 8 8 ...

2

l <- ncol(Umfrage)
b <- nrow(Umfrage)
logger::log_info("Anzahl Merkmale: {l}")
INFO [2019-03-09 14:47:29] Anzahl Merkmale: 17
logger::log_info("Anzahl Beobachtungen: {b}")
INFO [2019-03-09 14:47:29] Anzahl Beobachtungen: 3471

3

names(Umfrage)
 [1] "ID"               "GESCHL"           "GEBJAHR"          "BERUFSTAETIG"     "ARBEITSSTD"       "ARZTBES"         
 [7] "RAUCH"            "GRO"              "GEW"              "SCHULABSCHLUSS"   "SCHULABSCHLUSS_V" "SCHULABSCHLUSS_M"
[13] "HOE_ABSCHLUSS"    "HOE_ABSCHLUSS_V"  "HOE_ABSCHLUSS_M"  "NETTO"            "ZUFR"            

4

head(Umfrage, 10)

5

Was genau ist ein Skalenniveau?

6

sum(is.na(Umfrage$GEW))
[1] 44

7

Mittelwert <- mean(Umfrage$ARBEITSSTD, na.rm = T)
Median <- median(Umfrage$ARBEITSSTD, na.rm = T)
Diff <- abs(Mittelwert - Median);
logger::log_info("Die Differenz zwischen Mittelwert ({Mittelwert}) und Median ({Median}) beträgt {Diff}")
INFO [2019-03-09 14:47:29] Die Differenz zwischen Mittelwert (40.2411764705882) und Median (40) beträgt 0.241176470588236

8

sum(Umfrage$SCHULABSCHLUSS_M == 'HOCHSCHULREIFE', na.rm = T)
[1] 282

9

barchart(Umfrage$RAUCH, main = 'Rauchen Sie?', sub = 'Die Raucher sind in der Minderheit')

10

Bestlohn = max(Umfrage$NETTO, na.rm = T);
AnzahlBestverdiener = sum(Umfrage$NETTO == Bestlohn, na.rm = T)
logger::log_info("Es gibt {AnzahlBestverdiener} Bestverdiener mit {Bestlohn}.-- Netto")
INFO [2019-03-09 14:47:30] Es gibt 2 Bestverdiener mit 60000.-- Netto

11

WerBestlohn = which(Umfrage$NETTO == Bestlohn)
GenderBestlohn = Umfrage[WerBestlohn,]$GESCHL
plot(GenderBestlohn, ylim=c(0,2), yaxt = 'n', main="Genderfrage: Wer ist unter den Bestverdienern?")
axis(side=2, at=c(0:2))

12

Umfrage[4,]

13

Stunden6Person <- Umfrage$ARBEITSSTD[6]
logger::log_info("Die 6. Person arbeitet {Stunden6Person} Stunden")
INFO [2019-03-09 14:47:30] Die 6. Person arbeitet 13 Stunden

14

ZufrAnpassung = c(2,3,4,5)
select(Umfrage[ZufrAnpassung,], ID, ZUFR, GESCHL, GEBJAHR, ARZTBES)
Umfrage$ZUFR[ZufrAnpassung] <- c(8,9,10,6)
select(Umfrage[ZufrAnpassung,], ID, ZUFR, GESCHL, GEBJAHR, ARZTBES)

15

IndexColBenennung = which(colnames(Umfrage) == 'GEBJAHR')
colnames(Umfrage)[IndexColBenennung] <- 'JAHRGANG'
colnames(Umfrage)
 [1] "ID"               "GESCHL"           "JAHRGANG"         "BERUFSTAETIG"     "ARBEITSSTD"       "ARZTBES"         
 [7] "RAUCH"            "GRO"              "GEW"              "SCHULABSCHLUSS"   "SCHULABSCHLUSS_V" "SCHULABSCHLUSS_M"
[13] "HOE_ABSCHLUSS"    "HOE_ABSCHLUSS_V"  "HOE_ABSCHLUSS_M"  "NETTO"            "ZUFR"            
logger::log_info("Das Merkmal GEBJAHR wurde auf JAHRGANG geändert.")
INFO [2019-03-09 14:47:30] Das Merkmal GEBJAHR wurde auf JAHRGANG geändert.

16

Zufriedenheit <- table(Umfrage$ZUFR, Umfrage$GESCHL)
barchart(Zufriedenheit, main = 'Zufriedenheit Kummuliert', xlab = 'Anzahl Befragte', ylab = 'Zufriedenheit')

barchart(Zufriedenheit, main = 'Zufriedenheit mit Unterscheidung m/w', xlab = 'Anzahl Befragte', ylab = 'Zufriedenheit', groups = F)

17

Hier stellt sich die Frage, wie stellen wir diese Werte am sprechendsten dar?

ZufriedenheitR <- table(Umfrage$ZUFR, Umfrage$RAUCH, Umfrage$GESCHL)
plot(ZufriedenheitR)

18

GeteiltRaucher <- subset(Umfrage, RAUCH == 'JA')
GeteiltNichtraucher <- setdiff(Umfrage, GeteiltRaucher)
logger::log_info("Datensatz mit total {nrow(Umfrage)} Einträgen geteilt in Raucher ({nrow(GeteiltRaucher)}) und alle anderen ({nrow(GeteiltNichtraucher)})")
INFO [2019-03-09 14:47:30] Datensatz mit total 3471 Einträgen geteilt in Raucher (1018) und alle anderen (2453)

19

ZufriedeneFrauen <- subset(Umfrage, GESCHL == 'WEIBLICH' & ZUFR > 8)
logger::log_info("{nrow(ZufriedeneFrauen)} Frauen sind sehr zufrieden.")
INFO [2019-03-09 14:47:30] 463 Frauen sind sehr zufrieden.

20

Umfrage.neu <- rbind(Umfrage, Umfrage[c(2,4,6),])
!sum(Umfrage.neu[2,] != Umfrage.neu[3472,])
[1] TRUE

21

IndexDuplikate = which(duplicated(Umfrage.neu))
logger::log_info("Duplikat gefunden an Position {IndexDuplikate}")
INFO [2019-03-09 14:47:31] Duplikat gefunden an Position 3472
INFO [2019-03-09 14:47:31] Duplikat gefunden an Position 3473
INFO [2019-03-09 14:47:31] Duplikat gefunden an Position 3474

22

Umfrage.neu <- unique(Umfrage.neu)

23

if (sum(duplicated(Umfrage.neu))) {
  logger::log_info("Noch Duplikat vorhanden: {which(duplicated(Umfrage.neu))}")
} else {
  logger::log_info("Keine Duplikate mehr")
}
INFO [2019-03-09 14:47:31] Keine Duplikate mehr

24

MerkmaleNA <- names(Umfrage[colSums(is.na(Umfrage)) > 0])
logger::log_info("Merkmal mit NA: {MerkmaleNA}")
INFO [2019-03-09 14:47:31] Merkmal mit NA: JAHRGANG
INFO [2019-03-09 14:47:31] Merkmal mit NA: BERUFSTAETIG
INFO [2019-03-09 14:47:31] Merkmal mit NA: ARBEITSSTD
INFO [2019-03-09 14:47:31] Merkmal mit NA: ARZTBES
INFO [2019-03-09 14:47:31] Merkmal mit NA: RAUCH
INFO [2019-03-09 14:47:31] Merkmal mit NA: GRO
INFO [2019-03-09 14:47:31] Merkmal mit NA: GEW
INFO [2019-03-09 14:47:31] Merkmal mit NA: SCHULABSCHLUSS
INFO [2019-03-09 14:47:31] Merkmal mit NA: SCHULABSCHLUSS_V
INFO [2019-03-09 14:47:31] Merkmal mit NA: SCHULABSCHLUSS_M
INFO [2019-03-09 14:47:31] Merkmal mit NA: HOE_ABSCHLUSS
INFO [2019-03-09 14:47:31] Merkmal mit NA: HOE_ABSCHLUSS_V
INFO [2019-03-09 14:47:31] Merkmal mit NA: HOE_ABSCHLUSS_M
INFO [2019-03-09 14:47:31] Merkmal mit NA: NETTO
INFO [2019-03-09 14:47:31] Merkmal mit NA: ZUFR

25

BeobachtungenNA <- Umfrage[rowSums(is.na(Umfrage)) > 0,]
logger::log_info("Total {nrow(BeobachtungenNA)} Beobachtungen mit mindestens einem NA")
INFO [2019-03-09 14:47:31] Total 2209 Beobachtungen mit mindestens einem NA

26

Vollständig <- subset(Umfrage, rowSums(is.na(Umfrage)) == 0)
logger::log_info("Neues Subset mit {nrow(Vollständig)} vollständigen Beobachtungen")
INFO [2019-03-09 14:47:31] Neues Subset mit 1262 vollständigen Beobachtungen

27

Unvollständig <- subset(Umfrage, rowSums(is.na(Umfrage)) > 0)
logger::log_info("Neues Subset mit {nrow(Unvollständig)} unvollständigen Beobachtungen")
INFO [2019-03-09 14:47:31] Neues Subset mit 2209 unvollständigen Beobachtungen

28

Rauchersplit <- split(Umfrage, Umfrage$RAUCH)
Rauchersplit
$JA

$NEIN
NA

29

#KombiFaktor <- paste(Umfrage$RAUCH, Umfrage$GESCHL)
#KombiFaktor
#RaucherGenderSplit <- split(Umfrage, KombiFaktor)
#RaucherGenderSplit
Liste <- list(Umfrage$RAUCH, Umfrage$GESCHL)
RaucherGenderSplit <- split(Umfrage, list(Umfrage$RAUCH, Umfrage$GESCHL))

30

ZufriedenheitMittelwert <- tapply(Umfrage$ZUFR, Umfrage$GESCHL, mean, na.rm = T)
ZufriedenheitMittelwert
MAENNLICH  WEIBLICH 
 7.627778  7.478391 
logger::log_info("Zufriedenheits-Mittelwert {names(ZufriedenheitMittelwert)}: {ZufriedenheitMittelwert}")
INFO [2019-03-09 14:47:32] Zufriedenheits-Mittelwert MAENNLICH: 7.62777777777778
INFO [2019-03-09 14:47:32] Zufriedenheits-Mittelwert WEIBLICH: 7.47839135654262
LS0tCnRpdGxlOiAiQXVmZ2FiZSB6dW0gVW1nYW5nIG1pdCBlaW5lbSBEYXRhIEZyYW1lIgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKLS0tCgojIDEKYGBge3J9ClVtZnJhZ2UgPC0gcmVhZC50YWJsZSgiVW1mcmFnZWRhdGVuLnR4dCIpCnN0cihVbWZyYWdlKQpgYGAKIyAyCmBgYHtyfQpsIDwtIG5jb2woVW1mcmFnZSkKYiA8LSBucm93KFVtZnJhZ2UpCmxvZ2dlcjo6bG9nX2luZm8oIkFuemFobCBNZXJrbWFsZToge2x9IikKbG9nZ2VyOjpsb2dfaW5mbygiQW56YWhsIEJlb2JhY2h0dW5nZW46IHtifSIpCmBgYAojIDMKYGBge3J9Cm5hbWVzKFVtZnJhZ2UpCmBgYAojIDQKYGBge3J9CmhlYWQoVW1mcmFnZSwgMTApCmBgYAojIDUKV2FzIGdlbmF1IGlzdCBlaW4gU2thbGVubml2ZWF1PwoKIyA2CmBgYHtyfQpzdW0oaXMubmEoVW1mcmFnZSRHRVcpKQpgYGAKIyA3CmBgYHtyfQpNaXR0ZWx3ZXJ0IDwtIG1lYW4oVW1mcmFnZSRBUkJFSVRTU1RELCBuYS5ybSA9IFQpCk1lZGlhbiA8LSBtZWRpYW4oVW1mcmFnZSRBUkJFSVRTU1RELCBuYS5ybSA9IFQpCkRpZmYgPC0gYWJzKE1pdHRlbHdlcnQgLSBNZWRpYW4pOwpsb2dnZXI6OmxvZ19pbmZvKCJEaWUgRGlmZmVyZW56IHp3aXNjaGVuIE1pdHRlbHdlcnQgKHtNaXR0ZWx3ZXJ0fSkgdW5kIE1lZGlhbiAoe01lZGlhbn0pIGJldHLDpGd0IHtEaWZmfSIpCmBgYAojIDgKYGBge3J9CnN1bShVbWZyYWdlJFNDSFVMQUJTQ0hMVVNTX00gPT0gJ0hPQ0hTQ0hVTFJFSUZFJywgbmEucm0gPSBUKQpgYGAKIyA5CmBgYHtyfQpiYXJjaGFydChVbWZyYWdlJFJBVUNILCBtYWluID0gJ1JhdWNoZW4gU2llPycsIHN1YiA9ICdEaWUgUmF1Y2hlciBzaW5kIGluIGRlciBNaW5kZXJoZWl0JykKYGBgCiMgMTAKYGBge3J9CkJlc3Rsb2huID0gbWF4KFVtZnJhZ2UkTkVUVE8sIG5hLnJtID0gVCk7CkFuemFobEJlc3R2ZXJkaWVuZXIgPSBzdW0oVW1mcmFnZSRORVRUTyA9PSBCZXN0bG9obiwgbmEucm0gPSBUKQpsb2dnZXI6OmxvZ19pbmZvKCJFcyBnaWJ0IHtBbnphaGxCZXN0dmVyZGllbmVyfSBCZXN0dmVyZGllbmVyIG1pdCB7QmVzdGxvaG59Li0tIE5ldHRvIikKYGBgCiMgMTEKYGBge3J9CldlckJlc3Rsb2huID0gd2hpY2goVW1mcmFnZSRORVRUTyA9PSBCZXN0bG9obikKR2VuZGVyQmVzdGxvaG4gPSBVbWZyYWdlW1dlckJlc3Rsb2huLF0kR0VTQ0hMCnBsb3QoR2VuZGVyQmVzdGxvaG4sIHlsaW09YygwLDIpLCB5YXh0ID0gJ24nLCBtYWluPSJHZW5kZXJmcmFnZTogV2VyIGlzdCB1bnRlciBkZW4gQmVzdHZlcmRpZW5lcm4/IikKYXhpcyhzaWRlPTIsIGF0PWMoMDoyKSkKYGBgCiMgMTIKYGBge3J9ClVtZnJhZ2VbNCxdCmBgYAojIDEzCmBgYHtyfQpTdHVuZGVuNlBlcnNvbiA8LSBVbWZyYWdlJEFSQkVJVFNTVERbNl0KbG9nZ2VyOjpsb2dfaW5mbygiRGllIDYuIFBlcnNvbiBhcmJlaXRldCB7U3R1bmRlbjZQZXJzb259IFN0dW5kZW4iKQpgYGAKIyAxNApgYGB7cn0KWnVmckFucGFzc3VuZyA9IGMoMiwzLDQsNSkKc2VsZWN0KFVtZnJhZ2VbWnVmckFucGFzc3VuZyxdLCBJRCwgWlVGUiwgR0VTQ0hMLCBHRUJKQUhSLCBBUlpUQkVTKQpVbWZyYWdlJFpVRlJbWnVmckFucGFzc3VuZ10gPC0gYyg4LDksMTAsNikKc2VsZWN0KFVtZnJhZ2VbWnVmckFucGFzc3VuZyxdLCBJRCwgWlVGUiwgR0VTQ0hMLCBHRUJKQUhSLCBBUlpUQkVTKQpgYGAKIyAxNQpgYGB7cn0KSW5kZXhDb2xCZW5lbm51bmcgPSB3aGljaChjb2xuYW1lcyhVbWZyYWdlKSA9PSAnR0VCSkFIUicpCmNvbG5hbWVzKFVtZnJhZ2UpW0luZGV4Q29sQmVuZW5udW5nXSA8LSAnSkFIUkdBTkcnCmNvbG5hbWVzKFVtZnJhZ2UpCmxvZ2dlcjo6bG9nX2luZm8oIkRhcyBNZXJrbWFsIEdFQkpBSFIgd3VyZGUgYXVmIEpBSFJHQU5HIGdlw6RuZGVydC4iKQpgYGAKIyAxNgpgYGB7cn0KWnVmcmllZGVuaGVpdCA8LSB0YWJsZShVbWZyYWdlJFpVRlIsIFVtZnJhZ2UkR0VTQ0hMKQpiYXJjaGFydChadWZyaWVkZW5oZWl0LCBtYWluID0gJ1p1ZnJpZWRlbmhlaXQgS3VtbXVsaWVydCcsIHhsYWIgPSAnQW56YWhsIEJlZnJhZ3RlJywgeWxhYiA9ICdadWZyaWVkZW5oZWl0JykKYmFyY2hhcnQoWnVmcmllZGVuaGVpdCwgbWFpbiA9ICdadWZyaWVkZW5oZWl0IG1pdCBVbnRlcnNjaGVpZHVuZyBtL3cnLCB4bGFiID0gJ0FuemFobCBCZWZyYWd0ZScsIHlsYWIgPSAnWnVmcmllZGVuaGVpdCcsIGdyb3VwcyA9IEYpCmBgYAoKIyAxNwpIaWVyIHN0ZWxsdCBzaWNoIGRpZSBGcmFnZSwgd2llIHN0ZWxsZW4gd2lyIGRpZXNlIFdlcnRlIGFtIHNwcmVjaGVuZHN0ZW4gZGFyPwpgYGB7cn0KWnVmcmllZGVuaGVpdFIgPC0gdGFibGUoVW1mcmFnZSRaVUZSLCBVbWZyYWdlJFJBVUNILCBVbWZyYWdlJEdFU0NITCkKcGxvdChadWZyaWVkZW5oZWl0UikKYGBgCiMgMTgKYGBge3J9CkdldGVpbHRSYXVjaGVyIDwtIHN1YnNldChVbWZyYWdlLCBSQVVDSCA9PSAnSkEnKQpHZXRlaWx0TmljaHRyYXVjaGVyIDwtIHNldGRpZmYoVW1mcmFnZSwgR2V0ZWlsdFJhdWNoZXIpCmxvZ2dlcjo6bG9nX2luZm8oIkRhdGVuc2F0eiBtaXQgdG90YWwge25yb3coVW1mcmFnZSl9IEVpbnRyw6RnZW4gZ2V0ZWlsdCBpbiBSYXVjaGVyICh7bnJvdyhHZXRlaWx0UmF1Y2hlcil9KSB1bmQgYWxsZSBhbmRlcmVuICh7bnJvdyhHZXRlaWx0TmljaHRyYXVjaGVyKX0pIikKYGBgCiMgMTkKYGBge3J9Clp1ZnJpZWRlbmVGcmF1ZW4gPC0gc3Vic2V0KFVtZnJhZ2UsIEdFU0NITCA9PSAnV0VJQkxJQ0gnICYgWlVGUiA+IDgpCmxvZ2dlcjo6bG9nX2luZm8oIntucm93KFp1ZnJpZWRlbmVGcmF1ZW4pfSBGcmF1ZW4gc2luZCBzZWhyIHp1ZnJpZWRlbi4iKQpgYGAKIyAyMApgYGB7cn0KVW1mcmFnZS5uZXUgPC0gcmJpbmQoVW1mcmFnZSwgVW1mcmFnZVtjKDIsNCw2KSxdKQohc3VtKFVtZnJhZ2UubmV1WzIsXSAhPSBVbWZyYWdlLm5ldVszNDcyLF0pCmBgYAojIDIxCmBgYHtyfQpJbmRleER1cGxpa2F0ZSA9IHdoaWNoKGR1cGxpY2F0ZWQoVW1mcmFnZS5uZXUpKQpsb2dnZXI6OmxvZ19pbmZvKCJEdXBsaWthdCBnZWZ1bmRlbiBhbiBQb3NpdGlvbiB7SW5kZXhEdXBsaWthdGV9IikKYGBgCiMgMjIKYGBge3J9ClVtZnJhZ2UubmV1IDwtIHVuaXF1ZShVbWZyYWdlLm5ldSkKYGBgCiMgMjMKYGBge3J9CmlmIChzdW0oZHVwbGljYXRlZChVbWZyYWdlLm5ldSkpKSB7CiAgbG9nZ2VyOjpsb2dfaW5mbygiTm9jaCBEdXBsaWthdCB2b3JoYW5kZW46IHt3aGljaChkdXBsaWNhdGVkKFVtZnJhZ2UubmV1KSl9IikKfSBlbHNlIHsKICBsb2dnZXI6OmxvZ19pbmZvKCJLZWluZSBEdXBsaWthdGUgbWVociIpCn0KYGBgCiMgMjQKYGBge3J9Ck1lcmttYWxlTkEgPC0gbmFtZXMoVW1mcmFnZVtjb2xTdW1zKGlzLm5hKFVtZnJhZ2UpKSA+IDBdKQpsb2dnZXI6OmxvZ19pbmZvKCJNZXJrbWFsIG1pdCBOQToge01lcmttYWxlTkF9IikKCmBgYAojIDI1CmBgYHtyfQpCZW9iYWNodHVuZ2VuTkEgPC0gVW1mcmFnZVtyb3dTdW1zKGlzLm5hKFVtZnJhZ2UpKSA+IDAsXQpsb2dnZXI6OmxvZ19pbmZvKCJUb3RhbCB7bnJvdyhCZW9iYWNodHVuZ2VuTkEpfSBCZW9iYWNodHVuZ2VuIG1pdCBtaW5kZXN0ZW5zIGVpbmVtIE5BIikKYGBgCiMgMjYKYGBge3J9ClZvbGxzdMOkbmRpZyA8LSBzdWJzZXQoVW1mcmFnZSwgcm93U3Vtcyhpcy5uYShVbWZyYWdlKSkgPT0gMCkKbG9nZ2VyOjpsb2dfaW5mbygiTmV1ZXMgU3Vic2V0IG1pdCB7bnJvdyhWb2xsc3TDpG5kaWcpfSB2b2xsc3TDpG5kaWdlbiBCZW9iYWNodHVuZ2VuIikKYGBgCiMgMjcKYGBge3J9ClVudm9sbHN0w6RuZGlnIDwtIHN1YnNldChVbWZyYWdlLCByb3dTdW1zKGlzLm5hKFVtZnJhZ2UpKSA+IDApCmxvZ2dlcjo6bG9nX2luZm8oIk5ldWVzIFN1YnNldCBtaXQge25yb3coVW52b2xsc3TDpG5kaWcpfSB1bnZvbGxzdMOkbmRpZ2VuIEJlb2JhY2h0dW5nZW4iKQpgYGAKIyAyOApgYGB7cn0KUmF1Y2hlcnNwbGl0IDwtIHNwbGl0KFVtZnJhZ2UsIFVtZnJhZ2UkUkFVQ0gpClJhdWNoZXJzcGxpdApgYGAKIyAyOQpgYGB7cn0KI0tvbWJpRmFrdG9yIDwtIHBhc3RlKFVtZnJhZ2UkUkFVQ0gsIFVtZnJhZ2UkR0VTQ0hMKQojS29tYmlGYWt0b3IKI1JhdWNoZXJHZW5kZXJTcGxpdCA8LSBzcGxpdChVbWZyYWdlLCBLb21iaUZha3RvcikKI1JhdWNoZXJHZW5kZXJTcGxpdApMaXN0ZSA8LSBsaXN0KFVtZnJhZ2UkUkFVQ0gsIFVtZnJhZ2UkR0VTQ0hMKQpSYXVjaGVyR2VuZGVyU3BsaXQgPC0gc3BsaXQoVW1mcmFnZSwgbGlzdChVbWZyYWdlJFJBVUNILCBVbWZyYWdlJEdFU0NITCkpCmBgYAojIDMwCmBgYHtyfQpadWZyaWVkZW5oZWl0TWl0dGVsd2VydCA8LSB0YXBwbHkoVW1mcmFnZSRaVUZSLCBVbWZyYWdlJEdFU0NITCwgbWVhbiwgbmEucm0gPSBUKQpadWZyaWVkZW5oZWl0TWl0dGVsd2VydApsb2dnZXI6OmxvZ19pbmZvKCJadWZyaWVkZW5oZWl0cy1NaXR0ZWx3ZXJ0IHtuYW1lcyhadWZyaWVkZW5oZWl0TWl0dGVsd2VydCl9OiB7WnVmcmllZGVuaGVpdE1pdHRlbHdlcnR9IikKYGBgCg==