Tuberkulosis (TB) masih menjadi salah satu masalah kesehatan
masyarakat di Provinsi Jawa Barat dengan jumlah kasus yang relatif
tinggi. Penelitian ini bertujuan menganalisis faktor-faktor yang
memengaruhi Incidence Rate (IR) TB tahun 2025 menggunakan pendekatan
spasial Spatial Lag of X (SLX). Data yang digunakan mencakup 27
kabupaten/kota di Jawa Barat dengan variabel jumlah fasilitas kesehatan,
persentase penduduk miskin, kepadatan penduduk, akses air minum layak,
akses sanitasi layak, dan jumlah kasus HIV. Analisis dilakukan melalui
statistik deskriptif, pemetaan spasial, uji autokorelasi spasial Moran’s
I, regresi OLS, dan model SLX. Hasil menunjukkan bahwa model SLX
memberikan kinerja yang lebih baik dibandingkan model OLS dengan nilai
R² sebesar 0,6913 dan RMSE sebesar 123,49. Temuan ini mengindikasikan
bahwa faktor-faktor yang memengaruhi kejadian TB tidak hanya berasal
dari karakteristik wilayah itu sendiri, tetapi juga dipengaruhi oleh
kondisi wilayah sekitarnya. Oleh karena itu, pendekatan spasial perlu
dipertimbangkan dalam perencanaan program pengendalian TB di Jawa
Barat.
3. Hasil dan Pembahasan
3.1 Analisis Deskriptif dan Peta IR
Tabel 2. Statistik Deskriptif
vars <- jabar_tb %>%
st_drop_geometry() %>%
dplyr::select(
TB,
incidence_rate_TB,
faskes,
penduduk_miskin,
kepadatan,
air_minum,
sanitasi,
hiv
) %>%
mutate(across(everything(), as.numeric))
desc_table <- data.frame(
Variabel = c(
"TB",
"Incidence Rate TB",
"Faskes",
"Penduduk Miskin",
"Kepadatan",
"Air Minum Layak",
"Sanitasi Layak",
"HIV"
),
Mean = sapply(vars, mean, na.rm = TRUE),
SD = sapply(vars, sd, na.rm = TRUE),
Varians = sapply(vars, var, na.rm = TRUE),
Min = sapply(vars, min, na.rm = TRUE),
Max = sapply(vars, max, na.rm = TRUE)
)
knitr::kable( desc_table, digits = 4)
| TB |
TB |
8347.7407 |
6046.3174 |
3.655795e+07 |
1024.0000 |
28134.000 |
| incidence_rate_TB |
Incidence Rate TB |
486.7945 |
226.4968 |
5.130079e+04 |
230.8394 |
1077.861 |
| faskes |
Faskes |
2185.3704 |
1387.9867 |
1.926507e+06 |
241.0000 |
5588.000 |
| penduduk_miskin |
Penduduk Miskin |
7.5956 |
2.4999 |
6.249300e+00 |
2.3100 |
11.020 |
| kepadatan |
Kepadatan |
3941.3333 |
4701.5895 |
2.210494e+07 |
387.0000 |
15300.000 |
| air_minum |
Air Minum Layak |
95.7793 |
4.5879 |
2.104910e+01 |
84.7900 |
100.000 |
| sanitasi |
Sanitasi Layak |
9.2563 |
6.5311 |
4.265500e+01 |
1.8700 |
22.830 |
| hiv |
HIV |
94.1852 |
100.4253 |
1.008523e+04 |
7.0000 |
389.000 |
Berdasarkan hasil statistik deskriptif, terlihat bahwa jumlah kasus
Tuberkulosis (TB) di Jawa Barat memiliki nilai rata-rata sebesar
8.347,74 kasus dengan variasi yang cukup tinggi antar wilayah, yang
ditunjukkan oleh standar deviasi sebesar 6.046,32. Sementara itu,
incidence rate TB memiliki rata-rata 486,79 per 100.000 penduduk dengan
rentang nilai yang cukup lebar, menunjukkan adanya ketimpangan beban
penyakit antar kabupaten/kota.
Untuk variabel independen, kondisi sosial ekonomi dan kesehatan juga
menunjukkan variasi antar wilayah. Variabel kepadatan penduduk memiliki
sebaran yang paling tinggi dibanding variabel lain, sedangkan variabel
seperti akses air minum layak relatif lebih homogen dengan nilai yang
mendekati 100% di sebagian besar wilayah. Secara umum, hasil ini
menunjukkan adanya heterogenitas kondisi antar wilayah di Jawa Barat,
yang mengindikasikan potensi adanya perbedaan risiko Tuberkulosis antar
daerah.
tm_shape(jabar_tb) +
tm_polygons(
"incidence_rate_TB",
palette = "Reds",
title = "Incidence Rate TB"
) +
tm_text(
text = "WADMKK",
size = 0.5
) +
tm_layout(
legend.outside = TRUE
)

Gambar 1. Visualisasi Peta Incidance Rate TB
Sebagian besar wilayah di Jawa Barat berada pada kategori incidence
rate (IR) rendah hingga sedang (200–599 per 100.000 penduduk) yang
tersebar di berbagai wilayah barat, selatan, dan timur. Sementara itu,
wilayah dengan IR tinggi hingga sangat tinggi (>600 per 100.000
penduduk) cenderung membentuk pola terlokalisasi pada beberapa wilayah
perkotaan yang padat penduduk. Hal ini menunjukkan adanya konsentrasi
kasus TB pada wilayah dengan karakteristik urban dan kepadatan
tinggi.
3.2 Uji Autokorelasi Spasial
Tabel 3. Hasil Uji Autokorelasi Spasial
var_list <- c( "incidence_rate_TB", "faskes", "penduduk_miskin", "kepadatan", "air_minum", "sanitasi", "hiv" )
nama_variabel <- c( "Incidence Rate (TB)", "Faskes", "Penduduk Miskin", "Kepadatan Penduduk", "Air Minum Layak", "Sanitasi Layak", "HIV" )
moran_summary <- data.frame( Variabel = nama_variabel, Moran_I = NA, Expectation = NA, Variance = NA, Z_score = NA, p_value = NA )
for(i in seq_along(var_list)) { x <- scale(jabar_tb[[var_list[i]]])[,1]
moran_result <- moran.test( x, lw, zero.policy = TRUE )
moran_summary$Moran_I[i] <- moran_result$estimate[1]
moran_summary$Expectation[i] <- moran_result$estimate[2]
moran_summary$Variance[i] <- moran_result$estimate[3]
moran_summary$Z_score[i] <- unname(moran_result$statistic)
moran_summary$p_value[i] <- moran_result$p.value}
knitr::kable( moran_summary, digits = 4)
| Incidence Rate (TB) |
0.0500 |
-0.0385 |
0.0187 |
0.6473 |
0.2587 |
| Faskes |
-0.0392 |
-0.0385 |
0.0194 |
-0.0050 |
0.5020 |
| Penduduk Miskin |
0.5076 |
-0.0385 |
0.0201 |
3.8553 |
0.0001 |
| Kepadatan Penduduk |
0.2580 |
-0.0385 |
0.0191 |
2.1437 |
0.0160 |
| Air Minum Layak |
0.2847 |
-0.0385 |
0.0194 |
2.3232 |
0.0101 |
| Sanitasi Layak |
0.3514 |
-0.0385 |
0.0200 |
2.7573 |
0.0029 |
| HIV |
0.2562 |
-0.0385 |
0.0174 |
2.2316 |
0.0128 |
Berdasarkan hasil uji Moran’s I pada masing-masing variabel,
ditemukan bahwa sebagian besar variabel independen menunjukkan adanya
autokorelasi spasial yang signifikan. Variabel penduduk miskin,
kepadatan penduduk, akses air minum layak, sanitasi layak, dan jumlah
kasus HIV memiliki nilai Moran’s I positif dan signifikan (p < 0,05),
yang menunjukkan adanya pola pengelompokan spasial (clustered) antar
wilayah di Jawa Barat. Sebaliknya, variabel incidence rate Tuberkulosis
dan jumlah fasilitas kesehatan (faskes) tidak menunjukkan autokorelasi
spasial yang signifikan (p > 0,05), sehingga distribusinya cenderung
acak secara spasial dan tidak membentuk pola pengelompokan yang jelas
antar wilayah.
3.3 Model OLS
Hasil estimasi parameter menggunakan metode Ordinary Least Squares
(OLS) disajikan pada Tabel 5 berikut:
Tabel 4. Hasil Estimasi Model OLS
ols_model <- lm(
incidence_rate_TB ~
faskes +
penduduk_miskin +
kepadatan +
air_minum +
sanitasi +
hiv,
data = jabar_tb
)
ols_coef <- summary(ols_model)$coefficients
ols_table <- data.frame(
Variabel = rownames(ols_coef),
Koefisien = ols_coef[, 1],
Std_Error = ols_coef[, 2],
t_value = ols_coef[, 3],
p_value = ols_coef[, 4]
)
knitr::kable(
ols_table,
digits = 4)
| (Intercept) |
(Intercept) |
-177.6495 |
957.9636 |
-0.1854 |
0.8547 |
| faskes |
faskes |
-0.0603 |
0.0431 |
-1.4002 |
0.1768 |
| penduduk_miskin |
penduduk_miskin |
14.6376 |
20.6729 |
0.7081 |
0.4871 |
| kepadatan |
kepadatan |
0.0211 |
0.0145 |
1.4580 |
0.1604 |
| air_minum |
air_minum |
5.4803 |
9.8547 |
0.5561 |
0.5843 |
| sanitasi |
sanitasi |
1.9850 |
8.4556 |
0.2348 |
0.8168 |
| hiv |
hiv |
0.6230 |
0.5724 |
1.0883 |
0.2894 |
Berdasarkan hasil OLS, variabel independen secara simultan
berpengaruh signifikan terhadap incidence rate TB (p = 0,02078), namun
secara parsial tidak ditemukan pengaruh yang signifikan (p > 0,05).
Model mampu menjelaskan sekitar 49,55% variasi incidence rate (R² =
0,4955), dengan nilai Adjusted R² sebesar 0,3442. Secara umum, hasil ini
menunjukkan bahwa model masih terbatas dalam menjelaskan variasi TB
sehingga diperlukan pendekatan spasial untuk menangkap keterkaitan antar
wilayah.
3.4 Diagnostik Model OLS
Tabel 5. Diagnostik Model OLS
Tabel 5. Diagnostik Model
jabar_tb$residual_ols <- residuals(ols_model)
# VIF
vif_values <- vif(ols_model)
# Uji diagnostik
shapiro_res <- shapiro.test(jabar_tb$residual_ols)
bp_res <- bptest(ols_model)
dw_res <- dwtest(ols_model)
moran_residual <- moran.test(
jabar_tb$residual_ols,
lw,
zero.policy = TRUE
)
diagnostic_table <- data.frame(
Uji = c(
paste("VIF –", names(vif_values)),
"Normalitas Residual (Shapiro-Wilk)",
"Heteroskedastisitas (Breusch-Pagan)",
"Autokorelasi (Durbin-Watson)",
"Autokorelasi Spasial Residual (Moran's I)"
),
Nilai = c(
as.numeric(vif_values),
shapiro_res$statistic,
bp_res$statistic,
dw_res$statistic,
moran_residual$estimate[1]
),
p_value = c(
rep(NA, length(vif_values)),
shapiro_res$p.value,
bp_res$p.value,
dw_res$p.value,
moran_residual$p.value
)
)
knitr::kable(
diagnostic_table,
digits = 4
)
| VIF – faskes |
2.7618 |
NA |
| VIF – penduduk_miskin |
2.0639 |
NA |
| VIF – kepadatan |
3.5732 |
NA |
| VIF – air_minum |
1.5797 |
NA |
| VIF – sanitasi |
2.3568 |
NA |
| VIF – hiv |
2.5539 |
NA |
| Normalitas Residual (Shapiro-Wilk) |
0.9547 |
0.2787 |
| Heteroskedastisitas (Breusch-Pagan) |
8.4930 |
0.2042 |
| Autokorelasi (Durbin-Watson) |
3.0128 |
0.9971 |
| Autokorelasi Spasial Residual (Moran’s I) |
0.2573 |
0.0176 |
Hasil diagnostik model OLS menunjukkan bahwa seluruh asumsi klasik
terpenuhi, yaitu tidak terdapat multikolinearitas, heteroskedastisitas,
maupun autokorelasi residual secara temporal. Namun, uji Moran’s I pada
residual menunjukkan adanya autokorelasi spasial yang signifikan (I =
0,2573; p = 0,0176), yang mengindikasikan bahwa residual masih memiliki
pola ketergantungan antar wilayah. Temuan ini menunjukkan bahwa model
OLS belum mampu menangkap efek spasial, sehingga diperlukan pendekatan
model spasial seperti SLX untuk mengakomodasi keterkaitan antar
wilayah.
3.5 Model SLX
Tabel 5. Hasil Estimasi Model SLX
jabar_tb$lag_faskes <- lag.listw(
lw, jabar_tb$faskes,
zero.policy = TRUE
)
jabar_tb$lag_penduduk_miskin <- lag.listw(
lw, jabar_tb$penduduk_miskin,
zero.policy = TRUE
)
jabar_tb$lag_kepadatan <- lag.listw(
lw, jabar_tb$kepadatan,
zero.policy = TRUE
)
jabar_tb$lag_air_minum <- lag.listw(
lw, jabar_tb$air_minum,
zero.policy = TRUE
)
jabar_tb$lag_sanitasi <- lag.listw(
lw, jabar_tb$sanitasi,
zero.policy = TRUE
)
jabar_tb$lag_hiv <- lag.listw(
lw, jabar_tb$hiv,
zero.policy = TRUE
)
slx_model <- lm(
incidence_rate_TB ~
faskes +
penduduk_miskin +
kepadatan +
air_minum +
sanitasi +
hiv +
lag_faskes +
lag_penduduk_miskin +
lag_kepadatan +
lag_air_minum +
lag_sanitasi +
lag_hiv,
data = jabar_tb
)
slx_coef <- summary(slx_model)$coefficients
slx_table <- data.frame(
Variabel = c(
"(Intercept)",
"Faskes",
"Penduduk Miskin",
"Kepadatan Penduduk",
"Air Minum Layak",
"Sanitasi Layak",
"HIV",
"Lag Faskes",
"Lag Penduduk Miskin",
"Lag Kepadatan",
"Lag Air Minum Layak",
"Lag Sanitasi Layak",
"Lag HIV"
),
Koefisien = slx_coef[, 1],
Std_Error = slx_coef[, 2],
t_value = slx_coef[, 3],
p_value = slx_coef[, 4]
)
knitr::kable(
slx_table,
digits = 4)
| (Intercept) |
(Intercept) |
617.9421 |
2184.4884 |
0.2829 |
0.7814 |
| faskes |
Faskes |
-0.0307 |
0.0512 |
-0.5992 |
0.5586 |
| penduduk_miskin |
Penduduk Miskin |
-7.8117 |
29.5788 |
-0.2641 |
0.7956 |
| kepadatan |
Kepadatan Penduduk |
0.0228 |
0.0185 |
1.2328 |
0.2379 |
| air_minum |
Air Minum Layak |
8.6532 |
10.3198 |
0.8385 |
0.4158 |
| sanitasi |
Sanitasi Layak |
3.7075 |
9.7746 |
0.3793 |
0.7102 |
| hiv |
HIV |
0.6005 |
0.5896 |
1.0184 |
0.3258 |
| lag_faskes |
Lag Faskes |
0.0769 |
0.1117 |
0.6878 |
0.5028 |
| lag_penduduk_miskin |
Lag Penduduk Miskin |
32.5588 |
51.2840 |
0.6349 |
0.5357 |
| lag_kepadatan |
Lag Kepadatan |
-0.0464 |
0.0446 |
-1.0391 |
0.3164 |
| lag_air_minum |
Lag Air Minum Layak |
-15.1076 |
25.1085 |
-0.6017 |
0.5570 |
| lag_sanitasi |
Lag Sanitasi Layak |
9.2671 |
21.2031 |
0.4371 |
0.6687 |
| lag_hiv |
Lag HIV |
0.0116 |
1.1733 |
0.0099 |
0.9923 |
Hasil estimasi model SLX menunjukkan bahwa model secara simultan
signifikan dalam menjelaskan variasi incidence rate Tuberkulosis (p =
0,04483). Nilai R² sebesar 0,6913 menunjukkan bahwa model mampu
menjelaskan sekitar 69,13% variasi data, yang lebih tinggi dibandingkan
model OLS. Namun demikian, secara parsial seluruh variabel baik variabel
lokal maupun efek spasial (lag) tidak menunjukkan pengaruh yang
signifikan (p > 0,05). Hal ini mengindikasikan bahwa pengaruh faktor
risiko terhadap incidence rate TB tersebar secara spasial dan tidak
terpusat pada satu variabel tertentu. Secara keseluruhan, model SLX
menunjukkan adanya peningkatan kemampuan dalam menangkap variasi data
dibandingkan OLS, sehingga mendukung adanya efek keterkaitan spasial
antar wilayah dalam penyebaran Tuberkulosis.
3.6 Perbandingan Model
Tabel 6. Perbandingan Model
model_comparison <- data.frame(
Model = c("OLS", "SLX"),
AIC = round(
c(
AIC(ols_model),
AIC(slx_model)
),
2
),
R_squared = round(
c(
summary(ols_model)$r.squared,
summary(slx_model)$r.squared
),
4
),
LogLik = round(
c(
as.numeric(logLik(ols_model)),
as.numeric(logLik(slx_model))
),
2
),
RMSE = round(
c(
sqrt(mean(ols_model$residuals^2)),
sqrt(mean(slx_model$residuals^2))
),
2
)
)
comparison_table <- data.frame(
Model = c("OLS", "SLX"),
AIC = round(
c(
AIC(ols_model),
AIC(slx_model)
),
2
),
R_squared = round(
c(
summary(ols_model)$r.squared,
summary(slx_model)$r.squared
),
4
),
Log_Likelihood = round(
c(
as.numeric(logLik(ols_model)),
as.numeric(logLik(slx_model))
),
2
),
RMSE = round(
c(
sqrt(mean(residuals(ols_model)^2)),
sqrt(mean(residuals(slx_model)^2))
),
2
)
)
knitr::kable(
comparison_table,
digits = 4
)
| OLS |
365.96 |
0.4955 |
-174.98 |
157.87 |
| SLX |
364.69 |
0.6913 |
-168.35 |
123.49 |
Hasil perbandingan kinerja model menunjukkan bahwa model SLX memiliki
performa yang lebih baik dibandingkan model OLS. Hal ini terlihat dari
penurunan nilai AIC dan RMSE, serta peningkatan nilai R-squared dan
log-likelihood. Peningkatan tersebut menunjukkan bahwa model SLX lebih
mampu menjelaskan variasi incidence rate Tuberkulosis dengan
mempertimbangkan efek spasial antar wilayah. Dengan demikian, model SLX
lebih sesuai digunakan dalam analisis ini karena mampu menangkap
keterkaitan spasial yang tidak dapat dijelaskan oleh model OLS.
3.7 Keterbatasan Penelitian
Penelitian ini memiliki beberapa keterbatasan yang perlu diperhatikan
dalam interpretasi hasilnya: 1. Analisis dilakukan pada tingkat agregat
kabupaten/kota, sehingga tidak mampu menangkap variasi dalam tingkat
yang lebih mikro.
Data bersifat cross-sectional, sehingga tidak dapat mencerminkan
dinamika perubahan kasus TB dari waktu ke waktu.
Jumlah variabel penjelas yang digunakan masih terbatas dan belum
mencakup semua faktor risiko yang relevan.
Model SLX yang digunakan belum mempertimbangkan ketergantungan
temporal antar pengamatan.
Daftar Pustaka
Alma, L. R., Olivionita, V., & Wardani, H. E. (2024). An
ecological study of determinants of the incidence of tuberculosis in
Malang Raya area. Preventia: The Indonesian Journal of Public Health,
9(1), 112–120. https://doi.org/10.17977/um044v9i12024p112-120
Anselin, L. (1995). Local indicators of spatial association LISA.
Geographical Analysis, 27(2),
93–115.https://doi.org/10.1111/j.1538-4632.1995.tb00338.x
Atillah, C. N., Wulandari, R. A., & Kurniasari, F. (2023).
Environmental factors and pulmonary tuberculosis cases in Bandung City.
Jurnal Ilmiah Kesehatan Masyarakat, 15(4), 167–175. https://doi.org/10.52022/jikm.v15i4.566
Besag, J., York, J., & Mollié, A. (1991). Bayesian image
restoration, with two applications in spatial statistics. Annals of the
Institute of Statistical Mathematics, 43(1), 1–20. https://doi.org/10.1007/BF00116466
Bivand, R. S., Pebesma, E., & Gómez-Rubio, V. (2013). Applied
spatial data analysis with R (2nd ed.). Springer.
Cliff, A. D., & Ord, J. K. (1981). Spatial processes: Models and
applications. Pion.
Dinas Kesehatan Provinsi Jawa Barat. (2023). Profil kesehatan
Provinsi Jawa Barat tahun 2022.
Dinas Kesehatan Provinsi Jawa Barat. (2024). Profil kesehatan
Provinsi Jawa Barat tahun 2023.
Dinas Kesehatan Provinsi Jawa Barat. (2025). Profil kesehatan
Provinsi Jawa Barat tahun 2024.
Dzakiyah, R. N., Karima, U. Q., Simanjorang, C., & Apriningsih.
(2023). Determinan kejadian tuberkulosis paru pada usia dewasa. Jurnal
Penelitian Kesehatan Suara Forikes.
Handayani, S., Musfirah, M., & Apriana, A. (2024). Determinants
of pulmonary tuberculosis. Jurnal Ilmiah Kesehatan, 6(1), 45–54. https://doi.org/10.36590/jika.v6i1.374
Haq, A., Achmadi, U. F., & Susanna, D. (2020). Analisis spasial
TB paru. Jurnal Ekologi Kesehatan, 18(3). https://doi.org/10.22435/jek.v3i18.80 Kementerian
Kesehatan Republik Indonesia. (2025). Profil kesehatan Indonesia
2024.
Kristianingrum, E. N. (2024). Kepadatan penduduk dan TB paru
(Skripsi). Universitas Duta Bangsa.
Laoli, H. A., Nazira, A., Faleria, I., Tarigan, B., & Girsang, V.
I. (2024). Cases of pulmonary tuberculosis and population density.
MIHHICo Conference Proceedings.
Montgomery, D. C., Peck, E. A., & Vining, G. G. (2021).
Introduction to linear regression analysis (6th ed.). Wiley.
Nurdin, A., et al. (2025). Analisis faktor risiko TB. Jurnal
Kesehatan Yamasi Makassar, 9(2), 1–9.
Rosady, D. S., Zulfa, N. R. A., & Pratama, S. B. (2024). Spatial
analysis TB Bandung. Global Medical & Health Communication, 12(1).
https://doi.org/10.29313/gmhc.v12i1.12410
Sasmita, S., Junaid, J., & Ainurafiq, A. (2017). Pola spasial TB
paru. Jurnal Ilmiah Mahasiswa Kesehatan Masyarakat.
Sihaloho, E. D., et al. (2021). Pengaruh kemiskinan terhadap TB.
Journal of Applied Business and Economic, 7(3). https://doi.org/10.30998/jabe.v7i3.6470
Suryani, F. T., & Ibad, M. (2022). Faktor kepadatan dan sanitasi
terhadap TB. Jurnal Sosial Sains, 2(10). https://doi.org/10.36418/jurnalsosains.v2i10.468
Turner, R. D., et al. (2017). Tuberculosis infectiousness and host
susceptibility. Journal of Infectious Diseases, 216. https://doi.org/10.1093/infdis/jix361
World Health Organization. (2025). Global tuberculosis report 2025.
WHO.
LS0tDQp0aXRsZTogIkFuYWxpc2lzIFNwYXNpYWwgRmFrdG9yLUZha3RvciB5YW5nIE1lbWVuZ2FydWhpIEluY2lkZW5jZSBSYXRlIFR1YmVya3Vsb3NpcyBkaSBQcm92aW5zaSBKYXdhIEJhcmF0IFRhaHVuIDIwMjUgTWVuZ2d1bmFrYW4gTW9kZWwgU3BhdGlhbCBMYWcgb2YgWCAoU0xYKSINCg0Kb3V0cHV0Og0KICBodG1sX2RvY3VtZW50Og0KICAgIHRvYzogdHJ1ZQ0KICAgIHRvY19mbG9hdDogdHJ1ZQ0KICAgIGNvZGVfZm9sZGluZzogaGlkZQ0KICAgIGNvZGVfZG93bmxvYWQ6IHRydWUNCmNzczogc3R5bGUuY3NzDQotLS0NCg0KDQpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0NCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSkNCmBgYA0KYGBge3IgaW5jbHVkZT1GQUxTRX0NCmxpYnJhcnkocmVhZHhsKQ0KbGlicmFyeShzZikNCmxpYnJhcnkoc3BkZXApDQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkodG1hcCkNCmxpYnJhcnkoSU5MQSkNCmxpYnJhcnkoY2FyKQ0KbGlicmFyeShsbXRlc3QpDQp0bWFwX21vZGUoInBsb3QiKQ0KYGBgDQoNCg0KLS0tDQoNCioqSWRlbnRpdGFzIFBlbnVsaXM6KioNCg0KfCBLZXRlcmFuZ2FuIHwgSW5mb3JtYXNpIHwNCnwtLS0tLS0tLS0tLS18LS0tLS0tLS0tLS18DQp8IE5hbWEgfCBTcmkgWXVsaWFuYSB8DQp8IE5QTSB8IDE0MDcyMDI1MDAwMyB8DQp8IFByb2dyYW0gU3R1ZGkgfCBNYWdpc3RlciBTdGF0aXN0aWthIFRlcmFwYW4gfA0KfCBNYXRhIEt1bGlhaCB8IEFuYWxpc2lzIFNwYXNpYWwgfA0KDQotLS0NCg0KLS0tDQoNCjxkaXYgYWxpZ249ImNlbnRlciI+DQojICoqQUJTVFJBSyoqDQo8L2Rpdj4NCg0KVHViZXJrdWxvc2lzIChUQikgbWFzaWggbWVuamFkaSBzYWxhaCBzYXR1IG1hc2FsYWgga2VzZWhhdGFuIG1hc3lhcmFrYXQgZGkgUHJvdmluc2kgSmF3YSBCYXJhdCBkZW5nYW4ganVtbGFoIGthc3VzIHlhbmcgcmVsYXRpZiB0aW5nZ2kuIFBlbmVsaXRpYW4gaW5pIGJlcnR1anVhbiBtZW5nYW5hbGlzaXMgZmFrdG9yLWZha3RvciB5YW5nIG1lbWVuZ2FydWhpIEluY2lkZW5jZSBSYXRlIChJUikgVEIgdGFodW4gMjAyNSBtZW5nZ3VuYWthbiBwZW5kZWthdGFuIHNwYXNpYWwgU3BhdGlhbCBMYWcgb2YgWCAoU0xYKS4gRGF0YSB5YW5nIGRpZ3VuYWthbiBtZW5jYWt1cCAyNyBrYWJ1cGF0ZW4va290YSBkaSBKYXdhIEJhcmF0IGRlbmdhbiB2YXJpYWJlbCBqdW1sYWggZmFzaWxpdGFzIGtlc2VoYXRhbiwgcGVyc2VudGFzZSBwZW5kdWR1ayBtaXNraW4sIGtlcGFkYXRhbiBwZW5kdWR1aywgYWtzZXMgYWlyIG1pbnVtIGxheWFrLCBha3NlcyBzYW5pdGFzaSBsYXlhaywgZGFuIGp1bWxhaCBrYXN1cyBISVYuIEFuYWxpc2lzIGRpbGFrdWthbiBtZWxhbHVpIHN0YXRpc3RpayBkZXNrcmlwdGlmLCBwZW1ldGFhbiBzcGFzaWFsLCB1amkgYXV0b2tvcmVsYXNpIHNwYXNpYWwgTW9yYW7igJlzIEksIHJlZ3Jlc2kgT0xTLCBkYW4gbW9kZWwgU0xYLiBIYXNpbCBtZW51bmp1a2thbiBiYWh3YSBtb2RlbCBTTFggbWVtYmVyaWthbiBraW5lcmphIHlhbmcgbGViaWggYmFpayBkaWJhbmRpbmdrYW4gbW9kZWwgT0xTIGRlbmdhbiBuaWxhaSBSwrIgc2ViZXNhciAwLDY5MTMgZGFuIFJNU0Ugc2ViZXNhciAxMjMsNDkuIFRlbXVhbiBpbmkgbWVuZ2luZGlrYXNpa2FuIGJhaHdhIGZha3Rvci1mYWt0b3IgeWFuZyBtZW1lbmdhcnVoaSBrZWphZGlhbiBUQiB0aWRhayBoYW55YSBiZXJhc2FsIGRhcmkga2FyYWt0ZXJpc3RpayB3aWxheWFoIGl0dSBzZW5kaXJpLCB0ZXRhcGkganVnYSBkaXBlbmdhcnVoaSBvbGVoIGtvbmRpc2kgd2lsYXlhaCBzZWtpdGFybnlhLiBPbGVoIGthcmVuYSBpdHUsIHBlbmRla2F0YW4gc3Bhc2lhbCBwZXJsdSBkaXBlcnRpbWJhbmdrYW4gZGFsYW0gcGVyZW5jYW5hYW4gcHJvZ3JhbSBwZW5nZW5kYWxpYW4gVEIgZGkgSmF3YSBCYXJhdC4NCg0KKipLYXRhIEt1bmNpOioqIFR1YmVya3Vsb3NpcywgSW5jaWRlbmNlIFJhdGUsIEFuYWxpc2lzIFNwYXNpYWwsIE1vcmFuJ3MgSSwgU3BhdGlhbCBMYWcgb2YgWCAoU0xYKSwgSmF3YSBCYXJhdC4NCg0KDQotLS0NCg0KDQojIDEuIFBlbmRhaHVsdWFuDQojIyAxLjEgTGF0YXIgQmVsYWthbmcgDQoNClR1YmVya3Vsb3NpcyAoVEIpIG1lcnVwYWthbiBzYWxhaCBzYXR1IHBlbnlha2l0IG1lbnVsYXIgeWFuZyBtYXNpaCBtZW5qYWRpIHBlcm1hc2FsYWhhbiBrZXNlaGF0YW4gbWFzeWFyYWthdCBkaSBkdW5pYS4gUGVueWFraXQgeWFuZyBkaXNlYmFia2FuIG9sZWggTXljb2JhY3Rlcml1bSB0dWJlcmN1bG9zaXMgaW5pIG1lbnllYmFyIG1lbGFsdWkgdWRhcmEgZGFuIG1lbmphZGkgc2FsYWggc2F0dSBwZW55ZWJhYiB1dGFtYSBrZW1hdGlhbiBha2liYXQgcGVueWFraXQgaW5mZWtzaSAoV0hPLCAyMDI1KS4gVXBheWEgcGVuZ2VuZGFsaWFuIFRCIG1lcnVwYWthbiBzYWxhaCBzYXR1IHRhcmdldCBkYWxhbSBTdXN0YWluYWJsZSBEZXZlbG9wbWVudCBHb2FscyAoU0RHcyksIGtodXN1c255YSBwYWRhIFR1anVhbiBrZS0zIHlhaXR1IEtlaGlkdXBhbiBTZWhhdCBkYW4gU2VqYWh0ZXJhLCBkZW5nYW4gdGFyZ2V0IDMuMyB5YW5nIG1lbmFyZ2V0a2FuIHBlbmdha2hpcmFuIGVwaWRlbWkgVEIgcGFkYSB0YWh1biAyMDMwLiBIYWwgaW5pIG1lbnVuanVra2FuIGJhaHdhIHBlbmFuZ2d1bGFuZ2FuIFRCIGJ1a2FuIGhhbnlhIHByaW9yaXRhcyBuYXNpb25hbCwgdGV0YXBpIGp1Z2EgYmFnaWFuIGRhcmkga29taXRtZW4gZ2xvYmFsIHlhbmcgaGFydXMgZGlkdWt1bmcgbWVsYWx1aSB1cGF5YSBiZXJiYXNpcyBkYXRhIGRhbiB3aWxheWFoLiBJbmRvbmVzaWEgdGVybWFzdWsgbmVnYXJhIGRlbmdhbiBiZWJhbiBUQiB0ZXJ0aW5nZ2kgZGkgZHVuaWEgZGFuIG1lbnl1bWJhbmcgc2VraXRhciAxMCUgZGFyaSB0b3RhbCBrYXN1cyBUQiBnbG9iYWwgKFdITywgMjAyNSkuDQpEaSBJbmRvbmVzaWEsIGp1bWxhaCBrYXN1cyBUQiB0ZXJ1cyBtZW51bmp1a2thbiBwZW5pbmdrYXRhbi4gQmVyZGFzYXJrYW4gUHJvZmlsIEtlc2VoYXRhbiBJbmRvbmVzaWEgMjAyNCwganVtbGFoIGthc3VzIFRCIHlhbmcgZGlsYXBvcmthbiBtZW5jYXBhaSA4NTYuNDIwIGthc3VzIHBhZGEgdGFodW4gMjAyNCwgbWVuaW5na2F0IGRpYmFuZGluZ2thbiB0YWh1biBzZWJlbHVtbnlhLiBKYXdhIEJhcmF0IG1lcnVwYWthbiBwcm92aW5zaSBkZW5nYW4ganVtbGFoIGthc3VzIFRCIHRlcnRpbmdnaSBkaSBJbmRvbmVzaWEsIGRlbmdhbiAyMjkuNjgzIGthc3VzIHBhZGEgdGFodW4gMjAyNCAoS2VtZW50ZXJpYW4gS2VzZWhhdGFuIFJJLCAyMDI1OyBEaW5hcyBLZXNlaGF0YW4gUHJvdmluc2kgSmF3YSBCYXJhdCwgMjAyNSkuDQoNClRpbmdnaW55YSBrYXN1cyBUQiBkaXBlbmdhcnVoaSBvbGVoIGJlcmJhZ2FpIGZha3RvciBzb3NpYWwsIGVrb25vbWksIGRhbiBsaW5na3VuZ2FuLiBCZWJlcmFwYSBwZW5lbGl0aWFuIG1lbnVuanVra2FuIGJhaHdhIGtlcGFkYXRhbiBwZW5kdWR1aywgdGluZ2thdCBrZW1pc2tpbmFuLCBrdWFsaXRhcyBzYW5pdGFzaSwgYWtzZXMgYWlyIG1pbnVtIGxheWFrLCBrZXRlcnNlZGlhYW4gZmFzaWxpdGFzIGtlc2VoYXRhbiwgc2VydGEga2FzdXMgSElWIGJlcmh1YnVuZ2FuIGRlbmdhbiBrZWphZGlhbiBUQiAoU2loYWxvaG8gZXQgYWwuLCAyMDIxOyBMYW9saSBldCBhbC4sIDIwMjQ7IEhhbmRheWFuaSBldCBhbC4sIDIwMjQpLiBTZWxhaW4gaXR1LCBrYXJha3RlcmlzdGlrIHdpbGF5YWggeWFuZyBiZXJiZWRhIG1lbnllYmFia2FuIGRpc3RyaWJ1c2kga2FzdXMgVEIgdGlkYWsgbWVyYXRhIGFudGFyIGRhZXJhaC4NCg0KUGVyYmVkYWFuIGRpc3RyaWJ1c2kga2FzdXMgYW50YXJ3aWxheWFoIG1lbnVuanVra2FuIHBlbnRpbmdueWEgcGVuZGVrYXRhbiBzcGFzaWFsIGRhbGFtIGFuYWxpc2lzIGVwaWRlbWlvbG9naS4gQW5hbGlzaXMgc3Bhc2lhbCBtZW11bmdraW5rYW4gaWRlbnRpZmlrYXNpIHBvbGEgcGVyc2ViYXJhbiBwZW55YWtpdCBiZXJkYXNhcmthbiBsb2thc2kgZ2VvZ3JhZmlzIHNlaGluZ2dhIGRhcGF0IG1lbWJhbnR1IG1lbmVudHVrYW4gd2lsYXlhaCBwcmlvcml0YXMgcGVuZ2VuZGFsaWFuIFRCLiBEYWxhbSBwZW5lbGl0aWFuIGluaSwgYW5hbGlzaXMgZGlsYWt1a2FuIG1lbGFsdWkgcGVtZXRhYW4gSW5jaWRlbmNlIFJhdGUgKElSKSwgcGVtb2RlbGFuIGZha3Rvci1mYWt0b3IgeWFuZyBiZXJodWJ1bmdhbiBkZW5nYW4gdGluZ2thdCBwZW51bGFyYW4gVEIgbWVuZ2d1bmFrYW4gcmVncmVzaSBPcmRpbmFyeSBMZWFzdCBTcXVhcmVzIChPTFMpLCBzZXJ0YSBwZW5ndWppYW4gZWZlayBrZXRlcmdhbnR1bmdhbiBzcGFzaWFsLg0KDQpNb2RlbCBPTFMga29udmVuc2lvbmFsIG1lbmdhc3Vtc2lrYW4gYmFod2EgcGVuZ2FtYXRhbiBkaSBzdWF0dSB3aWxheWFoIGJlcnNpZmF0IGluZGVwZW5kZW4gZGFuIHRpZGFrIGRpcGVuZ2FydWhpIG9sZWggd2lsYXlhaCBzZWtpdGFybnlhLiBOYW11biwgcGVueWFraXQgbWVudWxhciBzZXBlcnRpIFRCIG1lbWlsaWtpIGthcmFrdGVyaXN0aWsgYmF3YWFuIGJlcnVwYSBlZmVrIGxpbXBhaGFuIChzcGlsbG92ZXIgZWZmZWN0KSBha2liYXQgbW9iaWxpdGFzIHBlbmR1ZHVrIGxpbnRhcyBiYXRhcyBhZG1pbmlzdHJhdGlmLiBPbGVoIGthcmVuYSBpdHUsIGppa2EgdGVyZGFwYXQga2V0ZXJnYW50dW5nYW4gc3Bhc2lhbCBwYWRhIHZhcmlhYmVsIHBlbmplbGFzLCBtb2RlbCBTcGF0aWFsIExhZyBYIChTTFgpIGRpdGVyYXBrYW4gdW50dWsgbWVuZ2hhc2lsa2FuIGVzdGltYXNpIHlhbmcgbGViaWggYWt1cmF0IG1lbGFsdWkgcGVtYm9ib3RhbiBtYXRyaWtzIGtldGV0YW5nZ2FhbiAoc3BhdGlhbCB3ZWlnaHQgbWF0cml4KS4gSGFzaWwgcGVuZWxpdGlhbiBpbmkgZGloYXJhcGthbiBkYXBhdCBtZW1iZXJpa2FuIGdhbWJhcmFuIG1lbmdlbmFpIGZha3RvciBsb2thbCBkYW4gZmFrdG9yIGxpbmdrdW5nYW4gdGV0YW5nZ2EgeWFuZyBiZXJodWJ1bmdhbiBkZW5nYW4ga2VqYWRpYW4gVEIgZGkgUHJvdmluc2kgSmF3YSBCYXJhdCBzZWJhZ2FpIGRhc2FyIHBlcmVuY2FuYWFuIHByb2dyYW0gcGVuZ2VuZGFsaWFuIGJlcmJhc2lzIHdpbGF5YWguDQoNCiMjIDEuMiBSdW11c2FuIE1hc2FsYWgNCg0KMSkgQmFnYWltYW5hIGthcmFrdGVyaXN0aWsgZGFuIGRpc3RyaWJ1c2kgc3Bhc2lhbCBrYXN1cyBUQiBkaSBKYXdhIEJhcmF0PyANCg0KMikgQmFnYWltYW5hIHBvbGEgcGVyc2ViYXJhbiBJbmNpZGVuY2UgUmF0ZSBUQj8gDQoNCjMpIEJhZ2FpbWFuYSBwZW5nYXJ1aCBmYWt0b3Igc29zaWFsLWVrb25vbWkgZGFuIGtlc2VoYXRhbiB0ZXJoYWRhcCBUQiBtZW5nZ3VuYWthbiBPTFM/IA0KNCkgQXBha2FoIHRlcmRhcGF0IGVmZWsgc3Bhc2lhbCB5YW5nIGxlYmloIGJhaWsgZGlqZWxhc2thbiBkZW5nYW4gbW9kZWwgU0xYPw0KDQoNCg0KIyMgMS4zIFR1anVhbiBQZW5lbGl0aWFuDQoNCjEpIE1lbmRlc2tyaXBzaWthbiBrYXJha3RlcmlzdGlrIGthc3VzIFRCIGRpIEphd2EgQmFyYXQuIA0KMikgTWVtZXRha2FuIGRpc3RyaWJ1c2kgSW5jaWRlbmNlIFJhdGUgVEIuIA0KMykgTWVuZ2FuYWxpc2lzIGZha3RvciB5YW5nIG1lbWVuZ2FydWhpIFRCIG1lbmdndW5ha2FuIE9MUy4gDQo0KSBNZW5ndWppIGRhbiBtZW1iYW5kaW5na2FuIG1vZGVsIE9MUyBkYW4gU0xYLg0KDQojIDIuIERhdGEgZGFuIE1ldG9kZSANCiMjIDIuMSBEYXRhIFBlbmVsaXRpYW4NCg0KRGF0YSB5YW5nIGRpZ3VuYWthbiBtZXJ1cGFrYW4gZGF0YSBzZWt1bmRlciB5YW5nIG1lbmNha3VwIDI3IGthYnVwYXRlbi9rb3RhIGRpIFByb3ZpbnNpIEphd2EgQmFyYXQgcGFkYSB0YWh1biAyMDI1LiBEYXRhIGF0cmlidXQgZGlwZXJvbGVoIGRhcmkgQmFkYW4gUHVzYXQgU3RhdGlzdGlrIChCUFMpIFByb3ZpbnNpIEphd2EgQmFyYXQgc2VydGEgUG9ydGFsIE9wZW4gRGF0YSBKYWJhciwgc2VkYW5na2FuIGRhdGEgc3Bhc2lhbCBiZXJ1cGEgYmF0YXMgYWRtaW5pc3RyYXNpIGthYnVwYXRlbi9rb3RhIGRhbGFtIGZvcm1hdCAqc2hhcGVmaWxlKiAoU0hQKSBkaXBlcm9sZWggZGFyaSBQb3J0YWwgT3BlbiBEYXRhIEphYmFyLiBEYXRhIHNwYXNpYWwgdGVyc2VidXQgZGlndW5ha2FuIHVudHVrIG1lbWJhbmd1biBtYXRyaWtzIHBlbWJvYm90IHNwYXNpYWwgZGFuIG1lbXZpc3VhbGlzYXNpa2FuIHNlYmFyYW4ga2FzdXMgVHViZXJrdWxvc2lzIChUQikgYW50YXJ3aWxheWFoLiBWYXJpYWJlbCBwZW5lbGl0aWFuIHRlcmRpcmkgYXRhcyBzYXR1IHZhcmlhYmVsIHJlc3BvbiB5YWl0dSBJUiBUdWJlcmt1bG9zaXMgKFRCKSwgZW5hbSB2YXJpYWJlbCBwZW5qZWxhcyB5YW5nIG1lbmNlcm1pbmthbiBmYWt0b3Igc29zaWFsLCBla29ub21pLCBkYW4ga2VzZWhhdGFuLCBzZXJ0YSBqdW1sYWggcGVuZHVkdWsgeWFuZyBkaWd1bmFrYW4gc2ViYWdhaSBkYXNhciBwZXJoaXR1bmdhbiAqSW5jaWRlbmNlIFJhdGUqIChJUikuIERlZmluaXNpIG9wZXJhc2lvbmFsIHZhcmlhYmVsIHlhbmcgZGlndW5ha2FuIGRpc2FqaWthbiBwYWRhIFRhYmVsIDEuDQoNCg0KYGBge3IgaW5jbHVkZT1GQUxTRX0NCnNldHdkKCJEOi9NQUdJU1RFUi9TRU1FU1RFUiAyIikNCg0KZGF0YSA8LSByZWFkX2V4Y2VsKA0KICAiZGF0YXNldCBUQi54bHN4IiwNCiAgc2hlZXQgPSAic3Bhc2lhbCINCikNCg0KZGF0YSA8LSBkYXRhICU+JQ0KICByZW5hbWUoDQogICAgcGVuZHVkdWtfbWlza2luID0gYHBlcnNlbnRhc2UgcGVuZHVkdWsgbWlza2luYCwNCiAgICBrZXBhZGF0YW4gPSBga2VwYWRhdGFuIHBlbmR1ZHVrYCwNCiAgICBhaXJfbWludW0gPSBgYWlyIG1pbnVtIGxheWFrYCwNCiAgICBzYW5pdGFzaSA9IGBzYW5pdGFzaSBsYXlha2AsDQogICAgaGl2ID0gYGp1bWxhaCBrYXN1cyBISVZgLA0KICAgIGp1bWxhaF9wZW5kdWR1ayA9IGBKdW1sYWggUGVuZHVkdWtgDQogICkgJT4lDQogIG11dGF0ZSgNCiAgICBUQiAgICAgICAgICAgICAgICA9IGFzLm51bWVyaWMoVEIpLA0KICAgIGZhc2tlcyAgICAgICAgICAgID0gYXMubnVtZXJpYyhmYXNrZXMpLA0KICAgIHBlbmR1ZHVrX21pc2tpbiAgID0gYXMubnVtZXJpYyhwZW5kdWR1a19taXNraW4pLA0KICAgIGtlcGFkYXRhbiAgICAgICAgID0gYXMubnVtZXJpYyhrZXBhZGF0YW4pLA0KICAgIGFpcl9taW51bSAgICAgICAgID0gYXMubnVtZXJpYyhhaXJfbWludW0pLA0KICAgIHNhbml0YXNpICAgICAgICAgID0gYXMubnVtZXJpYyhzYW5pdGFzaSksDQogICAgaGl2ICAgICAgICAgICAgICAgPSBhcy5udW1lcmljKGhpdiksDQogICAganVtbGFoX3BlbmR1ZHVrICAgPSBhcy5udW1lcmljKGp1bWxhaF9wZW5kdWR1ayksDQoNCmluY2lkZW5jZV9yYXRlX1RCID0NCiAgICAgIChUQiAvIGp1bWxhaF9wZW5kdWR1aykgKiAxMDAwMDANCiAgKQ0KDQpzZXR3ZCgiRDovQmF0YXMvQmF0YXMiKQ0KDQpqYWJhciA8LSBzdF9yZWFkKA0KICAiQmF0YXNfS2FidXBhdGVuX0phd2FfQmFyYXQuc2hwIiwNCiAgcXVpZXQgPSBUUlVFDQopDQoNCmRhdGEka2FiX2NsZWFuIDwtIGRhdGEkbmFtYV9rYWJ1cGF0ZW5fa290YSAlPiUNCiAgdG91cHBlcigpICU+JQ0KICBnc3ViKCJLQUJVUEFURU4gIiwgIiIsIC4pDQoNCmphYmFyJGthYl9jbGVhbiA8LSB0b3VwcGVyKGphYmFyJFdBRE1LSykNCg0KamFiYXJfdGIgPC0gbWVyZ2UoDQogIGphYmFyLA0KICBkYXRhLA0KICBieSA9ICJrYWJfY2xlYW4iDQopDQoNCmBgYA0KDQo8ZGl2IGFsaWduPSJjZW50ZXIiPg0KKipUYWJlbCAxLioqIFZhcmlhYmVsIFBlbmVsaXRpYW4NCjwvZGl2Pg0KDQoNCnwgVmFyaWFiZWwgICAgICAgICAgICAgICAgICAgICB8IERlZmluaXNpIE9wZXJhc2lvbmFsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRGFzYXIgVGVvcmkgZGFuIEVtcGlyaXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEFyYWggSHVidW5nYW4geWFuZyBEaWhhcmFwa2FuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8DQp8ICoqSVIgVHViZXJrdWxvc2lzIChZKSoqICAgICAgfCBKdW1sYWgga2FzdXMgVEIgcGVyIDEwMC4wMDAgcGVuZHVkdWsgcGFkYSBzZXRpYXAga2FidXBhdGVuL2tvdGEgZGkgSmF3YSBCYXJhdCB0YWh1biAyMDI1LiB8IERpZ3VuYWthbiBzZWJhZ2FpIHVrdXJhbiByaXNpa28ga2VqYWRpYW4gVEIgeWFuZyBtZW11bmdraW5rYW4gcGVyYmFuZGluZ2FuIGFudGFyd2lsYXlhaCBkZW5nYW4ganVtbGFoIHBlbmR1ZHVrIGJlcmJlZGEuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCnwgKipGYXNpbGl0YXMgS2VzZWhhdGFuIChY4oKBKSoqIHwgSnVtbGFoIGZhc2lsaXRhcyBrZXNlaGF0YW4gcGFkYSBzZXRpYXAga2FidXBhdGVuL2tvdGEuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBBa3NlcyB0ZXJoYWRhcCBwZWxheWFuYW4ga2VzZWhhdGFuIGJlcnBlcmFuIHBlbnRpbmcgZGFsYW0gcGVuZW11YW4ga2FzdXMsIGRpYWdub3NpcywgZGFuIHBlbmdvYmF0YW4gVEIuIFJhaG1hd2F0aSBldCBhbC4gKDIwMjYpIG1lbnVuanVra2FuIGJhaHdhIGluZGlrYXRvciBpbmZyYXN0cnVrdHVyIGtlc2VoYXRhbiBiZXJ1cGEganVtbGFoIGRva3RlciBkYW4ga2VwZXNlcnRhYW4gSktOIGJlcmFzb3NpYXNpIGRlbmdhbiBrYXN1cyBUQiB5YW5nIHRlcmxhcG9ya2FuLiBEZW5nYW4gZGVtaWtpYW4sIGZhc2lsaXRhcyBrZXNlaGF0YW4gZGlwYW5kYW5nIHNlYmFnYWkgcHJva3NpIGthcGFzaXRhcyBzaXN0ZW0ga2VzZWhhdGFuIGRhbGFtIHBlbmdlbmRhbGlhbiBUQi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKipQb3NpdGlmICgrKSoqLiBTZW1ha2luIGJhbnlhayBmYXNpbGl0YXMga2VzZWhhdGFuLCBzZW1ha2luIHRpbmdnaSBrZW1hbXB1YW4gcGVuZW11YW4gZGFuIHBlbGFwb3JhbiBrYXN1cyBUQiAoKmNhc2UgZGV0ZWN0aW9uKikuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQp8ICoqUGVuZHVkdWsgTWlza2luIChY4oKCKSoqICAgICB8IFBlcnNlbnRhc2UgcGVuZHVkdWsgbWlza2luIHBhZGEgc2V0aWFwIGthYnVwYXRlbi9rb3RhLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRmFrdG9yIHNvc2lhbCBla29ub21pIG1lcnVwYWthbiBkZXRlcm1pbmFuIHV0YW1hIFRCLiBTdHVkaSBzcGFzaWFsIGRpIEphd2EgbWVuZW11a2FuIGJhaHdhIGtlbWlza2luYW4gdGVybWFzdWsgZmFrdG9yIHlhbmcgZGlhbmFsaXNpcyBiZXJzYW1hIHByZXZhbGVuc2kgVEIuIFNlbGFpbiBpdHUsIGFuYWxpc2lzIG5hc2lvbmFsIEluZG9uZXNpYSBtZW51bmp1a2thbiBiYWh3YSBmYWt0b3Igc29zaWFsIGVrb25vbWkgYmVyYXNvc2lhc2kgZGVuZ2FuIHZhcmlhc2kgc3Bhc2lhbCBrZWphZGlhbiBUQi4gT2xlaCBrYXJlbmEgaXR1LCB3aWxheWFoIGRlbmdhbiBwcm9wb3JzaSBwZW5kdWR1ayBtaXNraW4geWFuZyBsZWJpaCB0aW5nZ2kgY2VuZGVydW5nIG1lbWlsaWtpIHJpc2lrbyBUQiB5YW5nIGxlYmloIGJlc2FyLiB8ICoqUG9zaXRpZiAoKykqKi4gU2VtYWtpbiB0aW5nZ2kgcHJvcG9yc2kgcGVuZHVkdWsgbWlza2luLCBzZW1ha2luIHRpbmdnaSByaXNpa28ga2VqYWRpYW4gVEIgYWtpYmF0IGtldGVyYmF0YXNhbiBha3NlcyBrZXNlaGF0YW4sIGdpemksIGRhbiBrb25kaXNpIGh1bmlhbiB5YW5nIGt1cmFuZyBsYXlhay4gfA0KfCAqKktlcGFkYXRhbiBQZW5kdWR1ayAoWOKCgykqKiAgfCBKdW1sYWggcGVuZHVkdWsgcGVyIGttwrIgcGFkYSBzZXRpYXAga2FidXBhdGVuL2tvdGEuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBQdXRyYSBldCBhbC4gKDIwMjIpIG1lbmVtdWthbiBiYWh3YSBrZXBhZGF0YW4gcnVtYWggdGFuZ2dhIGJlcmh1YnVuZ2FuIGRlbmdhbiBwcmV2YWxlbnNpIFRCIGRpIFB1bGF1IEphd2EuIFJhaG1hd2F0aSBldCBhbC4gKDIwMjYpIGp1Z2EgbWVudW5qdWtrYW4gYmFod2Ega2VwYWRhdGFuIHBlbmR1ZHVrIG1lbWlsaWtpIHBlbmdhcnVoIHBvc2l0aWYgdGVyaGFkYXAga2FzdXMgVEIgZGFuIG1lbmdoYXNpbGthbiBlZmVrIGxpbXBhaGFuIHNwYXNpYWwgKCpzcGF0aWFsIHNwaWxsb3ZlciopLiBQZW5lbGl0aWFuIGRpIEthYnVwYXRlbiBCZWthc2kganVnYSBtZW51bmp1a2thbiBhZGFueWEgaHVidW5nYW4gc3Bhc2lhbCBhbnRhcmEga2VwYWRhdGFuIHBlbmR1ZHVrIGRhbiBwZXJzZWJhcmFuIGthc3VzIFRCLiAgICAgIHwgKipQb3NpdGlmICgrKSoqLiBTZW1ha2luIHBhZGF0IHN1YXR1IHdpbGF5YWgsIHNlbWFraW4gdGluZ2dpIHBlbHVhbmcga29udGFrIGFudGFyaW5kaXZpZHUgc2VoaW5nZ2EgbWVuaW5na2F0a2FuIHJpc2lrbyBwZW51bGFyYW4gVEIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQp8ICoqQWlyIE1pbnVtIExheWFrIChY4oKEKSoqICAgICB8IFBlcnNlbnRhc2UgcnVtYWggdGFuZ2dhIHlhbmcgbWVtaWxpa2kgYWtzZXMgdGVyaGFkYXAgYWlyIG1pbnVtIGxheWFrLiAgICAgICAgICAgICAgICAgICAgIHwgUmFobWF3YXRpIGV0IGFsLiAoMjAyNikgbWVuZ2d1bmFrYW4gYWtzZXMgYWlyIG1pbnVtIHNlYmFnYWkgc2FsYWggc2F0dSBpbmRpa2F0b3IgaW5mcmFzdHJ1a3R1ciBrZXNlaGF0YW4gZGFsYW0gbW9kZWwgc3Bhc2lhbCBUQi4gVmFyaWFiZWwgaW5pIGRpcGVydGltYmFuZ2thbiBzZWJhZ2FpIGluZGlrYXRvciBrdWFsaXRhcyBsaW5na3VuZ2FuIGRhbiBrZXNlaGF0YW4gbWFzeWFyYWthdCB5YW5nIGRhcGF0IG1lbWVuZ2FydWhpIHJpc2lrbyBwZW55YWtpdCBtZW51bGFyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICoqTmVnYXRpZiAoLSkqKi4gU2VtYWtpbiB0aW5nZ2kgYWtzZXMgYWlyIG1pbnVtIGxheWFrLCBzZW1ha2luIGJhaWsga29uZGlzaSBrZXNlaGF0YW4gbGluZ2t1bmdhbiBzZWhpbmdnYSByaXNpa28gVEIgY2VuZGVydW5nIG1lbnVydW4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KfCAqKlNhbml0YXNpIExheWFrIChY4oKFKSoqICAgICAgfCBQZXJzZW50YXNlIHJ1bWFoIHRhbmdnYSB5YW5nIG1lbWlsaWtpIGFrc2VzIHRlcmhhZGFwIHNhbml0YXNpIGxheWFrLiAgICAgICAgICAgICAgICAgICAgICB8IFJhaG1hd2F0aSBldCBhbC4gKDIwMjYpIG1lbWFzdWtrYW4gc2FuaXRhc2kgc2ViYWdhaSBpbmRpa2F0b3IgaW5mcmFzdHJ1a3R1ciBrZXNlaGF0YW4uIFNlbGFpbiBpdHUsIHN0dWRpIHNwYXNpYWwgVEIgZGkgSmF3YSBCYXJhdCBtZW5nZ3VuYWthbiBpbmRpa2F0b3Igc2FuaXRhc2kgbGluZ2t1bmdhbiBzZWJhZ2FpIGZha3RvciB5YW5nIGRpYW5hbGlzaXMgYmVyc2FtYSBkaXN0cmlidXNpIHNwYXNpYWwgVEIuIFNhbml0YXNpIHlhbmcgYmFpayBkYXBhdCBtZW5ndXJhbmdpIGtlcmVudGFuYW4gbWFzeWFyYWthdCB0ZXJoYWRhcCBiZXJiYWdhaSBwZW55YWtpdCBpbmZla3NpIGRhbiBtZW5jZXJtaW5rYW4ga3VhbGl0YXMgbGluZ2t1bmdhbiB5YW5nIGxlYmloIHNlaGF0LiAgICAgICAgICAgICAgICAgICAgICAgICAgfCAqKk5lZ2F0aWYgKC0pKiouIFNlbWFraW4gdGluZ2dpIGNha3VwYW4gc2FuaXRhc2kgbGF5YWssIHNlbWFraW4gcmVuZGFoIHJpc2lrbyBrZWphZGlhbiBUQiBrYXJlbmEga3VhbGl0YXMgbGluZ2t1bmdhbiB5YW5nIGxlYmloIGJhaWsuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCnwgKipISVYgKFjigoYpKiogICAgICAgICAgICAgICAgIHwgSnVtbGFoIGthc3VzIEhJViBwYWRhIHNldGlhcCBrYWJ1cGF0ZW4va290YS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBISVYgbWVydXBha2FuIGZha3RvciByaXNpa28gdXRhbWEgVEIga2FyZW5hIG1lbnllYmFia2FuIHBlbnVydW5hbiBzaXN0ZW0gaW11biBzZWhpbmdnYSBtZW5pbmdrYXRrYW4gcmlzaWtvIGJlcmtlbWJhbmdueWEgaW5mZWtzaSBUQiBha3RpZi4gS2FqaWFuIHNpc3RlbWF0aXMgbWV0b2RlIGFuYWxpc2lzIHNwYXNpYWwgVEIgbWVudW5qdWtrYW4gYmFod2EgYmFueWFrIHBlbmVsaXRpYW4gdGVsYWggbWVuZ2FuYWxpc2lzIGh1YnVuZ2FuIHNwYXNpYWwgYW50YXJhIFRCIGRhbiBISVYuIE9sZWgga2FyZW5hIGl0dSwgd2lsYXlhaCBkZW5nYW4ganVtbGFoIGthc3VzIEhJViB5YW5nIGxlYmloIHRpbmdnaSBiZXJwb3RlbnNpIG1lbWlsaWtpIGJlYmFuIFRCIHlhbmcgbGViaWggYmVzYXIuICAgICAgICAgICAgICAgICAgIHwgKipQb3NpdGlmICgrKSoqLiBTZW1ha2luIHRpbmdnaSBqdW1sYWgga2FzdXMgSElWLCBzZW1ha2luIHRpbmdnaSByaXNpa28gVEIga2FyZW5hIG1lbmluZ2thdG55YSBrZXJlbnRhbmFuIHRlcmhhZGFwIGluZmVrc2kgb3BvcnR1bmlzdGlrLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQp8ICoqSnVtbGFoIFBlbmR1ZHVrKiogICAgICAgICAgfCBKdW1sYWggcGVuZHVkdWsgcGFkYSBzZXRpYXAga2FidXBhdGVuL2tvdGEuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IERpZ3VuYWthbiBzZWJhZ2FpIHBvcHVsYXNpIGJlcmlzaWtvICgqcG9wdWxhdGlvbiBhdCByaXNrKikgZGFsYW0gcGVyaGl0dW5nYW4gaW5jaWRlbmNlIHJhdGUgVEIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBUaWRhayBkaWFuYWxpc2lzIHNlYmFnYWkgdmFyaWFiZWwgcHJlZGlrdG9yLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCg0KKipTdW1iZXIgRGF0YToqKiBCYWRhbiBQdXNhdCBTdGF0aXN0aWsgUHJvdmluc2kgSmF3YSBCYXJhdCBkYW4gUG9ydGFsIE9wZW4gRGF0YSBKYWJhci4NCg0KDQojIyAyLjIgTWV0b2RlIEFuYWxpc2lzDQojIyMgMi4yLjEgQW5hbGlzaXMgRGVza3JpcHRpZiBkYW4gSW5jaWRhbmNlIFJhdGUNCg0KQW5hbGlzaXMgZGVza3JpcHRpZiBkaWxha3VrYW4gdW50dWsgbWVtYmVyaWthbiBnYW1iYXJhbiB1bXVtIG1lbmdlbmFpIGRpc3RyaWJ1c2kga2FzdXMgVHViZXJrdWxvc2lzIChUQikgcGFkYSBzZXRpYXAga2FidXBhdGVuL2tvdGEgZGkgUHJvdmluc2kgSmF3YSBCYXJhdCBUYWh1biAyMDI1LiBJbmNpZGFuY2UgUmF0ZSBzZWJhZ2FpIHVrdXJhbiBlcGlkZW1pb2xvZ2kgZGlndW5ha2FuIHVudHVrIG1lbmd1a3VyIGZyZWt1ZW5zaSBrYXN1cyBiYXJ1IFRCIHlhbmcgdGVyamFkaSBkYWxhbSBwb3B1bGFzaSBiZXJpc2lrbyBzZWxhbWEgcGVyaW9kZSB3YWt0dSB0ZXJ0ZW50dSBkaSB3aWxheWFoIHRlcnRlbnR1LiBGb3JtdWxhIHBlbmdoaXR1bmdhbiBJUiBkYWxhbSBwZW5lbGl0aWFuIGluaSBkZW5nYW4gcGVyIDEwMC4wMDAgcGVuZHVkdWsgZGlydW11c2thbiBzZWJhZ2FpIGJlcmlrdXQ6DQoNCiQkDQpJUl9pID0gXGZyYWN7VEJfaX17XHRleHR7SnVtbGFoIFBlbmR1ZHVrfV9pfSBcdGltZXMgMTAwLjAwMA0KJCQNCg0KDQpEZW5nYW46DQoNCiRJUl9pJAkJCTogIGp1bWxhaCBrYXN1cyBUQiBwYWRhIGthYnVwYXRlbi9rb3RhIGkuDQoNCiR7XHRleHR7SnVtbGFoIFBlbmR1ZHVrfV9pfSQJOiBqdW1sYWggcG9wdWxhc2kgZGkgd2lsYXlhaCBpLg0KDQoNCiMjIyAyLjIuMyBNYXRyaWsgUGVtYm9ib3QgU3Bhc2lhbA0KDQpgYGB7ciB9DQpuYiA8LSBwb2x5Mm5iKA0KICBqYWJhcl90YiwNCiAgcXVlZW4gPSBUUlVFDQopDQoNCmx3IDwtIG5iMmxpc3R3KA0KICBuYiwNCiAgc3R5bGUgPSAiVyIsDQogIHplcm8ucG9saWN5ID0gVFJVRQ0KKQ0KYGBgDQoNCkJlcmRhc2Fya2FuIGtyaXRlcmlhIFF1ZWVuIENvbnRpZ3VpdHksIGR1YSB3aWxheWFoIHNwYXNpYWwgaSBkYW4gaiBkaW55YXRha2FuIHNhbGluZyBiZXJ0ZXRhbmdnYSBqaWthIGtlZHVhbnlhIGJlcmJhZ2kgYmF0YXMgd2lsYXlhaCBiZXJzYW1hLCBiYWlrIGJlcnVwYSBwZXJzaW5nZ3VuZ2FuIGdhcmlzIChlZGdlKSBtYXVwdW4gdGl0aWsgc3VkdXQgKHZlcnRleCkuIFNlY2FyYSBtYXRlbWF0aXMsIGVsZW1lbiBtYXRyaWtzIGtldGV0YW5nZ2FhbiBhd2FsICR3X3tpan0kIGRpZGVmaW5pc2lrYW4gc2ViYWdhaSBiZXJpa3V0Og0KDQokJA0Kd197aWp9ID0NClxiZWdpbntjYXNlc30NCjEsICYgXHRleHR7amlrYSB3aWxheWFoIH0gaSBcdGV4dHsgZGFuIH0gaiBcdGV4dHsgYmVyYmFnaSBiYXRhcyBnYXJpcyBhdGF1IHRpdGlrfSwgXFwNCjAsICYgXHRleHR7amlrYSB3aWxheWFoIH0gaSBcdGV4dHsgZGFuIH0gaiBcdGV4dHsgdGlkYWsgYmVyYmFnaSBiYXRhcyBsYW5nc3VuZyBhdGF1IH0gaT1qLg0KXGVuZHtjYXNlc30NCiQkDQpEaW1hbmEgZWxlbWVuIHBlbWJvYm90IHNwYXNpYWwgdGVyc3RhbmRhcmRpc2FzaSBiYXJpcyAkd197aWp9JCBkaWhpdHVuZyBkZW5nYW4gbWVtYmFnaSBzZXRpYXAgZWxlbWVuIGJpbmVyIGRlbmdhbiB0b3RhbCBqdW1sYWggdGV0YW5nZ2EgcGFkYSBiYXJpcyB0ZXJzZWJ1dC4gVHJhbnNmb3JtYXNpIGluaSBtZW5ndWJhaCBpbnRlcnByZXRhc2kgZWZlayBzcGFzaWFsIG1lbmphZGkgbmlsYWkgcmF0YS1yYXRhIHNwYXNpYWwgKHNwYXRpYWwgbGFnKSBkYXJpIGthcmFrdGVyaXN0aWsgd2lsYXlhaC13aWxheWFoIHRldGFuZ2dhbnlhOg0KDQokJA0KV197aWp9ID0gXGZyYWN7d197aWp9fXtcc3VtX3tqPTF9XntufSB3X3tpan19DQokJA0KCQ0KIyMjIDIuMi4zIE1vZGVsIE9MUw0KTW9kZWwgT0xTIGRpZ3VuYWthbiBzZWJhZ2FpIG1vZGVsIGJhc2VsaW5lIHVudHVrIG1lbmdlc3RpbWFzaSBodWJ1bmdhbiBsaW5lYXIgZ2xvYmFsIGFudGFyYSB2YXJpYWJlbCBpbmRlcGVuZGVuIGRhbiBJbmNpZGVuY2UgUmF0ZSBUQiB0YW5wYSBtZW1wZXJoaXR1bmdrYW4gYXNwZWsgbG9rYXNpLiBQZXJzYW1hYW4gcmVncmVzaSBsaW5lYXIgYmVyZ2FuZGEgT0xTIGRhbGFtIHBlbmVsaXRpYW4gaW5pIGRpcnVtdXNrYW4gc2ViYWdhaSBiZXJpa3V0Og0KDQokJFlpPc6yXzAgK86yXzEgWF8xaSArzrJfMiBYX3syaX0gK86yXzMgWF97M2l9ICvOsl80IFhfezRpfSvOsl81IFhfezVpfSArzrJfNiBYX3s2aX0gK861X2kgJCQNCkRlbmdhbjoNCg0KJFlfaSQJOiBJbmNpZGFuY2UgUmF0ZSBrYXN1cyBUQiANCg0KJM6yXzAkCTogS29uc3RhbnRhIChuaWxhaSBwYXJhbWV0ZXIgaW50ZXJjZXB0KS4NCg0KJM6yXzEs4oCmLM6yXzYkIDogS29lZmlzaWVuIHJlZ3Jlc2kgbWFzaW5nLW1hc2luZyB2YXJpYWJlbCBpbmRlcGVuZGVuIGxva2FsLg0KDQokWCQJOiBWYXJpYWJlbCBQcmVkaWt0b3INCg0KJM61X2kkCTogZ2FsYXQgeWFuZyBkaWFzdW1zaWthbiBiZXJkaXN0cmlidXNpIG5vcm1hbA0KDQojIyMgMi4yLjQgU3Bhc2lhbCBMYWcgWA0KDQpNb2RlbCBTcGF0aWFsIExhZyBYIChTTFgpIG1lcnVwYWthbiBwZW5nZW1iYW5nYW4gZGFyaSBtb2RlbCBPTFMga29udmVuc2lvbmFsIGRlbmdhbiBtZW5hbWJhaGthbiB2YXJpYWJlbCBwZW5qZWxhcyB5YW5nIHRlbGFoIGRpdHJhbnNmb3JtYXNpa2FuIG1lbmdndW5ha2FuIG1hdHJpa3MgcGVtYm9ib3Qgc3Bhc2lhbCAoc3BhdGlhbCBsYWcgb2YgZXhvZ2Vub3VzIHZhcmlhYmxlcykuIE1vZGVsIGluaSBkaWd1bmFrYW4gdW50dWsgbWVuYW5na2FwIGVmZWsgbGltcGFoYW4gKHNwaWxsb3ZlciBlZmZlY3QpLCB5YWl0dSBrb25kaXNpIGRpIG1hbmEgdmFyaWFiZWwgdGVyaWthdCAoWSkgZGkgc3VhdHUgd2lsYXlhaCB0aWRhayBoYW55YSBkaXBlbmdhcnVoaSBvbGVoIGthcmFrdGVyaXN0aWsgaW50ZXJuYWwgd2lsYXlhaCBpdHUgc2VuZGlyaSAoWCksIG1lbGFpbmthbiBqdWdhIGRpcGVuZ2FydWhpIG9sZWgga2FyYWt0ZXJpc3RpayB3aWxheWFoLXdpbGF5YWggdGV0YW5nZ2EgeWFuZyBiZXJiYXRhc2FuIGxhbmdzdW5nIChXWCkuDQoNClNlY2FyYSBtYXRlbWF0aXMsIHBlcnNhbWFhbiBtb2RlbCBTTFggdW50dWsgSW5jaWRlbmNlIFJhdGUga2FzdXMgVEIgZGkgMjcga2FidXBhdGVuL2tvdGEgUHJvdmluc2kgSmF3YSBCYXJhdCBkaXJ1bXVza2FuIHNlYmFnYWkgYmVyaWt1dDoNCg0KJCQNCllfaSA9IFxiZXRhXzAgKw0KXHN1bV97az0xfV57Nn0gXGJldGFfayBYX3traX0gKw0KXHN1bV97az0xfV57Nn0gXGdhbW1hX2sgXHN1bV97aj0xfV57bn0gV197aWp9IFhfe2tqfQ0KKyBcdmFyZXBzaWxvbl9pDQokJA0KDQpEZW5nYW46DQoNCiRZX2kkCTogSW5jaWRlbmNlIFJhdGUgVEIgcGFkYSB3aWxheWFoIGtlLWkuDQoNCiRYX3traX0kCTogdmFyaWFiZWwgaW5kZXBlbmRlbiBsb2thbC4NCg0KJFdYKV97a2l9JDogVmFyaWFiZWwgYmViYXMgeWFuZyB0ZWxhaCBkaWJlcmkgYm9ib3Qgc3Bhc2lhbCAoU3Bhc2lhbCBMYWcgWCkuDQoNCiTOsl9rJAk6IFBhcmFtZXRlciBrb2VmaXNpZW4gcmVncmVzaSB1bnR1ayB2YXJpYWJlbCBiZWJhcyBsb2thbA0KDQokXGdhbW1hX2skOiBQZW5nYXJ1aCB0aWRhayBsYW5nc3VuZyAoc3BpbGxvdmVyIGVmZmVjdCkgZGFyaSB3aWxheWFoIHRldGFuZ2dhLiANCg0KJFxlcHNpbG9uX2kkCTogZ2FsYXQgbW9kZWwuDQoNCg0KIyAzLiBIYXNpbCBkYW4gUGVtYmFoYXNhbiANCiMjIDMuMSBBbmFsaXNpcyBEZXNrcmlwdGlmIGRhbiBQZXRhIElSDQoNCg0KPGRpdiBhbGlnbj0iY2VudGVyIj4NCioqVGFiZWwgMi4qKiBTdGF0aXN0aWsgRGVza3JpcHRpZiANCjwvZGl2Pg0KDQoNCg0KYGBge3J9DQp2YXJzIDwtIGphYmFyX3RiICU+JQ0KICBzdF9kcm9wX2dlb21ldHJ5KCkgJT4lDQogIGRwbHlyOjpzZWxlY3QoDQogICAgVEIsDQogICAgaW5jaWRlbmNlX3JhdGVfVEIsDQogICAgZmFza2VzLA0KICAgIHBlbmR1ZHVrX21pc2tpbiwNCiAgICBrZXBhZGF0YW4sDQogICAgYWlyX21pbnVtLA0KICAgIHNhbml0YXNpLA0KICAgIGhpdg0KICApICU+JQ0KICBtdXRhdGUoYWNyb3NzKGV2ZXJ5dGhpbmcoKSwgYXMubnVtZXJpYykpDQoNCmRlc2NfdGFibGUgPC0gZGF0YS5mcmFtZSgNCiAgVmFyaWFiZWwgPSBjKA0KICAgICJUQiIsDQogICAgIkluY2lkZW5jZSBSYXRlIFRCIiwNCiAgICAiRmFza2VzIiwNCiAgICAiUGVuZHVkdWsgTWlza2luIiwNCiAgICAiS2VwYWRhdGFuIiwNCiAgICAiQWlyIE1pbnVtIExheWFrIiwNCiAgICAiU2FuaXRhc2kgTGF5YWsiLA0KICAgICJISVYiDQogICksDQogIE1lYW4gPSBzYXBwbHkodmFycywgbWVhbiwgbmEucm0gPSBUUlVFKSwNCiAgU0QgPSBzYXBwbHkodmFycywgc2QsIG5hLnJtID0gVFJVRSksDQogIFZhcmlhbnMgPSBzYXBwbHkodmFycywgdmFyLCBuYS5ybSA9IFRSVUUpLA0KICBNaW4gPSBzYXBwbHkodmFycywgbWluLCBuYS5ybSA9IFRSVUUpLA0KICBNYXggPSBzYXBwbHkodmFycywgbWF4LCBuYS5ybSA9IFRSVUUpDQopDQoNCg0Ka25pdHI6OmthYmxlKCBkZXNjX3RhYmxlLCBkaWdpdHMgPSA0KQ0KYGBgDQoNCg0KQmVyZGFzYXJrYW4gaGFzaWwgc3RhdGlzdGlrIGRlc2tyaXB0aWYsIHRlcmxpaGF0IGJhaHdhIGp1bWxhaCBrYXN1cyBUdWJlcmt1bG9zaXMgKFRCKSBkaSBKYXdhIEJhcmF0IG1lbWlsaWtpIG5pbGFpIHJhdGEtcmF0YSBzZWJlc2FyIDguMzQ3LDc0IGthc3VzIGRlbmdhbiB2YXJpYXNpIHlhbmcgY3VrdXAgdGluZ2dpIGFudGFyIHdpbGF5YWgsIHlhbmcgZGl0dW5qdWtrYW4gb2xlaCBzdGFuZGFyIGRldmlhc2kgc2ViZXNhciA2LjA0NiwzMi4gU2VtZW50YXJhIGl0dSwgaW5jaWRlbmNlIHJhdGUgVEIgbWVtaWxpa2kgcmF0YS1yYXRhIDQ4Niw3OSBwZXIgMTAwLjAwMCBwZW5kdWR1ayBkZW5nYW4gcmVudGFuZyBuaWxhaSB5YW5nIGN1a3VwIGxlYmFyLCBtZW51bmp1a2thbiBhZGFueWEga2V0aW1wYW5nYW4gYmViYW4gcGVueWFraXQgYW50YXIga2FidXBhdGVuL2tvdGEuDQoNClVudHVrIHZhcmlhYmVsIGluZGVwZW5kZW4sIGtvbmRpc2kgc29zaWFsIGVrb25vbWkgZGFuIGtlc2VoYXRhbiBqdWdhIG1lbnVuanVra2FuIHZhcmlhc2kgYW50YXIgd2lsYXlhaC4gVmFyaWFiZWwga2VwYWRhdGFuIHBlbmR1ZHVrIG1lbWlsaWtpIHNlYmFyYW4geWFuZyBwYWxpbmcgdGluZ2dpIGRpYmFuZGluZyB2YXJpYWJlbCBsYWluLCBzZWRhbmdrYW4gdmFyaWFiZWwgc2VwZXJ0aSBha3NlcyBhaXIgbWludW0gbGF5YWsgcmVsYXRpZiBsZWJpaCBob21vZ2VuIGRlbmdhbiBuaWxhaSB5YW5nIG1lbmRla2F0aSAxMDAlIGRpIHNlYmFnaWFuIGJlc2FyIHdpbGF5YWguIFNlY2FyYSB1bXVtLCBoYXNpbCBpbmkgbWVudW5qdWtrYW4gYWRhbnlhIGhldGVyb2dlbml0YXMga29uZGlzaSBhbnRhciB3aWxheWFoIGRpIEphd2EgQmFyYXQsIHlhbmcgbWVuZ2luZGlrYXNpa2FuIHBvdGVuc2kgYWRhbnlhIHBlcmJlZGFhbiByaXNpa28gVHViZXJrdWxvc2lzIGFudGFyIGRhZXJhaC4NCg0KDQpgYGB7ciB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFfQ0KDQp0bV9zaGFwZShqYWJhcl90YikgKw0KICB0bV9wb2x5Z29ucygNCiAgICAiaW5jaWRlbmNlX3JhdGVfVEIiLA0KICAgIHBhbGV0dGUgPSAiUmVkcyIsDQogICAgdGl0bGUgPSAiSW5jaWRlbmNlIFJhdGUgVEIiDQogICkgKw0KICB0bV90ZXh0KA0KICAgIHRleHQgPSAiV0FETUtLIiwNCiAgICBzaXplID0gMC41DQogICkgKw0KICB0bV9sYXlvdXQoDQogICAgbGVnZW5kLm91dHNpZGUgPSBUUlVFDQogICkNCmBgYA0KDQoNCjxkaXYgYWxpZ249ImNlbnRlciI+DQoqKkdhbWJhciAxLioqIFZpc3VhbGlzYXNpIFBldGEgSW5jaWRhbmNlIFJhdGUgVEIgDQo8L2Rpdj4NCiANClNlYmFnaWFuIGJlc2FyIHdpbGF5YWggZGkgSmF3YSBCYXJhdCBiZXJhZGEgcGFkYSBrYXRlZ29yaSBpbmNpZGVuY2UgcmF0ZSAoSVIpIHJlbmRhaCBoaW5nZ2Egc2VkYW5nICgyMDDigJM1OTkgcGVyIDEwMC4wMDAgcGVuZHVkdWspIHlhbmcgdGVyc2ViYXIgZGkgYmVyYmFnYWkgd2lsYXlhaCBiYXJhdCwgc2VsYXRhbiwgZGFuIHRpbXVyLiBTZW1lbnRhcmEgaXR1LCB3aWxheWFoIGRlbmdhbiBJUiB0aW5nZ2kgaGluZ2dhIHNhbmdhdCB0aW5nZ2kgKD42MDAgcGVyIDEwMC4wMDAgcGVuZHVkdWspIGNlbmRlcnVuZyBtZW1iZW50dWsgcG9sYSB0ZXJsb2thbGlzYXNpIHBhZGEgYmViZXJhcGEgd2lsYXlhaCBwZXJrb3RhYW4geWFuZyBwYWRhdCBwZW5kdWR1ay4gSGFsIGluaSBtZW51bmp1a2thbiBhZGFueWEga29uc2VudHJhc2kga2FzdXMgVEIgcGFkYSB3aWxheWFoIGRlbmdhbiBrYXJha3RlcmlzdGlrIHVyYmFuIGRhbiBrZXBhZGF0YW4gdGluZ2dpLg0KDQojIyAzLjIgVWppIEF1dG9rb3JlbGFzaSBTcGFzaWFsIA0KDQo8ZGl2IGFsaWduPSJjZW50ZXIiPg0KKipUYWJlbCAzLioqICBIYXNpbCBVamkgQXV0b2tvcmVsYXNpIFNwYXNpYWwNCjwvZGl2Pg0KDQpgYGB7cn0NCnZhcl9saXN0IDwtIGMoICJpbmNpZGVuY2VfcmF0ZV9UQiIsICJmYXNrZXMiLCAicGVuZHVkdWtfbWlza2luIiwgImtlcGFkYXRhbiIsICJhaXJfbWludW0iLCAic2FuaXRhc2kiLCAiaGl2IiApDQoNCm5hbWFfdmFyaWFiZWwgPC0gYyggIkluY2lkZW5jZSBSYXRlIChUQikiLCAiRmFza2VzIiwgIlBlbmR1ZHVrIE1pc2tpbiIsICJLZXBhZGF0YW4gUGVuZHVkdWsiLCAiQWlyIE1pbnVtIExheWFrIiwgIlNhbml0YXNpIExheWFrIiwgIkhJViIgKQ0KDQptb3Jhbl9zdW1tYXJ5IDwtIGRhdGEuZnJhbWUoIFZhcmlhYmVsID0gbmFtYV92YXJpYWJlbCwgTW9yYW5fSSA9IE5BLCBFeHBlY3RhdGlvbiA9IE5BLCBWYXJpYW5jZSA9IE5BLCBaX3Njb3JlID0gTkEsIHBfdmFsdWUgPSBOQSApDQoNCmZvcihpIGluIHNlcV9hbG9uZyh2YXJfbGlzdCkpIHsgeCA8LSBzY2FsZShqYWJhcl90YltbdmFyX2xpc3RbaV1dXSlbLDFdIA0KDQptb3Jhbl9yZXN1bHQgPC0gbW9yYW4udGVzdCggeCwgbHcsIHplcm8ucG9saWN5ID0gVFJVRSApIA0KDQptb3Jhbl9zdW1tYXJ5JE1vcmFuX0lbaV0gPC0gbW9yYW5fcmVzdWx0JGVzdGltYXRlWzFdIA0KDQptb3Jhbl9zdW1tYXJ5JEV4cGVjdGF0aW9uW2ldIDwtIG1vcmFuX3Jlc3VsdCRlc3RpbWF0ZVsyXSANCg0KbW9yYW5fc3VtbWFyeSRWYXJpYW5jZVtpXSA8LSBtb3Jhbl9yZXN1bHQkZXN0aW1hdGVbM10gDQoNCm1vcmFuX3N1bW1hcnkkWl9zY29yZVtpXSA8LSB1bm5hbWUobW9yYW5fcmVzdWx0JHN0YXRpc3RpYykgDQoNCm1vcmFuX3N1bW1hcnkkcF92YWx1ZVtpXSA8LSBtb3Jhbl9yZXN1bHQkcC52YWx1ZX0gDQoNCmtuaXRyOjprYWJsZSggbW9yYW5fc3VtbWFyeSwgZGlnaXRzID0gNCkNCmBgYA0KDQoNCg0KDQpCZXJkYXNhcmthbiBoYXNpbCB1amkgTW9yYW7igJlzIEkgcGFkYSBtYXNpbmctbWFzaW5nIHZhcmlhYmVsLCBkaXRlbXVrYW4gYmFod2Egc2ViYWdpYW4gYmVzYXIgdmFyaWFiZWwgaW5kZXBlbmRlbiBtZW51bmp1a2thbiBhZGFueWEgYXV0b2tvcmVsYXNpIHNwYXNpYWwgeWFuZyBzaWduaWZpa2FuLiBWYXJpYWJlbCBwZW5kdWR1ayBtaXNraW4sIGtlcGFkYXRhbiBwZW5kdWR1aywgYWtzZXMgYWlyIG1pbnVtIGxheWFrLCBzYW5pdGFzaSBsYXlhaywgZGFuIGp1bWxhaCBrYXN1cyBISVYgbWVtaWxpa2kgbmlsYWkgTW9yYW7igJlzIEkgcG9zaXRpZiBkYW4gc2lnbmlmaWthbiAocCA8IDAsMDUpLCB5YW5nIG1lbnVuanVra2FuIGFkYW55YSBwb2xhIHBlbmdlbG9tcG9rYW4gc3Bhc2lhbCAoY2x1c3RlcmVkKSBhbnRhciB3aWxheWFoIGRpIEphd2EgQmFyYXQuIFNlYmFsaWtueWEsIHZhcmlhYmVsIGluY2lkZW5jZSByYXRlIFR1YmVya3Vsb3NpcyBkYW4ganVtbGFoIGZhc2lsaXRhcyBrZXNlaGF0YW4gKGZhc2tlcykgdGlkYWsgbWVudW5qdWtrYW4gYXV0b2tvcmVsYXNpIHNwYXNpYWwgeWFuZyBzaWduaWZpa2FuIChwID4gMCwwNSksIHNlaGluZ2dhIGRpc3RyaWJ1c2lueWEgY2VuZGVydW5nIGFjYWsgc2VjYXJhIHNwYXNpYWwgZGFuIHRpZGFrIG1lbWJlbnR1ayBwb2xhIHBlbmdlbG9tcG9rYW4geWFuZyBqZWxhcyBhbnRhciB3aWxheWFoLg0KDQojIyAzLjMgIE1vZGVsIE9MUyANCg0KSGFzaWwgZXN0aW1hc2kgcGFyYW1ldGVyIG1lbmdndW5ha2FuIG1ldG9kZSBPcmRpbmFyeSBMZWFzdCBTcXVhcmVzIChPTFMpIGRpc2FqaWthbiBwYWRhIFRhYmVsIDUgYmVyaWt1dDoNCg0KDQo8ZGl2IGFsaWduPSJjZW50ZXIiPg0KKipUYWJlbCA0LioqICBIYXNpbCBFc3RpbWFzaSBNb2RlbCBPTFMNCjwvZGl2Pg0KDQpgYGB7cn0NCm9sc19tb2RlbCA8LSBsbSgNCiAgaW5jaWRlbmNlX3JhdGVfVEIgfg0KICAgIGZhc2tlcyArDQogICAgcGVuZHVkdWtfbWlza2luICsNCiAgICBrZXBhZGF0YW4gKw0KICAgIGFpcl9taW51bSArDQogICAgc2FuaXRhc2kgKw0KICAgIGhpdiwNCiAgZGF0YSA9IGphYmFyX3RiDQopDQoNCm9sc19jb2VmIDwtIHN1bW1hcnkob2xzX21vZGVsKSRjb2VmZmljaWVudHMNCg0Kb2xzX3RhYmxlIDwtIGRhdGEuZnJhbWUoDQogIFZhcmlhYmVsID0gcm93bmFtZXMob2xzX2NvZWYpLA0KICBLb2VmaXNpZW4gPSBvbHNfY29lZlssIDFdLA0KICBTdGRfRXJyb3IgPSBvbHNfY29lZlssIDJdLA0KICB0X3ZhbHVlID0gb2xzX2NvZWZbLCAzXSwNCiAgcF92YWx1ZSA9IG9sc19jb2VmWywgNF0NCikNCg0Ka25pdHI6OmthYmxlKA0KICBvbHNfdGFibGUsDQogIGRpZ2l0cyA9IDQpDQpgYGANCg0KQmVyZGFzYXJrYW4gaGFzaWwgT0xTLCB2YXJpYWJlbCBpbmRlcGVuZGVuIHNlY2FyYSBzaW11bHRhbiBiZXJwZW5nYXJ1aCBzaWduaWZpa2FuIHRlcmhhZGFwIGluY2lkZW5jZSByYXRlIFRCIChwID0gMCwwMjA3OCksIG5hbXVuIHNlY2FyYSBwYXJzaWFsIHRpZGFrIGRpdGVtdWthbiBwZW5nYXJ1aCB5YW5nIHNpZ25pZmlrYW4gKHAgPiAwLDA1KS4gTW9kZWwgbWFtcHUgbWVuamVsYXNrYW4gc2VraXRhciA0OSw1NSUgdmFyaWFzaSBpbmNpZGVuY2UgcmF0ZSAoUsKyID0gMCw0OTU1KSwgZGVuZ2FuIG5pbGFpIEFkanVzdGVkIFLCsiBzZWJlc2FyIDAsMzQ0Mi4gU2VjYXJhIHVtdW0sIGhhc2lsIGluaSBtZW51bmp1a2thbiBiYWh3YSBtb2RlbCBtYXNpaCB0ZXJiYXRhcyBkYWxhbSBtZW5qZWxhc2thbiB2YXJpYXNpIFRCIHNlaGluZ2dhIGRpcGVybHVrYW4gcGVuZGVrYXRhbiBzcGFzaWFsIHVudHVrIG1lbmFuZ2thcCBrZXRlcmthaXRhbiBhbnRhciB3aWxheWFoLg0KDQojIyAzLjQgRGlhZ25vc3RpayBNb2RlbCBPTFMNCg0KVGFiZWwgNS4gRGlhZ25vc3RpayBNb2RlbCBPTFMgDQo8ZGl2IGFsaWduPSJjZW50ZXIiPg0KKipUYWJlbCA1LioqICBEaWFnbm9zdGlrIE1vZGVsDQo8L2Rpdj4NCg0KYGBge3J9DQpqYWJhcl90YiRyZXNpZHVhbF9vbHMgPC0gcmVzaWR1YWxzKG9sc19tb2RlbCkNCg0KIyBWSUYNCnZpZl92YWx1ZXMgPC0gdmlmKG9sc19tb2RlbCkNCg0KIyBVamkgZGlhZ25vc3Rpaw0Kc2hhcGlyb19yZXMgPC0gc2hhcGlyby50ZXN0KGphYmFyX3RiJHJlc2lkdWFsX29scykNCmJwX3JlcyA8LSBicHRlc3Qob2xzX21vZGVsKQ0KZHdfcmVzIDwtIGR3dGVzdChvbHNfbW9kZWwpDQoNCm1vcmFuX3Jlc2lkdWFsIDwtIG1vcmFuLnRlc3QoDQogIGphYmFyX3RiJHJlc2lkdWFsX29scywNCiAgbHcsDQogIHplcm8ucG9saWN5ID0gVFJVRQ0KKQ0KDQpkaWFnbm9zdGljX3RhYmxlIDwtIGRhdGEuZnJhbWUoDQogIFVqaSA9IGMoDQogICAgcGFzdGUoIlZJRiDigJMiLCBuYW1lcyh2aWZfdmFsdWVzKSksDQogICAgIk5vcm1hbGl0YXMgUmVzaWR1YWwgKFNoYXBpcm8tV2lsaykiLA0KICAgICJIZXRlcm9za2VkYXN0aXNpdGFzIChCcmV1c2NoLVBhZ2FuKSIsDQogICAgIkF1dG9rb3JlbGFzaSAoRHVyYmluLVdhdHNvbikiLA0KICAgICJBdXRva29yZWxhc2kgU3Bhc2lhbCBSZXNpZHVhbCAoTW9yYW4ncyBJKSINCiAgKSwNCiAgTmlsYWkgPSBjKA0KICAgIGFzLm51bWVyaWModmlmX3ZhbHVlcyksDQogICAgc2hhcGlyb19yZXMkc3RhdGlzdGljLA0KICAgIGJwX3JlcyRzdGF0aXN0aWMsDQogICAgZHdfcmVzJHN0YXRpc3RpYywNCiAgICBtb3Jhbl9yZXNpZHVhbCRlc3RpbWF0ZVsxXQ0KICApLA0KICBwX3ZhbHVlID0gYygNCiAgICByZXAoTkEsIGxlbmd0aCh2aWZfdmFsdWVzKSksDQogICAgc2hhcGlyb19yZXMkcC52YWx1ZSwNCiAgICBicF9yZXMkcC52YWx1ZSwNCiAgICBkd19yZXMkcC52YWx1ZSwNCiAgICBtb3Jhbl9yZXNpZHVhbCRwLnZhbHVlDQogICkNCikNCg0Ka25pdHI6OmthYmxlKA0KICBkaWFnbm9zdGljX3RhYmxlLA0KICBkaWdpdHMgPSA0DQopDQpgYGANCg0KDQpIYXNpbCBkaWFnbm9zdGlrIG1vZGVsIE9MUyBtZW51bmp1a2thbiBiYWh3YSBzZWx1cnVoIGFzdW1zaSBrbGFzaWsgdGVycGVudWhpLCB5YWl0dSB0aWRhayB0ZXJkYXBhdCBtdWx0aWtvbGluZWFyaXRhcywgaGV0ZXJvc2tlZGFzdGlzaXRhcywgbWF1cHVuIGF1dG9rb3JlbGFzaSByZXNpZHVhbCBzZWNhcmEgdGVtcG9yYWwuIE5hbXVuLCB1amkgTW9yYW7igJlzIEkgcGFkYSByZXNpZHVhbCBtZW51bmp1a2thbiBhZGFueWEgYXV0b2tvcmVsYXNpIHNwYXNpYWwgeWFuZyBzaWduaWZpa2FuIChJID0gMCwyNTczOyBwID0gMCwwMTc2KSwgeWFuZyBtZW5naW5kaWthc2lrYW4gYmFod2EgcmVzaWR1YWwgbWFzaWggbWVtaWxpa2kgcG9sYSBrZXRlcmdhbnR1bmdhbiBhbnRhciB3aWxheWFoLiBUZW11YW4gaW5pIG1lbnVuanVra2FuIGJhaHdhIG1vZGVsIE9MUyBiZWx1bSBtYW1wdSBtZW5hbmdrYXAgZWZlayBzcGFzaWFsLCBzZWhpbmdnYSBkaXBlcmx1a2FuIHBlbmRla2F0YW4gbW9kZWwgc3Bhc2lhbCBzZXBlcnRpIFNMWCB1bnR1ayBtZW5nYWtvbW9kYXNpIGtldGVya2FpdGFuIGFudGFyIHdpbGF5YWguDQoNCg0KIyMgMy41IE1vZGVsIFNMWA0KDQoNCjxkaXYgYWxpZ249ImNlbnRlciI+DQoqKlRhYmVsIDUuKiogIEhhc2lsIEVzdGltYXNpIE1vZGVsIFNMWCANCjwvZGl2Pg0KDQpgYGB7cn0NCmphYmFyX3RiJGxhZ19mYXNrZXMgPC0gbGFnLmxpc3R3KA0KICBsdywgamFiYXJfdGIkZmFza2VzLA0KICB6ZXJvLnBvbGljeSA9IFRSVUUNCikNCg0KamFiYXJfdGIkbGFnX3BlbmR1ZHVrX21pc2tpbiA8LSBsYWcubGlzdHcoDQogIGx3LCBqYWJhcl90YiRwZW5kdWR1a19taXNraW4sDQogIHplcm8ucG9saWN5ID0gVFJVRQ0KKQ0KDQpqYWJhcl90YiRsYWdfa2VwYWRhdGFuIDwtIGxhZy5saXN0dygNCiAgbHcsIGphYmFyX3RiJGtlcGFkYXRhbiwNCiAgemVyby5wb2xpY3kgPSBUUlVFDQopDQoNCmphYmFyX3RiJGxhZ19haXJfbWludW0gPC0gbGFnLmxpc3R3KA0KICBsdywgamFiYXJfdGIkYWlyX21pbnVtLA0KICB6ZXJvLnBvbGljeSA9IFRSVUUNCikNCg0KamFiYXJfdGIkbGFnX3Nhbml0YXNpIDwtIGxhZy5saXN0dygNCiAgbHcsIGphYmFyX3RiJHNhbml0YXNpLA0KICB6ZXJvLnBvbGljeSA9IFRSVUUNCikNCg0KamFiYXJfdGIkbGFnX2hpdiA8LSBsYWcubGlzdHcoDQogIGx3LCBqYWJhcl90YiRoaXYsDQogIHplcm8ucG9saWN5ID0gVFJVRQ0KKQ0KDQpzbHhfbW9kZWwgPC0gbG0oDQogIGluY2lkZW5jZV9yYXRlX1RCIH4NCiAgICBmYXNrZXMgKw0KICAgIHBlbmR1ZHVrX21pc2tpbiArDQogICAga2VwYWRhdGFuICsNCiAgICBhaXJfbWludW0gKw0KICAgIHNhbml0YXNpICsNCiAgICBoaXYgKw0KICAgIGxhZ19mYXNrZXMgKw0KICAgIGxhZ19wZW5kdWR1a19taXNraW4gKw0KICAgIGxhZ19rZXBhZGF0YW4gKw0KICAgIGxhZ19haXJfbWludW0gKw0KICAgIGxhZ19zYW5pdGFzaSArDQogICAgbGFnX2hpdiwNCiAgZGF0YSA9IGphYmFyX3RiDQopDQoNCnNseF9jb2VmIDwtIHN1bW1hcnkoc2x4X21vZGVsKSRjb2VmZmljaWVudHMNCg0Kc2x4X3RhYmxlIDwtIGRhdGEuZnJhbWUoDQogIFZhcmlhYmVsID0gYygNCiAgICAiKEludGVyY2VwdCkiLA0KICAgICJGYXNrZXMiLA0KICAgICJQZW5kdWR1ayBNaXNraW4iLA0KICAgICJLZXBhZGF0YW4gUGVuZHVkdWsiLA0KICAgICJBaXIgTWludW0gTGF5YWsiLA0KICAgICJTYW5pdGFzaSBMYXlhayIsDQogICAgIkhJViIsDQogICAgIkxhZyBGYXNrZXMiLA0KICAgICJMYWcgUGVuZHVkdWsgTWlza2luIiwNCiAgICAiTGFnIEtlcGFkYXRhbiIsDQogICAgIkxhZyBBaXIgTWludW0gTGF5YWsiLA0KICAgICJMYWcgU2FuaXRhc2kgTGF5YWsiLA0KICAgICJMYWcgSElWIg0KICApLA0KICBLb2VmaXNpZW4gPSBzbHhfY29lZlssIDFdLA0KICBTdGRfRXJyb3IgPSBzbHhfY29lZlssIDJdLA0KICB0X3ZhbHVlID0gc2x4X2NvZWZbLCAzXSwNCiAgcF92YWx1ZSA9IHNseF9jb2VmWywgNF0NCikNCg0Ka25pdHI6OmthYmxlKA0KICBzbHhfdGFibGUsDQogIGRpZ2l0cyA9IDQpDQpgYGANCg0KSGFzaWwgZXN0aW1hc2kgbW9kZWwgU0xYIG1lbnVuanVra2FuIGJhaHdhIG1vZGVsIHNlY2FyYSBzaW11bHRhbiBzaWduaWZpa2FuIGRhbGFtIG1lbmplbGFza2FuIHZhcmlhc2kgaW5jaWRlbmNlIHJhdGUgVHViZXJrdWxvc2lzIChwID0gMCwwNDQ4MykuIE5pbGFpIFLCsiBzZWJlc2FyIDAsNjkxMyBtZW51bmp1a2thbiBiYWh3YSBtb2RlbCBtYW1wdSBtZW5qZWxhc2thbiBzZWtpdGFyIDY5LDEzJSB2YXJpYXNpIGRhdGEsIHlhbmcgbGViaWggdGluZ2dpIGRpYmFuZGluZ2thbiBtb2RlbCBPTFMuDQpOYW11biBkZW1pa2lhbiwgc2VjYXJhIHBhcnNpYWwgc2VsdXJ1aCB2YXJpYWJlbCBiYWlrIHZhcmlhYmVsIGxva2FsIG1hdXB1biBlZmVrIHNwYXNpYWwgKGxhZykgdGlkYWsgbWVudW5qdWtrYW4gcGVuZ2FydWggeWFuZyBzaWduaWZpa2FuIChwID4gMCwwNSkuIEhhbCBpbmkgbWVuZ2luZGlrYXNpa2FuIGJhaHdhIHBlbmdhcnVoIGZha3RvciByaXNpa28gdGVyaGFkYXAgaW5jaWRlbmNlIHJhdGUgVEIgdGVyc2ViYXIgc2VjYXJhIHNwYXNpYWwgZGFuIHRpZGFrIHRlcnB1c2F0IHBhZGEgc2F0dSB2YXJpYWJlbCB0ZXJ0ZW50dS4gU2VjYXJhIGtlc2VsdXJ1aGFuLCBtb2RlbCBTTFggbWVudW5qdWtrYW4gYWRhbnlhIHBlbmluZ2thdGFuIGtlbWFtcHVhbiBkYWxhbSBtZW5hbmdrYXAgdmFyaWFzaSBkYXRhIGRpYmFuZGluZ2thbiBPTFMsIHNlaGluZ2dhIG1lbmR1a3VuZyBhZGFueWEgZWZlayBrZXRlcmthaXRhbiBzcGFzaWFsIGFudGFyIHdpbGF5YWggZGFsYW0gcGVueWViYXJhbiBUdWJlcmt1bG9zaXMuDQoNCiMjIDMuNiBQZXJiYW5kaW5nYW4gTW9kZWwNCg0KDQo8ZGl2IGFsaWduPSJjZW50ZXIiPg0KKipUYWJlbCA2LioqIFBlcmJhbmRpbmdhbiBNb2RlbA0KPC9kaXY+DQoNCmBgYHtyfQ0KbW9kZWxfY29tcGFyaXNvbiA8LSBkYXRhLmZyYW1lKA0KICBNb2RlbCA9IGMoIk9MUyIsICJTTFgiKSwNCiAgDQogIEFJQyA9IHJvdW5kKA0KICAgIGMoDQogICAgICBBSUMob2xzX21vZGVsKSwNCiAgICAgIEFJQyhzbHhfbW9kZWwpDQogICAgKSwNCiAgICAyDQogICksDQogIA0KICBSX3NxdWFyZWQgPSByb3VuZCgNCiAgICBjKA0KICAgICAgc3VtbWFyeShvbHNfbW9kZWwpJHIuc3F1YXJlZCwNCiAgICAgIHN1bW1hcnkoc2x4X21vZGVsKSRyLnNxdWFyZWQNCiAgICApLA0KICAgIDQNCiAgKSwNCiAgDQogIExvZ0xpayA9IHJvdW5kKA0KICAgIGMoDQogICAgICBhcy5udW1lcmljKGxvZ0xpayhvbHNfbW9kZWwpKSwNCiAgICAgIGFzLm51bWVyaWMobG9nTGlrKHNseF9tb2RlbCkpDQogICAgKSwNCiAgICAyDQogICksDQogIA0KICBSTVNFID0gcm91bmQoDQogICAgYygNCiAgICAgIHNxcnQobWVhbihvbHNfbW9kZWwkcmVzaWR1YWxzXjIpKSwNCiAgICAgIHNxcnQobWVhbihzbHhfbW9kZWwkcmVzaWR1YWxzXjIpKQ0KICAgICksDQogICAgMg0KICApDQopDQoNCmNvbXBhcmlzb25fdGFibGUgPC0gZGF0YS5mcmFtZSgNCiAgTW9kZWwgPSBjKCJPTFMiLCAiU0xYIiksDQoNCiAgQUlDID0gcm91bmQoDQogICAgYygNCiAgICAgIEFJQyhvbHNfbW9kZWwpLA0KICAgICAgQUlDKHNseF9tb2RlbCkNCiAgICApLA0KICAgIDINCiAgKSwNCg0KICBSX3NxdWFyZWQgPSByb3VuZCgNCiAgICBjKA0KICAgICAgc3VtbWFyeShvbHNfbW9kZWwpJHIuc3F1YXJlZCwNCiAgICAgIHN1bW1hcnkoc2x4X21vZGVsKSRyLnNxdWFyZWQNCiAgICApLA0KICAgIDQNCiAgKSwNCg0KICBMb2dfTGlrZWxpaG9vZCA9IHJvdW5kKA0KICAgIGMoDQogICAgICBhcy5udW1lcmljKGxvZ0xpayhvbHNfbW9kZWwpKSwNCiAgICAgIGFzLm51bWVyaWMobG9nTGlrKHNseF9tb2RlbCkpDQogICAgKSwNCiAgICAyDQogICksDQoNCiAgUk1TRSA9IHJvdW5kKA0KICAgIGMoDQogICAgICBzcXJ0KG1lYW4ocmVzaWR1YWxzKG9sc19tb2RlbCleMikpLA0KICAgICAgc3FydChtZWFuKHJlc2lkdWFscyhzbHhfbW9kZWwpXjIpKQ0KICAgICksDQogICAgMg0KICApDQopDQoNCmtuaXRyOjprYWJsZSgNCiAgY29tcGFyaXNvbl90YWJsZSwNCiAgZGlnaXRzID0gNA0KKQ0KDQpgYGANCg0KSGFzaWwgcGVyYmFuZGluZ2FuIGtpbmVyamEgbW9kZWwgbWVudW5qdWtrYW4gYmFod2EgbW9kZWwgU0xYIG1lbWlsaWtpIHBlcmZvcm1hIHlhbmcgbGViaWggYmFpayBkaWJhbmRpbmdrYW4gbW9kZWwgT0xTLiBIYWwgaW5pIHRlcmxpaGF0IGRhcmkgcGVudXJ1bmFuIG5pbGFpIEFJQyBkYW4gUk1TRSwgc2VydGEgcGVuaW5na2F0YW4gbmlsYWkgUi1zcXVhcmVkIGRhbiBsb2ctbGlrZWxpaG9vZC4gUGVuaW5na2F0YW4gdGVyc2VidXQgbWVudW5qdWtrYW4gYmFod2EgbW9kZWwgU0xYIGxlYmloIG1hbXB1IG1lbmplbGFza2FuIHZhcmlhc2kgaW5jaWRlbmNlIHJhdGUgVHViZXJrdWxvc2lzIGRlbmdhbiBtZW1wZXJ0aW1iYW5na2FuIGVmZWsgc3Bhc2lhbCBhbnRhciB3aWxheWFoLiBEZW5nYW4gZGVtaWtpYW4sIG1vZGVsIFNMWCBsZWJpaCBzZXN1YWkgZGlndW5ha2FuIGRhbGFtIGFuYWxpc2lzIGluaSBrYXJlbmEgbWFtcHUgbWVuYW5na2FwIGtldGVya2FpdGFuIHNwYXNpYWwgeWFuZyB0aWRhayBkYXBhdCBkaWplbGFza2FuIG9sZWggbW9kZWwgT0xTLg0KDQoNCiMjIDMuNyBLZXRlcmJhdGFzYW4gUGVuZWxpdGlhbg0KDQpQZW5lbGl0aWFuIGluaSBtZW1pbGlraSBiZWJlcmFwYSBrZXRlcmJhdGFzYW4geWFuZyBwZXJsdSBkaXBlcmhhdGlrYW4gZGFsYW0gaW50ZXJwcmV0YXNpIGhhc2lsbnlhOg0KMS4JQW5hbGlzaXMgZGlsYWt1a2FuIHBhZGEgdGluZ2thdCBhZ3JlZ2F0IGthYnVwYXRlbi9rb3RhLCBzZWhpbmdnYSB0aWRhayBtYW1wdSBtZW5hbmdrYXAgdmFyaWFzaSBkYWxhbSB0aW5na2F0IHlhbmcgbGViaWggbWlrcm8uDQoNCjIuIERhdGEgYmVyc2lmYXQgY3Jvc3Mtc2VjdGlvbmFsLCBzZWhpbmdnYSB0aWRhayBkYXBhdCBtZW5jZXJtaW5rYW4gZGluYW1pa2EgcGVydWJhaGFuIGthc3VzIFRCIGRhcmkgd2FrdHUga2Ugd2FrdHUuDQoNCjMuCUp1bWxhaCB2YXJpYWJlbCBwZW5qZWxhcyB5YW5nIGRpZ3VuYWthbiBtYXNpaCB0ZXJiYXRhcyBkYW4gYmVsdW0gbWVuY2FrdXAgc2VtdWEgZmFrdG9yIHJpc2lrbyB5YW5nIHJlbGV2YW4uDQoNCjQuIE1vZGVsIFNMWCB5YW5nIGRpZ3VuYWthbiBiZWx1bSBtZW1wZXJ0aW1iYW5na2FuIGtldGVyZ2FudHVuZ2FuIHRlbXBvcmFsIGFudGFyIHBlbmdhbWF0YW4uDQoNCiMgNC4JS2VzaW1wdWxhbiBkYW4gU2FyYW4NCg0KIyMgNC4xIEtlc2ltcHVsYW4NCg0KQmVyZGFzYXJrYW4gaGFzaWwgYW5hbGlzaXMgeWFuZyB0ZWxhaCBkaWxha3VrYW4sIGRhcGF0IGRpc2ltcHVsa2FuIGJhaHdhOg0KDQoxLiBLYXN1cyBUQiBkaSBKYXdhIEJhcmF0IG1lbnVuanVra2FuIHZhcmlhc2kgc3Bhc2lhbCB5YW5nIHRpbmdnaSBhbnRhciBrYWJ1cGF0ZW4va290YSwgZGVuZ2FuIGRpc3RyaWJ1c2kgSW5jaWRlbmNlIFJhdGUgeWFuZyB0aWRhayBtZXJhdGEuDQoNCjIuCVNlYmFnaWFuIGJlc2FyIHZhcmlhYmVsIHNvc2lhbC1la29ub21pIGRhbiBrZXNlaGF0YW4gbWVudW5qdWtrYW4gcG9sYSBjbHVzdGVyaW5nIHNwYXNpYWwgeWFuZyBzaWduaWZpa2FuIGJlcmRhc2Fya2FuIHVqaSBNb3JhbidzIEkuDQoJDQozLglNb2RlbCBPTFMgYmVsdW0gbWFtcHUgbWVuYW5na2FwIGVmZWsgc3Bhc2lhbCBzZWNhcmEgbWVtYWRhaSwgc2ViYWdhaW1hbmEgZGl0dW5qdWtrYW4gb2xlaCBhdXRva29yZWxhc2kgc3Bhc2lhbCBwYWRhIHJlc2lkdWFsIG1vZGVsLg0KDQo0LglNb2RlbCBTTFggbGViaWggYmFpayBkYWxhbSBtZW5qZWxhc2thbiB2YXJpYXNpIEluY2lkZW5jZSBSYXRlIFRCIGRpYmFuZGluZ2thbiBPTFMsIGRlbmdhbiBwZW5pbmdrYXRhbiBSwrIgZGFyaSAwLDQ5NTUgbWVuamFkaSAwLDY5MTMuDQoJDQo1LiBUZXJkYXBhdCBpbmRpa2FzaSBrdWF0IGFkYW55YSBzcGlsbG92ZXIgZWZmZWN0LCB5YWl0dSBrb25kaXNpIHNvc2lhbC1la29ub21pIGRpIHN1YXR1IHdpbGF5YWggdHVydXQgbWVtZW5nYXJ1aGkgYmViYW4gVEIgZGkgd2lsYXlhaCB0ZXRhbmdnYW55YS4NCg0KIyMgNC4yIFNhcmFuIA0KQmVyZGFzYXJrYW4gdGVtdWFuIHBlbmVsaXRpYW4sIGJlYmVyYXBhIHNhcmFuIGRhcGF0IGRpcnVtdXNrYW4gc2ViYWdhaSBiZXJpa3V0Og0KDQoxLiBJbnRlcnZlbnNpIGRhbiBwcm9ncmFtIHBlbmdlbmRhbGlhbiBUQiBwZXJsdSBkaWZva3Vza2FuIHNlY2FyYSBwcmlvcml0YXMgcGFkYSB3aWxheWFoIGRlbmdhbiBJbmNpZGVuY2UgUmF0ZSB0aW5nZ2kgZGFuIGtvbmRpc2kgc29zaWFsLWVrb25vbWkgcmVuZGFoLg0KCQ0KMi4gUGVuZ3VhdGFuIHByb2dyYW0ga29sYWJvcmFzaSBUQi1ISVYgcGVybHUgZGl0aW5na2F0a2FuIG1lbmdpbmdhdCBrYXN1cyBISVYgbWVydXBha2FuIGZha3RvciByaXNpa28gcGVudGluZyBkYWxhbSBwZW55ZWJhcmFuIFRCLg0KCQ0KMy4gUGVuZWxpdGlhbiBzZWxhbmp1dG55YSBkaXNhcmFua2FuIG1lbmdndW5ha2FuIGRhdGEgc3Bhc2lvLXRlbXBvcmFsIGFnYXIgZGFwYXQgbWVuYW5na2FwIGRpbmFtaWthIHBlcnNlYmFyYW4gVEIgZGFyaSB3YWt0dSBrZSB3YWt0dS4NCgkNCjQuIE1vZGVsIHNwYXNpYWwgbGFuanV0YW4sIHNlcGVydGkgU3BhdGlhbCBBdXRvcmVncmVzc2l2ZSAoU0FSKSBhdGF1IG1vZGVsIEJheWVzaWFuIChCWU0pLCBkYXBhdCBkaXBlcnRpbWJhbmdrYW4gdW50dWsgYW5hbGlzaXMgeWFuZyBsZWJpaCBrb21wcmVoZW5zaWYuDQoNCiMgRGFmdGFyIFB1c3Rha2EgDQoNCkFsbWEsIEwuIFIuLCBPbGl2aW9uaXRhLCBWLiwgJiBXYXJkYW5pLCBILiBFLiAoMjAyNCkuIEFuIGVjb2xvZ2ljYWwgc3R1ZHkgb2YgZGV0ZXJtaW5hbnRzIG9mIHRoZSBpbmNpZGVuY2Ugb2YgdHViZXJjdWxvc2lzIGluIE1hbGFuZyBSYXlhIGFyZWEuIFByZXZlbnRpYTogVGhlIEluZG9uZXNpYW4gSm91cm5hbCBvZiBQdWJsaWMgSGVhbHRoLCA5KDEpLCAxMTLigJMxMjAuIGh0dHBzOi8vZG9pLm9yZy8xMC4xNzk3Ny91bTA0NHY5aTEyMDI0cDExMi0xMjANCg0KQW5zZWxpbiwgTC4gKDE5OTUpLiBMb2NhbCBpbmRpY2F0b3JzIG9mIHNwYXRpYWwgYXNzb2NpYXRpb24gTElTQS4gR2VvZ3JhcGhpY2FsIEFuYWx5c2lzLCAyNygyKSwgOTPigJMxMTUuaHR0cHM6Ly9kb2kub3JnLzEwLjExMTEvai4xNTM4LTQ2MzIuMTk5NS50YjAwMzM4LngNCg0KQXRpbGxhaCwgQy4gTi4sIFd1bGFuZGFyaSwgUi4gQS4sICYgS3Vybmlhc2FyaSwgRi4gKDIwMjMpLiBFbnZpcm9ubWVudGFsIGZhY3RvcnMgYW5kIHB1bG1vbmFyeSB0dWJlcmN1bG9zaXMgY2FzZXMgaW4gQmFuZHVuZyBDaXR5LiBKdXJuYWwgSWxtaWFoIEtlc2VoYXRhbiBNYXN5YXJha2F0LCAxNSg0KSwgMTY34oCTMTc1LiBodHRwczovL2RvaS5vcmcvMTAuNTIwMjIvamlrbS52MTVpNC41NjYNCg0KQmVzYWcsIEouLCBZb3JrLCBKLiwgJiBNb2xsacOpLCBBLiAoMTk5MSkuIEJheWVzaWFuIGltYWdlIHJlc3RvcmF0aW9uLCB3aXRoIHR3byBhcHBsaWNhdGlvbnMgaW4gc3BhdGlhbCBzdGF0aXN0aWNzLiBBbm5hbHMgb2YgdGhlIEluc3RpdHV0ZSBvZiBTdGF0aXN0aWNhbCBNYXRoZW1hdGljcywgNDMoMSksIDHigJMyMC4gaHR0cHM6Ly9kb2kub3JnLzEwLjEwMDcvQkYwMDExNjQ2Ng0KDQpCaXZhbmQsIFIuIFMuLCBQZWJlc21hLCBFLiwgJiBHw7NtZXotUnViaW8sIFYuICgyMDEzKS4gQXBwbGllZCBzcGF0aWFsIGRhdGEgYW5hbHlzaXMgd2l0aCBSICgybmQgZWQuKS4gU3ByaW5nZXIuDQoNCkNsaWZmLCBBLiBELiwgJiBPcmQsIEouIEsuICgxOTgxKS4gU3BhdGlhbCBwcm9jZXNzZXM6IE1vZGVscyBhbmQgYXBwbGljYXRpb25zLiBQaW9uLg0KDQpEaW5hcyBLZXNlaGF0YW4gUHJvdmluc2kgSmF3YSBCYXJhdC4gKDIwMjMpLiBQcm9maWwga2VzZWhhdGFuIFByb3ZpbnNpIEphd2EgQmFyYXQgdGFodW4gMjAyMi4NCg0KRGluYXMgS2VzZWhhdGFuIFByb3ZpbnNpIEphd2EgQmFyYXQuICgyMDI0KS4gUHJvZmlsIGtlc2VoYXRhbiBQcm92aW5zaSBKYXdhIEJhcmF0IHRhaHVuIDIwMjMuDQoNCkRpbmFzIEtlc2VoYXRhbiBQcm92aW5zaSBKYXdhIEJhcmF0LiAoMjAyNSkuIFByb2ZpbCBrZXNlaGF0YW4gUHJvdmluc2kgSmF3YSBCYXJhdCB0YWh1biAyMDI0Lg0KDQpEemFraXlhaCwgUi4gTi4sIEthcmltYSwgVS4gUS4sIFNpbWFuam9yYW5nLCBDLiwgJiBBcHJpbmluZ3NpaC4gKDIwMjMpLiBEZXRlcm1pbmFuIGtlamFkaWFuIHR1YmVya3Vsb3NpcyBwYXJ1IHBhZGEgdXNpYSBkZXdhc2EuIEp1cm5hbCBQZW5lbGl0aWFuIEtlc2VoYXRhbiBTdWFyYSBGb3Jpa2VzLg0KDQpIYW5kYXlhbmksIFMuLCBNdXNmaXJhaCwgTS4sICYgQXByaWFuYSwgQS4gKDIwMjQpLiBEZXRlcm1pbmFudHMgb2YgcHVsbW9uYXJ5IHR1YmVyY3Vsb3Npcy4gSnVybmFsIElsbWlhaCBLZXNlaGF0YW4sIDYoMSksIDQ14oCTNTQuIGh0dHBzOi8vZG9pLm9yZy8xMC4zNjU5MC9qaWthLnY2aTEuMzc0DQoNCkhhcSwgQS4sIEFjaG1hZGksIFUuIEYuLCAmIFN1c2FubmEsIEQuICgyMDIwKS4gQW5hbGlzaXMgc3Bhc2lhbCBUQiBwYXJ1LiBKdXJuYWwgRWtvbG9naSBLZXNlaGF0YW4sIDE4KDMpLiBodHRwczovL2RvaS5vcmcvMTAuMjI0MzUvamVrLnYzaTE4LjgwDQpLZW1lbnRlcmlhbiBLZXNlaGF0YW4gUmVwdWJsaWsgSW5kb25lc2lhLiAoMjAyNSkuIFByb2ZpbCBrZXNlaGF0YW4gSW5kb25lc2lhIDIwMjQuDQoNCktyaXN0aWFuaW5ncnVtLCBFLiBOLiAoMjAyNCkuIEtlcGFkYXRhbiBwZW5kdWR1ayBkYW4gVEIgcGFydSAoU2tyaXBzaSkuIFVuaXZlcnNpdGFzIER1dGEgQmFuZ3NhLg0KDQpMYW9saSwgSC4gQS4sIE5hemlyYSwgQS4sIEZhbGVyaWEsIEkuLCBUYXJpZ2FuLCBCLiwgJiBHaXJzYW5nLCBWLiBJLiAoMjAyNCkuIENhc2VzIG9mIHB1bG1vbmFyeSB0dWJlcmN1bG9zaXMgYW5kIHBvcHVsYXRpb24gZGVuc2l0eS4gTUlISElDbyBDb25mZXJlbmNlIFByb2NlZWRpbmdzLg0KDQpNb250Z29tZXJ5LCBELiBDLiwgUGVjaywgRS4gQS4sICYgVmluaW5nLCBHLiBHLiAoMjAyMSkuIEludHJvZHVjdGlvbiB0byBsaW5lYXIgcmVncmVzc2lvbiBhbmFseXNpcyAoNnRoIGVkLikuIFdpbGV5Lg0KDQpOdXJkaW4sIEEuLCBldCBhbC4gKDIwMjUpLiBBbmFsaXNpcyBmYWt0b3IgcmlzaWtvIFRCLiBKdXJuYWwgS2VzZWhhdGFuIFlhbWFzaSBNYWthc3NhciwgOSgyKSwgMeKAkzkuDQoNClJvc2FkeSwgRC4gUy4sIFp1bGZhLCBOLiBSLiBBLiwgJiBQcmF0YW1hLCBTLiBCLiAoMjAyNCkuIFNwYXRpYWwgYW5hbHlzaXMgVEIgQmFuZHVuZy4gR2xvYmFsIE1lZGljYWwgJiBIZWFsdGggQ29tbXVuaWNhdGlvbiwgMTIoMSkuIGh0dHBzOi8vZG9pLm9yZy8xMC4yOTMxMy9nbWhjLnYxMmkxLjEyNDEwDQoNClNhc21pdGEsIFMuLCBKdW5haWQsIEouLCAmIEFpbnVyYWZpcSwgQS4gKDIwMTcpLiBQb2xhIHNwYXNpYWwgVEIgcGFydS4gSnVybmFsIElsbWlhaCBNYWhhc2lzd2EgS2VzZWhhdGFuIE1hc3lhcmFrYXQuDQoNClNpaGFsb2hvLCBFLiBELiwgZXQgYWwuICgyMDIxKS4gUGVuZ2FydWgga2VtaXNraW5hbiB0ZXJoYWRhcCBUQi4gSm91cm5hbCBvZiBBcHBsaWVkIEJ1c2luZXNzIGFuZCBFY29ub21pYywgNygzKS4gaHR0cHM6Ly9kb2kub3JnLzEwLjMwOTk4L2phYmUudjdpMy42NDcwDQoNClN1cnlhbmksIEYuIFQuLCAmIEliYWQsIE0uICgyMDIyKS4gRmFrdG9yIGtlcGFkYXRhbiBkYW4gc2FuaXRhc2kgdGVyaGFkYXAgVEIuIEp1cm5hbCBTb3NpYWwgU2FpbnMsIDIoMTApLiBodHRwczovL2RvaS5vcmcvMTAuMzY0MTgvanVybmFsc29zYWlucy52MmkxMC40NjgNCg0KVHVybmVyLCBSLiBELiwgZXQgYWwuICgyMDE3KS4gVHViZXJjdWxvc2lzIGluZmVjdGlvdXNuZXNzIGFuZCBob3N0IHN1c2NlcHRpYmlsaXR5LiBKb3VybmFsIG9mIEluZmVjdGlvdXMgRGlzZWFzZXMsIDIxNi4gaHR0cHM6Ly9kb2kub3JnLzEwLjEwOTMvaW5mZGlzL2ppeDM2MQ0KDQpXb3JsZCBIZWFsdGggT3JnYW5pemF0aW9uLiAoMjAyNSkuIEdsb2JhbCB0dWJlcmN1bG9zaXMgcmVwb3J0IDIwMjUuIFdITy4NCg==