Study Kasus Probabilitas Bersyarat

Statistika Dasar

Logo

1 Studi Kasus 1

Penerapan Probabilitas dalam Prediksi Kualitas Produk:

Sebuah perusahaan manufaktur memproduksi barang elektronik dan ingin memprediksi apakah suatu produk akan cacat atau tidak. Data historis menunjukkan bahwa 5% dari produk yang diproduksi adalah cacat. Perusahaan menggunakan data tentang jenis komponen dan proses produksi untuk memprediksi cacat produk menggunakan teknik probabilitas.

1.1 Fitur Data

  • Komponen (C): Apakah komponen elektronik yang digunakan adalah berkualitas tinggi atau rendah.
  • Proses Produksi (P): Apakah proses produksi dilakukan di bawah standar atau sesuai standar.
  • Cacat (D): Status cacat produk (ya/tidak).

1.2 Data Historis (Contoh)

  • Probabilitas produk cacat (๐‘ƒ (๐ท = Yes)) = 5%
  • Probabilitas produk tidak cacat (๐‘ƒ(๐ท = No)) = 95%
  • Probabilitas menggunakan komponen berkualitas rendah (๐‘ƒ(๐ถ = Low)) = 30%
  • Probabilitas menggunakan komponen berkualitas tinggi (๐‘ƒ(๐ถ = High))= 70%
  • Probabilitas proses produksi di bawah standar (๐‘ƒ (๐‘ƒ = Below)) = 40%
  • Probabilitas proses produksi sesuai standar (๐‘ƒ(๐‘ƒ = Standard)) = 60%

Bagaimana probabilitas bahwa suatu produk akan cacat (๐ท = Yes), jika diketahui komponen yang digunakan berkualitas rendah dan proses produksi di bawah standar?

1.3 Jawaban

1.3.1 Langkah 1: Teorema Bayes

Teorema Bayes digunakan untuk menghitung probabilitas bersyarat:

\[ P(D = Yes \mid C = Low, P = Below) = \frac{P(C = Low, P = Below \mid D = Yes) \cdot P(D = Yes)}{P(C = Low, P = Below)} \]

  • Numerator: Probabilitas bahwa produk menggunakan komponen berkualitas rendah dan proses produksi di bawah standar jika produk cacat, dikalikan dengan probabilitas produk cacat.
  • Denominator: Probabilitas gabungan bahwa produk menggunakan komponen berkualitas rendah dan proses produksi di bawah standar, tanpa memperhatikan status cacat.

1.3.2 Langkah 2: Hitung \(P(C = Low, P = Below \mid D = Yes)\)

Kita asumsikan bahwa \(C\) (komponen) dan \(P\) (proses produksi) independen secara kondisional terhadap \(D\). Maka, probabilitas gabungan dapat dihitung sebagai: \[ P(C = Low, P = Below \mid D = Yes) = P(C = Low \mid D = Yes) \cdot P(P = Below \mid D = Yes) \]

  • Diberikan dalam soal:
    • \(( P(C = Low \mid D = Yes) = 0.70 )\) โ†’ Produk cacat kemungkinan besar menggunakan komponen berkualitas rendah.
    • \(( P(P = Below \mid D = Yes) = 0.80 )\) โ†’ Produk cacat kemungkinan besar diproduksi di bawah standar.

Substitusi nilai: \[ P(C = Low, P = Below \mid D = Yes) = 0.70 \cdot 0.80 = 0.56 \]


1.3.3 Langkah 3: Hitung \(P(C = Low, P = Below \mid D = No)\)

Demikian pula, untuk produk tidak cacat (\(D = No\)), kita hitung: \[ P(C = Low, P = Below \mid D = No) = P(C = Low \mid D = No) \cdot P(P = Below \mid D = No) \]

  • Diberikan dalam soal:
    • \(P(C = Low \mid D = No) = 0.25\) โ†’ Produk tidak cacat cenderung lebih jarang menggunakan komponen berkualitas rendah.
    • \(P(P = Below \mid D = No) = 0.35\) โ†’ Produk tidak cacat lebih jarang diproduksi di bawah standar.

Substitusi nilai: \[ P(C = Low, P = Below \mid D = No) = 0.25 \cdot 0.35 = 0.0875 \]


1.3.4 Langkah 4: Hitung \(P(C = Low, P = Below)\)

Probabilitas gabungan \(P(C = Low, P = Below)\) mencakup semua produk, baik yang cacat maupun tidak cacat. Maka: \[ P(C = Low, P = Below) \\= P(C = Low, P = Below \mid D = Yes) \cdot P(D = Yes) + P(C = Low, P = Below \mid D = No) \cdot P(D = No) \]

  • Diberikan dalam soal:
    • \(P(D = Yes) = 0.05\)
    • \(P(D = No) = 0.95\)

Substitusi nilai: \[ P(C = Low, P = Below) = (0.56 \cdot 0.05) + (0.0875 \cdot 0.95) \] \[ P(C = Low, P = Below) = 0.028 + 0.083125 = 0.111125 \]


1.3.5 Langkah 5: Hitung Probabilitas Akhir \(P(D = Yes \mid C = Low, P = Below)\)

Substitusi semua nilai yang sudah dihitung ke dalam rumus Teorema Bayes: \[ P(D = Yes \mid C = Low, P = Below) = \frac{P(C = Low, P = Below \mid D = Yes) \cdot P(D = Yes)}{P(C = Low, P = Below)} \]

Substitusi nilai: \[ P(D = Yes \mid C = Low, P = Below) = \frac{0.56 \cdot 0.05}{0.111125} \] \[ P(D = Yes \mid C = Low, P = Below) = \frac{0.028}{0.111125} \approx 0.252 \]


1.3.6 Langkah 6: Kesimpulan

Probabilitas bahwa suatu produk akan cacat, jika diketahui menggunakan komponen berkualitas rendah dan proses produksi di bawah standar, adalah: \[ P(D = Yes \mid C = Low, P = Below) \approx 25.2\% \]


1.3.7 Penjelasan

  1. Produk yang cacat lebih cenderung menggunakan komponen berkualitas rendah dan diproduksi di bawah standar. Oleh karena itu, probabilitas \(P(C = Low, P = Below \mid D = Yes)\) cukup tinggi (56%).
  2. Sebagian besar produk tidak cacat (\(P(D = No) = 95\%\)), sehingga kontribusi probabilitas \(P(C = Low, P = Below\) untuk produk tidak cacat lebih dominan dalam total \(P(C = Low, P = Below)\).
  3. Namun, karena kondisi tertentu (\(C = Low, P = Below\)), produk lebih mungkin cacat, sehingga \(P(D = Yes \mid C = Low, P = Below)\) menjadi lebih besar daripada probabilitas awal ( P(D = Yes) = 5%.

1.4 Kode

# Input data
P_D_yes <- 0.05  # Probabilitas produk cacat
P_D_no <- 0.95   # Probabilitas produk tidak cacat
P_C_low_given_D_yes <- 0.70  # Probabilitas komponen berkualitas rendah jika cacat
P_C_low_given_D_no <- 0.25   # Probabilitas komponen berkualitas rendah jika tidak cacat
P_P_below_given_D_yes <- 0.80  # Probabilitas proses di bawah standar jika cacat
P_P_below_given_D_no <- 0.35   # Probabilitas proses di bawah standar jika tidak cacat

# Hitung P(C = Low, P = Below | D = Yes) dan P(C = Low, P = Below | D = No)
P_C_low_and_P_below_given_D_yes <- P_C_low_given_D_yes * P_P_below_given_D_yes
P_C_low_and_P_below_given_D_no <- P_C_low_given_D_no * P_P_below_given_D_no

# Hitung P(C = Low, P = Below)
P_C_low_and_P_below <- (P_C_low_and_P_below_given_D_yes * P_D_yes) +
                       (P_C_low_and_P_below_given_D_no * P_D_no)

# Hitung P(D = Yes | C = Low, P = Below) menggunakan Teorema Bayes
P_D_yes_given_C_low_and_P_below <- (P_C_low_and_P_below_given_D_yes * P_D_yes) / P_C_low_and_P_below

# Output hasil
cat("P(D = Yes | C = Low, P = Below):", P_D_yes_given_C_low_and_P_below, "\n")
## P(D = Yes | C = Low, P = Below): 0.2519685

1.5 Kesimpulan

Kesimpulan: Berdasarkan perhitungan menggunakan Teorema Bayes, probabilitas bahwa suatu produk akan cacat, jika diketahui komponen yang digunakan berkualitas rendah dan proses produksi di bawah standar, adalah 25.2%. Meskipun data historis menunjukkan bahwa hanya 5% dari produk yang diproduksi adalah cacat secara umum, kondisi tertentuโ€”seperti penggunaan komponen berkualitas rendah dan proses produksi yang tidak sesuai dengan standarโ€”secara signifikan meningkatkan kemungkinan terjadinya cacat. Dalam hal ini, kombinasi dua faktor ini meningkatkan probabilitas cacat produk jauh lebih tinggi dibandingkan dengan probabilitas dasar yang hanya 5%. Oleh karena itu, perusahaan perlu lebih berhati-hati dan meningkatkan pengawasan terhadap komponen yang digunakan serta kualitas proses produksi untuk meminimalkan jumlah produk cacat.

2 Study Kasus 2

Penerapan Probabilitas dalam Deteksi Penipuan Transaksi:

Sebuah perusahaan e-commerce ingin mendeteksi transaksi yang berpotensi penipuan. Berdasarkan data historis, 1% dari transaksi yang dilakukan adalah penipuan. Perusahaan ingin menggunakan fitur-fitur tertentu seperti lokasi transaksi, jumlah pembelian, dan metode pembayaran untuk memprediksi apakah suatu transaksi adalah penipuan atau tidak.

2.1 Fitur Data

  • Lokasi (L): Negara atau kota tempat transaksi dilakukan.
  • Jumlah Pembelian (A): Jumlah uang yang dibelanjakan.
  • Metode Pembayaran (M): Metode pembayaran yang digunakan (kartu kredit, dompet digital, dll).
  • Penipuan (F): Status transaksi apakah penipuan atau tidak.

2.2 Data Historis (Contoh)

  • Probabilitas transaksi adalah penipuan (๐‘ƒ (๐น = Fraud)) = 1%
  • Probabilitas transaksi bukan penipuan (๐‘ƒ(๐น = Not Fraud)) = 99%
  • Probabilitas lokasi tertentu adalah di luar negeri (๐‘ƒ(๐ฟ = Foreign)) = 20%
  • Probabilitas jumlah pembelian lebih dari 500(P(A = High)$) = 10%
  • Probabilitas menggunakan kartu kredit sebagai metode pembayaran (๐‘ƒ(๐‘€ = Credit Card)) = 50%

Bagaimana probabilitas bahwa suatu transaksi adalah penipuan (๐น = Fraud), jika diketahui transaksi dilakukan dari lokasi luar negeri, jumlah pembelian lebih dari $500, dan metode pembayaran menggunakan kartu kredit?

2.3 Jawaban

2.3.1 Langkah 1: Teorema Bayes

Teorema Bayes menyatakan: \[ P(F = Fraud \mid L = Foreign, A = High, M = Credit\ Card) \\= \frac{P(L = Foreign, A = High, M = Credit\ Card \mid F = Fraud) \cdot P(F = Fraud)}{P(L = Foreign, A = High, M = Credit\ Card)} \]

  • Numerator: Kombinasi probabilitas dari lokasi luar negeri, jumlah pembelian tinggi, dan metode pembayaran kartu kredit jika transaksi adalah penipuan, dikalikan dengan probabilitas awal penipuan.
  • Denominator: Probabilitas gabungan dari lokasi luar negeri, jumlah pembelian tinggi, dan metode pembayaran kartu kredit, terlepas dari apakah itu penipuan atau bukan.

2.3.2 Langkah 2: Hitung \(P(L = Foreign, A = High, M = Credit\ Card \mid F = Fraud)\)

Kita asumsikan bahwa \(L\), \(A\), dan \(M\) independen secara kondisional terhadap \(F\). Dengan asumsi ini, kita dapat menuliskan probabilitas gabungan sebagai: \[ P(L = Foreign, A = High, M = Credit\ Card \mid F = Fraud) \\= P(L = Foreign \mid F = Fraud) \cdot P(A = High \mid F = Fraud) \cdot P(M = Credit\ Card \mid F = Fraud) \]

Misalkan:

  • \(P(L = Foreign \mid F = Fraud) = 0.80\) โ†’ 80% transaksi penipuan berasal dari luar negeri.
  • \(P(A = High \mid F = Fraud) = 0.70\) โ†’ 70% transaksi penipuan memiliki jumlah pembelian lebih dari $500.
  • \(P(M = Credit\ Card \mid F = Fraud) = 0.90\) โ†’ 90% transaksi penipuan menggunakan kartu kredit.

Substitusi nilai: \[ P(L = Foreign, A = High, M = Credit\ Card \mid F = Fraud) = 0.80 \cdot 0.70 \cdot 0.90 = 0.504 \]


2.3.3 Langkah 3: Hitung \(P(L = Foreign, A = High, M = Credit\ Card \mid F = Not\ Fraud)\)

Demikian pula, untuk transaksi yang bukan penipuan (\(F = Not\ Fraud\)): \[ P(L = Foreign, A = High, M = Credit\ Card \mid F = Not\ Fraud) \\= P(L = Foreign \mid F = Not\ Fraud) \cdot P(A = High \mid F = Not\ Fraud) \cdot P(M = Credit\ Card \mid F = Not\ Fraud) \]

Misalkan:

  • \(P(L = Foreign \mid F = Not\ Fraud) = 0.15\) โ†’ 15% transaksi non-penipuan berasal dari luar negeri.
  • \(P(A = High \mid F = Not\ Fraud) = 0.05\) โ†’ 5% transaksi non-penipuan memiliki jumlah pembelian lebih dari $500.
  • \(P(M = Credit\ Card \mid F = Not\ Fraud) = 0.50\) โ†’ 50% transaksi non-penipuan menggunakan kartu kredit.

Substitusi nilai: \[ P(L = Foreign, A = High, M = Credit\ Card \mid F = Not\ Fraud) = 0.15 \cdot 0.05 \cdot 0.50 = 0.00375 \]


2.3.4 Langkah 4: Hitung \(P(L = Foreign, A = High, M = Credit\ Card)\)

Probabilitas gabungan \(P(L = Foreign, A = High, M = Credit\ Card)\) mencakup transaksi yang penipuan (\(F = Fraud\)) dan yang bukan penipuan (\(F = Not\ Fraud\)): \[ P(L = Foreign, A = High, M = Credit\ Card) \\= P(L = Foreign, A = High, M = Credit\ Card \mid F = Fraud) \cdot P(F = Fraud) \\+ P(L = Foreign, A = High, M = Credit\ Card \mid F = Not\ Fraud) \cdot P(F = Not\ Fraud) \]

Substitusi nilai:

  • \(P(F = Fraud) = 0.01\)
  • \(P(F = Not\ Fraud) = 0.99\)

\[ P(L = Foreign, A = High, M = Credit\ Card) = (0.504 \cdot 0.01) + (0.00375 \cdot 0.99) \] \[ P(L = Foreign, A = High, M = Credit\ Card) = 0.00504 + 0.0037125 = 0.0087525 \]


2.3.5 Langkah 5: Hitung Probabilitas Akhir

Substitusi semua nilai ke dalam rumus Teorema Bayes: \[ P(F = Fraud \mid L = Foreign, A = High, M = Credit\ Card) \\= \frac{P(L = Foreign, A = High, M = Credit\ Card \mid F = Fraud) \cdot P(F = Fraud)}{P(L = Foreign, A = High, M = Credit\ Card)} \]

Substitusi nilai: \[ P(F = Fraud \mid L = Foreign, A = High, M = Credit\ Card) = \frac{0.504 \cdot 0.01}{0.0087525} \] \[ P(F = Fraud \mid L = Foreign, A = High, M = Credit\ Card) = \frac{0.00504}{0.0087525} \approx 0.576 \]


2.3.6 Langkah 6: Kesimpulan

Probabilitas bahwa suatu transaksi adalah penipuan, jika diketahui dilakukan dari lokasi luar negeri, jumlah pembelian lebih dari $500, dan metode pembayaran menggunakan kartu kredit, adalah:

\[ P(F = Fraud \mid L = Foreign, A = High, M = Credit\ Card) \approx 57.6\% \]

2.4 Kode

# Input data
P_Fraud <- 0.01  # Probabilitas transaksi adalah penipuan
P_Not_Fraud <- 0.99  # Probabilitas transaksi bukan penipuan

# Kondisional untuk transaksi penipuan
P_L_Foreign_given_Fraud <- 0.80  # Probabilitas lokasi luar negeri jika penipuan
P_A_High_given_Fraud <- 0.70  # Probabilitas jumlah pembelian tinggi jika penipuan
P_M_Credit_given_Fraud <- 0.90  # Probabilitas metode pembayaran kartu kredit jika penipuan

# Kondisional untuk transaksi bukan penipuan
P_L_Foreign_given_Not_Fraud <- 0.15  # Probabilitas lokasi luar negeri jika bukan penipuan
P_A_High_given_Not_Fraud <- 0.05  # Probabilitas jumlah pembelian tinggi jika bukan penipuan
P_M_Credit_given_Not_Fraud <- 0.50  # Probabilitas metode pembayaran kartu kredit jika bukan penipuan

# Hitung P(L = Foreign, A = High, M = Credit | F = Fraud)
P_L_A_M_given_Fraud <- P_L_Foreign_given_Fraud * P_A_High_given_Fraud * P_M_Credit_given_Fraud

# Hitung P(L = Foreign, A = High, M = Credit | F = Not Fraud)
P_L_A_M_given_Not_Fraud <- P_L_Foreign_given_Not_Fraud * P_A_High_given_Not_Fraud * P_M_Credit_given_Not_Fraud

# Hitung P(L = Foreign, A = High, M = Credit)
P_L_A_M <- (P_L_A_M_given_Fraud * P_Fraud) + (P_L_A_M_given_Not_Fraud * P_Not_Fraud)

# Hitung P(Fraud | L = Foreign, A = High, M = Credit) menggunakan Teorema Bayes
P_Fraud_given_L_A_M <- (P_L_A_M_given_Fraud * P_Fraud) / P_L_A_M

# Output hasil
cat("P(Fraud | L = Foreign, A = High, M = Credit):", P_Fraud_given_L_A_M, "\n")
## P(Fraud | L = Foreign, A = High, M = Credit): 0.5758355

2.5 Kesimpulan

Berdasarkan analisis menggunakan Teorema Bayes, probabilitas bahwa transaksi dengan lokasi luar negeri, pembelian lebih dari $500, dan menggunakan kartu kredit adalah penipuan adalah 57.6%. Meskipun hanya 1% dari semua transaksi yang umumnya dianggap penipuan, adanya pola tertentuโ€”seperti transaksi yang dilakukan dari luar negeri, pembelian besar, dan penggunaan kartu kreditโ€”meningkatkan kemungkinan transaksi ini adalah penipuan. Pola ini lebih sering terlihat pada transaksi penipuan dibandingkan transaksi yang sah. Dengan kata lain, meskipun penipuan adalah kejadian langka, bukti-bukti ini cukup kuat untuk meningkatkan keyakinan bahwa transaksi ini kemungkinan besar adalah penipuan.

LS0tDQp0aXRsZTogIlN0dWR5IEthc3VzIFByb2JhYmlsaXRhcyBCZXJzeWFyYXQiDQpzdWJ0aXRsZTogIlN0YXRpc3Rpa2EgRGFzYXIiDQphdXRob3I6ICJJc25haW5pIE51ciBIYXNhbmFoICg1MjI0MDAwNSkiDQpkYXRlOiAgImByIGZvcm1hdChTeXMuRGF0ZSgpLCAnJUIgJWQsICVZJylgIg0Kb3V0cHV0Og0KICAgcm1kZm9ybWF0czo6cmVhZHRoZWRvd246ICAgIyBodHRwczovL2dpdGh1Yi5jb20vanViYS9ybWRmb3JtYXRzDQogICAgc2VsZl9jb250YWluZWQ6IHRydWUNCiAgICB0aHVtYm5haWxzOiB0cnVlDQogICAgbGlnaHRib3g6IHRydWUNCiAgICBnYWxsZXJ5OiB0cnVlDQogICAgbnVtYmVyX3NlY3Rpb25zOiB0cnVlDQogICAgbGliX2RpcjogbGlicw0KICAgIGRmX3ByaW50OiAicGFnZWQiDQogICAgY29kZV9mb2xkaW5nOiAic2hvdyINCiAgICBjb2RlX2Rvd25sb2FkOiB5ZXMNCiAgICBjc3M6ICJzdHlsZSAoMSkuY3NzIg0KLS0tDQoNCjxpbWcgaWQ9IklzbmEiIHNyYz0iQzpcVXNlcnNcQVNVU1xEZXNrdG9wXFN0YXRpc3Rpa2EgRGFzYXJcSXNuYS5wbmciIGFsdD0iTG9nbyIgc3R5bGU9IndpZHRoOjIwMHB4OyBkaXNwbGF5OiBibG9jazsgbWFyZ2luOiBhdXRvOyI+DQoNCiMgU3R1ZGkgS2FzdXMgMQ0KDQpQZW5lcmFwYW4gUHJvYmFiaWxpdGFzIGRhbGFtIFByZWRpa3NpIEt1YWxpdGFzIFByb2R1azoNCg0KU2VidWFoIHBlcnVzYWhhYW4gbWFudWZha3R1ciBtZW1wcm9kdWtzaSBiYXJhbmcgZWxla3Ryb25payBkYW4gaW5naW4gbWVtcHJlZGlrc2kgYXBha2FoIHN1YXR1IHByb2R1ayBha2FuIGNhY2F0IGF0YXUgdGlkYWsuIERhdGEgaGlzdG9yaXMgbWVudW5qdWtrYW4gYmFod2EgNSUgZGFyaSBwcm9kdWsgeWFuZyBkaXByb2R1a3NpIGFkYWxhaCBjYWNhdC4gUGVydXNhaGFhbiBtZW5nZ3VuYWthbiBkYXRhIHRlbnRhbmcgamVuaXMga29tcG9uZW4gZGFuIHByb3NlcyBwcm9kdWtzaSB1bnR1ayBtZW1wcmVkaWtzaSBjYWNhdCBwcm9kdWsgbWVuZ2d1bmFrYW4gdGVrbmlrIHByb2JhYmlsaXRhcy4NCg0KIyMgRml0dXIgRGF0YQ0KDQotIEtvbXBvbmVuIChDKTogQXBha2FoIGtvbXBvbmVuIGVsZWt0cm9uaWsgeWFuZyBkaWd1bmFrYW4gYWRhbGFoIGJlcmt1YWxpdGFzIHRpbmdnaSBhdGF1IHJlbmRhaC4NCi0gUHJvc2VzIFByb2R1a3NpIChQKTogQXBha2FoIHByb3NlcyBwcm9kdWtzaSBkaWxha3VrYW4gZGkgYmF3YWggc3RhbmRhciBhdGF1IHNlc3VhaSBzdGFuZGFyLg0KLSBDYWNhdCAoRCk6IFN0YXR1cyBjYWNhdCBwcm9kdWsgKHlhL3RpZGFrKS4NCg0KIyMgRGF0YSBIaXN0b3JpcyAoQ29udG9oKQ0KDQotIFByb2JhYmlsaXRhcyBwcm9kdWsgY2FjYXQgKPCdkYMgKPCdkLcgPSBZZXMpKSA9IDUlDQotIFByb2JhYmlsaXRhcyBwcm9kdWsgdGlkYWsgY2FjYXQgKPCdkYMo8J2QtyA9IE5vKSkgPSA5NSUNCi0gUHJvYmFiaWxpdGFzIG1lbmdndW5ha2FuIGtvbXBvbmVuIGJlcmt1YWxpdGFzIHJlbmRhaCAo8J2RgyjwnZC2ID0gTG93KSkgPSAzMCUNCi0gUHJvYmFiaWxpdGFzIG1lbmdndW5ha2FuIGtvbXBvbmVuIGJlcmt1YWxpdGFzIHRpbmdnaSAo8J2RgyjwnZC2ID0gSGlnaCkpPSA3MCUNCi0gUHJvYmFiaWxpdGFzIHByb3NlcyBwcm9kdWtzaSBkaSBiYXdhaCBzdGFuZGFyICjwnZGDICjwnZGDID0gQmVsb3cpKSA9IDQwJQ0KLSBQcm9iYWJpbGl0YXMgcHJvc2VzIHByb2R1a3NpIHNlc3VhaSBzdGFuZGFyICjwnZGDKPCdkYMgPSBTdGFuZGFyZCkpID0gNjAlDQoNCkJhZ2FpbWFuYSBwcm9iYWJpbGl0YXMgYmFod2Egc3VhdHUgcHJvZHVrIGFrYW4gY2FjYXQgKPCdkLcgPSBZZXMpLCBqaWthIGRpa2V0YWh1aSBrb21wb25lbiB5YW5nIGRpZ3VuYWthbiBiZXJrdWFsaXRhcyByZW5kYWggZGFuIHByb3NlcyBwcm9kdWtzaSBkaSBiYXdhaCBzdGFuZGFyPw0KDQojIyBKYXdhYmFuDQoNCiMjIyAqKkxhbmdrYWggMTogVGVvcmVtYSBCYXllcyoqDQpUZW9yZW1hIEJheWVzIGRpZ3VuYWthbiB1bnR1ayBtZW5naGl0dW5nIHByb2JhYmlsaXRhcyBiZXJzeWFyYXQ6DQoNCiQkDQpQKEQgPSBZZXMgXG1pZCBDID0gTG93LCBQID0gQmVsb3cpID0gXGZyYWN7UChDID0gTG93LCBQID0gQmVsb3cgXG1pZCBEID0gWWVzKSBcY2RvdCBQKEQgPSBZZXMpfXtQKEMgPSBMb3csIFAgPSBCZWxvdyl9DQokJA0KDQotICoqTnVtZXJhdG9yOioqIFByb2JhYmlsaXRhcyBiYWh3YSBwcm9kdWsgbWVuZ2d1bmFrYW4ga29tcG9uZW4gYmVya3VhbGl0YXMgcmVuZGFoIGRhbiBwcm9zZXMgcHJvZHVrc2kgZGkgYmF3YWggc3RhbmRhciBqaWthIHByb2R1ayBjYWNhdCwgZGlrYWxpa2FuIGRlbmdhbiBwcm9iYWJpbGl0YXMgcHJvZHVrIGNhY2F0Lg0KLSAqKkRlbm9taW5hdG9yOioqIFByb2JhYmlsaXRhcyBnYWJ1bmdhbiBiYWh3YSBwcm9kdWsgbWVuZ2d1bmFrYW4ga29tcG9uZW4gYmVya3VhbGl0YXMgcmVuZGFoIGRhbiBwcm9zZXMgcHJvZHVrc2kgZGkgYmF3YWggc3RhbmRhciwgdGFucGEgbWVtcGVyaGF0aWthbiBzdGF0dXMgY2FjYXQuDQoNCi0tLQ0KDQojIyMgKipMYW5na2FoIDI6IEhpdHVuZyAkUChDID0gTG93LCBQID0gQmVsb3cgXG1pZCBEID0gWWVzKSQgKioNCktpdGEgYXN1bXNpa2FuIGJhaHdhIFwoIEMgXCkgKGtvbXBvbmVuKSBkYW4gXCggUCBcKSAocHJvc2VzIHByb2R1a3NpKSBpbmRlcGVuZGVuIHNlY2FyYSBrb25kaXNpb25hbCB0ZXJoYWRhcCBcKCBEIFwpLiBNYWthLCBwcm9iYWJpbGl0YXMgZ2FidW5nYW4gZGFwYXQgZGloaXR1bmcgc2ViYWdhaToNCiQkDQpQKEMgPSBMb3csIFAgPSBCZWxvdyBcbWlkIEQgPSBZZXMpID0gUChDID0gTG93IFxtaWQgRCA9IFllcykgXGNkb3QgUChQID0gQmVsb3cgXG1pZCBEID0gWWVzKQ0KJCQNCg0KLSAqKkRpYmVyaWthbiBkYWxhbSBzb2FsOioqDQogIC0gJCggUChDID0gTG93IFxtaWQgRCA9IFllcykgPSAwLjcwICkkIOKGkiBQcm9kdWsgY2FjYXQga2VtdW5na2luYW4gYmVzYXIgbWVuZ2d1bmFrYW4ga29tcG9uZW4gYmVya3VhbGl0YXMgcmVuZGFoLg0KICAtICQoIFAoUCA9IEJlbG93IFxtaWQgRCA9IFllcykgPSAwLjgwICkkIOKGkiBQcm9kdWsgY2FjYXQga2VtdW5na2luYW4gYmVzYXIgZGlwcm9kdWtzaSBkaSBiYXdhaCBzdGFuZGFyLg0KDQpTdWJzdGl0dXNpIG5pbGFpOg0KJCQNClAoQyA9IExvdywgUCA9IEJlbG93IFxtaWQgRCA9IFllcykgPSAwLjcwIFxjZG90IDAuODAgPSAwLjU2DQokJA0KDQotLS0NCg0KIyMjICoqTGFuZ2thaCAzOiBIaXR1bmcgXCggUChDID0gTG93LCBQID0gQmVsb3cgXG1pZCBEID0gTm8pIFwpKioNCkRlbWlraWFuIHB1bGEsIHVudHVrIHByb2R1ayB0aWRhayBjYWNhdCAoXCggRCA9IE5vIFwpKSwga2l0YSBoaXR1bmc6DQokJA0KUChDID0gTG93LCBQID0gQmVsb3cgXG1pZCBEID0gTm8pID0gUChDID0gTG93IFxtaWQgRCA9IE5vKSBcY2RvdCBQKFAgPSBCZWxvdyBcbWlkIEQgPSBObykNCiQkDQoNCi0gKipEaWJlcmlrYW4gZGFsYW0gc29hbDoqKg0KICAtIFwoIFAoQyA9IExvdyBcbWlkIEQgPSBObykgPSAwLjI1IFwpIOKGkiBQcm9kdWsgdGlkYWsgY2FjYXQgY2VuZGVydW5nIGxlYmloIGphcmFuZyBtZW5nZ3VuYWthbiBrb21wb25lbiBiZXJrdWFsaXRhcyByZW5kYWguDQogIC0gXCggUChQID0gQmVsb3cgXG1pZCBEID0gTm8pID0gMC4zNSBcKSDihpIgUHJvZHVrIHRpZGFrIGNhY2F0IGxlYmloIGphcmFuZyBkaXByb2R1a3NpIGRpIGJhd2FoIHN0YW5kYXIuDQoNClN1YnN0aXR1c2kgbmlsYWk6DQokJA0KUChDID0gTG93LCBQID0gQmVsb3cgXG1pZCBEID0gTm8pID0gMC4yNSBcY2RvdCAwLjM1ID0gMC4wODc1DQokJA0KDQotLS0NCg0KIyMjICoqTGFuZ2thaCA0OiBIaXR1bmcgXCggUChDID0gTG93LCBQID0gQmVsb3cpIFwpKioNClByb2JhYmlsaXRhcyBnYWJ1bmdhbiBcKCBQKEMgPSBMb3csIFAgPSBCZWxvdykgXCkgbWVuY2FrdXAgc2VtdWEgcHJvZHVrLCBiYWlrIHlhbmcgY2FjYXQgbWF1cHVuIHRpZGFrIGNhY2F0LiBNYWthOg0KJCQNClAoQyA9IExvdywgUCA9IEJlbG93KSBcXD0gUChDID0gTG93LCBQID0gQmVsb3cgXG1pZCBEID0gWWVzKSBcY2RvdCBQKEQgPSBZZXMpICsgUChDID0gTG93LCBQID0gQmVsb3cgXG1pZCBEID0gTm8pIFxjZG90IFAoRCA9IE5vKQ0KJCQNCg0KLSAqKkRpYmVyaWthbiBkYWxhbSBzb2FsOioqDQogIC0gXCggUChEID0gWWVzKSA9IDAuMDUgXCkNCiAgLSBcKCBQKEQgPSBObykgPSAwLjk1IFwpDQoNClN1YnN0aXR1c2kgbmlsYWk6DQokJA0KUChDID0gTG93LCBQID0gQmVsb3cpID0gKDAuNTYgXGNkb3QgMC4wNSkgKyAoMC4wODc1IFxjZG90IDAuOTUpDQokJA0KJCQNClAoQyA9IExvdywgUCA9IEJlbG93KSA9IDAuMDI4ICsgMC4wODMxMjUgPSAwLjExMTEyNQ0KJCQNCg0KLS0tDQoNCiMjIyAqKkxhbmdrYWggNTogSGl0dW5nIFByb2JhYmlsaXRhcyBBa2hpciBcKCBQKEQgPSBZZXMgXG1pZCBDID0gTG93LCBQID0gQmVsb3cpIFwpKioNClN1YnN0aXR1c2kgc2VtdWEgbmlsYWkgeWFuZyBzdWRhaCBkaWhpdHVuZyBrZSBkYWxhbSBydW11cyBUZW9yZW1hIEJheWVzOg0KJCQNClAoRCA9IFllcyBcbWlkIEMgPSBMb3csIFAgPSBCZWxvdykgPSBcZnJhY3tQKEMgPSBMb3csIFAgPSBCZWxvdyBcbWlkIEQgPSBZZXMpIFxjZG90IFAoRCA9IFllcyl9e1AoQyA9IExvdywgUCA9IEJlbG93KX0NCiQkDQoNClN1YnN0aXR1c2kgbmlsYWk6DQokJA0KUChEID0gWWVzIFxtaWQgQyA9IExvdywgUCA9IEJlbG93KSA9IFxmcmFjezAuNTYgXGNkb3QgMC4wNX17MC4xMTExMjV9DQokJA0KJCQNClAoRCA9IFllcyBcbWlkIEMgPSBMb3csIFAgPSBCZWxvdykgPSBcZnJhY3swLjAyOH17MC4xMTExMjV9IFxhcHByb3ggMC4yNTINCiQkDQoNCi0tLQ0KDQojIyMgKipMYW5na2FoIDY6IEtlc2ltcHVsYW4qKg0KUHJvYmFiaWxpdGFzIGJhaHdhIHN1YXR1IHByb2R1ayBha2FuIGNhY2F0LCBqaWthIGRpa2V0YWh1aSBtZW5nZ3VuYWthbiBrb21wb25lbiBiZXJrdWFsaXRhcyByZW5kYWggZGFuIHByb3NlcyBwcm9kdWtzaSBkaSBiYXdhaCBzdGFuZGFyLCBhZGFsYWg6DQokJA0KUChEID0gWWVzIFxtaWQgQyA9IExvdywgUCA9IEJlbG93KSBcYXBwcm94IDI1LjJcJQ0KJCQNCg0KLS0tDQoNCiMjIyAqKlBlbmplbGFzYW4qKg0KMS4gUHJvZHVrIHlhbmcgY2FjYXQgbGViaWggY2VuZGVydW5nIG1lbmdndW5ha2FuIGtvbXBvbmVuIGJlcmt1YWxpdGFzIHJlbmRhaCBkYW4gZGlwcm9kdWtzaSBkaSBiYXdhaCBzdGFuZGFyLiBPbGVoIGthcmVuYSBpdHUsIHByb2JhYmlsaXRhcyBcKCBQKEMgPSBMb3csIFAgPSBCZWxvdyBcbWlkIEQgPSBZZXMpIFwpIGN1a3VwIHRpbmdnaSAoNTYlKS4NCjIuIFNlYmFnaWFuIGJlc2FyIHByb2R1ayB0aWRhayBjYWNhdCAoXCggUChEID0gTm8pID0gOTVcJSBcKSksIHNlaGluZ2dhIGtvbnRyaWJ1c2kgcHJvYmFiaWxpdGFzIFwoIFAoQyA9IExvdywgUCA9IEJlbG93IFwpIHVudHVrIHByb2R1ayB0aWRhayBjYWNhdCBsZWJpaCBkb21pbmFuIGRhbGFtIHRvdGFsIFwoIFAoQyA9IExvdywgUCA9IEJlbG93KSBcKS4NCjMuIE5hbXVuLCBrYXJlbmEga29uZGlzaSB0ZXJ0ZW50dSAoXCggQyA9IExvdywgUCA9IEJlbG93IFwpKSwgcHJvZHVrIGxlYmloIG11bmdraW4gY2FjYXQsIHNlaGluZ2dhIFwoIFAoRCA9IFllcyBcbWlkIEMgPSBMb3csIFAgPSBCZWxvdykgXCkgbWVuamFkaSBsZWJpaCBiZXNhciBkYXJpcGFkYSBwcm9iYWJpbGl0YXMgYXdhbCBcKCBQKEQgPSBZZXMpID0gNVwlLg0KDQojIyBLb2RlDQoNCmBgYHtyIGVjaG89VFJVRSwgbWVzc2FnZT1UUlVFLCB3YXJuaW5nPVRSVUV9DQojIElucHV0IGRhdGENClBfRF95ZXMgPC0gMC4wNSAgIyBQcm9iYWJpbGl0YXMgcHJvZHVrIGNhY2F0DQpQX0Rfbm8gPC0gMC45NSAgICMgUHJvYmFiaWxpdGFzIHByb2R1ayB0aWRhayBjYWNhdA0KUF9DX2xvd19naXZlbl9EX3llcyA8LSAwLjcwICAjIFByb2JhYmlsaXRhcyBrb21wb25lbiBiZXJrdWFsaXRhcyByZW5kYWggamlrYSBjYWNhdA0KUF9DX2xvd19naXZlbl9EX25vIDwtIDAuMjUgICAjIFByb2JhYmlsaXRhcyBrb21wb25lbiBiZXJrdWFsaXRhcyByZW5kYWggamlrYSB0aWRhayBjYWNhdA0KUF9QX2JlbG93X2dpdmVuX0RfeWVzIDwtIDAuODAgICMgUHJvYmFiaWxpdGFzIHByb3NlcyBkaSBiYXdhaCBzdGFuZGFyIGppa2EgY2FjYXQNClBfUF9iZWxvd19naXZlbl9EX25vIDwtIDAuMzUgICAjIFByb2JhYmlsaXRhcyBwcm9zZXMgZGkgYmF3YWggc3RhbmRhciBqaWthIHRpZGFrIGNhY2F0DQoNCiMgSGl0dW5nIFAoQyA9IExvdywgUCA9IEJlbG93IHwgRCA9IFllcykgZGFuIFAoQyA9IExvdywgUCA9IEJlbG93IHwgRCA9IE5vKQ0KUF9DX2xvd19hbmRfUF9iZWxvd19naXZlbl9EX3llcyA8LSBQX0NfbG93X2dpdmVuX0RfeWVzICogUF9QX2JlbG93X2dpdmVuX0RfeWVzDQpQX0NfbG93X2FuZF9QX2JlbG93X2dpdmVuX0Rfbm8gPC0gUF9DX2xvd19naXZlbl9EX25vICogUF9QX2JlbG93X2dpdmVuX0Rfbm8NCg0KIyBIaXR1bmcgUChDID0gTG93LCBQID0gQmVsb3cpDQpQX0NfbG93X2FuZF9QX2JlbG93IDwtIChQX0NfbG93X2FuZF9QX2JlbG93X2dpdmVuX0RfeWVzICogUF9EX3llcykgKw0KICAgICAgICAgICAgICAgICAgICAgICAoUF9DX2xvd19hbmRfUF9iZWxvd19naXZlbl9EX25vICogUF9EX25vKQ0KDQojIEhpdHVuZyBQKEQgPSBZZXMgfCBDID0gTG93LCBQID0gQmVsb3cpIG1lbmdndW5ha2FuIFRlb3JlbWEgQmF5ZXMNClBfRF95ZXNfZ2l2ZW5fQ19sb3dfYW5kX1BfYmVsb3cgPC0gKFBfQ19sb3dfYW5kX1BfYmVsb3dfZ2l2ZW5fRF95ZXMgKiBQX0RfeWVzKSAvIFBfQ19sb3dfYW5kX1BfYmVsb3cNCg0KIyBPdXRwdXQgaGFzaWwNCmNhdCgiUChEID0gWWVzIHwgQyA9IExvdywgUCA9IEJlbG93KToiLCBQX0RfeWVzX2dpdmVuX0NfbG93X2FuZF9QX2JlbG93LCAiXG4iKQ0KYGBgDQoNCiMjIEtlc2ltcHVsYW4NCg0KS2VzaW1wdWxhbjogQmVyZGFzYXJrYW4gcGVyaGl0dW5nYW4gbWVuZ2d1bmFrYW4gVGVvcmVtYSBCYXllcywgcHJvYmFiaWxpdGFzIGJhaHdhIHN1YXR1IHByb2R1ayBha2FuIGNhY2F0LCBqaWthIGRpa2V0YWh1aSBrb21wb25lbiB5YW5nIGRpZ3VuYWthbiBiZXJrdWFsaXRhcyByZW5kYWggZGFuIHByb3NlcyBwcm9kdWtzaSBkaSBiYXdhaCBzdGFuZGFyLCBhZGFsYWggKioyNS4yJSoqLiBNZXNraXB1biBkYXRhIGhpc3RvcmlzIG1lbnVuanVra2FuIGJhaHdhIGhhbnlhIDUlIGRhcmkgcHJvZHVrIHlhbmcgZGlwcm9kdWtzaSBhZGFsYWggY2FjYXQgc2VjYXJhIHVtdW0sIGtvbmRpc2kgdGVydGVudHXigJRzZXBlcnRpIHBlbmdndW5hYW4ga29tcG9uZW4gYmVya3VhbGl0YXMgcmVuZGFoIGRhbiBwcm9zZXMgcHJvZHVrc2kgeWFuZyB0aWRhayBzZXN1YWkgZGVuZ2FuIHN0YW5kYXLigJRzZWNhcmEgc2lnbmlmaWthbiBtZW5pbmdrYXRrYW4ga2VtdW5na2luYW4gdGVyamFkaW55YSBjYWNhdC4gRGFsYW0gaGFsIGluaSwga29tYmluYXNpIGR1YSBmYWt0b3IgaW5pIG1lbmluZ2thdGthbiBwcm9iYWJpbGl0YXMgY2FjYXQgcHJvZHVrIGphdWggbGViaWggdGluZ2dpIGRpYmFuZGluZ2thbiBkZW5nYW4gcHJvYmFiaWxpdGFzIGRhc2FyIHlhbmcgaGFueWEgNSUuIE9sZWgga2FyZW5hIGl0dSwgcGVydXNhaGFhbiBwZXJsdSBsZWJpaCBiZXJoYXRpLWhhdGkgZGFuIG1lbmluZ2thdGthbiBwZW5nYXdhc2FuIHRlcmhhZGFwIGtvbXBvbmVuIHlhbmcgZGlndW5ha2FuIHNlcnRhIGt1YWxpdGFzIHByb3NlcyBwcm9kdWtzaSB1bnR1ayBtZW1pbmltYWxrYW4ganVtbGFoIHByb2R1ayBjYWNhdC4NCg0KIyBTdHVkeSBLYXN1cyAyDQoNClBlbmVyYXBhbiBQcm9iYWJpbGl0YXMgZGFsYW0gRGV0ZWtzaSBQZW5pcHVhbiBUcmFuc2Frc2k6DQoNClNlYnVhaCBwZXJ1c2FoYWFuIGUtY29tbWVyY2UgaW5naW4gbWVuZGV0ZWtzaSB0cmFuc2Frc2kgeWFuZyBiZXJwb3RlbnNpIHBlbmlwdWFuLiBCZXJkYXNhcmthbiBkYXRhIGhpc3RvcmlzLCAxJSBkYXJpIHRyYW5zYWtzaSB5YW5nIGRpbGFrdWthbiBhZGFsYWggcGVuaXB1YW4uIFBlcnVzYWhhYW4gaW5naW4gbWVuZ2d1bmFrYW4gZml0dXItZml0dXIgdGVydGVudHUgc2VwZXJ0aSBsb2thc2kgdHJhbnNha3NpLCBqdW1sYWggcGVtYmVsaWFuLCBkYW4gbWV0b2RlIHBlbWJheWFyYW4gdW50dWsgbWVtcHJlZGlrc2kgYXBha2FoIHN1YXR1IHRyYW5zYWtzaSBhZGFsYWggcGVuaXB1YW4gYXRhdSB0aWRhay4NCg0KIyMgRml0dXIgRGF0YQ0KDQotIExva2FzaSAoTCk6IE5lZ2FyYSBhdGF1IGtvdGEgdGVtcGF0IHRyYW5zYWtzaSBkaWxha3VrYW4uDQotIEp1bWxhaCBQZW1iZWxpYW4gKEEpOiBKdW1sYWggdWFuZyB5YW5nIGRpYmVsYW5qYWthbi4NCi0gTWV0b2RlIFBlbWJheWFyYW4gKE0pOiBNZXRvZGUgcGVtYmF5YXJhbiB5YW5nIGRpZ3VuYWthbiAoa2FydHUga3JlZGl0LCBkb21wZXQgZGlnaXRhbCwgZGxsKS4NCi0gUGVuaXB1YW4gKEYpOiBTdGF0dXMgdHJhbnNha3NpIGFwYWthaCBwZW5pcHVhbiBhdGF1IHRpZGFrLg0KDQojIyBEYXRhIEhpc3RvcmlzIChDb250b2gpDQoNCi0gUHJvYmFiaWxpdGFzIHRyYW5zYWtzaSBhZGFsYWggcGVuaXB1YW4gKPCdkYMgKPCdkLkgPSBGcmF1ZCkpID0gMSUNCi0gUHJvYmFiaWxpdGFzIHRyYW5zYWtzaSBidWthbiBwZW5pcHVhbiAo8J2RgyjwnZC5ID0gTm90IEZyYXVkKSkgPSA5OSUNCi0gUHJvYmFiaWxpdGFzIGxva2FzaSB0ZXJ0ZW50dSBhZGFsYWggZGkgbHVhciBuZWdlcmkgKPCdkYMo8J2QvyA9IEZvcmVpZ24pKSA9IDIwJQ0KLSBQcm9iYWJpbGl0YXMganVtbGFoIHBlbWJlbGlhbiBsZWJpaCBkYXJpIDUwMChQKEEgPSBIaWdoKSQpID0gMTAlDQotIFByb2JhYmlsaXRhcyBtZW5nZ3VuYWthbiBrYXJ0dSBrcmVkaXQgc2ViYWdhaSBtZXRvZGUgcGVtYmF5YXJhbiAo8J2RgyjwnZGAID0gQ3JlZGl0IENhcmQpKSA9IDUwJQ0KDQpCYWdhaW1hbmEgcHJvYmFiaWxpdGFzIGJhaHdhIHN1YXR1IHRyYW5zYWtzaSBhZGFsYWggcGVuaXB1YW4gKPCdkLkgPSBGcmF1ZCksIGppa2EgZGlrZXRhaHVpIHRyYW5zYWtzaSBkaWxha3VrYW4gZGFyaSBsb2thc2kgbHVhciBuZWdlcmksIGp1bWxhaCBwZW1iZWxpYW4gbGViaWggZGFyaSAkNTAwLCBkYW4gbWV0b2RlIHBlbWJheWFyYW4gbWVuZ2d1bmFrYW4ga2FydHUga3JlZGl0Pw0KDQojIyBKYXdhYmFuDQojIyMgKipMYW5na2FoIDE6IFRlb3JlbWEgQmF5ZXMqKg0KVGVvcmVtYSBCYXllcyBtZW55YXRha2FuOg0KJCQNClAoRiA9IEZyYXVkIFxtaWQgTCA9IEZvcmVpZ24sIEEgPSBIaWdoLCBNID0gQ3JlZGl0XCBDYXJkKSBcXD0gXGZyYWN7UChMID0gRm9yZWlnbiwgQSA9IEhpZ2gsIE0gPSBDcmVkaXRcIENhcmQgXG1pZCBGID0gRnJhdWQpIFxjZG90IFAoRiA9IEZyYXVkKX17UChMID0gRm9yZWlnbiwgQSA9IEhpZ2gsIE0gPSBDcmVkaXRcIENhcmQpfQ0KJCQNCg0KLSAqKk51bWVyYXRvcjoqKiBLb21iaW5hc2kgcHJvYmFiaWxpdGFzIGRhcmkgbG9rYXNpIGx1YXIgbmVnZXJpLCBqdW1sYWggcGVtYmVsaWFuIHRpbmdnaSwgZGFuIG1ldG9kZSBwZW1iYXlhcmFuIGthcnR1IGtyZWRpdCBqaWthIHRyYW5zYWtzaSBhZGFsYWggcGVuaXB1YW4sIGRpa2FsaWthbiBkZW5nYW4gcHJvYmFiaWxpdGFzIGF3YWwgcGVuaXB1YW4uDQotICoqRGVub21pbmF0b3I6KiogUHJvYmFiaWxpdGFzIGdhYnVuZ2FuIGRhcmkgbG9rYXNpIGx1YXIgbmVnZXJpLCBqdW1sYWggcGVtYmVsaWFuIHRpbmdnaSwgZGFuIG1ldG9kZSBwZW1iYXlhcmFuIGthcnR1IGtyZWRpdCwgdGVybGVwYXMgZGFyaSBhcGFrYWggaXR1IHBlbmlwdWFuIGF0YXUgYnVrYW4uDQoNCi0tLQ0KDQojIyMgKipMYW5na2FoIDI6IEhpdHVuZyBcKCBQKEwgPSBGb3JlaWduLCBBID0gSGlnaCwgTSA9IENyZWRpdFwgQ2FyZCBcbWlkIEYgPSBGcmF1ZCkgXCkqKg0KS2l0YSBhc3Vtc2lrYW4gYmFod2EgXCggTCBcKSwgXCggQSBcKSwgZGFuIFwoIE0gXCkgaW5kZXBlbmRlbiBzZWNhcmEga29uZGlzaW9uYWwgdGVyaGFkYXAgXCggRiBcKS4gRGVuZ2FuIGFzdW1zaSBpbmksIGtpdGEgZGFwYXQgbWVudWxpc2thbiBwcm9iYWJpbGl0YXMgZ2FidW5nYW4gc2ViYWdhaToNCiQkDQpQKEwgPSBGb3JlaWduLCBBID0gSGlnaCwgTSA9IENyZWRpdFwgQ2FyZCBcbWlkIEYgPSBGcmF1ZCkgXFw9IFAoTCA9IEZvcmVpZ24gXG1pZCBGID0gRnJhdWQpIFxjZG90IFAoQSA9IEhpZ2ggXG1pZCBGID0gRnJhdWQpIFxjZG90IFAoTSA9IENyZWRpdFwgQ2FyZCBcbWlkIEYgPSBGcmF1ZCkNCiQkDQoNCk1pc2Fsa2FuOg0KDQotIFwoIFAoTCA9IEZvcmVpZ24gXG1pZCBGID0gRnJhdWQpID0gMC44MCBcKSDihpIgODAlIHRyYW5zYWtzaSBwZW5pcHVhbiBiZXJhc2FsIGRhcmkgbHVhciBuZWdlcmkuDQotIFwoIFAoQSA9IEhpZ2ggXG1pZCBGID0gRnJhdWQpID0gMC43MCBcKSDihpIgNzAlIHRyYW5zYWtzaSBwZW5pcHVhbiBtZW1pbGlraSBqdW1sYWggcGVtYmVsaWFuIGxlYmloIGRhcmkgJDUwMC4NCi0gXCggUChNID0gQ3JlZGl0XCBDYXJkIFxtaWQgRiA9IEZyYXVkKSA9IDAuOTAgXCkg4oaSIDkwJSB0cmFuc2Frc2kgcGVuaXB1YW4gbWVuZ2d1bmFrYW4ga2FydHUga3JlZGl0Lg0KDQpTdWJzdGl0dXNpIG5pbGFpOg0KJCQNClAoTCA9IEZvcmVpZ24sIEEgPSBIaWdoLCBNID0gQ3JlZGl0XCBDYXJkIFxtaWQgRiA9IEZyYXVkKSA9IDAuODAgXGNkb3QgMC43MCBcY2RvdCAwLjkwID0gMC41MDQNCiQkDQoNCi0tLQ0KDQojIyMgKipMYW5na2FoIDM6IEhpdHVuZyBcKCBQKEwgPSBGb3JlaWduLCBBID0gSGlnaCwgTSA9IENyZWRpdFwgQ2FyZCBcbWlkIEYgPSBOb3RcIEZyYXVkKSBcKSoqDQpEZW1pa2lhbiBwdWxhLCB1bnR1ayB0cmFuc2Frc2kgeWFuZyBidWthbiBwZW5pcHVhbiAoXCggRiA9IE5vdFwgRnJhdWQgXCkpOg0KJCQNClAoTCA9IEZvcmVpZ24sIEEgPSBIaWdoLCBNID0gQ3JlZGl0XCBDYXJkIFxtaWQgRiA9IE5vdFwgRnJhdWQpIFxcPSBQKEwgPSBGb3JlaWduIFxtaWQgRiA9IE5vdFwgRnJhdWQpIFxjZG90IFAoQSA9IEhpZ2ggXG1pZCBGID0gTm90XCBGcmF1ZCkgXGNkb3QgUChNID0gQ3JlZGl0XCBDYXJkIFxtaWQgRiA9IE5vdFwgRnJhdWQpDQokJA0KDQpNaXNhbGthbjoNCg0KLSBcKCBQKEwgPSBGb3JlaWduIFxtaWQgRiA9IE5vdFwgRnJhdWQpID0gMC4xNSBcKSDihpIgMTUlIHRyYW5zYWtzaSBub24tcGVuaXB1YW4gYmVyYXNhbCBkYXJpIGx1YXIgbmVnZXJpLg0KLSBcKCBQKEEgPSBIaWdoIFxtaWQgRiA9IE5vdFwgRnJhdWQpID0gMC4wNSBcKSDihpIgNSUgdHJhbnNha3NpIG5vbi1wZW5pcHVhbiBtZW1pbGlraSBqdW1sYWggcGVtYmVsaWFuIGxlYmloIGRhcmkgJDUwMC4NCi0gXCggUChNID0gQ3JlZGl0XCBDYXJkIFxtaWQgRiA9IE5vdFwgRnJhdWQpID0gMC41MCBcKSDihpIgNTAlIHRyYW5zYWtzaSBub24tcGVuaXB1YW4gbWVuZ2d1bmFrYW4ga2FydHUga3JlZGl0Lg0KDQpTdWJzdGl0dXNpIG5pbGFpOg0KJCQNClAoTCA9IEZvcmVpZ24sIEEgPSBIaWdoLCBNID0gQ3JlZGl0XCBDYXJkIFxtaWQgRiA9IE5vdFwgRnJhdWQpID0gMC4xNSBcY2RvdCAwLjA1IFxjZG90IDAuNTAgPSAwLjAwMzc1DQokJA0KDQotLS0NCg0KIyMjICoqTGFuZ2thaCA0OiBIaXR1bmcgXCggUChMID0gRm9yZWlnbiwgQSA9IEhpZ2gsIE0gPSBDcmVkaXRcIENhcmQpIFwpKioNClByb2JhYmlsaXRhcyBnYWJ1bmdhbiBcKCBQKEwgPSBGb3JlaWduLCBBID0gSGlnaCwgTSA9IENyZWRpdFwgQ2FyZCkgXCkgbWVuY2FrdXAgdHJhbnNha3NpIHlhbmcgcGVuaXB1YW4gKFwoIEYgPSBGcmF1ZCBcKSkgZGFuIHlhbmcgYnVrYW4gcGVuaXB1YW4gKFwoIEYgPSBOb3RcIEZyYXVkIFwpKToNCiQkDQpQKEwgPSBGb3JlaWduLCBBID0gSGlnaCwgTSA9IENyZWRpdFwgQ2FyZCkgXFw9IFAoTCA9IEZvcmVpZ24sIEEgPSBIaWdoLCBNID0gQ3JlZGl0XCBDYXJkIFxtaWQgRiA9IEZyYXVkKSBcY2RvdCBQKEYgPSBGcmF1ZCkgXFwrIFAoTCA9IEZvcmVpZ24sIEEgPSBIaWdoLCBNID0gQ3JlZGl0XCBDYXJkIFxtaWQgRiA9IE5vdFwgRnJhdWQpIFxjZG90IFAoRiA9IE5vdFwgRnJhdWQpDQokJA0KDQpTdWJzdGl0dXNpIG5pbGFpOg0KDQotIFwoIFAoRiA9IEZyYXVkKSA9IDAuMDEgXCkNCi0gXCggUChGID0gTm90XCBGcmF1ZCkgPSAwLjk5IFwpDQoNCiQkDQpQKEwgPSBGb3JlaWduLCBBID0gSGlnaCwgTSA9IENyZWRpdFwgQ2FyZCkgPSAoMC41MDQgXGNkb3QgMC4wMSkgKyAoMC4wMDM3NSBcY2RvdCAwLjk5KQ0KJCQNCiQkDQpQKEwgPSBGb3JlaWduLCBBID0gSGlnaCwgTSA9IENyZWRpdFwgQ2FyZCkgPSAwLjAwNTA0ICsgMC4wMDM3MTI1ID0gMC4wMDg3NTI1DQokJA0KDQotLS0NCg0KIyMjICoqTGFuZ2thaCA1OiBIaXR1bmcgUHJvYmFiaWxpdGFzIEFraGlyKioNClN1YnN0aXR1c2kgc2VtdWEgbmlsYWkga2UgZGFsYW0gcnVtdXMgVGVvcmVtYSBCYXllczoNCiQkDQpQKEYgPSBGcmF1ZCBcbWlkIEwgPSBGb3JlaWduLCBBID0gSGlnaCwgTSA9IENyZWRpdFwgQ2FyZCkgXFw9IFxmcmFje1AoTCA9IEZvcmVpZ24sIEEgPSBIaWdoLCBNID0gQ3JlZGl0XCBDYXJkIFxtaWQgRiA9IEZyYXVkKSBcY2RvdCBQKEYgPSBGcmF1ZCl9e1AoTCA9IEZvcmVpZ24sIEEgPSBIaWdoLCBNID0gQ3JlZGl0XCBDYXJkKX0NCiQkDQoNClN1YnN0aXR1c2kgbmlsYWk6DQokJA0KUChGID0gRnJhdWQgXG1pZCBMID0gRm9yZWlnbiwgQSA9IEhpZ2gsIE0gPSBDcmVkaXRcIENhcmQpID0gXGZyYWN7MC41MDQgXGNkb3QgMC4wMX17MC4wMDg3NTI1fQ0KJCQNCiQkDQpQKEYgPSBGcmF1ZCBcbWlkIEwgPSBGb3JlaWduLCBBID0gSGlnaCwgTSA9IENyZWRpdFwgQ2FyZCkgPSBcZnJhY3swLjAwNTA0fXswLjAwODc1MjV9IFxhcHByb3ggMC41NzYNCiQkDQoNCi0tLQ0KDQojIyMgKipMYW5na2FoIDY6IEtlc2ltcHVsYW4qKg0KUHJvYmFiaWxpdGFzIGJhaHdhIHN1YXR1IHRyYW5zYWtzaSBhZGFsYWggcGVuaXB1YW4sIGppa2EgZGlrZXRhaHVpIGRpbGFrdWthbiBkYXJpIGxva2FzaSBsdWFyIG5lZ2VyaSwganVtbGFoIHBlbWJlbGlhbiBsZWJpaCBkYXJpICQ1MDAsIGRhbiBtZXRvZGUgcGVtYmF5YXJhbiBtZW5nZ3VuYWthbiBrYXJ0dSBrcmVkaXQsIGFkYWxhaDoNCg0KJCQNClAoRiA9IEZyYXVkIFxtaWQgTCA9IEZvcmVpZ24sIEEgPSBIaWdoLCBNID0gQ3JlZGl0XCBDYXJkKSBcYXBwcm94IDU3LjZcJQ0KJCQNCg0KIyMgS29kZQ0KDQpgYGB7ciBlY2hvPVRSVUUsIG1lc3NhZ2U9VFJVRSwgd2FybmluZz1UUlVFfQ0KIyBJbnB1dCBkYXRhDQpQX0ZyYXVkIDwtIDAuMDEgICMgUHJvYmFiaWxpdGFzIHRyYW5zYWtzaSBhZGFsYWggcGVuaXB1YW4NClBfTm90X0ZyYXVkIDwtIDAuOTkgICMgUHJvYmFiaWxpdGFzIHRyYW5zYWtzaSBidWthbiBwZW5pcHVhbg0KDQojIEtvbmRpc2lvbmFsIHVudHVrIHRyYW5zYWtzaSBwZW5pcHVhbg0KUF9MX0ZvcmVpZ25fZ2l2ZW5fRnJhdWQgPC0gMC44MCAgIyBQcm9iYWJpbGl0YXMgbG9rYXNpIGx1YXIgbmVnZXJpIGppa2EgcGVuaXB1YW4NClBfQV9IaWdoX2dpdmVuX0ZyYXVkIDwtIDAuNzAgICMgUHJvYmFiaWxpdGFzIGp1bWxhaCBwZW1iZWxpYW4gdGluZ2dpIGppa2EgcGVuaXB1YW4NClBfTV9DcmVkaXRfZ2l2ZW5fRnJhdWQgPC0gMC45MCAgIyBQcm9iYWJpbGl0YXMgbWV0b2RlIHBlbWJheWFyYW4ga2FydHUga3JlZGl0IGppa2EgcGVuaXB1YW4NCg0KIyBLb25kaXNpb25hbCB1bnR1ayB0cmFuc2Frc2kgYnVrYW4gcGVuaXB1YW4NClBfTF9Gb3JlaWduX2dpdmVuX05vdF9GcmF1ZCA8LSAwLjE1ICAjIFByb2JhYmlsaXRhcyBsb2thc2kgbHVhciBuZWdlcmkgamlrYSBidWthbiBwZW5pcHVhbg0KUF9BX0hpZ2hfZ2l2ZW5fTm90X0ZyYXVkIDwtIDAuMDUgICMgUHJvYmFiaWxpdGFzIGp1bWxhaCBwZW1iZWxpYW4gdGluZ2dpIGppa2EgYnVrYW4gcGVuaXB1YW4NClBfTV9DcmVkaXRfZ2l2ZW5fTm90X0ZyYXVkIDwtIDAuNTAgICMgUHJvYmFiaWxpdGFzIG1ldG9kZSBwZW1iYXlhcmFuIGthcnR1IGtyZWRpdCBqaWthIGJ1a2FuIHBlbmlwdWFuDQoNCiMgSGl0dW5nIFAoTCA9IEZvcmVpZ24sIEEgPSBIaWdoLCBNID0gQ3JlZGl0IHwgRiA9IEZyYXVkKQ0KUF9MX0FfTV9naXZlbl9GcmF1ZCA8LSBQX0xfRm9yZWlnbl9naXZlbl9GcmF1ZCAqIFBfQV9IaWdoX2dpdmVuX0ZyYXVkICogUF9NX0NyZWRpdF9naXZlbl9GcmF1ZA0KDQojIEhpdHVuZyBQKEwgPSBGb3JlaWduLCBBID0gSGlnaCwgTSA9IENyZWRpdCB8IEYgPSBOb3QgRnJhdWQpDQpQX0xfQV9NX2dpdmVuX05vdF9GcmF1ZCA8LSBQX0xfRm9yZWlnbl9naXZlbl9Ob3RfRnJhdWQgKiBQX0FfSGlnaF9naXZlbl9Ob3RfRnJhdWQgKiBQX01fQ3JlZGl0X2dpdmVuX05vdF9GcmF1ZA0KDQojIEhpdHVuZyBQKEwgPSBGb3JlaWduLCBBID0gSGlnaCwgTSA9IENyZWRpdCkNClBfTF9BX00gPC0gKFBfTF9BX01fZ2l2ZW5fRnJhdWQgKiBQX0ZyYXVkKSArIChQX0xfQV9NX2dpdmVuX05vdF9GcmF1ZCAqIFBfTm90X0ZyYXVkKQ0KDQojIEhpdHVuZyBQKEZyYXVkIHwgTCA9IEZvcmVpZ24sIEEgPSBIaWdoLCBNID0gQ3JlZGl0KSBtZW5nZ3VuYWthbiBUZW9yZW1hIEJheWVzDQpQX0ZyYXVkX2dpdmVuX0xfQV9NIDwtIChQX0xfQV9NX2dpdmVuX0ZyYXVkICogUF9GcmF1ZCkgLyBQX0xfQV9NDQoNCiMgT3V0cHV0IGhhc2lsDQpjYXQoIlAoRnJhdWQgfCBMID0gRm9yZWlnbiwgQSA9IEhpZ2gsIE0gPSBDcmVkaXQpOiIsIFBfRnJhdWRfZ2l2ZW5fTF9BX00sICJcbiIpDQpgYGANCg0KIyMgS2VzaW1wdWxhbg0KDQpCZXJkYXNhcmthbiBhbmFsaXNpcyBtZW5nZ3VuYWthbiBUZW9yZW1hIEJheWVzLCBwcm9iYWJpbGl0YXMgYmFod2EgdHJhbnNha3NpIGRlbmdhbiBsb2thc2kgbHVhciBuZWdlcmksIHBlbWJlbGlhbiBsZWJpaCBkYXJpICQ1MDAsIGRhbiBtZW5nZ3VuYWthbiBrYXJ0dSBrcmVkaXQgYWRhbGFoIHBlbmlwdWFuIGFkYWxhaCAqKjU3LjYlKiouIE1lc2tpcHVuIGhhbnlhIDElIGRhcmkgc2VtdWEgdHJhbnNha3NpIHlhbmcgdW11bW55YSBkaWFuZ2dhcCBwZW5pcHVhbiwgYWRhbnlhIHBvbGEgdGVydGVudHXigJRzZXBlcnRpIHRyYW5zYWtzaSB5YW5nIGRpbGFrdWthbiBkYXJpIGx1YXIgbmVnZXJpLCBwZW1iZWxpYW4gYmVzYXIsIGRhbiBwZW5nZ3VuYWFuIGthcnR1IGtyZWRpdOKAlG1lbmluZ2thdGthbiBrZW11bmdraW5hbiB0cmFuc2Frc2kgaW5pIGFkYWxhaCBwZW5pcHVhbi4gUG9sYSBpbmkgbGViaWggc2VyaW5nIHRlcmxpaGF0IHBhZGEgdHJhbnNha3NpIHBlbmlwdWFuIGRpYmFuZGluZ2thbiB0cmFuc2Frc2kgeWFuZyBzYWguIERlbmdhbiBrYXRhIGxhaW4sIG1lc2tpcHVuIHBlbmlwdWFuIGFkYWxhaCBrZWphZGlhbiBsYW5na2EsIGJ1a3RpLWJ1a3RpIGluaSBjdWt1cCBrdWF0IHVudHVrIG1lbmluZ2thdGthbiBrZXlha2luYW4gYmFod2EgdHJhbnNha3NpIGluaSBrZW11bmdraW5hbiBiZXNhciBhZGFsYWggcGVuaXB1YW4u