Innuttaasut


library("tidyverse")
library(statgl) # Info at www.stat.gl/SBE202003/o1
library("kableExtra")
library("glue")
library("rjson")


lang <- paste0("?lang=", language) 
select <- "&select"
json <- ".json_stat2"
csv <- ".csv"

first_blank <- c(" " = 1)

table <- "Tabel"
note   <- "Se Statistikbanken tabel: "

title1 <- "1.1. Befolkning i kommuner, distrikter og lokaliteter"

id1 <- "BEDST2"
id2 <- "BEDST3"
id3 <- "BEDST4"


link1 <- "https://bank.stat.gl:443/sq/be66e20d-950c-41fd-98be-0c81e0f19417"
link2 <- "https://bank.stat.gl:443/sq/45b2ccd0-17b0-476c-b7c1-7a92cd5c7a3c" 
link3 <- "https://bank.stat.gl:443/sq/1bb5507d-07ca-4f13-a800-eb873e7c4569"


table1 <- glue("**", table, " 1.** ", fromJSON(file = glue(link1, json, lang))$label)
table2 <- glue("**", table, " 2.** ", fromJSON(file = glue(link2, json, lang))$label)
table3 <- glue("**", table, " 3.** ", fromJSON(file = glue(link3, json, lang))$label)
Inuit amerlassusaat
table <- 
  read_csv(
    glue::glue(link1, csv, lang),
    locale = locale(encoding = "latin1")) |> 
    mutate(aar = "2024", .before = 2)

column_vector <- 1:8
names(column_vector) <- c(" ",
                          fromJSON(file = glue::glue(link1, json, lang))$dimension$`place of birth`$category$label$N,
                          fromJSON(file = glue::glue(link1, json, lang))$dimension$`place of birth`$category$label$S,
                          fromJSON(file = glue::glue(link1, json, lang))$dimension$`place of birth`$category$label$T,
                          glue(fromJSON(file = glue::glue(link1, json, lang))$dimension$`place of birth`$category$label$N, " "),
                          glue(fromJSON(file = glue::glue(link1, json, lang))$dimension$`place of birth`$category$label$S, " "),
                          glue(fromJSON(file = glue::glue(link1, json, lang))$dimension$`place of birth`$category$label$T, " "),
                          glue(fromJSON(file = glue::glue(link1, json, lang))$dimension$`place of birth`$category$label$T, "  "))

header_vector <- c(1, 3, 3, 1)
names(header_vector) <- c(" ",
                          fromJSON(file = glue::glue(link1, json, lang))$dimension$gender$category$label$M,
                          fromJSON(file = glue::glue(link1, json, lang))$dimension$gender$category$label$K,
                          fromJSON(file = glue::glue(link1, json, lang))$dimension$gender$category$label$T)

table %>% 
  select(-2, -8, -9) %>% 
  rename(column_vector) %>% 
  statgl_table() %>% 
  row_spec(1, bold = T) %>% 
  add_header_above(header_vector) |> 
  pack_rows(index = table(table[2]))
Angutit
Arnat
Katillugit
Kalaallit Nunaat Kalaallit Nunaata avataani Katillugit Kalaallit Nunaat Kalaallit Nunaata avataani Katillugit Katillugit
2024
Katillugit 25.443 4.327 29.770 24.295 2.477 6.804 56.542
Kommune Kujalleq 2.953 303 3.256 2.714 140 443 6.110
Kommuneqarfik Sermersooq 9.914 2.747 12.661 9.950 1.618 4.365 24.229
Qeqqata Kommunia 4.371 478 4.849 4.040 290 768 9.179
Kommune Qeqertalik 2.973 191 3.164 2.709 96 287 5.969
Avannaata Kommunia 5.215 575 5.790 4.875 324 899 10.989
Kommunit avataanni 17 33 50 7 9 42 66


Se Statistikbanken tabel: BEDST2

table <- 
  read_csv(
    glue::glue(link2, csv, lang),
    locale = locale(encoding = "latin1")) |> 
    mutate(aar = "2024", .before = 2)

column_vector <- 1:8
names(column_vector) <- c(" ",
                          fromJSON(file = glue::glue(link2, json, lang))$dimension$`place of birth`$category$label$N,
                          fromJSON(file = glue::glue(link2, json, lang))$dimension$`place of birth`$category$label$S,
                          fromJSON(file = glue::glue(link2, json, lang))$dimension$`place of birth`$category$label$T,
                          glue(fromJSON(file = glue::glue(link2, json, lang))$dimension$`place of birth`$category$label$N, " "),
                          glue(fromJSON(file = glue::glue(link2, json, lang))$dimension$`place of birth`$category$label$S, " "),
                          glue(fromJSON(file = glue::glue(link2, json, lang))$dimension$`place of birth`$category$label$T, " "),
                          glue(fromJSON(file = glue::glue(link2, json, lang))$dimension$`place of birth`$category$label$T, "  "))

header_vector <- c(1, 3, 3, 1)
names(header_vector) <- c(" ",
                          fromJSON(file = glue::glue(link2, json, lang))$dimension$gender$category$label$M,
                          fromJSON(file = glue::glue(link2, json, lang))$dimension$gender$category$label$K,
                          fromJSON(file = glue::glue(link2, json, lang))$dimension$gender$category$label$T)


table %>% 
  select(-2, -8, -9) %>% 
  filter(table[,10] > 0) %>% 
  rename(column_vector) %>% 
  statgl_table() %>% 
  row_spec(1, bold = T) %>% 
  add_header_above(header_vector) |> 
  pack_rows(index = table(table[2]))
Angutit
Arnat
Katillugit
Kalaallit Nunaat Kalaallit Nunaata avataani Katillugit Kalaallit Nunaat Kalaallit Nunaata avataani Katillugit Katillugit
2024
Katillugit 25.443 4.327 29.770 24.295 2.477 6.804 56.542
Nanortalik 758 31 789 641 10 41 1.440
Qaqortoq 1.484 212 1.696 1.387 99 311 3.182
Narsaq 711 60 771 686 31 91 1.488
Paamiut 635 34 669 552 24 58 1.245
Nuuk 7.885 2.634 10.519 8.043 1.551 4.185 20.113
Maniitsoq 1.534 121 1.655 1.354 54 175 3.063
Sisimiut 2.837 357 3.194 2.686 236 593 6.116
Kangaatsiaq 548 3 551 471 3 6 1.025
Aasiaat 1.496 171 1.667 1.351 79 250 3.097
Qasigiannguit 528 7 535 499 7 14 1.041
Ilulissat 2.400 452 2.852 2.335 254 706 5.441
Qeqertarsuaq 401 10 411 388 7 17 806
Uummannaq 1.074 66 1.140 1.020 48 114 2.208
Upernavik 1.371 42 1.413 1.205 14 56 2.632
Qaanaaq 370 15 385 315 8 23 708
Tasiilaq 1.231 75 1.306 1.204 36 111 2.546
Ittoqqortoormiit 163 4 167 151 7 11 325


Se Statistikbanken tabel: BEDST3

table <- 
  read_csv(
    glue(link3, csv, lang),
    locale = locale(encoding = "latin1"))

column_vector <- 1:8
names(column_vector) <- c(" ",
                          fromJSON(file = glue::glue(link3, json, lang))$dimension$`place of birth`$category$label$N,
                          fromJSON(file = glue::glue(link3, json, lang))$dimension$`place of birth`$category$label$S,
                          fromJSON(file = glue::glue(link3, json, lang))$dimension$`place of birth`$category$label$T,
                          glue(fromJSON(file = glue::glue(link3, json, lang))$dimension$`place of birth`$category$label$N, " "),
                          glue(fromJSON(file = glue::glue(link3, json, lang))$dimension$`place of birth`$category$label$S, " "),
                          glue(fromJSON(file = glue::glue(link3, json, lang))$dimension$`place of birth`$category$label$T, " "),
                          glue(fromJSON(file = glue::glue(link3, json, lang))$dimension$`place of birth`$category$label$T, "  "))

header_vector <- c(1, 3, 3, 1)
names(header_vector) <- c(" ",
                          fromJSON(file = glue::glue(link3, json, lang))$dimension$gender$category$label$M,
                          fromJSON(file = glue::glue(link3, json, lang))$dimension$gender$category$label$K,
                          fromJSON(file = glue::glue(link3, json, lang))$dimension$gender$category$label$T)

table %>% 
    select(-8, -9) %>% 
    filter(table[,10] > 0) %>% 
    rename(column_vector) %>% 
    statgl_table() %>% 
    row_spec(1, bold = T) %>% 
    add_header_above(header_vector) |> 
    pack_rows("2024", 1, 80)
Angutit
Arnat
Katillugit
Kalaallit Nunaat Kalaallit Nunaata avataani Katillugit Kalaallit Nunaat Kalaallit Nunaata avataani Katillugit Katillugit
2024
Nuna tamakkerlugu 25.443 4.327 29.770 24.295 2.477 26.772 56.542
Nanortalik (illoqarfik) 551 21 572 499 7 506 1.078
Aappilattoq (Kujallermi nunaqarfik) 48 1 49 36 1 37 86
Narsarmijit (2018-ip naanerani taajuut allanngorpoq) 32 1 33 26 0 26 59
Tasiusaq (Kujallermi nunaqarfik) 30 0 30 11 1 12 42
Ammassivik (nunaqarfik) 17 0 17 16 0 16 33
Alluitsup Paa (nunaqarfik) 79 6 85 51 0 51 136
Uoplyst i Nanortalik distrikt 1 2 3 2 1 3 6
Qaqortoq (illoqarfik) 1.417 210 1.627 1.343 99 1.442 3.069
Saarloq (nunaqarfik) 17 0 17 11 0 11 28
Eqalugaarsuit (nunaqarfik) 42 2 44 29 0 29 73
Qassimiut (nunaqarfik) 8 0 8 4 0 4 12
Narsaq (illoqarfik) 604 35 639 598 20 618 1.257
Igaliku (nunaqarfik) 18 1 19 13 0 13 32
Qassiarsuk (nunaqarfik) 34 1 35 29 2 31 66
Narsarsuaq (nunaqarfik) 54 23 77 46 9 55 132
Uoplyst i Narsaq distrikt 1 0 1 0 0 0 1
Paamiut (illoqarfik) 593 34 627 520 22 542 1.169
Arsuk (nunaqarfik) 42 0 42 32 2 34 76
Nuuk (illoqarfik) 7.757 2.632 10.389 7.965 1.549 9.514 19.903
Qeqertarsuatsiaat (nunaqarfik) 101 2 103 67 1 68 171
Kapisillit (nunaqarfik) 25 0 25 11 1 12 37
Uoplyst i Nuuk distrikt 2 0 2 0 0 0 2
Tasiilaq (illoqarfik) 822 60 882 847 29 876 1.758
Sermiligaaq (nunaqarfik) 104 0 104 98 0 98 202
Isertoq (nunaqarfik) 32 0 32 27 0 27 59
Kulusuk (nunaqarfik) 110 9 119 80 7 87 206
Tiilerilaaq (nunaqarfik) 41 2 43 44 0 44 87
Kuummiit (nunaqarfik) 122 4 126 108 0 108 234
Ittoqqortoormiit (illoqarfik) 162 4 166 151 7 158 324
Uoplyst i Illoqqortoormiut distrikt 1 0 1 0 0 0 1
Maniitsoq (illoqarfik) 1.236 118 1.354 1.111 54 1.165 2.519
Atammik (nunaqarfik) 101 2 103 81 0 81 184
Napasoq (nunaqarfik) 35 0 35 30 0 30 65
Kangaamiut (nunaqarfik) 162 1 163 132 0 132 295
Sisimiut (illoqarfik) 2.573 280 2.853 2.445 187 2.632 5.485
Itilleq (nunaqarfik) 49 0 49 51 0 51 100
Sarfannguit (nunaqarfik) 52 1 53 38 0 38 91
Kangerlussuaq (nunaqarfik) 163 76 239 152 49 201 440
Kangaatsiaq (illoqarfik) 245 2 247 231 3 234 481
Attu (nunaqarfik) 105 1 106 78 0 78 184
Iginniarfik (nunaqarfik) 32 0 32 29 0 29 61
Niaqornaarsuk (nunaqarfik) 119 0 119 94 0 94 213
Ikerasaarsuk (KAN)(nunaqarfik) 47 0 47 39 0 39 86
Aasiaat (illoqarfik) 1.430 171 1.601 1.312 79 1.391 2.992
Akunnaaq (nunaqarfik) 36 0 36 19 0 19 55
Kitsissuarsuit (nunaqarfik) 30 0 30 20 0 20 50
Qasigiannguit (illoqarfik) 489 7 496 459 6 465 961
Ikamiut (nunaqarfik) 39 0 39 40 1 41 80
Qeqertarsuaq (illoqarfik) 397 10 407 385 7 392 799
Kangerluk (nunaqarfik) 4 0 4 3 0 3 7
Ilulissat (illoqarfik) 2.222 446 2.668 2.167 252 2.419 5.087
Oqaatsut (nunaqarfik) 23 4 27 15 0 15 42
Qeqertaq (nunaqarfik) 48 0 48 49 0 49 97
Saqqaq (nunaqarfik) 85 1 86 72 2 74 160
Ilimanaq (nunaqarfik) 22 1 23 32 0 32 55
Uummannaq (illoqarfik) 659 54 713 647 41 688 1.401
Niaqornat (nunaqarfik) 12 0 12 17 0 17 29
Qaarsut (nunaqarfik) 87 3 90 81 1 82 172
Ikerasak (nunaqarfik) 122 0 122 102 0 102 224
Saattut (nunaqarfik) 120 6 126 100 5 105 231
Ukkusissat (nunaqarfik) 74 3 77 73 1 74 151
Upernavik (illoqarfik) 548 31 579 481 7 488 1.067
Upernavik Kujalleq (nunaqarfik) 96 0 96 91 0 91 187
Kangersuatsiaq (nunaqarfik) 78 0 78 40 0 40 118
Aappilattoq (Avannaani nunaqarfik) 78 0 78 71 0 71 149
Tasiusaq (Avannaani nunaqarfik) 131 3 134 127 3 130 264
Nuussuaq (nunaqarfik) 87 1 88 86 0 86 174
Kullorsuaq (nunaqarfik) 222 4 226 216 2 218 444
Naajaat (nunaqarfik) 26 0 26 21 0 21 47
Innaarsuit (nunaqarfik) 85 3 88 58 2 60 148
Nutaarmiut (nunaqarfik) 19 0 19 12 0 12 31
Ikerasaarsuk (UPE)(nunaqarfik) 1 0 1 2 0 2 3
Qaanaaq (illoqarfik) 304 14 318 272 8 280 598
Savissivik (nunaqarfik) 29 0 29 19 0 19 48
Siorapaluk (nunaqarfik) 22 1 23 15 0 15 38
Qeqertat (nunaqarfik) 14 0 14 9 0 9 23
Uoplyst i Qaanaaq distrikt 1 0 1 0 0 0 1
Pituffik (stationi) 17 25 42 6 6 12 54
Uoplyst udenfor kommunerne 0 8 8 1 3 4 12


Se Statistikbanken tabel: BEDST4


Sidst opdateret: 22. juni 2025
LS0tDQpwYXJhbXM6DQogIGxhbmc6ICJkYSINCm91dHB1dDoNCiAgc3RhdGdsOjpzdGF0Z2xfcmVwb3J0Og0KICAgIGNvZGVfZG93bmxvYWQ6IHRydWUNCiAgICBjb2RlX2ZvbGRpbmc6IGhpZGUNCmVkaXRvcl9vcHRpb25zOiANCiAgY2h1bmtfb3V0cHV0X3R5cGU6IGNvbnNvbGUNCi0tLQ0KDQpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0NCg0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KA0KCWVjaG8gICAgPSBUUlVFLA0KCW1lc3NhZ2UgPSBGQUxTRSwNCgl3YXJuaW5nID0gRkFMU0UsDQoJY2xhc3Mub3V0cHV0ID0gInNjcm9sbC0xMDAiDQopDQoNCnsNCmxpYnJhcnkoInRpZHl2ZXJzZSIpDQpsaWJyYXJ5KCJzdGF0Z2wiKQ0KbGlicmFyeSgia2FibGVFeHRyYSIpDQpsaWJyYXJ5KCJsdWJyaWRhdGUiKQ0KbGlicmFyeSgieWFtbCIpDQp9DQoNCnsgIA0KbGFuZ3VhZ2UgIDwtIHBhcmFtcyRsYW5nDQpvcHRpb24gICAgPC0gcGFzdGUwKCI/bGFuZz0iLCBsYW5ndWFnZSwgIiZzZWxlY3QiKQ0KbG9nbyAgICAgIDwtIHBhc3RlMChnZXR3ZCgpLCIvYWRkL2xvZ28uZ2lmIikNCnR4dCAgICAgICA8LSByZWFkX3lhbWwocGFzdGUwKGdldHdkKCksICIvYWRkL3R4dC55bWwiKSwgZmlsZUVuY29kaW5nID0gIklTTy04ODU5LTEiKQ0Kc291cmNlICAgIDwtIHR4dCRzb3VyY2VbbGFuZ3VhZ2VdICU+JSB1bmxpc3QoKQ0KfQ0KDQp4YXJpbmdhbkV4dHJhOjp1c2VfY2xpcGJvYXJkKCkNCg0KYGBgDQoNCmBgYHtjc3MsIGVjaG8gPSBGQUxTRX0NCg0KLmFjY29yZGlvbiB7DQogIGJhY2tncm91bmQtY29sb3I6ICM5MTk5MDA7DQogIGNvbG9yOiB3aGl0ZTsNCiAgY3Vyc29yOiBwb2ludGVyOw0KICBwYWRkaW5nOiAxOHB4Ow0KICB3aWR0aDogMTAwJTsNCiAgYm9yZGVyOiBub25lOw0KICBib3JkZXItcmFkaXVzOiA1cHg7DQogIHRleHQtYWxpZ246IGxlZnQ7DQogIG91dGxpbmU6IG5vbmU7DQogIGZvbnQtc2l6ZTogMTVweDsNCiAgdHJhbnNpdGlvbjogMC40czsNCn0NCg0KLmFjdGl2ZSwgLmFjY29yZGlvbjpob3ZlciB7DQogIGJhY2tncm91bmQtY29sb3I6ICNmOTcyNDI7DQp9DQoNCi5hY2NvcmRpb246YWZ0ZXIgew0KICBjb250ZW50OiAnXDAwMkInOw0KICBjb2xvcjogIzc3NzsNCiAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogIGZsb2F0OiByaWdodDsNCiAgbWFyZ2luLWxlZnQ6IDVweDsNCn0NCg0KLmFjdGl2ZTphZnRlciB7DQogIGNvbnRlbnQ6ICJcMjIxMiI7DQp9DQoNCi5wYW5lbCB7DQogIHBhZGRpbmc6IDBweCA1cHggMHB4IDVweDsNCiAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7DQogIG1heC1oZWlnaHQ6IDA7DQogIG92ZXJmbG93OiBoaWRkZW47DQogIHRyYW5zaXRpb246IG1heC1oZWlnaHQgMC4ycyBlYXNlLW91dDsNCn0NCg0KZGV0YWlscyB7DQogIHdpZHRoOiAxMDAlOw0KfQ0KDQpkZXRhaWxzID4gc3VtbWFyeSB7DQogIHBhZGRpbmc6IDRweCAxMnB4Ow0KICB3aWR0aDogMTAwJTsNCiAgYmFja2dyb3VuZC1jb2xvcjogIzAwN2Y5OTsNCiAgYm9yZGVyOiBzb2xpZDsNCiAgYm9yZGVyLWNvbG9yOiB3aGl0ZTsNCiAgYm9yZGVyLXJhZGl1czogNXB4Ow0KICBjdXJzb3I6IHBvaW50ZXI7DQogIGZvbnQtc2l6ZTogMTVweDsNCiAgY29sb3I6IHdoaXRlOw0KfQ0KDQpkZXRhaWxzW29wZW5dID4gc3VtbWFyeSB7DQogIGJhY2tncm91bmQtY29sb3I6ICNmYWE0MWE7DQp9DQoNCg0KLnRpdGxlIHsNCiAgY29sb3I6ICMxYjU0NjM7DQogIGZvbnQtc2l6ZTogMzZweDsNCn0NCg0KDQoucGVyc29uZXIgew0KICBib3gtc2hhZG93OiAzcHggM3B4IDRweCBibGFjazsNCiAgYmFja2dyb3VuZDogIzAwNDQ1OTsNCiAgcGFkZGluZy1yaWdodDogMTVweDsNCiAgcGFkZGluZy1sZWZ0OiAxNnB4Ow0KICBwYWRkaW5nLXRvcDogMC4xcHg7DQogIHBhZGRpbmctYm90dG9tOiAxcHg7DQogIGZvbnQtc2l6ZTogMTFweDsNCiAgY29sb3I6IHdoaXRlOw0KICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOw0KfQ0KDQouw7hrb25vbWkgew0KICBib3gtc2hhZG93OiAzcHggM3B4IDRweCBibGFjazsNCiAgYmFja2dyb3VuZDogIzAwN0Y5OTsNCiAgcGFkZGluZy1yaWdodDogMTVweDsNCiAgcGFkZGluZy1sZWZ0OiAxNnB4Ow0KICBwYWRkaW5nLXRvcDogMXB4Ow0KICBwYWRkaW5nLWJvdHRvbTogMC4xcHg7DQogIGZvbnQtc2l6ZTogMTFweDsNCiAgY29sb3I6IHdoaXRlOw0KICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOw0KfQ0KDQoudHbDpnJnw6VlbmRlIHsNCiAgYm94LXNoYWRvdzogM3B4IDNweCA0cHggYmxhY2s7DQogIGJhY2tncm91bmQ6ICNmYWE0MWE7DQogIHBhZGRpbmctcmlnaHQ6IDE1cHg7DQogIHBhZGRpbmctbGVmdDogMTZweDsNCiAgcGFkZGluZy10b3A6IDAuMXB4Ow0KICBwYWRkaW5nLWJvdHRvbTogMXB4Ow0KICBmb250LXNpemU6IDExcHg7DQogIGNvbG9yOiB3aGl0ZTsNCiAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsNCn0NCg0KLmNvbnRhaW5lciB7DQogIHdpZHRoOiBpbmhlcml0Ow0KfQ0KDQouc2Nyb2xsLTEwMCB7DQogIG1heC1oZWlnaHQ6IDEwMDsNCiAgb3ZlcmZsb3cteTogYXV0bzsNCiAgYmFja2dyb3VuZC1jb2xvcjogaW5oZXJpdDsNCn0NCg0KDQpwcmUgew0KICBtYXgtaGVpZ2h0OiAzMDBweDsNCiAgb3ZlcmZsb3cteTogYXV0bzsNCn0NCg0KcHJlW2NsYXNzXSB7DQogIG1heC1oZWlnaHQ6IDMwMHB4Ow0KfQ0KDQpgYGANCg0KPGJyPg0KPGJyPg0KDQo8Y2VudGVyPg0KDQotLS0NCiANCiMgW2ByIHR4dCRCRSR0aXRsZVtsYW5ndWFnZV1gXXsudGl0bGV9DQogDQotLS0NCjwvY2VudGVyPg0KDQoNCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQoNCmxpYnJhcnkoInRpZHl2ZXJzZSIpDQpsaWJyYXJ5KHN0YXRnbCkgIyBJbmZvIGF0IHd3dy5zdGF0LmdsL1NCRTIwMjAwMy9vMQ0KbGlicmFyeSgia2FibGVFeHRyYSIpDQpsaWJyYXJ5KCJnbHVlIikNCmxpYnJhcnkoInJqc29uIikNCg0KDQpsYW5nIDwtIHBhc3RlMCgiP2xhbmc9IiwgbGFuZ3VhZ2UpIA0Kc2VsZWN0IDwtICImc2VsZWN0Ig0KanNvbiA8LSAiLmpzb25fc3RhdDIiDQpjc3YgPC0gIi5jc3YiDQoNCmZpcnN0X2JsYW5rIDwtIGMoIiAiID0gMSkNCg0KdGFibGUgPC0gIlRhYmVsIg0Kbm90ZSAgIDwtICJTZSBTdGF0aXN0aWtiYW5rZW4gdGFiZWw6ICINCg0KdGl0bGUxIDwtICIxLjEuIEJlZm9sa25pbmcgaSBrb21tdW5lciwgZGlzdHJpa3RlciBvZyBsb2thbGl0ZXRlciINCg0KaWQxIDwtICJCRURTVDIiDQppZDIgPC0gIkJFRFNUMyINCmlkMyA8LSAiQkVEU1Q0Ig0KDQoNCmxpbmsxIDwtICJodHRwczovL2Jhbmsuc3RhdC5nbDo0NDMvc3EvYmU2NmUyMGQtOTUwYy00MWZkLTk4YmUtMGM4MWUwZjE5NDE3Ig0KbGluazIgPC0gImh0dHBzOi8vYmFuay5zdGF0LmdsOjQ0My9zcS80NWIyY2NkMC0xN2IwLTQ3NmMtYjdjMS03YTkyY2Q1YzdhM2MiIA0KbGluazMgPC0gImh0dHBzOi8vYmFuay5zdGF0LmdsOjQ0My9zcS8xYmI1NTA3ZC0wN2NhLTRmMTMtYTgwMC1lYjg3M2U3YzQ1NjkiDQoNCg0KdGFibGUxIDwtIGdsdWUoIioqIiwgdGFibGUsICIgMS4qKiAiLCBmcm9tSlNPTihmaWxlID0gZ2x1ZShsaW5rMSwganNvbiwgbGFuZykpJGxhYmVsKQ0KdGFibGUyIDwtIGdsdWUoIioqIiwgdGFibGUsICIgMi4qKiAiLCBmcm9tSlNPTihmaWxlID0gZ2x1ZShsaW5rMiwganNvbiwgbGFuZykpJGxhYmVsKQ0KdGFibGUzIDwtIGdsdWUoIioqIiwgdGFibGUsICIgMy4qKiAiLCBmcm9tSlNPTihmaWxlID0gZ2x1ZShsaW5rMywganNvbiwgbGFuZykpJGxhYmVsKQ0KDQoNCg0KDQoNCg0KYGBgDQoNCjxkZXRhaWxzIG9wZW4+IDxzdW1tYXJ5PiBgciB0eHQkQkUkc3ViMVtsYW5ndWFnZV1gIDwvc3VtbWFyeT4NCjxicj4NCjxidXR0b24gY2xhc3M9ImFjY29yZGlvbiI+IGByIHRhYmxlMSBgIDwvYnV0dG9uPiA8ZGl2IGNsYXNzPSJwYW5lbCI+DQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KDQp0YWJsZSA8LSANCiAgcmVhZF9jc3YoDQogICAgZ2x1ZTo6Z2x1ZShsaW5rMSwgY3N2LCBsYW5nKSwNCiAgICBsb2NhbGUgPSBsb2NhbGUoZW5jb2RpbmcgPSAibGF0aW4xIikpIHw+IA0KICAgIG11dGF0ZShhYXIgPSAiMjAyNCIsIC5iZWZvcmUgPSAyKQ0KDQpjb2x1bW5fdmVjdG9yIDwtIDE6OA0KbmFtZXMoY29sdW1uX3ZlY3RvcikgPC0gYygiICIsDQogICAgICAgICAgICAgICAgICAgICAgICAgIGZyb21KU09OKGZpbGUgPSBnbHVlOjpnbHVlKGxpbmsxLCBqc29uLCBsYW5nKSkkZGltZW5zaW9uJGBwbGFjZSBvZiBiaXJ0aGAkY2F0ZWdvcnkkbGFiZWwkTiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbUpTT04oZmlsZSA9IGdsdWU6OmdsdWUobGluazEsIGpzb24sIGxhbmcpKSRkaW1lbnNpb24kYHBsYWNlIG9mIGJpcnRoYCRjYXRlZ29yeSRsYWJlbCRTLA0KICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tSlNPTihmaWxlID0gZ2x1ZTo6Z2x1ZShsaW5rMSwganNvbiwgbGFuZykpJGRpbWVuc2lvbiRgcGxhY2Ugb2YgYmlydGhgJGNhdGVnb3J5JGxhYmVsJFQsDQogICAgICAgICAgICAgICAgICAgICAgICAgIGdsdWUoZnJvbUpTT04oZmlsZSA9IGdsdWU6OmdsdWUobGluazEsIGpzb24sIGxhbmcpKSRkaW1lbnNpb24kYHBsYWNlIG9mIGJpcnRoYCRjYXRlZ29yeSRsYWJlbCROLCAiICIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICBnbHVlKGZyb21KU09OKGZpbGUgPSBnbHVlOjpnbHVlKGxpbmsxLCBqc29uLCBsYW5nKSkkZGltZW5zaW9uJGBwbGFjZSBvZiBiaXJ0aGAkY2F0ZWdvcnkkbGFiZWwkUywgIiAiKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgZ2x1ZShmcm9tSlNPTihmaWxlID0gZ2x1ZTo6Z2x1ZShsaW5rMSwganNvbiwgbGFuZykpJGRpbWVuc2lvbiRgcGxhY2Ugb2YgYmlydGhgJGNhdGVnb3J5JGxhYmVsJFQsICIgIiksDQogICAgICAgICAgICAgICAgICAgICAgICAgIGdsdWUoZnJvbUpTT04oZmlsZSA9IGdsdWU6OmdsdWUobGluazEsIGpzb24sIGxhbmcpKSRkaW1lbnNpb24kYHBsYWNlIG9mIGJpcnRoYCRjYXRlZ29yeSRsYWJlbCRULCAiICAiKSkNCg0KaGVhZGVyX3ZlY3RvciA8LSBjKDEsIDMsIDMsIDEpDQpuYW1lcyhoZWFkZXJfdmVjdG9yKSA8LSBjKCIgIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbUpTT04oZmlsZSA9IGdsdWU6OmdsdWUobGluazEsIGpzb24sIGxhbmcpKSRkaW1lbnNpb24kZ2VuZGVyJGNhdGVnb3J5JGxhYmVsJE0sDQogICAgICAgICAgICAgICAgICAgICAgICAgIGZyb21KU09OKGZpbGUgPSBnbHVlOjpnbHVlKGxpbmsxLCBqc29uLCBsYW5nKSkkZGltZW5zaW9uJGdlbmRlciRjYXRlZ29yeSRsYWJlbCRLLA0KICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tSlNPTihmaWxlID0gZ2x1ZTo6Z2x1ZShsaW5rMSwganNvbiwgbGFuZykpJGRpbWVuc2lvbiRnZW5kZXIkY2F0ZWdvcnkkbGFiZWwkVCkNCg0KdGFibGUgJT4lIA0KICBzZWxlY3QoLTIsIC04LCAtOSkgJT4lIA0KICByZW5hbWUoY29sdW1uX3ZlY3RvcikgJT4lIA0KICBzdGF0Z2xfdGFibGUoKSAlPiUgDQogIHJvd19zcGVjKDEsIGJvbGQgPSBUKSAlPiUgDQogIGFkZF9oZWFkZXJfYWJvdmUoaGVhZGVyX3ZlY3RvcikgfD4gDQogIHBhY2tfcm93cyhpbmRleCA9IHRhYmxlKHRhYmxlWzJdKSkNCg0KDQoNCmBgYA0KPGJyPg0KWyFbXShgciBsb2dvYCl7d2lkdGg9NDB9YHIgZ2x1ZTo6Z2x1ZShub3RlLCBpZDEpYCAgXShgciBnbHVlOjpnbHVlKGxpbmsxLCBsYW5nLCBzZWxlY3QpYCl7dGFyZ2V0PSJfYmxhbmsifQ0KPC9kaXY+IA0KDQoNCjxidXR0b24gY2xhc3M9ImFjY29yZGlvbiI+IGByIHRhYmxlMiBgIDwvYnV0dG9uPiA8ZGl2IGNsYXNzPSJwYW5lbCI+DQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KDQp0YWJsZSA8LSANCiAgcmVhZF9jc3YoDQogICAgZ2x1ZTo6Z2x1ZShsaW5rMiwgY3N2LCBsYW5nKSwNCiAgICBsb2NhbGUgPSBsb2NhbGUoZW5jb2RpbmcgPSAibGF0aW4xIikpIHw+IA0KICAgIG11dGF0ZShhYXIgPSAiMjAyNCIsIC5iZWZvcmUgPSAyKQ0KDQpjb2x1bW5fdmVjdG9yIDwtIDE6OA0KbmFtZXMoY29sdW1uX3ZlY3RvcikgPC0gYygiICIsDQogICAgICAgICAgICAgICAgICAgICAgICAgIGZyb21KU09OKGZpbGUgPSBnbHVlOjpnbHVlKGxpbmsyLCBqc29uLCBsYW5nKSkkZGltZW5zaW9uJGBwbGFjZSBvZiBiaXJ0aGAkY2F0ZWdvcnkkbGFiZWwkTiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbUpTT04oZmlsZSA9IGdsdWU6OmdsdWUobGluazIsIGpzb24sIGxhbmcpKSRkaW1lbnNpb24kYHBsYWNlIG9mIGJpcnRoYCRjYXRlZ29yeSRsYWJlbCRTLA0KICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tSlNPTihmaWxlID0gZ2x1ZTo6Z2x1ZShsaW5rMiwganNvbiwgbGFuZykpJGRpbWVuc2lvbiRgcGxhY2Ugb2YgYmlydGhgJGNhdGVnb3J5JGxhYmVsJFQsDQogICAgICAgICAgICAgICAgICAgICAgICAgIGdsdWUoZnJvbUpTT04oZmlsZSA9IGdsdWU6OmdsdWUobGluazIsIGpzb24sIGxhbmcpKSRkaW1lbnNpb24kYHBsYWNlIG9mIGJpcnRoYCRjYXRlZ29yeSRsYWJlbCROLCAiICIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICBnbHVlKGZyb21KU09OKGZpbGUgPSBnbHVlOjpnbHVlKGxpbmsyLCBqc29uLCBsYW5nKSkkZGltZW5zaW9uJGBwbGFjZSBvZiBiaXJ0aGAkY2F0ZWdvcnkkbGFiZWwkUywgIiAiKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgZ2x1ZShmcm9tSlNPTihmaWxlID0gZ2x1ZTo6Z2x1ZShsaW5rMiwganNvbiwgbGFuZykpJGRpbWVuc2lvbiRgcGxhY2Ugb2YgYmlydGhgJGNhdGVnb3J5JGxhYmVsJFQsICIgIiksDQogICAgICAgICAgICAgICAgICAgICAgICAgIGdsdWUoZnJvbUpTT04oZmlsZSA9IGdsdWU6OmdsdWUobGluazIsIGpzb24sIGxhbmcpKSRkaW1lbnNpb24kYHBsYWNlIG9mIGJpcnRoYCRjYXRlZ29yeSRsYWJlbCRULCAiICAiKSkNCg0KaGVhZGVyX3ZlY3RvciA8LSBjKDEsIDMsIDMsIDEpDQpuYW1lcyhoZWFkZXJfdmVjdG9yKSA8LSBjKCIgIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbUpTT04oZmlsZSA9IGdsdWU6OmdsdWUobGluazIsIGpzb24sIGxhbmcpKSRkaW1lbnNpb24kZ2VuZGVyJGNhdGVnb3J5JGxhYmVsJE0sDQogICAgICAgICAgICAgICAgICAgICAgICAgIGZyb21KU09OKGZpbGUgPSBnbHVlOjpnbHVlKGxpbmsyLCBqc29uLCBsYW5nKSkkZGltZW5zaW9uJGdlbmRlciRjYXRlZ29yeSRsYWJlbCRLLA0KICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tSlNPTihmaWxlID0gZ2x1ZTo6Z2x1ZShsaW5rMiwganNvbiwgbGFuZykpJGRpbWVuc2lvbiRnZW5kZXIkY2F0ZWdvcnkkbGFiZWwkVCkNCg0KDQp0YWJsZSAlPiUgDQogIHNlbGVjdCgtMiwgLTgsIC05KSAlPiUgDQogIGZpbHRlcih0YWJsZVssMTBdID4gMCkgJT4lIA0KICByZW5hbWUoY29sdW1uX3ZlY3RvcikgJT4lIA0KICBzdGF0Z2xfdGFibGUoKSAlPiUgDQogIHJvd19zcGVjKDEsIGJvbGQgPSBUKSAlPiUgDQogIGFkZF9oZWFkZXJfYWJvdmUoaGVhZGVyX3ZlY3RvcikgfD4gDQogIHBhY2tfcm93cyhpbmRleCA9IHRhYmxlKHRhYmxlWzJdKSkNCg0KDQoNCmBgYA0KPGJyPg0KWyFbXShgciBsb2dvYCl7d2lkdGg9NDB9YHIgZ2x1ZTo6Z2x1ZShub3RlLCBpZDIpYCAgXShgciBnbHVlOjpnbHVlKGxpbmsyLCBsYW5nLCBzZWxlY3QpYCl7dGFyZ2V0PSJfYmxhbmsifQ0KPC9kaXY+DQoNCjxidXR0b24gY2xhc3M9ImFjY29yZGlvbiI+IGByIHRhYmxlMyBgIDwvYnV0dG9uPiA8ZGl2IGNsYXNzPSJwYW5lbCI+DQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KDQp0YWJsZSA8LSANCiAgcmVhZF9jc3YoDQogICAgZ2x1ZShsaW5rMywgY3N2LCBsYW5nKSwNCiAgICBsb2NhbGUgPSBsb2NhbGUoZW5jb2RpbmcgPSAibGF0aW4xIikpDQoNCmNvbHVtbl92ZWN0b3IgPC0gMTo4DQpuYW1lcyhjb2x1bW5fdmVjdG9yKSA8LSBjKCIgIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbUpTT04oZmlsZSA9IGdsdWU6OmdsdWUobGluazMsIGpzb24sIGxhbmcpKSRkaW1lbnNpb24kYHBsYWNlIG9mIGJpcnRoYCRjYXRlZ29yeSRsYWJlbCROLA0KICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tSlNPTihmaWxlID0gZ2x1ZTo6Z2x1ZShsaW5rMywganNvbiwgbGFuZykpJGRpbWVuc2lvbiRgcGxhY2Ugb2YgYmlydGhgJGNhdGVnb3J5JGxhYmVsJFMsDQogICAgICAgICAgICAgICAgICAgICAgICAgIGZyb21KU09OKGZpbGUgPSBnbHVlOjpnbHVlKGxpbmszLCBqc29uLCBsYW5nKSkkZGltZW5zaW9uJGBwbGFjZSBvZiBiaXJ0aGAkY2F0ZWdvcnkkbGFiZWwkVCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgZ2x1ZShmcm9tSlNPTihmaWxlID0gZ2x1ZTo6Z2x1ZShsaW5rMywganNvbiwgbGFuZykpJGRpbWVuc2lvbiRgcGxhY2Ugb2YgYmlydGhgJGNhdGVnb3J5JGxhYmVsJE4sICIgIiksDQogICAgICAgICAgICAgICAgICAgICAgICAgIGdsdWUoZnJvbUpTT04oZmlsZSA9IGdsdWU6OmdsdWUobGluazMsIGpzb24sIGxhbmcpKSRkaW1lbnNpb24kYHBsYWNlIG9mIGJpcnRoYCRjYXRlZ29yeSRsYWJlbCRTLCAiICIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICBnbHVlKGZyb21KU09OKGZpbGUgPSBnbHVlOjpnbHVlKGxpbmszLCBqc29uLCBsYW5nKSkkZGltZW5zaW9uJGBwbGFjZSBvZiBiaXJ0aGAkY2F0ZWdvcnkkbGFiZWwkVCwgIiAiKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgZ2x1ZShmcm9tSlNPTihmaWxlID0gZ2x1ZTo6Z2x1ZShsaW5rMywganNvbiwgbGFuZykpJGRpbWVuc2lvbiRgcGxhY2Ugb2YgYmlydGhgJGNhdGVnb3J5JGxhYmVsJFQsICIgICIpKQ0KDQpoZWFkZXJfdmVjdG9yIDwtIGMoMSwgMywgMywgMSkNCm5hbWVzKGhlYWRlcl92ZWN0b3IpIDwtIGMoIiAiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tSlNPTihmaWxlID0gZ2x1ZTo6Z2x1ZShsaW5rMywganNvbiwgbGFuZykpJGRpbWVuc2lvbiRnZW5kZXIkY2F0ZWdvcnkkbGFiZWwkTSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbUpTT04oZmlsZSA9IGdsdWU6OmdsdWUobGluazMsIGpzb24sIGxhbmcpKSRkaW1lbnNpb24kZ2VuZGVyJGNhdGVnb3J5JGxhYmVsJEssDQogICAgICAgICAgICAgICAgICAgICAgICAgIGZyb21KU09OKGZpbGUgPSBnbHVlOjpnbHVlKGxpbmszLCBqc29uLCBsYW5nKSkkZGltZW5zaW9uJGdlbmRlciRjYXRlZ29yeSRsYWJlbCRUKQ0KDQp0YWJsZSAlPiUgDQogICAgc2VsZWN0KC04LCAtOSkgJT4lIA0KICAgIGZpbHRlcih0YWJsZVssMTBdID4gMCkgJT4lIA0KICAgIHJlbmFtZShjb2x1bW5fdmVjdG9yKSAlPiUgDQogICAgc3RhdGdsX3RhYmxlKCkgJT4lIA0KICAgIHJvd19zcGVjKDEsIGJvbGQgPSBUKSAlPiUgDQogICAgYWRkX2hlYWRlcl9hYm92ZShoZWFkZXJfdmVjdG9yKSB8PiANCiAgICBwYWNrX3Jvd3MoIjIwMjQiLCAxLCA4MCkNCg0KYGBgDQo8YnI+DQpbIVtdKCl7d2lkdGg9NDB9YHIgZ2x1ZTo6Z2x1ZShub3RlLCBpZDMpYCAgXShgciBnbHVlOjpnbHVlKGxpbmszLCBsYW5nLCBzZWxlY3QpYCl7dGFyZ2V0PSJfYmxhbmsifQ0KPC9kaXY+IA0KDQo8L2RldGFpbHM+DQoNCg0KDQoNCg0KDQoNCg0KDQo8aHIgc3R5bGU9ImJvcmRlcjoxcHggcmlkZ2UgbGlnaHRncmF5Ij4gPC9ocj4NCjxjZW50ZXI+IDxzcGFuIHN0eWxlPSdjb2xvcjojRDNEM0QzOyBmb250LXNpemU6OTAlOyc+IGByIHBhc3RlKHR4dCR1cGRhdGVbbGFuZ3VhZ2VdLCBmb3JtYXQoU3lzLkRhdGUoKSwgIiVkLiAlQiAlWSIpKWAgPC9zcGFuPiA8L2NlbnRlcj4NCg0KDQoNCg0KPHNjcmlwdD4NCnZhciBhY2MgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJhY2NvcmRpb24iKTsNCnZhciBpOw0KDQpmb3IgKGkgPSAwOyBpIDwgYWNjLmxlbmd0aDsgaSsrKSB7DQogIGFjY1tpXS5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsIGZ1bmN0aW9uKCkgew0KICAgIHRoaXMuY2xhc3NMaXN0LnRvZ2dsZSgiYWN0aXZlIik7DQogICAgdmFyIHBhbmVsID0gdGhpcy5uZXh0RWxlbWVudFNpYmxpbmc7DQogICAgaWYgKHBhbmVsLnN0eWxlLm1heEhlaWdodCkgew0KICAgICAgcGFuZWwuc3R5bGUubWF4SGVpZ2h0ID0gbnVsbDsNCiAgICB9IGVsc2Ugew0KICAgICAgcGFuZWwuc3R5bGUubWF4SGVpZ2h0ID0gcGFuZWwuc2Nyb2xsSGVpZ2h0ICsgInB4IjsNCiAgICB9IA0KICB9KTsNCn0NCjwvc2NyaXB0Pg0KDQo=