Analisis keterjangkauan perumahan berangkat dari pemahaman bahwa pengeluaran perumahan yang terlalu besar dapat mengurangi kapasitas rumah tangga untuk memenuhi kebutuhan dasar lainnya. Literatur ekonomi perumahan menekankan bahwa perumahan bukan sekadar aset fisik, melainkan komponen utama dalam struktur kesejahteraan rumah tangga (Stone, 2006). Oleh karena itu, pengukuran keterjangkauan perumahan perlu dikaitkan secara langsung dengan kondisi kesejahteraan non-perumahan.

Pendekatan ini relevan dalam konteks negara berkembang, termasuk Indonesia, di mana tekanan biaya hidup tidak hanya berasal dari harga rumah, tetapi juga dari utilitas, energi, dan biaya pemeliharaan (Angel, 2000).

knitr::opts_chunk$set(echo = TRUE)

1 Sumber Data

Data yang digunakan adalah Susenas Maret 2025.

susenas <- read_sav("BLOK43_2025_5.sav") %>%
  clean_names()

Komponen pengeluaran perumahan

Dalam analisis ini, pengeluaran perumahan dihitung secara menyeluruh dengan memasukkan berbagai komponen biaya yang benar-benar dikeluarkan maupun yang bersifat imputasi. Komponen tersebut meliputi sewa rumah (baik sewa aktual maupun perkiraan sewa untuk rumah milik sendiri), biaya utilitas dasar seperti listrik dan air, pengeluaran untuk bahan bakar memasak, serta biaya pemeliharaan dan kebutuhan rumah tangga lainnya. Pendekatan yang bersifat agregatif ini mengikuti praktik umum dalam pengukuran pengeluaran perumahan pada berbagai survei rumah tangga, baik di tingkat nasional maupun internasional (OECD, 2011).

Sementara itu, nilai yang hilang (missing values) digantikan dengan nol untuk menjaga konsistensi dalam perhitungan total pengeluaran. Dalam konteks survei pengeluaran, nilai kosong umumnya mencerminkan tidak adanya transaksi pada periode tertentu, bukan berarti data tersebut tidak tersedia. Dengan demikian, perlakuan ini membantu memastikan bahwa estimasi total pengeluaran tetap akurat dan tidak terdistorsi.

susenas <- susenas %>%
  mutate(
    # Perumahan
    perkiraan  = sebulan_228,
    sewa       = sebulan_229 + sebulan_230,
    perumahan  = sebulan_228 + sebulan_229 + sebulan_230 + sebulan_231,
    # Utilitas
    listrik    = sebulan_234,
    airpam     = sebulan_236,
    # Energi bahan bakar memasak
    bakar_masak = sebulan_253 + sebulan_255 + sebulan_257 + sebulan_259 +
    sebulan_260 + sebulan_261,
    # Lainnya
    perbaikan      = sebulan_232,
    kebutuhan_lain = sebulan_262
  ) %>%
  mutate(
    across(
      c(perkiraan, sewa, perumahan,
        listrik, airpam, bakar_masak,
        perbaikan, kebutuhan_lain),
      ~replace_na(., 0)
    )
  )

Total pengeluaran perumahan sebulan

Seluruh komponen pengeluaran perumahan kemudian dijumlahkan untuk membentuk indikator total pengeluaran perumahan bulanan rumah tangga (exp_housing). Variabel ini menjadi komponen utama dalam pengukuran keterjangkauan perumahan dan tekanan ekonomi rumah tangga.

susenas <- susenas %>%
  mutate(
    exp_housing = perumahan +
      listrik +
      airpam +
      bakar_masak +
      perbaikan +
      kebutuhan_lain
  )

Tingkat kesejahteraan (non perumahan) per kapita sebulan

Pengeluaran non-perumahan per kapita digunakan sebagai indikator kesejahteraan ekonomi rumah tangga. Literatur kesejahteraan menekankan bahwa sisa pengeluaran setelah kebutuhan perumahan terpenuhi mencerminkan residual income yang tersedia untuk konsumsi pangan, kesehatan, pendidikan, dan kebutuhan sosial lainnya (Stone, 2006).

Pendekatan ini dinilai lebih informatif dibandingkan indikator yang semata-mata bertumpu pada pendapatan. Hal ini terutama relevan dalam konteks perekonomian informal dan kondisi pendapatan yang cenderung berfluktuasi, sebagaimana banyak dijumpai di negara berkembang (Deaton & Zaidi, 2002).

susenas <- susenas %>%
  mutate(
    exp_total = expend,
    hhsize    = jart,
    exp_nonhousing_pc = if_else(
      hhsize > 0,
      (exp_total - exp_housing) / hhsize,
      NA_real_
    )
  )

2 Housing Cost Burden

Housing Cost Burden (HCB) dihitung sebagai perbandingan antara pengeluaran untuk perumahan dan total pengeluaran rumah tangga. Secara sederhana, ukuran ini menunjukkan seberapa besar porsi belanja keluarga yang “tersedot” untuk kebutuhan tempat tinggal. Batas 30 persen digunakan untuk menilai apakah beban tersebut sudah tergolong berat (unaffordable), mengikuti praktik yang umum dipakai dalam kajian kebijakan perumahan dan perencanaan kota (HUD, 2018).

Walaupun angka 30 persen ini pada dasarnya merupakan batas normatif, berbagai penelitian menunjukkan bahwa ketika pengeluaran perumahan melampaui ambang tersebut, rumah tangga cenderung harus mengurangi belanja untuk kebutuhan dasar lainnya, seperti pangan, pendidikan, atau kesehatan. Kondisi ini pada akhirnya dapat meningkatkan kerentanan ekonomi dan mempersempit ruang gerak keuangan keluarga (Kutty, 2005).

susenas <- susenas %>%
  mutate(
    housing_burden = exp_housing / exp_total,
    unaffordable   = if_else(housing_burden >= 0.30, 1, 0)
  )

Seleksi dan Pembersihan Variabel Analisis

Pada tahap ini, hanya variabel yang benar-benar relevan dengan kebutuhan analisis yang dipertahankan agar efisien. Selanjutnya, dilakukan proses penyaringan (filtering) untuk mengeluarkan observasi yang memiliki nilai ekstrem atau tidak masuk akal, misalnya rasio pengeluaran perumahan yang bernilai nol atau melebihi satu, serta pengeluaran non-perumahan per kapita yang bernilai negatif atau nol.

Langkah ini dilakukan untuk memastikan hasil estimasi tetap stabil dan tidak dipengaruhi oleh nilai-nilai yang secara logis sulit dipertanggungjawabkan. Dengan demikian, kualitas analisis dapat terjaga tanpa mengubah pola distribusi utama data secara substansial.

susenas <- susenas %>%
  select(
    kabu,
    psu,
    strata,
    wert,
    housing_burden,
    unaffordable,
    exp_nonhousing_pc
  ) %>%
  filter(
    housing_burden > 0,
    housing_burden < 1,
    exp_nonhousing_pc > 0
  )

Survey Design

options(survey.lonely.psu = "adjust")

des <- svydesign(
  ids     = ~psu,
  strata  = ~strata,
  weights = ~wert,
  data    = susenas,
  nest    = TRUE
)

2.1 Tract-Level Aggregation

Pada tahap selanjutnya, indikator yang telah dihitung pada tingkat rumah tangga diagregasikan ke tingkat kabupaten/kota. Agregasi ini memungkinkan analisis spasial dan perbandingan antarwilayah secara lebih sistematis. Dengan melihat pola pada tingkat wilayah, dapat diidentifikasi kecenderungan struktural, misalnya konsentrasi beban biaya perumahan di daerah tertentu yang sering kali tidak tampak ketika analisis hanya dilakukan pada level rumah tangga. Pendekatan agregasi wilayah seperti ini lazim digunakan dalam studi ketimpangan regional, karena membantu menangkap dinamika spasial pembangunan dan kesenjangan antarwilayah secara lebih komprehensif (World Bank, 2009).

tract_tradeoff <- svyby(
  ~housing_burden + unaffordable + exp_nonhousing_pc,
  ~kabu,
  des,
  svymean,
  na.rm = TRUE
) %>%
  rename(
    mean_housing_burden = housing_burden,
    unaffordable_rate  = unaffordable,
    welfare_nonhousing = exp_nonhousing_pc
  ) %>%
  mutate(
    mean_housing_burden = as.numeric(mean_housing_burden),
    welfare_nonhousing = as.numeric(welfare_nonhousing)
  )

2.2 Trade-off Typology

Klasifikasi housing–welfare trade-off digunakan untuk mengidentifikasi wilayah yang menghadapi beban biaya perumahan tinggi sekaligus memiliki tingkat kesejahteraan non-perumahan yang relatif rendah. Konsep trade-off ini menggambarkan kondisi ketika peningkatan pengeluaran untuk tempat tinggal sering kali harus “dibayar” dengan pengurangan alokasi belanja untuk kebutuhan penting lainnya, seperti pangan, pendidikan, kesehatan, maupun kebutuhan dasar rumah tangga lainnya (Angel, 2000).

Pengelompokkan housing–welfare trade-off dilakukan dengan membagi wilayah ke dalam empat kategori berdasarkan posisi relatifnya terhadap nilai median nasional dari dua indikator utama, yaitu rata-rata beban biaya perumahan (mean housing cost burden) dan pengeluaran non-perumahan per kapita (non-housing expenditure per capita). Penggunaan median sebagai titik pembanding dipilih karena lebih tahan terhadap pengaruh nilai outlier sehingga mampu memberikan gambaran perbandingan antarwilayah yang lebih stabil dan representatif. Pendekatan ini juga membantu menonjolkan perbedaan karakteristik kesejahteraan wilayah secara lebih proporsional.

  1. Wilayah yang memiliki beban biaya perumahan di atas median nasional tetapi tingkat kesejahteraan non-perumahan di bawah median diklasifikasikan sebagai High Housing Cost – Low Welfare. Kelompok ini mencerminkan kondisi yang paling serius, di mana pengeluaran perumahan menyerap porsi besar anggaran rumah tangga sehingga menyisakan ruang yang terbatas untuk memenuhi kebutuhan dasar lainnya. Dalam konteks kebijakan, wilayah pada kategori ini menjadi prioritas utama intervensi perumahan, karena tekanan biaya hunian berpotensi memperburuk kerentanan kesejahteraan rumah tangga.

  2. Sebaliknya, wilayah dengan beban biaya perumahan tinggi tetapi kesejahteraan non-perumahan juga tinggi diklasifikasikan sebagai High Housing Cost – High Welfare. Kondisi ini menunjukkan bahwa meskipun biaya perumahan relatif mahal, rumah tangga di wilayah tersebut masih memiliki kapasitas ekonomi yang cukup untuk mempertahankan tingkat konsumsi non-perumahan yang tinggi. Tingginya biaya perumahan tidak selalu berimplikasi pada penurunan kesejahteraan.

  3. Kelompok Low Housing Cost – Low Welfare menggambarkan wilayah dengan beban biaya perumahan relatif rendah tetapi tingkat kesejahteraan non-perumahan juga rendah. Kondisi ini mengindikasikan bahwa permasalahan utama kesejahteraan rumah tangga di wilayah tersebut bukan terletak pada sektor perumahan, melainkan pada keterbatasan kapasitas ekonomi secara umum. Oleh karena itu, kebijakan yang hanya berfokus pada perumahan cenderung kurang efektif, dan perlu dilengkapi dengan intervensi pembangunan ekonomi, penciptaan lapangan kerja, serta peningkatan produktivitas.

  4. Sementara itu, wilayah yang termasuk dalam kategori Low Housing Cost – High Welfare merupakan kelompok dengan beban biaya perumahan rendah dan tingkat kesejahteraan non-perumahan tinggi. Kelompok ini mencerminkan kondisi struktural yang relatif paling menguntungkan, di mana rumah tangga mampu memenuhi kebutuhan perumahan tanpa mengorbankan konsumsi non-perumahan.

hb_med  <- median(tract_tradeoff$mean_housing_burden, na.rm = TRUE)
wel_med <- median(tract_tradeoff$welfare_nonhousing, na.rm = TRUE)

tract_tradeoff <- tract_tradeoff %>%
  mutate(
    tradeoff_type = case_when(
      mean_housing_burden >= hb_med & welfare_nonhousing < wel_med  ~
        "High Housing Cost – Low Welfare",
      mean_housing_burden >= hb_med & welfare_nonhousing >= wel_med ~
        "High Housing Cost – High Welfare",
      mean_housing_burden < hb_med  & welfare_nonhousing < wel_med  ~
        "Low Housing Cost – Low Welfare",
      TRUE ~
        "Low Housing Cost – High Welfare"
    )
  )
head(tract_tradeoff[,c(1:4,8)])
##      kabu mean_housing_burden unaffordable_rate welfare_nonhousing
## 1101 1101          0.09414305       0.000000000            3106780
## 1102 1102          0.11328801       0.018474085            2612460
## 1103 1103          0.10628428       0.004749273            3354536
## 1104 1104          0.10938372       0.004097063            2772172
## 1105 1105          0.09656410       0.001387120            4557323
## 1106 1106          0.09277107       0.014805091            4064299
##                        tradeoff_type
## 1101  Low Housing Cost – Low Welfare
## 1102  Low Housing Cost – Low Welfare
## 1103  Low Housing Cost – Low Welfare
## 1104  Low Housing Cost – Low Welfare
## 1105 Low Housing Cost – High Welfare
## 1106 Low Housing Cost – High Welfare
#Export to Excel
write.xlsx(
  tract_tradeoff,
  file = "housing_welfare_tradeoff_kabkota.xlsx",
  overwrite = TRUE
)

Visualization

ggplot(tract_tradeoff,
       aes(mean_housing_burden,
           welfare_nonhousing,
           color = tradeoff_type)) +
  geom_point(size = 3, alpha = 0.8) +
  geom_vline(xintercept = hb_med, linetype = "dashed") +
  geom_hline(yintercept = wel_med, linetype = "dashed") +
  scale_x_continuous(labels = percent_format()) +
  scale_y_continuous(labels = comma) +
  labs(
    title = "Housing-Welfare Trade-off Across Districts",
    x = "Average Housing Cost Burden",
    y = "Non-Housing Expenditure per Capita",
    color = "Trade-off Type"
  ) +
  theme_minimal()

Sebaran titik yang relatif merata di keempat kuadran menunjukkan adanya heterogenitas antarwilayah. Kuadran kanan bawah (High Housing Cost – Low Welfare) mencerminkan wilayah dengan tekanan perumahan paling berat karena tingginya biaya hunian tidak diimbangi kapasitas konsumsi lain. Kuadran kanan atas (High Housing Cost – High Welfare) menunjukkan daerah dengan ekonomi kuat, di mana biaya hunian tinggi tidak selalu berarti kerentanan. Di sisi lain, kuadran kiri bawah (Low Housing Cost – Low Welfare) menandakan wilayah dengan daya beli rendah, sehingga isu utamanya lebih terkait kemiskinan struktural. Sementara itu, kuadran kiri atas (Low Housing Cost – High Welfare) menggambarkan kondisi paling ideal, dengan beban perumahan rendah dan kesejahteraan relatif tinggi.

Secara keseluruhan, pola ini menegaskan bahwa hubungan antara biaya perumahan dan kesejahteraan tidak bersifat linier. Karena itu, pendekatan berbasis trade-off penting untuk merumuskan kebijakan yang lebih kontekstual dan tidak satu dimensi.

Mean Housing Burden per Kab/Kota

ggplot(
  tract_tradeoff %>%
    arrange(mean_housing_burden) %>%
    mutate(kabu = factor(kabu, levels = kabu)),
  aes(x = kabu, y = mean_housing_burden)
) +
  geom_col(fill = "#2C7FB8") +
  coord_flip() +
  geom_hline(yintercept = 0.30,
             linetype = "dashed",
             color = "red") +
  scale_y_continuous(labels = percent_format()) +
  labs(
    title = "Average Housing Cost Burden by District",
    subtitle = "Red line indicates 30% affordability threshold",
    x = "District (Kab/Kota)",
    y = "Mean Housing Cost Burden"
  ) +
  theme_minimal()

Grafik Average Housing Cost Burden by District menampilkan rata-rata beban biaya perumahan (HCB) seluruh kabupaten/kota yang diurutkan dari terendah hingga tertinggi. Setiap batang merepresentasikan satu wilayah, dan sumbu horizontal menunjukkan proporsi pengeluaran perumahan terhadap total pengeluaran rumah tangga. Grafik ini ditujukan untuk melihat pola distribusi secara umum, bukan membandingkan wilayah satu per satu.

Garis merah putus-putus pada angka 30% menunjukkan ambang keterjangkauan yang lazim digunakan. Wilayah di kanan garis tersebut memiliki rata-rata HCB di atas 30% dan menghadapi tekanan biaya perumahan yang relatif tinggi, sedangkan wilayah di kiri masih tergolong lebih terjangkau.

Secara keseluruhan, grafik ini memperlihatkan seberapa luas dan seberapa serius isu keterjangkauan perumahan tersebar antarwilayah, menegaskan bahwa persoalan ini bersifat struktural dengan tingkat keparahan yang bervariasi.

3 HCB vs Unaffordable Rate

Tahapan ini digunakan untuk mengecek apakah beban biaya perumahan yang tinggi benar-benar sejalan dengan meningkatnya proporsi rumah tangga tidak terjangkau (unaffordable) di tingkat kabupaten/kota.

ggplot(tract_tradeoff,
       aes(mean_housing_burden,
           unaffordable_rate)) +
  geom_point(size = 3, alpha = 0.8, color = "#D95F02") +
  geom_smooth(method = "lm", se = FALSE, linetype = "dashed") +
  scale_x_continuous(labels = percent_format()) +
  scale_y_continuous(labels = percent_format()) +
  labs(
    title = "Housing Cost Burden vs Unaffordability Rate",
    x = "Average Housing Cost Burden",
    y = "Share of Unaffordable Households"
  ) +
  theme_minimal()
## `geom_smooth()` using formula = 'y ~ x'

Setiap titik pada grafik mewakili satu kabupaten/kota. Sumbu horizontal menunjukkan rata-rata Housing Cost Burden (HCB), sedangkan sumbu vertikal menunjukkan persentase rumah tangga yang mengeluarkan ≥30% dari total belanja untuk perumahan. Dengan menampilkan keduanya dalam satu bidang, grafik ini membantu melihat apakah wilayah dengan beban rata-rata lebih tinggi memang juga memiliki lebih banyak rumah tangga yang merasa “tertekan” oleh biaya hunian.

Garis putus-putus dari regresi linier menunjukkan arah hubungan tersebut. Jika garisnya menanjak, artinya semakin tinggi rata-rata HCB suatu wilayah, semakin besar pula proporsi rumah tangga yang tidak terjangkau. Secara sederhana, grafik ini menguji apakah angka rata-rata benar-benar mencerminkan kenyataan di lapangan. Jika hubungan keduanya kuat dan positif, maka HCB dapat dianggap sebagai indikator yang cukup andal untuk membaca tekanan biaya perumahan dan menjadi dasar perumusan kebijakan.

4 Housing Stress Index

Housing Stress Index dikembangkan sebagai indikator komposit untuk menangkap tingkat tekanan perumahan secara relatif antarwilayah. Dengan menstandarkan beban biaya perumahan dan tingkat kesejahteraan non-perumahan, indeks ini memungkinkan perbandingan yang lebih adil antar daerah, tanpa terdistorsi oleh perbedaan skala atau besaran absolut masing-masing wilayah (OECD, 2011).

Pendekatan ini mengikuti praktik umum dalam penyusunan indeks sosial-ekonomi berbasis z-score, yang banyak digunakan untuk mengukur kerentanan dan kesejahteraan wilayah secara komparatif (Nardo et al., 2005). Dengan cara ini, posisi suatu daerah dapat dibaca secara lebih proporsional dalam konteks nasional.

tract_tradeoff <- tract_tradeoff %>%
  mutate(
    z_housing = as.numeric(scale(mean_housing_burden)),
    z_welfare = as.numeric(scale(welfare_nonhousing)),
    housing_stress_index = (z_housing - z_welfare) / 2
  )

Stress Classification

tract_tradeoff <- tract_tradeoff %>%
  mutate(
    stress_category = case_when(
      housing_stress_index >=  0.75 ~ "Severe Stress",
      housing_stress_index >=  0.25 ~ "Moderate Stress",
      housing_stress_index >= -0.25 ~ "Neutral",
      TRUE                          ~ "Low Stress"
    )
  )

Export to Excel

write.xlsx(
  tract_tradeoff,
  "housing_stress_index_kabkota.xlsx",
  overwrite = TRUE
)

Visualization

ggplot(tract_tradeoff,
       aes(mean_housing_burden,
           welfare_nonhousing,
           color = stress_category)) +
  geom_point(size = 3, alpha = 0.8) +
  scale_x_continuous(labels = percent_format()) +
  scale_y_continuous(labels = comma) +
  labs(
    title = "Housing Stress Index Across Districts",
    x = "Average Housing Cost Burden",
    y = "Non-Housing Expenditure per Capita",
    color = "Stress Level"
  ) +
  theme_minimal()

4.1 HSI Ranking

ggplot(
  tract_tradeoff %>%
    arrange(housing_stress_index) %>%
    mutate(kabu = factor(kabu, levels = kabu)),
  aes(x = kabu, y = housing_stress_index,
      color = stress_category)
) +
  geom_hline(yintercept = 0, linetype = "dashed", color = "grey40") +
  geom_point(size = 3) +
  coord_flip() +
  labs(
    title = "Housing Stress Index (HSI) by District",
    subtitle = "Positive values indicate higher housing stress",
    x = "District (Kab/Kota)",
    y = "Housing Stress Index",
    color = "Stress Category"
  ) +
  theme_minimal()

Wilayah dengan nilai Housing Stress Index (HSI) yang tinggi menggambarkan kondisi di mana rumah tangga harus menanggung beban biaya perumahan yang relatif besar, sementara kemampuan mereka untuk memenuhi kebutuhan non-perumahan masih terbatas. Situasi ini menunjukkan tekanan ganda: biaya hunian yang berat di satu sisi, dan ruang fiskal rumah tangga yang sempit di sisi lain. Temuan seperti ini menjadi penting dalam merancang kebijakan perumahan, skema subsidi, maupun penargetan bantuan sosial yang lebih tepat sasaran berbasis wilayah (World Bank, 2009). Dengan demikian, analisis ini tidak berhenti pada pemaparan angka semata, tetapi juga berfungsi sebagai alat diagnostik untuk mengidentifikasi daerah-daerah yang paling rentan terhadap tekanan perumahan dan membutuhkan perhatian kebijakan lebih lanjut.

4.2 Distribusi HSI

ggplot(tract_tradeoff,
       aes(x = housing_stress_index, fill = stress_category)) +
  geom_histogram(bins = 20, alpha = 0.8) +
  geom_vline(xintercept = 0, linetype = "dashed") +
  labs(
    title = "Distribution of Housing Stress Index",
    x = "Housing Stress Index",
    y = "Number of Districts",
    fill = "Stress Category"
  ) +
  theme_minimal()

Dari gambar terlihat bahwa sebagian besar wilayah terkonsentrasi di sekitar nilai nol, yang berarti mayoritas kabupaten/kota berada pada kategori netral atau tekanan sedang. Namun, terdapat sejumlah wilayah di sisi kanan dengan kategori moderate hingga severe stress, menunjukkan adanya kelompok daerah yang menghadapi tekanan perumahan cukup berat. Di sisi kiri, wilayah dengan low stress relatif lebih banyak, mencerminkan kondisi di mana beban perumahan masih lebih terkendali dibanding rata-rata nasional.

Distribusi yang cenderung menyerupai kurva lonceng ini mengindikasikan bahwa tekanan perumahan merupakan fenomena yang tersebar luas, tetapi tingkat keparahannya berbeda-beda. Hanya sebagian kecil wilayah yang berada pada kondisi sangat berat (severe stress), namun kelompok ini penting menjadi perhatian kebijakan karena merepresentasikan konsentrasi tekanan paling tinggi.

5 Referensi

[1] Angel, S. (2000). Housing policy matters: A global analysis. Oxford University Press.

[2] Deaton, A., & Zaidi, S. (2002). Guidelines for constructing consumption aggregates for welfare analysis. World Bank Publications.

[3] HUD. (2018). Affordable housing. U.S. Department of Housing and Urban Development.

[4] Kutty, N. K. (2005). A new measure of housing affordability: Estimates and analytical results. Housing Policy Debate, 16(1), 113–142.

[5] Lumley, T. (2010). Complex surveys: A guide to analysis using R. John Wiley & Sons.

[6] Nardo, M., Saisana, M., Saltelli, A., & Tarantola, S. (2005). Tools for composite indicators building. European Commission.

[7] OECD. (2011). How’s life? Measuring well-being. OECD Publishing.

[8] Stone, M. E. (2006). What is housing affordability? The case for the residual income approach. Housing Policy Debate, 17(1), 151–184.

[9] World Bank. (2009). Reshaping economic geography. World Bank Publications.


Direktorat Statistik Kesejahteraan Rakyat, BPS,

LS0tDQp0aXRsZTogIkFuYWxpc2lzIFNwYXNpYWwgS2V0ZXJqYW5na2F1YW4gUGVydW1haGFuIDxicj4gZGFuIFRla2FuYW4gS2VzZWphaHRlcmFhbiBkaSBJbmRvbmVzaWEiDQpzdWJ0aXRsZTogIl9TcGF0aWFsIEhvdXNpbmcgQWZmb3JkYWJpbGl0eSBhbmQgV2VsZmFyZSBUcmFkZS1vZmYgQW5hbHlzaXMgaW4gSW5kb25lc2lhXyINCmF1dGhvcjogIlNhcHRhIEhhc3RobyBQb25jbyINCmRhdGU6ICJgciBTeXMuRGF0ZSgpYCINCm91dHB1dDoNCiAgaHRtbF9kb2N1bWVudDoNCiAgICBjb2RlX2Rvd25sb2FkOiB5ZXMNCiAgICBjb2RlX2ZvbGRpbmc6IHNob3cNCiAgICBudW1iZXJfc2VjdGlvbnM6IHllcw0KICAgIHRoZW1lOiBqb3VybmFsDQogICAgdG9jOiB5ZXMNCiAgICB0b2NfZmxvYXQ6IHllcw0KICB3b3JkX2RvY3VtZW50Og0KICAgIHRvYzogeWVzDQotLS0NCg0KYGBgez1odG1sfQ0KPHN0eWxlPg0KYm9keXsNCnRleHQtYWxpZ246IGp1c3RpZnl9DQo8L3N0eWxlPg0KYGBgDQoNCkFuYWxpc2lzIGtldGVyamFuZ2thdWFuIHBlcnVtYWhhbiBiZXJhbmdrYXQgZGFyaSBwZW1haGFtYW4gYmFod2EgcGVuZ2VsdWFyYW4gcGVydW1haGFuIHlhbmcgdGVybGFsdSBiZXNhciBkYXBhdCBtZW5ndXJhbmdpIGthcGFzaXRhcyBydW1haCB0YW5nZ2EgdW50dWsgbWVtZW51aGkga2VidXR1aGFuIGRhc2FyIGxhaW5ueWEuIExpdGVyYXR1ciBla29ub21pIHBlcnVtYWhhbiBtZW5la2Fua2FuIGJhaHdhIHBlcnVtYWhhbiBidWthbiBzZWthZGFyIGFzZXQgZmlzaWssIG1lbGFpbmthbiBrb21wb25lbiB1dGFtYSBkYWxhbSBzdHJ1a3R1ciBrZXNlamFodGVyYWFuIHJ1bWFoIHRhbmdnYSAoU3RvbmUsIDIwMDYpLiBPbGVoIGthcmVuYSBpdHUsIHBlbmd1a3VyYW4ga2V0ZXJqYW5na2F1YW4gcGVydW1haGFuIHBlcmx1IGRpa2FpdGthbiBzZWNhcmEgbGFuZ3N1bmcgZGVuZ2FuIGtvbmRpc2kga2VzZWphaHRlcmFhbiBub24tcGVydW1haGFuLg0KDQpQZW5kZWthdGFuIGluaSByZWxldmFuIGRhbGFtIGtvbnRla3MgbmVnYXJhIGJlcmtlbWJhbmcsIHRlcm1hc3VrIEluZG9uZXNpYSwgZGkgbWFuYSB0ZWthbmFuIGJpYXlhIGhpZHVwIHRpZGFrIGhhbnlhIGJlcmFzYWwgZGFyaSBoYXJnYSBydW1haCwgdGV0YXBpIGp1Z2EgZGFyaSB1dGlsaXRhcywgZW5lcmdpLCBkYW4gYmlheWEgcGVtZWxpaGFyYWFuIChBbmdlbCwgMjAwMCkuDQoNCg0KYGBge3Igc2V0dXAsIGluY2x1ZGU9VFJVRX0NCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSkNCmBgYA0KDQpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgZWNobz1GQUxTRX0NCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShzdXJ2ZXkpDQpsaWJyYXJ5KGphbml0b3IpDQpsaWJyYXJ5KHNjYWxlcykNCmxpYnJhcnkoaGF2ZW4pDQpsaWJyYXJ5KG9wZW54bHN4KQ0KYGBgDQoNCmBgYHtyLCBlY2hvPUZBTFNFfQ0Kc2V0d2QoIkQ6XFwyLiBQZW5nZW1iYW5nYW4gZGlyaVxcMSBFeGVyY2lzZSBCYWd1c1xcSG91c2luZyBBbmFseXNpcyIpDQpgYGANCg0KIyBTdW1iZXIgRGF0YQ0KDQpEYXRhIHlhbmcgZGlndW5ha2FuIGFkYWxhaCBTdXNlbmFzIE1hcmV0IDIwMjUuDQoNCmBgYHtyfQ0Kc3VzZW5hcyA8LSByZWFkX3NhdigiQkxPSzQzXzIwMjVfNS5zYXYiKSAlPiUNCiAgY2xlYW5fbmFtZXMoKQ0KYGBgDQoNCioqS29tcG9uZW4gcGVuZ2VsdWFyYW4gcGVydW1haGFuKioNCg0KRGFsYW0gYW5hbGlzaXMgaW5pLCBwZW5nZWx1YXJhbiBwZXJ1bWFoYW4gZGloaXR1bmcgc2VjYXJhIG1lbnllbHVydWggZGVuZ2FuIG1lbWFzdWtrYW4gYmVyYmFnYWkga29tcG9uZW4gYmlheWEgeWFuZyBiZW5hci1iZW5hciBkaWtlbHVhcmthbiBtYXVwdW4geWFuZyBiZXJzaWZhdCBpbXB1dGFzaS4gS29tcG9uZW4gdGVyc2VidXQgbWVsaXB1dGkgc2V3YSBydW1haCAoYmFpayBzZXdhIGFrdHVhbCBtYXVwdW4gcGVya2lyYWFuIHNld2EgdW50dWsgcnVtYWggbWlsaWsgc2VuZGlyaSksIGJpYXlhIHV0aWxpdGFzIGRhc2FyIHNlcGVydGkgbGlzdHJpayBkYW4gYWlyLCBwZW5nZWx1YXJhbiB1bnR1ayBiYWhhbiBiYWthciBtZW1hc2FrLCBzZXJ0YSBiaWF5YSBwZW1lbGloYXJhYW4gZGFuIGtlYnV0dWhhbiBydW1haCB0YW5nZ2EgbGFpbm55YS4gUGVuZGVrYXRhbiB5YW5nIGJlcnNpZmF0IGFncmVnYXRpZiBpbmkgbWVuZ2lrdXRpIHByYWt0aWsgdW11bSBkYWxhbSBwZW5ndWt1cmFuIHBlbmdlbHVhcmFuIHBlcnVtYWhhbiBwYWRhIGJlcmJhZ2FpIHN1cnZlaSBydW1haCB0YW5nZ2EsIGJhaWsgZGkgdGluZ2thdCBuYXNpb25hbCBtYXVwdW4gaW50ZXJuYXNpb25hbCAoT0VDRCwgMjAxMSkuDQoNClNlbWVudGFyYSBpdHUsIG5pbGFpIHlhbmcgaGlsYW5nIChfbWlzc2luZyB2YWx1ZXNfKSBkaWdhbnRpa2FuIGRlbmdhbiBub2wgdW50dWsgbWVuamFnYSBrb25zaXN0ZW5zaSBkYWxhbSBwZXJoaXR1bmdhbiB0b3RhbCBwZW5nZWx1YXJhbi4gRGFsYW0ga29udGVrcyBzdXJ2ZWkgcGVuZ2VsdWFyYW4sIG5pbGFpIGtvc29uZyB1bXVtbnlhIG1lbmNlcm1pbmthbiB0aWRhayBhZGFueWEgdHJhbnNha3NpIHBhZGEgcGVyaW9kZSB0ZXJ0ZW50dSwgYnVrYW4gYmVyYXJ0aSBkYXRhIHRlcnNlYnV0IHRpZGFrIHRlcnNlZGlhLiBEZW5nYW4gZGVtaWtpYW4sIHBlcmxha3VhbiBpbmkgbWVtYmFudHUgbWVtYXN0aWthbiBiYWh3YSBlc3RpbWFzaSB0b3RhbCBwZW5nZWx1YXJhbiB0ZXRhcCBha3VyYXQgZGFuIHRpZGFrIHRlcmRpc3RvcnNpLg0KDQpgYGB7cn0NCnN1c2VuYXMgPC0gc3VzZW5hcyAlPiUNCiAgbXV0YXRlKA0KICAgICMgUGVydW1haGFuDQogICAgcGVya2lyYWFuICA9IHNlYnVsYW5fMjI4LA0KICAgIHNld2EgICAgICAgPSBzZWJ1bGFuXzIyOSArIHNlYnVsYW5fMjMwLA0KICAgIHBlcnVtYWhhbiAgPSBzZWJ1bGFuXzIyOCArIHNlYnVsYW5fMjI5ICsgc2VidWxhbl8yMzAgKyBzZWJ1bGFuXzIzMSwNCiAgICAjIFV0aWxpdGFzDQogICAgbGlzdHJpayAgICA9IHNlYnVsYW5fMjM0LA0KICAgIGFpcnBhbSAgICAgPSBzZWJ1bGFuXzIzNiwNCiAgICAjIEVuZXJnaSBiYWhhbiBiYWthciBtZW1hc2FrDQogICAgYmFrYXJfbWFzYWsgPSBzZWJ1bGFuXzI1MyArIHNlYnVsYW5fMjU1ICsgc2VidWxhbl8yNTcgKyBzZWJ1bGFuXzI1OSArDQogICAgc2VidWxhbl8yNjAgKyBzZWJ1bGFuXzI2MSwNCiAgICAjIExhaW5ueWENCiAgICBwZXJiYWlrYW4gICAgICA9IHNlYnVsYW5fMjMyLA0KICAgIGtlYnV0dWhhbl9sYWluID0gc2VidWxhbl8yNjINCiAgKSAlPiUNCiAgbXV0YXRlKA0KICAgIGFjcm9zcygNCiAgICAgIGMocGVya2lyYWFuLCBzZXdhLCBwZXJ1bWFoYW4sDQogICAgICAgIGxpc3RyaWssIGFpcnBhbSwgYmFrYXJfbWFzYWssDQogICAgICAgIHBlcmJhaWthbiwga2VidXR1aGFuX2xhaW4pLA0KICAgICAgfnJlcGxhY2VfbmEoLiwgMCkNCiAgICApDQogICkNCmBgYA0KDQoNCioqVG90YWwgcGVuZ2VsdWFyYW4gcGVydW1haGFuIHNlYnVsYW4qKg0KDQpTZWx1cnVoIGtvbXBvbmVuIHBlbmdlbHVhcmFuIHBlcnVtYWhhbiBrZW11ZGlhbiBkaWp1bWxhaGthbiB1bnR1ayBtZW1iZW50dWsgaW5kaWthdG9yIHRvdGFsIHBlbmdlbHVhcmFuIHBlcnVtYWhhbiBidWxhbmFuIHJ1bWFoIHRhbmdnYSAoYGV4cF9ob3VzaW5nYCkuIFZhcmlhYmVsIGluaSBtZW5qYWRpIGtvbXBvbmVuIHV0YW1hIGRhbGFtIHBlbmd1a3VyYW4ga2V0ZXJqYW5na2F1YW4gcGVydW1haGFuIGRhbiB0ZWthbmFuIGVrb25vbWkgcnVtYWggdGFuZ2dhLg0KDQpgYGB7cn0NCnN1c2VuYXMgPC0gc3VzZW5hcyAlPiUNCiAgbXV0YXRlKA0KICAgIGV4cF9ob3VzaW5nID0gcGVydW1haGFuICsNCiAgICAgIGxpc3RyaWsgKw0KICAgICAgYWlycGFtICsNCiAgICAgIGJha2FyX21hc2FrICsNCiAgICAgIHBlcmJhaWthbiArDQogICAgICBrZWJ1dHVoYW5fbGFpbg0KICApDQpgYGANCg0KKipUaW5na2F0IGtlc2VqYWh0ZXJhYW4gKG5vbiBwZXJ1bWFoYW4pIHBlciBrYXBpdGEgc2VidWxhbioqDQoNClBlbmdlbHVhcmFuIG5vbi1wZXJ1bWFoYW4gcGVyIGthcGl0YSBkaWd1bmFrYW4gc2ViYWdhaSBpbmRpa2F0b3Iga2VzZWphaHRlcmFhbiBla29ub21pIHJ1bWFoIHRhbmdnYS4gTGl0ZXJhdHVyIGtlc2VqYWh0ZXJhYW4gbWVuZWthbmthbiBiYWh3YSBzaXNhIHBlbmdlbHVhcmFuIHNldGVsYWgga2VidXR1aGFuIHBlcnVtYWhhbiB0ZXJwZW51aGkgbWVuY2VybWlua2FuIF9yZXNpZHVhbCBpbmNvbWVfIHlhbmcgdGVyc2VkaWEgdW50dWsga29uc3Vtc2kgcGFuZ2FuLCBrZXNlaGF0YW4sIHBlbmRpZGlrYW4sIGRhbiBrZWJ1dHVoYW4gc29zaWFsIGxhaW5ueWEgKFN0b25lLCAyMDA2KS4NCg0KUGVuZGVrYXRhbiBpbmkgZGluaWxhaSBsZWJpaCBpbmZvcm1hdGlmIGRpYmFuZGluZ2thbiBpbmRpa2F0b3IgeWFuZyBzZW1hdGEtbWF0YSBiZXJ0dW1wdSBwYWRhIHBlbmRhcGF0YW4uIEhhbCBpbmkgdGVydXRhbWEgcmVsZXZhbiBkYWxhbSBrb250ZWtzIHBlcmVrb25vbWlhbiBpbmZvcm1hbCBkYW4ga29uZGlzaSBwZW5kYXBhdGFuIHlhbmcgY2VuZGVydW5nIGJlcmZsdWt0dWFzaSwgc2ViYWdhaW1hbmEgYmFueWFrIGRpanVtcGFpIGRpIG5lZ2FyYSBiZXJrZW1iYW5nIChEZWF0b24gJiBaYWlkaSwgMjAwMikuDQoNCmBgYHtyfQ0Kc3VzZW5hcyA8LSBzdXNlbmFzICU+JQ0KICBtdXRhdGUoDQogICAgZXhwX3RvdGFsID0gZXhwZW5kLA0KICAgIGhoc2l6ZSAgICA9IGphcnQsDQogICAgZXhwX25vbmhvdXNpbmdfcGMgPSBpZl9lbHNlKA0KICAgICAgaGhzaXplID4gMCwNCiAgICAgIChleHBfdG90YWwgLSBleHBfaG91c2luZykgLyBoaHNpemUsDQogICAgICBOQV9yZWFsXw0KICAgICkNCiAgKQ0KYGBgDQoNCiMgSG91c2luZyBDb3N0IEJ1cmRlbg0KDQpfSG91c2luZyBDb3N0IEJ1cmRlbl8gKEhDQikgZGloaXR1bmcgc2ViYWdhaSBwZXJiYW5kaW5nYW4gYW50YXJhIHBlbmdlbHVhcmFuIHVudHVrIHBlcnVtYWhhbiBkYW4gdG90YWwgcGVuZ2VsdWFyYW4gcnVtYWggdGFuZ2dhLiBTZWNhcmEgc2VkZXJoYW5hLCB1a3VyYW4gaW5pIG1lbnVuanVra2FuIHNlYmVyYXBhIGJlc2FyIHBvcnNpIGJlbGFuamEga2VsdWFyZ2EgeWFuZyDigJx0ZXJzZWRvdOKAnSB1bnR1ayBrZWJ1dHVoYW4gdGVtcGF0IHRpbmdnYWwuIEJhdGFzIDMwIHBlcnNlbiBkaWd1bmFrYW4gdW50dWsgbWVuaWxhaSBhcGFrYWggYmViYW4gdGVyc2VidXQgc3VkYWggdGVyZ29sb25nIGJlcmF0IChfdW5hZmZvcmRhYmxlXyksIG1lbmdpa3V0aSBwcmFrdGlrIHlhbmcgdW11bSBkaXBha2FpIGRhbGFtIGthamlhbiBrZWJpamFrYW4gcGVydW1haGFuIGRhbiBwZXJlbmNhbmFhbiBrb3RhIChIVUQsIDIwMTgpLg0KDQpXYWxhdXB1biBhbmdrYSAzMCBwZXJzZW4gaW5pIHBhZGEgZGFzYXJueWEgbWVydXBha2FuIGJhdGFzIG5vcm1hdGlmLCBiZXJiYWdhaSBwZW5lbGl0aWFuIG1lbnVuanVra2FuIGJhaHdhIGtldGlrYSBwZW5nZWx1YXJhbiBwZXJ1bWFoYW4gbWVsYW1wYXVpIGFtYmFuZyB0ZXJzZWJ1dCwgcnVtYWggdGFuZ2dhIGNlbmRlcnVuZyBoYXJ1cyBtZW5ndXJhbmdpIGJlbGFuamEgdW50dWsga2VidXR1aGFuIGRhc2FyIGxhaW5ueWEsIHNlcGVydGkgcGFuZ2FuLCBwZW5kaWRpa2FuLCBhdGF1IGtlc2VoYXRhbi4gS29uZGlzaSBpbmkgcGFkYSBha2hpcm55YSBkYXBhdCBtZW5pbmdrYXRrYW4ga2VyZW50YW5hbiBla29ub21pIGRhbiBtZW1wZXJzZW1waXQgcnVhbmcgZ2VyYWsga2V1YW5nYW4ga2VsdWFyZ2EgKEt1dHR5LCAyMDA1KS4NCg0KYGBge3J9DQpzdXNlbmFzIDwtIHN1c2VuYXMgJT4lDQogIG11dGF0ZSgNCiAgICBob3VzaW5nX2J1cmRlbiA9IGV4cF9ob3VzaW5nIC8gZXhwX3RvdGFsLA0KICAgIHVuYWZmb3JkYWJsZSAgID0gaWZfZWxzZShob3VzaW5nX2J1cmRlbiA+PSAwLjMwLCAxLCAwKQ0KICApDQpgYGANCg0KKipTZWxla3NpIGRhbiBQZW1iZXJzaWhhbiBWYXJpYWJlbCBBbmFsaXNpcyoqDQoNClBhZGEgdGFoYXAgaW5pLCBoYW55YSB2YXJpYWJlbCB5YW5nIGJlbmFyLWJlbmFyIHJlbGV2YW4gZGVuZ2FuIGtlYnV0dWhhbiBhbmFsaXNpcyB5YW5nIGRpcGVydGFoYW5rYW4gYWdhciBlZmlzaWVuLiBTZWxhbmp1dG55YSwgZGlsYWt1a2FuIHByb3NlcyBwZW55YXJpbmdhbiAoX2ZpbHRlcmluZ18pIHVudHVrIG1lbmdlbHVhcmthbiBvYnNlcnZhc2kgeWFuZyBtZW1pbGlraSBuaWxhaSBla3N0cmVtIGF0YXUgdGlkYWsgbWFzdWsgYWthbCwgbWlzYWxueWEgcmFzaW8gcGVuZ2VsdWFyYW4gcGVydW1haGFuIHlhbmcgYmVybmlsYWkgbm9sIGF0YXUgbWVsZWJpaGkgc2F0dSwgc2VydGEgcGVuZ2VsdWFyYW4gbm9uLXBlcnVtYWhhbiBwZXIga2FwaXRhIHlhbmcgYmVybmlsYWkgbmVnYXRpZiBhdGF1IG5vbC4NCg0KTGFuZ2thaCBpbmkgZGlsYWt1a2FuIHVudHVrIG1lbWFzdGlrYW4gaGFzaWwgZXN0aW1hc2kgdGV0YXAgc3RhYmlsIGRhbiB0aWRhayBkaXBlbmdhcnVoaSBvbGVoIG5pbGFpLW5pbGFpIHlhbmcgc2VjYXJhIGxvZ2lzIHN1bGl0IGRpcGVydGFuZ2d1bmdqYXdhYmthbi4gRGVuZ2FuIGRlbWlraWFuLCBrdWFsaXRhcyBhbmFsaXNpcyBkYXBhdCB0ZXJqYWdhIHRhbnBhIG1lbmd1YmFoIHBvbGEgZGlzdHJpYnVzaSB1dGFtYSBkYXRhIHNlY2FyYSBzdWJzdGFuc2lhbC4NCg0KDQpgYGB7cn0NCnN1c2VuYXMgPC0gc3VzZW5hcyAlPiUNCiAgc2VsZWN0KA0KICAgIGthYnUsDQogICAgcHN1LA0KICAgIHN0cmF0YSwNCiAgICB3ZXJ0LA0KICAgIGhvdXNpbmdfYnVyZGVuLA0KICAgIHVuYWZmb3JkYWJsZSwNCiAgICBleHBfbm9uaG91c2luZ19wYw0KICApICU+JQ0KICBmaWx0ZXIoDQogICAgaG91c2luZ19idXJkZW4gPiAwLA0KICAgIGhvdXNpbmdfYnVyZGVuIDwgMSwNCiAgICBleHBfbm9uaG91c2luZ19wYyA+IDANCiAgKQ0KYGBgDQoNCioqU3VydmV5IERlc2lnbioqDQoNCmBgYHtyfQ0Kb3B0aW9ucyhzdXJ2ZXkubG9uZWx5LnBzdSA9ICJhZGp1c3QiKQ0KDQpkZXMgPC0gc3Z5ZGVzaWduKA0KICBpZHMgICAgID0gfnBzdSwNCiAgc3RyYXRhICA9IH5zdHJhdGEsDQogIHdlaWdodHMgPSB+d2VydCwNCiAgZGF0YSAgICA9IHN1c2VuYXMsDQogIG5lc3QgICAgPSBUUlVFDQopDQpgYGANCg0KDQojIyBUcmFjdC1MZXZlbCBBZ2dyZWdhdGlvbg0KDQpQYWRhIHRhaGFwIHNlbGFuanV0bnlhLCBpbmRpa2F0b3IgeWFuZyB0ZWxhaCBkaWhpdHVuZyBwYWRhIHRpbmdrYXQgcnVtYWggdGFuZ2dhIGRpYWdyZWdhc2lrYW4ga2UgdGluZ2thdCBrYWJ1cGF0ZW4va290YS4gQWdyZWdhc2kgaW5pIG1lbXVuZ2tpbmthbiBhbmFsaXNpcyBzcGFzaWFsIGRhbiBwZXJiYW5kaW5nYW4gYW50YXJ3aWxheWFoIHNlY2FyYSBsZWJpaCBzaXN0ZW1hdGlzLiBEZW5nYW4gbWVsaWhhdCBwb2xhIHBhZGEgdGluZ2thdCB3aWxheWFoLCBkYXBhdCBkaWlkZW50aWZpa2FzaSBrZWNlbmRlcnVuZ2FuIHN0cnVrdHVyYWwsIG1pc2FsbnlhIGtvbnNlbnRyYXNpIGJlYmFuIGJpYXlhIHBlcnVtYWhhbiBkaSBkYWVyYWggdGVydGVudHUgeWFuZyBzZXJpbmcga2FsaSB0aWRhayB0YW1wYWsga2V0aWthIGFuYWxpc2lzIGhhbnlhIGRpbGFrdWthbiBwYWRhIGxldmVsIHJ1bWFoIHRhbmdnYS4gUGVuZGVrYXRhbiBhZ3JlZ2FzaSB3aWxheWFoIHNlcGVydGkgaW5pIGxhemltIGRpZ3VuYWthbiBkYWxhbSBzdHVkaSBrZXRpbXBhbmdhbiByZWdpb25hbCwga2FyZW5hIG1lbWJhbnR1IG1lbmFuZ2thcCBkaW5hbWlrYSBzcGFzaWFsIHBlbWJhbmd1bmFuIGRhbiBrZXNlbmphbmdhbiBhbnRhcndpbGF5YWggc2VjYXJhIGxlYmloIGtvbXByZWhlbnNpZiAoV29ybGQgQmFuaywgMjAwOSkuDQoNCmBgYHtyfQ0KdHJhY3RfdHJhZGVvZmYgPC0gc3Z5YnkoDQogIH5ob3VzaW5nX2J1cmRlbiArIHVuYWZmb3JkYWJsZSArIGV4cF9ub25ob3VzaW5nX3BjLA0KICB+a2FidSwNCiAgZGVzLA0KICBzdnltZWFuLA0KICBuYS5ybSA9IFRSVUUNCikgJT4lDQogIHJlbmFtZSgNCiAgICBtZWFuX2hvdXNpbmdfYnVyZGVuID0gaG91c2luZ19idXJkZW4sDQogICAgdW5hZmZvcmRhYmxlX3JhdGUgID0gdW5hZmZvcmRhYmxlLA0KICAgIHdlbGZhcmVfbm9uaG91c2luZyA9IGV4cF9ub25ob3VzaW5nX3BjDQogICkgJT4lDQogIG11dGF0ZSgNCiAgICBtZWFuX2hvdXNpbmdfYnVyZGVuID0gYXMubnVtZXJpYyhtZWFuX2hvdXNpbmdfYnVyZGVuKSwNCiAgICB3ZWxmYXJlX25vbmhvdXNpbmcgPSBhcy5udW1lcmljKHdlbGZhcmVfbm9uaG91c2luZykNCiAgKQ0KYGBgDQoNCg0KIyMgVHJhZGUtb2ZmIFR5cG9sb2d5DQoNCktsYXNpZmlrYXNpIF9ob3VzaW5n4oCTd2VsZmFyZSB0cmFkZS1vZmZfIGRpZ3VuYWthbiB1bnR1ayBtZW5naWRlbnRpZmlrYXNpIHdpbGF5YWggeWFuZyBtZW5naGFkYXBpIGJlYmFuIGJpYXlhIHBlcnVtYWhhbiB0aW5nZ2kgc2VrYWxpZ3VzIG1lbWlsaWtpIHRpbmdrYXQga2VzZWphaHRlcmFhbiBub24tcGVydW1haGFuIHlhbmcgcmVsYXRpZiByZW5kYWguIEtvbnNlcCBfdHJhZGUtb2ZmXyBpbmkgbWVuZ2dhbWJhcmthbiBrb25kaXNpIGtldGlrYSBwZW5pbmdrYXRhbiBwZW5nZWx1YXJhbiB1bnR1ayB0ZW1wYXQgdGluZ2dhbCBzZXJpbmcga2FsaSBoYXJ1cyDigJxkaWJheWFy4oCdIGRlbmdhbiBwZW5ndXJhbmdhbiBhbG9rYXNpIGJlbGFuamEgdW50dWsga2VidXR1aGFuIHBlbnRpbmcgbGFpbm55YSwgc2VwZXJ0aSBwYW5nYW4sIHBlbmRpZGlrYW4sIGtlc2VoYXRhbiwgbWF1cHVuIGtlYnV0dWhhbiBkYXNhciBydW1haCB0YW5nZ2EgbGFpbm55YSAoQW5nZWwsIDIwMDApLg0KDQpQZW5nZWxvbXBva2thbiBfaG91c2luZ+KAk3dlbGZhcmUgdHJhZGUtb2ZmXyBkaWxha3VrYW4gZGVuZ2FuIG1lbWJhZ2kgd2lsYXlhaCBrZSBkYWxhbSBlbXBhdCBrYXRlZ29yaSBiZXJkYXNhcmthbiBwb3Npc2kgcmVsYXRpZm55YSB0ZXJoYWRhcCBuaWxhaSBtZWRpYW4gbmFzaW9uYWwgZGFyaSBkdWEgaW5kaWthdG9yIHV0YW1hLCB5YWl0dSByYXRhLXJhdGEgYmViYW4gYmlheWEgcGVydW1haGFuIChfbWVhbiBob3VzaW5nIGNvc3QgYnVyZGVuXykgZGFuIHBlbmdlbHVhcmFuIG5vbi1wZXJ1bWFoYW4gcGVyIGthcGl0YSAoX25vbi1ob3VzaW5nIGV4cGVuZGl0dXJlIHBlciBjYXBpdGFfKS4gUGVuZ2d1bmFhbiBtZWRpYW4gc2ViYWdhaSB0aXRpayBwZW1iYW5kaW5nIGRpcGlsaWgga2FyZW5hIGxlYmloIHRhaGFuIHRlcmhhZGFwIHBlbmdhcnVoIG5pbGFpIG91dGxpZXIgc2VoaW5nZ2EgbWFtcHUgbWVtYmVyaWthbiBnYW1iYXJhbiBwZXJiYW5kaW5nYW4gYW50YXJ3aWxheWFoIHlhbmcgbGViaWggc3RhYmlsIGRhbiByZXByZXNlbnRhdGlmLiBQZW5kZWthdGFuIGluaSBqdWdhIG1lbWJhbnR1IG1lbm9uam9sa2FuIHBlcmJlZGFhbiBrYXJha3RlcmlzdGlrIGtlc2VqYWh0ZXJhYW4gd2lsYXlhaCBzZWNhcmEgbGViaWggcHJvcG9yc2lvbmFsLg0KDQoxLiBXaWxheWFoIHlhbmcgbWVtaWxpa2kgYmViYW4gYmlheWEgcGVydW1haGFuIGRpIGF0YXMgbWVkaWFuIG5hc2lvbmFsIHRldGFwaSB0aW5na2F0IGtlc2VqYWh0ZXJhYW4gbm9uLXBlcnVtYWhhbiBkaSBiYXdhaCBtZWRpYW4gZGlrbGFzaWZpa2FzaWthbiBzZWJhZ2FpICoqSGlnaCBIb3VzaW5nIENvc3Qg4oCTIExvdyBXZWxmYXJlKiouIEtlbG9tcG9rIGluaSBtZW5jZXJtaW5rYW4ga29uZGlzaSB5YW5nIHBhbGluZyBzZXJpdXMsIGRpIG1hbmEgcGVuZ2VsdWFyYW4gcGVydW1haGFuIG1lbnllcmFwIHBvcnNpIGJlc2FyIGFuZ2dhcmFuIHJ1bWFoIHRhbmdnYSBzZWhpbmdnYSBtZW55aXNha2FuIHJ1YW5nIHlhbmcgdGVyYmF0YXMgdW50dWsgbWVtZW51aGkga2VidXR1aGFuIGRhc2FyIGxhaW5ueWEuIERhbGFtIGtvbnRla3Mga2ViaWpha2FuLCB3aWxheWFoIHBhZGEga2F0ZWdvcmkgaW5pIG1lbmphZGkgcHJpb3JpdGFzIHV0YW1hIGludGVydmVuc2kgcGVydW1haGFuLCBrYXJlbmEgdGVrYW5hbiBiaWF5YSBodW5pYW4gYmVycG90ZW5zaSBtZW1wZXJidXJ1ayBrZXJlbnRhbmFuIGtlc2VqYWh0ZXJhYW4gcnVtYWggdGFuZ2dhLg0KDQoyLiBTZWJhbGlrbnlhLCB3aWxheWFoIGRlbmdhbiBiZWJhbiBiaWF5YSBwZXJ1bWFoYW4gdGluZ2dpIHRldGFwaSBrZXNlamFodGVyYWFuIG5vbi1wZXJ1bWFoYW4ganVnYSB0aW5nZ2kgZGlrbGFzaWZpa2FzaWthbiBzZWJhZ2FpICoqSGlnaCBIb3VzaW5nIENvc3Qg4oCTIEhpZ2ggV2VsZmFyZSoqLiBLb25kaXNpIGluaSBtZW51bmp1a2thbiBiYWh3YSBtZXNraXB1biBiaWF5YSBwZXJ1bWFoYW4gcmVsYXRpZiBtYWhhbCwgcnVtYWggdGFuZ2dhIGRpIHdpbGF5YWggdGVyc2VidXQgbWFzaWggbWVtaWxpa2kga2FwYXNpdGFzIGVrb25vbWkgeWFuZyBjdWt1cCB1bnR1ayBtZW1wZXJ0YWhhbmthbiB0aW5na2F0IGtvbnN1bXNpIG5vbi1wZXJ1bWFoYW4geWFuZyB0aW5nZ2kuIFRpbmdnaW55YSBiaWF5YSBwZXJ1bWFoYW4gdGlkYWsgc2VsYWx1IGJlcmltcGxpa2FzaSBwYWRhIHBlbnVydW5hbiBrZXNlamFodGVyYWFuLg0KDQozLiBLZWxvbXBvayAqKkxvdyBIb3VzaW5nIENvc3Qg4oCTIExvdyBXZWxmYXJlKiogbWVuZ2dhbWJhcmthbiB3aWxheWFoIGRlbmdhbiBiZWJhbiBiaWF5YSBwZXJ1bWFoYW4gcmVsYXRpZiByZW5kYWggdGV0YXBpIHRpbmdrYXQga2VzZWphaHRlcmFhbiBub24tcGVydW1haGFuIGp1Z2EgcmVuZGFoLiBLb25kaXNpIGluaSBtZW5naW5kaWthc2lrYW4gYmFod2EgcGVybWFzYWxhaGFuIHV0YW1hIGtlc2VqYWh0ZXJhYW4gcnVtYWggdGFuZ2dhIGRpIHdpbGF5YWggdGVyc2VidXQgYnVrYW4gdGVybGV0YWsgcGFkYSBzZWt0b3IgcGVydW1haGFuLCBtZWxhaW5rYW4gcGFkYSBrZXRlcmJhdGFzYW4ga2FwYXNpdGFzIGVrb25vbWkgc2VjYXJhIHVtdW0uIE9sZWgga2FyZW5hIGl0dSwga2ViaWpha2FuIHlhbmcgaGFueWEgYmVyZm9rdXMgcGFkYSBwZXJ1bWFoYW4gY2VuZGVydW5nIGt1cmFuZyBlZmVrdGlmLCBkYW4gcGVybHUgZGlsZW5na2FwaSBkZW5nYW4gaW50ZXJ2ZW5zaSBwZW1iYW5ndW5hbiBla29ub21pLCBwZW5jaXB0YWFuIGxhcGFuZ2FuIGtlcmphLCBzZXJ0YSBwZW5pbmdrYXRhbiBwcm9kdWt0aXZpdGFzLg0KDQo0LiBTZW1lbnRhcmEgaXR1LCB3aWxheWFoIHlhbmcgdGVybWFzdWsgZGFsYW0ga2F0ZWdvcmkgKipMb3cgSG91c2luZyBDb3N0IOKAkyBIaWdoIFdlbGZhcmUqKiBtZXJ1cGFrYW4ga2Vsb21wb2sgZGVuZ2FuIGJlYmFuIGJpYXlhIHBlcnVtYWhhbiByZW5kYWggZGFuIHRpbmdrYXQga2VzZWphaHRlcmFhbiBub24tcGVydW1haGFuIHRpbmdnaS4gS2Vsb21wb2sgaW5pIG1lbmNlcm1pbmthbiBrb25kaXNpIHN0cnVrdHVyYWwgeWFuZyByZWxhdGlmIHBhbGluZyBtZW5ndW50dW5na2FuLCBkaSBtYW5hIHJ1bWFoIHRhbmdnYSBtYW1wdSBtZW1lbnVoaSBrZWJ1dHVoYW4gcGVydW1haGFuIHRhbnBhIG1lbmdvcmJhbmthbiBrb25zdW1zaSBub24tcGVydW1haGFuLg0KDQpgYGB7cn0NCmhiX21lZCAgPC0gbWVkaWFuKHRyYWN0X3RyYWRlb2ZmJG1lYW5faG91c2luZ19idXJkZW4sIG5hLnJtID0gVFJVRSkNCndlbF9tZWQgPC0gbWVkaWFuKHRyYWN0X3RyYWRlb2ZmJHdlbGZhcmVfbm9uaG91c2luZywgbmEucm0gPSBUUlVFKQ0KDQp0cmFjdF90cmFkZW9mZiA8LSB0cmFjdF90cmFkZW9mZiAlPiUNCiAgbXV0YXRlKA0KICAgIHRyYWRlb2ZmX3R5cGUgPSBjYXNlX3doZW4oDQogICAgICBtZWFuX2hvdXNpbmdfYnVyZGVuID49IGhiX21lZCAmIHdlbGZhcmVfbm9uaG91c2luZyA8IHdlbF9tZWQgIH4NCiAgICAgICAgIkhpZ2ggSG91c2luZyBDb3N0IOKAkyBMb3cgV2VsZmFyZSIsDQogICAgICBtZWFuX2hvdXNpbmdfYnVyZGVuID49IGhiX21lZCAmIHdlbGZhcmVfbm9uaG91c2luZyA+PSB3ZWxfbWVkIH4NCiAgICAgICAgIkhpZ2ggSG91c2luZyBDb3N0IOKAkyBIaWdoIFdlbGZhcmUiLA0KICAgICAgbWVhbl9ob3VzaW5nX2J1cmRlbiA8IGhiX21lZCAgJiB3ZWxmYXJlX25vbmhvdXNpbmcgPCB3ZWxfbWVkICB+DQogICAgICAgICJMb3cgSG91c2luZyBDb3N0IOKAkyBMb3cgV2VsZmFyZSIsDQogICAgICBUUlVFIH4NCiAgICAgICAgIkxvdyBIb3VzaW5nIENvc3Qg4oCTIEhpZ2ggV2VsZmFyZSINCiAgICApDQogICkNCmhlYWQodHJhY3RfdHJhZGVvZmZbLGMoMTo0LDgpXSkNCmBgYA0KDQpgYGB7cn0NCiNFeHBvcnQgdG8gRXhjZWwNCndyaXRlLnhsc3goDQogIHRyYWN0X3RyYWRlb2ZmLA0KICBmaWxlID0gImhvdXNpbmdfd2VsZmFyZV90cmFkZW9mZl9rYWJrb3RhLnhsc3giLA0KICBvdmVyd3JpdGUgPSBUUlVFDQopDQpgYGANCg0KDQoqKlZpc3VhbGl6YXRpb24qKg0KDQpgYGB7cn0NCmdncGxvdCh0cmFjdF90cmFkZW9mZiwNCiAgICAgICBhZXMobWVhbl9ob3VzaW5nX2J1cmRlbiwNCiAgICAgICAgICAgd2VsZmFyZV9ub25ob3VzaW5nLA0KICAgICAgICAgICBjb2xvciA9IHRyYWRlb2ZmX3R5cGUpKSArDQogIGdlb21fcG9pbnQoc2l6ZSA9IDMsIGFscGhhID0gMC44KSArDQogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IGhiX21lZCwgbGluZXR5cGUgPSAiZGFzaGVkIikgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSB3ZWxfbWVkLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArDQogIHNjYWxlX3hfY29udGludW91cyhsYWJlbHMgPSBwZXJjZW50X2Zvcm1hdCgpKSArDQogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBjb21tYSkgKw0KICBsYWJzKA0KICAgIHRpdGxlID0gIkhvdXNpbmctV2VsZmFyZSBUcmFkZS1vZmYgQWNyb3NzIERpc3RyaWN0cyIsDQogICAgeCA9ICJBdmVyYWdlIEhvdXNpbmcgQ29zdCBCdXJkZW4iLA0KICAgIHkgPSAiTm9uLUhvdXNpbmcgRXhwZW5kaXR1cmUgcGVyIENhcGl0YSIsDQogICAgY29sb3IgPSAiVHJhZGUtb2ZmIFR5cGUiDQogICkgKw0KICB0aGVtZV9taW5pbWFsKCkNCmBgYA0KDQpTZWJhcmFuIHRpdGlrIHlhbmcgcmVsYXRpZiBtZXJhdGEgZGkga2VlbXBhdCBrdWFkcmFuIG1lbnVuanVra2FuIGFkYW55YSBoZXRlcm9nZW5pdGFzIGFudGFyd2lsYXlhaC4gS3VhZHJhbiBrYW5hbiBiYXdhaCAoX0hpZ2ggSG91c2luZyBDb3N0IOKAkyBMb3cgV2VsZmFyZV8pIG1lbmNlcm1pbmthbiB3aWxheWFoIGRlbmdhbiB0ZWthbmFuIHBlcnVtYWhhbiBwYWxpbmcgYmVyYXQga2FyZW5hIHRpbmdnaW55YSBiaWF5YSBodW5pYW4gdGlkYWsgZGlpbWJhbmdpIGthcGFzaXRhcyBrb25zdW1zaSBsYWluLiBLdWFkcmFuIGthbmFuIGF0YXMgKF9IaWdoIEhvdXNpbmcgQ29zdCDigJMgSGlnaCBXZWxmYXJlXykgbWVudW5qdWtrYW4gZGFlcmFoIGRlbmdhbiBla29ub21pIGt1YXQsIGRpIG1hbmEgYmlheWEgaHVuaWFuIHRpbmdnaSB0aWRhayBzZWxhbHUgYmVyYXJ0aSBrZXJlbnRhbmFuLiBEaSBzaXNpIGxhaW4sIGt1YWRyYW4ga2lyaSBiYXdhaCAoX0xvdyBIb3VzaW5nIENvc3Qg4oCTIExvdyBXZWxmYXJlXykgbWVuYW5kYWthbiB3aWxheWFoIGRlbmdhbiBkYXlhIGJlbGkgcmVuZGFoLCBzZWhpbmdnYSBpc3UgdXRhbWFueWEgbGViaWggdGVya2FpdCBrZW1pc2tpbmFuIHN0cnVrdHVyYWwuIFNlbWVudGFyYSBpdHUsIGt1YWRyYW4ga2lyaSBhdGFzIChfTG93IEhvdXNpbmcgQ29zdCDigJMgSGlnaCBXZWxmYXJlXykgbWVuZ2dhbWJhcmthbiBrb25kaXNpIHBhbGluZyBpZGVhbCwgZGVuZ2FuIGJlYmFuIHBlcnVtYWhhbiByZW5kYWggZGFuIGtlc2VqYWh0ZXJhYW4gcmVsYXRpZiB0aW5nZ2kuDQoNClNlY2FyYSBrZXNlbHVydWhhbiwgcG9sYSBpbmkgbWVuZWdhc2thbiBiYWh3YSBodWJ1bmdhbiBhbnRhcmEgYmlheWEgcGVydW1haGFuIGRhbiBrZXNlamFodGVyYWFuIHRpZGFrIGJlcnNpZmF0IGxpbmllci4gS2FyZW5hIGl0dSwgcGVuZGVrYXRhbiBiZXJiYXNpcyBfdHJhZGUtb2ZmXyBwZW50aW5nIHVudHVrIG1lcnVtdXNrYW4ga2ViaWpha2FuIHlhbmcgbGViaWgga29udGVrc3R1YWwgZGFuIHRpZGFrIHNhdHUgZGltZW5zaS4NCg0KKipNZWFuIEhvdXNpbmcgQnVyZGVuIHBlciBLYWIvS290YSoqDQoNCmBgYHtyfQ0KZ2dwbG90KA0KICB0cmFjdF90cmFkZW9mZiAlPiUNCiAgICBhcnJhbmdlKG1lYW5faG91c2luZ19idXJkZW4pICU+JQ0KICAgIG11dGF0ZShrYWJ1ID0gZmFjdG9yKGthYnUsIGxldmVscyA9IGthYnUpKSwNCiAgYWVzKHggPSBrYWJ1LCB5ID0gbWVhbl9ob3VzaW5nX2J1cmRlbikNCikgKw0KICBnZW9tX2NvbChmaWxsID0gIiMyQzdGQjgiKSArDQogIGNvb3JkX2ZsaXAoKSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAuMzAsDQogICAgICAgICAgICAgbGluZXR5cGUgPSAiZGFzaGVkIiwNCiAgICAgICAgICAgICBjb2xvciA9ICJyZWQiKSArDQogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBwZXJjZW50X2Zvcm1hdCgpKSArDQogIGxhYnMoDQogICAgdGl0bGUgPSAiQXZlcmFnZSBIb3VzaW5nIENvc3QgQnVyZGVuIGJ5IERpc3RyaWN0IiwNCiAgICBzdWJ0aXRsZSA9ICJSZWQgbGluZSBpbmRpY2F0ZXMgMzAlIGFmZm9yZGFiaWxpdHkgdGhyZXNob2xkIiwNCiAgICB4ID0gIkRpc3RyaWN0IChLYWIvS290YSkiLA0KICAgIHkgPSAiTWVhbiBIb3VzaW5nIENvc3QgQnVyZGVuIg0KICApICsNCiAgdGhlbWVfbWluaW1hbCgpDQpgYGANCg0KR3JhZmlrIEF2ZXJhZ2UgSG91c2luZyBDb3N0IEJ1cmRlbiBieSBEaXN0cmljdCBtZW5hbXBpbGthbiByYXRhLXJhdGEgYmViYW4gYmlheWEgcGVydW1haGFuIChIQ0IpIHNlbHVydWgga2FidXBhdGVuL2tvdGEgeWFuZyBkaXVydXRrYW4gZGFyaSB0ZXJlbmRhaCBoaW5nZ2EgdGVydGluZ2dpLiBTZXRpYXAgYmF0YW5nIG1lcmVwcmVzZW50YXNpa2FuIHNhdHUgd2lsYXlhaCwgZGFuIHN1bWJ1IGhvcml6b250YWwgbWVudW5qdWtrYW4gcHJvcG9yc2kgcGVuZ2VsdWFyYW4gcGVydW1haGFuIHRlcmhhZGFwIHRvdGFsIHBlbmdlbHVhcmFuIHJ1bWFoIHRhbmdnYS4gR3JhZmlrIGluaSBkaXR1anVrYW4gdW50dWsgbWVsaWhhdCBwb2xhIGRpc3RyaWJ1c2kgc2VjYXJhIHVtdW0sIGJ1a2FuIG1lbWJhbmRpbmdrYW4gd2lsYXlhaCBzYXR1IHBlciBzYXR1Lg0KDQpHYXJpcyBtZXJhaCBwdXR1cy1wdXR1cyBwYWRhIGFuZ2thIDMwJSBtZW51bmp1a2thbiBhbWJhbmcga2V0ZXJqYW5na2F1YW4geWFuZyBsYXppbSBkaWd1bmFrYW4uIFdpbGF5YWggZGkga2FuYW4gZ2FyaXMgdGVyc2VidXQgbWVtaWxpa2kgcmF0YS1yYXRhIEhDQiBkaSBhdGFzIDMwJSBkYW4gbWVuZ2hhZGFwaSB0ZWthbmFuIGJpYXlhIHBlcnVtYWhhbiB5YW5nIHJlbGF0aWYgdGluZ2dpLCBzZWRhbmdrYW4gd2lsYXlhaCBkaSBraXJpIG1hc2loIHRlcmdvbG9uZyBsZWJpaCB0ZXJqYW5na2F1Lg0KDQpTZWNhcmEga2VzZWx1cnVoYW4sIGdyYWZpayBpbmkgbWVtcGVybGloYXRrYW4gc2ViZXJhcGEgbHVhcyBkYW4gc2ViZXJhcGEgc2VyaXVzIGlzdSBrZXRlcmphbmdrYXVhbiBwZXJ1bWFoYW4gdGVyc2ViYXIgYW50YXJ3aWxheWFoLCBtZW5lZ2Fza2FuIGJhaHdhIHBlcnNvYWxhbiBpbmkgYmVyc2lmYXQgc3RydWt0dXJhbCBkZW5nYW4gdGluZ2thdCBrZXBhcmFoYW4geWFuZyBiZXJ2YXJpYXNpLg0KDQoNCiMgSENCIHZzIFVuYWZmb3JkYWJsZSBSYXRlDQoNClRhaGFwYW4gaW5pIGRpZ3VuYWthbiB1bnR1ayBtZW5nZWNlayBhcGFrYWggYmViYW4gYmlheWEgcGVydW1haGFuIHlhbmcgdGluZ2dpIGJlbmFyLWJlbmFyIHNlamFsYW4gZGVuZ2FuIG1lbmluZ2thdG55YSBwcm9wb3JzaSBydW1haCB0YW5nZ2EgdGlkYWsgdGVyamFuZ2thdSAoX3VuYWZmb3JkYWJsZV8pIGRpIHRpbmdrYXQga2FidXBhdGVuL2tvdGEuDQoNCg0KYGBge3J9DQpnZ3Bsb3QodHJhY3RfdHJhZGVvZmYsDQogICAgICAgYWVzKG1lYW5faG91c2luZ19idXJkZW4sDQogICAgICAgICAgIHVuYWZmb3JkYWJsZV9yYXRlKSkgKw0KICBnZW9tX3BvaW50KHNpemUgPSAzLCBhbHBoYSA9IDAuOCwgY29sb3IgPSAiI0Q5NUYwMiIpICsNCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgc2UgPSBGQUxTRSwgbGluZXR5cGUgPSAiZGFzaGVkIikgKw0KICBzY2FsZV94X2NvbnRpbnVvdXMobGFiZWxzID0gcGVyY2VudF9mb3JtYXQoKSkgKw0KICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gcGVyY2VudF9mb3JtYXQoKSkgKw0KICBsYWJzKA0KICAgIHRpdGxlID0gIkhvdXNpbmcgQ29zdCBCdXJkZW4gdnMgVW5hZmZvcmRhYmlsaXR5IFJhdGUiLA0KICAgIHggPSAiQXZlcmFnZSBIb3VzaW5nIENvc3QgQnVyZGVuIiwNCiAgICB5ID0gIlNoYXJlIG9mIFVuYWZmb3JkYWJsZSBIb3VzZWhvbGRzIg0KICApICsNCiAgdGhlbWVfbWluaW1hbCgpDQpgYGANCg0KU2V0aWFwIHRpdGlrIHBhZGEgZ3JhZmlrIG1ld2FraWxpIHNhdHUga2FidXBhdGVuL2tvdGEuIFN1bWJ1IGhvcml6b250YWwgbWVudW5qdWtrYW4gcmF0YS1yYXRhIF9Ib3VzaW5nIENvc3QgQnVyZGVuXyAoSENCKSwgc2VkYW5na2FuIHN1bWJ1IHZlcnRpa2FsIG1lbnVuanVra2FuIHBlcnNlbnRhc2UgcnVtYWggdGFuZ2dhIHlhbmcgbWVuZ2VsdWFya2FuIOKJpTMwJSBkYXJpIHRvdGFsIGJlbGFuamEgdW50dWsgcGVydW1haGFuLiBEZW5nYW4gbWVuYW1waWxrYW4ga2VkdWFueWEgZGFsYW0gc2F0dSBiaWRhbmcsIGdyYWZpayBpbmkgbWVtYmFudHUgbWVsaWhhdCBhcGFrYWggd2lsYXlhaCBkZW5nYW4gYmViYW4gcmF0YS1yYXRhIGxlYmloIHRpbmdnaSBtZW1hbmcganVnYSBtZW1pbGlraSBsZWJpaCBiYW55YWsgcnVtYWggdGFuZ2dhIHlhbmcgbWVyYXNhIOKAnHRlcnRla2Fu4oCdIG9sZWggYmlheWEgaHVuaWFuLg0KDQpHYXJpcyBwdXR1cy1wdXR1cyBkYXJpIHJlZ3Jlc2kgbGluaWVyIG1lbnVuanVra2FuIGFyYWggaHVidW5nYW4gdGVyc2VidXQuIEppa2EgZ2FyaXNueWEgbWVuYW5qYWssIGFydGlueWEgc2VtYWtpbiB0aW5nZ2kgcmF0YS1yYXRhIEhDQiBzdWF0dSB3aWxheWFoLCBzZW1ha2luIGJlc2FyIHB1bGEgcHJvcG9yc2kgcnVtYWggdGFuZ2dhIHlhbmcgdGlkYWsgdGVyamFuZ2thdS4gU2VjYXJhIHNlZGVyaGFuYSwgZ3JhZmlrIGluaSBtZW5ndWppIGFwYWthaCBhbmdrYSByYXRhLXJhdGEgYmVuYXItYmVuYXIgbWVuY2VybWlua2FuIGtlbnlhdGFhbiBkaSBsYXBhbmdhbi4gSmlrYSBodWJ1bmdhbiBrZWR1YW55YSBrdWF0IGRhbiBwb3NpdGlmLCBtYWthIEhDQiBkYXBhdCBkaWFuZ2dhcCBzZWJhZ2FpIGluZGlrYXRvciB5YW5nIGN1a3VwIGFuZGFsIHVudHVrIG1lbWJhY2EgdGVrYW5hbiBiaWF5YSBwZXJ1bWFoYW4gZGFuIG1lbmphZGkgZGFzYXIgcGVydW11c2FuIGtlYmlqYWthbi4NCg0KDQojIEhvdXNpbmcgU3RyZXNzIEluZGV4DQoNCl9Ib3VzaW5nIFN0cmVzcyBJbmRleF8gZGlrZW1iYW5na2FuIHNlYmFnYWkgaW5kaWthdG9yIGtvbXBvc2l0IHVudHVrIG1lbmFuZ2thcCB0aW5na2F0IHRla2FuYW4gcGVydW1haGFuIHNlY2FyYSByZWxhdGlmIGFudGFyd2lsYXlhaC4gRGVuZ2FuIG1lbnN0YW5kYXJrYW4gYmViYW4gYmlheWEgcGVydW1haGFuIGRhbiB0aW5na2F0IGtlc2VqYWh0ZXJhYW4gbm9uLXBlcnVtYWhhbiwgaW5kZWtzIGluaSBtZW11bmdraW5rYW4gcGVyYmFuZGluZ2FuIHlhbmcgbGViaWggYWRpbCBhbnRhciBkYWVyYWgsIHRhbnBhIHRlcmRpc3RvcnNpIG9sZWggcGVyYmVkYWFuIHNrYWxhIGF0YXUgYmVzYXJhbiBhYnNvbHV0IG1hc2luZy1tYXNpbmcgd2lsYXlhaCAoT0VDRCwgMjAxMSkuDQoNClBlbmRla2F0YW4gaW5pIG1lbmdpa3V0aSBwcmFrdGlrIHVtdW0gZGFsYW0gcGVueXVzdW5hbiBpbmRla3Mgc29zaWFsLWVrb25vbWkgYmVyYmFzaXMgei1zY29yZSwgeWFuZyBiYW55YWsgZGlndW5ha2FuIHVudHVrIG1lbmd1a3VyIGtlcmVudGFuYW4gZGFuIGtlc2VqYWh0ZXJhYW4gd2lsYXlhaCBzZWNhcmEga29tcGFyYXRpZiAoTmFyZG8gZXQgYWwuLCAyMDA1KS4gRGVuZ2FuIGNhcmEgaW5pLCBwb3Npc2kgc3VhdHUgZGFlcmFoIGRhcGF0IGRpYmFjYSBzZWNhcmEgbGViaWggcHJvcG9yc2lvbmFsIGRhbGFtIGtvbnRla3MgbmFzaW9uYWwuDQoNCg0KYGBge3J9DQp0cmFjdF90cmFkZW9mZiA8LSB0cmFjdF90cmFkZW9mZiAlPiUNCiAgbXV0YXRlKA0KICAgIHpfaG91c2luZyA9IGFzLm51bWVyaWMoc2NhbGUobWVhbl9ob3VzaW5nX2J1cmRlbikpLA0KICAgIHpfd2VsZmFyZSA9IGFzLm51bWVyaWMoc2NhbGUod2VsZmFyZV9ub25ob3VzaW5nKSksDQogICAgaG91c2luZ19zdHJlc3NfaW5kZXggPSAoel9ob3VzaW5nIC0gel93ZWxmYXJlKSAvIDINCiAgKQ0KYGBgDQoNCg0KKipTdHJlc3MgQ2xhc3NpZmljYXRpb24qKg0KDQpgYGB7cn0NCnRyYWN0X3RyYWRlb2ZmIDwtIHRyYWN0X3RyYWRlb2ZmICU+JQ0KICBtdXRhdGUoDQogICAgc3RyZXNzX2NhdGVnb3J5ID0gY2FzZV93aGVuKA0KICAgICAgaG91c2luZ19zdHJlc3NfaW5kZXggPj0gIDAuNzUgfiAiU2V2ZXJlIFN0cmVzcyIsDQogICAgICBob3VzaW5nX3N0cmVzc19pbmRleCA+PSAgMC4yNSB+ICJNb2RlcmF0ZSBTdHJlc3MiLA0KICAgICAgaG91c2luZ19zdHJlc3NfaW5kZXggPj0gLTAuMjUgfiAiTmV1dHJhbCIsDQogICAgICBUUlVFICAgICAgICAgICAgICAgICAgICAgICAgICB+ICJMb3cgU3RyZXNzIg0KICAgICkNCiAgKQ0KYGBgDQoNCg0KRXhwb3J0IHRvIEV4Y2VsDQoNCmBgYHtyfQ0Kd3JpdGUueGxzeCgNCiAgdHJhY3RfdHJhZGVvZmYsDQogICJob3VzaW5nX3N0cmVzc19pbmRleF9rYWJrb3RhLnhsc3giLA0KICBvdmVyd3JpdGUgPSBUUlVFDQopDQpgYGANCg0KKipWaXN1YWxpemF0aW9uKioNCg0KYGBge3J9DQpnZ3Bsb3QodHJhY3RfdHJhZGVvZmYsDQogICAgICAgYWVzKG1lYW5faG91c2luZ19idXJkZW4sDQogICAgICAgICAgIHdlbGZhcmVfbm9uaG91c2luZywNCiAgICAgICAgICAgY29sb3IgPSBzdHJlc3NfY2F0ZWdvcnkpKSArDQogIGdlb21fcG9pbnQoc2l6ZSA9IDMsIGFscGhhID0gMC44KSArDQogIHNjYWxlX3hfY29udGludW91cyhsYWJlbHMgPSBwZXJjZW50X2Zvcm1hdCgpKSArDQogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBjb21tYSkgKw0KICBsYWJzKA0KICAgIHRpdGxlID0gIkhvdXNpbmcgU3RyZXNzIEluZGV4IEFjcm9zcyBEaXN0cmljdHMiLA0KICAgIHggPSAiQXZlcmFnZSBIb3VzaW5nIENvc3QgQnVyZGVuIiwNCiAgICB5ID0gIk5vbi1Ib3VzaW5nIEV4cGVuZGl0dXJlIHBlciBDYXBpdGEiLA0KICAgIGNvbG9yID0gIlN0cmVzcyBMZXZlbCINCiAgKSArDQogIHRoZW1lX21pbmltYWwoKQ0KYGBgDQoNCiMjIEhTSSBSYW5raW5nDQoNCmBgYHtyfQ0KZ2dwbG90KA0KICB0cmFjdF90cmFkZW9mZiAlPiUNCiAgICBhcnJhbmdlKGhvdXNpbmdfc3RyZXNzX2luZGV4KSAlPiUNCiAgICBtdXRhdGUoa2FidSA9IGZhY3RvcihrYWJ1LCBsZXZlbHMgPSBrYWJ1KSksDQogIGFlcyh4ID0ga2FidSwgeSA9IGhvdXNpbmdfc3RyZXNzX2luZGV4LA0KICAgICAgY29sb3IgPSBzdHJlc3NfY2F0ZWdvcnkpDQopICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgbGluZXR5cGUgPSAiZGFzaGVkIiwgY29sb3IgPSAiZ3JleTQwIikgKw0KICBnZW9tX3BvaW50KHNpemUgPSAzKSArDQogIGNvb3JkX2ZsaXAoKSArDQogIGxhYnMoDQogICAgdGl0bGUgPSAiSG91c2luZyBTdHJlc3MgSW5kZXggKEhTSSkgYnkgRGlzdHJpY3QiLA0KICAgIHN1YnRpdGxlID0gIlBvc2l0aXZlIHZhbHVlcyBpbmRpY2F0ZSBoaWdoZXIgaG91c2luZyBzdHJlc3MiLA0KICAgIHggPSAiRGlzdHJpY3QgKEthYi9Lb3RhKSIsDQogICAgeSA9ICJIb3VzaW5nIFN0cmVzcyBJbmRleCIsDQogICAgY29sb3IgPSAiU3RyZXNzIENhdGVnb3J5Ig0KICApICsNCiAgdGhlbWVfbWluaW1hbCgpDQpgYGANCg0KDQpXaWxheWFoIGRlbmdhbiBuaWxhaSBfSG91c2luZyBTdHJlc3MgSW5kZXhfIChIU0kpIHlhbmcgdGluZ2dpIG1lbmdnYW1iYXJrYW4ga29uZGlzaSBkaSBtYW5hIHJ1bWFoIHRhbmdnYSBoYXJ1cyBtZW5hbmdndW5nIGJlYmFuIGJpYXlhIHBlcnVtYWhhbiB5YW5nIHJlbGF0aWYgYmVzYXIsIHNlbWVudGFyYSBrZW1hbXB1YW4gbWVyZWthIHVudHVrIG1lbWVudWhpIGtlYnV0dWhhbiBub24tcGVydW1haGFuIG1hc2loIHRlcmJhdGFzLiBTaXR1YXNpIGluaSBtZW51bmp1a2thbiB0ZWthbmFuIGdhbmRhOiBiaWF5YSBodW5pYW4geWFuZyBiZXJhdCBkaSBzYXR1IHNpc2ksIGRhbiBydWFuZyBmaXNrYWwgcnVtYWggdGFuZ2dhIHlhbmcgc2VtcGl0IGRpIHNpc2kgbGFpbi4gVGVtdWFuIHNlcGVydGkgaW5pIG1lbmphZGkgcGVudGluZyBkYWxhbSBtZXJhbmNhbmcga2ViaWpha2FuIHBlcnVtYWhhbiwgc2tlbWEgc3Vic2lkaSwgbWF1cHVuIHBlbmFyZ2V0YW4gYmFudHVhbiBzb3NpYWwgeWFuZyBsZWJpaCB0ZXBhdCBzYXNhcmFuIGJlcmJhc2lzIHdpbGF5YWggKFdvcmxkIEJhbmssIDIwMDkpLiBEZW5nYW4gZGVtaWtpYW4sIGFuYWxpc2lzIGluaSB0aWRhayBiZXJoZW50aSBwYWRhIHBlbWFwYXJhbiBhbmdrYSBzZW1hdGEsIHRldGFwaSBqdWdhIGJlcmZ1bmdzaSBzZWJhZ2FpIGFsYXQgZGlhZ25vc3RpayB1bnR1ayBtZW5naWRlbnRpZmlrYXNpIGRhZXJhaC1kYWVyYWggeWFuZyBwYWxpbmcgcmVudGFuIHRlcmhhZGFwIHRla2FuYW4gcGVydW1haGFuIGRhbiBtZW1idXR1aGthbiBwZXJoYXRpYW4ga2ViaWpha2FuIGxlYmloIGxhbmp1dC4NCg0KDQojIyBEaXN0cmlidXNpIEhTSQ0KDQpgYGB7cn0NCmdncGxvdCh0cmFjdF90cmFkZW9mZiwNCiAgICAgICBhZXMoeCA9IGhvdXNpbmdfc3RyZXNzX2luZGV4LCBmaWxsID0gc3RyZXNzX2NhdGVnb3J5KSkgKw0KICBnZW9tX2hpc3RvZ3JhbShiaW5zID0gMjAsIGFscGhhID0gMC44KSArDQogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDAsIGxpbmV0eXBlID0gImRhc2hlZCIpICsNCiAgbGFicygNCiAgICB0aXRsZSA9ICJEaXN0cmlidXRpb24gb2YgSG91c2luZyBTdHJlc3MgSW5kZXgiLA0KICAgIHggPSAiSG91c2luZyBTdHJlc3MgSW5kZXgiLA0KICAgIHkgPSAiTnVtYmVyIG9mIERpc3RyaWN0cyIsDQogICAgZmlsbCA9ICJTdHJlc3MgQ2F0ZWdvcnkiDQogICkgKw0KICB0aGVtZV9taW5pbWFsKCkNCmBgYA0KDQoNCkRhcmkgZ2FtYmFyIHRlcmxpaGF0IGJhaHdhIHNlYmFnaWFuIGJlc2FyIHdpbGF5YWggdGVya29uc2VudHJhc2kgZGkgc2VraXRhciBuaWxhaSBub2wsIHlhbmcgYmVyYXJ0aSBtYXlvcml0YXMga2FidXBhdGVuL2tvdGEgYmVyYWRhIHBhZGEga2F0ZWdvcmkgbmV0cmFsIGF0YXUgdGVrYW5hbiBzZWRhbmcuIE5hbXVuLCB0ZXJkYXBhdCBzZWp1bWxhaCB3aWxheWFoIGRpIHNpc2kga2FuYW4gZGVuZ2FuIGthdGVnb3JpIG1vZGVyYXRlIGhpbmdnYSBzZXZlcmUgc3RyZXNzLCBtZW51bmp1a2thbiBhZGFueWEga2Vsb21wb2sgZGFlcmFoIHlhbmcgbWVuZ2hhZGFwaSB0ZWthbmFuIHBlcnVtYWhhbiBjdWt1cCBiZXJhdC4gRGkgc2lzaSBraXJpLCB3aWxheWFoIGRlbmdhbiBsb3cgc3RyZXNzIHJlbGF0aWYgbGViaWggYmFueWFrLCBtZW5jZXJtaW5rYW4ga29uZGlzaSBkaSBtYW5hIGJlYmFuIHBlcnVtYWhhbiBtYXNpaCBsZWJpaCB0ZXJrZW5kYWxpIGRpYmFuZGluZyByYXRhLXJhdGEgbmFzaW9uYWwuDQoNCkRpc3RyaWJ1c2kgeWFuZyBjZW5kZXJ1bmcgbWVueWVydXBhaSBrdXJ2YSBsb25jZW5nIGluaSBtZW5naW5kaWthc2lrYW4gYmFod2EgdGVrYW5hbiBwZXJ1bWFoYW4gbWVydXBha2FuIGZlbm9tZW5hIHlhbmcgdGVyc2ViYXIgbHVhcywgdGV0YXBpIHRpbmdrYXQga2VwYXJhaGFubnlhIGJlcmJlZGEtYmVkYS4gSGFueWEgc2ViYWdpYW4ga2VjaWwgd2lsYXlhaCB5YW5nIGJlcmFkYSBwYWRhIGtvbmRpc2kgc2FuZ2F0IGJlcmF0IChzZXZlcmUgc3RyZXNzKSwgbmFtdW4ga2Vsb21wb2sgaW5pIHBlbnRpbmcgbWVuamFkaSBwZXJoYXRpYW4ga2ViaWpha2FuIGthcmVuYSBtZXJlcHJlc2VudGFzaWthbiBrb25zZW50cmFzaSB0ZWthbmFuIHBhbGluZyB0aW5nZ2kuDQoNCg0KIyBSZWZlcmVuc2kNCg0KWzFdIEFuZ2VsLCBTLiAoMjAwMCkuIF9Ib3VzaW5nIHBvbGljeSBtYXR0ZXJzOiBBIGdsb2JhbCBhbmFseXNpc18uIE94Zm9yZCBVbml2ZXJzaXR5IFByZXNzLg0KDQpbMl0gRGVhdG9uLCBBLiwgJiBaYWlkaSwgUy4gKDIwMDIpLiBfR3VpZGVsaW5lcyBmb3IgY29uc3RydWN0aW5nIGNvbnN1bXB0aW9uIGFnZ3JlZ2F0ZXMgZm9yIHdlbGZhcmUgYW5hbHlzaXNfLiBXb3JsZCBCYW5rIFB1YmxpY2F0aW9ucy4NCg0KWzNdIEhVRC4gKDIwMTgpLiBfQWZmb3JkYWJsZSBob3VzaW5nXy4gVS5TLiBEZXBhcnRtZW50IG9mIEhvdXNpbmcgYW5kIFVyYmFuIERldmVsb3BtZW50Lg0KDQpbNF0gS3V0dHksIE4uIEsuICgyMDA1KS4gX0EgbmV3IG1lYXN1cmUgb2YgaG91c2luZyBhZmZvcmRhYmlsaXR5OiBFc3RpbWF0ZXMgYW5kIGFuYWx5dGljYWwgcmVzdWx0c18uIEhvdXNpbmcgUG9saWN5IERlYmF0ZSwgMTYoMSksIDExM+KAkzE0Mi4NCg0KWzVdIEx1bWxleSwgVC4gKDIwMTApLiBfQ29tcGxleCBzdXJ2ZXlzOiBBIGd1aWRlIHRvIGFuYWx5c2lzIHVzaW5nIFJfLiBKb2huIFdpbGV5ICYgU29ucy4NCg0KWzZdIE5hcmRvLCBNLiwgU2Fpc2FuYSwgTS4sIFNhbHRlbGxpLCBBLiwgJiBUYXJhbnRvbGEsIFMuICgyMDA1KS4gX1Rvb2xzIGZvciBjb21wb3NpdGUgaW5kaWNhdG9ycyBidWlsZGluZ18uIEV1cm9wZWFuIENvbW1pc3Npb24uDQoNCls3XSBPRUNELiAoMjAxMSkuIF9Ib3figJlzIGxpZmU/IE1lYXN1cmluZyB3ZWxsLWJlaW5nXy4gT0VDRCBQdWJsaXNoaW5nLg0KDQpbOF0gU3RvbmUsIE0uIEUuICgyMDA2KS4gX1doYXQgaXMgaG91c2luZyBhZmZvcmRhYmlsaXR5PyBUaGUgY2FzZSBmb3IgdGhlIHJlc2lkdWFsIGluY29tZSBhcHByb2FjaF8uIEhvdXNpbmcgUG9saWN5IERlYmF0ZSwgMTcoMSksIDE1MeKAkzE4NC4NCg0KWzldIFdvcmxkIEJhbmsuICgyMDA5KS4gX1Jlc2hhcGluZyBlY29ub21pYyBnZW9ncmFwaHlfLiBXb3JsZCBCYW5rIFB1YmxpY2F0aW9ucy4NCg0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCj4gRGlyZWt0b3JhdCBTdGF0aXN0aWsgS2VzZWphaHRlcmFhbiBSYWt5YXQsIEJQUywgc2FwdGFoYXNAYnBzLmdvLmlkDQoNCg0KDQoNCg==