Visualisasi Data Dasar

Assignment ~ Week 4

Logo

1 . Pendahuluan

Visualisasi data transportasi publik adalah teknik penyajian informasi dalam bentuk diagram untuk mempermudah pemahaman, analisis, dan pengambilan keputusan.

Tujuannya meliputi :

  • Menyederhanakan data agar mudah dipahami
  • Mengungkap tren penggunaan dan keterlambatan operasional
  • Mendukung perencanaan dan kebijakan transportasi yang lebih efisien

Konteks kasus :

  • Peneliti atau mahasiswa yang ingin menganalisis pola mobilitas masyarakat.
  • Operator transportasi publik

Dengan visualisasi, data transportasi menjadi alat strategis untuk meningkatkan layanan dan respons terhadap kebutuhan publik.

2 . Persiapan Data

## Data Transportasi Publik
library(DT)

data_transportasi <- data.frame(
  No = 1:10,
  Nama_Bus = c("Bus A", "Bus B", "Bus C", "Bus D",
               "Bus E", "Bus F", "Bus G", "Bus H",
               "Bus I", "Bus J"),
  Jumlah_Penumpang = c(87, 120, 95, 110, 78, 
                       105, 60, 140, 102, 85),
  Waktu_Keterlambatan = c(4.3, 11.3, 6.2, 10.8, 2.5, 
                         9.5, 1.0, 15.6, 8.5, 3.2),
  
  Nama_Rute = c("Rute Merdeka", "Rute Harmoni", "Rute Grogol",
                 "Rute Merdeka", "Rute Harmoni", "Rute Grogol",
                 "Rute Merdeka", "Rute Harmoni", "Rute Grogol",
                 "Rute Merdeka"),
  
  Waktu_Keberangkatan = c("Pagi", "Pagi", "Siang", "Siang", "Sore",
                          "Sore", "Malam", "Malam", "Pagi", "Siang")
)

# Menampilkan data
print(data_transportasi)
##    No Nama_Bus Jumlah_Penumpang Waktu_Keterlambatan    Nama_Rute
## 1   1    Bus A               87                 4.3 Rute Merdeka
## 2   2    Bus B              120                11.3 Rute Harmoni
## 3   3    Bus C               95                 6.2  Rute Grogol
## 4   4    Bus D              110                10.8 Rute Merdeka
## 5   5    Bus E               78                 2.5 Rute Harmoni
## 6   6    Bus F              105                 9.5  Rute Grogol
## 7   7    Bus G               60                 1.0 Rute Merdeka
## 8   8    Bus H              140                15.6 Rute Harmoni
## 9   9    Bus I              102                 8.5  Rute Grogol
## 10 10    Bus J               85                 3.2 Rute Merdeka
##    Waktu_Keberangkatan
## 1                 Pagi
## 2                 Pagi
## 3                Siang
## 4                Siang
## 5                 Sore
## 6                 Sore
## 7                Malam
## 8                Malam
## 9                 Pagi
## 10               Siang
# Display the data frame as a neat table
datatable(data_transportasi, 
          caption = "Table of Data  Public Transportations",
          rownames = FALSE)

3 . Visualisasi

3.1 Bar Chart

Definisi :

Bar chart atau diagram batang adalah visualisasi data yang menggunakan batang (vertikal atau horizontal) untuk menunjukkan nilai dari suatu kategori. Setiap batang mewakili satu kategori, dan panjang batang sesuai dengan nilai atau frekuensi data.

Aturan Penggunaan Bar Chart :

  • Gunakan untuk data kategorikal, bukan data numerik kontinu.
  • Setiap batang mewakili satu kategori, panjangnya menunjukkan nilai (frekuensi atau jumlah).
  • Batang tidak boleh menyentuh satu sama lain (beda dengan histogram).
  • Kategori sebaiknya berjumlah terbatas agar grafik tetap mudah dibaca.
  • Gunakan label yang jelas pada sumbu X dan Y.

Kelebihan Bar Chart :

  • Mudah dipahami.
  • Memudahkan perbandingan antar kategori.
  • Cocok untuk data kategorikal.
  • Fleksibel.
  • Mudah dikustomisasi.

Kekurangan Bar Chart :

  • Tidak cocok untuk data kontinu.
  • Kurang efektif untuk banyak kategori.
  • Sulit menunjukkan tren waktu.
  • Overplotting.
  • Sensitif terhadap skala visual.
library(ggplot2)

# Membuat bar chart
ggplot(data_transportasi, aes(x = Nama_Bus, y = Jumlah_Penumpang, fill = Waktu_Keterlambatan)) +
  geom_bar(stat = "identity", width = 0.6, color = "black") +
  labs(
    title = "Jumlah Penumpang dan Waktu Keterlambatan Bus",
    x = "Nama Bus",
    y = "Jumlah Penumpang",
    fill = "Keterlambatan (menit)"
  ) +
  theme_minimal()

Penjelasan :

Berdasarkan diagram diatas, dapat disimpulkan bahwa semakin banyak jumlah penumpang yang diangkut oleh bus, maka waktu keterlambatannya cenderung semakin lama seperti Bus H yang mengalami keterlambatan waktu selama 15 menit dengan jumlah penumpang 140 orang, sedangkan bus dengan jumlah penumpang yang lebih sedikit cenderung lebih tepat waktu seperti Bus G yang mengalami keterlambatan waktu hanya 1 menit dengan jumlah penumpang 60 orang. Hal ini menunjukkan adanya kemungkinan hubungan antara banyaknya penumpang dengan keterlambatan kedatangan bus.

3.2 Histogram

Definisi :

Histogram adalah jenis grafik yang digunakan untuk menampilkan distribusi frekuensi dari data numerik (angka). Grafik ini menunjukkan seberapa sering nilai-nilai dalam data muncul dalam rentang (interval) tertentu, yang disebut bin.

Aturan Penggunaan :

  • Data yang digunakan harus bersifat numerik (angka).
  • Data dibagi ke dalam kelompok nilai (interval/bin).
  • Tinggi batang menunjukkan jumlah data dalam setiap kelompok.
  • Batang harus berdempetan tanpa jarak antar batang.
  • Jumlah kelompok harus ditentukan secara tepat (tidak terlalu sedikit atau terlalu banyak).

Kelebihan Histogram :

  • Cepat mengidentifikasi pola distribusi (normal,miring) dan nilai ekstrem (outlier)
  • Mudah di pahami dan alat yang efektif untuk memantau kualitas atau konsistensi proses.
  • Memungkinkan perbandingan visual antar dataset yang berbeda.

Kekurangan Histogram :

  • Interpretasi sangat bergantung pada lebar bins yang dipilih.
  • Menyebabkan hilangnya detail data individu karena dikelompokkan dalam interval.
  • Tidak cocok untuk data kategorikal (gunakan bar chart).
library(ggplot2)
library(dplyr)
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
library(tidyr)

# Ubah data jadi format long untuk dua variabel
data_long <- data_transportasi %>%
  select(Jumlah_Penumpang, Waktu_Keterlambatan) %>%
  pivot_longer(cols = everything(),
               names_to = "Variabel",
               values_to = "Nilai")

# Plot histogram gabungan dengan warna berdasarkan variabel
ggplot(data_long, aes(x = Nilai, fill = Variabel)) +
  geom_histogram(color = "black", position = "identity", bins = 20) +
  labs(title = "Histogram Jumlah Penumpang Bus dan Waktu Keterlambatan Bus",
       x = 'Jumlah penumpang',
       y = "Waktu keterlambatan",
       fill = "Variabel") +
  theme_minimal()

Penjelasan :

Berdasarkan histogram di atas, dapat disimpulkan bahwa mayoritas bus memiliki waktu keterlambatan yang relatif singkat (0–15 menit), sedangkan jumlah penumpang bus cukup bervariasi antara 50 hingga 150 orang per bus. Hal ini menunjukkan bahwa keterlambatan bus tidak terlalu besar meskipun terdapat perbedaan jumlah penumpang antarbus.

3.3 Boxplot

Definsi :

Boxplot, atau sering juga disebut diagram kotak garis (box and whisker plot), adalah salah satu metode grafis dalam statistika deskriptif yang digunakan untuk menggambarkan distribusi sekumpulan data numerik berdasarkan ringkasan lima angka utamanya. Grafik ini sangat berguna untuk memberikan gambaran visual yang efektif dan cepat.

Aturan Penggunaan :

  • Data yang digunakan harus numerik (berupa angka).
  • Dapat digunakan untuk membandingkan data antar kelompok.
  • Menampilkan lima ukuran statistik utama: minimum, kuartil 1 (Q1), median, kuartil 3 (Q3), dan maksimum.
  • Outlier (pencilan) ditampilkan sebagai titik di luar rentang normal data.
  • Sumbu X berisi kategori, sumbu Y berisi nilai numerik.

Kelebihan Boxplot :

  • Menyajikan ringkasan data secara cepat dan sederhana.
  • Dapat mendeteksi pencilan (outlier) dengan jelas.
  • Cocok untuk membandingkan penyebaran data antar kelompok.
  • Tidak memerlukan asumsi distribusi data.
  • Mudah dibaca dan efisien dalam menampilkan data besar.

Kekurangan Boxplot :

  • Tidak menunjukkan bentuk distribusi data secara rinci.
  • Kurang informatif jika jumlah data sedikit.
  • Tidak menampilkan jumlah data secara eksplisit.
  • Kurang intuitif bagi orang yang belum memahami statistik.
  • Outlier yang banyak bisa saling menumpuk dan sulit dibedakan.
library(ggplot2)

# Buat kategori jumlah penumpang agar bisa dibandingkan dalam boxplot
data_transportasi$Kategori_Penumpang <- cut(
  data_transportasi$Jumlah_Penumpang,
  breaks = c(0, 80, 110, 150),
  labels = c("Sedikit", "Sedang", "Banyak")
)

# Membuat boxplot gabungan jumlah penumpang & waktu keterlambatan
ggplot(data_transportasi,
       aes(x = Kategori_Penumpang,
           y = Waktu_Keterlambatan,
           fill = Kategori_Penumpang)) +
  geom_boxplot(width = 0.6, color = "black") +
  geom_jitter(aes(size = Jumlah_Penumpang), # Titik ukuran sesuai jumlah penumpang
              color = "chocolate4",
              alpha = 0.6,
              width = 0.15) +
  labs(
    title = "Boxplot Jumlah Penumpang Bus dan Waktu Keterlambatan Bus",
    x = "Jumlah Penumpang Bus",
    y = "Waktu Keterlambatan Bus (menit)",
    size = "Jumlah Penumpang"
  ) +
  theme_minimal()

Penjelasan :

Berdasarkan boxplot di atas, dapat disimpulkan bahwa semakin banyak jumlah penumpang yang diangkut bus, maka waktu keterlambatan cenderung semakin lama. Bus dengan penumpang sedikit cenderung lebih tepat waktu, sedangkan bus dengan penumpang sedang atau banyak memiliki variasi keterlambatan yang lebih besar. Terdapat juga beberapa bus dengan penumpang banyak yang mengalami keterlambatan ekstrem (outlier), menunjukkan adanya potensi kendala operasional saat jumlah penumpang terlalu tinggi.

3.4 Pie Chart

Definisi :

Pie chart adalah grafik berbentuk lingkaran yang dibagi menjadi beberapa sektor untuk menunjukkan proporsi atau persentase dari keseluruhan data. Setiap sektor mewakili bagian dari total, sehingga memudahkan pembaca memahami komposisi data secara visual.

Aturan Penggunaan :

  • Data yang dipakai harus data diskrit dengan nilai yang dapat dijumlahkan menjadi total 100%.
  • Gunakan data dengan kategori terbatas (3-7 kategori).
  • Jangan dipakai jika kategori nilainya hampir sama.
  • Tidak cocok untuk perbandingan detail antar kategori.
  • Label harus jelas supaya mudah dibaca.

Kelebihan Pie Chart :

  • Mudah dipahami untuk menunjukkan proporsi bagian dari keseluruhan.
  • Visualnya menarik dan sederhana.
  • Cocok untuk data dengan sedikit kategori.
  • Memudahkan melihat kontribusi masing-masing kategori secara cepat.

Kekurangan Pie Chart :

  • Sulit membandingkan ukuran irisan jika banyak kategori.
  • Tidak efektif untuk data dengan kategori yang nilainya mirip.
  • Kurang akurat untuk menunjukkan perbandingan detail antar kategori.
  • Bisa membingungkan jika jumlah kategori terlalu banyak.
  • Sulit menampilkan perubahan data dari waktu ke waktu.
library(ggplot2)
library(dplyr)

# Ringkas data per bus
data_summary <- data_transportasi %>%
  group_by(Nama_Bus) %>%
  summarise(
    Total_Penumpang = sum(Jumlah_Penumpang),
    Rata_Keterlambatan = mean(Waktu_Keterlambatan)
  )

# Buat label
data_summary$label <- paste0(
  data_summary$Nama_Bus, "\n",
  "Penumpang: ", data_summary$Total_Penumpang, "\n",
  "Delay: ", data_summary$Rata_Keterlambatan, " mnt"
)

# Pie chart (Donut)
ggplot(data_summary, aes(x = 2, y = Total_Penumpang, fill = Nama_Bus)) +
  geom_bar(stat = "identity", width = 1, color = "white") +
  coord_polar(theta = "y", start = 0) +
  xlim(0.5, 2.5) +         # inilah yang membuat "lubang" di tengah
  geom_text(aes(label = label),
            position = position_stack(vjust = 0.5),
            color = "black", size = 2.5, fontface = "bold") +
  labs(
    title = "Pie Chart (Donut) : Jumlah Penumpang Bus dan Waktu Keterlambatan Bus",
    fill = "Nama Bus"
  ) +
  theme_void() +
  theme(
    plot.title = element_text(size = 12)
  )

Penjelasan :

Berdasarkan pie chart di atas, dapat disimpulkan bahwa Bus H menyumbang proporsi penumpang terbesar sekaligus mengalami keterlambatan paling lama, sedangkan Bus G memiliki penumpang paling sedikit dan waktu keterlambatan paling singkat. Secara umum, semakin banyak jumlah penumpang yang diangkut oleh bus, waktu keterlambatannya cenderung lebih lama.

3.5 Scatter Plot

Definisi :

Scatter plot adalah grafik yang menampilkan hubungan antara dua variabel numerik dengan menempatkan titik-titik pada koordinat sumbu X dan Y sesuai nilai masing-masing variabel.

Aturan Penggunaan Scatter Plot :

  • Digunakan untuk menunjukkan hubungan atau korelasi antara dua variabel numerik.
  • Cocok untuk data yang berpasangan, misalnya pengukuran X dan Y pada objek yang sama.
  • Tidak digunakan untuk variabel kategori (non-numerik).
  • Berguna untuk mengidentifikasi pola, tren, kelompok, atau outlier dalam data.
  • Jika datanya terlalu padat, bisa menggunakan teknik seperti transparansi titik atau jitter agar visualisasi lebih jelas.
  • Bisa ditambahkan garis tren (regresi) untuk membantu interpretasi hubungan.

Kelebihan Scatter Plot :

  • Menampilkan hubungan dan pola antara dua variabel numerik dengan jelas.
  • Mudah mendeteksi korelasi positif, negatif, atau tidak ada korelasi.
  • Memungkinkan identifikasi outlier dan kelompok data (clustering).
  • Visualisasi sederhana dan intuitif.
  • Bisa digunakan untuk data besar dengan tambahan fitur seperti transparansi atau jitter.

Kekurangan Scatter Plot :

  • Kurang efektif jika data sangat padat dan titik-titik saling tumpang tindih.
  • Tidak cocok untuk variabel kategorikal atau lebih dari dua variabel tanpa modifikasi khusus.
  • Interpretasi hubungan hanya berdasarkan visual, tidak langsung memberikan nilai statistik.
  • Bisa membingungkan jika sumbu tidak diberi label atau skala tidak sesuai.
library(ggplot2)
library(ggrepel)

ggplot(data_transportasi, aes(x = Jumlah_Penumpang, 
                              y = Waktu_Keterlambatan,
                              color = Nama_Rute)) +
  geom_point(size = 4, alpha = 0.8) +
  geom_text_repel(aes(label = Nama_Bus), size = 3) +
  geom_smooth(method = "lm", se = FALSE, color = "black", linetype = "dashed") +
  labs(
    title = "Scatter Plot Jumlah Penumpang Bus vs Waktu Keterlambatan Bus",
    x = "Jumlah Penumpang Bus",
    y = "Waktu Keterlambatan (menit)"
  ) +
  theme_minimal()
## `geom_smooth()` using formula = 'y ~ x'

Penjelasan :

Berdasarkan scatterplot diatas, dapat disimpulkan bahwa terdapat hubungan antara waktu keterlambatan bus dengan jumlah penumpang bus. Bus dengan penumpang sedikit memiliki waktu keterlambatan rendah, sedangkan bus dengan penumpang banyak memiliki waktu keterlambatan tinggi. Pola ini konsisten pada seluruh rute (Grogol, Harmoni, dan Merdeka), yang menandakan bahwa kepadatan penumpang menjadi salah satu faktor utama penyebab keterlambatan bus.

3.6 Line Plot

Definisi :

Line plot (diagram garis) adalah jenis grafik yang menampilkan data dalam bentuk titik-titik yang dihubungkan oleh garis. Garis tersebut menunjukkan perubahan atau hubungan antara dua variabel — biasanya satu variabel numerik terhadap waktu atau terhadap variabel numerik lain.

Aturan Penggunaan :

  • Gunakan data yang berurutan atau kontinu.
  • Sumbu X digunakan untuk variabel independen (penyebab)
  • Sumbu Y digunakan untuk variabel dependen (akibat)
  • Hubungkan titik-titik data sesuai urutan yang benar.
  • Pastikan jarak antar titik di sumbu X proporsional.

Kelebihan Line Plot :

  • Menunjukkan tren atau perubahan dari waktu ke waktu dengan jelas.
  • Mudah dibandingkan antar kelompok data, terutama bila memakai garis berbeda.
  • Memberikan gambaran hubungan antar variabel (misalnya, jumlah penumpang dan waktu keterlambatan).
  • Efisien untuk data kontinu, karena menghubungkan titik-titik secara berurutan.
  • Visualisasi sederhana dan mudah dipahami, bahkan oleh pembaca non-teknis.

Kekurangan Line Plot :

  • Tidak cocok untuk data kategori, karena garis menyiratkan urutan yang tidak ada.
  • Sulit dibaca jika terlalu banyak garis atau data terlalu rapat.
  • Kurang efektif untuk menunjukkan distribusi data, seperti variasi atau sebaran nilai.
  • Sensitif terhadap skala sumbu, perubahan kecil pada skala bisa mengubah persepsi tren.
  • Tidak menunjukkan frekuensi atau proporsi.
library(ggplot2)

data_transportasi$Nama_Bus <- factor(data_transportasi$Nama_Bus, levels = c("Bus A", "Bus B", "Bus C", "Bus D", "Bus E", "Bus F", "Bus G", "Bus H", "Bus I", "Bus J"))

# 3. Membuat Line Plot
plot_line <- ggplot(data_transportasi, aes(x = Nama_Bus, y = Jumlah_Penumpang, group = 1)) + 
  geom_line(color = "darkblue", size = 1) + 
  geom_point(color = "red", size = 3) +     
  labs(
    title = "Tren Jumlah Penumpang per Unit Bus",
    x = "Nama Bus",
    y = "Jumlah Penumpang"
  ) +
  theme_minimal() +
  geom_text(aes(label = Jumlah_Penumpang), vjust = -1, color = "black", size = 3.5)
## Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
## ℹ Please use `linewidth` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
# Menampilkan plot
print(plot_line)

Penjelasan :

Dari diagram diatas, terlihat bahwa rute Harmoni memiliki kemiringann paling curam yang berarti penambahan jumlah penumpang lebih cepat meningkatkan waktu keterlambatan dibandingkan rute lain. Secara keseluruhan, grafik ini menggambarkan bahwa semakin padat penumpang suatu bus, semakin besar kemungkinan bus mengalami keterlambatan waktu tiba, dengan perbedaan tingkat keterlambatan yang dipengaruhi oleh masing-masing rute.

3.7 Density Plot

Definisi :

Density plot (plot kepadatan) adalah salah satu jenis grafik dalam statistik dan visualisasi data yang digunakan untuk menunjukkan distribusi suatu variabel kontinu. Grafik ini merupakan versi halus dari histogram, karena menggunakan fungsi estimasi kepadatan kernel (kernel density estimation / KDE) untuk memperkirakan seberapa padat data berada di setiap rentang nilai.

Aturan Penggunaan :

  • Menggunakan data kontinu.
  • Cocok untuk membandingkan beberapa distribusi antarkelompok.
  • Gunakan alpha < 1 jika ada beberapa kategori.
  • Nilai sumbu Y menunjukkan kepadatan.

Kelebihan Density Plot :

  • Menampilkan distribusi data dengan halus.
  • Mudah membandingkan beberapa kelompok.
  • Tidak tergantung pada lebar bin seperti histogram.
  • Memberikan gambaran probabilitas relatif.

Kekurangan Density Plot :

  • Tidak menunjukkan jumlah data sebenarnya.
  • Kurang akurat untuk data kecil (n < 20).
  • Sulit dipahami pemula.
  • Tidak cocok untuk data kategorik atau diskrit.
library(ggplot2)

plot_keterlambatan <- ggplot(data_transportasi, aes(x = Waktu_Keterlambatan)) +
  geom_density(fill = "blue", color = "blue", alpha = 0.7) +
  labs(
    title = "Density Plot Waktu Keterlambatan Bus (Keseluruhan)",
    x = "Waktu Keterlambatan (menit)",
    y = "Kepadatan"
  ) +
  theme_minimal()

# Menampilkan 
print(plot_keterlambatan)

# Jumlah Penumpang (Keseluruhan)
plot_penumpang <- ggplot(data_transportasi, aes(x = Jumlah_Penumpang)) +
  geom_density(fill = "orange", color = "orange", alpha = 0.7) +
  labs(
    title = "Density Plot Jumlah Penumpang Bus",
    x = "Jumlah Penumpang",
    y = "Kepadatan"
  ) +
  theme_minimal()

# Menampilkan
print(plot_penumpang)

#Waktu Keterlambatan berdasarkan Nama Rute (Bergrup)
plot_keterlambatan_rute <- ggplot(data_transportasi, aes(x = Waktu_Keterlambatan, fill = Nama_Rute)) +
  geom_density(alpha = 0.5, position = "identity") + # position="identity" memungkinkan kurva tumpang tindih
  labs(
    title = "Density Plot Waktu Keterlambatan berdasarkan Rute",
    x = "Waktu Keterlambatan (menit)",
    y = "Kepadatan"
  ) +
  scale_fill_manual(values = c("Rute Merdeka" = "green", "Rute Harmoni" = "pink", "Rute Grogol" = "lightblue")) +
  theme_minimal()

# Menampilkan
print(plot_keterlambatan_rute)

Penjelasan :

Berdasarkan density plot diatas, menunjukkan bahwa rute Harmoni memiliki tingkat keterlambatan tertinggi karena jumlah penumpangnya paling banyak. Rute Merdeka juga menunjukkan performa paling baik karena waktu keterlambatannya tetap rendah meski jumlah penumpang bervariasi.Density plot ini membantu menunjukkan sebaran dan konsentrasi data antar rute, sehingga kita bisa dengan mudah melihat rute mana yang paling padat dan mana yang paling efisien.

3.8 Ridgeline Plot

Definisi :

Ridgeline Plot adalah visualisasi data di mana beberapa plot kerapatan (density plots) ditumpuk secara vertikal dan sedikit tumpang tindih. Setiap “lapisan” (ridge) mewakili distribusi data dari satu kategori atau kelompok, memungkinkan perbandingan bentuk, posisi puncak (modus), dan penyebaran (varians) antar kelompok.

Aturan penggunaan :

  • Membandingkan Distribusi.
  • Data Deret Waktu (Time Series) Kuantitatif menunjukkan perubahan dalam distribusi variabel dari waktu ke waktu.
  • Memvisualisasikan Data Numerik Kontinu.

Kelebihan :

  • Efisiensi Ruang: Dapat menampilkan banyak distribusi secara ringkas dalam ruang yang terbatas.
  • Perbandingan yang Jelas: Tumpang tindihnya plot kerapatan menyoroti perbedaan utama dalam bentuk dan lokasi puncak distribusi antar kelompok.
  • Menarik Secara Visual: Estetika yang unik membuat plot ini menarik dan mudah dipahami.
  • Menunjukkan Tren: Efektif untuk menunjukkan perubahan tren distribusi melintasi kategori yang berurutan (misalnya, waktu).

Kekurangan :

  • Sulit Dibaca Jika Terlalu Banyak Kategori.
  • Data Kuantil Tertentu Sulit Dilihat: Nilai kuantil spesifik (median, kuartil) atau nilai data individual (seperti yang terlihat pada Box Plot) tidak langsung terlihat.
  • Membutuhkan Interpretasi yang Hati-Hati: Tumpang tindih dapat menyebabkan beberapa bagian kurva tersembunyi (occlusion), yang mungkin menyembunyikan detail distribusi di balik kurva di depannya.
  • Kurang Cocok untuk Data Sedikit: Kurva kerapatan (density) mungkin tidak akurat atau informatif jika data untuk setiap kategori terlalu sedikit.
library(ggplot2)
library(ggridges)

data_transportasi$Nama_Rute <- factor(
  data_transportasi$Nama_Rute, 
  levels = c("Rute Merdeka", "Rute Harmoni", "Rute Grogol")
)

# 2. Membuat Ridgeline Plot
plot_ridgeline <- ggplot(
  data_transportasi, 
  aes(
    x = Waktu_Keterlambatan, 
    y = Nama_Rute, 
    fill = Nama_Rute 
  )
) +
  geom_density_ridges(
    alpha = 0.8, 
    scale = 1.5, 
    rel_min_height = 0.01 
  ) +
  labs(
    title = "Distribusi Waktu Keterlambatan Bus Berdasarkan Rute",
    x = "Waktu Keterlambatan (menit)",
    y = "Nama Rute"
  ) +
  theme_ridges() +
  theme(
    legend.position = "none", 
    plot.title = element_text(hjust = 0.5)
  )

# Menampilkan plot
print(plot_ridgeline)
## Picking joint bandwidth of 2.03

Penjelasan :

Ridgeline plot yang dihasilkan memvisualisasikan perbedaan dalam distribusi Waktu Keterlambatan di antara ketiga Rute Bus yang berbeda yaitu Rute Merdeka, Rute Harmoni, dan Rute Grogol. Dari bentuk puncak (kepadatan) dan posisinya pada sumbu X (Waktu Keterlambatan), kita dapat membandingkan tren keterlambatan antar rute. Puncak yang berada paling jauh ke kanan (nilai X besar) menunjukkan rute tersebut (Rute Harmoni) paling sering mengalami keterlambatan yang lebih lama. Puncak yang berada paling dekat dengan nol (nilai X kecil) mengindikasikan rute tersebut (Rute Grogol) cenderung memiliki keterlambatan yang lebih singkat atau paling tepat waktu.Secara keseluruhan, plot ini menyoroti bahwa rata-rata dan variasi keterlambatan sangat berbeda antar rute, di mana Rute Harmoni tampak paling rentan terhadap penundaan yang signifikan.

4 . Kesimpulan

Dapat dilihat dari hasil analisis dan visualisasi data bahwa jika sebuah transportasi publik (bus) membawa penumpang yang cukup banyak akan membuat bus tersebut mengalami kendala dalam waktu keterlambatan yang cukup tinggi, hal ini di karenakan bus harus berhenti di setiap rute, sedangkan jika penumpang lebih sedikit kemungkinan waktu keterlambatan bus akan lebih kecil. Kondisi operasional transportasi publik (bus) berperan penting terhadap tingkat efisiensi dan pemanfaatan layanan. Dan dari visualisasi ini membantu kita dalam melihat hubungan antara jumlah penumpang dan waktu keterlambatan, serta memberikan dasar informasi bagi pengambilan keputusan.

LS0tDQp0aXRsZTogIlZpc3VhbGlzYXNpIERhdGEgRGFzYXIiICMgTWFpbiB0aXRsZSBvZiB0aGUgZG9jdW1lbnQNCnN1YnRpdGxlOiAiQXNzaWdubWVudCB+IFdlZWsgNCIgIyBTdWJ0aXRsZSBvciB0b3BpYyBmb3Igd2VlayAyDQphdXRob3I6IA0KLSAiQWRpbmRhIEFkZWxpYSBGIg0KLSAiQW5nZWxpY2EgRmxvcmVudGluYSIgDQotICJCb21hIFNhdHJpbyIgDQotICJDaHJpY3llc2lhIFcuRi5VdmFzIiANCi0gIlN5YWZpZiBBem1pIExvbnRvaCIgICAgICAgICAgIyBSZXBsYWNlIHdpdGggeW91ciBmdWxsIG5hbWUNCmRhdGU6ICAiYHIgZm9ybWF0KFN5cy5EYXRlKCksICclQiAlZCwgJVknKWAiICMgQXV0byBkaXNwbGF5cyB0aGUgY3VycmVudCBkYXRlDQpvdXRwdXQ6ICAgICAgICAgICAgICAgICAgICAgICAgICMgT3V0cHV0IHNlY3Rpb24gZGVmaW5lcyB0aGUgZm9ybWF0IGFuZCBsYXlvdXQgDQogIHJtZGZvcm1hdHM6OnJlYWR0aGVkb3duOiAgICAgICMgaHR0cHM6Ly9naXRodWIuY29tL2p1YmEvcm1kZm9ybWF0cw0KICAgIHNlbGZfY29udGFpbmVkOiB0cnVlICAgICAgICAjIEVtYmVkcyBhbGwgcmVzb3VyY2VzIChDU1MsIEpTLCBpbWFnZXMpIA0KICAgIHRodW1ibmFpbHM6IHRydWUgICAgICAgICAgICAjIERpc3BsYXlzIGltYWdlIHRodW1ibmFpbHMgaW4gdGhlIGRvYw0KICAgIGxpZ2h0Ym94OiB0cnVlICAgICAgICAgICAgICAjIEVuYWJsZXMgY2xpY2sgdG8gZW5sYXJnZSBpbWFnZXMNCiAgICBnYWxsZXJ5OiB0cnVlICAgICAgICAgICAgICAgIyBHcm91cHMgaW1hZ2VzIGludG8gYW4gaW50ZXJhY3RpdmUgZ2FsbGVyeQ0KICAgIG51bWJlcl9zZWN0aW9uczogdHJ1ZSAgICAgICAjIEF1dG9tYXRpY2FsbHkgbnVtYmVycyBhbGwgc2VjdGlvbnMNCiAgICBsaWJfZGlyOiBsaWJzICAgICAgICAgICAgICAgIyBEaXJlY3Rvcnkgd2hlcmUgSmF2YVNjcmlwdC9DU1MgbGlicmFyaWVzDQogICAgZGZfcHJpbnQ6ICJwYWdlZCIgICAgICAgICAgICMgRGlzcGxheXMgZGF0YSBmcmFtZXMgYXMgaW50ZXJhY3RpdmUgcGFnZWQgDQogICAgY29kZV9mb2xkaW5nOiAic2hvdyIgICAgICAgICMgQWxsb3dzIGZvbGRpbmcvdW5mb2xkaW5nIFIgY29kZSBibG9ja3MgDQogICAgY29kZV9kb3dubG9hZDogeWVzICAgICAgICAgICMgQWRkcyBhIGJ1dHRvbiB0byBkb3dubG9hZCBhbGwgUiBjb2RlDQotLS0NCg0KPGltZyBpZD0iRm90byIgc3JjPSJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vYm9tYXNzMTExNi9LZWxvbXBvay0yL21haW4vS2Vsb21wb2tfMiUyMFN0YXRpc3Rpa2EuanBnIiBhbHQ9IkxvZ28iIHN0eWxlPSJ3aWR0aDoyMDBweDsgZGlzcGxheTogYmxvY2s7IG1hcmdpbjogYXV0bzsiPg0KDQojIC4gUGVuZGFodWx1YW4NCg0KVmlzdWFsaXNhc2kgZGF0YSB0cmFuc3BvcnRhc2kgcHVibGlrIGFkYWxhaCB0ZWtuaWsgcGVueWFqaWFuIGluZm9ybWFzaSBkYWxhbSBiZW50dWsgZGlhZ3JhbSB1bnR1ayBtZW1wZXJtdWRhaCBwZW1haGFtYW4sIGFuYWxpc2lzLCBkYW4gcGVuZ2FtYmlsYW4gDQprZXB1dHVzYW4uIA0KDQpUdWp1YW5ueWEgbWVsaXB1dGkgOg0KDQotIE1lbnllZGVyaGFuYWthbiBkYXRhIGFnYXIgbXVkYWggZGlwYWhhbWkNCi0gTWVuZ3VuZ2thcCB0cmVuIHBlbmdndW5hYW4gZGFuIGtldGVybGFtYmF0YW4gb3BlcmFzaW9uYWwNCi0gTWVuZHVrdW5nIHBlcmVuY2FuYWFuIGRhbiBrZWJpamFrYW4gdHJhbnNwb3J0YXNpIHlhbmcgbGViaWggZWZpc2llbg0KDQpLb250ZWtzIGthc3VzIDoNCg0KLSBQZW5lbGl0aSBhdGF1IG1haGFzaXN3YSB5YW5nIGluZ2luIG1lbmdhbmFsaXNpcyBwb2xhIG1vYmlsaXRhcyBtYXN5YXJha2F0Lg0KLSBPcGVyYXRvciB0cmFuc3BvcnRhc2kgcHVibGlrDQoNCkRlbmdhbiB2aXN1YWxpc2FzaSwgZGF0YSB0cmFuc3BvcnRhc2kgbWVuamFkaSBhbGF0IHN0cmF0ZWdpcyB1bnR1ayANCm1lbmluZ2thdGthbiBsYXlhbmFuIGRhbiByZXNwb25zIHRlcmhhZGFwIGtlYnV0dWhhbiBwdWJsaWsuDQoNCiMgLiBQZXJzaWFwYW4gRGF0YQ0KDQpgYGB7cn0NCg0KIyMgRGF0YSBUcmFuc3BvcnRhc2kgUHVibGlrDQpsaWJyYXJ5KERUKQ0KDQpkYXRhX3RyYW5zcG9ydGFzaSA8LSBkYXRhLmZyYW1lKA0KICBObyA9IDE6MTAsDQogIE5hbWFfQnVzID0gYygiQnVzIEEiLCAiQnVzIEIiLCAiQnVzIEMiLCAiQnVzIEQiLA0KICAgICAgICAgICAgICAgIkJ1cyBFIiwgIkJ1cyBGIiwgIkJ1cyBHIiwgIkJ1cyBIIiwNCiAgICAgICAgICAgICAgICJCdXMgSSIsICJCdXMgSiIpLA0KICBKdW1sYWhfUGVudW1wYW5nID0gYyg4NywgMTIwLCA5NSwgMTEwLCA3OCwgDQogICAgICAgICAgICAgICAgICAgICAgIDEwNSwgNjAsIDE0MCwgMTAyLCA4NSksDQogIFdha3R1X0tldGVybGFtYmF0YW4gPSBjKDQuMywgMTEuMywgNi4yLCAxMC44LCAyLjUsIA0KICAgICAgICAgICAgICAgICAgICAgICAgIDkuNSwgMS4wLCAxNS42LCA4LjUsIDMuMiksDQogIA0KICBOYW1hX1J1dGUgPSBjKCJSdXRlIE1lcmRla2EiLCAiUnV0ZSBIYXJtb25pIiwgIlJ1dGUgR3JvZ29sIiwNCiAgICAgICAgICAgICAgICAgIlJ1dGUgTWVyZGVrYSIsICJSdXRlIEhhcm1vbmkiLCAiUnV0ZSBHcm9nb2wiLA0KICAgICAgICAgICAgICAgICAiUnV0ZSBNZXJkZWthIiwgIlJ1dGUgSGFybW9uaSIsICJSdXRlIEdyb2dvbCIsDQogICAgICAgICAgICAgICAgICJSdXRlIE1lcmRla2EiKSwNCiAgDQogIFdha3R1X0tlYmVyYW5na2F0YW4gPSBjKCJQYWdpIiwgIlBhZ2kiLCAiU2lhbmciLCAiU2lhbmciLCAiU29yZSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICJTb3JlIiwgIk1hbGFtIiwgIk1hbGFtIiwgIlBhZ2kiLCAiU2lhbmciKQ0KKQ0KDQojIE1lbmFtcGlsa2FuIGRhdGENCnByaW50KGRhdGFfdHJhbnNwb3J0YXNpKQ0KDQojIERpc3BsYXkgdGhlIGRhdGEgZnJhbWUgYXMgYSBuZWF0IHRhYmxlDQpkYXRhdGFibGUoZGF0YV90cmFuc3BvcnRhc2ksIA0KICAgICAgICAgIGNhcHRpb24gPSAiVGFibGUgb2YgRGF0YSAgUHVibGljIFRyYW5zcG9ydGF0aW9ucyIsDQogICAgICAgICAgcm93bmFtZXMgPSBGQUxTRSkNCmBgYA0KDQojIC4gVmlzdWFsaXNhc2kNCiMjIEJhciBDaGFydA0KDQpEZWZpbmlzaSA6DQoNCkJhciBjaGFydCBhdGF1IGRpYWdyYW0gYmF0YW5nIGFkYWxhaCB2aXN1YWxpc2FzaSBkYXRhIHlhbmcgbWVuZ2d1bmFrYW4gYmF0YW5nICh2ZXJ0aWthbCBhdGF1IGhvcml6b250YWwpIHVudHVrIG1lbnVuanVra2FuIG5pbGFpIGRhcmkgc3VhdHUga2F0ZWdvcmkuIFNldGlhcCBiYXRhbmcgbWV3YWtpbGkgc2F0dSBrYXRlZ29yaSwgZGFuIHBhbmphbmcgYmF0YW5nIHNlc3VhaSBkZW5nYW4gbmlsYWkgYXRhdSBmcmVrdWVuc2kgZGF0YS4gDQoNCkF0dXJhbiBQZW5nZ3VuYWFuIEJhciBDaGFydCA6DQoNCi0gR3VuYWthbiB1bnR1ayBkYXRhIGthdGVnb3Jpa2FsLCBidWthbiBkYXRhIG51bWVyaWsga29udGludS4NCi0gU2V0aWFwIGJhdGFuZyBtZXdha2lsaSBzYXR1IGthdGVnb3JpLCBwYW5qYW5nbnlhIG1lbnVuanVra2FuIG5pbGFpIChmcmVrdWVuc2kgYXRhdSBqdW1sYWgpLiANCi0gQmF0YW5nIHRpZGFrIGJvbGVoIG1lbnllbnR1aCBzYXR1IHNhbWEgbGFpbiAoYmVkYSBkZW5nYW4gaGlzdG9ncmFtKS4gDQotIEthdGVnb3JpIHNlYmFpa255YSBiZXJqdW1sYWggdGVyYmF0YXMgYWdhciBncmFmaWsgdGV0YXAgbXVkYWggZGliYWNhLiANCi0gR3VuYWthbiBsYWJlbCB5YW5nIGplbGFzIHBhZGEgc3VtYnUgWCBkYW4gWS4NCg0KS2VsZWJpaGFuIEJhciBDaGFydCA6DQoNCi0gTXVkYWggZGlwYWhhbWkuDQotIE1lbXVkYWhrYW4gcGVyYmFuZGluZ2FuIGFudGFyIGthdGVnb3JpLg0KLSBDb2NvayB1bnR1ayBkYXRhIGthdGVnb3Jpa2FsLg0KLSBGbGVrc2liZWwuDQotIE11ZGFoIGRpa3VzdG9taXNhc2kuDQoNCktla3VyYW5nYW4gQmFyIENoYXJ0IDoNCg0KLSBUaWRhayBjb2NvayB1bnR1ayBkYXRhIGtvbnRpbnUuDQotIEt1cmFuZyBlZmVrdGlmIHVudHVrIGJhbnlhayBrYXRlZ29yaS4NCi0gU3VsaXQgbWVudW5qdWtrYW4gdHJlbiB3YWt0dS4NCi0gT3ZlcnBsb3R0aW5nLg0KLSBTZW5zaXRpZiB0ZXJoYWRhcCBza2FsYSB2aXN1YWwuDQoNCmBgYHtyfQ0KbGlicmFyeShnZ3Bsb3QyKQ0KDQojIE1lbWJ1YXQgYmFyIGNoYXJ0DQpnZ3Bsb3QoZGF0YV90cmFuc3BvcnRhc2ksIGFlcyh4ID0gTmFtYV9CdXMsIHkgPSBKdW1sYWhfUGVudW1wYW5nLCBmaWxsID0gV2FrdHVfS2V0ZXJsYW1iYXRhbikpICsNCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIHdpZHRoID0gMC42LCBjb2xvciA9ICJibGFjayIpICsNCiAgbGFicygNCiAgICB0aXRsZSA9ICJKdW1sYWggUGVudW1wYW5nIGRhbiBXYWt0dSBLZXRlcmxhbWJhdGFuIEJ1cyIsDQogICAgeCA9ICJOYW1hIEJ1cyIsDQogICAgeSA9ICJKdW1sYWggUGVudW1wYW5nIiwNCiAgICBmaWxsID0gIktldGVybGFtYmF0YW4gKG1lbml0KSINCiAgKSArDQogIHRoZW1lX21pbmltYWwoKQ0KDQpgYGANCg0KUGVuamVsYXNhbiA6DQoNCkJlcmRhc2Fya2FuIGRpYWdyYW0gZGlhdGFzLCBkYXBhdCBkaXNpbXB1bGthbiBiYWh3YSBzZW1ha2luIGJhbnlhayBqdW1sYWggcGVudW1wYW5nIHlhbmcgZGlhbmdrdXQgb2xlaCBidXMsIG1ha2Egd2FrdHUga2V0ZXJsYW1iYXRhbm55YSBjZW5kZXJ1bmcgc2VtYWtpbiBsYW1hIHNlcGVydGkgQnVzIEggeWFuZyBtZW5nYWxhbWkga2V0ZXJsYW1iYXRhbiB3YWt0dSBzZWxhbWEgMTUgbWVuaXQgZGVuZ2FuIGp1bWxhaCBwZW51bXBhbmcgMTQwIG9yYW5nLCBzZWRhbmdrYW4gYnVzIGRlbmdhbiBqdW1sYWggcGVudW1wYW5nIHlhbmcgbGViaWggc2VkaWtpdCBjZW5kZXJ1bmcgbGViaWggdGVwYXQgd2FrdHUgc2VwZXJ0aSBCdXMgRyB5YW5nIG1lbmdhbGFtaSBrZXRlcmxhbWJhdGFuIHdha3R1IGhhbnlhIDEgbWVuaXQgZGVuZ2FuIGp1bWxhaCBwZW51bXBhbmcgNjAgb3JhbmcuIEhhbCBpbmkgbWVudW5qdWtrYW4gYWRhbnlhIGtlbXVuZ2tpbmFuIGh1YnVuZ2FuIGFudGFyYSBiYW55YWtueWEgcGVudW1wYW5nIGRlbmdhbiBrZXRlcmxhbWJhdGFuIGtlZGF0YW5nYW4gYnVzLg0KDQoNCiMjIEhpc3RvZ3JhbQ0KDQpEZWZpbmlzaSA6DQoNCkhpc3RvZ3JhbSBhZGFsYWggamVuaXMgZ3JhZmlrIHlhbmcgZGlndW5ha2FuIHVudHVrIG1lbmFtcGlsa2FuIGRpc3RyaWJ1c2kgZnJla3VlbnNpIGRhcmkgZGF0YSBudW1lcmlrIChhbmdrYSkuIEdyYWZpayBpbmkgbWVudW5qdWtrYW4gc2ViZXJhcGEgc2VyaW5nIG5pbGFpLW5pbGFpIGRhbGFtIGRhdGEgbXVuY3VsIGRhbGFtIHJlbnRhbmcgKGludGVydmFsKSB0ZXJ0ZW50dSwgeWFuZyBkaXNlYnV0IGJpbi4NCg0KQXR1cmFuIFBlbmdndW5hYW4gOg0KDQotIERhdGEgeWFuZyBkaWd1bmFrYW4gaGFydXMgYmVyc2lmYXQgbnVtZXJpayAoYW5na2EpLg0KLSBEYXRhIGRpYmFnaSBrZSBkYWxhbSBrZWxvbXBvayBuaWxhaSAoaW50ZXJ2YWwvYmluKS4NCi0gVGluZ2dpIGJhdGFuZyBtZW51bmp1a2thbiBqdW1sYWggZGF0YSBkYWxhbSBzZXRpYXAga2Vsb21wb2suDQotIEJhdGFuZyBoYXJ1cyBiZXJkZW1wZXRhbiB0YW5wYSBqYXJhayBhbnRhciBiYXRhbmcuDQotIEp1bWxhaCBrZWxvbXBvayBoYXJ1cyBkaXRlbnR1a2FuIHNlY2FyYSB0ZXBhdCAodGlkYWsgdGVybGFsdSBzZWRpa2l0IGF0YXUgdGVybGFsdSBiYW55YWspLg0KDQpLZWxlYmloYW4gSGlzdG9ncmFtIDoNCg0KLSBDZXBhdCBtZW5naWRlbnRpZmlrYXNpIHBvbGEgZGlzdHJpYnVzaSAobm9ybWFsLG1pcmluZykgZGFuIG5pbGFpIGVrc3RyZW0gKG91dGxpZXIpDQotIE11ZGFoIGRpIHBhaGFtaSBkYW4gYWxhdCB5YW5nIGVmZWt0aWYgdW50dWsgbWVtYW50YXUga3VhbGl0YXMgYXRhdSBrb25zaXN0ZW5zaSBwcm9zZXMuDQotIE1lbXVuZ2tpbmthbiBwZXJiYW5kaW5nYW4gdmlzdWFsIGFudGFyIGRhdGFzZXQgeWFuZyBiZXJiZWRhLg0KDQpLZWt1cmFuZ2FuIEhpc3RvZ3JhbSA6DQoNCi0gSW50ZXJwcmV0YXNpIHNhbmdhdCBiZXJnYW50dW5nIHBhZGEgbGViYXIgYmlucyB5YW5nIGRpcGlsaWguDQotIE1lbnllYmFia2FuIGhpbGFuZ255YSBkZXRhaWwgZGF0YSBpbmRpdmlkdSBrYXJlbmEgZGlrZWxvbXBva2thbiBkYWxhbSBpbnRlcnZhbC4NCi0gVGlkYWsgY29jb2sgdW50dWsgZGF0YSBrYXRlZ29yaWthbCAoZ3VuYWthbiBiYXIgY2hhcnQpLg0KDQpgYGAge3J9DQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KGRwbHlyKQ0KbGlicmFyeSh0aWR5cikNCg0KIyBVYmFoIGRhdGEgamFkaSBmb3JtYXQgbG9uZyB1bnR1ayBkdWEgdmFyaWFiZWwNCmRhdGFfbG9uZyA8LSBkYXRhX3RyYW5zcG9ydGFzaSAlPiUNCiAgc2VsZWN0KEp1bWxhaF9QZW51bXBhbmcsIFdha3R1X0tldGVybGFtYmF0YW4pICU+JQ0KICBwaXZvdF9sb25nZXIoY29scyA9IGV2ZXJ5dGhpbmcoKSwNCiAgICAgICAgICAgICAgIG5hbWVzX3RvID0gIlZhcmlhYmVsIiwNCiAgICAgICAgICAgICAgIHZhbHVlc190byA9ICJOaWxhaSIpDQoNCiMgUGxvdCBoaXN0b2dyYW0gZ2FidW5nYW4gZGVuZ2FuIHdhcm5hIGJlcmRhc2Fya2FuIHZhcmlhYmVsDQpnZ3Bsb3QoZGF0YV9sb25nLCBhZXMoeCA9IE5pbGFpLCBmaWxsID0gVmFyaWFiZWwpKSArDQogIGdlb21faGlzdG9ncmFtKGNvbG9yID0gImJsYWNrIiwgcG9zaXRpb24gPSAiaWRlbnRpdHkiLCBiaW5zID0gMjApICsNCiAgbGFicyh0aXRsZSA9ICJIaXN0b2dyYW0gSnVtbGFoIFBlbnVtcGFuZyBCdXMgZGFuIFdha3R1IEtldGVybGFtYmF0YW4gQnVzIiwNCiAgICAgICB4ID0gJ0p1bWxhaCBwZW51bXBhbmcnLA0KICAgICAgIHkgPSAiV2FrdHUga2V0ZXJsYW1iYXRhbiIsDQogICAgICAgZmlsbCA9ICJWYXJpYWJlbCIpICsNCiAgdGhlbWVfbWluaW1hbCgpDQoNCmBgYA0KDQpQZW5qZWxhc2FuIDoNCg0KQmVyZGFzYXJrYW4gaGlzdG9ncmFtIGRpIGF0YXMsIGRhcGF0IGRpc2ltcHVsa2FuIGJhaHdhIG1heW9yaXRhcyBidXMgbWVtaWxpa2kgd2FrdHUga2V0ZXJsYW1iYXRhbiB5YW5nIHJlbGF0aWYgc2luZ2thdCAoMOKAkzE1IG1lbml0KSwgc2VkYW5na2FuIGp1bWxhaCBwZW51bXBhbmcgYnVzIGN1a3VwIGJlcnZhcmlhc2kgYW50YXJhIDUwIGhpbmdnYSAxNTAgb3JhbmcgcGVyIGJ1cy4NCkhhbCBpbmkgbWVudW5qdWtrYW4gYmFod2Ega2V0ZXJsYW1iYXRhbiBidXMgdGlkYWsgdGVybGFsdSBiZXNhciBtZXNraXB1biB0ZXJkYXBhdCBwZXJiZWRhYW4ganVtbGFoIHBlbnVtcGFuZyBhbnRhcmJ1cy4NCg0KIyMgQm94cGxvdA0KDQpEZWZpbnNpIDoNCg0KQm94cGxvdCwgYXRhdSBzZXJpbmcganVnYSBkaXNlYnV0IGRpYWdyYW0ga290YWsgZ2FyaXMgKGJveCBhbmQgd2hpc2tlciBwbG90KSwgYWRhbGFoIHNhbGFoIHNhdHUgbWV0b2RlIGdyYWZpcyBkYWxhbSBzdGF0aXN0aWthIGRlc2tyaXB0aWYgeWFuZyBkaWd1bmFrYW4gdW50dWsgbWVuZ2dhbWJhcmthbiBkaXN0cmlidXNpIHNla3VtcHVsYW4gZGF0YSBudW1lcmlrIGJlcmRhc2Fya2FuIHJpbmdrYXNhbiBsaW1hIGFuZ2thIHV0YW1hbnlhLg0KR3JhZmlrIGluaSBzYW5nYXQgYmVyZ3VuYSB1bnR1ayBtZW1iZXJpa2FuIGdhbWJhcmFuIHZpc3VhbCB5YW5nIGVmZWt0aWYgZGFuIGNlcGF0Lg0KDQpBdHVyYW4gUGVuZ2d1bmFhbiA6DQoNCi0gRGF0YSB5YW5nIGRpZ3VuYWthbiBoYXJ1cyBudW1lcmlrIChiZXJ1cGEgYW5na2EpLg0KLSBEYXBhdCBkaWd1bmFrYW4gdW50dWsgbWVtYmFuZGluZ2thbiBkYXRhIGFudGFyIGtlbG9tcG9rLg0KLSBNZW5hbXBpbGthbiBsaW1hIHVrdXJhbiBzdGF0aXN0aWsgdXRhbWE6IG1pbmltdW0sIGt1YXJ0aWwgMSAoUTEpLCBtZWRpYW4sIGt1YXJ0aWwgMyAoUTMpLCBkYW4gbWFrc2ltdW0uDQotIE91dGxpZXIgKHBlbmNpbGFuKSBkaXRhbXBpbGthbiBzZWJhZ2FpIHRpdGlrIGRpIGx1YXIgcmVudGFuZyBub3JtYWwgZGF0YS4NCi0gU3VtYnUgWCBiZXJpc2kga2F0ZWdvcmksIHN1bWJ1IFkgYmVyaXNpIG5pbGFpIG51bWVyaWsuDQoNCktlbGViaWhhbiBCb3hwbG90IDoNCg0KLSBNZW55YWppa2FuIHJpbmdrYXNhbiBkYXRhIHNlY2FyYSBjZXBhdCBkYW4gc2VkZXJoYW5hLg0KLSBEYXBhdCBtZW5kZXRla3NpIHBlbmNpbGFuIChvdXRsaWVyKSBkZW5nYW4gamVsYXMuDQotIENvY29rIHVudHVrIG1lbWJhbmRpbmdrYW4gcGVueWViYXJhbiBkYXRhIGFudGFyIGtlbG9tcG9rLg0KLSBUaWRhayBtZW1lcmx1a2FuIGFzdW1zaSBkaXN0cmlidXNpIGRhdGEuDQotIE11ZGFoIGRpYmFjYSBkYW4gZWZpc2llbiBkYWxhbSBtZW5hbXBpbGthbiBkYXRhIGJlc2FyLg0KDQpLZWt1cmFuZ2FuIEJveHBsb3QgOiANCg0KLSBUaWRhayBtZW51bmp1a2thbiBiZW50dWsgZGlzdHJpYnVzaSBkYXRhIHNlY2FyYSByaW5jaS4NCi0gS3VyYW5nIGluZm9ybWF0aWYgamlrYSBqdW1sYWggZGF0YSBzZWRpa2l0Lg0KLSBUaWRhayBtZW5hbXBpbGthbiBqdW1sYWggZGF0YSBzZWNhcmEgZWtzcGxpc2l0Lg0KLSBLdXJhbmcgaW50dWl0aWYgYmFnaSBvcmFuZyB5YW5nIGJlbHVtIG1lbWFoYW1pIHN0YXRpc3Rpay4NCi0gT3V0bGllciB5YW5nIGJhbnlhayBiaXNhIHNhbGluZyBtZW51bXB1ayBkYW4gc3VsaXQgZGliZWRha2FuLg0KDQpgYGB7cn0NCmxpYnJhcnkoZ2dwbG90MikNCg0KIyBCdWF0IGthdGVnb3JpIGp1bWxhaCBwZW51bXBhbmcgYWdhciBiaXNhIGRpYmFuZGluZ2thbiBkYWxhbSBib3hwbG90DQpkYXRhX3RyYW5zcG9ydGFzaSRLYXRlZ29yaV9QZW51bXBhbmcgPC0gY3V0KA0KICBkYXRhX3RyYW5zcG9ydGFzaSRKdW1sYWhfUGVudW1wYW5nLA0KICBicmVha3MgPSBjKDAsIDgwLCAxMTAsIDE1MCksDQogIGxhYmVscyA9IGMoIlNlZGlraXQiLCAiU2VkYW5nIiwgIkJhbnlhayIpDQopDQoNCiMgTWVtYnVhdCBib3hwbG90IGdhYnVuZ2FuIGp1bWxhaCBwZW51bXBhbmcgJiB3YWt0dSBrZXRlcmxhbWJhdGFuDQpnZ3Bsb3QoZGF0YV90cmFuc3BvcnRhc2ksDQogICAgICAgYWVzKHggPSBLYXRlZ29yaV9QZW51bXBhbmcsDQogICAgICAgICAgIHkgPSBXYWt0dV9LZXRlcmxhbWJhdGFuLA0KICAgICAgICAgICBmaWxsID0gS2F0ZWdvcmlfUGVudW1wYW5nKSkgKw0KICBnZW9tX2JveHBsb3Qod2lkdGggPSAwLjYsIGNvbG9yID0gImJsYWNrIikgKw0KICBnZW9tX2ppdHRlcihhZXMoc2l6ZSA9IEp1bWxhaF9QZW51bXBhbmcpLCAjIFRpdGlrIHVrdXJhbiBzZXN1YWkganVtbGFoIHBlbnVtcGFuZw0KICAgICAgICAgICAgICBjb2xvciA9ICJjaG9jb2xhdGU0IiwNCiAgICAgICAgICAgICAgYWxwaGEgPSAwLjYsDQogICAgICAgICAgICAgIHdpZHRoID0gMC4xNSkgKw0KICBsYWJzKA0KICAgIHRpdGxlID0gIkJveHBsb3QgSnVtbGFoIFBlbnVtcGFuZyBCdXMgZGFuIFdha3R1IEtldGVybGFtYmF0YW4gQnVzIiwNCiAgICB4ID0gIkp1bWxhaCBQZW51bXBhbmcgQnVzIiwNCiAgICB5ID0gIldha3R1IEtldGVybGFtYmF0YW4gQnVzIChtZW5pdCkiLA0KICAgIHNpemUgPSAiSnVtbGFoIFBlbnVtcGFuZyINCiAgKSArDQogIHRoZW1lX21pbmltYWwoKQ0KDQpgYGANCg0KUGVuamVsYXNhbiA6DQoNCkJlcmRhc2Fya2FuIGJveHBsb3QgZGkgYXRhcywgZGFwYXQgZGlzaW1wdWxrYW4gYmFod2Egc2VtYWtpbiBiYW55YWsganVtbGFoIHBlbnVtcGFuZyB5YW5nIGRpYW5na3V0IGJ1cywgbWFrYSB3YWt0dSBrZXRlcmxhbWJhdGFuIGNlbmRlcnVuZyBzZW1ha2luIGxhbWEuDQpCdXMgZGVuZ2FuIHBlbnVtcGFuZyBzZWRpa2l0IGNlbmRlcnVuZyBsZWJpaCB0ZXBhdCB3YWt0dSwgc2VkYW5na2FuIGJ1cyBkZW5nYW4gcGVudW1wYW5nIHNlZGFuZyBhdGF1IGJhbnlhayBtZW1pbGlraSB2YXJpYXNpIGtldGVybGFtYmF0YW4geWFuZyBsZWJpaCBiZXNhci4NClRlcmRhcGF0IGp1Z2EgYmViZXJhcGEgYnVzIGRlbmdhbiBwZW51bXBhbmcgYmFueWFrIHlhbmcgbWVuZ2FsYW1pIGtldGVybGFtYmF0YW4gZWtzdHJlbSAob3V0bGllciksIG1lbnVuanVra2FuIGFkYW55YSBwb3RlbnNpIGtlbmRhbGEgb3BlcmFzaW9uYWwgc2FhdCBqdW1sYWggcGVudW1wYW5nIHRlcmxhbHUgdGluZ2dpLg0KDQojIyBQaWUgQ2hhcnQNCg0KRGVmaW5pc2kgOg0KDQpQaWUgY2hhcnQgYWRhbGFoIGdyYWZpayBiZXJiZW50dWsgbGluZ2thcmFuIHlhbmcgZGliYWdpIG1lbmphZGkgYmViZXJhcGEgc2VrdG9yIHVudHVrIG1lbnVuanVra2FuIHByb3BvcnNpIGF0YXUgcGVyc2VudGFzZSBkYXJpIGtlc2VsdXJ1aGFuIGRhdGEuIFNldGlhcCBzZWt0b3IgbWV3YWtpbGkgYmFnaWFuIGRhcmkgdG90YWwsIHNlaGluZ2dhIG1lbXVkYWhrYW4gcGVtYmFjYSBtZW1haGFtaSBrb21wb3Npc2kgZGF0YSBzZWNhcmEgdmlzdWFsLg0KDQpBdHVyYW4gUGVuZ2d1bmFhbiA6DQoNCi0gRGF0YSB5YW5nIGRpcGFrYWkgaGFydXMgZGF0YSBkaXNrcml0IGRlbmdhbiBuaWxhaSB5YW5nIGRhcGF0IGRpanVtbGFoa2FuIG1lbmphZGkgdG90YWwgMTAwJS4NCi0gR3VuYWthbiBkYXRhIGRlbmdhbiBrYXRlZ29yaSB0ZXJiYXRhcyAoMy03IGthdGVnb3JpKS4NCi0gSmFuZ2FuIGRpcGFrYWkgamlrYSBrYXRlZ29yaSBuaWxhaW55YSBoYW1waXIgc2FtYS4NCi0gVGlkYWsgY29jb2sgdW50dWsgcGVyYmFuZGluZ2FuIGRldGFpbCBhbnRhciBrYXRlZ29yaS4NCi0gTGFiZWwgaGFydXMgamVsYXMgc3VwYXlhIG11ZGFoIGRpYmFjYS4NCg0KS2VsZWJpaGFuIFBpZSBDaGFydCA6DQoNCi0gTXVkYWggZGlwYWhhbWkgdW50dWsgbWVudW5qdWtrYW4gcHJvcG9yc2kgYmFnaWFuIGRhcmkga2VzZWx1cnVoYW4uDQotIFZpc3VhbG55YSBtZW5hcmlrIGRhbiBzZWRlcmhhbmEuDQotIENvY29rIHVudHVrIGRhdGEgZGVuZ2FuIHNlZGlraXQga2F0ZWdvcmkuDQotIE1lbXVkYWhrYW4gbWVsaWhhdCBrb250cmlidXNpIG1hc2luZy1tYXNpbmcga2F0ZWdvcmkgc2VjYXJhIGNlcGF0Lg0KDQpLZWt1cmFuZ2FuIFBpZSBDaGFydCA6DQoNCi0gU3VsaXQgbWVtYmFuZGluZ2thbiB1a3VyYW4gaXJpc2FuIGppa2EgYmFueWFrIGthdGVnb3JpLg0KLSBUaWRhayBlZmVrdGlmIHVudHVrIGRhdGEgZGVuZ2FuIGthdGVnb3JpIHlhbmcgbmlsYWlueWEgbWlyaXAuDQotIEt1cmFuZyBha3VyYXQgdW50dWsgbWVudW5qdWtrYW4gcGVyYmFuZGluZ2FuIGRldGFpbCBhbnRhciBrYXRlZ29yaS4NCi0gQmlzYSBtZW1iaW5ndW5na2FuIGppa2EganVtbGFoIGthdGVnb3JpIHRlcmxhbHUgYmFueWFrLg0KLSBTdWxpdCBtZW5hbXBpbGthbiBwZXJ1YmFoYW4gZGF0YSBkYXJpIHdha3R1IGtlIHdha3R1Lg0KDQpgYGAge3J9DQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KGRwbHlyKQ0KDQojIFJpbmdrYXMgZGF0YSBwZXIgYnVzDQpkYXRhX3N1bW1hcnkgPC0gZGF0YV90cmFuc3BvcnRhc2kgJT4lDQogIGdyb3VwX2J5KE5hbWFfQnVzKSAlPiUNCiAgc3VtbWFyaXNlKA0KICAgIFRvdGFsX1BlbnVtcGFuZyA9IHN1bShKdW1sYWhfUGVudW1wYW5nKSwNCiAgICBSYXRhX0tldGVybGFtYmF0YW4gPSBtZWFuKFdha3R1X0tldGVybGFtYmF0YW4pDQogICkNCg0KIyBCdWF0IGxhYmVsDQpkYXRhX3N1bW1hcnkkbGFiZWwgPC0gcGFzdGUwKA0KICBkYXRhX3N1bW1hcnkkTmFtYV9CdXMsICJcbiIsDQogICJQZW51bXBhbmc6ICIsIGRhdGFfc3VtbWFyeSRUb3RhbF9QZW51bXBhbmcsICJcbiIsDQogICJEZWxheTogIiwgZGF0YV9zdW1tYXJ5JFJhdGFfS2V0ZXJsYW1iYXRhbiwgIiBtbnQiDQopDQoNCiMgUGllIGNoYXJ0IChEb251dCkNCmdncGxvdChkYXRhX3N1bW1hcnksIGFlcyh4ID0gMiwgeSA9IFRvdGFsX1BlbnVtcGFuZywgZmlsbCA9IE5hbWFfQnVzKSkgKw0KICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5Iiwgd2lkdGggPSAxLCBjb2xvciA9ICJ3aGl0ZSIpICsNCiAgY29vcmRfcG9sYXIodGhldGEgPSAieSIsIHN0YXJ0ID0gMCkgKw0KICB4bGltKDAuNSwgMi41KSArICAgICAgICAgIyBpbmlsYWggeWFuZyBtZW1idWF0ICJsdWJhbmciIGRpIHRlbmdhaA0KICBnZW9tX3RleHQoYWVzKGxhYmVsID0gbGFiZWwpLA0KICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9zdGFjayh2anVzdCA9IDAuNSksDQogICAgICAgICAgICBjb2xvciA9ICJibGFjayIsIHNpemUgPSAyLjUsIGZvbnRmYWNlID0gImJvbGQiKSArDQogIGxhYnMoDQogICAgdGl0bGUgPSAiUGllIENoYXJ0IChEb251dCkgOiBKdW1sYWggUGVudW1wYW5nIEJ1cyBkYW4gV2FrdHUgS2V0ZXJsYW1iYXRhbiBCdXMiLA0KICAgIGZpbGwgPSAiTmFtYSBCdXMiDQogICkgKw0KICB0aGVtZV92b2lkKCkgKw0KICB0aGVtZSgNCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMikNCiAgKQ0KDQpgYGANCg0KUGVuamVsYXNhbiA6DQoNCkJlcmRhc2Fya2FuIHBpZSBjaGFydCBkaSBhdGFzLCBkYXBhdCBkaXNpbXB1bGthbiBiYWh3YSBCdXMgSCBtZW55dW1iYW5nIHByb3BvcnNpIHBlbnVtcGFuZyB0ZXJiZXNhciBzZWthbGlndXMgbWVuZ2FsYW1pIGtldGVybGFtYmF0YW4gcGFsaW5nIGxhbWEsIHNlZGFuZ2thbiBCdXMgRyBtZW1pbGlraSBwZW51bXBhbmcgcGFsaW5nIHNlZGlraXQgZGFuIHdha3R1IGtldGVybGFtYmF0YW4gcGFsaW5nIHNpbmdrYXQuDQpTZWNhcmEgdW11bSwgc2VtYWtpbiBiYW55YWsganVtbGFoIHBlbnVtcGFuZyB5YW5nIGRpYW5na3V0IG9sZWggYnVzLCB3YWt0dSBrZXRlcmxhbWJhdGFubnlhIGNlbmRlcnVuZyBsZWJpaCBsYW1hLg0KDQojIyBTY2F0dGVyIFBsb3QNCg0KRGVmaW5pc2kgOiANCg0KU2NhdHRlciBwbG90IGFkYWxhaCBncmFmaWsgeWFuZyBtZW5hbXBpbGthbiBodWJ1bmdhbiBhbnRhcmEgZHVhIHZhcmlhYmVsIG51bWVyaWsgZGVuZ2FuIG1lbmVtcGF0a2FuIHRpdGlrLXRpdGlrIHBhZGEga29vcmRpbmF0IHN1bWJ1IFggZGFuIFkgc2VzdWFpIG5pbGFpIG1hc2luZy1tYXNpbmcgdmFyaWFiZWwuDQoNCkF0dXJhbiBQZW5nZ3VuYWFuIFNjYXR0ZXIgUGxvdCA6DQoNCi0gRGlndW5ha2FuIHVudHVrIG1lbnVuanVra2FuIGh1YnVuZ2FuIGF0YXUga29yZWxhc2kgYW50YXJhIGR1YSB2YXJpYWJlbCBudW1lcmlrLg0KLSBDb2NvayB1bnR1ayBkYXRhIHlhbmcgYmVycGFzYW5nYW4sIG1pc2FsbnlhIHBlbmd1a3VyYW4gWCBkYW4gWSBwYWRhIG9iamVrIHlhbmcgc2FtYS4NCi0gVGlkYWsgZGlndW5ha2FuIHVudHVrIHZhcmlhYmVsIGthdGVnb3JpIChub24tbnVtZXJpaykuDQotIEJlcmd1bmEgdW50dWsgbWVuZ2lkZW50aWZpa2FzaSBwb2xhLCB0cmVuLCBrZWxvbXBvaywgYXRhdSBvdXRsaWVyIGRhbGFtIGRhdGEuDQotIEppa2EgZGF0YW55YSB0ZXJsYWx1IHBhZGF0LCBiaXNhIG1lbmdndW5ha2FuIHRla25payBzZXBlcnRpIHRyYW5zcGFyYW5zaSB0aXRpayBhdGF1IGppdHRlciBhZ2FyIHZpc3VhbGlzYXNpIGxlYmloIGplbGFzLg0KLSBCaXNhIGRpdGFtYmFoa2FuIGdhcmlzIHRyZW4gKHJlZ3Jlc2kpIHVudHVrIG1lbWJhbnR1IGludGVycHJldGFzaSBodWJ1bmdhbi4NCg0KS2VsZWJpaGFuIFNjYXR0ZXIgUGxvdCA6DQoNCi0gTWVuYW1waWxrYW4gaHVidW5nYW4gZGFuIHBvbGEgYW50YXJhIGR1YSB2YXJpYWJlbCBudW1lcmlrIGRlbmdhbiBqZWxhcy4NCi0gTXVkYWggbWVuZGV0ZWtzaSBrb3JlbGFzaSBwb3NpdGlmLCBuZWdhdGlmLCBhdGF1IHRpZGFrIGFkYSBrb3JlbGFzaS4NCi0gTWVtdW5na2lua2FuIGlkZW50aWZpa2FzaSBvdXRsaWVyIGRhbiBrZWxvbXBvayBkYXRhIChjbHVzdGVyaW5nKS4NCi0gVmlzdWFsaXNhc2kgc2VkZXJoYW5hIGRhbiBpbnR1aXRpZi4NCi0gQmlzYSBkaWd1bmFrYW4gdW50dWsgZGF0YSBiZXNhciBkZW5nYW4gdGFtYmFoYW4gZml0dXIgc2VwZXJ0aSB0cmFuc3BhcmFuc2kgYXRhdSBqaXR0ZXIuDQoNCktla3VyYW5nYW4gU2NhdHRlciBQbG90IDoNCg0KLSBLdXJhbmcgZWZla3RpZiBqaWthIGRhdGEgc2FuZ2F0IHBhZGF0IGRhbiB0aXRpay10aXRpayBzYWxpbmcgdHVtcGFuZyB0aW5kaWguDQotIFRpZGFrIGNvY29rIHVudHVrIHZhcmlhYmVsIGthdGVnb3Jpa2FsIGF0YXUgbGViaWggZGFyaSBkdWEgdmFyaWFiZWwgdGFucGEgbW9kaWZpa2FzaSBraHVzdXMuDQotIEludGVycHJldGFzaSBodWJ1bmdhbiBoYW55YSBiZXJkYXNhcmthbiB2aXN1YWwsIHRpZGFrIGxhbmdzdW5nIG1lbWJlcmlrYW4gbmlsYWkgc3RhdGlzdGlrLg0KLSBCaXNhIG1lbWJpbmd1bmdrYW4gamlrYSBzdW1idSB0aWRhayBkaWJlcmkgbGFiZWwgYXRhdSBza2FsYSB0aWRhayBzZXN1YWkuDQoNCmBgYCB7cn0NCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkoZ2dyZXBlbCkNCg0KZ2dwbG90KGRhdGFfdHJhbnNwb3J0YXNpLCBhZXMoeCA9IEp1bWxhaF9QZW51bXBhbmcsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSA9IFdha3R1X0tldGVybGFtYmF0YW4sDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvciA9IE5hbWFfUnV0ZSkpICsNCiAgZ2VvbV9wb2ludChzaXplID0gNCwgYWxwaGEgPSAwLjgpICsNCiAgZ2VvbV90ZXh0X3JlcGVsKGFlcyhsYWJlbCA9IE5hbWFfQnVzKSwgc2l6ZSA9IDMpICsNCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgc2UgPSBGQUxTRSwgY29sb3IgPSAiYmxhY2siLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArDQogIGxhYnMoDQogICAgdGl0bGUgPSAiU2NhdHRlciBQbG90IEp1bWxhaCBQZW51bXBhbmcgQnVzIHZzIFdha3R1IEtldGVybGFtYmF0YW4gQnVzIiwNCiAgICB4ID0gIkp1bWxhaCBQZW51bXBhbmcgQnVzIiwNCiAgICB5ID0gIldha3R1IEtldGVybGFtYmF0YW4gKG1lbml0KSINCiAgKSArDQogIHRoZW1lX21pbmltYWwoKQ0KDQpgYGANCg0KUGVuamVsYXNhbiA6DQoNCkJlcmRhc2Fya2FuIHNjYXR0ZXJwbG90IGRpYXRhcywgZGFwYXQgZGlzaW1wdWxrYW4gYmFod2EgdGVyZGFwYXQgaHVidW5nYW4gYW50YXJhIHdha3R1IGtldGVybGFtYmF0YW4gYnVzIGRlbmdhbiBqdW1sYWggcGVudW1wYW5nIGJ1cy4gQnVzIGRlbmdhbiBwZW51bXBhbmcgc2VkaWtpdCBtZW1pbGlraSB3YWt0dSBrZXRlcmxhbWJhdGFuIHJlbmRhaCwgc2VkYW5na2FuIGJ1cyBkZW5nYW4gcGVudW1wYW5nIGJhbnlhayBtZW1pbGlraSB3YWt0dSBrZXRlcmxhbWJhdGFuIHRpbmdnaS4gUG9sYSBpbmkga29uc2lzdGVuIHBhZGEgc2VsdXJ1aCBydXRlIChHcm9nb2wsIEhhcm1vbmksIGRhbiBNZXJkZWthKSwgeWFuZyBtZW5hbmRha2FuIGJhaHdhIGtlcGFkYXRhbiBwZW51bXBhbmcgbWVuamFkaSBzYWxhaCBzYXR1IGZha3RvciB1dGFtYSBwZW55ZWJhYiBrZXRlcmxhbWJhdGFuIGJ1cy4NCg0KIyMgTGluZSBQbG90DQoNCkRlZmluaXNpIDoNCg0KTGluZSBwbG90IChkaWFncmFtIGdhcmlzKSBhZGFsYWggamVuaXMgZ3JhZmlrIHlhbmcgbWVuYW1waWxrYW4gZGF0YSBkYWxhbSBiZW50dWsgdGl0aWstdGl0aWsgeWFuZyBkaWh1YnVuZ2thbiBvbGVoIGdhcmlzLg0KR2FyaXMgdGVyc2VidXQgbWVudW5qdWtrYW4gcGVydWJhaGFuIGF0YXUgaHVidW5nYW4gYW50YXJhIGR1YSB2YXJpYWJlbCDigJQgYmlhc2FueWEgc2F0dSB2YXJpYWJlbCBudW1lcmlrIHRlcmhhZGFwIHdha3R1IGF0YXUgdGVyaGFkYXAgdmFyaWFiZWwgbnVtZXJpayBsYWluLg0KDQpBdHVyYW4gUGVuZ2d1bmFhbiA6DQoNCi0gR3VuYWthbiBkYXRhIHlhbmcgYmVydXJ1dGFuIGF0YXUga29udGludS4NCi0gU3VtYnUgWCBkaWd1bmFrYW4gdW50dWsgdmFyaWFiZWwgaW5kZXBlbmRlbiAocGVueWViYWIpDQotIFN1bWJ1IFkgZGlndW5ha2FuIHVudHVrIHZhcmlhYmVsIGRlcGVuZGVuIChha2liYXQpDQotIEh1YnVuZ2thbiB0aXRpay10aXRpayBkYXRhIHNlc3VhaSB1cnV0YW4geWFuZyBiZW5hci4NCi0gUGFzdGlrYW4gamFyYWsgYW50YXIgdGl0aWsgZGkgc3VtYnUgWCBwcm9wb3JzaW9uYWwuDQoNCktlbGViaWhhbiBMaW5lIFBsb3QgOg0KDQotIE1lbnVuanVra2FuIHRyZW4gYXRhdSBwZXJ1YmFoYW4gZGFyaSB3YWt0dSBrZSB3YWt0dSBkZW5nYW4gamVsYXMuDQotIE11ZGFoIGRpYmFuZGluZ2thbiBhbnRhciBrZWxvbXBvayBkYXRhLCB0ZXJ1dGFtYSBiaWxhIG1lbWFrYWkgZ2FyaXMgYmVyYmVkYS4NCi0gTWVtYmVyaWthbiBnYW1iYXJhbiBodWJ1bmdhbiBhbnRhciB2YXJpYWJlbCAobWlzYWxueWEsIGp1bWxhaCBwZW51bXBhbmcgZGFuIHdha3R1IGtldGVybGFtYmF0YW4pLg0KLSBFZmlzaWVuIHVudHVrIGRhdGEga29udGludSwga2FyZW5hIG1lbmdodWJ1bmdrYW4gdGl0aWstdGl0aWsgc2VjYXJhIGJlcnVydXRhbi4NCi0gVmlzdWFsaXNhc2kgc2VkZXJoYW5hIGRhbiBtdWRhaCBkaXBhaGFtaSwgYmFoa2FuIG9sZWggcGVtYmFjYSBub24tdGVrbmlzLg0KDQpLZWt1cmFuZ2FuIExpbmUgUGxvdCA6DQoNCi0gVGlkYWsgY29jb2sgdW50dWsgZGF0YSBrYXRlZ29yaSwga2FyZW5hIGdhcmlzIG1lbnlpcmF0a2FuIHVydXRhbiB5YW5nIHRpZGFrIGFkYS4NCi0gU3VsaXQgZGliYWNhIGppa2EgdGVybGFsdSBiYW55YWsgZ2FyaXMgYXRhdSBkYXRhIHRlcmxhbHUgcmFwYXQuDQotIEt1cmFuZyBlZmVrdGlmIHVudHVrIG1lbnVuanVra2FuIGRpc3RyaWJ1c2kgZGF0YSwgc2VwZXJ0aSB2YXJpYXNpIGF0YXUgc2ViYXJhbiBuaWxhaS4NCi0gU2Vuc2l0aWYgdGVyaGFkYXAgc2thbGEgc3VtYnUsIHBlcnViYWhhbiBrZWNpbCBwYWRhIHNrYWxhIGJpc2EgbWVuZ3ViYWggcGVyc2Vwc2kgdHJlbi4NCi0gVGlkYWsgbWVudW5qdWtrYW4gZnJla3VlbnNpIGF0YXUgcHJvcG9yc2kuDQoNCmBgYCB7cn0NCmxpYnJhcnkoZ2dwbG90MikNCg0KZGF0YV90cmFuc3BvcnRhc2kkTmFtYV9CdXMgPC0gZmFjdG9yKGRhdGFfdHJhbnNwb3J0YXNpJE5hbWFfQnVzLCBsZXZlbHMgPSBjKCJCdXMgQSIsICJCdXMgQiIsICJCdXMgQyIsICJCdXMgRCIsICJCdXMgRSIsICJCdXMgRiIsICJCdXMgRyIsICJCdXMgSCIsICJCdXMgSSIsICJCdXMgSiIpKQ0KDQojIDMuIE1lbWJ1YXQgTGluZSBQbG90DQpwbG90X2xpbmUgPC0gZ2dwbG90KGRhdGFfdHJhbnNwb3J0YXNpLCBhZXMoeCA9IE5hbWFfQnVzLCB5ID0gSnVtbGFoX1BlbnVtcGFuZywgZ3JvdXAgPSAxKSkgKyANCiAgZ2VvbV9saW5lKGNvbG9yID0gImRhcmtibHVlIiwgc2l6ZSA9IDEpICsgDQogIGdlb21fcG9pbnQoY29sb3IgPSAicmVkIiwgc2l6ZSA9IDMpICsgICAgIA0KICBsYWJzKA0KICAgIHRpdGxlID0gIlRyZW4gSnVtbGFoIFBlbnVtcGFuZyBwZXIgVW5pdCBCdXMiLA0KICAgIHggPSAiTmFtYSBCdXMiLA0KICAgIHkgPSAiSnVtbGFoIFBlbnVtcGFuZyINCiAgKSArDQogIHRoZW1lX21pbmltYWwoKSArDQogIGdlb21fdGV4dChhZXMobGFiZWwgPSBKdW1sYWhfUGVudW1wYW5nKSwgdmp1c3QgPSAtMSwgY29sb3IgPSAiYmxhY2siLCBzaXplID0gMy41KQ0KDQojIE1lbmFtcGlsa2FuIHBsb3QNCnByaW50KHBsb3RfbGluZSkNCmBgYA0KDQpQZW5qZWxhc2FuIDoNCg0KRGFyaSBkaWFncmFtIGRpYXRhcywgdGVybGloYXQgYmFod2EgcnV0ZSBIYXJtb25pIG1lbWlsaWtpIGtlbWlyaW5nYW5uIHBhbGluZyBjdXJhbSB5YW5nIGJlcmFydGkgcGVuYW1iYWhhbiBqdW1sYWggcGVudW1wYW5nIGxlYmloIGNlcGF0IG1lbmluZ2thdGthbiB3YWt0dSBrZXRlcmxhbWJhdGFuIGRpYmFuZGluZ2thbiBydXRlIGxhaW4uIFNlY2FyYSBrZXNlbHVydWhhbiwgZ3JhZmlrIGluaSBtZW5nZ2FtYmFya2FuIGJhaHdhIHNlbWFraW4gcGFkYXQgcGVudW1wYW5nIHN1YXR1IGJ1cywgc2VtYWtpbiBiZXNhciBrZW11bmdraW5hbiBidXMgbWVuZ2FsYW1pIGtldGVybGFtYmF0YW4gd2FrdHUgdGliYSwgZGVuZ2FuIHBlcmJlZGFhbiB0aW5na2F0IGtldGVybGFtYmF0YW4geWFuZyBkaXBlbmdhcnVoaSBvbGVoIG1hc2luZy1tYXNpbmcgcnV0ZS4NCg0KIyMgRGVuc2l0eSBQbG90DQoNCkRlZmluaXNpIDoNCg0KRGVuc2l0eSBwbG90IChwbG90IGtlcGFkYXRhbikgYWRhbGFoIHNhbGFoIHNhdHUgamVuaXMgZ3JhZmlrIGRhbGFtIHN0YXRpc3RpayBkYW4gdmlzdWFsaXNhc2kgZGF0YSB5YW5nIGRpZ3VuYWthbiB1bnR1ayBtZW51bmp1a2thbiBkaXN0cmlidXNpIHN1YXR1IHZhcmlhYmVsIGtvbnRpbnUuDQpHcmFmaWsgaW5pIG1lcnVwYWthbiB2ZXJzaSBoYWx1cyBkYXJpIGhpc3RvZ3JhbSwga2FyZW5hIG1lbmdndW5ha2FuIGZ1bmdzaSBlc3RpbWFzaSBrZXBhZGF0YW4ga2VybmVsIChrZXJuZWwgZGVuc2l0eSBlc3RpbWF0aW9uIC8gS0RFKSB1bnR1ayBtZW1wZXJraXJha2FuIHNlYmVyYXBhIHBhZGF0IGRhdGEgYmVyYWRhIGRpIHNldGlhcCByZW50YW5nIG5pbGFpLg0KDQpBdHVyYW4gUGVuZ2d1bmFhbiA6DQoNCi0gTWVuZ2d1bmFrYW4gZGF0YSBrb250aW51Lg0KLSBDb2NvayB1bnR1ayBtZW1iYW5kaW5na2FuIGJlYmVyYXBhIGRpc3RyaWJ1c2kgYW50YXJrZWxvbXBvay4NCi0gR3VuYWthbiBhbHBoYSA8IDEgamlrYSBhZGEgYmViZXJhcGEga2F0ZWdvcmkuDQotIE5pbGFpIHN1bWJ1IFkgbWVudW5qdWtrYW4ga2VwYWRhdGFuLg0KDQpLZWxlYmloYW4gRGVuc2l0eSBQbG90IDoNCg0KLSBNZW5hbXBpbGthbiBkaXN0cmlidXNpIGRhdGEgZGVuZ2FuIGhhbHVzLg0KLSBNdWRhaCBtZW1iYW5kaW5na2FuIGJlYmVyYXBhIGtlbG9tcG9rLg0KLSBUaWRhayB0ZXJnYW50dW5nIHBhZGEgbGViYXIgYmluIHNlcGVydGkgaGlzdG9ncmFtLg0KLSBNZW1iZXJpa2FuIGdhbWJhcmFuIHByb2JhYmlsaXRhcyByZWxhdGlmLiANCg0KS2VrdXJhbmdhbiBEZW5zaXR5IFBsb3QgOg0KDQotIFRpZGFrIG1lbnVuanVra2FuIGp1bWxhaCBkYXRhIHNlYmVuYXJueWEuDQotIEt1cmFuZyBha3VyYXQgdW50dWsgZGF0YSBrZWNpbCAobiA8IDIwKS4NCi0gU3VsaXQgZGlwYWhhbWkgcGVtdWxhLg0KLSBUaWRhayBjb2NvayB1bnR1ayBkYXRhIGthdGVnb3JpayBhdGF1IGRpc2tyaXQuDQoNCmBgYCB7cn0NCmxpYnJhcnkoZ2dwbG90MikNCg0KcGxvdF9rZXRlcmxhbWJhdGFuIDwtIGdncGxvdChkYXRhX3RyYW5zcG9ydGFzaSwgYWVzKHggPSBXYWt0dV9LZXRlcmxhbWJhdGFuKSkgKw0KICBnZW9tX2RlbnNpdHkoZmlsbCA9ICJibHVlIiwgY29sb3IgPSAiYmx1ZSIsIGFscGhhID0gMC43KSArDQogIGxhYnMoDQogICAgdGl0bGUgPSAiRGVuc2l0eSBQbG90IFdha3R1IEtldGVybGFtYmF0YW4gQnVzIChLZXNlbHVydWhhbikiLA0KICAgIHggPSAiV2FrdHUgS2V0ZXJsYW1iYXRhbiAobWVuaXQpIiwNCiAgICB5ID0gIktlcGFkYXRhbiINCiAgKSArDQogIHRoZW1lX21pbmltYWwoKQ0KDQojIE1lbmFtcGlsa2FuIA0KcHJpbnQocGxvdF9rZXRlcmxhbWJhdGFuKQ0KDQoNCiMgSnVtbGFoIFBlbnVtcGFuZyAoS2VzZWx1cnVoYW4pDQpwbG90X3BlbnVtcGFuZyA8LSBnZ3Bsb3QoZGF0YV90cmFuc3BvcnRhc2ksIGFlcyh4ID0gSnVtbGFoX1BlbnVtcGFuZykpICsNCiAgZ2VvbV9kZW5zaXR5KGZpbGwgPSAib3JhbmdlIiwgY29sb3IgPSAib3JhbmdlIiwgYWxwaGEgPSAwLjcpICsNCiAgbGFicygNCiAgICB0aXRsZSA9ICJEZW5zaXR5IFBsb3QgSnVtbGFoIFBlbnVtcGFuZyBCdXMiLA0KICAgIHggPSAiSnVtbGFoIFBlbnVtcGFuZyIsDQogICAgeSA9ICJLZXBhZGF0YW4iDQogICkgKw0KICB0aGVtZV9taW5pbWFsKCkNCg0KIyBNZW5hbXBpbGthbg0KcHJpbnQocGxvdF9wZW51bXBhbmcpDQoNCiNXYWt0dSBLZXRlcmxhbWJhdGFuIGJlcmRhc2Fya2FuIE5hbWEgUnV0ZSAoQmVyZ3J1cCkNCnBsb3Rfa2V0ZXJsYW1iYXRhbl9ydXRlIDwtIGdncGxvdChkYXRhX3RyYW5zcG9ydGFzaSwgYWVzKHggPSBXYWt0dV9LZXRlcmxhbWJhdGFuLCBmaWxsID0gTmFtYV9SdXRlKSkgKw0KICBnZW9tX2RlbnNpdHkoYWxwaGEgPSAwLjUsIHBvc2l0aW9uID0gImlkZW50aXR5IikgKyAjIHBvc2l0aW9uPSJpZGVudGl0eSIgbWVtdW5na2lua2FuIGt1cnZhIHR1bXBhbmcgdGluZGloDQogIGxhYnMoDQogICAgdGl0bGUgPSAiRGVuc2l0eSBQbG90IFdha3R1IEtldGVybGFtYmF0YW4gYmVyZGFzYXJrYW4gUnV0ZSIsDQogICAgeCA9ICJXYWt0dSBLZXRlcmxhbWJhdGFuIChtZW5pdCkiLA0KICAgIHkgPSAiS2VwYWRhdGFuIg0KICApICsNCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygiUnV0ZSBNZXJkZWthIiA9ICJncmVlbiIsICJSdXRlIEhhcm1vbmkiID0gInBpbmsiLCAiUnV0ZSBHcm9nb2wiID0gImxpZ2h0Ymx1ZSIpKSArDQogIHRoZW1lX21pbmltYWwoKQ0KDQojIE1lbmFtcGlsa2FuDQpwcmludChwbG90X2tldGVybGFtYmF0YW5fcnV0ZSkNCmBgYA0KDQpQZW5qZWxhc2FuIDoNCg0KQmVyZGFzYXJrYW4gZGVuc2l0eSBwbG90IGRpYXRhcywgbWVudW5qdWtrYW4gYmFod2EgcnV0ZSBIYXJtb25pIG1lbWlsaWtpIHRpbmdrYXQga2V0ZXJsYW1iYXRhbiB0ZXJ0aW5nZ2kga2FyZW5hIGp1bWxhaCBwZW51bXBhbmdueWEgcGFsaW5nIGJhbnlhay4gUnV0ZSBNZXJkZWthIGp1Z2EgbWVudW5qdWtrYW4gcGVyZm9ybWEgcGFsaW5nIGJhaWsga2FyZW5hIHdha3R1IGtldGVybGFtYmF0YW5ueWEgdGV0YXAgcmVuZGFoIG1lc2tpIGp1bWxhaCBwZW51bXBhbmcgYmVydmFyaWFzaS5EZW5zaXR5IHBsb3QgaW5pIG1lbWJhbnR1IG1lbnVuanVra2FuIHNlYmFyYW4gZGFuIGtvbnNlbnRyYXNpIGRhdGEgYW50YXIgcnV0ZSwgc2VoaW5nZ2Ega2l0YSBiaXNhIGRlbmdhbiBtdWRhaCBtZWxpaGF0IHJ1dGUgbWFuYSB5YW5nIHBhbGluZyBwYWRhdCBkYW4gbWFuYSB5YW5nIHBhbGluZyBlZmlzaWVuLg0KDQojIyBSaWRnZWxpbmUgUGxvdA0KDQpEZWZpbmlzaSA6DQoNClJpZGdlbGluZSBQbG90IGFkYWxhaCB2aXN1YWxpc2FzaSBkYXRhIGRpIG1hbmEgYmViZXJhcGEgcGxvdCBrZXJhcGF0YW4gKGRlbnNpdHkgcGxvdHMpIGRpdHVtcHVrIHNlY2FyYSB2ZXJ0aWthbCBkYW4gc2VkaWtpdCB0dW1wYW5nIHRpbmRpaC4gU2V0aWFwICJsYXBpc2FuIiAocmlkZ2UpIG1ld2FraWxpIGRpc3RyaWJ1c2kgZGF0YSBkYXJpIHNhdHUga2F0ZWdvcmkgYXRhdSBrZWxvbXBvaywgbWVtdW5na2lua2FuIHBlcmJhbmRpbmdhbiBiZW50dWssIHBvc2lzaSBwdW5jYWsgKG1vZHVzKSwgZGFuIHBlbnllYmFyYW4gKHZhcmlhbnMpIGFudGFyIGtlbG9tcG9rLg0KDQoNCkF0dXJhbiBwZW5nZ3VuYWFuIDoNCg0KLSBNZW1iYW5kaW5na2FuIERpc3RyaWJ1c2kuDQotIERhdGEgRGVyZXQgV2FrdHUgKFRpbWUgU2VyaWVzKSBLdWFudGl0YXRpZiBtZW51bmp1a2thbiBwZXJ1YmFoYW4gZGFsYW0gZGlzdHJpYnVzaSB2YXJpYWJlbCBkYXJpIHdha3R1IGtlIHdha3R1Lg0KLSBNZW12aXN1YWxpc2FzaWthbiBEYXRhIE51bWVyaWsgS29udGludS4NCg0KS2VsZWJpaGFuIDoNCg0KLSBFZmlzaWVuc2kgUnVhbmc6IERhcGF0IG1lbmFtcGlsa2FuIGJhbnlhayBkaXN0cmlidXNpIHNlY2FyYSByaW5na2FzIGRhbGFtIHJ1YW5nIHlhbmcgdGVyYmF0YXMuDQotIFBlcmJhbmRpbmdhbiB5YW5nIEplbGFzOiBUdW1wYW5nIHRpbmRpaG55YSBwbG90IGtlcmFwYXRhbiBtZW55b3JvdGkgcGVyYmVkYWFuIHV0YW1hIGRhbGFtIGJlbnR1ayBkYW4gbG9rYXNpIHB1bmNhayBkaXN0cmlidXNpIGFudGFyIGtlbG9tcG9rLg0KLSBNZW5hcmlrIFNlY2FyYSBWaXN1YWw6IEVzdGV0aWthIHlhbmcgdW5payBtZW1idWF0IHBsb3QgaW5pIG1lbmFyaWsgZGFuIG11ZGFoIGRpcGFoYW1pLg0KLSBNZW51bmp1a2thbiBUcmVuOiBFZmVrdGlmIHVudHVrIG1lbnVuanVra2FuIHBlcnViYWhhbiB0cmVuIGRpc3RyaWJ1c2kgbWVsaW50YXNpIGthdGVnb3JpIHlhbmcgYmVydXJ1dGFuIChtaXNhbG55YSwgd2FrdHUpLg0KDQpLZWt1cmFuZ2FuIDoNCg0KLSBTdWxpdCBEaWJhY2EgSmlrYSBUZXJsYWx1IEJhbnlhayBLYXRlZ29yaS4NCi0gRGF0YSBLdWFudGlsIFRlcnRlbnR1IFN1bGl0IERpbGloYXQ6IE5pbGFpIGt1YW50aWwgc3Blc2lmaWsgKG1lZGlhbiwga3VhcnRpbCkgYXRhdSBuaWxhaSBkYXRhIGluZGl2aWR1YWwgKHNlcGVydGkgeWFuZyB0ZXJsaWhhdCBwYWRhIEJveCBQbG90KSB0aWRhayBsYW5nc3VuZyB0ZXJsaWhhdC4NCi0gTWVtYnV0dWhrYW4gSW50ZXJwcmV0YXNpIHlhbmcgSGF0aS1IYXRpOiBUdW1wYW5nIHRpbmRpaCBkYXBhdCBtZW55ZWJhYmthbiBiZWJlcmFwYSBiYWdpYW4ga3VydmEgdGVyc2VtYnVueWkgKG9jY2x1c2lvbiksIHlhbmcgbXVuZ2tpbiBtZW55ZW1idW55aWthbiBkZXRhaWwgZGlzdHJpYnVzaSBkaSBiYWxpayBrdXJ2YSBkaSBkZXBhbm55YS4NCi0gS3VyYW5nIENvY29rIHVudHVrIERhdGEgU2VkaWtpdDogS3VydmEga2VyYXBhdGFuIChkZW5zaXR5KSBtdW5na2luIHRpZGFrIGFrdXJhdCBhdGF1IGluZm9ybWF0aWYgamlrYSBkYXRhIHVudHVrIHNldGlhcCBrYXRlZ29yaSB0ZXJsYWx1IHNlZGlraXQuDQoNCmBgYHtyfQ0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShnZ3JpZGdlcykNCg0KZGF0YV90cmFuc3BvcnRhc2kkTmFtYV9SdXRlIDwtIGZhY3RvcigNCiAgZGF0YV90cmFuc3BvcnRhc2kkTmFtYV9SdXRlLCANCiAgbGV2ZWxzID0gYygiUnV0ZSBNZXJkZWthIiwgIlJ1dGUgSGFybW9uaSIsICJSdXRlIEdyb2dvbCIpDQopDQoNCiMgMi4gTWVtYnVhdCBSaWRnZWxpbmUgUGxvdA0KcGxvdF9yaWRnZWxpbmUgPC0gZ2dwbG90KA0KICBkYXRhX3RyYW5zcG9ydGFzaSwgDQogIGFlcygNCiAgICB4ID0gV2FrdHVfS2V0ZXJsYW1iYXRhbiwgDQogICAgeSA9IE5hbWFfUnV0ZSwgDQogICAgZmlsbCA9IE5hbWFfUnV0ZSANCiAgKQ0KKSArDQogIGdlb21fZGVuc2l0eV9yaWRnZXMoDQogICAgYWxwaGEgPSAwLjgsIA0KICAgIHNjYWxlID0gMS41LCANCiAgICByZWxfbWluX2hlaWdodCA9IDAuMDEgDQogICkgKw0KICBsYWJzKA0KICAgIHRpdGxlID0gIkRpc3RyaWJ1c2kgV2FrdHUgS2V0ZXJsYW1iYXRhbiBCdXMgQmVyZGFzYXJrYW4gUnV0ZSIsDQogICAgeCA9ICJXYWt0dSBLZXRlcmxhbWJhdGFuIChtZW5pdCkiLA0KICAgIHkgPSAiTmFtYSBSdXRlIg0KICApICsNCiAgdGhlbWVfcmlkZ2VzKCkgKw0KICB0aGVtZSgNCiAgICBsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsIA0KICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpDQogICkNCg0KIyBNZW5hbXBpbGthbiBwbG90DQpwcmludChwbG90X3JpZGdlbGluZSkNCg0KYGBgDQoNClBlbmplbGFzYW4gOg0KDQpSaWRnZWxpbmUgcGxvdCB5YW5nIGRpaGFzaWxrYW4gbWVtdmlzdWFsaXNhc2lrYW4gcGVyYmVkYWFuIGRhbGFtIGRpc3RyaWJ1c2kgV2FrdHUgS2V0ZXJsYW1iYXRhbiBkaSBhbnRhcmEga2V0aWdhIFJ1dGUgQnVzIHlhbmcgYmVyYmVkYSB5YWl0dSBSdXRlIE1lcmRla2EsIFJ1dGUgSGFybW9uaSwgZGFuIFJ1dGUgR3JvZ29sLiBEYXJpIGJlbnR1ayBwdW5jYWsgKGtlcGFkYXRhbikgZGFuIHBvc2lzaW55YSBwYWRhIHN1bWJ1IFggKFdha3R1IEtldGVybGFtYmF0YW4pLCBraXRhIGRhcGF0IG1lbWJhbmRpbmdrYW4gdHJlbiBrZXRlcmxhbWJhdGFuIGFudGFyIHJ1dGUuIFB1bmNhayB5YW5nIGJlcmFkYSBwYWxpbmcgamF1aCBrZSBrYW5hbiAobmlsYWkgWCBiZXNhcikgbWVudW5qdWtrYW4gcnV0ZSB0ZXJzZWJ1dCAoUnV0ZSBIYXJtb25pKSBwYWxpbmcgc2VyaW5nIG1lbmdhbGFtaSBrZXRlcmxhbWJhdGFuIHlhbmcgbGViaWggbGFtYS4NClB1bmNhayB5YW5nIGJlcmFkYSBwYWxpbmcgZGVrYXQgZGVuZ2FuIG5vbCAobmlsYWkgWCBrZWNpbCkgbWVuZ2luZGlrYXNpa2FuIHJ1dGUgdGVyc2VidXQgKFJ1dGUgR3JvZ29sKSBjZW5kZXJ1bmcgbWVtaWxpa2kga2V0ZXJsYW1iYXRhbiB5YW5nIGxlYmloIHNpbmdrYXQgYXRhdSBwYWxpbmcgdGVwYXQgd2FrdHUuU2VjYXJhIGtlc2VsdXJ1aGFuLCBwbG90IGluaSBtZW55b3JvdGkgYmFod2EgcmF0YS1yYXRhIGRhbiB2YXJpYXNpIGtldGVybGFtYmF0YW4gc2FuZ2F0IGJlcmJlZGEgYW50YXIgcnV0ZSwgZGkgbWFuYSBSdXRlIEhhcm1vbmkgdGFtcGFrIHBhbGluZyByZW50YW4gdGVyaGFkYXAgcGVudW5kYWFuIHlhbmcgc2lnbmlmaWthbi4NCg0KIyAuIEtlc2ltcHVsYW4NCkRhcGF0IGRpbGloYXQgZGFyaSBoYXNpbCBhbmFsaXNpcyBkYW4gdmlzdWFsaXNhc2kgZGF0YSBiYWh3YSBqaWthIHNlYnVhaCB0cmFuc3BvcnRhc2kgcHVibGlrIChidXMpIG1lbWJhd2EgcGVudW1wYW5nIHlhbmcgY3VrdXAgYmFueWFrIGFrYW4gbWVtYnVhdCBidXMgdGVyc2VidXQgbWVuZ2FsYW1pIGtlbmRhbGEgZGFsYW0gd2FrdHUga2V0ZXJsYW1iYXRhbiB5YW5nIGN1a3VwIHRpbmdnaSwgaGFsIGluaSBkaSBrYXJlbmFrYW4gYnVzIGhhcnVzIGJlcmhlbnRpIGRpIHNldGlhcCBydXRlLCBzZWRhbmdrYW4gamlrYSBwZW51bXBhbmcgbGViaWggc2VkaWtpdCBrZW11bmdraW5hbiB3YWt0dSBrZXRlcmxhbWJhdGFuIGJ1cyBha2FuIGxlYmloIGtlY2lsLiBLb25kaXNpIG9wZXJhc2lvbmFsIHRyYW5zcG9ydGFzaSBwdWJsaWsgKGJ1cykgYmVycGVyYW4gcGVudGluZyB0ZXJoYWRhcCB0aW5na2F0IGVmaXNpZW5zaSBkYW4gcGVtYW5mYWF0YW4gbGF5YW5hbi4gRGFuIGRhcmkgdmlzdWFsaXNhc2kgaW5pIG1lbWJhbnR1IGtpdGEgZGFsYW0gbWVsaWhhdCBodWJ1bmdhbiBhbnRhcmEganVtbGFoIHBlbnVtcGFuZyBkYW4gd2FrdHUga2V0ZXJsYW1iYXRhbiwgc2VydGEgbWVtYmVyaWthbiBkYXNhciBpbmZvcm1hc2kgYmFnaSBwZW5nYW1iaWxhbiBrZXB1dHVzYW4u