Confidence Interval

Assignment Week 13

Angelica Florentina M.

52250063

Student Majoring in Data Science at Institut Teknologi Sains Bandung

1 Case Study 1

Confidence Interval for Mean, σ Known

An e-commerce platform wants to estimate the average number of daily transactions per user after launching a new feature. Based on large-scale historical data, the population standard deviation is known.

\[\sigma = 3.2\] \[\,n = 100\,\] \[\bar{x} = 12.6\]

Tasks:

  1. Identify the appropriate statistical test and justify your choice.

  2. Compute the Confidence Intervals for:

    • 90%
    • 95%
    • 99%
  3. Create a comparison visualization of the three confidence intervals.

  4. Interpret the results in a business analytics context.

1.1 Uji Statistik

Uji statistik yang tepat: Interval Kepercayaan untuk Mean dengan σ diketahui (Z-interval / Uji Z untuk mean)

Justifikasi:

Tujuan analisis adalah mengestimasi rata-rata populasi (rata-rata transaksi harian per pengguna), bukan membandingkan dua kelompok atau menguji proporsi.

Simpangan baku populasi (σ) diketahui, yaitu σ = 3,2. Ini adalah syarat utama penggunaan distribusi Z.

Ukuran sampel besar (n = 100), sehingga asumsi distribusi normal untuk rata-rata sampel terpenuhi berdasarkan Teorema Limit Pusat, meskipun distribusi data asli tidak diketahui.

Data berupa variabel numerik kontinu (jumlah transaksi).

1.2 Confidence Interval 90%

Rumus CI untuk z-distribution \[CI = \bar{x} \pm z_{\alpha/2}\,\frac{\sigma}{\sqrt{n}}\] Sample Size \[{n} = 100\]

Standar Deviation \[{σ} = 3.2\]

Sample Mean \[\bar{x} = 12.6\]

Confidence Level 90% \[1 - 0.9 = \frac{0.1}{2} = 0.05 ≈ 1.65\]

Standard Error

\[SE = \frac{\sigma}{\sqrt{n}}\] \[\frac{3.2}{\sqrt{100}} = 0.32\]

Margin of Error

\[ME = z_{\alpha/2}\ × SE\] \[{1.65}\ × SE\ {\approx{0.528}}\]

CI 90%

\[\bar{x}\ \pm\ ME\] \[12.6\ \pm\ 0.528\] \[{\approx\ (12.072, 13.128)}\]

1.3 Confidence Interval 95%

Rumus CI untuk z-distribution \[CI = \bar{x} \pm z_{\alpha/2}\,\frac{\sigma}{\sqrt{n}}\] Sample Size \[{n} = 100\]

Standar Deviation \[{σ} = 3.2\]

Sample Mean \[\bar{x} = 12.6\]

Confidence Level 95% \[1 - 0.95 = \frac{0.05}{2} = 0.025 ≈ 1.96\]

Standard Error

\[SE = \frac{\sigma}{\sqrt{n}}\] \[\frac{3.2}{\sqrt{100}} = 0.32\]

Margin of Error

\[ME = z_{\alpha/2}\ × SE\] \[{1.96}\ × SE\ {\approx{0.6272}}\]

CI 95%

\[\bar{x}\ \pm\ ME\] \[12.6\ \pm\ 0.6272\] \[{\approx\ (11.9728, 13.2272)}\]

1.4 Confidence Interval 99%

Rumus CI untuk z-distribution \[CI = \bar{x} \pm z_{\alpha/2}\,\frac{\sigma}{\sqrt{n}}\]

Sample Size \[{n} = 100\]

Standar Deviation \[{σ} = 3.2\]

Sample Mean \[\bar{x} = 12.6\]

Confidence Level 99% \[1 - 0.99 = \frac{0.01}{2} = 0.005 ≈ 2.58\]

Standard Error

\[SE = \frac{\sigma}{\sqrt{n}}\] \[\frac{3.2}{\sqrt{100}} = 0.32\]

Margin of Error

\[ME = z_{\alpha/2}\ × SE\] \[{2.58}\ × SE\ {\approx{0.82}}\]

CI 99%

\[\bar{x}\ \pm\ ME\] \[12.6\ \pm\ 0.82\] \[{\approx\ (11.781, 13.42)}\]

1.5 Visualization

Interpretation

Diagram ini menunjukkan distribusi normal dari rata-rata transaksi harian pengguna dengan mean sampel sebesar 12,6. Garis vertikal hitam menandai nilai mean tersebut, sementara garis titik-titik berwarna hijau, biru, dan merah masing-masing mewakili interval kepercayaan 90%, 95%, dan 99%. Semakin tinggi tingkat kepercayaan, interval menjadi lebih lebar, mencerminkan trade-off antara keyakinan dan presisi estimasi. Dengan demikian, kita dapat menyimpulkan bahwa dengan keyakinan yang tinggi, rata-rata transaksi harian populasi kemungkinan besar berada dalam rentang interval tersebut, yang membantu memberikan gambaran keandalan estimasi rata-rata transaksi setelah peluncuran fitur baru.

1.6 Business Analytics

Confidence interval menunjukkan rentang nilai di mana rata-rata transaksi harian per pengguna kemungkinan besar berada dengan tingkat keyakinan tertentu. Misalnya, pada tingkat kepercayaan 95%, platform e-commerce dapat yakin bahwa rata-rata transaksi harian per pengguna berada antara sekitar 11,97 hingga 13,23 transaksi. Ini membantu bisnis memahami efektivitas fitur baru secara statistik dengan memperkirakan nilai rata-rata yang sesungguhnya, bukan hanya berdasarkan sampel. Semakin tinggi tingkat kepercayaan, rentang interval menjadi lebih lebar, menunjukkan ketidakpastian yang lebih besar tapi juga keyakinan yang lebih kuat bahwa nilai sebenarnya ada dalam rentang tersebut. Dengan informasi ini, manajemen dapat membuat keputusan yang lebih tepat mengenai keberhasilan fitur dan perencanaan kapasitas transaksi.

2 Case Study 2

Confidence Interval for Mean, σ Unknown:

A UX Research team analyzes task completion time (in minutes) for a new mobile application. The data are collected from 12 users:

\[8.4,7.9,9.1,8.7,8.2,9.0,7.8,8.5,8.9,8.1,8.6,8.3\]

Tasks:

  1. Identify the appropriate statistical test and explain why.

  2. Compute the Confidence Intervals for:

    • 90%
    • 95%
    • 99%
  3. Visualize the three intervals on a single plot.

  4. Explain how sample size and confidence level influence the interval width.

2.1 Uji Statistik

Uji yang tepat adalah membuat interval kepercayaan rata-rata menggunakan t-distribusi, karena data yang diberikan berasal dari 12 pengguna (ukuran sampel kecil, yaitu n < 30) dan simpangan baku populasi (σ) tidak diketahui, maka uji statistik yang tepat untuk membuat interval kepercayaan rata-rata adalah menggunakan distribusi t-Student.

Alasan memilih distribusi t-:

Ukuran sampel kecil (n < 30): Saat ukuran sampel kecil, distribusi sampling rata-rata tidak mengikuti distribusi normal baku secara sempurna, sehingga distribusi t lebih cocok digunakan karena memperhitungkan ketidakpastian pada estimasi simpangan baku.

Simpangan baku populasi tidak diketahui: Kita hanya punya data sampel, sehingga simpangan baku populasi harus diestimasi dari simpangan baku sampel. Distribusi t-Student dirancang untuk kondisi ini.

Data diasumsikan berasal dari populasi yang berdistribusi normal: Asumsi ini penting untuk validitas penggunaan distribusi t.

2.2 Confindence Interval 90%

Sample Size \[n = 12\]

Sample Mean \[\bar{x} = \frac{1}{n} \sum_{i=1}^{n} x_i\] \[\begin{align*} \bar{x} &= \frac{1}{12} (8.4 + 7.9 + 9.1 + 8.7 + 8.2 + 9.0 + 7.8 + 8.5 + 8.9 + 8.1 + 8.6 + 8.3) \\ &= 8.45 \end{align*}\]

Standard Deviation \[s = \sqrt{\frac{1}{n-1} \sum_{i=1}^{n} (x_i - \bar{x})^2}\] \[ s = \sqrt{\frac{1}{12-1} \Big[ (8.4-8.45)^2 + (7.9-8.45)^2 + (...)^2 +(8.3-8.45)^2 \Big]} \]

\[ = \sqrt{\frac{1.95}{11}} = \sqrt{0.17727} \approx 0.421 \] Critical Value 90% \[1 - 0.9 = \frac{0.1}{2} = 0.05 ≈ 1.796\] Standard Error (SE) \[SE = \frac{s}{\sqrt{n}}\] \[ SE = \frac{0.421}{\sqrt{12}} = \frac{0.421}{3.464} \approx 0.121 \] Margin of Error (ME) \[ \begin{aligned} ME &= t_{\alpha/2, df} \times SE = 1.796 \times 0.121 \approx 0.2173 \end{aligned} \] CI 90% \[\bar{x}\ \pm\ ME\] \[8.45\ \pm\ 0.2173\] \[{\approx\ (8.2327, 8.6673)}\]

2.3 Confidence Interval 95%

Sample Size \[n = 12\]

Sample Mean \[\bar{x} = \frac{1}{n} \sum_{i=1}^{n} x_i\] \[\begin{align*} \bar{x} &= \frac{1}{12} (8.4 + 7.9 + 9.1 + 8.7 + 8.2 + 9.0 + 7.8 + 8.5 + 8.9 + 8.1 + 8.6 + 8.3) \\ &= 8.45 \end{align*}\]

Standard Deviation \[s = \sqrt{\frac{1}{n-1} \sum_{i=1}^{n} (x_i - \bar{x})^2}\] \[ s = \sqrt{\frac{1}{12-1} \Big[ (8.4-8.45)^2 + (7.9-8.45)^2 + (...)^2 +(8.3-8.45)^2 \Big]} \]

\[ = \sqrt{\frac{1.95}{11}} = \sqrt{0.17727} \approx 0.421 \] Critical Value 95% \[1 - 0.95 = \frac{0.05}{2} = 0.025 ≈ 2.201\] Standard Error (SE) \[SE = \frac{s}{\sqrt{n}}\] \[ SE = \frac{0.421}{\sqrt{12}} = \frac{0.421}{3.464} \approx 0.121 \] Margin of Error (ME) \[ \begin{aligned} ME &= t_{\alpha/2, df} \times SE = 2.201 \times 0.121 \approx 0.2663 \end{aligned} \] CI 95% \[\bar{x}\ \pm\ ME\] \[8.45\ \pm\ 0.2663\] \[{\approx\ (8.1837, 8.7163)}\]

2.4 Confidence Interval 99%

Sample Size \[n = 12\]

Sample Mean \[\bar{x} = \frac{1}{n} \sum_{i=1}^{n} x_i\] \[\begin{align*} \bar{x} &= \frac{1}{12} (8.4 + 7.9 + 9.1 + 8.7 + 8.2 + 9.0 + 7.8 + 8.5 + 8.9 + 8.1 + 8.6 + 8.3) \\ &= 8.45 \end{align*}\]

Standard Deviation \[s = \sqrt{\frac{1}{n-1} \sum_{i=1}^{n} (x_i - \bar{x})^2}\] \[ s = \sqrt{\frac{1}{12-1} \Big[ (8.4-8.45)^2 + (7.9-8.45)^2 + (...)^2 +(8.3-8.45)^2 \Big]} \]

\[ = \sqrt{\frac{1.95}{11}} = \sqrt{0.17727} \approx 0.421 \] Critical Value 99% \[1 - 0.99 = \frac{0.01}{2} = 0.005 ≈ 3.106\] Standard Error (SE) \[SE = \frac{s}{\sqrt{n}}\] \[ SE = \frac{0.421}{\sqrt{12}} = \frac{0.421}{3.464} \approx 0.121 \] Margin of Error (ME) \[ \begin{aligned} ME &= t_{\alpha/2, df} \times SE = 3.106 \times 0.121 \approx 0.3758 \end{aligned} \] CI 99% \[\bar{x}\ \pm\ ME\] \[8.45\ \pm\ 0.3758\] \[{\approx\ (8.0742, 8.8258)}\]

2.5 Visualization

Interpretation

Diagram tersebut menunjukkan interval kepercayaan rata-rata menggunakan distribusi t dengan rata-rata sampel sebesar 8,45 yang ditandai oleh garis putus-putus di tengah kurva. Garis vertikal berwarna menggambarkan interval kepercayaan 90%, 95%, dan 99%, di mana semakin tinggi tingkat kepercayaan maka interval semakin lebar, mencerminkan meningkatnya ketidakpastian estimasi. Seluruh interval bersifat simetris terhadap nilai rata-rata, menunjukkan bahwa estimasi mean populasi paling mungkin berada di sekitar 8,45. Diagram ini menegaskan bahwa distribusi t digunakan ketika simpangan baku populasi tidak diketahui atau ukuran sampel relatif kecil, serta menggambarkan trade-off antara presisi dan tingkat keyakinan dalam penaksiran parameter populasi.

2.6 Sample Size and Confidence Level

Lebar interval kepercayaan dipengaruhi oleh ukuran sampel dan tingkat kepercayaan sebagai berikut. Ukuran sampel berpengaruh melalui galat baku (standard error); semakin besar ukuran sampel, galat baku semakin kecil sehingga interval kepercayaan menjadi lebih sempit dan estimasi lebih presisi, sedangkan sampel kecil menghasilkan interval yang lebih lebar. Tingkat kepercayaan memengaruhi nilai kritis (Z atau t); semakin tinggi tingkat kepercayaan (misalnya dari 90% ke 95% atau 99%), nilai kritis semakin besar sehingga interval kepercayaan menjadi lebih lebar, karena kita ingin lebih yakin bahwa parameter populasi berada di dalam interval tersebut. Dengan demikian, interval kepercayaan paling sempit diperoleh dari sampel besar dengan tingkat kepercayaan lebih rendah, dan sebaliknya.

3 Case Study 3

Confidence Interval for a Proportion, A/B Testing:

A data science team runs an A/B test on a new Call-To-Action (CTA) button design. The experiment yields:

\[ n = 400\] \[ x = 156\]

Tasks:

  1. Compute the sample proportion \(\hat {p}\)

  2. Compute Confidence Intervals for the proportion at:

    • 90%
    • 95%
    • 99%
  3. Visualize and compare the three intervals.

  4. Explain how confidence level affects decision-making in product experiments.

3.1 Sample Proportion

\[\hat {p} = \frac {x}{n} = \frac {156}{400} = 0.39\]

3.2 Confidence Interval 90%

Standard Error \[ \begin{align*} SE_{\hat{p}} &= \sqrt{\frac{\hat{p}(1-\hat{p})}{n}} \\ &= \sqrt{\frac{0.39(1-0.39)}{400}} \\ &= \sqrt{\frac{0.39 \cdot 0.61}{400}} \\ &\approx 0.0244 \end{align*} \]

Critical Value 90%

Untuk 90% confidence level: \(Z_{\alpha/2} = 1.65\)

Margin of Error \[ ME = Z_{\alpha/2} × SE = 1.65 × 0.0244 \approx 0.04026\]

CI 90% \[\hat{p}\ \pm\ ME\] \[0.39\ \pm\ 0.04026\] \[{\approx\ (0.34974, 0.43026)}\]

3.3 Confidence Interval 95%

Standard Error \[ \begin{align*} SE_{\hat{p}} &= \sqrt{\frac{\hat{p}(1-\hat{p})}{n}} \\ &= \sqrt{\frac{0.39(1-0.39)}{400}} \\ &= \sqrt{\frac{0.39 \cdot 0.61}{400}} \\ &\approx 0.0244 \end{align*} \]

Critical Value 95%

Untuk 95% confidence level: \(Z_{\alpha/2} = 1.96\)

Margin of Error \[ ME = Z_{\alpha/2} × SE = 1.96 × 0.0244 \approx 0.0478\]

CI 95% \[\hat{p}\ \pm\ ME\] \[0.39\ \pm\ 0.0478\] \[{\approx\ (0.3422, 0.4378)}\]

3.4 Confidence Interval 99%

Standard Error \[ \begin{align*} SE_{\hat{p}} &= \sqrt{\frac{\hat{p}(1-\hat{p})}{n}} \\ &= \sqrt{\frac{0.39(1-0.39)}{400}} \\ &= \sqrt{\frac{0.39 \cdot 0.61}{400}} \\ &\approx 0.0244 \end{align*} \]

Critical Value 99%

Untuk 99% confidence level: \(Z_{\alpha/2} = 2.58\)

Margin of Error \[ ME = Z_{\alpha/2} × SE = 2.58 × 0.0244 \approx 0.0629\]

CI 9% \[\hat{p}\ \pm\ ME\] \[0.39\ \pm\ 0.0629\] \[{\approx\ (0.3271, 0.4529)}\]

3.5 Visualization

Interpretation

Diagram ini menggambarkan distribusi sampling proporsi sampel \(\hat p\) yang mendekati normal, dengan nilai titik tengah \(\hat p = 0{,}39\) sebagai estimasi proporsi populasi, lalu di kiri–kanannya digambar beberapa pasang garis vertikal berwarna yang menunjukkan batas bawah dan atas interval kepercayaan 90%, 95%, dan 99% untuk proporsi populasi, di mana semakin tinggi tingkat kepercayaan maka interval semakin lebar karena harus “menangkap” nilai proporsi populasi sebenarnya dengan probabilitas yang lebih besar, sehingga secara interpretasi jika pengambilan sampel diulang berkali‑kali dan setiap kali dihitung interval kepercayaan (misalnya 95%) seperti pada gambar, maka kira‑kira 95% dari interval‑interval tersebut akan mengandung proporsi populasi sebenarnya, dan diagram ini memvisualisasikan konsep tersebut dalam bentuk kurva normal dan garis batas interval di sekitar \(\hat p\).

3.6 Confidence Level Affects

Dalam eksperimen produk, tingkat kepercayaan menentukan seberapa yakin tim terhadap efek perubahan sebelum membuat keputusan; tingkat kepercayaan tinggi (misalnya 99%) membuat interval estimasi lebih lebar dan menuntut bukti yang lebih kuat sehingga mengurangi risiko salah memilih varian namun membutuhkan sampel lebih besar, waktu lebih lama, dan sering kali menunda peluncuran fitur, sedangkan tingkat kepercayaan lebih rendah (misalnya 90%) menghasilkan interval sempit dan keputusan yang lebih cepat dengan biaya data lebih kecil, tetapi meningkatkan risiko bahwa hasil yang dianggap “menang” sebenarnya hanya kebetulan, sehingga pemilihan 90%, 95%, atau 99% harus disesuaikan dengan profil risiko bisnis dan dampak keputusan terhadap pengguna maupun sumber daya perusahaan.

4 Case Study 4

Precision Comparison (Z-Test vs t-Test):

Two data teams measure API latency (in milliseconds) under different conditions.

Team A: \[n = 36\] \[\bar{x} = 210\] \[\sigma = 24\]

Team B: \[n = 36\] \[\bar{x} = 210\] \[\sigma = 24\]

Tasks:

  1. Identify the statistical test used by each team.

  2. Compute Confidence Intervals for 90%, 95%, and 99%.

  3. Create a visualization comparing all intervals.

  4. Explain why the interval widths differ, even with similar data.

4.1 Uji Statistik

Pada nomor 1, identifikasi uji statistik didasarkan pada apakah standar deviasi populasi diketahui atau tidak. Tim A mengetahui standar deviasi populasi (σ = 24), sehingga mereka menggunakan Z-test atau Z-interval untuk menghitung confidence interval karena distribusi sampling dari mean bisa dianggap normal. Sebaliknya, Tim B hanya memiliki standar deviasi sampel (s = 24), sehingga mereka harus menggunakan t-test atau t-interval, yang memperhitungkan ketidakpastian tambahan dari penggunaan sampel untuk memperkirakan σ. Dengan demikian, perbedaan utama dalam pemilihan uji adalah tingkat informasi tentang variabilitas data: Z untuk σ diketahui, t untuk σ tidak diketahui.

4.2 Team A

4.2.1 Confidence Interval 90%

Sample Size \[{n} = 36\]

Standar Deviation \[{σ} = 24\]

Sample Mean \[\bar{x} = 210\]

Confidence Level 90% \[1 - 0.9 = \frac{0.1}{2} = 0.05 ≈ 1.65\]

Standard Error

\[SE = \frac{\sigma}{\sqrt{n}}\] \[\frac{24}{\sqrt{36}} = 4\]

Margin of Error

\[ME = z_{\alpha/2}\ × SE\] \[{1.65}\ × 4\ {\approx{6.6}}\]

CI 90%

\[\bar{x}\ \pm\ ME\] \[210\ \pm\ 6.6\] \[{\approx\ (203.4, 216.6)}\]

4.2.2 Confidence Interval 95%

Sample Size \[{n} = 36\]

Standar Deviation \[{σ} = 24\]

Sample Mean \[\bar{x} = 210\]

Confidence Level 95% \[1 - 0.95 = \frac{0.05}{2} = 0.025 ≈ 1.96\]

Standard Error

\[SE = \frac{\sigma}{\sqrt{n}}\] \[\frac{24}{\sqrt{36}} = 4\]

Margin of Error

\[ME = z_{\alpha/2}\ × SE\] \[{1.96}\ × 4\ {\approx{7.84}}\]

CI 95%

\[\bar{x}\ \pm\ ME\] \[210\ \pm\ 7.84\] \[{\approx\ (202.16, 217.84)}\]

4.2.3 Confidence Interval 99%

Sample Size \[{n} = 36\]

Standar Deviation \[{σ} = 24\]

Sample Mean \[\bar{x} = 210\]

Confidence Level 99% \[1 - 0.99 = \frac{0.01}{2} = 0.005 ≈ 2.58\]

Standard Error

\[SE = \frac{\sigma}{\sqrt{n}}\] \[\frac{24}{\sqrt{36}} = 4\]

Margin of Error

\[ME = z_{\alpha/2}\ × SE\] \[{2.58}\ × 4\ {\approx{10.32}}\]

CI 99%

\[\bar{x}\ \pm\ ME\] \[210\ \pm\ 10.32\] \[{\approx\ (199.68, 220.32)}\]

4.3 Team B

4.3.1 Confidence Interval 90%

Rumus \[CI = \bar{x} \pm t_{\alpha/2,\,df}\,\frac{s}{\sqrt{n}}\]

Sample Size \[{n} = 36\]

Sample Standar Deviation \[{s} = 24\] df \[df = n -1 = 36 - 1 = 35\]

Sample Mean \[\bar{x} = 210\]

Critical Value 90% \[1 - 0.9 = \frac{0.1}{2} = 0.05 ≈ 1.690\]

Standard Error

\[SE = \frac{s}{\sqrt{n}}\] \[\frac{24}{\sqrt{36}} = 4\]

Margin of Error

\[ME = t_{\alpha/2 , df}\ × SE\] \[{1.690}\ × 4\ {\approx{6.76}}\]

CI 90%

\[\bar{x}\ \pm\ ME\] \[210\ \pm\ 6.76\] \[{\approx\ (203.24, 216.76)}\]

4.3.2 Confidence Interval 95%

Rumus \[CI = \bar{x} \pm t_{\alpha/2,\,df}\,\frac{s}{\sqrt{n}}\]

Sample Size \[{n} = 36\]

Sample Standar Deviation \[{s} = 24\]

Sample Mean \[\bar{x} = 210\]

df \[df = n - 1 = 35\]

Critical Value 95% \[1 - 0.95 = \frac{0.05}{2} = 0.025 ≈ 2.030\]

Standard Error

\[SE = \frac{s}{\sqrt{n}}\] \[\frac{24}{\sqrt{36}} = 4\]

Margin of Error

\[ME = z_{\alpha/2}\ × SE\] \[{2.030}\ × 4\ {\approx{8.12}}\]

CI 95%

\[\bar{x}\ \pm\ ME\] \[210\ \pm\ 8.12\] \[{\approx\ (201.88, 218.12)}\]

4.3.3 Confidence Interval 99%

Rumus \[CI = \bar{x} \pm t_{\alpha/2,\,df}\,\frac{s}{\sqrt{n}}\]

Sample Size \[{n} = 36\]

Sample Standar Deviation \[{s} = 24\]

Sample Mean \[\bar{x} = 210\]

df \[df = n - 1 = 35\]

Critical Value 99% \[1 - 0.99 = \frac{0.01}{2} = 0.005 ≈ 2.724\]

Standard Error

\[SE = \frac{s}{\sqrt{n}}\] \[\frac{24}{\sqrt{36}} = 4\]

Margin of Error

\[ME = z_{\alpha/2}\ × SE\] \[{2.724}\ × 4\ {\approx{10.90}}\]

CI 99%

\[\bar{x}\ \pm\ ME\] \[210\ \pm\ 10.90\] \[{\approx\ (199.10, 220.90)}\]

4.4 Visualization

4.4.1 Team A

4.4.2 Team B

4.5 Interval Widths Differ

Meskipun Team A dan Team B memiliki rata-rata sampel, ukuran sampel, dan nilai variasi yang sama, lebar confidence interval (CI) yang dihasilkan tetap berbeda karena perbedaan asumsi statistik dan distribusi yang digunakan. Team A menggunakan distribusi normal (Z-distribution) karena standar deviasi populasi (σ) diketahui, sehingga ketidakpastian hanya berasal dari variasi sampel dan menghasilkan interval yang relatif lebih sempit. Sebaliknya, Team B menggunakan distribusi t karena standar deviasi populasi tidak diketahui dan harus diestimasi dari sampel, sehingga terdapat ketidakpastian tambahan dalam estimasi varians. Distribusi t memiliki ekor yang lebih tebal dibanding distribusi normal, yang menyebabkan nilai kritis (t) lebih besar daripada nilai Z pada tingkat kepercayaan yang sama. Akibatnya, confidence interval Team B menjadi sedikit lebih lebar, meskipun data dasarnya tampak serupa.

5 Case Study 5

One-Sided Confidence Interval:

A Software as a Service (SaaS) company wants to ensure that at least 70% of weekly active users utilize a premium feature.

From the experiment:

\[n = 250\] \[x = 185\]

Management is only interested in the lower bound of the estimate.

Tasks:

  1. Identify the type of Confidence Interval and the appropriate test.

  2. Compute the one-sided lower Confidence Interval at:

    • 90%
    • 95%
    • 99%
  3. Visualize the lower bounds for all confidence levels.

  4. Determine whether the 70% target is statistically satisfied.

5.1 Uji Statistik

Confidence Interval satu sisi (lower bound one-sided CI) untuk proporsi populasi.

Uji Statistik yang Tepat: One-sample proportion z-test (uji z satu sisi) karena Sampel cukup besar (𝑛𝑝 dan 𝑛(1−𝑝)>5, kita mengestimasi proporsi populasi, manajemen hanya peduli pada batas bawah (apakah ≥ 70%?).

5.2 Confidence Interval 90%

Sample Proportion \[\hat {p} = \frac {x}{n} = \frac {185}{250} = 0.74\] Standard Error \[ \begin{align*} SE_{\hat{p}} &= \sqrt{\frac{\hat{p}(1-\hat{p})}{n}} \\ &= \sqrt{\frac{0.74(1-0.74)}{250}} \\ &\approx 0.0277 \end{align*} \]

Critical Value 90%

Untuk 90% confidence level: \(Z_{ 1 -\alpha} = 1.28\)

Margin of Error \[ ME = Z_{1 - \alpha} × SE = 1.28 × 0.0277 \approx 0.0354\]

CI 90% \[CI _lower = \hat{p} - ME\] \[0.74 - 0.0354 \approx 0.7046\]

5.3 Confidence Interval 95%

Sample Proportion \[\hat {p} = \frac {x}{n} = \frac {185}{250} = 0.74\] Standard Error \[ \begin{align*} SE_{\hat{p}} &= \sqrt{\frac{\hat{p}(1-\hat{p})}{n}} \\ &= \sqrt{\frac{0.74(1-0.74)}{250}} \\ &\approx 0.0277 \end{align*} \]

Critical Value 95%

Untuk 95% confidence level: \(Z_{ 1 -\alpha} = 1.645\)

Margin of Error \[ ME = Z_{1 - \alpha} × SE = 1.645 × 0.0277 \approx 0.0455\]

CI 95% \[CI _lower = \hat{p} - ME\] \[0.74 - 0.0455 \approx 0.6945\]

5.4 Confidence Interval 99%

Sample Proportion \[\hat {p} = \frac {x}{n} = \frac {185}{250} = 0.74\] Standard Error \[ \begin{align*} SE_{\hat{p}} &= \sqrt{\frac{\hat{p}(1-\hat{p})}{n}} \\ &= \sqrt{\frac{0.74(1-0.74)}{250}} \\ &\approx 0.0277 \end{align*} \]

Critical Value 99%

Untuk 99% confidence level: \(Z_{ 1 -\alpha} = 2.33\)

Margin of Error \[ ME = Z_{1 - \alpha} × SE = 2.33 × 0.0277 \approx 0.0645\]

CI 99% \[CI _lower = \hat{p} - ME\] \[0.74 - 0.0645 \approx 0.6755\]

5.5 Visualization

Interpretation

Diagram tersebut menggambarkan interval kepercayaan satu sisi batas bawah (one-sided lower confidence interval) untuk proporsi pengguna premium aktif, dengan estimasi proporsi sampel p̂ = 0,74 yang ditunjukkan oleh garis putus-putus di tengah. Garis vertikal di sebelah kiri menunjukkan batas bawah interval kepercayaan pada tingkat kepercayaan 90%, 95%, dan 99%, di mana semakin tinggi tingkat kepercayaan maka batas bawah semakin bergeser ke kiri (semakin konservatif). Interpretasinya adalah, misalnya pada tingkat kepercayaan tertentu, kita yakin bahwa proporsi sebenarnya pengguna premium aktif di populasi setidaknya sebesar nilai batas bawah tersebut, sementara nilai di atas batas tersebut masih mungkin terjadi. Interval satu sisi ini digunakan ketika fokus analisis adalah memastikan nilai minimum proporsi populasi, bukan rentang atas–bawah secara simultan.

5.6 Determine 70%

Target 70% pengguna aktif fitur premium terpenuhi secara statistik hanya pada tingkat kepercayaan 90%, karena batas bawah one-sided confidence interval pada level ini masih berada di atas 70%. Namun, pada tingkat kepercayaan yang lebih ketat yaitu 95% dan 99%, batas bawah interval turun di bawah 70%, sehingga tidak ada cukup bukti statistik untuk menyatakan bahwa proporsi pengguna premium aktif minimal 70% dengan keyakinan yang lebih tinggi. Artinya, meskipun estimasi proporsi sampel sebesar 74% terlihat memenuhi target secara deskriptif, secara statistik target tersebut belum dapat dipastikan jika manajemen mensyaratkan tingkat kepercayaan 95% atau lebih.

LS0tDQp0aXRsZTogIkNvbmZpZGVuY2UgSW50ZXJ2YWwiDQpzdWJ0aXRsZTogIkFzc2lnbm1lbnQgV2VlayAxMyINCmF1dGhvcjogIkFuZ2VsaWNhIEZsb3JlbnRpbmEgTS4iDQpkYXRlOiAiYHIgZm9ybWF0KFN5cy5EYXRlKCksICclQiAlZCwgJVknKWAiDQpvdXRwdXQ6DQogIHJtZGZvcm1hdHM6OnJlYWR0aGVkb3duOg0KICAgIHNlbGZfY29udGFpbmVkOiB0cnVlDQogICAgdGh1bWJuYWlsczogdHJ1ZQ0KICAgIGxpZ2h0Ym94OiB0cnVlDQogICAgZ2FsbGVyeTogdHJ1ZQ0KICAgIG51bWJlcl9zZWN0aW9uczogdHJ1ZQ0KICAgIGxpYl9kaXI6IGxpYnMNCiAgICBkZl9wcmludDogInBhZ2VkIg0KICAgIGNvZGVfZm9sZGluZzogInNob3ciDQogICAgY29kZV9kb3dubG9hZDogeWVzDQogICAgY3NzOiAiY29kZS5jc3MiDQotLS0NCg0KDQpgYGB7ciBwcm9maWxlLCBlY2hvPUZBTFNFfQ0KbGlicmFyeShodG1sdG9vbHMpDQpIVE1MKCcNCjxkaXYgY2xhc3M9InByb2ZpbGUtY2FyZCI+DQogIDxkaXY+DQogICAgPGltZyBzcmM9Imh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9hbmdlbGlpZWUvZm90b2FuZ2VsaWNhL21haW4vZm9ybWFsLmpwZyINCiAgICAgICAgIGNsYXNzPSJwcm9maWxlLXBob3RvIj4NCiAgPC9kaXY+DQogIDxkaXY+DQogICAgPGgxIGNsYXNzPSJwcm9maWxlLW5hbWUiPkFuZ2VsaWNhIEZsb3JlbnRpbmEgTS48L2gxPg0KICAgIDxwIHN0eWxlPSJtYXJnaW46IDRweCAwOyBjb2xvcjpibGFjazsiPjUyMjUwMDYzPC9wPg0KICAgIDxwIGNsYXNzPSJwcm9maWxlLWluZm8iPlN0dWRlbnQgTWFqb3JpbmcgaW4gRGF0YSBTY2llbmNlIGF0IEluc3RpdHV0IFRla25vbG9naSBTYWlucyBCYW5kdW5nPC9wPg0KDQogICAgPGRpdiBzdHlsZT0iZGlzcGxheTogZmxleDsgZ2FwOiAxNXB4OyBtYXJnaW4tdG9wOiAxOHB4OyI+DQogICAgICA8YnV0dG9uIGNsYXNzPSJwcm9maWxlLWJ1dHRvbiBidG4tZHMiPlNraWxsZnVsPC9idXR0b24+DQogICAgICA8YnV0dG9uIGNsYXNzPSJwcm9maWxlLWJ1dHRvbiBidG4tc3RhdHMiPkN1cmlvdXM8L2J1dHRvbj4NCiAgICAgIDxidXR0b24gY2xhc3M9InByb2ZpbGUtYnV0dG9uIGJ0bi1zdGF0czEiPk9yZ2FuaXplZDwvYnV0dG9uPg0KICAgIDwvZGl2Pg0KICA8L2Rpdj4NCjwvZGl2Pg0KJykNCmBgYA0KDQojIENhc2UgU3R1ZHkgMQ0KPGRpdiBjbGFzcz0icGFzdGVsLXB1cnBsZS1ib3giPg0KKipDb25maWRlbmNlIEludGVydmFsIGZvciBNZWFuLCDPgyBLbm93bioqDQoNCkFuIGUtY29tbWVyY2UgcGxhdGZvcm0gd2FudHMgdG8gZXN0aW1hdGUgdGhlIGF2ZXJhZ2UgbnVtYmVyIG9mIGRhaWx5IHRyYW5zYWN0aW9ucyBwZXIgdXNlciBhZnRlciBsYXVuY2hpbmcgYSBuZXcgZmVhdHVyZS4gQmFzZWQgb24gbGFyZ2Utc2NhbGUgaGlzdG9yaWNhbCBkYXRhLCB0aGUgcG9wdWxhdGlvbiBzdGFuZGFyZCBkZXZpYXRpb24gaXMga25vd24uDQoNCiQkXHNpZ21hID0gMy4yJCQNCiQkXCxuID0gMTAwXCwkJA0KJCRcYmFye3h9ID0gMTIuNiQkDQoNCioqVGFza3M6KioNCg0KMS4gSWRlbnRpZnkgdGhlIGFwcHJvcHJpYXRlIHN0YXRpc3RpY2FsIHRlc3QgYW5kIGp1c3RpZnkgeW91ciBjaG9pY2UuDQoNCjIuIENvbXB1dGUgdGhlIENvbmZpZGVuY2UgSW50ZXJ2YWxzIGZvcjoNCiAgIC0gOTAlDQogICAtIDk1JQ0KICAgLSA5OSUNCg0KMy4gQ3JlYXRlIGEgY29tcGFyaXNvbiB2aXN1YWxpemF0aW9uIG9mIHRoZSB0aHJlZSBjb25maWRlbmNlIGludGVydmFscy4NCg0KNC4gSW50ZXJwcmV0IHRoZSByZXN1bHRzIGluIGEgYnVzaW5lc3MgYW5hbHl0aWNzIGNvbnRleHQuDQo8L2Rpdj4NCg0KIyMgVWppIFN0YXRpc3Rpaw0KPGRpdiBjbGFzcz0icGFzdGVsLXB1cnBsZS1ib3giPg0KVWppIHN0YXRpc3RpayB5YW5nIHRlcGF0OiBJbnRlcnZhbCBLZXBlcmNheWFhbiB1bnR1ayBNZWFuIGRlbmdhbiDPgyBkaWtldGFodWkgKFotaW50ZXJ2YWwgLyBVamkgWiB1bnR1ayBtZWFuKQ0KDQoqKkp1c3RpZmlrYXNpOioqDQoNClR1anVhbiBhbmFsaXNpcyBhZGFsYWggbWVuZ2VzdGltYXNpIHJhdGEtcmF0YSBwb3B1bGFzaSAocmF0YS1yYXRhIHRyYW5zYWtzaSBoYXJpYW4gcGVyIHBlbmdndW5hKSwgYnVrYW4gbWVtYmFuZGluZ2thbiBkdWEga2Vsb21wb2sgYXRhdSBtZW5ndWppIHByb3BvcnNpLg0KDQpTaW1wYW5nYW4gYmFrdSBwb3B1bGFzaSAoz4MpIGRpa2V0YWh1aSwgeWFpdHUgz4MgPSAzLDIuIEluaSBhZGFsYWggc3lhcmF0IHV0YW1hIHBlbmdndW5hYW4gZGlzdHJpYnVzaSBaLg0KDQpVa3VyYW4gc2FtcGVsIGJlc2FyIChuID0gMTAwKSwgc2VoaW5nZ2EgYXN1bXNpIGRpc3RyaWJ1c2kgbm9ybWFsIHVudHVrIHJhdGEtcmF0YSBzYW1wZWwgdGVycGVudWhpIGJlcmRhc2Fya2FuIFRlb3JlbWEgTGltaXQgUHVzYXQsIG1lc2tpcHVuIGRpc3RyaWJ1c2kgZGF0YSBhc2xpIHRpZGFrIGRpa2V0YWh1aS4NCg0KRGF0YSBiZXJ1cGEgdmFyaWFiZWwgbnVtZXJpayBrb250aW51IChqdW1sYWggdHJhbnNha3NpKS4NCjwvZGl2Pg0KDQojIyBDb25maWRlbmNlIEludGVydmFsIDkwJQ0KPGRpdiBjbGFzcz0icGFzdGVsLXB1cnBsZS1ib3giPg0KKipSdW11cyBDSSB1bnR1ayBfei1kaXN0cmlidXRpb25fKioNCiQkQ0kgPSBcYmFye3h9IFxwbSB6X3tcYWxwaGEvMn1cLFxmcmFje1xzaWdtYX17XHNxcnR7bn19JCQNCioqU2FtcGxlIFNpemUqKg0KJCR7bn0gPSAxMDAkJA0KDQoqKlN0YW5kYXIgRGV2aWF0aW9uKioNCiQke8+DfSA9IDMuMiQkDQoNCioqU2FtcGxlIE1lYW4qKg0KJCRcYmFye3h9ID0gMTIuNiQkDQoNCioqQ29uZmlkZW5jZSBMZXZlbCA5MCUqKg0KJCQxIC0gMC45ID0gXGZyYWN7MC4xfXsyfSA9IDAuMDUg4omIIDEuNjUkJA0KDQoqKlN0YW5kYXJkIEVycm9yKioNCg0KJCRTRSA9IFxmcmFje1xzaWdtYX17XHNxcnR7bn19JCQNCiQkXGZyYWN7My4yfXtcc3FydHsxMDB9fSA9IDAuMzIkJA0KDQoqKk1hcmdpbiBvZiBFcnJvcioqDQoNCiQkTUUgPSB6X3tcYWxwaGEvMn1cIMOXIFNFJCQgDQokJHsxLjY1fVwgw5cgU0VcIHtcYXBwcm94ezAuNTI4fX0kJA0KDQoqKkNJIDkwJSoqDQoNCiQkXGJhcnt4fVwgXHBtXCBNRSQkDQokJDEyLjZcIFxwbVwgMC41MjgkJA0KJCR7XGFwcHJveFwgKDEyLjA3MiwgMTMuMTI4KX0kJA0KPC9kaXY+DQoNCiMjIENvbmZpZGVuY2UgSW50ZXJ2YWwgOTUlDQo8ZGl2IGNsYXNzPSJwYXN0ZWwtcHVycGxlLWJveCI+DQoqKlJ1bXVzIENJIHVudHVrIF96LWRpc3RyaWJ1dGlvbl8qKg0KJCRDSSA9IFxiYXJ7eH0gXHBtIHpfe1xhbHBoYS8yfVwsXGZyYWN7XHNpZ21hfXtcc3FydHtufX0kJA0KKipTYW1wbGUgU2l6ZSoqDQokJHtufSA9IDEwMCQkDQoNCioqU3RhbmRhciBEZXZpYXRpb24qKg0KJCR7z4N9ID0gMy4yJCQNCg0KKipTYW1wbGUgTWVhbioqDQokJFxiYXJ7eH0gPSAxMi42JCQNCg0KKipDb25maWRlbmNlIExldmVsIDk1JSoqDQokJDEgLSAwLjk1ID0gXGZyYWN7MC4wNX17Mn0gPSAwLjAyNSDiiYggMS45NiQkDQoNCioqU3RhbmRhcmQgRXJyb3IqKg0KDQokJFNFID0gXGZyYWN7XHNpZ21hfXtcc3FydHtufX0kJA0KJCRcZnJhY3szLjJ9e1xzcXJ0ezEwMH19ID0gMC4zMiQkDQoNCioqTWFyZ2luIG9mIEVycm9yKioNCg0KJCRNRSA9IHpfe1xhbHBoYS8yfVwgw5cgU0UkJCANCiQkezEuOTZ9XCDDlyBTRVwge1xhcHByb3h7MC42MjcyfX0kJA0KDQoqKkNJIDk1JSoqDQoNCiQkXGJhcnt4fVwgXHBtXCBNRSQkDQokJDEyLjZcIFxwbVwgMC42MjcyJCQNCiQke1xhcHByb3hcICgxMS45NzI4LCAxMy4yMjcyKX0kJA0KPC9kaXY+DQoNCiMjIENvbmZpZGVuY2UgSW50ZXJ2YWwgOTklDQo8ZGl2IGNsYXNzPSJwYXN0ZWwtcHVycGxlLWJveCI+DQoqKlJ1bXVzIENJIHVudHVrIF96LWRpc3RyaWJ1dGlvbl8qKg0KJCRDSSA9IFxiYXJ7eH0gXHBtIHpfe1xhbHBoYS8yfVwsXGZyYWN7XHNpZ21hfXtcc3FydHtufX0kJA0KDQoqKlNhbXBsZSBTaXplKioNCiQke259ID0gMTAwJCQNCg0KKipTdGFuZGFyIERldmlhdGlvbioqDQokJHvPg30gPSAzLjIkJA0KDQoqKlNhbXBsZSBNZWFuKioNCiQkXGJhcnt4fSA9IDEyLjYkJA0KDQoqKkNvbmZpZGVuY2UgTGV2ZWwgOTklKioNCiQkMSAtIDAuOTkgPSBcZnJhY3swLjAxfXsyfSA9IDAuMDA1IOKJiCAyLjU4JCQNCg0KKipTdGFuZGFyZCBFcnJvcioqDQoNCiQkU0UgPSBcZnJhY3tcc2lnbWF9e1xzcXJ0e259fSQkDQokJFxmcmFjezMuMn17XHNxcnR7MTAwfX0gPSAwLjMyJCQNCg0KKipNYXJnaW4gb2YgRXJyb3IqKg0KDQokJE1FID0gel97XGFscGhhLzJ9XCDDlyBTRSQkIA0KJCR7Mi41OH1cIMOXIFNFXCB7XGFwcHJveHswLjgyfX0kJA0KDQoqKkNJIDk5JSoqDQoNCiQkXGJhcnt4fVwgXHBtXCBNRSQkDQokJDEyLjZcIFxwbVwgMC44MiQkDQokJHtcYXBwcm94XCAoMTEuNzgxLCAxMy40Mil9JCQNCjwvZGl2Pg0KDQojIyBWaXN1YWxpemF0aW9uDQo8ZGl2IGNsYXNzPSJwYXN0ZWwtcHVycGxlLWJveCI+DQpgYGB7ciwgbWVzc2FnZT1GQUxTRSx3YXJuaW5nPUZBTFNFLCBlY2hvPUZBTFNFfQ0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShwbG90bHkpDQojIFBhcmFtZXRlcg0KbWVhbl94IDwtIDEyLjYNCnNpZ21hIDwtIDMuMg0KbiA8LSAxMDANCnNlIDwtIHNpZ21hIC8gc3FydChuKQ0KDQojIENvbmZpZGVuY2UgbGV2ZWxzDQp6X3ZhbHVlcyA8LSBjKDEuNjUsIDEuOTYsIDIuNTgpDQoNCmNpX2xvd2VyIDwtIG1lYW5feCAtIHpfdmFsdWVzICogc2UNCmNpX3VwcGVyIDwtIG1lYW5feCArIHpfdmFsdWVzICogc2UNCg0KY2lfZGF0YSA8LSBkYXRhLmZyYW1lKA0KICBsZXZlbCA9IGMoIjkwJSBDSSIsICI5NSUgQ0kiLCAiOTklIENJIiksDQogIGxvd2VyID0gY2lfbG93ZXIsDQogIHVwcGVyID0gY2lfdXBwZXIsDQogIGNvbG9yID0gYygiI0ZGOUFBMiIsICIjQTBDNEZGIiwgIiNDQkEwREMiKQ0KKQ0KeF92YWxzIDwtIHNlcShtZWFuX3ggLSA0KnNlLCBtZWFuX3ggKyA0KnNlLCBsZW5ndGgub3V0ID0gMTAwMCkNCnlfdmFscyA8LSBkbm9ybSh4X3ZhbHMsIG1lYW5feCwgc2UpDQoNCm5vcm1hbF9kZiA8LSBkYXRhLmZyYW1lKHggPSB4X3ZhbHMsIHkgPSB5X3ZhbHMpDQoNCiMgUGxvdA0KcCA8LSBnZ3Bsb3Qobm9ybWFsX2RmLCBhZXMoeCwgeSkpICsNCiAgZ2VvbV9hcmVhKGZpbGwgPSAiI0E4RTZDRiIsIGFscGhhID0gMC44KSArDQogIGdlb21fbGluZShjb2xvciA9ICJibGFjayIsIGxpbmV3aWR0aCA9IDEuMikgKw0KICANCiAgIyBNZWFuIGxpbmUNCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gbWVhbl94LCBsaW5ldHlwZSA9ICJkYXNoZWQiLCBsaW5ld2lkdGggPSAxKSArDQogIGFubm90YXRlKCJ0ZXh0IiwNCiAgICAgICAgICAgeCA9IG1lYW5feCwNCiAgICAgICAgICAgeSA9IG1heCh5X3ZhbHMpICogMS4wNSwNCiAgICAgICAgICAgbGFiZWwgPSAieMyEID0gMTIuNiIsDQogICAgICAgICAgIHNpemUgPSA1LA0KICAgICAgICAgICBmb250ZmFjZSA9ICJib2xkIikgKw0KICANCiAgIyBDSSBsaW5lcw0KICBnZW9tX3ZsaW5lKGRhdGEgPSBjaV9kYXRhLA0KICAgICAgICAgICAgIGFlcyh4aW50ZXJjZXB0ID0gbG93ZXIsIGNvbG9yID0gbGV2ZWwpLA0KICAgICAgICAgICAgIGxpbmV0eXBlID0gImRvdHRlZCIsDQogICAgICAgICAgICAgbGluZXdpZHRoID0gMSkgKw0KICBnZW9tX3ZsaW5lKGRhdGEgPSBjaV9kYXRhLA0KICAgICAgICAgICAgIGFlcyh4aW50ZXJjZXB0ID0gdXBwZXIsIGNvbG9yID0gbGV2ZWwpLA0KICAgICAgICAgICAgIGxpbmV0eXBlID0gImRvdHRlZCIsDQogICAgICAgICAgICAgbGluZXdpZHRoID0gMSkgKw0KICANCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGNpX2RhdGEkY29sb3IpICsNCiAgbGFicygNCiAgICB0aXRsZSA9ICJDb25maWRlbmNlIEludGVydmFscyAoWi1kaXN0cmlidXRpb24pIiwNCiAgICB4ID0gIlZhbHVlIiwNCiAgICB5ID0gIlByb2JhYmlsaXR5IERlbnNpdHkiLA0KICAgIGNvbG9yID0gIkludGVydmFsIg0KICApICsNCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgxMS41LCAxNCwgMC41KSwgDQogICAgICAgICAgICAgICAgICAgICBsaW1pdHMgPSBjKDExLjMsIDE0LjMpKSArDQogIHNjYWxlX3lfY29udGludW91cyhleHBhbmQgPSBleHBhbnNpb24obXVsdCA9IGMoMCwgMC4xNSkpKSArDQogIA0KICB0aGVtZV9taW5pbWFsKGJhc2Vfc2l6ZSA9IDEzKSArDQogIHRoZW1lKA0KICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoZmFjZSA9ICJib2xkIiwgc2l6ZSA9IDE1LCBoanVzdCA9IDAuNSksDQogICAgcGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICBwYW5lbC5ncmlkLm1ham9yLnkgPSBlbGVtZW50X2xpbmUoY29sb3IgPSAiZ3JheTkwIiksDQogICAgYXhpcy5saW5lLnggPSBlbGVtZW50X2xpbmUoY29sb3IgPSAiZ3JheTMwIiksDQogICAgcGxvdC5tYXJnaW4gPSBtYXJnaW4oMTAsIDEwLCAxMCwgMTApDQogICkNCg0KIyBJbnRlcmFrdGlmIGRlbmdhbiBQbG90bHkNCmdncGxvdGx5KHApDQoNCmBgYA0KDQoNCioqSW50ZXJwcmV0YXRpb24qKg0KDQpEaWFncmFtIGluaSBtZW51bmp1a2thbiBkaXN0cmlidXNpIG5vcm1hbCBkYXJpIHJhdGEtcmF0YSB0cmFuc2Frc2kgaGFyaWFuIHBlbmdndW5hIGRlbmdhbiBtZWFuIHNhbXBlbCBzZWJlc2FyIDEyLDYuIEdhcmlzIHZlcnRpa2FsIGhpdGFtIG1lbmFuZGFpIG5pbGFpIG1lYW4gdGVyc2VidXQsIHNlbWVudGFyYSBnYXJpcyB0aXRpay10aXRpayBiZXJ3YXJuYSBoaWphdSwgYmlydSwgZGFuIG1lcmFoIG1hc2luZy1tYXNpbmcgbWV3YWtpbGkgaW50ZXJ2YWwga2VwZXJjYXlhYW4gOTAlLCA5NSUsIGRhbiA5OSUuIFNlbWFraW4gdGluZ2dpIHRpbmdrYXQga2VwZXJjYXlhYW4sIGludGVydmFsIG1lbmphZGkgbGViaWggbGViYXIsIG1lbmNlcm1pbmthbiB0cmFkZS1vZmYgYW50YXJhIGtleWFraW5hbiBkYW4gcHJlc2lzaSBlc3RpbWFzaS4gDQpEZW5nYW4gZGVtaWtpYW4sIGtpdGEgZGFwYXQgbWVueWltcHVsa2FuIGJhaHdhIGRlbmdhbiBrZXlha2luYW4geWFuZyB0aW5nZ2ksIHJhdGEtcmF0YSB0cmFuc2Frc2kgaGFyaWFuIHBvcHVsYXNpIGtlbXVuZ2tpbmFuIGJlc2FyIGJlcmFkYSBkYWxhbSByZW50YW5nIGludGVydmFsIHRlcnNlYnV0LCB5YW5nIG1lbWJhbnR1IG1lbWJlcmlrYW4gZ2FtYmFyYW4ga2VhbmRhbGFuIGVzdGltYXNpIHJhdGEtcmF0YSB0cmFuc2Frc2kgc2V0ZWxhaCBwZWx1bmN1cmFuIGZpdHVyIGJhcnUuDQo8L2Rpdj4NCg0KIyMgQnVzaW5lc3MgQW5hbHl0aWNzDQo8ZGl2IGNsYXNzPSJwYXN0ZWwtcHVycGxlLWJveCI+DQpDb25maWRlbmNlIGludGVydmFsIG1lbnVuanVra2FuIHJlbnRhbmcgbmlsYWkgZGkgbWFuYSByYXRhLXJhdGEgdHJhbnNha3NpIGhhcmlhbiBwZXIgcGVuZ2d1bmEga2VtdW5na2luYW4gYmVzYXIgYmVyYWRhIGRlbmdhbiB0aW5na2F0IGtleWFraW5hbiB0ZXJ0ZW50dS4gTWlzYWxueWEsIHBhZGEgdGluZ2thdCBrZXBlcmNheWFhbiA5NSUsIHBsYXRmb3JtIGUtY29tbWVyY2UgZGFwYXQgeWFraW4gYmFod2EgcmF0YS1yYXRhIHRyYW5zYWtzaSBoYXJpYW4gcGVyIHBlbmdndW5hIGJlcmFkYSBhbnRhcmEgc2VraXRhciAxMSw5NyBoaW5nZ2EgMTMsMjMgdHJhbnNha3NpLiBJbmkgbWVtYmFudHUgYmlzbmlzIG1lbWFoYW1pIGVmZWt0aXZpdGFzIGZpdHVyIGJhcnUgc2VjYXJhIHN0YXRpc3RpayBkZW5nYW4gbWVtcGVya2lyYWthbiBuaWxhaSByYXRhLXJhdGEgeWFuZyBzZXN1bmdndWhueWEsIGJ1a2FuIGhhbnlhIGJlcmRhc2Fya2FuIHNhbXBlbC4gU2VtYWtpbiB0aW5nZ2kgdGluZ2thdCBrZXBlcmNheWFhbiwgcmVudGFuZyBpbnRlcnZhbCBtZW5qYWRpIGxlYmloIGxlYmFyLCBtZW51bmp1a2thbiBrZXRpZGFrcGFzdGlhbiB5YW5nIGxlYmloIGJlc2FyIHRhcGkganVnYSBrZXlha2luYW4geWFuZyBsZWJpaCBrdWF0IGJhaHdhIG5pbGFpIHNlYmVuYXJueWEgYWRhIGRhbGFtIHJlbnRhbmcgdGVyc2VidXQuIERlbmdhbiBpbmZvcm1hc2kgaW5pLCBtYW5hamVtZW4gZGFwYXQgbWVtYnVhdCBrZXB1dHVzYW4geWFuZyBsZWJpaCB0ZXBhdCBtZW5nZW5haSBrZWJlcmhhc2lsYW4gZml0dXIgZGFuIHBlcmVuY2FuYWFuIGthcGFzaXRhcyB0cmFuc2Frc2kuDQo8L2Rpdj4NCg0KIyBDYXNlIFN0dWR5IDINCjxkaXYgY2xhc3M9InBhc3RlbC1icm93bi1ib3giPg0KKipDb25maWRlbmNlIEludGVydmFsIGZvciBNZWFuLCDPgyBVbmtub3duOioqIA0KDQpBIFVYIFJlc2VhcmNoIHRlYW0gYW5hbHl6ZXMgdGFzayBjb21wbGV0aW9uIHRpbWUgKGluIG1pbnV0ZXMpIGZvciBhIG5ldyBtb2JpbGUgYXBwbGljYXRpb24uIFRoZSBkYXRhIGFyZSBjb2xsZWN0ZWQgZnJvbSAxMiB1c2VyczoNCg0KJCQ4LjQsNy45LDkuMSw4LjcsOC4yLDkuMCw3LjgsOC41LDguOSw4LjEsOC42LDguMyQkDQoNCioqVGFza3M6KioNCg0KMS4gSWRlbnRpZnkgdGhlIGFwcHJvcHJpYXRlIHN0YXRpc3RpY2FsIHRlc3QgYW5kIGV4cGxhaW4gd2h5Lg0KDQoyLiBDb21wdXRlIHRoZSBDb25maWRlbmNlIEludGVydmFscyBmb3I6DQogICAtIDkwJQ0KICAgLSA5NSUNCiAgIC0gOTklDQoNCjMuIFZpc3VhbGl6ZSB0aGUgdGhyZWUgaW50ZXJ2YWxzIG9uIGEgc2luZ2xlIHBsb3QuDQoNCjQuIEV4cGxhaW4gaG93IHNhbXBsZSBzaXplIGFuZCBjb25maWRlbmNlIGxldmVsIGluZmx1ZW5jZSB0aGUgaW50ZXJ2YWwgd2lkdGguDQo8L2Rpdj4NCg0KIyMgVWppIFN0YXRpc3Rpaw0KPGRpdiBjbGFzcz0icGFzdGVsLWJyb3duLWJveCI+DQpVamkgeWFuZyB0ZXBhdCBhZGFsYWggbWVtYnVhdCBpbnRlcnZhbCBrZXBlcmNheWFhbiByYXRhLXJhdGEgbWVuZ2d1bmFrYW4gdC1kaXN0cmlidXNpLCBrYXJlbmEgZGF0YSB5YW5nIGRpYmVyaWthbiBiZXJhc2FsIGRhcmkgMTIgcGVuZ2d1bmEgKHVrdXJhbiBzYW1wZWwga2VjaWwsIHlhaXR1IG4gPCAzMCkgZGFuIHNpbXBhbmdhbiBiYWt1IHBvcHVsYXNpICjPgykgdGlkYWsgZGlrZXRhaHVpLCBtYWthIHVqaSBzdGF0aXN0aWsgeWFuZyB0ZXBhdCB1bnR1ayBtZW1idWF0IGludGVydmFsIGtlcGVyY2F5YWFuIHJhdGEtcmF0YSBhZGFsYWggbWVuZ2d1bmFrYW4gZGlzdHJpYnVzaSB0LVN0dWRlbnQuDQoNCioqQWxhc2FuIG1lbWlsaWggZGlzdHJpYnVzaSB0LToqKg0KDQpVa3VyYW4gc2FtcGVsIGtlY2lsIChuIDwgMzApOiBTYWF0IHVrdXJhbiBzYW1wZWwga2VjaWwsIGRpc3RyaWJ1c2kgc2FtcGxpbmcgcmF0YS1yYXRhIHRpZGFrIG1lbmdpa3V0aSBkaXN0cmlidXNpIG5vcm1hbCBiYWt1IHNlY2FyYSBzZW1wdXJuYSwgc2VoaW5nZ2EgZGlzdHJpYnVzaSB0IGxlYmloIGNvY29rIGRpZ3VuYWthbiBrYXJlbmEgbWVtcGVyaGl0dW5na2FuIGtldGlkYWtwYXN0aWFuIHBhZGEgZXN0aW1hc2kgc2ltcGFuZ2FuIGJha3UuDQoNClNpbXBhbmdhbiBiYWt1IHBvcHVsYXNpIHRpZGFrIGRpa2V0YWh1aTogS2l0YSBoYW55YSBwdW55YSBkYXRhIHNhbXBlbCwgc2VoaW5nZ2Egc2ltcGFuZ2FuIGJha3UgcG9wdWxhc2kgaGFydXMgZGllc3RpbWFzaSBkYXJpIHNpbXBhbmdhbiBiYWt1IHNhbXBlbC4gRGlzdHJpYnVzaSB0LVN0dWRlbnQgZGlyYW5jYW5nIHVudHVrIGtvbmRpc2kgaW5pLg0KDQpEYXRhIGRpYXN1bXNpa2FuIGJlcmFzYWwgZGFyaSBwb3B1bGFzaSB5YW5nIGJlcmRpc3RyaWJ1c2kgbm9ybWFsOiBBc3Vtc2kgaW5pIHBlbnRpbmcgdW50dWsgdmFsaWRpdGFzIHBlbmdndW5hYW4gZGlzdHJpYnVzaSB0Lg0KPC9kaXY+DQojIyBDb25maW5kZW5jZSBJbnRlcnZhbCA5MCUNCjxkaXYgY2xhc3M9InBhc3RlbC1icm93bi1ib3giPg0KKipTYW1wbGUgU2l6ZSoqDQokJG4gPSAxMiQkDQoNCioqU2FtcGxlIE1lYW4qKg0KJCRcYmFye3h9ID0gXGZyYWN7MX17bn0gXHN1bV97aT0xfV57bn0geF9pJCQNCiQkXGJlZ2lue2FsaWduKn0NClxiYXJ7eH0gJj0gXGZyYWN7MX17MTJ9ICg4LjQgKyA3LjkgKyA5LjEgKyA4LjcgKyA4LjIgKyA5LjAgKyA3LjggKyA4LjUgKyA4LjkgKyA4LjEgKyA4LjYgKyA4LjMpIFxcDQomPSA4LjQ1DQpcZW5ke2FsaWduKn0kJA0KDQoqKlN0YW5kYXJkIERldmlhdGlvbioqDQokJHMgPSBcc3FydHtcZnJhY3sxfXtuLTF9IFxzdW1fe2k9MX1ee259ICh4X2kgLSBcYmFye3h9KV4yfSQkDQokJA0KcyA9IFxzcXJ0e1xmcmFjezF9ezEyLTF9IFxCaWdbICg4LjQtOC40NSleMiArICg3LjktOC40NSleMiArICguLi4pXjIgKyg4LjMtOC40NSleMiBcQmlnXX0NCiQkDQoNCiQkDQo9IFxzcXJ0e1xmcmFjezEuOTV9ezExfX0gPSBcc3FydHswLjE3NzI3fSBcYXBwcm94IDAuNDIxDQokJA0KKipDcml0aWNhbCBWYWx1ZSA5MCUqKg0KJCQxIC0gMC45ID0gXGZyYWN7MC4xfXsyfSA9IDAuMDUg4omIIDEuNzk2JCQNCioqU3RhbmRhcmQgRXJyb3IgKFNFKSoqDQokJFNFID0gXGZyYWN7c317XHNxcnR7bn19JCQNCiQkDQpTRSA9IFxmcmFjezAuNDIxfXtcc3FydHsxMn19IA0KPSBcZnJhY3swLjQyMX17My40NjR9IA0KXGFwcHJveCAwLjEyMQ0KJCQNCioqTWFyZ2luIG9mIEVycm9yIChNRSkqKg0KJCQNClxiZWdpbnthbGlnbmVkfQ0KTUUgJj0gdF97XGFscGhhLzIsIGRmfSBcdGltZXMgU0UgPSAxLjc5NiBcdGltZXMgMC4xMjEgXGFwcHJveCAwLjIxNzMNClxlbmR7YWxpZ25lZH0NCiQkDQoqKkNJIDkwJSoqDQokJFxiYXJ7eH1cIFxwbVwgTUUkJA0KJCQ4LjQ1XCBccG1cIDAuMjE3MyQkDQokJHtcYXBwcm94XCAoOC4yMzI3LCA4LjY2NzMpfSQkDQo8L2Rpdj4NCiMjIENvbmZpZGVuY2UgSW50ZXJ2YWwgOTUlDQo8ZGl2IGNsYXNzPSJwYXN0ZWwtYnJvd24tYm94Ij4NCioqU2FtcGxlIFNpemUqKg0KJCRuID0gMTIkJA0KDQoqKlNhbXBsZSBNZWFuKioNCiQkXGJhcnt4fSA9IFxmcmFjezF9e259IFxzdW1fe2k9MX1ee259IHhfaSQkDQokJFxiZWdpbnthbGlnbip9DQpcYmFye3h9ICY9IFxmcmFjezF9ezEyfSAoOC40ICsgNy45ICsgOS4xICsgOC43ICsgOC4yICsgOS4wICsgNy44ICsgOC41ICsgOC45ICsgOC4xICsgOC42ICsgOC4zKSBcXA0KJj0gOC40NQ0KXGVuZHthbGlnbip9JCQNCg0KKipTdGFuZGFyZCBEZXZpYXRpb24qKg0KJCRzID0gXHNxcnR7XGZyYWN7MX17bi0xfSBcc3VtX3tpPTF9XntufSAoeF9pIC0gXGJhcnt4fSleMn0kJA0KJCQNCnMgPSBcc3FydHtcZnJhY3sxfXsxMi0xfSBcQmlnWyAoOC40LTguNDUpXjIgKyAoNy45LTguNDUpXjIgKyAoLi4uKV4yICsoOC4zLTguNDUpXjIgXEJpZ119DQokJA0KDQokJA0KPSBcc3FydHtcZnJhY3sxLjk1fXsxMX19ID0gXHNxcnR7MC4xNzcyN30gXGFwcHJveCAwLjQyMQ0KJCQNCioqQ3JpdGljYWwgVmFsdWUgOTUlKioNCiQkMSAtIDAuOTUgPSBcZnJhY3swLjA1fXsyfSA9IDAuMDI1IOKJiCAyLjIwMSQkDQoqKlN0YW5kYXJkIEVycm9yIChTRSkqKg0KJCRTRSA9IFxmcmFje3N9e1xzcXJ0e259fSQkDQokJA0KU0UgPSBcZnJhY3swLjQyMX17XHNxcnR7MTJ9fSANCj0gXGZyYWN7MC40MjF9ezMuNDY0fSANClxhcHByb3ggMC4xMjENCiQkDQoqKk1hcmdpbiBvZiBFcnJvciAoTUUpKioNCiQkDQpcYmVnaW57YWxpZ25lZH0NCk1FICY9IHRfe1xhbHBoYS8yLCBkZn0gXHRpbWVzIFNFID0gMi4yMDEgXHRpbWVzIDAuMTIxIFxhcHByb3ggMC4yNjYzDQpcZW5ke2FsaWduZWR9DQokJA0KKipDSSA5NSUqKg0KJCRcYmFye3h9XCBccG1cIE1FJCQNCiQkOC40NVwgXHBtXCAwLjI2NjMkJA0KJCR7XGFwcHJveFwgKDguMTgzNywgOC43MTYzKX0kJA0KPC9kaXY+DQojIyBDb25maWRlbmNlIEludGVydmFsIDk5JQ0KPGRpdiBjbGFzcz0icGFzdGVsLWJyb3duLWJveCI+DQoqKlNhbXBsZSBTaXplKioNCiQkbiA9IDEyJCQNCg0KKipTYW1wbGUgTWVhbioqDQokJFxiYXJ7eH0gPSBcZnJhY3sxfXtufSBcc3VtX3tpPTF9XntufSB4X2kkJA0KJCRcYmVnaW57YWxpZ24qfQ0KXGJhcnt4fSAmPSBcZnJhY3sxfXsxMn0gKDguNCArIDcuOSArIDkuMSArIDguNyArIDguMiArIDkuMCArIDcuOCArIDguNSArIDguOSArIDguMSArIDguNiArIDguMykgXFwNCiY9IDguNDUNClxlbmR7YWxpZ24qfSQkDQoNCioqU3RhbmRhcmQgRGV2aWF0aW9uKioNCiQkcyA9IFxzcXJ0e1xmcmFjezF9e24tMX0gXHN1bV97aT0xfV57bn0gKHhfaSAtIFxiYXJ7eH0pXjJ9JCQNCiQkDQpzID0gXHNxcnR7XGZyYWN7MX17MTItMX0gXEJpZ1sgKDguNC04LjQ1KV4yICsgKDcuOS04LjQ1KV4yICsgKC4uLileMiArKDguMy04LjQ1KV4yIFxCaWddfQ0KJCQNCg0KJCQNCj0gXHNxcnR7XGZyYWN7MS45NX17MTF9fSA9IFxzcXJ0ezAuMTc3Mjd9IFxhcHByb3ggMC40MjENCiQkDQoqKkNyaXRpY2FsIFZhbHVlIDk5JSoqDQokJDEgLSAwLjk5ID0gXGZyYWN7MC4wMX17Mn0gPSAwLjAwNSDiiYggMy4xMDYkJA0KKipTdGFuZGFyZCBFcnJvciAoU0UpKioNCiQkU0UgPSBcZnJhY3tzfXtcc3FydHtufX0kJA0KJCQNClNFID0gXGZyYWN7MC40MjF9e1xzcXJ0ezEyfX0gDQo9IFxmcmFjezAuNDIxfXszLjQ2NH0gDQpcYXBwcm94IDAuMTIxDQokJA0KKipNYXJnaW4gb2YgRXJyb3IgKE1FKSoqDQokJA0KXGJlZ2lue2FsaWduZWR9DQpNRSAmPSB0X3tcYWxwaGEvMiwgZGZ9IFx0aW1lcyBTRSA9IDMuMTA2IFx0aW1lcyAwLjEyMSBcYXBwcm94IDAuMzc1OA0KXGVuZHthbGlnbmVkfQ0KJCQNCioqQ0kgOTklKioNCiQkXGJhcnt4fVwgXHBtXCBNRSQkDQokJDguNDVcIFxwbVwgMC4zNzU4JCQNCiQke1xhcHByb3hcICg4LjA3NDIsIDguODI1OCl9JCQNCjwvZGl2Pg0KDQojIyBWaXN1YWxpemF0aW9uDQo8ZGl2IGNsYXNzPSJwYXN0ZWwtYnJvd24tYm94Ij4NCmBgYHtyLCBtZXNzYWdlPUZBTFNFLHdhcm5pbmc9RkFMU0UsIGVjaG89RkFMU0V9DQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KHBsb3RseSkNCg0KIyBQYXJhbWV0ZXINCm1lYW5feCA8LSA4LjQ1DQpzIDwtIDAuNDIxICAgICAgICAjIHNhbXBsZSBzdGFuZGFyZCBkZXZpYXRpb24NCm4gPC0gMTINCnNlIDwtIHMgLyBzcXJ0KG4pDQpkZiA8LSBuIC0gMQ0KDQojIENvbmZpZGVuY2UgbGV2ZWxzICh0IGNyaXRpY2FsIHZhbHVlcykNCmNvbmZfbGV2ZWxzIDwtIGMoMC45MCwgMC45NSwgMC45OSkNCnRfdmFsdWVzIDwtIHF0KDEgLSAoMSAtIGNvbmZfbGV2ZWxzKS8yLCBkZikgICMgdCBjcml0aWNhbCB2YWx1ZXMNCg0KY2lfbG93ZXIgPC0gbWVhbl94IC0gdF92YWx1ZXMgKiBzZQ0KY2lfdXBwZXIgPC0gbWVhbl94ICsgdF92YWx1ZXMgKiBzZQ0KDQpjaV9kYXRhIDwtIGRhdGEuZnJhbWUoDQogIGxldmVsID0gYygiOTAlIENJIiwgIjk1JSBDSSIsICI5OSUgQ0kiKSwNCiAgbG93ZXIgPSBjaV9sb3dlciwNCiAgdXBwZXIgPSBjaV91cHBlciwNCiAgY29sb3IgPSBjKCIjQTBDNEZGIiwgIiNBOEU2Q0YiLCAiI0NCQTBEQyIpDQopDQoNCiMgWCBhbmQgWSB2YWx1ZXMgZm9yIHQtZGlzdHJpYnV0aW9uIGRlbnNpdHkNCnhfdmFscyA8LSBzZXEobWVhbl94IC0gNCpzZSwgbWVhbl94ICsgNCpzZSwgbGVuZ3RoLm91dCA9IDEwMDApDQp5X3ZhbHMgPC0gZHQoKHhfdmFscyAtIG1lYW5feCkvc2UsIGRmKSAvIHNlICAjIHNjYWxlZCB0LWRlbnNpdHkNCg0KdF9kZiA8LSBkYXRhLmZyYW1lKHggPSB4X3ZhbHMsIHkgPSB5X3ZhbHMpDQoNCiMgUGxvdA0KcCA8LSBnZ3Bsb3QodF9kZiwgYWVzKHgsIHkpKSArDQogIGdlb21fYXJlYShmaWxsID0gIiNGRkY1QTUiLCBhbHBoYSA9IDAuOCkgKw0KICBnZW9tX2xpbmUoY29sb3IgPSAiYmxhY2siLCBsaW5ld2lkdGggPSAxLjIpICsNCiAgDQogICMgTWVhbiBsaW5lDQogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IG1lYW5feCwgbGluZXR5cGUgPSAiZGFzaGVkIiwgbGluZXdpZHRoID0gMC43KSArDQogIGFubm90YXRlKCJ0ZXh0IiwNCiAgICAgICAgICAgeCA9IG1lYW5feCwNCiAgICAgICAgICAgeSA9IG1heCh5X3ZhbHMpICogMS4wNSwNCiAgICAgICAgICAgbGFiZWwgPSBwYXN0ZTAoInjMhCA9ICIsIG1lYW5feCksDQogICAgICAgICAgIHNpemUgPSA0LA0KICAgICAgICAgICBmb250ZmFjZSA9ICJib2xkIikgKw0KICANCiAgIyBDSSBsaW5lcyAoZG90dGVkKQ0KICBnZW9tX3ZsaW5lKGRhdGEgPSBjaV9kYXRhLA0KICAgICAgICAgICAgIGFlcyh4aW50ZXJjZXB0ID0gbG93ZXIsIGNvbG9yID0gbGV2ZWwpLA0KICAgICAgICAgICAgIGxpbmV0eXBlID0gImRvdHRlZCIsDQogICAgICAgICAgICAgbGluZXdpZHRoID0gMSkgKw0KICBnZW9tX3ZsaW5lKGRhdGEgPSBjaV9kYXRhLA0KICAgICAgICAgICAgIGFlcyh4aW50ZXJjZXB0ID0gdXBwZXIsIGNvbG9yID0gbGV2ZWwpLA0KICAgICAgICAgICAgIGxpbmV0eXBlID0gImRvdHRlZCIsDQogICAgICAgICAgICAgbGluZXdpZHRoID0gMSkgKw0KICANCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGNpX2RhdGEkY29sb3IpICsNCiAgbGFicygNCiAgICB0aXRsZSA9ICJDb25maWRlbmNlIEludGVydmFscyAoVC1kaXN0cmlidXRpb24pIiwNCiAgICB4ID0gIlZhbHVlIiwNCiAgICB5ID0gIlByb2JhYmlsaXR5IERlbnNpdHkiLA0KICAgIGNvbG9yID0gIkludGVydmFsIg0KICApICsNCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IHNlcSg3LjUsIDkuNSwgMC4yNSksIA0KICAgICAgICAgICAgICAgICAgICAgbGltaXRzID0gYyg3LjgsIDkuNSkpICsNCiAgc2NhbGVfeV9jb250aW51b3VzKGV4cGFuZCA9IGV4cGFuc2lvbihtdWx0ID0gYygwLCAwLjE1KSkpICsNCiAgDQogIHRoZW1lX21pbmltYWwoYmFzZV9zaXplID0gMTMpICsNCiAgdGhlbWUoDQogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChmYWNlID0gImJvbGQiLCBzaXplID0gMTUsIGhqdXN0ID0gMC41KSwNCiAgICBwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpLA0KICAgIHBhbmVsLmdyaWQubWFqb3IueSA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJncmF5OTAiKSwNCiAgICBheGlzLmxpbmUueCA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJncmF5MzAiKSwNCiAgICBwbG90Lm1hcmdpbiA9IG1hcmdpbigxMCwgMTAsIDEwLCAxMCkNCiAgKQ0KDQojIEludGVyYWt0aWYgZGVuZ2FuIFBsb3RseQ0KZ2dwbG90bHkocCkNCg0KDQpgYGANCg0KKipJbnRlcnByZXRhdGlvbioqDQoNCkRpYWdyYW0gdGVyc2VidXQgbWVudW5qdWtrYW4gaW50ZXJ2YWwga2VwZXJjYXlhYW4gcmF0YS1yYXRhIG1lbmdndW5ha2FuIGRpc3RyaWJ1c2kgdCBkZW5nYW4gcmF0YS1yYXRhIHNhbXBlbCBzZWJlc2FyIDgsNDUgeWFuZyBkaXRhbmRhaSBvbGVoIGdhcmlzIHB1dHVzLXB1dHVzIGRpIHRlbmdhaCBrdXJ2YS4gR2FyaXMgdmVydGlrYWwgYmVyd2FybmEgbWVuZ2dhbWJhcmthbiBpbnRlcnZhbCBrZXBlcmNheWFhbiA5MCUsIDk1JSwgZGFuIDk5JSwgZGkgbWFuYSBzZW1ha2luIHRpbmdnaSB0aW5na2F0IGtlcGVyY2F5YWFuIG1ha2EgaW50ZXJ2YWwgc2VtYWtpbiBsZWJhciwgbWVuY2VybWlua2FuIG1lbmluZ2thdG55YSBrZXRpZGFrcGFzdGlhbiBlc3RpbWFzaS4gU2VsdXJ1aCBpbnRlcnZhbCBiZXJzaWZhdCBzaW1ldHJpcyB0ZXJoYWRhcCBuaWxhaSByYXRhLXJhdGEsIG1lbnVuanVra2FuIGJhaHdhIGVzdGltYXNpIG1lYW4gcG9wdWxhc2kgcGFsaW5nIG11bmdraW4gYmVyYWRhIGRpIHNla2l0YXIgOCw0NS4gRGlhZ3JhbSBpbmkgbWVuZWdhc2thbiBiYWh3YSBkaXN0cmlidXNpIHQgZGlndW5ha2FuIGtldGlrYSBzaW1wYW5nYW4gYmFrdSBwb3B1bGFzaSB0aWRhayBkaWtldGFodWkgYXRhdSB1a3VyYW4gc2FtcGVsIHJlbGF0aWYga2VjaWwsIHNlcnRhIG1lbmdnYW1iYXJrYW4gdHJhZGUtb2ZmIGFudGFyYSBwcmVzaXNpIGRhbiB0aW5na2F0IGtleWFraW5hbiBkYWxhbSBwZW5ha3NpcmFuIHBhcmFtZXRlciBwb3B1bGFzaS4NCjwvZGl2Pg0KDQojIyBTYW1wbGUgU2l6ZSBhbmQgQ29uZmlkZW5jZSBMZXZlbA0KPGRpdiBjbGFzcz0icGFzdGVsLWJyb3duLWJveCI+DQpMZWJhciBpbnRlcnZhbCBrZXBlcmNheWFhbiBkaXBlbmdhcnVoaSBvbGVoIHVrdXJhbiBzYW1wZWwgZGFuIHRpbmdrYXQga2VwZXJjYXlhYW4gc2ViYWdhaSBiZXJpa3V0LiBVa3VyYW4gc2FtcGVsIGJlcnBlbmdhcnVoIG1lbGFsdWkgZ2FsYXQgYmFrdSAoc3RhbmRhcmQgZXJyb3IpOyBzZW1ha2luIGJlc2FyIHVrdXJhbiBzYW1wZWwsIGdhbGF0IGJha3Ugc2VtYWtpbiBrZWNpbCBzZWhpbmdnYSBpbnRlcnZhbCBrZXBlcmNheWFhbiBtZW5qYWRpIGxlYmloIHNlbXBpdCBkYW4gZXN0aW1hc2kgbGViaWggcHJlc2lzaSwgc2VkYW5na2FuIHNhbXBlbCBrZWNpbCBtZW5naGFzaWxrYW4gaW50ZXJ2YWwgeWFuZyBsZWJpaCBsZWJhci4gVGluZ2thdCBrZXBlcmNheWFhbiBtZW1lbmdhcnVoaSBuaWxhaSBrcml0aXMgKFogYXRhdSB0KTsgc2VtYWtpbiB0aW5nZ2kgdGluZ2thdCBrZXBlcmNheWFhbiAobWlzYWxueWEgZGFyaSA5MCUga2UgOTUlIGF0YXUgOTklKSwgbmlsYWkga3JpdGlzIHNlbWFraW4gYmVzYXIgc2VoaW5nZ2EgaW50ZXJ2YWwga2VwZXJjYXlhYW4gbWVuamFkaSBsZWJpaCBsZWJhciwga2FyZW5hIGtpdGEgaW5naW4gbGViaWggeWFraW4gYmFod2EgcGFyYW1ldGVyIHBvcHVsYXNpIGJlcmFkYSBkaSBkYWxhbSBpbnRlcnZhbCB0ZXJzZWJ1dC4gRGVuZ2FuIGRlbWlraWFuLCBpbnRlcnZhbCBrZXBlcmNheWFhbiBwYWxpbmcgc2VtcGl0IGRpcGVyb2xlaCBkYXJpIHNhbXBlbCBiZXNhciBkZW5nYW4gdGluZ2thdCBrZXBlcmNheWFhbiBsZWJpaCByZW5kYWgsIGRhbiBzZWJhbGlrbnlhLg0KPC9kaXY+DQoNCg0KIyBDYXNlIFN0dWR5IDMNCjxkaXYgY2xhc3M9InBhc3RlbC1ibHVlLWJveCI+DQoqKkNvbmZpZGVuY2UgSW50ZXJ2YWwgZm9yIGEgUHJvcG9ydGlvbiwgQS9CIFRlc3Rpbmc6KioNCg0KQSBkYXRhIHNjaWVuY2UgdGVhbSBydW5zIGFuIEEvQiB0ZXN0IG9uIGEgbmV3IENhbGwtVG8tQWN0aW9uIChDVEEpIGJ1dHRvbiBkZXNpZ24uIFRoZSBleHBlcmltZW50IHlpZWxkczoNCg0KJCQgbiA9IDQwMCQkDQokJCB4ID0gMTU2JCQNCg0KKipUYXNrczoqKg0KDQoxLiBDb21wdXRlIHRoZSBzYW1wbGUgcHJvcG9ydGlvbiAkXGhhdCB7cH0kDQoNCjIuIENvbXB1dGUgQ29uZmlkZW5jZSBJbnRlcnZhbHMgZm9yIHRoZSBwcm9wb3J0aW9uIGF0Og0KICAgLSA5MCUNCiAgIC0gOTUlDQogICAtIDk5JQ0KDQozLiBWaXN1YWxpemUgYW5kIGNvbXBhcmUgdGhlIHRocmVlIGludGVydmFscy4NCg0KNC4gRXhwbGFpbiBob3cgY29uZmlkZW5jZSBsZXZlbCBhZmZlY3RzIGRlY2lzaW9uLW1ha2luZyBpbiBwcm9kdWN0IGV4cGVyaW1lbnRzLg0KPC9kaXY+DQoNCiMjIFNhbXBsZSBQcm9wb3J0aW9uDQo8ZGl2IGNsYXNzPSJwYXN0ZWwtYmx1ZS1ib3giPg0KJCRcaGF0IHtwfSA9IFxmcmFjIHt4fXtufSA9IFxmcmFjIHsxNTZ9ezQwMH0gPSAwLjM5JCQNCjwvZGl2Pg0KIyMgQ29uZmlkZW5jZSBJbnRlcnZhbCA5MCUNCjxkaXYgY2xhc3M9InBhc3RlbC1ibHVlLWJveCI+DQoqKlN0YW5kYXJkIEVycm9yKioNCiQkDQpcYmVnaW57YWxpZ24qfQ0KU0Vfe1xoYXR7cH19ICY9IFxzcXJ0e1xmcmFje1xoYXR7cH0oMS1caGF0e3B9KX17bn19IFxcDQomPSBcc3FydHtcZnJhY3swLjM5KDEtMC4zOSl9ezQwMH19IFxcDQomPSBcc3FydHtcZnJhY3swLjM5IFxjZG90IDAuNjF9ezQwMH19IFxcDQomXGFwcHJveCAwLjAyNDQNClxlbmR7YWxpZ24qfQ0KJCQNCg0KKipDcml0aWNhbCBWYWx1ZSA5MCUqKg0KDQpVbnR1ayA5MCUgY29uZmlkZW5jZSBsZXZlbDogJFpfe1xhbHBoYS8yfSA9IDEuNjUkDQoNCioqTWFyZ2luIG9mIEVycm9yKioNCiQkIE1FID0gWl97XGFscGhhLzJ9IMOXIFNFID0gMS42NSDDlyAwLjAyNDQgXGFwcHJveCAwLjA0MDI2JCQNCg0KKipDSSA5MCUqKg0KJCRcaGF0e3B9XCBccG1cIE1FJCQNCiQkMC4zOVwgXHBtXCAwLjA0MDI2JCQNCiQke1xhcHByb3hcICgwLjM0OTc0LCAwLjQzMDI2KX0kJA0KPC9kaXY+DQojIyBDb25maWRlbmNlIEludGVydmFsIDk1JQ0KPGRpdiBjbGFzcz0icGFzdGVsLWJsdWUtYm94Ij4NCioqU3RhbmRhcmQgRXJyb3IqKg0KJCQNClxiZWdpbnthbGlnbip9DQpTRV97XGhhdHtwfX0gJj0gXHNxcnR7XGZyYWN7XGhhdHtwfSgxLVxoYXR7cH0pfXtufX0gXFwNCiY9IFxzcXJ0e1xmcmFjezAuMzkoMS0wLjM5KX17NDAwfX0gXFwNCiY9IFxzcXJ0e1xmcmFjezAuMzkgXGNkb3QgMC42MX17NDAwfX0gXFwNCiZcYXBwcm94IDAuMDI0NA0KXGVuZHthbGlnbip9DQokJA0KDQoqKkNyaXRpY2FsIFZhbHVlIDk1JSoqDQoNClVudHVrIDk1JSBjb25maWRlbmNlIGxldmVsOiAkWl97XGFscGhhLzJ9ID0gMS45NiQNCg0KKipNYXJnaW4gb2YgRXJyb3IqKg0KJCQgTUUgPSBaX3tcYWxwaGEvMn0gw5cgU0UgPSAxLjk2IMOXIDAuMDI0NCBcYXBwcm94IDAuMDQ3OCQkDQoNCioqQ0kgOTUlKioNCiQkXGhhdHtwfVwgXHBtXCBNRSQkDQokJDAuMzlcIFxwbVwgMC4wNDc4JCQNCiQke1xhcHByb3hcICgwLjM0MjIsIDAuNDM3OCl9JCQNCjwvZGl2Pg0KIyMgQ29uZmlkZW5jZSBJbnRlcnZhbCA5OSUNCjxkaXYgY2xhc3M9InBhc3RlbC1ibHVlLWJveCI+DQoqKlN0YW5kYXJkIEVycm9yKioNCiQkDQpcYmVnaW57YWxpZ24qfQ0KU0Vfe1xoYXR7cH19ICY9IFxzcXJ0e1xmcmFje1xoYXR7cH0oMS1caGF0e3B9KX17bn19IFxcDQomPSBcc3FydHtcZnJhY3swLjM5KDEtMC4zOSl9ezQwMH19IFxcDQomPSBcc3FydHtcZnJhY3swLjM5IFxjZG90IDAuNjF9ezQwMH19IFxcDQomXGFwcHJveCAwLjAyNDQNClxlbmR7YWxpZ24qfQ0KJCQNCg0KKipDcml0aWNhbCBWYWx1ZSA5OSUqKg0KDQpVbnR1ayA5OSUgY29uZmlkZW5jZSBsZXZlbDogJFpfe1xhbHBoYS8yfSA9IDIuNTgkDQoNCioqTWFyZ2luIG9mIEVycm9yKioNCiQkIE1FID0gWl97XGFscGhhLzJ9IMOXIFNFID0gMi41OCDDlyAwLjAyNDQgXGFwcHJveCAwLjA2MjkkJA0KDQoqKkNJIDklKioNCiQkXGhhdHtwfVwgXHBtXCBNRSQkDQokJDAuMzlcIFxwbVwgMC4wNjI5JCQNCiQke1xhcHByb3hcICgwLjMyNzEsIDAuNDUyOSl9JCQNCjwvZGl2Pg0KDQojIyBWaXN1YWxpemF0aW9uDQo8ZGl2IGNsYXNzPSJwYXN0ZWwtYmx1ZS1ib3giPg0KYGBge3IsIG1lc3NhZ2U9RkFMU0Usd2FybmluZz1GQUxTRSwgZWNobz1GQUxTRX0NCiMgTG9hZCBwYWNrYWdlcw0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShwbG90bHkpDQoNCiMgUGFyYW1ldGVyDQpwX2hhdCA8LSAwLjM5DQpuIDwtIDQwMA0KU0UgPC0gc3FydChwX2hhdCAqICgxIC0gcF9oYXQpIC8gbikNCg0KIyBDb25maWRlbmNlIGxldmVscw0KY29uZl9sZXZlbHMgPC0gYygwLjkwLCAwLjk1LCAwLjk5KQ0Kel92YWx1ZXMgPC0gYygxLjY0NSwgMS45NiwgMi41NzYpICAjIHoga3JpdGlzIHVudHVrIENJDQoNCiMgQ0kgZGF0YSBmcmFtZQ0KY2lfbG93ZXIgPC0gcF9oYXQgLSB6X3ZhbHVlcyAqIFNFDQpjaV91cHBlciA8LSBwX2hhdCArIHpfdmFsdWVzICogU0UNCg0KY2lfZGF0YSA8LSBkYXRhLmZyYW1lKA0KICBsZXZlbCA9IGMoIjkwJSBDSSIsICI5NSUgQ0kiLCAiOTklIENJIiksDQogIGxvd2VyID0gY2lfbG93ZXIsDQogIHVwcGVyID0gY2lfdXBwZXIsDQogIGNvbG9yID0gYygiI0E4RTZDRiIsICIjRkY5QUEyIiwgIiNGRkY1QTUiKQ0KKQ0KDQojIFggdmFsdWVzIGZvciBub3JtYWwgYXBwcm94aW1hdGlvbiBvZiBwcm9wb3J0aW9uDQp4X3ZhbHMgPC0gc2VxKHBfaGF0IC0gNCpTRSwgcF9oYXQgKyA0KlNFLCBsZW5ndGgub3V0ID0gMTAwMCkNCnlfdmFscyA8LSBkbm9ybSh4X3ZhbHMsIG1lYW4gPSBwX2hhdCwgc2QgPSBTRSkNCg0KcHJvcF9kZiA8LSBkYXRhLmZyYW1lKHggPSB4X3ZhbHMsIHkgPSB5X3ZhbHMpDQoNCiMgUGxvdA0KcCA8LSBnZ3Bsb3QocHJvcF9kZiwgYWVzKHgsIHkpKSArDQogIGdlb21fYXJlYShmaWxsID0gIiNDQkEwREMiLCBhbHBoYSA9IDAuOCkgKw0KICBnZW9tX2xpbmUoY29sb3IgPSAiYmxhY2siLCBsaW5ld2lkdGggPSAxLjIpICsNCiAgDQogICMgTWVhbiBsaW5lDQogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IHBfaGF0LCBsaW5ldHlwZSA9ICJkYXNoZWQiLCBsaW5ld2lkdGggPSAwLjcpICsNCiAgYW5ub3RhdGUoInRleHQiLA0KICAgICAgICAgICB4ID0gcF9oYXQsDQogICAgICAgICAgIHkgPSBtYXgoeV92YWxzKSAqIDEuMDUsDQogICAgICAgICAgIGxhYmVsID0gcGFzdGUwKCJwzIIgPSAiLCBwX2hhdCksDQogICAgICAgICAgIHNpemUgPSA0LA0KICAgICAgICAgICBmb250ZmFjZSA9ICJib2xkIikgKw0KICANCiAgIyBDSSBsaW5lcyAoZG90dGVkKQ0KICBnZW9tX3ZsaW5lKGRhdGEgPSBjaV9kYXRhLA0KICAgICAgICAgICAgIGFlcyh4aW50ZXJjZXB0ID0gbG93ZXIsIGNvbG9yID0gbGV2ZWwpLA0KICAgICAgICAgICAgIGxpbmV0eXBlID0gImRvdHRlZCIsDQogICAgICAgICAgICAgbGluZXdpZHRoID0gMSkgKw0KICBnZW9tX3ZsaW5lKGRhdGEgPSBjaV9kYXRhLA0KICAgICAgICAgICAgIGFlcyh4aW50ZXJjZXB0ID0gdXBwZXIsIGNvbG9yID0gbGV2ZWwpLA0KICAgICAgICAgICAgIGxpbmV0eXBlID0gImRvdHRlZCIsDQogICAgICAgICAgICAgbGluZXdpZHRoID0gMSkgKw0KICANCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGNpX2RhdGEkY29sb3IpICsNCiAgbGFicygNCiAgICB0aXRsZSA9ICJDb25maWRlbmNlIEludGVydmFscyBmb3IgU2FtcGxlIFByb3BvcnRpb24iLA0KICAgIHggPSAiU2FtcGxlIFByb3BvcnRpb24iLA0KICAgIHkgPSAiUHJvYmFiaWxpdHkgRGVuc2l0eSIsDQogICAgY29sb3IgPSAiSW50ZXJ2YWwiDQogICkgKw0KICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDAuMywgMC41LCAwLjAyKSwgDQogICAgICAgICAgICAgICAgICAgICBsaW1pdHMgPSBjKDAuMywgMC41KSkgKw0KICBzY2FsZV95X2NvbnRpbnVvdXMoZXhwYW5kID0gZXhwYW5zaW9uKG11bHQgPSBjKDAsIDAuMjApKSkgKw0KICANCiAgdGhlbWVfbWluaW1hbChiYXNlX3NpemUgPSAxMykgKw0KICB0aGVtZSgNCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGZhY2UgPSAiYm9sZCIsIHNpemUgPSAxNSwgaGp1c3QgPSAwLjUpLA0KICAgIHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCksDQogICAgcGFuZWwuZ3JpZC5tYWpvci55ID0gZWxlbWVudF9saW5lKGNvbG9yID0gImdyYXk5MCIpLA0KICAgIGF4aXMubGluZS54ID0gZWxlbWVudF9saW5lKGNvbG9yID0gImdyYXkzMCIpLA0KICAgIHBsb3QubWFyZ2luID0gbWFyZ2luKDEwLCAxMCwgMTAsIDEwKQ0KICApDQoNCiMgSW50ZXJha3RpZg0KZ2dwbG90bHkocCkNCg0KYGBgDQoNCioqSW50ZXJwcmV0YXRpb24qKg0KDQpEaWFncmFtIGluaSBtZW5nZ2FtYmFya2FuIGRpc3RyaWJ1c2kgc2FtcGxpbmcgcHJvcG9yc2kgc2FtcGVsICRcaGF0IHAkIHlhbmcgbWVuZGVrYXRpIG5vcm1hbCwgZGVuZ2FuIG5pbGFpIHRpdGlrIHRlbmdhaCAkXGhhdCBwID0gMHssfTM5JCBzZWJhZ2FpIGVzdGltYXNpIHByb3BvcnNpIHBvcHVsYXNpLCBsYWx1IGRpIGtpcmnigJNrYW5hbm55YSBkaWdhbWJhciBiZWJlcmFwYSBwYXNhbmcgZ2FyaXMgdmVydGlrYWwgYmVyd2FybmEgeWFuZyBtZW51bmp1a2thbiBiYXRhcyBiYXdhaCBkYW4gYXRhcyBpbnRlcnZhbCBrZXBlcmNheWFhbiA5MCUsIDk1JSwgZGFuIDk5JSB1bnR1ayBwcm9wb3JzaSBwb3B1bGFzaSwgZGkgbWFuYSBzZW1ha2luIHRpbmdnaSB0aW5na2F0IGtlcGVyY2F5YWFuIG1ha2EgaW50ZXJ2YWwgc2VtYWtpbiBsZWJhciBrYXJlbmEgaGFydXMg4oCcbWVuYW5na2Fw4oCdIG5pbGFpIHByb3BvcnNpIHBvcHVsYXNpIHNlYmVuYXJueWEgZGVuZ2FuIHByb2JhYmlsaXRhcyB5YW5nIGxlYmloIGJlc2FyLCBzZWhpbmdnYSBzZWNhcmEgaW50ZXJwcmV0YXNpIGppa2EgcGVuZ2FtYmlsYW4gc2FtcGVsIGRpdWxhbmcgYmVya2FsaeKAkWthbGkgZGFuIHNldGlhcCBrYWxpIGRpaGl0dW5nIGludGVydmFsIGtlcGVyY2F5YWFuIChtaXNhbG55YSA5NSUpIHNlcGVydGkgcGFkYSBnYW1iYXIsIG1ha2Ega2lyYeKAkWtpcmEgOTUlIGRhcmkgaW50ZXJ2YWzigJFpbnRlcnZhbCB0ZXJzZWJ1dCBha2FuIG1lbmdhbmR1bmcgcHJvcG9yc2kgcG9wdWxhc2kgc2ViZW5hcm55YSwgZGFuIGRpYWdyYW0gaW5pIG1lbXZpc3VhbGlzYXNpa2FuIGtvbnNlcCB0ZXJzZWJ1dCBkYWxhbSBiZW50dWsga3VydmEgbm9ybWFsIGRhbiBnYXJpcyBiYXRhcyBpbnRlcnZhbCBkaSBzZWtpdGFyICRcaGF0IHAkLg0KPC9kaXY+DQoNCiMjIENvbmZpZGVuY2UgTGV2ZWwgQWZmZWN0cw0KPGRpdiBjbGFzcz0icGFzdGVsLWJsdWUtYm94Ij4NCkRhbGFtIGVrc3BlcmltZW4gcHJvZHVrLCB0aW5na2F0IGtlcGVyY2F5YWFuIG1lbmVudHVrYW4gc2ViZXJhcGEgeWFraW4gdGltIHRlcmhhZGFwIGVmZWsgcGVydWJhaGFuIHNlYmVsdW0gbWVtYnVhdCBrZXB1dHVzYW47IHRpbmdrYXQga2VwZXJjYXlhYW4gdGluZ2dpIChtaXNhbG55YSA5OSUpIG1lbWJ1YXQgaW50ZXJ2YWwgZXN0aW1hc2kgbGViaWggbGViYXIgZGFuIG1lbnVudHV0IGJ1a3RpIHlhbmcgbGViaWgga3VhdCBzZWhpbmdnYSBtZW5ndXJhbmdpIHJpc2lrbyBzYWxhaCBtZW1pbGloIHZhcmlhbiBuYW11biBtZW1idXR1aGthbiBzYW1wZWwgbGViaWggYmVzYXIsIHdha3R1IGxlYmloIGxhbWEsIGRhbiBzZXJpbmcga2FsaSBtZW51bmRhIHBlbHVuY3VyYW4gZml0dXIsIHNlZGFuZ2thbiB0aW5na2F0IGtlcGVyY2F5YWFuIGxlYmloIHJlbmRhaCAobWlzYWxueWEgOTAlKSBtZW5naGFzaWxrYW4gaW50ZXJ2YWwgc2VtcGl0IGRhbiBrZXB1dHVzYW4geWFuZyBsZWJpaCBjZXBhdCBkZW5nYW4gYmlheWEgZGF0YSBsZWJpaCBrZWNpbCwgdGV0YXBpIG1lbmluZ2thdGthbiByaXNpa28gYmFod2EgaGFzaWwgeWFuZyBkaWFuZ2dhcCDigJxtZW5hbmfigJ0gc2ViZW5hcm55YSBoYW55YSBrZWJldHVsYW4sIHNlaGluZ2dhIHBlbWlsaWhhbiA5MCUsIDk1JSwgYXRhdSA5OSUgaGFydXMgZGlzZXN1YWlrYW4gZGVuZ2FuIHByb2ZpbCByaXNpa28gYmlzbmlzIGRhbiBkYW1wYWsga2VwdXR1c2FuIHRlcmhhZGFwIHBlbmdndW5hIG1hdXB1biBzdW1iZXIgZGF5YSBwZXJ1c2FoYWFuLg0KPC9kaXY+DQoNCg0KIyBDYXNlIFN0dWR5IDQNCjxkaXYgY2xhc3M9InBhc3RlbC1ncmVlbi1ib3giPg0KKipQcmVjaXNpb24gQ29tcGFyaXNvbiAoWi1UZXN0IHZzIHQtVGVzdCk6KioNCg0KVHdvIGRhdGEgdGVhbXMgbWVhc3VyZSBBUEkgbGF0ZW5jeSAoaW4gbWlsbGlzZWNvbmRzKSB1bmRlciBkaWZmZXJlbnQgY29uZGl0aW9ucy4NCg0KVGVhbSBBOg0KJCRuID0gMzYkJA0KJCRcYmFye3h9ID0gMjEwJCQNCiQkXHNpZ21hID0gMjQkJA0KDQpUZWFtIEI6DQokJG4gPSAzNiQkDQokJFxiYXJ7eH0gPSAyMTAkJA0KJCRcc2lnbWEgPSAyNCQkDQoNCioqVGFza3M6KioNCg0KMS4gSWRlbnRpZnkgdGhlIHN0YXRpc3RpY2FsIHRlc3QgdXNlZCBieSBlYWNoIHRlYW0uDQoNCjIuIENvbXB1dGUgQ29uZmlkZW5jZSBJbnRlcnZhbHMgZm9yIDkwJSwgOTUlLCBhbmQgOTklLg0KDQozLiBDcmVhdGUgYSB2aXN1YWxpemF0aW9uIGNvbXBhcmluZyBhbGwgaW50ZXJ2YWxzLg0KDQo0LiBFeHBsYWluIHdoeSB0aGUgaW50ZXJ2YWwgd2lkdGhzIGRpZmZlciwgZXZlbiB3aXRoIHNpbWlsYXIgZGF0YS4NCjwvZGl2Pg0KDQojIyBVamkgU3RhdGlzdGlrDQo8ZGl2IGNsYXNzPSJwYXN0ZWwtZ3JlZW4tYm94Ij4NClBhZGEgbm9tb3IgMSwgaWRlbnRpZmlrYXNpIHVqaSBzdGF0aXN0aWsgZGlkYXNhcmthbiBwYWRhIGFwYWthaCAqKnN0YW5kYXIgZGV2aWFzaSBwb3B1bGFzaSBkaWtldGFodWkgYXRhdSB0aWRhayoqLiBUaW0gQSBtZW5nZXRhaHVpIHN0YW5kYXIgZGV2aWFzaSBwb3B1bGFzaSAoz4MgPSAyNCksIHNlaGluZ2dhIG1lcmVrYSBtZW5nZ3VuYWthbiAqKlotdGVzdCoqIGF0YXUgWi1pbnRlcnZhbCB1bnR1ayBtZW5naGl0dW5nIGNvbmZpZGVuY2UgaW50ZXJ2YWwga2FyZW5hIGRpc3RyaWJ1c2kgc2FtcGxpbmcgZGFyaSBtZWFuIGJpc2EgZGlhbmdnYXAgbm9ybWFsLiBTZWJhbGlrbnlhLCBUaW0gQiBoYW55YSBtZW1pbGlraSBzdGFuZGFyIGRldmlhc2kgc2FtcGVsIChzID0gMjQpLCBzZWhpbmdnYSBtZXJla2EgaGFydXMgbWVuZ2d1bmFrYW4gKip0LXRlc3QqKiBhdGF1IHQtaW50ZXJ2YWwsIHlhbmcgbWVtcGVyaGl0dW5na2FuIGtldGlkYWtwYXN0aWFuIHRhbWJhaGFuIGRhcmkgcGVuZ2d1bmFhbiBzYW1wZWwgdW50dWsgbWVtcGVya2lyYWthbiDPgy4gRGVuZ2FuIGRlbWlraWFuLCBwZXJiZWRhYW4gdXRhbWEgZGFsYW0gcGVtaWxpaGFuIHVqaSBhZGFsYWggdGluZ2thdCBpbmZvcm1hc2kgdGVudGFuZyB2YXJpYWJpbGl0YXMgZGF0YTogWiB1bnR1ayDPgyBkaWtldGFodWksIHQgdW50dWsgz4MgdGlkYWsgZGlrZXRhaHVpLg0KPC9kaXY+DQoNCiMjIFRlYW0gQSANCiMjIyBDb25maWRlbmNlIEludGVydmFsIDkwJQ0KPGRpdiBjbGFzcz0icGFzdGVsLWdyZWVuLWJveCI+DQoqKlNhbXBsZSBTaXplKioNCiQke259ID0gMzYkJA0KDQoqKlN0YW5kYXIgRGV2aWF0aW9uKioNCiQke8+DfSA9IDI0JCQNCg0KKipTYW1wbGUgTWVhbioqDQokJFxiYXJ7eH0gPSAyMTAkJA0KDQoqKkNvbmZpZGVuY2UgTGV2ZWwgOTAlKioNCiQkMSAtIDAuOSA9IFxmcmFjezAuMX17Mn0gPSAwLjA1IOKJiCAxLjY1JCQNCg0KKipTdGFuZGFyZCBFcnJvcioqDQoNCiQkU0UgPSBcZnJhY3tcc2lnbWF9e1xzcXJ0e259fSQkDQokJFxmcmFjezI0fXtcc3FydHszNn19ID0gNCQkDQoNCioqTWFyZ2luIG9mIEVycm9yKioNCg0KJCRNRSA9IHpfe1xhbHBoYS8yfVwgw5cgU0UkJCANCiQkezEuNjV9XCDDlyA0XCB7XGFwcHJveHs2LjZ9fSQkDQoNCioqQ0kgOTAlKioNCg0KJCRcYmFye3h9XCBccG1cIE1FJCQNCiQkMjEwXCBccG1cIDYuNiQkDQokJHtcYXBwcm94XCAoMjAzLjQsIDIxNi42KX0kJA0KPC9kaXY+DQoNCiMjIyBDb25maWRlbmNlIEludGVydmFsIDk1JQ0KPGRpdiBjbGFzcz0icGFzdGVsLWdyZWVuLWJveCI+DQoqKlNhbXBsZSBTaXplKioNCiQke259ID0gMzYkJA0KDQoqKlN0YW5kYXIgRGV2aWF0aW9uKioNCiQke8+DfSA9IDI0JCQNCg0KKipTYW1wbGUgTWVhbioqDQokJFxiYXJ7eH0gPSAyMTAkJA0KDQoqKkNvbmZpZGVuY2UgTGV2ZWwgOTUlKioNCiQkMSAtIDAuOTUgPSBcZnJhY3swLjA1fXsyfSA9IDAuMDI1IOKJiCAxLjk2JCQNCg0KKipTdGFuZGFyZCBFcnJvcioqDQoNCiQkU0UgPSBcZnJhY3tcc2lnbWF9e1xzcXJ0e259fSQkDQokJFxmcmFjezI0fXtcc3FydHszNn19ID0gNCQkDQoNCioqTWFyZ2luIG9mIEVycm9yKioNCg0KJCRNRSA9IHpfe1xhbHBoYS8yfVwgw5cgU0UkJCANCiQkezEuOTZ9XCDDlyA0XCB7XGFwcHJveHs3Ljg0fX0kJA0KDQoqKkNJIDk1JSoqDQoNCiQkXGJhcnt4fVwgXHBtXCBNRSQkDQokJDIxMFwgXHBtXCA3Ljg0JCQNCiQke1xhcHByb3hcICgyMDIuMTYsIDIxNy44NCl9JCQNCjwvZGl2Pg0KDQojIyMgQ29uZmlkZW5jZSBJbnRlcnZhbCA5OSUNCjxkaXYgY2xhc3M9InBhc3RlbC1ncmVlbi1ib3giPg0KKipTYW1wbGUgU2l6ZSoqDQokJHtufSA9IDM2JCQNCg0KKipTdGFuZGFyIERldmlhdGlvbioqDQokJHvPg30gPSAyNCQkDQoNCioqU2FtcGxlIE1lYW4qKg0KJCRcYmFye3h9ID0gMjEwJCQNCg0KKipDb25maWRlbmNlIExldmVsIDk5JSoqDQokJDEgLSAwLjk5ID0gXGZyYWN7MC4wMX17Mn0gPSAwLjAwNSDiiYggMi41OCQkDQoNCioqU3RhbmRhcmQgRXJyb3IqKg0KDQokJFNFID0gXGZyYWN7XHNpZ21hfXtcc3FydHtufX0kJA0KJCRcZnJhY3syNH17XHNxcnR7MzZ9fSA9IDQkJA0KDQoqKk1hcmdpbiBvZiBFcnJvcioqDQoNCiQkTUUgPSB6X3tcYWxwaGEvMn1cIMOXIFNFJCQgDQokJHsyLjU4fVwgw5cgNFwge1xhcHByb3h7MTAuMzJ9fSQkDQoNCioqQ0kgOTklKioNCg0KJCRcYmFye3h9XCBccG1cIE1FJCQNCiQkMjEwXCBccG1cIDEwLjMyJCQNCiQke1xhcHByb3hcICgxOTkuNjgsIDIyMC4zMil9JCQNCjwvZGl2Pg0KDQojIyBUZWFtIEINCiMjIyBDb25maWRlbmNlIEludGVydmFsIDkwJQ0KPGRpdiBjbGFzcz0icGFzdGVsLWdyZWVuLWJveCI+DQoqKlJ1bXVzKioNCiQkQ0kgPSBcYmFye3h9IFxwbQ0KIHRfe1xhbHBoYS8yLFwsZGZ9XCxcZnJhY3tzfXtcc3FydHtufX0kJA0KDQoqKlNhbXBsZSBTaXplKioNCiQke259ID0gMzYkJA0KDQoqKlNhbXBsZSBTdGFuZGFyIERldmlhdGlvbioqDQokJHtzfSA9IDI0JCQNCioqZGYqKg0KJCRkZiA9IG4gLTEgPSAzNiAtIDEgPSAzNSQkDQoNCioqU2FtcGxlIE1lYW4qKg0KJCRcYmFye3h9ID0gMjEwJCQNCg0KKipDcml0aWNhbCBWYWx1ZSA5MCUqKg0KJCQxIC0gMC45ID0gXGZyYWN7MC4xfXsyfSA9IDAuMDUg4omIIDEuNjkwJCQNCg0KKipTdGFuZGFyZCBFcnJvcioqDQoNCiQkU0UgPSBcZnJhY3tzfXtcc3FydHtufX0kJA0KJCRcZnJhY3syNH17XHNxcnR7MzZ9fSA9IDQkJA0KDQoqKk1hcmdpbiBvZiBFcnJvcioqDQoNCiQkTUUgPSB0X3tcYWxwaGEvMiAsIGRmfVwgw5cgU0UkJCANCiQkezEuNjkwfVwgw5cgNFwge1xhcHByb3h7Ni43Nn19JCQNCg0KKipDSSA5MCUqKg0KDQokJFxiYXJ7eH1cIFxwbVwgTUUkJA0KJCQyMTBcIFxwbVwgNi43NiQkDQokJHtcYXBwcm94XCAoMjAzLjI0LCAyMTYuNzYpfSQkDQo8L2Rpdj4NCg0KIyMjIENvbmZpZGVuY2UgSW50ZXJ2YWwgOTUlDQo8ZGl2IGNsYXNzPSJwYXN0ZWwtZ3JlZW4tYm94Ij4NCioqUnVtdXMqKg0KJCRDSSA9IFxiYXJ7eH0gXHBtDQogdF97XGFscGhhLzIsXCxkZn1cLFxmcmFje3N9e1xzcXJ0e259fSQkDQogDQoqKlNhbXBsZSBTaXplKioNCiQke259ID0gMzYkJA0KDQoqKlNhbXBsZSBTdGFuZGFyIERldmlhdGlvbioqDQokJHtzfSA9IDI0JCQNCg0KKipTYW1wbGUgTWVhbioqDQokJFxiYXJ7eH0gPSAyMTAkJA0KDQoqKmRmKioNCiQkZGYgPSBuIC0gMSA9IDM1JCQNCg0KKipDcml0aWNhbCBWYWx1ZSA5NSUqKg0KJCQxIC0gMC45NSA9IFxmcmFjezAuMDV9ezJ9ID0gMC4wMjUg4omIIDIuMDMwJCQNCg0KKipTdGFuZGFyZCBFcnJvcioqDQoNCiQkU0UgPSBcZnJhY3tzfXtcc3FydHtufX0kJA0KJCRcZnJhY3syNH17XHNxcnR7MzZ9fSA9IDQkJA0KDQoqKk1hcmdpbiBvZiBFcnJvcioqDQoNCiQkTUUgPSB6X3tcYWxwaGEvMn1cIMOXIFNFJCQgDQokJHsyLjAzMH1cIMOXIDRcIHtcYXBwcm94ezguMTJ9fSQkDQoNCioqQ0kgOTUlKioNCg0KJCRcYmFye3h9XCBccG1cIE1FJCQNCiQkMjEwXCBccG1cIDguMTIkJA0KJCR7XGFwcHJveFwgKDIwMS44OCwgMjE4LjEyKX0kJA0KPC9kaXY+DQoNCiMjIyBDb25maWRlbmNlIEludGVydmFsIDk5JQ0KPGRpdiBjbGFzcz0icGFzdGVsLWdyZWVuLWJveCI+DQoqKlJ1bXVzKioNCiQkQ0kgPSBcYmFye3h9IFxwbQ0KIHRfe1xhbHBoYS8yLFwsZGZ9XCxcZnJhY3tzfXtcc3FydHtufX0kJA0KIA0KKipTYW1wbGUgU2l6ZSoqDQokJHtufSA9IDM2JCQNCg0KKipTYW1wbGUgU3RhbmRhciBEZXZpYXRpb24qKg0KJCR7c30gPSAyNCQkDQoNCioqU2FtcGxlIE1lYW4qKg0KJCRcYmFye3h9ID0gMjEwJCQNCg0KKipkZioqDQokJGRmID0gbiAtIDEgPSAzNSQkDQoNCioqQ3JpdGljYWwgVmFsdWUgOTklKioNCiQkMSAtIDAuOTkgPSBcZnJhY3swLjAxfXsyfSA9IDAuMDA1IOKJiCAyLjcyNCQkDQoNCioqU3RhbmRhcmQgRXJyb3IqKg0KDQokJFNFID0gXGZyYWN7c317XHNxcnR7bn19JCQNCiQkXGZyYWN7MjR9e1xzcXJ0ezM2fX0gPSA0JCQNCg0KKipNYXJnaW4gb2YgRXJyb3IqKg0KDQokJE1FID0gel97XGFscGhhLzJ9XCDDlyBTRSQkIA0KJCR7Mi43MjR9XCDDlyA0XCB7XGFwcHJveHsxMC45MH19JCQNCg0KKipDSSA5OSUqKg0KDQokJFxiYXJ7eH1cIFxwbVwgTUUkJA0KJCQyMTBcIFxwbVwgMTAuOTAkJA0KJCR7XGFwcHJveFwgKDE5OS4xMCwgMjIwLjkwKX0kJA0KPC9kaXY+DQoNCiMjIFZpc3VhbGl6YXRpb24NCiMjIyBUZWFtIEENCjxkaXYgY2xhc3M9InBhc3RlbC1ncmVlbi1ib3giPg0KYGBge3IsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGVjaG89RkFMU0V9DQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KHBsb3RseSkNCg0KbWVhbl94IDwtIDIxMA0Kc2lnbWEgPC0gMjQNCm4gPC0gMzYNCnNlIDwtIHNpZ21hIC8gc3FydChuKQ0KDQojIENvbmZpZGVuY2UgbGV2ZWxzIChaKQ0Kel92YWx1ZXMgPC0gYygxLjY0NSwgMS45NiwgMi41NzYpDQoNCmNpX2xvd2VyIDwtIG1lYW5feCAtIHpfdmFsdWVzICogc2UNCmNpX3VwcGVyIDwtIG1lYW5feCArIHpfdmFsdWVzICogc2UNCg0KY2lfZGF0YSA8LSBkYXRhLmZyYW1lKA0KICBsZXZlbCA9IGMoIjkwJSBDSSIsICI5NSUgQ0kiLCAiOTklIENJIiksDQogIGxvd2VyID0gY2lfbG93ZXIsDQogIHVwcGVyID0gY2lfdXBwZXIsDQogIGNvbG9yID0gYygiI0ZGOUFBMiIsICIjQThFNkNGIiwgIiNDQkEwREMiKQ0KKQ0KDQojIERlbnNpdHkgZGF0YQ0KeF92YWxzIDwtIHNlcShtZWFuX3ggLSA0KnNlLCBtZWFuX3ggKyA0KnNlLCBsZW5ndGgub3V0ID0gMTAwMCkNCnlfdmFscyA8LSBkbm9ybSh4X3ZhbHMsIG1lYW5feCwgc2UpDQoNCm5vcm1hbF9kZiA8LSBkYXRhLmZyYW1lKHggPSB4X3ZhbHMsIHkgPSB5X3ZhbHMpDQoNCiMgUGxvdA0KcF9BIDwtIGdncGxvdChub3JtYWxfZGYsIGFlcyh4LCB5KSkgKw0KICBnZW9tX2FyZWEoZmlsbCA9ICIjQTBDNEZGIiwgYWxwaGEgPSAwLjgpICsNCiAgZ2VvbV9saW5lKGNvbG9yID0gImJsYWNrIiwgbGluZXdpZHRoID0gMS4yKSArDQogIA0KICAjIE1lYW4NCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gbWVhbl94LCBsaW5ldHlwZSA9ICJkYXNoZWQiLCBsaW5ld2lkdGggPSAxKSArDQogIGFubm90YXRlKA0KICAgICJ0ZXh0IiwNCiAgICB4ID0gbWVhbl94LA0KICAgIHkgPSBtYXgoeV92YWxzKSAqIDEuMDUsDQogICAgbGFiZWwgPSAieMyEID0yMTAiLA0KICAgIHNpemUgPSA1LA0KICAgIGZvbnRmYWNlID0gImJvbGQiDQogICkgKw0KICANCiAgIyBDSSBsaW5lcw0KICBnZW9tX3ZsaW5lKGRhdGEgPSBjaV9kYXRhLA0KICAgICAgICAgICAgIGFlcyh4aW50ZXJjZXB0ID0gbG93ZXIsIGNvbG9yID0gbGV2ZWwpLA0KICAgICAgICAgICAgIGxpbmV0eXBlID0gImRvdHRlZCIsIGxpbmV3aWR0aCA9IDEpICsNCiAgZ2VvbV92bGluZShkYXRhID0gY2lfZGF0YSwNCiAgICAgICAgICAgICBhZXMoeGludGVyY2VwdCA9IHVwcGVyLCBjb2xvciA9IGxldmVsKSwNCiAgICAgICAgICAgICBsaW5ldHlwZSA9ICJkb3R0ZWQiLCBsaW5ld2lkdGggPSAxKSArDQogIA0KICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gY2lfZGF0YSRjb2xvcikgKw0KICBsYWJzKA0KICAgIHRpdGxlID0gIlRlYW0gQSDigJMgQ29uZmlkZW5jZSBJbnRlcnZhbHMgKFotZGlzdHJpYnV0aW9uKSIsDQogICAgeCA9ICJBUEkgTGF0ZW5jeSAobXMpIiwNCiAgICB5ID0gIlByb2JhYmlsaXR5IERlbnNpdHkiLA0KICAgIGNvbG9yID0gIkludGVydmFsIg0KICApICsNCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgxOTUsIDIzNSwgNSksIGxpbWl0cyA9IGMoMTk0LDI0MCkpKw0KICBzY2FsZV95X2NvbnRpbnVvdXMoZXhwYW5kID0gZXhwYW5zaW9uKG11bHQgPSBjKDAsIDAuMTUpKSkgKw0KICB0aGVtZV9taW5pbWFsKGJhc2Vfc2l6ZSA9IDEzKSArDQogIHRoZW1lKA0KICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoZmFjZSA9ICJib2xkIiwgaGp1c3QgPSAwLjUpLA0KICAgIHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCkNCiAgKQ0KDQojIEludGVyYWt0aWYNCmdncGxvdGx5KHBfQSkNCg0KYGBgDQo8L2Rpdj4NCg0KIyMjIFRlYW0gQg0KPGRpdiBjbGFzcz0icGFzdGVsLWdyZWVuLWJveCI+DQpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSxlY2hvPUZBTFNFfQ0KbWVhbl94IDwtIDIxMA0KcyA8LSAyNA0KbiA8LSAzNg0KZGYgPC0gbiAtIDENCnNlIDwtIHMgLyBzcXJ0KG4pDQoNCiMgQ29uZmlkZW5jZSBsZXZlbHMgKHQpDQp0X3ZhbHVlcyA8LSBjKDEuNjkwLCAyLjAzMCwgMi43MjQpDQoNCmNpX2xvd2VyIDwtIG1lYW5feCAtIHRfdmFsdWVzICogc2UNCmNpX3VwcGVyIDwtIG1lYW5feCArIHRfdmFsdWVzICogc2UNCg0KY2lfZGF0YSA8LSBkYXRhLmZyYW1lKA0KICBsZXZlbCA9IGMoIjkwJSBDSSIsICI5NSUgQ0kiLCAiOTklIENJIiksDQogIGxvd2VyID0gY2lfbG93ZXIsDQogIHVwcGVyID0gY2lfdXBwZXIsDQogIGNvbG9yID0gYygicGluayIsICIjQTBDNEZGIiwgIiNBOEU2Q0YiKQ0KKQ0KDQojIERlbnNpdHkgZGF0YSAodCBkaXN0cmlidXRpb24pDQp4X3ZhbHMgPC0gc2VxKG1lYW5feCAtIDQqc2UsIG1lYW5feCArIDQqc2UsIGxlbmd0aC5vdXQgPSAxMDAwKQ0KeV92YWxzIDwtIGR0KCh4X3ZhbHMgLSBtZWFuX3gpIC8gc2UsIGRmID0gZGYpIC8gc2UNCg0KdF9kZiA8LSBkYXRhLmZyYW1lKHggPSB4X3ZhbHMsIHkgPSB5X3ZhbHMpDQoNCiMgUGxvdA0KcF9CIDwtIGdncGxvdCh0X2RmLCBhZXMoeCwgeSkpICsNCiAgZ2VvbV9hcmVhKGZpbGwgPSAiI0ZGRDZBNSIsIGFscGhhID0gMC44KSArDQogIGdlb21fbGluZShjb2xvciA9ICJibGFjayIsIGxpbmV3aWR0aCA9IDEuMikgKw0KICANCiAgIyBNZWFuDQogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IG1lYW5feCwgbGluZXR5cGUgPSAiZGFzaGVkIiwgbGluZXdpZHRoID0gMSkgKw0KICBhbm5vdGF0ZSgNCiAgICAidGV4dCIsDQogICAgeCA9IG1lYW5feCwNCiAgICB5ID0gbWF4KHlfdmFscykgKiAxLjA1LA0KICAgIGxhYmVsID0gInjMhCA9IDIxMCIsDQogICAgc2l6ZSA9IDUsDQogICAgZm9udGZhY2UgPSAiYm9sZCINCiAgKSArDQogIA0KICAjIENJIGxpbmVzDQogIGdlb21fdmxpbmUoZGF0YSA9IGNpX2RhdGEsDQogICAgICAgICAgICAgYWVzKHhpbnRlcmNlcHQgPSBsb3dlciwgY29sb3IgPSBsZXZlbCksDQogICAgICAgICAgICAgbGluZXR5cGUgPSAiZG90dGVkIiwgbGluZXdpZHRoID0gMSkgKw0KICBnZW9tX3ZsaW5lKGRhdGEgPSBjaV9kYXRhLA0KICAgICAgICAgICAgIGFlcyh4aW50ZXJjZXB0ID0gdXBwZXIsIGNvbG9yID0gbGV2ZWwpLA0KICAgICAgICAgICAgIGxpbmV0eXBlID0gImRvdHRlZCIsIGxpbmV3aWR0aCA9IDEpICsNCiAgDQogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjaV9kYXRhJGNvbG9yKSArDQogIGxhYnMoDQogICAgdGl0bGUgPSAiVGVhbSBCIOKAkyBDb25maWRlbmNlIEludGVydmFscyAodC1kaXN0cmlidXRpb24pIiwNCiAgICB4ID0gIkFQSSBMYXRlbmN5IChtcykiLA0KICAgIHkgPSAiUHJvYmFiaWxpdHkgRGVuc2l0eSIsDQogICAgY29sb3IgPSAiSW50ZXJ2YWwiDQogICkgKw0KICAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgxOTUsIDIzNSwgNSksIGxpbWl0cyA9IGMoMTk0LDI0MCkpKw0KICBzY2FsZV95X2NvbnRpbnVvdXMoZXhwYW5kID0gZXhwYW5zaW9uKG11bHQgPSBjKDAsIDAuMTUpKSkgKw0KICB0aGVtZV9taW5pbWFsKGJhc2Vfc2l6ZSA9IDEzKSArDQogIHRoZW1lKA0KICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoZmFjZSA9ICJib2xkIiwgaGp1c3QgPSAwLjUpLA0KICAgIHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCkNCiAgKQ0KDQojIEludGVyYWt0aWYNCmdncGxvdGx5KHBfQikNCmBgYA0KPC9kaXY+DQoNCiMjIEludGVydmFsIFdpZHRocyBEaWZmZXINCjxkaXYgY2xhc3M9InBhc3RlbC1ncmVlbi1ib3giPg0KTWVza2lwdW4gVGVhbSBBIGRhbiBUZWFtIEIgbWVtaWxpa2kgKipyYXRhLXJhdGEgc2FtcGVsLCB1a3VyYW4gc2FtcGVsLCBkYW4gbmlsYWkgdmFyaWFzaSB5YW5nIHNhbWEqKiwgbGViYXIgKmNvbmZpZGVuY2UgaW50ZXJ2YWwqIChDSSkgeWFuZyBkaWhhc2lsa2FuIHRldGFwIGJlcmJlZGEga2FyZW5hICoqcGVyYmVkYWFuIGFzdW1zaSBzdGF0aXN0aWsgZGFuIGRpc3RyaWJ1c2kgeWFuZyBkaWd1bmFrYW4qKi4gVGVhbSBBIG1lbmdndW5ha2FuICoqZGlzdHJpYnVzaSBub3JtYWwgKFotZGlzdHJpYnV0aW9uKSoqIGthcmVuYSBzdGFuZGFyIGRldmlhc2kgcG9wdWxhc2kgKM+DKSBkaWtldGFodWksIHNlaGluZ2dhIGtldGlkYWtwYXN0aWFuIGhhbnlhIGJlcmFzYWwgZGFyaSB2YXJpYXNpIHNhbXBlbCBkYW4gbWVuZ2hhc2lsa2FuIGludGVydmFsIHlhbmcgcmVsYXRpZiAqKmxlYmloIHNlbXBpdCoqLiBTZWJhbGlrbnlhLCBUZWFtIEIgbWVuZ2d1bmFrYW4gKipkaXN0cmlidXNpIHQqKiBrYXJlbmEgc3RhbmRhciBkZXZpYXNpIHBvcHVsYXNpIHRpZGFrIGRpa2V0YWh1aSBkYW4gaGFydXMgZGllc3RpbWFzaSBkYXJpIHNhbXBlbCwgc2VoaW5nZ2EgdGVyZGFwYXQgKiprZXRpZGFrcGFzdGlhbiB0YW1iYWhhbioqIGRhbGFtIGVzdGltYXNpIHZhcmlhbnMuIERpc3RyaWJ1c2kgdCBtZW1pbGlraSAqKmVrb3IgeWFuZyBsZWJpaCB0ZWJhbCoqIGRpYmFuZGluZyBkaXN0cmlidXNpIG5vcm1hbCwgeWFuZyBtZW55ZWJhYmthbiBuaWxhaSBrcml0aXMgKHQpIGxlYmloIGJlc2FyIGRhcmlwYWRhIG5pbGFpIFogcGFkYSB0aW5na2F0IGtlcGVyY2F5YWFuIHlhbmcgc2FtYS4gQWtpYmF0bnlhLCAqY29uZmlkZW5jZSBpbnRlcnZhbCogVGVhbSBCIG1lbmphZGkgKipzZWRpa2l0IGxlYmloIGxlYmFyKiosIG1lc2tpcHVuIGRhdGEgZGFzYXJueWEgdGFtcGFrIHNlcnVwYS4NCjwvZGl2Pg0KDQoNCiMgQ2FzZSBTdHVkeSA1DQo8ZGl2IGNsYXNzPSJwYXN0ZWwtbWFyb29uLWJveCI+DQoqKk9uZS1TaWRlZCBDb25maWRlbmNlIEludGVydmFsOioqDQoNCkEgU29mdHdhcmUgYXMgYSBTZXJ2aWNlIChTYWFTKSBjb21wYW55IHdhbnRzIHRvIGVuc3VyZSB0aGF0IGF0IGxlYXN0IDcwJSBvZiB3ZWVrbHkgYWN0aXZlIHVzZXJzIHV0aWxpemUgYSBwcmVtaXVtIGZlYXR1cmUuDQoNCkZyb20gdGhlIGV4cGVyaW1lbnQ6DQoNCiQkbiA9IDI1MCQkDQokJHggPSAxODUkJA0KDQpNYW5hZ2VtZW50IGlzIG9ubHkgaW50ZXJlc3RlZCBpbiB0aGUgKipsb3dlciBib3VuZCoqIG9mIHRoZSBlc3RpbWF0ZS4NCg0KKipUYXNrczoqKg0KDQoxLiBJZGVudGlmeSB0aGUgdHlwZSBvZiBDb25maWRlbmNlIEludGVydmFsIGFuZCB0aGUgYXBwcm9wcmlhdGUgdGVzdC4NCg0KMi4gQ29tcHV0ZSB0aGUgb25lLXNpZGVkIGxvd2VyIENvbmZpZGVuY2UgSW50ZXJ2YWwgYXQ6DQogICAtIDkwJQ0KICAgLSA5NSUNCiAgIC0gOTklDQogICANCjMuIFZpc3VhbGl6ZSB0aGUgbG93ZXIgYm91bmRzIGZvciBhbGwgY29uZmlkZW5jZSBsZXZlbHMuDQoNCjQuIERldGVybWluZSB3aGV0aGVyIHRoZSA3MCUgdGFyZ2V0IGlzIHN0YXRpc3RpY2FsbHkgc2F0aXNmaWVkLg0KPC9kaXY+DQoNCiMjIFVqaSBTdGF0aXN0aWsNCjxkaXYgY2xhc3M9InBhc3RlbC1tYXJvb24tYm94Ij4NCkNvbmZpZGVuY2UgSW50ZXJ2YWwgc2F0dSBzaXNpIChsb3dlciBib3VuZCBvbmUtc2lkZWQgQ0kpIHVudHVrIHByb3BvcnNpIHBvcHVsYXNpLg0KDQpVamkgU3RhdGlzdGlrIHlhbmcgVGVwYXQ6DQpPbmUtc2FtcGxlIHByb3BvcnRpb24gei10ZXN0ICh1amkgeiBzYXR1IHNpc2kpDQprYXJlbmEgU2FtcGVsIGN1a3VwIGJlc2FyICjwnZGb8J2RnSBkYW4gICDwnZGbKDHiiJLwnZGdKT41LCBraXRhIG1lbmdlc3RpbWFzaSBwcm9wb3JzaSBwb3B1bGFzaSwgbWFuYWplbWVuIGhhbnlhIHBlZHVsaSBwYWRhIGJhdGFzIGJhd2FoIChhcGFrYWgg4omlIDcwJT8pLg0KPC9kaXY+DQoNCiMjIENvbmZpZGVuY2UgSW50ZXJ2YWwgOTAlDQo8ZGl2IGNsYXNzPSJwYXN0ZWwtbWFyb29uLWJveCI+DQoqKlNhbXBsZSBQcm9wb3J0aW9uKioNCiQkXGhhdCB7cH0gPSBcZnJhYyB7eH17bn0gPSBcZnJhYyB7MTg1fXsyNTB9ID0gMC43NCQkDQoqKlN0YW5kYXJkIEVycm9yKioNCiQkDQpcYmVnaW57YWxpZ24qfQ0KU0Vfe1xoYXR7cH19ICY9IFxzcXJ0e1xmcmFje1xoYXR7cH0oMS1caGF0e3B9KX17bn19IFxcDQomPSBcc3FydHtcZnJhY3swLjc0KDEtMC43NCl9ezI1MH19IFxcDQomXGFwcHJveCAwLjAyNzcNClxlbmR7YWxpZ24qfQ0KJCQNCg0KKipDcml0aWNhbCBWYWx1ZSA5MCUqKg0KDQpVbnR1ayA5MCUgY29uZmlkZW5jZSBsZXZlbDogJFpfeyAxIC1cYWxwaGF9ID0gMS4yOCQNCg0KKipNYXJnaW4gb2YgRXJyb3IqKg0KJCQgTUUgPSBaX3sxIC0gXGFscGhhfSDDlyBTRSA9IDEuMjggw5cgMC4wMjc3IFxhcHByb3ggMC4wMzU0JCQNCg0KKipDSSA5MCUqKg0KJCRDSSBfbG93ZXIgPSBcaGF0e3B9IC0gTUUkJA0KJCQwLjc0IC0gMC4wMzU0IFxhcHByb3ggMC43MDQ2JCQNCjwvZGl2Pg0KDQojIyBDb25maWRlbmNlIEludGVydmFsIDk1JQ0KPGRpdiBjbGFzcz0icGFzdGVsLW1hcm9vbi1ib3giPg0KKipTYW1wbGUgUHJvcG9ydGlvbioqDQokJFxoYXQge3B9ID0gXGZyYWMge3h9e259ID0gXGZyYWMgezE4NX17MjUwfSA9IDAuNzQkJA0KKipTdGFuZGFyZCBFcnJvcioqDQokJA0KXGJlZ2lue2FsaWduKn0NClNFX3tcaGF0e3B9fSAmPSBcc3FydHtcZnJhY3tcaGF0e3B9KDEtXGhhdHtwfSl9e259fSBcXA0KJj0gXHNxcnR7XGZyYWN7MC43NCgxLTAuNzQpfXsyNTB9fSBcXA0KJlxhcHByb3ggMC4wMjc3DQpcZW5ke2FsaWduKn0NCiQkDQoNCioqQ3JpdGljYWwgVmFsdWUgOTUlKioNCg0KVW50dWsgOTUlIGNvbmZpZGVuY2UgbGV2ZWw6ICRaX3sgMSAtXGFscGhhfSA9IDEuNjQ1JA0KDQoqKk1hcmdpbiBvZiBFcnJvcioqDQokJCBNRSA9IFpfezEgLSBcYWxwaGF9IMOXIFNFID0gMS42NDUgw5cgMC4wMjc3IFxhcHByb3ggMC4wNDU1JCQNCg0KKipDSSA5NSUqKg0KJCRDSSBfbG93ZXIgPSBcaGF0e3B9IC0gTUUkJA0KJCQwLjc0IC0gMC4wNDU1IFxhcHByb3ggMC42OTQ1JCQNCjwvZGl2Pg0KDQojIyBDb25maWRlbmNlIEludGVydmFsIDk5JQ0KPGRpdiBjbGFzcz0icGFzdGVsLW1hcm9vbi1ib3giPg0KKipTYW1wbGUgUHJvcG9ydGlvbioqDQokJFxoYXQge3B9ID0gXGZyYWMge3h9e259ID0gXGZyYWMgezE4NX17MjUwfSA9IDAuNzQkJA0KKipTdGFuZGFyZCBFcnJvcioqDQokJA0KXGJlZ2lue2FsaWduKn0NClNFX3tcaGF0e3B9fSAmPSBcc3FydHtcZnJhY3tcaGF0e3B9KDEtXGhhdHtwfSl9e259fSBcXA0KJj0gXHNxcnR7XGZyYWN7MC43NCgxLTAuNzQpfXsyNTB9fSBcXA0KJlxhcHByb3ggMC4wMjc3DQpcZW5ke2FsaWduKn0NCiQkDQoNCioqQ3JpdGljYWwgVmFsdWUgOTklKioNCg0KVW50dWsgOTklIGNvbmZpZGVuY2UgbGV2ZWw6ICRaX3sgMSAtXGFscGhhfSA9IDIuMzMkDQoNCioqTWFyZ2luIG9mIEVycm9yKioNCiQkIE1FID0gWl97MSAtIFxhbHBoYX0gw5cgU0UgPSAyLjMzIMOXIDAuMDI3NyBcYXBwcm94IDAuMDY0NSQkDQoNCioqQ0kgOTklKioNCiQkQ0kgX2xvd2VyID0gXGhhdHtwfSAtIE1FJCQNCiQkMC43NCAtIDAuMDY0NSBcYXBwcm94IDAuNjc1NSQkDQo8L2Rpdj4NCg0KIyMgVmlzdWFsaXphdGlvbg0KPGRpdiBjbGFzcz0icGFzdGVsLW1hcm9vbi1ib3giPg0KYGBge3IsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGVjaG89RkFMU0V9DQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KHBsb3RseSkNCg0KIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCiMgUGFyYW1ldGVyIERhdGEgRWtzcGVyaW1lbg0KIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCm4gPC0gMjUwICAgICAgICAgICAgICAjIHRvdGFsIHVzZXJzDQp4IDwtIDE4NSAgICAgICAgICAgICAgIyBwcmVtaXVtIGFjdGl2ZSB1c2Vycw0KcF9oYXQgPC0geCAvIG4gICAgICAgICMgc2FtcGxlIHByb3BvcnRpb24NCg0KIyBTdGFuZGFyZCBFcnJvcg0Kc2UgPC0gc3FydChwX2hhdCAqICgxIC0gcF9oYXQpIC8gbikNCg0KIyBDb25maWRlbmNlIGxldmVscyAmIFogdmFsdWVzIChvbmUtc2lkZWQpDQpjaV9sZXZlbHMgPC0gYygiOTAlIiwgIjk1JSIsICI5OSUiKQ0Kel92YWx1ZXMgPC0gYygxLjI4MTYsIDEuNjQ0OSwgMi4zMjYzKQ0KDQojIExvd2VyIGJvdW5kcw0KbG93ZXJfYm91bmRzIDwtIHBfaGF0IC0gel92YWx1ZXMgKiBzZQ0KDQpjaV9kYXRhIDwtIGRhdGEuZnJhbWUoDQogIGxldmVsID0gY2lfbGV2ZWxzLA0KICBsb3dlciA9IGxvd2VyX2JvdW5kcywNCiAgY29sb3IgPSBjKCIjQThFNkNGIiwgIiNBMEM0RkYiLCAiI0NCQTBEQyIpDQopDQoNCiMgVGFyZ2V0IHByb3BvcnNpDQp0YXJnZXQgPC0gMC43MA0KDQojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KIyBEaXN0cmlidXNpIFNhbXBsaW5nIFByb3BvcnNpDQojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KeF92YWxzIDwtIHNlcShwX2hhdCAtIDQqc2UsIHBfaGF0ICsgNCpzZSwgbGVuZ3RoLm91dCA9IDEwMDApDQp5X3ZhbHMgPC0gZG5vcm0oeF92YWxzLCBtZWFuID0gcF9oYXQsIHNkID0gc2UpDQoNCmRpc3RfZGYgPC0gZGF0YS5mcmFtZSh4ID0geF92YWxzLCB5ID0geV92YWxzKQ0KDQojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KIyBQbG90DQojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KcCA8LSBnZ3Bsb3QoZGlzdF9kZiwgYWVzKHgsIHkpKSArDQogIGdlb21fYXJlYShmaWxsID0gInBpbmsiLCBhbHBoYSA9IDAuOCkgKw0KICBnZW9tX2xpbmUoY29sb3IgPSAiYmxhY2siLCBsaW5ld2lkdGggPSAxLjIpICsNCiAgDQogICMgR2FyaXMgcHJvcG9yc2kgc2FtcGVsDQogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IHBfaGF0LCBsaW5ldHlwZSA9ICJkYXNoZWQiLCBsaW5ld2lkdGggPSAxKSArDQogIGFubm90YXRlKCJ0ZXh0IiwNCiAgICAgICAgICAgeCA9IHBfaGF0LA0KICAgICAgICAgICB5ID0gbWF4KHlfdmFscykgKiAxLjA4LA0KICAgICAgICAgICBsYWJlbCA9ICJwzIIgPSAwLjc0IiwNCiAgICAgICAgICAgc2l6ZSA9IDUsDQogICAgICAgICAgIGZvbnRmYWNlID0gImJvbGQiKSArDQogIA0KICAjIEdhcmlzIHRhcmdldCA3MCUNCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gdGFyZ2V0LCBjb2xvciA9ICJyZWQiLCBsaW5ld2lkdGggPSAxKSArDQogIGFubm90YXRlKCJ0ZXh0IiwNCiAgICAgICAgICAgeCA9IHRhcmdldCwNCiAgICAgICAgICAgeSA9IG1heCh5X3ZhbHMpICogMC45NSwNCiAgICAgICAgICAgbGFiZWwgPSAiNzAlIiwNCiAgICAgICAgICAgY29sb3IgPSAicmVkIiwNCiAgICAgICAgICAgYW5nbGUgPSA5MCwNCiAgICAgICAgICAgdmp1c3QgPSAtMC41LA0KICAgICAgICAgICBzaXplID0gNCkgKw0KICANCiAgIyBMb3dlciBDb25maWRlbmNlIEludGVydmFscw0KICBnZW9tX3ZsaW5lKGRhdGEgPSBjaV9kYXRhLA0KICAgICAgICAgICAgIGFlcyh4aW50ZXJjZXB0ID0gbG93ZXIsIGNvbG9yID0gbGV2ZWwpLA0KICAgICAgICAgICAgIGxpbmV0eXBlID0gImRvdHRlZCIsDQogICAgICAgICAgICAgbGluZXdpZHRoID0gMS4yKSArDQogIA0KICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gY2lfZGF0YSRjb2xvcikgKw0KICANCiAgbGFicygNCiAgICB0aXRsZSA9ICJPbmUtU2lkZWQgTG93ZXIgQ29uZmlkZW5jZSBJbnRlcnZhbFxuUHJvcG9yc2kgUGVuZ2d1bmEgUHJlbWl1bSBBa3RpZiIsDQogICAgeCA9ICJQcm9wb3JzaSIsDQogICAgeSA9ICJEZW5zaXR5IiwNCiAgICBjb2xvciA9ICJDb25maWRlbmNlIExldmVsIg0KICApICsNCiAgDQogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBzZXEoMC42NCwgMC44NCwgMC4wMiksDQogICAgICAgICAgICAgICAgICAgICBsaW1pdHMgPSBjKDAuNjMsIDAuODcpKSArDQogIHNjYWxlX3lfY29udGludW91cyhleHBhbmQgPSBleHBhbnNpb24obXVsdCA9IGMoMCwgMC4xNSkpKSArDQogIA0KICB0aGVtZV9taW5pbWFsKGJhc2Vfc2l6ZSA9IDEzKSArDQogIHRoZW1lKA0KICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoZmFjZSA9ICJib2xkIiwgc2l6ZSA9IDE1LCBoanVzdCA9IDAuNSksDQogICAgcGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICBwYW5lbC5ncmlkLm1ham9yLnkgPSBlbGVtZW50X2xpbmUoY29sb3IgPSAiZ3JheTkwIiksDQogICAgYXhpcy5saW5lLnggPSBlbGVtZW50X2xpbmUoY29sb3IgPSAiZ3JheTMwIiksDQogICAgcGxvdC5tYXJnaW4gPSBtYXJnaW4oMTAsIDEwLCAxMCwgMTApDQogICkNCg0KIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCiMgSW50ZXJha3RpZiBkZW5nYW4gUGxvdGx5DQojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KZ2dwbG90bHkocCkNCg0KYGBgDQoNCioqSW50ZXJwcmV0YXRpb24qKg0KDQpEaWFncmFtIHRlcnNlYnV0IG1lbmdnYW1iYXJrYW4gaW50ZXJ2YWwga2VwZXJjYXlhYW4gc2F0dSBzaXNpIGJhdGFzIGJhd2FoIChvbmUtc2lkZWQgbG93ZXIgY29uZmlkZW5jZSBpbnRlcnZhbCkgdW50dWsgcHJvcG9yc2kgcGVuZ2d1bmEgcHJlbWl1bSBha3RpZiwgZGVuZ2FuIGVzdGltYXNpIHByb3BvcnNpIHNhbXBlbCBwzIIgPSAwLDc0IHlhbmcgZGl0dW5qdWtrYW4gb2xlaCBnYXJpcyBwdXR1cy1wdXR1cyBkaSB0ZW5nYWguIEdhcmlzIHZlcnRpa2FsIGRpIHNlYmVsYWgga2lyaSBtZW51bmp1a2thbiBiYXRhcyBiYXdhaCBpbnRlcnZhbCBrZXBlcmNheWFhbiBwYWRhIHRpbmdrYXQga2VwZXJjYXlhYW4gOTAlLCA5NSUsIGRhbiA5OSUsIGRpIG1hbmEgc2VtYWtpbiB0aW5nZ2kgdGluZ2thdCBrZXBlcmNheWFhbiBtYWthIGJhdGFzIGJhd2FoIHNlbWFraW4gYmVyZ2VzZXIga2Uga2lyaSAoc2VtYWtpbiBrb25zZXJ2YXRpZikuIEludGVycHJldGFzaW55YSBhZGFsYWgsIG1pc2FsbnlhIHBhZGEgdGluZ2thdCBrZXBlcmNheWFhbiB0ZXJ0ZW50dSwga2l0YSB5YWtpbiBiYWh3YSBwcm9wb3JzaSBzZWJlbmFybnlhIHBlbmdndW5hIHByZW1pdW0gYWt0aWYgZGkgcG9wdWxhc2kgc2V0aWRha255YSBzZWJlc2FyIG5pbGFpIGJhdGFzIGJhd2FoIHRlcnNlYnV0LCBzZW1lbnRhcmEgbmlsYWkgZGkgYXRhcyBiYXRhcyB0ZXJzZWJ1dCBtYXNpaCBtdW5na2luIHRlcmphZGkuIEludGVydmFsIHNhdHUgc2lzaSBpbmkgZGlndW5ha2FuIGtldGlrYSBmb2t1cyBhbmFsaXNpcyBhZGFsYWggbWVtYXN0aWthbiBuaWxhaSBtaW5pbXVtIHByb3BvcnNpIHBvcHVsYXNpLCBidWthbiByZW50YW5nIGF0YXPigJNiYXdhaCBzZWNhcmEgc2ltdWx0YW4uDQo8L2Rpdj4NCg0KIyMgRGV0ZXJtaW5lIDcwJQ0KPGRpdiBjbGFzcz0icGFzdGVsLW1hcm9vbi1ib3giPg0KVGFyZ2V0ICoqNzAlIHBlbmdndW5hIGFrdGlmIGZpdHVyIHByZW1pdW0qKiAqKnRlcnBlbnVoaSBzZWNhcmEgc3RhdGlzdGlrIGhhbnlhIHBhZGEgdGluZ2thdCBrZXBlcmNheWFhbiA5MCUqKiwga2FyZW5hIGJhdGFzIGJhd2FoICpvbmUtc2lkZWQgY29uZmlkZW5jZSBpbnRlcnZhbCogcGFkYSBsZXZlbCBpbmkgbWFzaWggYmVyYWRhIGRpIGF0YXMgNzAlLiBOYW11biwgcGFkYSB0aW5na2F0IGtlcGVyY2F5YWFuIHlhbmcgbGViaWgga2V0YXQgeWFpdHUgKio5NSUgZGFuIDk5JSoqLCBiYXRhcyBiYXdhaCBpbnRlcnZhbCB0dXJ1biBkaSBiYXdhaCA3MCUsIHNlaGluZ2dhIHRpZGFrIGFkYSBjdWt1cCBidWt0aSBzdGF0aXN0aWsgdW50dWsgbWVueWF0YWthbiBiYWh3YSBwcm9wb3JzaSBwZW5nZ3VuYSBwcmVtaXVtIGFrdGlmIG1pbmltYWwgNzAlIGRlbmdhbiBrZXlha2luYW4geWFuZyBsZWJpaCB0aW5nZ2kuIEFydGlueWEsIG1lc2tpcHVuIGVzdGltYXNpIHByb3BvcnNpIHNhbXBlbCBzZWJlc2FyICoqNzQlKiogdGVybGloYXQgbWVtZW51aGkgdGFyZ2V0IHNlY2FyYSBkZXNrcmlwdGlmLCBzZWNhcmEgc3RhdGlzdGlrIHRhcmdldCB0ZXJzZWJ1dCAqKmJlbHVtIGRhcGF0IGRpcGFzdGlrYW4qKiBqaWthIG1hbmFqZW1lbiBtZW5zeWFyYXRrYW4gdGluZ2thdCBrZXBlcmNheWFhbiA5NSUgYXRhdSBsZWJpaC4NCjwvZGl2Pg0K