Teknik Sampling dan Survey

UTS Teknik Sampling dan Survey

Logo

1 Simulasi Kesalahan Sampling di Lapangan

survei tingkat penggunaan aplikasi transportasi online di 3 kota menengah di Sumatera. Target sampel total adalah 600 responden, masing-masing 200 per kota.

  • Di Kota A, tim berhasil mendapatkan 250 responden.
  • Di Kota B, hanya 120 responden yang dapat diwawancarai.
  • Di Kota C, 180 responden.

1.1 Dua Jenis Kesalahan Sampling

  1. Sampling Error (Kesalahan Sampling)
    Terjadi karena jumlah responden dari masing-masing kota tidak sesuai dengan target. Target awal adalah 200 responden per kota, namun realisasinya adalah sebagai berikut:

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

    Ketidakseimbangan ini menyebabkan hasil survei kurang merepresentasikan proporsi yang diinginkan dari masing-masing kota.

  2. Non-sampling Error (Kesalahan Non-sampling)
    Kesalahan ini mencakup:

    • Responden yang sulit diakses
    • Partisipasi yang rendah di Kota B
    • Kendala teknis saat pelaksanaan survei

    Hal ini menimbulkan potensi bias karena sebagian populasi tidak terwakili secara memadai.

1.2 Penyesuaian Bobot untuk Representasi Proporsional

Karena jumlah responden tidak seimbang,maka dapat menghitung bobot koreksi (penyesuaian bobot) agar masing-masing kota tetap memberikan kontribusi analisis yang seimbang di akhir.

Langkah-langka menghitung bobot:

  1. Tentukan target kontribusi proporsional
    Karena target awal adalah 200 per kota (total 600), maka proporsi ideal tiap kota:

    \[ \frac{200}{600} = 0{,}3333 \quad \text{(atau 33,33%)} \]

  2. Hitung jumlah responden aktual

    \[ 250 \text{ (Kota A)} + 120 \text{ (Kota B)} + 180 \text{ (Kota C)} = 550 \]

  3. Hitung bobot untuk setiap kota dengan rumus:

    \[ \text{Bobot Kota} = \frac{\text{Proporsi Target}}{\text{Proporsi Aktual}} \]

    • Kota A
      Proporsi aktual = \(\frac{250}{550} = 0{,}4545\)
      Bobot = \(\frac{0{,}3333}{0{,}4545} \approx \mathbf{0{,}733}\)

    • Kota B
      Proporsi aktual = \(\frac{120}{550} = 0{,}2182\)
      Bobot = \(\frac{0{,}3333}{0{,}2182} \approx \mathbf{1{,}528}\)

    • Kota C
      Proporsi aktual = \(\frac{180}{550} = 0{,}3273\)
      Bobot = \(\frac{0{,}3333}{0{,}3273} \approx \mathbf{1{,}018}\)

1.3 Kesimpulan Bobot:

Kota Jumlah Responden Bobot Penyesuaian
Kota A 250 0,733
Kota B 120 1,528
Kota C 180 1,018

-Bobot digunakan untuk menyesuaikan kontribusi masing-masing kota dalam analisis agar kembali proporsional seperti target awal.

-Semakin besar bobot, semakin besar kontribusi data tersebut terhadap keseluruhan hasil.


2 Mendesain Survei dengan Pembobotan Waktu Puncak

Membuatlah desain rancangan survei tentang persepsi kenyamanan pengguna ojek online saat jam sibuk (07.00–09.00 dan 17.00–19.00).

2.1 Desain pendekatan sampling

Tujuan:
Menangkap persepsi kenyamanan pengguna ojek online pada jam sibuk, secara representatif, tanpa melakukan survei sepanjang hari.

Pendekatan Sampling:
Metode stratified time-based sampling berdasarkan dua strata waktu: - Strata 1: Pagi hari (07.00–09.00) - Strata 2: Sore hari (17.00–19.00)

Proporsi Sampling Ideal (berdasarkan data historis): - Strata pagi: 33,3% - Strata sore: 66,7%

Penyesuaian proporsional akan dilakukan jika proporsi responden aktual berbeda dari target.

2.2 Rancangan Waktu, Metode Pemilihan Responden, dan Justifikasi

1. Waktu Pelaksanaan Survei:

  • Durasi: 5 hari kerja (Senin–Jumat)

  • Jam pengambilan data:

    • Pagi: 07.00 – 09.00

    • Sore: 17.00 – 19.00

2. Lokasi Pengambilan Responden:

  • Area padat pengguna ojek online seperti:

    • Stasiun

    • Halte

    • Pusat perkantoran

    • Mall atau pusat perbelanjaan

3. Metode Pemilihan Responden:

  • Metode:

    • Intercept survey (wawancara langsung di lokasi)

    • Survei online melalui link (dibagikan lewat aplikasi atau media sosial komunitas pengguna ojek online)

  • Kriteria responden:

    • Pengguna aktif ojek online (minimal 2x/minggu)

    • Pernah menggunakan ojek online dalam 7 hari terakhir

    • Menggunakan ojek online pada jam sibuk

4. Justifikasi Pemilihan Unit Sampling:

  • Unit sampling: Individu pengguna ojek online pada jam sibuk

  • Pemilihan lokasi dan waktu didasarkan pada titik dan periode padat pengguna

  • Stratifikasi waktu menjaga representasi antara pengguna pagi dan sore

2.3 Penyesuaian Hasil Survei Berdasarkan Proporsi Responden

2.3.1 Kasus:

  • Responden aktual: 60% pagi, 40% sore

  • Data historis: Pengguna sore 2x lebih banyak dari pagi

2.3.2 Langkah-langkah Menghitung Penyesuaian Bobot

1. Tentukan proporsi ideal populasi berdasarkan data historis

Misalnya:

  • Proporsi pengguna pagi = 1

  • Proporsi pengguna sore = 2

Total = 1 + 2 = 3

Maka:

  • \(P_{\text{pagi}} = \frac{1}{3} = 0.33\)

  • \(P_{\text{sore}} = \frac{2}{3} = 0.67\)

2. Tentukan proporsi aktual responden dari hasil survei

  • \(R_{\text{pagi}} = 0.60\)

  • \(R_{\text{sore}} = 0.40\)

3. Hitung bobot penyesuaian

Rumus umum bobot:

\[ \text{Bobot}_i = \frac{P_i}{R_i} \]

Di mana:

  • \(P_i\): proporsi ideal (populasi sebenarnya)

  • \(R_i\): proporsi responden aktual

  • \(i\): kategori waktu (pagi atau sore)

Maka:

  • \(\text{Bobot}_{\text{pagi}} = \frac{0.33}{0.60} \approx 0.55\)
  • \(\text{Bobot}_{\text{sore}} = \frac{0.67}{0.40} \approx 1.675\)

2.3.3 Perhitungan Melalui R

# Data input: waktu (1 = pagi, 2 = sore), dan skor kenyamanan masing-masing responden
waktu <- c(1,1,1,1,1,2,2,2,2,2)  # 5 responden pagi, 5 sore
skor_kenyamanan <- c(4, 3, 5, 4, 4, 2, 3, 3, 2, 4)

# Proporsi populasi ideal (berdasarkan data historis: sore 2x lebih banyak dari pagi)
P_pagi <- 1/3
P_sore <- 2/3

# Proporsi responden aktual
R_pagi <- sum(waktu == 1) / length(waktu)
R_sore <- sum(waktu == 2) / length(waktu)

# Hitung bobot
w_pagi <- P_pagi / R_pagi
w_sore <- P_sore / R_sore

# Tetapkan bobot ke setiap responden
bobot <- ifelse(waktu == 1, w_pagi, w_sore)

# Hitung rata-rata skor kenyamanan terbobot
rata_terbobot <- sum(bobot * skor_kenyamanan) / sum(bobot)

# Tampilkan hasil
cat("Rata-rata skor kenyamanan (terbobot):", round(rata_terbobot, 2), "\n")
## Rata-rata skor kenyamanan (terbobot): 3.2

2.4 Kesimpulan

Dengan metode ini:

  • Survei tetap efisien (hanya pada jam sibuk)

  • Hasil tetap mewakili proporsi pengguna sebenarnya

  • Penyesuaian bobot menjaga validitas dan objektivitas hasil

3 Studi Kasus

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 peneliti diminta 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.

3.1 Desain pertanyaan

Link Pertanyaan: Kepuasan Mahasiswa Terhadap Layanan Akademik

Ringkasan jenis pertanyaan:

  • Skala Likert: 15 pertanyaan

  • Tertutup (Ya/Tidak): 4 pertanyaan

  • Terbuka: 6 pertanyaan

  • Pilihan kategori: 1 pertanyaan

  • Checklist (pilihan jamak): 1 pertanyaan

Total: 25 pertanyaan utama dan pertanyaan identitas ada 5 jadi seluruh totalnya ada 30

3.2 Skema validasi

  • Validasi Isi (Content Validity):

    • Langkah: Daftar pertanyaan akan diperiksa oleh panel ahli yang terdiri dari dosen, staf biro akademik, dan pakar metode penelitian pendidikan.

    • Tujuan: Memastikan setiap butir soal merepresentasikan konstruk kepuasan terhadap layanan akademik.

    • Alat bantu: Menggunakan Content Validity Index (CVI) untuk menilai relevansi setiap item. Item dengan CVI < 0.75 akan direvisi atau dihapus.

  • Validasi Konstruk (Construct Validity):

    • Setelah data dikumpulkan, akan dilakukan Exploratory Factor Analysis (EFA) untuk mengelompokkan item berdasarkan dimensi layanan (KRS, Bimbingan, Administrasi, dll).

    • Korelasi antar item juga dianalisis (inter-item correlation) untuk mendeteksi konsistensi dalam satu dimensi.

    • Software yang digunakan: SPSS, JASP, atau R.

    • Kriteria: Munculnya struktur faktor yang sesuai dengan rancangan teori awal dan korelasi antar item dalam satu dimensi harus > 0.3.

  • Uji Reliabilitas:

    • Uji reliabilitas akan dilakukan menggunakan Cronbach’s Alpha, dengan target nilai ≥ 0.70 untuk setiap subskala.

    • Tujuan: Menguji konsistensi internal dari item-item dalam satu dimensi layanan.

    • Jika nilai Cronbach’s Alpha < 0.70, maka akan dilakukan analisis item-total correlation untuk merevisi atau membuang item yang lemah.

3.3 Strategi Distribusi dan Sampling

3.3.1 Metode Distribusi:

Kuesioner dibagikan melalui Google Form dengan membagikannya ke beberapa media sebagai berikut:

  • Grup WhatsApp kelas/angkatan

  • Email mahasiswa aktif

  • Media sosial kampus

  • Website akademik resmi

3.3.2 Strategi Pengambilan Sampel:

Sampel diambil secara acak dari strata (Stratified Random Sampling), yakni pada mahasiswa yang berasal dari berbagai program studi dan angkatan. Stratified random sampling dipilih karena menjamin representasi tiap program studi dan angkatan, sehingga hasil lebih generalisable. Dengan stratifikasi, setiap kelompok terwakili secara proporsional.

Strata yang digunakan adalah Program Studi dan Angkatan (2020, 2021, 2022, 2023).

Menggunakan data sampel dari file CSV yang telah disediakan, berikut adalah distribusi mahasiswa berdasarkan program studi dan angkatan yang terwakili dalam data:

Program Studi Angkatan Jumlah Responden (Berdasarkan CSV)
Teknik Informatika 2020–2023 7
Manajemen 2020–2023 7
Akuntansi 2020–2023 6
Ilmu Komunikasi 2020–2023 5
Psikologi 2020–2023 6
Pendidikan 2020–2023 5
Prodi lainnya - 14
Total Responden 50

3.4 Simulasi data dan analisis awal

3.4.1 Rata-Rata per Responden:

  1. Rata-Rata Responden 1:
    \(\overline{X}_1 = \frac{3 + 2 + 2}{3} = 2.33\)

  2. Rata-Rata Responden 2:
    \(\overline{X}_2 = \frac{4 + 3 + 3}{3} = 3.33\)

  3. Rata-Rata Responden 3:
    \(\overline{X}_3 = \frac{3 + 3 + 3}{3} = 3.00\)

  4. Rata-Rata Responden 4:
    \(\overline{X}_4 = \frac{4 + 4 + 4}{3} = 4.00\)

  5. Rata-Rata Responden 5:
    \(\overline{X}_5 = \frac{2 + 2 + 2}{3} = 2.00\)

A15 A16 A17 Rata-Rata
3 2 2 2.33
4 3 3 3.33
3 3 3 3.00
4 4 4 4.00
2 2 2 2.00

3.4.2 Rata-Rata Semua Responden:

\(\overline{X} = \frac{2.33 + 3.33 + 3.00 + 4.00 + 2.00}{5} = \frac{14.66}{5} = 2.93\)

3.4.3 Simpangan Baku:

Gunakan rumus:

\(s = \sqrt{\frac{\sum (X_i - \overline{X})^2}{n-1}}\)

Perhitungan:

  1. \((2.33 - 2.93)^2 = 0.36\)
  2. \((3.33 - 2.93)^2 = 0.16\)
  3. \((3.00 - 2.93)^2 = 0.0049\)
  4. \((4.00 - 2.93)^2 = 1.1449\)
  5. \((2.00 - 2.93)^2 = 0.8649\)

Jumlah: \(0.36 + 0.16 + 0.0049 + 1.1449 + 0.8649 = 2.58\)

\(s = \sqrt{\frac{2.58}{4}} = \sqrt{0.645} \approx 0.80\)

Jadi, simpangan baku untuk dimensi Bantuan Penyelesaian Studi adalah 0.80.

# Data responden
data <- data.frame(
  A1 = c(2, 4, 3, 4, 1),
  A2 = c(2, 4, 3, 5, 1),
  A3 = c(3, 4, 4, 4, 2),
  A4 = c(3, 4, 4, 4, 2),
  A5 = c(3, 3, 3, 4, 2),
  A6 = c(3, 4, 4, 5, 3),
  A7 = c(2, 3, 3, 4, 2),
  A8 = c(4, 3, 4, 4, 2),
  A9 = c(3, 4, 4, 4, 2),
  A10 = c(3, 3, 3, 4, 2),
  A11 = c(4, 3, 3, 4, 3),
  A12 = c(3, 4, 3, 4, 2),
  A13 = c(4, 4, 3, 4, 2),
  A14 = c(3, 4, 4, 4, 2),
  A15 = c(3, 4, 3, 4, 2),
  A16 = c(2, 3, 3, 4, 2),
  A17 = c(2, 3, 3, 4, 2)
)

# Daftar dimensi dan kolom terkait
dimensi <- list(
  KRS_Online = c("A1", "A2", "A3"),
  Bimbingan_Akademik = c("A4", "A5", "A6", "A7"),
  Pelayanan_Administratif = c("A8", "A9", "A10", "A11", "A12", "A13", "A14"),
  Bantuan_Penyelesaian_Studi = c("A15", "A16", "A17")
)

# Fungsi untuk hitung rata-rata dan simpangan baku per dimensi
hitung_statistik <- function(data, dimensi_list) {
  hasil <- data.frame(
    Dimensi = character(),
    Rata_Rata = numeric(),
    Simpangan_Baku = numeric(),
    stringsAsFactors = FALSE
  )
  
  for (nama in names(dimensi_list)) {
    kolom <- dimensi_list[[nama]]
    nilai <- rowMeans(data[, kolom])
    rata2 <- mean(nilai)
    simp_baku <- sd(nilai)
    
    hasil <- rbind(hasil, data.frame(
      Dimensi = nama,
      Rata_Rata = round(rata2, 2),
      Simpangan_Baku = round(simp_baku, 2)
    ))
  }
  
  return(hasil)
}

# Hitung dan tampilkan hasil
hasil_statistik <- hitung_statistik(data, dimensi)
print(hasil_statistik)
##                      Dimensi Rata_Rata Simpangan_Baku
## 1                 KRS_Online      3.07           1.23
## 2         Bimbingan_Akademik      3.25           0.77
## 3    Pelayanan_Administratif      3.31           0.70
## 4 Bantuan_Penyelesaian_Studi      2.93           0.80

3.4.4 Interpretasi

  • Kepuasan tertinggi berada pada dimensi Bimbingan Akademik dengan rata-rata 3.25, menunjukkan bahwa mahasiswa cenderung cukup puas dengan proses bimbingan akademik mereka.

  • Kepuasan terendah berada pada dimensi Bantuan Penyelesaian Studi (rata-rata 2.93), menandakan adanya potensi masalah atau harapan yang belum terpenuhi pada aspek tersebut.

  • Dimensi dengan variasi kepuasan tertinggi adalah Pelayanan Administratif dengan simpangan baku sebesar 1.31, artinya persepsi mahasiswa sangat bervariasi terhadap layanan administratif—ada yang sangat puas, ada pula yang tidak.

  • KRS Online memiliki kepuasan rata-rata 3.07, cukup memadai namun dengan simpangan yang relatif tinggi (1.23), sehingga bisa menjadi area yang diperhatikan untuk standarisasi kualitas layanan.

  • Simpangan baku pada seluruh dimensi berkisar antara 0.77 hingga 1.31, menandakan bahwa data cukup tersebar dan tidak semua mahasiswa memiliki pengalaman yang seragam terhadap layanan kampus.

LS0tDQp0aXRsZTogIlRla25payBTYW1wbGluZyBkYW4gU3VydmV5Ig0Kc3VidGl0bGU6ICJVVFMgVGVrbmlrIFNhbXBsaW5nIGRhbiBTdXJ2ZXkiDQphdXRob3I6IA0KICAtICJOb3ZhIFNpdG9ydXMgNTIyNDAwMjMiDQpkYXRlOiAgImByIGZvcm1hdChTeXMuRGF0ZSgpLCAnJUIgJWQsICVZJylgIg0Kb3V0cHV0Og0KICBybWRmb3JtYXRzOjpyZWFkdGhlZG93bjogICAjIGh0dHBzOi8vZ2l0aHViLmNvbS9qdWJhL3JtZGZvcm1hdHMNCiAgICBzZWxmX2NvbnRhaW5lZDogdHJ1ZQ0KICAgIHRodW1ibmFpbHM6IHRydWUNCiAgICBsaWdodGJveDogdHJ1ZQ0KICAgIGdhbGxlcnk6IHRydWUNCiAgICBudW1iZXJfc2VjdGlvbnM6IHRydWUNCiAgICBsaWJfZGlyOiBsaWJzDQogICAgZGZfcHJpbnQ6ICJwYWdlZCINCiAgICBjb2RlX2ZvbGRpbmc6ICJzaG93Ig0KICAgIGNvZGVfZG93bmxvYWQ6IHllcw0KICAgIGNzczogInN0eWxlL3N0eWxlIGNzcy5jc3MiDQplZGl0b3Jfb3B0aW9uczogDQogIG1hcmtkb3duOiANCiAgICB3cmFwOiA3Mg0KLS0tDQoNCmBgYHs9aHRtbH0NCjxzdHlsZT4NCiAgYm9keSB7DQogICAgdGV4dC1hbGlnbjoganVzdGlmeTsNCiAgfQ0KPC9zdHlsZT4NCmBgYA0KDQo8aW1nIHNyYz0iTk9WQS5qcGciIGFsdD0iTG9nbyIgc3R5bGU9IndpZHRoOjUwMHB4OyBkaXNwbGF5OiBibG9jazsgbWFyZ2luOiBhdXRvOyIvPg0KDQojICoqU2ltdWxhc2kgS2VzYWxhaGFuIFNhbXBsaW5nIGRpIExhcGFuZ2FuKioNCg0Kc3VydmVpIHRpbmdrYXQgcGVuZ2d1bmFhbiBhcGxpa2FzaSB0cmFuc3BvcnRhc2kgb25saW5lIGRpICoqMyBrb3RhDQptZW5lbmdhaCoqIGRpIFN1bWF0ZXJhLiBUYXJnZXQgc2FtcGVsIHRvdGFsIGFkYWxhaCAqKjYwMCByZXNwb25kZW4qKiwNCm1hc2luZy1tYXNpbmcgMjAwIHBlciBrb3RhLg0KDQotICAgRGkgS290YSBBLCB0aW0gYmVyaGFzaWwgbWVuZGFwYXRrYW4gMjUwIHJlc3BvbmRlbi4NCi0gICBEaSBLb3RhIEIsIGhhbnlhIDEyMCByZXNwb25kZW4geWFuZyBkYXBhdCBkaXdhd2FuY2FyYWkuDQotICAgRGkgS290YSBDLCAxODAgcmVzcG9uZGVuLg0KDQojIyBEdWEgSmVuaXMgS2VzYWxhaGFuIFNhbXBsaW5nDQoNCjEuICAqKlNhbXBsaW5nIEVycm9yIChLZXNhbGFoYW4gU2FtcGxpbmcpKipcDQogICAgVGVyamFkaSBrYXJlbmEganVtbGFoIHJlc3BvbmRlbiBkYXJpIG1hc2luZy1tYXNpbmcga290YSB0aWRhayBzZXN1YWkNCiAgICBkZW5nYW4gdGFyZ2V0LiBUYXJnZXQgYXdhbCBhZGFsYWggMjAwIHJlc3BvbmRlbiBwZXIga290YSwgbmFtdW4NCiAgICByZWFsaXNhc2lueWEgYWRhbGFoIHNlYmFnYWkgYmVyaWt1dDoNCg0KICAgIC0gICBLb3RhIEE6IDI1MCByZXNwb25kZW5cDQogICAgLSAgIEtvdGEgQjogMTIwIHJlc3BvbmRlblwNCiAgICAtICAgS290YSBDOiAxODAgcmVzcG9uZGVuDQoNCiAgICBLZXRpZGFrc2VpbWJhbmdhbiBpbmkgbWVueWViYWJrYW4gaGFzaWwgc3VydmVpIGt1cmFuZw0KICAgIG1lcmVwcmVzZW50YXNpa2FuIHByb3BvcnNpIHlhbmcgZGlpbmdpbmthbiBkYXJpIG1hc2luZy1tYXNpbmcga290YS4NCg0KMi4gICoqTm9uLXNhbXBsaW5nIEVycm9yIChLZXNhbGFoYW4gTm9uLXNhbXBsaW5nKSoqXA0KICAgIEtlc2FsYWhhbiBpbmkgbWVuY2FrdXA6DQoNCiAgICAtICAgUmVzcG9uZGVuIHlhbmcgc3VsaXQgZGlha3Nlcw0KICAgIC0gICBQYXJ0aXNpcGFzaSB5YW5nIHJlbmRhaCBkaSBLb3RhIEINCiAgICAtICAgS2VuZGFsYSB0ZWtuaXMgc2FhdCBwZWxha3NhbmFhbiBzdXJ2ZWkNCg0KICAgIEhhbCBpbmkgbWVuaW1idWxrYW4gcG90ZW5zaSBiaWFzIGthcmVuYSBzZWJhZ2lhbiBwb3B1bGFzaSB0aWRhaw0KICAgIHRlcndha2lsaSBzZWNhcmEgbWVtYWRhaS4NCg0KIyMgUGVueWVzdWFpYW4gQm9ib3QgdW50dWsgUmVwcmVzZW50YXNpIFByb3BvcnNpb25hbA0KDQpLYXJlbmEganVtbGFoIHJlc3BvbmRlbiB0aWRhayBzZWltYmFuZyxtYWthIGRhcGF0IG1lbmdoaXR1bmcgYm9ib3QNCmtvcmVrc2kgKHBlbnllc3VhaWFuIGJvYm90KSBhZ2FyIG1hc2luZy1tYXNpbmcga290YSB0ZXRhcCBtZW1iZXJpa2FuDQprb250cmlidXNpIGFuYWxpc2lzIHlhbmcgc2VpbWJhbmcgZGkgYWtoaXIuDQoNCioqTGFuZ2thaC1sYW5na2EgbWVuZ2hpdHVuZyBib2JvdDoqKg0KDQoxLiAgKipUZW50dWthbiB0YXJnZXQga29udHJpYnVzaSBwcm9wb3JzaW9uYWwqKlwNCiAgICBLYXJlbmEgdGFyZ2V0IGF3YWwgYWRhbGFoIDIwMCBwZXIga290YSAodG90YWwgNjAwKSwgbWFrYSBwcm9wb3JzaQ0KICAgIGlkZWFsIHRpYXAga290YToNCg0KICAgICQkDQogICAgXGZyYWN7MjAwfXs2MDB9ID0gMHssfTMzMzMgXHF1YWQgXHRleHR7KGF0YXUgMzMsMzMlKX0NCiAgICAkJA0KDQoyLiAgKipIaXR1bmcganVtbGFoIHJlc3BvbmRlbiBha3R1YWwqKg0KDQogICAgJCQNCiAgICAyNTAgXHRleHR7IChLb3RhIEEpfSArIDEyMCBcdGV4dHsgKEtvdGEgQil9ICsgMTgwIFx0ZXh0eyAoS290YSBDKX0gPSA1NTANCiAgICAkJA0KDQozLiAgKipIaXR1bmcgYm9ib3QgdW50dWsgc2V0aWFwIGtvdGEqKiBkZW5nYW4gcnVtdXM6DQoNCiAgICAkJA0KICAgIFx0ZXh0e0JvYm90IEtvdGF9ID0gXGZyYWN7XHRleHR7UHJvcG9yc2kgVGFyZ2V0fX17XHRleHR7UHJvcG9yc2kgQWt0dWFsfX0NCiAgICAkJA0KDQogICAgLSAgICoqS290YSBBKipcDQogICAgICAgIFByb3BvcnNpIGFrdHVhbCA9ICRcZnJhY3syNTB9ezU1MH0gPSAweyx9NDU0NSRcDQogICAgICAgIEJvYm90ID0gJFxmcmFjezB7LH0zMzMzfXsweyx9NDU0NX0gXGFwcHJveCBcbWF0aGJmezB7LH03MzN9JA0KDQogICAgLSAgICoqS290YSBCKipcDQogICAgICAgIFByb3BvcnNpIGFrdHVhbCA9ICRcZnJhY3sxMjB9ezU1MH0gPSAweyx9MjE4MiRcDQogICAgICAgIEJvYm90ID0gJFxmcmFjezB7LH0zMzMzfXsweyx9MjE4Mn0gXGFwcHJveCBcbWF0aGJmezF7LH01Mjh9JA0KDQogICAgLSAgICoqS290YSBDKipcDQogICAgICAgIFByb3BvcnNpIGFrdHVhbCA9ICRcZnJhY3sxODB9ezU1MH0gPSAweyx9MzI3MyRcDQogICAgICAgIEJvYm90ID0gJFxmcmFjezB7LH0zMzMzfXsweyx9MzI3M30gXGFwcHJveCBcbWF0aGJmezF7LH0wMTh9JA0KDQojIyBLZXNpbXB1bGFuIEJvYm90Og0KDQp8IEtvdGEgICB8IEp1bWxhaCBSZXNwb25kZW4gfCBCb2JvdCBQZW55ZXN1YWlhbiB8DQp8LS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS18DQp8IEtvdGEgQSB8IDI1MCAgICAgICAgICAgICAgfCAwLDczMyAgICAgICAgICAgICB8DQp8IEtvdGEgQiB8IDEyMCAgICAgICAgICAgICAgfCAxLDUyOCAgICAgICAgICAgICB8DQp8IEtvdGEgQyB8IDE4MCAgICAgICAgICAgICAgfCAxLDAxOCAgICAgICAgICAgICB8DQoNCi1Cb2JvdCBkaWd1bmFrYW4gdW50dWsgbWVueWVzdWFpa2FuIGtvbnRyaWJ1c2kgbWFzaW5nLW1hc2luZyBrb3RhIGRhbGFtDQphbmFsaXNpcyBhZ2FyIGtlbWJhbGkgcHJvcG9yc2lvbmFsIHNlcGVydGkgdGFyZ2V0IGF3YWwuDQoNCi1TZW1ha2luIGJlc2FyIGJvYm90LCBzZW1ha2luIGJlc2FyIGtvbnRyaWJ1c2kgZGF0YSB0ZXJzZWJ1dCB0ZXJoYWRhcA0Ka2VzZWx1cnVoYW4gaGFzaWwuDQoNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQojIE1lbmRlc2FpbiBTdXJ2ZWkgZGVuZ2FuIFBlbWJvYm90YW4gV2FrdHUgUHVuY2FrDQoNCk1lbWJ1YXRsYWggZGVzYWluIHJhbmNhbmdhbiBzdXJ2ZWkgdGVudGFuZyBwZXJzZXBzaSBrZW55YW1hbmFuIHBlbmdndW5hDQpvamVrIG9ubGluZSBzYWF0IGphbSBzaWJ1ayAoMDcuMDDigJMwOS4wMCBkYW4gMTcuMDDigJMxOS4wMCkuDQoNCiMjIERlc2FpbiBwZW5kZWthdGFuIHNhbXBsaW5nDQoNCioqVHVqdWFuOioqXA0KTWVuYW5na2FwIHBlcnNlcHNpIGtlbnlhbWFuYW4gcGVuZ2d1bmEgb2playBvbmxpbmUgcGFkYSAqKmphbSBzaWJ1ayoqLA0Kc2VjYXJhIHJlcHJlc2VudGF0aWYsIHRhbnBhIG1lbGFrdWthbiBzdXJ2ZWkgc2VwYW5qYW5nIGhhcmkuDQoNCioqUGVuZGVrYXRhbiBTYW1wbGluZzoqKlwNCk1ldG9kZSAqKipzdHJhdGlmaWVkIHRpbWUtYmFzZWQgc2FtcGxpbmcqKiogYmVyZGFzYXJrYW4gZHVhIHN0cmF0YQ0Kd2FrdHU6IC0gKipTdHJhdGEgMToqKiBQYWdpIGhhcmkgKDA3LjAw4oCTMDkuMDApIC0gKipTdHJhdGEgMjoqKiBTb3JlIGhhcmkNCigxNy4wMOKAkzE5LjAwKQ0KDQoqKlByb3BvcnNpIFNhbXBsaW5nIElkZWFsIChiZXJkYXNhcmthbiBkYXRhIGhpc3RvcmlzKToqKiAtIFN0cmF0YSBwYWdpOg0KMzMsMyUgLSBTdHJhdGEgc29yZTogNjYsNyUNCg0KUGVueWVzdWFpYW4gcHJvcG9yc2lvbmFsIGFrYW4gZGlsYWt1a2FuIGppa2EgcHJvcG9yc2kgcmVzcG9uZGVuIGFrdHVhbA0KYmVyYmVkYSBkYXJpIHRhcmdldC4NCg0KIyMgUmFuY2FuZ2FuIFdha3R1LCBNZXRvZGUgUGVtaWxpaGFuIFJlc3BvbmRlbiwgZGFuIEp1c3RpZmlrYXNpDQoNCioqMS4gV2FrdHUgUGVsYWtzYW5hYW4gU3VydmVpOioqDQoNCi0gICAqKkR1cmFzaToqKiA1IGhhcmkga2VyamEgKFNlbmlu4oCTSnVtYXQpDQoNCi0gICAqKkphbSBwZW5nYW1iaWxhbiBkYXRhOioqDQoNCiAgICAtICAgUGFnaTogMDcuMDAg4oCTIDA5LjAwDQoNCiAgICAtICAgU29yZTogMTcuMDAg4oCTIDE5LjAwDQoNCioqMi4gTG9rYXNpIFBlbmdhbWJpbGFuIFJlc3BvbmRlbjoqKg0KDQotICAgQXJlYSBwYWRhdCBwZW5nZ3VuYSBvamVrIG9ubGluZSBzZXBlcnRpOg0KDQogICAgLSAgIFN0YXNpdW4NCg0KICAgIC0gICBIYWx0ZQ0KDQogICAgLSAgIFB1c2F0IHBlcmthbnRvcmFuDQoNCiAgICAtICAgTWFsbCBhdGF1IHB1c2F0IHBlcmJlbGFuamFhbg0KDQoqKjMuIE1ldG9kZSBQZW1pbGloYW4gUmVzcG9uZGVuOioqDQoNCi0gICAqKk1ldG9kZToqKg0KDQogICAgLSAgICpJbnRlcmNlcHQgc3VydmV5KiAod2F3YW5jYXJhIGxhbmdzdW5nIGRpIGxva2FzaSkNCg0KICAgIC0gICBTdXJ2ZWkgb25saW5lIG1lbGFsdWkgbGluayAoZGliYWdpa2FuIGxld2F0IGFwbGlrYXNpIGF0YXUgbWVkaWENCiAgICAgICAgc29zaWFsIGtvbXVuaXRhcyBwZW5nZ3VuYSBvamVrIG9ubGluZSkNCg0KLSAgICoqS3JpdGVyaWEgcmVzcG9uZGVuOioqDQoNCiAgICAtICAgUGVuZ2d1bmEgYWt0aWYgb2playBvbmxpbmUgKG1pbmltYWwgMngvbWluZ2d1KQ0KDQogICAgLSAgIFBlcm5haCBtZW5nZ3VuYWthbiBvamVrIG9ubGluZSBkYWxhbSA3IGhhcmkgdGVyYWtoaXINCg0KICAgIC0gICBNZW5nZ3VuYWthbiBvamVrIG9ubGluZSBwYWRhIGphbSBzaWJ1aw0KDQoqKjQuIEp1c3RpZmlrYXNpIFBlbWlsaWhhbiBVbml0IFNhbXBsaW5nOioqDQoNCi0gICAqKlVuaXQgc2FtcGxpbmc6KiogSW5kaXZpZHUgcGVuZ2d1bmEgb2playBvbmxpbmUgcGFkYSBqYW0gc2lidWsNCg0KLSAgIFBlbWlsaWhhbiBsb2thc2kgZGFuIHdha3R1IGRpZGFzYXJrYW4gcGFkYSB0aXRpayBkYW4gcGVyaW9kZSBwYWRhdA0KICAgIHBlbmdndW5hDQoNCi0gICBTdHJhdGlmaWthc2kgd2FrdHUgbWVuamFnYSByZXByZXNlbnRhc2kgYW50YXJhIHBlbmdndW5hIHBhZ2kgZGFuDQogICAgc29yZQ0KDQojIyBQZW55ZXN1YWlhbiBIYXNpbCBTdXJ2ZWkgQmVyZGFzYXJrYW4gUHJvcG9yc2kgUmVzcG9uZGVuDQoNCiMjIyBLYXN1czoNCg0KLSAgICoqUmVzcG9uZGVuIGFrdHVhbDoqKiA2MCUgcGFnaSwgNDAlIHNvcmUNCg0KLSAgICoqRGF0YSBoaXN0b3JpczoqKiBQZW5nZ3VuYSBzb3JlIDJ4IGxlYmloIGJhbnlhayBkYXJpIHBhZ2kNCg0KIyMjIExhbmdrYWgtbGFuZ2thaCBNZW5naGl0dW5nIFBlbnllc3VhaWFuIEJvYm90DQoNCioqMS4gVGVudHVrYW4gcHJvcG9yc2kgaWRlYWwgcG9wdWxhc2kgYmVyZGFzYXJrYW4gZGF0YSBoaXN0b3JpcyoqDQoNCk1pc2FsbnlhOg0KDQotICAgUHJvcG9yc2kgcGVuZ2d1bmEgcGFnaSA9IDENCg0KLSAgIFByb3BvcnNpIHBlbmdndW5hIHNvcmUgPSAyDQoNClRvdGFsID0gMSArIDIgPSAzDQoNCk1ha2E6DQoNCi0gICAkUF97XHRleHR7cGFnaX19ID0gXGZyYWN7MX17M30gPSAwLjMzJA0KDQotICAgJFBfe1x0ZXh0e3NvcmV9fSA9IFxmcmFjezJ9ezN9ID0gMC42NyQNCg0KKioyLiBUZW50dWthbiBwcm9wb3JzaSBha3R1YWwgcmVzcG9uZGVuIGRhcmkgaGFzaWwgc3VydmVpKioNCg0KLSAgICRSX3tcdGV4dHtwYWdpfX0gPSAwLjYwJA0KDQotICAgJFJfe1x0ZXh0e3NvcmV9fSA9IDAuNDAkDQoNCioqMy4gSGl0dW5nIGJvYm90IHBlbnllc3VhaWFuKioNCg0KUnVtdXMgdW11bSBib2JvdDoNCg0KJCQNClx0ZXh0e0JvYm90fV9pID0gXGZyYWN7UF9pfXtSX2l9DQokJA0KDQpEaSBtYW5hOg0KDQotICAgJFBfaSQ6IHByb3BvcnNpIGlkZWFsIChwb3B1bGFzaSBzZWJlbmFybnlhKQ0KDQotICAgJFJfaSQ6IHByb3BvcnNpIHJlc3BvbmRlbiBha3R1YWwNCg0KLSAgICRpJDoga2F0ZWdvcmkgd2FrdHUgKHBhZ2kgYXRhdSBzb3JlKQ0KDQpNYWthOg0KDQotICAgJFx0ZXh0e0JvYm90fV97XHRleHR7cGFnaX19ID0gXGZyYWN7MC4zM317MC42MH0gXGFwcHJveCAwLjU1JA0KLSAgICRcdGV4dHtCb2JvdH1fe1x0ZXh0e3NvcmV9fSA9IFxmcmFjezAuNjd9ezAuNDB9IFxhcHByb3ggMS42NzUkDQoNCiMjIyBQZXJoaXR1bmdhbiBNZWxhbHVpIFINCg0KYGBge3IsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGVjaG89VFJVRX0NCiMgRGF0YSBpbnB1dDogd2FrdHUgKDEgPSBwYWdpLCAyID0gc29yZSksIGRhbiBza29yIGtlbnlhbWFuYW4gbWFzaW5nLW1hc2luZyByZXNwb25kZW4NCndha3R1IDwtIGMoMSwxLDEsMSwxLDIsMiwyLDIsMikgICMgNSByZXNwb25kZW4gcGFnaSwgNSBzb3JlDQpza29yX2tlbnlhbWFuYW4gPC0gYyg0LCAzLCA1LCA0LCA0LCAyLCAzLCAzLCAyLCA0KQ0KDQojIFByb3BvcnNpIHBvcHVsYXNpIGlkZWFsIChiZXJkYXNhcmthbiBkYXRhIGhpc3RvcmlzOiBzb3JlIDJ4IGxlYmloIGJhbnlhayBkYXJpIHBhZ2kpDQpQX3BhZ2kgPC0gMS8zDQpQX3NvcmUgPC0gMi8zDQoNCiMgUHJvcG9yc2kgcmVzcG9uZGVuIGFrdHVhbA0KUl9wYWdpIDwtIHN1bSh3YWt0dSA9PSAxKSAvIGxlbmd0aCh3YWt0dSkNClJfc29yZSA8LSBzdW0od2FrdHUgPT0gMikgLyBsZW5ndGgod2FrdHUpDQoNCiMgSGl0dW5nIGJvYm90DQp3X3BhZ2kgPC0gUF9wYWdpIC8gUl9wYWdpDQp3X3NvcmUgPC0gUF9zb3JlIC8gUl9zb3JlDQoNCiMgVGV0YXBrYW4gYm9ib3Qga2Ugc2V0aWFwIHJlc3BvbmRlbg0KYm9ib3QgPC0gaWZlbHNlKHdha3R1ID09IDEsIHdfcGFnaSwgd19zb3JlKQ0KDQojIEhpdHVuZyByYXRhLXJhdGEgc2tvciBrZW55YW1hbmFuIHRlcmJvYm90DQpyYXRhX3RlcmJvYm90IDwtIHN1bShib2JvdCAqIHNrb3Jfa2VueWFtYW5hbikgLyBzdW0oYm9ib3QpDQoNCiMgVGFtcGlsa2FuIGhhc2lsDQpjYXQoIlJhdGEtcmF0YSBza29yIGtlbnlhbWFuYW4gKHRlcmJvYm90KToiLCByb3VuZChyYXRhX3RlcmJvYm90LCAyKSwgIlxuIikNCmBgYA0KDQojIyBLZXNpbXB1bGFuDQoNCkRlbmdhbiBtZXRvZGUgaW5pOg0KDQotICAgU3VydmVpIHRldGFwIGVmaXNpZW4gKGhhbnlhIHBhZGEgamFtIHNpYnVrKQ0KDQotICAgSGFzaWwgdGV0YXAgbWV3YWtpbGkgcHJvcG9yc2kgcGVuZ2d1bmEgc2ViZW5hcm55YQ0KDQotICAgUGVueWVzdWFpYW4gYm9ib3QgbWVuamFnYSB2YWxpZGl0YXMgZGFuIG9iamVrdGl2aXRhcyBoYXNpbA0KDQojIFN0dWRpIEthc3VzDQoNCkJpcm8gYWthZGVtaWsga2FtcHVzIHVudHVrIG1lcmFuY2FuZyBpbnN0cnVtZW4gc3VydmVpIHlhbmcgYmVydHVqdWFuDQptZW5nZXZhbHVhc2kga2VwdWFzYW4gbWFoYXNpc3dhIHRlcmhhZGFwIGxheWFuYW4gYWthZGVtaWssIHlhbmcgbWVuY2FrdXANCmxheWFuYW4gc2VwZXJ0aTogS1JTIG9ubGluZSwgYmltYmluZ2FuIGFrYWRlbWlrLCBwZWxheWFuYW4gYWRtaW5pc3RyYXNpLA0KYWtzZXMgaW5mb3JtYXNpIGFrYWRlbWlrLCBkYW4gYmFudHVhbiBwZW55ZWxlc2FpYW4gc3R1ZGkuDQoNClRpbSBwZW5lbGl0aSBkaW1pbnRhIHVudHVrOg0KDQotICAgTWVyYW5jYW5nIDI1IHBlcnRhbnlhYW4gdXRhbWEgZGVuZ2FuIHZhcmlhc2kgc2thbGEgZGFuIGJlbnR1aw0KICAgIHBlcnRhbnlhYW4uDQoNCi0gICBNZXJhbmNhbmcgc2lzdGVtIHZhbGlkYXNpIGluc3RydW1lbi4NCg0KLSAgIE1lbmVudHVrYW4gbWV0b2RlIGRpc3RyaWJ1c2kgZGFuIHBlbmd1amlhbiBrdWVzaW9uZXIgc2VjYXJhDQogICAgc3RhdGlzdGlrLg0KDQotICAgTWVueWlhcGthbiBzaW11bGFzaSBzdHJhdGVnaSBwZW5nYW1iaWxhbiBzYW1wZWwgZGFuIHBlbmdvbGFoYW4gZGF0YQ0KICAgIGF3YWwuDQoNCiMjIERlc2FpbiBwZXJ0YW55YWFuDQoNCkxpbmsgUGVydGFueWFhbjogW0tlcHVhc2FuIE1haGFzaXN3YSBUZXJoYWRhcCBMYXlhbmFuDQpBa2FkZW1pa10oaHR0cHM6Ly9kb2NzLmdvb2dsZS5jb20vZm9ybXMvZC9lLzFGQUlwUUxTZnBaa3VyZGJ6aXRhYUNhcGloMUVpTFltRkFJM2FkYUJKclU5QlY2UFhGR3Noamt3L2Zvcm1SZXNwb25zZSkNCg0KUmluZ2thc2FuIGplbmlzIHBlcnRhbnlhYW46DQoNCi0gU2thbGEgTGlrZXJ0OiAxNSBwZXJ0YW55YWFuDQoNCi0gVGVydHV0dXAgKFlhL1RpZGFrKTogNCBwZXJ0YW55YWFuDQoNCi0gVGVyYnVrYTogNiBwZXJ0YW55YWFuDQoNCi0gUGlsaWhhbiBrYXRlZ29yaTogMSBwZXJ0YW55YWFuDQoNCi0gQ2hlY2tsaXN0IChwaWxpaGFuIGphbWFrKTogMSBwZXJ0YW55YWFuDQoNCioqVG90YWw6IDI1IHBlcnRhbnlhYW4gdXRhbWEgZGFuIHBlcnRhbnlhYW4gaWRlbnRpdGFzIGFkYSA1IGphZGkgc2VsdXJ1aA0KdG90YWxueWEgYWRhIDMwKioNCg0KIyMgU2tlbWEgdmFsaWRhc2kNCg0KLSAqKlZhbGlkYXNpIElzaSAoQ29udGVudCBWYWxpZGl0eSk6KioNCg0KICAtIExhbmdrYWg6IERhZnRhciBwZXJ0YW55YWFuIGFrYW4gZGlwZXJpa3NhIG9sZWggcGFuZWwgYWhsaSB5YW5nIHRlcmRpcmkgZGFyaSBkb3Nlbiwgc3RhZiBiaXJvIGFrYWRlbWlrLCBkYW4gcGFrYXIgbWV0b2RlIHBlbmVsaXRpYW4gcGVuZGlkaWthbi4NCg0KICAtIFR1anVhbjogTWVtYXN0aWthbiBzZXRpYXAgYnV0aXIgc29hbCBtZXJlcHJlc2VudGFzaWthbiBrb25zdHJ1ayBrZXB1YXNhbiB0ZXJoYWRhcCBsYXlhbmFuIGFrYWRlbWlrLg0KDQogIC0gQWxhdCBiYW50dTogTWVuZ2d1bmFrYW4gQ29udGVudCBWYWxpZGl0eSBJbmRleCAoQ1ZJKSB1bnR1ayBtZW5pbGFpIHJlbGV2YW5zaSBzZXRpYXAgaXRlbS4gSXRlbSBkZW5nYW4gQ1ZJIDwgMC43NSBha2FuIGRpcmV2aXNpIGF0YXUgZGloYXB1cy4NCg0KLSAqKlZhbGlkYXNpIEtvbnN0cnVrIChDb25zdHJ1Y3QgVmFsaWRpdHkpOioqDQoNCiAgLSBTZXRlbGFoIGRhdGEgZGlrdW1wdWxrYW4sIGFrYW4gZGlsYWt1a2FuIEV4cGxvcmF0b3J5IEZhY3RvciBBbmFseXNpcyAoRUZBKSB1bnR1ayBtZW5nZWxvbXBva2thbiBpdGVtIGJlcmRhc2Fya2FuIGRpbWVuc2kgbGF5YW5hbiAoS1JTLCBCaW1iaW5nYW4sIEFkbWluaXN0cmFzaSwgZGxsKS4NCg0KICAtIEtvcmVsYXNpIGFudGFyIGl0ZW0ganVnYSBkaWFuYWxpc2lzIChpbnRlci1pdGVtIGNvcnJlbGF0aW9uKSB1bnR1ayBtZW5kZXRla3NpIGtvbnNpc3RlbnNpIGRhbGFtIHNhdHUgZGltZW5zaS4NCg0KICAtIFNvZnR3YXJlIHlhbmcgZGlndW5ha2FuOiBTUFNTLCBKQVNQLCBhdGF1IFIuDQoNCiAgLSBLcml0ZXJpYTogTXVuY3VsbnlhIHN0cnVrdHVyIGZha3RvciB5YW5nIHNlc3VhaSBkZW5nYW4gcmFuY2FuZ2FuIHRlb3JpIGF3YWwgZGFuIGtvcmVsYXNpIGFudGFyIGl0ZW0gZGFsYW0gc2F0dSBkaW1lbnNpIGhhcnVzID4gMC4zLg0KDQotICoqVWppIFJlbGlhYmlsaXRhczoqKg0KDQogIC0gVWppIHJlbGlhYmlsaXRhcyBha2FuIGRpbGFrdWthbiBtZW5nZ3VuYWthbiBDcm9uYmFjaOKAmXMgQWxwaGEsIGRlbmdhbiB0YXJnZXQgbmlsYWkg4omlIDAuNzAgdW50dWsgc2V0aWFwIHN1YnNrYWxhLg0KDQogIC0gVHVqdWFuOiBNZW5ndWppIGtvbnNpc3RlbnNpIGludGVybmFsIGRhcmkgaXRlbS1pdGVtIGRhbGFtIHNhdHUgZGltZW5zaSBsYXlhbmFuLg0KDQogIC0gSmlrYSBuaWxhaSBDcm9uYmFjaOKAmXMgQWxwaGEgPCAwLjcwLCBtYWthIGFrYW4gZGlsYWt1a2FuIGFuYWxpc2lzIGl0ZW0tdG90YWwgY29ycmVsYXRpb24gdW50dWsgbWVyZXZpc2kgYXRhdSBtZW1idWFuZyBpdGVtIHlhbmcgbGVtYWguDQoNCiMjIFN0cmF0ZWdpIERpc3RyaWJ1c2kgZGFuIFNhbXBsaW5nDQoNCiMjIyAqKk1ldG9kZSBEaXN0cmlidXNpOioqDQoNCkt1ZXNpb25lciBkaWJhZ2lrYW4gbWVsYWx1aSAqKkdvb2dsZSBGb3JtKiogZGVuZ2FuIG1lbWJhZ2lrYW5ueWEga2UgYmViZXJhcGEgbWVkaWEgc2ViYWdhaSBiZXJpa3V0Og0KDQotIEdydXAgV2hhdHNBcHAga2VsYXMvYW5na2F0YW4NCg0KLSBFbWFpbCBtYWhhc2lzd2EgYWt0aWYNCg0KLSBNZWRpYSBzb3NpYWwga2FtcHVzDQoNCi0gV2Vic2l0ZSBha2FkZW1payByZXNtaQ0KDQojIyMgKipTdHJhdGVnaSBQZW5nYW1iaWxhbiBTYW1wZWw6KioNCg0KU2FtcGVsIGRpYW1iaWwgc2VjYXJhIGFjYWsgZGFyaSBzdHJhdGEgKCoqU3RyYXRpZmllZCBSYW5kb20gU2FtcGxpbmcqKiksIHlha25pIHBhZGEgbWFoYXNpc3dhIHlhbmcgYmVyYXNhbCBkYXJpIGJlcmJhZ2FpIHByb2dyYW0gc3R1ZGkgZGFuIGFuZ2thdGFuLiAqKlN0cmF0aWZpZWQgcmFuZG9tIHNhbXBsaW5nKiogZGlwaWxpaCBrYXJlbmEgbWVuamFtaW4gcmVwcmVzZW50YXNpIHRpYXAgcHJvZ3JhbSBzdHVkaSBkYW4gYW5na2F0YW4sIHNlaGluZ2dhIGhhc2lsIGxlYmloICoqZ2VuZXJhbGlzYWJsZSoqLiBEZW5nYW4gc3RyYXRpZmlrYXNpLCBzZXRpYXAga2Vsb21wb2sgdGVyd2FraWxpIHNlY2FyYSBwcm9wb3JzaW9uYWwuDQoNCioqU3RyYXRhKiogeWFuZyBkaWd1bmFrYW4gYWRhbGFoICoqUHJvZ3JhbSBTdHVkaSoqIGRhbiAqKkFuZ2thdGFuKiogKDIwMjAsIDIwMjEsIDIwMjIsIDIwMjMpLiANCg0KTWVuZ2d1bmFrYW4gKipkYXRhIHNhbXBlbCBkYXJpIGZpbGUgQ1NWIHlhbmcgdGVsYWggZGlzZWRpYWthbioqLCBiZXJpa3V0IGFkYWxhaCBkaXN0cmlidXNpIG1haGFzaXN3YSBiZXJkYXNhcmthbiBwcm9ncmFtIHN0dWRpIGRhbiBhbmdrYXRhbiB5YW5nIHRlcndha2lsaSBkYWxhbSBkYXRhOg0KDQp8ICoqUHJvZ3JhbSBTdHVkaSoqICAgICAgICB8ICoqQW5na2F0YW4qKiAgfCAqKkp1bWxhaCBSZXNwb25kZW4gKEJlcmRhc2Fya2FuIENTVikqKiB8DQp8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18DQp8IFRla25payBJbmZvcm1hdGlrYSAgICAgICB8IDIwMjDigJMyMDIzICAgICB8IDcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCnwgTWFuYWplbWVuICAgICAgICAgICAgICAgIHwgMjAyMOKAkzIwMjMgICAgIHwgNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KfCBBa3VudGFuc2kgICAgICAgICAgICAgICAgfCAyMDIw4oCTMjAyMyAgICAgfCA2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQp8IElsbXUgS29tdW5pa2FzaSAgICAgICAgICB8IDIwMjDigJMyMDIzICAgICB8IDUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCnwgUHNpa29sb2dpICAgICAgICAgICAgICAgIHwgMjAyMOKAkzIwMjMgICAgIHwgNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KfCBQZW5kaWRpa2FuICAgICAgICAgICAgICAgfCAyMDIw4oCTMjAyMyAgICAgfCA1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQp8IFByb2RpIGxhaW5ueWEgICAgICAgICAgICB8IC0gICAgICAgICAgICAgfCAxNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQp8ICoqVG90YWwgUmVzcG9uZGVuKiogICAgICB8ICAgICAgICAgICAgICAgfCAqKjUwKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KDQojIyBTaW11bGFzaSBkYXRhIGRhbiBhbmFsaXNpcyBhd2FsDQoNCiMjIyBSYXRhLVJhdGEgcGVyIFJlc3BvbmRlbjoNCg0KMS4gKipSYXRhLVJhdGEgUmVzcG9uZGVuIDE6KiogIA0KICAgJFxvdmVybGluZXtYfV8xID0gXGZyYWN7MyArIDIgKyAyfXszfSA9IDIuMzMkDQoNCjIuICoqUmF0YS1SYXRhIFJlc3BvbmRlbiAyOioqICANCiAgICRcb3ZlcmxpbmV7WH1fMiA9IFxmcmFjezQgKyAzICsgM317M30gPSAzLjMzJA0KDQozLiAqKlJhdGEtUmF0YSBSZXNwb25kZW4gMzoqKiAgDQogICAkXG92ZXJsaW5le1h9XzMgPSBcZnJhY3szICsgMyArIDN9ezN9ID0gMy4wMCQNCg0KNC4gKipSYXRhLVJhdGEgUmVzcG9uZGVuIDQ6KiogIA0KICAgJFxvdmVybGluZXtYfV80ID0gXGZyYWN7NCArIDQgKyA0fXszfSA9IDQuMDAkDQoNCjUuICoqUmF0YS1SYXRhIFJlc3BvbmRlbiA1OioqICANCiAgICRcb3ZlcmxpbmV7WH1fNSA9IFxmcmFjezIgKyAyICsgMn17M30gPSAyLjAwJA0KDQp8IEExNSB8IEExNiB8IEExNyB8IFJhdGEtUmF0YSB8DQp8IC0tLSB8IC0tLSB8IC0tLSB8IC0tLS0tLS0tLSB8DQp8IDMgICB8IDIgICB8IDIgICB8IDIuMzMgICAgICB8DQp8IDQgICB8IDMgICB8IDMgICB8IDMuMzMgICAgICB8DQp8IDMgICB8IDMgICB8IDMgICB8IDMuMDAgICAgICB8DQp8IDQgICB8IDQgICB8IDQgICB8IDQuMDAgICAgICB8DQp8IDIgICB8IDIgICB8IDIgICB8IDIuMDAgICAgICB8DQoNCiMjIyBSYXRhLVJhdGEgU2VtdWEgUmVzcG9uZGVuOg0KDQokXG92ZXJsaW5le1h9ID0gXGZyYWN7Mi4zMyArIDMuMzMgKyAzLjAwICsgNC4wMCArIDIuMDB9ezV9ID0gXGZyYWN7MTQuNjZ9ezV9ID0gMi45MyQNCg0KIyMjIFNpbXBhbmdhbiBCYWt1Og0KDQpHdW5ha2FuIHJ1bXVzOg0KDQokcyA9IFxzcXJ0e1xmcmFje1xzdW0gKFhfaSAtIFxvdmVybGluZXtYfSleMn17bi0xfX0kDQoNClBlcmhpdHVuZ2FuOg0KDQoxLiAkKDIuMzMgLSAyLjkzKV4yID0gMC4zNiQgIA0KMi4gJCgzLjMzIC0gMi45MyleMiA9IDAuMTYkICANCjMuICQoMy4wMCAtIDIuOTMpXjIgPSAwLjAwNDkkICANCjQuICQoNC4wMCAtIDIuOTMpXjIgPSAxLjE0NDkkICANCjUuICQoMi4wMCAtIDIuOTMpXjIgPSAwLjg2NDkkDQoNCkp1bWxhaDogJDAuMzYgKyAwLjE2ICsgMC4wMDQ5ICsgMS4xNDQ5ICsgMC44NjQ5ID0gMi41OCQNCg0KJHMgPSBcc3FydHtcZnJhY3syLjU4fXs0fX0gPSBcc3FydHswLjY0NX0gXGFwcHJveCAwLjgwJA0KDQpKYWRpLCAqKnNpbXBhbmdhbiBiYWt1IHVudHVrIGRpbWVuc2kgQmFudHVhbiBQZW55ZWxlc2FpYW4gU3R1ZGkgYWRhbGFoIDAuODAqKi4NCg0KDQpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgZWNobz1UUlVFfQ0KIyBEYXRhIHJlc3BvbmRlbg0KZGF0YSA8LSBkYXRhLmZyYW1lKA0KICBBMSA9IGMoMiwgNCwgMywgNCwgMSksDQogIEEyID0gYygyLCA0LCAzLCA1LCAxKSwNCiAgQTMgPSBjKDMsIDQsIDQsIDQsIDIpLA0KICBBNCA9IGMoMywgNCwgNCwgNCwgMiksDQogIEE1ID0gYygzLCAzLCAzLCA0LCAyKSwNCiAgQTYgPSBjKDMsIDQsIDQsIDUsIDMpLA0KICBBNyA9IGMoMiwgMywgMywgNCwgMiksDQogIEE4ID0gYyg0LCAzLCA0LCA0LCAyKSwNCiAgQTkgPSBjKDMsIDQsIDQsIDQsIDIpLA0KICBBMTAgPSBjKDMsIDMsIDMsIDQsIDIpLA0KICBBMTEgPSBjKDQsIDMsIDMsIDQsIDMpLA0KICBBMTIgPSBjKDMsIDQsIDMsIDQsIDIpLA0KICBBMTMgPSBjKDQsIDQsIDMsIDQsIDIpLA0KICBBMTQgPSBjKDMsIDQsIDQsIDQsIDIpLA0KICBBMTUgPSBjKDMsIDQsIDMsIDQsIDIpLA0KICBBMTYgPSBjKDIsIDMsIDMsIDQsIDIpLA0KICBBMTcgPSBjKDIsIDMsIDMsIDQsIDIpDQopDQoNCiMgRGFmdGFyIGRpbWVuc2kgZGFuIGtvbG9tIHRlcmthaXQNCmRpbWVuc2kgPC0gbGlzdCgNCiAgS1JTX09ubGluZSA9IGMoIkExIiwgIkEyIiwgIkEzIiksDQogIEJpbWJpbmdhbl9Ba2FkZW1payA9IGMoIkE0IiwgIkE1IiwgIkE2IiwgIkE3IiksDQogIFBlbGF5YW5hbl9BZG1pbmlzdHJhdGlmID0gYygiQTgiLCAiQTkiLCAiQTEwIiwgIkExMSIsICJBMTIiLCAiQTEzIiwgIkExNCIpLA0KICBCYW50dWFuX1BlbnllbGVzYWlhbl9TdHVkaSA9IGMoIkExNSIsICJBMTYiLCAiQTE3IikNCikNCg0KIyBGdW5nc2kgdW50dWsgaGl0dW5nIHJhdGEtcmF0YSBkYW4gc2ltcGFuZ2FuIGJha3UgcGVyIGRpbWVuc2kNCmhpdHVuZ19zdGF0aXN0aWsgPC0gZnVuY3Rpb24oZGF0YSwgZGltZW5zaV9saXN0KSB7DQogIGhhc2lsIDwtIGRhdGEuZnJhbWUoDQogICAgRGltZW5zaSA9IGNoYXJhY3RlcigpLA0KICAgIFJhdGFfUmF0YSA9IG51bWVyaWMoKSwNCiAgICBTaW1wYW5nYW5fQmFrdSA9IG51bWVyaWMoKSwNCiAgICBzdHJpbmdzQXNGYWN0b3JzID0gRkFMU0UNCiAgKQ0KICANCiAgZm9yIChuYW1hIGluIG5hbWVzKGRpbWVuc2lfbGlzdCkpIHsNCiAgICBrb2xvbSA8LSBkaW1lbnNpX2xpc3RbW25hbWFdXQ0KICAgIG5pbGFpIDwtIHJvd01lYW5zKGRhdGFbLCBrb2xvbV0pDQogICAgcmF0YTIgPC0gbWVhbihuaWxhaSkNCiAgICBzaW1wX2Jha3UgPC0gc2QobmlsYWkpDQogICAgDQogICAgaGFzaWwgPC0gcmJpbmQoaGFzaWwsIGRhdGEuZnJhbWUoDQogICAgICBEaW1lbnNpID0gbmFtYSwNCiAgICAgIFJhdGFfUmF0YSA9IHJvdW5kKHJhdGEyLCAyKSwNCiAgICAgIFNpbXBhbmdhbl9CYWt1ID0gcm91bmQoc2ltcF9iYWt1LCAyKQ0KICAgICkpDQogIH0NCiAgDQogIHJldHVybihoYXNpbCkNCn0NCg0KIyBIaXR1bmcgZGFuIHRhbXBpbGthbiBoYXNpbA0KaGFzaWxfc3RhdGlzdGlrIDwtIGhpdHVuZ19zdGF0aXN0aWsoZGF0YSwgZGltZW5zaSkNCnByaW50KGhhc2lsX3N0YXRpc3RpaykNCmBgYA0KDQojIyMgSW50ZXJwcmV0YXNpDQoNCi0gS2VwdWFzYW4gdGVydGluZ2dpIGJlcmFkYSBwYWRhIGRpbWVuc2kgQmltYmluZ2FuIEFrYWRlbWlrIGRlbmdhbiByYXRhLXJhdGEgMy4yNSwgbWVudW5qdWtrYW4gYmFod2EgbWFoYXNpc3dhIGNlbmRlcnVuZyBjdWt1cCBwdWFzIGRlbmdhbiBwcm9zZXMgYmltYmluZ2FuIGFrYWRlbWlrIG1lcmVrYS4NCg0KLSBLZXB1YXNhbiB0ZXJlbmRhaCBiZXJhZGEgcGFkYSBkaW1lbnNpIEJhbnR1YW4gUGVueWVsZXNhaWFuIFN0dWRpIChyYXRhLXJhdGEgMi45MyksIG1lbmFuZGFrYW4gYWRhbnlhIHBvdGVuc2kgbWFzYWxhaCBhdGF1IGhhcmFwYW4geWFuZyBiZWx1bSB0ZXJwZW51aGkgcGFkYSBhc3BlayB0ZXJzZWJ1dC4NCg0KLSBEaW1lbnNpIGRlbmdhbiB2YXJpYXNpIGtlcHVhc2FuIHRlcnRpbmdnaSBhZGFsYWggUGVsYXlhbmFuIEFkbWluaXN0cmF0aWYgZGVuZ2FuIHNpbXBhbmdhbiBiYWt1IHNlYmVzYXIgMS4zMSwgYXJ0aW55YSBwZXJzZXBzaSBtYWhhc2lzd2Egc2FuZ2F0IGJlcnZhcmlhc2kgdGVyaGFkYXAgbGF5YW5hbiBhZG1pbmlzdHJhdGlm4oCUYWRhIHlhbmcgc2FuZ2F0IHB1YXMsIGFkYSBwdWxhIHlhbmcgdGlkYWsuDQoNCi0gS1JTIE9ubGluZSBtZW1pbGlraSBrZXB1YXNhbiByYXRhLXJhdGEgMy4wNywgY3VrdXAgbWVtYWRhaSBuYW11biBkZW5nYW4gc2ltcGFuZ2FuIHlhbmcgcmVsYXRpZiB0aW5nZ2kgKDEuMjMpLCBzZWhpbmdnYSBiaXNhIG1lbmphZGkgYXJlYSB5YW5nIGRpcGVyaGF0aWthbiB1bnR1ayBzdGFuZGFyaXNhc2kga3VhbGl0YXMgbGF5YW5hbi4NCg0KLSBTaW1wYW5nYW4gYmFrdSBwYWRhIHNlbHVydWggZGltZW5zaSBiZXJraXNhciBhbnRhcmEgMC43NyBoaW5nZ2EgMS4zMSwgbWVuYW5kYWthbiBiYWh3YSBkYXRhIGN1a3VwIHRlcnNlYmFyIGRhbiB0aWRhayBzZW11YSBtYWhhc2lzd2EgbWVtaWxpa2kgcGVuZ2FsYW1hbiB5YW5nIHNlcmFnYW0gdGVyaGFkYXAgbGF5YW5hbiBrYW1wdXMuDQoNCg==