Statistical Inferences ~ Week 14


Profile Picture

Muhammad Nabil Khairil Anam
Data Science Student
Institut Teknologi Sains Bandung (ITSB)


1 Studi Kasus 1

1.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*}\]

1.2 Tugas

  1. Rumuskan Hipotesis Nol (H₀) dan Hipotesis Alternatif (H₁).
  2. Identifikasi uji statistik yang sesuai dan berikan alasan pilihan Anda.
  3. Hitung statistik uji dan nilai-p dengan \(\alpha = 0.05\).
  4. Nyatakan keputusan statistik.
  5. Interpretasikan hasilnya dalam konteks analitik bisnis.

1.3 Jawab

1.3.1 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.

1.3.2 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

1.3.3 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:

  1. Standard Error (SE): \[SE = σ / √n = 15 / √64 = 15 / 8 = 1.875\]
  2. Statistik Z: \[Z = (x̄ - μ₀) / SE = (116 - 120) / 1.875 = -4 / 1.875 = -2.133\]3
  3. Nilai-p (dua sisi): \[p-value = 2 × P(Z < -2.1333) = 2 × 0.0164 = 0.0328\]
  4. 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₀

1.3.4 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%

1.3.4.1 Implikasi untuk Platform Pembelajaran:

Temuan Kunci:

  • Rata-rata waktu belajar aktual (116 menit) 4 menit lebih rendah dari klaim
  • Perbedaan ini signifikan secara statistik meskipun tampak kecil
  • Klaim marketing saat ini tidak akurat

Rekomendasi Aksi:

  • Revisi klaim marketing menjadi lebih realistis (≈116 menit)
  • Investigasi penyebab mengapa waktu belajar lebih rendah
  • Segmentasi pengguna untuk analisis lebih mendalam
  • Program peningkatan engagement untuk mendekati target

Analisis Lanjutan yang Diperlukan:

  • Periksa konsistensi hasil di berbagai segmen pengguna
  • Analisis trend waktu untuk melihat pola perubahan
  • Evaluasi kualitas belajar, bukan hanya durasi
  • Pertimbangan faktor eksternal (musim ujian, liburan, dll.)

Pesan untuk Stakeholder:

“Analisis statistik mengungkapkan bahwa rata-rata waktu belajar pengguna adalah 116 menit, berbeda signifikan dari klaim 120 menit (p = 0.033). Kami merekomendasikan penyesuaian klaim dan investigasi lebih lanjut untuk memahami faktor-faktor yang mempengaruhi waktu belajar pengguna.”


2 Studi Kasus 2

2.1 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\]

2.2 Tugas

  1. Definisikan H₀ dan H₁ (dua-arah / two-tailed).
  2. Tentukan uji hipotesis yang sesuai.
  3. Hitung statistik-t dan nilai-p dengan \(\alpha = 0.05\).
  4. Buatlah keputusan statistik.
  5. Jelaskan bagaimana ukuran sampel mempengaruhi keandalan inferensi.

2.3 Jawab

2.3.1 Formulasi Hipotesis

Hipotesis Nol (H₀):

μ = 10 menit

Artinya, Rata-rata waktu penyelesaian tugas sama dengan 10 menit

Hipotesis Alternatif (H₁):

μ ≠ 10 menit

Artinya, Rata-rata waktu penyelesaian tugas berbeda dari 10 menit

Jenis uji: Dua arah (two-tailed) karena ingin mengetahui apakah ada perbedaan (lebih cepat atau lebih lambat) tanpa arah spesifik.

2.3.2 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

2.3.3 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:

  1. 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\]

  2. Hitung standar deviasi sampel \((s):\)

    \[s = √[Σ(xᵢ - x̄)²/(n-1)] ≈ 0.364 meni\]t

  3. Hitung standard error \((SE):\)

    \[SE = s / √n = 0.364 / √10 ≈ 0.115\]

  4. Hitung statistik t:

    \[t = (x̄ - μ₀) / SE = (9.96 - 10) / 0.115 = -0.04 / 0.115 ≈ -0.348\]

  5. Derajat kebebasan \((df):\)

    \[df = n - 1 = 10 - 1 = 9\]

  6. Nilai-p (dua arah):

\[ p-value = 2 × P(t < -0.348 | df=9) ≈ 0.735\]

  1. Nilai t kritis \((α = 0.05, df = 9):\)

    t_kritis = ±2.262

2.3.4 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₀

2.3.5 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

3 Studi Kasus 3

3.1 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

3.2 Tugas

  1. Rumuskan hipotesis nol dan hipotesis alternatif.
  2. Identifikasi jenis uji-t yang diperlukan.
  3. Hitung statistik uji dan nilai-p.
  4. Tarik kesimpulan statistik dengan \(\alpha = 0.05\).
  5. Interpretasikan hasilnya untuk pengambilan keputusan produk.

3.3 Jawab

3.3.1 Formulasi Hipotesis

Hipotesis Nol (H₀):

\(μ_A = μ_B\)

Artinya, Tidak ada perbedaan rata-rata durasi sesi antara versi A dan versi B

Hipotesis Alternatif (H₁):

\(μ_A ≠ μ_B\)

Artinya, Ada perbedaan rata-rata durasi sesi antara versi A dan versi B

Jenis uji: Dua arah (two-tailed) karena ingin mengetahui apakah ada perbedaan (tanpa menentukan mana yang lebih baik).

3.3.2 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)

3.3.3 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:

  1. Hitung selisih mean:

    \[x̄₂ - x̄₁ = 5.4 - 4.8 = 0.6 menit\]

  2. Hitung standard error \((SE):\)

SE = √(s₁²/n₁ + s₂²/n₂) = √(1.2²/25 + 1.4²/25) = √(0.0576 + 0.0784) = √0.136 = 0.369

  1. Hitung statistik t:

    \[t = (x̄₂ - x̄₁) / SE = 0.6 / 0.369 ≈ 1.625\]

  2. Hitung derajat kebebasan (df) dengan formula Welch-Satterthwaite:

    \[df ≈ 46.5 (dibulatkan ke bawah menjadi 46)\]

  3. Hitung nilai-p (dua arah):

    \[p-value = 2 × P(t > 1.625 | df ≈ 46) ≈ 0.111\]

  4. Nilai t kritis \((α = 0.05, df = 46):\)

    t_kritis ≈ ±2.013

3.3.4 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₀

3.3.5 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%

3.3.5.1 Implikasi untuk Tim Produk:

Temuan Kunci:

  1. Tidak ada winner clear: Baik versi A maupun B tidak menunjukkan performa yang signifikan berbeda

  2. Effect size kecil: Perbedaan 0.6 menit (≈10% dari mean) mungkin relevan secara praktis tetapi tidak signifikan statistik

  3. 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

  • Alasan: Perbedaan praktis (0.6 menit) mungkin meaningful

  • Risiko: Membutuhkan waktu dan resources tambahan

  • Tindakan:

    • Tingkatkan sample size (n ≥ 50 per grup)
    • Test dengan variasi yang lebih ekstrem
    • Monitor metrics sekunder (conversion rate, bounce rate)

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:

  1. Power analysis: Hitung sample size yang dibutuhkan untuk mendeteksi perbedaan 0.6 menit

  2. Segmentasi pengguna: Analisis perbedaan berdasarkan demografi/perilaku

  3. Metrics tambahan: Conversion rate, engagement, user satisfaction

  4. 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.”


4 Studi Kasus 4

4.1 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

4.2 Tugas

  1. Nyatakan Hipotesis Nol (H₀) dan Hipotesis Alternatif (H₁).
  2. Identifikasi uji statistik yang sesuai.
  3. Hitung statistik Chi-Square (χ²).
  4. Tentukan nilai-p dengan \(\alpha = 0.05\).
  5. Interpretasikan hasilnya dalam kaitannya dengan strategi pembayaran digital.

4.3 Jawab

4.3.1 Formulasi Hipotesis

Hipotesis Nol (H₀):

Tidak ada hubungan antara jenis perangkat dan preferensi metode pembayaran

Artinya: Pilihan metode pembayaran tidak tergantung pada jenis perangkat yang digunakan

Hipotesis Alternatif (H₁):

Ada hubungan antara jenis perangkat dan preferensi metode pembayaran

Artinya: Pilihan metode pembayaran tergantung pada jenis perangkat yang digunakan

4.3.2 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.

4.3.3 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:

  1. 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
  1. 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

  1. Derajat Kebebasan (df):
  • df = (jumlah baris - 1) × (jumlah kolom - 1) = (2-1) × (3-1) = 1 × 2 = 2

4.3.4 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):

  • χ²_kritis = 5.991

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₀

4.3.5 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)

4.3.5.1 Analisis Pola Hubungan:

Preferensi Berdasarkan Perangkat:

  1. 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%
  2. 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%

4.3.5.2 Implikasi Strategis:

  1. 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
  1. 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
  1. Cross-Device Strategy:
  • Saved preferences: Sync payment methods across devices
  • Progressive profiling: Collect payment info gradually
  • Personalized offers: Berdasarkan device dan payment history

4.3.5.3 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.”


5 Studi Kasus 5

5.1 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.

5.2 Tugas

  1. Jelaskan Galat Tipe I (α) dalam konteks ini.
  2. Jelaskan Galat Tipe II (β) dalam konteks ini.
  3. Identifikasi galat mana yang lebih mahal dari perspektif bisnis.
  4. Diskusikan bagaimana ukuran sampel mempengaruhi Galat Tipe II.
  5. Jelaskan hubungan antara α, β, dan power statistik.

5.3 Jawab

5.3.1 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.

5.3.2 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.

5.3.3 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

5.3.4 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

5.3.5 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-β):

  1. Ukuran efek: Efek besar lebih mudah dideteksi
  2. Ukuran sampel: Sampel besar meningkatkan power
  3. Variabilitas data: Data yang konsisten meningkatkan power
  4. Tingkat signifikansi (α): α yang lebih besar meningkatkan power

5.3.5.1 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.


6 Studi Kasus 6

6.1 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\)

6.2 Tugas

  1. Jelaskan makna nilai-p.
  2. Buatlah keputusan statistik.
  3. Terjemahkan keputusan tersebut ke dalam bahasa non-teknis untuk manajemen.
  4. Diskusikan risikonya jika sampel tidak representatif.
  5. Jelaskan mengapa nilai-p tidak mengukur ukuran efek (effect size).

6.3 Jawab

6.3.1 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₀

6.3.2 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:

  1. Bandingkan p-value (0.021) dengan α (0.05)
  2. 0.021 < 0.05
  3. 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

6.3.3 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)

6.3.4 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:

  1. 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
  1. Bias dalam prediksi:
  • Model jadi akurat untuk segmen tertentu saja
  • Miss segment lainnya yang penting
  • Program retensi tidak efektif untuk sebagian pelanggan
  1. Generalization error tinggi:
  • Model overfit ke karakteristik sampel
  • Tidak robust terhadap variasi di populasi
  • Perlu constant retraining dan adjustment
  1. 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.

6.3.5 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

6.3.5.1 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

6.3.5.2 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”.


7 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