

Email : ainun.juriyah@student.matanauniversity.ac.id
RPubs : https://rpubs.com/ainun/
Jurusan : Fisika Medis (https://matanauniversity.ac.id/?ly=academic&c=sb)
Address : ARA Center, Matana University Tower
Jl. CBD Barat Kav, RT.1, Curug Sangereng, Kelapa Dua, Tangerang, Banten 15810.
LIST
List adalah struktur data pada R dan Python yang mampu menyimpan lebih dari satu data, seperti array. Pada kali ini, kita akan membahas cara menggunakan list di R dan Python dari yang paling sederhana sampai yang sedikit lebih kompleks.
Membentuk List
Hal terpenting yang harus dipelajari adalah bagaimana untuk membuat list. Terdapat beberapa perbedaan mendasar yang harus di perhatikan saat membentuk list didalam R dan Python. Perhatikan contoh berikut!
list0 = list()
list1 = list("Yedam")
list2 = list("Jaemin")
print(c(list1, list2))
## [[1]]
## [1] "Yedam"
##
## [[2]]
## [1] "Jaemin"
Pengindeksan nilai dari list
Setelah tahu cara membuat dan menyimpan data di dalam List, mari kita coba ambil datanya. List sama seperti array, list juga memiliki nomor indeks untuk mengakses data atau isinya.
list3 = list("Member", "Seventeen", "tigabelas")
print(c(list3[3]))
## [[1]]
## [1] "tigabelas"
Menambahkan dan Menghapus
Untuk menambahkan atau mengganti atau menghapus nilai pada suatu List bersifat mutable, artinya isinya bisa kita ubah-ubah.
list4 = list("Yedam", "Junkyu", "Jeongwoo", "treasure")
list4[3] = "Asahi"
Selain cara di atas berikut ini terdapat dua metode atau fungsi lainnya yang dapat digunakan untuk menambahkan isi atau item ke list.
list4=c(list4, "JYP")
list4=c("YG", list3)
print(c(list4))
Tuple
Tuple dalam R dan Pyhton adalah struktur data yang digunakan untuk menyimpan sekumpulan data. Tuple bersifat immutable, artinya isi tuple tidak bisa kita ubah dan hapus. Namun, dapat kita isi dengan berbagai macam nilai dan objek, sebagai berikut:
- Cara membentuk Tuple
- Cara mengakses nilai Tuple
- Slicing nilai Tuple
- Nested Tuple
- Unpacking Sequence
Untuk membuat tuple di dalam R dan Python anda perlu untuk menginstall packages sets sebelum menjalankan beberapa koding berikut:
library(sets)
#Cara Membuat tuple
tuple0 = tuple()
tuple1 = tuple("hallo")
tuple2 = tuple ("hallo", "apa kabar")
# Mengakses Nilai Tuple
print(c(tuple2[2:1]))
## ("apa kabar", "hallo")
# Slicing Tuple
tuple6 = tuple("Going", "Seventeen", "Tayang", "Setiap", "Hari", "Rabu")
print(c(tuple6[1:2]))
## ("Going", "Seventeen")
# Tuple Nested
tuple6 = c(tuple2)
tuple7 = rep(tuple2, 4)
Dictionary
Dictionary adalah struktur data yang bentuknya seperti kamus. Ada kata kunci kemudian ada nilainya. Kata kunci harus unik, sedangkan nilai boleh diisi dengan apa saja. Adapun perbedaan list dan tuple adalah; dictionary memiliki kunci berupa teks (bisa juga angka), sedangkan list dan tuple menggunakan indeks berupa angka saja untuk mengakses nilainya.
library(Dict)
# Membuuat Dictionary
biodata = dict(nama = "Ainun Juriyah",
umur = as.integer(19),
prodi = "Fisika Medis",
hobi = list("fangirling", "menonton film")
sosmed = tuple(Instagram= "ainunjryy")
)
Data Frame
Bingkai data adalah tabel atau struktur seperti array dua dimensi di mana setiap kolom berisi nilai dari satu variabel dan setiap baris berisi satu set nilai dari setiap kolom. Berikut ini adalah ciri-ciri data frame: 1. Nama kolom tidak boleh kosong 2. Nama baris harus unik 3. Data yang disimpan dalam bingkai data dapat berupa numerik, faktor, atau tipe karakter. 4. Setiap kolom haarus berisi jumlah item data yang sama.
Berikut ini diperlihatkan contoh data frame dengan menggunakan R:
# Membentuk data frame 1
df1_R <- data.frame(kode = c (1:2),
nama = c("Yedam", "Vernon"),
gaji = c(624.3,513.2),
mulai_kerja = as.Date(c("2021-02-03", "2021-01-02")
)
Ekstrasi Data Frame
Keahlian mendasar lain nya yang tidak kalah penting bagi seorang data scientist adalah proses ektrasi data frame (Pengindeksan, Pengirisan, dan Subsetting) pada suatu data set (data frame). Dalam hal ini, tnetu harus memperhatikan tipe data dengan baik. Berikut ini akan contoh mengenai Pengindeksan, Pengirisan, dan Subsetting data set dengan R dan Python.
typeof(Karyawan_R)
class(Karyawan_R)
Karyawan_R[1,5]
Karyawan_R$Nama
Karyawan_R[,c('Nama', 'Jenis_Kelamin')]
Karyawan_R[1:5,]
Karyawan_R[,1:5]
subset(Karyawan_R, select=GPA)
subset(Karyawan_R, select=6)
subset(Karyawan_R, select= c(6,7))
subset(Karyawan_R, select= c(2:5))
Ganti Nama Variabel
Salah satu hal penting lainnya yang dimiliki proses data science adalah menyimpang dalam kedalam variabel. Variabel dapat diibaratkan seperti sebuah label untuk sebuah informasi. Sebagai data scientist perlu mengganti nama variabel tertentu untuk memudahkan dalam menganalisa informasi yang terkandung pada suatu data yang dimiliki.
Objek R dapat memiliki nama, yang sangat berguna untuk menulis kode yang dpat dibaca dan objek yang menggambarkan dirinya sendiri. Kali ini akan mempelajari cara mengganti nama kolom data frame di R menggunakan fungsi names().
rename_biodata<-biodata_R
names(rename_biodata)<-c("nama",
"tgl.lahir",
"jenis.kelamin",
"univ",
"ipk",)
Ini juga dapat dilakukan dengan menggunakan fungsi rename() yang ada di [dplyr package]
library(tidyverse)
Univesitas %>%
rename("no"= "No",
"nama"= "Nama",
"prodi"= "Prodi",
"ipk"= "GPA",
"Program"= "Study Exchanges")
LS0tDQp0aXRsZTogIkFsZ29yaXRtYSAmIFN0cnVrdHVyIERhdGEiDQpzdWJ0aXRsZTogIlIgVlMgUFlUSE9OIg0KYXV0aG9yOiAiQWludW4gSnVyaXlhaCAoMjAyMTQ1MjAwMDcpIg0KZGF0ZTogImByIGZvcm1hdChTeXMuRGF0ZSgpLCAnJUIgJWQsICVZJylgIg0Kb3V0cHV0OiANCiAgaHRtbF9kb2N1bWVudDogDQogICAgaHRtbF9kb2N1bWVudDogbnVsbA0KICAgIGNvZGVfZm9sZGluZzogaGlkZQ0KICAgIHRvYzogeWVzDQogICAgdG9jX2Zsb2F0Og0KICAgICAgY29sbGFwc2VkOiB5ZXMNCiAgICBudW1iZXJfc2VjdGlvbnM6IHllcw0KICAgIGNvZGVfZG93bmxvYWQ6IHllcw0KICAgIHRoZW1lOiBjb3Ntbw0KICAgIGNzczogc3R5bGUxLmNzcw0KICAgIGhpZ2hsaWdodDogaGFkZG9jaw0KLS0tDQoNCjxpbWcgc3JjPSJhaW51bi5qZmlmIiBzdHlsZT0iZmxvYXQ6IHJpZ2h0OyBtYXJnaW46IDBweCAxMDBweCAwcHggMHB4OyB3aWR0aDoyMCUiLz4NCg0KYGBge3IgbG9nbywgZWNobz1GQUxTRSxmaWcuYWxpZ249J2NlbnRlcicsIG91dC53aWR0aCA9ICczNSUnfQ0Ka25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MoIkxvZ28ucG5nIikNCmBgYA0KDQpFbWFpbCDCoMKgwqDCoMKgIMKgIMKgIMKgwqA6IFthaW51bi5qdXJpeWFoXEBzdHVkZW50Lm1hdGFuYXVuaXZlcnNpdHkuYWMuaWRdKG1haWx0bzphaW51bi5qdXJpeWFoQHN0dWRlbnQubWF0YW5hdW5pdmVyc2l0eS5hYy5pZCl7LmVtYWlsfSA8YnI+IFJQdWJzIMKgwqDCoMKgwqAgwqAgwqAgwqA6IDxodHRwczovL3JwdWJzLmNvbS9haW51bi8+IDxicj4gSnVydXNhbiDCoCDCoCDCoCDCoCDCoDogRmlzaWthIE1lZGlzICg8aHR0cHM6Ly9tYXRhbmF1bml2ZXJzaXR5LmFjLmlkLz9seT1hY2FkZW1pYyZjPXNiPikgPGJyPiBBZGRyZXNzIMKgIMKgIMKgIMKgIDogQVJBIENlbnRlciwgTWF0YW5hIFVuaXZlcnNpdHkgVG93ZXIgPGJyPiDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoMKgIEpsLiBDQkQgQmFyYXQgS2F2LCBSVC4xLCBDdXJ1ZyBTYW5nZXJlbmcsIEtlbGFwYSBEdWEsIFRhbmdlcmFuZywgQmFudGVuIDE1ODEwLg0KDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KIyAqKkxJU1QqKg0KDQpMaXN0IGFkYWxhaCBzdHJ1a3R1ciBkYXRhIHBhZGEgUiBkYW4gUHl0aG9uIHlhbmcgbWFtcHUgbWVueWltcGFuIGxlYmloIGRhcmkgc2F0dSBkYXRhLCBzZXBlcnRpIGFycmF5LiBQYWRhIGthbGkgaW5pLCBraXRhIGFrYW4gbWVtYmFoYXMgY2FyYSBtZW5nZ3VuYWthbiBsaXN0IGRpIFIgZGFuIFB5dGhvbiBkYXJpIHlhbmcgcGFsaW5nIHNlZGVyaGFuYSBzYW1wYWkgeWFuZyBzZWRpa2l0IGxlYmloIGtvbXBsZWtzLg0KDQojICoqTWVtYmVudHVrIExpc3QqKg0KDQpIYWwgdGVycGVudGluZyB5YW5nIGhhcnVzIGRpcGVsYWphcmkgYWRhbGFoIGJhZ2FpbWFuYSB1bnR1ayBtZW1idWF0IGxpc3QuIFRlcmRhcGF0IGJlYmVyYXBhIHBlcmJlZGFhbiBtZW5kYXNhciB5YW5nIGhhcnVzIGRpIHBlcmhhdGlrYW4gc2FhdCBtZW1iZW50dWsgbGlzdCBkaWRhbGFtIFIgZGFuIFB5dGhvbi4gUGVyaGF0aWthbiBjb250b2ggYmVyaWt1dCENCg0KYGBge3J9DQpsaXN0MCA9IGxpc3QoKQ0KbGlzdDEgPSBsaXN0KCJZZWRhbSIpDQpsaXN0MiA9IGxpc3QoIkphZW1pbiIpDQpwcmludChjKGxpc3QxLCBsaXN0MikpDQpgYGANCg0KDQoNCg0KIyMgKioqUGVuZ2luZGVrc2FuIG5pbGFpIGRhcmkgbGlzdCoqKg0KDQpTZXRlbGFoIHRhaHUgY2FyYSBtZW1idWF0IGRhbiBtZW55aW1wYW4gZGF0YSBkaSBkYWxhbSBMaXN0LCBtYXJpIGtpdGEgY29iYSBhbWJpbCBkYXRhbnlhLiBMaXN0IHNhbWEgc2VwZXJ0aSBhcnJheSwgbGlzdCBqdWdhIG1lbWlsaWtpIG5vbW9yIGluZGVrcyB1bnR1ayBtZW5nYWtzZXMgZGF0YSBhdGF1IGlzaW55YS4NCg0KYGBge3J9DQpsaXN0MyA9IGxpc3QoIk1lbWJlciIsICJTZXZlbnRlZW4iLCAidGlnYWJlbGFzIikNCnByaW50KGMobGlzdDNbM10pKQ0KYGBgDQoNCg0KDQojIyAqKipNZW5hbWJhaGthbiBkYW4gTWVuZ2hhcHVzKioqDQoNClVudHVrIG1lbmFtYmFoa2FuIGF0YXUgbWVuZ2dhbnRpIGF0YXUgbWVuZ2hhcHVzIG5pbGFpIHBhZGEgc3VhdHUgTGlzdCBiZXJzaWZhdCBtdXRhYmxlLCBhcnRpbnlhIGlzaW55YSBiaXNhIGtpdGEgdWJhaC11YmFoLg0KDQoNCmBgYHtyfQ0KbGlzdDQgPSBsaXN0KCJZZWRhbSIsICJKdW5reXUiLCAiSmVvbmd3b28iLCAidHJlYXN1cmUiKQ0KbGlzdDRbM10gPSAiQXNhaGkiIA0KYGBgDQoNClNlbGFpbiBjYXJhIGRpIGF0YXMgYmVyaWt1dCBpbmkgdGVyZGFwYXQgZHVhIG1ldG9kZSBhdGF1IGZ1bmdzaSBsYWlubnlhIHlhbmcgZGFwYXQgZGlndW5ha2FuIHVudHVrIG1lbmFtYmFoa2FuIGlzaSBhdGF1IGl0ZW0ga2UgbGlzdC4NCg0KYGBge3J9Iw0KbGlzdDQ9YyhsaXN0NCwgIkpZUCIpDQpsaXN0ND1jKCJZRyIsIGxpc3QzKQ0KcHJpbnQoYyhsaXN0NCkpDQpgYGANCg0KDQoNCiMgVHVwbGUNCg0KVHVwbGUgZGFsYW0gUiBkYW4gUHlodG9uIGFkYWxhaCBzdHJ1a3R1ciBkYXRhIHlhbmcgZGlndW5ha2FuIHVudHVrIG1lbnlpbXBhbiBzZWt1bXB1bGFuIGRhdGEuIFR1cGxlIGJlcnNpZmF0IGltbXV0YWJsZSwgYXJ0aW55YSBpc2kgdHVwbGUgdGlkYWsgYmlzYSBraXRhIHViYWggZGFuIGhhcHVzLiBOYW11biwgZGFwYXQga2l0YSBpc2kgZGVuZ2FuIGJlcmJhZ2FpIG1hY2FtIG5pbGFpIGRhbiBvYmplaywgc2ViYWdhaSBiZXJpa3V0Og0KDQoxLiBDYXJhIG1lbWJlbnR1ayBUdXBsZQ0KMi4gQ2FyYSBtZW5nYWtzZXMgbmlsYWkgVHVwbGUNCjMuIFNsaWNpbmcgbmlsYWkgVHVwbGUNCjQuIE5lc3RlZCBUdXBsZQ0KNS4gVW5wYWNraW5nIFNlcXVlbmNlDQoNClVudHVrIG1lbWJ1YXQgdHVwbGUgZGkgZGFsYW0gUiBkYW4gUHl0aG9uIGFuZGEgcGVybHUgdW50dWsgbWVuZ2luc3RhbGwgcGFja2FnZXMgc2V0cyBzZWJlbHVtIG1lbmphbGFua2FuIGJlYmVyYXBhIGtvZGluZyBiZXJpa3V0Og0KDQoNCg0KYGBge3J9DQpsaWJyYXJ5KHNldHMpDQojQ2FyYSBNZW1idWF0IHR1cGxlDQp0dXBsZTAgPSB0dXBsZSgpDQp0dXBsZTEgPSB0dXBsZSgiaGFsbG8iKQ0KdHVwbGUyID0gdHVwbGUgKCJoYWxsbyIsICJhcGEga2FiYXIiKQ0KDQojIE1lbmdha3NlcyBOaWxhaSBUdXBsZQ0KcHJpbnQoYyh0dXBsZTJbMjoxXSkpDQoNCiMgU2xpY2luZyBUdXBsZQ0KdHVwbGU2ID0gdHVwbGUoIkdvaW5nIiwgIlNldmVudGVlbiIsICJUYXlhbmciLCAiU2V0aWFwIiwgIkhhcmkiLCAiUmFidSIpDQpwcmludChjKHR1cGxlNlsxOjJdKSkNCg0KIyBUdXBsZSBOZXN0ZWQNCnR1cGxlNiA9IGModHVwbGUyKQ0KdHVwbGU3ID0gcmVwKHR1cGxlMiwgNCkNCmBgYA0KDQoNCg0KIyBEaWN0aW9uYXJ5DQoNCkRpY3Rpb25hcnkgYWRhbGFoIHN0cnVrdHVyIGRhdGEgeWFuZyBiZW50dWtueWEgc2VwZXJ0aSBrYW11cy4gQWRhIGthdGEga3VuY2kga2VtdWRpYW4gYWRhIG5pbGFpbnlhLiBLYXRhIGt1bmNpIGhhcnVzIHVuaWssIHNlZGFuZ2thbiBuaWxhaSBib2xlaCBkaWlzaSBkZW5nYW4gYXBhIHNhamEuIEFkYXB1biBwZXJiZWRhYW4gbGlzdCBkYW4gdHVwbGUgYWRhbGFoOyBkaWN0aW9uYXJ5IG1lbWlsaWtpIGt1bmNpIGJlcnVwYSB0ZWtzIChiaXNhIGp1Z2EgYW5na2EpLCBzZWRhbmdrYW4gbGlzdCBkYW4gdHVwbGUgbWVuZ2d1bmFrYW4gaW5kZWtzIGJlcnVwYSBhbmdrYSBzYWphIHVudHVrIG1lbmdha3NlcyBuaWxhaW55YS4NCg0KDQpgYGB7cn0jDQpsaWJyYXJ5KERpY3QpDQojIE1lbWJ1dWF0IERpY3Rpb25hcnkNCmJpb2RhdGEgPSBkaWN0KG5hbWEgPSAiQWludW4gSnVyaXlhaCIsDQogICAgICAgICAgICAgICB1bXVyID0gYXMuaW50ZWdlcigxOSksDQogICAgICAgICAgICAgICBwcm9kaSA9ICJGaXNpa2EgTWVkaXMiLA0KICAgICAgICAgICAgICAgaG9iaSA9IGxpc3QoImZhbmdpcmxpbmciLCAibWVub250b24gZmlsbSIpDQogICAgICAgICAgICAgICBzb3NtZWQgPSB0dXBsZShJbnN0YWdyYW09ICJhaW51bmpyeXkiKQ0KICAgICAgICAgICAgICAgKQ0KYGBgDQogDQoNCiAgICAgICAgICAgICAgDQoNCg0KIyBEYXRhIEZyYW1lDQpCaW5na2FpIGRhdGEgYWRhbGFoIHRhYmVsIGF0YXUgc3RydWt0dXIgc2VwZXJ0aSBhcnJheSBkdWEgZGltZW5zaSBkaSBtYW5hIHNldGlhcCBrb2xvbSBiZXJpc2kgbmlsYWkgZGFyaSBzYXR1IHZhcmlhYmVsIGRhbiBzZXRpYXAgYmFyaXMgYmVyaXNpIHNhdHUgc2V0IG5pbGFpIGRhcmkgc2V0aWFwIGtvbG9tLiBCZXJpa3V0IGluaSBhZGFsYWggY2lyaS1jaXJpIGRhdGEgZnJhbWU6DQoxLiBOYW1hIGtvbG9tIHRpZGFrIGJvbGVoIGtvc29uZw0KMi4gTmFtYSBiYXJpcyBoYXJ1cyB1bmlrDQozLiBEYXRhIHlhbmcgZGlzaW1wYW4gZGFsYW0gYmluZ2thaSBkYXRhIGRhcGF0IGJlcnVwYSBudW1lcmlrLCBmYWt0b3IsIGF0YXUgdGlwZSBrYXJha3Rlci4NCjQuIFNldGlhcCBrb2xvbSBoYWFydXMgYmVyaXNpIGp1bWxhaCBpdGVtIGRhdGEgeWFuZyBzYW1hLg0KDQpCZXJpa3V0IGluaSBkaXBlcmxpaGF0a2FuIGNvbnRvaCBkYXRhIGZyYW1lIGRlbmdhbiBtZW5nZ3VuYWthbiBSOg0KDQpgYGB7cn0jDQojIE1lbWJlbnR1ayBkYXRhIGZyYW1lIDENCmRmMV9SIDwtIGRhdGEuZnJhbWUoa29kZSA9IGMgKDE6MiksDQogICAgICAgICAgICAgICAgICAgIG5hbWEgPSBjKCJZZWRhbSIsICJWZXJub24iKSwNCiAgICAgICAgICAgICAgICAgICAgZ2FqaSA9IGMoNjI0LjMsNTEzLjIpLA0KICAgICAgICAgICAgICAgICAgICBtdWxhaV9rZXJqYSA9IGFzLkRhdGUoYygiMjAyMS0wMi0wMyIsICIyMDIxLTAxLTAyIikNCikNCmBgYA0KDQoNCiAgDQojIEVrc3RyYXNpIERhdGEgRnJhbWUNCktlYWhsaWFuIG1lbmRhc2FyIGxhaW4gbnlhIHlhbmcgdGlkYWsga2FsYWggcGVudGluZyBiYWdpIHNlb3JhbmcgZGF0YSBzY2llbnRpc3QgYWRhbGFoIHByb3NlcyBla3RyYXNpIGRhdGEgZnJhbWUgKFBlbmdpbmRla3NhbiwgUGVuZ2lyaXNhbiwgZGFuIFN1YnNldHRpbmcpIHBhZGEgc3VhdHUgZGF0YSBzZXQgKGRhdGEgZnJhbWUpLiBEYWxhbSBoYWwgaW5pLCB0bmV0dSBoYXJ1cyBtZW1wZXJoYXRpa2FuIHRpcGUgZGF0YSBkZW5nYW4gYmFpay4gQmVyaWt1dCBpbmkgYWthbiBjb250b2ggbWVuZ2VuYWkgUGVuZ2luZGVrc2FuLCBQZW5naXJpc2FuLCBkYW4gU3Vic2V0dGluZyBkYXRhIHNldCBkZW5nYW4gUiBkYW4gUHl0aG9uLg0KDQoNCmBgYHtyfSMNCnR5cGVvZihLYXJ5YXdhbl9SKQ0KY2xhc3MoS2FyeWF3YW5fUikNCkthcnlhd2FuX1JbMSw1XQ0KS2FyeWF3YW5fUiROYW1hDQpLYXJ5YXdhbl9SWyxjKCdOYW1hJywgJ0plbmlzX0tlbGFtaW4nKV0NCkthcnlhd2FuX1JbMTo1LF0NCkthcnlhd2FuX1JbLDE6NV0NCg0Kc3Vic2V0KEthcnlhd2FuX1IsIHNlbGVjdD1HUEEpDQpzdWJzZXQoS2FyeWF3YW5fUiwgc2VsZWN0PTYpDQpzdWJzZXQoS2FyeWF3YW5fUiwgc2VsZWN0PSBjKDYsNykpDQpzdWJzZXQoS2FyeWF3YW5fUiwgc2VsZWN0PSBjKDI6NSkpDQpgYGANCg0KDQoNCg0KIyBHYW50aSBOYW1hIFZhcmlhYmVsDQoNClNhbGFoIHNhdHUgaGFsIHBlbnRpbmcgbGFpbm55YSB5YW5nIGRpbWlsaWtpIHByb3NlcyBkYXRhIHNjaWVuY2UgYWRhbGFoIG1lbnlpbXBhbmcgZGFsYW0ga2VkYWxhbSB2YXJpYWJlbC4gVmFyaWFiZWwgZGFwYXQgZGlpYmFyYXRrYW4gc2VwZXJ0aSBzZWJ1YWggbGFiZWwgdW50dWsgc2VidWFoIGluZm9ybWFzaS4gU2ViYWdhaSBkYXRhIHNjaWVudGlzdCBwZXJsdSBtZW5nZ2FudGkgbmFtYSB2YXJpYWJlbCB0ZXJ0ZW50dSB1bnR1ayBtZW11ZGFoa2FuIGRhbGFtIG1lbmdhbmFsaXNhIGluZm9ybWFzaSB5YW5nIHRlcmthbmR1bmcgcGFkYSBzdWF0dSBkYXRhIHlhbmcgZGltaWxpa2kuDQoNCk9iamVrIFIgZGFwYXQgbWVtaWxpa2kgbmFtYSwgeWFuZyBzYW5nYXQgYmVyZ3VuYSB1bnR1ayBtZW51bGlzIGtvZGUgeWFuZyBkcGF0IGRpYmFjYSBkYW4gb2JqZWsgeWFuZyBtZW5nZ2FtYmFya2FuIGRpcmlueWEgc2VuZGlyaS4gS2FsaSBpbmkgYWthbiBtZW1wZWxhamFyaSBjYXJhIG1lbmdnYW50aSBuYW1hIGtvbG9tIGRhdGEgZnJhbWUgZGkgUiBtZW5nZ3VuYWthbiBmdW5nc2kgbmFtZXMoKS4NCg0KYGBge3J9Iw0KcmVuYW1lX2Jpb2RhdGE8LWJpb2RhdGFfUg0KbmFtZXMocmVuYW1lX2Jpb2RhdGEpPC1jKCJuYW1hIiwNCiAgICAgICAgICAgICAgICAgICAidGdsLmxhaGlyIiwNCiAgICAgICAgICAgICAgICAgICAiamVuaXMua2VsYW1pbiIsDQogICAgICAgICAgICAgICAgICAgInVuaXYiLA0KICAgICAgICAgICAgICAgICAgICJpcGsiLCkNCmBgYA0KDQoNCkluaSBqdWdhIGRhcGF0IGRpbGFrdWthbiBkZW5nYW4gbWVuZ2d1bmFrYW4gZnVuZ3NpIHJlbmFtZSgpIHlhbmcgYWRhIGRpIFtkcGx5ciBwYWNrYWdlXQ0KDQpgYGB7cn0jDQpsaWJyYXJ5KHRpZHl2ZXJzZSkNClVuaXZlc2l0YXMgJT4lDQogIHJlbmFtZSgibm8iPSAiTm8iLA0KICAgICAgICAgIm5hbWEiPSAiTmFtYSIsDQogICAgICAgICAicHJvZGkiPSAiUHJvZGkiLA0KICAgICAgICAgImlwayI9ICJHUEEiLA0KICAgICAgICAgIlByb2dyYW0iPSAiU3R1ZHkgRXhjaGFuZ2VzIikNCmBgYA0KDQogIA0K