Tugas Pertemuan 9

Statistika Dasar

Logo

Praktikum 1

Data Nilai Siswa

Data Interval Frekuensi \((F_i)\)
41-50 20
51-60 30
61-70 40
71-80 50
81-90 30
91-100 20

Mean untuk Data Kelompok

Definisi Mean untuk Data Kelompok

Mean atau rata-rata adalah ukuran pemusatan data yang paling umum digunakan untuk menggambarkan rata-rata dari suatu distribusi. Untuk data kelompok, mean dihitung dengan memperhitungkan frekuensi dari setiap kelas interval.

Rumus Mean untuk Data Kelompok

Rumus untuk menghitung mean data kelompok adalah sebagai berikut:

\[ \bar{X} = \frac{\sum f_i \cdot x_i}{\sum f_i} \]

Di mana:
- \(\bar{X}\) = Mean (rata-rata)
- \(f_i\) = Frekuensi pada interval ke-\(i\)
- \(x_i\) = Titik tengah dari interval ke-\(i\), dihitung sebagai:
\[ x_i = \frac{\text{batas bawah interval} + \text{batas atas interval}}{2} \]
- \(\sum f_i\) = Total frekuensi

Perhitungan Titik Tengah dan Mean Data Kelompok

Rumus Titik Tengah

Titik tengah (\(x_i\)) dihitung menggunakan rumus berikut: \[ x_i = \frac{\text{Batas Bawah} + \text{Batas Atas}}{2} \]

Perhitungan Titik Tengah Tiap Interval

Berikut adalah perhitungan titik tengah untuk setiap interval:

  • Interval 41 - 50:
    \[ x_i = \frac{41 + 50}{2} = 45.5 \]

  • Interval 51 - 60:
    \[ x_i = \frac{51 + 60}{2} = 55.5 \]

  • Interval 61 - 70:
    \[ x_i = \frac{61 + 70}{2} = 65.5 \]

  • Interval 71 - 80:
    \[ x_i = \frac{71 + 80}{2} = 75.5 \]

  • Interval 81 - 90:
    \[ x_i = \frac{81 + 90}{2} = 85.5 \]

  • Interval 91 - 100:
    \[ x_i = \frac{91 + 100}{2} = 95.5 \]

Tabel dengan Penambahan Titik Tengah

Berikut adalah tabel lengkap dengan \(x_i\) yang telah dihitung:

Data Interval Frekuensi \((F_i)\) Titik Tengah \((X_i)\)
41-50 20 45,5
51-60 30 55,5
61-70 40 65,5
71-80 50 75,5
81-90 30 85,5
91-100 20 95,5

1. Mean Data Kelompok dengan Outlier

Rumus Mean: \[ \bar{X} = \frac{\sum (f_i \cdot x_i)}{\sum f_i} \]

Langkah-langkah:

  • Hitung \(f_i \cdot x_i\) untuk setiap interval:

\[ \begin{aligned} 20 \cdot 45.5 &= 910, \\ 30 \cdot 55.5 &= 1665, \\ 40 \cdot 65.5 &= 2620, \\ 50 \cdot 75.5 &= 3775, \\ 30 \cdot 85.5 &= 2565, \\ 20 \cdot 95.5 &= 1910. \end{aligned} \]

  • Hitung total \(\sum (f_i \cdot x_i)\): \[ \sum (f_i \cdot x_i) = 910 + 1665 + 2620 + 3775 + 2565 + 1910 = 13445 \]

  • Hitung total frekuensi \(\sum f_i\): \[ \sum f_i = 20 + 30 + 40 + 50 + 30 + 20 = 190 \]

  • Hitung Mean: \[ \bar{X} = \frac{\sum (f_i \cdot x_i)}{\sum f_i} = \frac{13445}{190} \approx 70.76 \]

2. Mean Data Kelompok tanpa Outlier

Data tanpa Outlier: Data dengan nilai lebih dari 90 (outlier) dihapus, sehingga hanya menggunakan interval dari 41–90.

Data Interval Frekuensi \((F_i)\) Titik Tengah \((X_i)\)
41-50 20 45,5
51-60 30 55,5
61-70 40 65,5
71-80 50 75,5
81-90 30 85,5

Langkah-langkah:

  • Hitung \(f_i \cdot x_i\) untuk setiap interval:

\[ \begin{aligned} 20 \cdot 45.5 &= 910, \\ 30 \cdot 55.5 &= 1665, \\ 40 \cdot 65.5 &= 2620, \\ 50 \cdot 75.5 &= 3775, \\ 30 \cdot 85.5 &= 2565. \end{aligned} \]

  • Hitung total \(\sum (f_i \cdot x_i)\): \[ \sum (f_i \cdot x_i) = 910 + 1665 + 2620 + 3775 + 2565 = 11535 \]

  • Hitung total frekuensi \(\sum f_i\): \[ \sum f_i = 20 + 30 + 40 + 50 + 30 = 170 \]

  • Hitung Mean: \[ \bar{X} = \frac{\sum (f_i \cdot x_i)}{\sum f_i} = \frac{11535}{170} \approx 67.85 \]

Visualisasi Mean untuk Data Kelompok dengan outlier dan tanpa outlier

Median untuk Data Kelompok

Definisi Median untuk Data Kelompok

Median adalah nilai tengah yang membagi data menjadi dua bagian sama besar. Dalam data kelompok, median dihitung dengan menggunakan batas kelas dan frekuensi dari kelas-kelas interval.

Rumus Median untuk Data Kelompok

Rumus median untuk data kelompok adalah sebagai berikut:

\[ \text{Median} = L + \left( \frac{\frac{n}{2} - F}{f_m} \right) \cdot c \]

Di mana:

  • \(L\): Batas bawah kelas median

  • \(n\): Jumlah total frekuensi (\(\sum f\))

  • \(F\): Frekuensi kumulatif sebelum kelas median

  • \(f_m\): Frekuensi kelas median

  • \(c\): Panjang interval kelas

Data Asli:

Data Interval Frekuensi \((F_i)\) Titik Tengah \((X_i)\)
41-50 20 45,5
51-60 30 55,5
61-70 40 65,5
71-80 50 75,5
81-90 30 85,5

1. Median Data Kelompok dengan Outlier

Untuk menghitung median tanpa menghilangkan outlier, berikut adalah langkah-langkahnya:

  • Total Jumlah Data: \[ n = 20 + 30 + 40 + 50 + 30 + 20 = 190 \]

  • Posisi Median

Karena \(n = 190\), jumlah data genap, maka:

\[ \text{Posisi Median} = \frac{n}{2} = 95 \quad \text{dan} \quad \frac{n}{2} + 1 = 96 \]

Frekuensi Kumulatif

Data Interval Frekuensi \((F_i)\) Frekuensi Kumulatif
41-50 20 20
51-60 30 50
61-70 40 90
71-80 50 140
81-90 30 170
91-100 20 190

Berdasarkan frekuensi kumulatif, data ke-95 dan ke-96 berada dalam interval 71-80.

Rumus Median

Rumus median untuk data kelompok adalah:

\[ \text{Median} = L + \left( \frac{\frac{n}{2} - F}{f_m} \right) \cdot c \]

Substitusi Nilai

\[ L = 70.5, \quad F = 90, \quad f_m = 50, \quad c = 10 \]

  • Perhitungan Median \[ \text{Median} = 70.5 + \left( \frac{95 - 90}{50} \right) \cdot 10 \] \[ \text{Median} = 70.5 + \left( \frac{5}{50} \right) \cdot 10 \] \[ \text{Median} = 70.5 + 1 = 71.5 \]

Hasil Median (dengan outlier)

\[ \boxed{71.5} \]

2. Median Data Kelompok Tanpa Outlier

Identifikasi Outlier

  • Q1: Data ke-47.5 berada di kelas 61-70, sehingga \(Q1 = 65.5\).
  • Q3: Data ke-142.5 berada di kelas 71-80, sehingga \(Q3 = 75.5\).
  • IQR:
    \[ \text{IQR} = Q3 - Q1 = 75.5 - 65.5 = 10 \]
  • Batas bawah dan atas:
    \[ \text{Lower Bound} = Q1 - 1.5 \times \text{IQR} = 65.5 - 15 = 50.5 \] \[ \text{Upper Bound} = Q3 + 1.5 \times \text{IQR} = 75.5 + 15 = 90.5 \]
  • Interval 91-100 (\(x = 95.5\)) adalah outlier karena berada di luar batas atas.

Data yang Tersisa

Data Interval Frekuensi \((F_i)\) Frekuensi Kumulatif
41-50 20 20
51-60 30 50
61-70 40 90
71-80 50 140
81-90 30 170
  • Jumlah data baru (\(n\)):
    \[ n = 20 + 30 + 40 + 50 + 30 = 170 \]
  • Posisi median:
    \[ \text{Median} = \frac{n}{2} = 85 \quad \text{dan} \quad \frac{n}{2} + 1 = 86 \]

Rumus Median

\[ \text{Median} = L + \left( \frac{\frac{n}{2} - F}{f_m} \right) \cdot c \]

Substitusi Nilai

  • Interval median: \(71-80\)
    \[ L = 70.5, \quad F = 90, \quad f_m = 50, \quad c = 10 \]
  • Hitung median:
    \[ \text{Median} = 70.5 + \left( \frac{85 - 90}{50} \right) \cdot 10 \] \[ \text{Median} = 70.5 + \left( \frac{-5}{50} \right) \cdot 10 \] \[ \text{Median} = 70.5 - 1 = 69.5 \]

Hasil Median (tanpa outlier)

\[ \boxed{69.5} \]

Visualisasi Median untuk Data Kelompok dengan outlier dan tanpa outlier

Modus untuk Data Kelompok

Definisi Modus untuk Kelompok Data

Modus adalah salah satu ukuran pemusatan data yang menunjukkan nilai atau kelas yang paling sering muncul dalam suatu kumpulan data. Dalam analisis statistik, modus sering digunakan untuk data berkelompok yang disajikan dalam tabel distribusi frekuensi.

Langkah Menentukan Modus untuk Data Kelompok

Untuk data berkelompok, modus dihitung menggunakan rumus berikut:

\[ \text{Modus} = L + \left( \frac{f_1 - f_0}{(f_1 - f_0) + (f_1 - f_2)} \right) \times c \]

Keterangan:

  • \(L\): tepi bawah kelas modus (kelas dengan frekuensi tertinggi).

  • \(f_1\): frekuensi kelas modus.

  • \(f_0\): frekuensi kelas sebelum kelas modus.

  • \(f_2\): frekuensi kelas setelah kelas modus.

  • \(c\): panjang interval kelas (selisih antara batas atas dan batas bawah kelas).

1. Modus Data Kelompok dengan Outlier

Misalkan terdapat outlier, yaitu kenaikan frekuensi di kelas tertinggi, sehingga tabel menjadi:

Data Interval Frekuensi \((F_i)\)
41-50 20
51-60 30
61-70 40
71-80 50
81-90 30
91-100 20 (outlier)

Langkah Perhitungan Modus

1. Identifikasi Kelas Modus:

Kelas dengan frekuensi tertinggi tetap 71-80 (\(f_1 = 50\)).

2. Informasi:

  • \(L = 71\): tepi bawah kelas modus.
  • \(f_1 = 50\): frekuensi kelas modus.
  • \(f_0 = 40\): frekuensi kelas sebelum kelas modus.
  • \(f_2 = 30\): frekuensi kelas setelah kelas modus.
  • \(c = 10\): panjang interval kelas.

Rumus Modus:

\[ \text{Modus} = L + \left( \frac{f_1 - f_0}{(f_1 - f_0) + (f_1 - f_2)} \right) \times c \]


Substitusi Nilai:

\[ \text{Modus} = 71 + \left( \frac{50 - 40}{(50 - 40) + (50 - 30)} \right) \times 10 \] \[ \text{Modus} = 71 + \left( \frac{10}{10 + 20} \right) \times 10 \] \[ \text{Modus} = 71 + \left( \frac{10}{30} \right) \times 10 \] \[ \text{Modus} = 71 + (0.333 \times 10) \] \[ \text{Modus} = 71 + 3.33 \] \[ \text{Modus} \approx 74.33 \]


Kesimpulan:

Modus untuk data kelompok dengan outlier adalah 74.33. Keberadaan outlier pada kelas tertinggi (\(91-100\)) tidak memengaruhi nilai modus, karena kelas dengan frekuensi tertinggi tetap berada pada 71-80.

2. Modus Data Kelompok Tanpa Outlier

Misalkan terdapat data tanpa outlier, sehingga tabel distribusi frekuensi menjadi sebagai berikut:

Data Interval Frekuensi \((F_i)\)
41-50 20
51-60 30
61-70 40
71-80 50
81-90 30
91-100 20

Langkah Perhitungan Modus

1. Identifikasi Kelas Modus:

Kelas dengan frekuensi tertinggi adalah 71-80 dengan frekuensi (\(f_1 = 50\)).

2. Informasi yang Dibutuhkan:

  • \(L = 71\): tepi bawah kelas modus.
  • \(f_1 = 50\): frekuensi kelas modus.
  • \(f_0 = 40\): frekuensi kelas sebelum kelas modus.
  • \(f_2 = 30\): frekuensi kelas setelah kelas modus.
  • \(c = 10\): panjang interval kelas.

Rumus Modus:

\[ \text{Modus} = L + \left( \frac{f_1 - f_0}{(f_1 - f_0) + (f_1 - f_2)} \right) \times c \]


Substitusi Nilai:

\[ \text{Modus} = 71 + \left( \frac{50 - 40}{(50 - 40) + (50 - 30)} \right) \times 10 \] \[ \text{Modus} = 71 + \left( \frac{10}{10 + 20} \right) \times 10 \] \[ \text{Modus} = 71 + \left( \frac{10}{30} \right) \times 10 \] \[ \text{Modus} = 71 + (0.333 \times 10) \] \[ \text{Modus} = 71 + 3.33 \] \[ \text{Modus} \approx 74.33 \]


Kesimpulan:

Modus untuk data kelompok tanpa outlier adalah 74.33, yang menunjukkan bahwa nilai yang paling sering muncul dalam distribusi data terkonsentrasi di sekitar kelas interval 71-80.

Kesimpulan Akhir

  • Modus dengan outlier: 74.33
  • Modus tanpa outlier: 74.33

Pada kedua kasus, modus tidak berubah, karena kelas dengan frekuensi tertinggi tetap berada pada interval 71-80, oleh sebab itu pada modus untuk data kelompok keberadaan oulier tidak mempengaruhi modus.

Visualisasi Boxplot Modus dengan Outlier dan Tanpa Outlier

Praktikum 2

Bisnis

Studi Kasus: Analisis Penjualan Harian di Toko Kelontong

Data penjualan harian (dalam ribuan rupiah) :

Penjualan Harian (Interval) Frekuensi (Hari)
41,000 - 50,000 20
51,000 - 60,000 30
61,000 - 70,000 40
71,000 - 80,000 50
81,000 - 90,000 30
91,000 - 100,000 20

1. Mean:

Perhitungan Titik Tengah Tiap Interval Berikut adalah perhitungan titik tengah untuk setiap interval:

  • Interval 41,000 - 50,000:
    \[ x_i = \frac{41,000 + 50,000}{2} = 45,500 \]

  • Interval 51,000 - 60,000:
    \[ x_i = \frac{51,000 + 60,000}{2} = 55,500 \]

  • Interval 61,000 - 70,000:
    \[ x_i = \frac{61,000 + 70,000}{2} = 65,500 \]

  • Interval 71,000 - 80,000:
    \[ x_i = \frac{71,000 + 80,000}{2} = 75,500 \]

  • Interval 81,000 - 90,000:
    \[ x_i = \frac{81,000 + 90,000}{2} = 85,500 \]

  • Interval 91,000 - 100,000:
    \[ x_i = \frac{91,000 + 100,000}{2} = 95,500 \]

Langkah-langkah:

Hitung \(f_i \cdot x_i\) untuk setiap interval:

\[ \begin{aligned} 20 \cdot 45,500 &= 910,000, \\ 30 \cdot 55,500 &= 1,665,000, \\ 40 \cdot 65,500 &= 2,620,000 \\ 50 \cdot 75,500 &= 3,775,000, \\ 30 \cdot 85,500 &= 2,565,000, \\ 20 \cdot 95,500 &= 1,910,000. \end{aligned} \]

  • Hitung total \(\sum (f_i \cdot x_i)\): \[ \sum (f_i \cdot x_i) = 910,000 + 1,665,000 + 2,620,000 + 3,775,000 + 2,565,000 + 1,910,000 \] \[ \sum (f_i \cdot x_i) = 13,445,000 \]

  • Hitung total frekuensi \(\sum f_i\): \[ \sum f_i = 20 + 30 + 40 + 50 + 30 + 20 = 190 \]

Hitung Mean: \[ \bar{X} = \frac{\sum (f_i \cdot x_i)}{\sum f_i} = \frac{13,445,000}{190} \approx 70,763.- \]

Rata-rata penjualannya: \[ Rp 70,763.-\]

Visualisasi Mean menggunakan Density Plot

2. Median:

  • Total Jumlah Data: \[ n = 20 + 30 + 40 + 50 + 30 + 20 = 190 \]

  • Posisi Median

Karena \(n = 190\), jumlah data genap, maka:

\[ \text{Posisi Median} = \frac{n}{2} = 95 \quad \text{dan} \quad \frac{n}{2} + 1 = 96 \]

Berdasarkan frekuensi kumulatif, data ke-95 dan ke-96 berada dalam interval 71-80.

  • Rumus Median

Rumus median untuk data kelompok adalah:

\[ \text{Median} = L + \left( \frac{\frac{n}{2} - F}{f_m} \right) \cdot c \]

  • Substitusi Nilai

\[ L = 70,500, \quad F = 90, \quad f_m = 50, \quad c = 10,000 \]

  • Perhitungan Median \[ \text{Median} = 70,500 + \left( \frac{95 - 90}{50} \right) \cdot 10,000 \] \[ \text{Median} = 70,500 + \left( \frac{5}{50} \right) \cdot 10,000 \] \[ \text{Median} = 70,500 + 1,000 = 71,500 \]

Nilai Tengah penjualannya: \[ Rp 71,500\]

Visualisasi Median Menggunakan Density Plot

3. Modus:

Identifikasi Kelas Modus: Kelas dengan frekuensi tertinggi berada di interval 71,000-80,000 (\(f_1 = 50\)).

  • Informasi:
  • \(L = 71,000\): tepi bawah kelas modus.
  • \(f_1 = 50\): frekuensi kelas modus.
  • \(f_0 = 40\): frekuensi kelas sebelum kelas modus.
  • \(f_2 = 30\): frekuensi kelas setelah kelas modus.
  • \(c = 10,000\): panjang interval kelas.

  • Rumus Modus: \[ \text{Modus} = L + \left( \frac{f_1 - f_0}{(f_1 - f_0) + (f_1 - f_2)} \right) \times c \]

  • Substitusi Nilai: \[ \text{Modus} = 71,000 + \left( \frac{50 - 40}{(50 - 40) + (50 - 30)} \right) \times 10,000 \] \[ \text{Modus} = 71,000 + \left( \frac{10}{10 + 20} \right) \times 10,000 \] \[ \text{Modus} = 71,000 + \left( \frac{10}{30} \right) \times 10,000 \] \[ \text{Modus} = 71,000 + (0.333 \times 10,000) \] \[ \text{Modus} = 71,000 + 3,330 \] \[ \text{Modus} \approx 74,330 \]

Nilai Penjualan Yang Paling Sering Muncul : \[ Rp 74,330\]

Visualisasi Modus Menggunakan Density Plot

Visualisasi Perbandingan Mean, Median, dan Modus Menggunakan Density Plot

Kesehatan

Studi Kasus: Distribusi Berat Badan Anak di Posyandu

Data berat badan anak (dalam kg) di suatu wilayah:

Berat Badan (Interval) Frekuensi (Anak)
1 - 10 20
11 - 20 30
21 - 30 10
31 - 40 30
41 - 50 50
51 - 60 40

1. Mean

Perhitungan Titik Tengah Tiap Interval

Berikut adalah perhitungan titik tengah untuk setiap interval:

  • Interval 1 - 10:
    \[ x_i = \frac{1 + 10}{2} = 5.5 \]

  • Interval 11 - 20:
    \[ x_i = \frac{11 + 20}{2} = 15.5 \]

  • Interval 21 - 30:
    \[ x_i = \frac{21 + 30}{2} = 25.5 \]

  • Interval 31 - 40:
    \[ x_i = \frac{31 + 40}{2} = 35.5 \]

  • Interval 41 - 50:
    \[ x_i = \frac{41 + 50}{2} = 45.5 \]

  • Interval 51 - 60:
    \[ x_i = \frac{51 + 60}{2} = 55.5 \]

Langkah-langkah:

Hitung \(f_i \cdot x_i\) untuk setiap interval:

\[ \begin{aligned} 20 \cdot 5.5 &= 110, \\ 30 \cdot 15.5 &= 465, \\ 10 \cdot 25.5 &= 255 \\ 30 \cdot 35.5 &= 1,065, \\ 50 \cdot 45.5 &= 2,275, \\ 40 \cdot 55.5 &= 2,220. \end{aligned} \]

  • Hitung total \(\sum (f_i \cdot x_i)\): \[ \sum (f_i \cdot x_i) = 110 + 465 + 255 + 1,065 + 2,275 + 2,220 = 6,390 \]

  • Hitung total frekuensi \(\sum f_i\): \[ \sum f_i = 20 + 30 + 10 + 30 + 50 + 40 = 180 \]

Hitung Mean: \[ \bar{X} = \frac{\sum (f_i \cdot x_i)}{\sum f_i} = \frac{6,390}{180} \approx 35.5 \]

Rata-rata Berat Badan Anak: \[ 35.5 Kg \]

Visualisasi Mean Menggunakan Density Plot

2. Median:

  • Total Jumlah Data: \[ n = 20 + 30 + 10 + 30 + 50 + 40 = 180 \]

  • Posisi Median

Karena \(n = 180\), jumlah data genap, maka:

\[ \text{Posisi Median} = \frac{n}{2} = 90 \quad \text{dan} \quad \frac{n}{2} + 1 = 91 \]

Berdasarkan frekuensi kumulatif, data ke-90 ke-91 berada dalam interval 31-40.

  • Rumus Median

Rumus median untuk data kelompok adalah:

\[ \text{Median} = L + \left( \frac{\frac{n}{2} - F}{f_m} \right) \cdot c \]

  • Substitusi Nilai

\[ L = 31, \quad F = 60, \quad f_m = 30, \quad c = 10 \]

  • Perhitungan Median \[ \text{Median} = 31 + \left( \frac{90 - 60}{30} \right) \cdot 10 \] \[ \text{Median} = 31 + \left( \frac{30}{30} \right) \cdot 10 \] \[ \text{Median} = 31 + 10 = 41 \]

Nilai Tengah Berat Badan Anak: \[ 41 Kg \]

Visualisasi Median Menggunakan Density Plot

3. Modus:

  • Identifikasi Kelas Modus: Kelas dengan frekuensi tertinggi berada di interval 41-50 (\(f_1 = 50\)).

  • Informasi:

  • \(L = 41\): tepi bawah kelas modus.

  • \(f_1 = 50\): frekuensi kelas modus.

  • \(f_0 = 30\): frekuensi kelas sebelum kelas modus.

  • \(f_2 = 40\): frekuensi kelas setelah kelas modus.

  • \(c = 10\): panjang interval kelas.


  • Rumus Modus: \[ \text{Modus} = L + \left( \frac{f_1 - f_0}{(f_1 - f_0) + (f_1 - f_2)} \right) \times c \]

  • Substitusi Nilai: \[ \text{Modus} = 41 + \left( \frac{50 - 30}{(50 - 30) + (50 - 40)} \right) \times 10 \] \[ \text{Modus} = 41 + \left( \frac{20}{20 + 10} \right) \times 10 \] \[ \text{Modus} = 41 + \left( \frac{20}{30} \right) \times 10 \] \[ \text{Modus} = 41 + (0.666 \times 10) \] \[ \text{Modus} = 41 + 6.66 \] \[ \text{Modus} \approx 47.66 \]

Berat Badan Anak Yang Paling Sering Muncul : \[ 47.66 Kg \]

Visualisasi Modus Menggunakan Density Plot

Visualisasi Perbandingan Mean, Median, dan Modus Menggunakan Density Plot

Pendidikan

Studi Kasus: Distribusi Nilai Ujian Kalkulus

Data nilai ujian kalkulus dari sebuah kelas:

Nilai Ujian (Interval) Frekuensi (Siswa)
41 - 50 15
51 - 60 35
61 - 70 25
71 - 80 45
81 - 90 20
91 - 100 10

1. Mean

Perhitungan Titik Tengah Tiap Interval

Berikut adalah perhitungan titik tengah untuk setiap interval:

  • Interval 41 - 50:
    \[ x_i = \frac{41 + 50}{2} = 45.5 \]

  • Interval 51 - 60:
    \[ x_i = \frac{51 + 60}{2} = 55.5 \]

  • Interval 61 - 70:
    \[ x_i = \frac{61 + 70}{2} = 65.5 \]

  • Interval 71 - 80:
    \[ x_i = \frac{71 + 80}{2} = 75.5 \]

  • Interval 81 - 90:
    \[ x_i = \frac{81 + 90}{2} = 85.5 \]

  • Interval 91 - 100:
    \[ x_i = \frac{91 + 100}{2} = 95.5 \]

Langkah-langkah:

Hitung \(f_i \cdot x_i\) untuk setiap interval:

\[ \begin{aligned} 15 \cdot 45.5 &= 682.5, \\ 35 \cdot 55.5 &= 1,942.5, \\ 25 \cdot 65.5 &= 1,637.5, \\ 45 \cdot 75.5 &= 3,397.5, \\ 20 \cdot 85.5 &= 1,710, \\ 10 \cdot 95.5 &= 955. \end{aligned} \]

  • Hitung total \(\sum (f_i \cdot x_i)\): \[ \sum (f_i \cdot x_i) = 682.5 + 1,942.5 + 1,637.5 + 3,397.5 + 1,710 + 955 = 10.325 \]

  • Hitung total frekuensi \(\sum f_i\): \[ \sum f_i = 15 + 35 + 25 + 45 + 20 + 10 = 150 \]

Hitung Mean: \[ \bar{X} = \frac{\sum (f_i \cdot x_i)}{\sum f_i} = \frac{10.325}{150} \approx 68.83 \]

Rata-rata Nilai ujian: \[ 68.83 \]

Visualisasi Mean Menggunakan Density Plot

2. Median:

  • Total Jumlah Data: \[ n = 15 + 35 + 25 + 45 + 20 + 10 = 150 \]

  • Posisi Median

Karena \(n = 150\), jumlah data genap, maka:

\[ \text{Posisi Median} = \frac{n}{2} = 75 \quad \text{dan} \quad \frac{n}{2} + 1 = 76 \]

Berdasarkan frekuensi kumulatif, data ke-75 dan ke-76 berada dalam interval 61-70.

  • Rumus Median

Rumus median untuk data kelompok adalah:

\[ \text{Median} = L + \left( \frac{\frac{n}{2} - F}{f_m} \right) \cdot c \]

  • Substitusi Nilai

\[ L = 61, \quad F = 50, \quad f_m = 25, \quad c = 10 \]

  • Perhitungan Median \[ \text{Median} = 61 + \left( \frac{75 - 50}{25} \right) \cdot 10 \] \[ \text{Median} = 61 + \left( \frac{25}{25} \right) \cdot 10 \] \[ \text{Median} = 11 + 10 = 71 \]

Nilai Tengah Ujian: \[ 71 \]

Visualisasi Median Menggunakan Density Plot

3. Modus:

  • Identifikasi Kelas Modus: Kelas dengan frekuensi tertinggi berada di interval 71-80 (\(f_1 = 45\)).

  • Informasi:

  • \(L = 71\): tepi bawah kelas modus.

  • \(f_1 = 45\): frekuensi kelas modus.

  • \(f_0 = 25\): frekuensi kelas sebelum kelas modus.

  • \(f_2 = 20\): frekuensi kelas setelah kelas modus.

  • \(c = 10\): panjang interval kelas.


  • Rumus Modus: \[ \text{Modus} = L + \left( \frac{f_1 - f_0}{(f_1 - f_0) + (f_1 - f_2)} \right) \times c \]

  • Substitusi Nilai: \[ \text{Modus} = 71 + \left( \frac{45 - 25}{(45 - 25) + (45 - 20)} \right) \times 10 \] \[ \text{Modus} = 71 + \left( \frac{20}{20 + 25} \right) \times 10 \] \[ \text{Modus} = 71 + \left( \frac{20}{45} \right) \times 10 \] \[ \text{Modus} = 71 + (0.444 \times 10) \] \[ \text{Modus} = 71 + 4.44 \] \[ \text{Modus} \approx 75.44 \]

Nilai Ujian Yang Paling Sering Muncul : \[ 75.44 \]

Visualisasi Modus Menggunakan Density Plot

Visualisasi Perbandingan Mean, Median, dan Modus Menggunakan Density Plot

LS0tDQp0aXRsZTogIlR1Z2FzIFBlcnRlbXVhbiA5Ig0Kc3VidGl0bGU6ICJTdGF0aXN0aWthIERhc2FyIg0KYXV0aG9yOiAiSk9BTlMgSEVOS1kgU0VSVkFUSVVTIFNJTUFOVUxMQU5HIg0KZGF0ZTogICJgciBmb3JtYXQoU3lzLkRhdGUoKSwgJyVCICVkLCAlWScpYCINCm91dHB1dDoNCg0KICBybWRmb3JtYXRzOjpyZWFkdGhlZG93bjogICAjIGh0dHBzOi8vZ2l0aHViLmNvbS9qdWJhL3JtZGZvcm1hdHMNCiAgICBzZWxmX2NvbnRhaW5lZDogdHJ1ZQ0KICAgIHRodW1ibmFpbHM6IHRydWUNCiAgICBsaWdodGJveDogdHJ1ZQ0KICAgIGdhbGxlcnk6IHRydWUNCiAgICBsaWJfZGlyOiBsaWJzDQogICAgZGZfcHJpbnQ6ICJwYWdlZCINCiAgICBjb2RlX2ZvbGRpbmc6ICJzaG93Ig0KICAgIGNvZGVfZG93bmxvYWQ6IHllcw0KICAgIGNzczogInN0eWxlLmNzcyINCi0tLQ0KDQo8aW1nIHNyYz0iaW1hZ2UvZm90by5qcGVnIiBhbHQ9IkxvZ28iIHN0eWxlPSJ3aWR0aDozMDBweDsgZGlzcGxheTogYmxvY2s7IG1hcmdpbjogYXV0bzsiLz4NCg0KDQojIFByYWt0aWt1bSAxIA0KDQoqKkRhdGEgTmlsYWkgU2lzd2EqKg0KDQp8IERhdGEgSW50ZXJ2YWwgIHwgRnJla3VlbnNpICQoRl9pKSQgfA0KfC0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tfA0KfCAqKjQxLTUwKiogIHwgICAgMjAgICB8IA0KfCAqKjUxLTYwKiogIHwgICAgMzAgICB8IA0KfCAqKjYxLTcwKiogIHwgICAgNDAgICB8DQp8ICoqNzEtODAqKiAgfCAgICA1MCAgIHwgDQp8ICoqODEtOTAqKiAgfCAgICAzMCAgIHwgDQp8ICoqOTEtMTAwKiogfCAgICAyMCAgIHwNCg0KDQoNCg0KDQojIyBNZWFuIHVudHVrIERhdGEgS2Vsb21wb2sNCg0KIyMjIERlZmluaXNpIE1lYW4gdW50dWsgRGF0YSBLZWxvbXBvaw0KTWVhbiBhdGF1IHJhdGEtcmF0YSBhZGFsYWggdWt1cmFuIHBlbXVzYXRhbiBkYXRhIHlhbmcgcGFsaW5nIHVtdW0gZGlndW5ha2FuIHVudHVrIG1lbmdnYW1iYXJrYW4gcmF0YS1yYXRhIGRhcmkgc3VhdHUgZGlzdHJpYnVzaS4gVW50dWsgZGF0YSBrZWxvbXBvaywgbWVhbiBkaWhpdHVuZyBkZW5nYW4gbWVtcGVyaGl0dW5na2FuIGZyZWt1ZW5zaSBkYXJpIHNldGlhcCBrZWxhcyBpbnRlcnZhbC4NCg0KIyMjIFJ1bXVzIE1lYW4gdW50dWsgRGF0YSBLZWxvbXBvaw0KDQpSdW11cyB1bnR1ayBtZW5naGl0dW5nIG1lYW4gZGF0YSBrZWxvbXBvayBhZGFsYWggc2ViYWdhaSBiZXJpa3V0Og0KDQpcWw0KXGJhcntYfSA9IFxmcmFje1xzdW0gZl9pIFxjZG90IHhfaX17XHN1bSBmX2l9DQpcXQ0KDQpEaSBtYW5hOiAgDQotIFwoXGJhcntYfVwpID0gTWVhbiAocmF0YS1yYXRhKSAgDQotIFwoZl9pXCkgPSBGcmVrdWVuc2kgcGFkYSBpbnRlcnZhbCBrZS1cKGlcKSAgDQotIFwoeF9pXCkgPSBUaXRpayB0ZW5nYWggZGFyaSBpbnRlcnZhbCBrZS1cKGlcKSwgZGloaXR1bmcgc2ViYWdhaTogIA0KICBcWw0KICB4X2kgPSBcZnJhY3tcdGV4dHtiYXRhcyBiYXdhaCBpbnRlcnZhbH0gKyBcdGV4dHtiYXRhcyBhdGFzIGludGVydmFsfX17Mn0NCiAgXF0gIA0KLSBcKFxzdW0gZl9pXCkgPSBUb3RhbCBmcmVrdWVuc2kNCg0KDQojIyMgUGVyaGl0dW5nYW4gVGl0aWsgVGVuZ2FoIGRhbiBNZWFuIERhdGEgS2Vsb21wb2sNCg0KIyMjIFJ1bXVzIFRpdGlrIFRlbmdhaA0KVGl0aWsgdGVuZ2FoIChcKHhfaVwpKSBkaWhpdHVuZyBtZW5nZ3VuYWthbiBydW11cyBiZXJpa3V0Og0KXFsNCnhfaSA9IFxmcmFje1x0ZXh0e0JhdGFzIEJhd2FofSArIFx0ZXh0e0JhdGFzIEF0YXN9fXsyfQ0KXF0NCg0KIyMjIyBQZXJoaXR1bmdhbiBUaXRpayBUZW5nYWggVGlhcCBJbnRlcnZhbA0KQmVyaWt1dCBhZGFsYWggcGVyaGl0dW5nYW4gdGl0aWsgdGVuZ2FoIHVudHVrIHNldGlhcCBpbnRlcnZhbDoNCg0KLSAqKkludGVydmFsIDQxIC0gNTAqKjogIA0KICBcWw0KICB4X2kgPSBcZnJhY3s0MSArIDUwfXsyfSA9IDQ1LjUNCiAgXF0NCg0KLSAqKkludGVydmFsIDUxIC0gNjAqKjogIA0KICBcWw0KICB4X2kgPSBcZnJhY3s1MSArIDYwfXsyfSA9IDU1LjUNCiAgXF0NCg0KLSAqKkludGVydmFsIDYxIC0gNzAqKjogIA0KICBcWw0KICB4X2kgPSBcZnJhY3s2MSArIDcwfXsyfSA9IDY1LjUNCiAgXF0NCg0KLSAqKkludGVydmFsIDcxIC0gODAqKjogIA0KICBcWw0KICB4X2kgPSBcZnJhY3s3MSArIDgwfXsyfSA9IDc1LjUNCiAgXF0NCg0KLSAqKkludGVydmFsIDgxIC0gOTAqKjogIA0KICBcWw0KICB4X2kgPSBcZnJhY3s4MSArIDkwfXsyfSA9IDg1LjUNCiAgXF0NCg0KLSAqKkludGVydmFsIDkxIC0gMTAwKio6ICANCiAgXFsNCiAgeF9pID0gXGZyYWN7OTEgKyAxMDB9ezJ9ID0gOTUuNQ0KICBcXQ0KDQojIyMjIFRhYmVsIGRlbmdhbiBQZW5hbWJhaGFuIFRpdGlrIFRlbmdhaA0KQmVyaWt1dCBhZGFsYWggdGFiZWwgbGVuZ2thcCBkZW5nYW4gXCh4X2lcKSB5YW5nIHRlbGFoIGRpaGl0dW5nOg0KDQp8IERhdGEgSW50ZXJ2YWwgIHwgRnJla3VlbnNpICQoRl9pKSQgfCBUaXRpayBUZW5nYWggJChYX2kpJCB8DQp8LS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS18DQp8ICoqNDEtNTAqKiAgfCAgICAyMCAgIHwgIDQ1LDUgIHwNCnwgKio1MS02MCoqICB8ICAgIDMwICAgfCAgNTUsNSAgfA0KfCAqKjYxLTcwKiogIHwgICAgNDAgICB8ICA2NSw1ICB8DQp8ICoqNzEtODAqKiAgfCAgICA1MCAgIHwgIDc1LDUgIHwNCnwgKio4MS05MCoqICB8ICAgIDMwICAgfCAgODUsNSAgfA0KfCAqKjkxLTEwMCoqIHwgICAgMjAgICB8ICA5NSw1ICB8DQoNCiMjIyAxLiBNZWFuIERhdGEgS2Vsb21wb2sgZGVuZ2FuIE91dGxpZXINCg0KUnVtdXMgTWVhbjoNClxbDQpcYmFye1h9ID0gXGZyYWN7XHN1bSAoZl9pIFxjZG90IHhfaSl9e1xzdW0gZl9pfQ0KXF0NCg0KTGFuZ2thaC1sYW5na2FoOg0KDQotIEhpdHVuZyBcKCBmX2kgXGNkb3QgeF9pIFwpIHVudHVrIHNldGlhcCBpbnRlcnZhbDoNCg0KXFsNClxiZWdpbnthbGlnbmVkfQ0KMjAgXGNkb3QgNDUuNSAmPSA5MTAsIFxcDQozMCBcY2RvdCA1NS41ICY9IDE2NjUsIFxcDQo0MCBcY2RvdCA2NS41ICY9IDI2MjAsIFxcDQo1MCBcY2RvdCA3NS41ICY9IDM3NzUsIFxcDQozMCBcY2RvdCA4NS41ICY9IDI1NjUsIFxcDQoyMCBcY2RvdCA5NS41ICY9IDE5MTAuDQpcZW5ke2FsaWduZWR9DQpcXQ0KDQotIEhpdHVuZyB0b3RhbCBcKCBcc3VtIChmX2kgXGNkb3QgeF9pKSBcKToNClxbDQpcc3VtIChmX2kgXGNkb3QgeF9pKSA9IDkxMCArIDE2NjUgKyAyNjIwICsgMzc3NSArIDI1NjUgKyAxOTEwID0gMTM0NDUNClxdDQoNCi0gSGl0dW5nIHRvdGFsIGZyZWt1ZW5zaSBcKCBcc3VtIGZfaSBcKToNClxbDQpcc3VtIGZfaSA9IDIwICsgMzAgKyA0MCArIDUwICsgMzAgKyAyMCA9IDE5MA0KXF0NCg0KLSBIaXR1bmcgTWVhbjoNClxbDQpcYmFye1h9ID0gXGZyYWN7XHN1bSAoZl9pIFxjZG90IHhfaSl9e1xzdW0gZl9pfSA9IFxmcmFjezEzNDQ1fXsxOTB9IFxhcHByb3ggNzAuNzYNClxdDQoNCiMjIyAyLiBNZWFuIERhdGEgS2Vsb21wb2sgdGFucGEgT3V0bGllcg0KDQpEYXRhIHRhbnBhIE91dGxpZXI6IERhdGEgZGVuZ2FuIG5pbGFpIGxlYmloIGRhcmkgOTAgKG91dGxpZXIpIGRpaGFwdXMsIHNlaGluZ2dhIGhhbnlhIG1lbmdndW5ha2FuIGludGVydmFsIGRhcmkgNDHigJM5MC4NCg0KfCBEYXRhIEludGVydmFsICB8IEZyZWt1ZW5zaSAkKEZfaSkkIHwgVGl0aWsgVGVuZ2FoICQoWF9pKSQgfA0KfC0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tfA0KfCAqKjQxLTUwKiogIHwgICAgMjAgICB8ICA0NSw1ICB8DQp8ICoqNTEtNjAqKiAgfCAgICAzMCAgIHwgIDU1LDUgIHwNCnwgKio2MS03MCoqICB8ICAgIDQwICAgfCAgNjUsNSAgfA0KfCAqKjcxLTgwKiogIHwgICAgNTAgICB8ICA3NSw1ICB8DQp8ICoqODEtOTAqKiAgfCAgICAzMCAgIHwgIDg1LDUgIHwNCg0KDQpMYW5na2FoLWxhbmdrYWg6DQoNCi0gSGl0dW5nIFwoIGZfaSBcY2RvdCB4X2kgXCkgdW50dWsgc2V0aWFwIGludGVydmFsOg0KDQpcWw0KXGJlZ2lue2FsaWduZWR9DQoyMCBcY2RvdCA0NS41ICY9IDkxMCwgXFwNCjMwIFxjZG90IDU1LjUgJj0gMTY2NSwgXFwNCjQwIFxjZG90IDY1LjUgJj0gMjYyMCwgXFwNCjUwIFxjZG90IDc1LjUgJj0gMzc3NSwgXFwNCjMwIFxjZG90IDg1LjUgJj0gMjU2NS4NClxlbmR7YWxpZ25lZH0NClxdDQoNCi0gSGl0dW5nIHRvdGFsIFwoIFxzdW0gKGZfaSBcY2RvdCB4X2kpIFwpOg0KXFsNClxzdW0gKGZfaSBcY2RvdCB4X2kpID0gOTEwICsgMTY2NSArIDI2MjAgKyAzNzc1ICsgMjU2NSA9IDExNTM1DQpcXQ0KDQotIEhpdHVuZyB0b3RhbCBmcmVrdWVuc2kgXCggXHN1bSBmX2kgXCk6DQpcWw0KXHN1bSBmX2kgPSAyMCArIDMwICsgNDAgKyA1MCArIDMwID0gMTcwDQpcXQ0KDQotIEhpdHVuZyBNZWFuOg0KXFsNClxiYXJ7WH0gPSBcZnJhY3tcc3VtIChmX2kgXGNkb3QgeF9pKX17XHN1bSBmX2l9ID0gXGZyYWN7MTE1MzV9ezE3MH0gXGFwcHJveCA2Ny44NQ0KXF0NCg0KDQojIyMgVmlzdWFsaXNhc2kgTWVhbiB1bnR1ayBEYXRhIEtlbG9tcG9rIGRlbmdhbiBvdXRsaWVyIGRhbiB0YW5wYSBvdXRsaWVyDQoNCmBgYHtyLCBlY2hvPUZBTFNFLG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQojIE1lbXVhdCBwdXN0YWthIHlhbmcgZGlwZXJsdWthbg0KbGlicmFyeShwbG90bHkpDQoNCiMgRGF0YSBpbnRlcnZhbCBkYW4gZnJla3VlbnNpDQppbnRlcnZhbCA8LSBjKCI0MSAtIDUwIiwgIjUxIC0gNjAiLCAiNjEgLSA3MCIsICI3MSAtIDgwIiwgIjgxIC0gOTAiLCAiOTEgLSAxMDAiKQ0KZnJla3VlbnNpIDwtIGMoMjAsIDMwLCA0MCwgNTAsIDMwLCAyMCkNCg0KIyBIaXR1bmcgdGl0aWsgdGVuZ2FoIHVudHVrIHNldGlhcCBpbnRlcnZhbA0KYmF0YXNfYmF3YWggPC0gYyg0MSwgNTEsIDYxLCA3MSwgODEsIDkxKQ0KYmF0YXNfYXRhcyA8LSBjKDUwLCA2MCwgNzAsIDgwLCA5MCwgMTAwKQ0KdGl0aWtfdGVuZ2FoIDwtIChiYXRhc19iYXdhaCArIGJhdGFzX2F0YXMpIC8gMg0KDQojIEVrc3BhbnNpIGRhdGEgYmVyZGFzYXJrYW4gZnJla3VlbnNpDQpkYXRhX2V4cGFuZGVkIDwtIHJlcCh0aXRpa190ZW5nYWgsIHRpbWVzID0gZnJla3VlbnNpKQ0KDQojIE1lbWJ1YXQgZGF0YSBmcmFtZSB1bnR1ayB2aXN1YWxpc2FzaQ0KZGF0YV9jb21iaW5lZCA8LSBkYXRhLmZyYW1lKA0KICBOaWxhaSA9IGMoZGF0YV9leHBhbmRlZCwgZGF0YV9leHBhbmRlZFtkYXRhX2V4cGFuZGVkIDwgOTFdKSwNCiAgS2Vsb21wb2sgPSBjKHJlcCgiRGVuZ2FuIE91dGxpZXJzIiwgbGVuZ3RoKGRhdGFfZXhwYW5kZWQpKSwNCiAgICAgICAgICAgICAgIHJlcCgiVGFucGEgT3V0bGllcnMiLCBzdW0oZGF0YV9leHBhbmRlZCA8IDkxKSkpDQopDQoNCiMgSGl0dW5nIG1lYW4gdW50dWsgc2V0aWFwIGtlbG9tcG9rDQptZWFuX3dpdGhfb3V0bGllcnMgPC0gbWVhbihkYXRhX2NvbWJpbmVkJE5pbGFpW2RhdGFfY29tYmluZWQkS2Vsb21wb2sgPT0gIkRlbmdhbiBPdXRsaWVycyJdKQ0KbWVhbl93aXRob3V0X291dGxpZXJzIDwtIG1lYW4oZGF0YV9jb21iaW5lZCROaWxhaVtkYXRhX2NvbWJpbmVkJEtlbG9tcG9rID09ICJUYW5wYSBPdXRsaWVycyJdKQ0KDQojIE1lbWJ1YXQgcGxvdCBpbnRlcmFrdGlmIG1lbmdndW5ha2FuIFBsb3RseQ0KcGxvdCA8LSBwbG90X2x5KA0KICBkYXRhID0gZGF0YV9jb21iaW5lZCwNCiAgeCA9IH5LZWxvbXBvaywNCiAgeSA9IH5OaWxhaSwNCiAgdHlwZSA9ICJib3giLA0KICBib3hwb2ludHMgPSAib3V0bGllcnMiLA0KICBqaXR0ZXIgPSAwLjMsDQogIHBvaW50cG9zID0gLTEuOCwNCiAgY29sb3JzID0gYygiRGVuZ2FuIE91dGxpZXJzIiA9ICJhcXVhbWFyaW5lMyIsICJUYW5wYSBPdXRsaWVycyIgPSAic3RlZWxibHVlMiIpDQopICU+JQ0KICAjIE1lbmFtYmFoa2FuIGFub3Rhc2kgTWVhbiB1bnR1ayBkYXRhIGRlbmdhbiBvdXRsaWVycw0KICBhZGRfYW5ub3RhdGlvbnMoDQogICAgeCA9ICJEZW5nYW4gT3V0bGllcnMiLA0KICAgIHkgPSBtZWFuX3dpdGhfb3V0bGllcnMsDQogICAgdGV4dCA9IHBhc3RlKCJNZWFuOiIsIHJvdW5kKG1lYW5fd2l0aF9vdXRsaWVycywgMikpLA0KICAgIHNob3dhcnJvdyA9IFRSVUUsDQogICAgYXJyb3doZWFkID0gMiwNCiAgICBheCA9IDAsDQogICAgYXkgPSAtNDAsDQogICAgZm9udCA9IGxpc3QoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTIpDQogICkgJT4lDQogICMgTWVuYW1iYWhrYW4gYW5vdGFzaSBNZWFuIHVudHVrIGRhdGEgdGFucGEgb3V0bGllcnMNCiAgYWRkX2Fubm90YXRpb25zKA0KICAgIHggPSAiVGFucGEgT3V0bGllcnMiLA0KICAgIHkgPSBtZWFuX3dpdGhvdXRfb3V0bGllcnMsDQogICAgdGV4dCA9IHBhc3RlKCJNZWFuOiIsIHJvdW5kKG1lYW5fd2l0aG91dF9vdXRsaWVycywgMikpLA0KICAgIHNob3dhcnJvdyA9IFRSVUUsDQogICAgYXJyb3doZWFkID0gMiwNCiAgICBheCA9IDAsDQogICAgYXkgPSAtNDAsDQogICAgZm9udCA9IGxpc3QoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTIpDQogICkgJT4lDQogICMgTWVuYW1iYWhrYW4gbGF5b3V0DQogIGxheW91dCgNCiAgICB0aXRsZSA9ICJQZW5nYXJ1aCBPdXRsaWVycyB0ZXJoYWRhcCBNZWFuIiwNCiAgICB4YXhpcyA9IGxpc3QodGl0bGUgPSAiS2Vsb21wb2sgRGF0YSIpLA0KICAgIHlheGlzID0gbGlzdCh0aXRsZSA9ICJOaWxhaSIsIHJhbmdlID0gYyg0MCwgMTAwKSksDQogICAgc2hvd2xlZ2VuZCA9IEZBTFNFDQogICkNCg0KIyBNZW5hbXBpbGthbiBwbG90DQpwbG90DQoNCmBgYA0KDQojIyBNZWRpYW4gdW50dWsgRGF0YSBLZWxvbXBvaw0KDQojIyMgRGVmaW5pc2kgTWVkaWFuIHVudHVrIERhdGEgS2Vsb21wb2sNCk1lZGlhbiBhZGFsYWggbmlsYWkgdGVuZ2FoIHlhbmcgbWVtYmFnaSBkYXRhIG1lbmphZGkgZHVhIGJhZ2lhbiBzYW1hIGJlc2FyLiBEYWxhbSBkYXRhIGtlbG9tcG9rLCBtZWRpYW4gZGloaXR1bmcgZGVuZ2FuIG1lbmdndW5ha2FuIGJhdGFzIGtlbGFzIGRhbiBmcmVrdWVuc2kgZGFyaSBrZWxhcy1rZWxhcyBpbnRlcnZhbC4NCg0KIyMjIFJ1bXVzIE1lZGlhbiB1bnR1ayBEYXRhIEtlbG9tcG9rDQoNClJ1bXVzIG1lZGlhbiB1bnR1ayBkYXRhIGtlbG9tcG9rIGFkYWxhaCBzZWJhZ2FpIGJlcmlrdXQ6DQoNClxbDQpcdGV4dHtNZWRpYW59ID0gTCArIFxsZWZ0KCBcZnJhY3tcZnJhY3tufXsyfSAtIEZ9e2ZfbX0gXHJpZ2h0KSBcY2RvdCBjDQpcXQ0KDQpEaSBtYW5hOg0KDQotIFwoTFwpOiBCYXRhcyBiYXdhaCBrZWxhcyBtZWRpYW4NCg0KLSBcKG5cKTogSnVtbGFoIHRvdGFsIGZyZWt1ZW5zaSAoXChcc3VtIGZcKSkNCg0KLSBcKEZcKTogRnJla3VlbnNpIGt1bXVsYXRpZiBzZWJlbHVtIGtlbGFzIG1lZGlhbg0KDQotIFwoZl9tXCk6IEZyZWt1ZW5zaSBrZWxhcyBtZWRpYW4NCg0KLSBcKGNcKTogUGFuamFuZyBpbnRlcnZhbCBrZWxhcw0KDQoqKkRhdGEgQXNsaToqKg0KDQp8IERhdGEgSW50ZXJ2YWwgIHwgRnJla3VlbnNpICQoRl9pKSQgfCBUaXRpayBUZW5nYWggJChYX2kpJCB8DQp8LS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS18DQp8ICoqNDEtNTAqKiAgfCAgICAyMCAgIHwgIDQ1LDUgIHwNCnwgKio1MS02MCoqICB8ICAgIDMwICAgfCAgNTUsNSAgfA0KfCAqKjYxLTcwKiogIHwgICAgNDAgICB8ICA2NSw1ICB8DQp8ICoqNzEtODAqKiAgfCAgICA1MCAgIHwgIDc1LDUgIHwNCnwgKio4MS05MCoqICB8ICAgIDMwICAgfCAgODUsNSAgfA0KDQojIyMgMS4gTWVkaWFuIERhdGEgS2Vsb21wb2sgZGVuZ2FuIE91dGxpZXINCg0KVW50dWsgbWVuZ2hpdHVuZyBtZWRpYW4gdGFucGEgbWVuZ2hpbGFuZ2thbiBvdXRsaWVyLCBiZXJpa3V0IGFkYWxhaCBsYW5na2FoLWxhbmdrYWhueWE6DQoNCi0gVG90YWwgSnVtbGFoIERhdGE6IA0KXFsNCm4gPSAyMCArIDMwICsgNDAgKyA1MCArIDMwICsgMjAgPSAxOTANClxdDQoNCi0gUG9zaXNpIE1lZGlhbg0KDQpLYXJlbmEgXChuID0gMTkwXCksIGp1bWxhaCBkYXRhIGdlbmFwLCBtYWthOg0KDQpcWw0KXHRleHR7UG9zaXNpIE1lZGlhbn0gPSBcZnJhY3tufXsyfSA9IDk1IFxxdWFkIFx0ZXh0e2Rhbn0gXHF1YWQgXGZyYWN7bn17Mn0gKyAxID0gOTYNClxdDQoNCiMjIyMgRnJla3VlbnNpIEt1bXVsYXRpZg0KDQoNCnwgRGF0YSBJbnRlcnZhbCAgfCBGcmVrdWVuc2kgJChGX2kpJCB8IEZyZWt1ZW5zaSBLdW11bGF0aWYgfA0KfC0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tfA0KfCAqKjQxLTUwKiogIHwgICAgMjAgICB8ICAyMCAgIHwNCnwgKio1MS02MCoqICB8ICAgIDMwICAgfCAgNTAgICB8DQp8ICoqNjEtNzAqKiAgfCAgICA0MCAgIHwgIDkwICAgfA0KfCAqKjcxLTgwKiogIHwgICAgNTAgICB8ICAxNDAgIHwNCnwgKio4MS05MCoqICB8ICAgIDMwICAgfCAgMTcwICB8DQp8ICoqOTEtMTAwKiogfCAgICAyMCAgIHwgIDE5MCAgfA0KDQoNCkJlcmRhc2Fya2FuIGZyZWt1ZW5zaSBrdW11bGF0aWYsIGRhdGEga2UtOTUgZGFuIGtlLTk2IGJlcmFkYSBkYWxhbSBpbnRlcnZhbCA3MS04MC4NCg0KIyMjIyBSdW11cyBNZWRpYW4NCg0KUnVtdXMgbWVkaWFuIHVudHVrIGRhdGEga2Vsb21wb2sgYWRhbGFoOg0KDQpcWw0KXHRleHR7TWVkaWFufSA9IEwgKyBcbGVmdCggXGZyYWN7XGZyYWN7bn17Mn0gLSBGfXtmX219IFxyaWdodCkgXGNkb3QgYw0KXF0NCg0KIyMjIyBTdWJzdGl0dXNpIE5pbGFpDQoNClxbDQpMID0gNzAuNSwgXHF1YWQgRiA9IDkwLCBccXVhZCBmX20gPSA1MCwgXHF1YWQgYyA9IDEwDQpcXQ0KDQotIFBlcmhpdHVuZ2FuIE1lZGlhbg0KXFsNClx0ZXh0e01lZGlhbn0gPSA3MC41ICsgXGxlZnQoIFxmcmFjezk1IC0gOTB9ezUwfSBccmlnaHQpIFxjZG90IDEwDQpcXQ0KXFsNClx0ZXh0e01lZGlhbn0gPSA3MC41ICsgXGxlZnQoIFxmcmFjezV9ezUwfSBccmlnaHQpIFxjZG90IDEwDQpcXQ0KXFsNClx0ZXh0e01lZGlhbn0gPSA3MC41ICsgMSA9IDcxLjUNClxdDQoNCiMjIyMgSGFzaWwgTWVkaWFuIChkZW5nYW4gb3V0bGllcikNClxbDQpcYm94ZWR7NzEuNX0NClxdDQoNCg0KIyMjIDIuIE1lZGlhbiBEYXRhIEtlbG9tcG9rIFRhbnBhIE91dGxpZXINCg0KIyMjIyBJZGVudGlmaWthc2kgT3V0bGllcg0KDQotICoqUTEqKjogRGF0YSBrZS00Ny41IGJlcmFkYSBkaSBrZWxhcyAqKjYxLTcwKiosIHNlaGluZ2dhIFwoIFExID0gNjUuNSBcKS4NCi0gKipRMyoqOiBEYXRhIGtlLTE0Mi41IGJlcmFkYSBkaSBrZWxhcyAqKjcxLTgwKiosIHNlaGluZ2dhIFwoIFEzID0gNzUuNSBcKS4NCi0gKipJUVIqKjogIA0KICBcWw0KICBcdGV4dHtJUVJ9ID0gUTMgLSBRMSA9IDc1LjUgLSA2NS41ID0gMTANCiAgXF0NCi0gQmF0YXMgYmF3YWggZGFuIGF0YXM6ICANCiAgXFsNCiAgXHRleHR7TG93ZXIgQm91bmR9ID0gUTEgLSAxLjUgXHRpbWVzIFx0ZXh0e0lRUn0gPSA2NS41IC0gMTUgPSA1MC41DQogIFxdDQogIFxbDQogIFx0ZXh0e1VwcGVyIEJvdW5kfSA9IFEzICsgMS41IFx0aW1lcyBcdGV4dHtJUVJ9ID0gNzUuNSArIDE1ID0gOTAuNQ0KICBcXQ0KLSBJbnRlcnZhbCAqKjkxLTEwMCoqIChcKCB4ID0gOTUuNSBcKSkgYWRhbGFoIG91dGxpZXIga2FyZW5hIGJlcmFkYSBkaSBsdWFyIGJhdGFzIGF0YXMuDQoNCiMjIyMgRGF0YSB5YW5nIFRlcnNpc2ENCg0KfCBEYXRhIEludGVydmFsICB8IEZyZWt1ZW5zaSAkKEZfaSkkIHwgRnJla3VlbnNpIEt1bXVsYXRpZiB8DQp8LS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS18DQp8ICoqNDEtNTAqKiAgfCAgICAyMCAgIHwgIDIwICAgfA0KfCAqKjUxLTYwKiogIHwgICAgMzAgICB8ICA1MCAgIHwNCnwgKio2MS03MCoqICB8ICAgIDQwICAgfCAgOTAgICB8DQp8ICoqNzEtODAqKiAgfCAgICA1MCAgIHwgIDE0MCAgfA0KfCAqKjgxLTkwKiogIHwgICAgMzAgICB8ICAxNzAgIHwNCg0KLSBKdW1sYWggZGF0YSBiYXJ1IChcKCBuIFwpKTogIA0KICBcWw0KICBuID0gMjAgKyAzMCArIDQwICsgNTAgKyAzMCA9IDE3MA0KICBcXQ0KLSBQb3Npc2kgbWVkaWFuOiAgDQogIFxbDQogIFx0ZXh0e01lZGlhbn0gPSBcZnJhY3tufXsyfSA9IDg1IFxxdWFkIFx0ZXh0e2Rhbn0gXHF1YWQgXGZyYWN7bn17Mn0gKyAxID0gODYNCiAgXF0NCg0KIyMjIyBSdW11cyBNZWRpYW4NCg0KXFsNClx0ZXh0e01lZGlhbn0gPSBMICsgXGxlZnQoIFxmcmFje1xmcmFje259ezJ9IC0gRn17Zl9tfSBccmlnaHQpIFxjZG90IGMNClxdDQoNCiMjIyMgU3Vic3RpdHVzaSBOaWxhaQ0KDQotICoqSW50ZXJ2YWwgbWVkaWFuKio6IFwoIDcxLTgwIFwpICANCiAgXFsNCiAgTCA9IDcwLjUsIFxxdWFkIEYgPSA5MCwgXHF1YWQgZl9tID0gNTAsIFxxdWFkIGMgPSAxMA0KICBcXQ0KLSBIaXR1bmcgbWVkaWFuOiAgDQogIFxbDQogIFx0ZXh0e01lZGlhbn0gPSA3MC41ICsgXGxlZnQoIFxmcmFjezg1IC0gOTB9ezUwfSBccmlnaHQpIFxjZG90IDEwDQogIFxdDQogIFxbDQogIFx0ZXh0e01lZGlhbn0gPSA3MC41ICsgXGxlZnQoIFxmcmFjey01fXs1MH0gXHJpZ2h0KSBcY2RvdCAxMA0KICBcXQ0KICBcWw0KICBcdGV4dHtNZWRpYW59ID0gNzAuNSAtIDEgPSA2OS41DQogIFxdDQoNCiMjIyMgSGFzaWwgTWVkaWFuICh0YW5wYSBvdXRsaWVyKQ0KDQpcWw0KXGJveGVkezY5LjV9DQpcXQ0KDQoNCg0KDQojIyMgVmlzdWFsaXNhc2kgTWVkaWFuIHVudHVrIERhdGEgS2Vsb21wb2sgZGVuZ2FuIG91dGxpZXIgZGFuIHRhbnBhIG91dGxpZXINCg0KYGBge3IsIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQojIE1lbXVhdCBwdXN0YWthIHlhbmcgZGlwZXJsdWthbg0KbGlicmFyeShwbG90bHkpDQoNCiMgRGF0YSBhc2xpDQpkYXRhIDwtIGRhdGEuZnJhbWUoDQogIEludGVydmFsID0gYygiNDEtNTAiLCAiNTEtNjAiLCAiNjEtNzAiLCAiNzEtODAiLCAiODEtOTAiLCAiOTEtMTAwIiksDQogIEZyZWt1ZW5zaSA9IGMoMjAsIDMwLCA0MCwgNTAsIDMwLCAyMCksDQogIFRpdGlrX1RlbmdhaCA9IGMoNDUuNSwgNTUuNSwgNjUuNSwgNzUuNSwgODUuNSwgOTUuNSkNCikNCg0KIyBQZXJoaXR1bmdhbiBNZWRpYW4gZGVuZ2FuIE91dGxpZXINCk4gPC0gc3VtKGRhdGEkRnJla3VlbnNpKSAgIyBUb3RhbCBkYXRhDQptZWRpYW5fcG9zIDwtIE4gLyAyICAgICAgICMgUG9zaXNpIG1lZGlhbg0KTCA8LSA3MC41ICAgICAgICAgICAgICAgICAjIEJhdGFzIGJhd2FoIGtlbGFzIG1lZGlhbg0KRiA8LSBzdW0oZGF0YSRGcmVrdWVuc2lbMTozXSkgIyBGcmVrdWVuc2kga3VtdWxhdGlmIHNlYmVsdW0ga2VsYXMgbWVkaWFuDQpmbSA8LSBkYXRhJEZyZWt1ZW5zaVs0XSAgICMgRnJla3VlbnNpIGtlbGFzIG1lZGlhbg0KYyA8LSAxMCAgICAgICAgICAgICAgICAgICAjIFBhbmphbmcga2VsYXMNCm1lZGlhbl93aXRoX291dGxpZXIgPC0gTCArICgobWVkaWFuX3BvcyAtIEYpIC8gZm0pICogYyAgIyBIYXNpbDogNzEuNQ0KDQojIE1lbmdoYXB1cyBPdXRsaWVyDQpRMSA8LSA2NS41ICAjIEt1YXJ0aWwgcGVydGFtYQ0KUTMgPC0gNzUuNSAgIyBLdWFydGlsIGtldGlnYQ0KSVFSIDwtIFEzIC0gUTEgICMgUmVudGFuZyBhbnRhciBrdWFydGlsDQpsb3dlcl9ib3VuZCA8LSBRMSAtIDEuNSAqIElRUiAgIyBCYXRhcyBiYXdhaDogNTAuNQ0KdXBwZXJfYm91bmQgPC0gUTMgKyAxLjUgKiBJUVIgICMgQmF0YXMgYXRhczogOTAuNQ0KDQojIEZpbHRlciBkYXRhIHRhbnBhIG91dGxpZXIgKGhpbGFuZ2thbiBrZWxhcyA5MS0xMDApDQpkYXRhX25vX291dGxpZXIgPC0gZGF0YVtkYXRhJFRpdGlrX1RlbmdhaCA8PSB1cHBlcl9ib3VuZCwgXQ0KDQojIFBlcmhpdHVuZ2FuIE1lZGlhbiB0YW5wYSBPdXRsaWVyDQpOX25vX291dGxpZXIgPC0gc3VtKGRhdGFfbm9fb3V0bGllciRGcmVrdWVuc2kpICAjIFRvdGFsIGRhdGEgdGFucGEgb3V0bGllcg0KbWVkaWFuX3Bvc19ub19vdXRsaWVyIDwtIE5fbm9fb3V0bGllciAvIDIgICAgICAgIyBQb3Npc2kgbWVkaWFuDQpGX25vX291dGxpZXIgPC0gc3VtKGRhdGFfbm9fb3V0bGllciRGcmVrdWVuc2lbMTozXSkgIyBGcmVrdWVuc2kga3VtdWxhdGlmIHNlYmVsdW0ga2VsYXMgbWVkaWFuDQpmbV9ub19vdXRsaWVyIDwtIGRhdGFfbm9fb3V0bGllciRGcmVrdWVuc2lbNF0gICAjIEZyZWt1ZW5zaSBrZWxhcyBtZWRpYW4NCm1lZGlhbl93aXRob3V0X291dGxpZXIgPC0gTCArICgobWVkaWFuX3Bvc19ub19vdXRsaWVyIC0gRl9ub19vdXRsaWVyKSAvIGZtX25vX291dGxpZXIpICogYyAgIyBIYXNpbDogNjkuNQ0KDQojIFBlcnNpYXBhbiBkYXRhIHVudHVrIHZpc3VhbGlzYXNpDQpleHBhbmRlZF9kYXRhIDwtIHVubGlzdChtYXBwbHkocmVwLCBkYXRhJFRpdGlrX1RlbmdhaCwgZGF0YSRGcmVrdWVuc2kpKSAgIyBEZW5nYW4gb3V0bGllcg0KZmlsdGVyZWRfZGF0YSA8LSB1bmxpc3QobWFwcGx5KHJlcCwgZGF0YV9ub19vdXRsaWVyJFRpdGlrX1RlbmdhaCwgZGF0YV9ub19vdXRsaWVyJEZyZWt1ZW5zaSkpICAjIFRhbnBhIG91dGxpZXINCg0KIyBHYWJ1bmdrYW4gZGF0YSB1bnR1ayBwbG90DQpib3hwbG90X2RhdGEgPC0gZGF0YS5mcmFtZSgNCiAgTmlsYWkgPSBjKGV4cGFuZGVkX2RhdGEsIGZpbHRlcmVkX2RhdGEpLA0KICBLZWxvbXBvayA9IGMoDQogICAgcmVwKCJEZW5nYW4gT3V0bGllciIsIGxlbmd0aChleHBhbmRlZF9kYXRhKSksDQogICAgcmVwKCJUYW5wYSBPdXRsaWVyIiwgbGVuZ3RoKGZpbHRlcmVkX2RhdGEpKQ0KICApDQopDQoNCiMgTWVtYnVhdCBCb3hwbG90IG1lbmdndW5ha2FuIFBsb3RseQ0KcGxvdCA8LSBwbG90X2x5KA0KICBkYXRhID0gYm94cGxvdF9kYXRhLA0KICB4ID0gfktlbG9tcG9rLA0KICB5ID0gfk5pbGFpLA0KICB0eXBlID0gImJveCIsDQogIGJveHBvaW50cyA9ICJvdXRsaWVycyIsDQogIGppdHRlciA9IDAuMywNCiAgcG9pbnRwb3MgPSAtMS44LA0KICBjb2xvcnMgPSBjKCJEZW5nYW4gT3V0bGllciIgPSAic2t5Ymx1ZSIsICJUYW5wYSBPdXRsaWVyIiA9ICJsaWdodGdyZWVuIikNCikgJT4lDQogICMgTWVuYW1iYWhrYW4gYW5vdGFzaSBNZWRpYW4gdW50dWsgZGF0YSBkZW5nYW4gb3V0bGllcg0KICBhZGRfYW5ub3RhdGlvbnMoDQogICAgeCA9ICJEZW5nYW4gT3V0bGllciIsDQogICAgeSA9IG1lZGlhbl93aXRoX291dGxpZXIsDQogICAgdGV4dCA9IHBhc3RlKCJNZWRpYW46Iiwgcm91bmQobWVkaWFuX3dpdGhfb3V0bGllciwgMSkpLA0KICAgIHNob3dhcnJvdyA9IFRSVUUsDQogICAgYXJyb3doZWFkID0gMiwNCiAgICBheCA9IDAsDQogICAgYXkgPSAtNDAsDQogICAgZm9udCA9IGxpc3QoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTIpDQogICkgJT4lDQogICMgTWVuYW1iYWhrYW4gYW5vdGFzaSBNZWRpYW4gdW50dWsgZGF0YSB0YW5wYSBvdXRsaWVyDQogIGFkZF9hbm5vdGF0aW9ucygNCiAgICB4ID0gIlRhbnBhIE91dGxpZXIiLA0KICAgIHkgPSBtZWRpYW5fd2l0aG91dF9vdXRsaWVyLA0KICAgIHRleHQgPSBwYXN0ZSgiTWVkaWFuOiIsIHJvdW5kKG1lZGlhbl93aXRob3V0X291dGxpZXIsIDEpKSwNCiAgICBzaG93YXJyb3cgPSBUUlVFLA0KICAgIGFycm93aGVhZCA9IDIsDQogICAgYXggPSAwLA0KICAgIGF5ID0gLTQwLA0KICAgIGZvbnQgPSBsaXN0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDEyKQ0KICApICU+JQ0KICAjIE1lbmFtYmFoa2FuIGxheW91dA0KICBsYXlvdXQoDQogICAgdGl0bGUgPSAiUGVuZ2FydWggT3V0bGllciB0ZXJoYWRhcCBNZWRpYW4iLA0KICAgIHhheGlzID0gbGlzdCh0aXRsZSA9ICJLZWxvbXBvayBEYXRhIiksDQogICAgeWF4aXMgPSBsaXN0KHRpdGxlID0gIk5pbGFpIiwgcmFuZ2UgPSBjKDQwLCAxMDApKSwNCiAgICBzaG93bGVnZW5kID0gRkFMU0UNCiAgKQ0KDQojIE1lbmFtcGlsa2FuIHBsb3QNCnBsb3QNCg0KDQpgYGANCg0KIyMgTW9kdXMgdW50dWsgRGF0YSBLZWxvbXBvaw0KDQojIyMgRGVmaW5pc2kgTW9kdXMgdW50dWsgS2Vsb21wb2sgRGF0YQ0KDQpNb2R1cyBhZGFsYWggc2FsYWggc2F0dSB1a3VyYW4gcGVtdXNhdGFuIGRhdGEgeWFuZyBtZW51bmp1a2thbiBuaWxhaSBhdGF1IGtlbGFzIHlhbmcgcGFsaW5nIHNlcmluZyBtdW5jdWwgZGFsYW0gc3VhdHUga3VtcHVsYW4gZGF0YS4gRGFsYW0gYW5hbGlzaXMgc3RhdGlzdGlrLCBtb2R1cyBzZXJpbmcgZGlndW5ha2FuIHVudHVrIGRhdGEgYmVya2Vsb21wb2sgeWFuZyBkaXNhamlrYW4gZGFsYW0gdGFiZWwgZGlzdHJpYnVzaSBmcmVrdWVuc2kuDQoNCiMjIyBMYW5na2FoIE1lbmVudHVrYW4gTW9kdXMgdW50dWsgRGF0YSBLZWxvbXBvaw0KDQpVbnR1ayBkYXRhIGJlcmtlbG9tcG9rLCBtb2R1cyBkaWhpdHVuZyBtZW5nZ3VuYWthbiBydW11cyBiZXJpa3V0Og0KDQpcWw0KXHRleHR7TW9kdXN9ID0gTCArIFxsZWZ0KCBcZnJhY3tmXzEgLSBmXzB9eyhmXzEgLSBmXzApICsgKGZfMSAtIGZfMil9IFxyaWdodCkgXHRpbWVzIGMNClxdDQoNCioqS2V0ZXJhbmdhbjoqKg0KDQotIFwoTFwpOiB0ZXBpIGJhd2FoIGtlbGFzIG1vZHVzIChrZWxhcyBkZW5nYW4gZnJla3VlbnNpIHRlcnRpbmdnaSkuDQoNCi0gXChmXzFcKTogZnJla3VlbnNpIGtlbGFzIG1vZHVzLg0KDQotIFwoZl8wXCk6IGZyZWt1ZW5zaSBrZWxhcyBzZWJlbHVtIGtlbGFzIG1vZHVzLg0KDQotIFwoZl8yXCk6IGZyZWt1ZW5zaSBrZWxhcyBzZXRlbGFoIGtlbGFzIG1vZHVzLg0KDQotIFwoY1wpOiBwYW5qYW5nIGludGVydmFsIGtlbGFzIChzZWxpc2loIGFudGFyYSBiYXRhcyBhdGFzIGRhbiBiYXRhcyBiYXdhaCBrZWxhcykuDQoNCiMjIyAxLiBNb2R1cyBEYXRhIEtlbG9tcG9rIGRlbmdhbiBPdXRsaWVyDQoNCk1pc2Fsa2FuIHRlcmRhcGF0IG91dGxpZXIsIHlhaXR1IGtlbmFpa2FuIGZyZWt1ZW5zaSBkaSBrZWxhcyB0ZXJ0aW5nZ2ksIHNlaGluZ2dhIHRhYmVsIG1lbmphZGk6DQoNCnwgKipEYXRhIEludGVydmFsKiogfCAqKkZyZWt1ZW5zaSoqICQoRl9pKSQgfA0KfC0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18DQp8ICoqNDEtNTAqKiAgICAgICAgIHwgMjAgICAgICAgICAgICAgICAgICAgIHwNCnwgKio1MS02MCoqICAgICAgICAgfCAzMCAgICAgICAgICAgICAgICAgICAgfA0KfCAqKjYxLTcwKiogICAgICAgICB8IDQwICAgICAgICAgICAgICAgICAgICB8DQp8ICoqNzEtODAqKiAgICAgICAgIHwgNTAgICAgICAgICAgICAgICAgICAgIHwNCnwgKio4MS05MCoqICAgICAgICAgfCAzMCAgICAgICAgICAgICAgICAgICAgfA0KfCAqKjkxLTEwMCoqICAgICAgICB8IDIwIChvdXRsaWVyKSAgICAgICAgICB8DQoNCi0tLQ0KDQojIyMgTGFuZ2thaCBQZXJoaXR1bmdhbiBNb2R1cw0KDQojIyMjIDEuIElkZW50aWZpa2FzaSBLZWxhcyBNb2R1czoNCktlbGFzIGRlbmdhbiBmcmVrdWVuc2kgdGVydGluZ2dpIHRldGFwICoqNzEtODAqKiAoXChmXzEgPSA1MFwpKS4NCg0KIyMjIyAyLiBJbmZvcm1hc2k6DQotIFwoTCA9IDcxXCk6IHRlcGkgYmF3YWgga2VsYXMgbW9kdXMuDQotIFwoZl8xID0gNTBcKTogZnJla3VlbnNpIGtlbGFzIG1vZHVzLg0KLSBcKGZfMCA9IDQwXCk6IGZyZWt1ZW5zaSBrZWxhcyBzZWJlbHVtIGtlbGFzIG1vZHVzLg0KLSBcKGZfMiA9IDMwXCk6IGZyZWt1ZW5zaSBrZWxhcyBzZXRlbGFoIGtlbGFzIG1vZHVzLg0KLSBcKGMgPSAxMFwpOiBwYW5qYW5nIGludGVydmFsIGtlbGFzLg0KDQotLS0NCg0KIyMjIFJ1bXVzIE1vZHVzOg0KXFsNClx0ZXh0e01vZHVzfSA9IEwgKyBcbGVmdCggXGZyYWN7Zl8xIC0gZl8wfXsoZl8xIC0gZl8wKSArIChmXzEgLSBmXzIpfSBccmlnaHQpIFx0aW1lcyBjDQpcXQ0KDQotLS0NCg0KIyMjIFN1YnN0aXR1c2kgTmlsYWk6DQpcWw0KXHRleHR7TW9kdXN9ID0gNzEgKyBcbGVmdCggXGZyYWN7NTAgLSA0MH17KDUwIC0gNDApICsgKDUwIC0gMzApfSBccmlnaHQpIFx0aW1lcyAxMA0KXF0NClxbDQpcdGV4dHtNb2R1c30gPSA3MSArIFxsZWZ0KCBcZnJhY3sxMH17MTAgKyAyMH0gXHJpZ2h0KSBcdGltZXMgMTANClxdDQpcWw0KXHRleHR7TW9kdXN9ID0gNzEgKyBcbGVmdCggXGZyYWN7MTB9ezMwfSBccmlnaHQpIFx0aW1lcyAxMA0KXF0NClxbDQpcdGV4dHtNb2R1c30gPSA3MSArICgwLjMzMyBcdGltZXMgMTApDQpcXQ0KXFsNClx0ZXh0e01vZHVzfSA9IDcxICsgMy4zMw0KXF0NClxbDQpcdGV4dHtNb2R1c30gXGFwcHJveCA3NC4zMw0KXF0NCg0KLS0tDQoNCiMjIyMgS2VzaW1wdWxhbjoNCk1vZHVzIHVudHVrIGRhdGEga2Vsb21wb2sgZGVuZ2FuIG91dGxpZXIgYWRhbGFoICoqNzQuMzMqKi4gS2ViZXJhZGFhbiBvdXRsaWVyIHBhZGEga2VsYXMgdGVydGluZ2dpIChcKDkxLTEwMFwpKSAqKnRpZGFrIG1lbWVuZ2FydWhpIG5pbGFpIG1vZHVzKiosIGthcmVuYSBrZWxhcyBkZW5nYW4gZnJla3VlbnNpIHRlcnRpbmdnaSB0ZXRhcCBiZXJhZGEgcGFkYSAqKjcxLTgwKiouDQoNCiMjIyAyLiBNb2R1cyBEYXRhIEtlbG9tcG9rIFRhbnBhIE91dGxpZXINCg0KTWlzYWxrYW4gdGVyZGFwYXQgZGF0YSB0YW5wYSBvdXRsaWVyLCBzZWhpbmdnYSB0YWJlbCBkaXN0cmlidXNpIGZyZWt1ZW5zaSBtZW5qYWRpIHNlYmFnYWkgYmVyaWt1dDoNCg0KfCAqKkRhdGEgSW50ZXJ2YWwqKiB8ICoqRnJla3VlbnNpKiogJChGX2kpJCB8DQp8LS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwNCnwgKio0MS01MCoqICAgICAgICAgfCAyMCAgICAgICAgICAgICAgICAgICAgfA0KfCAqKjUxLTYwKiogICAgICAgICB8IDMwICAgICAgICAgICAgICAgICAgICB8DQp8ICoqNjEtNzAqKiAgICAgICAgIHwgNDAgICAgICAgICAgICAgICAgICAgIHwNCnwgKio3MS04MCoqICAgICAgICAgfCA1MCAgICAgICAgICAgICAgICAgICAgfA0KfCAqKjgxLTkwKiogICAgICAgICB8IDMwICAgICAgICAgICAgICAgICAgICB8DQp8ICoqOTEtMTAwKiogICAgICAgIHwgMjAgICAgICAgICAgICAgICAgICAgIHwNCg0KLS0tDQoNCiMjIyBMYW5na2FoIFBlcmhpdHVuZ2FuIE1vZHVzDQoNCiMjIyMgMS4gSWRlbnRpZmlrYXNpIEtlbGFzIE1vZHVzOg0KS2VsYXMgZGVuZ2FuIGZyZWt1ZW5zaSB0ZXJ0aW5nZ2kgYWRhbGFoICoqNzEtODAqKiBkZW5nYW4gZnJla3VlbnNpIChcKGZfMSA9IDUwXCkpLg0KDQojIyMjIDIuIEluZm9ybWFzaSB5YW5nIERpYnV0dWhrYW46DQotIFwoTCA9IDcxXCk6IHRlcGkgYmF3YWgga2VsYXMgbW9kdXMuDQotIFwoZl8xID0gNTBcKTogZnJla3VlbnNpIGtlbGFzIG1vZHVzLg0KLSBcKGZfMCA9IDQwXCk6IGZyZWt1ZW5zaSBrZWxhcyBzZWJlbHVtIGtlbGFzIG1vZHVzLg0KLSBcKGZfMiA9IDMwXCk6IGZyZWt1ZW5zaSBrZWxhcyBzZXRlbGFoIGtlbGFzIG1vZHVzLg0KLSBcKGMgPSAxMFwpOiBwYW5qYW5nIGludGVydmFsIGtlbGFzLg0KDQotLS0NCg0KIyMjIyBSdW11cyBNb2R1czoNClxbDQpcdGV4dHtNb2R1c30gPSBMICsgXGxlZnQoIFxmcmFje2ZfMSAtIGZfMH17KGZfMSAtIGZfMCkgKyAoZl8xIC0gZl8yKX0gXHJpZ2h0KSBcdGltZXMgYw0KXF0NCg0KLS0tDQoNCiMjIyMgU3Vic3RpdHVzaSBOaWxhaToNClxbDQpcdGV4dHtNb2R1c30gPSA3MSArIFxsZWZ0KCBcZnJhY3s1MCAtIDQwfXsoNTAgLSA0MCkgKyAoNTAgLSAzMCl9IFxyaWdodCkgXHRpbWVzIDEwDQpcXQ0KXFsNClx0ZXh0e01vZHVzfSA9IDcxICsgXGxlZnQoIFxmcmFjezEwfXsxMCArIDIwfSBccmlnaHQpIFx0aW1lcyAxMA0KXF0NClxbDQpcdGV4dHtNb2R1c30gPSA3MSArIFxsZWZ0KCBcZnJhY3sxMH17MzB9IFxyaWdodCkgXHRpbWVzIDEwDQpcXQ0KXFsNClx0ZXh0e01vZHVzfSA9IDcxICsgKDAuMzMzIFx0aW1lcyAxMCkNClxdDQpcWw0KXHRleHR7TW9kdXN9ID0gNzEgKyAzLjMzDQpcXQ0KXFsNClx0ZXh0e01vZHVzfSBcYXBwcm94IDc0LjMzDQpcXQ0KDQotLS0NCg0KIyMjIyBLZXNpbXB1bGFuOg0KTW9kdXMgdW50dWsgZGF0YSBrZWxvbXBvayB0YW5wYSBvdXRsaWVyIGFkYWxhaCAqKjc0LjMzKiosIHlhbmcgbWVudW5qdWtrYW4gYmFod2EgbmlsYWkgeWFuZyBwYWxpbmcgc2VyaW5nIG11bmN1bCBkYWxhbSBkaXN0cmlidXNpIGRhdGEgdGVya29uc2VudHJhc2kgZGkgc2VraXRhciBrZWxhcyBpbnRlcnZhbCAqKjcxLTgwKiouDQoNCiMjIyBLZXNpbXB1bGFuIEFraGlyDQoNCi0gKipNb2R1cyBkZW5nYW4gb3V0bGllcioqOiA3NC4zMw0KLSAqKk1vZHVzIHRhbnBhIG91dGxpZXIqKjogNzQuMzMNCg0KUGFkYSBrZWR1YSBrYXN1cywgKiptb2R1cyB0aWRhayBiZXJ1YmFoKiosIGthcmVuYSBrZWxhcyBkZW5nYW4gZnJla3VlbnNpIHRlcnRpbmdnaSB0ZXRhcCBiZXJhZGEgcGFkYSBpbnRlcnZhbCAqKjcxLTgwKiosIG9sZWggc2ViYWIgaXR1IHBhZGEgbW9kdXMgdW50dWsgZGF0YSBrZWxvbXBvayBrZWJlcmFkYWFuICoqb3VsaWVyKiogdGlkYWsgbWVtcGVuZ2FydWhpIG1vZHVzLg0KDQojIyMgVmlzdWFsaXNhc2kgQm94cGxvdCBNb2R1cyBkZW5nYW4gT3V0bGllciBkYW4gVGFucGEgT3V0bGllcg0KDQpgYGB7ciwgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCiMgTWVtdWF0IHB1c3Rha2EgeWFuZyBkaXBlcmx1a2FuDQpsaWJyYXJ5KHBsb3RseSkNCg0KIyBEYXRhIHVudHVrIGthc3VzIGRlbmdhbiBvdXRsaWVyDQpkYXRhX291dGxpZXIgPC0gZGF0YS5mcmFtZSgNCiAgSW50ZXJ2YWwgPSBjKDQ1LjUsIDU1LjUsIDY1LjUsIDc1LjUsIDg1LjUsIDk1LjUpLCAgIyBOaWxhaSB0ZW5nYWggaW50ZXJ2YWwNCiAgRnJla3VlbnNpID0gYygyMCwgMzAsIDQwLCA1MCwgMzAsIDIwKSAgIyBGcmVrdWVuc2kgZGVuZ2FuIG91dGxpZXINCikNCg0KIyBEYXRhIHVudHVrIGthc3VzIHRhbnBhIG91dGxpZXINCmRhdGFfbm9fb3V0bGllciA8LSBkYXRhLmZyYW1lKA0KICBJbnRlcnZhbCA9IGMoNDUuNSwgNTUuNSwgNjUuNSwgNzUuNSwgODUuNSwgOTUuNSksICAjIE5pbGFpIHRlbmdhaCBpbnRlcnZhbA0KICBGcmVrdWVuc2kgPSBjKDIwLCAzMCwgNDAsIDUwLCAzMCwgMjApICAjIEZyZWt1ZW5zaSB0YW5wYSBvdXRsaWVyDQopDQoNCiMgUGVyaGl0dW5nYW4gTW9kdXMgdW50dWsgRGF0YSBkZW5nYW4gT3V0bGllcg0KTF9vdXRsaWVyIDwtIDcxICAgICMgVGVwaSBiYXdhaCBrZWxhcyBtb2R1cw0KZjFfb3V0bGllciA8LSA1MCAgICMgRnJla3VlbnNpIGtlbGFzIG1vZHVzDQpmMF9vdXRsaWVyIDwtIDQwICAgIyBGcmVrdWVuc2kga2VsYXMgc2ViZWx1bSBrZWxhcyBtb2R1cw0KZjJfb3V0bGllciA8LSAzMCAgICMgRnJla3VlbnNpIGtlbGFzIHNldGVsYWgga2VsYXMgbW9kdXMNCmNfb3V0bGllciA8LSAxMCAgICAjIFBhbmphbmcgaW50ZXJ2YWwga2VsYXMNCg0KIyBSdW11cyBNb2R1cyB1bnR1ayBkYXRhIGRlbmdhbiBvdXRsaWVyDQptb2Rfb3V0bGllciA8LSBMX291dGxpZXIgKyAoKGYxX291dGxpZXIgLSBmMF9vdXRsaWVyKSAvIA0KICAgICAgICAgICAgICAgKGYxX291dGxpZXIgLSBmMF9vdXRsaWVyICsgZjFfb3V0bGllciAtIGYyX291dGxpZXIpKSAqIGNfb3V0bGllcg0KDQojIFBlcmhpdHVuZ2FuIE1vZHVzIHVudHVrIERhdGEgdGFucGEgT3V0bGllcg0KTF9ub19vdXRsaWVyIDwtIDcxICAgIyBUZXBpIGJhd2FoIGtlbGFzIG1vZHVzDQpmMV9ub19vdXRsaWVyIDwtIDUwICAjIEZyZWt1ZW5zaSBrZWxhcyBtb2R1cw0KZjBfbm9fb3V0bGllciA8LSA0MCAgIyBGcmVrdWVuc2kga2VsYXMgc2ViZWx1bSBrZWxhcyBtb2R1cw0KZjJfbm9fb3V0bGllciA8LSAzMCAgIyBGcmVrdWVuc2kga2VsYXMgc2V0ZWxhaCBrZWxhcyBtb2R1cw0KY19ub19vdXRsaWVyIDwtIDEwICAgIyBQYW5qYW5nIGludGVydmFsIGtlbGFzDQoNCiMgUnVtdXMgTW9kdXMgdW50dWsgZGF0YSB0YW5wYSBvdXRsaWVyDQptb2Rfbm9fb3V0bGllciA8LSBMX25vX291dGxpZXIgKyAoKGYxX25vX291dGxpZXIgLSBmMF9ub19vdXRsaWVyKSAvIA0KICAgICAgICAgICAgICAgICAoZjFfbm9fb3V0bGllciAtIGYwX291dGxpZXIgKyBmMV9ub19vdXRsaWVyIC0gZjJfbm9fb3V0bGllcikpICogY19ub19vdXRsaWVyDQoNCiMgRWtzcGFuc2kgZGF0YSB1bnR1ayB2aXN1YWxpc2FzaQ0Kc2V0LnNlZWQoMTIzKQ0KZXhwYW5kZWRfZGF0YV9vdXRsaWVyIDwtIHJlcChkYXRhX291dGxpZXIkSW50ZXJ2YWwsIHRpbWVzID0gZGF0YV9vdXRsaWVyJEZyZWt1ZW5zaSkNCmV4cGFuZGVkX2RhdGFfbm9fb3V0bGllciA8LSByZXAoZGF0YV9ub19vdXRsaWVyJEludGVydmFsLCB0aW1lcyA9IGRhdGFfbm9fb3V0bGllciRGcmVrdWVuc2kpDQoNCiMgR2FidW5na2FuIGRhdGEgdW50dWsgYm94cGxvdA0KYm94cGxvdF9kYXRhIDwtIGRhdGEuZnJhbWUoDQogIE5pbGFpID0gYyhleHBhbmRlZF9kYXRhX291dGxpZXIsIGV4cGFuZGVkX2RhdGFfbm9fb3V0bGllciksDQogIEtlbG9tcG9rID0gYygNCiAgICByZXAoIkRlbmdhbiBPdXRsaWVyIiwgbGVuZ3RoKGV4cGFuZGVkX2RhdGFfb3V0bGllcikpLA0KICAgIHJlcCgiVGFucGEgT3V0bGllciIsIGxlbmd0aChleHBhbmRlZF9kYXRhX25vX291dGxpZXIpKQ0KICApDQopDQoNCiMgTWVtYnVhdCBCb3hwbG90IG1lbmdndW5ha2FuIFBsb3RseQ0KcGxvdCA8LSBwbG90X2x5KA0KICBkYXRhID0gYm94cGxvdF9kYXRhLA0KICB4ID0gfktlbG9tcG9rLA0KICB5ID0gfk5pbGFpLA0KICB0eXBlID0gImJveCIsDQogIGJveHBvaW50cyA9ICJvdXRsaWVycyIsDQogIGppdHRlciA9IDAuMywNCiAgcG9pbnRwb3MgPSAtMS44LA0KICBjb2xvcnMgPSBjKCJEZW5nYW4gT3V0bGllciIgPSAic2t5Ymx1ZSIsICJUYW5wYSBPdXRsaWVyIiA9ICJsaWdodGdyZWVuIikNCikgJT4lDQogICMgTWVuYW1iYWhrYW4gYW5vdGFzaSBNb2R1cyB1bnR1ayBkYXRhIGRlbmdhbiBvdXRsaWVyDQogIGFkZF9hbm5vdGF0aW9ucygNCiAgICB4ID0gIkRlbmdhbiBPdXRsaWVyIiwNCiAgICB5ID0gbW9kX291dGxpZXIsDQogICAgdGV4dCA9IHBhc3RlKCJNb2R1czoiLCByb3VuZChtb2Rfb3V0bGllciwgMSkpLA0KICAgIHNob3dhcnJvdyA9IFRSVUUsDQogICAgYXJyb3doZWFkID0gMiwNCiAgICBheCA9IDAsDQogICAgYXkgPSAtNDAsDQogICAgZm9udCA9IGxpc3QoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTIpDQogICkgJT4lDQogICMgTWVuYW1iYWhrYW4gYW5vdGFzaSBNb2R1cyB1bnR1ayBkYXRhIHRhbnBhIG91dGxpZXINCiAgYWRkX2Fubm90YXRpb25zKA0KICAgIHggPSAiVGFucGEgT3V0bGllciIsDQogICAgeSA9IG1vZF9ub19vdXRsaWVyLA0KICAgIHRleHQgPSBwYXN0ZSgiTW9kdXM6Iiwgcm91bmQobW9kX25vX291dGxpZXIsIDEpKSwNCiAgICBzaG93YXJyb3cgPSBUUlVFLA0KICAgIGFycm93aGVhZCA9IDIsDQogICAgYXggPSAwLA0KICAgIGF5ID0gLTQwLA0KICAgIGZvbnQgPSBsaXN0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDEyKQ0KICApICU+JQ0KICAjIE1lbmFtYmFoa2FuIGxheW91dA0KICBsYXlvdXQoDQogICAgdGl0bGUgPSAiUGVuZ2FydWggT3V0bGllcnMgdGVyaGFkYXAgTW9kdXMiLA0KICAgIHhheGlzID0gbGlzdCh0aXRsZSA9ICJLZWxvbXBvayBEYXRhIiksDQogICAgeWF4aXMgPSBsaXN0KHRpdGxlID0gIk5pbGFpIFRlbmdhaCBJbnRlcnZhbCIsIHJhbmdlID0gYyg0MCwgMTAwKSksDQogICAgc2hvd2xlZ2VuZCA9IEZBTFNFDQogICkNCg0KIyBNZW5hbXBpbGthbiBwbG90DQpwbG90DQoNCmBgYA0KDQojIFByYWt0aWt1bSAyDQogDQojIyBCaXNuaXMgDQoqKlN0dWRpIEthc3VzOiBBbmFsaXNpcyBQZW5qdWFsYW4gSGFyaWFuIGRpIFRva28gS2Vsb250b25nKioNCg0KRGF0YSBwZW5qdWFsYW4gaGFyaWFuIChkYWxhbSByaWJ1YW4gcnVwaWFoKSA6DQoNCnwgUGVuanVhbGFuIEhhcmlhbiAoSW50ZXJ2YWwpIHwJRnJla3VlbnNpIChIYXJpKSB8DQp8LS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLXwNCnwgIDQxLDAwMCAtIDUwLDAwMAkgfCAgICAgMjAgICAgICB8DQp8ICA1MSwwMDAgLSA2MCwwMDAJIHwgICAgIDMwICAgICAgfA0KfCAgNjEsMDAwIC0gNzAsMDAwCSB8ICAgICA0MCAgICAgIHwNCnwgIDcxLDAwMCAtIDgwLDAwMCAgIHwgIAkgNTAgICAgICB8DQp8ICA4MSwwMDAgLSA5MCwwMDAgICB8CSAgIDMwICAgICAgfA0KfCAgOTEsMDAwIC0gMTAwLDAwMAkgfCAgICAgMjAgICAgICB8DQoNCg0KIyMjIDEuIE1lYW46DQoNCg0KKipQZXJoaXR1bmdhbiBUaXRpayBUZW5nYWggVGlhcCBJbnRlcnZhbCoqDQpCZXJpa3V0IGFkYWxhaCBwZXJoaXR1bmdhbiB0aXRpayB0ZW5nYWggdW50dWsgc2V0aWFwIGludGVydmFsOg0KDQotICoqSW50ZXJ2YWwgNDEsMDAwIC0gNTAsMDAwKio6ICANCiAgXFsNCiAgeF9pID0gXGZyYWN7NDEsMDAwICsgNTAsMDAwfXsyfSA9IDQ1LDUwMA0KICBcXQ0KDQotICoqSW50ZXJ2YWwgNTEsMDAwIC0gNjAsMDAwKio6ICANCiAgXFsNCiAgeF9pID0gXGZyYWN7NTEsMDAwICsgNjAsMDAwfXsyfSA9IDU1LDUwMA0KICBcXQ0KDQotICoqSW50ZXJ2YWwgNjEsMDAwIC0gNzAsMDAwKio6ICANCiAgXFsNCiAgeF9pID0gXGZyYWN7NjEsMDAwICsgNzAsMDAwfXsyfSA9IDY1LDUwMA0KICBcXQ0KDQotICoqSW50ZXJ2YWwgNzEsMDAwIC0gODAsMDAwKio6ICANCiAgXFsNCiAgeF9pID0gXGZyYWN7NzEsMDAwICsgODAsMDAwfXsyfSA9IDc1LDUwMA0KICBcXQ0KDQotICoqSW50ZXJ2YWwgODEsMDAwIC0gOTAsMDAwKio6ICANCiAgXFsNCiAgeF9pID0gXGZyYWN7ODEsMDAwICsgOTAsMDAwfXsyfSA9IDg1LDUwMA0KICBcXQ0KDQotICoqSW50ZXJ2YWwgOTEsMDAwIC0gMTAwLDAwMCoqOiAgDQogIFxbDQogIHhfaSA9IFxmcmFjezkxLDAwMCArIDEwMCwwMDB9ezJ9ID0gOTUsNTAwDQogIFxdDQogIA0KKipMYW5na2FoLWxhbmdrYWg6KioNCg0KSGl0dW5nIFwoIGZfaSBcY2RvdCB4X2kgXCkgdW50dWsgc2V0aWFwIGludGVydmFsOg0KDQpcWw0KXGJlZ2lue2FsaWduZWR9DQoyMCBcY2RvdCA0NSw1MDAgJj0gOTEwLDAwMCwgXFwNCjMwIFxjZG90IDU1LDUwMCAmPSAxLDY2NSwwMDAsIFxcDQo0MCBcY2RvdCA2NSw1MDAgJj0gMiw2MjAsMDAwIFxcDQo1MCBcY2RvdCA3NSw1MDAgJj0gMyw3NzUsMDAwLCBcXA0KMzAgXGNkb3QgODUsNTAwICY9IDIsNTY1LDAwMCwgXFwNCjIwIFxjZG90IDk1LDUwMCAmPSAxLDkxMCwwMDAuDQpcZW5ke2FsaWduZWR9DQpcXQ0KDQotIEhpdHVuZyB0b3RhbCBcKCBcc3VtIChmX2kgXGNkb3QgeF9pKSBcKToNClxbDQpcc3VtIChmX2kgXGNkb3QgeF9pKSA9IDkxMCwwMDAgKyAxLDY2NSwwMDAgKyAyLDYyMCwwMDAgKyAzLDc3NSwwMDAgKyAyLDU2NSwwMDAgKyAxLDkxMCwwMDAgDQpcXQ0KXFsNClxzdW0gKGZfaSBcY2RvdCB4X2kpID0gMTMsNDQ1LDAwMA0KXF0NCg0KLSBIaXR1bmcgdG90YWwgZnJla3VlbnNpIFwoIFxzdW0gZl9pIFwpOg0KXFsNClxzdW0gZl9pID0gMjAgKyAzMCArIDQwICsgNTAgKyAzMCArIDIwID0gMTkwDQpcXQ0KDQoqKkhpdHVuZyBNZWFuOioqDQpcWw0KXGJhcntYfSA9IFxmcmFje1xzdW0gKGZfaSBcY2RvdCB4X2kpfXtcc3VtIGZfaX0gPSBcZnJhY3sxMyw0NDUsMDAwfXsxOTB9IFxhcHByb3ggNzAsNzYzLi0NClxdDQoNCioqUmF0YS1yYXRhIHBlbmp1YWxhbm55YToqKg0KJCQgUnAgNzAsNzYzLi0kJA0KDQojIyMgVmlzdWFsaXNhc2kgTWVhbiBtZW5nZ3VuYWthbiBEZW5zaXR5IFBsb3QNCg0KYGBge3IgZGVuc2l0eS1wbG90bHktbWVhbjEsIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQojIE1lbXVhdCBsaWJyYXJ5DQpsaWJyYXJ5KHBsb3RseSkNCg0KIyBEYXRhIGludGVydmFsIGRhbiBmcmVrdWVuc2kNCm1pZHBvaW50cyA8LSBjKDQ1NTAwLCA1NTUwMCwgNjU1MDAsIDc1NTAwLCA4NTUwMCwgOTU1MDApDQpmcmVxdWVuY2llcyA8LSBjKDIwLCAzMCwgNDAsIDUwLCAzMCwgMjApDQoNCiMgRWtzcGFuc2kgZGF0YSBiZXJkYXNhcmthbiBmcmVrdWVuc2kNCmV4cGFuZGVkX2RhdGEgPC0gcmVwKG1pZHBvaW50cywgZnJlcXVlbmNpZXMpDQoNCiMgTWVuZ2hpdHVuZyByYXRhLXJhdGENCm1lYW5fdmFsdWUgPC0gc3VtKG1pZHBvaW50cyAqIGZyZXF1ZW5jaWVzKSAvIHN1bShmcmVxdWVuY2llcykNCg0KIyBEZW5zaXR5IHBsb3QNCmRlbnNpdHlfZGF0YSA8LSBkZW5zaXR5KGV4cGFuZGVkX2RhdGEpDQoNCiMgTWVtYnVhdCBwbG90IG1lbmdndW5ha2FuIFBsb3RseQ0KcGxvdCA8LSBwbG90X2x5KCkgJT4lDQogICMgTWVuYW1iYWhrYW4gZGVuc2l0eSBwbG90DQogIGFkZF90cmFjZSgNCiAgICB4ID0gfmRlbnNpdHlfZGF0YSR4LA0KICAgIHkgPSB+ZGVuc2l0eV9kYXRhJHksDQogICAgdHlwZSA9ICdzY2F0dGVyJywNCiAgICBtb2RlID0gJ2xpbmVzJywNCiAgICBuYW1lID0gIkRlbnNpdHkgUGxvdCIsDQogICAgbGluZSA9IGxpc3QoY29sb3IgPSAncmdiYSgzOCwgMTY2LCA5MSwgMC44KScsIHdpZHRoID0gMikNCiAgKSAlPiUNCiAgIyBNZW5hbWJhaGthbiBnYXJpcyByYXRhLXJhdGENCiAgYWRkX3RyYWNlKA0KICAgIHggPSBjKG1lYW5fdmFsdWUsIG1lYW5fdmFsdWUpLA0KICAgIHkgPSBjKDAsIG1heChkZW5zaXR5X2RhdGEkeSkpLA0KICAgIHR5cGUgPSAic2NhdHRlciIsDQogICAgbW9kZSA9ICJsaW5lcyIsDQogICAgbmFtZSA9ICJNZWFuIiwNCiAgICBsaW5lID0gbGlzdChjb2xvciA9ICdyZ2JhKDIyMiwgNDUsIDM4LCAwLjgpJywgZGFzaCA9ICdkYXNoJykNCiAgKSAlPiUNCiAgIyBNZW5hbWJhaGthbiBhbm90YXNpIHVudHVrIHJhdGEtcmF0YQ0KICBsYXlvdXQoDQogICAgdGl0bGUgPSAiRGVuc2l0eSBQbG90IGRlbmdhbiBNZWFuIiwNCiAgICB4YXhpcyA9IGxpc3QodGl0bGUgPSAiTmlsYWkgKFJwKSIpLA0KICAgIHlheGlzID0gbGlzdCh0aXRsZSA9ICJLZXBhZGF0YW4iKSwNCiAgICBhbm5vdGF0aW9ucyA9IGxpc3QoDQogICAgICBsaXN0KA0KICAgICAgICB4ID0gbWVhbl92YWx1ZSwNCiAgICAgICAgeSA9IG1heChkZW5zaXR5X2RhdGEkeSkgKiAwLjksDQogICAgICAgIHRleHQgPSBwYXN0ZSgiTWVhbjogUnAiLCBmb3JtYXQocm91bmQobWVhbl92YWx1ZSwgMiksIGJpZy5tYXJrID0gIiwiKSksDQogICAgICAgIHNob3dhcnJvdyA9IFRSVUUsDQogICAgICAgIGFycm93aGVhZCA9IDIsDQogICAgICAgIGF4ID0gMCwNCiAgICAgICAgYXkgPSAtMzAsDQogICAgICAgIGZvbnQgPSBsaXN0KGNvbG9yID0gJ3JnYmEoMjIyLCA0NSwgMzgsIDAuOCknLCBzaXplID0gMTIpDQogICAgICApDQogICAgKQ0KICApDQoNCiMgTWVuYW1waWxrYW4gcGxvdA0KcGxvdA0KYGBgDQoNCg0KIyMjIDIuIE1lZGlhbjogDQoNCiAtIFRvdGFsIEp1bWxhaCBEYXRhOiANClxbDQpuID0gMjAgKyAzMCArIDQwICsgNTAgKyAzMCArIDIwID0gMTkwDQpcXQ0KDQotIFBvc2lzaSBNZWRpYW4NCg0KS2FyZW5hIFwobiA9IDE5MFwpLCBqdW1sYWggZGF0YSBnZW5hcCwgbWFrYToNCg0KXFsNClx0ZXh0e1Bvc2lzaSBNZWRpYW59ID0gXGZyYWN7bn17Mn0gPSA5NSBccXVhZCBcdGV4dHtkYW59IFxxdWFkIFxmcmFje259ezJ9ICsgMSA9IDk2DQpcXQ0KDQpCZXJkYXNhcmthbiBmcmVrdWVuc2kga3VtdWxhdGlmLCBkYXRhIGtlLTk1IGRhbiBrZS05NiBiZXJhZGEgZGFsYW0gaW50ZXJ2YWwgNzEtODAuDQoNCi0gUnVtdXMgTWVkaWFuDQoNClJ1bXVzIG1lZGlhbiB1bnR1ayBkYXRhIGtlbG9tcG9rIGFkYWxhaDoNCg0KXFsNClx0ZXh0e01lZGlhbn0gPSBMICsgXGxlZnQoIFxmcmFje1xmcmFje259ezJ9IC0gRn17Zl9tfSBccmlnaHQpIFxjZG90IGMNClxdDQoNCi0gU3Vic3RpdHVzaSBOaWxhaQ0KDQpcWw0KTCA9IDcwLDUwMCwgXHF1YWQgRiA9IDkwLCBccXVhZCBmX20gPSA1MCwgXHF1YWQgYyA9IDEwLDAwMA0KXF0NCg0KLSBQZXJoaXR1bmdhbiBNZWRpYW4NClxbDQpcdGV4dHtNZWRpYW59ID0gNzAsNTAwICsgXGxlZnQoIFxmcmFjezk1IC0gOTB9ezUwfSBccmlnaHQpIFxjZG90IDEwLDAwMA0KXF0NClxbDQpcdGV4dHtNZWRpYW59ID0gNzAsNTAwICsgXGxlZnQoIFxmcmFjezV9ezUwfSBccmlnaHQpIFxjZG90IDEwLDAwMA0KXF0NClxbDQpcdGV4dHtNZWRpYW59ID0gNzAsNTAwICsgMSwwMDAgPSA3MSw1MDANClxdDQoNCioqTmlsYWkgVGVuZ2FoIHBlbmp1YWxhbm55YToqKg0KJCQgUnAgNzEsNTAwJCQNCg0KIyMjIFZpc3VhbGlzYXNpIE1lZGlhbiBNZW5nZ3VuYWthbiBEZW5zaXR5IFBsb3QNCg0KYGBge3IgZGVuc2l0eS1wbG90bHktbWVkaWFuMSwgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCiMgTWVtdWF0IGxpYnJhcnkNCmxpYnJhcnkocGxvdGx5KQ0KDQojIERhdGENCm1pZHBvaW50cyA8LSBjKDQ1NTAwLCA1NTUwMCwgNjU1MDAsIDc1NTAwLCA4NTUwMCwgOTU1MDApDQpmcmVxdWVuY2llcyA8LSBjKDIwLCAzMCwgNDAsIDUwLCAzMCwgMjApDQoNCiMgRGF0YSBleHBhbnNpb24gKG1lbmR1cGxpa2FzaSBuaWxhaSBtaWRwb2ludCBzZXN1YWkgZnJla3VlbnNpbnlhKQ0KZXhwYW5kZWRfZGF0YSA8LSByZXAobWlkcG9pbnRzLCBmcmVxdWVuY2llcykNCg0KIyBNZWRpYW4gY2FsY3VsYXRpb24NCm4gPC0gc3VtKGZyZXF1ZW5jaWVzKSAgIyBUb3RhbCBqdW1sYWggZGF0YQ0KbWVkaWFuX3ZhbHVlIDwtIDcwNTAwICsgKCg5NSAtIDkwKSAvIDUwKSAqIDEwMDAwICAjIE1lbmdndW5ha2FuIHJ1bXVzIG1lZGlhbg0KDQojIERlbnNpdHkgcGxvdA0KZGVuc2l0eV9kYXRhIDwtIGRlbnNpdHkoZXhwYW5kZWRfZGF0YSkNCg0KIyBNZW1idWF0IHBsb3QgbWVuZ2d1bmFrYW4gUGxvdGx5DQpwbG90IDwtIHBsb3RfbHkoKSAlPiUNCiAgIyBNZW5hbWJhaGthbiBkZW5zaXR5IHBsb3QNCiAgYWRkX3RyYWNlKA0KICAgIHggPSB+ZGVuc2l0eV9kYXRhJHgsDQogICAgeSA9IH5kZW5zaXR5X2RhdGEkeSwNCiAgICB0eXBlID0gJ3NjYXR0ZXInLA0KICAgIG1vZGUgPSAnbGluZXMnLA0KICAgIG5hbWUgPSAiRGVuc2l0eSBQbG90IiwNCiAgICBsaW5lID0gbGlzdChjb2xvciA9ICdyZ2JhKDM4LCAxNjYsIDkxLCAwLjgpJywgd2lkdGggPSAyKQ0KICApICU+JQ0KICAjIE1lbmFtYmFoa2FuIGdhcmlzIG1lZGlhbg0KICBhZGRfdHJhY2UoDQogICAgeCA9IGMobWVkaWFuX3ZhbHVlLCBtZWRpYW5fdmFsdWUpLA0KICAgIHkgPSBjKDAsIG1heChkZW5zaXR5X2RhdGEkeSkpLA0KICAgIHR5cGUgPSAic2NhdHRlciIsDQogICAgbW9kZSA9ICJsaW5lcyIsDQogICAgbmFtZSA9ICJNZWRpYW4iLA0KICAgIGxpbmUgPSBsaXN0KGNvbG9yID0gJ3JnYmEoMTQ4LCAwLCAyMTEsIDAuOCknLCBkYXNoID0gJ2Rhc2gnKQ0KICApICU+JQ0KICAjIE1lbmFtYmFoa2FuIGFub3Rhc2kgdW50dWsgbWVkaWFuDQogIGxheW91dCgNCiAgICB0aXRsZSA9ICJEZW5zaXR5IFBsb3QgZGVuZ2FuIE1lZGlhbiIsDQogICAgeGF4aXMgPSBsaXN0KHRpdGxlID0gIk5pbGFpIChScCkiKSwNCiAgICB5YXhpcyA9IGxpc3QodGl0bGUgPSAiS2VwYWRhdGFuIiksDQogICAgYW5ub3RhdGlvbnMgPSBsaXN0KA0KICAgICAgbGlzdCgNCiAgICAgICAgeCA9IG1lZGlhbl92YWx1ZSwNCiAgICAgICAgeSA9IG1heChkZW5zaXR5X2RhdGEkeSkgKiAwLjksDQogICAgICAgIHRleHQgPSBwYXN0ZSgiTWVkaWFuOiBScCIsIGZvcm1hdChyb3VuZChtZWRpYW5fdmFsdWUsIDIpLCBiaWcubWFyayA9ICIsIikpLA0KICAgICAgICBzaG93YXJyb3cgPSBUUlVFLA0KICAgICAgICBhcnJvd2hlYWQgPSAyLA0KICAgICAgICBheCA9IDAsDQogICAgICAgIGF5ID0gLTMwLA0KICAgICAgICBmb250ID0gbGlzdChjb2xvciA9ICdyZ2JhKDE0OCwgMCwgMjExLCAwLjgpJywgc2l6ZSA9IDEyKQ0KICAgICAgKQ0KICAgICkNCiAgKQ0KDQojIE1lbmFtcGlsa2FuIHBsb3QNCnBsb3QNCmBgYA0KDQojIyMgMy4gTW9kdXM6IA0KDQoqKklkZW50aWZpa2FzaSBLZWxhcyBNb2R1czoqKg0KS2VsYXMgZGVuZ2FuIGZyZWt1ZW5zaSB0ZXJ0aW5nZ2kgYmVyYWRhIGRpIGludGVydmFsICoqNzEsMDAwLTgwLDAwMCoqIChcKGZfMSA9IDUwXCkpLg0KDQotIEluZm9ybWFzaToNCi0gXChMID0gNzEsMDAwXCk6IHRlcGkgYmF3YWgga2VsYXMgbW9kdXMuDQotIFwoZl8xID0gNTBcKTogZnJla3VlbnNpIGtlbGFzIG1vZHVzLg0KLSBcKGZfMCA9IDQwXCk6IGZyZWt1ZW5zaSBrZWxhcyBzZWJlbHVtIGtlbGFzIG1vZHVzLg0KLSBcKGZfMiA9IDMwXCk6IGZyZWt1ZW5zaSBrZWxhcyBzZXRlbGFoIGtlbGFzIG1vZHVzLg0KLSBcKGMgPSAxMCwwMDBcKTogcGFuamFuZyBpbnRlcnZhbCBrZWxhcy4NCg0KLS0tDQoNCi0gUnVtdXMgTW9kdXM6DQpcWw0KXHRleHR7TW9kdXN9ID0gTCArIFxsZWZ0KCBcZnJhY3tmXzEgLSBmXzB9eyhmXzEgLSBmXzApICsgKGZfMSAtIGZfMil9IFxyaWdodCkgXHRpbWVzIGMNClxdDQoNCi0tLQ0KDQotIFN1YnN0aXR1c2kgTmlsYWk6DQpcWw0KXHRleHR7TW9kdXN9ID0gNzEsMDAwICsgXGxlZnQoIFxmcmFjezUwIC0gNDB9eyg1MCAtIDQwKSArICg1MCAtIDMwKX0gXHJpZ2h0KSBcdGltZXMgMTAsMDAwDQpcXQ0KXFsNClx0ZXh0e01vZHVzfSA9IDcxLDAwMCArIFxsZWZ0KCBcZnJhY3sxMH17MTAgKyAyMH0gXHJpZ2h0KSBcdGltZXMgMTAsMDAwDQpcXQ0KXFsNClx0ZXh0e01vZHVzfSA9IDcxLDAwMCArIFxsZWZ0KCBcZnJhY3sxMH17MzB9IFxyaWdodCkgXHRpbWVzIDEwLDAwMA0KXF0NClxbDQpcdGV4dHtNb2R1c30gPSA3MSwwMDAgKyAoMC4zMzMgXHRpbWVzIDEwLDAwMCkNClxdDQpcWw0KXHRleHR7TW9kdXN9ID0gNzEsMDAwICsgMywzMzANClxdDQpcWw0KXHRleHR7TW9kdXN9IFxhcHByb3ggNzQsMzMwDQpcXQ0KDQoqKk5pbGFpIFBlbmp1YWxhbiBZYW5nIFBhbGluZyBTZXJpbmcgTXVuY3VsIDoqKg0KJCQgUnAgNzQsMzMwJCQNCg0KIyMjIFZpc3VhbGlzYXNpIE1vZHVzIE1lbmdndW5ha2FuIERlbnNpdHkgUGxvdA0KDQpgYGB7ciBkZW5zaXR5LXBsb3RseS1tb2R1czEsIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQojIE1lbXVhdCBsaWJyYXJ5DQpsaWJyYXJ5KHBsb3RseSkNCg0KIyBEYXRhIGludGVydmFsIGRhbiBmcmVrdWVuc2kNCm1pZHBvaW50cyA8LSBjKDQ1NTAwLCA1NTUwMCwgNjU1MDAsIDc1NTAwLCA4NTUwMCwgOTU1MDApDQpmcmVxdWVuY2llcyA8LSBjKDIwLCAzMCwgNDAsIDUwLCAzMCwgMjApDQoNCiMgRWtzcGFuc2kgZGF0YSBiZXJkYXNhcmthbiBmcmVrdWVuc2kNCmV4cGFuZGVkX2RhdGEgPC0gcmVwKG1pZHBvaW50cywgZnJlcXVlbmNpZXMpDQoNCiMgTWVuZ2hpdHVuZyBtb2R1cw0KTCA8LSA3MTAwMCAgICAjIFRlcGkgYmF3YWgga2VsYXMgbW9kdXMNCmYxIDwtIDUwICAgICAgICMgRnJla3VlbnNpIGtlbGFzIG1vZHVzDQpmMCA8LSA0MCAgICAgICAjIEZyZWt1ZW5zaSBrZWxhcyBzZWJlbHVtIGtlbGFzIG1vZHVzDQpmMiA8LSAzMCAgICAgICAjIEZyZWt1ZW5zaSBrZWxhcyBzZXRlbGFoIGtlbGFzIG1vZHVzDQpjIDwtIDEwMDAwICAgICAjIFBhbmphbmcgaW50ZXJ2YWwga2VsYXMNCg0KbW9kdXNfdmFsdWUgPC0gTCArICgoZjEgLSBmMCkgLyAoKGYxIC0gZjApICsgKGYxIC0gZjIpKSkgKiBjDQoNCiMgRGVuc2l0eSBwbG90DQpkZW5zaXR5X2RhdGEgPC0gZGVuc2l0eShleHBhbmRlZF9kYXRhKQ0KDQojIE1lbWJ1YXQgcGxvdCBtZW5nZ3VuYWthbiBQbG90bHkNCnBsb3QgPC0gcGxvdF9seSgpICU+JQ0KICAjIE1lbmFtYmFoa2FuIGRlbnNpdHkgcGxvdA0KICBhZGRfdHJhY2UoDQogICAgeCA9IH5kZW5zaXR5X2RhdGEkeCwNCiAgICB5ID0gfmRlbnNpdHlfZGF0YSR5LA0KICAgIHR5cGUgPSAnc2NhdHRlcicsDQogICAgbW9kZSA9ICdsaW5lcycsDQogICAgbmFtZSA9ICJEZW5zaXR5IFBsb3QiLA0KICAgIGxpbmUgPSBsaXN0KGNvbG9yID0gJ3JnYmEoMzgsIDE2NiwgOTEsIDAuOCknLCB3aWR0aCA9IDIpDQogICkgJT4lDQogICMgTWVuYW1iYWhrYW4gZ2FyaXMgbW9kdXMNCiAgYWRkX3RyYWNlKA0KICAgIHggPSBjKG1vZHVzX3ZhbHVlLCBtb2R1c192YWx1ZSksDQogICAgeSA9IGMoMCwgbWF4KGRlbnNpdHlfZGF0YSR5KSksDQogICAgdHlwZSA9ICJzY2F0dGVyIiwNCiAgICBtb2RlID0gImxpbmVzIiwNCiAgICBuYW1lID0gIk1vZHVzIiwNCiAgICBsaW5lID0gbGlzdChjb2xvciA9ICdyZ2JhKDI1NSwgMTI3LCAxNCwgMC44KScsIGRhc2ggPSAnZGFzaCcpDQogICkgJT4lDQogICMgTWVuYW1iYWhrYW4gYW5vdGFzaSB1bnR1ayBtb2R1cw0KICBsYXlvdXQoDQogICAgdGl0bGUgPSAiRGVuc2l0eSBQbG90IGRlbmdhbiBNb2R1cyIsDQogICAgeGF4aXMgPSBsaXN0KHRpdGxlID0gIk5pbGFpIChScCkiKSwNCiAgICB5YXhpcyA9IGxpc3QodGl0bGUgPSAiS2VwYWRhdGFuIiksDQogICAgYW5ub3RhdGlvbnMgPSBsaXN0KA0KICAgICAgbGlzdCgNCiAgICAgICAgeCA9IG1vZHVzX3ZhbHVlLA0KICAgICAgICB5ID0gbWF4KGRlbnNpdHlfZGF0YSR5KSAqIDAuOSwNCiAgICAgICAgdGV4dCA9IHBhc3RlKCJNb2R1czogUnAiLCBmb3JtYXQocm91bmQobW9kdXNfdmFsdWUsIDIpLCBiaWcubWFyayA9ICIsIikpLA0KICAgICAgICBzaG93YXJyb3cgPSBUUlVFLA0KICAgICAgICBhcnJvd2hlYWQgPSAyLA0KICAgICAgICBheCA9IDAsDQogICAgICAgIGF5ID0gLTMwLA0KICAgICAgICBmb250ID0gbGlzdChjb2xvciA9ICdyZ2JhKDI1NSwgMTI3LCAxNCwgMC44KScsIHNpemUgPSAxMikNCiAgICAgICkNCiAgICApDQogICkNCg0KIyBNZW5hbXBpbGthbiBwbG90DQpwbG90DQpgYGANCg0KIyMjIFZpc3VhbGlzYXNpIFBlcmJhbmRpbmdhbiBNZWFuLCBNZWRpYW4sIGRhbiBNb2R1cyBNZW5nZ3VuYWthbiBEZW5zaXR5IFBsb3QNCg0KYGBge3IsIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQojIE1lbXVhdCBsaWJyYXJ5DQpsaWJyYXJ5KHBsb3RseSkNCg0KIyBEYXRhIGludGVydmFsIGRhbiBmcmVrdWVuc2kNCm1pZHBvaW50cyA8LSBjKDQ1NTAwLCA1NTUwMCwgNjU1MDAsIDc1NTAwLCA4NTUwMCwgOTU1MDApDQpmcmVxdWVuY2llcyA8LSBjKDIwLCAzMCwgNDAsIDUwLCAzMCwgMjApDQoNCiMgRWtzcGFuc2kgZGF0YSBiZXJkYXNhcmthbiBmcmVrdWVuc2kNCmV4cGFuZGVkX2RhdGEgPC0gcmVwKG1pZHBvaW50cywgZnJlcXVlbmNpZXMpDQoNCiMgTWVuZ2hpdHVuZyBuaWxhaSBNZWFuDQptZWFuX3ZhbHVlIDwtIHN1bShtaWRwb2ludHMgKiBmcmVxdWVuY2llcykgLyBzdW0oZnJlcXVlbmNpZXMpDQoNCiMgTWVuZ2hpdHVuZyBuaWxhaSBNZWRpYW4NCm4gPC0gc3VtKGZyZXF1ZW5jaWVzKSAgIyBUb3RhbCBqdW1sYWggZGF0YQ0KTF9tZWRpYW4gPC0gNzA1MDAgICMgVGVwaSBiYXdhaCBrZWxhcyBtZWRpYW4NCkYgPC0gOTAgICMgRnJla3VlbnNpIGt1bXVsYXRpZiBzZWJlbHVtIGtlbGFzIG1lZGlhbg0KZl9tZWRpYW4gPC0gNTAgICMgRnJla3VlbnNpIGtlbGFzIG1lZGlhbg0KYyA8LSAxMDAwMCAgIyBQYW5qYW5nIGludGVydmFsIGtlbGFzDQptZWRpYW5fdmFsdWUgPC0gTF9tZWRpYW4gKyAoKG4gLyAyIC0gRikgLyBmX21lZGlhbikgKiBjDQoNCiMgTWVuZ2hpdHVuZyBuaWxhaSBNb2R1cw0KTF9tb2R1cyA8LSA3MTAwMCAgIyBUZXBpIGJhd2FoIGtlbGFzIG1vZHVzDQpmMSA8LSA1MCAgIyBGcmVrdWVuc2kga2VsYXMgbW9kdXMNCmYwIDwtIDQwICAjIEZyZWt1ZW5zaSBrZWxhcyBzZWJlbHVtIGtlbGFzIG1vZHVzDQpmMiA8LSAzMCAgIyBGcmVrdWVuc2kga2VsYXMgc2V0ZWxhaCBrZWxhcyBtb2R1cw0KbW9kdXNfdmFsdWUgPC0gTF9tb2R1cyArICgoZjEgLSBmMCkgLyAoKGYxIC0gZjApICsgKGYxIC0gZjIpKSkgKiBjDQoNCiMgRGVuc2l0eSBwbG90DQpkZW5zaXR5X2RhdGEgPC0gZGVuc2l0eShleHBhbmRlZF9kYXRhKQ0KDQojIE1lbWJ1YXQgcGxvdCBtZW5nZ3VuYWthbiBQbG90bHkNCnBsb3QgPC0gcGxvdF9seSgpICU+JQ0KICAjIE1lbmFtYmFoa2FuIGRlbnNpdHkgcGxvdA0KICBhZGRfdHJhY2UoDQogICAgeCA9IH5kZW5zaXR5X2RhdGEkeCwNCiAgICB5ID0gfmRlbnNpdHlfZGF0YSR5LA0KICAgIHR5cGUgPSAnc2NhdHRlcicsDQogICAgbW9kZSA9ICdsaW5lcycsDQogICAgbmFtZSA9ICJEZW5zaXR5IFBsb3QiLA0KICAgIGxpbmUgPSBsaXN0KGNvbG9yID0gJ3JnYmEoMzgsIDE2NiwgOTEsIDAuOCknLCB3aWR0aCA9IDIpDQogICkgJT4lDQogICMgTWVuYW1iYWhrYW4gZ2FyaXMgTWVhbg0KICBhZGRfdHJhY2UoDQogICAgeCA9IGMobWVhbl92YWx1ZSwgbWVhbl92YWx1ZSksDQogICAgeSA9IGMoMCwgbWF4KGRlbnNpdHlfZGF0YSR5KSksDQogICAgdHlwZSA9ICJzY2F0dGVyIiwNCiAgICBtb2RlID0gImxpbmVzIiwNCiAgICBuYW1lID0gIk1lYW4iLA0KICAgIGxpbmUgPSBsaXN0KGNvbG9yID0gJ3JnYmEoMjIyLCA0NSwgMzgsIDAuOCknLCBkYXNoID0gJ2Rhc2gnKQ0KICApICU+JQ0KICAjIE1lbmFtYmFoa2FuIGdhcmlzIE1lZGlhbg0KICBhZGRfdHJhY2UoDQogICAgeCA9IGMobWVkaWFuX3ZhbHVlLCBtZWRpYW5fdmFsdWUpLA0KICAgIHkgPSBjKDAsIG1heChkZW5zaXR5X2RhdGEkeSkpLA0KICAgIHR5cGUgPSAic2NhdHRlciIsDQogICAgbW9kZSA9ICJsaW5lcyIsDQogICAgbmFtZSA9ICJNZWRpYW4iLA0KICAgIGxpbmUgPSBsaXN0KGNvbG9yID0gJ3JnYmEoMTQ4LCAwLCAyMTEsIDAuOCknLCBkYXNoID0gJ2Rhc2gnKQ0KICApICU+JQ0KICAjIE1lbmFtYmFoa2FuIGdhcmlzIE1vZHVzDQogIGFkZF90cmFjZSgNCiAgICB4ID0gYyhtb2R1c192YWx1ZSwgbW9kdXNfdmFsdWUpLA0KICAgIHkgPSBjKDAsIG1heChkZW5zaXR5X2RhdGEkeSkpLA0KICAgIHR5cGUgPSAic2NhdHRlciIsDQogICAgbW9kZSA9ICJsaW5lcyIsDQogICAgbmFtZSA9ICJNb2R1cyIsDQogICAgbGluZSA9IGxpc3QoY29sb3IgPSAncmdiYSgyNTUsIDEyNywgMTQsIDAuOCknLCBkYXNoID0gJ2Rhc2gnKQ0KICApICU+JQ0KICAjIE1lbmFtYmFoa2FuIGFub3Rhc2kNCiAgbGF5b3V0KA0KICAgIHRpdGxlID0gIkRlbnNpdHkgUGxvdCBkZW5nYW4gTWVhbiwgTWVkaWFuLCBkYW4gTW9kdXMiLA0KICAgIHhheGlzID0gbGlzdCh0aXRsZSA9ICJOaWxhaSAoUnApIiksDQogICAgeWF4aXMgPSBsaXN0KHRpdGxlID0gIktlcGFkYXRhbiIpLA0KICAgIGFubm90YXRpb25zID0gbGlzdCgNCiAgICAgIGxpc3QoDQogICAgICAgIHggPSBtZWFuX3ZhbHVlLA0KICAgICAgICB5ID0gbWF4KGRlbnNpdHlfZGF0YSR5KSAqIDAuOSwNCiAgICAgICAgdGV4dCA9IHBhc3RlKCJNZWFuOiBScCIsIGZvcm1hdChyb3VuZChtZWFuX3ZhbHVlLCAyKSwgYmlnLm1hcmsgPSAiLCIpKSwNCiAgICAgICAgc2hvd2Fycm93ID0gVFJVRSwNCiAgICAgICAgYXJyb3doZWFkID0gMiwNCiAgICAgICAgYXggPSAwLA0KICAgICAgICBheSA9IC0zMCwNCiAgICAgICAgZm9udCA9IGxpc3QoY29sb3IgPSAncmdiYSgyMjIsIDQ1LCAzOCwgMC44KScsIHNpemUgPSAxMikNCiAgICAgICksDQogICAgICBsaXN0KA0KICAgICAgICB4ID0gbWVkaWFuX3ZhbHVlLA0KICAgICAgICB5ID0gbWF4KGRlbnNpdHlfZGF0YSR5KSAqIDAuOCwNCiAgICAgICAgdGV4dCA9IHBhc3RlKCJNZWRpYW46IFJwIiwgZm9ybWF0KHJvdW5kKG1lZGlhbl92YWx1ZSwgMiksIGJpZy5tYXJrID0gIiwiKSksDQogICAgICAgIHNob3dhcnJvdyA9IFRSVUUsDQogICAgICAgIGFycm93aGVhZCA9IDIsDQogICAgICAgIGF4ID0gMCwNCiAgICAgICAgYXkgPSAtMzAsDQogICAgICAgIGZvbnQgPSBsaXN0KGNvbG9yID0gJ3JnYmEoMTQ4LCAwLCAyMTEsIDAuOCknLCBzaXplID0gMTIpDQogICAgICApLA0KICAgICAgbGlzdCgNCiAgICAgICAgeCA9IG1vZHVzX3ZhbHVlLA0KICAgICAgICB5ID0gbWF4KGRlbnNpdHlfZGF0YSR5KSAqIDAuNywNCiAgICAgICAgdGV4dCA9IHBhc3RlKCJNb2R1czogUnAiLCBmb3JtYXQocm91bmQobW9kdXNfdmFsdWUsIDIpLCBiaWcubWFyayA9ICIsIikpLA0KICAgICAgICBzaG93YXJyb3cgPSBUUlVFLA0KICAgICAgICBhcnJvd2hlYWQgPSAyLA0KICAgICAgICBheCA9IDAsDQogICAgICAgIGF5ID0gLTMwLA0KICAgICAgICBmb250ID0gbGlzdChjb2xvciA9ICdyZ2JhKDI1NSwgMTI3LCAxNCwgMC44KScsIHNpemUgPSAxMikNCiAgICAgICkNCiAgICApDQogICkNCg0KIyBNZW5hbXBpbGthbiBwbG90DQpwbG90DQoNCmBgYA0KDQojIyBLZXNlaGF0YW4NCioqU3R1ZGkgS2FzdXM6IERpc3RyaWJ1c2kgQmVyYXQgQmFkYW4gQW5hayBkaSBQb3N5YW5kdSoqDQoNCkRhdGEgYmVyYXQgYmFkYW4gYW5hayAoZGFsYW0ga2cpIGRpIHN1YXR1IHdpbGF5YWg6DQoNCnwgQmVyYXQgQmFkYW4gKEludGVydmFsKSB8CUZyZWt1ZW5zaSAoQW5haykgfA0KfC0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLXwNCnwgICAxIC0gMTAJIHwgIDIwICB8DQp8ICAxMSAtIDIwCSB8ICAzMCAgfA0KfCAgMjEgLSAzMAkgfCAgMTAgIHwNCnwgIDMxIC0gNDAJIHwgIDMwICB8DQp8ICA0MSAtIDUwCSB8ICA1MCAgfA0KfCAgNTEgLSA2MAkgfCAgNDAgIHwNCg0KIyMjIDEuIE1lYW4NCioqUGVyaGl0dW5nYW4gVGl0aWsgVGVuZ2FoIFRpYXAgSW50ZXJ2YWwqKg0KDQpCZXJpa3V0IGFkYWxhaCBwZXJoaXR1bmdhbiB0aXRpayB0ZW5nYWggdW50dWsgc2V0aWFwIGludGVydmFsOg0KDQotICoqSW50ZXJ2YWwgMSAtIDEwKio6ICANCiAgXFsNCiAgeF9pID0gXGZyYWN7MSArIDEwfXsyfSA9IDUuNQ0KICBcXQ0KDQotICoqSW50ZXJ2YWwgMTEgLSAyMCoqOiAgDQogIFxbDQogIHhfaSA9IFxmcmFjezExICsgMjB9ezJ9ID0gMTUuNQ0KICBcXQ0KDQotICoqSW50ZXJ2YWwgMjEgLSAzMCoqOiAgDQogIFxbDQogIHhfaSA9IFxmcmFjezIxICsgMzB9ezJ9ID0gMjUuNQ0KICBcXQ0KDQotICoqSW50ZXJ2YWwgMzEgLSA0MCoqOiAgDQogIFxbDQogIHhfaSA9IFxmcmFjezMxICsgNDB9ezJ9ID0gMzUuNQ0KICBcXQ0KDQotICoqSW50ZXJ2YWwgNDEgLSA1MCoqOiAgDQogIFxbDQogIHhfaSA9IFxmcmFjezQxICsgNTB9ezJ9ID0gNDUuNQ0KICBcXQ0KDQotICoqSW50ZXJ2YWwgNTEgLSA2MCoqOiAgDQogIFxbDQogIHhfaSA9IFxmcmFjezUxICsgNjB9ezJ9ID0gNTUuNQ0KICBcXQ0KICANCioqTGFuZ2thaC1sYW5na2FoOioqDQoNCkhpdHVuZyBcKCBmX2kgXGNkb3QgeF9pIFwpIHVudHVrIHNldGlhcCBpbnRlcnZhbDoNCg0KXFsNClxiZWdpbnthbGlnbmVkfQ0KMjAgXGNkb3QgNS41ICY9IDExMCwgXFwNCjMwIFxjZG90IDE1LjUgJj0gNDY1LCBcXA0KMTAgXGNkb3QgMjUuNSAmPSAyNTUgXFwNCjMwIFxjZG90IDM1LjUgJj0gMSwwNjUsIFxcDQo1MCBcY2RvdCA0NS41ICY9IDIsMjc1LCBcXA0KNDAgXGNkb3QgNTUuNSAmPSAyLDIyMC4NClxlbmR7YWxpZ25lZH0NClxdDQoNCi0gSGl0dW5nIHRvdGFsIFwoIFxzdW0gKGZfaSBcY2RvdCB4X2kpIFwpOg0KXFsNClxzdW0gKGZfaSBcY2RvdCB4X2kpID0gMTEwICsgNDY1ICsgMjU1ICsgMSwwNjUgKyAyLDI3NSArIDIsMjIwID0gNiwzOTANClxdDQoNCi0gSGl0dW5nIHRvdGFsIGZyZWt1ZW5zaSBcKCBcc3VtIGZfaSBcKToNClxbDQpcc3VtIGZfaSA9IDIwICsgMzAgKyAxMCArIDMwICsgNTAgKyA0MCA9IDE4MA0KXF0NCg0KKipIaXR1bmcgTWVhbjoqKg0KXFsNClxiYXJ7WH0gPSBcZnJhY3tcc3VtIChmX2kgXGNkb3QgeF9pKX17XHN1bSBmX2l9ID0gXGZyYWN7NiwzOTB9ezE4MH0gXGFwcHJveCAzNS41DQpcXQ0KDQoqKlJhdGEtcmF0YSBCZXJhdCBCYWRhbiBBbmFrOioqDQokJCAzNS41IEtnICQkDQoNCiMjIyBWaXN1YWxpc2FzaSBNZWFuIE1lbmdndW5ha2FuIERlbnNpdHkgUGxvdA0KDQpgYGB7ciBkZW5zaXR5LXBsb3RseS1tZWFuMiwgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCiMgTWVtdWF0IGxpYnJhcnkNCmxpYnJhcnkocGxvdGx5KQ0KDQojIERhdGEgaW50ZXJ2YWwgZGFuIGZyZWt1ZW5zaQ0KbWlkcG9pbnRzIDwtIGMoNS41LCAxNS41LCAyNS41LCAzNS41LCA0NS41LCA1NS41KQ0KZnJlcXVlbmNpZXMgPC0gYygyMCwgMzAsIDEwLCAzMCwgNTAsIDQwKQ0KDQojIEVrc3BhbnNpIGRhdGEgYmVyZGFzYXJrYW4gZnJla3VlbnNpDQpleHBhbmRlZF9kYXRhIDwtIHJlcChtaWRwb2ludHMsIGZyZXF1ZW5jaWVzKQ0KDQojIE1lbmdoaXR1bmcgcmF0YS1yYXRhDQptZWFuX3ZhbHVlIDwtIG1lYW4oZXhwYW5kZWRfZGF0YSkNCg0KIyBEZW5zaXR5IHBsb3QNCmRlbnNpdHlfZGF0YSA8LSBkZW5zaXR5KGV4cGFuZGVkX2RhdGEpDQoNCiMgTWVtYnVhdCBwbG90IG1lbmdndW5ha2FuIFBsb3RseQ0KcGxvdCA8LSBwbG90X2x5KCkgJT4lDQogICMgTWVuYW1iYWhrYW4gZGVuc2l0eSBwbG90DQogIGFkZF90cmFjZSgNCiAgICB4ID0gfmRlbnNpdHlfZGF0YSR4LA0KICAgIHkgPSB+ZGVuc2l0eV9kYXRhJHksDQogICAgdHlwZSA9ICdzY2F0dGVyJywNCiAgICBtb2RlID0gJ2xpbmVzJywNCiAgICBuYW1lID0gIkRlbnNpdHkgUGxvdCIsDQogICAgbGluZSA9IGxpc3QoY29sb3IgPSAncmdiYSgzOCwgMTY2LCA5MSwgMC44KScsIHdpZHRoID0gMikNCiAgKSAlPiUNCiAgIyBNZW5hbWJhaGthbiBnYXJpcyByYXRhLXJhdGENCiAgYWRkX3RyYWNlKA0KICAgIHggPSBjKG1lYW5fdmFsdWUsIG1lYW5fdmFsdWUpLA0KICAgIHkgPSBjKDAsIG1heChkZW5zaXR5X2RhdGEkeSkpLA0KICAgIHR5cGUgPSAic2NhdHRlciIsDQogICAgbW9kZSA9ICJsaW5lcyIsDQogICAgbmFtZSA9ICJNZWFuIiwNCiAgICBsaW5lID0gbGlzdChjb2xvciA9ICdyZ2JhKDI1NSwgMTI3LCAxNCwgMC44KScsIGRhc2ggPSAnZGFzaCcpDQogICkgJT4lDQogICMgTWVuYW1iYWhrYW4gYW5vdGFzaSB1bnR1ayByYXRhLXJhdGENCiAgbGF5b3V0KA0KICAgIHRpdGxlID0gIkRlbnNpdHkgUGxvdCBCZXJhdCBCYWRhbiBkZW5nYW4gUmF0YS1SYXRhIiwNCiAgICB4YXhpcyA9IGxpc3QodGl0bGUgPSAiQmVyYXQgQmFkYW4gKEtnKSIpLA0KICAgIHlheGlzID0gbGlzdCh0aXRsZSA9ICJLZXBhZGF0YW4iKSwNCiAgICBhbm5vdGF0aW9ucyA9IGxpc3QoDQogICAgICBsaXN0KA0KICAgICAgICB4ID0gbWVhbl92YWx1ZSwNCiAgICAgICAgeSA9IG1heChkZW5zaXR5X2RhdGEkeSkgKiAwLjksDQogICAgICAgIHRleHQgPSBwYXN0ZSgiTWVhbjogIiwgcm91bmQobWVhbl92YWx1ZSwgMiksICJLZyIpLA0KICAgICAgICBzaG93YXJyb3cgPSBUUlVFLA0KICAgICAgICBhcnJvd2hlYWQgPSAyLA0KICAgICAgICBheCA9IDAsDQogICAgICAgIGF5ID0gLTMwLA0KICAgICAgICBmb250ID0gbGlzdChjb2xvciA9ICdyZ2JhKDI1NSwgMTI3LCAxNCwgMC44KScsIHNpemUgPSAxMikNCiAgICAgICkNCiAgICApDQogICkNCg0KIyBNZW5hbXBpbGthbiBwbG90DQpwbG90DQpgYGANCg0KIyMjIDIuIE1lZGlhbjogDQoNCiAtIFRvdGFsIEp1bWxhaCBEYXRhOiANClxbDQpuID0gMjAgKyAzMCArIDEwICsgMzAgKyA1MCArIDQwID0gMTgwDQpcXQ0KDQotIFBvc2lzaSBNZWRpYW4NCg0KS2FyZW5hIFwobiA9IDE4MFwpLCBqdW1sYWggZGF0YSBnZW5hcCwgbWFrYToNCg0KXFsNClx0ZXh0e1Bvc2lzaSBNZWRpYW59ID0gXGZyYWN7bn17Mn0gPSA5MCBccXVhZCBcdGV4dHtkYW59IFxxdWFkIFxmcmFje259ezJ9ICsgMSA9IDkxDQpcXQ0KDQpCZXJkYXNhcmthbiBmcmVrdWVuc2kga3VtdWxhdGlmLCBkYXRhIGtlLTkwICBrZS05MSBiZXJhZGEgZGFsYW0gaW50ZXJ2YWwgMzEtNDAuDQoNCi0gUnVtdXMgTWVkaWFuDQoNClJ1bXVzIG1lZGlhbiB1bnR1ayBkYXRhIGtlbG9tcG9rIGFkYWxhaDoNCg0KXFsNClx0ZXh0e01lZGlhbn0gPSBMICsgXGxlZnQoIFxmcmFje1xmcmFje259ezJ9IC0gRn17Zl9tfSBccmlnaHQpIFxjZG90IGMNClxdDQoNCi0gU3Vic3RpdHVzaSBOaWxhaQ0KDQpcWw0KTCA9IDMxLCBccXVhZCBGID0gNjAsIFxxdWFkIGZfbSA9IDMwLCBccXVhZCBjID0gMTANClxdDQoNCi0gUGVyaGl0dW5nYW4gTWVkaWFuDQpcWw0KXHRleHR7TWVkaWFufSA9IDMxICsgXGxlZnQoIFxmcmFjezkwIC0gNjB9ezMwfSBccmlnaHQpIFxjZG90IDEwDQpcXQ0KXFsNClx0ZXh0e01lZGlhbn0gPSAzMSArIFxsZWZ0KCBcZnJhY3szMH17MzB9IFxyaWdodCkgXGNkb3QgMTANClxdDQpcWw0KXHRleHR7TWVkaWFufSA9IDMxICsgMTAgPSA0MQ0KXF0NCg0KKipOaWxhaSBUZW5nYWggQmVyYXQgQmFkYW4gQW5hazoqKg0KJCQgNDEgS2cgJCQNCg0KIyMjIFZpc3VhbGlzYXNpIE1lZGlhbiBNZW5nZ3VuYWthbiBEZW5zaXR5IFBsb3QNCg0KYGBge3IgZGVuc2l0eS1wbG90bHktbWVkaWFuMiwgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCiMgTWVtdWF0IGxpYnJhcnkNCmxpYnJhcnkocGxvdGx5KQ0KDQojIERhdGEgaW50ZXJ2YWwgZGFuIGZyZWt1ZW5zaQ0KbWlkcG9pbnRzIDwtIGMoNS41LCAxNS41LCAyNS41LCAzNS41LCA0NS41LCA1NS41KQ0KZnJlcXVlbmNpZXMgPC0gYygyMCwgMzAsIDEwLCAzMCwgNTAsIDQwKQ0KDQojIEVrc3BhbnNpIGRhdGEgYmVyZGFzYXJrYW4gZnJla3VlbnNpDQpleHBhbmRlZF9kYXRhIDwtIHJlcChtaWRwb2ludHMsIGZyZXF1ZW5jaWVzKQ0KDQojIE1lbmdoaXR1bmcgbWVkaWFuDQptZWRpYW5fdmFsdWUgPC0gNDEgIyBCZXJkYXNhcmthbiBwZXJoaXR1bmdhbg0KDQojIERlbnNpdHkgcGxvdA0KZGVuc2l0eV9kYXRhIDwtIGRlbnNpdHkoZXhwYW5kZWRfZGF0YSkNCg0KIyBNZW1idWF0IHBsb3QgbWVuZ2d1bmFrYW4gUGxvdGx5DQpwbG90IDwtIHBsb3RfbHkoKSAlPiUNCiAgIyBNZW5hbWJhaGthbiBkZW5zaXR5IHBsb3QNCiAgYWRkX3RyYWNlKA0KICAgIHggPSB+ZGVuc2l0eV9kYXRhJHgsDQogICAgeSA9IH5kZW5zaXR5X2RhdGEkeSwNCiAgICB0eXBlID0gJ3NjYXR0ZXInLA0KICAgIG1vZGUgPSAnbGluZXMnLA0KICAgIG5hbWUgPSAiRGVuc2l0eSBQbG90IiwNCiAgICBsaW5lID0gbGlzdChjb2xvciA9ICdyZ2JhKDM4LCAxNjYsIDkxLCAwLjgpJywgd2lkdGggPSAyKQ0KICApICU+JQ0KICAjIE1lbmFtYmFoa2FuIGdhcmlzIG1lZGlhbg0KICBhZGRfdHJhY2UoDQogICAgeCA9IGMobWVkaWFuX3ZhbHVlLCBtZWRpYW5fdmFsdWUpLA0KICAgIHkgPSBjKDAsIG1heChkZW5zaXR5X2RhdGEkeSkpLA0KICAgIHR5cGUgPSAic2NhdHRlciIsDQogICAgbW9kZSA9ICJsaW5lcyIsDQogICAgbmFtZSA9ICJNZWRpYW4iLA0KICAgIGxpbmUgPSBsaXN0KGNvbG9yID0gJ3JnYmEoMjIyLCA0NSwgMzgsIDAuOCknLCBkYXNoID0gJ2Rhc2gnKQ0KICApICU+JQ0KICAjIE1lbmFtYmFoa2FuIGFub3Rhc2kgdW50dWsgbWVkaWFuDQogIGxheW91dCgNCiAgICB0aXRsZSA9ICJEZW5zaXR5IFBsb3QgQmVyYXQgQmFkYW4gZGVuZ2FuIE1lZGlhbiIsDQogICAgeGF4aXMgPSBsaXN0KHRpdGxlID0gIkJlcmF0IEJhZGFuIChLZykiKSwNCiAgICB5YXhpcyA9IGxpc3QodGl0bGUgPSAiS2VwYWRhdGFuIiksDQogICAgYW5ub3RhdGlvbnMgPSBsaXN0KA0KICAgICAgbGlzdCgNCiAgICAgICAgeCA9IG1lZGlhbl92YWx1ZSwNCiAgICAgICAgeSA9IG1heChkZW5zaXR5X2RhdGEkeSkgKiAwLjksDQogICAgICAgIHRleHQgPSBwYXN0ZSgiTWVkaWFuOiAiLCBtZWRpYW5fdmFsdWUsICJLZyIpLA0KICAgICAgICBzaG93YXJyb3cgPSBUUlVFLA0KICAgICAgICBhcnJvd2hlYWQgPSAyLA0KICAgICAgICBheCA9IDAsDQogICAgICAgIGF5ID0gLTMwLA0KICAgICAgICBmb250ID0gbGlzdChjb2xvciA9ICdyZ2JhKDIyMiwgNDUsIDM4LCAwLjgpJywgc2l6ZSA9IDEyKQ0KICAgICAgKQ0KICAgICkNCiAgKQ0KDQojIE1lbmFtcGlsa2FuIHBsb3QNCnBsb3QNCmBgYA0KDQoNCiMjIyAzLiBNb2R1czoNCg0KLSBJZGVudGlmaWthc2kgS2VsYXMgTW9kdXM6DQpLZWxhcyBkZW5nYW4gZnJla3VlbnNpIHRlcnRpbmdnaSBiZXJhZGEgZGkgaW50ZXJ2YWwgKio0MS01MCoqIChcKGZfMSA9IDUwXCkpLg0KDQotIEluZm9ybWFzaToNCi0gXChMID0gNDFcKTogdGVwaSBiYXdhaCBrZWxhcyBtb2R1cy4NCi0gXChmXzEgPSA1MFwpOiBmcmVrdWVuc2kga2VsYXMgbW9kdXMuDQotIFwoZl8wID0gMzBcKTogZnJla3VlbnNpIGtlbGFzIHNlYmVsdW0ga2VsYXMgbW9kdXMuDQotIFwoZl8yID0gNDBcKTogZnJla3VlbnNpIGtlbGFzIHNldGVsYWgga2VsYXMgbW9kdXMuDQotIFwoYyA9IDEwXCk6IHBhbmphbmcgaW50ZXJ2YWwga2VsYXMuDQoNCi0tLQ0KDQotIFJ1bXVzIE1vZHVzOg0KXFsNClx0ZXh0e01vZHVzfSA9IEwgKyBcbGVmdCggXGZyYWN7Zl8xIC0gZl8wfXsoZl8xIC0gZl8wKSArIChmXzEgLSBmXzIpfSBccmlnaHQpIFx0aW1lcyBjDQpcXQ0KDQotLS0NCg0KLSBTdWJzdGl0dXNpIE5pbGFpOg0KXFsNClx0ZXh0e01vZHVzfSA9IDQxICsgXGxlZnQoIFxmcmFjezUwIC0gMzB9eyg1MCAtIDMwKSArICg1MCAtIDQwKX0gXHJpZ2h0KSBcdGltZXMgMTANClxdDQpcWw0KXHRleHR7TW9kdXN9ID0gNDEgKyBcbGVmdCggXGZyYWN7MjB9ezIwICsgMTB9IFxyaWdodCkgXHRpbWVzIDEwDQpcXQ0KXFsNClx0ZXh0e01vZHVzfSA9IDQxICsgXGxlZnQoIFxmcmFjezIwfXszMH0gXHJpZ2h0KSBcdGltZXMgMTANClxdDQpcWw0KXHRleHR7TW9kdXN9ID0gNDEgKyAoMC42NjYgXHRpbWVzIDEwKQ0KXF0NClxbDQpcdGV4dHtNb2R1c30gPSA0MSArIDYuNjYNClxdDQpcWw0KXHRleHR7TW9kdXN9IFxhcHByb3ggNDcuNjYNClxdDQoNCioqQmVyYXQgQmFkYW4gQW5hayBZYW5nIFBhbGluZyBTZXJpbmcgTXVuY3VsIDoqKg0KJCQgNDcuNjYgS2cgJCQNCg0KIyMjIFZpc3VhbGlzYXNpIE1vZHVzIE1lbmdndW5ha2FuIERlbnNpdHkgUGxvdA0KDQpgYGB7ciBkZW5zaXR5LXBsb3RseS1tb2R1czIsIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQojIE1lbXVhdCBsaWJyYXJ5DQpsaWJyYXJ5KHBsb3RseSkNCg0KIyBEYXRhIGludGVydmFsIGRhbiBmcmVrdWVuc2kNCm1pZHBvaW50cyA8LSBjKDUuNSwgMTUuNSwgMjUuNSwgMzUuNSwgNDUuNSwgNTUuNSkNCmZyZXF1ZW5jaWVzIDwtIGMoMjAsIDMwLCAxMCwgMzAsIDUwLCA0MCkNCg0KIyBFa3NwYW5zaSBkYXRhIGJlcmRhc2Fya2FuIGZyZWt1ZW5zaQ0KZXhwYW5kZWRfZGF0YSA8LSByZXAobWlkcG9pbnRzLCBmcmVxdWVuY2llcykNCg0KIyBNZW5naGl0dW5nIG1vZHVzDQptb2RlX3ZhbHVlIDwtIDQ3LjY2ICMgQmVyZGFzYXJrYW4gcGVyaGl0dW5nYW4NCg0KIyBEZW5zaXR5IHBsb3QNCmRlbnNpdHlfZGF0YSA8LSBkZW5zaXR5KGV4cGFuZGVkX2RhdGEpDQoNCiMgTWVtYnVhdCBwbG90IG1lbmdndW5ha2FuIFBsb3RseQ0KcGxvdCA8LSBwbG90X2x5KCkgJT4lDQogICMgTWVuYW1iYWhrYW4gZGVuc2l0eSBwbG90DQogIGFkZF90cmFjZSgNCiAgICB4ID0gfmRlbnNpdHlfZGF0YSR4LA0KICAgIHkgPSB+ZGVuc2l0eV9kYXRhJHksDQogICAgdHlwZSA9ICdzY2F0dGVyJywNCiAgICBtb2RlID0gJ2xpbmVzJywNCiAgICBuYW1lID0gIkRlbnNpdHkgUGxvdCIsDQogICAgbGluZSA9IGxpc3QoY29sb3IgPSAncmdiYSgzOCwgMTY2LCA5MSwgMC44KScsIHdpZHRoID0gMikNCiAgKSAlPiUNCiAgIyBNZW5hbWJhaGthbiBnYXJpcyBtb2R1cw0KICBhZGRfdHJhY2UoDQogICAgeCA9IGMobW9kZV92YWx1ZSwgbW9kZV92YWx1ZSksDQogICAgeSA9IGMoMCwgbWF4KGRlbnNpdHlfZGF0YSR5KSksDQogICAgdHlwZSA9ICJzY2F0dGVyIiwNCiAgICBtb2RlID0gImxpbmVzIiwNCiAgICBuYW1lID0gIk1vZHVzIiwNCiAgICBsaW5lID0gbGlzdChjb2xvciA9ICdyZ2JhKDQ0LCAxMzAsIDIwMSwgMC44KScsIGRhc2ggPSAnZGFzaCcpDQogICkgJT4lDQogICMgTWVuYW1iYWhrYW4gYW5vdGFzaSB1bnR1ayBtb2R1cw0KICBsYXlvdXQoDQogICAgdGl0bGUgPSAiRGVuc2l0eSBQbG90IEJlcmF0IEJhZGFuIGRlbmdhbiBNb2R1cyIsDQogICAgeGF4aXMgPSBsaXN0KHRpdGxlID0gIkJlcmF0IEJhZGFuIChLZykiKSwNCiAgICB5YXhpcyA9IGxpc3QodGl0bGUgPSAiS2VwYWRhdGFuIiksDQogICAgYW5ub3RhdGlvbnMgPSBsaXN0KA0KICAgICAgbGlzdCgNCiAgICAgICAgeCA9IG1vZGVfdmFsdWUsDQogICAgICAgIHkgPSBtYXgoZGVuc2l0eV9kYXRhJHkpICogMC45LA0KICAgICAgICB0ZXh0ID0gcGFzdGUoIk1vZHVzOiAiLCByb3VuZChtb2RlX3ZhbHVlLCAyKSwgIktnIiksDQogICAgICAgIHNob3dhcnJvdyA9IFRSVUUsDQogICAgICAgIGFycm93aGVhZCA9IDIsDQogICAgICAgIGF4ID0gMCwNCiAgICAgICAgYXkgPSAtMzAsDQogICAgICAgIGZvbnQgPSBsaXN0KGNvbG9yID0gJ3JnYmEoNDQsIDEzMCwgMjAxLCAwLjgpJywgc2l6ZSA9IDEyKQ0KICAgICAgKQ0KICAgICkNCiAgKQ0KDQojIE1lbmFtcGlsa2FuIHBsb3QNCnBsb3QNCmBgYA0KDQojIyMgVmlzdWFsaXNhc2kgUGVyYmFuZGluZ2FuIE1lYW4sIE1lZGlhbiwgZGFuIE1vZHVzIE1lbmdndW5ha2FuIERlbnNpdHkgUGxvdA0KDQpgYGB7ciwgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCiMgTWVtdWF0IGxpYnJhcnkNCmxpYnJhcnkocGxvdGx5KQ0KDQojIERhdGEgaW50ZXJ2YWwgZGFuIGZyZWt1ZW5zaQ0KbWlkcG9pbnRzIDwtIGMoNS41LCAxNS41LCAyNS41LCAzNS41LCA0NS41LCA1NS41KQ0KZnJlcXVlbmNpZXMgPC0gYygyMCwgMzAsIDEwLCAzMCwgNTAsIDQwKQ0KDQojIEVrc3BhbnNpIGRhdGEgYmVyZGFzYXJrYW4gZnJla3VlbnNpDQpleHBhbmRlZF9kYXRhIDwtIHJlcChtaWRwb2ludHMsIGZyZXF1ZW5jaWVzKQ0KDQojIE1lbmdoaXR1bmcgbmlsYWkgUmF0YS1SYXRhIChNZWFuKQ0KbWVhbl92YWx1ZSA8LSBtZWFuKGV4cGFuZGVkX2RhdGEpDQoNCiMgTWVuZ2hpdHVuZyBuaWxhaSBNZWRpYW4NCm1lZGlhbl92YWx1ZSA8LSA0MSAjIEJlcmRhc2Fya2FuIHBlcmhpdHVuZ2FuDQoNCiMgTWVuZ2hpdHVuZyBuaWxhaSBNb2R1cw0KbW9kZV92YWx1ZSA8LSA0Ny42NiAjIEJlcmRhc2Fya2FuIHBlcmhpdHVuZ2FuDQoNCiMgRGVuc2l0eSBwbG90DQpkZW5zaXR5X2RhdGEgPC0gZGVuc2l0eShleHBhbmRlZF9kYXRhKQ0KDQojIE1lbWJ1YXQgcGxvdCBtZW5nZ3VuYWthbiBQbG90bHkNCnBsb3QgPC0gcGxvdF9seSgpICU+JQ0KICAjIE1lbmFtYmFoa2FuIGRlbnNpdHkgcGxvdA0KICBhZGRfdHJhY2UoDQogICAgeCA9IH5kZW5zaXR5X2RhdGEkeCwNCiAgICB5ID0gfmRlbnNpdHlfZGF0YSR5LA0KICAgIHR5cGUgPSAnc2NhdHRlcicsDQogICAgbW9kZSA9ICdsaW5lcycsDQogICAgbmFtZSA9ICJEZW5zaXR5IFBsb3QiLA0KICAgIGxpbmUgPSBsaXN0KGNvbG9yID0gJ3JnYmEoMzgsIDE2NiwgOTEsIDAuOCknLCB3aWR0aCA9IDIpDQogICkgJT4lDQogICMgTWVuYW1iYWhrYW4gZ2FyaXMgUmF0YS1SYXRhDQogIGFkZF90cmFjZSgNCiAgICB4ID0gYyhtZWFuX3ZhbHVlLCBtZWFuX3ZhbHVlKSwNCiAgICB5ID0gYygwLCBtYXgoZGVuc2l0eV9kYXRhJHkpKSwNCiAgICB0eXBlID0gInNjYXR0ZXIiLA0KICAgIG1vZGUgPSAibGluZXMiLA0KICAgIG5hbWUgPSAiTWVhbiIsDQogICAgbGluZSA9IGxpc3QoY29sb3IgPSAncmdiYSgyNTUsIDEyNywgMTQsIDAuOCknLCBkYXNoID0gJ2Rhc2gnKQ0KICApICU+JQ0KICAjIE1lbmFtYmFoa2FuIGFub3Rhc2kgdW50dWsgUmF0YS1SYXRhDQogIGFkZF9hbm5vdGF0aW9ucygNCiAgICB4ID0gbWVhbl92YWx1ZSwNCiAgICB5ID0gbWF4KGRlbnNpdHlfZGF0YSR5KSAqIDAuOSwNCiAgICB0ZXh0ID0gcGFzdGUoIk1lYW46ICIsIHJvdW5kKG1lYW5fdmFsdWUsIDIpLCAiS2ciKSwNCiAgICBzaG93YXJyb3cgPSBUUlVFLA0KICAgIGFycm93aGVhZCA9IDIsDQogICAgYXggPSAwLA0KICAgIGF5ID0gLTMwLA0KICAgIGZvbnQgPSBsaXN0KGNvbG9yID0gJ3JnYmEoMjU1LCAxMjcsIDE0LCAwLjgpJywgc2l6ZSA9IDEyKQ0KICApICU+JQ0KICAjIE1lbmFtYmFoa2FuIGdhcmlzIE1lZGlhbg0KICBhZGRfdHJhY2UoDQogICAgeCA9IGMobWVkaWFuX3ZhbHVlLCBtZWRpYW5fdmFsdWUpLA0KICAgIHkgPSBjKDAsIG1heChkZW5zaXR5X2RhdGEkeSkpLA0KICAgIHR5cGUgPSAic2NhdHRlciIsDQogICAgbW9kZSA9ICJsaW5lcyIsDQogICAgbmFtZSA9ICJNZWRpYW4iLA0KICAgIGxpbmUgPSBsaXN0KGNvbG9yID0gJ3JnYmEoMjIyLCA0NSwgMzgsIDAuOCknLCBkYXNoID0gJ2Rhc2gnKQ0KICApICU+JQ0KICAjIE1lbmFtYmFoa2FuIGFub3Rhc2kgdW50dWsgTWVkaWFuDQogIGFkZF9hbm5vdGF0aW9ucygNCiAgICB4ID0gbWVkaWFuX3ZhbHVlLA0KICAgIHkgPSBtYXgoZGVuc2l0eV9kYXRhJHkpICogMC45LA0KICAgIHRleHQgPSBwYXN0ZSgiTWVkaWFuOiAiLCBtZWRpYW5fdmFsdWUsICJLZyIpLA0KICAgIHNob3dhcnJvdyA9IFRSVUUsDQogICAgYXJyb3doZWFkID0gMiwNCiAgICBheCA9IDAsDQogICAgYXkgPSAtMzAsDQogICAgZm9udCA9IGxpc3QoY29sb3IgPSAncmdiYSgyMjIsIDQ1LCAzOCwgMC44KScsIHNpemUgPSAxMikNCiAgKSAlPiUNCiAgIyBNZW5hbWJhaGthbiBnYXJpcyBNb2R1cw0KICBhZGRfdHJhY2UoDQogICAgeCA9IGMobW9kZV92YWx1ZSwgbW9kZV92YWx1ZSksDQogICAgeSA9IGMoMCwgbWF4KGRlbnNpdHlfZGF0YSR5KSksDQogICAgdHlwZSA9ICJzY2F0dGVyIiwNCiAgICBtb2RlID0gImxpbmVzIiwNCiAgICBuYW1lID0gIk1vZHVzIiwNCiAgICBsaW5lID0gbGlzdChjb2xvciA9ICdyZ2JhKDQ0LCAxMzAsIDIwMSwgMC44KScsIGRhc2ggPSAnZGFzaCcpDQogICkgJT4lDQogICMgTWVuYW1iYWhrYW4gYW5vdGFzaSB1bnR1ayBNb2R1cw0KICBhZGRfYW5ub3RhdGlvbnMoDQogICAgeCA9IG1vZGVfdmFsdWUsDQogICAgeSA9IG1heChkZW5zaXR5X2RhdGEkeSkgKiAwLjksDQogICAgdGV4dCA9IHBhc3RlKCJNb2R1czogIiwgcm91bmQobW9kZV92YWx1ZSwgMiksICJLZyIpLA0KICAgIHNob3dhcnJvdyA9IFRSVUUsDQogICAgYXJyb3doZWFkID0gMiwNCiAgICBheCA9IDAsDQogICAgYXkgPSAtMzAsDQogICAgZm9udCA9IGxpc3QoY29sb3IgPSAncmdiYSg0NCwgMTMwLCAyMDEsIDAuOCknLCBzaXplID0gMTIpDQogICkgJT4lDQogICMgTGF5b3V0DQogIGxheW91dCgNCiAgICB0aXRsZSA9ICJEZW5zaXR5IFBsb3QgQmVyYXQgQmFkYW4gZGVuZ2FuIFJhdGEtUmF0YSwgTWVkaWFuLCBkYW4gTW9kdXMiLA0KICAgIHhheGlzID0gbGlzdCh0aXRsZSA9ICJCZXJhdCBCYWRhbiAoS2cpIiksDQogICAgeWF4aXMgPSBsaXN0KHRpdGxlID0gIktlcGFkYXRhbiIpDQogICkNCg0KIyBNZW5hbXBpbGthbiBwbG90DQpwbG90DQoNCmBgYA0KDQojIyBQZW5kaWRpa2FuDQoqKlN0dWRpIEthc3VzOiBEaXN0cmlidXNpIE5pbGFpIFVqaWFuIEthbGt1bHVzKioNCg0KRGF0YSBuaWxhaSB1amlhbiBrYWxrdWx1cyBkYXJpIHNlYnVhaCBrZWxhczoNCg0KfCAgTmlsYWkgVWppYW4gKEludGVydmFsKSAgfAlGcmVrdWVuc2kgKFNpc3dhKSAgfA0KfC0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tfA0KfCAgNDEgLSA1MCAgfAkgMTUgIHwNCnwgIDUxIC0gNjAgIHwJIDM1ICB8DQp8ICA2MSAtIDcwICB8CSAyNSAgfA0KfCAgNzEgLSA4MCAgfAkgNDUgIHwNCnwgIDgxIC0gOTAgIHwJIDIwICB8DQp8ICA5MSAtIDEwMCB8CSAxMCAgfA0KDQojIyMgMS4gTWVhbg0KKipQZXJoaXR1bmdhbiBUaXRpayBUZW5nYWggVGlhcCBJbnRlcnZhbCoqDQoNCkJlcmlrdXQgYWRhbGFoIHBlcmhpdHVuZ2FuIHRpdGlrIHRlbmdhaCB1bnR1ayBzZXRpYXAgaW50ZXJ2YWw6DQoNCi0gKipJbnRlcnZhbCA0MSAtIDUwKio6ICANCiAgXFsNCiAgeF9pID0gXGZyYWN7NDEgKyA1MH17Mn0gPSA0NS41DQogIFxdDQoNCi0gKipJbnRlcnZhbCA1MSAtIDYwKio6ICANCiAgXFsNCiAgeF9pID0gXGZyYWN7NTEgKyA2MH17Mn0gPSA1NS41DQogIFxdDQoNCi0gKipJbnRlcnZhbCA2MSAtIDcwKio6ICANCiAgXFsNCiAgeF9pID0gXGZyYWN7NjEgKyA3MH17Mn0gPSA2NS41DQogIFxdDQoNCi0gKipJbnRlcnZhbCA3MSAtIDgwKio6ICANCiAgXFsNCiAgeF9pID0gXGZyYWN7NzEgKyA4MH17Mn0gPSA3NS41DQogIFxdDQoNCi0gKipJbnRlcnZhbCA4MSAtIDkwKio6ICANCiAgXFsNCiAgeF9pID0gXGZyYWN7ODEgKyA5MH17Mn0gPSA4NS41DQogIFxdDQoNCi0gKipJbnRlcnZhbCA5MSAtIDEwMCoqOiAgDQogIFxbDQogIHhfaSA9IFxmcmFjezkxICsgMTAwfXsyfSA9IDk1LjUNCiAgXF0NCiAgDQoqKkxhbmdrYWgtbGFuZ2thaDoqKg0KDQpIaXR1bmcgXCggZl9pIFxjZG90IHhfaSBcKSB1bnR1ayBzZXRpYXAgaW50ZXJ2YWw6DQoNClxbDQpcYmVnaW57YWxpZ25lZH0NCjE1IFxjZG90IDQ1LjUgJj0gNjgyLjUsIFxcDQozNSBcY2RvdCA1NS41ICY9IDEsOTQyLjUsIFxcDQoyNSBcY2RvdCA2NS41ICY9IDEsNjM3LjUsIFxcDQo0NSBcY2RvdCA3NS41ICY9IDMsMzk3LjUsIFxcDQoyMCBcY2RvdCA4NS41ICY9IDEsNzEwLCBcXA0KMTAgXGNkb3QgOTUuNSAmPSA5NTUuDQpcZW5ke2FsaWduZWR9DQpcXQ0KDQotIEhpdHVuZyB0b3RhbCBcKCBcc3VtIChmX2kgXGNkb3QgeF9pKSBcKToNClxbDQpcc3VtIChmX2kgXGNkb3QgeF9pKSA9IDY4Mi41ICsgMSw5NDIuNSArIDEsNjM3LjUgKyAzLDM5Ny41ICsgMSw3MTAgKyA5NTUgPSAxMC4zMjUNClxdDQoNCi0gSGl0dW5nIHRvdGFsIGZyZWt1ZW5zaSBcKCBcc3VtIGZfaSBcKToNClxbDQpcc3VtIGZfaSA9IDE1ICsgMzUgKyAyNSArIDQ1ICsgMjAgKyAxMCA9IDE1MA0KXF0NCg0KKipIaXR1bmcgTWVhbjoqKg0KXFsNClxiYXJ7WH0gPSBcZnJhY3tcc3VtIChmX2kgXGNkb3QgeF9pKX17XHN1bSBmX2l9ID0gXGZyYWN7MTAuMzI1fXsxNTB9IFxhcHByb3ggNjguODMNClxdDQoNCioqUmF0YS1yYXRhIE5pbGFpIHVqaWFuOioqDQokJCA2OC44MyAkJA0KDQojIyMgVmlzdWFsaXNhc2kgTWVhbiBNZW5nZ3VuYWthbiBEZW5zaXR5IFBsb3QNCg0KYGBge3IgZGVuc2l0eS1wbG90bHktbWVhbjMsIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQojIE1lbXVhdCBsaWJyYXJ5DQpsaWJyYXJ5KHBsb3RseSkNCg0KIyBEYXRhIGludGVydmFsIGRhbiBmcmVrdWVuc2kNCm1pZHBvaW50cyA8LSBjKDQ1LjUsIDU1LjUsIDY1LjUsIDc1LjUsIDg1LjUsIDk1LjUpDQpmcmVxdWVuY2llcyA8LSBjKDE1LCAzNSwgMjUsIDQ1LCAyMCwgMTApDQoNCiMgRWtzcGFuc2kgZGF0YSBiZXJkYXNhcmthbiBmcmVrdWVuc2kNCmV4cGFuZGVkX2RhdGEgPC0gcmVwKG1pZHBvaW50cywgZnJlcXVlbmNpZXMpDQoNCiMgTWVuZ2hpdHVuZyByYXRhLXJhdGENCm1lYW5fdmFsdWUgPC0gbWVhbihleHBhbmRlZF9kYXRhKQ0KDQojIERlbnNpdHkgcGxvdA0KZGVuc2l0eV9kYXRhIDwtIGRlbnNpdHkoZXhwYW5kZWRfZGF0YSkNCg0KIyBNZW1idWF0IHBsb3QgbWVuZ2d1bmFrYW4gUGxvdGx5DQpwbG90IDwtIHBsb3RfbHkoKSAlPiUNCiAgIyBNZW5hbWJhaGthbiBkZW5zaXR5IHBsb3QNCiAgYWRkX3RyYWNlKA0KICAgIHggPSB+ZGVuc2l0eV9kYXRhJHgsDQogICAgeSA9IH5kZW5zaXR5X2RhdGEkeSwNCiAgICB0eXBlID0gJ3NjYXR0ZXInLA0KICAgIG1vZGUgPSAnbGluZXMnLA0KICAgIG5hbWUgPSAiRGVuc2l0eSBQbG90IiwNCiAgICBsaW5lID0gbGlzdChjb2xvciA9ICdyZ2JhKDM4LCAxNjYsIDkxLCAwLjgpJywgd2lkdGggPSAyKQ0KICApICU+JQ0KICAjIE1lbmFtYmFoa2FuIGdhcmlzIHJhdGEtcmF0YQ0KICBhZGRfdHJhY2UoDQogICAgeCA9IGMobWVhbl92YWx1ZSwgbWVhbl92YWx1ZSksDQogICAgeSA9IGMoMCwgbWF4KGRlbnNpdHlfZGF0YSR5KSksDQogICAgdHlwZSA9ICJzY2F0dGVyIiwNCiAgICBtb2RlID0gImxpbmVzIiwNCiAgICBuYW1lID0gIk1lYW4iLA0KICAgIGxpbmUgPSBsaXN0KGNvbG9yID0gJ3JnYmEoMjU1LCAxMjcsIDE0LCAwLjgpJywgZGFzaCA9ICdkYXNoJykNCiAgKSAlPiUNCiAgIyBNZW5hbWJhaGthbiBhbm90YXNpIHVudHVrIHJhdGEtcmF0YQ0KICBsYXlvdXQoDQogICAgdGl0bGUgPSAiRGVuc2l0eSBQbG90IE5pbGFpIFVqaWFuIGRlbmdhbiBSYXRhLVJhdGEiLA0KICAgIHhheGlzID0gbGlzdCh0aXRsZSA9ICJOaWxhaSBVamlhbiIpLA0KICAgIHlheGlzID0gbGlzdCh0aXRsZSA9ICJLZXBhZGF0YW4iKSwNCiAgICBhbm5vdGF0aW9ucyA9IGxpc3QoDQogICAgICBsaXN0KA0KICAgICAgICB4ID0gbWVhbl92YWx1ZSwNCiAgICAgICAgeSA9IG1heChkZW5zaXR5X2RhdGEkeSkgKiAwLjksDQogICAgICAgIHRleHQgPSBwYXN0ZSgiTWVhbjogIiwgcm91bmQobWVhbl92YWx1ZSwgMiksICJwdHMiKSwNCiAgICAgICAgc2hvd2Fycm93ID0gVFJVRSwNCiAgICAgICAgYXJyb3doZWFkID0gMiwNCiAgICAgICAgYXggPSAwLA0KICAgICAgICBheSA9IC0zMCwNCiAgICAgICAgZm9udCA9IGxpc3QoY29sb3IgPSAncmdiYSgyNTUsIDEyNywgMTQsIDAuOCknLCBzaXplID0gMTIpDQogICAgICApDQogICAgKQ0KICApDQoNCiMgTWVuYW1waWxrYW4gcGxvdA0KcGxvdA0KDQpgYGANCg0KIyMjIDIuIE1lZGlhbjogDQoNCiAtIFRvdGFsIEp1bWxhaCBEYXRhOiANClxbDQpuID0gMTUgKyAzNSArIDI1ICsgNDUgKyAyMCArIDEwID0gMTUwDQpcXQ0KDQotIFBvc2lzaSBNZWRpYW4NCg0KS2FyZW5hIFwobiA9IDE1MFwpLCBqdW1sYWggZGF0YSBnZW5hcCwgbWFrYToNCg0KXFsNClx0ZXh0e1Bvc2lzaSBNZWRpYW59ID0gXGZyYWN7bn17Mn0gPSA3NSBccXVhZCBcdGV4dHtkYW59IFxxdWFkIFxmcmFje259ezJ9ICsgMSA9IDc2DQpcXQ0KDQpCZXJkYXNhcmthbiBmcmVrdWVuc2kga3VtdWxhdGlmLCBkYXRhIGtlLTc1IGRhbiBrZS03NiBiZXJhZGEgZGFsYW0gaW50ZXJ2YWwgNjEtNzAuDQoNCi0gUnVtdXMgTWVkaWFuDQoNClJ1bXVzIG1lZGlhbiB1bnR1ayBkYXRhIGtlbG9tcG9rIGFkYWxhaDoNCg0KXFsNClx0ZXh0e01lZGlhbn0gPSBMICsgXGxlZnQoIFxmcmFje1xmcmFje259ezJ9IC0gRn17Zl9tfSBccmlnaHQpIFxjZG90IGMNClxdDQoNCi0gU3Vic3RpdHVzaSBOaWxhaQ0KDQpcWw0KTCA9IDYxLCBccXVhZCBGID0gNTAsIFxxdWFkIGZfbSA9IDI1LCBccXVhZCBjID0gMTANClxdDQoNCi0gUGVyaGl0dW5nYW4gTWVkaWFuDQpcWw0KXHRleHR7TWVkaWFufSA9IDYxICsgXGxlZnQoIFxmcmFjezc1IC0gNTB9ezI1fSBccmlnaHQpIFxjZG90IDEwDQpcXQ0KXFsNClx0ZXh0e01lZGlhbn0gPSA2MSArIFxsZWZ0KCBcZnJhY3syNX17MjV9IFxyaWdodCkgXGNkb3QgMTANClxdDQpcWw0KXHRleHR7TWVkaWFufSA9IDExICsgMTAgPSA3MQ0KXF0NCg0KKipOaWxhaSBUZW5nYWggVWppYW46KioNCiQkIDcxICQkDQoNCiMjIyBWaXN1YWxpc2FzaSBNZWRpYW4gTWVuZ2d1bmFrYW4gRGVuc2l0eSBQbG90DQoNCmBgYHtyIGRlbnNpdHktcGxvdGx5LW1lZGlhbjMsIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQojIE1lbXVhdCBsaWJyYXJ5DQpsaWJyYXJ5KHBsb3RseSkNCg0KIyBEYXRhIGludGVydmFsIGRhbiBmcmVrdWVuc2kNCm1pZHBvaW50cyA8LSBjKDQ1LjUsIDU1LjUsIDY1LjUsIDc1LjUsIDg1LjUsIDk1LjUpDQpmcmVxdWVuY2llcyA8LSBjKDE1LCAzNSwgMjUsIDQ1LCAyMCwgMTApDQoNCiMgRWtzcGFuc2kgZGF0YSBiZXJkYXNhcmthbiBmcmVrdWVuc2kNCmV4cGFuZGVkX2RhdGEgPC0gcmVwKG1pZHBvaW50cywgZnJlcXVlbmNpZXMpDQoNCiMgTmlsYWkgbWVkaWFuDQptZWRpYW5fdmFsdWUgPC0gNzEgICMgQmVyZGFzYXJrYW4gcGVyaGl0dW5nYW4gbWVkaWFuDQoNCiMgRGVuc2l0eSBwbG90DQpkZW5zaXR5X2RhdGEgPC0gZGVuc2l0eShleHBhbmRlZF9kYXRhKQ0KDQojIE1lbWJ1YXQgcGxvdCBtZW5nZ3VuYWthbiBQbG90bHkNCnBsb3QgPC0gcGxvdF9seSgpICU+JQ0KICAjIE1lbmFtYmFoa2FuIGRlbnNpdHkgcGxvdA0KICBhZGRfdHJhY2UoDQogICAgeCA9IH5kZW5zaXR5X2RhdGEkeCwNCiAgICB5ID0gfmRlbnNpdHlfZGF0YSR5LA0KICAgIHR5cGUgPSAnc2NhdHRlcicsDQogICAgbW9kZSA9ICdsaW5lcycsDQogICAgbmFtZSA9ICJEZW5zaXR5IFBsb3QiLA0KICAgIGxpbmUgPSBsaXN0KGNvbG9yID0gJ3JnYmEoMzgsIDE2NiwgOTEsIDAuOCknLCB3aWR0aCA9IDIpDQogICkgJT4lDQogICMgTWVuYW1iYWhrYW4gZ2FyaXMgbWVkaWFuDQogIGFkZF90cmFjZSgNCiAgICB4ID0gYyhtZWRpYW5fdmFsdWUsIG1lZGlhbl92YWx1ZSksDQogICAgeSA9IGMoMCwgbWF4KGRlbnNpdHlfZGF0YSR5KSksDQogICAgdHlwZSA9ICJzY2F0dGVyIiwNCiAgICBtb2RlID0gImxpbmVzIiwNCiAgICBuYW1lID0gIk1lZGlhbiIsDQogICAgbGluZSA9IGxpc3QoY29sb3IgPSAncmdiYSgwLCAwLCAyNTUsIDAuOCknLCBkYXNoID0gJ2Rhc2gnKQ0KICApICU+JQ0KICAjIE1lbmFtYmFoa2FuIGFub3Rhc2kgdW50dWsgbWVkaWFuDQogIGxheW91dCgNCiAgICB0aXRsZSA9ICJEZW5zaXR5IFBsb3QgTmlsYWkgVWppYW4gZGVuZ2FuIE1lZGlhbiIsDQogICAgeGF4aXMgPSBsaXN0KHRpdGxlID0gIk5pbGFpIFVqaWFuIiksDQogICAgeWF4aXMgPSBsaXN0KHRpdGxlID0gIktlcGFkYXRhbiIpLA0KICAgIGFubm90YXRpb25zID0gbGlzdCgNCiAgICAgIGxpc3QoDQogICAgICAgIHggPSBtZWRpYW5fdmFsdWUsDQogICAgICAgIHkgPSBtYXgoZGVuc2l0eV9kYXRhJHkpICogMC45LA0KICAgICAgICB0ZXh0ID0gcGFzdGUoIk1lZGlhbjogIiwgbWVkaWFuX3ZhbHVlLCAicHRzIiksDQogICAgICAgIHNob3dhcnJvdyA9IFRSVUUsDQogICAgICAgIGFycm93aGVhZCA9IDIsDQogICAgICAgIGF4ID0gMCwNCiAgICAgICAgYXkgPSAtMzAsDQogICAgICAgIGZvbnQgPSBsaXN0KGNvbG9yID0gJ3JnYmEoMCwgMCwgMjU1LCAwLjgpJywgc2l6ZSA9IDEyKQ0KICAgICAgKQ0KICAgICkNCiAgKQ0KDQojIE1lbmFtcGlsa2FuIHBsb3QNCnBsb3QNCg0KYGBgDQoNCg0KIyMjIDMuIE1vZHVzOg0KDQotIElkZW50aWZpa2FzaSBLZWxhcyBNb2R1czoNCktlbGFzIGRlbmdhbiBmcmVrdWVuc2kgdGVydGluZ2dpIGJlcmFkYSBkaSBpbnRlcnZhbCAqKjcxLTgwKiogKFwoZl8xID0gNDVcKSkuDQoNCi0gSW5mb3JtYXNpOg0KLSBcKEwgPSA3MVwpOiB0ZXBpIGJhd2FoIGtlbGFzIG1vZHVzLg0KLSBcKGZfMSA9IDQ1XCk6IGZyZWt1ZW5zaSBrZWxhcyBtb2R1cy4NCi0gXChmXzAgPSAyNVwpOiBmcmVrdWVuc2kga2VsYXMgc2ViZWx1bSBrZWxhcyBtb2R1cy4NCi0gXChmXzIgPSAyMFwpOiBmcmVrdWVuc2kga2VsYXMgc2V0ZWxhaCBrZWxhcyBtb2R1cy4NCi0gXChjID0gMTBcKTogcGFuamFuZyBpbnRlcnZhbCBrZWxhcy4NCg0KLS0tDQoNCi0gUnVtdXMgTW9kdXM6DQpcWw0KXHRleHR7TW9kdXN9ID0gTCArIFxsZWZ0KCBcZnJhY3tmXzEgLSBmXzB9eyhmXzEgLSBmXzApICsgKGZfMSAtIGZfMil9IFxyaWdodCkgXHRpbWVzIGMNClxdDQoNCi0tLQ0KDQotIFN1YnN0aXR1c2kgTmlsYWk6DQpcWw0KXHRleHR7TW9kdXN9ID0gNzEgKyBcbGVmdCggXGZyYWN7NDUgLSAyNX17KDQ1IC0gMjUpICsgKDQ1IC0gMjApfSBccmlnaHQpIFx0aW1lcyAxMA0KXF0NClxbDQpcdGV4dHtNb2R1c30gPSA3MSArIFxsZWZ0KCBcZnJhY3syMH17MjAgKyAyNX0gXHJpZ2h0KSBcdGltZXMgMTANClxdDQpcWw0KXHRleHR7TW9kdXN9ID0gNzEgKyBcbGVmdCggXGZyYWN7MjB9ezQ1fSBccmlnaHQpIFx0aW1lcyAxMA0KXF0NClxbDQpcdGV4dHtNb2R1c30gPSA3MSArICgwLjQ0NCBcdGltZXMgMTApDQpcXQ0KXFsNClx0ZXh0e01vZHVzfSA9IDcxICsgNC40NA0KXF0NClxbDQpcdGV4dHtNb2R1c30gXGFwcHJveCA3NS40NA0KXF0NCg0KKipOaWxhaSBVamlhbiBZYW5nIFBhbGluZyBTZXJpbmcgTXVuY3VsIDoqKg0KJCQgNzUuNDQgJCQNCg0KIyMjIFZpc3VhbGlzYXNpIE1vZHVzIE1lbmdndW5ha2FuIERlbnNpdHkgUGxvdA0KDQpgYGB7ciBkZW5zaXR5LXBsb3RseS1tb2R1czMsIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQojIE1lbXVhdCBsaWJyYXJ5DQpsaWJyYXJ5KHBsb3RseSkNCg0KIyBEYXRhIGludGVydmFsIGRhbiBmcmVrdWVuc2kNCm1pZHBvaW50cyA8LSBjKDQ1LjUsIDU1LjUsIDY1LjUsIDc1LjUsIDg1LjUsIDk1LjUpDQpmcmVxdWVuY2llcyA8LSBjKDE1LCAzNSwgMjUsIDQ1LCAyMCwgMTApDQoNCiMgRWtzcGFuc2kgZGF0YSBiZXJkYXNhcmthbiBmcmVrdWVuc2kNCmV4cGFuZGVkX2RhdGEgPC0gcmVwKG1pZHBvaW50cywgZnJlcXVlbmNpZXMpDQoNCiMgTmlsYWkgbW9kdXMNCm1vZGVfdmFsdWUgPC0gNzUuNDQgICMgQmVyZGFzYXJrYW4gcGVyaGl0dW5nYW4gbW9kdXMNCg0KIyBEZW5zaXR5IHBsb3QNCmRlbnNpdHlfZGF0YSA8LSBkZW5zaXR5KGV4cGFuZGVkX2RhdGEpDQoNCiMgTWVtYnVhdCBwbG90IG1lbmdndW5ha2FuIFBsb3RseQ0KcGxvdCA8LSBwbG90X2x5KCkgJT4lDQogICMgTWVuYW1iYWhrYW4gZGVuc2l0eSBwbG90DQogIGFkZF90cmFjZSgNCiAgICB4ID0gfmRlbnNpdHlfZGF0YSR4LA0KICAgIHkgPSB+ZGVuc2l0eV9kYXRhJHksDQogICAgdHlwZSA9ICdzY2F0dGVyJywNCiAgICBtb2RlID0gJ2xpbmVzJywNCiAgICBuYW1lID0gIkRlbnNpdHkgUGxvdCIsDQogICAgbGluZSA9IGxpc3QoY29sb3IgPSAncmdiYSgzOCwgMTY2LCA5MSwgMC44KScsIHdpZHRoID0gMikNCiAgKSAlPiUNCiAgIyBNZW5hbWJhaGthbiBnYXJpcyBtb2R1cw0KICBhZGRfdHJhY2UoDQogICAgeCA9IGMobW9kZV92YWx1ZSwgbW9kZV92YWx1ZSksDQogICAgeSA9IGMoMCwgbWF4KGRlbnNpdHlfZGF0YSR5KSksDQogICAgdHlwZSA9ICJzY2F0dGVyIiwNCiAgICBtb2RlID0gImxpbmVzIiwNCiAgICBuYW1lID0gIk1vZHVzIiwNCiAgICBsaW5lID0gbGlzdChjb2xvciA9ICdyZ2JhKDI1NSwgOTksIDcxLCAwLjgpJywgZGFzaCA9ICdkYXNoJykNCiAgKSAlPiUNCiAgIyBNZW5hbWJhaGthbiBhbm90YXNpIHVudHVrIG1vZHVzDQogIGxheW91dCgNCiAgICB0aXRsZSA9ICJEZW5zaXR5IFBsb3QgTmlsYWkgVWppYW4gZGVuZ2FuIE1vZHVzIiwNCiAgICB4YXhpcyA9IGxpc3QodGl0bGUgPSAiTmlsYWkgVWppYW4iKSwNCiAgICB5YXhpcyA9IGxpc3QodGl0bGUgPSAiS2VwYWRhdGFuIiksDQogICAgYW5ub3RhdGlvbnMgPSBsaXN0KA0KICAgICAgbGlzdCgNCiAgICAgICAgeCA9IG1vZGVfdmFsdWUsDQogICAgICAgIHkgPSBtYXgoZGVuc2l0eV9kYXRhJHkpICogMC45LA0KICAgICAgICB0ZXh0ID0gcGFzdGUoIk1vZHVzOiAiLCByb3VuZChtb2RlX3ZhbHVlLCAyKSwgInB0cyIpLA0KICAgICAgICBzaG93YXJyb3cgPSBUUlVFLA0KICAgICAgICBhcnJvd2hlYWQgPSAyLA0KICAgICAgICBheCA9IDAsDQogICAgICAgIGF5ID0gLTMwLA0KICAgICAgICBmb250ID0gbGlzdChjb2xvciA9ICdyZ2JhKDI1NSwgOTksIDcxLCAwLjgpJywgc2l6ZSA9IDEyKQ0KICAgICAgKQ0KICAgICkNCiAgKQ0KDQojIE1lbmFtcGlsa2FuIHBsb3QNCnBsb3QNCg0KYGBgDQoNCg0KIyMjIFZpc3VhbGlzYXNpIFBlcmJhbmRpbmdhbiBNZWFuLCBNZWRpYW4sIGRhbiBNb2R1cyBNZW5nZ3VuYWthbiBEZW5zaXR5IFBsb3QNCg0KYGBge3IsIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQojIE1lbXVhdCBsaWJyYXJ5DQpsaWJyYXJ5KHBsb3RseSkNCg0KIyBEYXRhIGludGVydmFsIGRhbiBmcmVrdWVuc2kNCm1pZHBvaW50cyA8LSBjKDQ1LjUsIDU1LjUsIDY1LjUsIDc1LjUsIDg1LjUsIDk1LjUpDQpmcmVxdWVuY2llcyA8LSBjKDE1LCAzNSwgMjUsIDQ1LCAyMCwgMTApDQoNCiMgRWtzcGFuc2kgZGF0YSBiZXJkYXNhcmthbiBmcmVrdWVuc2kNCmV4cGFuZGVkX2RhdGEgPC0gcmVwKG1pZHBvaW50cywgZnJlcXVlbmNpZXMpDQoNCiMgTWVuZ2hpdHVuZyBuaWxhaSBSYXRhLVJhdGEgKE1lYW4pDQptZWFuX3ZhbHVlIDwtIG1lYW4oZXhwYW5kZWRfZGF0YSkNCg0KIyBNZW5naGl0dW5nIG5pbGFpIE1lZGlhbg0KbWVkaWFuX3ZhbHVlIDwtIDcxICAjIEJlcmRhc2Fya2FuIHBlcmhpdHVuZ2FuIG1lZGlhbg0KDQojIE1lbmdoaXR1bmcgbmlsYWkgTW9kdXMNCm1vZGVfdmFsdWUgPC0gNzUuNDQgICMgQmVyZGFzYXJrYW4gcGVyaGl0dW5nYW4gbW9kdXMNCg0KIyBEZW5zaXR5IHBsb3QNCmRlbnNpdHlfZGF0YSA8LSBkZW5zaXR5KGV4cGFuZGVkX2RhdGEpDQoNCiMgTWVtYnVhdCBwbG90IG1lbmdndW5ha2FuIFBsb3RseQ0KcGxvdCA8LSBwbG90X2x5KCkgJT4lDQogICMgTWVuYW1iYWhrYW4gZGVuc2l0eSBwbG90DQogIGFkZF90cmFjZSgNCiAgICB4ID0gfmRlbnNpdHlfZGF0YSR4LA0KICAgIHkgPSB+ZGVuc2l0eV9kYXRhJHksDQogICAgdHlwZSA9ICdzY2F0dGVyJywNCiAgICBtb2RlID0gJ2xpbmVzJywNCiAgICBuYW1lID0gIkRlbnNpdHkgUGxvdCIsDQogICAgbGluZSA9IGxpc3QoY29sb3IgPSAncmdiYSgzOCwgMTY2LCA5MSwgMC44KScsIHdpZHRoID0gMikNCiAgKSAlPiUNCiAgIyBNZW5hbWJhaGthbiBnYXJpcyBSYXRhLVJhdGENCiAgYWRkX3RyYWNlKA0KICAgIHggPSBjKG1lYW5fdmFsdWUsIG1lYW5fdmFsdWUpLA0KICAgIHkgPSBjKDAsIG1heChkZW5zaXR5X2RhdGEkeSkpLA0KICAgIHR5cGUgPSAic2NhdHRlciIsDQogICAgbW9kZSA9ICJsaW5lcyIsDQogICAgbmFtZSA9ICJNZWFuIiwNCiAgICBsaW5lID0gbGlzdChjb2xvciA9ICdyZ2JhKDI1NSwgMTI3LCAxNCwgMC44KScsIGRhc2ggPSAnZGFzaCcpDQogICkgJT4lDQogICMgTWVuYW1iYWhrYW4gYW5vdGFzaSB1bnR1ayBSYXRhLVJhdGENCiAgYWRkX2Fubm90YXRpb25zKA0KICAgIHggPSBtZWFuX3ZhbHVlLA0KICAgIHkgPSBtYXgoZGVuc2l0eV9kYXRhJHkpICogMC45LA0KICAgIHRleHQgPSBwYXN0ZSgiTWVhbjogIiwgcm91bmQobWVhbl92YWx1ZSwgMiksICJwdHMiKSwNCiAgICBzaG93YXJyb3cgPSBUUlVFLA0KICAgIGFycm93aGVhZCA9IDIsDQogICAgYXggPSAwLA0KICAgIGF5ID0gLTMwLA0KICAgIGZvbnQgPSBsaXN0KGNvbG9yID0gJ3JnYmEoMjU1LCAxMjcsIDE0LCAwLjgpJywgc2l6ZSA9IDEyKQ0KICApICU+JQ0KICAjIE1lbmFtYmFoa2FuIGdhcmlzIE1lZGlhbg0KICBhZGRfdHJhY2UoDQogICAgeCA9IGMobWVkaWFuX3ZhbHVlLCBtZWRpYW5fdmFsdWUpLA0KICAgIHkgPSBjKDAsIG1heChkZW5zaXR5X2RhdGEkeSkpLA0KICAgIHR5cGUgPSAic2NhdHRlciIsDQogICAgbW9kZSA9ICJsaW5lcyIsDQogICAgbmFtZSA9ICJNZWRpYW4iLA0KICAgIGxpbmUgPSBsaXN0KGNvbG9yID0gJ3JnYmEoMCwgMCwgMjU1LCAwLjgpJywgZGFzaCA9ICdkYXNoJykNCiAgKSAlPiUNCiAgIyBNZW5hbWJhaGthbiBhbm90YXNpIHVudHVrIE1lZGlhbg0KICBhZGRfYW5ub3RhdGlvbnMoDQogICAgeCA9IG1lZGlhbl92YWx1ZSwNCiAgICB5ID0gbWF4KGRlbnNpdHlfZGF0YSR5KSAqIDAuOSwNCiAgICB0ZXh0ID0gcGFzdGUoIk1lZGlhbjogIiwgbWVkaWFuX3ZhbHVlLCAicHRzIiksDQogICAgc2hvd2Fycm93ID0gVFJVRSwNCiAgICBhcnJvd2hlYWQgPSAyLA0KICAgIGF4ID0gMCwNCiAgICBheSA9IC0zMCwNCiAgICBmb250ID0gbGlzdChjb2xvciA9ICdyZ2JhKDAsIDAsIDI1NSwgMC44KScsIHNpemUgPSAxMikNCiAgKSAlPiUNCiAgIyBNZW5hbWJhaGthbiBnYXJpcyBNb2R1cw0KICBhZGRfdHJhY2UoDQogICAgeCA9IGMobW9kZV92YWx1ZSwgbW9kZV92YWx1ZSksDQogICAgeSA9IGMoMCwgbWF4KGRlbnNpdHlfZGF0YSR5KSksDQogICAgdHlwZSA9ICJzY2F0dGVyIiwNCiAgICBtb2RlID0gImxpbmVzIiwNCiAgICBuYW1lID0gIk1vZHVzIiwNCiAgICBsaW5lID0gbGlzdChjb2xvciA9ICdyZ2JhKDI1NSwgOTksIDcxLCAwLjgpJywgZGFzaCA9ICdkYXNoJykNCiAgKSAlPiUNCiAgIyBNZW5hbWJhaGthbiBhbm90YXNpIHVudHVrIE1vZHVzDQogIGFkZF9hbm5vdGF0aW9ucygNCiAgICB4ID0gbW9kZV92YWx1ZSwNCiAgICB5ID0gbWF4KGRlbnNpdHlfZGF0YSR5KSAqIDAuOSwNCiAgICB0ZXh0ID0gcGFzdGUoIk1vZHVzOiAiLCByb3VuZChtb2RlX3ZhbHVlLCAyKSwgInB0cyIpLA0KICAgIHNob3dhcnJvdyA9IFRSVUUsDQogICAgYXJyb3doZWFkID0gMiwNCiAgICBheCA9IDAsDQogICAgYXkgPSAtMzAsDQogICAgZm9udCA9IGxpc3QoY29sb3IgPSAncmdiYSgyNTUsIDk5LCA3MSwgMC44KScsIHNpemUgPSAxMikNCiAgKSAlPiUNCiAgIyBMYXlvdXQNCiAgbGF5b3V0KA0KICAgIHRpdGxlID0gIkRlbnNpdHkgUGxvdCBOaWxhaSBVamlhbiBkZW5nYW4gUmF0YS1SYXRhLCBNZWRpYW4sIGRhbiBNb2R1cyIsDQogICAgeGF4aXMgPSBsaXN0KHRpdGxlID0gIk5pbGFpIFVqaWFuIiksDQogICAgeWF4aXMgPSBsaXN0KHRpdGxlID0gIktlcGFkYXRhbiIpDQogICkNCg0KIyBNZW5hbXBpbGthbiBwbG90DQpwbG90DQoNCmBgYA==