
. Pendahuluan
Dalam dunia industri yang bergerak cepat, setiap data yang masuk
membawa cerita tentang bagaimana pengguna berinteraksi dengan produk
kita. Namun, tantangan terbesarnya adalah membedakan mana perubahan yang
memang nyata dan mana yang hanya sekadar fluktuasi acak. Laporan ini
disusun sebagai upaya untuk membedah berbagai data lapangan melalui
kacamata statistik yang objektif, guna memastikan setiap keputusan
bisnis diambil berdasarkan bukti, bukan sekadar intuisi.
Laporan ini merangkum enam studi kasus krusial yang mewakili dinamika
operasional perusahaan. Kita akan melihat bagaimana angka-angka teknis
diterjemahkan menjadi wawasan strategis:
Audit Realita: Menguji apakah durasi belajar pengguna masih
sesuai dengan klaim yang kita berikan kepada publik atau sudah mengalami
penurunan yang perlu diwaspadai.
Validasi UX: Memastikan apakah perubahan desain aplikasi
benar-benar membantu pengguna bekerja lebih cepat atau justru tidak
memberikan dampak apa pun.
Efektivitas Strategi: Membandingkan dua versi tampilan web
melalui A/B Testing untuk menentukan arah pengembangan produk ke
depan.
Pola Perilaku: Membongkar hubungan antara perangkat yang
digunakan pelanggan dengan metode pembayaran yang mereka pilih untuk
personalisasi promo.
Keamanan & Risiko: Menghitung risiko kegagalan algoritma
deteksi penipuan agar perusahaan tidak mengalami kerugian finansial
maupun kehilangan kepercayaan pelanggan.
Setiap kasus dalam laporan ini diuji menggunakan standar pengujian
hipotesis, mulai dari Z-test, T-test, hingga Chi-Square. Kita tidak
hanya melihat angka akhir, tetapi juga mempertimbangkan aspek kualitas
data, ukuran sampel, dan besarnya dampak nyata (effect size).
Untuk mempermudah pemahaman, setiap bab dilengkapi dengan visualisasi
distribusi normal yang interaktif. Grafik ini berfungsi sebagai “peta
navigasi” yang menunjukkan secara jelas posisi data kita: apakah masih
berada dalam batas wajar atau sudah masuk ke zona signifikan yang
memerlukan tindakan segera dari manajemen.
Tujuan utama dari laporan ini bukan sekadar menyajikan rumus,
melainkan memberikan kepastian. Dengan memahami kapan sebuah data
dianggap signifikan, kita dapat menghindari kesalahan investasi pada
strategi yang salah dan lebih fokus pada pengembangan yang memberikan
hasil nyata bagi pertumbuhan perusahaan.
. Study Case 1
- Executive Summary
Laporan ini disusun untuk memverifikasi apakah klaim performa
rata-rata waktu belajar pengguna sebesar 120 menit/hari masih relevan
dengan kondisi lapangan saat ini. Berdasarkan audit data terbaru
terhadap 64 sampel pengguna, ditemukan angka rata-rata sebesar 116
menit.
Tujuan analisis ini adalah menentukan apakah penurunan 4 menit
tersebut merupakan fluktuasi harian yang wajar (random noise) atau
merupakan sinyal penurunan keterlibatan pengguna (engagement) yang
signifikan secara statistik.
- Kerangka Pengujian (Hypothesis Design)
Untuk menghindari bias subjektif, kita menggunakan metode Two-Tailed
Z-Test dengan struktur logika sebagai berikut: - \(H_0\) (Null Hypothesis): Rata-rata waktu
belajar tetap 120 menit. Perbedaan yang ditemukan hanyalah variasi acak
yang tidak berarti. - \(H_1\)
(Alternative Hypothesis): Rata-rata waktu belajar sudah berubah (tidak
sama dengan 120 menit). Perbedaan 4 menit adalah nyata dan representatif
terhadap populasi.
- Metodologi dan Komputasi
Kita menggunakan parameter teknis sebagai berikut:
Populasi Standar Deviasi (\(\sigma\)): 15
Jumlah Sampel (\(n\)):
64
Level Signifikansi (\(\alpha\)):
0.05 (Toleransi error 5%)
Rumus Perhitungan:\[Z = \frac{\bar{x}
- \mu_0}{\sigma / \sqrt{n}}\]
Langkah Analisis:
Standard Error: mengukur seberapa besar penyimpangan rata-rata
sampel dari rata-rata populasi. Nilainya adalah \(15 / \sqrt{64} = 1.875\).
Z-Score: menghitung sejauh mana jarak fakta (116) dari target
(120). Hasilnya adalah -2.13. Artinya, data kita berada 2.13 standar
deviasi di bawah target.
Tabel 1: Summary Statistik Validasi Data
|
Indikator
|
Nilai
|
Interpretasi
|
|
Target Perusahaan (µ)
|
120.0 Min
|
Benchmark
|
|
Rata-rata Lapangan (x̄)
|
116.0 Min
|
Observasi Sampel
|
|
Selisih (Gap)
|
-4.0 Min
|
Penurunan Terdeteksi
|
|
Z-Score
|
-2.133
|
Penyimpangan
|
|
P-Value
|
0.0329
|
Signifikansi Statistik
|

- Kesimpulan Strategis Berdasarkan hasil pengujian:
Signifikansi: Nilai P-Value (0.033) berada di bawah ambang batas
0.05. Ini berarti penurunan 4 menit tersebut bukan kebetulan.
Dampak Bisnis: Klaim pemasaran kita mengenai Belajar 120
menit/hari sekarang secara ilmiah dianggap tidak akurat. Jika terus
digunakan, kita berisiko memberikan informasi yang menyesatkan kepada
investor atau pengguna.
Rekomendasi: Segera lakukan evaluasi pada modul pembelajaran yang
baru saja dirilis. Ada kemungkinan engagement menurun karena konten atau
kendala teknis pada aplikasi.
. Study Case 2
- Strategi Pengujian Kita tidak ingin sekadar menebak. Kita
menggunakan Two-Tailed T-Test karena fokus kita adalah mencari tahu
apakah ada perbedaan (entah itu lebih cepat atau lebih lambat).
- \(H_0\) (The Status Quo): \(\mu = 10\). Rata-rata waktu penyelesaian
tugas masih tepat di angka 10 menit.
- \(H_1\) (The Deviation): \(\mu \neq 10\). Waktu penyelesaian tugas
sudah berubah secara signifikan dari 10 menit.
- Dalam kasus ini, kita menggunakan One-Sample T-Test karena:
- Blind on Population: Kita tidak tahu standar deviasi populasi (\(\sigma\)).
- Small Data: Sampel kita kecil (\(n =
10\)).
- Real-world Data: Kita mengandalkan standar deviasi dari sampel
(\(s\)) untuk melakukan estimasi.
- Komputasi dan Rumus Statistik Data yang kita miliki: 9.2, 10.5, 9.8,
10.1, 9.6, 10.3, 9.9, 9.7, 10.0, 9.5
- Formula Utama:\[t = \frac{\bar{x} -
\mu_0}{s / \sqrt{n}}\]
Langkah Perhitungan:
Rata-rata Sampel (\(\bar{x}\)):
9.86 menit.
Standar Deviasi Sampel (\(s\)):
\(\approx 0.403\).
T-Score: mengukur seberapa jauh deviasi rata-rata kita terhadap
standar error yang ada.
Tabel 2: Hasil Uji Efisiensi Task Baru
|
Indikator
|
Nilai
|
Keterangan
|
|
Target UX (µ)
|
10.00 Min
|
Benchmark
|
|
Rata-rata User (x̄)
|
9.86 Min
|
Realita
|
|
Standar Deviasi (s)
|
0.386
|
Variansi
|
|
T-Statistic
|
-1.146
|
Skor Uji
|
|
P-Value
|
0.2815
|
Signifikansi
|

- Kesimpulan Strategis
Setelah kita bedah datanya, berikut adalah insight untuk tim UX:
HASIL: Tidak signifikan nilai P-Value (0.288) jauh lebih besar dari
0.05. Ini artinya kita gagal menolak hipotesis nol (\(H_0\)).
Makna bisnis meskipun rata-rata sampel kita 9.86 menit (terlihat
lebih cepat), secara statistik perbedaan itu tidak berarti. Fluktuasi
tersebut masih dianggap wajar dalam batas error. Tim UX bisa
menyimpulkan bahwa aplikasi baru ini performa waktunya masih sama dengan
ekspektasi 10 menit.
Rekomendasi:Jangan terburu-buru mengklaim aplikasi lebih cepat.
Jika ingin benar-benar melihat perbedaan, tim UX perlu menambah jumlah
partisipan tes (increase sample size) atau melakukan optimasi lebih
lanjut pada alur navigasi.
. Study Case 3
- Hipotesis: Mencari perbedaan nyata
Kita menggunakan uji dua arah (two-tailed) untuk memastikan apakah
ada perbedaan durasi yang signifikan di antara kedua versi tersebut.
\(H_0\) (Status Quo): Tidak ada
perbedaan rata-rata durasi antara Versi A dan Versi B.
(\(\mu_A = \mu_B\)).\(H_1\) (Difference): Ada perbedaan rata-rata
durasi yang nyata antara Versi A dan Versi B (\(\mu_A \neq \mu_B\)).
- Metodologi: Independent Two-Sample T-Test
Independent Groups: User yang melihat Versi A berbeda dengan user
yang melihat Versi B.
Small Sample: Ukuran sampel tiap kelompok adalah 25 (\(n < 30\)).
Standard Deviation: Kita menggunakan standar deviasi dari sampel
masing-masing kelompok.
- Rumus dan Logika perhitungan
Kita menggunakan pendekatan Pooled Variance karena jumlah sampel
kedua kelompok sama.
- Formula T-Statistic:\[t = \frac{\bar{x}_A
- \bar{x}_B}{\sqrt{\frac{s_A^2}{n_A} + \frac{s_B^2}{n_B}}}\]
Data yang Kita Miliki:
Versi A: \(n = 25\), \(\bar{x} = 4.8\), \(s = 1.2\)
Versi B: \(n = 25\), \(\bar{x} = 5.4\), \(s = 1.4\)
Standard Error: \(\sqrt{(1.2^2/25) +
(1.4^2/25)} \approx 0.3688\)
T-Score: \((4.8 - 5.4) / 0.3688 =
\mathbf{-1.627}\)
Tabel 3: Perbandingan Metrik Performa Landing Page
|
Version
|
n
|
Mean
|
SD
|
|
Versi A (Kontrol)
|
25
|
4.8
|
1.2
|
|
Versi B (Varian)
|
25
|
5.4
|
1.4
|

- Kesimpulan strategis Setelah kita uji secara mendalam, ini hasilnya
untuk tim produk:
Status: tidak signifikan Nilai P-Value (0.1101) berada di atas
ambang batas 0.05. Secara statistik, kita gagal menolak Hipotesis Nol
(\(H_0\)).
Realita di balik angka secara kasat mata, Versi B memang punya
rata-rata 5.4 menit (lebih tinggi dari A yang 4.8). Tapi, karena
variansinya cukup lebar dan sampelnya cuma 25, perbedaan ini dianggap
sebagai kebetulan (random noise) saja. Data belum cukup kuat untuk
bilang Versi B lebih unggul.
. Study Case 4
- Hipotesis
Mencari Koneksi RahasiaKita ingin membuktikan apakah pilihan
perangkat (Device) ada hubungannya dengan cara mereka membayar, ataukah
semuanya cuma kebetulan saja.
\(H_0\) (Independen): Tidak ada
hubungan. Pengguna Mobile maupun Desktop punya selera pembayaran yang
sama saja.
\(H_1\) (Dependen): Ada hubungan
kuat. Tipe perangkat yang digunakan memengaruhi cara user
membayar.
- Metodologi: Chi-Square Test of Independence
Kita menggunakan uji Chi-Square karena:
Categorical Data: Variabel kita bukan angka murni (seperti
menit), melainkan kategori (Mobile/Desktop dan
E-Wallet/CC/COD).
Contingency Table: Kita membandingkan frekuensi kemunculan
(jumlah orang) dalam setiap kombinasi kategori.
- Logika Perhitungan (The Logic)
Kita membandingkan Nilai Observasi (O) — data yang benar-benar
terjadi di lapangan — dengan Nilai Harapan (E) — data yang seharusnya
muncul jika memang tidak ada hubungan apa-apa.
- Rumus Utama:\[\chi^2 = \sum \frac{(O -
E)^2}{E}\]
Jika selisih antara realita dan harapan terlalu jauh, maka kita bisa
simpulkan bahwa ada koneksi tersembunyi antara perangkat dan
pembayaran.
Tabel 4: Sebaran Metode Pembayaran Berdasarkan Perangkat
|
|
E-Wallet
|
Credit Card
|
COD
|
|
Mobile (App)
|
120
|
80
|
50
|
|
Desktop (Web)
|
60
|
90
|
40
|

- Kesimpulan dan Strategi Bisnis
Berdasarkan angka P-Value (0.005) yang jauh di bawah 0.05, kita
Menolak \(H_0\). Ini berarti hubungan
antara perangkat dan cara bayar itu Nyata, bukan kebetulan.
- Insight Strategis untuk Manajemen:
- Mobile = E-Wallet Paradise: Pengguna Mobile sangat dominan
menggunakan E-Wallet (hampir 50% dari total pengguna mobile).
- Action: Percepat proses checkout satu klik (1-click checkout) untuk
E-Wallet di aplikasi HP.
- Desktop = Credit Card Users: Pengguna Desktop jauh lebih nyaman
bertransaksi dengan Kartu Kredit dibandingkan Mobile.
- Action: Perkuat fitur keamanan seperti 3D Secure dan pastikan form
input kartu kredit sangat user-friendly di layar besar.
- Targeted Promotion:
- Jangan bakar duit buat promo CC di aplikasi mobile.
- Fokuskan cashback E-Wallet hanya untuk pengguna aplikasi mobile
untuk menekan biaya akuisisi (Customer Acquisition Cost).
. Study Case 5
Dalam dunia fintech, algoritma deteksi penipuan bertujuan untuk
membedakan transaksi normal dari transaksi yang mencurigakan. Namun,
setiap keputusan statistik membawa risiko kesalahan yang berdampak
langsung pada finansial dan reputasi perusahaan.
- Formulasi Hipotesis
Kita menguji apakah algoritma baru memberikan dampak nyata
dibandingkan sistem lama:
\(H_0\) (Hipotesis Nol):
Algoritma baru tidak efektif mengurangi penipuan (\(\mu_{lama} = \mu_{baru}\)).
\(H_1\) (Hipotesis Alternatif):
Algoritma baru efektif mengurangi penipuan (\(\mu_{baru} < \mu_{lama}\)).
- Identifikasi Risiko Keputusan (The Two Errors)
Dalam pengujian ini, kita menghadapi dua jenis kegagalan logika yang
krusial:
- Type I Error (\(\alpha\)):
Menyimpulkan algoritma efektif (Tolak \(H_0\)), padahal kenyataannya tidak ada
perubahan.
- Dampak Bisnis: Pemborosan anggaran investasi teknologi untuk sesuatu
yang tidak berguna.
2.Type II Error (\(\beta\)):
Menyimpulkan algoritma tidak efektif (Gagal Tolak \(H_0\)), padahal kenyataannya sangat ampuh.
- Dampak Bisnis: Perusahaan terus merugi karena transaksi penipuan tidak
terdeteksi, serta risiko kehilangan kepercayaan.
- Rumus dan Hubungan Power Analysis
Untuk memperkecil risiko kebobolan (Type II Error), kita harus
meningkatkan Statistical Power.
Rumus Dasar Power:\[Power = 1 -
\beta\]
Faktor yang Mempengaruhi:
Sample Size (\(n\)): Semakin
banyak data, semakin tajam deteksi kita.
Significance Level (\(\alpha\)):
Standar toleransi kesalahan (biasanya 0.05).
Effect Size (\(d\)): Seberapa
besar perbedaan yang ingin kita deteksi.
Tabel 5: Matriks Risiko Keputusan Bisnis
|
Skenario
|
Definisi
|
Dampak_Bisnis
|
|
Type I Error (Alpha)
|
Salah Tuduh (False Positive)
|
Kerugian Biaya Teknologi
|
|
Type II Error (Beta)
|
Kebobolan (False Negative)
|
Kerugian Finansial & Fraud
|
|
Statistical Power
|
Kemampuan Deteksi
|
Efisiensi Sistem Keamanan
|

- Kesimpulan strategis
Berdasarkan analisis risiko di atas, berikut adalah arahan untuk
manajemen:
Prioritaskan type II error: Dalam industri fintech, kerugian
akibat penipuan yang tidak terdeteksi jauh lebih berbahaya daripada
biaya implementasi sistem. Oleh karena itu, kita harus menekan risiko
\(\beta\) serendah mungkin.
Validasi sampel: Jangan mengambil keputusan berdasarkan data yang
sedikit. Grafik menunjukkan kita butuh minimal 65-70 data transaksi
untuk mencapai Power 80%.
Rekomendasi: Jika pengujian awal menunjukkan hasil yang tidak
signifikan, disarankan untuk menambah durasi eksperimen guna memperbesar
ukuran sampel sebelum memutuskan untuk menolak algoritma baru
tersebut.
. Study Case 6
Berdasarkan data yang diberikan: - Test Statistic: 2.31
- Memahami P-Value dalam Konteks Bisnis
Dalam analisis ini, kita mendapatkan nilai P-Value sebesar
0,021.Secara sederhana, P-Value adalah indikator kejutan. Jika kita
menganggap model kita sebenarnya tidak punya pengaruh apa-apa (Hipotesis
Nol/\(H_0\)), maka peluang kita
mendapatkan hasil sekuat ini hanya karena faktor keberuntungan adalah
2,1%. Karena angka ini sangat kecil (di bawah ambang batas 5%), kita
bisa menyimpulkan bahwa performa model ini memang nyata, bukan sekadar
kebetulan.
- Dasar pengambilan keputusan
Untuk mengambil keputusan, kita membandingkan nilai temuan dengan
standar industri (\(\alpha =
0,05\)).Rumus Perbandingan:\[P\text{-Value} < \alpha \implies \text{Tolak }
H_0\]Data Kita:\[0,021 < 0,05
\implies \text{SIGNIFIKAN}\]Keputusan: Kita resmi Menolak
Hipotesis Nol. Artinya, ada perbedaan signifikan yang dihasilkan oleh
model ini dalam mendeteksi churn.
- Waspada Terhadap Kualitas Data Meskipun hasil statistiknya bagus,
kita harus memastikan bahwa data yang digunakan sudah mewakili seluruh
pelanggan. Jika sampel yang kita ambil bias (tidak representatif),
muncul dua risiko besar:
Kesimpulan yang Salah: Model mungkin terlihat hebat di atas
kertas (data uji), namun gagal total saat diterapkan ke seluruh
pelanggan asli.
Pemborosan Anggaran: Perusahaan berisiko mengucurkan dana besar
untuk kampanye pencegahan churn yang sebenarnya salah sasaran.
- Signifikansi vs. Dampak Nyata Penting untuk diingat bahwa P-Value
hanya memberi tahu kita “Apakah model ini bekerja?”, tetapi tidak
menjawab “Seberapa besar dampaknya?”.
Sekalipun P-Value kita kecil, kita tetap perlu memantau metrik bisnis
seperti persentase penurunan angka churn yang sebenarnya untuk
memastikan keuntungan finansial yang nyata.

Grafik ini membagi dua dunia: Dunia Kebetulan (abu-abu) dan Dunia
Efektivitas (merah).
Zona Merah (The Danger Zone for \(H_0\)):Ini adalah area eksklusif yang hanya
bisa ditembus jika model kita benar-benar memiliki performa yang kuat.
Karena kita menggunakan standar \(\alpha =
0.05\), area ini adalah ambang batas pembuktian bahwa hasil kita
bukan karena keberuntungan semata.
Tiang Biru Neon (Posisi Model Kita):Garis biru yang menonjol ini
adalah representasi dari data nyata kita (\(Z
= 2.31\)). Secara visual, garis ini telah menyeberang jauh ke
dalam zona merah. Ini adalah bukti fisik bahwa model prediksi churn kita
sudah lulus ujian dan bekerja secara efektif.
Lengkungan Abu-abu (Distribusi Normal):Gunung ini menunjukkan
kemungkinan hasil jika model kita sebenarnya biasa-biasa saja. Karena
garis biru kita berada jauh di lereng paling ujung, maka peluang kita
salah dalam mengambil kesimpulan sangatlah tipis (hanya 2,1%).
. Referensi
1 . Walpole, R. E. (2016). Probability & Statistics for Engineers
& Scientists. Pearson.
2 . Everitt, B. S., & Skrondal, A. (2010). The Cambridge
Dictionary of Statistics. Cambridge University Press.
3 . Wickham, H. (2016). ggplot2: Elegant Graphics for Data Analysis.
Springer.
4 . Field, A., Miles, J., & Field, Z. (2012). Discovering
Statistics Using R. SAGE Publications.
5 . Nielsen, J. (1993). Usability Engineering. Academic Press.
6 . Schmuller, J. (2017). Statistical Analysis with R For Dummies.
John Wiley & Sons.
7 . Kohavi, R., Tang, D., & Xu, Y. (2020). Trustworthy Online
Controlled Experiments: A Practical Guide to A/B Testing. Cambridge
University Press.
8 . Gelman, A., & Hill, J. (2006). Data Analysis Using Regression
and Multilevel/Hierarchical Models. Cambridge University Press.
9 . Dalgaard, P. (2008). Introductory Statistics with R.
Springer.
Agresti, A. (2018). An Introduction to Categorical Data Analysis.
Wiley.
Siegel, S., & Castellan, N. J. (1988). Nonparametric
Statistics for the Behavioral Sciences. McGraw-Hill.
Cohen, J. (1988). Statistical Power Analysis for the Behavioral
Sciences. Lawrence Erlbaum Associates.
Fawcett, T. (2006). An Introduction to ROC Analysis. Pattern
Recognition Letters.
LS0tDQp0aXRsZTogIlN0dWR5IENhc2VzIg0Kc3VidGl0bGU6ICJBc3NpZ25tZW50IFdlZWsgMTQiDQphdXRob3I6ICJDaHJpY3llc2lhIFdpbm5lcmxhZHkgRnJleGlzb3ZhcmEgVXZhcyINCmRhdGU6ICIyMDI1LTEyLTI0Ig0Kb3V0cHV0Og0KICBybWRmb3JtYXRzOjpyZWFkdGhlZG93bjoNCiAgICBzZWxmX2NvbnRhaW5lZDogdHJ1ZQ0KICAgIHRodW1ibmFpbHM6IHRydWUNCiAgICBsaWdodGJveDogdHJ1ZQ0KICAgIGdhbGxlcnk6IHRydWUNCiAgICBudW1iZXJfc2VjdGlvbnM6IHRydWUNCiAgICBsaWJfZGlyOiBsaWJzDQogICAgZGZfcHJpbnQ6ICJwYWdlZCINCiAgICBjb2RlX2ZvbGRpbmc6ICJzaG93Ig0KICAgIGNvZGVfZG93bmxvYWQ6IHllcw0KICAgIGNzczogInN0eWxlLmNzcyIgICAgIA0KLS0tDQoNCmBgYHtyLGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIG91dC5leHRyYT0nc3R5bGU9ImRpc3BsYXk6YmxvY2s7IG1hcmdpbi1sZWZ0OmF1dG87IG1hcmdpbi1yaWdodDphdXRvOyInfQ0KDQpsaWJyYXJ5KG1hZ2ljaykNCmdhbWJhciA8LSBpbWFnZV9yZWFkKCJ+L1R1Z2FzIGVzdGF0aXN0aWthIHdpbmVyL3R1Z2FzIHdlZWsgMTEgfiBwcm9iYWJpbGl0eSBkaXN0cmlidWl0aW9uL2ZvdG9fMV9qcGcuanBnIikNCmdhbWJhcg0KYGBgDQoNCiMgLiBQZW5kYWh1bHVhbg0KRGFsYW0gZHVuaWEgaW5kdXN0cmkgeWFuZyBiZXJnZXJhayBjZXBhdCwgc2V0aWFwIGRhdGEgeWFuZyBtYXN1ayBtZW1iYXdhIGNlcml0YSB0ZW50YW5nIGJhZ2FpbWFuYSBwZW5nZ3VuYSBiZXJpbnRlcmFrc2kgZGVuZ2FuIHByb2R1ayBraXRhLiBOYW11biwgdGFudGFuZ2FuIHRlcmJlc2FybnlhIGFkYWxhaCBtZW1iZWRha2FuIG1hbmEgcGVydWJhaGFuIHlhbmcgbWVtYW5nIG55YXRhIGRhbiBtYW5hIHlhbmcgaGFueWEgc2VrYWRhciBmbHVrdHVhc2kgYWNhay4gTGFwb3JhbiBpbmkgZGlzdXN1biBzZWJhZ2FpIHVwYXlhIHVudHVrIG1lbWJlZGFoIGJlcmJhZ2FpIGRhdGEgbGFwYW5nYW4gbWVsYWx1aSBrYWNhbWF0YSBzdGF0aXN0aWsgeWFuZyBvYmpla3RpZiwgZ3VuYSBtZW1hc3Rpa2FuIHNldGlhcCBrZXB1dHVzYW4gYmlzbmlzIGRpYW1iaWwgYmVyZGFzYXJrYW4gYnVrdGksIGJ1a2FuIHNla2FkYXIgaW50dWlzaS4NCg0KTGFwb3JhbiBpbmkgbWVyYW5na3VtIGVuYW0gc3R1ZGkga2FzdXMga3J1c2lhbCB5YW5nIG1ld2FraWxpIGRpbmFtaWthIG9wZXJhc2lvbmFsIHBlcnVzYWhhYW4uIEtpdGEgYWthbiBtZWxpaGF0IGJhZ2FpbWFuYSBhbmdrYS1hbmdrYSB0ZWtuaXMgZGl0ZXJqZW1haGthbiBtZW5qYWRpIHdhd2FzYW4gc3RyYXRlZ2lzOg0KDQotIEF1ZGl0IFJlYWxpdGE6IE1lbmd1amkgYXBha2FoIGR1cmFzaSBiZWxhamFyIHBlbmdndW5hIG1hc2loIHNlc3VhaSBkZW5nYW4ga2xhaW0geWFuZyBraXRhIGJlcmlrYW4ga2VwYWRhIHB1YmxpayBhdGF1IHN1ZGFoIG1lbmdhbGFtaSBwZW51cnVuYW4geWFuZyBwZXJsdSBkaXdhc3BhZGFpLg0KDQotIFZhbGlkYXNpIFVYOiBNZW1hc3Rpa2FuIGFwYWthaCBwZXJ1YmFoYW4gZGVzYWluIGFwbGlrYXNpIGJlbmFyLWJlbmFyIG1lbWJhbnR1IHBlbmdndW5hIGJla2VyamEgbGViaWggY2VwYXQgYXRhdSBqdXN0cnUgdGlkYWsgbWVtYmVyaWthbiBkYW1wYWsgYXBhIHB1bi4NCg0KLSBFZmVrdGl2aXRhcyBTdHJhdGVnaTogTWVtYmFuZGluZ2thbiBkdWEgdmVyc2kgdGFtcGlsYW4gd2ViIG1lbGFsdWkgQS9CIFRlc3RpbmcgdW50dWsgbWVuZW50dWthbiBhcmFoIHBlbmdlbWJhbmdhbiBwcm9kdWsga2UgZGVwYW4uDQoNCi0gUG9sYSBQZXJpbGFrdTogTWVtYm9uZ2thciBodWJ1bmdhbiBhbnRhcmEgcGVyYW5na2F0IHlhbmcgZGlndW5ha2FuIHBlbGFuZ2dhbiBkZW5nYW4gbWV0b2RlIHBlbWJheWFyYW4geWFuZyBtZXJla2EgcGlsaWggdW50dWsgcGVyc29uYWxpc2FzaSBwcm9tby4NCg0KLSBLZWFtYW5hbiAmIFJpc2lrbzogTWVuZ2hpdHVuZyByaXNpa28ga2VnYWdhbGFuIGFsZ29yaXRtYSBkZXRla3NpIHBlbmlwdWFuIGFnYXIgcGVydXNhaGFhbiB0aWRhayBtZW5nYWxhbWkga2VydWdpYW4gZmluYW5zaWFsIG1hdXB1biBrZWhpbGFuZ2FuIGtlcGVyY2F5YWFuIHBlbGFuZ2dhbi4NCg0KU2V0aWFwIGthc3VzIGRhbGFtIGxhcG9yYW4gaW5pIGRpdWppIG1lbmdndW5ha2FuIHN0YW5kYXIgcGVuZ3VqaWFuIGhpcG90ZXNpcywgbXVsYWkgZGFyaSBaLXRlc3QsIFQtdGVzdCwgaGluZ2dhIENoaS1TcXVhcmUuIEtpdGEgdGlkYWsgaGFueWEgbWVsaWhhdCBhbmdrYSBha2hpciwgdGV0YXBpIGp1Z2EgbWVtcGVydGltYmFuZ2thbiBhc3BlayBrdWFsaXRhcyBkYXRhLCB1a3VyYW4gc2FtcGVsLCBkYW4gYmVzYXJueWEgZGFtcGFrIG55YXRhIChlZmZlY3Qgc2l6ZSkuDQoNClVudHVrIG1lbXBlcm11ZGFoIHBlbWFoYW1hbiwgc2V0aWFwIGJhYiBkaWxlbmdrYXBpIGRlbmdhbiB2aXN1YWxpc2FzaSBkaXN0cmlidXNpIG5vcm1hbCB5YW5nIGludGVyYWt0aWYuIEdyYWZpayBpbmkgYmVyZnVuZ3NpIHNlYmFnYWkgInBldGEgbmF2aWdhc2kiIHlhbmcgbWVudW5qdWtrYW4gc2VjYXJhIGplbGFzIHBvc2lzaSBkYXRhIGtpdGE6IGFwYWthaCBtYXNpaCBiZXJhZGEgZGFsYW0gYmF0YXMgd2FqYXIgYXRhdSBzdWRhaCBtYXN1ayBrZSB6b25hIHNpZ25pZmlrYW4geWFuZyBtZW1lcmx1a2FuIHRpbmRha2FuIHNlZ2VyYSBkYXJpIG1hbmFqZW1lbi4NCg0KVHVqdWFuIHV0YW1hIGRhcmkgbGFwb3JhbiBpbmkgYnVrYW4gc2VrYWRhciBtZW55YWppa2FuIHJ1bXVzLCBtZWxhaW5rYW4gbWVtYmVyaWthbiBrZXBhc3RpYW4uIERlbmdhbiBtZW1haGFtaSBrYXBhbiBzZWJ1YWggZGF0YSBkaWFuZ2dhcCBzaWduaWZpa2FuLCBraXRhIGRhcGF0IG1lbmdoaW5kYXJpIGtlc2FsYWhhbiBpbnZlc3Rhc2kgcGFkYSBzdHJhdGVnaSB5YW5nIHNhbGFoIGRhbiBsZWJpaCBmb2t1cyBwYWRhIHBlbmdlbWJhbmdhbiB5YW5nIG1lbWJlcmlrYW4gaGFzaWwgbnlhdGEgYmFnaSBwZXJ0dW1idWhhbiBwZXJ1c2FoYWFuLg0KDQoNCiMgLiBTdHVkeSBDYXNlIDENCjEuIEV4ZWN1dGl2ZSBTdW1tYXJ5DQoNCkxhcG9yYW4gaW5pIGRpc3VzdW4gdW50dWsgbWVtdmVyaWZpa2FzaSBhcGFrYWgga2xhaW0gcGVyZm9ybWEgcmF0YS1yYXRhIHdha3R1IGJlbGFqYXIgcGVuZ2d1bmEgc2ViZXNhciAxMjAgbWVuaXQvaGFyaSBtYXNpaCByZWxldmFuIGRlbmdhbiBrb25kaXNpIGxhcGFuZ2FuIHNhYXQgaW5pLiBCZXJkYXNhcmthbiBhdWRpdCBkYXRhIHRlcmJhcnUgdGVyaGFkYXAgNjQgc2FtcGVsIHBlbmdndW5hLCBkaXRlbXVrYW4gYW5na2EgcmF0YS1yYXRhIHNlYmVzYXIgMTE2IG1lbml0Lg0KDQpUdWp1YW4gYW5hbGlzaXMgaW5pIGFkYWxhaCBtZW5lbnR1a2FuIGFwYWthaCBwZW51cnVuYW4gNCBtZW5pdCB0ZXJzZWJ1dCBtZXJ1cGFrYW4gZmx1a3R1YXNpIGhhcmlhbiB5YW5nIHdhamFyIChyYW5kb20gbm9pc2UpIGF0YXUgbWVydXBha2FuIHNpbnlhbCBwZW51cnVuYW4ga2V0ZXJsaWJhdGFuIHBlbmdndW5hIChlbmdhZ2VtZW50KSB5YW5nIHNpZ25pZmlrYW4gc2VjYXJhIHN0YXRpc3Rpay4NCg0KMi4gS2VyYW5na2EgUGVuZ3VqaWFuIChIeXBvdGhlc2lzIERlc2lnbikNCg0KVW50dWsgbWVuZ2hpbmRhcmkgYmlhcyBzdWJqZWt0aWYsIGtpdGEgbWVuZ2d1bmFrYW4gbWV0b2RlIFR3by1UYWlsZWQgWi1UZXN0IGRlbmdhbiBzdHJ1a3R1ciBsb2dpa2Egc2ViYWdhaSBiZXJpa3V0Og0KLSAkSF8wJCAoTnVsbCBIeXBvdGhlc2lzKTogUmF0YS1yYXRhIHdha3R1IGJlbGFqYXIgdGV0YXAgMTIwIG1lbml0LiBQZXJiZWRhYW4geWFuZyBkaXRlbXVrYW4gaGFueWFsYWggdmFyaWFzaSBhY2FrIHlhbmcgdGlkYWsgYmVyYXJ0aS4NCi0gJEhfMSQgKEFsdGVybmF0aXZlIEh5cG90aGVzaXMpOiBSYXRhLXJhdGEgd2FrdHUgYmVsYWphciBzdWRhaCBiZXJ1YmFoICh0aWRhayBzYW1hIGRlbmdhbiAxMjAgbWVuaXQpLiBQZXJiZWRhYW4gNCBtZW5pdCBhZGFsYWggbnlhdGEgZGFuIHJlcHJlc2VudGF0aWYgdGVyaGFkYXAgcG9wdWxhc2kuDQoNCjMuIE1ldG9kb2xvZ2kgZGFuIEtvbXB1dGFzaQ0KDQpLaXRhIG1lbmdndW5ha2FuIHBhcmFtZXRlciB0ZWtuaXMgc2ViYWdhaSBiZXJpa3V0Og0KDQotIFBvcHVsYXNpIFN0YW5kYXIgRGV2aWFzaSAoJFxzaWdtYSQpOiAxNSANCg0KLSBKdW1sYWggU2FtcGVsICgkbiQpOiA2NCANCg0KLSBMZXZlbCBTaWduaWZpa2Fuc2kgKCRcYWxwaGEkKTogMC4wNSAoVG9sZXJhbnNpIGVycm9yIDUlKQ0KDQotIFJ1bXVzIFBlcmhpdHVuZ2FuOiQkWiA9IFxmcmFje1xiYXJ7eH0gLSBcbXVfMH17XHNpZ21hIC8gXHNxcnR7bn19JCQNCg0KTGFuZ2thaCBBbmFsaXNpczoNCg0KLSBTdGFuZGFyZCBFcnJvcjogbWVuZ3VrdXIgc2ViZXJhcGEgYmVzYXIgcGVueWltcGFuZ2FuIHJhdGEtcmF0YSBzYW1wZWwgZGFyaSByYXRhLXJhdGEgcG9wdWxhc2kuIE5pbGFpbnlhIGFkYWxhaCAkMTUgLyBcc3FydHs2NH0gPSAxLjg3NSQuDQoNCi0gWi1TY29yZTogbWVuZ2hpdHVuZyBzZWphdWggbWFuYSBqYXJhayBmYWt0YSAoMTE2KSBkYXJpIHRhcmdldCAoMTIwKS4gDQpIYXNpbG55YSBhZGFsYWggLTIuMTMuIEFydGlueWEsIGRhdGEga2l0YSBiZXJhZGEgMi4xMyBzdGFuZGFyIGRldmlhc2kgZGkgYmF3YWggdGFyZ2V0Lg0KDQpgYGB7cixlY2hvPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCBvdXQuZXh0cmE9J3N0eWxlPSJkaXNwbGF5OmJsb2NrOyBtYXJnaW4tbGVmdDphdXRvOyBtYXJnaW4tcmlnaHQ6YXV0bzsiJ30NCg0KIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiMgU0NSSVBUIEFOQUxJU0lTIA0KIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkoa25pdHIpDQpsaWJyYXJ5KGthYmxlRXh0cmEpDQoNCiMgMS4gUGFyYW1ldGVyIERhdGENCm11MCAgICA8LSAxMjAgICAgIA0KeGJhciAgIDwtIDExNiAgICAgDQpzaWdtYSAgPC0gMTUgICAgICANCm4gICAgICA8LSA2NCAgICAgIA0Kc2UgICAgIDwtIHNpZ21hIC8gc3FydChuKSANCnpfc3RhdCA8LSAoeGJhciAtIG11MCkgLyBzZQ0KcF92YWwgIDwtIDIgKiBwbm9ybShhYnMoel9zdGF0KSwgbG93ZXIudGFpbCA9IEZBTFNFKQ0KDQojIDIuIFRhYmVsIExhcG9yYW4gDQpzdW1tYXJ5X2RmIDwtIGRhdGEuZnJhbWUoDQogIEluZGlrYXRvciA9IGMoIlRhcmdldCBQZXJ1c2FoYWFuICjCtSkiLCAiUmF0YS1yYXRhIExhcGFuZ2FuICh4zIQpIiwgIlNlbGlzaWggKEdhcCkiLCAiWi1TY29yZSIsICJQLVZhbHVlIiksDQogIE5pbGFpID0gYygiMTIwLjAgTWluIiwgIjExNi4wIE1pbiIsICItNC4wIE1pbiIsIHJvdW5kKHpfc3RhdCwgMyksIHJvdW5kKHBfdmFsLCA0KSksDQogIEludGVycHJldGFzaSA9IGMoIkJlbmNobWFyayIsICJPYnNlcnZhc2kgU2FtcGVsIiwgIlBlbnVydW5hbiBUZXJkZXRla3NpIiwgIlBlbnlpbXBhbmdhbiIsICJTaWduaWZpa2Fuc2kgU3RhdGlzdGlrIikNCikNCg0Ka2FibGUoc3VtbWFyeV9kZiwgZm9ybWF0ID0gImh0bWwiLCBjYXB0aW9uID0gIlRhYmVsIDE6IFN1bW1hcnkgU3RhdGlzdGlrIFZhbGlkYXNpIERhdGEiKSAlPiUNCiAga2FibGVfc3R5bGluZyhib290c3RyYXBfb3B0aW9ucyA9IGMoInN0cmlwZWQiLCAiaG92ZXIiKSwgZnVsbF93aWR0aCA9IFQsIGZvbnRfc2l6ZSA9IDE2KSAlPiUNCiAgcm93X3NwZWMoMCwgYmFja2dyb3VuZCA9ICIjMmMzZTUwIiwgY29sb3IgPSAid2hpdGUiKSAlPiUNCiAgcm93X3NwZWMoMiwgYm9sZCA9IFQsIGNvbG9yID0gIndoaXRlIiwgYmFja2dyb3VuZCA9ICIjYzAzOTJiIikgIyBGYWt0YSBMYXBhbmdhbg0KDQojIDMuIFZpc3VhbGlzYXNpIERpc3RyaWJ1c2kgDQp4X3ZhbHMgPC0gc2VxKDExNCwgMTI2LCBsZW5ndGgub3V0ID0gMTAwMCkNCnlfdmFscyA8LSBkbm9ybSh4X3ZhbHMsIG1lYW4gPSAxMjAsIHNkID0gc2UpDQpkZl9wbG90IDwtIGRhdGEuZnJhbWUoeF92YWxzLCB5X3ZhbHMpDQoNCiMgQXJlYSBrcml0aXMgdW50dWsgdmlzdWFsaXNhc2kgDQpjcml0aWNhbF92YWwgPC0gMTIwIC0gKDEuOTYgKiBzZSkNCg0KZ2dwbG90KGRmX3Bsb3QsIGFlcyh4ID0geF92YWxzLCB5ID0geV92YWxzKSkgKw0KICAjIEFyZWEgRGlzdHJpYnVzaSBOb3JtYWwNCiAgZ2VvbV9hcmVhKGZpbGwgPSAiIzM0OThkYiIsIGFscGhhID0gMC4xKSArDQogIGdlb21fbGluZShjb2xvciA9ICIjMmMzZTUwIiwgc2l6ZSA9IDEuNSkgKw0KICANCiAgIyBIaWdobGlnaHQgQXJlYSBQZW5vbGFrYW4gKEtpcmkpDQogIGdlb21fYXJlYShkYXRhID0gc3Vic2V0KGRmX3Bsb3QsIHhfdmFscyA8PSBjcml0aWNhbF92YWwpLCBmaWxsID0gIiNlNzRjM2MiLCBhbHBoYSA9IDAuNCkgKw0KICANCiAgIyBHYXJpcyBJbmRpa2F0b3INCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMTIwLCBjb2xvciA9ICIjMjdhZTYwIiwgbGluZXR5cGUgPSAiZGFzaGVkIiwgc2l6ZSA9IDEuMikgKw0KICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAxMTYsIGNvbG9yID0gIiNjMDM5MmIiLCBzaXplID0gMikgKw0KICANCiAgIyBMYWJlbCBEaW5hbWlzIA0KICBhbm5vdGF0ZSgibGFiZWwiLCB4ID0gMTIwLCB5ID0gMC4xOCwgbGFiZWwgPSAiS0xBSU06IDEyMCBNSU4iLCANCiAgICAgICAgICAgZmlsbCA9ICIjMjdhZTYwIiwgY29sb3IgPSAid2hpdGUiLCBmb250ZmFjZSA9ICJib2xkIiwgc2l6ZSA9IDUpICsNCiAgYW5ub3RhdGUoImxhYmVsIiwgeCA9IDExNiwgeSA9IDAuMDUsIGxhYmVsID0gIlJFQUxJVEE6IDExNiBNSU4iLCANCiAgICAgICAgICAgZmlsbCA9ICIjYzAzOTJiIiwgY29sb3IgPSAid2hpdGUiLCBmb250ZmFjZSA9ICJib2xkIiwgc2l6ZSA9IDUpICsNCiAgDQogICMgSnVkdWwgZGFuIFRlbWENCiAgbGFicyh0aXRsZSA9ICJBTkFMSVNJUyBBTk9NQUxJOiBEVVJBU0kgQkVMQUpBUiBIQVJJQU4iLA0KICAgICAgIHN1YnRpdGxlID0gcGFzdGUoIlN0YXR1czogU2lnbmlmaWthbiAoUC1WYWx1ZToiLCByb3VuZChwX3ZhbCwgNCksICIpIC0gTWVub2xhayBIaXBvdGVzaXMgTm9sIiksDQogICAgICAgeCA9ICJEdXJhc2kgQmVsYWphciAoTWVuaXQpIiwgeSA9ICJEZW5zaXR5IFByb2JhYmlsaXRhcyIpICsNCiAgdGhlbWVfbWluaW1hbChiYXNlX3NpemUgPSAxNikgKw0KICB0aGVtZSgNCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGZhY2UgPSAiYm9sZCIsIHNpemUgPSAyMiwgY29sb3IgPSAiIzJjM2U1MCIpLA0KICAgIHBsb3Quc3VidGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0LCBjb2xvciA9ICIjN2Y4YzhkIiksDQogICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChmYWNlID0gImJvbGQiKSwNCiAgICBwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9saW5lKGNvbG9yID0gIiNlY2YwZjEiKQ0KICApDQpgYGANCg0KNS4gS2VzaW1wdWxhbiBTdHJhdGVnaXMgDQpCZXJkYXNhcmthbiBoYXNpbCBwZW5ndWppYW46DQoNCi0gU2lnbmlmaWthbnNpOiBOaWxhaSBQLVZhbHVlICgwLjAzMykgYmVyYWRhIGRpIGJhd2FoIGFtYmFuZyBiYXRhcyAwLjA1LiBJbmkgYmVyYXJ0aSBwZW51cnVuYW4gNCBtZW5pdCB0ZXJzZWJ1dCBidWthbiBrZWJldHVsYW4uDQoNCi0gRGFtcGFrIEJpc25pczogS2xhaW0gcGVtYXNhcmFuIGtpdGEgbWVuZ2VuYWkgQmVsYWphciAxMjAgbWVuaXQvaGFyaSBzZWthcmFuZyBzZWNhcmEgaWxtaWFoIGRpYW5nZ2FwIHRpZGFrIGFrdXJhdC4gSmlrYSB0ZXJ1cyBkaWd1bmFrYW4sIGtpdGEgYmVyaXNpa28gbWVtYmVyaWthbiBpbmZvcm1hc2kgeWFuZyBtZW55ZXNhdGthbiBrZXBhZGEgaW52ZXN0b3IgYXRhdSBwZW5nZ3VuYS4NCg0KLSBSZWtvbWVuZGFzaTogU2VnZXJhIGxha3VrYW4gZXZhbHVhc2kgcGFkYSBtb2R1bCBwZW1iZWxhamFyYW4geWFuZyBiYXJ1IHNhamEgZGlyaWxpcy4gQWRhIGtlbXVuZ2tpbmFuIGVuZ2FnZW1lbnQgbWVudXJ1biBrYXJlbmEga29udGVuIGF0YXUga2VuZGFsYSB0ZWtuaXMgcGFkYSBhcGxpa2FzaS4NCg0KIyAuIFN0dWR5IENhc2UgMg0KMS4gU3RyYXRlZ2kgUGVuZ3VqaWFuIA0KS2l0YSB0aWRhayBpbmdpbiBzZWthZGFyIG1lbmViYWsuIEtpdGEgbWVuZ2d1bmFrYW4gVHdvLVRhaWxlZCBULVRlc3Qga2FyZW5hIGZva3VzIGtpdGEgYWRhbGFoIG1lbmNhcmkgdGFodSBhcGFrYWggYWRhIHBlcmJlZGFhbiAoZW50YWggaXR1IGxlYmloIGNlcGF0IGF0YXUgbGViaWggbGFtYmF0KS4NCi0gJEhfMCQgKFRoZSBTdGF0dXMgUXVvKTogJFxtdSA9IDEwJC4gUmF0YS1yYXRhIHdha3R1IHBlbnllbGVzYWlhbiB0dWdhcyBtYXNpaCB0ZXBhdCBkaSBhbmdrYSAxMCBtZW5pdC4NCi0gJEhfMSQgKFRoZSBEZXZpYXRpb24pOiAkXG11IFxuZXEgMTAkLiBXYWt0dSBwZW55ZWxlc2FpYW4gdHVnYXMgc3VkYWggYmVydWJhaCBzZWNhcmEgc2lnbmlmaWthbiBkYXJpIDEwIG1lbml0Lg0KDQoNCjIuIERhbGFtIGthc3VzIGluaSwga2l0YSBtZW5nZ3VuYWthbiBPbmUtU2FtcGxlIFQtVGVzdCBrYXJlbmE6DQotIEJsaW5kIG9uIFBvcHVsYXRpb246IEtpdGEgdGlkYWsgdGFodSBzdGFuZGFyIGRldmlhc2kgcG9wdWxhc2kgKCRcc2lnbWEkKS4NCi0gU21hbGwgRGF0YTogU2FtcGVsIGtpdGEga2VjaWwgKCRuID0gMTAkKS4NCi0gUmVhbC13b3JsZCBEYXRhOiBLaXRhIG1lbmdhbmRhbGthbiBzdGFuZGFyIGRldmlhc2kgZGFyaSBzYW1wZWwgKCRzJCkgdW50dWsgbWVsYWt1a2FuIGVzdGltYXNpLg0KDQozLiBLb21wdXRhc2kgZGFuIFJ1bXVzIFN0YXRpc3RpayANCkRhdGEgeWFuZyBraXRhIG1pbGlraTogOS4yLCAxMC41LCA5LjgsIDEwLjEsIDkuNiwgMTAuMywgOS45LCA5LjcsIDEwLjAsIDkuNQ0KLSBGb3JtdWxhIFV0YW1hOiQkdCA9IFxmcmFje1xiYXJ7eH0gLSBcbXVfMH17cyAvIFxzcXJ0e259fSQkDQoNCkxhbmdrYWggUGVyaGl0dW5nYW46DQoNCi0gUmF0YS1yYXRhIFNhbXBlbCAoJFxiYXJ7eH0kKTogOS44NiBtZW5pdC4NCg0KLSBTdGFuZGFyIERldmlhc2kgU2FtcGVsICgkcyQpOiAkXGFwcHJveCAwLjQwMyQuDQoNCi0gVC1TY29yZTogbWVuZ3VrdXIgc2ViZXJhcGEgamF1aCBkZXZpYXNpIHJhdGEtcmF0YSBraXRhIHRlcmhhZGFwIHN0YW5kYXIgZXJyb3IgeWFuZyBhZGEuDQoNCg0KDQpgYGB7cixlY2hvPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCBvdXQuZXh0cmE9J3N0eWxlPSJkaXNwbGF5OmJsb2NrOyBtYXJnaW4tbGVmdDphdXRvOyBtYXJnaW4tcmlnaHQ6YXV0bzsiJ30NCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQojIENBU0UgMjogVVggUkVTRUFSQ0ggQU5BTFlUSUNTDQojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShrbml0cikNCmxpYnJhcnkoa2FibGVFeHRyYSkNCg0KIyAxLiBJbnB1dCBEYXRhDQp3YWt0dSA8LSBjKDkuMiwgMTAuNSwgOS44LCAxMC4xLCA5LjYsIDEwLjMsIDkuOSwgOS43LCAxMC4wLCA5LjUpDQptdTAgICA8LSAxMA0KDQojIDIuIFN0YXRpc3RpayBEZXNrcmlwdGlmICYgVGFiZWwNCnJlcyA8LSB0LnRlc3Qod2FrdHUsIG11ID0gbXUwKQ0Kc3VtbWFyeV9kZiA8LSBkYXRhLmZyYW1lKA0KICBJbmRpa2F0b3IgPSBjKCJUYXJnZXQgVVggKMK1KSIsICJSYXRhLXJhdGEgVXNlciAoeMyEKSIsICJTdGFuZGFyIERldmlhc2kgKHMpIiwgIlQtU3RhdGlzdGljIiwgIlAtVmFsdWUiKSwNCiAgTmlsYWkgPSBjKCIxMC4wMCBNaW4iLCAiOS44NiBNaW4iLCByb3VuZChzZCh3YWt0dSksIDMpLCByb3VuZChyZXMkc3RhdGlzdGljLCAzKSwgcm91bmQocmVzJHAudmFsdWUsIDQpKSwNCiAgS2V0ZXJhbmdhbiA9IGMoIkJlbmNobWFyayIsICJSZWFsaXRhIiwgIlZhcmlhbnNpIiwgIlNrb3IgVWppIiwgIlNpZ25pZmlrYW5zaSIpDQopDQoNCmthYmxlKHN1bW1hcnlfZGYsIGZvcm1hdCA9ICJodG1sIiwgY2FwdGlvbiA9ICJUYWJlbCAyOiBIYXNpbCBVamkgRWZpc2llbnNpIFRhc2sgQmFydSIpICU+JQ0KICBrYWJsZV9zdHlsaW5nKGJvb3RzdHJhcF9vcHRpb25zID0gYygic3RyaXBlZCIsICJob3ZlciIpLCBmdWxsX3dpZHRoID0gVCwgZm9udF9zaXplID0gMTYpICU+JQ0KICByb3dfc3BlYygwLCBiYWNrZ3JvdW5kID0gIiM4ZTQ0YWQiLCBjb2xvciA9ICJ3aGl0ZSIpICU+JQ0KICByb3dfc3BlYygyLCBib2xkID0gVCwgYmFja2dyb3VuZCA9ICIjZjNlNWY1IikNCg0KIyAzLiBJbXBhY3QgVmlzdWFsaXphdGlvbiAoQm94cGxvdCArIEppdHRlcikNCmdncGxvdChkYXRhLmZyYW1lKHdha3R1KSwgYWVzKHggPSAiIiwgeSA9IHdha3R1KSkgKw0KICAjIEJveHBsb3QgRWxlZ2FuDQogIGdlb21fYm94cGxvdChmaWxsID0gIiM5YjU5YjYiLCBhbHBoYSA9IDAuNCwgY29sb3IgPSAiIzhlNDRhZCIsIHdpZHRoID0gMC41KSArDQogICMgTWVuYW1iYWhrYW4gZGF0YSBwb2ludCBhc2xpIGFnYXIgdGVybGloYXQgc2ViYXJhbm55YQ0KICBnZW9tX2ppdHRlcihjb2xvciA9ICIjNGIwMDgyIiwgd2lkdGggPSAwLjEsIHNpemUgPSAzLCBhbHBoYSA9IDAuNikgKw0KICAjIEdhcmlzIFRhcmdldA0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAxMCwgbGluZXR5cGUgPSAiZGFzaGVkIiwgY29sb3IgPSAiI2U3NGMzYyIsIHNpemUgPSAxLjIpICsNCiAgIyBMYWJlbCAmIFN0eWxpbmcNCiAgYW5ub3RhdGUoImxhYmVsIiwgeCA9IDEuMzUsIHkgPSAxMCwgbGFiZWwgPSAiVGFyZ2V0OiAxMCBNaW4iLCBmaWxsID0gIiNlNzRjM2MiLCBjb2xvciA9ICJ3aGl0ZSIsIGZvbnRmYWNlID0gImJvbGQiKSArDQogIGxhYnModGl0bGUgPSAiRGlzdHJpYnVzaSBXYWt0dSBQZW55ZWxlc2FpYW4gVHVnYXMgKFVYIFRlc3RpbmcpIiwNCiAgICAgICBzdWJ0aXRsZSA9IHBhc3RlKCJQLVZhbHVlOiIsIHJvdW5kKHJlcyRwLnZhbHVlLCA0KSwgInwgVGlkYWsgYWRhIHBlcmJlZGFhbiBzaWduaWZpa2FuIGRhcmkgdGFyZ2V0IiksDQogICAgICAgeSA9ICJNZW5pdCIsIHggPSAiIikgKw0KICB0aGVtZV9taW5pbWFsKGJhc2Vfc2l6ZSA9IDE2KSArDQogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoZmFjZSA9ICJib2xkIiwgc2l6ZSA9IDIwLCBjb2xvciA9ICIjNGIwMDgyIikpDQpgYGANCg0KDQo1LiBLZXNpbXB1bGFuIFN0cmF0ZWdpcw0KLSBTZXRlbGFoIGtpdGEgYmVkYWggZGF0YW55YSwgYmVyaWt1dCBhZGFsYWggaW5zaWdodCB1bnR1ayB0aW0gVVg6IA0KSEFTSUw6IFRpZGFrIHNpZ25pZmlrYW4gbmlsYWkgUC1WYWx1ZSAoMC4yODgpIGphdWggbGViaWggYmVzYXIgZGFyaSAwLjA1LiBJbmkgYXJ0aW55YSBraXRhIGdhZ2FsIG1lbm9sYWsgaGlwb3Rlc2lzIG5vbCAoJEhfMCQpLg0KDQotIE1ha25hIGJpc25pcyBtZXNraXB1biByYXRhLXJhdGEgc2FtcGVsIGtpdGEgOS44NiBtZW5pdCAodGVybGloYXQgbGViaWggY2VwYXQpLCBzZWNhcmEgc3RhdGlzdGlrIHBlcmJlZGFhbiBpdHUgdGlkYWsgYmVyYXJ0aS4gRmx1a3R1YXNpIHRlcnNlYnV0IG1hc2loIGRpYW5nZ2FwIHdhamFyIGRhbGFtIGJhdGFzIGVycm9yLiBUaW0gVVggYmlzYSBtZW55aW1wdWxrYW4gYmFod2EgYXBsaWthc2kgYmFydSBpbmkgcGVyZm9ybWEgd2FrdHVueWEgbWFzaWggc2FtYSBkZW5nYW4gZWtzcGVrdGFzaSAxMCBtZW5pdC4NCg0KLSBSZWtvbWVuZGFzaTpKYW5nYW4gdGVyYnVydS1idXJ1IG1lbmdrbGFpbSBhcGxpa2FzaSBsZWJpaCBjZXBhdC4gSmlrYSBpbmdpbiBiZW5hci1iZW5hciBtZWxpaGF0IHBlcmJlZGFhbiwgdGltIFVYIHBlcmx1IG1lbmFtYmFoIGp1bWxhaCBwYXJ0aXNpcGFuIHRlcyAoaW5jcmVhc2Ugc2FtcGxlIHNpemUpIGF0YXUgbWVsYWt1a2FuIG9wdGltYXNpIGxlYmloIGxhbmp1dCBwYWRhIGFsdXIgbmF2aWdhc2kuDQoNCiMgLiBTdHVkeSBDYXNlIDMNCjEuIEhpcG90ZXNpczogTWVuY2FyaSBwZXJiZWRhYW4gbnlhdGENCg0KS2l0YSBtZW5nZ3VuYWthbiB1amkgZHVhIGFyYWggKHR3by10YWlsZWQpIHVudHVrIG1lbWFzdGlrYW4gYXBha2FoIGFkYSBwZXJiZWRhYW4gZHVyYXNpIHlhbmcgc2lnbmlmaWthbiBkaSBhbnRhcmEga2VkdWEgdmVyc2kgdGVyc2VidXQuDQoNCi0gJEhfMCQgKFN0YXR1cyBRdW8pOiBUaWRhayBhZGEgcGVyYmVkYWFuIHJhdGEtcmF0YSBkdXJhc2kgYW50YXJhIFZlcnNpIEEgZGFuIFZlcnNpIEIuIA0KDQotICgkXG11X0EgPSBcbXVfQiQpLiRIXzEkIChEaWZmZXJlbmNlKTogQWRhIHBlcmJlZGFhbiByYXRhLXJhdGEgZHVyYXNpIHlhbmcgbnlhdGEgYW50YXJhIFZlcnNpIEEgZGFuIFZlcnNpIEIgKCRcbXVfQSBcbmVxIFxtdV9CJCkuDQoNCjIuIE1ldG9kb2xvZ2k6IEluZGVwZW5kZW50IFR3by1TYW1wbGUgVC1UZXN0DQoNCi0gSW5kZXBlbmRlbnQgR3JvdXBzOiBVc2VyIHlhbmcgbWVsaWhhdCBWZXJzaSBBIGJlcmJlZGEgZGVuZ2FuIHVzZXIgeWFuZyBtZWxpaGF0IFZlcnNpIEIuDQoNCi0gU21hbGwgU2FtcGxlOiBVa3VyYW4gc2FtcGVsIHRpYXAga2Vsb21wb2sgYWRhbGFoIDI1ICgkbiA8IDMwJCkuDQoNCi0gU3RhbmRhcmQgRGV2aWF0aW9uOiBLaXRhIG1lbmdndW5ha2FuIHN0YW5kYXIgZGV2aWFzaSBkYXJpIHNhbXBlbCBtYXNpbmctbWFzaW5nIGtlbG9tcG9rLg0KDQozLiBSdW11cyBkYW4gTG9naWthIHBlcmhpdHVuZ2FuDQoNCktpdGEgbWVuZ2d1bmFrYW4gcGVuZGVrYXRhbiBQb29sZWQgVmFyaWFuY2Uga2FyZW5hIGp1bWxhaCBzYW1wZWwga2VkdWEga2Vsb21wb2sgc2FtYS4NCg0KLSBGb3JtdWxhIFQtU3RhdGlzdGljOiQkdCA9IFxmcmFje1xiYXJ7eH1fQSAtIFxiYXJ7eH1fQn17XHNxcnR7XGZyYWN7c19BXjJ9e25fQX0gKyBcZnJhY3tzX0JeMn17bl9CfX19JCQNCg0KRGF0YSB5YW5nIEtpdGEgTWlsaWtpOg0KDQotIFZlcnNpIEE6ICRuID0gMjUkLCAkXGJhcnt4fSA9IDQuOCQsICRzID0gMS4yJA0KDQotIFZlcnNpIEI6ICRuID0gMjUkLCAkXGJhcnt4fSA9IDUuNCQsICRzID0gMS40JA0KDQotIFN0YW5kYXJkIEVycm9yOiAkXHNxcnR7KDEuMl4yLzI1KSArICgxLjReMi8yNSl9IFxhcHByb3ggMC4zNjg4JA0KDQotIFQtU2NvcmU6ICQoNC44IC0gNS40KSAvIDAuMzY4OCA9IFxtYXRoYmZ7LTEuNjI3fSQNCg0KYGBge3IsZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgb3V0LmV4dHJhPSdzdHlsZT0iZGlzcGxheTpibG9jazsgbWFyZ2luLWxlZnQ6YXV0bzsgbWFyZ2luLXJpZ2h0OmF1dG87Iid9DQojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KIyBDQVNFIDM6IEEvQiBURVNUSU5HIEFOQUxZVElDUyANCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KGtuaXRyKQ0KbGlicmFyeShrYWJsZUV4dHJhKQ0KDQojIDEuIE1lbnlpYXBrYW4gRGF0YSBSaW5na2FzYW4NCmRhdGFfYWIgPC0gZGF0YS5mcmFtZSgNCiAgVmVyc2lvbiA9IGMoIlZlcnNpIEEgKEtvbnRyb2wpIiwgIlZlcnNpIEIgKFZhcmlhbikiKSwNCiAgbiA9IGMoMjUsIDI1KSwNCiAgTWVhbiA9IGMoNC44LCA1LjQpLA0KICBTRCA9IGMoMS4yLCAxLjQpDQopDQoNCiMgMi4gVGFiZWwgUmluZ2thc2FuIEVzdGV0aWsNCmthYmxlKGRhdGFfYWIsIGZvcm1hdCA9ICJodG1sIiwgY2FwdGlvbiA9ICJUYWJlbCAzOiBQZXJiYW5kaW5nYW4gTWV0cmlrIFBlcmZvcm1hIExhbmRpbmcgUGFnZSIpICU+JQ0KICBrYWJsZV9zdHlsaW5nKGJvb3RzdHJhcF9vcHRpb25zID0gYygic3RyaXBlZCIsICJob3ZlciIpLCBmdWxsX3dpZHRoID0gVCwgZm9udF9zaXplID0gMTYpICU+JQ0KICByb3dfc3BlYygwLCBiYWNrZ3JvdW5kID0gIiMyYzNlNTAiLCBjb2xvciA9ICJ3aGl0ZSIpICU+JQ0KICByb3dfc3BlYygyLCBib2xkID0gVCwgYmFja2dyb3VuZCA9ICIjZWJmNWZiIikgIyBIaWdobGlnaHQgVmVyc2kgQg0KDQojIDMuIEthbGt1bGFzaSBTdGF0aXN0aWsNCnNlIDwtIHNxcnQoKDEuMl4yLzI1KSArICgxLjReMi8yNSkpDQp0X3N0YXQgPC0gKDQuOCAtIDUuNCkgLyBzZQ0KcF92YWwgPC0gMiAqIHB0KGFicyh0X3N0YXQpLCBkZiA9IDQ4LCBsb3dlci50YWlsID0gRkFMU0UpDQoNCiMgNC4gVmlzdWFsaXNhc2kgQmFyIENoYXJ0IEhpZ2gtSW1wYWN0DQpnZ3Bsb3QoZGF0YV9hYiwgYWVzKHggPSBWZXJzaW9uLCB5ID0gTWVhbiwgZmlsbCA9IFZlcnNpb24pKSArDQogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCB3aWR0aCA9IDAuNSwgYWxwaGEgPSAwLjg1LCBjb2xvciA9ICJ3aGl0ZSIsIHNpemUgPSAxKSArDQogIGdlb21fZXJyb3JiYXIoYWVzKHltaW4gPSBNZWFuIC0gU0QsIHltYXggPSBNZWFuICsgU0QpLCB3aWR0aCA9IDAuMTUsIHNpemUgPSAxLjIsIGNvbG9yID0gIiMzNDQ5NWUiKSArDQogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoIiNiZGMzYzciLCAiIzI5ODBiOSIpKSArDQogICMgQW5vdGFzaSBhbmdrYSByYXRhLXJhdGEgZGkgYXRhcyBiYXINCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IE1lYW4pLCB2anVzdCA9IC0wLjUsIHNpemUgPSA2LCBmb250ZmFjZSA9ICJib2xkIikgKw0KICBsYWJzKHRpdGxlID0gIlBFUkJBTkRJTkdBTiBEVVJBU0kgU0VTSTogVkVSU0kgQSBWUyBCIiwNCiAgICAgICBzdWJ0aXRsZSA9IHBhc3RlKCJIYXNpbCBVamkgVDogUC1WYWx1ZSA9Iiwgcm91bmQocF92YWwsIDQpLCAifCBQZXJiZWRhYW4gQmVsdW0gU2lnbmlmaWthbiIpLA0KICAgICAgIHkgPSAiUmF0YS1yYXRhIER1cmFzaSAoTWVuaXQpIiwgeCA9ICIiKSArDQogIHRoZW1lX21pbmltYWwoYmFzZV9zaXplID0gMTYpICsNCiAgdGhlbWUoDQogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChmYWNlID0gImJvbGQiLCBzaXplID0gMjIsIGNvbG9yID0gIiMyYzNlNTAiKSwNCiAgICBwbG90LnN1YnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCwgY29sb3IgPSAiIzdmOGM4ZCIpLA0KICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwNCiAgICBwYW5lbC5ncmlkLm1ham9yLnggPSBlbGVtZW50X2JsYW5rKCkNCiAgKQ0KYGBgDQoNCjUuIEtlc2ltcHVsYW4gc3RyYXRlZ2lzDQpTZXRlbGFoIGtpdGEgdWppIHNlY2FyYSBtZW5kYWxhbSwgaW5pIGhhc2lsbnlhIHVudHVrIHRpbSBwcm9kdWs6DQoNCi0gU3RhdHVzOiB0aWRhayBzaWduaWZpa2FuIE5pbGFpIFAtVmFsdWUgKDAuMTEwMSkgYmVyYWRhIGRpIGF0YXMgYW1iYW5nIGJhdGFzIDAuMDUuIFNlY2FyYSBzdGF0aXN0aWssIGtpdGEgZ2FnYWwgbWVub2xhayBIaXBvdGVzaXMgTm9sICgkSF8wJCkuDQoNCi0gUmVhbGl0YSBkaSBiYWxpayBhbmdrYSBzZWNhcmEga2FzYXQgbWF0YSwgVmVyc2kgQiBtZW1hbmcgcHVueWEgcmF0YS1yYXRhIDUuNCBtZW5pdCAobGViaWggdGluZ2dpIGRhcmkgQSB5YW5nIDQuOCkuIFRhcGksIGthcmVuYSB2YXJpYW5zaW55YSBjdWt1cCBsZWJhciBkYW4gc2FtcGVsbnlhIGN1bWEgMjUsIHBlcmJlZGFhbiBpbmkgZGlhbmdnYXAgc2ViYWdhaSBrZWJldHVsYW4gKHJhbmRvbSBub2lzZSkgc2FqYS4gRGF0YSBiZWx1bSBjdWt1cCBrdWF0IHVudHVrIGJpbGFuZyBWZXJzaSBCIGxlYmloIHVuZ2d1bC4NCg0KIyAuIFN0dWR5IENhc2UgNCANCjEuIEhpcG90ZXNpcw0KDQpNZW5jYXJpIEtvbmVrc2kgUmFoYXNpYUtpdGEgaW5naW4gbWVtYnVrdGlrYW4gYXBha2FoIHBpbGloYW4gcGVyYW5na2F0IChEZXZpY2UpIGFkYSBodWJ1bmdhbm55YSBkZW5nYW4gY2FyYSBtZXJla2EgbWVtYmF5YXIsIGF0YXVrYWggc2VtdWFueWEgY3VtYSBrZWJldHVsYW4gc2FqYS4NCg0KLSAkSF8wJCAoSW5kZXBlbmRlbik6IFRpZGFrIGFkYSBodWJ1bmdhbi4gUGVuZ2d1bmEgTW9iaWxlIG1hdXB1biBEZXNrdG9wIHB1bnlhIHNlbGVyYSBwZW1iYXlhcmFuIHlhbmcgc2FtYSBzYWphLg0KDQotICRIXzEkIChEZXBlbmRlbik6IEFkYSBodWJ1bmdhbiBrdWF0LiBUaXBlIHBlcmFuZ2thdCB5YW5nIGRpZ3VuYWthbiBtZW1lbmdhcnVoaSBjYXJhIHVzZXIgbWVtYmF5YXIuDQoNCjIuIE1ldG9kb2xvZ2k6IENoaS1TcXVhcmUgVGVzdCBvZiBJbmRlcGVuZGVuY2UNCg0KS2l0YSBtZW5nZ3VuYWthbiB1amkgQ2hpLVNxdWFyZSBrYXJlbmE6DQoNCi0gQ2F0ZWdvcmljYWwgRGF0YTogVmFyaWFiZWwga2l0YSBidWthbiBhbmdrYSBtdXJuaSAoc2VwZXJ0aSBtZW5pdCksIG1lbGFpbmthbiBrYXRlZ29yaSAoTW9iaWxlL0Rlc2t0b3AgZGFuIEUtV2FsbGV0L0NDL0NPRCkuDQoNCi0gQ29udGluZ2VuY3kgVGFibGU6IEtpdGEgbWVtYmFuZGluZ2thbiBmcmVrdWVuc2kga2VtdW5jdWxhbiAoanVtbGFoIG9yYW5nKSBkYWxhbSBzZXRpYXAga29tYmluYXNpIGthdGVnb3JpLg0KDQozLiBMb2dpa2EgUGVyaGl0dW5nYW4gKFRoZSBMb2dpYykNCg0KS2l0YSBtZW1iYW5kaW5na2FuIE5pbGFpIE9ic2VydmFzaSAoTykg4oCUIGRhdGEgeWFuZyBiZW5hci1iZW5hciB0ZXJqYWRpIGRpIGxhcGFuZ2FuIOKAlCBkZW5nYW4gTmlsYWkgSGFyYXBhbiAoRSkg4oCUIGRhdGEgeWFuZyBzZWhhcnVzbnlhIG11bmN1bCBqaWthIG1lbWFuZyB0aWRhayBhZGEgaHVidW5nYW4gYXBhLWFwYS4NCg0KLSBSdW11cyBVdGFtYTokJFxjaGleMiA9IFxzdW0gXGZyYWN7KE8gLSBFKV4yfXtFfSQkDQoNCkppa2Egc2VsaXNpaCBhbnRhcmEgcmVhbGl0YSBkYW4gaGFyYXBhbiB0ZXJsYWx1IGphdWgsIG1ha2Ega2l0YSBiaXNhIHNpbXB1bGthbiBiYWh3YSBhZGEga29uZWtzaSB0ZXJzZW1idW55aSBhbnRhcmEgcGVyYW5na2F0IGRhbiBwZW1iYXlhcmFuLg0KDQpgYGB7cixlY2hvPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCBvdXQuZXh0cmE9J3N0eWxlPSJkaXNwbGF5OmJsb2NrOyBtYXJnaW4tbGVmdDphdXRvOyBtYXJnaW4tcmlnaHQ6YXV0bzsiJ30NCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQojIENBU0UgNDogQ09OU1VNRVIgQkVIQVZJT1IgLSBDSEktU1FVQVJFIEFOQUxZU0lTDQojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShyZXNoYXBlMikNCmxpYnJhcnkoa25pdHIpDQpsaWJyYXJ5KGthYmxlRXh0cmEpDQoNCiMgMS4gTWF0cmlrcyBEYXRhIEtvbnRpbmdlbnNpDQpkYXRhX21hdHJpeCA8LSBtYXRyaXgoYygxMjAsIDgwLCA1MCwgNjAsIDkwLCA0MCksIA0KICAgICAgICAgICAgICAgICAgICAgIG5yb3cgPSAyLCBieXJvdyA9IFRSVUUpDQpyb3duYW1lcyhkYXRhX21hdHJpeCkgPC0gYygiTW9iaWxlIChBcHApIiwgIkRlc2t0b3AgKFdlYikiKQ0KY29sbmFtZXMoZGF0YV9tYXRyaXgpIDwtIGMoIkUtV2FsbGV0IiwgIkNyZWRpdCBDYXJkIiwgIkNPRCIpDQoNCiMgMi4gVGFiZWwgS29udGluZ2Vuc2kgUHJlbWl1bQ0Ka2FibGUoYXMuZGF0YS5mcmFtZShkYXRhX21hdHJpeCksIGZvcm1hdCA9ICJodG1sIiwgY2FwdGlvbiA9ICJUYWJlbCA0OiBTZWJhcmFuIE1ldG9kZSBQZW1iYXlhcmFuIEJlcmRhc2Fya2FuIFBlcmFuZ2thdCIpICU+JQ0KICBrYWJsZV9zdHlsaW5nKGJvb3RzdHJhcF9vcHRpb25zID0gYygic3RyaXBlZCIsICJob3ZlciIpLCBmdWxsX3dpZHRoID0gVCwgZm9udF9zaXplID0gMTYpICU+JQ0KICByb3dfc3BlYygwLCBiYWNrZ3JvdW5kID0gIiMyYzNlNTAiLCBjb2xvciA9ICJ3aGl0ZSIpICU+JQ0KICBjb2x1bW5fc3BlYygxLCBib2xkID0gVCwgYm9yZGVyX3JpZ2h0ID0gVCkNCg0KIyAzLiBVamkgU3RhdGlzdGlrDQpoYXNpbF9jaGkgPC0gY2hpc3EudGVzdChkYXRhX21hdHJpeCkNCg0KIyA0LiBWaXN1YWxpc2FzaSBTdGFja2VkIEJhciAoUHJvcG9yc2kgUGVyc2VudGFzZSkNCmRmX3Bsb3QgPC0gbWVsdChkYXRhX21hdHJpeCkNCmNvbG5hbWVzKGRmX3Bsb3QpIDwtIGMoIkRldmljZSIsICJQYXltZW50IiwgIkNvdW50IikNCg0KZ2dwbG90KGRmX3Bsb3QsIGFlcyh4ID0gRGV2aWNlLCB5ID0gQ291bnQsIGZpbGwgPSBQYXltZW50KSkgKw0KICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgcG9zaXRpb24gPSAiZmlsbCIsIHdpZHRoID0gMC42LCBjb2xvciA9ICJ3aGl0ZSIsIHNpemUgPSAwLjUpICsNCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IHNjYWxlczo6cGVyY2VudCkgKw0KICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCIjMWFiYzljIiwgIiMzNDk4ZGIiLCAiI2U2N2UyMiIpKSArDQogICMgVGFtYmFoa2FuIGxhYmVsIHBlcnNlbnRhc2UgZGkgZGFsYW0gYmFyDQogIGxhYnModGl0bGUgPSAiRE9NSU5BU0kgUEVNQkFZQVJBTiBCRVJEQVNBUktBTiBQRVJBTkdLQVQiLA0KICAgICAgIHN1YnRpdGxlID0gcGFzdGUoIlAtVmFsdWU6Iiwgcm91bmQoaGFzaWxfY2hpJHAudmFsdWUsIDQpLCAifCBUZXJkYXBhdCBrb3JlbGFzaSBzaWduaWZpa2FuIGFudGFyYSBEZXZpY2UgJiBQYXltZW50IiksDQogICAgICAgeSA9ICJQcm9wb3JzaSAoMTAwJSkiLCB4ID0gIiIpICsNCiAgdGhlbWVfbWluaW1hbChiYXNlX3NpemUgPSAxNikgKw0KICB0aGVtZSgNCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGZhY2UgPSAiYm9sZCIsIHNpemUgPSAyMiwgY29sb3IgPSAiIzJjM2U1MCIpLA0KICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iLA0KICAgIHBhbmVsLmdyaWQgPSBlbGVtZW50X2JsYW5rKCkNCiAgKQ0KYGBgDQoNCjUuIEtlc2ltcHVsYW4gZGFuIFN0cmF0ZWdpIEJpc25pcw0KDQpCZXJkYXNhcmthbiBhbmdrYSBQLVZhbHVlICgwLjAwNSkgeWFuZyBqYXVoIGRpIGJhd2FoIDAuMDUsIGtpdGEgTWVub2xhayAkSF8wJC4gSW5pIGJlcmFydGkgaHVidW5nYW4gYW50YXJhIHBlcmFuZ2thdCBkYW4gY2FyYSBiYXlhciBpdHUgTnlhdGEsIGJ1a2FuIGtlYmV0dWxhbi4NCg0KLSBJbnNpZ2h0IFN0cmF0ZWdpcyB1bnR1ayBNYW5hamVtZW46DQoxLiBNb2JpbGUgPSBFLVdhbGxldCBQYXJhZGlzZTogUGVuZ2d1bmEgTW9iaWxlIHNhbmdhdCBkb21pbmFuIG1lbmdndW5ha2FuIEUtV2FsbGV0IChoYW1waXIgNTAlIGRhcmkgdG90YWwgcGVuZ2d1bmEgbW9iaWxlKS4NCg0KLSBBY3Rpb246IFBlcmNlcGF0IHByb3NlcyBjaGVja291dCBzYXR1IGtsaWsgKDEtY2xpY2sgY2hlY2tvdXQpIHVudHVrIEUtV2FsbGV0IGRpIGFwbGlrYXNpIEhQLg0KDQoyLiBEZXNrdG9wID0gQ3JlZGl0IENhcmQgVXNlcnM6IFBlbmdndW5hIERlc2t0b3AgamF1aCBsZWJpaCBueWFtYW4gYmVydHJhbnNha3NpIGRlbmdhbiBLYXJ0dSBLcmVkaXQgZGliYW5kaW5na2FuIE1vYmlsZS4NCg0KLSBBY3Rpb246IFBlcmt1YXQgZml0dXIga2VhbWFuYW4gc2VwZXJ0aSAzRCBTZWN1cmUgZGFuIHBhc3Rpa2FuIGZvcm0gaW5wdXQga2FydHUga3JlZGl0IHNhbmdhdCB1c2VyLWZyaWVuZGx5IGRpIGxheWFyIGJlc2FyLg0KDQozLiBUYXJnZXRlZCBQcm9tb3Rpb246DQotIEphbmdhbiBiYWthciBkdWl0IGJ1YXQgcHJvbW8gQ0MgZGkgYXBsaWthc2kgbW9iaWxlLg0KLSBGb2t1c2thbiBjYXNoYmFjayBFLVdhbGxldCBoYW55YSB1bnR1ayBwZW5nZ3VuYSBhcGxpa2FzaSBtb2JpbGUgdW50dWsgbWVuZWthbiBiaWF5YSBha3Vpc2lzaSAoQ3VzdG9tZXIgQWNxdWlzaXRpb24gQ29zdCkuDQoNCiMgLiBTdHVkeSBDYXNlIDUNCkRhbGFtIGR1bmlhIGZpbnRlY2gsIGFsZ29yaXRtYSBkZXRla3NpIHBlbmlwdWFuIGJlcnR1anVhbiB1bnR1ayBtZW1iZWRha2FuIHRyYW5zYWtzaSBub3JtYWwgZGFyaSB0cmFuc2Frc2kgeWFuZyBtZW5jdXJpZ2FrYW4uIE5hbXVuLCBzZXRpYXAga2VwdXR1c2FuIHN0YXRpc3RpayBtZW1iYXdhIHJpc2lrbyBrZXNhbGFoYW4geWFuZyBiZXJkYW1wYWsgbGFuZ3N1bmcgcGFkYSBmaW5hbnNpYWwgZGFuIHJlcHV0YXNpIHBlcnVzYWhhYW4uDQoNCjEuIEZvcm11bGFzaSBIaXBvdGVzaXMNCg0KS2l0YSBtZW5ndWppIGFwYWthaCBhbGdvcml0bWEgYmFydSBtZW1iZXJpa2FuIGRhbXBhayBueWF0YSBkaWJhbmRpbmdrYW4gc2lzdGVtIGxhbWE6DQoNCi0gJEhfMCQgKEhpcG90ZXNpcyBOb2wpOiBBbGdvcml0bWEgYmFydSB0aWRhayBlZmVrdGlmIG1lbmd1cmFuZ2kgcGVuaXB1YW4gKCRcbXVfe2xhbWF9ID0gXG11X3tiYXJ1fSQpLg0KDQotICRIXzEkIChIaXBvdGVzaXMgQWx0ZXJuYXRpZik6IEFsZ29yaXRtYSBiYXJ1IGVmZWt0aWYgbWVuZ3VyYW5naSBwZW5pcHVhbiAoJFxtdV97YmFydX0gPCBcbXVfe2xhbWF9JCkuDQoNCjIuIElkZW50aWZpa2FzaSBSaXNpa28gS2VwdXR1c2FuIChUaGUgVHdvIEVycm9ycykNCg0KRGFsYW0gcGVuZ3VqaWFuIGluaSwga2l0YSBtZW5naGFkYXBpIGR1YSBqZW5pcyBrZWdhZ2FsYW4gbG9naWthIHlhbmcga3J1c2lhbDoNCg0KMS4gVHlwZSBJIEVycm9yICgkXGFscGhhJCk6IE1lbnlpbXB1bGthbiBhbGdvcml0bWEgZWZla3RpZiAoVG9sYWsgJEhfMCQpLCBwYWRhaGFsIGtlbnlhdGFhbm55YSB0aWRhayBhZGEgcGVydWJhaGFuLg0KLSBEYW1wYWsgQmlzbmlzOiBQZW1ib3Jvc2FuIGFuZ2dhcmFuIGludmVzdGFzaSB0ZWtub2xvZ2kgdW50dWsgc2VzdWF0dSB5YW5nIHRpZGFrIGJlcmd1bmEuDQoNCjIuVHlwZSBJSSBFcnJvciAoJFxiZXRhJCk6IE1lbnlpbXB1bGthbiBhbGdvcml0bWEgdGlkYWsgZWZla3RpZiAoR2FnYWwgVG9sYWsgJEhfMCQpLCBwYWRhaGFsIGtlbnlhdGFhbm55YSBzYW5nYXQgYW1wdWguDQotIERhbXBhayBCaXNuaXM6IFBlcnVzYWhhYW4gdGVydXMgbWVydWdpIGthcmVuYSB0cmFuc2Frc2kgcGVuaXB1YW4gdGlkYWsgdGVyZGV0ZWtzaSwgc2VydGEgcmlzaWtvIGtlaGlsYW5nYW4ga2VwZXJjYXlhYW4uDQoNCjMuIFJ1bXVzIGRhbiBIdWJ1bmdhbiBQb3dlciBBbmFseXNpcw0KDQpVbnR1ayBtZW1wZXJrZWNpbCByaXNpa28ga2Vib2JvbGFuIChUeXBlIElJIEVycm9yKSwga2l0YSBoYXJ1cyBtZW5pbmdrYXRrYW4gU3RhdGlzdGljYWwgUG93ZXIuDQoNClJ1bXVzIERhc2FyIFBvd2VyOiQkUG93ZXIgPSAxIC0gXGJldGEkJA0KDQpGYWt0b3IgeWFuZyBNZW1wZW5nYXJ1aGk6DQoNCjEuIFNhbXBsZSBTaXplICgkbiQpOiBTZW1ha2luIGJhbnlhayBkYXRhLCBzZW1ha2luIHRhamFtIGRldGVrc2kga2l0YS4NCg0KMi4gU2lnbmlmaWNhbmNlIExldmVsICgkXGFscGhhJCk6IFN0YW5kYXIgdG9sZXJhbnNpIGtlc2FsYWhhbiAoYmlhc2FueWEgMC4wNSkuDQoNCjMuIEVmZmVjdCBTaXplICgkZCQpOiBTZWJlcmFwYSBiZXNhciBwZXJiZWRhYW4geWFuZyBpbmdpbiBraXRhIGRldGVrc2kuDQoNCg0KYGBge3IsZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgb3V0LmV4dHJhPSdzdHlsZT0iZGlzcGxheTpibG9jazsgbWFyZ2luLWxlZnQ6YXV0bzsgbWFyZ2luLXJpZ2h0OmF1dG87Iid9DQojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KIyBDQVNFIDU6IFJJU0sgJiBQT1dFUiBBTkFMWVNJUyANCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KHB3cikNCmxpYnJhcnkoa25pdHIpDQpsaWJyYXJ5KGthYmxlRXh0cmEpDQoNCiMgMS4gU2ltdWxhc2kgUG93ZXIgQW5hbHlzaXMNCnNhbXBsZV9zaXplcyA8LSBzZXEoMTAsIDEwMCwgYnkgPSA1KQ0KcG93ZXJzIDwtIHNhcHBseShzYW1wbGVfc2l6ZXMsIGZ1bmN0aW9uKG4pIHsNCiAgcHdyLnQudGVzdChuID0gbiwgZCA9IDAuNSwgc2lnLmxldmVsID0gMC4wNSwgdHlwZSA9ICJvbmUuc2FtcGxlIikkcG93ZXINCn0pDQoNCiMgMi4gTWVtYnVhdCBUYWJlbCBSaXNpa28gDQpkZl9yaXNrIDwtIGRhdGEuZnJhbWUoDQogIFNrZW5hcmlvID0gYygiVHlwZSBJIEVycm9yIChBbHBoYSkiLCAiVHlwZSBJSSBFcnJvciAoQmV0YSkiLCAiU3RhdGlzdGljYWwgUG93ZXIiKSwNCiAgRGVmaW5pc2kgPSBjKCJTYWxhaCBUdWR1aCAoRmFsc2UgUG9zaXRpdmUpIiwgIktlYm9ib2xhbiAoRmFsc2UgTmVnYXRpdmUpIiwgIktlbWFtcHVhbiBEZXRla3NpIiksDQogIERhbXBha19CaXNuaXMgPSBjKCJLZXJ1Z2lhbiBCaWF5YSBUZWtub2xvZ2kiLCAiS2VydWdpYW4gRmluYW5zaWFsICYgRnJhdWQiLCAiRWZpc2llbnNpIFNpc3RlbSBLZWFtYW5hbiIpDQopDQoNCmthYmxlKGRmX3Jpc2ssIGZvcm1hdCA9ICJodG1sIiwgY2FwdGlvbiA9ICJUYWJlbCA1OiBNYXRyaWtzIFJpc2lrbyBLZXB1dHVzYW4gQmlzbmlzIikgJT4lDQogIGthYmxlX3N0eWxpbmcoYm9vdHN0cmFwX29wdGlvbnMgPSBjKCJzdHJpcGVkIiwgImhvdmVyIiksIGZ1bGxfd2lkdGggPSBULCBmb250X3NpemUgPSAxNikgJT4lDQogIHJvd19zcGVjKDAsIGJhY2tncm91bmQgPSAiIzJjM2U1MCIsIGNvbG9yID0gIndoaXRlIikgJT4lDQogIHJvd19zcGVjKDIsIGJvbGQgPSBULCBjb2xvciA9ICJ3aGl0ZSIsIGJhY2tncm91bmQgPSAiI2MwMzkyYiIpICMgSGlnaGxpZ2h0IFR5cGUgSUkgRXJyb3INCg0KIyAzLiBWaXN1YWxpc2FzaSBQb3dlciBDdXJ2ZSANCmRmX3Bsb3QgPC0gZGF0YS5mcmFtZShuID0gc2FtcGxlX3NpemVzLCBwb3dlciA9IHBvd2VycykNCg0KZ2dwbG90KGRmX3Bsb3QsIGFlcyh4ID0gbiwgeSA9IHBvd2VyKSkgKw0KICBnZW9tX2xpbmUoY29sb3IgPSAiIzM0OThkYiIsIHNpemUgPSAyKSArDQogIGdlb21fcG9pbnQoY29sb3IgPSAiIzJjM2U1MCIsIHNpemUgPSA0KSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAuOCwgbGluZXR5cGUgPSAiZGFzaGVkIiwgY29sb3IgPSAiI2U3NGMzYyIsIHNpemUgPSAxKSArDQogIGFubm90YXRlKCJsYWJlbCIsIHggPSAyNSwgeSA9IDAuODUsIGxhYmVsID0gIlRhcmdldCBQb3dlcjogODAlIiwgZmlsbCA9ICIjZTc0YzNjIiwgY29sb3IgPSAid2hpdGUiLCBmb250ZmFjZSA9ICJib2xkIikgKw0KICBsYWJzKHRpdGxlID0gIkhVQlVOR0FOIFVLVVJBTiBTQU1QRUwgVEVSSEFEQVAgUE9XRVIiLA0KICAgICAgIHN1YnRpdGxlID0gIlNlbWFraW4gdGluZ2dpIFBvd2VyLCBzZW1ha2luIHJlbmRhaCByaXNpa28gJ0tlYm9ib2xhbicgKFR5cGUgSUkgRXJyb3IpIiwNCiAgICAgICB4ID0gIlVrdXJhbiBTYW1wZWwgKG4pIiwgeSA9ICJTdGF0aXN0aWNhbCBQb3dlciAoMSAtIEJldGEpIikgKw0KICB0aGVtZV9taW5pbWFsKGJhc2Vfc2l6ZSA9IDE2KSArDQogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoZmFjZSA9ICJib2xkIiwgc2l6ZSA9IDE4LCBjb2xvciA9ICIjMmMzZTUwIikpDQpgYGANCg0KNS4gS2VzaW1wdWxhbiBzdHJhdGVnaXMNCg0KQmVyZGFzYXJrYW4gYW5hbGlzaXMgcmlzaWtvIGRpIGF0YXMsIGJlcmlrdXQgYWRhbGFoIGFyYWhhbiB1bnR1ayBtYW5hamVtZW46DQoNCi0gUHJpb3JpdGFza2FuIHR5cGUgSUkgZXJyb3I6IERhbGFtIGluZHVzdHJpIGZpbnRlY2gsIGtlcnVnaWFuIGFraWJhdCBwZW5pcHVhbiB5YW5nIHRpZGFrIHRlcmRldGVrc2kgamF1aCBsZWJpaCBiZXJiYWhheWEgZGFyaXBhZGEgYmlheWEgaW1wbGVtZW50YXNpIHNpc3RlbS4gT2xlaCBrYXJlbmEgaXR1LCBraXRhIGhhcnVzIG1lbmVrYW4gcmlzaWtvICRcYmV0YSQgc2VyZW5kYWggbXVuZ2tpbi4NCg0KLSBWYWxpZGFzaSBzYW1wZWw6IEphbmdhbiBtZW5nYW1iaWwga2VwdXR1c2FuIGJlcmRhc2Fya2FuIGRhdGEgeWFuZyBzZWRpa2l0LiBHcmFmaWsgbWVudW5qdWtrYW4ga2l0YSBidXR1aCBtaW5pbWFsIDY1LTcwIGRhdGEgdHJhbnNha3NpIHVudHVrIG1lbmNhcGFpIFBvd2VyIDgwJS4NCg0KLSBSZWtvbWVuZGFzaTogSmlrYSBwZW5ndWppYW4gYXdhbCBtZW51bmp1a2thbiBoYXNpbCB5YW5nIHRpZGFrIHNpZ25pZmlrYW4sIGRpc2FyYW5rYW4gdW50dWsgbWVuYW1iYWggZHVyYXNpIGVrc3BlcmltZW4gZ3VuYSBtZW1wZXJiZXNhciB1a3VyYW4gc2FtcGVsIHNlYmVsdW0gbWVtdXR1c2thbiB1bnR1ayBtZW5vbGFrIGFsZ29yaXRtYSBiYXJ1IHRlcnNlYnV0Lg0KDQojIC4gU3R1ZHkgQ2FzZSA2DQpCZXJkYXNhcmthbiBkYXRhIHlhbmcgZGliZXJpa2FuOg0KLSBUZXN0IFN0YXRpc3RpYzogMi4zMQ0KDQotIFAtVmFsdWU6IDAuMDIxDQoNCi0gU2lnbmlmaWNhbmNlIExldmVsIChcYWxwaGEpOiAwLjA1DQoNCjEuIE1lbWFoYW1pIFAtVmFsdWUgZGFsYW0gS29udGVrcyBCaXNuaXMgDQoNCkRhbGFtIGFuYWxpc2lzIGluaSwga2l0YSBtZW5kYXBhdGthbiBuaWxhaSBQLVZhbHVlIHNlYmVzYXIgMCwwMjEuU2VjYXJhIHNlZGVyaGFuYSwgUC1WYWx1ZSBhZGFsYWggaW5kaWthdG9yIGtlanV0YW4uIEppa2Ega2l0YSBtZW5nYW5nZ2FwIG1vZGVsIGtpdGEgc2ViZW5hcm55YSB0aWRhayBwdW55YSBwZW5nYXJ1aCBhcGEtYXBhIChIaXBvdGVzaXMgTm9sLyRIXzAkKSwgbWFrYSBwZWx1YW5nIGtpdGEgbWVuZGFwYXRrYW4gaGFzaWwgc2VrdWF0IGluaSBoYW55YSBrYXJlbmEgZmFrdG9yIGtlYmVydW50dW5nYW4gYWRhbGFoIDIsMSUuIEthcmVuYSBhbmdrYSBpbmkgc2FuZ2F0IGtlY2lsIChkaSBiYXdhaCBhbWJhbmcgYmF0YXMgNSUpLCBraXRhIGJpc2EgbWVueWltcHVsa2FuIGJhaHdhIHBlcmZvcm1hIG1vZGVsIGluaSBtZW1hbmcgbnlhdGEsIGJ1a2FuIHNla2FkYXIga2ViZXR1bGFuLg0KDQoyLiBEYXNhciBwZW5nYW1iaWxhbiBrZXB1dHVzYW4NCg0KVW50dWsgbWVuZ2FtYmlsIGtlcHV0dXNhbiwga2l0YSBtZW1iYW5kaW5na2FuIG5pbGFpIHRlbXVhbiBkZW5nYW4gc3RhbmRhciBpbmR1c3RyaSAoJFxhbHBoYSA9IDAsMDUkKS5SdW11cyBQZXJiYW5kaW5nYW46JCRQXHRleHR7LVZhbHVlfSA8IFxhbHBoYSBcaW1wbGllcyBcdGV4dHtUb2xhayB9IEhfMCQkRGF0YSBLaXRhOiQkMCwwMjEgPCAwLDA1IFxpbXBsaWVzIFx0ZXh0e1NJR05JRklLQU59JCRLZXB1dHVzYW46IEtpdGEgcmVzbWkgTWVub2xhayBIaXBvdGVzaXMgTm9sLiBBcnRpbnlhLCBhZGEgcGVyYmVkYWFuIHNpZ25pZmlrYW4geWFuZyBkaWhhc2lsa2FuIG9sZWggbW9kZWwgaW5pIGRhbGFtIG1lbmRldGVrc2kgY2h1cm4uDQoNCg0KMy4gV2FzcGFkYSBUZXJoYWRhcCBLdWFsaXRhcyBEYXRhIA0KTWVza2lwdW4gaGFzaWwgc3RhdGlzdGlrbnlhIGJhZ3VzLCBraXRhIGhhcnVzIG1lbWFzdGlrYW4gYmFod2EgZGF0YSB5YW5nIGRpZ3VuYWthbiBzdWRhaCBtZXdha2lsaSBzZWx1cnVoIHBlbGFuZ2dhbi4gSmlrYSBzYW1wZWwgeWFuZyBraXRhIGFtYmlsIGJpYXMgKHRpZGFrIHJlcHJlc2VudGF0aWYpLCBtdW5jdWwgZHVhIHJpc2lrbyBiZXNhcjoNCg0KLSBLZXNpbXB1bGFuIHlhbmcgU2FsYWg6IE1vZGVsIG11bmdraW4gdGVybGloYXQgaGViYXQgZGkgYXRhcyBrZXJ0YXMgKGRhdGEgdWppKSwgbmFtdW4gZ2FnYWwgdG90YWwgc2FhdCBkaXRlcmFwa2FuIGtlIHNlbHVydWggcGVsYW5nZ2FuIGFzbGkuDQoNCi0gUGVtYm9yb3NhbiBBbmdnYXJhbjogUGVydXNhaGFhbiBiZXJpc2lrbyBtZW5ndWN1cmthbiBkYW5hIGJlc2FyIHVudHVrIGthbXBhbnllIHBlbmNlZ2FoYW4gY2h1cm4geWFuZyBzZWJlbmFybnlhIHNhbGFoIHNhc2FyYW4uDQoNCjQuIFNpZ25pZmlrYW5zaSB2cy4gRGFtcGFrIE55YXRhIA0KUGVudGluZyB1bnR1ayBkaWluZ2F0IGJhaHdhIFAtVmFsdWUgaGFueWEgbWVtYmVyaSB0YWh1IGtpdGEgIkFwYWthaCBtb2RlbCBpbmkgYmVrZXJqYT8iLCB0ZXRhcGkgdGlkYWsgbWVuamF3YWIgIlNlYmVyYXBhIGJlc2FyIGRhbXBha255YT8iLg0KDQotIFAtVmFsdWU6IE1lbnVuanVra2FuIHRpbmdrYXQga2VwZXJjYXlhYW4gKEtleWFraW5hbikuDQoNCi0gRWZmZWN0IFNpemU6IE1lbnVuanVra2FuIGtla3VhdGFuIGRhbXBhayAoRGFoc3lhdG55YSBoYXNpbCkuDQoNClNla2FsaXB1biBQLVZhbHVlIGtpdGEga2VjaWwsIGtpdGEgdGV0YXAgcGVybHUgbWVtYW50YXUgbWV0cmlrIGJpc25pcyBzZXBlcnRpIHBlcnNlbnRhc2UgcGVudXJ1bmFuIGFuZ2thIGNodXJuIHlhbmcgc2ViZW5hcm55YSB1bnR1ayBtZW1hc3Rpa2FuIGtldW50dW5nYW4gZmluYW5zaWFsIHlhbmcgbnlhdGEuDQoNCg0KDQpgYGB7cixlY2hvPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCBvdXQuZXh0cmE9J3N0eWxlPSJkaXNwbGF5OmJsb2NrOyBtYXJnaW4tbGVmdDphdXRvOyBtYXJnaW4tcmlnaHQ6YXV0bzsiJ30NCg0KbGlicmFyeShnZ3Bsb3QyKQ0KDQojIDEuIE1lbnlpYXBrYW4gZGF0YSBrdXJ2YSBkaXN0cmlidXNpIG5vcm1hbA0KeCA8LSBzZXEoLTQsIDQsIGxlbmd0aD01MDApDQp5IDwtIGRub3JtKHgpDQpkZiA8LSBkYXRhLmZyYW1lKHgsIHkpDQoNCiMgMi4gUGFyYW1ldGVyIHN0YXRpc3Rpaw0Kel9jcml0IDwtIHFub3JtKDAuOTc1KSANCnRlc3Rfc3RhdCA8LSAyLjMxDQoNCg0KZ2dwbG90KGRmLCBhZXMoeCwgeSkpICsNCiAgIyBBcmVhIGRpc3RyaWJ1c2kgdXRhbWEgZGVuZ2FuIGdyYWRhc2kgd2FybmEgc29mdCBiaXJ1IGtlIHVuZ3UNCiAgZ2VvbV9hcmVhKGZpbGwgPSAiI2YwZjRmOCIpICsNCiAgDQogICMgQXJlYSBQZW5vbGFrYW4gKE1lcmFoIFZpYnJhbnQvT3JhbmdlKQ0KICBnZW9tX2FyZWEoZGF0YSA9IHN1YnNldChkZiwgeCA+IHpfY3JpdCksIGFlcyhmaWxsID0gIlpvbmEgU2lnbmlmaWthbiIpLCBhbHBoYSA9IDAuOCkgKw0KICBnZW9tX2FyZWEoZGF0YSA9IHN1YnNldChkZiwgeCA8IC16X2NyaXQpLCBhZXMoZmlsbCA9ICJab25hIFNpZ25pZmlrYW4iKSwgYWxwaGEgPSAwLjgpICsNCiAgDQogICMgR2FyaXMga3VydmEgdXRhbWEgZGVuZ2FuIHdhcm5hIGdlbGFwIGVsZWdhbg0KICBnZW9tX2xpbmUoY29sb3IgPSAiIzFhMWExYSIsIHNpemUgPSAxLjIpICsNCiAgDQogICMgR2FyaXMgVGVzdCBTdGF0aXN0aWMgKFdhcm5hIE5lb24gQmx1ZSB1bnR1ayBlZmVrICdIaWdobGlnaHQnKQ0KICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSB0ZXN0X3N0YXQsIGNvbG9yID0gIiMwMGQyZmYiLCBzaXplID0gMikgKw0KICANCiAgIyBHYXJpcyBLcml0aXMgKFRocmVzaG9sZCkNCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gYygtel9jcml0LCB6X2NyaXQpLCBjb2xvciA9ICIjZmY0YjJiIiwgbGluZXR5cGUgPSAiZGFzaGVkIiwgc2l6ZSA9IDAuOCkgKw0KICANCiAgIyBBbm90YXNpIFRla3MgeWFuZyBzdHlsaXNoDQogIGFubm90YXRlKCJsYWJlbCIsIHggPSB0ZXN0X3N0YXQsIHkgPSAwLjM1LCANCiAgICAgICAgICAgbGFiZWwgPSBwYXN0ZSgiU2tvciBNb2RlbCBLaXRhOiIsIHRlc3Rfc3RhdCksIA0KICAgICAgICAgICBjb2xvciA9ICJ3aGl0ZSIsIGZpbGwgPSAiIzAwZDJmZiIsIGZvbnRmYWNlID0gImJvbGQiLCBzaXplID0gNSwgbGFiZWwucGFkZGluZyA9IHVuaXQoMC41LCAibGluZXMiKSkgKw0KICANCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gMy4yLCB5ID0gMC4wNSwgbGFiZWwgPSAiSEFTSUxcblNJR05JRklLQU4iLCANCiAgICAgICAgICAgY29sb3IgPSAiI2ZmNGIyYiIsIGZvbnRmYWNlID0gImJvbGQiLCBzaXplID0gNCkgKw0KDQogICMgUGVuZ2F0dXJhbiBTa2FsYSBXYXJuYQ0KICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCJab25hIFNpZ25pZmlrYW4iID0gIiNmZjRiMmIiKSkgKw0KICANCiAgIyBKdWR1bCBkYW4gTGFiZWwNCiAgbGFicyh0aXRsZSA9ICJFVkFMVUFTSSBQRVJGT1JNQSBNT0RFTCBQUkVESUtTSSIsDQogICAgICAgc3VidGl0bGUgPSAiVmlzdWFsaXNhc2kgRGlzdHJpYnVzaSBOb3JtYWw6IERhdGEgS2l0YSBCZXJhZGEgZGkgQXJlYSBLZXN1a3Nlc2FuIChTaWduaWZpa2FuKSIsDQogICAgICAgY2FwdGlvbiA9ICJBbmFsaXNpcyBTdGF0aXN0aWsgQ2h1cm4gUGVsYW5nZ2FuIHwgQWxwaGEgPSAwLjA1IiwNCiAgICAgICB4ID0gIlRpbmdrYXQgS2V5YWtpbmFuIChTdGFuZGFyZGl6ZWQgU2NvcmUpIiwgDQogICAgICAgeSA9IE5VTEwpICsNCiAgDQogICMgVGVtYSBEYXJrL01vZGVybiBNaW5pbWFsaXN0DQogIHRoZW1lX21pbmltYWwoKSArDQogIHRoZW1lKA0KICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwNCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAyMiwgZmFjZSA9ICJib2xkIiwgY29sb3IgPSAiIzJkMzQzNiIsIG1hcmdpbiA9IG1hcmdpbihiPTEwKSksDQogICAgcGxvdC5zdWJ0aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQsIGNvbG9yID0gIiM2MzZlNzIiLCBtYXJnaW4gPSBtYXJnaW4oYj0yMCkpLA0KICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF9ibGFuaygpLA0KICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGZhY2UgPSAiYm9sZCIsIHNpemUgPSAxMiksDQogICAgcGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfbGluZShjb2xvciA9ICIjZGZlNmU5IiksDQogICAgcGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICBwbG90LmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ3aGl0ZSIsIGNvbG9yID0gTkEpLA0KICAgIHBsb3QubWFyZ2luID0gbWFyZ2luKDIwLCAyMCwgMjAsIDIwKQ0KICApDQpgYGANCg0KR3JhZmlrIGluaSBtZW1iYWdpIGR1YSBkdW5pYTogRHVuaWEgS2ViZXR1bGFuIChhYnUtYWJ1KSBkYW4gRHVuaWEgRWZla3Rpdml0YXMgKG1lcmFoKS4NCg0KLSBab25hIE1lcmFoIChUaGUgRGFuZ2VyIFpvbmUgZm9yICRIXzAkKTpJbmkgYWRhbGFoIGFyZWEgZWtza2x1c2lmIHlhbmcgaGFueWEgYmlzYSBkaXRlbWJ1cyBqaWthIG1vZGVsIGtpdGEgYmVuYXItYmVuYXIgbWVtaWxpa2kgcGVyZm9ybWEgeWFuZyBrdWF0LiBLYXJlbmEga2l0YSBtZW5nZ3VuYWthbiBzdGFuZGFyICRcYWxwaGEgPSAwLjA1JCwgYXJlYSBpbmkgYWRhbGFoIGFtYmFuZyBiYXRhcyBwZW1idWt0aWFuIGJhaHdhIGhhc2lsIGtpdGEgYnVrYW4ga2FyZW5hIGtlYmVydW50dW5nYW4gc2VtYXRhLg0KDQotIFRpYW5nIEJpcnUgTmVvbiAoUG9zaXNpIE1vZGVsIEtpdGEpOkdhcmlzIGJpcnUgeWFuZyBtZW5vbmpvbCBpbmkgYWRhbGFoIHJlcHJlc2VudGFzaSBkYXJpIGRhdGEgbnlhdGEga2l0YSAoJFogPSAyLjMxJCkuIFNlY2FyYSB2aXN1YWwsIGdhcmlzIGluaSB0ZWxhaCBtZW55ZWJlcmFuZyBqYXVoIGtlIGRhbGFtIHpvbmEgbWVyYWguIEluaSBhZGFsYWggYnVrdGkgZmlzaWsgYmFod2EgbW9kZWwgcHJlZGlrc2kgY2h1cm4ga2l0YSBzdWRhaCBsdWx1cyB1amlhbiBkYW4gYmVrZXJqYSBzZWNhcmEgZWZla3RpZi4NCg0KLSBMZW5na3VuZ2FuIEFidS1hYnUgKERpc3RyaWJ1c2kgTm9ybWFsKTpHdW51bmcgaW5pIG1lbnVuanVra2FuIGtlbXVuZ2tpbmFuIGhhc2lsIGppa2EgbW9kZWwga2l0YSBzZWJlbmFybnlhIGJpYXNhLWJpYXNhIHNhamEuIEthcmVuYSBnYXJpcyBiaXJ1IGtpdGEgYmVyYWRhIGphdWggZGkgbGVyZW5nIHBhbGluZyB1anVuZywgbWFrYSBwZWx1YW5nIGtpdGEgc2FsYWggZGFsYW0gbWVuZ2FtYmlsIGtlc2ltcHVsYW4gc2FuZ2F0bGFoIHRpcGlzIChoYW55YSAyLDElKS4NCg0KDQojIC4gUmVmZXJlbnNpDQoxIC4gV2FscG9sZSwgUi4gRS4gKDIwMTYpLiBQcm9iYWJpbGl0eSAmIFN0YXRpc3RpY3MgZm9yIEVuZ2luZWVycyAmIFNjaWVudGlzdHMuIFBlYXJzb24uIA0KDQoyIC4gRXZlcml0dCwgQi4gUy4sICYgU2tyb25kYWwsIEEuICgyMDEwKS4gVGhlIENhbWJyaWRnZSBEaWN0aW9uYXJ5IG9mIFN0YXRpc3RpY3MuIENhbWJyaWRnZSBVbml2ZXJzaXR5IFByZXNzLiANCg0KMyAuIFdpY2toYW0sIEguICgyMDE2KS4gZ2dwbG90MjogRWxlZ2FudCBHcmFwaGljcyBmb3IgRGF0YSBBbmFseXNpcy4gU3ByaW5nZXIuIA0KDQo0IC4gRmllbGQsIEEuLCBNaWxlcywgSi4sICYgRmllbGQsIFouICgyMDEyKS4gRGlzY292ZXJpbmcgU3RhdGlzdGljcyBVc2luZyBSLiBTQUdFIFB1YmxpY2F0aW9ucy4gDQoNCjUgLiBOaWVsc2VuLCBKLiAoMTk5MykuIFVzYWJpbGl0eSBFbmdpbmVlcmluZy4gQWNhZGVtaWMgUHJlc3MuIA0KDQo2IC4gU2NobXVsbGVyLCBKLiAoMjAxNykuIFN0YXRpc3RpY2FsIEFuYWx5c2lzIHdpdGggUiBGb3IgRHVtbWllcy4gSm9obiBXaWxleSAmIFNvbnMuIA0KDQo3IC4gS29oYXZpLCBSLiwgVGFuZywgRC4sICYgWHUsIFkuICgyMDIwKS4gVHJ1c3R3b3J0aHkgT25saW5lIENvbnRyb2xsZWQgRXhwZXJpbWVudHM6IEEgUHJhY3RpY2FsIEd1aWRlIHRvIEEvQiBUZXN0aW5nLiBDYW1icmlkZ2UgVW5pdmVyc2l0eSBQcmVzcy4gDQoNCjggLiBHZWxtYW4sIEEuLCAmIEhpbGwsIEouICgyMDA2KS4gRGF0YSBBbmFseXNpcyBVc2luZyBSZWdyZXNzaW9uIGFuZCBNdWx0aWxldmVsL0hpZXJhcmNoaWNhbCBNb2RlbHMuIENhbWJyaWRnZSBVbml2ZXJzaXR5IFByZXNzLiANCg0KOSAuIERhbGdhYXJkLCBQLiAoMjAwOCkuIEludHJvZHVjdG9yeSBTdGF0aXN0aWNzIHdpdGggUi4gU3ByaW5nZXIuDQoNCg0KMTAuIEFncmVzdGksIEEuICgyMDE4KS4gQW4gSW50cm9kdWN0aW9uIHRvIENhdGVnb3JpY2FsIERhdGEgQW5hbHlzaXMuIFdpbGV5LiANCg0KDQoxMS4gU2llZ2VsLCBTLiwgJiBDYXN0ZWxsYW4sIE4uIEouICgxOTg4KS4gTm9ucGFyYW1ldHJpYyBTdGF0aXN0aWNzIGZvciB0aGUgQmVoYXZpb3JhbCBTY2llbmNlcy4gTWNHcmF3LUhpbGwuIA0KDQoNCg0KMTIuIENvaGVuLCBKLiAoMTk4OCkuIFN0YXRpc3RpY2FsIFBvd2VyIEFuYWx5c2lzIGZvciB0aGUgQmVoYXZpb3JhbCBTY2llbmNlcy4gTGF3cmVuY2UgRXJsYmF1bSBBc3NvY2lhdGVzLg0KDQoNCjEzLiBGYXdjZXR0LCBULiAoMjAwNikuIEFuIEludHJvZHVjdGlvbiB0byBST0MgQW5hbHlzaXMuIFBhdHRlcm4gUmVjb2duaXRpb24gTGV0dGVycy4NCg0K