Essentials of Probability

Exercises ~ Week 10


Profile Photo


1 Introduction

Probabilitas merupakan pilar dasar penalaran statistik, yang menawarkan kerangka kerja yang sistematis dan koheren untuk memahami ketidakpastian dan memandu pengambilan keputusan yang terinformasi. Alih-alih mengandalkan intuisi atau dugaan, probabilitas memungkinkan kita untuk mengukur kemungkinan berbagai hasil, menafsirkan pola dalam data, dan menganalisis fenomena yang muncul dari proses alami atau eksperimental. Penguasaan konsep probabilitas yang kuat sangat penting untuk analisis data yang efektif, penelitian ilmiah, dan praktik berbasis bukti.

Bagian ini menyajikan prinsip-prinsip utama yang membentuk dasar teori probabilitas:

  • Konsep dasar probabilitas, termasuk ruang sampel, kejadian, dan aturan komponen-komponen inti yang menentukan bagaimana probabilitas disusun dan ditafsirkan.
  • Peristiwa independen dan dependen, yang membedakan skenario dimana terjadinya datu peristiwa memengaruhi atau tidak memengaruhi peristiwa lain, suatu perbedaan penting untuk pemodelan dan prediksi yang akurat.
  • Gabungan kejadian. yang membahas kemungkinan bahwa setidaknya satu di antara beberapa kejadian akan terjadi.
  • Peristiwa ekslusif dan lengkap, mengklarifikasi bagaimana peristiwa berinteraksi dalam ruang sampel dan bagaimana hubungan tersebut membentuk perhitungan probabilitas.
  • Eksperimen binomial dan distribusi binomial, alat penting untuk menganalisis percobaan berulang dengan dua kemungkinan hasil, banyak digunakan dalam studi ilmiah, pengujian keandalan, dan analisis survei.

Setiap topik dilengkapi dengan sumber daya video intruksional yang dirancang untuk meningkatkan pemahaman konseptual dan mendukung keterlibatan yang lebih mendalam dengan materi. Bersama-sama, komponen-komponen ini memberikan landasan yang komprehensif dan kokoh untuk maju ke metodestatistik yang lebih kompleks.

2 Fundamental Concept

Probabilitas adalah fondasi utama dalam statistika dan sains data. Video “Basic Probability” memberikan pemahaman komprehensif tentang bagaimana kita mengukur dan menginterpretasi ketidakpastian dalam berbagai aspek kehidupan.

2.1 Interpretasi

Video ini adalah pintu masuk yang menjelaskan bahwa peluang adalah disiplin yang tertata. Ia mengajarkan pentingnya definitif (menggunakan rumus), komprehensif (menggunakan ruang sampel), dan efisien (menggunakan Aturan Komplemen) dalam setiap analisis risiko dan kemungkinan.

2.2 Definisi Probabilitas


esensi_probabilitas <- data.frame(
  Konsep = c("Apa itu Probabilitas?", "Domain Nilai", "Notasi Matematis", "Interpretasi Filosofis"),
  Definisi = c(
    "Ukuran kuantitatif kemungkinan terjadinya suatu peristiwa",
    "Bilangan real antara 0 sampai 1 inklusif",
    "P(A) dimana A adalah kejadian/event",
    "Bahasa matematika untuk mengkuantifikasi ketidakpastian"
  ),
  Contoh_Kontekstual = c(
    "Seperti thermometer untuk mengukur 'panasnya' kemungkinan",
    "Skala universal: 0 = mustahil, 1 = pasti",
    "P(hujan) = 0.7 artinya 70% kemungkinan hujan",
    "Alat bantu pengambilan keputusan dalam kondisi tidak pasti"
  )
)

knitr::kable(esensi_probabilitas, caption = "ESENSI DASAR ")
ESENSI DASAR
Konsep Definisi Contoh_Kontekstual
Apa itu Probabilitas? Ukuran kuantitatif kemungkinan terjadinya suatu peristiwa Seperti thermometer untuk mengukur ‘panasnya’ kemungkinan
Domain Nilai Bilangan real antara 0 sampai 1 inklusif Skala universal: 0 = mustahil, 1 = pasti
Notasi Matematis P(A) dimana A adalah kejadian/event P(hujan) = 0.7 artinya 70% kemungkinan hujan
Interpretasi Filosofis Bahasa matematika untuk mengkuantifikasi ketidakpastian Alat bantu pengambilan keputusan dalam kondisi tidak pasti

Probabilitas adalah “jembatan” antara ketidakpastian dunia nyata dan kepastian matematika.


skala_probabilitas <- data.frame(
  Nilai = c("0", "0 < P < 0.3", "0.3 ≤ P < 0.7", "0.7 ≤ P < 1", "1"),
  Kategori = c("Mustahil", "Kemungkinan Kecil", "Kemungkinan Sedang", "Kemungkinan Besar", "Pasti"),
  Interpretasi_Praktis = c(
    "Tidak akan terjadi dalam kondisi apapun",
    "Jarang terjadi, butuh keberuntungan",
    "Bisa terjadi atau tidak, cukup seimbang", 
    "Sangat mungkin terjadi, hampir pasti",
    "Terjadi dengan kepastian mutlak"
  ),
  Contoh_Real = c(
    "Matahari terbit dari barat",
    "Menang lotre (P ≈ 0.0000001)",
    "Koin adil (P = 0.5), cuaca mendung",
    "Musim hujan di bulan Desember",
    "Matahari terbit dari timur"
  )
)

knitr::kable(skala_probabilitas, caption = "SKALA NILAI PROBABILITAS & INTERPRETASI")
SKALA NILAI PROBABILITAS & INTERPRETASI
Nilai Kategori Interpretasi_Praktis Contoh_Real
0 Mustahil Tidak akan terjadi dalam kondisi apapun Matahari terbit dari barat
0 < P < 0.3 Kemungkinan Kecil Jarang terjadi, butuh keberuntungan Menang lotre (P ≈ 0.0000001)
0.3 ≤ P < 0.7 Kemungkinan Sedang Bisa terjadi atau tidak, cukup seimbang Koin adil (P = 0.5), cuaca mendung
0.7 ≤ P < 1 Kemungkinan Besar Sangat mungkin terjadi, hampir pasti Musim hujan di bulan Desember
1 Pasti Terjadi dengan kepastian mutlak Matahari terbit dari timur

komponen_probabilitas <- data.frame(
  Komponen = c("Ruang Sampel (S)", "Kejadian/Event (A, B, ...)", "Fungsi Probabilitas P(·)", "Aksioma Probabilitas"),
  Peran = c(
    "Mendefinisikan 'dunia kemungkinan'",
    "Subset dari S yang kita minati", 
    "Aturan penugasan nilai ke setiap kejadian",
    "Aturan main matematika yang harus dipenuhi"
  ),
  Analogi = c(
    "Seluruh papan catur",
    "Posisi bidak tertentu yang kita amati",
    "Cara menghitung nilai setiap posisi",
    "Aturan permainan catur itu sendiri"
  ),
  Syarat = c(
    "Himpunan semua outcome yang mungkin",
    "A ⊆ S (subset dari ruang sampel)",
    "0 ≤ P(A) ≤ 1 untuk semua A ⊆ S",
    "P(S) = 1, P(∅) = 0, additivity"
  )
)

knitr::kable(komponen_probabilitas, caption = "KOMPONEN PENYUSUN SISTEM PROBABILITAS")
KOMPONEN PENYUSUN SISTEM PROBABILITAS
Komponen Peran Analogi Syarat
Ruang Sampel (S) Mendefinisikan ‘dunia kemungkinan’ Seluruh papan catur Himpunan semua outcome yang mungkin
Kejadian/Event (A, B, …) Subset dari S yang kita minati Posisi bidak tertentu yang kita amati A ⊆ S (subset dari ruang sampel)
Fungsi Probabilitas P(·) Aturan penugasan nilai ke setiap kejadian Cara menghitung nilai setiap posisi 0 ≤ P(A) ≤ 1 untuk semua A ⊆ S
Aksioma Probabilitas Aturan main matematika yang harus dipenuhi Aturan permainan catur itu sendiri P(S) = 1, P(∅) = 0, additivity

Keempat komponen ini membentuk “ekosistem” probabilitas yang saling terkait.


aksioma_probabilitas <- data.frame(
  Aksioma = c("Aksioma 1: Non-Negativity", "Aksioma 2: Normalization", "Aksioma 3: Additivity"),
  Rumus = c("P(A) ≥ 0", "P(S) = 1", "P(A ∪ B) = P(A) + P(B) jika A ∩ B = ∅"),
  Makna_Intuitif = c(
    "Probabilitas tidak mungkin negatif",
    "Total probabilitas semua kemungkinan = 1 (100%)",
    "Probabilitas gabungan kejadian terpisah = jumlah masing-masing"
  ),
  Contoh_Penerapan = c(
    "P(hujan) tidak mungkin -0.5",
    "P(angka) + P(gambar) = 1 pada koin",
    "P(genap) + P(ganjil) = 1 pada dadu"
  )
)

knitr::kable(aksioma_probabilitas, caption = "AKSIOMA DASAR PROBABILITAS KOLMOGOROV")
AKSIOMA DASAR PROBABILITAS KOLMOGOROV
Aksioma Rumus Makna_Intuitif Contoh_Penerapan
Aksioma 1: Non-Negativity P(A) ≥ 0 Probabilitas tidak mungkin negatif P(hujan) tidak mungkin -0.5
Aksioma 2: Normalization P(S) = 1 Total probabilitas semua kemungkinan = 1 (100%) P(angka) + P(gambar) = 1 pada koin
Aksioma 3: Additivity P(A ∪ B) = P(A) + P(B) jika A ∩ B = ∅ Probabilitas gabungan kejadian terpisah = jumlah masing-masing P(genap) + P(ganjil) = 1 pada dadu

Aksioma ini adalah fondasi matematika yang menjamin konsistensi seluruh teori probabilitas.

2.3 Konsep-konsep Fundamental

2.3.1 Ruang Sampel (Sample Space)

  • Simbol: S atau Ω
  • Definisi: Himpunan SEMUA hasil yang mungkin
  • Contoh:
    • Koin: S = {Angka, Gambar}
    • Dadu: S = {1,2,3,4,5,6}

2.3.2 Kejadian (Events)

  • Definisi: Subset dari ruang sampel
  • Jenis-jenis:
    • Sederhana: Satu hasil {3}
    • Majemuk: Beberapa hasil {2,4,6}
    • Saling Lepas: Tidak bisa terjadi bersamaan

konsep_dasar <- data.frame(
  Konsep = c("Ruang Sampel (S)", "Kejadian Sederhana", "Kejadian Majemuk", "Kejadian Saling Lepas"),
  Simbol = c("S atau Ω", "A = {hasil tunggal}", "A = {beberapa hasil}", "A ∩ B = ∅"),
  Contoh = c(
    "Dadu: {1,2,3,4,5,6}",
    "A = {muncul angka 3}",
    "A = {angka genap} = {2,4,6}",
    "{Angka} dan {Gambar} pada koin"
  )
)

knitr::kable(konsep_dasar, caption = "Konsep-Konsep Fundamental")
Konsep-Konsep Fundamental
Konsep Simbol Contoh
Ruang Sampel (S) S atau Ω Dadu: {1,2,3,4,5,6}
Kejadian Sederhana A = {hasil tunggal} A = {muncul angka 3}
Kejadian Majemuk A = {beberapa hasil} A = {angka genap} = {2,4,6}
Kejadian Saling Lepas A ∩ B = ∅ {Angka} dan {Gambar} pada koin

2.4 Aturan Dasar Probabilitas

2.4.1 Aturan Penjumlahan

Untuk kejadian saling lepas:

P(A U B) = P(A) + P(B)

2.4.2 Probabilitas Komplemen

P(A’) = 1 - P(A)


aturan <- data.frame(
  Aturan = c("Penjumlahan (Saling Lepas)", "Penjumlahan (Tidak Saling Lepas)", "Komplemen"),
  Rumus = c("P(A ∪ B) = P(A) + P(B)", "P(A ∪ B) = P(A) + P(B) - P(A ∩ B)", "P(A') = 1 - P(A)"),
  Contoh = c(
    "P(genap atau ganjil) = 0.5 + 0.5 = 1",
    "P(genap atau >3) = 0.5 + 0.5 - 0.33 = 0.67",
    "P(bukan gambar) = 1 - 0.5 = 0.5"
  )
)

knitr::kable(aturan, caption = "Aturan Dasar Probabilitas")
Aturan Dasar Probabilitas
Aturan Rumus Contoh
Penjumlahan (Saling Lepas) P(A ∪ B) = P(A) + P(B) P(genap atau ganjil) = 0.5 + 0.5 = 1
Penjumlahan (Tidak Saling Lepas) P(A ∪ B) = P(A) + P(B) - P(A ∩ B) P(genap atau >3) = 0.5 + 0.5 - 0.33 = 0.67
Komplemen P(A’) = 1 - P(A) P(bukan gambar) = 1 - 0.5 = 0.5

2.5 Contoh Perhitungan Praktis


contoh <- data.frame(
  Scenario = c("Koin", "Dadu", "Kartu Remi", "Cuaca"),
  Ruang_Sampel = c("2", "6", "52", "2 (Hujan/Cerah)"),
  Kejadian = c("Muncul Gambar", "Angka > 4", "Kartu Heart", "Hujan"),
  Perhitungan = c("1/2", "2/6", "13/52", "0.3 (contoh)"),
  Hasil = c("0.5", "0.33", "0.25", "0.3")
)

knitr::kable(contoh, caption = "Contoh Perhitungan Probabilitas")
Contoh Perhitungan Probabilitas
Scenario Ruang_Sampel Kejadian Perhitungan Hasil
Koin 2 Muncul Gambar 1/2 0.5
Dadu 6 Angka > 4 2/6 0.33
Kartu Remi 52 Kartu Heart 13/52 0.25
Cuaca 2 (Hujan/Cerah) Hujan 0.3 (contoh) 0.3

2.6 Aplikasi dalam Kehidupan Nyata

2.6.1 Pengambilan Keputusan Sehari-hari

  • Memutuskan bawa payung: Berdasarkan P(hujan)
  • Memilih rute perjalanan: Berdasarkan P(kemacetan)
  • Berinvestasi: Berdasarkan P(profit)

2.6.2 Ilmu Pengetahuan dan Penelitian

  • Desain eksperimen
  • Uji hipotesis
  • Analisis data

2.6.3 Teknologi dan Bisnis

  • Machine learning
  • Analisis risiko
  • Prediksi pasar

aplikasi <- data.frame(
  Bidang = c("Kesehatan", "Bisnis", "Teknologi", "Keuangan"),
  Aplikasi = c(
    "Diagnosis penyakit, uji klinis",
    "Analisis risiko, forecasting",
    "Machine learning, AI",
    "Manajemen portofolio, asuransi"
  ),
  Contoh = c(
    "P(sakit | gejala tertentu)",
    "P(sukses produk baru)",
    "P(klasifikasi benar)",
    "P(default kredit)"
  )
)

knitr::kable(aplikasi, caption = "Aplikasi Probabilitas di Berbagai Bidang")
Aplikasi Probabilitas di Berbagai Bidang
Bidang Aplikasi Contoh
Kesehatan Diagnosis penyakit, uji klinis P(sakit | gejala tertentu)
Bisnis Analisis risiko, forecasting P(sukses produk baru)
Teknologi Machine learning, AI P(klasifikasi benar)
Keuangan Manajemen portofolio, asuransi P(default kredit)

2.7 Simulasi dan Bukti Empiris


set.seed(123)
n_simulasi <- 1000

# Simulasi pelemparan koin
hasil_koin <- sample(c("G", "A"), n_simulasi, replace = TRUE)
p_gambar_empiris <- mean(hasil_koin == "G")

# Simulasi pelemparan dadu
hasil_dadu <- sample(1:6, n_simulasi, replace = TRUE)
p_genap_empiris <- mean(hasil_dadu %% 2 == 0)

hasil_simulasi <- data.frame(
  Eksperimen = c("Pelemparan Koin", "Pelemparan Dadu"),
  Probabilitas_Empiris = c(round(p_gambar_empiris, 3), round(p_genap_empiris, 3)),
  Probabilitas_Teoritis = c("0.500", "0.500"),
  Selisih = c(
    round(abs(p_gambar_empiris - 0.5), 3),
    round(abs(p_genap_empiris - 0.5), 3)
  )
)

knitr::kable(hasil_simulasi, caption = "Hasil Simulasi 1000 Percobaan")
Hasil Simulasi 1000 Percobaan
Eksperimen Probabilitas_Empiris Probabilitas_Teoritis Selisih
Pelemparan Koin 0.506 0.500 0.006
Pelemparan Dadu 0.491 0.500 0.009

2.8 Kesimpulan

  1. Probabilitas mengkuantifikasi ketidakpastian
  2. Ruang sampel mendefinisikan semua kemungkinan
  3. Aturan probabilitas sistematis dan konsisten
  4. Aplikasi sangat luas di berbagai bidang

3 Independent and Dependent

Setelah kita menguasai dasar-dasar probabilitas, ruang sampel, dan Aturan Komplemen, kini saatnya kita melangkah lebih jauh ke dalam skenario di mana dua atau lebih kejadian terjadi secara berurutan atau bersamaan. Video ini, “Probability of Independent and Dependent Events (6.2)”, berfokus pada dinamika interaksi antar-kejadian.

Pertanyaan mendasar yang akan kita jawab adalah: Apakah hasil dari satu kejadian mengubah peluang terjadinya kejadian berikutnya? Materi ini adalah kunci untuk memodelkan realitas yang lebih kompleks. Kita akan mendalami perbedaan krusial antara:

  • Kejadian Independen: Di mana peristiwa satu tidak memiliki dampak apa pun pada peristiwa lain. Di sini, perhitungannya relatif sederhana, hanya melibatkan perkalian probabilitas awal.

  • Kejadian Dependen: Di mana hasil dari kejadian pertama secara material mengubah komposisi atau kondisi, sehingga probabilitas kejadian kedua harus disesuaikan. Ini memperkenalkan konsep penting dari Probabilitas Bersyarat (P(B A)), yang esensial dalam situasi “tanpa pengembalian” (without replacement).

Dengan memahami dan menerapkan kedua aturan ini—perkalian sederhana untuk independen, dan perkalian dengan peluang bersyarat untuk dependen—Anda akan siap menganalisis berbagai skenario probabilitas gabungan, dari permainan kartu hingga pengambilan sampel statistik.

3.1 Interpretasi

  • Materi ini membahas bagaimana menghitung probabilitas ketika dua kejadian (A dan B) terjadi secara berurutan, dengan fokus pada apakah kejadian tersebut saling memengaruhi (Dependen) atau tidak saling memengaruhi (Independen).

  • Analisis yang tepat dalam probabilitas dimulai dengan menentukan apakah peristiwa pertama mengubah kondisi (penyebut) untuk peristiwa kedua. Ini memaksa kita beralih dari perkalian sederhana ke penggunaan Peluang Bersyarat (P(B|A)).

3.2 Kejadian Independen (Independent Events)

Definisi: Dua kejadian (A dan B) disebut independen jika hasil dari A tidak memengaruhi probabilitas terjadinya B. Probabilitas kejadian independen bersifat tanpa pengembalian konseptual (misalnya, melempar dadu dan koin).

Contoh Utama: Melempar Dadu dan Melempar Koin.Hasil dari dadu (misalnya, mendapat angka 6) tidak akan mengubah peluang koin mendarat pada Kepala (H) atau Ekor (T). Peluang H akan tetap 0.5.

Rumus: Untuk menghitung probabilitas dua peristiwa independen A dan B terjadi bersamaan, Cukup dengan mengalikan probabilitas masing-masing peristiwa. Ini dikenal sebagai Aturan Perkalian untuk Peristiwa Independen.

\[P(A \text{ dan } B) = P(A) \times P(B)\]

Contoh Kasus: Peluang mendapatkan angka 5 pada dadu \((P(A)=1/6)\) dan Head pada koin \((P(B)=1/2)\).

Langkah 1: Tentukan P(A) (Mendapatkan 5 pada Dadu)

  • Hasil yang menguntungkan: 1(angka 5)
  • Total Hasil: 6(1,2,3,4,5,6)

\[P(A) = \frac{1}{6}\]

Langkah 2: Tentukan P(B) (Mendapatkan Head pada Koin)

  • Hasil yang menguntungkan: 1(Head)
  • Total Hasil: 2(Head,Tail)

\[P(B) = \frac{1}{2}\] Langkah 3: Kalikan Probabilitas \[P(A \text{ dan } B) = \frac{1}{6} \times \frac{1}{2} = \frac{1}{12} \approx 0.0833 \text{ atau } 8.33\%\]

3.3 Kejadian Dependen (Dependent Events)

Definisi: Dua kejadian (A dan B) disebut dependen jika hasil dari A memengaruhi probabilitas terjadinya B. Peristiwa ini sering terjadi dalam skenario tanpa pengembalian (without replacement), di mana ruang sampel berkurang setelah kejadian pertama.

Rumus Utama: Peluang bahwa kejadian A dan B keduanya terjadi:

\[P(A \cap B) = P(A \text{ dan } B) = P(A) \times P(B \mid A)\]

Di mana \(P(B \mid A)\) adalah Probabilitas Bersyarat (Conditional Probability) – peluang B terjadi setelah A terjadi.

Contoh Kasus: Kotak berisi 7 kelereng hijau (H) dan 3 kelereng biru (B) (Total 10). Anda mengambil dua kelereng tanpa pengembalian. Maka, berapa peluang mengambil kelereng hijau pertama dan biru kedua?

Karena ini adalah peristiwa tanpa pengembalian, probabilitasnya dependen. Rumus yang digunakan adalah: \[P(H_1 \text{ dan } B_2) = P(H_1) \times P(B_2 \mid H_1)\]

Langkah 1: Tentukan \(P(H_1)\) (Peluang Hijau Pertama)

  • Hijau Awal: 7
  • Total Awal: 10 \[P(H_1) = \frac{7}{10}\]

Langkah 2: Tentukan \(P(B_2 \mid H_1)\) (Peluang biru kedua, setelah hijau diambil)

  • Total sisa: 9(karena 1 hijau sudah diambil)
  • Biru sisa: 3(jumlah biru tidak berubah) \[P(B_2 \mid H_1) = \frac{3}{9}\]

Langkah 3: Kalikan probabilitas gabungan

\[P(H_1 \text{ dan } B_2) = \frac{7}{10} \times \frac{3}{9} = \frac{21}{90} = \frac{7}{30} \approx 0.2333 \text{ atau } 23.33\%\]

Soal lain: Berapakah Peluang mengambil kelereng hijau pertama dan hijau kedua?

Rumus yang digunakan: \[P(H_1 \text{ dan } H_2) = P(H_1) \times P(H_2 \mid H_1)\]

Langkah 1: Tentukan \(P(H_1)\) (Peluang hijau pertama)

  • Hijau awal: 7
  • Total awal: 10 \[P(H_1) = \frac{7}{10}\]

**Langkah 2: Tentukan \(P(H_2 \mid H_1)\) (Peluang hijau kedua, setelah hijau diambil)

Setelah kelereng hijau pertama diambil, ruang sampel berkurang: Total sisa: 9 Hijau sisa: 6

\[P(H_2 \mid H_1) = \frac{6}{9}\]

Langkah 3: Kalikan probabilitas gabungan

\[P(H_1 \text{ dan } H_2) = \frac{7}{10} \times \frac{6}{9} = \frac{42}{90} = \frac{7}{15} \approx 0.4667 \text{ atau } 46.67\%\]

4 Union of Events

Setelah kita menguasai Aturan Perkalian untuk kejadian independen dan dependen, kita beralih ke konsep fundamental lain: Aturan Penjumlahan, yang mengatur probabilitas ketika kita tertarik pada setidaknya satu dari dua kejadian.

Pemahaman ini, yang divisualisasikan dengan jelas melalui Diagram Venn, memberikan alat yang kuat untuk memecahkan masalah probabilitas yang kompleks. Materi ini melengkapi pemahaman kita tentang probabilitas dasar, memberikan alat yang kuat untuk memecahkan masalah yang melibatkan kata kunci “atau”.

4.1 Interpetasi

  • Video ini, “The Probability of the Union of Events”, memperkenalkan kita pada Union of Events \[(P(A \text{ atau } B))\]. Ini adalah konsep penting untuk menghitung peluang bahwa salah satu dari dua kejadian atau keduanya akan terjadi. Union of Events ditandai dengan kata kunci “ATAU” (OR) dalam pertanyaan probabilitas.

  • ketika kita menjumlahkan peluang dua peristiwa, kita harus selalu memastikan untuk tidak menghitung irisan (interseksi) yang tumpang tindih sebanyak dua kali.

  • Inti dari Aturan Penjumlahan adalah menghindari kesalahan krusial yang dikenal sebagai penghitungan ganda (double-counting). Kita akan mendalami mengapa Intersection of Events \((P(A \text{ dan } B))\), yaitu daerah tumpang tindih antara A dan B, harus dikurangi dari total penjumlahan P(A) dan P(B).

4.2 Tinjauan Dasar Probabilitas

Ruang Sampel (Sample Space): Seluruh set hasil yang mungkin dalam eksperimen statistik.

Contoh: Melempar dua dadu 6 sisi menghasilkan total \[6 \times 6 = \mathbf{36}\] hasil yang mungkin.

Probabilitas Sederhana: Dihitung dengan membagi jumlah hasil yang menguntungkan dengan total hasil yang mungkin dalam ruang sampel.

Contoh: \[P(\text{mendapat dua angka 4}) = \mathbf{1/36}\].

4.3 Aturan Penjumlahan (The Addition Rule / Union of Events)

Union of Events adalah peluang salah satu kejadian (A atau B) terjadi. Kejadian yang dicakup termasuk: A terjadi, B terjadi, atau A dan B keduanya terjadi.

Rumus Utama (General Addition Rule): \[P(A \text{ atau } B) = P(A) + P(B) - P(A \text{ dan } B)\] Mengapa Ada Pengurangan \(( -P(A \text{ dan } B))?\)

Karena istilah pengurangan \(-P(A \text{ dan } B)\) diperlukan untuk menghilangkan tumpang tindih (overlap) atau duplikasi hasil yang dihitung.

Intersection of Events \((P(A \text{ dan } B))\) Adalah peluang kedua kejadian terjadi secara bersamaan. Ketika Anda menjumlahkan P(A) + P(B), hasil di area irisan (intersection) dihitung dua kali (sekali untuk A dan sekali untuk B). Pengurangan ini memastikan area tumpang tindih hanya dihitung satu kali.

4.4 Contoh Penerapan Rinci (Dua Dadu)

Soal: Berapa probabilitas melempar dua dadu mendapat dua angka genap (A) ATAU mendapat setidaknya satu angka 2 (B)?

4.4.1 Hitung Peluang Komponen

  1. P(A): Peluang mendapat dua angka genap.
    • Hasil yang menguntungkan (contoh: (2,2), (2,4), (4,6), dst.) = 9 hasil.

Jadi, \[P(A) = 9/36\]

  1. P(B): Peluang mendapat setidaknya satu angka 2.
    • Hasil yang menguntungkan = 11 hasil.

Jadi, \[P(B) = 11/36\]

4.4.2 Hitung Irisan (Intersection)

\[P(A \text{ dan } B)\] adalah peluang mendapat dua angka genap dan setidaknya satu angka 2.

Ini adalah hasil yang menjadi irisan dari set A dan set B (contoh: (2,4), (4,2), (2,6), (6,2), (2,2)) = 5 hasil.

Jadi, \[P(A \text{ dan } B) = 5/36\]

4.4.3 Hitung Union Menggunakan Rumus

Substitusikan nilai ke dalam General Addition Rule:

\[P(A \text{ atau } B) = P(A) + P(B) - P(A \text{ dan } B)\]

\[P(A \text{ atau } B) = \frac{9}{36} + \frac{11}{36} - \frac{5}{36}\]

\[P(A \text{ atau } B) = \frac{15}{36} \approx 0.4167\]

5 Exclusive and Exhaustive

Video “Mutually Exclusive and Exhaustive Events” memberikan kita alat diagnostik untuk menyederhanakan perhitungan probabilitas. Kejadian yang Saling Lepas menghilangkan kerumitan irisan (intersection), karena tidak ada tumpang tindih sama sekali. Sementara itu, Kejadian Lengkap memberikan kepastian bahwa semua hasil yang mungkin telah tercakup. Penguasaan kedua konsep ini memungkinkan kita menerapkan Aturan Penjumlahan dalam bentuk yang paling sederhana, memperkuat fondasi kita dalam memecahkan masalah probabilitas.

5.1 Interpretasi

Video ini mengajarkan kita untuk mengkategorikan hubungan antarperistiwa (apakah mereka tumpang tindih atau tidak, dan apakah mereka mencakup semua kemungkinan) sebelum melakukan perhitungan peluang yang lebih kompleks.

5.2 Peristiwa Saling Lepas (Mutually Exclusive Events)

Definisi: Dua atau lebih peristiwa dikatakan Saling Lepas (Mutually Exclusive) jika mereka tidak dapat terjadi secara bersamaan dalam satu kali percobaan.

  • P(A dan B): Probabilitas irisan \((A \cap B)\) selalu nol (0).

  • Visualisasi: Dalam Diagram Venn, lingkaran untuk A dan B tidak bersentuhan atau tidak tumpang tindih. Karena tidak ada tumpang tindih yang perlu dikurangi, rumusnya disederhanakan menjadi: \[P(A \text{ atau } B) = P(A) + P(B)\]

Contoh Kasus: Pelemparan Dadu Tunggal

Soal: Peluang mendapat angka ganjil (A) atau angka 6 (B) dalam satu lemparan dadu.

  • \(A = \{1, 3, 5\}\)
  • \(B = \{6\}\)
  • Saling Lepas: Ya, karena Anda tidak mungkin mendapat angka ganjil dan angka 6 secara bersamaan.

5.3 Peristiwa Lengkap (Exhaustive Events)

Definisi: Sekelompok peristiwa dikatakan Lengkap (Exhaustive) jika seluruh hasil yang mungkin dalam ruang sampel tercakup oleh peristiwa-peristiwa tersebut.

  • P(Union): Probabilitas gabungan (Union) dari semua peristiwa tersebut harus sama dengan satu (1).

\[P(E_1 \text{ atau } E_2 \text{ atau } ... \text{ atau } E_n) = 1\]

  • Kombinasi: Peristiwa yang saling lepas (tidak tumpang tindih) dan lengkap (meliputi seluruh ruang sampel) adalah yang paling ideal, karena penjumlahan semua peluangnya sama dengan 1.

\[\sum P(E_i) = 1\]

Contoh Kasus: Hasil Pertandingan

Soal: Hasil akhir pertandingan sepak bola (A = Menang, B = Kalah, C = Seri).

  • Lengkap: Ya, karena tidak ada hasil lain yang mungkin (selalu 100%).

  • Jika diketahui: \(P(\text{Menang})\) = 0.40 dan \(P(\text{Kalah})\) = 0.35.

  • Maka, \(P(\text{Seri})\) = 1 - \(P(\text{Menang})\) - \(P(\text{Kalah})\)

6 Binomial Experiment

Dalam dunia statistika, seringkali kita dihadapkan pada situasi di mana sebuah eksperimen hanya memiliki dua hasil yang mungkin (sukses atau gagal) dan dilakukan berulang kali. Video ini sangat relevan bagi pelajar atau siapa pun yang ingin memahami cara menghitung peluang dalam kondisi tersebut tanpa harus menjabarkan setiap kemungkinan secara manual. Penjelasan dimulai dari konsep dasar, syarat-syarat eksperimen, hingga penggunaan rumus matematika untuk mempermudah perhitungan.

6.1 Interpretasi

Video ini memberikan pemahaman mendalam bahwa matematika adalah alat efisiensi.

  • Pentingnya Syarat Awal: Interpretasi utama dari video ini adalah bahwa kita tidak boleh sembarangan menggunakan rumus statistik. Sebelum menggunakan rumus binomial, kita wajib memverifikasi 4 syarat utamanya (terutama independensi dan peluang konstan). Contoh kelereng “dengan pengembalian” sangat krusial; jika kelereng tidak dikembalikan, model matematikanya akan berubah total.

  • Transisi dari Manual ke Abstrak: Video mengajarkan pola pikir logis. Penonton diajak melihat perhitungan manual (“cara kasar”) terlebih dahulu untuk memahami logika di baliknya (bahwa ada berbagai urutan kejadian), baru kemudian diperkenalkan pada Rumus Binomial sebagai “jalan pintas” yang elegan untuk menyelesaikan masalah yang kompleks.

  • Aplikasi Nyata: Materi ini adalah fondasi bagi pengambilan keputusan berbasis data, seperti quality control di pabrik (peluang produk cacat vs bagus) atau prediksi perilaku konsumen, selama kondisinya memenuhi syarat biner (sukses/gagal).

6.2 Pengertian dan Pengaturan Binomial (The Binomial Setting)

Asal Kata: Istilah “Binomial” menggunakan awalan “Bi” yang berarti dua, mirip seperti bicycle (dua roda) atau binoculars (dua lensa). Dalam probabilitas, ini merujuk pada eksperimen yang memiliki dua hasil: sukses atau gagal.

4 Syarat Kondisi Binomial: Agar sebuah eksperimen disebut eksperimen binomial, harus memenuhi empat syarat berikut:

  • Jumlah percobaan (trials) harus tetap atau ditentukan (n).
  • Hanya ada dua kemungkinan hasil untuk setiap percobaan (Sukses atau Gagal).
  • Peluang sukses harus konstan/tetap di setiap percobaan.
  • Setiap percobaan harus independen (hasil satu percobaan tidak memengaruhi yang lain).

6.3 Contoh Kasus

6.3.1 Pelemparan Koin

Skenario: Melempar koin 3 kali dan mencari peluang mendapatkan tepat satu kali gambar “Kepala” (Heads).

Analisis Manual:Terdapat 3 cara untuk mendapatkan 1 Kepala: (Kepala-Ekor-Ekor), (Ekor-Kepala-Ekor), (Ekor-Ekor-Kepala).

Peluang setiap urutan dihitung dengan mengalikan probabilitas masing-masing (0.5 x 0.5 x 0.5 = 0.125).Total peluang adalah penjumlahan dari ketiga kemungkinan tersebut: 0.125 + 0.125 + 0.125 = 0.375.

Verifikasi Syarat: Kasus ini memenuhi 4 syarat binomial: jumlah lemparan tetap (3), hasil hanya Kepala/Ekor, peluang tetap (0.5), dan lemparan bersifat independen.

6.3.2 Pengambilan Kelereng (Dengan Pengembalian)

Skenario: Sebuah kotak berisi 10 kelereng (3 merah muda, 2 hijau, 5 biru). Mengambil 5 kelereng dengan pengembalian (replacement). Dicari peluang mendapatkan tepat 2 kelereng hijau.

Analisis Syarat: Penting dicatat bahwa pengambilan dilakukan dengan pengembalian. Jika tidak dikembalikan, peluang akan berubah dan syarat “peluang konstan” serta “independen” akan gagal, sehingga tidak bisa disebut eksperimen binomial. Sukses = Dapat Hijau (2/10 = 0.2). Gagal = Bukan Hijau (8/10 = 0.8).

Perhitungan: Terdapat 10 kombinasi urutan berbeda untuk mendapatkan 2 sukses dan 3 gagal. Hasil akhirnya adalah 0.2048.

6.3.3 Rumus Binomial (The Binomial Formula)

Untuk menghindari perhitungan manual yang panjang seperti di atas, digunakan rumus binomial:

\[P(k) = \binom{n}{k} \cdot p^k \cdot (1-p)^{n-k}\]

Keterangan Variabel:

  • n = Jumlah percobaan (trials).
  • k = Jumlah sukses yang diinginkan.
  • p = Peluang sukses.
  • \(\binom{n}{k}\) = Rumus kombinasi (n choose k).

Penerapan: Dalam kasus kelereng tadi, n=5, k=2, dan p=0.2. Dengan memasukkan angka ke rumus, didapatkan hasil yang sama persis yaitu 0.2048, namun dengan cara yang jauh lebih cepat.

7 Binomial Distribution

Video ini adalah kelanjutan dari materi sebelumnya tentang Distribusi Binomial. Jika di video pertama kita belajar cara menghitung probabilitas individu, video ini fokus pada Visualisasi Distribusi Binomial. Materi ini sangat penting untuk memahami bagaimana sebaran data berubah ketika jumlah percobaan (n) atau peluang sukses (p) diubah. Video ini juga menjembatani hubungan penting antara Distribusi Binomial dan Distribusi Normal, serta memperkenalkan rumus untuk menghitung parameter utama seperti rata-rata (mean) dan standar deviasi dalam konteks binomial.

7.1 Interpretasi

Video ini memberikan wawasan visual yang krusial bagi pemahaman statistika:

  • Hukum Bilangan Besar: Video ini secara implisit mendemonstrasikan konsep Central Limit Theorem. Kita bisa melihat sendiri bahwa dengan meningkatkan jumlah sampel/percobaan (n), data yang awalnya “kasar” atau “miring” perlahan-lahan menjadi kurva lonceng yang halus (normal). Ini adalah alasan mengapa Distribusi Normal sangat dominan dalam statistik.

  • Prediksi Perilaku Data: Dengan memahami peran p, kita bisa memprediksi bentuk data tanpa menghitung satu per satu. Jika kita tahu ujian itu sangat susah (p kelulusan rendah), kita sudah tahu grafiknya akan miring ke kanan (banyak nilai rendah).

  • Jembatan Antar Distribusi: Rumus syarat np adalah “jembatan” penting. Ini memberitahu kita kapan boleh menggunakan metode statistik normal (yang lebih mudah untuk sampel besar) untuk menangani kasus binomial, menghemat waktu perhitungan yang kompleks.

7.2 Meninjau Kembali Rumus & Membuat Grafik Dasar

Studi Kasus: Melempar koin 2 kali (n=2) dengan peluang sukses/kepala 0.5 (p=0.5).

Hasil Perhitungan:

  • 0 Sukses: 0.25
  • 1 Sukses: 0.50
  • 2 Sukses: 0.25

Visualisasi: Data ini diplot ke dalam diagram batang (Bar Chart). Sumbu X berisi jumlah sukses (k: 0, 1, 2) dan sumbu Y berisi probabilitasnya. Hasilnya membentuk pola simetris dengan puncak di tengah (k=1).

7.3 Pengaruh Jumlah Percobaan (n) terhadap Bentuk Grafik

Ketika jumlah percobaan ditingkatkan dari n=2 menjadi n=10 (tetap dengan p=0.5), bentuk diagram batang mulai menyerupai lonceng atau Distribusi Normal. Puncak data (rata-rata) berada tepat di tengah, yaitu di angka 5.

7.4 Rumus Parameter Distribusi Binomial

Video memberikan rumus cepat untuk menghitung parameter statistik jika variabel x mengikuti distribusi binomial:

  • Rata-rata \((Mean/\mu): \mu\) = \(n \cdot p\)
  • Varians \((\sigma^2): \sigma^2\) = \(n \cdot p \cdot (1 - p)\)
  • Standar Deviasi \((\sigma): \sigma\) = \(\sqrt{n \cdot p \cdot (1 - p)}\)

7.5 Pengaruh Peluang Sukses (p) terhadap Kemiringan (Skewness)

Bentuk grafik sangat bergantung pada nilai p:

  • p = 0.5: Distribusi berbentuk Simetris (Normal).
  • p < 0.5 (Contoh p=0.1): Distribusi Miring ke Kanan (Skewed Right). Karena peluang sukses kecil, data menumpuk di angka nol atau nilai sukses yang rendah.
  • p > 0.5 (Contoh p=0.8): Distribusi Miring ke Kiri (Skewed Left). Karena peluang sukses besar, data menumpuk di nilai sukses yang tinggi (mendekati n).
  • Kesimpulan: Data akan selalu berkumpul di sekitar nilai rata-rata \((\mu = n \cdot p)\).

7.6 Aproksimasi Normal (Normal Approximation)

  • Semakin besar nilai n, bentuk distribusi binomial akan semakin mendekati distribusi normal, bahkan jika awalnya miring (skewed).

  • Syarat Aturan Jempol (Rule of Thumb): Kita boleh menganggap distribusi binomial sebagai distribusi normal jika kedua syarat berikut terpenuhi:

  1. \(n \cdot p \geq 10\)
  2. \(n \cdot (1 - p) \geq 10\) (Catatan: Beberapa buku menggunakan angka batas 5, jadi sesuaikan dengan referensi yang dipakai).

8 Referensi dan kesimplan

Probabilitas adalah komponen esensial dalam dunia statistik dan memiliki aplikasinya dalam berbagai bidang kehidupan. Memahami dasar-dasar probabilitas, termasuk ruang sampel, peristiwa, dan aturan-aturan dasar memungkinkan kita untuk membuat prediksi yang lebih akurat dan mengambil keputusan yang lebih informan. Baik dalam konteks penelitian, bisnis, maupun kehidupan sehari-hari, pemahaman tentang probabilitas memberikan kita alat yang kuat untuk mengelola ketidakpastian dan mengoptimalkan hasil yang diinginkan.

https://bookdown.org/dsciencelabs/intro_statistics/06-Essentials_of_Probability.html

https://youtu.be/ynjHKBCiGXY?si=DV9dCSQTyAF7LtG7

https://youtu.be/LS-_ihDKr2M?si=1PiKF1GkT3Jx-8G_

https://youtu.be/vqKAbhCqSTc?si=0VqWVcr4kzFUauwS

https://youtu.be/f7agTv9nA5k?si=SeZeBMW2OH8onYH5

https://youtu.be/nRuQAtajJYk?si=295Gnk1EwTWh7b6v

https://youtu.be/Y2-vSWFmgyI?si=dAzmohdJNaR5nWRu

https://gurumuda.net/statistika/konsep-dasar-probabilitas-dalam-statistika.htm

LS0tDQp0aXRsZTogIkVzc2VudGlhbHMgb2YgUHJvYmFiaWxpdHkiDQpzdWJ0aXRsZTogIkV4ZXJjaXNlcyB+IFdlZWsgMTAiDQphdXRob3I6ICJNdWhhbW1hZCBOYWJpbCBLaGFpcmlsIEFuYW0iDQpkYXRlOiAiYHIgZm9ybWF0KFN5cy5EYXRlKCksICclQiAlZCwgJVknKWAiICAjIEF1dG8gZGlzcGxheXMgY3VycmVudCBkYXRlDQoNCm91dHB1dDoNCiAgcm1kZm9ybWF0czo6cmVhZHRoZWRvd246ICAgICAgICAgICAgICAgIyBodHRwczovL2dpdGh1Yi5jb20vanViYS9ybWRmb3JtYXRzDQogICAgY3NzOiAic3R5bGUuY3NzIiAgICAgICAgICAgICAgICAgICAgICMgPC0tLSBQQU5HR0lMIEZJTEUgQ1NTIERJIFNJTkkNCiAgICBzZWxmX2NvbnRhaW5lZDogdHJ1ZSAgICAgICAgICAgICAgICAgIyBFbWJlZCBhbGwgcmVzb3VyY2VzDQogICAgdGh1bWJuYWlsczogdHJ1ZSAgICAgICAgICAgICAgICAgICAgICMgU2hvdyBpbWFnZSB0aHVtYm5haWxzDQogICAgbGlnaHRib3g6IHRydWUgICAgICAgICAgICAgICAgICAgICAgICMgRW5hYmxlIGNsaWNrLXRvLXpvb20gaW1hZ2VzDQogICAgZ2FsbGVyeTogdHJ1ZSAgICAgICAgICAgICAgICAgICAgICAgICMgR3JvdXAgaW1hZ2VzIGludG8gZ2FsbGVyeQ0KICAgIG51bWJlcl9zZWN0aW9uczogdHJ1ZSAgICAgICAgICAgICAgICAjIE51bWJlciBhbGwgc2VjdGlvbnMNCiAgICBsaWJfZGlyOiBsaWJzICAgICAgICAgICAgICAgICAgICAgICAgIyBTYXZlIEpTL0NTUyBsaWJyYXJpZXMNCiAgICBkZl9wcmludDogInBhZ2VkIiAgICAgICAgICAgICAgICAgICAgIyBQYWdlZCBkYXRhIGZyYW1lcw0KICAgIGNvZGVfZm9sZGluZzogInNob3ciICAgICAgICAgICAgICAgICAjIEV4cGFuZGFibGUgY29kZSBibG9ja3MNCiAgICBjb2RlX2Rvd25sb2FkOiB5ZXMgICAgICAgICAgICAgICAgICAgIyBBZGQgYnV0dG9uIHRvIGRvd25sb2FkIFIgY29kZQ0KLS0tDQoNCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFKQ0KYGBgDQoNCi0tLQ0KDQo8ZGl2IGNsYXNzPSJwcm9maWxlLXNlY3Rpb24iPg0KPGltZyBzcmM9IkM6L1VzZXJzL0l5YW4vRG93bmxvYWRzL1R1Z2FzIFN0YXRpc3RpayBFc3NlbnRpYWxzIG9mIFByb2JhYmlsaXR5L3Byb2ZpbGUuIGpwZy5qcGciIGNsYXNzPSJwcm9maWxlLXBob3RvIiBhbHQ9IlByb2ZpbGUgUGhvdG8iPg0KPC9kaXY+DQoNCi0tLQ0KDQojIEludHJvZHVjdGlvbg0KDQpQcm9iYWJpbGl0YXMgbWVydXBha2FuIHBpbGFyIGRhc2FyIHBlbmFsYXJhbiBzdGF0aXN0aWssIHlhbmcgbWVuYXdhcmthbiBrZXJhbmdrYSBrZXJqYSB5YW5nIHNpc3RlbWF0aXMgZGFuIGtvaGVyZW4gdW50dWsgbWVtYWhhbWkga2V0aWRha3Bhc3RpYW4gZGFuIG1lbWFuZHUgcGVuZ2FtYmlsYW4ga2VwdXR1c2FuIHlhbmcgdGVyaW5mb3JtYXNpLiBBbGloLWFsaWggbWVuZ2FuZGFsa2FuIGludHVpc2kgYXRhdSBkdWdhYW4sIHByb2JhYmlsaXRhcyBtZW11bmdraW5rYW4ga2l0YSB1bnR1ayBtZW5ndWt1ciBrZW11bmdraW5hbiBiZXJiYWdhaSBoYXNpbCwgbWVuYWZzaXJrYW4gcG9sYSBkYWxhbSBkYXRhLCBkYW4gbWVuZ2FuYWxpc2lzIGZlbm9tZW5hIHlhbmcgbXVuY3VsIGRhcmkgcHJvc2VzIGFsYW1pIGF0YXUgZWtzcGVyaW1lbnRhbC4gUGVuZ3Vhc2FhbiBrb25zZXAgcHJvYmFiaWxpdGFzIHlhbmcga3VhdCBzYW5nYXQgcGVudGluZyB1bnR1ayBhbmFsaXNpcyBkYXRhIHlhbmcgZWZla3RpZiwgcGVuZWxpdGlhbiBpbG1pYWgsIGRhbiBwcmFrdGlrIGJlcmJhc2lzIGJ1a3RpLg0KDQpCYWdpYW4gaW5pIG1lbnlhamlrYW4gcHJpbnNpcC1wcmluc2lwIHV0YW1hIHlhbmcgbWVtYmVudHVrIGRhc2FyIHRlb3JpIHByb2JhYmlsaXRhczoNCg0KLSAgIEtvbnNlcCBkYXNhciBwcm9iYWJpbGl0YXMsIHRlcm1hc3VrIHJ1YW5nIHNhbXBlbCwga2VqYWRpYW4sIGRhbiBhdHVyYW4ga29tcG9uZW4ta29tcG9uZW4gaW50aSB5YW5nIG1lbmVudHVrYW4gYmFnYWltYW5hIHByb2JhYmlsaXRhcyBkaXN1c3VuIGRhbiBkaXRhZnNpcmthbi4NCi0gICBQZXJpc3Rpd2EgaW5kZXBlbmRlbiBkYW4gZGVwZW5kZW4sIHlhbmcgbWVtYmVkYWthbiBza2VuYXJpbyBkaW1hbmEgdGVyamFkaW55YSBkYXR1IHBlcmlzdGl3YSBtZW1lbmdhcnVoaSBhdGF1IHRpZGFrIG1lbWVuZ2FydWhpIHBlcmlzdGl3YSBsYWluLCBzdWF0dSBwZXJiZWRhYW4gcGVudGluZyB1bnR1ayBwZW1vZGVsYW4gZGFuIHByZWRpa3NpIHlhbmcgYWt1cmF0Lg0KLSAgIEdhYnVuZ2FuIGtlamFkaWFuLiB5YW5nIG1lbWJhaGFzIGtlbXVuZ2tpbmFuIGJhaHdhIHNldGlkYWtueWEgc2F0dSBkaSBhbnRhcmEgYmViZXJhcGEga2VqYWRpYW4gYWthbiB0ZXJqYWRpLg0KLSAgIFBlcmlzdGl3YSBla3NsdXNpZiBkYW4gbGVuZ2thcCwgbWVuZ2tsYXJpZmlrYXNpIGJhZ2FpbWFuYSBwZXJpc3Rpd2EgYmVyaW50ZXJha3NpIGRhbGFtIHJ1YW5nIHNhbXBlbCBkYW4gYmFnYWltYW5hIGh1YnVuZ2FuIHRlcnNlYnV0IG1lbWJlbnR1ayBwZXJoaXR1bmdhbiBwcm9iYWJpbGl0YXMuDQotICAgRWtzcGVyaW1lbiBiaW5vbWlhbCBkYW4gZGlzdHJpYnVzaSBiaW5vbWlhbCwgYWxhdCBwZW50aW5nIHVudHVrIG1lbmdhbmFsaXNpcyBwZXJjb2JhYW4gYmVydWxhbmcgZGVuZ2FuIGR1YSBrZW11bmdraW5hbiBoYXNpbCwgYmFueWFrIGRpZ3VuYWthbiBkYWxhbSBzdHVkaSBpbG1pYWgsIHBlbmd1amlhbiBrZWFuZGFsYW4sIGRhbiBhbmFsaXNpcyBzdXJ2ZWkuDQoNClNldGlhcCB0b3BpayBkaWxlbmdrYXBpIGRlbmdhbiBzdW1iZXIgZGF5YSB2aWRlbyBpbnRydWtzaW9uYWwgeWFuZyBkaXJhbmNhbmcgdW50dWsgbWVuaW5na2F0a2FuIHBlbWFoYW1hbiBrb25zZXB0dWFsIGRhbiBtZW5kdWt1bmcga2V0ZXJsaWJhdGFuIHlhbmcgbGViaWggbWVuZGFsYW0gZGVuZ2FuIG1hdGVyaS4gQmVyc2FtYS1zYW1hLCBrb21wb25lbi1rb21wb25lbiBpbmkgbWVtYmVyaWthbiBsYW5kYXNhbiB5YW5nIGtvbXByZWhlbnNpZiBkYW4ga29rb2ggdW50dWsgbWFqdSBrZSBtZXRvZGVzdGF0aXN0aWsgeWFuZyBsZWJpaCBrb21wbGVrcy4NCg0KIyBGdW5kYW1lbnRhbCBDb25jZXB0DQoNClByb2JhYmlsaXRhcyBhZGFsYWggZm9uZGFzaSB1dGFtYSBkYWxhbSBzdGF0aXN0aWthIGRhbiBzYWlucyBkYXRhLiBWaWRlbyAiQmFzaWMgUHJvYmFiaWxpdHkiIG1lbWJlcmlrYW4gcGVtYWhhbWFuIGtvbXByZWhlbnNpZiB0ZW50YW5nIGJhZ2FpbWFuYSBraXRhIG1lbmd1a3VyIGRhbiBtZW5naW50ZXJwcmV0YXNpIGtldGlkYWtwYXN0aWFuIGRhbGFtIGJlcmJhZ2FpIGFzcGVrIGtlaGlkdXBhbi4NCg0KPGNlbnRlcj4NCjxpZnJhbWUgc3JjPSJodHRwczovL3d3dy55b3V0dWJlLmNvbS9lbWJlZC95bmpIS0JDaUdYWSIgd2lkdGg9IjYwMCIgaGVpZ2h0PSIzNjAiIHdpZHRoPSI3NjgiIGhlaWdodD0iNDAwcHgiIGRhdGEtZXh0ZXJuYWw9IjEiPiA8L2lmcmFtZT4NCjwvY2VudGVyPg0KDQojIyBJbnRlcnByZXRhc2kNCg0KVmlkZW8gaW5pIGFkYWxhaCBwaW50dSBtYXN1ayB5YW5nIG1lbmplbGFza2FuIGJhaHdhIHBlbHVhbmcgYWRhbGFoIGRpc2lwbGluIHlhbmcgdGVydGF0YS4gSWEgbWVuZ2FqYXJrYW4gcGVudGluZ255YSBkZWZpbml0aWYgKG1lbmdndW5ha2FuIHJ1bXVzKSwga29tcHJlaGVuc2lmIChtZW5nZ3VuYWthbiBydWFuZyBzYW1wZWwpLCBkYW4gZWZpc2llbiAobWVuZ2d1bmFrYW4gQXR1cmFuIEtvbXBsZW1lbikgZGFsYW0gc2V0aWFwIGFuYWxpc2lzIHJpc2lrbyBkYW4ga2VtdW5na2luYW4uDQoNCiMjIERlZmluaXNpIFByb2JhYmlsaXRhcw0KDQotLS0NCmBgYHtyfQ0KZXNlbnNpX3Byb2JhYmlsaXRhcyA8LSBkYXRhLmZyYW1lKA0KICBLb25zZXAgPSBjKCJBcGEgaXR1IFByb2JhYmlsaXRhcz8iLCAiRG9tYWluIE5pbGFpIiwgIk5vdGFzaSBNYXRlbWF0aXMiLCAiSW50ZXJwcmV0YXNpIEZpbG9zb2ZpcyIpLA0KICBEZWZpbmlzaSA9IGMoDQogICAgIlVrdXJhbiBrdWFudGl0YXRpZiBrZW11bmdraW5hbiB0ZXJqYWRpbnlhIHN1YXR1IHBlcmlzdGl3YSIsDQogICAgIkJpbGFuZ2FuIHJlYWwgYW50YXJhIDAgc2FtcGFpIDEgaW5rbHVzaWYiLA0KICAgICJQKEEpIGRpbWFuYSBBIGFkYWxhaCBrZWphZGlhbi9ldmVudCIsDQogICAgIkJhaGFzYSBtYXRlbWF0aWthIHVudHVrIG1lbmdrdWFudGlmaWthc2kga2V0aWRha3Bhc3RpYW4iDQogICksDQogIENvbnRvaF9Lb250ZWtzdHVhbCA9IGMoDQogICAgIlNlcGVydGkgdGhlcm1vbWV0ZXIgdW50dWsgbWVuZ3VrdXIgJ3BhbmFzbnlhJyBrZW11bmdraW5hbiIsDQogICAgIlNrYWxhIHVuaXZlcnNhbDogMCA9IG11c3RhaGlsLCAxID0gcGFzdGkiLA0KICAgICJQKGh1amFuKSA9IDAuNyBhcnRpbnlhIDcwJSBrZW11bmdraW5hbiBodWphbiIsDQogICAgIkFsYXQgYmFudHUgcGVuZ2FtYmlsYW4ga2VwdXR1c2FuIGRhbGFtIGtvbmRpc2kgdGlkYWsgcGFzdGkiDQogICkNCikNCg0Ka25pdHI6OmthYmxlKGVzZW5zaV9wcm9iYWJpbGl0YXMsIGNhcHRpb24gPSAiRVNFTlNJIERBU0FSICIpDQpgYGANCi0tLS0NCg0KUHJvYmFiaWxpdGFzIGFkYWxhaCAiamVtYmF0YW4iIGFudGFyYSBrZXRpZGFrcGFzdGlhbiBkdW5pYSBueWF0YSBkYW4ga2VwYXN0aWFuIG1hdGVtYXRpa2EuDQoNCi0tLQ0KYGBge3J9DQpza2FsYV9wcm9iYWJpbGl0YXMgPC0gZGF0YS5mcmFtZSgNCiAgTmlsYWkgPSBjKCIwIiwgIjAgPCBQIDwgMC4zIiwgIjAuMyDiiaQgUCA8IDAuNyIsICIwLjcg4omkIFAgPCAxIiwgIjEiKSwNCiAgS2F0ZWdvcmkgPSBjKCJNdXN0YWhpbCIsICJLZW11bmdraW5hbiBLZWNpbCIsICJLZW11bmdraW5hbiBTZWRhbmciLCAiS2VtdW5na2luYW4gQmVzYXIiLCAiUGFzdGkiKSwNCiAgSW50ZXJwcmV0YXNpX1ByYWt0aXMgPSBjKA0KICAgICJUaWRhayBha2FuIHRlcmphZGkgZGFsYW0ga29uZGlzaSBhcGFwdW4iLA0KICAgICJKYXJhbmcgdGVyamFkaSwgYnV0dWgga2ViZXJ1bnR1bmdhbiIsDQogICAgIkJpc2EgdGVyamFkaSBhdGF1IHRpZGFrLCBjdWt1cCBzZWltYmFuZyIsIA0KICAgICJTYW5nYXQgbXVuZ2tpbiB0ZXJqYWRpLCBoYW1waXIgcGFzdGkiLA0KICAgICJUZXJqYWRpIGRlbmdhbiBrZXBhc3RpYW4gbXV0bGFrIg0KICApLA0KICBDb250b2hfUmVhbCA9IGMoDQogICAgIk1hdGFoYXJpIHRlcmJpdCBkYXJpIGJhcmF0IiwNCiAgICAiTWVuYW5nIGxvdHJlIChQIOKJiCAwLjAwMDAwMDEpIiwNCiAgICAiS29pbiBhZGlsIChQID0gMC41KSwgY3VhY2EgbWVuZHVuZyIsDQogICAgIk11c2ltIGh1amFuIGRpIGJ1bGFuIERlc2VtYmVyIiwNCiAgICAiTWF0YWhhcmkgdGVyYml0IGRhcmkgdGltdXIiDQogICkNCikNCg0Ka25pdHI6OmthYmxlKHNrYWxhX3Byb2JhYmlsaXRhcywgY2FwdGlvbiA9ICJTS0FMQSBOSUxBSSBQUk9CQUJJTElUQVMgJiBJTlRFUlBSRVRBU0kiKQ0KYGBgDQotLS0NCmBgYHtyfQ0Ka29tcG9uZW5fcHJvYmFiaWxpdGFzIDwtIGRhdGEuZnJhbWUoDQogIEtvbXBvbmVuID0gYygiUnVhbmcgU2FtcGVsIChTKSIsICJLZWphZGlhbi9FdmVudCAoQSwgQiwgLi4uKSIsICJGdW5nc2kgUHJvYmFiaWxpdGFzIFAowrcpIiwgIkFrc2lvbWEgUHJvYmFiaWxpdGFzIiksDQogIFBlcmFuID0gYygNCiAgICAiTWVuZGVmaW5pc2lrYW4gJ2R1bmlhIGtlbXVuZ2tpbmFuJyIsDQogICAgIlN1YnNldCBkYXJpIFMgeWFuZyBraXRhIG1pbmF0aSIsIA0KICAgICJBdHVyYW4gcGVudWdhc2FuIG5pbGFpIGtlIHNldGlhcCBrZWphZGlhbiIsDQogICAgIkF0dXJhbiBtYWluIG1hdGVtYXRpa2EgeWFuZyBoYXJ1cyBkaXBlbnVoaSINCiAgKSwNCiAgQW5hbG9naSA9IGMoDQogICAgIlNlbHVydWggcGFwYW4gY2F0dXIiLA0KICAgICJQb3Npc2kgYmlkYWsgdGVydGVudHUgeWFuZyBraXRhIGFtYXRpIiwNCiAgICAiQ2FyYSBtZW5naGl0dW5nIG5pbGFpIHNldGlhcCBwb3Npc2kiLA0KICAgICJBdHVyYW4gcGVybWFpbmFuIGNhdHVyIGl0dSBzZW5kaXJpIg0KICApLA0KICBTeWFyYXQgPSBjKA0KICAgICJIaW1wdW5hbiBzZW11YSBvdXRjb21lIHlhbmcgbXVuZ2tpbiIsDQogICAgIkEg4oqGIFMgKHN1YnNldCBkYXJpIHJ1YW5nIHNhbXBlbCkiLA0KICAgICIwIOKJpCBQKEEpIOKJpCAxIHVudHVrIHNlbXVhIEEg4oqGIFMiLA0KICAgICJQKFMpID0gMSwgUCjiiIUpID0gMCwgYWRkaXRpdml0eSINCiAgKQ0KKQ0KDQprbml0cjo6a2FibGUoa29tcG9uZW5fcHJvYmFiaWxpdGFzLCBjYXB0aW9uID0gIktPTVBPTkVOIFBFTllVU1VOIFNJU1RFTSBQUk9CQUJJTElUQVMiKQ0KYGBgDQotLS0NCg0KS2VlbXBhdCBrb21wb25lbiBpbmkgbWVtYmVudHVrICJla29zaXN0ZW0iIHByb2JhYmlsaXRhcyB5YW5nIHNhbGluZyB0ZXJrYWl0Lg0KDQotLS0NCmBgYHtyfQ0KYWtzaW9tYV9wcm9iYWJpbGl0YXMgPC0gZGF0YS5mcmFtZSgNCiAgQWtzaW9tYSA9IGMoIkFrc2lvbWEgMTogTm9uLU5lZ2F0aXZpdHkiLCAiQWtzaW9tYSAyOiBOb3JtYWxpemF0aW9uIiwgIkFrc2lvbWEgMzogQWRkaXRpdml0eSIpLA0KICBSdW11cyA9IGMoIlAoQSkg4omlIDAiLCAiUChTKSA9IDEiLCAiUChBIOKIqiBCKSA9IFAoQSkgKyBQKEIpIGppa2EgQSDiiKkgQiA9IOKIhSIpLA0KICBNYWtuYV9JbnR1aXRpZiA9IGMoDQogICAgIlByb2JhYmlsaXRhcyB0aWRhayBtdW5na2luIG5lZ2F0aWYiLA0KICAgICJUb3RhbCBwcm9iYWJpbGl0YXMgc2VtdWEga2VtdW5na2luYW4gPSAxICgxMDAlKSIsDQogICAgIlByb2JhYmlsaXRhcyBnYWJ1bmdhbiBrZWphZGlhbiB0ZXJwaXNhaCA9IGp1bWxhaCBtYXNpbmctbWFzaW5nIg0KICApLA0KICBDb250b2hfUGVuZXJhcGFuID0gYygNCiAgICAiUChodWphbikgdGlkYWsgbXVuZ2tpbiAtMC41IiwNCiAgICAiUChhbmdrYSkgKyBQKGdhbWJhcikgPSAxIHBhZGEga29pbiIsDQogICAgIlAoZ2VuYXApICsgUChnYW5qaWwpID0gMSBwYWRhIGRhZHUiDQogICkNCikNCg0Ka25pdHI6OmthYmxlKGFrc2lvbWFfcHJvYmFiaWxpdGFzLCBjYXB0aW9uID0gIkFLU0lPTUEgREFTQVIgUFJPQkFCSUxJVEFTIEtPTE1PR09ST1YiKQ0KYGBgDQotLS0NCg0KQWtzaW9tYSBpbmkgYWRhbGFoIGZvbmRhc2kgbWF0ZW1hdGlrYSB5YW5nIG1lbmphbWluIGtvbnNpc3RlbnNpIHNlbHVydWggdGVvcmkgcHJvYmFiaWxpdGFzLg0KDQojIyBLb25zZXAta29uc2VwIEZ1bmRhbWVudGFsDQoNCiMjIyBSdWFuZyBTYW1wZWwgKFNhbXBsZSBTcGFjZSkNCg0KKiBTaW1ib2w6IFMgYXRhdSDOqQ0KKiBEZWZpbmlzaTogSGltcHVuYW4gU0VNVUEgaGFzaWwgeWFuZyBtdW5na2luDQoqIENvbnRvaDoNCiAgKiBLb2luOiBTID0ge0FuZ2thLCBHYW1iYXJ9DQogICogRGFkdTogUyA9IHsxLDIsMyw0LDUsNn0NCg0KIyMjIEtlamFkaWFuIChFdmVudHMpDQoNCiogRGVmaW5pc2k6IFN1YnNldCBkYXJpIHJ1YW5nIHNhbXBlbA0KKiBKZW5pcy1qZW5pczoNCiAgKiBTZWRlcmhhbmE6IFNhdHUgaGFzaWwgezN9DQogICogTWFqZW11azogQmViZXJhcGEgaGFzaWwgezIsNCw2fQ0KICAqIFNhbGluZyBMZXBhczogVGlkYWsgYmlzYSB0ZXJqYWRpIGJlcnNhbWFhbg0KDQotLS0NCmBgYHtyfQ0Ka29uc2VwX2Rhc2FyIDwtIGRhdGEuZnJhbWUoDQogIEtvbnNlcCA9IGMoIlJ1YW5nIFNhbXBlbCAoUykiLCAiS2VqYWRpYW4gU2VkZXJoYW5hIiwgIktlamFkaWFuIE1hamVtdWsiLCAiS2VqYWRpYW4gU2FsaW5nIExlcGFzIiksDQogIFNpbWJvbCA9IGMoIlMgYXRhdSDOqSIsICJBID0ge2hhc2lsIHR1bmdnYWx9IiwgIkEgPSB7YmViZXJhcGEgaGFzaWx9IiwgIkEg4oipIEIgPSDiiIUiKSwNCiAgQ29udG9oID0gYygNCiAgICAiRGFkdTogezEsMiwzLDQsNSw2fSIsDQogICAgIkEgPSB7bXVuY3VsIGFuZ2thIDN9IiwNCiAgICAiQSA9IHthbmdrYSBnZW5hcH0gPSB7Miw0LDZ9IiwNCiAgICAie0FuZ2thfSBkYW4ge0dhbWJhcn0gcGFkYSBrb2luIg0KICApDQopDQoNCmtuaXRyOjprYWJsZShrb25zZXBfZGFzYXIsIGNhcHRpb24gPSAiS29uc2VwLUtvbnNlcCBGdW5kYW1lbnRhbCIpDQpgYGANCi0tLQ0KDQojIyBBdHVyYW4gRGFzYXIgUHJvYmFiaWxpdGFzDQoNCiMjIyBBdHVyYW4gUGVuanVtbGFoYW4NCg0KVW50dWsga2VqYWRpYW4gc2FsaW5nIGxlcGFzOg0KDQpQKEEgVSBCKSA9IFAoQSkgKyBQKEIpIA0KDQojIyMgUHJvYmFiaWxpdGFzIEtvbXBsZW1lbg0KDQpQKEEnKSA9IDEgLSBQKEEpIA0KDQotLS0NCmBgYHtyfQ0KYXR1cmFuIDwtIGRhdGEuZnJhbWUoDQogIEF0dXJhbiA9IGMoIlBlbmp1bWxhaGFuIChTYWxpbmcgTGVwYXMpIiwgIlBlbmp1bWxhaGFuIChUaWRhayBTYWxpbmcgTGVwYXMpIiwgIktvbXBsZW1lbiIpLA0KICBSdW11cyA9IGMoIlAoQSDiiKogQikgPSBQKEEpICsgUChCKSIsICJQKEEg4oiqIEIpID0gUChBKSArIFAoQikgLSBQKEEg4oipIEIpIiwgIlAoQScpID0gMSAtIFAoQSkiKSwNCiAgQ29udG9oID0gYygNCiAgICAiUChnZW5hcCBhdGF1IGdhbmppbCkgPSAwLjUgKyAwLjUgPSAxIiwNCiAgICAiUChnZW5hcCBhdGF1ID4zKSA9IDAuNSArIDAuNSAtIDAuMzMgPSAwLjY3IiwNCiAgICAiUChidWthbiBnYW1iYXIpID0gMSAtIDAuNSA9IDAuNSINCiAgKQ0KKQ0KDQprbml0cjo6a2FibGUoYXR1cmFuLCBjYXB0aW9uID0gIkF0dXJhbiBEYXNhciBQcm9iYWJpbGl0YXMiKQ0KYGBgDQotLS0NCg0KIyMgQ29udG9oIFBlcmhpdHVuZ2FuIFByYWt0aXMNCg0KLS0tDQpgYGB7cn0NCmNvbnRvaCA8LSBkYXRhLmZyYW1lKA0KICBTY2VuYXJpbyA9IGMoIktvaW4iLCAiRGFkdSIsICJLYXJ0dSBSZW1pIiwgIkN1YWNhIiksDQogIFJ1YW5nX1NhbXBlbCA9IGMoIjIiLCAiNiIsICI1MiIsICIyIChIdWphbi9DZXJhaCkiKSwNCiAgS2VqYWRpYW4gPSBjKCJNdW5jdWwgR2FtYmFyIiwgIkFuZ2thID4gNCIsICJLYXJ0dSBIZWFydCIsICJIdWphbiIpLA0KICBQZXJoaXR1bmdhbiA9IGMoIjEvMiIsICIyLzYiLCAiMTMvNTIiLCAiMC4zIChjb250b2gpIiksDQogIEhhc2lsID0gYygiMC41IiwgIjAuMzMiLCAiMC4yNSIsICIwLjMiKQ0KKQ0KDQprbml0cjo6a2FibGUoY29udG9oLCBjYXB0aW9uID0gIkNvbnRvaCBQZXJoaXR1bmdhbiBQcm9iYWJpbGl0YXMiKQ0KYGBgDQotLS0NCg0KIyMgQXBsaWthc2kgZGFsYW0gS2VoaWR1cGFuIE55YXRhDQoNCiMjIyBQZW5nYW1iaWxhbiBLZXB1dHVzYW4gU2VoYXJpLWhhcmkNCg0KKiBNZW11dHVza2FuIGJhd2EgcGF5dW5nOiBCZXJkYXNhcmthbiBQKGh1amFuKQ0KKiBNZW1pbGloIHJ1dGUgcGVyamFsYW5hbjogQmVyZGFzYXJrYW4gUChrZW1hY2V0YW4pDQoqIEJlcmludmVzdGFzaTogQmVyZGFzYXJrYW4gUChwcm9maXQpDQoNCiMjIyBJbG11IFBlbmdldGFodWFuIGRhbiBQZW5lbGl0aWFuDQoNCiogRGVzYWluIGVrc3BlcmltZW4NCiogVWppIGhpcG90ZXNpcw0KKiBBbmFsaXNpcyBkYXRhDQoNCiMjIyBUZWtub2xvZ2kgZGFuIEJpc25pcw0KDQoqIE1hY2hpbmUgbGVhcm5pbmcNCiogQW5hbGlzaXMgcmlzaWtvDQoqIFByZWRpa3NpIHBhc2FyDQoNCi0tLQ0KYGBge3J9DQphcGxpa2FzaSA8LSBkYXRhLmZyYW1lKA0KICBCaWRhbmcgPSBjKCJLZXNlaGF0YW4iLCAiQmlzbmlzIiwgIlRla25vbG9naSIsICJLZXVhbmdhbiIpLA0KICBBcGxpa2FzaSA9IGMoDQogICAgIkRpYWdub3NpcyBwZW55YWtpdCwgdWppIGtsaW5pcyIsDQogICAgIkFuYWxpc2lzIHJpc2lrbywgZm9yZWNhc3RpbmciLA0KICAgICJNYWNoaW5lIGxlYXJuaW5nLCBBSSIsDQogICAgIk1hbmFqZW1lbiBwb3J0b2ZvbGlvLCBhc3VyYW5zaSINCiAgKSwNCiAgQ29udG9oID0gYygNCiAgICAiUChzYWtpdCB8IGdlamFsYSB0ZXJ0ZW50dSkiLA0KICAgICJQKHN1a3NlcyBwcm9kdWsgYmFydSkiLA0KICAgICJQKGtsYXNpZmlrYXNpIGJlbmFyKSIsDQogICAgIlAoZGVmYXVsdCBrcmVkaXQpIg0KICApDQopDQoNCmtuaXRyOjprYWJsZShhcGxpa2FzaSwgY2FwdGlvbiA9ICJBcGxpa2FzaSBQcm9iYWJpbGl0YXMgZGkgQmVyYmFnYWkgQmlkYW5nIikNCmBgYA0KLS0tDQoNCiMjIFNpbXVsYXNpIGRhbiBCdWt0aSBFbXBpcmlzDQoNCi0tLQ0KYGBge3J9DQpzZXQuc2VlZCgxMjMpDQpuX3NpbXVsYXNpIDwtIDEwMDANCg0KIyBTaW11bGFzaSBwZWxlbXBhcmFuIGtvaW4NCmhhc2lsX2tvaW4gPC0gc2FtcGxlKGMoIkciLCAiQSIpLCBuX3NpbXVsYXNpLCByZXBsYWNlID0gVFJVRSkNCnBfZ2FtYmFyX2VtcGlyaXMgPC0gbWVhbihoYXNpbF9rb2luID09ICJHIikNCg0KIyBTaW11bGFzaSBwZWxlbXBhcmFuIGRhZHUNCmhhc2lsX2RhZHUgPC0gc2FtcGxlKDE6Niwgbl9zaW11bGFzaSwgcmVwbGFjZSA9IFRSVUUpDQpwX2dlbmFwX2VtcGlyaXMgPC0gbWVhbihoYXNpbF9kYWR1ICUlIDIgPT0gMCkNCg0KaGFzaWxfc2ltdWxhc2kgPC0gZGF0YS5mcmFtZSgNCiAgRWtzcGVyaW1lbiA9IGMoIlBlbGVtcGFyYW4gS29pbiIsICJQZWxlbXBhcmFuIERhZHUiKSwNCiAgUHJvYmFiaWxpdGFzX0VtcGlyaXMgPSBjKHJvdW5kKHBfZ2FtYmFyX2VtcGlyaXMsIDMpLCByb3VuZChwX2dlbmFwX2VtcGlyaXMsIDMpKSwNCiAgUHJvYmFiaWxpdGFzX1Rlb3JpdGlzID0gYygiMC41MDAiLCAiMC41MDAiKSwNCiAgU2VsaXNpaCA9IGMoDQogICAgcm91bmQoYWJzKHBfZ2FtYmFyX2VtcGlyaXMgLSAwLjUpLCAzKSwNCiAgICByb3VuZChhYnMocF9nZW5hcF9lbXBpcmlzIC0gMC41KSwgMykNCiAgKQ0KKQ0KDQprbml0cjo6a2FibGUoaGFzaWxfc2ltdWxhc2ksIGNhcHRpb24gPSAiSGFzaWwgU2ltdWxhc2kgMTAwMCBQZXJjb2JhYW4iKQ0KYGBgDQotLS0NCg0KIyMgS2VzaW1wdWxhbg0KDQoxLiBQcm9iYWJpbGl0YXMgbWVuZ2t1YW50aWZpa2FzaSBrZXRpZGFrcGFzdGlhbg0KMi4gUnVhbmcgc2FtcGVsIG1lbmRlZmluaXNpa2FuIHNlbXVhIGtlbXVuZ2tpbmFuDQozLiBBdHVyYW4gcHJvYmFiaWxpdGFzIHNpc3RlbWF0aXMgZGFuIGtvbnNpc3Rlbg0KNC4gQXBsaWthc2kgc2FuZ2F0IGx1YXMgZGkgYmVyYmFnYWkgYmlkYW5nDQoNCg0KIyBJbmRlcGVuZGVudCBhbmQgRGVwZW5kZW50DQoNClNldGVsYWgga2l0YSBtZW5ndWFzYWkgZGFzYXItZGFzYXIgcHJvYmFiaWxpdGFzLCBydWFuZyBzYW1wZWwsIGRhbiBBdHVyYW4gS29tcGxlbWVuLCBraW5pIHNhYXRueWEga2l0YSBtZWxhbmdrYWggbGViaWggamF1aCBrZSBkYWxhbSBza2VuYXJpbyBkaSBtYW5hIGR1YSBhdGF1IGxlYmloIGtlamFkaWFuIHRlcmphZGkgc2VjYXJhIGJlcnVydXRhbiBhdGF1IGJlcnNhbWFhbi4gVmlkZW8gaW5pLCAiUHJvYmFiaWxpdHkgb2YgSW5kZXBlbmRlbnQgYW5kIERlcGVuZGVudCBFdmVudHMgKDYuMikiLCBiZXJmb2t1cyBwYWRhIGRpbmFtaWthIGludGVyYWtzaSBhbnRhci1rZWphZGlhbi4NCg0KUGVydGFueWFhbiBtZW5kYXNhciB5YW5nIGFrYW4ga2l0YSBqYXdhYiBhZGFsYWg6IEFwYWthaCBoYXNpbCBkYXJpIHNhdHUga2VqYWRpYW4gbWVuZ3ViYWggcGVsdWFuZyB0ZXJqYWRpbnlhIGtlamFkaWFuIGJlcmlrdXRueWE/DQpNYXRlcmkgaW5pIGFkYWxhaCBrdW5jaSB1bnR1ayBtZW1vZGVsa2FuIHJlYWxpdGFzIHlhbmcgbGViaWgga29tcGxla3MuIEtpdGEgYWthbiBtZW5kYWxhbWkgcGVyYmVkYWFuIGtydXNpYWwgYW50YXJhOg0KDQoqIEtlamFkaWFuIEluZGVwZW5kZW46IERpIG1hbmEgcGVyaXN0aXdhIHNhdHUgdGlkYWsgbWVtaWxpa2kgZGFtcGFrIGFwYSBwdW4gcGFkYSBwZXJpc3Rpd2EgbGFpbi4gRGkgc2luaSwgcGVyaGl0dW5nYW5ueWEgcmVsYXRpZiBzZWRlcmhhbmEsIGhhbnlhIG1lbGliYXRrYW4gcGVya2FsaWFuIHByb2JhYmlsaXRhcyBhd2FsLg0KDQoqIEtlamFkaWFuIERlcGVuZGVuOiBEaSBtYW5hIGhhc2lsIGRhcmkga2VqYWRpYW4gcGVydGFtYSBzZWNhcmEgbWF0ZXJpYWwgbWVuZ3ViYWgga29tcG9zaXNpIGF0YXUga29uZGlzaSwgc2VoaW5nZ2EgcHJvYmFiaWxpdGFzIGtlamFkaWFuIGtlZHVhIGhhcnVzIGRpc2VzdWFpa2FuLiBJbmkgbWVtcGVya2VuYWxrYW4ga29uc2VwIHBlbnRpbmcgZGFyaSBQcm9iYWJpbGl0YXMgQmVyc3lhcmF0IChQKEIgXG1pZCBBKSksIHlhbmcgZXNlbnNpYWwgZGFsYW0gc2l0dWFzaSAidGFucGEgcGVuZ2VtYmFsaWFuIiAod2l0aG91dCByZXBsYWNlbWVudCkuDQoNCkRlbmdhbiBtZW1haGFtaSBkYW4gbWVuZXJhcGthbiBrZWR1YSBhdHVyYW4gaW5p4oCUcGVya2FsaWFuIHNlZGVyaGFuYSB1bnR1ayBpbmRlcGVuZGVuLCBkYW4gcGVya2FsaWFuIGRlbmdhbiBwZWx1YW5nIGJlcnN5YXJhdCB1bnR1ayBkZXBlbmRlbuKAlEFuZGEgYWthbiBzaWFwIG1lbmdhbmFsaXNpcyBiZXJiYWdhaSBza2VuYXJpbyBwcm9iYWJpbGl0YXMgZ2FidW5nYW4sIGRhcmkgcGVybWFpbmFuIGthcnR1IGhpbmdnYSBwZW5nYW1iaWxhbiBzYW1wZWwgc3RhdGlzdGlrLg0KDQo8Y2VudGVyPg0KPGlmcmFtZSBzcmM9Imh0dHBzOi8vd3d3LnlvdXR1YmUuY29tL2VtYmVkL0xTLV9paERLcjJNIiB3aWR0aD0iNjAwIiBoZWlnaHQ9IjM2MCIgd2lkdGg9Ijc2OCIgaGVpZ2h0PSI0MDBweCIgZGF0YS1leHRlcm5hbD0iMSI+IDwvaWZyYW1lPg0KPC9jZW50ZXI+DQoNCiMjIEludGVycHJldGFzaQ0KDQoqIE1hdGVyaSBpbmkgbWVtYmFoYXMgYmFnYWltYW5hIG1lbmdoaXR1bmcgcHJvYmFiaWxpdGFzIGtldGlrYSBkdWEga2VqYWRpYW4gKEEgZGFuIEIpIHRlcmphZGkgc2VjYXJhIGJlcnVydXRhbiwgZGVuZ2FuIGZva3VzIHBhZGEgYXBha2FoIGtlamFkaWFuIHRlcnNlYnV0IHNhbGluZyBtZW1lbmdhcnVoaSAoRGVwZW5kZW4pIGF0YXUgdGlkYWsgc2FsaW5nIG1lbWVuZ2FydWhpIChJbmRlcGVuZGVuKS4NCg0KKiBBbmFsaXNpcyB5YW5nIHRlcGF0IGRhbGFtIHByb2JhYmlsaXRhcyBkaW11bGFpIGRlbmdhbiBtZW5lbnR1a2FuIGFwYWthaCBwZXJpc3Rpd2EgcGVydGFtYSBtZW5ndWJhaCBrb25kaXNpIChwZW55ZWJ1dCkgdW50dWsgcGVyaXN0aXdhIGtlZHVhLiBJbmkgbWVtYWtzYSBraXRhIGJlcmFsaWggZGFyaSBwZXJrYWxpYW4gc2VkZXJoYW5hIGtlIHBlbmdndW5hYW4gUGVsdWFuZyBCZXJzeWFyYXQgKFAoQnxBKSkuDQoNCiMjIEtlamFkaWFuIEluZGVwZW5kZW4gKEluZGVwZW5kZW50IEV2ZW50cykNCg0KKipEZWZpbmlzaToqKiBEdWEga2VqYWRpYW4gKEEgZGFuIEIpIGRpc2VidXQgaW5kZXBlbmRlbiBqaWthIGhhc2lsIGRhcmkgQSB0aWRhayBtZW1lbmdhcnVoaSBwcm9iYWJpbGl0YXMgdGVyamFkaW55YSBCLiBQcm9iYWJpbGl0YXMga2VqYWRpYW4gaW5kZXBlbmRlbiBiZXJzaWZhdCB0YW5wYSBwZW5nZW1iYWxpYW4ga29uc2VwdHVhbCAobWlzYWxueWEsIG1lbGVtcGFyIGRhZHUgZGFuIGtvaW4pLg0KDQoqKkNvbnRvaCBVdGFtYToqKiAgTWVsZW1wYXIgRGFkdSBkYW4gTWVsZW1wYXIgS29pbi5IYXNpbCBkYXJpIGRhZHUgKG1pc2FsbnlhLCBtZW5kYXBhdCBhbmdrYSA2KSB0aWRhayBha2FuIG1lbmd1YmFoIHBlbHVhbmcga29pbiBtZW5kYXJhdCBwYWRhIEtlcGFsYSAoSCkgYXRhdSBFa29yIChUKS4gUGVsdWFuZyBIIGFrYW4gdGV0YXAgMC41Lg0KDQoqKlJ1bXVzOioqIFVudHVrIG1lbmdoaXR1bmcgcHJvYmFiaWxpdGFzIGR1YSBwZXJpc3Rpd2EgaW5kZXBlbmRlbiBBIGRhbiBCIHRlcmphZGkgYmVyc2FtYWFuLCBDdWt1cCBkZW5nYW4gbWVuZ2FsaWthbiBwcm9iYWJpbGl0YXMgbWFzaW5nLW1hc2luZyBwZXJpc3Rpd2EuIEluaSBkaWtlbmFsIHNlYmFnYWkgQXR1cmFuIFBlcmthbGlhbiB1bnR1ayBQZXJpc3Rpd2EgSW5kZXBlbmRlbi4NCg0KJCRQKEEgXHRleHR7IGRhbiB9IEIpID0gUChBKSBcdGltZXMgUChCKSQkDQoNCioqQ29udG9oIEthc3VzOioqIFBlbHVhbmcgbWVuZGFwYXRrYW4gYW5na2EgNSBwYWRhIGRhZHUgJChQKEEpPTEvNikkIGRhbiBIZWFkIHBhZGEga29pbiAkKFAoQik9MS8yKSQuDQoNCioqTGFuZ2thaCAxOioqIFRlbnR1a2FuICpQKEEpKiAoTWVuZGFwYXRrYW4gNSBwYWRhIERhZHUpDQoNCiogSGFzaWwgeWFuZyBtZW5ndW50dW5na2FuOiAxKGFuZ2thIDUpDQoqIFRvdGFsIEhhc2lsOiA2KDEsMiwzLDQsNSw2KQ0KDQokJFAoQSkgPSBcZnJhY3sxfXs2fSQkDQoNCioqTGFuZ2thaCAyOioqIFRlbnR1a2FuICpQKEIpKiAoTWVuZGFwYXRrYW4gSGVhZCBwYWRhIEtvaW4pDQoNCiogSGFzaWwgeWFuZyBtZW5ndW50dW5na2FuOiAxKEhlYWQpDQoqIFRvdGFsIEhhc2lsOiAyKEhlYWQsVGFpbCkNCg0KJCRQKEIpID0gXGZyYWN7MX17Mn0kJA0KKipMYW5na2FoIDM6KiogS2FsaWthbiBQcm9iYWJpbGl0YXMNCiQkUChBIFx0ZXh0eyBkYW4gfSBCKSA9IFxmcmFjezF9ezZ9IFx0aW1lcyBcZnJhY3sxfXsyfSA9IFxmcmFjezF9ezEyfSBcYXBwcm94IDAuMDgzMyBcdGV4dHsgYXRhdSB9IDguMzNcJSQkDQoNCiMjIEtlamFkaWFuIERlcGVuZGVuIChEZXBlbmRlbnQgRXZlbnRzKQ0KDQoqKkRlZmluaXNpOioqIER1YSBrZWphZGlhbiAoQSBkYW4gQikgZGlzZWJ1dCBkZXBlbmRlbiBqaWthIGhhc2lsIGRhcmkgQSBtZW1lbmdhcnVoaSBwcm9iYWJpbGl0YXMgdGVyamFkaW55YSBCLiBQZXJpc3Rpd2EgaW5pIHNlcmluZyB0ZXJqYWRpIGRhbGFtIHNrZW5hcmlvIHRhbnBhIHBlbmdlbWJhbGlhbiAod2l0aG91dCByZXBsYWNlbWVudCksIGRpIG1hbmEgcnVhbmcgc2FtcGVsIGJlcmt1cmFuZyBzZXRlbGFoIGtlamFkaWFuIHBlcnRhbWEuDQoNCioqUnVtdXMgVXRhbWE6KiogUGVsdWFuZyBiYWh3YSBrZWphZGlhbiBBIGRhbiBCIGtlZHVhbnlhIHRlcmphZGk6DQoNCiQkUChBIFxjYXAgQikgPSBQKEEgXHRleHR7IGRhbiB9IEIpID0gUChBKSBcdGltZXMgUChCIFxtaWQgQSkkJA0KDQpEaSBtYW5hICRQKEIgXG1pZCBBKSQgYWRhbGFoIFByb2JhYmlsaXRhcyBCZXJzeWFyYXQgKENvbmRpdGlvbmFsIFByb2JhYmlsaXR5KSDigJMgcGVsdWFuZyBCIHRlcmphZGkgc2V0ZWxhaCBBIHRlcmphZGkuDQoNCioqQ29udG9oIEthc3VzOioqIEtvdGFrIGJlcmlzaSA3IGtlbGVyZW5nIGhpamF1IChIKSBkYW4gMyBrZWxlcmVuZyBiaXJ1IChCKSAoVG90YWwgMTApLiBBbmRhIG1lbmdhbWJpbCBkdWEga2VsZXJlbmcgdGFucGEgcGVuZ2VtYmFsaWFuLiBNYWthLCBiZXJhcGEgcGVsdWFuZyBtZW5nYW1iaWwga2VsZXJlbmcgaGlqYXUgcGVydGFtYSBkYW4gYmlydSBrZWR1YT8NCg0KS2FyZW5hIGluaSBhZGFsYWggcGVyaXN0aXdhIHRhbnBhIHBlbmdlbWJhbGlhbiwgcHJvYmFiaWxpdGFzbnlhIGRlcGVuZGVuLiBSdW11cyB5YW5nIGRpZ3VuYWthbiBhZGFsYWg6DQokJFAoSF8xIFx0ZXh0eyBkYW4gfSBCXzIpID0gUChIXzEpIFx0aW1lcyBQKEJfMiBcbWlkIEhfMSkkJA0KDQoqKkxhbmdrYWggMToqKiBUZW50dWthbiAkUChIXzEpJCAoUGVsdWFuZyBIaWphdSBQZXJ0YW1hKQ0KDQoqIEhpamF1IEF3YWw6IDcNCiogVG90YWwgQXdhbDogMTANCiQkUChIXzEpID0gXGZyYWN7N317MTB9JCQNCg0KKipMYW5na2FoIDI6KiogVGVudHVrYW4gJFAoQl8yIFxtaWQgSF8xKSQgKFBlbHVhbmcgYmlydSBrZWR1YSwgc2V0ZWxhaCBoaWphdSBkaWFtYmlsKQ0KDQoqIFRvdGFsIHNpc2E6IDkoa2FyZW5hIDEgaGlqYXUgc3VkYWggZGlhbWJpbCkNCiogQmlydSBzaXNhOiAzKGp1bWxhaCBiaXJ1IHRpZGFrIGJlcnViYWgpDQokJFAoQl8yIFxtaWQgSF8xKSA9IFxmcmFjezN9ezl9JCQNCg0KKipMYW5na2FoIDM6KiogS2FsaWthbiBwcm9iYWJpbGl0YXMgZ2FidW5nYW4NCg0KJCRQKEhfMSBcdGV4dHsgZGFuIH0gQl8yKSA9IFxmcmFjezd9ezEwfSBcdGltZXMgXGZyYWN7M317OX0gPSBcZnJhY3syMX17OTB9ID0gXGZyYWN7N317MzB9IFxhcHByb3ggMC4yMzMzIFx0ZXh0eyBhdGF1IH0gMjMuMzNcJSQkDQoNCioqU29hbCBsYWluOioqIEJlcmFwYWthaCBQZWx1YW5nIG1lbmdhbWJpbCBrZWxlcmVuZyBoaWphdSBwZXJ0YW1hIGRhbiBoaWphdSBrZWR1YT8NCg0KUnVtdXMgeWFuZyBkaWd1bmFrYW46ICQkUChIXzEgXHRleHR7IGRhbiB9IEhfMikgPSBQKEhfMSkgXHRpbWVzIFAoSF8yIFxtaWQgSF8xKSQkDQoNCioqTGFuZ2thaCAxOioqIFRlbnR1a2FuICRQKEhfMSkkIChQZWx1YW5nIGhpamF1IHBlcnRhbWEpDQoNCiogSGlqYXUgYXdhbDogNw0KKiBUb3RhbCBhd2FsOiAxMA0KJCRQKEhfMSkgPSBcZnJhY3s3fXsxMH0kJA0KDQoqKkxhbmdrYWggMjogVGVudHVrYW4gJFAoSF8yIFxtaWQgSF8xKSQgKFBlbHVhbmcgaGlqYXUga2VkdWEsIHNldGVsYWggaGlqYXUgZGlhbWJpbCkNCg0KU2V0ZWxhaCBrZWxlcmVuZyBoaWphdSBwZXJ0YW1hIGRpYW1iaWwsIHJ1YW5nIHNhbXBlbCBiZXJrdXJhbmc6DQoqVG90YWwgc2lzYTogOQ0KKkhpamF1IHNpc2E6IDYNCg0KJCRQKEhfMiBcbWlkIEhfMSkgPSBcZnJhY3s2fXs5fSQkDQoNCioqTGFuZ2thaCAzOioqIEthbGlrYW4gcHJvYmFiaWxpdGFzIGdhYnVuZ2FuDQoNCiQkUChIXzEgXHRleHR7IGRhbiB9IEhfMikgPSBcZnJhY3s3fXsxMH0gXHRpbWVzIFxmcmFjezZ9ezl9ID0gXGZyYWN7NDJ9ezkwfSA9IFxmcmFjezd9ezE1fSBcYXBwcm94IDAuNDY2NyBcdGV4dHsgYXRhdSB9IDQ2LjY3XCUkJA0KDQojIFVuaW9uIG9mIEV2ZW50cw0KDQpTZXRlbGFoIGtpdGEgbWVuZ3Vhc2FpIEF0dXJhbiBQZXJrYWxpYW4gdW50dWsga2VqYWRpYW4gaW5kZXBlbmRlbiBkYW4gZGVwZW5kZW4sIGtpdGEgYmVyYWxpaCBrZSBrb25zZXAgZnVuZGFtZW50YWwgbGFpbjogQXR1cmFuIFBlbmp1bWxhaGFuLCB5YW5nIG1lbmdhdHVyIHByb2JhYmlsaXRhcyBrZXRpa2Ega2l0YSB0ZXJ0YXJpayBwYWRhIHNldGlkYWtueWEgc2F0dSBkYXJpIGR1YSBrZWphZGlhbi4NCg0KUGVtYWhhbWFuIGluaSwgeWFuZyBkaXZpc3VhbGlzYXNpa2FuIGRlbmdhbiBqZWxhcyBtZWxhbHVpIERpYWdyYW0gVmVubiwgbWVtYmVyaWthbiBhbGF0IHlhbmcga3VhdCB1bnR1ayBtZW1lY2Foa2FuIG1hc2FsYWggcHJvYmFiaWxpdGFzIHlhbmcga29tcGxla3MuIE1hdGVyaSBpbmkgbWVsZW5na2FwaSBwZW1haGFtYW4ga2l0YSB0ZW50YW5nIHByb2JhYmlsaXRhcyBkYXNhciwgbWVtYmVyaWthbiBhbGF0IHlhbmcga3VhdCB1bnR1ayBtZW1lY2Foa2FuIG1hc2FsYWggeWFuZyBtZWxpYmF0a2FuIGthdGEga3VuY2kgImF0YXUiLg0KDQo8Y2VudGVyPg0KPGlmcmFtZSBzcmM9Imh0dHBzOi8vd3d3LnlvdXR1YmUuY29tL2VtYmVkL3ZxS0FiaENxU1RjIiB3aWR0aD0iNjAwIiBoZWlnaHQ9IjM2MCIgd2lkdGg9Ijc2OCIgaGVpZ2h0PSI0MDBweCIgZGF0YS1leHRlcm5hbD0iMSI+IDwvaWZyYW1lPg0KPC9jZW50ZXI+DQoNCiMjIEludGVycGV0YXNpDQoNCiogVmlkZW8gaW5pLCAiVGhlIFByb2JhYmlsaXR5IG9mIHRoZSBVbmlvbiBvZiBFdmVudHMiLCBtZW1wZXJrZW5hbGthbiBraXRhIHBhZGEgVW5pb24gb2YgRXZlbnRzICQkKFAoQSBcdGV4dHsgYXRhdSB9IEIpKSQkLiBJbmkgYWRhbGFoIGtvbnNlcCBwZW50aW5nIHVudHVrIG1lbmdoaXR1bmcgcGVsdWFuZyBiYWh3YSBzYWxhaCBzYXR1IGRhcmkgZHVhIGtlamFkaWFuIGF0YXUga2VkdWFueWEgYWthbiB0ZXJqYWRpLiBVbmlvbiBvZiBFdmVudHMgZGl0YW5kYWkgZGVuZ2FuIGthdGEga3VuY2kgIkFUQVUiIChPUikgZGFsYW0gcGVydGFueWFhbiBwcm9iYWJpbGl0YXMuDQoNCioga2V0aWthIGtpdGEgbWVuanVtbGFoa2FuIHBlbHVhbmcgZHVhIHBlcmlzdGl3YSwga2l0YSBoYXJ1cyBzZWxhbHUgbWVtYXN0aWthbiB1bnR1ayB0aWRhayBtZW5naGl0dW5nIGlyaXNhbiAoaW50ZXJzZWtzaSkgeWFuZyB0dW1wYW5nIHRpbmRpaCBzZWJhbnlhayBkdWEga2FsaS4NCg0KKiBJbnRpIGRhcmkgQXR1cmFuIFBlbmp1bWxhaGFuIGFkYWxhaCBtZW5naGluZGFyaSBrZXNhbGFoYW4ga3J1c2lhbCB5YW5nIGRpa2VuYWwgc2ViYWdhaSBwZW5naGl0dW5nYW4gZ2FuZGEgKGRvdWJsZS1jb3VudGluZykuIEtpdGEgYWthbiBtZW5kYWxhbWkgbWVuZ2FwYSBJbnRlcnNlY3Rpb24gb2YgRXZlbnRzICQoUChBIFx0ZXh0eyBkYW4gfSBCKSkkLCB5YWl0dSBkYWVyYWggdHVtcGFuZyB0aW5kaWggYW50YXJhIEEgZGFuIEIsIGhhcnVzIGRpa3VyYW5naSBkYXJpIHRvdGFsIHBlbmp1bWxhaGFuIFAoQSkgZGFuIFAoQikuDQoNCiMjIFRpbmphdWFuIERhc2FyIFByb2JhYmlsaXRhcw0KDQoqKlJ1YW5nIFNhbXBlbCAoU2FtcGxlIFNwYWNlKToqKiBTZWx1cnVoIHNldCBoYXNpbCB5YW5nIG11bmdraW4gZGFsYW0gZWtzcGVyaW1lbiBzdGF0aXN0aWsuDQoNCioqQ29udG9oOioqIE1lbGVtcGFyIGR1YSBkYWR1IDYgc2lzaSBtZW5naGFzaWxrYW4gdG90YWwgJCQ2IFx0aW1lcyA2ID0gXG1hdGhiZnszNn0kJCBoYXNpbCB5YW5nIG11bmdraW4uDQoNCioqUHJvYmFiaWxpdGFzIFNlZGVyaGFuYToqKiBEaWhpdHVuZyBkZW5nYW4gbWVtYmFnaSBqdW1sYWggaGFzaWwgeWFuZyBtZW5ndW50dW5na2FuIGRlbmdhbiB0b3RhbCBoYXNpbCB5YW5nIG11bmdraW4gZGFsYW0gcnVhbmcgc2FtcGVsLg0KDQoqKkNvbnRvaDoqKiAkJFAoXHRleHR7bWVuZGFwYXQgZHVhIGFuZ2thIDR9KSA9IFxtYXRoYmZ7MS8zNn0kJC4NCg0KIyMgQXR1cmFuIFBlbmp1bWxhaGFuIChUaGUgQWRkaXRpb24gUnVsZSAvIFVuaW9uIG9mIEV2ZW50cykNCg0KVW5pb24gb2YgRXZlbnRzIGFkYWxhaCBwZWx1YW5nIHNhbGFoIHNhdHUga2VqYWRpYW4gKEEgYXRhdSBCKSB0ZXJqYWRpLiBLZWphZGlhbiB5YW5nIGRpY2FrdXAgdGVybWFzdWs6IEEgdGVyamFkaSwgQiB0ZXJqYWRpLCBhdGF1IEEgZGFuIEIga2VkdWFueWEgdGVyamFkaS4NCg0KKipSdW11cyBVdGFtYSAoR2VuZXJhbCBBZGRpdGlvbiBSdWxlKToqKg0KJCRQKEEgXHRleHR7IGF0YXUgfSBCKSA9IFAoQSkgKyBQKEIpIC0gUChBIFx0ZXh0eyBkYW4gfSBCKSQkDQpNZW5nYXBhIEFkYSBQZW5ndXJhbmdhbiAkKCAtUChBIFx0ZXh0eyBkYW4gfSBCKSk/JA0KDQpLYXJlbmEgaXN0aWxhaCBwZW5ndXJhbmdhbiAkLVAoQSBcdGV4dHsgZGFuIH0gQikkIGRpcGVybHVrYW4gdW50dWsgbWVuZ2hpbGFuZ2thbiB0dW1wYW5nIHRpbmRpaCAob3ZlcmxhcCkgYXRhdSBkdXBsaWthc2kgaGFzaWwgeWFuZyBkaWhpdHVuZy4NCg0KSW50ZXJzZWN0aW9uIG9mIEV2ZW50cyAkKFAoQSBcdGV4dHsgZGFuIH0gQikpJCBBZGFsYWggcGVsdWFuZyBrZWR1YSBrZWphZGlhbiB0ZXJqYWRpIHNlY2FyYSBiZXJzYW1hYW4uIEtldGlrYSBBbmRhIG1lbmp1bWxhaGthbiBQKEEpICsgUChCKSwgaGFzaWwgZGkgYXJlYSBpcmlzYW4gKGludGVyc2VjdGlvbikgZGloaXR1bmcgZHVhIGthbGkgKHNla2FsaSB1bnR1ayBBIGRhbiBzZWthbGkgdW50dWsgQikuIFBlbmd1cmFuZ2FuIGluaSBtZW1hc3Rpa2FuIGFyZWEgdHVtcGFuZyB0aW5kaWggaGFueWEgZGloaXR1bmcgc2F0dSBrYWxpLg0KDQojIyBDb250b2ggUGVuZXJhcGFuIFJpbmNpIChEdWEgRGFkdSkNCg0KKipTb2FsOioqIEJlcmFwYSBwcm9iYWJpbGl0YXMgbWVsZW1wYXIgZHVhIGRhZHUgbWVuZGFwYXQgZHVhIGFuZ2thIGdlbmFwIChBKSBBVEFVIG1lbmRhcGF0IHNldGlkYWtueWEgc2F0dSBhbmdrYSAyIChCKT8NCg0KIyMjIEhpdHVuZyBQZWx1YW5nIEtvbXBvbmVuDQoNCjEuICoqUChBKToqKiBQZWx1YW5nIG1lbmRhcGF0IGR1YSBhbmdrYSBnZW5hcC4NCiAgICAgKiBIYXNpbCB5YW5nIG1lbmd1bnR1bmdrYW4gKGNvbnRvaDogKDIsMiksICgyLDQpLCAoNCw2KSwgZHN0LikgPSA5IGhhc2lsLg0KICAgICANCkphZGksICQkUChBKSA9IDkvMzYkJA0KICAgICANCjIuICoqUChCKToqKiBQZWx1YW5nIG1lbmRhcGF0IHNldGlkYWtueWEgc2F0dSBhbmdrYSAyLg0KICAgICAqIEhhc2lsIHlhbmcgbWVuZ3VudHVuZ2thbiA9IDExIGhhc2lsLg0KICAgICANCkphZGksICQkUChCKSA9IDExLzM2JCQNCg0KIyMjIEhpdHVuZyBJcmlzYW4gKEludGVyc2VjdGlvbikNCg0KJCRQKEEgXHRleHR7IGRhbiB9IEIpJCQgYWRhbGFoIHBlbHVhbmcgbWVuZGFwYXQgZHVhIGFuZ2thIGdlbmFwIGRhbiBzZXRpZGFrbnlhIHNhdHUgYW5na2EgMi4NCg0KSW5pIGFkYWxhaCBoYXNpbCB5YW5nIG1lbmphZGkgaXJpc2FuIGRhcmkgc2V0IEEgZGFuIHNldCBCIChjb250b2g6ICgyLDQpLCAoNCwyKSwgKDIsNiksICg2LDIpLCAoMiwyKSkgPSA1IGhhc2lsLg0KDQpKYWRpLCAkJFAoQSBcdGV4dHsgZGFuIH0gQikgPSA1LzM2JCQNCg0KIyMjIEhpdHVuZyBVbmlvbiBNZW5nZ3VuYWthbiBSdW11cw0KU3Vic3RpdHVzaWthbiBuaWxhaSBrZSBkYWxhbSBHZW5lcmFsIEFkZGl0aW9uIFJ1bGU6DQoNCiQkUChBIFx0ZXh0eyBhdGF1IH0gQikgPSBQKEEpICsgUChCKSAtIFAoQSBcdGV4dHvCoGRhbsKgfcKgQikkJA0KDQokJFAoQSBcdGV4dHsgYXRhdSB9IEIpID0gXGZyYWN7OX17MzZ9ICsgXGZyYWN7MTF9ezM2fSAtIFxmcmFjezV9ezM2fSQkDQoNCiQkUChBIFx0ZXh0eyBhdGF1IH0gQikgPSBcZnJhY3sxNX17MzZ9IFxhcHByb3ggMC40MTY3JCQNCg0KDQoNCiMgRXhjbHVzaXZlIGFuZCBFeGhhdXN0aXZlDQoNClZpZGVvICJNdXR1YWxseSBFeGNsdXNpdmUgYW5kIEV4aGF1c3RpdmUgRXZlbnRzIiBtZW1iZXJpa2FuIGtpdGEgYWxhdCBkaWFnbm9zdGlrIHVudHVrIG1lbnllZGVyaGFuYWthbiBwZXJoaXR1bmdhbiBwcm9iYWJpbGl0YXMuIEtlamFkaWFuIHlhbmcgU2FsaW5nIExlcGFzIG1lbmdoaWxhbmdrYW4ga2VydW1pdGFuIGlyaXNhbiAoaW50ZXJzZWN0aW9uKSwga2FyZW5hIHRpZGFrIGFkYSB0dW1wYW5nIHRpbmRpaCBzYW1hIHNla2FsaS4gU2VtZW50YXJhIGl0dSwgS2VqYWRpYW4gTGVuZ2thcCBtZW1iZXJpa2FuIGtlcGFzdGlhbiBiYWh3YSBzZW11YSBoYXNpbCB5YW5nIG11bmdraW4gdGVsYWggdGVyY2FrdXAuIFBlbmd1YXNhYW4ga2VkdWEga29uc2VwIGluaSBtZW11bmdraW5rYW4ga2l0YSBtZW5lcmFwa2FuIEF0dXJhbiBQZW5qdW1sYWhhbiBkYWxhbSBiZW50dWsgeWFuZyBwYWxpbmcgc2VkZXJoYW5hLCBtZW1wZXJrdWF0IGZvbmRhc2kga2l0YSBkYWxhbSBtZW1lY2Foa2FuIG1hc2FsYWggcHJvYmFiaWxpdGFzLg0KDQo8Y2VudGVyPg0KPGlmcmFtZSBzcmM9Imh0dHBzOi8vd3d3LnlvdXR1YmUuY29tL2VtYmVkL2Y3YWdUdjluQTVrIiB3aWR0aD0iNjAwIiBoZWlnaHQ9IjM2MCIgd2lkdGg9Ijc2OCIgaGVpZ2h0PSI0MDBweCIgZGF0YS1leHRlcm5hbD0iMSI+IDwvaWZyYW1lPg0KPC9jZW50ZXI+DQoNCiMjIEludGVycHJldGFzaQ0KDQpWaWRlbyBpbmkgbWVuZ2FqYXJrYW4ga2l0YSB1bnR1ayBtZW5na2F0ZWdvcmlrYW4gaHVidW5nYW4gYW50YXJwZXJpc3Rpd2EgKGFwYWthaCBtZXJla2EgdHVtcGFuZyB0aW5kaWggYXRhdSB0aWRhaywgZGFuIGFwYWthaCBtZXJla2EgbWVuY2FrdXAgc2VtdWEga2VtdW5na2luYW4pIHNlYmVsdW0gbWVsYWt1a2FuIHBlcmhpdHVuZ2FuIHBlbHVhbmcgeWFuZyBsZWJpaCBrb21wbGVrcy4NCg0KIyMgUGVyaXN0aXdhIFNhbGluZyBMZXBhcyAoTXV0dWFsbHkgRXhjbHVzaXZlIEV2ZW50cykNCg0KKipEZWZpbmlzaToqKiBEdWEgYXRhdSBsZWJpaCBwZXJpc3Rpd2EgZGlrYXRha2FuIFNhbGluZyBMZXBhcyAoTXV0dWFsbHkgRXhjbHVzaXZlKSBqaWthIG1lcmVrYSB0aWRhayBkYXBhdCB0ZXJqYWRpIHNlY2FyYSBiZXJzYW1hYW4gZGFsYW0gc2F0dSBrYWxpIHBlcmNvYmFhbi4NCg0KKiBQKEEgZGFuIEIpOiBQcm9iYWJpbGl0YXMgaXJpc2FuICQoQSBcY2FwIEIpJCBzZWxhbHUgbm9sICgwKS4NCg0KKiBWaXN1YWxpc2FzaTogRGFsYW0gRGlhZ3JhbSBWZW5uLCBsaW5na2FyYW4gdW50dWsgQSBkYW4gQiB0aWRhayBiZXJzZW50dWhhbiBhdGF1IHRpZGFrIHR1bXBhbmcgdGluZGloLiBLYXJlbmEgdGlkYWsgYWRhIHR1bXBhbmcgdGluZGloIHlhbmcgcGVybHUgZGlrdXJhbmdpLCBydW11c255YSBkaXNlZGVyaGFuYWthbiBtZW5qYWRpOg0KJCRQKEEgXHRleHR7IGF0YXUgfSBCKSA9IFAoQSkgKyBQKEIpJCQNCg0KKipDb250b2ggS2FzdXM6KiogUGVsZW1wYXJhbiBEYWR1IFR1bmdnYWwNCg0KKipTb2FsOioqIFBlbHVhbmcgbWVuZGFwYXQgYW5na2EgZ2FuamlsIChBKSBhdGF1IGFuZ2thIDYgKEIpIGRhbGFtIHNhdHUgbGVtcGFyYW4gZGFkdS4NCg0KKiAkQSA9IFx7MSwgMywgNVx9JA0KKiAkQiA9IFx7Nlx9JA0KKiBTYWxpbmcgTGVwYXM6IFlhLCBrYXJlbmEgQW5kYSB0aWRhayBtdW5na2luIG1lbmRhcGF0IGFuZ2thIGdhbmppbCBkYW4gYW5na2EgNiBzZWNhcmEgYmVyc2FtYWFuLg0KDQojIyBQZXJpc3Rpd2EgTGVuZ2thcCAoRXhoYXVzdGl2ZSBFdmVudHMpDQoNCioqRGVmaW5pc2k6KiogU2VrZWxvbXBvayBwZXJpc3Rpd2EgZGlrYXRha2FuIExlbmdrYXAgKEV4aGF1c3RpdmUpIGppa2Egc2VsdXJ1aCBoYXNpbCB5YW5nIG11bmdraW4gZGFsYW0gcnVhbmcgc2FtcGVsIHRlcmNha3VwIG9sZWggcGVyaXN0aXdhLXBlcmlzdGl3YSB0ZXJzZWJ1dC4NCg0KKiBQKFVuaW9uKTogUHJvYmFiaWxpdGFzIGdhYnVuZ2FuIChVbmlvbikgZGFyaSBzZW11YSBwZXJpc3Rpd2EgdGVyc2VidXQgaGFydXMgc2FtYSBkZW5nYW4gc2F0dSAoMSkuDQoNCiQkUChFXzEgXHRleHR7IGF0YXUgfSBFXzIgXHRleHR7IGF0YXUgfSAuLi4gXHRleHR7IGF0YXUgfSBFX24pID0gMSQkDQoNCiogS29tYmluYXNpOiBQZXJpc3Rpd2EgeWFuZyBzYWxpbmcgbGVwYXMgKHRpZGFrIHR1bXBhbmcgdGluZGloKSBkYW4gbGVuZ2thcCAobWVsaXB1dGkgc2VsdXJ1aCBydWFuZyBzYW1wZWwpIGFkYWxhaCB5YW5nIHBhbGluZyBpZGVhbCwga2FyZW5hIHBlbmp1bWxhaGFuIHNlbXVhIHBlbHVhbmdueWEgc2FtYSBkZW5nYW4gMS4NCg0KJCRcc3VtIFAoRV9pKSA9IDEkJA0KDQoqKkNvbnRvaCBLYXN1czoqKiBIYXNpbCBQZXJ0YW5kaW5nYW4NCg0KKipTb2FsOioqIEhhc2lsIGFraGlyIHBlcnRhbmRpbmdhbiBzZXBhayBib2xhIChBID0gTWVuYW5nLCBCID0gS2FsYWgsIEMgPSBTZXJpKS4NCg0KKiBMZW5na2FwOiBZYSwga2FyZW5hIHRpZGFrIGFkYSBoYXNpbCBsYWluIHlhbmcgbXVuZ2tpbiAoc2VsYWx1IDEwMCUpLg0KDQoqIEppa2EgZGlrZXRhaHVpOiAkUChcdGV4dHtNZW5hbmd9KSQgPSAwLjQwIGRhbiAkUChcdGV4dHtLYWxhaH0pJCA9IDAuMzUuDQoNCiogTWFrYSwgJFAoXHRleHR7U2VyaX0pJCA9IDEgLSAkUChcdGV4dHtNZW5hbmd9KSQgLSAkUChcdGV4dHtLYWxhaH0pJA0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCiMgQmlub21pYWwgRXhwZXJpbWVudA0KDQpEYWxhbSBkdW5pYSBzdGF0aXN0aWthLCBzZXJpbmdrYWxpIGtpdGEgZGloYWRhcGthbiBwYWRhIHNpdHVhc2kgZGkgbWFuYSBzZWJ1YWggZWtzcGVyaW1lbiBoYW55YSBtZW1pbGlraSBkdWEgaGFzaWwgeWFuZyBtdW5na2luIChzdWtzZXMgYXRhdSBnYWdhbCkgZGFuIGRpbGFrdWthbiBiZXJ1bGFuZyBrYWxpLiBWaWRlbyBpbmkgc2FuZ2F0IHJlbGV2YW4gYmFnaSBwZWxhamFyIGF0YXUgc2lhcGEgcHVuIHlhbmcgaW5naW4gbWVtYWhhbWkgY2FyYSBtZW5naGl0dW5nIHBlbHVhbmcgZGFsYW0ga29uZGlzaSB0ZXJzZWJ1dCB0YW5wYSBoYXJ1cyBtZW5qYWJhcmthbiBzZXRpYXAga2VtdW5na2luYW4gc2VjYXJhIG1hbnVhbC4gUGVuamVsYXNhbiBkaW11bGFpIGRhcmkga29uc2VwIGRhc2FyLCBzeWFyYXQtc3lhcmF0IGVrc3BlcmltZW4sIGhpbmdnYSBwZW5nZ3VuYWFuIHJ1bXVzIG1hdGVtYXRpa2EgdW50dWsgbWVtcGVybXVkYWggcGVyaGl0dW5nYW4uDQoNCjxjZW50ZXI+DQo8aWZyYW1lIHNyYz0iaHR0cHM6Ly93d3cueW91dHViZS5jb20vZW1iZWQvblJ1UUF0YWpKWWsiIHdpZHRoPSI2MDAiIGhlaWdodD0iMzYwIiB3aWR0aD0iNzY4IiBoZWlnaHQ9IjQwMHB4IiBkYXRhLWV4dGVybmFsPSIxIj4gPC9pZnJhbWU+DQo8L2NlbnRlcj4NCg0KIyMgSW50ZXJwcmV0YXNpDQoNClZpZGVvIGluaSBtZW1iZXJpa2FuIHBlbWFoYW1hbiBtZW5kYWxhbSBiYWh3YSBtYXRlbWF0aWthIGFkYWxhaCBhbGF0IGVmaXNpZW5zaS4NCg0KKiBQZW50aW5nbnlhIFN5YXJhdCBBd2FsOiBJbnRlcnByZXRhc2kgdXRhbWEgZGFyaSB2aWRlbyBpbmkgYWRhbGFoIGJhaHdhIGtpdGEgdGlkYWsgYm9sZWggc2VtYmFyYW5nYW4gbWVuZ2d1bmFrYW4gcnVtdXMgc3RhdGlzdGlrLiBTZWJlbHVtIG1lbmdndW5ha2FuIHJ1bXVzIGJpbm9taWFsLCBraXRhIHdhamliIG1lbXZlcmlmaWthc2kgNCBzeWFyYXQgdXRhbWFueWEgKHRlcnV0YW1hIGluZGVwZW5kZW5zaSBkYW4gcGVsdWFuZyBrb25zdGFuKS4gQ29udG9oIGtlbGVyZW5nICJkZW5nYW4gcGVuZ2VtYmFsaWFuIiBzYW5nYXQga3J1c2lhbDsgamlrYSBrZWxlcmVuZyB0aWRhayBkaWtlbWJhbGlrYW4sIG1vZGVsIG1hdGVtYXRpa2FueWEgYWthbiBiZXJ1YmFoIHRvdGFsLg0KDQoqIFRyYW5zaXNpIGRhcmkgTWFudWFsIGtlIEFic3RyYWs6IFZpZGVvIG1lbmdhamFya2FuIHBvbGEgcGlraXIgbG9naXMuIFBlbm9udG9uIGRpYWphayBtZWxpaGF0IHBlcmhpdHVuZ2FuIG1hbnVhbCAoImNhcmEga2FzYXIiKSB0ZXJsZWJpaCBkYWh1bHUgdW50dWsgbWVtYWhhbWkgbG9naWthIGRpIGJhbGlrbnlhIChiYWh3YSBhZGEgYmVyYmFnYWkgdXJ1dGFuIGtlamFkaWFuKSwgYmFydSBrZW11ZGlhbiBkaXBlcmtlbmFsa2FuIHBhZGEgUnVtdXMgQmlub21pYWwgc2ViYWdhaSAiamFsYW4gcGludGFzIiB5YW5nIGVsZWdhbiB1bnR1ayBtZW55ZWxlc2Fpa2FuIG1hc2FsYWggeWFuZyBrb21wbGVrcy4NCg0KKiBBcGxpa2FzaSBOeWF0YTogTWF0ZXJpIGluaSBhZGFsYWggZm9uZGFzaSBiYWdpIHBlbmdhbWJpbGFuIGtlcHV0dXNhbiBiZXJiYXNpcyBkYXRhLCBzZXBlcnRpIHF1YWxpdHkgY29udHJvbCBkaSBwYWJyaWsgKHBlbHVhbmcgcHJvZHVrIGNhY2F0IHZzIGJhZ3VzKSBhdGF1IHByZWRpa3NpIHBlcmlsYWt1IGtvbnN1bWVuLCBzZWxhbWEga29uZGlzaW55YSBtZW1lbnVoaSBzeWFyYXQgYmluZXIgKHN1a3Nlcy9nYWdhbCkuDQoNCiMjIFBlbmdlcnRpYW4gZGFuIFBlbmdhdHVyYW4gQmlub21pYWwgKFRoZSBCaW5vbWlhbCBTZXR0aW5nKQ0KDQoqKkFzYWwgS2F0YToqKiBJc3RpbGFoICJCaW5vbWlhbCIgbWVuZ2d1bmFrYW4gYXdhbGFuICJCaSIgeWFuZyBiZXJhcnRpIGR1YSwgbWlyaXAgc2VwZXJ0aSBiaWN5Y2xlIChkdWEgcm9kYSkgYXRhdSBiaW5vY3VsYXJzIChkdWEgbGVuc2EpLiBEYWxhbSBwcm9iYWJpbGl0YXMsIGluaSBtZXJ1anVrIHBhZGEgZWtzcGVyaW1lbiB5YW5nIG1lbWlsaWtpIGR1YSBoYXNpbDogc3Vrc2VzIGF0YXUgZ2FnYWwuDQoNCioqNCBTeWFyYXQgS29uZGlzaSBCaW5vbWlhbDoqKiBBZ2FyIHNlYnVhaCBla3NwZXJpbWVuIGRpc2VidXQgZWtzcGVyaW1lbiBiaW5vbWlhbCwgaGFydXMgbWVtZW51aGkgZW1wYXQgc3lhcmF0IGJlcmlrdXQ6DQoNCiogSnVtbGFoIHBlcmNvYmFhbiAodHJpYWxzKSBoYXJ1cyB0ZXRhcCBhdGF1IGRpdGVudHVrYW4gKG4pLg0KKiBIYW55YSBhZGEgZHVhIGtlbXVuZ2tpbmFuIGhhc2lsIHVudHVrIHNldGlhcCBwZXJjb2JhYW4gKFN1a3NlcyBhdGF1IEdhZ2FsKS4NCiogUGVsdWFuZyBzdWtzZXMgaGFydXMga29uc3Rhbi90ZXRhcCBkaSBzZXRpYXAgcGVyY29iYWFuLg0KKiBTZXRpYXAgcGVyY29iYWFuIGhhcnVzIGluZGVwZW5kZW4gKGhhc2lsIHNhdHUgcGVyY29iYWFuIHRpZGFrIG1lbWVuZ2FydWhpIHlhbmcgbGFpbikuDQoNCiMjIENvbnRvaCBLYXN1cw0KDQojIyMgUGVsZW1wYXJhbiBLb2luDQoNCioqU2tlbmFyaW86KiogTWVsZW1wYXIga29pbiAzIGthbGkgZGFuIG1lbmNhcmkgcGVsdWFuZyBtZW5kYXBhdGthbiB0ZXBhdCBzYXR1IGthbGkgZ2FtYmFyICJLZXBhbGEiIChIZWFkcykuDQoNCioqQW5hbGlzaXMgTWFudWFsOioqVGVyZGFwYXQgMyBjYXJhIHVudHVrIG1lbmRhcGF0a2FuIDEgS2VwYWxhOiAoS2VwYWxhLUVrb3ItRWtvciksIChFa29yLUtlcGFsYS1Fa29yKSwgKEVrb3ItRWtvci1LZXBhbGEpLg0KDQpQZWx1YW5nIHNldGlhcCB1cnV0YW4gZGloaXR1bmcgZGVuZ2FuIG1lbmdhbGlrYW4gcHJvYmFiaWxpdGFzIG1hc2luZy1tYXNpbmcgKDAuNSB4IDAuNSB4IDAuNSA9IDAuMTI1KS5Ub3RhbCBwZWx1YW5nIGFkYWxhaCBwZW5qdW1sYWhhbiBkYXJpIGtldGlnYSBrZW11bmdraW5hbiB0ZXJzZWJ1dDogMC4xMjUgKyAwLjEyNSArIDAuMTI1ID0gMC4zNzUuDQoNCioqVmVyaWZpa2FzaSBTeWFyYXQ6KiogS2FzdXMgaW5pIG1lbWVudWhpIDQgc3lhcmF0IGJpbm9taWFsOiBqdW1sYWggbGVtcGFyYW4gdGV0YXAgKDMpLCBoYXNpbCBoYW55YSBLZXBhbGEvRWtvciwgcGVsdWFuZyB0ZXRhcCAoMC41KSwgZGFuIGxlbXBhcmFuIGJlcnNpZmF0IGluZGVwZW5kZW4uDQoNCiMjIyBQZW5nYW1iaWxhbiBLZWxlcmVuZyAoRGVuZ2FuIFBlbmdlbWJhbGlhbikNCg0KKipTa2VuYXJpbzoqKiBTZWJ1YWgga290YWsgYmVyaXNpIDEwIGtlbGVyZW5nICgzIG1lcmFoIG11ZGEsIDIgaGlqYXUsIDUgYmlydSkuIE1lbmdhbWJpbCA1IGtlbGVyZW5nIGRlbmdhbiBwZW5nZW1iYWxpYW4gKHJlcGxhY2VtZW50KS4gRGljYXJpIHBlbHVhbmcgbWVuZGFwYXRrYW4gdGVwYXQgMiBrZWxlcmVuZyBoaWphdS4NCg0KKipBbmFsaXNpcyBTeWFyYXQ6KioNClBlbnRpbmcgZGljYXRhdCBiYWh3YSBwZW5nYW1iaWxhbiBkaWxha3VrYW4gZGVuZ2FuIHBlbmdlbWJhbGlhbi4gSmlrYSB0aWRhayBkaWtlbWJhbGlrYW4sIHBlbHVhbmcgYWthbiBiZXJ1YmFoIGRhbiBzeWFyYXQgInBlbHVhbmcga29uc3RhbiIgc2VydGEgImluZGVwZW5kZW4iIGFrYW4gZ2FnYWwsIHNlaGluZ2dhIHRpZGFrIGJpc2EgZGlzZWJ1dCBla3NwZXJpbWVuIGJpbm9taWFsLg0KU3Vrc2VzID0gRGFwYXQgSGlqYXUgKDIvMTAgPSAwLjIpLiBHYWdhbCA9IEJ1a2FuIEhpamF1ICg4LzEwID0gMC44KS4NCg0KKipQZXJoaXR1bmdhbjoqKiBUZXJkYXBhdCAxMCBrb21iaW5hc2kgdXJ1dGFuIGJlcmJlZGEgdW50dWsgbWVuZGFwYXRrYW4gMiBzdWtzZXMgZGFuIDMgZ2FnYWwuIEhhc2lsIGFraGlybnlhIGFkYWxhaCAwLjIwNDguDQoNCiMjIyBSdW11cyBCaW5vbWlhbCAoVGhlIEJpbm9taWFsIEZvcm11bGEpDQoNClVudHVrIG1lbmdoaW5kYXJpIHBlcmhpdHVuZ2FuIG1hbnVhbCB5YW5nIHBhbmphbmcgc2VwZXJ0aSBkaSBhdGFzLCBkaWd1bmFrYW4gcnVtdXMgYmlub21pYWw6DQoNCiQkUChrKSA9IFxiaW5vbXtufXtrfSBcY2RvdCBwXmsgXGNkb3QgKDEtcClee24ta30kJA0KDQoqKktldGVyYW5nYW4gVmFyaWFiZWw6KioNCg0KKiBuID0gSnVtbGFoIHBlcmNvYmFhbiAodHJpYWxzKS4NCiogayA9IEp1bWxhaCBzdWtzZXMgeWFuZyBkaWluZ2lua2FuLg0KKiBwID0gUGVsdWFuZyBzdWtzZXMuDQoqICRcYmlub217bn17a30kID0gUnVtdXMga29tYmluYXNpIChuIGNob29zZSBrKS4NCg0KKipQZW5lcmFwYW46KiogRGFsYW0ga2FzdXMga2VsZXJlbmcgdGFkaSwgbj01LCBrPTIsIGRhbiBwPTAuMi4gRGVuZ2FuIG1lbWFzdWtrYW4gYW5na2Ega2UgcnVtdXMsIGRpZGFwYXRrYW4gaGFzaWwgeWFuZyBzYW1hIHBlcnNpcyB5YWl0dSAwLjIwNDgsIG5hbXVuIGRlbmdhbiBjYXJhIHlhbmcgamF1aCBsZWJpaCBjZXBhdC4NCg0KIyBCaW5vbWlhbCBEaXN0cmlidXRpb24NCg0KVmlkZW8gaW5pIGFkYWxhaCBrZWxhbmp1dGFuIGRhcmkgbWF0ZXJpIHNlYmVsdW1ueWEgdGVudGFuZyBEaXN0cmlidXNpIEJpbm9taWFsLiBKaWthIGRpIHZpZGVvIHBlcnRhbWEga2l0YSBiZWxhamFyIGNhcmEgbWVuZ2hpdHVuZyBwcm9iYWJpbGl0YXMgaW5kaXZpZHUsIHZpZGVvIGluaSBmb2t1cyBwYWRhIFZpc3VhbGlzYXNpIERpc3RyaWJ1c2kgQmlub21pYWwuIE1hdGVyaSBpbmkgc2FuZ2F0IHBlbnRpbmcgdW50dWsgbWVtYWhhbWkgYmFnYWltYW5hIHNlYmFyYW4gZGF0YSBiZXJ1YmFoIGtldGlrYSBqdW1sYWggcGVyY29iYWFuIChuKSBhdGF1IHBlbHVhbmcgc3Vrc2VzIChwKSBkaXViYWguIFZpZGVvIGluaSBqdWdhIG1lbmplbWJhdGFuaSBodWJ1bmdhbiBwZW50aW5nIGFudGFyYSBEaXN0cmlidXNpIEJpbm9taWFsIGRhbiBEaXN0cmlidXNpIE5vcm1hbCwgc2VydGEgbWVtcGVya2VuYWxrYW4gcnVtdXMgdW50dWsgbWVuZ2hpdHVuZyBwYXJhbWV0ZXIgdXRhbWEgc2VwZXJ0aSByYXRhLXJhdGEgKG1lYW4pIGRhbiBzdGFuZGFyIGRldmlhc2kgZGFsYW0ga29udGVrcyBiaW5vbWlhbC4NCg0KPGNlbnRlcj4NCjxpZnJhbWUgc3JjPSJodHRwczovL3d3dy55b3V0dWJlLmNvbS9lbWJlZC9ZMi12U1dGbWd5SSIgd2lkdGg9IjYwMCIgaGVpZ2h0PSIzNjAiIHdpZHRoPSI3NjgiIGhlaWdodD0iNDAwcHgiIGRhdGEtZXh0ZXJuYWw9IjEiPiA8L2lmcmFtZT4NCjwvY2VudGVyPg0KDQojIyBJbnRlcnByZXRhc2kNCg0KVmlkZW8gaW5pIG1lbWJlcmlrYW4gd2F3YXNhbiB2aXN1YWwgeWFuZyBrcnVzaWFsIGJhZ2kgcGVtYWhhbWFuIHN0YXRpc3Rpa2E6DQoNCiogSHVrdW0gQmlsYW5nYW4gQmVzYXI6IFZpZGVvIGluaSBzZWNhcmEgaW1wbGlzaXQgbWVuZGVtb25zdHJhc2lrYW4ga29uc2VwIENlbnRyYWwgTGltaXQgVGhlb3JlbS4gS2l0YSBiaXNhIG1lbGloYXQgc2VuZGlyaSBiYWh3YSBkZW5nYW4gbWVuaW5na2F0a2FuIGp1bWxhaCBzYW1wZWwvcGVyY29iYWFuIChuKSwgZGF0YSB5YW5nIGF3YWxueWEgImthc2FyIiBhdGF1ICJtaXJpbmciIHBlcmxhaGFuLWxhaGFuIG1lbmphZGkga3VydmEgbG9uY2VuZyB5YW5nIGhhbHVzIChub3JtYWwpLiBJbmkgYWRhbGFoIGFsYXNhbiBtZW5nYXBhIERpc3RyaWJ1c2kgTm9ybWFsIHNhbmdhdCBkb21pbmFuIGRhbGFtIHN0YXRpc3Rpay4NCg0KKiBQcmVkaWtzaSBQZXJpbGFrdSBEYXRhOiBEZW5nYW4gbWVtYWhhbWkgcGVyYW4gcCwga2l0YSBiaXNhIG1lbXByZWRpa3NpIGJlbnR1ayBkYXRhIHRhbnBhIG1lbmdoaXR1bmcgc2F0dSBwZXIgc2F0dS4gSmlrYSBraXRhIHRhaHUgdWppYW4gaXR1IHNhbmdhdCBzdXNhaCAocCBrZWx1bHVzYW4gcmVuZGFoKSwga2l0YSBzdWRhaCB0YWh1IGdyYWZpa255YSBha2FuIG1pcmluZyBrZSBrYW5hbiAoYmFueWFrIG5pbGFpIHJlbmRhaCkuDQoNCiogSmVtYmF0YW4gQW50YXIgRGlzdHJpYnVzaTogUnVtdXMgc3lhcmF0IG5wIFxnZXEgMTAgYWRhbGFoICJqZW1iYXRhbiIgcGVudGluZy4gSW5pIG1lbWJlcml0YWh1IGtpdGEga2FwYW4gYm9sZWggbWVuZ2d1bmFrYW4gbWV0b2RlIHN0YXRpc3RpayBub3JtYWwgKHlhbmcgbGViaWggbXVkYWggdW50dWsgc2FtcGVsIGJlc2FyKSB1bnR1ayBtZW5hbmdhbmkga2FzdXMgYmlub21pYWwsIG1lbmdoZW1hdCB3YWt0dSBwZXJoaXR1bmdhbiB5YW5nIGtvbXBsZWtzLg0KDQojIyBNZW5pbmphdSBLZW1iYWxpIFJ1bXVzICYgTWVtYnVhdCBHcmFmaWsgRGFzYXINCg0KKipTdHVkaSBLYXN1czoqKiBNZWxlbXBhciBrb2luIDIga2FsaSAobj0yKSBkZW5nYW4gcGVsdWFuZyBzdWtzZXMva2VwYWxhIDAuNSAocD0wLjUpLg0KDQoqKkhhc2lsIFBlcmhpdHVuZ2FuOioqDQoNCiogMCBTdWtzZXM6IDAuMjUNCiogMSBTdWtzZXM6IDAuNTANCiogMiBTdWtzZXM6IDAuMjUNCg0KKipWaXN1YWxpc2FzaToqKiBEYXRhIGluaSBkaXBsb3Qga2UgZGFsYW0gZGlhZ3JhbSBiYXRhbmcgKEJhciBDaGFydCkuIFN1bWJ1IFggYmVyaXNpIGp1bWxhaCBzdWtzZXMgKGs6IDAsIDEsIDIpIGRhbiBzdW1idSBZIGJlcmlzaSBwcm9iYWJpbGl0YXNueWEuIEhhc2lsbnlhIG1lbWJlbnR1ayBwb2xhIHNpbWV0cmlzIGRlbmdhbiBwdW5jYWsgZGkgdGVuZ2FoIChrPTEpLg0KDQojIyBQZW5nYXJ1aCBKdW1sYWggUGVyY29iYWFuIChuKSB0ZXJoYWRhcCBCZW50dWsgR3JhZmlrDQoNCktldGlrYSBqdW1sYWggcGVyY29iYWFuIGRpdGluZ2thdGthbiBkYXJpIG49MiBtZW5qYWRpIG49MTAgKHRldGFwIGRlbmdhbiBwPTAuNSksIGJlbnR1ayBkaWFncmFtIGJhdGFuZyBtdWxhaSBtZW55ZXJ1cGFpIGxvbmNlbmcgYXRhdSBEaXN0cmlidXNpIE5vcm1hbC4NClB1bmNhayBkYXRhIChyYXRhLXJhdGEpIGJlcmFkYSB0ZXBhdCBkaSB0ZW5nYWgsIHlhaXR1IGRpIGFuZ2thIDUuDQoNCiMjIFJ1bXVzIFBhcmFtZXRlciBEaXN0cmlidXNpIEJpbm9taWFsDQoNClZpZGVvIG1lbWJlcmlrYW4gcnVtdXMgY2VwYXQgdW50dWsgbWVuZ2hpdHVuZyBwYXJhbWV0ZXIgc3RhdGlzdGlrIGppa2EgdmFyaWFiZWwgeCBtZW5naWt1dGkgZGlzdHJpYnVzaSBiaW5vbWlhbDoNCg0KKiBSYXRhLXJhdGEgJChNZWFuL1xtdSk6IFxtdSQgPSAkbiBcY2RvdCBwJA0KKiBWYXJpYW5zICQoXHNpZ21hXjIpOiBcc2lnbWFeMiQgPSAkbiBcY2RvdCBwIFxjZG90ICgxIC0gcCkkDQoqIFN0YW5kYXIgRGV2aWFzaSAkKFxzaWdtYSk6IFxzaWdtYSQgPSAkXHNxcnR7biBcY2RvdCBwIFxjZG90ICgxIC0gcCl9JA0KDQojIyBQZW5nYXJ1aCBQZWx1YW5nIFN1a3NlcyAocCkgdGVyaGFkYXAgS2VtaXJpbmdhbiAoU2tld25lc3MpDQoNCkJlbnR1ayBncmFmaWsgc2FuZ2F0IGJlcmdhbnR1bmcgcGFkYSBuaWxhaSBwOg0KDQoqIHAgPSAwLjU6IERpc3RyaWJ1c2kgYmVyYmVudHVrIFNpbWV0cmlzIChOb3JtYWwpLg0KKiBwIDwgMC41IChDb250b2ggcD0wLjEpOiBEaXN0cmlidXNpIE1pcmluZyBrZSBLYW5hbiAoU2tld2VkIFJpZ2h0KS4gS2FyZW5hIHBlbHVhbmcgc3Vrc2VzIGtlY2lsLCBkYXRhIG1lbnVtcHVrIGRpIGFuZ2thIG5vbCBhdGF1IG5pbGFpIHN1a3NlcyB5YW5nIHJlbmRhaC4NCiogcCA+IDAuNSAoQ29udG9oIHA9MC44KTogRGlzdHJpYnVzaSBNaXJpbmcga2UgS2lyaSAoU2tld2VkIExlZnQpLiBLYXJlbmEgcGVsdWFuZyBzdWtzZXMgYmVzYXIsIGRhdGEgbWVudW1wdWsgZGkgbmlsYWkgc3Vrc2VzIHlhbmcgdGluZ2dpIChtZW5kZWthdGkgbikuDQoqIEtlc2ltcHVsYW46IERhdGEgYWthbiBzZWxhbHUgYmVya3VtcHVsIGRpIHNla2l0YXIgbmlsYWkgcmF0YS1yYXRhICQoXG11ID0gbiBcY2RvdCBwKSQuDQoNCiMjIEFwcm9rc2ltYXNpIE5vcm1hbCAoTm9ybWFsIEFwcHJveGltYXRpb24pDQoNCiogU2VtYWtpbiBiZXNhciBuaWxhaSBuLCBiZW50dWsgZGlzdHJpYnVzaSBiaW5vbWlhbCBha2FuIHNlbWFraW4gbWVuZGVrYXRpIGRpc3RyaWJ1c2kgbm9ybWFsLCBiYWhrYW4gamlrYSBhd2FsbnlhIG1pcmluZyAoc2tld2VkKS4NCg0KKiBTeWFyYXQgQXR1cmFuIEplbXBvbCAoUnVsZSBvZiBUaHVtYik6IEtpdGEgYm9sZWggbWVuZ2FuZ2dhcCBkaXN0cmlidXNpIGJpbm9taWFsIHNlYmFnYWkgZGlzdHJpYnVzaSBub3JtYWwgamlrYSBrZWR1YSBzeWFyYXQgYmVyaWt1dCB0ZXJwZW51aGk6DQoxLiAkbiBcY2RvdCBwIFxnZXEgMTAkDQoyLiAkbiBcY2RvdCAoMSAtIHApIFxnZXEgMTAkDQooQ2F0YXRhbjogQmViZXJhcGEgYnVrdSBtZW5nZ3VuYWthbiBhbmdrYSBiYXRhcyA1LCBqYWRpIHNlc3VhaWthbiBkZW5nYW4gcmVmZXJlbnNpIHlhbmcgZGlwYWthaSkuDQoNCiMgUmVmZXJlbnNpIGRhbiBrZXNpbXBsYW4NCg0KUHJvYmFiaWxpdGFzIGFkYWxhaCBrb21wb25lbiBlc2Vuc2lhbCBkYWxhbSBkdW5pYSBzdGF0aXN0aWsgZGFuIG1lbWlsaWtpIGFwbGlrYXNpbnlhIGRhbGFtIGJlcmJhZ2FpIGJpZGFuZyBrZWhpZHVwYW4uIE1lbWFoYW1pIGRhc2FyLWRhc2FyIHByb2JhYmlsaXRhcywgdGVybWFzdWsgcnVhbmcgc2FtcGVsLCBwZXJpc3Rpd2EsIGRhbiBhdHVyYW4tYXR1cmFuIGRhc2FyIG1lbXVuZ2tpbmthbiBraXRhIHVudHVrIG1lbWJ1YXQgcHJlZGlrc2kgeWFuZyBsZWJpaCBha3VyYXQgZGFuIG1lbmdhbWJpbCBrZXB1dHVzYW4geWFuZyBsZWJpaCBpbmZvcm1hbi4gQmFpayBkYWxhbSBrb250ZWtzIHBlbmVsaXRpYW4sIGJpc25pcywgbWF1cHVuIGtlaGlkdXBhbiBzZWhhcmktaGFyaSwgcGVtYWhhbWFuIHRlbnRhbmcgcHJvYmFiaWxpdGFzIG1lbWJlcmlrYW4ga2l0YSBhbGF0IHlhbmcga3VhdCB1bnR1ayBtZW5nZWxvbGEga2V0aWRha3Bhc3RpYW4gZGFuIG1lbmdvcHRpbWFsa2FuIGhhc2lsIHlhbmcgZGlpbmdpbmthbi4NCg0KaHR0cHM6Ly9ib29rZG93bi5vcmcvZHNjaWVuY2VsYWJzL2ludHJvX3N0YXRpc3RpY3MvMDYtRXNzZW50aWFsc19vZl9Qcm9iYWJpbGl0eS5odG1sDQoNCmh0dHBzOi8veW91dHUuYmUveW5qSEtCQ2lHWFk/c2k9RFY5ZENTUVR5QUY3THRHNw0KDQpodHRwczovL3lvdXR1LmJlL0xTLV9paERLcjJNP3NpPTFQaUtGMUdrVDNKeC04R18NCg0KaHR0cHM6Ly95b3V0dS5iZS92cUtBYmhDcVNUYz9zaT0wVnFXVmNyNGt6RlVhdXdTDQoNCmh0dHBzOi8veW91dHUuYmUvZjdhZ1R2OW5BNWs/c2k9U2VaZUJNVzJPSDhvbllINQ0KDQpodHRwczovL3lvdXR1LmJlL25SdVFBdGFqSllrP3NpPTI5NUduazFFd1RXaDdiNnYNCg0KaHR0cHM6Ly95b3V0dS5iZS9ZMi12U1dGbWd5ST9zaT1kQXptb2hkSk5hUjVuV1J1DQoNCmh0dHBzOi8vZ3VydW11ZGEubmV0L3N0YXRpc3Rpa2Eva29uc2VwLWRhc2FyLXByb2JhYmlsaXRhcy1kYWxhbS1zdGF0aXN0aWthLmh0bQ0KDQoNCg0KDQo=