Aufgaben
Um mit verschiedenen Daten umgehen zu können, müssen Sie auch
verschiedene Daten/Datenstrukturen gesehen haben, daher betrachten wir
immer unterschiedliche Datensätze.
In den folgenden Aufgaben wollen wir weiterhin den Datensatz
flights betrachten, da dieser aufgrund seiner Größe etwas
komplexer ist:
library(tidyverse)
flights
Machen Sie sich mit dem Datensatz und den einzelnen Variablen
vertraut. Falls Sie Hilfe benötigen, verwenden Sie erneut
?flights.
Übungsaufgaben
- Wo liegt der Fehler?
irgendeine_variable <- 10
irgendeine_varıable
- Schreiben Sie die fehlenden Befehle um, sodass diese sinngemäß
laufen:
lirbrary(tidyverse)
ggplot(dota = iris) +
geom_point(mapping = aes(x = Sepal.Length, y = Sepal.Width))
filter(mpg, cyl = 7)
filter(diamond, carat != 3)
- Filtern Sie die Flüge des
flights Datensatzes anhand
der folgenden Bedingungen:
Flüge mit einer Ankunftsverspätung arr_delay von
über 10 Stunden
Flüge nach Seattle oder Kansas City (SEA und
MCI)
Flüge der Airlines United (UA), American
(AA) oder Delta (DL)
Flüge im Winter (December, Januar, Februar)
Flüge mit einer Verspätung arr_delay von mehr als 3
Stunden, wobei der Abflug nicht verspätet war
(dep_delay)
Flüge mit einer Abflugverspätung dep_delay von mehr
als einer Stunde, die mehr als die Hälfte des Delays durch den Flug
wettmachen konnten
Flüge am späten Abend zwischen 22 Uhr und 24 Uhr
- Betrachten Sie die Funktion
?between() und ihre
Funktionalität. Würde diese Ihnen bei den vorherigen Aufgaben
helfen?
- Bei wie vielen Flügen fehlt die Ankunftszeit
dep_time?
Was fällt Ihnen auf und wie können Sie sich diese Einträge
erklären?
- Sortieren Sie die Flüge:
Finden Sie die Flüge mit der kleinsten und größten
Abflugverspätung dep_delay
Finden Sie den kürzesten und längsten Flug (bezogen auf die
Distanz distance)
Finden Sie den schnellsten Flug (bezogen auf die
Geschwindigkeit)
Lösungen
Wo liegt der
Fehler?
irgendeine_variable <- 10
irgendeine_variable
[1] 10
Der Fehler zeigt, dass ein Objekt nicht gefunden wurde. Dies liegt
daran, dass der Variablenname zuvor falsch geschrieben wurde (das i war
das griechische Iota:
ι).
Schreiben Sie die
fehlenden Befehle um, sodass diese sinngemäß laufen:
library(tidyverse) # Funktion falsch geschrieben
ggplot(data = iris) + # Parameter falsch geschrieben
geom_point(mapping = aes(x = Sepal.Length, y = Sepal.Width))

filter(mpg, cyl == 7) # Für Vergleiche wird das "==" verwendet
filter(diamonds, carat != 3) # Der Dataframe heißt diamonds
Filtern Sie die
Flüge des flights Datensatzes anhand der folgenden
Bedingungen:
Flüge mit einer
Ankunftsverspätung arr_delay von über 10 Stunden
Achten Sie darauf, dass die meisten Zeiten in Minuten angegeben
sind:
filter(flights, arr_delay >= 600) # = 10 Stunden
Flüge nach
Seattle oder Kansas City (SEA und MCI)
Es gibt zwei Alternativen. Entweder verwenden Sie den
Vergleichsoperator für das ODER |:
filter(flights, dest == "SEA" | dest == "MCI")
Die zweite Alternative ist die Verwendung von %in%:
filter(flights, dest %in% c("SEA", "MCI"))
Flüge der
Airlines United (UA), American (AA) oder Delta
(DL)
filter(flights, carrier %in% c("UA", "AA", "DL"))
Flüge im ersten
Quartal (Januar, Februar, März)
filter(flights, month %in% c(1, 2, 3))
Flüge mit einer
Verspätung arr_delay von mehr als 3 Stunden, wobei der
Abflug nicht verspätet war (dep_delay)
filter(flights, arr_delay > 180, dep_delay <= 0)
Flüge mit einer
Abflugverspätung dep_delay von mehr als einer Stunde, die
mehr als die Hälfte des Delays durch den Flug wettmachen konnten
filter(flights, dep_delay > 60, arr_delay < dep_delay / 2)
Flüge am späten
Abend zwischen 22 Uhr und 24 Uhr
filter(flights, hour >= 22, hour <= 24)
Betrachten Sie die
Funktion ?between() und ihre Funktionalität. Würde Ihnen
diese bei den vorherigen Aufgaben helfen?
Die between() Funktion ermöglicht den Vergleich von
einem Wert mit einer Unter- und Obergrenze. Das kann als Ersatz für
x >= y & x <= z verwendet werden.
Umgangssprachlich: “Liegt der Wert x zwischen
y und z?
Verwenden können wir diese Funktion in zwei vorherigen Fällen:
filter(flights, between(month, 1, 3)) # Umgangssprachlich: "Wähle den Monat zwischen dem 1. und 3. (beides inklusive) aus"
filter(flights, between(hour, 22, 24)) # Flüge zwischen 22 und 24 Uhr
Bei wie vielen
Flügen fehlt die Ankunftszeit dep_time? Was fällt Ihnen auf
und wie können Sie sich diese Einträge erklären?
NAs können wir mit Hilfe der is.na()
Funktion filtern:
filter(flights, is.na(dep_time))
Wir sehen, dass eine fehlende Ankunftszeit ebenfalls mit
NAs in arr_time, dep_delay,
arr_delay und air_time einhergehen:
- Die Flüge scheinen ausgefallen zu sein
Sortieren Sie die
Flüge:
Finden Sie die
Flüge mit der kleinsten und größten Abflugverspätung
dep_delay
# Aufsteigend sortiert:
arrange(flights, dep_delay)
# Absteigend sortiert:
arrange(flights, desc(dep_delay)) # desc() = descending (absteigend), um die Sortierung zu ändern
Finden Sie den
kürzesten und längsten Flug (bezogen auf die Distanz
distance)
arrange(flights, distance)
arrange(flights, desc(distance))
Finden Sie den
schnellsten Flug (bezogen auf die Geschwindigkeit)
Um die Geschwindigkeit zu erhalten, müssen wir die Distanz
distance durch die Zeit air_time teilen und
danach sortieren:
arrange(flights, desc(distance / air_time))
LS0tCnRpdGxlOiAiw5xidW5nc3pldHRlbCAzIgpvdXRwdXQ6IAogIGh0bWxfbm90ZWJvb2s6IAogICAgaGlnaGxpZ2h0OiB0YW5nbwogICAgbnVtYmVyX3NlY3Rpb25zOiB5ZXMKLS0tCgojIEF1ZmdhYmVuCgpVbSBtaXQgdmVyc2NoaWVkZW5lbiBEYXRlbiB1bWdlaGVuIHp1IGvDtm5uZW4sIG3DvHNzZW4gU2llIGF1Y2gKdmVyc2NoaWVkZW5lIERhdGVuL0RhdGVuc3RydWt0dXJlbiBnZXNlaGVuIGhhYmVuLCBkYWhlciBiZXRyYWNodGVuIHdpcgppbW1lciB1bnRlcnNjaGllZGxpY2hlIERhdGVuc8OkdHplLgoKSW4gZGVuIGZvbGdlbmRlbiBBdWZnYWJlbiB3b2xsZW4gd2lyIHdlaXRlcmhpbiBkZW4gRGF0ZW5zYXR6IGBmbGlnaHRzYApiZXRyYWNodGVuLCBkYSBkaWVzZXIgYXVmZ3J1bmQgc2VpbmVyIEdyw7bDn2UgZXR3YXMga29tcGxleGVyIGlzdDoKCmBgYHtyfQpsaWJyYXJ5KHRpZHl2ZXJzZSkKZmxpZ2h0cwpgYGAKCk1hY2hlbiBTaWUgc2ljaCBtaXQgZGVtIERhdGVuc2F0eiB1bmQgZGVuIGVpbnplbG5lbiBWYXJpYWJsZW4gdmVydHJhdXQuCkZhbGxzIFNpZSBIaWxmZSBiZW7DtnRpZ2VuLCB2ZXJ3ZW5kZW4gU2llIGVybmV1dCBgP2ZsaWdodHNgLgoKIyMgw5xidW5nc2F1ZmdhYmVuCgoxLiAgV28gbGllZ3QgZGVyIEZlaGxlcj8KCmBgYHtyLCBldmFsID0gRkFMU0V9CmlyZ2VuZGVpbmVfdmFyaWFibGUgPC0gMTAKaXJnZW5kZWluZV92YXLEsWFibGUKYGBgCgoyLiAgU2NocmVpYmVuIFNpZSBkaWUgZmVobGVuZGVuIEJlZmVobGUgdW0sIHNvZGFzcyBkaWVzZSBzaW5uZ2Vtw6TDnwogICAgbGF1ZmVuOgoKYGBge3IsIGV2YWwgPSBGQUxTRX0KbGlyYnJhcnkodGlkeXZlcnNlKQoKZ2dwbG90KGRvdGEgPSBpcmlzKSArCglnZW9tX3BvaW50KG1hcHBpbmcgPSBhZXMoeCA9IFNlcGFsLkxlbmd0aCwgeSA9IFNlcGFsLldpZHRoKSkKCmZpbHRlcihtcGcsIGN5bCA9IDcpCmZpbHRlcihkaWFtb25kLCBjYXJhdCAhPSAzKQpgYGAKCjMuICBGaWx0ZXJuIFNpZSBkaWUgRmzDvGdlIGRlcyBgZmxpZ2h0c2AgRGF0ZW5zYXR6ZXMgYW5oYW5kIGRlciBmb2xnZW5kZW4KICAgIEJlZGluZ3VuZ2VuOgogICAgMS4gIEZsw7xnZSBtaXQgZWluZXIgQW5rdW5mdHN2ZXJzcMOkdHVuZyBgYXJyX2RlbGF5YCB2b24gw7xiZXIgMTAKICAgICAgICBTdHVuZGVuCgogICAgMi4gIEZsw7xnZSBuYWNoIFNlYXR0bGUgb2RlciBLYW5zYXMgQ2l0eSAoYFNFQWAgdW5kIGBNQ0lgKQoKICAgIDMuICBGbMO8Z2UgZGVyIEFpcmxpbmVzIFVuaXRlZCAoYFVBYCksIEFtZXJpY2FuIChgQUFgKSBvZGVyIERlbHRhCiAgICAgICAgKGBETGApCgogICAgNC4gIEZsw7xnZSBpbSBXaW50ZXIgKERlY2VtYmVyLCBKYW51YXIsIEZlYnJ1YXIpCgogICAgNS4gIEZsw7xnZSBtaXQgZWluZXIgVmVyc3DDpHR1bmcgYGFycl9kZWxheWAgdm9uIG1laHIgYWxzIDMgU3R1bmRlbiwKICAgICAgICB3b2JlaSBkZXIgQWJmbHVnIG5pY2h0IHZlcnNww6R0ZXQgd2FyIChgZGVwX2RlbGF5YCkKCiAgICA2LiAgRmzDvGdlIG1pdCBlaW5lciBBYmZsdWd2ZXJzcMOkdHVuZyBgZGVwX2RlbGF5YCB2b24gbWVociBhbHMgZWluZXIKICAgICAgICBTdHVuZGUsIGRpZSBtZWhyIGFscyBkaWUgSMOkbGZ0ZSBkZXMgRGVsYXlzIGR1cmNoIGRlbiBGbHVnCiAgICAgICAgd2V0dG1hY2hlbiBrb25udGVuCgogICAgNy4gIEZsw7xnZSBhbSBzcMOkdGVuIEFiZW5kIHp3aXNjaGVuIDIyIFVociB1bmQgMjQgVWhyCjQuICBCZXRyYWNodGVuIFNpZSBkaWUgRnVua3Rpb24gYD9iZXR3ZWVuKClgIHVuZCBpaHJlIEZ1bmt0aW9uYWxpdMOkdC4KICAgIFfDvHJkZSBkaWVzZSBJaG5lbiBiZWkgZGVuIHZvcmhlcmlnZW4gQXVmZ2FiZW4gaGVsZmVuPwo1LiAgQmVpIHdpZSB2aWVsZW4gRmzDvGdlbiBmZWhsdCBkaWUgQW5rdW5mdHN6ZWl0IGBkZXBfdGltZWA/IFdhcyBmw6RsbHQKICAgIElobmVuIGF1ZiB1bmQgd2llIGvDtm5uZW4gU2llIHNpY2ggZGllc2UgRWludHLDpGdlIGVya2zDpHJlbj8KNi4gIFNvcnRpZXJlbiBTaWUgZGllIEZsw7xnZToKICAgIDEuICBGaW5kZW4gU2llIGRpZSBGbMO8Z2UgbWl0IGRlciBrbGVpbnN0ZW4gdW5kIGdyw7bDn3RlbgogICAgICAgIEFiZmx1Z3ZlcnNww6R0dW5nIGBkZXBfZGVsYXlgCgogICAgMi4gIEZpbmRlbiBTaWUgZGVuIGvDvHJ6ZXN0ZW4gdW5kIGzDpG5nc3RlbiBGbHVnIChiZXpvZ2VuIGF1ZiBkaWUKICAgICAgICBEaXN0YW56IGBkaXN0YW5jZWApCgogICAgMy4gIEZpbmRlbiBTaWUgZGVuIHNjaG5lbGxzdGVuIEZsdWcgKGJlem9nZW4gYXVmIGRpZQogICAgICAgIEdlc2Nod2luZGlna2VpdCkKCiMjIEzDtnN1bmdlbgoKIyMjIFdvIGxpZWd0IGRlciBGZWhsZXI/CgpgYGB7cn0KaXJnZW5kZWluZV92YXJpYWJsZSA8LSAxMAppcmdlbmRlaW5lX3ZhcmlhYmxlCmBgYAoKRGVyIEZlaGxlciB6ZWlndCwgZGFzcyBlaW4gT2JqZWt0IG5pY2h0IGdlZnVuZGVuIHd1cmRlLiBEaWVzIGxpZWd0CmRhcmFuLCBkYXNzIGRlciBWYXJpYWJsZW5uYW1lIHp1dm9yIGZhbHNjaCBnZXNjaHJpZWJlbiB3dXJkZSAoZGFzIGkgd2FyCmRhcyBncmllY2hpc2NoZSBbSW90YV0oaHR0cHM6Ly9kZS53aWtpcGVkaWEub3JnL3dpa2kvSW90YSk6IM65KS4KCiMjIyBTY2hyZWliZW4gU2llIGRpZSBmZWhsZW5kZW4gQmVmZWhsZSB1bSwgc29kYXNzIGRpZXNlIHNpbm5nZW3DpMOfIGxhdWZlbjoKCmBgYHtyfQpsaWJyYXJ5KHRpZHl2ZXJzZSkgIyBGdW5rdGlvbiBmYWxzY2ggZ2VzY2hyaWViZW4KCmdncGxvdChkYXRhID0gaXJpcykgKyAjIFBhcmFtZXRlciBmYWxzY2ggZ2VzY2hyaWViZW4KCWdlb21fcG9pbnQobWFwcGluZyA9IGFlcyh4ID0gU2VwYWwuTGVuZ3RoLCB5ID0gU2VwYWwuV2lkdGgpKQoKZmlsdGVyKG1wZywgY3lsID09IDcpICMgRsO8ciBWZXJnbGVpY2hlIHdpcmQgZGFzICI9PSIgdmVyd2VuZGV0CmZpbHRlcihkaWFtb25kcywgY2FyYXQgIT0gMykgIyBEZXIgRGF0YWZyYW1lIGhlacOfdCBkaWFtb25kcwpgYGAKCiMjIyBGaWx0ZXJuIFNpZSBkaWUgRmzDvGdlIGRlcyBgZmxpZ2h0c2AgRGF0ZW5zYXR6ZXMgYW5oYW5kIGRlciBmb2xnZW5kZW4gQmVkaW5ndW5nZW46CgojIyMjIEZsw7xnZSBtaXQgZWluZXIgQW5rdW5mdHN2ZXJzcMOkdHVuZyBgYXJyX2RlbGF5YCB2b24gw7xiZXIgMTAgU3R1bmRlbgoKQWNodGVuIFNpZSBkYXJhdWYsIGRhc3MgZGllIG1laXN0ZW4gWmVpdGVuIGluIE1pbnV0ZW4gYW5nZWdlYmVuIHNpbmQ6CgpgYGB7cn0KZmlsdGVyKGZsaWdodHMsIGFycl9kZWxheSA+PSA2MDApICMgPSAxMCBTdHVuZGVuCmBgYAoKIyMjIyBGbMO8Z2UgbmFjaCBTZWF0dGxlIG9kZXIgS2Fuc2FzIENpdHkgKGBTRUFgIHVuZCBgTUNJYCkKCkVzIGdpYnQgendlaSBBbHRlcm5hdGl2ZW4uIEVudHdlZGVyIHZlcndlbmRlbiBTaWUgZGVuIFZlcmdsZWljaHNvcGVyYXRvcgpmw7xyIGRhcyBPREVSIGB8YDoKCmBgYHtyfQpmaWx0ZXIoZmxpZ2h0cywgZGVzdCA9PSAiU0VBIiB8IGRlc3QgPT0gIk1DSSIpCmBgYAoKRGllIHp3ZWl0ZSBBbHRlcm5hdGl2ZSBpc3QgZGllIFZlcndlbmR1bmcgdm9uIGAlaW4lYDoKCmBgYHtyfQpmaWx0ZXIoZmxpZ2h0cywgZGVzdCAlaW4lIGMoIlNFQSIsICJNQ0kiKSkKYGBgCgojIyMjIEZsw7xnZSBkZXIgQWlybGluZXMgVW5pdGVkIChgVUFgKSwgQW1lcmljYW4gKGBBQWApIG9kZXIgRGVsdGEgKGBETGApCgpgYGB7cn0KZmlsdGVyKGZsaWdodHMsIGNhcnJpZXIgJWluJSBjKCJVQSIsICJBQSIsICJETCIpKQpgYGAKCiMjIyMgRmzDvGdlIGltIGVyc3RlbiBRdWFydGFsIChKYW51YXIsIEZlYnJ1YXIsIE3DpHJ6KQoKYGBge3J9CmZpbHRlcihmbGlnaHRzLCBtb250aCAlaW4lIGMoMSwgMiwgMykpCmBgYAoKIyMjIyBGbMO8Z2UgbWl0IGVpbmVyIFZlcnNww6R0dW5nIGBhcnJfZGVsYXlgIHZvbiBtZWhyIGFscyAzIFN0dW5kZW4sIHdvYmVpIGRlciBBYmZsdWcgbmljaHQgdmVyc3DDpHRldCB3YXIgKGBkZXBfZGVsYXlgKQoKYGBge3J9CmZpbHRlcihmbGlnaHRzLCBhcnJfZGVsYXkgPiAxODAsIGRlcF9kZWxheSA8PSAwKQpgYGAKCiMjIyMgRmzDvGdlIG1pdCBlaW5lciBBYmZsdWd2ZXJzcMOkdHVuZyBgZGVwX2RlbGF5YCB2b24gbWVociBhbHMgZWluZXIgU3R1bmRlLCBkaWUgbWVociBhbHMgZGllIEjDpGxmdGUgZGVzIERlbGF5cyBkdXJjaCBkZW4gRmx1ZyB3ZXR0bWFjaGVuIGtvbm50ZW4KCmBgYHtyfQpmaWx0ZXIoZmxpZ2h0cywgZGVwX2RlbGF5ID4gNjAsIGFycl9kZWxheSA8IGRlcF9kZWxheSAvIDIpCmBgYAoKIyMjIyBGbMO8Z2UgYW0gc3DDpHRlbiBBYmVuZCB6d2lzY2hlbiAyMiBVaHIgdW5kIDI0IFVocgoKYGBge3J9CmZpbHRlcihmbGlnaHRzLCBob3VyID49IDIyLCBob3VyIDw9IDI0KQpgYGAKCiMjIyBCZXRyYWNodGVuIFNpZSBkaWUgRnVua3Rpb24gYD9iZXR3ZWVuKClgIHVuZCBpaHJlIEZ1bmt0aW9uYWxpdMOkdC4gV8O8cmRlIElobmVuIGRpZXNlIGJlaSBkZW4gdm9yaGVyaWdlbiBBdWZnYWJlbiBoZWxmZW4/CgpEaWUgYGJldHdlZW4oKWAgRnVua3Rpb24gZXJtw7ZnbGljaHQgZGVuIFZlcmdsZWljaCB2b24gZWluZW0gV2VydCBtaXQKZWluZXIgVW50ZXItIHVuZCBPYmVyZ3JlbnplLiBEYXMga2FubiBhbHMgRXJzYXR6IGbDvHIgYHggPj0geSAmIHggPD0gemAKdmVyd2VuZGV0IHdlcmRlbi4gVW1nYW5nc3NwcmFjaGxpY2g6ICJMaWVndCBkZXIgV2VydCBgeGAgendpc2NoZW4gYHlgCnVuZCBgemA/CgpWZXJ3ZW5kZW4ga8O2bm5lbiB3aXIgZGllc2UgRnVua3Rpb24gaW4gendlaSB2b3JoZXJpZ2VuIEbDpGxsZW46CgpgYGB7cn0KZmlsdGVyKGZsaWdodHMsIGJldHdlZW4obW9udGgsIDEsIDMpKSAjIFVtZ2FuZ3NzcHJhY2hsaWNoOiAiV8OkaGxlIGRlbiBNb25hdCB6d2lzY2hlbiBkZW0gMS4gdW5kIDMuIChiZWlkZXMgaW5rbHVzaXZlKSBhdXMiCmBgYAoKYGBge3J9CmZpbHRlcihmbGlnaHRzLCBiZXR3ZWVuKGhvdXIsIDIyLCAyNCkpICMgRmzDvGdlIHp3aXNjaGVuIDIyIHVuZCAyNCBVaHIKYGBgCgojIyMgQmVpIHdpZSB2aWVsZW4gRmzDvGdlbiBmZWhsdCBkaWUgQW5rdW5mdHN6ZWl0IGBkZXBfdGltZWA/IFdhcyBmw6RsbHQgSWhuZW4gYXVmIHVuZCB3aWUga8O2bm5lbiBTaWUgc2ljaCBkaWVzZSBFaW50csOkZ2UgZXJrbMOkcmVuPwoKYE5Bc2Aga8O2bm5lbiB3aXIgbWl0IEhpbGZlIGRlciBgaXMubmEoKWAgRnVua3Rpb24gZmlsdGVybjoKCmBgYHtyfQpmaWx0ZXIoZmxpZ2h0cywgaXMubmEoZGVwX3RpbWUpKQpgYGAKCldpciBzZWhlbiwgZGFzcyBlaW5lIGZlaGxlbmRlIEFua3VuZnRzemVpdCBlYmVuZmFsbHMgbWl0IGBOQXNgIGluCmBhcnJfdGltZWAsIGBkZXBfZGVsYXlgLCBgYXJyX2RlbGF5YCB1bmQgYGFpcl90aW1lYCBlaW5oZXJnZWhlbjoKCi0gICBEaWUgRmzDvGdlIHNjaGVpbmVuIGF1c2dlZmFsbGVuIHp1IHNlaW4KCiMjIyBTb3J0aWVyZW4gU2llIGRpZSBGbMO8Z2U6CgojIyMjIEZpbmRlbiBTaWUgZGllIEZsw7xnZSBtaXQgZGVyIGtsZWluc3RlbiB1bmQgZ3LDtsOfdGVuIEFiZmx1Z3ZlcnNww6R0dW5nIGBkZXBfZGVsYXlgCgpgYGB7cn0KIyBBdWZzdGVpZ2VuZCBzb3J0aWVydDoKYXJyYW5nZShmbGlnaHRzLCBkZXBfZGVsYXkpCiMgQWJzdGVpZ2VuZCBzb3J0aWVydDoKYXJyYW5nZShmbGlnaHRzLCBkZXNjKGRlcF9kZWxheSkpICMgZGVzYygpID0gZGVzY2VuZGluZyAoYWJzdGVpZ2VuZCksIHVtIGRpZSBTb3J0aWVydW5nIHp1IMOkbmRlcm4KYGBgCgojIyMjIEZpbmRlbiBTaWUgZGVuIGvDvHJ6ZXN0ZW4gdW5kIGzDpG5nc3RlbiBGbHVnIChiZXpvZ2VuIGF1ZiBkaWUgRGlzdGFueiBgZGlzdGFuY2VgKQoKYGBge3J9CmFycmFuZ2UoZmxpZ2h0cywgZGlzdGFuY2UpCmFycmFuZ2UoZmxpZ2h0cywgZGVzYyhkaXN0YW5jZSkpCmBgYAoKIyMjIyBGaW5kZW4gU2llIGRlbiBzY2huZWxsc3RlbiBGbHVnIChiZXpvZ2VuIGF1ZiBkaWUgR2VzY2h3aW5kaWdrZWl0KQoKVW0gZGllIEdlc2Nod2luZGlna2VpdCB6dSBlcmhhbHRlbiwgbcO8c3NlbiB3aXIgZGllIERpc3RhbnogYGRpc3RhbmNlYApkdXJjaCBkaWUgWmVpdCBgYWlyX3RpbWVgIHRlaWxlbiB1bmQgZGFuYWNoIHNvcnRpZXJlbjoKCmBgYHtyfQphcnJhbmdlKGZsaWdodHMsIGRlc2MoZGlzdGFuY2UgLyBhaXJfdGltZSkpCmBgYAo=