Load some useful packages

suppressPackageStartupMessages(library(tidyverse))
library(haven)

Load in the summary datasets in Stata format:

state_wide_all <- read_dta("2017_state_wide_all.dta")
head(state_wide_all)

state_wide_elem <- read_dta("state_wide_elem.dta")
head(state_wide_elem)

state_wide_sec <- read_dta("state_wide_sec.dta")
head(state_wide_sec)

RRRs for All Students

rr_all <- matrix(c(state_wide_all$count__0_0_, state_wide_all$count__1_0_, state_wide_all$count__0_1_, state_wide_all$count__1_1_),2,2,byrow=TRUE)

dll <- c("No", "Yes")
outc <- c("No", "Yes")
dimnames(rr_all) <- list("DLL Status" = dll, "SPED Status" = outc)
epitools::riskratio(rr_all)
$data
          SPED Status
DLL Status      No    Yes   Total
     No     963084 136241 1099325
     Yes    136952  21400  158352
     Total 1100036 157641 1257677

$measure
          risk ratio with 95% C.I.
DLL Status estimate    lower    upper
       No  1.000000       NA       NA
       Yes 1.090457 1.075927 1.105183

$p.value
          two-sided
DLL Status midp.exact fisher.exact   chi.square
       No          NA           NA           NA
       Yes          0 9.702698e-36 2.211424e-36

$correction
[1] FALSE

attr(,"method")
[1] "Unconditional MLE & normal approximation (Wald) CI"
rr_all[1,2]/(rr_all[1,1]+rr_all[1,2])
[1] 0.1239315

Elementary vs. Secondary RRRs

All Students (Secondary)

rr_sec <- matrix(c(state_wide_sec$count__0_0_, state_wide_sec$count__1_0_, state_wide_sec$count__0_1_, state_wide_sec$count__1_1_),2,2,byrow=TRUE)

dll <- c("No", "Yes")
outc <- c("No", "Yes")
dimnames(rr_sec) <- list("DLL Status" = dll, "SPED Status" = outc)
epitools::riskratio(rr_sec)
$data
          SPED Status
DLL Status     No   Yes  Total
     No    534716 79084 613800
     Yes    57306 11255  68561
     Total 592022 90339 682361

$measure
          risk ratio with 95% C.I.
DLL Status estimate    lower   upper
       No  1.000000       NA      NA
       Yes 1.274109 1.251256 1.29738

$p.value
          two-sided
DLL Status midp.exact  fisher.exact    chi.square
       No          NA            NA            NA
       Yes          0 7.252984e-140 1.165395e-147

$correction
[1] FALSE

attr(,"method")
[1] "Unconditional MLE & normal approximation (Wald) CI"
rr_sec[1,2]/(rr_sec[1,1]+rr_sec[1,2])
[1] 0.1288433

All Students (Elementary)

rr_elem <- matrix(c(state_wide_elem$count__0_0_, state_wide_elem$count__1_0_, state_wide_elem$count__0_1_, state_wide_elem$count__1_1_),2,2,byrow=TRUE)

dll <- c("No", "Yes")
outc <- c("No", "Yes")
dimnames(rr_elem) <- list("DLL Status" = dll, "SPED Status" = outc)
epitools::riskratio(rr_elem)
$data
          SPED Status
DLL Status     No   Yes  Total
     No    428368 57157 485525
     Yes    79646 10145  89791
     Total 508014 67302 575316

$measure
          risk ratio with 95% C.I.
DLL Status  estimate     lower     upper
       No  1.0000000        NA        NA
       Yes 0.9597573 0.9408668 0.9790271

$p.value
          two-sided
DLL Status   midp.exact fisher.exact   chi.square
       No            NA           NA           NA
       Yes 4.638384e-05 4.719157e-05 4.958048e-05

$correction
[1] FALSE

attr(,"method")
[1] "Unconditional MLE & normal approximation (Wald) CI"
rr_elem[1,2]/(rr_elem[1,1]+rr_elem[1,2])
[1] 0.1177221

Female students DLL vs. Non-DLL

rr_female <- matrix(c(state_wide_all$count_0_0_0_, state_wide_all$count_0_1_0_, state_wide_all$count_0_0_1_, state_wide_all$count_0_1_1_),2,2,byrow=TRUE)

dll <- c("No", "Yes")
outc <- c("No", "Yes")
dimnames(rr_female) <- list("Female DLL Status" = dll, "Female SPED Status" = outc)
epitools::riskratio(rr_female)
$data
                 Female SPED Status
Female DLL Status     No    Yes  Total
            No    469278  91299 560577
            Yes    71164  14362  85526
            Total 540442 105661 646103

$measure
                 risk ratio with 95% C.I.
Female DLL Status estimate    lower    upper
              No  1.000000       NA       NA
              Yes 1.031065 1.014643 1.047753

$p.value
                 two-sided
Female DLL Status  midp.exact fisher.exact   chi.square
              No           NA           NA           NA
              Yes 0.000202463 0.0002014787 0.0001942515

$correction
[1] FALSE

attr(,"method")
[1] "Unconditional MLE & normal approximation (Wald) CI"
rr_female[1,2]/(rr_female[1,1]+rr_female[1,2])
[1] 0.1628661

Male students DLL vs. Non-DLL

rr_male <- matrix(c(state_wide_all$count_1_0_0_, state_wide_all$count_1_1_0_, state_wide_all$count_1_0_1_, state_wide_all$count_1_1_1_),2,2,byrow=TRUE)

dll <- c("No", "Yes")
outc <- c("No", "Yes")
dimnames(rr_male) <- list("Male DLL Status" = dll, "Male SPED Status" = outc)
epitools::riskratio(rr_male)
$data
               Male SPED Status
Male DLL Status     No   Yes  Total
          No    493806 44942 538748
          Yes    65788  7038  72826
          Total 559594 51980 611574

$measure
               risk ratio with 95% C.I.
Male DLL Status estimate    lower    upper
            No    1.0000       NA       NA
            Yes   1.1585 1.131135 1.186527

$p.value
               two-sided
Male DLL Status midp.exact fisher.exact   chi.square
            No          NA           NA           NA
            Yes          0 3.656369e-32 3.191689e-33

$correction
[1] FALSE

attr(,"method")
[1] "Unconditional MLE & normal approximation (Wald) CI"
rr_male[1,2]/(rr_male[1,1]+rr_male[1,2])
[1] 0.08341934

Low SES students DLL vs. Non-DLL

rr_loses <- matrix(c(state_wide_all$count__0_0_1, state_wide_all$count__1_0_1, state_wide_all$count__0_1_1, state_wide_all$count__1_1_1),2,2,byrow=TRUE)

dll <- c("No", "Yes")
outc <- c("No", "Yes")
dimnames(rr_loses) <- list("Low SES DLL Status" = dll, "Low SES SPED Status" = outc)
epitools::riskratio(rr_loses)
$data
                  Low SES SPED Status
Low SES DLL Status     No   Yes  Total
             No    335466 67595 403061
             Yes    95326 15263 110589
             Total 430792 82858 513650

$measure
                  risk ratio with 95% C.I.
Low SES DLL Status  estimate     lower     upper
               No  1.0000000        NA        NA
               Yes 0.8229703 0.8097005 0.8364576

$p.value
                  two-sided
Low SES DLL Status midp.exact  fisher.exact    chi.square
               No          NA            NA            NA
               Yes          0 1.022524e-128 5.726996e-125

$correction
[1] FALSE

attr(,"method")
[1] "Unconditional MLE & normal approximation (Wald) CI"
rr_loses[1,2]/(rr_loses[1,1]+rr_loses[1,2])
[1] 0.1677041

High SES students DLL vs. Non-DLL

rr_hises <- matrix(c(state_wide_all$count__0_0_0, state_wide_all$count__1_0_0, state_wide_all$count__0_1_0, state_wide_all$count__1_1_0),2,2,byrow=TRUE)

dll <- c("No", "Yes")
outc <- c("No", "Yes")
dimnames(rr_hises) <- list("High SES DLL Status" = dll, "High SES SPED Status" = outc)
epitools::riskratio(rr_hises)
$data
                   High SES SPED Status
High SES DLL Status     No   Yes  Total
              No    627618 68646 696264
              Yes    41626  6137  47763
              Total 669244 74783 744027

$measure
                   risk ratio with 95% C.I.
High SES DLL Status estimate    lower    upper
                No  1.000000       NA       NA
                Yes 1.303236 1.271807 1.335443

$p.value
                   two-sided
High SES DLL Status midp.exact fisher.exact   chi.square
                No          NA           NA           NA
                Yes          0 1.213702e-91 4.202525e-98

$correction
[1] FALSE

attr(,"method")
[1] "Unconditional MLE & normal approximation (Wald) CI"
rr_hises[1,2]/(rr_hises[1,1]+rr_hises[1,2])
[1] 0.09859191

Asian students DLL vs. Non-DLL

rr_asian <- matrix(c(state_wide_all$count2__0_0_, state_wide_all$count2__1_0_, state_wide_all$count2__0_1_, state_wide_all$count2__1_1_),2,2,byrow=TRUE)

dll <- c("No", "Yes")
outc <- c("No", "Yes")
dimnames(rr_asian) <- list("Asian DLL Status" = dll, "Asian SPED Status" = outc)
epitools::riskratio(rr_asian)
$data
                Asian SPED Status
Asian DLL Status    No  Yes Total
           No    59189 2684 61873
           Yes   23974 2954 26928
           Total 83163 5638 88801

$measure
                risk ratio with 95% C.I.
Asian DLL Status estimate    lower    upper
             No  1.000000       NA       NA
             Yes 2.528862 2.404882 2.659233

$p.value
                two-sided
Asian DLL Status midp.exact fisher.exact    chi.square
             No          NA           NA            NA
             Yes          0 3.57862e-279 8.825298e-304

$correction
[1] FALSE

attr(,"method")
[1] "Unconditional MLE & normal approximation (Wald) CI"
rr_asian[1,2]/(rr_asian[1,1]+rr_asian[1,2])
[1] 0.04337918

Black students DLL vs. Non-DLL

rr_black <- matrix(c(state_wide_all$count3__0_0_, state_wide_all$count3__1_0_, state_wide_all$count3__0_1_, state_wide_all$count3__1_1_),2,2,byrow=TRUE)

dll <- c("No", "Yes")
outc <- c("No", "Yes")
dimnames(rr_black) <- list("Black DLL Status" = dll, "Black SPED Status" = outc)
epitools::riskratio(rr_black)
$data
                Black SPED Status
Black DLL Status     No   Yes  Total
           No    225333 41604 266937
           Yes     9306  1382  10688
           Total 234639 42986 277625

$measure
                risk ratio with 95% C.I.
Black DLL Status  estimate     lower     upper
             No  1.0000000        NA        NA
             Yes 0.8296316 0.7891845 0.8721517

$p.value
                two-sided
Black DLL Status   midp.exact fisher.exact   chi.square
             No            NA           NA           NA
             Yes 2.720046e-14 2.965385e-14 9.989572e-14

$correction
[1] FALSE

attr(,"method")
[1] "Unconditional MLE & normal approximation (Wald) CI"
rr_black[1,2]/(rr_black[1,1]+rr_black[1,2])
[1] 0.155857

Latinx students DLL vs. Non-DLL

rr_latinx <- matrix(c(state_wide_all$count4__0_0_, state_wide_all$count4__1_0_, state_wide_all$count4__0_1_, state_wide_all$count4__1_1_),2,2,byrow=TRUE)

dll <- c("No", "Yes")
outc <- c("No", "Yes")
dimnames(rr_latinx) <- list("Latinx DLL Status" = dll, "Latinx SPED Status" = outc)
epitools::riskratio(rr_latinx)
$data
                 Latinx SPED Status
Latinx DLL Status     No   Yes  Total
            No     84999  9367  94366
            Yes    87584 14815 102399
            Total 172583 24182 196765

$measure
                 risk ratio with 95% C.I.
Latinx DLL Status estimate   lower    upper
              No  1.000000      NA       NA
              Yes 1.457542 1.42253 1.493415

$p.value
                 two-sided
Latinx DLL Status midp.exact  fisher.exact    chi.square
              No          NA            NA            NA
              Yes          0 2.933738e-208 2.273166e-206

$correction
[1] FALSE

attr(,"method")
[1] "Unconditional MLE & normal approximation (Wald) CI"
rr_latinx[1,2]/(rr_latinx[1,1]+rr_latinx[1,2])
[1] 0.09926245

White students DLL vs. Non-DLL

rr_white <- matrix(c(state_wide_all$count5__0_0_, state_wide_all$count5__1_0_, state_wide_all$count5__0_1_, state_wide_all$count5__1_1_),2,2,byrow=TRUE)

dll <- c("No", "Yes")
outc <- c("No", "Yes")
dimnames(rr_white) <- list("White DLL Status" = dll, "White SPED Status" = outc)
epitools::riskratio(rr_white)
$data
                White SPED Status
White DLL Status     No   Yes  Total
           No    529497 73963 603460
           Yes    14083  1896  15979
           Total 543580 75859 619439

$measure
                risk ratio with 95% C.I.
White DLL Status  estimate     lower    upper
             No  1.0000000        NA       NA
             Yes 0.9681055 0.9275512 1.010433

$p.value
                two-sided
White DLL Status midp.exact fisher.exact chi.square
             No          NA           NA         NA
             Yes  0.1358838    0.1390848  0.1368039

$correction
[1] FALSE

attr(,"method")
[1] "Unconditional MLE & normal approximation (Wald) CI"
rr_white[1,2]/(rr_white[1,1]+rr_white[1,2])
[1] 0.1225649

RQ 1B Results:

Pattern for Count variable: race_gender_disability_dll_econ_disad

1=American Indian/Alaska Native 2=Asian 3=Black or African/American 4=Hispanic of any race 5=White

#Within Race/ethnicity and gender (K-12)

##(Asian DLL males)

rr_male_asian <- matrix(c(state_wide_all$count2_0_0_0_, state_wide_all$count2_0_1_0_, state_wide_all$count2_0_0_1_, state_wide_all$count2_0_1_1_),2,2,byrow=TRUE)

dll <- c("No", "Yes")
outc <- c("No", "Yes")
dimnames(rr_male_asian) <- list("DLL Status" = dll, "SPED Status" = outc)
epitools::riskratio(rr_male_asian)
$data
          SPED Status
DLL Status    No  Yes Total
     No    28437 1829 30266
     Yes   12868 2081 14949
     Total 41305 3910 45215

$measure
          risk ratio with 95% C.I.
DLL Status estimate    lower    upper
       No  1.000000       NA       NA
       Yes 2.303569 2.170102 2.445245

$p.value
          two-sided
DLL Status midp.exact  fisher.exact    chi.square
       No          NA            NA            NA
       Yes          0 1.074473e-162 5.792174e-173

$correction
[1] FALSE

attr(,"method")
[1] "Unconditional MLE & normal approximation (Wald) CI"
rr_male_asian[1,2]/(rr_male_asian[1,1]+rr_male_asian[1,2])
[1] 0.06043085

(Latinx)

rr_male_latinx <- matrix(c(state_wide_all$count4_0_0_0_, state_wide_all$count4_0_1_0_, state_wide_all$count4_0_0_1_, state_wide_all$count4_0_1_1_),2,2,byrow=TRUE)

dll <- c("No", "Yes")
outc <- c("No", "Yes")
dimnames(rr_male_latinx) <- list("DLL Status" = dll, "SPED Status" = outc)
epitools::riskratio(rr_male_latinx)
$data
          SPED Status
DLL Status    No   Yes  Total
     No    40702  6230  46932
     Yes   44895  9782  54677
     Total 85597 16012 101609

$measure
          risk ratio with 95% C.I.
DLL Status estimate    lower    upper
       No  1.000000       NA       NA
       Yes 1.347733 1.308846 1.387776

$p.value
          two-sided
DLL Status midp.exact fisher.exact   chi.square
       No          NA           NA           NA
       Yes          0 6.486957e-91 3.765577e-90

$correction
[1] FALSE

attr(,"method")
[1] "Unconditional MLE & normal approximation (Wald) CI"
rr_male_latinx[1,2]/(rr_male_latinx[1,1]+rr_male_latinx[1,2])
[1] 0.1327452

(Black)

rr_male_black <- matrix(c(state_wide_all$count3_0_0_0_, state_wide_all$count3_0_1_0_, state_wide_all$count3_0_0_1_, state_wide_all$count3_0_1_1_),2,2,byrow=TRUE)

dll <- c("No", "Yes")
outc <- c("No", "Yes")
dimnames(rr_male_black) <- list("DLL Status" = dll, "SPED Status" = outc)
epitools::riskratio(rr_male_black)
$data
          SPED Status
DLL Status     No   Yes  Total
     No    107845 27822 135667
     Yes     4862   968   5830
     Total 112707 28790 141497

$measure
          risk ratio with 95% C.I.
DLL Status  estimate     lower     upper
       No  1.0000000        NA        NA
       Yes 0.8096413 0.7636554 0.8583965

$p.value
          two-sided
DLL Status   midp.exact fisher.exact   chi.square
       No            NA           NA           NA
       Yes 1.173506e-13 1.360476e-13 4.169015e-13

$correction
[1] FALSE

attr(,"method")
[1] "Unconditional MLE & normal approximation (Wald) CI"
rr_male_black[1,2]/(rr_male_black[1,1]+rr_male_black[1,2])
[1] 0.2050757

#(Asian DLL females)

rr_female_asian <- matrix(c(state_wide_all$count2_1_0_0_, state_wide_all$count2_1_1_0_, state_wide_all$count2_1_0_1_, state_wide_all$count2_1_1_1_),2,2,byrow=TRUE)

dll <- c("No", "Yes")
outc <- c("No", "Yes")
dimnames(rr_female_asian) <- list("DLL Status" = dll, "SPED Status" = outc)
epitools::riskratio(rr_female_asian)
$data
          SPED Status
DLL Status    No  Yes Total
     No    30752  855 31607
     Yes   11106  873 11979
     Total 41858 1728 43586

$measure
          risk ratio with 95% C.I.
DLL Status estimate   lower    upper
       No  1.000000      NA       NA
       Yes 2.694082 2.45746 2.953488

$p.value
          two-sided
DLL Status midp.exact fisher.exact    chi.square
       No          NA           NA            NA
       Yes          0 5.139311e-95 3.286059e-106

$correction
[1] FALSE

attr(,"method")
[1] "Unconditional MLE & normal approximation (Wald) CI"
rr_female_asian[1,2]/(rr_female_asian[1,1]+rr_female_asian[1,2])
[1] 0.02705097

#(Latinx)

rr_female_latinx <- matrix(c(state_wide_all$count4_1_0_0_, state_wide_all$count4_1_1_0_, state_wide_all$count4_1_0_1_, state_wide_all$count4_1_1_1_),2,2,byrow=TRUE)

dll <- c("No", "Yes")
outc <- c("No", "Yes")
dimnames(rr_female_latinx) <- list("DLL Status" = dll, "SPED Status" = outc)
epitools::riskratio(rr_female_latinx)
$data
          SPED Status
DLL Status    No  Yes Total
     No    44297 3137 47434
     Yes   42689 5033 47722
     Total 86986 8170 95156

$measure
          risk ratio with 95% C.I.
DLL Status estimate    lower    upper
       No  1.000000       NA       NA
       Yes 1.594717 1.528001 1.664345

$p.value
          two-sided
DLL Status midp.exact  fisher.exact    chi.square
       No          NA            NA            NA
       Yes          0 8.988519e-105 5.674375e-104

$correction
[1] FALSE

attr(,"method")
[1] "Unconditional MLE & normal approximation (Wald) CI"
rr_female_latinx[1,2]/(rr_female_latinx[1,1]+rr_female_latinx[1,2])
[1] 0.066134

#(Black)

rr_female_black <- matrix(c(state_wide_all$count3_1_0_0_, state_wide_all$count3_1_1_0_, state_wide_all$count3_1_0_1_, state_wide_all$count3_1_1_1_),2,2,byrow=TRUE)

dll <- c("No", "Yes")
outc <- c("No", "Yes")
dimnames(rr_female_black) <- list("DLL Status" = dll, "SPED Status" = outc)
epitools::riskratio(rr_female_black)
$data
          SPED Status
DLL Status     No   Yes  Total
     No    117488 13782 131270
     Yes     4444   414   4858
     Total 121932 14196 136128

$measure
          risk ratio with 95% C.I.
DLL Status estimate     lower     upper
       No  1.000000        NA        NA
       Yes 0.811701 0.7392653 0.8912341

$p.value
          two-sided
DLL Status   midp.exact fisher.exact   chi.square
       No            NA           NA           NA
       Yes 5.500466e-06 6.154231e-06 9.542334e-06

$correction
[1] FALSE

attr(,"method")
[1] "Unconditional MLE & normal approximation (Wald) CI"
rr_female_black[1,2]/(rr_female_black[1,1]+rr_female_black[1,2])
[1] 0.1049897

#(Asian DLL Low SES males)

rr_male_loses_asian <- matrix(c(state_wide_all$count2_0_0_0_1, state_wide_all$count2_0_1_0_1, state_wide_all$count2_0_0_1_1, state_wide_all$count2_0_1_1_1),2,2,byrow=TRUE)

dll <- c("No", "Yes")
outc <- c("No", "Yes")
dimnames(rr_male_loses_asian) <- list("DLL Status" = dll, "SPED Status" = outc)
epitools::riskratio(rr_male_loses_asian)
$data
          SPED Status
DLL Status    No  Yes Total
     No     4545  413  4958
     Yes    5640  811  6451
     Total 10185 1224 11409

$measure
          risk ratio with 95% C.I.
DLL Status estimate    lower    upper
       No  1.000000       NA       NA
       Yes 1.509212 1.348559 1.689004

$p.value
          two-sided
DLL Status midp.exact fisher.exact   chi.square
       No          NA           NA           NA
       Yes 2.2915e-13 2.598932e-13 3.955507e-13

$correction
[1] FALSE

attr(,"method")
[1] "Unconditional MLE & normal approximation (Wald) CI"
rr_male_loses_asian[1,2]/(rr_male_loses_asian[1,1]+rr_male_loses_asian[1,2])
[1] 0.08329972

#(Latinx)

rr_male_loses_latinx <- matrix(c(state_wide_all$count4_0_0_0_1, state_wide_all$count4_0_1_0_1, state_wide_all$count4_0_0_1_1, state_wide_all$count4_0_1_1_1),2,2,byrow=TRUE)

dll <- c("No", "Yes")
outc <- c("No", "Yes")
dimnames(rr_male_loses_latinx) <- list("DLL Status" = dll, "SPED Status" = outc)
epitools::riskratio(rr_male_loses_latinx)
$data
          SPED Status
DLL Status    No   Yes Total
     No    19788  3124 22912
     Yes   35501  7963 43464
     Total 55289 11087 66376

$measure
          risk ratio with 95% C.I.
DLL Status estimate    lower    upper
       No   1.00000       NA       NA
       Yes  1.34369 1.293383 1.395953

$p.value
          two-sided
DLL Status midp.exact fisher.exact   chi.square
       No          NA           NA           NA
       Yes          0 9.228997e-55 1.961782e-53

$correction
[1] FALSE

attr(,"method")
[1] "Unconditional MLE & normal approximation (Wald) CI"
rr_male_loses_latinx[1,2]/(rr_male_loses_latinx[1,1]+rr_male_loses_latinx[1,2])
[1] 0.1363478

#(Black)

rr_male_loses_black <- matrix(c(state_wide_all$count3_0_0_0_1, state_wide_all$count3_0_1_0_1, state_wide_all$count3_0_0_1_1, state_wide_all$count3_0_1_1_1),2,2,byrow=TRUE)

dll <- c("No", "Yes")
outc <- c("No", "Yes")
dimnames(rr_male_loses_black) <- list("DLL Status" = dll, "SPED Status" = outc)
epitools::riskratio(rr_male_loses_black)
$data
          SPED Status
DLL Status    No   Yes Total
     No    65212 19388 84600
     Yes    3497   672  4169
     Total 68709 20060 88769

$measure
          risk ratio with 95% C.I.
DLL Status  estimate    lower    upper
       No  1.0000000       NA       NA
       Yes 0.7033552 0.655581 0.754611

$p.value
          two-sided
DLL Status midp.exact fisher.exact   chi.square
       No          NA           NA           NA
       Yes          0 2.604473e-26 1.232078e-24

$correction
[1] FALSE

attr(,"method")
[1] "Unconditional MLE & normal approximation (Wald) CI"
rr_male_loses_black[1,2]/(rr_male_loses_black[1,1]+rr_male_loses_black[1,2])
[1] 0.2291726

#(Asian Low SES females)

rr_female_loses_asian <- matrix(c(state_wide_all$count2_1_0_0_1, state_wide_all$count2_1_1_0_1, state_wide_all$count2_1_0_1_1, state_wide_all$count2_1_1_1_1),2,2,byrow=TRUE)

dll <- c("No", "Yes")
outc <- c("No", "Yes")
dimnames(rr_female_loses_asian) <- list("DLL Status" = dll, "SPED Status" = outc)
epitools::riskratio(rr_female_loses_asian)
$data
          SPED Status
DLL Status   No Yes Total
     No    4843 135  4978
     Yes   5144 372  5516
     Total 9987 507 10494

$measure
          risk ratio with 95% C.I.
DLL Status estimate    lower    upper
       No  1.000000       NA       NA
       Yes 2.486794 2.049974 3.016695

$p.value
          two-sided
DLL Status midp.exact fisher.exact   chi.square
       No          NA           NA           NA
       Yes          0 1.086479e-22 6.664128e-22

$correction
[1] FALSE

attr(,"method")
[1] "Unconditional MLE & normal approximation (Wald) CI"
rr_female_loses_asian[1,2]/(rr_female_loses_asian[1,1]+rr_female_loses_asian[1,2])
[1] 0.02711933

#(Latinx)

rr_female_loses_latinx <- matrix(c(state_wide_all$count4_1_0_0_1, state_wide_all$count4_1_1_0_1, state_wide_all$count4_1_0_1_1, state_wide_all$count4_1_1_1_1),2,2,byrow=TRUE)

dll <- c("No", "Yes")
outc <- c("No", "Yes")
dimnames(rr_female_loses_latinx) <- list("DLL Status" = dll, "SPED Status" = outc)
epitools::riskratio(rr_female_loses_latinx)
$data
          SPED Status
DLL Status    No  Yes Total
     No    22067 1600 23667
     Yes   34184 4125 38309
     Total 56251 5725 61976

$measure
          risk ratio with 95% C.I.
DLL Status estimate    lower   upper
       No  1.000000       NA      NA
       Yes 1.592745 1.506901 1.68348

$p.value
          two-sided
DLL Status midp.exact fisher.exact   chi.square
       No          NA           NA           NA
       Yes          0 2.664639e-65 6.828258e-63

$correction
[1] FALSE

attr(,"method")
[1] "Unconditional MLE & normal approximation (Wald) CI"
rr_female_loses_latinx[1,2]/(rr_female_loses_latinx[1,1]+rr_female_loses_latinx[1,2])
[1] 0.06760468

#(Black)

rr_female_loses_black <- matrix(c(state_wide_all$count3_1_0_0_1, state_wide_all$count3_1_1_0_1, state_wide_all$count3_1_0_1_1, state_wide_all$count3_1_1_1_1),2,2,byrow=TRUE)

dll <- c("No", "Yes")
outc <- c("No", "Yes")
dimnames(rr_female_loses_black) <- list("DLL Status" = dll, "SPED Status" = outc)
epitools::riskratio(rr_female_loses_black)
$data
          SPED Status
DLL Status    No   Yes Total
     No    72458  9992 82450
     Yes    3262   290  3552
     Total 75720 10282 86002

$measure
          risk ratio with 95% C.I.
DLL Status  estimate    lower     upper
       No  1.0000000       NA        NA
       Yes 0.6736949 0.602424 0.7533977

$p.value
          two-sided
DLL Status   midp.exact fisher.exact   chi.square
       No            NA           NA           NA
       Yes 8.204548e-14 1.005558e-13 1.138879e-12

$correction
[1] FALSE

attr(,"method")
[1] "Unconditional MLE & normal approximation (Wald) CI"
rr_female_loses_black[1,2]/(rr_female_loses_black[1,1]+rr_female_loses_black[1,2])
[1] 0.1211886
LS0tCnRpdGxlOiAiUmlzayBSYXRpb3MgYW5kIENvbmZpZGVuY2UgSW50ZXJ2YWwgQ2FsY3VsYXRpb24gZm9yIE1DIFBhcGVyIgphdXRob3I6ICJNREIiCmRhdGU6ICIxMC8yNi8yMDIwIgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKLS0tCgojIExvYWQgc29tZSB1c2VmdWwgcGFja2FnZXMKYGBge3J9CnN1cHByZXNzUGFja2FnZVN0YXJ0dXBNZXNzYWdlcyhsaWJyYXJ5KHRpZHl2ZXJzZSkpCmxpYnJhcnkoaGF2ZW4pCmBgYAoKIyBMb2FkIGluIHRoZSBzdW1tYXJ5IGRhdGFzZXRzIGluIFN0YXRhIGZvcm1hdDoKYGBge3J9CnN0YXRlX3dpZGVfYWxsIDwtIHJlYWRfZHRhKCIyMDE3X3N0YXRlX3dpZGVfYWxsLmR0YSIpCmhlYWQoc3RhdGVfd2lkZV9hbGwpCgpzdGF0ZV93aWRlX2VsZW0gPC0gcmVhZF9kdGEoInN0YXRlX3dpZGVfZWxlbS5kdGEiKQpoZWFkKHN0YXRlX3dpZGVfZWxlbSkKCnN0YXRlX3dpZGVfc2VjIDwtIHJlYWRfZHRhKCJzdGF0ZV93aWRlX3NlYy5kdGEiKQpoZWFkKHN0YXRlX3dpZGVfc2VjKQpgYGAKCiMgUlJScyBmb3IgQWxsIFN0dWRlbnRzCmBgYHtyfQpycl9hbGwgPC0gbWF0cml4KGMoc3RhdGVfd2lkZV9hbGwkY291bnRfXzBfMF8sIHN0YXRlX3dpZGVfYWxsJGNvdW50X18xXzBfLCBzdGF0ZV93aWRlX2FsbCRjb3VudF9fMF8xXywgc3RhdGVfd2lkZV9hbGwkY291bnRfXzFfMV8pLDIsMixieXJvdz1UUlVFKQoKZGxsIDwtIGMoIk5vIiwgIlllcyIpCm91dGMgPC0gYygiTm8iLCAiWWVzIikKZGltbmFtZXMocnJfYWxsKSA8LSBsaXN0KCJETEwgU3RhdHVzIiA9IGRsbCwgIlNQRUQgU3RhdHVzIiA9IG91dGMpCmVwaXRvb2xzOjpyaXNrcmF0aW8ocnJfYWxsKQpycl9hbGxbMSwyXS8ocnJfYWxsWzEsMV0rcnJfYWxsWzEsMl0pCmBgYAoKIyBFbGVtZW50YXJ5IHZzLiBTZWNvbmRhcnkgUlJScwojIyBBbGwgU3R1ZGVudHMgKFNlY29uZGFyeSkKYGBge3J9CnJyX3NlYyA8LSBtYXRyaXgoYyhzdGF0ZV93aWRlX3NlYyRjb3VudF9fMF8wXywgc3RhdGVfd2lkZV9zZWMkY291bnRfXzFfMF8sIHN0YXRlX3dpZGVfc2VjJGNvdW50X18wXzFfLCBzdGF0ZV93aWRlX3NlYyRjb3VudF9fMV8xXyksMiwyLGJ5cm93PVRSVUUpCgpkbGwgPC0gYygiTm8iLCAiWWVzIikKb3V0YyA8LSBjKCJObyIsICJZZXMiKQpkaW1uYW1lcyhycl9zZWMpIDwtIGxpc3QoIkRMTCBTdGF0dXMiID0gZGxsLCAiU1BFRCBTdGF0dXMiID0gb3V0YykKZXBpdG9vbHM6OnJpc2tyYXRpbyhycl9zZWMpCgpycl9zZWNbMSwyXS8ocnJfc2VjWzEsMV0rcnJfc2VjWzEsMl0pCmBgYAoKIyMgQWxsIFN0dWRlbnRzIChFbGVtZW50YXJ5KQpgYGB7cn0KcnJfZWxlbSA8LSBtYXRyaXgoYyhzdGF0ZV93aWRlX2VsZW0kY291bnRfXzBfMF8sIHN0YXRlX3dpZGVfZWxlbSRjb3VudF9fMV8wXywgc3RhdGVfd2lkZV9lbGVtJGNvdW50X18wXzFfLCBzdGF0ZV93aWRlX2VsZW0kY291bnRfXzFfMV8pLDIsMixieXJvdz1UUlVFKQoKZGxsIDwtIGMoIk5vIiwgIlllcyIpCm91dGMgPC0gYygiTm8iLCAiWWVzIikKZGltbmFtZXMocnJfZWxlbSkgPC0gbGlzdCgiRExMIFN0YXR1cyIgPSBkbGwsICJTUEVEIFN0YXR1cyIgPSBvdXRjKQplcGl0b29sczo6cmlza3JhdGlvKHJyX2VsZW0pCgpycl9lbGVtWzEsMl0vKHJyX2VsZW1bMSwxXStycl9lbGVtWzEsMl0pCmBgYAoKIyMgRmVtYWxlIHN0dWRlbnRzIERMTCB2cy4gTm9uLURMTApgYGB7cn0KcnJfZmVtYWxlIDwtIG1hdHJpeChjKHN0YXRlX3dpZGVfYWxsJGNvdW50XzBfMF8wXywgc3RhdGVfd2lkZV9hbGwkY291bnRfMF8xXzBfLCBzdGF0ZV93aWRlX2FsbCRjb3VudF8wXzBfMV8sIHN0YXRlX3dpZGVfYWxsJGNvdW50XzBfMV8xXyksMiwyLGJ5cm93PVRSVUUpCgpkbGwgPC0gYygiTm8iLCAiWWVzIikKb3V0YyA8LSBjKCJObyIsICJZZXMiKQpkaW1uYW1lcyhycl9mZW1hbGUpIDwtIGxpc3QoIkZlbWFsZSBETEwgU3RhdHVzIiA9IGRsbCwgIkZlbWFsZSBTUEVEIFN0YXR1cyIgPSBvdXRjKQplcGl0b29sczo6cmlza3JhdGlvKHJyX2ZlbWFsZSkKCnJyX2ZlbWFsZVsxLDJdLyhycl9mZW1hbGVbMSwxXStycl9mZW1hbGVbMSwyXSkKYGBgCgojIyBNYWxlIHN0dWRlbnRzIERMTCB2cy4gTm9uLURMTApgYGB7cn0KcnJfbWFsZSA8LSBtYXRyaXgoYyhzdGF0ZV93aWRlX2FsbCRjb3VudF8xXzBfMF8sIHN0YXRlX3dpZGVfYWxsJGNvdW50XzFfMV8wXywgc3RhdGVfd2lkZV9hbGwkY291bnRfMV8wXzFfLCBzdGF0ZV93aWRlX2FsbCRjb3VudF8xXzFfMV8pLDIsMixieXJvdz1UUlVFKQoKZGxsIDwtIGMoIk5vIiwgIlllcyIpCm91dGMgPC0gYygiTm8iLCAiWWVzIikKZGltbmFtZXMocnJfbWFsZSkgPC0gbGlzdCgiTWFsZSBETEwgU3RhdHVzIiA9IGRsbCwgIk1hbGUgU1BFRCBTdGF0dXMiID0gb3V0YykKZXBpdG9vbHM6OnJpc2tyYXRpbyhycl9tYWxlKQoKcnJfbWFsZVsxLDJdLyhycl9tYWxlWzEsMV0rcnJfbWFsZVsxLDJdKQoKYGBgCgojIyBMb3cgU0VTIHN0dWRlbnRzIERMTCB2cy4gTm9uLURMTApgYGB7cn0KcnJfbG9zZXMgPC0gbWF0cml4KGMoc3RhdGVfd2lkZV9hbGwkY291bnRfXzBfMF8xLCBzdGF0ZV93aWRlX2FsbCRjb3VudF9fMV8wXzEsIHN0YXRlX3dpZGVfYWxsJGNvdW50X18wXzFfMSwgc3RhdGVfd2lkZV9hbGwkY291bnRfXzFfMV8xKSwyLDIsYnlyb3c9VFJVRSkKCmRsbCA8LSBjKCJObyIsICJZZXMiKQpvdXRjIDwtIGMoIk5vIiwgIlllcyIpCmRpbW5hbWVzKHJyX2xvc2VzKSA8LSBsaXN0KCJMb3cgU0VTIERMTCBTdGF0dXMiID0gZGxsLCAiTG93IFNFUyBTUEVEIFN0YXR1cyIgPSBvdXRjKQplcGl0b29sczo6cmlza3JhdGlvKHJyX2xvc2VzKQoKcnJfbG9zZXNbMSwyXS8ocnJfbG9zZXNbMSwxXStycl9sb3Nlc1sxLDJdKQoKYGBgCgojIyBIaWdoIFNFUyBzdHVkZW50cyBETEwgdnMuIE5vbi1ETEwKYGBge3J9CnJyX2hpc2VzIDwtIG1hdHJpeChjKHN0YXRlX3dpZGVfYWxsJGNvdW50X18wXzBfMCwgc3RhdGVfd2lkZV9hbGwkY291bnRfXzFfMF8wLCBzdGF0ZV93aWRlX2FsbCRjb3VudF9fMF8xXzAsIHN0YXRlX3dpZGVfYWxsJGNvdW50X18xXzFfMCksMiwyLGJ5cm93PVRSVUUpCgpkbGwgPC0gYygiTm8iLCAiWWVzIikKb3V0YyA8LSBjKCJObyIsICJZZXMiKQpkaW1uYW1lcyhycl9oaXNlcykgPC0gbGlzdCgiSGlnaCBTRVMgRExMIFN0YXR1cyIgPSBkbGwsICJIaWdoIFNFUyBTUEVEIFN0YXR1cyIgPSBvdXRjKQplcGl0b29sczo6cmlza3JhdGlvKHJyX2hpc2VzKQoKcnJfaGlzZXNbMSwyXS8ocnJfaGlzZXNbMSwxXStycl9oaXNlc1sxLDJdKQoKYGBgCgojIyBBc2lhbiBzdHVkZW50cyBETEwgdnMuIE5vbi1ETEwKYGBge3J9CnJyX2FzaWFuIDwtIG1hdHJpeChjKHN0YXRlX3dpZGVfYWxsJGNvdW50Ml9fMF8wXywgc3RhdGVfd2lkZV9hbGwkY291bnQyX18xXzBfLCBzdGF0ZV93aWRlX2FsbCRjb3VudDJfXzBfMV8sIHN0YXRlX3dpZGVfYWxsJGNvdW50Ml9fMV8xXyksMiwyLGJ5cm93PVRSVUUpCgpkbGwgPC0gYygiTm8iLCAiWWVzIikKb3V0YyA8LSBjKCJObyIsICJZZXMiKQpkaW1uYW1lcyhycl9hc2lhbikgPC0gbGlzdCgiQXNpYW4gRExMIFN0YXR1cyIgPSBkbGwsICJBc2lhbiBTUEVEIFN0YXR1cyIgPSBvdXRjKQplcGl0b29sczo6cmlza3JhdGlvKHJyX2FzaWFuKQoKcnJfYXNpYW5bMSwyXS8ocnJfYXNpYW5bMSwxXStycl9hc2lhblsxLDJdKQoKYGBgCgojIyBCbGFjayBzdHVkZW50cyBETEwgdnMuIE5vbi1ETEwKYGBge3J9CnJyX2JsYWNrIDwtIG1hdHJpeChjKHN0YXRlX3dpZGVfYWxsJGNvdW50M19fMF8wXywgc3RhdGVfd2lkZV9hbGwkY291bnQzX18xXzBfLCBzdGF0ZV93aWRlX2FsbCRjb3VudDNfXzBfMV8sIHN0YXRlX3dpZGVfYWxsJGNvdW50M19fMV8xXyksMiwyLGJ5cm93PVRSVUUpCgpkbGwgPC0gYygiTm8iLCAiWWVzIikKb3V0YyA8LSBjKCJObyIsICJZZXMiKQpkaW1uYW1lcyhycl9ibGFjaykgPC0gbGlzdCgiQmxhY2sgRExMIFN0YXR1cyIgPSBkbGwsICJCbGFjayBTUEVEIFN0YXR1cyIgPSBvdXRjKQplcGl0b29sczo6cmlza3JhdGlvKHJyX2JsYWNrKQoKcnJfYmxhY2tbMSwyXS8ocnJfYmxhY2tbMSwxXStycl9ibGFja1sxLDJdKQoKYGBgCgojIyBMYXRpbnggc3R1ZGVudHMgRExMIHZzLiBOb24tRExMCmBgYHtyfQpycl9sYXRpbnggPC0gbWF0cml4KGMoc3RhdGVfd2lkZV9hbGwkY291bnQ0X18wXzBfLCBzdGF0ZV93aWRlX2FsbCRjb3VudDRfXzFfMF8sIHN0YXRlX3dpZGVfYWxsJGNvdW50NF9fMF8xXywgc3RhdGVfd2lkZV9hbGwkY291bnQ0X18xXzFfKSwyLDIsYnlyb3c9VFJVRSkKCmRsbCA8LSBjKCJObyIsICJZZXMiKQpvdXRjIDwtIGMoIk5vIiwgIlllcyIpCmRpbW5hbWVzKHJyX2xhdGlueCkgPC0gbGlzdCgiTGF0aW54IERMTCBTdGF0dXMiID0gZGxsLCAiTGF0aW54IFNQRUQgU3RhdHVzIiA9IG91dGMpCmVwaXRvb2xzOjpyaXNrcmF0aW8ocnJfbGF0aW54KQoKcnJfbGF0aW54WzEsMl0vKHJyX2xhdGlueFsxLDFdK3JyX2xhdGlueFsxLDJdKQoKYGBgCgojIyBXaGl0ZSBzdHVkZW50cyBETEwgdnMuIE5vbi1ETEwKYGBge3J9CnJyX3doaXRlIDwtIG1hdHJpeChjKHN0YXRlX3dpZGVfYWxsJGNvdW50NV9fMF8wXywgc3RhdGVfd2lkZV9hbGwkY291bnQ1X18xXzBfLCBzdGF0ZV93aWRlX2FsbCRjb3VudDVfXzBfMV8sIHN0YXRlX3dpZGVfYWxsJGNvdW50NV9fMV8xXyksMiwyLGJ5cm93PVRSVUUpCgpkbGwgPC0gYygiTm8iLCAiWWVzIikKb3V0YyA8LSBjKCJObyIsICJZZXMiKQpkaW1uYW1lcyhycl93aGl0ZSkgPC0gbGlzdCgiV2hpdGUgRExMIFN0YXR1cyIgPSBkbGwsICJXaGl0ZSBTUEVEIFN0YXR1cyIgPSBvdXRjKQplcGl0b29sczo6cmlza3JhdGlvKHJyX3doaXRlKQoKcnJfd2hpdGVbMSwyXS8ocnJfd2hpdGVbMSwxXStycl93aGl0ZVsxLDJdKQpgYGAKCiMgUlEgMUIgUmVzdWx0czoKClBhdHRlcm4gZm9yIENvdW50IHZhcmlhYmxlOgpyYWNlX2dlbmRlcl9kaXNhYmlsaXR5X2RsbF9lY29uX2Rpc2FkCgoxPUFtZXJpY2FuIEluZGlhbi9BbGFza2EgTmF0aXZlCjI9QXNpYW4KMz1CbGFjayBvciBBZnJpY2FuL0FtZXJpY2FuCjQ9SGlzcGFuaWMgb2YgYW55IHJhY2UKNT1XaGl0ZQoKI1dpdGhpbiBSYWNlL2V0aG5pY2l0eSBhbmQgZ2VuZGVyIChLLTEyKQoKIyMoQXNpYW4gRExMIG1hbGVzKQpgYGB7cn0KcnJfbWFsZV9hc2lhbiA8LSBtYXRyaXgoYyhzdGF0ZV93aWRlX2FsbCRjb3VudDJfMF8wXzBfLCBzdGF0ZV93aWRlX2FsbCRjb3VudDJfMF8xXzBfLCBzdGF0ZV93aWRlX2FsbCRjb3VudDJfMF8wXzFfLCBzdGF0ZV93aWRlX2FsbCRjb3VudDJfMF8xXzFfKSwyLDIsYnlyb3c9VFJVRSkKCmRsbCA8LSBjKCJObyIsICJZZXMiKQpvdXRjIDwtIGMoIk5vIiwgIlllcyIpCmRpbW5hbWVzKHJyX21hbGVfYXNpYW4pIDwtIGxpc3QoIkRMTCBTdGF0dXMiID0gZGxsLCAiU1BFRCBTdGF0dXMiID0gb3V0YykKZXBpdG9vbHM6OnJpc2tyYXRpbyhycl9tYWxlX2FzaWFuKQoKcnJfbWFsZV9hc2lhblsxLDJdLyhycl9tYWxlX2FzaWFuWzEsMV0rcnJfbWFsZV9hc2lhblsxLDJdKQpgYGAKCiMgKExhdGlueCkKYGBge3J9CnJyX21hbGVfbGF0aW54IDwtIG1hdHJpeChjKHN0YXRlX3dpZGVfYWxsJGNvdW50NF8wXzBfMF8sIHN0YXRlX3dpZGVfYWxsJGNvdW50NF8wXzFfMF8sIHN0YXRlX3dpZGVfYWxsJGNvdW50NF8wXzBfMV8sIHN0YXRlX3dpZGVfYWxsJGNvdW50NF8wXzFfMV8pLDIsMixieXJvdz1UUlVFKQoKZGxsIDwtIGMoIk5vIiwgIlllcyIpCm91dGMgPC0gYygiTm8iLCAiWWVzIikKZGltbmFtZXMocnJfbWFsZV9sYXRpbngpIDwtIGxpc3QoIkRMTCBTdGF0dXMiID0gZGxsLCAiU1BFRCBTdGF0dXMiID0gb3V0YykKZXBpdG9vbHM6OnJpc2tyYXRpbyhycl9tYWxlX2xhdGlueCkKCnJyX21hbGVfbGF0aW54WzEsMl0vKHJyX21hbGVfbGF0aW54WzEsMV0rcnJfbWFsZV9sYXRpbnhbMSwyXSkKCmBgYAoKIyAoQmxhY2spCmBgYHtyfQpycl9tYWxlX2JsYWNrIDwtIG1hdHJpeChjKHN0YXRlX3dpZGVfYWxsJGNvdW50M18wXzBfMF8sIHN0YXRlX3dpZGVfYWxsJGNvdW50M18wXzFfMF8sIHN0YXRlX3dpZGVfYWxsJGNvdW50M18wXzBfMV8sIHN0YXRlX3dpZGVfYWxsJGNvdW50M18wXzFfMV8pLDIsMixieXJvdz1UUlVFKQoKZGxsIDwtIGMoIk5vIiwgIlllcyIpCm91dGMgPC0gYygiTm8iLCAiWWVzIikKZGltbmFtZXMocnJfbWFsZV9ibGFjaykgPC0gbGlzdCgiRExMIFN0YXR1cyIgPSBkbGwsICJTUEVEIFN0YXR1cyIgPSBvdXRjKQplcGl0b29sczo6cmlza3JhdGlvKHJyX21hbGVfYmxhY2spCgpycl9tYWxlX2JsYWNrWzEsMl0vKHJyX21hbGVfYmxhY2tbMSwxXStycl9tYWxlX2JsYWNrWzEsMl0pCgpgYGAKCiMoQXNpYW4gRExMIGZlbWFsZXMpCmBgYHtyfQpycl9mZW1hbGVfYXNpYW4gPC0gbWF0cml4KGMoc3RhdGVfd2lkZV9hbGwkY291bnQyXzFfMF8wXywgc3RhdGVfd2lkZV9hbGwkY291bnQyXzFfMV8wXywgc3RhdGVfd2lkZV9hbGwkY291bnQyXzFfMF8xXywgc3RhdGVfd2lkZV9hbGwkY291bnQyXzFfMV8xXyksMiwyLGJ5cm93PVRSVUUpCgpkbGwgPC0gYygiTm8iLCAiWWVzIikKb3V0YyA8LSBjKCJObyIsICJZZXMiKQpkaW1uYW1lcyhycl9mZW1hbGVfYXNpYW4pIDwtIGxpc3QoIkRMTCBTdGF0dXMiID0gZGxsLCAiU1BFRCBTdGF0dXMiID0gb3V0YykKZXBpdG9vbHM6OnJpc2tyYXRpbyhycl9mZW1hbGVfYXNpYW4pCgpycl9mZW1hbGVfYXNpYW5bMSwyXS8ocnJfZmVtYWxlX2FzaWFuWzEsMV0rcnJfZmVtYWxlX2FzaWFuWzEsMl0pCgpgYGAKCiMoTGF0aW54KQpgYGB7cn0KcnJfZmVtYWxlX2xhdGlueCA8LSBtYXRyaXgoYyhzdGF0ZV93aWRlX2FsbCRjb3VudDRfMV8wXzBfLCBzdGF0ZV93aWRlX2FsbCRjb3VudDRfMV8xXzBfLCBzdGF0ZV93aWRlX2FsbCRjb3VudDRfMV8wXzFfLCBzdGF0ZV93aWRlX2FsbCRjb3VudDRfMV8xXzFfKSwyLDIsYnlyb3c9VFJVRSkKCmRsbCA8LSBjKCJObyIsICJZZXMiKQpvdXRjIDwtIGMoIk5vIiwgIlllcyIpCmRpbW5hbWVzKHJyX2ZlbWFsZV9sYXRpbngpIDwtIGxpc3QoIkRMTCBTdGF0dXMiID0gZGxsLCAiU1BFRCBTdGF0dXMiID0gb3V0YykKZXBpdG9vbHM6OnJpc2tyYXRpbyhycl9mZW1hbGVfbGF0aW54KQoKcnJfZmVtYWxlX2xhdGlueFsxLDJdLyhycl9mZW1hbGVfbGF0aW54WzEsMV0rcnJfZmVtYWxlX2xhdGlueFsxLDJdKQoKYGBgCgojKEJsYWNrKQpgYGB7cn0KcnJfZmVtYWxlX2JsYWNrIDwtIG1hdHJpeChjKHN0YXRlX3dpZGVfYWxsJGNvdW50M18xXzBfMF8sIHN0YXRlX3dpZGVfYWxsJGNvdW50M18xXzFfMF8sIHN0YXRlX3dpZGVfYWxsJGNvdW50M18xXzBfMV8sIHN0YXRlX3dpZGVfYWxsJGNvdW50M18xXzFfMV8pLDIsMixieXJvdz1UUlVFKQoKZGxsIDwtIGMoIk5vIiwgIlllcyIpCm91dGMgPC0gYygiTm8iLCAiWWVzIikKZGltbmFtZXMocnJfZmVtYWxlX2JsYWNrKSA8LSBsaXN0KCJETEwgU3RhdHVzIiA9IGRsbCwgIlNQRUQgU3RhdHVzIiA9IG91dGMpCmVwaXRvb2xzOjpyaXNrcmF0aW8ocnJfZmVtYWxlX2JsYWNrKQoKcnJfZmVtYWxlX2JsYWNrWzEsMl0vKHJyX2ZlbWFsZV9ibGFja1sxLDFdK3JyX2ZlbWFsZV9ibGFja1sxLDJdKQpgYGAKCiMoQXNpYW4gRExMIExvdyBTRVMgbWFsZXMpCmBgYHtyfQpycl9tYWxlX2xvc2VzX2FzaWFuIDwtIG1hdHJpeChjKHN0YXRlX3dpZGVfYWxsJGNvdW50Ml8wXzBfMF8xLCBzdGF0ZV93aWRlX2FsbCRjb3VudDJfMF8xXzBfMSwgc3RhdGVfd2lkZV9hbGwkY291bnQyXzBfMF8xXzEsIHN0YXRlX3dpZGVfYWxsJGNvdW50Ml8wXzFfMV8xKSwyLDIsYnlyb3c9VFJVRSkKCmRsbCA8LSBjKCJObyIsICJZZXMiKQpvdXRjIDwtIGMoIk5vIiwgIlllcyIpCmRpbW5hbWVzKHJyX21hbGVfbG9zZXNfYXNpYW4pIDwtIGxpc3QoIkRMTCBTdGF0dXMiID0gZGxsLCAiU1BFRCBTdGF0dXMiID0gb3V0YykKZXBpdG9vbHM6OnJpc2tyYXRpbyhycl9tYWxlX2xvc2VzX2FzaWFuKQoKcnJfbWFsZV9sb3Nlc19hc2lhblsxLDJdLyhycl9tYWxlX2xvc2VzX2FzaWFuWzEsMV0rcnJfbWFsZV9sb3Nlc19hc2lhblsxLDJdKQoKYGBgCgojKExhdGlueCkKYGBge3J9CnJyX21hbGVfbG9zZXNfbGF0aW54IDwtIG1hdHJpeChjKHN0YXRlX3dpZGVfYWxsJGNvdW50NF8wXzBfMF8xLCBzdGF0ZV93aWRlX2FsbCRjb3VudDRfMF8xXzBfMSwgc3RhdGVfd2lkZV9hbGwkY291bnQ0XzBfMF8xXzEsIHN0YXRlX3dpZGVfYWxsJGNvdW50NF8wXzFfMV8xKSwyLDIsYnlyb3c9VFJVRSkKCmRsbCA8LSBjKCJObyIsICJZZXMiKQpvdXRjIDwtIGMoIk5vIiwgIlllcyIpCmRpbW5hbWVzKHJyX21hbGVfbG9zZXNfbGF0aW54KSA8LSBsaXN0KCJETEwgU3RhdHVzIiA9IGRsbCwgIlNQRUQgU3RhdHVzIiA9IG91dGMpCmVwaXRvb2xzOjpyaXNrcmF0aW8ocnJfbWFsZV9sb3Nlc19sYXRpbngpCgpycl9tYWxlX2xvc2VzX2xhdGlueFsxLDJdLyhycl9tYWxlX2xvc2VzX2xhdGlueFsxLDFdK3JyX21hbGVfbG9zZXNfbGF0aW54WzEsMl0pCgpgYGAKCiMoQmxhY2spCmBgYHtyfQpycl9tYWxlX2xvc2VzX2JsYWNrIDwtIG1hdHJpeChjKHN0YXRlX3dpZGVfYWxsJGNvdW50M18wXzBfMF8xLCBzdGF0ZV93aWRlX2FsbCRjb3VudDNfMF8xXzBfMSwgc3RhdGVfd2lkZV9hbGwkY291bnQzXzBfMF8xXzEsIHN0YXRlX3dpZGVfYWxsJGNvdW50M18wXzFfMV8xKSwyLDIsYnlyb3c9VFJVRSkKCmRsbCA8LSBjKCJObyIsICJZZXMiKQpvdXRjIDwtIGMoIk5vIiwgIlllcyIpCmRpbW5hbWVzKHJyX21hbGVfbG9zZXNfYmxhY2spIDwtIGxpc3QoIkRMTCBTdGF0dXMiID0gZGxsLCAiU1BFRCBTdGF0dXMiID0gb3V0YykKZXBpdG9vbHM6OnJpc2tyYXRpbyhycl9tYWxlX2xvc2VzX2JsYWNrKQoKcnJfbWFsZV9sb3Nlc19ibGFja1sxLDJdLyhycl9tYWxlX2xvc2VzX2JsYWNrWzEsMV0rcnJfbWFsZV9sb3Nlc19ibGFja1sxLDJdKQoKYGBgCgojKEFzaWFuIExvdyBTRVMgZmVtYWxlcykKYGBge3J9CnJyX2ZlbWFsZV9sb3Nlc19hc2lhbiA8LSBtYXRyaXgoYyhzdGF0ZV93aWRlX2FsbCRjb3VudDJfMV8wXzBfMSwgc3RhdGVfd2lkZV9hbGwkY291bnQyXzFfMV8wXzEsIHN0YXRlX3dpZGVfYWxsJGNvdW50Ml8xXzBfMV8xLCBzdGF0ZV93aWRlX2FsbCRjb3VudDJfMV8xXzFfMSksMiwyLGJ5cm93PVRSVUUpCgpkbGwgPC0gYygiTm8iLCAiWWVzIikKb3V0YyA8LSBjKCJObyIsICJZZXMiKQpkaW1uYW1lcyhycl9mZW1hbGVfbG9zZXNfYXNpYW4pIDwtIGxpc3QoIkRMTCBTdGF0dXMiID0gZGxsLCAiU1BFRCBTdGF0dXMiID0gb3V0YykKZXBpdG9vbHM6OnJpc2tyYXRpbyhycl9mZW1hbGVfbG9zZXNfYXNpYW4pCgpycl9mZW1hbGVfbG9zZXNfYXNpYW5bMSwyXS8ocnJfZmVtYWxlX2xvc2VzX2FzaWFuWzEsMV0rcnJfZmVtYWxlX2xvc2VzX2FzaWFuWzEsMl0pCgpgYGAKCiMoTGF0aW54KQpgYGB7cn0KcnJfZmVtYWxlX2xvc2VzX2xhdGlueCA8LSBtYXRyaXgoYyhzdGF0ZV93aWRlX2FsbCRjb3VudDRfMV8wXzBfMSwgc3RhdGVfd2lkZV9hbGwkY291bnQ0XzFfMV8wXzEsIHN0YXRlX3dpZGVfYWxsJGNvdW50NF8xXzBfMV8xLCBzdGF0ZV93aWRlX2FsbCRjb3VudDRfMV8xXzFfMSksMiwyLGJ5cm93PVRSVUUpCgpkbGwgPC0gYygiTm8iLCAiWWVzIikKb3V0YyA8LSBjKCJObyIsICJZZXMiKQpkaW1uYW1lcyhycl9mZW1hbGVfbG9zZXNfbGF0aW54KSA8LSBsaXN0KCJETEwgU3RhdHVzIiA9IGRsbCwgIlNQRUQgU3RhdHVzIiA9IG91dGMpCmVwaXRvb2xzOjpyaXNrcmF0aW8ocnJfZmVtYWxlX2xvc2VzX2xhdGlueCkKCnJyX2ZlbWFsZV9sb3Nlc19sYXRpbnhbMSwyXS8ocnJfZmVtYWxlX2xvc2VzX2xhdGlueFsxLDFdK3JyX2ZlbWFsZV9sb3Nlc19sYXRpbnhbMSwyXSkKCmBgYAoKIyhCbGFjaykKYGBge3J9CnJyX2ZlbWFsZV9sb3Nlc19ibGFjayA8LSBtYXRyaXgoYyhzdGF0ZV93aWRlX2FsbCRjb3VudDNfMV8wXzBfMSwgc3RhdGVfd2lkZV9hbGwkY291bnQzXzFfMV8wXzEsIHN0YXRlX3dpZGVfYWxsJGNvdW50M18xXzBfMV8xLCBzdGF0ZV93aWRlX2FsbCRjb3VudDNfMV8xXzFfMSksMiwyLGJ5cm93PVRSVUUpCgpkbGwgPC0gYygiTm8iLCAiWWVzIikKb3V0YyA8LSBjKCJObyIsICJZZXMiKQpkaW1uYW1lcyhycl9mZW1hbGVfbG9zZXNfYmxhY2spIDwtIGxpc3QoIkRMTCBTdGF0dXMiID0gZGxsLCAiU1BFRCBTdGF0dXMiID0gb3V0YykKZXBpdG9vbHM6OnJpc2tyYXRpbyhycl9mZW1hbGVfbG9zZXNfYmxhY2spCgpycl9mZW1hbGVfbG9zZXNfYmxhY2tbMSwyXS8ocnJfZmVtYWxlX2xvc2VzX2JsYWNrWzEsMV0rcnJfZmVtYWxlX2xvc2VzX2JsYWNrWzEsMl0pCgpgYGAKCg==