
Muhammad Nabil Khairil Anam
Data Science Student
Institut Teknologi Sains Bandung (ITSB)
Studi Kasus 1
Uji-Z Satu Sampel
(Hipotesis Statistik)
Sebuah platform pembelajaran digital mengklaim bahwa rata-rata waktu
belajar harian penggunanya adalah 120 menit. Berdasarkan catatan
historis, simpangan baku populasi diketahui sebesar 15 menit.
Sampel acak dari 64 pengguna menunjukkan rata-rata waktu belajar 116
menit.
\[\begin{eqnarray*}
\mu_0 &=& 120 \\
\sigma &=& 15 \\
n &=& 64 \\
\bar{x} &=& 116
\end{eqnarray*}\]
Tugas
- Rumuskan Hipotesis Nol (H₀) dan Hipotesis Alternatif (H₁).
- Identifikasi uji statistik yang sesuai dan berikan alasan pilihan
Anda.
- Hitung statistik uji dan nilai-p dengan \(\alpha = 0.05\).
- Nyatakan keputusan statistik.
- Interpretasikan hasilnya dalam konteks analitik bisnis.
Jawab
Perumusan
Hipotesis
- Hipotesis Nol (H₀): μ = 120 menit
Artinya: Klaim platform benar, rata-rata waktu
belajar pengguna memang 120 menit
- Hipotesis Alternatif (H₁): μ ≠ 120 menit
Artinya: Klaim platform salah, rata-rata waktu
belajar pengguna tidak sama dengan 120 menit
Catatan: Uji dua sisi (two-tailed) karena ingin
menguji kebenaran klaim tanpa arah spesifik.
Pemilihan Uji
Statistik
Uji-Z Satu Sampel dipilih dengan alasan:
- Standar deviasi populasi sudah diketahui (σ = 15 menit)
- Ukuran sampel besar (n = 64 > 30), memenuhi Central Limit
Theorem
- Menguji perbandingan rata-rata sampel dengan nilai populasi
spesifik
- Distribusi sampel rata-rata mendekati normal karena n besar
Perhitungan
Statistik Uji dan Nilai-p
Data yang diketahui:
- μ₀ = 120 menit (nilai hipotesis)
- σ = 15 menit (standar deviasi populasi)
- n = 64 (ukuran sampel)
- x̄ = 116 menit (rata-rata sampel)
- α = 0.05 (tingkat signifikansi)
Langkah perhitungan:
- Standard Error (SE): \[SE = σ / √n = 15 /
√64 = 15 / 8 = 1.875\]
- Statistik Z: \[Z = (x̄ - μ₀) / SE = (116 -
120) / 1.875 = -4 / 1.875 = -2.133\]3
- Nilai-p (dua sisi): \[p-value = 2 × P(Z
< -2.1333) = 2 × 0.0164 = 0.0328\]
- Nilai kritis Z (α = 0.05): \[Z_kritis =
±1.96\] ### Keputusan Statistik
Kriteria keputusan:
- Jika |Z| > 1.96 atau p-value < 0.05 → Tolak H₀
- Jika |Z| ≤ 1.96 atau p-value ≥ 0.05 → Gagal tolak H₀
Hasil perbandingan:
- |Z| = 2.1333 > 1.96
- p-value = 0.0328 < 0.05
Keputusan: Tolak H₀
Interpretasi dalam
Konteks Analitik Bisnis
Interpretasi Statistik:
- Terdapat bukti statistik yang cukup untuk menyatakan bahwa rata-rata
waktu belajar sesungguhnya berbeda secara signifikan dari 120 menit
- Tingkat kepercayaan: 95%
- Probabilitas hasil ini terjadi jika H₀ benar hanya 3.28%
Studi Kasus 2
Uji-T Satu Sampel (σ
Tidak Diketahui, Sampel Kecil)
Sebuah Tim Riset UX menyelidiki apakah rata-rata waktu penyelesaian
tugas sebuah aplikasi baru berbeda dari 10 menit.
Data berikut dikumpulkan dari 10 pengguna:
\[9.2,\; 10.5,\; 9.8,\; 10.1,\; 9.6,\;
10.3,\; 9.9,\; 9.7,\; 10.0,\; 9.5\]
Tugas
- Definisikan H₀ dan H₁ (dua-arah / two-tailed).
- Tentukan uji hipotesis yang sesuai.
- Hitung statistik-t dan nilai-p dengan \(\alpha = 0.05\).
- Buatlah keputusan statistik.
- Jelaskan bagaimana ukuran sampel mempengaruhi keandalan
inferensi.
Jawab
Pemilihan Uji
Statistik
Uji-T Satu Sampel dipilih dengan alasan:
- Standar deviasi populasi tidak diketahui (σ unknown)
- Ukuran sampel kecil (n = 10 < 30)
- Data diasumsikan berasal dari populasi berdistribusi normal
- Menguji mean sampel terhadap nilai spesifik
Alternatif yang tidak cocok:
- Uji-Z: tidak cocok karena σ tidak diketahui
- Uji non-parametrik: data diasumsikan normal
Perhitungan
Statistik Uji dan Nilai-p
Data waktu penyelesaian (menit): 9.2, 10.5, 9.8,
10.1, 9.6, 10.3, 9.9, 9.7, 10.0, 9.5
Langkah perhitungan:
Hitung rata-rata sampel \((x):\)
\[x̄ = (9.2 + 10.5 + 9.8 + 10.1 + 9.6 + 10.3 +
9.9 + 9.7 + 10.0 + 9.5) / 10\] \[x̄ =
99.6 / 10 = 9.96 menit\]
Hitung standar deviasi sampel \((s):\)
\[s = √[Σ(xᵢ - x̄)²/(n-1)] ≈ 0.364
meni\]t
Hitung standard error \((SE):\)
\[SE = s / √n = 0.364 / √10 ≈
0.115\]
Hitung statistik t:
\[t = (x̄ - μ₀) / SE = (9.96 - 10) / 0.115
= -0.04 / 0.115 ≈ -0.348\]
Derajat kebebasan \((df):\)
\[df = n - 1 = 10 - 1 =
9\]
Nilai-p (dua arah):
\[ p-value = 2 × P(t < -0.348 | df=9) ≈
0.735\]
Nilai t kritis \((α = 0.05, df =
9):\)
t_kritis = ±2.262
Keputusan
Statistik
Kriteria keputusan:
- Jika |t| > 2.262 atau p-value < 0.05 → Tolak H₀
- Jika |t| ≤ 2.262 atau p-value ≥ 0.05 → Gagal tolak H₀
Hasil perbandingan:
- |t| = 0.348 < 2.262
- p-value = 0.735 > 0.05
Keputusan: GAGAL TOLAK H₀
Pengaruh Ukuran
Sampel pada Keandalan Inferensi
Efek Ukuran Sampel Kecil (n = 10):
Keterbatasan:
- Power statistik rendah - kemungkinan gagal mendeteksi perbedaan yang
nyata (Type II error tinggi)
- Estimasi variabilitas kurang presisi - standar error besar
- Sensitif terhadap outlier - satu data ekstrem bisa mengubah hasil
signifikan
- Distribusi t lebih lebar - nilai kritis lebih besar dibanding
distribusi normal
Dampak pada Studi Ini:
- Dengan n = 10, butuh perbedaan yang sangat besar untuk mencapai
signifikansi
- Margin of error lebar (±2.262 × SE ≈ ±0.26 menit)
- Interval kepercayaan 95% lebar: sekitar 9.70 - 10.22 menit
Jika Ukuran Sampel Diperbesar:
n = 30:
- t_kritis ≈ ±2.045 (lebih kecil dari ±2.262)
- Power meningkat, deteksi perbedaan lebih sensitif
- Estimasi lebih stabil
n = 100:
- t_kritis ≈ ±1.984 (mendekati Z = ±1.96)
- Power sangat tinggi
- Estimasi sangat presisi
Prinsip Umum:
- Sampel lebih besar → estimasi lebih presisi → inferensi lebih
andal
- Sampel kecil → lebih konservatif → butuh perbedaan lebih besar untuk
signifikan
- Rule of thumb: n ≥ 30 untuk pendekatan distribusi normal
Studi Kasus 3
Uji-T Dua Sampel
(Pengujian A/B)
Sebuah tim analitik produk melakukan pengujian A/B untuk
membandingkan rata-rata durasi sesi (menit) antara dua versi halaman
arahan (landing page).
Versi Ukuran Sampel (n) Rata-rata Simpangan Baku:
|
Version
|
Sample Size (n)
|
Mean
|
Standard Deviation
|
|
A
|
25
|
4.8
|
1.2
|
|
B
|
25
|
5.4
|
1.4
|
Tugas
- Rumuskan hipotesis nol dan hipotesis alternatif.
- Identifikasi jenis uji-t yang diperlukan.
- Hitung statistik uji dan nilai-p.
- Tarik kesimpulan statistik dengan \(\alpha
= 0.05\).
- Interpretasikan hasilnya untuk pengambilan keputusan produk.
Jawab
Identifikasi Jenis
Uji-T
Uji-T Dua Sampel Independen dengan asumsi:
- Sampel independen: Pengguna versi A dan B berbeda
- Varians diasumsikan tidak sama: Karena SD berbeda (1.2 vs 1.4)
- Ukuran sampel sama: n_A = n_B = 25
- Distribusi mendekati normal: Dengan n = 25, distribusi sampling mean
mendekati normal
Uji yang digunakan: Welch’s t-test (karena varians
tidak diasumsikan sama)
Perhitungan
Statistik Uji dan Nilai-p
Data yang diketahui:
- Versi A: n₁ = 25, x̄₁ = 4.8, s₁ = 1.2
- Versi B: n₂ = 25, x̄₂ = 5.4, s₂ = 1.4
- α = 0.05
Langkah perhitungan:
Hitung selisih mean:
\[x̄₂ - x̄₁ = 5.4 - 4.8 = 0.6
menit\]
Hitung standard error \((SE):\)
SE = √(s₁²/n₁ + s₂²/n₂) = √(1.2²/25 + 1.4²/25) = √(0.0576 + 0.0784) =
√0.136 = 0.369
Hitung statistik t:
\[t = (x̄₂ - x̄₁) / SE = 0.6 / 0.369 ≈
1.625\]
Hitung derajat kebebasan (df) dengan formula
Welch-Satterthwaite:
\[df ≈ 46.5 (dibulatkan ke bawah menjadi
46)\]
Hitung nilai-p (dua arah):
\[p-value = 2 × P(t > 1.625 | df ≈ 46)
≈ 0.111\]
Nilai t kritis \((α = 0.05, df =
46):\)
t_kritis ≈ ±2.013
Keputusan
Statistik
Kriteria keputusan:
- Jika |t| > 2.013 atau p-value < 0.05 → Tolak H₀
- Jika |t| ≤ 2.013 atau p-value ≥ 0.05 → Gagal tolak H₀
Hasil perbandingan:
- \(|t| = 1.625 < 2.013\)
- \(p-value = 0.111 > 0.05\)
Keputusan: Gagal Tolak H₀
Interpretasi untuk
Pengambilan Keputusan Produk
Interpretasi Statistik:
- Tidak ada bukti statistik yang cukup untuk menyatakan bahwa durasi
sesi berbeda antara versi A dan B
- Perbedaan rata-rata (0.6 menit) tidak signifikan secara statistik
pada tingkat kepercayaan 95%
- Probabilitas mendapatkan hasil ini jika tidak ada perbedaan
sebenarnya adalah 11.1%
Implikasi untuk
Tim Produk:
Temuan Kunci:
Tidak ada winner clear: Baik versi A maupun B tidak menunjukkan
performa yang signifikan berbeda
Effect size kecil: Perbedaan 0.6 menit (≈10% dari mean) mungkin
relevan secara praktis tetapi tidak signifikan statistik
Power test mungkin rendah: Dengan n = 25 per grup, kemampuan
mendeteksi perbedaan kecil terbatas
Rekomendasi Aksi:
Opsi 1: Lanjutkan dengan Versi B (Konservatif)
- Alasan: Rata-rata lebih tinggi (5.4 vs 4.8
menit)
- Risiko: Perbedaan tidak signifikan, bisa karena
random variation
- Tindakan: Teruskan dengan B, monitor metrics
lain
Opsi 2: Lakukan Testing Lanjutan
Opsi 3: Rollback ke Versi A atau Split Traffic
- Alasan: Tidak ada bukti B lebih baik
- Risiko: Kehilangan potensi improvement
- Tindakan: Pertahankan A atau split 50/50
Analisis Lanjutan yang Disarankan:
Power analysis: Hitung sample size yang
dibutuhkan untuk mendeteksi perbedaan 0.6 menit
Segmentasi pengguna: Analisis perbedaan
berdasarkan demografi/perilaku
Metrics tambahan: Conversion rate, engagement,
user satisfaction
A/B test multivariat: Test elemen individual
halaman
Pesan untuk Stakeholder:
“A/B test menunjukkan versi B memiliki durasi sesi rata-rata 0.6
menit lebih panjang dari versi A, namun perbedaan ini tidak signifikan
secara statistik (p = 0.111). Kami tidak memiliki bukti cukup untuk
menyatakan B lebih baik. Rekomendasi: Pertimbangkan testing dengan
sample size lebih besar atau evaluasi metrics tambahan sebelum membuat
keputusan final.”
Studi Kasus 4
Uji Chi-Square
Independensi
Sebuah perusahaan e-commerce meneliti apakah jenis perangkat
berhubungan dengan preferensi metode pembayaran.
|
Device / Payment
|
E-Wallet
|
Credit Card
|
Cash on Delivery
|
|
Mobile
|
120
|
80
|
50
|
|
Desktop
|
60
|
90
|
40
|
Tugas
- Nyatakan Hipotesis Nol (H₀) dan Hipotesis Alternatif (H₁).
- Identifikasi uji statistik yang sesuai.
- Hitung statistik Chi-Square (χ²).
- Tentukan nilai-p dengan \(\alpha =
0.05\).
- Interpretasikan hasilnya dalam kaitannya dengan strategi pembayaran
digital.
Jawab
Pemilihan Uji
Statistik
Uji Chi-Square Independensi dipilih karena:
Variabel kategorikal: Jenis perangkat
(Mobile/Desktop) dan metode pembayaran (3 kategori)
Data frekuensi: Data berupa jumlah (count) bukan
pengukuran kontinu
Menguji hubungan: Bukan perbedaan mean atau
proporsi
Asumsi:
- Sampel independen
- Expected frequency ≥ 5 untuk setiap sel
- Data berupa frekuensi aktual
Tidak cocok menggunakan: t-test, ANOVA, atau
korelasi karena data bukan numerik kontinu.
Perhitungan
Statistik Chi-Square
Data Observasi:
|
Device / Payment
|
E-Wallet
|
Credit Card
|
Cash on Delivery
|
Total
|
|
Mobile
|
120
|
80
|
50
|
250
|
|
Desktop
|
60
|
90
|
40
|
190
|
|
Total
|
180
|
170
|
90
|
440
|
Langkah perhitungan:
- Hitung Expected Frequency (E) untuk setiap
sel:
Rumus: \[E = (Total baris
× Total kolom) / Total keseluruhan\]
- Mobile & E-Wallet: (250 × 180) / 440 = 102.27
- Mobile & Credit Card: (250 × 170) / 440 = 96.59
- Mobile & Cash on Delivery: (250 × 90) / 440 = 51.14
- Desktop & E-Wallet: (190 × 180) / 440 = 77.73
- Desktop & Credit Card: (190 × 170) / 440 = 73.41
- Desktop & Cash on Delivery: (190 × 90) / 440 = 38.86
- Hitung Chi-Square Statistic:
Rumus: \[χ² = Σ[(O - E)²
/ E]\]
χ² = (120-102.27)²/102.27 + (80-96.59)²/96.59 + (50-51.14)²/51.14
+ (60-77.73)²/77.73 + (90-73.41)²/73.41 + (40-38.86)²/38.86
χ² = (17.73²/102.27) + (-16.59²/96.59) + (-1.14²/51.14) +
(-17.73²/77.73) + (16.59²/73.41) + (1.14²/38.86)
χ² = 3.07 + 2.85 + 0.03 + 4.04 + 3.75 + 0.03
χ² ≈ 13.77
- Derajat Kebebasan (df):
- df = (jumlah baris - 1) × (jumlah kolom - 1) = (2-1) × (3-1) = 1 × 2
= 2
Penentuan Nilai-p
dan Keputusan
Nilai-p:
Untuk χ² = 13.77 dengan df = 2:
- p-value ≈ 0.001 (sangat kecil)
Nilai Kritis Chi-Square (α = 0.05, df = 2):
Kriteria Keputusan:
- Jika χ² > 5.991 atau p-value < 0.05 → Tolak H₀
- Jika χ² ≤ 5.991 atau p-value ≥ 0.05 → Gagal tolak H₀
Hasil Perbandingan:
- χ² = 13.77 > 5.991
- p-value = 0.001 < 0.05
Keputusan: Tolak H₀
Interpretasi untuk
Strategi Pembayaran Digital
Interpretasi Statistik:
- Terdapat hubungan yang signifikan secara statistik antara jenis
perangkat dan preferensi metode pembayaran
- Probabilitas hasil ini terjadi jika tidak ada hubungan hanya
0.1%
- Hubungan ini bukan kebetulan (p < 0.001)
Analisis Pola
Hubungan:
Preferensi Berdasarkan Perangkat:
Mobile Users (n=250):
- E-Wallet dominan: 48% (120/250) vs expected 41%
- Credit Card rendah: 32% vs expected 39%
- Cash on Delivery: 20% vs expected 20%
Desktop Users (n=190):
- Credit Card dominan: 47% (90/190) vs expected 39%
- E-Wallet rendah: 32% vs expected 41%
- Cash on Delivery: 21% vs expected 20%
Implikasi
Strategis:
- Untuk Mobile Experience:
- Optimalkan E-Wallet: Fitur one-tap payment, QR code scanning
- Simplify checkout: Minimize form filling, autofill information
- Mobile-first design: Button besar, touch-friendly interface
- Promo khusus mobile: Cashback untuk pembayaran digital
- Untuk Desktop Experience:
- Highlight Credit Card: Tampilkan logo kartu kredit lebih
prominent
- Secure payment emphasis: Highlight security features (3D Secure,
SSL)
- Form optimization: Auto-complete, saved cards feature
- Digital wallet integration: Apple Pay, Google Pay untuk browser
- Cross-Device Strategy:
- Saved preferences: Sync payment methods across devices
- Progressive profiling: Collect payment info gradually
- Personalized offers: Berdasarkan device dan payment history
Rekomendasi
Tindakan Prioritas:
Prioritas Tinggi (Q1):
- Implement device detection untuk customize payment options
- A/B test checkout flow untuk masing-masing device
- Analytics tracking: payment method by device type
Prioritas Menengah (Q2):
- Develop mobile wallet partnership (GoPay, OVO, DANA)
- Enhanced security untuk desktop credit card payments
- Customer education: manfaat masing-masing payment method
Prioritas Rendah (Q3):
- Loyalty program integration dengan payment methods
- International payment methods optimization
- Alternative payment methods research
Business Impact Estimasi:
- Conversion rate improvement: 5-10% dengan payment method
personalization
- Average order value: Potensi naik 3-5% dengan metode pembayaran yang
tepat
- Customer satisfaction: Pengalaman checkout lebih smooth
- Operational efficiency: Kurangi failed transactions
Pesan untuk Stakeholder:
“Analisis menunjukkan hubungan kuat antara jenis perangkat dan
pilihan pembayaran. Pengguna mobile cenderung memilih e-wallet (48%),
sedangkan desktop users prefer credit card (47%). Rekomendasi strategis:
Personalize payment options berdasarkan device, dengan fokus pada mobile
wallet optimization untuk pengguna smartphone dan secure credit card
experience untuk desktop users.”
Studi Kasus 5
Galat Tipe I dan
Galat Tipe II (Konseptual)
Sebuah startup fintech menguji apakah algoritma pendeteksi penipuan
baru mengurangi transaksi penipuan.
- H₀: Algoritma baru tidak mengurangi penipuan.
- H₁: Algoritma baru mengurangi penipuan.
Tugas
- Jelaskan Galat Tipe I (α) dalam konteks ini.
- Jelaskan Galat Tipe II (β) dalam konteks ini.
- Identifikasi galat mana yang lebih mahal dari perspektif
bisnis.
- Diskusikan bagaimana ukuran sampel mempengaruhi Galat Tipe II.
- Jelaskan hubungan antara α, β, dan power statistik.
Jawab
Galat Tipe I (α)
dalam Konteks Ini
Galat Tipe I adalah kesalahan ketika kita menyimpulkan bahwa
algoritma baru efektif mengurangi penipuan, padahal sebenarnya algoritma
tersebut tidak memberikan perbaikan apa pun.
Analoginya seperti: Alarm kebakaran berbunyi padahal
tidak ada kebakaran. Kita bereaksi, evakuasi, dan memanggil petugas
pemadam, padahal sebenarnya tidak terjadi apa-apa.
Konsekuensi untuk startup fintech:
- Mengimplementasikan algoritma yang sebenarnya tidak efektif
- Membuang sumber daya untuk maintenance dan training
- Merasa aman padahal sistem tetap rentan
- Kehilangan kesempatan mencari solusi lain yang lebih baik
Contoh konkret: Setelah implementasi, tim berpikir
fraud berkurang 30%, padahal itu hanya fluktuasi data biasa.
Galat Tipe II (β)
dalam Konteks Ini
Galat Tipe II adalah kesalahan ketika kita menyimpulkan bahwa
algoritma baru tidak efektif, padahal sebenarnya algoritma tersebut
benar-benar bisa mengurangi penipuan.
Analoginya seperti: Alarm kebakaran tidak berbunyi
padahal gedung terbakar. Kita tidak melakukan apa-apa, dan kebakaran
merusak segalanya.
Konsekuensi untuk startup fintech:
- Tidak mengimplementasikan solusi yang sebenarnya bekerja
- Kerugian finansial terus berlanjut karena penipuan tidak
terdeteksi
- Reputasi rusak karena sistem keamanan lemah
- Kehilangan kepercayaan pelanggan
- Berpotensi kena denda regulator
Contoh konkret: Algoritma sebenarnya bisa mengurangi
fraud 40%, tapi karena sampel kecil, kita tidak melihat efeknya dan
memutuskan untuk tidak menggunakannya.
Galat Mana yang
Lebih Mahal?
Dari perspektif bisnis, Galat Tipe II JAUH LEBIH MAHAL dan
BERBAHAYA.
Analisis biaya Galat Tipe I:
- Biaya implementasi algoritma tidak efektif: sekitar Rp 800 juta -
1,4 miliar
- Biaya maintenance tahunan: Rp 200-300 juta
- Biaya training staff: Rp 100 juta
- Total kerugian: Sekitar Rp 1,1 - 1,8 miliar
Analisis biaya Galat Tipe II:
- Kerugian langsung dari penipuan: Rp 5 miliar+ per tahun
- Biaya investigasi dan recovery: Rp 500 juta
- Kerusakan reputasi (20-30% pelanggan keluar): Rp 2-3 miliar
- Denda regulator: Rp 1-10 miliar
- Biaya hukum: Rp 2 miliar+
- Total kerugian: Rp 8,5 - 20 miliar+
Perbandingannya 8:1 sampai 11:1 lebih mahal untuk Galat Tipe II.
Alasan mengapa β lebih mahal:
- Kerugian finansial langsung lebih besar
- Reputasi sekali rusak sulit dibangun kembali
- Pelanggan kehilangan kepercayaan
- Regulator memberikan sanksi berat
- Posisi kompetitif melemah
Pengaruh Ukuran
Sampel pada Galat Tipe II
Prinsip dasar: Semakin besar sampel, semakin kecil
Galat Tipe II (β), semakin tinggi power statistik.
Mekanisme pengaruh:
- Sampel besar memberikan estimasi yang lebih presisi
- Variabilitas data berkurang
- Sinyal efek menjadi lebih jelas terlihat
- Overlap antara distribusi jika H₀ benar dan H₁ benar mengecil
Ilustrasi praktis:
- Dengan sampel 50 transaksi: power hanya 60%, β = 40% (tinggi)
- Dengan sampel 100 transaksi: power 75%, β = 25% (sedang)
- Dengan sampel 200 transaksi: power 90%, β = 10% (rendah)
- Dengan sampel 500 transaksi: power 95%, β = 5% (sangat rendah)
Implikasi untuk testing fraud detection:
- Jangan testing dengan sampel kecil (kurang dari 100)
- Idealnya gunakan sampel 200-500 transaksi
- Lakukan power analysis sebelum testing
- Jika sampel terbatas, terima bahwa risiko false negative tinggi
Strategi sampling:
- Kumpulkan data dari periode yang cukup panjang
- Pastikan sampel representatif (semua jenis transaksi)
- Pertimbangkan stratified sampling berdasarkan nilai transaksi
- Monitor secara terus-menerus setelah implementasi
Hubungan antara α,
β, dan Power Statistik
Definisi ketiga konsep:
- α (Alpha): Probabilitas melakukan Galat Tipe I (biasanya ditetapkan
0.05 atau 5%)
- β (Beta): Probabilitas melakukan Galat Tipe II
- Power (1-β): Probabilitas mendeteksi efek jika efek tersebut
benar-benar ada
Hubungan matematis sederhana:
- Power= 1 - β
- Jika β= 20%, maka power = 80%
- Jika β= 10%, maka power = 90%
Trade-off antara α dan β:
- Jika kita menetapkan α sangat ketat (0.01), maka β menjadi lebih
besar
- Jika kita melonggarkan α (0.10), maka β menjadi lebih kecil
- Tidak bisa membuat keduanya kecil sekaligus dengan sampel
terbatas
Faktor yang mempengaruhi power (1-β):
- Ukuran efek: Efek besar lebih mudah dideteksi
- Ukuran sampel: Sampel besar meningkatkan power
- Variabilitas data: Data yang konsisten meningkatkan power
- Tingkat signifikansi (α): α yang lebih besar meningkatkan power
Dalam konteks
fraud detection:
Prioritas harus pada minimisasi β karena:
- Biaya β jauh lebih tinggi daripada biaya α
- False negative (melewatkan fraud) lebih berbahaya daripada false
positive (alarm palsu)
- Regulator biasanya lebih toleran terhadap false positive daripada
false negative
Rekomendasi praktis untuk startup:
- Gunakan α = 0.10 (bukan 0.05) untuk meningkatkan power
- Targetkan power minimal 80%, idealnya 90%
- Lakukan testing bertahap: exploratory → confirmatory
- Terus monitor setelah implementasi
Kesimpulan hubungan:
Power statistik adalah kemampuan kita untuk mendeteksi efek yang
benar-benar ada.Power tinggi berarti β rendah, yang sangat penting dalam
fraud detection karena biaya melewatkan fraud jauh lebih besar daripada
biaya alarm palsu.
Studi Kasus 6
Nilai-P dan
Pengambilan Keputusan Statistik
Evaluasi model prediksi churn menghasilkan hasil berikut:
- Statistik uji = 2.31
- nilai-p = 0.021
- Tingkat signifikansi: \(\alpha =
0.05\)
Tugas
- Jelaskan makna nilai-p.
- Buatlah keputusan statistik.
- Terjemahkan keputusan tersebut ke dalam bahasa non-teknis untuk
manajemen.
- Diskusikan risikonya jika sampel tidak representatif.
- Jelaskan mengapa nilai-p tidak mengukur ukuran efek (effect
size).
Jawab
Makna Nilai-p (p =
0.021)
Nilai-p adalah probabilitas mendapatkan hasil se-ekstrem ini atau
lebih ekstrem lagi, jika hipotesis nol (H₀) benar.
Penjelasan sederhana untuk p = 0.021:
Ada2.1% kemungkinan kita akan melihat statistik uji sebesar 2.31 atau
lebih ekstrem, jika sebenarnya tidak ada efek apa pun dalam
populasi.
Analoginya seperti:
Bayangkan kita punya koin yang kita klaim tidak bias(H₀). Kita lempar
100 kali, dapat 60 gambar. Nilai-p adalah: seberapa mungkin mendapatkan
60 gambar atau lebih ekstrem, jika koin memang tidak bias? Jika p kecil
(misal 0.03), artinya sangat tidak mungkin hasil ini terjadi jika koin
tidak bias.
Dalam konteks churn prediction:
- H₀: Model prediksi churn tidak memiliki kemampuan
prediktif
- Hasil: p = 0.021
- Artinya: Hanya 2.1% kemungkinan kita akan
mendapatkan statistik uji 2.31 atau lebih tinggi, jika model sebenarnya
tidak berguna
Interpretasi penting:
- BUKAN probabilitas H₀ benar
- BUKAN probabilitas H₁ benar
- BUKAN ukuran pentingnya efek
- ADALAH ukuran ketidakcocokan data dengan H₀
Keputusan
Statistik
Data yang diketahui:
- Statistik uji = 2.31
- Nilai-p = 0.021
- Tingkat signifikansi α = 0.05
Aturan keputusan standar:
- Jika p-value < α → Tolak H₀
- Jika p-value ≥ α → Gagal tolak H₀
Proses pengambilan keputusan:
- Bandingkan p-value (0.021) dengan α (0.05)
- 0.021 < 0.05
- Keputusan: TOLAK H₀
Interpretasi keputusan:
Terdapatbukti statistik yang cukup untuk menyimpulkan bahwa model
prediksi churn memiliki kemampuan prediktif yang signifikan.
Level of evidence:
- p < 0.001: Bukti sangat kuat
- p < 0.01: Bukti kuat
- p < 0.05: Bukti cukup ← kasus kita
- p < 0.10: Bukti lemah
- p ≥ 0.10: Tidak cukup bukti
Terjemahan untuk
Manajemen (Non-Teknis)
Untuk CEO/Direktur:
“Analisis statistik menunjukkan model prediksi churn kita bekerja
dengan baik. Hasil yang kita dapatkan sangat tidak mungkin terjadi
secara kebetulan. Kita 95% yakin bahwa model ini benar-benar memiliki
kemampuan memprediksi pelanggan yang akan berhenti.”
Untuk Manajer Produk:
“Model prediksi churn telah divalidasi secara statistik. Kita punya
keyakinan kuat bahwa model ini bisa membantu mengidentifikasi pelanggan
berisiko tinggi. Bisa kita gunakan untuk program retensi yang lebih
efektif.”
Untuk Tim Marketing:
“Berdasarkan testing statistik, sistem prediksi churn kita signifikan
dan reliable. Kita bisa percaya pada scoring-nya untuk menargetkan
kampanye retensi.”
Versi satu kalimat:
“Model prediksi churn terbukti efektif secara statistik dengan
tingkat kepercayaan 95%.”
Yang TIDAK BOLEH dikatakan ke manajemen:
- “Model kita 97.9% akurat” (salah, p-value bukan akurasi)
- “Kita pasti bisa mengurangi churn” (overconfident)
- “Ini bukti final” (statistik selalu ada uncertainty)
Risiko Jika Sampel
Tidak Representatif
Masalah utama: Hasil statistik yang signifikan bisa
menyesatkan jika sampel tidak mewakili populasi sebenarnya.
Contoh konkret dalam churn prediction:
- Sampel hanya dari pelanggan premium, padaha populasi semua tier
- Data hanya dari Q4 (musim liburan), padahal pola churn beda tiap
musim
- Hanya pelanggan usia tertentu, tidak semua demografi
- Hanya dari region tertentu, tidak nasional/internasional
Konsekuensi risiko:
- Overestimation kemampuan model:
- Model tampak bagus di sampel, tapi gagal di populasi sebenarnya
- Akurasi turun drastis saat diimplementasikan luas
- Keputusan bisnis berdasarkan prediksi yang salah
- Bias dalam prediksi:
- Model jadi akurat untuk segmen tertentu saja
- Miss segment lainnya yang penting
- Program retensi tidak efektif untuk sebagian pelanggan
- Generalization error tinggi:
- Model overfit ke karakteristik sampel
- Tidak robust terhadap variasi di populasi
- Perlu constant retraining dan adjustment
- Kerugian finansial:
- Investasi pada program retensi yang tidak tepat sasaran
- Kehilangan pelanggan yang sebenarnya bisa dipertahankan
- Reputasi tim data science menurun
Cara mitigasi risiko:
- Pastikan sampel random dan cukup besar (n ≥ 500)
- Lakukan stratified sampling berdasarkan segment penting
- Validasi dengan holdout sample atau cross-validation
- Test di multiple time periods
- Monitor performance setelah implementasi
Peringatan: Significance tanpa representativeness
adalah ilusi statistical validity.
Mengapa Nilai-p
Tidak Mengukur Ukuran Efek
Perbedaan fundamental:
- Nilai-p: Mengukur kepercayaan (confidence) - seberapa yakin kita ada
efek
- Ukuran efek: Mengukur kekuatan (strength) - seberapa besar
efeknya
Analoginya seperti:
- Nilai-p: Seberapa yakin kita ada api (asap terlihat
jelas atau samar)
- Effect size: Seberapa besar apinya (api unggun atau
kebakaran gedung)
Contoh dalam churn prediction:
- p = 0.021: Sangat yakin model memiliki kemampuan prediktif
- Effect size (misal AUC = 0.72): Model bisa membedakan dengan cukup
baik antara yang akan churn dan tidak
Mengapa p-value
saja tidak cukup
Kasus 1: Sampel besar, efek kecil
- n = 10.000, efek sangat kecil → p bisa sangat kecil (0.001)
- Tapi effect size kecil, mungkin tidak meaningful secara praktis
- Kesimpulan: Signifikan statistik, tapi tidak penting bisnis
Kasus 2: Sampel kecil, efek besar
- n = 30, efek besar → p mungkin 0.08 (tidak signifikan)
- Tapi effect size besar, mungkin meaningful
- Kesimpulan: Tidak signifikan statistik, tapi mungkin penting
bisnis
Ukuran efek yang
perlu dilaporkan bersama p-value:
Untuk klasifikasi (churn prediction):
- AUC/ROC: Area Under Curve (0.5 = random, 0.7 = acceptable, 0.8 =
good, 0.9 = excellent)
- Precision & Recall: Trade-off antara false positive dan false
negative
- F1-Score: Harmonic mean precision dan recall
- Accuracy: Proporsi prediksi benar (tapi hati-hati dengan imbalanced
data)
Untuk regression/continuous:
- Cohen’s d: Standardized mean difference
- R²: Proportion of variance explained
- Regression coefficients: Besarnya pengaruh setiap predictor
Dalam studi kasus kita:
- p = 0.021 → Kita yakin model tidak useless
- Tapi butuh effect size untuk tahu seberapa useful modelnya
- Contoh: Jika AUC = 0.65 → Cukup baik tapi ada ruang improvement
- Jika AUC = 0.85 → Sangat baik, bisa diandalkan
Rekomendasi praktis:
Selalu laporkan BOTH p-value dan effect size. Significance menjawab
“apakah ada efek?”, effect size menjawab “seberapa besar efeknya?”.
Pesan untuk analis data:
Jangan pernah hanya bilang “significant at p < 0.05”. Tambahkan
“with effect size of X, which means Y in business context”.
Kesimpulan dan
Referensi
Analisis keenam studi kasus mengungkapkan pentingnya pendekatan
statistik yang tepat dalam pengambilan keputusan bisnis berbasis data,
di mana pemilihan uji yang sesuai dengan karakteristik data dan konteks
masalah menjadi kunci utama, interpretasi hasil statistik harus
mempertimbangkan baik signifikansi (p-value) maupun ukuran efek (effect
size) serta dampak bisnis dari berbagai jenis kesalahan, dengan
pemahaman bahwa signifikansi statistik tidak selalu bermakna penting
secara praktis, sementara validitas keseluruhan sangat bergantung pada
kualitas dan representativitas sampel data yang digunakan.
- Anderson, D. R., Sweeney, D. J., Williams, T. A., Camm, J. D., &
Cochran, J. J. (2020). Statistics for Business & Economics (14th
ed.). Cengage Learning. Materi: Uji hipotesis, distribusi sampling,
inferensi statistik
- Field, A. (2018). Discovering Statistics Using R (5th ed.). Sage
Publications. Materi: Implementasi uji statistik dalam R, interpretasi
output
- Hair, J. F., Black, W. C., Babin, B. J., & Anderson, R. E.
(2019). Multivariate Data Analysis (8th ed.). Cengage Learning. Materi:
Analisis multivariat, validitas konstruk, power analysis
- Montgomery, D. C., & Runger, G. C. (2018). Applied Statistics
and Probability for Engineers (7th ed.). Wiley. Materi: Desain
eksperimen, kontrol kualitas, A/B testing
- Cohen, J. (1992). “A power primer”. Psychological Bulletin, 112(1),
155-159. Materi: Power analysis, ukuran efek, Galat Tipe II
- Wasserstein, R. L., & Lazar, N. A. (2016). “The ASA statement on
p-values: Context, process, and purpose”. The American Statistician,
70(2), 129-133. Materi: Interpretasi nilai-p yang tepat, miskonsepsi
umum
- Ioannidis, J. P. A. (2005). “Why most published research findings
are false”. PLoS Medicine, 2(8), e124. Materi: Reproduktibilitas hasil,
bias publikasi, power rendah
- Sullivan, G. M., & Feinn, R. (2012). “Using effect size—or why
the P value is not enough”. Journal of Graduate Medical Education, 4(3),
279-282. Materi: Pentingnya melaporkan ukuran efek bersama p-value
- Provost, F., & Fawcett, T. (2013). Data Science for Business:
What You Need to Know About Data Mining and Data-Analytic Thinking.
O’Reilly Media. Materi: A/B testing, model evaluasi, konteks bisnis
- Kohavi, R., Tang, D., & Xu, Y. (2020). Trustworthy Online
Controlled Experiments: A Practical Guide to A/B Testing. Cambridge
University Press. Materi: Best practices A/B testing, analisis hasil,
etika
- Hastie, T., Tibshirani, R., & Friedman, J. (2017). The Elements
of Statistical Learning: Data Mining, Inference, and Prediction (2nd
ed.). Springer. Materi: Model prediksi, validasi, machine learning
- Bolton, R. N., & Lemon, K. N. (1999). “A dynamic model of
customers’ usage of services: Usage as an antecedent and consequence of
satisfaction”. Journal of Marketing Research, 36(2), 171-186. Materi:
Model prediksi churn, customer analytics
- Ngai, E. W. T., Xiu, L., & Chau, D. C. K. (2009). “Application
of data mining techniques in customer relationship management: A
literature review and classification”. Expert Systems with Applications,
36(2), 2592-2602. Materi: Data mining untuk CRM, fraud detection
- Westfall, P. H., & Young, S. S. (1993). Resampling-Based
Multiple Testing: Examples and Methods for p-Value Adjustment. Wiley.
Materi: Koreksi multiple testing, false discovery rate
- https://rpubs.com/dsciencelabs/Statistical_Inferences
LS0tDQp0aXRsZTogIlN0YXRpc3RpY2FsIEluZmVyZW5jZXMgfiBXZWVrIDE0Ig0KYXV0aG9yOiAiTXVoYW1tYWQgTmFiaWwgS2hhaXJpbCBBbmFtIg0KZGF0ZTogImByIGZvcm1hdChTeXMuRGF0ZSgpLCAnJUIgJWQsICVZJylgIiAgIyBBdXRvIGRpc3BsYXlzIGN1cnJlbnQgZGF0ZQ0Kb3V0cHV0Og0KICBybWRmb3JtYXRzOjpyZWFkdGhlZG93bjogICAgICAgICAgICAgICAjIGh0dHBzOi8vZ2l0aHViLmNvbS9qdWJhL3JtZGZvcm1hdHMNCiAgICBjc3M6ICJjdXN0b20uY3NzIiAgICAgICAgICAgICAgICAgICAgICMgPC0tLSBQQU5HR0lMIEZJTEUgQ1NTIERJIFNJTkkNCiAgICBzZWxmX2NvbnRhaW5lZDogdHJ1ZSAgICAgICAgICAgICAgICAgIyBFbWJlZCBhbGwgcmVzb3VyY2VzDQogICAgdGh1bWJuYWlsczogdHJ1ZSAgICAgICAgICAgICAgICAgICAgICMgU2hvdyBpbWFnZSB0aHVtYm5haWxzDQogICAgbGlnaHRib3g6IHRydWUgICAgICAgICAgICAgICAgICAgICAgICMgRW5hYmxlIGNsaWNrLXRvLXpvb20gaW1hZ2VzDQogICAgZ2FsbGVyeTogdHJ1ZSAgICAgICAgICAgICAgICAgICAgICAgICMgR3JvdXAgaW1hZ2VzIGludG8gZ2FsbGVyeQ0KICAgIG51bWJlcl9zZWN0aW9uczogdHJ1ZSAgICAgICAgICAgICAgICAjIE51bWJlciBhbGwgc2VjdGlvbnMNCiAgICBsaWJfZGlyOiBsaWJzICAgICAgICAgICAgICAgICAgICAgICAgIyBTYXZlIEpTL0NTUyBsaWJyYXJpZXMNCiAgICBkZl9wcmludDogInBhZ2VkIiAgICAgICAgICAgICAgICAgICAgIyBQYWdlZCBkYXRhIGZyYW1lcw0KICAgIGNvZGVfZm9sZGluZzogInNob3ciICAgICAgICAgICAgICAgICAjIEV4cGFuZGFibGUgY29kZSBibG9ja3MNCiAgICBjb2RlX2Rvd25sb2FkOiB5ZXMgICAgICAgICAgICAgICAgICAgIyBBZGQgYnV0dG9uIHRvIGRvd25sb2FkIFIgY29kZQ0KLS0tDQoNCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFLCBtZXNzYWdlID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRSkgIyBUYW1iYWhrYW4gbWVzc2FnZS93YXJuaW5nPUZBTFNFDQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KGtuaXRyKQ0KbGlicmFyeShrYWJsZUV4dHJhKQ0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkocm1kZm9ybWF0cykgIyBPcHRpb25hbCwgamlrYSBpbmdpbiBtZW1hc3Rpa2FuIHBhY2thZ2UgdGVybG9hZA0KDQpgYGANCg0KLS0tDQoNCjxkaXYgY2xhc3M9InByb2ZpbGUtY29udGFpbmVyIj4NCiAgDQogIDxpbWcgDQogICAgc3JjPSJDOi9Vc2Vycy9JeWFuL0Rvd25sb2Fkcy9TdGFydGlzdGlrIFdlZWsgMTQvTXlGb3RvLmpwZyIgDQogICAgYWx0PSJQcm9maWxlIFBpY3R1cmUiIA0KICAgIGNsYXNzPSJwcm9maWxlLXBpYy1uZXciIA0KICAgIHN0eWxlPSINCiAgICAgIHdpZHRoOiAxODBweCAhaW1wb3J0YW50OyANCiAgICAgIGhlaWdodDogMTgwcHggIWltcG9ydGFudDsgDQogICAgICBib3JkZXItcmFkaXVzOiA1MCUgIWltcG9ydGFudDsgDQogICAgICBib3JkZXI6IDRweCBzb2xpZCAjMzQ5OGRiICFpbXBvcnRhbnQ7IA0KICAgICAgYm94LXNoYWRvdzogMCAwIDE1cHggcmdiYSg1MiwgMTUyLCAyMTksIDAuNykgIWltcG9ydGFudDsNCiAgICAgIG9iamVjdC1maXQ6IGNvdmVyOw0KICAgICAgbWFyZ2luLWJvdHRvbTogNXB4Ow0KICAgICINCiAgLz4NCg0KICA8ZGl2IGNsYXNzPSJwcm9maWxlLW5hbWUiPk11aGFtbWFkIE5hYmlsIEtoYWlyaWwgQW5hbTwvZGl2Pg0KICA8ZGl2IGNsYXNzPSJwcm9maWxlLXByb2RpIj5EYXRhIFNjaWVuY2UgU3R1ZGVudDwvZGl2Pg0KICA8ZGl2IGNsYXNzPSJwcm9maWxlLWluc3RhbnNpIj5JbnN0aXR1dCBUZWtub2xvZ2kgU2FpbnMgQmFuZHVuZyAoSVRTQik8L2Rpdj4NCiAgDQogIDxicj4gPC9kaXY+DQoNCi0tLQ0KDQo8ZGl2IGNsYXNzPSJleHBsYW5hdGlvbi1ib3giPg0KDQojIFN0dWRpIEthc3VzIDENCg0KIyMgVWppLVogU2F0dSBTYW1wZWwgKEhpcG90ZXNpcyBTdGF0aXN0aWspDQoNClNlYnVhaCBwbGF0Zm9ybSBwZW1iZWxhamFyYW4gZGlnaXRhbCBtZW5na2xhaW0gYmFod2EgcmF0YS1yYXRhIHdha3R1IGJlbGFqYXIgaGFyaWFuIHBlbmdndW5hbnlhIGFkYWxhaCAxMjAgbWVuaXQuIEJlcmRhc2Fya2FuIGNhdGF0YW4gaGlzdG9yaXMsIHNpbXBhbmdhbiBiYWt1IHBvcHVsYXNpIGRpa2V0YWh1aSBzZWJlc2FyIDE1IG1lbml0Lg0KDQpTYW1wZWwgYWNhayBkYXJpIDY0IHBlbmdndW5hIG1lbnVuanVra2FuIHJhdGEtcmF0YSB3YWt0dSBiZWxhamFyIDExNiBtZW5pdC4NCg0KJCRcYmVnaW57ZXFuYXJyYXkqfQ0KXG11XzAgJj0mIDEyMCBcXA0KXHNpZ21hICY9JiAxNSBcXA0KbiAmPSYgNjQgXFwNClxiYXJ7eH0gJj0mIDExNg0KXGVuZHtlcW5hcnJheSp9JCQNCg0KIyMgVHVnYXMNCg0KMS4gUnVtdXNrYW4gSGlwb3Rlc2lzIE5vbCAoSOKCgCkgZGFuIEhpcG90ZXNpcyBBbHRlcm5hdGlmIChI4oKBKS4NCjIuIElkZW50aWZpa2FzaSB1amkgc3RhdGlzdGlrIHlhbmcgc2VzdWFpIGRhbiBiZXJpa2FuIGFsYXNhbiBwaWxpaGFuIEFuZGEuDQozLiBIaXR1bmcgc3RhdGlzdGlrIHVqaSBkYW4gbmlsYWktcCBkZW5nYW4gJFxhbHBoYSA9IDAuMDUkLg0KNC4gTnlhdGFrYW4ga2VwdXR1c2FuIHN0YXRpc3Rpay4NCjUuIEludGVycHJldGFzaWthbiBoYXNpbG55YSBkYWxhbSBrb250ZWtzIGFuYWxpdGlrIGJpc25pcy4NCg0KIyMgSmF3YWINCg0KIyMjIFBlcnVtdXNhbiBIaXBvdGVzaXMNCg0KKiBIaXBvdGVzaXMgTm9sIChI4oKAKTogzrwgPSAxMjAgbWVuaXQNCg0KKipBcnRpbnlhOioqIEtsYWltIHBsYXRmb3JtIGJlbmFyLCByYXRhLXJhdGEgd2FrdHUgYmVsYWphciBwZW5nZ3VuYSBtZW1hbmcgMTIwIG1lbml0DQoNCiogSGlwb3Rlc2lzIEFsdGVybmF0aWYgKEjigoEpOiDOvCDiiaAgMTIwIG1lbml0DQoNCioqQXJ0aW55YToqKiBLbGFpbSBwbGF0Zm9ybSBzYWxhaCwgcmF0YS1yYXRhIHdha3R1IGJlbGFqYXIgcGVuZ2d1bmEgdGlkYWsgc2FtYSBkZW5nYW4gMTIwIG1lbml0DQoNCioqQ2F0YXRhbjoqKiBVamkgZHVhIHNpc2kgKHR3by10YWlsZWQpIGthcmVuYSBpbmdpbiBtZW5ndWppIGtlYmVuYXJhbiBrbGFpbSB0YW5wYSBhcmFoIHNwZXNpZmlrLg0KDQojIyMgUGVtaWxpaGFuIFVqaSBTdGF0aXN0aWsNCg0KKipVamktWiBTYXR1IFNhbXBlbCBkaXBpbGloIGRlbmdhbiBhbGFzYW46KioNCg0KKiBTdGFuZGFyIGRldmlhc2kgcG9wdWxhc2kgc3VkYWggZGlrZXRhaHVpICjPgyA9IDE1IG1lbml0KQ0KKiBVa3VyYW4gc2FtcGVsIGJlc2FyIChuID0gNjQgPiAzMCksIG1lbWVudWhpIENlbnRyYWwgTGltaXQgVGhlb3JlbQ0KKiBNZW5ndWppIHBlcmJhbmRpbmdhbiByYXRhLXJhdGEgc2FtcGVsIGRlbmdhbiBuaWxhaSBwb3B1bGFzaSBzcGVzaWZpaw0KKiBEaXN0cmlidXNpIHNhbXBlbCByYXRhLXJhdGEgbWVuZGVrYXRpIG5vcm1hbCBrYXJlbmEgbiBiZXNhcg0KDQojIyMgUGVyaGl0dW5nYW4gU3RhdGlzdGlrIFVqaSBkYW4gTmlsYWktcA0KDQoqKkRhdGEgeWFuZyBkaWtldGFodWk6KioNCg0KKiDOvOKCgCA9IDEyMCBtZW5pdCAobmlsYWkgaGlwb3Rlc2lzKQ0KKiDPgyA9IDE1IG1lbml0IChzdGFuZGFyIGRldmlhc2kgcG9wdWxhc2kpDQoqIG4gPSA2NCAodWt1cmFuIHNhbXBlbCkNCiogeMyEID0gMTE2IG1lbml0IChyYXRhLXJhdGEgc2FtcGVsKQ0KKiDOsSA9IDAuMDUgKHRpbmdrYXQgc2lnbmlmaWthbnNpKQ0KDQoqKkxhbmdrYWggcGVyaGl0dW5nYW46KioNCg0KMS4gU3RhbmRhcmQgRXJyb3IgKFNFKToNCiAgICQkU0UgPSDPgyAvIOKImm4gPSAxNSAvIOKImjY0ID0gMTUgLyA4ID0gMS44NzUkJA0KMi4gU3RhdGlzdGlrIFo6DQogICAkJFogPSAoeMyEIC0gzrzigoApIC8gU0UgPSAoMTE2IC0gMTIwKSAvIDEuODc1ID0gLTQgLyAxLjg3NSA9IC0yLjEzMyQkMw0KMy4gTmlsYWktcCAoZHVhIHNpc2kpOg0KICAgJCRwLXZhbHVlID0gMiDDlyBQKFogPCAtMi4xMzMzKSA9IDIgw5cgMC4wMTY0ID0gMC4wMzI4JCQNCjQuIE5pbGFpIGtyaXRpcyBaICjOsSA9IDAuMDUpOg0KICAgJCRaX2tyaXRpcyA9IMKxMS45NiQkDQojIyMgS2VwdXR1c2FuIFN0YXRpc3Rpaw0KDQoqKktyaXRlcmlhIGtlcHV0dXNhbjoqKg0KDQoqIEppa2EgfFp8ID4gMS45NiBhdGF1IHAtdmFsdWUgPCAwLjA1IOKGkiBUb2xhayBI4oKADQoqIEppa2EgfFp8IOKJpCAxLjk2IGF0YXUgcC12YWx1ZSDiiaUgMC4wNSDihpIgR2FnYWwgdG9sYWsgSOKCgA0KDQoqKkhhc2lsIHBlcmJhbmRpbmdhbjoqKg0KDQoqIHxafCA9IDIuMTMzMyA+IDEuOTYNCiogcC12YWx1ZSA9IDAuMDMyOCA8IDAuMDUNCg0KKipLZXB1dHVzYW46KiogVG9sYWsgSOKCgA0KDQojIyMgSW50ZXJwcmV0YXNpIGRhbGFtIEtvbnRla3MgQW5hbGl0aWsgQmlzbmlzDQoNCioqSW50ZXJwcmV0YXNpIFN0YXRpc3RpazoqKg0KDQoqIFRlcmRhcGF0IGJ1a3RpIHN0YXRpc3RpayB5YW5nIGN1a3VwIHVudHVrIG1lbnlhdGFrYW4gYmFod2EgcmF0YS1yYXRhIHdha3R1IGJlbGFqYXIgc2VzdW5nZ3VobnlhIGJlcmJlZGEgc2VjYXJhIHNpZ25pZmlrYW4gZGFyaSAxMjAgbWVuaXQNCiogVGluZ2thdCBrZXBlcmNheWFhbjogOTUlDQoqIFByb2JhYmlsaXRhcyBoYXNpbCBpbmkgdGVyamFkaSBqaWthIEjigoAgYmVuYXIgaGFueWEgMy4yOCUNCg0KIyMjIyBJbXBsaWthc2kgdW50dWsgUGxhdGZvcm0gUGVtYmVsYWphcmFuOg0KDQoqKlRlbXVhbiBLdW5jaToqKg0KDQoqIFJhdGEtcmF0YSB3YWt0dSBiZWxhamFyIGFrdHVhbCAoMTE2IG1lbml0KSA0IG1lbml0IGxlYmloIHJlbmRhaCBkYXJpIGtsYWltDQoqIFBlcmJlZGFhbiBpbmkgc2lnbmlmaWthbiBzZWNhcmEgc3RhdGlzdGlrIG1lc2tpcHVuIHRhbXBhayBrZWNpbA0KKiBLbGFpbSBtYXJrZXRpbmcgc2FhdCBpbmkgdGlkYWsgYWt1cmF0DQoNCioqUmVrb21lbmRhc2kgQWtzaToqKg0KDQoqIFJldmlzaSBrbGFpbSBtYXJrZXRpbmcgbWVuamFkaSBsZWJpaCByZWFsaXN0aXMgKOKJiDExNiBtZW5pdCkNCiogSW52ZXN0aWdhc2kgcGVueWViYWIgbWVuZ2FwYSB3YWt0dSBiZWxhamFyIGxlYmloIHJlbmRhaA0KKiBTZWdtZW50YXNpIHBlbmdndW5hIHVudHVrIGFuYWxpc2lzIGxlYmloIG1lbmRhbGFtDQoqIFByb2dyYW0gcGVuaW5na2F0YW4gZW5nYWdlbWVudCB1bnR1ayBtZW5kZWthdGkgdGFyZ2V0DQoNCioqQW5hbGlzaXMgTGFuanV0YW4geWFuZyBEaXBlcmx1a2FuOioqDQoNCiogUGVyaWtzYSBrb25zaXN0ZW5zaSBoYXNpbCBkaSBiZXJiYWdhaSBzZWdtZW4gcGVuZ2d1bmENCiogQW5hbGlzaXMgdHJlbmQgd2FrdHUgdW50dWsgbWVsaWhhdCBwb2xhIHBlcnViYWhhbg0KKiBFdmFsdWFzaSBrdWFsaXRhcyBiZWxhamFyLCBidWthbiBoYW55YSBkdXJhc2kNCiogUGVydGltYmFuZ2FuIGZha3RvciBla3N0ZXJuYWwgKG11c2ltIHVqaWFuLCBsaWJ1cmFuLCBkbGwuKQ0KDQoqKlBlc2FuIHVudHVrIFN0YWtlaG9sZGVyOioqDQoNCiJBbmFsaXNpcyBzdGF0aXN0aWsgbWVuZ3VuZ2thcGthbiBiYWh3YSByYXRhLXJhdGEgd2FrdHUgYmVsYWphciBwZW5nZ3VuYSBhZGFsYWggMTE2IG1lbml0LCBiZXJiZWRhIHNpZ25pZmlrYW4gZGFyaSBrbGFpbSAxMjAgbWVuaXQgKHAgPSAwLjAzMykuIEthbWkgbWVyZWtvbWVuZGFzaWthbiBwZW55ZXN1YWlhbiBrbGFpbSBkYW4gaW52ZXN0aWdhc2kgbGViaWggbGFuanV0IHVudHVrIG1lbWFoYW1pIGZha3Rvci1mYWt0b3IgeWFuZyBtZW1wZW5nYXJ1aGkgd2FrdHUgYmVsYWphciBwZW5nZ3VuYS4iDQoNCjwvZGl2PiANCg0KLS0tDQoNCjxkaXYgY2xhc3M9ImV4cGxhbmF0aW9uLWJveCI+DQoNCiMgU3R1ZGkgS2FzdXMgMg0KDQojIyBVamktVCBTYXR1IFNhbXBlbCAoz4MgVGlkYWsgRGlrZXRhaHVpLCBTYW1wZWwgS2VjaWwpDQoNClNlYnVhaCBUaW0gUmlzZXQgVVggbWVueWVsaWRpa2kgYXBha2FoIHJhdGEtcmF0YSB3YWt0dSBwZW55ZWxlc2FpYW4gdHVnYXMgc2VidWFoIGFwbGlrYXNpIGJhcnUgYmVyYmVkYSBkYXJpIDEwIG1lbml0Lg0KDQpEYXRhIGJlcmlrdXQgZGlrdW1wdWxrYW4gZGFyaSAxMCBwZW5nZ3VuYToNCg0KJCQ5LjIsXDsgMTAuNSxcOyA5LjgsXDsgMTAuMSxcOyA5LjYsXDsgMTAuMyxcOyA5LjksXDsgOS43LFw7IDEwLjAsXDsgOS41JCQNCg0KIyMgVHVnYXMNCg0KMS4gRGVmaW5pc2lrYW4gSOKCgCBkYW4gSOKCgSAoZHVhLWFyYWggLyB0d28tdGFpbGVkKS4NCjIuIFRlbnR1a2FuIHVqaSBoaXBvdGVzaXMgeWFuZyBzZXN1YWkuDQozLiBIaXR1bmcgc3RhdGlzdGlrLXQgZGFuIG5pbGFpLXAgZGVuZ2FuICRcYWxwaGEgPSAwLjA1JC4NCjQuIEJ1YXRsYWgga2VwdXR1c2FuIHN0YXRpc3Rpay4NCjUuIEplbGFza2FuIGJhZ2FpbWFuYSB1a3VyYW4gc2FtcGVsIG1lbXBlbmdhcnVoaSBrZWFuZGFsYW4gaW5mZXJlbnNpLg0KDQojIyBKYXdhYg0KDQojIyMgRm9ybXVsYXNpIEhpcG90ZXNpcw0KDQoqKkhpcG90ZXNpcyBOb2wgKEjigoApOioqDQoNCs68ID0gMTAgbWVuaXQNCg0KQXJ0aW55YSwgUmF0YS1yYXRhIHdha3R1IHBlbnllbGVzYWlhbiB0dWdhcyBzYW1hIGRlbmdhbiAxMCBtZW5pdA0KDQoqKkhpcG90ZXNpcyBBbHRlcm5hdGlmIChI4oKBKToqKg0KDQrOvCDiiaAgMTAgbWVuaXQNCg0KQXJ0aW55YSwgUmF0YS1yYXRhIHdha3R1IHBlbnllbGVzYWlhbiB0dWdhcyBiZXJiZWRhIGRhcmkgMTAgbWVuaXQNCg0KKipKZW5pcyB1amk6KiogRHVhIGFyYWggKHR3by10YWlsZWQpIGthcmVuYSBpbmdpbiBtZW5nZXRhaHVpIGFwYWthaCBhZGEgcGVyYmVkYWFuIChsZWJpaCBjZXBhdCBhdGF1IGxlYmloIGxhbWJhdCkgdGFucGEgYXJhaCBzcGVzaWZpay4NCg0KIyMjIFBlbWlsaWhhbiBVamkgU3RhdGlzdGlrDQoNCioqVWppLVQgU2F0dSBTYW1wZWwgZGlwaWxpaCBkZW5nYW4gYWxhc2FuOioqDQoNCiogU3RhbmRhciBkZXZpYXNpIHBvcHVsYXNpIHRpZGFrIGRpa2V0YWh1aSAoz4MgdW5rbm93bikNCiogVWt1cmFuIHNhbXBlbCBrZWNpbCAobiA9IDEwIDwgMzApDQoqIERhdGEgZGlhc3Vtc2lrYW4gYmVyYXNhbCBkYXJpIHBvcHVsYXNpIGJlcmRpc3RyaWJ1c2kgbm9ybWFsDQoqIE1lbmd1amkgbWVhbiBzYW1wZWwgdGVyaGFkYXAgbmlsYWkgc3Blc2lmaWsNCg0KKipBbHRlcm5hdGlmIHlhbmcgdGlkYWsgY29jb2s6KioNCg0KKiBVamktWjogdGlkYWsgY29jb2sga2FyZW5hIM+DIHRpZGFrIGRpa2V0YWh1aQ0KKiBVamkgbm9uLXBhcmFtZXRyaWs6IGRhdGEgZGlhc3Vtc2lrYW4gbm9ybWFsDQoNCiMjIyBQZXJoaXR1bmdhbiBTdGF0aXN0aWsgVWppIGRhbiBOaWxhaS1wDQoNCioqRGF0YSB3YWt0dSBwZW55ZWxlc2FpYW4gKG1lbml0KToqKg0KOS4yLCAxMC41LCA5LjgsIDEwLjEsIDkuNiwgMTAuMywgOS45LCA5LjcsIDEwLjAsIDkuNQ0KDQoqKkxhbmdrYWggcGVyaGl0dW5nYW46KioNCg0KMS4gSGl0dW5nIHJhdGEtcmF0YSBzYW1wZWwgJCh4KTokDQogICAkJHjMhCA9ICg5LjIgKyAxMC41ICsgOS44ICsgMTAuMSArIDkuNiArIDEwLjMgKyA5LjkgKyA5LjcgKyAxMC4wICsgOS41KSAvIDEwJCQNCiAgICAgICQkeMyEID0gOTkuNiAvIDEwID0gOS45NiBtZW5pdCQkDQoyLiBIaXR1bmcgc3RhbmRhciBkZXZpYXNpIHNhbXBlbCAkKHMpOiQNCg0KICAgJCRzID0g4oiaW86jKHjhtaIgLSB4zIQpwrIvKG4tMSldIOKJiCAwLjM2NCBtZW5pJCR0DQogICANCjMuIEhpdHVuZyBzdGFuZGFyZCBlcnJvciAkKFNFKTokDQoNCiAgICQkU0UgPSBzIC8g4oiabiA9IDAuMzY0IC8g4oiaMTAg4omIIDAuMTE1JCQNCiAgIA0KNC4gSGl0dW5nIHN0YXRpc3RpayB0Og0KDQogICAkJHQgPSAoeMyEIC0gzrzigoApIC8gU0UgPSAoOS45NiAtIDEwKSAvIDAuMTE1ID0gLTAuMDQgLyAwLjExNSDiiYggLTAuMzQ4JCQNCiAgIA0KNS4gRGVyYWphdCBrZWJlYmFzYW4gJChkZik6JA0KDQogICAkJGRmID0gbiAtIDEgPSAxMCAtIDEgPSA5JCQNCiAgIA0KNi4gTmlsYWktcCAoZHVhIGFyYWgpOg0KDQogICQkIHAtdmFsdWUgPSAyIMOXIFAodCA8IC0wLjM0OCB8IGRmPTkpIOKJiCAwLjczNSQkDQogICANCjcuIE5pbGFpIHQga3JpdGlzICQozrEgPSAwLjA1LCBkZiA9IDkpOiQNCg0KICAgdF9rcml0aXMgPSDCsTIuMjYyDQoNCiMjIyBLZXB1dHVzYW4gU3RhdGlzdGlrDQoNCioqS3JpdGVyaWEga2VwdXR1c2FuOioqDQoNCiogSmlrYSB8dHwgPiAyLjI2MiBhdGF1IHAtdmFsdWUgPCAwLjA1IOKGkiBUb2xhayBI4oKADQoqIEppa2EgfHR8IOKJpCAyLjI2MiBhdGF1IHAtdmFsdWUg4omlIDAuMDUg4oaSIEdhZ2FsIHRvbGFrIEjigoANCg0KKipIYXNpbCBwZXJiYW5kaW5nYW46KioNCg0KKiB8dHwgPSAwLjM0OCA8IDIuMjYyDQoqIHAtdmFsdWUgPSAwLjczNSA+IDAuMDUNCg0KKipLZXB1dHVzYW46IEdBR0FMIFRPTEFLIEjigoAqKg0KDQojIyMgUGVuZ2FydWggVWt1cmFuIFNhbXBlbCBwYWRhIEtlYW5kYWxhbiBJbmZlcmVuc2kNCg0KRWZlayBVa3VyYW4gU2FtcGVsIEtlY2lsIChuID0gMTApOg0KDQoqKktldGVyYmF0YXNhbjoqKg0KDQoqIFBvd2VyIHN0YXRpc3RpayByZW5kYWggLSBrZW11bmdraW5hbiBnYWdhbCBtZW5kZXRla3NpIHBlcmJlZGFhbiB5YW5nIG55YXRhIChUeXBlIElJIGVycm9yIHRpbmdnaSkNCiogRXN0aW1hc2kgdmFyaWFiaWxpdGFzIGt1cmFuZyBwcmVzaXNpIC0gc3RhbmRhciBlcnJvciBiZXNhcg0KKiBTZW5zaXRpZiB0ZXJoYWRhcCBvdXRsaWVyIC0gc2F0dSBkYXRhIGVrc3RyZW0gYmlzYSBtZW5ndWJhaCBoYXNpbCBzaWduaWZpa2FuDQoqIERpc3RyaWJ1c2kgdCBsZWJpaCBsZWJhciAtIG5pbGFpIGtyaXRpcyBsZWJpaCBiZXNhciBkaWJhbmRpbmcgZGlzdHJpYnVzaSBub3JtYWwNCg0KKipEYW1wYWsgcGFkYSBTdHVkaSBJbmk6KioNCg0KKiBEZW5nYW4gbiA9IDEwLCBidXR1aCBwZXJiZWRhYW4geWFuZyBzYW5nYXQgYmVzYXIgdW50dWsgbWVuY2FwYWkgc2lnbmlmaWthbnNpDQoqIE1hcmdpbiBvZiBlcnJvciBsZWJhciAowrEyLjI2MiDDlyBTRSDiiYggwrEwLjI2IG1lbml0KQ0KKiBJbnRlcnZhbCBrZXBlcmNheWFhbiA5NSUgbGViYXI6IHNla2l0YXIgOS43MCAtIDEwLjIyIG1lbml0DQoNCioqSmlrYSBVa3VyYW4gU2FtcGVsIERpcGVyYmVzYXI6KioNCg0KbiA9IDMwOg0KDQoqIHRfa3JpdGlzIOKJiCDCsTIuMDQ1IChsZWJpaCBrZWNpbCBkYXJpIMKxMi4yNjIpDQoqIFBvd2VyIG1lbmluZ2thdCwgZGV0ZWtzaSBwZXJiZWRhYW4gbGViaWggc2Vuc2l0aWYNCiogRXN0aW1hc2kgbGViaWggc3RhYmlsDQoNCm4gPSAxMDA6DQoNCiogdF9rcml0aXMg4omIIMKxMS45ODQgKG1lbmRla2F0aSBaID0gwrExLjk2KQ0KKiBQb3dlciBzYW5nYXQgdGluZ2dpDQoqIEVzdGltYXNpIHNhbmdhdCBwcmVzaXNpDQoNCioqUHJpbnNpcCBVbXVtOioqDQoNCiogU2FtcGVsIGxlYmloIGJlc2FyIOKGkiBlc3RpbWFzaSBsZWJpaCBwcmVzaXNpIOKGkiBpbmZlcmVuc2kgbGViaWggYW5kYWwNCiogU2FtcGVsIGtlY2lsIOKGkiBsZWJpaCBrb25zZXJ2YXRpZiDihpIgYnV0dWggcGVyYmVkYWFuIGxlYmloIGJlc2FyIHVudHVrIHNpZ25pZmlrYW4NCiogUnVsZSBvZiB0aHVtYjogbiDiiaUgMzAgdW50dWsgcGVuZGVrYXRhbiBkaXN0cmlidXNpIG5vcm1hbA0KDQo8L2Rpdj4gDQoNCi0tLQ0KDQo8ZGl2IGNsYXNzPSJleHBsYW5hdGlvbi1ib3giPg0KDQojIFN0dWRpIEthc3VzIDMNCg0KIyMgVWppLVQgRHVhIFNhbXBlbCAoUGVuZ3VqaWFuIEEvQikNCg0KU2VidWFoIHRpbSBhbmFsaXRpayBwcm9kdWsgbWVsYWt1a2FuIHBlbmd1amlhbiBBL0IgdW50dWsgbWVtYmFuZGluZ2thbiByYXRhLXJhdGEgZHVyYXNpIHNlc2kgKG1lbml0KSBhbnRhcmEgZHVhIHZlcnNpIGhhbGFtYW4gYXJhaGFuIChsYW5kaW5nIHBhZ2UpLg0KDQpWZXJzaSBVa3VyYW4gU2FtcGVsIChuKSBSYXRhLXJhdGEgU2ltcGFuZ2FuIEJha3U6DQoNCmBgYHtyLCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KDQpsaWJyYXJ5KGtuaXRyKQ0KbGlicmFyeShrYWJsZUV4dHJhKQ0KDQpkYXRhX2FiIDwtIGRhdGEuZnJhbWUoDQogIFZlcnNpb24gPSBjKCJBIiwgIkIiKSwNCiAgbiA9IGMoMjUsIDI1KSwNCiAgTWVhbiA9IGMoNC44LCA1LjQpLA0KICBTRCA9IGMoMS4yLCAxLjQpDQopDQoNCmthYmxlKGRhdGFfYWIsIA0KICAgICAgY29sLm5hbWVzID0gYygiVmVyc2lvbiIsICJTYW1wbGUgU2l6ZSAobikiLCAiTWVhbiIsICJTdGFuZGFyZCBEZXZpYXRpb24iKSwNCiAgICAgIGFsaWduID0gYygiYyIsICJjIiwgImMiLCAiYyIpKSAlPiUNCiAga2FibGVfc3R5bGluZygNCiAgICBib290c3RyYXBfb3B0aW9ucyA9IGMoInN0cmlwZWQiLCAiYm9yZGVyZWQiLCAiaG92ZXIiKSwNCiAgICBmdWxsX3dpZHRoID0gRkFMU0UsDQogICAgcG9zaXRpb24gPSAiY2VudGVyIiwNCiAgICBmb250X3NpemUgPSAxNA0KICApICU+JQ0KICByb3dfc3BlYygwLCBib2xkID0gVFJVRSwgYmFja2dyb3VuZCA9ICIjMzQ5OGRiIiwgY29sb3IgPSAid2hpdGUiKQ0KDQpgYGANCg0KIyMgVHVnYXMNCg0KMS4gUnVtdXNrYW4gaGlwb3Rlc2lzIG5vbCBkYW4gaGlwb3Rlc2lzIGFsdGVybmF0aWYuDQoyLiBJZGVudGlmaWthc2kgamVuaXMgdWppLXQgeWFuZyBkaXBlcmx1a2FuLg0KMy4gSGl0dW5nIHN0YXRpc3RpayB1amkgZGFuIG5pbGFpLXAuDQo0LiBUYXJpayBrZXNpbXB1bGFuIHN0YXRpc3RpayBkZW5nYW4gJFxhbHBoYSA9IDAuMDUkLg0KNS4gSW50ZXJwcmV0YXNpa2FuIGhhc2lsbnlhIHVudHVrIHBlbmdhbWJpbGFuIGtlcHV0dXNhbiBwcm9kdWsuDQoNCiMjIEphd2FiDQoNCiMjIyBGb3JtdWxhc2kgSGlwb3Rlc2lzDQoNCioqSGlwb3Rlc2lzIE5vbCAoSOKCgCk6KioNCg0KJM68X0EgPSDOvF9CJA0KDQpBcnRpbnlhLCBUaWRhayBhZGEgcGVyYmVkYWFuIHJhdGEtcmF0YSBkdXJhc2kgc2VzaSBhbnRhcmEgdmVyc2kgQSBkYW4gdmVyc2kgQg0KDQoqKkhpcG90ZXNpcyBBbHRlcm5hdGlmIChI4oKBKToqKg0KDQokzrxfQSDiiaAgzrxfQiQNCg0KQXJ0aW55YSwgQWRhIHBlcmJlZGFhbiByYXRhLXJhdGEgZHVyYXNpIHNlc2kgYW50YXJhIHZlcnNpIEEgZGFuIHZlcnNpIEINCg0KKipKZW5pcyB1amk6KiogRHVhIGFyYWggKHR3by10YWlsZWQpIGthcmVuYSBpbmdpbiBtZW5nZXRhaHVpIGFwYWthaCBhZGEgcGVyYmVkYWFuICh0YW5wYSBtZW5lbnR1a2FuIG1hbmEgeWFuZyBsZWJpaCBiYWlrKS4NCg0KIyMjIElkZW50aWZpa2FzaSBKZW5pcyBVamktVA0KDQoqKlVqaS1UIER1YSBTYW1wZWwgSW5kZXBlbmRlbiBkZW5nYW4gYXN1bXNpOioqDQoNCiogU2FtcGVsIGluZGVwZW5kZW46IFBlbmdndW5hIHZlcnNpIEEgZGFuIEIgYmVyYmVkYQ0KKiBWYXJpYW5zIGRpYXN1bXNpa2FuIHRpZGFrIHNhbWE6IEthcmVuYSBTRCBiZXJiZWRhICgxLjIgdnMgMS40KQ0KKiBVa3VyYW4gc2FtcGVsIHNhbWE6IG5fQSA9IG5fQiA9IDI1DQoqIERpc3RyaWJ1c2kgbWVuZGVrYXRpIG5vcm1hbDogRGVuZ2FuIG4gPSAyNSwgZGlzdHJpYnVzaSBzYW1wbGluZyBtZWFuIG1lbmRla2F0aSBub3JtYWwNCg0KKipVamkgeWFuZyBkaWd1bmFrYW46KiogV2VsY2gncyB0LXRlc3QgKGthcmVuYSB2YXJpYW5zIHRpZGFrIGRpYXN1bXNpa2FuIHNhbWEpDQoNCiMjIyBQZXJoaXR1bmdhbiBTdGF0aXN0aWsgVWppIGRhbiBOaWxhaS1wDQoNCioqRGF0YSB5YW5nIGRpa2V0YWh1aToqKg0KDQoqIFZlcnNpIEE6IG7igoEgPSAyNSwgeMyE4oKBID0gNC44LCBz4oKBID0gMS4yDQoqIFZlcnNpIEI6IG7igoIgPSAyNSwgeMyE4oKCID0gNS40LCBz4oKCID0gMS40DQoqIM6xID0gMC4wNQ0KDQoqKkxhbmdrYWggcGVyaGl0dW5nYW46KioNCg0KMS4gSGl0dW5nIHNlbGlzaWggbWVhbjoNCg0KICAgJCR4zITigoIgLSB4zITigoEgPSA1LjQgLSA0LjggPSAwLjYgbWVuaXQkJA0KICAgDQoyLiBIaXR1bmcgc3RhbmRhcmQgZXJyb3IgJChTRSk6JA0KDQpTRSA9IOKImihz4oKBwrIvbuKCgSArIHPigoLCsi9u4oKCKSA9IOKImigxLjLCsi8yNSArIDEuNMKyLzI1KSA9IOKImigwLjA1NzYgKyAwLjA3ODQpID0g4oiaMC4xMzYgPSAwLjM2OQ0KICAgDQozLiBIaXR1bmcgc3RhdGlzdGlrIHQ6DQoNCiAgICQkdCA9ICh4zITigoIgLSB4zITigoEpIC8gU0UgPSAwLjYgLyAwLjM2OSDiiYggMS42MjUkJA0KICAgDQo0LiBIaXR1bmcgZGVyYWphdCBrZWJlYmFzYW4gKGRmKSBkZW5nYW4gZm9ybXVsYSBXZWxjaC1TYXR0ZXJ0aHdhaXRlOg0KDQogICAkJGRmIOKJiCA0Ni41IChkaWJ1bGF0a2FuIGtlIGJhd2FoIG1lbmphZGkgNDYpJCQNCiAgIA0KNS4gSGl0dW5nIG5pbGFpLXAgKGR1YSBhcmFoKToNCg0KICAgJCRwLXZhbHVlID0gMiDDlyBQKHQgPiAxLjYyNSB8IGRmIOKJiCA0Nikg4omIIDAuMTExJCQNCiAgIA0KNi4gTmlsYWkgdCBrcml0aXMgJCjOsSA9IDAuMDUsIGRmID0gNDYpOiQNCg0KICAgdF9rcml0aXMg4omIIMKxMi4wMTMNCg0KIyMjIEtlcHV0dXNhbiBTdGF0aXN0aWsNCg0KKipLcml0ZXJpYSBrZXB1dHVzYW46KioNCg0KKiBKaWthIHx0fCA+IDIuMDEzIGF0YXUgcC12YWx1ZSA8IDAuMDUg4oaSIFRvbGFrIEjigoANCiogSmlrYSB8dHwg4omkIDIuMDEzIGF0YXUgcC12YWx1ZSDiiaUgMC4wNSDihpIgR2FnYWwgdG9sYWsgSOKCgA0KDQoqKkhhc2lsIHBlcmJhbmRpbmdhbjoqKg0KDQoqICR8dHwgPSAxLjYyNSA8IDIuMDEzJA0KKiAkcC12YWx1ZSA9IDAuMTExID4gMC4wNSQNCg0KKipLZXB1dHVzYW46KiogR2FnYWwgVG9sYWsgSOKCgA0KDQojIyMgSW50ZXJwcmV0YXNpIHVudHVrIFBlbmdhbWJpbGFuIEtlcHV0dXNhbiBQcm9kdWsNCg0KKipJbnRlcnByZXRhc2kgU3RhdGlzdGlrOioqDQoNCiogVGlkYWsgYWRhIGJ1a3RpIHN0YXRpc3RpayB5YW5nIGN1a3VwIHVudHVrIG1lbnlhdGFrYW4gYmFod2EgZHVyYXNpIHNlc2kgYmVyYmVkYSBhbnRhcmEgdmVyc2kgQSBkYW4gQg0KKiBQZXJiZWRhYW4gcmF0YS1yYXRhICgwLjYgbWVuaXQpIHRpZGFrIHNpZ25pZmlrYW4gc2VjYXJhIHN0YXRpc3RpayBwYWRhIHRpbmdrYXQga2VwZXJjYXlhYW4gOTUlDQoqIFByb2JhYmlsaXRhcyBtZW5kYXBhdGthbiBoYXNpbCBpbmkgamlrYSB0aWRhayBhZGEgcGVyYmVkYWFuIHNlYmVuYXJueWEgYWRhbGFoIDExLjElDQoNCiMjIyMgSW1wbGlrYXNpIHVudHVrIFRpbSBQcm9kdWs6DQoNCioqVGVtdWFuIEt1bmNpOioqDQoNCjEuIFRpZGFrIGFkYSB3aW5uZXIgY2xlYXI6IEJhaWsgdmVyc2kgQSBtYXVwdW4gQiB0aWRhayBtZW51bmp1a2thbiBwZXJmb3JtYSB5YW5nIHNpZ25pZmlrYW4gYmVyYmVkYQ0KDQoyLiBFZmZlY3Qgc2l6ZSBrZWNpbDogUGVyYmVkYWFuIDAuNiBtZW5pdCAo4omIMTAlIGRhcmkgbWVhbikgbXVuZ2tpbiByZWxldmFuIHNlY2FyYSBwcmFrdGlzIHRldGFwaSB0aWRhayBzaWduaWZpa2FuIHN0YXRpc3Rpaw0KDQozLiBQb3dlciB0ZXN0IG11bmdraW4gcmVuZGFoOiBEZW5nYW4gbiA9IDI1IHBlciBncnVwLCBrZW1hbXB1YW4gbWVuZGV0ZWtzaSBwZXJiZWRhYW4ga2VjaWwgdGVyYmF0YXMNCg0KKipSZWtvbWVuZGFzaSBBa3NpOioqDQoNCioqT3BzaSAxOioqIExhbmp1dGthbiBkZW5nYW4gVmVyc2kgQiAoS29uc2VydmF0aWYpDQoNCiogKipBbGFzYW46KiogUmF0YS1yYXRhIGxlYmloIHRpbmdnaSAoNS40IHZzIDQuOCBtZW5pdCkNCiogKipSaXNpa286KiogUGVyYmVkYWFuIHRpZGFrIHNpZ25pZmlrYW4sIGJpc2Ega2FyZW5hIHJhbmRvbSB2YXJpYXRpb24NCiogKipUaW5kYWthbjoqKiBUZXJ1c2thbiBkZW5nYW4gQiwgbW9uaXRvciBtZXRyaWNzIGxhaW4NCg0KKipPcHNpIDI6KiogTGFrdWthbiBUZXN0aW5nIExhbmp1dGFuDQoNCiogKipBbGFzYW46KiogUGVyYmVkYWFuIHByYWt0aXMgKDAuNiBtZW5pdCkgbXVuZ2tpbiBtZWFuaW5nZnVsDQoqICoqUmlzaWtvOioqIE1lbWJ1dHVoa2FuIHdha3R1IGRhbiByZXNvdXJjZXMgdGFtYmFoYW4NCiogKipUaW5kYWthbjoqKg0KDQogICogVGluZ2thdGthbiBzYW1wbGUgc2l6ZSAobiDiiaUgNTAgcGVyIGdydXApDQogICogVGVzdCBkZW5nYW4gdmFyaWFzaSB5YW5nIGxlYmloIGVrc3RyZW0NCiAgKiBNb25pdG9yIG1ldHJpY3Mgc2VrdW5kZXIgKGNvbnZlcnNpb24gcmF0ZSwgYm91bmNlIHJhdGUpDQoNCioqT3BzaSAzOioqIFJvbGxiYWNrIGtlIFZlcnNpIEEgYXRhdSBTcGxpdCBUcmFmZmljDQoNCiogKipBbGFzYW46KiogVGlkYWsgYWRhIGJ1a3RpIEIgbGViaWggYmFpaw0KKiAqKlJpc2lrbzoqKiBLZWhpbGFuZ2FuIHBvdGVuc2kgaW1wcm92ZW1lbnQNCiogKipUaW5kYWthbjoqKiBQZXJ0YWhhbmthbiBBIGF0YXUgc3BsaXQgNTAvNTANCg0KKipBbmFsaXNpcyBMYW5qdXRhbiB5YW5nIERpc2FyYW5rYW46KioNCg0KMS4gKipQb3dlciBhbmFseXNpczoqKiBIaXR1bmcgc2FtcGxlIHNpemUgeWFuZyBkaWJ1dHVoa2FuIHVudHVrIG1lbmRldGVrc2kgcGVyYmVkYWFuIDAuNiBtZW5pdA0KDQoyLiAqKlNlZ21lbnRhc2kgcGVuZ2d1bmE6KiogQW5hbGlzaXMgcGVyYmVkYWFuIGJlcmRhc2Fya2FuIGRlbW9ncmFmaS9wZXJpbGFrdQ0KDQozLiAqKk1ldHJpY3MgdGFtYmFoYW46KiogQ29udmVyc2lvbiByYXRlLCBlbmdhZ2VtZW50LCB1c2VyIHNhdGlzZmFjdGlvbg0KDQo0LiAqKkEvQiB0ZXN0IG11bHRpdmFyaWF0OioqIFRlc3QgZWxlbWVuIGluZGl2aWR1YWwgaGFsYW1hbg0KDQoqKlBlc2FuIHVudHVrIFN0YWtlaG9sZGVyOioqDQoNCiJBL0IgdGVzdCBtZW51bmp1a2thbiB2ZXJzaSBCIG1lbWlsaWtpIGR1cmFzaSBzZXNpIHJhdGEtcmF0YSAwLjYgbWVuaXQgbGViaWggcGFuamFuZyBkYXJpIHZlcnNpIEEsIG5hbXVuIHBlcmJlZGFhbiBpbmkgdGlkYWsgc2lnbmlmaWthbiBzZWNhcmEgc3RhdGlzdGlrIChwID0gMC4xMTEpLiBLYW1pIHRpZGFrIG1lbWlsaWtpIGJ1a3RpIGN1a3VwIHVudHVrIG1lbnlhdGFrYW4gQiBsZWJpaCBiYWlrLiBSZWtvbWVuZGFzaTogUGVydGltYmFuZ2thbiB0ZXN0aW5nIGRlbmdhbiBzYW1wbGUgc2l6ZSBsZWJpaCBiZXNhciBhdGF1IGV2YWx1YXNpIG1ldHJpY3MgdGFtYmFoYW4gc2ViZWx1bSBtZW1idWF0IGtlcHV0dXNhbiBmaW5hbC4iDQoNCjwvZGl2PiANCg0KLS0tDQoNCjxkaXYgY2xhc3M9ImV4cGxhbmF0aW9uLWJveCI+DQoNCiMgU3R1ZGkgS2FzdXMgNA0KDQojIyBVamkgQ2hpLVNxdWFyZSBJbmRlcGVuZGVuc2kNCg0KU2VidWFoIHBlcnVzYWhhYW4gZS1jb21tZXJjZSBtZW5lbGl0aSBhcGFrYWggamVuaXMgcGVyYW5na2F0IGJlcmh1YnVuZ2FuIGRlbmdhbiBwcmVmZXJlbnNpIG1ldG9kZSBwZW1iYXlhcmFuLg0KDQpgYGB7ciwgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCg0KbGlicmFyeShrbml0cikNCmxpYnJhcnkoa2FibGVFeHRyYSkNCg0KIyBEYXRhIHVudHVrIHN0dWRpIGthc3VzIDQNCmRhdGFfY2hpIDwtIGRhdGEuZnJhbWUoDQogIGBEZXZpY2UgLyBQYXltZW50YCA9IGMoIk1vYmlsZSIsICJEZXNrdG9wIiksDQogIGBFLVdhbGxldGAgPSBjKDEyMCwgNjApLA0KICBgQ3JlZGl0IENhcmRgID0gYyg4MCwgOTApLA0KICBgQ2FzaCBvbiBEZWxpdmVyeWAgPSBjKDUwLCA0MCksDQogIGNoZWNrLm5hbWVzID0gRkFMU0UNCikNCg0KIyBUYWJlbCBzZWRlcmhhbmEgZGVuZ2FuIGJvcmRlcg0Ka2FibGUoZGF0YV9jaGksDQogICAgICBhbGlnbiA9IGMoImwiLCAiYyIsICJjIiwgImMiKSkgJT4lDQogIGthYmxlX3N0eWxpbmcoDQogICAgYm9vdHN0cmFwX29wdGlvbnMgPSAiYm9yZGVyZWQiLA0KICAgIGZ1bGxfd2lkdGggPSBGQUxTRSwNCiAgICBwb3NpdGlvbiA9ICJjZW50ZXIiLA0KICAgIGZvbnRfc2l6ZSA9IDE0DQogICkgJT4lDQogIHJvd19zcGVjKDAsIGJvbGQgPSBUUlVFLCBiYWNrZ3JvdW5kID0gIiMzNDk4ZGIiLCBjb2xvciA9ICIjZWNmMGYxIiklPiUNCiAgcm93X3NwZWMoMSwgYm9sZCA9IFRSVUUsIGJhY2tncm91bmQgPSAid2hpdGUiKSU+JQ0KICBjb2x1bW5fc3BlYygxLCBib2xkID0gVFJVRSwgYmFja2dyb3VuZCA9ICJ3aGl0ZSIpDQoNCmBgYA0KDQojIyBUdWdhcw0KDQoxLiBOeWF0YWthbiBIaXBvdGVzaXMgTm9sIChI4oKAKSBkYW4gSGlwb3Rlc2lzIEFsdGVybmF0aWYgKEjigoEpLg0KMi4gSWRlbnRpZmlrYXNpIHVqaSBzdGF0aXN0aWsgeWFuZyBzZXN1YWkuDQozLiBIaXR1bmcgc3RhdGlzdGlrIENoaS1TcXVhcmUgKM+HwrIpLg0KNC4gVGVudHVrYW4gbmlsYWktcCBkZW5nYW4gJFxhbHBoYSA9IDAuMDUkLg0KNS4gSW50ZXJwcmV0YXNpa2FuIGhhc2lsbnlhIGRhbGFtIGthaXRhbm55YSBkZW5nYW4gc3RyYXRlZ2kgcGVtYmF5YXJhbiBkaWdpdGFsLg0KDQojIyBKYXdhYg0KDQojIyMgRm9ybXVsYXNpIEhpcG90ZXNpcw0KDQoqKkhpcG90ZXNpcyBOb2wgKEjigoApOioqDQoNClRpZGFrIGFkYSBodWJ1bmdhbiBhbnRhcmEgamVuaXMgcGVyYW5na2F0IGRhbiBwcmVmZXJlbnNpIG1ldG9kZSBwZW1iYXlhcmFuDQoNCioqQXJ0aW55YToqKiBQaWxpaGFuIG1ldG9kZSBwZW1iYXlhcmFuIHRpZGFrIHRlcmdhbnR1bmcgcGFkYSBqZW5pcyBwZXJhbmdrYXQgeWFuZyBkaWd1bmFrYW4NCg0KKipIaXBvdGVzaXMgQWx0ZXJuYXRpZiAoSOKCgSk6KioNCg0KQWRhIGh1YnVuZ2FuIGFudGFyYSBqZW5pcyBwZXJhbmdrYXQgZGFuIHByZWZlcmVuc2kgbWV0b2RlIHBlbWJheWFyYW4NCg0KKipBcnRpbnlhOioqIFBpbGloYW4gbWV0b2RlIHBlbWJheWFyYW4gdGVyZ2FudHVuZyBwYWRhIGplbmlzIHBlcmFuZ2thdCB5YW5nIGRpZ3VuYWthbg0KDQojIyMgUGVtaWxpaGFuIFVqaSBTdGF0aXN0aWsNCg0KKipVamkgQ2hpLVNxdWFyZSBJbmRlcGVuZGVuc2kgZGlwaWxpaCBrYXJlbmE6KioNCg0KKiAqKlZhcmlhYmVsIGthdGVnb3Jpa2FsOioqIEplbmlzIHBlcmFuZ2thdCAoTW9iaWxlL0Rlc2t0b3ApIGRhbiBtZXRvZGUgcGVtYmF5YXJhbiAoMyBrYXRlZ29yaSkNCiogKipEYXRhIGZyZWt1ZW5zaToqKiBEYXRhIGJlcnVwYSBqdW1sYWggKGNvdW50KSBidWthbiBwZW5ndWt1cmFuIGtvbnRpbnUNCiogKipNZW5ndWppIGh1YnVuZ2FuOioqIEJ1a2FuIHBlcmJlZGFhbiBtZWFuIGF0YXUgcHJvcG9yc2kNCiogKipBc3Vtc2k6KioNCg0KICAqIFNhbXBlbCBpbmRlcGVuZGVuDQogICogRXhwZWN0ZWQgZnJlcXVlbmN5IOKJpSA1IHVudHVrIHNldGlhcCBzZWwNCiAgKiBEYXRhIGJlcnVwYSBmcmVrdWVuc2kgYWt0dWFsDQoNCioqVGlkYWsgY29jb2sgbWVuZ2d1bmFrYW46KiogdC10ZXN0LCBBTk9WQSwgYXRhdSBrb3JlbGFzaSBrYXJlbmEgZGF0YSBidWthbiBudW1lcmlrIGtvbnRpbnUuDQoNCiMjIyBQZXJoaXR1bmdhbiBTdGF0aXN0aWsgQ2hpLVNxdWFyZQ0KDQpEYXRhIE9ic2VydmFzaToNCg0KYGBge3IsIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQoNCmxpYnJhcnkoa25pdHIpDQpsaWJyYXJ5KGthYmxlRXh0cmEpDQoNCiMgRGF0YSBkZW5nYW4gdG90YWwNCmRhdGFfY29tcGxldGUgPC0gZGF0YS5mcmFtZSgNCiAgYERldmljZSAvIFBheW1lbnRgID0gYygiTW9iaWxlIiwgIkRlc2t0b3AiLCAiVG90YWwiKSwNCiAgYEUtV2FsbGV0YCA9IGMoMTIwLCA2MCwgMTgwKSwNCiAgYENyZWRpdCBDYXJkYCA9IGMoODAsIDkwLCAxNzApLA0KICBgQ2FzaCBvbiBEZWxpdmVyeWAgPSBjKDUwLCA0MCwgOTApLA0KICBgVG90YWxgID0gYygyNTAsIDE5MCwgNDQwKSwNCiAgY2hlY2submFtZXMgPSBGQUxTRQ0KKQ0KDQojIFRhYmVsIGRlbmdhbiBzdHlsaW5nDQprYWJsZShkYXRhX2NvbXBsZXRlLA0KICAgICAgYWxpZ24gPSBjKCJsIiwgImMiLCAiYyIsICJjIiwgImMiKSkgJT4lDQogIGthYmxlX3N0eWxpbmcoDQogICAgYm9vdHN0cmFwX29wdGlvbnMgPSBjKCJib3JkZXJlZCIsICJzdHJpcGVkIiksDQogICAgZnVsbF93aWR0aCA9IEZBTFNFLA0KICAgIHBvc2l0aW9uID0gImNlbnRlciIsDQogICAgZm9udF9zaXplID0gMTQNCiAgKSAlPiUNCiAgcm93X3NwZWMoMCwgYm9sZCA9IFRSVUUsIGJhY2tncm91bmQgPSAiIzM0OThkYiIsIGNvbG9yID0gIndoaXRlIikgJT4lDQogIHJvd19zcGVjKDMsIGJvbGQgPSBUUlVFLCBiYWNrZ3JvdW5kID0gIiM3ZjhjOGQiLCBjb2xvciA9ICJ3aGl0ZSIpICU+JQ0KICBjb2x1bW5fc3BlYygxLCBib2xkID0gVFJVRSkgJT4lDQogIGNvbHVtbl9zcGVjKDUsIGJvbGQgPSBUUlVFLCBiYWNrZ3JvdW5kID0gIiM3ZjhjOGQiLGNvbG9yID0gIndoaXRlIikNCg0KYGBgDQoNCioqTGFuZ2thaCBwZXJoaXR1bmdhbjoqKg0KDQoxLiAqKkhpdHVuZyBFeHBlY3RlZCBGcmVxdWVuY3kgKEUpIHVudHVrIHNldGlhcCBzZWw6KioNCg0KKipSdW11czoqKiAkJEUgPSAoVG90YWwgYmFyaXMgw5cgVG90YWwga29sb20pIC8gVG90YWwga2VzZWx1cnVoYW4kJA0KDQogICAqIE1vYmlsZSAmIEUtV2FsbGV0OiAoMjUwIMOXIDE4MCkgLyA0NDAgPSAxMDIuMjcNCiAgICogTW9iaWxlICYgQ3JlZGl0IENhcmQ6ICgyNTAgw5cgMTcwKSAvIDQ0MCA9IDk2LjU5DQogICAqIE1vYmlsZSAmIENhc2ggb24gRGVsaXZlcnk6ICgyNTAgw5cgOTApIC8gNDQwID0gNTEuMTQNCiAgICogRGVza3RvcCAmIEUtV2FsbGV0OiAoMTkwIMOXIDE4MCkgLyA0NDAgPSA3Ny43Mw0KICAgKiBEZXNrdG9wICYgQ3JlZGl0IENhcmQ6ICgxOTAgw5cgMTcwKSAvIDQ0MCA9IDczLjQxDQogICAqIERlc2t0b3AgJiBDYXNoIG9uIERlbGl2ZXJ5OiAoMTkwIMOXIDkwKSAvIDQ0MCA9IDM4Ljg2DQogICANCjIuICoqSGl0dW5nIENoaS1TcXVhcmUgU3RhdGlzdGljOioqDQoNCioqUnVtdXM6KiogJCTPh8KyID0gzqNbKE8gLSBFKcKyIC8gRV0kJA0KDQoqIM+HwrIgPSAoMTIwLTEwMi4yNynCsi8xMDIuMjcgKyAoODAtOTYuNTkpwrIvOTYuNTkgKyAoNTAtNTEuMTQpwrIvNTEuMTQgKw0KICAgKDYwLTc3LjczKcKyLzc3LjczICsgKDkwLTczLjQxKcKyLzczLjQxICsgKDQwLTM4Ljg2KcKyLzM4Ljg2DQogICANCiogz4fCsiA9ICgxNy43M8KyLzEwMi4yNykgKyAoLTE2LjU5wrIvOTYuNTkpICsgKC0xLjE0wrIvNTEuMTQpICsNCiAgICgtMTcuNzPCsi83Ny43MykgKyAoMTYuNTnCsi83My40MSkgKyAoMS4xNMKyLzM4Ljg2KQ0KICAgDQoqIM+HwrIgPSAzLjA3ICsgMi44NSArIDAuMDMgKyA0LjA0ICsgMy43NSArIDAuMDMNCg0KKiDPh8KyIOKJiCAxMy43Nw0KDQozLiAqKkRlcmFqYXQgS2ViZWJhc2FuIChkZik6KioNCg0KKiBkZiA9IChqdW1sYWggYmFyaXMgLSAxKSDDlyAoanVtbGFoIGtvbG9tIC0gMSkgPSAoMi0xKSDDlyAoMy0xKSA9IDEgw5cgMiA9IDINCg0KIyMjIFBlbmVudHVhbiBOaWxhaS1wIGRhbiBLZXB1dHVzYW4NCg0KKipOaWxhaS1wOioqDQoNClVudHVrIM+HwrIgPSAxMy43NyBkZW5nYW4gZGYgPSAyOg0KDQoqIHAtdmFsdWUg4omIIDAuMDAxIChzYW5nYXQga2VjaWwpDQoNCioqTmlsYWkgS3JpdGlzIENoaS1TcXVhcmUgKM6xID0gMC4wNSwgZGYgPSAyKToqKg0KDQoqIM+HwrJfa3JpdGlzID0gNS45OTENCg0KKipLcml0ZXJpYSBLZXB1dHVzYW46KioNCg0KKiBKaWthIM+HwrIgPiA1Ljk5MSBhdGF1IHAtdmFsdWUgPCAwLjA1IOKGkiBUb2xhayBI4oKADQoqIEppa2Egz4fCsiDiiaQgNS45OTEgYXRhdSBwLXZhbHVlIOKJpSAwLjA1IOKGkiBHYWdhbCB0b2xhayBI4oKADQoNCioqSGFzaWwgUGVyYmFuZGluZ2FuOioqDQoNCiogz4fCsiA9IDEzLjc3ID4gNS45OTENCiogcC12YWx1ZSA9IDAuMDAxIDwgMC4wNQ0KDQoqKktlcHV0dXNhbjoqKiBUb2xhayBI4oKADQoNCiMjIyBJbnRlcnByZXRhc2kgdW50dWsgU3RyYXRlZ2kgUGVtYmF5YXJhbiBEaWdpdGFsDQoNCioqSW50ZXJwcmV0YXNpIFN0YXRpc3RpazoqKg0KDQoqIFRlcmRhcGF0IGh1YnVuZ2FuIHlhbmcgc2lnbmlmaWthbiBzZWNhcmEgc3RhdGlzdGlrIGFudGFyYSBqZW5pcyBwZXJhbmdrYXQgZGFuIHByZWZlcmVuc2kgbWV0b2RlIHBlbWJheWFyYW4NCiogUHJvYmFiaWxpdGFzIGhhc2lsIGluaSB0ZXJqYWRpIGppa2EgdGlkYWsgYWRhIGh1YnVuZ2FuIGhhbnlhIDAuMSUNCiogSHVidW5nYW4gaW5pIGJ1a2FuIGtlYmV0dWxhbiAocCA8IDAuMDAxKQ0KDQojIyMjIEFuYWxpc2lzIFBvbGEgSHVidW5nYW46DQoNCioqUHJlZmVyZW5zaSBCZXJkYXNhcmthbiBQZXJhbmdrYXQ6KioNCg0KMS4gTW9iaWxlIFVzZXJzIChuPTI1MCk6DQoNCiAgICogRS1XYWxsZXQgZG9taW5hbjogNDglICgxMjAvMjUwKSB2cyBleHBlY3RlZCA0MSUNCiAgICogQ3JlZGl0IENhcmQgcmVuZGFoOiAzMiUgdnMgZXhwZWN0ZWQgMzklDQogICAqIENhc2ggb24gRGVsaXZlcnk6IDIwJSB2cyBleHBlY3RlZCAyMCUNCiAgIA0KMi4gRGVza3RvcCBVc2VycyAobj0xOTApOg0KDQogICAqIENyZWRpdCBDYXJkIGRvbWluYW46IDQ3JSAoOTAvMTkwKSB2cyBleHBlY3RlZCAzOSUNCiAgICogRS1XYWxsZXQgcmVuZGFoOiAzMiUgdnMgZXhwZWN0ZWQgNDElDQogICAqIENhc2ggb24gRGVsaXZlcnk6IDIxJSB2cyBleHBlY3RlZCAyMCUNCg0KIyMjIyBJbXBsaWthc2kgU3RyYXRlZ2lzOg0KDQoxLiBVbnR1ayBNb2JpbGUgRXhwZXJpZW5jZToNCg0KKiBPcHRpbWFsa2FuIEUtV2FsbGV0OiBGaXR1ciBvbmUtdGFwIHBheW1lbnQsIFFSIGNvZGUgc2Nhbm5pbmcNCiogU2ltcGxpZnkgY2hlY2tvdXQ6IE1pbmltaXplIGZvcm0gZmlsbGluZywgYXV0b2ZpbGwgaW5mb3JtYXRpb24NCiogTW9iaWxlLWZpcnN0IGRlc2lnbjogQnV0dG9uIGJlc2FyLCB0b3VjaC1mcmllbmRseSBpbnRlcmZhY2UNCiogUHJvbW8ga2h1c3VzIG1vYmlsZTogQ2FzaGJhY2sgdW50dWsgcGVtYmF5YXJhbiBkaWdpdGFsDQoNCjIuIFVudHVrIERlc2t0b3AgRXhwZXJpZW5jZToNCg0KKiBIaWdobGlnaHQgQ3JlZGl0IENhcmQ6IFRhbXBpbGthbiBsb2dvIGthcnR1IGtyZWRpdCBsZWJpaCBwcm9taW5lbnQNCiogU2VjdXJlIHBheW1lbnQgZW1waGFzaXM6IEhpZ2hsaWdodCBzZWN1cml0eSBmZWF0dXJlcyAoM0QgU2VjdXJlLCBTU0wpDQoqIEZvcm0gb3B0aW1pemF0aW9uOiBBdXRvLWNvbXBsZXRlLCBzYXZlZCBjYXJkcyBmZWF0dXJlDQoqIERpZ2l0YWwgd2FsbGV0IGludGVncmF0aW9uOiBBcHBsZSBQYXksIEdvb2dsZSBQYXkgdW50dWsgYnJvd3Nlcg0KDQozLiBDcm9zcy1EZXZpY2UgU3RyYXRlZ3k6DQoNCiogU2F2ZWQgcHJlZmVyZW5jZXM6IFN5bmMgcGF5bWVudCBtZXRob2RzIGFjcm9zcyBkZXZpY2VzDQoqIFByb2dyZXNzaXZlIHByb2ZpbGluZzogQ29sbGVjdCBwYXltZW50IGluZm8gZ3JhZHVhbGx5DQoqIFBlcnNvbmFsaXplZCBvZmZlcnM6IEJlcmRhc2Fya2FuIGRldmljZSBkYW4gcGF5bWVudCBoaXN0b3J5DQoNCiMjIyMgUmVrb21lbmRhc2kgVGluZGFrYW4gUHJpb3JpdGFzOg0KDQoqKlByaW9yaXRhcyBUaW5nZ2kgKFExKToqKg0KDQoqIEltcGxlbWVudCBkZXZpY2UgZGV0ZWN0aW9uIHVudHVrIGN1c3RvbWl6ZSBwYXltZW50IG9wdGlvbnMNCiogQS9CIHRlc3QgY2hlY2tvdXQgZmxvdyB1bnR1ayBtYXNpbmctbWFzaW5nIGRldmljZQ0KKiBBbmFseXRpY3MgdHJhY2tpbmc6IHBheW1lbnQgbWV0aG9kIGJ5IGRldmljZSB0eXBlDQoNCioqUHJpb3JpdGFzIE1lbmVuZ2FoIChRMik6KioNCg0KKiBEZXZlbG9wIG1vYmlsZSB3YWxsZXQgcGFydG5lcnNoaXAgKEdvUGF5LCBPVk8sIERBTkEpDQoqIEVuaGFuY2VkIHNlY3VyaXR5IHVudHVrIGRlc2t0b3AgY3JlZGl0IGNhcmQgcGF5bWVudHMNCiogQ3VzdG9tZXIgZWR1Y2F0aW9uOiBtYW5mYWF0IG1hc2luZy1tYXNpbmcgcGF5bWVudCBtZXRob2QNCg0KKipQcmlvcml0YXMgUmVuZGFoIChRMyk6KioNCg0KKiBMb3lhbHR5IHByb2dyYW0gaW50ZWdyYXRpb24gZGVuZ2FuIHBheW1lbnQgbWV0aG9kcw0KKiBJbnRlcm5hdGlvbmFsIHBheW1lbnQgbWV0aG9kcyBvcHRpbWl6YXRpb24NCiogQWx0ZXJuYXRpdmUgcGF5bWVudCBtZXRob2RzIHJlc2VhcmNoDQoNCioqQnVzaW5lc3MgSW1wYWN0IEVzdGltYXNpOioqDQoNCiogQ29udmVyc2lvbiByYXRlIGltcHJvdmVtZW50OiA1LTEwJSBkZW5nYW4gcGF5bWVudCBtZXRob2QgcGVyc29uYWxpemF0aW9uDQoqIEF2ZXJhZ2Ugb3JkZXIgdmFsdWU6IFBvdGVuc2kgbmFpayAzLTUlIGRlbmdhbiBtZXRvZGUgcGVtYmF5YXJhbiB5YW5nIHRlcGF0DQoqIEN1c3RvbWVyIHNhdGlzZmFjdGlvbjogUGVuZ2FsYW1hbiBjaGVja291dCBsZWJpaCBzbW9vdGgNCiogT3BlcmF0aW9uYWwgZWZmaWNpZW5jeTogS3VyYW5naSBmYWlsZWQgdHJhbnNhY3Rpb25zDQoNCioqUGVzYW4gdW50dWsgU3Rha2Vob2xkZXI6KioNCg0KIkFuYWxpc2lzIG1lbnVuanVra2FuIGh1YnVuZ2FuIGt1YXQgYW50YXJhIGplbmlzIHBlcmFuZ2thdCBkYW4gcGlsaWhhbiBwZW1iYXlhcmFuLiBQZW5nZ3VuYSBtb2JpbGUgY2VuZGVydW5nIG1lbWlsaWggZS13YWxsZXQgKDQ4JSksIHNlZGFuZ2thbiBkZXNrdG9wIHVzZXJzIHByZWZlciBjcmVkaXQgY2FyZCAoNDclKS4gUmVrb21lbmRhc2kgc3RyYXRlZ2lzOiBQZXJzb25hbGl6ZSBwYXltZW50IG9wdGlvbnMgYmVyZGFzYXJrYW4gZGV2aWNlLCBkZW5nYW4gZm9rdXMgcGFkYSBtb2JpbGUgd2FsbGV0IG9wdGltaXphdGlvbiB1bnR1ayBwZW5nZ3VuYSBzbWFydHBob25lIGRhbiBzZWN1cmUgY3JlZGl0IGNhcmQgZXhwZXJpZW5jZSB1bnR1ayBkZXNrdG9wIHVzZXJzLiINCg0KPC9kaXY+IA0KDQotLS0NCg0KPGRpdiBjbGFzcz0iZXhwbGFuYXRpb24tYm94Ij4NCg0KIyBTdHVkaSBLYXN1cyA1DQoNCiMjIEdhbGF0IFRpcGUgSSBkYW4gR2FsYXQgVGlwZSBJSSAoS29uc2VwdHVhbCkNCg0KU2VidWFoIHN0YXJ0dXAgZmludGVjaCBtZW5ndWppIGFwYWthaCBhbGdvcml0bWEgcGVuZGV0ZWtzaSBwZW5pcHVhbiBiYXJ1IG1lbmd1cmFuZ2kgdHJhbnNha3NpIHBlbmlwdWFuLg0KDQoqIEjigoA6IEFsZ29yaXRtYSBiYXJ1IHRpZGFrIG1lbmd1cmFuZ2kgcGVuaXB1YW4uDQoqIEjigoE6IEFsZ29yaXRtYSBiYXJ1IG1lbmd1cmFuZ2kgcGVuaXB1YW4uDQoNCiMjIFR1Z2FzDQoNCjEuIEplbGFza2FuIEdhbGF0IFRpcGUgSSAozrEpIGRhbGFtIGtvbnRla3MgaW5pLg0KMi4gSmVsYXNrYW4gR2FsYXQgVGlwZSBJSSAozrIpIGRhbGFtIGtvbnRla3MgaW5pLg0KMy4gSWRlbnRpZmlrYXNpIGdhbGF0IG1hbmEgeWFuZyBsZWJpaCBtYWhhbCBkYXJpIHBlcnNwZWt0aWYgYmlzbmlzLg0KNC4gRGlza3VzaWthbiBiYWdhaW1hbmEgdWt1cmFuIHNhbXBlbCBtZW1wZW5nYXJ1aGkgR2FsYXQgVGlwZSBJSS4NCjUuIEplbGFza2FuIGh1YnVuZ2FuIGFudGFyYSDOsSwgzrIsIGRhbiBwb3dlciBzdGF0aXN0aWsuDQoNCiMjIEphd2FiDQoNCiMjIyBHYWxhdCBUaXBlIEkgKM6xKSBkYWxhbSBLb250ZWtzIEluaQ0KDQpHYWxhdCBUaXBlIEkgYWRhbGFoIGtlc2FsYWhhbiBrZXRpa2Ega2l0YSBtZW55aW1wdWxrYW4gYmFod2EgYWxnb3JpdG1hIGJhcnUgZWZla3RpZiBtZW5ndXJhbmdpIHBlbmlwdWFuLCBwYWRhaGFsIHNlYmVuYXJueWEgYWxnb3JpdG1hIHRlcnNlYnV0IHRpZGFrIG1lbWJlcmlrYW4gcGVyYmFpa2FuIGFwYSBwdW4uDQoNCioqQW5hbG9naW55YSBzZXBlcnRpOioqIEFsYXJtIGtlYmFrYXJhbiBiZXJidW55aSBwYWRhaGFsIHRpZGFrIGFkYSBrZWJha2FyYW4uIEtpdGEgYmVyZWFrc2ksIGV2YWt1YXNpLCBkYW4gbWVtYW5nZ2lsIHBldHVnYXMgcGVtYWRhbSwgcGFkYWhhbCBzZWJlbmFybnlhIHRpZGFrIHRlcmphZGkgYXBhLWFwYS4NCg0KKipLb25zZWt1ZW5zaSB1bnR1ayBzdGFydHVwIGZpbnRlY2g6KioNCg0KKiBNZW5naW1wbGVtZW50YXNpa2FuIGFsZ29yaXRtYSB5YW5nIHNlYmVuYXJueWEgdGlkYWsgZWZla3RpZg0KKiBNZW1idWFuZyBzdW1iZXIgZGF5YSB1bnR1ayBtYWludGVuYW5jZSBkYW4gdHJhaW5pbmcNCiogTWVyYXNhIGFtYW4gcGFkYWhhbCBzaXN0ZW0gdGV0YXAgcmVudGFuDQoqIEtlaGlsYW5nYW4ga2VzZW1wYXRhbiBtZW5jYXJpIHNvbHVzaSBsYWluIHlhbmcgbGViaWggYmFpaw0KDQoqKkNvbnRvaCBrb25rcmV0OioqIFNldGVsYWggaW1wbGVtZW50YXNpLCB0aW0gYmVycGlraXIgZnJhdWQgYmVya3VyYW5nIDMwJSwgcGFkYWhhbCBpdHUgaGFueWEgZmx1a3R1YXNpIGRhdGEgYmlhc2EuDQoNCiMjIyBHYWxhdCBUaXBlIElJICjOsikgZGFsYW0gS29udGVrcyBJbmkNCg0KR2FsYXQgVGlwZSBJSSBhZGFsYWgga2VzYWxhaGFuIGtldGlrYSBraXRhIG1lbnlpbXB1bGthbiBiYWh3YSBhbGdvcml0bWEgYmFydSB0aWRhayBlZmVrdGlmLCBwYWRhaGFsIHNlYmVuYXJueWEgYWxnb3JpdG1hIHRlcnNlYnV0IGJlbmFyLWJlbmFyIGJpc2EgbWVuZ3VyYW5naSBwZW5pcHVhbi4NCg0KKipBbmFsb2dpbnlhIHNlcGVydGk6KiogQWxhcm0ga2ViYWthcmFuIHRpZGFrIGJlcmJ1bnlpIHBhZGFoYWwgZ2VkdW5nIHRlcmJha2FyLiBLaXRhIHRpZGFrIG1lbGFrdWthbiBhcGEtYXBhLCBkYW4ga2ViYWthcmFuIG1lcnVzYWsgc2VnYWxhbnlhLg0KDQoqKktvbnNla3VlbnNpIHVudHVrIHN0YXJ0dXAgZmludGVjaDoqKg0KDQoqIFRpZGFrIG1lbmdpbXBsZW1lbnRhc2lrYW4gc29sdXNpIHlhbmcgc2ViZW5hcm55YSBiZWtlcmphDQoqIEtlcnVnaWFuIGZpbmFuc2lhbCB0ZXJ1cyBiZXJsYW5qdXQga2FyZW5hIHBlbmlwdWFuIHRpZGFrIHRlcmRldGVrc2kNCiogUmVwdXRhc2kgcnVzYWsga2FyZW5hIHNpc3RlbSBrZWFtYW5hbiBsZW1haA0KKiBLZWhpbGFuZ2FuIGtlcGVyY2F5YWFuIHBlbGFuZ2dhbg0KKiBCZXJwb3RlbnNpIGtlbmEgZGVuZGEgcmVndWxhdG9yDQoNCioqQ29udG9oIGtvbmtyZXQ6KiogQWxnb3JpdG1hIHNlYmVuYXJueWEgYmlzYSBtZW5ndXJhbmdpIGZyYXVkIDQwJSwgdGFwaSBrYXJlbmEgc2FtcGVsIGtlY2lsLCBraXRhIHRpZGFrIG1lbGloYXQgZWZla255YSBkYW4gbWVtdXR1c2thbiB1bnR1ayB0aWRhayBtZW5nZ3VuYWthbm55YS4NCg0KIyMjIEdhbGF0IE1hbmEgeWFuZyBMZWJpaCBNYWhhbD8NCg0KRGFyaSBwZXJzcGVrdGlmIGJpc25pcywgR2FsYXQgVGlwZSBJSSBKQVVIIExFQklIIE1BSEFMIGRhbiBCRVJCQUhBWUEuDQoNCioqQW5hbGlzaXMgYmlheWEgR2FsYXQgVGlwZSBJOioqDQoNCiogQmlheWEgaW1wbGVtZW50YXNpIGFsZ29yaXRtYSB0aWRhayBlZmVrdGlmOiBzZWtpdGFyIFJwIDgwMCBqdXRhIC0gMSw0IG1pbGlhcg0KKiBCaWF5YSBtYWludGVuYW5jZSB0YWh1bmFuOiBScCAyMDAtMzAwIGp1dGENCiogQmlheWEgdHJhaW5pbmcgc3RhZmY6IFJwIDEwMCBqdXRhDQoqIFRvdGFsIGtlcnVnaWFuOiBTZWtpdGFyIFJwIDEsMSAtIDEsOCBtaWxpYXINCg0KKipBbmFsaXNpcyBiaWF5YSBHYWxhdCBUaXBlIElJOioqDQoNCiogS2VydWdpYW4gbGFuZ3N1bmcgZGFyaSBwZW5pcHVhbjogUnAgNSBtaWxpYXIrIHBlciB0YWh1bg0KKiBCaWF5YSBpbnZlc3RpZ2FzaSBkYW4gcmVjb3Zlcnk6IFJwIDUwMCBqdXRhDQoqIEtlcnVzYWthbiByZXB1dGFzaSAoMjAtMzAlIHBlbGFuZ2dhbiBrZWx1YXIpOiBScCAyLTMgbWlsaWFyDQoqIERlbmRhIHJlZ3VsYXRvcjogUnAgMS0xMCBtaWxpYXINCiogQmlheWEgaHVrdW06IFJwIDIgbWlsaWFyKw0KKiBUb3RhbCBrZXJ1Z2lhbjogUnAgOCw1IC0gMjAgbWlsaWFyKw0KDQpQZXJiYW5kaW5nYW5ueWEgODoxIHNhbXBhaSAxMToxIGxlYmloIG1haGFsIHVudHVrIEdhbGF0IFRpcGUgSUkuDQoNCioqQWxhc2FuIG1lbmdhcGEgzrIgbGViaWggbWFoYWw6KioNCg0KKiBLZXJ1Z2lhbiBmaW5hbnNpYWwgbGFuZ3N1bmcgbGViaWggYmVzYXINCiogUmVwdXRhc2kgc2VrYWxpIHJ1c2FrIHN1bGl0IGRpYmFuZ3VuIGtlbWJhbGkNCiogUGVsYW5nZ2FuIGtlaGlsYW5nYW4ga2VwZXJjYXlhYW4NCiogUmVndWxhdG9yIG1lbWJlcmlrYW4gc2Fua3NpIGJlcmF0DQoqIFBvc2lzaSBrb21wZXRpdGlmIG1lbGVtYWgNCg0KIyMjIFBlbmdhcnVoIFVrdXJhbiBTYW1wZWwgcGFkYSBHYWxhdCBUaXBlIElJDQoNCioqUHJpbnNpcCBkYXNhcjoqKiBTZW1ha2luIGJlc2FyIHNhbXBlbCwgc2VtYWtpbiBrZWNpbCBHYWxhdCBUaXBlIElJICjOsiksIHNlbWFraW4gdGluZ2dpIHBvd2VyIHN0YXRpc3Rpay4NCg0KKipNZWthbmlzbWUgcGVuZ2FydWg6KioNCg0KKiBTYW1wZWwgYmVzYXIgbWVtYmVyaWthbiBlc3RpbWFzaSB5YW5nIGxlYmloIHByZXNpc2kNCiogVmFyaWFiaWxpdGFzIGRhdGEgYmVya3VyYW5nDQoqIFNpbnlhbCBlZmVrIG1lbmphZGkgbGViaWggamVsYXMgdGVybGloYXQNCiogT3ZlcmxhcCBhbnRhcmEgZGlzdHJpYnVzaSBqaWthIEjigoAgYmVuYXIgZGFuIEjigoEgYmVuYXIgbWVuZ2VjaWwNCg0KKipJbHVzdHJhc2kgcHJha3RpczoqKg0KDQoqIERlbmdhbiBzYW1wZWwgNTAgdHJhbnNha3NpOiBwb3dlciBoYW55YSA2MCUsIM6yID0gNDAlICh0aW5nZ2kpDQoqIERlbmdhbiBzYW1wZWwgMTAwIHRyYW5zYWtzaTogcG93ZXIgNzUlLCDOsiA9IDI1JSAoc2VkYW5nKQ0KKiBEZW5nYW4gc2FtcGVsIDIwMCB0cmFuc2Frc2k6IHBvd2VyIDkwJSwgzrIgPSAxMCUgKHJlbmRhaCkNCiogRGVuZ2FuIHNhbXBlbCA1MDAgdHJhbnNha3NpOiBwb3dlciA5NSUsIM6yID0gNSUgKHNhbmdhdCByZW5kYWgpDQoNCioqSW1wbGlrYXNpIHVudHVrIHRlc3RpbmcgZnJhdWQgZGV0ZWN0aW9uOioqDQoNCiogSmFuZ2FuIHRlc3RpbmcgZGVuZ2FuIHNhbXBlbCBrZWNpbCAoa3VyYW5nIGRhcmkgMTAwKQ0KKiBJZGVhbG55YSBndW5ha2FuIHNhbXBlbCAyMDAtNTAwIHRyYW5zYWtzaQ0KKiBMYWt1a2FuIHBvd2VyIGFuYWx5c2lzIHNlYmVsdW0gdGVzdGluZw0KKiBKaWthIHNhbXBlbCB0ZXJiYXRhcywgdGVyaW1hIGJhaHdhIHJpc2lrbyBmYWxzZSBuZWdhdGl2ZSB0aW5nZ2kNCg0KKipTdHJhdGVnaSBzYW1wbGluZzoqKg0KDQoqIEt1bXB1bGthbiBkYXRhIGRhcmkgcGVyaW9kZSB5YW5nIGN1a3VwIHBhbmphbmcNCiogUGFzdGlrYW4gc2FtcGVsIHJlcHJlc2VudGF0aWYgKHNlbXVhIGplbmlzIHRyYW5zYWtzaSkNCiogUGVydGltYmFuZ2thbiBzdHJhdGlmaWVkIHNhbXBsaW5nIGJlcmRhc2Fya2FuIG5pbGFpIHRyYW5zYWtzaQ0KKiBNb25pdG9yIHNlY2FyYSB0ZXJ1cy1tZW5lcnVzIHNldGVsYWggaW1wbGVtZW50YXNpDQoNCiMjIyBIdWJ1bmdhbiBhbnRhcmEgzrEsIM6yLCBkYW4gUG93ZXIgU3RhdGlzdGlrDQoNCioqRGVmaW5pc2kga2V0aWdhIGtvbnNlcDoqKg0KDQoqIM6xIChBbHBoYSk6IFByb2JhYmlsaXRhcyBtZWxha3VrYW4gR2FsYXQgVGlwZSBJIChiaWFzYW55YSBkaXRldGFwa2FuIDAuMDUgYXRhdSA1JSkNCiogzrIgKEJldGEpOiBQcm9iYWJpbGl0YXMgbWVsYWt1a2FuIEdhbGF0IFRpcGUgSUkNCiogUG93ZXIgKDEtzrIpOiBQcm9iYWJpbGl0YXMgbWVuZGV0ZWtzaSBlZmVrIGppa2EgZWZlayB0ZXJzZWJ1dCBiZW5hci1iZW5hciBhZGENCg0KKipIdWJ1bmdhbiBtYXRlbWF0aXMgc2VkZXJoYW5hOioqDQoNCiogUG93ZXI9IDEgLSDOsg0KKiBKaWthIM6yPSAyMCUsIG1ha2EgcG93ZXIgPSA4MCUNCiogSmlrYSDOsj0gMTAlLCBtYWthIHBvd2VyID0gOTAlDQoNCioqVHJhZGUtb2ZmIGFudGFyYSDOsSBkYW4gzrI6KioNCg0KKiBKaWthIGtpdGEgbWVuZXRhcGthbiDOsSBzYW5nYXQga2V0YXQgKDAuMDEpLCBtYWthIM6yIG1lbmphZGkgbGViaWggYmVzYXINCiogSmlrYSBraXRhIG1lbG9uZ2dhcmthbiDOsSAoMC4xMCksIG1ha2EgzrIgbWVuamFkaSBsZWJpaCBrZWNpbA0KKiBUaWRhayBiaXNhIG1lbWJ1YXQga2VkdWFueWEga2VjaWwgc2VrYWxpZ3VzIGRlbmdhbiBzYW1wZWwgdGVyYmF0YXMNCg0KKipGYWt0b3IgeWFuZyBtZW1wZW5nYXJ1aGkgcG93ZXIgKDEtzrIpOioqDQoNCjEuIFVrdXJhbiBlZmVrOiBFZmVrIGJlc2FyIGxlYmloIG11ZGFoIGRpZGV0ZWtzaQ0KMi4gVWt1cmFuIHNhbXBlbDogU2FtcGVsIGJlc2FyIG1lbmluZ2thdGthbiBwb3dlcg0KMy4gVmFyaWFiaWxpdGFzIGRhdGE6IERhdGEgeWFuZyBrb25zaXN0ZW4gbWVuaW5na2F0a2FuIHBvd2VyDQo0LiBUaW5na2F0IHNpZ25pZmlrYW5zaSAozrEpOiDOsSB5YW5nIGxlYmloIGJlc2FyIG1lbmluZ2thdGthbiBwb3dlcg0KDQojIyMjIERhbGFtIGtvbnRla3MgZnJhdWQgZGV0ZWN0aW9uOg0KDQoqKlByaW9yaXRhcyBoYXJ1cyBwYWRhIG1pbmltaXNhc2kgzrIga2FyZW5hOioqDQoNCiogQmlheWEgzrIgamF1aCBsZWJpaCB0aW5nZ2kgZGFyaXBhZGEgYmlheWEgzrENCiogRmFsc2UgbmVnYXRpdmUgKG1lbGV3YXRrYW4gZnJhdWQpIGxlYmloIGJlcmJhaGF5YSBkYXJpcGFkYSBmYWxzZSBwb3NpdGl2ZSAoYWxhcm0gcGFsc3UpDQoqIFJlZ3VsYXRvciBiaWFzYW55YSBsZWJpaCB0b2xlcmFuIHRlcmhhZGFwIGZhbHNlIHBvc2l0aXZlIGRhcmlwYWRhIGZhbHNlIG5lZ2F0aXZlDQoNCioqUmVrb21lbmRhc2kgcHJha3RpcyB1bnR1ayBzdGFydHVwOioqDQoNCiogR3VuYWthbiDOsSA9IDAuMTAgKGJ1a2FuIDAuMDUpIHVudHVrIG1lbmluZ2thdGthbiBwb3dlcg0KKiBUYXJnZXRrYW4gcG93ZXIgbWluaW1hbCA4MCUsIGlkZWFsbnlhIDkwJQ0KKiBMYWt1a2FuIHRlc3RpbmcgYmVydGFoYXA6IGV4cGxvcmF0b3J5IOKGkiBjb25maXJtYXRvcnkNCiogVGVydXMgbW9uaXRvciBzZXRlbGFoIGltcGxlbWVudGFzaQ0KDQoqKktlc2ltcHVsYW4gaHVidW5nYW46KioNCg0KUG93ZXIgc3RhdGlzdGlrIGFkYWxhaCBrZW1hbXB1YW4ga2l0YSB1bnR1ayBtZW5kZXRla3NpIGVmZWsgeWFuZyBiZW5hci1iZW5hciBhZGEuUG93ZXIgdGluZ2dpIGJlcmFydGkgzrIgcmVuZGFoLCB5YW5nIHNhbmdhdCBwZW50aW5nIGRhbGFtIGZyYXVkIGRldGVjdGlvbiBrYXJlbmEgYmlheWEgbWVsZXdhdGthbiBmcmF1ZCBqYXVoIGxlYmloIGJlc2FyIGRhcmlwYWRhIGJpYXlhIGFsYXJtIHBhbHN1Lg0KDQo8L2Rpdj4gDQoNCi0tLQ0KDQo8ZGl2IGNsYXNzPSJleHBsYW5hdGlvbi1ib3giPg0KDQojIFN0dWRpIEthc3VzIDYNCg0KIyMgTmlsYWktUCBkYW4gUGVuZ2FtYmlsYW4gS2VwdXR1c2FuIFN0YXRpc3Rpaw0KDQpFdmFsdWFzaSBtb2RlbCBwcmVkaWtzaSBjaHVybiBtZW5naGFzaWxrYW4gaGFzaWwgYmVyaWt1dDoNCg0KKiBTdGF0aXN0aWsgdWppID0gMi4zMQ0KKiBuaWxhaS1wID0gMC4wMjENCiogVGluZ2thdCBzaWduaWZpa2Fuc2k6ICRcYWxwaGEgPSAwLjA1JA0KDQojIyBUdWdhcw0KDQoxLiBKZWxhc2thbiBtYWtuYSBuaWxhaS1wLg0KMi4gQnVhdGxhaCBrZXB1dHVzYW4gc3RhdGlzdGlrLg0KMy4gVGVyamVtYWhrYW4ga2VwdXR1c2FuIHRlcnNlYnV0IGtlIGRhbGFtIGJhaGFzYSBub24tdGVrbmlzIHVudHVrIG1hbmFqZW1lbi4NCjQuIERpc2t1c2lrYW4gcmlzaWtvbnlhIGppa2Egc2FtcGVsIHRpZGFrIHJlcHJlc2VudGF0aWYuDQo1LiBKZWxhc2thbiBtZW5nYXBhIG5pbGFpLXAgdGlkYWsgbWVuZ3VrdXIgdWt1cmFuIGVmZWsgKGVmZmVjdCBzaXplKS4NCg0KIyMgSmF3YWINCg0KIyMjIE1ha25hIE5pbGFpLXAgKHAgPSAwLjAyMSkNCg0KTmlsYWktcCBhZGFsYWggcHJvYmFiaWxpdGFzIG1lbmRhcGF0a2FuIGhhc2lsIHNlLWVrc3RyZW0gaW5pIGF0YXUgbGViaWggZWtzdHJlbSBsYWdpLCBqaWthIGhpcG90ZXNpcyBub2wgKEjigoApIGJlbmFyLg0KDQoqKlBlbmplbGFzYW4gc2VkZXJoYW5hIHVudHVrIHAgPSAwLjAyMToqKg0KDQpBZGEyLjElIGtlbXVuZ2tpbmFuIGtpdGEgYWthbiBtZWxpaGF0IHN0YXRpc3RpayB1amkgc2ViZXNhciAyLjMxIGF0YXUgbGViaWggZWtzdHJlbSwgamlrYSBzZWJlbmFybnlhIHRpZGFrIGFkYSBlZmVrIGFwYSBwdW4gZGFsYW0gcG9wdWxhc2kuDQoNCioqQW5hbG9naW55YSBzZXBlcnRpOioqDQoNCkJheWFuZ2thbiBraXRhIHB1bnlhIGtvaW4geWFuZyBraXRhIGtsYWltIHRpZGFrIGJpYXMoSOKCgCkuIEtpdGEgbGVtcGFyIDEwMCBrYWxpLCBkYXBhdCA2MCBnYW1iYXIuIE5pbGFpLXAgYWRhbGFoOiBzZWJlcmFwYSBtdW5na2luIG1lbmRhcGF0a2FuIDYwIGdhbWJhciBhdGF1IGxlYmloIGVrc3RyZW0sIGppa2Ega29pbiBtZW1hbmcgdGlkYWsgYmlhcz8gSmlrYSBwIGtlY2lsIChtaXNhbCAwLjAzKSwgYXJ0aW55YSBzYW5nYXQgdGlkYWsgbXVuZ2tpbiBoYXNpbCBpbmkgdGVyamFkaSBqaWthIGtvaW4gdGlkYWsgYmlhcy4NCg0KKipEYWxhbSBrb250ZWtzIGNodXJuIHByZWRpY3Rpb246KioNCg0KKiAqKkjigoA6KiogTW9kZWwgcHJlZGlrc2kgY2h1cm4gdGlkYWsgbWVtaWxpa2kga2VtYW1wdWFuIHByZWRpa3RpZg0KKiAqKkhhc2lsOioqIHAgPSAwLjAyMQ0KKiAqKkFydGlueWE6KiogSGFueWEgMi4xJSBrZW11bmdraW5hbiBraXRhIGFrYW4gbWVuZGFwYXRrYW4gc3RhdGlzdGlrIHVqaSAyLjMxIGF0YXUgbGViaWggdGluZ2dpLCBqaWthIG1vZGVsIHNlYmVuYXJueWEgdGlkYWsgYmVyZ3VuYQ0KDQoqKkludGVycHJldGFzaSBwZW50aW5nOioqDQoNCiogQlVLQU4gcHJvYmFiaWxpdGFzIEjigoAgYmVuYXINCiogQlVLQU4gcHJvYmFiaWxpdGFzIEjigoEgYmVuYXINCiogQlVLQU4gdWt1cmFuIHBlbnRpbmdueWEgZWZlaw0KKiBBREFMQUggdWt1cmFuIGtldGlkYWtjb2Nva2FuIGRhdGEgZGVuZ2FuIEjigoANCg0KIyMjIEtlcHV0dXNhbiBTdGF0aXN0aWsNCg0KKipEYXRhIHlhbmcgZGlrZXRhaHVpOioqDQoNCiogU3RhdGlzdGlrIHVqaSA9IDIuMzENCiogTmlsYWktcCA9IDAuMDIxDQoqIFRpbmdrYXQgc2lnbmlmaWthbnNpIM6xID0gMC4wNQ0KDQoqKkF0dXJhbiBrZXB1dHVzYW4gc3RhbmRhcjoqKg0KDQoqIEppa2EgcC12YWx1ZSA8IM6xIOKGkiBUb2xhayBI4oKADQoqIEppa2EgcC12YWx1ZSDiiaUgzrEg4oaSIEdhZ2FsIHRvbGFrIEjigoANCg0KKipQcm9zZXMgcGVuZ2FtYmlsYW4ga2VwdXR1c2FuOioqDQoNCjEuIEJhbmRpbmdrYW4gcC12YWx1ZSAoMC4wMjEpIGRlbmdhbiDOsSAoMC4wNSkNCjIuIDAuMDIxIDwgMC4wNQ0KMy4gS2VwdXR1c2FuOiBUT0xBSyBI4oKADQoNCioqSW50ZXJwcmV0YXNpIGtlcHV0dXNhbjoqKg0KDQpUZXJkYXBhdGJ1a3RpIHN0YXRpc3RpayB5YW5nIGN1a3VwIHVudHVrIG1lbnlpbXB1bGthbiBiYWh3YSBtb2RlbCBwcmVkaWtzaSBjaHVybiBtZW1pbGlraSBrZW1hbXB1YW4gcHJlZGlrdGlmIHlhbmcgc2lnbmlmaWthbi4NCg0KKipMZXZlbCBvZiBldmlkZW5jZToqKg0KDQoqIHAgPCAwLjAwMTogQnVrdGkgc2FuZ2F0IGt1YXQNCiogcCA8IDAuMDE6IEJ1a3RpIGt1YXQNCiogcCA8IDAuMDU6IEJ1a3RpIGN1a3VwIOKGkCBrYXN1cyBraXRhDQoqIHAgPCAwLjEwOiBCdWt0aSBsZW1haA0KKiBwIOKJpSAwLjEwOiBUaWRhayBjdWt1cCBidWt0aQ0KDQojIyMgVGVyamVtYWhhbiB1bnR1ayBNYW5hamVtZW4gKE5vbi1UZWtuaXMpDQoNCioqVW50dWsgQ0VPL0RpcmVrdHVyOioqDQoNCiJBbmFsaXNpcyBzdGF0aXN0aWsgbWVudW5qdWtrYW4gbW9kZWwgcHJlZGlrc2kgY2h1cm4ga2l0YSBiZWtlcmphIGRlbmdhbiBiYWlrLiBIYXNpbCB5YW5nIGtpdGEgZGFwYXRrYW4gc2FuZ2F0IHRpZGFrIG11bmdraW4gdGVyamFkaSBzZWNhcmEga2ViZXR1bGFuLiBLaXRhIDk1JSB5YWtpbiBiYWh3YSBtb2RlbCBpbmkgYmVuYXItYmVuYXIgbWVtaWxpa2kga2VtYW1wdWFuIG1lbXByZWRpa3NpIHBlbGFuZ2dhbiB5YW5nIGFrYW4gYmVyaGVudGkuIg0KDQoqKlVudHVrIE1hbmFqZXIgUHJvZHVrOioqDQoNCiJNb2RlbCBwcmVkaWtzaSBjaHVybiB0ZWxhaCBkaXZhbGlkYXNpIHNlY2FyYSBzdGF0aXN0aWsuIEtpdGEgcHVueWEga2V5YWtpbmFuIGt1YXQgYmFod2EgbW9kZWwgaW5pIGJpc2EgbWVtYmFudHUgbWVuZ2lkZW50aWZpa2FzaSBwZWxhbmdnYW4gYmVyaXNpa28gdGluZ2dpLiBCaXNhIGtpdGEgZ3VuYWthbiB1bnR1ayBwcm9ncmFtIHJldGVuc2kgeWFuZyBsZWJpaCBlZmVrdGlmLiINCg0KKipVbnR1ayBUaW0gTWFya2V0aW5nOioqDQoNCiJCZXJkYXNhcmthbiB0ZXN0aW5nIHN0YXRpc3Rpaywgc2lzdGVtIHByZWRpa3NpIGNodXJuIGtpdGEgc2lnbmlmaWthbiBkYW4gcmVsaWFibGUuIEtpdGEgYmlzYSBwZXJjYXlhIHBhZGEgc2NvcmluZy1ueWEgdW50dWsgbWVuYXJnZXRrYW4ga2FtcGFueWUgcmV0ZW5zaS4iDQoNCioqVmVyc2kgc2F0dSBrYWxpbWF0OioqDQoNCiJNb2RlbCBwcmVkaWtzaSBjaHVybiB0ZXJidWt0aSBlZmVrdGlmIHNlY2FyYSBzdGF0aXN0aWsgZGVuZ2FuIHRpbmdrYXQga2VwZXJjYXlhYW4gOTUlLiINCg0KKipZYW5nIFRJREFLIEJPTEVIIGRpa2F0YWthbiBrZSBtYW5hamVtZW46KioNCg0KKiAiTW9kZWwga2l0YSA5Ny45JSBha3VyYXQiIChzYWxhaCwgcC12YWx1ZSBidWthbiBha3VyYXNpKQ0KKiAiS2l0YSBwYXN0aSBiaXNhIG1lbmd1cmFuZ2kgY2h1cm4iIChvdmVyY29uZmlkZW50KQ0KKiAiSW5pIGJ1a3RpIGZpbmFsIiAoc3RhdGlzdGlrIHNlbGFsdSBhZGEgdW5jZXJ0YWludHkpDQoNCiMjIyBSaXNpa28gSmlrYSBTYW1wZWwgVGlkYWsgUmVwcmVzZW50YXRpZg0KDQoqKk1hc2FsYWggdXRhbWE6KiogSGFzaWwgc3RhdGlzdGlrIHlhbmcgc2lnbmlmaWthbiBiaXNhIG1lbnllc2F0a2FuIGppa2Egc2FtcGVsIHRpZGFrIG1ld2FraWxpIHBvcHVsYXNpIHNlYmVuYXJueWEuDQoNCioqQ29udG9oIGtvbmtyZXQgZGFsYW0gY2h1cm4gcHJlZGljdGlvbjoqKg0KDQoqIFNhbXBlbCBoYW55YSBkYXJpIHBlbGFuZ2dhbiBwcmVtaXVtLCBwYWRhaGEgcG9wdWxhc2kgc2VtdWEgdGllcg0KKiBEYXRhIGhhbnlhIGRhcmkgUTQgKG11c2ltIGxpYnVyYW4pLCBwYWRhaGFsIHBvbGEgY2h1cm4gYmVkYSB0aWFwIG11c2ltDQoqIEhhbnlhIHBlbGFuZ2dhbiB1c2lhIHRlcnRlbnR1LCB0aWRhayBzZW11YSBkZW1vZ3JhZmkNCiogSGFueWEgZGFyaSByZWdpb24gdGVydGVudHUsIHRpZGFrIG5hc2lvbmFsL2ludGVybmFzaW9uYWwNCg0KKipLb25zZWt1ZW5zaSByaXNpa286KioNCg0KMS4gKipPdmVyZXN0aW1hdGlvbiBrZW1hbXB1YW4gbW9kZWw6KioNCg0KKiBNb2RlbCB0YW1wYWsgYmFndXMgZGkgc2FtcGVsLCB0YXBpIGdhZ2FsIGRpIHBvcHVsYXNpIHNlYmVuYXJueWENCiogQWt1cmFzaSB0dXJ1biBkcmFzdGlzIHNhYXQgZGlpbXBsZW1lbnRhc2lrYW4gbHVhcw0KKiBLZXB1dHVzYW4gYmlzbmlzIGJlcmRhc2Fya2FuIHByZWRpa3NpIHlhbmcgc2FsYWgNCg0KMi4gKipCaWFzIGRhbGFtIHByZWRpa3NpOioqDQoNCiogTW9kZWwgamFkaSBha3VyYXQgdW50dWsgc2VnbWVuIHRlcnRlbnR1IHNhamENCiogTWlzcyBzZWdtZW50IGxhaW5ueWEgeWFuZyBwZW50aW5nDQoqIFByb2dyYW0gcmV0ZW5zaSB0aWRhayBlZmVrdGlmIHVudHVrIHNlYmFnaWFuIHBlbGFuZ2dhbg0KDQozLiAqKkdlbmVyYWxpemF0aW9uIGVycm9yIHRpbmdnaToqKg0KDQoqIE1vZGVsIG92ZXJmaXQga2Uga2FyYWt0ZXJpc3RpayBzYW1wZWwNCiogVGlkYWsgcm9idXN0IHRlcmhhZGFwIHZhcmlhc2kgZGkgcG9wdWxhc2kNCiogUGVybHUgY29uc3RhbnQgcmV0cmFpbmluZyBkYW4gYWRqdXN0bWVudA0KDQo0LiAqKktlcnVnaWFuIGZpbmFuc2lhbDoqKg0KDQoqIEludmVzdGFzaSBwYWRhIHByb2dyYW0gcmV0ZW5zaSB5YW5nIHRpZGFrIHRlcGF0IHNhc2FyYW4NCiogS2VoaWxhbmdhbiBwZWxhbmdnYW4geWFuZyBzZWJlbmFybnlhIGJpc2EgZGlwZXJ0YWhhbmthbg0KKiBSZXB1dGFzaSB0aW0gZGF0YSBzY2llbmNlIG1lbnVydW4NCg0KKipDYXJhIG1pdGlnYXNpIHJpc2lrbzoqKg0KDQoqIFBhc3Rpa2FuIHNhbXBlbCByYW5kb20gZGFuIGN1a3VwIGJlc2FyIChuIOKJpSA1MDApDQoqIExha3VrYW4gc3RyYXRpZmllZCBzYW1wbGluZyBiZXJkYXNhcmthbiBzZWdtZW50IHBlbnRpbmcNCiogVmFsaWRhc2kgZGVuZ2FuIGhvbGRvdXQgc2FtcGxlIGF0YXUgY3Jvc3MtdmFsaWRhdGlvbg0KKiBUZXN0IGRpIG11bHRpcGxlIHRpbWUgcGVyaW9kcw0KKiBNb25pdG9yIHBlcmZvcm1hbmNlIHNldGVsYWggaW1wbGVtZW50YXNpDQoNCioqUGVyaW5nYXRhbjoqKiBTaWduaWZpY2FuY2UgdGFucGEgcmVwcmVzZW50YXRpdmVuZXNzIGFkYWxhaCBpbHVzaSBzdGF0aXN0aWNhbCB2YWxpZGl0eS4NCg0KIyMjIE1lbmdhcGEgTmlsYWktcCBUaWRhayBNZW5ndWt1ciBVa3VyYW4gRWZlaw0KDQoqKlBlcmJlZGFhbiBmdW5kYW1lbnRhbDoqKg0KDQoqIE5pbGFpLXA6IE1lbmd1a3VyIGtlcGVyY2F5YWFuIChjb25maWRlbmNlKSAtIHNlYmVyYXBhIHlha2luIGtpdGEgYWRhIGVmZWsNCiogVWt1cmFuIGVmZWs6IE1lbmd1a3VyIGtla3VhdGFuIChzdHJlbmd0aCkgLSBzZWJlcmFwYSBiZXNhciBlZmVrbnlhDQoNCioqQW5hbG9naW55YSBzZXBlcnRpOioqDQoNCiogKipOaWxhaS1wOioqIFNlYmVyYXBhIHlha2luIGtpdGEgYWRhIGFwaSAoYXNhcCB0ZXJsaWhhdCBqZWxhcyBhdGF1IHNhbWFyKQ0KKiAqKkVmZmVjdCBzaXplOioqIFNlYmVyYXBhIGJlc2FyIGFwaW55YSAoYXBpIHVuZ2d1biBhdGF1IGtlYmFrYXJhbiBnZWR1bmcpDQoNCioqQ29udG9oIGRhbGFtIGNodXJuIHByZWRpY3Rpb246KioNCg0KKiBwID0gMC4wMjE6IFNhbmdhdCB5YWtpbiBtb2RlbCBtZW1pbGlraSBrZW1hbXB1YW4gcHJlZGlrdGlmDQoqIEVmZmVjdCBzaXplIChtaXNhbCBBVUMgPSAwLjcyKTogTW9kZWwgYmlzYSBtZW1iZWRha2FuIGRlbmdhbiBjdWt1cCBiYWlrIGFudGFyYSB5YW5nIGFrYW4gY2h1cm4gZGFuIHRpZGFrDQoNCiMjIyMgTWVuZ2FwYSBwLXZhbHVlIHNhamEgdGlkYWsgY3VrdXANCg0KKipLYXN1cyAxOiBTYW1wZWwgYmVzYXIsIGVmZWsga2VjaWwqKg0KDQoqIG4gPSAxMC4wMDAsIGVmZWsgc2FuZ2F0IGtlY2lsIOKGkiBwIGJpc2Egc2FuZ2F0IGtlY2lsICgwLjAwMSkNCiogVGFwaSBlZmZlY3Qgc2l6ZSBrZWNpbCwgbXVuZ2tpbiB0aWRhayBtZWFuaW5nZnVsIHNlY2FyYSBwcmFrdGlzDQoqIEtlc2ltcHVsYW46IFNpZ25pZmlrYW4gc3RhdGlzdGlrLCB0YXBpIHRpZGFrIHBlbnRpbmcgYmlzbmlzDQoNCioqS2FzdXMgMjogU2FtcGVsIGtlY2lsLCBlZmVrIGJlc2FyKioNCg0KKiBuID0gMzAsIGVmZWsgYmVzYXIg4oaSIHAgbXVuZ2tpbiAwLjA4ICh0aWRhayBzaWduaWZpa2FuKQ0KKiBUYXBpIGVmZmVjdCBzaXplIGJlc2FyLCBtdW5na2luIG1lYW5pbmdmdWwNCiogS2VzaW1wdWxhbjogVGlkYWsgc2lnbmlmaWthbiBzdGF0aXN0aWssIHRhcGkgbXVuZ2tpbiBwZW50aW5nIGJpc25pcw0KDQojIyMjIFVrdXJhbiBlZmVrIHlhbmcgcGVybHUgZGlsYXBvcmthbiBiZXJzYW1hIHAtdmFsdWU6DQoNCioqVW50dWsga2xhc2lmaWthc2kgKGNodXJuIHByZWRpY3Rpb24pOioqDQoNCiogQVVDL1JPQzogQXJlYSBVbmRlciBDdXJ2ZSAoMC41ID0gcmFuZG9tLCAwLjcgPSBhY2NlcHRhYmxlLCAwLjggPSBnb29kLCAwLjkgPSBleGNlbGxlbnQpDQoqIFByZWNpc2lvbiAmIFJlY2FsbDogVHJhZGUtb2ZmIGFudGFyYSBmYWxzZSBwb3NpdGl2ZSBkYW4gZmFsc2UgbmVnYXRpdmUNCiogRjEtU2NvcmU6IEhhcm1vbmljIG1lYW4gcHJlY2lzaW9uIGRhbiByZWNhbGwNCiogQWNjdXJhY3k6IFByb3BvcnNpIHByZWRpa3NpIGJlbmFyICh0YXBpIGhhdGktaGF0aSBkZW5nYW4gaW1iYWxhbmNlZCBkYXRhKQ0KDQoqKlVudHVrIHJlZ3Jlc3Npb24vY29udGludW91czoqKg0KDQoqIENvaGVuJ3MgZDogU3RhbmRhcmRpemVkIG1lYW4gZGlmZmVyZW5jZQ0KKiBSwrI6IFByb3BvcnRpb24gb2YgdmFyaWFuY2UgZXhwbGFpbmVkDQoqIFJlZ3Jlc3Npb24gY29lZmZpY2llbnRzOiBCZXNhcm55YSBwZW5nYXJ1aCBzZXRpYXAgcHJlZGljdG9yDQoNCioqRGFsYW0gc3R1ZGkga2FzdXMga2l0YToqKg0KDQoqIHAgPSAwLjAyMSDihpIgS2l0YSB5YWtpbiBtb2RlbCB0aWRhayB1c2VsZXNzDQoqIFRhcGkgYnV0dWggZWZmZWN0IHNpemUgdW50dWsgdGFodSBzZWJlcmFwYSB1c2VmdWwgbW9kZWxueWENCiogQ29udG9oOiBKaWthIEFVQyA9IDAuNjUg4oaSIEN1a3VwIGJhaWsgdGFwaSBhZGEgcnVhbmcgaW1wcm92ZW1lbnQNCiogSmlrYSBBVUMgPSAwLjg1IOKGkiBTYW5nYXQgYmFpaywgYmlzYSBkaWFuZGFsa2FuDQoNCioqUmVrb21lbmRhc2kgcHJha3RpczoqKiANCg0KU2VsYWx1IGxhcG9ya2FuIEJPVEggcC12YWx1ZSBkYW4gZWZmZWN0IHNpemUuIFNpZ25pZmljYW5jZSBtZW5qYXdhYiAiYXBha2FoIGFkYSBlZmVrPyIsIGVmZmVjdCBzaXplIG1lbmphd2FiICJzZWJlcmFwYSBiZXNhciBlZmVrbnlhPyIuDQoNCioqUGVzYW4gdW50dWsgYW5hbGlzIGRhdGE6KioNCg0KSmFuZ2FuIHBlcm5haCBoYW55YSBiaWxhbmcgInNpZ25pZmljYW50IGF0IHAgPCAwLjA1Ii4gVGFtYmFoa2FuICJ3aXRoIGVmZmVjdCBzaXplIG9mIFgsIHdoaWNoIG1lYW5zIFkgaW4gYnVzaW5lc3MgY29udGV4dCIuDQoNCjwvZGl2PiANCg0KLS0tDQoNCjxkaXYgY2xhc3M9ImV4cGxhbmF0aW9uLWJveCI+DQoNCiMgS2VzaW1wdWxhbiBkYW4gUmVmZXJlbnNpDQoNCkFuYWxpc2lzIGtlZW5hbSBzdHVkaSBrYXN1cyBtZW5ndW5na2Fwa2FuIHBlbnRpbmdueWEgcGVuZGVrYXRhbiBzdGF0aXN0aWsgeWFuZyB0ZXBhdCBkYWxhbSBwZW5nYW1iaWxhbiBrZXB1dHVzYW4gYmlzbmlzIGJlcmJhc2lzIGRhdGEsIGRpIG1hbmEgcGVtaWxpaGFuIHVqaSB5YW5nIHNlc3VhaSBkZW5nYW4ga2FyYWt0ZXJpc3RpayBkYXRhIGRhbiBrb250ZWtzIG1hc2FsYWggbWVuamFkaSBrdW5jaSB1dGFtYSwgaW50ZXJwcmV0YXNpIGhhc2lsIHN0YXRpc3RpayBoYXJ1cyBtZW1wZXJ0aW1iYW5na2FuIGJhaWsgc2lnbmlmaWthbnNpIChwLXZhbHVlKSBtYXVwdW4gdWt1cmFuIGVmZWsgKGVmZmVjdCBzaXplKSBzZXJ0YSBkYW1wYWsgYmlzbmlzIGRhcmkgYmVyYmFnYWkgamVuaXMga2VzYWxhaGFuLCBkZW5nYW4gcGVtYWhhbWFuIGJhaHdhIHNpZ25pZmlrYW5zaSBzdGF0aXN0aWsgdGlkYWsgc2VsYWx1IGJlcm1ha25hIHBlbnRpbmcgc2VjYXJhIHByYWt0aXMsIHNlbWVudGFyYSB2YWxpZGl0YXMga2VzZWx1cnVoYW4gc2FuZ2F0IGJlcmdhbnR1bmcgcGFkYSBrdWFsaXRhcyBkYW4gcmVwcmVzZW50YXRpdml0YXMgc2FtcGVsIGRhdGEgeWFuZyBkaWd1bmFrYW4uDQoNCiogQW5kZXJzb24sIEQuIFIuLCBTd2VlbmV5LCBELiBKLiwgV2lsbGlhbXMsIFQuIEEuLCBDYW1tLCBKLiBELiwgJiBDb2NocmFuLCBKLiBKLiAoMjAyMCkuIFN0YXRpc3RpY3MgZm9yIEJ1c2luZXNzICYgRWNvbm9taWNzICgxNHRoIGVkLikuIENlbmdhZ2UgTGVhcm5pbmcuDQogICAgICBNYXRlcmk6IFVqaSBoaXBvdGVzaXMsIGRpc3RyaWJ1c2kgc2FtcGxpbmcsIGluZmVyZW5zaSBzdGF0aXN0aWsNCiogRmllbGQsIEEuICgyMDE4KS4gRGlzY292ZXJpbmcgU3RhdGlzdGljcyBVc2luZyBSICg1dGggZWQuKS4gU2FnZSBQdWJsaWNhdGlvbnMuDQogICAgICBNYXRlcmk6IEltcGxlbWVudGFzaSB1amkgc3RhdGlzdGlrIGRhbGFtIFIsIGludGVycHJldGFzaSBvdXRwdXQNCiogSGFpciwgSi4gRi4sIEJsYWNrLCBXLiBDLiwgQmFiaW4sIEIuIEouLCAmIEFuZGVyc29uLCBSLiBFLiAoMjAxOSkuIE11bHRpdmFyaWF0ZSBEYXRhIEFuYWx5c2lzICg4dGggZWQuKS4gQ2VuZ2FnZSBMZWFybmluZy4NCiAgICAgIE1hdGVyaTogQW5hbGlzaXMgbXVsdGl2YXJpYXQsIHZhbGlkaXRhcyBrb25zdHJ1aywgcG93ZXIgYW5hbHlzaXMNCiogTW9udGdvbWVyeSwgRC4gQy4sICYgUnVuZ2VyLCBHLiBDLiAoMjAxOCkuIEFwcGxpZWQgU3RhdGlzdGljcyBhbmQgUHJvYmFiaWxpdHkgZm9yIEVuZ2luZWVycyAoN3RoIGVkLikuIFdpbGV5Lg0KICAgICAgTWF0ZXJpOiBEZXNhaW4gZWtzcGVyaW1lbiwga29udHJvbCBrdWFsaXRhcywgQS9CIHRlc3RpbmcNCiogQ29oZW4sIEouICgxOTkyKS4gIkEgcG93ZXIgcHJpbWVyIi4gUHN5Y2hvbG9naWNhbCBCdWxsZXRpbiwgMTEyKDEpLCAxNTUtMTU5Lg0KICAgICAgTWF0ZXJpOiBQb3dlciBhbmFseXNpcywgdWt1cmFuIGVmZWssIEdhbGF0IFRpcGUgSUkNCiogV2Fzc2Vyc3RlaW4sIFIuIEwuLCAmIExhemFyLCBOLiBBLiAoMjAxNikuICJUaGUgQVNBIHN0YXRlbWVudCBvbiBwLXZhbHVlczogQ29udGV4dCwgcHJvY2VzcywgYW5kIHB1cnBvc2UiLiBUaGUgQW1lcmljYW4gU3RhdGlzdGljaWFuLCA3MCgyKSwgMTI5LTEzMy4NCiAgICAgIE1hdGVyaTogSW50ZXJwcmV0YXNpIG5pbGFpLXAgeWFuZyB0ZXBhdCwgbWlza29uc2Vwc2kgdW11bQ0KKiBJb2FubmlkaXMsIEouIFAuIEEuICgyMDA1KS4gIldoeSBtb3N0IHB1Ymxpc2hlZCByZXNlYXJjaCBmaW5kaW5ncyBhcmUgZmFsc2UiLiBQTG9TIE1lZGljaW5lLCAyKDgpLCBlMTI0Lg0KICAgICAgTWF0ZXJpOiBSZXByb2R1a3RpYmlsaXRhcyBoYXNpbCwgYmlhcyBwdWJsaWthc2ksIHBvd2VyIHJlbmRhaA0KKiBTdWxsaXZhbiwgRy4gTS4sICYgRmVpbm4sIFIuICgyMDEyKS4gIlVzaW5nIGVmZmVjdCBzaXpl4oCUb3Igd2h5IHRoZSBQIHZhbHVlIGlzIG5vdCBlbm91Z2giLiBKb3VybmFsIG9mIEdyYWR1YXRlIE1lZGljYWwgRWR1Y2F0aW9uLCA0KDMpLCAyNzktMjgyLg0KICAgICAgTWF0ZXJpOiBQZW50aW5nbnlhIG1lbGFwb3JrYW4gdWt1cmFuIGVmZWsgYmVyc2FtYSBwLXZhbHVlDQoqIFByb3Zvc3QsIEYuLCAmIEZhd2NldHQsIFQuICgyMDEzKS4gRGF0YSBTY2llbmNlIGZvciBCdXNpbmVzczogV2hhdCBZb3UgTmVlZCB0byBLbm93IEFib3V0IERhdGEgTWluaW5nIGFuZCBEYXRhLUFuYWx5dGljIFRoaW5raW5nLiBPJ1JlaWxseSBNZWRpYS4NCiAgICAgIE1hdGVyaTogQS9CIHRlc3RpbmcsIG1vZGVsIGV2YWx1YXNpLCBrb250ZWtzIGJpc25pcw0KKiBLb2hhdmksIFIuLCBUYW5nLCBELiwgJiBYdSwgWS4gKDIwMjApLiBUcnVzdHdvcnRoeSBPbmxpbmUgQ29udHJvbGxlZCBFeHBlcmltZW50czogQSBQcmFjdGljYWwgR3VpZGUgdG8gQS9CIFRlc3RpbmcuIENhbWJyaWRnZSBVbml2ZXJzaXR5IFByZXNzLg0KICAgICAgIE1hdGVyaTogQmVzdCBwcmFjdGljZXMgQS9CIHRlc3RpbmcsIGFuYWxpc2lzIGhhc2lsLCBldGlrYQ0KKiBIYXN0aWUsIFQuLCBUaWJzaGlyYW5pLCBSLiwgJiBGcmllZG1hbiwgSi4gKDIwMTcpLiBUaGUgRWxlbWVudHMgb2YgU3RhdGlzdGljYWwgTGVhcm5pbmc6IERhdGEgTWluaW5nLCBJbmZlcmVuY2UsIGFuZCBQcmVkaWN0aW9uICgybmQgZWQuKS4gU3ByaW5nZXIuDQogICAgICAgTWF0ZXJpOiBNb2RlbCBwcmVkaWtzaSwgdmFsaWRhc2ksIG1hY2hpbmUgbGVhcm5pbmcNCiogQm9sdG9uLCBSLiBOLiwgJiBMZW1vbiwgSy4gTi4gKDE5OTkpLiAiQSBkeW5hbWljIG1vZGVsIG9mIGN1c3RvbWVycycgdXNhZ2Ugb2Ygc2VydmljZXM6IFVzYWdlIGFzIGFuIGFudGVjZWRlbnQgYW5kIGNvbnNlcXVlbmNlIG9mIHNhdGlzZmFjdGlvbiIuIEpvdXJuYWwgb2YgTWFya2V0aW5nIFJlc2VhcmNoLCAzNigyKSwgMTcxLTE4Ni4NCiAgICAgICBNYXRlcmk6IE1vZGVsIHByZWRpa3NpIGNodXJuLCBjdXN0b21lciBhbmFseXRpY3MNCiogTmdhaSwgRS4gVy4gVC4sIFhpdSwgTC4sICYgQ2hhdSwgRC4gQy4gSy4gKDIwMDkpLiAiQXBwbGljYXRpb24gb2YgZGF0YSBtaW5pbmcgdGVjaG5pcXVlcyBpbiBjdXN0b21lciByZWxhdGlvbnNoaXAgbWFuYWdlbWVudDogQSBsaXRlcmF0dXJlIHJldmlldyBhbmQgY2xhc3NpZmljYXRpb24iLiBFeHBlcnQgU3lzdGVtcyB3aXRoIEFwcGxpY2F0aW9ucywgMzYoMiksIDI1OTItMjYwMi4NCiAgICAgICBNYXRlcmk6IERhdGEgbWluaW5nIHVudHVrIENSTSwgZnJhdWQgZGV0ZWN0aW9uDQoqIFdlc3RmYWxsLCBQLiBILiwgJiBZb3VuZywgUy4gUy4gKDE5OTMpLiBSZXNhbXBsaW5nLUJhc2VkIE11bHRpcGxlIFRlc3Rpbmc6IEV4YW1wbGVzIGFuZCBNZXRob2RzIGZvciBwLVZhbHVlIEFkanVzdG1lbnQuIFdpbGV5Lg0KICAgICAgIE1hdGVyaTogS29yZWtzaSBtdWx0aXBsZSB0ZXN0aW5nLCBmYWxzZSBkaXNjb3ZlcnkgcmF0ZQ0KKiBodHRwczovL3JwdWJzLmNvbS9kc2NpZW5jZWxhYnMvU3RhdGlzdGljYWxfSW5mZXJlbmNlcw0KDQo8L2Rpdj4g