Data Science Stream
Checklist
No answer required. Just make sure you have completed the tasks listed in the dot-points.
Installing new R packages
Making memes in RStudio
hagrid <- "https://i.imgflip.com/13wb2t.jpg"
meme(hagrid, "Yer a wizard", "with coding", font = "sans")

Note: Some warnings may appear in your R Console as this code is executing. Don’t worry about it, it is safe to ignore these warnings.
How to save RStudio images
success_kid <- "http://i0.kym-cdn.com/entries/icons/mobile/000/000/745/success.jpg"
success <- meme(success_kid, "Using R", "to make memes", font = "sans")
success

Option A: Base R function
windows() # or quartz, if you are a Mac user
success # render the image in the graphics device
savePlot(filename = "successkid", type = "png")
Option B: A function from a specific package
An example command to save the success
object to the imaginary filepath "STM1001/Data Science/success_kid_R_meme.png"
is shown below.
meme_save(success, file="STM1001/Data Science/success_kid_R_meme.png")
Option C: Via the RStudio Plots window
No answer required.
Please refer to the previous steps of 2 for a guide on loading an image, adding text, and then saving your creation.
Customizing GIFs in RStudio
Please note that for this question, while the code to present the GIFs is included, the GIFs themselves are not reproduced in the documentation below.
install.packages("magick")
library(magick)
Earth <- image_read("https://i.giphy.com/media/mf8UbIDew7e8g/giphy.gif")
Earth
rev(Earth) %>%
image_flip() %>%
image_annotate(" Meanwhile, in Australia", size = 40, color = "white")
Palmer Penguins Data Set
install.packages("palmerpenguins")
library(palmerpenguins)
##
## Attaching package: 'palmerpenguins'
## The following objects are masked from 'package:datasets':
##
## penguins, penguins_raw
# This code checks the dimensions of the data in the `palmerpenguins` package
dim(penguins)
## [1] 344 8
nrow(penguins)
## [1] 344
ncol(penguins)
## [1] 8
# This code summarises the data in the `palmerpenguins` package
summary(penguins)
## species island bill_length_mm bill_depth_mm
## Adelie :152 Biscoe :168 Min. :32.10 Min. :13.10
## Chinstrap: 68 Dream :124 1st Qu.:39.23 1st Qu.:15.60
## Gentoo :124 Torgersen: 52 Median :44.45 Median :17.30
## Mean :43.92 Mean :17.15
## 3rd Qu.:48.50 3rd Qu.:18.70
## Max. :59.60 Max. :21.50
## NA's :2 NA's :2
## flipper_length_mm body_mass_g sex year
## Min. :172.0 Min. :2700 female:165 Min. :2007
## 1st Qu.:190.0 1st Qu.:3550 male :168 1st Qu.:2007
## Median :197.0 Median :4050 NA's : 11 Median :2008
## Mean :200.9 Mean :4202 Mean :2008
## 3rd Qu.:213.0 3rd Qu.:4750 3rd Qu.:2009
## Max. :231.0 Max. :6300 Max. :2009
## NA's :2 NA's :2
# This code checks the first 6 rows of data in the `palmerpenguins` package
head(penguins)
## # A tibble: 6 × 8
## species island bill_length_mm bill_depth_mm flipper_length_mm body_mass_g
## <fct> <fct> <dbl> <dbl> <int> <int>
## 1 Adelie Torgersen 39.1 18.7 181 3750
## 2 Adelie Torgersen 39.5 17.4 186 3800
## 3 Adelie Torgersen 40.3 18 195 3250
## 4 Adelie Torgersen NA NA NA NA
## 5 Adelie Torgersen 36.7 19.3 193 3450
## 6 Adelie Torgersen 39.3 20.6 190 3650
## # ℹ 2 more variables: sex <fct>, year <int>
Note that the code for this question is shown below, but the output is omitted, for brevity.
penguins$bill_length_mm
Note that the code for this question is shown below, but the output is omitted, for brevity.
penguins$bill_depth_mm
penguins$body_mass_g
Well done, that’s everything covered.
References
Horst, Allison Marie, Alison Presmanes Hill, and Kristen B Gorman. 2020.
Palmerpenguins: Palmer Archipelago (Antarctica) Penguin Data.
https://doi.org/10.5281/zenodo.3960218.
Ooms, Jeroen. 2021.
magick: advanced graphics and image-processing in R.
https://docs.ropensci.org/magick/.
Yu, Guangchuang. 2021.
meme: create memes in R.
https://github.com/GuangchuangYu/meme/.
These notes have been prepared by Rupert Kuveke. The copyright for the material in these notes resides with the author named above, with the Department of Mathematical and Physical Sciences and with La Trobe University. Copyright in this work is vested in La Trobe University including all La Trobe University branding and naming. Unless otherwise stated, material within this work is licensed under a Creative Commons Attribution-Non Commercial-Non Derivatives License
BY-NC-ND.
LS0tDQp0aXRsZTogIlNUTTEwMDE6IENvbXB1dGVyIExhYiAxQiBTb2x1dGlvbnMiDQpvdXRwdXQ6DQogIGJvb2tkb3duOjpodG1sX2RvY3VtZW50MjogDQogICAgdG9jOiB0cnVlDQogICAgdG9jX2Zsb2F0OiB0cnVlDQogICAgY29kZV9kb3dubG9hZDogdHJ1ZQ0KICAgIHRoZW1lOiByZWFkYWJsZQ0KICAgIGNvZGVfZm9sZGluZzogc2hvdw0KYmlibGlvZ3JhcGh5OiBTVE0xMDAxX0RTX0NMX3JlZmVyZW5jZXMuYmliIA0KbGluay1jaXRhdGlvbnM6IHllcw0KLS0tDQoNCjxzdHlsZT4NCiNUT0Mgew0KICBiYWNrZ3JvdW5kOiB1cmwoImh0dHBzOi8vd3d3LmxhdHJvYmUuZWR1LmF1L19tZWRpYS9sYS10cm9iZS1hcGkvdjUvaW1nL2xvZ28uc3ZnIik7DQogIGJhY2tncm91bmQtc2l6ZTogY29udGFpbjsNCiAgcGFkZGluZy10b3A6IDgwcHggIWltcG9ydGFudDsNCiAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDsNCn0NCjwvc3R5bGU+DQoNCiMjIyBEYXRhIFNjaWVuY2UgU3RyZWFtIHstfQ0KDQojIyMgVG9waWMgMUI6IFVzaW5nIFJTdHVkaW8gey19DQoNCjxicj4NCg0KRXhhbXBsZSBSIGNvZGUgc29sdXRpb25zIGZvciB0aGUgW0RhdGEgU2NpZW5jZSBDb21wdXRlciBMYWIgMV0oaHR0cHM6Ly9ycHVicy5jb20vTFRVX1NUTTEwMDEvRFNNQ0wxKSwgd2hpY2ggdXNlcyB0aGUgcGFja2FnZXMgYG1lbWVgIFtAbWVtZXNdLCBgbWFnaWNrYCBbQG1hZ2lja10sDQo8IS0tIGByZmlzaGRyYXdgIFtAcmZpc2hkcmF3XSAgLS0+DQphbmQgYHBhbG1lcnBlbmd1aW5zYCBbQHBlbmd1aW5zXSwgYXJlIHByZXNlbnRlZCBiZWxvdy4NCg0KPGJyPg0KDQojIENoZWNrbGlzdCB7LX0NCg0KTm8gYW5zd2VyIHJlcXVpcmVkLiBKdXN0IG1ha2Ugc3VyZSB5b3UgaGF2ZSBjb21wbGV0ZWQgdGhlIHRhc2tzIGxpc3RlZCBpbiB0aGUgZG90LXBvaW50cy4NCg0KIyBJbnN0YWxsaW5nIG5ldyBSIHBhY2thZ2VzDQoNCiMjDQoNCmBgYHtyIGNsYXNzLnNvdXJjZSA9ICJmb2xkLXNob3ciLCBldmFsID0gRiwgZWNobyA9IFQsIGluY2x1ZGUgPSBGfQ0KaW5zdGFsbC5wYWNrYWdlcygibWVtZSIsIHJlcG9zID0gImh0dHA6Ly9jcmFuLnVzLnItcHJvamVjdC5vcmciKQ0KYGBgDQoNCmBgYHtyIGNsYXNzLnNvdXJjZSA9ICJmb2xkLXNob3ciLCBldmFsID0gRiwgZWNobyA9IFR9DQppbnN0YWxsLnBhY2thZ2VzKCJtZW1lIikNCmBgYA0KDQojIw0KDQpObyBhbnN3ZXIgcmVxdWlyZWQuDQoNCiMjDQoNCmBgYHtyIGNsYXNzLnNvdXJjZSA9ICJmb2xkLXNob3ciLCBldmFsID0gVCwgZWNobyA9IEYsIGluY2x1ZGUgPSBGfQ0KbGlicmFyeShtZW1lKQ0KYGBgDQoNCmBgYHtyIGNsYXNzLnNvdXJjZSA9ICJmb2xkLXNob3ciLCBldmFsID0gRiwgZWNobyA9IFR9DQpsaWJyYXJ5KG1lbWUpDQpgYGANCg0KDQojIE1ha2luZyBtZW1lcyBpbiBSU3R1ZGlvIHsjbWVtZXN9DQoNCiMjIA0KDQpgYGB7ciBjbGFzcy5zb3VyY2UgPSAiZm9sZC1zaG93IiwgZXZhbCA9IFQsIGVjaG8gPSBUfQ0KaGFncmlkIDwtICJodHRwczovL2kuaW1nZmxpcC5jb20vMTN3YjJ0LmpwZyINCmBgYA0KDQojIw0KDQpgYGB7ciBjbGFzcy5zb3VyY2UgPSAiZm9sZC1zaG93IiwgZXZhbCA9IFQsIGVjaG8gPSBULCBmaWcuYWxpZ24gPSAiY2VudGVyIn0NCm1lbWUoaGFncmlkLCAiWWVyIGEgd2l6YXJkIiwgIndpdGggY29kaW5nIiwgZm9udCA9ICJzYW5zIikNCmBgYA0KDQoqTm90ZTogU29tZSB3YXJuaW5ncyBtYXkgYXBwZWFyIGluIHlvdXIgUiBDb25zb2xlIGFzIHRoaXMgY29kZSBpcyBleGVjdXRpbmcuIERvbid0IHdvcnJ5IGFib3V0IGl0LCBpdCBpcyBzYWZlIHRvIGlnbm9yZSB0aGVzZSB3YXJuaW5ncy4qIA0KDQojIyBIb3cgdG8gc2F2ZSBSU3R1ZGlvIGltYWdlcw0KDQpgYGB7ciBjbGFzcy5zb3VyY2UgPSAiZm9sZC1zaG93IiwgZXZhbCA9IFQsIGVjaG8gPSBULCBmaWcuYWxpZ24gPSAiY2VudGVyIn0NCnN1Y2Nlc3Nfa2lkIDwtICJodHRwOi8vaTAua3ltLWNkbi5jb20vZW50cmllcy9pY29ucy9tb2JpbGUvMDAwLzAwMC83NDUvc3VjY2Vzcy5qcGciDQpzdWNjZXNzIDwtIG1lbWUoc3VjY2Vzc19raWQsICJVc2luZyBSIiwgInRvIG1ha2UgbWVtZXMiLCBmb250ID0gInNhbnMiKQ0Kc3VjY2Vzcw0KYGBgDQoNCiMjIyBPcHRpb24gQTogQmFzZSBSIGZ1bmN0aW9uDQoNCmBgYHtyIGNsYXNzLnNvdXJjZSA9ICJmb2xkLXNob3ciLCBldmFsID0gRiwgZWNobyA9IFR9DQp3aW5kb3dzKCkgIyBvciBxdWFydHosIGlmIHlvdSBhcmUgYSBNYWMgdXNlcg0Kc3VjY2VzcyAjIHJlbmRlciB0aGUgaW1hZ2UgaW4gdGhlIGdyYXBoaWNzIGRldmljZQ0Kc2F2ZVBsb3QoZmlsZW5hbWUgPSAic3VjY2Vzc2tpZCIsIHR5cGUgPSAicG5nIikgDQpgYGANCg0KIyMjIE9wdGlvbiBCOiBBIGZ1bmN0aW9uIGZyb20gYSBzcGVjaWZpYyBwYWNrYWdlDQoNCkFuIGV4YW1wbGUgY29tbWFuZCB0byBzYXZlIHRoZSBgc3VjY2Vzc2Agb2JqZWN0IHRvIHRoZSAqKmltYWdpbmFyeSBmaWxlcGF0aCoqIGAiU1RNMTAwMS9EYXRhIFNjaWVuY2Uvc3VjY2Vzc19raWRfUl9tZW1lLnBuZyJgIGlzIHNob3duIGJlbG93Lg0KDQpgYGB7ciBjbGFzcy5zb3VyY2UgPSAiZm9sZC1zaG93IiwgZXZhbCA9IEYsIGVjaG8gPSBUfQ0KbWVtZV9zYXZlKHN1Y2Nlc3MsIGZpbGU9IlNUTTEwMDEvRGF0YSBTY2llbmNlL3N1Y2Nlc3Nfa2lkX1JfbWVtZS5wbmciKSANCmBgYA0KDQojIyMgT3B0aW9uIEM6IFZpYSB0aGUgUlN0dWRpbyBQbG90cyB3aW5kb3cNCg0KTm8gYW5zd2VyIHJlcXVpcmVkLg0KDQojIw0KDQpQbGVhc2UgcmVmZXIgdG8gdGhlIHByZXZpb3VzIHN0ZXBzIG9mIFxAcmVmKG1lbWVzKSBmb3IgYSBndWlkZSBvbiBsb2FkaW5nIGFuIGltYWdlLCBhZGRpbmcgdGV4dCwgYW5kIHRoZW4gc2F2aW5nIHlvdXIgY3JlYXRpb24uDQoNCiMgQ3VzdG9taXppbmcgR0lGcyBpbiBSU3R1ZGlvDQoNCipQbGVhc2Ugbm90ZSB0aGF0IGZvciB0aGlzIHF1ZXN0aW9uLCB3aGlsZSB0aGUgY29kZSB0byBwcmVzZW50IHRoZSBHSUZzIGlzIGluY2x1ZGVkLCB0aGUgR0lGcyB0aGVtc2VsdmVzIGFyZSBub3QgcmVwcm9kdWNlZCBpbiB0aGUgZG9jdW1lbnRhdGlvbiBiZWxvdy4qDQoNCiMjDQoNCmBgYHtyIGNsYXNzLnNvdXJjZSA9ICJmb2xkLXNob3ciLCBldmFsID0gRiwgZWNobyA9IFQsIGluY2x1ZGUgPSBGfQ0KaW5zdGFsbC5wYWNrYWdlcygibWFnaWNrIiwgcmVwb3MgPSAiaHR0cDovL2NyYW4udXMuci1wcm9qZWN0Lm9yZyIpDQpgYGANCg0KYGBge3IgY2xhc3Muc291cmNlID0gImZvbGQtc2hvdyIsIGV2YWwgPSBGLCBlY2hvID0gVH0NCmluc3RhbGwucGFja2FnZXMoIm1hZ2ljayIpDQpgYGANCg0KYGBge3IgY2xhc3Muc291cmNlID0gImZvbGQtc2hvdyIsIGV2YWwgPSBULCBlY2hvID0gRiwgaW5jbHVkZSA9IEZ9DQpsaWJyYXJ5KG1hZ2ljaykNCmBgYA0KDQpgYGB7ciBjbGFzcy5zb3VyY2UgPSAiZm9sZC1zaG93IiwgZXZhbCA9IEYsIGVjaG8gPSBUfQ0KbGlicmFyeShtYWdpY2spDQpgYGANCg0KIyMNCg0KYGBge3IgY2xhc3Muc291cmNlID0gImZvbGQtc2hvdyIsIGV2YWwgPSBGLCBlY2hvID0gVCwgZmlnLmFsaWduID0gImNlbnRlciJ9DQpFYXJ0aCA8LSBpbWFnZV9yZWFkKCJodHRwczovL2kuZ2lwaHkuY29tL21lZGlhL21mOFViSURldzdlOGcvZ2lwaHkuZ2lmIikNCkVhcnRoDQpgYGANCg0KIyMNCg0KYGBge3IgY2xhc3Muc291cmNlID0gImZvbGQtc2hvdyIsIGV2YWwgPSBGLCBlY2hvID0gVCwgZmlnLmFsaWduID0gImNlbnRlciJ9DQpyZXYoRWFydGgpICU+JSANCiAgICAgICAgICAgaW1hZ2VfZmxpcCgpICU+JSANCiAgICAgICAgICAgaW1hZ2VfYW5ub3RhdGUoIiAgICAgIE1lYW53aGlsZSwgaW4gQXVzdHJhbGlhIiwgc2l6ZSA9IDQwLCBjb2xvciA9ICJ3aGl0ZSIpDQpgYGANCg0KPCEtLSAjIERyYXdpbmcgYSBmaXNoIGluIFJTdHVkaW8gLS0+DQoNCjwhLS0gIyMgLS0+DQoNCjwhLS0gYGBge3IgY2xhc3Muc291cmNlID0gImZvbGQtc2hvdyIsIGV2YWwgPSBGLCBlY2hvID0gVCwgaW5jbHVkZSA9IEZ9IC0tPg0KPCEtLSBpbnN0YWxsLnBhY2thZ2VzKCJyZmlzaGRyYXciLCByZXBvcyA9ICJodHRwOi8vY3Jhbi51cy5yLXByb2plY3Qub3JnIikgLS0+DQo8IS0tIGluc3RhbGwucGFja2FnZXMoInBhdGNod29yayIsIHJlcG9zID0gImh0dHA6Ly9jcmFuLnVzLnItcHJvamVjdC5vcmciKSAtLT4NCjwhLS0gaW5zdGFsbC5wYWNrYWdlcygiZ2dwbG90MiIsIHJlcG9zID0gImh0dHA6Ly9jcmFuLnVzLnItcHJvamVjdC5vcmciKSAtLT4NCjwhLS0gYGBgIC0tPg0KDQo8IS0tIGBgYHtyIGNsYXNzLnNvdXJjZSA9ICJmb2xkLXNob3ciLCBldmFsID0gRiwgZWNobyA9IFR9IC0tPg0KPCEtLSAjIE1haW4gcGFja2FnZSAtLT4NCjwhLS0gaW5zdGFsbC5wYWNrYWdlcygicmZpc2hkcmF3IikgLS0+DQo8IS0tICMgRGVwZW5kZW5jaWVzIC0tPg0KPCEtLSBpbnN0YWxsLnBhY2thZ2VzKCJwYXRjaHdvcmsiKTsgaW5zdGFsbC5wYWNrYWdlcygiZ2dwbG90MiIpIC0tPg0KPCEtLSBgYGAgLS0+DQoNCjwhLS0gYGBge3IgY2xhc3Muc291cmNlID0gImZvbGQtc2hvdyIsIGV2YWwgPSBULCBlY2hvID0gRiwgaW5jbHVkZSA9IEZ9IC0tPg0KPCEtLSBsaWJyYXJ5KCJyZmlzaGRyYXciKTsgbGlicmFyeSgicGF0Y2h3b3JrIik7IGxpYnJhcnkoImdncGxvdDIiKSAtLT4NCjwhLS0gYGBgIC0tPg0KDQo8IS0tIGBgYHtyIGNsYXNzLnNvdXJjZSA9ICJmb2xkLXNob3ciLCBldmFsID0gRiwgZWNobyA9IFR9IC0tPg0KPCEtLSBsaWJyYXJ5KCJyZmlzaGRyYXciKTsgbGlicmFyeSgicGF0Y2h3b3JrIik7IGxpYnJhcnkoImdncGxvdDIiKSAtLT4NCjwhLS0gYGBgIC0tPg0KDQo8IS0tICMjIC0tPg0KDQo8IS0tIEFuIGV4YW1wbGUgc29sdXRpb24gZm9yIFdpbmRvd3MgdXNlcnMgaXMgc2hvd24gYmVsb3c6IC0tPg0KDQo8IS0tIGBgYHtyIGNsYXNzLnNvdXJjZSA9ICJmb2xkLXNob3ciLCBldmFsID0gRiwgZWNobyA9IFQsIG1lc3NhZ2UgPSBGfSAtLT4NCjwhLS0gZ2V0X3BvbHlsaW5lcyhwYXRoID0gImluc3QvZmlzaGRyYXcuanMiLCBmb3JtYXQgPSAic21pbCIsIC0tPg0KPCEtLSAgICAgICAgICAgICAgIG91dHB1dCA9ICJhbmltYXRlZC5zdmciLCBkcmF3X3R5cGUgPSAicmFuZG9tIikgLS0+DQoNCjwhLS0gd2luZG93cygpIC0tPg0KPCEtLSBmaXNoX2RyYXcoKSAtLT4NCjwhLS0gYGBgIC0tPg0KDQo8IS0tIGBgYHtyIGNsYXNzLnNvdXJjZSA9ICJmb2xkLXNob3ciLCBldmFsID0gVCwgZWNobyA9IEYsIHdhcm5pbmcgPSBGLCBpbmNsdWRlID0gRn0gLS0+DQo8IS0tIGdldF9wb2x5bGluZXMocGF0aCA9ICJpbnN0L2Zpc2hkcmF3LmpzIiwgZm9ybWF0ID0gInNtaWwiLCAtLT4NCjwhLS0gICAgICAgICAgICAgICBvdXRwdXQgPSAiYW5pbWF0ZWQuc3ZnIiwgZHJhd190eXBlID0gInJhbmRvbSIpIC0tPg0KDQo8IS0tIHdpbmRvd3MoKSAtLT4NCjwhLS0gZmlzaF9kcmF3KCkgLS0+DQo8IS0tIGBgYCAtLT4NCg0KPCEtLSAjIyAtLT4NCg0KPCEtLSBgYGB7ciBjbGFzcy5zb3VyY2UgPSAiZm9sZC1zaG93IiwgZXZhbCA9IFQsIGVjaG8gPSBUfSAtLT4NCjwhLS0gZmlzaF9kcmF3KGNvbCA9ICJibHVlIikgLS0+DQo8IS0tIGBgYCAtLT4NCg0KPCEtLSBBcyBhbiBleGFtcGxlLCB5b3UgbWF5IGhhdmUgY2hhbmdlZCB0aGUgZmlzaCBjb2xvdXIgdG8gcmVkLCBpbiB3aGljaCBjYXNlIHlvdXIgY29kZSB3b3VsZCBsb29rIGxpa2UgdGhpczogLS0+DQo8IS0tIGBgYHtyIGNsYXNzLnNvdXJjZSA9ICJmb2xkLXNob3ciLCBldmFsID0gRiwgZWNobyA9IFR9IC0tPg0KPCEtLSBmaXNoX2RyYXcoY29sID0gInJlZCIpIC0tPg0KPCEtLSBgYGAgLS0+DQoNCiMgUGFsbWVyIFBlbmd1aW5zIERhdGEgU2V0IHsjcGVuZ3VpbnN9DQoNCiMjDQoNCmBgYHtyIGNsYXNzLnNvdXJjZSA9ICJmb2xkLXNob3ciLCBldmFsID0gRiwgZWNobyA9IEYsIGluY2x1ZGUgPSBGfQ0KaW5zdGFsbC5wYWNrYWdlcyhzZXRkaWZmKCJwYWxtZXJwZW5ndWlucyIsIHJvd25hbWVzKGluc3RhbGxlZC5wYWNrYWdlcygpKSksIHJlcG9zID0gImh0dHA6Ly9jcmFuLnVzLnItcHJvamVjdC5vcmciKQ0KYGBgDQoNCmBgYHtyIGNsYXNzLnNvdXJjZSA9ICJmb2xkLXNob3ciLCBldmFsID0gRiwgZWNobyA9IFR9DQppbnN0YWxsLnBhY2thZ2VzKCJwYWxtZXJwZW5ndWlucyIpDQpgYGANCg0KYGBge3IgY2xhc3Muc291cmNlID0gImZvbGQtc2hvdyIsIGV2YWwgPSBULCBlY2hvID0gVH0NCmxpYnJhcnkocGFsbWVycGVuZ3VpbnMpDQpgYGANCg0KIyMNCg0KYGBge3IgY2xhc3Muc291cmNlID0gImZvbGQtc2hvdyIsIGV2YWwgPSBULCBlY2hvID0gVH0NCiMgVGhpcyBjb2RlIGNoZWNrcyB0aGUgZGltZW5zaW9ucyBvZiB0aGUgZGF0YSBpbiB0aGUgYHBhbG1lcnBlbmd1aW5zYCBwYWNrYWdlDQpkaW0ocGVuZ3VpbnMpDQpucm93KHBlbmd1aW5zKQ0KbmNvbChwZW5ndWlucykNCmBgYA0KDQojIw0KDQpgYGB7ciBjbGFzcy5zb3VyY2UgPSAiZm9sZC1zaG93IiwgZXZhbCA9IFQsIGVjaG8gPSBUfQ0KIyBUaGlzIGNvZGUgc3VtbWFyaXNlcyB0aGUgZGF0YSBpbiB0aGUgYHBhbG1lcnBlbmd1aW5zYCBwYWNrYWdlDQpzdW1tYXJ5KHBlbmd1aW5zKQ0KYGBgDQoNCiMjDQoNCmBgYHtyIGNsYXNzLnNvdXJjZSA9ICJmb2xkLXNob3ciLCBldmFsID0gVCwgZWNobyA9IFR9DQojIFRoaXMgY29kZSBjaGVja3MgdGhlIGZpcnN0IDYgcm93cyBvZiBkYXRhIGluIHRoZSBgcGFsbWVycGVuZ3VpbnNgIHBhY2thZ2UNCmhlYWQocGVuZ3VpbnMpDQpgYGANCg0KIyMNCg0KTm90ZSB0aGF0IHRoZSBjb2RlIGZvciB0aGlzIHF1ZXN0aW9uIGlzIHNob3duIGJlbG93LCBidXQgdGhlIG91dHB1dCBpcyBvbWl0dGVkLCBmb3IgYnJldml0eS4NCg0KYGBge3IgY2xhc3Muc291cmNlID0gImZvbGQtc2hvdyIsIGV2YWwgPSBGLCBlY2hvID0gVH0NCnBlbmd1aW5zJGJpbGxfbGVuZ3RoX21tDQpgYGANCg0KIyMNCg0KTm90ZSB0aGF0IHRoZSBjb2RlIGZvciB0aGlzIHF1ZXN0aW9uIGlzIHNob3duIGJlbG93LCBidXQgdGhlIG91dHB1dCBpcyBvbWl0dGVkLCBmb3IgYnJldml0eS4NCg0KYGBge3IgY2xhc3Muc291cmNlID0gImZvbGQtc2hvdyIsIGV2YWwgPSBGLCBlY2hvID0gVH0NCnBlbmd1aW5zJGJpbGxfZGVwdGhfbW0NCnBlbmd1aW5zJGJvZHlfbWFzc19nDQpgYGANCg0KPGJyPg0KDQojIyMjIFdlbGwgZG9uZSwgdGhhdCdzIGV2ZXJ5dGhpbmcgY292ZXJlZC4gIyMjIyB7LX0NCg0KPGJyPg0KDQojIFJlZmVyZW5jZXMgey0gI1JlZn0NCjxkaXYgaWQ9InJlZnMiPjwvZGl2Pg0KDQo8YnI+DQoNCjxmb250IGNvbG9yID0gImdyZXkiPg0KVGhlc2Ugbm90ZXMgaGF2ZSBiZWVuIHByZXBhcmVkIGJ5IFJ1cGVydCBLdXZla2UuIFRoZSBjb3B5cmlnaHQgZm9yIHRoZSBtYXRlcmlhbCBpbiB0aGVzZSBub3RlcyByZXNpZGVzIHdpdGggdGhlIGF1dGhvciBuYW1lZCBhYm92ZSwgd2l0aCB0aGUgRGVwYXJ0bWVudCBvZiBNYXRoZW1hdGljYWwgYW5kIFBoeXNpY2FsIFNjaWVuY2VzIGFuZCB3aXRoIExhIFRyb2JlIFVuaXZlcnNpdHkuIENvcHlyaWdodCBpbiB0aGlzIHdvcmsgaXMgdmVzdGVkIGluIExhIFRyb2JlIFVuaXZlcnNpdHkgaW5jbHVkaW5nIGFsbCBMYSBUcm9iZSBVbml2ZXJzaXR5IGJyYW5kaW5nIGFuZCBuYW1pbmcuIFVubGVzcyBvdGhlcndpc2Ugc3RhdGVkLCBtYXRlcmlhbCB3aXRoaW4gdGhpcyB3b3JrIGlzIGxpY2Vuc2VkIHVuZGVyIGEgQ3JlYXRpdmUgQ29tbW9ucyBBdHRyaWJ1dGlvbi1Ob24gQ29tbWVyY2lhbC1Ob24gRGVyaXZhdGl2ZXMgTGljZW5zZSANCjxhIGhyZWYgPSAiaHR0cHM6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL2xpY2Vuc2VzL2J5LW5jLW5kLzQuMC9DQyIgdGFyZ2V0PSJfYmxhbmsiPiBCWS1OQy1ORC4gPC9hPg0KPC9mb250Pg==