PEMROGRAMAN SAINS DATA 1
SYNTAX & CONTROL FLOW
1. KONDISIONAL
A. Dataset
Dataset yang digunakan adalah sebagai berikut:
| PENGENAL | Nama | Usia | Gaji | Posisi | Pertunjukan |
|---|---|---|---|---|---|
| 1 | Bagas | 25 | 5000 | Staf | Bagus |
| 2 | Joan | 30 | 7000 | Pengawas | Sangat bagus |
| 3 | Alya | 27 | 6500 | Staf | Rata-rata |
| 4 | Dwi | 35 | 10000 | Manajer | Bagus |
| 5 | Nabil | 40 | 12000 | Direktur | Sangat bagus |
B. Pernyataan Kondisional untuk Bonus
Tentukan tingkat bonus berdasarkan kinerja karyawan:
- Sangat Baik → 20% dari gaji
- Baik → 10% dari gaji
- Rata-rata → 5% dari gaji
Contoh Output
Output yang dihasilkan adalah sebagai berikut:
Name: Bagas, Bonus: 500.00
Name: Joan, Bonus: 1400.00
Name: Alya, Bonus: 325.00
Name: Dwi, Bonus: 1000.00
Name: Nabil, Bonus: 2400.00
C. Kode Penyelesaian
Kode berikut digunakan untuk menghitung bonus karyawan menggunakan R:
# Data karyawan: Membuat data frame dengan informasi karyawan
karyawan <- data.frame(
Nama = c("Bagas", "Joan", "Alya", "Dwi", "Nabil"),
Usia = c(25, 30, 27, 35, 40),
Gaji = c(5000, 7000, 6500, 10000, 12000),
Posisi = c("Staf", "Pengawas", "Staf", "Manajer", "Direktur"),
Pertunjukan = c("Bagus", "Sangat bagus", "Rata-rata", "Bagus", "Sangat bagus")
)
# Fungsi untuk menghitung bonus berdasarkan kinerja karyawan
hitung_bonus <- function(karyawan) {
# Iterasi untuk setiap baris karyawan menggunakan loop for
for (i in 1:nrow(karyawan)) {
# Cek kinerja karyawan dan hitung bonus yang sesuai
if (karyawan$Pertunjukan[i] == "Sangat bagus") {
bonus <- 0.20 * karyawan$Gaji[i] # 20% dari gaji
} else if (karyawan$Pertunjukan[i] == "Bagus") {
bonus <- 0.10 * karyawan$Gaji[i] # 10% dari gaji
} else if (karyawan$Pertunjukan[i] == "Rata-rata") {
bonus <- 0.05 * karyawan$Gaji[i] # 5% dari gaji
} else {
bonus <- 0 # Tidak ada bonus untuk kinerja lain
}
# Menampilkan nama karyawan dan jumlah bonus yang dihitung dengan format dua desimal
cat(sprintf("Name: %s, Bonus: %.2f\n", karyawan$Nama[i], bonus))
}
}
# Menjalankan fungsi untuk menghitung dan menampilkan bonus karyawan
hitung_bonus(karyawan) ## Name: Bagas, Bonus: 500.00
## Name: Joan, Bonus: 1400.00
## Name: Alya, Bonus: 325.00
## Name: Dwi, Bonus: 1000.00
## Name: Nabil, Bonus: 2400.00
2. PERULANGAN (For & While)
A. For Loop untuk Membuat Daftar Karyawan dengan Gaji Lebih dari 6000
# Data karyawan: Membuat data frame dengan informasi nama dan gaji
karyawan <- data.frame(
Nama = c("Bagas", "Joan", "Alya", "Dwi", "Nabil"),
Gaji = c(5000, 7000, 6500, 10000, 12000)
)
# Menggunakan for loop untuk mencetak karyawan dengan gaji lebih dari 6000
cat("Daftar Karyawan dengan Gaji Lebih dari 6000:\n") ## Daftar Karyawan dengan Gaji Lebih dari 6000:
for (i in 1:nrow(karyawan)) {
# Cek apakah gaji karyawan lebih dari 6000
if (karyawan$Gaji[i] > 6000) {
# Menampilkan nama dan gaji karyawan yang memenuhi syarat
cat(sprintf("Name: %s, Salary: %d\n", karyawan$Nama[i], karyawan$Gaji[i]))
}
} ## Name: Joan, Salary: 7000
## Name: Alya, Salary: 6500
## Name: Dwi, Salary: 10000
## Name: Nabil, Salary: 12000
B. While Loop untuk Menampilkan Karyawan Hingga “Manajer” Ditemukan
# Data karyawan dengan posisi: Membuat data frame dengan informasi nama dan posisi
karyawan_posisi <- data.frame(
Nama = c("Bagas", "Joan", "Alya", "Dwi"),
Posisi = c("Staff", "Supervisor", "Staff", "Manager")
)
# Menggunakan while loop untuk mencetak karyawan hingga posisi "Manager" ditemukan
i <- 1 # Inisialisasi variabel untuk iterasi
cat("Daftar Karyawan hingga Manajer Ditemukan:\n") ## Daftar Karyawan hingga Manajer Ditemukan:
while (i <= nrow(karyawan_posisi)) {
# Menampilkan nama dan posisi karyawan
cat(sprintf("Name: %s, Position: %s\n", karyawan_posisi$Nama[i], karyawan_posisi$Posisi[i]))
# Jika posisi "Manager" ditemukan, hentikan loop
if (karyawan_posisi$Posisi[i] == "Manager") {
cat("(Stop here)\n") # Pesan bahwa loop dihentikan
break # Menghentikan loop ketika "Manager" ditemukan
}
i <- i + 1 # Melanjutkan ke karyawan berikutnya
} ## Name: Bagas, Position: Staff
## Name: Joan, Position: Supervisor
## Name: Alya, Position: Staff
## Name: Dwi, Position: Manager
## (Stop here)
C. Gunakan break untuk menghentikan loop ketika karyawan dengan gaji di atas 10.000 ditemukan
# Daftar karyawan dan gaji mereka: Membuat data frame dengan nama dan gaji
employees <- data.frame(
name = c("Bagas", "Joan", "Alya", "Dwi", "Nabil"),
salary = c(5000, 7000, 6500, 10000, 12000)
)
# Menggunakan break untuk menghentikan loop ketika gaji di atas 10.000 ditemukan
for (i in 1:nrow(employees)) {
# Menampilkan nama dan gaji karyawan saat ini
cat("Name:", employees$name[i], ", Salary:", employees$salary[i], "\n")
# Jika gaji karyawan lebih dari 10.000, hentikan loop
if (employees$salary[i] > 10000) {
cat("(Stopped because Nabil has a salary above 10,000)\n") # Pesan bahwa loop dihentikan karena gaji di atas 10.000
break # Menghentikan loop ketika karyawan dengan gaji lebih dari 10.000 ditemukan
}
} ## Name: Bagas , Salary: 5000
## Name: Joan , Salary: 7000
## Name: Alya , Salary: 6500
## Name: Dwi , Salary: 10000
## Name: Nabil , Salary: 12000
## (Stopped because Nabil has a salary above 10,000)
D. Gunakan continue untuk melewati karyawan dengan kinerja “Rata-rata”
# Daftar karyawan dan performa mereka: Membuat data frame dengan nama dan performa
performance_employees <- data.frame(
name = c("Bagas", "Joan", "Alya", "Dwi", "Nabil"),
performance = c("Good", "Very Good", "Average", "Good", "Very Good")
)
# Menggunakan continue untuk melewati karyawan dengan kinerja "Rata-rata"
for (i in 1:nrow(performance_employees)) {
# Cek apakah kinerja karyawan adalah "Rata-rata"
if (performance_employees$performance[i] == "Average") {
next # Melewati iterasi saat ini dan melanjutkan ke iterasi berikutnya
}
# Menampilkan nama dan performa karyawan yang kinerjanya tidak "Rata-rata"
cat("Name:", performance_employees$name[i], ", Performance:", performance_employees$performance[i], "\n")
} ## Name: Bagas , Performance: Good
## Name: Joan , Performance: Very Good
## Name: Dwi , Performance: Good
## Name: Nabil , Performance: Very Good
NB :
- Kenapa Alya tidak ada ?
Alya tidak muncul dalam output kode R karena memiliki kinerja “Average”, dan perintah next digunakan untuk melewati iterasi tersebut. Akibatnya, kode untuk menampilkan nama dan performa tidak dieksekusi untuk Alya
LS0tDQp0aXRsZTogIlBFTVJPR1JBTUFOIFNBSU5TIERBVEEgMSINCnN1YnRpdGxlOiAiU1lOVEFYICYgQ09OVFJPTCBGTE9XIg0KYXV0aG9yOiAiRGFkYW4gUmFtZGFuIEhpZGF5YXQgKDUyMjQwMDI4KSINCmRhdGU6ICAiYHIgZm9ybWF0KFN5cy5EYXRlKCksICclQiAlZCwgJVknKWAiDQpvdXRwdXQ6DQogIHJtZGZvcm1hdHM6OnJlYWR0aGVkb3duOiAgICMgaHR0cHM6Ly9naXRodWIuY29tL2p1YmEvcm1kZm9ybWF0cw0KICAgIHNlbGZfY29udGFpbmVkOiB0cnVlDQogICAgdGh1bWJuYWlsczogdHJ1ZQ0KICAgIGxpZ2h0Ym94OiB0cnVlDQogICAgZ2FsbGVyeTogdHJ1ZQ0KICAgIGxpYl9kaXI6IGxpYnMNCiAgICBkZl9wcmludDogInBhZ2VkIg0KICAgIGNvZGVfZm9sZGluZzogInNob3ciDQogICAgY29kZV9kb3dubG9hZDogeWVzDQogICAgY3NzOiAic3R5bGUuY3NzIg0KLS0tDQoNCjxpbWcgc3JjPSJzdGF0aXN0aWthLmpwZyIgd2lkdGg9IjkwMCIgc3R5bGU9ImRpc3BsYXk6IGJsb2NrOyBtYXJnaW46IGF1dG87IiBhbHQ9IiI+DQoNCiMgMS4gS09ORElTSU9OQUwNCg0KIyMgQS4gRGF0YXNldCAgDQoNCkRhdGFzZXQgeWFuZyBkaWd1bmFrYW4gYWRhbGFoIHNlYmFnYWkgYmVyaWt1dDogIA0KDQp8IFBFTkdFTkFMIHwgTmFtYSAgfCBVc2lhIHwgR2FqaSAgfCBQb3Npc2kgICB8IFBlcnR1bmp1a2FuICB8ICANCnwtLS0tLS0tLS0tfC0tLS0tLS18LS0tLS0tfC0tLS0tLS18LS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS18ICANCnwgMSAgICAgICAgfCBCYWdhcyB8IDI1ICAgfCA1MDAwICB8IFN0YWYgICAgIHwgQmFndXMgICAgICAgICB8ICANCnwgMiAgICAgICAgfCBKb2FuICB8IDMwICAgfCA3MDAwICB8IFBlbmdhd2FzIHwgU2FuZ2F0IGJhZ3VzICB8ICANCnwgMyAgICAgICAgfCBBbHlhICB8IDI3ICAgfCA2NTAwICB8IFN0YWYgICAgIHwgUmF0YS1yYXRhICAgICB8ICANCnwgNCAgICAgICAgfCBEd2kgICB8IDM1ICAgfCAxMDAwMCB8IE1hbmFqZXIgIHwgQmFndXMgICAgICAgICB8ICANCnwgNSAgICAgICAgfCBOYWJpbCB8IDQwICAgfCAxMjAwMCB8IERpcmVrdHVyIHwgU2FuZ2F0IGJhZ3VzICB8ICANCg0KIyMgQi4gUGVybnlhdGFhbiBLb25kaXNpb25hbCB1bnR1ayBCb251cyAgDQoNClRlbnR1a2FuIHRpbmdrYXQgYm9udXMgYmVyZGFzYXJrYW4ga2luZXJqYSBrYXJ5YXdhbjogIA0KDQotICoqU2FuZ2F0IEJhaWsqKiDihpIgMjAlIGRhcmkgZ2FqaSAgDQotICoqQmFpayoqIOKGkiAxMCUgZGFyaSBnYWppICANCi0gKipSYXRhLXJhdGEqKiDihpIgNSUgZGFyaSBnYWppICANCg0KIyMjIENvbnRvaCBPdXRwdXQgIA0KT3V0cHV0IHlhbmcgZGloYXNpbGthbiBhZGFsYWggc2ViYWdhaSBiZXJpa3V0OiAgDQoNCk5hbWU6IEJhZ2FzLCBCb251czogNTAwLjAwICANCk5hbWU6IEpvYW4sIEJvbnVzOiAxNDAwLjAwICANCk5hbWU6IEFseWEsIEJvbnVzOiAzMjUuMDAgIA0KTmFtZTogRHdpLCBCb251czogMTAwMC4wMCAgDQpOYW1lOiBOYWJpbCwgQm9udXM6IDI0MDAuMDAgIA0KDQojIyBDLiBLb2RlIFBlbnllbGVzYWlhbiAgDQoNCktvZGUgYmVyaWt1dCBkaWd1bmFrYW4gdW50dWsgbWVuZ2hpdHVuZyBib251cyBrYXJ5YXdhbiBtZW5nZ3VuYWthbiBSOiAgDQoNCmBgYHtyLCBtYXNzYWdlPUZBTFNFLCBlY2hvPVRSVUUsIHdhcm5pbmc9RkFMU0V9ICANCiMgRGF0YSBrYXJ5YXdhbjogTWVtYnVhdCBkYXRhIGZyYW1lIGRlbmdhbiBpbmZvcm1hc2kga2FyeWF3YW4gIA0Ka2FyeWF3YW4gPC0gZGF0YS5mcmFtZSggIA0KICBOYW1hID0gYygiQmFnYXMiLCAiSm9hbiIsICJBbHlhIiwgIkR3aSIsICJOYWJpbCIpLCAgDQogIFVzaWEgPSBjKDI1LCAzMCwgMjcsIDM1LCA0MCksICANCiAgR2FqaSA9IGMoNTAwMCwgNzAwMCwgNjUwMCwgMTAwMDAsIDEyMDAwKSwgIA0KICBQb3Npc2kgPSBjKCJTdGFmIiwgIlBlbmdhd2FzIiwgIlN0YWYiLCAiTWFuYWplciIsICJEaXJla3R1ciIpLCAgDQogIFBlcnR1bmp1a2FuID0gYygiQmFndXMiLCAiU2FuZ2F0IGJhZ3VzIiwgIlJhdGEtcmF0YSIsICJCYWd1cyIsICJTYW5nYXQgYmFndXMiKSAgDQopICANCg0KIyBGdW5nc2kgdW50dWsgbWVuZ2hpdHVuZyBib251cyBiZXJkYXNhcmthbiBraW5lcmphIGthcnlhd2FuICANCmhpdHVuZ19ib251cyA8LSBmdW5jdGlvbihrYXJ5YXdhbikgeyAgDQogICMgSXRlcmFzaSB1bnR1ayBzZXRpYXAgYmFyaXMga2FyeWF3YW4gbWVuZ2d1bmFrYW4gbG9vcCBmb3IgIA0KICBmb3IgKGkgaW4gMTpucm93KGthcnlhd2FuKSkgeyAgDQogICAgIyBDZWsga2luZXJqYSBrYXJ5YXdhbiBkYW4gaGl0dW5nIGJvbnVzIHlhbmcgc2VzdWFpICANCiAgICBpZiAoa2FyeWF3YW4kUGVydHVuanVrYW5baV0gPT0gIlNhbmdhdCBiYWd1cyIpIHsgIA0KICAgICAgYm9udXMgPC0gMC4yMCAqIGthcnlhd2FuJEdhamlbaV0gICMgMjAlIGRhcmkgZ2FqaSAgDQogICAgfSBlbHNlIGlmIChrYXJ5YXdhbiRQZXJ0dW5qdWthbltpXSA9PSAiQmFndXMiKSB7ICANCiAgICAgIGJvbnVzIDwtIDAuMTAgKiBrYXJ5YXdhbiRHYWppW2ldICAjIDEwJSBkYXJpIGdhamkgIA0KICAgIH0gZWxzZSBpZiAoa2FyeWF3YW4kUGVydHVuanVrYW5baV0gPT0gIlJhdGEtcmF0YSIpIHsgIA0KICAgICAgYm9udXMgPC0gMC4wNSAqIGthcnlhd2FuJEdhamlbaV0gICMgNSUgZGFyaSBnYWppICANCiAgICB9IGVsc2UgeyAgDQogICAgICBib251cyA8LSAwICAjIFRpZGFrIGFkYSBib251cyB1bnR1ayBraW5lcmphIGxhaW4gIA0KICAgIH0gIA0KICAgICMgTWVuYW1waWxrYW4gbmFtYSBrYXJ5YXdhbiBkYW4ganVtbGFoIGJvbnVzIHlhbmcgZGloaXR1bmcgZGVuZ2FuIGZvcm1hdCBkdWEgZGVzaW1hbCAgDQogICAgY2F0KHNwcmludGYoIk5hbWU6ICVzLCBCb251czogJS4yZlxuIiwga2FyeWF3YW4kTmFtYVtpXSwgYm9udXMpKSAgDQogIH0gIA0KfSAgDQoNCiMgTWVuamFsYW5rYW4gZnVuZ3NpIHVudHVrIG1lbmdoaXR1bmcgZGFuIG1lbmFtcGlsa2FuIGJvbnVzIGthcnlhd2FuICANCmhpdHVuZ19ib251cyhrYXJ5YXdhbikgIA0KYGBgDQojIDIuIFBFUlVMQU5HQU4gKEZvciAmIFdoaWxlKQ0KDQojIyBBLiBGb3IgTG9vcCB1bnR1ayBNZW1idWF0IERhZnRhciBLYXJ5YXdhbiBkZW5nYW4gR2FqaSBMZWJpaCBkYXJpIDYwMDANCg0KYGBge3IsIG1hc3NhZ2U9RkFMU0UsIGVjaG89VFJVRSwgd2FybmluZz1GQUxTRX0gIA0KIyBEYXRhIGthcnlhd2FuOiBNZW1idWF0IGRhdGEgZnJhbWUgZGVuZ2FuIGluZm9ybWFzaSBuYW1hIGRhbiBnYWppICANCmthcnlhd2FuIDwtIGRhdGEuZnJhbWUoICANCiAgTmFtYSA9IGMoIkJhZ2FzIiwgIkpvYW4iLCAiQWx5YSIsICJEd2kiLCAiTmFiaWwiKSwgIA0KICBHYWppID0gYyg1MDAwLCA3MDAwLCA2NTAwLCAxMDAwMCwgMTIwMDApICANCikgIA0KDQojIE1lbmdndW5ha2FuIGZvciBsb29wIHVudHVrIG1lbmNldGFrIGthcnlhd2FuIGRlbmdhbiBnYWppIGxlYmloIGRhcmkgNjAwMCAgDQpjYXQoIkRhZnRhciBLYXJ5YXdhbiBkZW5nYW4gR2FqaSBMZWJpaCBkYXJpIDYwMDA6XG4iKSAgDQpmb3IgKGkgaW4gMTpucm93KGthcnlhd2FuKSkgeyAgDQogICMgQ2VrIGFwYWthaCBnYWppIGthcnlhd2FuIGxlYmloIGRhcmkgNjAwMCAgDQogIGlmIChrYXJ5YXdhbiRHYWppW2ldID4gNjAwMCkgeyAgDQogICAgIyBNZW5hbXBpbGthbiBuYW1hIGRhbiBnYWppIGthcnlhd2FuIHlhbmcgbWVtZW51aGkgc3lhcmF0ICANCiAgICBjYXQoc3ByaW50ZigiTmFtZTogJXMsIFNhbGFyeTogJWRcbiIsIGthcnlhd2FuJE5hbWFbaV0sIGthcnlhd2FuJEdhamlbaV0pKSAgDQogIH0gIA0KfSAgDQpgYGANCiMjIEIuIFdoaWxlIExvb3AgdW50dWsgTWVuYW1waWxrYW4gS2FyeWF3YW4gSGluZ2dhICJNYW5hamVyIiBEaXRlbXVrYW4NCg0KYGBge3IsIG1hc3NhZ2U9RkFMU0UsIGVjaG89VFJVRSwgd2FybmluZz1GQUxTRX0gIA0KIyBEYXRhIGthcnlhd2FuIGRlbmdhbiBwb3Npc2k6IE1lbWJ1YXQgZGF0YSBmcmFtZSBkZW5nYW4gaW5mb3JtYXNpIG5hbWEgZGFuIHBvc2lzaSAgDQprYXJ5YXdhbl9wb3Npc2kgPC0gZGF0YS5mcmFtZSggIA0KICBOYW1hID0gYygiQmFnYXMiLCAiSm9hbiIsICJBbHlhIiwgIkR3aSIpLCAgDQogIFBvc2lzaSA9IGMoIlN0YWZmIiwgIlN1cGVydmlzb3IiLCAiU3RhZmYiLCAiTWFuYWdlciIpICANCikgIA0KDQojIE1lbmdndW5ha2FuIHdoaWxlIGxvb3AgdW50dWsgbWVuY2V0YWsga2FyeWF3YW4gaGluZ2dhIHBvc2lzaSAiTWFuYWdlciIgZGl0ZW11a2FuICANCmkgPC0gMSAgIyBJbmlzaWFsaXNhc2kgdmFyaWFiZWwgdW50dWsgaXRlcmFzaSAgDQpjYXQoIkRhZnRhciBLYXJ5YXdhbiBoaW5nZ2EgTWFuYWplciBEaXRlbXVrYW46XG4iKSAgDQp3aGlsZSAoaSA8PSBucm93KGthcnlhd2FuX3Bvc2lzaSkpIHsgIA0KICAjIE1lbmFtcGlsa2FuIG5hbWEgZGFuIHBvc2lzaSBrYXJ5YXdhbiAgDQogIGNhdChzcHJpbnRmKCJOYW1lOiAlcywgUG9zaXRpb246ICVzXG4iLCBrYXJ5YXdhbl9wb3Npc2kkTmFtYVtpXSwga2FyeWF3YW5fcG9zaXNpJFBvc2lzaVtpXSkpICANCiAgDQogICMgSmlrYSBwb3Npc2kgIk1hbmFnZXIiIGRpdGVtdWthbiwgaGVudGlrYW4gbG9vcCAgDQogIGlmIChrYXJ5YXdhbl9wb3Npc2kkUG9zaXNpW2ldID09ICJNYW5hZ2VyIikgeyAgDQogICAgY2F0KCIoU3RvcCBoZXJlKVxuIikgICMgUGVzYW4gYmFod2EgbG9vcCBkaWhlbnRpa2FuICANCiAgICBicmVhayAgIyBNZW5naGVudGlrYW4gbG9vcCBrZXRpa2EgIk1hbmFnZXIiIGRpdGVtdWthbiAgDQogIH0gIA0KICBpIDwtIGkgKyAxICAjIE1lbGFuanV0a2FuIGtlIGthcnlhd2FuIGJlcmlrdXRueWEgIA0KfSAgDQpgYGANCiMjIEMuIEd1bmFrYW4gYnJlYWsgdW50dWsgbWVuZ2hlbnRpa2FuIGxvb3Aga2V0aWthIGthcnlhd2FuIGRlbmdhbiBnYWppIGRpIGF0YXMgMTAuMDAwIGRpdGVtdWthbg0KYGBge3IsIG1hc3NhZ2U9RkFMU0UsIGVjaG89VFJVRSwgd2FybmluZz1GQUxTRX0gIA0KIyBEYWZ0YXIga2FyeWF3YW4gZGFuIGdhamkgbWVyZWthOiBNZW1idWF0IGRhdGEgZnJhbWUgZGVuZ2FuIG5hbWEgZGFuIGdhamkgIA0KZW1wbG95ZWVzIDwtIGRhdGEuZnJhbWUoICANCiAgbmFtZSA9IGMoIkJhZ2FzIiwgIkpvYW4iLCAiQWx5YSIsICJEd2kiLCAiTmFiaWwiKSwgIA0KICBzYWxhcnkgPSBjKDUwMDAsIDcwMDAsIDY1MDAsIDEwMDAwLCAxMjAwMCkgIA0KKSAgDQoNCiMgTWVuZ2d1bmFrYW4gYnJlYWsgdW50dWsgbWVuZ2hlbnRpa2FuIGxvb3Aga2V0aWthIGdhamkgZGkgYXRhcyAxMC4wMDAgZGl0ZW11a2FuICANCmZvciAoaSBpbiAxOm5yb3coZW1wbG95ZWVzKSkgeyAgDQogICMgTWVuYW1waWxrYW4gbmFtYSBkYW4gZ2FqaSBrYXJ5YXdhbiBzYWF0IGluaSAgDQogIGNhdCgiTmFtZToiLCBlbXBsb3llZXMkbmFtZVtpXSwgIiwgU2FsYXJ5OiIsIGVtcGxveWVlcyRzYWxhcnlbaV0sICJcbiIpICANCiAgDQogICMgSmlrYSBnYWppIGthcnlhd2FuIGxlYmloIGRhcmkgMTAuMDAwLCBoZW50aWthbiBsb29wICANCiAgaWYgKGVtcGxveWVlcyRzYWxhcnlbaV0gPiAxMDAwMCkgeyAgDQogICAgY2F0KCIoU3RvcHBlZCBiZWNhdXNlIE5hYmlsIGhhcyBhIHNhbGFyeSBhYm92ZSAxMCwwMDApXG4iKSAgIyBQZXNhbiBiYWh3YSBsb29wIGRpaGVudGlrYW4ga2FyZW5hIGdhamkgZGkgYXRhcyAxMC4wMDAgIA0KICAgIGJyZWFrICAjIE1lbmdoZW50aWthbiBsb29wIGtldGlrYSBrYXJ5YXdhbiBkZW5nYW4gZ2FqaSBsZWJpaCBkYXJpIDEwLjAwMCBkaXRlbXVrYW4gIA0KICB9ICANCn0gIA0KYGBgDQojIyBELiBHdW5ha2FuIGNvbnRpbnVlIHVudHVrIG1lbGV3YXRpIGthcnlhd2FuIGRlbmdhbiBraW5lcmphIOKAnFJhdGEtcmF0YeKAnQ0KYGBge3IsIG1hc3NhZ2U9RkFMU0UsIGVjaG89VFJVRSwgd2FybmluZz1GQUxTRX0gIA0KIyBEYWZ0YXIga2FyeWF3YW4gZGFuIHBlcmZvcm1hIG1lcmVrYTogTWVtYnVhdCBkYXRhIGZyYW1lIGRlbmdhbiBuYW1hIGRhbiBwZXJmb3JtYSAgDQpwZXJmb3JtYW5jZV9lbXBsb3llZXMgPC0gZGF0YS5mcmFtZSggIA0KICBuYW1lID0gYygiQmFnYXMiLCAiSm9hbiIsICJBbHlhIiwgIkR3aSIsICJOYWJpbCIpLCAgDQogIHBlcmZvcm1hbmNlID0gYygiR29vZCIsICJWZXJ5IEdvb2QiLCAiQXZlcmFnZSIsICJHb29kIiwgIlZlcnkgR29vZCIpICANCikgIA0KDQojIE1lbmdndW5ha2FuIGNvbnRpbnVlIHVudHVrIG1lbGV3YXRpIGthcnlhd2FuIGRlbmdhbiBraW5lcmphICJSYXRhLXJhdGEiICANCmZvciAoaSBpbiAxOm5yb3cocGVyZm9ybWFuY2VfZW1wbG95ZWVzKSkgeyAgDQogICMgQ2VrIGFwYWthaCBraW5lcmphIGthcnlhd2FuIGFkYWxhaCAiUmF0YS1yYXRhIiAgDQogIGlmIChwZXJmb3JtYW5jZV9lbXBsb3llZXMkcGVyZm9ybWFuY2VbaV0gPT0gIkF2ZXJhZ2UiKSB7ICANCiAgICBuZXh0ICAjIE1lbGV3YXRpIGl0ZXJhc2kgc2FhdCBpbmkgZGFuIG1lbGFuanV0a2FuIGtlIGl0ZXJhc2kgYmVyaWt1dG55YSAgDQogIH0gIA0KICAjIE1lbmFtcGlsa2FuIG5hbWEgZGFuIHBlcmZvcm1hIGthcnlhd2FuIHlhbmcga2luZXJqYW55YSB0aWRhayAiUmF0YS1yYXRhIiAgDQogIGNhdCgiTmFtZToiLCBwZXJmb3JtYW5jZV9lbXBsb3llZXMkbmFtZVtpXSwgIiwgUGVyZm9ybWFuY2U6IiwgcGVyZm9ybWFuY2VfZW1wbG95ZWVzJHBlcmZvcm1hbmNlW2ldLCAiXG4iKSAgDQp9ICANCmBgYA0KKipOQiA6KioNCg0KKiotIEtlbmFwYSBBbHlhIHRpZGFrIGFkYSA/KioNCg0KKipBbHlhIHRpZGFrIG11bmN1bCBkYWxhbSBvdXRwdXQga29kZSBSIGthcmVuYSBtZW1pbGlraSBraW5lcmphICJBdmVyYWdlIiwgZGFuIHBlcmludGFoIG5leHQgZGlndW5ha2FuIHVudHVrIG1lbGV3YXRpIGl0ZXJhc2kgdGVyc2VidXQuIEFraWJhdG55YSwga29kZSB1bnR1ayBtZW5hbXBpbGthbiBuYW1hIGRhbiBwZXJmb3JtYSB0aWRhayBkaWVrc2VrdXNpIHVudHVrIEFseWEqKiANCg0K