Tugas Individu

Praktikum Pemrograman Dasar - Pemrograman Sains Data

Foto Diri



1. Mengidentifikasi Tipe Data

Tentukan tipe data variabel berikut dalam R:

# R
a = 42
b = 3.14
c = "Hello"
d = FALSE
e = [1, 2, 3]
f = {"name": "Alice", "age": 25}

Pertanyaan:
a. Identifikasi tipe data setiap variabel di atas.
b. Cetak tipe data setiap variabel menggunakan class() (R).

Jawaban:

a <- 42 #(Ini adalah integer)
b <- 3.14 #(ini adalah double)
c <- "Hello"#(ini adalah chr)
d <- FALSE#(ini adalah logical)
e <- c(1, 2, 3)#(ini adalah vektor)
f <- list(name = "Alice", age = 25)#(kalo ini adalah list)

print(class(a))  # numeric (integer)
## [1] "numeric"
print(class(b))  # numeric (double)
## [1] "numeric"
print(class(c))  # character
## [1] "character"
print(class(d))  # logical
## [1] "logical"
print(class(e))  # numeric (vector)
## [1] "numeric"
print(class(f))  # list
## [1] "list"


2. Variabel dan Manipulasi Data

Buat variabel berikut dalam R:

# R
x = 20
y = 5
text1 = "Data"
text2 = "Science"

Pertanyaan:
a. Perbarui nilai x dengan menambahkan 10.
b. Gabungkan text1 dan text2 ke dalam “Data Science”.
c. Mengubah teks gabungan menjadi huruf besar.

Jawaban:

x <- 20
y <- 5
text1 <- "Data"
text2 <- "Science"

x <- x + 10  # Menambahkan 10 ke x
text_digabungkan <- paste(text1, text2)  # Menggabungkan string
text_kapital <- toupper(text_digabungkan)  # Ubah ke huruf besar

print(x)
## [1] 30
print(text_digabungkan)
## [1] "Data Science"
print(text_kapital)
## [1] "DATA SCIENCE"


3. Operasi Aritmatika

Mengingat variabel-variabel berikut:

# R
a = 15
b = 4

Pertanyaan:
a. Hitunglah jumlah, selisih, perkalian, pembagian, dan modulo dari a dan b.
b. Hitunglah a pangkat b.
c. Buat variabel baru c = a / b dan ubah menjadi integer.

Jawaban:

a <- 15
b <- 4

hasil_jumlah <- a + b       # Proses penjumlahan a dan b
hasil_selisih <- a - b      # Proses pengurangan a dengan b
hasil_kali <- a * b         # Proses perkalian a dengan b
hasil_bagi <- a / b         # Proses pembagian a dengan b
hasil_sisa <- a %% b        # Proses mendapatkan sisa pembagian a oleh b
hasil_pangkat <- a^b        # Proses pemangkatan a dengan b
hasil_bulat <- as.integer(a / b)  # Proses pembagian a dengan b dan yg dibulatkan

print(hasil_jumlah)   
## [1] 19
print(hasil_selisih)  
## [1] 11
print(hasil_kali)     
## [1] 60
print(hasil_bagi)     
## [1] 3.75
print(hasil_sisa)     
## [1] 3
print(hasil_pangkat)  
## [1] 50625
print(hasil_bulat)    
## [1] 3


4. Operasi String

Diberikan teks berikut:

# R
text = "Hello, Data Science!"

Pertanyaan:
1. Ekstrak 5 karakter pertama dari teks.
2. Hitung jumlah karakter dalam teks.
3. Mengubah teks menjadi huruf kecil.

Jawaban:

teks <- "Halo, Data Sains!"

# Mengambil lima karakter pertama dari teks
lima_karakter_pertama <- substr(teks, 1, 5)

# Menghitung jumlah karakter dalam teks
jumlah_karakter <- nchar(teks)

# Mengubah teks menjadi huruf kecil
teks_kecil <- tolower(teks)

print(lima_karakter_pertama)  
## [1] "Halo,"
print(jumlah_karakter)  
## [1] 17
print(teks_kecil) 
## [1] "halo, data sains!"


5. Operator Perbandingan dan Logika

Mengingat variabel-variabel berikut:

# R
x = 7
y = 10

Pertanyaan:
1. Periksa apakah x lebih besar dari y.
2. Periksa apakah x kurang dari atau sama dengan y.
3. Periksa apakah x tidak sama dengan y.
4. Evaluasilah ekspresi (x > 5) AND (y < 20).

Jawaban:

x <- 7
y <- 10

print(x > y)  
## [1] FALSE
print(x <= y) 
## [1] TRUE
print(x != y)  
## [1] TRUE
print((x > 5) & (y < 20))  
## [1] TRUE


6. Konversi Tipe Data

Mengingat variabel-variabel berikut:

# R
num_str = "123"
num_float = 45.67

Pertanyaan:
1. Ubah num_str ke bilangan bulat dan tambahkan 10.
2. Ubah num_float ke bilangan bulat.
3. Mengonversi num_float kembali menjadi string.

Jawaban:

angka_str <- "123"
angka_floating <- 45.67

# Mengonversi string menjadi integer dan menambahkannya dengan 10
angka_int <- as.integer(angka_str) + 10

# Mengonversi angka floating menjadi integer (menghilangkan angka desimal)
angka_floating_ke_int <- as.integer(angka_floating)

# Mengonversi angka floating menjadi string
angka_floating_ke_str <- as.character(angka_floating)


print(angka_int)  
## [1] 133
print(angka_floating_ke_int) 
## [1] 45
print(angka_floating_ke_str) 
## [1] "45.67"

7. Tantangan Bonus

Buat program interaktif yang meminta pengguna untuk memasukkan:
1. Nama
2. Usia
3. Kota kelahiran

Kemudian, cetak output sebagai berikut:

"Hello [Name], you are [Age] years old and from [Hometown]."

Jawaban:

nama <- readline(prompt="Masukkan nama: ")
## Masukkan nama:
umur <- readline(prompt="Masukkan usia: ")
## Masukkan usia:
kota_asal <- readline(prompt="Masukkan kota asal: ")
## Masukkan kota asal:
cat("Halo", nama, ", Anda berusia", umur, "tahun dan berasal dari", kota_asal, ".\n")
## Halo  , Anda berusia  tahun dan berasal dari  .

Kesimpulan

Kesimpulan Praktikum Pemrograman Dasar - Pemrograman Sains Data

Selama praktikum ini, kami mempelajari beberapa konsep dasar dalam pemrograman menggunakan R, yang sangat penting dalam dunia sains data. Berikut adalah kesimpulan yang kami dapatkan dari praktikum ini:

  1. Mengidentifikasi Tipe Data: Kami belajar cara mengidentifikasi tipe data setiap variabel menggunakan fungsi class(). Dari sini, kami tahu bahwa ada banyak tipe data seperti integer, double, string (character), logical, dan list, yang masing-masing punya kegunaan dan cara penanganan yang berbeda dalam pemrograman.

  2. Variabel dan Manipulasi Data: Kami mempelajari bagaimana mendeklarasikan variabel dan melakukan manipulasi data seperti penambahan nilai variabel dan penggabungan string. Fungsi paste() untuk menggabungkan string dan toupper() untuk mengubah teks menjadi huruf kapital sangat berguna dalam pemrosesan data.

  3. Operasi Aritmatika: Kami melakukan berbagai operasi matematika, seperti penjumlahan, pengurangan, perkalian, pembagian, dan pemangkatan. Hal ini sangat penting karena dalam analisis data, operasi matematis sering dilakukan untuk memahami data lebih dalam. Kami juga belajar mengonversi hasil pembagian menjadi bilangan bulat menggunakan as.integer(), yang sering diperlukan ketika kita bekerja dengan data yang memiliki angka desimal.

  4. Operasi String: Manipulasi string sangat penting dalam pemrograman data, apalagi saat kita perlu membersihkan data atau mengubah format teks. Kami belajar bagaimana mengambil sebagian teks, menghitung jumlah karakter dengan nchar(), dan mengubah teks menjadi huruf kecil menggunakan tolower().

  5. Operator Perbandingan dan Logika: Kami menggunakan operator perbandingan dan logika seperti >, <=, !=, dan & untuk memeriksa kondisi dalam data. Operator logika ini sangat membantu ketika kami perlu memfilter atau memilih data berdasarkan kondisi tertentu, seperti memilih data yang lebih besar atau lebih kecil dari nilai tertentu.

  6. Konversi Tipe Data: Kami belajar cara mengonversi tipe data, seperti mengubah string menjadi integer, mengubah angka desimal menjadi integer, dan mengubah angka menjadi string. Hal ini sangat membantu saat data yang kami terima berada dalam format yang berbeda, sehingga perlu diubah untuk analisis lebih lanjut.

  7. Tantangan Bonus: Di bagian ini, kami membuat program interaktif yang meminta pengguna untuk memasukkan nama, usia, dan kota asal mereka. Kami sangat menyukai bagian ini karena kami belajar bagaimana mengambil input dari pengguna dan memprosesnya dalam program, yang sangat berguna saat membuat aplikasi interaktif.

Secara keseluruhan, praktikum ini memberikan kami dasar yang kuat dalam pemrograman menggunakan R. Kami merasa lebih siap untuk melanjutkan ke topik-topik yang lebih kompleks dalam sains data, seperti analisis statistik dan pembuatan model prediktif, karena sudah memahami dasar-dasar pemrograman dan manipulasi data yang penting dalam analisis data.

Referensi

Bakti Siregar, M.Sc., CDS. (2025). Basic Programming. Dalam Data Science Programming. Diakses dari https://bookdown.org/dsciencelabs/data_science_programming/01-Basic-Programming.html

LS0tDQp0aXRsZTogIlR1Z2FzIEluZGl2aWR1ICINCnN1YnRpdGxlOiAiUHJha3Rpa3VtIFBlbXJvZ3JhbWFuIERhc2FyIC0gUGVtcm9ncmFtYW4gU2FpbnMgRGF0YSINCmF1dGhvcjogIk9saXZpYSBNZWlsaW5kYSBEYXZ0aW4gUGVzaXJlcm9uIg0KZGF0ZTogImByIGZvcm1hdChTeXMuRGF0ZSgpLCAnJUIgJWQsICVZJylgIg0Kb3V0cHV0Og0KICBybWRmb3JtYXRzOjpyZWFkdGhlZG93bjogICAjIGh0dHBzOi8vZ2l0aHViLmNvbS9qdWJhL3JtZGZvcm1hdHMNCiAgICBzZWxmX2NvbnRhaW5lZDogdHJ1ZQ0KICAgIHRodW1ibmFpbHM6IHRydWUNCiAgICBsaWdodGJveDogdHJ1ZQ0KICAgIGdhbGxlcnk6IHRydWUNCiAgICBsaWJfZGlyOiBsaWJzDQogICAgZGZfcHJpbnQ6ICJwYWdlZCINCiAgICBjb2RlX2ZvbGRpbmc6ICJzaG93Ig0KICAgIGNvZGVfZG93bmxvYWQ6IHllcyANCiAgICBjc3M6ICJzdHlsZS5jc3MiDQotLS0NCg0KPGltZyBzcmM9ImxpdmlrYXRhbnlhLmpwZyIgd2lkdGg9IjMwMCIgc3R5bGU9ImRpc3BsYXk6IGJsb2NrOyBtYXJnaW46IGF1dG87IiBhbHQ9IkZvdG8gRGlyaSI+DQoNCi0tLQ0KDQotLS0NCg0KIyMgMS4gTWVuZ2lkZW50aWZpa2FzaSBUaXBlIERhdGEgDQpUZW50dWthbiB0aXBlIGRhdGEgdmFyaWFiZWwgYmVyaWt1dCBkYWxhbSAqKlIqKjogIA0KDQpgYGByDQojIFINCmEgPSA0Mg0KYiA9IDMuMTQNCmMgPSAiSGVsbG8iDQpkID0gRkFMU0UNCmUgPSBbMSwgMiwgM10NCmYgPSB7Im5hbWUiOiAiQWxpY2UiLCAiYWdlIjogMjV9DQpgYGANCg0KKipQZXJ0YW55YWFuOioqICANCmEuIElkZW50aWZpa2FzaSB0aXBlIGRhdGEgc2V0aWFwIHZhcmlhYmVsIGRpIGF0YXMuICANCmIuIENldGFrIHRpcGUgZGF0YSBzZXRpYXAgdmFyaWFiZWwgbWVuZ2d1bmFrYW4gYGNsYXNzKClgICgqKlIqKikuICANCg0KSmF3YWJhbjoNCg0KYGBge3J9DQphIDwtIDQyICMoSW5pIGFkYWxhaCBpbnRlZ2VyKQ0KYiA8LSAzLjE0ICMoaW5pIGFkYWxhaCBkb3VibGUpDQpjIDwtICJIZWxsbyIjKGluaSBhZGFsYWggY2hyKQ0KZCA8LSBGQUxTRSMoaW5pIGFkYWxhaCBsb2dpY2FsKQ0KZSA8LSBjKDEsIDIsIDMpIyhpbmkgYWRhbGFoIHZla3RvcikNCmYgPC0gbGlzdChuYW1lID0gIkFsaWNlIiwgYWdlID0gMjUpIyhrYWxvIGluaSBhZGFsYWggbGlzdCkNCg0KcHJpbnQoY2xhc3MoYSkpICAjIG51bWVyaWMgKGludGVnZXIpDQpwcmludChjbGFzcyhiKSkgICMgbnVtZXJpYyAoZG91YmxlKQ0KcHJpbnQoY2xhc3MoYykpICAjIGNoYXJhY3Rlcg0KcHJpbnQoY2xhc3MoZCkpICAjIGxvZ2ljYWwNCnByaW50KGNsYXNzKGUpKSAgIyBudW1lcmljICh2ZWN0b3IpDQpwcmludChjbGFzcyhmKSkgICMgbGlzdA0KDQpgYGANCg0KLS0tDQoNCi0tLQ0KDQojIyAyLiBWYXJpYWJlbCBkYW4gTWFuaXB1bGFzaSBEYXRhICANCkJ1YXQgdmFyaWFiZWwgYmVyaWt1dCBkYWxhbSAqKlIqKjogIA0KDQpgYGByDQojIFINCnggPSAyMA0KeSA9IDUNCnRleHQxID0gIkRhdGEiDQp0ZXh0MiA9ICJTY2llbmNlIg0KYGBgDQoNCioqUGVydGFueWFhbjoqKiAgDQphLiBQZXJiYXJ1aSBuaWxhaSBgeGAgZGVuZ2FuIG1lbmFtYmFoa2FuIGAxMGAuICANCmIuIEdhYnVuZ2thbiBgdGV4dDFgIGRhbiBgdGV4dDJgIGtlIGRhbGFtICoqIkRhdGEgU2NpZW5jZSIqKi4gIA0KYy4gTWVuZ3ViYWggdGVrcyBnYWJ1bmdhbiBtZW5qYWRpIGh1cnVmIGJlc2FyLiANCg0KSmF3YWJhbjoNCg0KYGBge3J9DQp4IDwtIDIwDQp5IDwtIDUNCnRleHQxIDwtICJEYXRhIg0KdGV4dDIgPC0gIlNjaWVuY2UiDQoNCnggPC0geCArIDEwICAjIE1lbmFtYmFoa2FuIDEwIGtlIHgNCnRleHRfZGlnYWJ1bmdrYW4gPC0gcGFzdGUodGV4dDEsIHRleHQyKSAgIyBNZW5nZ2FidW5na2FuIHN0cmluZw0KdGV4dF9rYXBpdGFsIDwtIHRvdXBwZXIodGV4dF9kaWdhYnVuZ2thbikgICMgVWJhaCBrZSBodXJ1ZiBiZXNhcg0KDQpwcmludCh4KQ0KcHJpbnQodGV4dF9kaWdhYnVuZ2thbikNCnByaW50KHRleHRfa2FwaXRhbCkNCg0KYGBgDQoNCi0tLQ0KDQotLS0NCg0KIyMgMy4gT3BlcmFzaSBBcml0bWF0aWthDQpNZW5naW5nYXQgdmFyaWFiZWwtdmFyaWFiZWwgYmVyaWt1dDogIA0KDQpgYGByDQojIFINCmEgPSAxNQ0KYiA9IDQNCmBgYA0KDQoqKlBlcnRhbnlhYW46KiogIA0KYS4gSGl0dW5nbGFoICoqanVtbGFoLCBzZWxpc2loLCBwZXJrYWxpYW4sIHBlbWJhZ2lhbiwgZGFuIG1vZHVsbyoqIGRhcmkgYGFgIGRhbiBgYmAuICANCmIuIEhpdHVuZ2xhaCAqKmEgcGFuZ2thdCBiKiouICANCmMuIEJ1YXQgdmFyaWFiZWwgYmFydSBgYyA9IGEgLyBiYCBkYW4gdWJhaCBtZW5qYWRpICoqaW50ZWdlcioqLiAgDQoNCkphd2FiYW46DQoNCmBgYHtyfQ0KYSA8LSAxNQ0KYiA8LSA0DQoNCmhhc2lsX2p1bWxhaCA8LSBhICsgYiAgICAgICAjIFByb3NlcyBwZW5qdW1sYWhhbiBhIGRhbiBiDQpoYXNpbF9zZWxpc2loIDwtIGEgLSBiICAgICAgIyBQcm9zZXMgcGVuZ3VyYW5nYW4gYSBkZW5nYW4gYg0KaGFzaWxfa2FsaSA8LSBhICogYiAgICAgICAgICMgUHJvc2VzIHBlcmthbGlhbiBhIGRlbmdhbiBiDQpoYXNpbF9iYWdpIDwtIGEgLyBiICAgICAgICAgIyBQcm9zZXMgcGVtYmFnaWFuIGEgZGVuZ2FuIGINCmhhc2lsX3Npc2EgPC0gYSAlJSBiICAgICAgICAjIFByb3NlcyBtZW5kYXBhdGthbiBzaXNhIHBlbWJhZ2lhbiBhIG9sZWggYg0KaGFzaWxfcGFuZ2thdCA8LSBhXmIgICAgICAgICMgUHJvc2VzIHBlbWFuZ2thdGFuIGEgZGVuZ2FuIGINCmhhc2lsX2J1bGF0IDwtIGFzLmludGVnZXIoYSAvIGIpICAjIFByb3NlcyBwZW1iYWdpYW4gYSBkZW5nYW4gYiBkYW4geWcgZGlidWxhdGthbg0KDQpwcmludChoYXNpbF9qdW1sYWgpICAgDQpwcmludChoYXNpbF9zZWxpc2loKSAgDQpwcmludChoYXNpbF9rYWxpKSAgICAgDQpwcmludChoYXNpbF9iYWdpKSAgICAgDQpwcmludChoYXNpbF9zaXNhKSAgICAgDQpwcmludChoYXNpbF9wYW5na2F0KSAgDQpwcmludChoYXNpbF9idWxhdCkgICAgDQoNCmBgYA0KDQoNCi0tLQ0KDQotLS0NCg0KIyMgNC4gT3BlcmFzaSBTdHJpbmcNCkRpYmVyaWthbiB0ZWtzIGJlcmlrdXQ6ICANCg0KYGBgcg0KIyBSDQp0ZXh0ID0gIkhlbGxvLCBEYXRhIFNjaWVuY2UhIg0KYGBgDQoNCioqUGVydGFueWFhbjoqKiAgDQoxLiBFa3N0cmFrICoqNSBrYXJha3RlciBwZXJ0YW1hKiogZGFyaSB0ZWtzLiAgDQoyLiBIaXR1bmcganVtbGFoIGthcmFrdGVyIGRhbGFtIHRla3MuICANCjMuIE1lbmd1YmFoIHRla3MgbWVuamFkaSAqKmh1cnVmIGtlY2lsKiouICANCg0KSmF3YWJhbjoNCg0KYGBge3J9DQp0ZWtzIDwtICJIYWxvLCBEYXRhIFNhaW5zISINCg0KIyBNZW5nYW1iaWwgbGltYSBrYXJha3RlciBwZXJ0YW1hIGRhcmkgdGVrcw0KbGltYV9rYXJha3Rlcl9wZXJ0YW1hIDwtIHN1YnN0cih0ZWtzLCAxLCA1KQ0KDQojIE1lbmdoaXR1bmcganVtbGFoIGthcmFrdGVyIGRhbGFtIHRla3MNCmp1bWxhaF9rYXJha3RlciA8LSBuY2hhcih0ZWtzKQ0KDQojIE1lbmd1YmFoIHRla3MgbWVuamFkaSBodXJ1ZiBrZWNpbA0KdGVrc19rZWNpbCA8LSB0b2xvd2VyKHRla3MpDQoNCnByaW50KGxpbWFfa2FyYWt0ZXJfcGVydGFtYSkgIA0KcHJpbnQoanVtbGFoX2thcmFrdGVyKSAgDQpwcmludCh0ZWtzX2tlY2lsKSANCg0KYGBgDQoNCi0tLQ0KDQotLS0NCg0KIyMgIDUuIE9wZXJhdG9yIFBlcmJhbmRpbmdhbiBkYW4gTG9naWthIA0KTWVuZ2luZ2F0IHZhcmlhYmVsLXZhcmlhYmVsIGJlcmlrdXQ6ICANCg0KYGBgcg0KIyBSDQp4ID0gNw0KeSA9IDEwDQpgYGANCg0KKipQZXJ0YW55YWFuOioqICANCjEuIFBlcmlrc2EgYXBha2FoIGB4YCAqKmxlYmloIGJlc2FyIGRhcmkqKiBgeWAuICANCjIuIFBlcmlrc2EgYXBha2FoIGB4YCAqKmt1cmFuZyBkYXJpIGF0YXUgc2FtYSBkZW5nYW4qKiBgeWAuICANCjMuIFBlcmlrc2EgYXBha2FoIGB4YCAqKnRpZGFrIHNhbWEgZGVuZ2FuKiogYHlgLiAgDQo0LiBFdmFsdWFzaWxhaCBla3NwcmVzaSAqKih4ID4gNSkgQU5EICh5IDwgMjApKiouICANCg0KSmF3YWJhbjoNCg0KYGBge3J9DQp4IDwtIDcNCnkgPC0gMTANCg0KcHJpbnQoeCA+IHkpICANCnByaW50KHggPD0geSkgDQpwcmludCh4ICE9IHkpICANCnByaW50KCh4ID4gNSkgJiAoeSA8IDIwKSkgIA0KDQpgYGANCg0KDQotLS0NCg0KLS0tDQoNCiMjIDYuIEtvbnZlcnNpIFRpcGUgRGF0YSAgDQpNZW5naW5nYXQgdmFyaWFiZWwtdmFyaWFiZWwgYmVyaWt1dDogIA0KDQpgYGByDQojIFINCm51bV9zdHIgPSAiMTIzIg0KbnVtX2Zsb2F0ID0gNDUuNjcNCmBgYA0KDQoqKlBlcnRhbnlhYW46KiogIA0KMS4gVWJhaCBgbnVtX3N0cmAga2UgKipiaWxhbmdhbiBidWxhdCoqIGRhbiB0YW1iYWhrYW4gYDEwYC4gIA0KMi4gVWJhaCBgbnVtX2Zsb2F0YCBrZSAqKmJpbGFuZ2FuIGJ1bGF0KiouICANCjMuIE1lbmdvbnZlcnNpIGBudW1fZmxvYXRgIGtlbWJhbGkgbWVuamFkaSAqKnN0cmluZyoqLiAgDQoNCkphd2FiYW46DQoNCmBgYHtyfQ0KYW5na2Ffc3RyIDwtICIxMjMiDQphbmdrYV9mbG9hdGluZyA8LSA0NS42Nw0KDQojIE1lbmdvbnZlcnNpIHN0cmluZyBtZW5qYWRpIGludGVnZXIgZGFuIG1lbmFtYmFoa2FubnlhIGRlbmdhbiAxMA0KYW5na2FfaW50IDwtIGFzLmludGVnZXIoYW5na2Ffc3RyKSArIDEwDQoNCiMgTWVuZ29udmVyc2kgYW5na2EgZmxvYXRpbmcgbWVuamFkaSBpbnRlZ2VyIChtZW5naGlsYW5na2FuIGFuZ2thIGRlc2ltYWwpDQphbmdrYV9mbG9hdGluZ19rZV9pbnQgPC0gYXMuaW50ZWdlcihhbmdrYV9mbG9hdGluZykNCg0KIyBNZW5nb252ZXJzaSBhbmdrYSBmbG9hdGluZyBtZW5qYWRpIHN0cmluZw0KYW5na2FfZmxvYXRpbmdfa2Vfc3RyIDwtIGFzLmNoYXJhY3RlcihhbmdrYV9mbG9hdGluZykNCg0KDQpwcmludChhbmdrYV9pbnQpICANCnByaW50KGFuZ2thX2Zsb2F0aW5nX2tlX2ludCkgDQpwcmludChhbmdrYV9mbG9hdGluZ19rZV9zdHIpIA0KDQpgYGANCg0KDQotLS0NCi0tLQ0KDQojIyA3LiBUYW50YW5nYW4gQm9udXMgDQpCdWF0IHByb2dyYW0gaW50ZXJha3RpZiB5YW5nIG1lbWludGEgcGVuZ2d1bmEgdW50dWsgbWVtYXN1a2thbjogIA0KMS4gKipOYW1hKiogIA0KMi4gKipVc2lhKiogIA0KMy4gKipLb3RhIGtlbGFoaXJhbioqICANCg0KS2VtdWRpYW4sIGNldGFrIG91dHB1dCBzZWJhZ2FpIGJlcmlrdXQ6ICANCg0KYGBgdHh0DQoiSGVsbG8gW05hbWVdLCB5b3UgYXJlIFtBZ2VdIHllYXJzIG9sZCBhbmQgZnJvbSBbSG9tZXRvd25dLiINCmBgYA0KSmF3YWJhbjoNCg0KYGBge3J9DQpuYW1hIDwtIHJlYWRsaW5lKHByb21wdD0iTWFzdWtrYW4gbmFtYTogIikNCnVtdXIgPC0gcmVhZGxpbmUocHJvbXB0PSJNYXN1a2thbiB1c2lhOiAiKQ0Ka290YV9hc2FsIDwtIHJlYWRsaW5lKHByb21wdD0iTWFzdWtrYW4ga290YSBhc2FsOiAiKQ0KDQpjYXQoIkhhbG8iLCBuYW1hLCAiLCBBbmRhIGJlcnVzaWEiLCB1bXVyLCAidGFodW4gZGFuIGJlcmFzYWwgZGFyaSIsIGtvdGFfYXNhbCwgIi5cbiIpDQoNCmBgYA0KDQojIyBLZXNpbXB1bGFuIA0KDQojIyMgS2VzaW1wdWxhbiBQcmFrdGlrdW0gUGVtcm9ncmFtYW4gRGFzYXIgLSBQZW1yb2dyYW1hbiBTYWlucyBEYXRhDQoNClNlbGFtYSBwcmFrdGlrdW0gaW5pLCBrYW1pIG1lbXBlbGFqYXJpIGJlYmVyYXBhIGtvbnNlcCBkYXNhciBkYWxhbSBwZW1yb2dyYW1hbiBtZW5nZ3VuYWthbiAqKlIqKiwgeWFuZyBzYW5nYXQgcGVudGluZyBkYWxhbSBkdW5pYSBzYWlucyBkYXRhLiBCZXJpa3V0IGFkYWxhaCBrZXNpbXB1bGFuIHlhbmcga2FtaSBkYXBhdGthbiBkYXJpIHByYWt0aWt1bSBpbmk6DQoNCjEuICoqTWVuZ2lkZW50aWZpa2FzaSBUaXBlIERhdGE6KioNCiAgIEthbWkgYmVsYWphciBjYXJhIG1lbmdpZGVudGlmaWthc2kgdGlwZSBkYXRhIHNldGlhcCB2YXJpYWJlbCBtZW5nZ3VuYWthbiBmdW5nc2kgYGNsYXNzKClgLiBEYXJpIHNpbmksIGthbWkgdGFodSBiYWh3YSBhZGEgYmFueWFrIHRpcGUgZGF0YSBzZXBlcnRpIGludGVnZXIsIGRvdWJsZSwgc3RyaW5nIChjaGFyYWN0ZXIpLCBsb2dpY2FsLCBkYW4gbGlzdCwgeWFuZyBtYXNpbmctbWFzaW5nIHB1bnlhIGtlZ3VuYWFuIGRhbiBjYXJhIHBlbmFuZ2FuYW4geWFuZyBiZXJiZWRhIGRhbGFtIHBlbXJvZ3JhbWFuLg0KDQoyLiAqKlZhcmlhYmVsIGRhbiBNYW5pcHVsYXNpIERhdGE6KioNCiAgIEthbWkgbWVtcGVsYWphcmkgYmFnYWltYW5hIG1lbmRla2xhcmFzaWthbiB2YXJpYWJlbCBkYW4gbWVsYWt1a2FuIG1hbmlwdWxhc2kgZGF0YSBzZXBlcnRpIHBlbmFtYmFoYW4gbmlsYWkgdmFyaWFiZWwgZGFuIHBlbmdnYWJ1bmdhbiBzdHJpbmcuIEZ1bmdzaSBgcGFzdGUoKWAgdW50dWsgbWVuZ2dhYnVuZ2thbiBzdHJpbmcgZGFuIGB0b3VwcGVyKClgIHVudHVrIG1lbmd1YmFoIHRla3MgbWVuamFkaSBodXJ1ZiBrYXBpdGFsIHNhbmdhdCBiZXJndW5hIGRhbGFtIHBlbXJvc2VzYW4gZGF0YS4NCg0KMy4gKipPcGVyYXNpIEFyaXRtYXRpa2E6KioNCiAgIEthbWkgbWVsYWt1a2FuIGJlcmJhZ2FpIG9wZXJhc2kgbWF0ZW1hdGlrYSwgc2VwZXJ0aSBwZW5qdW1sYWhhbiwgcGVuZ3VyYW5nYW4sIHBlcmthbGlhbiwgcGVtYmFnaWFuLCBkYW4gcGVtYW5na2F0YW4uIEhhbCBpbmkgc2FuZ2F0IHBlbnRpbmcga2FyZW5hIGRhbGFtIGFuYWxpc2lzIGRhdGEsIG9wZXJhc2kgbWF0ZW1hdGlzIHNlcmluZyBkaWxha3VrYW4gdW50dWsgbWVtYWhhbWkgZGF0YSBsZWJpaCBkYWxhbS4gS2FtaSBqdWdhIGJlbGFqYXIgbWVuZ29udmVyc2kgaGFzaWwgcGVtYmFnaWFuIG1lbmphZGkgYmlsYW5nYW4gYnVsYXQgbWVuZ2d1bmFrYW4gYGFzLmludGVnZXIoKWAsIHlhbmcgc2VyaW5nIGRpcGVybHVrYW4ga2V0aWthIGtpdGEgYmVrZXJqYSBkZW5nYW4gZGF0YSB5YW5nIG1lbWlsaWtpIGFuZ2thIGRlc2ltYWwuDQoNCjQuICoqT3BlcmFzaSBTdHJpbmc6KioNCiAgIE1hbmlwdWxhc2kgc3RyaW5nIHNhbmdhdCBwZW50aW5nIGRhbGFtIHBlbXJvZ3JhbWFuIGRhdGEsIGFwYWxhZ2kgc2FhdCBraXRhIHBlcmx1IG1lbWJlcnNpaGthbiBkYXRhIGF0YXUgbWVuZ3ViYWggZm9ybWF0IHRla3MuIEthbWkgYmVsYWphciBiYWdhaW1hbmEgbWVuZ2FtYmlsIHNlYmFnaWFuIHRla3MsIG1lbmdoaXR1bmcganVtbGFoIGthcmFrdGVyIGRlbmdhbiBgbmNoYXIoKWAsIGRhbiBtZW5ndWJhaCB0ZWtzIG1lbmphZGkgaHVydWYga2VjaWwgbWVuZ2d1bmFrYW4gYHRvbG93ZXIoKWAuDQoNCjUuICoqT3BlcmF0b3IgUGVyYmFuZGluZ2FuIGRhbiBMb2dpa2E6KioNCiAgIEthbWkgbWVuZ2d1bmFrYW4gb3BlcmF0b3IgcGVyYmFuZGluZ2FuIGRhbiBsb2dpa2Egc2VwZXJ0aSBgPmAsIGA8PWAsIGAhPWAsIGRhbiBgJmAgdW50dWsgbWVtZXJpa3NhIGtvbmRpc2kgZGFsYW0gZGF0YS4gT3BlcmF0b3IgbG9naWthIGluaSBzYW5nYXQgbWVtYmFudHUga2V0aWthIGthbWkgcGVybHUgbWVtZmlsdGVyIGF0YXUgbWVtaWxpaCBkYXRhIGJlcmRhc2Fya2FuIGtvbmRpc2kgdGVydGVudHUsIHNlcGVydGkgbWVtaWxpaCBkYXRhIHlhbmcgbGViaWggYmVzYXIgYXRhdSBsZWJpaCBrZWNpbCBkYXJpIG5pbGFpIHRlcnRlbnR1Lg0KDQo2LiAqKktvbnZlcnNpIFRpcGUgRGF0YToqKg0KICAgS2FtaSBiZWxhamFyIGNhcmEgbWVuZ29udmVyc2kgdGlwZSBkYXRhLCBzZXBlcnRpIG1lbmd1YmFoIHN0cmluZyBtZW5qYWRpIGludGVnZXIsIG1lbmd1YmFoIGFuZ2thIGRlc2ltYWwgbWVuamFkaSBpbnRlZ2VyLCBkYW4gbWVuZ3ViYWggYW5na2EgbWVuamFkaSBzdHJpbmcuIEhhbCBpbmkgc2FuZ2F0IG1lbWJhbnR1IHNhYXQgZGF0YSB5YW5nIGthbWkgdGVyaW1hIGJlcmFkYSBkYWxhbSBmb3JtYXQgeWFuZyBiZXJiZWRhLCBzZWhpbmdnYSBwZXJsdSBkaXViYWggdW50dWsgYW5hbGlzaXMgbGViaWggbGFuanV0Lg0KDQo3LiAqKlRhbnRhbmdhbiBCb251czoqKg0KICAgRGkgYmFnaWFuIGluaSwga2FtaSBtZW1idWF0IHByb2dyYW0gaW50ZXJha3RpZiB5YW5nIG1lbWludGEgcGVuZ2d1bmEgdW50dWsgbWVtYXN1a2thbiBuYW1hLCB1c2lhLCBkYW4ga290YSBhc2FsIG1lcmVrYS4gS2FtaSBzYW5nYXQgbWVueXVrYWkgYmFnaWFuIGluaSBrYXJlbmEga2FtaSBiZWxhamFyIGJhZ2FpbWFuYSBtZW5nYW1iaWwgaW5wdXQgZGFyaSBwZW5nZ3VuYSBkYW4gbWVtcHJvc2VzbnlhIGRhbGFtIHByb2dyYW0sIHlhbmcgc2FuZ2F0IGJlcmd1bmEgc2FhdCBtZW1idWF0IGFwbGlrYXNpIGludGVyYWt0aWYuDQoNClNlY2FyYSBrZXNlbHVydWhhbiwgcHJha3Rpa3VtIGluaSBtZW1iZXJpa2FuIGthbWkgZGFzYXIgeWFuZyBrdWF0IGRhbGFtIHBlbXJvZ3JhbWFuIG1lbmdndW5ha2FuIFIuIEthbWkgbWVyYXNhIGxlYmloIHNpYXAgdW50dWsgbWVsYW5qdXRrYW4ga2UgdG9waWstdG9waWsgeWFuZyBsZWJpaCBrb21wbGVrcyBkYWxhbSBzYWlucyBkYXRhLCBzZXBlcnRpIGFuYWxpc2lzIHN0YXRpc3RpayBkYW4gcGVtYnVhdGFuIG1vZGVsIHByZWRpa3RpZiwga2FyZW5hIHN1ZGFoIG1lbWFoYW1pIGRhc2FyLWRhc2FyIHBlbXJvZ3JhbWFuIGRhbiBtYW5pcHVsYXNpIGRhdGEgeWFuZyBwZW50aW5nIGRhbGFtIGFuYWxpc2lzIGRhdGEuDQoNCiMjIFJlZmVyZW5zaQ0KDQo+IEJha3RpIFNpcmVnYXIsIE0uU2MuLCBDRFMuICgyMDI1KS4gQmFzaWMgUHJvZ3JhbW1pbmcuIERhbGFtIERhdGEgU2NpZW5jZSBQcm9ncmFtbWluZy4gRGlha3NlcyBkYXJpIGh0dHBzOi8vYm9va2Rvd24ub3JnL2RzY2llbmNlbGFicy9kYXRhX3NjaWVuY2VfcHJvZ3JhbW1pbmcvMDEtQmFzaWMtUHJvZ3JhbW1pbmcuaHRtbCANCg0K