
Penggunaan Web Scraping with R
1. Pengertian
Web scraping adalah teknik untuk mengambil data dari situs web secara
otomatis menggunakan program komputer. Teknik ini sangat berguna karena
banyak informasi di internet tidak tersedia dalam format yang mudah
diunduh, seperti file Excel atau CSV. Dengan web scraping, kita bisa
mengumpulkan data seperti teks, gambar, atau tabel dari halaman web
untuk keperluan analisis, penelitian, atau pengambilan keputusan. Bahasa
pemrograman R, yang sering digunakan untuk analisis data, menyediakan
alat seperti paket rvest dan httr yang memudahkan proses scraping. Dalam
tugas ini, kita akan belajar cara mengakses halaman web, mengambil data
yang dibutuhkan, dan menyimpannya dalam format yang siap digunakan.
Dengan menguasai web scraping, kita bisa memanfaatkan data online untuk
berbagai proyek secara efisien.
2. Alat Perangkat Lunak untuk Web Scaripng di
R
1. R dan RStudio
2. Paket R untuk Web Scraping:
-rvest: Paket utama untuk mengambil dan mengurai data dari halaman
web.
-httr: Digunakan untuk mengirim permintaan HTTP (seperti GET atau
POST) ke server web.
-XML atau xml2: Untuk mengurai dokumen HTML atau XML.
-jsonlite: Jika data yang diambil berbentuk JSON, paket ini membantu
mengurai dan mengolahnya.
-dplyr dan tidyverse: Untuk membersihkan dan memproses data setelah
di-scrape.
3. Web Browser or Developer Tools
4. Koneksi Internet
5.Text Editor (Opsional)
6.Pengetahuan Dasar HTML dan CSS
3. Metode Web Scaraping di R
3.1 Menggunakan Paket rvest
Metode: rvest adalah paket paling populer untuk web scraping di R.
Ini memungkinkan Anda mengambil data dari halaman web dengan mudah
menggunakan fungsi seperti read_html() untuk membaca halaman web,
html_nodes() untuk memilih elemen HTML, dan html_text() atau html_attr()
untuk mengekstrak teks atau atribut.
Kegunaan: Cocok untuk scraping halaman web statis dengan struktur
HTML yang jelas.
Contoh:
## Warning: package 'rvest' was built under R version 4.4.3
url <- "https://example.com"
page <- read_html(url)
data <- page %>% html_nodes("h1") %>% html_text()
print(data)
## [1] "Example Domain"
3.2 Menggunakan Paket xml2
Metode: xml2 adalah paket untuk mengurai dokumen HTML atau XML. Ini
mirip dengan rvest tetapi lebih fokus pada manipulasi struktur
XML/HTML.
Kegunaan: Cocok untuk scraping data dari dokumen XML atau HTML
kompleks.
Contoh:
## Warning: package 'xml2' was built under R version 4.4.3
url <- "https://example.com"
page <- read_html(url)
data <- xml_find_all(page, "//h1") %>% xml_text()
print(data)
## [1] "Example Domain"
4. contoh penggunaan web scraping di R
4.1.1 Mengambil Judul Berita dari Web BBC News
Bayangkan Anda ingin mengumpulkan judul-judul berita terbaru dari
halaman utama BBC News. Dengan bantuan R, Anda bisa melakukannya secara
otomatis menggunakan teknik web scraping. Berikut
langkah-langkahnya:
4.1.2 Persiapan
Pastikan Anda sudah menginstal paket rvest di R. Jika belum, jalankan
perintah berikut:
install.packages("rvest")
## Warning: package 'rvest' is in use and will not be installed
4.1.3 Mulai Scraping
Berikut adalah kode R untuk mengambil judul berita dari BBC News:
# Load paket rvest
library(rvest)
# Tentukan URL halaman BBC News
url <- "https://www.bbc.com/news"
# Baca halaman web
halaman_web <- read_html(url)
# Ambil judul artikel menggunakan selector CSS
judul_berita <- halaman_web %>%
html_nodes(".gs-c-promo-heading__title") %>% # Pilih elemen judul
html_text(trim = TRUE) # Ambil teks dan hilangkan spasi ekstra
# Tampilkan hasil
print(judul_berita)
## character(0)
4.1.4 Hasil
Setelah menjalankan kode di atas, Anda akan mendapatkan daftar judul
berita terbaru dari BBC News, seperti:
[1] “Judul Berita 1”
[2] “Judul Berita 2”
[3] “Judul Berita 3” …
Tantangan dan Solusi Web Scraping di R
Web scraping di R bisa menjadi tantangan karena berbagai faktor
teknis dan non-teknis. Berikut adalah Tabel beberapa tantangan umum
beserta solusinya:
# Membuat data frame untuk tabel
tantangan_solusi <- data.frame(
Tantangan = c(
"Halaman Dinamis (JavaScript)",
"Struktur HTML Rumit",
"Pemblokiran oleh Situs",
"Perubahan Struktur Website",
"Data dalam Format JSON/API"
),
Solusi = c(
"Gunakan **`RSelenium`** untuk render halaman lengkap.",
"Pakai **SelectorGadget** atau **Developer Tools** untuk identifikasi CSS.",
"Tambahkan header (seperti `User-Agent`) dan jeda waktu (`Sys.sleep()`).",
"Buat selector fleksibel dan pantau perubahan berkala.",
"Gunakan **`httr`** dan **`jsonlite`** untuk mengambil dan mengurai JSON."
)
)
# Menampilkan tabel
library(knitr)
## Warning: package 'knitr' was built under R version 4.4.2
kable(tantangan_solusi, align = "l", caption = "Tantangan dan Solusi Web Scraping di R")
Tantangan dan Solusi Web Scraping di R
Halaman Dinamis (JavaScript) |
Gunakan RSelenium untuk
render halaman lengkap. |
Struktur HTML Rumit |
Pakai SelectorGadget atau
Developer Tools untuk identifikasi CSS. |
Pemblokiran oleh Situs |
Tambahkan header (seperti User-Agent ) dan
jeda waktu (Sys.sleep() ). |
Perubahan Struktur Website |
Buat selector fleksibel dan pantau perubahan
berkala. |
Data dalam Format JSON/API |
Gunakan httr dan
jsonlite untuk mengambil dan mengurai
JSON. |
Kesimpulan
Kalo lo pengen ngumpulin data dari website pake R, rvest sama xml2
adalah duo jagoan yang bisa lo andelin! rvest itu simpel banget buat
pemula, cocok buat ngambil data dari halaman web statis. Sementara xml2
lebih fleksibel dan powerful, bisa handle struktur HTML/XML yang lebih
ribet. Pilih rvest kalo lo mau yang praktis, atau xml2 kalo lo butuh
kontrol lebih. Yang pasti, selalu cek kebijakan website biar gak kena
masalah. Jadi, siap jadi data hunter? Gaskeun aja! 😎🔥
LS0tDQp0aXRsZTogIldlYiBTY2FyYXBpbmciDQpzdWJ0aXRsZTogIkRhdGEgU2NpZW5jZSBQcm9ncmFtbWluZyINCmF1dGhvcjogIk11aGFtbWFkIE5hYmlsIFByYXRhbWEiDQpkYXRlOiAiYHIgZm9ybWF0KFN5cy5EYXRlKCksICclQiAlZCwgJVknKWAiDQpvdXRwdXQ6DQogIHJtZGZvcm1hdHM6OnJlYWR0aGVkb3duOg0KICAgIHNlbGZfY29udGFpbmVkOiB0cnVlDQogICAgdGh1bWJuYWlsczogdHJ1ZQ0KICAgIGxpZ2h0Ym94OiB0cnVlDQogICAgZ2FsbGVyeTogdHJ1ZQ0KICAgIGxpYl9kaXI6IGxpYnMNCiAgICBkZl9wcmludDogInBhZ2VkIg0KICAgIGNvZGVfZm9sZGluZzogInNob3ciDQogICAgY29kZV9kb3dubG9hZDogeWVzDQogICAgY3NzOiAic3R5bGUuY3NzIg0KLS0tDQoNCjxpbWcgaWQ9ImlzaV9uYW1hIiBzcmM9IkM6L1VzZXJzL00gTmFiaWwgUHJhdGFtYS9PbmVEcml2ZS9QaWN0dXJlcy9TY3JlZW5zaG90cy9HYW1iYXIgV2hhdHNBcHAgMjAyNC0xMi0wNiBwdWt1bCAxMy4zMy4xNV9jM2ZkMGZjNy5qcGciIGFsdD0iTG9nbyIgc3R5bGU9IndpZHRoOjIwMHB4OyBkaXNwbGF5OiBibG9jazsgbWFyZ2luOiBhdXRvOyI+DQoNCiMgKipQZW5nZ3VuYWFuIFdlYiBTY3JhcGluZyB3aXRoIFIqKg0KIyAqKjEuIFBlbmdlcnRpYW4qKg0KDQpXZWIgc2NyYXBpbmcgYWRhbGFoIHRla25payB1bnR1ayBtZW5nYW1iaWwgZGF0YSBkYXJpIHNpdHVzIHdlYiBzZWNhcmEgb3RvbWF0aXMgbWVuZ2d1bmFrYW4gcHJvZ3JhbSBrb21wdXRlci4gVGVrbmlrIGluaSBzYW5nYXQgYmVyZ3VuYSBrYXJlbmEgYmFueWFrIGluZm9ybWFzaSBkaSBpbnRlcm5ldCB0aWRhayB0ZXJzZWRpYSBkYWxhbSBmb3JtYXQgeWFuZyBtdWRhaCBkaXVuZHVoLCBzZXBlcnRpIGZpbGUgRXhjZWwgYXRhdSBDU1YuIERlbmdhbiB3ZWIgc2NyYXBpbmcsIGtpdGEgYmlzYSBtZW5ndW1wdWxrYW4gZGF0YSBzZXBlcnRpIHRla3MsIGdhbWJhciwgYXRhdSB0YWJlbCBkYXJpIGhhbGFtYW4gd2ViIHVudHVrIGtlcGVybHVhbiBhbmFsaXNpcywgcGVuZWxpdGlhbiwgYXRhdSBwZW5nYW1iaWxhbiBrZXB1dHVzYW4uIEJhaGFzYSBwZW1yb2dyYW1hbiBSLCB5YW5nIHNlcmluZyBkaWd1bmFrYW4gdW50dWsgYW5hbGlzaXMgZGF0YSwgbWVueWVkaWFrYW4gYWxhdCBzZXBlcnRpIHBha2V0IHJ2ZXN0IGRhbiBodHRyIHlhbmcgbWVtdWRhaGthbiBwcm9zZXMgc2NyYXBpbmcuIERhbGFtIHR1Z2FzIGluaSwga2l0YSBha2FuIGJlbGFqYXIgY2FyYSBtZW5nYWtzZXMgaGFsYW1hbiB3ZWIsIG1lbmdhbWJpbCBkYXRhIHlhbmcgZGlidXR1aGthbiwgZGFuIG1lbnlpbXBhbm55YSBkYWxhbSBmb3JtYXQgeWFuZyBzaWFwIGRpZ3VuYWthbi4gRGVuZ2FuIG1lbmd1YXNhaSB3ZWIgc2NyYXBpbmcsIGtpdGEgYmlzYSBtZW1hbmZhYXRrYW4gZGF0YSBvbmxpbmUgdW50dWsgYmVyYmFnYWkgcHJveWVrIHNlY2FyYSBlZmlzaWVuLg0KDQojICoqMi4gQWxhdCBQZXJhbmdrYXQgTHVuYWsgdW50dWsgV2ViIFNjYXJpcG5nIGRpIFIqKg0KKioxLiBSIGRhbiBSU3R1ZGlvKioNCg0KKioyLiBQYWtldCBSIHVudHVrIFdlYiBTY3JhcGluZzoqKg0KDQotcnZlc3Q6IFBha2V0IHV0YW1hIHVudHVrIG1lbmdhbWJpbCBkYW4gbWVuZ3VyYWkgZGF0YSBkYXJpIGhhbGFtYW4gd2ViLg0KDQotaHR0cjogRGlndW5ha2FuIHVudHVrIG1lbmdpcmltIHBlcm1pbnRhYW4gSFRUUCAoc2VwZXJ0aSBHRVQgYXRhdSBQT1NUKSBrZSBzZXJ2ZXIgd2ViLg0KDQotWE1MIGF0YXUgeG1sMjogVW50dWsgbWVuZ3VyYWkgZG9rdW1lbiBIVE1MIGF0YXUgWE1MLg0KDQotanNvbmxpdGU6IEppa2EgZGF0YSB5YW5nIGRpYW1iaWwgYmVyYmVudHVrIEpTT04sIHBha2V0IGluaSBtZW1iYW50dSBtZW5ndXJhaSBkYW4gbWVuZ29sYWhueWEuDQoNCi1kcGx5ciBkYW4gdGlkeXZlcnNlOiBVbnR1ayBtZW1iZXJzaWhrYW4gZGFuIG1lbXByb3NlcyBkYXRhIHNldGVsYWggZGktc2NyYXBlLg0KDQoqKjMuIFdlYiBCcm93c2VyIG9yIERldmVsb3BlciBUb29scyoqDQoNCioqNC4gS29uZWtzaSBJbnRlcm5ldCoqDQoNCioqNS5UZXh0IEVkaXRvciAoT3BzaW9uYWwpKioNCg0KKio2LlBlbmdldGFodWFuIERhc2FyIEhUTUwgZGFuIENTUyoqDQoNCiMgKiozLiBNZXRvZGUgV2ViIFNjYXJhcGluZyBkaSBSKioNCiMjICoqMy4xIE1lbmdndW5ha2FuIFBha2V0IHJ2ZXN0KioNCg0KTWV0b2RlOiBydmVzdCBhZGFsYWggcGFrZXQgcGFsaW5nIHBvcHVsZXIgdW50dWsgd2ViIHNjcmFwaW5nIGRpIFIuIEluaSBtZW11bmdraW5rYW4gQW5kYSBtZW5nYW1iaWwgZGF0YSBkYXJpIGhhbGFtYW4gd2ViIGRlbmdhbiBtdWRhaCBtZW5nZ3VuYWthbiBmdW5nc2kgc2VwZXJ0aSByZWFkX2h0bWwoKSB1bnR1ayBtZW1iYWNhIGhhbGFtYW4gd2ViLCBodG1sX25vZGVzKCkgdW50dWsgbWVtaWxpaCBlbGVtZW4gSFRNTCwgZGFuIGh0bWxfdGV4dCgpIGF0YXUgaHRtbF9hdHRyKCkgdW50dWsgbWVuZ2Vrc3RyYWsgdGVrcyBhdGF1IGF0cmlidXQuDQoNCktlZ3VuYWFuOiBDb2NvayB1bnR1ayBzY3JhcGluZyBoYWxhbWFuIHdlYiBzdGF0aXMgZGVuZ2FuIHN0cnVrdHVyIEhUTUwgeWFuZyBqZWxhcy4NCg0KQ29udG9oOg0KYGBge3J9DQpsaWJyYXJ5KHJ2ZXN0KQ0KdXJsIDwtICJodHRwczovL2V4YW1wbGUuY29tIg0KcGFnZSA8LSByZWFkX2h0bWwodXJsKQ0KZGF0YSA8LSBwYWdlICU+JSBodG1sX25vZGVzKCJoMSIpICU+JSBodG1sX3RleHQoKQ0KcHJpbnQoZGF0YSkNCmBgYA0KIyMgKiozLjIgTWVuZ2d1bmFrYW4gUGFrZXQgeG1sMioqDQoNCk1ldG9kZTogeG1sMiBhZGFsYWggcGFrZXQgdW50dWsgbWVuZ3VyYWkgZG9rdW1lbiBIVE1MIGF0YXUgWE1MLiBJbmkgbWlyaXAgZGVuZ2FuIHJ2ZXN0IHRldGFwaSBsZWJpaCBmb2t1cyBwYWRhIG1hbmlwdWxhc2kgc3RydWt0dXIgWE1ML0hUTUwuDQoNCktlZ3VuYWFuOiBDb2NvayB1bnR1ayBzY3JhcGluZyBkYXRhIGRhcmkgZG9rdW1lbiBYTUwgYXRhdSBIVE1MIGtvbXBsZWtzLg0KDQpDb250b2g6DQpgYGB7cn0NCmxpYnJhcnkoeG1sMikNCnVybCA8LSAiaHR0cHM6Ly9leGFtcGxlLmNvbSINCnBhZ2UgPC0gcmVhZF9odG1sKHVybCkNCmRhdGEgPC0geG1sX2ZpbmRfYWxsKHBhZ2UsICIvL2gxIikgJT4lIHhtbF90ZXh0KCkNCnByaW50KGRhdGEpDQpgYGANCiMgKio0LiBjb250b2ggcGVuZ2d1bmFhbiB3ZWIgc2NyYXBpbmcgZGkgUioqDQojIyAqKjQuMS4xIE1lbmdhbWJpbCBKdWR1bCBCZXJpdGEgZGFyaSBXZWIgQkJDIE5ld3MqKg0KDQpCYXlhbmdrYW4gQW5kYSBpbmdpbiBtZW5ndW1wdWxrYW4ganVkdWwtanVkdWwgYmVyaXRhIHRlcmJhcnUgZGFyaSBoYWxhbWFuIHV0YW1hIEJCQyBOZXdzLiBEZW5nYW4gYmFudHVhbiBSLCBBbmRhIGJpc2EgbWVsYWt1a2FubnlhIHNlY2FyYSBvdG9tYXRpcyBtZW5nZ3VuYWthbiB0ZWtuaWsgd2ViIHNjcmFwaW5nLiBCZXJpa3V0IGxhbmdrYWgtbGFuZ2thaG55YToNCg0KIyMjICoqNC4xLjIgUGVyc2lhcGFuKioNClBhc3Rpa2FuIEFuZGEgc3VkYWggbWVuZ2luc3RhbCBwYWtldCBydmVzdCBkaSBSLiBKaWthIGJlbHVtLCBqYWxhbmthbiBwZXJpbnRhaCBiZXJpa3V0Og0KDQpgYGB7cn0NCmluc3RhbGwucGFja2FnZXMoInJ2ZXN0IikNCmBgYA0KIyMgKio0LjEuMyBNdWxhaSBTY3JhcGluZyoqDQpCZXJpa3V0IGFkYWxhaCBrb2RlIFIgdW50dWsgbWVuZ2FtYmlsIGp1ZHVsIGJlcml0YSBkYXJpIEJCQyBOZXdzOg0KYGBge3J9DQojIExvYWQgcGFrZXQgcnZlc3QNCmxpYnJhcnkocnZlc3QpDQoNCiMgVGVudHVrYW4gVVJMIGhhbGFtYW4gQkJDIE5ld3MNCnVybCA8LSAiaHR0cHM6Ly93d3cuYmJjLmNvbS9uZXdzIg0KDQojIEJhY2EgaGFsYW1hbiB3ZWINCmhhbGFtYW5fd2ViIDwtIHJlYWRfaHRtbCh1cmwpDQoNCiMgQW1iaWwganVkdWwgYXJ0aWtlbCBtZW5nZ3VuYWthbiBzZWxlY3RvciBDU1MNCmp1ZHVsX2Jlcml0YSA8LSBoYWxhbWFuX3dlYiAlPiUNCiAgaHRtbF9ub2RlcygiLmdzLWMtcHJvbW8taGVhZGluZ19fdGl0bGUiKSAlPiUgICMgUGlsaWggZWxlbWVuIGp1ZHVsDQogIGh0bWxfdGV4dCh0cmltID0gVFJVRSkgICMgQW1iaWwgdGVrcyBkYW4gaGlsYW5na2FuIHNwYXNpIGVrc3RyYQ0KDQojIFRhbXBpbGthbiBoYXNpbA0KcHJpbnQoanVkdWxfYmVyaXRhKQ0KYGBgDQojIyAqKjQuMS40IEhhc2lsKioNClNldGVsYWggbWVuamFsYW5rYW4ga29kZSBkaSBhdGFzLCBBbmRhIGFrYW4gbWVuZGFwYXRrYW4gZGFmdGFyIGp1ZHVsIGJlcml0YSB0ZXJiYXJ1IGRhcmkgQkJDIE5ld3MsIHNlcGVydGk6DQoNClsxXSAiSnVkdWwgQmVyaXRhIDEiDQoNClsyXSAiSnVkdWwgQmVyaXRhIDIiDQoNClszXSAiSnVkdWwgQmVyaXRhIDMiDQouLi4NCg0KIyAqKlRhbnRhbmdhbiBkYW4gU29sdXNpIFdlYiBTY3JhcGluZyBkaSBSKioNCg0KV2ViIHNjcmFwaW5nIGRpIFIgYmlzYSBtZW5qYWRpIHRhbnRhbmdhbiBrYXJlbmEgYmVyYmFnYWkgZmFrdG9yIHRla25pcyBkYW4gbm9uLXRla25pcy4gQmVyaWt1dCBhZGFsYWggVGFiZWwgYmViZXJhcGEgdGFudGFuZ2FuIHVtdW0gYmVzZXJ0YSBzb2x1c2lueWE6DQoNCmBgYHtyfQ0KIyBNZW1idWF0IGRhdGEgZnJhbWUgdW50dWsgdGFiZWwNCnRhbnRhbmdhbl9zb2x1c2kgPC0gZGF0YS5mcmFtZSgNCiAgVGFudGFuZ2FuID0gYygNCiAgICAiSGFsYW1hbiBEaW5hbWlzIChKYXZhU2NyaXB0KSIsDQogICAgIlN0cnVrdHVyIEhUTUwgUnVtaXQiLA0KICAgICJQZW1ibG9raXJhbiBvbGVoIFNpdHVzIiwNCiAgICAiUGVydWJhaGFuIFN0cnVrdHVyIFdlYnNpdGUiLA0KICAgICJEYXRhIGRhbGFtIEZvcm1hdCBKU09OL0FQSSINCiAgKSwNCiAgU29sdXNpID0gYygNCiAgICAiR3VuYWthbiAqKmBSU2VsZW5pdW1gKiogdW50dWsgcmVuZGVyIGhhbGFtYW4gbGVuZ2thcC4iLA0KICAgICJQYWthaSAqKlNlbGVjdG9yR2FkZ2V0KiogYXRhdSAqKkRldmVsb3BlciBUb29scyoqIHVudHVrIGlkZW50aWZpa2FzaSBDU1MuIiwNCiAgICAiVGFtYmFoa2FuIGhlYWRlciAoc2VwZXJ0aSBgVXNlci1BZ2VudGApIGRhbiBqZWRhIHdha3R1IChgU3lzLnNsZWVwKClgKS4iLA0KICAgICJCdWF0IHNlbGVjdG9yIGZsZWtzaWJlbCBkYW4gcGFudGF1IHBlcnViYWhhbiBiZXJrYWxhLiIsDQogICAgIkd1bmFrYW4gKipgaHR0cmAqKiBkYW4gKipganNvbmxpdGVgKiogdW50dWsgbWVuZ2FtYmlsIGRhbiBtZW5ndXJhaSBKU09OLiINCiAgKQ0KKQ0KDQojIE1lbmFtcGlsa2FuIHRhYmVsDQpsaWJyYXJ5KGtuaXRyKQ0Ka2FibGUodGFudGFuZ2FuX3NvbHVzaSwgYWxpZ24gPSAibCIsIGNhcHRpb24gPSAiVGFudGFuZ2FuIGRhbiBTb2x1c2kgV2ViIFNjcmFwaW5nIGRpIFIiKQ0KYGBgDQojICoqS2VzaW1wdWxhbioqDQoNCkthbG8gbG8gcGVuZ2VuIG5ndW1wdWxpbiBkYXRhIGRhcmkgd2Vic2l0ZSBwYWtlIFIsIHJ2ZXN0IHNhbWEgeG1sMiBhZGFsYWggZHVvIGphZ29hbiB5YW5nIGJpc2EgbG8gYW5kZWxpbiEgcnZlc3QgaXR1IHNpbXBlbCBiYW5nZXQgYnVhdCBwZW11bGEsIGNvY29rIGJ1YXQgbmdhbWJpbCBkYXRhIGRhcmkgaGFsYW1hbiB3ZWIgc3RhdGlzLiBTZW1lbnRhcmEgeG1sMiBsZWJpaCBmbGVrc2liZWwgZGFuIHBvd2VyZnVsLCBiaXNhIGhhbmRsZSBzdHJ1a3R1ciBIVE1ML1hNTCB5YW5nIGxlYmloIHJpYmV0LiBQaWxpaCBydmVzdCBrYWxvIGxvIG1hdSB5YW5nIHByYWt0aXMsIGF0YXUgeG1sMiBrYWxvIGxvIGJ1dHVoIGtvbnRyb2wgbGViaWguIFlhbmcgcGFzdGksIHNlbGFsdSBjZWsga2ViaWpha2FuIHdlYnNpdGUgYmlhciBnYWsga2VuYSBtYXNhbGFoLiBKYWRpLCBzaWFwIGphZGkgZGF0YSBodW50ZXI/IEdhc2tldW4gYWphISDwn5iO8J+UpQ0KDQojICoqUkVGRVJFTlNJKioNCg0KaHR0cHM6Ly9ib29rZG93bi5vcmcvZHNjaWVuY2VsYWJzL2RhdGFfc2NpZW5jZV9wcm9ncmFtbWluZy8wNC1EYXRhX0NvbGxlY3Rpb24uaHRtbA0KDQpodHRwczovL3lvdXR1LmJlL0xiNkdpNklSLUtjDQoNCmh0dHBzOi8veW91dHUuYmUvbkJ6ck13OGhrbVk=