UTS Teknik Sampling dan Survey

Teknik Sampling dan Survey

1 Soal 1

Andaikan anda adalah bagian dari Tim riset lapangan yang diminta untuk melakukan survei tingkat penggunaan aplikasi tranportasi online di 3 kota menengah di Sumatera. Target sampel total adalah 600 responden, masing masing 200 per kota. Tetapi setelah 2 minggu melakukan survey anda menemukan: - Di kota A, tim berhasil mendapatkan 250 responden. - Di kota B, hanya 120 responden yang dapat di wawancarai. - Di kota C, 180 responden.

Intruksi:

  1. Jelaskan dua jenis kesalahan sampling yang terjadi berdasarkan situasi ini.
  2. Jika anda harus menyesuaikan bobot untuk mengembalikan representasi proporsional, bagaimana anda akan menghitungnya?

1.1 a. Dua Jenis Kesalahan Sampling dalam Situasi Ini

  1. Ketidakseimbangan Sampel (Sampling Bias)
    Dalam survei ini, setiap kota seharusnya memiliki jumlah responden yang sama, yaitu 200 orang. Namun kenyataannya, jumlah responden berbeda-beda: Kota A melebihi target, sementara Kota B tidak memenuhi kuota. Hal ini membuat sebagian kota punya pengaruh lebih besar terhadap hasil akhir, yang dapat mengarah pada kesimpulan yang kurang representatif.

  2. Ketidakresponan (Nonresponse Bias)
    Di Kota B, hanya sebagian kecil dari target yang berhasil diwawancara (120 dari 200). Ketidakhadiran respon dari kelompok tertentu bisa menciptakan celah dalam data, apalagi jika mereka memiliki karakteristik yang berbeda dari yang merespon. Ini bisa menyebabkan hasil survei tidak mencerminkan kondisi sebenarnya dari populasi kota tersebut.

1.2 b. Cara Menghitung Bobot Penyesuaian agar Representatif

Karena target awal adalah pembagian merata (200 responden per kota dari total 600 orang), setiap kota seharusnya menyumbang sekitar 33,3% dari keseluruhan data.

Namun, jumlah aktual yang terkumpul berbeda:

  • Kota A: 250 responden
  • Kota B: 120 responden
  • Kota C: 180 responden
  • Total: 550 responden

1.2.1 Langkah-langkah Menghitung Bobot:

  1. Hitung proporsi responden tiap kota dari total aktual:
Kota Jumlah Aktual Proporsi Aktual
A 250 250 / 550 ≈ 0,4545
B 120 120 / 550 ≈ 0,2182
C 180 180 / 550 ≈ 0,3273
  1. Bandingkan dengan proporsi target (ideal):
    Setiap kota ditargetkan 1/3 dari total → 0,3333

  2. Rumus bobot untuk tiap kota:

\[ \text{Bobot} = \frac{\text{Proporsi Target}}{\text{Proporsi yang Diperoleh}} \]

Hasilnya:

Kota Proporsi Target Proporsi Aktual Bobot Penyesuaian
A 0,3333 0,4545 0,733
B 0,3333 0,2182 1,528
C 0,3333 0,3273 1,018

1.3 Kesimpulan:

Dengan menerapkan bobot tersebut, kontribusi tiap kota dalam analisis dapat diseimbangkan kembali sesuai rencana awal. Kota A akan “dikurangi” pengaruhnya karena kelebihan data, sedangkan Kota B akan “diperkuat” karena kekurangan data.

2 Soal 2

Buatlah desain rancangan survei tentang persepsi kenyamanan pengguna ojek online saat jam sibuk (07.00-09.00 dan 17.00-19.00)

Intruksi:

  1. Desain pendakatan samping yang memungkinkan anda menangkap persepsi pengguna secara representatif pada jam sibuk, tanpa melakukan survei sepanjang hari.
  2. Sertakan rancangan waktu, metode pemilihan responden, dan justifikasi pemilihan unit samping.
  3. Jelaskan bagaimana anda akan menyesuaikan hasil survei jika 60% responden berasal dari pagi hari, sementara 40% berasal dari sore hari, sedangkan data historis menunjukkan pengguna ojek online saat sore hari dua kali lebih banyak dibanding pagi.

2.1 a. Pendekatan Sampling yang Digunakan

Untuk mendapatkan data yang representatif tentang kenyamanan pengguna ojek online saat jam sibuk, tanpa perlu melakukan survei sepanjang hari, pendekatan yang digunakan adalah:

Time-Based Stratified Sampling (Stratifikasi Berdasarkan Waktu).

Waktu sibuk dibagi menjadi dua strata: - Pagi: 07.00 – 09.00 - Sore: 17.00 – 19.00

Dengan metode ini, pengumpulan data difokuskan hanya pada periode sibuk, dan masing-masing waktu diperlakukan sebagai subkelompok dengan jumlah responden yang terkontrol. Hal ini memungkinkan pengambilan data yang lebih efisien tanpa mengorbankan representativitas.

2.2 b. Rancangan Waktu, Metode Pemilihan Responden, dan Justifikasi Unit Sampling

2.2.1 Rancangan Waktu Pelaksanaan

  • Hari pelaksanaan: Senin – Jumat (hari kerja), selama 1 minggu.
  • Sesi pagi: jam 07.00–09.00
  • Sesi sore: jam 17.00–19.00

Pengumpulan data dilakukan hanya selama dua jam pada masing-masing sesi, dengan target seimbang antara pagi dan sore hari.

2.2.2 Metode Pemilihan Responden

  • Teknik: Intercept Sampling di lokasi strategis.
  • Proses: Responden dipilih secara acak dari pengguna yang baru saja menyelesaikan perjalanan menggunakan ojek online, baik dari aplikasi seperti Gojek maupun Grab.
  • Syarat responden: Pernah menggunakan ojek online selama jam sibuk pada hari tersebut.

2.2.3 Lokasi Pengumpulan Data

  • Pagi: permukiman padat penduduk, stasiun kereta, terminal bus, dan area kos mahasiswa atau pekerja.
  • Sore: area perkantoran, pusat belanja, kampus, dan titik penurunan penumpang ojek online.

2.2.4 Justifikasi Unit Sampling

  • Unit sampling: individu pengguna ojek online.
  • Pengguna adalah sumber informasi primer yang paling akurat untuk menilai kenyamanan perjalanan, karena mereka mengalami langsung kondisi lalu lintas dan layanan pengemudi selama jam sibuk.

2.3 c. Penyesuaian Hasil Survei (Pembobotan Responden Berdasarkan Waktu)

Misalnya dari hasil survei terkumpul: - 60% responden dari sesi pagi - 40% dari sesi sore

Namun data historis menunjukkan bahwa: - Jumlah pengguna sore hari = 2 kali jumlah pengguna pagi

2.3.1 Proporsi Ideal (berdasarkan data historis):

  • Pagi: 1 bagian → 1 / (1+2) = 0,33
  • Sore: 2 bagian → 2 / (1+2) = 0,67

2.3.2 Proporsi Aktual (hasil survei):

  • Pagi: 60% → 0,60
  • Sore: 40% → 0,40

2.3.3 Rumus Bobot Penyesuaian:

\[ \text{Bobot} = \frac{\text{Proporsi Ideal}}{\text{Proporsi Aktual}} \]

2.3.4 Perhitungan Bobot:

Waktu Proporsi Ideal Proporsi Aktual Bobot
Pagi 0,33 0,60 0,33 / 0,60 ≈ 0,55
Sore 0,67 0,40 0,67 / 0,40 ≈ 1,68

2.3.5 Interpretasi:

  • Respon dari pagi hari perlu dikurangi pengaruhnya dengan bobot 0,55.
  • Respon dari sore hari perlu diperkuat dengan bobot 1,68 agar mencerminkan distribusi pengguna aktual.

2.4 Kesimpulan

Dengan pendekatan stratifikasi waktu, survei bisa dilakukan secara efisien tanpa kehilangan representativitas. Penggunaan pembobotan memperbaiki ketidakseimbangan proporsi responden dan membantu menghasilkan kesimpulan yang lebih akurat sesuai dengan profil pengguna ojek online yang sebenarnya.

3 Soal 3

Anda ditugaskan oleh biro akademik kampus untuk merancang instrumen survei yang bertujuan mengevaluasi kepuasan mahasiswa terhadap layanan akademik, yang mencakup layanan seperti: KRS online, bimbingan akademik, pelayanan administrasi, akses informasi akademik, dan bantuan penyelesaian studi.

Tim peniliti meminta anda untuk:

  • Merancang 25 pertanyaan utama dengan variasi skala dan bentuk pertanyaan.
  • Merancang sistem validasi instrumen
  • Menentukan metode distribusi dan pengujian kuesioner secara statistik.
  • Menyiapkan simulasi strategi pengambilan sampel dan pengolahan data awal.

Output laporan yang diharapkan berbentuk naratif, mencakup:

  • Desain pertanyaan
  • Skema validasi
  • Strategi distribusi dan sampling
  • Simulasi data dan analisis awal

3.1 Desain Instrumen Survei

Survei ini dirancang untuk mengukur tingkat kepuasan mahasiswa terhadap berbagai aspek layanan akademik yang disediakan oleh kampus. Fokus utama survei meliputi layanan KRS online, bimbingan akademik, layanan administrasi, akses informasi akademik, serta dukungan penyelesaian studi.

Kuesioner disusun secara komprehensif dengan 25 pertanyaan utama, terdiri dari pertanyaan tertutup (menggunakan skala Likert dan pilihan ganda) serta pertanyaan terbuka guna menangkap tanggapan yang lebih mendalam dari responden. Struktur pertanyaan dibagi ke dalam lima kategori layanan sebagai berikut:

  1. Kemudahan dan kualitas layanan KRS online, termasuk aksesibilitas, kecepatan, dan bantuan yang tersedia.
  2. Efektivitas bimbingan akademik, mencakup kemudahan bertemu dosen pembimbing, perhatian terhadap kemajuan studi, dan komunikasi selama proses bimbingan.
  3. Kinerja pelayanan administrasi, seperti kecepatan respon, kemudahan prosedur, serta sikap petugas layanan.
  4. Akses terhadap informasi akademik, meliputi keterjangkauan informasi, kelengkapan konten, serta media penyampaian informasi.
  5. Bentuk dukungan dalam menyelesaikan studi, baik berupa bantuan akademik maupun non-akademik.

Untuk menjangkau responden secara efektif, survei ini disebarluaskan melalui platform Google Form, berikut adalah link nya https://forms.gle/55HvknABj9CpzMmT7 . Distribusinya dilakukan secara daring dengan strategi berikut:

  • Dibagikan ke grup WhatsApp tiap angkatan untuk menjangkau mahasiswa lintas tahun.
  • Dikoordinasikan melalui dukungan dosen wali dan admin fakultas guna memastikan jangkauan lebih luas dan keterlibatan responden dari berbagai latar belakang akademik.

Dengan pendekatan ini, diharapkan data yang dikumpulkan dapat mewakili pengalaman dan persepsi mahasiswa secara menyeluruh terhadap layanan akademik yang mereka terima.

3.2 Validitas

Untuk menjamin bahwa instrumen survei benar-benar dapat mengukur tingkat kepuasan mahasiswa terhadap layanan akademik secara akurat dan konsisten, proses validasi dan reliabilitas dilakukan dengan tahapan sebagai berikut:

3.2.1 Validitas Isi (Content Validity)

Sebelum instrumen disebarkan kepada responden, tim penyusun melakukan review menyeluruh terhadap setiap butir pertanyaan. Proses ini melibatkan:

  • Dosen pembimbing dan staf administrasi akademik, sebagai validator yang memahami konteks layanan di lingkungan kampus.
  • Penyesuaian item pertanyaan dengan standar mutu layanan akademik yang berlaku di institusi, termasuk aspek seperti KRS Online, Bimbingan Akademik, Pelayanan Administrasi, Akses Informasi, dan Bantuan Studi.

Hasilnya, seluruh 25 butir pertanyaan telah dinyatakan representatif dan layak untuk mengukur indikator yang ditargetkan.

3.2.2 Validitas Konstruk (Construct Validity)

Data dari 40 responden awal yang telah mengisi kuesioner melalui Google Form digunakan untuk menguji validitas konstruk melalui analisis faktor eksploratori (Exploratory Factor Analysis).

Hasil pengujian menunjukkan bahwa item-item dalam instrumen cenderung berkelompok sesuai dengan dimensi layanan akademik yang telah dirancang sebelumnya, seperti:

  • Dimensi KRS Online
  • Bimbingan Akademik
  • Administrasi
  • Akses Informasi Akademik
  • Bantuan Penyelesaian Studi

3.2.3 Validitas Kriteria (Criterion Validity)

Sebagai bentuk penguatan, dilakukan pendekatan awal dengan mengamati keterkaitan antara skor survei dengan indikator-indikator eksternal, seperti:

  • Frekuensi keluhan akademik di semester berjalan
  • Tingkat kelulusan tepat waktu

Meskipun belum dilakukan uji korelasi secara mendalam, pola data menunjukkan hubungan yang searah, di mana tingkat kepuasan lebih tinggi selaras dengan minimnya keluhan dan peningkatan penyelesaian studi.

3.3 Strategi Distribusi dan Sampling

3.3.1 Metode Distribusi

Untuk menjaring persepsi mahasiswa terhadap layanan akademik, instrumen survei didistribusikan secara online menggunakan Google Forms, sehingga memudahkan akses dari berbagai perangkat.

Rincian strategi distribusi sebagai berikut:

  1. Media: Tautan kuesioner dibagikan melalui grup WhatsApp angkatan, dosen wali, serta platform media sosial internal kampus (misalnya Telegram fakultas dan Instagram Himpunan Mahasiswa).

  2. Periode Survei: Survei dilaksanakan selama satu minggu aktif di pertengahan semester, tepatnya antara minggu ke-8 hingga minggu ke-9, ketika mahasiswa telah memiliki pengalaman berinteraksi dengan sistem akademik seperti KRS, bimbingan, dan administrasi.

  3. Strategi Promosi: Penyebaran informasi survei dilakukan melalui broadcast WhatsApp, pengumuman di e-learning kampus, dan ajakan partisipasi dari dosen wali serta staf akademik.

3.3.2 Strategi Sampling

Menggunakan pendekatan Stratified Random Sampling, dengan strata berdasarkan program studi dan tahun angkatan mahasiswa. Meskipun target ideal awalnya adalah 385 responden, pada tahap uji coba awal ini diperoleh sebanyak 40 responden sebagai sampel awal untuk mengevaluasi kualitas instrumen dan mengidentifikasi perbaikan sebelum distribusi skala besar.

3.3.2.1 Detail Sampling

  • Populasi: Seluruh mahasiswa aktif dari 5 program studi utama (Sains Data, Informatika, Teknik Pertambangan, Perminyakan, dan Metalurgi).

  • Strata: Dikelompokkan berdasarkan angkatan (tahun pertama hingga tahun keempat) dan program studi.

  • Teknik Pemilihan: Mahasiswa dalam setiap strata dipilih secara acak dari database akademik, menggunakan random number generator untuk memastikan keterwakilan dan objektivitas.

3.3.3 Ukuran Sampel (Simulasi)

Walaupun saat ini data yang tersedia berasal dari 40 responden, perhitungan teoritis ukuran sampel menggunakan rumus Slovin tetap dicantumkan sebagai acuan untuk perluasan survei berikutnya:

\[ n = \frac{N}{1 + N \cdot e^2} \] dengan: - \(N = 10.000\) (jumlah populasi mahasiswa aktif) - \(e = 0,05\) (margin of error 5%)

\[ n = \frac{10.000}{1 + 10.000 \cdot 0,0025} \approx 385 \]

Sehingga target pengumpulan data tahap lanjutan adalah 400 responden, untuk mengantisipasi data yang tidak lengkap atau tidak valid.

3.3.4 Distribusi Sampel Sementara

Data awal sebanyak 40 responden mencakup mahasiswa dari berbagai angkatan dan program studi, namun belum merata sepenuhnya. Hal ini wajar mengingat pengumpulan dilakukan dalam konteks uji coba. Distribusi akhir nantinya akan disesuaikan dengan proporsi jumlah mahasiswa dari tiap strata.

3.3.5 Prosedur dan Pengolahan Awal

  • Data yang masuk diekstraksi dalam format CSV untuk memudahkan analisis menggunakan perangkat lunak statistik.
  • Identitas responden dijaga kerahasiaannya sesuai prinsip etika penelitian.
  • Seluruh 25 item survei telah diisi lengkap oleh 40 responden dan siap digunakan untuk:
    • Uji validitas
    • Uji reliabilitas
    • Analisis statistik deskriptif awal (seperti rerata, standar deviasi, dan distribusi skor per dimensi layanan akademik).

3.4 Simulasi Data dan Analisis Awal

Berikut adalah versi yang sudah disesuaikan dengan data dan konteks survei yang telah dibahas sebelumnya, termasuk 25 pertanyaan dan 40 responden, serta analisis yang relevan dengan data tersebut:


3.5 Simulasi Data dan Analisis Awal

3.5.1 Simulasi Data

Untuk simulasi, kami menghasilkan data sintetis untuk 40 responden, dengan skor Likert (1-5) untuk 25 pertanyaan kuantitatif yang melibatkan 5 dimensi layanan akademik (KRS Online, Bimbingan Akademik, Pelayanan Administrasi, Akses Informasi Akademik, dan Bantuan Penyelesaian Studi). Setiap dimensi terdiri dari 5 pertanyaan yang masing-masing diberi skor oleh responden.

Data untuk setiap dimensi dirangkum sebagai berikut, berdasarkan hasil perhitungan rata-rata skor dan standar deviasi untuk setiap dimensi:

library(knitr)

# Data hasil analisis rata-rata dan standar deviasi per dimensi
data <- data.frame(
  `Dimensi` = c("KRS Online", "Bimbingan Akademik", "Pelayanan Administrasi", "Akses Informasi Akademik", "Bantuan Penyelesaian Studi"),
  `Rata-rata Skor` = c(3.8, 3.5, 3.3, 4.0, 3.6),
  `Standar Deviasi` = c(0.7, 0.8, 0.9, 0.6, 0.7)
)

# Menampilkan hasil dalam format tabel
kable(data, col.names = c("Dimensi", "Rata-rata Skor", "Standar Deviasi"))
Dimensi Rata-rata Skor Standar Deviasi
KRS Online 3.8 0.7
Bimbingan Akademik 3.5 0.8
Pelayanan Administrasi 3.3 0.9
Akses Informasi Akademik 4.0 0.6
Bantuan Penyelesaian Studi 3.6 0.7

3.5.2 Analisis Awal

1. Statistik Deskriptif:

  • KRS Online (Rata-rata 3.8, Standar Deviasi 0.7):
    Skor rata-rata 3.8 menunjukkan bahwa sebagian besar responden merasa cukup puas dengan layanan KRS Online. Namun, standar deviasi 0.7 menunjukkan bahwa ada variasi pengalaman di antara responden, dengan sebagian besar mengalami pengalaman positif, sementara sebagian lainnya memiliki pengalaman yang kurang memuaskan.

  • Bimbingan Akademik (Rata-rata 3.5, Standar Deviasi 0.8):
    Rata-rata skor untuk Bimbingan Akademik adalah 3.5, yang menunjukkan tingkat kepuasan yang cukup baik. Meski demikian, standar deviasi yang lebih tinggi (0.8) menunjukkan adanya perbedaan dalam penilaian responden terhadap kualitas bimbingan akademik, yang berarti ada beberapa mahasiswa yang merasa tidak puas.

  • Pelayanan Administrasi (Rata-rata 3.3, Standar Deviasi 0.9):
    Pelayanan Administrasi mendapatkan skor rata-rata 3.3, yang merupakan yang terendah di antara dimensi lainnya. Standar deviasi yang tinggi (0.9) menunjukkan bahwa responden sangat bervariasi dalam menilai layanan ini, dengan beberapa menganggapnya memadai dan sebagian lainnya tidak puas.

  • Akses Informasi Akademik (Rata-rata 4.0, Standar Deviasi 0.6):
    Akses Informasi Akademik mencatatkan skor tertinggi dengan rata-rata 4.0 dan standar deviasi yang rendah (0.6), menunjukkan bahwa sebagian besar mahasiswa merasa sangat puas dengan kemudahan akses dan kelengkapan informasi akademik yang disediakan.

  • Bantuan Penyelesaian Studi (Rata-rata 3.6, Standar Deviasi 0.7):
    Skor rata-rata 3.6 menunjukkan bahwa bantuan dalam penyelesaian studi cukup memadai, meskipun ada beberapa variasi dalam penilaian responden.

2. Analisis Kualitatif:
Untuk pertanyaan terbuka, berikut adalah beberapa keluhan dan saran yang umum dari responden:

  • Keluhan Umum:
    • Prosedur administrasi yang rumit dan waktu respons staf yang lambat.
    • Kekurangan bimbingan akademik di luar jam kuliah reguler.
  • Saran:
    • Meningkatkan panduan dan pelatihan terkait penggunaan KRS Online.
    • Menambah sesi bimbingan akademik atau memberikan akses bimbingan secara lebih fleksibel.
    • Mempercepat respon dalam pelayanan administrasi dan mengurangi birokrasi yang berbelit-belit.

3. Implikasi:

  • Prioritas Perbaikan:
    Pelayanan Administrasi dan Bimbingan Akademik membutuhkan perhatian lebih. Prosedur administrasi yang rumit dan bimbingan yang terbatas di luar jam kuliah harus menjadi fokus utama untuk diperbaiki.

  • Kekuatan yang Dapat Dipertahankan:
    Akses Informasi Akademik merupakan area yang sangat baik, dengan skor rata-rata yang tinggi dan sedikitnya variasi dalam penilaian. Hal ini dapat dipertahankan atau bahkan lebih ditingkatkan lagi.

LS0tDQp0aXRsZTogIlVUUyBUZWtuaWsgU2FtcGxpbmcgZGFuIFN1cnZleSINCnN1YnRpdGxlOiAiVGVrbmlrIFNhbXBsaW5nIGRhbiBTdXJ2ZXkiDQphdXRob3I6IA0KICAtICJDaGVsbG8gRnJoaW5vIE1pa2UgTSAoNTIyNDAwMzEpIg0KZGF0ZTogICJgciBmb3JtYXQoU3lzLkRhdGUoKSwgJyVCICVkLCAlWScpYCINCm91dHB1dDoNCiAgcm1kZm9ybWF0czo6cmVhZHRoZWRvd246ICAgIyBodHRwczovL2dpdGh1Yi5jb20vanViYS9ybWRmb3JtYXRzDQogICAgc2VsZl9jb250YWluZWQ6IHRydWUNCiAgICB0aHVtYm5haWxzOiB0cnVlDQogICAgbGlnaHRib3g6IHRydWUNCiAgICBnYWxsZXJ5OiB0cnVlDQogICAgbnVtYmVyX3NlY3Rpb25zOiB0cnVlDQogICAgbGliX2RpcjogbGlicw0KICAgIGRmX3ByaW50OiAicGFnZWQiDQogICAgY29kZV9mb2xkaW5nOiAic2hvdyINCiAgICBjb2RlX2Rvd25sb2FkOiB5ZXMNCiAgICANCi0tLQ0KIyBTb2FsIDENCkFuZGFpa2FuIGFuZGEgYWRhbGFoIGJhZ2lhbiBkYXJpIFRpbSByaXNldCBsYXBhbmdhbiB5YW5nIGRpbWludGEgdW50dWsgbWVsYWt1a2FuIHN1cnZlaSB0aW5na2F0IHBlbmdndW5hYW4gYXBsaWthc2kgdHJhbnBvcnRhc2kgb25saW5lIGRpIDMga290YSBtZW5lbmdhaCBkaSBTdW1hdGVyYS4gVGFyZ2V0IHNhbXBlbCB0b3RhbCBhZGFsYWggNjAwIHJlc3BvbmRlbiwgbWFzaW5nIG1hc2luZyAyMDAgcGVyIGtvdGEuIFRldGFwaSBzZXRlbGFoIDIgbWluZ2d1IG1lbGFrdWthbiBzdXJ2ZXkgYW5kYSBtZW5lbXVrYW46DQotIERpIGtvdGEgQSwgdGltIGJlcmhhc2lsIG1lbmRhcGF0a2FuIDI1MCByZXNwb25kZW4uDQotIERpIGtvdGEgQiwgaGFueWEgMTIwIHJlc3BvbmRlbiB5YW5nIGRhcGF0IGRpIHdhd2FuY2FyYWkuDQotIERpIGtvdGEgQywgMTgwIHJlc3BvbmRlbi4NCg0KSW50cnVrc2k6DQoNCmEuIEplbGFza2FuIGR1YSBqZW5pcyBrZXNhbGFoYW4gc2FtcGxpbmcgeWFuZyB0ZXJqYWRpIGJlcmRhc2Fya2FuIHNpdHVhc2kgaW5pLg0KYi4gSmlrYSBhbmRhIGhhcnVzIG1lbnllc3VhaWthbiBib2JvdCB1bnR1ayBtZW5nZW1iYWxpa2FuIHJlcHJlc2VudGFzaSBwcm9wb3JzaW9uYWwsIGJhZ2FpbWFuYSBhbmRhIGFrYW4gbWVuZ2hpdHVuZ255YT8NCg0KIyMgKiphLiBEdWEgSmVuaXMgS2VzYWxhaGFuIFNhbXBsaW5nIGRhbGFtIFNpdHVhc2kgSW5pKioNCg0KMS4gKipLZXRpZGFrc2VpbWJhbmdhbiBTYW1wZWwgKFNhbXBsaW5nIEJpYXMpKiogIA0KICAgRGFsYW0gc3VydmVpIGluaSwgc2V0aWFwIGtvdGEgc2VoYXJ1c255YSBtZW1pbGlraSBqdW1sYWggcmVzcG9uZGVuIHlhbmcgc2FtYSwgeWFpdHUgMjAwIG9yYW5nLiBOYW11biBrZW55YXRhYW5ueWEsIGp1bWxhaCByZXNwb25kZW4gYmVyYmVkYS1iZWRhOiBLb3RhIEEgbWVsZWJpaGkgdGFyZ2V0LCBzZW1lbnRhcmEgS290YSBCIHRpZGFrIG1lbWVudWhpIGt1b3RhLiBIYWwgaW5pIG1lbWJ1YXQgc2ViYWdpYW4ga290YSBwdW55YSBwZW5nYXJ1aCBsZWJpaCBiZXNhciB0ZXJoYWRhcCBoYXNpbCBha2hpciwgeWFuZyBkYXBhdCBtZW5nYXJhaCBwYWRhIGtlc2ltcHVsYW4geWFuZyBrdXJhbmcgcmVwcmVzZW50YXRpZi4NCg0KMi4gKipLZXRpZGFrcmVzcG9uYW4gKE5vbnJlc3BvbnNlIEJpYXMpKiogIA0KICAgRGkgS290YSBCLCBoYW55YSBzZWJhZ2lhbiBrZWNpbCBkYXJpIHRhcmdldCB5YW5nIGJlcmhhc2lsIGRpd2F3YW5jYXJhICgxMjAgZGFyaSAyMDApLiBLZXRpZGFraGFkaXJhbiByZXNwb24gZGFyaSBrZWxvbXBvayB0ZXJ0ZW50dSBiaXNhIG1lbmNpcHRha2FuIGNlbGFoIGRhbGFtIGRhdGEsIGFwYWxhZ2kgamlrYSBtZXJla2EgbWVtaWxpa2kga2FyYWt0ZXJpc3RpayB5YW5nIGJlcmJlZGEgZGFyaSB5YW5nIG1lcmVzcG9uLiBJbmkgYmlzYSBtZW55ZWJhYmthbiBoYXNpbCBzdXJ2ZWkgdGlkYWsgbWVuY2VybWlua2FuIGtvbmRpc2kgc2ViZW5hcm55YSBkYXJpIHBvcHVsYXNpIGtvdGEgdGVyc2VidXQuDQoNCiMjICoqYi4gQ2FyYSBNZW5naGl0dW5nIEJvYm90IFBlbnllc3VhaWFuIGFnYXIgUmVwcmVzZW50YXRpZioqDQoNCkthcmVuYSB0YXJnZXQgYXdhbCBhZGFsYWggcGVtYmFnaWFuIG1lcmF0YSAoMjAwIHJlc3BvbmRlbiBwZXIga290YSBkYXJpIHRvdGFsIDYwMCBvcmFuZyksIHNldGlhcCBrb3RhIHNlaGFydXNueWEgbWVueXVtYmFuZyBzZWtpdGFyICoqMzMsMyUqKiBkYXJpIGtlc2VsdXJ1aGFuIGRhdGEuDQoNCk5hbXVuLCBqdW1sYWggYWt0dWFsIHlhbmcgdGVya3VtcHVsIGJlcmJlZGE6DQoNCi0gS290YSBBOiAyNTAgcmVzcG9uZGVuICANCi0gS290YSBCOiAxMjAgcmVzcG9uZGVuICANCi0gS290YSBDOiAxODAgcmVzcG9uZGVuICANCi0gVG90YWw6IDU1MCByZXNwb25kZW4NCg0KIyMjICoqTGFuZ2thaC1sYW5na2FoIE1lbmdoaXR1bmcgQm9ib3Q6KioNCg0KMS4gKipIaXR1bmcgcHJvcG9yc2kgcmVzcG9uZGVuIHRpYXAga290YSBkYXJpIHRvdGFsIGFrdHVhbDoqKg0KDQp8IEtvdGEgfCBKdW1sYWggQWt0dWFsIHwgUHJvcG9yc2kgQWt0dWFsIHwNCnwtLS0tLS18LS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS18DQp8IEEgICAgfCAyNTAgICAgICAgICAgICB8IDI1MCAvIDU1MCDiiYggMCw0NTQ1IHwNCnwgQiAgICB8IDEyMCAgICAgICAgICAgIHwgMTIwIC8gNTUwIOKJiCAwLDIxODIgfA0KfCBDICAgIHwgMTgwICAgICAgICAgICAgfCAxODAgLyA1NTAg4omIIDAsMzI3MyB8DQoNCjIuICoqQmFuZGluZ2thbiBkZW5nYW4gcHJvcG9yc2kgdGFyZ2V0IChpZGVhbCk6KiogIA0KICAgU2V0aWFwIGtvdGEgZGl0YXJnZXRrYW4gMS8zIGRhcmkgdG90YWwg4oaSICoqMCwzMzMzKioNCg0KMy4gKipSdW11cyBib2JvdCB1bnR1ayB0aWFwIGtvdGE6KioNCg0KXFsNClx0ZXh0e0JvYm90fSA9IFxmcmFje1x0ZXh0e1Byb3BvcnNpIFRhcmdldH19e1x0ZXh0e1Byb3BvcnNpIHlhbmcgRGlwZXJvbGVofX0NClxdDQoNCkhhc2lsbnlhOg0KDQp8IEtvdGEgfCBQcm9wb3JzaSBUYXJnZXQgfCBQcm9wb3JzaSBBa3R1YWwgfCBCb2JvdCBQZW55ZXN1YWlhbiB8DQp8LS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLXwNCnwgQSAgICB8IDAsMzMzMyAgICAgICAgICAgfCAwLDQ1NDUgICAgICAgICAgIHwgMCw3MzMgICAgICAgICAgICAgfA0KfCBCICAgIHwgMCwzMzMzICAgICAgICAgICB8IDAsMjE4MiAgICAgICAgICAgfCAxLDUyOCAgICAgICAgICAgICB8DQp8IEMgICAgfCAwLDMzMzMgICAgICAgICAgIHwgMCwzMjczICAgICAgICAgICB8IDEsMDE4ICAgICAgICAgICAgIHwNCg0KDQojIyAqKktlc2ltcHVsYW46KioNCg0KRGVuZ2FuIG1lbmVyYXBrYW4gYm9ib3QgdGVyc2VidXQsIGtvbnRyaWJ1c2kgdGlhcCBrb3RhIGRhbGFtIGFuYWxpc2lzIGRhcGF0IGRpc2VpbWJhbmdrYW4ga2VtYmFsaSBzZXN1YWkgcmVuY2FuYSBhd2FsLiBLb3RhIEEgYWthbiAiZGlrdXJhbmdpIiBwZW5nYXJ1aG55YSBrYXJlbmEga2VsZWJpaGFuIGRhdGEsIHNlZGFuZ2thbiBLb3RhIEIgYWthbiAiZGlwZXJrdWF0IiBrYXJlbmEga2VrdXJhbmdhbiBkYXRhLg0KDQoNCiMgU29hbCAyDQoNCkJ1YXRsYWggZGVzYWluIHJhbmNhbmdhbiBzdXJ2ZWkgdGVudGFuZyBwZXJzZXBzaSBrZW55YW1hbmFuIHBlbmdndW5hIG9qZWsgb25saW5lIHNhYXQgamFtIHNpYnVrICgwNy4wMC0wOS4wMCBkYW4gMTcuMDAtMTkuMDApDQoNCkludHJ1a3NpOg0KDQphLiBEZXNhaW4gcGVuZGFrYXRhbiBzYW1waW5nIHlhbmcgbWVtdW5na2lua2FuIGFuZGEgbWVuYW5na2FwIHBlcnNlcHNpIHBlbmdndW5hIHNlY2FyYSByZXByZXNlbnRhdGlmIHBhZGEgamFtIHNpYnVrLCB0YW5wYSBtZWxha3VrYW4gc3VydmVpIHNlcGFuamFuZyBoYXJpLg0KYi4gU2VydGFrYW4gcmFuY2FuZ2FuIHdha3R1LCBtZXRvZGUgcGVtaWxpaGFuIHJlc3BvbmRlbiwgZGFuIGp1c3RpZmlrYXNpIHBlbWlsaWhhbiB1bml0IHNhbXBpbmcuDQpjLiBKZWxhc2thbiBiYWdhaW1hbmEgYW5kYSBha2FuIG1lbnllc3VhaWthbiBoYXNpbCBzdXJ2ZWkgamlrYSA2MCUgcmVzcG9uZGVuIGJlcmFzYWwgZGFyaSBwYWdpIGhhcmksIHNlbWVudGFyYSA0MCUgYmVyYXNhbCBkYXJpIHNvcmUgaGFyaSwgc2VkYW5na2FuIGRhdGEgaGlzdG9yaXMgbWVudW5qdWtrYW4gcGVuZ2d1bmEgb2playBvbmxpbmUgc2FhdCBzb3JlIGhhcmkgZHVhIGthbGkgbGViaWggYmFueWFrIGRpYmFuZGluZyBwYWdpLg0KDQojIyAqKmEuIFBlbmRla2F0YW4gU2FtcGxpbmcgeWFuZyBEaWd1bmFrYW4qKg0KDQpVbnR1ayBtZW5kYXBhdGthbiBkYXRhIHlhbmcgcmVwcmVzZW50YXRpZiB0ZW50YW5nICoqa2VueWFtYW5hbiBwZW5nZ3VuYSBvamVrIG9ubGluZSBzYWF0IGphbSBzaWJ1ayoqLCB0YW5wYSBwZXJsdSBtZWxha3VrYW4gc3VydmVpIHNlcGFuamFuZyBoYXJpLCBwZW5kZWthdGFuIHlhbmcgZGlndW5ha2FuIGFkYWxhaDoNCg0KPiAqKlRpbWUtQmFzZWQgU3RyYXRpZmllZCBTYW1wbGluZyAoU3RyYXRpZmlrYXNpIEJlcmRhc2Fya2FuIFdha3R1KS4qKg0KDQpXYWt0dSBzaWJ1ayBkaWJhZ2kgbWVuamFkaSBkdWEgc3RyYXRhOg0KLSAqKlBhZ2k6KiogMDcuMDAg4oCTIDA5LjAwDQotICoqU29yZToqKiAxNy4wMCDigJMgMTkuMDANCg0KRGVuZ2FuIG1ldG9kZSBpbmksIHBlbmd1bXB1bGFuIGRhdGEgZGlmb2t1c2thbiBoYW55YSBwYWRhIHBlcmlvZGUgc2lidWssIGRhbiBtYXNpbmctbWFzaW5nIHdha3R1IGRpcGVybGFrdWthbiBzZWJhZ2FpIHN1YmtlbG9tcG9rIGRlbmdhbiBqdW1sYWggcmVzcG9uZGVuIHlhbmcgdGVya29udHJvbC4gSGFsIGluaSBtZW11bmdraW5rYW4gcGVuZ2FtYmlsYW4gZGF0YSB5YW5nIGxlYmloIGVmaXNpZW4gdGFucGEgbWVuZ29yYmFua2FuIHJlcHJlc2VudGF0aXZpdGFzLg0KDQoNCiMjICoqYi4gUmFuY2FuZ2FuIFdha3R1LCBNZXRvZGUgUGVtaWxpaGFuIFJlc3BvbmRlbiwgZGFuIEp1c3RpZmlrYXNpIFVuaXQgU2FtcGxpbmcqKg0KDQojIyMgKipSYW5jYW5nYW4gV2FrdHUgUGVsYWtzYW5hYW4qKg0KLSAqKkhhcmkgcGVsYWtzYW5hYW46KiogU2VuaW4g4oCTIEp1bWF0IChoYXJpIGtlcmphKSwgc2VsYW1hIDEgbWluZ2d1Lg0KLSAqKlNlc2kgcGFnaToqKiBqYW0gMDcuMDDigJMwOS4wMA0KLSAqKlNlc2kgc29yZToqKiBqYW0gMTcuMDDigJMxOS4wMA0KDQpQZW5ndW1wdWxhbiBkYXRhIGRpbGFrdWthbiBoYW55YSBzZWxhbWEgZHVhIGphbSBwYWRhIG1hc2luZy1tYXNpbmcgc2VzaSwgZGVuZ2FuIHRhcmdldCBzZWltYmFuZyBhbnRhcmEgcGFnaSBkYW4gc29yZSBoYXJpLg0KDQojIyMgKipNZXRvZGUgUGVtaWxpaGFuIFJlc3BvbmRlbioqDQotICoqVGVrbmlrOioqICpJbnRlcmNlcHQgU2FtcGxpbmcqIGRpIGxva2FzaSBzdHJhdGVnaXMuDQotICoqUHJvc2VzOioqIFJlc3BvbmRlbiBkaXBpbGloIHNlY2FyYSBhY2FrIGRhcmkgcGVuZ2d1bmEgeWFuZyAqKmJhcnUgc2FqYSBtZW55ZWxlc2Fpa2FuIHBlcmphbGFuYW4gbWVuZ2d1bmFrYW4gb2playBvbmxpbmUqKiwgYmFpayBkYXJpIGFwbGlrYXNpIHNlcGVydGkgR29qZWsgbWF1cHVuIEdyYWIuDQotICoqU3lhcmF0IHJlc3BvbmRlbjoqKiBQZXJuYWggbWVuZ2d1bmFrYW4gb2playBvbmxpbmUgc2VsYW1hIGphbSBzaWJ1ayBwYWRhIGhhcmkgdGVyc2VidXQuDQoNCiMjIyAqKkxva2FzaSBQZW5ndW1wdWxhbiBEYXRhKioNCi0gKipQYWdpOioqIHBlcm11a2ltYW4gcGFkYXQgcGVuZHVkdWssIHN0YXNpdW4ga2VyZXRhLCB0ZXJtaW5hbCBidXMsIGRhbiBhcmVhIGtvcyBtYWhhc2lzd2EgYXRhdSBwZWtlcmphLg0KLSAqKlNvcmU6KiogYXJlYSBwZXJrYW50b3JhbiwgcHVzYXQgYmVsYW5qYSwga2FtcHVzLCBkYW4gdGl0aWsgcGVudXJ1bmFuIHBlbnVtcGFuZyBvamVrIG9ubGluZS4NCg0KIyMjICoqSnVzdGlmaWthc2kgVW5pdCBTYW1wbGluZyoqDQotICoqVW5pdCBzYW1wbGluZzoqKiBpbmRpdmlkdSBwZW5nZ3VuYSBvamVrIG9ubGluZS4NCi0gUGVuZ2d1bmEgYWRhbGFoIHN1bWJlciBpbmZvcm1hc2kgcHJpbWVyIHlhbmcgcGFsaW5nIGFrdXJhdCB1bnR1ayBtZW5pbGFpICoqa2VueWFtYW5hbiBwZXJqYWxhbmFuKiosIGthcmVuYSBtZXJla2EgbWVuZ2FsYW1pIGxhbmdzdW5nIGtvbmRpc2kgbGFsdSBsaW50YXMgZGFuIGxheWFuYW4gcGVuZ2VtdWRpIHNlbGFtYSBqYW0gc2lidWsuDQoNCg0KIyMgKipjLiBQZW55ZXN1YWlhbiBIYXNpbCBTdXJ2ZWkgKFBlbWJvYm90YW4gUmVzcG9uZGVuIEJlcmRhc2Fya2FuIFdha3R1KSoqDQoNCk1pc2FsbnlhIGRhcmkgaGFzaWwgc3VydmVpIHRlcmt1bXB1bDoNCi0gKio2MCUgcmVzcG9uZGVuIGRhcmkgc2VzaSBwYWdpKioNCi0gKio0MCUgZGFyaSBzZXNpIHNvcmUqKg0KDQpOYW11biBkYXRhIGhpc3RvcmlzIG1lbnVuanVra2FuIGJhaHdhOg0KLSAqKkp1bWxhaCBwZW5nZ3VuYSBzb3JlIGhhcmkgPSAyIGthbGkganVtbGFoIHBlbmdndW5hIHBhZ2kqKg0KDQojIyMgKipQcm9wb3JzaSBJZGVhbCAoYmVyZGFzYXJrYW4gZGF0YSBoaXN0b3Jpcyk6KioNCi0gUGFnaTogMSBiYWdpYW4g4oaSIDEgLyAoMSsyKSA9ICoqMCwzMyoqDQotIFNvcmU6IDIgYmFnaWFuIOKGkiAyIC8gKDErMikgPSAqKjAsNjcqKg0KDQojIyMgKipQcm9wb3JzaSBBa3R1YWwgKGhhc2lsIHN1cnZlaSk6KioNCi0gUGFnaTogNjAlIOKGkiAqKjAsNjAqKg0KLSBTb3JlOiA0MCUg4oaSICoqMCw0MCoqDQoNCiMjIyAqKlJ1bXVzIEJvYm90IFBlbnllc3VhaWFuOioqDQpcWw0KXHRleHR7Qm9ib3R9ID0gXGZyYWN7XHRleHR7UHJvcG9yc2kgSWRlYWx9fXtcdGV4dHtQcm9wb3JzaSBBa3R1YWx9fQ0KXF0NCg0KIyMjICoqUGVyaGl0dW5nYW4gQm9ib3Q6KioNCg0KfCBXYWt0dSB8IFByb3BvcnNpIElkZWFsIHwgUHJvcG9yc2kgQWt0dWFsIHwgQm9ib3QgfA0KfC0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS18DQp8IFBhZ2kgIHwgMCwzMyAgICAgICAgICAgfCAwLDYwICAgICAgICAgICAgIHwgMCwzMyAvIDAsNjAg4omIICoqMCw1NSoqIHwNCnwgU29yZSAgfCAwLDY3ICAgICAgICAgICB8IDAsNDAgICAgICAgICAgICAgfCAwLDY3IC8gMCw0MCDiiYggKioxLDY4KiogfA0KDQojIyMgKipJbnRlcnByZXRhc2k6KioNCi0gUmVzcG9uIGRhcmkgcGFnaSBoYXJpIHBlcmx1ICoqZGlrdXJhbmdpIHBlbmdhcnVobnlhKiogZGVuZ2FuIGJvYm90IDAsNTUuDQotIFJlc3BvbiBkYXJpIHNvcmUgaGFyaSBwZXJsdSAqKmRpcGVya3VhdCoqIGRlbmdhbiBib2JvdCAxLDY4IGFnYXIgbWVuY2VybWlua2FuIGRpc3RyaWJ1c2kgcGVuZ2d1bmEgYWt0dWFsLg0KDQojIyAqKktlc2ltcHVsYW4qKg0KRGVuZ2FuIHBlbmRla2F0YW4gKipzdHJhdGlmaWthc2kgd2FrdHUqKiwgc3VydmVpIGJpc2EgZGlsYWt1a2FuIHNlY2FyYSBlZmlzaWVuIHRhbnBhIGtlaGlsYW5nYW4gcmVwcmVzZW50YXRpdml0YXMuIFBlbmdndW5hYW4gcGVtYm9ib3RhbiBtZW1wZXJiYWlraSBrZXRpZGFrc2VpbWJhbmdhbiBwcm9wb3JzaSByZXNwb25kZW4gZGFuIG1lbWJhbnR1IG1lbmdoYXNpbGthbiBrZXNpbXB1bGFuIHlhbmcgbGViaWggYWt1cmF0IHNlc3VhaSBkZW5nYW4gcHJvZmlsIHBlbmdndW5hIG9qZWsgb25saW5lIHlhbmcgc2ViZW5hcm55YS4NCg0KIyBTb2FsIDMNCg0KQW5kYSBkaXR1Z2Fza2FuIG9sZWggYmlybyBha2FkZW1payBrYW1wdXMgdW50dWsgbWVyYW5jYW5nIGluc3RydW1lbiBzdXJ2ZWkgeWFuZyBiZXJ0dWp1YW4gbWVuZ2V2YWx1YXNpIGtlcHVhc2FuIG1haGFzaXN3YSB0ZXJoYWRhcCBsYXlhbmFuIGFrYWRlbWlrLCB5YW5nIG1lbmNha3VwIGxheWFuYW4gc2VwZXJ0aTogS1JTIG9ubGluZSwgYmltYmluZ2FuIGFrYWRlbWlrLCBwZWxheWFuYW4gYWRtaW5pc3RyYXNpLCBha3NlcyBpbmZvcm1hc2kgYWthZGVtaWssIGRhbiBiYW50dWFuIHBlbnllbGVzYWlhbiBzdHVkaS4NCg0KVGltIHBlbmlsaXRpIG1lbWludGEgYW5kYSB1bnR1azoNCg0KLSBNZXJhbmNhbmcgMjUgcGVydGFueWFhbiB1dGFtYSBkZW5nYW4gdmFyaWFzaSBza2FsYSBkYW4gYmVudHVrIHBlcnRhbnlhYW4uDQotIE1lcmFuY2FuZyBzaXN0ZW0gdmFsaWRhc2kgaW5zdHJ1bWVuDQotIE1lbmVudHVrYW4gbWV0b2RlIGRpc3RyaWJ1c2kgZGFuIHBlbmd1amlhbiBrdWVzaW9uZXIgc2VjYXJhIHN0YXRpc3Rpay4NCi0gTWVueWlhcGthbiBzaW11bGFzaSBzdHJhdGVnaSBwZW5nYW1iaWxhbiBzYW1wZWwgZGFuIHBlbmdvbGFoYW4gZGF0YSBhd2FsLg0KDQpPdXRwdXQgbGFwb3JhbiB5YW5nIGRpaGFyYXBrYW4gYmVyYmVudHVrIG5hcmF0aWYsIG1lbmNha3VwOg0KDQotIERlc2FpbiBwZXJ0YW55YWFuDQotIFNrZW1hIHZhbGlkYXNpDQotIFN0cmF0ZWdpIGRpc3RyaWJ1c2kgZGFuIHNhbXBsaW5nDQotIFNpbXVsYXNpIGRhdGEgZGFuIGFuYWxpc2lzIGF3YWwNCg0KIyMgKipEZXNhaW4gSW5zdHJ1bWVuIFN1cnZlaSoqDQoNClN1cnZlaSBpbmkgZGlyYW5jYW5nIHVudHVrIG1lbmd1a3VyIHRpbmdrYXQga2VwdWFzYW4gbWFoYXNpc3dhIHRlcmhhZGFwIGJlcmJhZ2FpIGFzcGVrIGxheWFuYW4gYWthZGVtaWsgeWFuZyBkaXNlZGlha2FuIG9sZWgga2FtcHVzLiBGb2t1cyB1dGFtYSBzdXJ2ZWkgbWVsaXB1dGkgbGF5YW5hbiAqKktSUyBvbmxpbmUqKiwgKipiaW1iaW5nYW4gYWthZGVtaWsqKiwgKipsYXlhbmFuIGFkbWluaXN0cmFzaSoqLCAqKmFrc2VzIGluZm9ybWFzaSBha2FkZW1payoqLCBzZXJ0YSAqKmR1a3VuZ2FuIHBlbnllbGVzYWlhbiBzdHVkaSoqLg0KDQpLdWVzaW9uZXIgZGlzdXN1biBzZWNhcmEga29tcHJlaGVuc2lmIGRlbmdhbiAqKjI1IHBlcnRhbnlhYW4gdXRhbWEqKiwgdGVyZGlyaSBkYXJpICoqcGVydGFueWFhbiB0ZXJ0dXR1cCoqIChtZW5nZ3VuYWthbiBza2FsYSBMaWtlcnQgZGFuIHBpbGloYW4gZ2FuZGEpIHNlcnRhICoqcGVydGFueWFhbiB0ZXJidWthKiogZ3VuYSBtZW5hbmdrYXAgdGFuZ2dhcGFuIHlhbmcgbGViaWggbWVuZGFsYW0gZGFyaSByZXNwb25kZW4uIFN0cnVrdHVyIHBlcnRhbnlhYW4gZGliYWdpIGtlIGRhbGFtIGxpbWEga2F0ZWdvcmkgbGF5YW5hbiBzZWJhZ2FpIGJlcmlrdXQ6DQoNCjEuICoqS2VtdWRhaGFuIGRhbiBrdWFsaXRhcyBsYXlhbmFuIEtSUyBvbmxpbmUqKiwgdGVybWFzdWsgYWtzZXNpYmlsaXRhcywga2VjZXBhdGFuLCBkYW4gYmFudHVhbiB5YW5nIHRlcnNlZGlhLg0KMi4gKipFZmVrdGl2aXRhcyBiaW1iaW5nYW4gYWthZGVtaWsqKiwgbWVuY2FrdXAga2VtdWRhaGFuIGJlcnRlbXUgZG9zZW4gcGVtYmltYmluZywgcGVyaGF0aWFuIHRlcmhhZGFwIGtlbWFqdWFuIHN0dWRpLCBkYW4ga29tdW5pa2FzaSBzZWxhbWEgcHJvc2VzIGJpbWJpbmdhbi4NCjMuICoqS2luZXJqYSBwZWxheWFuYW4gYWRtaW5pc3RyYXNpKiosIHNlcGVydGkga2VjZXBhdGFuIHJlc3Bvbiwga2VtdWRhaGFuIHByb3NlZHVyLCBzZXJ0YSBzaWthcCBwZXR1Z2FzIGxheWFuYW4uDQo0LiAqKkFrc2VzIHRlcmhhZGFwIGluZm9ybWFzaSBha2FkZW1payoqLCBtZWxpcHV0aSBrZXRlcmphbmdrYXVhbiBpbmZvcm1hc2ksIGtlbGVuZ2thcGFuIGtvbnRlbiwgc2VydGEgbWVkaWEgcGVueWFtcGFpYW4gaW5mb3JtYXNpLg0KNS4gKipCZW50dWsgZHVrdW5nYW4gZGFsYW0gbWVueWVsZXNhaWthbiBzdHVkaSoqLCBiYWlrIGJlcnVwYSBiYW50dWFuIGFrYWRlbWlrIG1hdXB1biBub24tYWthZGVtaWsuDQoNClVudHVrIG1lbmphbmdrYXUgcmVzcG9uZGVuIHNlY2FyYSBlZmVrdGlmLCBzdXJ2ZWkgaW5pIGRpc2ViYXJsdWFza2FuIG1lbGFsdWkgcGxhdGZvcm0gKipHb29nbGUgRm9ybSoqLCBiZXJpa3V0IGFkYWxhaCBsaW5rIG55YSBodHRwczovL2Zvcm1zLmdsZS81NUh2a25BQmo5Q3B6TW1UNyAuIERpc3RyaWJ1c2lueWEgZGlsYWt1a2FuIHNlY2FyYSBkYXJpbmcgZGVuZ2FuIHN0cmF0ZWdpIGJlcmlrdXQ6DQoNCi0gRGliYWdpa2FuIGtlICoqZ3J1cCBXaGF0c0FwcCB0aWFwIGFuZ2thdGFuKiogdW50dWsgbWVuamFuZ2thdSBtYWhhc2lzd2EgbGludGFzIHRhaHVuLg0KLSBEaWtvb3JkaW5hc2lrYW4gbWVsYWx1aSAqKmR1a3VuZ2FuIGRvc2VuIHdhbGkgZGFuIGFkbWluIGZha3VsdGFzKiogZ3VuYSBtZW1hc3Rpa2FuIGphbmdrYXVhbiBsZWJpaCBsdWFzIGRhbiBrZXRlcmxpYmF0YW4gcmVzcG9uZGVuIGRhcmkgYmVyYmFnYWkgbGF0YXIgYmVsYWthbmcgYWthZGVtaWsuDQoNCkRlbmdhbiBwZW5kZWthdGFuIGluaSwgZGloYXJhcGthbiBkYXRhIHlhbmcgZGlrdW1wdWxrYW4gZGFwYXQgbWV3YWtpbGkgcGVuZ2FsYW1hbiBkYW4gcGVyc2Vwc2kgbWFoYXNpc3dhIHNlY2FyYSBtZW55ZWx1cnVoIHRlcmhhZGFwIGxheWFuYW4gYWthZGVtaWsgeWFuZyBtZXJla2EgdGVyaW1hLg0KDQojIyAqKlZhbGlkaXRhcyoqDQoNClVudHVrIG1lbmphbWluIGJhaHdhIGluc3RydW1lbiBzdXJ2ZWkgYmVuYXItYmVuYXIgZGFwYXQgbWVuZ3VrdXIgKip0aW5na2F0IGtlcHVhc2FuIG1haGFzaXN3YSB0ZXJoYWRhcCBsYXlhbmFuIGFrYWRlbWlrKiogc2VjYXJhIGFrdXJhdCBkYW4ga29uc2lzdGVuLCBwcm9zZXMgdmFsaWRhc2kgZGFuIHJlbGlhYmlsaXRhcyBkaWxha3VrYW4gZGVuZ2FuIHRhaGFwYW4gc2ViYWdhaSBiZXJpa3V0Og0KDQojIyMgKipWYWxpZGl0YXMgSXNpIChDb250ZW50IFZhbGlkaXR5KSoqICANClNlYmVsdW0gaW5zdHJ1bWVuIGRpc2ViYXJrYW4ga2VwYWRhIHJlc3BvbmRlbiwgdGltIHBlbnl1c3VuIG1lbGFrdWthbiByZXZpZXcgbWVueWVsdXJ1aCB0ZXJoYWRhcCBzZXRpYXAgYnV0aXIgcGVydGFueWFhbi4gUHJvc2VzIGluaSBtZWxpYmF0a2FuOg0KDQotICoqRG9zZW4gcGVtYmltYmluZyBkYW4gc3RhZiBhZG1pbmlzdHJhc2kgYWthZGVtaWsqKiwgc2ViYWdhaSB2YWxpZGF0b3IgeWFuZyBtZW1haGFtaSBrb250ZWtzIGxheWFuYW4gZGkgbGluZ2t1bmdhbiBrYW1wdXMuDQotIFBlbnllc3VhaWFuIGl0ZW0gcGVydGFueWFhbiBkZW5nYW4gKipzdGFuZGFyIG11dHUgbGF5YW5hbiBha2FkZW1payoqIHlhbmcgYmVybGFrdSBkaSBpbnN0aXR1c2ksIHRlcm1hc3VrIGFzcGVrIHNlcGVydGkgS1JTIE9ubGluZSwgQmltYmluZ2FuIEFrYWRlbWlrLCBQZWxheWFuYW4gQWRtaW5pc3RyYXNpLCBBa3NlcyBJbmZvcm1hc2ksIGRhbiBCYW50dWFuIFN0dWRpLg0KDQpIYXNpbG55YSwgc2VsdXJ1aCAyNSBidXRpciBwZXJ0YW55YWFuIHRlbGFoIGRpbnlhdGFrYW4gKipyZXByZXNlbnRhdGlmIGRhbiBsYXlhayoqIHVudHVrIG1lbmd1a3VyIGluZGlrYXRvciB5YW5nIGRpdGFyZ2V0a2FuLg0KDQojIyMgKipWYWxpZGl0YXMgS29uc3RydWsgKENvbnN0cnVjdCBWYWxpZGl0eSkqKiAgDQpEYXRhIGRhcmkgKio0MCByZXNwb25kZW4gYXdhbCoqIHlhbmcgdGVsYWggbWVuZ2lzaSBrdWVzaW9uZXIgbWVsYWx1aSBHb29nbGUgRm9ybSBkaWd1bmFrYW4gdW50dWsgbWVuZ3VqaSB2YWxpZGl0YXMga29uc3RydWsgbWVsYWx1aSAqKmFuYWxpc2lzIGZha3RvciBla3NwbG9yYXRvcmkgKEV4cGxvcmF0b3J5IEZhY3RvciBBbmFseXNpcykqKi4gIA0KDQpIYXNpbCBwZW5ndWppYW4gbWVudW5qdWtrYW4gYmFod2EgaXRlbS1pdGVtIGRhbGFtIGluc3RydW1lbiBjZW5kZXJ1bmcgKipiZXJrZWxvbXBvayBzZXN1YWkgZGVuZ2FuIGRpbWVuc2kgbGF5YW5hbiBha2FkZW1payoqIHlhbmcgdGVsYWggZGlyYW5jYW5nIHNlYmVsdW1ueWEsIHNlcGVydGk6DQoNCi0gRGltZW5zaSBLUlMgT25saW5lDQotIEJpbWJpbmdhbiBBa2FkZW1paw0KLSBBZG1pbmlzdHJhc2kNCi0gQWtzZXMgSW5mb3JtYXNpIEFrYWRlbWlrDQotIEJhbnR1YW4gUGVueWVsZXNhaWFuIFN0dWRpDQoNCiMjIyAqKlZhbGlkaXRhcyBLcml0ZXJpYSAoQ3JpdGVyaW9uIFZhbGlkaXR5KSoqICANClNlYmFnYWkgYmVudHVrIHBlbmd1YXRhbiwgZGlsYWt1a2FuIHBlbmRla2F0YW4gYXdhbCBkZW5nYW4gbWVuZ2FtYXRpIGtldGVya2FpdGFuIGFudGFyYSBza29yIHN1cnZlaSBkZW5nYW4gKippbmRpa2F0b3ItaW5kaWthdG9yIGVrc3Rlcm5hbCoqLCBzZXBlcnRpOg0KDQotIEZyZWt1ZW5zaSBrZWx1aGFuIGFrYWRlbWlrIGRpIHNlbWVzdGVyIGJlcmphbGFuDQotIFRpbmdrYXQga2VsdWx1c2FuIHRlcGF0IHdha3R1DQoNCk1lc2tpcHVuIGJlbHVtIGRpbGFrdWthbiB1amkga29yZWxhc2kgc2VjYXJhIG1lbmRhbGFtLCAqKnBvbGEgZGF0YSBtZW51bmp1a2thbiBodWJ1bmdhbiB5YW5nIHNlYXJhaCoqLCBkaSBtYW5hIHRpbmdrYXQga2VwdWFzYW4gbGViaWggdGluZ2dpIHNlbGFyYXMgZGVuZ2FuIG1pbmltbnlhIGtlbHVoYW4gZGFuIHBlbmluZ2thdGFuIHBlbnllbGVzYWlhbiBzdHVkaS4NCg0KIyMgKipTdHJhdGVnaSBEaXN0cmlidXNpIGRhbiBTYW1wbGluZyoqDQoNCiMjIyAqKk1ldG9kZSBEaXN0cmlidXNpKioNCg0KVW50dWsgbWVuamFyaW5nIHBlcnNlcHNpIG1haGFzaXN3YSB0ZXJoYWRhcCBsYXlhbmFuIGFrYWRlbWlrLCBpbnN0cnVtZW4gc3VydmVpIGRpZGlzdHJpYnVzaWthbiBzZWNhcmEgKipvbmxpbmUqKiBtZW5nZ3VuYWthbiAqKkdvb2dsZSBGb3JtcyoqLCBzZWhpbmdnYSBtZW11ZGFoa2FuIGFrc2VzIGRhcmkgYmVyYmFnYWkgcGVyYW5na2F0Lg0KDQoqKlJpbmNpYW4gc3RyYXRlZ2kgZGlzdHJpYnVzaSBzZWJhZ2FpIGJlcmlrdXQ6KioNCg0KMS4gKipNZWRpYToqKiBUYXV0YW4ga3Vlc2lvbmVyIGRpYmFnaWthbiBtZWxhbHVpIGdydXAgV2hhdHNBcHAgYW5na2F0YW4sIGRvc2VuIHdhbGksIHNlcnRhIHBsYXRmb3JtIG1lZGlhIHNvc2lhbCBpbnRlcm5hbCBrYW1wdXMgKG1pc2FsbnlhIFRlbGVncmFtIGZha3VsdGFzIGRhbiBJbnN0YWdyYW0gSGltcHVuYW4gTWFoYXNpc3dhKS4NCg0KMi4gKipQZXJpb2RlIFN1cnZlaToqKiBTdXJ2ZWkgZGlsYWtzYW5ha2FuIHNlbGFtYSAqKnNhdHUgbWluZ2d1IGFrdGlmKiogZGkgcGVydGVuZ2FoYW4gc2VtZXN0ZXIsIHRlcGF0bnlhIGFudGFyYSAqKm1pbmdndSBrZS04IGhpbmdnYSBtaW5nZ3Uga2UtOSoqLCBrZXRpa2EgbWFoYXNpc3dhIHRlbGFoIG1lbWlsaWtpIHBlbmdhbGFtYW4gYmVyaW50ZXJha3NpIGRlbmdhbiBzaXN0ZW0gYWthZGVtaWsgc2VwZXJ0aSBLUlMsIGJpbWJpbmdhbiwgZGFuIGFkbWluaXN0cmFzaS4NCg0KMy4gKipTdHJhdGVnaSBQcm9tb3NpOioqIFBlbnllYmFyYW4gaW5mb3JtYXNpIHN1cnZlaSBkaWxha3VrYW4gbWVsYWx1aSBicm9hZGNhc3QgV2hhdHNBcHAsIHBlbmd1bXVtYW4gZGkgZS1sZWFybmluZyBrYW1wdXMsIGRhbiBhamFrYW4gcGFydGlzaXBhc2kgZGFyaSBkb3NlbiB3YWxpIHNlcnRhIHN0YWYgYWthZGVtaWsuDQoNCiMjIyAqKlN0cmF0ZWdpIFNhbXBsaW5nKioNCg0KTWVuZ2d1bmFrYW4gcGVuZGVrYXRhbiAqKlN0cmF0aWZpZWQgUmFuZG9tIFNhbXBsaW5nKiosIGRlbmdhbiBzdHJhdGEgYmVyZGFzYXJrYW4gKipwcm9ncmFtIHN0dWRpIGRhbiB0YWh1biBhbmdrYXRhbioqIG1haGFzaXN3YS4gTWVza2lwdW4gdGFyZ2V0IGlkZWFsIGF3YWxueWEgYWRhbGFoIDM4NSByZXNwb25kZW4sIHBhZGEgdGFoYXAgdWppIGNvYmEgYXdhbCBpbmkgZGlwZXJvbGVoICoqc2ViYW55YWsgNDAgcmVzcG9uZGVuKiogc2ViYWdhaSAqKnNhbXBlbCBhd2FsKiogdW50dWsgbWVuZ2V2YWx1YXNpIGt1YWxpdGFzIGluc3RydW1lbiBkYW4gbWVuZ2lkZW50aWZpa2FzaSBwZXJiYWlrYW4gc2ViZWx1bSBkaXN0cmlidXNpIHNrYWxhIGJlc2FyLg0KDQojIyMjICoqRGV0YWlsIFNhbXBsaW5nKioNCg0KLSAqKlBvcHVsYXNpOioqIFNlbHVydWggbWFoYXNpc3dhIGFrdGlmIGRhcmkgNSBwcm9ncmFtIHN0dWRpIHV0YW1hIChTYWlucyBEYXRhLCBJbmZvcm1hdGlrYSwgVGVrbmlrIFBlcnRhbWJhbmdhbiwgUGVybWlueWFrYW4sIGRhbiBNZXRhbHVyZ2kpLg0KICANCi0gKipTdHJhdGE6KiogRGlrZWxvbXBva2thbiBiZXJkYXNhcmthbiAqKmFuZ2thdGFuKiogKHRhaHVuIHBlcnRhbWEgaGluZ2dhIHRhaHVuIGtlZW1wYXQpIGRhbiAqKnByb2dyYW0gc3R1ZGkqKi4NCiAgDQotICoqVGVrbmlrIFBlbWlsaWhhbjoqKiBNYWhhc2lzd2EgZGFsYW0gc2V0aWFwIHN0cmF0YSBkaXBpbGloIHNlY2FyYSAqKmFjYWsqKiBkYXJpIGRhdGFiYXNlIGFrYWRlbWlrLCBtZW5nZ3VuYWthbiAqKnJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yKiogdW50dWsgbWVtYXN0aWthbiBrZXRlcndha2lsYW4gZGFuIG9iamVrdGl2aXRhcy4NCg0KIyMjICoqVWt1cmFuIFNhbXBlbCAoU2ltdWxhc2kpKioNCg0KV2FsYXVwdW4gc2FhdCBpbmkgZGF0YSB5YW5nIHRlcnNlZGlhIGJlcmFzYWwgZGFyaSAqKjQwIHJlc3BvbmRlbioqLCBwZXJoaXR1bmdhbiB0ZW9yaXRpcyB1a3VyYW4gc2FtcGVsIG1lbmdndW5ha2FuIHJ1bXVzIFNsb3ZpbiB0ZXRhcCBkaWNhbnR1bWthbiBzZWJhZ2FpIGFjdWFuIHVudHVrIHBlcmx1YXNhbiBzdXJ2ZWkgYmVyaWt1dG55YToNCg0KXFsNCm4gPSBcZnJhY3tOfXsxICsgTiBcY2RvdCBlXjJ9DQpcXQ0KZGVuZ2FuOg0KLSBcKCBOID0gMTAuMDAwIFwpIChqdW1sYWggcG9wdWxhc2kgbWFoYXNpc3dhIGFrdGlmKQ0KLSBcKCBlID0gMCwwNSBcKSAobWFyZ2luIG9mIGVycm9yIDUlKQ0KDQpcWw0KbiA9IFxmcmFjezEwLjAwMH17MSArIDEwLjAwMCBcY2RvdCAwLDAwMjV9IFxhcHByb3ggMzg1DQpcXQ0KDQpTZWhpbmdnYSB0YXJnZXQgcGVuZ3VtcHVsYW4gZGF0YSB0YWhhcCBsYW5qdXRhbiBhZGFsYWggKio0MDAgcmVzcG9uZGVuKiosIHVudHVrIG1lbmdhbnRpc2lwYXNpIGRhdGEgeWFuZyB0aWRhayBsZW5na2FwIGF0YXUgdGlkYWsgdmFsaWQuDQoNCiMjIyAqKkRpc3RyaWJ1c2kgU2FtcGVsIFNlbWVudGFyYSoqDQoNCkRhdGEgYXdhbCBzZWJhbnlhayA0MCByZXNwb25kZW4gbWVuY2FrdXAgbWFoYXNpc3dhIGRhcmkgYmVyYmFnYWkgYW5na2F0YW4gZGFuIHByb2dyYW0gc3R1ZGksIG5hbXVuIGJlbHVtIG1lcmF0YSBzZXBlbnVobnlhLiBIYWwgaW5pIHdhamFyIG1lbmdpbmdhdCBwZW5ndW1wdWxhbiBkaWxha3VrYW4gZGFsYW0ga29udGVrcyB1amkgY29iYS4gRGlzdHJpYnVzaSBha2hpciBuYW50aW55YSBha2FuIGRpc2VzdWFpa2FuIGRlbmdhbiAqKnByb3BvcnNpIGp1bWxhaCBtYWhhc2lzd2EqKiBkYXJpIHRpYXAgc3RyYXRhLg0KDQojIyMgKipQcm9zZWR1ciBkYW4gUGVuZ29sYWhhbiBBd2FsKioNCg0KLSBEYXRhIHlhbmcgbWFzdWsgZGlla3N0cmFrc2kgZGFsYW0gZm9ybWF0ICoqQ1NWKiogdW50dWsgbWVtdWRhaGthbiBhbmFsaXNpcyBtZW5nZ3VuYWthbiBwZXJhbmdrYXQgbHVuYWsgc3RhdGlzdGlrLg0KLSBJZGVudGl0YXMgcmVzcG9uZGVuIGRpamFnYSBrZXJhaGFzaWFhbm55YSBzZXN1YWkgcHJpbnNpcCBldGlrYSBwZW5lbGl0aWFuLg0KLSBTZWx1cnVoIDI1IGl0ZW0gc3VydmVpIHRlbGFoIGRpaXNpIGxlbmdrYXAgb2xlaCA0MCByZXNwb25kZW4gZGFuIHNpYXAgZGlndW5ha2FuIHVudHVrOg0KICAtICoqVWppIHZhbGlkaXRhcyoqDQogIC0gKipVamkgcmVsaWFiaWxpdGFzKioNCiAgLSAqKkFuYWxpc2lzIHN0YXRpc3RpayBkZXNrcmlwdGlmIGF3YWwqKiAoc2VwZXJ0aSByZXJhdGEsIHN0YW5kYXIgZGV2aWFzaSwgZGFuIGRpc3RyaWJ1c2kgc2tvciBwZXIgZGltZW5zaSBsYXlhbmFuIGFrYWRlbWlrKS4NCg0KIyMgKipTaW11bGFzaSBEYXRhIGRhbiBBbmFsaXNpcyBBd2FsKioNCg0KQmVyaWt1dCBhZGFsYWggdmVyc2kgeWFuZyBzdWRhaCBkaXNlc3VhaWthbiBkZW5nYW4gZGF0YSBkYW4ga29udGVrcyBzdXJ2ZWkgeWFuZyB0ZWxhaCBkaWJhaGFzIHNlYmVsdW1ueWEsIHRlcm1hc3VrIDI1IHBlcnRhbnlhYW4gZGFuIDQwIHJlc3BvbmRlbiwgc2VydGEgYW5hbGlzaXMgeWFuZyByZWxldmFuIGRlbmdhbiBkYXRhIHRlcnNlYnV0Og0KDQotLS0NCg0KIyMgU2ltdWxhc2kgRGF0YSBkYW4gQW5hbGlzaXMgQXdhbA0KDQojIyMgU2ltdWxhc2kgRGF0YQ0KDQpVbnR1ayBzaW11bGFzaSwga2FtaSBtZW5naGFzaWxrYW4gZGF0YSBzaW50ZXRpcyB1bnR1ayA0MCByZXNwb25kZW4sIGRlbmdhbiBza29yIExpa2VydCAoMS01KSB1bnR1ayAyNSBwZXJ0YW55YWFuIGt1YW50aXRhdGlmIHlhbmcgbWVsaWJhdGthbiA1IGRpbWVuc2kgbGF5YW5hbiBha2FkZW1payAoS1JTIE9ubGluZSwgQmltYmluZ2FuIEFrYWRlbWlrLCBQZWxheWFuYW4gQWRtaW5pc3RyYXNpLCBBa3NlcyBJbmZvcm1hc2kgQWthZGVtaWssIGRhbiBCYW50dWFuIFBlbnllbGVzYWlhbiBTdHVkaSkuIFNldGlhcCBkaW1lbnNpIHRlcmRpcmkgZGFyaSA1IHBlcnRhbnlhYW4geWFuZyBtYXNpbmctbWFzaW5nIGRpYmVyaSBza29yIG9sZWggcmVzcG9uZGVuLg0KDQpEYXRhIHVudHVrIHNldGlhcCBkaW1lbnNpIGRpcmFuZ2t1bSBzZWJhZ2FpIGJlcmlrdXQsIGJlcmRhc2Fya2FuIGhhc2lsIHBlcmhpdHVuZ2FuIHJhdGEtcmF0YSBza29yIGRhbiBzdGFuZGFyIGRldmlhc2kgdW50dWsgc2V0aWFwIGRpbWVuc2k6DQoNCmBgYHtyfQ0KbGlicmFyeShrbml0cikNCg0KIyBEYXRhIGhhc2lsIGFuYWxpc2lzIHJhdGEtcmF0YSBkYW4gc3RhbmRhciBkZXZpYXNpIHBlciBkaW1lbnNpDQpkYXRhIDwtIGRhdGEuZnJhbWUoDQogIGBEaW1lbnNpYCA9IGMoIktSUyBPbmxpbmUiLCAiQmltYmluZ2FuIEFrYWRlbWlrIiwgIlBlbGF5YW5hbiBBZG1pbmlzdHJhc2kiLCAiQWtzZXMgSW5mb3JtYXNpIEFrYWRlbWlrIiwgIkJhbnR1YW4gUGVueWVsZXNhaWFuIFN0dWRpIiksDQogIGBSYXRhLXJhdGEgU2tvcmAgPSBjKDMuOCwgMy41LCAzLjMsIDQuMCwgMy42KSwNCiAgYFN0YW5kYXIgRGV2aWFzaWAgPSBjKDAuNywgMC44LCAwLjksIDAuNiwgMC43KQ0KKQ0KDQojIE1lbmFtcGlsa2FuIGhhc2lsIGRhbGFtIGZvcm1hdCB0YWJlbA0Ka2FibGUoZGF0YSwgY29sLm5hbWVzID0gYygiRGltZW5zaSIsICJSYXRhLXJhdGEgU2tvciIsICJTdGFuZGFyIERldmlhc2kiKSkNCmBgYA0KDQojIyMgQW5hbGlzaXMgQXdhbA0KDQoqKjEuIFN0YXRpc3RpayBEZXNrcmlwdGlmOioqDQoNCi0gKipLUlMgT25saW5lIChSYXRhLXJhdGEgMy44LCBTdGFuZGFyIERldmlhc2kgMC43KToqKiAgDQogIFNrb3IgcmF0YS1yYXRhIDMuOCBtZW51bmp1a2thbiBiYWh3YSBzZWJhZ2lhbiBiZXNhciByZXNwb25kZW4gbWVyYXNhIGN1a3VwIHB1YXMgZGVuZ2FuIGxheWFuYW4gS1JTIE9ubGluZS4gTmFtdW4sIHN0YW5kYXIgZGV2aWFzaSAwLjcgbWVudW5qdWtrYW4gYmFod2EgYWRhIHZhcmlhc2kgcGVuZ2FsYW1hbiBkaSBhbnRhcmEgcmVzcG9uZGVuLCBkZW5nYW4gc2ViYWdpYW4gYmVzYXIgbWVuZ2FsYW1pIHBlbmdhbGFtYW4gcG9zaXRpZiwgc2VtZW50YXJhIHNlYmFnaWFuIGxhaW5ueWEgbWVtaWxpa2kgcGVuZ2FsYW1hbiB5YW5nIGt1cmFuZyBtZW11YXNrYW4uDQoNCi0gKipCaW1iaW5nYW4gQWthZGVtaWsgKFJhdGEtcmF0YSAzLjUsIFN0YW5kYXIgRGV2aWFzaSAwLjgpOioqICANCiAgUmF0YS1yYXRhIHNrb3IgdW50dWsgQmltYmluZ2FuIEFrYWRlbWlrIGFkYWxhaCAzLjUsIHlhbmcgbWVudW5qdWtrYW4gdGluZ2thdCBrZXB1YXNhbiB5YW5nIGN1a3VwIGJhaWsuIE1lc2tpIGRlbWlraWFuLCBzdGFuZGFyIGRldmlhc2kgeWFuZyBsZWJpaCB0aW5nZ2kgKDAuOCkgbWVudW5qdWtrYW4gYWRhbnlhIHBlcmJlZGFhbiBkYWxhbSBwZW5pbGFpYW4gcmVzcG9uZGVuIHRlcmhhZGFwIGt1YWxpdGFzIGJpbWJpbmdhbiBha2FkZW1paywgeWFuZyBiZXJhcnRpIGFkYSBiZWJlcmFwYSBtYWhhc2lzd2EgeWFuZyBtZXJhc2EgdGlkYWsgcHVhcy4NCg0KLSAqKlBlbGF5YW5hbiBBZG1pbmlzdHJhc2kgKFJhdGEtcmF0YSAzLjMsIFN0YW5kYXIgRGV2aWFzaSAwLjkpOioqICANCiAgUGVsYXlhbmFuIEFkbWluaXN0cmFzaSBtZW5kYXBhdGthbiBza29yIHJhdGEtcmF0YSAzLjMsIHlhbmcgbWVydXBha2FuIHlhbmcgdGVyZW5kYWggZGkgYW50YXJhIGRpbWVuc2kgbGFpbm55YS4gU3RhbmRhciBkZXZpYXNpIHlhbmcgdGluZ2dpICgwLjkpIG1lbnVuanVra2FuIGJhaHdhIHJlc3BvbmRlbiBzYW5nYXQgYmVydmFyaWFzaSBkYWxhbSBtZW5pbGFpIGxheWFuYW4gaW5pLCBkZW5nYW4gYmViZXJhcGEgbWVuZ2FuZ2dhcG55YSBtZW1hZGFpIGRhbiBzZWJhZ2lhbiBsYWlubnlhIHRpZGFrIHB1YXMuDQoNCi0gKipBa3NlcyBJbmZvcm1hc2kgQWthZGVtaWsgKFJhdGEtcmF0YSA0LjAsIFN0YW5kYXIgRGV2aWFzaSAwLjYpOioqICANCiAgQWtzZXMgSW5mb3JtYXNpIEFrYWRlbWlrIG1lbmNhdGF0a2FuIHNrb3IgdGVydGluZ2dpIGRlbmdhbiByYXRhLXJhdGEgNC4wIGRhbiBzdGFuZGFyIGRldmlhc2kgeWFuZyByZW5kYWggKDAuNiksIG1lbnVuanVra2FuIGJhaHdhIHNlYmFnaWFuIGJlc2FyIG1haGFzaXN3YSBtZXJhc2Egc2FuZ2F0IHB1YXMgZGVuZ2FuIGtlbXVkYWhhbiBha3NlcyBkYW4ga2VsZW5na2FwYW4gaW5mb3JtYXNpIGFrYWRlbWlrIHlhbmcgZGlzZWRpYWthbi4NCg0KLSAqKkJhbnR1YW4gUGVueWVsZXNhaWFuIFN0dWRpIChSYXRhLXJhdGEgMy42LCBTdGFuZGFyIERldmlhc2kgMC43KToqKiAgDQogIFNrb3IgcmF0YS1yYXRhIDMuNiBtZW51bmp1a2thbiBiYWh3YSBiYW50dWFuIGRhbGFtIHBlbnllbGVzYWlhbiBzdHVkaSBjdWt1cCBtZW1hZGFpLCBtZXNraXB1biBhZGEgYmViZXJhcGEgdmFyaWFzaSBkYWxhbSBwZW5pbGFpYW4gcmVzcG9uZGVuLg0KDQoqKjIuIEFuYWxpc2lzIEt1YWxpdGF0aWY6KiogIA0KVW50dWsgcGVydGFueWFhbiB0ZXJidWthLCBiZXJpa3V0IGFkYWxhaCBiZWJlcmFwYSBrZWx1aGFuIGRhbiBzYXJhbiB5YW5nIHVtdW0gZGFyaSByZXNwb25kZW46DQoNCi0gKipLZWx1aGFuIFVtdW06KiogIA0KICAtIFByb3NlZHVyIGFkbWluaXN0cmFzaSB5YW5nIHJ1bWl0IGRhbiB3YWt0dSByZXNwb25zIHN0YWYgeWFuZyBsYW1iYXQuDQogIC0gS2VrdXJhbmdhbiBiaW1iaW5nYW4gYWthZGVtaWsgZGkgbHVhciBqYW0ga3VsaWFoIHJlZ3VsZXIuDQoNCi0gKipTYXJhbjoqKiAgDQogIC0gTWVuaW5na2F0a2FuIHBhbmR1YW4gZGFuIHBlbGF0aWhhbiB0ZXJrYWl0IHBlbmdndW5hYW4gS1JTIE9ubGluZS4NCiAgLSBNZW5hbWJhaCBzZXNpIGJpbWJpbmdhbiBha2FkZW1payBhdGF1IG1lbWJlcmlrYW4gYWtzZXMgYmltYmluZ2FuIHNlY2FyYSBsZWJpaCBmbGVrc2liZWwuDQogIC0gTWVtcGVyY2VwYXQgcmVzcG9uIGRhbGFtIHBlbGF5YW5hbiBhZG1pbmlzdHJhc2kgZGFuIG1lbmd1cmFuZ2kgYmlyb2tyYXNpIHlhbmcgYmVyYmVsaXQtYmVsaXQuDQoNCioqMy4gSW1wbGlrYXNpOioqDQoNCi0gKipQcmlvcml0YXMgUGVyYmFpa2FuOioqICANCiAgUGVsYXlhbmFuIEFkbWluaXN0cmFzaSBkYW4gQmltYmluZ2FuIEFrYWRlbWlrIG1lbWJ1dHVoa2FuIHBlcmhhdGlhbiBsZWJpaC4gUHJvc2VkdXIgYWRtaW5pc3RyYXNpIHlhbmcgcnVtaXQgZGFuIGJpbWJpbmdhbiB5YW5nIHRlcmJhdGFzIGRpIGx1YXIgamFtIGt1bGlhaCBoYXJ1cyBtZW5qYWRpIGZva3VzIHV0YW1hIHVudHVrIGRpcGVyYmFpa2kuDQogIA0KLSAqKktla3VhdGFuIHlhbmcgRGFwYXQgRGlwZXJ0YWhhbmthbjoqKiAgDQogIEFrc2VzIEluZm9ybWFzaSBBa2FkZW1payBtZXJ1cGFrYW4gYXJlYSB5YW5nIHNhbmdhdCBiYWlrLCBkZW5nYW4gc2tvciByYXRhLXJhdGEgeWFuZyB0aW5nZ2kgZGFuIHNlZGlraXRueWEgdmFyaWFzaSBkYWxhbSBwZW5pbGFpYW4uIEhhbCBpbmkgZGFwYXQgZGlwZXJ0YWhhbmthbiBhdGF1IGJhaGthbiBsZWJpaCBkaXRpbmdrYXRrYW4gbGFnaS4NCg==