To summarize what we discussed, we are interested in knowing if the
answers to questions 12 ("fellowship_yn"), 15
("enfolded_postgrad_yn"), 16
("private_academic"), 17 ("fellowship_years"),
and 18 ("fellowship_field") differ based on year of
training ("current_year"), debt ("debt"),
gender ("gender"), race ("race"), age
("age"), marital status ("marital_status"),
and family planning ("children").
Went from 265 to 257 rows because 8 cases from the original csv were
removed due to having 50% or fewer of the questions answered.
read in and format data
df <- read.csv("maggie2.csv")
df <- df[!is.na(df$fellowship_yn),]
df2 <- df[c(2,7,20,22:23,27,31:33,35,37:39)]
df2$CAST_sub <- df$CAST_subspecialty
df2$CAST_fellow <- df$CAST_fellowship
df2 <- df2 %>%
filter(is.na(gender) | gender == 1 | gender == 2 | gender == 7)
df2$pgy_cat <- ifelse(df2$current_year==1|df2$current_year==2, 'junior', ifelse(df2$current_year==7|df2$current_year==6, "senior", "midlevel"))
df2$fellow_cat <- ifelse(df2$fellowship_yn==1|df2$fellowship_yn==2, 'Probably or Definitely Yes', ifelse(df2$fellowship_yn==4|df2$fellowship_yn==5, "Probably or Definitely No", "Undecided"))
df2$age_cat <- ifelse(df2$age==2, '22-25 y/o', ifelse(df2$age==3, "26-30 y/o", ifelse(df2$age==4, "31-35 y/o", "36-45 y/o")))
df2$race_cat <- ifelse(df2$race==1, 'Native American or Alaska Native', ifelse(df2$race==2, "Asian", ifelse(df2$race==3, "Black or African American", ifelse(df2$race==4, "Native Hawaiian or other Pacific Islander", ifelse(df2$race==5, "White", "Other/No Response")))))
df2$gender_cat <- ifelse(df2$gender==1, 'Cis Woman', ifelse(df2$gender==2, "Cis Man", ifelse(df2$gender==3, "NB", ifelse(df2$gender==4, "Trans Woman", ifelse(df2$gender==7, "No Response", "Other")))))
{
df2$debt[df2$debt == 6] <- NA
df2$race[df2$race == 6] <- NA
df2$race[df2$race == 7] <- NA
df2$marital_status[df2$marital_status == 6] <- NA
df2$marital_status[df2$marital_status == 7] <- NA
df2$children[df2$children == 5] <- NA
}
Table 11. Characteristics of Residents Based on Q35. Did CAST
accreditation affect FELLOWSHIP PROGRAMS APPLIED TO? [CAST_apply]
#makes cat for cast_apply
df3 <- df2 %>%
mutate(CAST_cat = ifelse(df2$CAST_apply==1|df2$CAST_apply==2, 'Groups 1 and 2', ifelse(df2$CAST_apply==4|df2$CAST_apply==5, "Groups 4 and 5", NA)))
year of training
df4 <- na.omit(df3[,c(7,19)])
table(df4$current_year)
1 2 3 4 5 6 7
15 33 65 44 17 21 20
{
a <- filter(df4, current_year == 1 | current_year == 2)
b <- filter(df4, current_year == 1 | current_year == 3)
c <- filter(df4, current_year == 1 | current_year == 4)
d <- filter(df4, current_year == 1 | current_year == 5)
e <- filter(df4, current_year == 1 | current_year == 6)
f <- filter(df4, current_year == 1 | current_year == 7)
g <- filter(df4, current_year == 2 | current_year == 3)
h <- filter(df4, current_year == 2 | current_year == 4)
i <- filter(df4, current_year == 2 | current_year == 5)
j <- filter(df4, current_year == 2 | current_year == 6)
k <- filter(df4, current_year == 2 | current_year == 7)
l <- filter(df4, current_year == 3 | current_year == 4)
m <- filter(df4, current_year == 3 | current_year == 5)
n <- filter(df4, current_year == 3 | current_year == 6)
o <- filter(df4, current_year == 3 | current_year == 7)
p <- filter(df4, current_year == 4 | current_year == 5)
q <- filter(df4, current_year == 4 | current_year == 6)
r <- filter(df4, current_year == 4 | current_year == 7)
s <- filter(df4, current_year == 5 | current_year == 6)
t <- filter(df4, current_year == 5 | current_year == 7)
u <- filter(df4, current_year == 6 | current_year == 7)
mylist = list(a=a,b=b,c=c,d=d,e=e,f=f, g=g, h=h,i=i,j=j,k=k,l=l,m=m,n=n,o=o,p=p,q=q,r=r,s=s,t=t,u=u)
}
{
n=0
for(i in mylist){
n<-n+1
cat("test",n,"\n")
print(t.test(table(i))$p.val*length(mylist))
}
}
test 1
[1] 1.51373
test 2
[1] 3.731431
test 3
[1] 1.619772
test 4
[1] 0.2248684
test 5
[1] 0.9181455
test 6
[1] 0.3949907
test 7
[1] 2.417262
test 8
[1] 1.056247
test 9
[1] 1.077962
test 10
[1] 1.183971
test 11
[1] 0.9768934
test 12
[1] 1.931069
test 13
[1] 3.359384
test 14
[1] 3.163632
test 15
[1] 3.160357
test 16
[1] 1.279489
test 17
[1] 1.276579
test 18
[1] 1.158723
test 19
[1] 0.4220411
test 20
[1] 0.103661
test 21
[1] 0.3079464
#nothing sig after corrections
debt
df4 <- na.omit(df3[,c(8,19)])
table(df4$debt)
1 2 3 4 5
54 73 31 16 48
{
a <- filter(df4, debt == 1 | debt == 2)
b <- filter(df4, debt == 1 | debt == 3)
c <- filter(df4, debt == 1 | debt == 4)
d <- filter(df4, debt == 1 | debt == 5)
e <- filter(df4, debt == 2 | debt == 3)
f <- filter(df4, debt == 2 | debt == 4)
g <- filter(df4, debt == 2 | debt == 5)
h <- filter(df4, debt == 3 | debt == 4)
i <- filter(df4, debt == 3 | debt == 5)
j <- filter(df4, debt == 4 | debt == 5)
mylist = list(a=a,b=b,c=c,d=d,e=e,f=f, g=g, h=h,i=i,j=j)
}
{
n=0
for(i in mylist){
n<-n+1
cat("debt test",n,"\n")
print(t.test(table(i))$p.val*length(mylist))
}
}
debt test 1
[1] 0.7543326
debt test 2
[1] 0.1639306
debt test 3
[1] 0.3891244
debt test 4
[1] 0.1499835
debt test 5
[1] 1.276186
debt test 6
[1] 1.872269
debt test 7
[1] 0.9111425
debt test 8
[1] 0.3740217
debt test 9
[1] 0.2164811
debt test 10
[1] 0.5439639
#nothing sig after corrections
age
df4 <- na.omit(df3[,c(11,19)])
table(df4$age)
2 3 4 5 6
24 97 78 17 5
{
a <- filter(df4, age == 1 | age == 2)
b <- filter(df4, age == 1 | age == 3)
c <- filter(df4, age == 1 | age == 4)
d <- filter(df4, age == 1 | age == 5)
e <- filter(df4, age == 2 | age == 3)
f <- filter(df4, age == 2 | age == 4)
g <- filter(df4, age == 2 | age == 5)
h <- filter(df4, age == 3 | age == 4)
i <- filter(df4, age == 3 | age == 5)
j <- filter(df4, age == 4 | age == 5)
mylist = list(a=a,b=b,c=c,d=d,e=e,f=f, g=g, h=h,i=i,j=j)
}
{
n=0
for(i in mylist){
n<-n+1
cat("age test",n,"\n")
print(t.test(table(i))$p.val*length(mylist))
}
}
age test 1
[1] 1.93257
age test 2
[1] 2.435653
age test 3
[1] 1.419503
age test 4
[1] 0.5385422
age test 5
[1] 1.295021
age test 6
[1] 0.5600675
age test 7
[1] 0.3284896
age test 8
[1] 0.5255765
age test 9
[1] 1.49452
age test 10
[1] 0.6720919
#nothing sig after corrections
Marital Status
df4 <- na.omit(df3[,c(12,19)])
a <- filter(df4, marital_status == 1 | marital_status == 2)
b <- filter(df4, marital_status == 1 | marital_status == 3)
c <- filter(df4, marital_status == 1 | marital_status == 4)
d <- filter(df4, marital_status == 2 | marital_status == 3)
e <- filter(df4, marital_status == 2 | marital_status == 4)
f <- filter(df4, marital_status == 3 | marital_status == 4)
mylist = list(a=a,b=b,c=c,d=d,e=e,f=f)
{
n=0
for(i in mylist){
n<-n+1
cat("test",n,"\n")
print(t.test(table(i))$p.val*length(mylist))
}
}
test 1
[1] 0.1943717
test 2
[1] 0.5227947
test 3
[1] 0.3955447
test 4
[1] 0.7136844
test 5
[1] 0.5484972
test 6
[1] 1.105587
#not sig after corrections
Children
df4 <- na.omit(df3[,c(13,19)])
{
a <- filter(df4, children == 1 | children == 2)
b <- filter(df4, children == 1 | children == 3)
c <- filter(df4, children == 1 | children == 4)
d <- filter(df4, children == 2 | children == 3)
e <- filter(df4, children == 2 | children == 4)
f <- filter(df4, children == 3 | children == 4)
mylist = list(a=a,b=b,c=c,d=d,e=e,f=f)
}
{
n=0
for(i in mylist){
n<-n+1
cat("test",n,"\n")
print(t.test(table(i))$p.val*length(mylist))
}
}
test 1
[1] 0.4568477
test 2
[1] 0.7779609
test 3
[1] 0.4059886
test 4
[1] 0.8393993
test 5
[1] 0.5796956
test 6
[1] 0.1574991
#none are sig after corrections
Table 10. Characteristics of Residents Based on Q34. Did CAST
accreditation affect SUBSPECIALTY CHOICE
#makes cat for cast_apply
df3 <- df2 %>%
mutate(CAST_sub = ifelse(df2$CAST_sub==1|df2$CAST_sub==2, 'Groups 1 and 2', ifelse(df2$CAST_sub==4|df2$CAST_sub==5, "Groups 4 and 5", NA)))
year of training
df4 <- na.omit(df3[,c(7,14)])
table(df4$current_year)
1 2 3 4 5 6 7
10 32 52 32 9 16 17
{
a <- filter(df4, current_year == 1 | current_year == 2)
b <- filter(df4, current_year == 1 | current_year == 3)
c <- filter(df4, current_year == 1 | current_year == 4)
d <- filter(df4, current_year == 1 | current_year == 5)
e <- filter(df4, current_year == 1 | current_year == 6)
f <- filter(df4, current_year == 1 | current_year == 7)
g <- filter(df4, current_year == 2 | current_year == 3)
h <- filter(df4, current_year == 2 | current_year == 4)
i <- filter(df4, current_year == 2 | current_year == 5)
j <- filter(df4, current_year == 2 | current_year == 6)
k <- filter(df4, current_year == 2 | current_year == 7)
l <- filter(df4, current_year == 3 | current_year == 4)
m <- filter(df4, current_year == 3 | current_year == 5)
n <- filter(df4, current_year == 3 | current_year == 6)
o <- filter(df4, current_year == 3 | current_year == 7)
p <- filter(df4, current_year == 4 | current_year == 5)
q <- filter(df4, current_year == 4 | current_year == 6)
r <- filter(df4, current_year == 4 | current_year == 7)
s <- filter(df4, current_year == 5 | current_year == 6)
t <- filter(df4, current_year == 5 | current_year == 7)
u <- filter(df4, current_year == 6 | current_year == 7)
mylist = list(a=a,b=b,c=c,d=d,e=e,f=f, g=g, h=h,i=i,j=j,k=k,l=l,m=m,n=n,o=o,p=p,q=q,r=r,s=s,t=t,u=u)
}
{
n=0
for(i in mylist){
n<-n+1
cat("test",n,"\n")
print(t.test(table(i))$p.val*length(mylist))
}
}
test 1
[1] 2.859129
test 2
[1] 3.794592
test 3
[1] 1.289794
test 4
[1] 0.1671575
test 5
[1] 0.8699079
test 6
[1] 1.068202
test 7
[1] 1.758363
test 8
[1] 0.7511715
test 9
[1] 3.117452
test 10
[1] 1.98436
test 11
[1] 1.902498
test 12
[1] 1.348805
test 13
[1] 3.987495
test 14
[1] 2.929115
test 15
[1] 2.81732
test 16
[1] 1.506524
test 17
[1] 0.7328367
test 18
[1] 0.7003125
test 19
[1] 1.118448
test 20
[1] 1.330887
test 21
[1] 0.9247949
#nothing sig after corrections
debt
df4 <- na.omit(df3[,c(8,14)])
table(df4$debt)
1 2 3 4 5
35 70 21 9 32
{
a <- filter(df4, debt == 1 | debt == 2)
b <- filter(df4, debt == 1 | debt == 3)
c <- filter(df4, debt == 1 | debt == 4)
d <- filter(df4, debt == 1 | debt == 5)
e <- filter(df4, debt == 2 | debt == 3)
f <- filter(df4, debt == 2 | debt == 4)
g <- filter(df4, debt == 2 | debt == 5)
h <- filter(df4, debt == 3 | debt == 4)
i <- filter(df4, debt == 3 | debt == 5)
j <- filter(df4, debt == 4 | debt == 5)
mylist = list(a=a,b=b,c=c,d=d,e=e,f=f, g=g, h=h,i=i,j=j)
}
{
n=0
for(i in mylist){
n<-n+1
cat("debt test",n,"\n")
print(t.test(table(i))$p.val*length(mylist))
}
}
debt test 1
[1] 1.473104
debt test 2
[1] 0.2775927
debt test 3
[1] 1.015563
debt test 4
[1] 0.09444612
debt test 5
[1] 2.06963
debt test 6
[1] 2.825597
debt test 7
[1] 1.541306
debt test 8
[1] 0.448362
debt test 9
[1] 0.07581739
debt test 10
[1] 0.6389743
#nothing sig after corrections
age
df4 <- na.omit(df3[,c(11,14)])
table(df4$age)
2 3 4 5 6
19 72 64 7 4
{
a <- filter(df4, age == 1 | age == 2)
b <- filter(df4, age == 1 | age == 3)
c <- filter(df4, age == 1 | age == 4)
d <- filter(df4, age == 1 | age == 5)
e <- filter(df4, age == 2 | age == 3)
f <- filter(df4, age == 2 | age == 4)
g <- filter(df4, age == 2 | age == 5)
h <- filter(df4, age == 3 | age == 4)
i <- filter(df4, age == 3 | age == 5)
j <- filter(df4, age == 4 | age == 5)
mylist = list(a=a,b=b,c=c,d=d,e=e,f=f, g=g, h=h,i=i,j=j)
}
{
n=0
for(i in mylist){
n<-n+1
cat("age test",n,"\n")
print(t.test(table(i))$p.val*length(mylist))
}
}
age test 1
[1] 4.254463
age test 2
[1] 3.361826
age test 3
[1] 1.559583
age test 4
[1] 0.9033447
age test 5
[1] 1.516461
age test 6
[1] 0.7829851
age test 7
[1] 1.622876
age test 8
[1] 0.3482941
age test 9
[1] 2.180582
age test 10
[1] 1.386915
#nothing
Marital Status
df4 <- na.omit(df3[,c(12,14)])
table(df4)
CAST_sub
marital_status Groups 1 and 2 Groups 4 and 5
1 20 20
2 25 6
3 60 27
4 0 5
a <- filter(df4, marital_status == 1 | marital_status == 2)
b <- filter(df4, marital_status == 1 | marital_status == 3)
c <- filter(df4, marital_status == 1 | marital_status == 4)
d <- filter(df4, marital_status == 2 | marital_status == 3)
e <- filter(df4, marital_status == 2 | marital_status == 4)
f <- filter(df4, marital_status == 3 | marital_status == 4)
mylist = list(a=a,b=b,c=c,d=d,e=e,f=f)
{
n=0
for(i in mylist){
n<-n+1
cat("test",n,"\n")
print(t.test(table(i))$p.val*length(mylist))
}
}
test 1
[1] 0.1354815
test 2
[1] 0.2701048
test 3
[1] 0.7022342
test 4
[1] 0.4696764
test 5
[1] 1.198921
test 6
[1] 1.144412
#not sig after corrections
LS0tCnRpdGxlOiAiTWFnZ2llIHY1IGFkaG9jIgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKLS0tCgpUbyBzdW1tYXJpemUgd2hhdCB3ZSBkaXNjdXNzZWQsIHdlIGFyZSBpbnRlcmVzdGVkIGluIGtub3dpbmcgaWYgdGhlIGFuc3dlcnMgdG8gcXVlc3Rpb25zIDEyIGAoImZlbGxvd3NoaXBfeW4iKWAsIDE1IGAoImVuZm9sZGVkX3Bvc3RncmFkX3luIilgLCAxNiBgKCJwcml2YXRlX2FjYWRlbWljIilgLCAxNyBgKCJmZWxsb3dzaGlwX3llYXJzIilgLCBhbmQgMTggYCgiZmVsbG93c2hpcF9maWVsZCIpYCBkaWZmZXIgYmFzZWQgb24geWVhciBvZiB0cmFpbmluZyBgKCJjdXJyZW50X3llYXIiKWAsIGRlYnQgYCgiZGVidCIpYCwgZ2VuZGVyIGAoImdlbmRlciIpYCwgcmFjZSBgKCJyYWNlIilgLCBhZ2UgYCgiYWdlIilgLCBtYXJpdGFsIHN0YXR1cyBgKCJtYXJpdGFsX3N0YXR1cyIpYCwgYW5kIGZhbWlseSBwbGFubmluZyBgKCJjaGlsZHJlbiIpYC4KCldlbnQgZnJvbSAyNjUgdG8gMjU3IHJvd3MgYmVjYXVzZSA4IGNhc2VzIGZyb20gdGhlIG9yaWdpbmFsIGNzdiB3ZXJlIHJlbW92ZWQgZHVlIHRvIGhhdmluZyA1MCUgb3IgZmV3ZXIgb2YgdGhlIHF1ZXN0aW9ucyBhbnN3ZXJlZC4gCgpgYGB7ciAsZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRX0Kcm0obGlzdCA9IGxzKCkpCgpsaWJyYXJ5KGdncGxvdDIpO2xpYnJhcnkoTWF0Y2hpbmcpO2xpYnJhcnkocmVhZHhsKTtsaWJyYXJ5KHRpYmJsZSk7bGlicmFyeShncmlkRXh0cmEpO2xpYnJhcnkoImdncHViciIpO2xpYnJhcnkoY2FyZXQpO2xpYnJhcnkoZ3RzdW1tYXJ5KTtsaWJyYXJ5KGdncmlkZ2VzKTtsaWJyYXJ5KGRwbHlyKTtsaWJyYXJ5KGZvcmVpZ24pO2xpYnJhcnkobm5ldCk7bGlicmFyeShWR0FNKTtsaWJyYXJ5KGRhdGEudGFibGUpO2xpYnJhcnkoc2NhbGVzKQpgYGAKCiMjIyMgcmVhZCBpbiBhbmQgZm9ybWF0IGRhdGEKYGBge3J9CmRmIDwtIHJlYWQuY3N2KCJtYWdnaWUyLmNzdiIpCmRmIDwtIGRmWyFpcy5uYShkZiRmZWxsb3dzaGlwX3luKSxdCmRmMiA8LSBkZltjKDIsNywyMCwyMjoyMywyNywzMTozMywzNSwzNzozOSldCmRmMiRDQVNUX3N1YiA8LSBkZiRDQVNUX3N1YnNwZWNpYWx0eQpkZjIkQ0FTVF9mZWxsb3cgPC0gZGYkQ0FTVF9mZWxsb3dzaGlwCmRmMiA8LSBkZjIgJT4lCiAgZmlsdGVyKGlzLm5hKGdlbmRlcikgfCBnZW5kZXIgPT0gMSB8IGdlbmRlciA9PSAyIHwgZ2VuZGVyID09IDcpCgpkZjIkcGd5X2NhdCA8LSBpZmVsc2UoZGYyJGN1cnJlbnRfeWVhcj09MXxkZjIkY3VycmVudF95ZWFyPT0yLCAnanVuaW9yJywgaWZlbHNlKGRmMiRjdXJyZW50X3llYXI9PTd8ZGYyJGN1cnJlbnRfeWVhcj09NiwgInNlbmlvciIsICJtaWRsZXZlbCIpKQpkZjIkZmVsbG93X2NhdCA8LSBpZmVsc2UoZGYyJGZlbGxvd3NoaXBfeW49PTF8ZGYyJGZlbGxvd3NoaXBfeW49PTIsICdQcm9iYWJseSBvciBEZWZpbml0ZWx5IFllcycsIGlmZWxzZShkZjIkZmVsbG93c2hpcF95bj09NHxkZjIkZmVsbG93c2hpcF95bj09NSwgIlByb2JhYmx5IG9yIERlZmluaXRlbHkgTm8iLCAiVW5kZWNpZGVkIikpCgpkZjIkYWdlX2NhdCA8LSBpZmVsc2UoZGYyJGFnZT09MiwgJzIyLTI1IHkvbycsIGlmZWxzZShkZjIkYWdlPT0zLCAiMjYtMzAgeS9vIiwgaWZlbHNlKGRmMiRhZ2U9PTQsICIzMS0zNSB5L28iLCAiMzYtNDUgeS9vIikpKQpkZjIkcmFjZV9jYXQgPC0gaWZlbHNlKGRmMiRyYWNlPT0xLCAnTmF0aXZlIEFtZXJpY2FuIG9yIEFsYXNrYSBOYXRpdmUnLCBpZmVsc2UoZGYyJHJhY2U9PTIsICJBc2lhbiIsIGlmZWxzZShkZjIkcmFjZT09MywgIkJsYWNrIG9yIEFmcmljYW4gQW1lcmljYW4iLCBpZmVsc2UoZGYyJHJhY2U9PTQsICJOYXRpdmUgSGF3YWlpYW4gb3Igb3RoZXIgUGFjaWZpYyBJc2xhbmRlciIsIGlmZWxzZShkZjIkcmFjZT09NSwgIldoaXRlIiwgIk90aGVyL05vIFJlc3BvbnNlIikpKSkpCgpkZjIkZ2VuZGVyX2NhdCA8LSBpZmVsc2UoZGYyJGdlbmRlcj09MSwgJ0NpcyBXb21hbicsIGlmZWxzZShkZjIkZ2VuZGVyPT0yLCAiQ2lzIE1hbiIsIGlmZWxzZShkZjIkZ2VuZGVyPT0zLCAiTkIiLCBpZmVsc2UoZGYyJGdlbmRlcj09NCwgIlRyYW5zIFdvbWFuIiwgaWZlbHNlKGRmMiRnZW5kZXI9PTcsICJObyBSZXNwb25zZSIsICJPdGhlciIpKSkpKQp7CmRmMiRkZWJ0W2RmMiRkZWJ0ID09IDZdIDwtIE5BCmRmMiRyYWNlW2RmMiRyYWNlID09IDZdIDwtIE5BCmRmMiRyYWNlW2RmMiRyYWNlID09IDddIDwtIE5BCmRmMiRtYXJpdGFsX3N0YXR1c1tkZjIkbWFyaXRhbF9zdGF0dXMgPT0gNl0gPC0gTkEKZGYyJG1hcml0YWxfc3RhdHVzW2RmMiRtYXJpdGFsX3N0YXR1cyA9PSA3XSA8LSBOQQpkZjIkY2hpbGRyZW5bZGYyJGNoaWxkcmVuID09IDVdIDwtIE5BCn0KYGBgCgoKIyMjIFRhYmxlIDExLiBDaGFyYWN0ZXJpc3RpY3Mgb2YgUmVzaWRlbnRzIEJhc2VkIG9uIFEzNS4gRGlkIENBU1QgYWNjcmVkaXRhdGlvbiBhZmZlY3QgRkVMTE9XU0hJUCBQUk9HUkFNUyBBUFBMSUVEIFRPPyBbQ0FTVF9hcHBseV0KYGBge3J9CiNtYWtlcyBjYXQgZm9yIGNhc3RfYXBwbHkKZGYzIDwtIGRmMiAlPiUKICBtdXRhdGUoQ0FTVF9jYXQgPSBpZmVsc2UoZGYyJENBU1RfYXBwbHk9PTF8ZGYyJENBU1RfYXBwbHk9PTIsICdHcm91cHMgMSBhbmQgMicsIGlmZWxzZShkZjIkQ0FTVF9hcHBseT09NHxkZjIkQ0FTVF9hcHBseT09NSwgIkdyb3VwcyA0IGFuZCA1IiwgTkEpKSkgCmBgYAoKCiMjIyMgeWVhciBvZiB0cmFpbmluZwpgYGB7cn0KZGY0IDwtIG5hLm9taXQoZGYzWyxjKDcsMTkpXSkKCnRhYmxlKGRmNCRjdXJyZW50X3llYXIpCgp7CmEgPC0gZmlsdGVyKGRmNCwgY3VycmVudF95ZWFyID09IDEgfCBjdXJyZW50X3llYXIgPT0gMikKYiA8LSBmaWx0ZXIoZGY0LCBjdXJyZW50X3llYXIgPT0gMSB8IGN1cnJlbnRfeWVhciA9PSAzKQpjIDwtIGZpbHRlcihkZjQsIGN1cnJlbnRfeWVhciA9PSAxIHwgY3VycmVudF95ZWFyID09IDQpCmQgPC0gZmlsdGVyKGRmNCwgY3VycmVudF95ZWFyID09IDEgfCBjdXJyZW50X3llYXIgPT0gNSkKZSA8LSBmaWx0ZXIoZGY0LCBjdXJyZW50X3llYXIgPT0gMSB8IGN1cnJlbnRfeWVhciA9PSA2KQpmIDwtIGZpbHRlcihkZjQsIGN1cnJlbnRfeWVhciA9PSAxIHwgY3VycmVudF95ZWFyID09IDcpCmcgPC0gZmlsdGVyKGRmNCwgY3VycmVudF95ZWFyID09IDIgfCBjdXJyZW50X3llYXIgPT0gMykKaCA8LSBmaWx0ZXIoZGY0LCBjdXJyZW50X3llYXIgPT0gMiB8IGN1cnJlbnRfeWVhciA9PSA0KQppIDwtIGZpbHRlcihkZjQsIGN1cnJlbnRfeWVhciA9PSAyIHwgY3VycmVudF95ZWFyID09IDUpCmogPC0gZmlsdGVyKGRmNCwgY3VycmVudF95ZWFyID09IDIgfCBjdXJyZW50X3llYXIgPT0gNikKayA8LSBmaWx0ZXIoZGY0LCBjdXJyZW50X3llYXIgPT0gMiB8IGN1cnJlbnRfeWVhciA9PSA3KQpsIDwtIGZpbHRlcihkZjQsIGN1cnJlbnRfeWVhciA9PSAzIHwgY3VycmVudF95ZWFyID09IDQpCm0gPC0gZmlsdGVyKGRmNCwgY3VycmVudF95ZWFyID09IDMgfCBjdXJyZW50X3llYXIgPT0gNSkKbiA8LSBmaWx0ZXIoZGY0LCBjdXJyZW50X3llYXIgPT0gMyB8IGN1cnJlbnRfeWVhciA9PSA2KQpvIDwtIGZpbHRlcihkZjQsIGN1cnJlbnRfeWVhciA9PSAzIHwgY3VycmVudF95ZWFyID09IDcpCnAgPC0gZmlsdGVyKGRmNCwgY3VycmVudF95ZWFyID09IDQgfCBjdXJyZW50X3llYXIgPT0gNSkKcSA8LSBmaWx0ZXIoZGY0LCBjdXJyZW50X3llYXIgPT0gNCB8IGN1cnJlbnRfeWVhciA9PSA2KQpyIDwtIGZpbHRlcihkZjQsIGN1cnJlbnRfeWVhciA9PSA0IHwgY3VycmVudF95ZWFyID09IDcpCnMgPC0gZmlsdGVyKGRmNCwgY3VycmVudF95ZWFyID09IDUgfCBjdXJyZW50X3llYXIgPT0gNikKdCA8LSBmaWx0ZXIoZGY0LCBjdXJyZW50X3llYXIgPT0gNSB8IGN1cnJlbnRfeWVhciA9PSA3KQp1IDwtIGZpbHRlcihkZjQsIGN1cnJlbnRfeWVhciA9PSA2IHwgY3VycmVudF95ZWFyID09IDcpCgpteWxpc3QgPSBsaXN0KGE9YSxiPWIsYz1jLGQ9ZCxlPWUsZj1mLCBnPWcsIGg9aCxpPWksaj1qLGs9ayxsPWwsbT1tLG49bixvPW8scD1wLHE9cSxyPXIscz1zLHQ9dCx1PXUpCn0KCnsKICBuPTAKICBmb3IoaSBpbiBteWxpc3QpewogICAgbjwtbisxCiAgICBjYXQoInRlc3QiLG4sIlxuIikKICAgIHByaW50KHQudGVzdCh0YWJsZShpKSkkcC52YWwqbGVuZ3RoKG15bGlzdCkpCiAgICB9Cn0KCiNub3RoaW5nIHNpZyBhZnRlciBjb3JyZWN0aW9ucwpgYGAKCiMjIyMgZGVidApgYGB7cn0KZGY0IDwtIG5hLm9taXQoZGYzWyxjKDgsMTkpXSkKCnRhYmxlKGRmNCRkZWJ0KQoKewphIDwtIGZpbHRlcihkZjQsIGRlYnQgPT0gMSB8IGRlYnQgPT0gMikKYiA8LSBmaWx0ZXIoZGY0LCBkZWJ0ID09IDEgfCBkZWJ0ID09IDMpCmMgPC0gZmlsdGVyKGRmNCwgZGVidCA9PSAxIHwgZGVidCA9PSA0KQpkIDwtIGZpbHRlcihkZjQsIGRlYnQgPT0gMSB8IGRlYnQgPT0gNSkKZSA8LSBmaWx0ZXIoZGY0LCBkZWJ0ID09IDIgfCBkZWJ0ID09IDMpCmYgPC0gZmlsdGVyKGRmNCwgZGVidCA9PSAyIHwgZGVidCA9PSA0KQpnIDwtIGZpbHRlcihkZjQsIGRlYnQgPT0gMiB8IGRlYnQgPT0gNSkKaCA8LSBmaWx0ZXIoZGY0LCBkZWJ0ID09IDMgfCBkZWJ0ID09IDQpCmkgPC0gZmlsdGVyKGRmNCwgZGVidCA9PSAzIHwgZGVidCA9PSA1KQpqIDwtIGZpbHRlcihkZjQsIGRlYnQgPT0gNCB8IGRlYnQgPT0gNSkKCm15bGlzdCA9IGxpc3QoYT1hLGI9YixjPWMsZD1kLGU9ZSxmPWYsIGc9ZywgaD1oLGk9aSxqPWopCn0KCnsKICBuPTAKICBmb3IoaSBpbiBteWxpc3QpewogICAgbjwtbisxCiAgICBjYXQoImRlYnQgdGVzdCIsbiwiXG4iKQogICAgcHJpbnQodC50ZXN0KHRhYmxlKGkpKSRwLnZhbCpsZW5ndGgobXlsaXN0KSkKICAgIH0KfQoKI25vdGhpbmcgc2lnIGFmdGVyIGNvcnJlY3Rpb25zCmBgYAoKCiMjIyMgYWdlCmBgYHtyfQpkZjQgPC0gbmEub21pdChkZjNbLGMoMTEsMTkpXSkKCnRhYmxlKGRmNCRhZ2UpCgp7CmEgPC0gZmlsdGVyKGRmNCwgYWdlID09IDEgfCBhZ2UgPT0gMikKYiA8LSBmaWx0ZXIoZGY0LCBhZ2UgPT0gMSB8IGFnZSA9PSAzKQpjIDwtIGZpbHRlcihkZjQsIGFnZSA9PSAxIHwgYWdlID09IDQpCmQgPC0gZmlsdGVyKGRmNCwgYWdlID09IDEgfCBhZ2UgPT0gNSkKZSA8LSBmaWx0ZXIoZGY0LCBhZ2UgPT0gMiB8IGFnZSA9PSAzKQpmIDwtIGZpbHRlcihkZjQsIGFnZSA9PSAyIHwgYWdlID09IDQpCmcgPC0gZmlsdGVyKGRmNCwgYWdlID09IDIgfCBhZ2UgPT0gNSkKaCA8LSBmaWx0ZXIoZGY0LCBhZ2UgPT0gMyB8IGFnZSA9PSA0KQppIDwtIGZpbHRlcihkZjQsIGFnZSA9PSAzIHwgYWdlID09IDUpCmogPC0gZmlsdGVyKGRmNCwgYWdlID09IDQgfCBhZ2UgPT0gNSkKCm15bGlzdCA9IGxpc3QoYT1hLGI9YixjPWMsZD1kLGU9ZSxmPWYsIGc9ZywgaD1oLGk9aSxqPWopCn0KCnsKICBuPTAKICBmb3IoaSBpbiBteWxpc3QpewogICAgbjwtbisxCiAgICBjYXQoImFnZSB0ZXN0IixuLCJcbiIpCiAgICBwcmludCh0LnRlc3QodGFibGUoaSkpJHAudmFsKmxlbmd0aChteWxpc3QpKQogICAgfQp9Cgojbm90aGluZyBzaWcgYWZ0ZXIgY29ycmVjdGlvbnMKYGBgCgojIyMjIE1hcml0YWwgU3RhdHVzCmBgYHtyfQpkZjQgPC0gbmEub21pdChkZjNbLGMoMTIsMTkpXSkKCmEgPC0gZmlsdGVyKGRmNCwgbWFyaXRhbF9zdGF0dXMgPT0gMSB8IG1hcml0YWxfc3RhdHVzID09IDIpCmIgPC0gZmlsdGVyKGRmNCwgbWFyaXRhbF9zdGF0dXMgPT0gMSB8IG1hcml0YWxfc3RhdHVzID09IDMpCmMgPC0gZmlsdGVyKGRmNCwgbWFyaXRhbF9zdGF0dXMgPT0gMSB8IG1hcml0YWxfc3RhdHVzID09IDQpCmQgPC0gZmlsdGVyKGRmNCwgbWFyaXRhbF9zdGF0dXMgPT0gMiB8IG1hcml0YWxfc3RhdHVzID09IDMpCmUgPC0gZmlsdGVyKGRmNCwgbWFyaXRhbF9zdGF0dXMgPT0gMiB8IG1hcml0YWxfc3RhdHVzID09IDQpCmYgPC0gZmlsdGVyKGRmNCwgbWFyaXRhbF9zdGF0dXMgPT0gMyB8IG1hcml0YWxfc3RhdHVzID09IDQpCm15bGlzdCA9IGxpc3QoYT1hLGI9YixjPWMsZD1kLGU9ZSxmPWYpCgp7CiAgbj0wCiAgZm9yKGkgaW4gbXlsaXN0KXsKICAgIG48LW4rMQogICAgY2F0KCJ0ZXN0IixuLCJcbiIpCiAgICBwcmludCh0LnRlc3QodGFibGUoaSkpJHAudmFsKmxlbmd0aChteWxpc3QpKQogICAgfQp9Cgojbm90IHNpZyBhZnRlciBjb3JyZWN0aW9ucwpgYGAKCiMjIyMgQ2hpbGRyZW4KYGBge3J9CmRmNCA8LSBuYS5vbWl0KGRmM1ssYygxMywxOSldKQoKewphIDwtIGZpbHRlcihkZjQsIGNoaWxkcmVuID09IDEgfCBjaGlsZHJlbiA9PSAyKQpiIDwtIGZpbHRlcihkZjQsIGNoaWxkcmVuID09IDEgfCBjaGlsZHJlbiA9PSAzKQpjIDwtIGZpbHRlcihkZjQsIGNoaWxkcmVuID09IDEgfCBjaGlsZHJlbiA9PSA0KQpkIDwtIGZpbHRlcihkZjQsIGNoaWxkcmVuID09IDIgfCBjaGlsZHJlbiA9PSAzKQplIDwtIGZpbHRlcihkZjQsIGNoaWxkcmVuID09IDIgfCBjaGlsZHJlbiA9PSA0KQpmIDwtIGZpbHRlcihkZjQsIGNoaWxkcmVuID09IDMgfCBjaGlsZHJlbiA9PSA0KQpteWxpc3QgPSBsaXN0KGE9YSxiPWIsYz1jLGQ9ZCxlPWUsZj1mKQp9Cgp7CiAgbj0wCiAgZm9yKGkgaW4gbXlsaXN0KXsKICAgIG48LW4rMQogICAgY2F0KCJ0ZXN0IixuLCJcbiIpCiAgICBwcmludCh0LnRlc3QodGFibGUoaSkpJHAudmFsKmxlbmd0aChteWxpc3QpKQogICAgfQp9CgoKI25vbmUgYXJlIHNpZyBhZnRlciBjb3JyZWN0aW9ucwpgYGAKCgojIyMgVGFibGUgMTAuIENoYXJhY3RlcmlzdGljcyBvZiBSZXNpZGVudHMgQmFzZWQgb24gUTM0LiBEaWQgQ0FTVCBhY2NyZWRpdGF0aW9uIGFmZmVjdCBTVUJTUEVDSUFMVFkgQ0hPSUNFIAoKYGBge3J9CiNtYWtlcyBjYXQgZm9yIGNhc3RfYXBwbHkKZGYzIDwtIGRmMiAlPiUKICBtdXRhdGUoQ0FTVF9zdWIgPSBpZmVsc2UoZGYyJENBU1Rfc3ViPT0xfGRmMiRDQVNUX3N1Yj09MiwgJ0dyb3VwcyAxIGFuZCAyJywgaWZlbHNlKGRmMiRDQVNUX3N1Yj09NHxkZjIkQ0FTVF9zdWI9PTUsICJHcm91cHMgNCBhbmQgNSIsIE5BKSkpIApgYGAKCgoKIyMjIyB5ZWFyIG9mIHRyYWluaW5nCmBgYHtyfQpkZjQgPC0gbmEub21pdChkZjNbLGMoNywxNCldKQoKdGFibGUoZGY0JGN1cnJlbnRfeWVhcikKCnsKYSA8LSBmaWx0ZXIoZGY0LCBjdXJyZW50X3llYXIgPT0gMSB8IGN1cnJlbnRfeWVhciA9PSAyKQpiIDwtIGZpbHRlcihkZjQsIGN1cnJlbnRfeWVhciA9PSAxIHwgY3VycmVudF95ZWFyID09IDMpCmMgPC0gZmlsdGVyKGRmNCwgY3VycmVudF95ZWFyID09IDEgfCBjdXJyZW50X3llYXIgPT0gNCkKZCA8LSBmaWx0ZXIoZGY0LCBjdXJyZW50X3llYXIgPT0gMSB8IGN1cnJlbnRfeWVhciA9PSA1KQplIDwtIGZpbHRlcihkZjQsIGN1cnJlbnRfeWVhciA9PSAxIHwgY3VycmVudF95ZWFyID09IDYpCmYgPC0gZmlsdGVyKGRmNCwgY3VycmVudF95ZWFyID09IDEgfCBjdXJyZW50X3llYXIgPT0gNykKZyA8LSBmaWx0ZXIoZGY0LCBjdXJyZW50X3llYXIgPT0gMiB8IGN1cnJlbnRfeWVhciA9PSAzKQpoIDwtIGZpbHRlcihkZjQsIGN1cnJlbnRfeWVhciA9PSAyIHwgY3VycmVudF95ZWFyID09IDQpCmkgPC0gZmlsdGVyKGRmNCwgY3VycmVudF95ZWFyID09IDIgfCBjdXJyZW50X3llYXIgPT0gNSkKaiA8LSBmaWx0ZXIoZGY0LCBjdXJyZW50X3llYXIgPT0gMiB8IGN1cnJlbnRfeWVhciA9PSA2KQprIDwtIGZpbHRlcihkZjQsIGN1cnJlbnRfeWVhciA9PSAyIHwgY3VycmVudF95ZWFyID09IDcpCmwgPC0gZmlsdGVyKGRmNCwgY3VycmVudF95ZWFyID09IDMgfCBjdXJyZW50X3llYXIgPT0gNCkKbSA8LSBmaWx0ZXIoZGY0LCBjdXJyZW50X3llYXIgPT0gMyB8IGN1cnJlbnRfeWVhciA9PSA1KQpuIDwtIGZpbHRlcihkZjQsIGN1cnJlbnRfeWVhciA9PSAzIHwgY3VycmVudF95ZWFyID09IDYpCm8gPC0gZmlsdGVyKGRmNCwgY3VycmVudF95ZWFyID09IDMgfCBjdXJyZW50X3llYXIgPT0gNykKcCA8LSBmaWx0ZXIoZGY0LCBjdXJyZW50X3llYXIgPT0gNCB8IGN1cnJlbnRfeWVhciA9PSA1KQpxIDwtIGZpbHRlcihkZjQsIGN1cnJlbnRfeWVhciA9PSA0IHwgY3VycmVudF95ZWFyID09IDYpCnIgPC0gZmlsdGVyKGRmNCwgY3VycmVudF95ZWFyID09IDQgfCBjdXJyZW50X3llYXIgPT0gNykKcyA8LSBmaWx0ZXIoZGY0LCBjdXJyZW50X3llYXIgPT0gNSB8IGN1cnJlbnRfeWVhciA9PSA2KQp0IDwtIGZpbHRlcihkZjQsIGN1cnJlbnRfeWVhciA9PSA1IHwgY3VycmVudF95ZWFyID09IDcpCnUgPC0gZmlsdGVyKGRmNCwgY3VycmVudF95ZWFyID09IDYgfCBjdXJyZW50X3llYXIgPT0gNykKCm15bGlzdCA9IGxpc3QoYT1hLGI9YixjPWMsZD1kLGU9ZSxmPWYsIGc9ZywgaD1oLGk9aSxqPWosaz1rLGw9bCxtPW0sbj1uLG89byxwPXAscT1xLHI9cixzPXMsdD10LHU9dSkKfQoKewogIG49MAogIGZvcihpIGluIG15bGlzdCl7CiAgICBuPC1uKzEKICAgIGNhdCgidGVzdCIsbiwiXG4iKQogICAgcHJpbnQodC50ZXN0KHRhYmxlKGkpKSRwLnZhbCpsZW5ndGgobXlsaXN0KSkKICAgIH0KfQoKI25vdGhpbmcgc2lnIGFmdGVyIGNvcnJlY3Rpb25zCmBgYAoKIyMjIyBkZWJ0CmBgYHtyfQpkZjQgPC0gbmEub21pdChkZjNbLGMoOCwxNCldKQoKdGFibGUoZGY0JGRlYnQpCgp7CmEgPC0gZmlsdGVyKGRmNCwgZGVidCA9PSAxIHwgZGVidCA9PSAyKQpiIDwtIGZpbHRlcihkZjQsIGRlYnQgPT0gMSB8IGRlYnQgPT0gMykKYyA8LSBmaWx0ZXIoZGY0LCBkZWJ0ID09IDEgfCBkZWJ0ID09IDQpCmQgPC0gZmlsdGVyKGRmNCwgZGVidCA9PSAxIHwgZGVidCA9PSA1KQplIDwtIGZpbHRlcihkZjQsIGRlYnQgPT0gMiB8IGRlYnQgPT0gMykKZiA8LSBmaWx0ZXIoZGY0LCBkZWJ0ID09IDIgfCBkZWJ0ID09IDQpCmcgPC0gZmlsdGVyKGRmNCwgZGVidCA9PSAyIHwgZGVidCA9PSA1KQpoIDwtIGZpbHRlcihkZjQsIGRlYnQgPT0gMyB8IGRlYnQgPT0gNCkKaSA8LSBmaWx0ZXIoZGY0LCBkZWJ0ID09IDMgfCBkZWJ0ID09IDUpCmogPC0gZmlsdGVyKGRmNCwgZGVidCA9PSA0IHwgZGVidCA9PSA1KQoKbXlsaXN0ID0gbGlzdChhPWEsYj1iLGM9YyxkPWQsZT1lLGY9ZiwgZz1nLCBoPWgsaT1pLGo9aikKfQoKewogIG49MAogIGZvcihpIGluIG15bGlzdCl7CiAgICBuPC1uKzEKICAgIGNhdCgiZGVidCB0ZXN0IixuLCJcbiIpCiAgICBwcmludCh0LnRlc3QodGFibGUoaSkpJHAudmFsKmxlbmd0aChteWxpc3QpKQogICAgfQp9Cgojbm90aGluZyBzaWcgYWZ0ZXIgY29ycmVjdGlvbnMKYGBgCgoKIyMjIyBhZ2UKYGBge3J9CmRmNCA8LSBuYS5vbWl0KGRmM1ssYygxMSwxNCldKQoKdGFibGUoZGY0JGFnZSkKCnsKYSA8LSBmaWx0ZXIoZGY0LCBhZ2UgPT0gMSB8IGFnZSA9PSAyKQpiIDwtIGZpbHRlcihkZjQsIGFnZSA9PSAxIHwgYWdlID09IDMpCmMgPC0gZmlsdGVyKGRmNCwgYWdlID09IDEgfCBhZ2UgPT0gNCkKZCA8LSBmaWx0ZXIoZGY0LCBhZ2UgPT0gMSB8IGFnZSA9PSA1KQplIDwtIGZpbHRlcihkZjQsIGFnZSA9PSAyIHwgYWdlID09IDMpCmYgPC0gZmlsdGVyKGRmNCwgYWdlID09IDIgfCBhZ2UgPT0gNCkKZyA8LSBmaWx0ZXIoZGY0LCBhZ2UgPT0gMiB8IGFnZSA9PSA1KQpoIDwtIGZpbHRlcihkZjQsIGFnZSA9PSAzIHwgYWdlID09IDQpIAppIDwtIGZpbHRlcihkZjQsIGFnZSA9PSAzIHwgYWdlID09IDUpCmogPC0gZmlsdGVyKGRmNCwgYWdlID09IDQgfCBhZ2UgPT0gNSkKCm15bGlzdCA9IGxpc3QoYT1hLGI9YixjPWMsZD1kLGU9ZSxmPWYsIGc9ZywgaD1oLGk9aSxqPWopCn0KCnsKICBuPTAKICBmb3IoaSBpbiBteWxpc3QpewogICAgbjwtbisxCiAgICBjYXQoImFnZSB0ZXN0IixuLCJcbiIpCiAgICBwcmludCh0LnRlc3QodGFibGUoaSkpJHAudmFsKmxlbmd0aChteWxpc3QpKQogICAgfQp9Cgojbm90aGluZwpgYGAKCiMjIyMgTWFyaXRhbCBTdGF0dXMKYGBge3J9CmRmNCA8LSBuYS5vbWl0KGRmM1ssYygxMiwxNCldKQoKdGFibGUoZGY0KQoKYSA8LSBmaWx0ZXIoZGY0LCBtYXJpdGFsX3N0YXR1cyA9PSAxIHwgbWFyaXRhbF9zdGF0dXMgPT0gMikKYiA8LSBmaWx0ZXIoZGY0LCBtYXJpdGFsX3N0YXR1cyA9PSAxIHwgbWFyaXRhbF9zdGF0dXMgPT0gMykKYyA8LSBmaWx0ZXIoZGY0LCBtYXJpdGFsX3N0YXR1cyA9PSAxIHwgbWFyaXRhbF9zdGF0dXMgPT0gNCkKZCA8LSBmaWx0ZXIoZGY0LCBtYXJpdGFsX3N0YXR1cyA9PSAyIHwgbWFyaXRhbF9zdGF0dXMgPT0gMykKZSA8LSBmaWx0ZXIoZGY0LCBtYXJpdGFsX3N0YXR1cyA9PSAyIHwgbWFyaXRhbF9zdGF0dXMgPT0gNCkKZiA8LSBmaWx0ZXIoZGY0LCBtYXJpdGFsX3N0YXR1cyA9PSAzIHwgbWFyaXRhbF9zdGF0dXMgPT0gNCkKbXlsaXN0ID0gbGlzdChhPWEsYj1iLGM9YyxkPWQsZT1lLGY9ZikKCnsKICBuPTAKICBmb3IoaSBpbiBteWxpc3QpewogICAgbjwtbisxCiAgICBjYXQoInRlc3QiLG4sIlxuIikKICAgIHByaW50KHQudGVzdCh0YWJsZShpKSkkcC52YWwqbGVuZ3RoKG15bGlzdCkpCiAgICB9Cn0KCiNub3Qgc2lnIGFmdGVyIGNvcnJlY3Rpb25zCmBgYAoK