STUDY CASES

Confidence Interval~ Week 13

library(htmltools)

HTML('
<div class="profile-card">

  <div>
    <img src="Almetcokkk.JPG">
  </div>

  <div class="profile-text">
    <h3>Verónica Maria L F Xavier</h3>

    <div class="profile-description">
      as a Student Data Science in Institut Teknologi Sains Bandung
    </div>

    <div class="profile-info-row">
      <p class="profile-info-item">
        <b>Mentored by:</b> <span class="mentor-name">Mr. Bakti Siregar M.Sc.,CDS</span>
      </p>
    </div>
    </div>
    
    
</div>
')

Verónica Maria L F Xavier

as a Student Data Science in Institut Teknologi Sains Bandung

Mentored by: Mr. Bakti Siregar M.Sc.,CDS

1 CASE STUDY 1

1.1 Confidence Interval untuk Mean (σ Diketahui)

Sebuah platform e-commerce ingin mengestimasi rata-rata jumlah transaksi harian per pengguna setelah peluncuran fitur baru. Berdasarkan data historis berskala besar, standar deviasi populasi diketahui. Oleh karena itu, analisis dilakukan menggunakan metode Confidence Interval untuk mean dengan distribusi Z.

1.2 Identifikasi Metode Statistik

Metode statistik yang digunakan dalam studi kasus ini adalah Z-Confidence Interval.

Metode ini dipilih karena: - Tujuan analisis adalah mengestimasi rata-rata populasi - Standar deviasi populasi (σ) diketahui - Ukuran sampel besar (n ≥ 30)

1.3 Data dan Parameter

# Parameter dasar
sigma <- 3.2
n <- 100
xbar <- 12.6

# Standard Error
SE <- sigma / sqrt(n)

# Nilai Z
z_90 <- qnorm(0.95)
z_95 <- qnorm(0.975)
z_99 <- qnorm(0.995)

# Confidence Interval
CI_90 <- c(xbar - z_90 * SE, xbar + z_90 * SE)
CI_95 <- c(xbar - z_95 * SE, xbar + z_95 * SE)
CI_99 <- c(xbar - z_99 * SE, xbar + z_99 * SE)

CI_90
## [1] 12.07365 13.12635
CI_95
## [1] 11.97281 13.22719
CI_99
## [1] 11.77573 13.42427

1.4 TABEL

Tabel ini menunjukkan bahwa rata-rata transaksi harian diperkirakan berada di kisaran sekitar 12–13 transaksi per hari.

Jika digunakan untuk pengambilan keputusan: - 95% confidence interval biasanya paling disarankan karena memberikan keseimbangan antara keakuratan dan kepercayaan hasil.

library(knitr)
library(kableExtra)

CI_table <- data.frame(
  Confidence_Level = c("90%", "95%", "99%"),
  Lower_Bound = c(CI_90[1], CI_95[1], CI_99[1]),
  Upper_Bound = c(CI_90[2], CI_95[2], CI_99[2])
)

kable(
  CI_table,
  digits = 3,
  align = "c",
  caption = "<span style='font-size:22px; font-weight:bold;'>Confidence Interval 
  Rata-rata Transaksi Harian</span>",
  
  escape = FALSE
) %>%
  kable_styling(
    bootstrap_options = c("striped", "hover"),
    full_width = TRUE,
    font_size = 18
  ) %>%
  row_spec(0, bold = TRUE, background = "#4F81BD", color = "white") %>%
  row_spec(1, background = "#D9E1F2") %>%
  row_spec(2, background = "#BDD7EE") %>%
  row_spec(3, background = "#9DC3E6")
Confidence Interval Rata-rata Transaksi Harian
Confidence_Level Lower_Bound Upper_Bound
90% 12.074 13.126
95% 11.973 13.227
99% 11.776 13.424

1.5 Visualisasi Perbandingan Confidence Interval

Visualisasi confidence interval menunjukkan bahwa semakin tinggi tingkat kepercayaan yang digunakan, semakin lebar rentang estimasi rata-rata transaksi harian. Interval kepercayaan 95% memberikan keseimbangan terbaik antara ketelitian dan keyakinan, sehingga paling direkomendasikan untuk pengambilan keputusan statistik. Seluruh interval menunjukkan bahwa rata-rata transaksi harian berada di sekitar 12–13 transaksi per hari.

library(ggplot2)

# Data Confidence Interval
CI_plot <- data.frame(
  Level = factor(c("90%", "95%", "99%"),
                 levels = c("90%", "95%", "99%")),
  Lower = c(12.074, 11.973, 11.776),
  Upper = c(13.126, 13.227, 13.424),
  Mean  = c(12.6, 12.6, 12.6)
)

# Visualisasi Confidence Interval
ggplot(CI_plot, aes(y = Level)) +
  geom_errorbar(
    aes(xmin = Lower, xmax = Upper),
    orientation = "y",
    width = 0.25,
    color = "steelblue",
    linewidth = 1.2
  ) +
  geom_point(
    aes(x = Mean),
    color = "steelblue",
    size = 4
  ) +
  labs(
    title = "Perbandingan Confidence Interval Rata-rata Transaksi Harian",
    x = "Jumlah Transaksi Harian",
    y = "Confidence Level"
  ) +
  theme_minimal(base_size = 14)

1.6 INTERPRETASI

Berdasarkan hasil analisis, interval kepercayaan 95% menunjukkan bahwa rata-rata transaksi harian per pengguna berada pada rentang yang relatif sempit dan stabil. Semakin tinggi tingkat kepercayaan, semakin lebar interval yang dihasilkan, yang mencerminkan tingkat ketidakpastian yang lebih kecil.

1.7 KESIMPULAN

Confidence Interval memberikan gambaran yang jelas mengenai estimasi rata-rata transaksi harian pengguna setelah peluncuran fitur baru. Informasi ini dapat digunakan oleh manajemen untuk mengevaluasi efektivitas fitur serta sebagai dasar pengambilan keputusan strategis berbasis data.

2 CASE STUDY 2

2.1 Confidence Interval untuk Mean (σ Tidak Diketahui)

Waktu penyelesaian tugas (dalam menit) dari 12 pengguna aplikasi mobile adalah sebagai berikut:

8.4, 7.9, 9.1, 8.7, 8.2, 9.0, 7.8, 8.5, 8.9, 8.1, 8.6, 8.3

2.2 Penjelasan Uji Statistik yang Digunakan

Uji statistik yang digunakan dalam studi kasus ini adalah Confidence Interval untuk Mean dengan distribusi t-Student.

Pemilihan metode ini didasarkan pada beberapa alasan. Pertama, tujuan analisis adalah untuk mengestimasi rata-rata populasi waktu penyelesaian tugas. Kedua, ukuran sampel relatif kecil, yaitu sebanyak 12 pengguna. Ketiga, standar deviasi populasi (σ) tidak diketahui, sehingga distribusi normal (z) tidak dapat digunakan. Oleh karena itu, distribusi t-Student merupakan pendekatan yang paling tepat.

2.3 Confidence Interval (90%, 95%, dan 99%)

Berdasarkan perhitungan statistik diperoleh nilai rata-rata sampel sebesar 8.46 menit. Confidence interval dihitung menggunakan distribusi t-Student dengan derajat kebebasan (df) = 11.

2.4 TABEL

Berdasarkan tabel yang dibawah, berikut adalah kesimpulan utama mengenai data tersebut:

Estimasi Nilai Rata-rata: Tabel ini menunjukkan rentang nilai di mana rata-rata populasi yang sebenarnya kemungkinan besar berada. Titik tengah (mean sampel) dari data ini adalah 8,4585.

Hubungan Tingkat Kepercayaan dan Rentang:

Terdapat hubungan searah antara Confidence Level dan lebar interval. Semakin tinggi tingkat kepercayaan yang diinginkan (dari 90% ke 99%), maka rentang antara Lower Bound dan Upper Bound akan semakin lebar.

Interval 90% (8,240 – 8,677) adalah yang paling sempit/presisi, namun memiliki risiko error tertinggi (10%).

Interval 99% (8,081 – 8,836) adalah yang paling lebar, memberikan kepastian paling tinggi bahwa nilai benar tercakup di dalamnya, namun dengan presisi yang lebih rendah.

library(dplyr)
library(knitr)
library(kableExtra)

data <- c(8.4, 7.9, 9.1, 8.7, 8.2, 9.0, 7.8, 8.5, 8.9, 8.1, 8.6, 8.3)

ci_table <- data.frame(
  `Confidence Level` = c("90%", "95%", "99%"),
  `Lower Bound` = c(
    mean(data) - qt(0.95, 11) * sd(data)/sqrt(12),
    mean(data) - qt(0.975, 11) * sd(data)/sqrt(12),
    mean(data) - qt(0.995, 11) * sd(data)/sqrt(12)
  ),
  `Upper Bound` = c(
    mean(data) + qt(0.95, 11) * sd(data)/sqrt(12),
    mean(data) + qt(0.975, 11) * sd(data)/sqrt(12),
    mean(data) + qt(0.995, 11) * sd(data)/sqrt(12)
  )
)

kable(ci_table, digits = 3, align = "c") %>%
  kable_styling(
    bootstrap_options = c("striped", "hover", "condensed"),
    full_width = TRUE,
    font_size = 16
  ) %>%
  row_spec(0, bold = TRUE, background = "#1F4E79", color = "white") %>%
  row_spec(1, background = "#E3F2FD") %>%
  row_spec(2, background = "#BBDEFB") %>%
  row_spec(3, background = "#90CAF9")
Confidence.Level Lower.Bound Upper.Bound
90% 8.240 8.677
95% 8.191 8.726
99% 8.081 8.836

2.5 VISUALISASI

Visualisasi dibawah ini merupakan Error Bar Chart yang membandingkan rentang estimasi (Confidence Interval) dari rata-rata waktu penyelesaian tugas pada tiga tingkat keyakinan yang berbeda.

Poin-poin penjelasannya:

Titik Biru di Tengah: Melambangkan Mean (Rata-rata) sampel. Jika diperhatikan, posisi titik ini tetap stabil di sekitar angka 8,4 menit pada ketiga kolom.

Garis Vertikal (Whisker): Menunjukkan rentang Confidence Interval. Semakin tinggi tingkat kepercayaan (dari 90% ke 99%), garisnya menjadi semakin panjang/lebar.

Interpretasi Lebar Garis: Garis pada 99% adalah yang terpanjang karena untuk mencapai kepastian yang lebih tinggi, kita memerlukan rentang nilai yang lebih luas agar nilai populasi yang sebenarnya tidak “terlepas” dari estimasi kita.

library(ggplot2)

ci_plot <- data.frame(
  Level = c("90%", "95%", "99%"),
  Mean = mean(data),
  Lower = ci_table$Lower.Bound,
  Upper = ci_table$Upper.Bound
)

ggplot(ci_plot, aes(x = Level, y = Mean, color = Level)) +
  geom_point(size = 4) +
  geom_errorbar(
    aes(ymin = Lower, ymax = Upper),
    width = 0.2, size = 1.2
  ) +
  scale_color_manual(values = c("#64B5F6", "#42A5F5", "#1E88E5")) +
  labs(
    title = "Confidence Interval Mean Waktu Penyelesaian Tugas",
    subtitle = "Perbandingan CI 90%, 95%, dan 99%",
    x = "Confidence Level",
    y = "Waktu (menit)"
  ) +
  theme_minimal(base_size = 14) +
  theme(
    legend.position = "none",
    plot.title = element_text(face = "bold")
  )

2.6 Pengaruh Ukuran Sampel dan Confidence Level terhadap Lebar Interval

Ukuran sampel memiliki pengaruh langsung terhadap lebar confidence interval. Semakin besar ukuran sampel, maka nilai standard error akan semakin kecil sehingga confidence interval menjadi lebih sempit. Hal ini menunjukkan estimasi mean yang semakin presisi.

Confidence level juga memengaruhi lebar interval. Semakin tinggi tingkat confidence (misalnya 99%), maka interval yang dihasilkan akan semakin lebar. Hal ini disebabkan karena interval harus mencakup area yang lebih besar untuk memberikan tingkat keyakinan yang lebih tinggi terhadap estimasi parameter populasi.

2.7 KESIMPULAN

Berdasarkan analisis yang dilakukan, rata-rata waktu penyelesaian tugas pengguna aplikasi adalah sekitar 8.46 menit. Confidence interval dengan tingkat yang lebih tinggi menghasilkan interval yang lebih lebar, sedangkan peningkatan ukuran sampel dapat mempersempit interval estimasi. Metode t-Student merupakan pendekatan yang tepat dalam kondisi standar deviasi populasi tidak diketahui dan ukuran sampel relatif kecil.

3 CASE STUDY 3

3.1 Confidence Interval for a Proportion (A/B Testing)

Sebuah tim data science menjalankan A/B Testing pada desain baru tombol Call-To-Action (CTA). Hasil eksperimen yang diperoleh adalah:

Jumlah total pengguna: n = 400

Jumlah pengguna yang mengklik CTA: x = 156

Tujuan analisis ini adalah menghitung sample proportion, confidence interval, serta membandingkan hasilnya secara visual.

3.2 Menghitung Sample Proportion

Sample proportion dihitung menggunakan rumus:

\(𝑝^​=\frac{x}{𝑛}\)

n <- 400
x <- 156

p_hat <- x / n
p_hat
## [1] 0.39
  • Interpretasi : Sebanyak 39% pengguna mengklik tombol CTA.

3.3 Menghitung Confidence Interval

Confidence interval dihitung menggunakan pendekatan normal approximation:

\[ \hat{p} \pm z \times \sqrt{\frac{\hat{p}(1-\hat{p})}{n}} \]

# Data
n <- 400
x <- 156
p_hat <- x / n

# Function CI
compute_ci <- function(conf_level) {
  z <- qnorm((1 + conf_level) / 2)
  se <- sqrt((p_hat * (1 - p_hat)) / n)
  lower <- p_hat - z * se
  upper <- p_hat + z * se
  c(lower, upper)
}

# Compute confidence intervals
ci_90 <- compute_ci(0.90)
ci_95 <- compute_ci(0.95)
ci_99 <- compute_ci(0.99)

3.4 TABEL

Tabel Confidence Interval for CTA Click-Through Rate menampilkan rentang estimasi proporsi pengguna yang mengklik tombol Call-To-Action (CTA) pada tiga tingkat kepercayaan yang berbeda, yaitu 90%, 95%, dan 99%.

  • Kolom Confidence Level menunjukkan tingkat keyakinan yang digunakan dalam perhitungan interval.

  • Lower Bound merupakan batas bawah estimasi proporsi klik CTA.

  • Upper Bound merupakan batas atas estimasi proporsi klik CTA.

Berdasarkan tabel tersebut, dapat dilihat bahwa:

Pada confidence level 90%, interval yang dihasilkan paling sempit, sehingga estimasi proporsi lebih presisi namun dengan tingkat keyakinan yang lebih rendah.

Pada confidence level 95%, interval menjadi lebih lebar dan memberikan keseimbangan antara ketepatan estimasi dan tingkat kepercayaan.

Pada confidence level 99%, interval merupakan yang paling lebar, menunjukkan estimasi yang lebih konservatif dengan tingkat keyakinan yang paling tinggi.

library(dplyr)
library(knitr)
library(kableExtra)

ci_table <- data.frame(
  Confidence_Level = c("90%", "95%", "99%"),
  Lower_Bound = round(c(ci_90[1], ci_95[1], ci_99[1]), 4),
  Upper_Bound = round(c(ci_90[2], ci_95[2], ci_99[2]), 4)
)

kable(ci_table,
      align = "c",
      caption = "Confidence Interval for CTA Click-Through Rate") %>%
  kable_styling(
    bootstrap_options = c("striped", "hover"),
    full_width = TRUE,
    position = "center"
  ) %>%
row_spec(0, bold = TRUE, background = "#1F4E79", color = "white") %>%
  row_spec(1, background = "#E3F2FD") %>%
  row_spec(2, background = "#BBDEFB") %>%
  row_spec(3, background = "#90CAF9")
Confidence Interval for CTA Click-Through Rate
Confidence_Level Lower_Bound Upper_Bound
90% 0.3499 0.4301
95% 0.3422 0.4378
99% 0.3272 0.4528

3.5 VISUALISASI

Visualisasi ini menunjukkan perbandingan confidence interval untuk proporsi klik tombol Call-To-Action (CTA) pada tiga tingkat kepercayaan, yaitu 90%, 95%, dan 99%.

  • Titik biru merepresentasikan sample proportion pengguna yang mengklik CTA, yaitu sebesar 0,39.

  • Garis vertikal pada setiap tingkat kepercayaan menunjukkan rentang confidence interval, yang dibatasi oleh nilai Lower Bound dan Upper Bound.

  • Semakin tinggi confidence level, semakin lebar interval yang terbentuk, menandakan peningkatan tingkat keyakinan namun dengan estimasi yang lebih konservatif.

Visualisasi ini membantu memahami bagaimana pemilihan confidence level memengaruhi ketepatan estimasi dan tingkat keyakinan dalam pengambilan keputusan pada eksperimen A/B testing.

ci_table$Level <- c(90, 95, 99)
ci_table$Midpoint <- p_hat

ggplot(ci_table, aes(x = Level, y = Midpoint)) +
geom_point(size = 4, color = "#1F4E79") +
geom_errorbar(aes(ymin = Lower_Bound, ymax = Upper_Bound),
width = 3, color = "#1F4E79", linewidth = 1.2) +
labs(
title = "Comparison of Confidence Intervals for CTA Click Rate",
x = "Confidence Level (%)",
y = "Proportion of Clicks"
) +
theme_minimal(base_size = 14)

3.6 KESIMPULAN

Pemilihan confidence level sangat memengaruhi tingkat risiko dan keyakinan dalam pengambilan keputusan produk. Untuk eksperimen produk digital, 95% confidence interval adalah pilihan yang paling seimbang.

4 CASE STUDY 4

4.1 Deskripsi Masalah

Dua tim data mengukur API latency (dalam milidetik) dengan kondisi berbeda.

  • Team A menggunakan standar deviasi populasi (σ) yang diketahui
  • Team B menggunakan standar deviasi sampel (s)

Tujuan analisis:

  1. Menentukan uji statistik yang digunakan

  2. Menghitung Confidence Interval 90%, 95%, dan 99%

  3. Membandingkan interval melalui visualisasi

  4. Menjelaskan perbedaan lebar interval

4.2 Data Awal

n  <- 36
mean <- 210
sigma <- 24
s <- 24  
Tim Kondisi Uji Statistik
Team A σ diketahui Z-Test
Team B σ tidak diketahui t-Test

4.3 Perhitungan Confidence Interval

Confidence Interval dihitung untuk mengestimasi rentang nilai rata-rata API latency populasi berdasarkan data sampel.

Rata-rata sampel adalah 210 ms dengan ukuran sampel n = 36.

Standard Error untuk kedua tim sama:

\[SE = \frac{24}{\sqrt{36}} = 4\] Perbedaan interval muncul dari nilai kritis yang digunakan:

Team A (Z-Test) menggunakan distribusi normal baku

Team B (t-Test) menggunakan distribusi t dengan derajat bebas df = 35

Rumus umum Confidence Interval:

\[CI = \bar{x} \pm (\text{nilai kritis}) \times SE\]

Karena nilai kritis t lebih besar daripada nilai kritis z, maka interval Team B lebih lebar, meskipun mean dan standar deviasi sama.

Semakin tinggi tingkat kepercayaan (90% → 99%), semakin lebar interval yang dihasilkan.

library(dplyr)

se_z <- sigma / sqrt(n)
se_t <- s / sqrt(n)

z_90 <- qnorm(0.95)
z_95 <- qnorm(0.975)
z_99 <- qnorm(0.995)

t_90 <- qt(0.95, df = n-1)
t_95 <- qt(0.975, df = n-1)
t_99 <- qt(0.995, df = n-1)

ci_data <- data.frame(
Team = rep(c("Team A (Z-Test)", "Team B (t-Test)"), each = 3),
Confidence = rep(c("90%", "95%", "99%"), 2),
Lower = c(mean - z_90*se_z,
mean - z_95*se_z,
mean - z_99*se_z,
mean - t_90*se_t,
mean - t_95*se_t,
mean - t_99*se_t),
Upper = c(mean + z_90*se_z,
mean + z_95*se_z,
mean + z_99*se_z,
mean + t_90*se_t,
mean + t_95*se_t,
mean + t_99*se_t)
)
ci_data

4.4 TABEL

Tabel Confidence Interval menampilkan batas bawah (Lower) dan batas atas (Upper) estimasi rata-rata latency untuk setiap tingkat kepercayaan.

Struktur Tabel

  • Team Menunjukkan metode statistik yang digunakan (Z-Test atau t-Test)

  • Confidence Tingkat kepercayaan (90%, 95%, 99%)

  • Lower Batas bawah estimasi mean populasi

  • Upper Batas atas estimasi mean populasi

Makna Nilai dalam Tabel

Sebagai contoh:

Team A – 95% CI Interval yang lebih sempit menunjukkan estimasi yang lebih presisi karena standar deviasi populasi diketahui.

Team B – 95% CI Interval lebih lebar karena distribusi t mempertimbangkan ketidakpastian tambahan dari estimasi standar deviasi sampel.

library(knitr)
library(kableExtra)

ci_data %>%
mutate(
Lower = round(Lower, 2),
Upper = round(Upper, 2)
) %>%
kable(
align = "c",
caption = "Confidence Interval API Latency (ms)"
) %>%
kable_styling(
bootstrap_options = c("striped", "hover"),
full_width = TRUE,
font_size = 16
) %>%
row_spec(0, bold = TRUE, background = "#1F4E79", color = "white") %>%
  row_spec(1, background = "#E3F2FD") %>%
  row_spec(2, background = "#BBDEFB") %>%
  row_spec(3, background = "#90CAF9") %>%
  row_spec(4, background = "#E3F2FD") %>%
  row_spec(5, background = "#BBDEFB") %>%
  row_spec(6, background = "#90CAF9")
Confidence Interval API Latency (ms)
Team Confidence Lower Upper
Team A (Z-Test) 90% 203.42 216.58
Team A (Z-Test) 95% 202.16 217.84
Team A (Z-Test) 99% 199.70 220.30
Team B (t-Test) 90% 203.24 216.76
Team B (t-Test) 95% 201.88 218.12
Team B (t-Test) 99% 199.10 220.90

4.5 VISUALISASI

library(ggplot2)

ggplot(ci_data, aes(x = Confidence, y = mean, ymin = Lower, ymax = Upper,
                    color = Team, group = Team)) +
  geom_errorbar(width = 0.15, size = 1.3) +
  geom_point(size = 4) +
  labs(
    title = "Perbandingan Confidence Interval API Latency",
    y = "Latency (ms)",
    x = "Confidence Level"
  ) +
  theme_minimal(base_size = 16) +
  scale_color_manual(values = c("#1F4FD8", "#0B84A5"))

  • Perbedaan Lebar Interval

Walaupun mean, ukuran sampel, dan standar deviasi sama, lebar interval berbeda karena:

Z-Test (Team A) menggunakan nilai kritis dari distribusi normal

t-Test (Team B) menggunakan distribusi t yang:

  • Lebih konservatif

  • Memiliki ekor lebih tebal

  • Menghasilkan interval lebih lebar

Perbedaan ini mencerminkan ketidakpastian tambahan saat σ populasi tidak diketahui.

4.6 KESIMPULAN

Team A menggunakan Z-Test (interval lebih sempit)

Team B menggunakan t-Test (interval lebih lebar)

Semakin tinggi tingkat confidence:

  • Interval semakin lebar

  • Tingkat kepastian meningkat

  • Distribusi t lebih aman untuk sampel nyata

5 CASE STUDY 5

5.1 One-Sided Confidence Interval

Sebuah perusahaan Software as a Service (SaaS) ingin memastikan minimal 70% pengguna aktif mingguan menggunakan fitur premium.

Data eksperimen menunjukkan: - Total pengguna: 250

  • Pengguna aktif fitur premium: 185

Tujuan analisis ini adalah:

  1. Menghitung one-sided lower confidence interval untuk proporsi pengguna premium.

  2. Menentukan apakah target 70% tercapai secara statistik.

  3. Menyajikan hasil dalam tabel dan visualisasi yang mudah dipahami.

5.2 Data

total_users <- 250
active_premium_users <- 185
p_hat <- active_premium_users / total_users  # proporsi sample
p_hat
## [1] 0.74

5.3 Jenis

  • One-sided lower confidence interval karena fokus pada batas bawah.
  • Uji proporsi z (z-test) untuk proporsi pengguna premium.

5.4 Menghitung Batas Bawah CI

lower_bound_CI <- function(p_hat, n, conf_level) {
  z <- qnorm(conf_level)
  lb <- p_hat - z * sqrt(p_hat * (1 - p_hat) / n)
  return(lb)
}

# Hitung untuk 90%, 95%, 99%
conf_levels <- c(0.90, 0.95, 0.99)
lower_bounds <- sapply(conf_levels, lower_bound_CI, p_hat=p_hat, n=total_users)
lower_bounds
## [1] 0.7044476 0.6943690 0.6754632

5.5 TABEL

Tabel ini menampilkan batas bawah (lower bound) one-sided confidence interval untuk proporsi pengguna premium pada tiga level kepercayaan: 90%, 95%, dan 99%.

Kolom Confidence Level menunjukkan tingkat keyakinan yang digunakan untuk menghitung CI.

Kolom Lower Bound menampilkan nilai batas bawah proporsi pengguna premium yang diestimasi dari data sample. Nilai ini menunjukkan proporsi minimal pengguna premium dengan tingkat keyakinan tertentu.

library(knitr)
library(kableExtra)

CI_table <- data.frame(
  "Confidence Level" = c("90%", "95%", "99%"),
  "Lower Bound" = round(lower_bounds, 3)
)

kable(CI_table, "html") %>%
  kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive"),
                full_width = F, position = "center"
    ) %>%
  row_spec(0, bold = TRUE, background = "#1F4E79", color = "white") %>%
  row_spec(1, background = "#E3F2FD") %>%
  row_spec(2, background = "#BBDEFB") %>%
  row_spec(3, background = "#90CAF9")
Confidence.Level Lower.Bound
90% 0.704
95% 0.694
99% 0.675

5.6 VISUALISASI

Visualisasi ini menunjukkan batas bawah one-sided confidence interval untuk proporsi pengguna premium pada tiga level kepercayaan: 90%, 95%, dan 99%. Setiap batang mewakili lower bound CI pada level kepercayaan tertentu, dengan angka proporsi ditampilkan di atas batang agar mudah dibaca.

library(ggplot2)

df_plot <- data.frame(
  Confidence = c("90%", "95%", "99%"),
  LowerBound = lower_bounds
)

ggplot(df_plot, aes(x=Confidence, y=LowerBound, fill=Confidence)) +
  geom_bar(stat="identity") +
  geom_hline(yintercept = 0.70, linetype="dashed", color="red", size=1) +
  labs(title="Batas Bawah One-Sided CI untuk Pengguna Premium",
       subtitle="Garis merah putus-putus = target minimal 70%",
       y="Lower Bound CI",
       x="Confidence Level") +
  scale_fill_manual(values=c("#56B4E9", "#0073C2", "#003366")) +
  theme_minimal() +
  theme(legend.position="none")


5.7 KESIMPULAN

Analisis menunjukkan bahwa target minimal 70% pengguna premium hanya dapat dikonfirmasi pada level confidence 90%. Pada level confidence yang lebih tinggi, perusahaan tidak dapat secara pasti menyatakan target tercapai. Oleh karena itu, manajemen dapat mengambil keputusan dengan mempertimbangkan tingkat keyakinan yang diinginkan.

LS0tDQp0aXRsZTogIlNUVURZIENBU0VTIiAgICAgICAjIE1haW4gdGl0bGUgb2YgdGhlIGRvY3VtZW50DQpzdWJ0aXRsZTogIkNvbmZpZGVuY2UgSW50ZXJ2YWx+IFdlZWsgMTMiICAjIFN1YnRpdGxlIG9yIHRvcGljIGZvciB3ZWVrIDQNCmF1dGhvcjogDQotICJWZXJvbmljYSBNIEwgRiBYYXZpZXIiICAgICAgICMgUmVwbGFjZSB3aXRoIHlvdXIgZnVsbCBuYW1lDQpkYXRlOiAgImByIGZvcm1hdChTeXMuRGF0ZSgpLCAnJUIgJWQsICVZJylgIiAjIEF1dG8gZGlzcGxheXMgdGhlIGN1cnJlbnQgZGF0ZQ0Kb3V0cHV0OiAgICAgICAgICAgICAgICAgICAgICAgICAjIE91dHB1dCBzZWN0aW9uIGRlZmluZXMgdGhlIGZvcm1hdCBhbmQgbGF5b3V0IA0KICBybWRmb3JtYXRzOjpyZWFkdGhlZG93bjogICAgICAjIGh0dHBzOi8vZ2l0aHViLmNvbS9qdWJhL3JtZGZvcm1hdHMNCiAgICBzZWxmX2NvbnRhaW5lZDogdHJ1ZSAgICAgICAgIyBFbWJlZHMgYWxsIHJlc291cmNlcyAoQ1NTLCBKUywgaW1hZ2VzKSANCiAgICB0aHVtYm5haWxzOiB0cnVlICAgICAgICAgICAgIyBEaXNwbGF5cyBpbWFnZSB0aHVtYm5haWxzIGluIHRoZSBkb2MNCiAgICBsaWdodGJveDogdHJ1ZSAgICAgICAgICAgICAgIyBFbmFibGVzIGNsaWNrIHRvIGVubGFyZ2UgaW1hZ2VzDQogICAgZ2FsbGVyeTogdHJ1ZSAgICAgICAgICAgICAgICMgR3JvdXBzIGltYWdlcyBpbnRvIGFuIGludGVyYWN0aXZlIGdhbGxlcnkNCiAgICBudW1iZXJfc2VjdGlvbnM6IHRydWUgICAgICAgIyBBdXRvbWF0aWNhbGx5IG51bWJlcnMgYWxsIHNlY3Rpb25zDQogICAgbGliX2RpcjogbGlicyAgICAgICAgICAgICAgICMgRGlyZWN0b3J5IHdoZXJlIEphdmFTY3JpcHQvQ1NTIGxpYnJhcmllcw0KICAgIGRmX3ByaW50OiAicGFnZWQiICAgICAgICAgICAjIERpc3BsYXlzIGRhdGEgZnJhbWVzIGFzIGludGVyYWN0aXZlIHBhZ2VkIA0KICAgIGNvZGVfZm9sZGluZzogInNob3ciICAgICAgICAjIEFsbG93cyBmb2xkaW5nL3VuZm9sZGluZyBSIGNvZGUgYmxvY2tzIA0KICAgIGNvZGVfZG93bmxvYWQ6IHllcyAgICAgICAgICAjIEFkZHMgYSBidXR0b24gdG8gZG93bmxvYWQgYWxsIFIgY29kZQ0KICAgIGNzczo6U3R5bGUuY3NzOg0KLS0tDQoNCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFKQ0KYGBgDQoNCjxib2R5Pg0KPHN0eWxlPg0KICAgIGJvZHkgew0KICAgICAgICBtYXJnaW46IDA7DQogICAgICAgIHBhZGRpbmc6IDQwcHg7DQogICAgICAgIGJhY2tncm91bmQ6ICNmZmQ2ZTg7IA0KICAgICAgICBmb250LWZhbWlseTogQXJpYWwsIHNhbnMtc2VyaWY7DQogICAgfQ0KLnByb2ZpbGUtY2FyZCB7DQogIGRpc3BsYXk6IGZsZXg7DQogIGFsaWduLWl0ZW1zOiBjZW50ZXI7DQogIGdhcDogMjVweDsNCiAgcGFkZGluZzogMjVweDsNCiAgYm9yZGVyLXJhZGl1czogMjBweDsNCiAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDEzNWRlZywgI2ZmZTZlZiwgI2ZhZDdlOCwgI2ZmZWVmNyk7DQogIGJveC1zaGFkb3c6IDAgNnB4IDIwcHggcmdiYSgyNTUsIDE4MiwgMTkzLCAwLjMpOw0KICBtYXgtd2lkdGg6IDkwMHB4Ow0KICBtYXJnaW46IDIwcHggYXV0bzsNCn0NCg0KLnByb2ZpbGUtY2FyZCBpbWcgew0KICB3aWR0aDogMTgwcHg7DQogIGJvcmRlci1yYWRpdXM6IDUwJTsNCiAgYm9yZGVyOiA0cHggc29saWQgd2hpdGU7DQogIGJveC1zaGFkb3c6IDAgMCAxMnB4IHJnYmEoMCwwLDAsMC4yNSk7DQp9DQoNCi5wcm9maWxlLXRleHQgaDMgew0KICBmb250LXNpemU6IDMwcHg7DQogIGZvbnQtd2VpZ2h0OiA5MDA7DQogIG1hcmdpbi1ib3R0b206IDZweDsNCiAgY29sb3I6ICM4QjFFNDE7DQogIHRleHQtYWxpZ246IGxlZnQ7DQp9DQoNCi5wcm9maWxlLWRlc2NyaXB0aW9uIHsNCiAgZm9udC1zaXplOiAxNHB4Ow0KICBmb250LXdlaWdodDogNzAwOw0KICBmb250LXN0eWxlOiBpdGFsaWM7DQogIGNvbG9yOiAjNGE0YTRhOw0KICBtYXJnaW4tYm90dG9tOiAxOHB4Ow0KICB0ZXh0LWFsaWduOiBsZWZ0Ow0KfQ0KDQoucHJvZmlsZS1pbmZvLXJvdyB7DQogIGRpc3BsYXk6IGZsZXg7DQogIA0KICBnYXA6IDI1cHg7DQogIGZsZXgtd3JhcDogd3JhcDsNCn0NCg0KLnByb2ZpbGUtaW5mby1pdGVtIGIgew0KICBmb250LXdlaWdodDogNzAwOw0KfQ0KDQoucHJvZmlsZS1pbmZvLWl0ZW0gLm1lbnRvci1uYW1lIHsNCiAgZm9udC1zaXplOiAxNXB4Ow0KICBmb250LXdlaWdodDogNzAwOw0KICBmb250LXN0eWxlOiBpdGFsaWM7DQp9ICANCjwvc3R5bGU+DQoNCmBgYHtyfQ0KbGlicmFyeShodG1sdG9vbHMpDQoNCkhUTUwoJw0KPGRpdiBjbGFzcz0icHJvZmlsZS1jYXJkIj4NCg0KICA8ZGl2Pg0KICAgIDxpbWcgc3JjPSJBbG1ldGNva2trLkpQRyI+DQogIDwvZGl2Pg0KDQogIDxkaXYgY2xhc3M9InByb2ZpbGUtdGV4dCI+DQogICAgPGgzPlZlcsOzbmljYSBNYXJpYSBMIEYgWGF2aWVyPC9oMz4NCg0KICAgIDxkaXYgY2xhc3M9InByb2ZpbGUtZGVzY3JpcHRpb24iPg0KICAgICAgYXMgYSBTdHVkZW50IERhdGEgU2NpZW5jZSBpbiBJbnN0aXR1dCBUZWtub2xvZ2kgU2FpbnMgQmFuZHVuZw0KICAgIDwvZGl2Pg0KDQogICAgPGRpdiBjbGFzcz0icHJvZmlsZS1pbmZvLXJvdyI+DQogICAgICA8cCBjbGFzcz0icHJvZmlsZS1pbmZvLWl0ZW0iPg0KICAgICAgICA8Yj5NZW50b3JlZCBieTo8L2I+IDxzcGFuIGNsYXNzPSJtZW50b3ItbmFtZSI+TXIuIEJha3RpIFNpcmVnYXIgTS5TYy4sQ0RTPC9zcGFuPg0KICAgICAgPC9wPg0KICAgIDwvZGl2Pg0KICAgIDwvZGl2Pg0KICAgIA0KICAgIA0KPC9kaXY+DQonKQ0KYGBgDQoNCiMjIENBU0UgU1RVRFkgMQ0KDQojIyMgQ29uZmlkZW5jZSBJbnRlcnZhbCB1bnR1ayBNZWFuICjPgyBEaWtldGFodWkpDQoNClNlYnVhaCBwbGF0Zm9ybSBlLWNvbW1lcmNlIGluZ2luIG1lbmdlc3RpbWFzaSByYXRhLXJhdGEganVtbGFoIHRyYW5zYWtzaSBoYXJpYW4gDQpwZXIgcGVuZ2d1bmEgc2V0ZWxhaCBwZWx1bmN1cmFuIGZpdHVyIGJhcnUuIEJlcmRhc2Fya2FuIGRhdGEgaGlzdG9yaXMgYmVyc2thbGEgDQpiZXNhciwgc3RhbmRhciBkZXZpYXNpIHBvcHVsYXNpIGRpa2V0YWh1aS4gT2xlaCBrYXJlbmEgaXR1LCBhbmFsaXNpcyBkaWxha3VrYW4gDQptZW5nZ3VuYWthbiBtZXRvZGUgQ29uZmlkZW5jZSBJbnRlcnZhbCB1bnR1ayBtZWFuIGRlbmdhbiBkaXN0cmlidXNpIFouDQoNCg0KIyMjIElkZW50aWZpa2FzaSBNZXRvZGUgU3RhdGlzdGlrDQoNCk1ldG9kZSBzdGF0aXN0aWsgeWFuZyBkaWd1bmFrYW4gZGFsYW0gc3R1ZGkga2FzdXMgaW5pIGFkYWxhaCAqWi1Db25maWRlbmNlIEludGVydmFsKi4NCg0KTWV0b2RlIGluaSBkaXBpbGloIGthcmVuYToNCi0gVHVqdWFuIGFuYWxpc2lzIGFkYWxhaCBtZW5nZXN0aW1hc2kgcmF0YS1yYXRhIHBvcHVsYXNpDQotIFN0YW5kYXIgZGV2aWFzaSBwb3B1bGFzaSAoz4MpIGRpa2V0YWh1aQ0KLSBVa3VyYW4gc2FtcGVsIGJlc2FyIChuIOKJpSAzMCkNCg0KDQojIyMgRGF0YSBkYW4gUGFyYW1ldGVyDQoNCmBgYHtyfQ0KIyBQYXJhbWV0ZXIgZGFzYXINCnNpZ21hIDwtIDMuMg0KbiA8LSAxMDANCnhiYXIgPC0gMTIuNg0KDQojIFN0YW5kYXJkIEVycm9yDQpTRSA8LSBzaWdtYSAvIHNxcnQobikNCg0KIyBOaWxhaSBaDQp6XzkwIDwtIHFub3JtKDAuOTUpDQp6Xzk1IDwtIHFub3JtKDAuOTc1KQ0Kel85OSA8LSBxbm9ybSgwLjk5NSkNCg0KIyBDb25maWRlbmNlIEludGVydmFsDQpDSV85MCA8LSBjKHhiYXIgLSB6XzkwICogU0UsIHhiYXIgKyB6XzkwICogU0UpDQpDSV85NSA8LSBjKHhiYXIgLSB6Xzk1ICogU0UsIHhiYXIgKyB6Xzk1ICogU0UpDQpDSV85OSA8LSBjKHhiYXIgLSB6Xzk5ICogU0UsIHhiYXIgKyB6Xzk5ICogU0UpDQoNCkNJXzkwDQpDSV85NQ0KQ0lfOTkNCg0KYGBgDQoNCg0KIyMjIFRBQkVMIA0KDQpUYWJlbCBpbmkgbWVudW5qdWtrYW4gYmFod2EgcmF0YS1yYXRhIHRyYW5zYWtzaSBoYXJpYW4gZGlwZXJraXJha2FuIGJlcmFkYSBkaSANCmtpc2FyYW4gc2VraXRhciAxMuKAkzEzIHRyYW5zYWtzaSBwZXIgaGFyaS4NCg0KSmlrYSBkaWd1bmFrYW4gdW50dWsgcGVuZ2FtYmlsYW4ga2VwdXR1c2FuOg0KLSA5NSUgY29uZmlkZW5jZSBpbnRlcnZhbCBiaWFzYW55YSBwYWxpbmcgZGlzYXJhbmthbiBrYXJlbmEgbWVtYmVyaWthbiBrZXNlaW1iYW5nYW4gDQphbnRhcmEga2Vha3VyYXRhbiBkYW4ga2VwZXJjYXlhYW4gaGFzaWwuDQoNCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KbGlicmFyeShrbml0cikNCmxpYnJhcnkoa2FibGVFeHRyYSkNCg0KQ0lfdGFibGUgPC0gZGF0YS5mcmFtZSgNCiAgQ29uZmlkZW5jZV9MZXZlbCA9IGMoIjkwJSIsICI5NSUiLCAiOTklIiksDQogIExvd2VyX0JvdW5kID0gYyhDSV85MFsxXSwgQ0lfOTVbMV0sIENJXzk5WzFdKSwNCiAgVXBwZXJfQm91bmQgPSBjKENJXzkwWzJdLCBDSV85NVsyXSwgQ0lfOTlbMl0pDQopDQoNCmthYmxlKA0KICBDSV90YWJsZSwNCiAgZGlnaXRzID0gMywNCiAgYWxpZ24gPSAiYyIsDQogIGNhcHRpb24gPSAiPHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToyMnB4OyBmb250LXdlaWdodDpib2xkOyc+Q29uZmlkZW5jZSBJbnRlcnZhbCANCiAgUmF0YS1yYXRhIFRyYW5zYWtzaSBIYXJpYW48L3NwYW4+IiwNCiAgDQogIGVzY2FwZSA9IEZBTFNFDQopICU+JQ0KICBrYWJsZV9zdHlsaW5nKA0KICAgIGJvb3RzdHJhcF9vcHRpb25zID0gYygic3RyaXBlZCIsICJob3ZlciIpLA0KICAgIGZ1bGxfd2lkdGggPSBUUlVFLA0KICAgIGZvbnRfc2l6ZSA9IDE4DQogICkgJT4lDQogIHJvd19zcGVjKDAsIGJvbGQgPSBUUlVFLCBiYWNrZ3JvdW5kID0gIiM0RjgxQkQiLCBjb2xvciA9ICJ3aGl0ZSIpICU+JQ0KICByb3dfc3BlYygxLCBiYWNrZ3JvdW5kID0gIiNEOUUxRjIiKSAlPiUNCiAgcm93X3NwZWMoMiwgYmFja2dyb3VuZCA9ICIjQkREN0VFIikgJT4lDQogIHJvd19zcGVjKDMsIGJhY2tncm91bmQgPSAiIzlEQzNFNiIpDQpgYGANCg0KIyMjIFZpc3VhbGlzYXNpIFBlcmJhbmRpbmdhbiBDb25maWRlbmNlIEludGVydmFsDQoNClZpc3VhbGlzYXNpIGNvbmZpZGVuY2UgaW50ZXJ2YWwgbWVudW5qdWtrYW4gYmFod2Egc2VtYWtpbiB0aW5nZ2kgdGluZ2thdA0Ka2VwZXJjYXlhYW4geWFuZyBkaWd1bmFrYW4sIHNlbWFraW4gbGViYXIgcmVudGFuZyBlc3RpbWFzaSByYXRhLXJhdGEgdHJhbnNha3NpIGhhcmlhbi4gDQpJbnRlcnZhbCBrZXBlcmNheWFhbiA5NSUgbWVtYmVyaWthbiBrZXNlaW1iYW5nYW4gdGVyYmFpayBhbnRhcmEga2V0ZWxpdGlhbiANCmRhbiBrZXlha2luYW4sIHNlaGluZ2dhIHBhbGluZyBkaXJla29tZW5kYXNpa2FuIHVudHVrIHBlbmdhbWJpbGFuIGtlcHV0dXNhbiBzdGF0aXN0aWsuIA0KU2VsdXJ1aCBpbnRlcnZhbCBtZW51bmp1a2thbiBiYWh3YSByYXRhLXJhdGEgdHJhbnNha3NpIGhhcmlhbiBiZXJhZGEgDQpkaSBzZWtpdGFyIDEy4oCTMTMgdHJhbnNha3NpIHBlciBoYXJpLg0KDQpgYGB7cn0NCmxpYnJhcnkoZ2dwbG90MikNCg0KIyBEYXRhIENvbmZpZGVuY2UgSW50ZXJ2YWwNCkNJX3Bsb3QgPC0gZGF0YS5mcmFtZSgNCiAgTGV2ZWwgPSBmYWN0b3IoYygiOTAlIiwgIjk1JSIsICI5OSUiKSwNCiAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygiOTAlIiwgIjk1JSIsICI5OSUiKSksDQogIExvd2VyID0gYygxMi4wNzQsIDExLjk3MywgMTEuNzc2KSwNCiAgVXBwZXIgPSBjKDEzLjEyNiwgMTMuMjI3LCAxMy40MjQpLA0KICBNZWFuICA9IGMoMTIuNiwgMTIuNiwgMTIuNikNCikNCg0KIyBWaXN1YWxpc2FzaSBDb25maWRlbmNlIEludGVydmFsDQpnZ3Bsb3QoQ0lfcGxvdCwgYWVzKHkgPSBMZXZlbCkpICsNCiAgZ2VvbV9lcnJvcmJhcigNCiAgICBhZXMoeG1pbiA9IExvd2VyLCB4bWF4ID0gVXBwZXIpLA0KICAgIG9yaWVudGF0aW9uID0gInkiLA0KICAgIHdpZHRoID0gMC4yNSwNCiAgICBjb2xvciA9ICJzdGVlbGJsdWUiLA0KICAgIGxpbmV3aWR0aCA9IDEuMg0KICApICsNCiAgZ2VvbV9wb2ludCgNCiAgICBhZXMoeCA9IE1lYW4pLA0KICAgIGNvbG9yID0gInN0ZWVsYmx1ZSIsDQogICAgc2l6ZSA9IDQNCiAgKSArDQogIGxhYnMoDQogICAgdGl0bGUgPSAiUGVyYmFuZGluZ2FuIENvbmZpZGVuY2UgSW50ZXJ2YWwgUmF0YS1yYXRhIFRyYW5zYWtzaSBIYXJpYW4iLA0KICAgIHggPSAiSnVtbGFoIFRyYW5zYWtzaSBIYXJpYW4iLA0KICAgIHkgPSAiQ29uZmlkZW5jZSBMZXZlbCINCiAgKSArDQogIHRoZW1lX21pbmltYWwoYmFzZV9zaXplID0gMTQpDQpgYGANCg0KIyMjIElOVEVSUFJFVEFTSSANCg0KQmVyZGFzYXJrYW4gaGFzaWwgYW5hbGlzaXMsIGludGVydmFsIGtlcGVyY2F5YWFuIDk1JSBtZW51bmp1a2thbiBiYWh3YSByYXRhLXJhdGEgDQp0cmFuc2Frc2kgaGFyaWFuIHBlciBwZW5nZ3VuYSBiZXJhZGEgcGFkYSByZW50YW5nIHlhbmcgcmVsYXRpZiBzZW1waXQgZGFuIHN0YWJpbC4gDQpTZW1ha2luIHRpbmdnaSB0aW5na2F0IGtlcGVyY2F5YWFuLCBzZW1ha2luIGxlYmFyIGludGVydmFsIHlhbmcgZGloYXNpbGthbiwgDQp5YW5nIG1lbmNlcm1pbmthbiB0aW5na2F0IGtldGlkYWtwYXN0aWFuIHlhbmcgbGViaWgga2VjaWwuDQoNCg0KIyMjIEtFU0lNUFVMQU4NCg0KQ29uZmlkZW5jZSBJbnRlcnZhbCBtZW1iZXJpa2FuIGdhbWJhcmFuIHlhbmcgamVsYXMgbWVuZ2VuYWkgZXN0aW1hc2kgcmF0YS1yYXRhIA0KdHJhbnNha3NpIGhhcmlhbiBwZW5nZ3VuYSBzZXRlbGFoIHBlbHVuY3VyYW4gZml0dXIgYmFydS4gSW5mb3JtYXNpIGluaSBkYXBhdA0KZGlndW5ha2FuIG9sZWggbWFuYWplbWVuIHVudHVrIG1lbmdldmFsdWFzaSBlZmVrdGl2aXRhcyBmaXR1ciBzZXJ0YSBzZWJhZ2FpIGRhc2FyIA0KcGVuZ2FtYmlsYW4ga2VwdXR1c2FuIHN0cmF0ZWdpcyBiZXJiYXNpcyBkYXRhLg0KDQoNCiMjIENBU0UgU1RVRFkgMg0KDQojIyMgQ29uZmlkZW5jZSBJbnRlcnZhbCB1bnR1ayBNZWFuICjPgyBUaWRhayBEaWtldGFodWkpDQpXYWt0dSBwZW55ZWxlc2FpYW4gdHVnYXMgKGRhbGFtIG1lbml0KSBkYXJpIDEyIHBlbmdndW5hIGFwbGlrYXNpIG1vYmlsZSBhZGFsYWggDQpzZWJhZ2FpIGJlcmlrdXQ6DQoNCjguNCwgNy45LCA5LjEsIDguNywgOC4yLCA5LjAsIDcuOCwgOC41LCA4LjksIDguMSwgOC42LCA4LjMNCg0KIyMjIFBlbmplbGFzYW4gVWppIFN0YXRpc3RpayB5YW5nIERpZ3VuYWthbg0KDQpVamkgc3RhdGlzdGlrIHlhbmcgZGlndW5ha2FuIGRhbGFtIHN0dWRpIGthc3VzIGluaSBhZGFsYWggQ29uZmlkZW5jZSBJbnRlcnZhbA0KdW50dWsgTWVhbiBkZW5nYW4gZGlzdHJpYnVzaSB0LVN0dWRlbnQuDQoNClBlbWlsaWhhbiBtZXRvZGUgaW5pIGRpZGFzYXJrYW4gcGFkYSBiZWJlcmFwYSBhbGFzYW4uIFBlcnRhbWEsIHR1anVhbiBhbmFsaXNpcyANCmFkYWxhaCB1bnR1ayBtZW5nZXN0aW1hc2kgcmF0YS1yYXRhIHBvcHVsYXNpIHdha3R1IHBlbnllbGVzYWlhbiB0dWdhcy4gS2VkdWEsIA0KdWt1cmFuIHNhbXBlbCByZWxhdGlmIGtlY2lsLCB5YWl0dSBzZWJhbnlhayAxMiBwZW5nZ3VuYS4gS2V0aWdhLCBzdGFuZGFyIGRldmlhc2kNCnBvcHVsYXNpICjPgykgdGlkYWsgZGlrZXRhaHVpLCBzZWhpbmdnYSBkaXN0cmlidXNpIG5vcm1hbCAoeikgdGlkYWsgZGFwYXQgZGlndW5ha2FuLg0KT2xlaCBrYXJlbmEgaXR1LCBkaXN0cmlidXNpIHQtU3R1ZGVudCBtZXJ1cGFrYW4gcGVuZGVrYXRhbiB5YW5nIHBhbGluZyB0ZXBhdC4NCg0KIyMjIENvbmZpZGVuY2UgSW50ZXJ2YWwgKDkwJSwgOTUlLCBkYW4gOTklKQ0KDQpCZXJkYXNhcmthbiBwZXJoaXR1bmdhbiBzdGF0aXN0aWsgZGlwZXJvbGVoIG5pbGFpIHJhdGEtcmF0YSBzYW1wZWwgc2ViZXNhciA4LjQ2IG1lbml0LiANCkNvbmZpZGVuY2UgaW50ZXJ2YWwgZGloaXR1bmcgbWVuZ2d1bmFrYW4gZGlzdHJpYnVzaSB0LVN0dWRlbnQgZGVuZ2FuDQpkZXJhamF0IGtlYmViYXNhbiAoZGYpID0gMTEuDQoNCiMjIyBUQUJFTA0KDQpCZXJkYXNhcmthbiB0YWJlbCB5YW5nIGRpYmF3YWgsIGJlcmlrdXQgYWRhbGFoIGtlc2ltcHVsYW4gdXRhbWEgbWVuZ2VuYWkgZGF0YSB0ZXJzZWJ1dDoNCg0KRXN0aW1hc2kgTmlsYWkgUmF0YS1yYXRhOiBUYWJlbCBpbmkgbWVudW5qdWtrYW4gcmVudGFuZyBuaWxhaSBkaSBtYW5hIHJhdGEtcmF0YSANCnBvcHVsYXNpIHlhbmcgc2ViZW5hcm55YSBrZW11bmdraW5hbiBiZXNhciBiZXJhZGEuIFRpdGlrIHRlbmdhaCAobWVhbiBzYW1wZWwpIA0KZGFyaSBkYXRhIGluaSBhZGFsYWggOCw0NTg1Lg0KDQpIdWJ1bmdhbiBUaW5na2F0IEtlcGVyY2F5YWFuIGRhbiBSZW50YW5nOg0KDQpUZXJkYXBhdCBodWJ1bmdhbiBzZWFyYWggYW50YXJhIENvbmZpZGVuY2UgTGV2ZWwgZGFuIGxlYmFyIGludGVydmFsLiANClNlbWFraW4gdGluZ2dpIHRpbmdrYXQga2VwZXJjYXlhYW4geWFuZyBkaWluZ2lua2FuIChkYXJpIDkwJSBrZSA5OSUpLCBtYWthIHJlbnRhbmcgDQphbnRhcmEgTG93ZXIgQm91bmQgZGFuIFVwcGVyIEJvdW5kIGFrYW4gc2VtYWtpbiBsZWJhci4NCg0KSW50ZXJ2YWwgOTAlICg4LDI0MCDigJMgOCw2NzcpIGFkYWxhaCB5YW5nIHBhbGluZyBzZW1waXQvcHJlc2lzaSwgbmFtdW4gbWVtaWxpa2kNCnJpc2lrbyBlcnJvciB0ZXJ0aW5nZ2kgKDEwJSkuDQoNCkludGVydmFsIDk5JSAoOCwwODEg4oCTIDgsODM2KSBhZGFsYWggeWFuZyBwYWxpbmcgbGViYXIsIG1lbWJlcmlrYW4ga2VwYXN0aWFuIA0KcGFsaW5nIHRpbmdnaSBiYWh3YSBuaWxhaSBiZW5hciB0ZXJjYWt1cCBkaSBkYWxhbW55YSwgbmFtdW4gZGVuZ2FuIHByZXNpc2kgeWFuZyBsZWJpaCByZW5kYWguDQoNCg0KYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCmxpYnJhcnkoZHBseXIpDQpsaWJyYXJ5KGtuaXRyKQ0KbGlicmFyeShrYWJsZUV4dHJhKQ0KDQpkYXRhIDwtIGMoOC40LCA3LjksIDkuMSwgOC43LCA4LjIsIDkuMCwgNy44LCA4LjUsIDguOSwgOC4xLCA4LjYsIDguMykNCg0KY2lfdGFibGUgPC0gZGF0YS5mcmFtZSgNCiAgYENvbmZpZGVuY2UgTGV2ZWxgID0gYygiOTAlIiwgIjk1JSIsICI5OSUiKSwNCiAgYExvd2VyIEJvdW5kYCA9IGMoDQogICAgbWVhbihkYXRhKSAtIHF0KDAuOTUsIDExKSAqIHNkKGRhdGEpL3NxcnQoMTIpLA0KICAgIG1lYW4oZGF0YSkgLSBxdCgwLjk3NSwgMTEpICogc2QoZGF0YSkvc3FydCgxMiksDQogICAgbWVhbihkYXRhKSAtIHF0KDAuOTk1LCAxMSkgKiBzZChkYXRhKS9zcXJ0KDEyKQ0KICApLA0KICBgVXBwZXIgQm91bmRgID0gYygNCiAgICBtZWFuKGRhdGEpICsgcXQoMC45NSwgMTEpICogc2QoZGF0YSkvc3FydCgxMiksDQogICAgbWVhbihkYXRhKSArIHF0KDAuOTc1LCAxMSkgKiBzZChkYXRhKS9zcXJ0KDEyKSwNCiAgICBtZWFuKGRhdGEpICsgcXQoMC45OTUsIDExKSAqIHNkKGRhdGEpL3NxcnQoMTIpDQogICkNCikNCg0Ka2FibGUoY2lfdGFibGUsIGRpZ2l0cyA9IDMsIGFsaWduID0gImMiKSAlPiUNCiAga2FibGVfc3R5bGluZygNCiAgICBib290c3RyYXBfb3B0aW9ucyA9IGMoInN0cmlwZWQiLCAiaG92ZXIiLCAiY29uZGVuc2VkIiksDQogICAgZnVsbF93aWR0aCA9IFRSVUUsDQogICAgZm9udF9zaXplID0gMTYNCiAgKSAlPiUNCiAgcm93X3NwZWMoMCwgYm9sZCA9IFRSVUUsIGJhY2tncm91bmQgPSAiIzFGNEU3OSIsIGNvbG9yID0gIndoaXRlIikgJT4lDQogIHJvd19zcGVjKDEsIGJhY2tncm91bmQgPSAiI0UzRjJGRCIpICU+JQ0KICByb3dfc3BlYygyLCBiYWNrZ3JvdW5kID0gIiNCQkRFRkIiKSAlPiUNCiAgcm93X3NwZWMoMywgYmFja2dyb3VuZCA9ICIjOTBDQUY5IikNCmBgYA0KDQoNCiMjIyBWSVNVQUxJU0FTSQ0KVmlzdWFsaXNhc2kgZGliYXdhaCBpbmkgbWVydXBha2FuIEVycm9yIEJhciBDaGFydCB5YW5nIG1lbWJhbmRpbmdrYW4gDQpyZW50YW5nIGVzdGltYXNpIChDb25maWRlbmNlIEludGVydmFsKSBkYXJpIHJhdGEtcmF0YSB3YWt0dSBwZW55ZWxlc2FpYW4gDQp0dWdhcyBwYWRhIHRpZ2EgdGluZ2thdCBrZXlha2luYW4geWFuZyBiZXJiZWRhLiANCg0KUG9pbi1wb2luIHBlbmplbGFzYW5ueWE6DQoNClRpdGlrIEJpcnUgZGkgVGVuZ2FoOiBNZWxhbWJhbmdrYW4gTWVhbiAoUmF0YS1yYXRhKSBzYW1wZWwuIEppa2EgZGlwZXJoYXRpa2FuLCANCnBvc2lzaSB0aXRpayBpbmkgdGV0YXAgc3RhYmlsIGRpIHNla2l0YXIgYW5na2EgOCw0IG1lbml0IHBhZGEga2V0aWdhIGtvbG9tLg0KDQpHYXJpcyBWZXJ0aWthbCAoV2hpc2tlcik6IE1lbnVuanVra2FuIHJlbnRhbmcgQ29uZmlkZW5jZSBJbnRlcnZhbC4gDQpTZW1ha2luIHRpbmdnaSB0aW5na2F0IGtlcGVyY2F5YWFuIChkYXJpIDkwJSBrZSA5OSUpLCBnYXJpc255YSBtZW5qYWRpIHNlbWFraW4gcGFuamFuZy9sZWJhci4NCg0KSW50ZXJwcmV0YXNpIExlYmFyIEdhcmlzOiBHYXJpcyBwYWRhIDk5JSBhZGFsYWggeWFuZyB0ZXJwYW5qYW5nIGthcmVuYSB1bnR1aw0KbWVuY2FwYWkga2VwYXN0aWFuIHlhbmcgbGViaWggdGluZ2dpLCBraXRhIG1lbWVybHVrYW4gcmVudGFuZyBuaWxhaSB5YW5nDQpsZWJpaCBsdWFzIGFnYXIgbmlsYWkgcG9wdWxhc2kgeWFuZyBzZWJlbmFybnlhIHRpZGFrICJ0ZXJsZXBhcyIgZGFyaSBlc3RpbWFzaSBraXRhLg0KDQpgYGB7ciBmaWcud2lkdGg9NywgZmlnLmhlaWdodD01LCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KDQpsaWJyYXJ5KGdncGxvdDIpDQoNCmNpX3Bsb3QgPC0gZGF0YS5mcmFtZSgNCiAgTGV2ZWwgPSBjKCI5MCUiLCAiOTUlIiwgIjk5JSIpLA0KICBNZWFuID0gbWVhbihkYXRhKSwNCiAgTG93ZXIgPSBjaV90YWJsZSRMb3dlci5Cb3VuZCwNCiAgVXBwZXIgPSBjaV90YWJsZSRVcHBlci5Cb3VuZA0KKQ0KDQpnZ3Bsb3QoY2lfcGxvdCwgYWVzKHggPSBMZXZlbCwgeSA9IE1lYW4sIGNvbG9yID0gTGV2ZWwpKSArDQogIGdlb21fcG9pbnQoc2l6ZSA9IDQpICsNCiAgZ2VvbV9lcnJvcmJhcigNCiAgICBhZXMoeW1pbiA9IExvd2VyLCB5bWF4ID0gVXBwZXIpLA0KICAgIHdpZHRoID0gMC4yLCBzaXplID0gMS4yDQogICkgKw0KICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygiIzY0QjVGNiIsICIjNDJBNUY1IiwgIiMxRTg4RTUiKSkgKw0KICBsYWJzKA0KICAgIHRpdGxlID0gIkNvbmZpZGVuY2UgSW50ZXJ2YWwgTWVhbiBXYWt0dSBQZW55ZWxlc2FpYW4gVHVnYXMiLA0KICAgIHN1YnRpdGxlID0gIlBlcmJhbmRpbmdhbiBDSSA5MCUsIDk1JSwgZGFuIDk5JSIsDQogICAgeCA9ICJDb25maWRlbmNlIExldmVsIiwNCiAgICB5ID0gIldha3R1IChtZW5pdCkiDQogICkgKw0KICB0aGVtZV9taW5pbWFsKGJhc2Vfc2l6ZSA9IDE0KSArDQogIHRoZW1lKA0KICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwNCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGZhY2UgPSAiYm9sZCIpDQogICkNCmBgYA0KDQojIyMgUGVuZ2FydWggVWt1cmFuIFNhbXBlbCBkYW4gQ29uZmlkZW5jZSBMZXZlbCB0ZXJoYWRhcCBMZWJhciBJbnRlcnZhbA0KDQpVa3VyYW4gc2FtcGVsIG1lbWlsaWtpIHBlbmdhcnVoIGxhbmdzdW5nIHRlcmhhZGFwIGxlYmFyIGNvbmZpZGVuY2UgaW50ZXJ2YWwuDQpTZW1ha2luIGJlc2FyIHVrdXJhbiBzYW1wZWwsIG1ha2EgbmlsYWkgc3RhbmRhcmQgZXJyb3IgYWthbiBzZW1ha2luIGtlY2lsIHNlaGluZ2dhDQpjb25maWRlbmNlIGludGVydmFsIG1lbmphZGkgbGViaWggc2VtcGl0LiBIYWwgaW5pIG1lbnVuanVra2FuIGVzdGltYXNpIG1lYW4geWFuZyANCnNlbWFraW4gcHJlc2lzaS4NCg0KQ29uZmlkZW5jZSBsZXZlbCBqdWdhIG1lbWVuZ2FydWhpIGxlYmFyIGludGVydmFsLiBTZW1ha2luIHRpbmdnaSB0aW5na2F0IGNvbmZpZGVuY2UNCihtaXNhbG55YSA5OSUpLCBtYWthIGludGVydmFsIHlhbmcgZGloYXNpbGthbiBha2FuIHNlbWFraW4gbGViYXIuIEhhbCBpbmkgZGlzZWJhYmthbg0Ka2FyZW5hIGludGVydmFsIGhhcnVzIG1lbmNha3VwIGFyZWEgeWFuZyBsZWJpaCBiZXNhciB1bnR1ayBtZW1iZXJpa2FuIHRpbmdrYXQgDQprZXlha2luYW4geWFuZyBsZWJpaCB0aW5nZ2kgdGVyaGFkYXAgZXN0aW1hc2kgcGFyYW1ldGVyIHBvcHVsYXNpLg0KDQojIyMgS0VTSU1QVUxBTg0KDQpCZXJkYXNhcmthbiBhbmFsaXNpcyB5YW5nIGRpbGFrdWthbiwgcmF0YS1yYXRhIHdha3R1IHBlbnllbGVzYWlhbiB0dWdhcyBwZW5nZ3VuYSANCmFwbGlrYXNpIGFkYWxhaCBzZWtpdGFyIDguNDYgbWVuaXQuIENvbmZpZGVuY2UgaW50ZXJ2YWwgZGVuZ2FuIHRpbmdrYXQgeWFuZyBsZWJpaA0KdGluZ2dpIG1lbmdoYXNpbGthbiBpbnRlcnZhbCB5YW5nIGxlYmloIGxlYmFyLCBzZWRhbmdrYW4gcGVuaW5na2F0YW4gdWt1cmFuIHNhbXBlbCANCmRhcGF0IG1lbXBlcnNlbXBpdCBpbnRlcnZhbCBlc3RpbWFzaS4gTWV0b2RlIHQtU3R1ZGVudCBtZXJ1cGFrYW4gcGVuZGVrYXRhbiB5YW5nIA0KdGVwYXQgZGFsYW0ga29uZGlzaSBzdGFuZGFyIGRldmlhc2kgcG9wdWxhc2kgdGlkYWsgZGlrZXRhaHVpIGRhbiB1a3VyYW4gc2FtcGVsIA0KcmVsYXRpZiBrZWNpbC4NCg0KDQojIyBDQVNFIFNUVURZIDMNCg0KIyMjIENvbmZpZGVuY2UgSW50ZXJ2YWwgZm9yIGEgUHJvcG9ydGlvbiAoQS9CIFRlc3RpbmcpDQoNClNlYnVhaCB0aW0gZGF0YSBzY2llbmNlIG1lbmphbGFua2FuIEEvQiBUZXN0aW5nIHBhZGEgZGVzYWluIGJhcnUgdG9tYm9sIENhbGwtVG8tQWN0aW9uIChDVEEpLg0KSGFzaWwgZWtzcGVyaW1lbiB5YW5nIGRpcGVyb2xlaCBhZGFsYWg6DQoNCkp1bWxhaCB0b3RhbCBwZW5nZ3VuYTogbiA9IDQwMA0KDQpKdW1sYWggcGVuZ2d1bmEgeWFuZyBtZW5na2xpayBDVEE6IHggPSAxNTYNCg0KVHVqdWFuIGFuYWxpc2lzIGluaSBhZGFsYWggbWVuZ2hpdHVuZyBzYW1wbGUgcHJvcG9ydGlvbiwgY29uZmlkZW5jZSBpbnRlcnZhbCwNCnNlcnRhIG1lbWJhbmRpbmdrYW4gaGFzaWxueWEgc2VjYXJhIHZpc3VhbC4NCg0KIyMjIE1lbmdoaXR1bmcgU2FtcGxlIFByb3BvcnRpb24NCg0KU2FtcGxlIHByb3BvcnRpb24gZGloaXR1bmcgbWVuZ2d1bmFrYW4gcnVtdXM6DQoNCiTwnZGdXuKAiz1cZnJhY3t4fXvwnZGbfSQNCg0KYGBge3J9DQpuIDwtIDQwMA0KeCA8LSAxNTYNCg0KcF9oYXQgPC0geCAvIG4NCnBfaGF0DQpgYGANCi0gSW50ZXJwcmV0YXNpIDoNClNlYmFueWFrIDM5JSBwZW5nZ3VuYSBtZW5na2xpayB0b21ib2wgQ1RBLg0KDQoNCiMjIyBNZW5naGl0dW5nIENvbmZpZGVuY2UgSW50ZXJ2YWwNCg0KQ29uZmlkZW5jZSBpbnRlcnZhbCBkaWhpdHVuZyBtZW5nZ3VuYWthbiBwZW5kZWthdGFuIG5vcm1hbCBhcHByb3hpbWF0aW9uOg0KDQokJCBcaGF0e3B9IFxwbSB6IFx0aW1lcyBcc3FydHtcZnJhY3tcaGF0e3B9KDEtXGhhdHtwfSl9e259fSAkJA0KDQoNCmBgYHtyfQ0KIyBEYXRhDQpuIDwtIDQwMA0KeCA8LSAxNTYNCnBfaGF0IDwtIHggLyBuDQoNCiMgRnVuY3Rpb24gQ0kNCmNvbXB1dGVfY2kgPC0gZnVuY3Rpb24oY29uZl9sZXZlbCkgew0KICB6IDwtIHFub3JtKCgxICsgY29uZl9sZXZlbCkgLyAyKQ0KICBzZSA8LSBzcXJ0KChwX2hhdCAqICgxIC0gcF9oYXQpKSAvIG4pDQogIGxvd2VyIDwtIHBfaGF0IC0geiAqIHNlDQogIHVwcGVyIDwtIHBfaGF0ICsgeiAqIHNlDQogIGMobG93ZXIsIHVwcGVyKQ0KfQ0KDQojIENvbXB1dGUgY29uZmlkZW5jZSBpbnRlcnZhbHMNCmNpXzkwIDwtIGNvbXB1dGVfY2koMC45MCkNCmNpXzk1IDwtIGNvbXB1dGVfY2koMC45NSkNCmNpXzk5IDwtIGNvbXB1dGVfY2koMC45OSkNCg0KYGBgDQoNCiMjIyBUQUJFTA0KVGFiZWwgQ29uZmlkZW5jZSBJbnRlcnZhbCBmb3IgQ1RBIENsaWNrLVRocm91Z2ggUmF0ZSBtZW5hbXBpbGthbiByZW50YW5nIGVzdGltYXNpIA0KcHJvcG9yc2kgcGVuZ2d1bmEgeWFuZyBtZW5na2xpayB0b21ib2wgQ2FsbC1Uby1BY3Rpb24gKENUQSkgcGFkYSB0aWdhIHRpbmdrYXQgDQprZXBlcmNheWFhbiB5YW5nIGJlcmJlZGEsIHlhaXR1IDkwJSwgOTUlLCBkYW4gOTklLg0KDQotIEtvbG9tIENvbmZpZGVuY2UgTGV2ZWwgbWVudW5qdWtrYW4gdGluZ2thdCBrZXlha2luYW4geWFuZyBkaWd1bmFrYW4gZGFsYW0gcGVyaGl0dW5nYW4gaW50ZXJ2YWwuDQoNCi0gTG93ZXIgQm91bmQgbWVydXBha2FuIGJhdGFzIGJhd2FoIGVzdGltYXNpIHByb3BvcnNpIGtsaWsgQ1RBLg0KDQotIFVwcGVyIEJvdW5kIG1lcnVwYWthbiBiYXRhcyBhdGFzIGVzdGltYXNpIHByb3BvcnNpIGtsaWsgQ1RBLg0KDQpCZXJkYXNhcmthbiB0YWJlbCB0ZXJzZWJ1dCwgZGFwYXQgZGlsaWhhdCBiYWh3YToNCg0KUGFkYSBjb25maWRlbmNlIGxldmVsIDkwJSwgaW50ZXJ2YWwgeWFuZyBkaWhhc2lsa2FuIHBhbGluZyBzZW1waXQsIHNlaGluZ2dhIA0KZXN0aW1hc2kgcHJvcG9yc2kgbGViaWggcHJlc2lzaSBuYW11biBkZW5nYW4gdGluZ2thdCBrZXlha2luYW4geWFuZyBsZWJpaCByZW5kYWguDQoNClBhZGEgY29uZmlkZW5jZSBsZXZlbCA5NSUsIGludGVydmFsIG1lbmphZGkgbGViaWggbGViYXIgZGFuIG1lbWJlcmlrYW4ga2VzZWltYmFuZ2FuIA0KYW50YXJhIGtldGVwYXRhbiBlc3RpbWFzaSBkYW4gdGluZ2thdCBrZXBlcmNheWFhbi4NCg0KUGFkYSBjb25maWRlbmNlIGxldmVsIDk5JSwgaW50ZXJ2YWwgbWVydXBha2FuIHlhbmcgcGFsaW5nIGxlYmFyLCBtZW51bmp1a2thbg0KZXN0aW1hc2kgeWFuZyBsZWJpaCBrb25zZXJ2YXRpZiBkZW5nYW4gdGluZ2thdCBrZXlha2luYW4geWFuZyBwYWxpbmcgdGluZ2dpLg0KDQoNCmBgYHtyfQ0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkoa25pdHIpDQpsaWJyYXJ5KGthYmxlRXh0cmEpDQoNCmNpX3RhYmxlIDwtIGRhdGEuZnJhbWUoDQogIENvbmZpZGVuY2VfTGV2ZWwgPSBjKCI5MCUiLCAiOTUlIiwgIjk5JSIpLA0KICBMb3dlcl9Cb3VuZCA9IHJvdW5kKGMoY2lfOTBbMV0sIGNpXzk1WzFdLCBjaV85OVsxXSksIDQpLA0KICBVcHBlcl9Cb3VuZCA9IHJvdW5kKGMoY2lfOTBbMl0sIGNpXzk1WzJdLCBjaV85OVsyXSksIDQpDQopDQoNCmthYmxlKGNpX3RhYmxlLA0KICAgICAgYWxpZ24gPSAiYyIsDQogICAgICBjYXB0aW9uID0gIkNvbmZpZGVuY2UgSW50ZXJ2YWwgZm9yIENUQSBDbGljay1UaHJvdWdoIFJhdGUiKSAlPiUNCiAga2FibGVfc3R5bGluZygNCiAgICBib290c3RyYXBfb3B0aW9ucyA9IGMoInN0cmlwZWQiLCAiaG92ZXIiKSwNCiAgICBmdWxsX3dpZHRoID0gVFJVRSwNCiAgICBwb3NpdGlvbiA9ICJjZW50ZXIiDQogICkgJT4lDQpyb3dfc3BlYygwLCBib2xkID0gVFJVRSwgYmFja2dyb3VuZCA9ICIjMUY0RTc5IiwgY29sb3IgPSAid2hpdGUiKSAlPiUNCiAgcm93X3NwZWMoMSwgYmFja2dyb3VuZCA9ICIjRTNGMkZEIikgJT4lDQogIHJvd19zcGVjKDIsIGJhY2tncm91bmQgPSAiI0JCREVGQiIpICU+JQ0KICByb3dfc3BlYygzLCBiYWNrZ3JvdW5kID0gIiM5MENBRjkiKQ0KDQpgYGANCg0KIyMjIFZJU1VBTElTQVNJDQpWaXN1YWxpc2FzaSBpbmkgbWVudW5qdWtrYW4gcGVyYmFuZGluZ2FuIGNvbmZpZGVuY2UgaW50ZXJ2YWwgdW50dWsgcHJvcG9yc2kga2xpaw0KdG9tYm9sIENhbGwtVG8tQWN0aW9uIChDVEEpIHBhZGEgdGlnYSB0aW5na2F0IGtlcGVyY2F5YWFuLCB5YWl0dSA5MCUsIDk1JSwgZGFuIDk5JS4NCg0KLSBUaXRpayBiaXJ1IG1lcmVwcmVzZW50YXNpa2FuIHNhbXBsZSBwcm9wb3J0aW9uIHBlbmdndW5hIHlhbmcgbWVuZ2tsaWsgQ1RBLCB5YWl0dSBzZWJlc2FyIDAsMzkuDQoNCi0gR2FyaXMgdmVydGlrYWwgcGFkYSBzZXRpYXAgdGluZ2thdCBrZXBlcmNheWFhbiBtZW51bmp1a2thbiByZW50YW5nIGNvbmZpZGVuY2UgDQppbnRlcnZhbCwgeWFuZyBkaWJhdGFzaSBvbGVoIG5pbGFpIExvd2VyIEJvdW5kIGRhbiBVcHBlciBCb3VuZC4NCg0KLSBTZW1ha2luIHRpbmdnaSBjb25maWRlbmNlIGxldmVsLCBzZW1ha2luIGxlYmFyIGludGVydmFsIHlhbmcgdGVyYmVudHVrLCBtZW5hbmRha2FuIA0KcGVuaW5na2F0YW4gdGluZ2thdCBrZXlha2luYW4gbmFtdW4gZGVuZ2FuIGVzdGltYXNpIHlhbmcgbGViaWgga29uc2VydmF0aWYuDQoNClZpc3VhbGlzYXNpIGluaSBtZW1iYW50dSBtZW1haGFtaSBiYWdhaW1hbmEgcGVtaWxpaGFuIGNvbmZpZGVuY2UgbGV2ZWwgbWVtZW5nYXJ1aGkgDQprZXRlcGF0YW4gZXN0aW1hc2kgZGFuIHRpbmdrYXQga2V5YWtpbmFuIGRhbGFtIHBlbmdhbWJpbGFuIGtlcHV0dXNhbiBwYWRhIGVrc3BlcmltZW4gQS9CIHRlc3RpbmcuDQoNCmBgYHtyfQ0KY2lfdGFibGUkTGV2ZWwgPC0gYyg5MCwgOTUsIDk5KQ0KY2lfdGFibGUkTWlkcG9pbnQgPC0gcF9oYXQNCg0KZ2dwbG90KGNpX3RhYmxlLCBhZXMoeCA9IExldmVsLCB5ID0gTWlkcG9pbnQpKSArDQpnZW9tX3BvaW50KHNpemUgPSA0LCBjb2xvciA9ICIjMUY0RTc5IikgKw0KZ2VvbV9lcnJvcmJhcihhZXMoeW1pbiA9IExvd2VyX0JvdW5kLCB5bWF4ID0gVXBwZXJfQm91bmQpLA0Kd2lkdGggPSAzLCBjb2xvciA9ICIjMUY0RTc5IiwgbGluZXdpZHRoID0gMS4yKSArDQpsYWJzKA0KdGl0bGUgPSAiQ29tcGFyaXNvbiBvZiBDb25maWRlbmNlIEludGVydmFscyBmb3IgQ1RBIENsaWNrIFJhdGUiLA0KeCA9ICJDb25maWRlbmNlIExldmVsICglKSIsDQp5ID0gIlByb3BvcnRpb24gb2YgQ2xpY2tzIg0KKSArDQp0aGVtZV9taW5pbWFsKGJhc2Vfc2l6ZSA9IDE0KQ0KDQpgYGANCg0KIyMjIEtFU0lNUFVMQU4gDQoNClBlbWlsaWhhbiBjb25maWRlbmNlIGxldmVsIHNhbmdhdCBtZW1lbmdhcnVoaSB0aW5na2F0IHJpc2lrbyBkYW4ga2V5YWtpbmFuIGRhbGFtIA0KcGVuZ2FtYmlsYW4ga2VwdXR1c2FuIHByb2R1ay4gVW50dWsgZWtzcGVyaW1lbiBwcm9kdWsgZGlnaXRhbCwgOTUlIGNvbmZpZGVuY2UgDQppbnRlcnZhbCBhZGFsYWggcGlsaWhhbiB5YW5nIHBhbGluZyBzZWltYmFuZy4JDQoNCg0KIyMgQ0FTRSBTVFVEWSA0DQogIA0KIyMjIERlc2tyaXBzaSBNYXNhbGFoDQoNCkR1YSB0aW0gZGF0YSBtZW5ndWt1ciAqKkFQSSBsYXRlbmN5IChkYWxhbSBtaWxpZGV0aWspKiogZGVuZ2FuIGtvbmRpc2kgYmVyYmVkYS4NCg0KLSAqKlRlYW0gQSoqIG1lbmdndW5ha2FuIHN0YW5kYXIgZGV2aWFzaSBwb3B1bGFzaSAoz4MpIHlhbmcgZGlrZXRhaHVpDQotICoqVGVhbSBCKiogbWVuZ2d1bmFrYW4gc3RhbmRhciBkZXZpYXNpIHNhbXBlbCAocykNCg0KVHVqdWFuIGFuYWxpc2lzOg0KDQoxLiBNZW5lbnR1a2FuIHVqaSBzdGF0aXN0aWsgeWFuZyBkaWd1bmFrYW4NCg0KMi4gTWVuZ2hpdHVuZyBDb25maWRlbmNlIEludGVydmFsIDkwJSwgOTUlLCBkYW4gOTklDQoNCjMuIE1lbWJhbmRpbmdrYW4gaW50ZXJ2YWwgbWVsYWx1aSB2aXN1YWxpc2FzaQ0KDQo0LiBNZW5qZWxhc2thbiBwZXJiZWRhYW4gbGViYXIgaW50ZXJ2YWwNCg0KDQojIyMgRGF0YSBBd2FsDQoNCmBgYHtyfQ0KbiAgPC0gMzYNCm1lYW4gPC0gMjEwDQpzaWdtYSA8LSAyNA0KcyA8LSAyNCAgDQpgYGANCg0KfCBUaW0gICAgfCBLb25kaXNpICAgICAgICAgICB8IFVqaSBTdGF0aXN0aWsgfA0KfCAtLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0gfA0KfCBUZWFtIEEgfCDPgyBkaWtldGFodWkgICAgICAgfCAqKlotVGVzdCoqICAgIHwNCnwgVGVhbSBCIHwgz4MgdGlkYWsgZGlrZXRhaHVpIHwgKip0LVRlc3QqKiAgICB8DQoNCiMjIyBQZXJoaXR1bmdhbiBDb25maWRlbmNlIEludGVydmFsDQpDb25maWRlbmNlIEludGVydmFsIGRpaGl0dW5nIHVudHVrIG1lbmdlc3RpbWFzaSByZW50YW5nIG5pbGFpIHJhdGEtcmF0YSBBUEkNCmxhdGVuY3kgcG9wdWxhc2kgYmVyZGFzYXJrYW4gZGF0YSBzYW1wZWwuDQoNClJhdGEtcmF0YSBzYW1wZWwgYWRhbGFoIDIxMCBtcyBkZW5nYW4gdWt1cmFuIHNhbXBlbCBuID0gMzYuDQoNClN0YW5kYXJkIEVycm9yIHVudHVrIGtlZHVhIHRpbSBzYW1hOg0KDQokJFNFID0gXGZyYWN7MjR9e1xzcXJ0ezM2fX0gPSA0JCQNClBlcmJlZGFhbiBpbnRlcnZhbCBtdW5jdWwgZGFyaSBuaWxhaSBrcml0aXMgeWFuZyBkaWd1bmFrYW46DQoNClRlYW0gQSAoWi1UZXN0KSBtZW5nZ3VuYWthbiBkaXN0cmlidXNpIG5vcm1hbCBiYWt1DQoNClRlYW0gQiAodC1UZXN0KSBtZW5nZ3VuYWthbiBkaXN0cmlidXNpIHQgZGVuZ2FuIGRlcmFqYXQgYmViYXMgZGYgPSAzNQ0KDQpSdW11cyB1bXVtIENvbmZpZGVuY2UgSW50ZXJ2YWw6DQoNCiQkQ0kgPSBcYmFye3h9IFxwbSAoXHRleHR7bmlsYWkga3JpdGlzfSkgXHRpbWVzIFNFJCQNCg0KS2FyZW5hIG5pbGFpIGtyaXRpcyB0IGxlYmloIGJlc2FyIGRhcmlwYWRhIG5pbGFpIGtyaXRpcyB6LCBtYWthIGludGVydmFsIFRlYW0gQiANCmxlYmloIGxlYmFyLCBtZXNraXB1biBtZWFuIGRhbiBzdGFuZGFyIGRldmlhc2kgc2FtYS4NCg0KU2VtYWtpbiB0aW5nZ2kgdGluZ2thdCBrZXBlcmNheWFhbiAoOTAlIOKGkiA5OSUpLCBzZW1ha2luIGxlYmFyIGludGVydmFsIHlhbmcgZGloYXNpbGthbi4NCg0KDQpgYGB7cn0NCmxpYnJhcnkoZHBseXIpDQoNCnNlX3ogPC0gc2lnbWEgLyBzcXJ0KG4pDQpzZV90IDwtIHMgLyBzcXJ0KG4pDQoNCnpfOTAgPC0gcW5vcm0oMC45NSkNCnpfOTUgPC0gcW5vcm0oMC45NzUpDQp6Xzk5IDwtIHFub3JtKDAuOTk1KQ0KDQp0XzkwIDwtIHF0KDAuOTUsIGRmID0gbi0xKQ0KdF85NSA8LSBxdCgwLjk3NSwgZGYgPSBuLTEpDQp0Xzk5IDwtIHF0KDAuOTk1LCBkZiA9IG4tMSkNCg0KY2lfZGF0YSA8LSBkYXRhLmZyYW1lKA0KVGVhbSA9IHJlcChjKCJUZWFtIEEgKFotVGVzdCkiLCAiVGVhbSBCICh0LVRlc3QpIiksIGVhY2ggPSAzKSwNCkNvbmZpZGVuY2UgPSByZXAoYygiOTAlIiwgIjk1JSIsICI5OSUiKSwgMiksDQpMb3dlciA9IGMobWVhbiAtIHpfOTAqc2VfeiwNCm1lYW4gLSB6Xzk1KnNlX3osDQptZWFuIC0gel85OSpzZV96LA0KbWVhbiAtIHRfOTAqc2VfdCwNCm1lYW4gLSB0Xzk1KnNlX3QsDQptZWFuIC0gdF85OSpzZV90KSwNClVwcGVyID0gYyhtZWFuICsgel85MCpzZV96LA0KbWVhbiArIHpfOTUqc2VfeiwNCm1lYW4gKyB6Xzk5KnNlX3osDQptZWFuICsgdF85MCpzZV90LA0KbWVhbiArIHRfOTUqc2VfdCwNCm1lYW4gKyB0Xzk5KnNlX3QpDQopDQpjaV9kYXRhDQoNCmBgYA0KDQojIyMgVEFCRUwNCg0KVGFiZWwgQ29uZmlkZW5jZSBJbnRlcnZhbCBtZW5hbXBpbGthbiBiYXRhcyBiYXdhaCAoTG93ZXIpIGRhbiBiYXRhcyBhdGFzIChVcHBlcikNCmVzdGltYXNpIHJhdGEtcmF0YSBsYXRlbmN5IHVudHVrIHNldGlhcCB0aW5na2F0IGtlcGVyY2F5YWFuLg0KDQoqKlN0cnVrdHVyIFRhYmVsKioNCg0KLSBUZWFtDQpNZW51bmp1a2thbiBtZXRvZGUgc3RhdGlzdGlrIHlhbmcgZGlndW5ha2FuIChaLVRlc3QgYXRhdSB0LVRlc3QpDQoNCi0gQ29uZmlkZW5jZQ0KVGluZ2thdCBrZXBlcmNheWFhbiAoOTAlLCA5NSUsIDk5JSkNCg0KLSBMb3dlcg0KQmF0YXMgYmF3YWggZXN0aW1hc2kgbWVhbiBwb3B1bGFzaQ0KDQotIFVwcGVyDQpCYXRhcyBhdGFzIGVzdGltYXNpIG1lYW4gcG9wdWxhc2kNCg0KKipNYWtuYSBOaWxhaSBkYWxhbSBUYWJlbCoqDQoNClNlYmFnYWkgY29udG9oOg0KDQpUZWFtIEEg4oCTIDk1JSBDSQ0KSW50ZXJ2YWwgeWFuZyBsZWJpaCBzZW1waXQgbWVudW5qdWtrYW4gZXN0aW1hc2kgeWFuZyBsZWJpaCBwcmVzaXNpIGthcmVuYQ0Kc3RhbmRhciBkZXZpYXNpIHBvcHVsYXNpIGRpa2V0YWh1aS4NCg0KVGVhbSBCIOKAkyA5NSUgQ0kNCkludGVydmFsIGxlYmloIGxlYmFyIGthcmVuYSBkaXN0cmlidXNpIHQgbWVtcGVydGltYmFuZ2thbiBrZXRpZGFrcGFzdGlhbiB0YW1iYWhhbiANCmRhcmkgZXN0aW1hc2kgc3RhbmRhciBkZXZpYXNpIHNhbXBlbC4NCg0KYGBge3J9DQpsaWJyYXJ5KGtuaXRyKQ0KbGlicmFyeShrYWJsZUV4dHJhKQ0KDQpjaV9kYXRhICU+JQ0KbXV0YXRlKA0KTG93ZXIgPSByb3VuZChMb3dlciwgMiksDQpVcHBlciA9IHJvdW5kKFVwcGVyLCAyKQ0KKSAlPiUNCmthYmxlKA0KYWxpZ24gPSAiYyIsDQpjYXB0aW9uID0gIkNvbmZpZGVuY2UgSW50ZXJ2YWwgQVBJIExhdGVuY3kgKG1zKSINCikgJT4lDQprYWJsZV9zdHlsaW5nKA0KYm9vdHN0cmFwX29wdGlvbnMgPSBjKCJzdHJpcGVkIiwgImhvdmVyIiksDQpmdWxsX3dpZHRoID0gVFJVRSwNCmZvbnRfc2l6ZSA9IDE2DQopICU+JQ0Kcm93X3NwZWMoMCwgYm9sZCA9IFRSVUUsIGJhY2tncm91bmQgPSAiIzFGNEU3OSIsIGNvbG9yID0gIndoaXRlIikgJT4lDQogIHJvd19zcGVjKDEsIGJhY2tncm91bmQgPSAiI0UzRjJGRCIpICU+JQ0KICByb3dfc3BlYygyLCBiYWNrZ3JvdW5kID0gIiNCQkRFRkIiKSAlPiUNCiAgcm93X3NwZWMoMywgYmFja2dyb3VuZCA9ICIjOTBDQUY5IikgJT4lDQogIHJvd19zcGVjKDQsIGJhY2tncm91bmQgPSAiI0UzRjJGRCIpICU+JQ0KICByb3dfc3BlYyg1LCBiYWNrZ3JvdW5kID0gIiNCQkRFRkIiKSAlPiUNCiAgcm93X3NwZWMoNiwgYmFja2dyb3VuZCA9ICIjOTBDQUY5IikNCg0KYGBgDQoNCi0tLQ0KDQoNCiMjIyBWSVNVQUxJU0FTSQ0KDQpgYGB7cn0NCmxpYnJhcnkoZ2dwbG90MikNCg0KZ2dwbG90KGNpX2RhdGEsIGFlcyh4ID0gQ29uZmlkZW5jZSwgeSA9IG1lYW4sIHltaW4gPSBMb3dlciwgeW1heCA9IFVwcGVyLA0KICAgICAgICAgICAgICAgICAgICBjb2xvciA9IFRlYW0sIGdyb3VwID0gVGVhbSkpICsNCiAgZ2VvbV9lcnJvcmJhcih3aWR0aCA9IDAuMTUsIHNpemUgPSAxLjMpICsNCiAgZ2VvbV9wb2ludChzaXplID0gNCkgKw0KICBsYWJzKA0KICAgIHRpdGxlID0gIlBlcmJhbmRpbmdhbiBDb25maWRlbmNlIEludGVydmFsIEFQSSBMYXRlbmN5IiwNCiAgICB5ID0gIkxhdGVuY3kgKG1zKSIsDQogICAgeCA9ICJDb25maWRlbmNlIExldmVsIg0KICApICsNCiAgdGhlbWVfbWluaW1hbChiYXNlX3NpemUgPSAxNikgKw0KICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygiIzFGNEZEOCIsICIjMEI4NEE1IikpDQpgYGANCg0KDQotICoqUGVyYmVkYWFuIExlYmFyIEludGVydmFsKioNCg0KV2FsYXVwdW4gbWVhbiwgdWt1cmFuIHNhbXBlbCwgZGFuIHN0YW5kYXIgZGV2aWFzaSBzYW1hLCBsZWJhciBpbnRlcnZhbCBiZXJiZWRhIGthcmVuYToNCg0KWi1UZXN0IChUZWFtIEEpIG1lbmdndW5ha2FuIG5pbGFpIGtyaXRpcyBkYXJpIGRpc3RyaWJ1c2kgbm9ybWFsDQoNCnQtVGVzdCAoVGVhbSBCKSBtZW5nZ3VuYWthbiBkaXN0cmlidXNpIHQgeWFuZzoNCg0KLSBMZWJpaCBrb25zZXJ2YXRpZg0KDQotIE1lbWlsaWtpIGVrb3IgbGViaWggdGViYWwNCg0KLSBNZW5naGFzaWxrYW4gaW50ZXJ2YWwgbGViaWggbGViYXINCg0KUGVyYmVkYWFuIGluaSBtZW5jZXJtaW5rYW4ga2V0aWRha3Bhc3RpYW4gdGFtYmFoYW4gc2FhdCDPgyBwb3B1bGFzaSB0aWRhayBkaWtldGFodWkuICANCg0KIyMjIEtFU0lNUFVMQU4gDQoNClRlYW0gQSBtZW5nZ3VuYWthbiBaLVRlc3QgIChpbnRlcnZhbCBsZWJpaCBzZW1waXQpDQoNClRlYW0gQiBtZW5nZ3VuYWthbiB0LVRlc3QgIChpbnRlcnZhbCBsZWJpaCBsZWJhcikNCg0KU2VtYWtpbiB0aW5nZ2kgdGluZ2thdCBjb25maWRlbmNlOg0KDQotIEludGVydmFsIHNlbWFraW4gbGViYXINCg0KLSBUaW5na2F0IGtlcGFzdGlhbiBtZW5pbmdrYXQNCg0KLSBEaXN0cmlidXNpIHQgbGViaWggYW1hbiB1bnR1ayBzYW1wZWwgbnlhdGENCg0KIyMgQ0FTRSBTVFVEWSA1DQoNCiMjIyBPbmUtU2lkZWQgQ29uZmlkZW5jZSBJbnRlcnZhbA0KU2VidWFoIHBlcnVzYWhhYW4gU29mdHdhcmUgYXMgYSBTZXJ2aWNlIChTYWFTKSBpbmdpbiBtZW1hc3Rpa2FuIG1pbmltYWwgNzAlIA0KcGVuZ2d1bmEgYWt0aWYgbWluZ2d1YW4gbWVuZ2d1bmFrYW4gZml0dXIgcHJlbWl1bS4gDQoNCioqRGF0YSBla3NwZXJpbWVuIG1lbnVuanVra2FuOioqDQogICAtIFRvdGFsIHBlbmdndW5hOiAyNTANCiAgIA0KICAgLSBQZW5nZ3VuYSBha3RpZiBmaXR1ciBwcmVtaXVtOiAxODUNCiAgIA0KICoqVHVqdWFuIGFuYWxpc2lzIGluaSBhZGFsYWg6KioNCiANCiAgIDEuIE1lbmdoaXR1bmcgb25lLXNpZGVkIGxvd2VyIGNvbmZpZGVuY2UgaW50ZXJ2YWwgdW50dWsgcHJvcG9yc2kgcGVuZ2d1bmEgcHJlbWl1bS4NCiAgIA0KICAgMi4gTWVuZW50dWthbiBhcGFrYWggdGFyZ2V0IDcwJSB0ZXJjYXBhaSBzZWNhcmEgc3RhdGlzdGlrLg0KICAgDQogICAzLiBNZW55YWppa2FuIGhhc2lsIGRhbGFtIHRhYmVsIGRhbiB2aXN1YWxpc2FzaSB5YW5nIG11ZGFoIGRpcGFoYW1pLg0KICAgDQojIyMgRGF0YQ0KDQpgYGB7cn0NCnRvdGFsX3VzZXJzIDwtIDI1MA0KYWN0aXZlX3ByZW1pdW1fdXNlcnMgPC0gMTg1DQpwX2hhdCA8LSBhY3RpdmVfcHJlbWl1bV91c2VycyAvIHRvdGFsX3VzZXJzICAjIHByb3BvcnNpIHNhbXBsZQ0KcF9oYXQNCmBgYA0KDQojIyMgSmVuaXMgDQoNCi0gT25lLXNpZGVkIGxvd2VyIGNvbmZpZGVuY2UgaW50ZXJ2YWwga2FyZW5hIGZva3VzIHBhZGEgYmF0YXMgYmF3YWguDQotIFVqaSBwcm9wb3JzaSB6ICh6LXRlc3QpIHVudHVrIHByb3BvcnNpIHBlbmdndW5hIHByZW1pdW0uDQoNCg0KIyMjIE1lbmdoaXR1bmcgQmF0YXMgQmF3YWggQ0kNCg0KYGBge3J9DQpsb3dlcl9ib3VuZF9DSSA8LSBmdW5jdGlvbihwX2hhdCwgbiwgY29uZl9sZXZlbCkgew0KICB6IDwtIHFub3JtKGNvbmZfbGV2ZWwpDQogIGxiIDwtIHBfaGF0IC0geiAqIHNxcnQocF9oYXQgKiAoMSAtIHBfaGF0KSAvIG4pDQogIHJldHVybihsYikNCn0NCg0KIyBIaXR1bmcgdW50dWsgOTAlLCA5NSUsIDk5JQ0KY29uZl9sZXZlbHMgPC0gYygwLjkwLCAwLjk1LCAwLjk5KQ0KbG93ZXJfYm91bmRzIDwtIHNhcHBseShjb25mX2xldmVscywgbG93ZXJfYm91bmRfQ0ksIHBfaGF0PXBfaGF0LCBuPXRvdGFsX3VzZXJzKQ0KbG93ZXJfYm91bmRzDQpgYGANCg0KIyMjIFRBQkVMDQoNClRhYmVsIGluaSBtZW5hbXBpbGthbiBiYXRhcyBiYXdhaCAobG93ZXIgYm91bmQpIG9uZS1zaWRlZCBjb25maWRlbmNlIGludGVydmFsIHVudHVrIA0KcHJvcG9yc2kgcGVuZ2d1bmEgcHJlbWl1bSBwYWRhIHRpZ2EgbGV2ZWwga2VwZXJjYXlhYW46IDkwJSwgOTUlLCBkYW4gOTklLg0KDQpLb2xvbSBDb25maWRlbmNlIExldmVsIG1lbnVuanVra2FuIHRpbmdrYXQga2V5YWtpbmFuIHlhbmcgZGlndW5ha2FuIHVudHVrIG1lbmdoaXR1bmcgQ0kuDQoNCktvbG9tIExvd2VyIEJvdW5kIG1lbmFtcGlsa2FuIG5pbGFpIGJhdGFzIGJhd2FoIHByb3BvcnNpIHBlbmdndW5hIHByZW1pdW0geWFuZyANCmRpZXN0aW1hc2kgZGFyaSBkYXRhIHNhbXBsZS4gTmlsYWkgaW5pIG1lbnVuanVra2FuIHByb3BvcnNpIG1pbmltYWwgcGVuZ2d1bmEgDQpwcmVtaXVtIGRlbmdhbiB0aW5na2F0IGtleWFraW5hbiB0ZXJ0ZW50dS4NCg0KDQpgYGB7cn0NCmxpYnJhcnkoa25pdHIpDQpsaWJyYXJ5KGthYmxlRXh0cmEpDQoNCkNJX3RhYmxlIDwtIGRhdGEuZnJhbWUoDQogICJDb25maWRlbmNlIExldmVsIiA9IGMoIjkwJSIsICI5NSUiLCAiOTklIiksDQogICJMb3dlciBCb3VuZCIgPSByb3VuZChsb3dlcl9ib3VuZHMsIDMpDQopDQoNCmthYmxlKENJX3RhYmxlLCAiaHRtbCIpICU+JQ0KICBrYWJsZV9zdHlsaW5nKGJvb3RzdHJhcF9vcHRpb25zID0gYygic3RyaXBlZCIsICJob3ZlciIsICJjb25kZW5zZWQiLCAicmVzcG9uc2l2ZSIpLA0KICAgICAgICAgICAgICAgIGZ1bGxfd2lkdGggPSBGLCBwb3NpdGlvbiA9ICJjZW50ZXIiDQogICAgKSAlPiUNCiAgcm93X3NwZWMoMCwgYm9sZCA9IFRSVUUsIGJhY2tncm91bmQgPSAiIzFGNEU3OSIsIGNvbG9yID0gIndoaXRlIikgJT4lDQogIHJvd19zcGVjKDEsIGJhY2tncm91bmQgPSAiI0UzRjJGRCIpICU+JQ0KICByb3dfc3BlYygyLCBiYWNrZ3JvdW5kID0gIiNCQkRFRkIiKSAlPiUNCiAgcm93X3NwZWMoMywgYmFja2dyb3VuZCA9ICIjOTBDQUY5IikNCmBgYA0KDQotLS0NCg0KDQojIyMgVklTVUFMSVNBU0kNCg0KVmlzdWFsaXNhc2kgaW5pIG1lbnVuanVra2FuIGJhdGFzIGJhd2FoIG9uZS1zaWRlZCBjb25maWRlbmNlIGludGVydmFsIHVudHVrIA0KcHJvcG9yc2kgcGVuZ2d1bmEgcHJlbWl1bSBwYWRhIHRpZ2EgbGV2ZWwga2VwZXJjYXlhYW46IDkwJSwgOTUlLCBkYW4gOTklLiBTZXRpYXAgDQpiYXRhbmcgbWV3YWtpbGkgbG93ZXIgYm91bmQgQ0kgcGFkYSBsZXZlbCBrZXBlcmNheWFhbiB0ZXJ0ZW50dSwgZGVuZ2FuIGFuZ2thIA0KcHJvcG9yc2kgZGl0YW1waWxrYW4gZGkgYXRhcyBiYXRhbmcgYWdhciBtdWRhaCBkaWJhY2EuDQoNCmBgYHtyfQ0KbGlicmFyeShnZ3Bsb3QyKQ0KDQpkZl9wbG90IDwtIGRhdGEuZnJhbWUoDQogIENvbmZpZGVuY2UgPSBjKCI5MCUiLCAiOTUlIiwgIjk5JSIpLA0KICBMb3dlckJvdW5kID0gbG93ZXJfYm91bmRzDQopDQoNCmdncGxvdChkZl9wbG90LCBhZXMoeD1Db25maWRlbmNlLCB5PUxvd2VyQm91bmQsIGZpbGw9Q29uZmlkZW5jZSkpICsNCiAgZ2VvbV9iYXIoc3RhdD0iaWRlbnRpdHkiKSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAuNzAsIGxpbmV0eXBlPSJkYXNoZWQiLCBjb2xvcj0icmVkIiwgc2l6ZT0xKSArDQogIGxhYnModGl0bGU9IkJhdGFzIEJhd2FoIE9uZS1TaWRlZCBDSSB1bnR1ayBQZW5nZ3VuYSBQcmVtaXVtIiwNCiAgICAgICBzdWJ0aXRsZT0iR2FyaXMgbWVyYWggcHV0dXMtcHV0dXMgPSB0YXJnZXQgbWluaW1hbCA3MCUiLA0KICAgICAgIHk9Ikxvd2VyIEJvdW5kIENJIiwNCiAgICAgICB4PSJDb25maWRlbmNlIExldmVsIikgKw0KICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9YygiIzU2QjRFOSIsICIjMDA3M0MyIiwgIiMwMDMzNjYiKSkgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb249Im5vbmUiKQ0KYGBgDQoNCi0tLQ0KDQoNCiMjIyBLRVNJTVBVTEFODQoNCkFuYWxpc2lzIG1lbnVuanVra2FuIGJhaHdhIHRhcmdldCBtaW5pbWFsIDcwJSBwZW5nZ3VuYSBwcmVtaXVtIGhhbnlhIGRhcGF0IA0KZGlrb25maXJtYXNpIHBhZGEgbGV2ZWwgY29uZmlkZW5jZSA5MCUuIFBhZGEgbGV2ZWwgY29uZmlkZW5jZSB5YW5nIGxlYmloIHRpbmdnaSwgDQpwZXJ1c2FoYWFuIHRpZGFrIGRhcGF0IHNlY2FyYSBwYXN0aSBtZW55YXRha2FuIHRhcmdldCB0ZXJjYXBhaS4gT2xlaCBrYXJlbmEgaXR1LA0KbWFuYWplbWVuIGRhcGF0IG1lbmdhbWJpbCBrZXB1dHVzYW4gZGVuZ2FuIG1lbXBlcnRpbWJhbmdrYW4gdGluZ2thdCANCmtleWFraW5hbiB5YW5nIGRpaW5naW5rYW4uDQoNCg==