Email             :
RPubs            : https://rpubs.com/dhelaasafiani
Jurusan          : Statistika Bisnis
Address         : ARA Center, Matana University Tower
                         Jl. CBD Barat Kav, RT.1, Curug Sangereng, Kelapa Dua, Tangerang, Banten 15810.


1 R Vs. Python

R dan Python adalah bahasa pemrograman yang sangat populer, dinamis, digunakan secara luas dalam komunitas data science. R lebih banyak digunakan dalam analisis statistik sementara Python menyediakan pendekatan yang lebih umum mengenai sains data (sehingga dianggap lebih mudah untuk digunakan oleh pemula). Mempelajari kedua bahasa pemrograman ini adalah solusi yang lebih bijak karena keduanya mempunyai kelebihan dan kekurangan masing-masing. R dan Python membutuhkan investasi waktu, latihan dengan tutorial, dan melakukan projek-projek kecil berbasis LAB hingga penerapan sais data pada kasus-kasus yang sebenarnya.

2 Sintaks Dasar

Syntax adalah sebuah aturan yang digunakan untuk menulis kalimat agar mampu dimengerti oleh bahasa pemrograman. Dalam pembuatannya, seluruh aturan syntax harus terpenuhi. Karena ketika proses kompilasi setiap barus script akan dilakukan pengecekan. Jika terdapat syntax yang salah maka compiler akan melaporan terjadinya error massage dan tidak akan meneruskan pembuatan bytecodenya.

3 Operator

Operator merupakan simbol-simbol yang digunkan untuk memanipulasi sebuah data dalam pemrograman, seperti pembagian, penambahan, pengurangan dan lain sebagainya.

3.1 Aritmatika

3.1.1 Penjumlahan

Berikut ini adalah contoh operasi penjumlahan di R

8 -> a                # Memuat nilai a sama dengan 8
4 -> b                # Memuat nilai b sama dengan 4
a+b -> c              # Memuat nilai c sama dengan hasil penjumlahan dari a dan b
print(c(a,b,c))       # Hasil dari a,b,dan c
## [1]  8  4 12

3.1.2 Pengurangan

Berikut ini adalah contoh operasi pengurangan di R

63 -> a               # Memuat nilai a sama dengan 63
29 -> b               # Memuat nilai b sama dengan 29
13 -> c               # Memuat nilai c sama dengan 13
print(a-b-c)          # Hasil dari pengurangan a,b,dan c
## [1] 21

3.1.3 Perkalian

Berikut ini adalah contoh operasi perkalian di R

14 -> a               # Memuat nilai a sama dengan 14
3 -> b                # Memuat nilai b sama dengan 3
2 -> c                # Memuat nilai c sama dengan 2
print(a*b*c)          # Hasil dari perkalian a,b,dan c
## [1] 84

3.1.4 Pembagian

Berikut ini adalah contoh operasi pembagian di R

72 -> a               # Memuat nilai a sama dengan 72
8 -> b                # Memuat nilai b sama dengan 8
3 -> c                # Memuat nilai c sama dengan 3
print(a/b/c)          # Hasil dari pembagian a,b,dan c
## [1] 3

3.1.5 Pemangkatan

Berikut ini adalah contoh operasi pemangkatan di R

6 -> a                # Memuat nilai a sama dengan 6
3 -> b                # Memuat nilai b sama dengan 3
print(a^b)            # Hasil dari pemangkatan a dengan b
## [1] 216

3.1.6 Modulo

Berikut ini adalah contoh operasi modulo di R

9 -> a                # Memuat nilai a sama dengan 9
2 -> b                # Memuat nilai b sama dengan 2
print(a%%b)           # Hasil modulo dari a dan b
## [1] 1

3.2 Relasional

x <- c(8,2,6)         # Memuat vektor dari x
y <- c(5,3,6)         # Memuat vektor dari y

# Memuat hasil operasi relasional di R
cat("Vektor x kurang dari Vektor y:", x < y )
## Vektor x kurang dari Vektor y: FALSE TRUE FALSE
cat("Vektor x kurang dari sama dengan Vektor y:", x <= y )
## Vektor x kurang dari sama dengan Vektor y: FALSE TRUE TRUE
cat("Vektor x lebih besar dari Vektor y:", x > y )
## Vektor x lebih besar dari Vektor y: TRUE FALSE FALSE
cat("Vektor x lebih besar sama dengan Vektor y:", x >= y )
## Vektor x lebih besar sama dengan Vektor y: TRUE FALSE TRUE
cat("Vektor x sama dengan Vektor y:", x == y )
## Vektor x sama dengan Vektor y: FALSE FALSE TRUE
cat("Vektor x tidak sama dengan Vektor y:", x != y )
## Vektor x tidak sama dengan Vektor y: TRUE TRUE FALSE

3.3 Logika

x = c(0,0,FALSE)
y = c(TRUE,FALSE,4+3i)

# Memuat hasil operasi logika di R
cat("Logika Negasi (~) untuk Vektor X:", !x )
## Logika Negasi (~) untuk Vektor X: TRUE TRUE TRUE
cat("Logika Negasi (~) untuk Vektor y:", !y )
## Logika Negasi (~) untuk Vektor y: FALSE TRUE FALSE
cat("Logika Konjungsi (Dan):", (9 < 10) & (24 < 30) )
## Logika Konjungsi (Dan): TRUE
cat("Logika Disjungsi (Atau):", (3 + 11) > (16-9) | (14 - 7) < (6 + 9) )
## Logika Disjungsi (Atau): TRUE
cat("Logika Disjungsi Parsial:", (7 == 2) || (33 <= 15) )
## Logika Disjungsi Parsial: FALSE

3.4 Lain-lain

x <- c(2,8,7)                # Memuat nilai Vektor x
y <- c(9,3,6)                # Memuat nilai Vektor y
sqrt(x*y)                    # Merupakan bentuk akar
## [1] 4.242641 4.898979 6.480741
log(x)                       # Bentuk logaritma x
## [1] 0.6931472 2.0794415 1.9459101
log(y)                       # Bentuk logaritma y
## [1] 2.197225 1.098612 1.791759
exp(x)                       # Bentuk eksponen x
## [1]    7.389056 2980.957987 1096.633158
exp(y)                       # Bentuk eksponen y
## [1] 8103.08393   20.08554  403.42879
(x/y) + y                    # Tanda kurung 
## [1] 9.222222 5.666667 7.166667

4 Tipe Data

d1 = 5.6                     # Tetapkan nilai desimal
d2 = as.integer(5)           # Tetapkan nilai integer
d2 = 5L                      # Cara lain untuk memuat nilai integer di R
d3 = c(TRUE,FALSE)           # Bolean/Logical
d3 = as.logical(c(0,1))      # Cara lain memuat bolean/logical
d4 = c("a",'b','123')        # String/Character
d5 = 1 + 5i                  # Complex

Untuk memeriksa tipe data dalam R

class(d1)
## [1] "numeric"
typeof(d1)
## [1] "double"
LS0tDQp0aXRsZTogIlRVR0FTIDIiDQpzdWJ0aXRsZTogIkFsZ29yaXRtYSBkYW4gU3RydWt0dXIgRGF0YSINCmF1dGhvcjogIkRoZWxhIEFzYWZpYW5pIEFnYXRoYSAoMjAyMTQ5MjAwMDkpIg0KZGF0ZTogImByIGZvcm1hdChTeXMuRGF0ZSgpLCAnJUIgJWQsICVZJylgIg0Kb3V0cHV0OiANCiAgaHRtbF9kb2N1bWVudDogDQogICAgaHRtbF9kb2N1bWVudDogbnVsbA0KICAgIGNvZGVfZm9sZGluZzogaGlkZQ0KICAgIHRvYzogeWVzDQogICAgdG9jX2Zsb2F0Og0KICAgICAgY29sbGFwc2VkOiB5ZXMNCiAgICBudW1iZXJfc2VjdGlvbnM6IHllcw0KICAgIGNvZGVfZG93bmxvYWQ6IHllcw0KICAgIHRoZW1lOiBzYW5kc3RvbmUNCiAgICBjc3M6IHN0eWxlMS5jc3MNCiAgICBoaWdobGlnaHQ6IG1vbm9jaHJvbWUNCi0tLQ0KDQoNCjxpbWcgc3R5bGU9ImZsb2F0OiByaWdodDsgbWFyZ2luOiAwcHggMTAwcHggMHB4IDBweDsgd2lkdGg6MjUlIiBzcmM9ImRlbGEucG5nIi8+IA0KDQpgYGB7ciBsb2dvLCBlY2hvPUZBTFNFLCBmaWcuYWxpZ249J2NlbnRlcicsIG91dC53aWR0aD0gJzMwJSd9DQprbml0cjo6aW5jbHVkZV9ncmFwaGljcygibG9nby5wbmciKQ0KYGBgDQoNCkVtYWlsICZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyZuYnNwOzogIGRoZWxhYWdhdGhhQGdtYWlsLmNvbSA8YnI+DQpSUHVicyAgJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7OiBodHRwczovL3JwdWJzLmNvbS9kaGVsYWFzYWZpYW5pIDxicj4NCkp1cnVzYW4gJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOzogW1N0YXRpc3Rpa2EgQmlzbmlzXShodHRwczovL21hdGFuYXVuaXZlcnNpdHkuYWMuaWQvP2x5PWFjYWRlbWljJmM9c2IpIDxicj4NCkFkZHJlc3MgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7IDogQVJBIENlbnRlciwgTWF0YW5hIFVuaXZlcnNpdHkgVG93ZXIgPGJyPg0KJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsmbmJzcDsgSmwuIENCRCBCYXJhdCBLYXYsIFJULjEsIEN1cnVnIFNhbmdlcmVuZywgS2VsYXBhIER1YSwgVGFuZ2VyYW5nLCBCYW50ZW4gMTU4MTAuDQoNCioqKioNCg0KIyBSIFZzLiBQeXRob24NCg0KUiBkYW4gUHl0aG9uIGFkYWxhaCBiYWhhc2EgcGVtcm9ncmFtYW4geWFuZyBzYW5nYXQgcG9wdWxlciwgZGluYW1pcywgZGlndW5ha2FuIHNlY2FyYSBsdWFzIGRhbGFtIGtvbXVuaXRhcyBkYXRhIHNjaWVuY2UuIFIgbGViaWggYmFueWFrIGRpZ3VuYWthbiBkYWxhbSBhbmFsaXNpcyBzdGF0aXN0aWsgc2VtZW50YXJhIFB5dGhvbiBtZW55ZWRpYWthbiBwZW5kZWthdGFuIHlhbmcgbGViaWggdW11bSBtZW5nZW5haSBzYWlucyBkYXRhIChzZWhpbmdnYSBkaWFuZ2dhcCBsZWJpaCBtdWRhaCB1bnR1ayBkaWd1bmFrYW4gb2xlaCBwZW11bGEpLiBNZW1wZWxhamFyaSBrZWR1YSBiYWhhc2EgcGVtcm9ncmFtYW4gaW5pIGFkYWxhaCBzb2x1c2kgeWFuZyBsZWJpaCBiaWphayBrYXJlbmEga2VkdWFueWEgbWVtcHVueWFpIGtlbGViaWhhbiBkYW4ga2VrdXJhbmdhbiBtYXNpbmctbWFzaW5nLiBSIGRhbiBQeXRob24gbWVtYnV0dWhrYW4gaW52ZXN0YXNpIHdha3R1LCBsYXRpaGFuIGRlbmdhbiB0dXRvcmlhbCwgZGFuIG1lbGFrdWthbiBwcm9qZWstcHJvamVrIGtlY2lsIGJlcmJhc2lzIExBQiBoaW5nZ2EgcGVuZXJhcGFuIHNhaXMgZGF0YSBwYWRhIGthc3VzLWthc3VzIHlhbmcgc2ViZW5hcm55YS4NCg0KIyBTaW50YWtzIERhc2FyDQoNClN5bnRheCBhZGFsYWggc2VidWFoIGF0dXJhbiB5YW5nIGRpZ3VuYWthbiB1bnR1ayBtZW51bGlzIGthbGltYXQgYWdhciBtYW1wdSBkaW1lbmdlcnRpIG9sZWggYmFoYXNhIHBlbXJvZ3JhbWFuLiBEYWxhbSBwZW1idWF0YW5ueWEsIHNlbHVydWggYXR1cmFuIHN5bnRheCBoYXJ1cyB0ZXJwZW51aGkuIEthcmVuYSBrZXRpa2EgcHJvc2VzIGtvbXBpbGFzaSBzZXRpYXAgYmFydXMgc2NyaXB0IGFrYW4gZGlsYWt1a2FuIHBlbmdlY2VrYW4uIEppa2EgdGVyZGFwYXQgc3ludGF4IHlhbmcgc2FsYWggbWFrYSBjb21waWxlciBha2FuIG1lbGFwb3JhbiB0ZXJqYWRpbnlhIGVycm9yIG1hc3NhZ2UgZGFuIHRpZGFrIGFrYW4gbWVuZXJ1c2thbiBwZW1idWF0YW4gYnl0ZWNvZGVueWEuDQoNCiMgT3BlcmF0b3INCg0KT3BlcmF0b3IgbWVydXBha2FuIHNpbWJvbC1zaW1ib2wgeWFuZyBkaWd1bmthbiB1bnR1ayBtZW1hbmlwdWxhc2kgc2VidWFoIGRhdGEgZGFsYW0gcGVtcm9ncmFtYW4sIHNlcGVydGkgcGVtYmFnaWFuLCBwZW5hbWJhaGFuLCBwZW5ndXJhbmdhbiBkYW4gbGFpbiBzZWJhZ2FpbnlhLg0KDQojIyBBcml0bWF0aWthDQoNCiMjIyBQZW5qdW1sYWhhbg0KDQpCZXJpa3V0IGluaSBhZGFsYWggY29udG9oIG9wZXJhc2kgcGVuanVtbGFoYW4gZGkgUg0KDQpgYGB7cn0NCjggLT4gYSAgICAgICAgICAgICAgICAjIE1lbXVhdCBuaWxhaSBhIHNhbWEgZGVuZ2FuIDgNCjQgLT4gYiAgICAgICAgICAgICAgICAjIE1lbXVhdCBuaWxhaSBiIHNhbWEgZGVuZ2FuIDQNCmErYiAtPiBjICAgICAgICAgICAgICAjIE1lbXVhdCBuaWxhaSBjIHNhbWEgZGVuZ2FuIGhhc2lsIHBlbmp1bWxhaGFuIGRhcmkgYSBkYW4gYg0KcHJpbnQoYyhhLGIsYykpICAgICAgICMgSGFzaWwgZGFyaSBhLGIsZGFuIGMNCmBgYA0KDQojIyMgUGVuZ3VyYW5nYW4NCg0KQmVyaWt1dCBpbmkgYWRhbGFoIGNvbnRvaCBvcGVyYXNpIHBlbmd1cmFuZ2FuIGRpIFINCg0KYGBge3J9DQo2MyAtPiBhICAgICAgICAgICAgICAgIyBNZW11YXQgbmlsYWkgYSBzYW1hIGRlbmdhbiA2Mw0KMjkgLT4gYiAgICAgICAgICAgICAgICMgTWVtdWF0IG5pbGFpIGIgc2FtYSBkZW5nYW4gMjkNCjEzIC0+IGMgICAgICAgICAgICAgICAjIE1lbXVhdCBuaWxhaSBjIHNhbWEgZGVuZ2FuIDEzDQpwcmludChhLWItYykgICAgICAgICAgIyBIYXNpbCBkYXJpIHBlbmd1cmFuZ2FuIGEsYixkYW4gYw0KYGBgDQoNCiMjIyBQZXJrYWxpYW4NCg0KQmVyaWt1dCBpbmkgYWRhbGFoIGNvbnRvaCBvcGVyYXNpIHBlcmthbGlhbiBkaSBSDQoNCmBgYHtyfQ0KMTQgLT4gYSAgICAgICAgICAgICAgICMgTWVtdWF0IG5pbGFpIGEgc2FtYSBkZW5nYW4gMTQNCjMgLT4gYiAgICAgICAgICAgICAgICAjIE1lbXVhdCBuaWxhaSBiIHNhbWEgZGVuZ2FuIDMNCjIgLT4gYyAgICAgICAgICAgICAgICAjIE1lbXVhdCBuaWxhaSBjIHNhbWEgZGVuZ2FuIDINCnByaW50KGEqYipjKSAgICAgICAgICAjIEhhc2lsIGRhcmkgcGVya2FsaWFuIGEsYixkYW4gYw0KYGBgDQoNCiMjIyBQZW1iYWdpYW4NCg0KDQpCZXJpa3V0IGluaSBhZGFsYWggY29udG9oIG9wZXJhc2kgcGVtYmFnaWFuIGRpIFINCg0KYGBge3J9DQo3MiAtPiBhICAgICAgICAgICAgICAgIyBNZW11YXQgbmlsYWkgYSBzYW1hIGRlbmdhbiA3Mg0KOCAtPiBiICAgICAgICAgICAgICAgICMgTWVtdWF0IG5pbGFpIGIgc2FtYSBkZW5nYW4gOA0KMyAtPiBjICAgICAgICAgICAgICAgICMgTWVtdWF0IG5pbGFpIGMgc2FtYSBkZW5nYW4gMw0KcHJpbnQoYS9iL2MpICAgICAgICAgICMgSGFzaWwgZGFyaSBwZW1iYWdpYW4gYSxiLGRhbiBjDQpgYGANCg0KIyMjIFBlbWFuZ2thdGFuDQoNCkJlcmlrdXQgaW5pIGFkYWxhaCBjb250b2ggb3BlcmFzaSBwZW1hbmdrYXRhbiBkaSBSDQoNCmBgYHtyfQ0KNiAtPiBhICAgICAgICAgICAgICAgICMgTWVtdWF0IG5pbGFpIGEgc2FtYSBkZW5nYW4gNg0KMyAtPiBiICAgICAgICAgICAgICAgICMgTWVtdWF0IG5pbGFpIGIgc2FtYSBkZW5nYW4gMw0KcHJpbnQoYV5iKSAgICAgICAgICAgICMgSGFzaWwgZGFyaSBwZW1hbmdrYXRhbiBhIGRlbmdhbiBiDQpgYGANCg0KIyMjIE1vZHVsbw0KDQpCZXJpa3V0IGluaSBhZGFsYWggY29udG9oIG9wZXJhc2kgbW9kdWxvIGRpIFINCg0KYGBge3J9DQo5IC0+IGEgICAgICAgICAgICAgICAgIyBNZW11YXQgbmlsYWkgYSBzYW1hIGRlbmdhbiA5DQoyIC0+IGIgICAgICAgICAgICAgICAgIyBNZW11YXQgbmlsYWkgYiBzYW1hIGRlbmdhbiAyDQpwcmludChhJSViKSAgICAgICAgICAgIyBIYXNpbCBtb2R1bG8gZGFyaSBhIGRhbiBiDQpgYGANCg0KDQojIyBSZWxhc2lvbmFsDQoNCmBgYHtyfQ0KeCA8LSBjKDgsMiw2KSAgICAgICAgICMgTWVtdWF0IHZla3RvciBkYXJpIHgNCnkgPC0gYyg1LDMsNikgICAgICAgICAjIE1lbXVhdCB2ZWt0b3IgZGFyaSB5DQoNCiMgTWVtdWF0IGhhc2lsIG9wZXJhc2kgcmVsYXNpb25hbCBkaSBSDQpjYXQoIlZla3RvciB4IGt1cmFuZyBkYXJpIFZla3RvciB5OiIsIHggPCB5ICkNCmBgYA0KYGBge3J9DQpjYXQoIlZla3RvciB4IGt1cmFuZyBkYXJpIHNhbWEgZGVuZ2FuIFZla3RvciB5OiIsIHggPD0geSApDQpgYGANCmBgYHtyfQ0KY2F0KCJWZWt0b3IgeCBsZWJpaCBiZXNhciBkYXJpIFZla3RvciB5OiIsIHggPiB5ICkNCmBgYA0KYGBge3J9DQpjYXQoIlZla3RvciB4IGxlYmloIGJlc2FyIHNhbWEgZGVuZ2FuIFZla3RvciB5OiIsIHggPj0geSApDQpgYGANCmBgYHtyfQ0KY2F0KCJWZWt0b3IgeCBzYW1hIGRlbmdhbiBWZWt0b3IgeToiLCB4ID09IHkgKQ0KYGBgDQpgYGB7cn0NCmNhdCgiVmVrdG9yIHggdGlkYWsgc2FtYSBkZW5nYW4gVmVrdG9yIHk6IiwgeCAhPSB5ICkNCmBgYA0KIyMgTG9naWthDQoNCmBgYHtyfQ0KeCA9IGMoMCwwLEZBTFNFKQ0KeSA9IGMoVFJVRSxGQUxTRSw0KzNpKQ0KDQojIE1lbXVhdCBoYXNpbCBvcGVyYXNpIGxvZ2lrYSBkaSBSDQpjYXQoIkxvZ2lrYSBOZWdhc2kgKH4pIHVudHVrIFZla3RvciBYOiIsICF4ICkNCmBgYA0KYGBge3J9DQpjYXQoIkxvZ2lrYSBOZWdhc2kgKH4pIHVudHVrIFZla3RvciB5OiIsICF5ICkNCmBgYA0KDQpgYGB7cn0NCmNhdCgiTG9naWthIEtvbmp1bmdzaSAoRGFuKToiLCAoOSA8IDEwKSAmICgyNCA8IDMwKSApDQpgYGANCmBgYHtyfQ0KY2F0KCJMb2dpa2EgRGlzanVuZ3NpIChBdGF1KToiLCAoMyArIDExKSA+ICgxNi05KSB8ICgxNCAtIDcpIDwgKDYgKyA5KSApDQpgYGANCmBgYHtyfQ0KY2F0KCJMb2dpa2EgRGlzanVuZ3NpIFBhcnNpYWw6IiwgKDcgPT0gMikgfHwgKDMzIDw9IDE1KSApDQpgYGANCiMjIExhaW4tbGFpbg0KDQpgYGB7cn0NCnggPC0gYygyLDgsNykgICAgICAgICAgICAgICAgIyBNZW11YXQgbmlsYWkgVmVrdG9yIHgNCnkgPC0gYyg5LDMsNikgICAgICAgICAgICAgICAgIyBNZW11YXQgbmlsYWkgVmVrdG9yIHkNCnNxcnQoeCp5KSAgICAgICAgICAgICAgICAgICAgIyBNZXJ1cGFrYW4gYmVudHVrIGFrYXINCg0KYGBgIA0KYGBge3J9DQpsb2coeCkgICAgICAgICAgICAgICAgICAgICAgICMgQmVudHVrIGxvZ2FyaXRtYSB4DQpgYGANCmBgYHtyfQ0KbG9nKHkpICAgICAgICAgICAgICAgICAgICAgICAjIEJlbnR1ayBsb2dhcml0bWEgeQ0KYGBgDQpgYGB7cn0NCmV4cCh4KSAgICAgICAgICAgICAgICAgICAgICAgIyBCZW50dWsgZWtzcG9uZW4geA0KYGBgDQpgYGB7cn0NCmV4cCh5KSAgICAgICAgICAgICAgICAgICAgICAgIyBCZW50dWsgZWtzcG9uZW4geQ0KYGBgDQpgYGB7cn0NCih4L3kpICsgeSAgICAgICAgICAgICAgICAgICAgIyBUYW5kYSBrdXJ1bmcgDQpgYGANCg0KIyBUaXBlIERhdGENCg0KYGBge3J9DQpkMSA9IDUuNiAgICAgICAgICAgICAgICAgICAgICMgVGV0YXBrYW4gbmlsYWkgZGVzaW1hbA0KZDIgPSBhcy5pbnRlZ2VyKDUpICAgICAgICAgICAjIFRldGFwa2FuIG5pbGFpIGludGVnZXINCmQyID0gNUwgICAgICAgICAgICAgICAgICAgICAgIyBDYXJhIGxhaW4gdW50dWsgbWVtdWF0IG5pbGFpIGludGVnZXIgZGkgUg0KZDMgPSBjKFRSVUUsRkFMU0UpICAgICAgICAgICAjIEJvbGVhbi9Mb2dpY2FsDQpkMyA9IGFzLmxvZ2ljYWwoYygwLDEpKSAgICAgICMgQ2FyYSBsYWluIG1lbXVhdCBib2xlYW4vbG9naWNhbA0KZDQgPSBjKCJhIiwnYicsJzEyMycpICAgICAgICAjIFN0cmluZy9DaGFyYWN0ZXINCmQ1ID0gMSArIDVpICAgICAgICAgICAgICAgICAgIyBDb21wbGV4DQpgYGANCg0KVW50dWsgbWVtZXJpa3NhIHRpcGUgZGF0YSBkYWxhbSBSDQoNCg0KYGBge3J9DQpjbGFzcyhkMSkNCmBgYA0KDQpgYGB7cn0NCnR5cGVvZihkMSkNCmBgYA==