1.1 Praktikum 1
1.1.1 Mean untuk Data Kelompok
Mean (rata-rata) adalah ukuran pemusatan yang paling umum digunakan
dalam statistik. Data kelompok adalah data yang sudah dikelompokkan
dalam bentuk data kelompok. Menghitung mean pada datra kelompok tidak
berbeda dengan perhitungan distribusi frekuensi tunggal. Hanya nilai X
tidak mewakili nilai variable individu,melainkan mewakili titik tengah
interval.
Langkah langkah untuk menghitung mean sebagai berikut :
Hitung nilai tengah (\(X_i\))
dari setiap kelas interval:
\(X_i = \frac{\text{Tepi bawah kelas} +
\text{Tepi atas kelas}}{2}\)
Kalikan Frekuensi (\(f\)) dengan
Nilai Tengah (\(X_i\))} :
Hitung \(f \cdot X_i\) untuk setiap
kelas
Hitung Total \(\sum fX\)} :
Jumlahkan semua hasil dari perkalian frekuensi dengan nilai tengah
.
Hitung Total Frekuensi (\(n\))}
:
Jumlahkan seluruh frekuensi (𝑓).
Substitusi ke Rumus Mean :
\[
\bar{X} = \frac{\sum fX}{n}
\]
dimana :
\[\begin{aligned}
\bar{X} & = \text{rata-rata hitung data berkelompok} \\
\sum fX & = \text{jumlah dari seluruh hasil perkalian antara
frekuensi dan nilai tengah masing-masing kelas} \\
n & = \text{jumlah total data}
\end{aligned}\]
contoh :
Dibawah ini adalah data yang sudah dikelompokan dari 20 perusahaan
yang sahamnya menjadi pilihan pada bulan maret 2003.
Tabel Data Kelompok untuk mean
| 160 - 303 |
231,5 |
2 |
| 304 - 447 |
375,5 |
5 |
| 448 - 591 |
519,5 |
9 |
| 592 - 735 |
663,5 |
3 |
| 736 - 878 |
807 |
1 |
Penyelesaian dengan outliers:
\[
\bar{X} = \frac{\sum fX}{n} = \frac {2(231,5)+ 5(375,5)+ 9(519,5)+
3(663,5)+ 1(807)}{20}
= \frac {9.813,5}{20}
= 490,68
\]
Penyelesaian tanpa outliers:
\[
\bar{X} = \frac{\sum fX}{n} = \frac {2(231,5)+ 5(375,5)+ 9(519,5)+
3(663,5)}{20}
= \frac {9006.5}{19}
= 474,03
\]
Kesimpulan :
Rata-rata dengan outliers menghasilkan nilai 490,68, yang lebih
tinggi dibandingkan rata-rata tanpa outliers. Hal ini menunjukkan bahwa
keberadaan data ekstrem (outliers) memengaruhi hasil perhitungan,
sehingga menyebabkan nilai rata-rata menjadi tidak sepenuhnya mewakili
distribusi data mayoritas.
Rata-rata tanpa outliers menghasilkan nilai 474,03, yang lebih
mencerminkan karakteristik utama data. Penghapusan outliers membantu
mengurangi bias dalam perhitungan rata-rata dan memberikan hasil yang
lebih representatif terhadap distribusi data utama.
Dengan itu juga penghapusan outliers penting untuk kedua metode
ini agar mendapatkan gambaran yang lebih akurat tentang tren atau
karakteristik data secara keseluruhan.
Mean dalam bentuk boxplot :
Mean dalam bentuk histogram :
1.1.2 Median untuk Data Kelompok
Median adalah nilai tengah dalam suatu kumpulan data yang telah
diurutkan dari data terkecil hingga terbesar atau sebaliknya.
Perhitungan median dengan data kelompok dapat dilakukan dengan bantuan
frekuensi ku,mulatif kurang dari.
Langkah langkah untuk menghitung median sebagai beikut :
Hitung Total Frekuensi (𝑛)
Hitung nilai \(\frac{n}{2}\)
Kurangkan \(\sum f_{i_0}\) dari
\(\frac{n}{2}\)
Bagikan hasil tersebut dengan \(f_m\)
Kalikan hasilnya dengan \(C\)
Tambahkan hasil ke \(tb\) untuk
mendapatkan median
Substitusi ke Rumus Median:
\[
\text{Med} = tb + \left( \frac{\frac{n}{2} - \sum f_{i_0}}{f_m} \right).
C
\]
dimana :
\[
\begin{align*}
tb & = \text{batas bawah untuk kelas dimana median berada} \\
C & = \text{interval kelas} \\
\sum f_{i_0} & = \text{jumlah frekuensi dari semua kelas dibawah
kelas yang mengandung median} \\
f_m & = \text{frekuensi dari kelas yang mengandung median}
\end{align*}
\] contoh :
Terdapat data kelompok dibawah ini, hitung berapa mediannya !
Tabel Data Kelompok untuk median
| 31 - 40 |
3 |
| 41 - 50 |
5 |
| 51 - 60 |
10 |
| 61 - 70 |
11 |
| 71 - 80 |
8 |
| 81 - 90 |
3 |
| jumlah |
40 |
penyelesaian :
Jumlah data sebesar 40, maka mediannya terletak pada :
\[
Q_2 = \frac {1}{2} \cdot 40 = 20
\] Maka median terletak didata ke-20.
Sebelum itu, kita harus menentukan frekuensi kumulatif :
Tabel Data Kelompok untuk median frekuensi kumulatif dengan
outliers
| 31 - 40 |
3 |
3 |
| 41 - 50 |
5 |
8 |
| 51 - 60 |
10 |
18 |
| 61 - 70 |
11 |
29 |
| 71 - 80 |
8 |
37 |
| 81 - 90 |
3 |
40 |
Pada tabel di atas, didapatkan data berupa:
\[
\begin{aligned}
tb &= 61 - 0,5 = 60,5 \\
p &= 10 \\
F_m &= 11 \\
F &= 18 \\
\end{aligned}
\]
Kesimpulan :
Hasil perhitungan median dari kedua metode yakni menggunakan outlier
dan tanpa menggunakan outliers menunjukkan bahwa nilai median tidak
berubah (tetap 62,32). Hal ini membuktikan bahwa median adalah ukuran
pemusatan data yang robust atau kuat terhadap outliers, karena posisinya
ditentukan oleh urutan data, bukan nilai-nilai ekstrem dalam distribusi.
Median tetap menggambarkan nilai tengah data dengan konsisten meskipun
distribusi data dimodifikasi.
1.1.3 Modus untuk Data Kelompok
Modus adalah nilai yang sering muncul dalam sebuah dataset. Modus
digunakan untuk mengetahui nilai yang paling dominan atau paling sering
terjadi dalam suatu kumpulan data.
Langkah langkah menghitung modus sebagai berikut :
Kurangi frekuensi sebelum kelas modus (\(f_0\)) dari frekuensi kelas modus (\(f_1\))
Kurangi frekuensi setelah kelas modus (\(f_2\)) dari frekuensi kelas modus (\(f_1\))
Hitung pembilang = \((f_1 -
f_0)\) dan penyebut = \((f_1 - f_0) +
(f_1 - f_2)\)
Bagi pembilang dengan penyebut = \(\frac{f_1 - f_0}{(f_1 - f_0) + (f_1
- f_2)}\)
Kalikan hasilnya dengan lebar kelas (\(C\))
Tambahkan hasil tersebut ke batas bawah kelas modus (\(tb\))
Substitusi ke Rumus Modus :
\(\text{Modus} = tb + \left( \frac{(f_1 -
f_0) }{f_1 - f_0 + (f_1 - f_2)} \right). C\)
Bisa Juga ditulis dengan :
\(\text{Mod} = tb + \left(
\frac{(f_1)_0}{(f_1)_0 + (f_2)_0} \right). C\)
di mana:
\[
\begin{aligned}
tb &= \text{batas bawah untuk kelas di mana modus berada} \\
C &= \text{interval kelas} \\
(f_1)_0 &= \text{selisih frekuensi yang memuat modus dengan
frekuensi kelas sebelumnya} \\
(f_2)_0 &= \text{selisih frekuensi yang memuat modus dengan
frekuensi kelas sesudahnya}
\end{aligned}
\]
contoh :
Sebuah sampel nilai penjualan mingguan (dalam juta rupiah) dari 60
penyalur barang antik di kota mojokerto disajikan seperti berikut :
Tabel Data Kelompok untuk modus frekuensi kumulatif dengan
outliers dan tanpa outliers
| 10 - 14 |
4 |
14,5 |
| 15 - 19 |
5 |
19,5 |
| 20 - 24 |
8 |
24,5 |
| 25 - 29 |
13 |
29,5 |
| 30 - 34 |
20 |
34,5 |
| 35 - 39 |
10 |
39,5 |
Dari tabel diatas, frekuensi modusnya adalah 20 dengan letak kelas
ke-5 dan kelas nyatanya adalah 29,5 - 34,5. jadi :
\[
(f_1)_0= 20 - 13 = 7 \\
(f_2)_0 = 20 - 10 = 10 \\
tb = 29, 5 \\
C = 5
\]
Cara menghitung modus dengan Outliers ::
\[
\begin{aligned}
\text{Mod} = tb + \left( \frac{(f_1)_0}{(f_1)_0 + (f_2)_0}. C \right)
\end{aligned}
\]
\[
\begin{aligned}
\text{Mod} &= 29,5 \left( \frac{7}{7 + 10} \right). 5 \\
&= 29,5 + (0,41)(5) \\
&= 29,5 + 2,05 \\
&= 31,55
\end{aligned}
\]
Jadi, modus dari nilai penjualan mingguan 60 penyalur barang antik
dikota mojokerto adalah sebanyak Rp. 31,55 Juta.
Cara menghitung modus tanpa Outliers :
\[
\begin{aligned}
\text{Mod} = tb + \left( \frac{(f_1)_0}{(f_1)_0 + (f_2)_0}. C \right)
\end{aligned}
\]
dengan parameter :
\[
𝑓_𝑚 = 20 \\
(f_1)_0= 20 - 13 = 7 \\
(f_2)_0 = 20 - 10 = 10 \\
tb = 29, 5 \\
C = 5
\]
\[
\begin{aligned}
\text{Mod} &= 29,5 \left( \frac{7}{7 + 10} \right). 5 \\
&= 29,5 + (0,41)(5) \\
&= 29,5 + 2,05 \\
&= 31,55
\end{aligned}
\]
Kesimpulan :
Modus dengan dan tanpa outliers menghasilkan nilai yang sama,
yaitu 31.56. Hal ini menunjukkan bahwa data dalam kelompok ini cukup
stabil, sehingga keberadaan atau ketiadaan outliers tidak memengaruhi
nilai modus. dan pada tabel Menggunakan semua data asli tanpa
menghilangkan nilai ekstrem.
Modus 31.56 merepresentasikan nilai yang paling sering muncul
dalam dataset ini, baik dengan maupun tanpa mempertimbangkan adanya
outliers, sehingga mencerminkan karakteristik utama distribusi data.
pada tabel dia Sama dengan data asli karena tidak ada nilai ekstrem
(outliers) yang terdeteksi.
Modus dalam bentuk boxplot :
Modus dalam bentuk histogram :
1.2 Praktikum 2
1.2.1 Bisnis
Topik: Analisis data pendapatan bulanan karyawan
Sebuah perusahaan ingin menganalisis data pendapatan bulanan karyawan
dari 40 orang. Berikut adalah data yang telah dikelompokkan dalam tabel
frekuensi:
Tabel Data Kelompok untuk data kelompok gaji karyawan
| 1.000.000 - 1.999.999 |
5 |
| 2.000.000 - 2.999.999 |
10 |
| 3.000.000 - 3.999.999 |
15 |
| 4.000.000 - 4.999.999 |
8 |
| 5.000.000 - 5.999.999 |
2 |
Penyelesaian :
Diketahui bahwa titik tengah, Frekuensi Kumulatif adalah sebagai
berikut :
Tabel Data Kelompok untuk frekuensi kumulatif dan titik tengah
dengan outliers
| 1.000.000 - 1.999.999 |
5 |
5 |
1.500.000 |
7.500.000 |
| 2.000.000 - 2.999.999 |
10 |
15 |
2.500.000 |
25.000.000 |
| 3.000.000 - 3.999.999 |
15 |
30 |
3.500.000 |
52.500.000 |
| 4.000.000 - 4.999.999 |
8 |
38 |
4.500.000 |
36.000.000 |
| 5.000.000 - 5.999.999 |
2 |
40 |
5.500.000 |
11.000.000 |
Mean :
Jumlah total frekuensi \(𝑁= 5 + 10 + 15 + 8
+ 2 = 40\)
hitung rata-rata gaji karyawan dengan perkalian frekuensi dengan
titik tengah, lalu dibagi dengan jumlah total frekuensi:
Menggunakan Outliers:
\[
\begin{aligned}
\bar{X} = \frac{\sum fX}{n} = \frac {5(1.500.000)+ 10(2.500.000)+
15(3.500.000)+ 8(4.500.000)+ 2(5.500.000)}{40}
\end{aligned}
\] \[
\begin{aligned}
= \frac {132.000.000}{40}
= 3.300.000
\end{aligned}
\]
Tanpa menggunakan Outliers :
Tabel Data Kelompok untuk frekuensi kumulatif dan titik tengah
tanpa outliers
| 1.000.000 - 1.999.999 |
5 |
1.500.000 |
7.500.000 |
| 2.000.000 - 2.999.999 |
10 |
2.500.000 |
25.000.000 |
| 3.000.000 - 3.999.999 |
15 |
3.500.000 |
52.500.000 |
| 4.000.000 - 4.999.999 |
8 |
4.500.000 |
36.000.000 |
Total \({fX}{n}\) tanpa outliers
:
\[
7.500.000+25.000.000+52.500.000+36.000.000=121.000.000
\]
Total Frekuensi tanpa outliers :
\[
5+10+15+8=38
\]
Lalu Masukan dalam rumus ( tanpa outliers) :
\[
\bar{X} = \frac {121.000.000}{38} = 3.184.211
\]
Kesimpulan :
Mean dengan outliers menghasilkan nilai sebesar 3.300.000. Hal
ini menunjukkan bahwa keberadaan data ekstrem pada rentang gaji
5.000.000 - 5.999.999 memengaruhi hasil rata-rata, sehingga menghasilkan
nilai yang lebih tinggi dibandingkan dengan mayoritas data. Mean ini
cocok digunakan jika analisis memerlukan inklusi data ekstrem, misalnya
untuk memahami distribusi gaji tinggi.
Mean tanpa outliers menghasilkan nilai sebesar 3.184.211, yang
lebih mencerminkan kondisi mayoritas data setelah menghilangkan pengaruh
rentang gaji ekstrem. Mean ini lebih stabil dan relevan untuk analisis
yang fokus pada tren utama dalam distribusi gaji.
Median :
Menggunakan Outliers:
\[
\begin{aligned}
\text{Median} = tb + \left( \frac{\frac{n}{2} - F}{F_m} \right). C
\end{aligned}
\]
\[
\begin{aligned}
= 2.999.999,5 + \left( \frac{\frac{40}{2} - 15}{15} \right) 1.000.000 \\
= 2.999.999,5 + \left( \frac{20 - 15}{15} \right) 1.000.000 \\ =
2.999.999,5 + 333.333,3 \\
= 3.333.332,8 Rp
\end{aligned}
\]
Tanpa menggunakan outliers
Posisi median untuk 𝑛 = 38 adalah:
\[
\frac {n}{2} = \frac {38}{2} = 19
\] Dimana:
𝐿 = batas bawah kelas median = 2.999.999 𝐹 = frekuensi kumulatif
sebelum kelas median = 15 𝑓_𝑚 = frekuensi kelas median = 15 𝑐= panjang
kelas = 1.000.000
\[
\begin{aligned}
= 2.999.999,5 + \left( \frac{\frac{38}{2} - 15}{15} \right) 1.000.000 \\
= 2.999.999,5 + \left( \frac{19 - 15}{15} \right) 1.000.000 \\ =
2.999.999,5 + 266.666,67 \\
= 3.266.666 Rp
\end{aligned}
\]
Kesimpulan :
Dengan outliers, median yang lebih tinggi (3.333.333)
mencerminkan keberadaan data yang sangat tinggi, yaitu rentang gaji
5.000.000 - 5.999.999, yang dapat menggeser nilai tengah ke
atas.
Tanpa outliers, median yang lebih rendah (3.266.666) memberikan
gambaran yang lebih akurat dan representatif tentang nilai tengah
distribusi gaji penyalur jika mengabaikan data yang tidak biasa atau
ekstrim.
Oleh karena itu, pemilihan antara menggunakan median dengan atau
tanpa outliers sangat bergantung pada tujuan analisis. Jika tujuan
analisis adalah menggambarkan distribusi keseluruhan data, termasuk
ekstrem, maka median dengan outliers adalah pilihan yang tepat. Namun,
jika ingin fokus pada distribusi mayoritas tanpa dipengaruhi oleh data
ekstrim, maka median tanpa outliers lebih sesuai.
Modus :
Menggunakan Outliers dan tidak menggunakan Outliers:
\[
\begin{aligned}
\text{Modus} = tb + \left( \frac{(f_1 - f_0) }{f_1 - f_0 + (f_1 - f_2)}
\right).C
\end{aligned}
\]
\[
\begin{aligned}
\text{Mod} = tb + \left( \frac{(f_1)_0}{(f_1)_0 + (f_2)_0} \right) .c
\end{aligned}
\]
\[
\begin{aligned}
\text{Modus} = 2.999.999,5 + \left( \frac{15−10 }{ (15−10) + (15 - 8)}
\right) \times 1.000.000
\end{aligned}
\]
\[
\begin{aligned}
\text{Mod} &= 2.999.999,5 \left( \frac{5}{5 + 7} \right)
1.000.000\\
&= 2.999.999,5+ (416.667) \\
&= 3.416.666,5
\end{aligned}
\]
kelas pendapatan 4.000.000 - 4.999.999 adalah yang paling banyak
muncul, sehingga modus memberikan kita indikasi bahwa pendapatan yang
paling sering ditemukan di antara karyawan adalah sekitar Rp
3.416.666,5.
Kesimpulan :
Modus dengan outliers menghasilkan nilai sebesar 3.416.667,
mencakup seluruh data termasuk rentang gaji ekstrem (outliers). Nilai
ini mencerminkan kelas dengan frekuensi tertinggi, yaitu kelas 3.000.000
- 3.999.999, yang tetap dominan meskipun ada pengaruh data
ekstrem.
Modus tanpa outliers juga menghasilkan nilai sebesar 3.416.667.
Hal ini menunjukkan bahwa penghapusan outliers tidak memengaruhi hasil,
karena kelas dengan frekuensi tertinggi tetap berada di rentang yang
sama, yaitu kelas 3.000.000 - 3.999.999.
Kesimpulan: Modus dengan dan tanpa outliers memberikan hasil yang
sama dalam kasus ini. Hal ini menunjukkan bahwa data cukup
terkonsentrasi pada kelas dengan frekuensi tertinggi, sehingga data
ekstrem tidak memengaruhi nilai modus secara signifikan.
1.2.2 Kesehatan
Topik: Analisis Distribusi Jumlah Dosis Vaksinasi COVID-19 di Kota
Mojokerto
Sebuah dinas kesehatan di kota Mojokerto menganalisis jumlah dosis
vaksinasi COVID-19 yang telah diberikan kepada penduduk dalam kelompok
usia tertentu. Data jumlah dosis vaksin yang diterima penduduk di kota
mojokerto dikelompokkan berdasarkan kelompok usia sebagai berikut:
Tabel Data Kelompok untuk analisis ditribusi jumlah
vaksin
| 18 - 29 |
1000 |
| 30 - 39 |
1500 |
| 40 - 49 |
1200 |
| 50 - 59 |
800 |
| 60 - 69 |
500 |
Penyelesaian :
Diketahui bahwa titik tengah, Frekuensi Kumulatif adalah sebagai
berikut :
Tabel Data Kelompok untuk frekuensi kumulatif dan nilai tengah
analisis menggunakan outliers
| 18 - 29 |
1000 |
1000 |
23.5 |
23,500 |
| 30 - 39 |
1500 |
2500 |
34.5 |
51,750 |
| 40 - 49 |
1200 |
3700 |
44.5 |
53,400 |
| 50 - 59 |
800 |
4500 |
54.5 |
43,600 |
| 60 - 69 |
500 |
5000 |
64.5 |
32,250 |
Mean :
Jumlah total frekuensi 𝑁= 1000 + 1500 + 1200 + 800 + 500 = 5000
hitung rata-rata dosis vaksinasi:
Menggunakan Outliers
\[
\begin{aligned}
\bar{X} = \frac{\sum fX}{n} = \frac {1000(23.5)+ 1500(34.5)+ 1200(44.5)+
800(54.5)+ 500(64.5)}{5000}
\end{aligned}
\] \[
\begin{aligned}
= \frac {204,500}{5000}
= 40.9tahun
\end{aligned}
\]
Tanpa menggunakan Outliers
Tabel Data Kelompok untuk frekuensi kumulatif dan nilai tengah
analisis tanpa outliers
| 18 - 29 |
1000 |
23.5 |
23,500 |
| 30 - 39 |
1500 |
34.5 |
51,750 |
| 40 - 49 |
1200 |
44.5 |
53,400 |
| 50 - 59 |
800 |
54.5 |
43,600 |
Total frekuensi tanpa outliers:
\[
n=1000+1500+1200+800=4500
\]
Menghitung Mean Tanpa Outliers:
\[
\begin{aligned}
\bar{X} = {\sum fX} = {23,500+ 51,750 + 53,400 + 43,600} = 172,250
\end{aligned}
\] \[
\begin{aligned}
= \frac {172,250}{4500}
= 38.22 tahun
\end{aligned}
\]
Kesimpulan :
Mean dengan Outliers adalah 40.9, yang mencakup seluruh data,
termasuk kelompok usia 60 - 69 yang dianggap sebagai outlier.
Mean tanpa Outliers adalah 38.22, yang diperoleh setelah
mengabaikan kelompok usia 60 - 69 yang dianggap sebagai
outlier.
Pengaruh Outliers: Mean dengan outliers lebih tinggi, menunjukkan
pengaruh kelompok usia yang lebih tua yang memiliki nilai lebih tinggi
(64.5), yang mempengaruhi rata-rata keseluruhan. Setelah menghapus data
outlier, rata-rata menjadi lebih rendah, mencerminkan distribusi data
mayoritas penerima vaksin.
Median :
Menggunakan Outliers
\[
\begin{aligned}
\text{Median} = tb + \left( \frac{\frac{n}{2} - F}{F_m} \right). C
\end{aligned}
\]
\[
\begin{aligned}
\text{Median} &= 29.5 + \left( \frac{\frac{5000}{2} - 1000}{1500}
\right) 10 \\
&= 29.5 + \left( \frac{2500 - 1000}{1500} \right) 10 \\ &= 29.5
+ 10 \\ &=39.5 tahun
\end{aligned}
\]
Tanpa menggunakan Outliers
Jumlah total frekuensi tanpa outliers 𝑛=4500
\[
\frac {n}{2} = \frac {4500}{2} = 2250
\] menghitung median tanpa outliers :
\[
\begin{aligned}
\text{Median} &= 29.5 + \left( \frac{\frac{4500}{2} - 1000}{1500}
\right) 10 \\
&= 29.5 + \left( \frac{2250 - 1000}{1500} \right) 10 \\ &= 29.5
+ 8.33 \\ &=37.83 tahun
\end{aligned}
\]
Kesimpulan :
Median dengan Outliers (menghitung dengan seluruh data) adalah
39.5.
Median tanpa Outliers (mengabaikan kelompok usia 60 - 69 sebagai
outlier) adalah 37.83.
Pengaruh Outliers: Perbedaan nilai median menunjukkan bahwa
kelompok usia yang lebih tua (60 - 69) yang dianggap sebagai outlier
memiliki dampak pada nilai median. Setelah mengabaikan outlier, nilai
median sedikit lebih rendah, mencerminkan distribusi data mayoritas
penerima vaksin yang lebih terpusat.
Modus :
Menggunnakan Outliers dan tanpa menggunakan Outliers
\[
\begin{aligned}
\text{Modus} = tb + \left( \frac{(f_1 - f_0) }{f_1 - f_0 + (f_1 - f_2)}
\right).C
\end{aligned}
\]
\[
\begin{aligned}
\text{Mod} = tb + \left( \frac{(f_1)_0}{(f_1)_0 + (f_2)_0} \right).C
\end{aligned}
\]
\[
\begin{aligned}
\text{Mod} &= 29.5 \left( \frac{500}{500 + 300} \right) 10\\
&= 29.5 + (0.625) \\ &= 35.75tahun
\end{aligned}
\]
Jadi modus diatas terdapat pada usia sekitar 36.25 tahun adalah usia
yang paling sering mendapatkan vaksin, yang termasuk dalam kelompok usia
30 - 39 tahun.
Kesimpulan :
Nilai modus tidak terpengaruh oleh outliers dalam data
ini.
Hal ini disebabkan oleh posisi kelas modus ( 30 − 39 ) yang tidak
berubah meskipun outlier (kelas 60−69) dikeluarkan.
Modus memberikan informasi tentang kelompok usia yang paling umum
dalam data penerima vaksin, yaitu 30 - 39 tahun, terlepas dari
keberadaan outliers.
Penggunaan batas bawah 𝐿= 29.5 menghasilkan nilai modus yang sama
untuk kedua metode. Ini terjadi karena frekuensi tertinggi tetap berada
di kelas yang sama ( 30 − 39), sehingga outlier tidak memengaruhi hasil
perhitungan modus.
Validasi Data
untuk memvalidasi data maka menggunakan presentase efektivitas
vaksinasi tiap kelompok usia ( dalam bentuk % ) :
Tabel Data Kelompok untuk mevalidasi data menggunakan
presentase efektivitas vaksinasi
| 18 - 29 |
1000 |
98% |
| 30 - 39 |
1500 |
97% |
| 40 - 49 |
1200 |
95% |
| 50 - 59 |
800 |
90% |
| 60 - 69 |
500 |
85% |
Langkah-langkah validasi:
- Menghitung Total Efektivitas Vaksinasi dengan rumus :
\[
\text{Rata-rata Efektivitas} = \frac{\Sigma (\text{Frekuensi} \times
\text{Efektivitas})}{\Sigma (\text{Frekuensi})}
\]
Perhitungan:
\[
\begin{aligned}
\text{Rata-rata Efektivitas} = \frac{(1000 \times 98) + (1500 \times 97)
+ (1200 \times 95) + (800 \times 90) + (500 \times 85)}{5000}
\end{aligned}
\]
\[
\begin{aligned}
= \frac{98000 + 145500 + 114000 + 72000 + 42500}{5000}
\end{aligned}
\]
\[
\begin{aligned}
= \frac{472000}{5000} = 94.4\%
\end{aligned}
\]
Jadi, rata-rata efektivitas vaksinasi adalah \({94.4\%}\).
- Membandingkan dengan Ambang Keberhasilan 99% :
Jika standar keberhasilan adalah 99%, rata-rata efektivitas sebesar
94.4% belum mencapai angka ini. Dengan demikian, vaksinasi pada kelompok
ini belum memenuhi kriteria keberhasilan 99%.
- Analisis Per Kelompok Usia yang mendekati atau melebihi 99%:
Kelompok usia 18 - 29 tahun memiliki efektivitas tertinggi, yaitu
98%, tetapi masih di bawah 99%.
Kelompok lainnya memiliki efektivitas yang semakin menurun dengan
bertambahnya usia.
- Kesimpulan Validasi:
Secara keseluruhan, rata-rata efektivitas vaksinasi adalah 94.4%,
yang belum mencapai target keberhasilan 99%.
Per kelompok, tidak ada kelompok yang mencapai atau melebihi
ambang 99%.
Untuk mencapai keberhasilan 99%, diperlukan strategi tambahan,
seperti meningkatkan cakupan vaksinasi, optimasi dosis untuk kelompok
usia tertentu, atau evaluasi terhadap jenis vaksin yang
digunakan.
1.2.3 Pendidikan
Topik: Menganalisis bagaimana penggunaan media sosial memengaruhi
produktivitas belajar siswa.
data tentang waktu penggunaan media sosial siswa setiap hari (dalam
jam) dan rata-rata nilai ujian yang mereka peroleh. Data dibagi dalam
kelompok waktu penggunaan media sosial sebagai berikut :
Tabel Data Kelompok untuk median frekuensi kumulatif
| 0 - 1 |
8 |
85 |
| 2 - 3 |
12 |
75 |
| 4 - 5 |
10 |
65 |
| 6 - 7 |
5 |
60 |
Penyelesaian :
Diketahui bahwa titik tengah, Frekuensi Kumulatif adalah sebagai
berikut :
Tabel Data Kelompok untuk frekuensi kumulatif dan nilai tengah
analisis menggunakan outliers
| 0 - 1 |
8 |
8 |
0.5 |
4 |
| 2 - 3 |
12 |
20 |
2.5 |
30 |
| 4 - 5 |
10 |
30 |
4.5 |
45 |
| 6 - 7 |
5 |
35 |
6.5 |
32.5 |
Mean :
Total frekuensi \((𝑁) = 35\)
Total \(𝑓.𝑥 = 4 + 30 + 45 + 32.5 =
111.5\)
hitung rata-rata penggunaan media sosial:
Menggunakan Outliers
\[
\begin{aligned}
\bar{X} = \frac{\sum fX}{n} = \frac {8(0.5)+ 12(2.5)+ 10(4.5)+
5(6.5)}{35}
= \frac {111.5}{35}
= 3.18 jam/hari.
\end{aligned}
\]
Tanpa menggunakan outliers
- Hitung total hasil kali 𝑓⋅𝑥 tanpa outliers:
\[
Total f⋅x = 4 + 30 + 45 = 79
\] - Jumlah frekuensi (𝑛) tanpa outliers:
\[
n = 8 + 12 + 10 = 30
\]
\[
\begin{aligned}
\bar{X} = \frac{\sum fX}{n} = \frac {8(0.5)+ 12(2.5)+ 10(4.5)}{30}
= \frac {79}{30}
= 2.63 jam/hari.
\end{aligned}
\]
Kesimpulan :
Pengaruh outliers pada mean sangat signifikan. Nilai mean dengan
outliers lebih tinggi dibandingkan tanpa outliers.
Mean tanpa outliers memberikan representasi yang lebih akurat
terhadap waktu penggunaan media sosial mayoritas siswa.
Keputusan untuk menggunakan mean dengan atau tanpa outliers
tergantung pada tujuan analisis:
Dengan outliers: Menggambarkan seluruh distribusi data, termasuk
ekstrem.
Tanpa outliers: Memberikan gambaran yang lebih stabil dan
realistis terhadap data umum.
Median :
Menggunakan Outliers
\[
\begin{aligned}
\text{Median} = L_0 + \left( \frac{\frac{n}{2} - F}{F_m} \right). C
\end{aligned}
\]
\[
\begin{aligned}
\text{Median} &= 2 + \left( \frac{\frac{35}{2} - 8}{12} \right) 2 \\
&= 2 + \left( \frac{17.5−8}{12} \right) 2 \\ &= 2+ 1,58 \\
&=3.58 jam/hari.
\end{aligned}
\]
tanpa menggunakan ourliers
Tabel Data Kelompok untuk frekuensi kumulatif dan nilai tengah
analisis tanpa outliers
| 0 - 1 |
8 |
8 |
| 2 - 3 |
12 |
20 |
| 4 - 5 |
10 |
30 |
\[
\frac{n}{2} = \frac{30}{2} = 15
\] - hitung median :
\[
\begin{aligned}
\text{Median} &= 2 + \left( \frac{\frac{30}{2} - 8}{12} \right) 2 \\
&= 2 + \left( \frac{15−8}{12} \right) 2 \\ &= 2+ 1,17 \\
&=3.17 jam/hari.
\end{aligned}
\]
Kesimpulan :
Pengaruh outliers pada median tidak terlalu besar, tetapi tetap
memberikan perbedaan. Median dengan outliers sedikit lebih tinggi,
mencerminkan pengaruh data ekstrem pada nilai tengah.
Median tanpa outliers memberikan gambaran yang lebih stabil dan
representatif untuk mayoritas data, dengan waktu penggunaan media sosial
yang lebih realistis bagi sebagian besar siswa.
Modus :
Menggunakan Outliers dan tanpa outliers
\[
\begin{aligned}
\text{Modus} = L_0 + \left( \frac{(f_1 - f_0) }{f_1 - f_0 + (f_1 - f_2)}
\right) C
\end{aligned}
\]
\[
\begin{aligned}
\text{Mod} = L_0 \left( \frac{(f_1)_0}{(f_1)_0 + (f_2)_0} \right).C
\end{aligned}
\] \[
\begin{aligned}
\text{Modus} = 2 + \left( \frac{(12−8) }{12 - 8 + (12 - 10)} \right). 2
\end{aligned}
\] \[
\begin{aligned}
\text{Mod} &= 2 \left( \frac{4}{4 + 2} \right). 2\\
&= 2+1.33 \\ &= 3.33 jam/hari.
\end{aligned}
\]
Berdasarkan perhitungan menggunakan metode modus, ditemukan bahwa
kelas interval 2 - 3 jam/hari adalah kelas dengan frekuensi tertinggi,
yaitu sebanyak 12 siswa. Dengan didapatkan nilai modus sebesar 2.67
jam/hari.
Kesimpulan :
Modus dengan dan tanpa outliers menghasilkan nilai yang sama
dalam kasus ini. Ini menunjukkan bahwa data dalam kelompok ini cukup
terkonsentrasi pada kelas dengan frekuensi tinggi (2 - 3 jam/hari),
sehingga pengaruh data ekstrem pada kelas 6 - 7 jam/hari tidak terlalu
mempengaruhi nilai modus.
Modus yang ditemukan adalah 3.33 jam/hari, yang menunjukkan waktu
penggunaan media sosial yang paling umum digunakan oleh siswa dalam
dataset ini, baik dengan maupun tanpa memperhitungkan outliers.
LS0tDQp0aXRsZTogIlR1Z2FzIFByYWt0aWt1bSAxIGRhbiAyIg0KYXV0aG9yOiAiV2hpcmR5YW5hIFNoYWxmYSBBeXViaSINCmRhdGU6ICAiYHIgZm9ybWF0KFN5cy5EYXRlKCksICclQiAlZCwgJVknKWAiDQpvdXRwdXQ6IA0KICBybWRmb3JtYXRzOjpyZWFkdGhlZG93bjogICAjIGh0dHBzOi8vZ2l0aHViLmNvbS9qdWJhL3JtZGZvcm1hdHMNCiAgICBzZWxmX2NvbnRhaW5lZDogdHJ1ZQ0KICAgIHRodW1ibmFpbHM6IHRydWUNCiAgICBsaWdodGJveDogdHJ1ZQ0KICAgIGdhbGxlcnk6IHRydWUNCiAgICBsaWJfZGlyOiBsaWJzDQogICAgZGZfcHJpbnQ6ICJwYWdlZCINCiAgICBjb2RlX2ZvbGRpbmc6ICJzaG93Ig0KICAgIGNvZGVfZG93bmxvYWQ6IHllcw0KICAgIGNzczogIkM6L1VzZXJzL1NBTEZBL09uZURyaXZlL0RvY3VtZW50cy9wcmFrdGlrdW0vc3R5bGUuY3NzIg0KLS0tDQoNCi0tLQ0KDQpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0NCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSkNCmBgYA0KDQojIDEuMSBQcmFrdGlrdW0gMQ0KDQojIDEuMS4xIE1lYW4gdW50dWsgRGF0YSBLZWxvbXBvaw0KDQogTWVhbiAocmF0YS1yYXRhKSBhZGFsYWggdWt1cmFuIHBlbXVzYXRhbiB5YW5nIHBhbGluZyB1bXVtIGRpZ3VuYWthbiBkYWxhbSBzdGF0aXN0aWsuIERhdGEga2Vsb21wb2sgYWRhbGFoIGRhdGEgeWFuZyBzdWRhaCBkaWtlbG9tcG9ra2FuIGRhbGFtIGJlbnR1ayBkYXRhIGtlbG9tcG9rLiBNZW5naGl0dW5nIG1lYW4gcGFkYSBkYXRyYSBrZWxvbXBvayB0aWRhayBiZXJiZWRhIGRlbmdhbiBwZXJoaXR1bmdhbiBkaXN0cmlidXNpIGZyZWt1ZW5zaSB0dW5nZ2FsLiBIYW55YSBuaWxhaSBYIHRpZGFrIG1ld2FraWxpIG5pbGFpIHZhcmlhYmxlIGluZGl2aWR1LG1lbGFpbmthbiBtZXdha2lsaSB0aXRpayB0ZW5nYWggaW50ZXJ2YWwuDQogDQoNCiBMYW5na2FoIGxhbmdrYWggdW50dWsgbWVuZ2hpdHVuZyBtZWFuIHNlYmFnYWkgYmVyaWt1dCA6DQoNCg0KLSBIaXR1bmcgbmlsYWkgdGVuZ2FoIChcKFhfaVwpKSBkYXJpIHNldGlhcCBrZWxhcyBpbnRlcnZhbDoNCg0KICAkWF9pID0gXGZyYWN7XHRleHR7VGVwaSBiYXdhaCBrZWxhc30gKyBcdGV4dHtUZXBpIGF0YXMga2VsYXN9fXsyfSQNCg0KDQotIEthbGlrYW4gRnJla3VlbnNpIChcKGZcKSkgZGVuZ2FuIE5pbGFpIFRlbmdhaCAoXChYX2lcKSl9IDoNCg0KICBIaXR1bmcgXChmIFxjZG90IFhfaVwpIHVudHVrIHNldGlhcCBrZWxhcw0KDQoNCi0gSGl0dW5nIFRvdGFsIFwoXHN1bSBmWFwpfSA6DQoNCiAgSnVtbGFoa2FuIHNlbXVhIGhhc2lsIGRhcmkgcGVya2FsaWFuIGZyZWt1ZW5zaSBkZW5nYW4gbmlsYWkgdGVuZ2FoIC4NCg0KDQotIEhpdHVuZyBUb3RhbCBGcmVrdWVuc2kgKFwoblwpKX0gOg0KDQogIEp1bWxhaGthbiBzZWx1cnVoIGZyZWt1ZW5zaSAo8J2RkykuDQoNCg0KLSBTdWJzdGl0dXNpIGtlIFJ1bXVzIE1lYW4gOg0KDQokJA0KXGJhcntYfSA9IFxmcmFje1xzdW0gZlh9e259DQokJA0KIA0KZGltYW5hIDogDQoNCg0KXGJlZ2lue2FsaWduZWR9DQpcYmFye1h9ICYgPSBcdGV4dHtyYXRhLXJhdGEgaGl0dW5nIGRhdGEgYmVya2Vsb21wb2t9IFxcDQpcc3VtIGZYICYgPSBcdGV4dHtqdW1sYWggZGFyaSBzZWx1cnVoIGhhc2lsIHBlcmthbGlhbiBhbnRhcmEgZnJla3VlbnNpIGRhbiBuaWxhaSB0ZW5nYWggbWFzaW5nLW1hc2luZyBrZWxhc30gXFwNCm4gJiA9IFx0ZXh0e2p1bWxhaCB0b3RhbCBkYXRhfQ0KXGVuZHthbGlnbmVkfQ0KDQoNCmNvbnRvaCA6DQoNCiAgRGliYXdhaCBpbmkgYWRhbGFoIGRhdGEgeWFuZyBzdWRhaCBkaWtlbG9tcG9rYW4gZGFyaSAyMCBwZXJ1c2FoYWFuIHlhbmcgc2FoYW1ueWEgbWVuamFkaSBwaWxpaGFuIHBhZGEgICAgIGJ1bGFuIG1hcmV0IDIwMDMuDQoNCmBgYHtyLCBlY2hvPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KIyBNZW1idWF0IGRhdGEga2Vsb21wb2sNCmxpYnJhcnkoa25pdHIpDQoNCmRhdGEgPC0gZGF0YS5mcmFtZSgNCiAgIkludGVydmFsIiA9IGMoIjE2MCAtIDMwMyIsICIzMDQgLSA0NDciLCAiNDQ4IC0gNTkxIiwgIjU5MiAtIDczNSIsICI3MzYgLSA4NzgiKSwNCiAgIk5pbGFpX1RlbmdhaCIgPSBjKCIyMzEsNSIsICIzNzUsNSIsICI1MTksNSIsICI2NjMsNSIsICI4MDciKSwNCiAgIkZyZWt1ZW5zaSIgPSBjKDIsIDUsIDksIDMsIDEpDQopDQojIE1lbmFtcGlsa2FuIHRhYmVsDQoNCmthYmxlKGRhdGEsIGFsaWduID0gImMiLCBjYXB0aW9uID0gIlRhYmVsIERhdGEgS2Vsb21wb2sgdW50dWsgbWVhbiIpDQoNCmBgYA0KDQojIyBQZW55ZWxlc2FpYW4gZGVuZ2FuIG91dGxpZXJzOg0KDQokJA0KXGJhcntYfSA9IFxmcmFje1xzdW0gZlh9e259ID0gXGZyYWMgezIoMjMxLDUpKyA1KDM3NSw1KSsgOSg1MTksNSkrIDMoNjYzLDUpKyAxKDgwNyl9ezIwfSANCj0gXGZyYWMgezkuODEzLDV9ezIwfQ0KPSA0OTAsNjgNCiQkDQoNCiMjIFBlbnllbGVzYWlhbiB0YW5wYSBvdXRsaWVyczoNCg0KJCQNClxiYXJ7WH0gPSBcZnJhY3tcc3VtIGZYfXtufSA9IFxmcmFjIHsyKDIzMSw1KSsgNSgzNzUsNSkrIDkoNTE5LDUpKyAzKDY2Myw1KX17MjB9IA0KPSBcZnJhYyB7OTAwNi41fXsxOX0NCj0gNDc0LDAzDQokJA0KDQojIyBLZXNpbXB1bGFuIDoNCg0KLSBSYXRhLXJhdGEgZGVuZ2FuIG91dGxpZXJzIG1lbmdoYXNpbGthbiBuaWxhaSA0OTAsNjgsIHlhbmcgbGViaWggdGluZ2dpIGRpYmFuZGluZ2thbiByYXRhLXJhdGEgdGFucGEgb3V0bGllcnMuIEhhbCBpbmkgbWVudW5qdWtrYW4gYmFod2Ega2ViZXJhZGFhbiBkYXRhIGVrc3RyZW0gKG91dGxpZXJzKSBtZW1lbmdhcnVoaSBoYXNpbCBwZXJoaXR1bmdhbiwgc2VoaW5nZ2EgbWVueWViYWJrYW4gbmlsYWkgcmF0YS1yYXRhIG1lbmphZGkgdGlkYWsgc2VwZW51aG55YSBtZXdha2lsaSBkaXN0cmlidXNpIGRhdGEgbWF5b3JpdGFzLg0KDQotIFJhdGEtcmF0YSB0YW5wYSBvdXRsaWVycyBtZW5naGFzaWxrYW4gbmlsYWkgNDc0LDAzLCB5YW5nIGxlYmloIG1lbmNlcm1pbmthbiBrYXJha3RlcmlzdGlrIHV0YW1hIGRhdGEuIFBlbmdoYXB1c2FuIG91dGxpZXJzIG1lbWJhbnR1IG1lbmd1cmFuZ2kgYmlhcyBkYWxhbSBwZXJoaXR1bmdhbiByYXRhLXJhdGEgZGFuIG1lbWJlcmlrYW4gaGFzaWwgeWFuZyBsZWJpaCByZXByZXNlbnRhdGlmIHRlcmhhZGFwIGRpc3RyaWJ1c2kgZGF0YSB1dGFtYS4NCg0KLSBEZW5nYW4gaXR1IGp1Z2EgcGVuZ2hhcHVzYW4gb3V0bGllcnMgcGVudGluZyB1bnR1ayBrZWR1YSBtZXRvZGUgaW5pIGFnYXIgbWVuZGFwYXRrYW4gZ2FtYmFyYW4geWFuZyBsZWJpaCBha3VyYXQgdGVudGFuZyB0cmVuIGF0YXUga2FyYWt0ZXJpc3RpayBkYXRhIHNlY2FyYSBrZXNlbHVydWhhbi4NCg0KIyMgTWVhbiBkYWxhbSBiZW50dWsgYm94cGxvdCA6DQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIH0NCiMgTWVtdWF0IGxpYnJhcnkNCmxpYnJhcnkocGxvdGx5KQ0KDQojIERhdGE6IEludGVydmFsIG5pbGFpIGRhbiBmcmVrdWVuc2kNCmludGVydmFsIDwtIGMoIjE2MCAtIDMwMyIsICIzMDQgLSA0NDciLCAiNDQ4IC0gNTkxIiwgIjU5MiAtIDczNSIsICI3MzYgLSA4NzgiKQ0KZnJla3VlbnNpX2Rlbmdhbl9vdXRsaWVycyA8LSBjKDIsIDUsIDksIDMsIDEpICAjIERlbmdhbiBvdXRsaWVycw0KZnJla3VlbnNpX3RhbnBhX291dGxpZXJzIDwtIGMoMiwgNSwgOSwgMywgMCkgICAgICMgVGFucGEgb3V0bGllcnMgKG1lbmdoYXB1cyBrZWxhcyA3MzYgLSA4NzgpDQoNCiMgTmlsYWkgdGVuZ2FoIHVudHVrIHNldGlhcCBpbnRlcnZhbA0KbmlsYWlfdGVuZ2FoIDwtIGMoMjMxLjUsIDM3NS41LCA1MTkuNSwgNjYzLjUsIDgwNykNCg0KIyBNZW5naGl0dW5nIHRvdGFsIGZyZWt1ZW5zaSB1bnR1ayBrZWR1YSBkYXRhc2V0DQp0b3RhbF9mcmVrdWVuc2lfZGVuZ2FuX291dGxpZXJzIDwtIHN1bShmcmVrdWVuc2lfZGVuZ2FuX291dGxpZXJzKQ0KdG90YWxfZnJla3VlbnNpX3RhbnBhX291dGxpZXJzIDwtIHN1bShmcmVrdWVuc2lfdGFucGFfb3V0bGllcnMpDQoNCiMgTWVuZ2hpdHVuZyByYXRhLXJhdGEgKG1lYW4pIHVudHVrIGtlZHVhIGRhdGFzZXQNCm1lYW5fZGVuZ2FuX291dGxpZXJzIDwtIHN1bShmcmVrdWVuc2lfZGVuZ2FuX291dGxpZXJzICogbmlsYWlfdGVuZ2FoKSAvIHRvdGFsX2ZyZWt1ZW5zaV9kZW5nYW5fb3V0bGllcnMNCm1lYW5fdGFucGFfb3V0bGllcnMgPC0gc3VtKGZyZWt1ZW5zaV90YW5wYV9vdXRsaWVycyAqIG5pbGFpX3RlbmdhaCkgLyB0b3RhbF9mcmVrdWVuc2lfdGFucGFfb3V0bGllcnMNCg0KIyBNZW1idWF0IGRhdGEgdW50dWsgYm94cGxvdA0KIyBEYXRhIGRlbmdhbiBvdXRsaWVycw0KZGF0YV9kZW5nYW5fb3V0bGllcnMgPC0gcmVwKG5pbGFpX3RlbmdhaCwgZnJla3VlbnNpX2Rlbmdhbl9vdXRsaWVycykNCiMgRGF0YSB0YW5wYSBvdXRsaWVycw0KZGF0YV90YW5wYV9vdXRsaWVycyA8LSByZXAobmlsYWlfdGVuZ2FoLCBmcmVrdWVuc2lfdGFucGFfb3V0bGllcnMpDQoNCiMgTWVuZ2dhYnVuZ2thbiBkYXRhIGtlIGRhbGFtIHNhdHUgZGF0YSBmcmFtZSB1bnR1ayB2aXN1YWxpc2FzaQ0KZGF0YSA8LSBkYXRhLmZyYW1lKA0KICBOaWxhaSA9IGMoZGF0YV9kZW5nYW5fb3V0bGllcnMsIGRhdGFfdGFucGFfb3V0bGllcnMpLA0KICBLZWxvbXBvayA9IHJlcChjKCJEZW5nYW4gT3V0bGllcnMiLCAiVGFucGEgT3V0bGllcnMiKSwgDQogICAgICAgICAgICAgICAgIHRpbWVzID0gYyhsZW5ndGgoZGF0YV9kZW5nYW5fb3V0bGllcnMpLCBsZW5ndGgoZGF0YV90YW5wYV9vdXRsaWVycykpKQ0KKQ0KDQojIE1lbWJ1YXQgYm94cGxvdCBtZW5nZ3VuYWthbiBQbG90bHkNCnBsb3QgPC0gcGxvdF9seSgNCiAgZGF0YSwgDQogIHkgPSB+TmlsYWksIA0KICBjb2xvciA9IH5LZWxvbXBvaywgDQogIHR5cGUgPSAiYm94IiwgDQogIGJveHBvaW50cyA9ICJvdXRsaWVycyIsICAjIE1lbmFtcGlsa2FuIHRpdGlrIG91dGxpZXJzDQogIGJveG1lYW4gPSBUUlVFICAjIE1lbmFtcGlsa2FuIGdhcmlzIHBlbWJhdGFzIHVudHVrIHJhdGEtcmF0YQ0KKSAlPiUNCiAgbGF5b3V0KA0KICAgIHRpdGxlID0gIlBlbmdhcnVoIE91dGxpZXJzIHRlcmhhZGFwIE1lYW4iLA0KICAgIHlheGlzID0gbGlzdCh0aXRsZSA9ICJOaWxhaSIpLA0KICAgIHhheGlzID0gbGlzdCh0aXRsZSA9ICJLZWxvbXBvayIpLA0KICAgIGFubm90YXRpb25zID0gbGlzdCgNCiAgICAgIGxpc3QoDQogICAgICAgIHggPSAiRGVuZ2FuIE91dGxpZXJzIiwNCiAgICAgICAgeSA9IG1lYW5fZGVuZ2FuX291dGxpZXJzLA0KICAgICAgICB0ZXh0ID0gcGFzdGUoIk1lYW46Iiwgcm91bmQobWVhbl9kZW5nYW5fb3V0bGllcnMsIDIpKSwNCiAgICAgICAgc2hvd2Fycm93ID0gVFJVRSwNCiAgICAgICAgYXJyb3doZWFkID0gMg0KICAgICAgKSwNCiAgICAgIGxpc3QoDQogICAgICAgIHggPSAiVGFucGEgT3V0bGllcnMiLA0KICAgICAgICB5ID0gbWVhbl90YW5wYV9vdXRsaWVycywNCiAgICAgICAgdGV4dCA9IHBhc3RlKCJNZWFuOiIsIHJvdW5kKG1lYW5fdGFucGFfb3V0bGllcnMsIDIpKSwNCiAgICAgICAgc2hvd2Fycm93ID0gVFJVRSwNCiAgICAgICAgYXJyb3doZWFkID0gMg0KICAgICAgKQ0KICAgICkNCiAgKQ0KDQojIE1lbmFtcGlsa2FuIHBsb3QNCnBsb3QNCmBgYA0KDQojIyBNZWFuIGRhbGFtIGJlbnR1ayBoaXN0b2dyYW0gOg0KDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCB9DQojIE1lbXVhdCBsaWJyYXJ5DQpsaWJyYXJ5KHBsb3RseSkNCg0KIyBEYXRhOiBJbnRlcnZhbCBuaWxhaSBkYW4gZnJla3VlbnNpDQppbnRlcnZhbCA8LSBjKCIxNjAgLSAzMDMiLCAiMzA0IC0gNDQ3IiwgIjQ0OCAtIDU5MSIsICI1OTIgLSA3MzUiLCAiNzM2IC0gODc4IikNCmZyZWt1ZW5zaV9kZW5nYW5fb3V0bGllcnMgPC0gYygyLCA1LCA5LCAzLCAxKSAgIyBEZW5nYW4gb3V0bGllcnMNCmZyZWt1ZW5zaV90YW5wYV9vdXRsaWVycyA8LSBjKDIsIDUsIDksIDMsMCkgICAgICMgVGFucGEgb3V0bGllcnMgKG1lbmdoYXB1cyBrZWxhcyA3MzYgLSA4NzgpDQoNCiMgTmlsYWkgdGVuZ2FoIHVudHVrIHNldGlhcCBpbnRlcnZhbA0KbmlsYWlfdGVuZ2FoIDwtIGMoMjMxLjUsIDM3NS41LCA1MTkuNSwgNjYzLjUsIDgwNykNCg0KIyBNZW5naGl0dW5nIHRvdGFsIGZyZWt1ZW5zaSB1bnR1ayBrZWR1YSBkYXRhc2V0DQp0b3RhbF9mcmVrdWVuc2lfZGVuZ2FuX291dGxpZXJzIDwtIHN1bShmcmVrdWVuc2lfZGVuZ2FuX291dGxpZXJzKQ0KdG90YWxfZnJla3VlbnNpX3RhbnBhX291dGxpZXJzIDwtIHN1bShmcmVrdWVuc2lfdGFucGFfb3V0bGllcnMpDQoNCiMgTWVuZ2hpdHVuZyByYXRhLXJhdGEgKG1lYW4pIHVudHVrIGtlZHVhIGRhdGFzZXQNCm1lYW5fZGVuZ2FuX291dGxpZXJzIDwtIHN1bShmcmVrdWVuc2lfZGVuZ2FuX291dGxpZXJzICogbmlsYWlfdGVuZ2FoKSAvIHRvdGFsX2ZyZWt1ZW5zaV9kZW5nYW5fb3V0bGllcnMNCm1lYW5fdGFucGFfb3V0bGllcnMgPC0gc3VtKGZyZWt1ZW5zaV90YW5wYV9vdXRsaWVycyAqIG5pbGFpX3RlbmdhaCkgLyB0b3RhbF9mcmVrdWVuc2lfdGFucGFfb3V0bGllcnMNCg0KIyBNZW1idWF0IGRlbnNpdHkgcGxvdCB1bnR1ayBtYXNpbmctbWFzaW5nIGRhdGFzZXQNCiMgRGF0YSBkZW5nYW4gb3V0bGllcnMNCmRhdGFfZGVuZ2FuX291dGxpZXJzIDwtIHJlcChuaWxhaV90ZW5nYWgsIGZyZWt1ZW5zaV9kZW5nYW5fb3V0bGllcnMpDQojIERhdGEgdGFucGEgb3V0bGllcnMNCmRhdGFfdGFucGFfb3V0bGllcnMgPC0gcmVwKG5pbGFpX3RlbmdhaCwgZnJla3VlbnNpX3RhbnBhX291dGxpZXJzKQ0KDQojIE1lbmdoaXR1bmcgZGVuc2l0eSBwbG90DQpkZW5zaXR5X2Rlbmdhbl9vdXRsaWVycyA8LSBkZW5zaXR5KGRhdGFfZGVuZ2FuX291dGxpZXJzKQ0KZGVuc2l0eV90YW5wYV9vdXRsaWVycyA8LSBkZW5zaXR5KGRhdGFfdGFucGFfb3V0bGllcnMpDQoNCiMgUGFzdGlrYW4gdGlkYWsgYWRhIG5pbGFpIG5lZ2F0aWYgZGkgeCBkYW4geQ0KZGVuc2l0eV9kZW5nYW5fb3V0bGllcnMkeCA8LSBwbWF4KDAsIGRlbnNpdHlfZGVuZ2FuX291dGxpZXJzJHgpDQpkZW5zaXR5X3RhbnBhX291dGxpZXJzJHggPC0gcG1heCgwLCBkZW5zaXR5X3RhbnBhX291dGxpZXJzJHgpDQoNCiMgTWVtYnVhdCBwbG90IG1lbmdndW5ha2FuIFBsb3RseQ0KcGxvdCA8LSBwbG90X2x5KCkgJT4lDQogICMgTWVuYW1iYWhrYW4gZGVuc2l0eSBwbG90IHVudHVrIGRhdGFzZXQgZGVuZ2FuIG91dGxpZXJzDQogIGFkZF90cmFjZSgNCiAgICB4ID0gfmRlbnNpdHlfZGVuZ2FuX291dGxpZXJzJHgsDQogICAgeSA9IH5kZW5zaXR5X2Rlbmdhbl9vdXRsaWVycyR5LA0KICAgIHR5cGUgPSAnc2NhdHRlcicsDQogICAgbW9kZSA9ICdsaW5lcycsDQogICAgbmFtZSA9ICJEZW5nYW4gT3V0bGllcnMiLA0KICAgIGxpbmUgPSBsaXN0KGNvbG9yID0gJ3JnYmEoMjIyLCA0NSwgMzgsIDAuOCknLCB3aWR0aCA9IDIpDQogICkgJT4lDQogICMgTWVuYW1iYWhrYW4gZGVuc2l0eSBwbG90IHVudHVrIGRhdGFzZXQgdGFucGEgb3V0bGllcnMNCiAgYWRkX3RyYWNlKA0KICAgIHggPSB+ZGVuc2l0eV90YW5wYV9vdXRsaWVycyR4LA0KICAgIHkgPSB+ZGVuc2l0eV90YW5wYV9vdXRsaWVycyR5LA0KICAgIHR5cGUgPSAnc2NhdHRlcicsDQogICAgbW9kZSA9ICdsaW5lcycsDQogICAgbmFtZSA9ICJUYW5wYSBPdXRsaWVycyIsDQogICAgbGluZSA9IGxpc3QoY29sb3IgPSAncmdiYSgzOCwgMTY2LCA5MSwgMC44KScsIHdpZHRoID0gMikNCiAgKSAlPiUNCiAgIyBNZW5hbWJhaGthbiBnYXJpcyByYXRhLXJhdGEgdW50dWsgZGF0YXNldCBkZW5nYW4gb3V0bGllcnMNCiAgYWRkX3RyYWNlKA0KICAgIHggPSBjKG1lYW5fZGVuZ2FuX291dGxpZXJzLCBtZWFuX2Rlbmdhbl9vdXRsaWVycyksDQogICAgeSA9IGMoMCwgbWF4KGRlbnNpdHlfZGVuZ2FuX291dGxpZXJzJHkpKSwNCiAgICB0eXBlID0gInNjYXR0ZXIiLA0KICAgIG1vZGUgPSAibGluZXMiLA0KICAgIG5hbWUgPSAiUmF0YS1yYXRhIChEZW5nYW4gT3V0bGllcnMpIiwNCiAgICBsaW5lID0gbGlzdChjb2xvciA9ICdyZ2JhKDIyMiwgNDUsIDM4LCAwLjYpJywgZGFzaCA9ICdkYXNoJykNCiAgKSAlPiUNCiAgIyBNZW5hbWJhaGthbiBnYXJpcyByYXRhLXJhdGEgdW50dWsgZGF0YXNldCB0YW5wYSBvdXRsaWVycw0KICBhZGRfdHJhY2UoDQogICAgeCA9IGMobWVhbl90YW5wYV9vdXRsaWVycywgbWVhbl90YW5wYV9vdXRsaWVycyksDQogICAgeSA9IGMoMCwgbWF4KGRlbnNpdHlfdGFucGFfb3V0bGllcnMkeSkpLA0KICAgIHR5cGUgPSAic2NhdHRlciIsDQogICAgbW9kZSA9ICJsaW5lcyIsDQogICAgbmFtZSA9ICJSYXRhLXJhdGEgKFRhbnBhIE91dGxpZXJzKSIsDQogICAgbGluZSA9IGxpc3QoY29sb3IgPSAncmdiYSgzOCwgMTY2LCA5MSwgMC42KScsIGRhc2ggPSAnZGFzaCcpDQogICkgJT4lDQogIGxheW91dCgNCiAgICB0aXRsZSA9ICJQZW5nYXJ1aCBPdXRsaWVycyB0ZXJoYWRhcCBNZWFuIHBhZGEgRGVuc2l0eSBQbG90IiwNCiAgICB4YXhpcyA9IGxpc3QodGl0bGUgPSAiTmlsYWkiKSwNCiAgICB5YXhpcyA9IGxpc3QodGl0bGUgPSAiS2VwYWRhdGFuIiksDQogICAgYW5ub3RhdGlvbnMgPSBsaXN0KA0KICAgICAgIyBBbm90YXNpIHVudHVrIHJhdGEtcmF0YSBkYXRhc2V0IGRlbmdhbiBvdXRsaWVycw0KICAgICAgbGlzdCgNCiAgICAgICAgeCA9IG1lYW5fZGVuZ2FuX291dGxpZXJzLA0KICAgICAgICB5ID0gbWF4KGRlbnNpdHlfZGVuZ2FuX291dGxpZXJzJHkpICogMC45LA0KICAgICAgICB0ZXh0ID0gcGFzdGUoIk1lYW46Iiwgcm91bmQobWVhbl9kZW5nYW5fb3V0bGllcnMsIDIpKSwNCiAgICAgICAgc2hvd2Fycm93ID0gVFJVRSwNCiAgICAgICAgYXJyb3doZWFkID0gMiwNCiAgICAgICAgYXggPSAwLA0KICAgICAgICBheSA9IC0zMCwgICMgUG9zaXNpIHRla3Mgc2VkaWtpdCBsZWJpaCB0aW5nZ2kgZGFyaSBnYXJpcw0KICAgICAgICBmb250ID0gbGlzdChjb2xvciA9ICdyZ2JhKDIyMiwgNDUsIDM4LCAwLjgpJywgc2l6ZSA9IDEyKQ0KICAgICAgKSwNCiAgICAgICMgQW5vdGFzaSB1bnR1ayByYXRhLXJhdGEgZGF0YXNldCB0YW5wYSBvdXRsaWVycw0KICAgICAgbGlzdCgNCiAgICAgICAgeCA9IG1lYW5fdGFucGFfb3V0bGllcnMsDQogICAgICAgIHkgPSBtYXgoZGVuc2l0eV90YW5wYV9vdXRsaWVycyR5KSAqIDAuOSwNCiAgICAgICAgdGV4dCA9IHBhc3RlKCJNZWFuOiIsIHJvdW5kKG1lYW5fdGFucGFfb3V0bGllcnMsIDIpKSwNCiAgICAgICAgc2hvd2Fycm93ID0gVFJVRSwNCiAgICAgICAgYXJyb3doZWFkID0gMiwNCiAgICAgICAgYXggPSAwLA0KICAgICAgICBheSA9IC00NSwgICMgUG9zaXNpIHRla3Mgc2VkaWtpdCBsZWJpaCB0aW5nZ2kgZGFyaSBnYXJpcw0KICAgICAgICBmb250ID0gbGlzdChjb2xvciA9ICdyZ2JhKDM4LCAxNjYsIDkxLCAwLjgpJywgc2l6ZSA9IDEyKQ0KICAgICAgKQ0KICAgICkNCiAgKQ0KDQojIE1lbmFtcGlsa2FuIHBsb3QNCnBsb3QNCmBgYA0KDQoNCiMgMS4xLjIgTWVkaWFuIHVudHVrIERhdGEgS2Vsb21wb2sNCg0KICBNZWRpYW4gYWRhbGFoIG5pbGFpIHRlbmdhaCBkYWxhbSBzdWF0dSBrdW1wdWxhbiBkYXRhIHlhbmcgdGVsYWggZGl1cnV0a2FuIGRhcmkgZGF0YSB0ZXJrZWNpbCBoaW5nZ2EgdGVyYmVzYXIgYXRhdSBzZWJhbGlrbnlhLiBQZXJoaXR1bmdhbiBtZWRpYW4gZGVuZ2FuIGRhdGEga2Vsb21wb2sgZGFwYXQgZGlsYWt1a2FuIGRlbmdhbiBiYW50dWFuIGZyZWt1ZW5zaSBrdSxtdWxhdGlmIGt1cmFuZyBkYXJpLiANCiAgDQogIExhbmdrYWggbGFuZ2thaCB1bnR1ayBtZW5naGl0dW5nIG1lZGlhbiBzZWJhZ2FpIGJlaWt1dCA6DQoNCi0gSGl0dW5nIFRvdGFsIEZyZWt1ZW5zaSAo8J2RmykNCg0KLSBIaXR1bmcgbmlsYWkgXChcZnJhY3tufXsyfVwpDQoNCi0gS3VyYW5na2FuIFwoXHN1bSBmX3tpXzB9XCkgZGFyaSBcKFxmcmFje259ezJ9XCkNCg0KLSBCYWdpa2FuIGhhc2lsIHRlcnNlYnV0IGRlbmdhbiBcKGZfbVwpDQoNCi0gS2FsaWthbiBoYXNpbG55YSBkZW5nYW4gXChDXCkNCg0KLSBUYW1iYWhrYW4gaGFzaWwga2UgXCh0YlwpIHVudHVrIG1lbmRhcGF0a2FuIG1lZGlhbg0KDQotIFN1YnN0aXR1c2kga2UgUnVtdXMgTWVkaWFuOg0KDQokJA0KXHRleHR7TWVkfSA9IHRiICsgXGxlZnQoIFxmcmFje1xmcmFje259ezJ9IC0gXHN1bSBmX3tpXzB9fXtmX219IFxyaWdodCkuIEMNCiQkDQoNCmRpbWFuYSA6IA0KDQokJA0KXGJlZ2lue2FsaWduKn0NCnRiICYgPSBcdGV4dHtiYXRhcyBiYXdhaCB1bnR1ayBrZWxhcyBkaW1hbmEgbWVkaWFuIGJlcmFkYX0gXFwNCkMgJiA9IFx0ZXh0e2ludGVydmFsIGtlbGFzfSBcXA0KXHN1bSBmX3tpXzB9ICYgPSBcdGV4dHtqdW1sYWggZnJla3VlbnNpIGRhcmkgc2VtdWEga2VsYXMgZGliYXdhaCBrZWxhcyB5YW5nIG1lbmdhbmR1bmcgbWVkaWFufSBcXA0KZl9tICYgPSBcdGV4dHtmcmVrdWVuc2kgZGFyaSBrZWxhcyB5YW5nIG1lbmdhbmR1bmcgbWVkaWFufQ0KXGVuZHthbGlnbip9DQokJA0KY29udG9oIDogDQoNClRlcmRhcGF0IGRhdGEga2Vsb21wb2sgZGliYXdhaCBpbmksIGhpdHVuZyBiZXJhcGEgbWVkaWFubnlhICENCg0KYGBge3IsIGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQojIE1lbWJ1YXQgZGF0YSBrZWxvbXBvaw0KbGlicmFyeShrbml0cikNCg0KZGF0YSA8LSBkYXRhLmZyYW1lKA0KICAiTmlsYWkiID0gYygiMzEgLSA0MCIsICI0MSAtIDUwIiwgIjUxIC0gNjAiLCAiNjEgLSA3MCIsICI3MSAtIDgwIiwgIjgxIC0gOTAiLCAianVtbGFoIiksDQogICJGcmVrdWVuc2kiID0gYygzLCA1LCAxMCwgMTEsIDgsIDMsIDQwKQ0KKQ0KIyBNZW5hbXBpbGthbiB0YWJlbA0KDQprYWJsZShkYXRhLCBhbGlnbiA9ICJjIiwgY2FwdGlvbiA9ICJUYWJlbCBEYXRhIEtlbG9tcG9rIHVudHVrIG1lZGlhbiIpDQoNCmBgYA0KDQpwZW55ZWxlc2FpYW4gOg0KDQpKdW1sYWggZGF0YSBzZWJlc2FyIDQwLCBtYWthIG1lZGlhbm55YSB0ZXJsZXRhayBwYWRhIDoNCg0KJCQNClFfMiA9IFxmcmFjIHsxfXsyfSBcY2RvdCA0MCA9IDIwDQokJA0KTWFrYSBtZWRpYW4gdGVybGV0YWsgZGlkYXRhIGtlLTIwLg0KDQpTZWJlbHVtIGl0dSwga2l0YSBoYXJ1cyBtZW5lbnR1a2FuIGZyZWt1ZW5zaSBrdW11bGF0aWYgIDoNCg0KYGBge3IsIGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQojIE1lbWJ1YXQgZGF0YSBrZWxvbXBvaw0KbGlicmFyeShrbml0cikNCg0KZGF0YSA8LSBkYXRhLmZyYW1lKA0KICAiTmlsYWkiID0gYygiMzEgLSA0MCIsICI0MSAtIDUwIiwgIjUxIC0gNjAiLCAiNjEgLSA3MCIsICI3MSAtIDgwIiwgIjgxIC0gOTAiKSwNCiAgIkZyZWt1ZW5zaSIgPSBjKDMsIDUsIDEwLCAxMSwgOCwgMyksDQogICJGa2siID0gYygiMyIsICI4IiwgIjE4IiwgIjI5IiwgIjM3IiwgIjQwIikNCiAgIA0KKQ0KIyBNZW5hbXBpbGthbiB0YWJlbA0KDQprYWJsZShkYXRhLCBhbGlnbiA9ICJjIiwgY2FwdGlvbiA9ICJUYWJlbCBEYXRhIEtlbG9tcG9rIHVudHVrIG1lZGlhbiBmcmVrdWVuc2kga3VtdWxhdGlmIGRlbmdhbiBvdXRsaWVycyIpDQoNCmBgYA0KDQpQYWRhIHRhYmVsIGRpIGF0YXMsIGRpZGFwYXRrYW4gZGF0YSBiZXJ1cGE6DQoNCiQkDQpcYmVnaW57YWxpZ25lZH0NCiAgICB0YiAmPSA2MSAtIDAsNSA9IDYwLDUgXFwNCiAgICBwICY9IDEwIFxcDQogICAgRl9tICY9IDExIFxcDQogICAgRiAmPSAxOCBcXA0KXGVuZHthbGlnbmVkfQ0KJCQNCg0KIyMgQ2FyYSBtZW5naGl0dW5nIG1lZGlhbiBkZW5nYW4gT3V0bGllcnMgOg0KDQokJA0KXHRleHR7TWVkaWFufSA9IHRiICsgXGxlZnQoIFxmcmFje1xmcmFje259ezJ9IC0gRn17Rl9tfSBccmlnaHQpLmMNCiQkDQoNCiQkDQpcYmVnaW57YWxpZ25lZH0NClx0ZXh0e01lZGlhbn0gJj0gNjAsNSArIFxsZWZ0KCBcZnJhY3tcZnJhY3s0MH17Mn0gLSAxOH17MTF9IFxyaWdodCkgMTAgXFwNCiY9IDYwLDUgKyBcbGVmdCggXGZyYWN7MjAgLSAxOH17MTF9IFxyaWdodCkgMTAgXFwgJj0gNjAsNSArIDEsODIgXFwgJj0gNjIsMzINClxlbmR7YWxpZ25lZH0NCiQkDQoNCiAgTWFrYSBtZWRpYW4gZGFsYW0gT3V0bGllcnMgIGRhcmkgZGF0YSB0ZXJzZWJ1dCBhZGFsYWggXCggNjIsMzIgXCkuDQogIA0KIyMgQ2FyYSBtZW5naGl0dW5nIG1lZGlhbiB0YW5wYSBPdXRsaWVycyA6ICANCg0KYGBge3IsIGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQojIE1lbWJ1YXQgZGF0YSBrZWxvbXBvaw0KbGlicmFyeShrbml0cikNCg0KZGF0YSA8LSBkYXRhLmZyYW1lKA0KICAiTmlsYWkiID0gYygiNDEgLSA1MCIsICI1MSAtIDYwIiwgIjYxIC0gNzAiLCAiNzEgLSA4MCIpLA0KICAiRnJla3VlbnNpIiA9IGMoNSwgMTAsIDExLCA4KSwNCiAgIkZrayIgPSBjKCI1IiwgIjE1IiwgIjI2IiwgIjM0IikNCiAgIA0KKQ0KIyBNZW5hbXBpbGthbiB0YWJlbA0KDQprYWJsZShkYXRhLCBhbGlnbiA9ICJjIiwgY2FwdGlvbiA9ICJUYWJlbCBEYXRhIEtlbG9tcG9rIHVudHVrIG1lZGlhbiBmcmVrdWVuc2kga3VtdWxhdGlmIHRhbnBhIG91dGxpZXJzIikNCg0KYGBgDQoNCnBhZGEgdGFiZWwgZGF0YSBkaWF0YXMsIGJpc2EgZGlkYXBhdGthbiBzZWJhZ2FpIGJlcmlrdXQgOg0KDQotIFRvdGFsIPCdkZs9MzQsIHNlaGluZ2dhICRcZnJhYyB7bn17Mn0gPSAxNyQNCg0KLSBLZWxhcyBtZWRpYW46IDYxIOKIkiA3MCwgZGVuZ2FuIHBhcmFtZXRlciA6DQogDQokJA0KXGJlZ2lue2FsaWduZWR9DQogICAgdGIgJj0gNjEgLSAwLDUgPSA2MCw1ICBcXA0KICAgIEMgJj0gMTAgIFxcDQogICAgRl9tICY9IDExICBcXA0KICAgIEYgJj0gMTUgIFxcDQpcZW5ke2FsaWduZWR9DQokJA0KDQotIHN1YnNpdHVzaWthbiBrZSBydW11cyA6DQoNCiQkDQpcYmVnaW57YWxpZ25lZH0NClx0ZXh0e01lZGlhbn0gJj0gNjAsNSArIFxsZWZ0KCBcZnJhY3tcZnJhY3szNH17Mn0gLSAxNX17MTF9IFxyaWdodCkgMTAgXFwNCiY9IDYwLDUgKyBcbGVmdCggXGZyYWN7MTcgLSAxNX17MTF9IFxyaWdodCkgMTAgXFwgJj0gNjAsNSArIDEuODE4IFxcICY9IDYyLjMyDQpcZW5ke2FsaWduZWR9DQokJA0KDQojIyBLZXNpbXB1bGFuIDoNCg0KSGFzaWwgcGVyaGl0dW5nYW4gbWVkaWFuIGRhcmkga2VkdWEgbWV0b2RlIHlha25pIG1lbmdndW5ha2FuIG91dGxpZXIgZGFuIHRhbnBhIG1lbmdndW5ha2FuIG91dGxpZXJzIG1lbnVuanVra2FuIGJhaHdhIG5pbGFpIG1lZGlhbiB0aWRhayBiZXJ1YmFoICh0ZXRhcCA2MiwzMikuIEhhbCBpbmkgbWVtYnVrdGlrYW4gYmFod2EgbWVkaWFuIGFkYWxhaCB1a3VyYW4gcGVtdXNhdGFuIGRhdGEgeWFuZyByb2J1c3QgYXRhdSBrdWF0IHRlcmhhZGFwIG91dGxpZXJzLCBrYXJlbmEgcG9zaXNpbnlhIGRpdGVudHVrYW4gb2xlaCB1cnV0YW4gZGF0YSwgYnVrYW4gbmlsYWktbmlsYWkgZWtzdHJlbSBkYWxhbSBkaXN0cmlidXNpLiBNZWRpYW4gdGV0YXAgbWVuZ2dhbWJhcmthbiBuaWxhaSB0ZW5nYWggZGF0YSBkZW5nYW4ga29uc2lzdGVuIG1lc2tpcHVuIGRpc3RyaWJ1c2kgZGF0YSBkaW1vZGlmaWthc2kuDQoNCiMjIE1lZGlhbiBkYWxhbSBiZW50dWsgYm94cGxvdCA6DQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIH0NCiMgTWVtdWF0IGxpYnJhcnkNCmxpYnJhcnkocGxvdGx5KQ0KDQojIERhdGE6IEludGVydmFsIG5pbGFpIGRhbiBmcmVrdWVuc2kNCmludGVydmFsIDwtIGMoIjMxIC0gNDAiLCAiNDEgLSA1MCIsICI1MSAtIDYwIiwgIjYxIC0gNzAiLCAiNzEgLSA4MCIsICI4MSAtIDkwIikNCmZyZWt1ZW5zaSA8LSBjKDMsIDUsIDEwLCAxMSwgOCwgMykgICMgRnJla3VlbnNpDQpmcmVrdWVuc2lfa3VtdWxhdGlmIDwtIGMoMywgOCwgMTgsIDI5LCAzNywgNDApICAjIEZyZWt1ZW5zaSBLdW11bGF0aWYNCg0KIyBOaWxhaSB0ZW5nYWggdW50dWsgc2V0aWFwIGludGVydmFsDQpuaWxhaV90ZW5nYWggPC0gYygzNS41LCA0NS41LCA1NS41LCA2NS41LCA3NS41LCA4NS41KQ0KDQojIE1lbmdoaXR1bmcgdG90YWwgZnJla3VlbnNpDQp0b3RhbF9mcmVrdWVuc2kgPC0gc3VtKGZyZWt1ZW5zaSkNCg0KIyBNZW5naGl0dW5nIG5pbGFpIHRlbmdhaCAobWVkaWFuKQ0KbWVkaWFuIDwtIHN1bShmcmVrdWVuc2kgKiBuaWxhaV90ZW5nYWgpIC8gdG90YWxfZnJla3VlbnNpDQoNCiMgTmlsYWkgbWVkaWFuIHlhbmcgc3VkYWggZGloaXR1bmcgKDYyLjMyKQ0KbWVkaWFuIDwtIDYyLjMyDQoNCiMgTWVtYnVhdCBkYXRhIHVudHVrIGJveHBsb3QNCiMgRGF0YSB1bnR1ayBib3hwbG90IGFkYWxhaCBuaWxhaSB0ZW5nYWggeWFuZyBkaXVsYW5nIHNlc3VhaSBkZW5nYW4gZnJla3VlbnNpDQpkYXRhIDwtIHJlcChuaWxhaV90ZW5nYWgsIGZyZWt1ZW5zaSkNCg0KIyBNZW5naGl0dW5nIGRhdGEgdW50dWsgdmlzdWFsaXNhc2kgKERlbmdhbiBPdXRsaWVycyBkYW4gVGFucGEgT3V0bGllcnMpDQojIEFzdW1zaSB0aWRhayBhZGEga2VsYXMgeWFuZyBkaWhhcHVzLCBoYW55YSBwZXJoaXR1bmdhbiB1bnR1ayBrZWR1YSBrZWxvbXBvaw0KZGF0YV9kZW5nYW5fb3V0bGllcnMgPC0gZGF0YQ0KZGF0YV90YW5wYV9vdXRsaWVycyA8LSBkYXRhW2ZyZWt1ZW5zaSA8PSA4XSAgIyBNZW55YXJpbmcgbmlsYWkgZGVuZ2FuIGZyZWt1ZW5zaSBsZWJpaCBkYXJpIDggKHVudHVrICdUYW5wYSBPdXRsaWVycycpDQoNCiMgTWVuZ2dhYnVuZ2thbiBkYXRhIGtlIGRhbGFtIHNhdHUgZGF0YSBmcmFtZSB1bnR1ayB2aXN1YWxpc2FzaQ0KZGYgPC0gZGF0YS5mcmFtZSgNCiAgTmlsYWkgPSBjKGRhdGFfZGVuZ2FuX291dGxpZXJzLCBkYXRhX3RhbnBhX291dGxpZXJzKSwNCiAgS2Vsb21wb2sgPSByZXAoYygiRGVuZ2FuIE91dGxpZXJzIiwgIlRhbnBhIE91dGxpZXJzIiksIA0KICAgICAgICAgICAgICAgICB0aW1lcyA9IGMobGVuZ3RoKGRhdGFfZGVuZ2FuX291dGxpZXJzKSwgbGVuZ3RoKGRhdGFfdGFucGFfb3V0bGllcnMpKSkNCikNCg0KIyBNZW1idWF0IGJveHBsb3QgbWVuZ2d1bmFrYW4gUGxvdGx5DQpwbG90IDwtIHBsb3RfbHkoDQogIGRmLCANCiAgeSA9IH5OaWxhaSwgDQogIGNvbG9yID0gfktlbG9tcG9rLCANCiAgdHlwZSA9ICJib3giLCANCiAgYm94cG9pbnRzID0gIm91dGxpZXJzIiwgICMgTWVuYW1waWxrYW4gdGl0aWsgb3V0bGllcnMNCiAgYm94bWVhbiA9IFRSVUUgICMgTWVuYW1waWxrYW4gZ2FyaXMgcGVtYmF0YXMgdW50dWsgcmF0YS1yYXRhDQopICU+JQ0KICBsYXlvdXQoDQogICAgdGl0bGUgPSAiUGVuZ2FydWggT3V0bGllcnMgdGVyaGFkYXAgTWVkaWFuIiwNCiAgICB5YXhpcyA9IGxpc3QodGl0bGUgPSAiTmlsYWkiKSwNCiAgICB4YXhpcyA9IGxpc3QodGl0bGUgPSAiS2Vsb21wb2siKSwNCiAgICBhbm5vdGF0aW9ucyA9IGxpc3QoDQogICAgICBsaXN0KA0KICAgICAgICB4ID0gIkRlbmdhbiBPdXRsaWVycyIsICAjIExva2FzaSBtZWRpYW4NCiAgICAgICAgeSA9IG1lZGlhbiwgICAgICAgICAgICAgIyBOaWxhaSBtZWRpYW4NCiAgICAgICAgdGV4dCA9IHBhc3RlKCJNZWRpYW46Iiwgcm91bmQobWVkaWFuLCAyKSksICAjIFRla3MgdW50dWsgbWVkaWFuDQogICAgICAgIHNob3dhcnJvdyA9IFRSVUUsICAgICAgICMgTWVuYW1waWxrYW4gdGFuZGEgcGFuYWgNCiAgICAgICAgYXJyb3doZWFkID0gMiAgICAgICAgICAgIyBHYXlhIHBhbmFoDQogICAgICApLA0KICAgICAgbGlzdCgNCiAgICAgICAgeCA9ICJUYW5wYSBPdXRsaWVycyIsICAjIExva2FzaSBtZWRpYW4gdW50dWsgVGFucGEgT3V0bGllcnMNCiAgICAgICAgeSA9IG1lZGlhbiwgICAgICAgICAgICAjIE5pbGFpIG1lZGlhbg0KICAgICAgICB0ZXh0ID0gcGFzdGUoIk1lZGlhbjoiLCByb3VuZChtZWRpYW4sIDIpKSwgICMgVGVrcyB1bnR1ayBtZWRpYW4NCiAgICAgICAgc2hvd2Fycm93ID0gVFJVRSwgICAgICAjIE1lbmFtcGlsa2FuIHRhbmRhIHBhbmFoDQogICAgICAgIGFycm93aGVhZCA9IDIgICAgICAgICAgIyBHYXlhIHBhbmFoDQogICAgICApDQogICAgKQ0KICApDQoNCiMgTWVuYW1waWxrYW4gcGxvdA0KcGxvdA0KDQpgYGANCg0KIyMgTWVkaWFuIGRhbGFtIGJlbnR1ayBoaXN0b2dyYW0gOg0KDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCB9DQojIE1lbXVhdCBsaWJyYXJ5DQpsaWJyYXJ5KHBsb3RseSkNCg0KIyBEYXRhOiBJbnRlcnZhbCBuaWxhaSBkYW4gZnJla3VlbnNpDQppbnRlcnZhbCA8LSBjKCIzMSAtIDQwIiwgIjQxIC0gNTAiLCAiNTEgLSA2MCIsICI2MSAtIDcwIiwgIjcxIC0gODAiLCAiODEgLSA5MCIpDQpmcmVrdWVuc2kgPC0gYygzLCA1LCAxMCwgMTEsIDgsIDMpICAjIEZyZWt1ZW5zaQ0KZnJla3VlbnNpX2t1bXVsYXRpZiA8LSBjKDMsIDgsIDE4LCAyOSwgMzcsIDQwKSAgIyBGcmVrdWVuc2kgS3VtdWxhdGlmDQoNCiMgTmlsYWkgdGVuZ2FoIHVudHVrIHNldGlhcCBpbnRlcnZhbA0KbmlsYWlfdGVuZ2FoIDwtIGMoMzUuNSwgNDUuNSwgNTUuNSwgNjUuNSwgNzUuNSwgODUuNSkNCg0KIyBNZW5naGl0dW5nIHRvdGFsIGZyZWt1ZW5zaQ0KdG90YWxfZnJla3VlbnNpIDwtIHN1bShmcmVrdWVuc2kpDQoNCiMgTWVuZ2hpdHVuZyBwb3Npc2kgbWVkaWFuDQpwb3Npc2lfbWVkaWFuIDwtIHRvdGFsX2ZyZWt1ZW5zaSAvIDIgICMgUG9zaXNpIG1lZGlhbiA9IE4gLyAyDQojIE1lbmVudHVrYW4gaW50ZXJ2YWwgbWVkaWFuDQppbnRlcnZhbF9tZWRpYW4gPC0gd2hpY2goZnJla3VlbnNpX2t1bXVsYXRpZiA+PSBwb3Npc2lfbWVkaWFuKVsxXQ0KTCA8LSBuaWxhaV90ZW5nYWhbaW50ZXJ2YWxfbWVkaWFuXSAtIChuaWxhaV90ZW5nYWhbaW50ZXJ2YWxfbWVkaWFuXSAtIG5pbGFpX3RlbmdhaFtpbnRlcnZhbF9tZWRpYW4gLSAxXSkgLyAyDQpGIDwtIGlmZWxzZShpbnRlcnZhbF9tZWRpYW4gPT0gMSwgMCwgZnJla3VlbnNpX2t1bXVsYXRpZltpbnRlcnZhbF9tZWRpYW4gLSAxXSkNCmYgPC0gZnJla3VlbnNpW2ludGVydmFsX21lZGlhbl0NCmMgPC0gbmlsYWlfdGVuZ2FoW2ludGVydmFsX21lZGlhbl0gLSBuaWxhaV90ZW5nYWhbaW50ZXJ2YWxfbWVkaWFuIC0gMV0NCg0KIyBNZW5naGl0dW5nIG1lZGlhbg0KbWVkaWFuIDwtIEwgKyAoKHBvc2lzaV9tZWRpYW4gLSBGKSAvIGYpICogYw0KDQojIE1lbWJ1YXQgZGF0YSB1bnR1ayBib3hwbG90DQojIERhdGEgdW50dWsgYm94cGxvdCBhZGFsYWggbmlsYWkgdGVuZ2FoIHlhbmcgZGl1bGFuZyBzZXN1YWkgZGVuZ2FuIGZyZWt1ZW5zaQ0KZGF0YSA8LSByZXAobmlsYWlfdGVuZ2FoLCBmcmVrdWVuc2kpDQoNCiMgTWVuZ2hpdHVuZyBkYXRhIHVudHVrIHZpc3VhbGlzYXNpIChEZW5nYW4gT3V0bGllcnMgZGFuIFRhbnBhIE91dGxpZXJzKQ0KIyBBc3Vtc2kgdGlkYWsgYWRhIGtlbGFzIHlhbmcgZGloYXB1cywgaGFueWEgcGVyaGl0dW5nYW4gdW50dWsga2VkdWEga2Vsb21wb2sNCmRhdGFfZGVuZ2FuX291dGxpZXJzIDwtIGRhdGENCmRhdGFfdGFucGFfb3V0bGllcnMgPC0gZGF0YVtmcmVrdWVuc2kgPD0gOF0gICMgTWVueWFyaW5nIG5pbGFpIGRlbmdhbiBmcmVrdWVuc2kgbGViaWggZGFyaSA4ICh1bnR1ayAnVGFucGEgT3V0bGllcnMnKQ0KDQojIE1lbmdnYWJ1bmdrYW4gZGF0YSBrZSBkYWxhbSBzYXR1IGRhdGEgZnJhbWUgdW50dWsgdmlzdWFsaXNhc2kNCmRmIDwtIGRhdGEuZnJhbWUoDQogIE5pbGFpID0gYyhkYXRhX2Rlbmdhbl9vdXRsaWVycywgZGF0YV90YW5wYV9vdXRsaWVycyksDQogIEtlbG9tcG9rID0gcmVwKGMoIkRlbmdhbiBPdXRsaWVycyIsICJUYW5wYSBPdXRsaWVycyIpLCANCiAgICAgICAgICAgICAgICAgdGltZXMgPSBjKGxlbmd0aChkYXRhX2Rlbmdhbl9vdXRsaWVycyksIGxlbmd0aChkYXRhX3RhbnBhX291dGxpZXJzKSkpDQopDQoNCiMgTWVtYnVhdCBib3hwbG90IG1lbmdndW5ha2FuIFBsb3RseQ0KcGxvdCA8LSBwbG90X2x5KCkgJT4lDQogICMgTWVuYW1iYWhrYW4gZGVuc2l0eSBwbG90IHVudHVrIGRhdGFzZXQgZGVuZ2FuIG91dGxpZXJzDQogIGFkZF90cmFjZSgNCiAgICB4ID0gfmRlbnNpdHkoZGF0YV9kZW5nYW5fb3V0bGllcnMpJHgsDQogICAgeSA9IH5kZW5zaXR5KGRhdGFfZGVuZ2FuX291dGxpZXJzKSR5LA0KICAgIHR5cGUgPSAnc2NhdHRlcicsDQogICAgbW9kZSA9ICdsaW5lcycsDQogICAgbmFtZSA9ICJEZW5nYW4gT3V0bGllcnMiLA0KICAgIGxpbmUgPSBsaXN0KGNvbG9yID0gJ3JnYmEoMjIyLCA0NSwgMzgsIDAuOCknLCB3aWR0aCA9IDIpDQogICkgJT4lDQogICMgTWVuYW1iYWhrYW4gZGVuc2l0eSBwbG90IHVudHVrIGRhdGFzZXQgdGFucGEgb3V0bGllcnMNCiAgYWRkX3RyYWNlKA0KICAgIHggPSB+ZGVuc2l0eShkYXRhX3RhbnBhX291dGxpZXJzKSR4LA0KICAgIHkgPSB+ZGVuc2l0eShkYXRhX3RhbnBhX291dGxpZXJzKSR5LA0KICAgIHR5cGUgPSAnc2NhdHRlcicsDQogICAgbW9kZSA9ICdsaW5lcycsDQogICAgbmFtZSA9ICJUYW5wYSBPdXRsaWVycyIsDQogICAgbGluZSA9IGxpc3QoY29sb3IgPSAncmdiYSgzOCwgMTY2LCA5MSwgMC44KScsIHdpZHRoID0gMikNCiAgKSAlPiUNCiAgIyBNZW5hbWJhaGthbiBnYXJpcyBtZWRpYW4gdW50dWsgZGF0YXNldCBkZW5nYW4gb3V0bGllcnMNCiAgYWRkX3RyYWNlKA0KICAgIHggPSBjKG1lZGlhbiwgbWVkaWFuKSwNCiAgICB5ID0gYygwLCBtYXgoZGVuc2l0eShkYXRhX2Rlbmdhbl9vdXRsaWVycykkeSkpLA0KICAgIHR5cGUgPSAic2NhdHRlciIsDQogICAgbW9kZSA9ICJsaW5lcyIsDQogICAgbmFtZSA9ICJNZWRpYW4gKERlbmdhbiBPdXRsaWVycykiLA0KICAgIGxpbmUgPSBsaXN0KGNvbG9yID0gJ3JnYmEoMjIyLCA0NSwgMzgsIDAuNiknLCBkYXNoID0gJ2Rhc2gnKQ0KICApICU+JQ0KICAjIE1lbmFtYmFoa2FuIGdhcmlzIG1lZGlhbiB1bnR1ayBkYXRhc2V0IHRhbnBhIG91dGxpZXJzDQogIGFkZF90cmFjZSgNCiAgICB4ID0gYyhtZWRpYW4sIG1lZGlhbiksDQogICAgeSA9IGMoMCwgbWF4KGRlbnNpdHkoZGF0YV90YW5wYV9vdXRsaWVycykkeSkpLA0KICAgIHR5cGUgPSAic2NhdHRlciIsDQogICAgbW9kZSA9ICJsaW5lcyIsDQogICAgbmFtZSA9ICJNZWRpYW4gKFRhbnBhIE91dGxpZXJzKSIsDQogICAgbGluZSA9IGxpc3QoY29sb3IgPSAncmdiYSgzOCwgMTY2LCA5MSwgMC42KScsIGRhc2ggPSAnZGFzaCcpDQogICkgJT4lDQogIGxheW91dCgNCiAgICB0aXRsZSA9ICJQZW5nYXJ1aCBPdXRsaWVycyB0ZXJoYWRhcCBNZWRpYW4gcGFkYSBEZW5zaXR5IFBsb3QiLA0KICAgIHhheGlzID0gbGlzdCh0aXRsZSA9ICJOaWxhaSIpLA0KICAgIHlheGlzID0gbGlzdCh0aXRsZSA9ICJLZXBhZGF0YW4iKSwNCiAgICBhbm5vdGF0aW9ucyA9IGxpc3QoDQogICAgICAjIEFub3Rhc2kgdW50dWsgbWVkaWFuIGRhdGFzZXQgZGVuZ2FuIG91dGxpZXJzDQogICAgICBsaXN0KA0KICAgICAgICB4ID0gbWVkaWFuLA0KICAgICAgICB5ID0gbWF4KGRlbnNpdHkoZGF0YV9kZW5nYW5fb3V0bGllcnMpJHkpICogMC45LA0KICAgICAgICB0ZXh0ID0gcGFzdGUoIk1lZGlhbjoiLCByb3VuZChtZWRpYW4sIDIpKSwNCiAgICAgICAgc2hvd2Fycm93ID0gVFJVRSwNCiAgICAgICAgYXJyb3doZWFkID0gMiwNCiAgICAgICAgYXggPSAwLA0KICAgICAgICBheSA9IC0zMCwgICMgUG9zaXNpIHRla3Mgc2VkaWtpdCBsZWJpaCB0aW5nZ2kgZGFyaSBnYXJpcw0KICAgICAgICBmb250ID0gbGlzdChjb2xvciA9ICdyZ2JhKDIyMiwgNDUsIDM4LCAwLjgpJywgc2l6ZSA9IDEyKQ0KICAgICAgKSwNCiAgICAgICMgQW5vdGFzaSB1bnR1ayBtZWRpYW4gZGF0YXNldCB0YW5wYSBvdXRsaWVycw0KICAgICAgbGlzdCgNCiAgICAgICAgeCA9IG1lZGlhbiwNCiAgICAgICAgeSA9IG1heChkZW5zaXR5KGRhdGFfdGFucGFfb3V0bGllcnMpJHkpICogMC45LA0KICAgICAgICB0ZXh0ID0gcGFzdGUoIk1lZGlhbjoiLCByb3VuZChtZWRpYW4sIDIpKSwNCiAgICAgICAgc2hvd2Fycm93ID0gVFJVRSwNCiAgICAgICAgYXJyb3doZWFkID0gMiwNCiAgICAgICAgYXggPSAwLA0KICAgICAgICBheSA9IC00NSwgICMgUG9zaXNpIHRla3Mgc2VkaWtpdCBsZWJpaCB0aW5nZ2kgZGFyaSBnYXJpcw0KICAgICAgICBmb250ID0gbGlzdChjb2xvciA9ICdyZ2JhKDM4LCAxNjYsIDkxLCAwLjgpJywgc2l6ZSA9IDEyKQ0KICAgICAgKQ0KICAgICkNCiAgKQ0KDQojIE1lbmFtcGlsa2FuIHBsb3QNCnBsb3QNCmBgYCANCg0KDQojIDEuMS4zIE1vZHVzIHVudHVrIERhdGEgS2Vsb21wb2sNCg0KICBNb2R1cyBhZGFsYWggbmlsYWkgeWFuZyBzZXJpbmcgbXVuY3VsIGRhbGFtIHNlYnVhaCBkYXRhc2V0LiBNb2R1cyBkaWd1bmFrYW4gdW50dWsgbWVuZ2V0YWh1aSBuaWxhaSB5YW5nIHBhbGluZyBkb21pbmFuIGF0YXUgcGFsaW5nIHNlcmluZyB0ZXJqYWRpIGRhbGFtIHN1YXR1IGt1bXB1bGFuIGRhdGEuDQoNCkxhbmdrYWggbGFuZ2thaCBtZW5naGl0dW5nIG1vZHVzIHNlYmFnYWkgYmVyaWt1dCA6DQoNCi0gS3VyYW5naSBmcmVrdWVuc2kgc2ViZWx1bSBrZWxhcyBtb2R1cyAoXChmXzBcKSkgZGFyaSBmcmVrdWVuc2kga2VsYXMgbW9kdXMgKFwoZl8xXCkpDQoNCiAgICANCi0gS3VyYW5naSBmcmVrdWVuc2kgc2V0ZWxhaCBrZWxhcyBtb2R1cyAoXChmXzJcKSkgZGFyaSBmcmVrdWVuc2kga2VsYXMgbW9kdXMgKFwoZl8xXCkpDQoNCg0KLSBIaXR1bmcgcGVtYmlsYW5nID0gJChmXzEgLSBmXzApJCBkYW4gcGVueWVidXQgPSAkKGZfMSAtIGZfMCkgKyAoZl8xIC0gZl8yKSQNCg0KICANCi0gQmFnaSBwZW1iaWxhbmcgZGVuZ2FuIHBlbnllYnV0ID0gJFxmcmFje2ZfMSAtIGZfMH17KGZfMSAtIGZfMCkgKyAoZl8xIC0gICAgZl8yKX0kDQoNCg0KLSBLYWxpa2FuIGhhc2lsbnlhIGRlbmdhbiBsZWJhciBrZWxhcyAoXChDXCkpDQoNCg0KLSBUYW1iYWhrYW4gaGFzaWwgdGVyc2VidXQga2UgYmF0YXMgYmF3YWgga2VsYXMgbW9kdXMgKFwodGJcKSkNCg0KDQotIFN1YnN0aXR1c2kga2UgUnVtdXMgTW9kdXMgOg0KDQogICRcdGV4dHtNb2R1c30gPSB0YiArIFxsZWZ0KCBcZnJhY3soZl8xIC0gZl8wKSB9e2ZfMSAtIGZfMCArIChmXzEgLSBmXzIpfSBccmlnaHQpLiBDJA0KDQotIEJpc2EgSnVnYSBkaXR1bGlzIGRlbmdhbiA6IA0KDQogICRcdGV4dHtNb2R9ID0gdGIgKyBcbGVmdCggXGZyYWN7KGZfMSlfMH17KGZfMSlfMCArIChmXzIpXzB9IFxyaWdodCkuIEMkDQoNCg0KICBkaSBtYW5hOg0KDQokJA0KXGJlZ2lue2FsaWduZWR9DQp0YiAmPSBcdGV4dHtiYXRhcyBiYXdhaCB1bnR1ayBrZWxhcyBkaSBtYW5hIG1vZHVzIGJlcmFkYX0gXFwNCkMgJj0gXHRleHR7aW50ZXJ2YWwga2VsYXN9IFxcDQooZl8xKV8wICY9IFx0ZXh0e3NlbGlzaWggZnJla3VlbnNpIHlhbmcgbWVtdWF0IG1vZHVzIGRlbmdhbiBmcmVrdWVuc2kgICBrZWxhcyBzZWJlbHVtbnlhfSBcXA0KKGZfMilfMCAmPSBcdGV4dHtzZWxpc2loIGZyZWt1ZW5zaSB5YW5nIG1lbXVhdCBtb2R1cyBkZW5nYW4gZnJla3VlbnNpIGtlbGFzIHNlc3VkYWhueWF9DQpcZW5ke2FsaWduZWR9DQokJA0KDQpjb250b2ggOg0KDQogIFNlYnVhaCBzYW1wZWwgbmlsYWkgcGVuanVhbGFuIG1pbmdndWFuIChkYWxhbSBqdXRhIHJ1cGlhaCkgZGFyaSA2MCBwZW55YWx1ciBiYXJhbmcgYW50aWsgZGkga290YSAgICAgICAgICBtb2pva2VydG8gZGlzYWppa2FuIHNlcGVydGkgYmVyaWt1dCA6DQoNCg0KYGBge3IsIGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQojIE1lbWJ1YXQgZGF0YSBrZWxvbXBvaw0KbGlicmFyeShrbml0cikNCg0KZGF0YSA8LSBkYXRhLmZyYW1lKA0KICAiTmlsYWlfcGVuanVhbGFuIiA9IGMoIjEwIC0gMTQiLCAiMTUgLSAxOSIsICIyMCAtIDI0IiwgIjI1IC0gMjkiLCAiMzAgLSAzNCIsICIzNSAtIDM5IiksDQogICJCYW55YWtfcGVueWFsdXIiID0gYygiNCIsICI1IiwgIjgiLCAiMTMiLCAiMjAiLCAiMTAiKSwNCiAgIkZyZWt1ZW5zaSIgPSBjKCAiMTQsNSIsICIxOSw1IiwgIjI0LDUiLCAiMjksNSIsICIzNCw1IiwgIjM5LDUiKSANCikNCiMgTWVuYW1waWxrYW4gdGFiZWwNCg0Ka2FibGUoZGF0YSwgYWxpZ24gPSAiYyIsIGNhcHRpb24gPSAiVGFiZWwgRGF0YSBLZWxvbXBvayB1bnR1ayBtb2R1cyBmcmVrdWVuc2kga3VtdWxhdGlmIGRlbmdhbiBvdXRsaWVycyBkYW4gdGFucGEgb3V0bGllcnMiKQ0KDQpgYGANCg0KDQpEYXJpIHRhYmVsIGRpYXRhcywgZnJla3VlbnNpIG1vZHVzbnlhIGFkYWxhaCAyMCBkZW5nYW4gbGV0YWsga2VsYXMga2UtNSBkYW4ga2VsYXMgbnlhdGFueWEgYWRhbGFoIDI5LDUgLSAzNCw1LiBqYWRpIDoNCg0KJCQNCihmXzEpXzA9IDIwIC0gMTMgPSA3IFxcDQooZl8yKV8wID0gMjAgLSAxMCA9IDEwIFxcDQp0YiA9IDI5LCA1IFxcDQpDID0gNSANCiQkDQoNCiMjIENhcmEgbWVuZ2hpdHVuZyBtb2R1cyBkZW5nYW4gT3V0bGllcnMgOjoNCg0KJCQNClxiZWdpbnthbGlnbmVkfQ0KXHRleHR7TW9kfSA9IHRiICsgXGxlZnQoIFxmcmFjeyhmXzEpXzB9eyhmXzEpXzAgKyAoZl8yKV8wfS4gQyBccmlnaHQpDQpcZW5ke2FsaWduZWR9DQokJA0KDQokJA0KXGJlZ2lue2FsaWduZWR9DQpcdGV4dHtNb2R9ICY9IDI5LDUgXGxlZnQoIFxmcmFjezd9ezcgKyAxMH0gXHJpZ2h0KS4gNSBcXA0KJj0gMjksNSArICgwLDQxKSg1KSBcXA0KJj0gMjksNSArIDIsMDUgXFwNCiY9IDMxLDU1DQpcZW5ke2FsaWduZWR9DQokJA0KDQpKYWRpLCBtb2R1cyBkYXJpIG5pbGFpIHBlbmp1YWxhbiBtaW5nZ3VhbiA2MCBwZW55YWx1ciBiYXJhbmcgYW50aWsgZGlrb3RhIG1vam9rZXJ0byBhZGFsYWggc2ViYW55YWsgUnAuIDMxLDU1IEp1dGEuDQoNCiMjIENhcmEgbWVuZ2hpdHVuZyBtb2R1cyB0YW5wYSBPdXRsaWVycyA6ICANCg0KJCQNClxiZWdpbnthbGlnbmVkfQ0KXHRleHR7TW9kfSA9IHRiICsgXGxlZnQoIFxmcmFjeyhmXzEpXzB9eyhmXzEpXzAgKyAoZl8yKV8wfS4gQyBccmlnaHQpDQpcZW5ke2FsaWduZWR9DQokJA0KDQpkZW5nYW4gcGFyYW1ldGVyIDoNCg0KJCQNCvCdkZNf8J2RmiA9IDIwIFxcDQooZl8xKV8wPSAyMCAtIDEzID0gNyBcXA0KKGZfMilfMCA9IDIwIC0gMTAgPSAxMCBcXA0KdGIgPSAyOSwgNSBcXA0KQyA9IDUgDQokJA0KDQokJA0KXGJlZ2lue2FsaWduZWR9DQpcdGV4dHtNb2R9ICY9IDI5LDUgXGxlZnQoIFxmcmFjezd9ezcgKyAxMH0gXHJpZ2h0KS4gNSBcXA0KJj0gMjksNSArICgwLDQxKSg1KSBcXA0KJj0gMjksNSArIDIsMDUgXFwNCiY9IDMxLDU1DQpcZW5ke2FsaWduZWR9DQokJA0KDQojIyBLZXNpbXB1bGFuIDoNCg0KLSBNb2R1cyBkZW5nYW4gZGFuIHRhbnBhIG91dGxpZXJzIG1lbmdoYXNpbGthbiBuaWxhaSB5YW5nIHNhbWEsIHlhaXR1IDMxLjU2LiBIYWwgaW5pIG1lbnVuanVra2FuIGJhaHdhIGRhdGEgZGFsYW0ga2Vsb21wb2sgaW5pIGN1a3VwIHN0YWJpbCwgc2VoaW5nZ2Ega2ViZXJhZGFhbiBhdGF1IGtldGlhZGFhbiBvdXRsaWVycyB0aWRhayBtZW1lbmdhcnVoaSBuaWxhaSBtb2R1cy4gZGFuIHBhZGEgdGFiZWwgTWVuZ2d1bmFrYW4gc2VtdWEgZGF0YSBhc2xpIHRhbnBhIG1lbmdoaWxhbmdrYW4gbmlsYWkgZWtzdHJlbS4NCg0KLSBNb2R1cyAzMS41NiBtZXJlcHJlc2VudGFzaWthbiBuaWxhaSB5YW5nIHBhbGluZyBzZXJpbmcgbXVuY3VsIGRhbGFtIGRhdGFzZXQgaW5pLCBiYWlrIGRlbmdhbiBtYXVwdW4gdGFucGEgbWVtcGVydGltYmFuZ2thbiBhZGFueWEgb3V0bGllcnMsIHNlaGluZ2dhIG1lbmNlcm1pbmthbiBrYXJha3RlcmlzdGlrIHV0YW1hIGRpc3RyaWJ1c2kgZGF0YS4gcGFkYSB0YWJlbCBkaWEgU2FtYSBkZW5nYW4gZGF0YSBhc2xpIGthcmVuYSB0aWRhayBhZGEgbmlsYWkgZWtzdHJlbSAob3V0bGllcnMpIHlhbmcgdGVyZGV0ZWtzaS4NCg0KDQojIyBNb2R1cyBkYWxhbSBiZW50dWsgYm94cGxvdCA6DQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIH0NCiMgTWVtdWF0IGxpYnJhcnkNCmxpYnJhcnkocGxvdGx5KQ0KDQojIERhdGE6IEludGVydmFsIG5pbGFpIGRhbiBmcmVrdWVuc2kNCmludGVydmFsIDwtIGMoIjEwIC0gMTQiLCAiMTUgLSAxOSIsICIyMCAtIDI0IiwgIjI1IC0gMjkiLCAiMzAgLSAzNCIsICIzNSAtIDM5IikNCmZyZWt1ZW5zaSA8LSBjKDQsIDUsIDgsIDEzLCAyMCwgMTApICAjIEZyZWt1ZW5zaQ0KZnJla3VlbnNpX3RhbnBhX291dGxpZXJzIDwtIGMoNCwgNSwgOCwgMTMsIDIwLCAwKSAgIyBNZW5naGFwdXMga2VsYXMgdGVyYWtoaXIgdW50dWsgZGF0YSB0YW5wYSBvdXRsaWVycw0KbmlsYWlfdGVuZ2FoIDwtIGMoMTIsIDE3LCAyMiwgMjcsIDMyLCAzNykgICMgTmlsYWkgdGVuZ2FoDQoNCiMgTW9kdXMgdGV0YXAgKHNlc3VhaSBwZXJpbnRhaCkNCm1vZHVzX2Rlbmdhbl9vdXRsaWVycyA8LSAzMS41NQ0KbW9kdXNfdGFucGFfb3V0bGllcnMgPC0gMzEuNTUNCg0KIyBNZW1idWF0IGRhdGEgdW50dWsgYm94cGxvdA0KZGF0YV9kZW5nYW5fb3V0bGllcnMgPC0gcmVwKG5pbGFpX3RlbmdhaCwgZnJla3VlbnNpKQ0KZGF0YV90YW5wYV9vdXRsaWVycyA8LSByZXAobmlsYWlfdGVuZ2FoLCBmcmVrdWVuc2lfdGFucGFfb3V0bGllcnMpDQoNCiMgTWVuZ2dhYnVuZ2thbiBkYXRhIHVudHVrIHZpc3VhbGlzYXNpDQpkZiA8LSBkYXRhLmZyYW1lKA0KICBOaWxhaSA9IGMoZGF0YV9kZW5nYW5fb3V0bGllcnMsIGRhdGFfdGFucGFfb3V0bGllcnMpLA0KICBLZWxvbXBvayA9IHJlcChjKCJEZW5nYW4gT3V0bGllcnMiLCAiVGFucGEgT3V0bGllcnMiKSwgDQogICAgICAgICAgICAgICAgIHRpbWVzID0gYyhsZW5ndGgoZGF0YV9kZW5nYW5fb3V0bGllcnMpLCBsZW5ndGgoZGF0YV90YW5wYV9vdXRsaWVycykpKQ0KKQ0KDQojIE1lbWJ1YXQgYm94cGxvdCBtZW5nZ3VuYWthbiBQbG90bHkNCnBsb3QgPC0gcGxvdF9seSgNCiAgZGYsDQogIHkgPSB+TmlsYWksDQogIGNvbG9yID0gfktlbG9tcG9rLA0KICB0eXBlID0gImJveCIsDQogIGJveHBvaW50cyA9ICJvdXRsaWVycyIsICAjIE1lbmFtcGlsa2FuIHRpdGlrIG91dGxpZXJzDQogIGJveG1lYW4gPSBUUlVFICAjIE1lbmFtcGlsa2FuIGdhcmlzIHBlbWJhdGFzIHVudHVrIHJhdGEtcmF0YQ0KKSAlPiUNCiAgbGF5b3V0KA0KICAgIHRpdGxlID0gIlBlbmdhcnVoIE91dGxpZXJzIHRlcmhhZGFwIE1vZHVzIiwNCiAgICB5YXhpcyA9IGxpc3QodGl0bGUgPSAiTmlsYWkgUGVuanVhbGFuIiksDQogICAgeGF4aXMgPSBsaXN0KHRpdGxlID0gIktlbG9tcG9rIiksDQogICAgYW5ub3RhdGlvbnMgPSBsaXN0KA0KICAgICAgbGlzdCgNCiAgICAgICAgeCA9ICJEZW5nYW4gT3V0bGllcnMiLA0KICAgICAgICB5ID0gbW9kdXNfZGVuZ2FuX291dGxpZXJzLA0KICAgICAgICB0ZXh0ID0gcGFzdGUoIk1vZHVzOiIsIG1vZHVzX2Rlbmdhbl9vdXRsaWVycyksDQogICAgICAgIHNob3dhcnJvdyA9IFRSVUUsDQogICAgICAgIGFycm93aGVhZCA9IDIsDQogICAgICAgIGZvbnQgPSBsaXN0KGNvbG9yID0gJ2JsdWUnLCBzaXplID0gMTIpDQogICAgICApLA0KICAgICAgbGlzdCgNCiAgICAgICAgeCA9ICJUYW5wYSBPdXRsaWVycyIsDQogICAgICAgIHkgPSBtb2R1c190YW5wYV9vdXRsaWVycywNCiAgICAgICAgdGV4dCA9IHBhc3RlKCJNb2R1czoiLCBtb2R1c190YW5wYV9vdXRsaWVycyksDQogICAgICAgIHNob3dhcnJvdyA9IFRSVUUsDQogICAgICAgIGFycm93aGVhZCA9IDIsDQogICAgICAgIGZvbnQgPSBsaXN0KGNvbG9yID0gJ2dyZWVuJywgc2l6ZSA9IDEyKQ0KICAgICAgKQ0KICAgICkNCiAgKQ0KDQojIE1lbmFtcGlsa2FuIHBsb3QNCnBsb3QNCg0KYGBgDQoNCiMjIE1vZHVzIGRhbGFtIGJlbnR1ayBoaXN0b2dyYW0gOg0KDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCB9DQojIE1lbXVhdCBsaWJyYXJ5DQpsaWJyYXJ5KHBsb3RseSkNCg0KIyBEYXRhOiBJbnRlcnZhbCBuaWxhaSBkYW4gZnJla3VlbnNpDQppbnRlcnZhbCA8LSBjKCIxMCAtIDE0IiwgIjE1IC0gMTkiLCAiMjAgLSAyNCIsICIyNSAtIDI5IiwgIjMwIC0gMzQiLCAiMzUgLSAzOSIpDQpmcmVrdWVuc2kgPC0gYyg0LCA1LCA4LCAxMywgMjAsIDEwKSAgIyBGcmVrdWVuc2kNCm5pbGFpX3RlbmdhaCA8LSBjKDEyLCAxNywgMjIsIDI3LCAzMiwgMzcpICAjIE5pbGFpIHRlbmdhaA0KDQojIE1lbmdoaXR1bmcgbW9kdXMgc2VjYXJhIG1hbnVhbA0KaW5kZWtzX21vZHVzIDwtIHdoaWNoLm1heChmcmVrdWVuc2kpICAjIE1lbmVudHVrYW4ga2VsYXMgbW9kdXMNCkwgPC0gMzAuNSAgIyBCYXRhcyBiYXdhaCBrZWxhcyBtb2R1cyB1bnR1ayBpbnRlcnZhbCAiMzAgLSAzNCINCmQxIDwtIDcgICMgZnJla3VlbnNpW2luZGVrc19tb2R1c10gLSBmcmVrdWVuc2lbaW5kZWtzX21vZHVzIC0gMV0NCmQyIDwtIDcgICMgZnJla3VlbnNpW2luZGVrc19tb2R1c10gLSBmcmVrdWVuc2lbaW5kZWtzX21vZHVzICsgMV0NCmMgPC0gMTAgICMgUGFuamFuZyBpbnRlcnZhbA0KbW9kdXMgPC0gTCArIChkMSAvIChkMSArIGQyKSkgKiBjICAjIEhhc2lsIHBlcmhpdHVuZ2FuDQoNCiMgTWVuZXRhcGthbiBoYXNpbCBtb2R1cyBzZWNhcmEgbWFudWFsIGppa2EgcGVybHUNCm1vZHVzIDwtIDMxLjU1ICAjIE5pbGFpIHRldGFwIHNlYmFnYWkgMzEuNTUNCg0KIyBNZW1idWF0IGRhdGEgdW50dWsgYm94cGxvdA0KZGF0YSA8LSByZXAobmlsYWlfdGVuZ2FoLCBmcmVrdWVuc2kpDQoNCiMgTWVuZ2hpdHVuZyBkYXRhIHVudHVrIHZpc3VhbGlzYXNpIChEZW5nYW4gT3V0bGllcnMgZGFuIFRhbnBhIE91dGxpZXJzKQ0KZGF0YV9kZW5nYW5fb3V0bGllcnMgPC0gZGF0YQ0KZGF0YV90YW5wYV9vdXRsaWVycyA8LSBkYXRhW2ZyZWt1ZW5zaSA8PSA4XSAgIyBNZW55YXJpbmcgbmlsYWkgZGVuZ2FuIGZyZWt1ZW5zaSBsZWJpaCBkYXJpIDggKHVudHVrICdUYW5wYSBPdXRsaWVycycpDQoNCiMgTWVuZ2dhYnVuZ2thbiBkYXRhIGtlIGRhbGFtIHNhdHUgZGF0YSBmcmFtZSB1bnR1ayB2aXN1YWxpc2FzaQ0KZGYgPC0gZGF0YS5mcmFtZSgNCiAgTmlsYWkgPSBjKGRhdGFfZGVuZ2FuX291dGxpZXJzLCBkYXRhX3RhbnBhX291dGxpZXJzKSwNCiAgS2Vsb21wb2sgPSByZXAoYygiRGVuZ2FuIE91dGxpZXJzIiwgIlRhbnBhIE91dGxpZXJzIiksIA0KICAgICAgICAgICAgICAgICB0aW1lcyA9IGMobGVuZ3RoKGRhdGFfZGVuZ2FuX291dGxpZXJzKSwgbGVuZ3RoKGRhdGFfdGFucGFfb3V0bGllcnMpKSkNCikNCg0KIyBNZW1idWF0IGRlbnNpdHkgcGxvdCBkZW5nYW4gZ2FyaXMgbW9kdXMNCnBsb3QgPC0gcGxvdF9seSgpICU+JQ0KICAjIE1lbmFtYmFoa2FuIGRlbnNpdHkgcGxvdCB1bnR1ayBkYXRhc2V0IGRlbmdhbiBvdXRsaWVycw0KICBhZGRfdHJhY2UoDQogICAgeCA9IH5kZW5zaXR5KGRhdGFfZGVuZ2FuX291dGxpZXJzKSR4LA0KICAgIHkgPSB+ZGVuc2l0eShkYXRhX2Rlbmdhbl9vdXRsaWVycykkeSwNCiAgICB0eXBlID0gJ3NjYXR0ZXInLA0KICAgIG1vZGUgPSAnbGluZXMnLA0KICAgIG5hbWUgPSAiRGVuZ2FuIE91dGxpZXJzIiwNCiAgICBsaW5lID0gbGlzdChjb2xvciA9ICdyZ2JhKDIyMiwgNDUsIDM4LCAwLjgpJywgd2lkdGggPSAyKQ0KICApICU+JQ0KICAjIE1lbmFtYmFoa2FuIGRlbnNpdHkgcGxvdCB1bnR1ayBkYXRhc2V0IHRhbnBhIG91dGxpZXJzDQogIGFkZF90cmFjZSgNCiAgICB4ID0gfmRlbnNpdHkoZGF0YV90YW5wYV9vdXRsaWVycykkeCwNCiAgICB5ID0gfmRlbnNpdHkoZGF0YV90YW5wYV9vdXRsaWVycykkeSwNCiAgICB0eXBlID0gJ3NjYXR0ZXInLA0KICAgIG1vZGUgPSAnbGluZXMnLA0KICAgIG5hbWUgPSAiVGFucGEgT3V0bGllcnMiLA0KICAgIGxpbmUgPSBsaXN0KGNvbG9yID0gJ3JnYmEoMzgsIDE2NiwgOTEsIDAuOCknLCB3aWR0aCA9IDIpDQogICkgJT4lDQogICMgTWVuYW1iYWhrYW4gZ2FyaXMgbW9kdXMgdW50dWsgZGF0YXNldCBkZW5nYW4gb3V0bGllcnMNCiAgYWRkX3RyYWNlKA0KICAgIHggPSBjKG1vZHVzLCBtb2R1cyksDQogICAgeSA9IGMoMCwgbWF4KGRlbnNpdHkoZGF0YV9kZW5nYW5fb3V0bGllcnMpJHkpKSwNCiAgICB0eXBlID0gInNjYXR0ZXIiLA0KICAgIG1vZGUgPSAibGluZXMiLA0KICAgIG5hbWUgPSAiTW9kdXMgKERlbmdhbiBPdXRsaWVycykiLA0KICAgIGxpbmUgPSBsaXN0KGNvbG9yID0gJ3JnYmEoMjIyLCA0NSwgMzgsIDAuNiknLCBkYXNoID0gJ2Rhc2gnKQ0KICApICU+JQ0KICAjIE1lbmFtYmFoa2FuIGdhcmlzIG1vZHVzIHVudHVrIGRhdGFzZXQgdGFucGEgb3V0bGllcnMNCiAgYWRkX3RyYWNlKA0KICAgIHggPSBjKG1vZHVzLCBtb2R1cyksDQogICAgeSA9IGMoMCwgbWF4KGRlbnNpdHkoZGF0YV90YW5wYV9vdXRsaWVycykkeSkpLA0KICAgIHR5cGUgPSAic2NhdHRlciIsDQogICAgbW9kZSA9ICJsaW5lcyIsDQogICAgbmFtZSA9ICJNb2R1cyAoVGFucGEgT3V0bGllcnMpIiwNCiAgICBsaW5lID0gbGlzdChjb2xvciA9ICdyZ2JhKDM4LCAxNjYsIDkxLCAwLjYpJywgZGFzaCA9ICdkYXNoJykNCiAgKSAlPiUNCiAgbGF5b3V0KA0KICAgIHRpdGxlID0gIlBlbmdhcnVoIE91dGxpZXJzIHRlcmhhZGFwIE1vZHVzIHBhZGEgRGVuc2l0eSBQbG90IiwNCiAgICB4YXhpcyA9IGxpc3QodGl0bGUgPSAiTmlsYWkgUGVuanVhbGFuIiksDQogICAgeWF4aXMgPSBsaXN0KHRpdGxlID0gIktlcGFkYXRhbiIpLA0KICAgIGFubm90YXRpb25zID0gbGlzdCgNCiAgICAgICMgQW5vdGFzaSB1bnR1ayBtb2R1cyBkYXRhc2V0IGRlbmdhbiBvdXRsaWVycw0KICAgICAgbGlzdCgNCiAgICAgICAgeCA9IG1vZHVzLA0KICAgICAgICB5ID0gbWF4KGRlbnNpdHkoZGF0YV9kZW5nYW5fb3V0bGllcnMpJHkpICogMC45LA0KICAgICAgICB0ZXh0ID0gcGFzdGUoIk1vZHVzOiIsIG1vZHVzKSwNCiAgICAgICAgc2hvd2Fycm93ID0gVFJVRSwNCiAgICAgICAgYXJyb3doZWFkID0gMiwNCiAgICAgICAgYXggPSAwLA0KICAgICAgICBheSA9IC0zMCwgICMgUG9zaXNpIHRla3Mgc2VkaWtpdCBsZWJpaCB0aW5nZ2kgZGFyaSBnYXJpcw0KICAgICAgICBmb250ID0gbGlzdChjb2xvciA9ICdyZ2JhKDIyMiwgNDUsIDM4LCAwLjgpJywgc2l6ZSA9IDEyKQ0KICAgICAgKSwNCiAgICAgICMgQW5vdGFzaSB1bnR1ayBtb2R1cyBkYXRhc2V0IHRhbnBhIG91dGxpZXJzDQogICAgICBsaXN0KA0KICAgICAgICB4ID0gbW9kdXMsDQogICAgICAgIHkgPSBtYXgoZGVuc2l0eShkYXRhX3RhbnBhX291dGxpZXJzKSR5KSAqIDAuOSwNCiAgICAgICAgdGV4dCA9IHBhc3RlKCJNb2R1czoiLCBtb2R1cyksDQogICAgICAgIHNob3dhcnJvdyA9IFRSVUUsDQogICAgICAgIGFycm93aGVhZCA9IDIsDQogICAgICAgIGF4ID0gMCwNCiAgICAgICAgYXkgPSAtNDUsICAjIFBvc2lzaSB0ZWtzIHNlZGlraXQgbGViaWggdGluZ2dpIGRhcmkgZ2FyaXMNCiAgICAgICAgZm9udCA9IGxpc3QoY29sb3IgPSAncmdiYSgzOCwgMTY2LCA5MSwgMC44KScsIHNpemUgPSAxMikNCiAgICAgICkNCiAgICApDQogICkNCg0KIyBNZW5hbXBpbGthbiBwbG90DQpwbG90DQoNCmBgYA0KDQoNCiMgMS4yIFByYWt0aWt1bSAyIA0KDQojIDEuMi4xIEJpc25pcw0KDQpUb3BpazogQW5hbGlzaXMgZGF0YSBwZW5kYXBhdGFuIGJ1bGFuYW4ga2FyeWF3YW4NCg0KU2VidWFoIHBlcnVzYWhhYW4gaW5naW4gbWVuZ2FuYWxpc2lzIGRhdGEgcGVuZGFwYXRhbiBidWxhbmFuIGthcnlhd2FuIGRhcmkgNDAgb3JhbmcuIEJlcmlrdXQgYWRhbGFoIGRhdGEgeWFuZyB0ZWxhaCBkaWtlbG9tcG9ra2FuIGRhbGFtIHRhYmVsIGZyZWt1ZW5zaToNCg0KYGBge3IsIGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQojIE1lbWJ1YXQgZGF0YSBrZWxvbXBvaw0KbGlicmFyeShrbml0cikNCg0KZGF0YSA8LSBkYXRhLmZyYW1lKA0KICAiUmVudGFuX2dhamkiID0gYygiMS4wMDAuMDAwIC0gMS45OTkuOTk5IiwgIjIuMDAwLjAwMCAtIDIuOTk5Ljk5OSIsICIzLjAwMC4wMDAgLSAzLjk5OS45OTkiLCAiNC4wMDAuMDAwIC0gNC45OTkuOTk5IiwgIjUuMDAwLjAwMCAtIDUuOTk5Ljk5OSIpLA0KICAiRnJla3VlbnNpIiA9IGMoICI1IiwgIjEwIiwgIjE1IiwgIjgiLCAiMiIpIA0KKQ0KIyBNZW5hbXBpbGthbiB0YWJlbA0KDQprYWJsZShkYXRhLCBhbGlnbiA9ICJjIiwgY2FwdGlvbiA9ICJUYWJlbCBEYXRhIEtlbG9tcG9rIHVudHVrIGRhdGEga2Vsb21wb2sgZ2FqaSBrYXJ5YXdhbiIpDQoNCmBgYA0KDQpQZW55ZWxlc2FpYW4gOg0KDQpEaWtldGFodWkgYmFod2EgdGl0aWsgdGVuZ2FoLCBGcmVrdWVuc2kgS3VtdWxhdGlmIGFkYWxhaCBzZWJhZ2FpIGJlcmlrdXQgOg0KDQpgYGB7ciwgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRX0NCiMgTWVtYnVhdCBkYXRhIGtlbG9tcG9rDQpsaWJyYXJ5KGtuaXRyKQ0KDQpkYXRhIDwtIGRhdGEuZnJhbWUoDQogICJSZW50YW5fZ2FqaSIgPSBjKCIxLjAwMC4wMDAgLSAxLjk5OS45OTkiLCAiMi4wMDAuMDAwIC0gMi45OTkuOTk5IiwgIjMuMDAwLjAwMCAtIDMuOTk5Ljk5OSIsICI0LjAwMC4wMDAgLSA0Ljk5OS45OTkiLCAiNS4wMDAuMDAwIC0gNS45OTkuOTk5IiksDQogICJGcmVrdWVuc2kiID0gYyggIjUiLCAiMTAiLCAiMTUiLCAiOCIsICIyIiksIA0KICAiRmtrIiA9IGMoICI1IiwgIjE1IiwgIjMwIiwgIjM4IiwgIjQwIiksIA0KICAiVGl0aWtfdGVuZ2FoIiA9IGMoICIxLjUwMC4wMDAiLCAiMi41MDAuMDAwIiwgIjMuNTAwLjAwMCIsICI0LjUwMC4wMDAiLCAiNS41MDAuMDAwIiksDQogICJoYXNpbF9rYWxpX2ZyZWt1ZW5zaV9kYW5fdGl0aWtfdGVuZ2FoIiA9IGMoICI3LjUwMC4wMDAiLCAiMjUuMDAwLjAwMCIsICI1Mi41MDAuMDAwIiwgIjM2LjAwMC4wMDAiLCAiMTEuMDAwLjAwMCIpDQopDQojIE1lbmFtcGlsa2FuIHRhYmVsDQoNCmthYmxlKGRhdGEsIGFsaWduID0gImMiLCBjYXB0aW9uID0gIlRhYmVsIERhdGEgS2Vsb21wb2sgdW50dWsgZnJla3VlbnNpIGt1bXVsYXRpZiBkYW4gdGl0aWsgdGVuZ2FoIGRlbmdhbiBvdXRsaWVycyIpDQoNCmBgYA0KDQojIyBNZWFuIDogDQoNCiAgSnVtbGFoIHRvdGFsIGZyZWt1ZW5zaSAk8J2RgT0gNSArIDEwICsgMTUgKyA4ICsgMiA9IDQwJA0KDQpoaXR1bmcgcmF0YS1yYXRhIGdhamkga2FyeWF3YW4gZGVuZ2FuIHBlcmthbGlhbiBmcmVrdWVuc2kgZGVuZ2FuIHRpdGlrIHRlbmdhaCwgbGFsdSBkaWJhZ2kgZGVuZ2FuIGp1bWxhaCB0b3RhbCBmcmVrdWVuc2k6DQoNCiMjIE1lbmdndW5ha2FuIE91dGxpZXJzOg0KDQokJA0KXGJlZ2lue2FsaWduZWR9DQpcYmFye1h9ID0gXGZyYWN7XHN1bSBmWH17bn0gPSBcZnJhYyB7NSgxLjUwMC4wMDApKyAxMCgyLjUwMC4wMDApKyAxNSgzLjUwMC4wMDApKyA4KDQuNTAwLjAwMCkrIDIoNS41MDAuMDAwKX17NDB9DQpcZW5ke2FsaWduZWR9DQokJA0KJCQNClxiZWdpbnthbGlnbmVkfQ0KPSBcZnJhYyB7MTMyLjAwMC4wMDB9ezQwfQ0KPSAzLjMwMC4wMDANClxlbmR7YWxpZ25lZH0NCiQkDQoNCiMjIFRhbnBhIG1lbmdndW5ha2FuIE91dGxpZXJzIDoNCg0KYGBge3IsIGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQojIE1lbWJ1YXQgZGF0YSBrZWxvbXBvaw0KbGlicmFyeShrbml0cikNCg0KZGF0YSA8LSBkYXRhLmZyYW1lKA0KICAiUmVudGFuX2dhamkiID0gYygiMS4wMDAuMDAwIC0gMS45OTkuOTk5IiwgIjIuMDAwLjAwMCAtIDIuOTk5Ljk5OSIsICIzLjAwMC4wMDAgLSAzLjk5OS45OTkiLCAiNC4wMDAuMDAwIC0gNC45OTkuOTk5IiksDQogICJGcmVrdWVuc2kiID0gYyggIjUiLCAiMTAiLCAiMTUiLCAiOCIpLCANCiAgIlRpdGlrX3RlbmdhaCIgPSBjKCAiMS41MDAuMDAwIiwgIjIuNTAwLjAwMCIsICIzLjUwMC4wMDAiLCAiNC41MDAuMDAwIiksDQogICJoYXNpbF9rYWxpX2ZyZWt1ZW5zaV9kYW5fdGl0aWtfdGVuZ2FoIiA9IGMoICI3LjUwMC4wMDAiLCAiMjUuMDAwLjAwMCIsICI1Mi41MDAuMDAwIiwgIjM2LjAwMC4wMDAiKQ0KKQ0KIyBNZW5hbXBpbGthbiB0YWJlbA0KDQprYWJsZShkYXRhLCBhbGlnbiA9ICJjIiwgY2FwdGlvbiA9ICJUYWJlbCBEYXRhIEtlbG9tcG9rIHVudHVrIGZyZWt1ZW5zaSBrdW11bGF0aWYgZGFuIHRpdGlrIHRlbmdhaCB0YW5wYSBvdXRsaWVycyIpDQoNCmBgYA0KDQoNClRvdGFsICR7Zlh9e259JCB0YW5wYSBvdXRsaWVycyA6DQoNCiQkDQo3LjUwMC4wMDArMjUuMDAwLjAwMCs1Mi41MDAuMDAwKzM2LjAwMC4wMDA9MTIxLjAwMC4wMDANCiQkDQoNClRvdGFsIEZyZWt1ZW5zaSB0YW5wYSBvdXRsaWVycyA6DQoNCiQkDQo1KzEwKzE1Kzg9MzgNCiQkDQoNCg0KTGFsdSBNYXN1a2FuIGRhbGFtIHJ1bXVzICggdGFucGEgb3V0bGllcnMpIDoNCg0KJCQNClxiYXJ7WH0gPSBcZnJhYyB7MTIxLjAwMC4wMDB9ezM4fSA9IDMuMTg0LjIxMQ0KJCQNCg0KIyMgS2VzaW1wdWxhbiA6DQoNCi0gTWVhbiBkZW5nYW4gb3V0bGllcnMgbWVuZ2hhc2lsa2FuIG5pbGFpIHNlYmVzYXIgMy4zMDAuMDAwLiBIYWwgaW5pIG1lbnVuanVra2FuIGJhaHdhIGtlYmVyYWRhYW4gZGF0YSBla3N0cmVtIHBhZGEgcmVudGFuZyBnYWppIDUuMDAwLjAwMCAtIDUuOTk5Ljk5OSBtZW1lbmdhcnVoaSBoYXNpbCByYXRhLXJhdGEsIHNlaGluZ2dhIG1lbmdoYXNpbGthbiBuaWxhaSB5YW5nIGxlYmloIHRpbmdnaSBkaWJhbmRpbmdrYW4gZGVuZ2FuIG1heW9yaXRhcyBkYXRhLiBNZWFuIGluaSBjb2NvayBkaWd1bmFrYW4gamlrYSBhbmFsaXNpcyBtZW1lcmx1a2FuIGlua2x1c2kgZGF0YSBla3N0cmVtLCBtaXNhbG55YSB1bnR1ayBtZW1haGFtaSBkaXN0cmlidXNpIGdhamkgdGluZ2dpLiAgDQoNCi0gTWVhbiB0YW5wYSBvdXRsaWVycyBtZW5naGFzaWxrYW4gbmlsYWkgc2ViZXNhciAzLjE4NC4yMTEsIHlhbmcgbGViaWggbWVuY2VybWlua2FuIGtvbmRpc2kgbWF5b3JpdGFzIGRhdGEgc2V0ZWxhaCBtZW5naGlsYW5na2FuIHBlbmdhcnVoIHJlbnRhbmcgZ2FqaSBla3N0cmVtLiBNZWFuIGluaSBsZWJpaCBzdGFiaWwgZGFuIHJlbGV2YW4gdW50dWsgYW5hbGlzaXMgeWFuZyBmb2t1cyBwYWRhIHRyZW4gdXRhbWEgZGFsYW0gZGlzdHJpYnVzaSBnYWppLg0KDQojIyBNZWRpYW4gOg0KDQojIyBNZW5nZ3VuYWthbiBPdXRsaWVyczoNCg0KJCQNClxiZWdpbnthbGlnbmVkfQ0KXHRleHR7TWVkaWFufSA9IHRiICsgXGxlZnQoIFxmcmFje1xmcmFje259ezJ9IC0gRn17Rl9tfSBccmlnaHQpLiBDDQpcZW5ke2FsaWduZWR9DQokJA0KDQokJA0KXGJlZ2lue2FsaWduZWR9DQo9IDIuOTk5Ljk5OSw1ICsgXGxlZnQoIFxmcmFje1xmcmFjezQwfXsyfSAtIDE1fXsxNX0gXHJpZ2h0KSAxLjAwMC4wMDAgXFwNCj0gMi45OTkuOTk5LDUgKyBcbGVmdCggXGZyYWN7MjAgLSAxNX17MTV9IFxyaWdodCkgMS4wMDAuMDAwIFxcID0gMi45OTkuOTk5LDUgKyAzMzMuMzMzLDMgXFwgDQo9IDMuMzMzLjMzMiw4IFJwIA0KXGVuZHthbGlnbmVkfQ0KJCQNCg0KIyMgVGFucGEgbWVuZ2d1bmFrYW4gb3V0bGllcnMNCg0KUG9zaXNpIG1lZGlhbiB1bnR1ayDwnZGbID0gMzggYWRhbGFoOg0KDQokJA0KXGZyYWMge259ezJ9ID0gXGZyYWMgezM4fXsyfSA9IDE5DQokJA0KRGltYW5hOg0KDQrwnZC/ID0gYmF0YXMgYmF3YWgga2VsYXMgbWVkaWFuID0gMi45OTkuOTk5IA0K8J2QuSA9IGZyZWt1ZW5zaSBrdW11bGF0aWYgc2ViZWx1bSBrZWxhcyBtZWRpYW4gPSAxNQ0K8J2Rk1/wnZGaID0gZnJla3VlbnNpIGtlbGFzIG1lZGlhbiA9IDE1DQrwnZGQPSBwYW5qYW5nIGtlbGFzID0gMS4wMDAuMDAwDQoNCiQkDQpcYmVnaW57YWxpZ25lZH0NCj0gMi45OTkuOTk5LDUgKyBcbGVmdCggXGZyYWN7XGZyYWN7Mzh9ezJ9IC0gMTV9ezE1fSBccmlnaHQpIDEuMDAwLjAwMCBcXA0KPSAyLjk5OS45OTksNSArIFxsZWZ0KCBcZnJhY3sxOSAtIDE1fXsxNX0gXHJpZ2h0KSAxLjAwMC4wMDAgXFwgPSAyLjk5OS45OTksNSArIDI2Ni42NjYsNjcgXFwgDQo9IDMuMjY2LjY2NiBScCANClxlbmR7YWxpZ25lZH0NCiQkDQoNCiMjIEtlc2ltcHVsYW4gOiANCg0KLSBEZW5nYW4gb3V0bGllcnMsIG1lZGlhbiB5YW5nIGxlYmloIHRpbmdnaSAoMy4zMzMuMzMzKSBtZW5jZXJtaW5rYW4ga2ViZXJhZGFhbiBkYXRhIHlhbmcgc2FuZ2F0IHRpbmdnaSwgeWFpdHUgcmVudGFuZyBnYWppIDUuMDAwLjAwMCAtIDUuOTk5Ljk5OSwgeWFuZyBkYXBhdCBtZW5nZ2VzZXIgbmlsYWkgdGVuZ2FoIGtlIGF0YXMuDQoNCi0gVGFucGEgb3V0bGllcnMsIG1lZGlhbiB5YW5nIGxlYmloIHJlbmRhaCAoMy4yNjYuNjY2KSBtZW1iZXJpa2FuIGdhbWJhcmFuIHlhbmcgbGViaWggYWt1cmF0IGRhbiByZXByZXNlbnRhdGlmIHRlbnRhbmcgbmlsYWkgdGVuZ2FoIGRpc3RyaWJ1c2kgZ2FqaSBwZW55YWx1ciBqaWthIG1lbmdhYmFpa2FuIGRhdGEgeWFuZyB0aWRhayBiaWFzYSBhdGF1IGVrc3RyaW0uDQoNCi0gT2xlaCBrYXJlbmEgaXR1LCBwZW1pbGloYW4gYW50YXJhIG1lbmdndW5ha2FuIG1lZGlhbiBkZW5nYW4gYXRhdSB0YW5wYSBvdXRsaWVycyBzYW5nYXQgYmVyZ2FudHVuZyBwYWRhIHR1anVhbiBhbmFsaXNpcy4gSmlrYSB0dWp1YW4gYW5hbGlzaXMgYWRhbGFoIG1lbmdnYW1iYXJrYW4gZGlzdHJpYnVzaSBrZXNlbHVydWhhbiBkYXRhLCB0ZXJtYXN1ayBla3N0cmVtLCBtYWthIG1lZGlhbiBkZW5nYW4gb3V0bGllcnMgYWRhbGFoIHBpbGloYW4geWFuZyB0ZXBhdC4gTmFtdW4sIGppa2EgaW5naW4gZm9rdXMgcGFkYSBkaXN0cmlidXNpIG1heW9yaXRhcyB0YW5wYSBkaXBlbmdhcnVoaSBvbGVoIGRhdGEgZWtzdHJpbSwgbWFrYSBtZWRpYW4gdGFucGEgb3V0bGllcnMgbGViaWggc2VzdWFpLg0KDQojIyBNb2R1cyA6DQoNCiMjIE1lbmdndW5ha2FuIE91dGxpZXJzIGRhbiB0aWRhayBtZW5nZ3VuYWthbiBPdXRsaWVyczoNCg0KJCQNClxiZWdpbnthbGlnbmVkfQ0KXHRleHR7TW9kdXN9ID0gdGIgKyBcbGVmdCggXGZyYWN7KGZfMSAtIGZfMCkgfXtmXzEgLSBmXzAgKyAoZl8xIC0gZl8yKX0gXHJpZ2h0KS5DDQpcZW5ke2FsaWduZWR9DQokJA0KDQokJA0KXGJlZ2lue2FsaWduZWR9DQpcdGV4dHtNb2R9ID0gdGIgKyBcbGVmdCggXGZyYWN7KGZfMSlfMH17KGZfMSlfMCArIChmXzIpXzB9IFxyaWdodCkgLmMNClxlbmR7YWxpZ25lZH0NCiQkDQoNCiQkDQpcYmVnaW57YWxpZ25lZH0NClx0ZXh0e01vZHVzfSA9IDIuOTk5Ljk5OSw1ICsgXGxlZnQoIFxmcmFjezE14oiSMTAgfXsgKDE14oiSMTApICsgKDE1IC0gOCl9IFxyaWdodCkgXHRpbWVzIDEuMDAwLjAwMA0KXGVuZHthbGlnbmVkfQ0KJCQNCg0KJCQNClxiZWdpbnthbGlnbmVkfQ0KICAgIFx0ZXh0e01vZH0gJj0gMi45OTkuOTk5LDUgXGxlZnQoIFxmcmFjezV9ezUgKyA3fSBccmlnaHQpIDEuMDAwLjAwMFxcDQogICAgJj0gMi45OTkuOTk5LDUrICg0MTYuNjY3KSBcXA0KICAgICY9IDMuNDE2LjY2Niw1DQpcZW5ke2FsaWduZWR9DQokJA0KDQogIGtlbGFzIHBlbmRhcGF0YW4gNC4wMDAuMDAwIC0gNC45OTkuOTk5IGFkYWxhaCB5YW5nIHBhbGluZyBiYW55YWsgbXVuY3VsLCBzZWhpbmdnYSBtb2R1cyBtZW1iZXJpa2FuIGtpdGEgICBpbmRpa2FzaSBiYWh3YSBwZW5kYXBhdGFuIHlhbmcgcGFsaW5nIHNlcmluZyBkaXRlbXVrYW4gZGkgYW50YXJhIGthcnlhd2FuIGFkYWxhaCBzZWtpdGFyIFJwIDMuNDE2LjY2Niw1Lg0KDQoNCiMjIEtlc2ltcHVsYW4gOg0KDQotIE1vZHVzIGRlbmdhbiBvdXRsaWVycyBtZW5naGFzaWxrYW4gbmlsYWkgc2ViZXNhciAzLjQxNi42NjcsIG1lbmNha3VwIHNlbHVydWggZGF0YSB0ZXJtYXN1ayByZW50YW5nIGdhamkgZWtzdHJlbSAob3V0bGllcnMpLiBOaWxhaSBpbmkgbWVuY2VybWlua2FuIGtlbGFzIGRlbmdhbiBmcmVrdWVuc2kgdGVydGluZ2dpLCB5YWl0dSBrZWxhcyAzLjAwMC4wMDAgLSAzLjk5OS45OTksIHlhbmcgdGV0YXAgZG9taW5hbiBtZXNraXB1biBhZGEgcGVuZ2FydWggZGF0YSBla3N0cmVtLiAgDQoNCi0gTW9kdXMgdGFucGEgb3V0bGllcnMganVnYSBtZW5naGFzaWxrYW4gbmlsYWkgc2ViZXNhciAzLjQxNi42NjcuIEhhbCBpbmkgbWVudW5qdWtrYW4gYmFod2EgcGVuZ2hhcHVzYW4gb3V0bGllcnMgdGlkYWsgbWVtZW5nYXJ1aGkgaGFzaWwsIGthcmVuYSBrZWxhcyBkZW5nYW4gZnJla3VlbnNpIHRlcnRpbmdnaSB0ZXRhcCBiZXJhZGEgZGkgcmVudGFuZyB5YW5nIHNhbWEsIHlhaXR1IGtlbGFzIDMuMDAwLjAwMCAtIDMuOTk5Ljk5OS4gIA0KDQotIEtlc2ltcHVsYW46IE1vZHVzIGRlbmdhbiBkYW4gdGFucGEgb3V0bGllcnMgbWVtYmVyaWthbiBoYXNpbCB5YW5nIHNhbWEgZGFsYW0ga2FzdXMgaW5pLiBIYWwgaW5pIG1lbnVuanVra2FuIGJhaHdhIGRhdGEgY3VrdXAgdGVya29uc2VudHJhc2kgcGFkYSBrZWxhcyBkZW5nYW4gZnJla3VlbnNpIHRlcnRpbmdnaSwgc2VoaW5nZ2EgZGF0YSBla3N0cmVtIHRpZGFrIG1lbWVuZ2FydWhpIG5pbGFpIG1vZHVzIHNlY2FyYSBzaWduaWZpa2FuLg0KDQojIDEuMi4yIEtlc2VoYXRhbg0KDQpUb3BpazogQW5hbGlzaXMgRGlzdHJpYnVzaSBKdW1sYWggRG9zaXMgVmFrc2luYXNpIENPVklELTE5IGRpIEtvdGEgTW9qb2tlcnRvDQoNClNlYnVhaCBkaW5hcyBrZXNlaGF0YW4gZGkga290YSBNb2pva2VydG8gbWVuZ2FuYWxpc2lzIGp1bWxhaCBkb3NpcyB2YWtzaW5hc2kgQ09WSUQtMTkgeWFuZyB0ZWxhaCBkaWJlcmlrYW4ga2VwYWRhIHBlbmR1ZHVrIGRhbGFtIGtlbG9tcG9rIHVzaWEgdGVydGVudHUuIERhdGEganVtbGFoIGRvc2lzIHZha3NpbiB5YW5nIGRpdGVyaW1hIHBlbmR1ZHVrIGRpIGtvdGEgbW9qb2tlcnRvIGRpa2Vsb21wb2trYW4gYmVyZGFzYXJrYW4ga2Vsb21wb2sgdXNpYSBzZWJhZ2FpIGJlcmlrdXQ6DQoNCmBgYHtyLCBlY2hvPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KIyBNZW1idWF0IGRhdGEga2Vsb21wb2sNCmxpYnJhcnkoa25pdHIpDQoNCmRhdGEgPC0gZGF0YS5mcmFtZSgNCiAgIktlbG9tcG9rX3VzaWFfKFRhaHVuKSIgPSBjKCIxOCAtIDI5IiwgIjMwIC0gMzkiLCAiNDAgLSA0OSIsICI1MCAtIDU5IiwgIjYwIC0gNjkiKSwNCiAgIkZyZWt1ZW5zaV9wZW5lcmltYV9kb3Npc192YWtzaW4iID0gYyggIjEwMDAiLCAiMTUwMCIsICIxMjAwIiwgIjgwMCIsICI1MDAiKSANCikNCiMgTWVuYW1waWxrYW4gdGFiZWwNCg0Ka2FibGUoZGF0YSwgYWxpZ24gPSAiYyIsIGNhcHRpb24gPSAiVGFiZWwgRGF0YSBLZWxvbXBvayB1bnR1ayBhbmFsaXNpcyBkaXRyaWJ1c2kganVtbGFoIHZha3NpbiIpDQoNCmBgYA0KDQpQZW55ZWxlc2FpYW4gOg0KDQpEaWtldGFodWkgYmFod2EgdGl0aWsgdGVuZ2FoLCBGcmVrdWVuc2kgS3VtdWxhdGlmIGFkYWxhaCBzZWJhZ2FpIGJlcmlrdXQgOg0KDQpgYGB7ciwgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRX0NCiMgTWVtYnVhdCBkYXRhIGtlbG9tcG9rDQpsaWJyYXJ5KGtuaXRyKQ0KDQpkYXRhIDwtIGRhdGEuZnJhbWUoDQogICJLZWxvbXBva191c2lhXyhUYWh1bikiID0gYygiMTggLSAyOSIsICIzMCAtIDM5IiwgIjQwIC0gNDkiLCAiNTAgLSA1OSIsICI2MCAtIDY5IiksDQogICJGcmVrdWVuc2lfcGVuZXJpbWFfZG9zaXNfdmFrc2luIiA9IGMoICIxMDAwIiwgIjE1MDAiLCAiMTIwMCIsICI4MDAiLCAiNTAwIiksIA0KICAiRmtrIiA9IGMoICIxMDAwIiwgIjI1MDAiLCAiMzcwMCIsICI0NTAwIiwgIjUwMDAiKSwgDQogICJOaWxhaV90ZW5nYWgiID0gYyggIjIzLjUiLCAiMzQuNSIsICI0NC41IiwgIjU0LjUiLCAiNjQuNSIpLA0KICAiaGFzaWxfa2FsaV9mcmVrdWVuc2lfZGFuX25pbGFpX3RlbmdhaCIgPSBjKCAiMjMsNTAwIiwgIjUxLDc1MCIsICI1Myw0MDAiLCAiNDMsNjAwIiwgIjMyLDI1MCIpDQopDQojIE1lbmFtcGlsa2FuIHRhYmVsDQoNCmthYmxlKGRhdGEsIGFsaWduID0gImMiLCBjYXB0aW9uID0gIlRhYmVsIERhdGEgS2Vsb21wb2sgdW50dWsgZnJla3VlbnNpIGt1bXVsYXRpZiBkYW4gbmlsYWkgdGVuZ2FoIGFuYWxpc2lzIG1lbmdndW5ha2FuIG91dGxpZXJzIikNCg0KYGBgDQoNCiMjIE1lYW4gOg0KDQogIEp1bWxhaCB0b3RhbCBmcmVrdWVuc2kg8J2RgT0gMTAwMCArIDE1MDAgKyAxMjAwICsgODAwICsgNTAwID0gNTAwMA0KDQpoaXR1bmcgcmF0YS1yYXRhIGRvc2lzIHZha3NpbmFzaToNCg0KIyMgTWVuZ2d1bmFrYW4gT3V0bGllcnMgDQoNCiQkDQpcYmVnaW57YWxpZ25lZH0NClxiYXJ7WH0gPSBcZnJhY3tcc3VtIGZYfXtufSA9IFxmcmFjIHsxMDAwKDIzLjUpKyAxNTAwKDM0LjUpKyAxMjAwKDQ0LjUpKyA4MDAoNTQuNSkrIDUwMCg2NC41KX17NTAwMH0NClxlbmR7YWxpZ25lZH0NCiQkDQokJA0KXGJlZ2lue2FsaWduZWR9DQo9IFxmcmFjIHsyMDQsNTAwfXs1MDAwfQ0KPSA0MC45dGFodW4NClxlbmR7YWxpZ25lZH0NCiQkDQoNCiMjIFRhbnBhIG1lbmdndW5ha2FuIE91dGxpZXJzIA0KDQpgYGB7ciwgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRX0NCiMgTWVtYnVhdCBkYXRhIGtlbG9tcG9rDQpsaWJyYXJ5KGtuaXRyKQ0KDQpkYXRhIDwtIGRhdGEuZnJhbWUoDQogICJLZWxvbXBva191c2lhXyhUYWh1bikiID0gYygiMTggLSAyOSIsICIzMCAtIDM5IiwgIjQwIC0gNDkiLCAiNTAgLSA1OSIpLA0KICAiRnJla3VlbnNpX3BlbmVyaW1hX2Rvc2lzX3Zha3NpbiIgPSBjKCAiMTAwMCIsICIxNTAwIiwgIjEyMDAiLCAiODAwIiksIA0KICAiTmlsYWlfdGVuZ2FoIiA9IGMoICIyMy41IiwgIjM0LjUiLCAiNDQuNSIsICI1NC41IiksDQogICJoYXNpbF9rYWxpX2ZyZWt1ZW5zaV9kYW5fbmlsYWlfdGVuZ2FoIiA9IGMoICIyMyw1MDAiLCAiNTEsNzUwIiwgIjUzLDQwMCIsICI0Myw2MDAiKQ0KKQ0KIyBNZW5hbXBpbGthbiB0YWJlbA0KDQprYWJsZShkYXRhLCBhbGlnbiA9ICJjIiwgY2FwdGlvbiA9ICJUYWJlbCBEYXRhIEtlbG9tcG9rIHVudHVrIGZyZWt1ZW5zaSBrdW11bGF0aWYgZGFuIG5pbGFpIHRlbmdhaCBhbmFsaXNpcyB0YW5wYSBvdXRsaWVycyIpDQoNCmBgYA0KDQpUb3RhbCBmcmVrdWVuc2kgdGFucGEgb3V0bGllcnM6IA0KDQokJA0Kbj0xMDAwKzE1MDArMTIwMCs4MDA9NDUwMA0KJCQNCg0KIE1lbmdoaXR1bmcgTWVhbiBUYW5wYSBPdXRsaWVyczoNCg0KJCQNClxiZWdpbnthbGlnbmVkfQ0KXGJhcntYfSA9IHtcc3VtIGZYfSA9IHsyMyw1MDArIDUxLDc1MCArIDUzLDQwMCArIDQzLDYwMH0gPSAxNzIsMjUwDQpcZW5ke2FsaWduZWR9DQokJA0KJCQNClxiZWdpbnthbGlnbmVkfQ0KPSBcZnJhYyB7MTcyLDI1MH17NDUwMH0NCj0gMzguMjIgdGFodW4NClxlbmR7YWxpZ25lZH0NCiQkDQoNCiMjIEtlc2ltcHVsYW4gOg0KDQotIE1lYW4gZGVuZ2FuIE91dGxpZXJzIGFkYWxhaCA0MC45LCB5YW5nICBtZW5jYWt1cCBzZWx1cnVoIGRhdGEsIHRlcm1hc3VrIGtlbG9tcG9rICB1c2lhIDYwIC0gNjkgeWFuZyBkaWFuZ2dhcCBzZWJhZ2FpIG91dGxpZXIuDQoNCi0gTWVhbiB0YW5wYSBPdXRsaWVycyBhZGFsYWggMzguMjIsIHlhbmcgZGlwZXJvbGVoIHNldGVsYWggbWVuZ2FiYWlrYW4ga2Vsb21wb2sgdXNpYSAgIDYwIC0gNjkgeWFuZyBkaWFuZ2dhcCBzZWJhZ2FpIG91dGxpZXIuDQoNCi0gUGVuZ2FydWggT3V0bGllcnM6IE1lYW4gZGVuZ2FuIG91dGxpZXJzICBsZWJpaCB0aW5nZ2ksIG1lbnVuanVra2FuIHBlbmdhcnVoIGtlbG9tcG9rICAgdXNpYSB5YW5nIGxlYmloIHR1YSB5YW5nIG1lbWlsaWtpIG5pbGFpIGxlYmloIHRpbmdnaSAoNjQuNSksIHlhbmcgbWVtcGVuZ2FydWhpICByYXRhLXJhdGEga2VzZWx1cnVoYW4uIFNldGVsYWggbWVuZ2hhcHVzICBkYXRhIG91dGxpZXIsIHJhdGEtcmF0YSBtZW5qYWRpIGxlYmloICByZW5kYWgsIG1lbmNlcm1pbmthbiBkaXN0cmlidXNpIGRhdGEgbWF5b3JpdGFzIHBlbmVyaW1hIHZha3Npbi4NCg0KIyMgTWVkaWFuIDogDQoNCiMjIE1lbmdndW5ha2FuIE91dGxpZXJzIA0KDQokJA0KXGJlZ2lue2FsaWduZWR9DQpcdGV4dHtNZWRpYW59ID0gdGIgKyBcbGVmdCggXGZyYWN7XGZyYWN7bn17Mn0gLSBGfXtGX219IFxyaWdodCkuIEMNClxlbmR7YWxpZ25lZH0NCiQkDQoNCiQkDQpcYmVnaW57YWxpZ25lZH0NClx0ZXh0e01lZGlhbn0gJj0gMjkuNSArIFxsZWZ0KCBcZnJhY3tcZnJhY3s1MDAwfXsyfSAtIDEwMDB9ezE1MDB9IFxyaWdodCkgMTAgXFwNCiY9IDI5LjUgKyBcbGVmdCggXGZyYWN7MjUwMCAtIDEwMDB9ezE1MDB9IFxyaWdodCkgMTAgXFwgJj0gMjkuNSArIDEwIFxcICY9MzkuNSB0YWh1bg0KXGVuZHthbGlnbmVkfQ0KJCQgDQoNCiMjIFRhbnBhIG1lbmdndW5ha2FuIE91dGxpZXJzIA0KDQpKdW1sYWggdG90YWwgZnJla3VlbnNpIHRhbnBhIG91dGxpZXJzIPCdkZs9NDUwMA0KDQokJA0KXGZyYWMge259ezJ9ID0gXGZyYWMgezQ1MDB9ezJ9ID0gMjI1MA0KJCQNCm1lbmdoaXR1bmcgbWVkaWFuIHRhbnBhIG91dGxpZXJzIDoNCg0KJCQNClxiZWdpbnthbGlnbmVkfQ0KXHRleHR7TWVkaWFufSAmPSAyOS41ICsgXGxlZnQoIFxmcmFje1xmcmFjezQ1MDB9ezJ9IC0gMTAwMH17MTUwMH0gXHJpZ2h0KSAxMCBcXA0KJj0gMjkuNSArIFxsZWZ0KCBcZnJhY3syMjUwIC0gMTAwMH17MTUwMH0gXHJpZ2h0KSAxMCBcXCAmPSAyOS41ICsgOC4zMyBcXCAmPTM3LjgzIHRhaHVuDQpcZW5ke2FsaWduZWR9DQokJCANCg0KIyMgS2VzaW1wdWxhbiA6DQoNCi0gTWVkaWFuIGRlbmdhbiBPdXRsaWVycyAobWVuZ2hpdHVuZyBkZW5nYW4gc2VsdXJ1aCBkYXRhKSBhZGFsYWggMzkuNS4NCg0KLSBNZWRpYW4gdGFucGEgT3V0bGllcnMgKG1lbmdhYmFpa2FuIGtlbG9tcG9rIHVzaWEgNjAgLSA2OSBzZWJhZ2FpIG91dGxpZXIpIGFkYWxhaCAzNy44My4NCg0KLSBQZW5nYXJ1aCBPdXRsaWVyczogUGVyYmVkYWFuIG5pbGFpIG1lZGlhbiBtZW51bmp1a2thbiBiYWh3YSBrZWxvbXBvayB1c2lhIHlhbmcgbGViaWggdHVhICg2MCAtIDY5KSB5YW5nIGRpYW5nZ2FwIHNlYmFnYWkgb3V0bGllciBtZW1pbGlraSBkYW1wYWsgcGFkYSBuaWxhaSBtZWRpYW4uIFNldGVsYWggbWVuZ2FiYWlrYW4gb3V0bGllciwgbmlsYWkgbWVkaWFuIHNlZGlraXQgbGViaWggcmVuZGFoLCBtZW5jZXJtaW5rYW4gZGlzdHJpYnVzaSBkYXRhIG1heW9yaXRhcyBwZW5lcmltYSB2YWtzaW4geWFuZyBsZWJpaCB0ZXJwdXNhdC4NCg0KDQojIyBNb2R1cyA6DQoNCg0KIyMgTWVuZ2d1bm5ha2FuIE91dGxpZXJzIGRhbiB0YW5wYSBtZW5nZ3VuYWthbiBPdXRsaWVycyANCg0KJCQNClxiZWdpbnthbGlnbmVkfQ0KXHRleHR7TW9kdXN9ID0gdGIgKyBcbGVmdCggXGZyYWN7KGZfMSAtIGZfMCkgfXtmXzEgLSBmXzAgKyAoZl8xIC0gZl8yKX0gXHJpZ2h0KS5DDQpcZW5ke2FsaWduZWR9DQokJA0KDQokJA0KXGJlZ2lue2FsaWduZWR9DQpcdGV4dHtNb2R9ID0gdGIgKyBcbGVmdCggXGZyYWN7KGZfMSlfMH17KGZfMSlfMCArIChmXzIpXzB9IFxyaWdodCkuQw0KXGVuZHthbGlnbmVkfQ0KJCQNCg0KJCQNClxiZWdpbnthbGlnbmVkfQ0KXHRleHR7TW9kfSAmPSAyOS41IFxsZWZ0KCBcZnJhY3s1MDB9ezUwMCArIDMwMH0gXHJpZ2h0KSAxMFxcDQogJj0gMjkuNSArICgwLjYyNSkgXFwgJj0gMzUuNzV0YWh1bg0KXGVuZHthbGlnbmVkfQ0KJCQNCg0KICBKYWRpIG1vZHVzIGRpYXRhcyB0ZXJkYXBhdCBwYWRhIHVzaWEgc2VraXRhciAzNi4yNSB0YWh1biBhZGFsYWggdXNpYSB5YW5nIHBhbGluZyBzZXJpbmcgbWVuZGFwYXRrYW4gICAgICAgdmFrc2luLCB5YW5nIHRlcm1hc3VrIGRhbGFtIGtlbG9tcG9rIHVzaWEgMzAgLSAzOSB0YWh1bi4NCiAgDQojIyBLZXNpbXB1bGFuIDoNCg0KLSBOaWxhaSBtb2R1cyB0aWRhayB0ZXJwZW5nYXJ1aCBvbGVoIG91dGxpZXJzIGRhbGFtIGRhdGEgaW5pLg0KDQotIEhhbCBpbmkgZGlzZWJhYmthbiBvbGVoIHBvc2lzaSBrZWxhcyBtb2R1cyAoIDMwIOKIkiAzOSApIHlhbmcgdGlkYWsgYmVydWJhaCBtZXNraXB1biBvdXRsaWVyIChrZWxhcyANCjYw4oiSNjkpIGRpa2VsdWFya2FuLg0KDQotIE1vZHVzIG1lbWJlcmlrYW4gaW5mb3JtYXNpIHRlbnRhbmcga2Vsb21wb2sgdXNpYSB5YW5nIHBhbGluZyB1bXVtIGRhbGFtIGRhdGEgcGVuZXJpbWEgdmFrc2luLCB5YWl0dSAzMCAtIDM5IHRhaHVuLCB0ZXJsZXBhcyBkYXJpIGtlYmVyYWRhYW4gb3V0bGllcnMuDQoNCi0gUGVuZ2d1bmFhbiBiYXRhcyBiYXdhaCDwnZC/PSAyOS41IG1lbmdoYXNpbGthbiBuaWxhaSBtb2R1cyB5YW5nIHNhbWEgdW50dWsga2VkdWEgbWV0b2RlLiBJbmkgdGVyamFkaSBrYXJlbmEgZnJla3VlbnNpIHRlcnRpbmdnaSB0ZXRhcCBiZXJhZGEgZGkga2VsYXMgeWFuZyBzYW1hICggMzAg4oiSIDM5KSwgc2VoaW5nZ2Egb3V0bGllciB0aWRhayBtZW1lbmdhcnVoaSBoYXNpbCBwZXJoaXR1bmdhbiBtb2R1cy4NCg0KDQojIyBWYWxpZGFzaSBEYXRhIA0KDQp1bnR1ayBtZW12YWxpZGFzaSBkYXRhIG1ha2EgbWVuZ2d1bmFrYW4gcHJlc2VudGFzZSBlZmVrdGl2aXRhcyB2YWtzaW5hc2kgIHRpYXAga2Vsb21wb2sgdXNpYSAoIGRhbGFtIGJlbnR1ayAlICkgOg0KDQpgYGB7ciwgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRX0NCiMgTWVtYnVhdCBkYXRhIGtlbG9tcG9rDQpsaWJyYXJ5KGtuaXRyKQ0KDQpkYXRhIDwtIGRhdGEuZnJhbWUoDQogICJLZWxvbXBva19Vc2lhKFRhaHVuKSIgPSBjKCIxOCAtIDI5IiwgIjMwIC0gMzkiLCAiNDAgLSA0OSIsICI1MCAtIDU5IiwgIjYwIC0gNjkiKSwNCiAgIkZyZWt1ZW5zaV9wZW5lcmltYV92YWtzaW4iID0gYygiMTAwMCIsICIxNTAwIiwgIjEyMDAiLCAiODAwIiwgIjUwMCIpLA0KICAiRWZla3Rpdml0YXNfVmFrc2luYXNpKCUpIiA9IGMoICI5OCUiLCAiOTclIiwgIjk1JSIsICI5MCUiLCAiODUlIikgDQopDQojIE1lbmFtcGlsa2FuIHRhYmVsDQoNCmthYmxlKGRhdGEsIGFsaWduID0gImMiLCBjYXB0aW9uID0gIlRhYmVsIERhdGEgS2Vsb21wb2sgdW50dWsgbWV2YWxpZGFzaSBkYXRhIG1lbmdndW5ha2FuIHByZXNlbnRhc2UgZWZla3Rpdml0YXMgdmFrc2luYXNpIikNCg0KYGBgDQogDQojIyBMYW5na2FoLWxhbmdrYWggdmFsaWRhc2k6DQoNCjEuIE1lbmdoaXR1bmcgVG90YWwgRWZla3Rpdml0YXMgVmFrc2luYXNpIGRlbmdhbiBydW11cyA6DQoNCiQkDQpcdGV4dHtSYXRhLXJhdGEgRWZla3Rpdml0YXN9ID0gXGZyYWN7XFNpZ21hIChcdGV4dHtGcmVrdWVuc2l9IFx0aW1lcyBcdGV4dHtFZmVrdGl2aXRhc30pfXtcU2lnbWEgKFx0ZXh0e0ZyZWt1ZW5zaX0pfQ0KJCQNCg0KUGVyaGl0dW5nYW46DQoNCiQkDQpcYmVnaW57YWxpZ25lZH0NClx0ZXh0e1JhdGEtcmF0YSBFZmVrdGl2aXRhc30gPSBcZnJhY3soMTAwMCBcdGltZXMgOTgpICsgKDE1MDAgXHRpbWVzIDk3KSArICgxMjAwIFx0aW1lcyA5NSkgKyAoODAwIFx0aW1lcyA5MCkgKyAoNTAwIFx0aW1lcyA4NSl9ezUwMDB9DQpcZW5ke2FsaWduZWR9DQokJA0KDQokJA0KXGJlZ2lue2FsaWduZWR9DQo9IFxmcmFjezk4MDAwICsgMTQ1NTAwICsgMTE0MDAwICsgNzIwMDAgKyA0MjUwMH17NTAwMH0NClxlbmR7YWxpZ25lZH0NCiQkDQoNCiQkDQpcYmVnaW57YWxpZ25lZH0NCj0gXGZyYWN7NDcyMDAwfXs1MDAwfSA9IDk0LjRcJQ0KXGVuZHthbGlnbmVkfQ0KJCQNCg0KICBKYWRpLCByYXRhLXJhdGEgZWZla3Rpdml0YXMgdmFrc2luYXNpIGFkYWxhaCAkezk0LjRcJX0kLg0KDQoyLiBNZW1iYW5kaW5na2FuIGRlbmdhbiBBbWJhbmcgS2ViZXJoYXNpbGFuIDk5JSA6DQoNCkppa2Egc3RhbmRhciBrZWJlcmhhc2lsYW4gYWRhbGFoIDk5JSwgcmF0YS1yYXRhIGVmZWt0aXZpdGFzIHNlYmVzYXIgOTQuNCUgYmVsdW0gbWVuY2FwYWkgYW5na2EgaW5pLiBEZW5nYW4gZGVtaWtpYW4sIHZha3NpbmFzaSBwYWRhIGtlbG9tcG9rIGluaSBiZWx1bSBtZW1lbnVoaSBrcml0ZXJpYSBrZWJlcmhhc2lsYW4gOTklLg0KDQozLiBBbmFsaXNpcyBQZXIgS2Vsb21wb2sgVXNpYSB5YW5nIG1lbmRla2F0aSBhdGF1IG1lbGViaWhpIDk5JToNCg0KICAtIEtlbG9tcG9rIHVzaWEgMTggLSAyOSB0YWh1biBtZW1pbGlraSBlZmVrdGl2aXRhcyB0ZXJ0aW5nZ2ksIHlhaXR1IDk4JSwgICAgIHRldGFwaSBtYXNpaCBkaSBiYXdhaCA5OSUuDQogIA0KICAtIEtlbG9tcG9rIGxhaW5ueWEgbWVtaWxpa2kgZWZla3Rpdml0YXMgeWFuZyBzZW1ha2luIG1lbnVydW4gZGVuZ2FuICAgICAgICAgYmVydGFtYmFobnlhIHVzaWEuDQogIA0KNC4gS2VzaW1wdWxhbiBWYWxpZGFzaToNCg0KICAtIFNlY2FyYSBrZXNlbHVydWhhbiwgcmF0YS1yYXRhIGVmZWt0aXZpdGFzIHZha3NpbmFzaSBhZGFsYWggOTQuNCUsIHlhbmcgICAgIGJlbHVtIG1lbmNhcGFpIHRhcmdldCBrZWJlcmhhc2lsYW4gOTklLg0KICANCiAgLSBQZXIga2Vsb21wb2ssIHRpZGFrIGFkYSBrZWxvbXBvayB5YW5nIG1lbmNhcGFpIGF0YXUgbWVsZWJpaGkgYW1iYW5nICAgICAgIDk5JS4NCiAgDQogIC0gVW50dWsgbWVuY2FwYWkga2ViZXJoYXNpbGFuIDk5JSwgZGlwZXJsdWthbiBzdHJhdGVnaSB0YW1iYWhhbiwgc2VwZXJ0aSAgICAgbWVuaW5na2F0a2FuIGNha3VwYW4gdmFrc2luYXNpLCBvcHRpbWFzaSBkb3NpcyB1bnR1ayBrZWxvbXBvayB1c2lhICAgICAgICB0ZXJ0ZW50dSwgYXRhdSBldmFsdWFzaSB0ZXJoYWRhcCBqZW5pcyB2YWtzaW4geWFuZyBkaWd1bmFrYW4uDQoNCg0KIyAxLjIuMyBQZW5kaWRpa2FuDQoNClRvcGlrOiBNZW5nYW5hbGlzaXMgYmFnYWltYW5hIHBlbmdndW5hYW4gbWVkaWEgc29zaWFsIG1lbWVuZ2FydWhpIHByb2R1a3Rpdml0YXMgYmVsYWphciBzaXN3YS4NCg0KZGF0YSB0ZW50YW5nIHdha3R1IHBlbmdndW5hYW4gbWVkaWEgc29zaWFsIHNpc3dhIHNldGlhcCBoYXJpIChkYWxhbSBqYW0pIGRhbiByYXRhLXJhdGEgbmlsYWkgdWppYW4geWFuZyBtZXJla2EgcGVyb2xlaC4gRGF0YSBkaWJhZ2kgZGFsYW0ga2Vsb21wb2sgd2FrdHUgcGVuZ2d1bmFhbiBtZWRpYSBzb3NpYWwgc2ViYWdhaSBiZXJpa3V0IDoNCg0KDQpgYGB7ciwgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRX0NCiMgTWVtYnVhdCBkYXRhIGtlbG9tcG9rDQpsaWJyYXJ5KGtuaXRyKQ0KDQpkYXRhIDwtIGRhdGEuZnJhbWUoDQogICJ3YWt0dV9QZW5nZ3VuYWFuX01lZGlhX1Nvc2lhbF8oamFtL2hhcmkpIiA9IGMoIjAgLSAxIiwgIjIgLSAzIiwgIjQgLSA1IiwgIjYgLSA3IiksDQogICJGcmVrdWVuc2lfc2lzd2EiID0gYygiOCIsICIxMiIsICIxMCIsICI1IiksDQogICJSYXRhX3JhdGFfbmlsYWlfdWppYW5fKDEtMTAwKSIgPSBjKCAiODUiLCAiNzUiLCAiNjUiLCAiNjAiKSANCikNCiMgTWVuYW1waWxrYW4gdGFiZWwNCg0Ka2FibGUoZGF0YSwgYWxpZ24gPSAiYyIsIGNhcHRpb24gPSAiVGFiZWwgRGF0YSBLZWxvbXBvayB1bnR1ayBtZWRpYW4gZnJla3VlbnNpIGt1bXVsYXRpZiIpDQoNCmBgYA0KDQpQZW55ZWxlc2FpYW4gOg0KDQpEaWtldGFodWkgYmFod2EgdGl0aWsgdGVuZ2FoLCBGcmVrdWVuc2kgS3VtdWxhdGlmIGFkYWxhaCBzZWJhZ2FpIGJlcmlrdXQgOg0KDQpgYGB7ciwgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRX0NCiMgTWVtYnVhdCBkYXRhIGtlbG9tcG9rDQpsaWJyYXJ5KGtuaXRyKQ0KDQpkYXRhIDwtIGRhdGEuZnJhbWUoDQogICJ3YWt0dV9QZW5nZ3VuYWFuX01lZGlhX1Nvc2lhbF8oamFtL2hhcmkpIiA9IGMoIjAgLSAxIiwgIjIgLSAzIiwgIjQgLSA1IiwgIjYgLSA3IiksDQogICJGcmVrdWVuc2lfc2lzd2EiID0gYygiOCIsICIxMiIsICIxMCIsICI1IiksIA0KICAiRmtrIiA9IGMoICI4IiwgIjIwIiwgIjMwIiwgIjM1IiksIA0KICAiVGl0aWtfdGVuZ2FoIiA9IGMoICIwLjUiLCAiMi41IiwgIjQuNSIsICI2LjUiKSwNCiAgImhhc2lsX2thbGlfZnJla3VlbnNpX2Rhbl90aXRpa190ZW5nYWgiID0gYyggIjQiLCAiMzAiLCAiNDUiLCAiMzIuNSIpDQopDQojIE1lbmFtcGlsa2FuIHRhYmVsDQoNCmthYmxlKGRhdGEsIGFsaWduID0gImMiLCBjYXB0aW9uID0gIlRhYmVsIERhdGEgS2Vsb21wb2sgdW50dWsgZnJla3VlbnNpIGt1bXVsYXRpZiBkYW4gbmlsYWkgdGVuZ2FoIGFuYWxpc2lzIG1lbmdndW5ha2FuIG91dGxpZXJzIikNCg0KYGBgDQoNCiMjIE1lYW4gOg0KDQogIFRvdGFsIGZyZWt1ZW5zaSAkKPCdkYEpID0gMzUkDQoNCiAgVG90YWwgJPCdkZMu8J2RpSA9IDQgKyAzMCArIDQ1ICsgMzIuNSA9IDExMS41JA0KDQpoaXR1bmcgcmF0YS1yYXRhIHBlbmdndW5hYW4gbWVkaWEgc29zaWFsOg0KDQojIyBNZW5nZ3VuYWthbiBPdXRsaWVycw0KDQokJA0KXGJlZ2lue2FsaWduZWR9DQpcYmFye1h9ID0gXGZyYWN7XHN1bSBmWH17bn0gPSBcZnJhYyB7OCgwLjUpKyAxMigyLjUpKyAxMCg0LjUpKyA1KDYuNSl9ezM1fQ0KPSBcZnJhYyB7MTExLjV9ezM1fQ0KPSAzLjE4IGphbS9oYXJpLg0KXGVuZHthbGlnbmVkfQ0KJCQNCg0KIyMgVGFucGEgbWVuZ2d1bmFrYW4gb3V0bGllcnMNCg0KLSBIaXR1bmcgdG90YWwgaGFzaWwga2FsaSDwnZGT4ouF8J2RpSB0YW5wYSBvdXRsaWVyczoNCg0KJCQNClRvdGFsIGbii4V4ID0gNCArIDMwICsgNDUgPSA3OQ0KJCQNCi0gSnVtbGFoIGZyZWt1ZW5zaSAo8J2RmykgdGFucGEgb3V0bGllcnM6DQoNCiQkDQpuID0gOCArIDEyICsgMTAgPSAzMA0KJCQNCg0KLSBoaXR1bmcgbWVhbiA6DQoNCiQkDQpcYmVnaW57YWxpZ25lZH0NClxiYXJ7WH0gPSBcZnJhY3tcc3VtIGZYfXtufSA9IFxmcmFjIHs4KDAuNSkrIDEyKDIuNSkrIDEwKDQuNSl9ezMwfQ0KPSBcZnJhYyB7Nzl9ezMwfQ0KPSAyLjYzIGphbS9oYXJpLg0KXGVuZHthbGlnbmVkfQ0KJCQNCg0KIyMgS2VzaW1wdWxhbiA6DQoNCi0gUGVuZ2FydWggb3V0bGllcnMgcGFkYSBtZWFuIHNhbmdhdCBzaWduaWZpa2FuLiBOaWxhaSBtZWFuIGRlbmdhbiBvdXRsaWVycyBsZWJpaCB0aW5nZ2kgZGliYW5kaW5na2FuIHRhbnBhIG91dGxpZXJzLg0KDQotIE1lYW4gdGFucGEgb3V0bGllcnMgbWVtYmVyaWthbiByZXByZXNlbnRhc2kgeWFuZyBsZWJpaCBha3VyYXQgdGVyaGFkYXAgd2FrdHUgcGVuZ2d1bmFhbiBtZWRpYSBzb3NpYWwgbWF5b3JpdGFzIHNpc3dhLg0KDQotIEtlcHV0dXNhbiB1bnR1ayBtZW5nZ3VuYWthbiBtZWFuIGRlbmdhbiBhdGF1IHRhbnBhIG91dGxpZXJzIHRlcmdhbnR1bmcgcGFkYSB0dWp1YW4gYW5hbGlzaXM6DQoNCiAgLSBEZW5nYW4gb3V0bGllcnM6IE1lbmdnYW1iYXJrYW4gc2VsdXJ1aCBkaXN0cmlidXNpIGRhdGEsIHRlcm1hc3VrIGVrc3RyZW0uDQogIA0KICAtIFRhbnBhIG91dGxpZXJzOiBNZW1iZXJpa2FuIGdhbWJhcmFuIHlhbmcgbGViaWggc3RhYmlsIGRhbiByZWFsaXN0aXMgdGVyaGFkYXAgZGF0YSB1bXVtLg0KICANCiAgDQojIyBNZWRpYW4gOiANCg0KIyMgTWVuZ2d1bmFrYW4gT3V0bGllcnMNCg0KJCQNClxiZWdpbnthbGlnbmVkfQ0KXHRleHR7TWVkaWFufSA9IExfMCArIFxsZWZ0KCBcZnJhY3tcZnJhY3tufXsyfSAtIEZ9e0ZfbX0gXHJpZ2h0KS4gQw0KXGVuZHthbGlnbmVkfQ0KJCQNCg0KJCQNClxiZWdpbnthbGlnbmVkfQ0KXHRleHR7TWVkaWFufSAmPSAyICsgXGxlZnQoIFxmcmFje1xmcmFjezM1fXsyfSAtIDh9ezEyfSBccmlnaHQpIDIgXFwNCiY9IDIgKyBcbGVmdCggXGZyYWN7MTcuNeKIkjh9ezEyfSBccmlnaHQpIDIgXFwgJj0gMisgMSw1OCBcXCAmPTMuNTggamFtL2hhcmkuDQpcZW5ke2FsaWduZWR9DQokJA0KDQojIyB0YW5wYSBtZW5nZ3VuYWthbiBvdXJsaWVycyANCg0KYGBge3IsIGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQojIE1lbWJ1YXQgZGF0YSBrZWxvbXBvaw0KbGlicmFyeShrbml0cikNCg0KZGF0YSA8LSBkYXRhLmZyYW1lKA0KICAid2FrdHVfUGVuZ2d1bmFhbl9NZWRpYV9Tb3NpYWxfKGphbS9oYXJpKSIgPSBjKCIwIC0gMSIsICIyIC0gMyIsICI0IC0gNSIpLA0KICAiRnJla3VlbnNpX3Npc3dhIiA9IGMoIjgiLCAiMTIiLCAiMTAiKSwgDQogICJGa2siID0gYygiOCIsICIyMCIsICIzMCIpIA0KICANCikNCiMgTWVuYW1waWxrYW4gdGFiZWwNCg0Ka2FibGUoZGF0YSwgYWxpZ24gPSAiYyIsIGNhcHRpb24gPSAiVGFiZWwgRGF0YSBLZWxvbXBvayB1bnR1ayBmcmVrdWVuc2kga3VtdWxhdGlmIGRhbiBuaWxhaSB0ZW5nYWggYW5hbGlzaXMgdGFucGEgb3V0bGllcnMiKQ0KDQpgYGANCg0KLSBtZW5jYXJpIFxmcmFje259ezJ9IDoNCg0KJCQNClxmcmFje259ezJ9ID0gXGZyYWN7MzB9ezJ9ID0gMTUNCiQkDQotIGhpdHVuZyBtZWRpYW4gOg0KDQokJA0KXGJlZ2lue2FsaWduZWR9DQpcdGV4dHtNZWRpYW59ICY9IDIgKyBcbGVmdCggXGZyYWN7XGZyYWN7MzB9ezJ9IC0gOH17MTJ9IFxyaWdodCkgMiBcXA0KJj0gMiArIFxsZWZ0KCBcZnJhY3sxNeKIkjh9ezEyfSBccmlnaHQpIDIgXFwgJj0gMisgMSwxNyBcXCAmPTMuMTcgamFtL2hhcmkuDQpcZW5ke2FsaWduZWR9DQokJA0KDQojIyBLZXNpbXB1bGFuIDoNCg0KLSBQZW5nYXJ1aCBvdXRsaWVycyBwYWRhIG1lZGlhbiB0aWRhayB0ZXJsYWx1IGJlc2FyLCB0ZXRhcGkgdGV0YXAgbWVtYmVyaWthbiBwZXJiZWRhYW4uIE1lZGlhbiBkZW5nYW4gb3V0bGllcnMgc2VkaWtpdCBsZWJpaCB0aW5nZ2ksIG1lbmNlcm1pbmthbiBwZW5nYXJ1aCBkYXRhIGVrc3RyZW0gcGFkYSBuaWxhaSB0ZW5nYWguDQoNCi0gTWVkaWFuIHRhbnBhIG91dGxpZXJzIG1lbWJlcmlrYW4gZ2FtYmFyYW4geWFuZyBsZWJpaCBzdGFiaWwgZGFuIHJlcHJlc2VudGF0aWYgdW50dWsgbWF5b3JpdGFzIGRhdGEsIGRlbmdhbiB3YWt0dSBwZW5nZ3VuYWFuIG1lZGlhIHNvc2lhbCB5YW5nIGxlYmloIHJlYWxpc3RpcyBiYWdpIHNlYmFnaWFuIGJlc2FyIHNpc3dhLg0KDQojIyBNb2R1cyA6DQoNCiMjIE1lbmdndW5ha2FuIE91dGxpZXJzIGRhbiB0YW5wYSBvdXRsaWVycw0KDQokJA0KXGJlZ2lue2FsaWduZWR9DQpcdGV4dHtNb2R1c30gPSBMXzAgKyBcbGVmdCggXGZyYWN7KGZfMSAtIGZfMCkgfXtmXzEgLSBmXzAgKyAoZl8xIC0gZl8yKX0gXHJpZ2h0KSBDDQpcZW5ke2FsaWduZWR9DQokJA0KDQokJA0KXGJlZ2lue2FsaWduZWR9DQpcdGV4dHtNb2R9ID0gTF8wIFxsZWZ0KCBcZnJhY3soZl8xKV8wfXsoZl8xKV8wICsgKGZfMilfMH0gXHJpZ2h0KS5DDQpcZW5ke2FsaWduZWR9DQokJA0KJCQNClxiZWdpbnthbGlnbmVkfQ0KXHRleHR7TW9kdXN9ID0gMiArIFxsZWZ0KCBcZnJhY3soMTLiiJI4KSB9ezEyIC0gOCArICgxMiAtIDEwKX0gXHJpZ2h0KS4gMg0KXGVuZHthbGlnbmVkfQ0KJCQNCiQkDQpcYmVnaW57YWxpZ25lZH0NClx0ZXh0e01vZH0gJj0gMiBcbGVmdCggXGZyYWN7NH17NCArIDJ9IFxyaWdodCkuIDJcXA0KICY9IDIrMS4zMyBcXCAmPSAzLjMzIGphbS9oYXJpLg0KXGVuZHthbGlnbmVkfQ0KJCQNCg0KICBCZXJkYXNhcmthbiBwZXJoaXR1bmdhbiBtZW5nZ3VuYWthbiBtZXRvZGUgbW9kdXMsIGRpdGVtdWthbiBiYWh3YSBrZWxhcyBpbnRlcnZhbCAyIC0gMyBqYW0vaGFyaSBhZGFsYWggICAga2VsYXMgZGVuZ2FuIGZyZWt1ZW5zaSB0ZXJ0aW5nZ2ksIHlhaXR1IHNlYmFueWFrIDEyIHNpc3dhLiBEZW5nYW4gZGlkYXBhdGthbiBuaWxhaSBtb2R1cyBzZWJlc2FyIDIuNjcgICAgIGphbS9oYXJpLg0KDQojIyBLZXNpbXB1bGFuIDoNCg0KLSBNb2R1cyBkZW5nYW4gZGFuIHRhbnBhIG91dGxpZXJzIG1lbmdoYXNpbGthbiBuaWxhaSB5YW5nIHNhbWEgZGFsYW0ga2FzdXMgaW5pLiBJbmkgbWVudW5qdWtrYW4gYmFod2EgZGF0YSBkYWxhbSBrZWxvbXBvayBpbmkgY3VrdXAgdGVya29uc2VudHJhc2kgcGFkYSBrZWxhcyBkZW5nYW4gZnJla3VlbnNpIHRpbmdnaSAoMiAtIDMgamFtL2hhcmkpLCBzZWhpbmdnYSBwZW5nYXJ1aCBkYXRhIGVrc3RyZW0gcGFkYSBrZWxhcyA2IC0gNyBqYW0vaGFyaSB0aWRhayB0ZXJsYWx1IG1lbXBlbmdhcnVoaSBuaWxhaSBtb2R1cy4NCg0KLSBNb2R1cyB5YW5nIGRpdGVtdWthbiBhZGFsYWggMy4zMyBqYW0vaGFyaSwgeWFuZyBtZW51bmp1a2thbiB3YWt0dSBwZW5nZ3VuYWFuIG1lZGlhIHNvc2lhbCB5YW5nIHBhbGluZyB1bXVtIGRpZ3VuYWthbiBvbGVoIHNpc3dhIGRhbGFtIGRhdGFzZXQgaW5pLCBiYWlrIGRlbmdhbiBtYXVwdW4gdGFucGEgbWVtcGVyaGl0dW5na2FuIG91dGxpZXJzLg==