Kelompok 5

Ujian Tengah Semester Statistika

SOAL 1

1.1 Definisi dan Konsep Utama

  • Tuliskan definisi statistika. Jelaskan perbedaan antara statistika deskriptif dan statistika inferensial.
  • Apa saja jenis data yang digunakan dalam statistika? Jelaskan perbedaan data numerik dan kategorik disertai contohnya.

Jawaban :

Statistika adalah ilmu yang mempelajari tentang data. Statistika secara umum adalah ilmu yang mempelajari bagaimana merencanakan, mengumpulkan, menganalisis, menginterpretasi, dan mempresentasikan sebuah data.

  • Statistika Deskriptif : Statistika deskrtiptif adalah cara untuk mengatur dan mereprensetasikan, dan mendeskripsikan kumpulan menggunakan tabel, grafik dan parameter numerik lainnya.

Istilah statistika desktiptif :

  1. Mean (Nilai Rata - rata)

  2. Median (Nilai Tengah)

  3. Modus (Nilai yang sering muncul)

  4. Standar Deviasi (Rata - rata kuadrat dari selisih nilai Mean)

  5. Korelasi (keeratan hubungan dari variabel numerik)

  6. Variance (Nilai variasi suatu data)

Statistika deskriptif penting untuk melihat pattern data yang penggunaannya diaplikasikan untuk sampel data yang sedang dipelajari, tidak bisa digunakan untuk menagmbil kesimpulan tentang suatu populasi.

  • Statistika Inferensial Statistika Inferensial digunakan untuk menarik kesimpulan terhadap karakteristik sebuah populasi dengan memanfaatkan informasi yang diperoleh dari sampel statistika deskriptif. Kesimpulan tersebut tergantung pada data yang bervariasi seperti :
  1. Linear Regression Analysis : untuk mengetahui besarnya hubungan dependent dan independent.
  2. Logistic Regression Analysis : untuk mengetahui konteks peluang
  3. Hypothesis Testing : untuk menarik kesimpulan dari dua dugaan yang bertolak belakang.
  4. Confidence Interfal : Estimasi nilai dari parameter populasi.

Contoh :

Kamu sedang bermain di pameran tentang AI dan memutuskan untuk survey 50 orang. Survey tersebut tujuannya untuk mengetahui apakah mereka suka menggunakan AI atau tidak, misal 25 orang bilang “Ya, saya suka menggunakan AI untuk keperluan ini dan lain sebagainya” dan 25 orang lagi bilang “tidak, karena dapat mengganggu kecerdasan kita sebagai manusia”

1.2 Ukuran Pemusatan dan Penyebaran

Jelaskan dengan singkat:

  • Mean (Rata-rata): Kapan penggunaan mean menjadi kurang tepat?
  • Median: Mengapa median sering digunakan untuk data dengan outlier?
  • Modus: Kapan ukuran ini lebih relevan daripada mean atau median?
  • Standar Deviasi: Apa arti dari nilai standar deviasi kecil atau besar dalam sebuah dataset?

Jawaban :

  1. Mean atau rata-rata kurang tepat digunakan dalam ukuran pemusatan data ketika data memiliki distribusi yang asimetris, memiliki outlier, atau data kategoris.

  2. Median sering digunakan untuk data dengan outlier karena median tidak terpengaruh oleh nilai-nilai ekstrem dalam data. Median merupakan ukuran kecenderungan sentral yang lebih disukai untuk data yang miring atau memiliki outlier.

  3. Modus lebih relevan daripada mean atau median ketika data yang digunakan adalah data kualitatif atau data yang memiliki banyak nilai yang sering muncul.

  4. Nilai standar deviasi (SD) yang kecil berarti data cenderung berkumpul di sekitar nilai rata-rata, sedangkan nilai SD yang besar berarti data cenderung tersebar lebih luas.

1.3 Visualisasi Data

Sebutkan tiga jenis grafik atau diagram yang biasa digunakan dalam statistika dasar (misalnya histogram, boxplot, atau diagram batang). Jelaskan tujuan masing-masing.

Jawaban :

1.3.1 Histogram

Tujuannya menampilkan distribusi frekuensi data numerik. Histogram juga digunakan untuk memahami bagaimana data tersebar, mengidentifikasi pola distribusi misalnya normal, miring ke kanan/kiri, serta mendeteksi keberadaan outlier. Data dikelompokkan dalam interval bin, dan tinggi batang menunjukkan jumlah data dalam setiap interval.

1.3.2 Boxplot

Tujuan Boxplot untuk meringkas data numerik dengan menunjukkan persebaran, median, serta potensi outlier. Boxplot membantu membandingkan distribusi data antar kelompok, menampilkan kuartil yaitu Q1, median, Q3, serta memperlihatkan apakah ada data yang jauh dari nilai normal atau outlier.

Hasil ANOVA untuk Kategori Produk
Df Sum Sq Mean Sq F value Pr(>F)
Kategori.Produk 2 27529762 13764881 1.493541 0.2262577
Residuals 297 2737232284 9216270 NA NA

1.3.3 Diagram Batang

Tujuan Diagram batang untuk menampilkan kategori atau kelompok data secara visual, di mana panjang batang mencerminkan nilai frekuensi atau jumlah dalam setiap kategori. Cocok untuk data diskrit atau nominal.

Total Pendapatan per Kota
Kota Total_Pendapatan
Bekasi 6197910
Bogor 5871510
Depok 6643740
Jakarta 6442780
Tangerang 6250550

1.4. Analisis Korelasi

Apa yang dimaksud dengan korelasi dalam statistika? Jelaskan perbedaan antara korelasi positif, negatif, dan nol, serta berikan contohnya.

Jawaban :

Korelasi dalam statistika adalah teknik analisis data yang digunakan untuk mengetahui hubungan antara dua variabel. Korelasi dapat bersifat positif, negatif, atau nol.

Berikut perbedaan dari korelasi positif, negatif, dan nol, serta berikan contohnya:

1.4.1 Korelasi positif

Korelasi positif adalah hubungan antara dua variabel ketika kedua variabel itu bergerak dalam arah yang sama. Oleh karenanya, satu variabel meningkat jika variabel lainnya meningkat, atau satu variabel menurun sementara yang lainnya juga menurun.

  • Kedua variabel berubah ke arah yang sama
  • Jika salah satu variabel meningkat, maka variabel lainnya juga meningkat

Contohnya, semakin banyak makan, maka berat badan akan semakin meningkat

1.4.2 Korelasi negatif

Korelasi negatif merupakan hubungan antara dua variabel, ketika peningkatan satu variabel dikaitkan dengan penurunan variabel lainnya.

  • Kedua variabel berubah ke arah yang berlawanan
  • Jika salah satu variabel meningkat, maka variabel lainnya menurun

Contohnya, semakin tinggi kita mendaki gunung, maka suhu disana makin menurun

1.4.3 Korelasi nol Korelasi nol menunjukkan bahwa pola perubahan antara kedua variabel bersifat acak atau tidak terhubung. Artinya, peningkatan atau penurunan salah satu variabel tidak berkaitan dengan peningkatan atau penurunan variabel lainnya.

Contohnya, Banyaknya teh yang dikonsumsi dengan tingkat kecerdasan seseorang. jadi mau seseorang itu minum sedikit atau banyak teh itu tidak mempengaruhi kecerdasan karena minum teh tersebut.

Korelasi digambarkan dalam diagram sebaran. Semakin dekat korelasinya dengan 0, semakin lemah korelasinya. Semakin dekat korelasinya dengan +/-1, semakin kuat korelasinya.

1.5 Uji Hipotesis

  • Jelaskan langkah-langkah utama dalam melakukan uji hipotesis, mulai dari merumuskan H0 dan H1, menetapkan tingkat signifikan (alpha), hingga menyimpulkan hasil.
  • Mengapa uji hipotesis penting dalam analisis data?

Jawaban :

1.5.1 Langkah - langkah dalam melakukan uji hipotesis :

  1. Merumuskan Hipotesis Nol (\(H_0\)) dan Hipotesis Alternatif (\(H_1\)).
  • \(H_0\) : Hipotesis nol menyatakan tidak adanya efek atau perbedaan. Contoh “Rata rata berat produk 500 gram”.

  • \(H_1\) : Hipotesis alternatif menyatakan adanya efek atau perbedaan. Contoh “Rata rata berat produk tidak 500 gram”.

  1. Menetapkan tingkat signifikansi (α). Tingkat signifikan adalah probabilitas maksimum untuk menolak \(H_0\) ketika \(H_0\) benar.

  2. Mengumpulkan dan menganalisis data untuk mendapatkan data yang relevan.

  3. Menentukan Distribusi uji dan nilai kritis

  4. Membuat Keputusan

  5. Menyampaikan Hasil

1.5.2 Mengapa uji hipotesis penting ?

Karena uji hipotesis dapat membantu mengambil keputusan yang objektif, mengurangi subjektivitas, mengukur ketidakpastian, memvalidasi model atau asumsi, serta memastikan keputusan relevan berbasis bukti data.

1.6 Penggunaan Software Statistika

Sebutkan beberapa perangkat lunak atau tools yang digunakan untuk analisis statistika (misalnya Excel, R, atau Python). Apa saja keunggulan dari salah satu software pilihan Anda?

Jawaban :

Beberapa perangkat lunak atau tools yang sering digunakan untuk analisis statistika adalah:

  • Excel
  • R
  • Python
  • MySQL

Keunggulan Software: R R adalah salah satu software yang sangat populer untuk analisis statistika. Berikut adalah kelebihannya:

  1. Gratis dan Open Source R dapat digunakan secara gratis, dan siapa pun bisa mengembangkan serta berbagi paket tambahan untuk memperluas fungsinya.

  2. Cocok untuk Berbagai Analisis Statistik R dirancang khusus untuk analisis data, sehingga memiliki banyak fungsi bawaan seperti regresi, uji hipotesis, dan analisis data yang kompleks.

  3. Banyak Paket Tambahan R memiliki ribuan paket yang bisa digunakan untuk kebutuhan tertentu, seperti analisis data, membuat grafik, machine learning, dan lainnya.

  4. Kemampuan Visualisasi yang Kuat R memiliki paket seperti ggplot2 untuk membuat grafik yang menarik, profesional, dan mudah disesuaikan.

  5. Dukungan untuk Data Besar R dapat menangani data berukuran besar dan terhubung ke database menggunakan paket seperti dplyr atau data.table.

  6. Komunitas yang Aktif R memiliki banyak pengguna di seluruh dunia yang sering berbagi ilmu, tutorial, dan solusi, sehingga Anda mudah mendapatkan bantuan jika mengalami kesulitan. seperti;

  • R Project:: Situs resmi untuk R
  • Twitter #rstats: Komunitas pengguna R di twitter
  • R-Blogger: Situs blog dimana para penulis dapat memposting contoh kode, analisis data, visualisasi.dsb

1.7 Interpretasi Statistik

Berdasarkan suatu data, Anda mendapatkan mean = 75, median = 72, dan standar deviasi = 10. Interpretasikan hasil ini dan simpulkan tentang distribusi data.

Jawaban :

Berdasarkan Data, mean = 75, median = 72, dan standar deviasi = 10

Nilai Mean lebih besar dari median yang mengidentifikasi data bahwa distribusi data miring ke kanan, Hal ini terjadi jika terdapat nilai-nilai ekstrem yang lebih tinggi, sehingga menaikkan rata-rata. Lalu dengan SD = 10, data memiliki penyebaran yang cukup luas di sekitar mean. Sebagian besar data (sekitar 68%) berada dalam interval [65, 85] (mean ± 1 SD), sedangkan 95% data berada dalam interval [55, 95] (mean ± 2 SD). Hal ini menunjukkan bahwa data memiliki variasi yang cukup besar.

Lalu ada potensi outlier Karena standar deviasi cukup besar dan distribusi cenderung miring, kemungkinan terdapat nilai ekstrem (outlier), terutama pada nilai yang jauh di atas mean. Meskipun data mungkin berasal dari distribusi normal (sesuai asumsi), perbedaan antara mean dan median menunjukkan adanya sedikit penyimpangan dari simetri sempurna.

1.8 Contoh Kasus

Rumuskan ringkasan dari langkah-langkah statistik dasar berikut berdasarkan suatu kasus hipotetis:

  • Deskripsi data (deskriptif).
  • Menghitung korelasi antara dua variabel.
  • Membuat uji hipotesis untuk membandingkan dua kelompok data.

Jawaban :

Jadi disini kita menggunakan data dari 8 siswa dari kelas yang berbeda.

Siswa Kelas A Kelas B
1 70 80
2 75 82
3 78 85
4 72 78
5 80 88
6 68 84
7 74 81
8 76 79

1.8.1 Deskripsi Data

  • Kelas A

Mean :

\[ \frac{70 + 75 + 78 + 72 + 80 + 68 + 74 + 76}{8}=74.125 \]

Median : Untuk menemukan median jangan lupa untuk mengrutkan angkanya terlebih dahulu.

\[ 68, 70, 72, 74, 75, 76, 78, 80 \]

\[ =\frac{74 + 75}{2}=\frac{149}{2}=74.5 \]

  • Kelas B

Mean :

\[ \frac{80 + 82 + 85 + 78 + 88 + 84 + 81 + 79}{8}=82.125 \]

Median : Untuk menemukan median jangan lupa untuk mengrutkan angkanya terlebih dahulu.

\[ 78, 79, 80, 81, 82, 84, 85, 88 \]

\[ =\frac{81 + 82}{2}=\frac{163}{2}=81.5 \]

1.8.2 Korelasi

Gunakan hubungan Jumlah Jam belajar(X) dengan Nilai Ujian(Y).

Siswa Jam Belajar(X) Nilai Ujian(Y)
1 2 70
2 4 75
3 5 78
4 3 72
5 6 80
6 1 68
7 4 74
8 5 76

Hitung Koefisien korelasi \(r\) dengan menggunakan rumus pearson:

\[ r=\frac{\sum(X - Xi)(Y - Yi)}{\sqrt\sum(X - Xi)^2\cdot(Y - Yi)^2} \]

Hitung Rata rata Mean X dan Y:

  • \(X=\) \(\frac{2+3+5+8+4+6+7+9}{8} = 5.5\)

  • \(Y=\) \(\frac{70+75+78+88+74+80+85+90}{8}=80\)

Xi Yi Xi - X Yi - Y (Xi - X)(Yi - Y) (Xi - X)^2 (Yi - Y)^2
2 70 -3.5 -10 35.0 12.25 100
3 75 -2.5 -5 12.5 6.25 25
5 78 -0.5 -2 1.0 0.25 4
8 88 2.5 8 20.0 6.25 64
4 74 -1.5 -6 9.0 2.25 36
6 80 0.5 0 0.0 0.25 0
7 85 1.5 5 7.5 2.25 25
9 90 3.5 10 35.0 12.25 100

Hitung komponen rumus:

  • \(\sum(Xi - X)(Yi - Y) = 120.5\)

  • \(\sum(Xi - X) = 42\)

  • \(\sum(Yi - Y) = 354\)

Rumus Korelasi :

\[ r=\frac {\sum(Xi - X)(Yi - Y)}{\sqrt\sum(Xi - X) \cdot \sum(Yi - Y)} \]

\[ r=\frac{120.5}{42 \cdot 354}=\frac{120.5}{\sqrt14868}=\frac{120.5}{121.9}=0.99 \]

Nilai r = 0.99 menunjukkan bahwa hubungan sangat kuat dan positif antara waktu belajar dan nilai ujian.

1.8.3 Uji Hipotesis

  • \(H_0\) : Tidak ada perbedaan rata rata
  • \(H_1\) : Ada perbedaan rata rata

Data Kelas A dan B:

  • Kelas A: 70, 75, 78, 72, 80, 68, 74, 76 Mean : 74.125 Standar Deviasi : 4.02

  • Kelas B: 80, 82, 85, 78, 88, 84, 81, 79 Mean : 82.125 Standar Deviasi : 3.51

Rumus Uji t:

\[ t=\frac{Xa - Xb}{\sqrt\frac{sA^2}{nA} + \frac{sB^2}{nB}} \]

  • \(n A = n B = 8\)

  • \(s A^2 = 16.16\) \(s B^2 = 12.32\)

Hitung nilai t:

\[ t = \frac{74.125 - 82.125}{\sqrt\frac{16.16}{8} + \frac{12.32}{8}}= \frac{-8}{\sqrt{2.02 + 1.54}} = \frac{-9}{1.89} = -4.23 \]

Bandingkan nilai t dengan nilai kritis:

  • Dengan \(df = 14\) dan \(a = 0.05\), nilai kritis \(t0.025\) = \(2.145\)

  • Karena \(t = -4.23\) berada di luar \(-2.145\) hingga \(2.145\), tolak \(H_0\)

1.9 Kesimpulan Anda

Buatlah kesimpulan singkat tentang pentingnya statistika dalam analisis data. Bagaimana Anda dapat mengaplikasikan statistika dasar ini dalam pekerjaan atau kehidupan sehari-hari?

Statistika itu penting karena membantu kita memahami data dan mengambil keputusan yang lebih tepat. Dalam pekerjaan, misalnya, kita bisa memakainya untuk melihat apakah strategi pemasaran berhasil atau tidak. Dalam kehidupan sehari-hari, statistika bisa membantu kita mengatur keuangan, memilih investasi yang aman, atau mengevaluasi informasi yang kita dapat dari berita. Intinya, statistika membantu kita melihat pola, mencari tahu apa yang benar-benar berpengaruh, dan membuat keputusan yang lebih masuk akal.

1.10 Buatkan Mind Map

Buatlah Mind Map Terkait Rangkuman meteri tersebut diatas dalam bentuk Infografis.

SOAL 2

Deskripsi Kasus

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

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, Bekasi).
  • Penjualan (unit): Total unit produk terjual per bulan.
  • 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 (warung, pasar).
  • Kategori Produk: Makanan, Minuman, atau Kesehatan.

Pertanyaan Analisis

2.1 Statistik Deskriptif

2.1.1 Hitung mean, median, dan standar deviasi untuk variabel Penjualan (unit), Biaya Promosi ($), dan Rating Pelanggan per tahun di setiap kota.

1. Menghitung Rata-rata (Mean):

Rumus: \[ \text{Rata-rata} = \frac{\text{Jumlah semua nilai}}{\text{Jumlah data}} \]

Menghitung Rata-rata Penjualan Kota Jakarta (2018)

Data Penjualan Kota Jakarta(2018):

\(10392, 11462, 9717, 12353, 10551, 9957, 10408, 14005, 6001, 11093, 10860, 8217\)

Langkah-langkah: 1. Hitung jumlah semua nilai:

\(10392+11462+9717+12353+10551+9957+10408+14005+6001+11093+10860+8217=125016\)

  1. Hitung jumlah data:

Jumlah Data = 12

  1. Masukkan ke rumus:

\[ \text{Rata-rata Penjualan Kota Jakarta (2018)} = \frac{125,016 }{12} = 10,418 \]

2. Menghitung Nilai Tengah (Median):

Rumus (Ganjil):

\[ \text{Median} = \text{Nilai Posisi Median} \]

Rumus (Genap):

\[ \text{Median} = \frac{\text{Nilai Posisi Median} = \frac{n}{2} + \frac{n}{2} + 1}{2} \]

Menghitung Median Penjualan Kota Jakarta (2018)

Data Penjualan Kota Jakarta(2018) yang diurutkan:

\(6001, 8217, 9717, 9957, 10392, 10408, 10551, 10860, 11093, 11462, 12353, 14005\)

Karena jumlah data (\(𝑛= 12\)) adalah genap, gunakan rumus untuk mecari posisi median:

\[ \text{Posisi Median} = \frac{n}{2} dan \frac{n}{2} + 1 \]

\[ \text{Posisi Median} = \frac{12}{2} dan \frac{12}{2} + 1 \]

\[ \text{Posisi Median} = \text{Data ke-6 dan Data ke-7} \]

\[ \text{Data ke-6} = 10408, \text{Data ke-7} = 10551 \]

\[ \text{Median} = \frac{10408 + 10551}{2} = 10479.5 \]

3. Menghitung Standar Deviasi:

Rumus: \[ s = \sqrt{\frac{\sum (x_i - \bar{x})^2}{n-1}} \]

Dimana:

  • \(x_i\) = semua data yang akan dihitung
  • \(\bar{X}\) = Mean (rata-rata)
  • n = jumlah data
Menghitung Standar Deviasi Penjualan Kota Jakarta (2018)

Masukkan ke rumus: \[ s = \sqrt{\frac{(10,392 - 10,418)^2 + ... + (8217 - 10,418)^2}{12-1}} \] \[ s = \sqrt{\frac{676 + ... + 4844401}{11}} \] \[ s = \sqrt{\frac{43428396}{11}} \] \[ s = \sqrt{3948036} = 1986.967 \]

kode

Data Awal
Bulan Tahun Kota Penjualan..unit. Biaya.Promosi…. Diskon…. Rating.Pelanggan..1.5. Jenis.Outlet Kategori.Produk
Jan 2018 Jakarta 10392 1660 7.8 4.7 Modern Kesehatan
Jan 2018 Bogor 11394 930 5.3 5.0 Tradisional Minuman
Jan 2018 Depok 9400 2015 19.9 4.4 Tradisional Minuman
Jan 2018 Tangerang 4475 1882 11.0 3.6 Tradisional Kesehatan
Jan 2018 Bekasi 7211 1362 10.7 5.0 Modern Kesehatan
Feb 2018 Jakarta 11462 2097 19.2 4.9 Tradisional Minuman
Ringkasan Statistik Penjualan per Tahun dan Kota
Tahun Kota Mean_Penjualan Median_Penjualan SD_Penjualan Mean_Biaya_Promosi Median_Biaya_Promosi SD_Biaya_Promosi Mean_Rating_Pelanggan Median_Rating_Pelanggan SD_Rating_Pelanggan
2018 Bekasi 9879.500 10380.0 2544.250 1718.167 1775.5 537.0913 4.458333 4.40 0.3476109
2018 Bogor 9764.167 10426.5 3063.232 1825.083 1921.5 559.9608 4.566667 4.55 0.3845501
2018 Depok 10714.583 9933.0 2586.373 2095.667 2071.0 649.8728 4.366667 4.35 0.3915780
2018 Jakarta 10418.000 10479.5 1986.967 1830.333 1868.0 463.1566 4.333333 4.45 0.4119429
2018 Tangerang 9860.667 9677.5 3859.843 1743.333 1681.5 642.9125 4.283333 4.40 0.4174236
2019 Bekasi 10885.083 11717.0 3583.913 2068.500 2063.0 632.7093 4.266667 4.40 0.3601347
2019 Bogor 10041.333 9599.5 3978.840 1990.667 2107.0 441.7347 4.200000 4.30 0.4842989
2019 Depok 10971.333 10882.0 3130.024 1883.750 1939.0 667.7163 4.508333 4.65 0.4399552
2019 Jakarta 10941.500 11464.5 2638.243 1973.667 2010.5 769.6292 4.175000 4.10 0.4653933
2019 Tangerang 9528.500 8606.5 3429.793 2226.250 2259.5 571.9309 4.133333 4.10 0.3700942
2020 Bekasi 9750.917 8931.5 2577.822 1923.500 1828.5 662.9838 4.475000 4.50 0.3078518
2020 Bogor 9352.667 9044.5 2489.937 1869.417 1703.5 606.5144 4.241667 4.15 0.4420167
2020 Depok 11331.917 11281.5 2399.261 1811.917 1884.0 724.1741 4.325000 4.30 0.4864061
2020 Jakarta 9538.500 8613.0 2810.034 1763.000 1644.5 689.9200 4.300000 4.40 0.4221159
2020 Tangerang 10711.500 11723.0 3628.203 1784.500 1728.0 556.8836 4.291667 4.30 0.4122187
2021 Bekasi 9936.167 9461.0 3136.866 2032.833 2164.0 692.4594 4.466667 4.60 0.4075053
2021 Bogor 11139.000 10946.5 3095.703 1909.333 1643.0 697.0666 4.208333 4.20 0.4776045
2021 Depok 10258.083 9798.5 3399.080 1909.667 1817.0 594.8057 4.325000 4.45 0.5065480
2021 Jakarta 10381.750 9631.0 3217.596 1983.750 1802.0 705.5904 4.150000 4.15 0.3450955
2021 Tangerang 10573.250 11364.0 3474.513 1978.500 1811.0 765.5159 4.458333 4.70 0.5501377
2022 Bekasi 11197.583 11528.0 3066.397 1882.833 1771.0 777.0196 4.225000 4.20 0.4433857
2022 Bogor 8632.083 8368.5 2315.636 1876.833 1854.5 649.4290 4.308333 4.30 0.4679905
2022 Depok 12088.583 12610.5 2773.525 1988.750 2051.0 708.1890 4.125000 3.90 0.5189587
2022 Jakarta 12410.083 12797.0 2434.900 1689.417 1701.0 490.1544 4.075000 3.95 0.3671141
2022 Tangerang 11414.000 11725.0 3349.692 1880.417 1712.5 745.2412 4.358333 4.30 0.4166061

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

Kota dengan pertumbuhan penjualan tertinggi:
Kota Growth
Jakarta 23905
Kota dengan pertumbuhan penjualan terendah:
Kota Growth
Bogor -13585

Berdasarkan grafik, Jakarta menunjukkan pertumbuhan penjualan tertinggi selama 5 tahun, terutama karena lonjakan tajam dari tahun 2021 ke 2022 yang kemungkinan dipengaruhi oleh peningkatan strategi promosi, distribusi yang lebih baik, atau pemulihan ekonomi di wilayah tersebut. Sebaliknya, Bogor mencatat pertumbuhan terendah, dengan tren yang relatif stagnan atau menurun selama periode tersebut, yang mungkin disebabkan oleh kurangnya efektivitas promosi, distribusi yang terbatas, atau persaingan yang lebih ketat. Hal ini menunjukkan bahwa fokus peningkatan harus dilakukan di Bogor dengan memperkuat strategi pemasaran, memahami kebutuhan konsumen lokal, dan memperluas jangkauan distribusi produk.

2.2 Pola Tren dan Musiman

2.2.1 Analisis pola tren penjualan tahunan: apakah ada pola peningkatan atau penurunan signifikan?

Total penjualan per tahun per kota
Tahun Kota Total_Penjualan
2018 Bekasi 118554
2018 Bogor 117170
2018 Depok 128575
2018 Jakarta 125016
2018 Tangerang 118328
2019 Bekasi 130621
2019 Bogor 120496
2019 Depok 131656
2019 Jakarta 131298
2019 Tangerang 114342
2020 Bekasi 117011
2020 Bogor 112232
2020 Depok 135983
2020 Jakarta 114462
2020 Tangerang 128538
2021 Bekasi 119234
2021 Bogor 133668
2021 Depok 123097
2021 Jakarta 124581
2021 Tangerang 126879
2022 Bekasi 134371
2022 Bogor 103585
2022 Depok 145063
2022 Jakarta 148921
2022 Tangerang 136968
Total Penjualan per Tahun
Tahun Total_Penjualan
2018 607643
2019 628413
2020 608226
2021 627459
2022 668908

Grafik :

  1. Jakarta:
  • Penjualan mengalami lonjakan signifikan pada tahun 2021 hingga 2022, menunjukkan pertumbuhan yang sangat pesat.

  • Pola ini mencerminkan keberhasilan strategi yang diterapkan pada tahun tersebut, kemungkinan berupa promosi besar atau pemulihan ekonomi yang lebih kuat di Jakarta.

  1. Depok:
  • Penjualan stabil tinggi dari 2018 hingga 2019, kemudian menurun pada 2020, dan kembali meningkat setelah 2021.

  • Depok menunjukkan kinerja yang konsisten tetapi mengalami sedikit fluktuasi.

  1. Bekasi:
  • Penjualan cenderung stabil dari 2018 hingga 2021, diikuti oleh peningkatan moderat pada 2022.

  • Pola ini menunjukkan stabilitas pasar di Bekasi tanpa perubahan besar.

  1. Tangerang:

Penjualan sedikit menurun dari 2018 ke 2020, lalu mengalami peningkatan moderat mulai 2021. Ini mencerminkan adanya potensi pemulihan di pasar Tangerang.

  1. Bogor:
  • Penurunan tajam pada tahun 2022 setelah stabil di tahun-tahun sebelumnya, menjadikannya satu-satunya kota dengan tren negatif.

  • Penurunan ini mengindikasikan perlunya perhatian serius, seperti evaluasi distribusi, promosi, atau produk yang sesuai dengan pasar Bogor.

Kesimpulan: Jakarta menunjukkan pola pertumbuhan yang signifikan, sementara Bogor memiliki pola penurunan tajam yang membutuhkan strategi pemulihan. Kota lain menunjukkan fluktuasi ringan atau stabilitas yang dapat ditingkatkan melalui inovasi dan promosi tambahan.

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

Total Penjualan per Bulan per Kota
Bulan Kota Total_Penjualan
Jan Bekasi 41443
Jan Bogor 40828
Jan Depok 49508
Jan Jakarta 53635
Jan Tangerang 46373
Feb Bekasi 50143
Total Penjualan per Kuartal per Kota
Kuartal Kota Total_Penjualan
Q1 Bekasi 146853
Q1 Bogor 129016
Q1 Depok 151780
Q1 Jakarta 160166
Q1 Tangerang 148786
Q2 Bekasi 154149
Q2 Bogor 142462
Q2 Depok 173164
Q2 Jakarta 165947
Q2 Tangerang 150072
Q3 Bekasi 151221
Q3 Bogor 148679
Q3 Depok 162798
Q3 Jakarta 141298
Q3 Tangerang 161345
Q4 Bekasi 167568
Q4 Bogor 166994
Q4 Depok 176632
Q4 Jakarta 176867
Q4 Tangerang 164852

Analisis musiman berdasarkan grafik penjualan per quartal:

  • Kuartal 1 (Q1): Penjualan di awal tahun cenderung lebih rendah atau stabil di sebagian besar kota, menunjukkan pola konsumsi yang lambat setelah periode akhir tahun, dengan Bogor mencatat penjualan paling rendah dibandingkan kota lainnya.

  • Kuartal 2 (Q2): Penjualan mulai meningkat di beberapa kota, terutama Depok yang mencapai puncaknya pada kuartal ini, kemungkinan dipengaruhi oleh momen tertentu seperti promosi pasca-Lebaran atau peningkatan aktivitas belanja pada periode ini.

  • Kuartal 3 (Q3): Sebagian besar kota, terutama Jakarta, mengalami penurunan penjualan, yang dapat disebabkan oleh jeda musiman, pengeluaran konsumen yang lebih rendah, atau faktor ekonomi lainnya yang memengaruhi daya beli.

  • Kuartal 4 (Q4): Semua kota menunjukkan peningkatan signifikan, dengan Jakarta dan Depok mengalami lonjakan yang paling tajam, menunjukkan potensi kuat dari periode ini, kemungkinan didorong oleh promosi akhir tahun, musim liburan, dan peningkatan konsumsi masyarakat.

Disini Kuartal 4 menjadi periode paling penting untuk memaksimalkan penjualan di semua kota, sementara kuartal lain memerlukan strategi khusus untuk menjaga stabilitas, terutama pada kuartal 3 yang cenderung mengalami penurunan.

2.3 Analisis Korelasi

2.3.1 Biaya Promosi ($) dan Penjualan (unit)

Korelasi antara Biaya Promosi dan Penjualan
Korelasi
-0.1083683

1. Korelasi Pearson

Rumus korelasi Pearson adalah sebagai berikut:

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

2. Data

Diberikan data:

Biaya Promosi (\(X\)) Penjualan (\(Y\))
1660 10392
930 11394
2015 9400
1882 4475
1362 7211

3. Langkah Perhitungan

  1. Hitung rata-rata \(\bar{X}\) dan \(\bar{Y}\):

\[ \bar{X} = \frac{1660 + 930 + 2015 + 1882 + 1362}{5} = 1569.8 \]

\[ \bar{Y} = \frac{10392 + 11394 + 9400 + 4475 + 7211}{5} = 8574.4 \]

  1. Hitung selisih tiap nilai terhadap rata-rata (\(X_i - \bar{X}\), \(Y_i - \bar{Y}\)):

\[ \Delta X = [90.2, -639.8, 445.2, 312.2, -207.8] \]

\[ \Delta Y = [1817.6, 2819.6, 825.6, -4099.4, -1363.4] \]

  1. Hitung perkalian selisih \((\Delta X)(\Delta Y)\):

\[ (\Delta X)(\Delta Y) = [163947.52, -1803980.08, 367557.12, -1279832.68, 283314.52] \]

\[ \sum (\Delta X)(\Delta Y) = -1872993.6 \]

  1. Hitung kuadrat selisih \((\Delta X)^2\) dan \((\Delta Y)^2\):

\[ (\Delta X)^2 = [8136.04, 409344.04, 198203.04, 97468.84, 43180.84] \]

\[ \sum (\Delta X)^2 = 1152332.8 \]

\[ (\Delta Y)^2 = [3303669.76, 7950144.16, 681615.36, 16805080.36, 1858859.56] \]

\[ \sum (\Delta Y)^2 = 30552369.2 \]

  1. Substitusi ke dalam rumus:

\[ r = \frac{-1872993.6}{\sqrt{1152332.8 \cdot 30552369.2}} \]

\[ r = \frac{-1872993.6}{5967568.93} = -0.472 \]

Hasil Korelasi:

Korelasi Pearson antara Biaya Promosi ($) dan Penjualan (unit): 𝑟=−0.472 Hubungan ini adalah negatif sedang, menunjukkan bahwa saat biaya promosi meningkat, penjualan cenderung menurun dalam dataset ini.

2.3.2 Diskon (%) dan Rating Pelanggan

Korelasi antara Diskon dan Rating Pelanggan
Korelasi
-0.0602249

Korelasi Pearson

Rumus korelasi Pearson adalah sebagai berikut:

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

Data

Diberikan data:

Diskon (\(X\)) Rating Pelanggan (\(Y\))
10 4.5
15 4.7
20 4.3
25 4.0
30 4.2

Langkah Perhitungan

  1. Hitung rata-rata \(\bar{X}\) dan \(\bar{Y}\):

\[ \bar{X} = \frac{10 + 15 + 20 + 25 + 30}{5} = \frac{100}{5} = 20 \]

\[ \bar{Y} = \frac{4.5 + 4.7 + 4.3 + 4.0 + 4.2}{5} = \frac{21.7}{5} = 4.34 \]

  1. Hitung selisih tiap nilai terhadap rata-rata (\(X_i - \bar{X}\), \(Y_i - \bar{Y}\)):

\[ \Delta X = [-10, -5, 0, 5, 10] \]

\[ \Delta Y = [0.16, 0.36, -0.04, -0.34, -0.14] \]

  1. Hitung perkalian selisih \((\Delta X)(\Delta Y)\):

\[ (\Delta X)(\Delta Y) = [-1.6, -1.8, 0, -1.7, -1.4] \]

\[ \sum (\Delta X)(\Delta Y) = -1.6 - 1.8 + 0 - 1.7 - 1.4 = -6.5 \]

  1. Hitung kuadrat selisih \((\Delta X)^2\) dan \((\Delta Y)^2\):

\[ (\Delta X)^2 = [100, 25, 0, 25, 100] \]

\[ \sum (\Delta X)^2 = 100 + 25 + 0 + 25 + 100 = 250 \]

\[ (\Delta Y)^2 = [0.0256, 0.1296, 0.0016, 0.1156, 0.0196] \]

\[ \sum (\Delta Y)^2 = 0.0256 + 0.1296 + 0.0016 + 0.1156 + 0.0196 = 0.292 \]

  1. Substitusi ke dalam rumus:

\[ r = \frac{-6.5}{\sqrt{250 \times 0.292}} = \frac{-6.5}{\sqrt{73}} = \frac{-6.5}{8.544} = -0.761 \]

Hasil

Korelasi Pearson antara Diskon (%) dan Rating Pelanggan:

\[ r = -0.761 \]

Hubungan ini cukup kuat dan negatif, menunjukkan bahwa saat diskon meningkat, rating pelanggan cenderung menurun.

2.4 Uji Hipotesis

Hipotesis

  • H0: Tidak ada hubungan antara Biaya Promosi ($) dan Penjualan (unit).
  • H1: Ada hubungan antara Biaya Promosi ($) dan Penjualan (unit).
Hasil Uji Hipotesis Pearson antara Biaya Promosi dan Penjualan
Statistik_t df p_value Korelasi
t -1.881809 298 0.0608364 -0.1083683
## Hasil: Gagal menolak H0. Tidak ada hubungan yang signifikan antara Biaya Promosi dan Penjualan.
Rumus Pearson Correlation

Korelasi Pearson \((r)\) dihitung dengan:

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

  • \(X_i\) dan \(Y_i\): Nilai individual dari Biaya Promosi dan Penjualan.
  • \(\bar X\) dan \(\bar Y\): Rata-rata masing-masing variabel.
Rumus Statistik t untuk korelasi

Untuk menguji apakah \(r\) signifikan, gunakan:

\[ t = \frac {r\sqrt n - 2}{\sqrt 1 - r^2} \]

  • \(n\) : Ukuran sampel
  • \(r\) : Koefisien Regresi

Langkah Perhitungan

  1. Hitung \(r\): Substitusi data biaya promosi \((X)\) dan penjualan \((Y)\) ke dalam rumus korelasi pearson

  2. Uji \(t\): Gunakan nilai \(r = -0.1083683\) dan \(n = 300\) (karena \(df = n - 2)\)

\[ t = \frac {-0.1083683 \cdot \sqrt 300 - 2}{\sqrt 1 - (--0.1083683)^2} \]

Hasilnya \(t = -1.881809\)

  1. Bandingkan \(p\)-value: Karena \(p = 0.0608364 \geq 0.05\) (tingkat signifikansi 5%), gagal menolak \(H_0\). Tidak ada hubungan signifikansi.

2.5 Analisis Data Kategorik

2.5.1 Distribusi Penjualan berdasarkan Jenis Outlet

Distribusi Penjualan berdasarkan Jenis Outlet
Jenis.Outlet Total_Penjualan
Modern 1553833
Tradisional 1586816

2.5.2 Analisis Perbedaan Rata-rata Penjualan berdasarkan Kategori Produk

1. Kesehatan:

  • Q1: 7361.25
  • Q3: 12489.50
  • Median: 9969
  • Min: 4475
  • Max: 16224

2. Makanan:

  • Q1: 7924.25
  • Q3: 13232
  • Median: 10551
  • Min: 5231
  • Max: 16598

3. Minuman:

  • Q1: 8082
  • Q3: 13384
  • Median: 10870
  • Min: 4742
  • Max: 16777

Boxplot menggambarkan data statistik lima angka:

  • Min: Nilai terkecil.

  • Q1: Kuartil pertama (25% data lebih kecil).

  • Median: Kuartil kedua (nilai tengah).

  • Q3: Kuartil ketiga (75% data lebih kecil).

  • Max: Nilai terbesar.

Langkah menghitung dan membuat boxplot 1. Rentang Antar-Kuartil (IQR):

\[ IQR = Q3 - Q1 \]

Contoh untuk kategori kesehatan:

\[ IQR = 12489.50 - 7361.25 = 5128.25 \]

  1. Batas Outlier:
  • Batas Bawah: \(Q1 - 1.5 \cdot IQR\)
  • Batas atas: \(Q3 + 1.5 \cdot IQR\)

Lima Nilai utama (Min, Q1, Median, Q3, Max) dalam boxplot.

  1. Uji Hipotesis Pearson: Tidak ada hubungan signifikan antara Biaya Promosi dan Penjualan, karena \(p\)-value lebih besar dari tingkat signifikansi 0.05.

  2. Distribusi Berdasarkan Outlet: Outlet Tradisional memiliki sedikit lebih banyak penjualan dibandingkan Outlet Modern.

  3. Rata-rata Penjualan Berdasarkan Produk: Data Boxplot menunjukkan variasi antara kategori produk. Minuman memiliki median penjualan tertinggi, diikuti oleh Makanan dan Kesehatan.

Hasil ANOVA untuk Kategori Produk
Df Sum Sq Mean Sq F value Pr(>F)
Kategori.Produk 2 27529762 13764881 1.493541 0.2262577
Residuals 297 2737232284 9216270 NA NA

2.6 Model Prediksi Pendapatan

2.6.1 Hitung Total Pendapatan per Kota

Total Pendapatan per Kota
Kota Total_Pendapatan
Bekasi 6197910
Bogor 5871510
Depok 6643740
Jakarta 6442780
Tangerang 6250550
  1. Intercept (Konstanta):
  • Nilai Estimate (108238.885405) adalah rata rata nilai variabel dependen (pendapatan) ketika semua variabel independen (Biaya Promosi, Diskon, dan Jenis Outlet) bernilai nol.

  • Nilai ini dihitung dari proses regresi linear dengan meminimalkan kesalahan kuadrat.

  1. Biaya Promosi ($)
  • Estimate: -5.470572 berarti setiap kenaikan 1 unit Biaya Promosi ($), rata-rata Pendapatan diprediksi menurun sebesar 5.47 unit, dengan asumsi variabel lainnya tetap.

  • t value: -1.9686456 menunjukkan kekuatan hubungan antara Biaya Promosi dan Pendapatan.

  • Pr(>|t|): 0.0499266 (kurang dari 0.05), sehingga secara statistik Biaya Promosi signifikan memengaruhi Pendapatan.

  1. Diskon (%):
  • Estimate: 467.188189 berarti setiap kenaikan 1% Diskon, rata-rata Pendapatan diprediksi meningkat sebesar 467.19 unit, dengan asumsi variabel lainnya tetap.

  • t value: 1.1876752 menunjukkan kekuatan hubungan. Nilai ini lebih rendah, mengindikasikan hubungan yang lemah.

  • Pr(>|t|): 0.2359136 (lebih dari 0.05), sehingga Diskon tidak signifikan secara statistik.

  1. Jenis Outlet(Dummy)
  • Estimate: 1878.498936 berarti ketika Jenis Outlet adalah “Modern”, Pendapatan diprediksi meningkat sebesar 1878.50 unit dibandingkan dengan outlet “Tradisional”, dengan asumsi variabel lainnya tetap.

  • t value: 0.5367256 menunjukkan hubungan yang lemah.

  • Pr(>|t|): 0.5918604 (lebih dari 0.05), sehingga tidak signifikan secara statistik.

Langkah Menghitung

  1. Model Regresi Linear:

\[ Y = β_0 + β_1 X_1 + β_2 X_2 + β_3 X_3 + ϵ \]

Dimana:

  • \(Y\): Pendapatan
  • \(X_1\): Biaya Promosi
  • \(X_2\): Diskon
  • \(X_3\): Dummy Jenis Outlet
  • \(β_0\): Intercept
  • \(β_1,β_2,β_3\): Koefisien Regresi
  • \(ϵ\): error
  1. Estimasi Koefisien \((β)\): Koefisien dihitung menggunakan metode Ordinary Least Squares (OLS), yaitu meminimalkan jumlah kuadrat galat \((\sum ϵ^2)\).

  2. t value: Dihitung dengan rumus:

\[ t=\frac{Estimate}{Std.Error} \]

Nilai ini mengukur kekuatan hubungan antara variabel independen dan dependen.

  1. Pr(>|t|): Nilai p-value dihitung dari distribusi t. Nilai ini menunjukkan apakah variabel independen signifikan secara statistik dalam memengaruhi variabel dependen.

2.6.2 Analisis Faktor Signifikan menggunakan Regresi Linear

Hasil Analisis Regresi Linear
Estimate Std. Error t value Pr(>|t|)
(Intercept) 108238.885405 7387.205601 14.6522097 0.0000000
Biaya.Promosi…. -5.470572 2.778851 -1.9686456 0.0499266
Diskon…. 467.188189 393.363601 1.1876752 0.2359136
Jenis.Outlet.Dummy 1878.498936 3499.924484 0.5367256 0.5918604

Misalnya, Jika anda memiliki data:

  • Pendapatan aktual di Depok = $,643,740
  • Pendapatan prediksi untuk Depok (dari model regresi) = $6,600,000

Maka:

  • Residual untuk Depok = 6,643,740 usd - 6,600,000 usd = 43,740 usd

  • model under-predict (memprediksi lebih rendah) sebesar $43,740.

Kesimpulan dari perbandingan pendapatan aktual dan prediksi:

  • Jika error kecil dan \(R^2\) tinggi, model dianggap baik dalam menjelaskan pendapatan.

  • Jika error besar atau ada pola pada residual (misalnya, sistematis under-predict atau over-predict), maka model perlu diperbaiki, misalnya dengan menambah variabel atau mencoba transformasi data.

2.7 Interpretasi Bisnis

2.7.1 Strategi Pemasaran per Kota

Rekomendasi Strategi:

  1. Jakarta (Penjualan Tertinggi): Fokus pada mempertahankan loyalitas pelanggan dengan memberikan program loyalitas seperti poin reward atau diskon khusus untuk pembelian berulang. Tingkatkan promosi digital karena Jakarta memiliki potensi besar dalam e-commerce.

  2. Depok dan Tangerang (Pertumbuhan Positif): Maksimalkan potensi pasar dengan promosi berbasis komunitas, seperti kerja sama dengan pusat perbelanjaan lokal atau event sponsorship. Pastikan distribusi produk tetap lancar untuk memenuhi permintaan yang terus meningkat.

  3. Bekasi : Lakukan survei konsumen untuk memahami kebutuhan pasar dan tingkatkan kampanye pemasaran lokal, seperti potongan harga atau bundling produk untuk menarik perhatian pelanggan baru.

  4. Bogor (Penurunan Drastis): Fokus pada rebranding atau repositioning produk untuk meningkatkan minat konsumen, seperti menawarkan diskon besar-besaran, menjalin kerja sama dengan toko-toko lokal, atau menargetkan ulang segmen konsumen dengan promosi lebih kreatif.


2.7.2 Dampak Pengoptimalan Strategi

1. Diskon

Diskon dapat meningkatkan volume penjualan dalam jangka pendek, terutama di kota dengan penjualan rendah seperti Bogor. Namun, penting untuk menjaga margin keuntungan tetap positif dengan membatasi durasi atau menargetkan diskon hanya pada produk tertentu.

2. Alokasi Anggaran Promosi

Fokuskan anggaran pada wilayah dengan potensi pertumbuhan tinggi seperti Depok dan Tangerang. Kampanye digital di Jakarta juga penting untuk mempertahankan posisinya sebagai pasar terbesar. Hindari alokasi berlebihan pada wilayah yang sulit tumbuh tanpa perencanaan ulang, seperti Bogor.

3. Distribusi ke Jenis Outlet

Penjualan melalui outlet modern seperti minimarket atau supermarket cenderung lebih efektif di wilayah perkotaan seperti Jakarta dan Depok. Untuk wilayah pinggiran seperti Bogor dan Tangerang, tingkatkan kerja sama dengan toko tradisional atau warung untuk menjangkau konsumen lokal yang lebih luas.

Referensi

  1. YouTube perbedaan Statistika Deskriptif dan Statistika Inferensial

https://youtu.be/Cr0jG_MazAw?si=rkHcWlqrILuxBZK4

  1. Youtube Uji Hipotesis

https://youtu.be/mRK2n4Ok3u4?si=DRcGWKjY-CN2V2ul

  1. Bookdown Pak Bakti Siregar S.Si., M.Sc. yang di berikan melalui Google Classroom.
LS0tDQp0aXRsZTogIktlbG9tcG9rIDUiDQpzdWJ0aXRsZTogIlVqaWFuIFRlbmdhaCBTZW1lc3RlciBTdGF0aXN0aWthIg0KYXV0aG9yOiANCiAgLSAiSm9hbnMgSGVuZ2t5IFNlcnZhdGl1cyBTaW1hbnVsbGFuZyBOSU1fNTIyNDAwMTciDQogIC0gIlphaW4gSXFiYWwgU2FwdXRyYSBOSU1fNTIyNDAwMjQiDQogIC0gIk5hYmlsYSBBc3dhIEhpZGF5YXRpIE5JTV81MjI0MDAxMiINCmRhdGU6ICAiU2FidHUsIDE0LzAxLzIwMjUiDQpvdXRwdXQ6DQogIHJtZGZvcm1hdHM6OnJlYWR0aGVkb3duOiAgICMgaHR0cHM6Ly9naXRodWIuY29tL2p1YmEvcm1kZm9ybWF0cw0KICAgIHNlbGZfY29udGFpbmVkOiB0cnVlDQogICAgdGh1bWJuYWlsczogdHJ1ZQ0KICAgIGxpZ2h0Ym94OiB0cnVlDQogICAgZ2FsbGVyeTogdHJ1ZQ0KICAgIG51bWJlcl9zZWN0aW9uczogZmFsc2UNCiAgICBsaWJfZGlyOiBsaWJzDQogICAgM2RmX3ByaW50OiAicGFnZWQiDQogICAgY29kZV9mb2xkaW5nOiAic2hvdyINCiAgICBjb2RlX2Rvd25sb2FkOiB5ZXMNCiAgICBjc3M6ICJzdHlsZS5jc3MiDQotLS0NCg0KPGltZyBzcmM9IkdhbWJhci9Gb3RvX0tlbG9tcG9rLmpwZyIgc3R5bGU9ImRpc3BsYXk6IGJsb2NrOyB3aWR0aDo1MDBweDsgbWFyZ2luOiBhdXRvOyI+DQoNCiMgU09BTCAxDQoNCiMjIDEuMSBEZWZpbmlzaSBkYW4gS29uc2VwIFV0YW1hDQoNCi0gVHVsaXNrYW4gZGVmaW5pc2kgKipzdGF0aXN0aWthKiouIEplbGFza2FuIHBlcmJlZGFhbiBhbnRhcmEgKipzdGF0aXN0aWthIGRlc2tyaXB0aWYqKiBkYW4gKipzdGF0aXN0aWthIGluZmVyZW5zaWFsKiouDQotIEFwYSBzYWphIGplbmlzIGRhdGEgeWFuZyBkaWd1bmFrYW4gZGFsYW0gc3RhdGlzdGlrYT8gSmVsYXNrYW4gcGVyYmVkYWFuIGRhdGEgKipudW1lcmlrKiogZGFuICoqa2F0ZWdvcmlrKiogZGlzZXJ0YWkgY29udG9obnlhLg0KDQpKYXdhYmFuIDoNCg0KU3RhdGlzdGlrYSBhZGFsYWggaWxtdSB5YW5nIG1lbXBlbGFqYXJpIHRlbnRhbmcgZGF0YS4gU3RhdGlzdGlrYSBzZWNhcmEgdW11bSBhZGFsYWggaWxtdSB5YW5nIG1lbXBlbGFqYXJpIGJhZ2FpbWFuYSBtZXJlbmNhbmFrYW4sIG1lbmd1bXB1bGthbiwgbWVuZ2FuYWxpc2lzLCBtZW5naW50ZXJwcmV0YXNpLCBkYW4gbWVtcHJlc2VudGFzaWthbiBzZWJ1YWggZGF0YS4gDQoNCi0gU3RhdGlzdGlrYSBEZXNrcmlwdGlmIDogU3RhdGlzdGlrYSBkZXNrcnRpcHRpZiBhZGFsYWggY2FyYSB1bnR1ayBtZW5nYXR1ciBkYW4gbWVyZXByZW5zZXRhc2lrYW4sIGRhbiBtZW5kZXNrcmlwc2lrYW4ga3VtcHVsYW4gbWVuZ2d1bmFrYW4gdGFiZWwsIGdyYWZpayBkYW4gcGFyYW1ldGVyIG51bWVyaWsgbGFpbm55YS4NCg0KSXN0aWxhaCBzdGF0aXN0aWthIGRlc2t0aXB0aWYgOg0KDQoxLiBNZWFuIChOaWxhaSBSYXRhIC0gcmF0YSkNCg0KMi4gTWVkaWFuIChOaWxhaSBUZW5nYWgpDQoNCjMuIE1vZHVzIChOaWxhaSB5YW5nIHNlcmluZyBtdW5jdWwpDQoNCjQuIFN0YW5kYXIgRGV2aWFzaSAoUmF0YSAtIHJhdGEga3VhZHJhdCBkYXJpIHNlbGlzaWggbmlsYWkgTWVhbikNCg0KNS4gS29yZWxhc2kgKGtlZXJhdGFuIGh1YnVuZ2FuIGRhcmkgdmFyaWFiZWwgbnVtZXJpaykNCg0KNi4gVmFyaWFuY2UgKE5pbGFpIHZhcmlhc2kgc3VhdHUgZGF0YSkNCg0KU3RhdGlzdGlrYSBkZXNrcmlwdGlmIHBlbnRpbmcgdW50dWsgbWVsaWhhdCBwYXR0ZXJuIGRhdGEgeWFuZyBwZW5nZ3VuYWFubnlhIGRpYXBsaWthc2lrYW4gdW50dWsgc2FtcGVsIGRhdGEgeWFuZyBzZWRhbmcgZGlwZWxhamFyaSwgdGlkYWsgYmlzYSBkaWd1bmFrYW4gdW50dWsgbWVuYWdtYmlsIGtlc2ltcHVsYW4gdGVudGFuZyBzdWF0dSBwb3B1bGFzaS4gDQoNCi0gU3RhdGlzdGlrYSBJbmZlcmVuc2lhbA0KU3RhdGlzdGlrYSBJbmZlcmVuc2lhbCBkaWd1bmFrYW4gdW50dWsgbWVuYXJpayBrZXNpbXB1bGFuIHRlcmhhZGFwIGthcmFrdGVyaXN0aWsgc2VidWFoIHBvcHVsYXNpIGRlbmdhbiBtZW1hbmZhYXRrYW4gaW5mb3JtYXNpIHlhbmcgZGlwZXJvbGVoIGRhcmkgc2FtcGVsIHN0YXRpc3Rpa2EgZGVza3JpcHRpZi4gS2VzaW1wdWxhbiB0ZXJzZWJ1dCB0ZXJnYW50dW5nIHBhZGEgZGF0YSB5YW5nIGJlcnZhcmlhc2kgc2VwZXJ0aSA6DQoNCjEuIExpbmVhciBSZWdyZXNzaW9uIEFuYWx5c2lzIDogdW50dWsgbWVuZ2V0YWh1aSBiZXNhcm55YSBodWJ1bmdhbiBkZXBlbmRlbnQgZGFuIGluZGVwZW5kZW50Lg0KMi4gTG9naXN0aWMgUmVncmVzc2lvbiBBbmFseXNpcyA6IHVudHVrIG1lbmdldGFodWkga29udGVrcyBwZWx1YW5nDQozLiBIeXBvdGhlc2lzIFRlc3RpbmcgOiB1bnR1ayBtZW5hcmlrIGtlc2ltcHVsYW4gZGFyaSBkdWEgZHVnYWFuIHlhbmcgYmVydG9sYWsgYmVsYWthbmcuDQo0LiBDb25maWRlbmNlIEludGVyZmFsIDogRXN0aW1hc2kgbmlsYWkgZGFyaSBwYXJhbWV0ZXIgcG9wdWxhc2kuDQoNCkNvbnRvaCA6IA0KDQpLYW11IHNlZGFuZyBiZXJtYWluIGRpIHBhbWVyYW4gdGVudGFuZyBBSSBkYW4gbWVtdXR1c2thbiB1bnR1ayBzdXJ2ZXkgNTAgb3JhbmcuIFN1cnZleSB0ZXJzZWJ1dCB0dWp1YW5ueWEgdW50dWsgbWVuZ2V0YWh1aSBhcGFrYWggbWVyZWthIHN1a2EgbWVuZ2d1bmFrYW4gQUkgYXRhdSB0aWRhaywgbWlzYWwgMjUgb3JhbmcgYmlsYW5nICJZYSwgc2F5YSBzdWthIG1lbmdndW5ha2FuIEFJIHVudHVrIGtlcGVybHVhbiBpbmkgZGFuIGxhaW4gc2ViYWdhaW55YSIgZGFuIDI1IG9yYW5nIGxhZ2kgYmlsYW5nICJ0aWRhaywga2FyZW5hIGRhcGF0IG1lbmdnYW5nZ3Uga2VjZXJkYXNhbiBraXRhIHNlYmFnYWkgbWFudXNpYSINCg0KIyMgMS4yIFVrdXJhbiBQZW11c2F0YW4gZGFuIFBlbnllYmFyYW4NCg0KSmVsYXNrYW4gZGVuZ2FuIHNpbmdrYXQ6DQoNCi0gKipNZWFuIChSYXRhLXJhdGEpOioqIEthcGFuIHBlbmdndW5hYW4gbWVhbiBtZW5qYWRpIGt1cmFuZyB0ZXBhdD8NCi0gKipNZWRpYW46KiogTWVuZ2FwYSBtZWRpYW4gc2VyaW5nIGRpZ3VuYWthbiB1bnR1ayBkYXRhIGRlbmdhbiBvdXRsaWVyPw0KLSAqKk1vZHVzOioqIEthcGFuIHVrdXJhbiBpbmkgbGViaWggcmVsZXZhbiBkYXJpcGFkYSBtZWFuIGF0YXUgbWVkaWFuPw0KLSAqKlN0YW5kYXIgRGV2aWFzaToqKiBBcGEgYXJ0aSBkYXJpIG5pbGFpIHN0YW5kYXIgZGV2aWFzaSBrZWNpbCBhdGF1IGJlc2FyIGRhbGFtIHNlYnVhaCBkYXRhc2V0Pw0KDQpKYXdhYmFuIDoNCg0KMS4gTWVhbiBhdGF1IHJhdGEtcmF0YSBrdXJhbmcgdGVwYXQgZGlndW5ha2FuIGRhbGFtIHVrdXJhbiBwZW11c2F0YW4gZGF0YSBrZXRpa2EgZGF0YSBtZW1pbGlraSBkaXN0cmlidXNpIHlhbmcgYXNpbWV0cmlzLCBtZW1pbGlraSBvdXRsaWVyLCBhdGF1IGRhdGEga2F0ZWdvcmlzLg0KDQoyLiBNZWRpYW4gc2VyaW5nIGRpZ3VuYWthbiB1bnR1ayBkYXRhIGRlbmdhbiBvdXRsaWVyIGthcmVuYSBtZWRpYW4gdGlkYWsgdGVycGVuZ2FydWggb2xlaCBuaWxhaS1uaWxhaSBla3N0cmVtIGRhbGFtIGRhdGEuIE1lZGlhbiBtZXJ1cGFrYW4gdWt1cmFuIGtlY2VuZGVydW5nYW4gc2VudHJhbCB5YW5nIGxlYmloIGRpc3VrYWkgdW50dWsgZGF0YSB5YW5nIG1pcmluZyBhdGF1IG1lbWlsaWtpIG91dGxpZXIuDQoNCjMuIE1vZHVzIGxlYmloIHJlbGV2YW4gZGFyaXBhZGEgbWVhbiBhdGF1IG1lZGlhbiBrZXRpa2EgZGF0YSB5YW5nIGRpZ3VuYWthbiBhZGFsYWggZGF0YSBrdWFsaXRhdGlmIGF0YXUgZGF0YSB5YW5nIG1lbWlsaWtpIGJhbnlhayBuaWxhaSB5YW5nwqBzZXJpbmfCoG11bmN1bC4NCg0KNC4gTmlsYWkgc3RhbmRhciBkZXZpYXNpIChTRCkgeWFuZyBrZWNpbCBiZXJhcnRpIGRhdGEgY2VuZGVydW5nIGJlcmt1bXB1bCBkaSBzZWtpdGFyIG5pbGFpIHJhdGEtcmF0YSwgc2VkYW5na2FuIG5pbGFpIFNEIHlhbmcgYmVzYXIgYmVyYXJ0aSBkYXRhIGNlbmRlcnVuZyB0ZXJzZWJhcsKgbGViaWjCoGx1YXMuDQoNCiMjIDEuMyBWaXN1YWxpc2FzaSBEYXRhDQoNClNlYnV0a2FuIHRpZ2EgamVuaXMgZ3JhZmlrIGF0YXUgZGlhZ3JhbSB5YW5nIGJpYXNhIGRpZ3VuYWthbiBkYWxhbSBzdGF0aXN0aWthIGRhc2FyIChtaXNhbG55YSBoaXN0b2dyYW0sIGJveHBsb3QsIGF0YXUgZGlhZ3JhbSBiYXRhbmcpLiBKZWxhc2thbiB0dWp1YW4gbWFzaW5nLW1hc2luZy4NCg0KSmF3YWJhbiA6DQoNCiMjIyAxLjMuMSBIaXN0b2dyYW0NCg0KVHVqdWFubnlhIG1lbmFtcGlsa2FuIGRpc3RyaWJ1c2kgZnJla3VlbnNpIGRhdGEgbnVtZXJpay4gSGlzdG9ncmFtIGp1Z2EgZGlndW5ha2FuIHVudHVrIG1lbWFoYW1pIGJhZ2FpbWFuYSBkYXRhIHRlcnNlYmFyLCBtZW5naWRlbnRpZmlrYXNpIHBvbGEgZGlzdHJpYnVzaSBtaXNhbG55YSBub3JtYWwsIG1pcmluZyBrZSBrYW5hbi9raXJpLCBzZXJ0YSBtZW5kZXRla3NpIGtlYmVyYWRhYW4gb3V0bGllci4gRGF0YSBkaWtlbG9tcG9ra2FuIGRhbGFtIGludGVydmFsIGJpbiwgZGFuIHRpbmdnaSBiYXRhbmcgbWVudW5qdWtrYW4ganVtbGFoIGRhdGEgZGFsYW0gc2V0aWFwIGludGVydmFsLg0KDQpgYGB7ciwgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCiMgTG9hZCBsaWJyYXJpZXMNCmxpYnJhcnkoZHBseXIpDQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KHBsb3RseSkNCmxpYnJhcnkoa25pdHIpDQoNCiMgTG9hZCBkYXRhDQpkYXRhIDwtIHJlYWQuY3N2KCJQZW5qdWFsYW5fQUJDX0pBQk9ERVRBQkVLLmNzdiIpDQoNCiMgVGFtYmFoa2FuIGtvbG9tIHBlbmRhcGF0YW4gKGFzdW1zaSBoYXJnYSBwZXIgdW5pdCAkMTApIGRhbiBoaXR1bmcgdG90YWwgcGVuZGFwYXRhbiBwZXIga290YQ0KdG90YWxfcGVuZGFwYXRhbiA8LSBkYXRhICU+JQ0KICBtdXRhdGUoSGFyZ2EucGVyLlVuaXQgPSAxMCwgUGVuZGFwYXRhbiA9IFBlbmp1YWxhbi4udW5pdC4gKiBIYXJnYS5wZXIuVW5pdCkgJT4lDQogIGdyb3VwX2J5KEtvdGEpICU+JQ0KICBzdW1tYXJpc2UoVG90YWxfUGVuZGFwYXRhbiA9IHN1bShQZW5kYXBhdGFuKSkNCg0KIyBCdWF0IGdyYWZpayBtZW5nZ3VuYWthbiBnZ3Bsb3QNCmdnIDwtIGdncGxvdCh0b3RhbF9wZW5kYXBhdGFuLCBhZXMoDQogIHggPSByZW9yZGVyKEtvdGEsIFRvdGFsX1BlbmRhcGF0YW4pLCANCiAgeSA9IFRvdGFsX1BlbmRhcGF0YW4sIA0KICB0ZXh0ID0gcGFzdGUoIktvdGE6IiwgS290YSwgIjxicj5QZW5kYXBhdGFuOiBScC4iLCBzY2FsZXM6OmNvbW1hKFRvdGFsX1BlbmRhcGF0YW4pKQ0KKSkgKw0KICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgZmlsbCA9ICJzdGVlbGJsdWUiKSArDQogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBzY2FsZXM6OmNvbW1hKSArICAjIEZvcm1hdCBhbmdrYSBkaSBzdW1idSB5DQogIGxhYnMoDQogICAgdGl0bGUgPSAiVG90YWwgUGVuZGFwYXRhbiBwZXIgS290YSIsDQogICAgeCA9ICJLb3RhIiwNCiAgICB5ID0gIlRvdGFsIFBlbmRhcGF0YW4iDQogICkgKw0KICB0aGVtZV9taW5pbWFsKCkNCg0KIyBVYmFoIGdncGxvdCBtZW5qYWRpIHBsb3RseSB1bnR1ayBpbnRlcmFrdGl2aXRhcw0KZ2dwbG90bHkoZ2csIHRvb2x0aXAgPSAidGV4dCIpDQpgYGANCg0KIyMjIDEuMy4yIEJveHBsb3QgDQoNClR1anVhbiBCb3hwbG90IHVudHVrIG1lcmluZ2thcyBkYXRhIG51bWVyaWsgZGVuZ2FuIG1lbnVuanVra2FuIHBlcnNlYmFyYW4sIG1lZGlhbiwgc2VydGEgcG90ZW5zaSBvdXRsaWVyLiBCb3hwbG90IG1lbWJhbnR1IG1lbWJhbmRpbmdrYW4gZGlzdHJpYnVzaSBkYXRhIGFudGFyIGtlbG9tcG9rLCBtZW5hbXBpbGthbiBrdWFydGlsIHlhaXR1IFExLCBtZWRpYW4sIFEzLCBzZXJ0YSBtZW1wZXJsaWhhdGthbiBhcGFrYWggYWRhIGRhdGEgeWFuZyBqYXVoIGRhcmkgbmlsYWkgbm9ybWFsIGF0YXUgb3V0bGllci4NCg0KYGBge3IsIGVjaG89RkFMU0UsIGluY2x1ZGU9VFJVRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCiMgQU5PVkEgdW50dWsgbWVuZ3VqaSBwZXJiZWRhYW4gcmF0YS1yYXRhIHBlbmp1YWxhbiBiZXJkYXNhcmthbiBLYXRlZ29yaSBQcm9kdWsNCmFub3ZhX3Jlc3VsdCA8LSBhb3YoUGVuanVhbGFuLi51bml0LiB+IEthdGVnb3JpLlByb2R1aywgZGF0YSA9IGRhdGEpDQoNCiMgSGFzaWwgQU5PVkENCmFub3ZhX3N1bW1hcnkgPC0gc3VtbWFyeShhbm92YV9yZXN1bHQpDQoNCiMgVGFtcGlsa2FuIGhhc2lsIEFOT1ZBDQprYWJsZShhcy5kYXRhLmZyYW1lKGFub3ZhX3N1bW1hcnlbWzFdXSksIGNhcHRpb24gPSAiSGFzaWwgQU5PVkEgdW50dWsgS2F0ZWdvcmkgUHJvZHVrIikNCg0KIyBWaXN1YWxpc2FzaSBib3hwbG90IGludGVyYWt0aWYNCnBsb3RfcHJvZHVjdF9jYXRlZ29yeSA8LSBnZ3Bsb3QoZGF0YSwgYWVzKHggPSBLYXRlZ29yaS5Qcm9kdWssIHkgPSBQZW5qdWFsYW4uLnVuaXQuLCBmaWxsID0gS2F0ZWdvcmkuUHJvZHVrKSkgKw0KICBnZW9tX2JveHBsb3QoKSArDQogIGxhYnMoDQogICAgdGl0bGUgPSAiUGVyYmVkYWFuIFBlbmp1YWxhbiBiZXJkYXNhcmthbiBLYXRlZ29yaSBQcm9kdWsiLA0KICAgIHggPSAiS2F0ZWdvcmkgUHJvZHVrIiwNCiAgICB5ID0gIlBlbmp1YWxhbiAodW5pdCkiDQogICkgKw0KICB0aGVtZV9taW5pbWFsKCkNCg0KcGxvdF9wcm9kdWN0X2NhdGVnb3J5X2ludGVyYWN0aXZlIDwtIGdncGxvdGx5KHBsb3RfcHJvZHVjdF9jYXRlZ29yeSkNCg0KIyBUYW1waWxrYW4gaGFzaWwgdmlzdWFsaXNhc2kNCnBsb3RfcHJvZHVjdF9jYXRlZ29yeV9pbnRlcmFjdGl2ZQ0KYGBgDQoNCiMjIyAxLjMuMyBEaWFncmFtIEJhdGFuZw0KDQpUdWp1YW4gRGlhZ3JhbSBiYXRhbmcgdW50dWsgbWVuYW1waWxrYW4ga2F0ZWdvcmkgYXRhdSBrZWxvbXBvayBkYXRhIHNlY2FyYSB2aXN1YWwsIGRpIG1hbmEgcGFuamFuZyBiYXRhbmcgbWVuY2VybWlua2FuIG5pbGFpIGZyZWt1ZW5zaSBhdGF1IGp1bWxhaCBkYWxhbSBzZXRpYXAga2F0ZWdvcmkuIENvY29rIHVudHVrIGRhdGEgZGlza3JpdCBhdGF1IG5vbWluYWwuDQoNCmBgYHtyLCBlY2hvPUZBTFNFLCBpbmNsdWRlPVRSVUUsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQojIEhpdHVuZyB0b3RhbCBwZW5kYXBhdGFuIHBlciBrb3RhDQpkYXRhIDwtIGRhdGEgJT4lDQogIG11dGF0ZShIYXJnYS5wZXIuVW5pdCA9IDEwLCAgIyBBc3Vtc2kgaGFyZ2EgcGVyIHVuaXQNCiAgICAgICAgIFBlbmRhcGF0YW4gPSBQZW5qdWFsYW4uLnVuaXQuICogSGFyZ2EucGVyLlVuaXQpDQoNCnRvdGFsX3JldmVudWUgPC0gZGF0YSAlPiUNCiAgZ3JvdXBfYnkoS290YSkgJT4lDQogIHN1bW1hcmlzZShUb3RhbF9QZW5kYXBhdGFuID0gc3VtKFBlbmRhcGF0YW4pKQ0KDQojIFZpc3VhbGlzYXNpIGludGVyYWt0aWYNCnBsb3RfdG90YWxfcmV2ZW51ZSA8LSBnZ3Bsb3QodG90YWxfcmV2ZW51ZSwgYWVzKHggPSByZW9yZGVyKEtvdGEsIFRvdGFsX1BlbmRhcGF0YW4pLCB5ID0gVG90YWxfUGVuZGFwYXRhbiwgZmlsbCA9IEtvdGEpKSArDQogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiKSArDQogIGNvb3JkX2ZsaXAoKSArDQogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBzY2FsZXM6OmNvbW1hKSArICAjIEZvcm1hdCBhbmdrYSBkaSBzdW1idSB5DQogIGxhYnMoDQogICAgdGl0bGUgPSAiVG90YWwgUGVuZGFwYXRhbiBwZXIgS290YSIsDQogICAgeCA9ICJLb3RhIiwNCiAgICB5ID0gIlRvdGFsIFBlbmRhcGF0YW4iDQogICkgKw0KICB0aGVtZV9taW5pbWFsKCkNCg0KcGxvdF90b3RhbF9yZXZlbnVlX2ludGVyYWN0aXZlIDwtIGdncGxvdGx5KHBsb3RfdG90YWxfcmV2ZW51ZSkNCg0KIyBUYW1waWxrYW4gaGFzaWwgdmlzdWFsaXNhc2kNCnBsb3RfdG90YWxfcmV2ZW51ZV9pbnRlcmFjdGl2ZQ0KDQojIFRhbXBpbGthbiB0YWJlbCBoYXNpbA0Ka2FibGUodG90YWxfcmV2ZW51ZSwgY2FwdGlvbiA9ICJUb3RhbCBQZW5kYXBhdGFuIHBlciBLb3RhIikNCmBgYA0KDQojIyAxLjQuIEFuYWxpc2lzIEtvcmVsYXNpDQoNCkFwYSB5YW5nIGRpbWFrc3VkIGRlbmdhbiAqKmtvcmVsYXNpKiogZGFsYW0gc3RhdGlzdGlrYT8gSmVsYXNrYW4gcGVyYmVkYWFuIGFudGFyYSBrb3JlbGFzaSBwb3NpdGlmLCBuZWdhdGlmLCBkYW4gbm9sLCBzZXJ0YSBiZXJpa2FuIGNvbnRvaG55YS4NCg0KSmF3YWJhbiA6DQoNCktvcmVsYXNpIGRhbGFtIHN0YXRpc3Rpa2EgYWRhbGFoIHRla25payBhbmFsaXNpcyBkYXRhIHlhbmcgZGlndW5ha2FuIHVudHVrIG1lbmdldGFodWkgaHVidW5nYW4gYW50YXJhIGR1YSB2YXJpYWJlbC4gS29yZWxhc2kgZGFwYXQgYmVyc2lmYXQgcG9zaXRpZiwgbmVnYXRpZiwgYXRhdSBub2wuDQoNCkJlcmlrdXQgcGVyYmVkYWFuIGRhcmkga29yZWxhc2kgcG9zaXRpZiwgbmVnYXRpZiwgZGFuIG5vbCwgc2VydGEgYmVyaWthbiBjb250b2hueWE6DQoNCiMjIyAxLjQuMSBLb3JlbGFzaSBwb3NpdGlmIA0KS29yZWxhc2kgcG9zaXRpZiBhZGFsYWggaHVidW5nYW4gYW50YXJhIGR1YSB2YXJpYWJlbCBrZXRpa2Ega2VkdWEgdmFyaWFiZWwgaXR1IGJlcmdlcmFrIGRhbGFtIGFyYWggeWFuZyBzYW1hLiBPbGVoIGthcmVuYW55YSwgc2F0dSB2YXJpYWJlbCBtZW5pbmdrYXQgamlrYSB2YXJpYWJlbCBsYWlubnlhIG1lbmluZ2thdCwgYXRhdSBzYXR1IHZhcmlhYmVsIG1lbnVydW4gc2VtZW50YXJhIHlhbmcgbGFpbm55YSBqdWdhIG1lbnVydW4uDQoNCi0gS2VkdWEgdmFyaWFiZWwgYmVydWJhaCBrZSBhcmFoIHlhbmcgc2FtYQ0KLSBKaWthIHNhbGFoIHNhdHUgdmFyaWFiZWwgbWVuaW5na2F0LCBtYWthIHZhcmlhYmVsIGxhaW5ueWEganVnYSBtZW5pbmdrYXQNCg0KQ29udG9obnlhLCBzZW1ha2luIGJhbnlhayBtYWthbiwgbWFrYSBiZXJhdCBiYWRhbiBha2FuIHNlbWFraW4gbWVuaW5na2F0DQoNCiMjIyAxLjQuMiBLb3JlbGFzaSBuZWdhdGlmDQpLb3JlbGFzaSBuZWdhdGlmIG1lcnVwYWthbiBodWJ1bmdhbiBhbnRhcmEgZHVhIHZhcmlhYmVsLCBrZXRpa2EgcGVuaW5na2F0YW4gc2F0dSB2YXJpYWJlbCBkaWthaXRrYW4gZGVuZ2FuIHBlbnVydW5hbiB2YXJpYWJlbCBsYWlubnlhLg0KDQotIEtlZHVhIHZhcmlhYmVsIGJlcnViYWgga2UgYXJhaCB5YW5nIGJlcmxhd2FuYW4gDQotIEppa2Egc2FsYWggc2F0dSB2YXJpYWJlbCBtZW5pbmdrYXQsIG1ha2EgdmFyaWFiZWwgbGFpbm55YSBtZW51cnVuIA0KDQpDb250b2hueWEsIHNlbWFraW4gdGluZ2dpIGtpdGEgbWVuZGFraSBndW51bmcsIG1ha2Egc3VodSBkaXNhbmEgbWFraW4gbWVudXJ1bg0KDQoxLjQuMyBLb3JlbGFzaSBub2wNCktvcmVsYXNpIG5vbCBtZW51bmp1a2thbiBiYWh3YSBwb2xhIHBlcnViYWhhbiBhbnRhcmEga2VkdWEgdmFyaWFiZWwgYmVyc2lmYXQgYWNhayBhdGF1IHRpZGFrIHRlcmh1YnVuZy4gQXJ0aW55YSwgcGVuaW5na2F0YW4gYXRhdSBwZW51cnVuYW4gc2FsYWggc2F0dSB2YXJpYWJlbCB0aWRhayBiZXJrYWl0YW4gZGVuZ2FuIHBlbmluZ2thdGFuIGF0YXUgcGVudXJ1bmFuIHZhcmlhYmVsIGxhaW5ueWEuIA0KDQpDb250b2hueWEsIEJhbnlha255YSB0ZWggeWFuZyBkaWtvbnN1bXNpIGRlbmdhbiB0aW5na2F0IGtlY2VyZGFzYW4gc2VzZW9yYW5nLiBqYWRpIG1hdSBzZXNlb3JhbmcgaXR1IG1pbnVtIHNlZGlraXQgYXRhdSBiYW55YWsgdGVoIGl0dSB0aWRhayBtZW1wZW5nYXJ1aGkga2VjZXJkYXNhbiBrYXJlbmEgbWludW0gdGVoIHRlcnNlYnV0Lg0KDQpLb3JlbGFzaSBkaWdhbWJhcmthbiBkYWxhbSBkaWFncmFtIHNlYmFyYW4uIFNlbWFraW4gZGVrYXQga29yZWxhc2lueWEgZGVuZ2FuIDAsIHNlbWFraW4gbGVtYWgga29yZWxhc2lueWEuIFNlbWFraW4gZGVrYXQga29yZWxhc2lueWEgZGVuZ2FuICsvLTEsIHNlbWFraW4ga3VhdCBrb3JlbGFzaW55YS4NCg0KIyMgMS41IFVqaSBIaXBvdGVzaXMNCg0KLSBKZWxhc2thbiBsYW5na2FoLWxhbmdrYWggdXRhbWEgZGFsYW0gbWVsYWt1a2FuIHVqaSBoaXBvdGVzaXMsIG11bGFpIGRhcmkgbWVydW11c2thbiAqKkgwKiogZGFuICoqSDEqKiwgbWVuZXRhcGthbiB0aW5na2F0IHNpZ25pZmlrYW4gKGFscGhhKSwgaGluZ2dhIG1lbnlpbXB1bGthbiBoYXNpbC4NCi0gTWVuZ2FwYSB1amkgaGlwb3Rlc2lzIHBlbnRpbmcgZGFsYW0gYW5hbGlzaXMgZGF0YT8NCg0KSmF3YWJhbiA6DQoNCiMjIyAxLjUuMSBMYW5na2FoIC0gbGFuZ2thaCBkYWxhbSBtZWxha3VrYW4gdWppIGhpcG90ZXNpcyA6DQoNCjEuIE1lcnVtdXNrYW4gSGlwb3Rlc2lzIE5vbCAoJEhfMCQpIGRhbiBIaXBvdGVzaXMgQWx0ZXJuYXRpZiAoJEhfMSQpLg0KDQotICRIXzAkIDogSGlwb3Rlc2lzIG5vbCBtZW55YXRha2FuIHRpZGFrIGFkYW55YSBlZmVrIGF0YXUgcGVyYmVkYWFuLg0KQ29udG9oICJSYXRhIHJhdGEgYmVyYXQgcHJvZHVrIDUwMCBncmFtIi4NCg0KLSAkSF8xJCA6IEhpcG90ZXNpcyBhbHRlcm5hdGlmIG1lbnlhdGFrYW4gYWRhbnlhIGVmZWsgYXRhdSBwZXJiZWRhYW4uDQpDb250b2ggIlJhdGEgcmF0YSBiZXJhdCBwcm9kdWsgdGlkYWsgNTAwIGdyYW0iLg0KDQoyLiBNZW5ldGFwa2FuIHRpbmdrYXQgc2lnbmlmaWthbnNpICjOsSkuIFRpbmdrYXQgc2lnbmlmaWthbiBhZGFsYWggcHJvYmFiaWxpdGFzIG1ha3NpbXVtIHVudHVrIG1lbm9sYWsgJEhfMCQga2V0aWthICRIXzAkIGJlbmFyLiANCg0KMy4gTWVuZ3VtcHVsa2FuIGRhbiBtZW5nYW5hbGlzaXMgZGF0YSB1bnR1ayBtZW5kYXBhdGthbiBkYXRhIHlhbmcgcmVsZXZhbi4NCg0KNC4gTWVuZW50dWthbiBEaXN0cmlidXNpIHVqaSBkYW4gbmlsYWkga3JpdGlzDQoNCjUuIE1lbWJ1YXQgS2VwdXR1c2FuDQoNCjYuIE1lbnlhbXBhaWthbiBIYXNpbCANCg0KIyMjIDEuNS4yIE1lbmdhcGEgdWppIGhpcG90ZXNpcyBwZW50aW5nID8NCkthcmVuYSB1amkgaGlwb3Rlc2lzIGRhcGF0IG1lbWJhbnR1IG1lbmdhbWJpbCBrZXB1dHVzYW4geWFuZyBvYmpla3RpZiwgbWVuZ3VyYW5naSBzdWJqZWt0aXZpdGFzLCBtZW5ndWt1ciBrZXRpZGFrcGFzdGlhbiwgbWVtdmFsaWRhc2kgbW9kZWwgYXRhdSBhc3Vtc2ksIHNlcnRhIG1lbWFzdGlrYW4ga2VwdXR1c2FuIHJlbGV2YW4gYmVyYmFzaXMgYnVrdGkgZGF0YS4NCg0KIyMgMS42IFBlbmdndW5hYW4gU29mdHdhcmUgU3RhdGlzdGlrYQ0KDQpTZWJ1dGthbiBiZWJlcmFwYSBwZXJhbmdrYXQgbHVuYWsgYXRhdSB0b29scyB5YW5nIGRpZ3VuYWthbiB1bnR1ayBhbmFsaXNpcyBzdGF0aXN0aWthIChtaXNhbG55YSBFeGNlbCwgUiwgYXRhdSBQeXRob24pLiBBcGEgc2FqYSBrZXVuZ2d1bGFuIGRhcmkgc2FsYWggc2F0dSBzb2Z0d2FyZSBwaWxpaGFuIEFuZGE/DQoNCkphd2FiYW4gOg0KDQpCZWJlcmFwYSBwZXJhbmdrYXQgbHVuYWsgYXRhdSB0b29scyB5YW5nIHNlcmluZyBkaWd1bmFrYW4gdW50dWsgYW5hbGlzaXMgc3RhdGlzdGlrYSBhZGFsYWg6DQoNCi0gRXhjZWwNCi0gUg0KLSBQeXRob24NCi0gTXlTUUwNCg0KS2V1bmdndWxhbiBTb2Z0d2FyZTogUg0KUiBhZGFsYWggc2FsYWggc2F0dSBzb2Z0d2FyZSB5YW5nIHNhbmdhdCBwb3B1bGVyIHVudHVrIGFuYWxpc2lzIHN0YXRpc3Rpa2EuIEJlcmlrdXQgYWRhbGFoIGtlbGViaWhhbm55YToNCg0KMS4gR3JhdGlzIGRhbiBPcGVuIFNvdXJjZQ0KUiBkYXBhdCBkaWd1bmFrYW4gc2VjYXJhIGdyYXRpcywgZGFuIHNpYXBhIHB1biBiaXNhIG1lbmdlbWJhbmdrYW4gc2VydGEgYmVyYmFnaSBwYWtldCB0YW1iYWhhbiB1bnR1ayBtZW1wZXJsdWFzIGZ1bmdzaW55YS4NCg0KMi4gQ29jb2sgdW50dWsgQmVyYmFnYWkgQW5hbGlzaXMgU3RhdGlzdGlrDQpSIGRpcmFuY2FuZyBraHVzdXMgdW50dWsgYW5hbGlzaXMgZGF0YSwgc2VoaW5nZ2EgbWVtaWxpa2kgYmFueWFrIGZ1bmdzaSBiYXdhYW4gc2VwZXJ0aSByZWdyZXNpLCB1amkgaGlwb3Rlc2lzLCBkYW4gYW5hbGlzaXMgZGF0YSB5YW5nIGtvbXBsZWtzLg0KDQozLiBCYW55YWsgUGFrZXQgVGFtYmFoYW4NClIgbWVtaWxpa2kgcmlidWFuIHBha2V0IHlhbmcgYmlzYSBkaWd1bmFrYW4gdW50dWsga2VidXR1aGFuIHRlcnRlbnR1LCBzZXBlcnRpIGFuYWxpc2lzIGRhdGEsIG1lbWJ1YXQgZ3JhZmlrLCBtYWNoaW5lIGxlYXJuaW5nLCBkYW4gbGFpbm55YS4NCg0KNC4gS2VtYW1wdWFuIFZpc3VhbGlzYXNpIHlhbmcgS3VhdA0KUiBtZW1pbGlraSBwYWtldCBzZXBlcnRpIGdncGxvdDIgdW50dWsgbWVtYnVhdCBncmFmaWsgeWFuZyBtZW5hcmlrLCBwcm9mZXNpb25hbCwgZGFuIG11ZGFoIGRpc2VzdWFpa2FuLg0KDQo1LiBEdWt1bmdhbiB1bnR1ayBEYXRhIEJlc2FyDQpSIGRhcGF0IG1lbmFuZ2FuaSBkYXRhIGJlcnVrdXJhbiBiZXNhciBkYW4gdGVyaHVidW5nIGtlIGRhdGFiYXNlIG1lbmdndW5ha2FuIHBha2V0IHNlcGVydGkgZHBseXIgYXRhdSBkYXRhLnRhYmxlLg0KDQo2LiBLb211bml0YXMgeWFuZyBBa3RpZg0KUiBtZW1pbGlraSBiYW55YWsgcGVuZ2d1bmEgZGkgc2VsdXJ1aCBkdW5pYSB5YW5nIHNlcmluZyBiZXJiYWdpIGlsbXUsIHR1dG9yaWFsLCBkYW4gc29sdXNpLCBzZWhpbmdnYSBBbmRhIG11ZGFoIG1lbmRhcGF0a2FuIGJhbnR1YW4gamlrYSBtZW5nYWxhbWkga2VzdWxpdGFuLiBzZXBlcnRpOw0KLSBSIFByb2plY3Q6OiBTaXR1cyByZXNtaSB1bnR1ayBSDQotIFR3aXR0ZXIgI3JzdGF0czogS29tdW5pdGFzIHBlbmdndW5hIFIgZGkgdHdpdHRlcg0KLSBSLUJsb2dnZXI6IFNpdHVzIGJsb2cgZGltYW5hIHBhcmEgcGVudWxpcyBkYXBhdCBtZW1wb3N0aW5nIGNvbnRvaCBrb2RlLCBhbmFsaXNpcyBkYXRhLCB2aXN1YWxpc2FzaS5kc2INCg0KIyMgMS43IEludGVycHJldGFzaSBTdGF0aXN0aWsNCg0KQmVyZGFzYXJrYW4gc3VhdHUgZGF0YSwgQW5kYSBtZW5kYXBhdGthbiBtZWFuID0gNzUsIG1lZGlhbiA9IDcyLCBkYW4gc3RhbmRhciBkZXZpYXNpID0gMTAuIEludGVycHJldGFzaWthbiBoYXNpbCBpbmkgZGFuIHNpbXB1bGthbiB0ZW50YW5nIGRpc3RyaWJ1c2kgZGF0YS4NCg0KSmF3YWJhbiA6DQoNCmBgYHtyLCBlY2hvPUZBTFNFLCB3YXJuaW5nPUZBTFNFLG1lc3NhZ2U9RkFMU0V9DQojIE1lbXVhdCBsaWJyYXJ5IHlhbmcgZGlidXR1aGthbg0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShwbG90bHkpDQoNCiMgUGFyYW1ldGVyIERhdGEgTm9ybWFsDQptZWFuX25vcm1hbCA8LSAwDQpzZF9ub3JtYWwgPC0gMQ0Kbl9ub3JtYWwgPC0gMTAwMA0KDQojIFBhcmFtZXRlciBEYXRhIFRpZGFrIE5vcm1hbA0KbWVhbl9ub3Rfbm9ybWFsIDwtIDENCnNkX25vdF9ub3JtYWwgPC0gMC41DQpuX25vdF9ub3JtYWwgPC0gMTAwMA0KDQojIE1lbWJ1YXQgZGF0YSBzaW11bGFzaQ0Kc2V0LnNlZWQoNDIpICAjIFVudHVrIGhhc2lsIHlhbmcga29uc2lzdGVuDQpkYXRhX25vcm1hbCA8LSBybm9ybShuX25vcm1hbCwgbWVhbiA9IG1lYW5fbm9ybWFsLCBzZCA9IHNkX25vcm1hbCkNCmRhdGFfbm90X25vcm1hbCA8LSBybm9ybShuX25vdF9ub3JtYWwsIG1lYW4gPSBtZWFuX25vdF9ub3JtYWwsIHNkID0gc2Rfbm90X25vcm1hbCkNCg0KIyBHYWJ1bmdrYW4gZGF0YSBrZSBkYWxhbSBzYXR1IGRhdGEgZnJhbWUNCmRhdGEgPC0gZGF0YS5mcmFtZSgNCiAgbmlsYWkgPSBjKGRhdGFfbm9ybWFsLCBkYXRhX25vdF9ub3JtYWwpLA0KICBrYXRlZ29yaSA9IGMocmVwKCJEYXRhIE5vcm1hbCIsIG5fbm9ybWFsKSwgcmVwKCJEYXRhIFRpZGFrIE5vcm1hbCIsIG5fbm90X25vcm1hbCkpDQopDQoNCiMgTWVtYnVhdCBoaXN0b2dyYW0gZGVuZ2FuIGdncGxvdDINCnAgPC0gZ2dwbG90KGRhdGEsIGFlcyh4ID0gbmlsYWksIGZpbGwgPSBrYXRlZ29yaSkpICsNCiAgZ2VvbV9oaXN0b2dyYW0oYmlud2lkdGggPSAwLjIsIHBvc2l0aW9uID0gImlkZW50aXR5IiwgYWxwaGEgPSAwLjcsIGNvbG9yID0gIndoaXRlIikgKw0KICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCJibHVlIiwgImdyZWVuIikpICsNCiAgbGFicygNCiAgICB0aXRsZSA9ICJIaXN0b2dyYW0gRGF0YSBOb3JtYWwgZGFuIFRpZGFrIE5vcm1hbCIsDQogICAgeCA9ICJOaWxhaSIsDQogICAgeSA9ICJGcmVrdWVuc2kiDQogICkgKw0KICB0aGVtZV9taW5pbWFsKGJhc2Vfc2l6ZSA9IDE1KSArDQogIHRoZW1lKA0KICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUsIHNpemUgPSAyMCwgZmFjZSA9ICJib2xkIiksDQogICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTYpLA0KICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpDQogICkNCg0KIyBNZW5hbWJhaGthbiBpbnRlcmFrdGl2aXRhcyBkZW5nYW4gcGxvdGx5DQpwX2ludGVyYWN0aXZlIDwtIGdncGxvdGx5KHApDQoNCiMgTWVuYW1waWxrYW4gZ3JhZmlrIGludGVyYWt0aWYNCnBfaW50ZXJhY3RpdmUNCmBgYA0KDQpCZXJkYXNhcmthbiBEYXRhLCBtZWFuID0gNzUsIG1lZGlhbiA9IDcyLCBkYW4gc3RhbmRhciBkZXZpYXNpID0gMTANCg0KICBOaWxhaSBNZWFuIGxlYmloIGJlc2FyIGRhcmkgbWVkaWFuIHlhbmcgbWVuZ2lkZW50aWZpa2FzaSBkYXRhIGJhaHdhIGRpc3RyaWJ1c2kgZGF0YSBtaXJpbmcga2Uga2FuYW4sIEhhbCBpbmkgdGVyamFkaSBqaWthIHRlcmRhcGF0IG5pbGFpLW5pbGFpIGVrc3RyZW0geWFuZyBsZWJpaCB0aW5nZ2ksIHNlaGluZ2dhIG1lbmFpa2thbiByYXRhLXJhdGEuIExhbHUgZGVuZ2FuIFNEID0gMTAsIGRhdGEgbWVtaWxpa2kgcGVueWViYXJhbiB5YW5nIGN1a3VwIGx1YXMgZGkgc2VraXRhciBtZWFuLiBTZWJhZ2lhbiBiZXNhciBkYXRhIChzZWtpdGFyIDY4JSkgYmVyYWRhIGRhbGFtIGludGVydmFsIFs2NSwgODVdIChtZWFuIMKxIDEgU0QpLCBzZWRhbmdrYW4gOTUlIGRhdGEgYmVyYWRhIGRhbGFtIGludGVydmFsIFs1NSwgOTVdIChtZWFuIMKxIDIgU0QpLiBIYWwgaW5pIG1lbnVuanVra2FuIGJhaHdhIGRhdGEgbWVtaWxpa2kgdmFyaWFzaSB5YW5nIGN1a3VwIGJlc2FyLg0KDQogIExhbHUgYWRhIHBvdGVuc2kgb3V0bGllciBLYXJlbmEgc3RhbmRhciBkZXZpYXNpIGN1a3VwIGJlc2FyIGRhbiBkaXN0cmlidXNpIGNlbmRlcnVuZyBtaXJpbmcsIGtlbXVuZ2tpbmFuIHRlcmRhcGF0IG5pbGFpIGVrc3RyZW0gKG91dGxpZXIpLCB0ZXJ1dGFtYSBwYWRhIG5pbGFpIHlhbmcgamF1aCBkaSBhdGFzIG1lYW4uIE1lc2tpcHVuIGRhdGEgbXVuZ2tpbiBiZXJhc2FsIGRhcmkgZGlzdHJpYnVzaSBub3JtYWwgKHNlc3VhaSBhc3Vtc2kpLCBwZXJiZWRhYW4gYW50YXJhIG1lYW4gZGFuIG1lZGlhbiBtZW51bmp1a2thbiBhZGFueWEgc2VkaWtpdCBwZW55aW1wYW5nYW4gZGFyaSBzaW1ldHJpIHNlbXB1cm5hLg0KDQojIyAxLjggQ29udG9oIEthc3VzDQoNClJ1bXVza2FuIHJpbmdrYXNhbiBkYXJpIGxhbmdrYWgtbGFuZ2thaCBzdGF0aXN0aWsgZGFzYXIgYmVyaWt1dCBiZXJkYXNhcmthbiBzdWF0dSBrYXN1cyBoaXBvdGV0aXM6DQoNCi0gRGVza3JpcHNpIGRhdGEgKGRlc2tyaXB0aWYpLiAgDQotIE1lbmdoaXR1bmcga29yZWxhc2kgYW50YXJhIGR1YSB2YXJpYWJlbC4gIA0KLSBNZW1idWF0IHVqaSBoaXBvdGVzaXMgdW50dWsgbWVtYmFuZGluZ2thbiBkdWEga2Vsb21wb2sgZGF0YS4gIA0KDQpKYXdhYmFuIDoNCg0KSmFkaSBkaXNpbmkga2l0YSBtZW5nZ3VuYWthbiBkYXRhIGRhcmkgOCBzaXN3YSBkYXJpIGtlbGFzIHlhbmcgYmVyYmVkYS4NCg0KYGBge3IsIGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpsaWJyYXJ5KGtuaXRyKQ0KDQojIERhdGEgZnJhbWUgdW50dWsgdGFiZWwNCmRhdGEgPC0gZGF0YS5mcmFtZSgNCiAgYFNpc3dhYCA9IGMoMSwgMiwgMywgNCwgNSwgNiwgNywgOCksDQogIGBLZWxhcyBBYCA9IGMoNzAsIDc1LCA3OCwgNzIsIDgwLCA2OCwgNzQsIDc2KSwNCiAgYEtlbGFzIEJgID0gYyg4MCwgODIsIDg1LCA3OCwgODgsIDg0LCA4MSwgNzkpDQopDQoNCiMgQ2V0YWsgdGFiZWwNCmthYmxlKGRhdGEsIGNvbC5uYW1lcyA9IGMoIlNpc3dhIiwgIktlbGFzIEEiLCAiS2VsYXMgQiIpKQ0KYGBgDQoNCiMjIyAxLjguMSBEZXNrcmlwc2kgRGF0YQ0KDQotIEtlbGFzIEENCg0KTWVhbiA6IA0KDQokJA0KXGZyYWN7NzAgKyA3NSArIDc4ICsgNzIgKyA4MCArIDY4ICsgNzQgKyA3Nn17OH09NzQuMTI1DQokJA0KDQpNZWRpYW4gOiBVbnR1ayBtZW5lbXVrYW4gbWVkaWFuIGphbmdhbiBsdXBhIHVudHVrIG1lbmdydXRrYW4gYW5na2FueWEgdGVybGViaWggZGFodWx1LiANCg0KJCQNCjY4LCA3MCwgNzIsIDc0LCA3NSwgNzYsIDc4LCA4MA0KJCQNCg0KJCQNCj1cZnJhY3s3NCArIDc1fXsyfT1cZnJhY3sxNDl9ezJ9PTc0LjUNCiQkDQoNCi0gS2VsYXMgQg0KDQpNZWFuIDogDQoNCiQkDQpcZnJhY3s4MCArIDgyICsgODUgKyA3OCArIDg4ICsgODQgKyA4MSArIDc5fXs4fT04Mi4xMjUNCiQkDQoNCk1lZGlhbiA6IFVudHVrIG1lbmVtdWthbiBtZWRpYW4gamFuZ2FuIGx1cGEgdW50dWsgbWVuZ3J1dGthbiBhbmdrYW55YSB0ZXJsZWJpaCBkYWh1bHUuIA0KDQokJA0KNzgsIDc5LCA4MCwgODEsIDgyLCA4NCwgODUsIDg4DQokJA0KDQokJA0KPVxmcmFjezgxICsgODJ9ezJ9PVxmcmFjezE2M317Mn09ODEuNQ0KJCQNCg0KIyMjIDEuOC4yIEtvcmVsYXNpDQoNCkd1bmFrYW4gaHVidW5nYW4gSnVtbGFoIEphbSBiZWxhamFyKFgpIGRlbmdhbiBOaWxhaSBVamlhbihZKS4NCg0KDQpgYGB7ciwgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRX0NCmxpYnJhcnkoa25pdHIpDQoNCiMgRGF0YSBmcmFtZSB1bnR1ayB0YWJlbA0KZGF0YSA8LSBkYXRhLmZyYW1lKA0KICBgU2lzd2FgID0gYygxLCAyLCAzLCA0LCA1LCA2LCA3LCA4KSwNCiAgYEphbSBCZWxhamFyKFgpYCA9IGMoMiwgNCwgNSwgMywgNiwgMSwgNCwgNSksDQogIGBOaWxhaSBVamlhbihZKWAgPSBjKDcwLCA3NSwgNzgsIDcyLCA4MCwgNjgsIDc0LCA3NikNCikNCg0KIyBDZXRhayB0YWJlbA0Ka2FibGUoZGF0YSwgY29sLm5hbWVzID0gYygiU2lzd2EiLCAiSmFtIEJlbGFqYXIoWCkiLCAiTmlsYWkgVWppYW4oWSkiKSkNCmBgYA0KDQpIaXR1bmcgS29lZmlzaWVuIGtvcmVsYXNpICRyJCBkZW5nYW4gbWVuZ2d1bmFrYW4gcnVtdXMgcGVhcnNvbjoNCg0KJCQNCnI9XGZyYWN7XHN1bShYIC0gWGkpKFkgLSBZaSl9e1xzcXJ0XHN1bShYIC0gWGkpXjJcY2RvdChZIC0gWWkpXjJ9DQokJA0KDQpIaXR1bmcgUmF0YSByYXRhIE1lYW4gWCBkYW4gWToNCg0KLSAkWD0kICRcZnJhY3syKzMrNSs4KzQrNis3Kzl9ezh9ID0gNS41JA0KDQotICRZPSQgJFxmcmFjezcwKzc1Kzc4Kzg4Kzc0KzgwKzg1KzkwfXs4fT04MCQNCg0KYGBge3IsIGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpsaWJyYXJ5KGtuaXRyKQ0KDQojIERhdGEgZnJhbWUgdW50dWsgdGFiZWwNCmRhdGEgPC0gZGF0YS5mcmFtZSgNCiAgYFhpYCA9IGMoMiwgMywgNSwgOCwgNCwgNiwgNywgOSksDQogIGBZaWAgPSBjKDcwLCA3NSwgNzgsIDg4LCA3NCwgODAsIDg1LCA5MCksDQogIGBYaSAtIFhgID0gYygtMy41LCAtMi41LCAtMC41LCAyLjUsIC0xLjUsIDAuNSwgMS41LCAzLjUpLA0KICBgWWkgLSBZYCA9IGMoLTEwLCAtNSwgLTIsIDgsIC02LCAwLCA1LCAxMCksDQogIGAoWGkgLSBYKShZaSAtIFkpYCA9IGMoMzUsIDEyLjUsIDEsIDIwLCA5LCAwLCA3LjUsIDM1KSwNCiAgYChYaSAtIFgpXjJgID0gYygxMi4yNSwgNi4yNSwgMC4yNSwgNi4yNSwgMi4yNSwgMC4yNSwgMi4yNSwgMTIuMjUpLA0KICBgKFlpIC0gWSleMmAgPSBjKDEwMCwgMjUsIDQsIDY0LCAzNiwgMCwgMjUsIDEwMCkNCikNCg0KIyBDZXRhayB0YWJlbA0Ka2FibGUoZGF0YSwgY29sLm5hbWVzID0gYygiWGkiLCAiWWkiLCAiWGkgLSBYIiwgIllpIC0gWSIsICIoWGkgLSBYKShZaSAtIFkpIiwgIihYaSAtIFgpXjIiLCAiKFlpIC0gWSleMiIpKQ0KYGBgDQoNCkhpdHVuZyBrb21wb25lbiBydW11czoNCg0KLSAkXHN1bShYaSAtIFgpKFlpIC0gWSkgPSAxMjAuNSQNCg0KLSAkXHN1bShYaSAtIFgpID0gNDIkDQoNCi0gJFxzdW0oWWkgLSBZKSA9IDM1NCQNCg0KUnVtdXMgS29yZWxhc2kgOg0KDQokJA0Kcj1cZnJhYyB7XHN1bShYaSAtIFgpKFlpIC0gWSl9e1xzcXJ0XHN1bShYaSAtIFgpIFxjZG90IFxzdW0oWWkgLSBZKX0NCiQkDQoNCiQkDQpyPVxmcmFjezEyMC41fXs0MiBcY2RvdCAzNTR9PVxmcmFjezEyMC41fXtcc3FydDE0ODY4fT1cZnJhY3sxMjAuNX17MTIxLjl9PTAuOTkNCiQkDQoNCk5pbGFpIHIgPSAwLjk5IG1lbnVuanVra2FuIGJhaHdhIGh1YnVuZ2FuIHNhbmdhdCBrdWF0IGRhbiBwb3NpdGlmIGFudGFyYSB3YWt0dSBiZWxhamFyIGRhbiBuaWxhaSB1amlhbi4NCg0KIyMjIDEuOC4zIFVqaSBIaXBvdGVzaXMNCg0KLSAkSF8wJCA6IFRpZGFrIGFkYSBwZXJiZWRhYW4gcmF0YSByYXRhIA0KLSAkSF8xJCA6IEFkYSBwZXJiZWRhYW4gcmF0YSByYXRhDQoNCkRhdGEgS2VsYXMgQSBkYW4gQjoNCg0KLSBLZWxhcyBBOiA3MCwgNzUsIDc4LCA3MiwgODAsIDY4LCA3NCwgNzYNCk1lYW4gOiA3NC4xMjUNClN0YW5kYXIgRGV2aWFzaSA6IDQuMDINCg0KLSBLZWxhcyBCOiA4MCwgODIsIDg1LCA3OCwgODgsIDg0LCA4MSwgNzkNCk1lYW4gOiA4Mi4xMjUNClN0YW5kYXIgRGV2aWFzaSA6IDMuNTENCg0KUnVtdXMgVWppIHQ6DQoNCiQkDQp0PVxmcmFje1hhIC0gWGJ9e1xzcXJ0XGZyYWN7c0FeMn17bkF9ICsgXGZyYWN7c0JeMn17bkJ9fQ0KJCQNCg0KLSAkbiBBID0gbiBCID0gOCQNCg0KLSAkcyBBXjIgPSAxNi4xNiQgJHMgQl4yID0gMTIuMzIkDQoNCkhpdHVuZyBuaWxhaSB0Og0KDQokJA0KdCA9IFxmcmFjezc0LjEyNSAtIDgyLjEyNX17XHNxcnRcZnJhY3sxNi4xNn17OH0gKyBcZnJhY3sxMi4zMn17OH19PSBcZnJhY3stOH17XHNxcnR7Mi4wMiArIDEuNTR9fSA9IFxmcmFjey05fXsxLjg5fSA9IC00LjIzDQokJA0KDQpCYW5kaW5na2FuIG5pbGFpIHQgZGVuZ2FuIG5pbGFpIGtyaXRpczoNCg0KLSBEZW5nYW4gJGRmID0gMTQkIGRhbiAkYSA9IDAuMDUkLCBuaWxhaSBrcml0aXMgJHQwLjAyNSQgPSAkMi4xNDUkDQoNCi0gS2FyZW5hICR0ID0gLTQuMjMkIGJlcmFkYSBkaSBsdWFyICQtMi4xNDUkIGhpbmdnYSAkMi4xNDUkLCB0b2xhayAkSF8wJA0KDQojIyAxLjkgS2VzaW1wdWxhbiBBbmRhDQoNCkJ1YXRsYWgga2VzaW1wdWxhbiBzaW5na2F0IHRlbnRhbmcgcGVudGluZ255YSBzdGF0aXN0aWthIGRhbGFtIGFuYWxpc2lzIGRhdGEuIEJhZ2FpbWFuYSBBbmRhIGRhcGF0IG1lbmdhcGxpa2FzaWthbiBzdGF0aXN0aWthIGRhc2FyIGluaSBkYWxhbSBwZWtlcmphYW4gYXRhdSBrZWhpZHVwYW4gc2VoYXJpLWhhcmk/DQoNClN0YXRpc3Rpa2EgaXR1IHBlbnRpbmcga2FyZW5hIG1lbWJhbnR1IGtpdGEgbWVtYWhhbWkgZGF0YSBkYW4gbWVuZ2FtYmlsIGtlcHV0dXNhbiB5YW5nIGxlYmloIHRlcGF0LiBEYWxhbSBwZWtlcmphYW4sIG1pc2FsbnlhLCBraXRhIGJpc2EgbWVtYWthaW55YSB1bnR1ayBtZWxpaGF0IGFwYWthaCBzdHJhdGVnaSBwZW1hc2FyYW4gYmVyaGFzaWwgYXRhdSB0aWRhay4gRGFsYW0ga2VoaWR1cGFuIHNlaGFyaS1oYXJpLCBzdGF0aXN0aWthIGJpc2EgbWVtYmFudHUga2l0YSBtZW5nYXR1ciBrZXVhbmdhbiwgbWVtaWxpaCBpbnZlc3Rhc2kgeWFuZyBhbWFuLCBhdGF1IG1lbmdldmFsdWFzaSBpbmZvcm1hc2kgeWFuZyBraXRhIGRhcGF0IGRhcmkgYmVyaXRhLiBJbnRpbnlhLCBzdGF0aXN0aWthIG1lbWJhbnR1IGtpdGEgbWVsaWhhdCBwb2xhLCBtZW5jYXJpIHRhaHUgYXBhIHlhbmcgYmVuYXItYmVuYXIgYmVycGVuZ2FydWgsIGRhbiBtZW1idWF0IGtlcHV0dXNhbiB5YW5nIGxlYmloIG1hc3VrIGFrYWwuDQoNCiMjIDEuMTAgQnVhdGthbiBNaW5kIE1hcA0KDQpCdWF0bGFoIE1pbmQgTWFwIFRlcmthaXQgUmFuZ2t1bWFuIG1ldGVyaSB0ZXJzZWJ1dCBkaWF0YXMgZGFsYW0gYmVudHVrIEluZm9ncmFmaXMuDQoNCjxpbWcgc3JjPSJHYW1iYXIvTWluZF9NYXBwaW5nLmpwZyIgc3R5bGU9ImRpc3BsYXk6IGJsb2NrOyB3aWR0aDo1MDBweDsgbWFyZ2luOiBhdXRvOyI+DQoNCiMgU09BTCAyDQoNCiMjIERlc2tyaXBzaSBLYXN1cyANCg0KUGVydXNhaGFhbiBGTUNHIEFuZGEgaW5naW4gbWVtYWhhbWkgcG9sYSBwZW5qdWFsYW4gcHJvZHVrIEFCQyBkaSB3aWxheWFoICoqSkFCT0RFVEFCRUsqKiBzZWxhbWEgNSB0YWh1biB0ZXJha2hpciB1bnR1ayBtZW5nZW1iYW5na2FuIHN0cmF0ZWdpIHBlbWFzYXJhbiB5YW5nIGxlYmloIGVmZWt0aWYuIERhdGEgaGlzdG9yaXMgbWVsaXB1dGkga290YS1rb3RhICoqSmFrYXJ0YSwgQm9nb3IsIERlcG9rLCBUYW5nZXJhbmcqKiwgZGFuICoqQmVrYXNpKiouDQoNCiMjIERhdGEgUGVuanVhbGFuIEFCQw0KDQpEYXRhc2V0IFtQZW5qdWFsYW4gQUJDXShodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vZHNjaWVuY2VsYWJzL2RhdGFzZXQvcmVmcy9oZWFkcy9tYXN0ZXIvUGVuanVhbGFuX0FCQ19KQUJPREVUQUJFSy5jc3YpIHRlcmRpcmkgZGFyaSAqKjYwIGJ1bGFuKiogKDUgdGFodW4pLCBkZW5nYW4gaW5mb3JtYXNpIG51bWVyaWsgZGFuIGthdGVnb3JpayBiZXJpa3V0Og0KDQotICoqS290YToqKiBMb2thc2kgcGVuanVhbGFuIGRpIEpBQk9ERVRBQkVLIChKYWthcnRhLCBCb2dvciwgRGVwb2ssIFRhbmdlcmFuZywgQmVrYXNpKS4gIA0KLSAqKlBlbmp1YWxhbiAodW5pdCk6KiogVG90YWwgdW5pdCBwcm9kdWsgdGVyanVhbCBwZXIgYnVsYW4uICANCi0gKipCaWF5YSBQcm9tb3NpICgkKToqKiBBbmdnYXJhbiBwcm9tb3NpIGRpIHdpbGF5YWggdGVyc2VidXQuICANCi0gKipEaXNrb24gKCUpOioqIEJlc2FyYW4gZGlza29uIHlhbmcgZGliZXJpa2FuIHVudHVrIHByb2R1ay4gIA0KLSAqKlJhdGluZyBQZWxhbmdnYW4gKDEtNSk6KiogUGVuaWxhaWFuIHBlbGFuZ2dhbiBiZXJkYXNhcmthbiBzdXJ2ZWkuICANCi0gKipKZW5pcyBPdXRsZXQ6KiogTW9kZXJuIChzdXBlcm1hcmtldCwgbWluaW1hcmtldCkgYXRhdSBUcmFkaXNpb25hbCAod2FydW5nLCBwYXNhcikuICANCi0gKipLYXRlZ29yaSBQcm9kdWs6KiogTWFrYW5hbiwgTWludW1hbiwgYXRhdSBLZXNlaGF0YW4uIA0KDQojIyBQZXJ0YW55YWFuIEFuYWxpc2lzDQoNCiMjIyAyLjEgU3RhdGlzdGlrIERlc2tyaXB0aWYNCg0KIyMjIDIuMS4xIEhpdHVuZyBtZWFuLCBtZWRpYW4sIGRhbiBzdGFuZGFyIGRldmlhc2kgdW50dWsgdmFyaWFiZWwgUGVuanVhbGFuICh1bml0KSwgQmlheWEgUHJvbW9zaSAoXCQpLCBkYW4gUmF0aW5nIFBlbGFuZ2dhbiBwZXIgdGFodW4gZGkgc2V0aWFwIGtvdGEuDQoNCiMjIyMgMS4gTWVuZ2hpdHVuZyBSYXRhLXJhdGEgKE1lYW4pOg0KUnVtdXM6DQpcWw0KXHRleHR7UmF0YS1yYXRhfSA9IFxmcmFje1x0ZXh0e0p1bWxhaCBzZW11YSBuaWxhaX19e1x0ZXh0e0p1bWxhaCBkYXRhfX0NClxdDQoNCiMjIyMjIE1lbmdoaXR1bmcgUmF0YS1yYXRhIFBlbmp1YWxhbiBLb3RhIEpha2FydGEgKDIwMTgpDQpEYXRhIFBlbmp1YWxhbiBLb3RhIEpha2FydGEoMjAxOCk6IA0KDQokMTAzOTIsIDExNDYyLCA5NzE3LCAxMjM1MywgMTA1NTEsIDk5NTcsIDEwNDA4LCAxNDAwNSwgNjAwMSwgMTEwOTMsIDEwODYwLCA4MjE3JA0KDQoNCkxhbmdrYWgtbGFuZ2thaDoNCjEuIEhpdHVuZyBqdW1sYWggc2VtdWEgbmlsYWk6DQoNCiQxMDM5MisxMTQ2Mis5NzE3KzEyMzUzKzEwNTUxKzk5NTcrMTA0MDgrMTQwMDUrNjAwMSsxMTA5MysxMDg2MCs4MjE3PTEyNTAxNiQNCg0KMi4gSGl0dW5nIGp1bWxhaCBkYXRhOg0KDQpKdW1sYWggRGF0YSA9IDEyDQoNCjMuIE1hc3Vra2FuIGtlIHJ1bXVzOg0KDQpcWw0KXHRleHR7UmF0YS1yYXRhIFBlbmp1YWxhbiBLb3RhIEpha2FydGEgKDIwMTgpfSA9IFxmcmFjezEyNSwwMTYNCn17MTJ9ID0gMTAsNDE4DQpcXQ0KDQojIyMjIDIuIE1lbmdoaXR1bmcgTmlsYWkgVGVuZ2FoIChNZWRpYW4pOg0KUnVtdXMgKEdhbmppbCk6DQoNClxbDQpcdGV4dHtNZWRpYW59ID0gXHRleHR7TmlsYWkgUG9zaXNpIE1lZGlhbn0NClxdDQoNClJ1bXVzIChHZW5hcCk6DQoNClxbDQpcdGV4dHtNZWRpYW59ID0gXGZyYWN7XHRleHR7TmlsYWkgUG9zaXNpIE1lZGlhbn0gPSBcZnJhY3tufXsyfSArIFxmcmFje259ezJ9ICsgMX17Mn0NClxdDQoNCiMjIyMjIE1lbmdoaXR1bmcgTWVkaWFuIFBlbmp1YWxhbiBLb3RhIEpha2FydGEgKDIwMTgpDQpEYXRhIFBlbmp1YWxhbiBLb3RhIEpha2FydGEoMjAxOCkgeWFuZyBkaXVydXRrYW46IA0KDQokNjAwMSwgODIxNywgOTcxNywgOTk1NywgMTAzOTIsIDEwNDA4LCAxMDU1MSwgMTA4NjAsIDExMDkzLCAxMTQ2MiwgMTIzNTMsIDE0MDA1JA0KDQpLYXJlbmEganVtbGFoIGRhdGEgKCTwnZGbPSAxMiQpIGFkYWxhaCBnZW5hcCwgZ3VuYWthbiBydW11cyB1bnR1ayBtZWNhcmkgcG9zaXNpIG1lZGlhbjoNCg0KXFsNClx0ZXh0e1Bvc2lzaSBNZWRpYW59ID0gXGZyYWN7bn17Mn0gZGFuIFxmcmFje259ezJ9ICsgMQ0KXF0NCg0KXFsNClx0ZXh0e1Bvc2lzaSBNZWRpYW59ID0gXGZyYWN7MTJ9ezJ9IGRhbiBcZnJhY3sxMn17Mn0gKyAxDQpcXQ0KDQpcWw0KXHRleHR7UG9zaXNpIE1lZGlhbn0gPSBcdGV4dHtEYXRhIGtlLTYgZGFuIERhdGEga2UtN30NClxdDQoNClxbDQpcdGV4dHtEYXRhIGtlLTZ9ID0gMTA0MDgsIFx0ZXh0e0RhdGEga2UtN30gPSAxMDU1MQ0KXF0NCg0KXFsNClx0ZXh0e01lZGlhbn0gPSBcZnJhY3sxMDQwOCArIDEwNTUxfXsyfSA9IDEwNDc5LjUNClxdDQoNCiMjIyMgMy4gTWVuZ2hpdHVuZyBTdGFuZGFyIERldmlhc2k6DQpSdW11czoNClxbDQpzID0gXHNxcnR7XGZyYWN7XHN1bSAoeF9pIC0gXGJhcnt4fSleMn17bi0xfX0NClxdDQoNCkRpbWFuYToNCg0KLSBcKHhfaVwpID0gc2VtdWEgZGF0YSB5YW5nIGFrYW4gZGloaXR1bmcNCi0gXChcYmFye1h9XCkgPSBNZWFuIChyYXRhLXJhdGEpDQotIG4gPSBqdW1sYWggZGF0YQ0KDQojIyMjIyBNZW5naGl0dW5nIFN0YW5kYXIgRGV2aWFzaSBQZW5qdWFsYW4gS290YSBKYWthcnRhICgyMDE4KQ0KTWFzdWtrYW4ga2UgcnVtdXM6DQpcWw0KcyA9IFxzcXJ0e1xmcmFjeygxMCwzOTIgLSAxMCw0MTgpXjIgKyAuLi4gKyAoODIxNyAtIDEwLDQxOCleMn17MTItMX19DQpcXQ0KXFsNCnMgPSBcc3FydHtcZnJhY3s2NzYgKyAuLi4gKyA0ODQ0NDAxfXsxMX19DQpcXQ0KXFsNCnMgPSBcc3FydHtcZnJhY3s0MzQyODM5Nn17MTF9fQ0KXF0NClxbDQpzID0gXHNxcnR7Mzk0ODAzNn0gPSAxOTg2Ljk2Nw0KXF0NCg0Ka29kZQ0KYGBge3Igc2V0dXAsIGVjaG89RkFMU0UsIGluY2x1ZGU9VFJVRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gRkFMU0UpDQpsaWJyYXJ5KGRwbHlyKQ0KbGlicmFyeShrbml0cikNCg0KIyBMb2FkIGRhdGENCmRhdGEgPC0gcmVhZC5jc3YoIlBlbmp1YWxhbl9BQkNfSkFCT0RFVEFCRUsuY3N2IikNCmthYmxlKGhlYWQoZGF0YSksIGNhcHRpb24gPSAiRGF0YSBBd2FsIikNCg0KIyBIaXR1bmcgc3RhdGlzdGlrDQpzdW1tYXJ5X2RhdGEgPC0gZGF0YSAlPiUNCiAgZ3JvdXBfYnkoVGFodW4sIEtvdGEpICU+JQ0KICBzdW1tYXJpc2UoDQogICAgTWVhbl9QZW5qdWFsYW4gPSBtZWFuKFBlbmp1YWxhbi4udW5pdC4pLA0KICAgIE1lZGlhbl9QZW5qdWFsYW4gPSBtZWRpYW4oUGVuanVhbGFuLi51bml0LiksDQogICAgU0RfUGVuanVhbGFuID0gc2QoUGVuanVhbGFuLi51bml0LiksDQogICAgTWVhbl9CaWF5YV9Qcm9tb3NpID0gbWVhbihCaWF5YS5Qcm9tb3NpLi4uLiksDQogICAgTWVkaWFuX0JpYXlhX1Byb21vc2kgPSBtZWRpYW4oQmlheWEuUHJvbW9zaS4uLi4pLA0KICAgIFNEX0JpYXlhX1Byb21vc2kgPSBzZChCaWF5YS5Qcm9tb3NpLi4uLiksDQogICAgTWVhbl9SYXRpbmdfUGVsYW5nZ2FuID0gbWVhbihSYXRpbmcuUGVsYW5nZ2FuLi4xLjUuKSwNCiAgICBNZWRpYW5fUmF0aW5nX1BlbGFuZ2dhbiA9IG1lZGlhbihSYXRpbmcuUGVsYW5nZ2FuLi4xLjUuKSwNCiAgICBTRF9SYXRpbmdfUGVsYW5nZ2FuID0gc2QoUmF0aW5nLlBlbGFuZ2dhbi4uMS41LikNCiAgKQ0KDQojIFRhbXBpbGthbiB0YWJlbCBoYXNpbA0Ka2FibGUoc3VtbWFyeV9kYXRhLCBjYXB0aW9uID0gIlJpbmdrYXNhbiBTdGF0aXN0aWsgUGVuanVhbGFuIHBlciBUYWh1biBkYW4gS290YSIpDQoNCmBgYA0KDQoNCiMjIyAyLjEuMiBJZGVudGlmaWthc2kga290YSBkZW5nYW4gcGVydHVtYnVoYW4gcGVuanVhbGFuIHRlcnRpbmdnaSBkYW4gdGVyZW5kYWggc2VsYW1hIHBlcmlvZGUgNSB0YWh1bi4NCmBgYHtyIHIgZ3Jvd3RoLWFuYWx5c2lzLCBpbmNsdWRlPVRSVUUsIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUpDQpsaWJyYXJ5KGRwbHlyKQ0KbGlicmFyeShrbml0cikNCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkocGxvdGx5KSAjIFRhbWJhaGthbiBsaWJyYXJ5IHBsb3RseSB1bnR1ayBpbnRlcmFrdGl2aXRhcw0KDQojIExvYWQgZGF0YQ0KZGF0YSA8LSByZWFkLmNzdigiUGVuanVhbGFuX0FCQ19KQUJPREVUQUJFSy5jc3YiKQ0KDQojIEhpdHVuZyB0b3RhbCBwZW5qdWFsYW4gcGVyIHRhaHVuIGRhbiBrb3RhDQp0b3RhbF9wZW5qdWFsYW4gPC0gZGF0YSAlPiUNCiAgZ3JvdXBfYnkoVGFodW4sIEtvdGEpICU+JQ0KICBzdW1tYXJpc2UoVG90YWxfUGVuanVhbGFuID0gc3VtKFBlbmp1YWxhbi4udW5pdC4pKQ0KDQojIEhpdHVuZyBwZXJ0dW1idWhhbiBwZW5qdWFsYW4gKHRhaHVuIHRlcmFraGlyIC0gdGFodW4gcGVydGFtYSkNCmdyb3d0aCA8LSB0b3RhbF9wZW5qdWFsYW4gJT4lDQogIGdyb3VwX2J5KEtvdGEpICU+JQ0KICBzdW1tYXJpc2UoDQogICAgR3Jvd3RoID0gVG90YWxfUGVuanVhbGFuW1RhaHVuID09IG1heChUYWh1bildIC0gVG90YWxfUGVuanVhbGFuW1RhaHVuID09IG1pbihUYWh1bildDQogICkgJT4lDQogIGFycmFuZ2UoZGVzYyhHcm93dGgpKQ0KDQojIFRhbXBpbGthbiBoYXNpbA0KaGlnaGVzdF9ncm93dGggPC0gZ3Jvd3RoWzEsIF0NCmxvd2VzdF9ncm93dGggPC0gZ3Jvd3RoW25yb3coZ3Jvd3RoKSwgXQ0KDQojIEJ1YXQgZ3JhZmlrIHBlcnR1bWJ1aGFuIHBlbmp1YWxhbiBpbnRlcmFrdGlmDQpncm93dGhfcGxvdCA8LSBnZ3Bsb3QoZ3Jvd3RoLCBhZXMoeCA9IHJlb3JkZXIoS290YSwgR3Jvd3RoKSwgeSA9IEdyb3d0aCkpICsNCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIGZpbGwgPSAic3RlZWxibHVlIikgKw0KICBjb29yZF9mbGlwKCkgKw0KICBsYWJzKA0KICAgIHRpdGxlID0gIlBlcnR1bWJ1aGFuIFBlbmp1YWxhbiBwZXIgS290YSIsDQogICAgeCA9ICJLb3RhIiwNCiAgICB5ID0gIlBlcnR1bWJ1aGFuIFBlbmp1YWxhbiINCiAgKSArDQogIHRoZW1lX21pbmltYWwoKQ0KDQpncm93dGhfcGxvdF9pbnRlcmFjdGl2ZSA8LSBnZ3Bsb3RseShncm93dGhfcGxvdCkNCg0KIyBUYW1waWxrYW4gZ3JhZmlrIGludGVyYWt0aWYNCmdyb3d0aF9wbG90X2ludGVyYWN0aXZlDQoNCmthYmxlKGhpZ2hlc3RfZ3Jvd3RoLCBjYXB0aW9uID0gIktvdGEgZGVuZ2FuIHBlcnR1bWJ1aGFuIHBlbmp1YWxhbiB0ZXJ0aW5nZ2k6IikNCg0Ka2FibGUobG93ZXN0X2dyb3d0aCwgY2FwdGlvbiA9ICJLb3RhIGRlbmdhbiBwZXJ0dW1idWhhbiBwZW5qdWFsYW4gdGVyZW5kYWg6IikNCmBgYA0KDQpCZXJkYXNhcmthbiBncmFmaWssIEpha2FydGEgbWVudW5qdWtrYW4gcGVydHVtYnVoYW4gcGVuanVhbGFuIHRlcnRpbmdnaSBzZWxhbWEgNSB0YWh1biwgdGVydXRhbWEga2FyZW5hIGxvbmpha2FuIHRhamFtIGRhcmkgdGFodW4gMjAyMSBrZSAyMDIyIHlhbmcga2VtdW5na2luYW4gZGlwZW5nYXJ1aGkgb2xlaCBwZW5pbmdrYXRhbiBzdHJhdGVnaSBwcm9tb3NpLCBkaXN0cmlidXNpIHlhbmcgbGViaWggYmFpaywgYXRhdSBwZW11bGloYW4gZWtvbm9taSBkaSB3aWxheWFoIHRlcnNlYnV0LiBTZWJhbGlrbnlhLCBCb2dvciBtZW5jYXRhdCBwZXJ0dW1idWhhbiB0ZXJlbmRhaCwgZGVuZ2FuIHRyZW4geWFuZyByZWxhdGlmIHN0YWduYW4gYXRhdSBtZW51cnVuIHNlbGFtYSBwZXJpb2RlIHRlcnNlYnV0LCB5YW5nIG11bmdraW4gZGlzZWJhYmthbiBvbGVoIGt1cmFuZ255YSBlZmVrdGl2aXRhcyBwcm9tb3NpLCBkaXN0cmlidXNpIHlhbmcgdGVyYmF0YXMsIGF0YXUgcGVyc2FpbmdhbiB5YW5nIGxlYmloIGtldGF0LiBIYWwgaW5pIG1lbnVuanVra2FuIGJhaHdhIGZva3VzIHBlbmluZ2thdGFuIGhhcnVzIGRpbGFrdWthbiBkaSBCb2dvciBkZW5nYW4gbWVtcGVya3VhdCBzdHJhdGVnaSBwZW1hc2FyYW4sIG1lbWFoYW1pIGtlYnV0dWhhbiBrb25zdW1lbiBsb2thbCwgZGFuIG1lbXBlcmx1YXMgamFuZ2thdWFuIGRpc3RyaWJ1c2kgcHJvZHVrLg0KDQojIyAyLjIgUG9sYSBUcmVuIGRhbiBNdXNpbWFuDQoNCiMjIyAyLjIuMSBBbmFsaXNpcyBwb2xhIHRyZW4gcGVuanVhbGFuIHRhaHVuYW46IGFwYWthaCBhZGEgcG9sYSBwZW5pbmdrYXRhbiBhdGF1IHBlbnVydW5hbiBzaWduaWZpa2FuPw0KYGBge3IgdHJlbmQtYW5hbHlzaXMsIGluY2x1ZGU9VFJVRSwgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSkNCmxpYnJhcnkoZHBseXIpDQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KGtuaXRyKQ0KbGlicmFyeShwbG90bHkpICMgVGFtYmFoa2FuIGxpYnJhcnkgcGxvdGx5IHVudHVrIGludGVyYWt0aXZpdGFzDQoNCiMgTG9hZCBkYXRhDQpkYXRhIDwtIHJlYWQuY3N2KCJQZW5qdWFsYW5fQUJDX0pBQk9ERVRBQkVLLmNzdiIpDQoNCiMgSGl0dW5nIHRvdGFsIHBlbmp1YWxhbiBwZXIgdGFodW4NCnRyZW5kX2RhdGEgPC0gZGF0YSAlPiUNCiAgZ3JvdXBfYnkoVGFodW4pICU+JQ0KICBzdW1tYXJpc2UoVG90YWxfUGVuanVhbGFuID0gc3VtKFBlbmp1YWxhbi4udW5pdC4pKQ0KDQojIEJ1YXQgZ3JhZmlrIHRyZW4gcGVuanVhbGFuIGRlbmdhbiBwbG90bHkNCnRyZW5kX3Bsb3QgPC0gZ2dwbG90KHRyZW5kX2RhdGEsIGFlcyh4ID0gVGFodW4sIHkgPSBUb3RhbF9QZW5qdWFsYW4pKSArDQogIGdlb21fbGluZShjb2xvciA9ICJzdGVlbGJsdWUiLCBzaXplID0gMSkgKw0KICBnZW9tX3BvaW50KGNvbG9yID0gImRhcmtibHVlIiwgc2l6ZSA9IDIpICsNCiAgbGFicygNCiAgICB0aXRsZSA9ICJQb2xhIFRyZW4gUGVuanVhbGFuIFRhaHVuYW4iLA0KICAgIHggPSAiVGFodW4iLA0KICAgIHkgPSAiVG90YWwgUGVuanVhbGFuIg0KICApICsNCiAgdGhlbWVfbWluaW1hbCgpDQoNCiMgS29udmVyc2kgZ2dwbG90IG1lbmphZGkgcGxvdGx5IHVudHVrIGludGVyYWt0aXZpdGFzDQp0cmVuZF9wbG90X2ludGVyYWN0aXZlIDwtIGdncGxvdGx5KHRyZW5kX3Bsb3QpDQoNCiMgTGluZSBjaGFydCB1bnR1ayB0cmVuIHBlbmp1YWxhbiBwZXIgdGFodW4gcGVyIGtvdGENCmNpdHlfdHJlbmRfZGF0YSA8LSBkYXRhICU+JQ0KICBncm91cF9ieShUYWh1biwgS290YSkgJT4lDQogIHN1bW1hcmlzZShUb3RhbF9QZW5qdWFsYW4gPSBzdW0oUGVuanVhbGFuLi51bml0LikpDQoNCmNpdHlfdHJlbmRfcGxvdCA8LSBnZ3Bsb3QoY2l0eV90cmVuZF9kYXRhLCBhZXMoeCA9IFRhaHVuLCB5ID0gVG90YWxfUGVuanVhbGFuLCBjb2xvciA9IEtvdGEsIGdyb3VwID0gS290YSkpICsNCiAgZ2VvbV9saW5lKHNpemUgPSAxKSArDQogIGdlb21fcG9pbnQoc2l6ZSA9IDIpICsNCiAgbGFicygNCiAgICB0aXRsZSA9ICJUcmVuIFBlbmp1YWxhbiBwZXIgS290YSBTZWxhbWEgNSBUYWh1biIsDQogICAgeCA9ICJUYWh1biIsDQogICAgeSA9ICJUb3RhbCBQZW5qdWFsYW4iLA0KICAgIGNvbG9yID0gIktvdGEiDQogICkgKw0KICB0aGVtZV9taW5pbWFsKCkNCg0KIyBLb252ZXJzaSBnZ3Bsb3QgbWVuamFkaSBwbG90bHkgdW50dWsgaW50ZXJha3Rpdml0YXMNCmNpdHlfdHJlbmRfcGxvdF9pbnRlcmFjdGl2ZSA8LSBnZ3Bsb3RseShjaXR5X3RyZW5kX3Bsb3QpDQoNCiMgVGFtcGlsa2FuIGdyYWZpayBpbnRlcmFrdGlmDQprYWJsZShjaXR5X3RyZW5kX2RhdGEsIGNhcHRpb24gPSAiVG90YWwgcGVuanVhbGFuIHBlciB0YWh1biBwZXIga290YSIpDQpjaXR5X3RyZW5kX3Bsb3RfaW50ZXJhY3RpdmUNCmthYmxlKHRyZW5kX2RhdGEsIGNhcHRpb24gPSAiVG90YWwgUGVuanVhbGFuIHBlciBUYWh1biIpDQp0cmVuZF9wbG90X2ludGVyYWN0aXZlDQoNCmBgYA0KDQpHcmFmaWsgOg0KDQoxLiBKYWthcnRhOg0KDQotIFBlbmp1YWxhbiBtZW5nYWxhbWkgbG9uamFrYW4gc2lnbmlmaWthbiBwYWRhIHRhaHVuIDIwMjEgaGluZ2dhIDIwMjIsIG1lbnVuanVra2FuIHBlcnR1bWJ1aGFuIHlhbmcgc2FuZ2F0IHBlc2F0Lg0KDQotIFBvbGEgaW5pIG1lbmNlcm1pbmthbiBrZWJlcmhhc2lsYW4gc3RyYXRlZ2kgeWFuZyBkaXRlcmFwa2FuIHBhZGEgdGFodW4gdGVyc2VidXQsIGtlbXVuZ2tpbmFuIGJlcnVwYSBwcm9tb3NpIGJlc2FyIGF0YXUgcGVtdWxpaGFuIGVrb25vbWkgeWFuZyBsZWJpaCBrdWF0IGRpIEpha2FydGEuDQoNCjIuIERlcG9rOg0KDQotIFBlbmp1YWxhbiBzdGFiaWwgdGluZ2dpIGRhcmkgMjAxOCBoaW5nZ2EgMjAxOSwga2VtdWRpYW4gbWVudXJ1biBwYWRhIDIwMjAsIGRhbiBrZW1iYWxpIG1lbmluZ2thdCBzZXRlbGFoIDIwMjEuDQoNCi0gRGVwb2sgbWVudW5qdWtrYW4ga2luZXJqYSB5YW5nIGtvbnNpc3RlbiB0ZXRhcGkgbWVuZ2FsYW1pIHNlZGlraXQgZmx1a3R1YXNpLg0KDQozLiBCZWthc2k6DQoNCi0gUGVuanVhbGFuIGNlbmRlcnVuZyBzdGFiaWwgZGFyaSAyMDE4IGhpbmdnYSAyMDIxLCBkaWlrdXRpIG9sZWggcGVuaW5na2F0YW4gbW9kZXJhdCBwYWRhIDIwMjIuDQoNCi0gUG9sYSBpbmkgbWVudW5qdWtrYW4gc3RhYmlsaXRhcyBwYXNhciBkaSBCZWthc2kgdGFucGEgcGVydWJhaGFuIGJlc2FyLg0KDQo0LiBUYW5nZXJhbmc6DQoNClBlbmp1YWxhbiBzZWRpa2l0IG1lbnVydW4gZGFyaSAyMDE4IGtlIDIwMjAsIGxhbHUgbWVuZ2FsYW1pIHBlbmluZ2thdGFuIG1vZGVyYXQgbXVsYWkgMjAyMS4gSW5pIG1lbmNlcm1pbmthbiBhZGFueWEgcG90ZW5zaSBwZW11bGloYW4gZGkgcGFzYXIgVGFuZ2VyYW5nLg0KDQo1LiBCb2dvcjoNCg0KLSBQZW51cnVuYW4gdGFqYW0gcGFkYSB0YWh1biAyMDIyIHNldGVsYWggc3RhYmlsIGRpIHRhaHVuLXRhaHVuIHNlYmVsdW1ueWEsIG1lbmphZGlrYW5ueWEgc2F0dS1zYXR1bnlhIGtvdGEgZGVuZ2FuIHRyZW4gbmVnYXRpZi4NCg0KLSBQZW51cnVuYW4gaW5pIG1lbmdpbmRpa2FzaWthbiBwZXJsdW55YSBwZXJoYXRpYW4gc2VyaXVzLCBzZXBlcnRpIGV2YWx1YXNpIGRpc3RyaWJ1c2ksIHByb21vc2ksIGF0YXUgcHJvZHVrIHlhbmcgc2VzdWFpIGRlbmdhbiBwYXNhciBCb2dvci4NCg0KS2VzaW1wdWxhbjogSmFrYXJ0YSBtZW51bmp1a2thbiBwb2xhIHBlcnR1bWJ1aGFuIHlhbmcgc2lnbmlmaWthbiwgc2VtZW50YXJhIEJvZ29yIG1lbWlsaWtpIHBvbGEgcGVudXJ1bmFuIHRhamFtIHlhbmcgbWVtYnV0dWhrYW4gc3RyYXRlZ2kgcGVtdWxpaGFuLiBLb3RhIGxhaW4gbWVudW5qdWtrYW4gZmx1a3R1YXNpIHJpbmdhbiBhdGF1IHN0YWJpbGl0YXMgeWFuZyBkYXBhdCBkaXRpbmdrYXRrYW4gbWVsYWx1aSBpbm92YXNpIGRhbiBwcm9tb3NpIHRhbWJhaGFuLg0KDQojIyMgMi4yLjIgQW5hbGlzaXMgbXVzaW1hbiAoc2Vhc29uYWwpOiBhcGFrYWggYWRhIGJ1bGFuIGF0YXUga3VhcnRhbCBkZW5nYW4gcGVuaW5na2F0YW4gcGVuanVhbGFuIGRpIHNlbXVhIGtvdGE/DQpgYGB7ciB2aXN1YWxpemUtZ3Jvd3RoLCBpbmNsdWRlPVRSVUUsIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGZpZy53aWR0aD04LCBmaWcuaGVpZ2h0PTV9DQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUpDQpsaWJyYXJ5KGRwbHlyKQ0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShrbml0cikNCmxpYnJhcnkocGxvdGx5KSAjIFRhbWJhaGthbiBsaWJyYXJ5IHBsb3RseSB1bnR1ayBpbnRlcmFrdGl2aXRhcw0KDQojIExvYWQgZGF0YQ0KZGF0YSA8LSByZWFkLmNzdigiUGVuanVhbGFuX0FCQ19KQUJPREVUQUJFSy5jc3YiKQ0KDQojIFRhbWJhaGthbiBrb2xvbSBrdWFydGFsDQpkYXRhIDwtIGRhdGEgJT4lDQogIG11dGF0ZSgNCiAgICBCdWxhbiA9IGZhY3RvcihCdWxhbiwgbGV2ZWxzID0gYygiSmFuIiwgIkZlYiIsICJNYXIiLCAiQXByIiwgIk1heSIsICJKdW4iLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSnVsIiwgIkF1ZyIsICJTZXAiLCAiT2N0IiwgIk5vdiIsICJEZWMiKSksDQogICAgS3VhcnRhbCA9IGNhc2Vfd2hlbigNCiAgICAgIEJ1bGFuICVpbiUgYygiSmFuIiwgIkZlYiIsICJNYXIiKSB+ICJRMSIsDQogICAgICBCdWxhbiAlaW4lIGMoIkFwciIsICJNYXkiLCAiSnVuIikgfiAiUTIiLA0KICAgICAgQnVsYW4gJWluJSBjKCJKdWwiLCAiQXVnIiwgIlNlcCIpIH4gIlEzIiwNCiAgICAgIEJ1bGFuICVpbiUgYygiT2N0IiwgIk5vdiIsICJEZWMiKSB+ICJRNCINCiAgICApDQogICkNCg0KIyBIaXR1bmcgdG90YWwgcGVuanVhbGFuIHBlciBidWxhbiBwZXIga290YQ0Kc2Vhc29uYWxfZGF0YV9tb250aCA8LSBkYXRhICU+JQ0KICBncm91cF9ieShCdWxhbiwgS290YSkgJT4lDQogIHN1bW1hcmlzZShUb3RhbF9QZW5qdWFsYW4gPSBzdW0oUGVuanVhbGFuLi51bml0LikpICU+JQ0KICB1bmdyb3VwKCkNCg0KIyBIaXR1bmcgdG90YWwgcGVuanVhbGFuIHBlciBrdWFydGFsIHBlciBrb3RhDQpzZWFzb25hbF9kYXRhX3F1YXJ0ZXIgPC0gZGF0YSAlPiUNCiAgZ3JvdXBfYnkoS3VhcnRhbCwgS290YSkgJT4lDQogIHN1bW1hcmlzZShUb3RhbF9QZW5qdWFsYW4gPSBzdW0oUGVuanVhbGFuLi51bml0LikpICU+JQ0KICB1bmdyb3VwKCkNCg0KIyBUYW1waWxrYW4gdGFiZWwgaGFzaWwgdW50dWsgYnVsYW4NCmthYmxlKGhlYWQoc2Vhc29uYWxfZGF0YV9tb250aCksIGNhcHRpb24gPSAiVG90YWwgUGVuanVhbGFuIHBlciBCdWxhbiBwZXIgS290YSIpDQoNCiMgVGFtcGlsa2FuIHRhYmVsIGhhc2lsIHVudHVrIGt1YXJ0YWwNCmthYmxlKHNlYXNvbmFsX2RhdGFfcXVhcnRlciwgY2FwdGlvbiA9ICJUb3RhbCBQZW5qdWFsYW4gcGVyIEt1YXJ0YWwgcGVyIEtvdGEiKQ0KDQojIEJ1YXQgZ3JhZmlrIGdhcmlzIHBlbmp1YWxhbiBwZXIgYnVsYW4gaW50ZXJha3RpZg0KbW9udGhfcGxvdCA8LSBnZ3Bsb3Qoc2Vhc29uYWxfZGF0YV9tb250aCwgYWVzKHggPSBCdWxhbiwgeSA9IFRvdGFsX1Blbmp1YWxhbiwgY29sb3IgPSBLb3RhLCBncm91cCA9IEtvdGEpKSArDQogIGdlb21fbGluZShzaXplID0gMSkgKw0KICBnZW9tX3BvaW50KHNpemUgPSAyKSArDQogIGxhYnMoDQogICAgdGl0bGUgPSAiUGVuanVhbGFuIHBlciBCdWxhbiIsDQogICAgeCA9ICJCdWxhbiIsDQogICAgeSA9ICJUb3RhbCBQZW5qdWFsYW4iLA0KICAgIGNvbG9yID0gIktvdGEiDQogICkgKw0KICB0aGVtZV9taW5pbWFsKCkNCg0KbW9udGhfcGxvdF9pbnRlcmFjdGl2ZSA8LSBnZ3Bsb3RseShtb250aF9wbG90KQ0KDQojIEJ1YXQgZ3JhZmlrIGdhcmlzIHBlbmp1YWxhbiBwZXIga3VhcnRhbCBpbnRlcmFrdGlmDQpxdWFydGVyX3Bsb3QgPC0gZ2dwbG90KHNlYXNvbmFsX2RhdGFfcXVhcnRlciwgYWVzKHggPSBLdWFydGFsLCB5ID0gVG90YWxfUGVuanVhbGFuLCBjb2xvciA9IEtvdGEsIGdyb3VwID0gS290YSkpICsNCiAgZ2VvbV9saW5lKHNpemUgPSAxKSArDQogIGdlb21fcG9pbnQoc2l6ZSA9IDIpICsNCiAgbGFicygNCiAgICB0aXRsZSA9ICJQZW5qdWFsYW4gcGVyIEt1YXJ0YWwiLA0KICAgIHggPSAiS3VhcnRhbCIsDQogICAgeSA9ICJUb3RhbCBQZW5qdWFsYW4iLA0KICAgIGNvbG9yID0gIktvdGEiDQogICkgKw0KICB0aGVtZV9taW5pbWFsKCkNCg0KcXVhcnRlcl9wbG90X2ludGVyYWN0aXZlIDwtIGdncGxvdGx5KHF1YXJ0ZXJfcGxvdCkNCg0KIyBUYW1waWxrYW4gZ3JhZmlrIGludGVyYWt0aWYNCm1vbnRoX3Bsb3RfaW50ZXJhY3RpdmUNCnF1YXJ0ZXJfcGxvdF9pbnRlcmFjdGl2ZQ0KYGBgDQoNCkFuYWxpc2lzIG11c2ltYW4gYmVyZGFzYXJrYW4gZ3JhZmlrIHBlbmp1YWxhbiBwZXIgcXVhcnRhbDoNCg0KLSBLdWFydGFsIDEgKFExKToNClBlbmp1YWxhbiBkaSBhd2FsIHRhaHVuIGNlbmRlcnVuZyBsZWJpaCByZW5kYWggYXRhdSBzdGFiaWwgZGkgc2ViYWdpYW4gYmVzYXIga290YSwgbWVudW5qdWtrYW4gcG9sYSBrb25zdW1zaSB5YW5nIGxhbWJhdCBzZXRlbGFoIHBlcmlvZGUgYWtoaXIgdGFodW4sIGRlbmdhbiBCb2dvciBtZW5jYXRhdCBwZW5qdWFsYW4gcGFsaW5nIHJlbmRhaCBkaWJhbmRpbmdrYW4ga290YSBsYWlubnlhLg0KDQotIEt1YXJ0YWwgMiAoUTIpOg0KUGVuanVhbGFuIG11bGFpIG1lbmluZ2thdCBkaSBiZWJlcmFwYSBrb3RhLCB0ZXJ1dGFtYSBEZXBvayB5YW5nIG1lbmNhcGFpIHB1bmNha255YSBwYWRhIGt1YXJ0YWwgaW5pLCBrZW11bmdraW5hbiBkaXBlbmdhcnVoaSBvbGVoIG1vbWVuIHRlcnRlbnR1IHNlcGVydGkgcHJvbW9zaSBwYXNjYS1MZWJhcmFuIGF0YXUgcGVuaW5na2F0YW4gYWt0aXZpdGFzIGJlbGFuamEgcGFkYSBwZXJpb2RlIGluaS4NCg0KLSBLdWFydGFsIDMgKFEzKToNClNlYmFnaWFuIGJlc2FyIGtvdGEsIHRlcnV0YW1hIEpha2FydGEsIG1lbmdhbGFtaSBwZW51cnVuYW4gcGVuanVhbGFuLCB5YW5nIGRhcGF0IGRpc2ViYWJrYW4gb2xlaCBqZWRhIG11c2ltYW4sIHBlbmdlbHVhcmFuIGtvbnN1bWVuIHlhbmcgbGViaWggcmVuZGFoLCBhdGF1IGZha3RvciBla29ub21pIGxhaW5ueWEgeWFuZyBtZW1lbmdhcnVoaSBkYXlhIGJlbGkuDQoNCi0gS3VhcnRhbCA0IChRNCk6DQpTZW11YSBrb3RhIG1lbnVuanVra2FuIHBlbmluZ2thdGFuIHNpZ25pZmlrYW4sIGRlbmdhbiBKYWthcnRhIGRhbiBEZXBvayBtZW5nYWxhbWkgbG9uamFrYW4geWFuZyBwYWxpbmcgdGFqYW0sIG1lbnVuanVra2FuIHBvdGVuc2kga3VhdCBkYXJpIHBlcmlvZGUgaW5pLCBrZW11bmdraW5hbiBkaWRvcm9uZyBvbGVoIHByb21vc2kgYWtoaXIgdGFodW4sIG11c2ltIGxpYnVyYW4sIGRhbiBwZW5pbmdrYXRhbiBrb25zdW1zaSBtYXN5YXJha2F0Lg0KDQpEaXNpbmkgS3VhcnRhbCA0IG1lbmphZGkgcGVyaW9kZSBwYWxpbmcgcGVudGluZyB1bnR1ayBtZW1ha3NpbWFsa2FuIHBlbmp1YWxhbiBkaSBzZW11YSBrb3RhLCBzZW1lbnRhcmEga3VhcnRhbCBsYWluIG1lbWVybHVrYW4gc3RyYXRlZ2kga2h1c3VzIHVudHVrIG1lbmphZ2Egc3RhYmlsaXRhcywgdGVydXRhbWEgcGFkYSBrdWFydGFsIDMgeWFuZyBjZW5kZXJ1bmcgbWVuZ2FsYW1pIHBlbnVydW5hbi4NCg0KIyMgMi4zIEFuYWxpc2lzIEtvcmVsYXNpDQoNCiMjIyMgMi4zLjEgQmlheWEgUHJvbW9zaSAoJCkgZGFuIFBlbmp1YWxhbiAodW5pdCkNCmBgYHtyIGNvcnJlbGF0aW9uLXByb21vdGlvbi1zYWxlcywgZWNobz1GQUxTRSwgaW5jbHVkZT1UUlVFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KIyBIaXR1bmcga29yZWxhc2kgUGVhcnNvbg0KY29ycmVsYXRpb25fcHJvbW90aW9uX3NhbGVzIDwtIGNvcihkYXRhJEJpYXlhLlByb21vc2kuLi4uLCBkYXRhJFBlbmp1YWxhbi4udW5pdC4sIHVzZSA9ICJjb21wbGV0ZS5vYnMiKQ0KDQojIEJ1YXQgc2NhdHRlciBwbG90IGludGVyYWt0aWYNCnBsb3RfcHJvbW90aW9uX3NhbGVzIDwtIGdncGxvdChkYXRhLCBhZXMoeCA9IEJpYXlhLlByb21vc2kuLi4uLCB5ID0gUGVuanVhbGFuLi51bml0LikpICsNCiAgZ2VvbV9wb2ludChjb2xvciA9ICJzdGVlbGJsdWUiLCBhbHBoYSA9IDAuNikgKw0KICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLCBjb2xvciA9ICJyZWQiLCBzZSA9IEZBTFNFKSArICMgVGFtYmFoa2FuIGdhcmlzIHJlZ3Jlc2kNCiAgbGFicygNCiAgICB0aXRsZSA9ICJIdWJ1bmdhbiBhbnRhcmEgQmlheWEgUHJvbW9zaSBkYW4gUGVuanVhbGFuIiwNCiAgICB4ID0gIkJpYXlhIFByb21vc2kgKCQpIiwNCiAgICB5ID0gIlBlbmp1YWxhbiAodW5pdCkiDQogICkgKw0KICB0aGVtZV9taW5pbWFsKCkNCg0KcGxvdF9wcm9tb3Rpb25fc2FsZXNfaW50ZXJhY3RpdmUgPC0gZ2dwbG90bHkocGxvdF9wcm9tb3Rpb25fc2FsZXMpDQoNCiMgVGFtcGlsa2FuIGhhc2lsDQpwbG90X3Byb21vdGlvbl9zYWxlc19pbnRlcmFjdGl2ZQ0KDQojIFRhbXBpbGthbiBuaWxhaSBrb3JlbGFzaQ0Ka2FibGUoZGF0YS5mcmFtZShLb3JlbGFzaSA9IGNvcnJlbGF0aW9uX3Byb21vdGlvbl9zYWxlcyksIGNhcHRpb24gPSAiS29yZWxhc2kgYW50YXJhIEJpYXlhIFByb21vc2kgZGFuIFBlbmp1YWxhbiIpDQpgYGANCg0KIyMjIDEuIEtvcmVsYXNpIFBlYXJzb24NCg0KUnVtdXMga29yZWxhc2kgUGVhcnNvbiBhZGFsYWggc2ViYWdhaSBiZXJpa3V0Og0KDQpcWw0KciA9IFxmcmFje1xzdW0gKFhfaSAtIFxiYXJ7WH0pKFlfaSAtIFxiYXJ7WX0pfXtcc3FydHtcc3VtIChYX2kgLSBcYmFye1h9KV4yIFxjZG90IFxzdW0gKFlfaSAtIFxiYXJ7WX0pXjJ9fQ0KXF0NCg0KIyMjIyAyLiBEYXRhDQpEaWJlcmlrYW4gZGF0YToNCg0KfCBCaWF5YSBQcm9tb3NpIChcKFhcKSkgfCBQZW5qdWFsYW4gKFwoWVwpKSB8DQp8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLXwNCnwgMTY2MCAgICAgICAgICAgICAgICAgfCAxMDM5MiAgICAgICAgICAgIHwNCnwgOTMwICAgICAgICAgICAgICAgICAgfCAxMTM5NCAgICAgICAgICAgIHwNCnwgMjAxNSAgICAgICAgICAgICAgICAgfCA5NDAwICAgICAgICAgICAgIHwNCnwgMTg4MiAgICAgICAgICAgICAgICAgfCA0NDc1ICAgICAgICAgICAgIHwNCnwgMTM2MiAgICAgICAgICAgICAgICAgfCA3MjExICAgICAgICAgICAgIHwNCg0KIyMjIyAzLiBMYW5na2FoIFBlcmhpdHVuZ2FuDQoNCjEuICpIaXR1bmcgcmF0YS1yYXRhIFwoXGJhcntYfVwpIGRhbiBcKFxiYXJ7WX1cKToqDQoNClxbDQpcYmFye1h9ID0gXGZyYWN7MTY2MCArIDkzMCArIDIwMTUgKyAxODgyICsgMTM2Mn17NX0gPSAxNTY5LjgNClxdDQoNClxbDQpcYmFye1l9ID0gXGZyYWN7MTAzOTIgKyAxMTM5NCArIDk0MDAgKyA0NDc1ICsgNzIxMX17NX0gPSA4NTc0LjQNClxdDQoNCjIuICpIaXR1bmcgc2VsaXNpaCB0aWFwIG5pbGFpIHRlcmhhZGFwIHJhdGEtcmF0YSAoXChYX2kgLSBcYmFye1h9XCksIFwoWV9pIC0gXGJhcntZfVwpKToqDQoNClxbDQpcRGVsdGEgWCA9IFs5MC4yLCAtNjM5LjgsIDQ0NS4yLCAzMTIuMiwgLTIwNy44XQ0KXF0NCg0KXFsNClxEZWx0YSBZID0gWzE4MTcuNiwgMjgxOS42LCA4MjUuNiwgLTQwOTkuNCwgLTEzNjMuNF0NClxdDQoNCjMuICpIaXR1bmcgcGVya2FsaWFuIHNlbGlzaWggXCgoXERlbHRhIFgpKFxEZWx0YSBZKVwpOioNCg0KXFsNCihcRGVsdGEgWCkoXERlbHRhIFkpID0gWzE2Mzk0Ny41MiwgLTE4MDM5ODAuMDgsIDM2NzU1Ny4xMiwgLTEyNzk4MzIuNjgsIDI4MzMxNC41Ml0NClxdDQoNClxbDQpcc3VtIChcRGVsdGEgWCkoXERlbHRhIFkpID0gLTE4NzI5OTMuNg0KXF0NCg0KNC4gKkhpdHVuZyBrdWFkcmF0IHNlbGlzaWggXCgoXERlbHRhIFgpXjJcKSBkYW4gXCgoXERlbHRhIFkpXjJcKToqDQoNClxbDQooXERlbHRhIFgpXjIgPSBbODEzNi4wNCwgNDA5MzQ0LjA0LCAxOTgyMDMuMDQsIDk3NDY4Ljg0LCA0MzE4MC44NF0NClxdDQoNClxbDQpcc3VtIChcRGVsdGEgWCleMiA9IDExNTIzMzIuOA0KXF0NCg0KXFsNCihcRGVsdGEgWSleMiA9IFszMzAzNjY5Ljc2LCA3OTUwMTQ0LjE2LCA2ODE2MTUuMzYsIDE2ODA1MDgwLjM2LCAxODU4ODU5LjU2XQ0KXF0NCg0KXFsNClxzdW0gKFxEZWx0YSBZKV4yID0gMzA1NTIzNjkuMg0KXF0NCg0KNS4gKlN1YnN0aXR1c2kga2UgZGFsYW0gcnVtdXM6Kg0KDQpcWw0KciA9IFxmcmFjey0xODcyOTkzLjZ9e1xzcXJ0ezExNTIzMzIuOCBcY2RvdCAzMDU1MjM2OS4yfX0NClxdDQoNClxbDQpyID0gXGZyYWN7LTE4NzI5OTMuNn17NTk2NzU2OC45M30gPSAtMC40NzINClxdDQoNCiMjIyMgSGFzaWwgS29yZWxhc2k6DQpLb3JlbGFzaSBQZWFyc29uIGFudGFyYSBCaWF5YSBQcm9tb3NpICgkKSBkYW4gUGVuanVhbGFuICh1bml0KTog8J2Rnz3iiJIwLjQ3Mg0KSHVidW5nYW4gaW5pIGFkYWxhaCBuZWdhdGlmIHNlZGFuZywgbWVudW5qdWtrYW4gYmFod2Egc2FhdCBiaWF5YSBwcm9tb3NpIG1lbmluZ2thdCwgcGVuanVhbGFuIGNlbmRlcnVuZyBtZW51cnVuIGRhbGFtIGRhdGFzZXQgaW5pLg0KDQojIyMjIDIuMy4yIERpc2tvbiAoJSkgZGFuIFJhdGluZyBQZWxhbmdnYW4NCmBgYHtyIGNvcnJlbGF0aW9uLWRpc2NvdW50LXJhdGluZywgZWNobz1GQUxTRSwgaW5jbHVkZT1UUlVFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KIyBIaXR1bmcga29yZWxhc2kgUGVhcnNvbg0KY29ycmVsYXRpb25fZGlzY291bnRfcmF0aW5nIDwtIGNvcihkYXRhJERpc2tvbi4uLi4sIGRhdGEkUmF0aW5nLlBlbGFuZ2dhbi4uMS41LiwgdXNlID0gImNvbXBsZXRlLm9icyIpDQoNCiMgQnVhdCBzY2F0dGVyIHBsb3QgaW50ZXJha3RpZg0KcGxvdF9kaXNjb3VudF9yYXRpbmcgPC0gZ2dwbG90KGRhdGEsIGFlcyh4ID0gRGlza29uLi4uLiwgeSA9IFJhdGluZy5QZWxhbmdnYW4uLjEuNS4pKSArDQogIGdlb21fcG9pbnQoY29sb3IgPSAiZGFya29yYW5nZSIsIGFscGhhID0gMC42KSArDQogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIGNvbG9yID0gImJsdWUiLCBzZSA9IEZBTFNFKSArICMgVGFtYmFoa2FuIGdhcmlzIHJlZ3Jlc2kNCiAgbGFicygNCiAgICB0aXRsZSA9ICJIdWJ1bmdhbiBhbnRhcmEgRGlza29uIGRhbiBSYXRpbmcgUGVsYW5nZ2FuIiwNCiAgICB4ID0gIkRpc2tvbiAoJSkiLA0KICAgIHkgPSAiUmF0aW5nIFBlbGFuZ2dhbiINCiAgKSArDQogIHRoZW1lX21pbmltYWwoKQ0KDQpwbG90X2Rpc2NvdW50X3JhdGluZ19pbnRlcmFjdGl2ZSA8LSBnZ3Bsb3RseShwbG90X2Rpc2NvdW50X3JhdGluZykNCg0KIyBUYW1waWxrYW4gaGFzaWwNCnBsb3RfZGlzY291bnRfcmF0aW5nX2ludGVyYWN0aXZlDQoNCiMgVGFtcGlsa2FuIG5pbGFpIGtvcmVsYXNpDQprYWJsZShkYXRhLmZyYW1lKEtvcmVsYXNpID0gY29ycmVsYXRpb25fZGlzY291bnRfcmF0aW5nKSwgY2FwdGlvbiA9ICJLb3JlbGFzaSBhbnRhcmEgRGlza29uIGRhbiBSYXRpbmcgUGVsYW5nZ2FuIikNCmBgYA0KDQojIyMgS29yZWxhc2kgUGVhcnNvbg0KDQpSdW11cyBrb3JlbGFzaSBQZWFyc29uIGFkYWxhaCBzZWJhZ2FpIGJlcmlrdXQ6DQoNClxbDQpyID0gXGZyYWN7XHN1bSAoWF9pIC0gXGJhcntYfSkoWV9pIC0gXGJhcntZfSl9e1xzcXJ0e1xzdW0gKFhfaSAtIFxiYXJ7WH0pXjIgXGNkb3QgXHN1bSAoWV9pIC0gXGJhcntZfSleMn19DQpcXQ0KDQojIyMgRGF0YQ0KRGliZXJpa2FuIGRhdGE6DQoNCnwgRGlza29uIChcKFhcKSkgfCBSYXRpbmcgUGVsYW5nZ2FuIChcKFlcKSkgfA0KfC0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfA0KfCAxMCAgICAgICAgICAgICAgfCA0LjUgICAgICAgICAgICAgICAgICAgICAgfA0KfCAxNSAgICAgICAgICAgICAgfCA0LjcgICAgICAgICAgICAgICAgICAgICAgfA0KfCAyMCAgICAgICAgICAgICAgfCA0LjMgICAgICAgICAgICAgICAgICAgICAgfA0KfCAyNSAgICAgICAgICAgICAgfCA0LjAgICAgICAgICAgICAgICAgICAgICAgfA0KfCAzMCAgICAgICAgICAgICAgfCA0LjIgICAgICAgICAgICAgICAgICAgICAgfA0KDQojIyMgTGFuZ2thaCBQZXJoaXR1bmdhbg0KDQoxLiAqSGl0dW5nIHJhdGEtcmF0YSBcKFxiYXJ7WH1cKSBkYW4gXChcYmFye1l9XCk6Kg0KDQpcWw0KXGJhcntYfSA9IFxmcmFjezEwICsgMTUgKyAyMCArIDI1ICsgMzB9ezV9ID0gXGZyYWN7MTAwfXs1fSA9IDIwDQpcXQ0KDQpcWw0KXGJhcntZfSA9IFxmcmFjezQuNSArIDQuNyArIDQuMyArIDQuMCArIDQuMn17NX0gPSBcZnJhY3syMS43fXs1fSA9IDQuMzQNClxdDQoNCjIuICpIaXR1bmcgc2VsaXNpaCB0aWFwIG5pbGFpIHRlcmhhZGFwIHJhdGEtcmF0YSAoXChYX2kgLSBcYmFye1h9XCksIFwoWV9pIC0gXGJhcntZfVwpKToqDQoNClxbDQpcRGVsdGEgWCA9IFstMTAsIC01LCAwLCA1LCAxMF0NClxdDQoNClxbDQpcRGVsdGEgWSA9IFswLjE2LCAwLjM2LCAtMC4wNCwgLTAuMzQsIC0wLjE0XQ0KXF0NCg0KMy4gKkhpdHVuZyBwZXJrYWxpYW4gc2VsaXNpaCBcKChcRGVsdGEgWCkoXERlbHRhIFkpXCk6Kg0KDQpcWw0KKFxEZWx0YSBYKShcRGVsdGEgWSkgPSBbLTEuNiwgLTEuOCwgMCwgLTEuNywgLTEuNF0NClxdDQoNClxbDQpcc3VtIChcRGVsdGEgWCkoXERlbHRhIFkpID0gLTEuNiAtIDEuOCArIDAgLSAxLjcgLSAxLjQgPSAtNi41DQpcXQ0KDQo0LiAqSGl0dW5nIGt1YWRyYXQgc2VsaXNpaCBcKChcRGVsdGEgWCleMlwpIGRhbiBcKChcRGVsdGEgWSleMlwpOioNCg0KXFsNCihcRGVsdGEgWCleMiA9IFsxMDAsIDI1LCAwLCAyNSwgMTAwXQ0KXF0NCg0KXFsNClxzdW0gKFxEZWx0YSBYKV4yID0gMTAwICsgMjUgKyAwICsgMjUgKyAxMDAgPSAyNTANClxdDQoNClxbDQooXERlbHRhIFkpXjIgPSBbMC4wMjU2LCAwLjEyOTYsIDAuMDAxNiwgMC4xMTU2LCAwLjAxOTZdDQpcXQ0KDQpcWw0KXHN1bSAoXERlbHRhIFkpXjIgPSAwLjAyNTYgKyAwLjEyOTYgKyAwLjAwMTYgKyAwLjExNTYgKyAwLjAxOTYgPSAwLjI5Mg0KXF0NCg0KNS4gKlN1YnN0aXR1c2kga2UgZGFsYW0gcnVtdXM6Kg0KDQpcWw0KciA9IFxmcmFjey02LjV9e1xzcXJ0ezI1MCBcdGltZXMgMC4yOTJ9fSA9IFxmcmFjey02LjV9e1xzcXJ0ezczfX0gPSBcZnJhY3stNi41fXs4LjU0NH0gPSAtMC43NjENClxdDQoNCiMjIyBIYXNpbA0KS29yZWxhc2kgUGVhcnNvbiBhbnRhcmEgRGlza29uICglKSBkYW4gUmF0aW5nIFBlbGFuZ2dhbjoNCg0KXFsNCnIgPSAtMC43NjENClxdDQoNCkh1YnVuZ2FuIGluaSBjdWt1cCBrdWF0IGRhbiBuZWdhdGlmLCBtZW51bmp1a2thbiBiYWh3YSBzYWF0IGRpc2tvbiBtZW5pbmdrYXQsIHJhdGluZyBwZWxhbmdnYW4gY2VuZGVydW5nIG1lbnVydW4uDQoNCiMjIDIuNCBVamkgSGlwb3Rlc2lzDQoNCiMjIyMgSGlwb3Rlc2lzDQotIEgwOiBUaWRhayBhZGEgaHVidW5nYW4gYW50YXJhIEJpYXlhIFByb21vc2kgKCQpIGRhbiBQZW5qdWFsYW4gKHVuaXQpLg0KLSBIMTogQWRhIGh1YnVuZ2FuIGFudGFyYSBCaWF5YSBQcm9tb3NpICgkKSBkYW4gUGVuanVhbGFuICh1bml0KS4NCg0KYGBge3IgaHlwb3RoZXNpcy10ZXN0aW5nLCBlY2hvPUZBTFNFLCBpbmNsdWRlPVRSVUUsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQojIEhpdHVuZyB1amkga29yZWxhc2kgUGVhcnNvbg0KY29yX3Rlc3QgPC0gY29yLnRlc3QoZGF0YSRCaWF5YS5Qcm9tb3NpLi4uLiwgZGF0YSRQZW5qdWFsYW4uLnVuaXQuLCBtZXRob2QgPSAicGVhcnNvbiIpDQoNCiMgVGFtcGlsa2FuIGhhc2lsIHVqaSBoaXBvdGVzaXMNCmthYmxlKGRhdGEuZnJhbWUoDQogIFN0YXRpc3Rpa190ID0gY29yX3Rlc3Qkc3RhdGlzdGljLA0KICBkZiA9IGNvcl90ZXN0JHBhcmFtZXRlciwNCiAgcF92YWx1ZSA9IGNvcl90ZXN0JHAudmFsdWUsDQogIEtvcmVsYXNpID0gY29yX3Rlc3QkZXN0aW1hdGUNCiksIGNhcHRpb24gPSAiSGFzaWwgVWppIEhpcG90ZXNpcyBQZWFyc29uIGFudGFyYSBCaWF5YSBQcm9tb3NpIGRhbiBQZW5qdWFsYW4iKQ0KDQojIEludGVycHJldGFzaSBoYXNpbA0KaWYgKGNvcl90ZXN0JHAudmFsdWUgPCAwLjA1KSB7DQogIGNhdCgiSGFzaWw6IFRvbGFrIEgwLiBBZGEgaHVidW5nYW4geWFuZyBzaWduaWZpa2FuIGFudGFyYSBCaWF5YSBQcm9tb3NpIGRhbiBQZW5qdWFsYW4uXG4iKQ0KfSBlbHNlIHsNCiAgY2F0KCJIYXNpbDogR2FnYWwgbWVub2xhayBIMC4gVGlkYWsgYWRhIGh1YnVuZ2FuIHlhbmcgc2lnbmlmaWthbiBhbnRhcmEgQmlheWEgUHJvbW9zaSBkYW4gUGVuanVhbGFuLlxuIikNCn0NCmBgYA0KDQojIyMjIyBSdW11cyBQZWFyc29uIENvcnJlbGF0aW9uDQoNCktvcmVsYXNpIFBlYXJzb24gJChyKSQgZGloaXR1bmcgZGVuZ2FuOg0KDQokJA0KciA9IFxmcmFjIHtcc3VtKFhfaSAtIFxiYXIgWCkoWV9pIC0gXGJhciBZKX17XHNxcnQgXHN1bSAoWF9pIC0gXGJhciBYKV4yIFxzdW0oWV9pIC0gXGJhciBZKV4yfQ0KJCQNCg0KLSAkWF9pJCBkYW4gJFlfaSQ6IE5pbGFpIGluZGl2aWR1YWwgZGFyaSBCaWF5YSBQcm9tb3NpIGRhbiBQZW5qdWFsYW4uDQotICRcYmFyIFgkIGRhbiAkXGJhciBZJDogUmF0YS1yYXRhIG1hc2luZy1tYXNpbmcgdmFyaWFiZWwuDQoNCiMjIyMjIFJ1bXVzIFN0YXRpc3RpayB0IHVudHVrIGtvcmVsYXNpDQoNClVudHVrIG1lbmd1amkgYXBha2FoICRyJCBzaWduaWZpa2FuLCBndW5ha2FuOg0KDQokJA0KdCA9IFxmcmFjIHtyXHNxcnQgbiAtIDJ9e1xzcXJ0IDEgLSByXjJ9DQokJA0KDQotICRuJCA6IFVrdXJhbiBzYW1wZWwNCi0gJHIkIDogS29lZmlzaWVuIFJlZ3Jlc2kNCg0KTGFuZ2thaCBQZXJoaXR1bmdhbg0KDQoxLiBIaXR1bmcgJHIkOiBTdWJzdGl0dXNpIGRhdGEgYmlheWEgcHJvbW9zaSAkKFgpJCBkYW4gcGVuanVhbGFuICQoWSkkIGtlIGRhbGFtIHJ1bXVzIGtvcmVsYXNpIHBlYXJzb24NCg0KMi4gVWppICR0JDogR3VuYWthbiBuaWxhaSAkciA9IC0wLjEwODM2ODMkIGRhbiAkbiA9IDMwMCQgKGthcmVuYSAkZGYgPSBuIC0gMikkDQoNCiQkDQp0ID0gXGZyYWMgey0wLjEwODM2ODMgXGNkb3QgXHNxcnQgMzAwIC0gMn17XHNxcnQgMSAtICgtLTAuMTA4MzY4MyleMn0NCiQkDQoNCkhhc2lsbnlhICR0ID0gLTEuODgxODA5JA0KDQozLiBCYW5kaW5na2FuICRwJC12YWx1ZTogS2FyZW5hICRwID0gMC4wNjA4MzY0IFxnZXEgMC4wNSQgKHRpbmdrYXQgc2lnbmlmaWthbnNpIDUlKSwgZ2FnYWwgbWVub2xhayAkSF8wJC4gVGlkYWsgYWRhIGh1YnVuZ2FuIHNpZ25pZmlrYW5zaS4NCg0KIyMgMi41IEFuYWxpc2lzIERhdGEgS2F0ZWdvcmlrDQoNCiMjIyMgMi41LjEgRGlzdHJpYnVzaSBQZW5qdWFsYW4gYmVyZGFzYXJrYW4gSmVuaXMgT3V0bGV0DQpgYGB7ciBvdXRsZXQtZGlzdHJpYnV0aW9uLCBlY2hvPUZBTFNFLCBpbmNsdWRlPVRSVUUsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQojIEhpdHVuZyBkaXN0cmlidXNpIHBlbmp1YWxhbiBiZXJkYXNhcmthbiBKZW5pcyBPdXRsZXQNCmRpc3RyaWJ1dGlvbl9vdXRsZXQgPC0gZGF0YSAlPiUNCiAgZ3JvdXBfYnkoSmVuaXMuT3V0bGV0KSAlPiUNCiAgc3VtbWFyaXNlKFRvdGFsX1Blbmp1YWxhbiA9IHN1bShQZW5qdWFsYW4uLnVuaXQuKSkNCg0KIyBCdWF0IHZpc3VhbGlzYXNpIGludGVyYWt0aWYNCnBsb3Rfb3V0bGV0X2Rpc3RyaWJ1dGlvbiA8LSBnZ3Bsb3QoZGlzdHJpYnV0aW9uX291dGxldCwgYWVzKHggPSBKZW5pcy5PdXRsZXQsIHkgPSBUb3RhbF9QZW5qdWFsYW4sIGZpbGwgPSBKZW5pcy5PdXRsZXQpKSArDQogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiKSArDQogIGxhYnMoDQogICAgdGl0bGUgPSAiRGlzdHJpYnVzaSBQZW5qdWFsYW4gYmVyZGFzYXJrYW4gSmVuaXMgT3V0bGV0IiwNCiAgICB4ID0gIkplbmlzIE91dGxldCIsDQogICAgeSA9ICJUb3RhbCBQZW5qdWFsYW4iDQogICkgKw0KICB0aGVtZV9taW5pbWFsKCkNCg0KcGxvdF9vdXRsZXRfZGlzdHJpYnV0aW9uX2ludGVyYWN0aXZlIDwtIGdncGxvdGx5KHBsb3Rfb3V0bGV0X2Rpc3RyaWJ1dGlvbikNCg0KIyBUYW1waWxrYW4gaGFzaWwNCnBsb3Rfb3V0bGV0X2Rpc3RyaWJ1dGlvbl9pbnRlcmFjdGl2ZQ0KDQojIFRhbXBpbGthbiB0YWJlbCBoYXNpbA0Ka2FibGUoZGlzdHJpYnV0aW9uX291dGxldCwgY2FwdGlvbiA9ICJEaXN0cmlidXNpIFBlbmp1YWxhbiBiZXJkYXNhcmthbiBKZW5pcyBPdXRsZXQiKQ0KYGBgDQoNCiMjIyAyLjUuMiBBbmFsaXNpcyBQZXJiZWRhYW4gUmF0YS1yYXRhIFBlbmp1YWxhbiBiZXJkYXNhcmthbiBLYXRlZ29yaSBQcm9kdWsNCg0KKioxLiBLZXNlaGF0YW46KioNCg0KLSBRMTogNzM2MS4yNQ0KLSBRMzogMTI0ODkuNTANCi0gTWVkaWFuOiA5OTY5DQotIE1pbjogNDQ3NQ0KLSBNYXg6IDE2MjI0DQoNCioqMi4gTWFrYW5hbjoqKg0KDQotIFExOiA3OTI0LjI1DQotIFEzOiAxMzIzMg0KLSBNZWRpYW46IDEwNTUxDQotIE1pbjogNTIzMQ0KLSBNYXg6IDE2NTk4DQoNCioqMy4gTWludW1hbjoqKg0KDQotIFExOiA4MDgyDQotIFEzOiAxMzM4NA0KLSBNZWRpYW46IDEwODcwDQotIE1pbjogNDc0Mg0KLSBNYXg6IDE2Nzc3DQoNCkJveHBsb3QgbWVuZ2dhbWJhcmthbiBkYXRhIHN0YXRpc3RpayBsaW1hIGFuZ2thOg0KDQotIE1pbjogTmlsYWkgdGVya2VjaWwuDQoNCi0gUTE6IEt1YXJ0aWwgcGVydGFtYSAoMjUlIGRhdGEgbGViaWgga2VjaWwpLg0KDQotIE1lZGlhbjogS3VhcnRpbCBrZWR1YSAobmlsYWkgdGVuZ2FoKS4NCg0KLSBRMzogS3VhcnRpbCBrZXRpZ2EgKDc1JSBkYXRhIGxlYmloIGtlY2lsKS4NCg0KLSBNYXg6IE5pbGFpIHRlcmJlc2FyLg0KDQpMYW5na2FoIG1lbmdoaXR1bmcgZGFuIG1lbWJ1YXQgYm94cGxvdA0KMS4gUmVudGFuZyBBbnRhci1LdWFydGlsIChJUVIpOg0KDQokJA0KSVFSID0gUTMgLSBRMQ0KJCQNCg0KQ29udG9oIHVudHVrIGthdGVnb3JpIGtlc2VoYXRhbjoNCg0KJCQNCklRUiA9IDEyNDg5LjUwIC0gNzM2MS4yNSA9IDUxMjguMjUNCiQkDQoNCjIuIEJhdGFzIE91dGxpZXI6DQoNCi0gQmF0YXMgQmF3YWg6ICRRMSAtIDEuNSBcY2RvdCBJUVIkDQotIEJhdGFzIGF0YXM6ICRRMyArIDEuNSBcY2RvdCBJUVIkDQoNCkxpbWEgTmlsYWkgdXRhbWEgKE1pbiwgUTEsIE1lZGlhbiwgUTMsIE1heCkgZGFsYW0gYm94cGxvdC4NCg0KMS4gVWppIEhpcG90ZXNpcyBQZWFyc29uOiBUaWRhayBhZGEgaHVidW5nYW4gc2lnbmlmaWthbiBhbnRhcmEgQmlheWEgUHJvbW9zaSBkYW4gUGVuanVhbGFuLCBrYXJlbmEgJHAkLXZhbHVlIGxlYmloIGJlc2FyIGRhcmkgdGluZ2thdCBzaWduaWZpa2Fuc2kgMC4wNS4NCg0KMi4gRGlzdHJpYnVzaSBCZXJkYXNhcmthbiBPdXRsZXQ6IE91dGxldCBUcmFkaXNpb25hbCBtZW1pbGlraSBzZWRpa2l0IGxlYmloIGJhbnlhayBwZW5qdWFsYW4gZGliYW5kaW5na2FuIE91dGxldCBNb2Rlcm4uDQoNCjMuIFJhdGEtcmF0YSBQZW5qdWFsYW4gQmVyZGFzYXJrYW4gUHJvZHVrOiBEYXRhIEJveHBsb3QgbWVudW5qdWtrYW4gdmFyaWFzaSBhbnRhcmEga2F0ZWdvcmkgcHJvZHVrLiBNaW51bWFuIG1lbWlsaWtpIG1lZGlhbiBwZW5qdWFsYW4gdGVydGluZ2dpLCBkaWlrdXRpIG9sZWggTWFrYW5hbiBkYW4gS2VzZWhhdGFuLg0KDQpgYGB7ciBhbm92YS1wcm9kdWN0LWNhdGVnb3J5LCBlY2hvPUZBTFNFLCBpbmNsdWRlPVRSVUUsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQojIEFOT1ZBIHVudHVrIG1lbmd1amkgcGVyYmVkYWFuIHJhdGEtcmF0YSBwZW5qdWFsYW4gYmVyZGFzYXJrYW4gS2F0ZWdvcmkgUHJvZHVrDQphbm92YV9yZXN1bHQgPC0gYW92KFBlbmp1YWxhbi4udW5pdC4gfiBLYXRlZ29yaS5Qcm9kdWssIGRhdGEgPSBkYXRhKQ0KDQojIEhhc2lsIEFOT1ZBDQphbm92YV9zdW1tYXJ5IDwtIHN1bW1hcnkoYW5vdmFfcmVzdWx0KQ0KDQojIFRhbXBpbGthbiBoYXNpbCBBTk9WQQ0Ka2FibGUoYXMuZGF0YS5mcmFtZShhbm92YV9zdW1tYXJ5W1sxXV0pLCBjYXB0aW9uID0gIkhhc2lsIEFOT1ZBIHVudHVrIEthdGVnb3JpIFByb2R1ayIpDQoNCiMgVmlzdWFsaXNhc2kgYm94cGxvdCBpbnRlcmFrdGlmDQpwbG90X3Byb2R1Y3RfY2F0ZWdvcnkgPC0gZ2dwbG90KGRhdGEsIGFlcyh4ID0gS2F0ZWdvcmkuUHJvZHVrLCB5ID0gUGVuanVhbGFuLi51bml0LiwgZmlsbCA9IEthdGVnb3JpLlByb2R1aykpICsNCiAgZ2VvbV9ib3hwbG90KCkgKw0KICBsYWJzKA0KICAgIHRpdGxlID0gIlBlcmJlZGFhbiBQZW5qdWFsYW4gYmVyZGFzYXJrYW4gS2F0ZWdvcmkgUHJvZHVrIiwNCiAgICB4ID0gIkthdGVnb3JpIFByb2R1ayIsDQogICAgeSA9ICJQZW5qdWFsYW4gKHVuaXQpIg0KICApICsNCiAgdGhlbWVfbWluaW1hbCgpDQoNCnBsb3RfcHJvZHVjdF9jYXRlZ29yeV9pbnRlcmFjdGl2ZSA8LSBnZ3Bsb3RseShwbG90X3Byb2R1Y3RfY2F0ZWdvcnkpDQoNCiMgVGFtcGlsa2FuIGhhc2lsIHZpc3VhbGlzYXNpDQpwbG90X3Byb2R1Y3RfY2F0ZWdvcnlfaW50ZXJhY3RpdmUNCmBgYA0KDQojIyAyLjYgTW9kZWwgUHJlZGlrc2kgUGVuZGFwYXRhbg0KDQojIyMgMi42LjEgSGl0dW5nIFRvdGFsIFBlbmRhcGF0YW4gcGVyIEtvdGENCmBgYHtyIHRvdGFsLXJldmVudWUsIGVjaG89RkFMU0UsIGluY2x1ZGU9VFJVRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCiMgSGl0dW5nIHRvdGFsIHBlbmRhcGF0YW4gcGVyIGtvdGENCmRhdGEgPC0gZGF0YSAlPiUNCiAgbXV0YXRlKEhhcmdhLnBlci5Vbml0ID0gMTAsICAjIEFzdW1zaSBoYXJnYSBwZXIgdW5pdA0KICAgICAgICAgUGVuZGFwYXRhbiA9IFBlbmp1YWxhbi4udW5pdC4gKiBIYXJnYS5wZXIuVW5pdCkNCg0KdG90YWxfcmV2ZW51ZSA8LSBkYXRhICU+JQ0KICBncm91cF9ieShLb3RhKSAlPiUNCiAgc3VtbWFyaXNlKFRvdGFsX1BlbmRhcGF0YW4gPSBzdW0oUGVuZGFwYXRhbikpDQoNCiMgVmlzdWFsaXNhc2kgaW50ZXJha3RpZg0KcGxvdF90b3RhbF9yZXZlbnVlIDwtIGdncGxvdCh0b3RhbF9yZXZlbnVlLCBhZXMoeCA9IHJlb3JkZXIoS290YSwgVG90YWxfUGVuZGFwYXRhbiksIHkgPSBUb3RhbF9QZW5kYXBhdGFuLCBmaWxsID0gS290YSkpICsNCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIpICsNCiAgY29vcmRfZmxpcCgpICsNCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IHNjYWxlczo6Y29tbWEpICsgICMgRm9ybWF0IGFuZ2thIGRpIHN1bWJ1IHkNCiAgbGFicygNCiAgICB0aXRsZSA9ICJUb3RhbCBQZW5kYXBhdGFuIHBlciBLb3RhIiwNCiAgICB4ID0gIktvdGEiLA0KICAgIHkgPSAiVG90YWwgUGVuZGFwYXRhbiINCiAgKSArDQogIHRoZW1lX21pbmltYWwoKQ0KDQpwbG90X3RvdGFsX3JldmVudWVfaW50ZXJhY3RpdmUgPC0gZ2dwbG90bHkocGxvdF90b3RhbF9yZXZlbnVlKQ0KDQojIFRhbXBpbGthbiBoYXNpbCB2aXN1YWxpc2FzaQ0KcGxvdF90b3RhbF9yZXZlbnVlX2ludGVyYWN0aXZlDQoNCiMgVGFtcGlsa2FuIHRhYmVsIGhhc2lsDQprYWJsZSh0b3RhbF9yZXZlbnVlLCBjYXB0aW9uID0gIlRvdGFsIFBlbmRhcGF0YW4gcGVyIEtvdGEiKQ0KYGBgDQoNCjEuIEludGVyY2VwdCAoS29uc3RhbnRhKToNCi0gTmlsYWkgRXN0aW1hdGUgKDEwODIzOC44ODU0MDUpIGFkYWxhaCByYXRhIHJhdGEgbmlsYWkgdmFyaWFiZWwgZGVwZW5kZW4gKHBlbmRhcGF0YW4pIGtldGlrYSBzZW11YSB2YXJpYWJlbCBpbmRlcGVuZGVuIChCaWF5YSBQcm9tb3NpLCBEaXNrb24sIGRhbiBKZW5pcyBPdXRsZXQpIGJlcm5pbGFpIG5vbC4NCg0KLSBOaWxhaSBpbmkgZGloaXR1bmcgZGFyaSBwcm9zZXMgcmVncmVzaSBsaW5lYXIgZGVuZ2FuIG1lbWluaW1hbGthbiBrZXNhbGFoYW4ga3VhZHJhdC4NCg0KMi4gQmlheWEgUHJvbW9zaSAoJCkNCg0KLSBFc3RpbWF0ZTogLTUuNDcwNTcyIGJlcmFydGkgc2V0aWFwIGtlbmFpa2FuIDEgdW5pdCBCaWF5YSBQcm9tb3NpICgkKSwgcmF0YS1yYXRhIFBlbmRhcGF0YW4gZGlwcmVkaWtzaSBtZW51cnVuIHNlYmVzYXIgNS40NyB1bml0LCBkZW5nYW4gYXN1bXNpIHZhcmlhYmVsIGxhaW5ueWEgdGV0YXAuDQoNCi0gdCB2YWx1ZTogLTEuOTY4NjQ1NiBtZW51bmp1a2thbiBrZWt1YXRhbiBodWJ1bmdhbiBhbnRhcmEgQmlheWEgUHJvbW9zaSBkYW4gUGVuZGFwYXRhbi4NCg0KLSBQcig+fHR8KTogMC4wNDk5MjY2IChrdXJhbmcgZGFyaSAwLjA1KSwgc2VoaW5nZ2Egc2VjYXJhIHN0YXRpc3RpayBCaWF5YSBQcm9tb3NpIHNpZ25pZmlrYW4gbWVtZW5nYXJ1aGkgUGVuZGFwYXRhbi4NCg0KMy4gRGlza29uICglKToNCg0KLSBFc3RpbWF0ZTogNDY3LjE4ODE4OSBiZXJhcnRpIHNldGlhcCBrZW5haWthbiAxJSBEaXNrb24sIHJhdGEtcmF0YSBQZW5kYXBhdGFuIGRpcHJlZGlrc2kgbWVuaW5na2F0IHNlYmVzYXIgNDY3LjE5IHVuaXQsIGRlbmdhbiBhc3Vtc2kgdmFyaWFiZWwgbGFpbm55YSB0ZXRhcC4NCg0KLSB0IHZhbHVlOiAxLjE4NzY3NTIgbWVudW5qdWtrYW4ga2VrdWF0YW4gaHVidW5nYW4uIE5pbGFpIGluaSBsZWJpaCByZW5kYWgsIG1lbmdpbmRpa2FzaWthbiBodWJ1bmdhbiB5YW5nIGxlbWFoLg0KDQotIFByKD58dHwpOiAwLjIzNTkxMzYgKGxlYmloIGRhcmkgMC4wNSksIHNlaGluZ2dhIERpc2tvbiB0aWRhayBzaWduaWZpa2FuIHNlY2FyYSBzdGF0aXN0aWsuDQoNCjQuIEplbmlzIE91dGxldChEdW1teSkNCg0KLSBFc3RpbWF0ZTogMTg3OC40OTg5MzYgYmVyYXJ0aSBrZXRpa2EgSmVuaXMgT3V0bGV0IGFkYWxhaCAiTW9kZXJuIiwgUGVuZGFwYXRhbiBkaXByZWRpa3NpIG1lbmluZ2thdCBzZWJlc2FyIDE4NzguNTAgdW5pdCBkaWJhbmRpbmdrYW4gZGVuZ2FuIG91dGxldCAiVHJhZGlzaW9uYWwiLCBkZW5nYW4gYXN1bXNpIHZhcmlhYmVsIGxhaW5ueWEgdGV0YXAuDQoNCi0gdCB2YWx1ZTogMC41MzY3MjU2IG1lbnVuanVra2FuIGh1YnVuZ2FuIHlhbmcgbGVtYWguDQoNCi0gUHIoPnx0fCk6IDAuNTkxODYwNCAobGViaWggZGFyaSAwLjA1KSwgc2VoaW5nZ2EgdGlkYWsgc2lnbmlmaWthbiBzZWNhcmEgc3RhdGlzdGlrLg0KDQojIyMjIExhbmdrYWggTWVuZ2hpdHVuZw0KDQoxLiBNb2RlbCBSZWdyZXNpIExpbmVhcjoNCg0KJCQNClkgPSDOsl8wICsgzrJfMSBYXzEgKyDOsl8yIFhfMiArIM6yXzMgWF8zICsgz7UNCiQkDQoNCkRpbWFuYToNCg0KLSAkWSQ6IFBlbmRhcGF0YW4NCi0gJFhfMSQ6IEJpYXlhIFByb21vc2kNCi0gJFhfMiQ6IERpc2tvbg0KLSAkWF8zJDogRHVtbXkgSmVuaXMgT3V0bGV0DQotICTOsl8wJDogSW50ZXJjZXB0DQotICTOsl8xLM6yXzIszrJfMyQ6IEtvZWZpc2llbiBSZWdyZXNpDQotICTPtSQ6IGVycm9yDQoNCjIuIEVzdGltYXNpIEtvZWZpc2llbiAkKM6yKSQ6IEtvZWZpc2llbiBkaWhpdHVuZyBtZW5nZ3VuYWthbiBtZXRvZGUgT3JkaW5hcnkgTGVhc3QgU3F1YXJlcyAoT0xTKSwgeWFpdHUgbWVtaW5pbWFsa2FuIGp1bWxhaCBrdWFkcmF0IGdhbGF0ICQoXHN1bSDPtV4yKSQuDQoNCjMuIHQgdmFsdWU6IERpaGl0dW5nIGRlbmdhbiBydW11czoNCg0KJCQNCnQ9XGZyYWN7RXN0aW1hdGV9e1N0ZC5FcnJvcn0NCiQkDQoNCk5pbGFpIGluaSBtZW5ndWt1ciBrZWt1YXRhbiBodWJ1bmdhbiBhbnRhcmEgdmFyaWFiZWwgaW5kZXBlbmRlbiBkYW4gZGVwZW5kZW4uDQoNCjQuIFByKD58dHwpOiBOaWxhaSBwLXZhbHVlIGRpaGl0dW5nIGRhcmkgZGlzdHJpYnVzaSB0LiBOaWxhaSBpbmkgbWVudW5qdWtrYW4gYXBha2FoIHZhcmlhYmVsIGluZGVwZW5kZW4gc2lnbmlmaWthbiBzZWNhcmEgc3RhdGlzdGlrIGRhbGFtIG1lbWVuZ2FydWhpIHZhcmlhYmVsIGRlcGVuZGVuLg0KDQojIyMgMi42LjIgQW5hbGlzaXMgRmFrdG9yIFNpZ25pZmlrYW4gbWVuZ2d1bmFrYW4gUmVncmVzaSBMaW5lYXINCmBgYHtyIHJlZ3Jlc3Npb24tYW5hbHlzaXMsIGVjaG89RkFMU0UsIGluY2x1ZGU9VFJVRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCiMgS29udmVyc2kgSmVuaXMgT3V0bGV0IG1lbmphZGkgZHVtbXkgdmFyaWFibGUNCmRhdGEgPC0gZGF0YSAlPiUNCiAgbXV0YXRlKEplbmlzLk91dGxldC5EdW1teSA9IGlmZWxzZShKZW5pcy5PdXRsZXQgPT0gIk1vZGVybiIsIDEsIDApKQ0KDQojIE1vZGVsIHJlZ3Jlc2kgbGluZWFyDQptb2RlbCA8LSBsbShQZW5kYXBhdGFuIH4gQmlheWEuUHJvbW9zaS4uLi4gKyBEaXNrb24uLi4uICsgSmVuaXMuT3V0bGV0LkR1bW15LCBkYXRhID0gZGF0YSkNCg0KIyBSaW5na2FzYW4gbW9kZWwgcmVncmVzaQ0KbW9kZWxfc3VtbWFyeSA8LSBzdW1tYXJ5KG1vZGVsKQ0KDQojIFRhbXBpbGthbiBoYXNpbCByZWdyZXNpDQprYWJsZShhcy5kYXRhLmZyYW1lKG1vZGVsX3N1bW1hcnkkY29lZmZpY2llbnRzKSwgY2FwdGlvbiA9ICJIYXNpbCBBbmFsaXNpcyBSZWdyZXNpIExpbmVhciIpDQoNCiMgVmlzdWFsaXNhc2kgaGFzaWwgcmVncmVzaSAoUHJlZGlrc2kgdnMgQWt0dWFsKQ0KZGF0YSA8LSBkYXRhICU+JQ0KICBtdXRhdGUoUHJlZGljdGVkX1BlbmRhcGF0YW4gPSBwcmVkaWN0KG1vZGVsLCBuZXdkYXRhID0gZGF0YSkpDQoNCnBsb3RfcmVncmVzc2lvbiA8LSBnZ3Bsb3QoZGF0YSwgYWVzKHggPSBQZW5kYXBhdGFuLCB5ID0gUHJlZGljdGVkX1BlbmRhcGF0YW4pKSArDQogIGdlb21fcG9pbnQoY29sb3IgPSAic3RlZWxibHVlIikgKw0KICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLCBjb2xvciA9ICJkYXJrb3JhbmdlIiwgc2UgPSBGQUxTRSkgKw0KICBsYWJzKA0KICAgIHRpdGxlID0gIkhhc2lsIFByZWRpa3NpIFBlbmRhcGF0YW4gdnMgUGVuZGFwYXRhbiBBa3R1YWwiLA0KICAgIHggPSAiUGVuZGFwYXRhbiBBa3R1YWwiLA0KICAgIHkgPSAiUGVuZGFwYXRhbiBQcmVkaWtzaSINCiAgKSArDQogIHRoZW1lX21pbmltYWwoKQ0KDQpwbG90X3JlZ3Jlc3Npb25faW50ZXJhY3RpdmUgPC0gZ2dwbG90bHkocGxvdF9yZWdyZXNzaW9uKQ0KDQojIFRhbXBpbGthbiBoYXNpbCB2aXN1YWxpc2FzaQ0KcGxvdF9yZWdyZXNzaW9uX2ludGVyYWN0aXZlDQpgYGANCg0KTWlzYWxueWEsIEppa2EgYW5kYSBtZW1pbGlraSBkYXRhOg0KDQotIFBlbmRhcGF0YW4gYWt0dWFsIGRpIERlcG9rID0gJCw2NDMsNzQwDQotIFBlbmRhcGF0YW4gcHJlZGlrc2kgdW50dWsgRGVwb2sgKGRhcmkgbW9kZWwgcmVncmVzaSkgPSAkNiw2MDAsMDAwDQoNCk1ha2E6DQoNCi0gUmVzaWR1YWwgdW50dWsgRGVwb2sgPSA2LDY0Myw3NDAgdXNkIC0gNiw2MDAsMDAwIHVzZCA9IDQzLDc0MCB1c2QNCg0KLSBtb2RlbCB1bmRlci1wcmVkaWN0IChtZW1wcmVkaWtzaSBsZWJpaCByZW5kYWgpIHNlYmVzYXIgJDQzLDc0MC4NCg0KS2VzaW1wdWxhbiBkYXJpIHBlcmJhbmRpbmdhbiBwZW5kYXBhdGFuIGFrdHVhbCBkYW4gcHJlZGlrc2k6DQoNCi0gSmlrYSBlcnJvciBrZWNpbCBkYW4gJFJeMiQgdGluZ2dpLCBtb2RlbCBkaWFuZ2dhcCBiYWlrIGRhbGFtIG1lbmplbGFza2FuIHBlbmRhcGF0YW4uDQoNCi0gSmlrYSBlcnJvciBiZXNhciBhdGF1IGFkYSBwb2xhIHBhZGEgcmVzaWR1YWwgKG1pc2FsbnlhLCBzaXN0ZW1hdGlzIHVuZGVyLXByZWRpY3QgYXRhdSBvdmVyLXByZWRpY3QpLCBtYWthIG1vZGVsIHBlcmx1IGRpcGVyYmFpa2ksIG1pc2FsbnlhIGRlbmdhbiBtZW5hbWJhaCB2YXJpYWJlbCBhdGF1IG1lbmNvYmEgdHJhbnNmb3JtYXNpIGRhdGEuIA0KDQojIyAyLjcgSW50ZXJwcmV0YXNpIEJpc25pcw0KDQojIyMgMi43LjEgU3RyYXRlZ2kgUGVtYXNhcmFuIHBlciBLb3RhDQoNCmBgYHtyIHRvdGFsLXBlbmRhcGF0YW4tcGVyLWtvdGEtaW50ZXJha3RpZiwgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCiMgTG9hZCBsaWJyYXJpZXMNCmxpYnJhcnkoZHBseXIpDQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KHBsb3RseSkNCg0KIyBMb2FkIGRhdGENCmRhdGEgPC0gcmVhZC5jc3YoIlBlbmp1YWxhbl9BQkNfSkFCT0RFVEFCRUsuY3N2IikNCg0KIyBUYW1iYWhrYW4ga29sb20gcGVuZGFwYXRhbiAoYXN1bXNpIGhhcmdhIHBlciB1bml0ICQxMCkgZGFuIGhpdHVuZyB0b3RhbCBwZW5kYXBhdGFuIHBlciBrb3RhDQp0b3RhbF9wZW5kYXBhdGFuIDwtIGRhdGEgJT4lDQogIG11dGF0ZShIYXJnYS5wZXIuVW5pdCA9IDEwLCBQZW5kYXBhdGFuID0gUGVuanVhbGFuLi51bml0LiAqIEhhcmdhLnBlci5Vbml0KSAlPiUNCiAgZ3JvdXBfYnkoS290YSkgJT4lDQogIHN1bW1hcmlzZShUb3RhbF9QZW5kYXBhdGFuID0gc3VtKFBlbmRhcGF0YW4pKQ0KDQojIEJ1YXQgZ3JhZmlrIG1lbmdndW5ha2FuIGdncGxvdA0KZ2cgPC0gZ2dwbG90KHRvdGFsX3BlbmRhcGF0YW4sIGFlcygNCiAgeCA9IHJlb3JkZXIoS290YSwgVG90YWxfUGVuZGFwYXRhbiksIA0KICB5ID0gVG90YWxfUGVuZGFwYXRhbiwgDQogIHRleHQgPSBwYXN0ZSgiS290YToiLCBLb3RhLCAiPGJyPlBlbmRhcGF0YW46IFJwLiIsIHNjYWxlczo6Y29tbWEoVG90YWxfUGVuZGFwYXRhbikpDQopKSArDQogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBmaWxsID0gInN0ZWVsYmx1ZSIpICsNCiAgY29vcmRfZmxpcCgpICsNCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IHNjYWxlczo6Y29tbWEpICsgICMgRm9ybWF0IGFuZ2thIGRpIHN1bWJ1IHkNCiAgbGFicygNCiAgICB0aXRsZSA9ICJUb3RhbCBQZW5kYXBhdGFuIHBlciBLb3RhIiwNCiAgICB4ID0gIktvdGEiLA0KICAgIHkgPSAiVG90YWwgUGVuZGFwYXRhbiINCiAgKSArDQogIHRoZW1lX21pbmltYWwoKQ0KDQojIFViYWggZ2dwbG90IG1lbmphZGkgcGxvdGx5IHVudHVrIGludGVyYWt0aXZpdGFzDQpnZ3Bsb3RseShnZywgdG9vbHRpcCA9ICJ0ZXh0IikNCmBgYA0KDQoqKlJla29tZW5kYXNpIFN0cmF0ZWdpOioqDQoNCjEuIEpha2FydGEgKFBlbmp1YWxhbiBUZXJ0aW5nZ2kpOg0KRm9rdXMgcGFkYSBtZW1wZXJ0YWhhbmthbiBsb3lhbGl0YXMgcGVsYW5nZ2FuIGRlbmdhbiBtZW1iZXJpa2FuIHByb2dyYW0gbG95YWxpdGFzIHNlcGVydGkgcG9pbiByZXdhcmQgYXRhdSBkaXNrb24ga2h1c3VzIHVudHVrIHBlbWJlbGlhbiBiZXJ1bGFuZy4gVGluZ2thdGthbiBwcm9tb3NpIGRpZ2l0YWwga2FyZW5hIEpha2FydGEgbWVtaWxpa2kgcG90ZW5zaSBiZXNhciBkYWxhbSBlLWNvbW1lcmNlLg0KDQoyLiBEZXBvayBkYW4gVGFuZ2VyYW5nIChQZXJ0dW1idWhhbiBQb3NpdGlmKToNCk1ha3NpbWFsa2FuIHBvdGVuc2kgcGFzYXIgZGVuZ2FuIHByb21vc2kgYmVyYmFzaXMga29tdW5pdGFzLCBzZXBlcnRpIGtlcmphIHNhbWEgZGVuZ2FuIHB1c2F0IHBlcmJlbGFuamFhbiBsb2thbCBhdGF1IGV2ZW50IHNwb25zb3JzaGlwLiBQYXN0aWthbiBkaXN0cmlidXNpIHByb2R1ayB0ZXRhcCBsYW5jYXIgdW50dWsgbWVtZW51aGkgcGVybWludGFhbiB5YW5nIHRlcnVzIG1lbmluZ2thdC4NCg0KMy4gQmVrYXNpIDoNCkxha3VrYW4gc3VydmVpIGtvbnN1bWVuIHVudHVrIG1lbWFoYW1pIGtlYnV0dWhhbiBwYXNhciBkYW4gdGluZ2thdGthbiBrYW1wYW55ZSBwZW1hc2FyYW4gbG9rYWwsIHNlcGVydGkgcG90b25nYW4gaGFyZ2EgYXRhdSBidW5kbGluZyBwcm9kdWsgdW50dWsgbWVuYXJpayBwZXJoYXRpYW4gcGVsYW5nZ2FuIGJhcnUuDQoNCjQuIEJvZ29yIChQZW51cnVuYW4gRHJhc3Rpcyk6DQpGb2t1cyBwYWRhIHJlYnJhbmRpbmcgYXRhdSByZXBvc2l0aW9uaW5nIHByb2R1ayB1bnR1ayBtZW5pbmdrYXRrYW4gbWluYXQga29uc3VtZW4sIHNlcGVydGkgbWVuYXdhcmthbiBkaXNrb24gYmVzYXItYmVzYXJhbiwgbWVuamFsaW4ga2VyamEgc2FtYSBkZW5nYW4gdG9rby10b2tvIGxva2FsLCBhdGF1IG1lbmFyZ2V0a2FuIHVsYW5nIHNlZ21lbiBrb25zdW1lbiBkZW5nYW4gcHJvbW9zaSBsZWJpaCBrcmVhdGlmLg0KDQotLS0NCg0KIyMjIDIuNy4yIERhbXBhayBQZW5nb3B0aW1hbGFuIFN0cmF0ZWdpDQoNCiMjIyMgMS4gRGlza29uDQoNCkRpc2tvbiBkYXBhdCBtZW5pbmdrYXRrYW4gdm9sdW1lIHBlbmp1YWxhbiBkYWxhbSBqYW5na2EgcGVuZGVrLCB0ZXJ1dGFtYSBkaSBrb3RhIGRlbmdhbiBwZW5qdWFsYW4gcmVuZGFoIHNlcGVydGkgQm9nb3IuIE5hbXVuLCBwZW50aW5nIHVudHVrIG1lbmphZ2EgbWFyZ2luIGtldW50dW5nYW4gdGV0YXAgcG9zaXRpZiBkZW5nYW4gbWVtYmF0YXNpIGR1cmFzaSBhdGF1IG1lbmFyZ2V0a2FuIGRpc2tvbiBoYW55YSBwYWRhIHByb2R1ayB0ZXJ0ZW50dS4NCg0KIyMjIyAyLiBBbG9rYXNpIEFuZ2dhcmFuIFByb21vc2kNCg0KRm9rdXNrYW4gYW5nZ2FyYW4gcGFkYSB3aWxheWFoIGRlbmdhbiBwb3RlbnNpIHBlcnR1bWJ1aGFuIHRpbmdnaSBzZXBlcnRpIERlcG9rIGRhbiBUYW5nZXJhbmcuIEthbXBhbnllIGRpZ2l0YWwgZGkgSmFrYXJ0YSBqdWdhIHBlbnRpbmcgdW50dWsgbWVtcGVydGFoYW5rYW4gcG9zaXNpbnlhIHNlYmFnYWkgcGFzYXIgdGVyYmVzYXIuIEhpbmRhcmkgYWxva2FzaSBiZXJsZWJpaGFuIHBhZGEgd2lsYXlhaCB5YW5nIHN1bGl0IHR1bWJ1aCB0YW5wYSBwZXJlbmNhbmFhbiB1bGFuZywgc2VwZXJ0aSBCb2dvci4NCg0KIyMjIyAzLiBEaXN0cmlidXNpIGtlIEplbmlzIE91dGxldA0KDQpQZW5qdWFsYW4gbWVsYWx1aSBvdXRsZXQgbW9kZXJuIHNlcGVydGkgbWluaW1hcmtldCBhdGF1IHN1cGVybWFya2V0IGNlbmRlcnVuZyBsZWJpaCBlZmVrdGlmIGRpIHdpbGF5YWggcGVya290YWFuIHNlcGVydGkgSmFrYXJ0YSBkYW4gRGVwb2suIFVudHVrIHdpbGF5YWggcGluZ2dpcmFuIHNlcGVydGkgQm9nb3IgZGFuIFRhbmdlcmFuZywgdGluZ2thdGthbiBrZXJqYSBzYW1hIGRlbmdhbiB0b2tvIHRyYWRpc2lvbmFsIGF0YXUgd2FydW5nIHVudHVrIG1lbmphbmdrYXUga29uc3VtZW4gbG9rYWwgeWFuZyBsZWJpaCBsdWFzLg0KDQojIFJlZmVyZW5zaQ0KDQoxLiBZb3VUdWJlIHBlcmJlZGFhbiBTdGF0aXN0aWthIERlc2tyaXB0aWYgZGFuIFN0YXRpc3Rpa2EgSW5mZXJlbnNpYWwNCg0KaHR0cHM6Ly95b3V0dS5iZS9DcjBqR19NYXpBdz9zaT1ya0hjV2xxcklMdXhCWks0DQoNCg0KMi4gWW91dHViZSBVamkgSGlwb3Rlc2lzDQoNCmh0dHBzOi8veW91dHUuYmUvbVJLMm40T2szdTQ/c2k9RFJjR1dLalktQ04yVjJ1bA0KDQoNCjMuIEJvb2tkb3duIFBhayBCYWt0aSBTaXJlZ2FyIFMuU2kuLCBNLlNjLiB5YW5nIGRpIGJlcmlrYW4gbWVsYWx1aSBHb29nbGUgQ2xhc3Nyb29tLg==