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