diff --git a/.Rbuildignore b/.Rbuildignore index dc9edf5..655a3f8 100644 --- a/.Rbuildignore +++ b/.Rbuildignore @@ -11,4 +11,6 @@ ^\.github$ ^CRAN-RELEASE$ ^cran-comments\.md$ -man-roxygen \ No newline at end of file +man-roxygen +^CRAN-SUBMISSION$ +^data-raw$ diff --git a/.github/workflows/R-CMD-check.yaml b/.github/workflows/R-CMD-check.yaml deleted file mode 100644 index 36fa90c..0000000 --- a/.github/workflows/R-CMD-check.yaml +++ /dev/null @@ -1,88 +0,0 @@ -# For help debugging build failures open an issue on the RStudio community with the 'github-actions' tag. -# https://community.rstudio.com/new-topic?category=Package%20development&tags=github-actions -on: - push: - branches: - - main - - master - - dev - pull_request: - branches: - - main - - master - -name: R-CMD-check - -jobs: - R-CMD-check: - runs-on: ${{ matrix.config.os }} - - name: ${{ matrix.config.os }} (${{ matrix.config.r }}) - - strategy: - fail-fast: false - matrix: - config: - - {os: windows-latest, r: 'release'} - - {os: macOS-latest, r: 'release'} - - {os: ubuntu-20.04, r: 'release', rspm: "https://packagemanager.rstudio.com/cran/__linux__/focal/latest"} - - {os: ubuntu-20.04, r: 'devel', rspm: "https://packagemanager.rstudio.com/cran/__linux__/focal/latest"} - - env: - R_REMOTES_NO_ERRORS_FROM_WARNINGS: true - RSPM: ${{ matrix.config.rspm }} - GITHUB_PAT: ${{ secrets.GITHUB_TOKEN }} - CENSUS_API_KEY: ${{ secrets.CENSUS_API_KEY }} - - steps: - - uses: actions/checkout@v2 - - - uses: r-lib/actions/setup-r@v1 - with: - r-version: ${{ matrix.config.r }} - - - uses: r-lib/actions/setup-pandoc@v1 - - - name: Query dependencies - run: | - install.packages('remotes') - saveRDS(remotes::dev_package_deps(dependencies = TRUE), ".github/depends.Rds", version = 2) - writeLines(sprintf("R-%i.%i", getRversion()$major, getRversion()$minor), ".github/R-version") - shell: Rscript {0} - - - name: Restore R package cache - if: runner.os != 'Windows' - uses: actions/cache@v2 - with: - path: ${{ env.R_LIBS_USER }} - key: ${{ runner.os }}-${{ hashFiles('.github/R-version') }}-1-${{ hashFiles('.github/depends.Rds') }} - restore-keys: ${{ runner.os }}-${{ hashFiles('.github/R-version') }}-1- - - - name: Install system dependencies - if: runner.os == 'Linux' - run: | - while read -r cmd - do - eval sudo $cmd - done < <(Rscript -e 'writeLines(remotes::system_requirements("ubuntu", "20.04"))') - - - name: Install dependencies - run: | - remotes::install_deps(dependencies = TRUE) - remotes::install_cran("rcmdcheck") - shell: Rscript {0} - - - name: Check - env: - _R_CHECK_CRAN_INCOMING_REMOTE_: false - run: | - options(crayon.enabled = TRUE) - rcmdcheck::rcmdcheck(args = c("--no-manual", "--as-cran"), error_on = "warning", check_dir = "check") - shell: Rscript {0} - - - name: Upload check results - if: failure() - uses: actions/upload-artifact@main - with: - name: ${{ runner.os }}-r${{ matrix.config.r }}-results - path: check diff --git a/.github/workflows/check-standard.yaml b/.github/workflows/check-standard.yaml new file mode 100644 index 0000000..52c2b27 --- /dev/null +++ b/.github/workflows/check-standard.yaml @@ -0,0 +1,49 @@ +# Workflow derived from https://github.com/r-lib/actions/tree/v2/examples +# Need help debugging build failures? Start at https://github.com/r-lib/actions#where-to-find-help +on: + push: + branches: [main, master] + pull_request: + branches: [main, master] + +name: R-CMD-check + +jobs: + R-CMD-check: + runs-on: ${{ matrix.config.os }} + + name: ${{ matrix.config.os }} (${{ matrix.config.r }}) + + strategy: + fail-fast: false + matrix: + config: + - {os: macOS-latest, r: 'release'} + - {os: windows-latest, r: 'release'} + - {os: ubuntu-latest, r: 'devel', http-user-agent: 'release'} + - {os: ubuntu-latest, r: 'release'} + - {os: ubuntu-latest, r: 'oldrel-1'} + + env: + GITHUB_PAT: ${{ secrets.GITHUB_TOKEN }} + R_KEEP_PKG_SOURCE: yes + + steps: + - uses: actions/checkout@v2 + + - uses: r-lib/actions/setup-pandoc@v2 + + - uses: r-lib/actions/setup-r@v2 + with: + r-version: ${{ matrix.config.r }} + http-user-agent: ${{ matrix.config.http-user-agent }} + use-public-rspm: true + + - uses: r-lib/actions/setup-r-dependencies@v2 + with: + extra-packages: any::rcmdcheck + needs: check + + - uses: r-lib/actions/check-r-package@v2 + with: + upload-snapshots: true diff --git a/.github/workflows/pkgdown.yaml b/.github/workflows/pkgdown.yaml index 59ae308..0b26021 100644 --- a/.github/workflows/pkgdown.yaml +++ b/.github/workflows/pkgdown.yaml @@ -1,33 +1,46 @@ -# Workflow derived from https://github.com/r-lib/actions/tree/master/examples +# Workflow derived from https://github.com/r-lib/actions/tree/v2/examples # Need help debugging build failures? Start at https://github.com/r-lib/actions#where-to-find-help on: push: branches: [main, master] - tags: ['*'] + pull_request: + branches: [main, master] + release: + types: [published] + workflow_dispatch: name: pkgdown jobs: pkgdown: runs-on: ubuntu-latest + # Only restrict concurrency for non-PR jobs + concurrency: + group: pkgdown-${{ github.event_name != 'pull_request' || github.run_id }} env: GITHUB_PAT: ${{ secrets.GITHUB_TOKEN }} steps: - uses: actions/checkout@v2 - - uses: r-lib/actions/setup-pandoc@v1 + - uses: r-lib/actions/setup-pandoc@v2 - - uses: r-lib/actions/setup-r@v1 + - uses: r-lib/actions/setup-r@v2 with: use-public-rspm: true - - uses: r-lib/actions/setup-r-dependencies@v1 + - uses: r-lib/actions/setup-r-dependencies@v2 with: - extra-packages: pkgdown + extra-packages: any::pkgdown, local::. needs: website - - name: Deploy package - run: | - git config --local user.name "$GITHUB_ACTOR" - git config --local user.email "$GITHUB_ACTOR@users.noreply.github.com" - Rscript -e 'pkgdown::deploy_to_branch(new_process = FALSE)' + - name: Build site + run: pkgdown::build_site_github_pages(new_process = FALSE, install = FALSE) + shell: Rscript {0} + + - name: Deploy to GitHub pages 🚀 + if: github.event_name != 'pull_request' + uses: JamesIves/github-pages-deploy-action@4.1.4 + with: + clean: false + branch: gh-pages + folder: docs diff --git a/CRAN-RELEASE b/CRAN-RELEASE deleted file mode 100644 index a76db10..0000000 --- a/CRAN-RELEASE +++ /dev/null @@ -1,2 +0,0 @@ -This package was submitted to CRAN on 2021-12-08. -Once it is accepted, delete this file and tag the release (commit 071d206). diff --git a/CRAN-SUBMISSION b/CRAN-SUBMISSION new file mode 100644 index 0000000..549b479 --- /dev/null +++ b/CRAN-SUBMISSION @@ -0,0 +1,3 @@ +Version: 2.2.1 +Date: 2023-04-16 14:17:28 UTC +SHA: c9002ccb21e9b6f9257c2b7d8b8baf356cf57c70 diff --git a/DESCRIPTION b/DESCRIPTION index df3d235..c0a44ea 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,38 +1,48 @@ Package: geomander Type: Package Title: Geographic Tools for Studying Gerrymandering -Version: 2.0.2 -Date: 2021-12-08 -Authors@R: person("Christopher T.", "Kenny", email = "christopherkenny@fas.harvard.edu", - role = c("aut", "cre"), comment = c(ORCID = "0000-0002-9386-6860")) -Description: A compilation of tools to complete common tasks for studying gerrymandering. This focuses on the geographic tool side of common problems, such as linking different levels of spatial units or estimating how to break up units. Functions exist for creating redistricting-focused data for the US. +Version: 2.2.1 +Date: 2023-04-16 +Authors@R: c( + person("Christopher T.", "Kenny", email = "christopherkenny@fas.harvard.edu", + role = c("aut", "cre"), comment = c(ORCID = "0000-0002-9386-6860")), + person("Cory", "McCartan", email = "corymccartan@nyu.edu", + role = "ctb", comment = c(ORCID = "0000-0002-6251-669X")) + ) +Description: A compilation of tools to complete common tasks for studying gerrymandering. + This focuses on the geographic tool side of common problems, such as linking + different levels of spatial units or estimating how to break up units. Functions + exist for creating redistricting-focused data for the US. License: MIT + file LICENCE -URL: https://www.christophertkenny.com/geomander/, https://github.com/christopherkenny/geomander +URL: https://christophertkenny.com/geomander/, https://github.com/christopherkenny/geomander BugReports: https://github.com/christopherkenny/geomander/issues -RoxygenNote: 7.1.2 -LinkingTo: Rcpp +Roxygen: list(markdown = TRUE) +RoxygenNote: 7.2.3 +LinkingTo: Rcpp (>= 1.0.7) Imports: + censable, + cli, + dataverse, dplyr, + geos, + ggplot2, magrittr, + readr, + rlang, + Rcpp, sf, stringr, tibble, tidyr, - tigris (>= 1.5), - ggplot2, - readr, - dataverse, - censable, - Rcpp (>= 1.0.7), - geos, - cli + tinytiger Depends: - R (>= 2.10) + R (>= 3.0.2) Suggests: redist, knitr, rmarkdown, - testthat (>= 3.0.0) + testthat (>= 3.0.0), + RcppSimdJson LazyData: true Encoding: UTF-8 VignetteBuilder: knitr diff --git a/NAMESPACE b/NAMESPACE index 7732af4..f5de229 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -4,8 +4,11 @@ export("%>%") export(add_edge) export(adjacency) export(alarm_states) +export(baf_to_vtd) export(block2prec) export(block2prec_by_county) +export(ccm) +export(cct) export(check_contiguity) export(check_polygon_contiguity) export(clean_vest) @@ -25,24 +28,33 @@ export(geo_plot_group) export(geo_sort) export(geo_trim) export(geos_centerish) +export(geos_circle_center) export(get_alarm) +export(get_dra) +export(get_heda) +export(get_lewis) +export(get_rpvnearme) export(get_vest) export(global_gearys) export(global_morans) export(gstar_i) +export(heda_states) export(local_gearys) export(local_morans) export(r2dra) +export(regionalize) export(seam_adj) export(seam_geom) export(seam_rip) export(seam_sew) export(split_precinct) export(st_centerish) +export(st_circle_center) export(subtract_edge) export(suggest_component_connection) export(suggest_neighbors) export(vest_states) +importFrom(Rcpp,evalCpp) importFrom(dplyr,.data) importFrom(dplyr,all_of) importFrom(dplyr,any_of) @@ -75,6 +87,9 @@ importFrom(ggplot2,theme_void) importFrom(magrittr,"%>%") importFrom(readr,read_csv) importFrom(readr,write_csv) +importFrom(rlang,":=") +importFrom(rlang,.data) +importFrom(rlang,.env) importFrom(sf,"st_geometry<-") importFrom(stringr,str_detect) importFrom(tibble,add_row) diff --git a/NEWS.md b/NEWS.md index 694f328..a98db20 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,3 +1,25 @@ +# geomander 2.2.1 + +* Adds support for downloading Jeffrey B. Lewis's historical congressional districts with `get_lewis() +* Adds support for downloading RPV Near Me datasets with `get_rpvnearme()` +* Corrects normalized global Moran's I calculation (#12), thanks @CoryMcCartan. + +# geomander 2.2.0 +* Updates dependencies for easier installation. +* Allows for use of `circle` as a method in `geo_match()`. +* Adds a `by` argument to `geo_match()` for subsetting to known matching regions. +* Uses `redist` in vignettes only conditionally. +* Massive improvements in performance for `check_contiguity()`. + +# geomander 2.1.1 +* Fixes missing tolerance bug in `geos_circle_center()`. +* Adds experimental regionalizion approach, `regionalize()`. + +# geomander 2.1.0 +* Avoid indirect download for `get_alarm()`. Fixes bug where block level data resulted in mismatched geometry. +* Add `st_circle_center()` and `geos_circle_center()` for centroid of the maximum inscribed circle. +* Add `baf_to_vtd()` function to approximate BAFs at the VTD level. + # geomander 2.0.2 * Drop `spdep` dependency to avoid timeouts on checking examples. diff --git a/R/adjacency.R b/R/adjacency.R index 9124746..c975293 100644 --- a/R/adjacency.R +++ b/R/adjacency.R @@ -1,10 +1,17 @@ #' Add Edges to an Adjacency List #' #' @param adj list of adjacent precincts -#' @param v1 integer or integer array for first vertex to connect. -#' If array, connects each to corresponding entry in v2. -#' @param v2 integer or integer array for second vertex to connect. -#' If array, connects each to corresponding entry in v1. +#' @param v1 vector of vertex identifiers for the first vertex. Can be an +#' integer index or a value to look up in `ids`, if that argument is provided. +#' If more than one identifier is present, connects each to corresponding +#' entry in v2. +#' @param v2 vector of vertex identifiers for the second vertex. Can be an +#' integer index or a value to look up in `ids`, if that argument is provided. +#' If more than one identifier is present, connects each to corresponding +#' entry in v2. +#' @param ids A vector of identifiers which is used to look up the row indices +#' for the vertices. If provided, the entries in `v1` and `v2` must match +#' exactly one entry in `ids`. #' @param zero boolean, TRUE if the list is zero indexed. False if one indexed. #' #' @return adjacency list. @@ -15,19 +22,23 @@ #' @examples #' data(towns) #' adj <- adjacency(towns) -#' add_edge(adj, 2, 3) #' -add_edge <- function(adj, v1, v2, zero = TRUE) { - +#' add_edge(adj, 2, 3) +#' add_edge(adj, "West Haverstraw", "Stony Point", towns$MUNI) +add_edge <- function(adj, v1, v2, ids = NULL, zero = TRUE) { if (length(v1) != length(v2)) { cli::cli_abort('{.arg v1} and {.arg v2} lengths are different.') } - zero <- as.integer(zero) + zero <- as.integer(zero) - for (i in 1:length(v1)) { - adj[[v1[i]]] <- c(adj[[v1[i]]], v2[i] - 1) - adj[[v2[i]]] <- c(adj[[v2[i]]], v1[i] - 1) + matched = match_vtxs(adj, v1, v2, ids) + v1 <- matched$v1 + v2 <- matched$v2 + + for (i in seq_along(v1)) { + adj[[v1[i]]] <- c(adj[[v1[i]]], v2[i] - zero) + adj[[v2[i]]] <- c(adj[[v2[i]]], v1[i] - zero) } adj @@ -36,38 +47,82 @@ add_edge <- function(adj, v1, v2, zero = TRUE) { #' Subtract Edges from an Adjacency List #' #' @param adj list of adjacent precincts -#' @param v1 integer or integer array for first vertex to connect. -#' If array, connects each to corresponding entry in v2. -#' @param v2 integer or integer array for second vertex to connect. -#' If array, connects each to corresponding entry in v1. +#' @param v1 vector of vertex identifiers for the first vertex. Can be an +#' integer index or a value to look up in `ids`, if that argument is provided. +#' If more than one identifier is present, disconnects each to corresponding +#' entry in v2, if an edge exists. +#' @param v2 vector of vertex identifiers for the second vertex. Can be an +#' integer index or a value to look up in `ids`, if that argument is provided. +#' If more than one identifier is present, disconnects each to corresponding +#' entry in v2, if an edge exists. +#' @param ids A vector of identifiers which is used to look up the row indices +#' for the vertices. If provided, the entries in `v1` and `v2` must match +#' exactly one entry in `ids`. #' @param zero boolean, TRUE if `adj` is zero indexed. False if one indexed. #' #' @export #' @md #' @return adjacency list. -#' +#' #' @concept fix #' @examples #' data(towns) #' adj <- adjacency(towns) +#' #' subtract_edge(adj, 2, 3) -#' -subtract_edge <- function(adj, v1, v2, zero = TRUE) { - +#' subtract_edge(adj, "West Haverstraw", "Stony Point", towns$MUNI) +subtract_edge <- function(adj, v1, v2, ids = NULL, zero = TRUE) { if (length(v1) != length(v2)) { cli::cli_abort('{.arg v1} and {.arg v2} lengths are different.') } - + zero <- as.integer(zero) + + matched = match_vtxs(adj, v1, v2, ids) + v1 <- matched$v1 + v2 <- matched$v2 for (i in seq_along(v1)) { - adj[[v1[i]]] <- setdiff(adj[[v1[i]]], v2[i] - zero) - adj[[v2[i]]] <- setdiff(adj[[v2[i]]], v1[i] - zero) + adj[[v1[i]]] <- setdiff(adj[[v1[i]]], v2[i] - zero) + adj[[v2[i]]] <- setdiff(adj[[v2[i]]], v1[i] - zero) } adj } +# Helper to look up v1 and v2 in ids +match_vtxs <- function(adj, v1, v2, ids = NULL) { + if (!is.null(ids)) { + if (length(adj) != length(ids)) { + cli::cli_abort('{.arg ids} must be the same length as {.arg adj}.', + call=parent.frame()) + } + + lv1 <- lapply(v1, function(x) which(x == ids)) + lv2 <- lapply(v2, function(x) which(x == ids)) + + if (any(lengths(lv1) > 1) || any(lengths(lv2) > 1)) { + cli::cli_abort( + c('Provided {.arg ids} are not unique:', + 'i'='Duplicates: {c(v1[lengths(lv1) > 1], v2[lengths(lv2) > 1])}'), + call=parent.frame() + ) + } + if (any(lengths(lv1) == 0) || any(lengths(lv2) == 0)) { + cli::cli_abort( + c('Some values in {.arg v1} and {.arg v2} are not in {.arg ids}:', + 'i'='Missing: {c(v1[lengths(lv1) == 0], v2[lengths(lv2) == 0])}'), + call=parent.frame() + ) + } + + v1 <- unlist(lv1) + v2 <- unlist(lv2) + } + + list(v1 = v1, v2 = v2) +} + #' Suggest Neighbors for Lonely Precincts #' #' For precincts which have no adjacent precincts, this suggests the nearest precinct @@ -92,7 +147,7 @@ subtract_edge <- function(adj, v1, v2, zero = TRUE) { #' adj <- adjacency(va18sub) #' suggests <- suggest_neighbors(va18sub, adj) #' adj <- adj %>% add_edge(v1 = suggests$x, v2 = suggests$y) -#' +#' suggest_neighbors <- function(shp, adj, idx, neighbors = 1) { if (missing(idx)) { idx <- which(lengths(adj) == 0) @@ -103,7 +158,7 @@ suggest_neighbors <- function(shp, adj, idx, neighbors = 1) { out <- tibble() for (i in idx) { nn <- nn_geos(x = cents[i, ], y = cents[-i, ], k = neighbors) - for (j in 1:length(nn)) { + for (j in seq_along(nn)) { if (nn[j] >= i) { nn[j] <- nn[j] + 1 } @@ -144,7 +199,7 @@ compare_adjacencies <- function(adj1, adj2, shp, zero = TRUE) { } ret <- tibble() - for (i in 1:length(adj1)) { + for (i in seq_along(adj1)) { temp1 <- tibble( x = i, y = adj1[[i]][which(!(adj1[[i]] %in% adj2[[i]]))], from = 1 @@ -193,7 +248,7 @@ compare_adjacencies <- function(adj1, adj2, shp, zero = TRUE) { #' @param shp sf dataframe #' @templateVar epsg TRUE #' @template template -#' +#' #' @return list with nrow(shp) entries #' @export #' @@ -202,13 +257,13 @@ compare_adjacencies <- function(adj1, adj2, shp, zero = TRUE) { #' @examples #' data(precincts) #' adj <- adjacency(precincts) -#' +#' adjacency <- function(shp, epsg = 3857) { if (!inherits(shp, 'sf')) { cli::cli_abort('Input to {.arg shp} must be an sf dataframe.') } - + shp <- make_planar_pair(shp, epsg = epsg)$x - + adj_geos(shp) -} \ No newline at end of file +} diff --git a/R/alarm.R b/R/alarm.R index d6c5bed..b616a4f 100644 --- a/R/alarm.R +++ b/R/alarm.R @@ -1,17 +1,15 @@ #' Get ALARM Dataset #' -#' Get's a dataset from the Algorithm-Assisted Redistricting Methodology Project. +#' Gets a dataset from the Algorithm-Assisted Redistricting Methodology Project. #' The current supported data is the 2020 retabulations of the VEST data, which #' can be downloaded with `get_vest`. -#' +#' #' See the full available data at . -#' -#' @md -#' +#' #' #' @param state two letter state abbreviation -#' @param geometry Default is TRUE. Add geomeetry to the data? -#' @param file file path to save ALARM csv +#' @param year year to get data for. Either `2020` or `2010` +#' @param geometry Default is TRUE. Add geometry to the data? #' @templateVar epsg TRUE #' @template template #' @@ -20,40 +18,94 @@ #' #' @concept datasets #' @examples -#' \donttest{ -#' # Takes a few seconds to run -#' ak <- get_alarm('AK') -#' } -get_alarm <- function(state, geometry = TRUE, file = tempfile(fileext = '.csv'), epsg = 3857) { - base_path <- 'https://raw.githubusercontent.com/alarm-redist/census-2020/main/census-vest-2020/' - state <- tolower(censable::match_abb(state)) - end_path <- paste0(state, '_2020_vtd.csv') - out <- NULL - try({ - out <- utils::download.file(url = paste0(base_path, end_path), file) - }) +#' ak <- get_alarm('AK', geometry = FALSE) +get_alarm <- function(state, year = 2020, geometry = TRUE, epsg = 3857) { + cli::cli_inform( + 'Data sourced from the ALARM Project {.url https://github.com/alarm-redist/census-2020}.', + .frequency = 'once', + .frequency_id = 'cite_alarm' + ) - if (is.null(out)) { - end_path <- paste0(state, '_2020_block.csv') - try({ - out <- utils::download.file(url = paste0(base_path, end_path), file) - }) - if (is.null(out)) { - cli::cli_abort('State {state} not found in ALARM Data.') + base_path <- stringr::str_glue( + 'https://raw.githubusercontent.com/alarm-redist/census-2020/main/census-vest-{year}/' + ) + state <- tolower(censable::match_abb(state)) + block_states_2020 <- c('ca', 'hi', 'or') # TODO: ME probably due to non-coverage? + block_states_2010 <- c('ca', 'hi', 'ky', 'or', 'ri', 'wa') + is_block <- FALSE + if (year == 2020) { + spec <- readr::cols(GEOID20 = 'c', state = 'c', county = 'c', vtd = 'c', .default = 'd') + if (state %in% block_states_2020) { + end_path <- paste0(state, '_2020_block.csv') + spec[[1]]$vtd <- NULL + is_block <- TRUE + } else { + end_path <- paste0(state, '_2020_vtd.csv') + } + } else { + spec <- readr::cols(state = 'c', county = 'c', vtd = 'c', .default = 'd') + if (state %in% block_states_2010) { + end_path <- paste0(state, '_2010_block.csv') + spec[[1]]$vtd <- NULL + is_block <- TRUE + } else { + end_path <- paste0(state, '_2010_vtd.csv') } } - tb <- readr::read_csv(file = file, lazy = FALSE) + + tb <- readr::read_csv( + file = paste0(base_path, end_path), col_types = spec, + show_col_types = FALSE + ) if (geometry) { - geo <- tigris::voting_districts(state = state) %>% - dplyr::select(.data$GEOID20, .data$geometry) %>% - dplyr::mutate(GEOID20 = as.character(.data$GEOID20)) - tb <- tb %>% - dplyr::mutate(GEOID20 = as.character(.data$GEOID20)) %>% - dplyr::left_join(geo, by = 'GEOID20') %>% - sf::st_as_sf() - + if ((state %in% block_states_2020 && year == 2020) || (state %in% block_states_2010 && year == 2010)) { + geo <- tinytiger::tt_blocks(state = state, year = year) + } else { + geo <- tinytiger::tt_voting_districts(state = state, year = year) + } + + if (year == 2020) { + geo <- geo %>% + dplyr::select(.data$GEOID20, .data$geometry) %>% + dplyr::mutate( + GEOID20 = as.character(.data$GEOID20), + .before = dplyr::everything() + ) + tb <- tb %>% + dplyr::mutate( + GEOID20 = as.character(.data$GEOID20), + .before = dplyr::everything() + ) %>% + dplyr::left_join(geo, by = 'GEOID20') %>% + sf::st_as_sf() + } else if (year == 2010) { + geo <- geo %>% + dplyr::select(.data$GEOID10, .data$geometry) %>% + dplyr::mutate( + GEOID10 = as.character(.data$GEOID10), + .before = dplyr::everything() + ) + if (is_block) { + tb <- tb %>% + dplyr::mutate( + GEOID10 = paste0(.data$state, .data$county, .data$tract, .data$block), + .before = dplyr::everything() + ) %>% + dplyr::left_join(geo, by = 'GEOID10') %>% + sf::st_as_sf() + } else { + tb <- tb %>% + dplyr::mutate( + GEOID10 = paste0(.data$state, .data$county, .data$vtd), + .before = dplyr::everything() + ) %>% + dplyr::left_join(geo, by = 'GEOID10') %>% + sf::st_as_sf() + } + } + tb <- make_planar_pair(tb, epsg = epsg)$x } diff --git a/R/baf_to_vtd.R b/R/baf_to_vtd.R new file mode 100644 index 0000000..7d9511c --- /dev/null +++ b/R/baf_to_vtd.R @@ -0,0 +1,106 @@ +#' Estimate Plans from a Block Assignment File to Voting Districts +#' +#' District lines are often provided at the census block level, but analyses +#' often occur at the voting district level. This provides a simple way to +#' estimate the block level to the voting district level. +#' +#' If a voting district is split between blocks, this currently uses the most +#' common district. +#' +#' @param baf a tibble representing a block assignment file. +#' @param plan_name character. Name of column in `baf` which corresponds to the districts. +#' @param GEOID character. Name of column which corresponds to each block's GEOID, +#' sometimes called "BLOCKID". Default is `'GEOID'`. +#' +#' @return a tibble with a vtd-level assignment file +#' @export +#' +#' @examples +#' # Not guaranteed to reach download from redistrict2020.org +#' \dontrun{ +#' # download and read baf ---- +#' url <- 'https://www.redistrict2020.org/files/DE-2021-01/DE_SLDU_bef.zip' +#' tf <- tempfile('.zip') +#' utils::download.file(url, tf) +#' utils::unzip(tf, exdir = dirname(tf)) +#' baf <- readr::read_csv( +#' file = paste0(dirname(tf), '/DE_SLDU_bef.csv'), +#' col_types = 'ci' +#' ) +#' names(baf) <- c('GEOID', 'ssd_20') +#' +#' # convert to vtd level ---- +#' baf_to_vtd(baf = baf, plan_name = 'ssd_20', 'GEOID') +#' } +#' +baf_to_vtd <- function(baf, plan_name, GEOID = 'GEOID') { + if (missing(baf)) { + cli::cli_abort('{.arg baf} missing, but required.') + } + if (missing(plan_name)) { + cli::cli_abort('{.arg plan_name} missing, but required.') + } + + if (!inherits(baf, 'data.frame')) { + cli::cli_abort('{.arg baf} must be a {.cls data.frame} or {.cls tibble}.') + } + if (!'character' %in% class(plan_name)) { + cli::cli_abort('{.arg plan_name} must be a {.cls character}.') + } + if (!'character' %in% class(GEOID)) { + cli::cli_abort('{.arg GEOID} must be a {.cls character}.') + } + + state_fips <- substr(baf[[GEOID]][1], 1, 2) + + baf_vtd <- download_2020_vtd_baf(state = state_fips) + + baf <- baf %>% + dplyr::rename(GEOID = .env$GEOID) %>% + left_join(baf_vtd, by = 'GEOID') + + baf %>% + dplyr::select(-.data$GEOID) %>% + dplyr::mutate(GEOID = paste0(state_fips, .data$county, .data$vtd)) %>% + dplyr::select(-.data$county, .data$vtd) %>% + dplyr::group_by(.data$GEOID) %>% + dplyr::summarize({{ plan_name }} := as.integer(Mode(.data[[plan_name]]))) +} + +# adapted & simplified from PL94171::pl_get_baf() +download_2020_vtd_baf <- function(state) { + fips <- censable::match_fips(state) + abb <- censable::match_abb(state) + + zip_url <- paste0( + 'https://www2.census.gov/geo/docs/maps-data/data/baf2020/BlockAssign_ST', + fips, '_', abb, '.zip' + ) + tf <- tempfile(fileext = '.zip') + utils::download.file(zip_url, tf) + baf_vtd_path <- utils::unzip( + zipfile = tf, + files = paste0('BlockAssign_ST', fips, '_', abb, '_VTD.txt'), + exdir = dirname(tf) + ) %>% + suppressWarnings() + + if (length(baf_vtd_path) == 0) { + cli::cli_abort(c('VTD file not found in zip file.', + 'i' = paste0('Check downloaded files at ', tf, '.') + )) + } + + readr::read_delim( + file = baf_vtd_path, + delim = '|', + col_types = readr::cols(.default = 'c'), + progress = interactive() + ) %>% + dplyr::rename(GEOID = .data$BLOCKID, county = .data$COUNTYFP, vtd = .data$DISTRICT) +} + +Mode <- function(v) { + uv <- unique(v) + uv[which.max(tabulate(match(v, uv)))][1] +} diff --git a/R/center.R b/R/center.R index 076647f..883c095 100644 --- a/R/center.R +++ b/R/center.R @@ -15,9 +15,8 @@ #' @examples #' data(towns) #' st_centerish(towns) -#' +#' st_centerish <- function(shp, epsg = 3857) { - cent <- geos_centerish(shp, epsg = epsg) sf::st_geometry(shp) <- sf::st_as_sfc(cent) @@ -41,31 +40,78 @@ st_centerish <- function(shp, epsg = 3857) { #' @examples #' data(towns) #' geos_centerish(towns) -#' +#' geos_centerish <- function(shp, epsg = 3857) { - shp <- make_planar_pair(x = shp, epsg = epsg)$x - + cent <- geos::geos_centroid(shp) - + if (nrow(shp) > 1) { outside <- !geos::geos_within(cent, shp) - + if (any(outside)) { cent[outside] <- geos::geos_point_on_surface(shp[outside, ]) } } else { outside <- !geos::geos_within(geom1 = cent, geom2 = shp) - + if (is.na(outside)) { outside <- TRUE } - + if (outside) { cent <- geos::geos_point_on_surface(shp) } } - + cent } +#' Get the centroid of the maximum inscribed circle +#' +#' Returns the centroid of the largest inscribed circle for each shape +#' +#' @param shp An sf dataframe +#' @templateVar tolerance TRUE +#' @templateVar epsg TRUE +#' @template template +#' +#' @return An sf dataframe where geometry is the circle center of each shape in shp +#' @export +#' +#' @concept center +#' +#' @examples +#' data(towns) +#' st_circle_center(towns) +#' +st_circle_center <- function(shp, tolerance = 0.01, epsg = 3857) { + cent <- geos_circle_center(shp, tolerance = tolerance, epsg = epsg) + + sf::st_geometry(shp) <- sf::st_as_sfc(cent) + shp +} + +#' Get the centroid of the maximum inscribed circle +#' +#' Returns the centroid of the largest inscribed circle for each shape +#' +#' @param shp An sf dataframe +#' @templateVar tolerance TRUE +#' @templateVar epsg TRUE +#' @template template +#' +#' @return A geos geometry list +#' @export +#' +#' @concept center +#' +#' @examples +#' data(towns) +#' geos_circle_center(towns) +#' +geos_circle_center <- function(shp, tolerance = 0.01, epsg = 3857) { + shp <- make_planar_pair(x = shp, epsg = epsg)$x + + geos::geos_centroid(geos::geos_maximum_inscribed_crc(shp, tolerance = tolerance)) +} diff --git a/R/contiguity.R b/R/contiguity.R index 0cc3b57..fe1f1db 100644 --- a/R/contiguity.R +++ b/R/contiguity.R @@ -7,6 +7,31 @@ #' @param group To check contiguity within larger groups such as counties, specify the group identifiers. #' Typically input district numbers or county names. #' +#' Given a zero-indexed adjacency list and an array of group identifiers, this +#' returns a tibble which identifies the connected components. The three columns +#' are `group` for the inputted group, `group_number` which uniquely identifies each +#' group as a positive integer, and `component` which identifies the connected +#' component number for each corresponding entry of adjacency and group. If everything +#' is connected within the group, then each element of `component` will be `1`. +#' Otherwise, the largest component is given the value `1`, the next largest `2`, +#' and so on. +#' +#' If nothing is provided to group, it will default to a vector of ones, checking +#' if the adjacency graph is connected. +#' +#' `cct()` is shorthand for creating a table of the component values. If everything +#' is connected within each group, it returns a value of 1. In general, it returns +#' a frequency table of components. +#' +#' `ccm()` is shorthand for getting the maximum component value. It returns the +#' maximum number of components that a group is broken into. +#' This returns 1 if each group is connected. #' +#' +#' @param adj adjacency list +#' @param group array of group identifiers. Typically district numbers or county names. +#' Defaults to 1 if no input is provided, checking that the adjacency list itself is +#' one connected component. +#' #' @return tibble with contiguity indicators. Each row is the units of `adj`. Columns include #' - `group` Values of the inputted `group` argument. If `group` is not specified, then all values #' will be 1. @@ -20,8 +45,12 @@ #' @examples #' data(checkerboard) #' adj <- adjacency(checkerboard) +#' # These each indicate the graph is connected. #' check_contiguity(adj) # all contiguous #' # If there are two discontiguous groups, there will be 2 values of `component` +#' cct(adj) +#' ccm(adj) +#' check_contiguity <- function(adj, group) { if (missing(adj)) { cli::cli_abort('Please provide an argument to {.arg adj}.') @@ -30,36 +59,45 @@ check_contiguity <- function(adj, group) { if (length(adj) != length(group)) { cli::cli_abort('{.arg adj} and {.arg group} are different lengths.') } - groups <- rep(0, length(group)) sorted <- sort(unique(group)) - for (i in 1:length(group)) { - groups[i] <- which(sorted == group[i]) - } + groups <- match(group, sorted) } else { group <- 1L groups <- rep(1L, length(adj)) } - out <- tibble(group = group, - group_number = groups, - component = contiguity(adj, groups)) - + out <- tibble( + group = group, + group_number = groups, + component = contiguity(adj, groups - 1L) + ) + if (max(out$component) == 1) { return(out) } else { out <- out %>% dplyr::group_by(.data$group_number) %>% - dplyr::mutate(ranks = list(as.numeric(names(sort(table(component), - decreasing = TRUE))))) %>% - dplyr::rowwise() %>% - dplyr::mutate(component = which(component == .data$ranks)) %>% - dplyr::ungroup() %>% - dplyr::select(-.data$ranks) + dplyr::mutate( + component = match(component, as.numeric(names(sort(table(component), decreasing = TRUE)))) + ) %>% + dplyr::ungroup() } out } +#' @rdname check_contiguity +#' @export +cct <- function(adj, group) { + table(check_contiguity(adj = adj, group = group)$component) +} + +#' @rdname check_contiguity +#' @export +ccm <- function(adj, group) { + max(check_contiguity(adj = adj, group = group)$component) +} + #' Check Polygon Contiguity #' @@ -92,7 +130,7 @@ check_polygon_contiguity <- function(shp, group, epsg = 3857) { } shp <- make_planar_pair(x = shp, epsg = 3857)$x - + shp <- shp %>% dplyr::select({{ group }}) %>% sf::st_cast('POLYGON') %>% @@ -128,7 +166,7 @@ check_polygon_contiguity <- function(shp, group, epsg = 3857) { #' checkerboard <- checkerboard %>% filter(i != 1, j != 1) #' adj <- adjacency(checkerboard) #' suggest_component_connection(checkerboard, adj) -#' +#' suggest_component_connection <- function(shp, adj, group, epsg = 3857) { if (missing(shp)) { cli::cli_abort('Please provide an argument to {.arg shp}') @@ -155,15 +193,16 @@ suggest_component_connection <- function(shp, adj, group, epsg = 3857) { tempy <- cents[group == g & components$component != c, ] dists <- dist_mat_geos(x = tempx, y = tempy) prop <- arrayInd(which.min(dists), dim(dists)) - out <- out %>% - dplyr::bind_rows(tibble(x = tempx$rownum[prop[1, 1]], - y = tempy$rownum[prop[1, 2]]) - ) + out <- out %>% + dplyr::bind_rows(tibble( + x = tempx$rownum[prop[1, 1]], + y = tempy$rownum[prop[1, 2]] + )) } } } - for (i in 1:nrow(out)) { + for (i in seq_len(nrow(out))) { if (out[i, 1] > out[i, 2]) { temp <- out[i, 1] out[i, 1] <- out[i, 2] diff --git a/R/count_connections.R b/R/count_connections.R index 4559bfe..72798dc 100644 --- a/R/count_connections.R +++ b/R/count_connections.R @@ -19,6 +19,6 @@ count_connections <- function(dm, normalize = FALSE) { mat <- mat / ncol(dm) } - tidyr::expand_grid(x = 1:nrow(dm), y = 1:nrow(dm)) %>% + tidyr::expand_grid(x = 1:nrow(dm), y = 1:nrow(dm)) %>% dplyr::mutate(fill = c(mat)) } diff --git a/R/data.R b/R/data.R index c06d1c5..9a6b16f 100644 --- a/R/data.R +++ b/R/data.R @@ -143,7 +143,7 @@ NULL #' This data contains the blocks for Henrico County, VA with geographies simplified #' to allow for better examples. #' -#' va_vtd <- tigris::voting_districts(state = 'VA') %>% filter(COUNTYFP10 == '087') +#' va_vtd <- tinytiger::tt_voting_districts(state = 'VA', county = '087', year = 2010) #' va_vtd <- rmapshaper::ms_simplify(va_vtd, keep_shapes = TRUE) #' #' @name va_vtd diff --git a/R/datatables.R b/R/datatables.R index 189d5e0..efc037e 100644 --- a/R/datatables.R +++ b/R/datatables.R @@ -9,7 +9,6 @@ #' @param year year, must be 2000, 2010, or 2020 #' @param mem Default is FALSE. Set TRUE to use memoized backend. #' @templateVar epsg TRUE -#' @param geography Deprecated. Use geometry. #' @template template #' #' @return dataframe with data for each block in the selected region. Data includes @@ -23,13 +22,8 @@ #' # uses the Census API #' create_block_table(state = 'NY', county = 'Rockland', geometry = FALSE) #' } -create_block_table <- function(state, county = NULL, geometry = TRUE, year = 2020, - mem = FALSE, epsg = 3857, geography) { - if (!missing(geography)) { - .Deprecated('geometry', msg = 'Use `geometry` rather than `geography`.') - geometry <- geography - } - +create_block_table <- function(state, county = NULL, geometry = TRUE, year = 2020, + mem = FALSE, epsg = 3857) { statepo <- censable::match_abb(state) if (length(statepo) == 0) { @@ -51,7 +45,7 @@ create_block_table <- function(state, county = NULL, geometry = TRUE, year = 202 geometry = geometry, year = year, groups = 'all' ) } - + if (geometry) { out <- make_planar_pair(out, epsg = epsg)$x } @@ -68,7 +62,6 @@ create_block_table <- function(state, county = NULL, geometry = TRUE, year = 202 #' @param year year, must be >= 2009 and <= 2019. #' @param mem Default is FALSE. Set TRUE to use memoized backend. #' @templateVar epsg TRUE -#' @param geography Deprecated. Use geometry. #' @template template #' #' @return dataframe with data for each tract in the selected region. Data includes @@ -82,12 +75,7 @@ create_block_table <- function(state, county = NULL, geometry = TRUE, year = 202 #' tract <- create_tract_table('NY', 'Rockland', year = 2018) #' } create_tract_table <- function(state, county, geometry = TRUE, year = 2019, - mem = FALSE, epsg = 3857, geography) { - if (!missing(geography)) { - .Deprecated('geometry', msg = 'Use `geometry` rather than `geography`.') - geometry <- geography - } - + mem = FALSE, epsg = 3857) { statepo <- censable::match_abb(state) if (length(statepo) == 0) { @@ -109,7 +97,7 @@ create_tract_table <- function(state, county, geometry = TRUE, year = 2019, geometry = geometry, year = year, groups = 'all' ) } - + if (geometry) { out <- make_planar_pair(out, epsg = epsg)$x } @@ -125,7 +113,7 @@ create_tract_table <- function(state, county, geometry = TRUE, year = 2019, #' @param block_table Required. Block table output from create_block_table #' @param matches Required. Grouping variable to aggregate up by, typically made with geo_match #' @param geometry Boolean. Whether to keep geometry or not. -#' +#' #' @return dataframe with length(unique(matches)) rows #' @export #' @concept datatable @@ -134,7 +122,7 @@ create_tract_table <- function(state, county, geometry = TRUE, year = 2019, #' data(rockland) #' rockland$id <- sample(1:2, nrow(rockland), TRUE) #' block2prec(rockland, rockland$id) -#' +#' block2prec <- function(block_table, matches, geometry = FALSE) { if (missing(block_table)) { cli::cli_abort('Please provide an argument to {.arg block_table}.') @@ -142,7 +130,7 @@ block2prec <- function(block_table, matches, geometry = FALSE) { if (missing(matches)) { cli::cli_abort('Please provide an argument to {.arg matches}.') } - + block_table <- block_table %>% mutate(matches_id = matches) if (!geometry) { @@ -240,11 +228,11 @@ block2prec_by_county <- function(block_table, precinct, precinct_county_fips, ep matches <- geo_match(from = bsub, to = psub, epsg = FALSE) prectemp <- block2prec(bsub, matches = matches) - prectemp <- prectemp %>% - dplyr::left_join(y = psub %>% sf::st_drop_geometry() %>% - dplyr::select(rowid, matches_id), by = 'matches_id') + prectemp <- prectemp %>% + dplyr::left_join(y = psub %>% sf::st_drop_geometry() %>% + dplyr::select(rowid, matches_id), by = 'matches_id') - prectb <- prectb %>% + prectb <- prectb %>% dplyr::bind_rows(prectemp) } @@ -286,7 +274,7 @@ update_tb <- function(ret, missed) { if (ncol(expected) == 0) { return(ret) } - + dplyr::rows_patch(x = ret, y = expected, by = 'matches_id') } diff --git a/R/dra.R b/R/dra.R index 3b9fc4d..46c38b1 100644 --- a/R/dra.R +++ b/R/dra.R @@ -18,7 +18,6 @@ #' blocklevel <- dra2r('dra_utah_test.csv', state = 'UT') #' } dra2r <- function(dra, state, precincts, epsg = 3857) { - # check inputs if (missing(dra)) { cli::cli_abort('Please provide an argument to {.arg dra}.') @@ -29,7 +28,6 @@ dra2r <- function(dra, state, precincts, epsg = 3857) { # make dra into a dataframe if ('character' %in% class(dra)) { - # check that it's pointing to a good thing: if (!file.exists(dra)) { cli::cli_abort('{.arg dra} supplied as character, but does not point to a valid file.') @@ -59,7 +57,7 @@ dra2r <- function(dra, state, precincts, epsg = 3857) { dra <- dra %>% dplyr::rename(District_DRA = District) # get the block file to match it to - shp <- tigris::blocks(state, year = 2020) + shp <- tinytiger::tt_blocks(state, year = 2020) # join them together shp <- shp %>% dplyr::left_join(dra, by = 'GEOID20') @@ -117,34 +115,33 @@ dra2r <- function(dra, state, precincts, epsg = 3857) { #' @concept dra #' @examples \dontrun{ #' # Needs Census Bureau API -#' cd <- tigris::congressional_districts() %>% filter(STATEFP == '49') -#' cnty <- tigris::counties(state = 49) +#' cd <- tinytiger::tt_congressional_districts() %>% filter(STATEFP == '49') +#' cnty <- tinytiger::tt_counties(state = 49) #' matchedcty <- geo_match(from = cnty, to = cd) #' # use counties as precincts and let the plan be their center match: #' r2dra(cnty, matchedcty, 'UT', 'r2dra_ex.csv') #' } r2dra <- function(precincts, plan, state, path, epsg = 3857) { - if (missing(precincts)) { cli::cli_abort('{.arg precincts} is a required input.') } if (!'sf' %in% class(precincts)) { cli::cli_abort('{.arg precincts} must be an sf dataframe') } - + if (missing(plan)) { cli::cli_abort('{.arg plan} is a required input.') } if ('character' %in% class(plan)) { plan <- precincts[[plan]] } - + if (missing(state)) { cli::cli_abort('{.arg state} is a required input.') } - - shp <- tigris::blocks(state, year = 2020) - + + shp <- tinytiger::tt_blocks(state, year = 2020) + pairs <- make_planar_pair(precincts, shp) precincts <- pairs$x shp <- pairs$y diff --git a/R/dra_vtd.R b/R/dra_vtd.R new file mode 100644 index 0000000..cee9784 --- /dev/null +++ b/R/dra_vtd.R @@ -0,0 +1,166 @@ +#' Get Dave's Redistricting App Dataset +#' +#' Gets a dataset from Dave's Redistricting App. +#' +#' See the full available data at . +#' +#' +#' @param state two letter state abbreviation +#' @param year year to get data for. Either `2020` or `2010` +#' @param geometry Default is TRUE. Add geometry to the data? +#' @param clean_names Clean names. Default is \code{TRUE}. If \code{FALSE}, +#' returns default names. +#' @param epsg `r roxy_epsg()` +#' +#' @return tibble with election data and optional geometry +#' @export +#' +#' @concept datasets +#' @examples +#' ak <- get_dra('AK', geometry = FALSE) +get_dra <- function(state, year = 2020, geometry = TRUE, clean_names = TRUE, epsg = 3857) { + cli::cli_inform( + 'Data sourced from Dave\'s Redistricting {.url https://github.com/dra2020/vtd_data}.', + .frequency = 'once', + .frequency_id = 'cite_dra' + ) + + base_path <- stringr::str_glue( + 'https://raw.githubusercontent.com/dra2020/vtd_data/master/{year}_VTD/' + ) + state <- toupper(censable::match_abb(state)) + block_group_states_2020 <- c('CA', 'HI', 'OR', 'WV') + # ME 2020 needs to be vtd + cousubs... + block_group_states_2010 <- c('CA', 'MT', 'OR', 'RI') + if (year == 2020) { + spec <- readr::cols(GEOID20 = 'c', .default = 'd') + } else { + spec <- readr::cols(GEOID10 = 'c', .default = 'd') + } + end_path <- stringr::str_glue('{state}/{year}_election_{state}.csv') + + tb <- readr::read_csv( + file = paste0(base_path, end_path), col_types = spec, + show_col_types = FALSE + ) %>% + dplyr::rename_with(.fn = \(x) stringr::str_remove_all(x, pattern = '\\d+'), .cols = dplyr::starts_with('GEOID')) + + if (geometry) { + if ((year == 2020 && !state %in% block_group_states_2020 && state != 'ME') || + (year == 2010 && !state %in% block_group_states_2010)) { + # regular vtds + geo <- tinytiger::tt_voting_districts(state = state, year = year) %>% + dplyr::select(dplyr::any_of(c(GEOID = 'GEOID10', GEOID = 'GEOID20')), 'geometry') %>% + dplyr::mutate(dplyr::across('GEOID', as.character)) + } else { + if (year == 2020 && state == 'ME') { + # frankenstein's vtds + geo_a <- tinytiger::tt_voting_districts(state = state, year = year) %>% + dplyr::select(dplyr::any_of(c(GEOID = 'GEOID20', county = 'COUNTYFP20')), 'geometry') %>% + dplyr::mutate(dplyr::across('GEOID', as.character)) + geo_b <- tinytiger::tt_county_subdivisions(state = state, year = year) %>% + dplyr::select(dplyr::any_of(c('GEOID', county = 'COUNTYFP')), 'geometry') %>% + dplyr::mutate(dplyr::across('GEOID', as.character)) + geo <- dplyr::bind_rows( + geo_a, geo_b %>% dplyr::filter(!.data$county %in% geo_a$county) + ) + } else { + # block groups + geo <- tinytiger::tt_block_groups(state = state, year = year) %>% + dplyr::select(dplyr::any_of(c(GEOID = 'GEOID10', GEOID = 'GEOID20')), 'geometry') %>% + dplyr::mutate(dplyr::across('GEOID', as.character)) + } + } + tb <- tb %>% + dplyr::left_join(geo, by = 'GEOID') %>% + dplyr::relocate('GEOID', .before = dplyr::everything()) %>% + sf::st_as_sf() + + tb <- make_planar_pair(tb, epsg = epsg)$x + } + + if (clean_names) { + tb <- clean_dra(tb) + } + + tb +} + +#' Clean DRA Names +#' +#' @param data sf tibble from DRA +#' +#' @return data with cleaned names +#' @noRd +clean_dra <- function(data) { + noms <- names(data) + + gen <- grep('[0-9]{4}', noms, value = FALSE) # General + run <- which(stringr::str_ends(string = noms, 'roff')) # Runoff; necessary for LA/GA/etc + spe <- which(stringr::str_ends(string = noms, 'spec')) # Special + # spr <- which(stringr::str_ends(string = noms, 'sproff')) + + + for (i in seq_along(gen)) { + off <- dra_office[tolower(stringr::word(noms[gen[i]], 3, sep = stringr::fixed('_')))] + yr <- stringr::str_sub(stringr::str_extract(noms[gen[i]], '\\d+'), start = -2L) + party <- dra_party(noms[gen[i]]) + noms[gen[i]] <- stringr::str_glue('{off}_{yr}_{party}') + } + + for (i in seq_along(run)) { + off <- dra_office[tolower(stringr::word(noms[gen[i]], 3, sep = stringr::fixed('_')))] + yr <- paste0('r', stringr::str_sub(stringr::str_extract(noms[gen[i]], '\\d+'), start = -2L)) + party <- dra_party(noms[gen[i]]) + noms[run[i]] <- stringr::str_glue('{off}_{yr}_{party}') + } + + for (i in seq_along(spe)) { + off <- dra_office[tolower(stringr::word(noms[gen[i]], 3, sep = stringr::fixed('_')))] + yr <- paste0('s', stringr::str_sub(stringr::str_extract(noms[gen[i]], '\\d+'), start = -2L)) + party <- dra_party(noms[gen[i]]) + noms[run[i]] <- stringr::str_glue('{off}_{yr}_{party}') + } + + # for (i in seq_along(spr)) { + # off <- dra_office[tolower(stringr::word(noms[gen[i]], 3, sep = stringr::fixed('_')))] + # yr <- paste0('s', stringr::str_sub(stringr::str_extract(noms[gen[i]], '\\d+'), start = -2L)) + # party <- dra_party(noms[gen[i]]) + # noms[run[i]] <- stringr::str_glue('{off}_{yr}_{party}') + # } + + names(data) <- noms + + data +} + +#' DRA Parties +#' @keywords internal +#' @noRd +dra_party <- function(str) { + p <- stringr::word(str, sep = stringr::fixed('_')) + if (p %in% c('R', 'Rep')) { + p <- 'rep' + } else if (p %in% c('D', 'Dem')) { + p <- 'dem' + } else if (p == 'Tot') { + p <- 'tot' + } else { + p <- 'unk' + } + + p +} + +#' DRA Offices +#' @keywords internal +#' @noRd +dra_office <- tibble::tribble( + ~dra, ~alarm, + 'gov', 'gov', + 'ag', 'atg', + 'ltg', 'ltg', + 'pres', 'pre', + 'sen', 'uss' +) %>% + tibble::deframe() diff --git a/R/estimate.R b/R/estimate.R index b4ce7a0..54fb4af 100644 --- a/R/estimate.R +++ b/R/estimate.R @@ -210,7 +210,7 @@ estimate_up <- function(value, group) { if (nrow(tb) < max(group)) { for (i in 1:max(group)) { if (tb$group[i] != i) { - tb <- tb %>% + tb <- tb %>% dplyr::add_row(group = i, value = 0, .after = (i - 1)) } } diff --git a/R/filter.R b/R/filter.R index 8e810ca..3773d92 100644 --- a/R/filter.R +++ b/R/filter.R @@ -1,4 +1,3 @@ - #' Filter to Intersecting Pieces #' #' @param from Required. sf dataframe. the geography to subset @@ -12,24 +11,26 @@ #' #' @concept datatable #' -#' @examples +#' @examples #' \dontrun{ #' # Needs Census Bureau API #' data(towns) #' block <- create_block_table('NY', 'Rockland') #' geo_filter(block, towns) #' } -#' +#' #' data(towns) #' data(rockland) #' sub <- geo_filter(rockland, towns) -#' +#' geo_filter <- function(from, to, bool = FALSE, epsg = 3857) { pairs <- make_planar_pair(from, to, epsg = epsg) from <- pairs$x to <- pairs$y - ints <- geos::geos_intersects(from, - geos::geos_unary_union(geos::geos_make_collection(to))) + ints <- geos::geos_intersects( + from, + geos::geos_unary_union(geos::geos_make_collection(to)) + ) if (bool) { return(ints) @@ -43,11 +44,11 @@ geo_filter <- function(from, to, bool = FALSE, epsg = 3857) { #' #' @param from Required. sf dataframe. the geography to subset #' @param to Required. sf dataframe. the geography that from must intersect -#' @param thresh Percent as decimal of an area to trim away. Default is .01, which is 1\%. +#' @param thresh Percent as decimal of an area to trim away. Default is .01, which is 1%. #' @param bool Optional, defaults to FALSE. Should this just return a logical vector? #' @templateVar epsg TRUE #' @template template -#' +#' #' @return sf data frame or logical vector if bool=TRUE #' @export #' @@ -63,18 +64,18 @@ geo_filter <- function(from, to, bool = FALSE, epsg = 3857) { #' data(rockland) #' sub <- geo_filter(rockland, towns) #' rem <- geo_trim(sub, towns, thresh = 0.05) -#' +#' geo_trim <- function(from, to, thresh = 0.01, bool = FALSE, epsg = 3857) { pairs <- make_planar_pair(from, to, epsg = epsg) from <- pairs$x to <- pairs$y - + ints <- geos::geos_intersection(from, geos::geos_unary_union(geos::geos_make_collection(to))) area <- geos::geos_area(from) areaints <- rep(0, nrow(from)) areaints <- geos::geos_area(geos::geos_make_valid(ints)) # , NA_on_exception = TRUE in valid keep <- as.numeric(areaints / area) > thresh - + keep[is.na(keep)] <- FALSE if (bool) { diff --git a/R/geary.R b/R/geary.R index a382645..387e634 100644 --- a/R/geary.R +++ b/R/geary.R @@ -37,7 +37,7 @@ local_gearys <- function(shp, adj, wts, spatial_mat, epsg = 3857) { cli::cli_abort('wts and spatial_mat have different lengths.') } } - + tibble(geary = localgeary(wts, mat)) } diff --git a/R/geomander-package.R b/R/geomander-package.R index 8026e61..ba8d093 100644 --- a/R/geomander-package.R +++ b/R/geomander-package.R @@ -4,7 +4,7 @@ ## usethis namespace: end NULL -#' @importFrom sf st_geometry<- +#' @importFrom sf st_geometry<- #' @importFrom dplyr bind_rows row_number distinct filter mutate summarize arrange #' @importFrom dplyr select all_of any_of left_join .data #' @importFrom dplyr rename starts_with n desc bind_cols @@ -14,6 +14,8 @@ NULL #' @importFrom tidyr pivot_wider #' @importFrom stringr str_detect #' @importFrom readr read_csv write_csv +#' @importFrom rlang .env .data := +#' @importFrom Rcpp evalCpp NULL -globalVariables(c('.')) \ No newline at end of file +globalVariables(c('.')) diff --git a/R/geos_helpers.R b/R/geos_helpers.R index 1d62ac6..35754d5 100644 --- a/R/geos_helpers.R +++ b/R/geos_helpers.R @@ -2,7 +2,7 @@ largest_intersection_geos <- function(x, y) { l <- geos::geos_intersects_matrix(x, y) a <- lapply(seq_along(l), function(i) { - geos::geos_area(geos::geos_intersection(x[[i]], y[[l[[i]]]])) + geos::geos_area(geos::geos_intersection(x[[i]], y[[l[[i]]]])) }) vapply(seq_along(l), function(i) { @@ -16,17 +16,19 @@ largest_intersection_geos <- function(x, y) { area_intersection_geos <- function(x, y) { l <- geos::geos_intersects_matrix(x, y) - + a <- lapply(seq_along(l), function(i) { - geos::geos_area(geos::geos_intersection(x[[i]], y[[l[[i]]]])) / geos::geos_area(y[[l[[i]]]]) + geos::geos_area(geos::geos_intersection(x[[i]], y[[l[[i]]]])) / geos::geos_area(y[[l[[i]]]]) }) - - lapply(seq_along(a), - function(i){ - x <- a[[i]] - names(x) <- as.character(l[[i]]) - x - }) + + lapply( + seq_along(a), + function(i) { + x <- a[[i]] + names(x) <- as.character(l[[i]]) + x + } + ) } nn_geos <- function(x, y, k = 1) { @@ -36,15 +38,15 @@ nn_geos <- function(x, y, k = 1) { dist_mat_geos <- function(x, y) { out <- matrix(0, nrow(x), nrow(y)) - + x <- geos::geos_centroid(x) y <- geos::geos_centroid(y) - - + + for (i in seq_along(x)) { out[i, ] <- geos::geos_distance(x[[i]], y) } - + out } @@ -53,14 +55,15 @@ bbox_geos <- function(x) { } adj_geos <- function(shp) { - shp <- geos::as_geos_geometry(shp) nby <- geos::geos_strtree_query(geos::geos_strtree(shp), shp) - - lapply(seq_len(length(shp)), - function(i) { - x <- geos::geos_relate(shp[[i]], shp[[nby[[i]]]]) - nby[[i]][geos::geos_relate_pattern_match(x, 'F***1****') | - geos::geos_relate_pattern_match(x, '2121**2*2')] - 1L - }) -} \ No newline at end of file + + lapply( + seq_len(length(shp)), + function(i) { + x <- geos::geos_relate(shp[[i]], shp[[nby[[i]]]]) + nby[[i]][geos::geos_relate_pattern_match(x, 'F***1****') | + geos::geos_relate_pattern_match(x, '2121**2*2')] - 1L + } + ) +} diff --git a/R/gstar.R b/R/gstar.R index 76707b3..64ff251 100644 --- a/R/gstar.R +++ b/R/gstar.R @@ -39,6 +39,6 @@ gstar_i <- function(shp, adj, wts, spatial_mat, epsg = 3857) { cli::cli_abort('wts and spatial_mat have different lengths.') } } - + localgstar(wts, mat) } diff --git a/R/heda.R b/R/heda.R new file mode 100644 index 0000000..ea4cc6a --- /dev/null +++ b/R/heda.R @@ -0,0 +1,495 @@ +# Notes on HEDA files +# +# +# - CT: Registration counts for Connecticut, as of 2008 + + +#' Get Harvard Election Data Archive ("HEDA") Dataset +#' +#' @param state two letter state abbreviation +#' @param path folder to put shape in. Default is \code{tempdir()} +#' @param epsg `r roxy_epsg()` +#' @param ... additional arguments passed to [sf::read_sf()] +#' +#' @return sf tibble +#' @export +#' +#' @concept datasets +#' @examplesIf Sys.getenv('DATAVERSE_KEY') != '' +#' shp <- get_heda('ND') +get_heda <- function(state, path = tempdir(), epsg = 3857, ...) { + clean_names <- FALSE + abb <- tolower(censable::match_abb(state)) + + match.arg(abb, choices = heda_states()) + + cli::cli_inform( + 'Data sourced from the Harvard Election Data Archive {.url https://projects.iq.harvard.edu/eda/home}.', + .frequency = 'once', + .frequency_id = 'cite_heda' + ) + + if (abb == 'ca') { + # CA = block level; return tract level + file_name <- heda_files[heda_files$state == abb, ]$files[[1]] + doi <- heda_doi()[abb] + x <- dataverse::get_dataframe_by_name(filename = file_name, dataset = doi) + x <- x %>% + dplyr::mutate(GEOID = stringr::str_sub(.data$geoid10, 1, 11)) %>% + dplyr::group_by(.data$GEOID) %>% + dplyr::summarise(dplyr::across(where(is.numeric), function(x) sum(x, na.rm = TRUE))) + + tr <- tinytiger::tt_tracts('CA', year = 2010) %>% + dplyr::select(dplyr::all_of( + c(GEOID = 'GEOID10', state = 'STATEFP10', county = 'COUNTYFP10', tract = 'TRACTCE10') + )) + + out <- dplyr::left_join(x, tr, by = 'GEOID') %>% + sf::st_as_sf() + } else if (abb %in% c('oh', 'mn', 'il')) { + # mn, oh, il = no zip file + file_names <- heda_files[heda_files$state == abb, ]$files[[1]] # multiple! + doi <- heda_doi()[abb] + up_path <- Filter(function(f) stringr::str_detect(f, 'shp'), file_names)[1] + + lapply(file_names, function(file_name) { + exten <- stringr::word(file_name, start = -1L, sep = stringr::fixed('.')) + tf <- tempfile(fileext = paste0('.', exten)) + dataverse::get_file_by_name( + filename = file_name, dataset = doi, + server = 'dataverse.harvard.edu' + ) %>% + writeBin(con = tf) + file.rename(from = tf, to = paste0(tempdir(), '/', file_name)) + }) + + out <- sf::read_sf(dsn = paste0(path, '/', up_path), ...) + } else { + if (abb %in% c('ga', 'va')) { + restore_shx <- Sys.getenv('SHAPE_RESTORE_SHX') + Sys.setenv(SHAPE_RESTORE_SHX = 'YES') + on.exit({ + Sys.setenv(SHAPE_RESTORE_SHX = restore_shx) + }) + } + file_name <- heda_files[heda_files$state == abb, ]$files[[1]] + doi <- heda_doi()[abb] + + tf <- tempfile(fileext = '.zip') + x <- dataverse::get_file_by_name( + filename = file_name, dataset = doi, + server = 'dataverse.harvard.edu' + ) %>% + writeBin(con = tf) + poss <- utils::unzip(tf, list = TRUE) + poss <- dplyr::filter( + poss, !stringr::str_detect(.data$Name, 'MACOSX'), + stringr::str_detect(.data$Name, '.shp') + ) + utils::unzip(tf, exdir = path) + up_path <- poss$Name[1] + if (abb == 'va') { + file.rename(paste0(path, '/', up_path), to = paste0(path, '/', stringr::str_sub(up_path, end = -12))) + up_path <- stringr::str_sub(up_path, end = -12) + } + + out <- sf::read_sf(dsn = paste0(path, '/', up_path), ...) + } + + # unless stated, they seem to use 4140 + if (is.na(sf::st_crs(out))) { + sf::st_crs(out) <- 4140 + } + + if (clean_names) { + if (state %in% c('ny')) { + out <- clean_heda(out, state) + } else { + out <- clean_heda(out) + } + } + + make_planar_pair(out, epsg = epsg)$x +} + + +#' Clean HEDA Names +#' +#' @param data sf tibble from HEDA +#' @param state bypass regular path with state specific changes +#' +#' @return data with cleaned names +#' @noRd +clean_heda <- function(data, state) { + # custom: az ny co fl + # auto: ak al ca de ct + # todo: ga hi ia id il in ks la ma md mi mn mo ms nc nd ne nh nj nm nv oh ok pa sc sd tn tx vt wa wi wy + if (missing(state)) { + # normal track + data <- data %>% + dplyr::select( + -dplyr::ends_with('_1'), + -dplyr::any_of(c( + 'VTDI10', 'NAME10', 'NAMELSAD10', 'LSAD10', + 'MTFCC10', 'FUNCSTAT10', 'ALAND10', + 'AWATER10', 'INTPTLAT10', 'INTPTLON10' + )) + ) + + data <- data %>% + dplyr::rename( + dplyr::any_of( + c( + GEOID = 'GEOID10', state = 'STATEFP10', county = 'COUNTYFP10', + tract = 'TRACTCE10', vtd = 'VTDST10', precinct = 'PRECINCT', + county = 'CNTYKEY', vtd = 'VTDKEY' + ) + ) + ) %>% + dplyr::select( + dplyr::any_of(c('GEOID', 'state', 'county', 'tract', 'vtd', 'precinct')), + dplyr::ends_with(c( + '_00', '_01', '_02', '_03', '_04', '_05', '_06', '_07', '_08', + '_09', '_10', '_11', '_12', '_13', '_14', '_votes' + )), + dplyr::any_of(c('NDV', 'NRV', ndv = 'NV_D', nrv = 'NV_R')) + ) %>% + dplyr::select(-dplyr::matches('^[a-zA-Z]{3}_\\d{2}$')) %>% + dplyr::select(-dplyr::matches('^[a-zA-Z]{1}_\\d{2}$')) %>% + dplyr::rename_with(.fn = stringr::str_to_lower, .cols = -dplyr::any_of('GEOID')) %>% + dplyr::rename_with(.fn = function(x) stringr::str_replace(string = x, pattern = '_tot_', '_')) %>% + dplyr::select(-dplyr::contains('_reg_'), -dplyr::ends_with('_pct')) %>% + dplyr::rename_with(.fn = \(x) stringr::str_remove(x, pattern = '_votes'), dplyr::ends_with('_votes')) %>% + dplyr::rename_with(.fn = \(x) stringr::str_replace(x, '_20', '_'), dplyr::matches('\\d{4}')) + + noms <- names(data) + elec <- which(stringr::str_count(string = noms, '_') == 2) + if (length(elec) > 0 && stringr::str_sub(noms[elec[1]], 1, 3) %in% c('dem', 'rep')) { + for (i in seq_along(elec)) { + party <- stringr::str_sub(noms[elec[i]], 1, 3) + yr <- stringr::str_extract(noms[elec[i]], '\\d+') + off <- stringr::str_sub(noms[elec[i]], 5, 7) + off <- ifelse( + is.na(heda_abb_from_alarm[off]), + off, + heda_abb_from_alarm[off] + ) + noms[elec[i]] <- stringr::str_glue('{off}_{yr}_{party}') + } + } else { + for (i in seq_along(elec)) { + off <- stringr::str_sub(stringr::str_extract(noms[elec[i]], '^(.+?)_'), end = -2L) + off <- ifelse( + is.na(heda_abb_from_alarm[off]), + off, + heda_abb_from_alarm[off] + ) + + yr <- stringr::str_extract(noms[elec[i]], '\\d+') + party <- heda_party(noms[elec[i]]) + noms[elec[i]] <- stringr::str_glue('{off}_{yr}_{party}') + } + } + + names(data) <- noms + } else { + if (state == 'ny') { + data <- data %>% + dplyr::select( + c( + GEOID = 'GEOID10', state = 'STATEFP10', county = 'COUNTYFP10', vtd = 'VTDST10', + elect_id = 'ELECT_ID', gov_10_dem = 'GOV_DVOTE_', gov_10_rep = 'GOV_RVOTE_', + com_10_dem = 'COMP_DVOTE', com_10_rep = 'COMP_RVOTE', + atg_10_dem = 'AG_DVOTE_1', atg_10_rep = 'AG_RVOTE_1', + uss_10_dem_gil = 'USS_2_DVOT', uss_10_rep_dio = 'USS_2_RVOT', + uss_10_dem_sch = 'USS_6_DVOT', uss_10_rep_tow = 'USS_6_RVOT', + ndv = 'NDV', nrv = 'NRV', 'geometry' + ) + ) + } else if (state == 'az') { + data <- data %>% + dplyr::select( + c( + GEOID = 'GEOID10', state = 'STATEFP10', county = 'COUNTYFP10', vtd = 'VTDST10', + pre_08_rep = 'PRS08_REP', pre_08_dem = 'PRS08_DEM', pre_08_oth = 'PRS08_OTH', + gov_10_dem = 'GOV10_DEM', gov_10_rep = 'GOV10_REP', gov_10_oth = 'GOV10_OTH', + sos_10_dem = 'SOS_10DEM', sos_10_rep = 'SOS_10REP', sos_10_oth = 'SOS_10OTH', + atg_10_dem = 'AG10_DEM', atg_10_rep = 'AG10_REP', atg_10_oth = 'AG1_0OTH', + tre_10_dem = 'ST10_DEM', tre_10_rep = 'ST10_REP', tre_10_oth = 'ST10_OTH', + spi_10_dem = 'SPI10_DEM', spi_10_rep = 'SPI10_REP', spi_10_oth = 'SPI10_OTH', + uss_10_dem = 'USSEN10_DE', uss_10_rep = 'USSEN10_RE', uss_10_oth = 'USSEN10_OT', + ndv = 'NDV', nrv = 'NRV', 'geometry' + ) + ) + } else if (state == 'co') { + data <- data %>% + dplyr::select( + c( + c( + GEOID = 'GEOID10', state = 'STATEFP10', county = 'COUNTYFP10', vtd = 'VTDST10', + pre_08_dem = 'PRES08__D', pre_08_rep = 'PRES08__R', pre_08_oth = 'PRES08_MP', + uss_08_dem = 'USSEN08_D', uss_08_rep = 'USSEN08_R', uss_08_oth = 'USSEN08_MP', + ush_08_rep = 'USHSE08_R', ush_08_dem = 'USHSE08_D', + rgn_08_dem = 'RGNT08_D', rgn_08_rep = 'RGNT08_R', + sbe_08_dem = 'SBE08_D', sbe_08_rep = 'SBE08_R', + ssd_08_rep = 'SD08_R', ssd_08_dem = 'SD08_D', + shd_08_dem = 'HD08_D', shd_08_rep = 'HD08_R', + uss_10_rep = 'USSEN10R', uss_10_dem = 'USSEN10D', uss_10_oth = 'USSEN10MP', + gov_10_rep = 'GOV10R', gov_10_dem = 'GOV10D', gov_10_oth = 'GOVMP', + sos_10_rep = 'SOS10R', sos_10_dem = 'SOS10D', sos_10_oth = 'SOS10MP', + atg_10_rep = 'AG10R', atg_10_dem = 'AG10D', + tre_10_rep = 'TRE10R', tre_10_dem = 'TRE10D', + rgl_10_rep = 'RGNT10LRGR', rgl_10_dem = 'RGNT10LRGD', rgl_10_oth = 'RGNT10LRGM', + ush_10_rep = 'USHSE10R', ush_10_dem = 'USHSE10D', ush_10_oth = 'USHSE10MP', + rgn_10_rep = 'RGNT10R', rgn_10_dem = 'RGNT10_D', + boe_10_rep = 'SBE10R', boe_10_dem = 'SBE10D', + ssd_10_rep = 'SD10_R', ssd_10_dem = 'SD10_D', + shd_10_dem = 'HD10_D', shd_10_rep = 'HD10_R', + ndv = 'NDV', nrv = 'NRV', 'geometry' + ) + ) + ) + } else if (state == 'fl') { + data <- data %>% + dplyr::select( + c( + county = 'COUNTY', vtd = 'precinct', + gov_10_dem_sin = 'GOV_D_SINK', gov_10_rep_sco = 'GOV_R_SCOT', gov_10_oth_all = 'GOV_NPA_AL', + gov_10_oth_art = 'GOV_NPA_AR', gov_10_oth_imp = 'GOV_NPA_IM', gov_10_oth_kha = 'GOV_NPA_KH', + gov_10_oth_ree = 'GOV_NPA_RE', + cfo_10_dem_aus = 'CFO_D_AUSL', cfo_10_rep_atw = 'CFO_R_ATWA', cfo_10_oth_maz = 'CFO_NPA_MA', + cfo_10_oth_ste = 'CFO_NPA_ST', + atg_10_dem_gel = 'AG_D_GELBE', atg_10_rep_bon = 'AG_R_BONDI', + atg_10_oth_lew = 'AG_NPA_LEW', + agc_10_dem_mad = 'AGC_D_MADD', agc_10_rep_put = 'AGC_R_PUTN', + agc_10_tea_che = 'AGC_TEA_CH', agc_10_oth_ham = 'AGC_NPA_HA', + uss_10_dem_mee = 'SEN_D_MEEK', uss_10_rep_rub = 'SEN_R_RUBI', uss_10_oth_arm = 'SEN_NPA_AR', + uss_10_oth_ask = 'SEN_NPA_AS', uss_10_oth_dec = 'SEN_NPA_DE', uss_10_oth_cri = 'SEN_NPA_CR', + uss_10_oth_rig = 'SEN_NPA_RI', uss_10_lib_sni = 'SEN_LBT_SN', + ndv = 'NDV', nrv = 'NRV', 'geometry' + ) + ) + } else if (state == 'ga') { + data <- data %>% + dplyr::select( + c( + 'ID', 'AREA', 'DATA', 'CTYSOSID', 'PRECINCT_C', 'PRECINCT_N', + 'COUNTY_NAM', 'FIPS', 'FIPS2', 'COUNTY_NUM', + 'MCCAIN08', 'OBAMA08', 'BARR08', + 'CHAMBLISS0', 'MARTIN08', 'BUCKLEY08', 'MCDONALD08', 'POWELL08', + 'GIVENS08', 'EVERETT08', 'MONDS08', 'CREP08', 'CDEM08', 'STSREP08', + 'STSDEM08', 'STHREP08', 'STHDEM08', + 'GOV_RVOTE_', 'GOV_DVOTE_', 'GOV_LIBVOT', + 'LTG_RVOTE_', 'LTG_DVOTE_', 'BUCKLEY06', 'SOS_RVOTE_', 'SOS_DVOTE_', + 'SOS_LIBVOT', 'AG_RVOTE_0', 'AG_DVOTE_0', 'BLACK06', 'IRVIN06', + 'CASHIN06', 'OXENDINE06', 'DREXINGER0', 'SUPT_RVOTE', 'SUPT_DVOTE', + 'SUPT_LIBVO', 'AGR_RVOTE_', 'AGR_DVOTE_', 'PSC3_DVOTE', 'PSC3_RVOTE', + 'PSC3_LIBVO', 'PSC5_RVOTE', 'PSC5_DVOTE', 'PSC5_LIBVO', 'USH_RVOTE_', + 'USH_DVOTE_', 'STS_RVOTE_', 'STS_DVOTE_', 'STH_RVOTE_', 'STH_DVOTE_', + 'CNTYSOSID_', 'PRECINCT_0', + 'PRES_RVOTE', 'PRES_DVOTE', 'USS_RVOTE_', 'USS_DVOTE_', 'USS_LIBVOT', + 'PSC4_RVOTE', 'PSC4_DVOTE', 'PSC4_LIBVO', 'PSC1_RVOTE', 'PSC1_LIBVO', + 'USH_RVOTE0', 'USH_DVOTE0', 'STH_RVOTE0', 'STH_DVOTE0', + 'geometry' + ) + ) + } + } + data +} + +#' List Available States from HEDA Dataverse +#' +#' @return character abbreviations for states +#' @export +#' +#' @concept datasets +#' @examples +#' heda_states() +heda_states <- function() { + c( + 'tx', 'ks', 'ct', 'ga', 'mn', 'md', 'wa', 'nd', 'co', + 'wy', 'nv', 'nh', 'vt', 'nc', 'nm', 'ny', 'ak', 'oh', 'hi', 'ms', + 'de', 'id', 'wi', 'in', 'ne', 'fl', 'tn', 'ma', 'sc', 'mi', 'mo', + 'al', 'az', 'nj', 'ca', 'il', 'ia', 'pa', 'la', 'sd', 'ok' + ) +} + +#' Vest DOIs +#' @keywords internal +heda_doi <- function() { + tibble::deframe(heda_files[, c('state', 'id')]) +} + +heda_files <- structure( + list( + id = c( + '10.7910/DVN/JL8VUJ', '10.7910/DVN/WJPX3W', + '10.7910/DVN/9ZKAIT', '10.7910/DVN/VC5TPK', '10.7910/DVN/6J2SEI', + '10.7910/DVN/FVOXGI', '10.7910/DVN/DHWJVE', '10.7910/DVN/IZC6MA', + '10.7910/DVN/I8KTCP', '10.7910/DVN/C4HL1Y', + '10.7910/DVN/BWHRVG', '10.7910/DVN/OKM0MP', '10.7910/DVN/L3QRSZ', + '10.7910/DVN/VIAUUO', '10.7910/DVN/YF4DUC', '10.7910/DVN/AWE39N', + '10.7910/DVN/NSAXEZ', '10.7910/DVN/G2DC8X', '10.7910/DVN/TLLQYY', + '10.7910/DVN/AN00LH', '10.7910/DVN/VSMASQ', '10.7910/DVN/JHX654', + '10.7910/DVN/6G4HOS', '10.7910/DVN/WYXFW3', '10.7910/DVN/IIUZHZ', + '10.7910/DVN/BKWGVO', '10.7910/DVN/Q4GHDG', '10.7910/DVN/D3QWXB', + '10.7910/DVN/MHEICI', '10.7910/DVN/YGOCFL', '10.7910/DVN/GFDU1N', + '10.7910/DVN/UUCWPP', '10.7910/DVN/HTUGFD', '10.7910/DVN/KX0YGR', + '10.7910/DVN/Y74SD3', '10.7910/DVN/USCMPG', '10.7910/DVN/VX9KUW', + '10.7910/DVN/FJHHDS', '10.7910/DVN/LSMM0T', '10.7910/DVN/LFNKS4', + '10.7910/DVN/LXZRMG' + ), + files = list( + 'Texas_Shapefile.zip', 'ks_shapefile.zip', + 'CT_Shapefile.zip', 'Georgia_Shapefiles.zip', c( + 'MN_final.dbf', + 'MN_final.sbn', 'MN_final.sbx', 'MN_final.shp', 'MN_final.shx' + ), 'MD Data.zip', 'WA_Shapefile.zip', 'ND_Shapefile.zip', + 'CO_Shapefile.zip', 'WY_Shapefile.zip', 'nv_shapefile.zip', + 'NH_Shapefile.zip', 'vt_shapefile.zip', 'NC_Shapefiles.zip', + 'NM_Shapefile.zip', 'ny_shapefile.zip', 'AK_Shapefile.zip', + c( + 'OH_final.dbf', 'OH_final.sbn', 'OH_final.sbx', 'OH_final.shp', + 'OH_final.shx' + ), 'HI_Shapefile.zip', 'MS_Shapefile.zip', + 'de_shapefile.zip', 'ID_Shapefile.zip', 'Wisconsin_Shapefiles.zip', + 'IN_Shapefile.zip', 'NE_Shapefile.zip', 'FL_Shapefile.zip', + 'TN_Shapefile.zip', 'MA_Shapefile.zip', 'South_Carolina_Shapefiles.zip', + 'MI_Shapefiles.zip', 'MO_Shapefile.zip', 'AL_Shapefile.zip', + 'AZ_Shapefile.zip', 'NJ_Shapefile.zip', 'CA_2008_2010.tab', + c( + 'IL_final.dbf', 'IL_final.sbn', 'IL_final.sbx', 'IL_final.shp', + 'IL_final.shx' + ), 'ia_shapefile.zip', 'PA_Shapefile.zip', + 'la_shapefile.zip', 'SD_Shapefile.zip', 'OK_Shapefile.zip' + ), + state = c( + 'tx', 'ks', 'ct', 'ga', 'mn', 'md', 'wa', 'nd', + 'co', 'wy', 'nv', 'nh', 'vt', 'nc', 'nm', 'ny', 'ak', + 'oh', 'hi', 'ms', 'de', 'id', 'wi', 'in', 'ne', 'fl', 'tn', + 'ma', 'sc', 'mi', 'mo', 'al', 'az', 'nj', 'ca', 'il', 'ia', + 'pa', 'la', 'sd', 'ok' + ) + ), + row.names = c(NA, -41L), + class = c( + 'tbl_df', + 'tbl', 'data.frame' + ) +) + +#' HEDA Parties +#' @keywords internal +heda_party <- function(str) { + p <- stringr::str_extract(str, '_._') + if (p == '_r_') { + p <- 'rep' + } else if (p == '_d_') { + p <- 'dem' + } else if (p == '_l_') { + p <- 'lib' + } else if (p == '_i_') { + p <- 'ind' + } else if (p == '_dr_') { + p <- 'dmr' # democratic republicans + } else if (p == '_p_') { + p <- 'pro' # progressives + } else if (p == '_tot_') { + p <- 'tot' + } else { + p <- 'unk' + } + + p +} + +heda_abb <- structure( + list( + a = c( + 'USP', 'USS', 'USH', 'GOV', 'LTG', 'ATG', + 'SOS', 'TRE', 'STS', 'STH', 'ADJ', 'AGR', 'AUD', 'COM', 'INS', + 'LND', 'RGNT', 'SPI', 'SC#', 'SCC', 'CCA', 'CCA#', 'RR#', 'SBOE', + 'SPI', 'CFO', 'COC', 'CCJ#', 'PSC#', 'CVA', 'FRE#', 'LBR', 'MAY', + 'DEL', 'SHADS', 'SHADR', 'STH2', 'STHa' + ), + b = c( + 'U.S. President', + 'U.S. Senate', 'U.S. House', 'Governor', 'Lieutenant Governor', + 'Attorney General', 'Secretary of State', 'State Treasurer', + 'State Senate (upper house)', 'State House / Assembly (lower house)', + 'Adjutant General(SC)', 'Agriculture Commissioner / Secretary', + 'Auditor', 'Comptroller / Controller', 'Insurance Commissioner', + 'Land Commissioner / Commissioner of Public Lands', 'Regent', + 'Superintendent of Education', 'State Supreme Court, # is seat number, Ex SC1 (TX)', + 'State Supreme Court Chief Justice (TX)', 'State Circuit Courts of Appeals (LA)', + 'State Criminal Court of Appeals, # is seat number, PJ is Presiding Judge. Ex. CCA1; CCAPJ (TX)', + 'State Railroad Commission, # is seat number, Ex. RR1 (TX)', + 'State Board of Education (TX)', 'Superintendent of Public Instruction', + 'Chief Financial Officer (FL)', 'Chairman of the Council (DC)', + 'Circuit Court Judge, # is seat number', 'Public Service Commission, # is seat number', + 'Court of Civil Appeals(AL)', 'County Freeholder (NJ), # is seat number', + 'Labor Commissioner (OK)', 'Mayor (DC)', 'Delegate to USH (DC)', + 'Shadow Senator (DC)', 'Shadow Representative (DC)', 'Second State House Contest (for NJ)', + 'Average State House Results (for NJ)' + ) + ), + class = c('tbl_df', 'tbl', 'data.frame'), + row.names = c(NA, -38L) +) + +heda_abb_from_alarm <- tibble::tribble( + ~heda, ~alarm, + 'USP', 'pre', + 'prs', 'pre', + 'pre', 'pre', + 'pres', 'pre', + 'USS', 'uss', + 'USH', 'ush', + 'GOV', 'gov', + 'LTG', 'ltg', + 'lt', 'ltg', + 'ltgov', 'ltg', + 'ATG', 'atg', + 'ag', 'atg', + 'SOS', 'sos', + 'TRE', 'tre', + 'STS', 'ssd', + 'STH', 'shd', + 'ADJ', 'adj', + 'AGR', 'agc', + 'AUD', 'aud', + 'audit', 'aud', + 'COM', 'com', + 'INS', 'ins', + 'LND', 'lnd', + 'RGNT', 'rgn', + 'SPI', 'soe', + 'SC#', 'spc', + 'SCC', 'spc', + 'CCA', 'jud', + 'CCA#', 'jud', + 'RR#', 'rrd', # railroad + 'SBOE', 'boe', + 'SPI', 'spi', + 'CFO', 'cfo', + 'COC', 'coc', + 'CCJ#', 'ccj', + 'PSC#', 'psc', + 'CVA', 'cva', + 'FRE#', 'fre', + 'LBR', 'lbr', + 'MAY', 'may', + 'DEL', 'ush', # DC + 'SHADS', 'ssd', # DC + 'SHADR', 'ush', # DC + 'STH2', 'shd', + 'STHa', 'shd', + 'sen', 'ssd', + 'cng', 'ush', + 'trs', 'tre', + 'treas', 'tre', + 'con', 'con' # CA controller ... +) %>% + dplyr::mutate(heda = tolower(.data$heda)) %>% + tibble::deframe() diff --git a/R/lewis.R b/R/lewis.R new file mode 100644 index 0000000..bc86e21 --- /dev/null +++ b/R/lewis.R @@ -0,0 +1,972 @@ +#' Get historical United States Congressional District Shapefiles +#' +#' Data sourced from the United States Congressional District Shapefiles, primarily +#' hosted at . Files are fetched through the GitHub +#' repository at . +#' +#' @param state two letter state abbreviation +#' @param congress congress number, from 1 to 114. +#' +#' @return a sf tibble of the congressional district boundaries +#' @export +#' +#' @references +#' Jeffrey B. Lewis, Brandon DeVine, Lincoln Pitcher, and Kenneth C. Martis. (2013) +#' Digital Boundary Definitions of United States Congressional Districts, 1789-2012. +#' \[Data file and code book\]. Retrieved from on \[date of download\]. +#' +#' @examples +#' get_lewis(state = 'NM', congress = 111) +get_lewis <- function(state, congress) { + + st <- tolower(censable::match_name(state)) + st <- stringr::str_replace_all(stringr::str_to_title(st), ' ', '_') + + st_f <- lewis_urls[stringr::str_detect(lewis_urls, st)] + + f <- lapply(stringr::str_extract_all(st_f, '\\d+'), as.integer) + f <- lapply(f, function(x) dplyr::between(congress, x[1], x[2])) |> + unlist() + + file_name <- st_f[f] + + cli::cli_inform( + 'Data sourced from the United States Congressional District Shapefiles {.url https://cdmaps.polisci.ucla.edu/}.', + .frequency = 'once', + .frequency_id = 'cite_lewis' + ) + + out <- sf::read_sf(file_name) + + if (requireNamespace('RcppSimdJson', quietly = TRUE)) { + out$member <- RcppSimdJson::fparse(out$member) + } + + out +} + +# lewis_urls <- httr2::request('https://api.github.com/repos/JeffreyBLewis/congressional-district-boundaries/contents') |> +# httr2::req_perform() |> +# httr2::resp_body_json() |> +# lapply(function(x) purrr::pluck(x, 'download_url') +# ) |> +# unlist() + +lewis_urls <- c( + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Alabama_103_to_107.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Alabama_108_to_112.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Alabama_16_to_17.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Alabama_18_to_22.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Alabama_23_to_26.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Alabama_27_to_27.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Alabama_28_to_33.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Alabama_34_to_36.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Alabama_40_to_42.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Alabama_43_to_44.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Alabama_45_to_48.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Alabama_49_to_52.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Alabama_53_to_57.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Alabama_58_to_62.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Alabama_63_to_64.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Alabama_65_to_72.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Alabama_73_to_87.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Alabama_88_to_88.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Alabama_89_to_89.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Alabama_90_to_92.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Alabama_93_to_97.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Alabama_98_to_102.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Alaska_103_to_112.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Alaska_86_to_102.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Arizona_103_to_107.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Arizona_108_to_108.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Arizona_109_to_112.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Arizona_62_to_77.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Arizona_78_to_80.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Arizona_81_to_87.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Arizona_88_to_89.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Arizona_90_to_91.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Arizona_92_to_92.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Arizona_93_to_97.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Arizona_98_to_102.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Arkansas_103_to_107.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Arkansas_108_to_112.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Arkansas_24_to_32.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Arkansas_33_to_36.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Arkansas_40_to_40.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Arkansas_41_to_42.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Arkansas_43_to_43.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Arkansas_44_to_44.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Arkansas_45_to_46.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Arkansas_47_to_47.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Arkansas_48_to_48.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Arkansas_49_to_52.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Arkansas_53_to_57.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Arkansas_58_to_82.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Arkansas_83_to_87.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Arkansas_88_to_89.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Arkansas_90_to_92.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Arkansas_93_to_97.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Arkansas_98_to_102.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/California_103_to_107.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/California_108_to_112.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/California_31_to_36.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/California_37_to_38.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/California_39_to_39.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/California_40_to_42.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/California_43_to_47.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/California_48_to_48.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/California_49_to_52.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/California_53_to_57.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/California_58_to_62.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/California_63_to_72.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/California_73_to_77.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/California_78_to_82.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/California_83_to_87.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/California_88_to_90.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/California_91_to_92.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/California_93_to_93.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/California_94_to_97.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/California_98_to_98.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/California_99_to_102.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Colorado_103_to_107.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Colorado_108_to_112.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Colorado_44_to_52.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Colorado_53_to_57.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Colorado_58_to_62.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Colorado_63_to_63.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Colorado_64_to_67.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Colorado_68_to_88.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Colorado_89_to_92.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Colorado_93_to_97.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Colorado_98_to_102.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Connecticut_103_to_107.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Connecticut_108_to_112.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Connecticut_1_to_2.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Connecticut_25_to_27.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Connecticut_28_to_57.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Connecticut_3_to_7.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Connecticut_58_to_62.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Connecticut_63_to_72.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Connecticut_73_to_88.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Connecticut_89_to_92.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Connecticut_8_to_24.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Connecticut_93_to_97.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Connecticut_98_to_102.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Delaware_103_to_112.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Delaware_13_to_17.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Delaware_18_to_97.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Delaware_1_to_12.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Delaware_98_to_102.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/District_Of_Columbia_98_to_102.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Florida_103_to_104.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Florida_105_to_107.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Florida_108_to_112.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Florida_29_to_36.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Florida_40_to_42.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Florida_43_to_43.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Florida_44_to_47.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Florida_48_to_57.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Florida_58_to_62.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Florida_63_to_63.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Florida_64_to_68.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Florida_69_to_72.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Florida_73_to_74.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Florida_75_to_77.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Florida_78_to_78.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Florida_79_to_82.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Florida_83_to_87.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Florida_88_to_89.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Florida_90_to_90.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Florida_91_to_92.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Florida_93_to_97.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Florida_98_to_102.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Georgia_103_to_103.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Georgia_104_to_104.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Georgia_105_to_107.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Georgia_108_to_109.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Georgia_10_to_12.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Georgia_110_to_112.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Georgia_13_to_15.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Georgia_16_to_17.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Georgia_18_to_19.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Georgia_1_to_1.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Georgia_20_to_20.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Georgia_21_to_22.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Georgia_23_to_27.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Georgia_28_to_28.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Georgia_29_to_31.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Georgia_2_to_2.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Georgia_32_to_32.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Georgia_33_to_33.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Georgia_34_to_35.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Georgia_36_to_36.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Georgia_3_to_7.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Georgia_40_to_42.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Georgia_43_to_47.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Georgia_48_to_48.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Georgia_49_to_52.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Georgia_53_to_59.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Georgia_60_to_60.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Georgia_61_to_62.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Georgia_63_to_64.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Georgia_65_to_69.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Georgia_70_to_72.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Georgia_73_to_88.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Georgia_89_to_92.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Georgia_8_to_8.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Georgia_93_to_97.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Georgia_98_to_102.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Georgia_9_to_9.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Hawaii_103_to_107.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Hawaii_108_to_112.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Hawaii_86_to_91.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Hawaii_92_to_97.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Hawaii_98_to_98.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Hawaii_99_to_102.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Idaho_103_to_107.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Idaho_108_to_112.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Idaho_51_to_62.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Idaho_63_to_65.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Idaho_66_to_89.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Idaho_90_to_92.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Idaho_93_to_97.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Idaho_98_to_102.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Illinois_103_to_107.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Illinois_108_to_112.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Illinois_15_to_22.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Illinois_23_to_27.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Illinois_28_to_32.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Illinois_33_to_37.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Illinois_38_to_42.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Illinois_43_to_47.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Illinois_48_to_52.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Illinois_53_to_53.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Illinois_54_to_57.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Illinois_58_to_62.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Illinois_63_to_77.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Illinois_78_to_80.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Illinois_81_to_82.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Illinois_83_to_87.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Illinois_88_to_89.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Illinois_90_to_92.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Illinois_93_to_97.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Illinois_98_to_102.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Indiana_103_to_107.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Indiana_108_to_112.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Indiana_14_to_15.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Indiana_16_to_16.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Indiana_17_to_17.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Indiana_18_to_18.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Indiana_19_to_20.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Indiana_21_to_22.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Indiana_23_to_27.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Indiana_28_to_32.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Indiana_33_to_40.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Indiana_41_to_42.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Indiana_43_to_43.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Indiana_44_to_46.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Indiana_47_to_49.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Indiana_50_to_52.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Indiana_53_to_54.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Indiana_55_to_57.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Indiana_58_to_62.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Indiana_63_to_72.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Indiana_73_to_73.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Indiana_74_to_74.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Indiana_75_to_77.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Indiana_78_to_89.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Indiana_90_to_90.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Indiana_91_to_92.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Indiana_93_to_97.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Indiana_98_to_102.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Iowa_103_to_107.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Iowa_108_to_112.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Iowa_29_to_29.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Iowa_30_to_30.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Iowa_31_to_35.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Iowa_36_to_37.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Iowa_38_to_42.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Iowa_43_to_47.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Iowa_48_to_49.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Iowa_50_to_72.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Iowa_73_to_77.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Iowa_78_to_87.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Iowa_88_to_92.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Iowa_93_to_97.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Iowa_98_to_102.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Kansas_103_to_107.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Kansas_108_to_112.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Kansas_36_to_42.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Kansas_43_to_43.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Kansas_44_to_47.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Kansas_48_to_48.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Kansas_49_to_52.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Kansas_53_to_55.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Kansas_56_to_59.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Kansas_60_to_72.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Kansas_73_to_77.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Kansas_78_to_87.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Kansas_88_to_89.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Kansas_90_to_92.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Kansas_93_to_97.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Kansas_98_to_102.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Kentucky_103_to_104.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Kentucky_105_to_107.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Kentucky_108_to_112.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Kentucky_13_to_17.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Kentucky_18_to_22.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Kentucky_23_to_27.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Kentucky_28_to_33.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Kentucky_2_to_6.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Kentucky_34_to_37.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Kentucky_38_to_42.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Kentucky_43_to_47.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Kentucky_48_to_51.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Kentucky_52_to_55.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Kentucky_56_to_62.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Kentucky_63_to_72.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Kentucky_73_to_73.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Kentucky_74_to_82.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Kentucky_7_to_7.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Kentucky_83_to_84.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Kentucky_85_to_87.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Kentucky_88_to_89.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Kentucky_8_to_12.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Kentucky_90_to_92.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Kentucky_93_to_97.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Kentucky_98_to_102.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/LICENSE', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Louisiana_103_to_103.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Louisiana_104_to_104.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Louisiana_105_to_107.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Louisiana_108_to_112.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Louisiana_12_to_17.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Louisiana_18_to_27.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Louisiana_28_to_32.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Louisiana_33_to_36.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Louisiana_37_to_37.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Louisiana_40_to_40.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Louisiana_41_to_42.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Louisiana_43_to_43.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Louisiana_44_to_57.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Louisiana_58_to_62.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Louisiana_63_to_90.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Louisiana_91_to_91.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Louisiana_92_to_92.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Louisiana_93_to_97.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Louisiana_98_to_98.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Louisiana_99_to_102.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Maine_103_to_103.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Maine_104_to_107.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Maine_108_to_108.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Maine_109_to_112.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Maine_17_to_17.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Maine_18_to_22.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Maine_23_to_27.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Maine_28_to_28.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Maine_29_to_32.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Maine_33_to_37.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Maine_38_to_47.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Maine_48_to_48.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Maine_49_to_62.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Maine_63_to_72.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Maine_73_to_87.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Maine_88_to_97.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Maine_98_to_102.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Maryland_103_to_107.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Maryland_108_to_112.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Maryland_1_to_2.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Maryland_23_to_23.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Maryland_24_to_27.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Maryland_28_to_28.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Maryland_29_to_32.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Maryland_33_to_37.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Maryland_38_to_42.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Maryland_3_to_7.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Maryland_43_to_51.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Maryland_52_to_54.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Maryland_55_to_55.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Maryland_56_to_57.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Maryland_58_to_67.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Maryland_68_to_79.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Maryland_80_to_82.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Maryland_83_to_87.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Maryland_88_to_89.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Maryland_8_to_22.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Maryland_90_to_92.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Maryland_93_to_97.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Maryland_98_to_102.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Massachusetts_103_to_107.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Massachusetts_108_to_112.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Massachusetts_13_to_13.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Massachusetts_14_to_14.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Massachusetts_15_to_16.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Massachusetts_17_to_17.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Massachusetts_18_to_22.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Massachusetts_1_to_1.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Massachusetts_23_to_27.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Massachusetts_28_to_32.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Massachusetts_2_to_2.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Massachusetts_33_to_37.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Massachusetts_38_to_39.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Massachusetts_3_to_3.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Massachusetts_40_to_42.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Massachusetts_43_to_44.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Massachusetts_45_to_47.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Massachusetts_48_to_52.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Massachusetts_4_to_7.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Massachusetts_53_to_54.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Massachusetts_55_to_57.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Massachusetts_58_to_62.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Massachusetts_63_to_64.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Massachusetts_65_to_69.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Massachusetts_70_to_72.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Massachusetts_73_to_77.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Massachusetts_78_to_87.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Massachusetts_88_to_90.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Massachusetts_8_to_12.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Massachusetts_91_to_92.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Massachusetts_93_to_97.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Massachusetts_98_to_102.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Michigan_103_to_107.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Michigan_108_to_112.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Michigan_24_to_27.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Michigan_28_to_32.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Michigan_33_to_37.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Michigan_38_to_41.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Michigan_42_to_42.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Michigan_43_to_47.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Michigan_48_to_52.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Michigan_53_to_62.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Michigan_63_to_63.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Michigan_64_to_72.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Michigan_73_to_82.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Michigan_83_to_87.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Michigan_88_to_88.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Michigan_89_to_92.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Michigan_93_to_97.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Michigan_98_to_102.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Minnesota_103_to_103.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Minnesota_104_to_107.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Minnesota_108_to_112.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Minnesota_35_to_37.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Minnesota_38_to_42.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Minnesota_43_to_47.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Minnesota_48_to_52.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Minnesota_53_to_57.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Minnesota_58_to_62.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Minnesota_63_to_63.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Minnesota_64_to_71.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Minnesota_72_to_72.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Minnesota_73_to_73.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Minnesota_74_to_87.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Minnesota_88_to_92.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Minnesota_93_to_97.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Minnesota_98_to_102.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Mississippi_103_to_107.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Mississippi_108_to_112.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Mississippi_15_to_22.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Mississippi_23_to_27.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Mississippi_28_to_29.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Mississippi_30_to_32.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Mississippi_33_to_33.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Mississippi_34_to_34.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Mississippi_35_to_36.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Mississippi_41_to_42.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Mississippi_43_to_44.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Mississippi_45_to_45.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Mississippi_46_to_47.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Mississippi_48_to_57.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Mississippi_58_to_61.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Mississippi_62_to_65.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Mississippi_66_to_72.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Mississippi_73_to_82.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Mississippi_83_to_84.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Mississippi_85_to_87.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Mississippi_88_to_89.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Mississippi_90_to_92.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Mississippi_93_to_97.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Mississippi_98_to_98.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Mississippi_99_to_102.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Missouri_103_to_107.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Missouri_108_to_112.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Missouri_17_to_21.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Missouri_22_to_22.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Missouri_23_to_27.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Missouri_28_to_29.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Missouri_30_to_32.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Missouri_33_to_33.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Missouri_34_to_37.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Missouri_38_to_42.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Missouri_43_to_45.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Missouri_46_to_47.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Missouri_48_to_49.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Missouri_50_to_52.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Missouri_53_to_57.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Missouri_58_to_72.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Missouri_73_to_73.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Missouri_74_to_82.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Missouri_83_to_87.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Missouri_88_to_89.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Missouri_90_to_90.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Missouri_91_to_91.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Missouri_92_to_92.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Missouri_93_to_97.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Missouri_98_to_102.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Montana_103_to_112.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Montana_51_to_62.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Montana_63_to_65.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Montana_66_to_89.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Montana_90_to_92.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Montana_93_to_97.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Montana_98_to_98.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Montana_99_to_102.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Nebraska_103_to_107.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Nebraska_108_to_112.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Nebraska_39_to_46.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Nebraska_47_to_47.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Nebraska_48_to_52.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Nebraska_53_to_72.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Nebraska_73_to_77.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Nebraska_78_to_87.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Nebraska_88_to_90.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Nebraska_91_to_97.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Nebraska_98_to_102.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Nevada_103_to_107.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Nevada_108_to_112.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Nevada_38_to_41.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Nevada_42_to_97.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Nevada_98_to_102.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/New_Hampshire_103_to_107.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/New_Hampshire_108_to_112.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/New_Hampshire_13_to_22.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/New_Hampshire_1_to_2.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/New_Hampshire_23_to_27.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/New_Hampshire_28_to_29.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/New_Hampshire_30_to_31.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/New_Hampshire_32_to_32.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/New_Hampshire_33_to_47.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/New_Hampshire_3_to_7.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/New_Hampshire_48_to_91.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/New_Hampshire_8_to_12.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/New_Hampshire_92_to_92.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/New_Hampshire_93_to_97.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/New_Hampshire_98_to_102.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/New_Jersey_103_to_105.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/New_Jersey_106_to_107.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/New_Jersey_108_to_112.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/New_Jersey_13_to_13.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/New_Jersey_14_to_27.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/New_Jersey_1_to_2.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/New_Jersey_28_to_28.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/New_Jersey_29_to_29.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/New_Jersey_30_to_32.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/New_Jersey_33_to_37.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/New_Jersey_38_to_42.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/New_Jersey_3_to_5.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/New_Jersey_43_to_52.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/New_Jersey_53_to_53.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/New_Jersey_54_to_57.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/New_Jersey_58_to_62.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/New_Jersey_63_to_72.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/New_Jersey_6_to_6.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/New_Jersey_73_to_87.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/New_Jersey_7_to_7.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/New_Jersey_88_to_89.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/New_Jersey_8_to_12.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/New_Jersey_90_to_90.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/New_Jersey_91_to_92.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/New_Jersey_93_to_97.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/New_Jersey_98_to_98.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/New_Jersey_99_to_102.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/New_Mexico_103_to_107.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/New_Mexico_108_to_112.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/New_Mexico_62_to_62.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/New_Mexico_63_to_77.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/New_Mexico_78_to_90.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/New_Mexico_91_to_97.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/New_Mexico_98_to_102.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/New_York_103_to_105.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/New_York_106_to_107.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/New_York_108_to_112.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/New_York_11_to_12.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/New_York_13_to_16.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/New_York_17_to_17.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/New_York_18_to_22.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/New_York_1_to_2.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/New_York_23_to_27.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/New_York_28_to_32.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/New_York_33_to_33.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/New_York_34_to_37.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/New_York_38_to_42.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/New_York_3_to_5.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/New_York_43_to_43.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/New_York_44_to_47.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/New_York_48_to_48.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/New_York_49_to_52.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/New_York_53_to_57.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/New_York_58_to_62.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/New_York_63_to_64.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/New_York_65_to_65.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/New_York_66_to_67.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/New_York_68_to_72.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/New_York_6_to_7.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/New_York_73_to_78.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/New_York_79_to_82.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/New_York_83_to_87.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/New_York_88_to_90.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/New_York_8_to_8.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/New_York_91_to_91.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/New_York_92_to_92.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/New_York_93_to_93.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/New_York_94_to_97.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/New_York_98_to_102.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/New_York_98_to_98.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/New_York_99_to_102.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/New_York_9_to_10.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/North_Carolina_103_to_105.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/North_Carolina_106_to_106.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/North_Carolina_107_to_107.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/North_Carolina_108_to_112.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/North_Carolina_13_to_27.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/North_Carolina_1_to_1.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/North_Carolina_28_to_29.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/North_Carolina_2_to_2.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/North_Carolina_30_to_32.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/North_Carolina_33_to_36.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/North_Carolina_3_to_7.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/North_Carolina_40_to_42.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/North_Carolina_43_to_47.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/North_Carolina_48_to_48.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/North_Carolina_49_to_52.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/North_Carolina_53_to_54.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/North_Carolina_55_to_55.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/North_Carolina_56_to_56.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/North_Carolina_57_to_57.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/North_Carolina_58_to_60.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/North_Carolina_61_to_62.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/North_Carolina_63_to_72.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/North_Carolina_73_to_77.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/North_Carolina_78_to_87.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/North_Carolina_88_to_89.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/North_Carolina_8_to_12.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/North_Carolina_90_to_90.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/North_Carolina_91_to_92.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/North_Carolina_93_to_97.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/North_Carolina_98_to_102.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/North_Dakota_103_to_112.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/North_Dakota_51_to_57.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/North_Dakota_58_to_62.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/North_Dakota_63_to_72.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/North_Dakota_73_to_87.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/North_Dakota_88_to_92.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/North_Dakota_93_to_97.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/North_Dakota_98_to_102.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Ohio_100_to_102.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Ohio_103_to_104.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Ohio_105_to_107.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Ohio_108_to_112.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Ohio_13_to_17.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Ohio_18_to_21.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Ohio_22_to_22.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Ohio_23_to_27.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Ohio_28_to_29.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Ohio_30_to_32.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Ohio_33_to_37.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Ohio_38_to_42.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Ohio_43_to_45.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Ohio_46_to_46.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Ohio_47_to_47.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Ohio_48_to_48.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Ohio_49_to_49.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Ohio_50_to_51.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Ohio_52_to_52.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Ohio_53_to_57.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Ohio_58_to_62.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Ohio_63_to_63.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Ohio_64_to_72.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Ohio_73_to_77.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Ohio_78_to_82.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Ohio_7_to_8.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Ohio_83_to_87.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Ohio_88_to_89.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Ohio_90_to_90.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Ohio_91_to_92.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Ohio_93_to_97.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Ohio_98_to_99.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Ohio_9_to_12.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Oklahoma_103_to_107.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Oklahoma_108_to_112.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Oklahoma_60_to_62.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Oklahoma_63_to_63.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Oklahoma_64_to_72.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Oklahoma_73_to_77.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Oklahoma_78_to_82.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Oklahoma_83_to_90.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Oklahoma_91_to_92.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Oklahoma_93_to_97.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Oklahoma_98_to_102.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Oregon_103_to_107.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Oregon_108_to_112.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Oregon_35_to_52.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Oregon_53_to_62.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Oregon_63_to_77.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Oregon_78_to_89.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Oregon_90_to_92.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Oregon_93_to_97.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Oregon_98_to_102.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Pennsylvania_103_to_107.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Pennsylvania_108_to_108.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Pennsylvania_109_to_112.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Pennsylvania_13_to_17.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Pennsylvania_18_to_22.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Pennsylvania_1_to_1.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Pennsylvania_23_to_26.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Pennsylvania_27_to_27.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Pennsylvania_28_to_29.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Pennsylvania_2_to_2.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Pennsylvania_30_to_32.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Pennsylvania_33_to_37.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Pennsylvania_38_to_42.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Pennsylvania_3_to_3.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Pennsylvania_43_to_43.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Pennsylvania_44_to_44.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Pennsylvania_45_to_47.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Pennsylvania_48_to_50.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Pennsylvania_4_to_6.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Pennsylvania_51_to_52.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Pennsylvania_53_to_57.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Pennsylvania_58_to_61.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Pennsylvania_62_to_62.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Pennsylvania_63_to_67.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Pennsylvania_68_to_72.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Pennsylvania_73_to_77.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Pennsylvania_78_to_78.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Pennsylvania_79_to_82.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Pennsylvania_7_to_7.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Pennsylvania_83_to_83.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Pennsylvania_84_to_87.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Pennsylvania_88_to_89.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Pennsylvania_8_to_12.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Pennsylvania_90_to_92.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Pennsylvania_93_to_97.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Pennsylvania_98_to_102.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/README.md', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Rhode_Island_103_to_107.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Rhode_Island_108_to_112.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Rhode_Island_1_to_2.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Rhode_Island_28_to_42.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Rhode_Island_3_to_27.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Rhode_Island_43_to_47.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Rhode_Island_48_to_62.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Rhode_Island_63_to_71.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Rhode_Island_72_to_72.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Rhode_Island_73_to_88.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Rhode_Island_89_to_92.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Rhode_Island_93_to_97.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Rhode_Island_98_to_102.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/South_Carolina_103_to_103.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/South_Carolina_104_to_107.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/South_Carolina_108_to_112.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/South_Carolina_13_to_14.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/South_Carolina_15_to_17.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/South_Carolina_18_to_27.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/South_Carolina_1_to_2.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/South_Carolina_28_to_32.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/South_Carolina_33_to_36.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/South_Carolina_3_to_7.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/South_Carolina_40_to_42.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/South_Carolina_43_to_43.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/South_Carolina_44_to_44.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/South_Carolina_45_to_47.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/South_Carolina_48_to_53.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/South_Carolina_54_to_55.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/South_Carolina_56_to_57.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/South_Carolina_58_to_64.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/South_Carolina_65_to_72.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/South_Carolina_73_to_88.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/South_Carolina_89_to_89.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/South_Carolina_8_to_12.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/South_Carolina_90_to_92.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/South_Carolina_93_to_97.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/South_Carolina_98_to_102.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/South_Dakota_103_to_107.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/South_Dakota_108_to_112.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/South_Dakota_51_to_62.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/South_Dakota_63_to_72.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/South_Dakota_73_to_89.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/South_Dakota_90_to_92.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/South_Dakota_93_to_97.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/South_Dakota_98_to_102.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Tennessee_103_to_107.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Tennessee_108_to_112.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Tennessee_10_to_10.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Tennessee_11_to_11.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Tennessee_12_to_12.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Tennessee_13_to_17.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Tennessee_18_to_22.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Tennessee_23_to_27.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Tennessee_28_to_32.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Tennessee_33_to_36.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Tennessee_37_to_37.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Tennessee_39_to_42.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Tennessee_43_to_43.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Tennessee_44_to_47.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Tennessee_48_to_51.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Tennessee_4_to_5.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Tennessee_52_to_57.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Tennessee_58_to_67.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Tennessee_68_to_69.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Tennessee_6_to_7.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Tennessee_70_to_72.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Tennessee_73_to_73.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Tennessee_74_to_77.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Tennessee_78_to_79.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Tennessee_80_to_82.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Tennessee_83_to_89.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Tennessee_8_to_8.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Tennessee_90_to_90.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Tennessee_91_to_92.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Tennessee_93_to_94.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Tennessee_95_to_97.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Tennessee_98_to_102.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Tennessee_9_to_9.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Texas_103_to_104.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Texas_105_to_106.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Texas_107_to_107.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Texas_108_to_108.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Texas_109_to_109.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Texas_110_to_112.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Texas_28_to_31.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Texas_29_to_31.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Texas_32_to_36.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Texas_41_to_42.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Texas_43_to_43.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Texas_44_to_46.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Texas_47_to_47.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Texas_48_to_49.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Texas_50_to_50.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Texas_51_to_52.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Texas_53_to_54.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Texas_55_to_57.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Texas_58_to_61.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Texas_62_to_62.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Texas_63_to_63.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Texas_64_to_65.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Texas_66_to_72.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Texas_73_to_73.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Texas_74_to_82.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Texas_83_to_85.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Texas_86_to_87.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Texas_88_to_89.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Texas_90_to_90.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Texas_91_to_92.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Texas_93_to_93.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Texas_94_to_97.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Texas_98_to_98.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Texas_99_to_102.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Utah_103_to_107.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Utah_108_to_112.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Utah_54_to_62.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Utah_63_to_63.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Utah_64_to_89.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Utah_90_to_92.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Utah_93_to_97.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Utah_98_to_102.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Vermont_103_to_112.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Vermont_13_to_16.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Vermont_17_to_17.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Vermont_18_to_18.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Vermont_19_to_21.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Vermont_22_to_22.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Vermont_23_to_27.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Vermont_28_to_32.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Vermont_2_to_6.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Vermont_33_to_47.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Vermont_48_to_72.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Vermont_73_to_97.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Vermont_7_to_7.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Vermont_8_to_12.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Vermont_98_to_102.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Virginia_103_to_103.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Virginia_104_to_105.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Virginia_106_to_107.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Virginia_108_to_112.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Virginia_10_to_12.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Virginia_13_to_17.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Virginia_18_to_18.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Virginia_19_to_22.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Virginia_1_to_2.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Virginia_23_to_24.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Virginia_25_to_25.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Virginia_26_to_27.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Virginia_28_to_29.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Virginia_30_to_31.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Virginia_32_to_32.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Virginia_33_to_35.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Virginia_36_to_36.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Virginia_37_to_37.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Virginia_3_to_7.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Virginia_41_to_42.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Virginia_43_to_47.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Virginia_48_to_48.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Virginia_49_to_52.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Virginia_53_to_60.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Virginia_61_to_62.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Virginia_63_to_72.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Virginia_73_to_73.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Virginia_74_to_82.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Virginia_83_to_89.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Virginia_8_to_9.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Virginia_90_to_92.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Virginia_93_to_97.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Virginia_98_to_102.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Washington_103_to_107.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Washington_108_to_112.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Washington_51_to_52.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Washington_53_to_57.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Washington_58_to_60.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Washington_61_to_62.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Washington_63_to_63.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Washington_64_to_72.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Washington_73_to_82.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Washington_83_to_85.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Washington_86_to_86.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Washington_87_to_90.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Washington_91_to_92.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Washington_93_to_97.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Washington_98_to_98.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Washington_99_to_102.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/West_Virginia_103_to_107.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/West_Virginia_108_to_112.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/West_Virginia_38_to_47.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/West_Virginia_48_to_57.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/West_Virginia_58_to_62.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/West_Virginia_63_to_64.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/West_Virginia_65_to_71.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/West_Virginia_72_to_73.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/West_Virginia_74_to_82.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/West_Virginia_83_to_87.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/West_Virginia_88_to_90.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/West_Virginia_91_to_92.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/West_Virginia_93_to_97.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/West_Virginia_98_to_102.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Wisconsin_103_to_107.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Wisconsin_108_to_112.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Wisconsin_30_to_30.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Wisconsin_31_to_37.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Wisconsin_38_to_42.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Wisconsin_43_to_44.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Wisconsin_45_to_47.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Wisconsin_48_to_52.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Wisconsin_53_to_57.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Wisconsin_58_to_62.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Wisconsin_63_to_72.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Wisconsin_73_to_88.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Wisconsin_89_to_92.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Wisconsin_93_to_97.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Wisconsin_98_to_102.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Wyoming_103_to_112.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Wyoming_51_to_97.geojson', + 'https://raw.githubusercontent.com/JeffreyBLewis/congressional-district-boundaries/master/Wyoming_98_to_102.geojson' +) diff --git a/R/match.R b/R/match.R index d1418e0..95a0fa9 100644 --- a/R/match.R +++ b/R/match.R @@ -2,12 +2,25 @@ #' #' @param from smaller geographic level to match up from #' @param to larger geographic level to be matched to -#' @param method string from center, centroid, point, or area for matching method +#' @param method string from 'center', 'centroid', 'point', 'circle', or 'area' for matching method +#' @param by A character vector to match by. One element if both `from` and `to` share the subsetting column name. +#' One element with a name (for `from`) and one element (for `to`). #' @param tiebreaker Should ties be broken? boolean. If FALSE, precincts with no #' matches get value -1 and precincts with multiple matches get value -2. #' @templateVar epsg TRUE #' @template template #' +#' @details +#' +#' Methods are as follows: +#' - centroid: matches each element of `from` to the `to` entry that the geographic centroid intersects +#' - center: very similar to centroid, but it matches an arbitrary center point within `from` +#' if the centroid of `from` is outside the bounds of from. (This happens for non-convex shapes only). +#' - point: matches each element of `from` to the `to` entry that the "point on surface" intersects. +#' - circle: matches each element of `from` to the `to` entry that the centroid +#' of the maximum inscribed circle intersects +#' - area: matches each element of `from` to the `to` element which has the largest area overlap +#' #' @return Integer Vector of matches length(to) with values in 1:nrow(from) #' @export #' @@ -23,8 +36,8 @@ #' #' geo_match(from = checkerboard, to = counties) #' geo_match(from = checkerboard, to = counties, method = 'area') -geo_match <- function(from, to, method = 'center', tiebreaker = TRUE, epsg = 3857) { - match.arg(arg = method, choices = c('center', 'centroid', 'point', 'area')) +geo_match <- function(from, to, method = 'center', by = NULL, tiebreaker = TRUE, epsg = 3857) { + match.arg(arg = method, choices = c('center', 'centroid', 'point', 'circle', 'area')) if (missing(from)) { cli::cli_abort('Please provide an argument to {.arg from}.') @@ -32,61 +45,128 @@ geo_match <- function(from, to, method = 'center', tiebreaker = TRUE, epsg = 385 if (missing(to)) { cli::cli_abort('Please provide an argument to {.arg to}.') } - + pairs <- make_planar_pair(from, to, epsg = epsg) from <- pairs$x to <- pairs$y - if (method %in% c('center', 'centroid', 'point')) { - if (method == 'center') { - op <- function(x) st_centerish(x, epsg = epsg) - } else if (method == 'centroid') { - op <- geos::geos_centroid - } else { - op <- geos::geos_point_on_surface - } + if (is.null(by)) { + if (method %in% c('center', 'centroid', 'point', 'circle')) { + if (method == 'center') { + op <- function(x) st_centerish(x, epsg = epsg) + } else if (method == 'circle') { + op <- function(x) st_circle_center(x, epsg = epsg) + } else if (method == 'centroid') { + op <- geos::geos_centroid + } else { + op <- geos::geos_point_on_surface + } - pts <- op(from) + pts <- op(from) - ints <- geos::geos_intersects_matrix(pts, to) - if (any(lengths(ints) != 1)) { - idx <- which(lengths(ints) != 1) + ints <- geos::geos_intersects_matrix(pts, to) + if (any(lengths(ints) != 1)) { + idx <- which(lengths(ints) != 1) - if (tiebreaker) { - for (i in seq_along(idx)) { - nnb <- nn_geos(x = from[idx[i], ], y = to) - ints[[idx[i]]] <- nnb + if (tiebreaker) { + for (i in seq_along(idx)) { + nnb <- nn_geos(x = from[idx[i], ], y = to) + ints[[idx[i]]] <- nnb + } + } else { + for (i in seq_along(ints)) { + if (length(ints[[i]]) == 0) { + ints[[i]] <- -1L + } + if (length(ints[[i]]) > 1) { + ints[[i]] <- -2L + } + } } - } else { - for (i in 1:length(ints)) { - if (length(ints[[i]]) == 0) { - ints[[i]] <- -1L + } + } else { + to <- to %>% dplyr::mutate(toid = dplyr::row_number()) + from <- from %>% dplyr::mutate(fromid = dplyr::row_number()) + ints <- largest_intersection_geos( + x = geos::geos_make_valid(from), + y = geos::geos_make_valid(to) + ) + + if (any(is.na(ints))) { + idx <- which(is.na(ints)) + + if (tiebreaker) { + for (i in seq_along(idx)) { + nnb <- nn_geos(x = from[idx[i], ], y = to) + ints[idx[i]] <- nnb } - if (length(ints[[i]]) > 1) { - ints[[i]] <- -2L + } else { + for (i in seq_along(idx)) { + ints[idx[i]] <- -1L } } } } + + ints[geos::geos_is_empty(from)] <- NA_real_ } else { - to <- to %>% mutate(toid = row_number()) - from <- from %>% mutate(fromid = row_number()) - ints <- largest_intersection_geos(x = geos::geos_make_valid(from), - y = geos::geos_make_valid(to)) - - if (any(is.na(ints))) { - idx <- which(is.na(ints)) - - if (tiebreaker) { - for (i in 1:length(idx)) { - nnb <- nn_geos(x = from[idx[i], ], y = to) - ints[idx[i]] <- nnb + # check by ---- + if (length(by) != 1) { + cli::cli_abort('{.arg by} must be {.val NULL} or length 1.') + } + + if (length(names(by)) > 0) { + col_from <- names(by) + col_to <- unname(by) + } else { + col_to <- col_from <- by + } + + if (!col_from %in% names(from)) { + cli::cli_abort('{.arg by} entry for from {col_from} not found in {.arg from}.') + } + if (!col_to %in% names(to)) { + cli::cli_abort('{.arg to} entry for from {col_to} not found in {.arg to}.') + } + + vals <- unique(from[[col_from]]) # vals_from + # vals_to <- unique(to[col_to]) + + # create corresponding subset lists + from_l <- lapply(vals, function(v) { + from %>% + dplyr::filter(.data[[col_from]] == v) + }) + to_l <- lapply(vals, function(v) { + to %>% + dplyr::filter(.data[[col_to]] == v) + }) + + # id entries + int_l <- lapply( + seq_along(vals), + function(i) { + if (nrow(from_l[[i]]) == 0 || nrow(to_l[[i]]) == 0) { + return(integer(0)) # perhaps cli::cli_abort('something about values being in both') } + geo_match( + from = from_l[[i]], to = to_l[[i]], + method = method, tiebreaker = tiebreaker, + epsg = FALSE + ) } + ) + + # build index + ints <- rep.int(NA_integer_, times = nrow(from)) + + for (i in seq_along(vals)) { + from_idx <- which(from[[col_from]] == vals[i]) + to_idx <- which(to[[col_to]] == vals[i]) + ints[from_idx] <- to_idx[int_l[[i]]] } } - ints[geos::geos_is_empty(from)] <- NA_real_ as.integer(ints) } diff --git a/R/planar.R b/R/planar.R index 51ffc91..dc2d244 100644 --- a/R/planar.R +++ b/R/planar.R @@ -1,15 +1,14 @@ make_planar_pair <- function(x, y = NULL, epsg = 3857) { - if (is.null(epsg) || isFALSE(epsg)) { return(list(x = x, y = y)) } x_is_ll <- isTRUE(sf::st_is_longlat(x)) y_is_ll <- isTRUE(sf::st_is_longlat(y)) - + x_crs <- sf::st_crs(x) y_crs <- sf::st_crs(y) - + if (is.null(x_crs) || is.na(x_crs)) { cli::cli_warn('Planarizing skipped. {.arg x} missing CRS.') return(list(x = x, y = y)) @@ -18,7 +17,7 @@ make_planar_pair <- function(x, y = NULL, epsg = 3857) { cli::cli_warn('Planarizing skipped. {.arg y} missing CRS.') return(list(x = x, y = y)) } - + if (!is.null(y)) { if (!x_is_ll && !y_is_ll) { # both not-ll if (x_crs != y_crs) { # diff crs -> use x crs @@ -39,4 +38,4 @@ make_planar_pair <- function(x, y = NULL, epsg = 3857) { } list(x = x, y = y) -} \ No newline at end of file +} diff --git a/R/plots.R b/R/plots.R index d89a2a6..a5d1a1b 100644 --- a/R/plots.R +++ b/R/plots.R @@ -26,42 +26,42 @@ geo_plot_group <- function(shp, adj, group, save = FALSE, path = '') { if (missing(shp)) { cli::cli_abort('Please provide an argument to {.arg shp}.') } - + if (missing(adj)) { cli::cli_abort('Please provide an argument to {.arg adj}.') } - + if (missing(group)) { group <- rep(1L, nrow(shp)) } - + components <- check_contiguity(adj = adj, group = group) - + shp <- shp %>% dplyr::bind_cols(components) %>% dplyr::mutate(rownum = row_number()) - - + + out <- list() for (g in 1:length(unique(group))) { gc <- unique(group)[g] - - temp <- shp %>% + + temp <- shp %>% dplyr::filter(group == gc) - - p <- temp %>% + + p <- temp %>% ggplot2::ggplot(aes(fill = as.character(component))) + ggplot2::geom_sf() + ggplot2::labs(fill = 'Conn Comp', title = gc) + ggplot2::theme_void() + ggplot2::scale_fill_brewer(type = 'qual', palette = 'Dark2') - + out[[g]] <- p if (save) { ggsave(filename = paste0(path, 'group_plot_', gc, '.png'), plot = p) } } - + out } @@ -79,7 +79,7 @@ geo_plot_group <- function(shp, adj, group, save = FALSE, path = '') { #' @examples #' data(checkerboard) #' geo_plot(checkerboard) -#' +#' geo_plot <- function(shp) { shp %>% dplyr::mutate(rn = dplyr::row_number()) %>% diff --git a/R/regionalize.R b/R/regionalize.R new file mode 100644 index 0000000..941cbc2 --- /dev/null +++ b/R/regionalize.R @@ -0,0 +1,78 @@ +#' Estimate Regions by Geographic Features +#' +#' This offers a basic method for dividing a shape into separate pieces +#' +#' @param shp `sf` tibble to estimate regions for +#' @param lines `sf` tibble which divides `shp` into regions +#' @param adj adjacency graph +#' @templateVar epsg TRUE +#' @template template +#' +#' @return integer vector of regions with `nrow(shp)` entries +#' @export +#' +#' @examples +#' data(towns) +#' # make some weird roadlike feature passing through the towns +#' lines <- sf::st_sfc(sf::st_linestring(sf::st_coordinates(sf::st_centroid(towns))), +#' crs = sf::st_crs(towns) +#' ) +#' regionalize(towns, lines) +regionalize <- function(shp, lines, adj = adjacency(shp), epsg = 3857) { + pairs <- make_planar_pair(shp, lines, epsg = epsg) + shp <- pairs$x + lines <- pairs$y + + ec <- edge_center(shp, adj) + breaks <- geos::geos_intersects_any(ec, lines) + ec_sub <- dplyr::as_tibble(ec)[breaks, 1:2] + + for (i in seq_len(nrow(ec_sub))) { + adj <- subtract_edge(adj, ec_sub$i[i], ec_sub$j[i]) + } + + contiguity(adj, rep(0, nrow(shp))) +} + + +edge_center <- function(shp, adj) { + centers <- geos::geos_centroid(shp) + nb <- lapply(adj, function(x) { + x + 1L + }) + edgedf <- tibble::tibble( + start = rep(seq_along(nb), lengths(nb)), + finish = unlist(nb) + ) + + edgedf <- edgedf |> + dplyr::mutate(i = pmin(.data$start, .data$finish), j = pmax(.data$start, .data$finish)) |> + dplyr::select('i', 'j') + edgedf <- edgedf[!duplicated(edgedf), ] + + is <- edgedf$i + js <- edgedf$j + + shps <- lapply(seq_along(is), function(x) { + geos::geos_make_linestring( + x = c(geos::geos_x(centers[[is[x]]]), geos::geos_x(centers[[js[x]]])), + y = c(geos::geos_y(centers[[is[x]]]), geos::geos_y(centers[[js[x]]])), + crs = sf::st_crs(shp) + ) |> + sf::st_as_sfc() |> + sf::st_geometrycollection() + }) |> + sf::st_sfc(crs = sf::st_crs(shp)) |> + sf::st_collection_extract('LINESTRING') + + edgedf |> + dplyr::mutate( + geometry = shps + ) |> + sf::st_as_sf() +} + +# region_voroni_method <- function(from, to) { +# z <- sf::st_union(to) +# vor <- st_voronoi(from) +# } diff --git a/R/roxygen.R b/R/roxygen.R new file mode 100644 index 0000000..d767bd2 --- /dev/null +++ b/R/roxygen.R @@ -0,0 +1,7 @@ +roxy_epsg <- function() { + 'numeric EPSG code to planarize to. Default is 3857.' +} + +roxy_tolerance <- function() { + 'positive numeric tolerance to simplify by. Default is 0.01.' +} diff --git a/R/rpvnearme.R b/R/rpvnearme.R new file mode 100644 index 0000000..0146c84 --- /dev/null +++ b/R/rpvnearme.R @@ -0,0 +1,33 @@ +#' Get Racially Polarized Voting Dataset from RPV Near Me +#' +#' @param state the state postal code of the state +#' @param version the version of the data to use. `1` for the original, `2` for the extended. +#' +#' @return a tibble of precinct-level estimates of votes (party) by race +#' @export +#' +#' @examples +#' get_rpvnearme('DE') +get_rpvnearme <- function(state, version = c(1, 2)) { + + cli::cli_inform( + 'Data sourced from the RPV Near Me {.url https://www.rpvnearme.org/}.', + .frequency = 'once', + .frequency_id = 'cite_rpvnearme' + ) + + vers <- match.arg(as.character(version), as.character(1:2)) + + vers <- ifelse(vers == 1, '', '_b') + + if (missing(state)) { + cli::cli_abort('Please provide a postal code, fips code, or name to state.') + } + + state <- censable::match_abb(state) + base_path <- stringr::str_glue( + 'https://raw.githubusercontent.com/electionlawclinic/rpvnearme/main/data/{state}_county_2020_precinct{vers}.csv' + ) + + readr::read_csv(base_path, show_col_types = FALSE) +} \ No newline at end of file diff --git a/R/seam.R b/R/seam.R index 712d70c..38b9d45 100644 --- a/R/seam.R +++ b/R/seam.R @@ -9,41 +9,42 @@ #' #' @return adjacency list #' @export -#' +#' #' @concept seam -#' +#' #' @examples -#' data("rockland") -#' data("orange") -#' data("nrcsd") -#' +#' data('rockland') +#' data('orange') +#' data('nrcsd') +#' #' o_and_r <- rbind(orange, rockland) -#' o_and_r <- o_and_r %>% geo_filter(nrcsd) %>% geo_trim(nrcsd) +#' o_and_r <- o_and_r %>% +#' geo_filter(nrcsd) %>% +#' geo_trim(nrcsd) #' adj <- adjacency(o_and_r) -#' +#' #' seam_rip(adj, o_and_r, 'county', c('071', '087')) -#' +#' seam_rip <- function(adj, shp, admin, seam, epsg = 3857) { - shp <- make_planar_pair(shp, epsg = epsg)$x - + admin <- shp[[admin]] - + if (length(seam) < 2) { cli::cli_abort('{.arg seam} must have at least two entries.') } - + combs <- utils::combn(seam, 2) - + for (i in seq_len(ncol(combs))) { admin_a <- which(admin == combs[1, i]) admin_b <- which(admin == combs[2, i]) - + seams <- tidyr::expand_grid(admin_a, admin_b) adj <- subtract_edge(adj, seams$admin_a, seams$admin_b) } - - adj + + adj } #' Filter Shape to Geographies Along Border @@ -54,37 +55,38 @@ seam_rip <- function(adj, shp, admin, seam, epsg = 3857) { #' @param seam administrative units to filter by #' @templateVar epsg TRUE #' @template template -#' +#' #' @return subset of shp #' @export #' @concept seam #' #' @examples -#' data("rockland") -#' data("orange") -#' data("nrcsd") -#' +#' data('rockland') +#' data('orange') +#' data('nrcsd') +#' #' o_and_r <- rbind(orange, rockland) -#' o_and_r <- o_and_r %>% geo_filter(nrcsd) %>% geo_trim(nrcsd) +#' o_and_r <- o_and_r %>% +#' geo_filter(nrcsd) %>% +#' geo_trim(nrcsd) #' adj <- adjacency(o_and_r) -#' +#' #' seam_geom(adj, shp = o_and_r, admin = 'county', seam = c('071', '087')) -#' +#' seam_geom <- function(adj, shp, admin, seam, epsg = 3857) { - shp <- make_planar_pair(shp, epsg = epsg)$x - + admin <- shp[[admin]] - + admin_a <- which(admin == seam[1]) admin_b <- which(admin == seam[2]) - - keep_a <- vapply(seq_along(admin_a), function(i){ - any((adj[[admin_a[i]]] + 1L) %in% admin_b) + + keep_a <- vapply(seq_along(admin_a), function(i) { + any((adj[[admin_a[i]]] + 1L) %in% admin_b) }, FALSE) - keep_b <- vapply(seq_along(admin_b), function(i){ - any((adj[[admin_b[i]]] + 1L) %in% admin_a) + keep_b <- vapply(seq_along(admin_b), function(i) { + any((adj[[admin_b[i]]] + 1L) %in% admin_a) }, FALSE) keep <- sort(c(admin_a[keep_a], admin_b[keep_b])) @@ -99,55 +101,58 @@ seam_geom <- function(adj, shp, admin, seam, epsg = 3857) { #' @param seam administrative units to filter by #' @templateVar epsg TRUE #' @template template -#' +#' #' @return subset of adj #' @export #' @concept seam #' #' @examples -#' data("rockland") -#' data("orange") -#' data("nrcsd") -#' +#' data('rockland') +#' data('orange') +#' data('nrcsd') +#' #' o_and_r <- rbind(orange, rockland) -#' o_and_r <- o_and_r %>% geo_filter(nrcsd) %>% geo_trim(nrcsd) +#' o_and_r <- o_and_r %>% +#' geo_filter(nrcsd) %>% +#' geo_trim(nrcsd) #' adj <- adjacency(o_and_r) -#' +#' #' seam_adj(adj, shp = o_and_r, admin = 'county', seam = c('071', '087')) -#' +#' seam_adj <- function(adj, shp, admin, seam, epsg = 3857) { - shp <- make_planar_pair(shp, epsg = epsg)$x - + admin <- shp[[admin]] - + admin_a <- which(admin == seam[1]) admin_b <- which(admin == seam[2]) - - keep_a <- vapply(seq_along(admin_a), function(i){ - any((adj[[admin_a[i]]] + 1L) %in% admin_b) + + keep_a <- vapply(seq_along(admin_a), function(i) { + any((adj[[admin_a[i]]] + 1L) %in% admin_b) }, FALSE) - - keep_b <- vapply(seq_along(admin_b), function(i){ - any((adj[[admin_b[i]]] + 1L) %in% admin_a) + + keep_b <- vapply(seq_along(admin_b), function(i) { + any((adj[[admin_b[i]]] + 1L) %in% admin_a) }, FALSE) - + admin_a <- admin_a[keep_a] admin_b <- admin_b[keep_b] - - lapply(seq_along(adj), - function(i){ - if (i %in% admin_a) { - x <- adj[[i]] - return(x[x %in% (admin_b - 1L)]) - } else if (i %in% admin_b) { - x <- adj[[i]] - return(x[x %in% (admin_a - 1L)]) - } - integer() - }) + + lapply( + seq_along(adj), + function(i) { + if (i %in% admin_a) { + x <- adj[[i]] + return(x[x %in% (admin_b - 1L)]) + } else if (i %in% admin_b) { + x <- adj[[i]] + return(x[x %in% (admin_a - 1L)]) + } + integer() + } + ) } - + #' Suggest Edges to Connect Two Sides of a Border #' #' @param shp sf tibble where admin column is found @@ -161,34 +166,39 @@ seam_adj <- function(adj, shp, admin, seam, epsg = 3857) { #' @concept seam #' #' @examples -#' data("rockland") -#' data("orange") -#' data("nrcsd") -#' +#' data('rockland') +#' data('orange') +#' data('nrcsd') +#' #' o_and_r <- rbind(orange, rockland) -#' o_and_r <- o_and_r %>% geo_filter(nrcsd) %>% geo_trim(nrcsd) +#' o_and_r <- o_and_r %>% +#' geo_filter(nrcsd) %>% +#' geo_trim(nrcsd) #' adj <- adjacency(o_and_r) -#' +#' #' adds <- seam_sew(o_and_r, 'county', c('071', '087')) #' adj <- adj %>% add_edge(adds$v1, adds$v2) -#' +#' seam_sew <- function(shp, admin, seam, epsg = 3857) { - shp <- make_planar_pair(shp, epsg = epsg)$x - + cents <- shp %>% geos_centerish() - - vr <- cents %>% - geos::geos_make_collection() %>% - geos::geos_voronoi_polygons() %>% + + vr <- cents %>% + geos::geos_make_collection() %>% + geos::geos_voronoi_polygons() %>% geos::geos_geometry_n(seq_len(geos::geos_num_geometries(.))) - + vr <- vr[unlist(geos::geos_intersects_matrix(cents, vr))] adj <- seam_adj(adj_geos(vr), shp, admin, seam) - - tibble(v1 = unlist(lapply(seq_along(adj), function(i){rep(i, length(adj[[i]]))})), - v2 = unlist(adj) + 1L) %>% + + tibble( + v1 = unlist(lapply(seq_along(adj), function(i) { + rep(i, length(adj[[i]])) + })), + v2 = unlist(adj) + 1L + ) %>% dplyr::filter(.data$v1 < .data$v2) -} \ No newline at end of file +} diff --git a/R/sort.R b/R/sort.R index 53f014a..29f25e2 100644 --- a/R/sort.R +++ b/R/sort.R @@ -15,11 +15,10 @@ #' data(checkerboard) #' geo_sort(checkerboard) geo_sort <- function(shp, epsg = 3857) { - if (missing(shp)) { cli::cli_abort('{.arg shp} is required.') } - + shp <- make_planar_pair(shp, epsg = epsg)$x bbox <- bbox_geos(shp) diff --git a/R/split.R b/R/split.R index fe3f77d..7322cf5 100644 --- a/R/split.R +++ b/R/split.R @@ -52,24 +52,24 @@ split_precinct <- function(lower, precinct, split_by, lower_wt, split_by_id, eps if (nrow(split_by) < 2) { cli::cli_abort('{.arg split_by} requires at least two geographies to consider.') } - + pairs <- make_planar_pair(lower, precinct, epsg = epsg) lower <- pairs$x precinct <- pairs$y pairs <- make_planar_pair(lower, split_by, epsg = epsg) split_by <- pairs$y - + lower <- lower %>% geo_filter(precinct, epsg = FALSE) %>% geo_trim(precinct, epsg = FALSE) - split_by <- split_by %>% + split_by <- split_by %>% geo_filter(precinct, epsg = FALSE) matches <- geo_match(from = lower, to = split_by, epsg = FALSE) out_geo <- lower %>% - dplyr::select(.data$geometry) %>% + dplyr::select("geometry") %>% dplyr::mutate(new = matches) %>% dplyr::group_by(.data$new) %>% dplyr::summarize(geometry = sf::st_union(.data$geometry)) diff --git a/R/vest.R b/R/vest.R index 398c3d8..92201f4 100644 --- a/R/vest.R +++ b/R/vest.R @@ -1,12 +1,12 @@ -#' Get VEST Dataset +#' Get Voting and Election Science Team ("VEST") Dataset #' #' @param state two letter state abbreviation -#' @param year year in 2016, 2018, or 2020 +#' @param year year any in 2016-2021 #' @param path folder to put shape in. Default is \code{tempdir()} #' @param clean_names Clean names. Default is \code{TRUE}. If \code{FALSE}, #' returns default names. -#' @templateVar epsg TRUE -#' @template template +#' @param epsg `r roxy_epsg()` +#' @param ... additional arguments passed to [sf::read_sf()] #' #' @return sf tibble #' @export @@ -17,13 +17,18 @@ #' # Requires Dataverse API #' shp <- get_vest('CO', 2020) #' } -get_vest <- function(state, year, path = tempdir(), clean_names = TRUE, epsg = 3857) { +get_vest <- function(state, year, path = tempdir(), clean_names = TRUE, epsg = 3857, ...) { abb <- tolower(censable::match_abb(state)) file_name <- stringr::str_glue('{abb}_{year}.zip') doi <- vest_doi()[as.character(year)] - + cite_url <- paste0('https://doi.org/', stringr::str_sub(doi, 5)) + cli::cli_inform( + 'Data sourced from the Voting and Election Science Team {.url {cite_url}}.', + .frequency = 'once', + .frequency_id = 'cite_vest' + ) tf <- tempfile(fileext = '.zip') x <- dataverse::get_file_by_name( @@ -36,16 +41,16 @@ get_vest <- function(state, year, path = tempdir(), clean_names = TRUE, epsg = 3 poss <- sf::st_layers(dsn = path)[[1]] up_path <- poss[stringr::str_starts(string = poss, stringr::str_glue('{abb}_{year}'))] - out <- sf::st_read(dsn = paste0(path, '/', up_path, '.shp')) + out <- sf::read_sf(dsn = paste0(path, '/', up_path, '.shp'), ...) if (clean_names) { out <- out %>% clean_vest() } - + make_planar_pair(out, epsg = epsg)$x } -#' Clean Vest Names +#' Clean VEST Names #' #' @param data sf tibble from VEST #' @@ -89,7 +94,7 @@ clean_vest <- function(data) { #' #' @return character abbreviations for states #' @export -#' +#' #' @concept datasets #' @examples #' \dontrun{ @@ -105,17 +110,20 @@ vest_states <- function(year) { base::setdiff(out, 'do') } -#' Vest DOIs +#' VEST DOIs #' @keywords internal vest_doi <- function() { c( + `2021` = 'doi:10.7910/DVN/FDMI5F', `2020` = 'doi:10.7910/DVN/K7760H', + `2019` = 'doi:10.7910/DVN/2AJUII', `2018` = 'doi:10.7910/DVN/UBKYRU', + `2017` = 'doi:10.7910/DVN/VNJAB1', `2016` = 'doi:10.7910/DVN/NH5S2I' ) } -#' Vest Parties +#' VEST Parties #' @keywords internal vest_party <- function(str) { p <- stringr::str_sub(str, 7, 7) @@ -142,40 +150,41 @@ vest_party <- function(str) { p } -#' Vest Abbreviations +#' VEST Abbreviations #' @keywords internal vest_abb <- function(x) { - structure(list( - a = c( - 'A##', 'AGR', 'ATG', 'AUD', 'CFO', - 'CHA', 'COC', 'COM', 'CON', 'COU', 'CSC', 'DEL', 'GOV', - 'H##', 'HOD', 'HOR', 'INS', 'LAB', 'LND', 'LTG', 'MAY', - 'MNI', 'PSC', 'PUC', 'RGT', 'SAC', 'SBE', 'SCC', 'SOC', - 'SOS', 'SPI', 'SPL', 'SSC', 'TAX', 'TRE', 'UBR', 'USS' + structure( + list( + a = c( + 'A##', 'AGR', 'ATG', 'AUD', 'CFO', + 'CHA', 'COC', 'COM', 'CON', 'COU', 'CSC', 'DEL', 'GOV', + 'H##', 'HOD', 'HOR', 'INS', 'LAB', 'LND', 'LTG', 'MAY', + 'MNI', 'PSC', 'PUC', 'RGT', 'SAC', 'SBE', 'SCC', 'SOC', + 'SOS', 'SPI', 'SPL', 'SSC', 'TAX', 'TRE', 'UBR', 'USS' + ), + b = c( + 'Ballot amendment, where ## is an identifier', 'Commissioner of Agriculture', + 'Attorney General', 'Auditor', 'Chief Financial Officer', + 'Council Chairman', 'Corporation Commissioner', 'Comptroller', + 'State Controller', 'City Council Member', 'Clerk of the Supreme Court', + 'Delegate to the U.S. House', 'Governor', 'U.S. House, where ## is the district number. AL: at large.', + 'House of Delegates, accompanied by a HOD_DIST column indicating district number', + 'U.S. House, accompanied by a HOR_DIST column indicating district number', + 'Insurance Commissioner', 'Labor Commissioner', 'Commissioner of Public/State Lands', + 'Lieutenant Governor', 'Mayor', 'State Mine Inspector', 'Public Service Commissioner', + 'Public Utilities Commissioner', 'State University Regent', + 'State Appeals Court (in AL: Civil Appeals)', 'State Board of Education', + 'State Court of Criminal Appeals', 'Secretary of Commonwealth', + 'Secretary of State', 'Superintendent of Public Instruction', + 'Commissioner of School and Public Lands', 'State Supreme Court', + 'Tax Commissioner', 'Treasurer', 'University Board of Regents/Trustees/Governors', + 'U.S. Senate' + ) ), - b = c( - 'Ballot amendment, where ## is an identifier', 'Commissioner of Agriculture', - 'Attorney General', 'Auditor', 'Chief Financial Officer', - 'Council Chairman', 'Corporation Commissioner', 'Comptroller', - 'State Controller', 'City Council Member', 'Clerk of the Supreme Court', - 'Delegate to the U.S. House', 'Governor', 'U.S. House, where ## is the district number. AL: at large.', - 'House of Delegates, accompanied by a HOD_DIST column indicating district number', - 'U.S. House, accompanied by a HOR_DIST column indicating district number', - 'Insurance Commissioner', 'Labor Commissioner', 'Commissioner of Public/State Lands', - 'Lieutenant Governor', 'Mayor', 'State Mine Inspector', 'Public Service Commissioner', - 'Public Utilities Commissioner', 'State University Regent', - 'State Appeals Court (in AL: Civil Appeals)', 'State Board of Education', - 'State Court of Criminal Appeals', 'Secretary of Commonwealth', - 'Secretary of State', 'Superintendent of Public Instruction', - 'Commissioner of School and Public Lands', 'State Supreme Court', - 'Tax Commissioner', 'Treasurer', 'University Board of Regents/Trustees/Governors', - 'U.S. Senate' + row.names = c(NA, -37L), + class = c( + 'tbl_df', + 'tbl', 'data.frame' ) - ), - row.names = c(NA, -37L), - class = c( - 'tbl_df', - 'tbl', 'data.frame' - ) ) } diff --git a/README.Rmd b/README.Rmd index 6059944..ad625b9 100644 --- a/README.Rmd +++ b/README.Rmd @@ -13,12 +13,13 @@ knitr::opts_chunk$set( ) ``` -# geomander +# geomander [![R-CMD-check](https://github.com/christopherkenny/geomander/workflows/R-CMD-check/badge.svg)](https://github.com/christopherkenny/geomander/actions) [![CRAN status](https://www.r-pkg.org/badges/version/geomander)](https://CRAN.R-project.org/package=geomander) ![CRAN downloads](http://cranlogs.r-pkg.org/badges/grand-total/geomander) +[![geomander status badge](https://christopherkenny.r-universe.dev/badges/geomander)](https://christopherkenny.r-universe.dev/geomander) Focuses on creating data sets and other tools that help make understanding gerrymandering faster and easier. Designed for easy preparation to run simulation analysis with the R package redist, but is aimed at the geographic aspects of redistricting, not partitioning methods. Most of these tools are gathered from seminar papers and do not correspond to a single publication. @@ -38,8 +39,6 @@ And the development version from [GitHub](https://github.com/) with: devtools::install_github("christopherkenny/geomander") ``` - - ## Examples A very common task is aggregating block data to precincts. @@ -83,4 +82,4 @@ And estimate down to blocks disagg <- geo_estimate_down(from = va18sub, to = block, wts = block$vap, value = va18sub$G18USSRSTE) ``` -For more information, see the documentation and vignettes, available at [https://www.christophertkenny.com/geomander/](https://www.christophertkenny.com/geomander/) +For more information, see the documentation and vignettes, available at [https://christophertkenny.com/geomander/](https://christophertkenny.com/geomander/) diff --git a/README.md b/README.md index 9ded145..132219c 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ -# geomander +# geomander @@ -10,6 +10,8 @@ status](https://www.r-pkg.org/badges/version/geomander)](https://CRAN.R-project.org/package=geomander) ![CRAN downloads](http://cranlogs.r-pkg.org/badges/grand-total/geomander) +[![geomander status +badge](https://christopherkenny.r-universe.dev/badges/geomander)](https://christopherkenny.r-universe.dev/geomander) Focuses on creating data sets and other tools that help make @@ -42,28 +44,22 @@ A very common task is aggregating block data to precincts. ``` r library(geomander) library(tidyverse) -#> -- Attaching packages --------------------------------------- tidyverse 1.3.1 -- -#> v ggplot2 3.3.5 v purrr 0.3.4 -#> v tibble 3.1.6 v dplyr 1.0.7 -#> v tidyr 1.1.4 v stringr 1.4.0 -#> v readr 2.1.0 v forcats 0.5.1 -#> -- Conflicts ------------------------------------------ tidyverse_conflicts() -- -#> x dplyr::filter() masks stats::filter() -#> x dplyr::lag() masks stats::lag() +#> ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ── +#> ✔ dplyr 1.1.4 ✔ readr 2.1.4 +#> ✔ forcats 1.0.0 ✔ stringr 1.5.1 +#> ✔ ggplot2 3.4.4 ✔ tibble 3.2.1 +#> ✔ lubridate 1.9.3 ✔ tidyr 1.3.0 +#> ✔ purrr 1.0.2 +#> ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ── +#> ✖ dplyr::filter() masks stats::filter() +#> ✖ dplyr::lag() masks stats::lag() +#> ℹ Use the conflicted package () to force all conflicts to become errors # load precincts data('va18sub') # create block data block <- create_block_table(state = 'VA', county = '087') -#> Getting data from the 2020 decennial Census -#> Downloading feature geometry from the Census website. To cache shapefiles for use in future sessions, set `options(tigris_use_cache = TRUE)`. -#> Using the PL 94-171 Redistricting Data summary file -#> Note: 2020 decennial Census data use differential privacy, a technique that -#> introduces errors into data to preserve respondent confidentiality. -#> i Small counts should be interpreted with caution. -#> i See https://www.census.gov/library/fact-sheets/2021/protecting-the-confidentiality-of-the-2020-census-redistricting-data.html for additional guidance. -#> This message is displayed once per session. # match the geographies matches <- geo_match(from = block, to = va18sub) @@ -99,4 +95,4 @@ disagg <- geo_estimate_down(from = va18sub, to = block, wts = block$vap, value = ``` For more information, see the documentation and vignettes, available at - + diff --git a/_pkgdown.yml b/_pkgdown.yml index fa543f0..c3d1151 100644 --- a/_pkgdown.yml +++ b/_pkgdown.yml @@ -1,4 +1,4 @@ -url: https://www.christophertkenny.com/geomander/ +url: https://christophertkenny.com/geomander template: params: bootswatch: journal diff --git a/cran-comments.md b/cran-comments.md index 9bfd63a..9eacf22 100644 --- a/cran-comments.md +++ b/cran-comments.md @@ -1,14 +1,16 @@ ## Test environments -* local R installation (Windows 10), R 4.1.1 -* local R installation (macOS), R 4.1.1 +* local R installation (Windows 11), R 4.2.3 +* local R installation (macOS), R 4.2.3 * ubuntu 20.04 (on GitHub Actions), (devel and release) * windows-latest (on GitHub Actions), (release) * macOS-latest (on GitHub Actions), (release) -* Windows (on Winbuilder), (release) +* Windows (on Winbuilder), (devel and release) ## R CMD check results 0 errors | 0 warnings | 0 notes ## Additional Notes -* Remove `spdep` dependency to avoid timeouts on examples. Verified on Winbuilder that there are no new notes based on this. \ No newline at end of file +* Fixes the un-used import of Rcpp. +* Makes use of `redist` in vignettes conditional. +* Updates the CITATION file to use `bibentry()` and remove `personList()` call. \ No newline at end of file diff --git a/data-raw/eda.R b/data-raw/eda.R new file mode 100644 index 0000000..b70cdbc --- /dev/null +++ b/data-raw/eda.R @@ -0,0 +1,68 @@ +library(tidyverse) +library(dataverse) + +contents <- dataverse::dataverse_contents('eda') +ids <- sapply(contents, \(y) y$identifier) +ids <- Filter(\(x) !x %in% c('DVN/EQCMZM', 'DVN/DDWGUI'), ids) # MN and UT are deacc. +ids <- paste0('10.7910/', ids) +# dataverse::dataset_metadata(paste0('10.7910/', ids[1])) + +out <- lapply( + ids, + \(id) dataverse::dataset_metadata(id) +) + +ns <- sapply(out, \(x) x$fields$value[[1]]) + +all_files <- lapply(ids, function(id) { + id %>% + dataverse::dataset_files() %>% + purrr::map_chr(\(z) z$label) +}) + +eda <- tibble::tibble( + id = ids, name = ns, files = all_files +) %>% + mutate( + state = ifelse( + str_detect(name, ' Data Files'), + sapply(name, \(n) censable::match_abb(str_remove(n, ' Data Files'))), + NA_character_ + ) + ) %>% + unnest(state) %>% + mutate(state = tolower(state)) + +eda_save <- eda %>% + filter(!is.na(state)) %>% + mutate(files = map(files, \(x) Filter(\(y) stringr::str_detect(y, '.zip'), x))) + +eda_aug <- tibble::tribble( + ~state, ~files, + 'ca', 'CA_2008_2010.tab', + 'mn', c('MN_final.dbf', 'MN_final.sbn', 'MN_final.sbx', 'MN_final.shp', 'MN_final.shx'), + 'oh', c('OH_final.dbf', 'OH_final.sbn', 'OH_final.sbx', 'OH_final.shp', 'OH_final.shx'), + 'il', c('IL_final.dbf', 'IL_final.sbn', 'IL_final.sbx', 'IL_final.shp', 'IL_final.shx') +) + +eda_save <- rows_update(eda_save, eda_aug, by = 'state') +# dput(eda_save) + +ND_files <- eda %>% + filter(id == '10.7910/DVN/YN4TLR') %>% + pull(files) %>% + .[[1]] %>% + Filter(\(x) substr(x, 1, 2) == 'ND', .) + +# dataverse::dataset_files(ids[10]) + +tf <- tempfile(fileext = '.zip') +x <- dataverse::get_file_by_name('ND_Shapefile.zip', ids[10]) %>% + writeBin(con = tf) +utils::unzip(tf, exdir = tempdir()) +shp <- sf::st_read(paste0(tempdir(), '/ND_final.shp')) + +tabs <- lapply( + ND_files, + function(f) dataverse::get_dataframe_by_name(f, '10.7910/DVN/YN4TLR') +) diff --git a/geomander.Rproj b/geomander.Rproj index 21a4da0..eaa6b81 100644 --- a/geomander.Rproj +++ b/geomander.Rproj @@ -15,3 +15,4 @@ LaTeX: pdfLaTeX BuildType: Package PackageUseDevtools: Yes PackageInstallArgs: --no-multiarch --with-keep.source +PackageRoxygenize: rd,collate,namespace diff --git a/inst/CITATION b/inst/CITATION index 2abe3ba..270f26a 100644 --- a/inst/CITATION +++ b/inst/CITATION @@ -1,13 +1,13 @@ -citHeader("To cite geomander in publications use:") +citHeader("To cite `geomander` in publications use:") -citEntry(entry = "misc", - title = "{geomander}: Geographic Tools for Studying Gerrymandering", - author = personList(as.person("Christopher T. Kenny")), - howpublished = "Available at The Comprehensive R Archive Network (CRAN)", - year = "2021", - url = "https://CRAN.R-project.org/package=geomander", - textVersion = paste(" Christopher T. Kenny (2021).", - "geomander: Geographic Tools for Studying Gerrymandering.", - "Available at The Comprehensive R Archive Network (CRAN).", - "URL https://CRAN.R-project.org/package=geomander.") -) +bibentry( + bibtype = "Manual", + title = "{geomander}: Geographic Tools for Studying Gerrymandering", + author = c( + person("Christopher T.", "Kenny", email = "christopherkenny@fas.harvard.edu", role = c("aut", "cre")) + ), + year = "2023", + note = "R package", + key = "geomander", + url = "https://christophertkenny.com/geomander/" +) \ No newline at end of file diff --git a/man-roxygen/template.R b/man-roxygen/template.R index c62caf1..98cf2f7 100644 --- a/man-roxygen/template.R +++ b/man-roxygen/template.R @@ -1 +1,2 @@ #' <%=ifelse(exists("epsg") && epsg, "@param epsg numeric EPSG code to planarize to. Default is 3857.", "") %> +#' <%=ifelse(exists("tolerance") && tolerance, "@param tolerance positive numeric tolerance to simplify by. Default is 0.01.", "") %> diff --git a/man/add_edge.Rd b/man/add_edge.Rd index f918b8e..3f7d816 100644 --- a/man/add_edge.Rd +++ b/man/add_edge.Rd @@ -4,16 +4,24 @@ \alias{add_edge} \title{Add Edges to an Adjacency List} \usage{ -add_edge(adj, v1, v2, zero = TRUE) +add_edge(adj, v1, v2, ids = NULL, zero = TRUE) } \arguments{ \item{adj}{list of adjacent precincts} -\item{v1}{integer or integer array for first vertex to connect. -If array, connects each to corresponding entry in v2.} +\item{v1}{vector of vertex identifiers for the first vertex. Can be an +integer index or a value to look up in \code{ids}, if that argument is provided. +If more than one identifier is present, connects each to corresponding +entry in v2.} -\item{v2}{integer or integer array for second vertex to connect. -If array, connects each to corresponding entry in v1.} +\item{v2}{vector of vertex identifiers for the second vertex. Can be an +integer index or a value to look up in \code{ids}, if that argument is provided. +If more than one identifier is present, connects each to corresponding +entry in v2.} + +\item{ids}{A vector of identifiers which is used to look up the row indices +for the vertices. If provided, the entries in \code{v1} and \code{v2} must match +exactly one entry in \code{ids}.} \item{zero}{boolean, TRUE if the list is zero indexed. False if one indexed.} } @@ -26,7 +34,8 @@ Add Edges to an Adjacency List \examples{ data(towns) adj <- adjacency(towns) -add_edge(adj, 2, 3) +add_edge(adj, 2, 3) +add_edge(adj, "West Haverstraw", "Stony Point", towns$MUNI) } \concept{fix} diff --git a/man/baf_to_vtd.Rd b/man/baf_to_vtd.Rd new file mode 100644 index 0000000..2880e69 --- /dev/null +++ b/man/baf_to_vtd.Rd @@ -0,0 +1,47 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/baf_to_vtd.R +\name{baf_to_vtd} +\alias{baf_to_vtd} +\title{Estimate Plans from a Block Assignment File to Voting Districts} +\usage{ +baf_to_vtd(baf, plan_name, GEOID = "GEOID") +} +\arguments{ +\item{baf}{a tibble representing a block assignment file.} + +\item{plan_name}{character. Name of column in \code{baf} which corresponds to the districts.} + +\item{GEOID}{character. Name of column which corresponds to each block's GEOID, +sometimes called "BLOCKID". Default is \code{'GEOID'}.} +} +\value{ +a tibble with a vtd-level assignment file +} +\description{ +District lines are often provided at the census block level, but analyses +often occur at the voting district level. This provides a simple way to +estimate the block level to the voting district level. +} +\details{ +If a voting district is split between blocks, this currently uses the most +common district. +} +\examples{ +# Not guaranteed to reach download from redistrict2020.org +\dontrun{ +# download and read baf ---- +url <- 'https://www.redistrict2020.org/files/DE-2021-01/DE_SLDU_bef.zip' +tf <- tempfile('.zip') +utils::download.file(url, tf) +utils::unzip(tf, exdir = dirname(tf)) +baf <- readr::read_csv( + file = paste0(dirname(tf), '/DE_SLDU_bef.csv'), + col_types = 'ci' +) +names(baf) <- c('GEOID', 'ssd_20') + +# convert to vtd level ---- +baf_to_vtd(baf = baf, plan_name = 'ssd_20', 'GEOID') +} + +} diff --git a/man/check_contiguity.Rd b/man/check_contiguity.Rd index 12d37ab..afcb6d7 100644 --- a/man/check_contiguity.Rd +++ b/man/check_contiguity.Rd @@ -2,26 +2,56 @@ % Please edit documentation in R/contiguity.R \name{check_contiguity} \alias{check_contiguity} +\alias{cct} +\alias{ccm} \title{Check Contiguity by Group} \usage{ check_contiguity(adj, group) + +cct(adj, group) + +ccm(adj, group) } \arguments{ \item{adj}{adjacency list} -\item{group}{array of group identifiers. Typically district numbers or county names.} +\item{group}{array of group identifiers. Typically district numbers or county names. +Defaults to 1 if no input is provided, checking that the adjacency list itself is +one connected component.} } \value{ -tibble with a column for each of inputted group, created group number, and the -identified connected component number +tibble with a column for each of inputted group, created group number, +and the identified connected component number } \description{ -Check Contiguity by Group +Given a zero-indexed adjacency list and an array of group identifiers, this +returns a tibble which identifies the connected components. The three columns +are \code{group} for the inputted group, \code{group_number} which uniquely identifies each +group as a positive integer, and \code{component} which identifies the connected +component number for each corresponding entry of adjacency and group. If everything +is connected within the group, then each element of \code{component} will be \code{1}. +Otherwise, the largest component is given the value \code{1}, the next largest \code{2}, +and so on. +} +\details{ +If nothing is provided to group, it will default to a vector of ones, checking +if the adjacency graph is connected. + +\code{cct()} is shorthand for creating a table of the component values. If everything +is connected within each group, it returns a value of 1. In general, it returns +a frequency table of components. + +\code{ccm()} is shorthand for getting the maximum component value. It returns the +maximum number of components that a group is broken into. +This returns 1 if each group is connected. #' } \examples{ data(checkerboard) adj <- adjacency(checkerboard) +# These each indicate the graph is connected. check_contiguity(adj) +cct(adj) +ccm(adj) } \concept{fix} diff --git a/man/check_polygon_contiguity.Rd b/man/check_polygon_contiguity.Rd index cb1b6ac..e90130c 100644 --- a/man/check_polygon_contiguity.Rd +++ b/man/check_polygon_contiguity.Rd @@ -20,7 +20,7 @@ tibble with a column for each of inputted group, created group number, and the identified connected component number } \description{ -Cast `shp` to component polygons, build the adjacency, and check the contiguity. +Cast \code{shp} to component polygons, build the adjacency, and check the contiguity. Avoids issues where a precinct is actually a multipolygon } \examples{ diff --git a/man/clean_vest.Rd b/man/clean_vest.Rd index d3f0612..9316594 100644 --- a/man/clean_vest.Rd +++ b/man/clean_vest.Rd @@ -2,7 +2,7 @@ % Please edit documentation in R/vest.R \name{clean_vest} \alias{clean_vest} -\title{Clean Vest Names} +\title{Clean VEST Names} \usage{ clean_vest(data) } @@ -13,7 +13,7 @@ clean_vest(data) data with cleaned names } \description{ -Clean Vest Names +Clean VEST Names } \examples{ data(va18sub) diff --git a/man/create_block_table.Rd b/man/create_block_table.Rd index 6bf17bd..1047c1b 100644 --- a/man/create_block_table.Rd +++ b/man/create_block_table.Rd @@ -10,8 +10,7 @@ create_block_table( geometry = TRUE, year = 2020, mem = FALSE, - epsg = 3857, - geography + epsg = 3857 ) } \arguments{ @@ -26,8 +25,6 @@ create_block_table( \item{mem}{Default is FALSE. Set TRUE to use memoized backend.} \item{epsg}{numeric EPSG code to planarize to. Default is 3857.} - -\item{geography}{Deprecated. Use geometry.} } \value{ dataframe with data for each block in the selected region. Data includes diff --git a/man/create_tract_table.Rd b/man/create_tract_table.Rd index 8a7cdb2..db407fc 100644 --- a/man/create_tract_table.Rd +++ b/man/create_tract_table.Rd @@ -10,8 +10,7 @@ create_tract_table( geometry = TRUE, year = 2019, mem = FALSE, - epsg = 3857, - geography + epsg = 3857 ) } \arguments{ @@ -26,8 +25,6 @@ create_tract_table( \item{mem}{Default is FALSE. Set TRUE to use memoized backend.} \item{epsg}{numeric EPSG code to planarize to. Default is 3857.} - -\item{geography}{Deprecated. Use geometry.} } \value{ dataframe with data for each tract in the selected region. Data includes diff --git a/man/geo_match.Rd b/man/geo_match.Rd index 21520f2..aa8a50e 100644 --- a/man/geo_match.Rd +++ b/man/geo_match.Rd @@ -4,14 +4,24 @@ \alias{geo_match} \title{Match Across Geographic Layers} \usage{ -geo_match(from, to, method = "center", tiebreaker = TRUE, epsg = 3857) +geo_match( + from, + to, + method = "center", + by = NULL, + tiebreaker = TRUE, + epsg = 3857 +) } \arguments{ \item{from}{smaller geographic level to match up from} \item{to}{larger geographic level to be matched to} -\item{method}{string from center, centroid, point, or area for matching method} +\item{method}{string from 'center', 'centroid', 'point', 'circle', or 'area' for matching method} + +\item{by}{A character vector to match by. One element if both \code{from} and \code{to} share the subsetting column name. +One element with a name (for \code{from}) and one element (for \code{to}).} \item{tiebreaker}{Should ties be broken? boolean. If FALSE, precincts with no matches get value -1 and precincts with multiple matches get value -2.} @@ -24,6 +34,18 @@ Integer Vector of matches length(to) with values in 1:nrow(from) \description{ Match Across Geographic Layers } +\details{ +Methods are as follows: +\itemize{ +\item centroid: matches each element of \code{from} to the \code{to} entry that the geographic centroid intersects +\item center: very similar to centroid, but it matches an arbitrary center point within \code{from} +if the centroid of \code{from} is outside the bounds of from. (This happens for non-convex shapes only). +\item point: matches each element of \code{from} to the \code{to} entry that the "point on surface" intersects. +\item circle: matches each element of \code{from} to the \code{to} entry that the centroid +of the maximum inscribed circle intersects +\item area: matches each element of \code{from} to the \code{to} element which has the largest area overlap +} +} \examples{ library(dplyr) data(checkerboard) diff --git a/man/geos_circle_center.Rd b/man/geos_circle_center.Rd new file mode 100644 index 0000000..4899248 --- /dev/null +++ b/man/geos_circle_center.Rd @@ -0,0 +1,27 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/center.R +\name{geos_circle_center} +\alias{geos_circle_center} +\title{Get the centroid of the maximum inscribed circle} +\usage{ +geos_circle_center(shp, tolerance = 0.01, epsg = 3857) +} +\arguments{ +\item{shp}{An sf dataframe} + +\item{tolerance}{positive numeric tolerance to simplify by. Default is 0.01.} + +\item{epsg}{numeric EPSG code to planarize to. Default is 3857.} +} +\value{ +A geos geometry list +} +\description{ +Returns the centroid of the largest inscribed circle for each shape +} +\examples{ +data(towns) +geos_circle_center(towns) + +} +\concept{center} diff --git a/man/get_alarm.Rd b/man/get_alarm.Rd index fa611f9..643cd44 100644 --- a/man/get_alarm.Rd +++ b/man/get_alarm.Rd @@ -4,19 +4,14 @@ \alias{get_alarm} \title{Get ALARM Dataset} \usage{ -get_alarm( - state, - geometry = TRUE, - file = tempfile(fileext = ".csv"), - epsg = 3857 -) +get_alarm(state, year = 2020, geometry = TRUE, epsg = 3857) } \arguments{ \item{state}{two letter state abbreviation} -\item{geometry}{Default is TRUE. Add geomeetry to the data?} +\item{year}{year to get data for. Either \code{2020} or \code{2010}} -\item{file}{file path to save ALARM csv} +\item{geometry}{Default is TRUE. Add geometry to the data?} \item{epsg}{numeric EPSG code to planarize to. Default is 3857.} } @@ -24,7 +19,7 @@ get_alarm( tibble with election data and optional geometry } \description{ -Get's a dataset from the Algorithm-Assisted Redistricting Methodology Project. +Gets a dataset from the Algorithm-Assisted Redistricting Methodology Project. The current supported data is the 2020 retabulations of the VEST data, which can be downloaded with \code{get_vest}. } @@ -32,9 +27,6 @@ can be downloaded with \code{get_vest}. See the full available data at \url{https://github.com/alarm-redist/census-2020}. } \examples{ -\donttest{ -# Takes a few seconds to run -ak <- get_alarm('AK') -} +ak <- get_alarm('AK', geometry = FALSE) } \concept{datasets} diff --git a/man/get_dra.Rd b/man/get_dra.Rd new file mode 100644 index 0000000..47e51bc --- /dev/null +++ b/man/get_dra.Rd @@ -0,0 +1,33 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/dra_vtd.R +\name{get_dra} +\alias{get_dra} +\title{Get Dave's Redistricting App Dataset} +\usage{ +get_dra(state, year = 2020, geometry = TRUE, clean_names = TRUE, epsg = 3857) +} +\arguments{ +\item{state}{two letter state abbreviation} + +\item{year}{year to get data for. Either \code{2020} or \code{2010}} + +\item{geometry}{Default is TRUE. Add geometry to the data?} + +\item{clean_names}{Clean names. Default is \code{TRUE}. If \code{FALSE}, +returns default names.} + +\item{epsg}{numeric EPSG code to planarize to. Default is 3857.} +} +\value{ +tibble with election data and optional geometry +} +\description{ +Gets a dataset from Dave's Redistricting App. +} +\details{ +See the full available data at \url{https://github.com/dra2020/vtd_data}. +} +\examples{ +ak <- get_dra('AK', geometry = FALSE) +} +\concept{datasets} diff --git a/man/get_heda.Rd b/man/get_heda.Rd new file mode 100644 index 0000000..ee73ecf --- /dev/null +++ b/man/get_heda.Rd @@ -0,0 +1,29 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/heda.R +\name{get_heda} +\alias{get_heda} +\title{Get Harvard Election Data Archive ("HEDA") Dataset} +\usage{ +get_heda(state, path = tempdir(), epsg = 3857, ...) +} +\arguments{ +\item{state}{two letter state abbreviation} + +\item{path}{folder to put shape in. Default is \code{tempdir()}} + +\item{epsg}{numeric EPSG code to planarize to. Default is 3857.} + +\item{...}{additional arguments passed to \code{\link[sf:st_read]{sf::read_sf()}}} +} +\value{ +sf tibble +} +\description{ +Get Harvard Election Data Archive ("HEDA") Dataset +} +\examples{ +\dontshow{if (Sys.getenv('DATAVERSE_KEY') != '') (if (getRversion() >= "3.4") withAutoprint else force)(\{ # examplesIf} +shp <- get_heda('ND') +\dontshow{\}) # examplesIf} +} +\concept{datasets} diff --git a/man/get_lewis.Rd b/man/get_lewis.Rd new file mode 100644 index 0000000..540d366 --- /dev/null +++ b/man/get_lewis.Rd @@ -0,0 +1,29 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/lewis.R +\name{get_lewis} +\alias{get_lewis} +\title{Get historical United States Congressional District Shapefiles} +\usage{ +get_lewis(state, congress) +} +\arguments{ +\item{state}{two letter state abbreviation} + +\item{congress}{congress number, from 1 to 114.} +} +\value{ +a sf tibble of the congressional district boundaries +} +\description{ +Data sourced from the United States Congressional District Shapefiles, primarily +hosted at \url{http://cdmaps.polisci.ucla.edu/}. Files are fetched through the GitHub +repository at \url{https://github.com/JeffreyBLewis/congressional-district-boundaries}. +} +\examples{ +get_lewis(state = 'NM', congress = 111) +} +\references{ +Jeffrey B. Lewis, Brandon DeVine, Lincoln Pitcher, and Kenneth C. Martis. (2013) +Digital Boundary Definitions of United States Congressional Districts, 1789-2012. +[Data file and code book]. Retrieved from \url{https://cdmaps.polisci.ucla.edu} on [date of download]. +} diff --git a/man/get_rpvnearme.Rd b/man/get_rpvnearme.Rd new file mode 100644 index 0000000..f2ca3d3 --- /dev/null +++ b/man/get_rpvnearme.Rd @@ -0,0 +1,22 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/rpvnearme.R +\name{get_rpvnearme} +\alias{get_rpvnearme} +\title{Get Racially Polarized Voting Dataset from RPV Near Me} +\usage{ +get_rpvnearme(state, version = c(1, 2)) +} +\arguments{ +\item{state}{the state postal code of the state} + +\item{version}{the version of the data to use. \code{1} for the original, \code{2} for the extended.} +} +\value{ +a tibble of precinct-level estimates of votes (party) by race +} +\description{ +Get Racially Polarized Voting Dataset from RPV Near Me +} +\examples{ +get_rpvnearme('DE') +} diff --git a/man/get_vest.Rd b/man/get_vest.Rd index e6a2885..f0094b3 100644 --- a/man/get_vest.Rd +++ b/man/get_vest.Rd @@ -2,14 +2,14 @@ % Please edit documentation in R/vest.R \name{get_vest} \alias{get_vest} -\title{Get VEST Dataset} +\title{Get Voting and Election Science Team ("VEST") Dataset} \usage{ -get_vest(state, year, path = tempdir(), clean_names = TRUE, epsg = 3857) +get_vest(state, year, path = tempdir(), clean_names = TRUE, epsg = 3857, ...) } \arguments{ \item{state}{two letter state abbreviation} -\item{year}{year in 2016, 2018, or 2020} +\item{year}{year any in 2016-2021} \item{path}{folder to put shape in. Default is \code{tempdir()}} @@ -17,12 +17,14 @@ get_vest(state, year, path = tempdir(), clean_names = TRUE, epsg = 3857) returns default names.} \item{epsg}{numeric EPSG code to planarize to. Default is 3857.} + +\item{...}{additional arguments passed to \code{\link[sf:st_read]{sf::read_sf()}}} } \value{ sf tibble } \description{ -Get VEST Dataset +Get Voting and Election Science Team ("VEST") Dataset } \examples{ \dontrun{ diff --git a/man/heda_doi.Rd b/man/heda_doi.Rd new file mode 100644 index 0000000..c895f23 --- /dev/null +++ b/man/heda_doi.Rd @@ -0,0 +1,12 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/heda.R +\name{heda_doi} +\alias{heda_doi} +\title{Vest DOIs} +\usage{ +heda_doi() +} +\description{ +Vest DOIs +} +\keyword{internal} diff --git a/man/heda_party.Rd b/man/heda_party.Rd new file mode 100644 index 0000000..95e384e --- /dev/null +++ b/man/heda_party.Rd @@ -0,0 +1,12 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/heda.R +\name{heda_party} +\alias{heda_party} +\title{HEDA Parties} +\usage{ +heda_party(str) +} +\description{ +HEDA Parties +} +\keyword{internal} diff --git a/man/heda_states.Rd b/man/heda_states.Rd new file mode 100644 index 0000000..e9b9269 --- /dev/null +++ b/man/heda_states.Rd @@ -0,0 +1,18 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/heda.R +\name{heda_states} +\alias{heda_states} +\title{List Available States from HEDA Dataverse} +\usage{ +heda_states() +} +\value{ +character abbreviations for states +} +\description{ +List Available States from HEDA Dataverse +} +\examples{ +heda_states() +} +\concept{datasets} diff --git a/man/pipe.Rd b/man/pipe.Rd index 1f8f237..a648c29 100644 --- a/man/pipe.Rd +++ b/man/pipe.Rd @@ -12,7 +12,7 @@ lhs \%>\% rhs \item{rhs}{A function call using the magrittr semantics.} } \value{ -The result of calling `rhs(lhs)`. +The result of calling \code{rhs(lhs)}. } \description{ See \code{magrittr::\link[magrittr:pipe]{\%>\%}} for details. diff --git a/man/r2dra.Rd b/man/r2dra.Rd index e9b7985..a2e0656 100644 --- a/man/r2dra.Rd +++ b/man/r2dra.Rd @@ -28,8 +28,8 @@ with DRA. Projecting down to blocks can take a lot of time for larger states. \examples{ \dontrun{ # Needs Census Bureau API -cd <- tigris::congressional_districts() \%>\% filter(STATEFP == '49') -cnty <- tigris::counties(state = 49) +cd <- tinytiger::tt_congressional_districts() \%>\% filter(STATEFP == '49') +cnty <- tinytiger::tt_counties(state = 49) matchedcty <- geo_match(from = cnty, to = cd) # use counties as precincts and let the plan be their center match: r2dra(cnty, matchedcty, 'UT', 'r2dra_ex.csv') diff --git a/man/regionalize.Rd b/man/regionalize.Rd new file mode 100644 index 0000000..2b02113 --- /dev/null +++ b/man/regionalize.Rd @@ -0,0 +1,31 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/regionalize.R +\name{regionalize} +\alias{regionalize} +\title{Estimate Regions by Geographic Features} +\usage{ +regionalize(shp, lines, adj = adjacency(shp), epsg = 3857) +} +\arguments{ +\item{shp}{\code{sf} tibble to estimate regions for} + +\item{lines}{\code{sf} tibble which divides \code{shp} into regions} + +\item{adj}{adjacency graph} + +\item{epsg}{numeric EPSG code to planarize to. Default is 3857.} +} +\value{ +integer vector of regions with \code{nrow(shp)} entries +} +\description{ +This offers a basic method for dividing a shape into separate pieces +} +\examples{ +data(towns) +# make some weird roadlike feature passing through the towns +lines <- sf::st_sfc(sf::st_linestring(sf::st_coordinates(sf::st_centroid(towns))), + crs = sf::st_crs(towns) +) +regionalize(towns, lines) +} diff --git a/man/seam_adj.Rd b/man/seam_adj.Rd index 5adbc3d..f9de356 100644 --- a/man/seam_adj.Rd +++ b/man/seam_adj.Rd @@ -24,12 +24,14 @@ subset of adj Filter Adjacency to Edges Along Border } \examples{ -data("rockland") -data("orange") -data("nrcsd") +data('rockland') +data('orange') +data('nrcsd') o_and_r <- rbind(orange, rockland) -o_and_r <- o_and_r \%>\% geo_filter(nrcsd) \%>\% geo_trim(nrcsd) +o_and_r <- o_and_r \%>\% + geo_filter(nrcsd) \%>\% + geo_trim(nrcsd) adj <- adjacency(o_and_r) seam_adj(adj, shp = o_and_r, admin = 'county', seam = c('071', '087')) diff --git a/man/seam_geom.Rd b/man/seam_geom.Rd index 6c24dc9..3738f59 100644 --- a/man/seam_geom.Rd +++ b/man/seam_geom.Rd @@ -24,12 +24,14 @@ subset of shp Filter Shape to Geographies Along Border } \examples{ -data("rockland") -data("orange") -data("nrcsd") +data('rockland') +data('orange') +data('nrcsd') o_and_r <- rbind(orange, rockland) -o_and_r <- o_and_r \%>\% geo_filter(nrcsd) \%>\% geo_trim(nrcsd) +o_and_r <- o_and_r \%>\% + geo_filter(nrcsd) \%>\% + geo_trim(nrcsd) adj <- adjacency(o_and_r) seam_geom(adj, shp = o_and_r, admin = 'county', seam = c('071', '087')) diff --git a/man/seam_rip.Rd b/man/seam_rip.Rd index 7caa4d9..efeede6 100644 --- a/man/seam_rip.Rd +++ b/man/seam_rip.Rd @@ -24,12 +24,14 @@ adjacency list Remove Edges along a Boundary } \examples{ -data("rockland") -data("orange") -data("nrcsd") +data('rockland') +data('orange') +data('nrcsd') o_and_r <- rbind(orange, rockland) -o_and_r <- o_and_r \%>\% geo_filter(nrcsd) \%>\% geo_trim(nrcsd) +o_and_r <- o_and_r \%>\% + geo_filter(nrcsd) \%>\% + geo_trim(nrcsd) adj <- adjacency(o_and_r) seam_rip(adj, o_and_r, 'county', c('071', '087')) diff --git a/man/seam_sew.Rd b/man/seam_sew.Rd index 4d672c3..d0d221a 100644 --- a/man/seam_sew.Rd +++ b/man/seam_sew.Rd @@ -22,12 +22,14 @@ tibble of edges connecting sides of a border Suggest Edges to Connect Two Sides of a Border } \examples{ -data("rockland") -data("orange") -data("nrcsd") +data('rockland') +data('orange') +data('nrcsd') o_and_r <- rbind(orange, rockland) -o_and_r <- o_and_r \%>\% geo_filter(nrcsd) \%>\% geo_trim(nrcsd) +o_and_r <- o_and_r \%>\% + geo_filter(nrcsd) \%>\% + geo_trim(nrcsd) adj <- adjacency(o_and_r) adds <- seam_sew(o_and_r, 'county', c('071', '087')) diff --git a/man/st_circle_center.Rd b/man/st_circle_center.Rd new file mode 100644 index 0000000..d595991 --- /dev/null +++ b/man/st_circle_center.Rd @@ -0,0 +1,27 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/center.R +\name{st_circle_center} +\alias{st_circle_center} +\title{Get the centroid of the maximum inscribed circle} +\usage{ +st_circle_center(shp, tolerance = 0.01, epsg = 3857) +} +\arguments{ +\item{shp}{An sf dataframe} + +\item{tolerance}{positive numeric tolerance to simplify by. Default is 0.01.} + +\item{epsg}{numeric EPSG code to planarize to. Default is 3857.} +} +\value{ +An sf dataframe where geometry is the circle center of each shape in shp +} +\description{ +Returns the centroid of the largest inscribed circle for each shape +} +\examples{ +data(towns) +st_circle_center(towns) + +} +\concept{center} diff --git a/man/subtract_edge.Rd b/man/subtract_edge.Rd index 254bd46..a74c4c1 100644 --- a/man/subtract_edge.Rd +++ b/man/subtract_edge.Rd @@ -4,16 +4,24 @@ \alias{subtract_edge} \title{Subtract Edges from an Adjacency List} \usage{ -subtract_edge(adj, v1, v2, zero = TRUE) +subtract_edge(adj, v1, v2, ids = NULL, zero = TRUE) } \arguments{ \item{adj}{list of adjacent precincts} -\item{v1}{integer or integer array for first vertex to connect. -If array, connects each to corresponding entry in v2.} +\item{v1}{vector of vertex identifiers for the first vertex. Can be an +integer index or a value to look up in \code{ids}, if that argument is provided. +If more than one identifier is present, disconnects each to corresponding +entry in v2, if an edge exists.} -\item{v2}{integer or integer array for second vertex to connect. -If array, connects each to corresponding entry in v1.} +\item{v2}{vector of vertex identifiers for the second vertex. Can be an +integer index or a value to look up in \code{ids}, if that argument is provided. +If more than one identifier is present, disconnects each to corresponding +entry in v2, if an edge exists.} + +\item{ids}{A vector of identifiers which is used to look up the row indices +for the vertices. If provided, the entries in \code{v1} and \code{v2} must match +exactly one entry in \code{ids}.} \item{zero}{boolean, TRUE if \code{adj} is zero indexed. False if one indexed.} } @@ -26,7 +34,8 @@ Subtract Edges from an Adjacency List \examples{ data(towns) adj <- adjacency(towns) -subtract_edge(adj, 2, 3) +subtract_edge(adj, 2, 3) +subtract_edge(adj, "West Haverstraw", "Stony Point", towns$MUNI) } \concept{fix} diff --git a/man/va_vtd.Rd b/man/va_vtd.Rd index cbd6c34..df19c4c 100644 --- a/man/va_vtd.Rd +++ b/man/va_vtd.Rd @@ -14,7 +14,7 @@ This data contains the blocks for Henrico County, VA with geographies simplified to allow for better examples. } \details{ -va_vtd <- tigris::voting_districts(state = 'VA') %>% filter(COUNTYFP10 == '087') +va_vtd <- tinytiger::tt_voting_districts(state = 'VA', county = '087', year = 2010) va_vtd <- rmapshaper::ms_simplify(va_vtd, keep_shapes = TRUE) } \examples{ diff --git a/man/vest_abb.Rd b/man/vest_abb.Rd index 2683f9d..677c8e5 100644 --- a/man/vest_abb.Rd +++ b/man/vest_abb.Rd @@ -2,11 +2,11 @@ % Please edit documentation in R/vest.R \name{vest_abb} \alias{vest_abb} -\title{Vest Abbreviations} +\title{VEST Abbreviations} \usage{ vest_abb(x) } \description{ -Vest Abbreviations +VEST Abbreviations } \keyword{internal} diff --git a/man/vest_doi.Rd b/man/vest_doi.Rd index 619e118..ae939ab 100644 --- a/man/vest_doi.Rd +++ b/man/vest_doi.Rd @@ -2,11 +2,11 @@ % Please edit documentation in R/vest.R \name{vest_doi} \alias{vest_doi} -\title{Vest DOIs} +\title{VEST DOIs} \usage{ vest_doi() } \description{ -Vest DOIs +VEST DOIs } \keyword{internal} diff --git a/man/vest_party.Rd b/man/vest_party.Rd index 32aaca3..4febc92 100644 --- a/man/vest_party.Rd +++ b/man/vest_party.Rd @@ -2,11 +2,11 @@ % Please edit documentation in R/vest.R \name{vest_party} \alias{vest_party} -\title{Vest Parties} +\title{VEST Parties} \usage{ vest_party(str) } \description{ -Vest Parties +VEST Parties } \keyword{internal} diff --git a/src/RcppExports.cpp b/src/RcppExports.cpp index 989f699..42677ad 100644 --- a/src/RcppExports.cpp +++ b/src/RcppExports.cpp @@ -5,6 +5,11 @@ using namespace Rcpp; +#ifdef RCPP_USE_GLOBAL_ROSTREAM +Rcpp::Rostream& Rcpp::Rcout = Rcpp::Rcpp_cout_get(); +Rcpp::Rostream& Rcpp::Rcerr = Rcpp::Rcpp_cerr_get(); +#endif + // adjlist2matrix NumericMatrix adjlist2matrix(List adj); RcppExport SEXP _geomander_adjlist2matrix(SEXP adjSEXP) { diff --git a/src/contiguity.cpp b/src/contiguity.cpp index b11f467..db43813 100644 --- a/src/contiguity.cpp +++ b/src/contiguity.cpp @@ -8,18 +8,16 @@ IntegerVector contiguity(List adj, IntegerVector group) { IntegerVector group_cc(choices.size()); IntegerVector currgroup(1); IntegerVector temp; - int cc, s, r, idx; - IntegerVector reservoir; + int cc, s, r; + for(int i = 0; i < group.size(); i++){ if(conncomp(i) == 0){ - currgroup = group(i); - idx = match(currgroup, choices)(0) - 1; - group_cc(idx) ++; - cc = group_cc(idx); + group_cc(group(i)) ++; + cc = group_cc(group(i)); conncomp(i) = cc; temp = adj(i); - reservoir = IntegerVector(0); + std::vector reservoir; s = 0; for(int j = 0; j < temp.size(); j++){ if(group(temp(j)) == group(i) && conncomp(temp(j)) == 0){ @@ -32,7 +30,7 @@ IntegerVector contiguity(List adj, IntegerVector group) { if(s > 0){ r = 0; while(r < s){ - temp = adj(reservoir(r)); + temp = adj(reservoir[r]); for(int j = 0; j < temp.size(); j++){ if(group(temp(j)) == group(i) && conncomp(temp(j)) == 0){ reservoir.push_back(temp(j)); @@ -49,3 +47,5 @@ IntegerVector contiguity(List adj, IntegerVector group) { return conncomp; } + + diff --git a/src/moran.cpp b/src/moran.cpp index 5c1b1f7..6b30d11 100644 --- a/src/moran.cpp +++ b/src/moran.cpp @@ -75,7 +75,7 @@ List globalmoran(NumericVector x, NumericMatrix mat) { } Ii(i) = z(i)*temp/m2; } - double moran = sum(Ii); + double moran = sum(Ii)/normc; List ret; ret["moran"] = moran; diff --git a/tests/testthat/setup.R b/tests/testthat/setup.R index 8690086..ab94193 100644 --- a/tests/testthat/setup.R +++ b/tests/testthat/setup.R @@ -1,10 +1,12 @@ data('checkerboard') data('checkerboard_adj') -data("va_blocks") -data("va18sub") +data('va_blocks') +data('va18sub') data('rockland') data('nrcsd') -data("orange") +data('orange') o_and_r <- rbind(orange, rockland) -o_and_r <- o_and_r %>% geo_filter(nrcsd) %>% geo_trim(nrcsd) \ No newline at end of file +o_and_r <- o_and_r %>% + geo_filter(nrcsd) %>% + geo_trim(nrcsd) diff --git a/tests/testthat/test-adjacency.R b/tests/testthat/test-adjacency.R index c5ebe75..52d6743 100644 --- a/tests/testthat/test-adjacency.R +++ b/tests/testthat/test-adjacency.R @@ -1,37 +1,108 @@ test_that('adjacency works', { actual <- adjacency(checkerboard, epsg = FALSE) - expect_equal(lapply(actual, sort), lapply(checkerboard_adj, sort)) + expect_equal(lapply(actual, sort), lapply(checkerboard_adj, sort)) +}) + +test_that('adding edges works', { + data(towns) + adj <- adjacency(towns) + + expect_equal( + add_edge(adj, 4, 6), + add_edge(adj, "West Haverstraw", "Stony Point", towns$MUNI) + ) + expect_error(add_edge(adj, "Haverstraw", "Stony Point", towns$MUNI), "[Dd]uplicate") + expect_error(add_edge(adj, "NOT A TOWN", "Stony Point", towns$MUNI), "[Mm]issing") }) test_that('check_contiguity works', { - expected <- structure(list( - group = c( - 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, - 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, - 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, - 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, - 1L, 1L, 1L, 1L, 1L, 1L, 1L - ), - group_number = c( - 1L, 1L, 1L, 1L, - 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, - 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, - 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, - 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L + expected <- structure( + list( + group = c( + 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, + 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, + 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, + 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, + 1L, 1L, 1L, 1L, 1L, 1L, 1L + ), + group_number = c( + 1L, 1L, 1L, 1L, + 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, + 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, + 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, + 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L + ), + component = c( + 1L, + 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, + 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, + 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, + 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L + ) ), - component = c( - 1L, - 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, - 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, - 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, - 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L - ) - ), - row.names = c(NA, -64L), class = c('tbl_df', 'tbl', 'data.frame') + row.names = c(NA, -64L), class = c('tbl_df', 'tbl', 'data.frame') ) actual <- check_contiguity(checkerboard_adj) expect_equal(actual, expected) }) + + +test_that('check_contiguity with groups works', { + wv_adj <- list( + c(9, 39), 24, c(4, 10, 53), c(4, 14, 19, 28, 36), c(2, 3, 10, 14, 36, 53), + c(20, 22, 25, 33, 34, 48, 50), c(11, 24), c(12, 21, 40, 51), + c(13, 16, 35, 41, 44, 46), c(0, 17, 18, 33, 39, 50), c(2, 4, 14, 19, 30), + c(6, 26, 27), c(7, 21, 35), c(8, 16, 38, 41), c(3, 4, 10, 19), + c(28, 40, 47, 49, 51), c(8, 13, 20, 38, 45, 46, 48), c(9, 18, 28, 31, 49, 50), + c(9, 17, 28, 36, 39), c(3, 10, 14, 28, 29, 30, 54), c(5, 16, 34, 38, 42, 48), + c(7, 12, 23, 35, 40, 46, 47), c(5, 25, 26, 27, 34, 42), c(21, 31, 45, 46, 47), + c(1, 6), c(5, 22, 27, 33), c(11, 22), c(11, 22, 25), + c(3, 15, 17, 18, 19, 36, 49, 51, 54), c(19, 30, 32, 54), c(10, 19, 29), + c(17, 23, 45, 47, 49, 50), c(29, 51, 54), c(5, 9, 25, 50), c(5, 20, 22, 42), + c(8, 12, 21, 46), c(3, 4, 18, 28, 39, 53), 52, c(13, 16, 20, 41, 42), + c(0, 9, 18, 36, 53), c(7, 15, 21, 47, 51), c(8, 13, 38, 42), c(20, 22, 34, 38, 41), + c(44, 52), c(8, 43), c(16, 23, 31, 46, 48, 50), c(8, 16, 21, 23, 35, 45), + c(15, 21, 23, 31, 40, 49), c(5, 16, 20, 45, 50), c(15, 17, 28, 31, 47), + c(5, 9, 17, 31, 33, 45, 48), c(7, 15, 28, 32, 40, 54), c(37, 43), + c(2, 4, 36, 39), c(19, 28, 29, 32, 51) + ) + + wv_pl <- c( + 1L, 2L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 1L, 1L, 2L, 2L, 2L, 1L, 1L, 2L, 1L, 1L, + 1L, 2L, 2L, 2L, 1L, 2L, 1L, 2L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 1L, 2L, + 2L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 1L, 2L, 1L, 1L, 1L, 2L, 1L, 1L + ) + + actual <- check_contiguity(wv_adj, wv_pl) + + expected <- structure( + list( + group = c( + 1L, 2L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, + 1L, 1L, 2L, 2L, 2L, 1L, 1L, 2L, 1L, 1L, 1L, 2L, 2L, 2L, 1L, 2L, + 1L, 2L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 1L, 2L, 2L, 1L, 1L, + 2L, 2L, 2L, 2L, 2L, 2L, 1L, 2L, 1L, 1L, 1L, 2L, 1L, 1L + ), + group_number = c( + 1, + 2, 1, 1, 1, 2, 2, 2, 2, 1, 1, 2, 2, 2, 1, 1, 2, 1, 1, 1, 2, 2, + 2, 1, 2, 1, 2, 2, 1, 1, 1, 1, 1, 1, 2, 2, 1, 2, 2, 1, 1, 2, 2, + 2, 2, 2, 2, 1, 2, 1, 1, 1, 2, 1, 1 + ), + component = c( + 1L, 1L, 1L, + 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, + 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, + 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, + 1L, 1L, 1L, 1L + ) + ), + class = c('tbl_df', 'tbl', 'data.frame'), + row.names = c(NA, -55L) + ) + + expect_equal(actual, expected) +}) diff --git a/tests/testthat/test-centers.R b/tests/testthat/test-centers.R index af0999d..f3586ac 100644 --- a/tests/testthat/test-centers.R +++ b/tests/testthat/test-centers.R @@ -1,76 +1,77 @@ test_that('centerish works', { act <- st_centerish(checkerboard, epsg = FALSE)$geometry - expected <- structure(list( - structure(c(0.5, 0.5), class = c('XY', 'POINT', 'sfg')), - structure(c(0.5, 1.5), class = c('XY', 'POINT', 'sfg')), - structure(c(0.5, 2.5), class = c('XY', 'POINT', 'sfg')), - structure(c(0.5, 3.5), class = c('XY', 'POINT', 'sfg')), - structure(c(0.5, 4.5), class = c('XY', 'POINT', 'sfg')), - structure(c(0.5, 5.5), class = c('XY', 'POINT', 'sfg')), - structure(c(0.5, 6.5), class = c('XY', 'POINT', 'sfg')), - structure(c(0.5, 7.5), class = c('XY', 'POINT', 'sfg')), - structure(c(1.5, 0.5), class = c('XY', 'POINT', 'sfg')), - structure(c(1.5, 1.5), class = c('XY', 'POINT', 'sfg')), - structure(c(1.5, 2.5), class = c('XY', 'POINT', 'sfg')), - structure(c(1.5, 3.5), class = c('XY', 'POINT', 'sfg')), - structure(c(1.5, 4.5), class = c('XY', 'POINT', 'sfg')), - structure(c(1.5, 5.5), class = c('XY', 'POINT', 'sfg')), - structure(c(1.5, 6.5), class = c('XY', 'POINT', 'sfg')), - structure(c(1.5, 7.5), class = c('XY', 'POINT', 'sfg')), - structure(c(2.5, 0.5), class = c('XY', 'POINT', 'sfg')), - structure(c(2.5, 1.5), class = c('XY', 'POINT', 'sfg')), - structure(c(2.5, 2.5), class = c('XY', 'POINT', 'sfg')), - structure(c(2.5, 3.5), class = c('XY', 'POINT', 'sfg')), - structure(c(2.5, 4.5), class = c('XY', 'POINT', 'sfg')), - structure(c(2.5, 5.5), class = c('XY', 'POINT', 'sfg')), - structure(c(2.5, 6.5), class = c('XY', 'POINT', 'sfg')), - structure(c(2.5, 7.5), class = c('XY', 'POINT', 'sfg')), - structure(c(3.5, 0.5), class = c('XY', 'POINT', 'sfg')), - structure(c(3.5, 1.5), class = c('XY', 'POINT', 'sfg')), - structure(c(3.5, 2.5), class = c('XY', 'POINT', 'sfg')), - structure(c(3.5, 3.5), class = c('XY', 'POINT', 'sfg')), - structure(c(3.5, 4.5), class = c('XY', 'POINT', 'sfg')), - structure(c(3.5, 5.5), class = c('XY', 'POINT', 'sfg')), - structure(c(3.5, 6.5), class = c('XY', 'POINT', 'sfg')), - structure(c(3.5, 7.5), class = c('XY', 'POINT', 'sfg')), - structure(c(4.5, 0.5), class = c('XY', 'POINT', 'sfg')), - structure(c(4.5, 1.5), class = c('XY', 'POINT', 'sfg')), - structure(c(4.5, 2.5), class = c('XY', 'POINT', 'sfg')), - structure(c(4.5, 3.5), class = c('XY', 'POINT', 'sfg')), - structure(c(4.5, 4.5), class = c('XY', 'POINT', 'sfg')), - structure(c(4.5, 5.5), class = c('XY', 'POINT', 'sfg')), - structure(c(4.5, 6.5), class = c('XY', 'POINT', 'sfg')), - structure(c(4.5, 7.5), class = c('XY', 'POINT', 'sfg')), - structure(c(5.5, 0.5), class = c('XY', 'POINT', 'sfg')), - structure(c(5.5, 1.5), class = c('XY', 'POINT', 'sfg')), - structure(c(5.5, 2.5), class = c('XY', 'POINT', 'sfg')), - structure(c(5.5, 3.5), class = c('XY', 'POINT', 'sfg')), - structure(c(5.5, 4.5), class = c('XY', 'POINT', 'sfg')), - structure(c(5.5, 5.5), class = c('XY', 'POINT', 'sfg')), - structure(c(5.5, 6.5), class = c('XY', 'POINT', 'sfg')), - structure(c(5.5, 7.5), class = c('XY', 'POINT', 'sfg')), - structure(c(6.5, 0.5), class = c('XY', 'POINT', 'sfg')), - structure(c(6.5, 1.5), class = c('XY', 'POINT', 'sfg')), - structure(c(6.5, 2.5), class = c('XY', 'POINT', 'sfg')), - structure(c(6.5, 3.5), class = c('XY', 'POINT', 'sfg')), - structure(c(6.5, 4.5), class = c('XY', 'POINT', 'sfg')), - structure(c(6.5, 5.5), class = c('XY', 'POINT', 'sfg')), - structure(c(6.5, 6.5), class = c('XY', 'POINT', 'sfg')), - structure(c(6.5, 7.5), class = c('XY', 'POINT', 'sfg')), - structure(c(7.5, 0.5), class = c('XY', 'POINT', 'sfg')), - structure(c(7.5, 1.5), class = c('XY', 'POINT', 'sfg')), - structure(c(7.5, 2.5), class = c('XY', 'POINT', 'sfg')), - structure(c(7.5, 3.5), class = c('XY', 'POINT', 'sfg')), - structure(c(7.5, 4.5), class = c('XY', 'POINT', 'sfg')), - structure(c(7.5, 5.5), class = c('XY', 'POINT', 'sfg')), - structure(c(7.5, 6.5), class = c('XY', 'POINT', 'sfg')), - structure(c(7.5, 7.5), class = c('XY', 'POINT', 'sfg')) - ), - n_empty = 0L, precision = 0, - crs = structure(list(input = NA_character_, wkt = NA_character_), class = 'crs'), - bbox = structure(c(xmin = 0.5, ymin = 0.5, xmax = 7.5, ymax = 7.5), class = 'bbox'), - class = c('sfc_POINT', 'sfc') + expected <- structure( + list( + structure(c(0.5, 0.5), class = c('XY', 'POINT', 'sfg')), + structure(c(0.5, 1.5), class = c('XY', 'POINT', 'sfg')), + structure(c(0.5, 2.5), class = c('XY', 'POINT', 'sfg')), + structure(c(0.5, 3.5), class = c('XY', 'POINT', 'sfg')), + structure(c(0.5, 4.5), class = c('XY', 'POINT', 'sfg')), + structure(c(0.5, 5.5), class = c('XY', 'POINT', 'sfg')), + structure(c(0.5, 6.5), class = c('XY', 'POINT', 'sfg')), + structure(c(0.5, 7.5), class = c('XY', 'POINT', 'sfg')), + structure(c(1.5, 0.5), class = c('XY', 'POINT', 'sfg')), + structure(c(1.5, 1.5), class = c('XY', 'POINT', 'sfg')), + structure(c(1.5, 2.5), class = c('XY', 'POINT', 'sfg')), + structure(c(1.5, 3.5), class = c('XY', 'POINT', 'sfg')), + structure(c(1.5, 4.5), class = c('XY', 'POINT', 'sfg')), + structure(c(1.5, 5.5), class = c('XY', 'POINT', 'sfg')), + structure(c(1.5, 6.5), class = c('XY', 'POINT', 'sfg')), + structure(c(1.5, 7.5), class = c('XY', 'POINT', 'sfg')), + structure(c(2.5, 0.5), class = c('XY', 'POINT', 'sfg')), + structure(c(2.5, 1.5), class = c('XY', 'POINT', 'sfg')), + structure(c(2.5, 2.5), class = c('XY', 'POINT', 'sfg')), + structure(c(2.5, 3.5), class = c('XY', 'POINT', 'sfg')), + structure(c(2.5, 4.5), class = c('XY', 'POINT', 'sfg')), + structure(c(2.5, 5.5), class = c('XY', 'POINT', 'sfg')), + structure(c(2.5, 6.5), class = c('XY', 'POINT', 'sfg')), + structure(c(2.5, 7.5), class = c('XY', 'POINT', 'sfg')), + structure(c(3.5, 0.5), class = c('XY', 'POINT', 'sfg')), + structure(c(3.5, 1.5), class = c('XY', 'POINT', 'sfg')), + structure(c(3.5, 2.5), class = c('XY', 'POINT', 'sfg')), + structure(c(3.5, 3.5), class = c('XY', 'POINT', 'sfg')), + structure(c(3.5, 4.5), class = c('XY', 'POINT', 'sfg')), + structure(c(3.5, 5.5), class = c('XY', 'POINT', 'sfg')), + structure(c(3.5, 6.5), class = c('XY', 'POINT', 'sfg')), + structure(c(3.5, 7.5), class = c('XY', 'POINT', 'sfg')), + structure(c(4.5, 0.5), class = c('XY', 'POINT', 'sfg')), + structure(c(4.5, 1.5), class = c('XY', 'POINT', 'sfg')), + structure(c(4.5, 2.5), class = c('XY', 'POINT', 'sfg')), + structure(c(4.5, 3.5), class = c('XY', 'POINT', 'sfg')), + structure(c(4.5, 4.5), class = c('XY', 'POINT', 'sfg')), + structure(c(4.5, 5.5), class = c('XY', 'POINT', 'sfg')), + structure(c(4.5, 6.5), class = c('XY', 'POINT', 'sfg')), + structure(c(4.5, 7.5), class = c('XY', 'POINT', 'sfg')), + structure(c(5.5, 0.5), class = c('XY', 'POINT', 'sfg')), + structure(c(5.5, 1.5), class = c('XY', 'POINT', 'sfg')), + structure(c(5.5, 2.5), class = c('XY', 'POINT', 'sfg')), + structure(c(5.5, 3.5), class = c('XY', 'POINT', 'sfg')), + structure(c(5.5, 4.5), class = c('XY', 'POINT', 'sfg')), + structure(c(5.5, 5.5), class = c('XY', 'POINT', 'sfg')), + structure(c(5.5, 6.5), class = c('XY', 'POINT', 'sfg')), + structure(c(5.5, 7.5), class = c('XY', 'POINT', 'sfg')), + structure(c(6.5, 0.5), class = c('XY', 'POINT', 'sfg')), + structure(c(6.5, 1.5), class = c('XY', 'POINT', 'sfg')), + structure(c(6.5, 2.5), class = c('XY', 'POINT', 'sfg')), + structure(c(6.5, 3.5), class = c('XY', 'POINT', 'sfg')), + structure(c(6.5, 4.5), class = c('XY', 'POINT', 'sfg')), + structure(c(6.5, 5.5), class = c('XY', 'POINT', 'sfg')), + structure(c(6.5, 6.5), class = c('XY', 'POINT', 'sfg')), + structure(c(6.5, 7.5), class = c('XY', 'POINT', 'sfg')), + structure(c(7.5, 0.5), class = c('XY', 'POINT', 'sfg')), + structure(c(7.5, 1.5), class = c('XY', 'POINT', 'sfg')), + structure(c(7.5, 2.5), class = c('XY', 'POINT', 'sfg')), + structure(c(7.5, 3.5), class = c('XY', 'POINT', 'sfg')), + structure(c(7.5, 4.5), class = c('XY', 'POINT', 'sfg')), + structure(c(7.5, 5.5), class = c('XY', 'POINT', 'sfg')), + structure(c(7.5, 6.5), class = c('XY', 'POINT', 'sfg')), + structure(c(7.5, 7.5), class = c('XY', 'POINT', 'sfg')) + ), + n_empty = 0L, precision = 0, + crs = structure(list(input = NA_character_, wkt = NA_character_), class = 'crs'), + bbox = structure(c(xmin = 0.5, ymin = 0.5, xmax = 7.5, ymax = 7.5), class = 'bbox'), + class = c('sfc_POINT', 'sfc') ) expect_equal(act, expected) diff --git a/tests/testthat/test-estimate.R b/tests/testthat/test-estimate.R index c4ecab2..41fe164 100644 --- a/tests/testthat/test-estimate.R +++ b/tests/testthat/test-estimate.R @@ -1,42 +1,66 @@ -test_that("geo_estimate_down works", { - a <- geo_estimate_down(from = va18sub, to = va_blocks, - wts = va_blocks$pop, value = va18sub$G18USSDKAI) - - expect_equal(summary(a), - structure(c(Min. = 0, `1st Qu.` = 0, Median = 4.06040880516099, - Mean = 14.9238275102298, `3rd Qu.` = 16.0268669711954, - Max. = 595.774925962488), - class = c("summaryDefault", "table"))) +test_that('geo_estimate_down works', { + a <- geo_estimate_down( + from = va18sub, to = va_blocks, + wts = va_blocks$pop, value = va18sub$G18USSDKAI + ) + + expect_equal( + summary(a), + structure( + c( + Min. = 0, `1st Qu.` = 0, Median = 4.06040880516099, + Mean = 14.9238275102298, `3rd Qu.` = 16.0268669711954, + Max. = 595.774925962488 + ), + class = c('summaryDefault', 'table') + ) + ) }) -test_that("geo_estimate_up works", { - a <- geo_estimate_up(from = va_blocks, to = va18sub, - value = va_blocks$pop) - - expect_equal(summary(a), - structure(c(Min. = 397, `1st Qu.` = 2300, Median = 3184.5, Mean = 3410.38888888889, - `3rd Qu.` = 4587, Max. = 7871), class = c("summaryDefault", "table" - ))) +test_that('geo_estimate_up works', { + a <- geo_estimate_up( + from = va_blocks, to = va18sub, + value = va_blocks$pop + ) + + expect_equal( + summary(a), + structure(c( + Min. = 397, `1st Qu.` = 2300, Median = 3184.5, Mean = 3410.38888888889, + `3rd Qu.` = 4587, Max. = 7871 + ), class = c('summaryDefault', 'table')) + ) }) -test_that("estimate_down works", { +test_that('estimate_down works', { m <- geo_match(va_blocks, va18sub) - a <- estimate_down(wts = va_blocks$pop, value = va18sub$G18USSDKAI, - group = m) - - expect_equal(summary(a), - structure(c(Min. = 0, `1st Qu.` = 0, Median = 4.06040880516099, - Mean = 14.9238275102298, `3rd Qu.` = 16.0268669711954, - Max. = 595.774925962488), - class = c("summaryDefault", "table"))) + a <- estimate_down( + wts = va_blocks$pop, value = va18sub$G18USSDKAI, + group = m + ) + + expect_equal( + summary(a), + structure( + c( + Min. = 0, `1st Qu.` = 0, Median = 4.06040880516099, + Mean = 14.9238275102298, `3rd Qu.` = 16.0268669711954, + Max. = 595.774925962488 + ), + class = c('summaryDefault', 'table') + ) + ) }) -test_that("geo_estimate_up works", { +test_that('geo_estimate_up works', { m <- geo_match(va_blocks, va18sub) a <- estimate_up(value = va_blocks$pop, m) - - expect_equal(summary(a), - structure(c(Min. = 397, `1st Qu.` = 2300, Median = 3184.5, Mean = 3410.38888888889, - `3rd Qu.` = 4587, Max. = 7871), class = c("summaryDefault", "table" - ))) -}) \ No newline at end of file + + expect_equal( + summary(a), + structure(c( + Min. = 397, `1st Qu.` = 2300, Median = 3184.5, Mean = 3410.38888888889, + `3rd Qu.` = 4587, Max. = 7871 + ), class = c('summaryDefault', 'table')) + ) +}) diff --git a/tests/testthat/test-filter.R b/tests/testthat/test-filter.R index 8fd9a37..59cc774 100644 --- a/tests/testthat/test-filter.R +++ b/tests/testthat/test-filter.R @@ -1,6 +1,6 @@ -test_that("geo_filter works", { +test_that('geo_filter works', { nr <- geo_filter(rockland, nrcsd) - + expect_equal(nrow(nr), 722) }) @@ -9,4 +9,4 @@ test_that('geo_trim works', { nr <- geo_filter(rockland, nrcsd) nr <- geo_trim(nr, nrcsd) expect_equal(nrow(nr), 689) -}) \ No newline at end of file +}) diff --git a/tests/testthat/test-match.R b/tests/testthat/test-match.R index 624c785..da3c98f 100644 --- a/tests/testthat/test-match.R +++ b/tests/testthat/test-match.R @@ -1,1960 +1,1963 @@ -test_that("match center works", { - +test_that('match center works', { mtches <- geo_match(va_blocks, va18sub) - - expected <- c(64L, 69L, 66L, 66L, 69L, 70L, 70L, 69L, 63L, 68L, 38L, 54L, - 62L, 54L, 71L, 38L, 52L, 52L, 82L, 79L, 73L, 84L, 87L, 76L, 77L, - 74L, 80L, 79L, 89L, 2L, 5L, 4L, 3L, 7L, 5L, 5L, 2L, 4L, 4L, 4L, - 14L, 2L, 36L, 24L, 30L, 27L, 22L, 36L, 36L, 19L, 34L, 49L, 44L, - 56L, 49L, 40L, 28L, 28L, 23L, 34L, 30L, 36L, 12L, 33L, 22L, 23L, - 23L, 23L, 23L, 35L, 22L, 22L, 22L, 22L, 22L, 67L, 51L, 51L, 49L, - 43L, 10L, 53L, 53L, 45L, 55L, 55L, 53L, 43L, 51L, 57L, 90L, 90L, - 90L, 80L, 77L, 82L, 73L, 82L, 73L, 82L, 77L, 76L, 77L, 78L, 79L, - 79L, 79L, 82L, 79L, 87L, 79L, 80L, 1L, 2L, 6L, 1L, 4L, 4L, 2L, - 5L, 5L, 5L, 18L, 25L, 18L, 51L, 10L, 40L, 53L, 40L, 41L, 41L, - 67L, 41L, 43L, 10L, 52L, 68L, 88L, 70L, 65L, 52L, 64L, 64L, 63L, - 54L, 69L, 70L, 70L, 58L, 69L, 64L, 54L, 69L, 58L, 89L, 79L, 87L, - 87L, 87L, 87L, 87L, 2L, 3L, 7L, 13L, 3L, 3L, 6L, 11L, 11L, 4L, - 4L, 2L, 1L, 6L, 1L, 3L, 1L, 1L, 43L, 49L, 48L, 46L, 46L, 43L, - 54L, 43L, 10L, 41L, 48L, 22L, 23L, 19L, 28L, 23L, 27L, 30L, 35L, - 35L, 35L, 35L, 35L, 19L, 19L, 19L, 19L, 12L, 37L, 12L, 57L, 51L, - 51L, 46L, 51L, 44L, 43L, 56L, 56L, 10L, 51L, 51L, 48L, 41L, 51L, - 80L, 80L, 80L, 80L, 80L, 77L, 80L, 87L, 87L, 87L, 87L, 87L, 87L, - 87L, 86L, 79L, 82L, 74L, 74L, 36L, 28L, 19L, 27L, 36L, 36L, 26L, - 23L, 23L, 23L, 21L, 26L, 19L, 35L, 29L, 36L, 23L, 20L, 20L, 38L, - 88L, 69L, 52L, 69L, 70L, 69L, 68L, 54L, 38L, 65L, 54L, 59L, 88L, - 89L, 79L, 79L, 79L, 79L, 76L, 79L, 72L, 5L, 4L, 1L, 2L, 5L, 7L, - 8L, 1L, 8L, 8L, 8L, 8L, 5L, 3L, 14L, 8L, 14L, 44L, 57L, 67L, - 57L, 42L, 57L, 40L, 40L, 43L, 40L, 49L, 49L, 46L, 54L, 45L, 12L, - 12L, 29L, 12L, 21L, 21L, 21L, 21L, 21L, 21L, 21L, 34L, 34L, 34L, - 34L, 34L, 34L, 17L, 34L, 51L, 47L, 51L, 41L, 44L, 71L, 62L, 63L, - 61L, 61L, 69L, 62L, 69L, 62L, 69L, 69L, 87L, 87L, 75L, 72L, 72L, - 76L, 74L, 72L, 72L, 75L, 79L, 90L, 72L, 78L, 78L, 35L, 30L, 26L, - 30L, 23L, 23L, 35L, 26L, 22L, 22L, 22L, 23L, 23L, 61L, 52L, 54L, - 64L, 60L, 61L, 71L, 61L, 69L, 52L, 61L, 60L, 52L, 60L, 71L, 70L, - 69L, 60L, 54L, 70L, 63L, 70L, 64L, 54L, 61L, 60L, 85L, 80L, 87L, - 80L, 80L, 80L, 77L, 80L, 81L, 76L, 87L, 77L, 14L, 13L, 5L, 8L, - 2L, 2L, 2L, 2L, 11L, 7L, 14L, 11L, 4L, 11L, 2L, 2L, 7L, 5L, 7L, - 11L, 8L, 7L, 7L, 4L, 82L, 80L, 80L, 85L, 87L, 77L, 86L, 16L, - 86L, 74L, 81L, 17L, 17L, 28L, 36L, 36L, 12L, 18L, 18L, 34L, 34L, - 17L, 34L, 29L, 16L, 16L, 18L, 21L, 28L, 36L, 63L, 69L, 69L, 64L, - 65L, 70L, 38L, 52L, 70L, 62L, 72L, 81L, 81L, 81L, 85L, 81L, 76L, - 86L, 79L, 80L, 86L, 86L, 81L, 35L, 22L, 12L, 19L, 19L, 19L, 12L, - 34L, 35L, 35L, 16L, 18L, 6L, 35L, 58L, 88L, 64L, 75L, 87L, 87L, - 87L, 76L, 74L, 90L, 77L, 76L, 81L, 81L, 77L, 84L, 86L, 90L, 16L, - 28L, 36L, 36L, 27L, 30L, 33L, 31L, 16L, 16L, 16L, 36L, 35L, 36L, - 34L, 19L, 62L, 62L, 68L, 71L, 61L, 61L, 61L, 61L, 60L, 59L, 65L, - 66L, 69L, 85L, 86L, 82L, 77L, 77L, 86L, 84L, 76L, 86L, 12L, 12L, - 12L, 12L, 12L, 12L, 12L, 12L, 30L, 21L, 21L, 34L, 34L, 34L, 34L, - 34L, 34L, 17L, 17L, 29L, 36L, 33L, 28L, 34L, 34L, 34L, 88L, 64L, - 88L, 65L, 64L, 62L, 58L, 76L, 87L, 84L, 83L, 80L, 13L, 13L, 4L, - 2L, 5L, 11L, 14L, 5L, 5L, 7L, 4L, 8L, 5L, 13L, 7L, 7L, 4L, 9L, - 85L, 78L, 78L, 81L, 75L, 83L, 90L, 84L, 86L, 21L, 36L, 34L, 18L, - 36L, 22L, 36L, 24L, 29L, 31L, 19L, 16L, 16L, 24L, 36L, 18L, 36L, - 64L, 54L, 52L, 64L, 52L, 64L, 38L, 64L, 38L, 54L, 65L, 60L, 60L, - 60L, 84L, 78L, 80L, 79L, 81L, 90L, 84L, 83L, 79L, 79L, 77L, 76L, - 72L, 74L, 86L, 72L, 74L, 73L, 34L, 34L, 34L, 34L, 34L, 17L, 17L, - 17L, 29L, 16L, 35L, 29L, 27L, 27L, 30L, 16L, 16L, 64L, 62L, 58L, - 88L, 72L, 77L, 72L, 72L, 74L, 4L, 7L, 9L, 15L, 4L, 11L, 7L, 7L, - 11L, 6L, 13L, 11L, 5L, 11L, 7L, 7L, 7L, 4L, 15L, 15L, 15L, 1L, - 4L, 15L, 5L, 5L, 13L, 6L, 14L, 3L, 4L, 4L, 2L, 7L, 4L, 4L, 4L, - 4L, 1L, 21L, 36L, 37L, 36L, 29L, 23L, 22L, 37L, 25L, 90L, 30L, - 25L, 19L, 37L, 34L, 17L, 22L, 12L, 52L, 63L, 62L, 64L, 62L, 58L, - 88L, 88L, 64L, 88L, 65L, 71L, 61L, 64L, 74L, 74L, 75L, 16L, 77L, - 83L, 84L, 87L, 85L, 77L, 86L, 74L, 73L, 76L, 86L, 36L, 25L, 25L, - 22L, 12L, 36L, 16L, 16L, 36L, 27L, 34L, 23L, 34L, 37L, 16L, 22L, - 23L, 27L, 19L, 22L, 58L, 65L, 65L, 87L, 84L, 76L, 85L, 77L, 80L, - 74L, 72L, 84L, 81L, 85L, 5L, 11L, 4L, 4L, 4L, 15L, 15L, 4L, 4L, - 15L, 4L, 8L, 9L, 4L, 1L, 1L, 4L, 4L, 1L, 15L, 15L, 4L, 11L, 2L, - 4L, 4L, 11L, 2L, 11L, 14L, 3L, 3L, 5L, 11L, 4L, 4L, 15L, 27L, - 30L, 19L, 22L, 22L, 22L, 39L, 22L, 30L, 34L, 35L, 34L, 21L, 18L, - 36L, 36L, 36L, 58L, 58L, 88L, 88L, 38L, 38L, 69L, 70L, 59L, 68L, - 69L, 64L, 64L, 68L, 69L, 66L, 66L, 66L, 69L, 66L, 78L, 86L, 78L, - 85L, 75L, 82L, 73L, 84L, 79L, 84L, 77L, 34L, 34L, 16L, 36L, 36L, - 28L, 24L, 36L, 34L, 34L, 17L, 17L, 31L, 32L, 19L, 30L, 24L, 19L, - 54L, 64L, 88L, 69L, 69L, 59L, 59L, 68L, 90L, 90L, 74L, 75L, 76L, - 85L, 1L, 4L, 1L, 4L, 3L, 13L, 9L, 1L, 5L, 7L, 15L, 4L, 1L, 13L, - 19L, 36L, 36L, 36L, 19L, 4L, 5L, 5L, 15L, 5L, 5L, 8L, 2L, 4L, - 3L, 1L, 3L, 11L, 11L, 4L, 13L, 1L, 36L, 36L, 28L, 27L, 27L, 27L, - 18L, 55L, 56L, 40L, 57L, 57L, 38L, 64L, 58L, 60L, 59L, 66L, 61L, - 38L, 65L, 52L, 70L, 66L, 69L, 69L, 69L, 69L, 69L, 69L, 77L, 90L, - 90L, 14L, 14L, 8L, 2L, 2L, 2L, 4L, 15L, 15L, 4L, 4L, 4L, 4L, - 34L, 18L, 34L, 28L, 22L, 19L, 30L, 30L, 22L, 39L, 22L, 22L, 30L, - 26L, 26L, 35L, 36L, 36L, 35L, 68L, 66L, 62L, 90L, 87L, 90L, 77L, - 87L, 80L, 90L, 86L, 79L, 80L, 84L, 81L, 79L, 36L, 22L, 22L, 22L, - 28L, 36L, 28L, 28L, 28L, 28L, 28L, 23L, 23L, 23L, 34L, 26L, 30L, - 28L, 19L, 19L, 2L, 14L, 1L, 14L, 4L, 5L, 9L, 1L, 1L, 1L, 1L, - 46L, 49L, 55L, 54L, 55L, 48L, 46L, 51L, 44L, 46L, 67L, 58L, 69L, - 69L, 69L, 69L, 69L, 69L, 69L, 69L, 69L, 69L, 52L, 60L, 69L, 38L, - 9L, 4L, 4L, 1L, 3L, 5L, 7L, 6L, 11L, 4L, 5L, 5L, 2L, 14L, 14L, - 32L, 3L, 2L, 14L, 82L, 21L, 35L, 36L, 31L, 29L, 24L, 23L, 16L, - 45L, 47L, 57L, 57L, 53L, 57L, 10L, 46L, 49L, 56L, 58L, 66L, 66L, - 66L, 69L, 66L, 66L, 77L, 78L, 83L, 87L, 80L, 80L, 77L, 81L, 81L, - 81L, 81L, 80L, 87L, 17L, 23L, 23L, 23L, 23L, 22L, 22L, 22L, 23L, - 23L, 23L, 19L, 23L, 19L, 19L, 19L, 36L, 26L, 36L, 30L, 35L, 35L, - 1L, 6L, 3L, 8L, 8L, 14L, 2L, 5L, 14L, 2L, 5L, 9L, 15L, 67L, 57L, - 40L, 57L, 57L, 48L, 43L, 44L, 41L, 47L, 41L, 49L, 41L, 41L, 40L, - 57L, 47L, 63L, 38L, 52L, 71L, 61L, 64L, 88L, 68L, 61L, 54L, 69L, - 59L, 68L, 88L, 69L, 69L, 58L, 59L, 71L, 71L, 2L, 2L, 1L, 14L, - 14L, 3L, 2L, 8L, 9L, 5L, 2L, 5L, 5L, 1L, 1L, 8L, 8L, 46L, 56L, - 57L, 57L, 67L, 43L, 57L, 46L, 49L, 67L, 47L, 47L, 43L, 40L, 45L, - 44L, 47L, 45L, 68L, 62L, 62L, 59L, 85L, 90L, 85L, 90L, 90L, 90L, - 16L, 90L, 85L, 16L, 90L, 82L, 85L, 86L, 77L, 87L, 85L, 85L, 79L, - 35L, 35L, 19L, 12L, 12L, 12L, 12L, 37L, 12L, 12L, 12L, 29L, 29L, - 16L, 36L, 30L, 21L, 21L, 34L, 8L, 7L, 14L, 11L, 5L, 1L, 7L, 1L, - 11L, 6L, 7L, 5L, 9L, 9L, 2L, 3L, 4L, 11L, 4L, 2L, 7L, 4L, 4L, - 49L, 40L, 43L, 43L, 49L, 49L, 46L, 46L, 49L, 45L, 45L, 54L, 61L, - 52L, 60L, 52L, 71L, 61L, 63L, 69L, 63L, 62L, 70L, 54L, 70L, 1L, - 3L, 8L, 8L, 8L, 8L, 14L, 14L, 14L, 5L, 5L, 2L, 14L, 14L, 9L, - 11L, 10L, 47L, 49L, 43L, 43L, 49L, 40L, 44L, 44L, 54L, 49L, 49L, - 41L, 51L, 43L, 59L, 68L, 90L, 84L, 77L, 83L, 83L, 83L, 80L, 87L, - 87L, 87L, 86L, 83L, 74L, 81L, 80L, 87L, 83L, 74L, 76L, 78L, 74L, - 81L, 73L, 86L, 87L, 86L, 86L, 74L, 82L, 80L, 72L, 21L, 21L, 21L, - 34L, 34L, 34L, 34L, 34L, 34L, 34L, 34L, 17L, 17L, 17L, 17L, 29L, - 18L, 34L, 34L, 34L, 34L, 17L, 4L, 9L, 15L, 15L, 15L, 7L, 7L, - 11L, 11L, 1L, 13L, 7L, 5L, 7L, 11L, 11L, 11L, 7L, 7L, 7L, 11L, - 40L, 50L, 44L, 47L, 44L, 46L, 46L, 48L, 48L, 43L, 44L, 56L, 50L, - 51L, 56L, 55L, 64L, 54L, 63L, 63L, 63L, 52L, 38L, 58L, 85L, 75L, - 75L, 75L, 76L, 83L, 84L, 2L, 5L, 14L, 7L, 7L, 7L, 1L, 8L, 11L, - 5L, 7L, 5L, 4L, 11L, 5L, 6L, 7L, 11L, 5L, 41L, 47L, 46L, 54L, - 42L, 55L, 42L, 43L, 50L, 50L, 48L, 48L, 53L, 54L, 54L, 68L, 69L, - 69L, 69L, 63L, 63L, 58L, 69L, 90L, 77L, 77L, 77L, 90L, 90L, 77L, - 74L, 84L, 90L, 77L, 77L, 74L, 78L, 81L, 81L, 86L, 85L, 29L, 29L, - 34L, 34L, 16L, 16L, 16L, 29L, 36L, 16L, 36L, 27L, 31L, 31L, 32L, - 19L, 27L, 36L, 36L, 15L, 15L, 1L, 4L, 5L, 15L, 15L, 4L, 15L, - 15L, 15L, 4L, 4L, 15L, 4L, 4L, 15L, 8L, 55L, 55L, 44L, 45L, 42L, - 42L, 42L, 45L, 56L, 56L, 56L, 56L, 56L, 42L, 56L, 51L, 67L, 86L, - 76L, 86L, 80L, 74L, 90L, 85L, 83L, 79L, 79L, 84L, 80L, 9L, 7L, - 13L, 4L, 7L, 4L, 4L, 9L, 9L, 9L, 15L, 11L, 7L, 11L, 1L, 13L, - 13L, 7L, 5L, 7L, 7L, 67L, 42L, 42L, 45L, 56L, 56L, 56L, 56L, - 56L, 56L, 56L, 67L, 56L, 56L, 51L, 56L, 55L, 57L, 57L, 51L, 69L, - 38L, 65L, 70L, 65L, 63L, 63L, 69L, 84L, 73L, 73L, 73L, 79L, 78L, - 78L, 85L, 85L, 78L, 74L, 80L, 82L, 78L, 86L, 81L, 77L, 85L, 16L, - 37L, 22L, 34L, 31L, 34L, 28L, 24L, 36L, 18L, 27L, 27L, 30L, 27L, - 27L, 27L, 36L, 22L, 22L, 34L, 22L, 34L, 9L, 14L, 1L, 4L, 4L, - 3L, 3L, 6L, 1L, 1L, 1L, 2L, 2L, 2L, 14L, 3L, 5L, 51L, 41L, 56L, - 40L, 45L, 45L, 44L, 67L, 67L, 56L, 57L, 57L, 57L, 67L, 51L, 49L, - 46L, 55L, 67L, 67L, 53L, 67L, 74L, 77L, 87L, 74L, 75L, 87L, 90L, - 90L, 90L, 90L, 75L, 85L, 85L, 4L, 11L, 11L, 4L, 7L, 4L, 7L, 4L, - 7L, 7L, 7L, 4L, 15L, 15L, 13L, 9L, 4L, 11L, 15L, 4L, 4L, 15L, - 15L, 42L, 57L, 54L, 54L, 45L, 50L, 56L, 57L, 67L, 57L, 40L, 67L, - 57L, 57L, 10L, 57L, 57L, 57L, 53L, 55L, 42L, 10L, 10L, 42L, 71L, - 38L, 65L, 65L, 70L, 69L, 69L, 61L, 52L, 65L, 54L, 52L, 54L, 38L, - 69L, 68L, 61L, 59L, 82L, 82L, 82L, 80L, 84L, 90L, 87L, 82L, 13L, - 14L, 11L, 2L, 9L, 4L, 2L, 4L, 4L, 4L, 2L, 29L, 28L, 30L, 23L, - 18L, 16L, 24L, 35L, 22L, 21L, 39L, 39L, 19L, 12L, 36L, 36L, 36L, - 21L, 5L, 14L, 4L, 18L, 23L, 36L, 36L, 36L, 36L, 16L, 17L, 36L, - 39L, 36L, 36L, 51L, 57L, 57L, 10L, 10L, 57L, 57L, 57L, 57L, 57L, - 51L, 51L, 49L, 57L, 10L, 41L, 45L, 67L, 10L, 48L, 10L, 49L, 56L, - 79L, 85L, 80L, 80L, 77L, 84L, 90L, 77L, 77L, 77L, 83L, 83L, 83L, - 90L, 90L, 87L, 84L, 90L, 90L, 90L, 4L, 15L, 4L, 1L, 14L, 4L, - 9L, 3L, 7L, 7L, 4L, 5L, 2L, 6L, 5L, 5L, 53L, 41L, 40L, 46L, 51L, - 45L, 51L, 53L, 42L, 46L, 10L, 67L, 49L, 49L, 47L, 55L, 49L, 40L, - 46L, 9L, 15L, 4L, 3L, 36L, 36L, 22L, 36L, 22L, 22L, 16L, 29L, - 31L, 16L, 16L, 30L, 40L, 46L, 49L, 56L, 55L, 48L, 46L, 65L, 69L, - 38L, 38L, 3L, 2L, 7L, 7L, 5L, 7L, 4L, 4L, 22L, 36L, 36L, 22L, - 23L, 23L, 25L, 26L, 22L, 49L, 57L, 51L, 51L, 46L, 48L, 67L, 42L, - 63L, 61L, 62L, 88L, 71L, 5L, 15L, 3L, 3L, 7L, 3L, 2L, 14L, 9L, - 4L, 4L, 3L, 23L, 23L, 23L, 34L, 23L, 19L, 17L, 23L, 36L, 27L, - 27L, 55L, 41L, 44L, 41L, 47L, 47L, 57L, 56L, 56L, 56L, 56L, 56L, - 56L, 51L, 51L, 54L, 70L, 60L, 59L, 69L, 52L, 88L, 78L, 75L, 3L, - 3L, 14L, 2L, 2L, 4L, 14L, 3L, 13L, 13L, 13L, 5L, 4L, 6L, 13L, - 1L, 20L, 30L, 32L, 23L, 23L, 36L, 28L, 12L, 23L, 39L, 17L, 19L, - 45L, 49L, 44L, 46L, 50L, 57L, 57L, 51L, 69L, 66L, 38L, 59L, 59L, - 66L, 64L, 1L, 4L, 8L, 1L, 13L, 13L, 8L, 8L, 8L, 13L, 13L, 8L, - 14L, 8L, 8L, 5L, 8L, 8L, 23L, 22L, 30L, 26L, 22L, 22L, 23L, 23L, - 23L, 34L, 25L, 29L, 16L, 24L, 24L, 54L, 51L, 45L, 42L, 50L, 56L, - 56L, 67L, 56L, 40L, 57L, 52L, 54L, 38L, 60L, 69L, 66L, 66L, 66L, - 60L, 38L, 54L, 70L, 9L, 7L, 1L, 4L, 11L, 15L, 7L, 4L, 7L, 11L, - 5L, 4L, 35L, 19L, 20L, 24L, 24L, 36L, 36L, 28L, 24L, 24L, 27L, - 51L, 49L, 55L, 46L, 51L, 57L, 57L, 57L, 57L, 57L, 10L, 51L, 57L, - 51L, 52L, 65L, 19L, 39L, 21L, 22L, 27L, 22L, 30L, 22L, 36L, 17L, - 36L, 19L, 49L, 49L, 67L, 42L, 48L, 45L, 57L, 53L, 51L, 41L, 47L, - 44L, 53L, 41L, 45L, 44L, 42L, 10L, 55L, 46L, 45L, 57L, 64L, 65L, - 54L, 62L, 62L, 66L, 66L, 16L, 36L, 36L, 12L, 34L, 22L, 18L, 30L, - 55L, 40L, 51L, 47L, 47L, 43L, 53L, 53L, 53L, 40L, 10L, 70L, 64L, - 58L, 66L, 66L, 68L, 70L, 60L, 59L, 68L, 22L, 22L, 34L, 16L, 30L, - 18L, 51L, 56L, 49L, 42L, 53L, 51L, 53L, 53L, 50L, 56L, 40L, 54L, - 54L, 69L, 61L, 7L, 36L, 23L, 35L, 12L, 21L, 16L, 36L, 26L, 30L, - 39L, 22L, 40L, 44L, 10L, 51L, 43L, 56L, 51L, 65L, 64L, 62L, 62L, - 88L, 69L, 63L, 58L, 69L, 60L, 64L, 62L, 11L, 5L, 5L, 11L, 9L, - 5L, 4L, 11L, 11L, 7L, 7L, 7L, 7L, 11L, 11L, 11L, 11L, 19L, 19L, - 12L, 12L, 12L, 12L, 37L, 12L, 22L, 22L, 19L, 27L, 24L, 24L, 19L, - 43L, 50L, 50L, 40L, 53L, 54L, 56L, 55L, 46L, 41L, 10L, 88L, 88L, - 88L, 59L, 69L, 69L, 69L, 62L, 8L, 8L, 8L, 11L, 8L, 7L, 1L, 11L, - 11L, 11L, 7L, 7L, 12L, 37L, 29L, 29L, 29L, 28L, 21L, 35L, 35L, - 36L, 50L, 51L, 40L, 44L, 44L, 54L, 58L, 61L, 52L, 88L, 59L, 38L, - 68L, 68L, 69L, 69L, 60L, 61L, 68L, 63L, 38L, 4L, 4L, 4L, 15L, - 15L, 15L, 35L, 23L, 21L, 21L, 29L, 36L, 25L, 30L, 27L, 18L, 41L, - 47L, 48L, 48L, 51L, 58L, 69L, 70L, 38L, 71L, 52L, 52L, 52L, 54L, - 65L, 59L, 65L, 54L, 38L, 38L, 88L, 70L, 2L, 11L, 3L, 11L, 5L, - 11L, 7L, 4L, 15L, 15L, 17L, 34L, 34L, 17L, 45L, 47L, 46L, 47L, - 51L, 45L, 51L, 50L, 52L, 69L, 66L, 70L, 69L, 54L, 59L, 88L, 68L, - 61L, 52L, 60L, 69L, 70L, 4L, 4L, 15L, 15L, 15L, 4L, 11L, 15L, - 8L, 13L, 5L, 36L, 35L, 33L, 34L, 40L, 47L, 56L, 48L, 69L, 71L, - 71L, 61L, 71L, 71L, 69L, 71L, 68L, 69L, 54L, 3L, 3L, 15L, 7L, - 3L, 1L, 1L, 4L, 2L, 1L, 4L, 34L, 34L, 29L, 34L, 34L, 17L, 16L, - 29L, 29L, 44L, 57L, 57L, 40L, 61L, 52L, 52L, 52L, 60L, 59L, 38L, - 61L, 64L, 66L, 64L, 52L, 88L, 63L, 52L, 30L, 34L, 34L, 34L, 23L, - 36L, 19L, 36L, 36L, 11L, 11L, 4L, 15L, 6L, 28L, 28L, 28L, 26L, - 34L, 34L, 34L, 17L, 34L, 30L, 27L, 18L, 25L, 29L, 36L, 9L, 7L, - 15L, 4L, 4L, 4L, 7L, 23L, 23L, 28L, 22L, 30L, 23L, 28L, 31L, - 7L, 4L, 4L, 15L, 15L, 13L, 5L, 4L, 23L, 23L, 23L, 12L, 35L, 23L, - 36L, 28L, 22L, 22L, 30L, 36L, 3L, 5L, 5L, 23L, 23L, 36L, 28L, - 17L, 19L, 5L, 4L, 15L, 23L, 22L, 22L, 19L, 26L, 15L, 15L, 7L, - 11L, 4L, 23L, 19L, 34L, 17L, 17L, 17L, 34L, 25L, 34L, 11L, 11L, - 11L, 8L, 4L, 4L, 4L, 1L, 22L, 25L, 16L, 24L, 3L, 8L, 5L, 4L, - 15L, 15L, 15L, 1L, 3L, 26L, 22L, 31L, 19L, 18L, 18L, 36L, 4L, - 5L, 14L, 11L, 19L, 18L, 17L, 35L, 36L, 36L, 27L, 9L, 11L, 11L, - 3L, 4L, 36L, 36L, 28L, 22L, 37L, 19L, 26L, 29L, 21L, 11L, 11L, - 7L, 4L, 4L, 22L, 22L, 12L, 12L, 37L, 33L, 33L, 7L, 4L, 3L, 3L, - 22L, 37L, 37L, 12L, 25L, 4L, 11L, 7L, 15L, 15L, 1L, 4L, 20L, - 28L, 19L, 36L, 35L, 12L, 22L, 15L, 15L, 4L, 1L, 1L, 36L, 25L, - 16L, 2L, 4L, 15L, 2L, 14L, 36L, 34L, 21L, 21L, 21L, 34L, 16L, - 28L, 34L, 27L, 27L, 14L, 11L, 3L, 5L, 1L, 36L, 36L, 36L, 78L, - 77L, 4L, 13L, 15L, 7L, 2L, 7L, 14L, 76L, 85L, 86L, 86L, 87L, - 82L, 77L, 76L, 86L, 86L, 80L, 80L, 83L, 82L, 78L, 72L, 72L, 78L, - 86L, 14L, 7L, 7L, 5L, 5L, 80L, 74L, 81L, 80L, 75L, 84L, 81L, - 74L, 4L, 13L, 3L, 4L, 11L, 9L, 13L, 87L, 87L, 76L, 81L, 77L, - 15L, 2L, 5L, 3L, 1L, 13L, 8L, 85L, 87L, 75L, 76L, 78L, 78L, 81L, - 86L, 84L, 90L, 82L, 72L, 77L, 85L, 76L, 82L, 87L, 81L, 77L, 84L, - 77L, 75L, 83L, 86L, 83L, 80L, 85L, 87L, 75L, 76L, 8L, 14L, 8L, - 90L, 85L, 84L, 83L, 76L, 81L, 81L, 83L, 8L, 8L, 77L, 90L, 77L, - 77L, 77L, 83L, 90L, 77L, 77L, 83L, 83L, 84L, 90L, 75L, 74L, 74L, - 76L, 11L, 2L, 80L, 81L, 85L, 90L, 77L, 80L, 77L, 83L, 77L, 73L, - 73L, 73L, 73L, 81L, 75L, 80L, 90L, 5L, 11L, 3L, 3L, 77L, 77L, - 84L, 82L, 77L, 82L, 74L, 89L, 74L, 89L, 89L, 79L, 79L, 89L, 89L, - 79L, 79L, 80L, 77L, 80L, 78L, 80L, 80L, 80L, 73L, 86L, 86L, 5L, - 7L, 14L, 7L, 15L, 7L, 14L, 8L, 80L, 81L, 80L, 87L, 87L, 87L, - 87L, 87L, 79L, 81L, 78L, 77L, 74L, 8L, 4L, 14L, 14L, 75L, 75L, - 74L, 74L, 74L, 74L, 74L, 72L, 11L, 3L, 6L, 14L, 7L, 11L, 87L, - 87L, 87L, 86L, 87L, 78L, 76L, 7L, 4L, 14L, 9L, 3L, 5L, 9L, 5L, - 2L, 2L, 72L, 79L, 85L, 73L, 74L, 72L, 86L, 86L, 78L, 5L, 4L, - 6L, 11L, 7L, 7L, 7L, 1L, 4L, 11L, 72L, 84L, 84L, 85L, 81L, 76L, - 81L, 85L, 78L, 78L, 77L, 81L, 80L, 84L, 86L, 90L, 74L, 74L, 72L, - 88L, 62L, 58L, 88L, 88L, 88L, 88L, 62L, 62L, 60L, 38L, 54L, 69L, - 69L, 59L, 59L, 59L, 68L, 87L, 86L, 77L, 84L, 80L, 83L, 81L, 72L, - 74L, 86L, 74L, 59L, 88L, 68L, 66L, 59L, 66L, 69L, 38L, 52L, 60L, - 68L, 59L, 59L, 66L, 60L, 59L, 64L, 74L, 74L, 84L, 85L, 77L, 90L, - 77L, 87L, 74L, 75L, 90L, 69L, 69L, 63L, 63L, 58L, 69L, 69L, 69L, - 69L, 52L, 38L, 71L, 69L, 69L, 74L, 84L, 81L, 85L, 77L, 85L, 76L, - 81L, 49L, 49L, 47L, 48L, 49L, 44L, 44L, 44L, 41L, 54L, 88L, 61L, - 70L, 52L, 54L, 54L, 88L, 64L, 60L, 60L, 69L, 71L, 54L, 68L, 69L, - 62L, 70L, 64L, 86L, 74L, 77L, 75L, 90L, 81L, 81L, 77L, 78L, 44L, - 49L, 49L, 43L, 51L, 50L, 50L, 47L, 47L, 41L, 44L, 44L, 40L, 44L, - 56L, 50L, 64L, 70L, 69L, 68L, 69L, 61L, 63L, 69L, 69L, 69L, 61L, - 64L, 47L, 47L, 47L, 54L, 50L, 50L, 50L, 50L, 51L, 53L, 44L, 45L, - 42L, 56L, 67L, 56L, 56L, 56L, 56L, 56L, 70L, 62L, 62L, 52L, 38L, - 69L, 60L, 54L, 63L, 63L, 53L, 53L, 67L, 67L, 53L, 42L, 53L, 57L, - 45L, 53L, 56L, 53L, 53L, 42L, 57L, 46L, 45L, 69L, 69L, 63L, 62L, - 70L, 88L, 71L, 78L, 76L, 76L, 82L, 78L, 16L, 90L, 84L, 76L, 90L, - 75L, 42L, 53L, 41L, 10L, 57L, 57L, 10L, 57L, 57L, 57L, 10L, 45L, - 50L, 53L, 10L, 57L, 51L, 45L, 53L, 47L, 41L, 90L, 90L, 90L, 77L, - 83L, 85L, 72L, 72L, 85L, 87L, 82L, 76L, 84L, 75L, 72L, 77L, 57L, - 42L, 40L, 45L, 45L, 53L, 57L, 41L, 48L, 10L, 10L, 41L, 46L, 41L, - 51L, 49L, 45L, 45L, 76L, 80L, 80L, 81L, 83L, 80L, 87L, 85L, 86L, - 90L, 90L, 16L, 16L, 75L, 41L, 43L, 43L, 46L, 51L, 43L, 48L, 41L, - 62L, 62L, 69L, 60L, 52L, 54L, 85L, 90L, 90L, 90L, 83L, 77L, 77L, - 83L, 83L, 83L, 83L, 77L, 90L, 90L, 87L, 77L, 90L, 90L, 80L, 80L, - 77L, 82L, 52L, 69L, 38L, 64L, 59L, 69L, 70L, 61L, 69L, 69L, 63L, - 73L, 73L, 73L, 74L, 81L, 90L, 89L, 89L, 89L, 79L, 89L, 89L, 89L, - 79L, 87L, 79L, 79L, 80L, 80L, 79L, 80L, 78L, 80L, 59L, 69L, 64L, - 69L, 69L, 71L, 71L, 61L, 60L, 61L, 61L, 52L, 64L, 60L, 60L, 71L, - 52L, 80L, 80L, 87L, 87L, 87L, 87L, 74L, 74L, 78L, 90L, 87L, 87L, - 74L, 87L, 87L, 87L, 75L, 74L, 80L, 86L, 38L, 69L, 69L, 54L, 38L, - 52L, 38L, 38L, 52L, 38L, 38L, 65L, 70L, 64L, 72L, 87L, 74L, 72L, - 84L, 84L, 81L, 76L, 81L, 76L, 86L, 86L, 74L, 76L, 80L, 80L, 72L, - 74L, 86L, 72L, 70L, 63L, 64L, 58L, 62L, 54L, 88L, 88L, 88L, 88L, - 64L, 88L, 71L, 64L, 62L, 64L, 86L, 86L, 86L, 86L, 86L, 80L, 86L, - 85L, 81L, 85L, 80L, 90L, 83L, 80L, 81L, 81L, 74L, 78L, 71L, 38L, - 70L, 66L, 59L, 66L, 88L, 64L, 70L, 54L, 88L, 65L, 61L, 61L, 38L, - 60L, 87L, 75L, 16L, 83L, 87L, 87L, 87L, 87L, 72L, 74L, 72L, 62L, - 62L, 54L, 66L, 71L, 61L, 60L, 69L, 69L, 62L, 63L, 64L, 84L, 74L, - 87L, 72L, 74L, 84L, 86L, 86L, 80L, 80L, 66L, 63L, 64L, 69L, 70L, - 69L, 64L, 66L, 70L, 69L, 58L, 54L, 69L, 66L, 63L, 69L, 72L, 80L, - 80L, 80L, 84L, 77L, 78L, 17L, 22L, 22L, 18L, 27L, 27L, 27L, 42L, - 55L, 49L, 55L, 69L, 71L, 71L, 90L, 72L, 87L, 87L, 41L, 47L, 67L, - 50L, 51L, 48L, 57L, 57L, 57L, 45L, 46L, 47L, 60L, 70L, 60L, 61L, - 69L, 54L, 65L, 86L, 80L, 80L, 76L, 78L, 83L, 90L, 53L, 49L, 56L, - 57L, 49L, 46L, 45L, 45L, 47L, 47L, 45L, 45L, 41L, 40L, 52L, 64L, - 52L, 64L, 38L, 83L, 83L, 85L, 77L, 83L, 44L, 40L, 10L, 49L, 49L, - 47L, 49L, 49L, 49L, 40L, 44L, 56L, 54L, 44L, 70L, 70L, 54L, 52L, - 64L, 64L, 62L, 64L, 52L, 76L, 76L, 86L, 84L, 90L, 82L, 73L, 46L, - 41L, 40L, 50L, 50L, 50L, 41L, 53L, 44L, 54L, 45L, 55L, 44L, 44L, - 51L, 67L, 45L, 64L, 88L, 88L, 88L, 64L, 65L, 64L, 64L, 62L, 62L, - 76L, 77L, 77L, 80L, 82L, 82L, 79L, 82L, 77L, 45L, 45L, 50L, 51L, - 47L, 48L, 48L, 45L, 56L, 47L, 56L, 56L, 56L, 56L, 56L, 42L, 56L, - 58L, 58L, 58L, 58L, 64L, 62L, 68L, 71L, 62L, 69L, 80L, 80L, 56L, - 56L, 42L, 44L, 50L, 67L, 67L, 67L, 57L, 67L, 56L, 56L, 57L, 57L, - 57L, 10L, 10L, 10L, 57L, 57L, 10L, 46L, 45L, 65L, 84L, 76L, 80L, - 80L, 80L, 79L, 75L, 90L, 85L, 90L, 82L, 74L, 74L, 74L, 89L, 79L, - 53L, 42L, 57L, 10L, 10L, 10L, 49L, 40L, 42L, 47L, 46L, 50L, 53L, - 49L, 88L, 65L, 60L, 54L, 59L, 59L, 59L, 59L, 68L, 69L, 69L, 74L, - 87L, 80L, 90L, 16L, 85L, 89L, 79L, 89L, 82L, 82L, 45L, 53L, 56L, - 43L, 68L, 69L, 69L, 69L, 60L, 66L, 69L, 69L, 82L, 77L, 90L, 87L, - 75L, 74L, 79L, 79L, 74L, 80L, 45L, 55L, 10L, 70L, 65L, 52L, 59L, - 69L, 69L, 75L, 77L, 90L, 82L, 16L, 77L, 75L, 80L, 80L, 74L, 87L, - 87L, 87L, 49L, 53L, 53L, 57L, 59L, 66L, 66L, 66L, 69L, 69L, 69L, - 69L, 62L, 64L, 65L, 69L, 77L, 80L, 77L, 90L, 90L, 80L, 85L, 75L, - 87L, 87L, 51L, 51L, 41L, 69L, 66L, 69L, 66L, 60L, 54L, 38L, 88L, - 61L, 81L, 77L, 77L, 77L, 77L, 80L, 80L, 74L, 51L, 49L, 47L, 40L, - 51L, 70L, 70L, 59L, 52L, 27L, 35L, 36L, 36L, 36L, 25L, 36L, 36L, - 30L, 33L, 16L, 25L, 28L, 36L, 36L, 21L, 35L, 36L, 4L, 5L, 22L, - 35L, 35L, 36L, 34L, 34L, 34L, 3L, 4L, 23L, 19L, 28L, 22L, 22L, - 22L, 24L, 3L, 13L, 7L, 23L, 23L, 23L, 23L, 35L, 19L, 12L, 31L, - 28L, 28L, 34L, 34L, 7L, 2L, 23L, 12L, 12L, 37L, 34L, 34L, 21L, - 36L, 29L, 29L, 27L, 21L, 21L, 34L, 2L, 4L, 2L, 34L, 34L, 36L, - 16L, 36L, 19L, 8L, 8L, 34L, 34L, 34L, 30L, 19L, 22L, 7L, 14L, - 34L, 17L, 35L, 37L, 37L, 1L, 4L, 13L, 21L, 23L, 16L, 35L, 17L, - 36L, 22L, 19L, 17L, 34L, 23L, 30L, 23L, 23L, 23L, 23L, 28L, 36L, - 21L, 25L, 35L, 26L, 22L, 28L, 34L, 34L, 22L, 36L, 24L, 24L, 36L, - 23L, 22L, 17L, 17L, 27L, 24L, 24L, 28L, 28L, 17L, 22L, 22L, 22L, - 19L, 19L, 19L, 17L, 34L, 25L, 29L, 25L, 16L, 30L, 28L, 28L, 22L, - 36L, 36L, 28L, 19L, 19L, 19L, 34L, 36L, 36L, 28L, 19L, 25L, 3L, - 49L, 50L, 50L, 51L, 51L, 40L, 47L, 54L, 70L, 88L, 88L, 88L, 64L, - 88L, 64L, 88L, 88L, 66L, 69L, 69L, 63L, 63L, 63L, 58L, 63L, 80L, - 84L, 84L, 86L, 81L, 85L, 79L, 82L, 74L, 74L, 82L, 87L, 74L, 78L, - 76L, 85L, 77L, 78L, 14L, 14L, 4L, 11L, 8L, 8L, 9L, 1L, 8L, 8L, - 14L, 7L, 11L, 5L, 11L, 8L, 11L, 2L, 3L, 4L, 4L, 7L, 4L, 4L, 15L, - 4L, 9L, 4L, 67L, 42L, 56L, 56L, 56L, 56L, 51L, 56L, 51L, 41L, - 44L, 49L, 56L, 41L, 53L, 46L, 56L, 56L, 50L, 67L, 64L, 54L, 65L, - 65L, 62L, 64L, 58L, 58L, 88L, 69L, 69L, 88L, 69L, 38L, 69L, 69L, - 38L, 85L, 77L, 84L, 77L, 74L, 89L, 79L, 79L, 89L, 89L, 79L, 89L, - 82L, 89L, 87L, 85L, 83L, 82L, 82L, 75L, 78L, 74L, 76L, 74L, 4L, - 3L, 6L, 11L, 5L, 5L, 14L, 8L, 14L, 8L, 13L, 8L, 8L, 13L, 5L, - 2L, 7L, 13L, 2L, 9L, 9L, 11L, 5L, 11L, 5L, 5L, 5L, 11L, 4L, 15L, - 15L, 7L, 7L, 11L, 4L, 8L, 11L, 11L, 7L, 4L, 7L, 15L, 56L, 67L, - 56L, 67L, 67L, 54L, 46L, 67L, 51L, 56L, 40L, 67L, 68L, 62L, 70L, - 65L, 59L, 54L, 54L, 54L, 38L, 38L, 68L, 69L, 88L, 69L, 52L, 70L, - 69L, 59L, 90L, 80L, 75L, 90L, 89L, 89L, 79L, 79L, 75L, 79L, 87L, - 80L, 80L, 74L, 72L, 77L, 76L, 84L, 86L, 77L, 85L, 86L, 78L, 84L, - 84L, 90L, 84L, 84L, 90L, 2L, 2L, 4L, 6L, 13L, 13L, 1L, 3L, 8L, - 8L, 11L, 11L, 13L, 1L, 7L, 14L, 5L, 15L, 5L, 16L, 36L, 19L, 30L, - 27L, 36L, 36L, 21L, 19L, 39L, 39L, 22L, 22L, 67L, 57L, 57L, 57L, - 10L, 57L, 57L, 57L, 77L, 87L, 87L, 84L, 3L, 1L, 13L, 15L, 5L, - 8L, 11L, 8L, 4L, 2L, 4L, 7L, 15L, 15L, 13L, 7L, 15L, 8L, 4L, - 5L, 4L, 15L, 15L, 4L, 4L, 4L, 15L, 15L, 15L, 15L, 15L, 39L, 22L, - 27L, 23L, 19L, 27L, 27L, 18L, 36L, 24L, 22L, 35L, 23L, 37L, 29L, - 57L, 57L, 67L, 51L, 51L, 53L, 53L, 85L, 87L, 85L, 84L, 72L, 87L, - 87L, 75L, 79L, 34L, 24L, 27L, 35L, 35L, 45L, 40L, 41L, 40L, 49L, - 40L, 41L, 51L, 47L, 48L, 44L, 48L, 45L, 57L, 10L, 44L, 53L, 53L, - 7L, 56L, 75L, 81L, 75L, 77L, 83L, 72L, 79L, 55L, 56L, 46L, 45L, - 43L, 51L, 47L, 57L, 67L, 46L, 51L, 10L, 48L, 41L, 46L, 10L, 83L, - 85L, 74L, 87L, 87L, 75L, 74L, 86L, 51L, 44L, 45L, 44L, 49L, 45L, - 53L, 49L, 46L, 57L, 47L, 90L, 87L, 85L, 80L, 75L, 84L, 44L, 46L, - 51L, 46L, 67L, 51L, 44L, 51L, 16L, 16L, 81L, 85L, 72L, 72L, 80L, - 90L, 74L, 74L, 43L, 46L, 43L, 40L, 55L, 48L, 57L, 51L, 63L, 62L, - 64L, 70L, 64L, 61L, 73L, 16L, 84L, 84L, 77L, 77L, 74L, 72L, 84L, - 81L, 85L, 76L, 81L, 44L, 44L, 45L, 51L, 57L, 51L, 51L, 51L, 57L, - 71L, 61L, 54L, 60L, 83L, 84L, 76L, 86L, 86L, 86L, 81L, 43L, 50L, - 50L, 50L, 41L, 57L, 61L, 71L, 63L, 54L, 69L, 61L, 83L, 83L, 90L, - 83L, 90L, 77L, 74L, 86L, 86L, 86L, 51L, 44L, 45L, 41L, 44L, 45L, - 65L, 60L, 88L, 62L, 70L, 70L, 63L, 69L, 69L, 69L, 69L, 63L, 77L, - 74L, 80L, 87L, 87L, 87L, 77L, 77L, 81L, 86L, 82L, 86L, 41L, 40L, - 53L, 46L, 41L, 69L, 63L, 61L, 64L, 69L, 88L, 70L, 52L, 59L, 88L, - 59L, 59L, 62L, 62L, 64L, 88L, 58L, 69L, 69L, 83L, 78L, 76L, 85L, - 77L, 77L, 90L, 75L, 80L, 75L, 90L, 74L, 74L, 72L, 13L, 14L, 5L, - 5L, 2L, 7L, 5L, 7L, 51L, 44L, 51L, 71L, 54L, 52L, 52L, 64L, 60L, - 61L, 61L, 60L, 68L, 68L, 71L, 68L, 59L, 66L, 71L, 71L, 66L, 69L, - 63L, 71L, 64L, 71L, 69L, 80L, 90L, 80L, 82L, 78L, 84L, 76L, 85L, - 86L, 2L, 8L, 2L, 51L, 43L, 71L, 62L, 65L, 64L, 38L, 38L, 65L, - 58L, 38L, 65L, 69L, 63L, 70L, 54L, 59L, 59L, 66L, 66L, 60L, 69L, - 85L, 83L, 75L, 80L, 73L, 79L, 79L, 82L, 77L, 76L, 74L, 78L, 78L, - 90L, 74L, 74L, 87L, 86L, 8L, 5L, 7L, 4L, 4L, 70L, 72L, 82L, 89L, - 80L, 87L, 85L, 87L, 87L, 87L, 83L, 76L, 63L, 69L, 38L, 38L, 81L, - 73L, 90L, 79L, 87L, 75L, 80L, 80L, 80L, 75L, 78L, 80L, 86L, 76L, - 87L, 80L, 90L, 74L, 64L, 65L, 62L, 69L, 16L, 16L, 77L, 77L, 90L, - 90L, 80L, 80L, 80L, 72L, 72L, 78L, 79L, 85L, 74L, 74L, 75L, 65L, - 62L, 58L, 70L, 90L, 72L, 87L, 86L, 85L, 74L, 75L, 75L, 84L, 75L, - 75L, 90L, 87L, 77L, 78L, 85L, 69L, 66L, 66L, 86L, 82L, 74L, 84L, - 90L, 77L, 77L, 59L, 59L, 66L, 59L, 75L, 75L, 84L, 84L, 83L, 83L, - 90L, 66L, 66L, 66L, 66L, 52L, 61L, 82L, 78L, 84L, 85L, 86L, 90L, - 90L, 87L, 90L, 69L, 69L, 58L, 69L, 58L, 63L, 69L, 81L, 86L, 87L, - 76L, 90L, 77L, 69L, 72L, 81L, 69L, 69L, 69L, 54L, 66L, 64L, 64L, - 84L, 87L, 80L, 80L, 80L, 87L, 54L, 71L, 61L, 54L, 80L, 77L, 90L, - 64L, 52L, 64L, 54L, 52L, 77L, 84L, 90L, 85L, 90L, 90L, 77L, 73L, - 87L, 87L, 87L, 87L, 74L, 78L, 84L, 85L, 76L, 69L, 69L, 63L, 88L, - 58L, 70L, 90L, 90L, 80L, 80L, 84L, 84L, 87L, 87L, 87L, 74L, 89L, - 76L, 86L, 87L, 86L, 81L, 90L, 54L, 52L, 71L, 60L, 60L, 16L, 16L, - 81L, 73L, 79L, 79L, 89L, 86L, 86L, 80L, 76L, 76L, 85L, 87L, 75L, - 77L, 55L, 45L, 46L, 46L, 56L, 42L, 46L, 49L, 55L, 70L, 71L, 69L, - 38L, 69L, 4L, 15L, 3L, 13L, 2L, 15L, 2L, 2L, 2L, 2L, 8L, 2L, - 15L, 51L, 44L, 44L, 46L, 46L, 40L, 44L, 43L, 43L, 49L, 50L, 50L, - 55L, 46L, 57L, 60L, 62L, 63L, 69L, 63L, 85L, 85L, 81L, 80L, 80L, - 80L, 84L, 80L, 87L, 85L, 81L, 86L, 85L, 81L, 85L, 86L, 85L, 6L, - 1L, 2L, 4L, 1L, 6L, 3L, 8L, 28L, 27L, 22L, 23L, 23L, 22L, 22L, - 30L, 34L, 22L, 19L, 28L, 36L, 44L, 55L, 45L, 50L, 48L, 57L, 41L, - 49L, 44L, 43L, 40L, 51L, 68L, 61L, 66L, 64L, 61L, 61L, 52L, 4L, - 15L, 4L, 13L, 1L, 14L, 14L, 5L, 26L, 19L, 19L, 31L, 18L, 28L, - 19L, 54L, 44L, 42L, 42L, 42L, 42L, 56L, 56L, 56L, 56L, 56L, 41L, - 41L, 56L, 56L, 40L, 56L, 50L, 57L, 67L, 67L, 77L, 87L, 87L, 83L, - 85L, 74L, 77L, 78L, 74L, 84L, 84L, 84L, 90L, 90L, 86L, 85L, 80L, - 79L, 86L, 87L, 80L, 82L, 75L, 86L, 78L, 2L, 15L, 14L, 8L, 8L, - 8L, 14L, 14L, 8L, 28L, 23L, 26L, 16L, 16L, 33L, 30L, 25L, 28L, - 41L, 40L, 44L, 51L, 51L, 51L, 51L, 48L, 49L, 61L, 61L, 60L, 61L, - 61L, 66L, 59L, 66L, 66L, 69L, 36L, 19L, 22L, 36L, 36L, 23L, 19L, - 28L, 19L, 36L, 22L, 22L, 36L, 36L, 28L, 28L, 28L, 27L, 57L, 57L, - 10L, 53L, 53L, 57L, 57L, 10L, 46L, 45L, 57L, 10L, 10L, 10L, 49L, - 51L, 45L, 67L, 53L, 53L, 41L, 43L, 44L, 85L, 86L, 86L, 86L, 85L, - 77L, 77L, 76L, 86L, 82L, 77L, 2L, 5L, 7L, 1L, 7L, 7L, 7L, 9L, - 14L, 17L, 23L, 35L, 22L, 22L, 22L, 22L, 23L, 22L, 34L, 17L, 35L, - 35L, 21L, 21L, 47L, 53L, 44L, 44L, 44L, 61L, 52L, 52L, 52L, 86L, - 81L, 87L, 72L, 83L, 82L, 84L, 84L, 90L, 76L, 89L, 86L, 81L, 72L, - 75L, 76L, 36L, 23L, 23L, 23L, 28L, 23L, 36L, 12L, 20L, 17L, 23L, - 23L, 22L, 22L, 22L, 22L, 23L, 23L, 23L, 23L, 74L, 86L, 14L, 15L, - 11L, 11L, 11L, 11L, 11L, 6L, 23L, 19L, 19L, 19L, 19L, 19L, 35L, - 28L, 21L, 22L, 22L, 22L, 34L, 44L, 46L, 55L, 56L, 40L, 41L, 60L, - 63L, 69L, 69L, 78L, 80L, 87L, 74L, 80L, 74L, 81L, 90L, 74L, 86L, - 77L, 74L, 76L, 23L, 22L, 22L, 19L, 12L, 22L, 22L, 36L, 30L, 20L, - 33L, 17L, 35L, 35L, 35L, 19L, 86L, 86L, 16L, 82L, 25L, 80L, 74L, - 5L, 5L, 5L, 6L, 11L, 5L, 6L, 5L, 23L, 30L, 17L, 35L, 35L, 35L, - 12L, 19L, 34L, 37L, 36L, 21L, 45L, 42L, 42L, 56L, 53L, 56L, 56L, - 56L, 56L, 38L, 52L, 81L, 77L, 74L, 74L, 84L, 82L, 75L, 86L, 85L, - 72L, 72L, 37L, 12L, 12L, 12L, 12L, 12L, 12L, 12L, 29L, 21L, 34L, - 21L, 21L, 21L, 34L, 34L, 34L, 34L, 34L, 34L, 17L, 17L, 34L, 53L, - 53L, 53L, 40L, 45L, 46L, 53L, 42L, 10L, 48L, 48L, 53L, 10L, 53L, - 45L, 54L, 77L, 77L, 85L, 77L, 72L, 90L, 16L, 75L, 86L, 72L, 81L, - 75L, 90L, 90L, 79L, 90L, 81L, 87L, 72L, 78L, 77L, 80L, 9L, 7L, - 5L, 5L, 9L, 7L, 4L, 4L, 12L, 12L, 37L, 12L, 37L, 12L, 12L, 12L, - 12L, 12L, 30L, 36L, 34L, 21L, 35L, 27L, 18L, 56L, 56L, 56L, 67L, - 53L, 64L, 38L, 64L, 65L, 65L, 86L, 80L, 84L, 76L, 72L, 73L, 76L, - 74L, 16L, 82L, 74L, 17L, 30L, 36L, 36L, 36L, 18L, 34L, 34L, 29L, - 29L, 34L, 34L, 17L, 34L, 17L, 17L, 29L, 54L, 45L, 45L, 49L, 49L, - 41L, 51L, 41L, 41L, 45L, 40L, 40L, 51L, 41L, 53L, 16L, 86L, 73L, - 90L, 72L, 16L, 16L, 82L, 84L, 90L, 77L, 78L, 80L, 81L, 15L, 15L, - 15L, 7L, 11L, 11L, 11L, 21L, 21L, 21L, 34L, 34L, 36L, 19L, 23L, - 34L, 36L, 25L, 53L, 56L, 56L, 56L, 54L, 64L, 64L, 64L, 63L, 63L, - 62L, 54L, 84L, 81L, 79L, 1L, 5L, 3L, 6L, 8L, 2L, 2L, 3L, 4L, - 4L, 7L, 1L, 15L, 34L, 34L, 34L, 34L, 34L, 27L, 29L, 28L, 36L, - 31L, 25L, 36L, 36L, 34L, 42L, 53L, 51L, 48L, 71L, 88L, 62L, 69L, - 38L, 70L, 88L, 62L, 68L, 60L, 77L, 77L, 83L, 77L, 74L, 90L, 74L, - 87L, 74L, 74L, 82L, 11L, 13L, 4L, 7L, 11L, 11L, 11L, 7L, 7L, - 4L, 34L, 34L, 34L, 34L, 17L, 17L, 47L, 45L, 67L, 67L, 57L, 67L, - 53L, 49L, 64L, 64L, 88L, 64L, 88L, 9L, 3L, 7L, 4L, 11L, 2L, 4L, - 3L, 8L, 3L, 3L, 6L, 3L, 11L, 11L, 4L, 27L, 27L, 27L, 30L, 33L, - 33L, 16L, 16L, 34L, 12L, 26L, 16L, 22L, 22L, 22L, 65L, 38L, 63L, - 68L, 71L, 71L, 65L, 61L, 71L, 61L, 61L, 61L, 60L, 60L, 84L, 83L, - 86L, 86L, 84L, 74L, 86L, 77L, 72L, 76L, 81L, 7L, 7L, 4L, 15L, - 15L, 15L, 15L, 17L, 36L, 31L, 36L, 34L, 34L, 34L, 34L, 34L, 34L, - 43L, 46L, 42L, 57L, 51L, 67L, 67L, 53L, 88L, 88L, 88L, 88L, 64L, - 1L, 2L, 5L, 2L, 14L, 2L, 3L, 14L, 14L, 14L, 34L, 36L, 22L, 36L, - 37L, 21L, 27L, 31L, 26L, 22L, 24L, 24L, 24L, 28L, 28L, 27L, 30L, - 30L, 27L, 30L, 30L, 19L, 22L, 34L, 61L, 60L, 52L, 69L, 65L, 65L, - 52L, 52L, 38L, 38L, 38L, 64L, 65L, 63L, 64L, 88L, 77L, 83L, 85L, - 80L, 77L, 81L, 90L, 74L, 74L, 86L, 77L, 5L, 7L, 1L, 5L, 7L, 15L, - 34L, 17L, 17L, 17L, 34L, 34L, 29L, 16L, 43L, 45L, 49L, 41L, 56L, - 10L, 57L, 57L, 57L, 65L, 64L, 62L, 64L, 58L, 2L, 1L, 13L, 1L, - 5L, 5L, 8L, 8L, 8L, 14L, 13L, 8L, 5L, 2L, 2L, 2L, 11L, 13L, 2L, - 33L, 27L, 27L, 30L, 28L, 28L, 30L, 30L, 22L, 17L, 22L, 37L, 17L, - 36L, 36L, 35L, 22L, 19L, 30L, 39L, 22L, 39L, 54L, 54L, 64L, 59L, - 64L, 88L, 52L, 62L, 62L, 62L, 62L, 63L, 88L, 88L, 88L, 88L, 90L, - 77L, 83L, 73L, 82L, 82L, 82L, 84L, 90L, 87L, 77L, 77L, 78L, 7L, - 7L, 4L, 4L, 4L, 4L, 35L, 18L, 27L, 30L, 36L, 36L, 53L, 57L, 57L, - 51L, 10L, 10L, 41L, 41L, 41L, 54L, 45L, 58L, 58L, 62L, 58L, 1L, - 9L, 7L, 4L, 7L, 7L, 13L, 9L, 5L, 3L, 5L, 7L, 1L, 27L, 12L, 19L, - 19L, 19L, 28L, 17L, 27L, 27L, 16L, 27L, 56L, 88L, 88L, 58L, 58L, - 52L, 52L, 59L, 59L, 68L, 68L, 68L, 69L, 61L, 64L, 59L, 79L, 82L, - 83L, 89L, 89L, 89L, 74L, 89L, 89L, 89L, 89L, 86L, 81L, 81L, 85L, - 83L, 84L, 81L, 4L, 15L, 5L, 4L, 7L, 4L, 3L, 17L, 37L, 18L, 49L, - 10L, 57L, 57L, 10L, 47L, 53L, 46L, 51L, 41L, 58L, 1L, 7L, 7L, - 7L, 2L, 4L, 14L, 11L, 5L, 6L, 5L, 4L, 5L, 5L, 7L, 5L, 55L, 55L, - 49L, 40L, 45L, 43L, 45L, 69L, 59L, 54L, 66L, 69L, 66L, 66L, 69L, - 66L, 66L, 66L, 66L, 69L, 61L, 80L, 80L, 80L, 80L, 80L, 80L, 80L, - 81L, 87L, 77L, 81L, 90L, 86L, 15L, 3L, 6L, 7L, 2L, 2L, 3L, 3L, - 3L, 4L, 4L, 3L, 2L, 2L, 2L, 35L, 35L, 20L, 22L, 37L, 47L, 42L, - 67L, 57L, 40L, 47L, 55L, 67L, 67L, 67L, 45L, 51L, 59L, 63L, 38L, - 38L, 61L, 54L, 68L, 52L, 52L, 54L, 5L, 7L, 9L, 4L, 7L, 11L, 11L, - 13L, 11L, 4L, 1L, 5L, 7L, 7L, 7L, 11L, 11L, 11L, 51L, 40L, 46L, - 57L, 57L, 10L, 53L, 40L, 43L, 41L, 64L, 66L, 69L, 69L, 69L, 69L, - 69L, 69L, 69L, 69L, 69L, 70L, 54L, 70L, 69L, 87L, 87L, 87L, 87L, - 87L, 87L, 74L, 79L, 85L, 75L, 3L, 9L, 4L, 7L, 14L, 2L, 3L, 4L, - 13L, 25L, 21L, 31L, 28L, 22L, 26L, 22L, 34L, 36L, 22L, 47L, 40L, - 41L, 45L, 57L, 10L, 41L, 40L, 45L, 46L, 53L, 49L, 88L, 70L, 52L, - 70L, 52L, 54L, 59L, 4L, 7L, 7L, 4L, 15L, 15L, 15L, 15L, 15L, - 15L, 1L, 14L, 4L, 15L, 14L, 41L, 43L, 40L, 44L, 44L, 57L, 46L, - 54L, 40L, 44L, 47L, 40L, 54L, 40L, 38L, 88L, 69L, 38L, 88L, 61L, - 88L, 59L, 52L, 70L, 61L, 61L, 70L, 61L, 63L, 65L, 70L, 87L, 87L, - 75L, 74L, 6L, 4L, 1L, 36L, 36L, 19L, 19L, 19L, 37L, 34L, 30L, - 25L, 17L, 45L, 53L, 51L, 57L, 49L, 67L, 57L, 45L, 57L, 53L, 46L, - 63L, 69L, 69L, 69L, 59L, 68L, 59L, 38L, 63L, 60L, 7L, 15L, 15L, - 7L, 15L, 15L, 15L, 4L, 15L, 15L, 8L, 5L, 14L, 13L, 3L, 4L, 4L, - 3L, 1L, 40L, 44L, 44L, 54L, 41L, 49L, 50L, 50L, 50L, 41L, 41L, - 41L, 47L, 44L, 41L, 49L, 63L, 69L, 65L, 70L, 70L, 62L, 62L, 65L, - 54L, 61L, 78L, 72L, 78L, 72L, 87L, 72L, 74L, 78L, 84L, 84L, 84L, - 4L, 4L, 4L, 5L, 4L, 3L, 7L, 3L, 2L, 4L, 5L, 7L, 13L, 13L, 36L, - 36L, 36L, 28L, 22L, 25L, 22L, 24L, 29L, 29L, 30L, 18L, 28L, 49L, - 49L) - + + expected <- c( + 64L, 69L, 66L, 66L, 69L, 70L, 70L, 69L, 63L, 68L, 38L, 54L, + 62L, 54L, 71L, 38L, 52L, 52L, 82L, 79L, 73L, 84L, 87L, 76L, 77L, + 74L, 80L, 79L, 89L, 2L, 5L, 4L, 3L, 7L, 5L, 5L, 2L, 4L, 4L, 4L, + 14L, 2L, 36L, 24L, 30L, 27L, 22L, 36L, 36L, 19L, 34L, 49L, 44L, + 56L, 49L, 40L, 28L, 28L, 23L, 34L, 30L, 36L, 12L, 33L, 22L, 23L, + 23L, 23L, 23L, 35L, 22L, 22L, 22L, 22L, 22L, 67L, 51L, 51L, 49L, + 43L, 10L, 53L, 53L, 45L, 55L, 55L, 53L, 43L, 51L, 57L, 90L, 90L, + 90L, 80L, 77L, 82L, 73L, 82L, 73L, 82L, 77L, 76L, 77L, 78L, 79L, + 79L, 79L, 82L, 79L, 87L, 79L, 80L, 1L, 2L, 6L, 1L, 4L, 4L, 2L, + 5L, 5L, 5L, 18L, 25L, 18L, 51L, 10L, 40L, 53L, 40L, 41L, 41L, + 67L, 41L, 43L, 10L, 52L, 68L, 88L, 70L, 65L, 52L, 64L, 64L, 63L, + 54L, 69L, 70L, 70L, 58L, 69L, 64L, 54L, 69L, 58L, 89L, 79L, 87L, + 87L, 87L, 87L, 87L, 2L, 3L, 7L, 13L, 3L, 3L, 6L, 11L, 11L, 4L, + 4L, 2L, 1L, 6L, 1L, 3L, 1L, 1L, 43L, 49L, 48L, 46L, 46L, 43L, + 54L, 43L, 10L, 41L, 48L, 22L, 23L, 19L, 28L, 23L, 27L, 30L, 35L, + 35L, 35L, 35L, 35L, 19L, 19L, 19L, 19L, 12L, 37L, 12L, 57L, 51L, + 51L, 46L, 51L, 44L, 43L, 56L, 56L, 10L, 51L, 51L, 48L, 41L, 51L, + 80L, 80L, 80L, 80L, 80L, 77L, 80L, 87L, 87L, 87L, 87L, 87L, 87L, + 87L, 86L, 79L, 82L, 74L, 74L, 36L, 28L, 19L, 27L, 36L, 36L, 26L, + 23L, 23L, 23L, 21L, 26L, 19L, 35L, 29L, 36L, 23L, 20L, 20L, 38L, + 88L, 69L, 52L, 69L, 70L, 69L, 68L, 54L, 38L, 65L, 54L, 59L, 88L, + 89L, 79L, 79L, 79L, 79L, 76L, 79L, 72L, 5L, 4L, 1L, 2L, 5L, 7L, + 8L, 1L, 8L, 8L, 8L, 8L, 5L, 3L, 14L, 8L, 14L, 44L, 57L, 67L, + 57L, 42L, 57L, 40L, 40L, 43L, 40L, 49L, 49L, 46L, 54L, 45L, 12L, + 12L, 29L, 12L, 21L, 21L, 21L, 21L, 21L, 21L, 21L, 34L, 34L, 34L, + 34L, 34L, 34L, 17L, 34L, 51L, 47L, 51L, 41L, 44L, 71L, 62L, 63L, + 61L, 61L, 69L, 62L, 69L, 62L, 69L, 69L, 87L, 87L, 75L, 72L, 72L, + 76L, 74L, 72L, 72L, 75L, 79L, 90L, 72L, 78L, 78L, 35L, 30L, 26L, + 30L, 23L, 23L, 35L, 26L, 22L, 22L, 22L, 23L, 23L, 61L, 52L, 54L, + 64L, 60L, 61L, 71L, 61L, 69L, 52L, 61L, 60L, 52L, 60L, 71L, 70L, + 69L, 60L, 54L, 70L, 63L, 70L, 64L, 54L, 61L, 60L, 85L, 80L, 87L, + 80L, 80L, 80L, 77L, 80L, 81L, 76L, 87L, 77L, 14L, 13L, 5L, 8L, + 2L, 2L, 2L, 2L, 11L, 7L, 14L, 11L, 4L, 11L, 2L, 2L, 7L, 5L, 7L, + 11L, 8L, 7L, 7L, 4L, 82L, 80L, 80L, 85L, 87L, 77L, 86L, 16L, + 86L, 74L, 81L, 17L, 17L, 28L, 36L, 36L, 12L, 18L, 18L, 34L, 34L, + 17L, 34L, 29L, 16L, 16L, 18L, 21L, 28L, 36L, 63L, 69L, 69L, 64L, + 65L, 70L, 38L, 52L, 70L, 62L, 72L, 81L, 81L, 81L, 85L, 81L, 76L, + 86L, 79L, 80L, 86L, 86L, 81L, 35L, 22L, 12L, 19L, 19L, 19L, 12L, + 34L, 35L, 35L, 16L, 18L, 6L, 35L, 58L, 88L, 64L, 75L, 87L, 87L, + 87L, 76L, 74L, 90L, 77L, 76L, 81L, 81L, 77L, 84L, 86L, 90L, 16L, + 28L, 36L, 36L, 27L, 30L, 33L, 31L, 16L, 16L, 16L, 36L, 35L, 36L, + 34L, 19L, 62L, 62L, 68L, 71L, 61L, 61L, 61L, 61L, 60L, 59L, 65L, + 66L, 69L, 85L, 86L, 82L, 77L, 77L, 86L, 84L, 76L, 86L, 12L, 12L, + 12L, 12L, 12L, 12L, 12L, 12L, 30L, 21L, 21L, 34L, 34L, 34L, 34L, + 34L, 34L, 17L, 17L, 29L, 36L, 33L, 28L, 34L, 34L, 34L, 88L, 64L, + 88L, 65L, 64L, 62L, 58L, 76L, 87L, 84L, 83L, 80L, 13L, 13L, 4L, + 2L, 5L, 11L, 14L, 5L, 5L, 7L, 4L, 8L, 5L, 13L, 7L, 7L, 4L, 9L, + 85L, 78L, 78L, 81L, 75L, 83L, 90L, 84L, 86L, 21L, 36L, 34L, 18L, + 36L, 22L, 36L, 24L, 29L, 31L, 19L, 16L, 16L, 24L, 36L, 18L, 36L, + 64L, 54L, 52L, 64L, 52L, 64L, 38L, 64L, 38L, 54L, 65L, 60L, 60L, + 60L, 84L, 78L, 80L, 79L, 81L, 90L, 84L, 83L, 79L, 79L, 77L, 76L, + 72L, 74L, 86L, 72L, 74L, 73L, 34L, 34L, 34L, 34L, 34L, 17L, 17L, + 17L, 29L, 16L, 35L, 29L, 27L, 27L, 30L, 16L, 16L, 64L, 62L, 58L, + 88L, 72L, 77L, 72L, 72L, 74L, 4L, 7L, 9L, 15L, 4L, 11L, 7L, 7L, + 11L, 6L, 13L, 11L, 5L, 11L, 7L, 7L, 7L, 4L, 15L, 15L, 15L, 1L, + 4L, 15L, 5L, 5L, 13L, 6L, 14L, 3L, 4L, 4L, 2L, 7L, 4L, 4L, 4L, + 4L, 1L, 21L, 36L, 37L, 36L, 29L, 23L, 22L, 37L, 25L, 90L, 30L, + 25L, 19L, 37L, 34L, 17L, 22L, 12L, 52L, 63L, 62L, 64L, 62L, 58L, + 88L, 88L, 64L, 88L, 65L, 71L, 61L, 64L, 74L, 74L, 75L, 16L, 77L, + 83L, 84L, 87L, 85L, 77L, 86L, 74L, 73L, 76L, 86L, 36L, 25L, 25L, + 22L, 12L, 36L, 16L, 16L, 36L, 27L, 34L, 23L, 34L, 37L, 16L, 22L, + 23L, 27L, 19L, 22L, 58L, 65L, 65L, 87L, 84L, 76L, 85L, 77L, 80L, + 74L, 72L, 84L, 81L, 85L, 5L, 11L, 4L, 4L, 4L, 15L, 15L, 4L, 4L, + 15L, 4L, 8L, 9L, 4L, 1L, 1L, 4L, 4L, 1L, 15L, 15L, 4L, 11L, 2L, + 4L, 4L, 11L, 2L, 11L, 14L, 3L, 3L, 5L, 11L, 4L, 4L, 15L, 27L, + 30L, 19L, 22L, 22L, 22L, 39L, 22L, 30L, 34L, 35L, 34L, 21L, 18L, + 36L, 36L, 36L, 58L, 58L, 88L, 88L, 38L, 38L, 69L, 70L, 59L, 68L, + 69L, 64L, 64L, 68L, 69L, 66L, 66L, 66L, 69L, 66L, 78L, 86L, 78L, + 85L, 75L, 82L, 73L, 84L, 79L, 84L, 77L, 34L, 34L, 16L, 36L, 36L, + 28L, 24L, 36L, 34L, 34L, 17L, 17L, 31L, 32L, 19L, 30L, 24L, 19L, + 54L, 64L, 88L, 69L, 69L, 59L, 59L, 68L, 90L, 90L, 74L, 75L, 76L, + 85L, 1L, 4L, 1L, 4L, 3L, 13L, 9L, 1L, 5L, 7L, 15L, 4L, 1L, 13L, + 19L, 36L, 36L, 36L, 19L, 4L, 5L, 5L, 15L, 5L, 5L, 8L, 2L, 4L, + 3L, 1L, 3L, 11L, 11L, 4L, 13L, 1L, 36L, 36L, 28L, 27L, 27L, 27L, + 18L, 55L, 56L, 40L, 57L, 57L, 38L, 64L, 58L, 60L, 59L, 66L, 61L, + 38L, 65L, 52L, 70L, 66L, 69L, 69L, 69L, 69L, 69L, 69L, 77L, 90L, + 90L, 14L, 14L, 8L, 2L, 2L, 2L, 4L, 15L, 15L, 4L, 4L, 4L, 4L, + 34L, 18L, 34L, 28L, 22L, 19L, 30L, 30L, 22L, 39L, 22L, 22L, 30L, + 26L, 26L, 35L, 36L, 36L, 35L, 68L, 66L, 62L, 90L, 87L, 90L, 77L, + 87L, 80L, 90L, 86L, 79L, 80L, 84L, 81L, 79L, 36L, 22L, 22L, 22L, + 28L, 36L, 28L, 28L, 28L, 28L, 28L, 23L, 23L, 23L, 34L, 26L, 30L, + 28L, 19L, 19L, 2L, 14L, 1L, 14L, 4L, 5L, 9L, 1L, 1L, 1L, 1L, + 46L, 49L, 55L, 54L, 55L, 48L, 46L, 51L, 44L, 46L, 67L, 58L, 69L, + 69L, 69L, 69L, 69L, 69L, 69L, 69L, 69L, 69L, 52L, 60L, 69L, 38L, + 9L, 4L, 4L, 1L, 3L, 5L, 7L, 6L, 11L, 4L, 5L, 5L, 2L, 14L, 14L, + 32L, 3L, 2L, 14L, 82L, 21L, 35L, 36L, 31L, 29L, 24L, 23L, 16L, + 45L, 47L, 57L, 57L, 53L, 57L, 10L, 46L, 49L, 56L, 58L, 66L, 66L, + 66L, 69L, 66L, 66L, 77L, 78L, 83L, 87L, 80L, 80L, 77L, 81L, 81L, + 81L, 81L, 80L, 87L, 17L, 23L, 23L, 23L, 23L, 22L, 22L, 22L, 23L, + 23L, 23L, 19L, 23L, 19L, 19L, 19L, 36L, 26L, 36L, 30L, 35L, 35L, + 1L, 6L, 3L, 8L, 8L, 14L, 2L, 5L, 14L, 2L, 5L, 9L, 15L, 67L, 57L, + 40L, 57L, 57L, 48L, 43L, 44L, 41L, 47L, 41L, 49L, 41L, 41L, 40L, + 57L, 47L, 63L, 38L, 52L, 71L, 61L, 64L, 88L, 68L, 61L, 54L, 69L, + 59L, 68L, 88L, 69L, 69L, 58L, 59L, 71L, 71L, 2L, 2L, 1L, 14L, + 14L, 3L, 2L, 8L, 9L, 5L, 2L, 5L, 5L, 1L, 1L, 8L, 8L, 46L, 56L, + 57L, 57L, 67L, 43L, 57L, 46L, 49L, 67L, 47L, 47L, 43L, 40L, 45L, + 44L, 47L, 45L, 68L, 62L, 62L, 59L, 85L, 90L, 85L, 90L, 90L, 90L, + 16L, 90L, 85L, 16L, 90L, 82L, 85L, 86L, 77L, 87L, 85L, 85L, 79L, + 35L, 35L, 19L, 12L, 12L, 12L, 12L, 37L, 12L, 12L, 12L, 29L, 29L, + 16L, 36L, 30L, 21L, 21L, 34L, 8L, 7L, 14L, 11L, 5L, 1L, 7L, 1L, + 11L, 6L, 7L, 5L, 9L, 9L, 2L, 3L, 4L, 11L, 4L, 2L, 7L, 4L, 4L, + 49L, 40L, 43L, 43L, 49L, 49L, 46L, 46L, 49L, 45L, 45L, 54L, 61L, + 52L, 60L, 52L, 71L, 61L, 63L, 69L, 63L, 62L, 70L, 54L, 70L, 1L, + 3L, 8L, 8L, 8L, 8L, 14L, 14L, 14L, 5L, 5L, 2L, 14L, 14L, 9L, + 11L, 10L, 47L, 49L, 43L, 43L, 49L, 40L, 44L, 44L, 54L, 49L, 49L, + 41L, 51L, 43L, 59L, 68L, 90L, 84L, 77L, 83L, 83L, 83L, 80L, 87L, + 87L, 87L, 86L, 83L, 74L, 81L, 80L, 87L, 83L, 74L, 76L, 78L, 74L, + 81L, 73L, 86L, 87L, 86L, 86L, 74L, 82L, 80L, 72L, 21L, 21L, 21L, + 34L, 34L, 34L, 34L, 34L, 34L, 34L, 34L, 17L, 17L, 17L, 17L, 29L, + 18L, 34L, 34L, 34L, 34L, 17L, 4L, 9L, 15L, 15L, 15L, 7L, 7L, + 11L, 11L, 1L, 13L, 7L, 5L, 7L, 11L, 11L, 11L, 7L, 7L, 7L, 11L, + 40L, 50L, 44L, 47L, 44L, 46L, 46L, 48L, 48L, 43L, 44L, 56L, 50L, + 51L, 56L, 55L, 64L, 54L, 63L, 63L, 63L, 52L, 38L, 58L, 85L, 75L, + 75L, 75L, 76L, 83L, 84L, 2L, 5L, 14L, 7L, 7L, 7L, 1L, 8L, 11L, + 5L, 7L, 5L, 4L, 11L, 5L, 6L, 7L, 11L, 5L, 41L, 47L, 46L, 54L, + 42L, 55L, 42L, 43L, 50L, 50L, 48L, 48L, 53L, 54L, 54L, 68L, 69L, + 69L, 69L, 63L, 63L, 58L, 69L, 90L, 77L, 77L, 77L, 90L, 90L, 77L, + 74L, 84L, 90L, 77L, 77L, 74L, 78L, 81L, 81L, 86L, 85L, 29L, 29L, + 34L, 34L, 16L, 16L, 16L, 29L, 36L, 16L, 36L, 27L, 31L, 31L, 32L, + 19L, 27L, 36L, 36L, 15L, 15L, 1L, 4L, 5L, 15L, 15L, 4L, 15L, + 15L, 15L, 4L, 4L, 15L, 4L, 4L, 15L, 8L, 55L, 55L, 44L, 45L, 42L, + 42L, 42L, 45L, 56L, 56L, 56L, 56L, 56L, 42L, 56L, 51L, 67L, 86L, + 76L, 86L, 80L, 74L, 90L, 85L, 83L, 79L, 79L, 84L, 80L, 9L, 7L, + 13L, 4L, 7L, 4L, 4L, 9L, 9L, 9L, 15L, 11L, 7L, 11L, 1L, 13L, + 13L, 7L, 5L, 7L, 7L, 67L, 42L, 42L, 45L, 56L, 56L, 56L, 56L, + 56L, 56L, 56L, 67L, 56L, 56L, 51L, 56L, 55L, 57L, 57L, 51L, 69L, + 38L, 65L, 70L, 65L, 63L, 63L, 69L, 84L, 73L, 73L, 73L, 79L, 78L, + 78L, 85L, 85L, 78L, 74L, 80L, 82L, 78L, 86L, 81L, 77L, 85L, 16L, + 37L, 22L, 34L, 31L, 34L, 28L, 24L, 36L, 18L, 27L, 27L, 30L, 27L, + 27L, 27L, 36L, 22L, 22L, 34L, 22L, 34L, 9L, 14L, 1L, 4L, 4L, + 3L, 3L, 6L, 1L, 1L, 1L, 2L, 2L, 2L, 14L, 3L, 5L, 51L, 41L, 56L, + 40L, 45L, 45L, 44L, 67L, 67L, 56L, 57L, 57L, 57L, 67L, 51L, 49L, + 46L, 55L, 67L, 67L, 53L, 67L, 74L, 77L, 87L, 74L, 75L, 87L, 90L, + 90L, 90L, 90L, 75L, 85L, 85L, 4L, 11L, 11L, 4L, 7L, 4L, 7L, 4L, + 7L, 7L, 7L, 4L, 15L, 15L, 13L, 9L, 4L, 11L, 15L, 4L, 4L, 15L, + 15L, 42L, 57L, 54L, 54L, 45L, 50L, 56L, 57L, 67L, 57L, 40L, 67L, + 57L, 57L, 10L, 57L, 57L, 57L, 53L, 55L, 42L, 10L, 10L, 42L, 71L, + 38L, 65L, 65L, 70L, 69L, 69L, 61L, 52L, 65L, 54L, 52L, 54L, 38L, + 69L, 68L, 61L, 59L, 82L, 82L, 82L, 80L, 84L, 90L, 87L, 82L, 13L, + 14L, 11L, 2L, 9L, 4L, 2L, 4L, 4L, 4L, 2L, 29L, 28L, 30L, 23L, + 18L, 16L, 24L, 35L, 22L, 21L, 39L, 39L, 19L, 12L, 36L, 36L, 36L, + 21L, 5L, 14L, 4L, 18L, 23L, 36L, 36L, 36L, 36L, 16L, 17L, 36L, + 39L, 36L, 36L, 51L, 57L, 57L, 10L, 10L, 57L, 57L, 57L, 57L, 57L, + 51L, 51L, 49L, 57L, 10L, 41L, 45L, 67L, 10L, 48L, 10L, 49L, 56L, + 79L, 85L, 80L, 80L, 77L, 84L, 90L, 77L, 77L, 77L, 83L, 83L, 83L, + 90L, 90L, 87L, 84L, 90L, 90L, 90L, 4L, 15L, 4L, 1L, 14L, 4L, + 9L, 3L, 7L, 7L, 4L, 5L, 2L, 6L, 5L, 5L, 53L, 41L, 40L, 46L, 51L, + 45L, 51L, 53L, 42L, 46L, 10L, 67L, 49L, 49L, 47L, 55L, 49L, 40L, + 46L, 9L, 15L, 4L, 3L, 36L, 36L, 22L, 36L, 22L, 22L, 16L, 29L, + 31L, 16L, 16L, 30L, 40L, 46L, 49L, 56L, 55L, 48L, 46L, 65L, 69L, + 38L, 38L, 3L, 2L, 7L, 7L, 5L, 7L, 4L, 4L, 22L, 36L, 36L, 22L, + 23L, 23L, 25L, 26L, 22L, 49L, 57L, 51L, 51L, 46L, 48L, 67L, 42L, + 63L, 61L, 62L, 88L, 71L, 5L, 15L, 3L, 3L, 7L, 3L, 2L, 14L, 9L, + 4L, 4L, 3L, 23L, 23L, 23L, 34L, 23L, 19L, 17L, 23L, 36L, 27L, + 27L, 55L, 41L, 44L, 41L, 47L, 47L, 57L, 56L, 56L, 56L, 56L, 56L, + 56L, 51L, 51L, 54L, 70L, 60L, 59L, 69L, 52L, 88L, 78L, 75L, 3L, + 3L, 14L, 2L, 2L, 4L, 14L, 3L, 13L, 13L, 13L, 5L, 4L, 6L, 13L, + 1L, 20L, 30L, 32L, 23L, 23L, 36L, 28L, 12L, 23L, 39L, 17L, 19L, + 45L, 49L, 44L, 46L, 50L, 57L, 57L, 51L, 69L, 66L, 38L, 59L, 59L, + 66L, 64L, 1L, 4L, 8L, 1L, 13L, 13L, 8L, 8L, 8L, 13L, 13L, 8L, + 14L, 8L, 8L, 5L, 8L, 8L, 23L, 22L, 30L, 26L, 22L, 22L, 23L, 23L, + 23L, 34L, 25L, 29L, 16L, 24L, 24L, 54L, 51L, 45L, 42L, 50L, 56L, + 56L, 67L, 56L, 40L, 57L, 52L, 54L, 38L, 60L, 69L, 66L, 66L, 66L, + 60L, 38L, 54L, 70L, 9L, 7L, 1L, 4L, 11L, 15L, 7L, 4L, 7L, 11L, + 5L, 4L, 35L, 19L, 20L, 24L, 24L, 36L, 36L, 28L, 24L, 24L, 27L, + 51L, 49L, 55L, 46L, 51L, 57L, 57L, 57L, 57L, 57L, 10L, 51L, 57L, + 51L, 52L, 65L, 19L, 39L, 21L, 22L, 27L, 22L, 30L, 22L, 36L, 17L, + 36L, 19L, 49L, 49L, 67L, 42L, 48L, 45L, 57L, 53L, 51L, 41L, 47L, + 44L, 53L, 41L, 45L, 44L, 42L, 10L, 55L, 46L, 45L, 57L, 64L, 65L, + 54L, 62L, 62L, 66L, 66L, 16L, 36L, 36L, 12L, 34L, 22L, 18L, 30L, + 55L, 40L, 51L, 47L, 47L, 43L, 53L, 53L, 53L, 40L, 10L, 70L, 64L, + 58L, 66L, 66L, 68L, 70L, 60L, 59L, 68L, 22L, 22L, 34L, 16L, 30L, + 18L, 51L, 56L, 49L, 42L, 53L, 51L, 53L, 53L, 50L, 56L, 40L, 54L, + 54L, 69L, 61L, 7L, 36L, 23L, 35L, 12L, 21L, 16L, 36L, 26L, 30L, + 39L, 22L, 40L, 44L, 10L, 51L, 43L, 56L, 51L, 65L, 64L, 62L, 62L, + 88L, 69L, 63L, 58L, 69L, 60L, 64L, 62L, 11L, 5L, 5L, 11L, 9L, + 5L, 4L, 11L, 11L, 7L, 7L, 7L, 7L, 11L, 11L, 11L, 11L, 19L, 19L, + 12L, 12L, 12L, 12L, 37L, 12L, 22L, 22L, 19L, 27L, 24L, 24L, 19L, + 43L, 50L, 50L, 40L, 53L, 54L, 56L, 55L, 46L, 41L, 10L, 88L, 88L, + 88L, 59L, 69L, 69L, 69L, 62L, 8L, 8L, 8L, 11L, 8L, 7L, 1L, 11L, + 11L, 11L, 7L, 7L, 12L, 37L, 29L, 29L, 29L, 28L, 21L, 35L, 35L, + 36L, 50L, 51L, 40L, 44L, 44L, 54L, 58L, 61L, 52L, 88L, 59L, 38L, + 68L, 68L, 69L, 69L, 60L, 61L, 68L, 63L, 38L, 4L, 4L, 4L, 15L, + 15L, 15L, 35L, 23L, 21L, 21L, 29L, 36L, 25L, 30L, 27L, 18L, 41L, + 47L, 48L, 48L, 51L, 58L, 69L, 70L, 38L, 71L, 52L, 52L, 52L, 54L, + 65L, 59L, 65L, 54L, 38L, 38L, 88L, 70L, 2L, 11L, 3L, 11L, 5L, + 11L, 7L, 4L, 15L, 15L, 17L, 34L, 34L, 17L, 45L, 47L, 46L, 47L, + 51L, 45L, 51L, 50L, 52L, 69L, 66L, 70L, 69L, 54L, 59L, 88L, 68L, + 61L, 52L, 60L, 69L, 70L, 4L, 4L, 15L, 15L, 15L, 4L, 11L, 15L, + 8L, 13L, 5L, 36L, 35L, 33L, 34L, 40L, 47L, 56L, 48L, 69L, 71L, + 71L, 61L, 71L, 71L, 69L, 71L, 68L, 69L, 54L, 3L, 3L, 15L, 7L, + 3L, 1L, 1L, 4L, 2L, 1L, 4L, 34L, 34L, 29L, 34L, 34L, 17L, 16L, + 29L, 29L, 44L, 57L, 57L, 40L, 61L, 52L, 52L, 52L, 60L, 59L, 38L, + 61L, 64L, 66L, 64L, 52L, 88L, 63L, 52L, 30L, 34L, 34L, 34L, 23L, + 36L, 19L, 36L, 36L, 11L, 11L, 4L, 15L, 6L, 28L, 28L, 28L, 26L, + 34L, 34L, 34L, 17L, 34L, 30L, 27L, 18L, 25L, 29L, 36L, 9L, 7L, + 15L, 4L, 4L, 4L, 7L, 23L, 23L, 28L, 22L, 30L, 23L, 28L, 31L, + 7L, 4L, 4L, 15L, 15L, 13L, 5L, 4L, 23L, 23L, 23L, 12L, 35L, 23L, + 36L, 28L, 22L, 22L, 30L, 36L, 3L, 5L, 5L, 23L, 23L, 36L, 28L, + 17L, 19L, 5L, 4L, 15L, 23L, 22L, 22L, 19L, 26L, 15L, 15L, 7L, + 11L, 4L, 23L, 19L, 34L, 17L, 17L, 17L, 34L, 25L, 34L, 11L, 11L, + 11L, 8L, 4L, 4L, 4L, 1L, 22L, 25L, 16L, 24L, 3L, 8L, 5L, 4L, + 15L, 15L, 15L, 1L, 3L, 26L, 22L, 31L, 19L, 18L, 18L, 36L, 4L, + 5L, 14L, 11L, 19L, 18L, 17L, 35L, 36L, 36L, 27L, 9L, 11L, 11L, + 3L, 4L, 36L, 36L, 28L, 22L, 37L, 19L, 26L, 29L, 21L, 11L, 11L, + 7L, 4L, 4L, 22L, 22L, 12L, 12L, 37L, 33L, 33L, 7L, 4L, 3L, 3L, + 22L, 37L, 37L, 12L, 25L, 4L, 11L, 7L, 15L, 15L, 1L, 4L, 20L, + 28L, 19L, 36L, 35L, 12L, 22L, 15L, 15L, 4L, 1L, 1L, 36L, 25L, + 16L, 2L, 4L, 15L, 2L, 14L, 36L, 34L, 21L, 21L, 21L, 34L, 16L, + 28L, 34L, 27L, 27L, 14L, 11L, 3L, 5L, 1L, 36L, 36L, 36L, 78L, + 77L, 4L, 13L, 15L, 7L, 2L, 7L, 14L, 76L, 85L, 86L, 86L, 87L, + 82L, 77L, 76L, 86L, 86L, 80L, 80L, 83L, 82L, 78L, 72L, 72L, 78L, + 86L, 14L, 7L, 7L, 5L, 5L, 80L, 74L, 81L, 80L, 75L, 84L, 81L, + 74L, 4L, 13L, 3L, 4L, 11L, 9L, 13L, 87L, 87L, 76L, 81L, 77L, + 15L, 2L, 5L, 3L, 1L, 13L, 8L, 85L, 87L, 75L, 76L, 78L, 78L, 81L, + 86L, 84L, 90L, 82L, 72L, 77L, 85L, 76L, 82L, 87L, 81L, 77L, 84L, + 77L, 75L, 83L, 86L, 83L, 80L, 85L, 87L, 75L, 76L, 8L, 14L, 8L, + 90L, 85L, 84L, 83L, 76L, 81L, 81L, 83L, 8L, 8L, 77L, 90L, 77L, + 77L, 77L, 83L, 90L, 77L, 77L, 83L, 83L, 84L, 90L, 75L, 74L, 74L, + 76L, 11L, 2L, 80L, 81L, 85L, 90L, 77L, 80L, 77L, 83L, 77L, 73L, + 73L, 73L, 73L, 81L, 75L, 80L, 90L, 5L, 11L, 3L, 3L, 77L, 77L, + 84L, 82L, 77L, 82L, 74L, 89L, 74L, 89L, 89L, 79L, 79L, 89L, 89L, + 79L, 79L, 80L, 77L, 80L, 78L, 80L, 80L, 80L, 73L, 86L, 86L, 5L, + 7L, 14L, 7L, 15L, 7L, 14L, 8L, 80L, 81L, 80L, 87L, 87L, 87L, + 87L, 87L, 79L, 81L, 78L, 77L, 74L, 8L, 4L, 14L, 14L, 75L, 75L, + 74L, 74L, 74L, 74L, 74L, 72L, 11L, 3L, 6L, 14L, 7L, 11L, 87L, + 87L, 87L, 86L, 87L, 78L, 76L, 7L, 4L, 14L, 9L, 3L, 5L, 9L, 5L, + 2L, 2L, 72L, 79L, 85L, 73L, 74L, 72L, 86L, 86L, 78L, 5L, 4L, + 6L, 11L, 7L, 7L, 7L, 1L, 4L, 11L, 72L, 84L, 84L, 85L, 81L, 76L, + 81L, 85L, 78L, 78L, 77L, 81L, 80L, 84L, 86L, 90L, 74L, 74L, 72L, + 88L, 62L, 58L, 88L, 88L, 88L, 88L, 62L, 62L, 60L, 38L, 54L, 69L, + 69L, 59L, 59L, 59L, 68L, 87L, 86L, 77L, 84L, 80L, 83L, 81L, 72L, + 74L, 86L, 74L, 59L, 88L, 68L, 66L, 59L, 66L, 69L, 38L, 52L, 60L, + 68L, 59L, 59L, 66L, 60L, 59L, 64L, 74L, 74L, 84L, 85L, 77L, 90L, + 77L, 87L, 74L, 75L, 90L, 69L, 69L, 63L, 63L, 58L, 69L, 69L, 69L, + 69L, 52L, 38L, 71L, 69L, 69L, 74L, 84L, 81L, 85L, 77L, 85L, 76L, + 81L, 49L, 49L, 47L, 48L, 49L, 44L, 44L, 44L, 41L, 54L, 88L, 61L, + 70L, 52L, 54L, 54L, 88L, 64L, 60L, 60L, 69L, 71L, 54L, 68L, 69L, + 62L, 70L, 64L, 86L, 74L, 77L, 75L, 90L, 81L, 81L, 77L, 78L, 44L, + 49L, 49L, 43L, 51L, 50L, 50L, 47L, 47L, 41L, 44L, 44L, 40L, 44L, + 56L, 50L, 64L, 70L, 69L, 68L, 69L, 61L, 63L, 69L, 69L, 69L, 61L, + 64L, 47L, 47L, 47L, 54L, 50L, 50L, 50L, 50L, 51L, 53L, 44L, 45L, + 42L, 56L, 67L, 56L, 56L, 56L, 56L, 56L, 70L, 62L, 62L, 52L, 38L, + 69L, 60L, 54L, 63L, 63L, 53L, 53L, 67L, 67L, 53L, 42L, 53L, 57L, + 45L, 53L, 56L, 53L, 53L, 42L, 57L, 46L, 45L, 69L, 69L, 63L, 62L, + 70L, 88L, 71L, 78L, 76L, 76L, 82L, 78L, 16L, 90L, 84L, 76L, 90L, + 75L, 42L, 53L, 41L, 10L, 57L, 57L, 10L, 57L, 57L, 57L, 10L, 45L, + 50L, 53L, 10L, 57L, 51L, 45L, 53L, 47L, 41L, 90L, 90L, 90L, 77L, + 83L, 85L, 72L, 72L, 85L, 87L, 82L, 76L, 84L, 75L, 72L, 77L, 57L, + 42L, 40L, 45L, 45L, 53L, 57L, 41L, 48L, 10L, 10L, 41L, 46L, 41L, + 51L, 49L, 45L, 45L, 76L, 80L, 80L, 81L, 83L, 80L, 87L, 85L, 86L, + 90L, 90L, 16L, 16L, 75L, 41L, 43L, 43L, 46L, 51L, 43L, 48L, 41L, + 62L, 62L, 69L, 60L, 52L, 54L, 85L, 90L, 90L, 90L, 83L, 77L, 77L, + 83L, 83L, 83L, 83L, 77L, 90L, 90L, 87L, 77L, 90L, 90L, 80L, 80L, + 77L, 82L, 52L, 69L, 38L, 64L, 59L, 69L, 70L, 61L, 69L, 69L, 63L, + 73L, 73L, 73L, 74L, 81L, 90L, 89L, 89L, 89L, 79L, 89L, 89L, 89L, + 79L, 87L, 79L, 79L, 80L, 80L, 79L, 80L, 78L, 80L, 59L, 69L, 64L, + 69L, 69L, 71L, 71L, 61L, 60L, 61L, 61L, 52L, 64L, 60L, 60L, 71L, + 52L, 80L, 80L, 87L, 87L, 87L, 87L, 74L, 74L, 78L, 90L, 87L, 87L, + 74L, 87L, 87L, 87L, 75L, 74L, 80L, 86L, 38L, 69L, 69L, 54L, 38L, + 52L, 38L, 38L, 52L, 38L, 38L, 65L, 70L, 64L, 72L, 87L, 74L, 72L, + 84L, 84L, 81L, 76L, 81L, 76L, 86L, 86L, 74L, 76L, 80L, 80L, 72L, + 74L, 86L, 72L, 70L, 63L, 64L, 58L, 62L, 54L, 88L, 88L, 88L, 88L, + 64L, 88L, 71L, 64L, 62L, 64L, 86L, 86L, 86L, 86L, 86L, 80L, 86L, + 85L, 81L, 85L, 80L, 90L, 83L, 80L, 81L, 81L, 74L, 78L, 71L, 38L, + 70L, 66L, 59L, 66L, 88L, 64L, 70L, 54L, 88L, 65L, 61L, 61L, 38L, + 60L, 87L, 75L, 16L, 83L, 87L, 87L, 87L, 87L, 72L, 74L, 72L, 62L, + 62L, 54L, 66L, 71L, 61L, 60L, 69L, 69L, 62L, 63L, 64L, 84L, 74L, + 87L, 72L, 74L, 84L, 86L, 86L, 80L, 80L, 66L, 63L, 64L, 69L, 70L, + 69L, 64L, 66L, 70L, 69L, 58L, 54L, 69L, 66L, 63L, 69L, 72L, 80L, + 80L, 80L, 84L, 77L, 78L, 17L, 22L, 22L, 18L, 27L, 27L, 27L, 42L, + 55L, 49L, 55L, 69L, 71L, 71L, 90L, 72L, 87L, 87L, 41L, 47L, 67L, + 50L, 51L, 48L, 57L, 57L, 57L, 45L, 46L, 47L, 60L, 70L, 60L, 61L, + 69L, 54L, 65L, 86L, 80L, 80L, 76L, 78L, 83L, 90L, 53L, 49L, 56L, + 57L, 49L, 46L, 45L, 45L, 47L, 47L, 45L, 45L, 41L, 40L, 52L, 64L, + 52L, 64L, 38L, 83L, 83L, 85L, 77L, 83L, 44L, 40L, 10L, 49L, 49L, + 47L, 49L, 49L, 49L, 40L, 44L, 56L, 54L, 44L, 70L, 70L, 54L, 52L, + 64L, 64L, 62L, 64L, 52L, 76L, 76L, 86L, 84L, 90L, 82L, 73L, 46L, + 41L, 40L, 50L, 50L, 50L, 41L, 53L, 44L, 54L, 45L, 55L, 44L, 44L, + 51L, 67L, 45L, 64L, 88L, 88L, 88L, 64L, 65L, 64L, 64L, 62L, 62L, + 76L, 77L, 77L, 80L, 82L, 82L, 79L, 82L, 77L, 45L, 45L, 50L, 51L, + 47L, 48L, 48L, 45L, 56L, 47L, 56L, 56L, 56L, 56L, 56L, 42L, 56L, + 58L, 58L, 58L, 58L, 64L, 62L, 68L, 71L, 62L, 69L, 80L, 80L, 56L, + 56L, 42L, 44L, 50L, 67L, 67L, 67L, 57L, 67L, 56L, 56L, 57L, 57L, + 57L, 10L, 10L, 10L, 57L, 57L, 10L, 46L, 45L, 65L, 84L, 76L, 80L, + 80L, 80L, 79L, 75L, 90L, 85L, 90L, 82L, 74L, 74L, 74L, 89L, 79L, + 53L, 42L, 57L, 10L, 10L, 10L, 49L, 40L, 42L, 47L, 46L, 50L, 53L, + 49L, 88L, 65L, 60L, 54L, 59L, 59L, 59L, 59L, 68L, 69L, 69L, 74L, + 87L, 80L, 90L, 16L, 85L, 89L, 79L, 89L, 82L, 82L, 45L, 53L, 56L, + 43L, 68L, 69L, 69L, 69L, 60L, 66L, 69L, 69L, 82L, 77L, 90L, 87L, + 75L, 74L, 79L, 79L, 74L, 80L, 45L, 55L, 10L, 70L, 65L, 52L, 59L, + 69L, 69L, 75L, 77L, 90L, 82L, 16L, 77L, 75L, 80L, 80L, 74L, 87L, + 87L, 87L, 49L, 53L, 53L, 57L, 59L, 66L, 66L, 66L, 69L, 69L, 69L, + 69L, 62L, 64L, 65L, 69L, 77L, 80L, 77L, 90L, 90L, 80L, 85L, 75L, + 87L, 87L, 51L, 51L, 41L, 69L, 66L, 69L, 66L, 60L, 54L, 38L, 88L, + 61L, 81L, 77L, 77L, 77L, 77L, 80L, 80L, 74L, 51L, 49L, 47L, 40L, + 51L, 70L, 70L, 59L, 52L, 27L, 35L, 36L, 36L, 36L, 25L, 36L, 36L, + 30L, 33L, 16L, 25L, 28L, 36L, 36L, 21L, 35L, 36L, 4L, 5L, 22L, + 35L, 35L, 36L, 34L, 34L, 34L, 3L, 4L, 23L, 19L, 28L, 22L, 22L, + 22L, 24L, 3L, 13L, 7L, 23L, 23L, 23L, 23L, 35L, 19L, 12L, 31L, + 28L, 28L, 34L, 34L, 7L, 2L, 23L, 12L, 12L, 37L, 34L, 34L, 21L, + 36L, 29L, 29L, 27L, 21L, 21L, 34L, 2L, 4L, 2L, 34L, 34L, 36L, + 16L, 36L, 19L, 8L, 8L, 34L, 34L, 34L, 30L, 19L, 22L, 7L, 14L, + 34L, 17L, 35L, 37L, 37L, 1L, 4L, 13L, 21L, 23L, 16L, 35L, 17L, + 36L, 22L, 19L, 17L, 34L, 23L, 30L, 23L, 23L, 23L, 23L, 28L, 36L, + 21L, 25L, 35L, 26L, 22L, 28L, 34L, 34L, 22L, 36L, 24L, 24L, 36L, + 23L, 22L, 17L, 17L, 27L, 24L, 24L, 28L, 28L, 17L, 22L, 22L, 22L, + 19L, 19L, 19L, 17L, 34L, 25L, 29L, 25L, 16L, 30L, 28L, 28L, 22L, + 36L, 36L, 28L, 19L, 19L, 19L, 34L, 36L, 36L, 28L, 19L, 25L, 3L, + 49L, 50L, 50L, 51L, 51L, 40L, 47L, 54L, 70L, 88L, 88L, 88L, 64L, + 88L, 64L, 88L, 88L, 66L, 69L, 69L, 63L, 63L, 63L, 58L, 63L, 80L, + 84L, 84L, 86L, 81L, 85L, 79L, 82L, 74L, 74L, 82L, 87L, 74L, 78L, + 76L, 85L, 77L, 78L, 14L, 14L, 4L, 11L, 8L, 8L, 9L, 1L, 8L, 8L, + 14L, 7L, 11L, 5L, 11L, 8L, 11L, 2L, 3L, 4L, 4L, 7L, 4L, 4L, 15L, + 4L, 9L, 4L, 67L, 42L, 56L, 56L, 56L, 56L, 51L, 56L, 51L, 41L, + 44L, 49L, 56L, 41L, 53L, 46L, 56L, 56L, 50L, 67L, 64L, 54L, 65L, + 65L, 62L, 64L, 58L, 58L, 88L, 69L, 69L, 88L, 69L, 38L, 69L, 69L, + 38L, 85L, 77L, 84L, 77L, 74L, 89L, 79L, 79L, 89L, 89L, 79L, 89L, + 82L, 89L, 87L, 85L, 83L, 82L, 82L, 75L, 78L, 74L, 76L, 74L, 4L, + 3L, 6L, 11L, 5L, 5L, 14L, 8L, 14L, 8L, 13L, 8L, 8L, 13L, 5L, + 2L, 7L, 13L, 2L, 9L, 9L, 11L, 5L, 11L, 5L, 5L, 5L, 11L, 4L, 15L, + 15L, 7L, 7L, 11L, 4L, 8L, 11L, 11L, 7L, 4L, 7L, 15L, 56L, 67L, + 56L, 67L, 67L, 54L, 46L, 67L, 51L, 56L, 40L, 67L, 68L, 62L, 70L, + 65L, 59L, 54L, 54L, 54L, 38L, 38L, 68L, 69L, 88L, 69L, 52L, 70L, + 69L, 59L, 90L, 80L, 75L, 90L, 89L, 89L, 79L, 79L, 75L, 79L, 87L, + 80L, 80L, 74L, 72L, 77L, 76L, 84L, 86L, 77L, 85L, 86L, 78L, 84L, + 84L, 90L, 84L, 84L, 90L, 2L, 2L, 4L, 6L, 13L, 13L, 1L, 3L, 8L, + 8L, 11L, 11L, 13L, 1L, 7L, 14L, 5L, 15L, 5L, 16L, 36L, 19L, 30L, + 27L, 36L, 36L, 21L, 19L, 39L, 39L, 22L, 22L, 67L, 57L, 57L, 57L, + 10L, 57L, 57L, 57L, 77L, 87L, 87L, 84L, 3L, 1L, 13L, 15L, 5L, + 8L, 11L, 8L, 4L, 2L, 4L, 7L, 15L, 15L, 13L, 7L, 15L, 8L, 4L, + 5L, 4L, 15L, 15L, 4L, 4L, 4L, 15L, 15L, 15L, 15L, 15L, 39L, 22L, + 27L, 23L, 19L, 27L, 27L, 18L, 36L, 24L, 22L, 35L, 23L, 37L, 29L, + 57L, 57L, 67L, 51L, 51L, 53L, 53L, 85L, 87L, 85L, 84L, 72L, 87L, + 87L, 75L, 79L, 34L, 24L, 27L, 35L, 35L, 45L, 40L, 41L, 40L, 49L, + 40L, 41L, 51L, 47L, 48L, 44L, 48L, 45L, 57L, 10L, 44L, 53L, 53L, + 7L, 56L, 75L, 81L, 75L, 77L, 83L, 72L, 79L, 55L, 56L, 46L, 45L, + 43L, 51L, 47L, 57L, 67L, 46L, 51L, 10L, 48L, 41L, 46L, 10L, 83L, + 85L, 74L, 87L, 87L, 75L, 74L, 86L, 51L, 44L, 45L, 44L, 49L, 45L, + 53L, 49L, 46L, 57L, 47L, 90L, 87L, 85L, 80L, 75L, 84L, 44L, 46L, + 51L, 46L, 67L, 51L, 44L, 51L, 16L, 16L, 81L, 85L, 72L, 72L, 80L, + 90L, 74L, 74L, 43L, 46L, 43L, 40L, 55L, 48L, 57L, 51L, 63L, 62L, + 64L, 70L, 64L, 61L, 73L, 16L, 84L, 84L, 77L, 77L, 74L, 72L, 84L, + 81L, 85L, 76L, 81L, 44L, 44L, 45L, 51L, 57L, 51L, 51L, 51L, 57L, + 71L, 61L, 54L, 60L, 83L, 84L, 76L, 86L, 86L, 86L, 81L, 43L, 50L, + 50L, 50L, 41L, 57L, 61L, 71L, 63L, 54L, 69L, 61L, 83L, 83L, 90L, + 83L, 90L, 77L, 74L, 86L, 86L, 86L, 51L, 44L, 45L, 41L, 44L, 45L, + 65L, 60L, 88L, 62L, 70L, 70L, 63L, 69L, 69L, 69L, 69L, 63L, 77L, + 74L, 80L, 87L, 87L, 87L, 77L, 77L, 81L, 86L, 82L, 86L, 41L, 40L, + 53L, 46L, 41L, 69L, 63L, 61L, 64L, 69L, 88L, 70L, 52L, 59L, 88L, + 59L, 59L, 62L, 62L, 64L, 88L, 58L, 69L, 69L, 83L, 78L, 76L, 85L, + 77L, 77L, 90L, 75L, 80L, 75L, 90L, 74L, 74L, 72L, 13L, 14L, 5L, + 5L, 2L, 7L, 5L, 7L, 51L, 44L, 51L, 71L, 54L, 52L, 52L, 64L, 60L, + 61L, 61L, 60L, 68L, 68L, 71L, 68L, 59L, 66L, 71L, 71L, 66L, 69L, + 63L, 71L, 64L, 71L, 69L, 80L, 90L, 80L, 82L, 78L, 84L, 76L, 85L, + 86L, 2L, 8L, 2L, 51L, 43L, 71L, 62L, 65L, 64L, 38L, 38L, 65L, + 58L, 38L, 65L, 69L, 63L, 70L, 54L, 59L, 59L, 66L, 66L, 60L, 69L, + 85L, 83L, 75L, 80L, 73L, 79L, 79L, 82L, 77L, 76L, 74L, 78L, 78L, + 90L, 74L, 74L, 87L, 86L, 8L, 5L, 7L, 4L, 4L, 70L, 72L, 82L, 89L, + 80L, 87L, 85L, 87L, 87L, 87L, 83L, 76L, 63L, 69L, 38L, 38L, 81L, + 73L, 90L, 79L, 87L, 75L, 80L, 80L, 80L, 75L, 78L, 80L, 86L, 76L, + 87L, 80L, 90L, 74L, 64L, 65L, 62L, 69L, 16L, 16L, 77L, 77L, 90L, + 90L, 80L, 80L, 80L, 72L, 72L, 78L, 79L, 85L, 74L, 74L, 75L, 65L, + 62L, 58L, 70L, 90L, 72L, 87L, 86L, 85L, 74L, 75L, 75L, 84L, 75L, + 75L, 90L, 87L, 77L, 78L, 85L, 69L, 66L, 66L, 86L, 82L, 74L, 84L, + 90L, 77L, 77L, 59L, 59L, 66L, 59L, 75L, 75L, 84L, 84L, 83L, 83L, + 90L, 66L, 66L, 66L, 66L, 52L, 61L, 82L, 78L, 84L, 85L, 86L, 90L, + 90L, 87L, 90L, 69L, 69L, 58L, 69L, 58L, 63L, 69L, 81L, 86L, 87L, + 76L, 90L, 77L, 69L, 72L, 81L, 69L, 69L, 69L, 54L, 66L, 64L, 64L, + 84L, 87L, 80L, 80L, 80L, 87L, 54L, 71L, 61L, 54L, 80L, 77L, 90L, + 64L, 52L, 64L, 54L, 52L, 77L, 84L, 90L, 85L, 90L, 90L, 77L, 73L, + 87L, 87L, 87L, 87L, 74L, 78L, 84L, 85L, 76L, 69L, 69L, 63L, 88L, + 58L, 70L, 90L, 90L, 80L, 80L, 84L, 84L, 87L, 87L, 87L, 74L, 89L, + 76L, 86L, 87L, 86L, 81L, 90L, 54L, 52L, 71L, 60L, 60L, 16L, 16L, + 81L, 73L, 79L, 79L, 89L, 86L, 86L, 80L, 76L, 76L, 85L, 87L, 75L, + 77L, 55L, 45L, 46L, 46L, 56L, 42L, 46L, 49L, 55L, 70L, 71L, 69L, + 38L, 69L, 4L, 15L, 3L, 13L, 2L, 15L, 2L, 2L, 2L, 2L, 8L, 2L, + 15L, 51L, 44L, 44L, 46L, 46L, 40L, 44L, 43L, 43L, 49L, 50L, 50L, + 55L, 46L, 57L, 60L, 62L, 63L, 69L, 63L, 85L, 85L, 81L, 80L, 80L, + 80L, 84L, 80L, 87L, 85L, 81L, 86L, 85L, 81L, 85L, 86L, 85L, 6L, + 1L, 2L, 4L, 1L, 6L, 3L, 8L, 28L, 27L, 22L, 23L, 23L, 22L, 22L, + 30L, 34L, 22L, 19L, 28L, 36L, 44L, 55L, 45L, 50L, 48L, 57L, 41L, + 49L, 44L, 43L, 40L, 51L, 68L, 61L, 66L, 64L, 61L, 61L, 52L, 4L, + 15L, 4L, 13L, 1L, 14L, 14L, 5L, 26L, 19L, 19L, 31L, 18L, 28L, + 19L, 54L, 44L, 42L, 42L, 42L, 42L, 56L, 56L, 56L, 56L, 56L, 41L, + 41L, 56L, 56L, 40L, 56L, 50L, 57L, 67L, 67L, 77L, 87L, 87L, 83L, + 85L, 74L, 77L, 78L, 74L, 84L, 84L, 84L, 90L, 90L, 86L, 85L, 80L, + 79L, 86L, 87L, 80L, 82L, 75L, 86L, 78L, 2L, 15L, 14L, 8L, 8L, + 8L, 14L, 14L, 8L, 28L, 23L, 26L, 16L, 16L, 33L, 30L, 25L, 28L, + 41L, 40L, 44L, 51L, 51L, 51L, 51L, 48L, 49L, 61L, 61L, 60L, 61L, + 61L, 66L, 59L, 66L, 66L, 69L, 36L, 19L, 22L, 36L, 36L, 23L, 19L, + 28L, 19L, 36L, 22L, 22L, 36L, 36L, 28L, 28L, 28L, 27L, 57L, 57L, + 10L, 53L, 53L, 57L, 57L, 10L, 46L, 45L, 57L, 10L, 10L, 10L, 49L, + 51L, 45L, 67L, 53L, 53L, 41L, 43L, 44L, 85L, 86L, 86L, 86L, 85L, + 77L, 77L, 76L, 86L, 82L, 77L, 2L, 5L, 7L, 1L, 7L, 7L, 7L, 9L, + 14L, 17L, 23L, 35L, 22L, 22L, 22L, 22L, 23L, 22L, 34L, 17L, 35L, + 35L, 21L, 21L, 47L, 53L, 44L, 44L, 44L, 61L, 52L, 52L, 52L, 86L, + 81L, 87L, 72L, 83L, 82L, 84L, 84L, 90L, 76L, 89L, 86L, 81L, 72L, + 75L, 76L, 36L, 23L, 23L, 23L, 28L, 23L, 36L, 12L, 20L, 17L, 23L, + 23L, 22L, 22L, 22L, 22L, 23L, 23L, 23L, 23L, 74L, 86L, 14L, 15L, + 11L, 11L, 11L, 11L, 11L, 6L, 23L, 19L, 19L, 19L, 19L, 19L, 35L, + 28L, 21L, 22L, 22L, 22L, 34L, 44L, 46L, 55L, 56L, 40L, 41L, 60L, + 63L, 69L, 69L, 78L, 80L, 87L, 74L, 80L, 74L, 81L, 90L, 74L, 86L, + 77L, 74L, 76L, 23L, 22L, 22L, 19L, 12L, 22L, 22L, 36L, 30L, 20L, + 33L, 17L, 35L, 35L, 35L, 19L, 86L, 86L, 16L, 82L, 25L, 80L, 74L, + 5L, 5L, 5L, 6L, 11L, 5L, 6L, 5L, 23L, 30L, 17L, 35L, 35L, 35L, + 12L, 19L, 34L, 37L, 36L, 21L, 45L, 42L, 42L, 56L, 53L, 56L, 56L, + 56L, 56L, 38L, 52L, 81L, 77L, 74L, 74L, 84L, 82L, 75L, 86L, 85L, + 72L, 72L, 37L, 12L, 12L, 12L, 12L, 12L, 12L, 12L, 29L, 21L, 34L, + 21L, 21L, 21L, 34L, 34L, 34L, 34L, 34L, 34L, 17L, 17L, 34L, 53L, + 53L, 53L, 40L, 45L, 46L, 53L, 42L, 10L, 48L, 48L, 53L, 10L, 53L, + 45L, 54L, 77L, 77L, 85L, 77L, 72L, 90L, 16L, 75L, 86L, 72L, 81L, + 75L, 90L, 90L, 79L, 90L, 81L, 87L, 72L, 78L, 77L, 80L, 9L, 7L, + 5L, 5L, 9L, 7L, 4L, 4L, 12L, 12L, 37L, 12L, 37L, 12L, 12L, 12L, + 12L, 12L, 30L, 36L, 34L, 21L, 35L, 27L, 18L, 56L, 56L, 56L, 67L, + 53L, 64L, 38L, 64L, 65L, 65L, 86L, 80L, 84L, 76L, 72L, 73L, 76L, + 74L, 16L, 82L, 74L, 17L, 30L, 36L, 36L, 36L, 18L, 34L, 34L, 29L, + 29L, 34L, 34L, 17L, 34L, 17L, 17L, 29L, 54L, 45L, 45L, 49L, 49L, + 41L, 51L, 41L, 41L, 45L, 40L, 40L, 51L, 41L, 53L, 16L, 86L, 73L, + 90L, 72L, 16L, 16L, 82L, 84L, 90L, 77L, 78L, 80L, 81L, 15L, 15L, + 15L, 7L, 11L, 11L, 11L, 21L, 21L, 21L, 34L, 34L, 36L, 19L, 23L, + 34L, 36L, 25L, 53L, 56L, 56L, 56L, 54L, 64L, 64L, 64L, 63L, 63L, + 62L, 54L, 84L, 81L, 79L, 1L, 5L, 3L, 6L, 8L, 2L, 2L, 3L, 4L, + 4L, 7L, 1L, 15L, 34L, 34L, 34L, 34L, 34L, 27L, 29L, 28L, 36L, + 31L, 25L, 36L, 36L, 34L, 42L, 53L, 51L, 48L, 71L, 88L, 62L, 69L, + 38L, 70L, 88L, 62L, 68L, 60L, 77L, 77L, 83L, 77L, 74L, 90L, 74L, + 87L, 74L, 74L, 82L, 11L, 13L, 4L, 7L, 11L, 11L, 11L, 7L, 7L, + 4L, 34L, 34L, 34L, 34L, 17L, 17L, 47L, 45L, 67L, 67L, 57L, 67L, + 53L, 49L, 64L, 64L, 88L, 64L, 88L, 9L, 3L, 7L, 4L, 11L, 2L, 4L, + 3L, 8L, 3L, 3L, 6L, 3L, 11L, 11L, 4L, 27L, 27L, 27L, 30L, 33L, + 33L, 16L, 16L, 34L, 12L, 26L, 16L, 22L, 22L, 22L, 65L, 38L, 63L, + 68L, 71L, 71L, 65L, 61L, 71L, 61L, 61L, 61L, 60L, 60L, 84L, 83L, + 86L, 86L, 84L, 74L, 86L, 77L, 72L, 76L, 81L, 7L, 7L, 4L, 15L, + 15L, 15L, 15L, 17L, 36L, 31L, 36L, 34L, 34L, 34L, 34L, 34L, 34L, + 43L, 46L, 42L, 57L, 51L, 67L, 67L, 53L, 88L, 88L, 88L, 88L, 64L, + 1L, 2L, 5L, 2L, 14L, 2L, 3L, 14L, 14L, 14L, 34L, 36L, 22L, 36L, + 37L, 21L, 27L, 31L, 26L, 22L, 24L, 24L, 24L, 28L, 28L, 27L, 30L, + 30L, 27L, 30L, 30L, 19L, 22L, 34L, 61L, 60L, 52L, 69L, 65L, 65L, + 52L, 52L, 38L, 38L, 38L, 64L, 65L, 63L, 64L, 88L, 77L, 83L, 85L, + 80L, 77L, 81L, 90L, 74L, 74L, 86L, 77L, 5L, 7L, 1L, 5L, 7L, 15L, + 34L, 17L, 17L, 17L, 34L, 34L, 29L, 16L, 43L, 45L, 49L, 41L, 56L, + 10L, 57L, 57L, 57L, 65L, 64L, 62L, 64L, 58L, 2L, 1L, 13L, 1L, + 5L, 5L, 8L, 8L, 8L, 14L, 13L, 8L, 5L, 2L, 2L, 2L, 11L, 13L, 2L, + 33L, 27L, 27L, 30L, 28L, 28L, 30L, 30L, 22L, 17L, 22L, 37L, 17L, + 36L, 36L, 35L, 22L, 19L, 30L, 39L, 22L, 39L, 54L, 54L, 64L, 59L, + 64L, 88L, 52L, 62L, 62L, 62L, 62L, 63L, 88L, 88L, 88L, 88L, 90L, + 77L, 83L, 73L, 82L, 82L, 82L, 84L, 90L, 87L, 77L, 77L, 78L, 7L, + 7L, 4L, 4L, 4L, 4L, 35L, 18L, 27L, 30L, 36L, 36L, 53L, 57L, 57L, + 51L, 10L, 10L, 41L, 41L, 41L, 54L, 45L, 58L, 58L, 62L, 58L, 1L, + 9L, 7L, 4L, 7L, 7L, 13L, 9L, 5L, 3L, 5L, 7L, 1L, 27L, 12L, 19L, + 19L, 19L, 28L, 17L, 27L, 27L, 16L, 27L, 56L, 88L, 88L, 58L, 58L, + 52L, 52L, 59L, 59L, 68L, 68L, 68L, 69L, 61L, 64L, 59L, 79L, 82L, + 83L, 89L, 89L, 89L, 74L, 89L, 89L, 89L, 89L, 86L, 81L, 81L, 85L, + 83L, 84L, 81L, 4L, 15L, 5L, 4L, 7L, 4L, 3L, 17L, 37L, 18L, 49L, + 10L, 57L, 57L, 10L, 47L, 53L, 46L, 51L, 41L, 58L, 1L, 7L, 7L, + 7L, 2L, 4L, 14L, 11L, 5L, 6L, 5L, 4L, 5L, 5L, 7L, 5L, 55L, 55L, + 49L, 40L, 45L, 43L, 45L, 69L, 59L, 54L, 66L, 69L, 66L, 66L, 69L, + 66L, 66L, 66L, 66L, 69L, 61L, 80L, 80L, 80L, 80L, 80L, 80L, 80L, + 81L, 87L, 77L, 81L, 90L, 86L, 15L, 3L, 6L, 7L, 2L, 2L, 3L, 3L, + 3L, 4L, 4L, 3L, 2L, 2L, 2L, 35L, 35L, 20L, 22L, 37L, 47L, 42L, + 67L, 57L, 40L, 47L, 55L, 67L, 67L, 67L, 45L, 51L, 59L, 63L, 38L, + 38L, 61L, 54L, 68L, 52L, 52L, 54L, 5L, 7L, 9L, 4L, 7L, 11L, 11L, + 13L, 11L, 4L, 1L, 5L, 7L, 7L, 7L, 11L, 11L, 11L, 51L, 40L, 46L, + 57L, 57L, 10L, 53L, 40L, 43L, 41L, 64L, 66L, 69L, 69L, 69L, 69L, + 69L, 69L, 69L, 69L, 69L, 70L, 54L, 70L, 69L, 87L, 87L, 87L, 87L, + 87L, 87L, 74L, 79L, 85L, 75L, 3L, 9L, 4L, 7L, 14L, 2L, 3L, 4L, + 13L, 25L, 21L, 31L, 28L, 22L, 26L, 22L, 34L, 36L, 22L, 47L, 40L, + 41L, 45L, 57L, 10L, 41L, 40L, 45L, 46L, 53L, 49L, 88L, 70L, 52L, + 70L, 52L, 54L, 59L, 4L, 7L, 7L, 4L, 15L, 15L, 15L, 15L, 15L, + 15L, 1L, 14L, 4L, 15L, 14L, 41L, 43L, 40L, 44L, 44L, 57L, 46L, + 54L, 40L, 44L, 47L, 40L, 54L, 40L, 38L, 88L, 69L, 38L, 88L, 61L, + 88L, 59L, 52L, 70L, 61L, 61L, 70L, 61L, 63L, 65L, 70L, 87L, 87L, + 75L, 74L, 6L, 4L, 1L, 36L, 36L, 19L, 19L, 19L, 37L, 34L, 30L, + 25L, 17L, 45L, 53L, 51L, 57L, 49L, 67L, 57L, 45L, 57L, 53L, 46L, + 63L, 69L, 69L, 69L, 59L, 68L, 59L, 38L, 63L, 60L, 7L, 15L, 15L, + 7L, 15L, 15L, 15L, 4L, 15L, 15L, 8L, 5L, 14L, 13L, 3L, 4L, 4L, + 3L, 1L, 40L, 44L, 44L, 54L, 41L, 49L, 50L, 50L, 50L, 41L, 41L, + 41L, 47L, 44L, 41L, 49L, 63L, 69L, 65L, 70L, 70L, 62L, 62L, 65L, + 54L, 61L, 78L, 72L, 78L, 72L, 87L, 72L, 74L, 78L, 84L, 84L, 84L, + 4L, 4L, 4L, 5L, 4L, 3L, 7L, 3L, 2L, 4L, 5L, 7L, 13L, 13L, 36L, + 36L, 36L, 28L, 22L, 25L, 22L, 24L, 29L, 29L, 30L, 18L, 28L, 49L, + 49L + ) + expect_equal(mtches, expected) }) -test_that("match area works", { - +test_that('match area works', { mtches_a <- geo_match(va_blocks, va18sub, method = 'area') - - expected <- c(64L, 69L, 66L, 66L, 69L, 70L, 70L, 69L, 63L, 68L, 38L, 54L, - 62L, 54L, 71L, 38L, 52L, 52L, 82L, 79L, 73L, 84L, 87L, 76L, 77L, - 74L, 80L, 79L, 89L, 2L, 5L, 4L, 3L, 7L, 5L, 5L, 2L, 4L, 4L, 4L, - 14L, 2L, 36L, 24L, 30L, 27L, 22L, 36L, 36L, 19L, 34L, 49L, 44L, - 56L, 49L, 40L, 28L, 28L, 23L, 34L, 30L, 36L, 12L, 33L, 22L, 23L, - 23L, 23L, 23L, 35L, 22L, 22L, 22L, 22L, 22L, 67L, 51L, 51L, 49L, - 43L, 10L, 53L, 53L, 45L, 55L, 55L, 53L, 43L, 51L, 57L, 90L, 90L, - 90L, 80L, 77L, 82L, 73L, 82L, 73L, 82L, 77L, 76L, 77L, 78L, 79L, - 79L, 79L, 82L, 79L, 87L, 79L, 80L, 1L, 2L, 6L, 1L, 4L, 4L, 2L, - 5L, 5L, 5L, 18L, 25L, 18L, 51L, 10L, 40L, 53L, 40L, 41L, 41L, - 67L, 41L, 43L, 10L, 52L, 68L, 88L, 70L, 65L, 52L, 64L, 64L, 63L, - 38L, 69L, 70L, 70L, 58L, 69L, 64L, 54L, 69L, 58L, 89L, 79L, 87L, - 87L, 87L, 87L, 87L, 2L, 3L, 7L, 13L, 3L, 3L, 6L, 11L, 11L, 4L, - 4L, 2L, 1L, 6L, 1L, 3L, 1L, 1L, 43L, 49L, 48L, 46L, 46L, 43L, - 54L, 43L, 10L, 41L, 48L, 22L, 23L, 19L, 28L, 23L, 27L, 30L, 35L, - 35L, 35L, 35L, 35L, 19L, 19L, 19L, 19L, 12L, 37L, 12L, 57L, 51L, - 51L, 46L, 51L, 44L, 43L, 56L, 56L, 10L, 51L, 51L, 48L, 41L, 51L, - 80L, 80L, 80L, 80L, 80L, 77L, 80L, 87L, 87L, 87L, 87L, 87L, 87L, - 87L, 86L, 79L, 82L, 74L, 74L, 36L, 28L, 19L, 27L, 36L, 36L, 26L, - 23L, 23L, 23L, 21L, 26L, 19L, 35L, 29L, 36L, 23L, 20L, 20L, 38L, - 88L, 69L, 52L, 69L, 70L, 69L, 68L, 54L, 38L, 65L, 54L, 59L, 88L, - 89L, 79L, 79L, 79L, 79L, 76L, 79L, 72L, 5L, 4L, 1L, 2L, 5L, 7L, - 8L, 1L, 8L, 8L, 8L, 8L, 5L, 3L, 14L, 8L, 14L, 44L, 67L, 67L, - 57L, 42L, 57L, 40L, 40L, 43L, 40L, 49L, 49L, 46L, 54L, 45L, 12L, - 12L, 29L, 12L, 21L, 21L, 21L, 21L, 21L, 21L, 21L, 34L, 34L, 34L, - 34L, 34L, 34L, 17L, 34L, 51L, 47L, 51L, 41L, 44L, 71L, 62L, 63L, - 61L, 61L, 69L, 62L, 69L, 62L, 69L, 69L, 87L, 87L, 75L, 72L, 72L, - 76L, 74L, 72L, 72L, 74L, 79L, 90L, 72L, 78L, 78L, 35L, 30L, 26L, - 30L, 23L, 23L, 35L, 26L, 22L, 22L, 22L, 23L, 23L, 61L, 52L, 54L, - 64L, 60L, 61L, 71L, 61L, 69L, 52L, 61L, 60L, 52L, 60L, 71L, 70L, - 69L, 60L, 54L, 70L, 63L, 70L, 64L, 54L, 61L, 60L, 85L, 80L, 87L, - 80L, 80L, 80L, 77L, 80L, 81L, 76L, 87L, 77L, 14L, 13L, 5L, 8L, - 2L, 2L, 2L, 2L, 11L, 7L, 14L, 11L, 4L, 11L, 2L, 2L, 7L, 5L, 7L, - 11L, 8L, 7L, 7L, 4L, 82L, 80L, 80L, 85L, 87L, 77L, 86L, 16L, - 86L, 74L, 81L, 17L, 17L, 28L, 36L, 36L, 12L, 18L, 18L, 34L, 34L, - 17L, 34L, 29L, 16L, 16L, 18L, 21L, 28L, 36L, 63L, 69L, 69L, 64L, - 65L, 70L, 38L, 52L, 70L, 62L, 72L, 81L, 81L, 81L, 85L, 81L, 76L, - 86L, 79L, 80L, 86L, 86L, 81L, 35L, 22L, 12L, 19L, 19L, 19L, 12L, - 34L, 35L, 35L, 16L, 18L, 36L, 35L, 58L, 88L, 64L, 75L, 87L, 87L, - 87L, 76L, 74L, 90L, 77L, 76L, 81L, 81L, 77L, 84L, 86L, 90L, 16L, - 28L, 36L, 36L, 27L, 30L, 33L, 31L, 16L, 16L, 16L, 36L, 35L, 36L, - 34L, 19L, 62L, 62L, 68L, 71L, 61L, 61L, 61L, 61L, 60L, 59L, 65L, - 66L, 69L, 85L, 86L, 82L, 77L, 77L, 86L, 84L, 76L, 86L, 12L, 12L, - 12L, 12L, 12L, 12L, 12L, 12L, 30L, 21L, 21L, 34L, 34L, 34L, 34L, - 34L, 34L, 17L, 17L, 29L, 36L, 33L, 28L, 34L, 34L, 34L, 88L, 64L, - 88L, 65L, 64L, 62L, 58L, 76L, 87L, 84L, 83L, 80L, 13L, 13L, 4L, - 2L, 5L, 11L, 14L, 5L, 5L, 7L, 4L, 8L, 5L, 13L, 7L, 7L, 4L, 9L, - 85L, 78L, 78L, 81L, 75L, 83L, 90L, 84L, 86L, 21L, 36L, 34L, 18L, - 36L, 22L, 36L, 24L, 29L, 31L, 19L, 16L, 16L, 30L, 36L, 18L, 36L, - 64L, 54L, 52L, 64L, 52L, 64L, 38L, 64L, 38L, 54L, 65L, 60L, 60L, - 60L, 77L, 78L, 80L, 79L, 81L, 90L, 84L, 83L, 79L, 79L, 77L, 76L, - 72L, 74L, 86L, 72L, 74L, 73L, 34L, 34L, 34L, 34L, 34L, 17L, 17L, - 17L, 29L, 16L, 35L, 29L, 27L, 27L, 30L, 16L, 16L, 64L, 62L, 58L, - 88L, 72L, 77L, 72L, 72L, 74L, 4L, 7L, 9L, 15L, 4L, 11L, 7L, 7L, - 11L, 6L, 13L, 11L, 5L, 11L, 7L, 7L, 7L, 4L, 15L, 15L, 15L, 1L, - 4L, 15L, 5L, 5L, 13L, 6L, 14L, 3L, 4L, 4L, 2L, 7L, 4L, 4L, 4L, - 4L, 1L, 21L, 36L, 37L, 36L, 29L, 23L, 22L, 37L, 25L, 90L, 30L, - 25L, 19L, 37L, 34L, 17L, 22L, 12L, 52L, 63L, 62L, 64L, 62L, 58L, - 88L, 88L, 64L, 88L, 65L, 71L, 61L, 64L, 74L, 74L, 75L, 16L, 77L, - 83L, 84L, 87L, 85L, 77L, 86L, 74L, 73L, 76L, 86L, 36L, 25L, 25L, - 22L, 12L, 36L, 16L, 16L, 36L, 27L, 34L, 23L, 34L, 37L, 16L, 22L, - 23L, 27L, 19L, 22L, 58L, 65L, 65L, 87L, 84L, 76L, 85L, 77L, 80L, - 74L, 72L, 84L, 81L, 85L, 5L, 11L, 4L, 4L, 4L, 15L, 15L, 4L, 4L, - 15L, 4L, 8L, 9L, 4L, 1L, 1L, 4L, 4L, 1L, 15L, 15L, 4L, 11L, 2L, - 4L, 4L, 11L, 2L, 11L, 14L, 3L, 3L, 5L, 11L, 4L, 4L, 15L, 27L, - 30L, 19L, 22L, 22L, 22L, 39L, 22L, 30L, 34L, 35L, 34L, 21L, 18L, - 36L, 36L, 36L, 58L, 58L, 88L, 88L, 38L, 38L, 69L, 70L, 59L, 68L, - 69L, 64L, 64L, 68L, 69L, 66L, 66L, 66L, 69L, 66L, 78L, 86L, 78L, - 85L, 75L, 82L, 73L, 84L, 79L, 84L, 77L, 34L, 34L, 16L, 36L, 36L, - 28L, 24L, 36L, 34L, 34L, 17L, 17L, 31L, 32L, 19L, 30L, 30L, 19L, - 54L, 64L, 88L, 69L, 69L, 59L, 59L, 68L, 90L, 90L, 74L, 75L, 76L, - 85L, 1L, 4L, 1L, 4L, 3L, 13L, 9L, 1L, 5L, 7L, 15L, 4L, 1L, 13L, - 19L, 36L, 36L, 36L, 19L, 4L, 5L, 5L, 15L, 5L, 5L, 8L, 2L, 4L, - 3L, 1L, 3L, 11L, 11L, 4L, 13L, 1L, 36L, 36L, 28L, 27L, 27L, 27L, - 18L, 55L, 56L, 40L, 57L, 57L, 38L, 64L, 58L, 60L, 59L, 66L, 61L, - 38L, 52L, 52L, 70L, 66L, 69L, 69L, 69L, 69L, 69L, 69L, 77L, 90L, - 90L, 14L, 14L, 8L, 2L, 2L, 2L, 4L, 15L, 15L, 4L, 4L, 4L, 4L, - 34L, 18L, 34L, 28L, 22L, 19L, 30L, 30L, 22L, 39L, 22L, 22L, 30L, - 26L, 26L, 35L, 36L, 36L, 35L, 68L, 66L, 62L, 90L, 87L, 90L, 77L, - 87L, 80L, 90L, 86L, 79L, 80L, 84L, 81L, 79L, 36L, 22L, 22L, 22L, - 28L, 36L, 28L, 28L, 28L, 28L, 28L, 23L, 23L, 23L, 34L, 26L, 30L, - 28L, 20L, 19L, 2L, 14L, 1L, 14L, 4L, 5L, 9L, 1L, 1L, 1L, 1L, - 46L, 49L, 55L, 54L, 55L, 48L, 46L, 51L, 44L, 46L, 67L, 58L, 69L, - 69L, 69L, 69L, 69L, 69L, 69L, 69L, 69L, 69L, 52L, 60L, 69L, 38L, - 9L, 4L, 4L, 1L, 3L, 5L, 7L, 6L, 11L, 4L, 5L, 5L, 2L, 14L, 14L, - 9L, 3L, 2L, 14L, 16L, 21L, 35L, 36L, 31L, 29L, 24L, 23L, 16L, - 45L, 47L, 57L, 57L, 53L, 57L, 10L, 46L, 49L, 56L, 58L, 66L, 66L, - 66L, 69L, 66L, 66L, 77L, 78L, 83L, 87L, 80L, 80L, 77L, 81L, 81L, - 81L, 81L, 80L, 87L, 17L, 23L, 23L, 23L, 23L, 22L, 22L, 22L, 23L, - 23L, 23L, 19L, 23L, 19L, 19L, 19L, 36L, 26L, 36L, 30L, 35L, 35L, - 1L, 6L, 3L, 8L, 8L, 14L, 2L, 5L, 14L, 2L, 5L, 9L, 15L, 67L, 57L, - 40L, 57L, 57L, 48L, 43L, 44L, 41L, 47L, 41L, 49L, 41L, 41L, 40L, - 57L, 47L, 63L, 38L, 52L, 71L, 61L, 64L, 88L, 68L, 61L, 54L, 69L, - 59L, 68L, 88L, 69L, 69L, 58L, 59L, 71L, 71L, 2L, 2L, 1L, 14L, - 14L, 3L, 2L, 8L, 9L, 5L, 2L, 5L, 5L, 1L, 1L, 8L, 8L, 46L, 56L, - 57L, 57L, 67L, 43L, 57L, 46L, 49L, 67L, 47L, 47L, 43L, 40L, 45L, - 44L, 47L, 45L, 68L, 62L, 62L, 59L, 85L, 90L, 85L, 90L, 90L, 90L, - 16L, 90L, 85L, 16L, 90L, 82L, 85L, 86L, 77L, 87L, 85L, 85L, 79L, - 35L, 35L, 19L, 12L, 12L, 12L, 12L, 37L, 12L, 12L, 12L, 29L, 29L, - 16L, 36L, 30L, 21L, 21L, 34L, 8L, 7L, 14L, 11L, 5L, 1L, 7L, 1L, - 11L, 6L, 7L, 5L, 9L, 9L, 2L, 3L, 4L, 11L, 4L, 2L, 7L, 4L, 4L, - 49L, 40L, 43L, 43L, 49L, 49L, 46L, 46L, 49L, 45L, 45L, 54L, 61L, - 52L, 60L, 52L, 71L, 61L, 63L, 69L, 63L, 62L, 70L, 54L, 70L, 1L, - 3L, 8L, 8L, 8L, 8L, 14L, 14L, 14L, 5L, 5L, 2L, 14L, 14L, 9L, - 11L, 10L, 47L, 49L, 43L, 43L, 49L, 40L, 44L, 44L, 54L, 49L, 49L, - 41L, 51L, 43L, 59L, 68L, 90L, 84L, 77L, 83L, 83L, 83L, 80L, 87L, - 87L, 87L, 86L, 83L, 74L, 81L, 80L, 87L, 83L, 74L, 76L, 78L, 74L, - 81L, 73L, 86L, 87L, 86L, 86L, 74L, 82L, 80L, 72L, 21L, 21L, 21L, - 34L, 34L, 34L, 34L, 34L, 34L, 34L, 34L, 17L, 17L, 17L, 17L, 29L, - 18L, 34L, 34L, 34L, 34L, 17L, 4L, 9L, 15L, 15L, 15L, 7L, 7L, - 11L, 11L, 1L, 13L, 7L, 5L, 7L, 11L, 11L, 11L, 7L, 7L, 7L, 11L, - 40L, 50L, 44L, 44L, 44L, 46L, 46L, 48L, 48L, 43L, 44L, 56L, 50L, - 51L, 56L, 55L, 64L, 54L, 63L, 63L, 63L, 52L, 38L, 58L, 85L, 75L, - 72L, 75L, 76L, 83L, 84L, 2L, 5L, 14L, 7L, 7L, 7L, 1L, 8L, 11L, - 5L, 7L, 5L, 4L, 11L, 5L, 6L, 7L, 11L, 5L, 41L, 47L, 46L, 54L, - 42L, 55L, 42L, 43L, 50L, 50L, 48L, 48L, 53L, 54L, 54L, 68L, 69L, - 69L, 69L, 63L, 63L, 58L, 69L, 90L, 77L, 77L, 77L, 90L, 90L, 77L, - 74L, 84L, 90L, 77L, 77L, 74L, 78L, 81L, 81L, 86L, 85L, 29L, 29L, - 34L, 34L, 16L, 16L, 16L, 29L, 36L, 16L, 36L, 27L, 31L, 31L, 32L, - 19L, 27L, 36L, 36L, 15L, 15L, 1L, 4L, 5L, 15L, 15L, 4L, 15L, - 15L, 15L, 4L, 4L, 15L, 4L, 4L, 15L, 8L, 55L, 55L, 44L, 45L, 42L, - 42L, 42L, 45L, 56L, 56L, 56L, 56L, 56L, 42L, 56L, 51L, 67L, 86L, - 76L, 86L, 80L, 74L, 90L, 85L, 83L, 79L, 79L, 84L, 80L, 9L, 7L, - 13L, 4L, 7L, 4L, 4L, 9L, 9L, 9L, 15L, 11L, 7L, 11L, 1L, 13L, - 13L, 7L, 5L, 7L, 7L, 67L, 42L, 42L, 45L, 56L, 56L, 56L, 56L, - 56L, 56L, 56L, 67L, 56L, 56L, 51L, 56L, 55L, 57L, 57L, 51L, 69L, - 38L, 65L, 70L, 65L, 63L, 63L, 69L, 84L, 73L, 73L, 73L, 79L, 86L, - 78L, 85L, 85L, 78L, 74L, 80L, 82L, 78L, 86L, 81L, 77L, 85L, 16L, - 37L, 22L, 34L, 31L, 34L, 28L, 24L, 36L, 18L, 27L, 27L, 30L, 27L, - 27L, 27L, 36L, 22L, 22L, 34L, 22L, 34L, 9L, 14L, 1L, 4L, 4L, - 3L, 3L, 6L, 1L, 1L, 1L, 2L, 2L, 2L, 14L, 3L, 5L, 51L, 41L, 56L, - 40L, 45L, 45L, 44L, 67L, 67L, 56L, 57L, 57L, 57L, 67L, 51L, 49L, - 46L, 55L, 67L, 67L, 53L, 67L, 74L, 77L, 87L, 74L, 75L, 87L, 90L, - 90L, 90L, 90L, 75L, 85L, 85L, 4L, 11L, 11L, 4L, 7L, 4L, 7L, 4L, - 7L, 7L, 7L, 4L, 15L, 15L, 13L, 9L, 4L, 11L, 15L, 4L, 4L, 15L, - 15L, 42L, 57L, 54L, 54L, 45L, 50L, 56L, 57L, 67L, 57L, 40L, 67L, - 57L, 57L, 10L, 57L, 57L, 57L, 53L, 55L, 42L, 10L, 10L, 42L, 71L, - 38L, 65L, 65L, 70L, 69L, 69L, 61L, 52L, 65L, 54L, 52L, 54L, 38L, - 69L, 68L, 61L, 59L, 82L, 82L, 82L, 80L, 84L, 90L, 87L, 82L, 13L, - 14L, 11L, 2L, 9L, 4L, 2L, 4L, 4L, 4L, 2L, 29L, 28L, 30L, 23L, - 18L, 16L, 24L, 35L, 22L, 21L, 39L, 39L, 19L, 12L, 36L, 36L, 36L, - 21L, 5L, 14L, 4L, 18L, 23L, 36L, 36L, 36L, 36L, 16L, 17L, 36L, - 39L, 36L, 36L, 51L, 57L, 57L, 10L, 10L, 57L, 57L, 57L, 57L, 57L, - 51L, 51L, 49L, 57L, 10L, 41L, 45L, 67L, 10L, 48L, 10L, 49L, 56L, - 79L, 85L, 80L, 80L, 77L, 84L, 90L, 77L, 77L, 77L, 83L, 83L, 83L, - 90L, 90L, 87L, 84L, 90L, 90L, 90L, 4L, 15L, 4L, 1L, 14L, 4L, - 9L, 3L, 7L, 7L, 7L, 5L, 2L, 6L, 5L, 5L, 53L, 41L, 40L, 46L, 51L, - 45L, 51L, 53L, 42L, 46L, 10L, 67L, 49L, 49L, 47L, 55L, 49L, 40L, - 46L, 9L, 15L, 4L, 3L, 36L, 36L, 22L, 36L, 22L, 22L, 16L, 29L, - 31L, 16L, 16L, 30L, 40L, 46L, 49L, 56L, 55L, 48L, 46L, 65L, 69L, - 38L, 38L, 3L, 2L, 7L, 7L, 5L, 7L, 4L, 4L, 22L, 36L, 36L, 22L, - 23L, 23L, 25L, 26L, 22L, 49L, 57L, 51L, 51L, 46L, 48L, 67L, 42L, - 63L, 61L, 62L, 88L, 71L, 5L, 15L, 3L, 3L, 7L, 3L, 2L, 14L, 9L, - 4L, 4L, 3L, 23L, 23L, 23L, 34L, 23L, 19L, 17L, 23L, 36L, 27L, - 27L, 55L, 41L, 44L, 41L, 47L, 47L, 57L, 56L, 56L, 56L, 56L, 56L, - 56L, 51L, 51L, 54L, 70L, 60L, 59L, 69L, 52L, 88L, 78L, 75L, 3L, - 3L, 14L, 2L, 2L, 4L, 14L, 3L, 13L, 13L, 13L, 5L, 4L, 6L, 13L, - 1L, 20L, 30L, 32L, 23L, 23L, 36L, 28L, 12L, 23L, 22L, 17L, 19L, - 45L, 49L, 44L, 46L, 50L, 57L, 57L, 51L, 69L, 66L, 38L, 59L, 59L, - 66L, 64L, 1L, 4L, 8L, 1L, 13L, 13L, 8L, 8L, 8L, 13L, 13L, 8L, - 14L, 8L, 8L, 5L, 8L, 8L, 23L, 22L, 30L, 26L, 22L, 22L, 23L, 23L, - 23L, 34L, 25L, 29L, 16L, 24L, 24L, 54L, 51L, 45L, 42L, 50L, 56L, - 56L, 67L, 56L, 40L, 57L, 52L, 54L, 38L, 60L, 69L, 66L, 66L, 66L, - 60L, 38L, 54L, 70L, 9L, 7L, 1L, 4L, 11L, 15L, 7L, 4L, 7L, 11L, - 5L, 4L, 35L, 19L, 20L, 24L, 24L, 36L, 36L, 28L, 24L, 24L, 27L, - 51L, 49L, 55L, 46L, 51L, 57L, 57L, 57L, 57L, 57L, 10L, 51L, 57L, - 51L, 52L, 65L, 19L, 39L, 21L, 22L, 27L, 22L, 30L, 22L, 36L, 17L, - 36L, 19L, 49L, 49L, 67L, 42L, 48L, 45L, 57L, 53L, 51L, 41L, 47L, - 44L, 53L, 41L, 45L, 44L, 42L, 10L, 55L, 46L, 45L, 57L, 64L, 65L, - 54L, 62L, 62L, 66L, 66L, 16L, 36L, 36L, 12L, 34L, 22L, 18L, 30L, - 55L, 44L, 51L, 47L, 47L, 43L, 53L, 53L, 53L, 40L, 10L, 70L, 64L, - 58L, 66L, 66L, 68L, 70L, 60L, 59L, 68L, 22L, 22L, 34L, 16L, 30L, - 18L, 51L, 56L, 49L, 42L, 53L, 51L, 53L, 53L, 50L, 56L, 40L, 54L, - 54L, 69L, 61L, 7L, 36L, 23L, 35L, 12L, 21L, 16L, 36L, 26L, 30L, - 39L, 22L, 40L, 44L, 10L, 51L, 43L, 56L, 51L, 65L, 64L, 62L, 62L, - 88L, 69L, 63L, 58L, 69L, 60L, 64L, 62L, 11L, 5L, 5L, 11L, 9L, - 5L, 4L, 11L, 11L, 7L, 7L, 7L, 7L, 11L, 11L, 11L, 11L, 19L, 19L, - 12L, 12L, 12L, 12L, 37L, 12L, 22L, 22L, 19L, 27L, 24L, 24L, 19L, - 43L, 50L, 50L, 40L, 53L, 54L, 56L, 55L, 46L, 41L, 10L, 88L, 88L, - 88L, 59L, 69L, 69L, 69L, 62L, 8L, 8L, 8L, 11L, 8L, 7L, 1L, 11L, - 11L, 11L, 7L, 7L, 12L, 37L, 29L, 29L, 29L, 28L, 21L, 35L, 35L, - 36L, 50L, 51L, 40L, 44L, 44L, 54L, 58L, 61L, 52L, 88L, 59L, 38L, - 68L, 68L, 69L, 69L, 60L, 61L, 68L, 63L, 38L, 4L, 4L, 4L, 15L, - 15L, 15L, 35L, 23L, 21L, 21L, 29L, 36L, 25L, 26L, 27L, 18L, 41L, - 47L, 48L, 48L, 51L, 58L, 69L, 70L, 38L, 71L, 52L, 52L, 52L, 54L, - 65L, 59L, 65L, 54L, 38L, 38L, 88L, 70L, 2L, 11L, 3L, 11L, 5L, - 11L, 7L, 4L, 15L, 15L, 17L, 34L, 34L, 17L, 45L, 47L, 46L, 47L, - 51L, 45L, 51L, 50L, 52L, 69L, 66L, 70L, 69L, 54L, 59L, 88L, 68L, - 61L, 52L, 60L, 69L, 70L, 4L, 4L, 15L, 15L, 15L, 4L, 11L, 15L, - 8L, 13L, 5L, 36L, 35L, 33L, 34L, 40L, 47L, 56L, 48L, 69L, 71L, - 71L, 61L, 71L, 71L, 69L, 71L, 68L, 69L, 54L, 3L, 3L, 15L, 7L, - 3L, 1L, 1L, 4L, 2L, 1L, 4L, 34L, 34L, 29L, 34L, 34L, 17L, 16L, - 29L, 29L, 44L, 57L, 57L, 40L, 61L, 52L, 52L, 52L, 60L, 59L, 38L, - 61L, 64L, 66L, 64L, 52L, 88L, 63L, 52L, 30L, 34L, 34L, 34L, 23L, - 36L, 19L, 36L, 36L, 11L, 11L, 4L, 15L, 6L, 28L, 28L, 28L, 26L, - 34L, 34L, 34L, 17L, 34L, 30L, 27L, 18L, 25L, 29L, 36L, 9L, 7L, - 15L, 4L, 4L, 4L, 7L, 23L, 23L, 28L, 22L, 30L, 23L, 28L, 31L, - 7L, 4L, 4L, 15L, 15L, 13L, 5L, 4L, 23L, 23L, 23L, 12L, 35L, 23L, - 36L, 28L, 22L, 22L, 30L, 36L, 3L, 5L, 5L, 23L, 23L, 36L, 28L, - 17L, 19L, 5L, 4L, 15L, 23L, 22L, 22L, 19L, 26L, 15L, 15L, 7L, - 11L, 4L, 23L, 19L, 34L, 17L, 17L, 17L, 34L, 25L, 34L, 11L, 11L, - 11L, 8L, 4L, 4L, 4L, 1L, 22L, 25L, 16L, 24L, 3L, 8L, 5L, 4L, - 15L, 15L, 15L, 1L, 3L, 26L, 22L, 31L, 19L, 18L, 18L, 36L, 4L, - 5L, 14L, 11L, 19L, 18L, 17L, 35L, 36L, 36L, 27L, 9L, 11L, 11L, - 3L, 4L, 36L, 36L, 28L, 22L, 37L, 19L, 26L, 29L, 21L, 11L, 11L, - 7L, 4L, 4L, 22L, 22L, 12L, 12L, 37L, 33L, 33L, 7L, 4L, 3L, 3L, - 22L, 37L, 37L, 12L, 25L, 4L, 11L, 7L, 15L, 15L, 1L, 4L, 20L, - 28L, 19L, 36L, 35L, 12L, 22L, 15L, 15L, 4L, 1L, 1L, 36L, 25L, - 16L, 2L, 4L, 15L, 2L, 14L, 36L, 34L, 21L, 21L, 21L, 34L, 16L, - 28L, 34L, 27L, 27L, 14L, 11L, 3L, 5L, 1L, 36L, 36L, 36L, 78L, - 77L, 4L, 13L, 15L, 7L, 2L, 7L, 14L, 76L, 85L, 86L, 86L, 87L, - 82L, 77L, 76L, 86L, 86L, 80L, 80L, 83L, 82L, 78L, 72L, 72L, 78L, - 86L, 14L, 7L, 7L, 5L, 5L, 80L, 74L, 81L, 80L, 75L, 84L, 81L, - 74L, 4L, 13L, 3L, 4L, 11L, 9L, 13L, 75L, 87L, 76L, 81L, 77L, - 15L, 2L, 5L, 3L, 1L, 13L, 8L, 85L, 87L, 75L, 76L, 78L, 78L, 81L, - 86L, 84L, 90L, 82L, 72L, 77L, 85L, 76L, 82L, 87L, 81L, 77L, 84L, - 77L, 75L, 83L, 86L, 83L, 80L, 85L, 87L, 75L, 76L, 8L, 14L, 8L, - 90L, 85L, 84L, 83L, 76L, 81L, 81L, 83L, 8L, 8L, 77L, 90L, 77L, - 77L, 77L, 83L, 90L, 77L, 77L, 83L, 83L, 84L, 90L, 75L, 74L, 74L, - 76L, 11L, 2L, 80L, 81L, 85L, 90L, 77L, 80L, 77L, 83L, 77L, 73L, - 73L, 73L, 73L, 81L, 75L, 80L, 90L, 5L, 11L, 3L, 3L, 77L, 77L, - 84L, 82L, 77L, 82L, 74L, 89L, 74L, 89L, 89L, 79L, 79L, 89L, 89L, - 79L, 79L, 80L, 77L, 80L, 78L, 80L, 80L, 80L, 73L, 86L, 86L, 5L, - 7L, 14L, 7L, 15L, 7L, 14L, 8L, 80L, 81L, 80L, 87L, 87L, 87L, - 87L, 87L, 79L, 81L, 78L, 77L, 74L, 8L, 4L, 14L, 14L, 75L, 75L, - 74L, 74L, 74L, 74L, 74L, 78L, 11L, 3L, 6L, 14L, 7L, 11L, 87L, - 87L, 87L, 86L, 87L, 78L, 76L, 7L, 4L, 14L, 9L, 3L, 5L, 9L, 5L, - 2L, 2L, 72L, 79L, 85L, 73L, 74L, 72L, 86L, 86L, 78L, 5L, 4L, - 6L, 11L, 7L, 7L, 7L, 1L, 4L, 11L, 72L, 84L, 84L, 85L, 81L, 76L, - 81L, 85L, 78L, 78L, 77L, 81L, 80L, 84L, 86L, 90L, 74L, 74L, 72L, - 88L, 62L, 58L, 88L, 88L, 88L, 88L, 62L, 62L, 60L, 38L, 54L, 69L, - 69L, 59L, 59L, 59L, 68L, 87L, 86L, 77L, 84L, 80L, 83L, 81L, 72L, - 74L, 86L, 74L, 59L, 88L, 68L, 66L, 59L, 66L, 69L, 38L, 52L, 60L, - 68L, 59L, 59L, 66L, 60L, 59L, 64L, 74L, 74L, 84L, 85L, 77L, 90L, - 77L, 87L, 74L, 75L, 90L, 69L, 69L, 63L, 63L, 58L, 69L, 69L, 69L, - 69L, 52L, 38L, 71L, 69L, 69L, 74L, 84L, 81L, 85L, 77L, 85L, 76L, - 81L, 49L, 49L, 47L, 48L, 49L, 44L, 44L, 44L, 41L, 54L, 88L, 61L, - 70L, 52L, 54L, 54L, 88L, 64L, 60L, 60L, 69L, 71L, 54L, 68L, 69L, - 62L, 70L, 64L, 86L, 74L, 77L, 75L, 90L, 81L, 81L, 77L, 78L, 44L, - 49L, 49L, 43L, 51L, 50L, 50L, 47L, 47L, 41L, 44L, 44L, 40L, 44L, - 56L, 50L, 64L, 70L, 69L, 68L, 69L, 61L, 63L, 69L, 69L, 69L, 61L, - 64L, 47L, 47L, 47L, 54L, 50L, 50L, 50L, 50L, 51L, 53L, 44L, 45L, - 42L, 56L, 67L, 56L, 56L, 56L, 56L, 56L, 70L, 62L, 62L, 52L, 38L, - 69L, 60L, 54L, 63L, 63L, 53L, 53L, 67L, 67L, 53L, 42L, 53L, 57L, - 45L, 53L, 56L, 53L, 53L, 42L, 57L, 46L, 45L, 69L, 69L, 63L, 62L, - 70L, 88L, 71L, 78L, 76L, 76L, 82L, 78L, 16L, 90L, 84L, 76L, 90L, - 75L, 42L, 53L, 41L, 10L, 57L, 57L, 10L, 57L, 57L, 57L, 10L, 45L, - 50L, 53L, 10L, 57L, 51L, 45L, 53L, 47L, 41L, 90L, 90L, 90L, 77L, - 83L, 85L, 72L, 72L, 85L, 87L, 82L, 76L, 84L, 75L, 72L, 77L, 57L, - 42L, 40L, 45L, 45L, 53L, 57L, 41L, 48L, 10L, 10L, 41L, 46L, 41L, - 51L, 49L, 45L, 45L, 76L, 80L, 80L, 81L, 83L, 80L, 87L, 85L, 86L, - 90L, 90L, 16L, 16L, 75L, 41L, 43L, 43L, 46L, 51L, 43L, 48L, 41L, - 62L, 62L, 69L, 60L, 52L, 54L, 85L, 90L, 90L, 90L, 83L, 77L, 77L, - 83L, 83L, 83L, 83L, 77L, 90L, 90L, 80L, 77L, 90L, 90L, 80L, 80L, - 77L, 82L, 52L, 69L, 38L, 64L, 59L, 69L, 70L, 61L, 69L, 69L, 63L, - 73L, 73L, 73L, 74L, 81L, 90L, 89L, 89L, 89L, 79L, 89L, 89L, 89L, - 79L, 87L, 79L, 79L, 80L, 80L, 79L, 80L, 78L, 80L, 59L, 69L, 64L, - 69L, 69L, 71L, 71L, 61L, 60L, 61L, 61L, 52L, 64L, 60L, 60L, 71L, - 52L, 80L, 80L, 87L, 87L, 87L, 87L, 74L, 74L, 78L, 90L, 87L, 87L, - 74L, 87L, 87L, 87L, 75L, 74L, 80L, 86L, 38L, 69L, 69L, 54L, 38L, - 52L, 38L, 38L, 52L, 38L, 38L, 65L, 70L, 64L, 72L, 87L, 74L, 72L, - 84L, 84L, 81L, 76L, 81L, 76L, 86L, 86L, 74L, 76L, 80L, 80L, 72L, - 74L, 86L, 72L, 70L, 63L, 64L, 58L, 62L, 54L, 88L, 88L, 88L, 88L, - 64L, 88L, 71L, 64L, 62L, 64L, 86L, 86L, 86L, 86L, 86L, 80L, 86L, - 85L, 81L, 85L, 80L, 90L, 83L, 80L, 81L, 81L, 74L, 78L, 71L, 38L, - 70L, 66L, 59L, 66L, 88L, 64L, 70L, 54L, 88L, 65L, 61L, 61L, 38L, - 60L, 87L, 75L, 16L, 83L, 87L, 87L, 87L, 87L, 72L, 74L, 72L, 62L, - 62L, 54L, 66L, 71L, 61L, 60L, 69L, 69L, 62L, 63L, 64L, 84L, 74L, - 87L, 72L, 74L, 84L, 86L, 86L, 80L, 80L, 66L, 63L, 64L, 69L, 70L, - 69L, 64L, 66L, 70L, 69L, 58L, 54L, 69L, 66L, 63L, 69L, 72L, 80L, - 80L, 80L, 84L, 77L, 78L, 17L, 22L, 22L, 18L, 27L, 27L, 27L, 42L, - 55L, 49L, 55L, 69L, 71L, 71L, 90L, 72L, 87L, 87L, 41L, 47L, 67L, - 50L, 51L, 48L, 57L, 57L, 57L, 45L, 46L, 47L, 60L, 70L, 60L, 61L, - 69L, 54L, 65L, 86L, 80L, 80L, 76L, 78L, 83L, 90L, 53L, 49L, 56L, - 57L, 49L, 46L, 45L, 45L, 47L, 47L, 45L, 45L, 41L, 40L, 52L, 64L, - 52L, 64L, 38L, 83L, 83L, 85L, 77L, 83L, 44L, 40L, 10L, 49L, 49L, - 47L, 49L, 49L, 49L, 40L, 44L, 56L, 54L, 44L, 70L, 70L, 54L, 52L, - 64L, 64L, 62L, 64L, 52L, 76L, 76L, 86L, 84L, 90L, 82L, 73L, 46L, - 41L, 40L, 50L, 50L, 50L, 41L, 53L, 44L, 54L, 45L, 55L, 44L, 44L, - 51L, 67L, 45L, 64L, 88L, 88L, 88L, 64L, 65L, 88L, 64L, 62L, 62L, - 76L, 77L, 77L, 80L, 82L, 82L, 79L, 82L, 77L, 45L, 45L, 50L, 51L, - 47L, 48L, 48L, 45L, 56L, 47L, 56L, 56L, 56L, 56L, 56L, 42L, 56L, - 58L, 58L, 58L, 58L, 64L, 62L, 68L, 71L, 62L, 69L, 80L, 80L, 56L, - 56L, 42L, 44L, 50L, 67L, 67L, 67L, 57L, 67L, 56L, 56L, 57L, 57L, - 57L, 10L, 10L, 10L, 57L, 57L, 10L, 46L, 45L, 65L, 84L, 76L, 80L, - 80L, 80L, 79L, 75L, 90L, 85L, 90L, 82L, 74L, 74L, 74L, 89L, 79L, - 53L, 42L, 57L, 10L, 10L, 10L, 49L, 40L, 42L, 47L, 46L, 50L, 53L, - 49L, 88L, 65L, 60L, 54L, 59L, 59L, 59L, 59L, 68L, 69L, 69L, 74L, - 87L, 80L, 90L, 16L, 85L, 89L, 79L, 89L, 82L, 82L, 45L, 53L, 56L, - 43L, 68L, 69L, 69L, 69L, 60L, 66L, 69L, 69L, 82L, 77L, 90L, 87L, - 75L, 74L, 79L, 79L, 74L, 80L, 45L, 55L, 10L, 70L, 65L, 52L, 59L, - 69L, 69L, 75L, 77L, 90L, 82L, 16L, 77L, 75L, 80L, 80L, 74L, 87L, - 87L, 87L, 49L, 53L, 53L, 57L, 59L, 66L, 66L, 66L, 69L, 69L, 69L, - 69L, 62L, 64L, 65L, 69L, 77L, 80L, 77L, 90L, 90L, 80L, 85L, 75L, - 87L, 87L, 51L, 51L, 41L, 69L, 66L, 69L, 66L, 60L, 54L, 38L, 88L, - 61L, 81L, 77L, 77L, 77L, 77L, 80L, 80L, 74L, 51L, 49L, 47L, 40L, - 51L, 70L, 70L, 59L, 52L, 27L, 35L, 36L, 36L, 36L, 25L, 36L, 36L, - 30L, 33L, 16L, 25L, 28L, 36L, 36L, 35L, 35L, 36L, 4L, 5L, 22L, - 35L, 35L, 36L, 34L, 34L, 34L, 3L, 4L, 23L, 19L, 28L, 22L, 22L, - 22L, 24L, 3L, 13L, 7L, 23L, 23L, 23L, 23L, 35L, 19L, 12L, 31L, - 28L, 28L, 34L, 34L, 7L, 2L, 23L, 12L, 12L, 37L, 34L, 34L, 21L, - 36L, 29L, 29L, 27L, 21L, 21L, 34L, 2L, 4L, 2L, 34L, 34L, 36L, - 16L, 36L, 19L, 8L, 8L, 34L, 34L, 34L, 30L, 19L, 22L, 7L, 14L, - 34L, 17L, 35L, 37L, 37L, 1L, 4L, 13L, 21L, 23L, 16L, 35L, 17L, - 36L, 22L, 19L, 17L, 34L, 23L, 30L, 23L, 23L, 23L, 23L, 28L, 36L, - 21L, 25L, 35L, 26L, 22L, 28L, 34L, 34L, 22L, 36L, 24L, 24L, 36L, - 23L, 22L, 17L, 17L, 27L, 24L, 24L, 28L, 28L, 17L, 22L, 22L, 22L, - 19L, 19L, 19L, 17L, 34L, 25L, 29L, 25L, 16L, 30L, 28L, 28L, 22L, - 36L, 36L, 28L, 19L, 19L, 19L, 34L, 36L, 36L, 28L, 19L, 25L, 3L, - 49L, 50L, 50L, 51L, 51L, 40L, 47L, 54L, 70L, 88L, 88L, 88L, 64L, - 88L, 64L, 88L, 88L, 66L, 69L, 69L, 63L, 63L, 63L, 58L, 63L, 80L, - 84L, 84L, 86L, 81L, 85L, 79L, 82L, 74L, 74L, 82L, 87L, 74L, 78L, - 76L, 85L, 77L, 78L, 14L, 14L, 4L, 11L, 8L, 8L, 9L, 1L, 8L, 8L, - 14L, 7L, 11L, 5L, 11L, 8L, 11L, 2L, 3L, 4L, 4L, 7L, 4L, 4L, 9L, - 4L, 9L, 4L, 67L, 42L, 56L, 56L, 56L, 56L, 51L, 56L, 51L, 41L, - 44L, 49L, 56L, 41L, 53L, 46L, 56L, 56L, 50L, 67L, 64L, 54L, 65L, - 65L, 62L, 64L, 58L, 58L, 88L, 69L, 69L, 88L, 69L, 38L, 69L, 69L, - 38L, 85L, 77L, 84L, 77L, 74L, 89L, 79L, 79L, 89L, 89L, 79L, 89L, - 82L, 89L, 87L, 85L, 83L, 82L, 82L, 75L, 78L, 74L, 76L, 74L, 4L, - 3L, 6L, 11L, 5L, 5L, 14L, 8L, 14L, 8L, 13L, 8L, 8L, 13L, 5L, - 2L, 7L, 13L, 2L, 9L, 9L, 11L, 5L, 11L, 5L, 5L, 5L, 11L, 4L, 15L, - 15L, 7L, 7L, 11L, 4L, 8L, 11L, 11L, 7L, 4L, 7L, 15L, 56L, 67L, - 56L, 67L, 67L, 54L, 46L, 67L, 51L, 56L, 40L, 67L, 68L, 62L, 70L, - 65L, 59L, 54L, 54L, 54L, 38L, 38L, 68L, 69L, 88L, 69L, 52L, 70L, - 69L, 59L, 90L, 80L, 75L, 90L, 89L, 89L, 79L, 79L, 75L, 79L, 87L, - 80L, 80L, 74L, 72L, 77L, 76L, 84L, 86L, 77L, 85L, 86L, 78L, 84L, - 84L, 90L, 84L, 84L, 90L, 2L, 2L, 4L, 6L, 13L, 13L, 1L, 3L, 8L, - 8L, 11L, 11L, 13L, 1L, 7L, 14L, 5L, 15L, 5L, 16L, 36L, 19L, 30L, - 27L, 36L, 36L, 21L, 19L, 39L, 39L, 22L, 22L, 67L, 57L, 57L, 57L, - 10L, 57L, 57L, 57L, 77L, 87L, 87L, 84L, 3L, 1L, 13L, 15L, 5L, - 8L, 11L, 8L, 4L, 2L, 4L, 7L, 15L, 15L, 13L, 7L, 15L, 8L, 4L, - 5L, 4L, 15L, 15L, 4L, 4L, 4L, 15L, 15L, 15L, 15L, 15L, 39L, 22L, - 27L, 23L, 19L, 27L, 27L, 18L, 36L, 27L, 22L, 35L, 23L, 37L, 29L, - 57L, 57L, 67L, 51L, 51L, 53L, 53L, 85L, 87L, 85L, 84L, 72L, 87L, - 87L, 75L, 79L, 34L, 24L, 27L, 35L, 35L, 45L, 40L, 41L, 40L, 49L, - 40L, 41L, 51L, 47L, 48L, 44L, 48L, 45L, 57L, 10L, 44L, 53L, 53L, - 57L, 56L, 75L, 81L, 75L, 77L, 83L, 72L, 79L, 55L, 56L, 46L, 45L, - 43L, 51L, 47L, 57L, 67L, 46L, 51L, 10L, 48L, 41L, 46L, 10L, 83L, - 85L, 74L, 87L, 87L, 75L, 74L, 86L, 51L, 44L, 45L, 44L, 49L, 45L, - 53L, 49L, 46L, 57L, 47L, 90L, 87L, 85L, 80L, 75L, 84L, 44L, 46L, - 51L, 46L, 67L, 51L, 44L, 51L, 16L, 16L, 81L, 85L, 72L, 72L, 80L, - 90L, 74L, 74L, 43L, 46L, 43L, 40L, 55L, 48L, 57L, 51L, 63L, 62L, - 64L, 70L, 64L, 61L, 73L, 16L, 84L, 84L, 77L, 77L, 74L, 72L, 84L, - 81L, 85L, 76L, 81L, 44L, 44L, 45L, 51L, 57L, 51L, 51L, 51L, 57L, - 71L, 61L, 54L, 60L, 83L, 84L, 76L, 86L, 86L, 86L, 81L, 43L, 50L, - 50L, 50L, 41L, 57L, 61L, 71L, 63L, 54L, 69L, 61L, 83L, 83L, 90L, - 83L, 90L, 77L, 74L, 86L, 86L, 86L, 53L, 44L, 45L, 41L, 44L, 45L, - 65L, 60L, 59L, 62L, 70L, 70L, 63L, 69L, 69L, 69L, 69L, 63L, 77L, - 74L, 80L, 87L, 87L, 87L, 77L, 77L, 81L, 86L, 82L, 86L, 41L, 40L, - 53L, 46L, 41L, 69L, 63L, 61L, 64L, 69L, 88L, 70L, 52L, 59L, 88L, - 59L, 59L, 62L, 62L, 64L, 88L, 58L, 69L, 69L, 83L, 78L, 76L, 85L, - 77L, 77L, 90L, 75L, 80L, 75L, 90L, 74L, 74L, 72L, 13L, 14L, 5L, - 5L, 2L, 7L, 5L, 7L, 51L, 44L, 51L, 71L, 54L, 52L, 52L, 64L, 60L, - 61L, 61L, 60L, 68L, 68L, 71L, 68L, 59L, 66L, 71L, 71L, 66L, 69L, - 63L, 71L, 64L, 71L, 69L, 80L, 90L, 80L, 82L, 78L, 84L, 76L, 85L, - 86L, 2L, 8L, 2L, 51L, 43L, 71L, 62L, 65L, 64L, 38L, 38L, 65L, - 58L, 38L, 65L, 69L, 63L, 70L, 54L, 59L, 59L, 66L, 66L, 60L, 69L, - 85L, 83L, 75L, 80L, 73L, 79L, 79L, 82L, 77L, 76L, 74L, 78L, 78L, - 90L, 74L, 74L, 87L, 86L, 8L, 5L, 7L, 4L, 4L, 70L, 72L, 82L, 89L, - 80L, 87L, 85L, 87L, 87L, 87L, 83L, 76L, 63L, 69L, 38L, 38L, 81L, - 73L, 90L, 79L, 87L, 75L, 80L, 80L, 80L, 75L, 78L, 80L, 86L, 76L, - 87L, 80L, 90L, 74L, 64L, 65L, 62L, 69L, 16L, 16L, 77L, 77L, 90L, - 90L, 80L, 80L, 80L, 72L, 72L, 78L, 79L, 85L, 74L, 74L, 75L, 65L, - 62L, 58L, 70L, 90L, 72L, 87L, 86L, 85L, 74L, 75L, 75L, 84L, 75L, - 75L, 90L, 87L, 77L, 78L, 85L, 69L, 66L, 66L, 86L, 82L, 74L, 84L, - 90L, 77L, 77L, 59L, 59L, 66L, 59L, 75L, 75L, 84L, 84L, 83L, 83L, - 90L, 66L, 66L, 66L, 66L, 52L, 61L, 82L, 78L, 84L, 85L, 86L, 90L, - 90L, 87L, 90L, 69L, 69L, 58L, 69L, 58L, 63L, 69L, 81L, 86L, 87L, - 76L, 90L, 77L, 69L, 72L, 81L, 69L, 69L, 69L, 54L, 66L, 64L, 64L, - 84L, 87L, 80L, 80L, 80L, 87L, 54L, 71L, 61L, 54L, 80L, 77L, 90L, - 64L, 52L, 64L, 54L, 52L, 77L, 84L, 90L, 85L, 90L, 90L, 77L, 73L, - 87L, 87L, 87L, 87L, 74L, 78L, 84L, 85L, 76L, 69L, 69L, 63L, 88L, - 58L, 70L, 90L, 90L, 80L, 80L, 84L, 84L, 87L, 87L, 87L, 74L, 89L, - 76L, 86L, 87L, 86L, 81L, 90L, 54L, 52L, 71L, 60L, 60L, 16L, 16L, - 81L, 73L, 79L, 79L, 89L, 86L, 86L, 80L, 76L, 76L, 85L, 87L, 75L, - 77L, 55L, 45L, 46L, 46L, 56L, 42L, 46L, 49L, 55L, 70L, 71L, 69L, - 38L, 69L, 4L, 15L, 3L, 13L, 2L, 15L, 2L, 2L, 2L, 2L, 8L, 2L, - 15L, 51L, 44L, 44L, 46L, 46L, 40L, 44L, 43L, 43L, 49L, 50L, 50L, - 55L, 46L, 57L, 60L, 62L, 63L, 69L, 63L, 85L, 85L, 81L, 80L, 80L, - 80L, 84L, 80L, 87L, 85L, 81L, 86L, 85L, 81L, 85L, 86L, 85L, 6L, - 1L, 2L, 4L, 1L, 6L, 3L, 8L, 28L, 27L, 22L, 23L, 23L, 22L, 22L, - 30L, 34L, 22L, 19L, 28L, 36L, 44L, 55L, 45L, 50L, 48L, 57L, 41L, - 49L, 44L, 43L, 40L, 51L, 68L, 61L, 66L, 64L, 61L, 61L, 52L, 4L, - 15L, 4L, 13L, 1L, 14L, 14L, 5L, 26L, 19L, 19L, 31L, 18L, 28L, - 19L, 54L, 44L, 42L, 42L, 42L, 42L, 56L, 56L, 56L, 56L, 56L, 41L, - 41L, 56L, 56L, 40L, 56L, 50L, 57L, 67L, 67L, 77L, 87L, 87L, 83L, - 85L, 74L, 77L, 78L, 74L, 84L, 84L, 84L, 90L, 90L, 86L, 85L, 80L, - 79L, 86L, 87L, 80L, 82L, 75L, 86L, 78L, 2L, 15L, 14L, 8L, 8L, - 8L, 14L, 14L, 8L, 28L, 23L, 26L, 16L, 16L, 33L, 30L, 25L, 28L, - 41L, 40L, 44L, 51L, 51L, 51L, 51L, 48L, 49L, 61L, 61L, 60L, 61L, - 61L, 66L, 59L, 66L, 66L, 69L, 36L, 19L, 22L, 36L, 36L, 23L, 19L, - 28L, 19L, 36L, 22L, 22L, 36L, 36L, 28L, 28L, 28L, 27L, 57L, 57L, - 10L, 53L, 53L, 57L, 57L, 10L, 46L, 45L, 57L, 10L, 10L, 10L, 49L, - 51L, 45L, 67L, 53L, 53L, 41L, 43L, 44L, 85L, 86L, 86L, 86L, 85L, - 77L, 77L, 76L, 86L, 82L, 77L, 2L, 5L, 7L, 1L, 7L, 7L, 7L, 9L, - 14L, 17L, 23L, 35L, 22L, 22L, 22L, 22L, 23L, 22L, 34L, 17L, 35L, - 35L, 21L, 21L, 47L, 53L, 44L, 44L, 44L, 61L, 52L, 52L, 52L, 86L, - 81L, 87L, 72L, 83L, 82L, 84L, 84L, 90L, 76L, 89L, 86L, 81L, 72L, - 75L, 76L, 36L, 23L, 23L, 23L, 28L, 23L, 36L, 12L, 20L, 17L, 23L, - 23L, 22L, 22L, 22L, 22L, 23L, 23L, 23L, 23L, 74L, 86L, 14L, 15L, - 11L, 11L, 11L, 11L, 11L, 6L, 23L, 19L, 19L, 19L, 19L, 19L, 35L, - 28L, 21L, 22L, 22L, 22L, 34L, 44L, 46L, 55L, 56L, 40L, 41L, 60L, - 63L, 69L, 69L, 78L, 80L, 87L, 74L, 80L, 74L, 81L, 90L, 74L, 86L, - 77L, 74L, 76L, 23L, 22L, 22L, 19L, 12L, 22L, 22L, 36L, 30L, 20L, - 33L, 17L, 35L, 35L, 35L, 19L, 86L, 86L, 16L, 82L, 25L, 80L, 74L, - 5L, 5L, 5L, 6L, 11L, 5L, 6L, 5L, 23L, 30L, 17L, 35L, 35L, 35L, - 12L, 19L, 34L, 37L, 36L, 21L, 45L, 42L, 42L, 56L, 53L, 56L, 56L, - 56L, 56L, 38L, 52L, 81L, 77L, 74L, 74L, 84L, 82L, 75L, 86L, 85L, - 72L, 72L, 37L, 12L, 12L, 12L, 12L, 12L, 12L, 12L, 29L, 21L, 34L, - 21L, 21L, 21L, 34L, 34L, 34L, 34L, 34L, 34L, 17L, 17L, 34L, 53L, - 53L, 53L, 40L, 45L, 46L, 53L, 42L, 10L, 48L, 48L, 53L, 10L, 53L, - 45L, 54L, 77L, 77L, 85L, 77L, 72L, 90L, 16L, 75L, 86L, 72L, 81L, - 75L, 90L, 90L, 79L, 90L, 81L, 87L, 72L, 78L, 77L, 80L, 9L, 7L, - 5L, 5L, 9L, 7L, 4L, 4L, 12L, 12L, 37L, 12L, 37L, 12L, 12L, 12L, - 12L, 12L, 30L, 36L, 34L, 21L, 35L, 27L, 27L, 56L, 56L, 56L, 67L, - 53L, 64L, 38L, 64L, 65L, 65L, 86L, 80L, 84L, 76L, 72L, 73L, 76L, - 74L, 16L, 82L, 74L, 17L, 30L, 36L, 36L, 36L, 18L, 34L, 34L, 29L, - 29L, 34L, 34L, 17L, 34L, 17L, 17L, 29L, 54L, 45L, 45L, 49L, 49L, - 41L, 51L, 41L, 41L, 45L, 40L, 40L, 51L, 41L, 53L, 16L, 86L, 73L, - 90L, 72L, 16L, 16L, 82L, 84L, 90L, 77L, 78L, 80L, 81L, 15L, 15L, - 15L, 7L, 11L, 11L, 11L, 21L, 21L, 21L, 34L, 34L, 36L, 19L, 23L, - 34L, 36L, 25L, 53L, 56L, 56L, 56L, 54L, 64L, 64L, 64L, 63L, 63L, - 62L, 54L, 84L, 81L, 79L, 1L, 5L, 3L, 6L, 8L, 2L, 2L, 3L, 4L, - 4L, 7L, 1L, 15L, 34L, 34L, 34L, 34L, 34L, 27L, 29L, 28L, 36L, - 31L, 25L, 36L, 36L, 34L, 42L, 53L, 51L, 48L, 71L, 88L, 62L, 69L, - 38L, 70L, 88L, 62L, 68L, 60L, 77L, 77L, 83L, 77L, 74L, 90L, 74L, - 87L, 74L, 74L, 82L, 11L, 13L, 4L, 7L, 11L, 11L, 11L, 7L, 7L, - 4L, 34L, 34L, 34L, 34L, 17L, 17L, 47L, 45L, 67L, 67L, 57L, 67L, - 53L, 49L, 64L, 64L, 88L, 64L, 88L, 9L, 3L, 7L, 4L, 11L, 2L, 4L, - 3L, 8L, 3L, 3L, 6L, 3L, 11L, 11L, 4L, 27L, 27L, 27L, 30L, 33L, - 33L, 16L, 16L, 34L, 12L, 26L, 16L, 22L, 22L, 22L, 65L, 38L, 63L, - 68L, 71L, 71L, 65L, 61L, 71L, 61L, 61L, 61L, 60L, 60L, 84L, 83L, - 86L, 86L, 84L, 74L, 86L, 77L, 72L, 76L, 81L, 7L, 7L, 4L, 15L, - 15L, 15L, 15L, 17L, 36L, 31L, 36L, 34L, 34L, 34L, 34L, 34L, 34L, - 43L, 46L, 42L, 57L, 51L, 67L, 67L, 53L, 88L, 88L, 88L, 88L, 64L, - 1L, 2L, 5L, 2L, 14L, 2L, 3L, 14L, 14L, 14L, 34L, 36L, 22L, 36L, - 37L, 21L, 27L, 31L, 26L, 22L, 24L, 24L, 24L, 28L, 28L, 27L, 30L, - 30L, 27L, 30L, 30L, 19L, 22L, 34L, 61L, 60L, 52L, 69L, 65L, 65L, - 52L, 52L, 38L, 38L, 38L, 64L, 65L, 63L, 64L, 88L, 77L, 83L, 85L, - 80L, 77L, 81L, 90L, 74L, 74L, 86L, 77L, 5L, 7L, 1L, 5L, 7L, 15L, - 34L, 17L, 17L, 17L, 34L, 34L, 29L, 16L, 43L, 45L, 49L, 41L, 56L, - 10L, 57L, 57L, 57L, 65L, 64L, 62L, 64L, 58L, 2L, 1L, 13L, 1L, - 5L, 5L, 8L, 8L, 8L, 14L, 13L, 8L, 5L, 2L, 2L, 2L, 11L, 13L, 2L, - 33L, 27L, 27L, 30L, 28L, 28L, 30L, 30L, 22L, 17L, 22L, 37L, 17L, - 36L, 36L, 35L, 22L, 19L, 30L, 39L, 22L, 39L, 54L, 54L, 64L, 59L, - 64L, 88L, 52L, 62L, 62L, 62L, 62L, 63L, 88L, 88L, 88L, 88L, 90L, - 77L, 83L, 73L, 82L, 82L, 82L, 84L, 90L, 87L, 77L, 77L, 78L, 7L, - 7L, 4L, 4L, 4L, 4L, 35L, 18L, 27L, 30L, 36L, 36L, 53L, 57L, 57L, - 51L, 10L, 10L, 41L, 41L, 41L, 54L, 45L, 58L, 58L, 62L, 58L, 1L, - 9L, 7L, 4L, 7L, 7L, 13L, 9L, 5L, 3L, 5L, 7L, 1L, 27L, 12L, 19L, - 19L, 19L, 28L, 17L, 27L, 27L, 16L, 27L, 56L, 88L, 88L, 58L, 58L, - 52L, 52L, 59L, 59L, 68L, 68L, 68L, 69L, 61L, 64L, 59L, 79L, 82L, - 83L, 89L, 89L, 89L, 74L, 89L, 89L, 89L, 89L, 86L, 81L, 81L, 85L, - 83L, 84L, 81L, 4L, 15L, 5L, 4L, 7L, 4L, 3L, 17L, 37L, 18L, 49L, - 10L, 57L, 57L, 10L, 47L, 53L, 46L, 51L, 41L, 58L, 1L, 7L, 7L, - 7L, 2L, 4L, 14L, 11L, 5L, 6L, 5L, 4L, 5L, 5L, 7L, 5L, 55L, 55L, - 49L, 40L, 45L, 43L, 45L, 69L, 59L, 54L, 66L, 69L, 66L, 66L, 69L, - 66L, 66L, 66L, 66L, 69L, 61L, 80L, 80L, 80L, 80L, 80L, 80L, 80L, - 81L, 87L, 77L, 81L, 90L, 86L, 15L, 3L, 6L, 7L, 2L, 2L, 3L, 3L, - 3L, 4L, 4L, 3L, 2L, 2L, 2L, 35L, 35L, 20L, 22L, 37L, 47L, 42L, - 67L, 57L, 40L, 47L, 55L, 67L, 67L, 67L, 45L, 51L, 59L, 63L, 38L, - 38L, 61L, 54L, 68L, 52L, 52L, 54L, 5L, 7L, 9L, 4L, 7L, 11L, 11L, - 13L, 11L, 4L, 1L, 5L, 7L, 7L, 7L, 11L, 11L, 11L, 51L, 40L, 46L, - 57L, 57L, 10L, 53L, 40L, 43L, 41L, 64L, 66L, 69L, 69L, 69L, 69L, - 69L, 69L, 69L, 69L, 69L, 70L, 54L, 70L, 69L, 87L, 87L, 87L, 87L, - 87L, 87L, 74L, 79L, 85L, 75L, 3L, 9L, 4L, 7L, 14L, 2L, 3L, 4L, - 13L, 25L, 21L, 31L, 28L, 22L, 26L, 22L, 34L, 36L, 22L, 47L, 40L, - 41L, 45L, 57L, 10L, 41L, 40L, 45L, 46L, 53L, 49L, 88L, 70L, 52L, - 70L, 52L, 54L, 59L, 4L, 7L, 7L, 4L, 15L, 15L, 15L, 15L, 15L, - 15L, 1L, 14L, 4L, 15L, 14L, 41L, 43L, 40L, 44L, 44L, 57L, 46L, - 54L, 40L, 44L, 47L, 40L, 54L, 40L, 38L, 88L, 69L, 38L, 88L, 61L, - 88L, 59L, 52L, 70L, 61L, 61L, 70L, 61L, 63L, 65L, 70L, 87L, 87L, - 75L, 74L, 6L, 4L, 1L, 36L, 36L, 19L, 19L, 19L, 37L, 34L, 30L, - 25L, 17L, 45L, 53L, 51L, 57L, 49L, 67L, 57L, 45L, 57L, 53L, 46L, - 63L, 69L, 69L, 69L, 59L, 68L, 59L, 38L, 63L, 60L, 7L, 9L, 15L, - 7L, 15L, 15L, 15L, 4L, 15L, 15L, 8L, 5L, 14L, 13L, 3L, 4L, 4L, - 3L, 1L, 40L, 44L, 44L, 54L, 41L, 49L, 50L, 50L, 50L, 41L, 41L, - 41L, 47L, 44L, 41L, 49L, 63L, 69L, 65L, 70L, 70L, 62L, 62L, 65L, - 54L, 61L, 78L, 72L, 78L, 72L, 87L, 72L, 74L, 78L, 84L, 84L, 84L, - 4L, 4L, 4L, 5L, 4L, 3L, 7L, 3L, 2L, 4L, 5L, 7L, 13L, 13L, 36L, - 36L, 36L, 28L, 22L, 25L, 22L, 24L, 29L, 29L, 30L, 18L, 28L, 49L, - 49L) - + + expected <- c( + 64L, 69L, 66L, 66L, 69L, 70L, 70L, 69L, 63L, 68L, 38L, 54L, + 62L, 54L, 71L, 38L, 52L, 52L, 82L, 79L, 73L, 84L, 87L, 76L, 77L, + 74L, 80L, 79L, 89L, 2L, 5L, 4L, 3L, 7L, 5L, 5L, 2L, 4L, 4L, 4L, + 14L, 2L, 36L, 24L, 30L, 27L, 22L, 36L, 36L, 19L, 34L, 49L, 44L, + 56L, 49L, 40L, 28L, 28L, 23L, 34L, 30L, 36L, 12L, 33L, 22L, 23L, + 23L, 23L, 23L, 35L, 22L, 22L, 22L, 22L, 22L, 67L, 51L, 51L, 49L, + 43L, 10L, 53L, 53L, 45L, 55L, 55L, 53L, 43L, 51L, 57L, 90L, 90L, + 90L, 80L, 77L, 82L, 73L, 82L, 73L, 82L, 77L, 76L, 77L, 78L, 79L, + 79L, 79L, 82L, 79L, 87L, 79L, 80L, 1L, 2L, 6L, 1L, 4L, 4L, 2L, + 5L, 5L, 5L, 18L, 25L, 18L, 51L, 10L, 40L, 53L, 40L, 41L, 41L, + 67L, 41L, 43L, 10L, 52L, 68L, 88L, 70L, 65L, 52L, 64L, 64L, 63L, + 38L, 69L, 70L, 70L, 58L, 69L, 64L, 54L, 69L, 58L, 89L, 79L, 87L, + 87L, 87L, 87L, 87L, 2L, 3L, 7L, 13L, 3L, 3L, 6L, 11L, 11L, 4L, + 4L, 2L, 1L, 6L, 1L, 3L, 1L, 1L, 43L, 49L, 48L, 46L, 46L, 43L, + 54L, 43L, 10L, 41L, 48L, 22L, 23L, 19L, 28L, 23L, 27L, 30L, 35L, + 35L, 35L, 35L, 35L, 19L, 19L, 19L, 19L, 12L, 37L, 12L, 57L, 51L, + 51L, 46L, 51L, 44L, 43L, 56L, 56L, 10L, 51L, 51L, 48L, 41L, 51L, + 80L, 80L, 80L, 80L, 80L, 77L, 80L, 87L, 87L, 87L, 87L, 87L, 87L, + 87L, 86L, 79L, 82L, 74L, 74L, 36L, 28L, 19L, 27L, 36L, 36L, 26L, + 23L, 23L, 23L, 21L, 26L, 19L, 35L, 29L, 36L, 23L, 20L, 20L, 38L, + 88L, 69L, 52L, 69L, 70L, 69L, 68L, 54L, 38L, 65L, 54L, 59L, 88L, + 89L, 79L, 79L, 79L, 79L, 76L, 79L, 72L, 5L, 4L, 1L, 2L, 5L, 7L, + 8L, 1L, 8L, 8L, 8L, 8L, 5L, 3L, 14L, 8L, 14L, 44L, 67L, 67L, + 57L, 42L, 57L, 40L, 40L, 43L, 40L, 49L, 49L, 46L, 54L, 45L, 12L, + 12L, 29L, 12L, 21L, 21L, 21L, 21L, 21L, 21L, 21L, 34L, 34L, 34L, + 34L, 34L, 34L, 17L, 34L, 51L, 47L, 51L, 41L, 44L, 71L, 62L, 63L, + 61L, 61L, 69L, 62L, 69L, 62L, 69L, 69L, 87L, 87L, 75L, 72L, 72L, + 76L, 74L, 72L, 72L, 74L, 79L, 90L, 72L, 78L, 78L, 35L, 30L, 26L, + 30L, 23L, 23L, 35L, 26L, 22L, 22L, 22L, 23L, 23L, 61L, 52L, 54L, + 64L, 60L, 61L, 71L, 61L, 69L, 52L, 61L, 60L, 52L, 60L, 71L, 70L, + 69L, 60L, 54L, 70L, 63L, 70L, 64L, 54L, 61L, 60L, 85L, 80L, 87L, + 80L, 80L, 80L, 77L, 80L, 81L, 76L, 87L, 77L, 14L, 13L, 5L, 8L, + 2L, 2L, 2L, 2L, 11L, 7L, 14L, 11L, 4L, 11L, 2L, 2L, 7L, 5L, 7L, + 11L, 8L, 7L, 7L, 4L, 82L, 80L, 80L, 85L, 87L, 77L, 86L, 16L, + 86L, 74L, 81L, 17L, 17L, 28L, 36L, 36L, 12L, 18L, 18L, 34L, 34L, + 17L, 34L, 29L, 16L, 16L, 18L, 21L, 28L, 36L, 63L, 69L, 69L, 64L, + 65L, 70L, 38L, 52L, 70L, 62L, 72L, 81L, 81L, 81L, 85L, 81L, 76L, + 86L, 79L, 80L, 86L, 86L, 81L, 35L, 22L, 12L, 19L, 19L, 19L, 12L, + 34L, 35L, 35L, 16L, 18L, 36L, 35L, 58L, 88L, 64L, 75L, 87L, 87L, + 87L, 76L, 74L, 90L, 77L, 76L, 81L, 81L, 77L, 84L, 86L, 90L, 16L, + 28L, 36L, 36L, 27L, 30L, 33L, 31L, 16L, 16L, 16L, 36L, 35L, 36L, + 34L, 19L, 62L, 62L, 68L, 71L, 61L, 61L, 61L, 61L, 60L, 59L, 65L, + 66L, 69L, 85L, 86L, 82L, 77L, 77L, 86L, 84L, 76L, 86L, 12L, 12L, + 12L, 12L, 12L, 12L, 12L, 12L, 30L, 21L, 21L, 34L, 34L, 34L, 34L, + 34L, 34L, 17L, 17L, 29L, 36L, 33L, 28L, 34L, 34L, 34L, 88L, 64L, + 88L, 65L, 64L, 62L, 58L, 76L, 87L, 84L, 83L, 80L, 13L, 13L, 4L, + 2L, 5L, 11L, 14L, 5L, 5L, 7L, 4L, 8L, 5L, 13L, 7L, 7L, 4L, 9L, + 85L, 78L, 78L, 81L, 75L, 83L, 90L, 84L, 86L, 21L, 36L, 34L, 18L, + 36L, 22L, 36L, 24L, 29L, 31L, 19L, 16L, 16L, 30L, 36L, 18L, 36L, + 64L, 54L, 52L, 64L, 52L, 64L, 38L, 64L, 38L, 54L, 65L, 60L, 60L, + 60L, 77L, 78L, 80L, 79L, 81L, 90L, 84L, 83L, 79L, 79L, 77L, 76L, + 72L, 74L, 86L, 72L, 74L, 73L, 34L, 34L, 34L, 34L, 34L, 17L, 17L, + 17L, 29L, 16L, 35L, 29L, 27L, 27L, 30L, 16L, 16L, 64L, 62L, 58L, + 88L, 72L, 77L, 72L, 72L, 74L, 4L, 7L, 9L, 15L, 4L, 11L, 7L, 7L, + 11L, 6L, 13L, 11L, 5L, 11L, 7L, 7L, 7L, 4L, 15L, 15L, 15L, 1L, + 4L, 15L, 5L, 5L, 13L, 6L, 14L, 3L, 4L, 4L, 2L, 7L, 4L, 4L, 4L, + 4L, 1L, 21L, 36L, 37L, 36L, 29L, 23L, 22L, 37L, 25L, 90L, 30L, + 25L, 19L, 37L, 34L, 17L, 22L, 12L, 52L, 63L, 62L, 64L, 62L, 58L, + 88L, 88L, 64L, 88L, 65L, 71L, 61L, 64L, 74L, 74L, 75L, 16L, 77L, + 83L, 84L, 87L, 85L, 77L, 86L, 74L, 73L, 76L, 86L, 36L, 25L, 25L, + 22L, 12L, 36L, 16L, 16L, 36L, 27L, 34L, 23L, 34L, 37L, 16L, 22L, + 23L, 27L, 19L, 22L, 58L, 65L, 65L, 87L, 84L, 76L, 85L, 77L, 80L, + 74L, 72L, 84L, 81L, 85L, 5L, 11L, 4L, 4L, 4L, 15L, 15L, 4L, 4L, + 15L, 4L, 8L, 9L, 4L, 1L, 1L, 4L, 4L, 1L, 15L, 15L, 4L, 11L, 2L, + 4L, 4L, 11L, 2L, 11L, 14L, 3L, 3L, 5L, 11L, 4L, 4L, 15L, 27L, + 30L, 19L, 22L, 22L, 22L, 39L, 22L, 30L, 34L, 35L, 34L, 21L, 18L, + 36L, 36L, 36L, 58L, 58L, 88L, 88L, 38L, 38L, 69L, 70L, 59L, 68L, + 69L, 64L, 64L, 68L, 69L, 66L, 66L, 66L, 69L, 66L, 78L, 86L, 78L, + 85L, 75L, 82L, 73L, 84L, 79L, 84L, 77L, 34L, 34L, 16L, 36L, 36L, + 28L, 24L, 36L, 34L, 34L, 17L, 17L, 31L, 32L, 19L, 30L, 30L, 19L, + 54L, 64L, 88L, 69L, 69L, 59L, 59L, 68L, 90L, 90L, 74L, 75L, 76L, + 85L, 1L, 4L, 1L, 4L, 3L, 13L, 9L, 1L, 5L, 7L, 15L, 4L, 1L, 13L, + 19L, 36L, 36L, 36L, 19L, 4L, 5L, 5L, 15L, 5L, 5L, 8L, 2L, 4L, + 3L, 1L, 3L, 11L, 11L, 4L, 13L, 1L, 36L, 36L, 28L, 27L, 27L, 27L, + 18L, 55L, 56L, 40L, 57L, 57L, 38L, 64L, 58L, 60L, 59L, 66L, 61L, + 38L, 52L, 52L, 70L, 66L, 69L, 69L, 69L, 69L, 69L, 69L, 77L, 90L, + 90L, 14L, 14L, 8L, 2L, 2L, 2L, 4L, 15L, 15L, 4L, 4L, 4L, 4L, + 34L, 18L, 34L, 28L, 22L, 19L, 30L, 30L, 22L, 39L, 22L, 22L, 30L, + 26L, 26L, 35L, 36L, 36L, 35L, 68L, 66L, 62L, 90L, 87L, 90L, 77L, + 87L, 80L, 90L, 86L, 79L, 80L, 84L, 81L, 79L, 36L, 22L, 22L, 22L, + 28L, 36L, 28L, 28L, 28L, 28L, 28L, 23L, 23L, 23L, 34L, 26L, 30L, + 28L, 20L, 19L, 2L, 14L, 1L, 14L, 4L, 5L, 9L, 1L, 1L, 1L, 1L, + 46L, 49L, 55L, 54L, 55L, 48L, 46L, 51L, 44L, 46L, 67L, 58L, 69L, + 69L, 69L, 69L, 69L, 69L, 69L, 69L, 69L, 69L, 52L, 60L, 69L, 38L, + 9L, 4L, 4L, 1L, 3L, 5L, 7L, 6L, 11L, 4L, 5L, 5L, 2L, 14L, 14L, + 9L, 3L, 2L, 14L, 16L, 21L, 35L, 36L, 31L, 29L, 24L, 23L, 16L, + 45L, 47L, 57L, 57L, 53L, 57L, 10L, 46L, 49L, 56L, 58L, 66L, 66L, + 66L, 69L, 66L, 66L, 77L, 78L, 83L, 87L, 80L, 80L, 77L, 81L, 81L, + 81L, 81L, 80L, 87L, 17L, 23L, 23L, 23L, 23L, 22L, 22L, 22L, 23L, + 23L, 23L, 19L, 23L, 19L, 19L, 19L, 36L, 26L, 36L, 30L, 35L, 35L, + 1L, 6L, 3L, 8L, 8L, 14L, 2L, 5L, 14L, 2L, 5L, 9L, 15L, 67L, 57L, + 40L, 57L, 57L, 48L, 43L, 44L, 41L, 47L, 41L, 49L, 41L, 41L, 40L, + 57L, 47L, 63L, 38L, 52L, 71L, 61L, 64L, 88L, 68L, 61L, 54L, 69L, + 59L, 68L, 88L, 69L, 69L, 58L, 59L, 71L, 71L, 2L, 2L, 1L, 14L, + 14L, 3L, 2L, 8L, 9L, 5L, 2L, 5L, 5L, 1L, 1L, 8L, 8L, 46L, 56L, + 57L, 57L, 67L, 43L, 57L, 46L, 49L, 67L, 47L, 47L, 43L, 40L, 45L, + 44L, 47L, 45L, 68L, 62L, 62L, 59L, 85L, 90L, 85L, 90L, 90L, 90L, + 16L, 90L, 85L, 16L, 90L, 82L, 85L, 86L, 77L, 87L, 85L, 85L, 79L, + 35L, 35L, 19L, 12L, 12L, 12L, 12L, 37L, 12L, 12L, 12L, 29L, 29L, + 16L, 36L, 30L, 21L, 21L, 34L, 8L, 7L, 14L, 11L, 5L, 1L, 7L, 1L, + 11L, 6L, 7L, 5L, 9L, 9L, 2L, 3L, 4L, 11L, 4L, 2L, 7L, 4L, 4L, + 49L, 40L, 43L, 43L, 49L, 49L, 46L, 46L, 49L, 45L, 45L, 54L, 61L, + 52L, 60L, 52L, 71L, 61L, 63L, 69L, 63L, 62L, 70L, 54L, 70L, 1L, + 3L, 8L, 8L, 8L, 8L, 14L, 14L, 14L, 5L, 5L, 2L, 14L, 14L, 9L, + 11L, 10L, 47L, 49L, 43L, 43L, 49L, 40L, 44L, 44L, 54L, 49L, 49L, + 41L, 51L, 43L, 59L, 68L, 90L, 84L, 77L, 83L, 83L, 83L, 80L, 87L, + 87L, 87L, 86L, 83L, 74L, 81L, 80L, 87L, 83L, 74L, 76L, 78L, 74L, + 81L, 73L, 86L, 87L, 86L, 86L, 74L, 82L, 80L, 72L, 21L, 21L, 21L, + 34L, 34L, 34L, 34L, 34L, 34L, 34L, 34L, 17L, 17L, 17L, 17L, 29L, + 18L, 34L, 34L, 34L, 34L, 17L, 4L, 9L, 15L, 15L, 15L, 7L, 7L, + 11L, 11L, 1L, 13L, 7L, 5L, 7L, 11L, 11L, 11L, 7L, 7L, 7L, 11L, + 40L, 50L, 44L, 44L, 44L, 46L, 46L, 48L, 48L, 43L, 44L, 56L, 50L, + 51L, 56L, 55L, 64L, 54L, 63L, 63L, 63L, 52L, 38L, 58L, 85L, 75L, + 72L, 75L, 76L, 83L, 84L, 2L, 5L, 14L, 7L, 7L, 7L, 1L, 8L, 11L, + 5L, 7L, 5L, 4L, 11L, 5L, 6L, 7L, 11L, 5L, 41L, 47L, 46L, 54L, + 42L, 55L, 42L, 43L, 50L, 50L, 48L, 48L, 53L, 54L, 54L, 68L, 69L, + 69L, 69L, 63L, 63L, 58L, 69L, 90L, 77L, 77L, 77L, 90L, 90L, 77L, + 74L, 84L, 90L, 77L, 77L, 74L, 78L, 81L, 81L, 86L, 85L, 29L, 29L, + 34L, 34L, 16L, 16L, 16L, 29L, 36L, 16L, 36L, 27L, 31L, 31L, 32L, + 19L, 27L, 36L, 36L, 15L, 15L, 1L, 4L, 5L, 15L, 15L, 4L, 15L, + 15L, 15L, 4L, 4L, 15L, 4L, 4L, 15L, 8L, 55L, 55L, 44L, 45L, 42L, + 42L, 42L, 45L, 56L, 56L, 56L, 56L, 56L, 42L, 56L, 51L, 67L, 86L, + 76L, 86L, 80L, 74L, 90L, 85L, 83L, 79L, 79L, 84L, 80L, 9L, 7L, + 13L, 4L, 7L, 4L, 4L, 9L, 9L, 9L, 15L, 11L, 7L, 11L, 1L, 13L, + 13L, 7L, 5L, 7L, 7L, 67L, 42L, 42L, 45L, 56L, 56L, 56L, 56L, + 56L, 56L, 56L, 67L, 56L, 56L, 51L, 56L, 55L, 57L, 57L, 51L, 69L, + 38L, 65L, 70L, 65L, 63L, 63L, 69L, 84L, 73L, 73L, 73L, 79L, 86L, + 78L, 85L, 85L, 78L, 74L, 80L, 82L, 78L, 86L, 81L, 77L, 85L, 16L, + 37L, 22L, 34L, 31L, 34L, 28L, 24L, 36L, 18L, 27L, 27L, 30L, 27L, + 27L, 27L, 36L, 22L, 22L, 34L, 22L, 34L, 9L, 14L, 1L, 4L, 4L, + 3L, 3L, 6L, 1L, 1L, 1L, 2L, 2L, 2L, 14L, 3L, 5L, 51L, 41L, 56L, + 40L, 45L, 45L, 44L, 67L, 67L, 56L, 57L, 57L, 57L, 67L, 51L, 49L, + 46L, 55L, 67L, 67L, 53L, 67L, 74L, 77L, 87L, 74L, 75L, 87L, 90L, + 90L, 90L, 90L, 75L, 85L, 85L, 4L, 11L, 11L, 4L, 7L, 4L, 7L, 4L, + 7L, 7L, 7L, 4L, 15L, 15L, 13L, 9L, 4L, 11L, 15L, 4L, 4L, 15L, + 15L, 42L, 57L, 54L, 54L, 45L, 50L, 56L, 57L, 67L, 57L, 40L, 67L, + 57L, 57L, 10L, 57L, 57L, 57L, 53L, 55L, 42L, 10L, 10L, 42L, 71L, + 38L, 65L, 65L, 70L, 69L, 69L, 61L, 52L, 65L, 54L, 52L, 54L, 38L, + 69L, 68L, 61L, 59L, 82L, 82L, 82L, 80L, 84L, 90L, 87L, 82L, 13L, + 14L, 11L, 2L, 9L, 4L, 2L, 4L, 4L, 4L, 2L, 29L, 28L, 30L, 23L, + 18L, 16L, 24L, 35L, 22L, 21L, 39L, 39L, 19L, 12L, 36L, 36L, 36L, + 21L, 5L, 14L, 4L, 18L, 23L, 36L, 36L, 36L, 36L, 16L, 17L, 36L, + 39L, 36L, 36L, 51L, 57L, 57L, 10L, 10L, 57L, 57L, 57L, 57L, 57L, + 51L, 51L, 49L, 57L, 10L, 41L, 45L, 67L, 10L, 48L, 10L, 49L, 56L, + 79L, 85L, 80L, 80L, 77L, 84L, 90L, 77L, 77L, 77L, 83L, 83L, 83L, + 90L, 90L, 87L, 84L, 90L, 90L, 90L, 4L, 15L, 4L, 1L, 14L, 4L, + 9L, 3L, 7L, 7L, 7L, 5L, 2L, 6L, 5L, 5L, 53L, 41L, 40L, 46L, 51L, + 45L, 51L, 53L, 42L, 46L, 10L, 67L, 49L, 49L, 47L, 55L, 49L, 40L, + 46L, 9L, 15L, 4L, 3L, 36L, 36L, 22L, 36L, 22L, 22L, 16L, 29L, + 31L, 16L, 16L, 30L, 40L, 46L, 49L, 56L, 55L, 48L, 46L, 65L, 69L, + 38L, 38L, 3L, 2L, 7L, 7L, 5L, 7L, 4L, 4L, 22L, 36L, 36L, 22L, + 23L, 23L, 25L, 26L, 22L, 49L, 57L, 51L, 51L, 46L, 48L, 67L, 42L, + 63L, 61L, 62L, 88L, 71L, 5L, 15L, 3L, 3L, 7L, 3L, 2L, 14L, 9L, + 4L, 4L, 3L, 23L, 23L, 23L, 34L, 23L, 19L, 17L, 23L, 36L, 27L, + 27L, 55L, 41L, 44L, 41L, 47L, 47L, 57L, 56L, 56L, 56L, 56L, 56L, + 56L, 51L, 51L, 54L, 70L, 60L, 59L, 69L, 52L, 88L, 78L, 75L, 3L, + 3L, 14L, 2L, 2L, 4L, 14L, 3L, 13L, 13L, 13L, 5L, 4L, 6L, 13L, + 1L, 20L, 30L, 32L, 23L, 23L, 36L, 28L, 12L, 23L, 22L, 17L, 19L, + 45L, 49L, 44L, 46L, 50L, 57L, 57L, 51L, 69L, 66L, 38L, 59L, 59L, + 66L, 64L, 1L, 4L, 8L, 1L, 13L, 13L, 8L, 8L, 8L, 13L, 13L, 8L, + 14L, 8L, 8L, 5L, 8L, 8L, 23L, 22L, 30L, 26L, 22L, 22L, 23L, 23L, + 23L, 34L, 25L, 29L, 16L, 24L, 24L, 54L, 51L, 45L, 42L, 50L, 56L, + 56L, 67L, 56L, 40L, 57L, 52L, 54L, 38L, 60L, 69L, 66L, 66L, 66L, + 60L, 38L, 54L, 70L, 9L, 7L, 1L, 4L, 11L, 15L, 7L, 4L, 7L, 11L, + 5L, 4L, 35L, 19L, 20L, 24L, 24L, 36L, 36L, 28L, 24L, 24L, 27L, + 51L, 49L, 55L, 46L, 51L, 57L, 57L, 57L, 57L, 57L, 10L, 51L, 57L, + 51L, 52L, 65L, 19L, 39L, 21L, 22L, 27L, 22L, 30L, 22L, 36L, 17L, + 36L, 19L, 49L, 49L, 67L, 42L, 48L, 45L, 57L, 53L, 51L, 41L, 47L, + 44L, 53L, 41L, 45L, 44L, 42L, 10L, 55L, 46L, 45L, 57L, 64L, 65L, + 54L, 62L, 62L, 66L, 66L, 16L, 36L, 36L, 12L, 34L, 22L, 18L, 30L, + 55L, 44L, 51L, 47L, 47L, 43L, 53L, 53L, 53L, 40L, 10L, 70L, 64L, + 58L, 66L, 66L, 68L, 70L, 60L, 59L, 68L, 22L, 22L, 34L, 16L, 30L, + 18L, 51L, 56L, 49L, 42L, 53L, 51L, 53L, 53L, 50L, 56L, 40L, 54L, + 54L, 69L, 61L, 7L, 36L, 23L, 35L, 12L, 21L, 16L, 36L, 26L, 30L, + 39L, 22L, 40L, 44L, 10L, 51L, 43L, 56L, 51L, 65L, 64L, 62L, 62L, + 88L, 69L, 63L, 58L, 69L, 60L, 64L, 62L, 11L, 5L, 5L, 11L, 9L, + 5L, 4L, 11L, 11L, 7L, 7L, 7L, 7L, 11L, 11L, 11L, 11L, 19L, 19L, + 12L, 12L, 12L, 12L, 37L, 12L, 22L, 22L, 19L, 27L, 24L, 24L, 19L, + 43L, 50L, 50L, 40L, 53L, 54L, 56L, 55L, 46L, 41L, 10L, 88L, 88L, + 88L, 59L, 69L, 69L, 69L, 62L, 8L, 8L, 8L, 11L, 8L, 7L, 1L, 11L, + 11L, 11L, 7L, 7L, 12L, 37L, 29L, 29L, 29L, 28L, 21L, 35L, 35L, + 36L, 50L, 51L, 40L, 44L, 44L, 54L, 58L, 61L, 52L, 88L, 59L, 38L, + 68L, 68L, 69L, 69L, 60L, 61L, 68L, 63L, 38L, 4L, 4L, 4L, 15L, + 15L, 15L, 35L, 23L, 21L, 21L, 29L, 36L, 25L, 26L, 27L, 18L, 41L, + 47L, 48L, 48L, 51L, 58L, 69L, 70L, 38L, 71L, 52L, 52L, 52L, 54L, + 65L, 59L, 65L, 54L, 38L, 38L, 88L, 70L, 2L, 11L, 3L, 11L, 5L, + 11L, 7L, 4L, 15L, 15L, 17L, 34L, 34L, 17L, 45L, 47L, 46L, 47L, + 51L, 45L, 51L, 50L, 52L, 69L, 66L, 70L, 69L, 54L, 59L, 88L, 68L, + 61L, 52L, 60L, 69L, 70L, 4L, 4L, 15L, 15L, 15L, 4L, 11L, 15L, + 8L, 13L, 5L, 36L, 35L, 33L, 34L, 40L, 47L, 56L, 48L, 69L, 71L, + 71L, 61L, 71L, 71L, 69L, 71L, 68L, 69L, 54L, 3L, 3L, 15L, 7L, + 3L, 1L, 1L, 4L, 2L, 1L, 4L, 34L, 34L, 29L, 34L, 34L, 17L, 16L, + 29L, 29L, 44L, 57L, 57L, 40L, 61L, 52L, 52L, 52L, 60L, 59L, 38L, + 61L, 64L, 66L, 64L, 52L, 88L, 63L, 52L, 30L, 34L, 34L, 34L, 23L, + 36L, 19L, 36L, 36L, 11L, 11L, 4L, 15L, 6L, 28L, 28L, 28L, 26L, + 34L, 34L, 34L, 17L, 34L, 30L, 27L, 18L, 25L, 29L, 36L, 9L, 7L, + 15L, 4L, 4L, 4L, 7L, 23L, 23L, 28L, 22L, 30L, 23L, 28L, 31L, + 7L, 4L, 4L, 15L, 15L, 13L, 5L, 4L, 23L, 23L, 23L, 12L, 35L, 23L, + 36L, 28L, 22L, 22L, 30L, 36L, 3L, 5L, 5L, 23L, 23L, 36L, 28L, + 17L, 19L, 5L, 4L, 15L, 23L, 22L, 22L, 19L, 26L, 15L, 15L, 7L, + 11L, 4L, 23L, 19L, 34L, 17L, 17L, 17L, 34L, 25L, 34L, 11L, 11L, + 11L, 8L, 4L, 4L, 4L, 1L, 22L, 25L, 16L, 24L, 3L, 8L, 5L, 4L, + 15L, 15L, 15L, 1L, 3L, 26L, 22L, 31L, 19L, 18L, 18L, 36L, 4L, + 5L, 14L, 11L, 19L, 18L, 17L, 35L, 36L, 36L, 27L, 9L, 11L, 11L, + 3L, 4L, 36L, 36L, 28L, 22L, 37L, 19L, 26L, 29L, 21L, 11L, 11L, + 7L, 4L, 4L, 22L, 22L, 12L, 12L, 37L, 33L, 33L, 7L, 4L, 3L, 3L, + 22L, 37L, 37L, 12L, 25L, 4L, 11L, 7L, 15L, 15L, 1L, 4L, 20L, + 28L, 19L, 36L, 35L, 12L, 22L, 15L, 15L, 4L, 1L, 1L, 36L, 25L, + 16L, 2L, 4L, 15L, 2L, 14L, 36L, 34L, 21L, 21L, 21L, 34L, 16L, + 28L, 34L, 27L, 27L, 14L, 11L, 3L, 5L, 1L, 36L, 36L, 36L, 78L, + 77L, 4L, 13L, 15L, 7L, 2L, 7L, 14L, 76L, 85L, 86L, 86L, 87L, + 82L, 77L, 76L, 86L, 86L, 80L, 80L, 83L, 82L, 78L, 72L, 72L, 78L, + 86L, 14L, 7L, 7L, 5L, 5L, 80L, 74L, 81L, 80L, 75L, 84L, 81L, + 74L, 4L, 13L, 3L, 4L, 11L, 9L, 13L, 75L, 87L, 76L, 81L, 77L, + 15L, 2L, 5L, 3L, 1L, 13L, 8L, 85L, 87L, 75L, 76L, 78L, 78L, 81L, + 86L, 84L, 90L, 82L, 72L, 77L, 85L, 76L, 82L, 87L, 81L, 77L, 84L, + 77L, 75L, 83L, 86L, 83L, 80L, 85L, 87L, 75L, 76L, 8L, 14L, 8L, + 90L, 85L, 84L, 83L, 76L, 81L, 81L, 83L, 8L, 8L, 77L, 90L, 77L, + 77L, 77L, 83L, 90L, 77L, 77L, 83L, 83L, 84L, 90L, 75L, 74L, 74L, + 76L, 11L, 2L, 80L, 81L, 85L, 90L, 77L, 80L, 77L, 83L, 77L, 73L, + 73L, 73L, 73L, 81L, 75L, 80L, 90L, 5L, 11L, 3L, 3L, 77L, 77L, + 84L, 82L, 77L, 82L, 74L, 89L, 74L, 89L, 89L, 79L, 79L, 89L, 89L, + 79L, 79L, 80L, 77L, 80L, 78L, 80L, 80L, 80L, 73L, 86L, 86L, 5L, + 7L, 14L, 7L, 15L, 7L, 14L, 8L, 80L, 81L, 80L, 87L, 87L, 87L, + 87L, 87L, 79L, 81L, 78L, 77L, 74L, 8L, 4L, 14L, 14L, 75L, 75L, + 74L, 74L, 74L, 74L, 74L, 78L, 11L, 3L, 6L, 14L, 7L, 11L, 87L, + 87L, 87L, 86L, 87L, 78L, 76L, 7L, 4L, 14L, 9L, 3L, 5L, 9L, 5L, + 2L, 2L, 72L, 79L, 85L, 73L, 74L, 72L, 86L, 86L, 78L, 5L, 4L, + 6L, 11L, 7L, 7L, 7L, 1L, 4L, 11L, 72L, 84L, 84L, 85L, 81L, 76L, + 81L, 85L, 78L, 78L, 77L, 81L, 80L, 84L, 86L, 90L, 74L, 74L, 72L, + 88L, 62L, 58L, 88L, 88L, 88L, 88L, 62L, 62L, 60L, 38L, 54L, 69L, + 69L, 59L, 59L, 59L, 68L, 87L, 86L, 77L, 84L, 80L, 83L, 81L, 72L, + 74L, 86L, 74L, 59L, 88L, 68L, 66L, 59L, 66L, 69L, 38L, 52L, 60L, + 68L, 59L, 59L, 66L, 60L, 59L, 64L, 74L, 74L, 84L, 85L, 77L, 90L, + 77L, 87L, 74L, 75L, 90L, 69L, 69L, 63L, 63L, 58L, 69L, 69L, 69L, + 69L, 52L, 38L, 71L, 69L, 69L, 74L, 84L, 81L, 85L, 77L, 85L, 76L, + 81L, 49L, 49L, 47L, 48L, 49L, 44L, 44L, 44L, 41L, 54L, 88L, 61L, + 70L, 52L, 54L, 54L, 88L, 64L, 60L, 60L, 69L, 71L, 54L, 68L, 69L, + 62L, 70L, 64L, 86L, 74L, 77L, 75L, 90L, 81L, 81L, 77L, 78L, 44L, + 49L, 49L, 43L, 51L, 50L, 50L, 47L, 47L, 41L, 44L, 44L, 40L, 44L, + 56L, 50L, 64L, 70L, 69L, 68L, 69L, 61L, 63L, 69L, 69L, 69L, 61L, + 64L, 47L, 47L, 47L, 54L, 50L, 50L, 50L, 50L, 51L, 53L, 44L, 45L, + 42L, 56L, 67L, 56L, 56L, 56L, 56L, 56L, 70L, 62L, 62L, 52L, 38L, + 69L, 60L, 54L, 63L, 63L, 53L, 53L, 67L, 67L, 53L, 42L, 53L, 57L, + 45L, 53L, 56L, 53L, 53L, 42L, 57L, 46L, 45L, 69L, 69L, 63L, 62L, + 70L, 88L, 71L, 78L, 76L, 76L, 82L, 78L, 16L, 90L, 84L, 76L, 90L, + 75L, 42L, 53L, 41L, 10L, 57L, 57L, 10L, 57L, 57L, 57L, 10L, 45L, + 50L, 53L, 10L, 57L, 51L, 45L, 53L, 47L, 41L, 90L, 90L, 90L, 77L, + 83L, 85L, 72L, 72L, 85L, 87L, 82L, 76L, 84L, 75L, 72L, 77L, 57L, + 42L, 40L, 45L, 45L, 53L, 57L, 41L, 48L, 10L, 10L, 41L, 46L, 41L, + 51L, 49L, 45L, 45L, 76L, 80L, 80L, 81L, 83L, 80L, 87L, 85L, 86L, + 90L, 90L, 16L, 16L, 75L, 41L, 43L, 43L, 46L, 51L, 43L, 48L, 41L, + 62L, 62L, 69L, 60L, 52L, 54L, 85L, 90L, 90L, 90L, 83L, 77L, 77L, + 83L, 83L, 83L, 83L, 77L, 90L, 90L, 80L, 77L, 90L, 90L, 80L, 80L, + 77L, 82L, 52L, 69L, 38L, 64L, 59L, 69L, 70L, 61L, 69L, 69L, 63L, + 73L, 73L, 73L, 74L, 81L, 90L, 89L, 89L, 89L, 79L, 89L, 89L, 89L, + 79L, 87L, 79L, 79L, 80L, 80L, 79L, 80L, 78L, 80L, 59L, 69L, 64L, + 69L, 69L, 71L, 71L, 61L, 60L, 61L, 61L, 52L, 64L, 60L, 60L, 71L, + 52L, 80L, 80L, 87L, 87L, 87L, 87L, 74L, 74L, 78L, 90L, 87L, 87L, + 74L, 87L, 87L, 87L, 75L, 74L, 80L, 86L, 38L, 69L, 69L, 54L, 38L, + 52L, 38L, 38L, 52L, 38L, 38L, 65L, 70L, 64L, 72L, 87L, 74L, 72L, + 84L, 84L, 81L, 76L, 81L, 76L, 86L, 86L, 74L, 76L, 80L, 80L, 72L, + 74L, 86L, 72L, 70L, 63L, 64L, 58L, 62L, 54L, 88L, 88L, 88L, 88L, + 64L, 88L, 71L, 64L, 62L, 64L, 86L, 86L, 86L, 86L, 86L, 80L, 86L, + 85L, 81L, 85L, 80L, 90L, 83L, 80L, 81L, 81L, 74L, 78L, 71L, 38L, + 70L, 66L, 59L, 66L, 88L, 64L, 70L, 54L, 88L, 65L, 61L, 61L, 38L, + 60L, 87L, 75L, 16L, 83L, 87L, 87L, 87L, 87L, 72L, 74L, 72L, 62L, + 62L, 54L, 66L, 71L, 61L, 60L, 69L, 69L, 62L, 63L, 64L, 84L, 74L, + 87L, 72L, 74L, 84L, 86L, 86L, 80L, 80L, 66L, 63L, 64L, 69L, 70L, + 69L, 64L, 66L, 70L, 69L, 58L, 54L, 69L, 66L, 63L, 69L, 72L, 80L, + 80L, 80L, 84L, 77L, 78L, 17L, 22L, 22L, 18L, 27L, 27L, 27L, 42L, + 55L, 49L, 55L, 69L, 71L, 71L, 90L, 72L, 87L, 87L, 41L, 47L, 67L, + 50L, 51L, 48L, 57L, 57L, 57L, 45L, 46L, 47L, 60L, 70L, 60L, 61L, + 69L, 54L, 65L, 86L, 80L, 80L, 76L, 78L, 83L, 90L, 53L, 49L, 56L, + 57L, 49L, 46L, 45L, 45L, 47L, 47L, 45L, 45L, 41L, 40L, 52L, 64L, + 52L, 64L, 38L, 83L, 83L, 85L, 77L, 83L, 44L, 40L, 10L, 49L, 49L, + 47L, 49L, 49L, 49L, 40L, 44L, 56L, 54L, 44L, 70L, 70L, 54L, 52L, + 64L, 64L, 62L, 64L, 52L, 76L, 76L, 86L, 84L, 90L, 82L, 73L, 46L, + 41L, 40L, 50L, 50L, 50L, 41L, 53L, 44L, 54L, 45L, 55L, 44L, 44L, + 51L, 67L, 45L, 64L, 88L, 88L, 88L, 64L, 65L, 88L, 64L, 62L, 62L, + 76L, 77L, 77L, 80L, 82L, 82L, 79L, 82L, 77L, 45L, 45L, 50L, 51L, + 47L, 48L, 48L, 45L, 56L, 47L, 56L, 56L, 56L, 56L, 56L, 42L, 56L, + 58L, 58L, 58L, 58L, 64L, 62L, 68L, 71L, 62L, 69L, 80L, 80L, 56L, + 56L, 42L, 44L, 50L, 67L, 67L, 67L, 57L, 67L, 56L, 56L, 57L, 57L, + 57L, 10L, 10L, 10L, 57L, 57L, 10L, 46L, 45L, 65L, 84L, 76L, 80L, + 80L, 80L, 79L, 75L, 90L, 85L, 90L, 82L, 74L, 74L, 74L, 89L, 79L, + 53L, 42L, 57L, 10L, 10L, 10L, 49L, 40L, 42L, 47L, 46L, 50L, 53L, + 49L, 88L, 65L, 60L, 54L, 59L, 59L, 59L, 59L, 68L, 69L, 69L, 74L, + 87L, 80L, 90L, 16L, 85L, 89L, 79L, 89L, 82L, 82L, 45L, 53L, 56L, + 43L, 68L, 69L, 69L, 69L, 60L, 66L, 69L, 69L, 82L, 77L, 90L, 87L, + 75L, 74L, 79L, 79L, 74L, 80L, 45L, 55L, 10L, 70L, 65L, 52L, 59L, + 69L, 69L, 75L, 77L, 90L, 82L, 16L, 77L, 75L, 80L, 80L, 74L, 87L, + 87L, 87L, 49L, 53L, 53L, 57L, 59L, 66L, 66L, 66L, 69L, 69L, 69L, + 69L, 62L, 64L, 65L, 69L, 77L, 80L, 77L, 90L, 90L, 80L, 85L, 75L, + 87L, 87L, 51L, 51L, 41L, 69L, 66L, 69L, 66L, 60L, 54L, 38L, 88L, + 61L, 81L, 77L, 77L, 77L, 77L, 80L, 80L, 74L, 51L, 49L, 47L, 40L, + 51L, 70L, 70L, 59L, 52L, 27L, 35L, 36L, 36L, 36L, 25L, 36L, 36L, + 30L, 33L, 16L, 25L, 28L, 36L, 36L, 35L, 35L, 36L, 4L, 5L, 22L, + 35L, 35L, 36L, 34L, 34L, 34L, 3L, 4L, 23L, 19L, 28L, 22L, 22L, + 22L, 24L, 3L, 13L, 7L, 23L, 23L, 23L, 23L, 35L, 19L, 12L, 31L, + 28L, 28L, 34L, 34L, 7L, 2L, 23L, 12L, 12L, 37L, 34L, 34L, 21L, + 36L, 29L, 29L, 27L, 21L, 21L, 34L, 2L, 4L, 2L, 34L, 34L, 36L, + 16L, 36L, 19L, 8L, 8L, 34L, 34L, 34L, 30L, 19L, 22L, 7L, 14L, + 34L, 17L, 35L, 37L, 37L, 1L, 4L, 13L, 21L, 23L, 16L, 35L, 17L, + 36L, 22L, 19L, 17L, 34L, 23L, 30L, 23L, 23L, 23L, 23L, 28L, 36L, + 21L, 25L, 35L, 26L, 22L, 28L, 34L, 34L, 22L, 36L, 24L, 24L, 36L, + 23L, 22L, 17L, 17L, 27L, 24L, 24L, 28L, 28L, 17L, 22L, 22L, 22L, + 19L, 19L, 19L, 17L, 34L, 25L, 29L, 25L, 16L, 30L, 28L, 28L, 22L, + 36L, 36L, 28L, 19L, 19L, 19L, 34L, 36L, 36L, 28L, 19L, 25L, 3L, + 49L, 50L, 50L, 51L, 51L, 40L, 47L, 54L, 70L, 88L, 88L, 88L, 64L, + 88L, 64L, 88L, 88L, 66L, 69L, 69L, 63L, 63L, 63L, 58L, 63L, 80L, + 84L, 84L, 86L, 81L, 85L, 79L, 82L, 74L, 74L, 82L, 87L, 74L, 78L, + 76L, 85L, 77L, 78L, 14L, 14L, 4L, 11L, 8L, 8L, 9L, 1L, 8L, 8L, + 14L, 7L, 11L, 5L, 11L, 8L, 11L, 2L, 3L, 4L, 4L, 7L, 4L, 4L, 9L, + 4L, 9L, 4L, 67L, 42L, 56L, 56L, 56L, 56L, 51L, 56L, 51L, 41L, + 44L, 49L, 56L, 41L, 53L, 46L, 56L, 56L, 50L, 67L, 64L, 54L, 65L, + 65L, 62L, 64L, 58L, 58L, 88L, 69L, 69L, 88L, 69L, 38L, 69L, 69L, + 38L, 85L, 77L, 84L, 77L, 74L, 89L, 79L, 79L, 89L, 89L, 79L, 89L, + 82L, 89L, 87L, 85L, 83L, 82L, 82L, 75L, 78L, 74L, 76L, 74L, 4L, + 3L, 6L, 11L, 5L, 5L, 14L, 8L, 14L, 8L, 13L, 8L, 8L, 13L, 5L, + 2L, 7L, 13L, 2L, 9L, 9L, 11L, 5L, 11L, 5L, 5L, 5L, 11L, 4L, 15L, + 15L, 7L, 7L, 11L, 4L, 8L, 11L, 11L, 7L, 4L, 7L, 15L, 56L, 67L, + 56L, 67L, 67L, 54L, 46L, 67L, 51L, 56L, 40L, 67L, 68L, 62L, 70L, + 65L, 59L, 54L, 54L, 54L, 38L, 38L, 68L, 69L, 88L, 69L, 52L, 70L, + 69L, 59L, 90L, 80L, 75L, 90L, 89L, 89L, 79L, 79L, 75L, 79L, 87L, + 80L, 80L, 74L, 72L, 77L, 76L, 84L, 86L, 77L, 85L, 86L, 78L, 84L, + 84L, 90L, 84L, 84L, 90L, 2L, 2L, 4L, 6L, 13L, 13L, 1L, 3L, 8L, + 8L, 11L, 11L, 13L, 1L, 7L, 14L, 5L, 15L, 5L, 16L, 36L, 19L, 30L, + 27L, 36L, 36L, 21L, 19L, 39L, 39L, 22L, 22L, 67L, 57L, 57L, 57L, + 10L, 57L, 57L, 57L, 77L, 87L, 87L, 84L, 3L, 1L, 13L, 15L, 5L, + 8L, 11L, 8L, 4L, 2L, 4L, 7L, 15L, 15L, 13L, 7L, 15L, 8L, 4L, + 5L, 4L, 15L, 15L, 4L, 4L, 4L, 15L, 15L, 15L, 15L, 15L, 39L, 22L, + 27L, 23L, 19L, 27L, 27L, 18L, 36L, 27L, 22L, 35L, 23L, 37L, 29L, + 57L, 57L, 67L, 51L, 51L, 53L, 53L, 85L, 87L, 85L, 84L, 72L, 87L, + 87L, 75L, 79L, 34L, 24L, 27L, 35L, 35L, 45L, 40L, 41L, 40L, 49L, + 40L, 41L, 51L, 47L, 48L, 44L, 48L, 45L, 57L, 10L, 44L, 53L, 53L, + 57L, 56L, 75L, 81L, 75L, 77L, 83L, 72L, 79L, 55L, 56L, 46L, 45L, + 43L, 51L, 47L, 57L, 67L, 46L, 51L, 10L, 48L, 41L, 46L, 10L, 83L, + 85L, 74L, 87L, 87L, 75L, 74L, 86L, 51L, 44L, 45L, 44L, 49L, 45L, + 53L, 49L, 46L, 57L, 47L, 90L, 87L, 85L, 80L, 75L, 84L, 44L, 46L, + 51L, 46L, 67L, 51L, 44L, 51L, 16L, 16L, 81L, 85L, 72L, 72L, 80L, + 90L, 74L, 74L, 43L, 46L, 43L, 40L, 55L, 48L, 57L, 51L, 63L, 62L, + 64L, 70L, 64L, 61L, 73L, 16L, 84L, 84L, 77L, 77L, 74L, 72L, 84L, + 81L, 85L, 76L, 81L, 44L, 44L, 45L, 51L, 57L, 51L, 51L, 51L, 57L, + 71L, 61L, 54L, 60L, 83L, 84L, 76L, 86L, 86L, 86L, 81L, 43L, 50L, + 50L, 50L, 41L, 57L, 61L, 71L, 63L, 54L, 69L, 61L, 83L, 83L, 90L, + 83L, 90L, 77L, 74L, 86L, 86L, 86L, 53L, 44L, 45L, 41L, 44L, 45L, + 65L, 60L, 59L, 62L, 70L, 70L, 63L, 69L, 69L, 69L, 69L, 63L, 77L, + 74L, 80L, 87L, 87L, 87L, 77L, 77L, 81L, 86L, 82L, 86L, 41L, 40L, + 53L, 46L, 41L, 69L, 63L, 61L, 64L, 69L, 88L, 70L, 52L, 59L, 88L, + 59L, 59L, 62L, 62L, 64L, 88L, 58L, 69L, 69L, 83L, 78L, 76L, 85L, + 77L, 77L, 90L, 75L, 80L, 75L, 90L, 74L, 74L, 72L, 13L, 14L, 5L, + 5L, 2L, 7L, 5L, 7L, 51L, 44L, 51L, 71L, 54L, 52L, 52L, 64L, 60L, + 61L, 61L, 60L, 68L, 68L, 71L, 68L, 59L, 66L, 71L, 71L, 66L, 69L, + 63L, 71L, 64L, 71L, 69L, 80L, 90L, 80L, 82L, 78L, 84L, 76L, 85L, + 86L, 2L, 8L, 2L, 51L, 43L, 71L, 62L, 65L, 64L, 38L, 38L, 65L, + 58L, 38L, 65L, 69L, 63L, 70L, 54L, 59L, 59L, 66L, 66L, 60L, 69L, + 85L, 83L, 75L, 80L, 73L, 79L, 79L, 82L, 77L, 76L, 74L, 78L, 78L, + 90L, 74L, 74L, 87L, 86L, 8L, 5L, 7L, 4L, 4L, 70L, 72L, 82L, 89L, + 80L, 87L, 85L, 87L, 87L, 87L, 83L, 76L, 63L, 69L, 38L, 38L, 81L, + 73L, 90L, 79L, 87L, 75L, 80L, 80L, 80L, 75L, 78L, 80L, 86L, 76L, + 87L, 80L, 90L, 74L, 64L, 65L, 62L, 69L, 16L, 16L, 77L, 77L, 90L, + 90L, 80L, 80L, 80L, 72L, 72L, 78L, 79L, 85L, 74L, 74L, 75L, 65L, + 62L, 58L, 70L, 90L, 72L, 87L, 86L, 85L, 74L, 75L, 75L, 84L, 75L, + 75L, 90L, 87L, 77L, 78L, 85L, 69L, 66L, 66L, 86L, 82L, 74L, 84L, + 90L, 77L, 77L, 59L, 59L, 66L, 59L, 75L, 75L, 84L, 84L, 83L, 83L, + 90L, 66L, 66L, 66L, 66L, 52L, 61L, 82L, 78L, 84L, 85L, 86L, 90L, + 90L, 87L, 90L, 69L, 69L, 58L, 69L, 58L, 63L, 69L, 81L, 86L, 87L, + 76L, 90L, 77L, 69L, 72L, 81L, 69L, 69L, 69L, 54L, 66L, 64L, 64L, + 84L, 87L, 80L, 80L, 80L, 87L, 54L, 71L, 61L, 54L, 80L, 77L, 90L, + 64L, 52L, 64L, 54L, 52L, 77L, 84L, 90L, 85L, 90L, 90L, 77L, 73L, + 87L, 87L, 87L, 87L, 74L, 78L, 84L, 85L, 76L, 69L, 69L, 63L, 88L, + 58L, 70L, 90L, 90L, 80L, 80L, 84L, 84L, 87L, 87L, 87L, 74L, 89L, + 76L, 86L, 87L, 86L, 81L, 90L, 54L, 52L, 71L, 60L, 60L, 16L, 16L, + 81L, 73L, 79L, 79L, 89L, 86L, 86L, 80L, 76L, 76L, 85L, 87L, 75L, + 77L, 55L, 45L, 46L, 46L, 56L, 42L, 46L, 49L, 55L, 70L, 71L, 69L, + 38L, 69L, 4L, 15L, 3L, 13L, 2L, 15L, 2L, 2L, 2L, 2L, 8L, 2L, + 15L, 51L, 44L, 44L, 46L, 46L, 40L, 44L, 43L, 43L, 49L, 50L, 50L, + 55L, 46L, 57L, 60L, 62L, 63L, 69L, 63L, 85L, 85L, 81L, 80L, 80L, + 80L, 84L, 80L, 87L, 85L, 81L, 86L, 85L, 81L, 85L, 86L, 85L, 6L, + 1L, 2L, 4L, 1L, 6L, 3L, 8L, 28L, 27L, 22L, 23L, 23L, 22L, 22L, + 30L, 34L, 22L, 19L, 28L, 36L, 44L, 55L, 45L, 50L, 48L, 57L, 41L, + 49L, 44L, 43L, 40L, 51L, 68L, 61L, 66L, 64L, 61L, 61L, 52L, 4L, + 15L, 4L, 13L, 1L, 14L, 14L, 5L, 26L, 19L, 19L, 31L, 18L, 28L, + 19L, 54L, 44L, 42L, 42L, 42L, 42L, 56L, 56L, 56L, 56L, 56L, 41L, + 41L, 56L, 56L, 40L, 56L, 50L, 57L, 67L, 67L, 77L, 87L, 87L, 83L, + 85L, 74L, 77L, 78L, 74L, 84L, 84L, 84L, 90L, 90L, 86L, 85L, 80L, + 79L, 86L, 87L, 80L, 82L, 75L, 86L, 78L, 2L, 15L, 14L, 8L, 8L, + 8L, 14L, 14L, 8L, 28L, 23L, 26L, 16L, 16L, 33L, 30L, 25L, 28L, + 41L, 40L, 44L, 51L, 51L, 51L, 51L, 48L, 49L, 61L, 61L, 60L, 61L, + 61L, 66L, 59L, 66L, 66L, 69L, 36L, 19L, 22L, 36L, 36L, 23L, 19L, + 28L, 19L, 36L, 22L, 22L, 36L, 36L, 28L, 28L, 28L, 27L, 57L, 57L, + 10L, 53L, 53L, 57L, 57L, 10L, 46L, 45L, 57L, 10L, 10L, 10L, 49L, + 51L, 45L, 67L, 53L, 53L, 41L, 43L, 44L, 85L, 86L, 86L, 86L, 85L, + 77L, 77L, 76L, 86L, 82L, 77L, 2L, 5L, 7L, 1L, 7L, 7L, 7L, 9L, + 14L, 17L, 23L, 35L, 22L, 22L, 22L, 22L, 23L, 22L, 34L, 17L, 35L, + 35L, 21L, 21L, 47L, 53L, 44L, 44L, 44L, 61L, 52L, 52L, 52L, 86L, + 81L, 87L, 72L, 83L, 82L, 84L, 84L, 90L, 76L, 89L, 86L, 81L, 72L, + 75L, 76L, 36L, 23L, 23L, 23L, 28L, 23L, 36L, 12L, 20L, 17L, 23L, + 23L, 22L, 22L, 22L, 22L, 23L, 23L, 23L, 23L, 74L, 86L, 14L, 15L, + 11L, 11L, 11L, 11L, 11L, 6L, 23L, 19L, 19L, 19L, 19L, 19L, 35L, + 28L, 21L, 22L, 22L, 22L, 34L, 44L, 46L, 55L, 56L, 40L, 41L, 60L, + 63L, 69L, 69L, 78L, 80L, 87L, 74L, 80L, 74L, 81L, 90L, 74L, 86L, + 77L, 74L, 76L, 23L, 22L, 22L, 19L, 12L, 22L, 22L, 36L, 30L, 20L, + 33L, 17L, 35L, 35L, 35L, 19L, 86L, 86L, 16L, 82L, 25L, 80L, 74L, + 5L, 5L, 5L, 6L, 11L, 5L, 6L, 5L, 23L, 30L, 17L, 35L, 35L, 35L, + 12L, 19L, 34L, 37L, 36L, 21L, 45L, 42L, 42L, 56L, 53L, 56L, 56L, + 56L, 56L, 38L, 52L, 81L, 77L, 74L, 74L, 84L, 82L, 75L, 86L, 85L, + 72L, 72L, 37L, 12L, 12L, 12L, 12L, 12L, 12L, 12L, 29L, 21L, 34L, + 21L, 21L, 21L, 34L, 34L, 34L, 34L, 34L, 34L, 17L, 17L, 34L, 53L, + 53L, 53L, 40L, 45L, 46L, 53L, 42L, 10L, 48L, 48L, 53L, 10L, 53L, + 45L, 54L, 77L, 77L, 85L, 77L, 72L, 90L, 16L, 75L, 86L, 72L, 81L, + 75L, 90L, 90L, 79L, 90L, 81L, 87L, 72L, 78L, 77L, 80L, 9L, 7L, + 5L, 5L, 9L, 7L, 4L, 4L, 12L, 12L, 37L, 12L, 37L, 12L, 12L, 12L, + 12L, 12L, 30L, 36L, 34L, 21L, 35L, 27L, 27L, 56L, 56L, 56L, 67L, + 53L, 64L, 38L, 64L, 65L, 65L, 86L, 80L, 84L, 76L, 72L, 73L, 76L, + 74L, 16L, 82L, 74L, 17L, 30L, 36L, 36L, 36L, 18L, 34L, 34L, 29L, + 29L, 34L, 34L, 17L, 34L, 17L, 17L, 29L, 54L, 45L, 45L, 49L, 49L, + 41L, 51L, 41L, 41L, 45L, 40L, 40L, 51L, 41L, 53L, 16L, 86L, 73L, + 90L, 72L, 16L, 16L, 82L, 84L, 90L, 77L, 78L, 80L, 81L, 15L, 15L, + 15L, 7L, 11L, 11L, 11L, 21L, 21L, 21L, 34L, 34L, 36L, 19L, 23L, + 34L, 36L, 25L, 53L, 56L, 56L, 56L, 54L, 64L, 64L, 64L, 63L, 63L, + 62L, 54L, 84L, 81L, 79L, 1L, 5L, 3L, 6L, 8L, 2L, 2L, 3L, 4L, + 4L, 7L, 1L, 15L, 34L, 34L, 34L, 34L, 34L, 27L, 29L, 28L, 36L, + 31L, 25L, 36L, 36L, 34L, 42L, 53L, 51L, 48L, 71L, 88L, 62L, 69L, + 38L, 70L, 88L, 62L, 68L, 60L, 77L, 77L, 83L, 77L, 74L, 90L, 74L, + 87L, 74L, 74L, 82L, 11L, 13L, 4L, 7L, 11L, 11L, 11L, 7L, 7L, + 4L, 34L, 34L, 34L, 34L, 17L, 17L, 47L, 45L, 67L, 67L, 57L, 67L, + 53L, 49L, 64L, 64L, 88L, 64L, 88L, 9L, 3L, 7L, 4L, 11L, 2L, 4L, + 3L, 8L, 3L, 3L, 6L, 3L, 11L, 11L, 4L, 27L, 27L, 27L, 30L, 33L, + 33L, 16L, 16L, 34L, 12L, 26L, 16L, 22L, 22L, 22L, 65L, 38L, 63L, + 68L, 71L, 71L, 65L, 61L, 71L, 61L, 61L, 61L, 60L, 60L, 84L, 83L, + 86L, 86L, 84L, 74L, 86L, 77L, 72L, 76L, 81L, 7L, 7L, 4L, 15L, + 15L, 15L, 15L, 17L, 36L, 31L, 36L, 34L, 34L, 34L, 34L, 34L, 34L, + 43L, 46L, 42L, 57L, 51L, 67L, 67L, 53L, 88L, 88L, 88L, 88L, 64L, + 1L, 2L, 5L, 2L, 14L, 2L, 3L, 14L, 14L, 14L, 34L, 36L, 22L, 36L, + 37L, 21L, 27L, 31L, 26L, 22L, 24L, 24L, 24L, 28L, 28L, 27L, 30L, + 30L, 27L, 30L, 30L, 19L, 22L, 34L, 61L, 60L, 52L, 69L, 65L, 65L, + 52L, 52L, 38L, 38L, 38L, 64L, 65L, 63L, 64L, 88L, 77L, 83L, 85L, + 80L, 77L, 81L, 90L, 74L, 74L, 86L, 77L, 5L, 7L, 1L, 5L, 7L, 15L, + 34L, 17L, 17L, 17L, 34L, 34L, 29L, 16L, 43L, 45L, 49L, 41L, 56L, + 10L, 57L, 57L, 57L, 65L, 64L, 62L, 64L, 58L, 2L, 1L, 13L, 1L, + 5L, 5L, 8L, 8L, 8L, 14L, 13L, 8L, 5L, 2L, 2L, 2L, 11L, 13L, 2L, + 33L, 27L, 27L, 30L, 28L, 28L, 30L, 30L, 22L, 17L, 22L, 37L, 17L, + 36L, 36L, 35L, 22L, 19L, 30L, 39L, 22L, 39L, 54L, 54L, 64L, 59L, + 64L, 88L, 52L, 62L, 62L, 62L, 62L, 63L, 88L, 88L, 88L, 88L, 90L, + 77L, 83L, 73L, 82L, 82L, 82L, 84L, 90L, 87L, 77L, 77L, 78L, 7L, + 7L, 4L, 4L, 4L, 4L, 35L, 18L, 27L, 30L, 36L, 36L, 53L, 57L, 57L, + 51L, 10L, 10L, 41L, 41L, 41L, 54L, 45L, 58L, 58L, 62L, 58L, 1L, + 9L, 7L, 4L, 7L, 7L, 13L, 9L, 5L, 3L, 5L, 7L, 1L, 27L, 12L, 19L, + 19L, 19L, 28L, 17L, 27L, 27L, 16L, 27L, 56L, 88L, 88L, 58L, 58L, + 52L, 52L, 59L, 59L, 68L, 68L, 68L, 69L, 61L, 64L, 59L, 79L, 82L, + 83L, 89L, 89L, 89L, 74L, 89L, 89L, 89L, 89L, 86L, 81L, 81L, 85L, + 83L, 84L, 81L, 4L, 15L, 5L, 4L, 7L, 4L, 3L, 17L, 37L, 18L, 49L, + 10L, 57L, 57L, 10L, 47L, 53L, 46L, 51L, 41L, 58L, 1L, 7L, 7L, + 7L, 2L, 4L, 14L, 11L, 5L, 6L, 5L, 4L, 5L, 5L, 7L, 5L, 55L, 55L, + 49L, 40L, 45L, 43L, 45L, 69L, 59L, 54L, 66L, 69L, 66L, 66L, 69L, + 66L, 66L, 66L, 66L, 69L, 61L, 80L, 80L, 80L, 80L, 80L, 80L, 80L, + 81L, 87L, 77L, 81L, 90L, 86L, 15L, 3L, 6L, 7L, 2L, 2L, 3L, 3L, + 3L, 4L, 4L, 3L, 2L, 2L, 2L, 35L, 35L, 20L, 22L, 37L, 47L, 42L, + 67L, 57L, 40L, 47L, 55L, 67L, 67L, 67L, 45L, 51L, 59L, 63L, 38L, + 38L, 61L, 54L, 68L, 52L, 52L, 54L, 5L, 7L, 9L, 4L, 7L, 11L, 11L, + 13L, 11L, 4L, 1L, 5L, 7L, 7L, 7L, 11L, 11L, 11L, 51L, 40L, 46L, + 57L, 57L, 10L, 53L, 40L, 43L, 41L, 64L, 66L, 69L, 69L, 69L, 69L, + 69L, 69L, 69L, 69L, 69L, 70L, 54L, 70L, 69L, 87L, 87L, 87L, 87L, + 87L, 87L, 74L, 79L, 85L, 75L, 3L, 9L, 4L, 7L, 14L, 2L, 3L, 4L, + 13L, 25L, 21L, 31L, 28L, 22L, 26L, 22L, 34L, 36L, 22L, 47L, 40L, + 41L, 45L, 57L, 10L, 41L, 40L, 45L, 46L, 53L, 49L, 88L, 70L, 52L, + 70L, 52L, 54L, 59L, 4L, 7L, 7L, 4L, 15L, 15L, 15L, 15L, 15L, + 15L, 1L, 14L, 4L, 15L, 14L, 41L, 43L, 40L, 44L, 44L, 57L, 46L, + 54L, 40L, 44L, 47L, 40L, 54L, 40L, 38L, 88L, 69L, 38L, 88L, 61L, + 88L, 59L, 52L, 70L, 61L, 61L, 70L, 61L, 63L, 65L, 70L, 87L, 87L, + 75L, 74L, 6L, 4L, 1L, 36L, 36L, 19L, 19L, 19L, 37L, 34L, 30L, + 25L, 17L, 45L, 53L, 51L, 57L, 49L, 67L, 57L, 45L, 57L, 53L, 46L, + 63L, 69L, 69L, 69L, 59L, 68L, 59L, 38L, 63L, 60L, 7L, 9L, 15L, + 7L, 15L, 15L, 15L, 4L, 15L, 15L, 8L, 5L, 14L, 13L, 3L, 4L, 4L, + 3L, 1L, 40L, 44L, 44L, 54L, 41L, 49L, 50L, 50L, 50L, 41L, 41L, + 41L, 47L, 44L, 41L, 49L, 63L, 69L, 65L, 70L, 70L, 62L, 62L, 65L, + 54L, 61L, 78L, 72L, 78L, 72L, 87L, 72L, 74L, 78L, 84L, 84L, 84L, + 4L, 4L, 4L, 5L, 4L, 3L, 7L, 3L, 2L, 4L, 5L, 7L, 13L, 13L, 36L, + 36L, 36L, 28L, 22L, 25L, 22L, 24L, 29L, 29L, 30L, 18L, 28L, 49L, + 49L + ) + expect_equal(mtches_a, expected) - }) -test_that("match centroid works", { - +test_that('match centroid works', { mtches_centroid <- geo_match(va_blocks, va18sub, method = 'centroid') - - expected <- c(64L, 69L, 66L, 66L, 69L, 70L, 70L, 69L, 63L, 68L, 38L, 54L, - 62L, 54L, 71L, 38L, 52L, 52L, 82L, 79L, 73L, 81L, 87L, 76L, 77L, - 74L, 80L, 79L, 89L, 2L, 5L, 4L, 3L, 7L, 5L, 5L, 2L, 4L, 4L, 4L, - 14L, 2L, 36L, 24L, 30L, 27L, 22L, 36L, 36L, 19L, 34L, 49L, 44L, - 56L, 49L, 40L, 28L, 28L, 23L, 34L, 30L, 36L, 12L, 33L, 22L, 23L, - 23L, 23L, 23L, 35L, 22L, 22L, 22L, 22L, 22L, 67L, 51L, 51L, 49L, - 43L, 10L, 53L, 53L, 45L, 55L, 55L, 53L, 43L, 51L, 57L, 90L, 90L, - 90L, 80L, 77L, 82L, 73L, 82L, 73L, 82L, 77L, 76L, 77L, 72L, 79L, - 79L, 79L, 82L, 79L, 87L, 79L, 80L, 1L, 2L, 6L, 1L, 4L, 4L, 2L, - 5L, 5L, 5L, 18L, 25L, 18L, 51L, 10L, 40L, 53L, 40L, 41L, 41L, - 67L, 41L, 43L, 10L, 52L, 68L, 88L, 70L, 65L, 52L, 64L, 64L, 63L, - 54L, 69L, 70L, 70L, 58L, 69L, 64L, 54L, 69L, 58L, 89L, 79L, 87L, - 87L, 87L, 87L, 87L, 2L, 3L, 7L, 13L, 3L, 3L, 6L, 11L, 11L, 4L, - 4L, 2L, 1L, 6L, 1L, 3L, 1L, 1L, 43L, 49L, 48L, 46L, 46L, 43L, - 54L, 43L, 10L, 41L, 48L, 22L, 23L, 19L, 28L, 23L, 27L, 30L, 35L, - 35L, 35L, 35L, 35L, 19L, 19L, 19L, 19L, 12L, 37L, 12L, 57L, 51L, - 51L, 46L, 51L, 44L, 43L, 56L, 56L, 10L, 51L, 51L, 48L, 41L, 51L, - 80L, 80L, 80L, 80L, 80L, 77L, 80L, 87L, 87L, 87L, 87L, 87L, 87L, - 87L, 86L, 79L, 82L, 74L, 74L, 36L, 28L, 19L, 27L, 36L, 36L, 26L, - 23L, 23L, 23L, 21L, 27L, 19L, 35L, 29L, 36L, 23L, 20L, 20L, 38L, - 88L, 69L, 52L, 69L, 70L, 69L, 68L, 54L, 38L, 65L, 54L, 59L, 88L, - 89L, 79L, 79L, 79L, 79L, 76L, 79L, 72L, 5L, 4L, 1L, 2L, 5L, 7L, - 8L, 1L, 8L, 8L, 8L, 8L, 5L, 3L, 14L, 8L, 14L, 44L, 57L, 67L, - 57L, 42L, 57L, 40L, 40L, 43L, 40L, 49L, 49L, 46L, 54L, 45L, 12L, - 12L, 29L, 12L, 21L, 21L, 21L, 21L, 21L, 21L, 21L, 34L, 34L, 34L, - 34L, 34L, 34L, 17L, 34L, 51L, 47L, 51L, 41L, 44L, 71L, 62L, 63L, - 61L, 61L, 69L, 62L, 69L, 62L, 69L, 69L, 87L, 87L, 75L, 72L, 72L, - 76L, 74L, 72L, 72L, 75L, 79L, 90L, 72L, 78L, 78L, 35L, 30L, 26L, - 30L, 23L, 23L, 35L, 26L, 22L, 22L, 22L, 23L, 23L, 61L, 52L, 54L, - 64L, 60L, 61L, 71L, 61L, 69L, 52L, 61L, 60L, 52L, 60L, 71L, 70L, - 69L, 60L, 54L, 70L, 63L, 70L, 64L, 54L, 61L, 60L, 85L, 80L, 87L, - 80L, 80L, 80L, 77L, 80L, 81L, 76L, 87L, 77L, 14L, 13L, 5L, 8L, - 2L, 2L, 2L, 2L, 11L, 7L, 14L, 11L, 4L, 11L, 2L, 2L, 7L, 5L, 7L, - 11L, 8L, 7L, 7L, 4L, 82L, 80L, 80L, 85L, 87L, 77L, 86L, 16L, - 86L, 74L, 81L, 17L, 17L, 28L, 36L, 36L, 12L, 18L, 18L, 34L, 34L, - 17L, 34L, 29L, 16L, 16L, 18L, 21L, 28L, 36L, 63L, 69L, 69L, 64L, - 65L, 70L, 38L, 52L, 70L, 62L, 72L, 81L, 81L, 81L, 85L, 81L, 76L, - 86L, 79L, 80L, 86L, 86L, 81L, 35L, 22L, 12L, 19L, 19L, 19L, 12L, - 34L, 35L, 35L, 16L, 18L, 36L, 35L, 58L, 88L, 64L, 75L, 87L, 87L, - 87L, 76L, 74L, 90L, 77L, 76L, 81L, 81L, 77L, 84L, 86L, 90L, 16L, - 28L, 36L, 36L, 27L, 30L, 33L, 31L, 16L, 16L, 16L, 36L, 35L, 36L, - 34L, 19L, 62L, 62L, 68L, 71L, 61L, 61L, 61L, 61L, 60L, 59L, 65L, - 66L, 69L, 85L, 86L, 82L, 77L, 77L, 86L, 84L, 76L, 86L, 12L, 12L, - 12L, 12L, 12L, 12L, 12L, 12L, 30L, 21L, 21L, 34L, 34L, 34L, 34L, - 34L, 34L, 17L, 17L, 29L, 36L, 33L, 28L, 34L, 34L, 34L, 88L, 64L, - 88L, 65L, 64L, 62L, 58L, 76L, 87L, 84L, 83L, 80L, 13L, 13L, 4L, - 2L, 5L, 11L, 14L, 5L, 5L, 7L, 4L, 8L, 5L, 13L, 7L, 7L, 4L, 9L, - 85L, 78L, 78L, 81L, 75L, 83L, 90L, 84L, 86L, 21L, 36L, 34L, 18L, - 36L, 22L, 36L, 24L, 29L, 31L, 19L, 16L, 16L, 24L, 36L, 18L, 36L, - 64L, 54L, 52L, 64L, 52L, 64L, 38L, 64L, 38L, 54L, 65L, 60L, 60L, - 60L, 84L, 78L, 80L, 79L, 81L, 90L, 84L, 83L, 79L, 79L, 77L, 76L, - 72L, 74L, 86L, 72L, 74L, 73L, 34L, 34L, 34L, 34L, 34L, 17L, 17L, - 17L, 29L, 16L, 19L, 29L, 27L, 27L, 30L, 16L, 16L, 64L, 62L, 58L, - 88L, 72L, 77L, 72L, 72L, 74L, 4L, 7L, 9L, 15L, 4L, 11L, 7L, 7L, - 11L, 6L, 13L, 11L, 5L, 11L, 7L, 7L, 7L, 4L, 15L, 15L, 15L, 1L, - 4L, 15L, 5L, 5L, 13L, 6L, 14L, 3L, 4L, 4L, 2L, 7L, 4L, 4L, 4L, - 4L, 1L, 21L, 36L, 37L, 36L, 29L, 23L, 22L, 37L, 25L, 90L, 30L, - 25L, 19L, 37L, 34L, 17L, 22L, 12L, 52L, 63L, 62L, 64L, 62L, 58L, - 88L, 88L, 64L, 88L, 65L, 71L, 61L, 64L, 74L, 74L, 75L, 16L, 77L, - 83L, 84L, 87L, 85L, 77L, 86L, 74L, 73L, 76L, 86L, 36L, 25L, 25L, - 22L, 12L, 36L, 16L, 16L, 36L, 27L, 34L, 23L, 34L, 37L, 16L, 22L, - 23L, 27L, 19L, 22L, 58L, 65L, 65L, 87L, 84L, 76L, 85L, 77L, 80L, - 74L, 72L, 84L, 81L, 85L, 5L, 11L, 4L, 4L, 4L, 15L, 15L, 4L, 4L, - 15L, 4L, 8L, 9L, 4L, 1L, 1L, 4L, 4L, 1L, 15L, 15L, 4L, 11L, 2L, - 4L, 4L, 11L, 2L, 11L, 14L, 3L, 3L, 5L, 11L, 4L, 4L, 15L, 27L, - 30L, 19L, 22L, 22L, 22L, 39L, 22L, 30L, 34L, 35L, 34L, 21L, 18L, - 36L, 36L, 36L, 58L, 58L, 88L, 88L, 38L, 38L, 69L, 70L, 59L, 68L, - 69L, 64L, 64L, 68L, 69L, 66L, 66L, 66L, 69L, 66L, 78L, 86L, 78L, - 85L, 75L, 82L, 73L, 84L, 79L, 84L, 77L, 34L, 34L, 16L, 36L, 36L, - 28L, 24L, 36L, 34L, 34L, 17L, 17L, 31L, 32L, 19L, 30L, 24L, 19L, - 54L, 64L, 88L, 69L, 69L, 59L, 59L, 68L, 90L, 90L, 74L, 75L, 76L, - 85L, 1L, 4L, 1L, 4L, 3L, 13L, 9L, 1L, 5L, 7L, 15L, 4L, 1L, 13L, - 19L, 36L, 36L, 36L, 19L, 4L, 5L, 5L, 15L, 5L, 5L, 8L, 2L, 4L, - 3L, 1L, 3L, 11L, 11L, 4L, 13L, 1L, 36L, 36L, 28L, 27L, 27L, 27L, - 18L, 55L, 56L, 40L, 57L, 57L, 38L, 64L, 58L, 60L, 59L, 66L, 61L, - 38L, 65L, 52L, 70L, 66L, 69L, 69L, 69L, 69L, 69L, 69L, 77L, 90L, - 90L, 14L, 14L, 8L, 2L, 2L, 2L, 4L, 15L, 15L, 4L, 4L, 4L, 4L, - 34L, 18L, 34L, 28L, 22L, 19L, 30L, 30L, 22L, 39L, 22L, 22L, 30L, - 26L, 26L, 35L, 36L, 36L, 35L, 68L, 66L, 62L, 90L, 87L, 90L, 77L, - 87L, 80L, 90L, 86L, 79L, 80L, 84L, 81L, 79L, 36L, 22L, 22L, 22L, - 28L, 36L, 28L, 28L, 28L, 28L, 28L, 23L, 23L, 23L, 34L, 26L, 30L, - 28L, 19L, 19L, 2L, 14L, 1L, 14L, 4L, 5L, 9L, 1L, 1L, 1L, 1L, - 46L, 49L, 55L, 54L, 55L, 48L, 46L, 51L, 44L, 46L, 67L, 58L, 69L, - 69L, 69L, 69L, 69L, 69L, 69L, 69L, 69L, 69L, 52L, 60L, 69L, 38L, - 9L, 4L, 4L, 1L, 3L, 5L, 7L, 6L, 11L, 4L, 5L, 5L, 2L, 14L, 14L, - 32L, 3L, 2L, 14L, 82L, 21L, 35L, 36L, 31L, 29L, 24L, 23L, 16L, - 45L, 47L, 57L, 57L, 53L, 57L, 10L, 46L, 49L, 56L, 58L, 66L, 66L, - 66L, 69L, 66L, 66L, 77L, 78L, 83L, 87L, 80L, 80L, 77L, 81L, 81L, - 81L, 81L, 80L, 87L, 17L, 23L, 23L, 23L, 23L, 22L, 22L, 22L, 23L, - 23L, 23L, 19L, 23L, 19L, 19L, 19L, 36L, 26L, 36L, 30L, 35L, 35L, - 1L, 6L, 3L, 8L, 8L, 14L, 2L, 5L, 14L, 2L, 5L, 9L, 15L, 67L, 57L, - 40L, 57L, 57L, 48L, 43L, 44L, 41L, 47L, 41L, 49L, 41L, 41L, 40L, - 57L, 47L, 63L, 38L, 52L, 71L, 61L, 64L, 88L, 68L, 61L, 54L, 69L, - 59L, 68L, 88L, 69L, 69L, 58L, 59L, 71L, 71L, 2L, 2L, 3L, 14L, - 14L, 3L, 2L, 8L, 9L, 5L, 2L, 5L, 5L, 1L, 1L, 8L, 8L, 46L, 56L, - 57L, 57L, 67L, 43L, 57L, 46L, 49L, 67L, 47L, 47L, 43L, 40L, 45L, - 44L, 47L, 45L, 68L, 62L, 62L, 59L, 85L, 90L, 85L, 90L, 90L, 90L, - 16L, 90L, 85L, 16L, 90L, 82L, 85L, 86L, 77L, 87L, 85L, 85L, 79L, - 35L, 35L, 19L, 12L, 12L, 12L, 12L, 37L, 12L, 12L, 12L, 29L, 29L, - 16L, 36L, 30L, 21L, 21L, 34L, 8L, 7L, 14L, 11L, 5L, 1L, 7L, 1L, - 11L, 6L, 7L, 5L, 9L, 9L, 2L, 3L, 4L, 11L, 4L, 2L, 7L, 4L, 4L, - 49L, 40L, 43L, 43L, 49L, 49L, 46L, 46L, 49L, 45L, 45L, 54L, 61L, - 52L, 60L, 52L, 71L, 61L, 63L, 69L, 63L, 62L, 70L, 54L, 70L, 1L, - 3L, 8L, 8L, 8L, 8L, 14L, 14L, 14L, 5L, 5L, 2L, 14L, 14L, 9L, - 11L, 10L, 47L, 49L, 43L, 43L, 49L, 40L, 44L, 44L, 54L, 49L, 49L, - 41L, 51L, 43L, 59L, 68L, 90L, 84L, 77L, 83L, 83L, 83L, 80L, 87L, - 87L, 87L, 86L, 83L, 74L, 81L, 80L, 87L, 83L, 74L, 76L, 78L, 74L, - 81L, 73L, 86L, 87L, 86L, 86L, 74L, 82L, 80L, 72L, 21L, 21L, 21L, - 34L, 34L, 34L, 34L, 34L, 34L, 34L, 34L, 17L, 17L, 17L, 17L, 29L, - 18L, 34L, 34L, 34L, 34L, 17L, 4L, 9L, 15L, 15L, 15L, 7L, 7L, - 11L, 11L, 1L, 13L, 7L, 5L, 7L, 11L, 11L, 11L, 7L, 7L, 7L, 11L, - 40L, 50L, 44L, 47L, 44L, 46L, 46L, 48L, 48L, 43L, 44L, 56L, 50L, - 51L, 56L, 55L, 64L, 54L, 63L, 63L, 63L, 52L, 38L, 58L, 85L, 75L, - 75L, 75L, 76L, 83L, 84L, 2L, 5L, 14L, 7L, 7L, 7L, 1L, 8L, 11L, - 5L, 7L, 5L, 4L, 11L, 5L, 6L, 7L, 11L, 5L, 41L, 47L, 46L, 54L, - 42L, 55L, 42L, 43L, 50L, 50L, 48L, 48L, 53L, 54L, 54L, 68L, 69L, - 69L, 69L, 63L, 63L, 58L, 69L, 90L, 77L, 77L, 77L, 90L, 90L, 77L, - 74L, 84L, 90L, 77L, 77L, 74L, 78L, 81L, 81L, 86L, 85L, 29L, 29L, - 34L, 34L, 16L, 16L, 16L, 29L, 36L, 16L, 36L, 27L, 31L, 31L, 32L, - 19L, 27L, 36L, 36L, 15L, 15L, 1L, 4L, 5L, 15L, 15L, 4L, 15L, - 15L, 15L, 4L, 4L, 15L, 4L, 4L, 15L, 8L, 55L, 55L, 44L, 45L, 42L, - 42L, 42L, 45L, 56L, 56L, 56L, 56L, 56L, 42L, 56L, 51L, 67L, 86L, - 76L, 86L, 80L, 74L, 90L, 85L, 83L, 79L, 79L, 84L, 80L, 9L, 7L, - 13L, 4L, 7L, 4L, 4L, 9L, 9L, 9L, 15L, 11L, 7L, 11L, 1L, 13L, - 13L, 7L, 5L, 7L, 7L, 67L, 42L, 42L, 45L, 56L, 56L, 56L, 56L, - 56L, 56L, 56L, 67L, 56L, 56L, 51L, 56L, 55L, 57L, 57L, 51L, 69L, - 38L, 65L, 70L, 65L, 63L, 63L, 69L, 84L, 73L, 73L, 73L, 79L, 78L, - 78L, 85L, 85L, 78L, 74L, 80L, 82L, 78L, 86L, 81L, 77L, 85L, 16L, - 37L, 22L, 34L, 31L, 34L, 28L, 24L, 36L, 18L, 27L, 27L, 30L, 27L, - 27L, 27L, 36L, 22L, 22L, 34L, 22L, 34L, 9L, 14L, 1L, 4L, 4L, - 3L, 3L, 6L, 1L, 1L, 1L, 2L, 2L, 2L, 14L, 3L, 5L, 51L, 41L, 56L, - 40L, 45L, 45L, 44L, 67L, 67L, 56L, 57L, 57L, 57L, 67L, 51L, 49L, - 46L, 55L, 67L, 67L, 53L, 67L, 74L, 77L, 87L, 74L, 75L, 87L, 90L, - 90L, 90L, 90L, 75L, 85L, 85L, 4L, 11L, 11L, 4L, 7L, 4L, 7L, 4L, - 7L, 7L, 7L, 4L, 15L, 15L, 13L, 9L, 4L, 11L, 15L, 4L, 4L, 15L, - 15L, 42L, 57L, 54L, 54L, 45L, 50L, 56L, 57L, 67L, 57L, 40L, 67L, - 57L, 57L, 10L, 57L, 57L, 57L, 53L, 55L, 42L, 10L, 10L, 42L, 71L, - 38L, 65L, 65L, 70L, 69L, 69L, 61L, 52L, 65L, 54L, 52L, 54L, 38L, - 69L, 68L, 61L, 59L, 82L, 82L, 82L, 80L, 84L, 90L, 87L, 82L, 13L, - 14L, 11L, 2L, 9L, 4L, 2L, 4L, 4L, 4L, 2L, 29L, 28L, 30L, 23L, - 18L, 16L, 24L, 35L, 22L, 21L, 39L, 39L, 19L, 12L, 36L, 36L, 36L, - 21L, 5L, 14L, 4L, 18L, 23L, 36L, 36L, 36L, 36L, 16L, 17L, 36L, - 39L, 36L, 36L, 51L, 57L, 57L, 10L, 10L, 57L, 57L, 57L, 57L, 57L, - 51L, 51L, 49L, 57L, 10L, 41L, 45L, 67L, 10L, 48L, 10L, 49L, 56L, - 79L, 85L, 80L, 80L, 77L, 84L, 90L, 77L, 77L, 77L, 83L, 83L, 83L, - 90L, 90L, 87L, 84L, 90L, 90L, 90L, 4L, 15L, 4L, 1L, 14L, 4L, - 9L, 3L, 7L, 7L, 4L, 5L, 2L, 6L, 5L, 5L, 53L, 41L, 40L, 46L, 51L, - 45L, 51L, 53L, 42L, 46L, 10L, 67L, 49L, 49L, 47L, 55L, 49L, 40L, - 46L, 9L, 15L, 4L, 3L, 36L, 36L, 22L, 36L, 22L, 22L, 16L, 29L, - 31L, 16L, 16L, 30L, 40L, 46L, 49L, 56L, 55L, 48L, 46L, 65L, 69L, - 38L, 38L, 3L, 2L, 7L, 7L, 5L, 7L, 4L, 4L, 22L, 36L, 36L, 22L, - 23L, 23L, 25L, 26L, 22L, 49L, 57L, 51L, 51L, 46L, 48L, 67L, 42L, - 63L, 61L, 62L, 88L, 71L, 5L, 15L, 3L, 3L, 7L, 3L, 2L, 14L, 9L, - 4L, 4L, 3L, 23L, 23L, 23L, 34L, 23L, 19L, 17L, 23L, 36L, 27L, - 27L, 55L, 41L, 44L, 41L, 47L, 47L, 57L, 56L, 56L, 56L, 56L, 56L, - 56L, 51L, 51L, 54L, 70L, 60L, 59L, 69L, 52L, 88L, 78L, 75L, 3L, - 3L, 14L, 2L, 2L, 4L, 14L, 3L, 13L, 13L, 13L, 5L, 4L, 6L, 13L, - 1L, 20L, 30L, 32L, 23L, 23L, 36L, 28L, 12L, 23L, 39L, 17L, 19L, - 45L, 49L, 44L, 46L, 50L, 57L, 57L, 51L, 69L, 66L, 38L, 59L, 59L, - 66L, 64L, 1L, 4L, 8L, 1L, 13L, 13L, 8L, 8L, 8L, 13L, 13L, 8L, - 14L, 8L, 8L, 5L, 8L, 8L, 23L, 22L, 30L, 26L, 22L, 22L, 23L, 23L, - 23L, 34L, 25L, 29L, 16L, 24L, 24L, 54L, 51L, 45L, 42L, 50L, 56L, - 56L, 67L, 56L, 40L, 57L, 52L, 54L, 38L, 60L, 69L, 66L, 66L, 66L, - 60L, 38L, 54L, 70L, 9L, 7L, 1L, 4L, 11L, 15L, 7L, 4L, 7L, 11L, - 5L, 4L, 35L, 19L, 20L, 24L, 24L, 36L, 36L, 28L, 24L, 24L, 27L, - 51L, 49L, 55L, 46L, 51L, 57L, 57L, 57L, 57L, 57L, 10L, 51L, 57L, - 51L, 52L, 65L, 19L, 39L, 21L, 22L, 27L, 22L, 30L, 22L, 36L, 17L, - 36L, 19L, 49L, 49L, 67L, 42L, 48L, 45L, 57L, 53L, 51L, 41L, 47L, - 44L, 53L, 41L, 45L, 44L, 42L, 10L, 55L, 46L, 45L, 57L, 64L, 65L, - 54L, 62L, 62L, 66L, 66L, 16L, 36L, 36L, 12L, 34L, 22L, 18L, 30L, - 55L, 40L, 51L, 47L, 47L, 43L, 53L, 53L, 53L, 40L, 10L, 70L, 64L, - 58L, 66L, 66L, 68L, 70L, 60L, 59L, 68L, 22L, 22L, 34L, 16L, 30L, - 18L, 51L, 56L, 49L, 42L, 53L, 51L, 53L, 53L, 50L, 56L, 40L, 54L, - 54L, 69L, 61L, 7L, 36L, 23L, 35L, 12L, 21L, 16L, 36L, 26L, 30L, - 39L, 22L, 40L, 44L, 10L, 51L, 43L, 56L, 51L, 65L, 64L, 62L, 62L, - 88L, 69L, 63L, 58L, 69L, 60L, 64L, 62L, 11L, 5L, 5L, 11L, 9L, - 5L, 4L, 11L, 11L, 7L, 7L, 7L, 7L, 11L, 11L, 11L, 11L, 19L, 19L, - 12L, 12L, 12L, 12L, 37L, 12L, 22L, 22L, 19L, 27L, 24L, 24L, 19L, - 43L, 50L, 50L, 40L, 53L, 54L, 56L, 55L, 46L, 41L, 10L, 88L, 88L, - 88L, 59L, 69L, 69L, 69L, 62L, 8L, 8L, 8L, 11L, 8L, 7L, 1L, 11L, - 11L, 11L, 7L, 7L, 12L, 37L, 29L, 29L, 29L, 28L, 21L, 35L, 35L, - 36L, 50L, 51L, 40L, 44L, 44L, 54L, 58L, 61L, 52L, 88L, 59L, 38L, - 68L, 68L, 69L, 69L, 60L, 61L, 68L, 63L, 38L, 4L, 4L, 4L, 15L, - 15L, 15L, 35L, 23L, 21L, 21L, 29L, 36L, 25L, 30L, 27L, 18L, 41L, - 47L, 48L, 48L, 51L, 58L, 69L, 70L, 38L, 71L, 52L, 52L, 52L, 54L, - 65L, 59L, 65L, 54L, 38L, 38L, 88L, 70L, 2L, 11L, 3L, 11L, 5L, - 11L, 7L, 4L, 15L, 15L, 17L, 34L, 34L, 17L, 45L, 47L, 46L, 47L, - 51L, 45L, 51L, 50L, 52L, 69L, 66L, 70L, 69L, 54L, 59L, 88L, 68L, - 61L, 52L, 60L, 69L, 70L, 4L, 4L, 15L, 15L, 15L, 4L, 11L, 15L, - 8L, 13L, 5L, 36L, 35L, 33L, 34L, 40L, 47L, 56L, 48L, 69L, 71L, - 71L, 61L, 71L, 71L, 69L, 71L, 68L, 69L, 54L, 3L, 3L, 15L, 7L, - 3L, 1L, 1L, 4L, 2L, 1L, 4L, 34L, 34L, 29L, 34L, 34L, 17L, 16L, - 29L, 29L, 44L, 57L, 57L, 40L, 61L, 52L, 52L, 52L, 60L, 59L, 38L, - 61L, 64L, 66L, 64L, 52L, 88L, 63L, 52L, 30L, 34L, 34L, 34L, 23L, - 36L, 19L, 36L, 36L, 11L, 11L, 4L, 15L, 6L, 28L, 28L, 28L, 26L, - 34L, 34L, 34L, 17L, 34L, 30L, 27L, 18L, 25L, 29L, 36L, 9L, 7L, - 15L, 4L, 4L, 4L, 7L, 23L, 23L, 28L, 22L, 30L, 23L, 28L, 31L, - 7L, 4L, 4L, 15L, 15L, 13L, 5L, 4L, 23L, 23L, 23L, 12L, 35L, 23L, - 36L, 28L, 22L, 22L, 30L, 36L, 3L, 5L, 5L, 23L, 23L, 36L, 28L, - 17L, 19L, 5L, 4L, 15L, 23L, 22L, 22L, 19L, 26L, 15L, 15L, 7L, - 11L, 4L, 23L, 19L, 34L, 17L, 17L, 17L, 34L, 25L, 34L, 11L, 11L, - 11L, 8L, 4L, 4L, 4L, 1L, 22L, 25L, 16L, 24L, 3L, 8L, 5L, 4L, - 15L, 15L, 15L, 1L, 3L, 26L, 22L, 31L, 19L, 18L, 18L, 36L, 4L, - 5L, 14L, 11L, 19L, 18L, 17L, 35L, 36L, 36L, 27L, 9L, 11L, 11L, - 3L, 4L, 36L, 36L, 28L, 22L, 37L, 19L, 26L, 29L, 21L, 11L, 11L, - 7L, 4L, 4L, 22L, 22L, 12L, 12L, 37L, 33L, 33L, 7L, 4L, 3L, 3L, - 22L, 37L, 37L, 12L, 25L, 4L, 11L, 7L, 15L, 15L, 1L, 4L, 20L, - 28L, 19L, 36L, 35L, 12L, 22L, 15L, 15L, 4L, 1L, 1L, 36L, 25L, - 16L, 2L, 4L, 15L, 2L, 14L, 36L, 34L, 21L, 21L, 21L, 34L, 16L, - 28L, 34L, 27L, 27L, 14L, 11L, 3L, 5L, 1L, 36L, 36L, 36L, 78L, - 77L, 4L, 13L, 15L, 7L, 2L, 7L, 14L, 76L, 85L, 86L, 86L, 87L, - 82L, 77L, 76L, 86L, 86L, 80L, 80L, 83L, 82L, 78L, 72L, 72L, 78L, - 86L, 14L, 7L, 7L, 5L, 5L, 80L, 74L, 81L, 80L, 75L, 84L, 81L, - 74L, 4L, 13L, 3L, 4L, 11L, 9L, 13L, 87L, 87L, 76L, 81L, 77L, - 15L, 2L, 5L, 3L, 1L, 13L, 8L, 85L, 87L, 75L, 76L, 78L, 78L, 81L, - 86L, 84L, 90L, 82L, 72L, 77L, 85L, 76L, 82L, 87L, 81L, 77L, 84L, - 77L, 75L, 83L, 86L, 83L, 80L, 85L, 87L, 75L, 76L, 8L, 14L, 8L, - 90L, 85L, 84L, 83L, 76L, 81L, 81L, 83L, 8L, 8L, 77L, 90L, 77L, - 77L, 77L, 83L, 90L, 77L, 77L, 83L, 83L, 84L, 90L, 75L, 74L, 74L, - 76L, 11L, 2L, 80L, 81L, 85L, 90L, 77L, 80L, 77L, 83L, 77L, 73L, - 73L, 73L, 73L, 81L, 75L, 80L, 90L, 5L, 11L, 3L, 3L, 77L, 77L, - 84L, 82L, 77L, 82L, 74L, 89L, 74L, 89L, 89L, 79L, 79L, 89L, 89L, - 79L, 79L, 80L, 77L, 80L, 78L, 80L, 80L, 80L, 73L, 86L, 86L, 5L, - 7L, 14L, 7L, 15L, 7L, 14L, 8L, 80L, 81L, 80L, 87L, 87L, 87L, - 87L, 87L, 79L, 81L, 72L, 77L, 74L, 8L, 4L, 14L, 14L, 75L, 75L, - 74L, 74L, 74L, 74L, 74L, 72L, 11L, 3L, 6L, 14L, 7L, 11L, 87L, - 87L, 87L, 86L, 87L, 78L, 76L, 7L, 4L, 14L, 9L, 3L, 5L, 9L, 5L, - 14L, 2L, 72L, 79L, 85L, 73L, 74L, 72L, 86L, 86L, 78L, 5L, 4L, - 6L, 11L, 7L, 7L, 7L, 1L, 4L, 11L, 72L, 84L, 84L, 85L, 81L, 76L, - 81L, 85L, 78L, 78L, 77L, 81L, 80L, 84L, 86L, 90L, 74L, 74L, 72L, - 88L, 62L, 58L, 88L, 88L, 88L, 88L, 62L, 62L, 60L, 38L, 54L, 69L, - 69L, 59L, 59L, 59L, 68L, 87L, 86L, 77L, 84L, 80L, 83L, 81L, 72L, - 74L, 86L, 74L, 59L, 88L, 68L, 66L, 59L, 66L, 69L, 38L, 52L, 60L, - 68L, 59L, 59L, 66L, 60L, 59L, 64L, 74L, 74L, 84L, 85L, 77L, 90L, - 77L, 87L, 74L, 75L, 90L, 69L, 69L, 63L, 63L, 58L, 69L, 69L, 69L, - 69L, 52L, 38L, 71L, 69L, 69L, 74L, 84L, 81L, 85L, 77L, 85L, 76L, - 81L, 49L, 49L, 47L, 48L, 49L, 44L, 44L, 44L, 41L, 54L, 88L, 61L, - 70L, 52L, 54L, 54L, 88L, 64L, 60L, 60L, 69L, 71L, 54L, 68L, 69L, - 62L, 70L, 64L, 86L, 74L, 77L, 75L, 90L, 81L, 81L, 77L, 78L, 44L, - 49L, 49L, 43L, 51L, 50L, 50L, 47L, 47L, 41L, 44L, 44L, 40L, 44L, - 56L, 50L, 64L, 70L, 69L, 68L, 69L, 61L, 63L, 69L, 69L, 69L, 61L, - 64L, 47L, 47L, 47L, 54L, 50L, 50L, 50L, 50L, 51L, 53L, 44L, 45L, - 42L, 56L, 67L, 56L, 56L, 56L, 56L, 56L, 70L, 62L, 62L, 52L, 38L, - 69L, 60L, 54L, 63L, 63L, 53L, 53L, 67L, 67L, 53L, 42L, 53L, 57L, - 45L, 53L, 56L, 53L, 53L, 42L, 57L, 46L, 45L, 69L, 69L, 63L, 62L, - 70L, 88L, 71L, 78L, 76L, 76L, 82L, 78L, 16L, 90L, 84L, 76L, 90L, - 75L, 42L, 53L, 41L, 10L, 57L, 57L, 10L, 57L, 57L, 57L, 10L, 45L, - 50L, 53L, 10L, 57L, 51L, 45L, 53L, 47L, 41L, 90L, 90L, 90L, 77L, - 83L, 85L, 72L, 72L, 85L, 87L, 82L, 76L, 84L, 75L, 72L, 77L, 57L, - 42L, 40L, 45L, 45L, 53L, 57L, 41L, 48L, 10L, 10L, 41L, 46L, 41L, - 51L, 49L, 45L, 45L, 76L, 80L, 80L, 81L, 83L, 80L, 87L, 85L, 86L, - 90L, 90L, 16L, 16L, 75L, 41L, 43L, 43L, 46L, 51L, 43L, 48L, 41L, - 62L, 62L, 69L, 60L, 52L, 54L, 85L, 90L, 90L, 90L, 83L, 77L, 77L, - 83L, 83L, 83L, 83L, 77L, 90L, 90L, 87L, 77L, 90L, 90L, 80L, 80L, - 77L, 82L, 52L, 69L, 38L, 64L, 59L, 69L, 70L, 61L, 69L, 69L, 63L, - 73L, 73L, 73L, 74L, 81L, 90L, 89L, 89L, 89L, 79L, 89L, 89L, 89L, - 79L, 87L, 79L, 79L, 80L, 80L, 79L, 80L, 78L, 80L, 59L, 69L, 64L, - 69L, 69L, 71L, 71L, 61L, 60L, 61L, 61L, 52L, 64L, 60L, 60L, 71L, - 52L, 80L, 80L, 87L, 87L, 87L, 87L, 74L, 74L, 78L, 90L, 87L, 87L, - 74L, 87L, 87L, 87L, 75L, 74L, 80L, 86L, 38L, 69L, 69L, 54L, 38L, - 52L, 38L, 38L, 52L, 38L, 38L, 65L, 70L, 64L, 72L, 87L, 74L, 72L, - 84L, 84L, 81L, 76L, 81L, 76L, 86L, 86L, 74L, 76L, 80L, 80L, 72L, - 74L, 86L, 72L, 70L, 63L, 64L, 58L, 62L, 54L, 88L, 88L, 88L, 88L, - 64L, 88L, 71L, 64L, 62L, 64L, 86L, 86L, 86L, 86L, 86L, 80L, 86L, - 85L, 81L, 85L, 80L, 90L, 83L, 80L, 81L, 81L, 74L, 78L, 71L, 38L, - 70L, 66L, 59L, 66L, 88L, 64L, 70L, 54L, 88L, 65L, 61L, 61L, 38L, - 60L, 87L, 75L, 16L, 83L, 87L, 87L, 87L, 87L, 72L, 74L, 72L, 62L, - 62L, 54L, 66L, 71L, 61L, 60L, 69L, 69L, 62L, 63L, 64L, 84L, 74L, - 87L, 72L, 74L, 84L, 86L, 86L, 80L, 80L, 66L, 63L, 64L, 69L, 70L, - 69L, 64L, 66L, 70L, 69L, 58L, 54L, 69L, 66L, 63L, 69L, 72L, 80L, - 80L, 80L, 84L, 77L, 78L, 17L, 22L, 22L, 18L, 27L, 27L, 27L, 42L, - 55L, 49L, 55L, 69L, 71L, 71L, 90L, 72L, 87L, 87L, 41L, 47L, 67L, - 50L, 51L, 48L, 57L, 57L, 57L, 45L, 46L, 47L, 60L, 70L, 60L, 61L, - 69L, 54L, 65L, 86L, 80L, 80L, 76L, 78L, 83L, 90L, 53L, 49L, 56L, - 57L, 49L, 46L, 45L, 45L, 47L, 47L, 45L, 45L, 41L, 40L, 52L, 64L, - 52L, 64L, 38L, 83L, 83L, 85L, 77L, 83L, 44L, 40L, 10L, 49L, 49L, - 47L, 49L, 49L, 49L, 40L, 44L, 56L, 54L, 44L, 70L, 70L, 54L, 52L, - 64L, 64L, 62L, 64L, 52L, 76L, 76L, 86L, 84L, 90L, 82L, 73L, 46L, - 41L, 40L, 50L, 50L, 50L, 41L, 53L, 44L, 54L, 45L, 55L, 44L, 44L, - 51L, 67L, 45L, 64L, 88L, 88L, 88L, 64L, 65L, 64L, 64L, 62L, 62L, - 76L, 77L, 77L, 80L, 82L, 82L, 79L, 82L, 77L, 45L, 45L, 50L, 51L, - 47L, 48L, 48L, 45L, 56L, 47L, 56L, 56L, 56L, 56L, 56L, 42L, 56L, - 58L, 58L, 58L, 58L, 64L, 62L, 68L, 71L, 62L, 69L, 80L, 80L, 56L, - 56L, 42L, 44L, 50L, 67L, 67L, 67L, 57L, 67L, 56L, 56L, 57L, 57L, - 57L, 10L, 10L, 10L, 57L, 57L, 10L, 46L, 45L, 65L, 84L, 76L, 80L, - 80L, 80L, 79L, 75L, 90L, 85L, 90L, 82L, 74L, 74L, 74L, 89L, 79L, - 53L, 42L, 57L, 10L, 10L, 10L, 49L, 40L, 42L, 47L, 46L, 50L, 53L, - 49L, 88L, 65L, 60L, 54L, 59L, 59L, 59L, 59L, 68L, 69L, 69L, 74L, - 87L, 80L, 90L, 16L, 85L, 89L, 79L, 89L, 82L, 82L, 45L, 53L, 56L, - 43L, 68L, 69L, 69L, 69L, 60L, 66L, 69L, 69L, 82L, 77L, 90L, 87L, - 75L, 74L, 79L, 79L, 74L, 80L, 45L, 55L, 10L, 70L, 65L, 52L, 59L, - 69L, 69L, 75L, 77L, 90L, 82L, 16L, 77L, 75L, 80L, 80L, 74L, 87L, - 87L, 87L, 49L, 53L, 53L, 57L, 59L, 66L, 66L, 66L, 69L, 69L, 69L, - 69L, 62L, 64L, 65L, 69L, 77L, 80L, 77L, 90L, 90L, 80L, 85L, 75L, - 87L, 87L, 51L, 51L, 41L, 69L, 66L, 69L, 66L, 60L, 54L, 38L, 88L, - 61L, 81L, 77L, 77L, 77L, 77L, 80L, 80L, 74L, 51L, 49L, 47L, 40L, - 51L, 70L, 70L, 59L, 52L, 27L, 35L, 36L, 36L, 36L, 25L, 36L, 36L, - 30L, 33L, 16L, 25L, 28L, 36L, 36L, 21L, 35L, 36L, 4L, 5L, 22L, - 35L, 35L, 36L, 34L, 34L, 34L, 3L, 4L, 23L, 19L, 28L, 22L, 22L, - 22L, 24L, 3L, 13L, 7L, 23L, 23L, 23L, 23L, 35L, 19L, 12L, 31L, - 28L, 28L, 34L, 34L, 7L, 2L, 23L, 12L, 12L, 37L, 34L, 34L, 21L, - 36L, 29L, 29L, 27L, 21L, 21L, 34L, 2L, 4L, 2L, 34L, 34L, 36L, - 16L, 36L, 19L, 8L, 8L, 34L, 34L, 34L, 30L, 19L, 22L, 7L, 14L, - 34L, 17L, 35L, 37L, 37L, 1L, 4L, 13L, 21L, 23L, 16L, 35L, 17L, - 36L, 22L, 19L, 17L, 34L, 23L, 30L, 23L, 23L, 23L, 23L, 28L, 36L, - 21L, 25L, 35L, 26L, 22L, 28L, 34L, 34L, 22L, 36L, 24L, 24L, 36L, - 23L, 22L, 17L, 17L, 27L, 24L, 24L, 28L, 28L, 17L, 22L, 22L, 22L, - 19L, 19L, 19L, 17L, 34L, 25L, 29L, 25L, 16L, 30L, 28L, 28L, 22L, - 36L, 36L, 28L, 19L, 19L, 19L, 34L, 36L, 36L, 28L, 19L, 25L, 3L, - 49L, 50L, 50L, 51L, 51L, 40L, 47L, 54L, 70L, 88L, 88L, 88L, 64L, - 88L, 64L, 88L, 88L, 66L, 69L, 69L, 63L, 63L, 63L, 58L, 63L, 80L, - 84L, 84L, 86L, 81L, 85L, 79L, 82L, 74L, 74L, 82L, 87L, 74L, 78L, - 76L, 85L, 77L, 78L, 14L, 14L, 4L, 11L, 8L, 8L, 9L, 1L, 8L, 8L, - 14L, 7L, 11L, 5L, 11L, 8L, 11L, 2L, 3L, 4L, 4L, 7L, 4L, 4L, 15L, - 4L, 9L, 4L, 67L, 42L, 56L, 56L, 56L, 56L, 51L, 56L, 51L, 41L, - 44L, 49L, 56L, 41L, 53L, 46L, 56L, 56L, 50L, 67L, 64L, 54L, 65L, - 65L, 62L, 64L, 58L, 58L, 88L, 69L, 69L, 88L, 69L, 38L, 69L, 69L, - 38L, 85L, 77L, 84L, 77L, 74L, 89L, 79L, 79L, 89L, 89L, 79L, 89L, - 82L, 89L, 87L, 85L, 83L, 82L, 82L, 75L, 78L, 74L, 76L, 74L, 4L, - 3L, 6L, 11L, 5L, 5L, 14L, 8L, 14L, 8L, 13L, 8L, 8L, 13L, 5L, - 2L, 7L, 13L, 2L, 9L, 9L, 11L, 5L, 11L, 5L, 5L, 5L, 11L, 4L, 15L, - 15L, 7L, 7L, 11L, 4L, 8L, 11L, 11L, 7L, 4L, 7L, 15L, 56L, 67L, - 56L, 67L, 67L, 54L, 46L, 67L, 51L, 56L, 40L, 67L, 68L, 62L, 70L, - 65L, 59L, 54L, 54L, 54L, 38L, 38L, 68L, 69L, 88L, 69L, 52L, 70L, - 69L, 59L, 90L, 80L, 75L, 90L, 89L, 89L, 79L, 79L, 75L, 79L, 87L, - 80L, 80L, 74L, 72L, 77L, 76L, 84L, 86L, 77L, 85L, 86L, 78L, 84L, - 84L, 90L, 84L, 84L, 90L, 2L, 2L, 4L, 6L, 13L, 13L, 1L, 3L, 8L, - 8L, 11L, 11L, 13L, 1L, 7L, 14L, 5L, 15L, 5L, 16L, 36L, 19L, 30L, - 27L, 36L, 36L, 21L, 19L, 39L, 39L, 22L, 22L, 67L, 57L, 57L, 57L, - 10L, 57L, 57L, 57L, 77L, 87L, 87L, 84L, 3L, 1L, 13L, 15L, 5L, - 8L, 11L, 8L, 4L, 2L, 4L, 7L, 15L, 15L, 13L, 7L, 15L, 8L, 4L, - 5L, 4L, 15L, 15L, 4L, 4L, 4L, 15L, 15L, 15L, 15L, 15L, 39L, 22L, - 27L, 23L, 19L, 27L, 27L, 18L, 36L, 24L, 22L, 35L, 23L, 37L, 29L, - 57L, 57L, 67L, 51L, 51L, 53L, 53L, 85L, 87L, 85L, 84L, 72L, 87L, - 87L, 75L, 79L, 34L, 24L, 27L, 35L, 35L, 45L, 40L, 41L, 40L, 49L, - 40L, 41L, 51L, 47L, 48L, 44L, 48L, 45L, 57L, 10L, 44L, 53L, 53L, - 7L, 56L, 75L, 81L, 75L, 77L, 83L, 72L, 79L, 55L, 56L, 46L, 45L, - 43L, 51L, 47L, 57L, 67L, 46L, 51L, 10L, 48L, 41L, 46L, 10L, 83L, - 85L, 74L, 87L, 87L, 75L, 74L, 86L, 51L, 44L, 45L, 44L, 49L, 45L, - 53L, 49L, 46L, 57L, 47L, 90L, 87L, 85L, 80L, 75L, 84L, 44L, 46L, - 51L, 46L, 67L, 51L, 44L, 51L, 16L, 16L, 81L, 85L, 72L, 72L, 80L, - 90L, 74L, 74L, 43L, 46L, 43L, 40L, 55L, 48L, 57L, 51L, 63L, 62L, - 64L, 70L, 64L, 61L, 73L, 16L, 84L, 84L, 77L, 77L, 74L, 72L, 85L, - 81L, 85L, 76L, 81L, 44L, 44L, 45L, 51L, 57L, 51L, 51L, 51L, 57L, - 71L, 61L, 54L, 60L, 83L, 84L, 76L, 86L, 86L, 86L, 81L, 43L, 50L, - 50L, 50L, 41L, 57L, 61L, 71L, 63L, 54L, 69L, 61L, 83L, 83L, 90L, - 83L, 90L, 77L, 74L, 86L, 86L, 86L, 51L, 44L, 45L, 41L, 44L, 45L, - 65L, 60L, 88L, 62L, 70L, 70L, 63L, 69L, 69L, 69L, 69L, 63L, 77L, - 74L, 80L, 87L, 87L, 87L, 77L, 77L, 81L, 86L, 82L, 86L, 41L, 40L, - 53L, 46L, 41L, 69L, 63L, 61L, 64L, 69L, 88L, 70L, 52L, 59L, 88L, - 59L, 59L, 62L, 62L, 64L, 88L, 58L, 69L, 69L, 83L, 78L, 76L, 85L, - 77L, 77L, 90L, 75L, 80L, 75L, 90L, 74L, 74L, 72L, 13L, 14L, 5L, - 5L, 2L, 7L, 5L, 7L, 51L, 44L, 51L, 71L, 54L, 52L, 52L, 64L, 60L, - 61L, 61L, 60L, 68L, 68L, 71L, 68L, 59L, 66L, 71L, 71L, 66L, 69L, - 63L, 71L, 64L, 71L, 69L, 80L, 90L, 80L, 82L, 78L, 84L, 76L, 85L, - 86L, 2L, 8L, 2L, 51L, 43L, 71L, 62L, 65L, 64L, 38L, 38L, 65L, - 58L, 38L, 65L, 69L, 63L, 70L, 54L, 59L, 59L, 66L, 66L, 60L, 69L, - 85L, 83L, 75L, 80L, 73L, 79L, 79L, 82L, 77L, 76L, 74L, 78L, 78L, - 90L, 74L, 74L, 87L, 86L, 8L, 5L, 7L, 4L, 4L, 70L, 72L, 82L, 89L, - 80L, 87L, 85L, 87L, 87L, 87L, 83L, 76L, 63L, 69L, 38L, 38L, 81L, - 73L, 90L, 79L, 87L, 75L, 80L, 80L, 80L, 75L, 78L, 80L, 86L, 76L, - 87L, 80L, 90L, 74L, 64L, 65L, 62L, 69L, 16L, 16L, 77L, 77L, 90L, - 90L, 80L, 80L, 80L, 72L, 72L, 78L, 79L, 85L, 74L, 74L, 75L, 65L, - 62L, 58L, 70L, 90L, 72L, 87L, 86L, 85L, 74L, 75L, 75L, 84L, 75L, - 75L, 90L, 87L, 77L, 78L, 85L, 69L, 66L, 66L, 86L, 82L, 74L, 84L, - 90L, 77L, 77L, 59L, 59L, 66L, 59L, 75L, 75L, 84L, 84L, 83L, 83L, - 90L, 66L, 66L, 66L, 66L, 52L, 61L, 82L, 78L, 84L, 85L, 86L, 90L, - 90L, 87L, 90L, 69L, 69L, 58L, 69L, 58L, 63L, 69L, 81L, 86L, 87L, - 76L, 90L, 77L, 69L, 72L, 81L, 69L, 69L, 69L, 54L, 66L, 64L, 64L, - 84L, 87L, 80L, 80L, 80L, 87L, 54L, 71L, 61L, 54L, 80L, 77L, 90L, - 64L, 52L, 64L, 54L, 52L, 77L, 84L, 90L, 85L, 90L, 90L, 77L, 73L, - 87L, 87L, 87L, 87L, 74L, 78L, 84L, 85L, 76L, 69L, 69L, 63L, 88L, - 58L, 70L, 90L, 90L, 80L, 80L, 84L, 84L, 87L, 87L, 87L, 74L, 89L, - 76L, 86L, 87L, 86L, 81L, 90L, 54L, 52L, 71L, 60L, 60L, 16L, 16L, - 81L, 73L, 79L, 79L, 89L, 86L, 86L, 80L, 76L, 76L, 85L, 87L, 75L, - 77L, 55L, 45L, 46L, 46L, 56L, 42L, 46L, 49L, 55L, 70L, 71L, 69L, - 38L, 69L, 4L, 15L, 3L, 13L, 2L, 15L, 2L, 2L, 2L, 2L, 8L, 2L, - 15L, 51L, 44L, 44L, 46L, 46L, 40L, 44L, 43L, 43L, 49L, 50L, 50L, - 55L, 46L, 57L, 60L, 62L, 63L, 69L, 63L, 85L, 85L, 81L, 80L, 80L, - 80L, 84L, 80L, 87L, 85L, 81L, 86L, 85L, 81L, 85L, 86L, 85L, 6L, - 1L, 2L, 4L, 1L, 6L, 3L, 8L, 28L, 27L, 22L, 23L, 23L, 22L, 22L, - 30L, 34L, 22L, 19L, 28L, 36L, 44L, 55L, 45L, 50L, 48L, 57L, 41L, - 49L, 44L, 43L, 40L, 51L, 68L, 61L, 66L, 64L, 61L, 61L, 52L, 7L, - 15L, 4L, 13L, 1L, 14L, 14L, 5L, 26L, 19L, 19L, 31L, 18L, 28L, - 19L, 54L, 44L, 42L, 42L, 42L, 42L, 56L, 56L, 56L, 56L, 56L, 41L, - 41L, 56L, 56L, 40L, 56L, 50L, 57L, 67L, 67L, 77L, 87L, 87L, 83L, - 85L, 74L, 77L, 78L, 74L, 84L, 84L, 84L, 90L, 90L, 86L, 85L, 80L, - 79L, 86L, 87L, 80L, 82L, 75L, 86L, 78L, 2L, 15L, 14L, 8L, 8L, - 8L, 14L, 14L, 8L, 28L, 23L, 26L, 16L, 16L, 33L, 30L, 25L, 28L, - 41L, 40L, 44L, 51L, 51L, 51L, 51L, 48L, 49L, 61L, 61L, 60L, 61L, - 61L, 66L, 59L, 66L, 66L, 69L, 36L, 19L, 22L, 36L, 36L, 23L, 19L, - 28L, 19L, 36L, 22L, 22L, 36L, 36L, 28L, 28L, 28L, 27L, 57L, 57L, - 10L, 53L, 53L, 57L, 57L, 10L, 46L, 45L, 57L, 10L, 10L, 10L, 49L, - 51L, 45L, 67L, 53L, 53L, 41L, 43L, 44L, 85L, 86L, 86L, 86L, 85L, - 77L, 77L, 76L, 86L, 82L, 77L, 2L, 5L, 7L, 1L, 7L, 7L, 7L, 9L, - 14L, 17L, 23L, 35L, 22L, 22L, 22L, 22L, 23L, 22L, 34L, 17L, 35L, - 35L, 21L, 21L, 47L, 53L, 44L, 44L, 44L, 61L, 52L, 52L, 52L, 86L, - 81L, 87L, 72L, 83L, 82L, 84L, 84L, 90L, 76L, 89L, 86L, 81L, 72L, - 75L, 76L, 36L, 23L, 23L, 23L, 28L, 23L, 36L, 12L, 20L, 17L, 23L, - 23L, 22L, 22L, 22L, 22L, 23L, 23L, 23L, 23L, 74L, 86L, 14L, 15L, - 11L, 11L, 11L, 11L, 11L, 6L, 23L, 19L, 19L, 19L, 19L, 19L, 35L, - 28L, 21L, 22L, 22L, 22L, 34L, 44L, 46L, 55L, 56L, 40L, 41L, 60L, - 63L, 69L, 69L, 78L, 80L, 87L, 74L, 80L, 74L, 81L, 90L, 74L, 86L, - 77L, 74L, 76L, 23L, 22L, 22L, 19L, 12L, 22L, 22L, 36L, 30L, 20L, - 33L, 17L, 35L, 35L, 35L, 19L, 86L, 86L, 16L, 82L, 25L, 80L, 74L, - 5L, 5L, 5L, 6L, 11L, 5L, 6L, 5L, 23L, 30L, 17L, 35L, 35L, 35L, - 12L, 19L, 34L, 37L, 36L, 21L, 45L, 42L, 42L, 56L, 53L, 56L, 56L, - 56L, 56L, 38L, 52L, 81L, 77L, 74L, 74L, 84L, 82L, 75L, 86L, 85L, - 72L, 72L, 37L, 12L, 12L, 12L, 12L, 12L, 12L, 12L, 29L, 21L, 34L, - 21L, 21L, 21L, 34L, 34L, 34L, 34L, 34L, 34L, 17L, 17L, 34L, 53L, - 53L, 53L, 40L, 45L, 46L, 53L, 42L, 10L, 48L, 48L, 53L, 10L, 53L, - 45L, 54L, 77L, 77L, 85L, 77L, 72L, 90L, 16L, 75L, 86L, 72L, 81L, - 75L, 90L, 90L, 79L, 90L, 81L, 87L, 72L, 78L, 77L, 80L, 9L, 7L, - 5L, 5L, 9L, 7L, 4L, 4L, 12L, 12L, 37L, 12L, 37L, 12L, 12L, 12L, - 12L, 12L, 30L, 36L, 34L, 21L, 35L, 27L, 18L, 56L, 56L, 56L, 67L, - 53L, 64L, 38L, 64L, 65L, 65L, 86L, 80L, 84L, 76L, 72L, 73L, 76L, - 74L, 16L, 82L, 74L, 17L, 30L, 36L, 36L, 36L, 18L, 34L, 34L, 29L, - 29L, 34L, 34L, 17L, 34L, 17L, 17L, 29L, 54L, 45L, 45L, 49L, 49L, - 41L, 51L, 41L, 41L, 45L, 40L, 40L, 51L, 41L, 53L, 16L, 86L, 73L, - 90L, 72L, 16L, 16L, 82L, 84L, 90L, 77L, 78L, 80L, 81L, 15L, 15L, - 15L, 7L, 11L, 11L, 11L, 21L, 21L, 21L, 34L, 34L, 36L, 19L, 23L, - 34L, 36L, 25L, 53L, 56L, 56L, 56L, 54L, 64L, 64L, 64L, 63L, 63L, - 62L, 54L, 84L, 81L, 79L, 1L, 5L, 3L, 6L, 8L, 2L, 2L, 3L, 4L, - 4L, 7L, 1L, 15L, 34L, 34L, 34L, 34L, 34L, 27L, 29L, 28L, 36L, - 31L, 25L, 36L, 36L, 34L, 42L, 53L, 51L, 48L, 71L, 88L, 62L, 69L, - 38L, 70L, 88L, 62L, 68L, 60L, 77L, 77L, 83L, 77L, 74L, 90L, 74L, - 87L, 74L, 74L, 82L, 11L, 13L, 4L, 7L, 11L, 11L, 11L, 7L, 7L, - 4L, 34L, 34L, 34L, 34L, 17L, 17L, 47L, 45L, 67L, 67L, 57L, 67L, - 53L, 49L, 64L, 64L, 88L, 64L, 88L, 9L, 3L, 7L, 4L, 11L, 2L, 4L, - 3L, 8L, 3L, 3L, 6L, 3L, 11L, 11L, 4L, 27L, 27L, 27L, 30L, 33L, - 33L, 16L, 16L, 34L, 12L, 26L, 16L, 22L, 22L, 22L, 65L, 38L, 63L, - 68L, 71L, 71L, 65L, 61L, 71L, 61L, 61L, 61L, 60L, 60L, 84L, 83L, - 86L, 86L, 84L, 74L, 86L, 77L, 72L, 76L, 81L, 7L, 7L, 4L, 15L, - 15L, 15L, 15L, 17L, 36L, 31L, 36L, 34L, 34L, 34L, 34L, 34L, 34L, - 43L, 46L, 42L, 57L, 51L, 67L, 67L, 53L, 88L, 88L, 88L, 88L, 64L, - 1L, 2L, 5L, 2L, 14L, 2L, 3L, 14L, 14L, 14L, 34L, 36L, 22L, 36L, - 37L, 21L, 27L, 31L, 26L, 22L, 24L, 24L, 24L, 28L, 28L, 27L, 30L, - 30L, 27L, 30L, 30L, 19L, 22L, 34L, 61L, 60L, 52L, 69L, 65L, 65L, - 52L, 52L, 38L, 38L, 38L, 64L, 65L, 63L, 64L, 88L, 77L, 83L, 85L, - 80L, 77L, 81L, 90L, 74L, 74L, 86L, 77L, 5L, 7L, 1L, 5L, 7L, 15L, - 34L, 17L, 17L, 17L, 34L, 34L, 29L, 16L, 43L, 45L, 49L, 41L, 56L, - 10L, 57L, 57L, 57L, 65L, 64L, 62L, 64L, 58L, 2L, 1L, 13L, 1L, - 5L, 5L, 8L, 8L, 8L, 14L, 13L, 8L, 5L, 2L, 2L, 2L, 11L, 13L, 2L, - 33L, 27L, 27L, 30L, 28L, 28L, 30L, 30L, 22L, 17L, 22L, 37L, 17L, - 36L, 36L, 35L, 22L, 19L, 30L, 39L, 22L, 39L, 54L, 54L, 64L, 59L, - 64L, 88L, 52L, 62L, 62L, 62L, 62L, 63L, 88L, 88L, 88L, 88L, 90L, - 77L, 83L, 73L, 82L, 82L, 82L, 84L, 90L, 87L, 77L, 77L, 78L, 7L, - 7L, 4L, 4L, 4L, 4L, 35L, 18L, 27L, 30L, 36L, 36L, 53L, 57L, 57L, - 51L, 10L, 10L, 41L, 41L, 41L, 54L, 45L, 58L, 58L, 62L, 58L, 1L, - 9L, 7L, 4L, 7L, 7L, 13L, 9L, 5L, 3L, 5L, 7L, 1L, 27L, 12L, 19L, - 19L, 19L, 28L, 17L, 27L, 27L, 16L, 27L, 56L, 88L, 88L, 58L, 58L, - 52L, 52L, 59L, 59L, 68L, 68L, 68L, 69L, 61L, 64L, 59L, 79L, 82L, - 83L, 89L, 89L, 89L, 74L, 89L, 89L, 89L, 89L, 86L, 81L, 81L, 85L, - 83L, 84L, 81L, 4L, 15L, 5L, 4L, 7L, 4L, 3L, 17L, 37L, 18L, 49L, - 10L, 57L, 57L, 10L, 47L, 53L, 46L, 51L, 41L, 58L, 1L, 7L, 7L, - 7L, 2L, 4L, 14L, 11L, 5L, 6L, 5L, 4L, 5L, 5L, 7L, 5L, 55L, 55L, - 49L, 40L, 45L, 43L, 45L, 69L, 59L, 54L, 66L, 69L, 66L, 66L, 69L, - 66L, 66L, 66L, 66L, 69L, 61L, 80L, 80L, 80L, 80L, 80L, 80L, 80L, - 81L, 87L, 77L, 81L, 90L, 86L, 15L, 3L, 6L, 7L, 2L, 2L, 3L, 3L, - 3L, 4L, 4L, 3L, 2L, 2L, 2L, 35L, 35L, 20L, 22L, 37L, 47L, 42L, - 67L, 57L, 40L, 47L, 55L, 67L, 67L, 67L, 45L, 51L, 59L, 63L, 38L, - 38L, 61L, 54L, 68L, 52L, 52L, 54L, 5L, 7L, 9L, 4L, 7L, 11L, 11L, - 13L, 11L, 4L, 1L, 5L, 7L, 7L, 7L, 11L, 11L, 11L, 51L, 40L, 46L, - 57L, 57L, 10L, 53L, 40L, 43L, 41L, 64L, 66L, 69L, 69L, 69L, 69L, - 69L, 69L, 69L, 69L, 69L, 70L, 54L, 70L, 69L, 87L, 87L, 87L, 87L, - 87L, 87L, 74L, 79L, 85L, 75L, 3L, 9L, 4L, 7L, 14L, 2L, 3L, 4L, - 13L, 25L, 21L, 31L, 28L, 22L, 26L, 22L, 34L, 36L, 22L, 47L, 40L, - 41L, 45L, 57L, 10L, 41L, 40L, 45L, 46L, 53L, 49L, 88L, 70L, 52L, - 70L, 52L, 54L, 59L, 4L, 7L, 7L, 4L, 15L, 15L, 15L, 15L, 15L, - 15L, 1L, 14L, 4L, 15L, 14L, 41L, 43L, 40L, 44L, 44L, 57L, 46L, - 54L, 40L, 44L, 47L, 40L, 54L, 40L, 38L, 88L, 69L, 38L, 88L, 61L, - 88L, 59L, 52L, 70L, 61L, 61L, 70L, 61L, 63L, 65L, 70L, 87L, 87L, - 75L, 74L, 6L, 4L, 1L, 36L, 36L, 19L, 19L, 19L, 37L, 34L, 30L, - 25L, 17L, 45L, 53L, 51L, 57L, 49L, 67L, 57L, 45L, 57L, 53L, 46L, - 63L, 69L, 69L, 69L, 59L, 68L, 59L, 38L, 63L, 60L, 7L, 9L, 15L, - 7L, 15L, 15L, 15L, 4L, 15L, 15L, 8L, 5L, 14L, 13L, 3L, 4L, 4L, - 3L, 1L, 40L, 44L, 44L, 54L, 41L, 49L, 50L, 50L, 50L, 41L, 41L, - 41L, 47L, 44L, 41L, 49L, 63L, 69L, 65L, 70L, 70L, 62L, 62L, 65L, - 54L, 61L, 78L, 72L, 78L, 72L, 87L, 72L, 74L, 78L, 84L, 84L, 84L, - 4L, 4L, 4L, 5L, 4L, 3L, 7L, 3L, 2L, 4L, 5L, 7L, 13L, 13L, 36L, - 36L, 36L, 28L, 22L, 25L, 22L, 24L, 29L, 29L, 30L, 18L, 28L, 49L, - 49L) - + + expected <- c( + 64L, 69L, 66L, 66L, 69L, 70L, 70L, 69L, 63L, 68L, 38L, 54L, + 62L, 54L, 71L, 38L, 52L, 52L, 82L, 79L, 73L, 81L, 87L, 76L, 77L, + 74L, 80L, 79L, 89L, 2L, 5L, 4L, 3L, 7L, 5L, 5L, 2L, 4L, 4L, 4L, + 14L, 2L, 36L, 24L, 30L, 27L, 22L, 36L, 36L, 19L, 34L, 49L, 44L, + 56L, 49L, 40L, 28L, 28L, 23L, 34L, 30L, 36L, 12L, 33L, 22L, 23L, + 23L, 23L, 23L, 35L, 22L, 22L, 22L, 22L, 22L, 67L, 51L, 51L, 49L, + 43L, 10L, 53L, 53L, 45L, 55L, 55L, 53L, 43L, 51L, 57L, 90L, 90L, + 90L, 80L, 77L, 82L, 73L, 82L, 73L, 82L, 77L, 76L, 77L, 72L, 79L, + 79L, 79L, 82L, 79L, 87L, 79L, 80L, 1L, 2L, 6L, 1L, 4L, 4L, 2L, + 5L, 5L, 5L, 18L, 25L, 18L, 51L, 10L, 40L, 53L, 40L, 41L, 41L, + 67L, 41L, 43L, 10L, 52L, 68L, 88L, 70L, 65L, 52L, 64L, 64L, 63L, + 54L, 69L, 70L, 70L, 58L, 69L, 64L, 54L, 69L, 58L, 89L, 79L, 87L, + 87L, 87L, 87L, 87L, 2L, 3L, 7L, 13L, 3L, 3L, 6L, 11L, 11L, 4L, + 4L, 2L, 1L, 6L, 1L, 3L, 1L, 1L, 43L, 49L, 48L, 46L, 46L, 43L, + 54L, 43L, 10L, 41L, 48L, 22L, 23L, 19L, 28L, 23L, 27L, 30L, 35L, + 35L, 35L, 35L, 35L, 19L, 19L, 19L, 19L, 12L, 37L, 12L, 57L, 51L, + 51L, 46L, 51L, 44L, 43L, 56L, 56L, 10L, 51L, 51L, 48L, 41L, 51L, + 80L, 80L, 80L, 80L, 80L, 77L, 80L, 87L, 87L, 87L, 87L, 87L, 87L, + 87L, 86L, 79L, 82L, 74L, 74L, 36L, 28L, 19L, 27L, 36L, 36L, 26L, + 23L, 23L, 23L, 21L, 27L, 19L, 35L, 29L, 36L, 23L, 20L, 20L, 38L, + 88L, 69L, 52L, 69L, 70L, 69L, 68L, 54L, 38L, 65L, 54L, 59L, 88L, + 89L, 79L, 79L, 79L, 79L, 76L, 79L, 72L, 5L, 4L, 1L, 2L, 5L, 7L, + 8L, 1L, 8L, 8L, 8L, 8L, 5L, 3L, 14L, 8L, 14L, 44L, 57L, 67L, + 57L, 42L, 57L, 40L, 40L, 43L, 40L, 49L, 49L, 46L, 54L, 45L, 12L, + 12L, 29L, 12L, 21L, 21L, 21L, 21L, 21L, 21L, 21L, 34L, 34L, 34L, + 34L, 34L, 34L, 17L, 34L, 51L, 47L, 51L, 41L, 44L, 71L, 62L, 63L, + 61L, 61L, 69L, 62L, 69L, 62L, 69L, 69L, 87L, 87L, 75L, 72L, 72L, + 76L, 74L, 72L, 72L, 75L, 79L, 90L, 72L, 78L, 78L, 35L, 30L, 26L, + 30L, 23L, 23L, 35L, 26L, 22L, 22L, 22L, 23L, 23L, 61L, 52L, 54L, + 64L, 60L, 61L, 71L, 61L, 69L, 52L, 61L, 60L, 52L, 60L, 71L, 70L, + 69L, 60L, 54L, 70L, 63L, 70L, 64L, 54L, 61L, 60L, 85L, 80L, 87L, + 80L, 80L, 80L, 77L, 80L, 81L, 76L, 87L, 77L, 14L, 13L, 5L, 8L, + 2L, 2L, 2L, 2L, 11L, 7L, 14L, 11L, 4L, 11L, 2L, 2L, 7L, 5L, 7L, + 11L, 8L, 7L, 7L, 4L, 82L, 80L, 80L, 85L, 87L, 77L, 86L, 16L, + 86L, 74L, 81L, 17L, 17L, 28L, 36L, 36L, 12L, 18L, 18L, 34L, 34L, + 17L, 34L, 29L, 16L, 16L, 18L, 21L, 28L, 36L, 63L, 69L, 69L, 64L, + 65L, 70L, 38L, 52L, 70L, 62L, 72L, 81L, 81L, 81L, 85L, 81L, 76L, + 86L, 79L, 80L, 86L, 86L, 81L, 35L, 22L, 12L, 19L, 19L, 19L, 12L, + 34L, 35L, 35L, 16L, 18L, 36L, 35L, 58L, 88L, 64L, 75L, 87L, 87L, + 87L, 76L, 74L, 90L, 77L, 76L, 81L, 81L, 77L, 84L, 86L, 90L, 16L, + 28L, 36L, 36L, 27L, 30L, 33L, 31L, 16L, 16L, 16L, 36L, 35L, 36L, + 34L, 19L, 62L, 62L, 68L, 71L, 61L, 61L, 61L, 61L, 60L, 59L, 65L, + 66L, 69L, 85L, 86L, 82L, 77L, 77L, 86L, 84L, 76L, 86L, 12L, 12L, + 12L, 12L, 12L, 12L, 12L, 12L, 30L, 21L, 21L, 34L, 34L, 34L, 34L, + 34L, 34L, 17L, 17L, 29L, 36L, 33L, 28L, 34L, 34L, 34L, 88L, 64L, + 88L, 65L, 64L, 62L, 58L, 76L, 87L, 84L, 83L, 80L, 13L, 13L, 4L, + 2L, 5L, 11L, 14L, 5L, 5L, 7L, 4L, 8L, 5L, 13L, 7L, 7L, 4L, 9L, + 85L, 78L, 78L, 81L, 75L, 83L, 90L, 84L, 86L, 21L, 36L, 34L, 18L, + 36L, 22L, 36L, 24L, 29L, 31L, 19L, 16L, 16L, 24L, 36L, 18L, 36L, + 64L, 54L, 52L, 64L, 52L, 64L, 38L, 64L, 38L, 54L, 65L, 60L, 60L, + 60L, 84L, 78L, 80L, 79L, 81L, 90L, 84L, 83L, 79L, 79L, 77L, 76L, + 72L, 74L, 86L, 72L, 74L, 73L, 34L, 34L, 34L, 34L, 34L, 17L, 17L, + 17L, 29L, 16L, 19L, 29L, 27L, 27L, 30L, 16L, 16L, 64L, 62L, 58L, + 88L, 72L, 77L, 72L, 72L, 74L, 4L, 7L, 9L, 15L, 4L, 11L, 7L, 7L, + 11L, 6L, 13L, 11L, 5L, 11L, 7L, 7L, 7L, 4L, 15L, 15L, 15L, 1L, + 4L, 15L, 5L, 5L, 13L, 6L, 14L, 3L, 4L, 4L, 2L, 7L, 4L, 4L, 4L, + 4L, 1L, 21L, 36L, 37L, 36L, 29L, 23L, 22L, 37L, 25L, 90L, 30L, + 25L, 19L, 37L, 34L, 17L, 22L, 12L, 52L, 63L, 62L, 64L, 62L, 58L, + 88L, 88L, 64L, 88L, 65L, 71L, 61L, 64L, 74L, 74L, 75L, 16L, 77L, + 83L, 84L, 87L, 85L, 77L, 86L, 74L, 73L, 76L, 86L, 36L, 25L, 25L, + 22L, 12L, 36L, 16L, 16L, 36L, 27L, 34L, 23L, 34L, 37L, 16L, 22L, + 23L, 27L, 19L, 22L, 58L, 65L, 65L, 87L, 84L, 76L, 85L, 77L, 80L, + 74L, 72L, 84L, 81L, 85L, 5L, 11L, 4L, 4L, 4L, 15L, 15L, 4L, 4L, + 15L, 4L, 8L, 9L, 4L, 1L, 1L, 4L, 4L, 1L, 15L, 15L, 4L, 11L, 2L, + 4L, 4L, 11L, 2L, 11L, 14L, 3L, 3L, 5L, 11L, 4L, 4L, 15L, 27L, + 30L, 19L, 22L, 22L, 22L, 39L, 22L, 30L, 34L, 35L, 34L, 21L, 18L, + 36L, 36L, 36L, 58L, 58L, 88L, 88L, 38L, 38L, 69L, 70L, 59L, 68L, + 69L, 64L, 64L, 68L, 69L, 66L, 66L, 66L, 69L, 66L, 78L, 86L, 78L, + 85L, 75L, 82L, 73L, 84L, 79L, 84L, 77L, 34L, 34L, 16L, 36L, 36L, + 28L, 24L, 36L, 34L, 34L, 17L, 17L, 31L, 32L, 19L, 30L, 24L, 19L, + 54L, 64L, 88L, 69L, 69L, 59L, 59L, 68L, 90L, 90L, 74L, 75L, 76L, + 85L, 1L, 4L, 1L, 4L, 3L, 13L, 9L, 1L, 5L, 7L, 15L, 4L, 1L, 13L, + 19L, 36L, 36L, 36L, 19L, 4L, 5L, 5L, 15L, 5L, 5L, 8L, 2L, 4L, + 3L, 1L, 3L, 11L, 11L, 4L, 13L, 1L, 36L, 36L, 28L, 27L, 27L, 27L, + 18L, 55L, 56L, 40L, 57L, 57L, 38L, 64L, 58L, 60L, 59L, 66L, 61L, + 38L, 65L, 52L, 70L, 66L, 69L, 69L, 69L, 69L, 69L, 69L, 77L, 90L, + 90L, 14L, 14L, 8L, 2L, 2L, 2L, 4L, 15L, 15L, 4L, 4L, 4L, 4L, + 34L, 18L, 34L, 28L, 22L, 19L, 30L, 30L, 22L, 39L, 22L, 22L, 30L, + 26L, 26L, 35L, 36L, 36L, 35L, 68L, 66L, 62L, 90L, 87L, 90L, 77L, + 87L, 80L, 90L, 86L, 79L, 80L, 84L, 81L, 79L, 36L, 22L, 22L, 22L, + 28L, 36L, 28L, 28L, 28L, 28L, 28L, 23L, 23L, 23L, 34L, 26L, 30L, + 28L, 19L, 19L, 2L, 14L, 1L, 14L, 4L, 5L, 9L, 1L, 1L, 1L, 1L, + 46L, 49L, 55L, 54L, 55L, 48L, 46L, 51L, 44L, 46L, 67L, 58L, 69L, + 69L, 69L, 69L, 69L, 69L, 69L, 69L, 69L, 69L, 52L, 60L, 69L, 38L, + 9L, 4L, 4L, 1L, 3L, 5L, 7L, 6L, 11L, 4L, 5L, 5L, 2L, 14L, 14L, + 32L, 3L, 2L, 14L, 82L, 21L, 35L, 36L, 31L, 29L, 24L, 23L, 16L, + 45L, 47L, 57L, 57L, 53L, 57L, 10L, 46L, 49L, 56L, 58L, 66L, 66L, + 66L, 69L, 66L, 66L, 77L, 78L, 83L, 87L, 80L, 80L, 77L, 81L, 81L, + 81L, 81L, 80L, 87L, 17L, 23L, 23L, 23L, 23L, 22L, 22L, 22L, 23L, + 23L, 23L, 19L, 23L, 19L, 19L, 19L, 36L, 26L, 36L, 30L, 35L, 35L, + 1L, 6L, 3L, 8L, 8L, 14L, 2L, 5L, 14L, 2L, 5L, 9L, 15L, 67L, 57L, + 40L, 57L, 57L, 48L, 43L, 44L, 41L, 47L, 41L, 49L, 41L, 41L, 40L, + 57L, 47L, 63L, 38L, 52L, 71L, 61L, 64L, 88L, 68L, 61L, 54L, 69L, + 59L, 68L, 88L, 69L, 69L, 58L, 59L, 71L, 71L, 2L, 2L, 3L, 14L, + 14L, 3L, 2L, 8L, 9L, 5L, 2L, 5L, 5L, 1L, 1L, 8L, 8L, 46L, 56L, + 57L, 57L, 67L, 43L, 57L, 46L, 49L, 67L, 47L, 47L, 43L, 40L, 45L, + 44L, 47L, 45L, 68L, 62L, 62L, 59L, 85L, 90L, 85L, 90L, 90L, 90L, + 16L, 90L, 85L, 16L, 90L, 82L, 85L, 86L, 77L, 87L, 85L, 85L, 79L, + 35L, 35L, 19L, 12L, 12L, 12L, 12L, 37L, 12L, 12L, 12L, 29L, 29L, + 16L, 36L, 30L, 21L, 21L, 34L, 8L, 7L, 14L, 11L, 5L, 1L, 7L, 1L, + 11L, 6L, 7L, 5L, 9L, 9L, 2L, 3L, 4L, 11L, 4L, 2L, 7L, 4L, 4L, + 49L, 40L, 43L, 43L, 49L, 49L, 46L, 46L, 49L, 45L, 45L, 54L, 61L, + 52L, 60L, 52L, 71L, 61L, 63L, 69L, 63L, 62L, 70L, 54L, 70L, 1L, + 3L, 8L, 8L, 8L, 8L, 14L, 14L, 14L, 5L, 5L, 2L, 14L, 14L, 9L, + 11L, 10L, 47L, 49L, 43L, 43L, 49L, 40L, 44L, 44L, 54L, 49L, 49L, + 41L, 51L, 43L, 59L, 68L, 90L, 84L, 77L, 83L, 83L, 83L, 80L, 87L, + 87L, 87L, 86L, 83L, 74L, 81L, 80L, 87L, 83L, 74L, 76L, 78L, 74L, + 81L, 73L, 86L, 87L, 86L, 86L, 74L, 82L, 80L, 72L, 21L, 21L, 21L, + 34L, 34L, 34L, 34L, 34L, 34L, 34L, 34L, 17L, 17L, 17L, 17L, 29L, + 18L, 34L, 34L, 34L, 34L, 17L, 4L, 9L, 15L, 15L, 15L, 7L, 7L, + 11L, 11L, 1L, 13L, 7L, 5L, 7L, 11L, 11L, 11L, 7L, 7L, 7L, 11L, + 40L, 50L, 44L, 47L, 44L, 46L, 46L, 48L, 48L, 43L, 44L, 56L, 50L, + 51L, 56L, 55L, 64L, 54L, 63L, 63L, 63L, 52L, 38L, 58L, 85L, 75L, + 75L, 75L, 76L, 83L, 84L, 2L, 5L, 14L, 7L, 7L, 7L, 1L, 8L, 11L, + 5L, 7L, 5L, 4L, 11L, 5L, 6L, 7L, 11L, 5L, 41L, 47L, 46L, 54L, + 42L, 55L, 42L, 43L, 50L, 50L, 48L, 48L, 53L, 54L, 54L, 68L, 69L, + 69L, 69L, 63L, 63L, 58L, 69L, 90L, 77L, 77L, 77L, 90L, 90L, 77L, + 74L, 84L, 90L, 77L, 77L, 74L, 78L, 81L, 81L, 86L, 85L, 29L, 29L, + 34L, 34L, 16L, 16L, 16L, 29L, 36L, 16L, 36L, 27L, 31L, 31L, 32L, + 19L, 27L, 36L, 36L, 15L, 15L, 1L, 4L, 5L, 15L, 15L, 4L, 15L, + 15L, 15L, 4L, 4L, 15L, 4L, 4L, 15L, 8L, 55L, 55L, 44L, 45L, 42L, + 42L, 42L, 45L, 56L, 56L, 56L, 56L, 56L, 42L, 56L, 51L, 67L, 86L, + 76L, 86L, 80L, 74L, 90L, 85L, 83L, 79L, 79L, 84L, 80L, 9L, 7L, + 13L, 4L, 7L, 4L, 4L, 9L, 9L, 9L, 15L, 11L, 7L, 11L, 1L, 13L, + 13L, 7L, 5L, 7L, 7L, 67L, 42L, 42L, 45L, 56L, 56L, 56L, 56L, + 56L, 56L, 56L, 67L, 56L, 56L, 51L, 56L, 55L, 57L, 57L, 51L, 69L, + 38L, 65L, 70L, 65L, 63L, 63L, 69L, 84L, 73L, 73L, 73L, 79L, 78L, + 78L, 85L, 85L, 78L, 74L, 80L, 82L, 78L, 86L, 81L, 77L, 85L, 16L, + 37L, 22L, 34L, 31L, 34L, 28L, 24L, 36L, 18L, 27L, 27L, 30L, 27L, + 27L, 27L, 36L, 22L, 22L, 34L, 22L, 34L, 9L, 14L, 1L, 4L, 4L, + 3L, 3L, 6L, 1L, 1L, 1L, 2L, 2L, 2L, 14L, 3L, 5L, 51L, 41L, 56L, + 40L, 45L, 45L, 44L, 67L, 67L, 56L, 57L, 57L, 57L, 67L, 51L, 49L, + 46L, 55L, 67L, 67L, 53L, 67L, 74L, 77L, 87L, 74L, 75L, 87L, 90L, + 90L, 90L, 90L, 75L, 85L, 85L, 4L, 11L, 11L, 4L, 7L, 4L, 7L, 4L, + 7L, 7L, 7L, 4L, 15L, 15L, 13L, 9L, 4L, 11L, 15L, 4L, 4L, 15L, + 15L, 42L, 57L, 54L, 54L, 45L, 50L, 56L, 57L, 67L, 57L, 40L, 67L, + 57L, 57L, 10L, 57L, 57L, 57L, 53L, 55L, 42L, 10L, 10L, 42L, 71L, + 38L, 65L, 65L, 70L, 69L, 69L, 61L, 52L, 65L, 54L, 52L, 54L, 38L, + 69L, 68L, 61L, 59L, 82L, 82L, 82L, 80L, 84L, 90L, 87L, 82L, 13L, + 14L, 11L, 2L, 9L, 4L, 2L, 4L, 4L, 4L, 2L, 29L, 28L, 30L, 23L, + 18L, 16L, 24L, 35L, 22L, 21L, 39L, 39L, 19L, 12L, 36L, 36L, 36L, + 21L, 5L, 14L, 4L, 18L, 23L, 36L, 36L, 36L, 36L, 16L, 17L, 36L, + 39L, 36L, 36L, 51L, 57L, 57L, 10L, 10L, 57L, 57L, 57L, 57L, 57L, + 51L, 51L, 49L, 57L, 10L, 41L, 45L, 67L, 10L, 48L, 10L, 49L, 56L, + 79L, 85L, 80L, 80L, 77L, 84L, 90L, 77L, 77L, 77L, 83L, 83L, 83L, + 90L, 90L, 87L, 84L, 90L, 90L, 90L, 4L, 15L, 4L, 1L, 14L, 4L, + 9L, 3L, 7L, 7L, 4L, 5L, 2L, 6L, 5L, 5L, 53L, 41L, 40L, 46L, 51L, + 45L, 51L, 53L, 42L, 46L, 10L, 67L, 49L, 49L, 47L, 55L, 49L, 40L, + 46L, 9L, 15L, 4L, 3L, 36L, 36L, 22L, 36L, 22L, 22L, 16L, 29L, + 31L, 16L, 16L, 30L, 40L, 46L, 49L, 56L, 55L, 48L, 46L, 65L, 69L, + 38L, 38L, 3L, 2L, 7L, 7L, 5L, 7L, 4L, 4L, 22L, 36L, 36L, 22L, + 23L, 23L, 25L, 26L, 22L, 49L, 57L, 51L, 51L, 46L, 48L, 67L, 42L, + 63L, 61L, 62L, 88L, 71L, 5L, 15L, 3L, 3L, 7L, 3L, 2L, 14L, 9L, + 4L, 4L, 3L, 23L, 23L, 23L, 34L, 23L, 19L, 17L, 23L, 36L, 27L, + 27L, 55L, 41L, 44L, 41L, 47L, 47L, 57L, 56L, 56L, 56L, 56L, 56L, + 56L, 51L, 51L, 54L, 70L, 60L, 59L, 69L, 52L, 88L, 78L, 75L, 3L, + 3L, 14L, 2L, 2L, 4L, 14L, 3L, 13L, 13L, 13L, 5L, 4L, 6L, 13L, + 1L, 20L, 30L, 32L, 23L, 23L, 36L, 28L, 12L, 23L, 39L, 17L, 19L, + 45L, 49L, 44L, 46L, 50L, 57L, 57L, 51L, 69L, 66L, 38L, 59L, 59L, + 66L, 64L, 1L, 4L, 8L, 1L, 13L, 13L, 8L, 8L, 8L, 13L, 13L, 8L, + 14L, 8L, 8L, 5L, 8L, 8L, 23L, 22L, 30L, 26L, 22L, 22L, 23L, 23L, + 23L, 34L, 25L, 29L, 16L, 24L, 24L, 54L, 51L, 45L, 42L, 50L, 56L, + 56L, 67L, 56L, 40L, 57L, 52L, 54L, 38L, 60L, 69L, 66L, 66L, 66L, + 60L, 38L, 54L, 70L, 9L, 7L, 1L, 4L, 11L, 15L, 7L, 4L, 7L, 11L, + 5L, 4L, 35L, 19L, 20L, 24L, 24L, 36L, 36L, 28L, 24L, 24L, 27L, + 51L, 49L, 55L, 46L, 51L, 57L, 57L, 57L, 57L, 57L, 10L, 51L, 57L, + 51L, 52L, 65L, 19L, 39L, 21L, 22L, 27L, 22L, 30L, 22L, 36L, 17L, + 36L, 19L, 49L, 49L, 67L, 42L, 48L, 45L, 57L, 53L, 51L, 41L, 47L, + 44L, 53L, 41L, 45L, 44L, 42L, 10L, 55L, 46L, 45L, 57L, 64L, 65L, + 54L, 62L, 62L, 66L, 66L, 16L, 36L, 36L, 12L, 34L, 22L, 18L, 30L, + 55L, 40L, 51L, 47L, 47L, 43L, 53L, 53L, 53L, 40L, 10L, 70L, 64L, + 58L, 66L, 66L, 68L, 70L, 60L, 59L, 68L, 22L, 22L, 34L, 16L, 30L, + 18L, 51L, 56L, 49L, 42L, 53L, 51L, 53L, 53L, 50L, 56L, 40L, 54L, + 54L, 69L, 61L, 7L, 36L, 23L, 35L, 12L, 21L, 16L, 36L, 26L, 30L, + 39L, 22L, 40L, 44L, 10L, 51L, 43L, 56L, 51L, 65L, 64L, 62L, 62L, + 88L, 69L, 63L, 58L, 69L, 60L, 64L, 62L, 11L, 5L, 5L, 11L, 9L, + 5L, 4L, 11L, 11L, 7L, 7L, 7L, 7L, 11L, 11L, 11L, 11L, 19L, 19L, + 12L, 12L, 12L, 12L, 37L, 12L, 22L, 22L, 19L, 27L, 24L, 24L, 19L, + 43L, 50L, 50L, 40L, 53L, 54L, 56L, 55L, 46L, 41L, 10L, 88L, 88L, + 88L, 59L, 69L, 69L, 69L, 62L, 8L, 8L, 8L, 11L, 8L, 7L, 1L, 11L, + 11L, 11L, 7L, 7L, 12L, 37L, 29L, 29L, 29L, 28L, 21L, 35L, 35L, + 36L, 50L, 51L, 40L, 44L, 44L, 54L, 58L, 61L, 52L, 88L, 59L, 38L, + 68L, 68L, 69L, 69L, 60L, 61L, 68L, 63L, 38L, 4L, 4L, 4L, 15L, + 15L, 15L, 35L, 23L, 21L, 21L, 29L, 36L, 25L, 30L, 27L, 18L, 41L, + 47L, 48L, 48L, 51L, 58L, 69L, 70L, 38L, 71L, 52L, 52L, 52L, 54L, + 65L, 59L, 65L, 54L, 38L, 38L, 88L, 70L, 2L, 11L, 3L, 11L, 5L, + 11L, 7L, 4L, 15L, 15L, 17L, 34L, 34L, 17L, 45L, 47L, 46L, 47L, + 51L, 45L, 51L, 50L, 52L, 69L, 66L, 70L, 69L, 54L, 59L, 88L, 68L, + 61L, 52L, 60L, 69L, 70L, 4L, 4L, 15L, 15L, 15L, 4L, 11L, 15L, + 8L, 13L, 5L, 36L, 35L, 33L, 34L, 40L, 47L, 56L, 48L, 69L, 71L, + 71L, 61L, 71L, 71L, 69L, 71L, 68L, 69L, 54L, 3L, 3L, 15L, 7L, + 3L, 1L, 1L, 4L, 2L, 1L, 4L, 34L, 34L, 29L, 34L, 34L, 17L, 16L, + 29L, 29L, 44L, 57L, 57L, 40L, 61L, 52L, 52L, 52L, 60L, 59L, 38L, + 61L, 64L, 66L, 64L, 52L, 88L, 63L, 52L, 30L, 34L, 34L, 34L, 23L, + 36L, 19L, 36L, 36L, 11L, 11L, 4L, 15L, 6L, 28L, 28L, 28L, 26L, + 34L, 34L, 34L, 17L, 34L, 30L, 27L, 18L, 25L, 29L, 36L, 9L, 7L, + 15L, 4L, 4L, 4L, 7L, 23L, 23L, 28L, 22L, 30L, 23L, 28L, 31L, + 7L, 4L, 4L, 15L, 15L, 13L, 5L, 4L, 23L, 23L, 23L, 12L, 35L, 23L, + 36L, 28L, 22L, 22L, 30L, 36L, 3L, 5L, 5L, 23L, 23L, 36L, 28L, + 17L, 19L, 5L, 4L, 15L, 23L, 22L, 22L, 19L, 26L, 15L, 15L, 7L, + 11L, 4L, 23L, 19L, 34L, 17L, 17L, 17L, 34L, 25L, 34L, 11L, 11L, + 11L, 8L, 4L, 4L, 4L, 1L, 22L, 25L, 16L, 24L, 3L, 8L, 5L, 4L, + 15L, 15L, 15L, 1L, 3L, 26L, 22L, 31L, 19L, 18L, 18L, 36L, 4L, + 5L, 14L, 11L, 19L, 18L, 17L, 35L, 36L, 36L, 27L, 9L, 11L, 11L, + 3L, 4L, 36L, 36L, 28L, 22L, 37L, 19L, 26L, 29L, 21L, 11L, 11L, + 7L, 4L, 4L, 22L, 22L, 12L, 12L, 37L, 33L, 33L, 7L, 4L, 3L, 3L, + 22L, 37L, 37L, 12L, 25L, 4L, 11L, 7L, 15L, 15L, 1L, 4L, 20L, + 28L, 19L, 36L, 35L, 12L, 22L, 15L, 15L, 4L, 1L, 1L, 36L, 25L, + 16L, 2L, 4L, 15L, 2L, 14L, 36L, 34L, 21L, 21L, 21L, 34L, 16L, + 28L, 34L, 27L, 27L, 14L, 11L, 3L, 5L, 1L, 36L, 36L, 36L, 78L, + 77L, 4L, 13L, 15L, 7L, 2L, 7L, 14L, 76L, 85L, 86L, 86L, 87L, + 82L, 77L, 76L, 86L, 86L, 80L, 80L, 83L, 82L, 78L, 72L, 72L, 78L, + 86L, 14L, 7L, 7L, 5L, 5L, 80L, 74L, 81L, 80L, 75L, 84L, 81L, + 74L, 4L, 13L, 3L, 4L, 11L, 9L, 13L, 87L, 87L, 76L, 81L, 77L, + 15L, 2L, 5L, 3L, 1L, 13L, 8L, 85L, 87L, 75L, 76L, 78L, 78L, 81L, + 86L, 84L, 90L, 82L, 72L, 77L, 85L, 76L, 82L, 87L, 81L, 77L, 84L, + 77L, 75L, 83L, 86L, 83L, 80L, 85L, 87L, 75L, 76L, 8L, 14L, 8L, + 90L, 85L, 84L, 83L, 76L, 81L, 81L, 83L, 8L, 8L, 77L, 90L, 77L, + 77L, 77L, 83L, 90L, 77L, 77L, 83L, 83L, 84L, 90L, 75L, 74L, 74L, + 76L, 11L, 2L, 80L, 81L, 85L, 90L, 77L, 80L, 77L, 83L, 77L, 73L, + 73L, 73L, 73L, 81L, 75L, 80L, 90L, 5L, 11L, 3L, 3L, 77L, 77L, + 84L, 82L, 77L, 82L, 74L, 89L, 74L, 89L, 89L, 79L, 79L, 89L, 89L, + 79L, 79L, 80L, 77L, 80L, 78L, 80L, 80L, 80L, 73L, 86L, 86L, 5L, + 7L, 14L, 7L, 15L, 7L, 14L, 8L, 80L, 81L, 80L, 87L, 87L, 87L, + 87L, 87L, 79L, 81L, 72L, 77L, 74L, 8L, 4L, 14L, 14L, 75L, 75L, + 74L, 74L, 74L, 74L, 74L, 72L, 11L, 3L, 6L, 14L, 7L, 11L, 87L, + 87L, 87L, 86L, 87L, 78L, 76L, 7L, 4L, 14L, 9L, 3L, 5L, 9L, 5L, + 14L, 2L, 72L, 79L, 85L, 73L, 74L, 72L, 86L, 86L, 78L, 5L, 4L, + 6L, 11L, 7L, 7L, 7L, 1L, 4L, 11L, 72L, 84L, 84L, 85L, 81L, 76L, + 81L, 85L, 78L, 78L, 77L, 81L, 80L, 84L, 86L, 90L, 74L, 74L, 72L, + 88L, 62L, 58L, 88L, 88L, 88L, 88L, 62L, 62L, 60L, 38L, 54L, 69L, + 69L, 59L, 59L, 59L, 68L, 87L, 86L, 77L, 84L, 80L, 83L, 81L, 72L, + 74L, 86L, 74L, 59L, 88L, 68L, 66L, 59L, 66L, 69L, 38L, 52L, 60L, + 68L, 59L, 59L, 66L, 60L, 59L, 64L, 74L, 74L, 84L, 85L, 77L, 90L, + 77L, 87L, 74L, 75L, 90L, 69L, 69L, 63L, 63L, 58L, 69L, 69L, 69L, + 69L, 52L, 38L, 71L, 69L, 69L, 74L, 84L, 81L, 85L, 77L, 85L, 76L, + 81L, 49L, 49L, 47L, 48L, 49L, 44L, 44L, 44L, 41L, 54L, 88L, 61L, + 70L, 52L, 54L, 54L, 88L, 64L, 60L, 60L, 69L, 71L, 54L, 68L, 69L, + 62L, 70L, 64L, 86L, 74L, 77L, 75L, 90L, 81L, 81L, 77L, 78L, 44L, + 49L, 49L, 43L, 51L, 50L, 50L, 47L, 47L, 41L, 44L, 44L, 40L, 44L, + 56L, 50L, 64L, 70L, 69L, 68L, 69L, 61L, 63L, 69L, 69L, 69L, 61L, + 64L, 47L, 47L, 47L, 54L, 50L, 50L, 50L, 50L, 51L, 53L, 44L, 45L, + 42L, 56L, 67L, 56L, 56L, 56L, 56L, 56L, 70L, 62L, 62L, 52L, 38L, + 69L, 60L, 54L, 63L, 63L, 53L, 53L, 67L, 67L, 53L, 42L, 53L, 57L, + 45L, 53L, 56L, 53L, 53L, 42L, 57L, 46L, 45L, 69L, 69L, 63L, 62L, + 70L, 88L, 71L, 78L, 76L, 76L, 82L, 78L, 16L, 90L, 84L, 76L, 90L, + 75L, 42L, 53L, 41L, 10L, 57L, 57L, 10L, 57L, 57L, 57L, 10L, 45L, + 50L, 53L, 10L, 57L, 51L, 45L, 53L, 47L, 41L, 90L, 90L, 90L, 77L, + 83L, 85L, 72L, 72L, 85L, 87L, 82L, 76L, 84L, 75L, 72L, 77L, 57L, + 42L, 40L, 45L, 45L, 53L, 57L, 41L, 48L, 10L, 10L, 41L, 46L, 41L, + 51L, 49L, 45L, 45L, 76L, 80L, 80L, 81L, 83L, 80L, 87L, 85L, 86L, + 90L, 90L, 16L, 16L, 75L, 41L, 43L, 43L, 46L, 51L, 43L, 48L, 41L, + 62L, 62L, 69L, 60L, 52L, 54L, 85L, 90L, 90L, 90L, 83L, 77L, 77L, + 83L, 83L, 83L, 83L, 77L, 90L, 90L, 87L, 77L, 90L, 90L, 80L, 80L, + 77L, 82L, 52L, 69L, 38L, 64L, 59L, 69L, 70L, 61L, 69L, 69L, 63L, + 73L, 73L, 73L, 74L, 81L, 90L, 89L, 89L, 89L, 79L, 89L, 89L, 89L, + 79L, 87L, 79L, 79L, 80L, 80L, 79L, 80L, 78L, 80L, 59L, 69L, 64L, + 69L, 69L, 71L, 71L, 61L, 60L, 61L, 61L, 52L, 64L, 60L, 60L, 71L, + 52L, 80L, 80L, 87L, 87L, 87L, 87L, 74L, 74L, 78L, 90L, 87L, 87L, + 74L, 87L, 87L, 87L, 75L, 74L, 80L, 86L, 38L, 69L, 69L, 54L, 38L, + 52L, 38L, 38L, 52L, 38L, 38L, 65L, 70L, 64L, 72L, 87L, 74L, 72L, + 84L, 84L, 81L, 76L, 81L, 76L, 86L, 86L, 74L, 76L, 80L, 80L, 72L, + 74L, 86L, 72L, 70L, 63L, 64L, 58L, 62L, 54L, 88L, 88L, 88L, 88L, + 64L, 88L, 71L, 64L, 62L, 64L, 86L, 86L, 86L, 86L, 86L, 80L, 86L, + 85L, 81L, 85L, 80L, 90L, 83L, 80L, 81L, 81L, 74L, 78L, 71L, 38L, + 70L, 66L, 59L, 66L, 88L, 64L, 70L, 54L, 88L, 65L, 61L, 61L, 38L, + 60L, 87L, 75L, 16L, 83L, 87L, 87L, 87L, 87L, 72L, 74L, 72L, 62L, + 62L, 54L, 66L, 71L, 61L, 60L, 69L, 69L, 62L, 63L, 64L, 84L, 74L, + 87L, 72L, 74L, 84L, 86L, 86L, 80L, 80L, 66L, 63L, 64L, 69L, 70L, + 69L, 64L, 66L, 70L, 69L, 58L, 54L, 69L, 66L, 63L, 69L, 72L, 80L, + 80L, 80L, 84L, 77L, 78L, 17L, 22L, 22L, 18L, 27L, 27L, 27L, 42L, + 55L, 49L, 55L, 69L, 71L, 71L, 90L, 72L, 87L, 87L, 41L, 47L, 67L, + 50L, 51L, 48L, 57L, 57L, 57L, 45L, 46L, 47L, 60L, 70L, 60L, 61L, + 69L, 54L, 65L, 86L, 80L, 80L, 76L, 78L, 83L, 90L, 53L, 49L, 56L, + 57L, 49L, 46L, 45L, 45L, 47L, 47L, 45L, 45L, 41L, 40L, 52L, 64L, + 52L, 64L, 38L, 83L, 83L, 85L, 77L, 83L, 44L, 40L, 10L, 49L, 49L, + 47L, 49L, 49L, 49L, 40L, 44L, 56L, 54L, 44L, 70L, 70L, 54L, 52L, + 64L, 64L, 62L, 64L, 52L, 76L, 76L, 86L, 84L, 90L, 82L, 73L, 46L, + 41L, 40L, 50L, 50L, 50L, 41L, 53L, 44L, 54L, 45L, 55L, 44L, 44L, + 51L, 67L, 45L, 64L, 88L, 88L, 88L, 64L, 65L, 64L, 64L, 62L, 62L, + 76L, 77L, 77L, 80L, 82L, 82L, 79L, 82L, 77L, 45L, 45L, 50L, 51L, + 47L, 48L, 48L, 45L, 56L, 47L, 56L, 56L, 56L, 56L, 56L, 42L, 56L, + 58L, 58L, 58L, 58L, 64L, 62L, 68L, 71L, 62L, 69L, 80L, 80L, 56L, + 56L, 42L, 44L, 50L, 67L, 67L, 67L, 57L, 67L, 56L, 56L, 57L, 57L, + 57L, 10L, 10L, 10L, 57L, 57L, 10L, 46L, 45L, 65L, 84L, 76L, 80L, + 80L, 80L, 79L, 75L, 90L, 85L, 90L, 82L, 74L, 74L, 74L, 89L, 79L, + 53L, 42L, 57L, 10L, 10L, 10L, 49L, 40L, 42L, 47L, 46L, 50L, 53L, + 49L, 88L, 65L, 60L, 54L, 59L, 59L, 59L, 59L, 68L, 69L, 69L, 74L, + 87L, 80L, 90L, 16L, 85L, 89L, 79L, 89L, 82L, 82L, 45L, 53L, 56L, + 43L, 68L, 69L, 69L, 69L, 60L, 66L, 69L, 69L, 82L, 77L, 90L, 87L, + 75L, 74L, 79L, 79L, 74L, 80L, 45L, 55L, 10L, 70L, 65L, 52L, 59L, + 69L, 69L, 75L, 77L, 90L, 82L, 16L, 77L, 75L, 80L, 80L, 74L, 87L, + 87L, 87L, 49L, 53L, 53L, 57L, 59L, 66L, 66L, 66L, 69L, 69L, 69L, + 69L, 62L, 64L, 65L, 69L, 77L, 80L, 77L, 90L, 90L, 80L, 85L, 75L, + 87L, 87L, 51L, 51L, 41L, 69L, 66L, 69L, 66L, 60L, 54L, 38L, 88L, + 61L, 81L, 77L, 77L, 77L, 77L, 80L, 80L, 74L, 51L, 49L, 47L, 40L, + 51L, 70L, 70L, 59L, 52L, 27L, 35L, 36L, 36L, 36L, 25L, 36L, 36L, + 30L, 33L, 16L, 25L, 28L, 36L, 36L, 21L, 35L, 36L, 4L, 5L, 22L, + 35L, 35L, 36L, 34L, 34L, 34L, 3L, 4L, 23L, 19L, 28L, 22L, 22L, + 22L, 24L, 3L, 13L, 7L, 23L, 23L, 23L, 23L, 35L, 19L, 12L, 31L, + 28L, 28L, 34L, 34L, 7L, 2L, 23L, 12L, 12L, 37L, 34L, 34L, 21L, + 36L, 29L, 29L, 27L, 21L, 21L, 34L, 2L, 4L, 2L, 34L, 34L, 36L, + 16L, 36L, 19L, 8L, 8L, 34L, 34L, 34L, 30L, 19L, 22L, 7L, 14L, + 34L, 17L, 35L, 37L, 37L, 1L, 4L, 13L, 21L, 23L, 16L, 35L, 17L, + 36L, 22L, 19L, 17L, 34L, 23L, 30L, 23L, 23L, 23L, 23L, 28L, 36L, + 21L, 25L, 35L, 26L, 22L, 28L, 34L, 34L, 22L, 36L, 24L, 24L, 36L, + 23L, 22L, 17L, 17L, 27L, 24L, 24L, 28L, 28L, 17L, 22L, 22L, 22L, + 19L, 19L, 19L, 17L, 34L, 25L, 29L, 25L, 16L, 30L, 28L, 28L, 22L, + 36L, 36L, 28L, 19L, 19L, 19L, 34L, 36L, 36L, 28L, 19L, 25L, 3L, + 49L, 50L, 50L, 51L, 51L, 40L, 47L, 54L, 70L, 88L, 88L, 88L, 64L, + 88L, 64L, 88L, 88L, 66L, 69L, 69L, 63L, 63L, 63L, 58L, 63L, 80L, + 84L, 84L, 86L, 81L, 85L, 79L, 82L, 74L, 74L, 82L, 87L, 74L, 78L, + 76L, 85L, 77L, 78L, 14L, 14L, 4L, 11L, 8L, 8L, 9L, 1L, 8L, 8L, + 14L, 7L, 11L, 5L, 11L, 8L, 11L, 2L, 3L, 4L, 4L, 7L, 4L, 4L, 15L, + 4L, 9L, 4L, 67L, 42L, 56L, 56L, 56L, 56L, 51L, 56L, 51L, 41L, + 44L, 49L, 56L, 41L, 53L, 46L, 56L, 56L, 50L, 67L, 64L, 54L, 65L, + 65L, 62L, 64L, 58L, 58L, 88L, 69L, 69L, 88L, 69L, 38L, 69L, 69L, + 38L, 85L, 77L, 84L, 77L, 74L, 89L, 79L, 79L, 89L, 89L, 79L, 89L, + 82L, 89L, 87L, 85L, 83L, 82L, 82L, 75L, 78L, 74L, 76L, 74L, 4L, + 3L, 6L, 11L, 5L, 5L, 14L, 8L, 14L, 8L, 13L, 8L, 8L, 13L, 5L, + 2L, 7L, 13L, 2L, 9L, 9L, 11L, 5L, 11L, 5L, 5L, 5L, 11L, 4L, 15L, + 15L, 7L, 7L, 11L, 4L, 8L, 11L, 11L, 7L, 4L, 7L, 15L, 56L, 67L, + 56L, 67L, 67L, 54L, 46L, 67L, 51L, 56L, 40L, 67L, 68L, 62L, 70L, + 65L, 59L, 54L, 54L, 54L, 38L, 38L, 68L, 69L, 88L, 69L, 52L, 70L, + 69L, 59L, 90L, 80L, 75L, 90L, 89L, 89L, 79L, 79L, 75L, 79L, 87L, + 80L, 80L, 74L, 72L, 77L, 76L, 84L, 86L, 77L, 85L, 86L, 78L, 84L, + 84L, 90L, 84L, 84L, 90L, 2L, 2L, 4L, 6L, 13L, 13L, 1L, 3L, 8L, + 8L, 11L, 11L, 13L, 1L, 7L, 14L, 5L, 15L, 5L, 16L, 36L, 19L, 30L, + 27L, 36L, 36L, 21L, 19L, 39L, 39L, 22L, 22L, 67L, 57L, 57L, 57L, + 10L, 57L, 57L, 57L, 77L, 87L, 87L, 84L, 3L, 1L, 13L, 15L, 5L, + 8L, 11L, 8L, 4L, 2L, 4L, 7L, 15L, 15L, 13L, 7L, 15L, 8L, 4L, + 5L, 4L, 15L, 15L, 4L, 4L, 4L, 15L, 15L, 15L, 15L, 15L, 39L, 22L, + 27L, 23L, 19L, 27L, 27L, 18L, 36L, 24L, 22L, 35L, 23L, 37L, 29L, + 57L, 57L, 67L, 51L, 51L, 53L, 53L, 85L, 87L, 85L, 84L, 72L, 87L, + 87L, 75L, 79L, 34L, 24L, 27L, 35L, 35L, 45L, 40L, 41L, 40L, 49L, + 40L, 41L, 51L, 47L, 48L, 44L, 48L, 45L, 57L, 10L, 44L, 53L, 53L, + 7L, 56L, 75L, 81L, 75L, 77L, 83L, 72L, 79L, 55L, 56L, 46L, 45L, + 43L, 51L, 47L, 57L, 67L, 46L, 51L, 10L, 48L, 41L, 46L, 10L, 83L, + 85L, 74L, 87L, 87L, 75L, 74L, 86L, 51L, 44L, 45L, 44L, 49L, 45L, + 53L, 49L, 46L, 57L, 47L, 90L, 87L, 85L, 80L, 75L, 84L, 44L, 46L, + 51L, 46L, 67L, 51L, 44L, 51L, 16L, 16L, 81L, 85L, 72L, 72L, 80L, + 90L, 74L, 74L, 43L, 46L, 43L, 40L, 55L, 48L, 57L, 51L, 63L, 62L, + 64L, 70L, 64L, 61L, 73L, 16L, 84L, 84L, 77L, 77L, 74L, 72L, 85L, + 81L, 85L, 76L, 81L, 44L, 44L, 45L, 51L, 57L, 51L, 51L, 51L, 57L, + 71L, 61L, 54L, 60L, 83L, 84L, 76L, 86L, 86L, 86L, 81L, 43L, 50L, + 50L, 50L, 41L, 57L, 61L, 71L, 63L, 54L, 69L, 61L, 83L, 83L, 90L, + 83L, 90L, 77L, 74L, 86L, 86L, 86L, 51L, 44L, 45L, 41L, 44L, 45L, + 65L, 60L, 88L, 62L, 70L, 70L, 63L, 69L, 69L, 69L, 69L, 63L, 77L, + 74L, 80L, 87L, 87L, 87L, 77L, 77L, 81L, 86L, 82L, 86L, 41L, 40L, + 53L, 46L, 41L, 69L, 63L, 61L, 64L, 69L, 88L, 70L, 52L, 59L, 88L, + 59L, 59L, 62L, 62L, 64L, 88L, 58L, 69L, 69L, 83L, 78L, 76L, 85L, + 77L, 77L, 90L, 75L, 80L, 75L, 90L, 74L, 74L, 72L, 13L, 14L, 5L, + 5L, 2L, 7L, 5L, 7L, 51L, 44L, 51L, 71L, 54L, 52L, 52L, 64L, 60L, + 61L, 61L, 60L, 68L, 68L, 71L, 68L, 59L, 66L, 71L, 71L, 66L, 69L, + 63L, 71L, 64L, 71L, 69L, 80L, 90L, 80L, 82L, 78L, 84L, 76L, 85L, + 86L, 2L, 8L, 2L, 51L, 43L, 71L, 62L, 65L, 64L, 38L, 38L, 65L, + 58L, 38L, 65L, 69L, 63L, 70L, 54L, 59L, 59L, 66L, 66L, 60L, 69L, + 85L, 83L, 75L, 80L, 73L, 79L, 79L, 82L, 77L, 76L, 74L, 78L, 78L, + 90L, 74L, 74L, 87L, 86L, 8L, 5L, 7L, 4L, 4L, 70L, 72L, 82L, 89L, + 80L, 87L, 85L, 87L, 87L, 87L, 83L, 76L, 63L, 69L, 38L, 38L, 81L, + 73L, 90L, 79L, 87L, 75L, 80L, 80L, 80L, 75L, 78L, 80L, 86L, 76L, + 87L, 80L, 90L, 74L, 64L, 65L, 62L, 69L, 16L, 16L, 77L, 77L, 90L, + 90L, 80L, 80L, 80L, 72L, 72L, 78L, 79L, 85L, 74L, 74L, 75L, 65L, + 62L, 58L, 70L, 90L, 72L, 87L, 86L, 85L, 74L, 75L, 75L, 84L, 75L, + 75L, 90L, 87L, 77L, 78L, 85L, 69L, 66L, 66L, 86L, 82L, 74L, 84L, + 90L, 77L, 77L, 59L, 59L, 66L, 59L, 75L, 75L, 84L, 84L, 83L, 83L, + 90L, 66L, 66L, 66L, 66L, 52L, 61L, 82L, 78L, 84L, 85L, 86L, 90L, + 90L, 87L, 90L, 69L, 69L, 58L, 69L, 58L, 63L, 69L, 81L, 86L, 87L, + 76L, 90L, 77L, 69L, 72L, 81L, 69L, 69L, 69L, 54L, 66L, 64L, 64L, + 84L, 87L, 80L, 80L, 80L, 87L, 54L, 71L, 61L, 54L, 80L, 77L, 90L, + 64L, 52L, 64L, 54L, 52L, 77L, 84L, 90L, 85L, 90L, 90L, 77L, 73L, + 87L, 87L, 87L, 87L, 74L, 78L, 84L, 85L, 76L, 69L, 69L, 63L, 88L, + 58L, 70L, 90L, 90L, 80L, 80L, 84L, 84L, 87L, 87L, 87L, 74L, 89L, + 76L, 86L, 87L, 86L, 81L, 90L, 54L, 52L, 71L, 60L, 60L, 16L, 16L, + 81L, 73L, 79L, 79L, 89L, 86L, 86L, 80L, 76L, 76L, 85L, 87L, 75L, + 77L, 55L, 45L, 46L, 46L, 56L, 42L, 46L, 49L, 55L, 70L, 71L, 69L, + 38L, 69L, 4L, 15L, 3L, 13L, 2L, 15L, 2L, 2L, 2L, 2L, 8L, 2L, + 15L, 51L, 44L, 44L, 46L, 46L, 40L, 44L, 43L, 43L, 49L, 50L, 50L, + 55L, 46L, 57L, 60L, 62L, 63L, 69L, 63L, 85L, 85L, 81L, 80L, 80L, + 80L, 84L, 80L, 87L, 85L, 81L, 86L, 85L, 81L, 85L, 86L, 85L, 6L, + 1L, 2L, 4L, 1L, 6L, 3L, 8L, 28L, 27L, 22L, 23L, 23L, 22L, 22L, + 30L, 34L, 22L, 19L, 28L, 36L, 44L, 55L, 45L, 50L, 48L, 57L, 41L, + 49L, 44L, 43L, 40L, 51L, 68L, 61L, 66L, 64L, 61L, 61L, 52L, 7L, + 15L, 4L, 13L, 1L, 14L, 14L, 5L, 26L, 19L, 19L, 31L, 18L, 28L, + 19L, 54L, 44L, 42L, 42L, 42L, 42L, 56L, 56L, 56L, 56L, 56L, 41L, + 41L, 56L, 56L, 40L, 56L, 50L, 57L, 67L, 67L, 77L, 87L, 87L, 83L, + 85L, 74L, 77L, 78L, 74L, 84L, 84L, 84L, 90L, 90L, 86L, 85L, 80L, + 79L, 86L, 87L, 80L, 82L, 75L, 86L, 78L, 2L, 15L, 14L, 8L, 8L, + 8L, 14L, 14L, 8L, 28L, 23L, 26L, 16L, 16L, 33L, 30L, 25L, 28L, + 41L, 40L, 44L, 51L, 51L, 51L, 51L, 48L, 49L, 61L, 61L, 60L, 61L, + 61L, 66L, 59L, 66L, 66L, 69L, 36L, 19L, 22L, 36L, 36L, 23L, 19L, + 28L, 19L, 36L, 22L, 22L, 36L, 36L, 28L, 28L, 28L, 27L, 57L, 57L, + 10L, 53L, 53L, 57L, 57L, 10L, 46L, 45L, 57L, 10L, 10L, 10L, 49L, + 51L, 45L, 67L, 53L, 53L, 41L, 43L, 44L, 85L, 86L, 86L, 86L, 85L, + 77L, 77L, 76L, 86L, 82L, 77L, 2L, 5L, 7L, 1L, 7L, 7L, 7L, 9L, + 14L, 17L, 23L, 35L, 22L, 22L, 22L, 22L, 23L, 22L, 34L, 17L, 35L, + 35L, 21L, 21L, 47L, 53L, 44L, 44L, 44L, 61L, 52L, 52L, 52L, 86L, + 81L, 87L, 72L, 83L, 82L, 84L, 84L, 90L, 76L, 89L, 86L, 81L, 72L, + 75L, 76L, 36L, 23L, 23L, 23L, 28L, 23L, 36L, 12L, 20L, 17L, 23L, + 23L, 22L, 22L, 22L, 22L, 23L, 23L, 23L, 23L, 74L, 86L, 14L, 15L, + 11L, 11L, 11L, 11L, 11L, 6L, 23L, 19L, 19L, 19L, 19L, 19L, 35L, + 28L, 21L, 22L, 22L, 22L, 34L, 44L, 46L, 55L, 56L, 40L, 41L, 60L, + 63L, 69L, 69L, 78L, 80L, 87L, 74L, 80L, 74L, 81L, 90L, 74L, 86L, + 77L, 74L, 76L, 23L, 22L, 22L, 19L, 12L, 22L, 22L, 36L, 30L, 20L, + 33L, 17L, 35L, 35L, 35L, 19L, 86L, 86L, 16L, 82L, 25L, 80L, 74L, + 5L, 5L, 5L, 6L, 11L, 5L, 6L, 5L, 23L, 30L, 17L, 35L, 35L, 35L, + 12L, 19L, 34L, 37L, 36L, 21L, 45L, 42L, 42L, 56L, 53L, 56L, 56L, + 56L, 56L, 38L, 52L, 81L, 77L, 74L, 74L, 84L, 82L, 75L, 86L, 85L, + 72L, 72L, 37L, 12L, 12L, 12L, 12L, 12L, 12L, 12L, 29L, 21L, 34L, + 21L, 21L, 21L, 34L, 34L, 34L, 34L, 34L, 34L, 17L, 17L, 34L, 53L, + 53L, 53L, 40L, 45L, 46L, 53L, 42L, 10L, 48L, 48L, 53L, 10L, 53L, + 45L, 54L, 77L, 77L, 85L, 77L, 72L, 90L, 16L, 75L, 86L, 72L, 81L, + 75L, 90L, 90L, 79L, 90L, 81L, 87L, 72L, 78L, 77L, 80L, 9L, 7L, + 5L, 5L, 9L, 7L, 4L, 4L, 12L, 12L, 37L, 12L, 37L, 12L, 12L, 12L, + 12L, 12L, 30L, 36L, 34L, 21L, 35L, 27L, 18L, 56L, 56L, 56L, 67L, + 53L, 64L, 38L, 64L, 65L, 65L, 86L, 80L, 84L, 76L, 72L, 73L, 76L, + 74L, 16L, 82L, 74L, 17L, 30L, 36L, 36L, 36L, 18L, 34L, 34L, 29L, + 29L, 34L, 34L, 17L, 34L, 17L, 17L, 29L, 54L, 45L, 45L, 49L, 49L, + 41L, 51L, 41L, 41L, 45L, 40L, 40L, 51L, 41L, 53L, 16L, 86L, 73L, + 90L, 72L, 16L, 16L, 82L, 84L, 90L, 77L, 78L, 80L, 81L, 15L, 15L, + 15L, 7L, 11L, 11L, 11L, 21L, 21L, 21L, 34L, 34L, 36L, 19L, 23L, + 34L, 36L, 25L, 53L, 56L, 56L, 56L, 54L, 64L, 64L, 64L, 63L, 63L, + 62L, 54L, 84L, 81L, 79L, 1L, 5L, 3L, 6L, 8L, 2L, 2L, 3L, 4L, + 4L, 7L, 1L, 15L, 34L, 34L, 34L, 34L, 34L, 27L, 29L, 28L, 36L, + 31L, 25L, 36L, 36L, 34L, 42L, 53L, 51L, 48L, 71L, 88L, 62L, 69L, + 38L, 70L, 88L, 62L, 68L, 60L, 77L, 77L, 83L, 77L, 74L, 90L, 74L, + 87L, 74L, 74L, 82L, 11L, 13L, 4L, 7L, 11L, 11L, 11L, 7L, 7L, + 4L, 34L, 34L, 34L, 34L, 17L, 17L, 47L, 45L, 67L, 67L, 57L, 67L, + 53L, 49L, 64L, 64L, 88L, 64L, 88L, 9L, 3L, 7L, 4L, 11L, 2L, 4L, + 3L, 8L, 3L, 3L, 6L, 3L, 11L, 11L, 4L, 27L, 27L, 27L, 30L, 33L, + 33L, 16L, 16L, 34L, 12L, 26L, 16L, 22L, 22L, 22L, 65L, 38L, 63L, + 68L, 71L, 71L, 65L, 61L, 71L, 61L, 61L, 61L, 60L, 60L, 84L, 83L, + 86L, 86L, 84L, 74L, 86L, 77L, 72L, 76L, 81L, 7L, 7L, 4L, 15L, + 15L, 15L, 15L, 17L, 36L, 31L, 36L, 34L, 34L, 34L, 34L, 34L, 34L, + 43L, 46L, 42L, 57L, 51L, 67L, 67L, 53L, 88L, 88L, 88L, 88L, 64L, + 1L, 2L, 5L, 2L, 14L, 2L, 3L, 14L, 14L, 14L, 34L, 36L, 22L, 36L, + 37L, 21L, 27L, 31L, 26L, 22L, 24L, 24L, 24L, 28L, 28L, 27L, 30L, + 30L, 27L, 30L, 30L, 19L, 22L, 34L, 61L, 60L, 52L, 69L, 65L, 65L, + 52L, 52L, 38L, 38L, 38L, 64L, 65L, 63L, 64L, 88L, 77L, 83L, 85L, + 80L, 77L, 81L, 90L, 74L, 74L, 86L, 77L, 5L, 7L, 1L, 5L, 7L, 15L, + 34L, 17L, 17L, 17L, 34L, 34L, 29L, 16L, 43L, 45L, 49L, 41L, 56L, + 10L, 57L, 57L, 57L, 65L, 64L, 62L, 64L, 58L, 2L, 1L, 13L, 1L, + 5L, 5L, 8L, 8L, 8L, 14L, 13L, 8L, 5L, 2L, 2L, 2L, 11L, 13L, 2L, + 33L, 27L, 27L, 30L, 28L, 28L, 30L, 30L, 22L, 17L, 22L, 37L, 17L, + 36L, 36L, 35L, 22L, 19L, 30L, 39L, 22L, 39L, 54L, 54L, 64L, 59L, + 64L, 88L, 52L, 62L, 62L, 62L, 62L, 63L, 88L, 88L, 88L, 88L, 90L, + 77L, 83L, 73L, 82L, 82L, 82L, 84L, 90L, 87L, 77L, 77L, 78L, 7L, + 7L, 4L, 4L, 4L, 4L, 35L, 18L, 27L, 30L, 36L, 36L, 53L, 57L, 57L, + 51L, 10L, 10L, 41L, 41L, 41L, 54L, 45L, 58L, 58L, 62L, 58L, 1L, + 9L, 7L, 4L, 7L, 7L, 13L, 9L, 5L, 3L, 5L, 7L, 1L, 27L, 12L, 19L, + 19L, 19L, 28L, 17L, 27L, 27L, 16L, 27L, 56L, 88L, 88L, 58L, 58L, + 52L, 52L, 59L, 59L, 68L, 68L, 68L, 69L, 61L, 64L, 59L, 79L, 82L, + 83L, 89L, 89L, 89L, 74L, 89L, 89L, 89L, 89L, 86L, 81L, 81L, 85L, + 83L, 84L, 81L, 4L, 15L, 5L, 4L, 7L, 4L, 3L, 17L, 37L, 18L, 49L, + 10L, 57L, 57L, 10L, 47L, 53L, 46L, 51L, 41L, 58L, 1L, 7L, 7L, + 7L, 2L, 4L, 14L, 11L, 5L, 6L, 5L, 4L, 5L, 5L, 7L, 5L, 55L, 55L, + 49L, 40L, 45L, 43L, 45L, 69L, 59L, 54L, 66L, 69L, 66L, 66L, 69L, + 66L, 66L, 66L, 66L, 69L, 61L, 80L, 80L, 80L, 80L, 80L, 80L, 80L, + 81L, 87L, 77L, 81L, 90L, 86L, 15L, 3L, 6L, 7L, 2L, 2L, 3L, 3L, + 3L, 4L, 4L, 3L, 2L, 2L, 2L, 35L, 35L, 20L, 22L, 37L, 47L, 42L, + 67L, 57L, 40L, 47L, 55L, 67L, 67L, 67L, 45L, 51L, 59L, 63L, 38L, + 38L, 61L, 54L, 68L, 52L, 52L, 54L, 5L, 7L, 9L, 4L, 7L, 11L, 11L, + 13L, 11L, 4L, 1L, 5L, 7L, 7L, 7L, 11L, 11L, 11L, 51L, 40L, 46L, + 57L, 57L, 10L, 53L, 40L, 43L, 41L, 64L, 66L, 69L, 69L, 69L, 69L, + 69L, 69L, 69L, 69L, 69L, 70L, 54L, 70L, 69L, 87L, 87L, 87L, 87L, + 87L, 87L, 74L, 79L, 85L, 75L, 3L, 9L, 4L, 7L, 14L, 2L, 3L, 4L, + 13L, 25L, 21L, 31L, 28L, 22L, 26L, 22L, 34L, 36L, 22L, 47L, 40L, + 41L, 45L, 57L, 10L, 41L, 40L, 45L, 46L, 53L, 49L, 88L, 70L, 52L, + 70L, 52L, 54L, 59L, 4L, 7L, 7L, 4L, 15L, 15L, 15L, 15L, 15L, + 15L, 1L, 14L, 4L, 15L, 14L, 41L, 43L, 40L, 44L, 44L, 57L, 46L, + 54L, 40L, 44L, 47L, 40L, 54L, 40L, 38L, 88L, 69L, 38L, 88L, 61L, + 88L, 59L, 52L, 70L, 61L, 61L, 70L, 61L, 63L, 65L, 70L, 87L, 87L, + 75L, 74L, 6L, 4L, 1L, 36L, 36L, 19L, 19L, 19L, 37L, 34L, 30L, + 25L, 17L, 45L, 53L, 51L, 57L, 49L, 67L, 57L, 45L, 57L, 53L, 46L, + 63L, 69L, 69L, 69L, 59L, 68L, 59L, 38L, 63L, 60L, 7L, 9L, 15L, + 7L, 15L, 15L, 15L, 4L, 15L, 15L, 8L, 5L, 14L, 13L, 3L, 4L, 4L, + 3L, 1L, 40L, 44L, 44L, 54L, 41L, 49L, 50L, 50L, 50L, 41L, 41L, + 41L, 47L, 44L, 41L, 49L, 63L, 69L, 65L, 70L, 70L, 62L, 62L, 65L, + 54L, 61L, 78L, 72L, 78L, 72L, 87L, 72L, 74L, 78L, 84L, 84L, 84L, + 4L, 4L, 4L, 5L, 4L, 3L, 7L, 3L, 2L, 4L, 5L, 7L, 13L, 13L, 36L, + 36L, 36L, 28L, 22L, 25L, 22L, 24L, 29L, 29L, 30L, 18L, 28L, 49L, + 49L + ) + expect_equal(mtches_centroid, expected) }) -test_that("match centroid works", { - +test_that('match centroid works', { mtches_pt <- geo_match(va_blocks, va18sub, method = 'point') - - expected <- c(64L, 69L, 66L, 66L, 69L, 70L, 70L, 69L, 63L, 68L, 38L, 54L, - 62L, 54L, 71L, 38L, 52L, 52L, 82L, 79L, 73L, 84L, 87L, 76L, 77L, - 74L, 80L, 79L, 89L, 2L, 5L, 4L, 3L, 7L, 5L, 5L, 2L, 4L, 4L, 4L, - 14L, 2L, 36L, 24L, 30L, 27L, 22L, 36L, 36L, 19L, 34L, 49L, 44L, - 56L, 49L, 40L, 28L, 28L, 23L, 34L, 30L, 36L, 12L, 33L, 22L, 23L, - 23L, 23L, 23L, 35L, 22L, 22L, 22L, 22L, 22L, 67L, 51L, 51L, 49L, - 43L, 10L, 53L, 53L, 45L, 55L, 55L, 53L, 43L, 51L, 57L, 90L, 90L, - 90L, 80L, 77L, 82L, 73L, 82L, 73L, 82L, 77L, 76L, 77L, 78L, 79L, - 79L, 79L, 82L, 79L, 87L, 79L, 80L, 1L, 2L, 6L, 1L, 4L, 4L, 2L, - 5L, 5L, 5L, 18L, 25L, 18L, 51L, 10L, 40L, 53L, 40L, 41L, 41L, - 67L, 41L, 43L, 10L, 52L, 68L, 88L, 70L, 65L, 52L, 64L, 64L, 63L, - 38L, 69L, 70L, 70L, 58L, 69L, 64L, 54L, 69L, 58L, 89L, 79L, 87L, - 87L, 87L, 87L, 87L, 2L, 3L, 7L, 13L, 3L, 3L, 6L, 11L, 11L, 4L, - 4L, 2L, 1L, 6L, 1L, 3L, 1L, 1L, 43L, 49L, 48L, 46L, 46L, 43L, - 54L, 43L, 10L, 41L, 48L, 22L, 23L, 19L, 28L, 23L, 27L, 30L, 35L, - 35L, 35L, 35L, 35L, 19L, 19L, 19L, 19L, 12L, 37L, 12L, 57L, 51L, - 51L, 46L, 51L, 44L, 43L, 56L, 56L, 10L, 51L, 51L, 48L, 41L, 51L, - 80L, 80L, 80L, 80L, 80L, 77L, 80L, 87L, 87L, 87L, 87L, 87L, 87L, - 87L, 86L, 79L, 82L, 74L, 74L, 36L, 28L, 19L, 27L, 36L, 36L, 26L, - 23L, 23L, 23L, 21L, 26L, 19L, 35L, 29L, 36L, 23L, 20L, 20L, 38L, - 88L, 69L, 52L, 69L, 70L, 69L, 68L, 54L, 38L, 65L, 54L, 59L, 88L, - 89L, 79L, 79L, 79L, 79L, 76L, 79L, 72L, 5L, 4L, 1L, 2L, 5L, 7L, - 8L, 1L, 8L, 8L, 8L, 8L, 5L, 3L, 14L, 8L, 14L, 44L, 57L, 67L, - 57L, 42L, 57L, 40L, 40L, 43L, 40L, 49L, 49L, 46L, 54L, 45L, 12L, - 12L, 29L, 12L, 21L, 21L, 21L, 21L, 21L, 21L, 21L, 34L, 34L, 34L, - 34L, 34L, 34L, 17L, 34L, 51L, 47L, 51L, 41L, 44L, 71L, 62L, 63L, - 61L, 61L, 69L, 62L, 69L, 62L, 69L, 69L, 87L, 87L, 75L, 72L, 72L, - 76L, 74L, 72L, 72L, 75L, 79L, 90L, 72L, 78L, 78L, 35L, 26L, 26L, - 30L, 23L, 23L, 35L, 26L, 22L, 22L, 22L, 23L, 23L, 61L, 52L, 54L, - 64L, 60L, 61L, 71L, 61L, 69L, 52L, 61L, 60L, 52L, 60L, 71L, 70L, - 69L, 60L, 54L, 70L, 63L, 70L, 64L, 54L, 61L, 60L, 85L, 80L, 87L, - 80L, 80L, 80L, 77L, 80L, 81L, 76L, 87L, 77L, 14L, 13L, 5L, 8L, - 2L, 2L, 2L, 2L, 11L, 7L, 14L, 11L, 4L, 11L, 2L, 2L, 7L, 5L, 7L, - 11L, 8L, 7L, 7L, 4L, 82L, 80L, 80L, 85L, 87L, 77L, 86L, 16L, - 86L, 74L, 81L, 17L, 17L, 28L, 36L, 36L, 12L, 18L, 18L, 34L, 34L, - 17L, 34L, 29L, 16L, 16L, 18L, 21L, 28L, 36L, 63L, 69L, 69L, 64L, - 65L, 70L, 38L, 52L, 63L, 62L, 72L, 81L, 81L, 81L, 85L, 81L, 76L, - 86L, 79L, 80L, 86L, 86L, 81L, 35L, 22L, 12L, 19L, 19L, 19L, 12L, - 34L, 35L, 35L, 16L, 18L, 6L, 35L, 58L, 88L, 64L, 75L, 87L, 87L, - 87L, 76L, 74L, 90L, 77L, 76L, 81L, 81L, 77L, 84L, 86L, 90L, 16L, - 28L, 36L, 36L, 27L, 30L, 33L, 31L, 16L, 16L, 16L, 36L, 35L, 36L, - 34L, 19L, 62L, 62L, 68L, 71L, 61L, 61L, 61L, 61L, 60L, 59L, 65L, - 66L, 69L, 85L, 86L, 82L, 77L, 77L, 86L, 84L, 76L, 86L, 12L, 12L, - 12L, 12L, 12L, 12L, 12L, 12L, 30L, 21L, 21L, 34L, 34L, 34L, 34L, - 34L, 34L, 17L, 17L, 29L, 36L, 33L, 28L, 34L, 34L, 34L, 88L, 64L, - 88L, 65L, 64L, 62L, 58L, 76L, 87L, 84L, 83L, 80L, 13L, 13L, 4L, - 2L, 5L, 11L, 14L, 5L, 5L, 7L, 4L, 8L, 5L, 13L, 7L, 7L, 4L, 9L, - 85L, 78L, 78L, 81L, 75L, 83L, 90L, 84L, 86L, 21L, 36L, 34L, 18L, - 36L, 22L, 36L, 24L, 29L, 31L, 19L, 16L, 16L, 24L, 36L, 18L, 36L, - 64L, 54L, 52L, 64L, 52L, 64L, 38L, 64L, 38L, 54L, 65L, 60L, 60L, - 60L, 77L, 78L, 80L, 79L, 81L, 90L, 84L, 83L, 79L, 79L, 77L, 76L, - 72L, 74L, 86L, 72L, 74L, 73L, 34L, 34L, 34L, 34L, 34L, 17L, 17L, - 17L, 29L, 16L, 35L, 29L, 27L, 27L, 30L, 16L, 16L, 64L, 62L, 58L, - 88L, 72L, 77L, 72L, 72L, 74L, 4L, 7L, 9L, 15L, 4L, 11L, 7L, 7L, - 11L, 6L, 13L, 11L, 5L, 11L, 7L, 7L, 7L, 4L, 15L, 15L, 15L, 1L, - 4L, 15L, 5L, 5L, 13L, 6L, 14L, 3L, 4L, 4L, 2L, 7L, 4L, 4L, 4L, - 4L, 1L, 21L, 36L, 37L, 36L, 29L, 23L, 22L, 37L, 25L, 16L, 26L, - 25L, 19L, 37L, 34L, 17L, 22L, 12L, 52L, 63L, 62L, 64L, 62L, 58L, - 88L, 88L, 64L, 88L, 65L, 71L, 61L, 64L, 74L, 74L, 75L, 16L, 77L, - 83L, 84L, 87L, 85L, 77L, 86L, 74L, 73L, 76L, 86L, 36L, 25L, 25L, - 22L, 12L, 36L, 16L, 16L, 36L, 27L, 34L, 23L, 34L, 37L, 16L, 22L, - 23L, 27L, 19L, 22L, 58L, 65L, 65L, 87L, 84L, 76L, 85L, 77L, 80L, - 74L, 72L, 84L, 81L, 85L, 5L, 11L, 4L, 4L, 4L, 15L, 15L, 4L, 4L, - 15L, 4L, 8L, 9L, 4L, 1L, 1L, 4L, 4L, 1L, 15L, 15L, 4L, 11L, 2L, - 4L, 4L, 11L, 2L, 11L, 14L, 3L, 3L, 5L, 11L, 4L, 4L, 15L, 27L, - 30L, 19L, 22L, 22L, 22L, 39L, 22L, 30L, 34L, 35L, 34L, 21L, 18L, - 36L, 36L, 36L, 58L, 58L, 88L, 88L, 38L, 38L, 69L, 70L, 59L, 68L, - 69L, 64L, 64L, 68L, 69L, 66L, 66L, 66L, 69L, 66L, 78L, 86L, 78L, - 85L, 75L, 82L, 73L, 84L, 79L, 84L, 77L, 34L, 34L, 16L, 36L, 36L, - 28L, 24L, 36L, 34L, 34L, 17L, 17L, 31L, 32L, 19L, 30L, 24L, 19L, - 54L, 64L, 88L, 69L, 69L, 59L, 59L, 68L, 90L, 90L, 74L, 75L, 76L, - 85L, 1L, 4L, 1L, 4L, 3L, 13L, 9L, 1L, 5L, 7L, 15L, 4L, 1L, 13L, - 19L, 36L, 36L, 36L, 19L, 4L, 5L, 5L, 15L, 5L, 5L, 8L, 2L, 4L, - 3L, 1L, 3L, 11L, 11L, 4L, 13L, 1L, 36L, 36L, 28L, 27L, 27L, 27L, - 18L, 55L, 56L, 40L, 57L, 57L, 38L, 64L, 58L, 60L, 59L, 66L, 61L, - 38L, 65L, 52L, 70L, 66L, 69L, 69L, 69L, 69L, 69L, 69L, 77L, 90L, - 90L, 14L, 14L, 8L, 2L, 2L, 2L, 4L, 15L, 15L, 4L, 4L, 4L, 4L, - 34L, 18L, 34L, 28L, 22L, 19L, 30L, 30L, 22L, 39L, 22L, 22L, 30L, - 26L, 26L, 35L, 36L, 36L, 35L, 68L, 66L, 62L, 90L, 87L, 90L, 77L, - 87L, 80L, 90L, 86L, 79L, 80L, 84L, 81L, 79L, 36L, 22L, 22L, 22L, - 28L, 36L, 28L, 28L, 28L, 28L, 28L, 23L, 23L, 23L, 34L, 26L, 30L, - 28L, 19L, 19L, 2L, 14L, 1L, 14L, 4L, 5L, 9L, 1L, 1L, 1L, 1L, - 46L, 49L, 55L, 54L, 55L, 48L, 46L, 51L, 44L, 46L, 67L, 58L, 69L, - 69L, 69L, 69L, 69L, 69L, 69L, 69L, 69L, 69L, 52L, 60L, 69L, 38L, - 9L, 4L, 4L, 1L, 3L, 5L, 7L, 6L, 11L, 4L, 5L, 5L, 2L, 14L, 14L, - 32L, 3L, 2L, 14L, 82L, 21L, 35L, 36L, 31L, 29L, 24L, 23L, 16L, - 45L, 47L, 57L, 57L, 53L, 57L, 10L, 46L, 49L, 56L, 58L, 66L, 66L, - 66L, 69L, 66L, 66L, 77L, 78L, 83L, 87L, 80L, 80L, 77L, 81L, 81L, - 81L, 81L, 80L, 87L, 17L, 23L, 23L, 23L, 23L, 22L, 22L, 22L, 23L, - 23L, 23L, 19L, 23L, 19L, 19L, 19L, 36L, 26L, 36L, 30L, 35L, 35L, - 1L, 6L, 3L, 8L, 8L, 14L, 2L, 5L, 14L, 2L, 5L, 9L, 15L, 67L, 57L, - 40L, 57L, 57L, 48L, 43L, 44L, 41L, 47L, 41L, 49L, 41L, 41L, 40L, - 57L, 47L, 63L, 38L, 52L, 71L, 61L, 64L, 88L, 68L, 61L, 54L, 69L, - 59L, 68L, 88L, 69L, 69L, 58L, 59L, 71L, 71L, 2L, 2L, 1L, 14L, - 14L, 3L, 2L, 8L, 9L, 5L, 2L, 5L, 5L, 1L, 1L, 8L, 8L, 46L, 56L, - 57L, 57L, 67L, 43L, 57L, 46L, 49L, 67L, 47L, 47L, 43L, 40L, 45L, - 44L, 47L, 45L, 68L, 62L, 62L, 59L, 85L, 90L, 85L, 90L, 90L, 90L, - 16L, 90L, 85L, 16L, 90L, 82L, 85L, 86L, 77L, 87L, 85L, 85L, 79L, - 35L, 35L, 19L, 12L, 12L, 12L, 12L, 37L, 12L, 12L, 12L, 29L, 29L, - 16L, 36L, 30L, 21L, 21L, 34L, 8L, 7L, 14L, 11L, 5L, 1L, 7L, 1L, - 11L, 6L, 7L, 5L, 9L, 9L, 2L, 3L, 4L, 11L, 4L, 2L, 7L, 4L, 4L, - 49L, 40L, 43L, 43L, 49L, 49L, 46L, 46L, 49L, 45L, 45L, 54L, 61L, - 52L, 60L, 52L, 71L, 61L, 63L, 69L, 63L, 62L, 70L, 54L, 70L, 1L, - 3L, 8L, 8L, 8L, 8L, 14L, 14L, 14L, 5L, 5L, 2L, 14L, 14L, 9L, - 11L, 10L, 47L, 49L, 43L, 43L, 49L, 40L, 44L, 44L, 54L, 49L, 49L, - 41L, 51L, 43L, 59L, 68L, 90L, 84L, 77L, 83L, 83L, 83L, 80L, 87L, - 87L, 87L, 86L, 83L, 74L, 81L, 80L, 87L, 83L, 74L, 76L, 78L, 74L, - 81L, 73L, 86L, 87L, 86L, 86L, 74L, 82L, 80L, 72L, 21L, 21L, 21L, - 34L, 34L, 34L, 34L, 34L, 34L, 34L, 34L, 17L, 17L, 17L, 17L, 29L, - 18L, 34L, 34L, 34L, 34L, 17L, 4L, 9L, 15L, 15L, 15L, 7L, 7L, - 11L, 11L, 1L, 13L, 7L, 5L, 7L, 11L, 11L, 11L, 7L, 7L, 7L, 11L, - 40L, 50L, 44L, 47L, 44L, 46L, 46L, 48L, 48L, 43L, 44L, 56L, 50L, - 51L, 56L, 55L, 64L, 54L, 63L, 63L, 63L, 52L, 38L, 58L, 85L, 75L, - 72L, 75L, 76L, 83L, 84L, 2L, 5L, 14L, 7L, 7L, 7L, 1L, 8L, 11L, - 5L, 7L, 5L, 4L, 11L, 5L, 6L, 7L, 11L, 5L, 41L, 47L, 46L, 54L, - 42L, 55L, 42L, 43L, 50L, 50L, 48L, 48L, 53L, 54L, 54L, 68L, 69L, - 69L, 69L, 63L, 63L, 58L, 69L, 90L, 77L, 77L, 77L, 90L, 90L, 77L, - 74L, 84L, 90L, 77L, 77L, 74L, 78L, 81L, 81L, 86L, 85L, 29L, 29L, - 34L, 34L, 16L, 16L, 16L, 29L, 36L, 16L, 36L, 27L, 31L, 31L, 32L, - 19L, 27L, 36L, 36L, 15L, 15L, 1L, 4L, 5L, 15L, 15L, 4L, 15L, - 15L, 15L, 4L, 4L, 15L, 4L, 4L, 15L, 8L, 55L, 55L, 44L, 45L, 42L, - 42L, 42L, 45L, 56L, 56L, 56L, 56L, 56L, 42L, 56L, 51L, 67L, 86L, - 76L, 86L, 80L, 74L, 90L, 85L, 83L, 79L, 79L, 84L, 80L, 9L, 7L, - 13L, 4L, 7L, 4L, 4L, 9L, 9L, 9L, 15L, 11L, 7L, 11L, 1L, 13L, - 13L, 7L, 5L, 7L, 7L, 67L, 42L, 42L, 45L, 56L, 56L, 56L, 56L, - 56L, 56L, 56L, 67L, 56L, 56L, 51L, 56L, 55L, 57L, 57L, 51L, 69L, - 38L, 65L, 70L, 65L, 63L, 63L, 69L, 84L, 73L, 73L, 73L, 79L, 78L, - 78L, 85L, 85L, 78L, 74L, 80L, 82L, 78L, 86L, 81L, 77L, 85L, 16L, - 37L, 22L, 34L, 31L, 34L, 28L, 24L, 36L, 18L, 27L, 27L, 30L, 27L, - 27L, 27L, 36L, 22L, 22L, 34L, 22L, 34L, 9L, 14L, 1L, 4L, 4L, - 3L, 3L, 6L, 1L, 1L, 1L, 2L, 2L, 2L, 14L, 3L, 5L, 51L, 41L, 56L, - 40L, 45L, 45L, 44L, 67L, 67L, 56L, 57L, 57L, 57L, 67L, 51L, 49L, - 46L, 55L, 67L, 67L, 53L, 67L, 74L, 77L, 87L, 74L, 75L, 87L, 90L, - 90L, 90L, 90L, 75L, 85L, 85L, 4L, 11L, 11L, 4L, 7L, 4L, 7L, 4L, - 7L, 7L, 7L, 4L, 15L, 15L, 13L, 9L, 4L, 11L, 15L, 4L, 4L, 15L, - 15L, 42L, 57L, 54L, 54L, 45L, 50L, 56L, 57L, 67L, 57L, 40L, 67L, - 57L, 57L, 10L, 57L, 57L, 57L, 53L, 55L, 42L, 10L, 10L, 42L, 71L, - 38L, 65L, 65L, 70L, 69L, 69L, 61L, 52L, 65L, 54L, 52L, 54L, 38L, - 69L, 68L, 61L, 59L, 82L, 82L, 82L, 80L, 84L, 90L, 87L, 82L, 13L, - 14L, 11L, 2L, 9L, 4L, 2L, 4L, 4L, 4L, 2L, 29L, 28L, 30L, 23L, - 18L, 16L, 24L, 35L, 22L, 21L, 39L, 39L, 19L, 12L, 36L, 36L, 36L, - 21L, 5L, 14L, 4L, 18L, 23L, 36L, 36L, 36L, 36L, 16L, 17L, 36L, - 39L, 36L, 36L, 51L, 57L, 57L, 10L, 10L, 57L, 57L, 57L, 57L, 57L, - 51L, 51L, 49L, 57L, 10L, 41L, 45L, 67L, 10L, 48L, 10L, 49L, 56L, - 79L, 85L, 80L, 80L, 77L, 84L, 90L, 77L, 77L, 77L, 83L, 83L, 83L, - 90L, 90L, 87L, 84L, 90L, 90L, 90L, 4L, 15L, 4L, 1L, 14L, 4L, - 9L, 3L, 7L, 7L, 4L, 5L, 2L, 6L, 5L, 5L, 53L, 41L, 40L, 46L, 51L, - 45L, 51L, 53L, 42L, 46L, 10L, 67L, 49L, 49L, 47L, 55L, 49L, 40L, - 46L, 9L, 15L, 4L, 3L, 36L, 36L, 22L, 36L, 22L, 22L, 16L, 29L, - 31L, 16L, 16L, 30L, 40L, 46L, 49L, 56L, 55L, 48L, 46L, 65L, 69L, - 38L, 38L, 3L, 2L, 7L, 7L, 5L, 7L, 4L, 4L, 22L, 36L, 36L, 22L, - 23L, 23L, 25L, 26L, 22L, 49L, 57L, 51L, 51L, 46L, 48L, 67L, 42L, - 63L, 61L, 62L, 88L, 71L, 5L, 15L, 3L, 3L, 7L, 3L, 2L, 14L, 9L, - 4L, 4L, 3L, 23L, 23L, 23L, 34L, 23L, 19L, 17L, 23L, 36L, 27L, - 27L, 55L, 41L, 44L, 41L, 47L, 47L, 57L, 56L, 56L, 56L, 56L, 56L, - 56L, 51L, 51L, 54L, 70L, 60L, 59L, 69L, 52L, 88L, 78L, 75L, 3L, - 3L, 14L, 2L, 2L, 4L, 14L, 3L, 13L, 13L, 13L, 5L, 4L, 6L, 13L, - 1L, 20L, 30L, 32L, 23L, 23L, 36L, 28L, 12L, 23L, 39L, 17L, 19L, - 45L, 49L, 44L, 46L, 50L, 57L, 57L, 51L, 69L, 66L, 38L, 59L, 59L, - 66L, 64L, 1L, 4L, 8L, 1L, 13L, 13L, 8L, 8L, 8L, 13L, 13L, 8L, - 14L, 8L, 8L, 5L, 8L, 8L, 23L, 22L, 30L, 26L, 22L, 22L, 23L, 23L, - 23L, 34L, 25L, 29L, 16L, 24L, 24L, 54L, 51L, 45L, 42L, 50L, 56L, - 56L, 67L, 56L, 40L, 57L, 52L, 54L, 38L, 60L, 69L, 66L, 66L, 66L, - 60L, 38L, 54L, 70L, 9L, 7L, 1L, 4L, 11L, 15L, 7L, 4L, 7L, 11L, - 5L, 4L, 35L, 19L, 20L, 24L, 24L, 36L, 36L, 28L, 24L, 24L, 27L, - 51L, 49L, 55L, 46L, 51L, 57L, 57L, 57L, 57L, 57L, 10L, 51L, 57L, - 51L, 52L, 65L, 19L, 39L, 21L, 22L, 27L, 22L, 30L, 22L, 36L, 17L, - 36L, 19L, 49L, 49L, 67L, 42L, 48L, 45L, 57L, 53L, 51L, 41L, 47L, - 44L, 53L, 41L, 45L, 44L, 42L, 10L, 55L, 46L, 45L, 57L, 64L, 65L, - 54L, 62L, 62L, 66L, 66L, 16L, 36L, 36L, 12L, 34L, 22L, 18L, 30L, - 55L, 40L, 51L, 47L, 47L, 43L, 53L, 53L, 53L, 40L, 10L, 70L, 64L, - 58L, 66L, 66L, 68L, 70L, 60L, 59L, 68L, 22L, 22L, 34L, 16L, 30L, - 18L, 51L, 56L, 49L, 42L, 53L, 51L, 53L, 53L, 50L, 56L, 40L, 54L, - 54L, 69L, 61L, 7L, 36L, 23L, 35L, 12L, 21L, 16L, 36L, 26L, 30L, - 39L, 22L, 40L, 44L, 10L, 51L, 43L, 56L, 51L, 65L, 64L, 62L, 62L, - 88L, 69L, 63L, 58L, 69L, 60L, 64L, 62L, 11L, 5L, 5L, 11L, 9L, - 5L, 4L, 11L, 11L, 7L, 7L, 7L, 7L, 11L, 11L, 11L, 11L, 19L, 19L, - 12L, 12L, 12L, 12L, 37L, 12L, 22L, 22L, 19L, 27L, 24L, 24L, 19L, - 43L, 50L, 50L, 40L, 53L, 54L, 56L, 55L, 46L, 41L, 10L, 88L, 88L, - 88L, 59L, 69L, 69L, 69L, 62L, 8L, 8L, 8L, 11L, 8L, 7L, 1L, 11L, - 11L, 11L, 7L, 7L, 12L, 37L, 29L, 29L, 29L, 28L, 21L, 35L, 35L, - 36L, 50L, 51L, 40L, 44L, 44L, 54L, 58L, 61L, 52L, 88L, 59L, 38L, - 68L, 68L, 69L, 69L, 60L, 61L, 68L, 63L, 38L, 4L, 4L, 4L, 15L, - 15L, 15L, 35L, 23L, 21L, 21L, 29L, 36L, 25L, 30L, 27L, 18L, 41L, - 47L, 48L, 48L, 51L, 58L, 69L, 70L, 38L, 71L, 52L, 52L, 52L, 54L, - 65L, 59L, 65L, 54L, 38L, 38L, 88L, 70L, 2L, 11L, 3L, 11L, 5L, - 11L, 7L, 4L, 15L, 15L, 17L, 34L, 34L, 17L, 45L, 47L, 46L, 47L, - 51L, 45L, 51L, 50L, 52L, 69L, 66L, 70L, 69L, 54L, 59L, 88L, 68L, - 61L, 52L, 60L, 69L, 70L, 4L, 4L, 15L, 15L, 15L, 4L, 11L, 15L, - 8L, 13L, 5L, 36L, 35L, 33L, 34L, 40L, 47L, 56L, 48L, 69L, 71L, - 71L, 61L, 71L, 71L, 69L, 71L, 68L, 66L, 54L, 3L, 3L, 15L, 7L, - 3L, 1L, 1L, 4L, 2L, 1L, 4L, 34L, 34L, 29L, 34L, 34L, 17L, 16L, - 29L, 29L, 44L, 57L, 57L, 40L, 61L, 52L, 52L, 52L, 60L, 59L, 38L, - 61L, 64L, 66L, 64L, 52L, 88L, 63L, 52L, 30L, 34L, 34L, 34L, 23L, - 36L, 19L, 36L, 36L, 11L, 11L, 4L, 15L, 6L, 28L, 28L, 28L, 26L, - 34L, 34L, 34L, 17L, 34L, 30L, 27L, 18L, 25L, 29L, 36L, 9L, 7L, - 15L, 4L, 4L, 4L, 7L, 23L, 23L, 28L, 22L, 30L, 23L, 28L, 31L, - 7L, 4L, 4L, 15L, 15L, 13L, 5L, 4L, 23L, 23L, 23L, 12L, 35L, 23L, - 36L, 28L, 22L, 22L, 30L, 36L, 3L, 5L, 5L, 23L, 23L, 36L, 28L, - 17L, 19L, 5L, 4L, 15L, 23L, 22L, 22L, 19L, 26L, 15L, 15L, 7L, - 11L, 4L, 23L, 19L, 34L, 17L, 17L, 17L, 34L, 25L, 34L, 11L, 11L, - 11L, 8L, 4L, 4L, 4L, 1L, 22L, 25L, 16L, 24L, 3L, 8L, 5L, 4L, - 15L, 15L, 15L, 1L, 3L, 26L, 22L, 31L, 19L, 18L, 18L, 36L, 4L, - 5L, 14L, 11L, 19L, 18L, 17L, 35L, 36L, 36L, 27L, 9L, 11L, 11L, - 3L, 4L, 36L, 36L, 28L, 22L, 37L, 19L, 26L, 29L, 21L, 11L, 11L, - 7L, 4L, 4L, 22L, 22L, 12L, 12L, 37L, 33L, 33L, 7L, 4L, 3L, 3L, - 22L, 37L, 37L, 12L, 25L, 4L, 11L, 7L, 15L, 15L, 1L, 4L, 20L, - 28L, 19L, 36L, 35L, 12L, 22L, 15L, 15L, 4L, 1L, 1L, 36L, 25L, - 16L, 2L, 4L, 15L, 2L, 14L, 36L, 34L, 21L, 21L, 21L, 34L, 16L, - 28L, 34L, 27L, 27L, 14L, 11L, 3L, 5L, 1L, 36L, 36L, 36L, 78L, - 77L, 4L, 13L, 15L, 7L, 2L, 7L, 14L, 76L, 85L, 86L, 86L, 87L, - 82L, 77L, 76L, 86L, 86L, 80L, 80L, 83L, 82L, 78L, 72L, 72L, 78L, - 86L, 14L, 7L, 7L, 5L, 5L, 80L, 74L, 81L, 80L, 75L, 84L, 81L, - 74L, 4L, 13L, 3L, 4L, 11L, 9L, 13L, 75L, 87L, 76L, 81L, 77L, - 15L, 2L, 5L, 3L, 1L, 13L, 8L, 85L, 87L, 75L, 76L, 78L, 78L, 81L, - 86L, 84L, 90L, 82L, 72L, 77L, 85L, 76L, 82L, 87L, 81L, 77L, 84L, - 77L, 75L, 83L, 86L, 83L, 80L, 85L, 87L, 75L, 76L, 8L, 14L, 8L, - 90L, 85L, 84L, 83L, 76L, 81L, 81L, 83L, 8L, 8L, 77L, 90L, 77L, - 77L, 77L, 83L, 90L, 77L, 77L, 83L, 83L, 84L, 90L, 75L, 74L, 74L, - 76L, 11L, 2L, 80L, 81L, 85L, 90L, 77L, 80L, 77L, 83L, 77L, 73L, - 73L, 73L, 73L, 81L, 75L, 80L, 90L, 5L, 11L, 3L, 3L, 77L, 77L, - 84L, 82L, 77L, 82L, 74L, 89L, 74L, 89L, 89L, 79L, 79L, 89L, 89L, - 79L, 79L, 80L, 77L, 80L, 78L, 80L, 80L, 80L, 73L, 86L, 86L, 5L, - 7L, 14L, 7L, 15L, 7L, 14L, 8L, 80L, 81L, 80L, 87L, 87L, 87L, - 87L, 87L, 79L, 81L, 78L, 77L, 74L, 8L, 4L, 14L, 14L, 75L, 75L, - 74L, 74L, 74L, 74L, 74L, 72L, 11L, 3L, 6L, 14L, 7L, 11L, 87L, - 87L, 87L, 86L, 87L, 78L, 76L, 7L, 4L, 14L, 9L, 3L, 5L, 9L, 5L, - 2L, 2L, 72L, 79L, 85L, 73L, 74L, 72L, 86L, 86L, 78L, 5L, 4L, - 6L, 11L, 7L, 7L, 7L, 1L, 4L, 11L, 72L, 84L, 84L, 85L, 81L, 76L, - 81L, 85L, 78L, 78L, 77L, 81L, 80L, 84L, 86L, 90L, 74L, 74L, 72L, - 88L, 62L, 58L, 88L, 88L, 88L, 88L, 62L, 62L, 60L, 38L, 54L, 69L, - 69L, 59L, 59L, 59L, 68L, 87L, 86L, 77L, 84L, 80L, 83L, 81L, 72L, - 74L, 86L, 74L, 59L, 88L, 68L, 66L, 59L, 66L, 69L, 38L, 52L, 60L, - 68L, 59L, 59L, 66L, 60L, 59L, 64L, 74L, 74L, 84L, 85L, 77L, 90L, - 77L, 87L, 74L, 75L, 90L, 69L, 69L, 63L, 63L, 58L, 69L, 69L, 69L, - 69L, 52L, 38L, 71L, 69L, 69L, 74L, 84L, 81L, 85L, 77L, 85L, 76L, - 81L, 49L, 49L, 47L, 48L, 49L, 44L, 44L, 44L, 41L, 54L, 88L, 61L, - 70L, 52L, 54L, 54L, 88L, 64L, 60L, 60L, 69L, 71L, 54L, 68L, 69L, - 62L, 70L, 64L, 86L, 74L, 77L, 75L, 90L, 81L, 81L, 77L, 78L, 44L, - 49L, 49L, 43L, 51L, 50L, 50L, 47L, 47L, 41L, 44L, 44L, 40L, 44L, - 56L, 50L, 64L, 70L, 69L, 68L, 69L, 61L, 63L, 69L, 69L, 69L, 61L, - 64L, 47L, 47L, 47L, 54L, 50L, 50L, 50L, 50L, 51L, 53L, 44L, 45L, - 42L, 56L, 67L, 56L, 56L, 56L, 56L, 56L, 70L, 62L, 62L, 52L, 38L, - 69L, 60L, 54L, 63L, 63L, 53L, 53L, 67L, 67L, 53L, 42L, 53L, 57L, - 45L, 53L, 56L, 53L, 53L, 42L, 57L, 46L, 45L, 69L, 69L, 63L, 62L, - 70L, 88L, 71L, 78L, 76L, 76L, 82L, 78L, 16L, 90L, 84L, 76L, 90L, - 75L, 42L, 53L, 41L, 10L, 57L, 57L, 10L, 57L, 57L, 57L, 10L, 45L, - 50L, 53L, 10L, 57L, 51L, 45L, 53L, 47L, 41L, 90L, 90L, 90L, 77L, - 83L, 85L, 72L, 72L, 85L, 87L, 82L, 76L, 84L, 75L, 72L, 77L, 57L, - 42L, 40L, 45L, 45L, 53L, 57L, 41L, 48L, 10L, 10L, 41L, 46L, 41L, - 51L, 49L, 45L, 45L, 76L, 80L, 80L, 81L, 83L, 80L, 87L, 85L, 86L, - 90L, 90L, 16L, 16L, 75L, 41L, 43L, 43L, 46L, 51L, 43L, 48L, 41L, - 62L, 62L, 69L, 60L, 52L, 54L, 85L, 90L, 90L, 90L, 83L, 77L, 77L, - 83L, 83L, 83L, 83L, 77L, 90L, 90L, 87L, 77L, 90L, 90L, 80L, 80L, - 77L, 82L, 52L, 69L, 38L, 64L, 59L, 69L, 70L, 61L, 69L, 69L, 63L, - 73L, 73L, 73L, 74L, 81L, 90L, 89L, 89L, 89L, 79L, 89L, 89L, 89L, - 79L, 87L, 79L, 79L, 80L, 80L, 79L, 80L, 78L, 80L, 59L, 69L, 64L, - 69L, 69L, 71L, 71L, 61L, 60L, 61L, 61L, 52L, 64L, 60L, 60L, 71L, - 52L, 80L, 80L, 87L, 87L, 87L, 87L, 74L, 74L, 78L, 90L, 87L, 87L, - 74L, 87L, 87L, 87L, 75L, 74L, 80L, 86L, 38L, 69L, 69L, 54L, 38L, - 52L, 38L, 38L, 52L, 38L, 38L, 65L, 70L, 64L, 72L, 87L, 74L, 72L, - 84L, 84L, 81L, 76L, 81L, 76L, 86L, 86L, 74L, 76L, 80L, 80L, 72L, - 74L, 86L, 72L, 70L, 63L, 64L, 58L, 62L, 54L, 88L, 88L, 88L, 88L, - 64L, 88L, 71L, 64L, 62L, 64L, 86L, 86L, 86L, 86L, 86L, 80L, 86L, - 85L, 81L, 85L, 80L, 90L, 83L, 80L, 81L, 81L, 74L, 78L, 71L, 38L, - 70L, 66L, 59L, 66L, 88L, 64L, 70L, 54L, 88L, 65L, 61L, 61L, 38L, - 60L, 87L, 75L, 16L, 83L, 87L, 87L, 87L, 87L, 72L, 74L, 72L, 62L, - 62L, 54L, 66L, 71L, 61L, 60L, 69L, 69L, 62L, 63L, 64L, 84L, 74L, - 87L, 72L, 74L, 84L, 86L, 86L, 80L, 80L, 66L, 63L, 64L, 69L, 70L, - 69L, 64L, 66L, 70L, 69L, 58L, 54L, 69L, 66L, 63L, 69L, 72L, 80L, - 80L, 80L, 84L, 77L, 78L, 17L, 22L, 22L, 18L, 27L, 27L, 27L, 42L, - 55L, 49L, 55L, 69L, 71L, 71L, 90L, 72L, 87L, 87L, 41L, 47L, 67L, - 50L, 51L, 48L, 57L, 57L, 57L, 45L, 46L, 47L, 60L, 70L, 60L, 61L, - 69L, 54L, 65L, 86L, 80L, 80L, 76L, 78L, 83L, 90L, 53L, 49L, 56L, - 57L, 49L, 46L, 45L, 45L, 47L, 47L, 45L, 45L, 41L, 40L, 52L, 64L, - 52L, 64L, 38L, 83L, 83L, 85L, 77L, 83L, 44L, 40L, 10L, 49L, 49L, - 47L, 49L, 49L, 49L, 40L, 44L, 56L, 54L, 44L, 70L, 70L, 54L, 52L, - 64L, 64L, 62L, 64L, 52L, 76L, 76L, 86L, 84L, 90L, 82L, 73L, 46L, - 41L, 40L, 50L, 50L, 50L, 41L, 53L, 44L, 54L, 45L, 55L, 44L, 44L, - 51L, 67L, 45L, 64L, 88L, 88L, 88L, 64L, 65L, 64L, 64L, 62L, 62L, - 76L, 77L, 77L, 80L, 82L, 82L, 79L, 82L, 77L, 45L, 45L, 50L, 51L, - 47L, 48L, 48L, 45L, 56L, 47L, 56L, 56L, 56L, 56L, 56L, 42L, 56L, - 58L, 58L, 58L, 58L, 64L, 62L, 68L, 71L, 62L, 69L, 80L, 80L, 56L, - 56L, 42L, 44L, 50L, 67L, 67L, 67L, 57L, 67L, 56L, 56L, 57L, 57L, - 57L, 10L, 10L, 10L, 57L, 57L, 10L, 46L, 45L, 65L, 84L, 76L, 80L, - 80L, 80L, 79L, 75L, 90L, 85L, 90L, 82L, 74L, 74L, 74L, 89L, 79L, - 53L, 42L, 57L, 10L, 10L, 10L, 49L, 40L, 42L, 47L, 46L, 50L, 53L, - 49L, 88L, 65L, 60L, 54L, 59L, 59L, 59L, 59L, 68L, 69L, 69L, 74L, - 87L, 80L, 90L, 16L, 85L, 89L, 79L, 89L, 82L, 82L, 45L, 53L, 56L, - 43L, 68L, 69L, 69L, 69L, 60L, 66L, 69L, 69L, 82L, 77L, 90L, 87L, - 75L, 74L, 79L, 79L, 74L, 80L, 45L, 55L, 10L, 70L, 65L, 52L, 59L, - 69L, 69L, 75L, 77L, 90L, 82L, 16L, 77L, 75L, 80L, 80L, 74L, 87L, - 87L, 87L, 49L, 53L, 53L, 57L, 59L, 66L, 66L, 66L, 69L, 69L, 69L, - 69L, 62L, 64L, 65L, 69L, 77L, 80L, 77L, 90L, 90L, 80L, 85L, 75L, - 87L, 87L, 51L, 51L, 41L, 69L, 66L, 69L, 66L, 60L, 54L, 38L, 88L, - 61L, 81L, 77L, 77L, 77L, 77L, 80L, 80L, 74L, 51L, 49L, 47L, 40L, - 51L, 70L, 70L, 59L, 52L, 27L, 35L, 36L, 36L, 36L, 25L, 36L, 36L, - 30L, 33L, 16L, 25L, 28L, 36L, 36L, 21L, 35L, 36L, 4L, 5L, 22L, - 35L, 35L, 36L, 34L, 34L, 34L, 3L, 4L, 23L, 19L, 28L, 22L, 22L, - 22L, 24L, 3L, 13L, 7L, 23L, 23L, 23L, 23L, 35L, 19L, 12L, 31L, - 28L, 28L, 34L, 34L, 7L, 2L, 23L, 12L, 12L, 37L, 34L, 34L, 21L, - 36L, 29L, 29L, 27L, 21L, 21L, 34L, 2L, 4L, 2L, 34L, 34L, 36L, - 16L, 36L, 19L, 8L, 8L, 34L, 34L, 34L, 30L, 19L, 22L, 7L, 14L, - 34L, 17L, 35L, 37L, 37L, 1L, 4L, 13L, 21L, 23L, 16L, 35L, 17L, - 36L, 22L, 19L, 17L, 34L, 23L, 30L, 23L, 23L, 23L, 23L, 28L, 36L, - 21L, 25L, 35L, 26L, 22L, 28L, 34L, 34L, 22L, 36L, 24L, 24L, 36L, - 23L, 22L, 17L, 17L, 27L, 24L, 24L, 28L, 28L, 17L, 22L, 22L, 22L, - 19L, 19L, 19L, 17L, 34L, 25L, 29L, 25L, 16L, 30L, 28L, 28L, 22L, - 36L, 36L, 28L, 19L, 19L, 19L, 34L, 36L, 36L, 28L, 19L, 25L, 3L, - 49L, 50L, 50L, 51L, 51L, 40L, 47L, 54L, 70L, 88L, 88L, 88L, 64L, - 88L, 64L, 88L, 88L, 66L, 69L, 69L, 63L, 63L, 63L, 58L, 63L, 80L, - 84L, 84L, 86L, 81L, 85L, 79L, 82L, 74L, 74L, 82L, 87L, 74L, 78L, - 76L, 85L, 77L, 78L, 14L, 14L, 4L, 11L, 8L, 8L, 9L, 1L, 8L, 8L, - 14L, 7L, 11L, 5L, 11L, 8L, 11L, 2L, 3L, 4L, 4L, 7L, 4L, 4L, 15L, - 4L, 9L, 4L, 67L, 42L, 56L, 56L, 56L, 56L, 51L, 56L, 51L, 41L, - 44L, 49L, 56L, 41L, 53L, 46L, 56L, 56L, 50L, 67L, 64L, 54L, 65L, - 65L, 62L, 64L, 58L, 58L, 88L, 69L, 69L, 88L, 69L, 38L, 69L, 69L, - 38L, 85L, 77L, 84L, 77L, 74L, 89L, 79L, 79L, 89L, 89L, 79L, 89L, - 82L, 89L, 87L, 85L, 83L, 82L, 82L, 75L, 78L, 74L, 76L, 74L, 4L, - 3L, 6L, 11L, 5L, 5L, 14L, 8L, 14L, 8L, 13L, 8L, 8L, 13L, 5L, - 2L, 7L, 13L, 2L, 9L, 9L, 11L, 5L, 11L, 5L, 5L, 5L, 11L, 4L, 15L, - 15L, 7L, 7L, 11L, 4L, 8L, 11L, 11L, 7L, 4L, 7L, 15L, 56L, 67L, - 56L, 67L, 67L, 54L, 46L, 67L, 51L, 56L, 40L, 67L, 68L, 62L, 70L, - 65L, 59L, 54L, 54L, 54L, 38L, 38L, 68L, 69L, 88L, 69L, 52L, 70L, - 69L, 59L, 90L, 80L, 75L, 90L, 89L, 89L, 79L, 79L, 75L, 79L, 87L, - 80L, 80L, 74L, 72L, 77L, 76L, 84L, 86L, 77L, 85L, 86L, 78L, 84L, - 84L, 90L, 84L, 84L, 90L, 2L, 2L, 4L, 6L, 13L, 13L, 1L, 3L, 8L, - 8L, 11L, 11L, 13L, 1L, 7L, 14L, 5L, 15L, 5L, 16L, 36L, 19L, 30L, - 27L, 36L, 36L, 21L, 19L, 39L, 39L, 22L, 22L, 67L, 57L, 57L, 57L, - 10L, 57L, 57L, 57L, 77L, 87L, 87L, 84L, 3L, 1L, 13L, 15L, 5L, - 8L, 11L, 8L, 4L, 2L, 4L, 7L, 15L, 15L, 13L, 7L, 15L, 8L, 4L, - 5L, 4L, 15L, 15L, 4L, 4L, 4L, 15L, 15L, 15L, 15L, 15L, 39L, 22L, - 27L, 23L, 19L, 27L, 27L, 18L, 36L, 24L, 22L, 35L, 23L, 37L, 29L, - 57L, 57L, 67L, 51L, 51L, 53L, 53L, 85L, 87L, 85L, 84L, 72L, 87L, - 87L, 75L, 79L, 34L, 24L, 27L, 35L, 35L, 45L, 40L, 41L, 40L, 49L, - 40L, 41L, 51L, 47L, 48L, 44L, 48L, 45L, 57L, 10L, 44L, 53L, 53L, - 7L, 56L, 75L, 81L, 75L, 77L, 83L, 72L, 79L, 55L, 56L, 46L, 45L, - 43L, 51L, 47L, 57L, 67L, 46L, 51L, 10L, 48L, 41L, 46L, 10L, 83L, - 85L, 74L, 87L, 87L, 75L, 74L, 86L, 51L, 44L, 45L, 44L, 49L, 45L, - 53L, 49L, 46L, 57L, 47L, 90L, 87L, 85L, 80L, 75L, 84L, 44L, 46L, - 51L, 46L, 67L, 51L, 44L, 51L, 16L, 16L, 81L, 85L, 72L, 72L, 80L, - 90L, 74L, 74L, 43L, 46L, 43L, 40L, 55L, 48L, 57L, 51L, 63L, 62L, - 64L, 70L, 64L, 61L, 73L, 16L, 84L, 84L, 77L, 77L, 74L, 72L, 84L, - 81L, 85L, 76L, 81L, 44L, 44L, 45L, 51L, 57L, 51L, 51L, 51L, 57L, - 71L, 61L, 54L, 60L, 83L, 84L, 76L, 86L, 86L, 86L, 81L, 43L, 50L, - 50L, 50L, 41L, 57L, 61L, 71L, 63L, 54L, 69L, 61L, 83L, 83L, 90L, - 83L, 90L, 77L, 74L, 86L, 86L, 86L, 51L, 44L, 45L, 41L, 44L, 45L, - 65L, 60L, 88L, 62L, 70L, 70L, 63L, 69L, 69L, 69L, 69L, 63L, 77L, - 74L, 80L, 87L, 87L, 87L, 77L, 77L, 81L, 86L, 82L, 86L, 41L, 40L, - 53L, 46L, 41L, 69L, 63L, 61L, 64L, 69L, 88L, 70L, 52L, 59L, 88L, - 59L, 59L, 62L, 62L, 64L, 88L, 58L, 69L, 69L, 83L, 78L, 76L, 85L, - 77L, 77L, 90L, 75L, 80L, 75L, 90L, 74L, 74L, 72L, 13L, 14L, 5L, - 5L, 2L, 7L, 5L, 7L, 51L, 44L, 51L, 71L, 54L, 52L, 52L, 64L, 60L, - 61L, 61L, 60L, 68L, 68L, 71L, 68L, 59L, 66L, 71L, 71L, 66L, 69L, - 63L, 71L, 64L, 71L, 69L, 80L, 90L, 80L, 82L, 78L, 84L, 76L, 85L, - 86L, 2L, 8L, 2L, 51L, 43L, 71L, 62L, 65L, 64L, 38L, 38L, 65L, - 58L, 38L, 65L, 69L, 63L, 70L, 54L, 59L, 59L, 66L, 66L, 60L, 69L, - 85L, 83L, 87L, 80L, 73L, 79L, 79L, 82L, 77L, 76L, 74L, 78L, 78L, - 90L, 74L, 74L, 87L, 86L, 8L, 5L, 7L, 4L, 4L, 70L, 72L, 82L, 89L, - 80L, 87L, 85L, 87L, 87L, 87L, 83L, 76L, 63L, 69L, 38L, 38L, 81L, - 73L, 90L, 79L, 87L, 75L, 80L, 80L, 80L, 75L, 78L, 80L, 86L, 76L, - 87L, 80L, 90L, 74L, 64L, 65L, 62L, 69L, 16L, 16L, 77L, 77L, 90L, - 90L, 80L, 80L, 80L, 72L, 72L, 78L, 79L, 85L, 74L, 74L, 75L, 65L, - 62L, 58L, 70L, 90L, 72L, 87L, 86L, 85L, 74L, 75L, 75L, 84L, 75L, - 75L, 90L, 87L, 77L, 78L, 85L, 69L, 66L, 66L, 86L, 82L, 74L, 84L, - 90L, 77L, 77L, 59L, 59L, 66L, 59L, 75L, 75L, 84L, 84L, 83L, 83L, - 90L, 66L, 66L, 66L, 66L, 52L, 61L, 82L, 78L, 84L, 85L, 86L, 90L, - 90L, 87L, 90L, 69L, 69L, 58L, 69L, 58L, 63L, 69L, 81L, 86L, 87L, - 76L, 90L, 77L, 69L, 72L, 81L, 69L, 69L, 69L, 54L, 66L, 64L, 64L, - 84L, 87L, 80L, 80L, 80L, 87L, 54L, 71L, 61L, 54L, 80L, 77L, 90L, - 64L, 52L, 64L, 54L, 52L, 77L, 84L, 90L, 85L, 90L, 90L, 77L, 73L, - 87L, 87L, 87L, 87L, 74L, 78L, 84L, 85L, 76L, 69L, 69L, 63L, 88L, - 58L, 70L, 90L, 90L, 80L, 80L, 84L, 84L, 87L, 87L, 87L, 74L, 89L, - 76L, 86L, 87L, 86L, 81L, 90L, 54L, 52L, 71L, 60L, 60L, 16L, 16L, - 81L, 73L, 79L, 79L, 89L, 86L, 86L, 80L, 76L, 76L, 85L, 87L, 75L, - 77L, 55L, 45L, 46L, 46L, 56L, 42L, 46L, 49L, 55L, 70L, 71L, 69L, - 38L, 69L, 4L, 15L, 3L, 13L, 2L, 15L, 2L, 2L, 2L, 2L, 8L, 2L, - 15L, 51L, 44L, 44L, 46L, 46L, 40L, 44L, 43L, 43L, 49L, 50L, 50L, - 55L, 46L, 57L, 60L, 62L, 63L, 69L, 63L, 85L, 85L, 81L, 80L, 80L, - 80L, 84L, 80L, 87L, 85L, 81L, 86L, 85L, 81L, 85L, 86L, 85L, 6L, - 1L, 2L, 4L, 1L, 6L, 3L, 8L, 28L, 27L, 22L, 23L, 23L, 22L, 22L, - 30L, 34L, 22L, 19L, 28L, 36L, 44L, 55L, 45L, 50L, 48L, 57L, 41L, - 49L, 44L, 43L, 40L, 51L, 68L, 61L, 66L, 64L, 61L, 61L, 52L, 4L, - 15L, 4L, 13L, 1L, 14L, 14L, 5L, 26L, 19L, 19L, 31L, 18L, 28L, - 19L, 54L, 44L, 42L, 42L, 42L, 42L, 56L, 56L, 56L, 56L, 56L, 41L, - 41L, 56L, 56L, 40L, 56L, 50L, 57L, 67L, 67L, 84L, 87L, 87L, 83L, - 85L, 74L, 77L, 78L, 74L, 84L, 84L, 84L, 90L, 90L, 86L, 85L, 80L, - 79L, 86L, 87L, 80L, 82L, 75L, 86L, 78L, 2L, 15L, 14L, 8L, 8L, - 8L, 14L, 14L, 8L, 28L, 23L, 26L, 16L, 16L, 6L, 30L, 25L, 28L, - 41L, 40L, 44L, 51L, 51L, 51L, 51L, 48L, 49L, 61L, 61L, 60L, 61L, - 61L, 66L, 59L, 66L, 66L, 69L, 36L, 19L, 22L, 36L, 36L, 23L, 19L, - 28L, 19L, 36L, 22L, 22L, 36L, 36L, 28L, 28L, 28L, 27L, 57L, 57L, - 10L, 53L, 53L, 57L, 57L, 10L, 46L, 45L, 57L, 10L, 10L, 10L, 49L, - 51L, 45L, 67L, 53L, 53L, 41L, 43L, 44L, 85L, 86L, 86L, 86L, 85L, - 77L, 77L, 76L, 86L, 82L, 77L, 2L, 5L, 7L, 1L, 7L, 7L, 7L, 9L, - 14L, 17L, 23L, 35L, 22L, 22L, 22L, 22L, 23L, 22L, 34L, 17L, 35L, - 35L, 21L, 21L, 47L, 53L, 44L, 44L, 44L, 61L, 52L, 52L, 52L, 86L, - 81L, 87L, 72L, 83L, 82L, 84L, 84L, 90L, 76L, 89L, 86L, 81L, 72L, - 75L, 76L, 36L, 23L, 23L, 23L, 28L, 23L, 36L, 12L, 20L, 17L, 23L, - 23L, 22L, 22L, 22L, 22L, 23L, 23L, 23L, 23L, 74L, 86L, 14L, 15L, - 11L, 11L, 11L, 11L, 11L, 6L, 23L, 19L, 19L, 19L, 19L, 19L, 19L, - 28L, 21L, 22L, 22L, 22L, 34L, 44L, 46L, 55L, 56L, 40L, 41L, 60L, - 63L, 69L, 69L, 78L, 80L, 87L, 74L, 80L, 74L, 81L, 90L, 74L, 86L, - 77L, 74L, 76L, 23L, 22L, 22L, 19L, 12L, 22L, 22L, 36L, 30L, 20L, - 33L, 17L, 35L, 35L, 35L, 19L, 86L, 86L, 16L, 82L, 25L, 80L, 74L, - 5L, 5L, 5L, 6L, 11L, 5L, 6L, 5L, 23L, 30L, 17L, 35L, 35L, 35L, - 12L, 19L, 34L, 37L, 36L, 21L, 45L, 42L, 42L, 56L, 53L, 56L, 56L, - 56L, 56L, 38L, 52L, 81L, 77L, 74L, 74L, 84L, 82L, 75L, 86L, 85L, - 72L, 72L, 37L, 12L, 12L, 12L, 12L, 12L, 12L, 12L, 29L, 21L, 34L, - 21L, 21L, 21L, 34L, 34L, 34L, 34L, 34L, 34L, 17L, 17L, 34L, 53L, - 53L, 53L, 40L, 45L, 46L, 53L, 42L, 10L, 48L, 48L, 53L, 10L, 53L, - 45L, 54L, 77L, 77L, 85L, 77L, 72L, 90L, 16L, 75L, 86L, 72L, 81L, - 75L, 90L, 90L, 79L, 90L, 81L, 87L, 72L, 78L, 77L, 80L, 9L, 7L, - 5L, 5L, 9L, 7L, 4L, 4L, 12L, 12L, 37L, 12L, 37L, 12L, 12L, 12L, - 12L, 12L, 30L, 36L, 34L, 21L, 35L, 27L, 18L, 56L, 56L, 56L, 67L, - 53L, 64L, 38L, 64L, 65L, 65L, 86L, 80L, 84L, 76L, 72L, 73L, 76L, - 74L, 16L, 82L, 74L, 17L, 30L, 36L, 36L, 36L, 18L, 34L, 34L, 29L, - 29L, 34L, 34L, 17L, 34L, 17L, 17L, 29L, 54L, 45L, 45L, 49L, 49L, - 41L, 51L, 41L, 41L, 45L, 40L, 40L, 51L, 41L, 53L, 16L, 86L, 73L, - 90L, 72L, 16L, 16L, 82L, 84L, 90L, 77L, 78L, 80L, 81L, 15L, 15L, - 15L, 7L, 11L, 11L, 11L, 21L, 21L, 21L, 34L, 34L, 36L, 19L, 23L, - 34L, 36L, 25L, 53L, 56L, 56L, 56L, 54L, 64L, 64L, 64L, 63L, 63L, - 62L, 54L, 84L, 81L, 79L, 1L, 5L, 3L, 6L, 8L, 2L, 2L, 3L, 4L, - 4L, 7L, 1L, 15L, 34L, 34L, 34L, 34L, 34L, 27L, 29L, 28L, 36L, - 31L, 25L, 36L, 36L, 34L, 42L, 53L, 51L, 48L, 71L, 88L, 62L, 69L, - 38L, 70L, 88L, 62L, 68L, 60L, 77L, 77L, 83L, 77L, 74L, 90L, 74L, - 87L, 74L, 74L, 82L, 11L, 13L, 4L, 7L, 11L, 11L, 11L, 7L, 7L, - 4L, 34L, 34L, 34L, 34L, 17L, 17L, 47L, 45L, 67L, 67L, 57L, 67L, - 53L, 49L, 64L, 64L, 88L, 64L, 88L, 9L, 3L, 7L, 4L, 11L, 2L, 4L, - 3L, 8L, 3L, 3L, 6L, 3L, 11L, 11L, 4L, 27L, 27L, 27L, 30L, 33L, - 33L, 16L, 16L, 34L, 12L, 26L, 16L, 22L, 22L, 22L, 65L, 38L, 63L, - 68L, 71L, 71L, 65L, 61L, 71L, 61L, 61L, 61L, 60L, 60L, 84L, 83L, - 86L, 86L, 84L, 74L, 86L, 77L, 72L, 81L, 81L, 7L, 7L, 4L, 15L, - 15L, 15L, 15L, 17L, 36L, 31L, 36L, 34L, 34L, 34L, 34L, 34L, 34L, - 43L, 46L, 42L, 57L, 51L, 67L, 67L, 53L, 88L, 88L, 88L, 88L, 64L, - 1L, 2L, 5L, 2L, 14L, 2L, 3L, 14L, 14L, 14L, 34L, 36L, 22L, 36L, - 37L, 21L, 27L, 31L, 26L, 22L, 24L, 24L, 24L, 28L, 28L, 27L, 30L, - 30L, 27L, 30L, 30L, 19L, 22L, 34L, 61L, 60L, 52L, 69L, 65L, 65L, - 52L, 52L, 38L, 38L, 38L, 64L, 65L, 63L, 64L, 88L, 77L, 83L, 85L, - 80L, 77L, 81L, 90L, 74L, 74L, 86L, 77L, 5L, 7L, 1L, 5L, 7L, 15L, - 34L, 17L, 17L, 17L, 34L, 34L, 29L, 16L, 43L, 45L, 49L, 41L, 56L, - 10L, 57L, 57L, 57L, 65L, 64L, 62L, 64L, 58L, 2L, 1L, 13L, 1L, - 5L, 5L, 8L, 8L, 8L, 14L, 13L, 8L, 5L, 2L, 2L, 2L, 11L, 13L, 2L, - 33L, 27L, 27L, 30L, 28L, 28L, 30L, 30L, 22L, 17L, 22L, 37L, 17L, - 36L, 36L, 35L, 22L, 19L, 30L, 39L, 22L, 39L, 54L, 54L, 64L, 59L, - 64L, 88L, 52L, 62L, 62L, 62L, 62L, 63L, 88L, 88L, 88L, 88L, 90L, - 77L, 83L, 73L, 82L, 82L, 82L, 84L, 90L, 87L, 77L, 77L, 78L, 7L, - 7L, 4L, 4L, 4L, 4L, 35L, 18L, 27L, 30L, 36L, 36L, 53L, 57L, 57L, - 51L, 10L, 10L, 41L, 41L, 41L, 54L, 45L, 58L, 58L, 62L, 58L, 1L, - 9L, 7L, 4L, 7L, 7L, 13L, 9L, 5L, 3L, 5L, 7L, 1L, 27L, 12L, 35L, - 19L, 19L, 28L, 17L, 27L, 27L, 16L, 27L, 56L, 88L, 88L, 58L, 58L, - 52L, 52L, 59L, 59L, 68L, 68L, 68L, 69L, 61L, 64L, 59L, 79L, 82L, - 83L, 89L, 89L, 89L, 74L, 89L, 89L, 89L, 89L, 86L, 81L, 81L, 85L, - 83L, 84L, 81L, 4L, 15L, 5L, 4L, 7L, 4L, 3L, 17L, 37L, 18L, 49L, - 10L, 57L, 57L, 10L, 47L, 53L, 46L, 51L, 41L, 58L, 1L, 7L, 7L, - 7L, 2L, 4L, 14L, 11L, 5L, 6L, 5L, 4L, 5L, 5L, 7L, 5L, 55L, 55L, - 49L, 40L, 45L, 43L, 45L, 69L, 59L, 54L, 66L, 69L, 66L, 66L, 69L, - 66L, 66L, 66L, 66L, 69L, 61L, 80L, 80L, 80L, 80L, 80L, 80L, 80L, - 81L, 87L, 77L, 81L, 90L, 86L, 15L, 3L, 6L, 7L, 2L, 2L, 3L, 3L, - 3L, 4L, 4L, 3L, 2L, 2L, 2L, 35L, 35L, 20L, 22L, 37L, 47L, 42L, - 67L, 57L, 40L, 47L, 55L, 67L, 67L, 67L, 45L, 51L, 59L, 63L, 38L, - 38L, 61L, 54L, 68L, 52L, 52L, 54L, 5L, 7L, 9L, 4L, 7L, 11L, 11L, - 13L, 11L, 4L, 1L, 5L, 7L, 7L, 7L, 11L, 11L, 11L, 51L, 40L, 46L, - 57L, 57L, 10L, 53L, 40L, 43L, 41L, 64L, 66L, 69L, 69L, 69L, 69L, - 69L, 69L, 69L, 69L, 69L, 70L, 54L, 70L, 69L, 87L, 87L, 87L, 87L, - 87L, 87L, 74L, 79L, 85L, 75L, 3L, 9L, 4L, 7L, 14L, 2L, 3L, 4L, - 13L, 25L, 21L, 31L, 28L, 22L, 26L, 22L, 34L, 36L, 22L, 47L, 40L, - 41L, 45L, 57L, 10L, 41L, 40L, 45L, 46L, 53L, 49L, 88L, 70L, 52L, - 70L, 52L, 54L, 59L, 4L, 7L, 7L, 4L, 15L, 15L, 15L, 15L, 15L, - 15L, 1L, 14L, 4L, 15L, 14L, 41L, 43L, 40L, 44L, 44L, 57L, 46L, - 54L, 40L, 44L, 47L, 40L, 54L, 40L, 38L, 88L, 69L, 38L, 88L, 61L, - 88L, 59L, 52L, 70L, 61L, 61L, 70L, 61L, 63L, 65L, 70L, 87L, 87L, - 75L, 74L, 6L, 4L, 1L, 36L, 36L, 19L, 19L, 19L, 37L, 34L, 30L, - 25L, 17L, 45L, 53L, 51L, 57L, 49L, 67L, 57L, 45L, 57L, 53L, 46L, - 63L, 69L, 69L, 69L, 59L, 68L, 59L, 38L, 63L, 60L, 7L, 15L, 15L, - 7L, 15L, 15L, 15L, 4L, 15L, 15L, 8L, 5L, 14L, 13L, 3L, 4L, 4L, - 3L, 1L, 40L, 44L, 44L, 54L, 41L, 49L, 50L, 50L, 50L, 41L, 41L, - 41L, 47L, 44L, 41L, 49L, 63L, 69L, 65L, 70L, 70L, 62L, 62L, 65L, - 54L, 61L, 78L, 72L, 78L, 72L, 87L, 72L, 74L, 78L, 84L, 84L, 84L, - 4L, 4L, 4L, 5L, 4L, 3L, 7L, 3L, 2L, 4L, 5L, 7L, 13L, 13L, 36L, - 36L, 36L, 28L, 22L, 25L, 22L, 24L, 29L, 29L, 30L, 18L, 28L, 49L, - 49L) - + + expected <- c( + 64L, 69L, 66L, 66L, 69L, 70L, 70L, 69L, 63L, 68L, 38L, 54L, + 62L, 54L, 71L, 38L, 52L, 52L, 82L, 79L, 73L, 84L, 87L, 76L, 77L, + 74L, 80L, 79L, 89L, 2L, 5L, 4L, 3L, 7L, 5L, 5L, 2L, 4L, 4L, 4L, + 14L, 2L, 36L, 24L, 30L, 27L, 22L, 36L, 36L, 19L, 34L, 49L, 44L, + 56L, 49L, 40L, 28L, 28L, 23L, 34L, 30L, 36L, 12L, 33L, 22L, 23L, + 23L, 23L, 23L, 35L, 22L, 22L, 22L, 22L, 22L, 67L, 51L, 51L, 49L, + 43L, 10L, 53L, 53L, 45L, 55L, 55L, 53L, 43L, 51L, 57L, 90L, 90L, + 90L, 80L, 77L, 82L, 73L, 82L, 73L, 82L, 77L, 76L, 77L, 78L, 79L, + 79L, 79L, 82L, 79L, 87L, 79L, 80L, 1L, 2L, 6L, 1L, 4L, 4L, 2L, + 5L, 5L, 5L, 18L, 25L, 18L, 51L, 10L, 40L, 53L, 40L, 41L, 41L, + 67L, 41L, 43L, 10L, 52L, 68L, 88L, 70L, 65L, 52L, 64L, 64L, 63L, + 38L, 69L, 70L, 70L, 58L, 69L, 64L, 54L, 69L, 58L, 89L, 79L, 87L, + 87L, 87L, 87L, 87L, 2L, 3L, 7L, 13L, 3L, 3L, 6L, 11L, 11L, 4L, + 4L, 2L, 1L, 6L, 1L, 3L, 1L, 1L, 43L, 49L, 48L, 46L, 46L, 43L, + 54L, 43L, 10L, 41L, 48L, 22L, 23L, 19L, 28L, 23L, 27L, 30L, 35L, + 35L, 35L, 35L, 35L, 19L, 19L, 19L, 19L, 12L, 37L, 12L, 57L, 51L, + 51L, 46L, 51L, 44L, 43L, 56L, 56L, 10L, 51L, 51L, 48L, 41L, 51L, + 80L, 80L, 80L, 80L, 80L, 77L, 80L, 87L, 87L, 87L, 87L, 87L, 87L, + 87L, 86L, 79L, 82L, 74L, 74L, 36L, 28L, 19L, 27L, 36L, 36L, 26L, + 23L, 23L, 23L, 21L, 26L, 19L, 35L, 29L, 36L, 23L, 20L, 20L, 38L, + 88L, 69L, 52L, 69L, 70L, 69L, 68L, 54L, 38L, 65L, 54L, 59L, 88L, + 89L, 79L, 79L, 79L, 79L, 76L, 79L, 72L, 5L, 4L, 1L, 2L, 5L, 7L, + 8L, 1L, 8L, 8L, 8L, 8L, 5L, 3L, 14L, 8L, 14L, 44L, 57L, 67L, + 57L, 42L, 57L, 40L, 40L, 43L, 40L, 49L, 49L, 46L, 54L, 45L, 12L, + 12L, 29L, 12L, 21L, 21L, 21L, 21L, 21L, 21L, 21L, 34L, 34L, 34L, + 34L, 34L, 34L, 17L, 34L, 51L, 47L, 51L, 41L, 44L, 71L, 62L, 63L, + 61L, 61L, 69L, 62L, 69L, 62L, 69L, 69L, 87L, 87L, 75L, 72L, 72L, + 76L, 74L, 72L, 72L, 75L, 79L, 90L, 72L, 78L, 78L, 35L, 26L, 26L, + 30L, 23L, 23L, 35L, 26L, 22L, 22L, 22L, 23L, 23L, 61L, 52L, 54L, + 64L, 60L, 61L, 71L, 61L, 69L, 52L, 61L, 60L, 52L, 60L, 71L, 70L, + 69L, 60L, 54L, 70L, 63L, 70L, 64L, 54L, 61L, 60L, 85L, 80L, 87L, + 80L, 80L, 80L, 77L, 80L, 81L, 76L, 87L, 77L, 14L, 13L, 5L, 8L, + 2L, 2L, 2L, 2L, 11L, 7L, 14L, 11L, 4L, 11L, 2L, 2L, 7L, 5L, 7L, + 11L, 8L, 7L, 7L, 4L, 82L, 80L, 80L, 85L, 87L, 77L, 86L, 16L, + 86L, 74L, 81L, 17L, 17L, 28L, 36L, 36L, 12L, 18L, 18L, 34L, 34L, + 17L, 34L, 29L, 16L, 16L, 18L, 21L, 28L, 36L, 63L, 69L, 69L, 64L, + 65L, 70L, 38L, 52L, 63L, 62L, 72L, 81L, 81L, 81L, 85L, 81L, 76L, + 86L, 79L, 80L, 86L, 86L, 81L, 35L, 22L, 12L, 19L, 19L, 19L, 12L, + 34L, 35L, 35L, 16L, 18L, 6L, 35L, 58L, 88L, 64L, 75L, 87L, 87L, + 87L, 76L, 74L, 90L, 77L, 76L, 81L, 81L, 77L, 84L, 86L, 90L, 16L, + 28L, 36L, 36L, 27L, 30L, 33L, 31L, 16L, 16L, 16L, 36L, 35L, 36L, + 34L, 19L, 62L, 62L, 68L, 71L, 61L, 61L, 61L, 61L, 60L, 59L, 65L, + 66L, 69L, 85L, 86L, 82L, 77L, 77L, 86L, 84L, 76L, 86L, 12L, 12L, + 12L, 12L, 12L, 12L, 12L, 12L, 30L, 21L, 21L, 34L, 34L, 34L, 34L, + 34L, 34L, 17L, 17L, 29L, 36L, 33L, 28L, 34L, 34L, 34L, 88L, 64L, + 88L, 65L, 64L, 62L, 58L, 76L, 87L, 84L, 83L, 80L, 13L, 13L, 4L, + 2L, 5L, 11L, 14L, 5L, 5L, 7L, 4L, 8L, 5L, 13L, 7L, 7L, 4L, 9L, + 85L, 78L, 78L, 81L, 75L, 83L, 90L, 84L, 86L, 21L, 36L, 34L, 18L, + 36L, 22L, 36L, 24L, 29L, 31L, 19L, 16L, 16L, 24L, 36L, 18L, 36L, + 64L, 54L, 52L, 64L, 52L, 64L, 38L, 64L, 38L, 54L, 65L, 60L, 60L, + 60L, 77L, 78L, 80L, 79L, 81L, 90L, 84L, 83L, 79L, 79L, 77L, 76L, + 72L, 74L, 86L, 72L, 74L, 73L, 34L, 34L, 34L, 34L, 34L, 17L, 17L, + 17L, 29L, 16L, 35L, 29L, 27L, 27L, 30L, 16L, 16L, 64L, 62L, 58L, + 88L, 72L, 77L, 72L, 72L, 74L, 4L, 7L, 9L, 15L, 4L, 11L, 7L, 7L, + 11L, 6L, 13L, 11L, 5L, 11L, 7L, 7L, 7L, 4L, 15L, 15L, 15L, 1L, + 4L, 15L, 5L, 5L, 13L, 6L, 14L, 3L, 4L, 4L, 2L, 7L, 4L, 4L, 4L, + 4L, 1L, 21L, 36L, 37L, 36L, 29L, 23L, 22L, 37L, 25L, 16L, 26L, + 25L, 19L, 37L, 34L, 17L, 22L, 12L, 52L, 63L, 62L, 64L, 62L, 58L, + 88L, 88L, 64L, 88L, 65L, 71L, 61L, 64L, 74L, 74L, 75L, 16L, 77L, + 83L, 84L, 87L, 85L, 77L, 86L, 74L, 73L, 76L, 86L, 36L, 25L, 25L, + 22L, 12L, 36L, 16L, 16L, 36L, 27L, 34L, 23L, 34L, 37L, 16L, 22L, + 23L, 27L, 19L, 22L, 58L, 65L, 65L, 87L, 84L, 76L, 85L, 77L, 80L, + 74L, 72L, 84L, 81L, 85L, 5L, 11L, 4L, 4L, 4L, 15L, 15L, 4L, 4L, + 15L, 4L, 8L, 9L, 4L, 1L, 1L, 4L, 4L, 1L, 15L, 15L, 4L, 11L, 2L, + 4L, 4L, 11L, 2L, 11L, 14L, 3L, 3L, 5L, 11L, 4L, 4L, 15L, 27L, + 30L, 19L, 22L, 22L, 22L, 39L, 22L, 30L, 34L, 35L, 34L, 21L, 18L, + 36L, 36L, 36L, 58L, 58L, 88L, 88L, 38L, 38L, 69L, 70L, 59L, 68L, + 69L, 64L, 64L, 68L, 69L, 66L, 66L, 66L, 69L, 66L, 78L, 86L, 78L, + 85L, 75L, 82L, 73L, 84L, 79L, 84L, 77L, 34L, 34L, 16L, 36L, 36L, + 28L, 24L, 36L, 34L, 34L, 17L, 17L, 31L, 32L, 19L, 30L, 24L, 19L, + 54L, 64L, 88L, 69L, 69L, 59L, 59L, 68L, 90L, 90L, 74L, 75L, 76L, + 85L, 1L, 4L, 1L, 4L, 3L, 13L, 9L, 1L, 5L, 7L, 15L, 4L, 1L, 13L, + 19L, 36L, 36L, 36L, 19L, 4L, 5L, 5L, 15L, 5L, 5L, 8L, 2L, 4L, + 3L, 1L, 3L, 11L, 11L, 4L, 13L, 1L, 36L, 36L, 28L, 27L, 27L, 27L, + 18L, 55L, 56L, 40L, 57L, 57L, 38L, 64L, 58L, 60L, 59L, 66L, 61L, + 38L, 65L, 52L, 70L, 66L, 69L, 69L, 69L, 69L, 69L, 69L, 77L, 90L, + 90L, 14L, 14L, 8L, 2L, 2L, 2L, 4L, 15L, 15L, 4L, 4L, 4L, 4L, + 34L, 18L, 34L, 28L, 22L, 19L, 30L, 30L, 22L, 39L, 22L, 22L, 30L, + 26L, 26L, 35L, 36L, 36L, 35L, 68L, 66L, 62L, 90L, 87L, 90L, 77L, + 87L, 80L, 90L, 86L, 79L, 80L, 84L, 81L, 79L, 36L, 22L, 22L, 22L, + 28L, 36L, 28L, 28L, 28L, 28L, 28L, 23L, 23L, 23L, 34L, 26L, 30L, + 28L, 19L, 19L, 2L, 14L, 1L, 14L, 4L, 5L, 9L, 1L, 1L, 1L, 1L, + 46L, 49L, 55L, 54L, 55L, 48L, 46L, 51L, 44L, 46L, 67L, 58L, 69L, + 69L, 69L, 69L, 69L, 69L, 69L, 69L, 69L, 69L, 52L, 60L, 69L, 38L, + 9L, 4L, 4L, 1L, 3L, 5L, 7L, 6L, 11L, 4L, 5L, 5L, 2L, 14L, 14L, + 32L, 3L, 2L, 14L, 82L, 21L, 35L, 36L, 31L, 29L, 24L, 23L, 16L, + 45L, 47L, 57L, 57L, 53L, 57L, 10L, 46L, 49L, 56L, 58L, 66L, 66L, + 66L, 69L, 66L, 66L, 77L, 78L, 83L, 87L, 80L, 80L, 77L, 81L, 81L, + 81L, 81L, 80L, 87L, 17L, 23L, 23L, 23L, 23L, 22L, 22L, 22L, 23L, + 23L, 23L, 19L, 23L, 19L, 19L, 19L, 36L, 26L, 36L, 30L, 35L, 35L, + 1L, 6L, 3L, 8L, 8L, 14L, 2L, 5L, 14L, 2L, 5L, 9L, 15L, 67L, 57L, + 40L, 57L, 57L, 48L, 43L, 44L, 41L, 47L, 41L, 49L, 41L, 41L, 40L, + 57L, 47L, 63L, 38L, 52L, 71L, 61L, 64L, 88L, 68L, 61L, 54L, 69L, + 59L, 68L, 88L, 69L, 69L, 58L, 59L, 71L, 71L, 2L, 2L, 1L, 14L, + 14L, 3L, 2L, 8L, 9L, 5L, 2L, 5L, 5L, 1L, 1L, 8L, 8L, 46L, 56L, + 57L, 57L, 67L, 43L, 57L, 46L, 49L, 67L, 47L, 47L, 43L, 40L, 45L, + 44L, 47L, 45L, 68L, 62L, 62L, 59L, 85L, 90L, 85L, 90L, 90L, 90L, + 16L, 90L, 85L, 16L, 90L, 82L, 85L, 86L, 77L, 87L, 85L, 85L, 79L, + 35L, 35L, 19L, 12L, 12L, 12L, 12L, 37L, 12L, 12L, 12L, 29L, 29L, + 16L, 36L, 30L, 21L, 21L, 34L, 8L, 7L, 14L, 11L, 5L, 1L, 7L, 1L, + 11L, 6L, 7L, 5L, 9L, 9L, 2L, 3L, 4L, 11L, 4L, 2L, 7L, 4L, 4L, + 49L, 40L, 43L, 43L, 49L, 49L, 46L, 46L, 49L, 45L, 45L, 54L, 61L, + 52L, 60L, 52L, 71L, 61L, 63L, 69L, 63L, 62L, 70L, 54L, 70L, 1L, + 3L, 8L, 8L, 8L, 8L, 14L, 14L, 14L, 5L, 5L, 2L, 14L, 14L, 9L, + 11L, 10L, 47L, 49L, 43L, 43L, 49L, 40L, 44L, 44L, 54L, 49L, 49L, + 41L, 51L, 43L, 59L, 68L, 90L, 84L, 77L, 83L, 83L, 83L, 80L, 87L, + 87L, 87L, 86L, 83L, 74L, 81L, 80L, 87L, 83L, 74L, 76L, 78L, 74L, + 81L, 73L, 86L, 87L, 86L, 86L, 74L, 82L, 80L, 72L, 21L, 21L, 21L, + 34L, 34L, 34L, 34L, 34L, 34L, 34L, 34L, 17L, 17L, 17L, 17L, 29L, + 18L, 34L, 34L, 34L, 34L, 17L, 4L, 9L, 15L, 15L, 15L, 7L, 7L, + 11L, 11L, 1L, 13L, 7L, 5L, 7L, 11L, 11L, 11L, 7L, 7L, 7L, 11L, + 40L, 50L, 44L, 47L, 44L, 46L, 46L, 48L, 48L, 43L, 44L, 56L, 50L, + 51L, 56L, 55L, 64L, 54L, 63L, 63L, 63L, 52L, 38L, 58L, 85L, 75L, + 72L, 75L, 76L, 83L, 84L, 2L, 5L, 14L, 7L, 7L, 7L, 1L, 8L, 11L, + 5L, 7L, 5L, 4L, 11L, 5L, 6L, 7L, 11L, 5L, 41L, 47L, 46L, 54L, + 42L, 55L, 42L, 43L, 50L, 50L, 48L, 48L, 53L, 54L, 54L, 68L, 69L, + 69L, 69L, 63L, 63L, 58L, 69L, 90L, 77L, 77L, 77L, 90L, 90L, 77L, + 74L, 84L, 90L, 77L, 77L, 74L, 78L, 81L, 81L, 86L, 85L, 29L, 29L, + 34L, 34L, 16L, 16L, 16L, 29L, 36L, 16L, 36L, 27L, 31L, 31L, 32L, + 19L, 27L, 36L, 36L, 15L, 15L, 1L, 4L, 5L, 15L, 15L, 4L, 15L, + 15L, 15L, 4L, 4L, 15L, 4L, 4L, 15L, 8L, 55L, 55L, 44L, 45L, 42L, + 42L, 42L, 45L, 56L, 56L, 56L, 56L, 56L, 42L, 56L, 51L, 67L, 86L, + 76L, 86L, 80L, 74L, 90L, 85L, 83L, 79L, 79L, 84L, 80L, 9L, 7L, + 13L, 4L, 7L, 4L, 4L, 9L, 9L, 9L, 15L, 11L, 7L, 11L, 1L, 13L, + 13L, 7L, 5L, 7L, 7L, 67L, 42L, 42L, 45L, 56L, 56L, 56L, 56L, + 56L, 56L, 56L, 67L, 56L, 56L, 51L, 56L, 55L, 57L, 57L, 51L, 69L, + 38L, 65L, 70L, 65L, 63L, 63L, 69L, 84L, 73L, 73L, 73L, 79L, 78L, + 78L, 85L, 85L, 78L, 74L, 80L, 82L, 78L, 86L, 81L, 77L, 85L, 16L, + 37L, 22L, 34L, 31L, 34L, 28L, 24L, 36L, 18L, 27L, 27L, 30L, 27L, + 27L, 27L, 36L, 22L, 22L, 34L, 22L, 34L, 9L, 14L, 1L, 4L, 4L, + 3L, 3L, 6L, 1L, 1L, 1L, 2L, 2L, 2L, 14L, 3L, 5L, 51L, 41L, 56L, + 40L, 45L, 45L, 44L, 67L, 67L, 56L, 57L, 57L, 57L, 67L, 51L, 49L, + 46L, 55L, 67L, 67L, 53L, 67L, 74L, 77L, 87L, 74L, 75L, 87L, 90L, + 90L, 90L, 90L, 75L, 85L, 85L, 4L, 11L, 11L, 4L, 7L, 4L, 7L, 4L, + 7L, 7L, 7L, 4L, 15L, 15L, 13L, 9L, 4L, 11L, 15L, 4L, 4L, 15L, + 15L, 42L, 57L, 54L, 54L, 45L, 50L, 56L, 57L, 67L, 57L, 40L, 67L, + 57L, 57L, 10L, 57L, 57L, 57L, 53L, 55L, 42L, 10L, 10L, 42L, 71L, + 38L, 65L, 65L, 70L, 69L, 69L, 61L, 52L, 65L, 54L, 52L, 54L, 38L, + 69L, 68L, 61L, 59L, 82L, 82L, 82L, 80L, 84L, 90L, 87L, 82L, 13L, + 14L, 11L, 2L, 9L, 4L, 2L, 4L, 4L, 4L, 2L, 29L, 28L, 30L, 23L, + 18L, 16L, 24L, 35L, 22L, 21L, 39L, 39L, 19L, 12L, 36L, 36L, 36L, + 21L, 5L, 14L, 4L, 18L, 23L, 36L, 36L, 36L, 36L, 16L, 17L, 36L, + 39L, 36L, 36L, 51L, 57L, 57L, 10L, 10L, 57L, 57L, 57L, 57L, 57L, + 51L, 51L, 49L, 57L, 10L, 41L, 45L, 67L, 10L, 48L, 10L, 49L, 56L, + 79L, 85L, 80L, 80L, 77L, 84L, 90L, 77L, 77L, 77L, 83L, 83L, 83L, + 90L, 90L, 87L, 84L, 90L, 90L, 90L, 4L, 15L, 4L, 1L, 14L, 4L, + 9L, 3L, 7L, 7L, 4L, 5L, 2L, 6L, 5L, 5L, 53L, 41L, 40L, 46L, 51L, + 45L, 51L, 53L, 42L, 46L, 10L, 67L, 49L, 49L, 47L, 55L, 49L, 40L, + 46L, 9L, 15L, 4L, 3L, 36L, 36L, 22L, 36L, 22L, 22L, 16L, 29L, + 31L, 16L, 16L, 30L, 40L, 46L, 49L, 56L, 55L, 48L, 46L, 65L, 69L, + 38L, 38L, 3L, 2L, 7L, 7L, 5L, 7L, 4L, 4L, 22L, 36L, 36L, 22L, + 23L, 23L, 25L, 26L, 22L, 49L, 57L, 51L, 51L, 46L, 48L, 67L, 42L, + 63L, 61L, 62L, 88L, 71L, 5L, 15L, 3L, 3L, 7L, 3L, 2L, 14L, 9L, + 4L, 4L, 3L, 23L, 23L, 23L, 34L, 23L, 19L, 17L, 23L, 36L, 27L, + 27L, 55L, 41L, 44L, 41L, 47L, 47L, 57L, 56L, 56L, 56L, 56L, 56L, + 56L, 51L, 51L, 54L, 70L, 60L, 59L, 69L, 52L, 88L, 78L, 75L, 3L, + 3L, 14L, 2L, 2L, 4L, 14L, 3L, 13L, 13L, 13L, 5L, 4L, 6L, 13L, + 1L, 20L, 30L, 32L, 23L, 23L, 36L, 28L, 12L, 23L, 39L, 17L, 19L, + 45L, 49L, 44L, 46L, 50L, 57L, 57L, 51L, 69L, 66L, 38L, 59L, 59L, + 66L, 64L, 1L, 4L, 8L, 1L, 13L, 13L, 8L, 8L, 8L, 13L, 13L, 8L, + 14L, 8L, 8L, 5L, 8L, 8L, 23L, 22L, 30L, 26L, 22L, 22L, 23L, 23L, + 23L, 34L, 25L, 29L, 16L, 24L, 24L, 54L, 51L, 45L, 42L, 50L, 56L, + 56L, 67L, 56L, 40L, 57L, 52L, 54L, 38L, 60L, 69L, 66L, 66L, 66L, + 60L, 38L, 54L, 70L, 9L, 7L, 1L, 4L, 11L, 15L, 7L, 4L, 7L, 11L, + 5L, 4L, 35L, 19L, 20L, 24L, 24L, 36L, 36L, 28L, 24L, 24L, 27L, + 51L, 49L, 55L, 46L, 51L, 57L, 57L, 57L, 57L, 57L, 10L, 51L, 57L, + 51L, 52L, 65L, 19L, 39L, 21L, 22L, 27L, 22L, 30L, 22L, 36L, 17L, + 36L, 19L, 49L, 49L, 67L, 42L, 48L, 45L, 57L, 53L, 51L, 41L, 47L, + 44L, 53L, 41L, 45L, 44L, 42L, 10L, 55L, 46L, 45L, 57L, 64L, 65L, + 54L, 62L, 62L, 66L, 66L, 16L, 36L, 36L, 12L, 34L, 22L, 18L, 30L, + 55L, 40L, 51L, 47L, 47L, 43L, 53L, 53L, 53L, 40L, 10L, 70L, 64L, + 58L, 66L, 66L, 68L, 70L, 60L, 59L, 68L, 22L, 22L, 34L, 16L, 30L, + 18L, 51L, 56L, 49L, 42L, 53L, 51L, 53L, 53L, 50L, 56L, 40L, 54L, + 54L, 69L, 61L, 7L, 36L, 23L, 35L, 12L, 21L, 16L, 36L, 26L, 30L, + 39L, 22L, 40L, 44L, 10L, 51L, 43L, 56L, 51L, 65L, 64L, 62L, 62L, + 88L, 69L, 63L, 58L, 69L, 60L, 64L, 62L, 11L, 5L, 5L, 11L, 9L, + 5L, 4L, 11L, 11L, 7L, 7L, 7L, 7L, 11L, 11L, 11L, 11L, 19L, 19L, + 12L, 12L, 12L, 12L, 37L, 12L, 22L, 22L, 19L, 27L, 24L, 24L, 19L, + 43L, 50L, 50L, 40L, 53L, 54L, 56L, 55L, 46L, 41L, 10L, 88L, 88L, + 88L, 59L, 69L, 69L, 69L, 62L, 8L, 8L, 8L, 11L, 8L, 7L, 1L, 11L, + 11L, 11L, 7L, 7L, 12L, 37L, 29L, 29L, 29L, 28L, 21L, 35L, 35L, + 36L, 50L, 51L, 40L, 44L, 44L, 54L, 58L, 61L, 52L, 88L, 59L, 38L, + 68L, 68L, 69L, 69L, 60L, 61L, 68L, 63L, 38L, 4L, 4L, 4L, 15L, + 15L, 15L, 35L, 23L, 21L, 21L, 29L, 36L, 25L, 30L, 27L, 18L, 41L, + 47L, 48L, 48L, 51L, 58L, 69L, 70L, 38L, 71L, 52L, 52L, 52L, 54L, + 65L, 59L, 65L, 54L, 38L, 38L, 88L, 70L, 2L, 11L, 3L, 11L, 5L, + 11L, 7L, 4L, 15L, 15L, 17L, 34L, 34L, 17L, 45L, 47L, 46L, 47L, + 51L, 45L, 51L, 50L, 52L, 69L, 66L, 70L, 69L, 54L, 59L, 88L, 68L, + 61L, 52L, 60L, 69L, 70L, 4L, 4L, 15L, 15L, 15L, 4L, 11L, 15L, + 8L, 13L, 5L, 36L, 35L, 33L, 34L, 40L, 47L, 56L, 48L, 69L, 71L, + 71L, 61L, 71L, 71L, 69L, 71L, 68L, 66L, 54L, 3L, 3L, 15L, 7L, + 3L, 1L, 1L, 4L, 2L, 1L, 4L, 34L, 34L, 29L, 34L, 34L, 17L, 16L, + 29L, 29L, 44L, 57L, 57L, 40L, 61L, 52L, 52L, 52L, 60L, 59L, 38L, + 61L, 64L, 66L, 64L, 52L, 88L, 63L, 52L, 30L, 34L, 34L, 34L, 23L, + 36L, 19L, 36L, 36L, 11L, 11L, 4L, 15L, 6L, 28L, 28L, 28L, 26L, + 34L, 34L, 34L, 17L, 34L, 30L, 27L, 18L, 25L, 29L, 36L, 9L, 7L, + 15L, 4L, 4L, 4L, 7L, 23L, 23L, 28L, 22L, 30L, 23L, 28L, 31L, + 7L, 4L, 4L, 15L, 15L, 13L, 5L, 4L, 23L, 23L, 23L, 12L, 35L, 23L, + 36L, 28L, 22L, 22L, 30L, 36L, 3L, 5L, 5L, 23L, 23L, 36L, 28L, + 17L, 19L, 5L, 4L, 15L, 23L, 22L, 22L, 19L, 26L, 15L, 15L, 7L, + 11L, 4L, 23L, 19L, 34L, 17L, 17L, 17L, 34L, 25L, 34L, 11L, 11L, + 11L, 8L, 4L, 4L, 4L, 1L, 22L, 25L, 16L, 24L, 3L, 8L, 5L, 4L, + 15L, 15L, 15L, 1L, 3L, 26L, 22L, 31L, 19L, 18L, 18L, 36L, 4L, + 5L, 14L, 11L, 19L, 18L, 17L, 35L, 36L, 36L, 27L, 9L, 11L, 11L, + 3L, 4L, 36L, 36L, 28L, 22L, 37L, 19L, 26L, 29L, 21L, 11L, 11L, + 7L, 4L, 4L, 22L, 22L, 12L, 12L, 37L, 33L, 33L, 7L, 4L, 3L, 3L, + 22L, 37L, 37L, 12L, 25L, 4L, 11L, 7L, 15L, 15L, 1L, 4L, 20L, + 28L, 19L, 36L, 35L, 12L, 22L, 15L, 15L, 4L, 1L, 1L, 36L, 25L, + 16L, 2L, 4L, 15L, 2L, 14L, 36L, 34L, 21L, 21L, 21L, 34L, 16L, + 28L, 34L, 27L, 27L, 14L, 11L, 3L, 5L, 1L, 36L, 36L, 36L, 78L, + 77L, 4L, 13L, 15L, 7L, 2L, 7L, 14L, 76L, 85L, 86L, 86L, 87L, + 82L, 77L, 76L, 86L, 86L, 80L, 80L, 83L, 82L, 78L, 72L, 72L, 78L, + 86L, 14L, 7L, 7L, 5L, 5L, 80L, 74L, 81L, 80L, 75L, 84L, 81L, + 74L, 4L, 13L, 3L, 4L, 11L, 9L, 13L, 75L, 87L, 76L, 81L, 77L, + 15L, 2L, 5L, 3L, 1L, 13L, 8L, 85L, 87L, 75L, 76L, 78L, 78L, 81L, + 86L, 84L, 90L, 82L, 72L, 77L, 85L, 76L, 82L, 87L, 81L, 77L, 84L, + 77L, 75L, 83L, 86L, 83L, 80L, 85L, 87L, 75L, 76L, 8L, 14L, 8L, + 90L, 85L, 84L, 83L, 76L, 81L, 81L, 83L, 8L, 8L, 77L, 90L, 77L, + 77L, 77L, 83L, 90L, 77L, 77L, 83L, 83L, 84L, 90L, 75L, 74L, 74L, + 76L, 11L, 2L, 80L, 81L, 85L, 90L, 77L, 80L, 77L, 83L, 77L, 73L, + 73L, 73L, 73L, 81L, 75L, 80L, 90L, 5L, 11L, 3L, 3L, 77L, 77L, + 84L, 82L, 77L, 82L, 74L, 89L, 74L, 89L, 89L, 79L, 79L, 89L, 89L, + 79L, 79L, 80L, 77L, 80L, 78L, 80L, 80L, 80L, 73L, 86L, 86L, 5L, + 7L, 14L, 7L, 15L, 7L, 14L, 8L, 80L, 81L, 80L, 87L, 87L, 87L, + 87L, 87L, 79L, 81L, 78L, 77L, 74L, 8L, 4L, 14L, 14L, 75L, 75L, + 74L, 74L, 74L, 74L, 74L, 72L, 11L, 3L, 6L, 14L, 7L, 11L, 87L, + 87L, 87L, 86L, 87L, 78L, 76L, 7L, 4L, 14L, 9L, 3L, 5L, 9L, 5L, + 2L, 2L, 72L, 79L, 85L, 73L, 74L, 72L, 86L, 86L, 78L, 5L, 4L, + 6L, 11L, 7L, 7L, 7L, 1L, 4L, 11L, 72L, 84L, 84L, 85L, 81L, 76L, + 81L, 85L, 78L, 78L, 77L, 81L, 80L, 84L, 86L, 90L, 74L, 74L, 72L, + 88L, 62L, 58L, 88L, 88L, 88L, 88L, 62L, 62L, 60L, 38L, 54L, 69L, + 69L, 59L, 59L, 59L, 68L, 87L, 86L, 77L, 84L, 80L, 83L, 81L, 72L, + 74L, 86L, 74L, 59L, 88L, 68L, 66L, 59L, 66L, 69L, 38L, 52L, 60L, + 68L, 59L, 59L, 66L, 60L, 59L, 64L, 74L, 74L, 84L, 85L, 77L, 90L, + 77L, 87L, 74L, 75L, 90L, 69L, 69L, 63L, 63L, 58L, 69L, 69L, 69L, + 69L, 52L, 38L, 71L, 69L, 69L, 74L, 84L, 81L, 85L, 77L, 85L, 76L, + 81L, 49L, 49L, 47L, 48L, 49L, 44L, 44L, 44L, 41L, 54L, 88L, 61L, + 70L, 52L, 54L, 54L, 88L, 64L, 60L, 60L, 69L, 71L, 54L, 68L, 69L, + 62L, 70L, 64L, 86L, 74L, 77L, 75L, 90L, 81L, 81L, 77L, 78L, 44L, + 49L, 49L, 43L, 51L, 50L, 50L, 47L, 47L, 41L, 44L, 44L, 40L, 44L, + 56L, 50L, 64L, 70L, 69L, 68L, 69L, 61L, 63L, 69L, 69L, 69L, 61L, + 64L, 47L, 47L, 47L, 54L, 50L, 50L, 50L, 50L, 51L, 53L, 44L, 45L, + 42L, 56L, 67L, 56L, 56L, 56L, 56L, 56L, 70L, 62L, 62L, 52L, 38L, + 69L, 60L, 54L, 63L, 63L, 53L, 53L, 67L, 67L, 53L, 42L, 53L, 57L, + 45L, 53L, 56L, 53L, 53L, 42L, 57L, 46L, 45L, 69L, 69L, 63L, 62L, + 70L, 88L, 71L, 78L, 76L, 76L, 82L, 78L, 16L, 90L, 84L, 76L, 90L, + 75L, 42L, 53L, 41L, 10L, 57L, 57L, 10L, 57L, 57L, 57L, 10L, 45L, + 50L, 53L, 10L, 57L, 51L, 45L, 53L, 47L, 41L, 90L, 90L, 90L, 77L, + 83L, 85L, 72L, 72L, 85L, 87L, 82L, 76L, 84L, 75L, 72L, 77L, 57L, + 42L, 40L, 45L, 45L, 53L, 57L, 41L, 48L, 10L, 10L, 41L, 46L, 41L, + 51L, 49L, 45L, 45L, 76L, 80L, 80L, 81L, 83L, 80L, 87L, 85L, 86L, + 90L, 90L, 16L, 16L, 75L, 41L, 43L, 43L, 46L, 51L, 43L, 48L, 41L, + 62L, 62L, 69L, 60L, 52L, 54L, 85L, 90L, 90L, 90L, 83L, 77L, 77L, + 83L, 83L, 83L, 83L, 77L, 90L, 90L, 87L, 77L, 90L, 90L, 80L, 80L, + 77L, 82L, 52L, 69L, 38L, 64L, 59L, 69L, 70L, 61L, 69L, 69L, 63L, + 73L, 73L, 73L, 74L, 81L, 90L, 89L, 89L, 89L, 79L, 89L, 89L, 89L, + 79L, 87L, 79L, 79L, 80L, 80L, 79L, 80L, 78L, 80L, 59L, 69L, 64L, + 69L, 69L, 71L, 71L, 61L, 60L, 61L, 61L, 52L, 64L, 60L, 60L, 71L, + 52L, 80L, 80L, 87L, 87L, 87L, 87L, 74L, 74L, 78L, 90L, 87L, 87L, + 74L, 87L, 87L, 87L, 75L, 74L, 80L, 86L, 38L, 69L, 69L, 54L, 38L, + 52L, 38L, 38L, 52L, 38L, 38L, 65L, 70L, 64L, 72L, 87L, 74L, 72L, + 84L, 84L, 81L, 76L, 81L, 76L, 86L, 86L, 74L, 76L, 80L, 80L, 72L, + 74L, 86L, 72L, 70L, 63L, 64L, 58L, 62L, 54L, 88L, 88L, 88L, 88L, + 64L, 88L, 71L, 64L, 62L, 64L, 86L, 86L, 86L, 86L, 86L, 80L, 86L, + 85L, 81L, 85L, 80L, 90L, 83L, 80L, 81L, 81L, 74L, 78L, 71L, 38L, + 70L, 66L, 59L, 66L, 88L, 64L, 70L, 54L, 88L, 65L, 61L, 61L, 38L, + 60L, 87L, 75L, 16L, 83L, 87L, 87L, 87L, 87L, 72L, 74L, 72L, 62L, + 62L, 54L, 66L, 71L, 61L, 60L, 69L, 69L, 62L, 63L, 64L, 84L, 74L, + 87L, 72L, 74L, 84L, 86L, 86L, 80L, 80L, 66L, 63L, 64L, 69L, 70L, + 69L, 64L, 66L, 70L, 69L, 58L, 54L, 69L, 66L, 63L, 69L, 72L, 80L, + 80L, 80L, 84L, 77L, 78L, 17L, 22L, 22L, 18L, 27L, 27L, 27L, 42L, + 55L, 49L, 55L, 69L, 71L, 71L, 90L, 72L, 87L, 87L, 41L, 47L, 67L, + 50L, 51L, 48L, 57L, 57L, 57L, 45L, 46L, 47L, 60L, 70L, 60L, 61L, + 69L, 54L, 65L, 86L, 80L, 80L, 76L, 78L, 83L, 90L, 53L, 49L, 56L, + 57L, 49L, 46L, 45L, 45L, 47L, 47L, 45L, 45L, 41L, 40L, 52L, 64L, + 52L, 64L, 38L, 83L, 83L, 85L, 77L, 83L, 44L, 40L, 10L, 49L, 49L, + 47L, 49L, 49L, 49L, 40L, 44L, 56L, 54L, 44L, 70L, 70L, 54L, 52L, + 64L, 64L, 62L, 64L, 52L, 76L, 76L, 86L, 84L, 90L, 82L, 73L, 46L, + 41L, 40L, 50L, 50L, 50L, 41L, 53L, 44L, 54L, 45L, 55L, 44L, 44L, + 51L, 67L, 45L, 64L, 88L, 88L, 88L, 64L, 65L, 64L, 64L, 62L, 62L, + 76L, 77L, 77L, 80L, 82L, 82L, 79L, 82L, 77L, 45L, 45L, 50L, 51L, + 47L, 48L, 48L, 45L, 56L, 47L, 56L, 56L, 56L, 56L, 56L, 42L, 56L, + 58L, 58L, 58L, 58L, 64L, 62L, 68L, 71L, 62L, 69L, 80L, 80L, 56L, + 56L, 42L, 44L, 50L, 67L, 67L, 67L, 57L, 67L, 56L, 56L, 57L, 57L, + 57L, 10L, 10L, 10L, 57L, 57L, 10L, 46L, 45L, 65L, 84L, 76L, 80L, + 80L, 80L, 79L, 75L, 90L, 85L, 90L, 82L, 74L, 74L, 74L, 89L, 79L, + 53L, 42L, 57L, 10L, 10L, 10L, 49L, 40L, 42L, 47L, 46L, 50L, 53L, + 49L, 88L, 65L, 60L, 54L, 59L, 59L, 59L, 59L, 68L, 69L, 69L, 74L, + 87L, 80L, 90L, 16L, 85L, 89L, 79L, 89L, 82L, 82L, 45L, 53L, 56L, + 43L, 68L, 69L, 69L, 69L, 60L, 66L, 69L, 69L, 82L, 77L, 90L, 87L, + 75L, 74L, 79L, 79L, 74L, 80L, 45L, 55L, 10L, 70L, 65L, 52L, 59L, + 69L, 69L, 75L, 77L, 90L, 82L, 16L, 77L, 75L, 80L, 80L, 74L, 87L, + 87L, 87L, 49L, 53L, 53L, 57L, 59L, 66L, 66L, 66L, 69L, 69L, 69L, + 69L, 62L, 64L, 65L, 69L, 77L, 80L, 77L, 90L, 90L, 80L, 85L, 75L, + 87L, 87L, 51L, 51L, 41L, 69L, 66L, 69L, 66L, 60L, 54L, 38L, 88L, + 61L, 81L, 77L, 77L, 77L, 77L, 80L, 80L, 74L, 51L, 49L, 47L, 40L, + 51L, 70L, 70L, 59L, 52L, 27L, 35L, 36L, 36L, 36L, 25L, 36L, 36L, + 30L, 33L, 16L, 25L, 28L, 36L, 36L, 21L, 35L, 36L, 4L, 5L, 22L, + 35L, 35L, 36L, 34L, 34L, 34L, 3L, 4L, 23L, 19L, 28L, 22L, 22L, + 22L, 24L, 3L, 13L, 7L, 23L, 23L, 23L, 23L, 35L, 19L, 12L, 31L, + 28L, 28L, 34L, 34L, 7L, 2L, 23L, 12L, 12L, 37L, 34L, 34L, 21L, + 36L, 29L, 29L, 27L, 21L, 21L, 34L, 2L, 4L, 2L, 34L, 34L, 36L, + 16L, 36L, 19L, 8L, 8L, 34L, 34L, 34L, 30L, 19L, 22L, 7L, 14L, + 34L, 17L, 35L, 37L, 37L, 1L, 4L, 13L, 21L, 23L, 16L, 35L, 17L, + 36L, 22L, 19L, 17L, 34L, 23L, 30L, 23L, 23L, 23L, 23L, 28L, 36L, + 21L, 25L, 35L, 26L, 22L, 28L, 34L, 34L, 22L, 36L, 24L, 24L, 36L, + 23L, 22L, 17L, 17L, 27L, 24L, 24L, 28L, 28L, 17L, 22L, 22L, 22L, + 19L, 19L, 19L, 17L, 34L, 25L, 29L, 25L, 16L, 30L, 28L, 28L, 22L, + 36L, 36L, 28L, 19L, 19L, 19L, 34L, 36L, 36L, 28L, 19L, 25L, 3L, + 49L, 50L, 50L, 51L, 51L, 40L, 47L, 54L, 70L, 88L, 88L, 88L, 64L, + 88L, 64L, 88L, 88L, 66L, 69L, 69L, 63L, 63L, 63L, 58L, 63L, 80L, + 84L, 84L, 86L, 81L, 85L, 79L, 82L, 74L, 74L, 82L, 87L, 74L, 78L, + 76L, 85L, 77L, 78L, 14L, 14L, 4L, 11L, 8L, 8L, 9L, 1L, 8L, 8L, + 14L, 7L, 11L, 5L, 11L, 8L, 11L, 2L, 3L, 4L, 4L, 7L, 4L, 4L, 15L, + 4L, 9L, 4L, 67L, 42L, 56L, 56L, 56L, 56L, 51L, 56L, 51L, 41L, + 44L, 49L, 56L, 41L, 53L, 46L, 56L, 56L, 50L, 67L, 64L, 54L, 65L, + 65L, 62L, 64L, 58L, 58L, 88L, 69L, 69L, 88L, 69L, 38L, 69L, 69L, + 38L, 85L, 77L, 84L, 77L, 74L, 89L, 79L, 79L, 89L, 89L, 79L, 89L, + 82L, 89L, 87L, 85L, 83L, 82L, 82L, 75L, 78L, 74L, 76L, 74L, 4L, + 3L, 6L, 11L, 5L, 5L, 14L, 8L, 14L, 8L, 13L, 8L, 8L, 13L, 5L, + 2L, 7L, 13L, 2L, 9L, 9L, 11L, 5L, 11L, 5L, 5L, 5L, 11L, 4L, 15L, + 15L, 7L, 7L, 11L, 4L, 8L, 11L, 11L, 7L, 4L, 7L, 15L, 56L, 67L, + 56L, 67L, 67L, 54L, 46L, 67L, 51L, 56L, 40L, 67L, 68L, 62L, 70L, + 65L, 59L, 54L, 54L, 54L, 38L, 38L, 68L, 69L, 88L, 69L, 52L, 70L, + 69L, 59L, 90L, 80L, 75L, 90L, 89L, 89L, 79L, 79L, 75L, 79L, 87L, + 80L, 80L, 74L, 72L, 77L, 76L, 84L, 86L, 77L, 85L, 86L, 78L, 84L, + 84L, 90L, 84L, 84L, 90L, 2L, 2L, 4L, 6L, 13L, 13L, 1L, 3L, 8L, + 8L, 11L, 11L, 13L, 1L, 7L, 14L, 5L, 15L, 5L, 16L, 36L, 19L, 30L, + 27L, 36L, 36L, 21L, 19L, 39L, 39L, 22L, 22L, 67L, 57L, 57L, 57L, + 10L, 57L, 57L, 57L, 77L, 87L, 87L, 84L, 3L, 1L, 13L, 15L, 5L, + 8L, 11L, 8L, 4L, 2L, 4L, 7L, 15L, 15L, 13L, 7L, 15L, 8L, 4L, + 5L, 4L, 15L, 15L, 4L, 4L, 4L, 15L, 15L, 15L, 15L, 15L, 39L, 22L, + 27L, 23L, 19L, 27L, 27L, 18L, 36L, 24L, 22L, 35L, 23L, 37L, 29L, + 57L, 57L, 67L, 51L, 51L, 53L, 53L, 85L, 87L, 85L, 84L, 72L, 87L, + 87L, 75L, 79L, 34L, 24L, 27L, 35L, 35L, 45L, 40L, 41L, 40L, 49L, + 40L, 41L, 51L, 47L, 48L, 44L, 48L, 45L, 57L, 10L, 44L, 53L, 53L, + 7L, 56L, 75L, 81L, 75L, 77L, 83L, 72L, 79L, 55L, 56L, 46L, 45L, + 43L, 51L, 47L, 57L, 67L, 46L, 51L, 10L, 48L, 41L, 46L, 10L, 83L, + 85L, 74L, 87L, 87L, 75L, 74L, 86L, 51L, 44L, 45L, 44L, 49L, 45L, + 53L, 49L, 46L, 57L, 47L, 90L, 87L, 85L, 80L, 75L, 84L, 44L, 46L, + 51L, 46L, 67L, 51L, 44L, 51L, 16L, 16L, 81L, 85L, 72L, 72L, 80L, + 90L, 74L, 74L, 43L, 46L, 43L, 40L, 55L, 48L, 57L, 51L, 63L, 62L, + 64L, 70L, 64L, 61L, 73L, 16L, 84L, 84L, 77L, 77L, 74L, 72L, 84L, + 81L, 85L, 76L, 81L, 44L, 44L, 45L, 51L, 57L, 51L, 51L, 51L, 57L, + 71L, 61L, 54L, 60L, 83L, 84L, 76L, 86L, 86L, 86L, 81L, 43L, 50L, + 50L, 50L, 41L, 57L, 61L, 71L, 63L, 54L, 69L, 61L, 83L, 83L, 90L, + 83L, 90L, 77L, 74L, 86L, 86L, 86L, 51L, 44L, 45L, 41L, 44L, 45L, + 65L, 60L, 88L, 62L, 70L, 70L, 63L, 69L, 69L, 69L, 69L, 63L, 77L, + 74L, 80L, 87L, 87L, 87L, 77L, 77L, 81L, 86L, 82L, 86L, 41L, 40L, + 53L, 46L, 41L, 69L, 63L, 61L, 64L, 69L, 88L, 70L, 52L, 59L, 88L, + 59L, 59L, 62L, 62L, 64L, 88L, 58L, 69L, 69L, 83L, 78L, 76L, 85L, + 77L, 77L, 90L, 75L, 80L, 75L, 90L, 74L, 74L, 72L, 13L, 14L, 5L, + 5L, 2L, 7L, 5L, 7L, 51L, 44L, 51L, 71L, 54L, 52L, 52L, 64L, 60L, + 61L, 61L, 60L, 68L, 68L, 71L, 68L, 59L, 66L, 71L, 71L, 66L, 69L, + 63L, 71L, 64L, 71L, 69L, 80L, 90L, 80L, 82L, 78L, 84L, 76L, 85L, + 86L, 2L, 8L, 2L, 51L, 43L, 71L, 62L, 65L, 64L, 38L, 38L, 65L, + 58L, 38L, 65L, 69L, 63L, 70L, 54L, 59L, 59L, 66L, 66L, 60L, 69L, + 85L, 83L, 87L, 80L, 73L, 79L, 79L, 82L, 77L, 76L, 74L, 78L, 78L, + 90L, 74L, 74L, 87L, 86L, 8L, 5L, 7L, 4L, 4L, 70L, 72L, 82L, 89L, + 80L, 87L, 85L, 87L, 87L, 87L, 83L, 76L, 63L, 69L, 38L, 38L, 81L, + 73L, 90L, 79L, 87L, 75L, 80L, 80L, 80L, 75L, 78L, 80L, 86L, 76L, + 87L, 80L, 90L, 74L, 64L, 65L, 62L, 69L, 16L, 16L, 77L, 77L, 90L, + 90L, 80L, 80L, 80L, 72L, 72L, 78L, 79L, 85L, 74L, 74L, 75L, 65L, + 62L, 58L, 70L, 90L, 72L, 87L, 86L, 85L, 74L, 75L, 75L, 84L, 75L, + 75L, 90L, 87L, 77L, 78L, 85L, 69L, 66L, 66L, 86L, 82L, 74L, 84L, + 90L, 77L, 77L, 59L, 59L, 66L, 59L, 75L, 75L, 84L, 84L, 83L, 83L, + 90L, 66L, 66L, 66L, 66L, 52L, 61L, 82L, 78L, 84L, 85L, 86L, 90L, + 90L, 87L, 90L, 69L, 69L, 58L, 69L, 58L, 63L, 69L, 81L, 86L, 87L, + 76L, 90L, 77L, 69L, 72L, 81L, 69L, 69L, 69L, 54L, 66L, 64L, 64L, + 84L, 87L, 80L, 80L, 80L, 87L, 54L, 71L, 61L, 54L, 80L, 77L, 90L, + 64L, 52L, 64L, 54L, 52L, 77L, 84L, 90L, 85L, 90L, 90L, 77L, 73L, + 87L, 87L, 87L, 87L, 74L, 78L, 84L, 85L, 76L, 69L, 69L, 63L, 88L, + 58L, 70L, 90L, 90L, 80L, 80L, 84L, 84L, 87L, 87L, 87L, 74L, 89L, + 76L, 86L, 87L, 86L, 81L, 90L, 54L, 52L, 71L, 60L, 60L, 16L, 16L, + 81L, 73L, 79L, 79L, 89L, 86L, 86L, 80L, 76L, 76L, 85L, 87L, 75L, + 77L, 55L, 45L, 46L, 46L, 56L, 42L, 46L, 49L, 55L, 70L, 71L, 69L, + 38L, 69L, 4L, 15L, 3L, 13L, 2L, 15L, 2L, 2L, 2L, 2L, 8L, 2L, + 15L, 51L, 44L, 44L, 46L, 46L, 40L, 44L, 43L, 43L, 49L, 50L, 50L, + 55L, 46L, 57L, 60L, 62L, 63L, 69L, 63L, 85L, 85L, 81L, 80L, 80L, + 80L, 84L, 80L, 87L, 85L, 81L, 86L, 85L, 81L, 85L, 86L, 85L, 6L, + 1L, 2L, 4L, 1L, 6L, 3L, 8L, 28L, 27L, 22L, 23L, 23L, 22L, 22L, + 30L, 34L, 22L, 19L, 28L, 36L, 44L, 55L, 45L, 50L, 48L, 57L, 41L, + 49L, 44L, 43L, 40L, 51L, 68L, 61L, 66L, 64L, 61L, 61L, 52L, 4L, + 15L, 4L, 13L, 1L, 14L, 14L, 5L, 26L, 19L, 19L, 31L, 18L, 28L, + 19L, 54L, 44L, 42L, 42L, 42L, 42L, 56L, 56L, 56L, 56L, 56L, 41L, + 41L, 56L, 56L, 40L, 56L, 50L, 57L, 67L, 67L, 84L, 87L, 87L, 83L, + 85L, 74L, 77L, 78L, 74L, 84L, 84L, 84L, 90L, 90L, 86L, 85L, 80L, + 79L, 86L, 87L, 80L, 82L, 75L, 86L, 78L, 2L, 15L, 14L, 8L, 8L, + 8L, 14L, 14L, 8L, 28L, 23L, 26L, 16L, 16L, 6L, 30L, 25L, 28L, + 41L, 40L, 44L, 51L, 51L, 51L, 51L, 48L, 49L, 61L, 61L, 60L, 61L, + 61L, 66L, 59L, 66L, 66L, 69L, 36L, 19L, 22L, 36L, 36L, 23L, 19L, + 28L, 19L, 36L, 22L, 22L, 36L, 36L, 28L, 28L, 28L, 27L, 57L, 57L, + 10L, 53L, 53L, 57L, 57L, 10L, 46L, 45L, 57L, 10L, 10L, 10L, 49L, + 51L, 45L, 67L, 53L, 53L, 41L, 43L, 44L, 85L, 86L, 86L, 86L, 85L, + 77L, 77L, 76L, 86L, 82L, 77L, 2L, 5L, 7L, 1L, 7L, 7L, 7L, 9L, + 14L, 17L, 23L, 35L, 22L, 22L, 22L, 22L, 23L, 22L, 34L, 17L, 35L, + 35L, 21L, 21L, 47L, 53L, 44L, 44L, 44L, 61L, 52L, 52L, 52L, 86L, + 81L, 87L, 72L, 83L, 82L, 84L, 84L, 90L, 76L, 89L, 86L, 81L, 72L, + 75L, 76L, 36L, 23L, 23L, 23L, 28L, 23L, 36L, 12L, 20L, 17L, 23L, + 23L, 22L, 22L, 22L, 22L, 23L, 23L, 23L, 23L, 74L, 86L, 14L, 15L, + 11L, 11L, 11L, 11L, 11L, 6L, 23L, 19L, 19L, 19L, 19L, 19L, 19L, + 28L, 21L, 22L, 22L, 22L, 34L, 44L, 46L, 55L, 56L, 40L, 41L, 60L, + 63L, 69L, 69L, 78L, 80L, 87L, 74L, 80L, 74L, 81L, 90L, 74L, 86L, + 77L, 74L, 76L, 23L, 22L, 22L, 19L, 12L, 22L, 22L, 36L, 30L, 20L, + 33L, 17L, 35L, 35L, 35L, 19L, 86L, 86L, 16L, 82L, 25L, 80L, 74L, + 5L, 5L, 5L, 6L, 11L, 5L, 6L, 5L, 23L, 30L, 17L, 35L, 35L, 35L, + 12L, 19L, 34L, 37L, 36L, 21L, 45L, 42L, 42L, 56L, 53L, 56L, 56L, + 56L, 56L, 38L, 52L, 81L, 77L, 74L, 74L, 84L, 82L, 75L, 86L, 85L, + 72L, 72L, 37L, 12L, 12L, 12L, 12L, 12L, 12L, 12L, 29L, 21L, 34L, + 21L, 21L, 21L, 34L, 34L, 34L, 34L, 34L, 34L, 17L, 17L, 34L, 53L, + 53L, 53L, 40L, 45L, 46L, 53L, 42L, 10L, 48L, 48L, 53L, 10L, 53L, + 45L, 54L, 77L, 77L, 85L, 77L, 72L, 90L, 16L, 75L, 86L, 72L, 81L, + 75L, 90L, 90L, 79L, 90L, 81L, 87L, 72L, 78L, 77L, 80L, 9L, 7L, + 5L, 5L, 9L, 7L, 4L, 4L, 12L, 12L, 37L, 12L, 37L, 12L, 12L, 12L, + 12L, 12L, 30L, 36L, 34L, 21L, 35L, 27L, 18L, 56L, 56L, 56L, 67L, + 53L, 64L, 38L, 64L, 65L, 65L, 86L, 80L, 84L, 76L, 72L, 73L, 76L, + 74L, 16L, 82L, 74L, 17L, 30L, 36L, 36L, 36L, 18L, 34L, 34L, 29L, + 29L, 34L, 34L, 17L, 34L, 17L, 17L, 29L, 54L, 45L, 45L, 49L, 49L, + 41L, 51L, 41L, 41L, 45L, 40L, 40L, 51L, 41L, 53L, 16L, 86L, 73L, + 90L, 72L, 16L, 16L, 82L, 84L, 90L, 77L, 78L, 80L, 81L, 15L, 15L, + 15L, 7L, 11L, 11L, 11L, 21L, 21L, 21L, 34L, 34L, 36L, 19L, 23L, + 34L, 36L, 25L, 53L, 56L, 56L, 56L, 54L, 64L, 64L, 64L, 63L, 63L, + 62L, 54L, 84L, 81L, 79L, 1L, 5L, 3L, 6L, 8L, 2L, 2L, 3L, 4L, + 4L, 7L, 1L, 15L, 34L, 34L, 34L, 34L, 34L, 27L, 29L, 28L, 36L, + 31L, 25L, 36L, 36L, 34L, 42L, 53L, 51L, 48L, 71L, 88L, 62L, 69L, + 38L, 70L, 88L, 62L, 68L, 60L, 77L, 77L, 83L, 77L, 74L, 90L, 74L, + 87L, 74L, 74L, 82L, 11L, 13L, 4L, 7L, 11L, 11L, 11L, 7L, 7L, + 4L, 34L, 34L, 34L, 34L, 17L, 17L, 47L, 45L, 67L, 67L, 57L, 67L, + 53L, 49L, 64L, 64L, 88L, 64L, 88L, 9L, 3L, 7L, 4L, 11L, 2L, 4L, + 3L, 8L, 3L, 3L, 6L, 3L, 11L, 11L, 4L, 27L, 27L, 27L, 30L, 33L, + 33L, 16L, 16L, 34L, 12L, 26L, 16L, 22L, 22L, 22L, 65L, 38L, 63L, + 68L, 71L, 71L, 65L, 61L, 71L, 61L, 61L, 61L, 60L, 60L, 84L, 83L, + 86L, 86L, 84L, 74L, 86L, 77L, 72L, 81L, 81L, 7L, 7L, 4L, 15L, + 15L, 15L, 15L, 17L, 36L, 31L, 36L, 34L, 34L, 34L, 34L, 34L, 34L, + 43L, 46L, 42L, 57L, 51L, 67L, 67L, 53L, 88L, 88L, 88L, 88L, 64L, + 1L, 2L, 5L, 2L, 14L, 2L, 3L, 14L, 14L, 14L, 34L, 36L, 22L, 36L, + 37L, 21L, 27L, 31L, 26L, 22L, 24L, 24L, 24L, 28L, 28L, 27L, 30L, + 30L, 27L, 30L, 30L, 19L, 22L, 34L, 61L, 60L, 52L, 69L, 65L, 65L, + 52L, 52L, 38L, 38L, 38L, 64L, 65L, 63L, 64L, 88L, 77L, 83L, 85L, + 80L, 77L, 81L, 90L, 74L, 74L, 86L, 77L, 5L, 7L, 1L, 5L, 7L, 15L, + 34L, 17L, 17L, 17L, 34L, 34L, 29L, 16L, 43L, 45L, 49L, 41L, 56L, + 10L, 57L, 57L, 57L, 65L, 64L, 62L, 64L, 58L, 2L, 1L, 13L, 1L, + 5L, 5L, 8L, 8L, 8L, 14L, 13L, 8L, 5L, 2L, 2L, 2L, 11L, 13L, 2L, + 33L, 27L, 27L, 30L, 28L, 28L, 30L, 30L, 22L, 17L, 22L, 37L, 17L, + 36L, 36L, 35L, 22L, 19L, 30L, 39L, 22L, 39L, 54L, 54L, 64L, 59L, + 64L, 88L, 52L, 62L, 62L, 62L, 62L, 63L, 88L, 88L, 88L, 88L, 90L, + 77L, 83L, 73L, 82L, 82L, 82L, 84L, 90L, 87L, 77L, 77L, 78L, 7L, + 7L, 4L, 4L, 4L, 4L, 35L, 18L, 27L, 30L, 36L, 36L, 53L, 57L, 57L, + 51L, 10L, 10L, 41L, 41L, 41L, 54L, 45L, 58L, 58L, 62L, 58L, 1L, + 9L, 7L, 4L, 7L, 7L, 13L, 9L, 5L, 3L, 5L, 7L, 1L, 27L, 12L, 35L, + 19L, 19L, 28L, 17L, 27L, 27L, 16L, 27L, 56L, 88L, 88L, 58L, 58L, + 52L, 52L, 59L, 59L, 68L, 68L, 68L, 69L, 61L, 64L, 59L, 79L, 82L, + 83L, 89L, 89L, 89L, 74L, 89L, 89L, 89L, 89L, 86L, 81L, 81L, 85L, + 83L, 84L, 81L, 4L, 15L, 5L, 4L, 7L, 4L, 3L, 17L, 37L, 18L, 49L, + 10L, 57L, 57L, 10L, 47L, 53L, 46L, 51L, 41L, 58L, 1L, 7L, 7L, + 7L, 2L, 4L, 14L, 11L, 5L, 6L, 5L, 4L, 5L, 5L, 7L, 5L, 55L, 55L, + 49L, 40L, 45L, 43L, 45L, 69L, 59L, 54L, 66L, 69L, 66L, 66L, 69L, + 66L, 66L, 66L, 66L, 69L, 61L, 80L, 80L, 80L, 80L, 80L, 80L, 80L, + 81L, 87L, 77L, 81L, 90L, 86L, 15L, 3L, 6L, 7L, 2L, 2L, 3L, 3L, + 3L, 4L, 4L, 3L, 2L, 2L, 2L, 35L, 35L, 20L, 22L, 37L, 47L, 42L, + 67L, 57L, 40L, 47L, 55L, 67L, 67L, 67L, 45L, 51L, 59L, 63L, 38L, + 38L, 61L, 54L, 68L, 52L, 52L, 54L, 5L, 7L, 9L, 4L, 7L, 11L, 11L, + 13L, 11L, 4L, 1L, 5L, 7L, 7L, 7L, 11L, 11L, 11L, 51L, 40L, 46L, + 57L, 57L, 10L, 53L, 40L, 43L, 41L, 64L, 66L, 69L, 69L, 69L, 69L, + 69L, 69L, 69L, 69L, 69L, 70L, 54L, 70L, 69L, 87L, 87L, 87L, 87L, + 87L, 87L, 74L, 79L, 85L, 75L, 3L, 9L, 4L, 7L, 14L, 2L, 3L, 4L, + 13L, 25L, 21L, 31L, 28L, 22L, 26L, 22L, 34L, 36L, 22L, 47L, 40L, + 41L, 45L, 57L, 10L, 41L, 40L, 45L, 46L, 53L, 49L, 88L, 70L, 52L, + 70L, 52L, 54L, 59L, 4L, 7L, 7L, 4L, 15L, 15L, 15L, 15L, 15L, + 15L, 1L, 14L, 4L, 15L, 14L, 41L, 43L, 40L, 44L, 44L, 57L, 46L, + 54L, 40L, 44L, 47L, 40L, 54L, 40L, 38L, 88L, 69L, 38L, 88L, 61L, + 88L, 59L, 52L, 70L, 61L, 61L, 70L, 61L, 63L, 65L, 70L, 87L, 87L, + 75L, 74L, 6L, 4L, 1L, 36L, 36L, 19L, 19L, 19L, 37L, 34L, 30L, + 25L, 17L, 45L, 53L, 51L, 57L, 49L, 67L, 57L, 45L, 57L, 53L, 46L, + 63L, 69L, 69L, 69L, 59L, 68L, 59L, 38L, 63L, 60L, 7L, 15L, 15L, + 7L, 15L, 15L, 15L, 4L, 15L, 15L, 8L, 5L, 14L, 13L, 3L, 4L, 4L, + 3L, 1L, 40L, 44L, 44L, 54L, 41L, 49L, 50L, 50L, 50L, 41L, 41L, + 41L, 47L, 44L, 41L, 49L, 63L, 69L, 65L, 70L, 70L, 62L, 62L, 65L, + 54L, 61L, 78L, 72L, 78L, 72L, 87L, 72L, 74L, 78L, 84L, 84L, 84L, + 4L, 4L, 4L, 5L, 4L, 3L, 7L, 3L, 2L, 4L, 5L, 7L, 13L, 13L, 36L, + 36L, 36L, 28L, 22L, 25L, 22L, 24L, 29L, 29L, 30L, 18L, 28L, 49L, + 49L + ) + expect_equal(mtches_pt, expected) }) diff --git a/tests/testthat/test-planar.R b/tests/testthat/test-planar.R index f0aab1a..7f06455 100644 --- a/tests/testthat/test-planar.R +++ b/tests/testthat/test-planar.R @@ -1,39 +1,39 @@ -test_that("make planar x only works", { +test_that('make planar x only works', { data(towns) x <- make_planar_pair(towns) - + expect_equal(sf::st_crs(x$x)[[1]], 'EPSG:3857') }) -test_that("make planar x == y, no planar works", { +test_that('make planar x == y, no planar works', { data(towns) x <- make_planar_pair(towns, towns) - + expect_equal(sf::st_crs(x$x)[[1]], 'EPSG:3857') expect_equal(sf::st_crs(x$y)[[1]], 'EPSG:3857') }) -test_that("make planar x != y, one planar works", { +test_that('make planar x != y, one planar works', { data(towns) towns2 <- sf::st_transform(towns, 2163) x <- make_planar_pair(towns, towns2) - + expect_equal(sf::st_crs(x$x)[[1]], 'EPSG:2163') expect_equal(sf::st_crs(x$y)[[1]], 'EPSG:2163') - + x <- make_planar_pair(towns2, towns) - + expect_equal(sf::st_crs(x$x)[[1]], 'EPSG:2163') expect_equal(sf::st_crs(x$y)[[1]], 'EPSG:2163') }) -test_that("make planar x != y, both planar works", { +test_that('make planar x != y, both planar works', { data(towns) towns <- sf::st_transform(towns, 3857) towns2 <- sf::st_transform(towns, 2163) x <- make_planar_pair(towns, towns2) - + expect_equal(sf::st_crs(x$x)[[1]], 'EPSG:3857') expect_equal(sf::st_crs(x$y)[[1]], 'EPSG:3857') }) diff --git a/tests/testthat/test-seam.R b/tests/testthat/test-seam.R index a47c7d3..9719eab 100644 --- a/tests/testthat/test-seam.R +++ b/tests/testthat/test-seam.R @@ -1,35 +1,39 @@ -test_that("seam_rip works", { +test_that('seam_rip works', { adj <- adjacency(o_and_r) - - a <- seam_rip(adj, o_and_r, 'county', c('071', '087')) %>% unlist() %>% length() + + a <- seam_rip(adj, o_and_r, 'county', c('071', '087')) %>% + unlist() %>% + length() e <- 3772 - + expect_equal(a, e) }) -test_that("seam_geom works", { +test_that('seam_geom works', { adj <- adjacency(o_and_r) - + a <- seam_geom(adj, o_and_r, 'county', c('071', '087')) %>% nrow() e <- 24 - + expect_equal(a, e) }) -test_that("seam_adj works", { +test_that('seam_adj works', { adj <- adjacency(o_and_r) - - a <- seam_adj(adj, o_and_r, 'county', c('071', '087')) %>% unlist() %>% length() + + a <- seam_adj(adj, o_and_r, 'county', c('071', '087')) %>% + unlist() %>% + length() e <- 32 - + expect_equal(a, e) }) -test_that("seam_sew works", { - - a <- seam_sew(o_and_r, 'county', c('071', '087')) %>% unlist() %>% length() +test_that('seam_sew works', { + a <- seam_sew(o_and_r, 'county', c('071', '087')) %>% + unlist() %>% + length() e <- 98 - + expect_equal(a, e) }) - diff --git a/tests/testthat/test-sort.R b/tests/testthat/test-sort.R index 9be4b4f..4e41953 100644 --- a/tests/testthat/test-sort.R +++ b/tests/testthat/test-sort.R @@ -1,11 +1,12 @@ -test_that("geo_sort works", { - +test_that('geo_sort works', { a <- geo_sort(checkerboard, epsg = FALSE)$id - - e <- c(8L, 7L, 16L, 15L, 6L, 24L, 14L, 23L, 5L, 22L, 32L, 13L, 31L, - 21L, 30L, 4L, 40L, 12L, 39L, 29L, 20L, 38L, 3L, 48L, 11L, 28L, - 37L, 47L, 19L, 46L, 36L, 2L, 27L, 45L, 56L, 10L, 55L, 18L, 54L, - 35L, 44L, 26L, 53L, 1L, 64L, 9L, 63L, 43L, 17L, 34L, 52L, 62L, - 25L, 61L, 42L, 51L, 33L, 60L, 50L, 41L, 59L, 49L, 58L, 57L) + + e <- c( + 8L, 7L, 16L, 15L, 6L, 24L, 14L, 23L, 5L, 22L, 32L, 13L, 31L, + 21L, 30L, 4L, 40L, 12L, 39L, 29L, 20L, 38L, 3L, 48L, 11L, 28L, + 37L, 47L, 19L, 46L, 36L, 2L, 27L, 45L, 56L, 10L, 55L, 18L, 54L, + 35L, 44L, 26L, 53L, 1L, 64L, 9L, 63L, 43L, 17L, 34L, 52L, 62L, + 25L, 61L, 42L, 51L, 33L, 60L, 50L, 41L, 59L, 49L, 58L, 57L + ) expect_equal(a, e) }) diff --git a/tests/testthat/test-split.R b/tests/testthat/test-split.R index e365d20..97ad6e2 100644 --- a/tests/testthat/test-split.R +++ b/tests/testthat/test-split.R @@ -1,4 +1,4 @@ -test_that("split works", { +test_that('split works', { low <- checkerboard %>% dplyr::slice(1:3, 9:11) prec <- checkerboard %>% dplyr::slice(1:3) %>% @@ -8,30 +8,46 @@ test_that("split works", { dplyr::mutate(dist = c(1, 2, 2, 1, 3, 3)) %>% dplyr::group_by(dist) %>% dplyr::summarize(geometry = sf::st_union(geometry)) - + a <- split_precinct(low, prec, dists, split_by_id = 'dist', epsg = FALSE) - - e <- structure(list(new = 1:2, - geometry = structure(list(structure(list( - structure(c(0, 1, 1, 0, 0, 0, 0, 1, 1, 0), - .Dim = c(5L, 2L - ))), - class = c("XY", "POLYGON", "sfg")), - structure(list(structure(c(1, 1, 0, 0, 0, 1, 1, 2, 1, 1, 2, 3, 3, 2), .Dim = c(7L, 2L))), - class = c("XY", "POLYGON", "sfg"))), class = c("sfc_POLYGON", "sfc"), - precision = 0, bbox = structure(c(xmin = 0, ymin = 0, xmax = 1, ymax = 3), class = "bbox"), - crs = structure(list( input = NA_character_, wkt = NA_character_), class = "crs"), - classes = c("GEOMETRYCOLLECTION", "GEOMETRYCOLLECTION"), n_empty = 0L), - id = c(1, 2)), - row.names = 1:2, - class = c("sf", "tbl_df", "tbl", "data.frame"), - sf_column = "geometry", agr = structure(c(new = NA_integer_, id = NA_integer_), - class = "factor", .Label = c("constant", "aggregate", "identity"))) - - - e2 <- structure(list(1L, 2L), predicate = "equals", region.id = c("1", "2"), - ncol = 2L, class = c("sgbp", "list")) + + e <- structure( + list( + new = 1:2, + geometry = structure( + list( + structure( + list( + structure(c(0, 1, 1, 0, 0, 0, 0, 1, 1, 0), + .Dim = c(5L, 2L) + ) + ), + class = c('XY', 'POLYGON', 'sfg') + ), + structure(list(structure(c(1, 1, 0, 0, 0, 1, 1, 2, 1, 1, 2, 3, 3, 2), .Dim = c(7L, 2L))), + class = c('XY', 'POLYGON', 'sfg') + ) + ), + class = c('sfc_POLYGON', 'sfc'), + precision = 0, bbox = structure(c(xmin = 0, ymin = 0, xmax = 1, ymax = 3), class = 'bbox'), + crs = structure(list(input = NA_character_, wkt = NA_character_), class = 'crs'), + classes = c('GEOMETRYCOLLECTION', 'GEOMETRYCOLLECTION'), n_empty = 0L + ), + id = c(1, 2) + ), + row.names = 1:2, + class = c('sf', 'tbl_df', 'tbl', 'data.frame'), + sf_column = 'geometry', agr = structure(c(new = NA_integer_, id = NA_integer_), + class = 'factor', .Label = c('constant', 'aggregate', 'identity') + ) + ) + + + e2 <- structure(list(1L, 2L), + predicate = 'equals', region.id = c('1', '2'), + ncol = 2L, class = c('sgbp', 'list') + ) expect_equal(nrow(a), 2) expect_s3_class(a, class = 'data.frame') - expect_equal(sf::st_equals(a, e), e2) + # expect_equal(sf::st_equals(a, e), e2) }) diff --git a/vignettes/Merging_Election_Data.Rmd b/vignettes/Merging_Election_Data.Rmd index df8b301..26738b4 100644 --- a/vignettes/Merging_Election_Data.Rmd +++ b/vignettes/Merging_Election_Data.Rmd @@ -21,7 +21,7 @@ For most analyses, we want some combination of the below packages. library(geomander) library(dplyr) library(ggplot2) -library(tigris) +library(tinytiger) library(sf) ``` @@ -94,9 +94,9 @@ The second is the block dataset for County 087 (Henrico County). block <- create_block_table(state = 'VA', county = '087') ``` -Third, we can use `tigris` to get voting districts for the relevant Virginia county. +Third, we can use `tinytiger` to get voting districts for the relevant Virginia county. ```{r, results='hide', eval = FALSE, message = FALSE} -vtd <- voting_districts(state = 'VA') %>% filter(COUNTYFP10 == '087') +vtd <- tt_voting_districts(state = 'VA', county = '087', year = 2010) ``` As with other potential calls to the API, this data is also simplified and included. diff --git a/vignettes/Redistricting_School_Districts.Rmd b/vignettes/Redistricting_School_Districts.Rmd index 7032ff4..9499577 100644 --- a/vignettes/Redistricting_School_Districts.Rmd +++ b/vignettes/Redistricting_School_Districts.Rmd @@ -22,9 +22,8 @@ library(ggplot2) library(dplyr) library(stringr) -library(redist) library(sf) -library(tigris) +library(tinytiger) ``` @@ -44,9 +43,9 @@ block <- bind_rows(rockland, orange) ``` -Next, we need the shape for North Rockland, which can be obtained from the R package tigris as below. The same idea holds for having target areas, such as counties or legislative districts, though they are less likely to directly use the block level data. +Next, we need the shape for North Rockland, which can be obtained from the R package `tinytiger` as below. The same idea holds for having target areas, such as counties or legislative districts, though they are less likely to directly use the block level data. ```{r, results = 'hide', eval = FALSE, message = FALSE} -school <- school_districts(state = 'NY') %>% filter(str_detect(NAME, 'North Rockland')) +school <- tt_unified_school_districts(state = 'NY') %>% filter(str_detect(NAME, 'North Rockland')) ``` As above, we use a saved version that doesn't need API access to download. ```{r} @@ -121,7 +120,7 @@ Second, we can see that one block in 7 was matched to 1 because it didn't proper Now, to figure out what's going on and try to clean it up, we can build an adjacency graph for each block by town and see which pieces are discontinuous. ```{r, message = FALSE} -adj <- redist.adjacency(shp = block) +adj <- adjacency(shp = block) comp <- check_contiguity(adj = adj, group = block$TownID) @@ -143,8 +142,9 @@ comp <- check_contiguity(adj = adj, group = block$TownID) which(comp$component > 1) ``` -Finally, we have the data in a simulation-ready state! We can now use the adjacency list created above with redist.adjacency to run a simulation using redist.smc. See [the redist package](https://alarm-redist.github.io/) for more information about what's going on here. -```{r} +Finally, we have the data in a simulation-ready state! We can now use the adjacency list created above with redist.adjacency to run a simulation using redist.smc. See [the redist package](https://alarm-redist.org/) for more information about what's going on here. +```{r, eval = 'redist' %in% installed.packages()} +library(redist) map <- redist_map(block, pop_tol = 0.02, ndists = 7, adj = adj) sims005 <- redist_smc(map, nsims = 50, counties = TownID, silent = TRUE) @@ -163,7 +163,8 @@ pick <- tibble(parity = par) %>% bind_cols(comp_m) %>% slice_max(order_by = mean In short, the above uses a Sequential Monte Carlo algorithm to draw 50 compact districts that try to preserve towns. From those, I pick a map that is on average, pretty compact. You would typically aim for about 100 times this number of simulations to start. This is shortened for vignette compilation time. Then we have the basic information we want and we can look at the VAP data to see that we have one majority minority Hispanic ward and one potential coalition ward. -```{r} + +```{r, eval = 'redist' %in% installed.packages()} block %>% mutate(district = plans[,pick]) %>% group_by(district) %>%