Code
Ignasius Rabi Blolong
Student Majoring in Data Science at ITSB
R Programming Data Science Statistics
Cases Study Uji Z Satu
Sampel
Identifikasi
Masalah
Platform pembelajaran digital mengklaim rata-rata waktu belajar
harian penggunanya adalah 120 menit. Berdasarkan data historis, standar
deviasi populasi diketahui sebesar 15 menit. Sampel acak sebanyak 64
pengguna menunjukkan rata-rata waktu belajar 116 menit.
Jawaban Tugas
Uji Statistik yang
Tepat
Uji Z Satu Sampel : Karena Standar deviasi Populasi (\(\sigma\) ) diketahui dan ukuran sampel
besar(\(n > 30\) )
Statistik Uji
(Z-Test) dan P-Value
Karena standar deviasi populasi (\(\sigma\) ) diketahui dan ukuran sampel besar
(\(n > 30\) ), kita menggunakan
formula:
\[Z = \frac{\bar{x} - \mu_0}{\sigma /
\sqrt{n}}\]
Diketahui:
\(\bar{x} = 116\)
\(\mu_0 = 120\)
\(\sigma = 15\)
\(n = 64\)
Perhitungan Z- score
\[Z = \frac{116 - 120}{15 / \sqrt{64}} =
\frac{-4}{15 / 8} = \frac{-4}{1.875} = -2.133\]
Perhitungan P-value Untuk uji dua arah dengan \(Z= -2.133\) ,P-value adalah \(P(|Z|>2.133) \approx 0.0329\)
Keputusan
Statistik
Pada tingkat signifikansi \(\alpha =
0.05\) , nilai kritis \(Z\)
adalah \(\pm 1.96\) . Karena \(|-2.133| > 1.96\) , maka: \[\text{Keputusan: Tolak } H_0\]
Interpretasi
Konteks Bisnis
Ada bukti statistik yang cukup untuk menyatakan bahwa klaim platform
(120 menit) tidak akurat. Secara rata-rata, pengguna belajar lebih
sedikit daripada yang diklaim oleh perusahaan.
Case Study One-Sample
T-Test
Identifikasi
Masalah
Tim UX Research menyelidiki apakah rata-rata waktu penyelesaian tugas
aplikasi baru berbeda dari 10 menit. Data dari 10 pengguna adalah: \(9.2,10.5,9.8,10.1,9.6,10.3,9.9,9.7,10.0,9.5.\)
Data Diketahui:
Jawaban Tugas
Statistik Uji
(T-Test)
Karena \(\sigma\) tidak diketahui
dan sampel kecil (\(n = 10\) ), kita
menggunakan distribusi-t:
\[t = \frac{\bar{x} - \mu_0}{s /
\sqrt{n}}\]
Langkah
Perhitungan Parameter Sampel:
Mean (\(\bar{x}\) ): \[\bar{x} = \frac{\sum x_i}{n} =
9.86\]
Standar Deviasi Sampel (\(s\) ):
\[s = \sqrt{\frac{\sum (x_i -
\bar{x})^2}{n - 1}} \approx 0.395\]
Perhitungan
T-Statistic:
\[t = \frac{9.86 - 10}{0.395 / \sqrt{10}}
= \frac{-0.14}{0.1249} \approx -1.121\]
Keputusan
Statistik
Dengan \(df = n - 1 = 9\) dan \(\alpha = 0.05\) , nilai kritis \(t\) dari tabel adalah \(\pm 2.262\) . Karena \(|-1.121| < 2.262\) , maka: \[\text{Keputusan: Gagal Tolak } H_0\]
Interpretasi
Bisnis
Pengaruh Ukuran Sampel terhadap Reliabilitas Inferensial ;Sampel yang
kecil (seperti n=10) meningkatkan Standard Error. Ini berarti hasil
kurang presisi dan memiliki kekuatan statistik (power) yang lebih rendah
untuk mendeteksi perbedaan nyata. Sampel yang lebih besar akan
memberikan estimasi yang lebih stabil dan reliabel terhadap parameter
populasi.
Case Study Two-Sample
T-Test (A/B Testing)
Identifikasi
Masalah
Membandingkan rata-rata durasi sesi antara dua versi landing
page.
\(Versi A: n1=25, \bar{x}_1=4.8,
s_1=1.2\)
\(Versi B: n2=25, \bar{x}_2=5.4,
s_2=1.4\)
\(α=0.05\)
Statistik Uji
(Independent T-Test)
Karena kita membandingkan dua kelompok independen dengan varians yang
diasumsikan sama, kita menggunakan Pooled Variance :
Varians Gabungan (\(s_p^2\) ):
\[s_p^2 = \frac{(n_1-1)s_1^2 +
(n_2-1)s_2^2}{n_1 + n_2 - 2}\] \[s_p^2
= \frac{(25-1)1.2^2 + (25-1)1.4^2}{25 + 25 - 2} = \frac{34.56 +
47.04}{48} = 1.7\]
T-Statistic (\(t\) ):
\[t = \frac{\bar{x}_1 -
\bar{x}_2}{\sqrt{s_p^2 \left(\frac{1}{n_1} +
\frac{1}{n_2}\right)}}\] \[t =
\frac{4.8 - 5.4}{\sqrt{1.7 \left(\frac{1}{25} + \frac{1}{25}\right)}} =
\frac{-0.6}{\sqrt{0.136}} \approx -1.627\]
Keputusan
Statistik
Dengan \(df = 48\) dan \(\alpha = 0.05\) , nilai kritis \(t\) adalah sekitar \(\pm 2.01\) . Karena \(|-1.627| < 2.01\) , maka: \[\text{Keputusan: Gagal Tolak } H_0\]
Interpretasi
Bisnis
Keputusan Produk: Tidak ada perbedaan signifikan secara statistik.
Perubahan desain belum tentu meningkatkan durasi sesi secara nyata.
Case Study Chi-Square
Test of Independence
Data Observasi
Tabel 1: Data Observasi Penggunaan Perangkat dan
Pembayaran
Mobile
120
80
50
Desktop
60
90
40
Jawaban Tugas
Hipotesis Nol dan
Hipotesis Alternatif
Menguji keterkaitan antara jenis perangkat dan metode pembayaran:
Uji Statistik
(\(\chi^2\) )
Uji Statistik yang Tepat: Uji Chi-Square untuk Independensi (\(\chi^2\) ), karena kita menguji hubungan
antara dua variabel kategorikal.
Perhitungan
Statistik (\(\chi^2\) )
Rumus dasar Chi-Square adalah perbandingan antara nilai observasi
(\(O\) ) dan nilai harapan (\(E\) ):
\[\chi^2 = \sum \frac{(O_{i} -
E_{i})^2}{E_{i}}\]
Perhitungan Nilai Harapan (\(E\) ): Untuk setiap sel dalam
tabel, nilai harapan dihitung dengan:
\[E = \frac{(\text{Total Baris} \times
\text{Total Kolom})}{\text{Grand Total}}\]
Contoh Perhitungan Sel (Mobile, E-Wallet):
\[E_{1,1} = \frac{250 \times 180}{440}
\approx 102.27\]
Menentukan p-value
pada \(α=0.05\) :
Berdasarkan perhitungan R di atas, \(p-value = 0.003102\) .
Karena \(0.0031<0.05\) , maka
kita Tolak \(H_0\)
Interpretasi dalam
Strategi Pembayaran Digital:
Hasil menunjukkan bahwa tipe perangkat secara signifikan memengaruhi
pilihan pembayaran. Pengguna Mobile cenderung lebih banyak menggunakan
E-Wallet, sedangkan pengguna Desktop memiliki proporsi penggunaan Kartu
Kredit yang lebih tinggi. Perusahaan harus mengoptimalkan antarmuka
pembayaran digital sesuai dengan perangkat yang digunakan pelanggan.
Case Study Type I and
Type II Errors (Conceptual)
Definisi Masalah
Sebuah startup fintech sedang menguji apakah algoritma
deteksi fraud yang baru dapat mengurangi transaksi penipuan.
\(H_0\) (Hipotesis
Nol): Algoritma baru tidak mengurangi
fraud.
\(H_1\) (Hipotesis
Alternatif): Algoritma baru mengurangi
fraud.
Jawaban tugas
Penjelasan
Kesalahan Tipe I (\(\alpha\) )
Kesalahan Tipe I terjadi ketika kita menolak \(H_0\) , padahal \(H_0\) sebenarnya benar.
Dalam konteks ini: Kita menyimpulkan bahwa
algoritma baru efektif mengurangi fraud, padahal kenyataannya algoritma
tersebut tidak memberikan perubahan apa pun .
Dampak: Perusahaan membuang sumber daya untuk
mengimplementasikan teknologi yang tidak berguna.
Penjelasan
Kesalahan Tipe II (\(\beta\) )
Kesalahan Tipe II terjadi ketika kita gagal menolak
\(H_0\) , padahal \(H_1\) benar.
Dalam konteks ini: Kita menyimpulkan bahwa
algoritma baru tidak efektif, padahal kenyataannya algoritma tersebut
berhasil mengurangi fraud .
Dampak: Perusahaan melewatkan peluang besar
untuk mengamankan transaksi pelanggan dari penipuan.
Mana yang Lebih
Merugikan secara Bisnis?
Secara umum bagi startup fintech , Kesalahan Tipe II
(\(\beta\) ) seringkali
dianggap lebih mahal. * Jika terjadi Kesalahan Tipe II, sistem keamanan
tetap lemah sehingga transaksi fraud terus terjadi. Ini menyebabkan
kerugian finansial langsung bagi pelanggan dan merusak
reputasi/kepercayaan terhadap perusahaan.
Pengaruh Ukuran
Sampel (Sample Size ) terhadap Kesalahan Tipe II
Terdapat hubungan terbalik antara ukuran sampel dan \(\beta\) :
Semakin besar ukuran sampel (\(n\) ), maka probabilitas terjadinya
Kesalahan Tipe II (\(\beta\) ) akan
semakin mengecil.
Sampel yang lebih besar memberikan lebih banyak informasi,
sehingga tes statistik menjadi lebih sensitif dalam mendeteksi adanya
efek nyata (perubahan) dari algoritma baru.
Hubungan antara
\(\alpha\) , \(\beta\) , dan Statistical Power
Ketiga konsep ini saling berkaitan erat:
Statistical Power (\(1 -
\beta\) ): Adalah kemampuan tes untuk mendeteksi efek
yang benar-benar ada (menolak \(H_0\)
yang salah).
Trade-off \(\alpha\) dan
\(\beta\) : Jika kita
memperketat \(\alpha\) (misalnya dari
0.05 ke 0.01) untuk menghindari kesalahan Tipe I, maka probabilitas
Kesalahan Tipe II (\(\beta\) ) biasanya
akan meningkat, yang berarti Power menurun.
Meningkatkan Power: Cara paling efektif untuk
menurunkan \(\beta\) tanpa meningkatkan
\(\alpha\) adalah dengan memperbesar
ukuran sampel .
Case Study P-Value and
Statistical Decision Making
Analisis Hasil
Evaluasi Model
Berdasarkan evaluasi model prediksi churn , didapatkan data
berikut:
Jawaban Tugas
Makna dari
p-value
\(p\text{-value}\) sebesar
0.021 berarti jika kita mengasumsikan hipotesis nol
(\(H_0\) ) benar (artinya model tidak
memiliki kemampuan prediksi), maka probabilitas untuk mendapatkan hasil
statistik uji sebesar 2.31 atau lebih secara tidak sengaja hanyalah
2.1% . Karena probabilitas ini sangat kecil, kita
meragukan kebenaran \(H_0\) .
Keputusan
Statistik
Untuk mengambil keputusan, kita membandingkan nilai \(p\) dengan ambang batas \(\alpha\) :
Kriteria Keputusan: * Jika \(p\text{-value} \le \alpha \Rightarrow\)
Tolak \(H_0\) * Jika \(p\text{-value} > \alpha \Rightarrow\)
Gagal Tolak \(H_0\)
Perhitungan: \[0.021 \le
0.05\]
Keputusan: Tolak \(H_0\) . Hasil pengujian ini
dinyatakan signifikan secara statistik pada tingkat
kepercayaan 95%.
Interpretasi
Manajerial (Bahasa Non-Teknis)
“Hasil analisis kami menunjukkan bahwa model prediksi churn
ini bekerja dengan sangat baik. Kemungkinan hasil ini benar hanya karena
kebetulan sangatlah rendah (kurang dari 3%). Oleh karena itu, kita dapat
menggunakan model ini dengan percaya diri untuk mengidentifikasi
pelanggan yang berisiko berhenti berlangganan.”
Risiko Sampel Tidak
Representatif
Jika sampel yang digunakan untuk mengevaluasi model tidak mewakili
seluruh populasi pelanggan (misalnya hanya mengambil data dari pelanggan
lama), maka muncul risiko:
Bias Generalisasi: Model mungkin terlihat akurat
dalam pengujian, namun gagal saat diterapkan pada pelanggan baru atau
segmen yang berbeda.
Kesalahan Strategi: Manajemen mungkin salah
mengalokasikan anggaran promosi karena prediksi model yang tidak akurat
di lapangan.
Mengapa p-value
Tidak Mengukur Effect Size?
\(p\text{-value}\) hanya
menginformasikan apakah sebuah efek ada atau tidak
(signifikansi), bukan seberapa besar dampak efek
tersebut terhadap bisnis.
Hubungan matematisnya secara konseptual adalah: \[\text{Test Statistic} = \text{Effect Size} \times
\sqrt{\text{Sample Size}}\]
Dengan jumlah sampel (\(n\) ) yang
sangat besar, efek yang sangat kecil pun dapat menghasilkan \(p\text{-value}\) yang signifikan secara
statistik, meskipun secara praktis efek tersebut tidak memberikan
keuntungan finansial yang berarti bagi perusahaan.
LS0tDQp0aXRsZTogIiINCmF1dGhvcjogIklnbmFzaXVzIFJhYmkgQmxvbG9uZyAoNTIyNTAwNzMpIg0KZGF0ZTogImByIGZvcm1hdChTeXMuRGF0ZSgpLCAnJWQgJUIgJVknKWAiDQpvdXRwdXQ6DQogIHJtZGZvcm1hdHM6OnJlYWR0aGVkb3duOg0KICAgIHNlbGZfY29udGFpbmVkOiB0cnVlIA0KICAgIHRodW1ibmFpbHM6IHRydWUgICAgDQogICAgbGlnaHRib3g6IHRydWUNCiAgICBnYWxsZXJ5OiB0cnVlDQogICAgbnVtYmVyX3NlY3Rpb25zOiB0cnVlDQogICAgbGliX2RpcjogbGlicw0KICAgIGRmX3ByaW50OiAicGFnZWQiDQogICAgY29kZV9mb2xkaW5nOiAic2hvdyINCiAgICBjb2RlX2Rvd25sb2FkOiB5ZXMNCiAgICB0aGVtZTogZmxhdGx5DQogICAgaGlnaGxpZ2h0OiB0YW5nbw0KLS0tDQo8c3R5bGU+DQovKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8NCi8qIDEuIEZPTkRBU0kgREFOIFRJUE9HUkFGSSAoTWVtYnVhdCBUZWtzIExlYmloIFJhcGkpICovDQovKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8NCmJvZHkgew0KICAgIC8qIE1lbmdndW5ha2FuIGZvbnQgeWFuZyBiZXJzaWggZGFuIG11ZGFoIGRpYmFjYSAqLw0KICAgIGZvbnQtZmFtaWx5OiAnSGVsdmV0aWNhIE5ldWUnLCBBcmlhbCwgc2Fucy1zZXJpZjsgDQogICAgbGluZS1oZWlnaHQ6IDEuNjsgLyogSmFyYWsgYW50YXIgYmFyaXMgeWFuZyBueWFtYW4gKi8NCiAgICBjb2xvcjogIzMzMzsgLyogV2FybmEgdGVrcyB1dGFtYSB5YW5nIGxlbWJ1dCAqLw0KICAgIGJhY2tncm91bmQtY29sb3I6ICNmN2Y5ZmM7IC8qIExhdGFyIGJlbGFrYW5nIGhhbGFtYW4geWFuZyBzYW5nYXQgbGVtYnV0ICovDQogICAgcGFkZGluZzogMjBweDsNCn0NCg0KLyogUmF0YSBraXJpLWthbmFuIChKdXN0aWZ5KSB1bnR1ayBrb250ZW4gdXRhbWEgKi8NCnAgew0KICAgIHRleHQtYWxpZ246IGp1c3RpZnk7DQp9DQoNCi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLw0KLyogMi4gSEVBRElORyAoSnVkdWwgZGFuIFN1Ymp1ZHVsKSAqLw0KLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovDQpoMSwgaDIsIGgzIHsNCiAgICBjb2xvcjogIzAwN2JmZjsgLyogV2FybmEgYmlydSB1bnR1ayBqdWR1bCB1dGFtYSAqLw0KICAgIGJvcmRlci1ib3R0b206IDJweCBzb2xpZCAjZTllY2VmOyAvKiBHYXJpcyBiYXdhaCB0aXBpcyB1bnR1ayBtZW1pc2Foa2FuICovDQogICAgcGFkZGluZy1ib3R0b206IDVweDsNCiAgICBtYXJnaW4tdG9wOiAzMHB4Ow0KICAgIGZvbnQtd2VpZ2h0OiA2MDA7DQp9DQoNCi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLw0KLyogMy4gVEFCTEUgKFRhYmVsIERhdGEpICovDQovKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8NCi50YWJsZSB7DQogICAgd2lkdGg6IDEwMCU7DQogICAgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsNCiAgICBtYXJnaW46IDIwcHggMDsNCiAgICBib3gtc2hhZG93OiAwIDJweCA1cHggcmdiYSgwLCAwLCAwLCAwLjEpOyAvKiBCYXlhbmdhbiBsZW1idXQgcGFkYSB0YWJlbCAqLw0KfQ0KDQovKiBIZWFkZXIgVGFiZWwgKi8NCi50aGVhZCB0aCB7DQogICAgYmFja2dyb3VuZC1jb2xvcjogIzAwN2JmZjsNCiAgICBjb2xvcjogYmx1ZTsNCiAgICBwYWRkaW5nOiAxMHB4Ow0KICAgIHRleHQtYWxpZ246bGVmdDsNCn0NCg0KLyogQmFyaXMgR2FuamlsLUdlbmFwIChTdHJpcGluZykgKi8NCi50Ym9keSB0cjpudGgtY2hpbGQoZXZlbikgew0KICAgIGJhY2tncm91bmQtY29sb3I6ICNmOGY5ZmE7IC8qIFdhcm5hIGFidS1hYnUgc2FuZ2F0IG11ZGEgKi8NCn0NCg0KLyogSG92ZXIgSW50ZXJha3RpZiAqLw0KLnRib2R5IHRyOmhvdmVyIHsNCiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZTllY2VmOyAvKiBTZWRpa2l0IGxlYmloIGdlbGFwIHNhYXQgZGktaG92ZXIgKi8NCn0NCg0KLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovDQovKiA0LiBDT0RFIEJMT0NLUyBEQU4gT1VUUFVUUyBSICovDQovKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8NCi8qIENvZGUgQmxvY2tzIChDaHVuayBDb2RlKSAqLw0KLnByZSwgY29kZSB7DQogICAgYmFja2dyb3VuZC1jb2xvcjogIzM0ZDMzOTsgLyogTGF0YXIgYmVsYWthbmcga29kZSBsZWJpaCB0ZXJhbmcgKi8NCiAgICBib3JkZXI6IDFweCBzb2xpZCAjZGVlMmU2Ow0KICAgIGJvcmRlci1sZWZ0OiA1cHggc29saWQgIzAwN2JmZjsgLyogR2FyaXMgYmlydSB0ZWJhbCBkaSBraXJpICovDQogICAgcGFkZGluZzogMTBweDsNCiAgICBib3JkZXItcmFkaXVzOiA0cHg7DQogICAgb3ZlcmZsb3cteDogYXV0bzsgLyogTWVtYXN0aWthbiBrb2RlIGJpc2EgZGlndWxpciBqaWthIHRlcmxhbHUgcGFuamFuZyAqLw0KfQ0KLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQogICA1LiBTVFlMSU5HIFVOVFVLIENPTlRBSU5FUiBVVEFNQSAoTFVBUikNCiAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLw0KLm91dGVyLWNhcmQgew0KICAvKiBXYXJuYSBsYXRhciBiZWxha2FuZyBtZXJhaCBtdWRhL2tyZW0geWFuZyBsZW1idXQgKi8NCiAgYmFja2dyb3VuZC1jb2xvcjogIzJkOGNmZjsNCiAgcGFkZGluZzogMjBweDsNCiAgYm9yZGVyLXJhZGl1czogMTVweDsgLyogU3VkdXQgbWVtYnVsYXQgKi8NCiAgYm94LXNoYWRvdzogMCA0cHggMTBweCByZ2JhKDAsIDAsIDAsIDAuMTUpOyAvKiBCYXlhbmdhbiB1bnR1ayBtZW5nYW5na2F0IGtvbnRhaW5lciAqLw0KICBtYXJnaW46IDIwcHggYXV0bzsgLyogSmFyYWsgZGFyaSBrb250ZW4gbGFpbiwgZGFuIGF1dG8gdW50dWsgbWVuZW5nYWhrYW4gKGppa2EgYWRhIHdpZHRoKSAqLw0KICBib3JkZXI6IDFweCBzb2xpZCAjZDRhMzMyOyAvKiBCb3JkZXIgdGlwaXMgKi8NCiAgbWF4LXdpZHRoOiA3MDBweDsgLyogT3BzaW9uYWw6IEF0dXIgbGViYXIgbWFrc2ltdW0gYWdhciBjYXJkIHRpZGFrIHRlcmxhbHUgbGViYXIgZGkgbGF5YXIgYmVzYXIgKi8NCn0NCg0KLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQogICA2LiBTVFlMSU5HIFVOVFVLIEtPVEFLIEtPTlRFTiAoREFMQU0pDQogICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8NCi5pbm5lci1jYXJkIHsNCiAgYmFja2dyb3VuZC1jb2xvcjogI2UwZjJmZTsgLyogTGF0YXIgYmVsYWthbmcgYmlydSBsYW5naXQgKi8NCiAgcGFkZGluZzogMTVweDsNCiAgbWFyZ2luLWJvdHRvbTogMjBweDsgLyogSmFyYWsgYW50YXIgY2FyZCBkYWxhbSAqLw0KICBib3JkZXItcmFkaXVzOiAxMHB4Ow0KICBib3gtc2hhZG93OiAwIDJweCA1cHggcmdiYSgwLCAwLCAwLCAwLjIpOyAvKiBCYXlhbmdhbiB5YW5nIGxlYmloIGt1YXQgKi8NCiAgYm9yZGVyOiAxcHggc29saWQgI2UwZTBlMDsgDQogIHRleHQtYWxpZ246IGxlZnQ7IC8qIFRla3MgZGkgZGFsYW0gY2FyZCBrZW1iYWxpIGtlIGtpcmkgKi8NCn0NCg0KLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovDQovKiA3LiBMSU5LIERBTiBCVVRUT05TIChJbnRlcmFrdGl2aXRhcykgKi8NCi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLw0KYSB7DQogICAgY29sb3I6ICMwMDdiZmY7DQogICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOyAvKiBNZW5naGlsYW5na2FuIGdhcmlzIGJhd2FoIGRlZmF1bHQgKi8NCiAgICB0cmFuc2l0aW9uOiBjb2xvciAwLjNzOw0KfQ0KDQphOmhvdmVyIHsNCiAgICBjb2xvcjogIzAwNTZiMzsNCiAgICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsgLyogTXVuY3Vsa2FuIGdhcmlzIGJhd2FoIHNhYXQgZGktaG92ZXIgKi8NCn0NCi8qIE1lcmF0YWthbiBLb250ZW4gVmlkZW8ga2UgVGVuZ2FoICovDQoudmlkZW8tY29udGFpbmVyIHsNCiAgICAvKiBNZW5nYXR1ciBsZWJhciBtYWtzaW11bSBhZ2FyIHZpZGVvIHRpZGFrIHRlcmxhbHUgYmVzYXIgKi8NCiAgICBtYXgtd2lkdGg6IDc2MHB4OyANCiAgICANCiAgICAvKiBBdXRvIG1hcmdpbiBraXJpIGRhbiBrYW5hbiBha2FuIG1lcmF0YWthbiBrb250YWluZXIgaW5pIGtlIHRlbmdhaCAqLw0KICAgIG1hcmdpbi1sZWZ0OiBhdXRvOw0KICAgIG1hcmdpbi1yaWdodDogYXV0bzsNCiAgICANCiAgICAvKiBKYXJhayBhbnRhcmEgdmlkZW8gZGVuZ2FuIGtvbnRlbiBkaSBhdGFzL2Jhd2FoICovDQogICAgbWFyZ2luLXRvcDogMjVweDsNCiAgICBtYXJnaW4tYm90dG9tOiAyNXB4Ow0KfQ0KLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovDQovKiBTdHlsaW5nIEp1ZHVsIFR1Z2FzIFV0YW1hIChNZW5pcnUgVGFtcGlsYW4gR2FtYmFyKSAqLw0KLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovDQoNCi8qIE1lbmFyZ2V0a2FuIEp1ZHVsIERva3VtZW4gVXRhbWEgKEJpYXNhbnlhIGgxIGF0YXUgaDIgZGkgUlB1YnMvcm1kZm9ybWF0cykgKi8NCi8qIEthcmVuYSBybWRmb3JtYXRzIGJlcmJlZGEtYmVkYSwga2l0YSBjb2JhIG1lbmFyZ2V0a2FuIGgxIGF0YXUgaGVhZGVyIGdsb2JhbCAqLw0KLnRpdGxlLWNvbnRhaW5lciwgaDEudGl0bGUgew0KICAgIHRleHQtYWxpZ246IGNlbnRlcjsgLyogUmF0YSBUZW5nYWggKi8NCiAgICBtYXJnaW4tdG9wOiAyMHB4Ow0KICAgIG1hcmdpbi1ib3R0b206IDMwcHg7DQp9DQoNCi8qIFN0eWxpbmcgS2h1c3VzIHVudHVrIFRla3MgSnVkdWwgKi8NCi8qIEppa2EganVkdWwgQW5kYSBhZGFsYWggaDEgYXRhdSBoMiBwZXJ0YW1hIGRpIGRva3VtZW46ICovDQpoMTpmaXJzdC1vZi10eXBlLCBoMjpmaXJzdC1vZi10eXBlLCAudGl0bGUtY29udGFpbmVyIGgxIHsNCiAgICAvKiBNZW5nZ3VuYWthbiBmb250IHlhbmcgbWVueWVydXBhaSAnc2VyaWYnIGF0YXUgJ3NjcmlwdCcgeWFuZyB0ZWJhbCAqLw0KICAgIGZvbnQtZmFtaWx5OiAnVGltZXMgTmV3IFJvbWFuJywgVGltZXMsIHNlcmlmOyANCiAgICBmb250LXNpemU6IDMycHg7IC8qIFVrdXJhbiB5YW5nIGN1a3VwIGJlc2FyICovDQogICAgZm9udC13ZWlnaHQ6IDcwMDsgLyogVGViYWwgKi8NCiAgICANCiAgICAvKiBXYXJuYSBiaXJ1IHR1YSAqLw0KICAgIGNvbG9yOiAjMDA1NmIzICFpbXBvcnRhbnQ7IA0KICAgIA0KICAgIC8qIEVmZWsgdGVrczogc2VkaWtpdCBiYXlhbmdhbiB1bnR1ayBtZW1idWF0bnlhIG1lbm9uam9sICovDQogICAgdGV4dC1zaGFkb3c6IDFweCAxcHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xKTsgDQogICAgDQogICAgLyogTWVuZ2hpbGFuZ2thbiBnYXJpcyBiYXdhaCBhdGF1IGJvcmRlciB5YW5nIG11bmdraW4gZGl0YW1iYWhrYW4gb2xlaCB0aGVtZSAqLw0KICAgIGJvcmRlci1ib3R0b206IG5vbmUgIWltcG9ydGFudDsgDQogICAgcGFkZGluZy1ib3R0b206IDAgIWltcG9ydGFudDsNCn0NCg0KLyogSmlrYSBBbmRhIG1lbWFzdWtrYW4gSnVkdWwgVHVnYXMgc2ViYWdhaSBIMiBkaSBsdWFyIFlBTUwsIGd1bmFrYW4gaW5pOiAqLw0KLmFzc2lnbm1lbnQtdGl0bGUgew0KICAgIHRleHQtYWxpZ246IGNlbnRlcjsNCiAgICBmb250LWZhbWlseTogJ1RpbWVzIE5ldyBSb21hbicsIFRpbWVzLCBzZXJpZjsgDQogICAgZm9udC1zaXplOiAzMnB4Ow0KICAgIGZvbnQtd2VpZ2h0OiA3MDA7DQogICAgY29sb3I6ICMwMDU2YjM7DQogICAgYm9yZGVyLWJvdHRvbTogbm9uZTsNCn0NCi8qID09PT09PSBHTE9CQUwgU1RZTEUgPT09PT09ICovDQpib2R5IHsNCiAgICBmb250LWZhbWlseTogIlBvcHBpbnMiLCBzYW5zLXNlcmlmOw0KICAgIGJhY2tncm91bmQ6ICNmNWY3ZmI7DQogICAgbWFyZ2luOiAwOw0KICAgIHBhZGRpbmc6IDA7DQp9DQoNCi8qID09PT09PSBIRUFERVIgVElUTEUgPT09PT09ICovDQouaGVhZGVyLXRpdGxlIHsNCiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7DQogICAgZm9udC1zaXplOiAzMnB4Ow0KICAgIGZvbnQtd2VpZ2h0OiA3MDA7DQogICAgY29sb3I6ICMxZjRlNzk7DQogICAgbWFyZ2luLXRvcDogMzBweDsNCiAgICB0ZXh0LXNoYWRvdzogMXB4IDFweCAycHggcmdiYSgwLDAsMCwwLjE1KTsNCn0NCg0KLyogPT09PT09IFBST0ZJTEUgQ0FSRCBXUkFQUEVSID09PT09PSAqLw0KLnByb2ZpbGUtY2FyZCB7DQogICAgbWF4LXdpZHRoOiA5MDBweDsNCiAgICBtYXJnaW46IDQwcHggYXV0bzsNCiAgICBiYWNrZ3JvdW5kOiAjZTllZWY3Ow0KICAgIGJvcmRlci1yYWRpdXM6IDI1cHg7DQogICAgcGFkZGluZzogNDBweCA1MHB4Ow0KICAgIGRpc3BsYXk6IGZsZXg7DQogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsNCiAgICBnYXA6IDQwcHg7DQogICAgYm94LXNoYWRvdzogMHB4IDhweCAxOHB4IHJnYmEoMCwwLDAsMC4wOCk7DQp9DQoNCi8qID09PT09PSBQUk9GSUxFIElNQUdFID09PT09PSAqLw0KLnByb2ZpbGUtaW1hZ2Ugew0KICAgIGZsZXg6IDAgMCAyMjBweDsNCn0NCg0KLnByb2ZpbGUtaW1hZ2UgaW1nIHsNCiAgICB3aWR0aDogMjIwcHg7DQogICAgaGVpZ2h0OiBhdXRvOw0KICAgIG9iamVjdC1maXQ6IGNvdmVyOw0KICAgIGJvcmRlci1yYWRpdXM6IDEwcHg7DQogICAgYm9yZGVyOiA4cHggc29saWQgd2hpdGU7DQogICAgYm94LXNoYWRvdzogMHB4IDZweCAxNHB4IHJnYmEoMCwwLDAsMC4xNSk7DQp9DQoNCi8qID09PT09PSBURVhUIElORk9STUFUSU9OID09PT09PSAqLw0KLnByb2ZpbGUtaW5mbyB7DQogICAgZmxleDogMTsNCn0NCg0KLnByb2ZpbGUtaW5mbyBoMiB7DQogICAgZm9udC1zaXplOiAzMnB4Ow0KICAgIGZvbnQtd2VpZ2h0OiA3MDA7DQogICAgbWFyZ2luOiAwOw0KICAgIGNvbG9yOiAjMWExYTFhOw0KfQ0KDQoucHJvZmlsZS1pbmZvIHAgew0KICAgIG1hcmdpbi10b3A6IDhweDsNCiAgICBmb250LXNpemU6IDE4cHg7DQogICAgY29sb3I6ICM1NTU7DQp9DQoNCi8qID09PT09PSBCQURHRVMgPT09PT09ICovDQouYmFkZ2VzIHsNCiAgICBtYXJnaW4tdG9wOiAxOHB4Ow0KICAgIGRpc3BsYXk6IGZsZXg7DQogICAgZ2FwOiAxNXB4Ow0KfQ0KDQouYmFkZ2Ugew0KICAgIHBhZGRpbmc6IDEwcHggMjBweDsNCiAgICBib3JkZXItcmFkaXVzOiAxMHB4Ow0KICAgIGZvbnQtc2l6ZTogMTVweDsNCiAgICBmb250LXdlaWdodDogNjAwOw0KICAgIGNvbG9yOiB3aGl0ZTsNCiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7DQp9DQoNCi5iYWRnZS1ibHVlIHsNCiAgICBiYWNrZ3JvdW5kOiAjMmQ4Y2ZmOw0KfQ0KDQouYmFkZ2UtcmVkIHsNCiAgICBiYWNrZ3JvdW5kOiAjZTc0YzNjOw0KfQ0KDQouYmFkZ2UtZ3JlZW4gew0KICAgIGJhY2tncm91bmQ6ICMyZWNjNzE7DQp9DQouY2FyZCB7DQogICAgcGFkZGluZzogMjBweDsNCiAgICBtYXJnaW46IDIwcHggMDsNCiAgICBib3JkZXItcmFkaXVzOiAxNXB4Ow0KICAgIGJhY2tncm91bmQ6ICNmZmZmZmY7DQogICAgYm94LXNoYWRvdzogMCA0cHggMTJweCByZ2JhKDAsMCwwLDAuMSk7DQogICAgdHJhbnNpdGlvbjogMC4zczsNCn0NCg0KLmNhcmQ6aG92ZXIgew0KICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtNXB4KTsNCiAgICBib3gtc2hhZG93OiAwIDhweCAyMHB4IHJnYmEoMCwwLDAsMC4yKTsNCn0NCi8qIEJhcmlzIGdhbmppbC1nZW5hcCB1bnR1ayBrZXRlcmJhY2FhbiAoU3RyaXBpbmcpICovDQp0Ym9keSB0cjpudGgtY2hpbGQoZXZlbikgew0KICAgIGJhY2tncm91bmQtY29sb3I6ICNmOGY5ZmE7IA0KfQ0KDQovKiBJbnRlcmFrc2k6IEVmZWsgSG92ZXIgcGFkYSBCYXJpcyBUYWJlbCAqLw0KdGJvZHkgdHI6aG92ZXIgew0KICAgIGJhY2tncm91bmQtY29sb3I6ICNlOWVjZWYgIWltcG9ydGFudDsgLyogU29yb3QgYmFyaXMgeWFuZyBkaXR1bmp1ayAqLw0KICAgIGN1cnNvcjogcG9pbnRlcjsgLyogTWVuZ3ViYWgga3Vyc29yIG1lbmphZGkgcG9pbnRlciwgbWVtYmVyaWthbiBrZXNhbiBpbnRlcmFrdGlmICovDQogICAgYm94LXNoYWRvdzogMCAxcHggM3B4IHJnYmEoMCwgMCwgMCwgMC4xKTsgLyogU2VkaWtpdCBiYXlhbmdhbiAqLw0KICAgIHRyYW5zZm9ybTogc2NhbGUoMS4wMDUpOyAvKiBNZW1wZXJiZXNhciBzZWRpa2l0IHVudHVrIHBlbmVrYW5hbiAqLw0KICAgIHRyYW5zaXRpb246IGFsbCAwLjJzIGVhc2UtaW4tb3V0OyANCn0NCmltZyB7DQogICAgbWF4LXdpZHRoOiAxMDAlOw0KICAgIGhlaWdodDogYXV0bzsNCiAgICBib3JkZXItcmFkaXVzOiA4cHg7DQogICAgYm94LXNoYWRvdzogMCA0cHggOHB4IHJnYmEoMCwgMCwgMCwgMC4xKTsgLyogQmF5YW5nYW4gZGVmYXVsdCAqLw0KICAgIHRyYW5zaXRpb246IGFsbCAwLjNzIGVhc2UtaW4tb3V0OyAvKiBUcmFuc2lzaSBoYWx1cyB1bnR1ayBzZW11YSBwZXJ1YmFoYW4gKi8NCn0NCg0KLyogRWZlayBzYWF0IGt1cnNvciBkaWFyYWhrYW4gKGhvdmVyKSBwYWRhIGdhbWJhciAqLw0KaW1nOmhvdmVyIHsNCiAgICBib3gtc2hhZG93OiAwIDhweCAxNnB4IHJnYmEoMCwgMCwgMCwgMC4yKTsgLyogQmF5YW5nYW4gbGViaWggZ2VsYXAgKi8NCiAgICB0cmFuc2Zvcm06IHNjYWxlKDEuMDIpOyAvKiBTZWRpa2l0IHpvb20gKG1lbXBlcmJlc2FyKSAqLw0KfQ0KDQoNCg0KDQoNCjwvc3R5bGU+DQoNCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFLCBtZXNzYWdlID0gRkFMU0UpDQoNCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkoZHBseXIpDQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkoa25pdHIpDQoNCmBgYA0KDQo8aDEgY2xhc3M9ImhlYWRlci10aXRsZSI+U3RhdGlzdGljYWwgSW5mZXJlbmNlcyB+IEFzc2lnbm1lbnQgd2VlayAxNDwvaDE+DQogIA0KICA8ZGl2IGNsYXNzPSJwcm9maWxlLWNhcmQiPg0KICA8ZGl2IGNsYXNzPSJwcm9maWxlLWltYWdlIj4NCiAgPGltZyBzcmM9InByb2ZpbC5qcGVnIiB3aWR0aD0iMTUwIiBzdHlsZT0iYm9yZGVyLXJhZGl1czogMTBweDsiPg0KICA8L2Rpdj4NCiAgPGRpdiBjbGFzcz0icHJvZmlsZS1pbmZvIj4NCiAgPGgyPklnbmFzaXVzIFJhYmkgQmxvbG9uZzwvaDI+DQogIDxwPlN0dWRlbnQgTWFqb3JpbmcgaW4gRGF0YSBTY2llbmNlIGF0IElUU0I8L3A+DQogIA0KICA8ZGl2IGNsYXNzPSJiYWRnZXMiPg0KICA8c3BhbiBjbGFzcz0iYmFkZ2UgYmFkZ2UtYmx1ZSI+UiBQcm9ncmFtbWluZzwvc3Bhbj4NCiAgPHNwYW4gY2xhc3M9ImJhZGdlIGJhZGdlLXJlZCI+RGF0YSBTY2llbmNlPC9zcGFuPg0KICA8c3BhbiBjbGFzcz0iYmFkZ2UgYmFkZ2UtZ3JlZW4iPlN0YXRpc3RpY3M8L3NwYW4+DQogIDwvZGl2Pg0KICA8L2Rpdj4NCiAgPC9kaXY+DQoNCiMgQ2FzZXMgU3R1ZHkgVWppIFogU2F0dSBTYW1wZWwNCg0KIyMgSWRlbnRpZmlrYXNpICBNYXNhbGFoDQo8ZGl2IHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOiAjZDRlZGRhOyBwYWRkaW5nOiAxNXB4OyBib3JkZXItbGVmdDogNXB4IHNvbGlkICMyOGE3NDU7IG1hcmdpbi1ib3R0b206IDIwcHg7IGJvcmRlci1yYWRpdXM6IDVweDsiPg0KUGxhdGZvcm0gcGVtYmVsYWphcmFuIGRpZ2l0YWwgbWVuZ2tsYWltIHJhdGEtcmF0YSB3YWt0dSBiZWxhamFyIGhhcmlhbiBwZW5nZ3VuYW55YSBhZGFsYWggMTIwIG1lbml0LiBCZXJkYXNhcmthbiBkYXRhIGhpc3RvcmlzLCBzdGFuZGFyIGRldmlhc2kgcG9wdWxhc2kgZGlrZXRhaHVpIHNlYmVzYXIgMTUgbWVuaXQuIFNhbXBlbCBhY2FrIHNlYmFueWFrIDY0IHBlbmdndW5hIG1lbnVuanVra2FuIHJhdGEtcmF0YSB3YWt0dSBiZWxhamFyIDExNiBtZW5pdC4NCjwvZGl2Pg0KDQojIyBKYXdhYmFuIFR1Z2FzDQoNCiMjIyBGb3JtdWxhc2kgSGlwb3Rlc2lzDQo8ZGl2IHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOiAjZDRlZGRhOyBwYWRkaW5nOiAxNXB4OyBib3JkZXItbGVmdDogNXB4IHNvbGlkICMyOGE3NDU7IG1hcmdpbi1ib3R0b206IDIwcHg7IGJvcmRlci1yYWRpdXM6IDVweDsiPg0KS2l0YSBpbmdpbiBtZW5ndWppIGFwYWthaCByYXRhLXJhdGEgcG9wdWxhc2kgKCRcbXUkKSBiZXJiZWRhIGRhcmkga2xhaW0gMTIwIG1lbml0Og0KDQoqICoqTnVsbCBIeXBvdGhlc2lzICgkSF8wJCk6KiogJFxtdSA9IDEyMCQNCg0KKiAqKkFsdGVybmF0aXZlIEh5cG90aGVzaXMgKCRIXzEkKToqKiAkXG11IFxuZXEgMTIwJCAoVWppIER1YSBBcmFoKQ0KPC9kaXY+DQoNCiMjIyBVamkgU3RhdGlzdGlrIHlhbmcgVGVwYXQNCjxkaXYgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNkNGVkZGE7IHBhZGRpbmc6IDE1cHg7IGJvcmRlci1sZWZ0OiA1cHggc29saWQgIzI4YTc0NTsgbWFyZ2luLWJvdHRvbTogMjBweDsgYm9yZGVyLXJhZGl1czogNXB4OyI+DQpVamkgWiBTYXR1IFNhbXBlbCA6IEthcmVuYSBTdGFuZGFyIGRldmlhc2kgUG9wdWxhc2kgKCRcc2lnbWEkKSBkaWtldGFodWkgZGFuIHVrdXJhbiBzYW1wZWwgYmVzYXIoJG4gPiAzMCQpDQo8L2Rpdj4NCg0KIyMjIFN0YXRpc3RpayBVamkgKFotVGVzdCkgZGFuIFAtVmFsdWUNCjxkaXYgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNkNGVkZGE7IHBhZGRpbmc6IDE1cHg7IGJvcmRlci1sZWZ0OiA1cHggc29saWQgIzI4YTc0NTsgbWFyZ2luLWJvdHRvbTogMjBweDsgYm9yZGVyLXJhZGl1czogNXB4OyI+DQpLYXJlbmEgc3RhbmRhciBkZXZpYXNpIHBvcHVsYXNpICgkXHNpZ21hJCkgZGlrZXRhaHVpIGRhbiB1a3VyYW4gc2FtcGVsIGJlc2FyICgkbiA+IDMwJCksIGtpdGEgbWVuZ2d1bmFrYW4gZm9ybXVsYToNCg0KJCRaID0gXGZyYWN7XGJhcnt4fSAtIFxtdV8wfXtcc2lnbWEgLyBcc3FydHtufX0kJA0KDQoqKkRpa2V0YWh1aToqKg0KDQoqICRcYmFye3h9ID0gMTE2JA0KDQoqICRcbXVfMCA9IDEyMCQNCg0KKiAkXHNpZ21hID0gMTUkDQoNCiogJG4gPSA2NCQNCg0KKipQZXJoaXR1bmdhbiBaLSBzY29yZSoqDQoNCiQkWiA9IFxmcmFjezExNiAtIDEyMH17MTUgLyBcc3FydHs2NH19ID0gXGZyYWN7LTR9ezE1IC8gOH0gPSBcZnJhY3stNH17MS44NzV9ID0gLTIuMTMzJCQNCg0KKipQZXJoaXR1bmdhbiBQLXZhbHVlKioNClVudHVrIHVqaSBkdWEgYXJhaCBkZW5nYW4gJFo9IC0yLjEzMyQsUC12YWx1ZSBhZGFsYWggJFAofFp8PjIuMTMzKSBcYXBwcm94IDAuMDMyOSQNCg0KPC9kaXY+DQoNCiMjIyBLZXB1dHVzYW4gU3RhdGlzdGlrDQo8ZGl2IHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOiAjZDRlZGRhOyBwYWRkaW5nOiAxNXB4OyBib3JkZXItbGVmdDogNXB4IHNvbGlkICMyOGE3NDU7IG1hcmdpbi1ib3R0b206IDIwcHg7IGJvcmRlci1yYWRpdXM6IDVweDsiPg0KUGFkYSB0aW5na2F0IHNpZ25pZmlrYW5zaSAkXGFscGhhID0gMC4wNSQsIG5pbGFpIGtyaXRpcyAkWiQgYWRhbGFoICRccG0gMS45NiQuDQpLYXJlbmEgJHwtMi4xMzN8ID4gMS45NiQsIG1ha2E6DQokJFx0ZXh0e0tlcHV0dXNhbjogVG9sYWsgfSBIXzAkJA0KPC9kaXY+DQoNCiMjIyBJbnRlcnByZXRhc2kgS29udGVrcyBCaXNuaXMNCjxkaXYgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNkNGVkZGE7IHBhZGRpbmc6IDE1cHg7IGJvcmRlci1sZWZ0OiA1cHggc29saWQgIzI4YTc0NTsgbWFyZ2luLWJvdHRvbTogMjBweDsgYm9yZGVyLXJhZGl1czogNXB4OyI+DQpBZGEgYnVrdGkgc3RhdGlzdGlrIHlhbmcgY3VrdXAgdW50dWsgbWVueWF0YWthbiBiYWh3YSBrbGFpbSBwbGF0Zm9ybSAoMTIwIG1lbml0KSB0aWRhayBha3VyYXQuIFNlY2FyYSByYXRhLXJhdGEsIHBlbmdndW5hIGJlbGFqYXIgbGViaWggc2VkaWtpdCBkYXJpcGFkYSB5YW5nIGRpa2xhaW0gb2xlaCBwZXJ1c2FoYWFuLg0KDQo8L2Rpdj4NCg0KIyBDYXNlIFN0dWR5IE9uZS1TYW1wbGUgVC1UZXN0DQoNCiMjIElkZW50aWZpa2FzaSBNYXNhbGFoDQo8ZGl2IHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOiAjZDRlZGRhOyBwYWRkaW5nOiAxNXB4OyBib3JkZXItbGVmdDogNXB4IHNvbGlkICMyOGE3NDU7IG1hcmdpbi1ib3R0b206IDIwcHg7IGJvcmRlci1yYWRpdXM6IDVweDsiPg0KVGltIFVYIFJlc2VhcmNoIG1lbnllbGlkaWtpIGFwYWthaCByYXRhLXJhdGEgd2FrdHUgcGVueWVsZXNhaWFuIHR1Z2FzIGFwbGlrYXNpIGJhcnUgYmVyYmVkYSBkYXJpIDEwIG1lbml0LiBEYXRhIGRhcmkgMTAgcGVuZ2d1bmEgYWRhbGFoOiAkOS4yLDEwLjUsOS44LDEwLjEsOS42LDEwLjMsOS45LDkuNywxMC4wLDkuNS4kDQoNCkRhdGEgRGlrZXRhaHVpOg0KDQogICogICTOvF8wPTEwJA0KDQogICogICRuPTEwJA0KDQogICogICTOsT0wLjA1JA0KDQogICogICROaWxhaSBSYXRhLXJhdGEgKFxiYXJ7eH0pID0gOS44NiQNCg0KICAqICAkU3RhbmRhciBEZXZpYXNpIFNhbXBlbCAocykgXGFwcHJveCAwLjM5NSQNCjwvZGl2Pg0KDQojIyBKYXdhYmFuIFR1Z2FzDQoNCiMjIyBGb3JtdWxhc2kgSGlwb3Rlc2lzDQo8ZGl2IHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOiAjZDRlZGRhOyBwYWRkaW5nOiAxNXB4OyBib3JkZXItbGVmdDogNXB4IHNvbGlkICMyOGE3NDU7IG1hcmdpbi1ib3R0b206IDIwcHg7IGJvcmRlci1yYWRpdXM6IDVweDsiPg0KTWVuZ3VqaSBhcGFrYWggcmF0YS1yYXRhIHdha3R1IHR1Z2FzIGJlcmJlZGEgZGFyaSAxMCBtZW5pdDoNCg0KKiAqKk51bGwgSHlwb3RoZXNpcyAoJEhfMCQpOioqICRcbXUgPSAxMCQNCg0KKiAqKkFsdGVybmF0aXZlIEh5cG90aGVzaXMgKCRIXzEkKToqKiAkXG11IFxuZXEgMTAkDQo8L2Rpdj4NCg0KIyMjIFN0YXRpc3RpayBVamkgKFQtVGVzdCkNCjxkaXYgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNkNGVkZGE7IHBhZGRpbmc6IDE1cHg7IGJvcmRlci1sZWZ0OiA1cHggc29saWQgIzI4YTc0NTsgbWFyZ2luLWJvdHRvbTogMjBweDsgYm9yZGVyLXJhZGl1czogNXB4OyI+DQpLYXJlbmEgJFxzaWdtYSQgdGlkYWsgZGlrZXRhaHVpIGRhbiBzYW1wZWwga2VjaWwgKCRuID0gMTAkKSwga2l0YSBtZW5nZ3VuYWthbiBkaXN0cmlidXNpLXQ6DQoNCiQkdCA9IFxmcmFje1xiYXJ7eH0gLSBcbXVfMH17cyAvIFxzcXJ0e259fSQkDQoNCiMjIyAqKkxhbmdrYWggUGVyaGl0dW5nYW4gUGFyYW1ldGVyIFNhbXBlbDoqKg0KDQoqICAqKk1lYW4gKCRcYmFye3h9JCk6KiogJCRcYmFye3h9ID0gXGZyYWN7XHN1bSB4X2l9e259ID0gOS44NiQkDQoNCiogICoqU3RhbmRhciBEZXZpYXNpIFNhbXBlbCAoJHMkKToqKg0KDQogICAgJCRzID0gXHNxcnR7XGZyYWN7XHN1bSAoeF9pIC0gXGJhcnt4fSleMn17biAtIDF9fSBcYXBwcm94IDAuMzk1JCQNCg0KIyMjICoqUGVyaGl0dW5nYW4gVC1TdGF0aXN0aWM6KioNCg0KJCR0ID0gXGZyYWN7OS44NiAtIDEwfXswLjM5NSAvIFxzcXJ0ezEwfX0gPSBcZnJhY3stMC4xNH17MC4xMjQ5fSBcYXBwcm94IC0xLjEyMSQkDQo8L2Rpdj4NCg0KIyMjIEtlcHV0dXNhbiBTdGF0aXN0aWsNCjxkaXYgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNkNGVkZGE7IHBhZGRpbmc6IDE1cHg7IGJvcmRlci1sZWZ0OiA1cHggc29saWQgIzI4YTc0NTsgbWFyZ2luLWJvdHRvbTogMjBweDsgYm9yZGVyLXJhZGl1czogNXB4OyI+DQpEZW5nYW4gJGRmID0gbiAtIDEgPSA5JCBkYW4gJFxhbHBoYSA9IDAuMDUkLCBuaWxhaSBrcml0aXMgJHQkIGRhcmkgdGFiZWwgYWRhbGFoICRccG0gMi4yNjIkLg0KS2FyZW5hICR8LTEuMTIxfCA8IDIuMjYyJCwgbWFrYToNCiQkXHRleHR7S2VwdXR1c2FuOiBHYWdhbCBUb2xhayB9IEhfMCQkDQo8L2Rpdj4NCg0KIyMjIEludGVycHJldGFzaSBCaXNuaXMNCjxkaXYgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNkNGVkZGE7IHBhZGRpbmc6IDE1cHg7IGJvcmRlci1sZWZ0OiA1cHggc29saWQgIzI4YTc0NTsgbWFyZ2luLWJvdHRvbTogMjBweDsgYm9yZGVyLXJhZGl1czogNXB4OyI+DQpQZW5nYXJ1aCBVa3VyYW4gU2FtcGVsIHRlcmhhZGFwIFJlbGlhYmlsaXRhcyBJbmZlcmVuc2lhbCA7U2FtcGVsIHlhbmcga2VjaWwgKHNlcGVydGkgbj0xMCkgbWVuaW5na2F0a2FuIFN0YW5kYXJkIEVycm9yLiBJbmkgYmVyYXJ0aSBoYXNpbCBrdXJhbmcgcHJlc2lzaSBkYW4gbWVtaWxpa2kga2VrdWF0YW4gc3RhdGlzdGlrIChwb3dlcikgeWFuZyBsZWJpaCByZW5kYWggdW50dWsgbWVuZGV0ZWtzaSBwZXJiZWRhYW4gbnlhdGEuIFNhbXBlbCB5YW5nIGxlYmloIGJlc2FyIGFrYW4gbWVtYmVyaWthbiBlc3RpbWFzaSB5YW5nIGxlYmloIHN0YWJpbCBkYW4gcmVsaWFiZWwgdGVyaGFkYXAgcGFyYW1ldGVyIHBvcHVsYXNpLg0KPC9kaXY+DQoNCiMgQ2FzZSBTdHVkeSBUd28tU2FtcGxlIFQtVGVzdCAoQS9CIFRlc3RpbmcpDQoNCiMjIElkZW50aWZpa2FzaSBNYXNhbGFoDQo8ZGl2IHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOiAjZDRlZGRhOyBwYWRkaW5nOiAxNXB4OyBib3JkZXItbGVmdDogNXB4IHNvbGlkICMyOGE3NDU7IG1hcmdpbi1ib3R0b206IDIwcHg7IGJvcmRlci1yYWRpdXM6IDVweDsiPg0KTWVtYmFuZGluZ2thbiByYXRhLXJhdGEgZHVyYXNpIHNlc2kgYW50YXJhIGR1YSB2ZXJzaSBsYW5kaW5nIHBhZ2UuDQoNCiAgKiAgJFZlcnNpIEE6IG4xPTI1LCBcYmFye3h9XzE9NC44LCBzXzE9MS4yJA0KDQogICogICRWZXJzaSBCOiBuMj0yNSwgXGJhcnt4fV8yPTUuNCwgc18yPTEuNCQNCg0KICAqICAkzrE9MC4wNSQNCjwvZGl2Pg0KDQojIyBKYXdhYmFuIFR1Z2FzDQoNCiMjIyBGb3JtdWxhc2kgSGlwb3Rlc2lzDQo8ZGl2IHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOiAjZDRlZGRhOyBwYWRkaW5nOiAxNXB4OyBib3JkZXItbGVmdDogNXB4IHNvbGlkICMyOGE3NDU7IG1hcmdpbi1ib3R0b206IDIwcHg7IGJvcmRlci1yYWRpdXM6IDVweDsiPg0KTWVuZ3VqaSBhcGFrYWggYWRhIHBlcmJlZGFhbiByYXRhLXJhdGEgZHVyYXNpIHNlc2kgYW50YXJhIFZlcnNpIEEgZGFuIFZlcnNpIEI6DQoNCiogKipOdWxsIEh5cG90aGVzaXMgKCRIXzAkKToqKiAkXG11X0EgPSBcbXVfQiQNCg0KKiAqKkFsdGVybmF0aXZlIEh5cG90aGVzaXMgKCRIXzEkKToqKiAkXG11X0EgXG5lcSBcbXVfQiQNCjwvZGl2Pg0KDQojIyBTdGF0aXN0aWsgVWppIChJbmRlcGVuZGVudCBULVRlc3QpDQo8ZGl2IHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOiAjZDRlZGRhOyBwYWRkaW5nOiAxNXB4OyBib3JkZXItbGVmdDogNXB4IHNvbGlkICMyOGE3NDU7IG1hcmdpbi1ib3R0b206IDIwcHg7IGJvcmRlci1yYWRpdXM6IDVweDsiPg0KS2FyZW5hIGtpdGEgbWVtYmFuZGluZ2thbiBkdWEga2Vsb21wb2sgaW5kZXBlbmRlbiBkZW5nYW4gdmFyaWFucyB5YW5nIGRpYXN1bXNpa2FuIHNhbWEsIGtpdGEgbWVuZ2d1bmFrYW4gKlBvb2xlZCBWYXJpYW5jZSo6DQoNCiogKipWYXJpYW5zIEdhYnVuZ2FuICgkc19wXjIkKToqKg0KDQogICAgJCRzX3BeMiA9IFxmcmFjeyhuXzEtMSlzXzFeMiArIChuXzItMSlzXzJeMn17bl8xICsgbl8yIC0gMn0kJA0KICAgICQkc19wXjIgPSBcZnJhY3soMjUtMSkxLjJeMiArICgyNS0xKTEuNF4yfXsyNSArIDI1IC0gMn0gPSBcZnJhY3szNC41NiArIDQ3LjA0fXs0OH0gPSAxLjckJA0KDQoqICoqVC1TdGF0aXN0aWMgKCR0JCk6KioNCg0KICAgICQkdCA9IFxmcmFje1xiYXJ7eH1fMSAtIFxiYXJ7eH1fMn17XHNxcnR7c19wXjIgXGxlZnQoXGZyYWN7MX17bl8xfSArIFxmcmFjezF9e25fMn1ccmlnaHQpfX0kJA0KICAgICQkdCA9IFxmcmFjezQuOCAtIDUuNH17XHNxcnR7MS43IFxsZWZ0KFxmcmFjezF9ezI1fSArIFxmcmFjezF9ezI1fVxyaWdodCl9fSA9IFxmcmFjey0wLjZ9e1xzcXJ0ezAuMTM2fX0gXGFwcHJveCAtMS42MjckJA0KDQo8L2Rpdj4NCg0KIyMjIEtlcHV0dXNhbiBTdGF0aXN0aWsNCjxkaXYgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNkNGVkZGE7IHBhZGRpbmc6IDE1cHg7IGJvcmRlci1sZWZ0OiA1cHggc29saWQgIzI4YTc0NTsgbWFyZ2luLWJvdHRvbTogMjBweDsgYm9yZGVyLXJhZGl1czogNXB4OyI+DQpEZW5nYW4gJGRmID0gNDgkIGRhbiAkXGFscGhhID0gMC4wNSQsIG5pbGFpIGtyaXRpcyAkdCQgYWRhbGFoIHNla2l0YXIgJFxwbSAyLjAxJC4gDQpLYXJlbmEgJHwtMS42Mjd8IDwgMi4wMSQsIG1ha2E6DQokJFx0ZXh0e0tlcHV0dXNhbjogR2FnYWwgVG9sYWsgfSBIXzAkJA0KPC9kaXY+DQoNCiMjIyBJbnRlcnByZXRhc2kgQmlzbmlzDQo8ZGl2IHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOiAjZDRlZGRhOyBwYWRkaW5nOiAxNXB4OyBib3JkZXItbGVmdDogNXB4IHNvbGlkICMyOGE3NDU7IG1hcmdpbi1ib3R0b206IDIwcHg7IGJvcmRlci1yYWRpdXM6IDVweDsiPg0KS2VwdXR1c2FuIFByb2R1azogVGlkYWsgYWRhIHBlcmJlZGFhbiBzaWduaWZpa2FuIHNlY2FyYSBzdGF0aXN0aWsuIFBlcnViYWhhbiBkZXNhaW4gYmVsdW0gdGVudHUgbWVuaW5na2F0a2FuIGR1cmFzaSBzZXNpIHNlY2FyYSBueWF0YS4NCjwvZGl2Pg0KDQojIENhc2UgU3R1ZHkgQ2hpLVNxdWFyZSBUZXN0IG9mIEluZGVwZW5kZW5jZQ0KDQojIyBEYXRhIE9ic2VydmFzaQ0KPGRpdiBzdHlsZT0iYmFja2dyb3VuZC1jb2xvcjogI2Q0ZWRkYTsgcGFkZGluZzogMTVweDsgYm9yZGVyLWxlZnQ6IDVweCBzb2xpZCAjMjhhNzQ1OyBtYXJnaW4tYm90dG9tOiAyMHB4OyBib3JkZXItcmFkaXVzOiA1cHg7Ij4NCmBgYHtyfQ0KIyB0YWJlbCBkYXRhIG9ic2VydmFzaQ0KdGFiZWxfZGF0YSA8LSBkYXRhLmZyYW1lKA0KICBQZXJhbmdrYXQgPSBjKCJNb2JpbGUiLCAiRGVza3RvcCIpLA0KICBgRS1XYWxsZXRgID0gYygxMjAsIDYwKSwNCiAgYENyZWRpdCBDYXJkYCA9IGMoODAsIDkwKSwNCiAgYENhc2ggb24gRGVsaXZlcnlgID0gYyg1MCwgNDApDQopIA0KDQojIE1lbXVuY3Vsa2FuIHRhYmVsDQprYWJsZSh0YWJlbF9kYXRhLCBjYXB0aW9uID0gIlRhYmVsIDE6IERhdGEgT2JzZXJ2YXNpIFBlbmdndW5hYW4gUGVyYW5na2F0IGRhbiBQZW1iYXlhcmFuIikNCmBgYA0KPC9kaXY+DQoNCiMjIEphd2FiYW4gVHVnYXMNCg0KIyMjIEhpcG90ZXNpcyBOb2wgZGFuIEhpcG90ZXNpcyBBbHRlcm5hdGlmIA0KPGRpdiBzdHlsZT0iYmFja2dyb3VuZC1jb2xvcjogI2Q0ZWRkYTsgcGFkZGluZzogMTVweDsgYm9yZGVyLWxlZnQ6IDVweCBzb2xpZCAjMjhhNzQ1OyBtYXJnaW4tYm90dG9tOiAyMHB4OyBib3JkZXItcmFkaXVzOiA1cHg7Ij4NCk1lbmd1amkga2V0ZXJrYWl0YW4gYW50YXJhIGplbmlzIHBlcmFuZ2thdCBkYW4gbWV0b2RlIHBlbWJheWFyYW46DQoNCiogKipOdWxsIEh5cG90aGVzaXMgKCRIXzAkKToqKiBQZXJhbmdrYXQgZGFuIG1ldG9kZSBwZW1iYXlhcmFuIGJlcnNpZmF0IGluZGVwZW5kZW4gKHRpZGFrIGJlcmh1YnVuZ2FuKS4NCg0KKiAqKkFsdGVybmF0aXZlIEh5cG90aGVzaXMgKCRIXzEkKToqKiBBZGEgaHVidW5nYW4gc2lnbmlmaWthbiBhbnRhcmEgcGVyYW5na2F0IGRhbiBtZXRvZGUgcGVtYmF5YXJhbi4NCjwvZGl2Pg0KDQojIyMgVWppIFN0YXRpc3RpayAoJFxjaGleMiQpDQo8ZGl2IHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOiAjZDRlZGRhOyBwYWRkaW5nOiAxNXB4OyBib3JkZXItbGVmdDogNXB4IHNvbGlkICMyOGE3NDU7IG1hcmdpbi1ib3R0b206IDIwcHg7IGJvcmRlci1yYWRpdXM6IDVweDsiPg0KVWppIFN0YXRpc3RpayB5YW5nIFRlcGF0Og0KICBVamkgQ2hpLVNxdWFyZSB1bnR1ayBJbmRlcGVuZGVuc2kgKCRcY2hpXjIkKSwga2FyZW5hIGtpdGEgbWVuZ3VqaSBodWJ1bmdhbiBhbnRhcmEgZHVhIHZhcmlhYmVsIGthdGVnb3Jpa2FsLg0KPC9kaXY+DQoNCiMjIyBQZXJoaXR1bmdhbiBTdGF0aXN0aWsgKCRcY2hpXjIkKQ0KPGRpdiBzdHlsZT0iYmFja2dyb3VuZC1jb2xvcjogI2Q0ZWRkYTsgcGFkZGluZzogMTVweDsgYm9yZGVyLWxlZnQ6IDVweCBzb2xpZCAjMjhhNzQ1OyBtYXJnaW4tYm90dG9tOiAyMHB4OyBib3JkZXItcmFkaXVzOiA1cHg7Ij4NClJ1bXVzIGRhc2FyIENoaS1TcXVhcmUgYWRhbGFoIHBlcmJhbmRpbmdhbiBhbnRhcmEgbmlsYWkgb2JzZXJ2YXNpICgkTyQpIGRhbiBuaWxhaSBoYXJhcGFuICgkRSQpOg0KDQokJFxjaGleMiA9IFxzdW0gXGZyYWN7KE9fe2l9IC0gRV97aX0pXjJ9e0Vfe2l9fSQkDQoNCioqUGVyaGl0dW5nYW4gTmlsYWkgSGFyYXBhbiAoJEUkKToqKg0KVW50dWsgc2V0aWFwIHNlbCBkYWxhbSB0YWJlbCwgbmlsYWkgaGFyYXBhbiBkaWhpdHVuZyBkZW5nYW46DQoNCiQkRSA9IFxmcmFjeyhcdGV4dHtUb3RhbCBCYXJpc30gXHRpbWVzIFx0ZXh0e1RvdGFsIEtvbG9tfSl9e1x0ZXh0e0dyYW5kIFRvdGFsfX0kJA0KDQoqKkNvbnRvaCBQZXJoaXR1bmdhbiBTZWwgKE1vYmlsZSwgRS1XYWxsZXQpOioqDQoNCiQkRV97MSwxfSA9IFxmcmFjezI1MCBcdGltZXMgMTgwfXs0NDB9IFxhcHByb3ggMTAyLjI3JCQNCjwvZGl2Pg0KDQojIyMgTWVuZW50dWthbiBwLXZhbHVlIHBhZGEgJM6xPTAuMDUkOg0KPGRpdiBzdHlsZT0iYmFja2dyb3VuZC1jb2xvcjogI2Q0ZWRkYTsgcGFkZGluZzogMTVweDsgYm9yZGVyLWxlZnQ6IDVweCBzb2xpZCAjMjhhNzQ1OyBtYXJnaW4tYm90dG9tOiAyMHB4OyBib3JkZXItcmFkaXVzOiA1cHg7Ij4NCg0KICogQmVyZGFzYXJrYW4gcGVyaGl0dW5nYW4gUiBkaSBhdGFzLCAkcC12YWx1ZSA9IDAuMDAzMTAyJC4NCg0KICogS2FyZW5hICQwLjAwMzE8MC4wNSQsIG1ha2Ega2l0YSBUb2xhayAkSF8wJA0KPC9kaXY+DQoNCiMjIyBJbnRlcnByZXRhc2kgZGFsYW0gU3RyYXRlZ2kgUGVtYmF5YXJhbiBEaWdpdGFsOg0KPGRpdiBzdHlsZT0iYmFja2dyb3VuZC1jb2xvcjogI2Q0ZWRkYTsgcGFkZGluZzogMTVweDsgYm9yZGVyLWxlZnQ6IDVweCBzb2xpZCAjMjhhNzQ1OyBtYXJnaW4tYm90dG9tOiAyMHB4OyBib3JkZXItcmFkaXVzOiA1cHg7Ij4NCkhhc2lsIG1lbnVuanVra2FuIGJhaHdhIHRpcGUgcGVyYW5na2F0IHNlY2FyYSBzaWduaWZpa2FuIG1lbWVuZ2FydWhpIHBpbGloYW4gcGVtYmF5YXJhbi4gUGVuZ2d1bmEgTW9iaWxlIGNlbmRlcnVuZyBsZWJpaCBiYW55YWsgbWVuZ2d1bmFrYW4gRS1XYWxsZXQsIHNlZGFuZ2thbiBwZW5nZ3VuYSBEZXNrdG9wIG1lbWlsaWtpIHByb3BvcnNpIHBlbmdndW5hYW4gS2FydHUgS3JlZGl0IHlhbmcgbGViaWggdGluZ2dpLiBQZXJ1c2FoYWFuIGhhcnVzIG1lbmdvcHRpbWFsa2FuIGFudGFybXVrYSBwZW1iYXlhcmFuIGRpZ2l0YWwgc2VzdWFpIGRlbmdhbiBwZXJhbmdrYXQgeWFuZyBkaWd1bmFrYW4gcGVsYW5nZ2FuLg0KPC9kaXY+DQoNCiMgQ2FzZSBTdHVkeSBUeXBlIEkgYW5kIFR5cGUgSUkgRXJyb3JzIChDb25jZXB0dWFsKQ0KDQojIyBEZWZpbmlzaSBNYXNhbGFoDQo8ZGl2IHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOiAjZDRlZGRhOyBwYWRkaW5nOiAxNXB4OyBib3JkZXItbGVmdDogNXB4IHNvbGlkICMyOGE3NDU7IG1hcmdpbi1ib3R0b206IDIwcHg7IGJvcmRlci1yYWRpdXM6IDVweDsiPg0KU2VidWFoIHN0YXJ0dXAgKmZpbnRlY2gqIHNlZGFuZyBtZW5ndWppIGFwYWthaCBhbGdvcml0bWEgZGV0ZWtzaSBmcmF1ZCB5YW5nIGJhcnUgZGFwYXQgbWVuZ3VyYW5naSB0cmFuc2Frc2kgcGVuaXB1YW4uDQoNCiogKiokSF8wJCAoSGlwb3Rlc2lzIE5vbCk6KiogQWxnb3JpdG1hIGJhcnUgKip0aWRhayoqIG1lbmd1cmFuZ2kgZnJhdWQuDQoqICoqJEhfMSQgKEhpcG90ZXNpcyBBbHRlcm5hdGlmKToqKiBBbGdvcml0bWEgYmFydSAqKm1lbmd1cmFuZ2kqKiBmcmF1ZC4NCjwvZGl2Pg0KDQojIyBKYXdhYmFuIHR1Z2FzDQoNCiMjIyBQZW5qZWxhc2FuIEtlc2FsYWhhbiBUaXBlIEkgKCRcYWxwaGEkKQ0KPGRpdiBzdHlsZT0iYmFja2dyb3VuZC1jb2xvcjogI2Q0ZWRkYTsgcGFkZGluZzogMTVweDsgYm9yZGVyLWxlZnQ6IDVweCBzb2xpZCAjMjhhNzQ1OyBtYXJnaW4tYm90dG9tOiAyMHB4OyBib3JkZXItcmFkaXVzOiA1cHg7Ij4NCioqS2VzYWxhaGFuIFRpcGUgSSoqIHRlcmphZGkga2V0aWthIGtpdGEgbWVub2xhayAkSF8wJCwgcGFkYWhhbCAkSF8wJCBzZWJlbmFybnlhIGJlbmFyLg0KDQoqICoqRGFsYW0ga29udGVrcyBpbmk6KiogS2l0YSBtZW55aW1wdWxrYW4gYmFod2EgYWxnb3JpdG1hIGJhcnUgZWZla3RpZiBtZW5ndXJhbmdpIGZyYXVkLCBwYWRhaGFsIGtlbnlhdGFhbm55YSBhbGdvcml0bWEgdGVyc2VidXQgKip0aWRhayBtZW1iZXJpa2FuIHBlcnViYWhhbiBhcGEgcHVuKiouDQoNCiogKipEYW1wYWs6KiogUGVydXNhaGFhbiBtZW1idWFuZyBzdW1iZXIgZGF5YSB1bnR1ayBtZW5naW1wbGVtZW50YXNpa2FuIHRla25vbG9naSB5YW5nIHRpZGFrIGJlcmd1bmEuDQo8L2Rpdj4NCg0KIyMjIFBlbmplbGFzYW4gS2VzYWxhaGFuIFRpcGUgSUkgKCRcYmV0YSQpDQo8ZGl2IHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOiAjZDRlZGRhOyBwYWRkaW5nOiAxNXB4OyBib3JkZXItbGVmdDogNXB4IHNvbGlkICMyOGE3NDU7IG1hcmdpbi1ib3R0b206IDIwcHg7IGJvcmRlci1yYWRpdXM6IDVweDsiPg0KDQoqKktlc2FsYWhhbiBUaXBlIElJKiogdGVyamFkaSBrZXRpa2Ega2l0YSBnYWdhbCBtZW5vbGFrICRIXzAkLCBwYWRhaGFsICRIXzEkIGJlbmFyLg0KDQoqICoqRGFsYW0ga29udGVrcyBpbmk6KiogS2l0YSBtZW55aW1wdWxrYW4gYmFod2EgYWxnb3JpdG1hIGJhcnUgdGlkYWsgZWZla3RpZiwgcGFkYWhhbCBrZW55YXRhYW5ueWEgYWxnb3JpdG1hIHRlcnNlYnV0ICoqYmVyaGFzaWwgbWVuZ3VyYW5naSBmcmF1ZCoqLg0KDQoqICoqRGFtcGFrOioqIFBlcnVzYWhhYW4gbWVsZXdhdGthbiBwZWx1YW5nIGJlc2FyIHVudHVrIG1lbmdhbWFua2FuIHRyYW5zYWtzaSBwZWxhbmdnYW4gZGFyaSBwZW5pcHVhbi4NCjwvZGl2Pg0KDQojIyMgTWFuYSB5YW5nIExlYmloIE1lcnVnaWthbiBzZWNhcmEgQmlzbmlzPw0KPGRpdiBzdHlsZT0iYmFja2dyb3VuZC1jb2xvcjogI2Q0ZWRkYTsgcGFkZGluZzogMTVweDsgYm9yZGVyLWxlZnQ6IDVweCBzb2xpZCAjMjhhNzQ1OyBtYXJnaW4tYm90dG9tOiAyMHB4OyBib3JkZXItcmFkaXVzOiA1cHg7Ij4NClNlY2FyYSB1bXVtIGJhZ2kgc3RhcnR1cCAqZmludGVjaCosICoqS2VzYWxhaGFuIFRpcGUgSUkgKCRcYmV0YSQpKiogc2VyaW5na2FsaSBkaWFuZ2dhcCBsZWJpaCBtYWhhbC4NCiogSmlrYSB0ZXJqYWRpIEtlc2FsYWhhbiBUaXBlIElJLCBzaXN0ZW0ga2VhbWFuYW4gdGV0YXAgbGVtYWggc2VoaW5nZ2EgdHJhbnNha3NpIGZyYXVkIHRlcnVzIHRlcmphZGkuIEluaSBtZW55ZWJhYmthbiBrZXJ1Z2lhbiBmaW5hbnNpYWwgbGFuZ3N1bmcgYmFnaSBwZWxhbmdnYW4gZGFuIG1lcnVzYWsgcmVwdXRhc2kva2VwZXJjYXlhYW4gdGVyaGFkYXAgcGVydXNhaGFhbi4NCjwvZGl2Pg0KDQojIyMgUGVuZ2FydWggVWt1cmFuIFNhbXBlbCAoKlNhbXBsZSBTaXplKikgdGVyaGFkYXAgS2VzYWxhaGFuIFRpcGUgSUkNCjxkaXYgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNkNGVkZGE7IHBhZGRpbmc6IDE1cHg7IGJvcmRlci1sZWZ0OiA1cHggc29saWQgIzI4YTc0NTsgbWFyZ2luLWJvdHRvbTogMjBweDsgYm9yZGVyLXJhZGl1czogNXB4OyI+DQpUZXJkYXBhdCBodWJ1bmdhbiB0ZXJiYWxpayBhbnRhcmEgdWt1cmFuIHNhbXBlbCBkYW4gJFxiZXRhJDoNCg0KKiAqKlNlbWFraW4gYmVzYXIgdWt1cmFuIHNhbXBlbCAoJG4kKSwgbWFrYSBwcm9iYWJpbGl0YXMgdGVyamFkaW55YSBLZXNhbGFoYW4gVGlwZSBJSSAoJFxiZXRhJCkgYWthbiBzZW1ha2luIG1lbmdlY2lsLioqDQoNCiogU2FtcGVsIHlhbmcgbGViaWggYmVzYXIgbWVtYmVyaWthbiBsZWJpaCBiYW55YWsgaW5mb3JtYXNpLCBzZWhpbmdnYSB0ZXMgc3RhdGlzdGlrIG1lbmphZGkgbGViaWggc2Vuc2l0aWYgZGFsYW0gbWVuZGV0ZWtzaSBhZGFueWEgZWZlayBueWF0YSAocGVydWJhaGFuKSBkYXJpIGFsZ29yaXRtYSBiYXJ1Lg0KPC9kaXY+DQoNCiMjIyBWaXN1YWxpc2FzaSBTdGF0aXN0aWsNCjxkaXYgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNkNGVkZGE7IHBhZGRpbmc6IDE1cHg7IGJvcmRlci1sZWZ0OiA1cHggc29saWQgIzI4YTc0NTsgbWFyZ2luLWJvdHRvbTogMjBweDsgYm9yZGVyLXJhZGl1czogNXB4OyI+DQoNCmBgYHtyfQ0KIyBWaXN1YWxpc2FzaSBEaXN0cmlidXNpIE5vcm1hbCB1bnR1ayBBbHBoYSBkYW4gQmV0YQ0KeCA8LSBzZXEoLTQsIDcsIGxlbmd0aD0yMDApDQp5MSA8LSBkbm9ybSh4LCBtZWFuPTAsIHNkPTEpDQp5MiA8LSBkbm9ybSh4LCBtZWFuPTMsIHNkPTEpDQoNCmRmIDwtIGRhdGEuZnJhbWUoeCwgeTEsIHkyKQ0KDQpnZ3Bsb3QoZGYsIGFlcyh4PXgpKSArDQogIGdlb21fbGluZShhZXMoeT15MSksIGNvbG9yPSJibHVlIiwgc2l6ZT0xKSArDQogIGdlb21fbGluZShhZXMoeT15MiksIGNvbG9yPSJyZWQiLCBzaXplPTEpICsNCiAgZ2VvbV9hcmVhKGRhdGE9c3Vic2V0KGRmLCB4ID4gMS42NCksIGFlcyh5PXkxKSwgZmlsbD0iYmx1ZSIsIGFscGhhPTAuMykgKw0KICBnZW9tX2FyZWEoZGF0YT1zdWJzZXQoZGYsIHggPCAxLjY0KSwgYWVzKHk9eTIpLCBmaWxsPSJyZWQiLCBhbHBoYT0wLjMpICsNCiAgYW5ub3RhdGUoInRleHQiLCB4PTAsIHk9MC40MiwgbGFiZWw9IkgwIEJlbmFyIiwgY29sb3I9ImJsdWUiKSArDQogIGFubm90YXRlKCJ0ZXh0IiwgeD0zLCB5PTAuNDIsIGxhYmVsPSJIMSBCZW5hciIsIGNvbG9yPSJyZWQiKSArDQogIGFubm90YXRlKCJ0ZXh0IiwgeD0yLjIsIHk9MC4wNSwgbGFiZWw9IkFscGhhIChUaXBlIEkpIikgKw0KICBhbm5vdGF0ZSgidGV4dCIsIHg9MC44LCB5PTAuMDUsIGxhYmVsPSJCZXRhIChUaXBlIElJKSIpICsNCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgbGFicyh0aXRsZT0iVmlzdWFsaXNhc2kgS2VzYWxhaGFuIFRpcGUgSSBkYW4gVGlwZSBJSSIsIHk9IlByb2JhYmlsaXRhcyIsIHg9Ik5pbGFpIFN0YXRpc3RpayIpDQpgYGANCjwvZGl2Pg0KDQojIyMgSHVidW5nYW4gYW50YXJhICRcYWxwaGEkLCAkXGJldGEkLCBkYW4gU3RhdGlzdGljYWwgUG93ZXINCjxkaXYgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNkNGVkZGE7IHBhZGRpbmc6IDE1cHg7IGJvcmRlci1sZWZ0OiA1cHggc29saWQgIzI4YTc0NTsgbWFyZ2luLWJvdHRvbTogMjBweDsgYm9yZGVyLXJhZGl1czogNXB4OyI+DQpLZXRpZ2Ega29uc2VwIGluaSBzYWxpbmcgYmVya2FpdGFuIGVyYXQ6DQoNCiogKipTdGF0aXN0aWNhbCBQb3dlciAoJDEgLSBcYmV0YSQpOioqIEFkYWxhaCBrZW1hbXB1YW4gdGVzIHVudHVrIG1lbmRldGVrc2kgZWZlayB5YW5nIGJlbmFyLWJlbmFyIGFkYSAobWVub2xhayAkSF8wJCB5YW5nIHNhbGFoKS4NCg0KKiAqKlRyYWRlLW9mZiAkXGFscGhhJCBkYW4gJFxiZXRhJDoqKiBKaWthIGtpdGEgbWVtcGVya2V0YXQgJFxhbHBoYSQgKG1pc2FsbnlhIGRhcmkgMC4wNSBrZSAwLjAxKSB1bnR1ayBtZW5naGluZGFyaSBrZXNhbGFoYW4gVGlwZSBJLCBtYWthIHByb2JhYmlsaXRhcyBLZXNhbGFoYW4gVGlwZSBJSSAoJFxiZXRhJCkgYmlhc2FueWEgYWthbiBtZW5pbmdrYXQsIHlhbmcgYmVyYXJ0aSAqUG93ZXIqIG1lbnVydW4uDQoNCiogKipNZW5pbmdrYXRrYW4gUG93ZXI6KiogQ2FyYSBwYWxpbmcgZWZla3RpZiB1bnR1ayBtZW51cnVua2FuICRcYmV0YSQgdGFucGEgbWVuaW5na2F0a2FuICRcYWxwaGEkIGFkYWxhaCBkZW5nYW4gbWVtcGVyYmVzYXIgKip1a3VyYW4gc2FtcGVsKiouDQo8L2Rpdj4NCg0KIyBDYXNlIFN0dWR5IFAtVmFsdWUgYW5kIFN0YXRpc3RpY2FsIERlY2lzaW9uIE1ha2luZw0KDQojIyBBbmFsaXNpcyBIYXNpbCBFdmFsdWFzaSBNb2RlbA0KPGRpdiBzdHlsZT0iYmFja2dyb3VuZC1jb2xvcjogI2Q0ZWRkYTsgcGFkZGluZzogMTVweDsgYm9yZGVyLWxlZnQ6IDVweCBzb2xpZCAjMjhhNzQ1OyBtYXJnaW4tYm90dG9tOiAyMHB4OyBib3JkZXItcmFkaXVzOiA1cHg7Ij4NCkJlcmRhc2Fya2FuIGV2YWx1YXNpIG1vZGVsIHByZWRpa3NpICpjaHVybiosIGRpZGFwYXRrYW4gZGF0YSBiZXJpa3V0Og0KDQoqICoqVGVzdCBTdGF0aXN0aWM6KiogJDIuMzEkDQoNCiogKipQLVZhbHVlOioqICQwLjAyMSQNCg0KKiAqKlNpZ25pZmljYW5jZSBMZXZlbCAoJFxhbHBoYSQpOioqICQwLjA1JA0KPC9kaXY+DQoNCiMjIEphd2FiYW4gVHVnYXMNCg0KIyMjIE1ha25hIGRhcmkgcC12YWx1ZQ0KPGRpdiBzdHlsZT0iYmFja2dyb3VuZC1jb2xvcjogI2Q0ZWRkYTsgcGFkZGluZzogMTVweDsgYm9yZGVyLWxlZnQ6IDVweCBzb2xpZCAjMjhhNzQ1OyBtYXJnaW4tYm90dG9tOiAyMHB4OyBib3JkZXItcmFkaXVzOiA1cHg7Ij4NCiRwXHRleHR7LXZhbHVlfSQgc2ViZXNhciAqKjAuMDIxKiogYmVyYXJ0aSBqaWthIGtpdGEgbWVuZ2FzdW1zaWthbiBoaXBvdGVzaXMgbm9sICgkSF8wJCkgYmVuYXIgKGFydGlueWEgbW9kZWwgdGlkYWsgbWVtaWxpa2kga2VtYW1wdWFuIHByZWRpa3NpKSwgbWFrYSBwcm9iYWJpbGl0YXMgdW50dWsgbWVuZGFwYXRrYW4gaGFzaWwgc3RhdGlzdGlrIHVqaSBzZWJlc2FyIDIuMzEgYXRhdSBsZWJpaCBzZWNhcmEgdGlkYWsgc2VuZ2FqYSBoYW55YWxhaCAqKjIuMSUqKi4gS2FyZW5hIHByb2JhYmlsaXRhcyBpbmkgc2FuZ2F0IGtlY2lsLCBraXRhIG1lcmFndWthbiBrZWJlbmFyYW4gJEhfMCQuDQo8L2Rpdj4NCiMjIyBLZXB1dHVzYW4gU3RhdGlzdGlrDQo8ZGl2IHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOiAjZDRlZGRhOyBwYWRkaW5nOiAxNXB4OyBib3JkZXItbGVmdDogNXB4IHNvbGlkICMyOGE3NDU7IG1hcmdpbi1ib3R0b206IDIwcHg7IGJvcmRlci1yYWRpdXM6IDVweDsiPg0KVW50dWsgbWVuZ2FtYmlsIGtlcHV0dXNhbiwga2l0YSBtZW1iYW5kaW5na2FuIG5pbGFpICRwJCBkZW5nYW4gYW1iYW5nIGJhdGFzICRcYWxwaGEkOg0KDQoqKktyaXRlcmlhIEtlcHV0dXNhbjoqKg0KKiBKaWthICRwXHRleHR7LXZhbHVlfSBcbGUgXGFscGhhIFxSaWdodGFycm93JCBUb2xhayAkSF8wJA0KKiBKaWthICRwXHRleHR7LXZhbHVlfSA+IFxhbHBoYSBcUmlnaHRhcnJvdyQgR2FnYWwgVG9sYWsgJEhfMCQNCg0KKipQZXJoaXR1bmdhbjoqKg0KJCQwLjAyMSBcbGUgMC4wNSQkDQoNCioqS2VwdXR1c2FuOioqICoqVG9sYWsgJEhfMCQqKi4gSGFzaWwgcGVuZ3VqaWFuIGluaSBkaW55YXRha2FuICoqc2lnbmlmaWthbiBzZWNhcmEgc3RhdGlzdGlrKiogcGFkYSB0aW5na2F0IGtlcGVyY2F5YWFuIDk1JS4NCjwvZGl2Pg0KDQojIyMgSW50ZXJwcmV0YXNpIE1hbmFqZXJpYWwgKEJhaGFzYSBOb24tVGVrbmlzKQ0KPGRpdiBzdHlsZT0iYmFja2dyb3VuZC1jb2xvcjogI2Q0ZWRkYTsgcGFkZGluZzogMTVweDsgYm9yZGVyLWxlZnQ6IDVweCBzb2xpZCAjMjhhNzQ1OyBtYXJnaW4tYm90dG9tOiAyMHB4OyBib3JkZXItcmFkaXVzOiA1cHg7Ij4NCiJIYXNpbCBhbmFsaXNpcyBrYW1pIG1lbnVuanVra2FuIGJhaHdhIG1vZGVsIHByZWRpa3NpICpjaHVybiogaW5pIGJla2VyamEgZGVuZ2FuIHNhbmdhdCBiYWlrLiBLZW11bmdraW5hbiBoYXNpbCBpbmkgYmVuYXIgaGFueWEga2FyZW5hIGtlYmV0dWxhbiBzYW5nYXRsYWggcmVuZGFoIChrdXJhbmcgZGFyaSAzJSkuIE9sZWgga2FyZW5hIGl0dSwga2l0YSBkYXBhdCBtZW5nZ3VuYWthbiBtb2RlbCBpbmkgZGVuZ2FuIHBlcmNheWEgZGlyaSB1bnR1ayBtZW5naWRlbnRpZmlrYXNpIHBlbGFuZ2dhbiB5YW5nIGJlcmlzaWtvIGJlcmhlbnRpIGJlcmxhbmdnYW5hbi4iDQo8L2Rpdj4NCg0KIyMjIFJpc2lrbyBTYW1wZWwgVGlkYWsgUmVwcmVzZW50YXRpZg0KPGRpdiBzdHlsZT0iYmFja2dyb3VuZC1jb2xvcjogI2Q0ZWRkYTsgcGFkZGluZzogMTVweDsgYm9yZGVyLWxlZnQ6IDVweCBzb2xpZCAjMjhhNzQ1OyBtYXJnaW4tYm90dG9tOiAyMHB4OyBib3JkZXItcmFkaXVzOiA1cHg7Ij4NCkppa2Egc2FtcGVsIHlhbmcgZGlndW5ha2FuIHVudHVrIG1lbmdldmFsdWFzaSBtb2RlbCB0aWRhayBtZXdha2lsaSBzZWx1cnVoIHBvcHVsYXNpIHBlbGFuZ2dhbiAobWlzYWxueWEgaGFueWEgbWVuZ2FtYmlsIGRhdGEgZGFyaSBwZWxhbmdnYW4gbGFtYSksIG1ha2EgbXVuY3VsIHJpc2lrbzoNCg0KKiAqKkJpYXMgR2VuZXJhbGlzYXNpOioqIE1vZGVsIG11bmdraW4gdGVybGloYXQgYWt1cmF0IGRhbGFtIHBlbmd1amlhbiwgbmFtdW4gZ2FnYWwgc2FhdCBkaXRlcmFwa2FuIHBhZGEgcGVsYW5nZ2FuIGJhcnUgYXRhdSBzZWdtZW4geWFuZyBiZXJiZWRhLg0KDQoqICoqS2VzYWxhaGFuIFN0cmF0ZWdpOioqIE1hbmFqZW1lbiBtdW5na2luIHNhbGFoIG1lbmdhbG9rYXNpa2FuIGFuZ2dhcmFuIHByb21vc2kga2FyZW5hIHByZWRpa3NpIG1vZGVsIHlhbmcgdGlkYWsgYWt1cmF0IGRpIGxhcGFuZ2FuLg0KPC9kaXY+DQoNCiMjIyBNZW5nYXBhIHAtdmFsdWUgVGlkYWsgTWVuZ3VrdXIgRWZmZWN0IFNpemU/DQo8ZGl2IHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOiAjZDRlZGRhOyBwYWRkaW5nOiAxNXB4OyBib3JkZXItbGVmdDogNXB4IHNvbGlkICMyOGE3NDU7IG1hcmdpbi1ib3R0b206IDIwcHg7IGJvcmRlci1yYWRpdXM6IDVweDsiPg0KJHBcdGV4dHstdmFsdWV9JCBoYW55YSBtZW5naW5mb3JtYXNpa2FuIGFwYWthaCBzZWJ1YWggZWZlayAqKmFkYSoqIGF0YXUgdGlkYWsgKHNpZ25pZmlrYW5zaSksIGJ1a2FuIHNlYmVyYXBhICoqYmVzYXIqKiBkYW1wYWsgZWZlayB0ZXJzZWJ1dCB0ZXJoYWRhcCBiaXNuaXMuIA0KDQpIdWJ1bmdhbiBtYXRlbWF0aXNueWEgc2VjYXJhIGtvbnNlcHR1YWwgYWRhbGFoOg0KJCRcdGV4dHtUZXN0IFN0YXRpc3RpY30gPSBcdGV4dHtFZmZlY3QgU2l6ZX0gXHRpbWVzIFxzcXJ0e1x0ZXh0e1NhbXBsZSBTaXplfX0kJA0KDQpEZW5nYW4ganVtbGFoIHNhbXBlbCAoJG4kKSB5YW5nIHNhbmdhdCBiZXNhciwgZWZlayB5YW5nIHNhbmdhdCBrZWNpbCBwdW4gZGFwYXQgbWVuZ2hhc2lsa2FuICRwXHRleHR7LXZhbHVlfSQgeWFuZyBzaWduaWZpa2FuIHNlY2FyYSBzdGF0aXN0aWssIG1lc2tpcHVuIHNlY2FyYSBwcmFrdGlzIGVmZWsgdGVyc2VidXQgdGlkYWsgbWVtYmVyaWthbiBrZXVudHVuZ2FuIGZpbmFuc2lhbCB5YW5nIGJlcmFydGkgYmFnaSBwZXJ1c2FoYWFuLg0KDQo8L2Rpdj4=