SAMPLING & SURVEY TECHNIQUES

LAPORAN WEB SCRAPING MENGGUNAKAN R

Logo

Pendahuluan

Laporan ini membahas proses web scraping menggunakan bahasa pemrograman R dengan bantuan paket rvest. Tujuan dari laporan ini adalah memberikan panduan praktis bagi pengguna yang belum memiliki pengetahuan mendalam tentang HTML namun ingin mengekstrak data dari situs web secara efisien. Web scraping adalah teknik otomatisasi yang digunakan untuk mengambil informasi dari halaman web dan mengubahnya menjadi data terstruktur. Dengan menggunakan R, pengguna dapat dengan mudah mengakses dan mengolah data yang terkandung dalam berbagai elemen HTML seperti tabel, teks, gambar, dan lainnya. Dalam laporan ini, dibahas langkah-langkah utama yang dilengkapi dengan contoh praktis untuk memudahkan pemahaman.

1. Persiapan Lingkungan di R

Sebelum memulai proses web scraping di R, diperlukan instalasi perangkat dan paket pendukung: - Instalasi R dan RStudio: Pastikan Anda telah mengunduh dan menginstal R dan RStudio di komputer Anda. R adalah bahasa pemrograman yang digunakan untuk analisis data, sedangkan RStudio adalah lingkungan pengembangan terintegrasi (IDE) yang mempermudah penulisan dan eksekusi kode R. - Instalasi Paket: Paket dalam R adalah kumpulan fungsi dan data yang digunakan untuk tugas tertentu. Untuk melakukan web scraping, kita memerlukan paket rvest untuk mengambil dan memproses HTML, serta dplyr untuk manipulasi data. Buka RStudio dan jalankan perintah berikut untuk menginstal paket yang dibutuhkan:

install.packages("rvest")
install.packages("dplyr")
  • Pemanggilan Paket: Setelah instalasi, panggil paket-paket tersebut dalam skrip R Anda untuk mulai menggunakannya:
library(rvest)
library(dplyr)

Memanggil paket berarti mengaktifkan fungsi-fungsi yang tersedia di dalamnya sehingga dapat digunakan dalam skrip Anda.

2. Penggunaan Paket Datapasta untuk Manajemen Data di R

Paket datapasta memudahkan pemformatan dan pengelolaan data di R. Paket ini sangat membantu ketika Anda perlu menyalin data dari sumber eksternal seperti spreadsheet atau tabel web dan mengubahnya menjadi kode R yang dapat langsung dieksekusi. - Instalasi Paket: Jalankan perintah berikut untuk menginstal datapasta:

install.packages("datapasta")
  • Penggunaan Pintasan: Paket ini menyediakan pintasan keyboard yang memungkinkan Anda dengan cepat mengonversi bingkai data dan objek lainnya ke dalam kode R. Misalnya, Anda bisa menyalin data dari Excel dan menggunakan pintasan untuk menempelkannya sebagai data frame di R.

3. Pengikisan Tabel HTML di R

Salah satu tugas dasar dalam web scraping adalah mengekstrak data dari tabel HTML, yang sering ditemukan di halaman web dalam bentuk tabel statistik, daftar produk, atau informasi lainnya. - Identifikasi Situs Web: Pilih situs web yang berisi tabel HTML yang ingin dikumpulkan. Pastikan situs tersebut memiliki izin untuk melakukan web scraping agar menghindari pelanggaran hukum. - Pembacaan HTML: Gunakan kode berikut untuk membaca konten HTML halaman web:

url <- 'http://example.com/table'  # Ganti dengan URL yang relevan
webpage <- read_html(url)

Fungsi read_html() membaca seluruh struktur HTML dari halaman web yang ditentukan. - Ekstraksi Tabel: Gunakan fungsi html_table() untuk mengekstrak tabel dari halaman tersebut:

table <- webpage %>% html_table(fill = TRUE)

Parameter fill = TRUE memastikan tabel tetap terisi meskipun ada sel yang kosong. - Penampilan Tabel: Tampilkan tabel yang telah diekstrak untuk memverifikasi hasilnya:

print(table)

4. Melakukan Perulangan Melalui Beberapa URL

Sering kali data tersebar di beberapa halaman web. Untuk mengumpulkan data dari halaman-halaman tersebut, Anda dapat menggunakan perulangan di R. - Buat Vektor URL: Siapkan daftar URL yang ingin Anda kunjungi:

urls <- c('http://example.com/page1', 'http://example.com/page2')
  • Ulangi URL: Gunakan fungsi lapply() untuk membaca dan mengekstrak data dari masing-masing URL:
results <- lapply(urls, function(url) {
    webpage <- read_html(url)
    table <- webpage %>% html_table(fill = TRUE)
    return(table)
})

Fungsi lapply() menerapkan fungsi yang sama ke setiap elemen dalam vektor urls. - Gabungkan Hasil: Jika diperlukan, gabungkan semua hasil menjadi satu data frame menggunakan fungsi bind_rows() dari paket dplyr:

combined_results <- bind_rows(results)

5. Pemilihan Node HTML dengan Bantuan ChatGPT di R

Kadang-kadang data yang diinginkan tidak terletak dalam tabel melainkan elemen HTML lainnya seperti paragraf, heading, atau div dengan kelas tertentu. - Pemeriksaan HTML: Klik kanan pada elemen yang ingin dikikis dan pilih “Periksa” (Inspect) untuk melihat struktur HTML. - Konsultasi dengan ChatGPT: Anda dapat meminta bantuan ChatGPT dalam mengidentifikasi node HTML dengan menyajikan struktur HTML tersebut dan menjelaskan data apa yang ingin Anda ambil. - Ekstraksi Node: Setelah mendapatkan node yang sesuai, gunakan fungsi html_nodes() untuk mengekstrak konten:

nodes <- webpage %>% html_nodes('your_css_selector')  # Ganti dengan selector yang sesuai

6. Kesimpulan

Laporan ini telah menguraikan langkah-langkah penting dalam melakukan web scraping di R menggunakan paket rvest. Dengan mempraktikkan teknik-teknik ini, pengguna dapat mengumpulkan dan mengelola data dari berbagai situs web secara efektif. Keterampilan web scraping sangat berguna dalam analisis data, riset pasar, dan pengumpulan informasi dari berbagai sumber. Sebagai langkah lanjutan, disarankan untuk berlatih dengan berbagai situs web dan format data guna meningkatkan keterampilan web scraping. Dengan pemahaman yang baik tentang struktur HTML dan penerapan teknik yang tepat, Anda dapat mengotomatiskan proses pengumpulan data dengan lebih efisien.

LS0tICANCnRpdGxlOiAiU0FNUExJTkcgJiBTVVJWRVkgVEVDSE5JUVVFUyIgIA0Kc3VidGl0bGU6ICJMQVBPUkFOIFdFQiBTQ1JBUElORyBNRU5HR1VOQUtBTiBSIiAgDQphdXRob3I6ICJEYWRhbiBSYW1kYW4gSGlkYXlhdCAoNTIyNDAwMjgpIiAgDQpkYXRlOiAiYHIgZm9ybWF0KFN5cy5EYXRlKCksICclQiAlZCwgJVknKWAiICANCm91dHB1dDogIA0KICBybWRmb3JtYXRzOjpyZWFkdGhlZG93bjogICANCiAgICBzZWxmX2NvbnRhaW5lZDogdHJ1ZSAgDQogICAgdGh1bWJuYWlsczogdHJ1ZSAgDQogICAgbGlnaHRib3g6IHRydWUgIA0KICAgIGdhbGxlcnk6IHRydWUgIA0KICAgIGxpYl9kaXI6IGxpYnMgIA0KICAgIGRmX3ByaW50OiAicGFnZWQiICANCiAgICBjb2RlX2ZvbGRpbmc6ICJzaG93IiAgDQogICAgY29kZV9kb3dubG9hZDogdHJ1ZSAgDQogICAgY3NzOiAic3R5bGUuY3NzIiAgDQotLS0gIA0KDQo8aW1nIHNyYz0iRk9UTyBURVJCQVJVXzExem9uLmpwZyIgYWx0PSJMb2dvIiBzdHlsZT0id2lkdGg6MjAwcHg7IGRpc3BsYXk6IGJsb2NrOyBtYXJnaW46IGF1dG87Ij4NCg0KIyBQZW5kYWh1bHVhbg0KTGFwb3JhbiBpbmkgbWVtYmFoYXMgcHJvc2VzIHdlYiBzY3JhcGluZyBtZW5nZ3VuYWthbiBiYWhhc2EgcGVtcm9ncmFtYW4gUiBkZW5nYW4gYmFudHVhbiBwYWtldCBydmVzdC4gVHVqdWFuIGRhcmkgbGFwb3JhbiBpbmkgYWRhbGFoIG1lbWJlcmlrYW4gcGFuZHVhbiBwcmFrdGlzIGJhZ2kgcGVuZ2d1bmEgeWFuZyBiZWx1bSBtZW1pbGlraSBwZW5nZXRhaHVhbiBtZW5kYWxhbSB0ZW50YW5nIEhUTUwgbmFtdW4gaW5naW4gbWVuZ2Vrc3RyYWsgZGF0YSBkYXJpIHNpdHVzIHdlYiBzZWNhcmEgZWZpc2llbi4gV2ViIHNjcmFwaW5nIGFkYWxhaCB0ZWtuaWsgb3RvbWF0aXNhc2kgeWFuZyBkaWd1bmFrYW4gdW50dWsgbWVuZ2FtYmlsIGluZm9ybWFzaSBkYXJpIGhhbGFtYW4gd2ViIGRhbiBtZW5ndWJhaG55YSBtZW5qYWRpIGRhdGEgdGVyc3RydWt0dXIuIERlbmdhbiBtZW5nZ3VuYWthbiBSLCBwZW5nZ3VuYSBkYXBhdCBkZW5nYW4gbXVkYWggbWVuZ2Frc2VzIGRhbiBtZW5nb2xhaCBkYXRhIHlhbmcgdGVya2FuZHVuZyBkYWxhbSBiZXJiYWdhaSBlbGVtZW4gSFRNTCBzZXBlcnRpIHRhYmVsLCB0ZWtzLCBnYW1iYXIsIGRhbiBsYWlubnlhLiBEYWxhbSBsYXBvcmFuIGluaSwgZGliYWhhcyBsYW5na2FoLWxhbmdrYWggdXRhbWEgeWFuZyBkaWxlbmdrYXBpIGRlbmdhbiBjb250b2ggcHJha3RpcyB1bnR1ayBtZW11ZGFoa2FuIHBlbWFoYW1hbi4NCg0KIyAxLiBQZXJzaWFwYW4gTGluZ2t1bmdhbiBkaSBSDQpTZWJlbHVtIG1lbXVsYWkgcHJvc2VzIHdlYiBzY3JhcGluZyBkaSBSLCBkaXBlcmx1a2FuIGluc3RhbGFzaSBwZXJhbmdrYXQgZGFuIHBha2V0IHBlbmR1a3VuZzoNCi0gKipJbnN0YWxhc2kgUiBkYW4gUlN0dWRpbzoqKiBQYXN0aWthbiBBbmRhIHRlbGFoIG1lbmd1bmR1aCBkYW4gbWVuZ2luc3RhbCBSIGRhbiBSU3R1ZGlvIGRpIGtvbXB1dGVyIEFuZGEuIFIgYWRhbGFoIGJhaGFzYSBwZW1yb2dyYW1hbiB5YW5nIGRpZ3VuYWthbiB1bnR1ayBhbmFsaXNpcyBkYXRhLCBzZWRhbmdrYW4gUlN0dWRpbyBhZGFsYWggbGluZ2t1bmdhbiBwZW5nZW1iYW5nYW4gdGVyaW50ZWdyYXNpIChJREUpIHlhbmcgbWVtcGVybXVkYWggcGVudWxpc2FuIGRhbiBla3Nla3VzaSBrb2RlIFIuDQotICoqSW5zdGFsYXNpIFBha2V0OioqIFBha2V0IGRhbGFtIFIgYWRhbGFoIGt1bXB1bGFuIGZ1bmdzaSBkYW4gZGF0YSB5YW5nIGRpZ3VuYWthbiB1bnR1ayB0dWdhcyB0ZXJ0ZW50dS4gVW50dWsgbWVsYWt1a2FuIHdlYiBzY3JhcGluZywga2l0YSBtZW1lcmx1a2FuIHBha2V0ICpydmVzdCogdW50dWsgbWVuZ2FtYmlsIGRhbiBtZW1wcm9zZXMgSFRNTCwgc2VydGEgKmRwbHlyKiB1bnR1ayBtYW5pcHVsYXNpIGRhdGEuIEJ1a2EgUlN0dWRpbyBkYW4gamFsYW5rYW4gcGVyaW50YWggYmVyaWt1dCB1bnR1ayBtZW5naW5zdGFsIHBha2V0IHlhbmcgZGlidXR1aGthbjoNCmBgYHINCmluc3RhbGwucGFja2FnZXMoInJ2ZXN0IikNCmluc3RhbGwucGFja2FnZXMoImRwbHlyIikNCmBgYA0KLSAqKlBlbWFuZ2dpbGFuIFBha2V0OioqIFNldGVsYWggaW5zdGFsYXNpLCBwYW5nZ2lsIHBha2V0LXBha2V0IHRlcnNlYnV0IGRhbGFtIHNrcmlwIFIgQW5kYSB1bnR1ayBtdWxhaSBtZW5nZ3VuYWthbm55YToNCmBgYHINCmxpYnJhcnkocnZlc3QpDQpsaWJyYXJ5KGRwbHlyKQ0KYGBgDQpNZW1hbmdnaWwgcGFrZXQgYmVyYXJ0aSBtZW5nYWt0aWZrYW4gZnVuZ3NpLWZ1bmdzaSB5YW5nIHRlcnNlZGlhIGRpIGRhbGFtbnlhIHNlaGluZ2dhIGRhcGF0IGRpZ3VuYWthbiBkYWxhbSBza3JpcCBBbmRhLg0KDQojIDIuIFBlbmdndW5hYW4gUGFrZXQgRGF0YXBhc3RhIHVudHVrIE1hbmFqZW1lbiBEYXRhIGRpIFINClBha2V0ICpkYXRhcGFzdGEqIG1lbXVkYWhrYW4gcGVtZm9ybWF0YW4gZGFuIHBlbmdlbG9sYWFuIGRhdGEgZGkgUi4gUGFrZXQgaW5pIHNhbmdhdCBtZW1iYW50dSBrZXRpa2EgQW5kYSBwZXJsdSBtZW55YWxpbiBkYXRhIGRhcmkgc3VtYmVyIGVrc3Rlcm5hbCBzZXBlcnRpIHNwcmVhZHNoZWV0IGF0YXUgdGFiZWwgd2ViIGRhbiBtZW5ndWJhaG55YSBtZW5qYWRpIGtvZGUgUiB5YW5nIGRhcGF0IGxhbmdzdW5nIGRpZWtzZWt1c2kuDQotICoqSW5zdGFsYXNpIFBha2V0OioqIEphbGFua2FuIHBlcmludGFoIGJlcmlrdXQgdW50dWsgbWVuZ2luc3RhbCBkYXRhcGFzdGE6DQpgYGByDQppbnN0YWxsLnBhY2thZ2VzKCJkYXRhcGFzdGEiKQ0KYGBgDQotICoqUGVuZ2d1bmFhbiBQaW50YXNhbjoqKiBQYWtldCBpbmkgbWVueWVkaWFrYW4gcGludGFzYW4ga2V5Ym9hcmQgeWFuZyBtZW11bmdraW5rYW4gQW5kYSBkZW5nYW4gY2VwYXQgbWVuZ29udmVyc2kgYmluZ2thaSBkYXRhIGRhbiBvYmplayBsYWlubnlhIGtlIGRhbGFtIGtvZGUgUi4gTWlzYWxueWEsIEFuZGEgYmlzYSBtZW55YWxpbiBkYXRhIGRhcmkgRXhjZWwgZGFuIG1lbmdndW5ha2FuIHBpbnRhc2FuIHVudHVrIG1lbmVtcGVsa2FubnlhIHNlYmFnYWkgZGF0YSBmcmFtZSBkaSBSLg0KDQojIDMuIFBlbmdpa2lzYW4gVGFiZWwgSFRNTCBkaSBSDQpTYWxhaCBzYXR1IHR1Z2FzIGRhc2FyIGRhbGFtIHdlYiBzY3JhcGluZyBhZGFsYWggbWVuZ2Vrc3RyYWsgZGF0YSBkYXJpIHRhYmVsIEhUTUwsIHlhbmcgc2VyaW5nIGRpdGVtdWthbiBkaSBoYWxhbWFuIHdlYiBkYWxhbSBiZW50dWsgdGFiZWwgc3RhdGlzdGlrLCBkYWZ0YXIgcHJvZHVrLCBhdGF1IGluZm9ybWFzaSBsYWlubnlhLg0KLSAqKklkZW50aWZpa2FzaSBTaXR1cyBXZWI6KiogUGlsaWggc2l0dXMgd2ViIHlhbmcgYmVyaXNpIHRhYmVsIEhUTUwgeWFuZyBpbmdpbiBkaWt1bXB1bGthbi4gUGFzdGlrYW4gc2l0dXMgdGVyc2VidXQgbWVtaWxpa2kgaXppbiB1bnR1ayBtZWxha3VrYW4gd2ViIHNjcmFwaW5nIGFnYXIgbWVuZ2hpbmRhcmkgcGVsYW5nZ2FyYW4gaHVrdW0uDQotICoqUGVtYmFjYWFuIEhUTUw6KiogR3VuYWthbiBrb2RlIGJlcmlrdXQgdW50dWsgbWVtYmFjYSBrb250ZW4gSFRNTCBoYWxhbWFuIHdlYjoNCmBgYHINCnVybCA8LSAnaHR0cDovL2V4YW1wbGUuY29tL3RhYmxlJyAgIyBHYW50aSBkZW5nYW4gVVJMIHlhbmcgcmVsZXZhbg0Kd2VicGFnZSA8LSByZWFkX2h0bWwodXJsKQ0KYGBgDQpGdW5nc2kgYHJlYWRfaHRtbCgpYCBtZW1iYWNhIHNlbHVydWggc3RydWt0dXIgSFRNTCBkYXJpIGhhbGFtYW4gd2ViIHlhbmcgZGl0ZW50dWthbi4NCi0gKipFa3N0cmFrc2kgVGFiZWw6KiogR3VuYWthbiBmdW5nc2kgYGh0bWxfdGFibGUoKWAgdW50dWsgbWVuZ2Vrc3RyYWsgdGFiZWwgZGFyaSBoYWxhbWFuIHRlcnNlYnV0Og0KYGBgcg0KdGFibGUgPC0gd2VicGFnZSAlPiUgaHRtbF90YWJsZShmaWxsID0gVFJVRSkNCmBgYA0KUGFyYW1ldGVyIGBmaWxsID0gVFJVRWAgbWVtYXN0aWthbiB0YWJlbCB0ZXRhcCB0ZXJpc2kgbWVza2lwdW4gYWRhIHNlbCB5YW5nIGtvc29uZy4NCi0gKipQZW5hbXBpbGFuIFRhYmVsOioqIFRhbXBpbGthbiB0YWJlbCB5YW5nIHRlbGFoIGRpZWtzdHJhayB1bnR1ayBtZW12ZXJpZmlrYXNpIGhhc2lsbnlhOg0KYGBgcg0KcHJpbnQodGFibGUpDQpgYGANCg0KIyA0LiBNZWxha3VrYW4gUGVydWxhbmdhbiBNZWxhbHVpIEJlYmVyYXBhIFVSTA0KU2VyaW5nIGthbGkgZGF0YSB0ZXJzZWJhciBkaSBiZWJlcmFwYSBoYWxhbWFuIHdlYi4gVW50dWsgbWVuZ3VtcHVsa2FuIGRhdGEgZGFyaSBoYWxhbWFuLWhhbGFtYW4gdGVyc2VidXQsIEFuZGEgZGFwYXQgbWVuZ2d1bmFrYW4gcGVydWxhbmdhbiBkaSBSLg0KLSAqKkJ1YXQgVmVrdG9yIFVSTDoqKiBTaWFwa2FuIGRhZnRhciBVUkwgeWFuZyBpbmdpbiBBbmRhIGt1bmp1bmdpOg0KYGBgcg0KdXJscyA8LSBjKCdodHRwOi8vZXhhbXBsZS5jb20vcGFnZTEnLCAnaHR0cDovL2V4YW1wbGUuY29tL3BhZ2UyJykNCmBgYA0KLSAqKlVsYW5naSBVUkw6KiogR3VuYWthbiBmdW5nc2kgYGxhcHBseSgpYCB1bnR1ayBtZW1iYWNhIGRhbiBtZW5nZWtzdHJhayBkYXRhIGRhcmkgbWFzaW5nLW1hc2luZyBVUkw6DQpgYGByDQpyZXN1bHRzIDwtIGxhcHBseSh1cmxzLCBmdW5jdGlvbih1cmwpIHsNCiAgICB3ZWJwYWdlIDwtIHJlYWRfaHRtbCh1cmwpDQogICAgdGFibGUgPC0gd2VicGFnZSAlPiUgaHRtbF90YWJsZShmaWxsID0gVFJVRSkNCiAgICByZXR1cm4odGFibGUpDQp9KQ0KYGBgDQpGdW5nc2kgYGxhcHBseSgpYCBtZW5lcmFwa2FuIGZ1bmdzaSB5YW5nIHNhbWEga2Ugc2V0aWFwIGVsZW1lbiBkYWxhbSB2ZWt0b3IgYHVybHNgLg0KLSAqKkdhYnVuZ2thbiBIYXNpbDoqKiBKaWthIGRpcGVybHVrYW4sIGdhYnVuZ2thbiBzZW11YSBoYXNpbCBtZW5qYWRpIHNhdHUgZGF0YSBmcmFtZSBtZW5nZ3VuYWthbiBmdW5nc2kgYGJpbmRfcm93cygpYCBkYXJpIHBha2V0IGRwbHlyOg0KYGBgcg0KY29tYmluZWRfcmVzdWx0cyA8LSBiaW5kX3Jvd3MocmVzdWx0cykNCmBgYA0KDQojIDUuIFBlbWlsaWhhbiBOb2RlIEhUTUwgZGVuZ2FuIEJhbnR1YW4gQ2hhdEdQVCBkaSBSDQpLYWRhbmcta2FkYW5nIGRhdGEgeWFuZyBkaWluZ2lua2FuIHRpZGFrIHRlcmxldGFrIGRhbGFtIHRhYmVsIG1lbGFpbmthbiBlbGVtZW4gSFRNTCBsYWlubnlhIHNlcGVydGkgcGFyYWdyYWYsIGhlYWRpbmcsIGF0YXUgZGl2IGRlbmdhbiBrZWxhcyB0ZXJ0ZW50dS4NCi0gKipQZW1lcmlrc2FhbiBIVE1MOioqIEtsaWsga2FuYW4gcGFkYSBlbGVtZW4geWFuZyBpbmdpbiBkaWtpa2lzIGRhbiBwaWxpaCAiUGVyaWtzYSIgKEluc3BlY3QpIHVudHVrIG1lbGloYXQgc3RydWt0dXIgSFRNTC4NCi0gKipLb25zdWx0YXNpIGRlbmdhbiBDaGF0R1BUOioqIEFuZGEgZGFwYXQgbWVtaW50YSBiYW50dWFuIENoYXRHUFQgZGFsYW0gbWVuZ2lkZW50aWZpa2FzaSBub2RlIEhUTUwgZGVuZ2FuIG1lbnlhamlrYW4gc3RydWt0dXIgSFRNTCB0ZXJzZWJ1dCBkYW4gbWVuamVsYXNrYW4gZGF0YSBhcGEgeWFuZyBpbmdpbiBBbmRhIGFtYmlsLg0KLSAqKkVrc3RyYWtzaSBOb2RlOioqIFNldGVsYWggbWVuZGFwYXRrYW4gbm9kZSB5YW5nIHNlc3VhaSwgZ3VuYWthbiBmdW5nc2kgYGh0bWxfbm9kZXMoKWAgdW50dWsgbWVuZ2Vrc3RyYWsga29udGVuOg0KYGBgcg0Kbm9kZXMgPC0gd2VicGFnZSAlPiUgaHRtbF9ub2RlcygneW91cl9jc3Nfc2VsZWN0b3InKSAgIyBHYW50aSBkZW5nYW4gc2VsZWN0b3IgeWFuZyBzZXN1YWkNCmBgYA0KDQojIDYuIEtlc2ltcHVsYW4NCkxhcG9yYW4gaW5pIHRlbGFoIG1lbmd1cmFpa2FuIGxhbmdrYWgtbGFuZ2thaCBwZW50aW5nIGRhbGFtIG1lbGFrdWthbiB3ZWIgc2NyYXBpbmcgZGkgUiBtZW5nZ3VuYWthbiBwYWtldCBydmVzdC4gRGVuZ2FuIG1lbXByYWt0aWtrYW4gdGVrbmlrLXRla25payBpbmksIHBlbmdndW5hIGRhcGF0IG1lbmd1bXB1bGthbiBkYW4gbWVuZ2Vsb2xhIGRhdGEgZGFyaSBiZXJiYWdhaSBzaXR1cyB3ZWIgc2VjYXJhIGVmZWt0aWYuIEtldGVyYW1waWxhbiB3ZWIgc2NyYXBpbmcgc2FuZ2F0IGJlcmd1bmEgZGFsYW0gYW5hbGlzaXMgZGF0YSwgcmlzZXQgcGFzYXIsIGRhbiBwZW5ndW1wdWxhbiBpbmZvcm1hc2kgZGFyaSBiZXJiYWdhaSBzdW1iZXIuIFNlYmFnYWkgbGFuZ2thaCBsYW5qdXRhbiwgZGlzYXJhbmthbiB1bnR1ayBiZXJsYXRpaCBkZW5nYW4gYmVyYmFnYWkgc2l0dXMgd2ViIGRhbiBmb3JtYXQgZGF0YSBndW5hIG1lbmluZ2thdGthbiBrZXRlcmFtcGlsYW4gd2ViIHNjcmFwaW5nLiBEZW5nYW4gcGVtYWhhbWFuIHlhbmcgYmFpayB0ZW50YW5nIHN0cnVrdHVyIEhUTUwgZGFuIHBlbmVyYXBhbiB0ZWtuaWsgeWFuZyB0ZXBhdCwgQW5kYSBkYXBhdCBtZW5nb3RvbWF0aXNrYW4gcHJvc2VzIHBlbmd1bXB1bGFuIGRhdGEgZGVuZ2FuIGxlYmloIGVmaXNpZW4uDQoNCg0KDQojIDcuIFJlZmVyZW5zaQ0KDQoNCmh0dHBzOi8vYm9va2Rvd24ub3JnL2RzY2llbmNlbGFicy9kYXRhX3NjaWVuY2VfcHJvZ3JhbW1pbmcvMDQtRGF0YV9Db2xsZWN0aW9uLmh0bWwNCg0KaHR0cHM6Ly93d3cuZ2Vla3Nmb3JnZWVrcy5vcmcvd2hhdC1pcy13ZWItc2NyYXBpbmctYW5kLWhvdy10by11c2UtaXQvDQoNCmh0dHBzOi8vYmxvZy5ydW1haHdlYi5jb20vd2ViLXNjcmFwaW5nLWFkYWxhaC8NCg0KaHR0cHM6Ly93ZWJzY3JhcGVyLmlvLw0KDQpodHRwczovL3d3dy5kZXdhd2ViLmNvbS9ibG9nL3dlYi1zY3JhcGluZy1wYW5kdWFuLWRhbi10ZWtuaWstdGVrbmlrbnlhLw0KDQoNCg==