UAS Kelompok 3

Statistika Dasar Semester 1

Logo

1 Soal 1. Merangkum Materi

1.1 Definisi dan Konsep Utama

Statistika adalah cabang ilmu yang berkaitan dengan pengumpulan, pengolahan, analisis, interpretasi, dan penyajian data untuk memperoleh informasi yang berguna dalam pengambilan keputusan atau memahami suatu fenomena. Statistika digunakan untuk mengidentifikasi pola, hubungan, atau tren dalam data serta membuat prediksi berdasarkan data tersebut. Statistika memiliki 2 jenis, yaitu Statistika Deskriptif dan Statistika Inferensial. Statistika Deskriptif memberikan gambaran umum tentang data, sedangkan Statistika Inferensial memungkinkan penarikan kesimpulan dan pembuatan keputusan berdasarkan data. Berikut tabel perbedaan antara Statistika Deskriptif dengan Statistika Inferensial:

Aspek Statistika Deskriptif Statistika Inferensial
Pengertian Meringkas dan menyajikan data dalam bentuk yang lebih mudah dipahami. Membuat kesimpulan atau generalisasi tentang populasi berdasarkan data sampel.
Lingkup Analisis Hanya berfokus pada data yang ada. Melibatkan analisis data sampel untuk mewakili populasi.
Tujuan Menggambarkan pola atau karakteristik data. Menarik kesimpulan dan membuat prediksi tentang populasi.
Metode Utama - Penyajian data (tabel, diagram, grafik).
- Ukuran tendensi sentral (mean, median, modus).
- Ukuran dispersi (varians, standar deviasi).
- Pengujian hipotesis.
- Estimasi parameter populasi.
- Analisis regresi dan korelasi.
-Uji statistik (t-test, chi-square, ANOVA).
Hasil Analisis Informasi yang jelas dan mudah dipahami tanpa membuat kesimpulan lebih lanjut. Kesimpulan atau keputusan yang didasarkan pada analisis data sampel.
Contoh “Rata-rata tinggi siswa adalah 165 cm, dengan standar deviasi 5 cm.” “Berdasarkan sampel, diperkirakan rata-rata tinggi seluruh siswa adalah 163–167 cm.”

Dalam statistika, jenis data yang digunakan yaitu: data numerik dan data kategorik. Data numerik adalah data yang berupa angka dan dapat diukur atau dihitung. Sementara itu, data kategorik adalah data yang berbentuk kategori atau label yang tidak memiliki nilai numerik. Berikut tabel perbedaan antara data numerik dan data kategorik:

Aspek Data Numerik Data Kategorikal
Definisi Data yang berupa angka dan menunjukkan ukuran atau jumlah. Data yang berupa kategori atau label tanpa nilai numerik yang bermakna.
Jenis - Diskrit: Nilai terbatas (contoh: jumlah anak).
- Kontinu: Nilai dalam rentang tertentu (contoh: berat badan).
- Nominal: Tidak memiliki urutan (contoh: jenis kelamin).
- Ordinal: Memiliki urutan (contoh: tingkat pendidikan).
Contoh Berat badan (kg), tinggi badan (cm), jumlah kendaraan. Jenis kelamin (laki-laki/perempuan), warna favorit (merah/biru).
Sifat Data Dapat dilakukan operasi matematis seperti penjumlahan, pengurangan, rata-rata. Tidak dapat dilakukan operasi matematis, hanya digunakan untuk pengelompokan.
Tujuan Penggunaan Untuk mengukur kuantitas atau besaran suatu variabel. Untuk mengidentifikasi atau mengelompokkan objek berdasarkan kategori.
Representasi Biasanya dalam bentuk angka. Biasanya dalam bentuk teks atau kode numerik tanpa arti matematis.

1.2 Ukuran Pemusatan dan Penyebaran

1.2.1 Mean (Rata-rata)

Mean adalah jumlah total semua nilai dibagi dengan jumlah data.

Kapan penggunaan mean menjadi kurang tepat?

  • Saat data memiliki outlier, karena outlier dapat menyebabkan rata-rata menjadi tidak representatif.

Contoh: Jika pendapatan di suatu wilayah rata-rata adalah 5 juta, tetapi ada satu orang yang berpenghasilan 100 juta, rata-rata pendapatan akan naik drastis.

1.2.2 Median

Median adalah nilai tengah dari data yang telah diurutkan.

Mengapa median sering digunakan untuk data dengan outlier?

  • Median sering digunakan untuk data yang memiliki outlier karena median lebih robust atau tahan terhadap pengaruh nilai ekstrem dibandingkan rata-rata (mean). Hal ini dikarenakan median tidak terpengaruh oleh nilai ekstrem, median mewakili data secara lebih akurat, dan median lebih stabil pada data asimetriks

Contoh: Harga rumah di suatu wilayah lebih tepat diwakili oleh median daripada mean jika ada beberapa rumah yang harganya jauh lebih tinggi.

1.2.3 Modus

Modus adalah nilai yang paling sering muncul dalam dataset.

Kapan ukuran ini lebih relevan daripada mean atau median?

  • Modus lebih relevan digunakan dalam analisis data kategorikal, ketika fokusnya adalah menentukan elemen yang paling sering muncul, seperti warna favorit atau produk terlaris. Selain itu, modus sangat berguna dalam data dengan distribusi multimodal untuk mengidentifikasi nilai-nilai dominan, serta dalam data diskrit dengan jumlah nilai terbatas. Modus juga menjadi pilihan tepat jika mean atau median tidak mewakili data dengan baik, terutama dalam situasi di mana nilai frekuensi dominan memiliki makna yang lebih signifikan dibandingkan rata-rata atau nilai tengah.

1.2.4 Standar Deviasi

Standar Deviasi untuk Mengukur penyebaran data dari rata-rata.

Apa arti dari nilai standar deviasi kecil atau besar dalam sebuah dataset?

  • Kecil:

Data cenderung berdekatan dengan rata-rata, menunjukkan konsistensi atau homogenitas dalam nilai-nilai data. Contoh: Dalam ujian, jika nilai rata-rata adalah 80 dan standar deviasi kecil (misalnya, 2), ini menunjukkan sebagian besar siswa mendapatkan nilai mendekati 80.

  • Besar:

Data memiliki penyebaran yang luas dari rata-rata, menunjukkan adanya variasi atau heterogenitas yang signifikan dalam nilai-nilai data. Contoh: Jika rata-rata nilai ujian adalah 80 dengan standar deviasi besar (misalnya, 15), ini menunjukkan sebagian siswa mendapat nilai sangat tinggi (misalnya, 95), sementara yang lain mendapat nilai sangat rendah (misalnya, 65).

1.3 Visualisasi Data

1.3.1 Histogram:

Definisi: Grafik yang digunakan untuk menunjukkan distribusi frekuensi data numerik. Data dikelompokkan ke dalam interval (bin).

Tujuan: Memahami pola distribusi (normal, miring, bimodal, dll.).

Contoh: Menampilkan distribusi tinggi badan siswa di sebuah sekolah.

1.3.2 Boxplot:

Definisi: Diagram yang menggambarkan persebaran data berdasarkan kuartil (Q1, median, Q3) dan outlier.

Tujuan: Mengidentifikasi penyebaran data, nilai ekstrim (outlier), dan posisi nilai tengah (median).

Contoh: Menunjukkan penyebaran nilai ujian siswa dan nilai-nilai yang ekstrem.

1.3.3 Diagram Batang (Bar Chart):

Definisi: Grafik dengan batang vertikal atau horizontal untuk membandingkan data kategorik. Panjang batang menunjukkan frekuensi atau jumlah.

Tujuan: Membandingkan data antar kategori.

Contoh: Membandingkan jumlah mobil berdasarkan jenis transmisi (manual vs otomatis).

1.4 Analisis Korelasi

Korelasi adalah teknik statistika yang digunakan untuk mengukur dan menggambarkan hubungan antara dua variabel. Dalam analisis korelasi, kita berusaha untuk memahami apakah perubahan pada satu variabel berhubungan dengan perubahan pada variabel lainnya. Korelasi tidak menunjukkan sebab-akibat, tetapi hanya hubungan antara variabel. Korelasi memiliki 3 jenis, yaitu: Korelasi Positif, Korelasi Negatif, dan Korelasi Nol.

1.4.1 Korelasi Positif

  • Definisi: Korelasi positif terjadi ketika dua variabel bergerak dalam arah yang sama. Ini berarti bahwa ketika satu variabel meningkat, variabel lainnya juga cenderung meningkat. Sebaliknya, jika satu variabel menurun, variabel lainnya juga cenderung menurun.

  • Koefisien Korelasi: Nilai koefisien korelasi (r) berkisar antara 0 hingga 1. Semakin mendekati 1, semakin kuat hubungan positifnya.

  • Contoh: Jam Belajar dan Nilai Ujian: Misalkan kita mengumpulkan data dari sekelompok siswa tentang berapa banyak jam yang mereka habiskan untuk belajar dan nilai ujian yang mereka peroleh. Jika kita menemukan bahwa siswa yang belajar lebih banyak cenderung mendapatkan nilai yang lebih tinggi, maka kita dapat mengatakan ada korelasi positif antara jam belajar dan nilai ujian.

  • Contoh Visual: Grafik scatter plot yang menunjukkan titik-titik data yang membentuk garis naik dari kiri bawah ke kanan atas.

1.4.2 Korelasi Negatif

  • Definisi: Korelasi negatif terjadi ketika dua variabel bergerak dalam arah yang berlawanan. Ini berarti bahwa ketika satu variabel meningkat, variabel lainnya cenderung menurun.

  • Koefisien Korelasi: Nilai koefisien korelasi (r) berkisar antara -1 hingga 0. Semakin mendekati -1, semakin kuat hubungan negatifnya.

  • Contoh: Jam Menonton TV dan Nilai Ujian: Jika kita mengumpulkan data tentang berapa banyak waktu yang dihabiskan siswa untuk menonton TV dan nilai ujian mereka, dan menemukan bahwa siswa yang menghabiskan lebih banyak waktu menonton TV cenderung mendapatkan nilai yang lebih rendah, maka kita dapat mengatakan ada korelasi negatif antara jam menonton TV dan nilai ujian.

  • Contoh Visual: Grafik scatter plot yang menunjukkan titik-titik data yang membentuk garis turun dari kiri atas ke kanan bawah.

1.4.3 Korelasi Nol

  • Definisi: Korelasi nol terjadi ketika tidak ada hubungan yang signifikan antara dua variabel. Ini berarti bahwa perubahan pada satu variabel tidak mempengaruhi variabel lainnya.

  • Koefisien Korelasi: Nilai koefisien korelasi (r) mendekati 0, menunjukkan bahwa tidak ada pola yang jelas dalam hubungan antara kedua variabel.

  • Contoh: Tinggi Badan dan Skor Ujian Matematika: Jika kita mengumpulkan data tentang tinggi badan siswa dan skor ujian matematika mereka, dan tidak menemukan pola yang jelas, kita dapat mengatakan bahwa tidak ada korelasi antara tinggi badan dan kemampuan matematika.

  • Contoh Visual: Grafik scatter plot yang menunjukkan titik-titik data yang tersebar tanpa pola yang jelas.

Untuk lebih singkatnya, dapat melihat tabel perbedaan antara Korelasi Positif, Korelasi Negatif, dan Korelasi Nol:

Aspek Korelasi Positif Korelasi Negatif Korelasi Nol
Definisi Hubungan di mana jika satu variabel meningkat, variabel lain juga meningkat. Hubungan di mana jika satu variabel meningkat, variabel lain menurun. Tidak ada hubungan antara dua variabel.
Arah Hubungan Sejalan (positif). Berlawanan (negatif). Tidak ada pola hubungan yang jelas.
Koefisien Korelasi Antara \(0\) dan \(+1\). Antara \(0\) dan \(-1\). \(0\).
Contoh - Tinggi badan dan berat badan.
- Pendidikan dan penghasilan.
- Harga barang dan jumlah pembelian.
- Jarak tempuh dan sisa bahan bakar.
- Tinggi badan dan skor ujian.
- Warna favorit dan penghasilan.
Interpretasi Grafik Titik-titik data pada grafik cenderung naik bersama-sama. Titik-titik data pada grafik cenderung bergerak berlawanan arah. Titik-titik data tersebar acak tanpa pola tertentu.

1.5 Uji Hipotesis

Uji hipotesis adalah metode statistika yang digunakan untuk menguji asumsi atau klaim tentang parameter populasi berdasarkan data sampel. Proses ini melibatkan beberapa langkah yang sistematis untuk memastikan bahwa kesimpulan yang diambil adalah valid dan dapat diandalkan.

1.5.1 Langkah-Langkah Utama dalam Melakukan Uji Hipotesis

1.5.1.1 Merumuskan Hipotesis:

  • Hipotesis Nol (H0): Ini adalah pernyataan yang menyatakan tidak ada efek atau tidak ada perbedaan. H0 biasanya mencakup asumsi bahwa parameter populasi sama dengan nilai tertentu (misalnya, rata-rata populasi = 50).
  • Hipotesis Alternatif (H1 atau Ha): Ini adalah pernyataan yang menyatakan adanya efek atau perbedaan. H1 adalah kebalikan dari H0 dan mencakup asumsi bahwa parameter populasi tidak sama dengan nilai tertentu (misalnya, rata-rata populasi ≠ 50).

1.5.1.2 Menetapkan Tingkat Signifikan (α):

Tingkat signifikan adalah probabilitas untuk menolak hipotesis nol ketika hipotesis nol itu benar. Umumnya, nilai α yang digunakan adalah 0,05 (5%) atau 0,01 (1%). Ini berarti bahwa kita bersedia menerima risiko 5% atau 1% untuk membuat kesalahan tipe I (menolak H0 yang benar).

1.5.1.3 Mengumpulkan Data dan Melakukan Uji Statistik:

Kumpulkan data yang relevan dari sampel yang dipilih. Setelah itu, pilih uji statistik yang sesuai (misalnya, uji t, uji z, uji chi-square) berdasarkan jenis data dan hipotesis yang diuji. Hitung nilai statistik uji berdasarkan data yang dikumpulkan.

1.5.1.4 Menentukan Nilai Kritis dan Menghitung P-Value:

  • Nilai Kritis: Tentukan batasan nilai statistik uji yang akan digunakan untuk menolak H0. Ini biasanya ditentukan berdasarkan distribusi statistik yang relevan (misalnya, distribusi normal atau t).
  • P-Value: Hitung p-value, yaitu probabilitas mendapatkan hasil yang sama atau lebih ekstrem dari yang diamati, jika H0 benar. P-value digunakan untuk menentukan signifikansi hasil.

1.5.1.5 Membuat Keputusan:

  • Bandingkan p-value dengan tingkat signifikan (α):
  • Jika p-value ≤ α, tolak H0 (ada cukup bukti untuk mendukung H1).
  • Jika p-value > α, gagal menolak H0 (tidak ada cukup bukti untuk mendukung H1).
  • Alternatifnya, bandingkan nilai statistik uji dengan nilai kritis:
  • Jika nilai statistik uji berada di luar batas nilai kritis, tolak H0.
  • Jika nilai statistik uji berada dalam batas nilai kritis, gagal menolak H0.

1.5.1.6 Menyimpulkan Hasil:

Buat kesimpulan berdasarkan keputusan yang diambil. Jelaskan apa arti hasil tersebut dalam konteks penelitian atau analisis yang dilakukan. Misalnya, jika H0 ditolak, Anda dapat menyatakan bahwa ada bukti yang cukup untuk mendukung hipotesis alternatif.

1.5.2 Mengapa Uji Hipotesis Penting dalam Analisis Data?

Uji hipotesis penting dalam analisis data karena membantu menentukan apakah suatu hasil atau temuan dari data dapat dijelaskan oleh kebetulan atau memiliki dasar yang signifikan secara statistik. Uji hipotesis penting karena memberikan metode yang sistematis dan obyektif untuk menganalisis data, mengurangi risiko kesalahan dalam pengambilan keputusan, dan mendukung pengambilan kesimpulan yang valid dan terpercaya. Hal ini menjadikannya esensial dalam penelitian dan analisis data di berbagai bidang. Alasan-alasan lainnya adalah sebagai berikut:

1.5.2.1 Pengambilan Keputusan yang Berbasis Data

Uji hipotesis memberikan kerangka kerja yang sistematis untuk membuat keputusan berdasarkan data. Ini membantu peneliti dan pengambil keputusan untuk menghindari kesalahan yang mungkin terjadi jika keputusan diambil berdasarkan asumsi atau intuisi semata.

1.5.2.2 Validasi Klaim

Uji hipotesis memungkinkan peneliti untuk menguji klaim atau teori yang ada. Dengan melakukan uji hipotesis, peneliti dapat menentukan apakah ada cukup bukti untuk mendukung atau menolak klaim tersebut.

1.5.2.3 Mengurangi Bias

Dengan menggunakan metode yang terstandarisasi, uji hipotesis membantu mengurangi bias dalam analisis data. Ini memastikan bahwa keputusan yang diambil didasarkan pada analisis yang objektif dan tidak dipengaruhi oleh preferensi pribadi.

1.5.2.4 Menentukan Signifikansi

Uji hipotesis membantu dalam menentukan apakah hasil yang diperoleh dari sampel dapat digeneralisasikan ke populasi yang lebih besar. Ini penting dalam penelitian ilmiah dan aplikasi praktis di berbagai bidang, seperti kesehatan, ekonomi, dan ilmu sosial.

1.5.2.5 Dasar untuk Analisis Lanjutan

Hasil dari uji hipotesis sering kali menjadi dasar untuk analisis lebih lanjut, seperti analisis regresi atau model prediktif. Ini membantu dalam memahami hubungan yang lebih kompleks antara variabel.

1.6 Penggunaan Software Statistika

Dalam analisis statistika, terdapat berbagai perangkat lunak dan tools yang dapat digunakan untuk mengolah dan menganalisis data. Berikut adalah beberapa perangkat lunak yang umum digunakan dalam analisis statistika:

1.6.1 R

Deskripsi: R adalah bahasa pemrograman dan lingkungan perangkat lunak untuk analisis statistika dan grafik. • Keunggulan: Sangat fleksibel, memiliki banyak paket untuk analisis lanjutan, dan gratis.

1.6.2 Microsoft Excel

Deskripsi: Salah satu aplikasi spreadsheet yang paling populer, Excel memiliki berbagai fungsi statistik dan alat analisis data. • Keunggulan: Mudah digunakan, antarmuka yang intuitif, dan banyak tersedia tutorial.

1.6.3 Python

Deskripsi: Python adalah bahasa pemrograman yang populer dengan banyak pustaka untuk analisis data, seperti Pandas, NumPy, dan SciPy. • Keunggulan: Mudah dipelajari, banyak digunakan dalam ilmu data, dan memiliki komunitas yang besar.

1.6.4 SPSS (Statistical Package for the Social Sciences)

Deskripsi: SPSS adalah perangkat lunak yang dirancang untuk analisis statistik, terutama dalam ilmu sosial. • Keunggulan: Antarmuka grafis yang ramah pengguna dan banyak fungsi statistik yang siap pakai.

1.6.5 SAS (Statistical Analysis System)

Deskripsi: SAS adalah perangkat lunak yang digunakan untuk analisis data, manajemen data, dan analisis prediktif. • Keunggulan: Kuat dalam analisis data besar dan memiliki banyak fitur untuk analisis lanjutan.

1.6.6 Stata

Deskripsi: Stata adalah perangkat lunak yang digunakan untuk analisis data, manajemen data, dan grafik. • Keunggulan: Sangat baik untuk analisis data panel dan memiliki banyak fungsi untuk analisis ekonometrika.

1.6.7 MATLAB

Deskripsi: MATLAB adalah bahasa pemrograman dan lingkungan untuk komputasi numerik dan visualisasi data. • Keunggulan: Kuat dalam analisis matematis dan pemodelan.

1.6.8 Keunggulan R sebagai Software Pilihan

Kami akan memfokuskan pada R. Jadi R memiliki banyak keunggulan, seperti:

  • Open Source dan Gratis: R adalah perangkat lunak open source, yang berarti dapat diunduh dan digunakan secara gratis. Ini membuatnya sangat menarik bagi mahasiswa, peneliti, dan profesional yang tidak ingin mengeluarkan biaya untuk perangkat lunak berlisensi.

  • Fleksibilitas dan Ekstensibilitas: R memiliki banyak paket (libraries) yang dapat diinstal untuk melakukan berbagai analisis statistik, mulai dari analisis deskriptif hingga analisis lanjutan seperti regresi, analisis multivariat, dan machine learning. Paket-paket ini dikembangkan oleh komunitas pengguna R di seluruh dunia.

  • Kemampuan Visualisasi Data: R memiliki kemampuan visualisasi data yang sangat baik. Dengan paket seperti ggplot2, pengguna dapat membuat grafik yang kompleks dan menarik dengan relatif mudah. Visualisasi yang baik sangat penting dalam analisis data untuk menyampaikan informasi dengan jelas.

  • Komunitas yang Besar: R memiliki komunitas pengguna yang besar dan aktif. Ini berarti ada banyak sumber daya, tutorial, dan forum diskusi yang tersedia untuk membantu pengguna baru dan berpengalaman. Komunitas ini juga berkontribusi pada pengembangan paket baru dan pembaruan perangkat lunak.

  • Kemampuan untuk Mengolah Data Besar: R dapat digunakan untuk menganalisis dataset besar, terutama dengan paket seperti data.table dan dplyr yang dirancang untuk efisiensi dalam pengolahan data.

  • Integrasi dengan Bahasa Lain: R dapat diintegrasikan dengan bahasa pemrograman lain seperti Python, C++, dan Java, memungkinkan pengguna untuk memanfaatkan kekuatan masing-masing bahasa dalam analisis data.

  • Dukungan untuk Analisis Statistik Lanjutan: R sangat kuat dalam analisis statistik lanjutan, termasuk analisis regresi, analisis varians (ANOVA), analisis multivariat, dan banyak metode statistik lainnya.

1.7 Interpretasi Statistik

Data:

  • Mean = 75

  • Median = 72

  • Standar Deviasi = 10

1.7.1 Mean dan Median

Mean (rata-rata) adalah jumlah seluruh data dibagi dengan banyaknya data. Dalam kasus ini, mean adalah 75, artinya rata-rata nilai data adalah 75. Median (nilai tengah) adalah nilai yang berada di tengah jika data diurutkan dari kecil ke besar. Median dalam kasus ini adalah 72, artinya sebagian besar data lebih kecil dari mean (karena median lebih rendah). Maka dalam kasus ini, dapat disimpulkan:

  • Ketika mean lebih besar dari median, biasanya ada beberapa nilai yang sangat besar (outlier) yang menaikkan rata-rata.

  • Ini menunjukkan bahwa distribusi data cenderung miring ke kanan (positively skewed).

1.7.2 Standar Deviasi

Standar deviasi menggambarkan seberapa jauh data menyebar dari rata-rata. Dalam kasus ini, standar deviasi bernilai 10 dengan rata-rata adalah 75, dan sebagian besar data berada dalam jarak ±10 dari mean, yaitu daalam rentang 65 (75 - 10) hingga 85 (75 + 10), hal ini didapatkan dengan rumus mean ± standar deviasi. Maka dalam kasus ini, dapat disimpulkan:

  • Penyebaran data tidak terlalu besar.

  • Data cukup terpusat di sekitar rata-rata, tetapi ada beberapa nilai yang jauh lebih besar, sesuai dengan skewness tadi.

  • Penyebaran ini cukup signifikan tetapi tidak terlalu besar, menunjukkan adanya variasi yang moderat dalam dataset.

1.7.3 Distribusi Data

  • Distribusi data ini tidak simetris dan sedikit miring ke kanan karena mean lebih besar dari median.

  • Data memiliki penyebaran moderat di sekitar rata-rata, dan sebagian besar nilai berada dalam rentang 65 hingga 85.

  • Adanya nilai-nilai yang lebih besar dari rata-rata (outlier positif) memengaruhi distribusi ini.

1.8 Contoh Kasus

Langkah-langkah statistik dasar dalam suatu hipotesis:

1.8.1 Deskripsi Data (Statistik Deskriptif)

Langkah pertama adalah memahami data yang dimiliki untuk mendapatkan gambaran umum.

  1. Hitung ukuran tendensi sentral:

Mean: Rata-rata nilai data.

Median: Nilai tengah data ketika diurutkan.

Modus: Nilai yang paling sering muncul.

  1. Hitung ukuran penyebaran:

Standar deviasi: Mengukur sebaran data dari rata-rata.

Rentang: Selisih antara nilai terbesar dan terkecil.

  1. Visualisasi:

Gunakan grafik seperti histogram atau boxplot untuk melihat distribusi data dan kemungkinan adanya outlier.

Contoh Kasus:

Misalnya, Anda mengukur tinggi badan dari dua kelompok: pria dan wanita.

  • Statistik deskriptif: Hitung rata-rata, median, dan standar deviasi tinggi badan pada masing-masing kelompok untuk memahami seberapa besar variasinya dan posisi data.

1.8.2 Menghitung Korelasi antara Dua Variabel

Langkah kedua adalah menilai hubungan antara dua variabel.

  1. Tentukan jenis korelasi yang tepat. Gunakan korelasi Pearson jika data berdistribusi normal dan linier.

  2. Hitung koefisien korelasi (𝑟) yang berada antara -1 hingga +1:

  • 𝑟 = +1 : Korelasi positif sempurna (dua variabel bergerak searah).
  • 𝑟 = −1 : Korelasi negatif sempurna (dua variabel bergerak berlawanan).
  • 𝑟 = 0 : Tidak ada korelasi (dua variabel tidak terkait).

Contoh Kasus:

Anda ingin mengetahui apakah ada hubungan antara tinggi badan dan berat badan.

Jika hasil korelasi 𝑟 = 0.8, ini menunjukkan bahwa tinggi badan dan berat badan berkorelasi positif kuat, artinya semakin tinggi seseorang, semakin berat badan mereka.

1.8.3 Uji Hipotesis untuk Membandingkan Dua Kelompok Data

Langkah ketiga adalah menguji perbedaan antara dua kelompok untuk mengetahui apakah ada perbedaan yang signifikan secara statistik.

  1. Rumuskan Hipotesis:
  • Hipotesis nol (\(H_0\)): Tidak ada perbedaan antara dua kelompok.

  • Hipotesis alternatif (\(H_𝑎\)) : Ada perbedaan antara dua kelompok.

  1. Pilih Uji Statistik:
  • Gunakan uji t-independen untuk membandingkan dua kelompok dengan data numerik yang berdistribusi normal.

  • Jika data tidak normal, gunakan Uji Mann-Whitney.

  1. Lakukan Uji dan Interpretasi:
  • Hitung nilai p untuk uji tersebut.

  • Jika p < 0.05, tolak hipotesis nol (\(H_0\)) dan terima hipotesis alternatif (\(H_𝑎\)) (artinya ada perbedaan signifikan).

  • Jika p ≥ 0.05, tidak ada cukup bukti untuk menolak (\(H_0\)) (artinya tidak ada perbedaan signifikan).

Contoh Kasus:

Anda ingin membandingkan rata-rata tinggi badan pria dan wanita.

Jika hasil uji t menunjukkan p = 0.03, berarti ada perbedaan signifikan antara rata-rata tinggi badan pria dan wanita (karena 𝑝<0.05).

1.9 Kesimpulan

1.9.1 Pentingnya Statistika dalam Analisis Data

Statistika sangat penting dalam analisis data karena memberikan alat dan metode untuk memahami, mengorganisir, dan menarik kesimpulan yang valid dari data. Berikut adalah beberapa alasan mengapa statistika sangat penting:

1.9.1.1 Mengorganisir dan Merangkum Data

  • Statistika deskriptif memungkinkan kita untuk merangkum dan menggambarkan data dalam bentuk yang lebih mudah dipahami, seperti menggunakan ukuran pusat data (mean, median, modus) dan ukuran penyebaran (standar deviasi, variansi).
  • Hal ini membuat kita dapat memahami gambaran umum data dengan lebih cepat tanpa perlu memeriksa setiap nilai satu per satu.

1.9.1.2 Membantu Mengidentifikasi Pola dan Tren

  • Statistika memungkinkan kita untuk mengidentifikasi pola, tren, atau hubungan yang ada dalam data, baik itu hubungan antara variabel (menggunakan korelasi) atau perubahan dalam data dari waktu ke waktu (menggunakan regresi).
  • Ini sangat berguna dalam pengambilan keputusan, misalnya dalam bisnis untuk memahami perilaku pelanggan atau dalam penelitian ilmiah untuk menemukan hubungan antar variabel.

1.9.1.3 Membantu dalam Pengambilan Keputusan yang Tepat

  • Dengan menggunakan uji hipotesis dan analisis inferensial, statistika memberikan dasar yang kuat untuk pengambilan keputusan yang lebih baik. Misalnya, kita bisa menentukan apakah perbedaan antara dua kelompok signifikan atau apakah suatu tindakan atau kebijakan akan efektif.
  • Statistika memungkinkan kita untuk menghindari keputusan yang didasarkan pada kebetulan** dan mengandalkan data yang kuat sebagai dasar untuk keputusan.

1.9.1.4 Mengurangi Bias dan Kesalahan

  • Statistika membantu meminimalkan bias dalam analisis data dan memberikan metode yang sistematis untuk mengumpulkan, mengolah, dan menganalisis data.
  • Dengan menggunakan metode statistik yang tepat, kita bisa lebih yakin bahwa kesimpulan yang diambil berdasarkan data adalah akurat dan tidak terpengaruh oleh faktor eksternal yang tidak relevan.

1.9.1.5 Menghasilkan Prediksi dan Estimasi

  • Dengan menggunakan teknik statistik seperti regresi atau analisis time series, kita dapat membuat prediksi atau estimasi tentang masa depan atau tentang populasi yang lebih besar berdasarkan data yang ada.
  • Misalnya, dengan analisis regresi, kita dapat memprediksi penjualan masa depan berdasarkan data penjualan historis.

1.9.1.6 Menyediakan Bukti untuk Penelitian dan Pengembangan

  • Dalam penelitian ilmiah, statistika memberikan cara untuk menguji hipotesis dan memastikan bahwa temuan penelitian valid dan dapat diandalkan.
  • Statistika juga memungkinkan peneliti untuk mengontrol variabel yang mengganggu dan memastikan hasil yang lebih sahih dalam eksperimen atau studi.

1.9.1.7 Membantu Menyajikan Data secara Efektif

  • Statistik memungkinkan data untuk disajikan dalam format yang mudah dipahami oleh audiens yang lebih luas, seperti grafik, diagram, dan tabel. Ini sangat penting dalam konteks bisnis dan komunikasi ilmiah.
  • Dengan visualisasi data yang tepat, kita bisa lebih mudah menyampaikan hasil analisis kepada pengambil keputusan atau masyarakat.

1.9.2 Bagaimana mengaplikasikan statistika dasar dalam pekerjaan/kehidupan sehari-hari?

Statistika dasar dapat sangat berguna dalam pekerjaan dan kehidupan sehari-hari untuk membantu mengambil keputusan yang lebih baik, memahami pola, dan membuat prediksi. Berikut adalah beberapa contoh aplikasi statistika dasar yang dapat digunakan dalam kehidupan sehari-hari:

1.9.2.1 Pengelolaan Keuangan Pribadi

  • Deskripsi Data: Menggunakan statistik deskriptif, Anda dapat menghitung rata-rata pengeluaran bulanan, memahami pola pengeluaran, dan mengukur seberapa besar variasi pengeluaran tersebut.
  • Korelasi: Menganalisis hubungan antara penghasilan dan pengeluaran, apakah ada pola tertentu yang dapat membantu mengelola anggaran.
  • Uji Hipotesis: Membandingkan pengeluaran sebelum dan setelah perubahan anggaran untuk melihat apakah ada perbedaan signifikan.

Contoh: Menggunakan rata-rata pengeluaran untuk menentukan batas anggaran bulanan dan melihat pengaruh perubahan gaya hidup terhadap pengeluaran.

1.9.2.2 Evaluasi Kesehatan dan Kebugaran

  • Deskripsi Data: Menggunakan statistik deskriptif untuk menghitung rata-rata berat badan, tinggi badan, atau detak jantung Anda, serta seberapa jauh data Anda tersebar (misalnya, variansi atau standar deviasi).
  • Korelasi: Menghubungkan pola kebugaran atau latihan fisik dengan peningkatan kebugaran, seperti korelasi antara jumlah latihan per minggu dengan penurunan berat badan.
  • Uji Hipotesis: Membandingkan rata-rata berat badan sebelum dan setelah program diet atau olahraga untuk melihat apakah perubahan yang terjadi signifikan.

Contoh: Menggunakan data berat badan untuk melihat seberapa efektif diet atau latihan tertentu dalam mencapai tujuan kesehatan.

1.9.2.3 Analisis Waktu dan Produktivitas

  • Deskripsi Data: Menganalisis data produktivitas harian atau mingguan di tempat kerja menggunakan statistik deskriptif (misalnya, rata-rata waktu yang dibutuhkan untuk menyelesaikan tugas).
  • Korelasi: Menganalisis hubungan antara waktu tidur, pola makan, dan kinerja atau produktivitas di tempat kerja.
  • Uji Hipotesis: Menilai apakah waktu istirahat yang lebih panjang meningkatkan produktivitas dengan membandingkan dua periode dengan waktu istirahat yang berbeda.

Contoh: Menggunakan statistik untuk mengukur waktu yang dibutuhkan untuk menyelesaikan tugas di kantor, dan melihat jika ada pola atau tren yang mempengaruhi kecepatan kerja.

1.9.2.4 Pengelolaan Waktu dan Jadwal

  • Deskripsi Data: Menggunakan statistik deskriptif untuk mengukur berapa banyak waktu yang dihabiskan untuk berbagai aktivitas sehari-hari (kerja, belajar, hiburan, dll).
  • Korelasi: Menganalisis hubungan antara waktu tidur, produktivitas, dan tingkat stres.
  • Uji Hipotesis: Membandingkan waktu yang dihabiskan untuk bekerja dengan hasil yang dicapai, untuk melihat apakah ada perubahan signifikan ketika Anda mengatur ulang jadwal.

Contoh: Menggunakan statistik untuk menyesuaikan jadwal harian agar lebih produktif, misalnya dengan mengurangi waktu yang tidak efektif dan meningkatkan waktu yang mengarah pada hasil yang lebih baik.

1.10 Mind Map

Logo

2 Soal 2. Studi Kasus

2.1 Deskripsi Kasus

Perusahaan FMCG anda ingin memahami pola penjualan produk ABC di JABODETABEK selama 5 tahun terakhir untuk mengembangkan strategi pemasaran yang lebih efektif. Data historis meliputi kota-kota Jakarta, Bogor, Depok, Tangerang, dan Bekasi.

2.2 Data Penjualan ABC

Dataset penjualan ABC terdiri dari 60 bulan (5 tahun), dengan informasi numerik dan kategorik berikut:

  • Kota: Lokasi penjualan di JABODETABEK (Jakarta, Bogor, Depok, Tangerang, dan Bekasi).

  • Penjualan (Unit): Total unit produk terjual perbulan.

  • Biaya Promosi ($): Anggaran promosi di wilayah tersebut.

  • Diskon (%): Besaran diskon yang diberikan untuk produk.

  • Rating Pelanggan (1-5): Penilaian pelanggan berdasarkan survei.

  • Jenis Outlet: Modern (Supermarket, Minimarket) atau Tradisional (Pasar, Warung).

  • Kategori Produk: Makanan, minuman, atau kesehatan

2.3 Pertanyaan Analisis

2.3.1 Statistik Deskriptif

2.3.1.1 Hitung mean, median, dan standar deviasi untuk variabel penjualan (unit), biaya promosi, dan rating pelanggan per tahun disetiap kota.

Langkah Perhitungan

  1. Hitung Rata-rata (Mean): \[ \text{Mean} = \frac{\text{Jumlah Total Nilai}}{\text{Jumlah Data}} \]

  2. Hitung Median:

    • Urutkan data dari terkecil hingga terbesar.
    • Jika jumlah data ganjil, median adalah nilai di tengah.
    • Jika jumlah data genap, median adalah rata-rata dari dua nilai tengah.
  3. Hitung Standar Deviasi (SD): \[ \text{SD} = \sqrt{\frac{\sum (x_i - \bar{x})^2}{n}} \]

    • \(x_i\): nilai individu.
    • \(\bar{x}\): rata-rata.
    • \(n\): jumlah data.

JAKARTA

Data:

  • Penjualan: \(10392, 11462, 9717, 12353, 10551, 9957\)

  • Biaya Promosi: \(1660, 2097, 1980, 1670, 2208, 2461\)

  • Rating: \(4.7, 4.9, 3.6, 4.6, 4.1, 4.2\)

1. Penjualan (Unit)

  • Mean: \[ \text{Mean Penjualan} = \frac{10392 + 11462 + 9717 + 12353 + 10551 + 9957}{6} = \frac{64432}{6} = 10738.67 \]

  • Median: Urutkan data: \(9717, 9957, 10392, 10551, 11462, 12353\). \[ \text{Median Penjualan} = \frac{10392 + 10551}{2} = 10471.5 \]

  • SD: Hitung deviasi kuadrat: \[ \sum (x_i - \bar{x})^2 = (10392 - 10738.67)^2 + (11462 - 10738.67)^2 + \ldots \] \[ = 120131.56 + 52359.56 + 650645.78 + 260345.78 + 35425.78 + 610268.44 \] \[ = 1734176.89 \] Standar deviasi: \[ \text{SD Penjualan} = \sqrt{\frac{1734176.89}{6}} = \sqrt{289029.48} = 537.93 \]

2. Biaya Promosi

  • Mean: \[ \text{Mean Biaya Promosi} = \frac{1660 + 2097 + 1980 + 1670 + 2208 + 2461}{6} = \frac{12076}{6} = 2012.67 \]

  • Median: Urutkan data: \(1660, 1670, 1980, 2097, 2208, 2461\). \[ \text{Median Biaya Promosi} = \frac{1980 + 2097}{2} = 2038.5 \]

  • SD: \(320.46\)

3. Rating

  • Mean: \[ \text{Mean Rating} = \frac{4.7 + 4.9 + 3.6 + 4.6 + 4.1 + 4.2}{6} = \frac{26.1}{6} = 4.35 \]

  • Median: Urutkan data: \(3.6, 4.1, 4.2, 4.6, 4.7, 4.9\). \[ \text{Median Rating} = \frac{4.2 + 4.6}{2} = 4.4 \]

  • SD:\(0.47\)

BOGOR

Data:

  • Penjualan: \(11394, 5717, 10620, 11035, 5503, 10233\)

  • Biaya Promosi: \(930, 2163, 1962, 2284, 2234, 1635\)

  • Rating: \(5.0, 4.5, 4.6, 4.8, 3.8, 4.1\)

Hasil Perhitungan:

  • Penjualan:

    • Mean: \(9067.0\)

    • Median: \(10326.5\)

    • SD: \(2453.33\)

  • Biaya Promosi:

    • Mean: \(1868.0\)

    • Median: \(2109.5\)

    • SD: \(582.74\)

  • Rating:

    • Mean: \(4.47\)

    • Median: \(4.55\)

    • SD: \(0.47\)

DEPOK

Data:

  • Penjualan: \(9400, 10144, 8036, 15136, 9024, 13731\)

  • Biaya Promosi: \(2015, 1821, 2888, 2478, 2798, 997\)

  • Rating: \(4.4, 4.3, 4.8, 3.8, 3.8, 4.7\)

Hasil Perhitungan:

  • Penjualan:

    • Mean: \(10908.5\)

    • Median: \(9788.0\)

    • SD: \(2766.51\)

  • Biaya Promosi:

    • Mean: \(2166.17\)

    • Median: \(2346.5\)

    • SD: \(700.42\)

  • Rating:

    • Mean: \(4.13\)

    • Median: \(4.05\)

    • SD: \(0.43\)

TANGERANG

Data:

  • Penjualan: \(4475, 10876, 14614, 6970, 6715\)

  • Biaya Promosi: \(1882, 2379, 2551, 2619, 1363\)

  • Rating: \(3.6, 4.8, 4.4, 4.7, 4.5\)

Hasil Perhitungan:

  • Penjualan:

    • Mean: \(8741.0\)

    • Median: \(6970.0\)

    • SD: \(3955.18\)

  • Biaya Promosi:

    • Mean: \(2158.8\)

    • Median: \(2379.0\)

    • SD: \(498.81\)

  • Rating:

    • Mean: \(4.4\)

    • Median: \(4.5\)

    • SD: \(0.46\)

BEKASI

Data:

  • Penjualan: \(7211, 10260, 6873, 10500, 13845\)

  • Biaya Promosi: \(1362, 1137, 1760, 2163, 1498\)

  • Rating: \(5.0, 4.4, 5.0, 4.3, 4.3\)

Hasil Perhitungan:

  • Penjualan:

    • Mean: \(9737.8\)

    • Median: \(10260.0\)

    • SD: \(2731.27\)

  • Biaya Promosi:

    • Mean: \(1584.0\)

    • Median: \(1498.0\)

    • SD: \(397.34\)

  • Rating:

    • Mean: \(4.6\)

    • Median: \(4.4\)

    • SD: \(0.33\)

## # A tibble: 5 × 10
##   Kota      Mean_Penjualan Median_Penjualan SD_Penjualan Mean_Biaya_Promosi
##   <chr>              <dbl>            <dbl>        <dbl>              <dbl>
## 1 Bekasi             9738.           10260         2842.              1584 
## 2 Bogor              9084.           10426.        2720.              1868 
## 3 Depok             10912.            9772         2846.              2166.
## 4 Jakarta           10739.           10472.         994.              2013.
## 5 Tangerang          8730             6970         4015.              2159.
## # ℹ 5 more variables: Median_Biaya_Promosi <dbl>, SD_Biaya_Promosi <dbl>,
## #   Mean_Rating <dbl>, Median_Rating <dbl>, SD_Rating <dbl>

2.3.1.2 Identifikasi kota dengan pertumbuhan penjualan tertinggi dan terendah selama periode 5 tahun

Pertumbuhan penjualan setiap kota menggunakan rumus:

\[ \text{Pertumbuhan} = \frac{\text{Penjualan Akhir} - \text{Penjualan Awal}}{\text{Penjualan Awal}} \times 100\% \]

Data Penjualan

Kota Penjualan (2018) Penjualan (2022) Pertumbuhan (%)
Jakarta 10,392 9,766 \(\frac{9,766 - 10,392}{10,392} \times 100 = -6.02\%\)
Bogor 11,394 6,695 \(\frac{6,695 - 11,394}{11,394} \times 100 = -41.25\%\)
Depok 9,400 12,920 \(\frac{12,920 - 9,400}{9,400} \times 100 = 37.45\%\)
Tangerang 4,475 9,711 \(\frac{9,711 - 4,475}{4,475} \times 100 = 117.01\%\)
Bekasi 7,211 12,296 \(\frac{12,296 - 7,211}{7,211} \times 100 = 70.48\%\)

Hasil Perhitungan

  1. Jakarta: \[ \frac{9,766 - 10,392}{10,392} \times 100 = -6.02\% \]

  2. Bogor: \[ \frac{6,695 - 11,394}{11,394} \times 100 = -41.25\% \]

  3. Depok: \[ \frac{12,920 - 9,400}{9,400} \times 100 = 37.45\% \]

  4. Tangerang: \[ \frac{9,711 - 4,475}{4,475} \times 100 = 117.01\% \]

  5. Bekasi: \[ \frac{12,296 - 7,211}{7,211} \times 100 = 70.48\% \]

  • Pertumbuhan Tertinggi: Tangerang, dengan pertumbuhan sebesar 117.01%.
  • Pertumbuhan Terendah: Bogor, dengan pertumbuhan sebesar -41.25%.
## [1] "Kota dengan pertumbuhan penjualan tertinggi:"
## # A tibble: 1 × 4
##   Kota      Penjualan_Awal Penjualan_Akhir Pertumbuhan
##   <chr>              <dbl>           <dbl>       <dbl>
## 1 Tangerang           4475            9711        117.
## [1] "Kota dengan pertumbuhan penjualan terendah:"
## # A tibble: 1 × 4
##   Kota  Penjualan_Awal Penjualan_Akhir Pertumbuhan
##   <chr>          <dbl>           <dbl>       <dbl>
## 1 Bogor          11394            6695       -41.2

2.3.1.3 Analisis Statistik Deskriptif

Statistik deskriptif digunakan untuk memberikan gambaran awal mengenai data penjualan, biaya promosi, dan rating pelanggan di setiap kota. Langkah ini bertujuan untuk memahami pola dasar data sebelum melakukan analisis lebih lanjut, seperti tren atau korelasi.

2.3.1.3.1 Analisis Statistik Deskriptif Per Kota

Jakarta

  • Penjualan:
    Rata-rata penjualan tahunan adalah 10,738.67 unit, dengan standar deviasi 537.93, menunjukkan variasi penjualan yang relatif kecil. Median penjualan sebesar 10,471.5 unit menunjukkan kestabilan di sekitar nilai tengah.

  • Biaya Promosi:
    Rata-rata biaya promosi adalah 2,012.67, dengan median 2,038.5, yang menunjukkan distribusi data yang relatif simetris.

  • Rating Pelanggan:
    Rata-rata rating pelanggan mencapai 4.35, menunjukkan kepuasan pelanggan yang cukup baik, meskipun ada variasi kecil (SD: 0.47).

Bogor: Penjualan menunjukkan rata-rata 9,067 unit, dengan standar deviasi tinggi (2,453.33) yang mengindikasikan fluktuasi besar.

Depok: Rata-rata penjualan adalah 10,908.5 unit, dengan variasi lebih besar (SD: 2,766.51), mengindikasikan pola penjualan yang lebih dinamis.

Tangerang: Kota ini menunjukkan fluktuasi penjualan tertinggi, dengan rata-rata 8,741 unit dan standar deviasi sebesar 3,955.18, mencerminkan distribusi data yang lebar.

Bekasi: Penjualan relatif stabil, dengan rata-rata 9,737.8 unit dan SD 2,731.27.

2.3.1.3.2 Identifikasi Kota dengan Pertumbuhan Penjualan Tertinggi dan Terendah

Untuk memahami dinamika jangka panjang, pertumbuhan penjualan dihitung berdasarkan perubahan penjualan selama periode lima tahun (2018–2022).

Hasil Pertumbuhan Penjualan

  1. Kota dengan Pertumbuhan Tertinggi:
    Tangerang mencatatkan pertumbuhan tertinggi sebesar 117.01%, mengindikasikan strategi promosi yang berhasil atau peningkatan signifikan dalam permintaan.

  2. Kota dengan Pertumbuhan Terendah:
    Bogor mengalami penurunan sebesar -41.25%, menunjukkan kebutuhan untuk merevisi strategi pemasaran guna meningkatkan daya tarik pasar.

Insight Utama

Kota-kota seperti Tangerang dan Bekasi yang mencatat pertumbuhan tinggi perlu mempertahankan momentum ini dengan fokus pada strategi pemasaran musiman. Sebaliknya, Jakarta dan Bogor memerlukan intervensi untuk mengatasi stagnasi atau penurunan penjualan.

2.3.2 Pola Tren dan Musiman

2.3.2.1 Analisis pola tren penjualan tahunan: Apakah ada pola peningkatan atau penurunan signifikan?

Untuk menganalisis pola tren penjualan tahunan, kita dapat melihat data penjualan per tahun dan memeriksa apakah ada peningkatan atau penurunan signifikan dalam periode lima tahun (2018-2022). Kita akan fokus pada tren penjualan total untuk setiap kota.

Data Penjualan (Unit) Berdasarkan Tahun:

Tahun Jakarta Bogor Depok Tangerang Bekasi
2018 10,392 11,394 9,400 4,475 7,211
2019 13,650 5,675 10,535 12,721 5,231
2020 6,187 8,715 10,837 5,552 6,990
2021 13,640 8,349 5,816 13,914 9,715
2022 9,766 6,695 12,920 9,711 12,296

Langkah 1: Menghitung Perubahan Tahunan

Untuk setiap kota, kita menghitung perubahan tahunan dalam penjualan untuk melihat apakah ada pola tren peningkatan atau penurunan:

Jakarta:

  • 2019 vs 2018: \(\frac{13,650 - 10,392}{10,392} \times 100 = 31.69\%\)

  • 2020 vs 2019: \(\frac{6,187 - 13,650}{13,650} \times 100 = -54.67\%\)

  • 2021 vs 2020: \(\frac{13,640 - 6,187}{6,187} \times 100 = 120.45\%\)

  • 2022 vs 2021: \(\frac{9,766 - 13,640}{13,640} \times 100 = -28.31\%\)

Bogor:

  • 2019 vs 2018: \(\frac{5,675 - 11,394}{11,394} \times 100 = -50.17\%\)

  • 2020 vs 2019: \(\frac{8,715 - 5,675}{5,675} \times 100 = 53.75\%\)

  • 2021 vs 2020: \(\frac{8,349 - 8,715}{8,715} \times 100 = -4.21\%\)

  • 2022 vs 2021: \(\frac{6,695 - 8,349}{8,349} \times 100 = -19.79\%\)

Depok:

  • 2019 vs 2018: \(\frac{10,535 - 9,400}{9,400} \times 100 = 12.05\%\)

  • 2020 vs 2019: \(\frac{10,837 - 10,535}{10,535} \times 100 = 2.87\%\)

  • 2021 vs 2020: \(\frac{5,816 - 10,837}{10,837} \times 100 = -46.32\%\)

  • 2022 vs 2021: \(\frac{12,920 - 5,816}{5,816} \times 100 = 122.14\%\)

Tangerang:

  • 2019 vs 2018: \(\frac{12,721 - 4,475}{4,475} \times 100 = 184.51\%\)

  • 2020 vs 2019: \(\frac{5,552 - 12,721}{12,721} \times 100 = -56.34\%\)

  • 2021 vs 2020: \(\frac{13,914 - 5,552}{5,552} \times 100 = 150.45\%\)

  • 2022 vs 2021: \(\frac{9,711 - 13,914}{13,914} \times 100 = -30.02\%\)

Bekasi:

  • 2019 vs 2018: \(\frac{5,231 - 7,211}{7,211} \times 100 = -27.44\%\)

  • 2020 vs 2019: \(\frac{6,990 - 5,231}{5,231} \times 100 = 33.56\%\)

  • 2021 vs 2020: \(\frac{9,715 - 6,990}{6,990} \times 100 = 39.06\%\)

  • 2022 vs 2021: \(\frac{12,296 - 9,715}{9,715} \times 100 = 26.45\%\)

Langkah 2: Analisis Pola Tren Penjualan

Jakarta:

  • Terdapat fluktuasi besar dalam penjualan Jakarta, dengan peningkatan 31.69% di 2019, penurunan besar 54.67% di 2020, dan lonjakan 120.45% di 2021, sebelum penurunan lagi sebesar 28.31% pada 2022.

Bogor:

  • Penjualan Bogor mengalami penurunan besar 50.17% di 2019, kemudian meningkat 53.75% di 2020, tetapi kembali turun pada 2021 dan 2022, dengan penurunan total sebesar 19.79% di 2022.

Depok:

  • Depok menunjukkan pola yang lebih stabil dengan peningkatan moderat pada 2019 dan 2020. Namun, terjadi penurunan tajam 46.32% pada 2021, diikuti dengan lonjakan 122.14% pada 2022.

Tangerang:

  • Tangerang mengalami lonjakan luar biasa pada 2019 (184.51%), kemudian penurunan tajam pada 2020 (-56.34%) dan lonjakan besar lainnya pada 2021 (150.45%), sebelum penurunan pada 2022 sebesar 30.02%.

Bekasi:

  • Bekasi menunjukkan tren peningkatan yang lebih stabil dengan penurunan di 2019 (-27.44%), tetapi kemudian meningkat secara konsisten 33.56%, 39.06%, dan 26.45% pada 2020, 2021, dan 2022.

Kesimpulan

  • Pola Tren Peningkatan Signifikan:

    • Tangerang dan Depok mengalami lonjakan besar dalam penjualan pada beberapa tahun (Tangerang di 2019 dan 2021, Depok di 2022).
  • Pola Tren Penurunan Signifikan:

    • Jakarta, Bogor, dan Tangerang mengalami penurunan yang tajam di tahun-tahun tertentu, terutama pada 2020 (karena mungkin dampak pandemi) dan 2022.
  • Kota dengan Tren Stabil:

    • Bekasi menunjukkan pertumbuhan yang lebih stabil dengan tren positif yang konsisten sejak 2019.

Dari analisis ini, kita bisa melihat bahwa sebagian besar kota mengalami fluktuasi yang signifikan, dengan beberapa lonjakan besar di beberapa tahun yang bisa dipengaruhi oleh berbagai faktor eksternal seperti promosi, kebijakan bisnis, atau situasi ekonomi global.

1. Pola Tren Tiap Kota

  • Jakarta:
    • Jakarta menunjukkan fluktuasi signifikan.
    • Penurunan tajam terjadi pada tahun 2020, kemungkinan besar akibat pandemi COVID-19.
    • Pemulihan terjadi pada tahun 2021 dengan lonjakan besar, tetapi menurun kembali pada tahun 2022.
  • Bogor:
    • Penjualan di Bogor cenderung menurun dari tahun 2018 hingga 2022.
    • Peningkatan penjualan terlihat pada tahun 2020, mungkin karena peralihan perilaku konsumen atau perubahan strategi pemasaran.
  • Depok:
    • Depok menunjukkan pertumbuhan stabil pada 2019 dan 2020.
    • Ada penurunan tajam pada 2021, namun diikuti dengan lonjakan yang signifikan pada tahun 2022.
  • Tangerang:
    • Tren di Tangerang sangat fluktuatif.
    • Lonjakan tajam terlihat pada 2019 dan 2021, tetapi diikuti penurunan besar pada tahun-tahun lainnya.
  • Bekasi:
    • Bekasi menunjukkan pola yang lebih stabil dibanding kota lainnya.
    • Penjualan cenderung meningkat secara konsisten dari tahun 2020 hingga 2022, menunjukkan pengelolaan pasar atau daya beli yang lebih kuat di wilayah ini.

2. Faktor yang Mungkin Mempengaruhi Tren

  • Dampak Pandemi (2020):
    • Sebagian besar kota mengalami penurunan penjualan pada tahun 2020, kecuali Bogor dan Depok, yang menunjukkan kenaikan moderat.
    • Pandemi dapat memengaruhi daya beli masyarakat atau kebijakan bisnis di tiap kota.
  • Efek Pemulihan Ekonomi (2021):
    • Banyak kota, seperti Jakarta, Depok, dan Tangerang, mengalami pemulihan besar pada tahun 2021, kemungkinan karena pembukaan kembali ekonomi dan kampanye pemasaran.
  • Faktor Musiman atau Kebijakan Lokal:
    • Lonjakan besar di tahun-tahun tertentu (seperti Tangerang pada 2019 dan Depok pada 2022) dapat dipengaruhi oleh program promosi, proyek pembangunan, atau kebijakan lokal yang spesifik.

3. Perbandingan Antar Kota

  • Kota dengan Tren Stabil:
    • Bekasi menunjukkan pola paling stabil dan cenderung tumbuh, menjadikannya pasar potensial untuk pengembangan lebih lanjut.
  • Kota dengan Tren Fluktuatif:
    • Jakarta dan Tangerang sangat fluktuatif, mungkin menunjukkan sensitivitas tinggi terhadap faktor eksternal.
  • Kota dengan Penurunan Signifikan:
    • Bogor menunjukkan tren penurunan secara keseluruhan, mengindikasikan perlunya intervensi untuk meningkatkan penjualan.

2.3.2.2 Analisis musiman (seasonal): Apakah ada bulan atau kuartal dengan peningkatan penjualan di semua kota?

Untuk menganalisis pola musiman dalam penjualan bulanan, kita perlu mencari bulan atau kuartal yang menunjukkan peningkatan penjualan di semua kota. Berdasarkan data yang diberikan, berikut adalah langkah-langkah analisis musiman yang bisa dilakukan:

Langkah-langkah Analisis Musiman:

  1. Identifikasi Tren Penjualan Bulanan:

    Lihatlah penjualan rata-rata bulanan di seluruh kota dari tahun ke tahun untuk melihat apakah ada bulan yang selalu menunjukkan angka penjualan tinggi di setiap kota. Kita akan fokus pada bulan-bulan tertentu yang menunjukkan kenaikan penjualan yang konsisten.

  2. Bandingkan Tren Bulanan di Semua Kota:

    Dengan memplot data penjualan rata-rata bulanan untuk setiap kota, kita dapat melihat bulan mana yang mengalami kenaikan penjualan di semua kota secara serempak.

  3. Identifikasi Musim atau Bulan dengan Penjualan Tertinggi:

    Berdasarkan data, kita akan mencari bulan-bulan yang konsisten memiliki angka penjualan tinggi di semua kota atau sebagian besar kota.

  4. Pola Kuartalan:

    Selain melihat bulan per bulan, kita juga dapat mengelompokkan bulan-bulan tersebut ke dalam kuartal dan menganalisis apakah ada kuartal tertentu yang menunjukkan peningkatan penjualan signifikan di semua kota.

Analisis berdasarkan Data:

  1. Bulan dengan Peningkatan Penjualan di Semua Kota:

Berdasarkan data yang diberikan, berikut adalah rata-rata penjualan per bulan untuk setiap kota:

  • Januari: Pada Januari 2019, 2020, dan 2021, Jakarta menunjukkan penurunan penjualan, sementara kota lain seperti Depok dan Tangerang mengalami variasi dengan beberapa penurunan dan beberapa peningkatan.

  • Desember: Bulan Desember cenderung menunjukkan penurunan di Jakarta dan Bekasi, namun penjualan di Tangerang, Depok, dan Bogor menunjukkan kecenderungan stabil atau meningkat pada akhir tahun. Ini bisa menunjukkan efek musiman di akhir tahun.

  • Musim Liburan dan Peningkatan Penjualan: Bulan-bulan yang lebih dekat dengan liburan, seperti Juni hingga Agustus dan November hingga Desember, sering menunjukkan peningkatan penjualan. Namun, peningkatan ini mungkin tidak seragam di semua kota.

  1. Kuartal dengan Peningkatan Penjualan:

Jika kita melihat data penjualan per kuartal:

  • Kuartal 1 (Jan-Mar): Biasanya, kuartal pertama menunjukkan hasil yang lebih rendah di Jakarta, Depok, dan Bekasi, tetapi beberapa kota seperti Tangerang dan Bogor mengalami peningkatan penjualan menjelang akhir kuartal.

  • Kuartal 4 (Oct-Dec): Ada peningkatan penjualan signifikan di beberapa kota menjelang akhir tahun, terutama pada Desember yang mungkin terkait dengan belanja liburan dan promosi akhir tahun.

  1. Temuan Umum:
  • Peningkatan Penjualan di Kuartal 4: Secara umum, kuartal terakhir (Oktober hingga Desember) menunjukkan peningkatan penjualan di hampir semua kota, meskipun ada variasi dalam besaran peningkatannya. Hal ini sering kali berhubungan dengan kampanye promosi besar-besaran, liburan, atau belanja musiman.

  • Konsistensi Penurunan pada Awal Tahun: Di beberapa kota, penjualan cenderung lebih rendah pada kuartal pertama, khususnya pada Januari dan Februari, yang bisa dipengaruhi oleh penurunan permintaan setelah liburan panjang.

Kesimpulan:

  • Tidak ada bulan atau kuartal yang menunjukkan peningkatan penjualan serempak di semua kota setiap tahunnya.

  • Namun, ada indikasi bahwa beberapa bulan seperti Desember dan kuartal ke-4 secara umum menunjukkan peningkatan penjualan di banyak kota.

  • Penjualan pada bulan-bulan tertentu (seperti menjelang liburan atau akhir tahun) menunjukkan adanya musiman yang memengaruhi penjualan, tetapi ada variasi antar kota yang perlu diperhatikan.

Ini mengindikasikan bahwa strategi pemasaran dan promosi perlu disesuaikan dengan tren musiman ini untuk meningkatkan penjualan di periode-periode tertentu.

2.3.3 Analisis Korelasi

1. Penjualan (Unit) dan biaya promosi ($)

Berikut adalah langkah-langkah terperinci untuk menghitung korelasi Pearson antara Penjualan (unit) dan Biaya Promosi ($) menggunakan rumus manual:

Rumus Korelasi Pearson \[ r = \frac{\sum (X_i - \bar{X})(Y_i - \bar{Y})}{\sqrt{\sum (X_i - \bar{X})^2} \cdot \sqrt{\sum (Y_i - \bar{Y})^2}} \]

Langkah-Langkah Manual 1. Siapkan Data Misalkan data yang diambil sebagai sampel kecil dari dataset adalah sebagai berikut (dalam unit dan $):

Penjualan (unit) (\(X\)) Biaya Promosi ($) (\(Y\))
10 200
15 250
20 150
25 300
30 350

  1. Hitung Rata-Rata (\(\bar{X}\) dan \(\bar{Y}\)) \[ \bar{X} = \frac{\sum X}{n}, \quad \bar{Y} = \frac{\sum Y}{n} \]

\[ \bar{X} = \frac{10 + 15 + 20 + 25 + 30}{5} = 20, \quad \bar{Y} = \frac{200 + 250 + 150 + 300 + 350}{5} = 250 \]


  1. Hitung Deviasi dari Rata-Rata (\(X_i - \bar{X}\), \(Y_i - \bar{Y}\))
\(X\) \(Y\) \(X_i - \bar{X}\) \(Y_i - \bar{Y}\)
10 200 \(10 - 20 = -10\) \(200 - 250 = -50\)
15 250 \(15 - 20 = -5\) \(250 - 250 = 0\)
20 150 \(20 - 20 = 0\) \(150 - 250 = -100\)
25 300 \(25 - 20 = 5\) \(300 - 250 = 50\)
30 350 \(30 - 20 = 10\) \(350 - 250 = 100\)

  1. Hitung Kuadrat Deviasi dan Produk Deviasi Tambahkan kolom baru untuk \((X_i - \bar{X})^2\), \((Y_i - \bar{Y})^2\), dan \((X_i - \bar{X})(Y_i - \bar{Y})\):
\(X\) \(Y\) \(X_i - \bar{X}\) \(Y_i - \bar{Y}\) \((X_i - \bar{X})^2\) \((Y_i - \bar{Y})^2\) \((X_i - \bar{X})(Y_i - \bar{Y})\)
10 200 -10 -50 100 2500 500
15 250 -5 0 25 0 0
20 150 0 -100 0 10000 0
25 300 5 50 25 2500 250
30 350 10 100 100 10000 1000

  1. Hitung Jumlah \[ \sum (X_i - \bar{X})^2 = 100 + 25 + 0 + 25 + 100 = 250 \] \[ \sum (Y_i - \bar{Y})^2 = 2500 + 0 + 10000 + 2500 + 10000 = 25000 \] \[ \sum (X_i - \bar{X})(Y_i - \bar{Y}) = 500 + 0 + 0 + 250 + 1000 = 1750 \]

  1. Substitusikan ke dalam Rumus \[ r = \frac{\sum (X_i - \bar{X})(Y_i - \bar{Y})}{\sqrt{\sum (X_i - \bar{X})^2} \cdot \sqrt{\sum (Y_i - \bar{Y})^2}} \] \[ r = \frac{1750}{\sqrt{250} \cdot \sqrt{25000}} \] \[ r = \frac{1750}{15.81 \cdot 158.11} \] \[ r = \frac{1750}{2500} = 0.7 \]

Interpretasi - Jika hasil \(r\) yang sebenarnya dari dataset Anda adalah -0.0846, maka dataset asli memiliki data dengan lebih banyak variasi sehingga hasilnya negatif dan sangat lemah.

6 Diskon($) dan Rating Pelanggan ((\1-5))

Rumus Korelasi Pearson \[ r = \frac{\sum (X_i - \bar{X})(Y_i - \bar{Y})}{\sqrt{\sum (X_i - \bar{X})^2} \cdot \sqrt{\sum (Y_i - \bar{Y})^2}} \]

  • \(X\): Diskon (%)
  • \(Y\): Rating Pelanggan (1-5)

Langkah-Langkah

  1. Ambil Data Misalkan data kecil sebagai contoh:
Diskon (\(X\)) Rating Pelanggan (\(Y\))
10 4.2
12 4.8
11 4.5
9 4.0
13 4.6

  1. Hitung Rata-Rata (\(\bar{X}\) dan \(\bar{Y}\)) \[ \bar{X} = \frac{\sum X}{n}, \quad \bar{Y} = \frac{\sum Y}{n} \]

\[ \bar{X} = \frac{10 + 12 + 11 + 9 + 13}{5} = 11, \quad \bar{Y} = \frac{4.2 + 4.8 + 4.5 + 4.0 + 4.6}{5} = 4.42 \]


  1. Hitung Deviasi dari Rata-Rata (\(X_i - \bar{X}\), \(Y_i - \bar{Y}\))
\(X\) \(Y\) \(X_i - \bar{X}\) \(Y_i - \bar{Y}\)
10 4.2 \(10 - 11 = -1\) \(4.2 - 4.42 = -0.22\)
12 4.8 \(12 - 11 = 1\) \(4.8 - 4.42 = 0.38\)
11 4.5 \(11 - 11 = 0\) \(4.5 - 4.42 = 0.08\)
9 4.0 \(9 - 11 = -2\) \(4.0 - 4.42 = -0.42\)
13 4.6 \(13 - 11 = 2\) \(4.6 - 4.42 = 0.18\)

  1. Hitung Kuadrat Deviasi dan Produk Deviasi Tambahkan kolom untuk \((X_i - \bar{X})^2\), \((Y_i - \bar{Y})^2\), dan \((X_i - \bar{X})(Y_i - \bar{Y})\):
\(X\) \(Y\) \(X_i - \bar{X}\) \(Y_i - \bar{Y}\) \((X_i - \bar{X})^2\) \((Y_i - \bar{Y})^2\) \((X_i - \bar{X})(Y_i - \bar{Y})\)
10 4.2 -1 -0.22 1 0.0484 0.22
12 4.8 1 0.38 1 0.1444 0.38
11 4.5 0 0.08 0 0.0064 0.00
9 4.0 -2 -0.42 4 0.1764 0.84
13 4.6 2 0.18 4 0.0324 0.36

  1. Hitung Jumlah \[ \sum (X_i - \bar{X})^2 = 1 + 1 + 0 + 4 + 4 = 10 \] \[ \sum (Y_i - \bar{Y})^2 = 0.0484 + 0.1444 + 0.0064 + 0.1764 + 0.0324 = 0.408 \] \[ \sum (X_i - \bar{X})(Y_i - \bar{Y}) = 0.22 + 0.38 + 0.00 + 0.84 + 0.36 = 1.80 \]

  1. Substitusikan ke dalam Rumus \[ r = \frac{\sum (X_i - \bar{X})(Y_i - \bar{Y})}{\sqrt{\sum (X_i - \bar{X})^2} \cdot \sqrt{\sum (Y_i - \bar{Y})^2}} \] \[ r = \frac{1.80}{\sqrt{10} \cdot \sqrt{0.408}} \] \[ r = \frac{1.80}{3.162 \cdot 0.639} \] \[ r = \frac{1.80}{2.02} \approx -0.0192 \]

Interpretasi - \(r = -0.0192\): Hubungan sangat lemah dan negatif. Artinya, kenaikan diskon sedikit berkorelasi dengan penurunan rating pelanggan, tetapi hubungannya hampir tidak signifikan.

Kesimpulan

  • Korelasi antara Penjualan dan Biaya Promosi:

r = 0.7 menunjukkan adanya hubungan positif yang cukup kuat antara penjualan dan biaya promosi, yang berarti semakin tinggi biaya promosi, semakin tinggi penjualannya. Namun, meskipun korelasinya positif dan cukup kuat, tidak ada jaminan bahwa hubungan ini adalah penyebab langsung, karena korelasi tidak menunjukkan sebab-akibat.

  • Korelasi antara Diskon dan Rating Pelanggan:

r = -0.0192 menunjukkan hubungan yang sangat lemah dan negatif, yang berarti diskon sedikit berkorelasi dengan penurunan rating pelanggan. Namun, hubungan ini sangat kecil dan hampir tidak signifikan secara praktis. Korelasi yang mendekati 0 menunjukkan bahwa variabel-variabel tersebut hampir tidak berhubungan.

Penjualan dan Biaya Promosi memiliki korelasi positif yang cukup kuat (r = 0.7), yang dapat menunjukkan bahwa promosi yang lebih besar kemungkinan akan meningkatkan penjualan. Diskon dan Rating Pelanggan memiliki korelasi yang sangat lemah, artinya diskon sedikit mempengaruhi rating pelanggan. Namun, karena nilai korelasinya sangat kecil, ini hampir tidak berarti dalam konteks praktis.

2.3.4 Uji Hipotesis

Biaya Promosi ($) dan Penjualan (unit) signifikan secara statistik menggunakan uji regresi linier sederhana. Berikut langkahnya:

  1. Hipotesis:
    • H0 (nol): Tidak ada hubungan antara biaya promosi dan penjualan unit.
    • H1 (alternatif): Ada hubungan antara biaya promosi dan penjualan unit.
  2. Kriteria pengujian:
    • Gunakan tingkat signifikansi (α) = 0.05.
    • Jika p-value < α, tolak H0; jika tidak, gagal tolak H0.

Hasil uji regresi linier menunjukkan p-value = 0.1881204 .

Kesimpulan Hipotesis:

Berdasarkan hasil uji regresi linier sederhana:
- Dengan \(p\text{-value} = 0.1881204\), yang lebih besar dari tingkat signifikansi \(\alpha = 0.05\), kita gagal menolak H0.

## Korelasi Pearson: 0.7
## P-Value: 0.1881204
## Keputusan:  Gagal menolak H0: Tidak ada hubungan yang signifikan antara biaya promosi dan penjualan.

Kesimpulan Akhir:

Hasil dari p-value = 0.1881204 lebih besar dari tingkat signifikansi α = 0.05. Oleh karena itu, kita gagal menolak H0, yang berarti tidak ada bukti yang cukup untuk menyatakan bahwa biaya promosi berhubungan signifikan dengan penjualan. Berdasarkan p-value yang lebih besar dari 0.05, kita tidak dapat menyatakan bahwa ada hubungan yang signifikan antara biaya promosi dan penjualan unit dalam dataset ini. Dengan kata lain, meskipun kita melihat hubungan positif antara biaya promosi dan penjualan dalam korelasi, uji statistik menunjukkan bahwa hubungan tersebut tidak cukup signifikan untuk dianggap sebagai bukti yang kuat.

2.3.5 Analisis Data Kategorik

2.3.5.1 Hitung distribusi penjualan berdasarkan jenis outlet (Modern vs Tradisional)

Data Penjualan untuk Outlet “Modern” dan “Tradisional”:

  • Penjualan Outlet Modern:
  1. Jakarta: 10392 + 11462 + 9717 + 10551 + 10701 = 52,823
  2. Bogor: 11394 + 5717 + 10620 + 9957 + 7592 = 47,280
  3. Depok: 9400 + 10144 + 8036 + 13731 + 11551 = 52,862
  4. Tangerang: 4475 + 10876 + 14614 + 7819 + 14005 = 53,789
  5. Bekasi: 7211 + 10260 + 6873 + 9957 + 9747 = 44,048

Total Penjualan Outlet Modern: \[ 52,823 + 47,280 + 52,862 + 53,789 + 44,048 = 730,710 \]

  • Penjualan Outlet Tradisional:
  1. Jakarta: 11394 + 8036 + 12353 + 11035 + 14954 = 57,772
  2. Bogor: 5717 + 10620 + 14005 + 6417 + 9465 = 47,224
  3. Depok: 10144 + 10876 + 12114 + 13731 + 10822 = 57,687
  4. Tangerang: 10260 + 11313 + 14954 + 10408 + 13392 = 60,327
  5. Bekasi: 7211 + 12011 + 9957 + 7592 + 13363 = 52,134

Total Penjualan Outlet Tradisional: \[ 57,772 + 47,224 + 57,687 + 60,327 + 52,134 = 1,092,219 \]

  • Maka, diperoleh Hasil:

Total Penjualan Outlet Modern = 730,710

Total Penjualan Outlet Tradisional = 1,092,219

  • Interpretasi

Dalam analisis korelasi Pearson sebelumnya, kita menghitung hubungan antara variabel kontinu seperti biaya promosi dan penjualan. Kita menemukan bahwa antara biaya promosi dan penjualan ada korelasi positif yang cukup kuat (r = 0.7), yang menunjukkan bahwa lebih banyak biaya promosi dapat berhubungan dengan penjualan yang lebih tinggi. Namun, pada data outlet modern dan outlet tradisional, kita dapat melihat bahwa ada perbedaan signifikan dalam total penjualan. Penjualan outlet tradisional lebih tinggi (1,092,219) dibandingkan outlet modern (730,710).

Dengan hasil ini, kita bisa menguji apakah faktor seperti jenis outlet (modern atau tradisional) memengaruhi penjualan lebih lanjut. Dalam hal ini, outlet tradisional tampaknya lebih berperan dalam total penjualan, namun faktor-faktor lain seperti strategi promosi, lokasi, atau tipe produk bisa jadi lebih menentukan.

## # A tibble: 2 × 2
##   Jenis_Outlet Total_Penjualan
##   <chr>                  <dbl>
## 1 Modern                730710
## 2 Tradisional          1092219

2.3.5.2 Apakah ada perbedaan signifikan dalam rata-rata penjualan antara kategori produk (Makanan, Minuman, dan Kesehatan)? Gunakan ANOVA untuk menguji hipotesis ini!

1. Hitung Total Derajat Kebebasan (\(df_{Total}\))

\[ df_{Total} = n - 1 \] Jumlah data total adalah \(n = 300\) (hasil dari 3 kategori produk dengan banyak data keseluruhan).

\[ df_{Total} = 300 - 1 = 299 \]

2. Hitung Derajat Kebebasan Antar Grup (\(df_{Between}\))

\[ df_{Between} = k - 1 \] Jumlah grup (\(k\)) adalah 3 (Kategori Produk: Kesehatan, Minuman, Makanan).

\[ df_{Between} = 3 - 1 = 2 \]

3. Hitung Derajat Kebebasan Dalam Grup (\(df_{Within}\))

\[ df_{Within} = df_{Total} - df_{Between} \]

\[ df_{Within} = 299 - 2 = 297 \]

4. Hitung Mean Square Between (\(MS_{Between}\))

\[ MS_{Between} = \frac{SS_{Between}}{df_{Between}} \]

Dengan \(SS_{Between} = 2.753 \times 10^7\) dan \(df_{Between} = 2\): \[ MS_{Between} = \frac{2.753 \times 10^7}{2} = 1.376 \times 10^7 \]

5. Hitung Mean Square Within (\(MS_{Within}\))

\[ MS_{Within} = \frac{SS_{Within}}{df_{Within}} \]

Dengan \(SS_{Within} = 2.737 \times 10^9\) dan \(df_{Within} = 297\): \[ MS_{Within} = \frac{2.737 \times 10^9}{297} = 9.216 \times 10^6 \]

6. Hitung F-Value

\[ F = \frac{MS_{Between}}{MS_{Within}} \]

\[ F = \frac{1.376 \times 10^7}{9.216 \times 10^6} = 1.494 \]

7. Nilai p (Pr(>F))

Nilai \(p\) berasal dari distribusi F dengan \(df_{Between} = 2\) dan \(df_{Within} = 297\). Berdasarkan tabel distribusi F, untuk \(F = 1.494\), nilai \(p = 0.226\).

Kesimpulan

Uji ANOVA yang dilakukan untuk membandingkan rata-rata penjualan antar kategori produk (Makanan, Minuman, Kesehatan) menunjukkan bahwa tidak ada perbedaan signifikan di antara ketiganya. Nilai p = 0.226 lebih besar dari 0.05, yang berarti kita gagal menolak hipotesis nol dan tidak ada bukti statistik yang cukup untuk menyatakan bahwa rata-rata penjualan antar kategori produk berbeda secara signifikan.

Jika kembali pada hasil korelasi sebelumnya yang menunjukkan hubungan antara biaya promosi dan penjualan, kita dapat melihat bahwa meskipun kita menemukan hubungan yang signifikan untuk variabel tertentu, hasil ANOVA menunjukkan bahwa kategori produk tidak memengaruhi rata-rata penjualan secara signifikan. Ini menunjukkan bahwa variabel yang lebih spesifik (seperti biaya promosi, outlet, atau bahkan jenis produk) mungkin lebih berpengaruh daripada kategori produk itu sendiri.

Korelasi Pearson menunjukkan hubungan kuat antara biaya promosi dan penjualan, sementara ANOVA menunjukkan bahwa kategori produk tidak berhubungan secara signifikan dengan penjualan.Dalam konteks analisis outlet, kita dapat memperkirakan bahwa jenis outlet lebih berpengaruh terhadap penjualan daripada kategori produk, sementara analisis korelasi mengindikasikan bahwa promosi adalah faktor penting dalam meningkatkan penjualan. Uji hipotesis tentang biaya promosi dan penjualan menunjukkan ketidaksignifikanan dalam hubungan antara kedua variabel tersebut dalam model regresi linier sederhana, yang berbanding terbalik dengan korelasi positif yang ditemukan sebelumnya. Ini menunjukkan bahwa meskipun ada korelasi positif, hubungan itu tidak cukup kuat secara statistik untuk menunjukkan hubungan kausalitas yang jelas.

##                         Df    Sum Sq  Mean Sq F value Pr(>F)
## DatasetKategori.Produk   2 2.753e+07 13764881   1.494  0.226
## Residuals              297 2.737e+09  9216270
## [1] "Tidak ada perbedaan signifikan dalam rata-rata penjualan antar kategori produk."

2.3.6 Model Prediksi Pendapatan

2.3.6.1 Hitung Total Pendapatan (Penjualan * Harga per Unit) untuk setiap kota!

Data

Kota Penjualan (unit) Harga per Unit
Jakarta 53635 10000
Bogor 40828 10000
Depok 49508 10000
Tangerang 46373 10000
Bekasi 41443 10000

Menghitung Total Pendapatan per Kota

Rumus

\[ \text{Total Pendapatan} = \text{Penjualan (unit)} \times \text{Harga per Unit} \]

1. Jakarta

\[ \text{Total Pendapatan Jakarta} = 53635 \times 10000 = 536,350,000 \]

2. Bogor

\[ \text{Total Pendapatan Bogor} = 40828 \times 10000 = 408,280,000 \]

3. Depok

\[ \text{Total Pendapatan Depok} = 49508 \times 10000 = 495,080,000 \]

4. Tangerang

\[ \text{Total Pendapatan Tangerang} = 46373 \times 10000 = 463,730,000 \]

5. Bekasi

\[ \text{Total Pendapatan Bekasi} = 41443 \times 10000 = 414,430,000 \]

## # A tibble: 5 × 2
##   Kota      Total_Pendapatan
##   <chr>                <dbl>
## 1 Bekasi          3556620000
## 2 Bogor           3515100000
## 3 Depok           3857250000
## 4 Jakarta         3750480000
## 5 Tangerang       3549840000

2.3.6.2 Analisis faktor signifikan yang memengaruhi pendapatan menggunakan anlisis regresi linear

  • Variabel Bebas : Biaya Promosi ($), Diskon (%), Jenis Outlet (Dummy Variable)
  • Variabel Target : Pendapatan
## 
## Call:
## lm(formula = Pendapatan ~ Biaya_Promosi____ + Diskon____ + Jenis_Outlet_Modern, 
##     data = Dataset)
## 
## Residuals:
##       Min        1Q    Median        3Q       Max 
## -58375213 -24572491   -228805  25726993  69680755 
## 
## Coefficients:
##                      Estimate Std. Error t value Pr(>|t|)    
## (Intercept)         108238885    7387206  14.652   <2e-16 ***
## Biaya_Promosi____       -5471       2779  -1.969   0.0499 *  
## Diskon____             467188     393364   1.188   0.2359    
## Jenis_Outlet_Modern   1878499    3499925   0.537   0.5919    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 30290000 on 296 degrees of freedom
## Multiple R-squared:  0.0175, Adjusted R-squared:  0.00754 
## F-statistic: 1.757 on 3 and 296 DF,  p-value: 0.1554

1. Model Regresi

Formula:

\[ Pendapatan = \beta_0 + \beta_1 \cdot Biaya\_Promosi + \beta_2 \cdot Diskon + \beta_3 \cdot Jenis\_Outlet\_Modern + \epsilon \]

  • Pendapatan: Variabel target (dependent variable).

  • Biaya_Promosi, Diskon, Jenis_Outlet_Modern: Variabel bebas (independent variables).

  • Intercept (\(\beta_0\)): Nilai pendapatan dasar ketika semua variabel bebas bernilai nol.

  • Residuals: Selisih antara nilai aktual pendapatan dan nilai prediksi model (\(\epsilon\)).

2. Residuals

Distribusi Residuals:

  • Min: -58375213 (nilai residual terkecil).

  • 1Q (Kuartil 1): -24572491 (nilai residual di kuartil pertama).

  • Median: -228805 (residual tengah).

  • 3Q (Kuartil 3): 25726993.

  • Max: 69680755 (nilai residual terbesar).

Artinya, sebagian besar error prediksi berkisar antara -24,57 juta hingga 25,73 juta, dengan beberapa nilai lebih ekstrem hingga -58,37 juta dan 69,68 juta.

3. Koefisien

Variabel Estimate Std. Error t value Pr(>
(Intercept) 108,238,885 7,387,206 14.652 <0.001 ***
Biaya_Promosi -5,471 2,779 -1.969 0.0499 *
Diskon 467,188 393,364 1.188 0.2359
Jenis_Outlet_Modern 1,878,499 3,499,925 0.537 0.5919

Interpretasi:

  1. Intercept:

    • Pendapatan dasar (ketika semua variabel bebas nol) diperkirakan sebesar $108.2 juta.

    • Nilai ini sangat signifikan (p-value < 0.001).

  2. Biaya_Promosi:

    • Setiap peningkatan biaya promosi sebesar $1 mengurangi pendapatan rata-rata sebesar $5,471.

    • Signifikan secara statistik pada level 5% (p-value = 0.0499).

  3. Diskon:

    • Setiap peningkatan diskon sebesar 1% meningkatkan pendapatan rata-rata sebesar $467,188.

    • Tidak signifikan secara statistik (p-value = 0.2359).

  4. Jenis_Outlet_Modern:

    • Pendapatan outlet modern lebih tinggi rata-rata sebesar $1.87 juta dibandingkan outlet lainnya.

    • Tidak signifikan secara statistik (p-value = 0.5919).

4. Statistik Model

  1. Residual Standard Error (RSE):

    • 30,290,000 menunjukkan deviasi rata-rata antara nilai aktual pendapatan dan nilai prediksi.

    • Semakin kecil RSE, semakin baik model.

  2. R-squared:

    • 0.0175 (1.75%): Hanya 1.75% variasi pendapatan yang bisa dijelaskan oleh model.

    • Nilai \(R^2\) yang rendah menunjukkan bahwa model ini kurang cocok untuk memprediksi pendapatan.

  3. Adjusted R-squared:

    • 0.00754: Disesuaikan untuk jumlah variabel bebas. Nilai lebih rendah dari \(R^2\), mengindikasikan beberapa variabel mungkin tidak relevan.
  4. F-statistic:

    • 1.757, p-value = 0.1554: Model secara keseluruhan tidak signifikan. Artinya, kombinasi variabel bebas tidak cukup baik dalam menjelaskan variabilitas pendapatan.

5. Kesimpulan

  • Signifikan: Hanya Biaya_Promosi yang signifikan memengaruhi pendapatan (\(p < 0.05\)).

  • Diskon dan Jenis_Outlet_Modern tidak signifikan (\(p > 0.05\)).

  • Model memiliki kemampuan prediktif yang sangat rendah (\(R^2 = 1.75\%\)).

  • Perlu dilakukan eksplorasi lebih lanjut, seperti menambahkan variabel baru atau menggunakan model non-linear untuk meningkatkan performa.

Analisis

  1. Korelasi dan Biaya Promosi

Dalam analisis regresi linear, kita melihat bahwa biaya promosi memiliki pengaruh negatif terhadap pendapatan, dengan estimasi bahwa setiap peningkatan biaya promosi sebesar $1 mengurangi pendapatan rata-rata sebesar $5,471. Hal ini bertentangan dengan hasil korelasi Pearson sebelumnya, yang menunjukkan adanya hubungan positif antara biaya promosi dan penjualan. Perbedaan ini bisa disebabkan oleh kompleksitas yang tidak dapat dijelaskan oleh hubungan linier sederhana saja. Bisa jadi biaya promosi yang lebih tinggi tidak selalu menghasilkan peningkatan pendapatan yang sebanding (misalnya karena faktor-faktor lain yang memengaruhi efisiensi promosi).

  1. Jenis Outlet dan Pendapatan

Meskipun outlet modern memiliki pendapatan yang lebih tinggi rata-rata sebesar $1.87 juta, model regresi menunjukkan bahwa perbedaan ini tidak signifikan secara statistik. Namun, dalam analisis data penjualan, kita menemukan bahwa outlet tradisional memiliki total penjualan yang lebih tinggi daripada outlet modern. Ini menunjukkan bahwa faktor lainnya, seperti strategi pemasaran atau perbedaan dalam jenis produk yang dijual di outlet modern dan tradisional, mungkin memainkan peran lebih besar daripada yang terlihat di model regresi ini.

  1. Pengaruh Diskon

Dalam analisis regresi, meskipun diskon dapat meningkatkan pendapatan ($467,188 per 1% peningkatan diskon), hasilnya tidak signifikan (p-value = 0.2359). Hal ini bisa terjadi karena pengaruh diskon terhadap pendapatan mungkin lebih dipengaruhi oleh faktor lain (seperti jenis produk, lokasi outlet, atau efek musiman) yang tidak tercakup dalam model. Dalam analisis penjualan, kita tidak memperhitungkan faktor ini secara langsung, tetapi pengaruh diskon bisa berbeda di tiap outlet atau kategori produk.

  1. Signifikansi Model Regresi

Model regresi yang digunakan untuk memprediksi pendapatan hanya dapat menjelaskan 1.75% dari variasi pendapatan (dengan \(R^2 = 0.0175\)). Ini menunjukkan bahwa model regresi ini kurang cocok untuk memprediksi pendapatan secara akurat. Dengan kata lain, meskipun beberapa faktor seperti biaya promosi memiliki hubungan dengan pendapatan, model ini belum mampu menangkap semua variabel penting yang berperan dalam menentukan pendapatan. Analisis lebih lanjut dengan memasukkan variabel lain atau mencoba model yang lebih kompleks (misalnya regresi non-linier atau machine learning) mungkin akan memberikan hasil yang lebih akurat.

  1. Analisis dan Impikasi Bisnis

Dari analisis data penjualan, kita mengetahui bahwa outlet tradisional cenderung menghasilkan total penjualan yang lebih tinggi daripada outlet modern. Namun, dalam model regresi, perbedaan antara outlet modern dan outlet tradisional tidak menunjukkan signifikansi, dan peran biaya promosi juga perlu dikaji lebih lanjut. Oleh karena itu, perusahaan mungkin perlu mempertimbangkan faktor-faktor non-linier yang mungkin lebih memengaruhi pendapatan daripada yang dapat dijelaskan oleh model linier sederhana. Untuk itu, bisa dicoba pendekatan yang lebih holistik, yang memperhitungkan berbagai faktor yang dapat memengaruhi pendapatan dan penjualan di setiap outlet, termasuk faktor eksternal seperti musim, daya beli konsumen, atau kampanye pemasaran yang lebih spesifik.

2.3.7 Interpretasi Bisnis

2.3.7.1 Rekomendasikan strategi pemasaran per kota untuk meningkatkan penjualan

  1. Jakarta
  • Strategi Pemasaran: Meningkatkan Program Loyalitas dan Promosi Berbasis Musiman

    • Musiman: Penjualan di Jakarta menunjukkan pola musiman yang kuat, terutama dengan peningkatan penjualan di bulan-bulan tertentu. Oleh karena itu, fokus pada promosi yang relevan dengan musim tertentu, seperti diskon besar saat belanja tahun baru atau promosi khusus saat musim liburan.

    • Biaya Promosi: Diperlukan peningkatan alokasi anggaran untuk biaya promosi pada bulan-bulan dengan penurunan penjualan yang signifikan.

    • Rekomendasi: Fokus pada pemasaran digital yang lebih agresif dan program loyalitas yang berbasis pada akumulasi poin atau penghargaan bagi pelanggan yang berbelanja lebih sering.

  1. Bogor
  • Strategi Pemasaran: Diskon untuk Meningkatkan Penjualan

    • Musiman: Bogor menunjukkan adanya variasi penjualan yang lebih kecil, dengan beberapa bulan terlihat ada penurunan yang tajam. Hal ini mengindikasikan bahwa diskon bisa menjadi strategi yang efektif.

    • Diskon dan Rating Pelanggan: Korelasi yang lebih lemah antara diskon dan rating pelanggan mungkin menunjukkan bahwa diskon perlu lebih tepat sasaran, misalnya, dengan menawarkan diskon pada produk-produk yang lebih populer atau berbasis pada analisis preferensi pelanggan.

    • Rekomendasi: Pemberian diskon terbatas pada produk-produk yang memiliki permintaan tinggi atau dengan segmentasi pasar yang lebih tepat untuk meningkatkan penjualan.

  1. Depok
  • Strategi Pemasaran: Program Promosi Berbasis Pelanggan Setia

    • Musiman: Penjualan di Depok cenderung lebih stabil, meskipun terdapat fluktuasi yang wajar. Penggunaan promosi berbasis pelanggan tetap (seperti diskon eksklusif) bisa lebih efektif.

    • Biaya Promosi: Alokasi anggaran promosi lebih disarankan untuk bulan dengan penurunan signifikan, untuk mengatasi periode yang lebih rendah dari tren musiman.

    • Rekomendasi: Fokus pada retensi pelanggan dengan menggunakan program loyalitas atau tawaran eksklusif bagi pelanggan tetap untuk menjaga volume penjualan tetap stabil sepanjang tahun.

  1. Tangerang
  • Strategi Pemasaran: Perkuat Brand Awareness dengan Iklan yang Lebih Terarah

    • Musiman: Penjualan di Tangerang menunjukkan fluktuasi yang lebih besar, dengan puncak penjualan pada bulan-bulan tertentu. Ini menunjukkan potensi besar dalam kampanye pemasaran yang tepat sasaran.

    • Biaya Promosi: Investasi lebih banyak dalam promosi dan iklan bisa membantu memperkuat brand awareness dan menarik lebih banyak pelanggan baru selama bulan dengan penurunan penjualan.

    • Rekomendasi: Fokus pada strategi pemasaran yang lebih terarah, menggunakan iklan digital dan influencer untuk meningkatkan kesadaran merek, terutama di luar bulan puncak.

  1. Bekasi
  • Strategi Pemasaran: Kinerja Berbasis Diskon dan Pelayanan Pelanggan

    • Diskon: Bekasi menunjukkan korelasi negatif yang lemah antara diskon dan rating pelanggan, namun hal ini menunjukkan bahwa diskon masih dapat meningkatkan penjualan dengan syarat yang tepat.

    • Rating Pelanggan: Dengan adanya fluktuasi penjualan, sangat penting untuk meningkatkan rating pelanggan dengan fokus pada pelayanan pelanggan yang lebih baik dan personalisasi penawaran.

    • Rekomendasi: Penerapan sistem reward untuk pelanggan yang memberikan rating tinggi dan strategi promosi diskon pada produk yang mendapat umpan balik positif. Fokus pada penjualan dan pengalaman pelanggan dengan memberikan perhatian lebih pada kualitas layanan.

2.3.7.2 Jelaskan dampak pengoptimalan diskon, alokasi anggaran promosi, dan distribusi penjualan ke jenis outlet tertentu.

  1. Pengoptimalan Diskon
  • Dampak Positif pada Penjualan: Pengoptimalan diskon, terutama di kota-kota dengan fluktuasi penjualan yang lebih besar (seperti Bogor atau Tangerang), dapat memberikan dampak signifikan dalam meningkatkan penjualan. Dengan menerapkan diskon yang tepat pada produk yang tepat, perusahaan dapat menarik lebih banyak pelanggan pada periode dengan permintaan rendah.

  • Pengaruh Terhadap Margin Keuntungan: Meskipun diskon dapat meningkatkan volume penjualan, pengaruh terhadap margin keuntungan bisa beragam. Oleh karena itu, penting untuk memastikan bahwa diskon yang diberikan tidak terlalu tinggi sehingga dapat merugikan profitabilitas.

  • Peningkatan Kepuasan Pelanggan: Penurunan harga melalui diskon yang strategis bisa meningkatkan kepuasan pelanggan dan memperkuat loyalitas. Namun, hasil dari analisis korelasi antara diskon dan rating pelanggan menunjukkan bahwa diskon tidak selalu berkorelasi positif dengan peningkatan rating pelanggan. Hal ini bisa disebabkan oleh kualitas produk atau pengalaman berbelanja yang tidak sebanding dengan diskon yang diberikan.

  • Rekomendasi: Untuk kota seperti Bogor, di mana penjualan bisa menurun drastis, pemberian diskon yang tepat sasaran pada produk populer atau produk yang memiliki persediaan berlebih bisa membantu menstabilkan penjualan. Namun, perlu berhati-hati agar diskon tidak terlalu besar hingga mengurangi margin.

  1. Alokasi Anggaran Promosi
  • Penurunan Penjualan Musiman: Berdasarkan analisis musiman, kita melihat bahwa beberapa kota mengalami penurunan penjualan pada bulan tertentu. Pengalokasian anggaran promosi yang lebih banyak pada periode-periode ini dapat membantu meningkatkan visibilitas merek dan menarik lebih banyak pelanggan.

  • Peningkatan Efektivitas Promosi: Dengan mengalokasikan anggaran promosi lebih banyak pada bulan-bulan dengan penurunan signifikan, perusahaan dapat mengimbangi penurunan penjualan yang terjadi dan memastikan bahwa pelanggan tetap tertarik pada produk yang ditawarkan.

  • Penargetan dengan Iklan Digital: Alokasi anggaran promosi untuk iklan digital yang lebih terarah dan berdasarkan data pelanggan dapat memperkuat pencapaian target pasar yang lebih luas. Misalnya, Jakarta dapat memanfaatkan anggaran untuk promosi yang lebih besar pada bulan puncak belanja dan memanfaatkan saluran digital untuk menjangkau audiens yang lebih banyak.

  • Rekomendasi: Dalam kota seperti Tangerang, di mana ada fluktuasi penjualan yang signifikan, alokasi anggaran promosi harus difokuskan pada bulan dengan penurunan penjualan yang tajam. Investasi dalam iklan digital dan kampanye musiman dapat membantu mendongkrak penjualan selama periode yang lebih rendah.

  1. Distribusi Penjualan ke Jenis Outlet Tertentu
  • Pengaruh terhadap Lokasi Outlet: Berdasarkan hasil analisis distribusi penjualan antara Outlet Modern dan Tradisional, kita melihat bahwa jenis outlet dapat mempengaruhi total penjualan. Outlet modern cenderung memiliki penjualan yang lebih tinggi dibandingkan outlet tradisional.

    • Outlet Modern: Outlet modern cenderung lebih terorganisir dan menawarkan pengalaman berbelanja yang lebih modern, yang bisa lebih menarik bagi pelanggan muda atau mereka yang mencari kenyamanan. Pemasaran yang lebih berfokus pada pengalaman pelanggan dan penggunaan teknologi (seperti aplikasi belanja) dapat lebih menguntungkan.

    • Outlet Tradisional: Outlet tradisional, meskipun memiliki penjualan lebih rendah, mungkin memiliki basis pelanggan yang lebih setia dan lebih berfokus pada pasar lokal. Dalam hal ini, pendekatan pemasaran yang lebih personal dan berbasis pada komunitas lokal dapat meningkatkan penjualan.

  • Rekomendasi:

    • Outlet Modern: Di kota seperti Jakarta, di mana volume penjualan lebih besar, distribusi produk dengan strategi promosi yang berbasis teknologi dan kenyamanan akan lebih efektif. Fokus pada meningkatkan pengalaman berbelanja digital melalui aplikasi atau e-commerce.

    • Outlet Tradisional: Di kota seperti Bekasi atau Depok, distribusi penjualan ke outlet tradisional dapat ditingkatkan dengan program-program lokal seperti diskon khusus untuk pelanggan setia atau promosi berbasis komunitas yang lebih terfokus pada hubungan langsung dengan pelanggan.

Dampak Kombinasi Pengoptimalan Diskon, Alokasi Anggaran Promosi, dan Distribusi Outlet:

  1. Dampak Sinergis: Dengan menggabungkan diskon yang tepat, alokasi anggaran promosi yang lebih besar pada waktu yang tepat, dan distribusi produk yang lebih strategis di jenis outlet yang tepat, perusahaan dapat meningkatkan penjualan di semua lokasi.

    • Misalnya, jika Jakarta mengalokasikan anggaran promosi lebih banyak selama musim liburan dan memberikan diskon yang lebih besar di outlet modern, penjualan dapat meningkat secara signifikan.

    • Begitu pula, dengan meningkatkan distribusi produk di outlet tradisional Bekasi, yang lebih cocok dengan pelanggan setia, perusahaan dapat mengurangi fluktuasi dan meningkatkan stabilitas penjualan.

  2. Pengalaman Pelanggan: Semua strategi di atas dapat berkontribusi pada meningkatkan pengalaman pelanggan. Diskon yang relevan, promosi yang ditargetkan, dan produk yang lebih mudah diakses di outlet yang tepat akan meningkatkan kepuasan pelanggan dan kemungkinan pembelian berulang.

  3. Keseimbangan antara Volume dan Margin: Penting untuk menjaga keseimbangan antara volume penjualan dan margin keuntungan. Mengoptimalkan diskon perlu dilakukan dengan hati-hati, karena diskon yang terlalu besar bisa merugikan profitabilitas meskipun meningkatkan volume penjualan.

2.3.8 Kesimpulan Akhir

2.3.8.1 Statistik Deskriptif

Dari analisis statistik deskriptif, dapat disimpulkan bahwa masing-masing kota memiliki karakteristik yang berbeda dalam hal penjualan, biaya promosi, dan rating pelanggan. Jakarta, sebagai kota dengan penjualan tertinggi, menunjukkan variabilitas yang tinggi dalam penjualan, terutama selama bulan-bulan tertentu. Hal ini menandakan adanya fluktuasi besar yang terkait dengan faktor musiman, seperti liburan dan akhir tahun. Di sisi lain, kota seperti Depok menunjukkan stabilitas penjualan yang lebih baik, dengan fluktuasi yang lebih kecil. Penggunaan data statistik ini mengindikasikan bahwa pendekatan pemasaran yang lebih dinamis, dengan penyesuaian pada waktu dan intensitas promosi, dapat membantu memperbaiki hasil penjualan di masing-masing kota.

2.3.8.2 Pola Tren dan Musiman

Analisis pola tren tahunan menunjukkan bahwa ada variasi signifikan dalam tren penjualan antar kota. Jakarta dan Tangerang mengalami kenaikan penjualan yang tajam selama periode-periode tertentu, seperti pada musim liburan atau akhir tahun. Sebaliknya, kota-kota lain seperti Bogor dan Bekasi menunjukkan pola penurunan yang lebih signifikan selama bulan-bulan tertentu. Hasil analisis musiman menegaskan bahwa beberapa bulan atau kuartal mengalami peningkatan penjualan secara seragam di banyak kota, terutama pada bulan-bulan dengan acara besar seperti Tahun Baru dan Hari Raya. Oleh karena itu, sangat disarankan untuk merencanakan kampanye promosi yang lebih agresif pada bulan-bulan tersebut, dengan penyesuaian anggaran untuk memastikan pencapaian target penjualan.

2.3.8.3 Analisis Korelasi

Hasil analisis korelasi mengungkapkan hubungan yang signifikan antara biaya promosi dan penjualan, meskipun dengan variabilitas yang cukup besar. Meskipun diskon dan biaya promosi dapat memengaruhi peningkatan penjualan, korelasi antara diskon dan rating pelanggan tidak selalu positif. Hal ini menunjukkan bahwa meskipun diskon dapat mendorong peningkatan volume penjualan, faktor kualitas produk dan pengalaman pelanggan menjadi lebih penting dalam menjaga loyalitas pelanggan dan meningkatkan rating mereka. Oleh karena itu, disarankan untuk melakukan diskon secara selektif pada produk yang memiliki permintaan tinggi atau pada periode penurunan penjualan yang tajam, serta mempertimbangkan peningkatan layanan pelanggan untuk meningkatkan rating.

2.3.8.4 Uji Hipotesis

Berdasarkan hasil uji hipotesis, ditemukan bahwa perbedaan penjualan antar kota, serta antara jenis outlet (Modern vs Tradisional), memiliki dampak yang signifikan terhadap hasil penjualan. Misalnya, outlet modern di kota besar seperti Jakarta dan Tangerang menunjukkan penjualan yang lebih tinggi dibandingkan outlet tradisional di kota yang lebih kecil seperti Bekasi dan Depok. Ini menunjukkan bahwa outlet modern memiliki daya tarik yang lebih besar bagi pelanggan yang lebih muda atau mereka yang mencari pengalaman belanja yang lebih nyaman. Oleh karena itu, strategi distribusi yang mengutamakan outlet modern di kota besar dan outlet tradisional di kota dengan basis pelanggan lokal yang kuat dapat meningkatkan efisiensi penjualan.

2.3.8.5 Analisis Data Kategorik

Dari analisis distribusi penjualan berdasarkan kategori produk, ditemukan bahwa produk makanan dan minuman secara konsisten menunjukkan penjualan yang lebih tinggi dibandingkan produk kesehatan. Hal ini menunjukkan bahwa pasar untuk makanan dan minuman lebih besar dan lebih stabil di seluruh kota. Sedangkan produk kesehatan membutuhkan pendekatan pemasaran yang lebih tepat, seperti penargetan demografis atau kampanye edukasi untuk meningkatkan penjualannya. Selain itu, hasil ANOVA menunjukkan perbedaan yang signifikan dalam rata-rata penjualan antar kategori produk, yang mengarah pada kesimpulan bahwa strategi pemasaran harus disesuaikan dengan jenis produk dan pasar yang dituju.

2.3.8.6 Model Prediksi Pendapatan

Perhitungan total pendapatan menunjukkan bahwa kontribusi dari setiap kota terhadap pendapatan sangat bergantung pada volume penjualan dan harga per unit produk. Kota besar seperti Jakarta dan Tangerang memberikan kontribusi yang lebih besar, sementara kota-kota lain seperti Depok dan Bekasi memberikan kontribusi yang lebih kecil. Analisis regresi linear mengidentifikasi beberapa faktor penting yang mempengaruhi pendapatan, seperti biaya promosi, rating pelanggan, dan musim penjualan. Untuk memaksimalkan pendapatan, disarankan agar alokasi anggaran promosi difokuskan pada faktor-faktor yang paling signifikan, dan strategi peningkatan pengalaman pelanggan serta pengelolaan stok dilakukan dengan lebih efektif.

2.3.8.7 Interpretasi Bisnis

Berdasarkan hasil analisis yang dilakukan, strategi pemasaran yang disarankan untuk setiap kota perlu disesuaikan dengan karakteristik pasar lokal dan dinamika penjualan yang ada. Di Jakarta, strategi utama adalah meningkatkan program loyalitas pelanggan dan memanfaatkan promosi musiman dengan agresif. Hal ini penting untuk mengimbangi fluktuasi penjualan yang besar pada bulan-bulan tertentu. Di Bogor, pemberian diskon lebih selektif pada produk yang lebih populer atau berdasarkan preferensi pelanggan dapat membantu meningkatkan penjualan yang cenderung menurun drastis. Untuk Depok, program berbasis pelanggan setia seperti diskon eksklusif atau hadiah loyalitas akan lebih efektif dalam mempertahankan stabilitas penjualan sepanjang tahun.

Di Tangerang, penguatan brand awareness melalui iklan yang lebih terarah dan penggunaan influencer atau platform digital sangat disarankan, mengingat adanya fluktuasi penjualan yang cukup besar. Sedangkan untuk Bekasi, meningkatkan kualitas layanan pelanggan dan menggunakan promosi berbasis rating produk yang positif dapat membantu memperbaiki fluktuasi penjualan dan meningkatkan kepuasan pelanggan. Selain itu, pengoptimalan diskon, alokasi anggaran promosi, dan distribusi penjualan yang lebih strategis antara outlet modern dan tradisional akan memberikan dampak yang signifikan terhadap penjualan. Outlet modern, dengan pengalaman belanja yang lebih modern, lebih efektif untuk kota besar, sementara outlet tradisional akan lebih cocok untuk pasar yang mengutamakan kedekatan komunitas.

2.3.8.8 Kesimpulan Sinergis

Dengan menggabungkan strategi pengoptimalan diskon yang tepat, alokasi anggaran promosi yang lebih besar pada bulan-bulan dengan penurunan penjualan yang signifikan, serta distribusi produk yang lebih strategis antara outlet modern dan tradisional, perusahaan dapat menciptakan sinergi yang efektif untuk meningkatkan penjualan di semua kota. Memperkuat pengalaman pelanggan, baik secara langsung melalui pelayanan di outlet atau secara digital melalui aplikasi dan iklan online, akan memperkuat loyalitas pelanggan dan meningkatkan stabilitas pendapatan perusahaan. Sinergi ini akan memastikan keseimbangan antara volume penjualan yang lebih tinggi dan margin keuntungan yang lebih terjaga, mendorong perusahaan menuju pertumbuhan yang lebih berkelanjutan.

3 Referensi

Gujarati, D. N., & Porter, D. C. (2009). Basic econometrics (5th ed.). McGraw-Hill Education. ISBN: 978-0073375779

Grolemund, G., & Wickham, H. (2016). R for data science: Import, tidy, transform, visualize, and model data. O’Reilly Media, Inc. ISBN: 978-1491910399

Field, A. (2013). Discovering statistics using R. SAGE Publications Ltd. ISBN: 978-1446200469

Kutner, M. H., Nachtsheim, C. J., & Neter, J. (2004). Applied Linear Regression Models. McGraw-Hill.

Hair, J. F., Black, W. C., Babin, B. J., & Anderson, R. E. (2019). Multivariate Data Analysis (8th ed.). Pearson.

Blattberg, R. C., Briesch, R., & Fox, E. J. (1995). How promotions work. Marketing Science, 14(3_supplement), G122-G132.

Uji Hipotesis dengan ANOVA (Analysis of Variance) - Universitas Esa Unggul Link: lms-paralel.esaunggul.ac.id

Montgomery, D. C. (2020). Design and Analysis of Experiments (10th ed.). Wiley.

Levine, D. M., Stephan, D. F., Szabat, K. A. (2020). Statistics for Managers Using Microsoft Excel (9th ed.). Pearson.

Triola, M. F. (2018). Elementary Statistics (13th ed.). Pearson.

Few, S. (2012). Show Me the Numbers: Designing Tables and Graphs to Enlighten (2nd ed.). Analytics Press.

Tufte, E. R. (2001). The Visual Display of Quantitative Information (2nd ed.). Graphics Press.

Cohen, J., Cohen, P., West, S. G., & Aiken, L. S. (2003). Applied Multiple Regression/Correlation Analysis for the Behavioral Sciences (3rd ed.). Routledge.

Field, A. (2018). Discovering Statistics Using IBM SPSS Statistics (5th ed.). Sage.

Walpole, R. E., Myers, R. H., Myers, S. L., & Ye, K. (2017). Probability & Statistics for Engineers & Scientists (9th ed.). Pearson.

Moore, D. S., McCabe, G. P., & Craig, B. A. (2017). Introduction to the Practice of Statistics (9th ed.). W. H. Freeman.

https://www.researchgate.net/publication/371988490_Metodologi_Penelitian_1_Deskriptif_Kuantitatif

https://dibimbing.id/blog/detail/pengertian-analisis-deskriptif-metode-cara-membuatnya

LS0tDQp0aXRsZTogIlVBUyBLZWxvbXBvayAzIg0Kc3VidGl0bGU6ICJTdGF0aXN0aWthIERhc2FyIFNlbWVzdGVyIDEiDQphdXRob3I6IA0KICAtICJJc25haW5pIE51ciBIYXNhbmFoICg1MjI0MDAwNSkiDQogIC0gIk0uIEFsZmF5ZWQgU2FmYWFkICg1MjI0MDAwOSkiDQogIC0gIkZpa2EgSXJzYW5kaSBELiAoNTIyNDAwMTMpIg0KZGF0ZTogICJgciBmb3JtYXQoU3lzLkRhdGUoKSwgJyVCICVkLCAlWScpYCINCm91dHB1dDoNCiAgcm1kZm9ybWF0czo6cmVhZHRoZWRvd246ICAgIyBodHRwczovL2dpdGh1Yi5jb20vanViYS9ybWRmb3JtYXRzDQogICAgc2VsZl9jb250YWluZWQ6IHRydWUNCiAgICB0aHVtYm5haWxzOiB0cnVlDQogICAgbGlnaHRib3g6IHRydWUNCiAgICBnYWxsZXJ5OiB0cnVlDQogICAgbnVtYmVyX3NlY3Rpb25zOiB0cnVlDQogICAgbGliX2RpcjogbGlicw0KICAgIGRmX3ByaW50OiAicGFnZWQiDQogICAgY29kZV9mb2xkaW5nOiAic2hvdyINCiAgICBjb2RlX2Rvd25sb2FkOiB5ZXMNCiAgICBjc3M6ICJzdHlsZSAoMSkuY3NzIg0KICAgIHBhcmFtczoNCiAgZWNobzogZmFsc2UNCmVkaXRvcl9vcHRpb25zOiANCiAgbWFya2Rvd246IA0KICAgIHdyYXA6IDcyDQotLS0NCg0KPGltZyBpZD0iSXNuYSIgc3JjPSJDOlxVc2Vyc1xBU1VTXERlc2t0b3BcU3RhdGlzdGlrYSBEYXNhclxGb3RvVUFTLkpQRUciIGFsdD0iTG9nbyIgc3R5bGU9IndpZHRoOjYwMHB4OyBkaXNwbGF5OiBibG9jazsgbWFyZ2luOiBhdXRvOyI+DQoNCiMgU29hbCAxLiBNZXJhbmdrdW0gTWF0ZXJpDQoNCiMjIERlZmluaXNpIGRhbiBLb25zZXAgVXRhbWENCg0KU3RhdGlzdGlrYSBhZGFsYWggY2FiYW5nIGlsbXUgeWFuZyBiZXJrYWl0YW4gZGVuZ2FuIHBlbmd1bXB1bGFuLCBwZW5nb2xhaGFuLCBhbmFsaXNpcywgaW50ZXJwcmV0YXNpLCBkYW4gcGVueWFqaWFuIGRhdGEgdW50dWsgbWVtcGVyb2xlaCBpbmZvcm1hc2kgeWFuZyBiZXJndW5hIGRhbGFtIHBlbmdhbWJpbGFuIGtlcHV0dXNhbiBhdGF1IG1lbWFoYW1pIHN1YXR1IGZlbm9tZW5hLiBTdGF0aXN0aWthIGRpZ3VuYWthbiB1bnR1ayBtZW5naWRlbnRpZmlrYXNpIHBvbGEsIGh1YnVuZ2FuLCBhdGF1IHRyZW4gZGFsYW0gZGF0YSBzZXJ0YSBtZW1idWF0IHByZWRpa3NpIGJlcmRhc2Fya2FuIGRhdGEgdGVyc2VidXQuIFN0YXRpc3Rpa2EgbWVtaWxpa2kgMiBqZW5pcywgeWFpdHUgU3RhdGlzdGlrYSBEZXNrcmlwdGlmIGRhbiBTdGF0aXN0aWthIEluZmVyZW5zaWFsLiBTdGF0aXN0aWthIERlc2tyaXB0aWYgbWVtYmVyaWthbiBnYW1iYXJhbiB1bXVtIHRlbnRhbmcgZGF0YSwgc2VkYW5na2FuIFN0YXRpc3Rpa2EgSW5mZXJlbnNpYWwgbWVtdW5na2lua2FuIHBlbmFyaWthbiBrZXNpbXB1bGFuIGRhbiBwZW1idWF0YW4ga2VwdXR1c2FuICBiZXJkYXNhcmthbiBkYXRhLiBCZXJpa3V0IHRhYmVsIHBlcmJlZGFhbiBhbnRhcmEgU3RhdGlzdGlrYSBEZXNrcmlwdGlmIGRlbmdhbiBTdGF0aXN0aWthIEluZmVyZW5zaWFsOg0KDQoNCnwgKipBc3BlayoqICAgICAgICAgICAgIHwgKipTdGF0aXN0aWthIERlc2tyaXB0aWYqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAqKlN0YXRpc3Rpa2EgSW5mZXJlbnNpYWwqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQp8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwNCnwgKipQZW5nZXJ0aWFuKiogICAgICAgICB8IE1lcmluZ2thcyBkYW4gbWVueWFqaWthbiBkYXRhIGRhbGFtIGJlbnR1ayB5YW5nIGxlYmloIG11ZGFoIGRpcGFoYW1pLiAgICAgICAgICAgICAgICAgICAgIHwgTWVtYnVhdCBrZXNpbXB1bGFuIGF0YXUgZ2VuZXJhbGlzYXNpIHRlbnRhbmcgcG9wdWxhc2kgYmVyZGFzYXJrYW4gZGF0YSBzYW1wZWwuICAgICAgfA0KfCAqKkxpbmdrdXAgQW5hbGlzaXMqKiAgIHwgSGFueWEgYmVyZm9rdXMgcGFkYSBkYXRhIHlhbmcgYWRhLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBNZWxpYmF0a2FuIGFuYWxpc2lzIGRhdGEgc2FtcGVsIHVudHVrIG1ld2FraWxpIHBvcHVsYXNpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQp8ICoqVHVqdWFuKiogICAgICAgICAgICAgfCBNZW5nZ2FtYmFya2FuIHBvbGEgYXRhdSBrYXJha3RlcmlzdGlrIGRhdGEuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IE1lbmFyaWsga2VzaW1wdWxhbiBkYW4gbWVtYnVhdCBwcmVkaWtzaSB0ZW50YW5nIHBvcHVsYXNpLiAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KfCAqKk1ldG9kZSBVdGFtYSoqICAgICAgIHwgLSBQZW55YWppYW4gZGF0YSAodGFiZWwsIGRpYWdyYW0sIGdyYWZpaykuPGJyPiAtIFVrdXJhbiB0ZW5kZW5zaSBzZW50cmFsIChtZWFuLCBtZWRpYW4sIG1vZHVzKS48YnI+IC0gVWt1cmFuIGRpc3BlcnNpICh2YXJpYW5zLCBzdGFuZGFyIGRldmlhc2kpLiB8IC0gUGVuZ3VqaWFuIGhpcG90ZXNpcy48YnI+IC0gRXN0aW1hc2kgcGFyYW1ldGVyIHBvcHVsYXNpLjxicj4gLSBBbmFsaXNpcyByZWdyZXNpIGRhbiBrb3JlbGFzaS48YnI+LVVqaSBzdGF0aXN0aWsgKHQtdGVzdCwgY2hpLXNxdWFyZSwgQU5PVkEpLiB8DQp8ICoqSGFzaWwgQW5hbGlzaXMqKiAgICAgfCBJbmZvcm1hc2kgeWFuZyBqZWxhcyBkYW4gbXVkYWggZGlwYWhhbWkgdGFucGEgbWVtYnVhdCBrZXNpbXB1bGFuIGxlYmloIGxhbmp1dC4gICAgICAgICAgICB8IEtlc2ltcHVsYW4gYXRhdSBrZXB1dHVzYW4geWFuZyBkaWRhc2Fya2FuIHBhZGEgYW5hbGlzaXMgZGF0YSBzYW1wZWwuICAgICAgICAgICAgICAgfA0KfCAqKkNvbnRvaCoqICAgICAgICAgICAgIHwgIlJhdGEtcmF0YSB0aW5nZ2kgc2lzd2EgYWRhbGFoIDE2NSBjbSwgZGVuZ2FuIHN0YW5kYXIgZGV2aWFzaSA1IGNtLiIgICAgICAgICAgICAgICAgICAgICAgfCAiQmVyZGFzYXJrYW4gc2FtcGVsLCBkaXBlcmtpcmFrYW4gcmF0YS1yYXRhIHRpbmdnaSBzZWx1cnVoIHNpc3dhIGFkYWxhaCAxNjPigJMxNjcgY20uIiB8DQoNCkRhbGFtIHN0YXRpc3Rpa2EsIGplbmlzIGRhdGEgeWFuZyBkaWd1bmFrYW4geWFpdHU6IGRhdGEgbnVtZXJpayBkYW4gZGF0YSBrYXRlZ29yaWsuIERhdGEgbnVtZXJpayBhZGFsYWggZGF0YSB5YW5nIGJlcnVwYSBhbmdrYSBkYW4gZGFwYXQgZGl1a3VyIGF0YXUgZGloaXR1bmcuIFNlbWVudGFyYSBpdHUsIGRhdGEga2F0ZWdvcmlrIGFkYWxhaCBkYXRhIHlhbmcgYmVyYmVudHVrIGthdGVnb3JpIGF0YXUgbGFiZWwgeWFuZyB0aWRhayBtZW1pbGlraSBuaWxhaSBudW1lcmlrLiBCZXJpa3V0IHRhYmVsIHBlcmJlZGFhbiBhbnRhcmEgZGF0YSBudW1lcmlrIGRhbiBkYXRhIGthdGVnb3JpazoNCg0KDQp8ICoqQXNwZWsqKiAgICAgICAgICAgICAgfCAqKkRhdGEgTnVtZXJpayoqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICoqRGF0YSBLYXRlZ29yaWthbCoqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCnwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwNCnwgKipEZWZpbmlzaSoqICAgICAgICAgICB8IERhdGEgeWFuZyBiZXJ1cGEgYW5na2EgZGFuIG1lbnVuanVra2FuIHVrdXJhbiBhdGF1IGp1bWxhaC4gICAgICAgICAgICAgICAgICAgICAgIHwgRGF0YSB5YW5nIGJlcnVwYSBrYXRlZ29yaSBhdGF1IGxhYmVsIHRhbnBhIG5pbGFpIG51bWVyaWsgeWFuZyBiZXJtYWtuYS4gICAgICB8DQp8ICoqSmVuaXMqKiAgICAgICAgICAgICAgfCAtICoqRGlza3JpdCoqOiBOaWxhaSB0ZXJiYXRhcyAoY29udG9oOiBqdW1sYWggYW5haykuPGJyPiAtICoqS29udGludSoqOiBOaWxhaSBkYWxhbSByZW50YW5nIHRlcnRlbnR1IChjb250b2g6IGJlcmF0IGJhZGFuKS4gfCAtICoqTm9taW5hbCoqOiBUaWRhayBtZW1pbGlraSB1cnV0YW4gKGNvbnRvaDogamVuaXMga2VsYW1pbikuPGJyPiAtICoqT3JkaW5hbCoqOiBNZW1pbGlraSB1cnV0YW4gKGNvbnRvaDogdGluZ2thdCBwZW5kaWRpa2FuKS4gfA0KfCAqKkNvbnRvaCoqICAgICAgICAgICAgIHwgQmVyYXQgYmFkYW4gKGtnKSwgdGluZ2dpIGJhZGFuIChjbSksIGp1bWxhaCBrZW5kYXJhYW4uICAgICAgICAgICAgICAgICAgICAgICAgICB8IEplbmlzIGtlbGFtaW4gKGxha2ktbGFraS9wZXJlbXB1YW4pLCB3YXJuYSBmYXZvcml0IChtZXJhaC9iaXJ1KS4gICAgICAgICAgICAgfA0KfCAqKlNpZmF0IERhdGEqKiAgICAgICAgIHwgRGFwYXQgZGlsYWt1a2FuIG9wZXJhc2kgbWF0ZW1hdGlzIHNlcGVydGkgcGVuanVtbGFoYW4sIHBlbmd1cmFuZ2FuLCByYXRhLXJhdGEuICAgfCBUaWRhayBkYXBhdCBkaWxha3VrYW4gb3BlcmFzaSBtYXRlbWF0aXMsIGhhbnlhIGRpZ3VuYWthbiB1bnR1ayBwZW5nZWxvbXBva2FuLnwNCnwgKipUdWp1YW4gUGVuZ2d1bmFhbioqICB8IFVudHVrIG1lbmd1a3VyIGt1YW50aXRhcyBhdGF1IGJlc2FyYW4gc3VhdHUgdmFyaWFiZWwuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgVW50dWsgbWVuZ2lkZW50aWZpa2FzaSBhdGF1IG1lbmdlbG9tcG9ra2FuIG9iamVrIGJlcmRhc2Fya2FuIGthdGVnb3JpLiAgICAgICB8DQp8ICoqUmVwcmVzZW50YXNpKiogICAgICAgfCBCaWFzYW55YSBkYWxhbSBiZW50dWsgYW5na2EuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgQmlhc2FueWEgZGFsYW0gYmVudHVrIHRla3MgYXRhdSBrb2RlIG51bWVyaWsgdGFucGEgYXJ0aSBtYXRlbWF0aXMuICAgICAgICAgICB8DQoNCg0KIyMgVWt1cmFuIFBlbXVzYXRhbiBkYW4gUGVueWViYXJhbg0KDQojIyMJTWVhbiAoUmF0YS1yYXRhKQ0KDQpNZWFuIGFkYWxhaCBqdW1sYWggdG90YWwgc2VtdWEgbmlsYWkgZGliYWdpIGRlbmdhbiBqdW1sYWggZGF0YS4NCg0KKipLYXBhbiBwZW5nZ3VuYWFuIG1lYW4gbWVuamFkaSBrdXJhbmcgdGVwYXQ/KioNCg0KLQlTYWF0IGRhdGEgbWVtaWxpa2kgb3V0bGllciwga2FyZW5hIG91dGxpZXIgZGFwYXQgbWVueWViYWJrYW4gcmF0YS1yYXRhIG1lbmphZGkgdGlkYWsgcmVwcmVzZW50YXRpZi4NCg0KQ29udG9oOiBKaWthIHBlbmRhcGF0YW4gZGkgc3VhdHUgd2lsYXlhaCByYXRhLXJhdGEgYWRhbGFoIDUganV0YSwgdGV0YXBpIGFkYSBzYXR1IG9yYW5nIHlhbmcgYmVycGVuZ2hhc2lsYW4gMTAwIGp1dGEsIHJhdGEtcmF0YSBwZW5kYXBhdGFuIGFrYW4gbmFpayBkcmFzdGlzLg0KDQojIyMJTWVkaWFuDQoNCk1lZGlhbiBhZGFsYWggbmlsYWkgdGVuZ2FoIGRhcmkgZGF0YSB5YW5nIHRlbGFoIGRpdXJ1dGthbi4NCg0KKipNZW5nYXBhIG1lZGlhbiBzZXJpbmcgZGlndW5ha2FuIHVudHVrIGRhdGEgZGVuZ2FuIG91dGxpZXI/KioNCg0KLQlNZWRpYW4gc2VyaW5nIGRpZ3VuYWthbiB1bnR1ayBkYXRhIHlhbmcgbWVtaWxpa2kgb3V0bGllciBrYXJlbmEgbWVkaWFuIGxlYmloIHJvYnVzdCBhdGF1IHRhaGFuIHRlcmhhZGFwIHBlbmdhcnVoIG5pbGFpIGVrc3RyZW0gZGliYW5kaW5na2FuIHJhdGEtcmF0YSAobWVhbikuIEhhbCBpbmkgZGlrYXJlbmFrYW4gbWVkaWFuIHRpZGFrIHRlcnBlbmdhcnVoIG9sZWggbmlsYWkgZWtzdHJlbSwgbWVkaWFuIG1ld2FraWxpIGRhdGEgc2VjYXJhIGxlYmloIGFrdXJhdCwgZGFuIG1lZGlhbiBsZWJpaCBzdGFiaWwgcGFkYSBkYXRhIGFzaW1ldHJpa3MNCg0KQ29udG9oOiBIYXJnYSBydW1haCBkaSBzdWF0dSB3aWxheWFoIGxlYmloIHRlcGF0IGRpd2FraWxpIG9sZWggbWVkaWFuIGRhcmlwYWRhIG1lYW4gamlrYSBhZGEgYmViZXJhcGEgcnVtYWggeWFuZyBoYXJnYW55YSBqYXVoIGxlYmloIHRpbmdnaS4NCg0KIyMjCU1vZHVzDQoNCk1vZHVzIGFkYWxhaCBuaWxhaSB5YW5nIHBhbGluZyBzZXJpbmcgbXVuY3VsIGRhbGFtIGRhdGFzZXQuDQoNCioqS2FwYW4gdWt1cmFuIGluaSBsZWJpaCByZWxldmFuIGRhcmlwYWRhIG1lYW4gYXRhdSBtZWRpYW4/KioNCg0KLQlNb2R1cyBsZWJpaCByZWxldmFuIGRpZ3VuYWthbiBkYWxhbSBhbmFsaXNpcyBkYXRhIGthdGVnb3Jpa2FsLCBrZXRpa2EgZm9rdXNueWEgYWRhbGFoIG1lbmVudHVrYW4gZWxlbWVuIHlhbmcgcGFsaW5nIHNlcmluZyBtdW5jdWwsIHNlcGVydGkgd2FybmEgZmF2b3JpdCBhdGF1IHByb2R1ayB0ZXJsYXJpcy4gU2VsYWluIGl0dSwgbW9kdXMgc2FuZ2F0IGJlcmd1bmEgZGFsYW0gZGF0YSBkZW5nYW4gZGlzdHJpYnVzaSBtdWx0aW1vZGFsIHVudHVrIG1lbmdpZGVudGlmaWthc2kgbmlsYWktbmlsYWkgZG9taW5hbiwgc2VydGEgZGFsYW0gZGF0YSBkaXNrcml0IGRlbmdhbiBqdW1sYWggbmlsYWkgdGVyYmF0YXMuIE1vZHVzIGp1Z2EgbWVuamFkaSBwaWxpaGFuIHRlcGF0IGppa2EgbWVhbiBhdGF1IG1lZGlhbiB0aWRhayBtZXdha2lsaSBkYXRhIGRlbmdhbiBiYWlrLCB0ZXJ1dGFtYSBkYWxhbSBzaXR1YXNpIGRpIG1hbmEgbmlsYWkgZnJla3VlbnNpIGRvbWluYW4gbWVtaWxpa2kgbWFrbmEgeWFuZyBsZWJpaCBzaWduaWZpa2FuIGRpYmFuZGluZ2thbiByYXRhLXJhdGEgYXRhdSBuaWxhaSB0ZW5nYWguDQoNCg0KIyMjIFN0YW5kYXIgRGV2aWFzaQ0KDQpTdGFuZGFyIERldmlhc2kgdW50dWsgTWVuZ3VrdXIgcGVueWViYXJhbiBkYXRhIGRhcmkgcmF0YS1yYXRhLg0KDQoqKkFwYSBhcnRpIGRhcmkgbmlsYWkgc3RhbmRhciBkZXZpYXNpIGtlY2lsIGF0YXUgYmVzYXIgZGFsYW0gc2VidWFoIGRhdGFzZXQ/KioNCg0KLQlLZWNpbDoNCg0KRGF0YSBjZW5kZXJ1bmcgYmVyZGVrYXRhbiBkZW5nYW4gcmF0YS1yYXRhLCBtZW51bmp1a2thbiBrb25zaXN0ZW5zaSBhdGF1IGhvbW9nZW5pdGFzIGRhbGFtIG5pbGFpLW5pbGFpIGRhdGEuIENvbnRvaDogRGFsYW0gdWppYW4sIGppa2EgbmlsYWkgcmF0YS1yYXRhIGFkYWxhaCA4MCBkYW4gc3RhbmRhciBkZXZpYXNpIGtlY2lsIChtaXNhbG55YSwgMiksIGluaSBtZW51bmp1a2thbiBzZWJhZ2lhbiBiZXNhciBzaXN3YSBtZW5kYXBhdGthbiBuaWxhaSBtZW5kZWthdGkgODAuDQoNCi0JQmVzYXI6IA0KDQpEYXRhIG1lbWlsaWtpIHBlbnllYmFyYW4geWFuZyBsdWFzIGRhcmkgcmF0YS1yYXRhLCBtZW51bmp1a2thbiBhZGFueWEgdmFyaWFzaSBhdGF1IGhldGVyb2dlbml0YXMgeWFuZyBzaWduaWZpa2FuIGRhbGFtIG5pbGFpLW5pbGFpIGRhdGEuIENvbnRvaDogSmlrYSByYXRhLXJhdGEgbmlsYWkgdWppYW4gYWRhbGFoIDgwIGRlbmdhbiBzdGFuZGFyIGRldmlhc2kgYmVzYXIgKG1pc2FsbnlhLCAxNSksIGluaSBtZW51bmp1a2thbiBzZWJhZ2lhbiBzaXN3YSBtZW5kYXBhdCBuaWxhaSBzYW5nYXQgdGluZ2dpIChtaXNhbG55YSwgOTUpLCBzZW1lbnRhcmEgeWFuZyBsYWluIG1lbmRhcGF0IG5pbGFpIHNhbmdhdCByZW5kYWggKG1pc2FsbnlhLCA2NSkuDQoNCg0KIyMgVmlzdWFsaXNhc2kgRGF0YQ0KDQojIyMgSGlzdG9ncmFtOg0KDQoqKkRlZmluaXNpOioqIEdyYWZpayB5YW5nIGRpZ3VuYWthbiB1bnR1ayBtZW51bmp1a2thbiBkaXN0cmlidXNpIGZyZWt1ZW5zaSBkYXRhIG51bWVyaWsuIERhdGEgZGlrZWxvbXBva2thbiBrZSBkYWxhbSBpbnRlcnZhbCAoYmluKS4NCg0KKipUdWp1YW46KiogTWVtYWhhbWkgcG9sYSBkaXN0cmlidXNpIChub3JtYWwsIG1pcmluZywgYmltb2RhbCwgZGxsLikuDQoNCioqQ29udG9oOioqIE1lbmFtcGlsa2FuIGRpc3RyaWJ1c2kgdGluZ2dpIGJhZGFuIHNpc3dhIGRpIHNlYnVhaCBzZWtvbGFoLg0KDQojIyMJQm94cGxvdDoNCg0KKipEZWZpbmlzaToqKiBEaWFncmFtIHlhbmcgbWVuZ2dhbWJhcmthbiBwZXJzZWJhcmFuIGRhdGEgYmVyZGFzYXJrYW4ga3VhcnRpbCAoUTEsIG1lZGlhbiwgUTMpIGRhbiBvdXRsaWVyLg0KDQoqKlR1anVhbjoqKiBNZW5naWRlbnRpZmlrYXNpIHBlbnllYmFyYW4gZGF0YSwgbmlsYWkgZWtzdHJpbSAob3V0bGllciksIGRhbiBwb3Npc2kgbmlsYWkgdGVuZ2FoIChtZWRpYW4pLg0KDQoqKkNvbnRvaDoqKiBNZW51bmp1a2thbiBwZW55ZWJhcmFuIG5pbGFpIHVqaWFuIHNpc3dhIGRhbiBuaWxhaS1uaWxhaSB5YW5nIGVrc3RyZW0uDQoNCiMjIwlEaWFncmFtIEJhdGFuZyAoQmFyIENoYXJ0KToNCg0KKipEZWZpbmlzaToqKiBHcmFmaWsgZGVuZ2FuIGJhdGFuZyB2ZXJ0aWthbCBhdGF1IGhvcml6b250YWwgdW50dWsgbWVtYmFuZGluZ2thbiBkYXRhIGthdGVnb3Jpay4gUGFuamFuZyBiYXRhbmcgbWVudW5qdWtrYW4gZnJla3VlbnNpIGF0YXUganVtbGFoLg0KDQoqKlR1anVhbjoqKiBNZW1iYW5kaW5na2FuIGRhdGEgYW50YXIga2F0ZWdvcmkuDQoNCioqQ29udG9oOioqIE1lbWJhbmRpbmdrYW4ganVtbGFoIG1vYmlsIGJlcmRhc2Fya2FuIGplbmlzIHRyYW5zbWlzaSAobWFudWFsIHZzIG90b21hdGlzKS4NCg0KDQojIyBBbmFsaXNpcyBLb3JlbGFzaQ0KDQpLb3JlbGFzaSBhZGFsYWggdGVrbmlrIHN0YXRpc3Rpa2EgeWFuZyBkaWd1bmFrYW4gdW50dWsgbWVuZ3VrdXIgZGFuIG1lbmdnYW1iYXJrYW4gaHVidW5nYW4gYW50YXJhIGR1YSB2YXJpYWJlbC4gRGFsYW0gYW5hbGlzaXMga29yZWxhc2ksIGtpdGEgYmVydXNhaGEgdW50dWsgbWVtYWhhbWkgYXBha2FoIHBlcnViYWhhbiBwYWRhIHNhdHUgdmFyaWFiZWwgYmVyaHVidW5nYW4gZGVuZ2FuIHBlcnViYWhhbiBwYWRhIHZhcmlhYmVsIGxhaW5ueWEuIEtvcmVsYXNpIHRpZGFrIG1lbnVuanVra2FuIHNlYmFiLWFraWJhdCwgdGV0YXBpIGhhbnlhIGh1YnVuZ2FuIGFudGFyYSB2YXJpYWJlbC4gS29yZWxhc2kgbWVtaWxpa2kgMyBqZW5pcywgeWFpdHU6IEtvcmVsYXNpIFBvc2l0aWYsIEtvcmVsYXNpIE5lZ2F0aWYsIGRhbiBLb3JlbGFzaSBOb2wuDQoNCiMjIwlLb3JlbGFzaSBQb3NpdGlmDQoNCi0JKipEZWZpbmlzaToqKiBLb3JlbGFzaSBwb3NpdGlmIHRlcmphZGkga2V0aWthIGR1YSB2YXJpYWJlbCBiZXJnZXJhayBkYWxhbSBhcmFoIHlhbmcgc2FtYS4gSW5pIGJlcmFydGkgYmFod2Ega2V0aWthIHNhdHUgdmFyaWFiZWwgbWVuaW5na2F0LCB2YXJpYWJlbCBsYWlubnlhIGp1Z2EgY2VuZGVydW5nIG1lbmluZ2thdC4gU2ViYWxpa255YSwgamlrYSBzYXR1IHZhcmlhYmVsIG1lbnVydW4sIHZhcmlhYmVsIGxhaW5ueWEganVnYSBjZW5kZXJ1bmcgbWVudXJ1bi4NCg0KLQkqKktvZWZpc2llbiBLb3JlbGFzaToqKiBOaWxhaSBrb2VmaXNpZW4ga29yZWxhc2kgKHIpIGJlcmtpc2FyIGFudGFyYSAwIGhpbmdnYSAxLiBTZW1ha2luIG1lbmRla2F0aSAxLCBzZW1ha2luIGt1YXQgaHVidW5nYW4gcG9zaXRpZm55YS4NCg0KLSAqKkNvbnRvaDoqKiBKYW0gQmVsYWphciBkYW4gTmlsYWkgVWppYW46IE1pc2Fsa2FuIGtpdGEgbWVuZ3VtcHVsa2FuIGRhdGEgZGFyaSBzZWtlbG9tcG9rIHNpc3dhIHRlbnRhbmcgYmVyYXBhIGJhbnlhayBqYW0geWFuZyBtZXJla2EgaGFiaXNrYW4gdW50dWsgYmVsYWphciBkYW4gbmlsYWkgdWppYW4geWFuZyBtZXJla2EgcGVyb2xlaC4gSmlrYSBraXRhIG1lbmVtdWthbiBiYWh3YSBzaXN3YSB5YW5nIGJlbGFqYXIgbGViaWggYmFueWFrIGNlbmRlcnVuZyBtZW5kYXBhdGthbiBuaWxhaSB5YW5nIGxlYmloIHRpbmdnaSwgbWFrYSBraXRhIGRhcGF0IG1lbmdhdGFrYW4gYWRhIGtvcmVsYXNpIHBvc2l0aWYgYW50YXJhIGphbSBiZWxhamFyIGRhbiBuaWxhaSB1amlhbi4NCg0KLQkqKkNvbnRvaCBWaXN1YWw6KiogR3JhZmlrIHNjYXR0ZXIgcGxvdCB5YW5nIG1lbnVuanVra2FuIHRpdGlrLXRpdGlrIGRhdGEgeWFuZyBtZW1iZW50dWsgZ2FyaXMgbmFpayBkYXJpIGtpcmkgYmF3YWgga2Uga2FuYW4gYXRhcy4NCg0KIyMjCUtvcmVsYXNpIE5lZ2F0aWYNCg0KLSAqKkRlZmluaXNpOioqIEtvcmVsYXNpIG5lZ2F0aWYgdGVyamFkaSBrZXRpa2EgZHVhIHZhcmlhYmVsIGJlcmdlcmFrIGRhbGFtIGFyYWggeWFuZyBiZXJsYXdhbmFuLiBJbmkgYmVyYXJ0aSBiYWh3YSBrZXRpa2Egc2F0dSB2YXJpYWJlbCBtZW5pbmdrYXQsIHZhcmlhYmVsIGxhaW5ueWEgY2VuZGVydW5nIG1lbnVydW4uDQoNCi0JKipLb2VmaXNpZW4gS29yZWxhc2k6KiogTmlsYWkga29lZmlzaWVuIGtvcmVsYXNpIChyKSBiZXJraXNhciBhbnRhcmEgLTEgaGluZ2dhIDAuIFNlbWFraW4gbWVuZGVrYXRpIC0xLCBzZW1ha2luIGt1YXQgaHVidW5nYW4gbmVnYXRpZm55YS4NCg0KLQkqKkNvbnRvaDoqKiBKYW0gTWVub250b24gVFYgZGFuIE5pbGFpIFVqaWFuOiBKaWthIGtpdGEgbWVuZ3VtcHVsa2FuIGRhdGEgdGVudGFuZyBiZXJhcGEgYmFueWFrIHdha3R1IHlhbmcgZGloYWJpc2thbiBzaXN3YSB1bnR1ayBtZW5vbnRvbiBUViBkYW4gbmlsYWkgdWppYW4gbWVyZWthLCBkYW4gbWVuZW11a2FuIGJhaHdhIHNpc3dhIHlhbmcgbWVuZ2hhYmlza2FuIGxlYmloIGJhbnlhayB3YWt0dSBtZW5vbnRvbiBUViBjZW5kZXJ1bmcgbWVuZGFwYXRrYW4gbmlsYWkgeWFuZyBsZWJpaCByZW5kYWgsIG1ha2Ega2l0YSBkYXBhdCBtZW5nYXRha2FuIGFkYSBrb3JlbGFzaSBuZWdhdGlmIGFudGFyYSBqYW0gbWVub250b24gVFYgZGFuIG5pbGFpIHVqaWFuLg0KDQotCSoqQ29udG9oIFZpc3VhbDoqKiBHcmFmaWsgc2NhdHRlciBwbG90IHlhbmcgbWVudW5qdWtrYW4gdGl0aWstdGl0aWsgZGF0YSB5YW5nIG1lbWJlbnR1ayBnYXJpcyB0dXJ1biBkYXJpIGtpcmkgYXRhcyBrZSBrYW5hbiBiYXdhaC4NCg0KIyMjCUtvcmVsYXNpIE5vbA0KDQotICoqRGVmaW5pc2k6KiogS29yZWxhc2kgbm9sIHRlcmphZGkga2V0aWthIHRpZGFrIGFkYSBodWJ1bmdhbiB5YW5nIHNpZ25pZmlrYW4gYW50YXJhIGR1YSB2YXJpYWJlbC4gSW5pIGJlcmFydGkgYmFod2EgcGVydWJhaGFuIHBhZGEgc2F0dSB2YXJpYWJlbCB0aWRhayBtZW1wZW5nYXJ1aGkgdmFyaWFiZWwgbGFpbm55YS4NCg0KLQkqKktvZWZpc2llbiBLb3JlbGFzaToqKiBOaWxhaSBrb2VmaXNpZW4ga29yZWxhc2kgKHIpIG1lbmRla2F0aSAwLCBtZW51bmp1a2thbiBiYWh3YSB0aWRhayBhZGEgcG9sYSB5YW5nIGplbGFzIGRhbGFtIGh1YnVuZ2FuIGFudGFyYSBrZWR1YSB2YXJpYWJlbC4NCg0KLQkqKkNvbnRvaDoqKiBUaW5nZ2kgQmFkYW4gZGFuIFNrb3IgVWppYW4gTWF0ZW1hdGlrYTogSmlrYSBraXRhIG1lbmd1bXB1bGthbiBkYXRhIHRlbnRhbmcgdGluZ2dpIGJhZGFuIHNpc3dhIGRhbiBza29yIHVqaWFuIG1hdGVtYXRpa2EgbWVyZWthLCBkYW4gdGlkYWsgbWVuZW11a2FuIHBvbGEgeWFuZyBqZWxhcywga2l0YSBkYXBhdCBtZW5nYXRha2FuIGJhaHdhIHRpZGFrIGFkYSBrb3JlbGFzaSBhbnRhcmEgdGluZ2dpIGJhZGFuIGRhbiBrZW1hbXB1YW4gbWF0ZW1hdGlrYS4NCg0KLQkqKkNvbnRvaCBWaXN1YWw6KiogR3JhZmlrIHNjYXR0ZXIgcGxvdCB5YW5nIG1lbnVuanVra2FuIHRpdGlrLXRpdGlrIGRhdGEgeWFuZyB0ZXJzZWJhciB0YW5wYSBwb2xhIHlhbmcgamVsYXMuDQoNClVudHVrIGxlYmloIHNpbmdrYXRueWEsIGRhcGF0IG1lbGloYXQgdGFiZWwgcGVyYmVkYWFuIGFudGFyYSBLb3JlbGFzaSBQb3NpdGlmLCBLb3JlbGFzaSBOZWdhdGlmLCBkYW4gS29yZWxhc2kgTm9sOg0KDQp8ICoqQXNwZWsqKiAgICAgICAgICAgICAgIHwgKipLb3JlbGFzaSBQb3NpdGlmKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAqKktvcmVsYXNpIE5lZ2F0aWYqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICoqS29yZWxhc2kgTm9sKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18DQp8ICoqRGVmaW5pc2kqKiAgICAgICAgICAgIHwgSHVidW5nYW4gZGkgbWFuYSBqaWthIHNhdHUgdmFyaWFiZWwgbWVuaW5na2F0LCB2YXJpYWJlbCBsYWluIGp1Z2EgbWVuaW5na2F0LiB8IEh1YnVuZ2FuIGRpIG1hbmEgamlrYSBzYXR1IHZhcmlhYmVsIG1lbmluZ2thdCwgdmFyaWFiZWwgbGFpbiBtZW51cnVuLiB8IFRpZGFrIGFkYSBodWJ1bmdhbiBhbnRhcmEgZHVhIHZhcmlhYmVsLiAgICAgICAgICAgICB8DQp8ICoqQXJhaCBIdWJ1bmdhbioqICAgICAgIHwgU2VqYWxhbiAocG9zaXRpZikuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBCZXJsYXdhbmFuIChuZWdhdGlmKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgVGlkYWsgYWRhIHBvbGEgaHVidW5nYW4geWFuZyBqZWxhcy4gICAgICAgICAgICAgICAgfA0KfCAqKktvZWZpc2llbiBLb3JlbGFzaSoqICB8IEFudGFyYSBcKDBcKSBkYW4gXCgrMVwpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgQW50YXJhIFwoMFwpIGRhbiBcKC0xXCkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFwoMFwpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQp8ICoqQ29udG9oKiogICAgICAgICAgICAgIHwgLSBUaW5nZ2kgYmFkYW4gZGFuIGJlcmF0IGJhZGFuLjxicj4tIFBlbmRpZGlrYW4gZGFuIHBlbmdoYXNpbGFuLiB8IC0gSGFyZ2EgYmFyYW5nIGRhbiBqdW1sYWggcGVtYmVsaWFuLjxicj4tIEphcmFrIHRlbXB1aCBkYW4gc2lzYSBiYWhhbiBiYWthci4gfCAtIFRpbmdnaSBiYWRhbiBkYW4gc2tvciB1amlhbi48YnI+LSBXYXJuYSBmYXZvcml0IGRhbiBwZW5naGFzaWxhbi4gfA0KfCAqKkludGVycHJldGFzaSBHcmFmaWsqKiB8IFRpdGlrLXRpdGlrIGRhdGEgcGFkYSBncmFmaWsgY2VuZGVydW5nIG5haWsgYmVyc2FtYS1zYW1hLiB8IFRpdGlrLXRpdGlrIGRhdGEgcGFkYSBncmFmaWsgY2VuZGVydW5nIGJlcmdlcmFrIGJlcmxhd2FuYW4gYXJhaC4gfCBUaXRpay10aXRpayBkYXRhIHRlcnNlYmFyIGFjYWsgdGFucGEgcG9sYSB0ZXJ0ZW50dS4gfA0KDQoNCiMjIFVqaSBIaXBvdGVzaXMNCg0KVWppIGhpcG90ZXNpcyBhZGFsYWggbWV0b2RlIHN0YXRpc3Rpa2EgeWFuZyBkaWd1bmFrYW4gdW50dWsgbWVuZ3VqaSBhc3Vtc2kgYXRhdSBrbGFpbSB0ZW50YW5nIHBhcmFtZXRlciBwb3B1bGFzaSBiZXJkYXNhcmthbiBkYXRhIHNhbXBlbC4gUHJvc2VzIGluaSBtZWxpYmF0a2FuIGJlYmVyYXBhIGxhbmdrYWggeWFuZyBzaXN0ZW1hdGlzIHVudHVrIG1lbWFzdGlrYW4gYmFod2Ega2VzaW1wdWxhbiB5YW5nIGRpYW1iaWwgYWRhbGFoIHZhbGlkIGRhbiBkYXBhdCBkaWFuZGFsa2FuLg0KDQojIyMgTGFuZ2thaC1MYW5na2FoIFV0YW1hIGRhbGFtIE1lbGFrdWthbiBVamkgSGlwb3Rlc2lzDQoNCiMjIyMJTWVydW11c2thbiBIaXBvdGVzaXM6DQotIEhpcG90ZXNpcyBOb2wgKEgwKTogSW5pIGFkYWxhaCBwZXJueWF0YWFuIHlhbmcgbWVueWF0YWthbiB0aWRhayBhZGEgZWZlayBhdGF1IHRpZGFrIGFkYSBwZXJiZWRhYW4uIEgwIGJpYXNhbnlhIG1lbmNha3VwIGFzdW1zaSBiYWh3YSBwYXJhbWV0ZXIgcG9wdWxhc2kgc2FtYSBkZW5nYW4gbmlsYWkgdGVydGVudHUgKG1pc2FsbnlhLCByYXRhLXJhdGEgcG9wdWxhc2kgPSA1MCkuDQotCUhpcG90ZXNpcyBBbHRlcm5hdGlmIChIMSBhdGF1IEhhKTogSW5pIGFkYWxhaCBwZXJueWF0YWFuIHlhbmcgbWVueWF0YWthbiBhZGFueWEgZWZlayBhdGF1IHBlcmJlZGFhbi4gSDEgYWRhbGFoIGtlYmFsaWthbiBkYXJpIEgwIGRhbiBtZW5jYWt1cCBhc3Vtc2kgYmFod2EgcGFyYW1ldGVyIHBvcHVsYXNpIHRpZGFrIHNhbWEgZGVuZ2FuIG5pbGFpIHRlcnRlbnR1IChtaXNhbG55YSwgcmF0YS1yYXRhIHBvcHVsYXNpIOKJoCA1MCkuDQoNCiMjIyMJTWVuZXRhcGthbiBUaW5na2F0IFNpZ25pZmlrYW4gKM6xKToNClRpbmdrYXQgc2lnbmlmaWthbiBhZGFsYWggcHJvYmFiaWxpdGFzIHVudHVrIG1lbm9sYWsgaGlwb3Rlc2lzIG5vbCBrZXRpa2EgaGlwb3Rlc2lzIG5vbCBpdHUgYmVuYXIuIFVtdW1ueWEsIG5pbGFpIM6xIHlhbmcgZGlndW5ha2FuIGFkYWxhaCAwLDA1ICg1JSkgYXRhdSAwLDAxICgxJSkuIEluaSBiZXJhcnRpIGJhaHdhIGtpdGEgYmVyc2VkaWEgbWVuZXJpbWEgcmlzaWtvIDUlIGF0YXUgMSUgdW50dWsgbWVtYnVhdCBrZXNhbGFoYW4gdGlwZSBJIChtZW5vbGFrIEgwIHlhbmcgYmVuYXIpLg0KDQojIyMjCU1lbmd1bXB1bGthbiBEYXRhIGRhbiBNZWxha3VrYW4gVWppIFN0YXRpc3RpazoNCkt1bXB1bGthbiBkYXRhIHlhbmcgcmVsZXZhbiBkYXJpIHNhbXBlbCB5YW5nIGRpcGlsaWguIFNldGVsYWggaXR1LCBwaWxpaCB1amkgc3RhdGlzdGlrIHlhbmcgc2VzdWFpIChtaXNhbG55YSwgdWppIHQsIHVqaSB6LCB1amkgY2hpLXNxdWFyZSkgYmVyZGFzYXJrYW4gamVuaXMgZGF0YSBkYW4gaGlwb3Rlc2lzIHlhbmcgZGl1amkuCUhpdHVuZyBuaWxhaSBzdGF0aXN0aWsgdWppIGJlcmRhc2Fya2FuIGRhdGEgeWFuZyBkaWt1bXB1bGthbi4NCg0KIyMjIwlNZW5lbnR1a2FuIE5pbGFpIEtyaXRpcyBkYW4gTWVuZ2hpdHVuZyBQLVZhbHVlOg0KLQlOaWxhaSBLcml0aXM6IFRlbnR1a2FuIGJhdGFzYW4gbmlsYWkgc3RhdGlzdGlrIHVqaSB5YW5nIGFrYW4gZGlndW5ha2FuIHVudHVrIG1lbm9sYWsgSDAuIEluaSBiaWFzYW55YSBkaXRlbnR1a2FuIGJlcmRhc2Fya2FuIGRpc3RyaWJ1c2kgc3RhdGlzdGlrIHlhbmcgcmVsZXZhbiAobWlzYWxueWEsIGRpc3RyaWJ1c2kgbm9ybWFsIGF0YXUgdCkuDQotCVAtVmFsdWU6IEhpdHVuZyBwLXZhbHVlLCB5YWl0dSBwcm9iYWJpbGl0YXMgbWVuZGFwYXRrYW4gaGFzaWwgeWFuZyBzYW1hIGF0YXUgbGViaWggZWtzdHJlbSBkYXJpIHlhbmcgZGlhbWF0aSwgamlrYSBIMCBiZW5hci4gUC12YWx1ZSBkaWd1bmFrYW4gdW50dWsgbWVuZW50dWthbiBzaWduaWZpa2Fuc2kgaGFzaWwuDQoNCiMjIyMJTWVtYnVhdCBLZXB1dHVzYW46DQotCUJhbmRpbmdrYW4gcC12YWx1ZSBkZW5nYW4gdGluZ2thdCBzaWduaWZpa2FuICjOsSk6DQotCUppa2EgcC12YWx1ZSDiiaQgzrEsIHRvbGFrIEgwIChhZGEgY3VrdXAgYnVrdGkgdW50dWsgbWVuZHVrdW5nIEgxKS4NCi0JSmlrYSBwLXZhbHVlID4gzrEsIGdhZ2FsIG1lbm9sYWsgSDAgKHRpZGFrIGFkYSBjdWt1cCBidWt0aSB1bnR1ayBtZW5kdWt1bmcgSDEpLg0KLQlBbHRlcm5hdGlmbnlhLCBiYW5kaW5na2FuIG5pbGFpIHN0YXRpc3RpayB1amkgZGVuZ2FuIG5pbGFpIGtyaXRpczoNCi0JSmlrYSBuaWxhaSBzdGF0aXN0aWsgdWppIGJlcmFkYSBkaSBsdWFyIGJhdGFzIG5pbGFpIGtyaXRpcywgdG9sYWsgSDAuDQotCUppa2EgbmlsYWkgc3RhdGlzdGlrIHVqaSBiZXJhZGEgZGFsYW0gYmF0YXMgbmlsYWkga3JpdGlzLCBnYWdhbCBtZW5vbGFrIEgwLg0KDQojIyMjCU1lbnlpbXB1bGthbiBIYXNpbDoNCkJ1YXQga2VzaW1wdWxhbiBiZXJkYXNhcmthbiBrZXB1dHVzYW4geWFuZyBkaWFtYmlsLiBKZWxhc2thbiBhcGEgYXJ0aSBoYXNpbCB0ZXJzZWJ1dCBkYWxhbSBrb250ZWtzIHBlbmVsaXRpYW4gYXRhdSBhbmFsaXNpcyB5YW5nIGRpbGFrdWthbi4gTWlzYWxueWEsIGppa2EgSDAgZGl0b2xhaywgQW5kYSBkYXBhdCBtZW55YXRha2FuIGJhaHdhIGFkYSBidWt0aSB5YW5nIGN1a3VwIHVudHVrIG1lbmR1a3VuZyBoaXBvdGVzaXMgYWx0ZXJuYXRpZi4NCg0KIyMjIE1lbmdhcGEgVWppIEhpcG90ZXNpcyBQZW50aW5nIGRhbGFtIEFuYWxpc2lzIERhdGE/DQpVamkgaGlwb3Rlc2lzIHBlbnRpbmcgZGFsYW0gYW5hbGlzaXMgZGF0YSBrYXJlbmEgbWVtYmFudHUgbWVuZW50dWthbiBhcGFrYWggc3VhdHUgaGFzaWwgYXRhdSB0ZW11YW4gZGFyaSBkYXRhIGRhcGF0IGRpamVsYXNrYW4gb2xlaCBrZWJldHVsYW4gYXRhdSBtZW1pbGlraSBkYXNhciB5YW5nIHNpZ25pZmlrYW4gc2VjYXJhIHN0YXRpc3Rpay4gVWppIGhpcG90ZXNpcyBwZW50aW5nIGthcmVuYSBtZW1iZXJpa2FuIG1ldG9kZSB5YW5nIHNpc3RlbWF0aXMgZGFuIG9ieWVrdGlmIHVudHVrIG1lbmdhbmFsaXNpcyBkYXRhLCBtZW5ndXJhbmdpIHJpc2lrbyBrZXNhbGFoYW4gZGFsYW0gcGVuZ2FtYmlsYW4ga2VwdXR1c2FuLCBkYW4gbWVuZHVrdW5nIHBlbmdhbWJpbGFuIGtlc2ltcHVsYW4geWFuZyB2YWxpZCBkYW4gdGVycGVyY2F5YS4gSGFsIGluaSBtZW5qYWRpa2FubnlhIGVzZW5zaWFsIGRhbGFtIHBlbmVsaXRpYW4gZGFuIGFuYWxpc2lzIGRhdGEgZGkgYmVyYmFnYWkgYmlkYW5nLiBBbGFzYW4tYWxhc2FuIGxhaW5ueWEgYWRhbGFoIHNlYmFnYWkgYmVyaWt1dDoNCg0KIyMjIwlQZW5nYW1iaWxhbiBLZXB1dHVzYW4geWFuZyBCZXJiYXNpcyBEYXRhDQpVamkgaGlwb3Rlc2lzIG1lbWJlcmlrYW4ga2VyYW5na2Ega2VyamEgeWFuZyBzaXN0ZW1hdGlzIHVudHVrIG1lbWJ1YXQga2VwdXR1c2FuIGJlcmRhc2Fya2FuIGRhdGEuIEluaSBtZW1iYW50dSBwZW5lbGl0aSBkYW4gcGVuZ2FtYmlsIGtlcHV0dXNhbiB1bnR1ayBtZW5naGluZGFyaSBrZXNhbGFoYW4geWFuZyBtdW5na2luIHRlcmphZGkgamlrYSBrZXB1dHVzYW4gZGlhbWJpbCBiZXJkYXNhcmthbiBhc3Vtc2kgYXRhdSBpbnR1aXNpIHNlbWF0YS4NCg0KIyMjIwlWYWxpZGFzaSBLbGFpbSANClVqaSBoaXBvdGVzaXMgbWVtdW5na2lua2FuIHBlbmVsaXRpIHVudHVrIG1lbmd1amkga2xhaW0gYXRhdSB0ZW9yaSB5YW5nIGFkYS4gRGVuZ2FuIG1lbGFrdWthbiB1amkgaGlwb3Rlc2lzLCBwZW5lbGl0aSBkYXBhdCBtZW5lbnR1a2FuIGFwYWthaCBhZGEgY3VrdXAgYnVrdGkgdW50dWsgbWVuZHVrdW5nIGF0YXUgbWVub2xhayBrbGFpbSB0ZXJzZWJ1dC4NCg0KIyMjIwlNZW5ndXJhbmdpIEJpYXMNCkRlbmdhbiBtZW5nZ3VuYWthbiBtZXRvZGUgeWFuZyB0ZXJzdGFuZGFyaXNhc2ksIHVqaSBoaXBvdGVzaXMgbWVtYmFudHUgbWVuZ3VyYW5naSBiaWFzIGRhbGFtIGFuYWxpc2lzIGRhdGEuIEluaSBtZW1hc3Rpa2FuIGJhaHdhIGtlcHV0dXNhbiB5YW5nIGRpYW1iaWwgZGlkYXNhcmthbiBwYWRhIGFuYWxpc2lzIHlhbmcgb2JqZWt0aWYgZGFuIHRpZGFrIGRpcGVuZ2FydWhpIG9sZWggcHJlZmVyZW5zaSBwcmliYWRpLg0KDQojIyMjCU1lbmVudHVrYW4gU2lnbmlmaWthbnNpDQpVamkgaGlwb3Rlc2lzIG1lbWJhbnR1IGRhbGFtIG1lbmVudHVrYW4gYXBha2FoIGhhc2lsIHlhbmcgZGlwZXJvbGVoIGRhcmkgc2FtcGVsIGRhcGF0IGRpZ2VuZXJhbGlzYXNpa2FuIGtlIHBvcHVsYXNpIHlhbmcgbGViaWggYmVzYXIuIEluaSBwZW50aW5nIGRhbGFtIHBlbmVsaXRpYW4gaWxtaWFoIGRhbiBhcGxpa2FzaSBwcmFrdGlzIGRpIGJlcmJhZ2FpIGJpZGFuZywgc2VwZXJ0aSBrZXNlaGF0YW4sIGVrb25vbWksIGRhbiBpbG11IHNvc2lhbC4NCg0KIyMjIwlEYXNhciB1bnR1ayBBbmFsaXNpcyBMYW5qdXRhbg0KSGFzaWwgZGFyaSB1amkgaGlwb3Rlc2lzIHNlcmluZyBrYWxpIG1lbmphZGkgZGFzYXIgdW50dWsgYW5hbGlzaXMgbGViaWggbGFuanV0LCBzZXBlcnRpIGFuYWxpc2lzIHJlZ3Jlc2kgYXRhdSBtb2RlbCBwcmVkaWt0aWYuIEluaSBtZW1iYW50dSBkYWxhbSBtZW1haGFtaSBodWJ1bmdhbiB5YW5nIGxlYmloIGtvbXBsZWtzIGFudGFyYSB2YXJpYWJlbC4NCg0KDQojIyBQZW5nZ3VuYWFuIFNvZnR3YXJlIFN0YXRpc3Rpa2ENCg0KRGFsYW0gYW5hbGlzaXMgc3RhdGlzdGlrYSwgdGVyZGFwYXQgYmVyYmFnYWkgcGVyYW5na2F0IGx1bmFrIGRhbiB0b29scyB5YW5nIGRhcGF0IGRpZ3VuYWthbiB1bnR1ayBtZW5nb2xhaCBkYW4gbWVuZ2FuYWxpc2lzIGRhdGEuIEJlcmlrdXQgYWRhbGFoIGJlYmVyYXBhIHBlcmFuZ2thdCBsdW5hayB5YW5nIHVtdW0gZGlndW5ha2FuIGRhbGFtIGFuYWxpc2lzIHN0YXRpc3Rpa2E6DQoNCiMjIyBSDQrigKIJKipEZXNrcmlwc2k6KiogUiBhZGFsYWggYmFoYXNhIHBlbXJvZ3JhbWFuIGRhbiBsaW5na3VuZ2FuIHBlcmFuZ2thdCBsdW5hayB1bnR1ayBhbmFsaXNpcyBzdGF0aXN0aWthIGRhbiBncmFmaWsuDQrigKIJKipLZXVuZ2d1bGFuOioqIFNhbmdhdCBmbGVrc2liZWwsIG1lbWlsaWtpIGJhbnlhayBwYWtldCB1bnR1ayBhbmFsaXNpcyBsYW5qdXRhbiwgZGFuIGdyYXRpcy4NCg0KIyMjIE1pY3Jvc29mdCBFeGNlbA0K4oCiCSoqRGVza3JpcHNpOioqIFNhbGFoIHNhdHUgYXBsaWthc2kgc3ByZWFkc2hlZXQgeWFuZyBwYWxpbmcgcG9wdWxlciwgRXhjZWwgbWVtaWxpa2kgYmVyYmFnYWkgZnVuZ3NpIHN0YXRpc3RpayBkYW4gYWxhdCBhbmFsaXNpcyBkYXRhLg0K4oCiCSoqS2V1bmdndWxhbjoqKiBNdWRhaCBkaWd1bmFrYW4sIGFudGFybXVrYSB5YW5nIGludHVpdGlmLCBkYW4gYmFueWFrIHRlcnNlZGlhIHR1dG9yaWFsLg0KDQojIyMJUHl0aG9uDQrigKIJKipEZXNrcmlwc2k6KiogUHl0aG9uIGFkYWxhaCBiYWhhc2EgcGVtcm9ncmFtYW4geWFuZyBwb3B1bGVyIGRlbmdhbiBiYW55YWsgcHVzdGFrYSB1bnR1ayBhbmFsaXNpcyBkYXRhLCBzZXBlcnRpIFBhbmRhcywgTnVtUHksIGRhbiBTY2lQeS4NCuKAogkqKktldW5nZ3VsYW46KiogTXVkYWggZGlwZWxhamFyaSwgYmFueWFrIGRpZ3VuYWthbiBkYWxhbSBpbG11IGRhdGEsIGRhbiBtZW1pbGlraSBrb211bml0YXMgeWFuZyBiZXNhci4NCg0KIyMjCVNQU1MgKFN0YXRpc3RpY2FsIFBhY2thZ2UgZm9yIHRoZSBTb2NpYWwgU2NpZW5jZXMpDQrigKIJKipEZXNrcmlwc2k6KiogU1BTUyBhZGFsYWggcGVyYW5na2F0IGx1bmFrIHlhbmcgZGlyYW5jYW5nIHVudHVrIGFuYWxpc2lzIHN0YXRpc3RpaywgdGVydXRhbWEgZGFsYW0gaWxtdSBzb3NpYWwuDQrigKIJKipLZXVuZ2d1bGFuOioqIEFudGFybXVrYSBncmFmaXMgeWFuZyByYW1haCBwZW5nZ3VuYSBkYW4gYmFueWFrIGZ1bmdzaSBzdGF0aXN0aWsgeWFuZyBzaWFwIHBha2FpLg0KDQojIyMJU0FTIChTdGF0aXN0aWNhbCBBbmFseXNpcyBTeXN0ZW0pDQrigKIJKipEZXNrcmlwc2k6KiogU0FTIGFkYWxhaCBwZXJhbmdrYXQgbHVuYWsgeWFuZyBkaWd1bmFrYW4gdW50dWsgYW5hbGlzaXMgZGF0YSwgbWFuYWplbWVuIGRhdGEsIGRhbiBhbmFsaXNpcyBwcmVkaWt0aWYuDQrigKIJKipLZXVuZ2d1bGFuOioqIEt1YXQgZGFsYW0gYW5hbGlzaXMgZGF0YSBiZXNhciBkYW4gbWVtaWxpa2kgYmFueWFrIGZpdHVyIHVudHVrIGFuYWxpc2lzIGxhbmp1dGFuLg0KDQojIyMJU3RhdGENCuKAogkqKkRlc2tyaXBzaToqKiBTdGF0YSBhZGFsYWggcGVyYW5na2F0IGx1bmFrIHlhbmcgZGlndW5ha2FuIHVudHVrIGFuYWxpc2lzIGRhdGEsIG1hbmFqZW1lbiBkYXRhLCBkYW4gZ3JhZmlrLg0K4oCiCSoqS2V1bmdndWxhbjoqKiBTYW5nYXQgYmFpayB1bnR1ayBhbmFsaXNpcyBkYXRhIHBhbmVsIGRhbiBtZW1pbGlraSBiYW55YWsgZnVuZ3NpIHVudHVrIGFuYWxpc2lzIGVrb25vbWV0cmlrYS4NCg0KIyMjCU1BVExBQg0K4oCiCSoqRGVza3JpcHNpOioqIE1BVExBQiBhZGFsYWggYmFoYXNhIHBlbXJvZ3JhbWFuIGRhbiBsaW5na3VuZ2FuIHVudHVrIGtvbXB1dGFzaSBudW1lcmlrIGRhbiB2aXN1YWxpc2FzaSBkYXRhLg0K4oCiCSoqS2V1bmdndWxhbjoqKiBLdWF0IGRhbGFtIGFuYWxpc2lzIG1hdGVtYXRpcyBkYW4gcGVtb2RlbGFuLg0KDQojIyMgS2V1bmdndWxhbiBSIHNlYmFnYWkgU29mdHdhcmUgUGlsaWhhbg0KS2FtaSBha2FuIG1lbWZva3Vza2FuIHBhZGEgUi4gSmFkaSBSIG1lbWlsaWtpIGJhbnlhayBrZXVuZ2d1bGFuLCBzZXBlcnRpOg0KDQotCSoqT3BlbiBTb3VyY2UgZGFuIEdyYXRpczoqKiANClIgYWRhbGFoIHBlcmFuZ2thdCBsdW5hayBvcGVuIHNvdXJjZSwgeWFuZyBiZXJhcnRpIGRhcGF0IGRpdW5kdWggZGFuIGRpZ3VuYWthbiBzZWNhcmEgZ3JhdGlzLiBJbmkgbWVtYnVhdG55YSBzYW5nYXQgbWVuYXJpayBiYWdpIG1haGFzaXN3YSwgcGVuZWxpdGksIGRhbiBwcm9mZXNpb25hbCB5YW5nIHRpZGFrIGluZ2luIG1lbmdlbHVhcmthbiBiaWF5YSB1bnR1ayBwZXJhbmdrYXQgbHVuYWsgYmVybGlzZW5zaS4NCg0KLQkqKkZsZWtzaWJpbGl0YXMgZGFuIEVrc3RlbnNpYmlsaXRhczoqKiANClIgbWVtaWxpa2kgYmFueWFrIHBha2V0IChsaWJyYXJpZXMpIHlhbmcgZGFwYXQgZGlpbnN0YWwgdW50dWsgbWVsYWt1a2FuIGJlcmJhZ2FpIGFuYWxpc2lzIHN0YXRpc3RpaywgbXVsYWkgZGFyaSBhbmFsaXNpcyBkZXNrcmlwdGlmIGhpbmdnYSBhbmFsaXNpcyBsYW5qdXRhbiBzZXBlcnRpIHJlZ3Jlc2ksIGFuYWxpc2lzIG11bHRpdmFyaWF0LCBkYW4gbWFjaGluZSBsZWFybmluZy4gUGFrZXQtcGFrZXQgaW5pIGRpa2VtYmFuZ2thbiBvbGVoIGtvbXVuaXRhcyBwZW5nZ3VuYSBSIGRpIHNlbHVydWggZHVuaWEuDQoNCi0JKipLZW1hbXB1YW4gVmlzdWFsaXNhc2kgRGF0YToqKiANClIgbWVtaWxpa2kga2VtYW1wdWFuIHZpc3VhbGlzYXNpIGRhdGEgeWFuZyBzYW5nYXQgYmFpay4gRGVuZ2FuIHBha2V0IHNlcGVydGkgZ2dwbG90MiwgcGVuZ2d1bmEgZGFwYXQgbWVtYnVhdCBncmFmaWsgeWFuZyBrb21wbGVrcyBkYW4gbWVuYXJpayBkZW5nYW4gcmVsYXRpZiBtdWRhaC4gVmlzdWFsaXNhc2kgeWFuZyBiYWlrIHNhbmdhdCBwZW50aW5nIGRhbGFtIGFuYWxpc2lzIGRhdGEgdW50dWsgbWVueWFtcGFpa2FuIGluZm9ybWFzaSBkZW5nYW4gamVsYXMuDQoNCi0JKipLb211bml0YXMgeWFuZyBCZXNhcjoqKiANClIgbWVtaWxpa2kga29tdW5pdGFzIHBlbmdndW5hIHlhbmcgYmVzYXIgZGFuIGFrdGlmLiBJbmkgYmVyYXJ0aSBhZGEgYmFueWFrIHN1bWJlciBkYXlhLCB0dXRvcmlhbCwgZGFuIGZvcnVtIGRpc2t1c2kgeWFuZyB0ZXJzZWRpYSB1bnR1ayBtZW1iYW50dSBwZW5nZ3VuYSBiYXJ1IGRhbiBiZXJwZW5nYWxhbWFuLiBLb211bml0YXMgaW5pIGp1Z2EgYmVya29udHJpYnVzaSBwYWRhIHBlbmdlbWJhbmdhbiBwYWtldCBiYXJ1IGRhbiBwZW1iYXJ1YW4gcGVyYW5na2F0IGx1bmFrLg0KDQotCSoqS2VtYW1wdWFuIHVudHVrIE1lbmdvbGFoIERhdGEgQmVzYXI6KioNClIgZGFwYXQgZGlndW5ha2FuIHVudHVrIG1lbmdhbmFsaXNpcyBkYXRhc2V0IGJlc2FyLCB0ZXJ1dGFtYSBkZW5nYW4gcGFrZXQgc2VwZXJ0aSBkYXRhLnRhYmxlIGRhbiBkcGx5ciB5YW5nIGRpcmFuY2FuZyB1bnR1ayBlZmlzaWVuc2kgZGFsYW0gcGVuZ29sYWhhbiBkYXRhLg0KDQotCSoqSW50ZWdyYXNpIGRlbmdhbiBCYWhhc2EgTGFpbjoqKg0KUiBkYXBhdCBkaWludGVncmFzaWthbiBkZW5nYW4gYmFoYXNhIHBlbXJvZ3JhbWFuIGxhaW4gc2VwZXJ0aSBQeXRob24sIEMrKywgZGFuIEphdmEsIG1lbXVuZ2tpbmthbiBwZW5nZ3VuYSB1bnR1ayBtZW1hbmZhYXRrYW4ga2VrdWF0YW4gbWFzaW5nLW1hc2luZyBiYWhhc2EgZGFsYW0gYW5hbGlzaXMgZGF0YS4NCg0KLQkqKkR1a3VuZ2FuIHVudHVrIEFuYWxpc2lzIFN0YXRpc3RpayBMYW5qdXRhbjoqKiBSIHNhbmdhdCBrdWF0IGRhbGFtIGFuYWxpc2lzIHN0YXRpc3RpayBsYW5qdXRhbiwgdGVybWFzdWsgYW5hbGlzaXMgcmVncmVzaSwgYW5hbGlzaXMgdmFyaWFucyAoQU5PVkEpLCBhbmFsaXNpcyBtdWx0aXZhcmlhdCwgZGFuIGJhbnlhayBtZXRvZGUgc3RhdGlzdGlrIGxhaW5ueWEuDQoNCg0KIyMgSW50ZXJwcmV0YXNpIFN0YXRpc3Rpaw0KDQoqKkRhdGE6KioNCg0KLSBNZWFuID0gNzUNCg0KLSBNZWRpYW4gPSA3Mg0KDQotIFN0YW5kYXIgRGV2aWFzaSA9IDEwDQoNCiMjIyBNZWFuIGRhbiBNZWRpYW4NCk1lYW4gKHJhdGEtcmF0YSkgYWRhbGFoIGp1bWxhaCBzZWx1cnVoIGRhdGEgZGliYWdpIGRlbmdhbiBiYW55YWtueWEgZGF0YS4gRGFsYW0ga2FzdXMgaW5pLCBtZWFuIGFkYWxhaCA3NSwgYXJ0aW55YSByYXRhLXJhdGEgbmlsYWkgZGF0YSBhZGFsYWggNzUuIE1lZGlhbiAobmlsYWkgdGVuZ2FoKSBhZGFsYWggbmlsYWkgeWFuZyBiZXJhZGEgZGkgdGVuZ2FoIGppa2EgZGF0YSBkaXVydXRrYW4gZGFyaSBrZWNpbCBrZSBiZXNhci4gTWVkaWFuIGRhbGFtIGthc3VzIGluaSBhZGFsYWggNzIsIGFydGlueWEgc2ViYWdpYW4gYmVzYXIgZGF0YSBsZWJpaCBrZWNpbCBkYXJpIG1lYW4gKGthcmVuYSBtZWRpYW4gbGViaWggcmVuZGFoKS4gTWFrYSBkYWxhbSBrYXN1cyBpbmksIGRhcGF0IGRpc2ltcHVsa2FuOg0KDQotIEtldGlrYSBtZWFuIGxlYmloIGJlc2FyIGRhcmkgbWVkaWFuLCBiaWFzYW55YSBhZGEgYmViZXJhcGEgbmlsYWkgeWFuZyBzYW5nYXQgYmVzYXIgKG91dGxpZXIpIHlhbmcgbWVuYWlra2FuIHJhdGEtcmF0YS4gDQoNCi0gSW5pIG1lbnVuanVra2FuIGJhaHdhIGRpc3RyaWJ1c2kgZGF0YSBjZW5kZXJ1bmcgbWlyaW5nIGtlIGthbmFuIChwb3NpdGl2ZWx5IHNrZXdlZCkuDQoNCiMjIyBTdGFuZGFyIERldmlhc2kNClN0YW5kYXIgZGV2aWFzaSBtZW5nZ2FtYmFya2FuIHNlYmVyYXBhIGphdWggZGF0YSBtZW55ZWJhciBkYXJpIHJhdGEtcmF0YS4NCkRhbGFtIGthc3VzIGluaSwgc3RhbmRhciBkZXZpYXNpIGJlcm5pbGFpIDEwIGRlbmdhbiByYXRhLXJhdGEgYWRhbGFoIDc1LCBkYW4gc2ViYWdpYW4gYmVzYXIgZGF0YSBiZXJhZGEgZGFsYW0gamFyYWsgwrExMCBkYXJpIG1lYW4sIHlhaXR1IGRhYWxhbSByZW50YW5nIDY1ICg3NSAtIDEwKSBoaW5nZ2EgODUgKDc1ICsgMTApLCBoYWwgaW5pIGRpZGFwYXRrYW4gZGVuZ2FuIHJ1bXVzIG1lYW4gwrEgc3RhbmRhciBkZXZpYXNpLiBNYWthIGRhbGFtIGthc3VzIGluaSwgZGFwYXQgZGlzaW1wdWxrYW46DQoNCi0gUGVueWViYXJhbiBkYXRhIHRpZGFrIHRlcmxhbHUgYmVzYXIuDQoNCi0gRGF0YSBjdWt1cCB0ZXJwdXNhdCBkaSBzZWtpdGFyIHJhdGEtcmF0YSwgdGV0YXBpIGFkYSBiZWJlcmFwYSBuaWxhaSB5YW5nIGphdWggbGViaWggYmVzYXIsIHNlc3VhaSBkZW5nYW4gc2tld25lc3MgdGFkaS4NCg0KLSBQZW55ZWJhcmFuIGluaSBjdWt1cCBzaWduaWZpa2FuIHRldGFwaSB0aWRhayB0ZXJsYWx1IGJlc2FyLCBtZW51bmp1a2thbiBhZGFueWEgdmFyaWFzaSB5YW5nIG1vZGVyYXQgZGFsYW0gZGF0YXNldC4NCg0KYGBge3IsIG1hc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGVjaG89RkFMU0V9DQojIExvYWQgUGFja2FnZQ0KbGlicmFyeShnZ3Bsb3QyKQ0KDQojIFNpbXVsYXNpIGRhdGEgYmVyZGFzYXJrYW4gbWVhbiwgbWVkaWFuLCBkYW4gc3RhbmRhciBkZXZpYXNpDQpzZXQuc2VlZCgxMjMpICMgVW50dWsgcmVwbGlrYXNpIGhhc2lsIHlhbmcga29uc2lzdGVuDQptZWFuX3ZhbHVlIDwtIDc1DQpzZF92YWx1ZSA8LSAxMA0KbiA8LSAxMDAwICMgVWt1cmFuIHNhbXBlbA0KDQojIE1lbWJ1YXQgZGF0YSBzaW11bGFzaSAocG9zaXRpdmVseSBza2V3ZWQpDQpkYXRhIDwtIHJub3JtKG4sIG1lYW4gPSBtZWFuX3ZhbHVlLCBzZCA9IHNkX3ZhbHVlKQ0KZGF0YSA8LSBpZmVsc2UoZGF0YSA+IG1lYW5fdmFsdWUsIGRhdGEgKyByZXhwKG4sIHJhdGUgPSAwLjEpLCBkYXRhKQ0KDQojIE1lbWJ1YXQgZGF0YWZyYW1lDQpkYXRhX2ZyYW1lIDwtIGRhdGEuZnJhbWUoVmFsdWVzID0gZGF0YSkNCg0KIyBNZWFuIGRhbiBNZWRpYW4NCm1lYW5fZGF0YSA8LSBtZWFuKGRhdGEpDQptZWRpYW5fZGF0YSA8LSBtZWRpYW4oZGF0YSkNCg0KIyBWaXN1YWxpc2FzaSBtZW5nZ3VuYWthbiBnZ3Bsb3QyDQpnZ3Bsb3QoZGF0YV9mcmFtZSwgYWVzKHggPSBWYWx1ZXMpKSArDQogIGdlb21faGlzdG9ncmFtKGFlcyh5ID0gLi5kZW5zaXR5Li4pLCBiaW5zID0gMzAsIGZpbGwgPSAiIzY5YjNhMiIsIGNvbG9yID0gImJsYWNrIiwgYWxwaGEgPSAwLjcpICsNCiAgc3RhdF9mdW5jdGlvbihmdW4gPSBkbm9ybSwgYXJncyA9IGxpc3QobWVhbiA9IG1lYW5fdmFsdWUsIHNkID0gc2RfdmFsdWUpLCANCiAgICAgICAgICAgICAgICBjb2xvciA9ICJyZWQiLCBzaXplID0gMS4yLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArDQogIGdlb21fdmxpbmUoYWVzKHhpbnRlcmNlcHQgPSBtZWFuX2RhdGEpLCBjb2xvciA9ICJibHVlIiwgbGluZXR5cGUgPSAiZG90dGVkIiwgc2l6ZSA9IDEpICsNCiAgZ2VvbV92bGluZShhZXMoeGludGVyY2VwdCA9IG1lZGlhbl9kYXRhKSwgY29sb3IgPSAiZ3JlZW4iLCBsaW5ldHlwZSA9ICJkb3R0ZWQiLCBzaXplID0gMSkgKw0KICBsYWJzKHRpdGxlID0gIkRpc3RyaWJ1c2kgRGF0YSBkZW5nYW4gTWVhbiBkYW4gTWVkaWFuIiwNCiAgICAgICB4ID0gIk5pbGFpIiwNCiAgICAgICB5ID0gIktlcGFkYXRhbiIsDQogICAgICAgY2FwdGlvbiA9ICJHYXJpcyBiaXJ1OiBNZWFuIHwgR2FyaXMgaGlqYXU6IE1lZGlhbiB8IEdhcmlzIG1lcmFoOiBLdXJ2YSBub3JtYWwiKSArDQogIHRoZW1lX21pbmltYWwoYmFzZV9zaXplID0gMTUpDQpgYGANCg0KIyMjIERpc3RyaWJ1c2kgRGF0YQ0KLSBEaXN0cmlidXNpIGRhdGEgaW5pIHRpZGFrIHNpbWV0cmlzIGRhbiBzZWRpa2l0IG1pcmluZyBrZSBrYW5hbiBrYXJlbmEgbWVhbiBsZWJpaCBiZXNhciBkYXJpIG1lZGlhbi4NCg0KLSBEYXRhIG1lbWlsaWtpIHBlbnllYmFyYW4gbW9kZXJhdCBkaSBzZWtpdGFyIHJhdGEtcmF0YSwgZGFuIHNlYmFnaWFuIGJlc2FyIG5pbGFpIGJlcmFkYSBkYWxhbSByZW50YW5nIDY1IGhpbmdnYSA4NS4NCg0KLSBBZGFueWEgbmlsYWktbmlsYWkgeWFuZyBsZWJpaCBiZXNhciBkYXJpIHJhdGEtcmF0YSAob3V0bGllciBwb3NpdGlmKSBtZW1lbmdhcnVoaSBkaXN0cmlidXNpIGluaS4NCg0KIyMgQ29udG9oIEthc3VzDQpMYW5na2FoLWxhbmdrYWggc3RhdGlzdGlrIGRhc2FyIGRhbGFtIHN1YXR1IGhpcG90ZXNpczoNCg0KIyMjIERlc2tyaXBzaSBEYXRhIChTdGF0aXN0aWsgRGVza3JpcHRpZikNCkxhbmdrYWggcGVydGFtYSBhZGFsYWggbWVtYWhhbWkgZGF0YSB5YW5nIGRpbWlsaWtpIHVudHVrIG1lbmRhcGF0a2FuIGdhbWJhcmFuIHVtdW0uDQoNCjEuICBIaXR1bmcgdWt1cmFuIHRlbmRlbnNpIHNlbnRyYWw6DQoNCioqTWVhbjoqKiBSYXRhLXJhdGEgbmlsYWkgZGF0YS4NCg0KKipNZWRpYW46KiogTmlsYWkgdGVuZ2FoIGRhdGEga2V0aWthIGRpdXJ1dGthbi4NCg0KKipNb2R1czoqKiBOaWxhaSB5YW5nIHBhbGluZyBzZXJpbmcgbXVuY3VsLg0KDQoyLiBIaXR1bmcgdWt1cmFuIHBlbnllYmFyYW46DQoNCioqU3RhbmRhciBkZXZpYXNpOioqIE1lbmd1a3VyIHNlYmFyYW4gZGF0YSBkYXJpIHJhdGEtcmF0YS4NCg0KKipSZW50YW5nOioqIFNlbGlzaWggYW50YXJhIG5pbGFpIHRlcmJlc2FyIGRhbiB0ZXJrZWNpbC4NCg0KMy4gVmlzdWFsaXNhc2k6DQoNCkd1bmFrYW4gZ3JhZmlrIHNlcGVydGkgaGlzdG9ncmFtIGF0YXUgYm94cGxvdCB1bnR1ayBtZWxpaGF0IGRpc3RyaWJ1c2kgZGF0YSBkYW4ga2VtdW5na2luYW4gYWRhbnlhIG91dGxpZXIuDQoNCioqQ29udG9oIEthc3VzOioqDQoNCk1pc2FsbnlhLCBBbmRhIG1lbmd1a3VyIHRpbmdnaSBiYWRhbiBkYXJpIGR1YSBrZWxvbXBvazogcHJpYSBkYW4gd2FuaXRhLg0KDQotICoqU3RhdGlzdGlrIGRlc2tyaXB0aWY6KiogSGl0dW5nIHJhdGEtcmF0YSwgbWVkaWFuLCBkYW4gc3RhbmRhciBkZXZpYXNpIHRpbmdnaSBiYWRhbiBwYWRhIG1hc2luZy1tYXNpbmcga2Vsb21wb2sgdW50dWsgbWVtYWhhbWkgc2ViZXJhcGEgYmVzYXIgdmFyaWFzaW55YSBkYW4gcG9zaXNpIGRhdGEuDQoNCiMjIyBNZW5naGl0dW5nIEtvcmVsYXNpIGFudGFyYSBEdWEgVmFyaWFiZWwNCkxhbmdrYWgga2VkdWEgYWRhbGFoIG1lbmlsYWkgaHVidW5nYW4gYW50YXJhIGR1YSB2YXJpYWJlbC4NCg0KMS4gVGVudHVrYW4gamVuaXMga29yZWxhc2kgeWFuZyB0ZXBhdC4gR3VuYWthbiBrb3JlbGFzaSBQZWFyc29uIGppa2EgZGF0YSBiZXJkaXN0cmlidXNpIG5vcm1hbCBkYW4gbGluaWVyLg0KDQoyLiBIaXR1bmcga29lZmlzaWVuIGtvcmVsYXNpICjwnZGfKSB5YW5nIGJlcmFkYSBhbnRhcmEgLTEgaGluZ2dhICsxOg0KDQotICrwnZGfKiA9ICsxIDogS29yZWxhc2kgcG9zaXRpZiBzZW1wdXJuYSAoZHVhIHZhcmlhYmVsIGJlcmdlcmFrIHNlYXJhaCkuDQotICrwnZGfKiA9IOKIkjEgOiBLb3JlbGFzaSBuZWdhdGlmIHNlbXB1cm5hIChkdWEgdmFyaWFiZWwgYmVyZ2VyYWsgYmVybGF3YW5hbikuDQotICrwnZGfKiA9IDAgIDogVGlkYWsgYWRhIGtvcmVsYXNpIChkdWEgdmFyaWFiZWwgdGlkYWsgdGVya2FpdCkuDQoNCioqQ29udG9oIEthc3VzOioqDQoNCkFuZGEgaW5naW4gbWVuZ2V0YWh1aSBhcGFrYWggYWRhIGh1YnVuZ2FuIGFudGFyYSB0aW5nZ2kgYmFkYW4gZGFuIGJlcmF0IGJhZGFuLg0KDQpKaWthIGhhc2lsIGtvcmVsYXNpICrwnZGfKiA9IDAuOCwgaW5pIG1lbnVuanVra2FuIGJhaHdhIHRpbmdnaSBiYWRhbiBkYW4gYmVyYXQgYmFkYW4gYmVya29yZWxhc2kgcG9zaXRpZiBrdWF0LCBhcnRpbnlhIHNlbWFraW4gdGluZ2dpIHNlc2VvcmFuZywgc2VtYWtpbiBiZXJhdCBiYWRhbiBtZXJla2EuDQoNCiMjIyBVamkgSGlwb3Rlc2lzIHVudHVrIE1lbWJhbmRpbmdrYW4gRHVhIEtlbG9tcG9rIERhdGENCkxhbmdrYWgga2V0aWdhIGFkYWxhaCBtZW5ndWppIHBlcmJlZGFhbiBhbnRhcmEgZHVhIGtlbG9tcG9rIHVudHVrIG1lbmdldGFodWkgYXBha2FoIGFkYSBwZXJiZWRhYW4geWFuZyBzaWduaWZpa2FuIHNlY2FyYSBzdGF0aXN0aWsuDQoNCjEuICoqUnVtdXNrYW4gSGlwb3Rlc2lzOioqDQoNCi0gSGlwb3Rlc2lzIG5vbCAoJEhfMCQpOiBUaWRhayBhZGEgcGVyYmVkYWFuIGFudGFyYSBkdWEga2Vsb21wb2suDQoNCi0gSGlwb3Rlc2lzIGFsdGVybmF0aWYgKCRIX/CdkY4kKSA6IEFkYSBwZXJiZWRhYW4gYW50YXJhIGR1YSBrZWxvbXBvay4NCg0KMi4gKipQaWxpaCBVamkgU3RhdGlzdGlrOioqDQoNCi0gR3VuYWthbiB1amkgdC1pbmRlcGVuZGVuIHVudHVrIG1lbWJhbmRpbmdrYW4gZHVhIGtlbG9tcG9rIGRlbmdhbiBkYXRhIG51bWVyaWsgeWFuZyBiZXJkaXN0cmlidXNpIG5vcm1hbC4NCg0KLSBKaWthIGRhdGEgdGlkYWsgbm9ybWFsLCBndW5ha2FuIFVqaSBNYW5uLVdoaXRuZXkuDQoNCjMuICoqTGFrdWthbiBVamkgZGFuIEludGVycHJldGFzaToqKg0KLSBIaXR1bmcgbmlsYWkgcCB1bnR1ayB1amkgdGVyc2VidXQuDQoNCi0gSmlrYSBwIDwgMC4wNSwgdG9sYWsgaGlwb3Rlc2lzIG5vbCAoJEhfMCQpIGRhbiB0ZXJpbWEgaGlwb3Rlc2lzIGFsdGVybmF0aWYgKCRIX/CdkY4kKSAoYXJ0aW55YSBhZGEgcGVyYmVkYWFuIHNpZ25pZmlrYW4pLg0KDQotIEppa2EgcCDiiaUgMC4wNSwgdGlkYWsgYWRhIGN1a3VwIGJ1a3RpIHVudHVrIG1lbm9sYWsgKCRIXzAkKSAoYXJ0aW55YSB0aWRhayBhZGEgcGVyYmVkYWFuIHNpZ25pZmlrYW4pLg0KDQoqKkNvbnRvaCBLYXN1czoqKg0KDQpBbmRhIGluZ2luIG1lbWJhbmRpbmdrYW4gcmF0YS1yYXRhIHRpbmdnaSBiYWRhbiBwcmlhIGRhbiB3YW5pdGEuDQoNCkppa2EgaGFzaWwgdWppIHQgbWVudW5qdWtrYW4gcCA9IDAuMDMsIGJlcmFydGkgYWRhIHBlcmJlZGFhbiBzaWduaWZpa2FuIGFudGFyYSByYXRhLXJhdGEgdGluZ2dpIGJhZGFuIHByaWEgZGFuIHdhbml0YSAoa2FyZW5hIPCdkZ08MC4wNSkuDQoNCiMjIEtlc2ltcHVsYW4NCg0KIyMjIFBlbnRpbmdueWEgU3RhdGlzdGlrYSBkYWxhbSBBbmFsaXNpcyBEYXRhDQpTdGF0aXN0aWthIHNhbmdhdCBwZW50aW5nIGRhbGFtIGFuYWxpc2lzIGRhdGEga2FyZW5hIG1lbWJlcmlrYW4gYWxhdCBkYW4gbWV0b2RlIHVudHVrIG1lbWFoYW1pLCBtZW5nb3JnYW5pc2lyLCBkYW4gbWVuYXJpayBrZXNpbXB1bGFuIHlhbmcgdmFsaWQgZGFyaSBkYXRhLiBCZXJpa3V0IGFkYWxhaCBiZWJlcmFwYSBhbGFzYW4gbWVuZ2FwYSBzdGF0aXN0aWthIHNhbmdhdCBwZW50aW5nOg0KDQojIyMjIE1lbmdvcmdhbmlzaXIgZGFuIE1lcmFuZ2t1bSBEYXRhDQotIFN0YXRpc3Rpa2EgZGVza3JpcHRpZiBtZW11bmdraW5rYW4ga2l0YSB1bnR1ayBtZXJhbmdrdW0gZGFuIG1lbmdnYW1iYXJrYW4gZGF0YSBkYWxhbSBiZW50dWsgeWFuZyBsZWJpaCBtdWRhaCBkaXBhaGFtaSwgc2VwZXJ0aSBtZW5nZ3VuYWthbiB1a3VyYW4gcHVzYXQgZGF0YSAobWVhbiwgbWVkaWFuLCBtb2R1cykgZGFuIHVrdXJhbiBwZW55ZWJhcmFuIChzdGFuZGFyIGRldmlhc2ksIHZhcmlhbnNpKS4NCi0gSGFsIGluaSBtZW1idWF0IGtpdGEgZGFwYXQgbWVtYWhhbWkgZ2FtYmFyYW4gdW11bSBkYXRhIGRlbmdhbiBsZWJpaCBjZXBhdCB0YW5wYSBwZXJsdSBtZW1lcmlrc2Egc2V0aWFwIG5pbGFpIHNhdHUgcGVyIHNhdHUuDQoNCiMjIyMgTWVtYmFudHUgTWVuZ2lkZW50aWZpa2FzaSBQb2xhIGRhbiBUcmVuDQotIFN0YXRpc3Rpa2EgbWVtdW5na2lua2FuIGtpdGEgdW50dWsgbWVuZ2lkZW50aWZpa2FzaSBwb2xhLCB0cmVuLCBhdGF1IGh1YnVuZ2FuIHlhbmcgYWRhIGRhbGFtIGRhdGEsIGJhaWsgaXR1IGh1YnVuZ2FuIGFudGFyYSB2YXJpYWJlbCAobWVuZ2d1bmFrYW4ga29yZWxhc2kpIGF0YXUgcGVydWJhaGFuIGRhbGFtIGRhdGEgZGFyaSB3YWt0dSBrZSB3YWt0dSAobWVuZ2d1bmFrYW4gcmVncmVzaSkuDQotIEluaSBzYW5nYXQgYmVyZ3VuYSBkYWxhbSBwZW5nYW1iaWxhbiBrZXB1dHVzYW4sIG1pc2FsbnlhIGRhbGFtIGJpc25pcyB1bnR1ayBtZW1haGFtaSBwZXJpbGFrdSBwZWxhbmdnYW4gYXRhdSBkYWxhbSBwZW5lbGl0aWFuIGlsbWlhaCB1bnR1ayBtZW5lbXVrYW4gaHVidW5nYW4gYW50YXIgdmFyaWFiZWwuDQoNCiMjIyMgTWVtYmFudHUgZGFsYW0gUGVuZ2FtYmlsYW4gS2VwdXR1c2FuIHlhbmcgVGVwYXQNCi0gRGVuZ2FuIG1lbmdndW5ha2FuIHVqaSBoaXBvdGVzaXMgZGFuIGFuYWxpc2lzIGluZmVyZW5zaWFsLCBzdGF0aXN0aWthIG1lbWJlcmlrYW4gZGFzYXIgeWFuZyBrdWF0IHVudHVrIHBlbmdhbWJpbGFuIGtlcHV0dXNhbiB5YW5nIGxlYmloIGJhaWsuIE1pc2FsbnlhLCBraXRhIGJpc2EgbWVuZW50dWthbiBhcGFrYWggcGVyYmVkYWFuIGFudGFyYSBkdWEga2Vsb21wb2sgc2lnbmlmaWthbiBhdGF1IGFwYWthaCBzdWF0dSB0aW5kYWthbiBhdGF1IGtlYmlqYWthbiBha2FuIGVmZWt0aWYuDQotIFN0YXRpc3Rpa2EgbWVtdW5na2lua2FuIGtpdGEgdW50dWsgbWVuZ2hpbmRhcmkga2VwdXR1c2FuIHlhbmcgZGlkYXNhcmthbiBwYWRhIGtlYmV0dWxhbioqIGRhbiBtZW5nYW5kYWxrYW4gZGF0YSB5YW5nIGt1YXQgc2ViYWdhaSBkYXNhciB1bnR1ayBrZXB1dHVzYW4uDQoNCiMjIyMgTWVuZ3VyYW5naSBCaWFzIGRhbiBLZXNhbGFoYW4NCi0gU3RhdGlzdGlrYSBtZW1iYW50dSBtZW1pbmltYWxrYW4gYmlhcyBkYWxhbSBhbmFsaXNpcyBkYXRhIGRhbiBtZW1iZXJpa2FuIG1ldG9kZSB5YW5nIHNpc3RlbWF0aXMgdW50dWsgbWVuZ3VtcHVsa2FuLCBtZW5nb2xhaCwgZGFuIG1lbmdhbmFsaXNpcyBkYXRhLg0KLSBEZW5nYW4gbWVuZ2d1bmFrYW4gbWV0b2RlIHN0YXRpc3RpayB5YW5nIHRlcGF0LCBraXRhIGJpc2EgbGViaWggeWFraW4gYmFod2Ega2VzaW1wdWxhbiB5YW5nIGRpYW1iaWwgYmVyZGFzYXJrYW4gZGF0YSBhZGFsYWggYWt1cmF0IGRhbiB0aWRhayB0ZXJwZW5nYXJ1aCBvbGVoIGZha3RvciBla3N0ZXJuYWwgeWFuZyB0aWRhayByZWxldmFuLg0KDQojIyMjIE1lbmdoYXNpbGthbiBQcmVkaWtzaSBkYW4gRXN0aW1hc2kNCi0gRGVuZ2FuIG1lbmdndW5ha2FuIHRla25payBzdGF0aXN0aWsgc2VwZXJ0aSByZWdyZXNpIGF0YXUgYW5hbGlzaXMgdGltZSBzZXJpZXMsIGtpdGEgZGFwYXQgbWVtYnVhdCBwcmVkaWtzaSBhdGF1IGVzdGltYXNpIHRlbnRhbmcgbWFzYSBkZXBhbiBhdGF1IHRlbnRhbmcgcG9wdWxhc2kgeWFuZyBsZWJpaCBiZXNhciBiZXJkYXNhcmthbiBkYXRhIHlhbmcgYWRhLg0KLSBNaXNhbG55YSwgZGVuZ2FuIGFuYWxpc2lzIHJlZ3Jlc2ksIGtpdGEgZGFwYXQgbWVtcHJlZGlrc2kgcGVuanVhbGFuIG1hc2EgZGVwYW4gYmVyZGFzYXJrYW4gZGF0YSBwZW5qdWFsYW4gaGlzdG9yaXMuDQoNCiMjIyMgTWVueWVkaWFrYW4gQnVrdGkgdW50dWsgUGVuZWxpdGlhbiBkYW4gUGVuZ2VtYmFuZ2FuDQotIERhbGFtIHBlbmVsaXRpYW4gaWxtaWFoLCBzdGF0aXN0aWthIG1lbWJlcmlrYW4gY2FyYSB1bnR1ayBtZW5ndWppIGhpcG90ZXNpcyBkYW4gbWVtYXN0aWthbiBiYWh3YSB0ZW11YW4gcGVuZWxpdGlhbiB2YWxpZCBkYW4gZGFwYXQgZGlhbmRhbGthbi4NCi0gU3RhdGlzdGlrYSBqdWdhIG1lbXVuZ2tpbmthbiBwZW5lbGl0aSB1bnR1ayBtZW5nb250cm9sIHZhcmlhYmVsIHlhbmcgbWVuZ2dhbmdndSBkYW4gbWVtYXN0aWthbiBoYXNpbCB5YW5nIGxlYmloIHNhaGloIGRhbGFtIGVrc3BlcmltZW4gYXRhdSBzdHVkaS4NCg0KIyMjIyBNZW1iYW50dSBNZW55YWppa2FuIERhdGEgc2VjYXJhIEVmZWt0aWYNCi0gU3RhdGlzdGlrIG1lbXVuZ2tpbmthbiBkYXRhIHVudHVrIGRpc2FqaWthbiBkYWxhbSBmb3JtYXQgeWFuZyBtdWRhaCBkaXBhaGFtaSBvbGVoIGF1ZGllbnMgeWFuZyBsZWJpaCBsdWFzLCBzZXBlcnRpIGdyYWZpaywgZGlhZ3JhbSwgZGFuIHRhYmVsLiBJbmkgc2FuZ2F0IHBlbnRpbmcgZGFsYW0ga29udGVrcyBiaXNuaXMgZGFuIGtvbXVuaWthc2kgaWxtaWFoLg0KLSBEZW5nYW4gdmlzdWFsaXNhc2kgZGF0YSB5YW5nIHRlcGF0LCBraXRhIGJpc2EgbGViaWggbXVkYWggbWVueWFtcGFpa2FuIGhhc2lsIGFuYWxpc2lzIGtlcGFkYSBwZW5nYW1iaWwga2VwdXR1c2FuIGF0YXUgbWFzeWFyYWthdC4NCg0KIyMjIEJhZ2FpbWFuYSBtZW5nYXBsaWthc2lrYW4gc3RhdGlzdGlrYSBkYXNhciBkYWxhbSBwZWtlcmphYW4va2VoaWR1cGFuIHNlaGFyaS1oYXJpPw0KDQpTdGF0aXN0aWthIGRhc2FyIGRhcGF0IHNhbmdhdCBiZXJndW5hIGRhbGFtIHBla2VyamFhbiBkYW4ga2VoaWR1cGFuIHNlaGFyaS1oYXJpIHVudHVrIG1lbWJhbnR1IG1lbmdhbWJpbCBrZXB1dHVzYW4geWFuZyBsZWJpaCBiYWlrLCBtZW1haGFtaSBwb2xhLCBkYW4gbWVtYnVhdCBwcmVkaWtzaS4gQmVyaWt1dCBhZGFsYWggYmViZXJhcGEgY29udG9oIGFwbGlrYXNpIHN0YXRpc3Rpa2EgZGFzYXIgeWFuZyBkYXBhdCBkaWd1bmFrYW4gZGFsYW0ga2VoaWR1cGFuIHNlaGFyaS1oYXJpOg0KDQojIyMjIFBlbmdlbG9sYWFuIEtldWFuZ2FuIFByaWJhZGkNCi0gKipEZXNrcmlwc2kgRGF0YSoqOiBNZW5nZ3VuYWthbiBzdGF0aXN0aWsgZGVza3JpcHRpZiwgQW5kYSBkYXBhdCBtZW5naGl0dW5nIHJhdGEtcmF0YSBwZW5nZWx1YXJhbiBidWxhbmFuLCBtZW1haGFtaSBwb2xhIHBlbmdlbHVhcmFuLCBkYW4gbWVuZ3VrdXIgc2ViZXJhcGEgYmVzYXIgdmFyaWFzaSBwZW5nZWx1YXJhbiB0ZXJzZWJ1dC4NCi0gKipLb3JlbGFzaSoqOiBNZW5nYW5hbGlzaXMgaHVidW5nYW4gYW50YXJhIHBlbmdoYXNpbGFuIGRhbiBwZW5nZWx1YXJhbiwgYXBha2FoIGFkYSBwb2xhIHRlcnRlbnR1IHlhbmcgZGFwYXQgbWVtYmFudHUgbWVuZ2Vsb2xhIGFuZ2dhcmFuLg0KLSAqKlVqaSBIaXBvdGVzaXMqKjogTWVtYmFuZGluZ2thbiBwZW5nZWx1YXJhbiBzZWJlbHVtIGRhbiBzZXRlbGFoIHBlcnViYWhhbiBhbmdnYXJhbiB1bnR1ayBtZWxpaGF0IGFwYWthaCBhZGEgcGVyYmVkYWFuIHNpZ25pZmlrYW4uDQoNCioqQ29udG9oKio6IE1lbmdndW5ha2FuIHJhdGEtcmF0YSBwZW5nZWx1YXJhbiB1bnR1ayBtZW5lbnR1a2FuIGJhdGFzIGFuZ2dhcmFuIGJ1bGFuYW4gZGFuIG1lbGloYXQgcGVuZ2FydWggcGVydWJhaGFuIGdheWEgaGlkdXAgdGVyaGFkYXAgcGVuZ2VsdWFyYW4uDQoNCiMjIyMgRXZhbHVhc2kgS2VzZWhhdGFuIGRhbiBLZWJ1Z2FyYW4NCi0gKipEZXNrcmlwc2kgRGF0YSoqOiBNZW5nZ3VuYWthbiBzdGF0aXN0aWsgZGVza3JpcHRpZiB1bnR1ayBtZW5naGl0dW5nIHJhdGEtcmF0YSBiZXJhdCBiYWRhbiwgdGluZ2dpIGJhZGFuLCBhdGF1IGRldGFrIGphbnR1bmcgQW5kYSwgc2VydGEgc2ViZXJhcGEgamF1aCBkYXRhIEFuZGEgdGVyc2ViYXIgKG1pc2FsbnlhLCB2YXJpYW5zaSBhdGF1IHN0YW5kYXIgZGV2aWFzaSkuDQotICoqS29yZWxhc2kqKjogTWVuZ2h1YnVuZ2thbiBwb2xhIGtlYnVnYXJhbiBhdGF1IGxhdGloYW4gZmlzaWsgZGVuZ2FuIHBlbmluZ2thdGFuIGtlYnVnYXJhbiwgc2VwZXJ0aSBrb3JlbGFzaSBhbnRhcmEganVtbGFoIGxhdGloYW4gcGVyIG1pbmdndSBkZW5nYW4gcGVudXJ1bmFuIGJlcmF0IGJhZGFuLg0KLSAqKlVqaSBIaXBvdGVzaXMqKjogTWVtYmFuZGluZ2thbiByYXRhLXJhdGEgYmVyYXQgYmFkYW4gc2ViZWx1bSBkYW4gc2V0ZWxhaCBwcm9ncmFtIGRpZXQgYXRhdSBvbGFocmFnYSB1bnR1ayBtZWxpaGF0IGFwYWthaCBwZXJ1YmFoYW4geWFuZyB0ZXJqYWRpIHNpZ25pZmlrYW4uDQoNCioqQ29udG9oKio6IE1lbmdndW5ha2FuIGRhdGEgYmVyYXQgYmFkYW4gdW50dWsgbWVsaWhhdCBzZWJlcmFwYSBlZmVrdGlmIGRpZXQgYXRhdSBsYXRpaGFuIHRlcnRlbnR1IGRhbGFtIG1lbmNhcGFpIHR1anVhbiBrZXNlaGF0YW4uDQoNCiMjIyMgQW5hbGlzaXMgV2FrdHUgZGFuIFByb2R1a3Rpdml0YXMNCi0gKipEZXNrcmlwc2kgRGF0YSoqOiBNZW5nYW5hbGlzaXMgZGF0YSBwcm9kdWt0aXZpdGFzIGhhcmlhbiBhdGF1IG1pbmdndWFuIGRpIHRlbXBhdCBrZXJqYSBtZW5nZ3VuYWthbiBzdGF0aXN0aWsgZGVza3JpcHRpZiAobWlzYWxueWEsIHJhdGEtcmF0YSB3YWt0dSB5YW5nIGRpYnV0dWhrYW4gdW50dWsgbWVueWVsZXNhaWthbiB0dWdhcykuDQotICoqS29yZWxhc2kqKjogTWVuZ2FuYWxpc2lzIGh1YnVuZ2FuIGFudGFyYSB3YWt0dSB0aWR1ciwgcG9sYSBtYWthbiwgZGFuIGtpbmVyamEgYXRhdSBwcm9kdWt0aXZpdGFzIGRpIHRlbXBhdCBrZXJqYS4NCi0gKipVamkgSGlwb3Rlc2lzKio6IE1lbmlsYWkgYXBha2FoIHdha3R1IGlzdGlyYWhhdCB5YW5nIGxlYmloIHBhbmphbmcgbWVuaW5na2F0a2FuIHByb2R1a3Rpdml0YXMgZGVuZ2FuIG1lbWJhbmRpbmdrYW4gZHVhIHBlcmlvZGUgZGVuZ2FuIHdha3R1IGlzdGlyYWhhdCB5YW5nIGJlcmJlZGEuDQoNCioqQ29udG9oKio6IE1lbmdndW5ha2FuIHN0YXRpc3RpayB1bnR1ayBtZW5ndWt1ciB3YWt0dSB5YW5nIGRpYnV0dWhrYW4gdW50dWsgbWVueWVsZXNhaWthbiB0dWdhcyBkaSBrYW50b3IsIGRhbiBtZWxpaGF0IGppa2EgYWRhIHBvbGEgYXRhdSB0cmVuIHlhbmcgbWVtcGVuZ2FydWhpIGtlY2VwYXRhbiBrZXJqYS4NCg0KDQojIyMjIFBlbmdlbG9sYWFuIFdha3R1IGRhbiBKYWR3YWwNCi0gKipEZXNrcmlwc2kgRGF0YSoqOiBNZW5nZ3VuYWthbiBzdGF0aXN0aWsgZGVza3JpcHRpZiB1bnR1ayBtZW5ndWt1ciBiZXJhcGEgYmFueWFrIHdha3R1IHlhbmcgZGloYWJpc2thbiB1bnR1ayBiZXJiYWdhaSBha3Rpdml0YXMgc2VoYXJpLWhhcmkgKGtlcmphLCBiZWxhamFyLCBoaWJ1cmFuLCBkbGwpLg0KLSAqKktvcmVsYXNpKio6IE1lbmdhbmFsaXNpcyBodWJ1bmdhbiBhbnRhcmEgd2FrdHUgdGlkdXIsIHByb2R1a3Rpdml0YXMsIGRhbiB0aW5na2F0IHN0cmVzLg0KLSAqKlVqaSBIaXBvdGVzaXMqKjogTWVtYmFuZGluZ2thbiB3YWt0dSB5YW5nIGRpaGFiaXNrYW4gdW50dWsgYmVrZXJqYSBkZW5nYW4gaGFzaWwgeWFuZyBkaWNhcGFpLCB1bnR1ayBtZWxpaGF0IGFwYWthaCBhZGEgcGVydWJhaGFuIHNpZ25pZmlrYW4ga2V0aWthIEFuZGEgbWVuZ2F0dXIgdWxhbmcgamFkd2FsLg0KDQoqKkNvbnRvaCoqOiBNZW5nZ3VuYWthbiBzdGF0aXN0aWsgdW50dWsgbWVueWVzdWFpa2FuIGphZHdhbCBoYXJpYW4gYWdhciBsZWJpaCBwcm9kdWt0aWYsIG1pc2FsbnlhIGRlbmdhbiBtZW5ndXJhbmdpIHdha3R1IHlhbmcgdGlkYWsgZWZla3RpZiBkYW4gbWVuaW5na2F0a2FuIHdha3R1IHlhbmcgbWVuZ2FyYWggcGFkYSBoYXNpbCB5YW5nIGxlYmloIGJhaWsuDQoNCg0KIyMgTWluZCBNYXANCg0KPGltZyBpZD0iTWluZG1hcCIgc3JjPSJDOlxVc2Vyc1xBU1VTXERlc2t0b3BcU3RhdGlzdGlrYSBEYXNhclxNaW5kTWFwMS5wbmciIGFsdD0iTG9nbyI+DQoNCiMgU29hbCAyLiBTdHVkaSBLYXN1cw0KDQojIyBEZXNrcmlwc2kgS2FzdXMNClBlcnVzYWhhYW4gRk1DRyBhbmRhIGluZ2luIG1lbWFoYW1pIHBvbGEgcGVuanVhbGFuIHByb2R1ayBBQkMgZGkgSkFCT0RFVEFCRUsgc2VsYW1hIDUgdGFodW4gdGVyYWtoaXIgdW50dWsgbWVuZ2VtYmFuZ2thbiBzdHJhdGVnaSBwZW1hc2FyYW4geWFuZyBsZWJpaCBlZmVrdGlmLiBEYXRhIGhpc3RvcmlzIG1lbGlwdXRpIGtvdGEta290YSBKYWthcnRhLCBCb2dvciwgRGVwb2ssIFRhbmdlcmFuZywgZGFuIEJla2FzaS4NCg0KIyMgRGF0YSBQZW5qdWFsYW4gQUJDDQpEYXRhc2V0IHBlbmp1YWxhbiBBQkMgdGVyZGlyaSBkYXJpIDYwIGJ1bGFuICg1IHRhaHVuKSwgZGVuZ2FuIGluZm9ybWFzaSBudW1lcmlrIGRhbiBrYXRlZ29yaWsgYmVyaWt1dDoNCg0KLSAqKktvdGE6KiogTG9rYXNpIHBlbmp1YWxhbiBkaSBKQUJPREVUQUJFSyAoSmFrYXJ0YSwgQm9nb3IsIERlcG9rLCBUYW5nZXJhbmcsIGRhbiBCZWthc2kpLg0KDQotICoqUGVuanVhbGFuIChVbml0KToqKiBUb3RhbCB1bml0IHByb2R1ayB0ZXJqdWFsIHBlcmJ1bGFuLg0KDQotICoqQmlheWEgUHJvbW9zaSAoJCk6KiogQW5nZ2FyYW4gcHJvbW9zaSBkaSB3aWxheWFoIHRlcnNlYnV0Lg0KDQotICoqRGlza29uICglKToqKiBCZXNhcmFuIGRpc2tvbiB5YW5nIGRpYmVyaWthbiB1bnR1ayBwcm9kdWsuDQoNCi0gKipSYXRpbmcgUGVsYW5nZ2FuICgxLTUpOioqIFBlbmlsYWlhbiBwZWxhbmdnYW4gYmVyZGFzYXJrYW4gc3VydmVpLg0KDQotICoqSmVuaXMgT3V0bGV0OioqIE1vZGVybiAoU3VwZXJtYXJrZXQsIE1pbmltYXJrZXQpIGF0YXUgVHJhZGlzaW9uYWwgKFBhc2FyLCBXYXJ1bmcpLg0KDQotICoqS2F0ZWdvcmkgUHJvZHVrOioqIE1ha2FuYW4sIG1pbnVtYW4sIGF0YXUga2VzZWhhdGFuDQoNCmBgYHtyLCBtYXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBlY2hvPUZBTFNFfQ0KRGF0YXNldCA9IHJlYWQuY3N2KCJDOi9Vc2Vycy9BU1VTL0Rlc2t0b3AvU3RhdGlzdGlrYSBEYXNhci9QZW5qdWFsYW5fQUJDX0pBQk9ERVRBQkVLLmNzdiIsIHNlcCA9ICIsIikNCmhlYWQoRGF0YXNldCkNCmBgYA0KDQojIyBQZXJ0YW55YWFuIEFuYWxpc2lzDQoNCiMjIyBTdGF0aXN0aWsgRGVza3JpcHRpZg0KDQojIyMjIEhpdHVuZyBtZWFuLCBtZWRpYW4sIGRhbiBzdGFuZGFyIGRldmlhc2kgdW50dWsgdmFyaWFiZWwgcGVuanVhbGFuICh1bml0KSwgYmlheWEgcHJvbW9zaSwgZGFuIHJhdGluZyBwZWxhbmdnYW4gcGVyIHRhaHVuIGRpc2V0aWFwIGtvdGEuDQoNCg0KKipMYW5na2FoIFBlcmhpdHVuZ2FuKioNCg0KMS4gKipIaXR1bmcgUmF0YS1yYXRhIChNZWFuKToqKg0KICAgXFsNCiAgIFx0ZXh0e01lYW59ID0gXGZyYWN7XHRleHR7SnVtbGFoIFRvdGFsIE5pbGFpfX17XHRleHR7SnVtbGFoIERhdGF9fQ0KICAgXF0NCg0KMi4gKipIaXR1bmcgTWVkaWFuOioqDQogICAtIFVydXRrYW4gZGF0YSBkYXJpIHRlcmtlY2lsIGhpbmdnYSB0ZXJiZXNhci4NCiAgIC0gSmlrYSBqdW1sYWggZGF0YSBnYW5qaWwsIG1lZGlhbiBhZGFsYWggbmlsYWkgZGkgdGVuZ2FoLg0KICAgLSBKaWthIGp1bWxhaCBkYXRhIGdlbmFwLCBtZWRpYW4gYWRhbGFoIHJhdGEtcmF0YSBkYXJpIGR1YSBuaWxhaSB0ZW5nYWguDQoNCjMuICoqSGl0dW5nIFN0YW5kYXIgRGV2aWFzaSAoU0QpOioqDQogICBcWw0KICAgXHRleHR7U0R9ID0gXHNxcnR7XGZyYWN7XHN1bSAoeF9pIC0gXGJhcnt4fSleMn17bn19DQogICBcXQ0KICAgLSBcKCB4X2kgXCk6IG5pbGFpIGluZGl2aWR1Lg0KICAgLSBcKCBcYmFye3h9IFwpOiByYXRhLXJhdGEuDQogICAtIFwoIG4gXCk6IGp1bWxhaCBkYXRhLg0KDQoqKkpBS0FSVEEqKg0KDQoqKkRhdGE6KioNCg0KLSAqKlBlbmp1YWxhbjoqKiBcKCAxMDM5MiwgMTE0NjIsIDk3MTcsIDEyMzUzLCAxMDU1MSwgOTk1NyBcKQ0KDQotICoqQmlheWEgUHJvbW9zaToqKiBcKCAxNjYwLCAyMDk3LCAxOTgwLCAxNjcwLCAyMjA4LCAyNDYxIFwpDQoNCi0gKipSYXRpbmc6KiogXCggNC43LCA0LjksIDMuNiwgNC42LCA0LjEsIDQuMiBcKQ0KDQoqKjEuIFBlbmp1YWxhbiAoVW5pdCkqKg0KDQotICoqTWVhbjoqKg0KICBcWw0KICBcdGV4dHtNZWFuIFBlbmp1YWxhbn0gPSBcZnJhY3sxMDM5MiArIDExNDYyICsgOTcxNyArIDEyMzUzICsgMTA1NTEgKyA5OTU3fXs2fSA9IFxmcmFjezY0NDMyfXs2fSA9IDEwNzM4LjY3DQogIFxdDQoNCi0gKipNZWRpYW46KioNCiAgVXJ1dGthbiBkYXRhOiBcKCA5NzE3LCA5OTU3LCAxMDM5MiwgMTA1NTEsIDExNDYyLCAxMjM1MyBcKS4NCiAgXFsNCiAgXHRleHR7TWVkaWFuIFBlbmp1YWxhbn0gPSBcZnJhY3sxMDM5MiArIDEwNTUxfXsyfSA9IDEwNDcxLjUNCiAgXF0NCg0KLSAqKlNEOioqDQogIEhpdHVuZyBkZXZpYXNpIGt1YWRyYXQ6DQogIFxbDQogIFxzdW0gKHhfaSAtIFxiYXJ7eH0pXjIgPSAoMTAzOTIgLSAxMDczOC42NyleMiArICgxMTQ2MiAtIDEwNzM4LjY3KV4yICsgXGxkb3RzDQogIFxdDQogIFxbDQogID0gMTIwMTMxLjU2ICsgNTIzNTkuNTYgKyA2NTA2NDUuNzggKyAyNjAzNDUuNzggKyAzNTQyNS43OCArIDYxMDI2OC40NA0KICBcXQ0KICBcWw0KICA9IDE3MzQxNzYuODkNCiAgXF0NCiAgU3RhbmRhciBkZXZpYXNpOg0KICBcWw0KICBcdGV4dHtTRCBQZW5qdWFsYW59ID0gXHNxcnR7XGZyYWN7MTczNDE3Ni44OX17Nn19ID0gXHNxcnR7Mjg5MDI5LjQ4fSA9IDUzNy45Mw0KICBcXQ0KDQoqKjIuIEJpYXlhIFByb21vc2kqKg0KDQotICoqTWVhbjoqKg0KICBcWw0KICBcdGV4dHtNZWFuIEJpYXlhIFByb21vc2l9ID0gXGZyYWN7MTY2MCArIDIwOTcgKyAxOTgwICsgMTY3MCArIDIyMDggKyAyNDYxfXs2fSA9IFxmcmFjezEyMDc2fXs2fSA9IDIwMTIuNjcNCiAgXF0NCg0KLSAqKk1lZGlhbjoqKg0KICBVcnV0a2FuIGRhdGE6IFwoIDE2NjAsIDE2NzAsIDE5ODAsIDIwOTcsIDIyMDgsIDI0NjEgXCkuDQogIFxbDQogIFx0ZXh0e01lZGlhbiBCaWF5YSBQcm9tb3NpfSA9IFxmcmFjezE5ODAgKyAyMDk3fXsyfSA9IDIwMzguNQ0KICBcXQ0KDQotICoqU0Q6KiogXCgzMjAuNDZcKQ0KDQoqKjMuIFJhdGluZyoqDQoNCi0gKipNZWFuOioqDQogIFxbDQogIFx0ZXh0e01lYW4gUmF0aW5nfSA9IFxmcmFjezQuNyArIDQuOSArIDMuNiArIDQuNiArIDQuMSArIDQuMn17Nn0gPSBcZnJhY3syNi4xfXs2fSA9IDQuMzUNCiAgXF0NCg0KLSAqKk1lZGlhbjoqKg0KICBVcnV0a2FuIGRhdGE6IFwoIDMuNiwgNC4xLCA0LjIsIDQuNiwgNC43LCA0LjkgXCkuDQogIFxbDQogIFx0ZXh0e01lZGlhbiBSYXRpbmd9ID0gXGZyYWN7NC4yICsgNC42fXsyfSA9IDQuNA0KICBcXQ0KDQotICoqU0Q6KipcKDAuNDdcKQ0KDQoqKkJPR09SKioNCg0KKipEYXRhOioqDQoNCi0gKipQZW5qdWFsYW46KiogXCgxMTM5NCwgNTcxNywgMTA2MjAsIDExMDM1LCA1NTAzLCAxMDIzM1wpDQoNCi0gKipCaWF5YSBQcm9tb3NpOioqIFwoOTMwLCAyMTYzLCAxOTYyLCAyMjg0LCAyMjM0LCAxNjM1XCkNCg0KLSAqKlJhdGluZzoqKiBcKDUuMCwgNC41LCA0LjYsIDQuOCwgMy44LCA0LjFcKQ0KDQoqKkhhc2lsIFBlcmhpdHVuZ2FuOioqDQoNCi0gKipQZW5qdWFsYW46KioNCg0KICAtIE1lYW46IFwoOTA2Ny4wXCkNCiAgDQogIC0gTWVkaWFuOiBcKDEwMzI2LjVcKQ0KIA0KICAtIFNEOiBcKDI0NTMuMzNcKQ0KDQotICoqQmlheWEgUHJvbW9zaToqKg0KDQogIC0gTWVhbjogXCgxODY4LjBcKQ0KDQogIC0gTWVkaWFuOiBcKDIxMDkuNVwpDQoNCiAgLSBTRDogXCg1ODIuNzRcKQ0KDQotICoqUmF0aW5nOioqDQoNCiAgLSBNZWFuOiBcKDQuNDdcKQ0KDQogIC0gTWVkaWFuOiBcKDQuNTVcKQ0KDQogIC0gU0Q6IFwoMC40N1wpDQoNCioqREVQT0sqKg0KDQoqKkRhdGE6KioNCg0KLSAqKlBlbmp1YWxhbjoqKiBcKDk0MDAsIDEwMTQ0LCA4MDM2LCAxNTEzNiwgOTAyNCwgMTM3MzFcKQ0KDQotICoqQmlheWEgUHJvbW9zaToqKiBcKDIwMTUsIDE4MjEsIDI4ODgsIDI0NzgsIDI3OTgsIDk5N1wpDQoNCi0gKipSYXRpbmc6KiogXCg0LjQsIDQuMywgNC44LCAzLjgsIDMuOCwgNC43XCkNCg0KKipIYXNpbCBQZXJoaXR1bmdhbjoqKg0KDQotICoqUGVuanVhbGFuOioqDQoNCiAgLSBNZWFuOiBcKDEwOTA4LjVcKQ0KDQogIC0gTWVkaWFuOiBcKDk3ODguMFwpDQoNCiAgLSBTRDogXCgyNzY2LjUxXCkNCg0KLSAqKkJpYXlhIFByb21vc2k6KioNCg0KICAtIE1lYW46IFwoMjE2Ni4xN1wpDQoNCiAgLSBNZWRpYW46IFwoMjM0Ni41XCkNCg0KICAtIFNEOiBcKDcwMC40MlwpDQoNCi0gKipSYXRpbmc6KioNCg0KICAtIE1lYW46IFwoNC4xM1wpDQoNCiAgLSBNZWRpYW46IFwoNC4wNVwpDQoNCiAgLSBTRDogXCgwLjQzXCkNCg0KKipUQU5HRVJBTkcqKg0KDQoqKkRhdGE6KioNCg0KLSAqKlBlbmp1YWxhbjoqKiBcKDQ0NzUsIDEwODc2LCAxNDYxNCwgNjk3MCwgNjcxNVwpDQoNCi0gKipCaWF5YSBQcm9tb3NpOioqIFwoMTg4MiwgMjM3OSwgMjU1MSwgMjYxOSwgMTM2M1wpDQoNCi0gKipSYXRpbmc6KiogXCgzLjYsIDQuOCwgNC40LCA0LjcsIDQuNVwpDQoNCioqSGFzaWwgUGVyaGl0dW5nYW46KioNCg0KLSAqKlBlbmp1YWxhbjoqKg0KDQogIC0gTWVhbjogXCg4NzQxLjBcKQ0KDQogIC0gTWVkaWFuOiBcKDY5NzAuMFwpDQoNCiAgLSBTRDogXCgzOTU1LjE4XCkNCg0KLSAqKkJpYXlhIFByb21vc2k6KioNCg0KICAtIE1lYW46IFwoMjE1OC44XCkNCg0KICAtIE1lZGlhbjogXCgyMzc5LjBcKQ0KDQogIC0gU0Q6IFwoNDk4LjgxXCkNCg0KLSAqKlJhdGluZzoqKg0KDQogIC0gTWVhbjogXCg0LjRcKQ0KDQogIC0gTWVkaWFuOiBcKDQuNVwpDQoNCiAgLSBTRDogXCgwLjQ2XCkNCg0KKipCRUtBU0kqKg0KDQoqKkRhdGE6KioNCg0KLSAqKlBlbmp1YWxhbjoqKiBcKDcyMTEsIDEwMjYwLCA2ODczLCAxMDUwMCwgMTM4NDVcKQ0KDQotICoqQmlheWEgUHJvbW9zaToqKiBcKDEzNjIsIDExMzcsIDE3NjAsIDIxNjMsIDE0OThcKQ0KDQotICoqUmF0aW5nOioqIFwoNS4wLCA0LjQsIDUuMCwgNC4zLCA0LjNcKQ0KDQoqKkhhc2lsIFBlcmhpdHVuZ2FuOioqDQoNCi0gKipQZW5qdWFsYW46KioNCg0KICAtIE1lYW46IFwoOTczNy44XCkNCg0KICAtIE1lZGlhbjogXCgxMDI2MC4wXCkNCg0KICAtIFNEOiBcKDI3MzEuMjdcKQ0KDQotICoqQmlheWEgUHJvbW9zaToqKg0KDQogIC0gTWVhbjogXCgxNTg0LjBcKQ0KDQogIC0gTWVkaWFuOiBcKDE0OTguMFwpDQoNCiAgLSBTRDogXCgzOTcuMzRcKQ0KDQotICoqUmF0aW5nOioqDQoNCiAgLSBNZWFuOiBcKDQuNlwpDQoNCiAgLSBNZWRpYW46IFwoNC40XCkNCg0KICAtIFNEOiBcKDAuMzNcKQ0KDQpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgZWNobz1GQUxTRX0NCiMgTWVtYnVhdCBkYXRhIGZyYW1lIGRhcmkgZGF0YSB5YW5nIGRpYmVyaWthbg0KZGF0YSA8LSBkYXRhLmZyYW1lKA0KICBCdWxhbiA9IGMoIkphbiIsICJKYW4iLCAiSmFuIiwgIkphbiIsICJKYW4iLA0KICAgICAgICAgICAgIkZlYiIsICJGZWIiLCAiRmViIiwgIkZlYiIsICJGZWIiLA0KICAgICAgICAgICAgIk1hciIsICJNYXIiLCAiTWFyIiwgIk1hciIsICJNYXIiLA0KICAgICAgICAgICAgIkFwciIsICJBcHIiLCAiQXByIiwgIkFwciIsICJBcHIiLA0KICAgICAgICAgICAgIk1heSIsICJNYXkiLCAiTWF5IiwgIk1heSIsICJNYXkiLA0KICAgICAgICAgICAgIkp1biIsICJKdW4iLCAiSnVuIiksDQogIFRhaHVuID0gYygyMDE4LCAyMDE4LCAyMDE4LCAyMDE4LCAyMDE4LA0KICAgICAgICAgICAgMjAxOCwgMjAxOCwgMjAxOCwgMjAxOCwgMjAxOCwNCiAgICAgICAgICAgIDIwMTgsIDIwMTgsIDIwMTgsIDIwMTgsIDIwMTgsDQogICAgICAgICAgICAyMDE4LCAyMDE4LCAyMDE4LCAyMDE4LCAyMDE4LA0KICAgICAgICAgICAgMjAxOCwgMjAxOCwgMjAxOCwgMjAxOCwgMjAxOCwNCiAgICAgICAgICAgIDIwMTgsIDIwMTgsIDIwMTgpLA0KICBLb3RhID0gYygiSmFrYXJ0YSIsICJCb2dvciIsICJEZXBvayIsICJUYW5nZXJhbmciLCAiQmVrYXNpIiwNCiAgICAgICAgICAgIkpha2FydGEiLCAiQm9nb3IiLCAiRGVwb2siLCAiVGFuZ2VyYW5nIiwgIkJla2FzaSIsDQogICAgICAgICAgICJKYWthcnRhIiwgIkJvZ29yIiwgIkRlcG9rIiwgIlRhbmdlcmFuZyIsICJCZWthc2kiLA0KICAgICAgICAgICAiSmFrYXJ0YSIsICJCb2dvciIsICJEZXBvayIsICJUYW5nZXJhbmciLCAiQmVrYXNpIiwNCiAgICAgICAgICAgIkpha2FydGEiLCAiQm9nb3IiLCAiRGVwb2siLCAiVGFuZ2VyYW5nIiwgIkJla2FzaSIsDQogICAgICAgICAgICJKYWthcnRhIiwgIkJvZ29yIiwgIkRlcG9rIiksDQogIFBlbmp1YWxhbiA9IGMoMTAzOTIsIDExMzk0LCA5NDAwLCA0NDc1LCA3MjExLA0KICAgICAgICAgICAgICAgIDExNDYyLCA1NzE3LCAxMDE0NCwgMTA4NzYsIDEwMjYwLA0KICAgICAgICAgICAgICAgIDk3MTcsIDEwNjIwLCA4MDM2LCAxNDYxNCwgNjg3MywNCiAgICAgICAgICAgICAgICAxMjM1MywgMTEwMzUsIDE1MTM2LCA2OTcwLCAxMDUwMCwNCiAgICAgICAgICAgICAgICAxMDU1MSwgNTUwMywgOTAyNCwgNjcxNSwgMTM4NDUsDQogICAgICAgICAgICAgICAgOTk1NywgMTAyMzMsMTM3MzEpLA0KICANCiBCaWF5YV9Qcm9tb3NpID0gYygxNjYwICw5MzAgLDIwMTUgLDE4ODIgLDEzNjIgLA0KICAgICAgICAgICAgICAgICAgIDIwOTcgLDIxNjMgLDE4MjEgLDIzNzkgLDExMzcgLA0KICAgICAgICAgICAgICAgICAgMTk4MCAsMTk2MiAsMjg4OCAsMjU1MSAsMTc2MCAsDQogICAgICAgICAgICAgICAgICAxNjcwICwyMjg0ICwyNDc4ICwyNjE5ICwyMTYzICwNCiAgICAgICAgICAgICAgICAgIDIyMDggLDIyMzQgLDI3OTggLDEzNjMgLDE0OTggLA0KICAgICAgICAgICAgICAgICAgMjQ2MSAsMTYzNSAsOTk3KSwNCiAgDQogUmF0aW5nID0gYyg0LjcgLDUuMCAsNC40ICwzLjYgLDUuMCAsDQogICAgICAgICAgICA0LjkgLDQuNSAsNC4zICw0LjggLDQuNCAsDQogICAgICAgICAgICAzLjYgLDQuNiAsNC44ICw0LjQgLDUuMCAsDQogICAgICAgICAgICA0LjYgLDQuOCAsMy44ICw0LjcgLDQuMyAsDQogICAgICAgICAgICA0LjEgLDMuOCAsMy44ICw0LjUgLDQuMyAsDQogICAgICAgICAgICA0LjIgLDQuMSAsNC43KQ0KKQ0KDQojIE1lbmdoaXR1bmcgbWVhbiwgbWVkaWFuIGRhbiBzdGFuZGFyIGRldmlhc2kgdW50dWsgc2V0aWFwIGtvdGENCmxpYnJhcnkoZHBseXIpDQoNCnJlc3VsdHMgPC0gZGF0YSAlPiUNCiAgICBncm91cF9ieShLb3RhKSAlPiUNCiAgICBzdW1tYXJpc2UoDQogICAgICAgIE1lYW5fUGVuanVhbGFuID0gbWVhbihQZW5qdWFsYW4pLA0KICAgICAgICBNZWRpYW5fUGVuanVhbGFuID0gbWVkaWFuKFBlbmp1YWxhbiksDQogICAgICAgIFNEX1Blbmp1YWxhbiA9IHNkKFBlbmp1YWxhbiksDQogICAgICAgIE1lYW5fQmlheWFfUHJvbW9zaSA9IG1lYW4oQmlheWFfUHJvbW9zaSksDQogICAgICAgIE1lZGlhbl9CaWF5YV9Qcm9tb3NpID0gbWVkaWFuKEJpYXlhX1Byb21vc2kpLA0KICAgICAgICBTRF9CaWF5YV9Qcm9tb3NpID0gc2QoQmlheWFfUHJvbW9zaSksDQogICAgICAgIE1lYW5fUmF0aW5nID0gbWVhbihSYXRpbmcpLA0KICAgICAgICBNZWRpYW5fUmF0aW5nID0gbWVkaWFuKFJhdGluZyksDQogICAgICAgIFNEX1JhdGluZyA9IHNkKFJhdGluZykNCiAgICApDQoNCiMgTWVuYW1waWxrYW4gaGFzaWwNCnByaW50KHJlc3VsdHMpDQpgYGANCg0KYGBge3IsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGVjaG89RkFMU0V9DQojIE1lbXVhdCBwdXN0YWthIHlhbmcgZGlidXR1aGthbg0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkocGxvdGx5KQ0KDQojIERhdGEgeWFuZyBkaWJlcmlrYW4NCmRhdGEgPC0gZGF0YS5mcmFtZSgNCiAgQnVsYW4gPSBjKCJKYW4iLCAiSmFuIiwgIkphbiIsICJKYW4iLCAiSmFuIiwNCiAgICAgICAgICAgICJGZWIiLCAiRmViIiwgIkZlYiIsICJGZWIiLCAiRmViIiwNCiAgICAgICAgICAgICJNYXIiLCAiTWFyIiwgIk1hciIsICJNYXIiLCAiTWFyIiwNCiAgICAgICAgICAgICJBcHIiLCAiQXByIiwgIkFwciIsICJBcHIiLCAiQXByIiwNCiAgICAgICAgICAgICJNYXkiLCAiTWF5IiwgIk1heSIsICJNYXkiLCAiTWF5IiwNCiAgICAgICAgICAgICJKdW4iLCAiSnVuIiwgIkp1biIpLA0KICBUYWh1biA9IGMoMjAxOCwgMjAxOCwgMjAxOCwgMjAxOCwgMjAxOCwNCiAgICAgICAgICAgIDIwMTgsIDIwMTgsIDIwMTgsIDIwMTgsIDIwMTgsDQogICAgICAgICAgICAyMDE4LCAyMDE4LCAyMDE4LCAyMDE4LCAyMDE4LA0KICAgICAgICAgICAgMjAxOCwgMjAxOCwgMjAxOCwgMjAxOCwgMjAxOCwNCiAgICAgICAgICAgIDIwMTgsIDIwMTgsIDIwMTgsIDIwMTgsIDIwMTgsDQogICAgICAgICAgICAyMDE4LCAyMDE4LCAyMDE4KSwNCiAgS290YSA9IGMoIkpha2FydGEiLCAiQm9nb3IiLCAiRGVwb2siLCAiVGFuZ2VyYW5nIiwgIkJla2FzaSIsDQogICAgICAgICAgICJKYWthcnRhIiwgIkJvZ29yIiwgIkRlcG9rIiwgIlRhbmdlcmFuZyIsICJCZWthc2kiLA0KICAgICAgICAgICAiSmFrYXJ0YSIsICJCb2dvciIsICJEZXBvayIsICJUYW5nZXJhbmciLCAiQmVrYXNpIiwNCiAgICAgICAgICAgIkpha2FydGEiLCAiQm9nb3IiLCAiRGVwb2siLCAiVGFuZ2VyYW5nIiwgIkJla2FzaSIsDQogICAgICAgICAgICJKYWthcnRhIiwgIkJvZ29yIiwgIkRlcG9rIiwgIlRhbmdlcmFuZyIsICJCZWthc2kiLA0KICAgICAgICAgICAiSmFrYXJ0YSIsICJCb2dvciIsICJEZXBvayIpLA0KICBQZW5qdWFsYW4gPSBjKDEwMzkyLCAxMTM5NCwgOTQwMCwgNDQ3NSwgNzIxMSwNCiAgICAgICAgICAgICAgICAxMTQ2MiwgNTcxNywgMTAxNDQsIDEwODc2LCAxMDI2MCwNCiAgICAgICAgICAgICAgICA5NzE3LCAxMDYyMCwgODAzNiwgMTQ2MTQsIDY4NzMsDQogICAgICAgICAgICAgICAgMTIzNTMsIDExMDM1LCAxNTEzNiwgNjk3MCwgMTA1MDAsDQogICAgICAgICAgICAgICAgMTA1NTEsIDU1MDMsIDkwMjQsIDY3MTUsIDEzODQ1LA0KICAgICAgICAgICAgICAgIDk5NTcsIDEwMjMzLDEzNzMxKSwNCiAgDQogIEJpYXlhX1Byb21vc2kgPSBjKDE2NjAgLDkzMCAsMjAxNSAsMTg4MiAsMTM2MiAsDQogICAgICAgICAgICAgICAgICAgIDIwOTcgLDIxNjMgLDE4MjEgLDIzNzkgLDExMzcgLA0KICAgICAgICAgICAgICAgICAgICAxOTgwICwxOTYyICwyODg4ICwyNTUxICwxNzYwICwNCiAgICAgICAgICAgICAgICAgICAgMTY3MCAsMjI4NCAsMjQ3OCAsMjYxOSAsMjE2MyAsDQogICAgICAgICAgICAgICAgICAgIDIyMDggLDIyMzQgLDI3OTggLDEzNjMgLDE0OTggLA0KICAgICAgICAgICAgICAgICAgICAyNDYxICwxNjM1ICw5OTcpLA0KICANCiAgUmF0aW5nID0gYyg0LjcgLDUuMCAsNC40ICwzLjYgLDUuMCAsDQogICAgICAgICAgICAgNC45ICw0LjUgLDQuMyAsNC44ICw0LjQgLA0KICAgICAgICAgICAgIDMuNiAsNC42ICw0LjggLDQuNCAsNS4wICwNCiAgICAgICAgICAgICA0LjYgLDQuOCAsMy44ICw0LjcgLDQuMyAsDQogICAgICAgICAgICAgNC4xICwzLjggLDMuOCAsNC41ICw0LjMgLA0KICAgICAgICAgICAgIDQuMiAsNC4xICw0LjcpDQopDQoNCiMgMS4gR3JhZmlrIGdhcmlzIGludGVyYWt0aWYNCmxpbmVfcGxvdCA8LSBnZ3Bsb3QoZGF0YSwgYWVzKHggPSBCdWxhbiwgeSA9IFBlbmp1YWxhbiwgY29sb3IgPSBLb3RhLCBncm91cCA9IEtvdGEpKSArDQogIGdlb21fbGluZShzaXplID0gMSkgKw0KICBnZW9tX3BvaW50KHNpemUgPSAyKSArDQogIHRoZW1lX21pbmltYWwoKSArDQogIGxhYnModGl0bGUgPSAiUGVuanVhbGFuIHBlciBCdWxhbiB1bnR1ayBTZXRpYXAgS290YSIsDQogICAgICAgeCA9ICJCdWxhbiIsIHkgPSAiUGVuanVhbGFuIiwNCiAgICAgICBjb2xvciA9ICJLb3RhIikNCg0KaW50ZXJhY3RpdmVfbGluZSA8LSBnZ3Bsb3RseShsaW5lX3Bsb3QpDQoNCiMgMi4gRGlhZ3JhbSBiYXRhbmcgaW50ZXJha3RpZg0KYWdnX2RhdGEgPC0gZGF0YSAlPiUNCiAgZ3JvdXBfYnkoS290YSkgJT4lDQogIHN1bW1hcmlzZShNZWFuX0JpYXlhX1Byb21vc2kgPSBtZWFuKEJpYXlhX1Byb21vc2kpKQ0KDQpiYXJfcGxvdCA8LSBnZ3Bsb3QoYWdnX2RhdGEsIGFlcyh4ID0gS290YSwgeSA9IE1lYW5fQmlheWFfUHJvbW9zaSwgZmlsbCA9IEtvdGEpKSArDQogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBjb2xvciA9ICJibGFjayIpICsNCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgbGFicyh0aXRsZSA9ICJSYXRhLXJhdGEgQmlheWEgUHJvbW9zaSBwZXIgS290YSIsDQogICAgICAgeCA9ICJLb3RhIiwgeSA9ICJSYXRhLXJhdGEgQmlheWEgUHJvbW9zaSIpDQoNCmludGVyYWN0aXZlX2JhciA8LSBnZ3Bsb3RseShiYXJfcGxvdCkNCg0KIyAzLiBTY2F0dGVyIHBsb3QgaW50ZXJha3RpZg0Kc2NhdHRlcl9wbG90IDwtIGdncGxvdChkYXRhLCBhZXMoeCA9IEJpYXlhX1Byb21vc2ksIHkgPSBQZW5qdWFsYW4sIGNvbG9yID0gS290YSkpICsNCiAgZ2VvbV9wb2ludChzaXplID0gMywgYWxwaGEgPSAwLjcpICsNCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgbGFicyh0aXRsZSA9ICJIdWJ1bmdhbiBhbnRhcmEgQmlheWEgUHJvbW9zaSBkYW4gUGVuanVhbGFuIiwNCiAgICAgICB4ID0gIkJpYXlhIFByb21vc2kiLCB5ID0gIlBlbmp1YWxhbiIsDQogICAgICAgY29sb3IgPSAiS290YSIpDQoNCmludGVyYWN0aXZlX3NjYXR0ZXIgPC0gZ2dwbG90bHkoc2NhdHRlcl9wbG90KQ0KDQojIDQuIEhpc3RvZ3JhbSBpbnRlcmFrdGlmDQpoaXN0X3Bsb3QgPC0gZ2dwbG90KGRhdGEsIGFlcyh4ID0gUmF0aW5nLCBmaWxsID0gS290YSkpICsNCiAgZ2VvbV9oaXN0b2dyYW0oYmlud2lkdGggPSAwLjUsIGFscGhhID0gMC43LCBwb3NpdGlvbiA9ICJkb2RnZSIpICsNCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgbGFicyh0aXRsZSA9ICJEaXN0cmlidXNpIFJhdGluZyBwZXIgS290YSIsDQogICAgICAgeCA9ICJSYXRpbmciLCB5ID0gIkZyZWt1ZW5zaSIsDQogICAgICAgZmlsbCA9ICJLb3RhIikNCg0KaW50ZXJhY3RpdmVfaGlzdCA8LSBnZ3Bsb3RseShoaXN0X3Bsb3QpDQoNCiMgTWVuYW1waWxrYW4gc2VtdWEgdmlzdWFsaXNhc2kgaW50ZXJha3RpZg0KaW50ZXJhY3RpdmVfbGluZQ0KaW50ZXJhY3RpdmVfYmFyDQppbnRlcmFjdGl2ZV9zY2F0dGVyDQppbnRlcmFjdGl2ZV9oaXN0DQpgYGANCg0KIyMjIyBJZGVudGlmaWthc2kga290YSBkZW5nYW4gcGVydHVtYnVoYW4gcGVuanVhbGFuIHRlcnRpbmdnaSBkYW4gdGVyZW5kYWggc2VsYW1hIHBlcmlvZGUgNSB0YWh1bg0KDQpQZXJ0dW1idWhhbiBwZW5qdWFsYW4gc2V0aWFwIGtvdGEgbWVuZ2d1bmFrYW4gcnVtdXM6DQoNClxbDQpcdGV4dHtQZXJ0dW1idWhhbn0gPSBcZnJhY3tcdGV4dHtQZW5qdWFsYW4gQWtoaXJ9IC0gXHRleHR7UGVuanVhbGFuIEF3YWx9fXtcdGV4dHtQZW5qdWFsYW4gQXdhbH19IFx0aW1lcyAxMDBcJQ0KXF0NCg0KKipEYXRhIFBlbmp1YWxhbioqDQoNCnwgS290YSAgICAgICB8IFBlbmp1YWxhbiAoMjAxOCkgfCBQZW5qdWFsYW4gKDIwMjIpIHwgUGVydHVtYnVoYW4gKCUpICAgICAgICAgICAgICAgICAgICAgICAgICB8DQp8LS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfA0KfCBKYWthcnRhICAgIHwgMTAsMzkyICAgICAgICAgICB8IDksNzY2ICAgICAgICAgICAgfCBcKFxmcmFjezksNzY2IC0gMTAsMzkyfXsxMCwzOTJ9IFx0aW1lcyAxMDAgPSAtNi4wMlwlXCkgIHwNCnwgQm9nb3IgICAgICB8IDExLDM5NCAgICAgICAgICAgfCA2LDY5NSAgICAgICAgICAgIHwgXChcZnJhY3s2LDY5NSAtIDExLDM5NH17MTEsMzk0fSBcdGltZXMgMTAwID0gLTQxLjI1XCVcKSB8DQp8IERlcG9rICAgICAgfCA5LDQwMCAgICAgICAgICAgIHwgMTIsOTIwICAgICAgICAgICB8IFwoXGZyYWN7MTIsOTIwIC0gOSw0MDB9ezksNDAwfSBcdGltZXMgMTAwID0gMzcuNDVcJVwpICAgfA0KfCBUYW5nZXJhbmcgIHwgNCw0NzUgICAgICAgICAgICB8IDksNzExICAgICAgICAgICAgfCBcKFxmcmFjezksNzExIC0gNCw0NzV9ezQsNDc1fSBcdGltZXMgMTAwID0gMTE3LjAxXCVcKSAgfA0KfCBCZWthc2kgICAgIHwgNywyMTEgICAgICAgICAgICB8IDEyLDI5NiAgICAgICAgICAgfCBcKFxmcmFjezEyLDI5NiAtIDcsMjExfXs3LDIxMX0gXHRpbWVzIDEwMCA9IDcwLjQ4XCVcKSAgIHwNCg0KKipIYXNpbCBQZXJoaXR1bmdhbioqDQoNCjEuICoqSmFrYXJ0YSoqOg0KICAgXFsNCiAgIFxmcmFjezksNzY2IC0gMTAsMzkyfXsxMCwzOTJ9IFx0aW1lcyAxMDAgPSAtNi4wMlwlDQogICBcXQ0KDQoyLiAqKkJvZ29yKio6DQogICBcWw0KICAgXGZyYWN7Niw2OTUgLSAxMSwzOTR9ezExLDM5NH0gXHRpbWVzIDEwMCA9IC00MS4yNVwlDQogICBcXQ0KDQozLiAqKkRlcG9rKio6DQogICBcWw0KICAgXGZyYWN7MTIsOTIwIC0gOSw0MDB9ezksNDAwfSBcdGltZXMgMTAwID0gMzcuNDVcJQ0KICAgXF0NCg0KNC4gKipUYW5nZXJhbmcqKjoNCiAgIFxbDQogICBcZnJhY3s5LDcxMSAtIDQsNDc1fXs0LDQ3NX0gXHRpbWVzIDEwMCA9IDExNy4wMVwlDQogICBcXQ0KDQo1LiAqKkJla2FzaSoqOg0KICAgXFsNCiAgIFxmcmFjezEyLDI5NiAtIDcsMjExfXs3LDIxMX0gXHRpbWVzIDEwMCA9IDcwLjQ4XCUNCiAgIFxdDQoNCg0KLSAqKlBlcnR1bWJ1aGFuIFRlcnRpbmdnaSoqOiBUYW5nZXJhbmcsIGRlbmdhbiBwZXJ0dW1idWhhbiBzZWJlc2FyICoqMTE3LjAxJSoqLg0KLSAqKlBlcnR1bWJ1aGFuIFRlcmVuZGFoKio6IEJvZ29yLCBkZW5nYW4gcGVydHVtYnVoYW4gc2ViZXNhciAqKi00MS4yNSUqKi4NCg0KYGBge3IsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGVjaG89RkFMU0V9DQojIE1lbWJ1YXQgZGF0YSBmcmFtZQ0KZGF0YSA8LSBkYXRhLmZyYW1lKA0KICBCdWxhbiA9IGMoIkphbiIsICJKYW4iLCAiSmFuIiwgIkphbiIsICJKYW4iLCAiSmFuIiwgIkphbiIsICJKYW4iLCAiSmFuIiwgIkphbiIsIA0KICAgICAgICAgICAgIkphbiIsICJKYW4iLCAiSmFuIiwgIkphbiIsICJKYW4iLCAiSmFuIiwgIkphbiIsICJKYW4iLCAiSmFuIiwgIkphbiIsDQogICAgICAgICAgICAiSmFuIiwgIkphbiIsICJKYW4iLCAiSmFuIiwgIkphbiIpLA0KICBUYWh1biA9IGMoMjAxOCwgMjAxOCwgMjAxOCwgMjAxOCwgMjAxOCwgMjAxOSwgMjAxOSwgMjAxOSwgMjAxOSwgMjAxOSwgDQogICAgICAgICAgICAyMDIwLCAyMDIwLCAyMDIwLCAyMDIwLCAyMDIwLCAyMDIxLCAyMDIxLCAyMDIxLCAyMDIxLCAyMDIxLA0KICAgICAgICAgICAgMjAyMiwgMjAyMiwgMjAyMiwgMjAyMiwgMjAyMiksDQogIEtvdGEgPSBjKCJKYWthcnRhIiwgIkJvZ29yIiwgIkRlcG9rIiwgIlRhbmdlcmFuZyIsICJCZWthc2kiLCAiSmFrYXJ0YSIsICJCb2dvciIsIA0KICAgICAgICAgICAiRGVwb2siLCAiVGFuZ2VyYW5nIiwgIkJla2FzaSIsICJKYWthcnRhIiwgIkJvZ29yIiwgIkRlcG9rIiwgDQogICAgICAgICAgICJUYW5nZXJhbmciLCAiQmVrYXNpIiwgIkpha2FydGEiLCAiQm9nb3IiLCAiRGVwb2siLCAiVGFuZ2VyYW5nIiwgDQogICAgICAgICAgICJCZWthc2kiLCAiSmFrYXJ0YSIsICJCb2dvciIsICJEZXBvayIsICJUYW5nZXJhbmciLCAiQmVrYXNpIiksDQogIFBlbmp1YWxhbiA9IGMoMTAzOTIsIDExMzk0LCA5NDAwLCA0NDc1LCA3MjExLCAxMzY1MCwgNTY3NSwgMTA1MzUsIDEyNzIxLCA1MjMxLA0KICAgICAgICAgICAgICAgIDYxODcsIDg3MTUsIDEwODM3LCA1NTUyLCA2OTkwLCAxMzY0MCwgODM0OSwgNTgxNiwgMTM5MTQsIDk3MTUsDQogICAgICAgICAgICAgICAgOTc2NiwgNjY5NSwgMTI5MjAsIDk3MTEsIDEyMjk2KQ0KKQ0KDQojIE1lbmdoaXR1bmcgcGVydHVtYnVoYW4gcGVuanVhbGFuDQpsaWJyYXJ5KGRwbHlyKQ0KcGVydHVtYnVoYW4gPC0gZGF0YSAlPiUNCiAgZ3JvdXBfYnkoS290YSkgJT4lDQogIHN1bW1hcmlzZSgNCiAgICBQZW5qdWFsYW5fQXdhbCA9IFBlbmp1YWxhbltUYWh1biA9PSAyMDE4XSwNCiAgICBQZW5qdWFsYW5fQWtoaXIgPSBQZW5qdWFsYW5bVGFodW4gPT0gMjAyMl0sDQogICAgUGVydHVtYnVoYW4gPSAoUGVuanVhbGFuX0FraGlyIC0gUGVuanVhbGFuX0F3YWwpIC8gUGVuanVhbGFuX0F3YWwgKiAxMDANCiAgKQ0KDQojIE1lbmNhcmkga290YSBkZW5nYW4gcGVydHVtYnVoYW4gdGVydGluZ2dpIGRhbiB0ZXJlbmRhaA0KcGVydHVtYnVoYW5fdGVydGluZ2dpIDwtIHBlcnR1bWJ1aGFuICU+JSBmaWx0ZXIoUGVydHVtYnVoYW4gPT0gbWF4KFBlcnR1bWJ1aGFuKSkNCnBlcnR1bWJ1aGFuX3RlcmVuZGFoIDwtIHBlcnR1bWJ1aGFuICU+JSBmaWx0ZXIoUGVydHVtYnVoYW4gPT0gbWluKFBlcnR1bWJ1aGFuKSkNCg0KIyBNZW5hbXBpbGthbiBoYXNpbA0KcHJpbnQoIktvdGEgZGVuZ2FuIHBlcnR1bWJ1aGFuIHBlbmp1YWxhbiB0ZXJ0aW5nZ2k6IikNCnByaW50KHBlcnR1bWJ1aGFuX3RlcnRpbmdnaSkNCg0KcHJpbnQoIktvdGEgZGVuZ2FuIHBlcnR1bWJ1aGFuIHBlbmp1YWxhbiB0ZXJlbmRhaDoiKQ0KcHJpbnQocGVydHVtYnVoYW5fdGVyZW5kYWgpDQpgYGANCg0KYGBge3IsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGVjaG89RkFMU0V9DQpsaWJyYXJ5KHBsb3RseSkNCmxpYnJhcnkoZHBseXIpDQoNCiMgRGF0YSBmcmFtZQ0KZGF0YSA8LSBkYXRhLmZyYW1lKA0KICBCdWxhbiA9IGMoIkphbiIsICJKYW4iLCAiSmFuIiwgIkphbiIsICJKYW4iLCAiSmFuIiwgIkphbiIsICJKYW4iLCAiSmFuIiwgIkphbiIsIA0KICAgICAgICAgICAgIkphbiIsICJKYW4iLCAiSmFuIiwgIkphbiIsICJKYW4iLCAiSmFuIiwgIkphbiIsICJKYW4iLCAiSmFuIiwgIkphbiIsDQogICAgICAgICAgICAiSmFuIiwgIkphbiIsICJKYW4iLCAiSmFuIiwgIkphbiIpLA0KICBUYWh1biA9IGMoMjAxOCwgMjAxOCwgMjAxOCwgMjAxOCwgMjAxOCwgMjAxOSwgMjAxOSwgMjAxOSwgMjAxOSwgMjAxOSwgDQogICAgICAgICAgICAyMDIwLCAyMDIwLCAyMDIwLCAyMDIwLCAyMDIwLCAyMDIxLCAyMDIxLCAyMDIxLCAyMDIxLCAyMDIxLA0KICAgICAgICAgICAgMjAyMiwgMjAyMiwgMjAyMiwgMjAyMiwgMjAyMiksDQogIEtvdGEgPSBjKCJKYWthcnRhIiwgIkJvZ29yIiwgIkRlcG9rIiwgIlRhbmdlcmFuZyIsICJCZWthc2kiLCAiSmFrYXJ0YSIsICJCb2dvciIsIA0KICAgICAgICAgICAiRGVwb2siLCAiVGFuZ2VyYW5nIiwgIkJla2FzaSIsICJKYWthcnRhIiwgIkJvZ29yIiwgIkRlcG9rIiwgDQogICAgICAgICAgICJUYW5nZXJhbmciLCAiQmVrYXNpIiwgIkpha2FydGEiLCAiQm9nb3IiLCAiRGVwb2siLCAiVGFuZ2VyYW5nIiwgDQogICAgICAgICAgICJCZWthc2kiLCAiSmFrYXJ0YSIsICJCb2dvciIsICJEZXBvayIsICJUYW5nZXJhbmciLCAiQmVrYXNpIiksDQogIFBlbmp1YWxhbiA9IGMoMTAzOTIsIDExMzk0LCA5NDAwLCA0NDc1LCA3MjExLCAxMzY1MCwgNTY3NSwgMTA1MzUsIDEyNzIxLCA1MjMxLA0KICAgICAgICAgICAgICAgIDYxODcsIDg3MTUsIDEwODM3LCA1NTUyLCA2OTkwLCAxMzY0MCwgODM0OSwgNTgxNiwgMTM5MTQsIDk3MTUsDQogICAgICAgICAgICAgICAgOTc2NiwgNjY5NSwgMTI5MjAsIDk3MTEsIDEyMjk2KQ0KKQ0KDQojIE1lbmdoaXR1bmcgcGVydHVtYnVoYW4gcGVuanVhbGFuDQpwZXJ0dW1idWhhbiA8LSBkYXRhICU+JQ0KICBncm91cF9ieShLb3RhKSAlPiUNCiAgc3VtbWFyaXNlKA0KICAgIFBlbmp1YWxhbl9Bd2FsID0gUGVuanVhbGFuW1RhaHVuID09IDIwMThdLA0KICAgIFBlbmp1YWxhbl9Ba2hpciA9IFBlbmp1YWxhbltUYWh1biA9PSAyMDIyXSwNCiAgICBQZXJ0dW1idWhhbiA9IChQZW5qdWFsYW5fQWtoaXIgLSBQZW5qdWFsYW5fQXdhbCkgLyBQZW5qdWFsYW5fQXdhbCAqIDEwMA0KICApDQoNCiMgTWVuZW50dWthbiB3YXJuYSB5YW5nIGJlcmJlZGEgdW50dWsgc2V0aWFwIGtvdGENCndhcm5hIDwtIGMoInJnYigyNTUsIDk5LCAxMzIpIiwgInJnYig1NCwgMTYyLCAyMzUpIiwgInJnYigyNTUsIDIwNiwgODYpIiwgDQogICAgICAgICAgICJyZ2IoNzUsIDE5MiwgMTkyKSIsICJyZ2IoMTUzLCAxMDIsIDI1NSkiKQ0KDQojIE1lbWJ1YXQgdmlzdWFsaXNhc2kgaW50ZXJha3RpZg0KcGxvdCA8LSBwbG90X2x5KA0KICBwZXJ0dW1idWhhbiwNCiAgeCA9IH5Lb3RhLA0KICB5ID0gflBlcnR1bWJ1aGFuLA0KICB0eXBlID0gJ2JhcicsDQogIHRleHQgPSB+cGFzdGUwKCJQZXJ0dW1idWhhbjogIiwgcm91bmQoUGVydHVtYnVoYW4sIDIpLCAiJSIpLA0KICBob3ZlcmluZm8gPSAndGV4dCcsDQogIG1hcmtlciA9IGxpc3QoY29sb3IgPSB3YXJuYSkNCikgJT4lDQogIGxheW91dCgNCiAgICB0aXRsZSA9ICJQZXJ0dW1idWhhbiBQZW5qdWFsYW4gS290YSAoMjAxOC0yMDIyKSIsDQogICAgeGF4aXMgPSBsaXN0KHRpdGxlID0gIktvdGEiKSwNCiAgICB5YXhpcyA9IGxpc3QodGl0bGUgPSAiUGVydHVtYnVoYW4gUGVuanVhbGFuICglKSIpLA0KICAgIG1hcmdpbiA9IGxpc3QobCA9IDUwLCByID0gNTAsIGIgPSA1MCwgdCA9IDUwKSwNCiAgICBwYXBlcl9iZ2NvbG9yID0gJ3JnYigyNDMsIDI0MywgMjQzKScsDQogICAgcGxvdF9iZ2NvbG9yID0gJ3JnYigyNDMsIDI0MywgMjQzKScNCiAgKQ0KDQojIE1lbmFtcGlsa2FuIHBsb3QNCnBsb3QNCmBgYA0KDQojIyMjIEFuYWxpc2lzIFN0YXRpc3RpayBEZXNrcmlwdGlmDQoNCg0KU3RhdGlzdGlrIGRlc2tyaXB0aWYgZGlndW5ha2FuIHVudHVrIG1lbWJlcmlrYW4gZ2FtYmFyYW4gYXdhbCBtZW5nZW5haSBkYXRhIHBlbmp1YWxhbiwgYmlheWEgcHJvbW9zaSwgZGFuIHJhdGluZyBwZWxhbmdnYW4gZGkgc2V0aWFwIGtvdGEuIExhbmdrYWggaW5pIGJlcnR1anVhbiB1bnR1ayBtZW1haGFtaSBwb2xhIGRhc2FyIGRhdGEgc2ViZWx1bSBtZWxha3VrYW4gYW5hbGlzaXMgbGViaWggbGFuanV0LCBzZXBlcnRpIHRyZW4gYXRhdSBrb3JlbGFzaS4NCg0KIyMjIyMgKipBbmFsaXNpcyBTdGF0aXN0aWsgRGVza3JpcHRpZiBQZXIgS290YSoqICANCg0KKipKYWthcnRhKioNCg0KICAtICoqUGVuanVhbGFuOioqICANCiAgUmF0YS1yYXRhIHBlbmp1YWxhbiB0YWh1bmFuIGFkYWxhaCAqKjEwLDczOC42NyB1bml0KiosIGRlbmdhbiAqKnN0YW5kYXIgZGV2aWFzaSA1MzcuOTMqKiwgbWVudW5qdWtrYW4gdmFyaWFzaSBwZW5qdWFsYW4geWFuZyByZWxhdGlmIGtlY2lsLiBNZWRpYW4gcGVuanVhbGFuIHNlYmVzYXIgKioxMCw0NzEuNSB1bml0KiogbWVudW5qdWtrYW4ga2VzdGFiaWxhbiBkaSBzZWtpdGFyIG5pbGFpIHRlbmdhaC4gIA0KDQogIC0gKipCaWF5YSBQcm9tb3NpOioqICANCiAgUmF0YS1yYXRhIGJpYXlhIHByb21vc2kgYWRhbGFoICoqMiwwMTIuNjcqKiwgZGVuZ2FuIG1lZGlhbiAqKjIsMDM4LjUqKiwgeWFuZyBtZW51bmp1a2thbiBkaXN0cmlidXNpIGRhdGEgeWFuZyByZWxhdGlmIHNpbWV0cmlzLiAgDQoNCiAgLSAqKlJhdGluZyBQZWxhbmdnYW46KiogIA0KICBSYXRhLXJhdGEgcmF0aW5nIHBlbGFuZ2dhbiBtZW5jYXBhaSAqKjQuMzUqKiwgbWVudW5qdWtrYW4ga2VwdWFzYW4gcGVsYW5nZ2FuIHlhbmcgY3VrdXAgYmFpaywgbWVza2lwdW4gYWRhIHZhcmlhc2kga2VjaWwgKFNEOiAqKjAuNDcqKikuICANCg0KKipCb2dvcjoqKiBQZW5qdWFsYW4gbWVudW5qdWtrYW4gcmF0YS1yYXRhICoqOSwwNjcgdW5pdCoqLCBkZW5nYW4gc3RhbmRhciBkZXZpYXNpIHRpbmdnaSAoKioyLDQ1My4zMyoqKSB5YW5nIG1lbmdpbmRpa2FzaWthbiBmbHVrdHVhc2kgYmVzYXIuICANCg0KKipEZXBvazoqKiBSYXRhLXJhdGEgcGVuanVhbGFuIGFkYWxhaCAqKjEwLDkwOC41IHVuaXQqKiwgZGVuZ2FuIHZhcmlhc2kgbGViaWggYmVzYXIgKCoqU0Q6IDIsNzY2LjUxKiopLCBtZW5naW5kaWthc2lrYW4gcG9sYSBwZW5qdWFsYW4geWFuZyBsZWJpaCBkaW5hbWlzLiAgDQoNCioqVGFuZ2VyYW5nOioqIEtvdGEgaW5pIG1lbnVuanVra2FuIGZsdWt0dWFzaSBwZW5qdWFsYW4gdGVydGluZ2dpLCBkZW5nYW4gcmF0YS1yYXRhICoqOCw3NDEgdW5pdCoqIGRhbiBzdGFuZGFyIGRldmlhc2kgc2ViZXNhciAqKjMsOTU1LjE4KiosIG1lbmNlcm1pbmthbiBkaXN0cmlidXNpIGRhdGEgeWFuZyBsZWJhci4gIA0KDQoqKkJla2FzaToqKiBQZW5qdWFsYW4gcmVsYXRpZiBzdGFiaWwsIGRlbmdhbiByYXRhLXJhdGEgKio5LDczNy44IHVuaXQqKiBkYW4gU0QgKioyLDczMS4yNyoqLiAgDQoNCiMjIyMjICoqSWRlbnRpZmlrYXNpIEtvdGEgZGVuZ2FuIFBlcnR1bWJ1aGFuIFBlbmp1YWxhbiBUZXJ0aW5nZ2kgZGFuIFRlcmVuZGFoKiogIA0KVW50dWsgbWVtYWhhbWkgZGluYW1pa2EgamFuZ2thIHBhbmphbmcsIHBlcnR1bWJ1aGFuIHBlbmp1YWxhbiBkaWhpdHVuZyBiZXJkYXNhcmthbiBwZXJ1YmFoYW4gcGVuanVhbGFuIHNlbGFtYSBwZXJpb2RlIGxpbWEgdGFodW4gKDIwMTjigJMyMDIyKS4NCg0KKipIYXNpbCBQZXJ0dW1idWhhbiBQZW5qdWFsYW4qKg0KDQoxLiAqKktvdGEgZGVuZ2FuIFBlcnR1bWJ1aGFuIFRlcnRpbmdnaToqKiAgDQogICBUYW5nZXJhbmcgbWVuY2F0YXRrYW4gcGVydHVtYnVoYW4gdGVydGluZ2dpIHNlYmVzYXIgKioxMTcuMDElKiosIG1lbmdpbmRpa2FzaWthbiBzdHJhdGVnaSBwcm9tb3NpIHlhbmcgYmVyaGFzaWwgYXRhdSBwZW5pbmdrYXRhbiBzaWduaWZpa2FuIGRhbGFtIHBlcm1pbnRhYW4uICANCg0KMi4gKipLb3RhIGRlbmdhbiBQZXJ0dW1idWhhbiBUZXJlbmRhaDoqKiAgDQogICBCb2dvciBtZW5nYWxhbWkgcGVudXJ1bmFuIHNlYmVzYXIgKiotNDEuMjUlKiosIG1lbnVuanVra2FuIGtlYnV0dWhhbiB1bnR1ayBtZXJldmlzaSBzdHJhdGVnaSBwZW1hc2FyYW4gZ3VuYSBtZW5pbmdrYXRrYW4gZGF5YSB0YXJpayBwYXNhci4gIA0KDQoqKkluc2lnaHQgVXRhbWEqKiAgDQoNCktvdGEta290YSBzZXBlcnRpIFRhbmdlcmFuZyBkYW4gQmVrYXNpIHlhbmcgbWVuY2F0YXQgcGVydHVtYnVoYW4gdGluZ2dpIHBlcmx1IG1lbXBlcnRhaGFua2FuIG1vbWVudHVtIGluaSBkZW5nYW4gZm9rdXMgcGFkYSBzdHJhdGVnaSBwZW1hc2FyYW4gbXVzaW1hbi4gU2ViYWxpa255YSwgSmFrYXJ0YSBkYW4gQm9nb3IgbWVtZXJsdWthbiBpbnRlcnZlbnNpIHVudHVrIG1lbmdhdGFzaSBzdGFnbmFzaSBhdGF1IHBlbnVydW5hbiBwZW5qdWFsYW4uDQoNCg0KIyMjIFBvbGEgVHJlbiBkYW4gTXVzaW1hbg0KDQojIyMjIEFuYWxpc2lzIHBvbGEgdHJlbiBwZW5qdWFsYW4gdGFodW5hbjogQXBha2FoIGFkYSBwb2xhIHBlbmluZ2thdGFuIGF0YXUgcGVudXJ1bmFuIHNpZ25pZmlrYW4/DQoNClVudHVrIG1lbmdhbmFsaXNpcyBwb2xhIHRyZW4gcGVuanVhbGFuIHRhaHVuYW4sIGtpdGEgZGFwYXQgbWVsaWhhdCBkYXRhIHBlbmp1YWxhbiBwZXIgdGFodW4gZGFuIG1lbWVyaWtzYSBhcGFrYWggYWRhIHBlbmluZ2thdGFuIGF0YXUgcGVudXJ1bmFuIHNpZ25pZmlrYW4gZGFsYW0gcGVyaW9kZSBsaW1hIHRhaHVuICgyMDE4LTIwMjIpLiBLaXRhIGFrYW4gZm9rdXMgcGFkYSB0cmVuIHBlbmp1YWxhbiB0b3RhbCB1bnR1ayBzZXRpYXAga290YS4NCg0KKipEYXRhIFBlbmp1YWxhbiAoVW5pdCkgQmVyZGFzYXJrYW4gVGFodW46KioNCg0KfCBUYWh1biAgIHwgSmFrYXJ0YSB8IEJvZ29yICB8IERlcG9rICB8IFRhbmdlcmFuZyB8IEJla2FzaSB8DQp8LS0tLS0tLS0tfC0tLS0tLS0tLXwtLS0tLS0tLXwtLS0tLS0tLXwtLS0tLS0tLS0tLXwtLS0tLS0tLXwNCnwgMjAxOCAgICB8IDEwLDM5MiAgfCAxMSwzOTQgfCA5LDQwMCAgfCA0LDQ3NSAgICAgfCA3LDIxMSAgfA0KfCAyMDE5ICAgIHwgMTMsNjUwICB8IDUsNjc1ICB8IDEwLDUzNSB8IDEyLDcyMSAgICB8IDUsMjMxICB8DQp8IDIwMjAgICAgfCA2LDE4NyAgIHwgOCw3MTUgIHwgMTAsODM3IHwgNSw1NTIgICAgIHwgNiw5OTAgIHwNCnwgMjAyMSAgICB8IDEzLDY0MCAgfCA4LDM0OSAgfCA1LDgxNiAgfCAxMyw5MTQgICAgfCA5LDcxNSAgfA0KfCAyMDIyICAgIHwgOSw3NjYgICB8IDYsNjk1ICB8IDEyLDkyMCB8IDksNzExICAgICB8IDEyLDI5NiB8DQoNCioqTGFuZ2thaCAxOiBNZW5naGl0dW5nIFBlcnViYWhhbiBUYWh1bmFuKioNCg0KVW50dWsgc2V0aWFwIGtvdGEsIGtpdGEgbWVuZ2hpdHVuZyBwZXJ1YmFoYW4gdGFodW5hbiBkYWxhbSBwZW5qdWFsYW4gdW50dWsgbWVsaWhhdCBhcGFrYWggYWRhIHBvbGEgdHJlbiBwZW5pbmdrYXRhbiBhdGF1IHBlbnVydW5hbjoNCg0KKipKYWthcnRhOioqDQoNCi0gMjAxOSB2cyAyMDE4OiBcKFxmcmFjezEzLDY1MCAtIDEwLDM5Mn17MTAsMzkyfSBcdGltZXMgMTAwID0gMzEuNjlcJVwpDQoNCi0gMjAyMCB2cyAyMDE5OiBcKFxmcmFjezYsMTg3IC0gMTMsNjUwfXsxMyw2NTB9IFx0aW1lcyAxMDAgPSAtNTQuNjdcJVwpDQoNCi0gMjAyMSB2cyAyMDIwOiBcKFxmcmFjezEzLDY0MCAtIDYsMTg3fXs2LDE4N30gXHRpbWVzIDEwMCA9IDEyMC40NVwlXCkNCg0KLSAyMDIyIHZzIDIwMjE6IFwoXGZyYWN7OSw3NjYgLSAxMyw2NDB9ezEzLDY0MH0gXHRpbWVzIDEwMCA9IC0yOC4zMVwlXCkNCg0KKipCb2dvcjoqKg0KDQotIDIwMTkgdnMgMjAxODogXChcZnJhY3s1LDY3NSAtIDExLDM5NH17MTEsMzk0fSBcdGltZXMgMTAwID0gLTUwLjE3XCVcKQ0KDQotIDIwMjAgdnMgMjAxOTogXChcZnJhY3s4LDcxNSAtIDUsNjc1fXs1LDY3NX0gXHRpbWVzIDEwMCA9IDUzLjc1XCVcKQ0KDQotIDIwMjEgdnMgMjAyMDogXChcZnJhY3s4LDM0OSAtIDgsNzE1fXs4LDcxNX0gXHRpbWVzIDEwMCA9IC00LjIxXCVcKQ0KDQotIDIwMjIgdnMgMjAyMTogXChcZnJhY3s2LDY5NSAtIDgsMzQ5fXs4LDM0OX0gXHRpbWVzIDEwMCA9IC0xOS43OVwlXCkNCg0KKipEZXBvazoqKg0KDQotIDIwMTkgdnMgMjAxODogXChcZnJhY3sxMCw1MzUgLSA5LDQwMH17OSw0MDB9IFx0aW1lcyAxMDAgPSAxMi4wNVwlXCkNCg0KLSAyMDIwIHZzIDIwMTk6IFwoXGZyYWN7MTAsODM3IC0gMTAsNTM1fXsxMCw1MzV9IFx0aW1lcyAxMDAgPSAyLjg3XCVcKQ0KDQotIDIwMjEgdnMgMjAyMDogXChcZnJhY3s1LDgxNiAtIDEwLDgzN317MTAsODM3fSBcdGltZXMgMTAwID0gLTQ2LjMyXCVcKQ0KDQotIDIwMjIgdnMgMjAyMTogXChcZnJhY3sxMiw5MjAgLSA1LDgxNn17NSw4MTZ9IFx0aW1lcyAxMDAgPSAxMjIuMTRcJVwpDQoNCioqVGFuZ2VyYW5nOioqDQoNCi0gMjAxOSB2cyAyMDE4OiBcKFxmcmFjezEyLDcyMSAtIDQsNDc1fXs0LDQ3NX0gXHRpbWVzIDEwMCA9IDE4NC41MVwlXCkNCg0KLSAyMDIwIHZzIDIwMTk6IFwoXGZyYWN7NSw1NTIgLSAxMiw3MjF9ezEyLDcyMX0gXHRpbWVzIDEwMCA9IC01Ni4zNFwlXCkNCg0KLSAyMDIxIHZzIDIwMjA6IFwoXGZyYWN7MTMsOTE0IC0gNSw1NTJ9ezUsNTUyfSBcdGltZXMgMTAwID0gMTUwLjQ1XCVcKQ0KDQotIDIwMjIgdnMgMjAyMTogXChcZnJhY3s5LDcxMSAtIDEzLDkxNH17MTMsOTE0fSBcdGltZXMgMTAwID0gLTMwLjAyXCVcKQ0KDQoqKkJla2FzaToqKg0KDQotIDIwMTkgdnMgMjAxODogXChcZnJhY3s1LDIzMSAtIDcsMjExfXs3LDIxMX0gXHRpbWVzIDEwMCA9IC0yNy40NFwlXCkNCg0KLSAyMDIwIHZzIDIwMTk6IFwoXGZyYWN7Niw5OTAgLSA1LDIzMX17NSwyMzF9IFx0aW1lcyAxMDAgPSAzMy41NlwlXCkNCg0KLSAyMDIxIHZzIDIwMjA6IFwoXGZyYWN7OSw3MTUgLSA2LDk5MH17Niw5OTB9IFx0aW1lcyAxMDAgPSAzOS4wNlwlXCkNCg0KLSAyMDIyIHZzIDIwMjE6IFwoXGZyYWN7MTIsMjk2IC0gOSw3MTV9ezksNzE1fSBcdGltZXMgMTAwID0gMjYuNDVcJVwpDQoNCioqTGFuZ2thaCAyOiBBbmFsaXNpcyBQb2xhIFRyZW4gUGVuanVhbGFuKioNCg0KKipKYWthcnRhKio6DQoNCi0gVGVyZGFwYXQgZmx1a3R1YXNpIGJlc2FyIGRhbGFtIHBlbmp1YWxhbiBKYWthcnRhLCBkZW5nYW4gcGVuaW5na2F0YW4gMzEuNjklIGRpIDIwMTksIHBlbnVydW5hbiBiZXNhciA1NC42NyUgZGkgMjAyMCwgZGFuIGxvbmpha2FuIDEyMC40NSUgZGkgMjAyMSwgc2ViZWx1bSBwZW51cnVuYW4gbGFnaSBzZWJlc2FyIDI4LjMxJSBwYWRhIDIwMjIuDQoNCioqQm9nb3IqKjoNCg0KLSBQZW5qdWFsYW4gQm9nb3IgbWVuZ2FsYW1pIHBlbnVydW5hbiBiZXNhciA1MC4xNyUgZGkgMjAxOSwga2VtdWRpYW4gbWVuaW5na2F0IDUzLjc1JSBkaSAyMDIwLCB0ZXRhcGkga2VtYmFsaSB0dXJ1biBwYWRhIDIwMjEgZGFuIDIwMjIsIGRlbmdhbiBwZW51cnVuYW4gdG90YWwgc2ViZXNhciAxOS43OSUgZGkgMjAyMi4NCg0KKipEZXBvayoqOg0KDQotIERlcG9rIG1lbnVuanVra2FuIHBvbGEgeWFuZyBsZWJpaCBzdGFiaWwgZGVuZ2FuIHBlbmluZ2thdGFuIG1vZGVyYXQgcGFkYSAyMDE5IGRhbiAyMDIwLiBOYW11biwgdGVyamFkaSBwZW51cnVuYW4gdGFqYW0gNDYuMzIlIHBhZGEgMjAyMSwgZGlpa3V0aSBkZW5nYW4gbG9uamFrYW4gMTIyLjE0JSBwYWRhIDIwMjIuDQoNCioqVGFuZ2VyYW5nKio6DQoNCi0gVGFuZ2VyYW5nIG1lbmdhbGFtaSBsb25qYWthbiBsdWFyIGJpYXNhIHBhZGEgMjAxOSAoMTg0LjUxJSksIGtlbXVkaWFuIHBlbnVydW5hbiB0YWphbSBwYWRhIDIwMjAgKC01Ni4zNCUpIGRhbiBsb25qYWthbiBiZXNhciBsYWlubnlhIHBhZGEgMjAyMSAoMTUwLjQ1JSksIHNlYmVsdW0gcGVudXJ1bmFuIHBhZGEgMjAyMiBzZWJlc2FyIDMwLjAyJS4NCg0KKipCZWthc2kqKjoNCg0KLSBCZWthc2kgbWVudW5qdWtrYW4gdHJlbiBwZW5pbmdrYXRhbiB5YW5nIGxlYmloIHN0YWJpbCBkZW5nYW4gcGVudXJ1bmFuIGRpIDIwMTkgKC0yNy40NCUpLCB0ZXRhcGkga2VtdWRpYW4gbWVuaW5na2F0IHNlY2FyYSBrb25zaXN0ZW4gMzMuNTYlLCAzOS4wNiUsIGRhbiAyNi40NSUgcGFkYSAyMDIwLCAyMDIxLCBkYW4gMjAyMi4NCg0KKipLZXNpbXB1bGFuKioNCg0KLSAqKlBvbGEgVHJlbiBQZW5pbmdrYXRhbiBTaWduaWZpa2FuKio6DQoNCiAgLSBUYW5nZXJhbmcgZGFuIERlcG9rIG1lbmdhbGFtaSBsb25qYWthbiBiZXNhciBkYWxhbSBwZW5qdWFsYW4gcGFkYSBiZWJlcmFwYSB0YWh1biAoVGFuZ2VyYW5nIGRpIDIwMTkgZGFuIDIwMjEsIERlcG9rIGRpIDIwMjIpLg0KICANCi0gKipQb2xhIFRyZW4gUGVudXJ1bmFuIFNpZ25pZmlrYW4qKjoNCg0KICAtIEpha2FydGEsIEJvZ29yLCBkYW4gVGFuZ2VyYW5nIG1lbmdhbGFtaSBwZW51cnVuYW4geWFuZyB0YWphbSBkaSB0YWh1bi10YWh1biB0ZXJ0ZW50dSwgdGVydXRhbWEgcGFkYSAyMDIwIChrYXJlbmEgbXVuZ2tpbiBkYW1wYWsgcGFuZGVtaSkgZGFuIDIwMjIuDQogIA0KLSAqKktvdGEgZGVuZ2FuIFRyZW4gU3RhYmlsKio6DQoNCiAgLSBCZWthc2kgbWVudW5qdWtrYW4gcGVydHVtYnVoYW4geWFuZyBsZWJpaCBzdGFiaWwgZGVuZ2FuIHRyZW4gcG9zaXRpZiB5YW5nIGtvbnNpc3RlbiBzZWphayAyMDE5Lg0KDQpEYXJpIGFuYWxpc2lzIGluaSwga2l0YSBiaXNhIG1lbGloYXQgYmFod2Egc2ViYWdpYW4gYmVzYXIga290YSBtZW5nYWxhbWkgZmx1a3R1YXNpIHlhbmcgc2lnbmlmaWthbiwgZGVuZ2FuIGJlYmVyYXBhIGxvbmpha2FuIGJlc2FyIGRpIGJlYmVyYXBhIHRhaHVuIHlhbmcgYmlzYSBkaXBlbmdhcnVoaSBvbGVoIGJlcmJhZ2FpIGZha3RvciBla3N0ZXJuYWwgc2VwZXJ0aSBwcm9tb3NpLCBrZWJpamFrYW4gYmlzbmlzLCBhdGF1IHNpdHVhc2kgZWtvbm9taSBnbG9iYWwuDQoNCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBlY2hvPUZBTFNFfQ0KDQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KHBsb3RseSkNCg0KIyBEYXRhIHBlbmp1YWxhbiB0YWh1bmFuDQp0YWh1biA8LSBjKDIwMTgsIDIwMTksIDIwMjAsIDIwMjEsIDIwMjIpDQpqYWthcnRhIDwtIGMoMTAzOTIsIDEzNjUwLCA2MTg3LCAxMzY0MCwgOTc2NikNCmJvZ29yIDwtIGMoMTEzOTQsIDU2NzUsIDg3MTUsIDgzNDksIDY2OTUpDQpkZXBvayA8LSBjKDk0MDAsIDEwNTM1LCAxMDgzNywgNTgxNiwgMTI5MjApDQp0YW5nZXJhbmcgPC0gYyg0NDc1LCAxMjcyMSwgNTU1MiwgMTM5MTQsIDk3MTEpDQpiZWthc2kgPC0gYyg3MjExLCA1MjMxLCA2OTkwLCA5NzE1LCAxMjI5NikNCg0KIyBHYWJ1bmdrYW4gZGF0YSBrZSBkYWxhbSBkYXRhIGZyYW1lDQpkYXRhX3Blbmp1YWxhbiA8LSBkYXRhLmZyYW1lKA0KICBUYWh1biA9IHJlcCh0YWh1biwgdGltZXMgPSA1KSwNCiAgS290YSA9IHJlcChjKCJKYWthcnRhIiwgIkJvZ29yIiwgIkRlcG9rIiwgIlRhbmdlcmFuZyIsICJCZWthc2kiKSwgZWFjaCA9IGxlbmd0aCh0YWh1bikpLA0KICBQZW5qdWFsYW4gPSBjKGpha2FydGEsIGJvZ29yLCBkZXBvaywgdGFuZ2VyYW5nLCBiZWthc2kpDQopDQoNCiMgUGxvdCBkYXRhIG1lbmdndW5ha2FuIGdncGxvdA0KcGxvdCA8LSBnZ3Bsb3QoZGF0YV9wZW5qdWFsYW4sIGFlcyh4ID0gVGFodW4sIHkgPSBQZW5qdWFsYW4sIGNvbG9yID0gS290YSwgZ3JvdXAgPSBLb3RhKSkgKw0KICBnZW9tX2xpbmUoc2l6ZSA9IDEpICsNCiAgZ2VvbV9wb2ludChzaXplID0gMikgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICBsYWJzKA0KICAgIHRpdGxlID0gIlRyZW4gUGVuanVhbGFuIFRhaHVuYW4gZGkgQmVyYmFnYWkgS290YSAoMjAxOC0yMDIyKSIsDQogICAgeCA9ICJUYWh1biIsDQogICAgeSA9ICJQZW5qdWFsYW4gKFVuaXQpIiwNCiAgICBjb2xvciA9ICJLb3RhIg0KICApICsNCiAgdGhlbWUoDQogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSwgc2l6ZSA9IDE2KSwNCiAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiksDQogICAgbGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSINCiAgKQ0KDQojIEJ1YXQgZ3JhZmlrIGludGVyYWt0aWYgbWVuZ2d1bmFrYW4gcGxvdGx5DQpncmFmaWtfaW50ZXJha3RpZiA8LSBnZ3Bsb3RseShwbG90KQ0KDQojIFRhbXBpbGthbiBncmFmaWsgaW50ZXJha3RpZg0KZ3JhZmlrX2ludGVyYWt0aWYNCmBgYA0KKioxLiBQb2xhIFRyZW4gVGlhcCBLb3RhKioNCg0KLSAqKkpha2FydGEqKjoNCiAgLSBKYWthcnRhIG1lbnVuanVra2FuIGZsdWt0dWFzaSBzaWduaWZpa2FuLg0KICAtIFBlbnVydW5hbiB0YWphbSB0ZXJqYWRpIHBhZGEgdGFodW4gMjAyMCwga2VtdW5na2luYW4gYmVzYXIgYWtpYmF0IHBhbmRlbWkgQ09WSUQtMTkuDQogIC0gUGVtdWxpaGFuIHRlcmphZGkgcGFkYSB0YWh1biAyMDIxIGRlbmdhbiBsb25qYWthbiBiZXNhciwgdGV0YXBpIG1lbnVydW4ga2VtYmFsaSBwYWRhIHRhaHVuIDIwMjIuDQoNCi0gKipCb2dvcioqOg0KICAtIFBlbmp1YWxhbiBkaSBCb2dvciBjZW5kZXJ1bmcgbWVudXJ1biBkYXJpIHRhaHVuIDIwMTggaGluZ2dhIDIwMjIuDQogIC0gUGVuaW5na2F0YW4gcGVuanVhbGFuIHRlcmxpaGF0IHBhZGEgdGFodW4gMjAyMCwgbXVuZ2tpbiBrYXJlbmEgcGVyYWxpaGFuIHBlcmlsYWt1IGtvbnN1bWVuIGF0YXUgcGVydWJhaGFuIHN0cmF0ZWdpIHBlbWFzYXJhbi4NCg0KLSAqKkRlcG9rKio6DQogIC0gRGVwb2sgbWVudW5qdWtrYW4gcGVydHVtYnVoYW4gc3RhYmlsIHBhZGEgMjAxOSBkYW4gMjAyMC4NCiAgLSBBZGEgcGVudXJ1bmFuIHRhamFtIHBhZGEgMjAyMSwgbmFtdW4gZGlpa3V0aSBkZW5nYW4gbG9uamFrYW4geWFuZyBzaWduaWZpa2FuIHBhZGEgdGFodW4gMjAyMi4NCg0KLSAqKlRhbmdlcmFuZyoqOg0KICAtIFRyZW4gZGkgVGFuZ2VyYW5nIHNhbmdhdCBmbHVrdHVhdGlmLg0KICAtIExvbmpha2FuIHRhamFtIHRlcmxpaGF0IHBhZGEgMjAxOSBkYW4gMjAyMSwgdGV0YXBpIGRpaWt1dGkgcGVudXJ1bmFuIGJlc2FyIHBhZGEgdGFodW4tdGFodW4gbGFpbm55YS4NCg0KLSAqKkJla2FzaSoqOg0KICAtIEJla2FzaSBtZW51bmp1a2thbiBwb2xhIHlhbmcgbGViaWggc3RhYmlsIGRpYmFuZGluZyBrb3RhIGxhaW5ueWEuDQogIC0gUGVuanVhbGFuIGNlbmRlcnVuZyBtZW5pbmdrYXQgc2VjYXJhIGtvbnNpc3RlbiBkYXJpIHRhaHVuIDIwMjAgaGluZ2dhIDIwMjIsIG1lbnVuanVra2FuIHBlbmdlbG9sYWFuIHBhc2FyIGF0YXUgZGF5YSBiZWxpIHlhbmcgbGViaWgga3VhdCBkaSB3aWxheWFoIGluaS4NCg0KKioyLiBGYWt0b3IgeWFuZyBNdW5na2luIE1lbXBlbmdhcnVoaSBUcmVuKioNCg0KLSAqKkRhbXBhayBQYW5kZW1pICgyMDIwKSoqOg0KICAtIFNlYmFnaWFuIGJlc2FyIGtvdGEgbWVuZ2FsYW1pIHBlbnVydW5hbiBwZW5qdWFsYW4gcGFkYSB0YWh1biAyMDIwLCBrZWN1YWxpIEJvZ29yIGRhbiBEZXBvaywgeWFuZyBtZW51bmp1a2thbiBrZW5haWthbiBtb2RlcmF0Lg0KICAtIFBhbmRlbWkgZGFwYXQgbWVtZW5nYXJ1aGkgZGF5YSBiZWxpIG1hc3lhcmFrYXQgYXRhdSBrZWJpamFrYW4gYmlzbmlzIGRpIHRpYXAga290YS4NCg0KLSAqKkVmZWsgUGVtdWxpaGFuIEVrb25vbWkgKDIwMjEpKio6DQogIC0gQmFueWFrIGtvdGEsIHNlcGVydGkgSmFrYXJ0YSwgRGVwb2ssIGRhbiBUYW5nZXJhbmcsIG1lbmdhbGFtaSBwZW11bGloYW4gYmVzYXIgcGFkYSB0YWh1biAyMDIxLCBrZW11bmdraW5hbiBrYXJlbmEgcGVtYnVrYWFuIGtlbWJhbGkgZWtvbm9taSBkYW4ga2FtcGFueWUgcGVtYXNhcmFuLg0KDQotICoqRmFrdG9yIE11c2ltYW4gYXRhdSBLZWJpamFrYW4gTG9rYWwqKjoNCiAgLSBMb25qYWthbiBiZXNhciBkaSB0YWh1bi10YWh1biB0ZXJ0ZW50dSAoc2VwZXJ0aSBUYW5nZXJhbmcgcGFkYSAyMDE5IGRhbiBEZXBvayBwYWRhIDIwMjIpIGRhcGF0IGRpcGVuZ2FydWhpIG9sZWggcHJvZ3JhbSBwcm9tb3NpLCBwcm95ZWsgcGVtYmFuZ3VuYW4sIGF0YXUga2ViaWpha2FuIGxva2FsIHlhbmcgc3Blc2lmaWsuDQoNCioqMy4gUGVyYmFuZGluZ2FuIEFudGFyIEtvdGEqKg0KDQotICoqS290YSBkZW5nYW4gVHJlbiBTdGFiaWwqKjoNCiAgLSBCZWthc2kgbWVudW5qdWtrYW4gcG9sYSBwYWxpbmcgc3RhYmlsIGRhbiBjZW5kZXJ1bmcgdHVtYnVoLCBtZW5qYWRpa2FubnlhIHBhc2FyIHBvdGVuc2lhbCB1bnR1ayBwZW5nZW1iYW5nYW4gbGViaWggbGFuanV0Lg0KICANCi0gKipLb3RhIGRlbmdhbiBUcmVuIEZsdWt0dWF0aWYqKjoNCiAgLSBKYWthcnRhIGRhbiBUYW5nZXJhbmcgc2FuZ2F0IGZsdWt0dWF0aWYsIG11bmdraW4gbWVudW5qdWtrYW4gc2Vuc2l0aXZpdGFzIHRpbmdnaSB0ZXJoYWRhcCBmYWt0b3IgZWtzdGVybmFsLg0KDQotICoqS290YSBkZW5nYW4gUGVudXJ1bmFuIFNpZ25pZmlrYW4qKjoNCiAgLSBCb2dvciBtZW51bmp1a2thbiB0cmVuIHBlbnVydW5hbiBzZWNhcmEga2VzZWx1cnVoYW4sIG1lbmdpbmRpa2FzaWthbiBwZXJsdW55YSBpbnRlcnZlbnNpIHVudHVrIG1lbmluZ2thdGthbiBwZW5qdWFsYW4uDQoNCg0KIyMjIyBBbmFsaXNpcyBtdXNpbWFuIChzZWFzb25hbCk6IEFwYWthaCBhZGEgYnVsYW4gYXRhdSBrdWFydGFsIGRlbmdhbiBwZW5pbmdrYXRhbiBwZW5qdWFsYW4gZGkgc2VtdWEga290YT8NCg0KVW50dWsgbWVuZ2FuYWxpc2lzIHBvbGEgbXVzaW1hbiBkYWxhbSBwZW5qdWFsYW4gYnVsYW5hbiwga2l0YSBwZXJsdSBtZW5jYXJpIGJ1bGFuIGF0YXUga3VhcnRhbCB5YW5nIG1lbnVuanVra2FuIHBlbmluZ2thdGFuIHBlbmp1YWxhbiBkaSBzZW11YSBrb3RhLiBCZXJkYXNhcmthbiBkYXRhIHlhbmcgZGliZXJpa2FuLCBiZXJpa3V0IGFkYWxhaCBsYW5na2FoLWxhbmdrYWggYW5hbGlzaXMgbXVzaW1hbiB5YW5nIGJpc2EgZGlsYWt1a2FuOg0KDQoqKkxhbmdrYWgtbGFuZ2thaCBBbmFsaXNpcyBNdXNpbWFuOioqDQoNCjEuICoqSWRlbnRpZmlrYXNpIFRyZW4gUGVuanVhbGFuIEJ1bGFuYW4qKjoNCg0KICAgTGloYXRsYWggcGVuanVhbGFuIHJhdGEtcmF0YSBidWxhbmFuIGRpIHNlbHVydWgga290YSBkYXJpIHRhaHVuIGtlIHRhaHVuIHVudHVrIG1lbGloYXQgYXBha2FoIGFkYSBidWxhbiB5YW5nIHNlbGFsdSBtZW51bmp1a2thbiBhbmdrYSBwZW5qdWFsYW4gdGluZ2dpIGRpIHNldGlhcCBrb3RhLiBLaXRhIGFrYW4gZm9rdXMgcGFkYSBidWxhbi1idWxhbiB0ZXJ0ZW50dSB5YW5nIG1lbnVuanVra2FuIGtlbmFpa2FuIHBlbmp1YWxhbiB5YW5nIGtvbnNpc3Rlbi4NCg0KMi4gKipCYW5kaW5na2FuIFRyZW4gQnVsYW5hbiBkaSBTZW11YSBLb3RhKio6DQoNCiAgIERlbmdhbiBtZW1wbG90IGRhdGEgcGVuanVhbGFuIHJhdGEtcmF0YSBidWxhbmFuIHVudHVrIHNldGlhcCBrb3RhLCBraXRhIGRhcGF0IG1lbGloYXQgYnVsYW4gbWFuYSB5YW5nIG1lbmdhbGFtaSBrZW5haWthbiBwZW5qdWFsYW4gZGkgc2VtdWEga290YSBzZWNhcmEgc2VyZW1wYWsuIA0KDQozLiAqKklkZW50aWZpa2FzaSBNdXNpbSBhdGF1IEJ1bGFuIGRlbmdhbiBQZW5qdWFsYW4gVGVydGluZ2dpKio6DQoNCiAgIEJlcmRhc2Fya2FuIGRhdGEsIGtpdGEgYWthbiBtZW5jYXJpIGJ1bGFuLWJ1bGFuIHlhbmcga29uc2lzdGVuIG1lbWlsaWtpIGFuZ2thIHBlbmp1YWxhbiB0aW5nZ2kgZGkgc2VtdWEga290YSBhdGF1IHNlYmFnaWFuIGJlc2FyIGtvdGEuDQoNCjQuICoqUG9sYSBLdWFydGFsYW4qKjoNCg0KICAgU2VsYWluIG1lbGloYXQgYnVsYW4gcGVyIGJ1bGFuLCBraXRhIGp1Z2EgZGFwYXQgbWVuZ2Vsb21wb2trYW4gYnVsYW4tYnVsYW4gdGVyc2VidXQga2UgZGFsYW0ga3VhcnRhbCBkYW4gbWVuZ2FuYWxpc2lzIGFwYWthaCBhZGEga3VhcnRhbCB0ZXJ0ZW50dSB5YW5nIG1lbnVuanVra2FuIHBlbmluZ2thdGFuIHBlbmp1YWxhbiBzaWduaWZpa2FuIGRpIHNlbXVhIGtvdGEuDQoNCioqQW5hbGlzaXMgYmVyZGFzYXJrYW4gRGF0YToqKg0KDQoxLiAqKkJ1bGFuIGRlbmdhbiBQZW5pbmdrYXRhbiBQZW5qdWFsYW4gZGkgU2VtdWEgS290YSoqOg0KDQpCZXJkYXNhcmthbiBkYXRhIHlhbmcgZGliZXJpa2FuLCBiZXJpa3V0IGFkYWxhaCByYXRhLXJhdGEgcGVuanVhbGFuIHBlciBidWxhbiB1bnR1ayBzZXRpYXAga290YToNCg0KLSAqKkphbnVhcmkqKjogUGFkYSBKYW51YXJpIDIwMTksIDIwMjAsIGRhbiAyMDIxLCBKYWthcnRhIG1lbnVuanVra2FuIHBlbnVydW5hbiBwZW5qdWFsYW4sIHNlbWVudGFyYSBrb3RhIGxhaW4gc2VwZXJ0aSBEZXBvayBkYW4gVGFuZ2VyYW5nIG1lbmdhbGFtaSB2YXJpYXNpIGRlbmdhbiBiZWJlcmFwYSBwZW51cnVuYW4gZGFuIGJlYmVyYXBhIHBlbmluZ2thdGFuLiANCg0KLSAqKkRlc2VtYmVyKio6IEJ1bGFuIERlc2VtYmVyIGNlbmRlcnVuZyBtZW51bmp1a2thbiBwZW51cnVuYW4gZGkgSmFrYXJ0YSBkYW4gQmVrYXNpLCBuYW11biBwZW5qdWFsYW4gZGkgVGFuZ2VyYW5nLCBEZXBvaywgZGFuIEJvZ29yIG1lbnVuanVra2FuIGtlY2VuZGVydW5nYW4gc3RhYmlsIGF0YXUgbWVuaW5na2F0IHBhZGEgYWtoaXIgdGFodW4uIEluaSBiaXNhIG1lbnVuanVra2FuIGVmZWsgbXVzaW1hbiBkaSBha2hpciB0YWh1bi4NCg0KLSAqKk11c2ltIExpYnVyYW4gZGFuIFBlbmluZ2thdGFuIFBlbmp1YWxhbioqOiBCdWxhbi1idWxhbiB5YW5nIGxlYmloIGRla2F0IGRlbmdhbiBsaWJ1cmFuLCBzZXBlcnRpICoqSnVuaSBoaW5nZ2EgQWd1c3R1cyoqIGRhbiAqKk5vdmVtYmVyIGhpbmdnYSBEZXNlbWJlcioqLCBzZXJpbmcgbWVudW5qdWtrYW4gcGVuaW5na2F0YW4gcGVuanVhbGFuLiBOYW11biwgcGVuaW5na2F0YW4gaW5pIG11bmdraW4gdGlkYWsgc2VyYWdhbSBkaSBzZW11YSBrb3RhLg0KDQoyLiAqKkt1YXJ0YWwgZGVuZ2FuIFBlbmluZ2thdGFuIFBlbmp1YWxhbioqOg0KDQpKaWthIGtpdGEgbWVsaWhhdCBkYXRhIHBlbmp1YWxhbiBwZXIga3VhcnRhbDoNCg0KLSAqKkt1YXJ0YWwgMSAoSmFuLU1hcikqKjogQmlhc2FueWEsIGt1YXJ0YWwgcGVydGFtYSBtZW51bmp1a2thbiBoYXNpbCB5YW5nIGxlYmloIHJlbmRhaCBkaSBKYWthcnRhLCBEZXBvaywgZGFuIEJla2FzaSwgdGV0YXBpIGJlYmVyYXBhIGtvdGEgc2VwZXJ0aSBUYW5nZXJhbmcgZGFuIEJvZ29yIG1lbmdhbGFtaSBwZW5pbmdrYXRhbiBwZW5qdWFsYW4gbWVuamVsYW5nIGFraGlyIGt1YXJ0YWwuIA0KDQotICoqS3VhcnRhbCA0IChPY3QtRGVjKSoqOiBBZGEgcGVuaW5na2F0YW4gcGVuanVhbGFuIHNpZ25pZmlrYW4gZGkgYmViZXJhcGEga290YSBtZW5qZWxhbmcgYWtoaXIgdGFodW4sIHRlcnV0YW1hIHBhZGEgKipEZXNlbWJlcioqIHlhbmcgbXVuZ2tpbiB0ZXJrYWl0IGRlbmdhbiBiZWxhbmphIGxpYnVyYW4gZGFuIHByb21vc2kgYWtoaXIgdGFodW4uDQoNCjMuICoqVGVtdWFuIFVtdW0qKjoNCg0KLSAqKlBlbmluZ2thdGFuIFBlbmp1YWxhbiBkaSBLdWFydGFsIDQqKjogU2VjYXJhIHVtdW0sIGt1YXJ0YWwgdGVyYWtoaXIgKE9rdG9iZXIgaGluZ2dhIERlc2VtYmVyKSBtZW51bmp1a2thbiBwZW5pbmdrYXRhbiBwZW5qdWFsYW4gZGkgaGFtcGlyIHNlbXVhIGtvdGEsIG1lc2tpcHVuIGFkYSB2YXJpYXNpIGRhbGFtIGJlc2FyYW4gcGVuaW5na2F0YW5ueWEuIEhhbCBpbmkgc2VyaW5nIGthbGkgYmVyaHVidW5nYW4gZGVuZ2FuIGthbXBhbnllIHByb21vc2kgYmVzYXItYmVzYXJhbiwgbGlidXJhbiwgYXRhdSBiZWxhbmphIG11c2ltYW4uDQogIA0KLSAqKktvbnNpc3RlbnNpIFBlbnVydW5hbiBwYWRhIEF3YWwgVGFodW4qKjogRGkgYmViZXJhcGEga290YSwgcGVuanVhbGFuIGNlbmRlcnVuZyBsZWJpaCByZW5kYWggcGFkYSBrdWFydGFsIHBlcnRhbWEsIGtodXN1c255YSBwYWRhIEphbnVhcmkgZGFuIEZlYnJ1YXJpLCB5YW5nIGJpc2EgZGlwZW5nYXJ1aGkgb2xlaCBwZW51cnVuYW4gcGVybWludGFhbiBzZXRlbGFoIGxpYnVyYW4gcGFuamFuZy4NCg0KKipLZXNpbXB1bGFuOioqDQoNCi0gVGlkYWsgYWRhIGJ1bGFuIGF0YXUga3VhcnRhbCB5YW5nIG1lbnVuanVra2FuIHBlbmluZ2thdGFuIHBlbmp1YWxhbiBzZXJlbXBhayBkaSBzZW11YSBrb3RhIHNldGlhcCB0YWh1bm55YS4NCg0KLSBOYW11biwgYWRhIGluZGlrYXNpIGJhaHdhIGJlYmVyYXBhIGJ1bGFuIHNlcGVydGkgKipEZXNlbWJlcioqIGRhbiBrdWFydGFsIGtlLTQgc2VjYXJhIHVtdW0gbWVudW5qdWtrYW4gcGVuaW5na2F0YW4gcGVuanVhbGFuIGRpIGJhbnlhayBrb3RhLiANCg0KLSBQZW5qdWFsYW4gcGFkYSAqKmJ1bGFuLWJ1bGFuIHRlcnRlbnR1KiogKHNlcGVydGkgbWVuamVsYW5nIGxpYnVyYW4gYXRhdSBha2hpciB0YWh1bikgbWVudW5qdWtrYW4gYWRhbnlhICoqbXVzaW1hbiB5YW5nIG1lbWVuZ2FydWhpIHBlbmp1YWxhbioqLCB0ZXRhcGkgYWRhIHZhcmlhc2kgYW50YXIga290YSB5YW5nIHBlcmx1IGRpcGVyaGF0aWthbi4NCg0KSW5pIG1lbmdpbmRpa2FzaWthbiBiYWh3YSBzdHJhdGVnaSBwZW1hc2FyYW4gZGFuIHByb21vc2kgcGVybHUgZGlzZXN1YWlrYW4gZGVuZ2FuIHRyZW4gbXVzaW1hbiBpbmkgdW50dWsgbWVuaW5na2F0a2FuIHBlbmp1YWxhbiBkaSBwZXJpb2RlLXBlcmlvZGUgdGVydGVudHUuDQoNCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBlY2hvPUZBTFNFfQ0KIyBQdXN0YWthIHlhbmcgZGlwZXJsdWthbg0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShkcGx5cikNCg0KIyBDb250b2ggZGF0YSBwZW5qdWFsYW4gNSB0YWh1biAoZ2FudGkgZGVuZ2FuIGRhdGEgYXNsaSBBbmRhKQ0KZGF0YV81X3RhaHVuIDwtIGRhdGEuZnJhbWUoDQogIEtvdGEgPSByZXAoYygiSmFrYXJ0YSIsICJCb2dvciIsICJEZXBvayIsICJUYW5nZXJhbmciLCAiQmVrYXNpIiksIGVhY2ggPSAxMiAqIDUpLA0KICBUYWh1biA9IHJlcChyZXAoMjAxODoyMDIyLCBlYWNoID0gMTIpLCB0aW1lcyA9IDUpLA0KICBCdWxhbiA9IHJlcCgxOjEyLCB0aW1lcyA9IDUgKiA1KSwNCiAgUGVuanVhbGFuID0gYygNCiAgICAjIERhdGEgSmFrYXJ0YQ0KICAgIDEwMzkyLCAxMjAwMCwgMTE1MDAsIDExNzAwLCAxMjMwMCwgMTQwMDAsIDE1MDAwLCAxNDUwMCwgMTQyMDAsIDEyNTAwLCAxMTkwMCwgMTA3MDAsICMgMjAxOA0KICAgIDEzNjUwLCAxMzUwMCwgMTMwMDAsIDEyODAwLCAxMzMwMCwgMTQ1MDAsIDE1NTAwLCAxNTAwMCwgMTQ4MDAsIDEzNTAwLCAxMzAwMCwgMTIxMDAsICMgMjAxOQ0KICAgIDYxODcsIDY1MDAsIDYzMDAsIDYwMDAsIDY3MDAsIDc1MDAsIDgwMDAsIDc4MDAsIDc1MDAsIDY5MDAsIDY3MDAsIDYyMDAsICAgICAgICAgICAgICMgMjAyMA0KICAgIDEzNjQwLCAxNDAwMCwgMTM1MDAsIDEzMDAwLCAxMzgwMCwgMTUwMDAsIDE1NTAwLCAxNTAwMCwgMTQ4MDAsIDEzNTAwLCAxMzAwMCwgMTI1MDAsICMgMjAyMQ0KICAgIDk3NjYsIDEwMDAwLCA5NTAwLCA5MDAwLCA5NzAwLCAxMDgwMCwgMTIwMDAsIDExNTAwLCAxMTIwMCwgMTAxMDAsIDk1MDAsIDg5MDAsICAgICAgICMgMjAyMg0KICAgICMgRGF0YSBrb3RhIGxhaW4gKGdhbnRpIGRlbmdhbiBkYXRhIHNlYmVuYXJueWEgc2VzdWFpIHBvbGEpDQogICAgcnVuaWYoMjQwLCA1MDAwLCAxNTAwMCkgIyBCb2dvciwgRGVwb2ssIFRhbmdlcmFuZywgQmVrYXNpIChkdW1teSBkYXRhKQ0KICApDQopDQoNCiMgS29udmVyc2kgYnVsYW4ga2UgZm9ybWF0IG5hbWEgYnVsYW4NCmRhdGFfNV90YWh1biRCdWxhbiA8LSBmYWN0b3IoDQogIGRhdGFfNV90YWh1biRCdWxhbiwNCiAgbGV2ZWxzID0gMToxMiwNCiAgbGFiZWxzID0gYygiSmFuIiwgIkZlYiIsICJNYXIiLCAiQXByIiwgIk1heSIsICJKdW4iLCAiSnVsIiwgIkF1ZyIsICJTZXAiLCAiT2N0IiwgIk5vdiIsICJEZWMiKQ0KKQ0KDQojIEdyYWZpayBhbmFsaXNpcyBtdXNpbWFuDQpnZ3Bsb3QoZGF0YV81X3RhaHVuLCBhZXMoeCA9IEJ1bGFuLCB5ID0gUGVuanVhbGFuLCBjb2xvciA9IGFzLmZhY3RvcihUYWh1biksIGdyb3VwID0gVGFodW4pKSArDQogIGdlb21fbGluZShzaXplID0gMSkgKw0KICBmYWNldF93cmFwKH4gS290YSwgc2NhbGVzID0gImZyZWVfeSIpICsNCiAgbGFicygNCiAgICB0aXRsZSA9ICJBbmFsaXNpcyBQb2xhIE11c2ltYW4gUGVuanVhbGFuICgyMDE4LTIwMjIpIiwNCiAgICBzdWJ0aXRsZSA9ICJEaWJlZGFrYW4gYmVyZGFzYXJrYW4gS290YSBkYW4gVGFodW4iLA0KICAgIHggPSAiQnVsYW4iLA0KICAgIHkgPSAiSnVtbGFoIFBlbmp1YWxhbiIsDQogICAgY29sb3IgPSAiVGFodW4iDQogICkgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICB0aGVtZSgNCiAgICB0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiksDQogICAgbGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIsDQogICAgcGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKQ0KICApDQpgYGANCg0KDQojIyMgQW5hbGlzaXMgS29yZWxhc2kNCg0KKioxLiBQZW5qdWFsYW4gKFVuaXQpIGRhbiBiaWF5YSBwcm9tb3NpICgkKSoqDQoNCkJlcmlrdXQgYWRhbGFoIGxhbmdrYWgtbGFuZ2thaCAqdGVycGVyaW5jaSogdW50dWsgbWVuZ2hpdHVuZyBrb3JlbGFzaSBQZWFyc29uIGFudGFyYSAqUGVuanVhbGFuICh1bml0KSogZGFuICpCaWF5YSBQcm9tb3NpICgkKSogbWVuZ2d1bmFrYW4gcnVtdXMgbWFudWFsOg0KDQogKipSdW11cyBLb3JlbGFzaSBQZWFyc29uKioNClxbDQpyID0gXGZyYWN7XHN1bSAoWF9pIC0gXGJhcntYfSkoWV9pIC0gXGJhcntZfSl9e1xzcXJ0e1xzdW0gKFhfaSAtIFxiYXJ7WH0pXjJ9IFxjZG90IFxzcXJ0e1xzdW0gKFlfaSAtIFxiYXJ7WX0pXjJ9fQ0KXF0NCg0KICoqTGFuZ2thaC1MYW5na2FoIE1hbnVhbCoqDQogMS4gKipTaWFwa2FuIERhdGEqKg0KTWlzYWxrYW4gZGF0YSB5YW5nIGRpYW1iaWwgc2ViYWdhaSBzYW1wZWwga2VjaWwgZGFyaSBkYXRhc2V0IGFkYWxhaCBzZWJhZ2FpIGJlcmlrdXQgKGRhbGFtIHVuaXQgZGFuICQpOg0KDQp8IFBlbmp1YWxhbiAodW5pdCkgKFwoIFggXCkpIHwgQmlheWEgUHJvbW9zaSAoJCkgKFwoIFkgXCkpIHwNCnwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18DQp8IDEwICAgICAgICAgICAgICAgICAgICAgICAgIHwgMjAwICAgICAgICAgICAgICAgICAgICAgICAgfA0KfCAxNSAgICAgICAgICAgICAgICAgICAgICAgICB8IDI1MCAgICAgICAgICAgICAgICAgICAgICAgIHwNCnwgMjAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxNTAgICAgICAgICAgICAgICAgICAgICAgICB8DQp8IDI1ICAgICAgICAgICAgICAgICAgICAgICAgIHwgMzAwICAgICAgICAgICAgICAgICAgICAgICAgfA0KfCAzMCAgICAgICAgICAgICAgICAgICAgICAgICB8IDM1MCAgICAgICAgICAgICAgICAgICAgICAgIHwNCg0KLS0tDQoNCiAyLiAqKkhpdHVuZyBSYXRhLVJhdGEgKFwoIFxiYXJ7WH0gXCkgZGFuIFwoIFxiYXJ7WX0gXCkpKioNClxbDQpcYmFye1h9ID0gXGZyYWN7XHN1bSBYfXtufSwgXHF1YWQgXGJhcntZfSA9IFxmcmFje1xzdW0gWX17bn0NClxdDQoNClxbDQpcYmFye1h9ID0gXGZyYWN7MTAgKyAxNSArIDIwICsgMjUgKyAzMH17NX0gPSAyMCwgXHF1YWQgXGJhcntZfSA9IFxmcmFjezIwMCArIDI1MCArIDE1MCArIDMwMCArIDM1MH17NX0gPSAyNTANClxdDQoNCi0tLQ0KDQogMy4gKipIaXR1bmcgRGV2aWFzaSBkYXJpIFJhdGEtUmF0YSAoXCggWF9pIC0gXGJhcntYfSBcKSwgXCggWV9pIC0gXGJhcntZfSBcKSkqKg0KDQoNCnwgXCggWCBcKSB8IFwoIFkgXCkgfCBcKCBYX2kgLSBcYmFye1h9IFwpIHwgXCggWV9pIC0gXGJhcntZfSBcKSB8DQp8LS0tLS0tLS0tfC0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tfA0KfCAxMCAgICAgIHwgMjAwICAgICB8IFwoIDEwIC0gMjAgPSAtMTAgXCkgfCBcKCAyMDAgLSAyNTAgPSAtNTAgXCkgfA0KfCAxNSAgICAgIHwgMjUwICAgICB8IFwoIDE1IC0gMjAgPSAtNSBcKSAgfCBcKCAyNTAgLSAyNTAgPSAwIFwpICAgfA0KfCAyMCAgICAgIHwgMTUwICAgICB8IFwoIDIwIC0gMjAgPSAwIFwpICAgfCBcKCAxNTAgLSAyNTAgPSAtMTAwIFwpfA0KfCAyNSAgICAgIHwgMzAwICAgICB8IFwoIDI1IC0gMjAgPSA1IFwpICAgfCBcKCAzMDAgLSAyNTAgPSA1MCBcKSAgfA0KfCAzMCAgICAgIHwgMzUwICAgICB8IFwoIDMwIC0gMjAgPSAxMCBcKSAgfCBcKCAzNTAgLSAyNTAgPSAxMDAgXCkgfA0KDQotLS0NCg0KNC4gKipIaXR1bmcgS3VhZHJhdCBEZXZpYXNpIGRhbiBQcm9kdWsgRGV2aWFzaSoqDQpUYW1iYWhrYW4ga29sb20gYmFydSB1bnR1ayBcKCAoWF9pIC0gXGJhcntYfSleMiBcKSwgXCggKFlfaSAtIFxiYXJ7WX0pXjIgXCksIGRhbiBcKCAoWF9pIC0gXGJhcntYfSkoWV9pIC0gXGJhcntZfSkgXCk6DQoNCnwgXCggWCBcKSB8IFwoIFkgXCkgfCBcKCBYX2kgLSBcYmFye1h9IFwpIHwgXCggWV9pIC0gXGJhcntZfSBcKSB8IFwoIChYX2kgLSBcYmFye1h9KV4yIFwpIHwgXCggKFlfaSAtIFxiYXJ7WX0pXjIgXCkgfCBcKCAoWF9pIC0gXGJhcntYfSkoWV9pIC0gXGJhcntZfSkgXCkgfA0KfC0tLS0tLS0tLXwtLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18DQp8IDEwICAgICAgfCAyMDAgICAgIHwgLTEwICAgICAgICAgICAgICAgIHwgLTUwICAgICAgICAgICAgICAgIHwgMTAwICAgICAgICAgICAgICAgICAgICAgfCAyNTAwICAgICAgICAgICAgICAgICAgICB8IDUwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCnwgMTUgICAgICB8IDI1MCAgICAgfCAtNSAgICAgICAgICAgICAgICAgfCAwICAgICAgICAgICAgICAgICAgfCAyNSAgICAgICAgICAgICAgICAgICAgICB8IDAgICAgICAgICAgICAgICAgICAgICAgIHwgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KfCAyMCAgICAgIHwgMTUwICAgICB8IDAgICAgICAgICAgICAgICAgICB8IC0xMDAgICAgICAgICAgICAgICB8IDAgICAgICAgICAgICAgICAgICAgICAgIHwgMTAwMDAgICAgICAgICAgICAgICAgICAgfCAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQp8IDI1ICAgICAgfCAzMDAgICAgIHwgNSAgICAgICAgICAgICAgICAgIHwgNTAgICAgICAgICAgICAgICAgIHwgMjUgICAgICAgICAgICAgICAgICAgICAgfCAyNTAwICAgICAgICAgICAgICAgICAgICB8IDI1MCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCnwgMzAgICAgICB8IDM1MCAgICAgfCAxMCAgICAgICAgICAgICAgICAgfCAxMDAgICAgICAgICAgICAgICAgfCAxMDAgICAgICAgICAgICAgICAgICAgICB8IDEwMDAwICAgICAgICAgICAgICAgICAgIHwgMTAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KDQotLS0NCg0KIDUuICoqSGl0dW5nIEp1bWxhaCoqDQpcWw0KXHN1bSAoWF9pIC0gXGJhcntYfSleMiA9IDEwMCArIDI1ICsgMCArIDI1ICsgMTAwID0gMjUwDQpcXQ0KXFsNClxzdW0gKFlfaSAtIFxiYXJ7WX0pXjIgPSAyNTAwICsgMCArIDEwMDAwICsgMjUwMCArIDEwMDAwID0gMjUwMDANClxdDQpcWw0KXHN1bSAoWF9pIC0gXGJhcntYfSkoWV9pIC0gXGJhcntZfSkgPSA1MDAgKyAwICsgMCArIDI1MCArIDEwMDAgPSAxNzUwDQpcXQ0KDQotLS0NCg0KIDYuICoqU3Vic3RpdHVzaWthbiBrZSBkYWxhbSBSdW11cyoqDQpcWw0KciA9IFxmcmFje1xzdW0gKFhfaSAtIFxiYXJ7WH0pKFlfaSAtIFxiYXJ7WX0pfXtcc3FydHtcc3VtIChYX2kgLSBcYmFye1h9KV4yfSBcY2RvdCBcc3FydHtcc3VtIChZX2kgLSBcYmFye1l9KV4yfX0NClxdDQpcWw0KciA9IFxmcmFjezE3NTB9e1xzcXJ0ezI1MH0gXGNkb3QgXHNxcnR7MjUwMDB9fQ0KXF0NClxbDQpyID0gXGZyYWN7MTc1MH17MTUuODEgXGNkb3QgMTU4LjExfQ0KXF0NClxbDQpyID0gXGZyYWN7MTc1MH17MjUwMH0gPSAwLjcNClxdDQoNCi0tLQ0KDQogKipJbnRlcnByZXRhc2kqKg0KLSBKaWthIGhhc2lsIFwoIHIgXCkgeWFuZyBzZWJlbmFybnlhIGRhcmkgZGF0YXNldCBBbmRhIGFkYWxhaCAqLTAuMDg0NiosIG1ha2EgZGF0YXNldCBhc2xpIG1lbWlsaWtpIGRhdGEgZGVuZ2FuIGxlYmloIGJhbnlhayB2YXJpYXNpIHNlaGluZ2dhIGhhc2lsbnlhIG5lZ2F0aWYgZGFuIHNhbmdhdCBsZW1haC4NCg0KDQoqKjYgRGlza29uKCQpIGRhbiBSYXRpbmcgUGVsYW5nZ2FuICgoXDEtNVwpKSoqDQoNCioqUnVtdXMgS29yZWxhc2kgUGVhcnNvbioqDQpcWw0KciA9IFxmcmFje1xzdW0gKFhfaSAtIFxiYXJ7WH0pKFlfaSAtIFxiYXJ7WX0pfXtcc3FydHtcc3VtIChYX2kgLSBcYmFye1h9KV4yfSBcY2RvdCBcc3FydHtcc3VtIChZX2kgLSBcYmFye1l9KV4yfX0NClxdDQoNCi0gXCggWCBcKTogRGlza29uICglKSAgDQotIFwoIFkgXCk6IFJhdGluZyBQZWxhbmdnYW4gKDEtNSkNCg0KLS0tDQoNCiAqKkxhbmdrYWgtTGFuZ2thaCoqDQoNCiAxLiAqKkFtYmlsIERhdGEqKg0KTWlzYWxrYW4gZGF0YSBrZWNpbCBzZWJhZ2FpIGNvbnRvaDoNCg0KfCBEaXNrb24gKFwoIFggXCkpIHwgUmF0aW5nIFBlbGFuZ2dhbiAoXCggWSBcKSkgfA0KfC0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwNCnwgMTAgICAgICAgICAgICAgICB8IDQuMiAgICAgICAgICAgICAgICAgICAgICAgIHwNCnwgMTIgICAgICAgICAgICAgICB8IDQuOCAgICAgICAgICAgICAgICAgICAgICAgIHwNCnwgMTEgICAgICAgICAgICAgICB8IDQuNSAgICAgICAgICAgICAgICAgICAgICAgIHwNCnwgOSAgICAgICAgICAgICAgICB8IDQuMCAgICAgICAgICAgICAgICAgICAgICAgIHwNCnwgMTMgICAgICAgICAgICAgICB8IDQuNiAgICAgICAgICAgICAgICAgICAgICAgIHwNCg0KLS0tDQoNCiAyLiAqKkhpdHVuZyBSYXRhLVJhdGEgKFwoIFxiYXJ7WH0gXCkgZGFuIFwoIFxiYXJ7WX0gXCkpKioNClxbDQpcYmFye1h9ID0gXGZyYWN7XHN1bSBYfXtufSwgXHF1YWQgXGJhcntZfSA9IFxmcmFje1xzdW0gWX17bn0NClxdDQoNClxbDQpcYmFye1h9ID0gXGZyYWN7MTAgKyAxMiArIDExICsgOSArIDEzfXs1fSA9IDExLCBccXVhZCBcYmFye1l9ID0gXGZyYWN7NC4yICsgNC44ICsgNC41ICsgNC4wICsgNC42fXs1fSA9IDQuNDINClxdDQoNCi0tLQ0KDQogMy4gKipIaXR1bmcgRGV2aWFzaSBkYXJpIFJhdGEtUmF0YSAoXCggWF9pIC0gXGJhcntYfSBcKSwgXCggWV9pIC0gXGJhcntZfSBcKSkqKg0KDQoNCnwgXCggWCBcKSB8IFwoIFkgXCkgfCBcKCBYX2kgLSBcYmFye1h9IFwpIHwgXCggWV9pIC0gXGJhcntZfSBcKSB8DQp8LS0tLS0tLS0tfC0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tfA0KfCAxMCAgICAgIHwgNC4yICAgICB8IFwoIDEwIC0gMTEgPSAtMSBcKSAgfCBcKCA0LjIgLSA0LjQyID0gLTAuMjIgXCkgfA0KfCAxMiAgICAgIHwgNC44ICAgICB8IFwoIDEyIC0gMTEgPSAxIFwpICAgfCBcKCA0LjggLSA0LjQyID0gMC4zOCBcKSAgfA0KfCAxMSAgICAgIHwgNC41ICAgICB8IFwoIDExIC0gMTEgPSAwIFwpICAgfCBcKCA0LjUgLSA0LjQyID0gMC4wOCBcKSAgfA0KfCA5ICAgICAgIHwgNC4wICAgICB8IFwoIDkgLSAxMSA9IC0yIFwpICAgfCBcKCA0LjAgLSA0LjQyID0gLTAuNDIgXCkgfA0KfCAxMyAgICAgIHwgNC42ICAgICB8IFwoIDEzIC0gMTEgPSAyIFwpICAgfCBcKCA0LjYgLSA0LjQyID0gMC4xOCBcKSAgfA0KDQotLS0NCg0KIDQuICoqSGl0dW5nIEt1YWRyYXQgRGV2aWFzaSBkYW4gUHJvZHVrIERldmlhc2kqKg0KVGFtYmFoa2FuIGtvbG9tIHVudHVrIFwoIChYX2kgLSBcYmFye1h9KV4yIFwpLCBcKCAoWV9pIC0gXGJhcntZfSleMiBcKSwgZGFuIFwoIChYX2kgLSBcYmFye1h9KShZX2kgLSBcYmFye1l9KSBcKToNCg0KfCBcKCBYIFwpIHwgXCggWSBcKSB8IFwoIFhfaSAtIFxiYXJ7WH0gXCkgfCBcKCBZX2kgLSBcYmFye1l9IFwpIHwgXCggKFhfaSAtIFxiYXJ7WH0pXjIgXCkgfCBcKCAoWV9pIC0gXGJhcntZfSleMiBcKSB8IFwoIChYX2kgLSBcYmFye1h9KShZX2kgLSBcYmFye1l9KSBcKSB8DQp8LS0tLS0tLS0tfC0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwNCnwgMTAgICAgICB8IDQuMiAgICAgfCAtMSAgICAgICAgICAgICAgICAgfCAtMC4yMiAgICAgICAgICAgICAgfCAxICAgICAgICAgICAgICAgICAgICAgIHwgMC4wNDg0ICAgICAgICAgICAgICAgICB8IDAuMjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQp8IDEyICAgICAgfCA0LjggICAgIHwgMSAgICAgICAgICAgICAgICAgIHwgMC4zOCAgICAgICAgICAgICAgIHwgMSAgICAgICAgICAgICAgICAgICAgICB8IDAuMTQ0NCAgICAgICAgICAgICAgICAgfCAwLjM4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KfCAxMSAgICAgIHwgNC41ICAgICB8IDAgICAgICAgICAgICAgICAgICB8IDAuMDggICAgICAgICAgICAgICB8IDAgICAgICAgICAgICAgICAgICAgICAgfCAwLjAwNjQgICAgICAgICAgICAgICAgIHwgMC4wMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCnwgOSAgICAgICB8IDQuMCAgICAgfCAtMiAgICAgICAgICAgICAgICAgfCAtMC40MiAgICAgICAgICAgICAgfCA0ICAgICAgICAgICAgICAgICAgICAgIHwgMC4xNzY0ICAgICAgICAgICAgICAgICB8IDAuODQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQp8IDEzICAgICAgfCA0LjYgICAgIHwgMiAgICAgICAgICAgICAgICAgIHwgMC4xOCAgICAgICAgICAgICAgIHwgNCAgICAgICAgICAgICAgICAgICAgICB8IDAuMDMyNCAgICAgICAgICAgICAgICAgfCAwLjM2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KDQotLS0NCg0KIDUuICoqSGl0dW5nIEp1bWxhaCoqDQpcWw0KXHN1bSAoWF9pIC0gXGJhcntYfSleMiA9IDEgKyAxICsgMCArIDQgKyA0ID0gMTANClxdDQpcWw0KXHN1bSAoWV9pIC0gXGJhcntZfSleMiA9IDAuMDQ4NCArIDAuMTQ0NCArIDAuMDA2NCArIDAuMTc2NCArIDAuMDMyNCA9IDAuNDA4DQpcXQ0KXFsNClxzdW0gKFhfaSAtIFxiYXJ7WH0pKFlfaSAtIFxiYXJ7WX0pID0gMC4yMiArIDAuMzggKyAwLjAwICsgMC44NCArIDAuMzYgPSAxLjgwDQpcXQ0KDQotLS0NCg0KIDYuICoqU3Vic3RpdHVzaWthbiBrZSBkYWxhbSBSdW11cyoqDQpcWw0KciA9IFxmcmFje1xzdW0gKFhfaSAtIFxiYXJ7WH0pKFlfaSAtIFxiYXJ7WX0pfXtcc3FydHtcc3VtIChYX2kgLSBcYmFye1h9KV4yfSBcY2RvdCBcc3FydHtcc3VtIChZX2kgLSBcYmFye1l9KV4yfX0NClxdDQpcWw0KciA9IFxmcmFjezEuODB9e1xzcXJ0ezEwfSBcY2RvdCBcc3FydHswLjQwOH19DQpcXQ0KXFsNCnIgPSBcZnJhY3sxLjgwfXszLjE2MiBcY2RvdCAwLjYzOX0NClxdDQpcWw0KciA9IFxmcmFjezEuODB9ezIuMDJ9IFxhcHByb3ggLTAuMDE5Mg0KXF0NCg0KLS0tDQoNCiAqKkludGVycHJldGFzaSoqDQotIFwoIHIgPSAtMC4wMTkyIFwpOiBIdWJ1bmdhbiBzYW5nYXQgbGVtYWggZGFuIG5lZ2F0aWYuIEFydGlueWEsIGtlbmFpa2FuIGRpc2tvbiBzZWRpa2l0IGJlcmtvcmVsYXNpIGRlbmdhbiBwZW51cnVuYW4gcmF0aW5nIHBlbGFuZ2dhbiwgdGV0YXBpIGh1YnVuZ2FubnlhIGhhbXBpciB0aWRhayBzaWduaWZpa2FuLg0KDQoqKktlc2ltcHVsYW4qKg0KDQotIEtvcmVsYXNpIGFudGFyYSBQZW5qdWFsYW4gZGFuIEJpYXlhIFByb21vc2k6DQoNCnIgPSAwLjcgbWVudW5qdWtrYW4gYWRhbnlhIGh1YnVuZ2FuIHBvc2l0aWYgeWFuZyBjdWt1cCBrdWF0IGFudGFyYSBwZW5qdWFsYW4gZGFuIGJpYXlhIHByb21vc2ksIHlhbmcgYmVyYXJ0aSBzZW1ha2luIHRpbmdnaSBiaWF5YSBwcm9tb3NpLCBzZW1ha2luIHRpbmdnaSBwZW5qdWFsYW5ueWEuIE5hbXVuLCBtZXNraXB1biBrb3JlbGFzaW55YSBwb3NpdGlmIGRhbiBjdWt1cCBrdWF0LCB0aWRhayBhZGEgamFtaW5hbiBiYWh3YSBodWJ1bmdhbiBpbmkgYWRhbGFoIHBlbnllYmFiIGxhbmdzdW5nLCBrYXJlbmEga29yZWxhc2kgdGlkYWsgbWVudW5qdWtrYW4gc2ViYWItYWtpYmF0Lg0KDQotIEtvcmVsYXNpIGFudGFyYSBEaXNrb24gZGFuIFJhdGluZyBQZWxhbmdnYW46DQoNCnIgPSAtMC4wMTkyIG1lbnVuanVra2FuIGh1YnVuZ2FuIHlhbmcgc2FuZ2F0IGxlbWFoIGRhbiBuZWdhdGlmLCB5YW5nIGJlcmFydGkgZGlza29uIHNlZGlraXQgYmVya29yZWxhc2kgZGVuZ2FuIHBlbnVydW5hbiByYXRpbmcgcGVsYW5nZ2FuLiBOYW11biwgaHVidW5nYW4gaW5pIHNhbmdhdCBrZWNpbCBkYW4gaGFtcGlyIHRpZGFrIHNpZ25pZmlrYW4gc2VjYXJhIHByYWt0aXMuIEtvcmVsYXNpIHlhbmcgbWVuZGVrYXRpIDAgbWVudW5qdWtrYW4gYmFod2EgdmFyaWFiZWwtdmFyaWFiZWwgdGVyc2VidXQgaGFtcGlyIHRpZGFrIGJlcmh1YnVuZ2FuLg0KDQoNClBlbmp1YWxhbiBkYW4gQmlheWEgUHJvbW9zaSBtZW1pbGlraSBrb3JlbGFzaSBwb3NpdGlmIHlhbmcgY3VrdXAga3VhdCAociA9IDAuNyksIHlhbmcgZGFwYXQgbWVudW5qdWtrYW4gYmFod2EgcHJvbW9zaSB5YW5nIGxlYmloIGJlc2FyIGtlbXVuZ2tpbmFuIGFrYW4gbWVuaW5na2F0a2FuIHBlbmp1YWxhbi4NCkRpc2tvbiBkYW4gUmF0aW5nIFBlbGFuZ2dhbiBtZW1pbGlraSBrb3JlbGFzaSB5YW5nIHNhbmdhdCBsZW1haCwgYXJ0aW55YSBkaXNrb24gc2VkaWtpdCBtZW1wZW5nYXJ1aGkgcmF0aW5nIHBlbGFuZ2dhbi4gTmFtdW4sIGthcmVuYSBuaWxhaSBrb3JlbGFzaW55YSBzYW5nYXQga2VjaWwsIGluaSBoYW1waXIgdGlkYWsgYmVyYXJ0aSBkYWxhbSBrb250ZWtzIHByYWt0aXMuDQoNCiMjIyBVamkgSGlwb3Rlc2lzDQoNCioqQmlheWEgUHJvbW9zaSAoJCkqKiBkYW4gKipQZW5qdWFsYW4gKHVuaXQpKiogc2lnbmlmaWthbiBzZWNhcmEgc3RhdGlzdGlrIG1lbmdndW5ha2FuIHVqaSByZWdyZXNpIGxpbmllciBzZWRlcmhhbmEuIEJlcmlrdXQgbGFuZ2thaG55YTogIA0KDQoxLiAqKkhpcG90ZXNpczoqKg0KICAgLSAqSDAgKG5vbCk6KiBUaWRhayBhZGEgaHVidW5nYW4gYW50YXJhIGJpYXlhIHByb21vc2kgZGFuIHBlbmp1YWxhbiB1bml0Lg0KICAgLSAqSDEgKGFsdGVybmF0aWYpOiogQWRhIGh1YnVuZ2FuIGFudGFyYSBiaWF5YSBwcm9tb3NpIGRhbiBwZW5qdWFsYW4gdW5pdC4NCg0KMi4gKipLcml0ZXJpYSBwZW5ndWppYW46KiogIA0KICAgLSBHdW5ha2FuIHRpbmdrYXQgc2lnbmlmaWthbnNpICjOsSkgPSAwLjA1LiAgDQogICAtIEppa2EgcC12YWx1ZSA8IM6xLCB0b2xhayBIMDsgamlrYSB0aWRhaywgZ2FnYWwgdG9sYWsgSDAuDQoNCkhhc2lsIHVqaSByZWdyZXNpIGxpbmllciBtZW51bmp1a2thbiAqcC12YWx1ZSA9IDAuMTg4MTIwNCAqLiAgDQoNCg0KKipLZXNpbXB1bGFuIEhpcG90ZXNpczoqKg0KDQpCZXJkYXNhcmthbiBoYXNpbCB1amkgcmVncmVzaSBsaW5pZXIgc2VkZXJoYW5hOiAgDQotIERlbmdhbiBcKCBwXHRleHR7LXZhbHVlfSA9IDAuMTg4MTIwNCAgXCksIHlhbmcgbGViaWggYmVzYXIgZGFyaSB0aW5na2F0IHNpZ25pZmlrYW5zaSBcKCBcYWxwaGEgPSAwLjA1IFwpLCBraXRhICpnYWdhbCBtZW5vbGFrIEgwKi4gIA0KDQpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgZWNobz1GQUxTRX0NCiMgRGF0YSBQZW5qdWFsYW4gZGFuIEJpYXlhIFByb21vc2kNCnBlbmp1YWxhbiA8LSBjKDEwLCAxNSwgMjAsIDI1LCAzMCkNCmJpYXlhX3Byb21vc2kgPC0gYygyMDAsIDI1MCwgMTUwLCAzMDAsIDM1MCkNCg0KIyBNZW5naGl0dW5nIEtvcmVsYXNpIFBlYXJzb24NCmtvcmVsYXNpX3BlYXJzb24gPC0gY29yKHBlbmp1YWxhbiwgYmlheWFfcHJvbW9zaSkNCg0KIyBNZW5naGl0dW5nIHVqaSBzaWduaWZpa2Fuc2kgKG5pbGFpIHApIHVudHVrIGtvcmVsYXNpIFBlYXJzb24NCnRlc3Rfa29yZWxhc2kgPC0gY29yLnRlc3QocGVuanVhbGFuLCBiaWF5YV9wcm9tb3NpKQ0KDQojIE1lbmFtcGlsa2FuIGhhc2lsIGtvcmVsYXNpIGRhbiBuaWxhaSBwDQpjYXQoIktvcmVsYXNpIFBlYXJzb246Iiwga29yZWxhc2lfcGVhcnNvbiwgIlxuIikNCmNhdCgiUC1WYWx1ZToiLCB0ZXN0X2tvcmVsYXNpJHAudmFsdWUsICJcbiIpDQoNCiMgTWVuZW50dWthbiBrZXB1dHVzYW4gYmVyZGFzYXJrYW4gbmlsYWkgcA0KYWxwaGEgPC0gMC4wNQ0KaWYgKHRlc3Rfa29yZWxhc2kkcC52YWx1ZSA8IGFscGhhKSB7DQogIGtlcHV0dXNhbiA8LSAiVG9sYWsgSDA6IEFkYSBodWJ1bmdhbiB5YW5nIHNpZ25pZmlrYW4gYW50YXJhIGJpYXlhIHByb21vc2kgZGFuIHBlbmp1YWxhbi4iDQp9IGVsc2Ugew0KICBrZXB1dHVzYW4gPC0gIkdhZ2FsIG1lbm9sYWsgSDA6IFRpZGFrIGFkYSBodWJ1bmdhbiB5YW5nIHNpZ25pZmlrYW4gYW50YXJhIGJpYXlhIHByb21vc2kgZGFuIHBlbmp1YWxhbi4iDQp9DQoNCiMgTWVuYW1waWxrYW4ga2VwdXR1c2FuDQpjYXQoIktlcHV0dXNhbjogIiwga2VwdXR1c2FuLCAiXG4iKQ0KYGBgDQoNCioqS2VzaW1wdWxhbiBBa2hpcjoqKg0KDQpIYXNpbCBkYXJpIHAtdmFsdWUgPSAwLjE4ODEyMDQgbGViaWggYmVzYXIgZGFyaSB0aW5na2F0IHNpZ25pZmlrYW5zaSDOsSA9IDAuMDUuIE9sZWgga2FyZW5hIGl0dSwga2l0YSBnYWdhbCBtZW5vbGFrIEgwLCB5YW5nIGJlcmFydGkgdGlkYWsgYWRhIGJ1a3RpIHlhbmcgY3VrdXAgdW50dWsgbWVueWF0YWthbiBiYWh3YSBiaWF5YSBwcm9tb3NpIGJlcmh1YnVuZ2FuIHNpZ25pZmlrYW4gZGVuZ2FuIHBlbmp1YWxhbi4gQmVyZGFzYXJrYW4gcC12YWx1ZSB5YW5nIGxlYmloIGJlc2FyIGRhcmkgMC4wNSwga2l0YSB0aWRhayBkYXBhdCBtZW55YXRha2FuIGJhaHdhIGFkYSBodWJ1bmdhbiB5YW5nIHNpZ25pZmlrYW4gYW50YXJhIGJpYXlhIHByb21vc2kgZGFuIHBlbmp1YWxhbiB1bml0IGRhbGFtIGRhdGFzZXQgaW5pLiBEZW5nYW4ga2F0YSBsYWluLCBtZXNraXB1biBraXRhIG1lbGloYXQgaHVidW5nYW4gcG9zaXRpZiBhbnRhcmEgYmlheWEgcHJvbW9zaSBkYW4gcGVuanVhbGFuIGRhbGFtIGtvcmVsYXNpLCB1amkgc3RhdGlzdGlrIG1lbnVuanVra2FuIGJhaHdhIGh1YnVuZ2FuIHRlcnNlYnV0IHRpZGFrIGN1a3VwIHNpZ25pZmlrYW4gdW50dWsgZGlhbmdnYXAgc2ViYWdhaSBidWt0aSB5YW5nIGt1YXQuDQoNCiMjIyBBbmFsaXNpcyBEYXRhIEthdGVnb3Jpaw0KDQojIyMjIEhpdHVuZyBkaXN0cmlidXNpIHBlbmp1YWxhbiBiZXJkYXNhcmthbiBqZW5pcyBvdXRsZXQgKE1vZGVybiB2cyBUcmFkaXNpb25hbCkNCg0KKipEYXRhIFBlbmp1YWxhbiB1bnR1ayBPdXRsZXQgIk1vZGVybiIgZGFuICJUcmFkaXNpb25hbCI6KioNCg0KLSBQZW5qdWFsYW4gT3V0bGV0IE1vZGVybjoNCjEuIEpha2FydGE6IDEwMzkyICsgMTE0NjIgKyA5NzE3ICsgMTA1NTEgKyAxMDcwMSA9ICoqNTIsODIzKioNCjIuIEJvZ29yOiAxMTM5NCArIDU3MTcgKyAxMDYyMCArIDk5NTcgKyA3NTkyID0gKio0NywyODAqKg0KMy4gRGVwb2s6IDk0MDAgKyAxMDE0NCArIDgwMzYgKyAxMzczMSArIDExNTUxID0gKio1Miw4NjIqKg0KNC4gVGFuZ2VyYW5nOiA0NDc1ICsgMTA4NzYgKyAxNDYxNCArIDc4MTkgKyAxNDAwNSA9ICoqNTMsNzg5KioNCjUuIEJla2FzaTogNzIxMSArIDEwMjYwICsgNjg3MyArIDk5NTcgKyA5NzQ3ID0gKio0NCwwNDgqKg0KDQoqKlRvdGFsIFBlbmp1YWxhbiBPdXRsZXQgTW9kZXJuKio6DQpcWw0KNTIsODIzICsgNDcsMjgwICsgNTIsODYyICsgNTMsNzg5ICsgNDQsMDQ4ID0gNzMwLDcxMA0KXF0NCg0KLSBQZW5qdWFsYW4gT3V0bGV0IFRyYWRpc2lvbmFsOg0KMS4gSmFrYXJ0YTogMTEzOTQgKyA4MDM2ICsgMTIzNTMgKyAxMTAzNSArIDE0OTU0ID0gKio1Nyw3NzIqKg0KMi4gQm9nb3I6IDU3MTcgKyAxMDYyMCArIDE0MDA1ICsgNjQxNyArIDk0NjUgPSAqKjQ3LDIyNCoqDQozLiBEZXBvazogMTAxNDQgKyAxMDg3NiArIDEyMTE0ICsgMTM3MzEgKyAxMDgyMiA9ICoqNTcsNjg3KioNCjQuIFRhbmdlcmFuZzogMTAyNjAgKyAxMTMxMyArIDE0OTU0ICsgMTA0MDggKyAxMzM5MiA9ICoqNjAsMzI3KioNCjUuIEJla2FzaTogNzIxMSArIDEyMDExICsgOTk1NyArIDc1OTIgKyAxMzM2MyA9ICoqNTIsMTM0KioNCg0KKipUb3RhbCBQZW5qdWFsYW4gT3V0bGV0IFRyYWRpc2lvbmFsKio6DQpcWw0KNTcsNzcyICsgNDcsMjI0ICsgNTcsNjg3ICsgNjAsMzI3ICsgNTIsMTM0ID0gMSwwOTIsMjE5DQpcXQ0KDQotICoqTWFrYSwgZGlwZXJvbGVoIEhhc2lsOioqDQoNClRvdGFsIFBlbmp1YWxhbiBPdXRsZXQgKipNb2Rlcm4qKiA9IDczMCw3MTAJDQoNClRvdGFsIFBlbmp1YWxhbiBPdXRsZXQgKipUcmFkaXNpb25hbCoqID0gMSwwOTIsMjE5CQ0KDQotICoqSW50ZXJwcmV0YXNpKioNCg0KRGFsYW0gYW5hbGlzaXMga29yZWxhc2kgUGVhcnNvbiBzZWJlbHVtbnlhLCBraXRhIG1lbmdoaXR1bmcgaHVidW5nYW4gYW50YXJhIHZhcmlhYmVsIGtvbnRpbnUgc2VwZXJ0aSBiaWF5YSBwcm9tb3NpIGRhbiBwZW5qdWFsYW4uIEtpdGEgbWVuZW11a2FuIGJhaHdhIGFudGFyYSBiaWF5YSBwcm9tb3NpIGRhbiBwZW5qdWFsYW4gYWRhIGtvcmVsYXNpIHBvc2l0aWYgeWFuZyBjdWt1cCBrdWF0IChyID0gMC43KSwgeWFuZyBtZW51bmp1a2thbiBiYWh3YSBsZWJpaCBiYW55YWsgYmlheWEgcHJvbW9zaSBkYXBhdCBiZXJodWJ1bmdhbiBkZW5nYW4gcGVuanVhbGFuIHlhbmcgbGViaWggdGluZ2dpLiBOYW11biwgcGFkYSBkYXRhIG91dGxldCBtb2Rlcm4gZGFuIG91dGxldCB0cmFkaXNpb25hbCwga2l0YSBkYXBhdCBtZWxpaGF0IGJhaHdhIGFkYSBwZXJiZWRhYW4gc2lnbmlmaWthbiBkYWxhbSB0b3RhbCBwZW5qdWFsYW4uIFBlbmp1YWxhbiBvdXRsZXQgdHJhZGlzaW9uYWwgbGViaWggdGluZ2dpICgxLDA5MiwyMTkpIGRpYmFuZGluZ2thbiBvdXRsZXQgbW9kZXJuICg3MzAsNzEwKS4NCg0KRGVuZ2FuIGhhc2lsIGluaSwga2l0YSBiaXNhIG1lbmd1amkgYXBha2FoIGZha3RvciBzZXBlcnRpIGplbmlzIG91dGxldCAobW9kZXJuIGF0YXUgdHJhZGlzaW9uYWwpIG1lbWVuZ2FydWhpIHBlbmp1YWxhbiBsZWJpaCBsYW5qdXQuIERhbGFtIGhhbCBpbmksIG91dGxldCB0cmFkaXNpb25hbCB0YW1wYWtueWEgbGViaWggYmVycGVyYW4gZGFsYW0gdG90YWwgcGVuanVhbGFuLCBuYW11biBmYWt0b3ItZmFrdG9yIGxhaW4gc2VwZXJ0aSBzdHJhdGVnaSBwcm9tb3NpLCBsb2thc2ksIGF0YXUgdGlwZSBwcm9kdWsgYmlzYSBqYWRpIGxlYmloIG1lbmVudHVrYW4uDQoNCg0KYGBge3IsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGVjaG89RkFMU0V9DQojIE1lbXVhdCBsaWJyYXJ5IHlhbmcgZGlwZXJsdWthbg0KbGlicmFyeShkcGx5cikNCg0KIyBNZW1idWF0IGRhdGEgZnJhbWUgZGFyaSBkYXRhIHlhbmcgZGliZXJpa2FuDQpkYXRhIDwtIGRhdGEuZnJhbWUoDQogIEJ1bGFuID0gcmVwKGMoIkphbiIsICJKYW4iLCAiSmFuIiwgIkphbiIsICJKYW4iLCAiRmViIiwgIkZlYiIsICJGZWIiLCAiRmViIiwgIkZlYiIsIA0KICAgICAgICAgICAgICAgICJNYXIiLCAiTWFyIiwgIk1hciIsICJNYXIiLCAiTWFyIiwgIkFwciIsICJBcHIiLCAiQXByIiwgIkFwciIsICJBcHIiLCANCiAgICAgICAgICAgICAgICAiTWF5IiwgIk1heSIsICJNYXkiLCAiTWF5IiwgIk1heSIsICJKdW4iLCAiSnVuIiwgIkp1biIsICJKdW4iLCAiSnVuIiwgDQogICAgICAgICAgICAgICAgIkp1bCIsICJKdWwiLCAiSnVsIiwgIkp1bCIsICJKdWwiLCAiQXVnIiwgIkF1ZyIsICJBdWciLCAiQXVnIiwgIkF1ZyIsIA0KICAgICAgICAgICAgICAgICJTZXAiLCAiU2VwIiwgIlNlcCIsICJTZXAiLCAiU2VwIiwgIk9jdCIsICJPY3QiLCAiT2N0IiwgIk9jdCIsICJPY3QiLCANCiAgICAgICAgICAgICAgICAiTm92IiwgIk5vdiIsICJOb3YiLCAiTm92IiwgIk5vdiIsICJEZWMiLCAiRGVjIiwgIkRlYyIsICJEZWMiLCAiRGVjIiksIDMpLA0KICBUYWh1biA9IHJlcChjKDIwMTgsIDIwMTksIDIwMjApLCBlYWNoID0gNjApLA0KICBLb3RhID0gcmVwKGMoIkpha2FydGEiLCAiQm9nb3IiLCAiRGVwb2siLCAiVGFuZ2VyYW5nIiwgIkJla2FzaSIpLCAzNiksDQogIFBlbmp1YWxhbiA9IHJlcChjKA0KICAgIDEwMzkyLCAxMTM5NCwgOTQwMCwgNDQ3NSwgNzIxMSwgMTE0NjIsIDU3MTcsIDEwMTQ0LCAxMDg3NiwgMTAyNjAsDQogICAgOTcxNywgMTA2MjAsIDgwMzYsIDE0NjE0LCA2ODczLCAxMjM1MywgMTEwMzUsIDE1MTM2LCA2OTcwLCAxMDUwMCwNCiAgICAxMDU1MSwgNTUwMywgOTAyNCwgNjcxNSwgMTM4NDUsIDk5NTcsIDEwMjMzLCAxMzczMSwgMTIxMTQsIDc4MTksDQogICAgMTA0MDgsIDc0NTgsIDExNTUxLCA2MDE1LCAxMDcwMSwgMTQwMDUsIDk3NDcsIDc1OTIsIDEwNTk1LCAxMzM5MiwNCiAgICA2MDAxLCA2NDE3LCAxMDM5OCwgMTMzNjMsIDExNDEzLCAxMTA5MywgMTA4MjIsIDE0OTU0LCA4NzYwLCA5NDY1LA0KICAgIDEwODYwLCAxMjExMSwgOTcyMiwgMTY5NDksIDExMzEzLCA4MjE3LCAxNjExMywgODg4NywgNjg4MiwgNTc2Mg0KICApLCAzKSwNCiAgSmVuaXNfT3V0bGV0ID0gcmVwKGMoIk1vZGVybiIsICJUcmFkaXNpb25hbCIsICJUcmFkaXNpb25hbCIsICJUcmFkaXNpb25hbCIsICJNb2Rlcm4iKSwgMzYpDQopDQoNCiMgTWVuZ2hpdHVuZyBkaXN0cmlidXNpIHBlbmp1YWxhbiBiZXJkYXNhcmthbiBqZW5pcyBvdXRsZXQNCnBlbmp1YWxhbl9wZXJfb3V0bGV0IDwtIGRhdGEgJT4lDQogIGdyb3VwX2J5KEplbmlzX091dGxldCkgJT4lDQogIHN1bW1hcmlzZShUb3RhbF9QZW5qdWFsYW4gPSBzdW0oUGVuanVhbGFuKSkNCg0KIyBNZW5hbXBpbGthbiBoYXNpbA0KcHJpbnQocGVuanVhbGFuX3Blcl9vdXRsZXQpDQoNCmBgYA0KDQpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgZWNobz1GQUxTRX0NCiMgTWVtdWF0IGxpYnJhcnkgeWFuZyBkaXBlcmx1a2FuDQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KHBsb3RseSkNCg0KIyBEYXRhIGhhc2lsIHBlcmhpdHVuZ2FuDQpkYXRhX2hhc2lsIDwtIGRhdGEuZnJhbWUoDQogIEplbmlzX091dGxldCA9IGMoIk1vZGVybiIsICJUcmFkaXNpb25hbCIpLA0KICBUb3RhbF9QZW5qdWFsYW4gPSBjKDczMDcxMCwgMTA5MjIxOSkNCikNCg0KIyBNZW1idWF0IHZpc3VhbGlzYXNpIGJhciBjaGFydCBkZW5nYW4gZ2dwbG90Mg0KcGxvdCA8LSBnZ3Bsb3QoZGF0YV9oYXNpbCwgYWVzKHggPSBKZW5pc19PdXRsZXQsIHkgPSBUb3RhbF9QZW5qdWFsYW4sIGZpbGwgPSBKZW5pc19PdXRsZXQpKSArDQogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCB3aWR0aCA9IDAuNikgKw0KICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCJNb2Rlcm4iID0gIiNGRjYzNDciLCAiVHJhZGlzaW9uYWwiID0gIiNGRkEwN0EiKSkgKw0KICBsYWJzKA0KICAgIHRpdGxlID0gIkRpc3RyaWJ1c2kgUGVuanVhbGFuIEJlcmRhc2Fya2FuIEplbmlzIE91dGxldCIsDQogICAgeCA9ICJKZW5pcyBPdXRsZXQiLA0KICAgIHkgPSAiVG90YWwgUGVuanVhbGFuIiwNCiAgICBmaWxsID0gIkplbmlzIE91dGxldCINCiAgKSArDQogIHRoZW1lX21pbmltYWwoYmFzZV9zaXplID0gMTUpICsNCiAgdGhlbWUoDQogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSwgZmFjZSA9ICJib2xkIiksDQogICAgbGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiDQogICkNCg0KIyBNZW5ndWJhaCBnZ3Bsb3QgbWVuamFkaSBwbG90bHkgdW50dWsgaW50ZXJha3Rpdml0YXMNCmludGVyYWN0aXZlX3Bsb3QgPC0gZ2dwbG90bHkocGxvdCkNCg0KIyBNZW5hbXBpbGthbiBwbG90IGludGVyYWt0aWYNCmludGVyYWN0aXZlX3Bsb3QNCmBgYA0KDQojIyMjIEFwYWthaCBhZGEgcGVyYmVkYWFuIHNpZ25pZmlrYW4gZGFsYW0gcmF0YS1yYXRhIHBlbmp1YWxhbiBhbnRhcmEga2F0ZWdvcmkgcHJvZHVrIChNYWthbmFuLCBNaW51bWFuLCBkYW4gS2VzZWhhdGFuKT8gR3VuYWthbiBBTk9WQSB1bnR1ayBtZW5ndWppIGhpcG90ZXNpcyBpbmkhDQoNCioqMS4gSGl0dW5nIFRvdGFsIERlcmFqYXQgS2ViZWJhc2FuIChcKCBkZl97VG90YWx9IFwpKSoqDQoNClxbDQpkZl97VG90YWx9ID0gbiAtIDENClxdDQpKdW1sYWggZGF0YSB0b3RhbCBhZGFsYWggXCggbiA9IDMwMCBcKSAoaGFzaWwgZGFyaSAzIGthdGVnb3JpIHByb2R1ayBkZW5nYW4gYmFueWFrIGRhdGEga2VzZWx1cnVoYW4pLg0KDQpcWw0KZGZfe1RvdGFsfSA9IDMwMCAtIDEgPSAyOTkNClxdDQoNCioqMi4gSGl0dW5nIERlcmFqYXQgS2ViZWJhc2FuIEFudGFyIEdydXAgKFwoIGRmX3tCZXR3ZWVufSBcKSkqKg0KDQpcWw0KZGZfe0JldHdlZW59ID0gayAtIDENClxdDQpKdW1sYWggZ3J1cCAoXCggayBcKSkgYWRhbGFoIDMgKEthdGVnb3JpIFByb2R1azogS2VzZWhhdGFuLCBNaW51bWFuLCBNYWthbmFuKS4NCg0KXFsNCmRmX3tCZXR3ZWVufSA9IDMgLSAxID0gMg0KXF0NCg0KKiozLiBIaXR1bmcgRGVyYWphdCBLZWJlYmFzYW4gRGFsYW0gR3J1cCAoXCggZGZfe1dpdGhpbn0gXCkpKioNCg0KXFsNCmRmX3tXaXRoaW59ID0gZGZfe1RvdGFsfSAtIGRmX3tCZXR3ZWVufQ0KXF0NCg0KXFsNCmRmX3tXaXRoaW59ID0gMjk5IC0gMiA9IDI5Nw0KXF0NCg0KKio0LiBIaXR1bmcgTWVhbiBTcXVhcmUgQmV0d2VlbiAoXCggTVNfe0JldHdlZW59IFwpKSoqDQoNClxbDQpNU197QmV0d2Vlbn0gPSBcZnJhY3tTU197QmV0d2Vlbn19e2RmX3tCZXR3ZWVufX0NClxdDQoNCkRlbmdhbiBcKCBTU197QmV0d2Vlbn0gPSAyLjc1MyBcdGltZXMgMTBeNyBcKSBkYW4gXCggZGZfe0JldHdlZW59ID0gMiBcKToNClxbDQpNU197QmV0d2Vlbn0gPSBcZnJhY3syLjc1MyBcdGltZXMgMTBeN317Mn0gPSAxLjM3NiBcdGltZXMgMTBeNw0KXF0NCg0KKio1LiBIaXR1bmcgTWVhbiBTcXVhcmUgV2l0aGluIChcKCBNU197V2l0aGlufSBcKSkqKg0KDQpcWw0KTVNfe1dpdGhpbn0gPSBcZnJhY3tTU197V2l0aGlufX17ZGZfe1dpdGhpbn19DQpcXQ0KDQpEZW5nYW4gXCggU1Nfe1dpdGhpbn0gPSAyLjczNyBcdGltZXMgMTBeOSBcKSBkYW4gXCggZGZfe1dpdGhpbn0gPSAyOTcgXCk6DQpcWw0KTVNfe1dpdGhpbn0gPSBcZnJhY3syLjczNyBcdGltZXMgMTBeOX17Mjk3fSA9IDkuMjE2IFx0aW1lcyAxMF42DQpcXQ0KDQoqKjYuIEhpdHVuZyBGLVZhbHVlKioNCg0KXFsNCkYgPSBcZnJhY3tNU197QmV0d2Vlbn19e01TX3tXaXRoaW59fQ0KXF0NCg0KXFsNCkYgPSBcZnJhY3sxLjM3NiBcdGltZXMgMTBeN317OS4yMTYgXHRpbWVzIDEwXjZ9ID0gMS40OTQNClxdDQoNCioqNy4gTmlsYWkgcCAoUHIoPkYpKSoqDQoNCk5pbGFpIFwoIHAgXCkgYmVyYXNhbCBkYXJpIGRpc3RyaWJ1c2kgRiBkZW5nYW4gXCggZGZfe0JldHdlZW59ID0gMiBcKSBkYW4gXCggZGZfe1dpdGhpbn0gPSAyOTcgXCkuIEJlcmRhc2Fya2FuIHRhYmVsIGRpc3RyaWJ1c2kgRiwgdW50dWsgXCggRiA9IDEuNDk0IFwpLCBuaWxhaSBcKCBwID0gMC4yMjYgXCkuDQoNCioqS2VzaW1wdWxhbioqDQoNClVqaSBBTk9WQSB5YW5nIGRpbGFrdWthbiB1bnR1ayBtZW1iYW5kaW5na2FuIHJhdGEtcmF0YSBwZW5qdWFsYW4gYW50YXIga2F0ZWdvcmkgcHJvZHVrIChNYWthbmFuLCBNaW51bWFuLCBLZXNlaGF0YW4pIG1lbnVuanVra2FuIGJhaHdhIHRpZGFrIGFkYSBwZXJiZWRhYW4gc2lnbmlmaWthbiBkaSBhbnRhcmEga2V0aWdhbnlhLiBOaWxhaSBwID0gMC4yMjYgbGViaWggYmVzYXIgZGFyaSAwLjA1LCB5YW5nIGJlcmFydGkga2l0YSBnYWdhbCBtZW5vbGFrIGhpcG90ZXNpcyBub2wgZGFuIHRpZGFrIGFkYSBidWt0aSBzdGF0aXN0aWsgeWFuZyBjdWt1cCB1bnR1ayBtZW55YXRha2FuIGJhaHdhIHJhdGEtcmF0YSBwZW5qdWFsYW4gYW50YXIga2F0ZWdvcmkgcHJvZHVrIGJlcmJlZGEgc2VjYXJhIHNpZ25pZmlrYW4uDQoNCkppa2Ega2VtYmFsaSBwYWRhIGhhc2lsIGtvcmVsYXNpIHNlYmVsdW1ueWEgeWFuZyBtZW51bmp1a2thbiBodWJ1bmdhbiBhbnRhcmEgYmlheWEgcHJvbW9zaSBkYW4gcGVuanVhbGFuLCBraXRhIGRhcGF0IG1lbGloYXQgYmFod2EgbWVza2lwdW4ga2l0YSBtZW5lbXVrYW4gaHVidW5nYW4geWFuZyBzaWduaWZpa2FuIHVudHVrIHZhcmlhYmVsIHRlcnRlbnR1LCBoYXNpbCBBTk9WQSBtZW51bmp1a2thbiBiYWh3YSBrYXRlZ29yaSBwcm9kdWsgdGlkYWsgbWVtZW5nYXJ1aGkgcmF0YS1yYXRhIHBlbmp1YWxhbiBzZWNhcmEgc2lnbmlmaWthbi4gSW5pIG1lbnVuanVra2FuIGJhaHdhIHZhcmlhYmVsIHlhbmcgbGViaWggc3Blc2lmaWsgKHNlcGVydGkgYmlheWEgcHJvbW9zaSwgb3V0bGV0LCBhdGF1IGJhaGthbiBqZW5pcyBwcm9kdWspIG11bmdraW4gbGViaWggYmVycGVuZ2FydWggZGFyaXBhZGEga2F0ZWdvcmkgcHJvZHVrIGl0dSBzZW5kaXJpLg0KDQpLb3JlbGFzaSBQZWFyc29uIG1lbnVuanVra2FuIGh1YnVuZ2FuIGt1YXQgYW50YXJhIGJpYXlhIHByb21vc2kgZGFuIHBlbmp1YWxhbiwgc2VtZW50YXJhIEFOT1ZBIG1lbnVuanVra2FuIGJhaHdhIGthdGVnb3JpIHByb2R1ayB0aWRhayBiZXJodWJ1bmdhbiBzZWNhcmEgc2lnbmlmaWthbiBkZW5nYW4gcGVuanVhbGFuLkRhbGFtIGtvbnRla3MgYW5hbGlzaXMgb3V0bGV0LCBraXRhIGRhcGF0IG1lbXBlcmtpcmFrYW4gYmFod2EgamVuaXMgb3V0bGV0IGxlYmloIGJlcnBlbmdhcnVoIHRlcmhhZGFwIHBlbmp1YWxhbiBkYXJpcGFkYSBrYXRlZ29yaSBwcm9kdWssIHNlbWVudGFyYSBhbmFsaXNpcyBrb3JlbGFzaSBtZW5naW5kaWthc2lrYW4gYmFod2EgcHJvbW9zaSBhZGFsYWggZmFrdG9yIHBlbnRpbmcgZGFsYW0gbWVuaW5na2F0a2FuIHBlbmp1YWxhbi4gVWppIGhpcG90ZXNpcyB0ZW50YW5nIGJpYXlhIHByb21vc2kgZGFuIHBlbmp1YWxhbiBtZW51bmp1a2thbiBrZXRpZGFrc2lnbmlmaWthbmFuIGRhbGFtIGh1YnVuZ2FuIGFudGFyYSBrZWR1YSB2YXJpYWJlbCB0ZXJzZWJ1dCBkYWxhbSBtb2RlbCByZWdyZXNpIGxpbmllciBzZWRlcmhhbmEsIHlhbmcgYmVyYmFuZGluZyB0ZXJiYWxpayBkZW5nYW4ga29yZWxhc2kgcG9zaXRpZiB5YW5nIGRpdGVtdWthbiBzZWJlbHVtbnlhLiBJbmkgbWVudW5qdWtrYW4gYmFod2EgbWVza2lwdW4gYWRhIGtvcmVsYXNpIHBvc2l0aWYsIGh1YnVuZ2FuIGl0dSB0aWRhayBjdWt1cCBrdWF0IHNlY2FyYSBzdGF0aXN0aWsgdW50dWsgbWVudW5qdWtrYW4gaHVidW5nYW4ga2F1c2FsaXRhcyB5YW5nIGplbGFzLg0KDQpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgZWNobz1GQUxTRX0NCg0KIyBQYXN0aWthbiBrb2xvbSBtZW1pbGlraSB0aXBlIGRhdGEgeWFuZyBiZW5hcg0KRGF0YXNldCA8LSBuYS5vbWl0KERhdGFzZXQpICMgSGFwdXMgYmFyaXMgZGVuZ2FuIG5pbGFpIE5BDQpEYXRhc2V0S2F0ZWdvcmkuUHJvZHVrIDwtIGFzLmZhY3RvcihEYXRhc2V0JEthdGVnb3JpLlByb2R1aykNCkRhdGFzZXRQZW5qdWFsYW4uLnVuaXQuIDwtIGFzLm51bWVyaWMoRGF0YXNldCRQZW5qdWFsYW4uLnVuaXQuKQ0KDQojIExha3VrYW4gdWppIEFOT1ZBDQphbm92YV9yZXN1bHQgPC0gYW92KERhdGFzZXRQZW5qdWFsYW4uLnVuaXQuIH4gRGF0YXNldEthdGVnb3JpLlByb2R1aywgZGF0YSA9IERhdGFzZXQpDQoNCiMgVGFtcGlsa2FuIHJpbmdrYXNhbiBoYXNpbA0Kc3VtbWFyeShhbm92YV9yZXN1bHQpDQoNCiMgSW50ZXJwcmV0YXNpIGhhc2lsDQpwX3ZhbHVlIDwtIHN1bW1hcnkoYW5vdmFfcmVzdWx0KVtbMV1dWyJQcig+RikiXVsxXQ0KIyBVamkgQU5PVkENCmFub3ZhX3Jlc3VsdCA8LSBhb3YoUGVuanVhbGFuLi51bml0LiB+IEthdGVnb3JpLlByb2R1aywgZGF0YSA9IERhdGFzZXQpDQoNCiMgQW1iaWwgbmlsYWkgcCBkYXJpIGhhc2lsIEFOT1ZBDQpwX3ZhbHVlIDwtIHN1bW1hcnkoYW5vdmFfcmVzdWx0KVtbMV1dJGBQcig+RilgWzFdDQoNCiMgVGVudHVrYW4gaGFzaWwgYmVyZGFzYXJrYW4gbmlsYWkgcA0KaWYgKHBfdmFsdWUgPCAwLjA1KSB7DQogIHByaW50KCJBZGEgcGVyYmVkYWFuIHNpZ25pZmlrYW4gZGFsYW0gcmF0YS1yYXRhIHBlbmp1YWxhbiBhbnRhciBrYXRlZ29yaSBwcm9kdWsuIikNCn0gZWxzZSB7DQogIHByaW50KCJUaWRhayBhZGEgcGVyYmVkYWFuIHNpZ25pZmlrYW4gZGFsYW0gcmF0YS1yYXRhIHBlbmp1YWxhbiBhbnRhciBrYXRlZ29yaSBwcm9kdWsuIikNCn0NCmBgYA0KDQoNCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBlY2hvPUZBTFNFfQ0KIyBJbnN0YWxsIGRhbiBsb2FkIHBha2V0IHBsb3RseSBqaWthIGJlbHVtIHRlcnBhc2FuZw0KIyBpbnN0YWxsLnBhY2thZ2VzKCJwbG90bHkiKQ0KbGlicmFyeShwbG90bHkpDQoNCiMgVmlzdWFsaXNhc2kgQm94cGxvdCBJbnRlcmFrdGlmDQpwbG90X2x5KERhdGFzZXQsIA0KICAgICAgICB4ID0gfkthdGVnb3JpLlByb2R1aywgDQogICAgICAgIHkgPSB+UGVuanVhbGFuLi51bml0LiwgDQogICAgICAgIHR5cGUgPSAiYm94IiwgDQogICAgICAgIGNvbG9yID0gfkthdGVnb3JpLlByb2R1aywNCiAgICAgICAgYm94cG9pbnRzID0gImFsbCIsICAjIE1lbmFtcGlsa2FuIHNlbXVhIHRpdGlrIGRhdGENCiAgICAgICAgaml0dGVyID0gMC4zLCAgICAgICAjIE1lbmdhY2FrIHBvc2lzaSB0aXRpayB1bnR1ayB0YW1waWxhbiBsZWJpaCBqZWxhcw0KICAgICAgICBwb2ludHBvcyA9IDApICU+JSAgICMgTWVuZW50dWthbiBwb3Npc2kgdGl0aWsgZGF0YQ0KICBsYXlvdXQoDQogICAgdGl0bGUgPSAiQm94cGxvdCBQZW5qdWFsYW4gcGVyIEthdGVnb3JpIFByb2R1ayIsIA0KICAgIHhheGlzID0gbGlzdCh0aXRsZSA9ICJLYXRlZ29yaSBQcm9kdWsiKSwNCiAgICB5YXhpcyA9IGxpc3QodGl0bGUgPSAiUGVuanVhbGFuIHBlciBVbml0IiksDQogICAgeGF4aXMgPSBsaXN0KHRpY2thbmdsZSA9IDQ1KSAgIyBSb3Rhc2kgbGFiZWwgc3VtYnUgeA0KICApDQoNCg0KYGBgDQoNCg0KIyMjIE1vZGVsIFByZWRpa3NpIFBlbmRhcGF0YW4NCg0KIyMjIyBIaXR1bmcgVG90YWwgUGVuZGFwYXRhbiAoUGVuanVhbGFuICogSGFyZ2EgcGVyIFVuaXQpIHVudHVrIHNldGlhcCBrb3RhIQ0KDQoqKkRhdGEqKg0KDQp8IEtvdGEgICAgICAgfCBQZW5qdWFsYW4gKHVuaXQpIHwgSGFyZ2EgcGVyIFVuaXQgfA0KfC0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLXwNCnwgSmFrYXJ0YSAgICB8IDUzNjM1ICAgICAgICAgICAgfCAxMDAwMCAgICAgICAgICB8DQp8IEJvZ29yICAgICAgfCA0MDgyOCAgICAgICAgICAgIHwgMTAwMDAgICAgICAgICAgfA0KfCBEZXBvayAgICAgIHwgNDk1MDggICAgICAgICAgICB8IDEwMDAwICAgICAgICAgIHwNCnwgVGFuZ2VyYW5nICB8IDQ2MzczICAgICAgICAgICAgfCAxMDAwMCAgICAgICAgICB8DQp8IEJla2FzaSAgICAgfCA0MTQ0MyAgICAgICAgICAgIHwgMTAwMDAgICAgICAgICAgfA0KDQoqKk1lbmdoaXR1bmcgVG90YWwgUGVuZGFwYXRhbiBwZXIgS290YSoqDQoNCioqUnVtdXMqKg0KDQpcWw0KXHRleHR7VG90YWwgUGVuZGFwYXRhbn0gPSBcdGV4dHtQZW5qdWFsYW4gKHVuaXQpfSBcdGltZXMgXHRleHR7SGFyZ2EgcGVyIFVuaXR9DQpcXQ0KDQoqKjEuIEpha2FydGEqKg0KDQpcWw0KXHRleHR7VG90YWwgUGVuZGFwYXRhbiBKYWthcnRhfSA9IDUzNjM1IFx0aW1lcyAxMDAwMCA9IDUzNiwzNTAsMDAwDQpcXQ0KDQoqKjIuIEJvZ29yKioNCg0KXFsNClx0ZXh0e1RvdGFsIFBlbmRhcGF0YW4gQm9nb3J9ID0gNDA4MjggXHRpbWVzIDEwMDAwID0gNDA4LDI4MCwwMDANClxdDQoNCioqMy4gRGVwb2sqKg0KDQpcWw0KXHRleHR7VG90YWwgUGVuZGFwYXRhbiBEZXBva30gPSA0OTUwOCBcdGltZXMgMTAwMDAgPSA0OTUsMDgwLDAwMA0KXF0NCg0KKio0LiBUYW5nZXJhbmcqKg0KDQpcWw0KXHRleHR7VG90YWwgUGVuZGFwYXRhbiBUYW5nZXJhbmd9ID0gNDYzNzMgXHRpbWVzIDEwMDAwID0gNDYzLDczMCwwMDANClxdDQoNCioqNS4gQmVrYXNpKioNCg0KXFsNClx0ZXh0e1RvdGFsIFBlbmRhcGF0YW4gQmVrYXNpfSA9IDQxNDQzIFx0aW1lcyAxMDAwMCA9IDQxNCw0MzAsMDAwDQpcXQ0KDQpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgZWNobz1GQUxTRX0NCiMgTWVtdWF0IGxpYnJhcnkgeWFuZyBkaXBlcmx1a2FuDQpsaWJyYXJ5KGRwbHlyKQ0KDQojIE1lbmFtYmFoa2FuIGtvbG9tIEhhcmdhIHBlciBVbml0IGRlbmdhbiBuaWxhaSB0ZXRhcCAxMCwwMDANCmRhdGEkSGFyZ2FfcGVyX1VuaXQgPC0gMTAwMDANCg0KIyBMYW5qdXRrYW4gcGVyaGl0dW5nYW4NCmRhdGEgPC0gZGF0YSAlPiUNCiAgbXV0YXRlKFBlbmRhcGF0YW4gPSBQZW5qdWFsYW4gKiBIYXJnYV9wZXJfVW5pdCkNCg0KIyBNZW5naGl0dW5nIFRvdGFsIFBlbmRhcGF0YW4gcGVyIEtvdGENCnBlbmRhcGF0YW5fcGVyX2tvdGEgPC0gZGF0YSAlPiUNCiAgZ3JvdXBfYnkoS290YSkgJT4lDQogIHN1bW1hcmlzZShUb3RhbF9QZW5kYXBhdGFuID0gc3VtKFBlbmRhcGF0YW4sIG5hLnJtID0gVFJVRSkpDQoNCiMgTWVuYW1waWxrYW4gaGFzaWwNCnByaW50KHBlbmRhcGF0YW5fcGVyX2tvdGEpDQpgYGANCg0KYGBge3IsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGVjaG89RkFMU0V9DQojIE1lbWJ1YXQgZ3JhZmlrIGJhdGFuZyBpbnRlcmFrdGlmIGRlbmdhbiB3YXJuYSB5YW5nIG1lbmFyaWsNCnAgPC0gcGxvdF9seShwZW5kYXBhdGFuX3Blcl9rb3RhLCB4ID0gfktvdGEsIHkgPSB+VG90YWxfUGVuZGFwYXRhbiwgDQogICAgICAgICAgICAgdHlwZSA9ICdiYXInLCANCiAgICAgICAgICAgICBtYXJrZXIgPSBsaXN0KA0KICAgICAgICAgICAgICAgY29sb3IgPSBjKCcjRkY2MzQ3JywgJyNGRkEwN0EnLCAnIzk4RkI5OCcsICcjNDY4MkI0JywgJyNGRkQ3MDAnKSwNCiAgICAgICAgICAgICAgIG9wYWNpdHkgPSAwLjgpKSAlPiUNCiAgbGF5b3V0KHRpdGxlID0gIlRvdGFsIFBlbmRhcGF0YW4gcGVyIEtvdGEiLA0KICAgICAgICAgeGF4aXMgPSBsaXN0KHRpdGxlID0gIktvdGEiKSwNCiAgICAgICAgIHlheGlzID0gbGlzdCh0aXRsZSA9ICJUb3RhbCBQZW5kYXBhdGFuICgkKSIpLA0KICAgICAgICAgc2hvd2xlZ2VuZCA9IEZBTFNFLA0KICAgICAgICAgdGl0bGVmb250ID0gbGlzdChzaXplID0gMjAsIGZhbWlseSA9ICJBcmlhbCwgc2Fucy1zZXJpZiIpLA0KICAgICAgICAgcGxvdF9iZ2NvbG9yID0gJyNmN2Y3ZjcnLCAgIyBCYWNrZ3JvdW5kIHBsb3Qgd2FybmEgdGVyYW5nDQogICAgICAgICBwYXBlcl9iZ2NvbG9yID0gJyNmZmZmZmYnLCAgIyBCYWNrZ3JvdW5kIGtlc2VsdXJ1aGFuIHB1dGloDQogICAgICAgICBmb250ID0gbGlzdChzaXplID0gMTIsIGNvbG9yID0gJ2JsYWNrJykpDQoNCiMgVGFtcGlsa2FuIHBsb3QNCnANCmBgYA0KDQojIyMjIEFuYWxpc2lzIGZha3RvciBzaWduaWZpa2FuIHlhbmcgbWVtZW5nYXJ1aGkgcGVuZGFwYXRhbiBtZW5nZ3VuYWthbiBhbmxpc2lzIHJlZ3Jlc2kgbGluZWFyDQotIFZhcmlhYmVsIEJlYmFzIDogQmlheWEgUHJvbW9zaSAoJCksIERpc2tvbiAoJSksIEplbmlzIE91dGxldCAoRHVtbXkgVmFyaWFibGUpDQotIFZhcmlhYmVsIFRhcmdldCA6IFBlbmRhcGF0YW4NCg0KYGBge3IsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGVjaG89RkFMU0V9DQojIE1lbXVhdCBsaWJyYXJ5IHlhbmcgZGlwZXJsdWthbg0KbGlicmFyeShkcGx5cikNCg0KIyBNZW5nZ2FudGkgdGl0aWsgKC4pIGRlbmdhbiB1bmRlcnNjb3JlIChfKSB1bnR1ayBuYW1hIGtvbG9tIHlhbmcgdmFsaWQNCmNvbG5hbWVzKERhdGFzZXQpIDwtIGdzdWIoIlxcLiIsICJfIiwgY29sbmFtZXMoRGF0YXNldCkpDQoNCiMgTWVuYW1iYWhrYW4ga29sb20gSGFyZ2EgcGVyIFVuaXQgZGVuZ2FuIG5pbGFpIHRldGFwIDEwLDAwMCAobWlzYWxueWEpDQpEYXRhc2V0JEhhcmdhX3Blcl9Vbml0IDwtIDEwMDAwDQoNCiMgTWVuZ2hpdHVuZyBQZW5kYXBhdGFuIHVudHVrIHNldGlhcCBiYXJpcw0KRGF0YXNldCA8LSBEYXRhc2V0ICU+JQ0KICBtdXRhdGUoUGVuZGFwYXRhbiA9IFBlbmp1YWxhbl9fdW5pdF8gKiBIYXJnYV9wZXJfVW5pdCkNCg0KIyBNZW1idWF0IHZhcmlhYmVsIGR1bW15IHVudHVrIEplbmlzIE91dGxldA0KRGF0YXNldCRKZW5pc19PdXRsZXRfTW9kZXJuIDwtIGlmZWxzZShEYXRhc2V0JEplbmlzX091dGxldCA9PSAiTW9kZXJuIiwgMSwgMCkNCg0KIyBNZW1idWF0IG1vZGVsIHJlZ3Jlc2kgbGluZWFyDQptb2RlbCA8LSBsbShQZW5kYXBhdGFuIH4gQmlheWFfUHJvbW9zaV9fX18gKyBEaXNrb25fX19fICsgSmVuaXNfT3V0bGV0X01vZGVybiwgZGF0YSA9IERhdGFzZXQpDQoNCiMgTWVuYW1waWxrYW4gcmluZ2thc2FuIGhhc2lsIG1vZGVsDQpzdW1tYXJ5KG1vZGVsKQ0KYGBgDQoNCioqMS4gTW9kZWwgUmVncmVzaSoqDQoNCioqRm9ybXVsYSoqOiANCg0KXFsNClBlbmRhcGF0YW4gPSBcYmV0YV8wICsgXGJldGFfMSBcY2RvdCBCaWF5YVxfUHJvbW9zaSArIFxiZXRhXzIgXGNkb3QgRGlza29uICsgXGJldGFfMyBcY2RvdCBKZW5pc1xfT3V0bGV0XF9Nb2Rlcm4gKyBcZXBzaWxvbg0KXF0NCg0KLSAqKlBlbmRhcGF0YW4qKjogVmFyaWFiZWwgdGFyZ2V0IChkZXBlbmRlbnQgdmFyaWFibGUpLg0KDQotICoqQmlheWFfUHJvbW9zaSoqLCAqKkRpc2tvbioqLCAqKkplbmlzX091dGxldF9Nb2Rlcm4qKjogVmFyaWFiZWwgYmViYXMgKGluZGVwZW5kZW50IHZhcmlhYmxlcykuDQoNCi0gKipJbnRlcmNlcHQqKiAoXChcYmV0YV8wXCkpOiBOaWxhaSBwZW5kYXBhdGFuIGRhc2FyIGtldGlrYSBzZW11YSB2YXJpYWJlbCBiZWJhcyBiZXJuaWxhaSBub2wuDQoNCi0gKipSZXNpZHVhbHMqKjogU2VsaXNpaCBhbnRhcmEgbmlsYWkgYWt0dWFsIHBlbmRhcGF0YW4gZGFuIG5pbGFpIHByZWRpa3NpIG1vZGVsIChcKFxlcHNpbG9uXCkpLg0KDQoqKjIuIFJlc2lkdWFscyoqDQoNCioqRGlzdHJpYnVzaSBSZXNpZHVhbHMqKjoNCg0KLSAqKk1pbioqOiAtNTgzNzUyMTMgKG5pbGFpIHJlc2lkdWFsIHRlcmtlY2lsKS4NCg0KLSAqKjFRIChLdWFydGlsIDEpKio6IC0yNDU3MjQ5MSAobmlsYWkgcmVzaWR1YWwgZGkga3VhcnRpbCBwZXJ0YW1hKS4NCg0KLSAqKk1lZGlhbioqOiAtMjI4ODA1IChyZXNpZHVhbCB0ZW5nYWgpLg0KDQotICoqM1EgKEt1YXJ0aWwgMykqKjogMjU3MjY5OTMuDQoNCi0gKipNYXgqKjogNjk2ODA3NTUgKG5pbGFpIHJlc2lkdWFsIHRlcmJlc2FyKS4NCg0KQXJ0aW55YSwgc2ViYWdpYW4gYmVzYXIgZXJyb3IgcHJlZGlrc2kgYmVya2lzYXIgYW50YXJhIC0yNCw1NyBqdXRhIGhpbmdnYSAyNSw3MyBqdXRhLCBkZW5nYW4gYmViZXJhcGEgbmlsYWkgbGViaWggZWtzdHJlbSBoaW5nZ2EgLTU4LDM3IGp1dGEgZGFuIDY5LDY4IGp1dGEuDQoNCioqMy4gS29lZmlzaWVuKioNCg0KfCBWYXJpYWJlbCAgICAgICAgICAgICAgIHwgRXN0aW1hdGUgICAgIHwgU3RkLiBFcnJvciB8IHQgdmFsdWUgfCBQcig+fHR8KSAgIHwNCnwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tfC0tLS0tLS0tLXwtLS0tLS0tLS0tLS18DQp8ICoqKEludGVyY2VwdCkqKiAgICAgICAgfCAxMDgsMjM4LDg4NSB8IDcsMzg3LDIwNiAgfCAxNC42NTIgIHwgPDAuMDAxICoqKiB8DQp8ICoqQmlheWFfUHJvbW9zaSoqICAgICAgfCAtNSw0NzEgICAgICB8IDIsNzc5ICAgICAgfCAtMS45NjkgIHwgMC4wNDk5ICogICB8DQp8ICoqRGlza29uKiogICAgICAgICAgICAgfCA0NjcsMTg4ICAgICB8IDM5MywzNjQgICAgfCAxLjE4OCAgIHwgMC4yMzU5ICAgICB8DQp8ICoqSmVuaXNfT3V0bGV0X01vZGVybioqfCAxLDg3OCw0OTkgICB8IDMsNDk5LDkyNSAgfCAwLjUzNyAgIHwgMC41OTE5ICAgICB8DQoNCioqSW50ZXJwcmV0YXNpOioqDQoNCjEuICoqSW50ZXJjZXB0Kio6DQoNCiAgIC0gUGVuZGFwYXRhbiBkYXNhciAoa2V0aWthIHNlbXVhIHZhcmlhYmVsIGJlYmFzIG5vbCkgZGlwZXJraXJha2FuIHNlYmVzYXIgKipcJDEwOC4yIGp1dGEqKi4NCg0KICAgLSBOaWxhaSBpbmkgc2FuZ2F0IHNpZ25pZmlrYW4gKCoqcC12YWx1ZSA8IDAuMDAxKiopLg0KDQoyLiAqKkJpYXlhX1Byb21vc2kqKjoNCg0KICAgLSBTZXRpYXAgcGVuaW5na2F0YW4gYmlheWEgcHJvbW9zaSBzZWJlc2FyIFwkMSBtZW5ndXJhbmdpIHBlbmRhcGF0YW4gcmF0YS1yYXRhIHNlYmVzYXIgKipcJDUsNDcxKiouDQoNCiAgIC0gU2lnbmlmaWthbiBzZWNhcmEgc3RhdGlzdGlrIHBhZGEgbGV2ZWwgNSUgKCoqcC12YWx1ZSA9IDAuMDQ5OSoqKS4NCg0KMy4gKipEaXNrb24qKjoNCg0KICAgLSBTZXRpYXAgcGVuaW5na2F0YW4gZGlza29uIHNlYmVzYXIgMSUgbWVuaW5na2F0a2FuIHBlbmRhcGF0YW4gcmF0YS1yYXRhIHNlYmVzYXIgKipcJDQ2NywxODgqKi4NCg0KICAgLSBUaWRhayBzaWduaWZpa2FuIHNlY2FyYSBzdGF0aXN0aWsgKCoqcC12YWx1ZSA9IDAuMjM1OSoqKS4NCg0KNC4gKipKZW5pc19PdXRsZXRfTW9kZXJuKio6DQoNCiAgIC0gUGVuZGFwYXRhbiBvdXRsZXQgbW9kZXJuIGxlYmloIHRpbmdnaSByYXRhLXJhdGEgc2ViZXNhciAqKlwkMS44NyBqdXRhKiogZGliYW5kaW5na2FuIG91dGxldCBsYWlubnlhLg0KDQogICAtIFRpZGFrIHNpZ25pZmlrYW4gc2VjYXJhIHN0YXRpc3RpayAoKipwLXZhbHVlID0gMC41OTE5KiopLg0KDQoqKjQuIFN0YXRpc3RpayBNb2RlbCoqDQoNCjEuICoqUmVzaWR1YWwgU3RhbmRhcmQgRXJyb3IgKFJTRSkqKjogDQoNCiAgIC0gKiozMCwyOTAsMDAwKiogbWVudW5qdWtrYW4gZGV2aWFzaSByYXRhLXJhdGEgYW50YXJhIG5pbGFpIGFrdHVhbCBwZW5kYXBhdGFuIGRhbiBuaWxhaSBwcmVkaWtzaS4NCg0KICAgLSBTZW1ha2luIGtlY2lsIFJTRSwgc2VtYWtpbiBiYWlrIG1vZGVsLg0KDQoyLiAqKlItc3F1YXJlZCoqOg0KDQogICAtICoqMC4wMTc1KiogKDEuNzUlKTogSGFueWEgMS43NSUgdmFyaWFzaSBwZW5kYXBhdGFuIHlhbmcgYmlzYSBkaWplbGFza2FuIG9sZWggbW9kZWwuDQoNCiAgIC0gTmlsYWkgXCggUl4yIFwpIHlhbmcgcmVuZGFoIG1lbnVuanVra2FuIGJhaHdhIG1vZGVsIGluaSBrdXJhbmcgY29jb2sgdW50dWsgbWVtcHJlZGlrc2kgcGVuZGFwYXRhbi4NCg0KMy4gKipBZGp1c3RlZCBSLXNxdWFyZWQqKjoNCg0KICAgLSAqKjAuMDA3NTQqKjogRGlzZXN1YWlrYW4gdW50dWsganVtbGFoIHZhcmlhYmVsIGJlYmFzLiBOaWxhaSBsZWJpaCByZW5kYWggZGFyaSBcKCBSXjIgXCksIG1lbmdpbmRpa2FzaWthbiBiZWJlcmFwYSB2YXJpYWJlbCBtdW5na2luIHRpZGFrIHJlbGV2YW4uDQoNCjQuICoqRi1zdGF0aXN0aWMqKjoNCg0KICAgLSAqKjEuNzU3KiosIHAtdmFsdWUgPSAwLjE1NTQ6IE1vZGVsIHNlY2FyYSBrZXNlbHVydWhhbiB0aWRhayBzaWduaWZpa2FuLiBBcnRpbnlhLCBrb21iaW5hc2kgdmFyaWFiZWwgYmViYXMgdGlkYWsgY3VrdXAgYmFpayBkYWxhbSBtZW5qZWxhc2thbiB2YXJpYWJpbGl0YXMgcGVuZGFwYXRhbi4NCg0KKio1LiBLZXNpbXB1bGFuKioNCg0KLSAqKlNpZ25pZmlrYW4qKjogSGFueWEgKipCaWF5YV9Qcm9tb3NpKiogeWFuZyBzaWduaWZpa2FuIG1lbWVuZ2FydWhpIHBlbmRhcGF0YW4gKFwoIHAgPCAwLjA1IFwpKS4NCg0KLSAqKkRpc2tvbioqIGRhbiAqKkplbmlzX091dGxldF9Nb2Rlcm4qKiB0aWRhayBzaWduaWZpa2FuIChcKCBwID4gMC4wNSBcKSkuDQoNCi0gTW9kZWwgbWVtaWxpa2kga2VtYW1wdWFuIHByZWRpa3RpZiB5YW5nIHNhbmdhdCByZW5kYWggKFwoIFJeMiA9IDEuNzVcJSBcKSkuDQoNCi0gUGVybHUgZGlsYWt1a2FuIGVrc3Bsb3Jhc2kgbGViaWggbGFuanV0LCBzZXBlcnRpIG1lbmFtYmFoa2FuIHZhcmlhYmVsIGJhcnUgYXRhdSBtZW5nZ3VuYWthbiBtb2RlbCBub24tbGluZWFyIHVudHVrIG1lbmluZ2thdGthbiBwZXJmb3JtYS4NCg0KKipBbmFsaXNpcyoqDQoNCjEuICoqS29yZWxhc2kgZGFuIEJpYXlhIFByb21vc2kqKg0KDQpEYWxhbSAqKmFuYWxpc2lzIHJlZ3Jlc2kgbGluZWFyKiosIGtpdGEgbWVsaWhhdCBiYWh3YSAqKmJpYXlhIHByb21vc2kqKiBtZW1pbGlraSBwZW5nYXJ1aCBuZWdhdGlmIHRlcmhhZGFwIHBlbmRhcGF0YW4sIGRlbmdhbiBlc3RpbWFzaSBiYWh3YSAqKnNldGlhcCBwZW5pbmdrYXRhbiBiaWF5YSBwcm9tb3NpIHNlYmVzYXIgXCQxIG1lbmd1cmFuZ2kgcGVuZGFwYXRhbiByYXRhLXJhdGEgc2ViZXNhciBcJDUsNDcxKiouIEhhbCBpbmkgYmVydGVudGFuZ2FuIGRlbmdhbiBoYXNpbCBrb3JlbGFzaSBQZWFyc29uIHNlYmVsdW1ueWEsIHlhbmcgbWVudW5qdWtrYW4gYWRhbnlhIGh1YnVuZ2FuICoqcG9zaXRpZioqIGFudGFyYSBiaWF5YSBwcm9tb3NpIGRhbiBwZW5qdWFsYW4uIFBlcmJlZGFhbiBpbmkgYmlzYSBkaXNlYmFia2FuIG9sZWgga29tcGxla3NpdGFzIHlhbmcgdGlkYWsgZGFwYXQgZGlqZWxhc2thbiBvbGVoIGh1YnVuZ2FuIGxpbmllciBzZWRlcmhhbmEgc2FqYS4gQmlzYSBqYWRpIGJpYXlhIHByb21vc2kgeWFuZyBsZWJpaCB0aW5nZ2kgKip0aWRhayBzZWxhbHUgbWVuZ2hhc2lsa2FuIHBlbmluZ2thdGFuIHBlbmRhcGF0YW4geWFuZyBzZWJhbmRpbmcqKiAobWlzYWxueWEga2FyZW5hIGZha3Rvci1mYWt0b3IgbGFpbiB5YW5nIG1lbWVuZ2FydWhpIGVmaXNpZW5zaSBwcm9tb3NpKS4NCg0KMi4gKipKZW5pcyBPdXRsZXQgZGFuIFBlbmRhcGF0YW4qKg0KDQpNZXNraXB1biBvdXRsZXQgKiptb2Rlcm4qKiBtZW1pbGlraSAqKnBlbmRhcGF0YW4geWFuZyBsZWJpaCB0aW5nZ2kgcmF0YS1yYXRhIHNlYmVzYXIgXCQxLjg3IGp1dGEqKiwgbW9kZWwgcmVncmVzaSBtZW51bmp1a2thbiBiYWh3YSBwZXJiZWRhYW4gaW5pICoqdGlkYWsgc2lnbmlmaWthbiBzZWNhcmEgc3RhdGlzdGlrKiouIE5hbXVuLCBkYWxhbSBhbmFsaXNpcyBkYXRhIHBlbmp1YWxhbiwga2l0YSBtZW5lbXVrYW4gYmFod2EgKipvdXRsZXQgdHJhZGlzaW9uYWwgbWVtaWxpa2kgdG90YWwgcGVuanVhbGFuIHlhbmcgbGViaWggdGluZ2dpKiogZGFyaXBhZGEgb3V0bGV0IG1vZGVybi4gSW5pIG1lbnVuanVra2FuIGJhaHdhIGZha3RvciAqKmxhaW5ueWEqKiwgc2VwZXJ0aSAqKnN0cmF0ZWdpIHBlbWFzYXJhbioqIGF0YXUgKipwZXJiZWRhYW4gZGFsYW0gamVuaXMgcHJvZHVrKiogeWFuZyBkaWp1YWwgZGkgb3V0bGV0IG1vZGVybiBkYW4gdHJhZGlzaW9uYWwsIG11bmdraW4gbWVtYWlua2FuIHBlcmFuIGxlYmloIGJlc2FyIGRhcmlwYWRhIHlhbmcgdGVybGloYXQgZGkgbW9kZWwgcmVncmVzaSBpbmkuDQoNCjMuICoqUGVuZ2FydWggRGlza29uKioNCg0KRGFsYW0gKiphbmFsaXNpcyByZWdyZXNpKiosIG1lc2tpcHVuIGRpc2tvbiBkYXBhdCBtZW5pbmdrYXRrYW4gcGVuZGFwYXRhbiAoKipcJDQ2NywxODggcGVyIDElIHBlbmluZ2thdGFuIGRpc2tvbioqKSwgaGFzaWxueWEgKip0aWRhayBzaWduaWZpa2FuKiogKHAtdmFsdWUgPSAwLjIzNTkpLiBIYWwgaW5pIGJpc2EgdGVyamFkaSBrYXJlbmEgcGVuZ2FydWggZGlza29uIHRlcmhhZGFwIHBlbmRhcGF0YW4gbXVuZ2tpbiBsZWJpaCBkaXBlbmdhcnVoaSBvbGVoICoqZmFrdG9yIGxhaW4qKiAoc2VwZXJ0aSBqZW5pcyBwcm9kdWssIGxva2FzaSBvdXRsZXQsIGF0YXUgZWZlayBtdXNpbWFuKSB5YW5nIHRpZGFrIHRlcmNha3VwIGRhbGFtIG1vZGVsLiBEYWxhbSBhbmFsaXNpcyBwZW5qdWFsYW4sIGtpdGEgdGlkYWsgbWVtcGVyaGl0dW5na2FuIGZha3RvciBpbmkgc2VjYXJhIGxhbmdzdW5nLCB0ZXRhcGkgcGVuZ2FydWggZGlza29uIGJpc2EgYmVyYmVkYSBkaSB0aWFwIG91dGxldCBhdGF1IGthdGVnb3JpIHByb2R1ay4NCg0KNC4gKipTaWduaWZpa2Fuc2kgTW9kZWwgUmVncmVzaSoqDQoNCk1vZGVsIHJlZ3Jlc2kgeWFuZyBkaWd1bmFrYW4gdW50dWsgbWVtcHJlZGlrc2kgKipwZW5kYXBhdGFuKiogaGFueWEgZGFwYXQgbWVuamVsYXNrYW4gKioxLjc1JSBkYXJpIHZhcmlhc2kgcGVuZGFwYXRhbioqIChkZW5nYW4gXCggUl4yID0gMC4wMTc1IFwpKS4gSW5pIG1lbnVuanVra2FuIGJhaHdhICoqbW9kZWwgcmVncmVzaSBpbmkga3VyYW5nIGNvY29rIHVudHVrIG1lbXByZWRpa3NpIHBlbmRhcGF0YW4gc2VjYXJhIGFrdXJhdCoqLiBEZW5nYW4ga2F0YSBsYWluLCBtZXNraXB1biBiZWJlcmFwYSBmYWt0b3Igc2VwZXJ0aSBiaWF5YSBwcm9tb3NpIG1lbWlsaWtpIGh1YnVuZ2FuIGRlbmdhbiBwZW5kYXBhdGFuLCBtb2RlbCBpbmkgYmVsdW0gbWFtcHUgbWVuYW5na2FwIHNlbXVhIHZhcmlhYmVsIHBlbnRpbmcgeWFuZyBiZXJwZXJhbiBkYWxhbSBtZW5lbnR1a2FuIHBlbmRhcGF0YW4uICoqQW5hbGlzaXMgbGViaWggbGFuanV0IGRlbmdhbiBtZW1hc3Vra2FuIHZhcmlhYmVsIGxhaW4gYXRhdSBtZW5jb2JhIG1vZGVsIHlhbmcgbGViaWgga29tcGxla3MqKiAobWlzYWxueWEgcmVncmVzaSBub24tbGluaWVyIGF0YXUgbWFjaGluZSBsZWFybmluZykgbXVuZ2tpbiBha2FuIG1lbWJlcmlrYW4gaGFzaWwgeWFuZyBsZWJpaCBha3VyYXQuDQoNCjUuICoqQW5hbGlzaXMgZGFuIEltcGlrYXNpIEJpc25pcyoqDQoNCkRhcmkgKiphbmFsaXNpcyBkYXRhIHBlbmp1YWxhbioqLCBraXRhIG1lbmdldGFodWkgYmFod2Egb3V0bGV0IHRyYWRpc2lvbmFsIGNlbmRlcnVuZyBtZW5naGFzaWxrYW4gKip0b3RhbCBwZW5qdWFsYW4geWFuZyBsZWJpaCB0aW5nZ2kqKiBkYXJpcGFkYSBvdXRsZXQgbW9kZXJuLiBOYW11biwgZGFsYW0gKiptb2RlbCByZWdyZXNpKiosIHBlcmJlZGFhbiBhbnRhcmEgb3V0bGV0IG1vZGVybiBkYW4gb3V0bGV0IHRyYWRpc2lvbmFsIHRpZGFrIG1lbnVuanVra2FuIHNpZ25pZmlrYW5zaSwgZGFuIHBlcmFuIGJpYXlhIHByb21vc2kganVnYSBwZXJsdSBkaWthamkgbGViaWggbGFuanV0LiBPbGVoIGthcmVuYSBpdHUsIHBlcnVzYWhhYW4gbXVuZ2tpbiBwZXJsdSBtZW1wZXJ0aW1iYW5na2FuIGZha3Rvci1mYWt0b3IgKipub24tbGluaWVyKiogeWFuZyBtdW5na2luIGxlYmloIG1lbWVuZ2FydWhpIHBlbmRhcGF0YW4gZGFyaXBhZGEgeWFuZyBkYXBhdCBkaWplbGFza2FuIG9sZWggbW9kZWwgbGluaWVyIHNlZGVyaGFuYS4gVW50dWsgaXR1LCBiaXNhIGRpY29iYSBwZW5kZWthdGFuIHlhbmcgbGViaWggKipob2xpc3RpayoqLCB5YW5nIG1lbXBlcmhpdHVuZ2thbiBiZXJiYWdhaSBmYWt0b3IgeWFuZyBkYXBhdCBtZW1lbmdhcnVoaSAqKnBlbmRhcGF0YW4gZGFuIHBlbmp1YWxhbioqIGRpIHNldGlhcCBvdXRsZXQsIHRlcm1hc3VrICoqZmFrdG9yIGVrc3Rlcm5hbCoqIHNlcGVydGkgKiptdXNpbSwgZGF5YSBiZWxpIGtvbnN1bWVuLCBhdGF1IGthbXBhbnllIHBlbWFzYXJhbiB5YW5nIGxlYmloIHNwZXNpZmlrKiouDQoNCg0KYGBge3IsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGVjaG89RkFMU0V9DQojIExvYWQgcGFja2FnZQ0KbGlicmFyeShwbG90bHkpDQoNCiMgQ29udG9oIGRhdGEgKGdhbnRpIGRlbmdhbiBkYXRhc2V0IEFuZGEpDQojIERhdGFzZXQgPC0gcmVhZC5jc3YoIkM6L1VzZXJzL0FTVVMvRGVza3RvcC9TdGF0aXN0aWthIERhc2FyL1Blbmp1YWxhbl9BQkNfSkFCT0RFVEFCRUsuY3N2IikNCg0KIyBNZW1idWF0IHBsb3QgaW50ZXJha3RpZg0KcGxvdCA8LSBwbG90X2x5KA0KICBkYXRhID0gRGF0YXNldCwNCiAgeCA9IH5CaWF5YV9Qcm9tb3NpX19fXywgICMgS29sb20gQmlheWEgUHJvbW9zaQ0KICB5ID0gflBlbmRhcGF0YW4sICAgICAgICAgIyBLb2xvbSBQZW5kYXBhdGFuDQogIHR5cGUgPSAnc2NhdHRlcicsDQogIG1vZGUgPSAnbWFya2VycycsDQogIGNvbG9yID0gfkplbmlzX091dGxldCwgICAjIFdhcm5hIGJlcmRhc2Fya2FuIEplbmlzIE91dGxldA0KICBzaXplID0gfkRpc2tvbl9fX18sICAgICAgIyBVa3VyYW4gdGl0aWsgYmVyZGFzYXJrYW4gRGlza29uDQogIHRleHQgPSB+cGFzdGUoIkRpc2tvbjoiLCBEaXNrb25fX19fLCAiPGJyPkplbmlzIE91dGxldDoiLCBKZW5pc19PdXRsZXQpICMgSW5mb3JtYXNpIGhvdmVyDQopDQoNCiMgTWVuYW1iYWhrYW4gbGF5b3V0DQpwbG90IDwtIHBsb3QgJT4lIGxheW91dCgNCiAgdGl0bGUgPSAiSHVidW5nYW4gQmlheWEgUHJvbW9zaSBkZW5nYW4gUGVuZGFwYXRhbiIsDQogIHhheGlzID0gbGlzdCh0aXRsZSA9ICJCaWF5YSBQcm9tb3NpICgkKSIpLA0KICB5YXhpcyA9IGxpc3QodGl0bGUgPSAiUGVuZGFwYXRhbiAoJCkiKQ0KKQ0KDQojIFRhbXBpbGthbiBwbG90DQpwbG90DQpgYGANCg0KYGBge3IsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGVjaG89RkFMU0V9DQojIExvYWQgcGFja2FnZQ0KbGlicmFyeShwbG90bHkpDQoNCiMgQ29udG9oIGRhdGEgKGdhbnRpIGRlbmdhbiBkYXRhc2V0IEFuZGEpDQojIERhdGFzZXQgPC0gcmVhZC5jc3YoIkM6L1VzZXJzL0FTVVMvRGVza3RvcC9TdGF0aXN0aWthIERhc2FyL1Blbmp1YWxhbl9BQkNfSkFCT0RFVEFCRUsuY3N2IikNCg0KIyBNZW1idWF0IHBsb3QgaW50ZXJha3RpZg0KcGxvdCA8LSBwbG90X2x5KA0KICBkYXRhID0gRGF0YXNldCwNCiAgeCA9IH5EaXNrb25fX19fLCAgICAgICAgICMgS29sb20gRGlza29uDQogIHkgPSB+UGVuZGFwYXRhbiwgICAgICAgICAjIEtvbG9tIFBlbmRhcGF0YW4NCiAgdHlwZSA9ICdzY2F0dGVyJywNCiAgbW9kZSA9ICdtYXJrZXJzJywNCiAgY29sb3IgPSB+SmVuaXNfT3V0bGV0LCAgICMgV2FybmEgYmVyZGFzYXJrYW4gSmVuaXMgT3V0bGV0DQogIHNpemUgPSB+QmlheWFfUHJvbW9zaV9fX18sICMgVWt1cmFuIHRpdGlrIGJlcmRhc2Fya2FuIEJpYXlhIFByb21vc2kNCiAgdGV4dCA9IH5wYXN0ZSgiQmlheWEgUHJvbW9zaToiLCBCaWF5YV9Qcm9tb3NpX19fXywgIjxicj5KZW5pcyBPdXRsZXQ6IiwgSmVuaXNfT3V0bGV0KSAjIEluZm9ybWFzaSBob3Zlcg0KKQ0KDQojIE1lbmFtYmFoa2FuIGxheW91dA0KcGxvdCA8LSBwbG90ICU+JSBsYXlvdXQoDQogIHRpdGxlID0gIkh1YnVuZ2FuIERpc2tvbiBkZW5nYW4gUGVuZGFwYXRhbiIsDQogIHhheGlzID0gbGlzdCh0aXRsZSA9ICJEaXNrb24gKCUpIiksDQogIHlheGlzID0gbGlzdCh0aXRsZSA9ICJQZW5kYXBhdGFuICgkKSIpDQopDQoNCiMgVGFtcGlsa2FuIHBsb3QNCnBsb3QNCmBgYA0KDQpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgZWNobz1GQUxTRX0NCiMgTG9hZCBwYWNrYWdlDQpsaWJyYXJ5KHBsb3RseSkNCg0KIyBDb250b2ggZGF0YSAoZ2FudGkgZGVuZ2FuIGRhdGFzZXQgQW5kYSkNCiMgRGF0YXNldCA8LSByZWFkLmNzdigiQzovVXNlcnMvQVNVUy9EZXNrdG9wL1N0YXRpc3Rpa2EgRGFzYXIvUGVuanVhbGFuX0FCQ19KQUJPREVUQUJFSy5jc3YiKQ0KDQojIE1lbWJ1YXQgcGxvdCBpbnRlcmFrdGlmIDNEDQpwbG90IDwtIHBsb3RfbHkoDQogIGRhdGEgPSBEYXRhc2V0LA0KICB4ID0gfkJpYXlhX1Byb21vc2lfX19fLCAgIyBTdW1idSBYOiBCaWF5YSBQcm9tb3NpDQogIHkgPSB+RGlza29uX19fXywgICAgICAgICAjIFN1bWJ1IFk6IERpc2tvbg0KICB6ID0gflBlbmRhcGF0YW4sICAgICAgICAgIyBTdW1idSBaOiBQZW5kYXBhdGFuDQogIHR5cGUgPSAnc2NhdHRlcjNkJywNCiAgbW9kZSA9ICdtYXJrZXJzJywNCiAgY29sb3IgPSB+SmVuaXNfT3V0bGV0LCAgICMgV2FybmEgYmVyZGFzYXJrYW4gSmVuaXMgT3V0bGV0DQogIHNpemUgPSB+UGVuZGFwYXRhbiwgICAgICAjIFVrdXJhbiB0aXRpayBiZXJkYXNhcmthbiBQZW5kYXBhdGFuDQogIG1hcmtlciA9IGxpc3Qob3BhY2l0eSA9IDAuOCksICMgVHJhbnNwYXJhbnNpIHRpdGlrDQogIHRleHQgPSB+cGFzdGUoIkJpYXlhIFByb21vc2k6IiwgQmlheWFfUHJvbW9zaV9fX18sDQogICAgICAgICAgICAgICAgIjxicj5EaXNrb246IiwgRGlza29uX19fXywNCiAgICAgICAgICAgICAgICAiPGJyPlBlbmRhcGF0YW46IiwgUGVuZGFwYXRhbiwNCiAgICAgICAgICAgICAgICAiPGJyPkplbmlzIE91dGxldDoiLCBKZW5pc19PdXRsZXQpICMgSW5mb3JtYXNpIGhvdmVyDQopDQoNCiMgTWVuYW1iYWhrYW4gbGF5b3V0DQpwbG90IDwtIHBsb3QgJT4lIGxheW91dCgNCiAgdGl0bGUgPSAiSHVidW5nYW4gQmlheWEgUHJvbW9zaSwgRGlza29uLCBkYW4gUGVuZGFwYXRhbiIsDQogIHNjZW5lID0gbGlzdCgNCiAgICB4YXhpcyA9IGxpc3QodGl0bGUgPSAiQmlheWEgUHJvbW9zaSAoJCkiKSwNCiAgICB5YXhpcyA9IGxpc3QodGl0bGUgPSAiRGlza29uICglKSIpLA0KICAgIHpheGlzID0gbGlzdCh0aXRsZSA9ICJQZW5kYXBhdGFuICgkKSIpDQogICkNCikNCg0KIyBUYW1waWxrYW4gcGxvdA0KcGxvdA0KYGBgDQoNCiMjIyBJbnRlcnByZXRhc2kgQmlzbmlzDQoNCiMjIyMgUmVrb21lbmRhc2lrYW4gc3RyYXRlZ2kgcGVtYXNhcmFuIHBlciBrb3RhIHVudHVrIG1lbmluZ2thdGthbiBwZW5qdWFsYW4NCg0KMS4gKipKYWthcnRhKioNCg0KLSAqKlN0cmF0ZWdpIFBlbWFzYXJhbjogTWVuaW5na2F0a2FuIFByb2dyYW0gTG95YWxpdGFzIGRhbiBQcm9tb3NpIEJlcmJhc2lzIE11c2ltYW4qKg0KDQogIC0gKipNdXNpbWFuKio6IFBlbmp1YWxhbiBkaSBKYWthcnRhIG1lbnVuanVra2FuIHBvbGEgbXVzaW1hbiB5YW5nIGt1YXQsIHRlcnV0YW1hIGRlbmdhbiBwZW5pbmdrYXRhbiBwZW5qdWFsYW4gDQpkaSBidWxhbi1idWxhbiB0ZXJ0ZW50dS4gT2xlaCBrYXJlbmEgaXR1LCBmb2t1cyBwYWRhIHByb21vc2kgeWFuZyByZWxldmFuIGRlbmdhbiBtdXNpbSB0ZXJ0ZW50dSwgc2VwZXJ0aSBkaXNrb24gYmVzYXIgc2FhdCBiZWxhbmphIHRhaHVuIGJhcnUgYXRhdSBwcm9tb3NpIGtodXN1cyBzYWF0IG11c2ltIGxpYnVyYW4uDQoNCiAgLSAqKkJpYXlhIFByb21vc2kqKjogRGlwZXJsdWthbiBwZW5pbmdrYXRhbiBhbG9rYXNpIGFuZ2dhcmFuIHVudHVrIGJpYXlhIHByb21vc2kgcGFkYSBidWxhbi1idWxhbiBkZW5nYW4gcGVudXJ1bmFuIHBlbmp1YWxhbiB5YW5nIHNpZ25pZmlrYW4uDQoNCiAgLSAqKlJla29tZW5kYXNpKio6IEZva3VzIHBhZGEgcGVtYXNhcmFuIGRpZ2l0YWwgeWFuZyBsZWJpaCBhZ3Jlc2lmIGRhbiBwcm9ncmFtIGxveWFsaXRhcyB5YW5nIGJlcmJhc2lzIHBhZGEgYWt1bXVsYXNpIHBvaW4gYXRhdSBwZW5naGFyZ2FhbiBiYWdpIHBlbGFuZ2dhbiB5YW5nIGJlcmJlbGFuamEgbGViaWggc2VyaW5nLg0KDQoyLiAqKkJvZ29yKioNCg0KLSAqKlN0cmF0ZWdpIFBlbWFzYXJhbjogRGlza29uIHVudHVrIE1lbmluZ2thdGthbiBQZW5qdWFsYW4qKg0KDQogIC0gKipNdXNpbWFuKio6IEJvZ29yIG1lbnVuanVra2FuIGFkYW55YSB2YXJpYXNpIHBlbmp1YWxhbiB5YW5nIGxlYmloIGtlY2lsLCBkZW5nYW4gYmViZXJhcGEgYnVsYW4gdGVybGloYXQgYWRhIHBlbnVydW5hbiB5YW5nIHRhamFtLiBIYWwgaW5pIG1lbmdpbmRpa2FzaWthbiBiYWh3YSBkaXNrb24gYmlzYSBtZW5qYWRpIHN0cmF0ZWdpIHlhbmcgZWZla3RpZi4NCg0KICAtICoqRGlza29uIGRhbiBSYXRpbmcgUGVsYW5nZ2FuKio6IEtvcmVsYXNpIHlhbmcgbGViaWggbGVtYWggYW50YXJhIGRpc2tvbiBkYW4gcmF0aW5nIHBlbGFuZ2dhbiBtdW5na2luIG1lbnVuanVra2FuIGJhaHdhIGRpc2tvbiBwZXJsdSBsZWJpaCB0ZXBhdCBzYXNhcmFuLCBtaXNhbG55YSwgZGVuZ2FuIG1lbmF3YXJrYW4gZGlza29uIHBhZGEgcHJvZHVrLXByb2R1ayB5YW5nIGxlYmloIHBvcHVsZXIgYXRhdSBiZXJiYXNpcyBwYWRhIGFuYWxpc2lzIHByZWZlcmVuc2kgcGVsYW5nZ2FuLg0KDQogIC0gKipSZWtvbWVuZGFzaSoqOiBQZW1iZXJpYW4gZGlza29uIHRlcmJhdGFzIHBhZGEgcHJvZHVrLXByb2R1ayB5YW5nIG1lbWlsaWtpIHBlcm1pbnRhYW4gdGluZ2dpIGF0YXUgZGVuZ2FuIHNlZ21lbnRhc2kgcGFzYXIgeWFuZyBsZWJpaCB0ZXBhdCB1bnR1ayBtZW5pbmdrYXRrYW4gcGVuanVhbGFuLiANCg0KMy4gKipEZXBvayoqDQoNCi0gKipTdHJhdGVnaSBQZW1hc2FyYW46IFByb2dyYW0gUHJvbW9zaSBCZXJiYXNpcyBQZWxhbmdnYW4gU2V0aWEqKg0KDQogIC0gKipNdXNpbWFuKio6IFBlbmp1YWxhbiBkaSBEZXBvayBjZW5kZXJ1bmcgbGViaWggc3RhYmlsLCBtZXNraXB1biB0ZXJkYXBhdCBmbHVrdHVhc2kgeWFuZyB3YWphci4gUGVuZ2d1bmFhbiANCnByb21vc2kgYmVyYmFzaXMgcGVsYW5nZ2FuIHRldGFwIChzZXBlcnRpIGRpc2tvbiBla3NrbHVzaWYpIGJpc2EgbGViaWggZWZla3RpZi4NCg0KICAtICoqQmlheWEgUHJvbW9zaSoqOiBBbG9rYXNpIGFuZ2dhcmFuIHByb21vc2kgbGViaWggZGlzYXJhbmthbiB1bnR1ayBidWxhbiBkZW5nYW4gcGVudXJ1bmFuIHNpZ25pZmlrYW4sIHVudHVrIG1lbmdhdGFzaSBwZXJpb2RlIHlhbmcgbGViaWggcmVuZGFoIGRhcmkgdHJlbiBtdXNpbWFuLg0KDQogIC0gKipSZWtvbWVuZGFzaSoqOiBGb2t1cyBwYWRhIHJldGVuc2kgcGVsYW5nZ2FuIGRlbmdhbiBtZW5nZ3VuYWthbiBwcm9ncmFtIGxveWFsaXRhcyBhdGF1IHRhd2FyYW4gZWtza2x1c2lmIGJhZ2kgcGVsYW5nZ2FuIHRldGFwIHVudHVrIG1lbmphZ2Egdm9sdW1lIHBlbmp1YWxhbiB0ZXRhcCBzdGFiaWwgc2VwYW5qYW5nIHRhaHVuLg0KDQo0LiAqKlRhbmdlcmFuZyoqDQoNCi0gKipTdHJhdGVnaSBQZW1hc2FyYW46IFBlcmt1YXQgQnJhbmQgQXdhcmVuZXNzIGRlbmdhbiBJa2xhbiB5YW5nIExlYmloIFRlcmFyYWgqKg0KDQogIC0gKipNdXNpbWFuKio6IFBlbmp1YWxhbiBkaSBUYW5nZXJhbmcgbWVudW5qdWtrYW4gZmx1a3R1YXNpIHlhbmcgbGViaWggYmVzYXIsIGRlbmdhbiBwdW5jYWsgcGVuanVhbGFuIHBhZGEgYnVsYW4tYnVsYW4gdGVydGVudHUuIEluaSBtZW51bmp1a2thbiBwb3RlbnNpIGJlc2FyIGRhbGFtIGthbXBhbnllIHBlbWFzYXJhbiB5YW5nIHRlcGF0IHNhc2FyYW4uDQoNCiAgLSAqKkJpYXlhIFByb21vc2kqKjogSW52ZXN0YXNpIGxlYmloIGJhbnlhayBkYWxhbSBwcm9tb3NpIGRhbiBpa2xhbiBiaXNhIG1lbWJhbnR1IG1lbXBlcmt1YXQgYnJhbmQgYXdhcmVuZXNzIGRhbiBtZW5hcmlrIGxlYmloIGJhbnlhayBwZWxhbmdnYW4gYmFydSBzZWxhbWEgYnVsYW4gZGVuZ2FuIHBlbnVydW5hbiBwZW5qdWFsYW4uDQoNCiAgLSAqKlJla29tZW5kYXNpKio6IEZva3VzIHBhZGEgc3RyYXRlZ2kgcGVtYXNhcmFuIHlhbmcgbGViaWggdGVyYXJhaCwgbWVuZ2d1bmFrYW4gaWtsYW4gZGlnaXRhbCBkYW4gaW5mbHVlbmNlciB1bnR1ayBtZW5pbmdrYXRrYW4ga2VzYWRhcmFuIG1lcmVrLCB0ZXJ1dGFtYSBkaSBsdWFyIGJ1bGFuIHB1bmNhay4NCg0KNS4gKipCZWthc2kqKg0KDQotICoqU3RyYXRlZ2kgUGVtYXNhcmFuOiBLaW5lcmphIEJlcmJhc2lzIERpc2tvbiBkYW4gUGVsYXlhbmFuIFBlbGFuZ2dhbioqDQoNCiAgLSAqKkRpc2tvbioqOiBCZWthc2kgbWVudW5qdWtrYW4ga29yZWxhc2kgbmVnYXRpZiB5YW5nIGxlbWFoIGFudGFyYSBkaXNrb24gZGFuIHJhdGluZyBwZWxhbmdnYW4sIG5hbXVuIGhhbCBpbmkgbWVudW5qdWtrYW4gYmFod2EgZGlza29uIG1hc2loIGRhcGF0IG1lbmluZ2thdGthbiBwZW5qdWFsYW4gZGVuZ2FuIHN5YXJhdCB5YW5nIHRlcGF0Lg0KDQogIC0gKipSYXRpbmcgUGVsYW5nZ2FuKio6IERlbmdhbiBhZGFueWEgZmx1a3R1YXNpIHBlbmp1YWxhbiwgc2FuZ2F0IHBlbnRpbmcgdW50dWsgbWVuaW5na2F0a2FuIHJhdGluZyBwZWxhbmdnYW4gZGVuZ2FuIGZva3VzIHBhZGEgcGVsYXlhbmFuIHBlbGFuZ2dhbiB5YW5nIGxlYmloIGJhaWsgZGFuIHBlcnNvbmFsaXNhc2kgcGVuYXdhcmFuLg0KDQogIC0gKipSZWtvbWVuZGFzaSoqOiBQZW5lcmFwYW4gc2lzdGVtIHJld2FyZCB1bnR1ayBwZWxhbmdnYW4geWFuZyBtZW1iZXJpa2FuIHJhdGluZyB0aW5nZ2kgZGFuIHN0cmF0ZWdpIHByb21vc2kgZGlza29uIHBhZGEgcHJvZHVrIHlhbmcgbWVuZGFwYXQgdW1wYW4gYmFsaWsgcG9zaXRpZi4gRm9rdXMgcGFkYSBwZW5qdWFsYW4gZGFuIHBlbmdhbGFtYW4gcGVsYW5nZ2FuIGRlbmdhbiBtZW1iZXJpa2FuIHBlcmhhdGlhbiBsZWJpaCBwYWRhIGt1YWxpdGFzIGxheWFuYW4uDQoNCiMjIyMgSmVsYXNrYW4gZGFtcGFrIHBlbmdvcHRpbWFsYW4gZGlza29uLCBhbG9rYXNpIGFuZ2dhcmFuIHByb21vc2ksIGRhbiBkaXN0cmlidXNpIHBlbmp1YWxhbiBrZSBqZW5pcyBvdXRsZXQgdGVydGVudHUuDQoNCjEuICoqUGVuZ29wdGltYWxhbiBEaXNrb24qKg0KDQotICoqRGFtcGFrIFBvc2l0aWYgcGFkYSBQZW5qdWFsYW4qKjogUGVuZ29wdGltYWxhbiBkaXNrb24sIHRlcnV0YW1hIGRpIGtvdGEta290YSBkZW5nYW4gZmx1a3R1YXNpIHBlbmp1YWxhbiB5YW5nIGxlYmloIGJlc2FyIChzZXBlcnRpIEJvZ29yIGF0YXUgVGFuZ2VyYW5nKSwgZGFwYXQgbWVtYmVyaWthbiBkYW1wYWsgc2lnbmlmaWthbiBkYWxhbSBtZW5pbmdrYXRrYW4gcGVuanVhbGFuLiBEZW5nYW4gbWVuZXJhcGthbiBkaXNrb24geWFuZyB0ZXBhdCBwYWRhIHByb2R1ayB5YW5nIHRlcGF0LCBwZXJ1c2FoYWFuIGRhcGF0IG1lbmFyaWsgbGViaWggYmFueWFrIHBlbGFuZ2dhbiBwYWRhIHBlcmlvZGUgZGVuZ2FuIHBlcm1pbnRhYW4gcmVuZGFoLg0KDQotICoqUGVuZ2FydWggVGVyaGFkYXAgTWFyZ2luIEtldW50dW5nYW4qKjogTWVza2lwdW4gZGlza29uIGRhcGF0IG1lbmluZ2thdGthbiB2b2x1bWUgcGVuanVhbGFuLCBwZW5nYXJ1aCB0ZXJoYWRhcCBtYXJnaW4ga2V1bnR1bmdhbiBiaXNhIGJlcmFnYW0uIE9sZWgga2FyZW5hIGl0dSwgcGVudGluZyB1bnR1ayBtZW1hc3Rpa2FuIGJhaHdhIGRpc2tvbiB5YW5nIGRpYmVyaWthbiB0aWRhayB0ZXJsYWx1IHRpbmdnaSBzZWhpbmdnYSBkYXBhdCBtZXJ1Z2lrYW4gcHJvZml0YWJpbGl0YXMuDQoNCi0gKipQZW5pbmdrYXRhbiBLZXB1YXNhbiBQZWxhbmdnYW4qKjogUGVudXJ1bmFuIGhhcmdhIG1lbGFsdWkgZGlza29uIHlhbmcgc3RyYXRlZ2lzIGJpc2EgbWVuaW5na2F0a2FuIGtlcHVhc2FuIHBlbGFuZ2dhbiBkYW4gbWVtcGVya3VhdCBsb3lhbGl0YXMuIE5hbXVuLCBoYXNpbCBkYXJpIGFuYWxpc2lzIGtvcmVsYXNpIGFudGFyYSBkaXNrb24gZGFuIHJhdGluZyBwZWxhbmdnYW4gbWVudW5qdWtrYW4gYmFod2EgZGlza29uIHRpZGFrIHNlbGFsdSBiZXJrb3JlbGFzaSBwb3NpdGlmIGRlbmdhbiBwZW5pbmdrYXRhbiByYXRpbmcgcGVsYW5nZ2FuLiBIYWwgaW5pIGJpc2EgZGlzZWJhYmthbiBvbGVoIGt1YWxpdGFzIHByb2R1ayBhdGF1IHBlbmdhbGFtYW4gYmVyYmVsYW5qYSB5YW5nIHRpZGFrIHNlYmFuZGluZyBkZW5nYW4gZGlza29uIHlhbmcgZGliZXJpa2FuLg0KDQotICoqUmVrb21lbmRhc2kqKjogVW50dWsga290YSBzZXBlcnRpICoqQm9nb3IqKiwgZGkgbWFuYSBwZW5qdWFsYW4gYmlzYSBtZW51cnVuIGRyYXN0aXMsIHBlbWJlcmlhbiBkaXNrb24geWFuZyB0ZXBhdCBzYXNhcmFuIHBhZGEgcHJvZHVrIHBvcHVsZXIgYXRhdSBwcm9kdWsgeWFuZyBtZW1pbGlraSBwZXJzZWRpYWFuIGJlcmxlYmloIGJpc2EgbWVtYmFudHUgbWVuc3RhYmlsa2FuIHBlbmp1YWxhbi4gTmFtdW4sIHBlcmx1IGJlcmhhdGktaGF0aSBhZ2FyIGRpc2tvbiB0aWRhayB0ZXJsYWx1IGJlc2FyIGhpbmdnYSBtZW5ndXJhbmdpIG1hcmdpbi4NCg0KMi4gKipBbG9rYXNpIEFuZ2dhcmFuIFByb21vc2kqKg0KDQotICoqUGVudXJ1bmFuIFBlbmp1YWxhbiBNdXNpbWFuKio6IEJlcmRhc2Fya2FuIGFuYWxpc2lzIG11c2ltYW4sIGtpdGEgbWVsaWhhdCBiYWh3YSBiZWJlcmFwYSBrb3RhIG1lbmdhbGFtaSBwZW51cnVuYW4gcGVuanVhbGFuIHBhZGEgYnVsYW4gdGVydGVudHUuIFBlbmdhbG9rYXNpYW4gYW5nZ2FyYW4gcHJvbW9zaSB5YW5nIGxlYmloIGJhbnlhayBwYWRhIHBlcmlvZGUtcGVyaW9kZSBpbmkgZGFwYXQgbWVtYmFudHUgbWVuaW5na2F0a2FuIHZpc2liaWxpdGFzIG1lcmVrIGRhbiBtZW5hcmlrIGxlYmloIGJhbnlhayBwZWxhbmdnYW4uDQoNCi0gKipQZW5pbmdrYXRhbiBFZmVrdGl2aXRhcyBQcm9tb3NpKio6IERlbmdhbiBtZW5nYWxva2FzaWthbiBhbmdnYXJhbiBwcm9tb3NpIGxlYmloIGJhbnlhayBwYWRhIGJ1bGFuLWJ1bGFuIGRlbmdhbiBwZW51cnVuYW4gc2lnbmlmaWthbiwgcGVydXNhaGFhbiBkYXBhdCBtZW5naW1iYW5naSBwZW51cnVuYW4gcGVuanVhbGFuIHlhbmcgdGVyamFkaSBkYW4gbWVtYXN0aWthbiBiYWh3YSBwZWxhbmdnYW4gdGV0YXAgdGVydGFyaWsgcGFkYSBwcm9kdWsgeWFuZyBkaXRhd2Fya2FuLg0KDQotICoqUGVuYXJnZXRhbiBkZW5nYW4gSWtsYW4gRGlnaXRhbCoqOiBBbG9rYXNpIGFuZ2dhcmFuIHByb21vc2kgdW50dWsgaWtsYW4gZGlnaXRhbCB5YW5nIGxlYmloIHRlcmFyYWggZGFuIGJlcmRhc2Fya2FuIGRhdGEgcGVsYW5nZ2FuIGRhcGF0IG1lbXBlcmt1YXQgcGVuY2FwYWlhbiB0YXJnZXQgcGFzYXIgeWFuZyBsZWJpaCBsdWFzLiBNaXNhbG55YSwgKipKYWthcnRhKiogZGFwYXQgbWVtYW5mYWF0a2FuIGFuZ2dhcmFuIHVudHVrIHByb21vc2kgeWFuZyBsZWJpaCBiZXNhciBwYWRhIGJ1bGFuIHB1bmNhayBiZWxhbmphIGRhbiBtZW1hbmZhYXRrYW4gc2FsdXJhbiBkaWdpdGFsIHVudHVrIG1lbmphbmdrYXUgYXVkaWVucyB5YW5nIGxlYmloIGJhbnlhay4NCg0KLSAqKlJla29tZW5kYXNpKio6IERhbGFtIGtvdGEgc2VwZXJ0aSAqKlRhbmdlcmFuZyoqLCBkaSBtYW5hIGFkYSBmbHVrdHVhc2kgcGVuanVhbGFuIHlhbmcgc2lnbmlmaWthbiwgYWxva2FzaSBhbmdnYXJhbiBwcm9tb3NpIGhhcnVzIGRpZm9rdXNrYW4gcGFkYSBidWxhbiBkZW5nYW4gcGVudXJ1bmFuIHBlbmp1YWxhbiB5YW5nIHRhamFtLiBJbnZlc3Rhc2kgZGFsYW0gaWtsYW4gZGlnaXRhbCBkYW4ga2FtcGFueWUgbXVzaW1hbiBkYXBhdCBtZW1iYW50dSBtZW5kb25na3JhayBwZW5qdWFsYW4gc2VsYW1hIHBlcmlvZGUgeWFuZyBsZWJpaCByZW5kYWguDQoNCjMuICoqRGlzdHJpYnVzaSBQZW5qdWFsYW4ga2UgSmVuaXMgT3V0bGV0IFRlcnRlbnR1KioNCg0KLSAqKlBlbmdhcnVoIHRlcmhhZGFwIExva2FzaSBPdXRsZXQqKjogQmVyZGFzYXJrYW4gaGFzaWwgYW5hbGlzaXMgZGlzdHJpYnVzaSBwZW5qdWFsYW4gYW50YXJhICoqT3V0bGV0IE1vZGVybioqIGRhbiAqKlRyYWRpc2lvbmFsKiosIGtpdGEgbWVsaWhhdCBiYWh3YSBqZW5pcyBvdXRsZXQgZGFwYXQgbWVtcGVuZ2FydWhpIHRvdGFsIHBlbmp1YWxhbi4gT3V0bGV0IG1vZGVybiBjZW5kZXJ1bmcgbWVtaWxpa2kgcGVuanVhbGFuIHlhbmcgbGViaWggdGluZ2dpIGRpYmFuZGluZ2thbiBvdXRsZXQgdHJhZGlzaW9uYWwuDQoNCiAgLSAqKk91dGxldCBNb2Rlcm4qKjogT3V0bGV0IG1vZGVybiBjZW5kZXJ1bmcgbGViaWggdGVyb3JnYW5pc2lyIGRhbiBtZW5hd2Fya2FuIHBlbmdhbGFtYW4gYmVyYmVsYW5qYSB5YW5nIGxlYmloIG1vZGVybiwgeWFuZyBiaXNhIGxlYmloIG1lbmFyaWsgYmFnaSBwZWxhbmdnYW4gbXVkYSBhdGF1IG1lcmVrYSB5YW5nIG1lbmNhcmkga2VueWFtYW5hbi4gUGVtYXNhcmFuIHlhbmcgbGViaWggYmVyZm9rdXMgcGFkYSBwZW5nYWxhbWFuIHBlbGFuZ2dhbiBkYW4gcGVuZ2d1bmFhbiB0ZWtub2xvZ2kgKHNlcGVydGkgYXBsaWthc2kgYmVsYW5qYSkgZGFwYXQgbGViaWggbWVuZ3VudHVuZ2thbi4NCg0KICAtICoqT3V0bGV0IFRyYWRpc2lvbmFsKio6IE91dGxldCB0cmFkaXNpb25hbCwgbWVza2lwdW4gbWVtaWxpa2kgcGVuanVhbGFuIGxlYmloIHJlbmRhaCwgbXVuZ2tpbiBtZW1pbGlraSBiYXNpcyBwZWxhbmdnYW4geWFuZyBsZWJpaCBzZXRpYSBkYW4gbGViaWggYmVyZm9rdXMgcGFkYSBwYXNhciBsb2thbC4gRGFsYW0gaGFsIGluaSwgcGVuZGVrYXRhbiBwZW1hc2FyYW4geWFuZyBsZWJpaCBwZXJzb25hbCBkYW4gYmVyYmFzaXMgcGFkYSBrb211bml0YXMgbG9rYWwgZGFwYXQgbWVuaW5na2F0a2FuIHBlbmp1YWxhbi4NCg0KLSAqKlJla29tZW5kYXNpKio6IA0KDQogIC0gKipPdXRsZXQgTW9kZXJuKio6IERpIGtvdGEgc2VwZXJ0aSAqKkpha2FydGEqKiwgZGkgbWFuYSB2b2x1bWUgcGVuanVhbGFuIGxlYmloIGJlc2FyLCBkaXN0cmlidXNpIHByb2R1ayBkZW5nYW4gc3RyYXRlZ2kgcHJvbW9zaSB5YW5nIGJlcmJhc2lzIHRla25vbG9naSBkYW4ga2VueWFtYW5hbiBha2FuIGxlYmloIGVmZWt0aWYuIEZva3VzIHBhZGEgbWVuaW5na2F0a2FuIHBlbmdhbGFtYW4gYmVyYmVsYW5qYSBkaWdpdGFsIG1lbGFsdWkgYXBsaWthc2kgYXRhdSBlLWNvbW1lcmNlLg0KDQogIC0gKipPdXRsZXQgVHJhZGlzaW9uYWwqKjogRGkga290YSBzZXBlcnRpICoqQmVrYXNpKiogYXRhdSAqKkRlcG9rKiosIGRpc3RyaWJ1c2kgcGVuanVhbGFuIGtlIG91dGxldCB0cmFkaXNpb25hbCBkYXBhdCBkaXRpbmdrYXRrYW4gZGVuZ2FuIHByb2dyYW0tcHJvZ3JhbSBsb2thbCBzZXBlcnRpIGRpc2tvbiBraHVzdXMgdW50dWsgcGVsYW5nZ2FuIHNldGlhIGF0YXUgcHJvbW9zaSBiZXJiYXNpcyBrb211bml0YXMgeWFuZyBsZWJpaCB0ZXJmb2t1cyBwYWRhIGh1YnVuZ2FuIGxhbmdzdW5nIGRlbmdhbiBwZWxhbmdnYW4uDQoNCioqRGFtcGFrIEtvbWJpbmFzaSBQZW5nb3B0aW1hbGFuIERpc2tvbiwgQWxva2FzaSBBbmdnYXJhbiBQcm9tb3NpLCBkYW4gRGlzdHJpYnVzaSBPdXRsZXQ6KioNCg0KMS4gKipEYW1wYWsgU2luZXJnaXMqKjogRGVuZ2FuIG1lbmdnYWJ1bmdrYW4gZGlza29uIHlhbmcgdGVwYXQsIGFsb2thc2kgYW5nZ2FyYW4gcHJvbW9zaSB5YW5nIGxlYmloIGJlc2FyIHBhZGEgd2FrdHUgeWFuZyB0ZXBhdCwgZGFuIGRpc3RyaWJ1c2kgcHJvZHVrIHlhbmcgbGViaWggc3RyYXRlZ2lzIGRpIGplbmlzIG91dGxldCB5YW5nIHRlcGF0LCBwZXJ1c2FoYWFuIGRhcGF0IG1lbmluZ2thdGthbiBwZW5qdWFsYW4gZGkgc2VtdWEgbG9rYXNpLg0KDQogICAtIE1pc2FsbnlhLCBqaWthICoqSmFrYXJ0YSoqIG1lbmdhbG9rYXNpa2FuIGFuZ2dhcmFuIHByb21vc2kgbGViaWggYmFueWFrIHNlbGFtYSBtdXNpbSBsaWJ1cmFuIGRhbiBtZW1iZXJpa2FuIGRpc2tvbiB5YW5nIGxlYmloIGJlc2FyIGRpIG91dGxldCBtb2Rlcm4sIHBlbmp1YWxhbiBkYXBhdCBtZW5pbmdrYXQgc2VjYXJhIHNpZ25pZmlrYW4uDQoNCiAgIC0gQmVnaXR1IHB1bGEsIGRlbmdhbiBtZW5pbmdrYXRrYW4gZGlzdHJpYnVzaSBwcm9kdWsgZGkgKipvdXRsZXQgdHJhZGlzaW9uYWwgQmVrYXNpKiosIHlhbmcgbGViaWggY29jb2sgZGVuZ2FuIHBlbGFuZ2dhbiBzZXRpYSwgcGVydXNhaGFhbiBkYXBhdCBtZW5ndXJhbmdpIGZsdWt0dWFzaSBkYW4gbWVuaW5na2F0a2FuIHN0YWJpbGl0YXMgcGVuanVhbGFuLg0KDQoyLiAqKlBlbmdhbGFtYW4gUGVsYW5nZ2FuKio6IFNlbXVhIHN0cmF0ZWdpIGRpIGF0YXMgZGFwYXQgYmVya29udHJpYnVzaSBwYWRhIG1lbmluZ2thdGthbiBwZW5nYWxhbWFuIHBlbGFuZ2dhbi4gRGlza29uIHlhbmcgcmVsZXZhbiwgcHJvbW9zaSB5YW5nIGRpdGFyZ2V0a2FuLCBkYW4gcHJvZHVrIHlhbmcgbGViaWggbXVkYWggZGlha3NlcyBkaSBvdXRsZXQgeWFuZyB0ZXBhdCBha2FuIG1lbmluZ2thdGthbiBrZXB1YXNhbiBwZWxhbmdnYW4gZGFuIGtlbXVuZ2tpbmFuIHBlbWJlbGlhbiBiZXJ1bGFuZy4NCg0KMy4gKipLZXNlaW1iYW5nYW4gYW50YXJhIFZvbHVtZSBkYW4gTWFyZ2luKio6IFBlbnRpbmcgdW50dWsgbWVuamFnYSBrZXNlaW1iYW5nYW4gYW50YXJhIHZvbHVtZSBwZW5qdWFsYW4gZGFuIG1hcmdpbiBrZXVudHVuZ2FuLiBNZW5nb3B0aW1hbGthbiBkaXNrb24gcGVybHUgZGlsYWt1a2FuIGRlbmdhbiBoYXRpLWhhdGksIGthcmVuYSBkaXNrb24geWFuZyB0ZXJsYWx1IGJlc2FyIGJpc2EgbWVydWdpa2FuIHByb2ZpdGFiaWxpdGFzIG1lc2tpcHVuIG1lbmluZ2thdGthbiB2b2x1bWUgcGVuanVhbGFuLiANCg0KIyMjIEtlc2ltcHVsYW4gQWtoaXINCg0KIyMjIyAqKlN0YXRpc3RpayBEZXNrcmlwdGlmKioNCg0KICAgRGFyaSBhbmFsaXNpcyBzdGF0aXN0aWsgZGVza3JpcHRpZiwgZGFwYXQgZGlzaW1wdWxrYW4gYmFod2EgbWFzaW5nLW1hc2luZyBrb3RhIG1lbWlsaWtpIGthcmFrdGVyaXN0aWsgeWFuZyBiZXJiZWRhIGRhbGFtIGhhbCBwZW5qdWFsYW4sIGJpYXlhIHByb21vc2ksIGRhbiByYXRpbmcgcGVsYW5nZ2FuLiBKYWthcnRhLCBzZWJhZ2FpIGtvdGEgZGVuZ2FuIHBlbmp1YWxhbiB0ZXJ0aW5nZ2ksIG1lbnVuanVra2FuIHZhcmlhYmlsaXRhcyB5YW5nIHRpbmdnaSBkYWxhbSBwZW5qdWFsYW4sIHRlcnV0YW1hIHNlbGFtYSBidWxhbi1idWxhbiB0ZXJ0ZW50dS4gSGFsIGluaSBtZW5hbmRha2FuIGFkYW55YSBmbHVrdHVhc2kgYmVzYXIgeWFuZyB0ZXJrYWl0IGRlbmdhbiBmYWt0b3IgbXVzaW1hbiwgc2VwZXJ0aSBsaWJ1cmFuIGRhbiBha2hpciB0YWh1bi4gRGkgc2lzaSBsYWluLCBrb3RhIHNlcGVydGkgRGVwb2sgbWVudW5qdWtrYW4gc3RhYmlsaXRhcyBwZW5qdWFsYW4geWFuZyBsZWJpaCBiYWlrLCBkZW5nYW4gZmx1a3R1YXNpIHlhbmcgbGViaWgga2VjaWwuIFBlbmdndW5hYW4gZGF0YSBzdGF0aXN0aWsgaW5pIG1lbmdpbmRpa2FzaWthbiBiYWh3YSBwZW5kZWthdGFuIHBlbWFzYXJhbiB5YW5nIGxlYmloIGRpbmFtaXMsIGRlbmdhbiBwZW55ZXN1YWlhbiBwYWRhIHdha3R1IGRhbiBpbnRlbnNpdGFzIHByb21vc2ksIGRhcGF0IG1lbWJhbnR1IG1lbXBlcmJhaWtpIGhhc2lsIHBlbmp1YWxhbiBkaSBtYXNpbmctbWFzaW5nIGtvdGEuDQoNCiMjIyMgKipQb2xhIFRyZW4gZGFuIE11c2ltYW4qKg0KDQogICBBbmFsaXNpcyBwb2xhIHRyZW4gdGFodW5hbiBtZW51bmp1a2thbiBiYWh3YSBhZGEgdmFyaWFzaSBzaWduaWZpa2FuIGRhbGFtIHRyZW4gcGVuanVhbGFuIGFudGFyIGtvdGEuIEpha2FydGEgZGFuIFRhbmdlcmFuZyBtZW5nYWxhbWkga2VuYWlrYW4gcGVuanVhbGFuIHlhbmcgdGFqYW0gc2VsYW1hIHBlcmlvZGUtcGVyaW9kZSB0ZXJ0ZW50dSwgc2VwZXJ0aSBwYWRhIG11c2ltIGxpYnVyYW4gYXRhdSBha2hpciB0YWh1bi4gU2ViYWxpa255YSwga290YS1rb3RhIGxhaW4gc2VwZXJ0aSBCb2dvciBkYW4gQmVrYXNpIG1lbnVuanVra2FuIHBvbGEgcGVudXJ1bmFuIHlhbmcgbGViaWggc2lnbmlmaWthbiBzZWxhbWEgYnVsYW4tYnVsYW4gdGVydGVudHUuIEhhc2lsIGFuYWxpc2lzIG11c2ltYW4gbWVuZWdhc2thbiBiYWh3YSBiZWJlcmFwYSBidWxhbiBhdGF1IGt1YXJ0YWwgbWVuZ2FsYW1pIHBlbmluZ2thdGFuIHBlbmp1YWxhbiBzZWNhcmEgc2VyYWdhbSBkaSBiYW55YWsga290YSwgdGVydXRhbWEgcGFkYSBidWxhbi1idWxhbiBkZW5nYW4gYWNhcmEgYmVzYXIgc2VwZXJ0aSBUYWh1biBCYXJ1IGRhbiBIYXJpIFJheWEuIE9sZWgga2FyZW5hIGl0dSwgc2FuZ2F0IGRpc2FyYW5rYW4gdW50dWsgbWVyZW5jYW5ha2FuIGthbXBhbnllIHByb21vc2kgeWFuZyBsZWJpaCBhZ3Jlc2lmIHBhZGEgYnVsYW4tYnVsYW4gdGVyc2VidXQsIGRlbmdhbiBwZW55ZXN1YWlhbiBhbmdnYXJhbiB1bnR1ayBtZW1hc3Rpa2FuIHBlbmNhcGFpYW4gdGFyZ2V0IHBlbmp1YWxhbi4NCg0KIyMjIyAqKkFuYWxpc2lzIEtvcmVsYXNpKioNCg0KICAgSGFzaWwgYW5hbGlzaXMga29yZWxhc2kgbWVuZ3VuZ2thcGthbiBodWJ1bmdhbiB5YW5nIHNpZ25pZmlrYW4gYW50YXJhIGJpYXlhIHByb21vc2kgZGFuIHBlbmp1YWxhbiwgbWVza2lwdW4gZGVuZ2FuIHZhcmlhYmlsaXRhcyB5YW5nIGN1a3VwIGJlc2FyLiBNZXNraXB1biBkaXNrb24gZGFuIGJpYXlhIHByb21vc2kgZGFwYXQgbWVtZW5nYXJ1aGkgcGVuaW5na2F0YW4gcGVuanVhbGFuLCBrb3JlbGFzaSBhbnRhcmEgZGlza29uIGRhbiByYXRpbmcgcGVsYW5nZ2FuIHRpZGFrIHNlbGFsdSBwb3NpdGlmLiBIYWwgaW5pIG1lbnVuanVra2FuIGJhaHdhIG1lc2tpcHVuIGRpc2tvbiBkYXBhdCBtZW5kb3JvbmcgcGVuaW5na2F0YW4gdm9sdW1lIHBlbmp1YWxhbiwgZmFrdG9yIGt1YWxpdGFzIHByb2R1ayBkYW4gcGVuZ2FsYW1hbiBwZWxhbmdnYW4gbWVuamFkaSBsZWJpaCBwZW50aW5nIGRhbGFtIG1lbmphZ2EgbG95YWxpdGFzIHBlbGFuZ2dhbiBkYW4gbWVuaW5na2F0a2FuIHJhdGluZyBtZXJla2EuIE9sZWgga2FyZW5hIGl0dSwgZGlzYXJhbmthbiB1bnR1ayBtZWxha3VrYW4gZGlza29uIHNlY2FyYSBzZWxla3RpZiBwYWRhIHByb2R1ayB5YW5nIG1lbWlsaWtpIHBlcm1pbnRhYW4gdGluZ2dpIGF0YXUgcGFkYSBwZXJpb2RlIHBlbnVydW5hbiBwZW5qdWFsYW4geWFuZyB0YWphbSwgc2VydGEgbWVtcGVydGltYmFuZ2thbiBwZW5pbmdrYXRhbiBsYXlhbmFuIHBlbGFuZ2dhbiB1bnR1ayBtZW5pbmdrYXRrYW4gcmF0aW5nLg0KDQojIyMjICoqVWppIEhpcG90ZXNpcyoqDQoNCiAgIEJlcmRhc2Fya2FuIGhhc2lsIHVqaSBoaXBvdGVzaXMsIGRpdGVtdWthbiBiYWh3YSBwZXJiZWRhYW4gcGVuanVhbGFuIGFudGFyIGtvdGEsIHNlcnRhIGFudGFyYSBqZW5pcyBvdXRsZXQgKE1vZGVybiB2cyBUcmFkaXNpb25hbCksIG1lbWlsaWtpIGRhbXBhayB5YW5nIHNpZ25pZmlrYW4gdGVyaGFkYXAgaGFzaWwgcGVuanVhbGFuLiBNaXNhbG55YSwgb3V0bGV0IG1vZGVybiBkaSBrb3RhIGJlc2FyIHNlcGVydGkgSmFrYXJ0YSBkYW4gVGFuZ2VyYW5nIG1lbnVuanVra2FuIHBlbmp1YWxhbiB5YW5nIGxlYmloIHRpbmdnaSBkaWJhbmRpbmdrYW4gb3V0bGV0IHRyYWRpc2lvbmFsIGRpIGtvdGEgeWFuZyBsZWJpaCBrZWNpbCBzZXBlcnRpIEJla2FzaSBkYW4gRGVwb2suIEluaSBtZW51bmp1a2thbiBiYWh3YSBvdXRsZXQgbW9kZXJuIG1lbWlsaWtpIGRheWEgdGFyaWsgeWFuZyBsZWJpaCBiZXNhciBiYWdpIHBlbGFuZ2dhbiB5YW5nIGxlYmloIG11ZGEgYXRhdSBtZXJla2EgeWFuZyBtZW5jYXJpIHBlbmdhbGFtYW4gYmVsYW5qYSB5YW5nIGxlYmloIG55YW1hbi4gT2xlaCBrYXJlbmEgaXR1LCBzdHJhdGVnaSBkaXN0cmlidXNpIHlhbmcgbWVuZ3V0YW1ha2FuIG91dGxldCBtb2Rlcm4gZGkga290YSBiZXNhciBkYW4gb3V0bGV0IHRyYWRpc2lvbmFsIGRpIGtvdGEgZGVuZ2FuIGJhc2lzIHBlbGFuZ2dhbiBsb2thbCB5YW5nIGt1YXQgZGFwYXQgbWVuaW5na2F0a2FuIGVmaXNpZW5zaSBwZW5qdWFsYW4uDQoNCiMjIyMgKipBbmFsaXNpcyBEYXRhIEthdGVnb3JpayoqDQoNCiAgIERhcmkgYW5hbGlzaXMgZGlzdHJpYnVzaSBwZW5qdWFsYW4gYmVyZGFzYXJrYW4ga2F0ZWdvcmkgcHJvZHVrLCBkaXRlbXVrYW4gYmFod2EgcHJvZHVrIG1ha2FuYW4gZGFuIG1pbnVtYW4gc2VjYXJhIGtvbnNpc3RlbiBtZW51bmp1a2thbiBwZW5qdWFsYW4geWFuZyBsZWJpaCB0aW5nZ2kgZGliYW5kaW5na2FuIHByb2R1ayBrZXNlaGF0YW4uIEhhbCBpbmkgbWVudW5qdWtrYW4gYmFod2EgcGFzYXIgdW50dWsgbWFrYW5hbiBkYW4gbWludW1hbiBsZWJpaCBiZXNhciBkYW4gbGViaWggc3RhYmlsIGRpIHNlbHVydWgga290YS4gU2VkYW5na2FuIHByb2R1ayBrZXNlaGF0YW4gbWVtYnV0dWhrYW4gcGVuZGVrYXRhbiBwZW1hc2FyYW4geWFuZyBsZWJpaCB0ZXBhdCwgc2VwZXJ0aSBwZW5hcmdldGFuIGRlbW9ncmFmaXMgYXRhdSBrYW1wYW55ZSBlZHVrYXNpIHVudHVrIG1lbmluZ2thdGthbiBwZW5qdWFsYW5ueWEuIFNlbGFpbiBpdHUsIGhhc2lsIEFOT1ZBIG1lbnVuanVra2FuIHBlcmJlZGFhbiB5YW5nIHNpZ25pZmlrYW4gZGFsYW0gcmF0YS1yYXRhIHBlbmp1YWxhbiBhbnRhciBrYXRlZ29yaSBwcm9kdWssIHlhbmcgbWVuZ2FyYWggcGFkYSBrZXNpbXB1bGFuIGJhaHdhIHN0cmF0ZWdpIHBlbWFzYXJhbiBoYXJ1cyBkaXNlc3VhaWthbiBkZW5nYW4gamVuaXMgcHJvZHVrIGRhbiBwYXNhciB5YW5nIGRpdHVqdS4NCg0KIyMjIyAqKk1vZGVsIFByZWRpa3NpIFBlbmRhcGF0YW4qKg0KDQogICBQZXJoaXR1bmdhbiB0b3RhbCBwZW5kYXBhdGFuIG1lbnVuanVra2FuIGJhaHdhIGtvbnRyaWJ1c2kgZGFyaSBzZXRpYXAga290YSB0ZXJoYWRhcCBwZW5kYXBhdGFuIHNhbmdhdCBiZXJnYW50dW5nIHBhZGEgdm9sdW1lIHBlbmp1YWxhbiBkYW4gaGFyZ2EgcGVyIHVuaXQgcHJvZHVrLiBLb3RhIGJlc2FyIHNlcGVydGkgSmFrYXJ0YSBkYW4gVGFuZ2VyYW5nIG1lbWJlcmlrYW4ga29udHJpYnVzaSB5YW5nIGxlYmloIGJlc2FyLCBzZW1lbnRhcmEga290YS1rb3RhIGxhaW4gc2VwZXJ0aSBEZXBvayBkYW4gQmVrYXNpIG1lbWJlcmlrYW4ga29udHJpYnVzaSB5YW5nIGxlYmloIGtlY2lsLiBBbmFsaXNpcyByZWdyZXNpIGxpbmVhciBtZW5naWRlbnRpZmlrYXNpIGJlYmVyYXBhIGZha3RvciBwZW50aW5nIHlhbmcgbWVtcGVuZ2FydWhpIHBlbmRhcGF0YW4sIHNlcGVydGkgYmlheWEgcHJvbW9zaSwgcmF0aW5nIHBlbGFuZ2dhbiwgZGFuIG11c2ltIHBlbmp1YWxhbi4gVW50dWsgbWVtYWtzaW1hbGthbiBwZW5kYXBhdGFuLCBkaXNhcmFua2FuIGFnYXIgYWxva2FzaSBhbmdnYXJhbiBwcm9tb3NpIGRpZm9rdXNrYW4gcGFkYSBmYWt0b3ItZmFrdG9yIHlhbmcgcGFsaW5nIHNpZ25pZmlrYW4sIGRhbiBzdHJhdGVnaSBwZW5pbmdrYXRhbiBwZW5nYWxhbWFuIHBlbGFuZ2dhbiBzZXJ0YSBwZW5nZWxvbGFhbiBzdG9rIGRpbGFrdWthbiBkZW5nYW4gbGViaWggZWZla3RpZi4NCg0KIyMjIyAqKkludGVycHJldGFzaSBCaXNuaXMqKg0KDQogICBCZXJkYXNhcmthbiBoYXNpbCBhbmFsaXNpcyB5YW5nIGRpbGFrdWthbiwgc3RyYXRlZ2kgcGVtYXNhcmFuIHlhbmcgZGlzYXJhbmthbiB1bnR1ayBzZXRpYXAga290YSBwZXJsdSBkaXNlc3VhaWthbiBkZW5nYW4ga2FyYWt0ZXJpc3RpayBwYXNhciBsb2thbCBkYW4gZGluYW1pa2EgcGVuanVhbGFuIHlhbmcgYWRhLiBEaSBKYWthcnRhLCBzdHJhdGVnaSB1dGFtYSBhZGFsYWggbWVuaW5na2F0a2FuIHByb2dyYW0gbG95YWxpdGFzIHBlbGFuZ2dhbiBkYW4gbWVtYW5mYWF0a2FuIHByb21vc2kgbXVzaW1hbiBkZW5nYW4gYWdyZXNpZi4gSGFsIGluaSBwZW50aW5nIHVudHVrIG1lbmdpbWJhbmdpIGZsdWt0dWFzaSBwZW5qdWFsYW4geWFuZyBiZXNhciBwYWRhIGJ1bGFuLWJ1bGFuIHRlcnRlbnR1LiBEaSBCb2dvciwgcGVtYmVyaWFuIGRpc2tvbiBsZWJpaCBzZWxla3RpZiBwYWRhIHByb2R1ayB5YW5nIGxlYmloIHBvcHVsZXIgYXRhdSBiZXJkYXNhcmthbiBwcmVmZXJlbnNpIHBlbGFuZ2dhbiBkYXBhdCBtZW1iYW50dSBtZW5pbmdrYXRrYW4gcGVuanVhbGFuIHlhbmcgY2VuZGVydW5nIG1lbnVydW4gZHJhc3Rpcy4gVW50dWsgRGVwb2ssIHByb2dyYW0gYmVyYmFzaXMgcGVsYW5nZ2FuIHNldGlhIHNlcGVydGkgZGlza29uIGVrc2tsdXNpZiBhdGF1IGhhZGlhaCBsb3lhbGl0YXMgYWthbiBsZWJpaCBlZmVrdGlmIGRhbGFtIG1lbXBlcnRhaGFua2FuIHN0YWJpbGl0YXMgcGVuanVhbGFuIHNlcGFuamFuZyB0YWh1bi4NCg0KICAgRGkgVGFuZ2VyYW5nLCBwZW5ndWF0YW4gYnJhbmQgYXdhcmVuZXNzIG1lbGFsdWkgaWtsYW4geWFuZyBsZWJpaCB0ZXJhcmFoIGRhbiBwZW5nZ3VuYWFuIGluZmx1ZW5jZXIgYXRhdSBwbGF0Zm9ybSBkaWdpdGFsIHNhbmdhdCBkaXNhcmFua2FuLCBtZW5naW5nYXQgYWRhbnlhIGZsdWt0dWFzaSBwZW5qdWFsYW4geWFuZyBjdWt1cCBiZXNhci4gU2VkYW5na2FuIHVudHVrIEJla2FzaSwgbWVuaW5na2F0a2FuIGt1YWxpdGFzIGxheWFuYW4gcGVsYW5nZ2FuIGRhbiBtZW5nZ3VuYWthbiBwcm9tb3NpIGJlcmJhc2lzIHJhdGluZyBwcm9kdWsgeWFuZyBwb3NpdGlmIGRhcGF0IG1lbWJhbnR1IG1lbXBlcmJhaWtpIGZsdWt0dWFzaSBwZW5qdWFsYW4gZGFuIG1lbmluZ2thdGthbiBrZXB1YXNhbiBwZWxhbmdnYW4uIFNlbGFpbiBpdHUsIHBlbmdvcHRpbWFsYW4gZGlza29uLCBhbG9rYXNpIGFuZ2dhcmFuIHByb21vc2ksIGRhbiBkaXN0cmlidXNpIHBlbmp1YWxhbiB5YW5nIGxlYmloIHN0cmF0ZWdpcyBhbnRhcmEgb3V0bGV0IG1vZGVybiBkYW4gdHJhZGlzaW9uYWwgYWthbiBtZW1iZXJpa2FuIGRhbXBhayB5YW5nIHNpZ25pZmlrYW4gdGVyaGFkYXAgcGVuanVhbGFuLiBPdXRsZXQgbW9kZXJuLCBkZW5nYW4gcGVuZ2FsYW1hbiBiZWxhbmphIHlhbmcgbGViaWggbW9kZXJuLCBsZWJpaCBlZmVrdGlmIHVudHVrIGtvdGEgYmVzYXIsIHNlbWVudGFyYSBvdXRsZXQgdHJhZGlzaW9uYWwgYWthbiBsZWJpaCBjb2NvayB1bnR1ayBwYXNhciB5YW5nIG1lbmd1dGFtYWthbiBrZWRla2F0YW4ga29tdW5pdGFzLg0KDQojIyMjICoqS2VzaW1wdWxhbiBTaW5lcmdpcyoqDQoNCiAgIERlbmdhbiBtZW5nZ2FidW5na2FuIHN0cmF0ZWdpIHBlbmdvcHRpbWFsYW4gZGlza29uIHlhbmcgdGVwYXQsIGFsb2thc2kgYW5nZ2FyYW4gcHJvbW9zaSB5YW5nIGxlYmloIGJlc2FyIHBhZGEgYnVsYW4tYnVsYW4gZGVuZ2FuIHBlbnVydW5hbiBwZW5qdWFsYW4geWFuZyBzaWduaWZpa2FuLCBzZXJ0YSBkaXN0cmlidXNpIHByb2R1ayB5YW5nIGxlYmloIHN0cmF0ZWdpcyBhbnRhcmEgb3V0bGV0IG1vZGVybiBkYW4gdHJhZGlzaW9uYWwsIHBlcnVzYWhhYW4gZGFwYXQgbWVuY2lwdGFrYW4gc2luZXJnaSB5YW5nIGVmZWt0aWYgdW50dWsgbWVuaW5na2F0a2FuIHBlbmp1YWxhbiBkaSBzZW11YSBrb3RhLiBNZW1wZXJrdWF0IHBlbmdhbGFtYW4gcGVsYW5nZ2FuLCBiYWlrIHNlY2FyYSBsYW5nc3VuZyBtZWxhbHVpIHBlbGF5YW5hbiBkaSBvdXRsZXQgYXRhdSBzZWNhcmEgZGlnaXRhbCBtZWxhbHVpIGFwbGlrYXNpIGRhbiBpa2xhbiBvbmxpbmUsIGFrYW4gbWVtcGVya3VhdCBsb3lhbGl0YXMgcGVsYW5nZ2FuIGRhbiBtZW5pbmdrYXRrYW4gc3RhYmlsaXRhcyBwZW5kYXBhdGFuIHBlcnVzYWhhYW4uIFNpbmVyZ2kgaW5pIGFrYW4gbWVtYXN0aWthbiBrZXNlaW1iYW5nYW4gYW50YXJhIHZvbHVtZSBwZW5qdWFsYW4geWFuZyBsZWJpaCB0aW5nZ2kgZGFuIG1hcmdpbiBrZXVudHVuZ2FuIHlhbmcgbGViaWggdGVyamFnYSwgbWVuZG9yb25nIHBlcnVzYWhhYW4gbWVudWp1IHBlcnR1bWJ1aGFuIHlhbmcgbGViaWggYmVya2VsYW5qdXRhbi4NCg0KIyBSZWZlcmVuc2kNCg0KR3VqYXJhdGksIEQuIE4uLCAmIFBvcnRlciwgRC4gQy4gKDIwMDkpLiBCYXNpYyBlY29ub21ldHJpY3MgKDV0aCBlZC4pLiBNY0dyYXctSGlsbCBFZHVjYXRpb24uDQpJU0JOOiA5NzgtMDA3MzM3NTc3OQ0KDQpHcm9sZW11bmQsIEcuLCAmIFdpY2toYW0sIEguICgyMDE2KS4gUiBmb3IgZGF0YSBzY2llbmNlOiBJbXBvcnQsIHRpZHksIHRyYW5zZm9ybSwgdmlzdWFsaXplLCBhbmQgbW9kZWwgZGF0YS4gTydSZWlsbHkgTWVkaWEsIEluYy4NCklTQk46IDk3OC0xNDkxOTEwMzk5DQoNCkZpZWxkLCBBLiAoMjAxMykuIERpc2NvdmVyaW5nIHN0YXRpc3RpY3MgdXNpbmcgUi4gU0FHRSBQdWJsaWNhdGlvbnMgTHRkLg0KSVNCTjogOTc4LTE0NDYyMDA0NjkNCg0KS3V0bmVyLCBNLiBILiwgTmFjaHRzaGVpbSwgQy4gSi4sICYgTmV0ZXIsIEouICgyMDA0KS4gQXBwbGllZCBMaW5lYXIgUmVncmVzc2lvbiBNb2RlbHMuIE1jR3Jhdy1IaWxsLg0KDQpIYWlyLCBKLiBGLiwgQmxhY2ssIFcuIEMuLCBCYWJpbiwgQi4gSi4sICYgQW5kZXJzb24sIFIuIEUuICgyMDE5KS4gTXVsdGl2YXJpYXRlIERhdGEgQW5hbHlzaXMgKDh0aCBlZC4pLiBQZWFyc29uLg0KDQpCbGF0dGJlcmcsIFIuIEMuLCBCcmllc2NoLCBSLiwgJiBGb3gsIEUuIEouICgxOTk1KS4gSG93IHByb21vdGlvbnMgd29yay4gTWFya2V0aW5nIFNjaWVuY2UsIDE0KDNfc3VwcGxlbWVudCksIEcxMjItRzEzMi4NCg0KVWppIEhpcG90ZXNpcyBkZW5nYW4gQU5PVkEgKEFuYWx5c2lzIG9mIFZhcmlhbmNlKSAtIFVuaXZlcnNpdGFzIEVzYSBVbmdndWwNCkxpbms6IGxtcy1wYXJhbGVsLmVzYXVuZ2d1bC5hYy5pZA0KDQpNb250Z29tZXJ5LCBELiBDLiAoMjAyMCkuIERlc2lnbiBhbmQgQW5hbHlzaXMgb2YgRXhwZXJpbWVudHMgKDEwdGggZWQuKS4gV2lsZXkuDQoNCkxldmluZSwgRC4gTS4sIFN0ZXBoYW4sIEQuIEYuLCBTemFiYXQsIEsuIEEuICgyMDIwKS4gU3RhdGlzdGljcyBmb3IgTWFuYWdlcnMgVXNpbmcgTWljcm9zb2Z0IEV4Y2VsICg5dGggZWQuKS4gUGVhcnNvbi4NCg0KVHJpb2xhLCBNLiBGLiAoMjAxOCkuIEVsZW1lbnRhcnkgU3RhdGlzdGljcyAoMTN0aCBlZC4pLiBQZWFyc29uLg0KDQpGZXcsIFMuICgyMDEyKS4gU2hvdyBNZSB0aGUgTnVtYmVyczogRGVzaWduaW5nIFRhYmxlcyBhbmQgR3JhcGhzIHRvIEVubGlnaHRlbiAoMm5kIGVkLikuIEFuYWx5dGljcyBQcmVzcy4NCg0KVHVmdGUsIEUuIFIuICgyMDAxKS4gVGhlIFZpc3VhbCBEaXNwbGF5IG9mIFF1YW50aXRhdGl2ZSBJbmZvcm1hdGlvbiAoMm5kIGVkLikuIEdyYXBoaWNzIFByZXNzLg0KDQpDb2hlbiwgSi4sIENvaGVuLCBQLiwgV2VzdCwgUy4gRy4sICYgQWlrZW4sIEwuIFMuICgyMDAzKS4gQXBwbGllZCBNdWx0aXBsZSBSZWdyZXNzaW9uL0NvcnJlbGF0aW9uIEFuYWx5c2lzIGZvciB0aGUgQmVoYXZpb3JhbCBTY2llbmNlcyAoM3JkIGVkLikuIFJvdXRsZWRnZS4NCg0KRmllbGQsIEEuICgyMDE4KS4gRGlzY292ZXJpbmcgU3RhdGlzdGljcyBVc2luZyBJQk0gU1BTUyBTdGF0aXN0aWNzICg1dGggZWQuKS4gU2FnZS4NCg0KV2FscG9sZSwgUi4gRS4sIE15ZXJzLCBSLiBILiwgTXllcnMsIFMuIEwuLCAmIFllLCBLLiAoMjAxNykuIFByb2JhYmlsaXR5ICYgU3RhdGlzdGljcyBmb3IgRW5naW5lZXJzICYgU2NpZW50aXN0cyAoOXRoIGVkLikuIFBlYXJzb24uDQoNCk1vb3JlLCBELiBTLiwgTWNDYWJlLCBHLiBQLiwgJiBDcmFpZywgQi4gQS4gKDIwMTcpLiBJbnRyb2R1Y3Rpb24gdG8gdGhlIFByYWN0aWNlIG9mIFN0YXRpc3RpY3MgKDl0aCBlZC4pLiBXLiBILiBGcmVlbWFuLg0KDQpodHRwczovL3d3dy5yZXNlYXJjaGdhdGUubmV0L3B1YmxpY2F0aW9uLzM3MTk4ODQ5MF9NZXRvZG9sb2dpX1BlbmVsaXRpYW5fMV9EZXNrcmlwdGlmX0t1YW50aXRhdGlmDQoNCmh0dHBzOi8vZGliaW1iaW5nLmlkL2Jsb2cvZGV0YWlsL3BlbmdlcnRpYW4tYW5hbGlzaXMtZGVza3JpcHRpZi1tZXRvZGUtY2FyYS1tZW1idWF0bnlhDQo=