1 Aufgaben

In diesen Aufgaben sollen Sie den Datensatz iris betrachten.

Geben Sie zunächst den folgenden Befehl ein, um sich einen Übersicht über die Daten zu schaffen:

library(tidyverse)
iris <- as_tibble(iris)
iris

Um mehr über den Datensatz zu erfahren, geben Sie den folgenden Befehl ein:

?iris

Um Hilfe zu den Aesthetics und dem Streudiagramm zu erhalten, geben Sie den folgenden Befehl ein:

?geom_point

1.1 Übungsaufgaben

  1. Wie viele Reihen und Spalten hat der Dataframe iris?

  2. Welche Variablen aus iris sind qualitativ? Welche sind quantitativ?

  3. Was bedeutet die Spalte Petal.Width?

  4. Erstellen Sie ein Streudiagramm mit Petal.Length und Petal.Width.

  5. Erstellen Sie ein Streudiagramm mit Species und Petal.Length. Ist diese Grafik sinnvoll?

  6. Erstellen Sie ein Streudiagramm mit Sepal.Length und Sepal.Width.

    1. Färben Sie zunächst alle Punkte grün ein und ändern Sie die Form.

    2. Nutzen Sie nun Aesthetics, um die Farbe und Form der Punkte gemäß der Spezies (Variable Species) zu ändern.
      Ändern Sie zusätzlich die Größe aller Punkte.

    3. Ändern Sie ebenfalls die Aesthetics alpha, fill und stroke.

    4. Was passiert, wenn Sie einer Aesthetic eine quantitative Variable zuordnen? Testen Sie beispielsweise aes(color = Sepal.Length) oder aes(size = Sepal.Length).

    5. Was passiert, wenn Sie zusätzlich in den Aesthetics aes(color = Sepal.Length < 6) angeben?
      Hierbei handelt es sich nicht direkt um die Zuordnung einer Variablen zu einer Aesthetic.

1.2 Lösung

1.2.1 Wie viele Reihen und Spalten hat der Dataframe iris?

Es gibt viele Möglichkeiten, das zu prüfen:

  • In die Environment oben rechts in RStudio schauen

  • Den Dataframe in der Konsole anzeigen lassen

  • Die Dimension durch dim(iris) oder nrow(iris) und ncol(iris) anzeigen lassen

dim(iris)
[1] 150   5

Es liegen 150 Beobachtungen (Reihen) und 5 Variablen (Spalten) vor.

1.2.2 Welche Variablen aus iris sind qualitativ? Welche sind quantitativ?

Diese Information lässt sich aus den Spalten entnehmen. Kontinuierliche Spalten sind quantitative Variablen, Kategorien (Faktoren) sind qualitative Variablen.

Demnach sind Sepal.Length, Sepal.Width, Petal.Length und Petal.Width quantitativ und Species qualitativ.

In R gibt es hierzu auch den str (structure) Befehl:

str(iris)
tibble [150 × 5] (S3: tbl_df/tbl/data.frame)
 $ Sepal.Length: num [1:150] 5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...
 $ Sepal.Width : num [1:150] 3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ...
 $ Petal.Length: num [1:150] 1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ...
 $ Petal.Width : num [1:150] 0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ...
 $ Species     : Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 1 1 1 1 1 ...

1.2.3 Was bedeutet die Spalte Petal.Width?

Hier könnte eine Suchmaschine nützlich sein. Laut Wikipedia handelt es sich um die Breite des Kronblatts (3).

Schematische Darstellung einer Blüte mit oberständigem Fruchtknoten und perigyner Blütenhülle (= „mittelständiger” Fruchtknoten): 1. Blütenboden (Receptaculum) 2. Kelchblätter (Sepalen) 3. Kronblätter (Petalen) 4. Staubblätter (Stamina) 5. Stempel (Pistill)

1.2.4 Erstellen Sie ein Streudiagramm mit Petal.Length und Petal.Width.

Zuerst müssen wir ggplot mit dem Datensatz aufrufen und dann die geom_point Funktion hinzufügen mit den entsprechenden Aesthetics für die x- und y-Achse, um ein Streudiagramm zu erstellen:

ggplot(data = iris) +
  geom_point(mapping = aes(x = Petal.Length, y = Petal.Width))

1.2.5 Erstellen Sie ein Streudiagramm mit Species und Petal.Length. Ist diese Grafik sinnvoll?

Wie zuvor müssen wir lediglich die Aesthetics an die Variablen anpassen:

ggplot(data = iris) +
  geom_point(mapping = aes(x = Species, y = Petal.Length))

Die Grafik ermöglicht das Vergleichen der einzelnen Datenpunkte zwischen den unterschiedlichen Spezies der Iris-Pflanze, allerdings ist die Grafik nicht sehr ansehnlich.

Besser wäre hier beispielsweise ein Boxplot, um die Verteilungen zu vergleichen.

1.2.6 Erstellen Sie ein Streudiagramm mit Sepal.Length und Sepal.Width.

1.2.6.1 Färben Sie zunächst alle Punkte grün ein und ändern Sie die Form.

Achtung: Die Aesthetics müssen außerhalb der aes() Funktion definiert werden, damit sie unabhängig von Variablen für alle Datenpunkte gelten:

ggplot(data = iris) +
  geom_point(mapping = aes(x = Sepal.Length, y = Sepal.Width), color = "green", shape = 17)

1.2.6.2 Nutzen Sie nun Aesthetics, um die Farbe und Form der Punkte gemäß der Spezies (Variable Species) zu ändern. Ändern Sie zusätzlich die Größe aller Punkte.

Um die Farbe color und Form shape bezüglich der Spezies (Variable Species) anzupassen, müssen diese innerhalb der aes() Funktion definiert werden. Damit zusätzlich die Größe size aller Datenpukte verändert werden kann, muss dies außerhalb der aes() Funktion definiert werden:

ggplot(data = iris) +
  geom_point(mapping = aes(x = Sepal.Length, y = Sepal.Width, color = Species, shape = Species), size = 3)

1.2.6.3 Ändern Sie ebenfalls die Aesthetics alpha, fill und stroke.

Achtung: fill ändert nur die Füllfarbe, sofern die definierte Form von shape das erlaubt.

Spielen Sie mit den Aesthetics herum und testen Sie selbst, was sich ändert, wenn diese innerhalb oder außerhalb der aes() Funktion stehen.

ggplot(data = iris) +
  geom_point(mapping = aes(x = Sepal.Length, y = Sepal.Width, color = Species), shape = 21, fill = "black", size = 2, stroke = 3, alpha = 0.6)

1.2.6.4 Was passiert, wenn Sie einer Aesthetic eine quantitative Variable zuordnen? Testen Sie beispielsweise aes(color = Sepal.Length) oder aes(size = Sepal.Length).

ggplot(data = iris) +
  geom_point(mapping = aes(x = Sepal.Length, y = Sepal.Width, color = Sepal.Length))

ggplot(data = iris) +
  geom_point(mapping = aes(x = Sepal.Length, y = Sepal.Width, size = Sepal.Length))

Die Farbe geht entsprechend der kontinuierlichen Variable Sepal.Length von dunkelblau zu hellblau über.

Ähnlich verhält sich die Größe, welche entsprechend der Variable Sepal.Length angepasst wird.

Je nach Fragestellung können Sie so beispielsweise Ihre Daten ebenfalls hervorheben.

1.2.6.5 Was passiert, wenn Sie zusätzlich in den Aesthetics aes(color = Sepal.Length < 6) angeben? Hierbei handelt es sich nicht direkt um die Zuordnung einer Variablen zu einer Aesthetic.

ggplot(data = iris) +
  geom_point(mapping = aes(x = Sepal.Length, y = Sepal.Width, color = Sepal.Length < 6))

Sie sehen, dass die Datenpunkte (Pflanzen) mit einer Sepal.Length von über und unter 6cm automatisch unterschiedlich dargestellt werden und eine Legende hinzugefügt wurde.

Somit können Sie anhand von Bedingungen (nicht nur einzelne Variablen) Ihre Datenpunkte durch Aesthetics hervorheben.

LS0tCnRpdGxlOiAiw5xidW5nc3pldHRlbCAxIgpvdXRwdXQ6IAogIGh0bWxfbm90ZWJvb2s6IAogICAgaGlnaGxpZ2h0OiB0YW5nbwogICAgbnVtYmVyX3NlY3Rpb25zOiB5ZXMKLS0tCgojIEF1ZmdhYmVuCgpJbiBkaWVzZW4gQXVmZ2FiZW4gc29sbGVuIFNpZSBkZW4gRGF0ZW5zYXR6IGBpcmlzYCBiZXRyYWNodGVuLgoKR2ViZW4gU2llIHp1bsOkY2hzdCBkZW4gZm9sZ2VuZGVuIEJlZmVobCBlaW4sIHVtIHNpY2ggZWluZW4gw5xiZXJzaWNodArDvGJlciBkaWUgRGF0ZW4genUgc2NoYWZmZW46CgpgYGB7cn0KbGlicmFyeSh0aWR5dmVyc2UpCmlyaXMgPC0gYXNfdGliYmxlKGlyaXMpCmlyaXMKYGBgCgpVbSBtZWhyIMO8YmVyIGRlbiBEYXRlbnNhdHogenUgZXJmYWhyZW4sIGdlYmVuIFNpZSBkZW4gZm9sZ2VuZGVuIEJlZmVobAplaW46CgpgYGB7ciwgZXZhbCA9IEZBTFNFfQo/aXJpcwpgYGAKClVtIEhpbGZlIHp1IGRlbiBBZXN0aGV0aWNzIHVuZCBkZW0gU3RyZXVkaWFncmFtbSB6dSBlcmhhbHRlbiwgZ2ViZW4gU2llCmRlbiBmb2xnZW5kZW4gQmVmZWhsIGVpbjoKCmBgYHtyLCBldmFsID0gRkFMU0V9Cj9nZW9tX3BvaW50CmBgYAoKIyMgw5xidW5nc2F1ZmdhYmVuCgoxLiAgV2llIHZpZWxlIFJlaWhlbiB1bmQgU3BhbHRlbiBoYXQgZGVyIERhdGFmcmFtZSBgaXJpc2A/CgoyLiAgV2VsY2hlIFZhcmlhYmxlbiBhdXMgYGlyaXNgIHNpbmQgcXVhbGl0YXRpdj8gV2VsY2hlIHNpbmQKICAgIHF1YW50aXRhdGl2PwoKMy4gIFdhcyBiZWRldXRldCBkaWUgU3BhbHRlIGBQZXRhbC5XaWR0aGA/Cgo0LiAgRXJzdGVsbGVuIFNpZSBlaW4gU3RyZXVkaWFncmFtbSBtaXQgYFBldGFsLkxlbmd0aGAgdW5kCiAgICBgUGV0YWwuV2lkdGhgLgoKNS4gIEVyc3RlbGxlbiBTaWUgZWluIFN0cmV1ZGlhZ3JhbW0gbWl0IGBTcGVjaWVzYCB1bmQgYFBldGFsLkxlbmd0aGAuCiAgICBJc3QgZGllc2UgR3JhZmlrIHNpbm52b2xsPwoKNi4gIEVyc3RlbGxlbiBTaWUgZWluIFN0cmV1ZGlhZ3JhbW0gbWl0IGBTZXBhbC5MZW5ndGhgIHVuZAogICAgYFNlcGFsLldpZHRoYC4KCiAgICAxLiAgRsOkcmJlbiBTaWUgenVuw6RjaHN0IGFsbGUgUHVua3RlIGdyw7xuIGVpbiB1bmQgw6RuZGVybiBTaWUgZGllCiAgICAgICAgRm9ybS4KCiAgICAyLiAgTnV0emVuIFNpZSBudW4gQWVzdGhldGljcywgdW0gZGllIEZhcmJlIHVuZCBGb3JtIGRlciBQdW5rdGUKICAgICAgICBnZW3DpMOfIGRlciBTcGV6aWVzIChWYXJpYWJsZSBgU3BlY2llc2ApIHp1IMOkbmRlcm4uXAogICAgICAgIMOEbmRlcm4gU2llIHp1c8OkdHpsaWNoIGRpZSBHcsO2w59lIGFsbGVyIFB1bmt0ZS4KCiAgICAzLiAgw4RuZGVybiBTaWUgZWJlbmZhbGxzIGRpZSBBZXN0aGV0aWNzIGBhbHBoYWAsIGBmaWxsYCB1bmQKICAgICAgICBgc3Ryb2tlYC4KCiAgICA0LiAgV2FzIHBhc3NpZXJ0LCB3ZW5uIFNpZSBlaW5lciBBZXN0aGV0aWMgZWluZSBxdWFudGl0YXRpdmUKICAgICAgICBWYXJpYWJsZSB6dW9yZG5lbj8gVGVzdGVuIFNpZSBiZWlzcGllbHN3ZWlzZQogICAgICAgIGBhZXMoY29sb3IgPSBTZXBhbC5MZW5ndGgpYCBvZGVyIGBhZXMoc2l6ZSA9IFNlcGFsLkxlbmd0aClgLgoKICAgIDUuICBXYXMgcGFzc2llcnQsIHdlbm4gU2llIHp1c8OkdHpsaWNoIGluIGRlbiBBZXN0aGV0aWNzCiAgICAgICAgYGFlcyhjb2xvciA9IFNlcGFsLkxlbmd0aCA8IDYpYCBhbmdlYmVuP1wKICAgICAgICBIaWVyYmVpIGhhbmRlbHQgZXMgc2ljaCBuaWNodCBkaXJla3QgdW0gZGllIFp1b3JkbnVuZyBlaW5lcgogICAgICAgIFZhcmlhYmxlbiB6dSBlaW5lciBBZXN0aGV0aWMuCgojIyBMw7ZzdW5nCgojIyMgV2llIHZpZWxlIFJlaWhlbiB1bmQgU3BhbHRlbiBoYXQgZGVyIERhdGFmcmFtZSBgaXJpc2A/CgpFcyBnaWJ0IHZpZWxlIE3DtmdsaWNoa2VpdGVuLCBkYXMgenUgcHLDvGZlbjoKCi0gICBJbiBkaWUgYEVudmlyb25tZW50YCBvYmVuIHJlY2h0cyBpbiBSU3R1ZGlvIHNjaGF1ZW4KCi0gICBEZW4gRGF0YWZyYW1lIGluIGRlciBLb25zb2xlIGFuemVpZ2VuIGxhc3NlbgoKLSAgIERpZSBEaW1lbnNpb24gZHVyY2ggYGRpbShpcmlzKWAgb2RlciBgbnJvdyhpcmlzKWAgdW5kIGBuY29sKGlyaXMpYAogICAgYW56ZWlnZW4gbGFzc2VuCgpgYGB7cn0KZGltKGlyaXMpCmBgYAoKRXMgbGllZ2VuIDE1MCBCZW9iYWNodHVuZ2VuIChSZWloZW4pIHVuZCA1IFZhcmlhYmxlbiAoU3BhbHRlbikgdm9yLgoKIyMjIFdlbGNoZSBWYXJpYWJsZW4gYXVzIGBpcmlzYCBzaW5kIHF1YWxpdGF0aXY/IFdlbGNoZSBzaW5kIHF1YW50aXRhdGl2PwoKRGllc2UgSW5mb3JtYXRpb24gbMOkc3N0IHNpY2ggYXVzIGRlbiBTcGFsdGVuIGVudG5laG1lbi4gS29udGludWllcmxpY2hlClNwYWx0ZW4gc2luZCBxdWFudGl0YXRpdmUgVmFyaWFibGVuLCBLYXRlZ29yaWVuIChGYWt0b3Jlbikgc2luZApxdWFsaXRhdGl2ZSBWYXJpYWJsZW4uCgpEZW1uYWNoIHNpbmQgYFNlcGFsLkxlbmd0aGAsIGBTZXBhbC5XaWR0aGAsIGBQZXRhbC5MZW5ndGhgIHVuZApgUGV0YWwuV2lkdGhgIHF1YW50aXRhdGl2IHVuZCBgU3BlY2llc2AgcXVhbGl0YXRpdi4KCkluIGBSYCBnaWJ0IGVzIGhpZXJ6dSBhdWNoIGRlbiBgc3RyYCAoc3RydWN0dXJlKSBCZWZlaGw6CgpgYGB7cn0Kc3RyKGlyaXMpCmBgYAoKIyMjIFdhcyBiZWRldXRldCBkaWUgU3BhbHRlIGBQZXRhbC5XaWR0aGA/CgpIaWVyIGvDtm5udGUgZWluZSBTdWNobWFzY2hpbmUgbsO8dHpsaWNoIHNlaW4uIExhdXQKW1dpa2lwZWRpYV0oaHR0cHM6Ly9kZS53aWtpcGVkaWEub3JnL3dpa2kvS3JvbmJsYXR0KSBoYW5kZWx0IGVzIHNpY2ggdW0KZGllIEJyZWl0ZSBkZXMgS3JvbmJsYXR0cyAoMykuCgpbIVtTY2hlbWF0aXNjaGUgRGFyc3RlbGx1bmcgZWluZXIgQmzDvHRlIG1pdCBvYmVyc3TDpG5kaWdlbSBGcnVjaHRrbm90ZW4KdW5kIHBlcmlneW5lciBCbMO8dGVuaMO8bGxlICg9IOKAnm1pdHRlbHN0w6RuZGlnZXIiIEZydWNodGtub3Rlbik6IDEuCkJsw7x0ZW5ib2RlbiAoUmVjZXB0YWN1bHVtKSAyLiBLZWxjaGJsw6R0dGVyIChTZXBhbGVuKSAzLiBLcm9uYmzDpHR0ZXIKKFBldGFsZW4pIDQuIFN0YXViYmzDpHR0ZXIgKFN0YW1pbmEpIDUuIFN0ZW1wZWwKKFBpc3RpbGwpXShodHRwczovL3VwbG9hZC53aWtpbWVkaWEub3JnL3dpa2lwZWRpYS9jb21tb25zLzEvMTIvQmx1ZXRlLVNjaGVtYS5zdmcpe3N0eWxlPSJ0ZXh0LWFsaWduOiBjZW50ZXIiCndpZHRoPSI4MDAifV0oaHR0cHM6Ly91cGxvYWQud2lraW1lZGlhLm9yZy93aWtpcGVkaWEvY29tbW9ucy8xLzEyL0JsdWV0ZS1TY2hlbWEuc3ZnKQoKIyMjIEVyc3RlbGxlbiBTaWUgZWluIFN0cmV1ZGlhZ3JhbW0gbWl0IGBQZXRhbC5MZW5ndGhgIHVuZCBgUGV0YWwuV2lkdGhgLgoKWnVlcnN0IG3DvHNzZW4gd2lyIGBnZ3Bsb3RgIG1pdCBkZW0gRGF0ZW5zYXR6IGF1ZnJ1ZmVuIHVuZCBkYW5uIGRpZQpgZ2VvbV9wb2ludGAgRnVua3Rpb24gaGluenVmw7xnZW4gbWl0IGRlbiBlbnRzcHJlY2hlbmRlbiBBZXN0aGV0aWNzIGbDvHIKZGllIHgtIHVuZCB5LUFjaHNlLCB1bSBlaW4gU3RyZXVkaWFncmFtbSB6dSBlcnN0ZWxsZW46CgpgYGB7cn0KZ2dwbG90KGRhdGEgPSBpcmlzKSArCiAgZ2VvbV9wb2ludChtYXBwaW5nID0gYWVzKHggPSBQZXRhbC5MZW5ndGgsIHkgPSBQZXRhbC5XaWR0aCkpCmBgYAoKIyMjIEVyc3RlbGxlbiBTaWUgZWluIFN0cmV1ZGlhZ3JhbW0gbWl0IGBTcGVjaWVzYCB1bmQgYFBldGFsLkxlbmd0aGAuIElzdCBkaWVzZSBHcmFmaWsgc2lubnZvbGw/CgpXaWUgenV2b3IgbcO8c3NlbiB3aXIgbGVkaWdsaWNoIGRpZSBBZXN0aGV0aWNzIGFuIGRpZSBWYXJpYWJsZW4gYW5wYXNzZW46CgpgYGB7cn0KZ2dwbG90KGRhdGEgPSBpcmlzKSArCiAgZ2VvbV9wb2ludChtYXBwaW5nID0gYWVzKHggPSBTcGVjaWVzLCB5ID0gUGV0YWwuTGVuZ3RoKSkKYGBgCgpEaWUgR3JhZmlrIGVybcO2Z2xpY2h0IGRhcyBWZXJnbGVpY2hlbiBkZXIgZWluemVsbmVuIERhdGVucHVua3RlIHp3aXNjaGVuCmRlbiB1bnRlcnNjaGllZGxpY2hlbiBTcGV6aWVzIGRlciBJcmlzLVBmbGFuemUsIGFsbGVyZGluZ3MgaXN0IGRpZQpHcmFmaWsgbmljaHQgc2VociBhbnNlaG5saWNoLgoKQmVzc2VyIHfDpHJlIGhpZXIgYmVpc3BpZWxzd2Vpc2UgZWluIEJveHBsb3QsIHVtIGRpZSBWZXJ0ZWlsdW5nZW4genUKdmVyZ2xlaWNoZW4uCgojIyMgRXJzdGVsbGVuIFNpZSBlaW4gU3RyZXVkaWFncmFtbSBtaXQgYFNlcGFsLkxlbmd0aGAgdW5kIGBTZXBhbC5XaWR0aGAuCgojIyMjIEbDpHJiZW4gU2llIHp1bsOkY2hzdCBhbGxlIFB1bmt0ZSBncsO8biBlaW4gdW5kIMOkbmRlcm4gU2llIGRpZSBGb3JtLgoKQWNodHVuZzogRGllIEFlc3RoZXRpY3MgbcO8c3NlbiBhdcOfZXJoYWxiIGRlciBgYWVzKClgIEZ1bmt0aW9uIGRlZmluaWVydAp3ZXJkZW4sIGRhbWl0IHNpZSB1bmFiaMOkbmdpZyB2b24gVmFyaWFibGVuIGbDvHIgYWxsZSBEYXRlbnB1bmt0ZSBnZWx0ZW46CgpgYGB7cn0KZ2dwbG90KGRhdGEgPSBpcmlzKSArCiAgZ2VvbV9wb2ludChtYXBwaW5nID0gYWVzKHggPSBTZXBhbC5MZW5ndGgsIHkgPSBTZXBhbC5XaWR0aCksIGNvbG9yID0gImdyZWVuIiwgc2hhcGUgPSAxNykKYGBgCgojIyMjIE51dHplbiBTaWUgbnVuIEFlc3RoZXRpY3MsIHVtIGRpZSBGYXJiZSB1bmQgRm9ybSBkZXIgUHVua3RlIGdlbcOkw58gZGVyIFNwZXppZXMgKFZhcmlhYmxlIGBTcGVjaWVzYCkgenUgw6RuZGVybi4gw4RuZGVybiBTaWUgenVzw6R0emxpY2ggZGllIEdyw7bDn2UgYWxsZXIgUHVua3RlLgoKVW0gZGllIEZhcmJlIGBjb2xvcmAgdW5kIEZvcm0gYHNoYXBlYCBiZXrDvGdsaWNoIGRlciBTcGV6aWVzIChWYXJpYWJsZQpgU3BlY2llc2ApIGFuenVwYXNzZW4sIG3DvHNzZW4gZGllc2UgaW5uZXJoYWxiIGRlciBgYWVzKClgIEZ1bmt0aW9uCmRlZmluaWVydCB3ZXJkZW4uIERhbWl0IHp1c8OkdHpsaWNoIGRpZSBHcsO2w59lIGBzaXplYCBhbGxlciBEYXRlbnB1a3RlCnZlcsOkbmRlcnQgd2VyZGVuIGthbm4sIG11c3MgZGllcyBhdcOfZXJoYWxiIGRlciBgYWVzKClgIEZ1bmt0aW9uCmRlZmluaWVydCB3ZXJkZW46CgpgYGB7cn0KZ2dwbG90KGRhdGEgPSBpcmlzKSArCiAgZ2VvbV9wb2ludChtYXBwaW5nID0gYWVzKHggPSBTZXBhbC5MZW5ndGgsIHkgPSBTZXBhbC5XaWR0aCwgY29sb3IgPSBTcGVjaWVzLCBzaGFwZSA9IFNwZWNpZXMpLCBzaXplID0gMykKYGBgCgojIyMjIMOEbmRlcm4gU2llIGViZW5mYWxscyBkaWUgQWVzdGhldGljcyBgYWxwaGFgLCBgZmlsbGAgdW5kIGBzdHJva2VgLgoKQWNodHVuZzogYGZpbGxgIMOkbmRlcnQgbnVyIGRpZSBGw7xsbGZhcmJlLCBzb2Zlcm4gZGllIGRlZmluaWVydGUgRm9ybSB2b24KYHNoYXBlYCBkYXMgZXJsYXVidC4KClNwaWVsZW4gU2llIG1pdCBkZW4gQWVzdGhldGljcyBoZXJ1bSB1bmQgdGVzdGVuIFNpZSBzZWxic3QsIHdhcyBzaWNoCsOkbmRlcnQsIHdlbm4gZGllc2UgaW5uZXJoYWxiIG9kZXIgYXXDn2VyaGFsYiBkZXIgYGFlcygpYCBGdW5rdGlvbiBzdGVoZW4uCgpgYGB7cn0KZ2dwbG90KGRhdGEgPSBpcmlzKSArCiAgZ2VvbV9wb2ludChtYXBwaW5nID0gYWVzKHggPSBTZXBhbC5MZW5ndGgsIHkgPSBTZXBhbC5XaWR0aCwgY29sb3IgPSBTcGVjaWVzKSwgc2hhcGUgPSAyMSwgZmlsbCA9ICJibGFjayIsIHNpemUgPSAyLCBzdHJva2UgPSAzLCBhbHBoYSA9IDAuNikKYGBgCgojIyMjIFdhcyBwYXNzaWVydCwgd2VubiBTaWUgZWluZXIgQWVzdGhldGljIGVpbmUgcXVhbnRpdGF0aXZlIFZhcmlhYmxlIHp1b3JkbmVuPyBUZXN0ZW4gU2llIGJlaXNwaWVsc3dlaXNlIGBhZXMoY29sb3IgPSBTZXBhbC5MZW5ndGgpYCBvZGVyIGBhZXMoc2l6ZSA9IFNlcGFsLkxlbmd0aClgLgoKYGBge3J9CmdncGxvdChkYXRhID0gaXJpcykgKwogIGdlb21fcG9pbnQobWFwcGluZyA9IGFlcyh4ID0gU2VwYWwuTGVuZ3RoLCB5ID0gU2VwYWwuV2lkdGgsIGNvbG9yID0gU2VwYWwuTGVuZ3RoKSkKZ2dwbG90KGRhdGEgPSBpcmlzKSArCiAgZ2VvbV9wb2ludChtYXBwaW5nID0gYWVzKHggPSBTZXBhbC5MZW5ndGgsIHkgPSBTZXBhbC5XaWR0aCwgc2l6ZSA9IFNlcGFsLkxlbmd0aCkpCmBgYAoKRGllIEZhcmJlIGdlaHQgZW50c3ByZWNoZW5kIGRlciBrb250aW51aWVybGljaGVuIFZhcmlhYmxlIGBTZXBhbC5MZW5ndGhgCnZvbiBkdW5rZWxibGF1IHp1IGhlbGxibGF1IMO8YmVyLgoKw4RobmxpY2ggdmVyaMOkbHQgc2ljaCBkaWUgR3LDtsOfZSwgd2VsY2hlIGVudHNwcmVjaGVuZCBkZXIgVmFyaWFibGUKYFNlcGFsLkxlbmd0aGAgYW5nZXBhc3N0IHdpcmQuCgpKZSBuYWNoIEZyYWdlc3RlbGx1bmcga8O2bm5lbiBTaWUgc28gYmVpc3BpZWxzd2Vpc2UgSWhyZSBEYXRlbiBlYmVuZmFsbHMKaGVydm9yaGViZW4uCgojIyMjIFdhcyBwYXNzaWVydCwgd2VubiBTaWUgenVzw6R0emxpY2ggaW4gZGVuIEFlc3RoZXRpY3MgYGFlcyhjb2xvciA9IFNlcGFsLkxlbmd0aCA8IDYpYCBhbmdlYmVuPyBIaWVyYmVpIGhhbmRlbHQgZXMgc2ljaCBuaWNodCBkaXJla3QgdW0gZGllIFp1b3JkbnVuZyBlaW5lciBWYXJpYWJsZW4genUgZWluZXIgQWVzdGhldGljLgoKYGBge3J9CmdncGxvdChkYXRhID0gaXJpcykgKwogIGdlb21fcG9pbnQobWFwcGluZyA9IGFlcyh4ID0gU2VwYWwuTGVuZ3RoLCB5ID0gU2VwYWwuV2lkdGgsIGNvbG9yID0gU2VwYWwuTGVuZ3RoIDwgNikpCmBgYAoKU2llIHNlaGVuLCBkYXNzIGRpZSBEYXRlbnB1bmt0ZSAoUGZsYW56ZW4pIG1pdCBlaW5lciBgU2VwYWwuTGVuZ3RoYCB2b24Kw7xiZXIgdW5kIHVudGVyIDZjbSBhdXRvbWF0aXNjaCB1bnRlcnNjaGllZGxpY2ggZGFyZ2VzdGVsbHQgd2VyZGVuIHVuZAplaW5lIExlZ2VuZGUgaGluenVnZWbDvGd0IHd1cmRlLgoKU29taXQga8O2bm5lbiBTaWUgYW5oYW5kIHZvbiBCZWRpbmd1bmdlbiAobmljaHQgbnVyIGVpbnplbG5lIFZhcmlhYmxlbikKSWhyZSBEYXRlbnB1bmt0ZSBkdXJjaCBBZXN0aGV0aWNzIGhlcnZvcmhlYmVuLgo=