Basic Programing Data Sains Praktikum 1

Profile

Basic Programing

A. Mengidentifikasi Tipe Data

###1. Identifikasi Tipe Data setiap Variabel

Identifikasi Tipe Data dalam Python dan R
Identifikasi Tipe Data
Variabel Nilai Python R
a 42 int numeric
b 3.14 float numeric
c “Hello” str character
d FALSE / False bool logical
e [1, 2, 3] list numeric (vector)
f {“name”: “Alice”, “age”: 25} dict list

2. Cetak Tipe Data setiap variabel menggunakan type() (Python) dan class() (R)

# Mendefinisikan variabel
a <- 42  # Integer (Bilangan bulat)
a <- as.integer(42) 
b <- 3.14  # Numeric (Angka desimal)
c <- "Hello"  # Character (Teks)
d <- FALSE  # Logical (Boolean)
e <- c(1, 2, 3)  # Numeric (Vektor angka)
f <- list("Name" = "Alice", "age" = 25)  # List (Kumpulan elemen dengan tipe berbeda)

# Mencetak tipe data tiap variabel
cat(
  "Tipe data a:", class(a), "\n",  # Integer
  "Tipe data b:", class(b), "\n",  # Numeric
  "Tipe data c:", class(c), "\n",  # Character
  "Tipe data d:", class(d), "\n",  # Logical
  "Tipe data e:", class(e), "\n",  # Numeric
  "Tipe data f:", class(f), "\n"   # List
)
## Tipe data a: integer 
##  Tipe data b: numeric 
##  Tipe data c: character 
##  Tipe data d: logical 
##  Tipe data e: numeric 
##  Tipe data f: list

B. Variabel dan Manipulasi Data

1. Mengidentifikasi Variabel ke dalam R

x: \(20\)

y: \(5\)

text1: \(Data\)

text2: \(Science\)

  • Memperbarui nilai \(x\) dengan menambahkan \(10\).
  • Menggabungkan \(text1\) dan \(text2\) ke dalam kata Data Science.
  • Mengubah teks gabungan menjadi huruf besar.
# Definisi variabel
x <- 20
y <- 5
text1 <- "Data"
text2 <- "Science"

# Operasi pada variabel
x <- x + 10  # Menambah 10 ke x
merged_text <- paste0(text1, " ", text2)  # Menggabungkan teks tanpa sep
capitalized_text <- toupper(merged_text)  # Konversi ke huruf besar

# Menampilkan hasil
cat(
  sprintf("Nilai x ditambah 10: %d\n", x),
  sprintf("Teks gabungan: %s\n", merged_text),
  sprintf("Teks dalam huruf besar: %s\n", capitalized_text)
)
## Nilai x ditambah 10: 30
##  Teks gabungan: Data Science
##  Teks dalam huruf besar: DATA SCIENCE

C. Operasi Aritmatika

Variabel-variabel

a : \(15\)

b : \(4\)

  • Menghitung jumlah, selisih, perkalian, pembagian, dan modulo dari a dan b.
  • Menghitung a pangkat b
  • Membuat variabel baru c = a/b ubah menjadi integer.
# Mendefinisikan variabel
a <- 15
b <- 4

# 1. Hitung operasi aritmatika dasar
jumlah <- a + b        # Penjumlahan
selisih <- a - b       # Pengurangan
produk <- a * b        # Perkalian
pembagian <- a / b     # Pembagian
modulo <- a %% b       # Sisa pembagian

# 2. Hitung a pangkat b
pangkat <- a^b

# 3. Buat variabel baru c dan ubah menjadi integer
c <- as.integer(a / b)

# Menampilkan hasil
cat(
  "Hasil Penjumlahan:", jumlah, "\n",
  "Hasil Pengurangan:", selisih, "\n",
  "Hasil Perkalian:", produk, "\n",
  "Hasil Pembagian:", pembagian, "\n",
  "Hasil Modulo:", modulo, "\n",
  "Hasil Pangkat:", pangkat, "\n",
  "Nilai c sebagai integer:", c, "\n"
)
## Hasil Penjumlahan: 19 
##  Hasil Pengurangan: 11 
##  Hasil Perkalian: 60 
##  Hasil Pembagian: 3.75 
##  Hasil Modulo: 3 
##  Hasil Pangkat: 50625 
##  Nilai c sebagai integer: 3

D. Operasi String

Text : Hello, Data Science!

  • Ekstrak \(5\) karakter pertama dari teks.
  • Menghitung jumlah karakter dalam teks.
  • Mengubah teks menjadi huruf kecil.
# Mendefinisikan string
teks <- "Hello, Data Science!"

# Operasi string
lima_karakter_pertama <- substr(teks, start = 1, stop = 5) # Mengambil 5 karakter pertama
panjang_teks <- nchar(teks) # Menghitung total karakter
teks_lower <- tolower(teks) # Mengonversi teks menjadi huruf kecil

# Menampilkan hasil
cat(
  "Lima karakter pertama:", lima_karakter_pertama, "\n",
  "Total jumlah karakter:", panjang_teks, "\n",
  "Teks dalam bentuk kecil:", teks_lower, "\n"
)
## Lima karakter pertama: Hello 
##  Total jumlah karakter: 20 
##  Teks dalam bentuk kecil: hello, data science!

E. Operator Perbandingan dan Logika

Mengingat variabel-variabel berikut:

x: \(7\)

y : \(10\)

  • Periksa apakah x lebih besar dari y.
  • Periksa apakah x kurang dari atau sama dengan y.
  • Periksa apakah x tidak sama dengan y.
  • Evaluasilah ekspresi (x > 5) AND (y < 20).
# Mendefinisikan variabel
x <- 7
y <- 10

# Operasi perbandingan
lebih_besar <- x > y  # Apakah x lebih besar dari y?
kurang_sama <- x <= y # Apakah x kurang dari atau sama dengan y?
tidak_sama <- x != y  # Apakah x tidak sama dengan y?

# Operasi logika
logika_and <- (x > 5) & (y < 20)  # Evaluasi ekspresi (x > 5) AND (y < 20)

# Menampilkan hasil
cat(
  "Apakah x lebih besar dari y?:", lebih_besar, "\n",
  "Apakah x kurang dari atau sama dengan y?:", kurang_sama, "\n",
  "Apakah x tidak sama dengan y?:", tidak_sama, "\n",
  "Evaluasi (x > 5) AND (y < 20):", logika_and, "\n"
)
## Apakah x lebih besar dari y?: FALSE 
##  Apakah x kurang dari atau sama dengan y?: TRUE 
##  Apakah x tidak sama dengan y?: TRUE 
##  Evaluasi (x > 5) AND (y < 20): TRUE

F. Konversi Tipe Data

num_str : \(123\)

num_float : \(45.67\)

  • Ubah num_str ke bilangan dan tambahkan \(10\).
  • Ubah num_float ke bilangan bulat.
  • Mengonversi num_float kembali menjadi string.
# Mendefinisikan variabel
num_str <- "123"
num_float <- 45.67

# Konversi dan operasi
num_str_ke_bilangan <- as.numeric(num_str) + 10  # Ubah num_str ke bilangan dan tambahkan 10
num_float_ke_bulat <- as.integer(num_float)      # Ubah num_float ke bilangan bulat
num_float_ke_string <- as.character(num_float)   # Ubah num_float kembali ke string

# Menampilkan hasil
cat(
  "Hasil konversi num_str ke bilangan dan ditambah 10:", num_str_ke_bilangan, "\n",
  "Hasil konversi num_float ke bilangan bulat:", num_float_ke_bulat, "\n",
  "Hasil konversi num_float ke string:", num_float_ke_string, "\n"
)
## Hasil konversi num_str ke bilangan dan ditambah 10: 133 
##  Hasil konversi num_float ke bilangan bulat: 45 
##  Hasil konversi num_float ke string: 45.67

G. Tantangan Bonus

Buat program interaktif yang meminta pengguna untuk memasukkan:

  • Nama
  • Usia
  • Kota kelahiran

Kemudian, cetak output sebagai berikut:

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

# Cegah error jika dijalankan langsung tanpa params
if (!exists("params")) {
  params <- list(name = "Default Nabila", age = 19, hometown = "Riau")
}

# Gunakan params
name <- params$name
age <- params$age
hometown <- params$hometown

cat("Hello", name, ", you are", age, "years old and from", hometown, "\n")
## Hello Default Nabila , you are 19 years old and from Riau
LS0tDQp0aXRsZTogIkJhc2ljIFByb2dyYW1pbmcgRGF0YSBTYWlucyBQcmFrdGlrdW0gMSINCg0KYXV0aG9yOiANCiAgICAtICJOYWJpbGEgQW5nZ2l0YSBQdXRyaSINCiAgICANCmRhdGU6ICJgciBmb3JtYXQoU3lzLkRhdGUoKSwgJyVCICVkLCAlWScpYCINCm91dHB1dDoNCiAgcm1kZm9ybWF0czo6cmVhZHRoZWRvd246DQogICAgc2VsZl9jb250YWluZWQ6IHRydWUNCiAgICB0aHVtYm5haWxzOiB0cnVlDQogICAgbGlnaHRib3g6IHRydWUNCiAgICBnYWxsZXJ5OiB0cnVlDQogICAgbGliX2RpcjogbGlicw0KICAgIGRmX3ByaW50OiAicGFnZWQiDQogICAgY29kZV9mb2xkaW5nOiAic2hvdyINCiAgICBjb2RlX2Rvd25sb2FkOiB5ZXMNCiAgICBjc3M6ICJzdHlsZS9zdHlsZSBjc3MuY3NzIg0KLS0tDQo8aW1nIHNyYz0iaW1nL3Byb2ZpbGUuanBnIiBhbHQ9IlByb2ZpbGUiIGlkPSJsb2dvLXV0YW1hIiBzdHlsZT0id2lkdGg6MzAwcHg7IGRpc3BsYXk6IGJsb2NrOyBtYXJnaW46IGF1dG87Ii8+DQoNCg0KIyAqKkJhc2ljIFByb2dyYW1pbmcqKg0KDQojIyAqKkEuIE1lbmdpZGVudGlmaWthc2kgVGlwZSBEYXRhKioNCg0KIyMjKioxLiBJZGVudGlmaWthc2kgVGlwZSBEYXRhIHNldGlhcCBWYXJpYWJlbCoqDQoNCmBgYHtyLCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KIyBNZW11YXQgcGFrZXQgeWFuZyBkaXBlcmx1a2FuDQpsaWJyYXJ5KGtuaXRyKQ0KbGlicmFyeShrYWJsZUV4dHJhKQ0KDQojIE1lbWJ1YXQgZGF0YSBmcmFtZQ0KZGF0YSA8LSBkYXRhLmZyYW1lKA0KICBWYXJpYWJlbCA9IGMoImEiLCAiYiIsICJjIiwgImQiLCAiZSIsICJmIiksDQogIE5pbGFpID0gYygiNDIiLCAiMy4xNCIsICJcIkhlbGxvXCIiLCAiRkFMU0UgLyBGYWxzZSIsICJbMSwgMiwgM10iLCAie1wibmFtZVwiOiBcIkFsaWNlXCIsIFwiYWdlXCI6IDI1fSIpLA0KICBQeXRob24gPSBjKCJpbnQiLCAiZmxvYXQiLCAic3RyIiwgImJvb2wiLCAibGlzdCIsICJkaWN0IiksDQogIFIgPSBjKCJudW1lcmljIiwgIm51bWVyaWMiLCAiY2hhcmFjdGVyIiwgImxvZ2ljYWwiLCAibnVtZXJpYyAodmVjdG9yKSIsICJsaXN0IikNCikNCg0KIyBNZW5hbXBpbGthbiB0YWJlbCBkZW5nYW4gc3R5bGluZyBkYW4gd2FybmEgcGFkYSB0ZWtzIGhlYWRlcg0Ka2FibGUoZGF0YSwgZm9ybWF0ID0gImh0bWwiLCBib29rdGFicyA9IFRSVUUsIGNhcHRpb24gPSAiSWRlbnRpZmlrYXNpIFRpcGUgRGF0YSBkYWxhbSBQeXRob24gZGFuIFIiKSAlPiUNCiAga2FibGVfc3R5bGluZyhib290c3RyYXBfb3B0aW9ucyA9IGMoInN0cmlwZWQiLCAiaG92ZXIiKSkgJT4lDQogIGNvbHVtbl9zcGVjKDEsIGJhY2tncm91bmQgPSAibGlnaHRibHVlIikgJT4lICAjIFdhcm5hIGxhdGFyIGJlbGFrYW5nIGtvbG9tICdWYXJpYWJlbCcNCiAgY29sdW1uX3NwZWMoMiwgYmFja2dyb3VuZCA9ICJsaWdodGdyZWVuIikgJT4lICMgV2FybmEgbGF0YXIgYmVsYWthbmcga29sb20gJ05pbGFpJw0KICBjb2x1bW5fc3BlYygzLCBiYWNrZ3JvdW5kID0gImxpZ2h0eWVsbG93IikgJT4lIyBXYXJuYSBsYXRhciBiZWxha2FuZyBrb2xvbSAnUHl0aG9uJw0KICBjb2x1bW5fc3BlYyg0LCBiYWNrZ3JvdW5kID0gImxpZ2h0Y29yYWwiKSAlPiUgICMgV2FybmEgbGF0YXIgYmVsYWthbmcga29sb20gJ1InDQogICMgTWVtYmVyaWthbiB3YXJuYSBwYWRhIHRla3MgaGVhZGVyIGtvbG9tDQogIGFkZF9oZWFkZXJfYWJvdmUoYygiICIgPSAxLCAiSWRlbnRpZmlrYXNpIFRpcGUgRGF0YSIgPSAzKSwgYm9sZCA9IFRSVUUsIGNvbG9yID0gIndoaXRlIiwgYmFja2dyb3VuZCA9ICJkYXJrYmx1ZSIpICU+JQ0KICByb3dfc3BlYygwLCBib2xkID0gVFJVRSwgY29sb3IgPSAid2hpdGUiLCBiYWNrZ3JvdW5kID0gImRhcmtibHVlIikNCmBgYA0KDQojIyMgKioyLiBDZXRhayBUaXBlIERhdGEgc2V0aWFwIHZhcmlhYmVsIG1lbmdndW5ha2FuIHR5cGUoKSAoUHl0aG9uKSBkYW4gY2xhc3MoKSAoUikqKg0KDQpgYGB7ciBlY2hvPVRSVUV9DQojIE1lbmRlZmluaXNpa2FuIHZhcmlhYmVsDQphIDwtIDQyICAjIEludGVnZXIgKEJpbGFuZ2FuIGJ1bGF0KQ0KYSA8LSBhcy5pbnRlZ2VyKDQyKSANCmIgPC0gMy4xNCAgIyBOdW1lcmljIChBbmdrYSBkZXNpbWFsKQ0KYyA8LSAiSGVsbG8iICAjIENoYXJhY3RlciAoVGVrcykNCmQgPC0gRkFMU0UgICMgTG9naWNhbCAoQm9vbGVhbikNCmUgPC0gYygxLCAyLCAzKSAgIyBOdW1lcmljIChWZWt0b3IgYW5na2EpDQpmIDwtIGxpc3QoIk5hbWUiID0gIkFsaWNlIiwgImFnZSIgPSAyNSkgICMgTGlzdCAoS3VtcHVsYW4gZWxlbWVuIGRlbmdhbiB0aXBlIGJlcmJlZGEpDQoNCiMgTWVuY2V0YWsgdGlwZSBkYXRhIHRpYXAgdmFyaWFiZWwNCmNhdCgNCiAgIlRpcGUgZGF0YSBhOiIsIGNsYXNzKGEpLCAiXG4iLCAgIyBJbnRlZ2VyDQogICJUaXBlIGRhdGEgYjoiLCBjbGFzcyhiKSwgIlxuIiwgICMgTnVtZXJpYw0KICAiVGlwZSBkYXRhIGM6IiwgY2xhc3MoYyksICJcbiIsICAjIENoYXJhY3Rlcg0KICAiVGlwZSBkYXRhIGQ6IiwgY2xhc3MoZCksICJcbiIsICAjIExvZ2ljYWwNCiAgIlRpcGUgZGF0YSBlOiIsIGNsYXNzKGUpLCAiXG4iLCAgIyBOdW1lcmljDQogICJUaXBlIGRhdGEgZjoiLCBjbGFzcyhmKSwgIlxuIiAgICMgTGlzdA0KKQ0KYGBgDQoNCiMjICoqQi4gVmFyaWFiZWwgZGFuIE1hbmlwdWxhc2kgRGF0YSoqDQoNCiMjIyAqKjEuIE1lbmdpZGVudGlmaWthc2kgVmFyaWFiZWwga2UgZGFsYW0gUioqDQoNCioqeCoqOiAkMjAkDQoNCioqeSoqOiAkNSQNCg0KKip0ZXh0MSoqOiAkRGF0YSQNCg0KKip0ZXh0MioqOiAkU2NpZW5jZSQNCg0KLSBNZW1wZXJiYXJ1aSBuaWxhaSAkeCQgZGVuZ2FuIG1lbmFtYmFoa2FuICQxMCQuDQotIE1lbmdnYWJ1bmdrYW4gJHRleHQxJCBkYW4gJHRleHQyJCBrZSBkYWxhbSBrYXRhICoqRGF0YSBTY2llbmNlKiouDQotIE1lbmd1YmFoIHRla3MgZ2FidW5nYW4gbWVuamFkaSBodXJ1ZiBiZXNhci4NCmBgYHtyIGVjaG89VFJVRX0NCiMgRGVmaW5pc2kgdmFyaWFiZWwNCnggPC0gMjANCnkgPC0gNQ0KdGV4dDEgPC0gIkRhdGEiDQp0ZXh0MiA8LSAiU2NpZW5jZSINCg0KIyBPcGVyYXNpIHBhZGEgdmFyaWFiZWwNCnggPC0geCArIDEwICAjIE1lbmFtYmFoIDEwIGtlIHgNCm1lcmdlZF90ZXh0IDwtIHBhc3RlMCh0ZXh0MSwgIiAiLCB0ZXh0MikgICMgTWVuZ2dhYnVuZ2thbiB0ZWtzIHRhbnBhIHNlcA0KY2FwaXRhbGl6ZWRfdGV4dCA8LSB0b3VwcGVyKG1lcmdlZF90ZXh0KSAgIyBLb252ZXJzaSBrZSBodXJ1ZiBiZXNhcg0KDQojIE1lbmFtcGlsa2FuIGhhc2lsDQpjYXQoDQogIHNwcmludGYoIk5pbGFpIHggZGl0YW1iYWggMTA6ICVkXG4iLCB4KSwNCiAgc3ByaW50ZigiVGVrcyBnYWJ1bmdhbjogJXNcbiIsIG1lcmdlZF90ZXh0KSwNCiAgc3ByaW50ZigiVGVrcyBkYWxhbSBodXJ1ZiBiZXNhcjogJXNcbiIsIGNhcGl0YWxpemVkX3RleHQpDQopDQpgYGANCg0KIyMgKipDLiBPcGVyYXNpIEFyaXRtYXRpa2EqKg0KDQoqKlZhcmlhYmVsLXZhcmlhYmVsKioNCg0KKiphKiogOiAkMTUkDQoNCioqYioqIDogJDQkDQoNCi0gTWVuZ2hpdHVuZyBqdW1sYWgsIHNlbGlzaWgsIHBlcmthbGlhbiwgcGVtYmFnaWFuLCBkYW4gbW9kdWxvIGRhcmkgKiphKiogZGFuICoqYioqLg0KLSBNZW5naGl0dW5nICoqYSoqIHBhbmdrYXQgKipiKioNCi0gTWVtYnVhdCB2YXJpYWJlbCBiYXJ1ICoqYyA9IGEvYioqIHViYWggbWVuamFkaSBpbnRlZ2VyLg0KYGBge3IgZWNobz1UUlVFfQ0KIyBNZW5kZWZpbmlzaWthbiB2YXJpYWJlbA0KYSA8LSAxNQ0KYiA8LSA0DQoNCiMgMS4gSGl0dW5nIG9wZXJhc2kgYXJpdG1hdGlrYSBkYXNhcg0KanVtbGFoIDwtIGEgKyBiICAgICAgICAjIFBlbmp1bWxhaGFuDQpzZWxpc2loIDwtIGEgLSBiICAgICAgICMgUGVuZ3VyYW5nYW4NCnByb2R1ayA8LSBhICogYiAgICAgICAgIyBQZXJrYWxpYW4NCnBlbWJhZ2lhbiA8LSBhIC8gYiAgICAgIyBQZW1iYWdpYW4NCm1vZHVsbyA8LSBhICUlIGIgICAgICAgIyBTaXNhIHBlbWJhZ2lhbg0KDQojIDIuIEhpdHVuZyBhIHBhbmdrYXQgYg0KcGFuZ2thdCA8LSBhXmINCg0KIyAzLiBCdWF0IHZhcmlhYmVsIGJhcnUgYyBkYW4gdWJhaCBtZW5qYWRpIGludGVnZXINCmMgPC0gYXMuaW50ZWdlcihhIC8gYikNCg0KIyBNZW5hbXBpbGthbiBoYXNpbA0KY2F0KA0KICAiSGFzaWwgUGVuanVtbGFoYW46IiwganVtbGFoLCAiXG4iLA0KICAiSGFzaWwgUGVuZ3VyYW5nYW46Iiwgc2VsaXNpaCwgIlxuIiwNCiAgIkhhc2lsIFBlcmthbGlhbjoiLCBwcm9kdWssICJcbiIsDQogICJIYXNpbCBQZW1iYWdpYW46IiwgcGVtYmFnaWFuLCAiXG4iLA0KICAiSGFzaWwgTW9kdWxvOiIsIG1vZHVsbywgIlxuIiwNCiAgIkhhc2lsIFBhbmdrYXQ6IiwgcGFuZ2thdCwgIlxuIiwNCiAgIk5pbGFpIGMgc2ViYWdhaSBpbnRlZ2VyOiIsIGMsICJcbiINCikNCmBgYA0KDQojIyAqKkQuIE9wZXJhc2kgU3RyaW5nKioNCg0KKipUZXh0KiogOiAqKkhlbGxvLCBEYXRhIFNjaWVuY2UhKioNCg0KLSBFa3N0cmFrICQ1JCBrYXJha3RlciBwZXJ0YW1hIGRhcmkgdGVrcy4NCi0gTWVuZ2hpdHVuZyBqdW1sYWgga2FyYWt0ZXIgZGFsYW0gdGVrcy4NCi0gTWVuZ3ViYWggdGVrcyBtZW5qYWRpIGh1cnVmIGtlY2lsLg0KDQpgYGB7ciBlY2hvPVRSVUV9DQojIE1lbmRlZmluaXNpa2FuIHN0cmluZw0KdGVrcyA8LSAiSGVsbG8sIERhdGEgU2NpZW5jZSEiDQoNCiMgT3BlcmFzaSBzdHJpbmcNCmxpbWFfa2FyYWt0ZXJfcGVydGFtYSA8LSBzdWJzdHIodGVrcywgc3RhcnQgPSAxLCBzdG9wID0gNSkgIyBNZW5nYW1iaWwgNSBrYXJha3RlciBwZXJ0YW1hDQpwYW5qYW5nX3Rla3MgPC0gbmNoYXIodGVrcykgIyBNZW5naGl0dW5nIHRvdGFsIGthcmFrdGVyDQp0ZWtzX2xvd2VyIDwtIHRvbG93ZXIodGVrcykgIyBNZW5nb252ZXJzaSB0ZWtzIG1lbmphZGkgaHVydWYga2VjaWwNCg0KIyBNZW5hbXBpbGthbiBoYXNpbA0KY2F0KA0KICAiTGltYSBrYXJha3RlciBwZXJ0YW1hOiIsIGxpbWFfa2FyYWt0ZXJfcGVydGFtYSwgIlxuIiwNCiAgIlRvdGFsIGp1bWxhaCBrYXJha3RlcjoiLCBwYW5qYW5nX3Rla3MsICJcbiIsDQogICJUZWtzIGRhbGFtIGJlbnR1ayBrZWNpbDoiLCB0ZWtzX2xvd2VyLCAiXG4iDQopDQpgYGANCg0KIyMgKipFLiBPcGVyYXRvciBQZXJiYW5kaW5nYW4gZGFuIExvZ2lrYSoqDQoNCk1lbmdpbmdhdCB2YXJpYWJlbC12YXJpYWJlbCBiZXJpa3V0Og0KDQoqKngqKjogJDckDQoNCioqeSoqIDogJDEwJA0KDQotIFBlcmlrc2EgYXBha2FoICoqeCoqIGxlYmloIGJlc2FyIGRhcmkgKip5KiouDQotIFBlcmlrc2EgYXBha2FoICoqeCoqIGt1cmFuZyBkYXJpIGF0YXUgc2FtYSBkZW5nYW4gKip5KiouDQotIFBlcmlrc2EgYXBha2FoICoqeCoqIHRpZGFrICoqc2FtYSBkZW5nYW4qKiAqKnkqKi4NCi0gRXZhbHVhc2lsYWggZWtzcHJlc2kgKiooeCA+IDUpIEFORCAoeSA8IDIwKSoqLg0KDQpgYGB7ciBlY2hvPVRSVUV9DQojIE1lbmRlZmluaXNpa2FuIHZhcmlhYmVsDQp4IDwtIDcNCnkgPC0gMTANCg0KIyBPcGVyYXNpIHBlcmJhbmRpbmdhbg0KbGViaWhfYmVzYXIgPC0geCA+IHkgICMgQXBha2FoIHggbGViaWggYmVzYXIgZGFyaSB5Pw0Ka3VyYW5nX3NhbWEgPC0geCA8PSB5ICMgQXBha2FoIHgga3VyYW5nIGRhcmkgYXRhdSBzYW1hIGRlbmdhbiB5Pw0KdGlkYWtfc2FtYSA8LSB4ICE9IHkgICMgQXBha2FoIHggdGlkYWsgc2FtYSBkZW5nYW4geT8NCg0KIyBPcGVyYXNpIGxvZ2lrYQ0KbG9naWthX2FuZCA8LSAoeCA+IDUpICYgKHkgPCAyMCkgICMgRXZhbHVhc2kgZWtzcHJlc2kgKHggPiA1KSBBTkQgKHkgPCAyMCkNCg0KIyBNZW5hbXBpbGthbiBoYXNpbA0KY2F0KA0KICAiQXBha2FoIHggbGViaWggYmVzYXIgZGFyaSB5PzoiLCBsZWJpaF9iZXNhciwgIlxuIiwNCiAgIkFwYWthaCB4IGt1cmFuZyBkYXJpIGF0YXUgc2FtYSBkZW5nYW4geT86Iiwga3VyYW5nX3NhbWEsICJcbiIsDQogICJBcGFrYWggeCB0aWRhayBzYW1hIGRlbmdhbiB5PzoiLCB0aWRha19zYW1hLCAiXG4iLA0KICAiRXZhbHVhc2kgKHggPiA1KSBBTkQgKHkgPCAyMCk6IiwgbG9naWthX2FuZCwgIlxuIg0KKQ0KYGBgDQoNCiMjICoqRi4gS29udmVyc2kgVGlwZSBEYXRhKioNCg0KKipudW1fc3RyKiogOiAkMTIzJA0KDQoqKm51bV9mbG9hdCoqIDogJDQ1LjY3JA0KDQotIFViYWggKipudW1fc3RyKioga2UgYmlsYW5nYW4gZGFuIHRhbWJhaGthbiAkMTAkLg0KLSBVYmFoICoqbnVtX2Zsb2F0Kioga2UgYmlsYW5nYW4gYnVsYXQuDQotIE1lbmdvbnZlcnNpICoqbnVtX2Zsb2F0Kioga2VtYmFsaSBtZW5qYWRpIHN0cmluZy4NCg0KYGBge3IgZWNobz1UUlVFfQ0KIyBNZW5kZWZpbmlzaWthbiB2YXJpYWJlbA0KbnVtX3N0ciA8LSAiMTIzIg0KbnVtX2Zsb2F0IDwtIDQ1LjY3DQoNCiMgS29udmVyc2kgZGFuIG9wZXJhc2kNCm51bV9zdHJfa2VfYmlsYW5nYW4gPC0gYXMubnVtZXJpYyhudW1fc3RyKSArIDEwICAjIFViYWggbnVtX3N0ciBrZSBiaWxhbmdhbiBkYW4gdGFtYmFoa2FuIDEwDQpudW1fZmxvYXRfa2VfYnVsYXQgPC0gYXMuaW50ZWdlcihudW1fZmxvYXQpICAgICAgIyBVYmFoIG51bV9mbG9hdCBrZSBiaWxhbmdhbiBidWxhdA0KbnVtX2Zsb2F0X2tlX3N0cmluZyA8LSBhcy5jaGFyYWN0ZXIobnVtX2Zsb2F0KSAgICMgVWJhaCBudW1fZmxvYXQga2VtYmFsaSBrZSBzdHJpbmcNCg0KIyBNZW5hbXBpbGthbiBoYXNpbA0KY2F0KA0KICAiSGFzaWwga29udmVyc2kgbnVtX3N0ciBrZSBiaWxhbmdhbiBkYW4gZGl0YW1iYWggMTA6IiwgbnVtX3N0cl9rZV9iaWxhbmdhbiwgIlxuIiwNCiAgIkhhc2lsIGtvbnZlcnNpIG51bV9mbG9hdCBrZSBiaWxhbmdhbiBidWxhdDoiLCBudW1fZmxvYXRfa2VfYnVsYXQsICJcbiIsDQogICJIYXNpbCBrb252ZXJzaSBudW1fZmxvYXQga2Ugc3RyaW5nOiIsIG51bV9mbG9hdF9rZV9zdHJpbmcsICJcbiINCikNCmBgYA0KDQojIyAqKkcuIFRhbnRhbmdhbiBCb251cyoqDQoNCkJ1YXQgcHJvZ3JhbSBpbnRlcmFrdGlmIHlhbmcgbWVtaW50YSBwZW5nZ3VuYSB1bnR1ayBtZW1hc3Vra2FuOg0KDQotIE5hbWENCi0gVXNpYQ0KLSBLb3RhIGtlbGFoaXJhbg0KDQpLZW11ZGlhbiwgY2V0YWsgb3V0cHV0IHNlYmFnYWkgYmVyaWt1dDoNCg0KKipIZWxsbyBbTmFtZV0sIHlvdSBhcmUgW0FnZV0geWVhcnMgb2xkIGFuZCBmcm9tIFtIb21ldG93bl0qKi4NCg0KYGBge3IgZWNobz1UUlVFfQ0KIyBDZWdhaCBlcnJvciBqaWthIGRpamFsYW5rYW4gbGFuZ3N1bmcgdGFucGEgcGFyYW1zDQppZiAoIWV4aXN0cygicGFyYW1zIikpIHsNCiAgcGFyYW1zIDwtIGxpc3QobmFtZSA9ICJEZWZhdWx0IE5hYmlsYSIsIGFnZSA9IDE5LCBob21ldG93biA9ICJSaWF1IikNCn0NCg0KIyBHdW5ha2FuIHBhcmFtcw0KbmFtZSA8LSBwYXJhbXMkbmFtZQ0KYWdlIDwtIHBhcmFtcyRhZ2UNCmhvbWV0b3duIDwtIHBhcmFtcyRob21ldG93bg0KDQpjYXQoIkhlbGxvIiwgbmFtZSwgIiwgeW91IGFyZSIsIGFnZSwgInllYXJzIG9sZCBhbmQgZnJvbSIsIGhvbWV0b3duLCAiXG4iKQ0KYGBg