knitr::opts_chunk$set(echo = TRUE)

Data yang digunakan adalah Susenas Maret 2025.

1 Backlog Kepemilikan

Backlog kepemilikan merupakan indikator yang menggambarkan kondisi rumah tangga yang menempati bangunan tempat tinggal yang bukan milik sendiri dan tidak memiliki rumah di tempat lain. Dalam penghitungan ini, rumah tangga dikategorikan sebagai backlog kepemilikan meskipun menempati rumah yang layak huni, sepanjang status penguasaan bangunannya bukan milik sendiri dan rumah tangga tersebut tidak memiliki kepemilikan rumah alternatif.

Dengan demikian, indikator ini berfokus pada aspek kepemilikan hunian, bukan pada kualitas fisik atau kelayakan bangunan tempat tinggal. Informasi backlog kepemilikan digunakan sebagai dasar dalam perencanaan, penentuan sasaran, dan evaluasi kebijakan penyediaan serta fasilitasi kepemilikan rumah bagi rumah tangga yang belum memiliki rumah sendiri.

2 Set Design Sampling

Design sampling yang digunakan mengikuti design sampling yang dilakukan pada SPSS yaitu Cluster Sampling design with replacement.

susenas.design<- svydesign(id=~psu, strata=~strata, data = dataku, weights=~fwt)
susenas.design
## Stratified 1 - level Cluster Sampling design (with replacement)
## With (34473) clusters.
## svydesign(id = ~psu, strata = ~strata, data = dataku, weights = ~fwt)
summary(susenas.design$prob)
##     Min.  1st Qu.   Median     Mean  3rd Qu.     Max. 
## 0.000201 0.003795 0.008842 0.029646 0.025600 0.968267

3 Set Output Statistics

Kualitas presisi hasil estimasi suatu survei bisa diamati dari nilai RSE yang dihasilkan. Kesalahan sampling dari beberapa estimasi harus digunakan secara hati-hati. Untuk estimasi yang berdasarkan jumlah kasus yang kecil, kesalahan relatif cenderung besar.

Batasan nilai RSE ( Australian Bureau Statistics):

  1. Jika \(RSE \le 25\%\), estimasi bersifat presisi.

  2. Jika \(25\% < RSE \le 50\%\), estimasi perlu dilakukan dengan hati-hati.

  3. Jika \(RSE > 50\%\), estimasi dianggap sangat tidak presisi.

Provinsi

options(survey.adjust.domain.lonely=TRUE)
options(survey.lonely.psu="adjust")
hasilP = svyby(formula = ~BACK_LOG, denom= ~denom, ~prov, design = susenas.design, data = dataku, deff=TRUE, svyratio, vartype=c("se","ci","ci","cv","cvpct","var"))
hasilP[is.na(hasilP)] <- 0
hasilP$theta = round(hasilP$`BACK_LOG/denom`*100,2)
hasilP$SE = round(hasilP$`se.BACK_LOG/denom`*100,2)
hasilP$VAR = round(hasilP$SE*hasilP$SE,2)
hasilP$CI_LOWER = round(hasilP$`ci_l`*100,2)
hasilP$CI_LOWER[hasilP$CI_LOWER<0] <- 0
hasilP$CI_UPPER = round(hasilP$`ci_u`*100,2)
hasilP$RSE = round(hasilP$`cv%`,2)
hasilP$DEFF = round(hasilP$DEff,2)

Kabupaten/kota

options(survey.adjust.domain.lonely=TRUE)
options(survey.lonely.psu="adjust")
hasil = svyby(formula = ~BACK_LOG, denom= ~denom, ~kabu, design = susenas.design, data = dataku, deff=TRUE, svyratio, vartype=c("se","ci","ci","cv","cvpct","var"))
hasil[is.na(hasil)] <- 0
hasil$theta = round(hasil$`BACK_LOG/denom`*100,2)
hasil$SE = round(hasil$`se.BACK_LOG/denom`*100,2)
hasil$VAR = round(hasil$SE*hasil$SE,2)
hasil$CI_LOWER = round(hasil$`ci_l`*100,2)
hasil$CI_LOWER[hasil$CI_LOWER<0] <- 0
hasil$CI_UPPER = round(hasil$`ci_u`*100,2)
hasil$RSE = round(hasil$`cv%`,2)
hasil$DEFF = round(hasil$DEff,2)

4 Level Estimate

4.1 Estimation by province

outputP = as.data.frame(cbind(hasilP$prov, hasilP$theta, hasilP$SE, hasilP$VAR, hasilP$CI_LOWER, hasilP$CI_UPPER, hasilP$RSE, hasilP$DEFF))
names(outputP) = c("Prov","Estimasi","SE","VAR","CI LOWER","CI UPPER","RSE","DEFF")
(outputP[order(outputP$Prov, decreasing = FALSE), ]   )
##    Prov Estimasi   SE  VAR CI LOWER CI UPPER   RSE  DEFF
## 1    11    13.00 0.45 0.20    12.11    13.88  3.48  2.50
## 2    12    24.46 0.70 0.49    23.08    25.84  2.88  5.76
## 3    13    24.28 0.78 0.61    22.75    25.80  3.20  3.84
## 4    14    19.04 0.84 0.71    17.40    20.68  4.40  3.91
## 5    15     8.94 0.54 0.29     7.88    10.01  6.06  2.61
## 6    16    12.71 0.61 0.37    11.52    13.91  4.79  3.97
## 7    17     8.24 0.55 0.30     7.16     9.33  6.71  2.43
## 8    18     6.34 0.39 0.15     5.57     7.11  6.20  2.82
## 9    19     7.90 0.73 0.53     6.48     9.32  9.20  3.11
## 10   21    22.28 2.39 5.71    17.59    26.97 10.74 13.83
## 11   31    40.59 1.25 1.56    38.14    43.04  3.08  3.30
## 12   32    14.80 0.40 0.16    14.02    15.58  2.70  3.12
## 13   33     8.04 0.25 0.06     7.55     8.52  3.08  2.43
## 14   34    13.92 0.95 0.90    12.06    15.78  6.81  2.97
## 15   35     7.48 0.26 0.07     6.96     7.99  3.51  3.15
## 16   36    11.44 0.72 0.52    10.02    12.85  6.33  3.66
## 17   51    11.67 0.95 0.90     9.80    13.54  8.16  5.52
## 18   52     6.71 0.42 0.18     5.88     7.54  6.32  2.05
## 19   53     7.22 0.53 0.28     6.17     8.26  7.39  5.61
## 20   61     6.53 0.44 0.19     5.65     7.40  6.81  3.04
## 21   62    12.50 0.84 0.71    10.85    14.15  6.73  5.42
## 22   63    12.98 0.72 0.52    11.58    14.39  5.53  3.99
## 23   64    18.25 0.86 0.74    16.56    19.94  4.72  3.24
## 24   65    16.96 1.19 1.42    14.62    19.29  7.02  2.70
## 25   71    15.58 0.73 0.53    14.16    17.01  4.67  3.46
## 26   72     9.04 0.56 0.31     7.94    10.15  6.24  3.06
## 27   73     9.65 0.51 0.26     8.65    10.64  5.26  4.71
## 28   74     7.09 0.56 0.31     5.99     8.19  7.90  4.50
## 29   75    12.28 0.71 0.50    10.90    13.66  5.74  1.67
## 30   76     4.07 0.56 0.31     2.97     5.17 13.79  2.92
## 31   81    11.07 0.74 0.55     9.61    12.52  6.71  3.41
## 32   82     6.19 0.62 0.38     4.97     7.41 10.07  3.53
## 33   91    12.19 0.90 0.81    10.42    13.96  7.42  2.61
## 34   92    12.55 1.23 1.51    10.14    14.97  9.82  4.07
## 35   94    17.40 1.40 1.96    14.65    20.15  8.07  6.09
## 36   95    15.89 1.47 2.16    13.02    18.77  9.24  3.34
## 37   96     8.71 0.86 0.74     7.02    10.40  9.93  4.12
## 38   97     1.64 0.48 0.23     0.69     2.59 29.51  6.04

Kelompok RSE Provinsi

hasilP <- hasilP %>%
  mutate(
    RSE = if_else(RSE == 0, NA_real_, RSE)
  ) %>%
  arrange(RSE) %>%
  mutate(
    Urut = row_number(),
    RSEP_kat = case_when(
      is.na(RSE)                 ~ NA_character_,
      RSE < 25.99                ~ "< 25%",
      RSE <= 50.99               ~ "26–50%",
      RSE > 50                   ~ "> 50%"
    )
  )

table(hasilP$RSEP_kat, useNA = "ifany")
## 
##  < 25% 26–50% 
##     37      1

Visualisasi Provinsi

ggplot(hasilP, aes(x = Urut, y = RSE, group = 1, color = RSEP_kat)) +
  geom_point(size = 3) +
  
  geom_hline(yintercept = 25, linetype = "dashed", color = "red") +
  geom_hline(yintercept = 50, linetype = "dashed", color = "blue") +
  
scale_color_manual(
  name = "Kategori RSE",
  limits = c("< 25%", "26–50%", "> 50%"),
  values = c(
    "< 25%"  = "#1B9E77",
    "26–50%" = "#FF8C00",
    "> 50%"  = "#7570B3"
  ),
  na.value = "#D73027",
  drop = FALSE
) +
    labs(
    title = "RSE BACK_LOG per Provinsi",
    subtitle = "dengan garis batas RSE 25% dan 50%",
    x = "Provinsi",
    y = "Nilai RSE (%)"
  ) +
  
  theme_minimal(base_size = 13) +
  theme(
    plot.title = element_text(face = "bold", size = 15),
    legend.position = "bottom",
    axis.text.x = element_text(angle = 40, vjust = 1, hjust = 1)
  )

4.2 Estimation by district

output = as.data.frame(cbind(hasil$kabu, hasil$theta, hasil$SE, hasil$VAR, hasil$CI_LOWER, hasil$CI_UPPER, hasil$RSE, hasil$DEFF))
names(output) = c("Kako","Estimasi","SE","VAR","CI LOWER","CI UPPER","RSE","DEFF")
head((output[order(output$Kako, decreasing = FALSE), ]   ))
##   Kako Estimasi   SE  VAR CI LOWER CI UPPER   RSE DEFF
## 1 1101     6.46 1.35 1.82     3.80     9.11 20.97 1.57
## 2 1102     9.17 1.79 3.20     5.67    12.67 19.48 2.04
## 3 1103     7.79 1.49 2.22     4.86    10.71 19.15 1.93
## 4 1104    20.64 2.54 6.45    15.66    25.63 12.32 2.43
## 5 1105     9.44 1.88 3.53     5.75    13.13 19.97 2.88
## 6 1106    16.00 1.91 3.65    12.25    19.75 11.95 1.63

Kelompok RSE Kabupaten/kota

hasil <- hasil %>%
  mutate(
    RSE = if_else(RSE == 0, NA_real_, RSE)
  ) %>%
  arrange(RSE) %>%
  mutate(
    Urut = row_number(),
    RSE_kat = case_when(
      is.na(RSE)                 ~ NA_character_,
      RSE < 25.99                ~ "< 25%",
      RSE <= 50.99               ~ "26–50%",
      RSE > 50                   ~ "> 50%"
    )
  )

table(hasil$RSE_kat, useNA = "ifany")
## 
##  < 25%  > 50% 26–50%   <NA> 
##    374     14    120      6
hasil_plot <- hasil %>%
  mutate(
    RSE_plot = if_else(is.na(RSE), -2, RSE)  # taruh NA di bawah sumbu
  )

ggplot(hasil_plot, aes(x = Urut, y = RSE_plot, color = RSE_kat)) +
  geom_jitter(width = 0.35, height = 0, size = 1.8, alpha = 0.85) +

  geom_hline(yintercept = 25, linetype = "dashed", color = "red") +
  geom_hline(yintercept = 50, linetype = "dashed", color = "blue") +

  scale_y_continuous(
    name = "Nilai RSE (%)",
    breaks = c(0, 25, 50),
    limits = c(-5, NA)
  ) +

  scale_color_manual(
    name = "Kategori RSE",
    limits = c("< 25%", "26–50%", "> 50%"),
    values = c(
      "< 25%"  = "#1B9E77",
      "26–50%" = "#FF8C00",
      "> 50%"  = "#7570B3"
    ),
    na.value = "#D73027",
    drop = FALSE
  ) +
  theme_minimal()

Satu kabupaten/kota memiliki nilai RSE = 0 sehingga diperlakukan sebagai data tidak tersedia (NA) dan ditampilkan dalam visualisasi sebagai titik berwarna merah.

write.xlsx(outputP,"BACKLOG1 2025_Prov.xlsx")
write.xlsx(output,"BACKLOG1 2025_Kako.xlsx")

5 Peta

library(sf)
petaku <- st_read("PetaSHP514_38.shp")
## Reading layer `PetaSHP514_38' from data source 
##   `D:\2. Pengembangan diri\1 Exercise Bagus\Housing Analysis\PetaSHP514_38.shp' 
##   using driver `ESRI Shapefile'
## Simple feature collection with 514 features and 8 fields
## Geometry type: MULTIPOLYGON
## Dimension:     XY
## Bounding box:  xmin: 95.00971 ymin: -11.00766 xmax: 141.02 ymax: 6.076809
## Geodetic CRS:  WGS 84
petaku <- petaku %>%
  mutate(idkab = as.character(idkab))
hasil <- hasil %>%
  mutate(kabu = as.character(kabu))
names(petaku)
## [1] "fid"      "idkab"    "nmprov"   "nmkab"    "kdprov"   "kdkab"    "sumber"  
## [8] "periode"  "geometry"
kab_map <- petaku %>%
  left_join(
    hasil %>% select(kabu, RSE, RSE_kat),
    by = c("idkab" = "kabu")
  )
kab_map$RSE_kat <- factor(
  kab_map$RSE_kat,
  levels = c("< 25%", "26–50%", "> 50%")
)


Direktorat Statistik Kesejahteraan Rakyat, BPS,

LS0tDQp0aXRsZTogIkJhY2tsb2cgS2VwZW1pbGlrYW4gMjAyNSINCmF1dGhvcjogIlNhcHRhIEhhc3RobyBQb25jbyINCmRhdGU6ICJgciBTeXMuRGF0ZSgpYCINCm91dHB1dDoNCiAgaHRtbF9kb2N1bWVudDoNCiAgICBjb2RlX2Rvd25sb2FkOiB5ZXMNCiAgICBjb2RlX2ZvbGRpbmc6IHNob3cNCiAgICBudW1iZXJfc2VjdGlvbnM6IHllcw0KICAgIHRoZW1lOiBqb3VybmFsDQogICAgdG9jOiB5ZXMNCiAgICB0b2NfZmxvYXQ6IHllcw0KICB3b3JkX2RvY3VtZW50Og0KICAgIHRvYzogeWVzDQotLS0NCg0KYGBgez1odG1sfQ0KPHN0eWxlPg0KYm9keXsNCnRleHQtYWxpZ246IGp1c3RpZnl9DQo8L3N0eWxlPg0KYGBgDQoNCg0KYGBge3Igc2V0dXAsIGluY2x1ZGU9VFJVRX0NCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSkNCmBgYA0KDQpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgZWNobz1GQUxTRX0NCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShzdXJ2ZXkpDQpsaWJyYXJ5KGphbml0b3IpDQpsaWJyYXJ5KHNjYWxlcykNCmxpYnJhcnkoaGF2ZW4pDQpsaWJyYXJ5KG9wZW54bHN4KQ0KbGlicmFyeShzZikNCmxpYnJhcnkodmlyaWRpcykNCmBgYA0KDQpgYGB7ciwgZWNobz1GQUxTRX0NCnNldHdkKCJEOlxcMi4gUGVuZ2VtYmFuZ2FuIGRpcmlcXDEgRXhlcmNpc2UgQmFndXNcXEhvdXNpbmcgQW5hbHlzaXMiKQ0KYGBgDQoNCkRhdGEgeWFuZyBkaWd1bmFrYW4gYWRhbGFoIFN1c2VuYXMgTWFyZXQgMjAyNS4NCg0KYGBge3IsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGVjaG89RkFMU0V9DQpkYXRha3UgPC0gcmVhZF9zYXYoIktPUjI1R0FCXzAzMDlfSE9VU0lORy5zYXYiKSAlPiUNCiAgY2xlYW5fbmFtZXMoKQ0KYGBgDQoNCiMgQmFja2xvZyBLZXBlbWlsaWthbg0KDQpCYWNrbG9nIGtlcGVtaWxpa2FuIG1lcnVwYWthbiBpbmRpa2F0b3IgeWFuZyBtZW5nZ2FtYmFya2FuIGtvbmRpc2kgcnVtYWggdGFuZ2dhIHlhbmcgbWVuZW1wYXRpIGJhbmd1bmFuIHRlbXBhdCB0aW5nZ2FsIHlhbmcgYnVrYW4gbWlsaWsgc2VuZGlyaSBkYW4gdGlkYWsgbWVtaWxpa2kgcnVtYWggZGkgdGVtcGF0IGxhaW4uIERhbGFtIHBlbmdoaXR1bmdhbiBpbmksIHJ1bWFoIHRhbmdnYSBkaWthdGVnb3Jpa2FuIHNlYmFnYWkgYmFja2xvZyBrZXBlbWlsaWthbiBtZXNraXB1biBtZW5lbXBhdGkgcnVtYWggeWFuZyBsYXlhayBodW5pLCBzZXBhbmphbmcgc3RhdHVzIHBlbmd1YXNhYW4gYmFuZ3VuYW5ueWEgYnVrYW4gbWlsaWsgc2VuZGlyaSBkYW4gcnVtYWggdGFuZ2dhIHRlcnNlYnV0IHRpZGFrIG1lbWlsaWtpIGtlcGVtaWxpa2FuIHJ1bWFoIGFsdGVybmF0aWYuIA0KDQpEZW5nYW4gZGVtaWtpYW4sIGluZGlrYXRvciBpbmkgYmVyZm9rdXMgcGFkYSBhc3BlayBrZXBlbWlsaWthbiBodW5pYW4sIGJ1a2FuIHBhZGEga3VhbGl0YXMgZmlzaWsgYXRhdSBrZWxheWFrYW4gYmFuZ3VuYW4gdGVtcGF0IHRpbmdnYWwuIEluZm9ybWFzaSBiYWNrbG9nIGtlcGVtaWxpa2FuIGRpZ3VuYWthbiBzZWJhZ2FpIGRhc2FyIGRhbGFtIHBlcmVuY2FuYWFuLCBwZW5lbnR1YW4gc2FzYXJhbiwgZGFuIGV2YWx1YXNpIGtlYmlqYWthbiBwZW55ZWRpYWFuIHNlcnRhIGZhc2lsaXRhc2kga2VwZW1pbGlrYW4gcnVtYWggYmFnaSBydW1haCB0YW5nZ2EgeWFuZyBiZWx1bSBtZW1pbGlraSBydW1haCBzZW5kaXJpLg0KDQpgYGB7ciwgZWNobz1GQUxTRX0NCmRhdGFrdSA8LSBkYXRha3UgJT4lDQogIG11dGF0ZShrYWJ1ID0gcjEwMSoxMDAgKyByMTAyKSAlPiUNCiAgcmVuYW1lKHByb3Y9InIxMDEiLCBrYWI9InIxMDIiKSAlPiUNCiAgbXV0YXRlKGRlbm9tPTEwMCkgJT4lDQogIG11dGF0ZSgNCiAgICBCQUNLX0xPRyA9IGlmZWxzZShyMTYwMiA+IDEgJiByMTYwNSA9PSA1LCAxMDAsIDApLA0KICAgIEJBQ0tfTE9HX0xBQkVMID0gZmFjdG9yKA0KICAgICAgQkFDS19MT0csDQogICAgICBsZXZlbHMgPSBjKDAsIDEwMCksDQogICAgICBsYWJlbHMgPSBjKCJUaWRhayIsICJCYWNrbG9nIikNCiAgICApDQogICkNCmBgYA0KICANCiMgU2V0IERlc2lnbiBTYW1wbGluZw0KDQpEZXNpZ24gc2FtcGxpbmcgeWFuZyBkaWd1bmFrYW4gbWVuZ2lrdXRpIGRlc2lnbiBzYW1wbGluZyB5YW5nIGRpbGFrdWthbiBwYWRhIFNQU1MgeWFpdHUgQ2x1c3RlciBTYW1wbGluZyBkZXNpZ24gd2l0aCByZXBsYWNlbWVudC4NCg0KYGBge3IsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0V9DQpzdXNlbmFzLmRlc2lnbjwtIHN2eWRlc2lnbihpZD1+cHN1LCBzdHJhdGE9fnN0cmF0YSwgZGF0YSA9IGRhdGFrdSwgd2VpZ2h0cz1+Znd0KQ0Kc3VzZW5hcy5kZXNpZ24NCnN1bW1hcnkoc3VzZW5hcy5kZXNpZ24kcHJvYikNCmBgYA0KDQojIFNldCBPdXRwdXQgU3RhdGlzdGljcw0KDQpLdWFsaXRhcyBwcmVzaXNpIGhhc2lsIGVzdGltYXNpIHN1YXR1IHN1cnZlaSBiaXNhIGRpYW1hdGkgZGFyaSBuaWxhaSBSU0UgeWFuZyBkaWhhc2lsa2FuLiBLZXNhbGFoYW4gc2FtcGxpbmcgZGFyaSBiZWJlcmFwYSBlc3RpbWFzaSBoYXJ1cyBkaWd1bmFrYW4gc2VjYXJhIGhhdGktaGF0aS4gVW50dWsgZXN0aW1hc2kgeWFuZyBiZXJkYXNhcmthbiBqdW1sYWgga2FzdXMgeWFuZyBrZWNpbCwga2VzYWxhaGFuIHJlbGF0aWYgY2VuZGVydW5nIGJlc2FyLg0KDQpCYXRhc2FuIG5pbGFpIFJTRSAoIF9BdXN0cmFsaWFuIEJ1cmVhdSBTdGF0aXN0aWNzXyk6DQoNCjEuICBKaWthICRSU0UgXGxlIDI1XCUkLCBlc3RpbWFzaSBiZXJzaWZhdCBwcmVzaXNpLg0KDQoyLiAgSmlrYSAkMjVcJSA8IFJTRSBcbGUgNTBcJSQsIGVzdGltYXNpIHBlcmx1IGRpbGFrdWthbiBkZW5nYW4gaGF0aS1oYXRpLg0KDQozLiAgSmlrYSAkUlNFID4gNTBcJSQsIGVzdGltYXNpIGRpYW5nZ2FwIHNhbmdhdCB0aWRhayBwcmVzaXNpLg0KDQoNCioqUHJvdmluc2kqKg0KDQpgYGB7ciwgd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRX0NCm9wdGlvbnMoc3VydmV5LmFkanVzdC5kb21haW4ubG9uZWx5PVRSVUUpDQpvcHRpb25zKHN1cnZleS5sb25lbHkucHN1PSJhZGp1c3QiKQ0KaGFzaWxQID0gc3Z5YnkoZm9ybXVsYSA9IH5CQUNLX0xPRywgZGVub209IH5kZW5vbSwgfnByb3YsIGRlc2lnbiA9IHN1c2VuYXMuZGVzaWduLCBkYXRhID0gZGF0YWt1LCBkZWZmPVRSVUUsIHN2eXJhdGlvLCB2YXJ0eXBlPWMoInNlIiwiY2kiLCJjaSIsImN2IiwiY3ZwY3QiLCJ2YXIiKSkNCmhhc2lsUFtpcy5uYShoYXNpbFApXSA8LSAwDQpoYXNpbFAkdGhldGEgPSByb3VuZChoYXNpbFAkYEJBQ0tfTE9HL2Rlbm9tYCoxMDAsMikNCmhhc2lsUCRTRSA9IHJvdW5kKGhhc2lsUCRgc2UuQkFDS19MT0cvZGVub21gKjEwMCwyKQ0KaGFzaWxQJFZBUiA9IHJvdW5kKGhhc2lsUCRTRSpoYXNpbFAkU0UsMikNCmhhc2lsUCRDSV9MT1dFUiA9IHJvdW5kKGhhc2lsUCRgY2lfbGAqMTAwLDIpDQpoYXNpbFAkQ0lfTE9XRVJbaGFzaWxQJENJX0xPV0VSPDBdIDwtIDANCmhhc2lsUCRDSV9VUFBFUiA9IHJvdW5kKGhhc2lsUCRgY2lfdWAqMTAwLDIpDQpoYXNpbFAkUlNFID0gcm91bmQoaGFzaWxQJGBjdiVgLDIpDQpoYXNpbFAkREVGRiA9IHJvdW5kKGhhc2lsUCRERWZmLDIpDQpgYGANCg0KKipLYWJ1cGF0ZW4va290YSoqDQoNCmBgYHtyLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFfQ0Kb3B0aW9ucyhzdXJ2ZXkuYWRqdXN0LmRvbWFpbi5sb25lbHk9VFJVRSkNCm9wdGlvbnMoc3VydmV5LmxvbmVseS5wc3U9ImFkanVzdCIpDQpoYXNpbCA9IHN2eWJ5KGZvcm11bGEgPSB+QkFDS19MT0csIGRlbm9tPSB+ZGVub20sIH5rYWJ1LCBkZXNpZ24gPSBzdXNlbmFzLmRlc2lnbiwgZGF0YSA9IGRhdGFrdSwgZGVmZj1UUlVFLCBzdnlyYXRpbywgdmFydHlwZT1jKCJzZSIsImNpIiwiY2kiLCJjdiIsImN2cGN0IiwidmFyIikpDQpoYXNpbFtpcy5uYShoYXNpbCldIDwtIDANCmhhc2lsJHRoZXRhID0gcm91bmQoaGFzaWwkYEJBQ0tfTE9HL2Rlbm9tYCoxMDAsMikNCmhhc2lsJFNFID0gcm91bmQoaGFzaWwkYHNlLkJBQ0tfTE9HL2Rlbm9tYCoxMDAsMikNCmhhc2lsJFZBUiA9IHJvdW5kKGhhc2lsJFNFKmhhc2lsJFNFLDIpDQpoYXNpbCRDSV9MT1dFUiA9IHJvdW5kKGhhc2lsJGBjaV9sYCoxMDAsMikNCmhhc2lsJENJX0xPV0VSW2hhc2lsJENJX0xPV0VSPDBdIDwtIDANCmhhc2lsJENJX1VQUEVSID0gcm91bmQoaGFzaWwkYGNpX3VgKjEwMCwyKQ0KaGFzaWwkUlNFID0gcm91bmQoaGFzaWwkYGN2JWAsMikNCmhhc2lsJERFRkYgPSByb3VuZChoYXNpbCRERWZmLDIpDQpgYGANCg0KIyBMZXZlbCBFc3RpbWF0ZQ0KDQojIyBFc3RpbWF0aW9uIGJ5IHByb3ZpbmNlDQoNCmBgYHtyfQ0Kb3V0cHV0UCA9IGFzLmRhdGEuZnJhbWUoY2JpbmQoaGFzaWxQJHByb3YsIGhhc2lsUCR0aGV0YSwgaGFzaWxQJFNFLCBoYXNpbFAkVkFSLCBoYXNpbFAkQ0lfTE9XRVIsIGhhc2lsUCRDSV9VUFBFUiwgaGFzaWxQJFJTRSwgaGFzaWxQJERFRkYpKQ0KbmFtZXMob3V0cHV0UCkgPSBjKCJQcm92IiwiRXN0aW1hc2kiLCJTRSIsIlZBUiIsIkNJIExPV0VSIiwiQ0kgVVBQRVIiLCJSU0UiLCJERUZGIikNCihvdXRwdXRQW29yZGVyKG91dHB1dFAkUHJvdiwgZGVjcmVhc2luZyA9IEZBTFNFKSwgXSAgICkNCmBgYA0KDQoqKktlbG9tcG9rIFJTRSBQcm92aW5zaSoqDQoNCmBgYHtyfQ0KaGFzaWxQIDwtIGhhc2lsUCAlPiUNCiAgbXV0YXRlKA0KICAgIFJTRSA9IGlmX2Vsc2UoUlNFID09IDAsIE5BX3JlYWxfLCBSU0UpDQogICkgJT4lDQogIGFycmFuZ2UoUlNFKSAlPiUNCiAgbXV0YXRlKA0KICAgIFVydXQgPSByb3dfbnVtYmVyKCksDQogICAgUlNFUF9rYXQgPSBjYXNlX3doZW4oDQogICAgICBpcy5uYShSU0UpICAgICAgICAgICAgICAgICB+IE5BX2NoYXJhY3Rlcl8sDQogICAgICBSU0UgPCAyNS45OSAgICAgICAgICAgICAgICB+ICI8IDI1JSIsDQogICAgICBSU0UgPD0gNTAuOTkgICAgICAgICAgICAgICB+ICIyNuKAkzUwJSIsDQogICAgICBSU0UgPiA1MCAgICAgICAgICAgICAgICAgICB+ICI+IDUwJSINCiAgICApDQogICkNCg0KdGFibGUoaGFzaWxQJFJTRVBfa2F0LCB1c2VOQSA9ICJpZmFueSIpDQpgYGANCg0KDQoqKlZpc3VhbGlzYXNpIFByb3ZpbnNpKioNCg0KYGBge3J9DQpnZ3Bsb3QoaGFzaWxQLCBhZXMoeCA9IFVydXQsIHkgPSBSU0UsIGdyb3VwID0gMSwgY29sb3IgPSBSU0VQX2thdCkpICsNCiAgZ2VvbV9wb2ludChzaXplID0gMykgKw0KICANCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMjUsIGxpbmV0eXBlID0gImRhc2hlZCIsIGNvbG9yID0gInJlZCIpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gNTAsIGxpbmV0eXBlID0gImRhc2hlZCIsIGNvbG9yID0gImJsdWUiKSArDQogIA0Kc2NhbGVfY29sb3JfbWFudWFsKA0KICBuYW1lID0gIkthdGVnb3JpIFJTRSIsDQogIGxpbWl0cyA9IGMoIjwgMjUlIiwgIjI24oCTNTAlIiwgIj4gNTAlIiksDQogIHZhbHVlcyA9IGMoDQogICAgIjwgMjUlIiAgPSAiIzFCOUU3NyIsDQogICAgIjI24oCTNTAlIiA9ICIjRkY4QzAwIiwNCiAgICAiPiA1MCUiICA9ICIjNzU3MEIzIg0KICApLA0KICBuYS52YWx1ZSA9ICIjRDczMDI3IiwNCiAgZHJvcCA9IEZBTFNFDQopICsNCiAgICBsYWJzKA0KICAgIHRpdGxlID0gIlJTRSBCQUNLX0xPRyBwZXIgUHJvdmluc2kiLA0KICAgIHN1YnRpdGxlID0gImRlbmdhbiBnYXJpcyBiYXRhcyBSU0UgMjUlIGRhbiA1MCUiLA0KICAgIHggPSAiUHJvdmluc2kiLA0KICAgIHkgPSAiTmlsYWkgUlNFICglKSINCiAgKSArDQogIA0KICB0aGVtZV9taW5pbWFsKGJhc2Vfc2l6ZSA9IDEzKSArDQogIHRoZW1lKA0KICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoZmFjZSA9ICJib2xkIiwgc2l6ZSA9IDE1KSwNCiAgICBsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIiwNCiAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQwLCB2anVzdCA9IDEsIGhqdXN0ID0gMSkNCiAgKQ0KYGBgDQoNCiMjIEVzdGltYXRpb24gYnkgZGlzdHJpY3QNCg0KYGBge3J9DQpvdXRwdXQgPSBhcy5kYXRhLmZyYW1lKGNiaW5kKGhhc2lsJGthYnUsIGhhc2lsJHRoZXRhLCBoYXNpbCRTRSwgaGFzaWwkVkFSLCBoYXNpbCRDSV9MT1dFUiwgaGFzaWwkQ0lfVVBQRVIsIGhhc2lsJFJTRSwgaGFzaWwkREVGRikpDQpuYW1lcyhvdXRwdXQpID0gYygiS2FrbyIsIkVzdGltYXNpIiwiU0UiLCJWQVIiLCJDSSBMT1dFUiIsIkNJIFVQUEVSIiwiUlNFIiwiREVGRiIpDQpoZWFkKChvdXRwdXRbb3JkZXIob3V0cHV0JEtha28sIGRlY3JlYXNpbmcgPSBGQUxTRSksIF0gICApKQ0KYGBgDQoNCioqS2Vsb21wb2sgUlNFIEthYnVwYXRlbi9rb3RhKioNCg0KYGBge3J9DQpoYXNpbCA8LSBoYXNpbCAlPiUNCiAgbXV0YXRlKA0KICAgIFJTRSA9IGlmX2Vsc2UoUlNFID09IDAsIE5BX3JlYWxfLCBSU0UpDQogICkgJT4lDQogIGFycmFuZ2UoUlNFKSAlPiUNCiAgbXV0YXRlKA0KICAgIFVydXQgPSByb3dfbnVtYmVyKCksDQogICAgUlNFX2thdCA9IGNhc2Vfd2hlbigNCiAgICAgIGlzLm5hKFJTRSkgICAgICAgICAgICAgICAgIH4gTkFfY2hhcmFjdGVyXywNCiAgICAgIFJTRSA8IDI1Ljk5ICAgICAgICAgICAgICAgIH4gIjwgMjUlIiwNCiAgICAgIFJTRSA8PSA1MC45OSAgICAgICAgICAgICAgIH4gIjI24oCTNTAlIiwNCiAgICAgIFJTRSA+IDUwICAgICAgICAgICAgICAgICAgIH4gIj4gNTAlIg0KICAgICkNCiAgKQ0KDQp0YWJsZShoYXNpbCRSU0Vfa2F0LCB1c2VOQSA9ICJpZmFueSIpDQpgYGANCg0KDQpgYGB7cn0NCmhhc2lsX3Bsb3QgPC0gaGFzaWwgJT4lDQogIG11dGF0ZSgNCiAgICBSU0VfcGxvdCA9IGlmX2Vsc2UoaXMubmEoUlNFKSwgLTIsIFJTRSkgICMgdGFydWggTkEgZGkgYmF3YWggc3VtYnUNCiAgKQ0KDQpnZ3Bsb3QoaGFzaWxfcGxvdCwgYWVzKHggPSBVcnV0LCB5ID0gUlNFX3Bsb3QsIGNvbG9yID0gUlNFX2thdCkpICsNCiAgZ2VvbV9qaXR0ZXIod2lkdGggPSAwLjM1LCBoZWlnaHQgPSAwLCBzaXplID0gMS44LCBhbHBoYSA9IDAuODUpICsNCg0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAyNSwgbGluZXR5cGUgPSAiZGFzaGVkIiwgY29sb3IgPSAicmVkIikgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSA1MCwgbGluZXR5cGUgPSAiZGFzaGVkIiwgY29sb3IgPSAiYmx1ZSIpICsNCg0KICBzY2FsZV95X2NvbnRpbnVvdXMoDQogICAgbmFtZSA9ICJOaWxhaSBSU0UgKCUpIiwNCiAgICBicmVha3MgPSBjKDAsIDI1LCA1MCksDQogICAgbGltaXRzID0gYygtNSwgTkEpDQogICkgKw0KDQogIHNjYWxlX2NvbG9yX21hbnVhbCgNCiAgICBuYW1lID0gIkthdGVnb3JpIFJTRSIsDQogICAgbGltaXRzID0gYygiPCAyNSUiLCAiMjbigJM1MCUiLCAiPiA1MCUiKSwNCiAgICB2YWx1ZXMgPSBjKA0KICAgICAgIjwgMjUlIiAgPSAiIzFCOUU3NyIsDQogICAgICAiMjbigJM1MCUiID0gIiNGRjhDMDAiLA0KICAgICAgIj4gNTAlIiAgPSAiIzc1NzBCMyINCiAgICApLA0KICAgIG5hLnZhbHVlID0gIiNENzMwMjciLA0KICAgIGRyb3AgPSBGQUxTRQ0KICApICsNCiAgdGhlbWVfbWluaW1hbCgpDQpgYGANCg0KU2F0dSBrYWJ1cGF0ZW4va290YSBtZW1pbGlraSBuaWxhaSBSU0UgPSAwIHNlaGluZ2dhIGRpcGVybGFrdWthbiBzZWJhZ2FpIGRhdGEgdGlkYWsgdGVyc2VkaWEgKE5BKSBkYW4gZGl0YW1waWxrYW4gZGFsYW0gdmlzdWFsaXNhc2kgc2ViYWdhaSB0aXRpayBiZXJ3YXJuYSBtZXJhaC4NCg0KYGBge3J9DQp3cml0ZS54bHN4KG91dHB1dFAsIkJBQ0tMT0cxIDIwMjVfUHJvdi54bHN4IikNCndyaXRlLnhsc3gob3V0cHV0LCJCQUNLTE9HMSAyMDI1X0tha28ueGxzeCIpDQpgYGANCg0KIyBQZXRhDQoNCmBgYHtyfQ0KbGlicmFyeShzZikNCnBldGFrdSA8LSBzdF9yZWFkKCJQZXRhU0hQNTE0XzM4LnNocCIpDQoNCnBldGFrdSA8LSBwZXRha3UgJT4lDQogIG11dGF0ZShpZGthYiA9IGFzLmNoYXJhY3RlcihpZGthYikpDQpoYXNpbCA8LSBoYXNpbCAlPiUNCiAgbXV0YXRlKGthYnUgPSBhcy5jaGFyYWN0ZXIoa2FidSkpDQpuYW1lcyhwZXRha3UpDQpgYGANCg0KYGBge3J9DQprYWJfbWFwIDwtIHBldGFrdSAlPiUNCiAgbGVmdF9qb2luKA0KICAgIGhhc2lsICU+JSBzZWxlY3Qoa2FidSwgUlNFLCBSU0Vfa2F0KSwNCiAgICBieSA9IGMoImlka2FiIiA9ICJrYWJ1IikNCiAgKQ0Ka2FiX21hcCRSU0Vfa2F0IDwtIGZhY3RvcigNCiAga2FiX21hcCRSU0Vfa2F0LA0KICBsZXZlbHMgPSBjKCI8IDI1JSIsICIyNuKAkzUwJSIsICI+IDUwJSIpDQopDQpgYGANCg0KYGBge3IsIGVjaG89RkFMU0V9DQpnZ3Bsb3Qoa2FiX21hcCkgKw0KICBnZW9tX3NmKGFlcyhmaWxsID0gUlNFX2thdCksIGNvbG9yID0gIndoaXRlIiwgc2l6ZSA9IDAuMSkgKw0KICBzY2FsZV9maWxsX21hbnVhbCgNCiAgICB2YWx1ZXMgPSBjKA0KICAgICAgIjwgMjUlIiAgID0gIiMxYTk4NTAiLCAgIyBzYW5nYXQgYmFpaw0KICAgICAgIjI24oCTNTAlIiAgPSAiI2ZlZTA4YiIsICAjIGhhdGktaGF0aQ0KICAgICAgIj4gNTAlIiAgID0gIiNkNzMwMjciICAgIyB0aWRhayByZWxpYWJlbA0KICAgICksDQogICAgbmEudmFsdWUgPSAiZGFya2JsdWUiLA0KICAgIGRyb3AgPSBGQUxTRQ0KICApICsNCiAgbGFicygNCiAgICB0aXRsZSA9ICJSU0UgQmFja2xvZyBwZXIgS2FidXBhdGVuL2tvdGEiLA0KICAgIGZpbGwgID0gIkthdGVnb3JpIFJTRSINCiAgKSArDQogIHRoZW1lX21pbmltYWwoKQ0KYGBgDQoNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQo+IERpcmVrdG9yYXQgU3RhdGlzdGlrIEtlc2VqYWh0ZXJhYW4gUmFreWF0LCBCUFMsIHNhcHRhaGFzQGJwcy5nby5pZA0KDQoNCg0KDQo=