Ernesto Gomez
October 16, 2017
Part 1 of this assignment will first implement the Zelig 5 syntax on the computations presented in slides 5.2-5.18 from Lecture 5. This will use the titanic dataset.
Part 2 will then utilize data from The Stanford Mass Shootings in America (MSA), a non-exhaustive dataset of mass shootings from 1966-2016 compiled by The Stanford Geospatial Center. This collection of data includes variables such as mass shooters’ race, name, gender, cause of death, gun type, number of fatalities, and more.
For the purposes of this analysis, race, gender, and a shooter’s fate at the scene of the crime will be used to perform a logistic regression analyzed under the Zelig package to analyze whether a mass shooter’s race or gender influences their fate at the scene of their crime.
In other words, is one gender or one race more likely to die at the scene of their crime or be apprehended by law enforcement?
library(tidyverse)
library(dplyr)
library(sjmisc)
library(tidyr)
library(ggplot2)
library(pander)
library(radiant.data)
library(Zelig)
library(texreg)
library(visreg)
Part 1: Titanic and Zelig 5
titanic2 <- titanic %>%
mutate(survived1 = as.integer(survived)) %>%
mutate (age = as.integer(age)) %>%
mutate(survival = sjmisc::rec(survived1, rec = "2=0; 1=1")) %>%
select(survived, survival, age, sex, pclass, fare)
head(titanic2)
Generating Zelig Model (Titanic)
z5tit<- zlogit$new()
z5tit$zelig(survival ~ age + sex*pclass + fare, data = titanic2)
summary(z5tit)
Model:
Call:
z5tit$zelig(formula = survival ~ age + sex * pclass + fare, data = titanic2)
Deviance Residuals:
Min 1Q Median 3Q Max
-3.0628 -0.6636 -0.4941 0.4337 2.4940
Coefficients:
Estimate Std. Error z value Pr(>|z|)
(Intercept) 4.8959649 0.6128145 7.989 0.00000000000000136
age -0.0386781 0.0067926 -5.694 0.00000001239977237
sexmale -3.9001038 0.5015680 -7.776 0.00000000000000750
pclass2nd -1.5922712 0.6024689 -2.643 0.00822
pclass3rd -4.1381922 0.5601346 -7.388 0.00000000000014922
fare -0.0009074 0.0020510 -0.442 0.65820
sexmale:pclass2nd -0.0603255 0.6373047 -0.095 0.92459
sexmale:pclass3rd 2.5016703 0.5479814 4.565 0.00000498908018340
(Dispersion parameter for binomial family taken to be 1)
Null deviance: 1409.99 on 1042 degrees of freedom
Residual deviance: 931.42 on 1035 degrees of freedom
AIC: 947.42
Number of Fisher Scoring iterations: 5
Next step: Use 'setx' method
Age Effect With Zelig 5 (Titanic)
z5tit$setrange(age = min(titanic2$age):max(titanic2$age))
z5tit$sim()
ci.plot(z5tit)

Fare Effect With Zelig 5 (Titanic)
z5tit$setrange(fare = min(titanic2$fare):max(titanic2$fare))
z5tit$sim()
ci.plot(z5tit)

Gender Difference with Zelig 5 (Titanic)
z5sex <- zlogit$new()
z5sex$zelig(survival ~ age + sex*pclass + fare, data = titanic2)
z5sex$setx(sex = "male")
z5sex$setx1(sex = "female")
z5sex$sim()
summary(z5sex)
sim x :
-----
ev
mean sd 50% 2.5% 97.5%
[1,] 0.1404976 0.01878571 0.1400461 0.1059377 0.1829745
pv
0 1
[1,] 0.858 0.142
sim x1 :
-----
ev
mean sd 50% 2.5% 97.5%
[1,] 0.3968055 0.04144396 0.3971523 0.3197929 0.4782572
pv
0 1
[1,] 0.619 0.381
fd
mean sd 50% 2.5% 97.5%
[1,] 0.256308 0.04312428 0.2574681 0.1727245 0.3425787
plot(z5sex)

Class Variations in Gender Differences with Zelig 5 (Titanic)
Gender and First Class
z5.1s <- zlogit$new()
z5.1s$zelig(survival ~ age + sex*pclass + fare, data = titanic2)
z5.1s$setx(sex = "male", pclass = "1st")
z5.1s$setx1(sex = "female", pclass = "1st")
z5.1s$sim()
plot(z5.1s)

Gender and Second Class
z5.2s <- zlogit$new()
z5.2s$zelig(survival ~ age + sex*pclass + fare, data = titanic2)
z5.2s$setx(sex = "male", pclass = "2nd")
z5.2s$setx1(sex = "female", pclass = "2nd")
z5.2s$sim()
plot(z5.2s)

Gender and Third Class
z5.3s <- zlogit$new()
z5.3s$zelig(survival ~ age + sex*pclass + fare, data = titanic2)
z5.3s$setx(sex = "male", pclass = "3rd")
z5.3s$setx1(sex = "female", pclass = "3rd")
z5.3s$sim()
plot(z5.3s)

Grouping Gender Differences Between Classes (Titanic)
d1 <- z5.1s$get_qi(xvalue="x1", qi="fd")
d2 <- z5.2s$get_qi(xvalue="x1", qi="fd")
d3 <- z5.3s$get_qi(xvalue="x1", qi="fd")
dfd <- as.data.frame(cbind(d1, d2, d3))
head(dfd)
tidd <- dfd %>%
gather(class, simv, 1:3)
head(tidd)
tidd %>%
group_by(class) %>%
summarise(mean = mean(simv), sd = sd(simv))
Plotting Gender Differences Between Classes (Titanic)
ggplot(tidd, aes(simv)) + geom_histogram() + facet_grid(~class)

Part 2 - Mass Shooters Data & Zelig 4
Variables & Data Management
This analysis will use the following variables:
- gender - Measures whether a mass shooter is a Male or Female
- race - Records a mass shooter’s race (white, black, asian, two or more races)
- shooterfate - Records the fate of a shooter at the scene of their crime (killed, comitted sucide, or apprehended “i.e not applicable”)
The new variables, shooterwhite, was generated to represent mass shooters who are white and non-white, while the variable shooterdied represents shooters who died at the scene, either by suicide or by law enforcement, and those who did not die/were apprehended.
masshoot <- data.frame(read_csv("/Users/ernesto/Documents/Advanced Analytics/Data/MassShootings.csv")) %>%
rename("shooterfate" = Shooter.s.Cause.of.Death,
"shootergender" = Shooter.Sex,
"shooterrace" = Shooter.Race) %>%
select(shootergender, shooterrace, shooterfate) %>%
filter(!is.na(shooterrace),
!is.na(shootergender),
!is.na(shooterfate),
!shooterfate %in% c("Unknown"),
!shooterrace %in% c("Unknown"),
!shootergender %in% c("Unknown", "Male/Female"),
shootergender %in% c("Male", "Female")) %>%
mutate(shootergender=as.factor(shootergender),
shooterwhite=as.factor(ifelse(shooterrace=="White American or European American", 1, 0)),
shooterfate = tolower(shooterfate),
shooterdied=as.factor(ifelse(shooterfate %in% c("killed","suicide"), 1, 0)))
print(masshoot)
Overview of Data
Mass shooters are overwhelmingly white compared to other races.
ggplot(masshoot, aes(shooterrace) ) +
geom_bar() + coord_flip()

Mass shooters also tend to be men.
ggplot(masshoot, aes(shootergender) ) +
geom_bar() + coord_flip()

The majority of mass shooters are either apprehended (not applicable), however many of them commit suicide.
ggplot(masshoot, aes(shooterfate) ) +
geom_bar() + coord_flip()

Generating Zelig Model
Men and whites more likely to die at the scene of their crime.
shootzelig <- zelig(shooterdied ~ shooterwhite + shootergender, model = "logit", data = masshoot, cite = F)
summary(shootzelig)
Model:
Call:
z5$zelig(formula = shooterdied ~ shooterwhite + shootergender,
data = masshoot)
Deviance Residuals:
Min 1Q Median 3Q Max
-1.2667 -0.9643 -0.9643 1.0907 1.4067
Coefficients:
Estimate Std. Error z value Pr(>|z|)
(Intercept) -1.0021 0.9454 -1.060 0.28915
shooterwhite1 0.7319 0.2549 2.871 0.00409
shootergenderMale 0.4776 0.9332 0.512 0.60883
(Dispersion parameter for binomial family taken to be 1)
Null deviance: 357.66 on 258 degrees of freedom
Residual deviance: 349.18 on 256 degrees of freedom
AIC: 355.18
Number of Fisher Scoring iterations: 4
Next step: Use 'setx' method
Generating Simulations - Racial Variations in Gender Difference
The first simulation finds that mass shooters who are white men are more likely to die at the scene of their crimes than white women who are mass shooters, with a first difference of -.11
a1x <- setx(shootzelig, shootergender = "Male", shooterwhite=1)
a1x1 <- setx(shootzelig, shootergender= "Female", shooterwhite=1)
a1s <- sim(shootzelig, x = a1x, x1= a1x1)
summary(a1s)
sim x :
-----
ev
mean sd 50% 2.5% 97.5%
[1,] 0.5512355 0.04417524 0.5502608 0.4638718 0.6339924
pv
0 1
[1,] 0.459 0.541
sim x1 :
-----
ev
mean sd 50% 2.5% 97.5%
[1,] 0.4399224 0.1939713 0.4302544 0.1083263 0.8134935
pv
0 1
[1,] 0.559 0.441
fd
mean sd 50% 2.5% 97.5%
[1,] -0.111313 0.200032 -0.1180531 -0.4606997 0.2731931
plot(a1s)

The second simulation shows that mass shooters who are not white but male are also more likely to die at the scene of their crimes in comparison to non-white female shooters, with a first difference of -.07
Evidently, mass shooters who are men are more likely to die at the scene than women, whether they are white or non-white.
a2x <- setx(shootzelig, shootergender="Male", shooterwhite=0)
a2x1 <- setx(shootzelig, shootergender= "Female", shooterwhite=0)
a2s <- sim(shootzelig, x=a2x, x1=a2x1)
summary(a2s)
sim x :
-----
ev
mean sd 50% 2.5% 97.5%
[1,] 0.3710795 0.04167486 0.3684918 0.2903538 0.4608056
pv
0 1
[1,] 0.639 0.361
sim x1 :
-----
ev
mean sd 50% 2.5% 97.5%
[1,] 0.3068707 0.1769439 0.2712629 0.0600497 0.7181584
pv
0 1
[1,] 0.699 0.301
fd
mean sd 50% 2.5% 97.5%
[1,] -0.06420876 0.1751594 -0.09017618 -0.3255986 0.3404416
plot(a2s)

Combining Simulations Into Dataframe
fd1 <- a1s$get_qi(xvalue="x1", qi="fd")
fd2 <- a2s$get_qi(xvalue="x1", qi="fd")
newfd <- as.data.frame(cbind(fd1, fd2))
colnames(newfd)[1] <- "whiteM/F"
colnames(newfd)[2] <- "nonwhiteM/F"
head(newfd)
Group Summary Stats
Among those who are white (V1), male and female mass shooters are less likely to survive (killed or by suicide), with a gender difference of .11, compared to non-white male and female mass shooters (V2).
fdshooter%>%
group_by(v1)%>%
summarize(mean=mean(v2), sd=sd(v2))
Plotting Results
The figures show that white male and female shooters are less likely to survive as the bars skew more to the left, compared to positive skewness of non-white mass shooters who are male and female.
ggplot(fdshooter, aes(v2)) + geom_histogram() +facet_grid(~v1)

Analysis
In the end, the results shows that a gender difference exists in the fate of mass shooters, with male mass shooters, regardless of race, being more likely to die than female mass shooters. Whites are also more likely to die. Racial variations in gender differences show that white male and female shooters are less likely to survive compared to non-white female and male mass shooters.
It should be noted that much of this analysis hinges on one reality indicated by the introductory data overview: the majority of recorded mass shooters are white and/or male. Naturally, because of this, it is not surprising to see that these groups least likely to survive after a mass shooting (either killed by law enforcement or they take their own lives).
Needless to say, this alone is interesting in a society where mass shootings are becoming more commonplace and the conversation around (domestic) terrorism remains largely centered on so-called perceived “social ills” of particular communities of color (i.e. Muslims).
LS0tCnRpdGxlOiAiSG9tZXdvcmsgNiAtIFRpdGFuaWMsIE1hc3MgU2hvb3RlcnMgJiAqWmVsaWcqIgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKLS0tCgojIyMjI0VybmVzdG8gR29tZXoKIyMjIyNPY3RvYmVyIDE2LCAyMDE3Cl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KCioqUGFydCAxKiogb2YgdGhpcyBhc3NpZ25tZW50IHdpbGwgZmlyc3QgaW1wbGVtZW50IHRoZSBaZWxpZyA1IHN5bnRheCBvbiB0aGUgY29tcHV0YXRpb25zIHByZXNlbnRlZCBpbiBzbGlkZXMgNS4yLTUuMTggZnJvbSBMZWN0dXJlIDUuIFRoaXMgd2lsbCB1c2UgdGhlIHRpdGFuaWMgZGF0YXNldC4KCgoqKlBhcnQgMioqIHdpbGwgdGhlbiB1dGlsaXplIGRhdGEgZnJvbSBUaGUgU3RhbmZvcmQgTWFzcyBTaG9vdGluZ3MgaW4gQW1lcmljYSAoTVNBKSwgYSBub24tZXhoYXVzdGl2ZSBkYXRhc2V0IG9mIG1hc3Mgc2hvb3RpbmdzIGZyb20gMTk2Ni0yMDE2IGNvbXBpbGVkIGJ5IFRoZSBTdGFuZm9yZCBHZW9zcGF0aWFsIENlbnRlci4gVGhpcyBjb2xsZWN0aW9uIG9mIGRhdGEgaW5jbHVkZXMgdmFyaWFibGVzIHN1Y2ggYXMgbWFzcyBzaG9vdGVycycgcmFjZSwgbmFtZSwgZ2VuZGVyLCBjYXVzZSBvZiBkZWF0aCwgZ3VuIHR5cGUsIG51bWJlciBvZiBmYXRhbGl0aWVzLCBhbmQgbW9yZS4gCgpGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgYW5hbHlzaXMsIHJhY2UsIGdlbmRlciwgYW5kIGEgc2hvb3RlcidzIGZhdGUgYXQgdGhlIHNjZW5lIG9mIHRoZSBjcmltZSB3aWxsIGJlIHVzZWQgdG8gcGVyZm9ybSBhIGxvZ2lzdGljIHJlZ3Jlc3Npb24gYW5hbHl6ZWQgdW5kZXIgdGhlICpaZWxpZyogcGFja2FnZSB0byBhbmFseXplIHdoZXRoZXIgYSBtYXNzIHNob290ZXIncyByYWNlIG9yIGdlbmRlciBpbmZsdWVuY2VzIHRoZWlyIGZhdGUgYXQgdGhlIHNjZW5lIG9mIHRoZWlyIGNyaW1lLiAKCkluIG90aGVyIHdvcmRzLCBpcyBvbmUgZ2VuZGVyIG9yIG9uZSByYWNlIG1vcmUgbGlrZWx5IHRvIGRpZSBhdCB0aGUgc2NlbmUgb2YgdGhlaXIgY3JpbWUgb3IgYmUgYXBwcmVoZW5kZWQgYnkgbGF3IGVuZm9yY2VtZW50PyAKCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KYGBge3IsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KGRwbHlyKQpsaWJyYXJ5KHNqbWlzYykKbGlicmFyeSh0aWR5cikKbGlicmFyeShnZ3Bsb3QyKQpsaWJyYXJ5KHBhbmRlcikKbGlicmFyeShyYWRpYW50LmRhdGEpCmxpYnJhcnkoWmVsaWcpCmxpYnJhcnkodGV4cmVnKQpsaWJyYXJ5KHZpc3JlZykKYGBgCgpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCgojUGFydCAxOiBUaXRhbmljIGFuZCBaZWxpZyA1CmBgYHtyfQp0aXRhbmljMiA8LSB0aXRhbmljICU+JSAKICBtdXRhdGUoc3Vydml2ZWQxID0gYXMuaW50ZWdlcihzdXJ2aXZlZCkpICU+JQogIG11dGF0ZSAoYWdlID0gYXMuaW50ZWdlcihhZ2UpKSAlPiUKICBtdXRhdGUoc3Vydml2YWwgPSBzam1pc2M6OnJlYyhzdXJ2aXZlZDEsIHJlYyA9ICIyPTA7IDE9MSIpKSAlPiUKICBzZWxlY3Qoc3Vydml2ZWQsIHN1cnZpdmFsLCBhZ2UsIHNleCwgcGNsYXNzLCBmYXJlKQpoZWFkKHRpdGFuaWMyKQpgYGAKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwoKI0dlbmVyYXRpbmcgWmVsaWcgTW9kZWwgKFRpdGFuaWMpCmBgYHtyfQp6NXRpdDwtIHpsb2dpdCRuZXcoKQp6NXRpdCR6ZWxpZyhzdXJ2aXZhbCB+IGFnZSArIHNleCpwY2xhc3MgKyBmYXJlLCBkYXRhID0gdGl0YW5pYzIpCnN1bW1hcnkoejV0aXQpCmBgYAoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwojQWdlIEVmZmVjdCBXaXRoIFplbGlnIDUgKFRpdGFuaWMpCgpgYGB7cn0KejV0aXQkc2V0cmFuZ2UoYWdlID0gbWluKHRpdGFuaWMyJGFnZSk6bWF4KHRpdGFuaWMyJGFnZSkpCno1dGl0JHNpbSgpCmNpLnBsb3QoejV0aXQpCmBgYApfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCiNGYXJlIEVmZmVjdCBXaXRoIFplbGlnIDUgKFRpdGFuaWMpCmBgYHtyfQp6NXRpdCRzZXRyYW5nZShmYXJlID0gbWluKHRpdGFuaWMyJGZhcmUpOm1heCh0aXRhbmljMiRmYXJlKSkKejV0aXQkc2ltKCkKY2kucGxvdCh6NXRpdCkKYGBgCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KCiNHZW5kZXIgRGlmZmVyZW5jZSB3aXRoIFplbGlnIDUgKFRpdGFuaWMpCmBgYHtyfQp6NXNleCA8LSB6bG9naXQkbmV3KCkKejVzZXgkemVsaWcoc3Vydml2YWwgfiBhZ2UgKyBzZXgqcGNsYXNzICsgZmFyZSwgZGF0YSA9IHRpdGFuaWMyKQogIHo1c2V4JHNldHgoc2V4ID0gIm1hbGUiKSAKICB6NXNleCRzZXR4MShzZXggPSAiZmVtYWxlIikKICB6NXNleCRzaW0oKQogIHN1bW1hcnkoejVzZXgpCiAgcGxvdCh6NXNleCkKYGBgCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KI0NsYXNzIFZhcmlhdGlvbnMgaW4gR2VuZGVyIERpZmZlcmVuY2VzIHdpdGggWmVsaWcgNSAoVGl0YW5pYykKCiMjIyNHZW5kZXIgYW5kIEZpcnN0IENsYXNzCmBgYHtyfQp6NS4xcyA8LSB6bG9naXQkbmV3KCkKejUuMXMkemVsaWcoc3Vydml2YWwgfiBhZ2UgKyBzZXgqcGNsYXNzICsgZmFyZSwgZGF0YSA9IHRpdGFuaWMyKQp6NS4xcyRzZXR4KHNleCA9ICJtYWxlIiwgcGNsYXNzID0gIjFzdCIpIAp6NS4xcyRzZXR4MShzZXggPSAiZmVtYWxlIiwgcGNsYXNzID0gIjFzdCIpCno1LjFzJHNpbSgpCnBsb3QoejUuMXMpCmBgYApfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCiMjIyNHZW5kZXIgYW5kIFNlY29uZCBDbGFzcwpgYGB7cn0KejUuMnMgPC0gemxvZ2l0JG5ldygpCno1LjJzJHplbGlnKHN1cnZpdmFsIH4gYWdlICsgc2V4KnBjbGFzcyArIGZhcmUsIGRhdGEgPSB0aXRhbmljMikKejUuMnMkc2V0eChzZXggPSAibWFsZSIsIHBjbGFzcyA9ICIybmQiKSAKejUuMnMkc2V0eDEoc2V4ID0gImZlbWFsZSIsIHBjbGFzcyA9ICIybmQiKQp6NS4ycyRzaW0oKQpwbG90KHo1LjJzKQpgYGAKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwojIyMjR2VuZGVyIGFuZCBUaGlyZCBDbGFzcwpgYGB7cn0KejUuM3MgPC0gemxvZ2l0JG5ldygpCno1LjNzJHplbGlnKHN1cnZpdmFsIH4gYWdlICsgc2V4KnBjbGFzcyArIGZhcmUsIGRhdGEgPSB0aXRhbmljMikKejUuM3Mkc2V0eChzZXggPSAibWFsZSIsIHBjbGFzcyA9ICIzcmQiKSAKejUuM3Mkc2V0eDEoc2V4ID0gImZlbWFsZSIsIHBjbGFzcyA9ICIzcmQiKQp6NS4zcyRzaW0oKQpwbG90KHo1LjNzKQpgYGAKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwojR3JvdXBpbmcgR2VuZGVyIERpZmZlcmVuY2VzIEJldHdlZW4gQ2xhc3NlcyAoVGl0YW5pYykKYGBge3J9CmQxIDwtIHo1LjFzJGdldF9xaSh4dmFsdWU9IngxIiwgcWk9ImZkIikKZDIgPC0gejUuMnMkZ2V0X3FpKHh2YWx1ZT0ieDEiLCBxaT0iZmQiKQpkMyA8LSB6NS4zcyRnZXRfcWkoeHZhbHVlPSJ4MSIsIHFpPSJmZCIpCiAgCmRmZCA8LSBhcy5kYXRhLmZyYW1lKGNiaW5kKGQxLCBkMiwgZDMpKQpoZWFkKGRmZCkKYGBgCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KYGBge3J9CnRpZGQgPC0gZGZkICU+JSAKICBnYXRoZXIoY2xhc3MsIHNpbXYsIDE6MykKaGVhZCh0aWRkKQpgYGAKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwoKYGBge3J9CnRpZGQgJT4lIAogIGdyb3VwX2J5KGNsYXNzKSAlPiUgCiAgc3VtbWFyaXNlKG1lYW4gPSBtZWFuKHNpbXYpLCBzZCA9IHNkKHNpbXYpKQpgYGAKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwojUGxvdHRpbmcgR2VuZGVyIERpZmZlcmVuY2VzIEJldHdlZW4gQ2xhc3NlcyAoVGl0YW5pYykKYGBge3IsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CmdncGxvdCh0aWRkLCBhZXMoc2ltdikpICsgZ2VvbV9oaXN0b2dyYW0oKSArIGZhY2V0X2dyaWQofmNsYXNzKQpgYGAKCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KCiNQYXJ0IDIgLSBNYXNzIFNob290ZXJzIERhdGEgJiBaZWxpZyA0CgojIyMjVmFyaWFibGVzICYgRGF0YSBNYW5hZ2VtZW50CgpUaGlzIGFuYWx5c2lzIHdpbGwgdXNlIHRoZSBmb2xsb3dpbmcgdmFyaWFibGVzOiAKCiogKipnZW5kZXIqKiAtIE1lYXN1cmVzIHdoZXRoZXIgYSBtYXNzIHNob290ZXIgaXMgYSBNYWxlIG9yIEZlbWFsZQorICoqcmFjZSoqIC0gUmVjb3JkcyBhIG1hc3Mgc2hvb3RlcidzIHJhY2UgKHdoaXRlLCBibGFjaywgYXNpYW4sIHR3byBvciBtb3JlIHJhY2VzKQorICoqc2hvb3RlcmZhdGUqKiAtIFJlY29yZHMgdGhlIGZhdGUgb2YgYSBzaG9vdGVyIGF0IHRoZSBzY2VuZSBvZiB0aGVpciBjcmltZSAoa2lsbGVkLCBjb21pdHRlZCBzdWNpZGUsIG9yIGFwcHJlaGVuZGVkICJpLmUgbm90IGFwcGxpY2FibGUiKQoKVGhlIG5ldyB2YXJpYWJsZXMsICoqc2hvb3RlcndoaXRlKiosIHdhcyBnZW5lcmF0ZWQgdG8gcmVwcmVzZW50IG1hc3Mgc2hvb3RlcnMgd2hvIGFyZSB3aGl0ZSBhbmQgbm9uLXdoaXRlLCB3aGlsZSB0aGUgdmFyaWFibGUgKipzaG9vdGVyZGllZCoqIHJlcHJlc2VudHMgc2hvb3RlcnMgd2hvIGRpZWQgYXQgdGhlIHNjZW5lLCBlaXRoZXIgYnkgc3VpY2lkZSBvciBieSBsYXcgZW5mb3JjZW1lbnQsIGFuZCB0aG9zZSB3aG8gZGlkIG5vdCBkaWUvd2VyZSBhcHByZWhlbmRlZC4KCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQptYXNzaG9vdCA8LSBkYXRhLmZyYW1lKHJlYWRfY3N2KCIvVXNlcnMvZXJuZXN0by9Eb2N1bWVudHMvQWR2YW5jZWQgQW5hbHl0aWNzL0RhdGEvTWFzc1Nob290aW5ncy5jc3YiKSkgJT4lCiAgcmVuYW1lKCJzaG9vdGVyZmF0ZSIgPSBTaG9vdGVyLnMuQ2F1c2Uub2YuRGVhdGgsCiAgICAic2hvb3RlcmdlbmRlciIgPSBTaG9vdGVyLlNleCwKICAgICAic2hvb3RlcnJhY2UiID0gU2hvb3Rlci5SYWNlKSAlPiUKICBzZWxlY3Qoc2hvb3RlcmdlbmRlciwgc2hvb3RlcnJhY2UsIHNob290ZXJmYXRlKSAlPiUKICBmaWx0ZXIoIWlzLm5hKHNob290ZXJyYWNlKSwKICAgICAgICAgIWlzLm5hKHNob290ZXJnZW5kZXIpLAogICAgICAgICAhaXMubmEoc2hvb3RlcmZhdGUpLCAKICAgICAgICAhc2hvb3RlcmZhdGUgJWluJSBjKCJVbmtub3duIiksCiAgICAgICAgIXNob290ZXJyYWNlICVpbiUgYygiVW5rbm93biIpLAogICAgICAgICFzaG9vdGVyZ2VuZGVyICVpbiUgYygiVW5rbm93biIsICJNYWxlL0ZlbWFsZSIpLAogICAgICAgIHNob290ZXJnZW5kZXIgJWluJSBjKCJNYWxlIiwgIkZlbWFsZSIpKSAlPiUKICAgICAgbXV0YXRlKHNob290ZXJnZW5kZXI9YXMuZmFjdG9yKHNob290ZXJnZW5kZXIpLAogICAgICAgICAgICAgc2hvb3RlcndoaXRlPWFzLmZhY3RvcihpZmVsc2Uoc2hvb3RlcnJhY2U9PSJXaGl0ZSBBbWVyaWNhbiBvciBFdXJvcGVhbiBBbWVyaWNhbiIsIDEsIDApKSwKICAgICAgICAgICAgIHNob290ZXJmYXRlID0gdG9sb3dlcihzaG9vdGVyZmF0ZSksCiAgICAgICAgICAgICBzaG9vdGVyZGllZD1hcy5mYWN0b3IoaWZlbHNlKHNob290ZXJmYXRlICVpbiUgYygia2lsbGVkIiwic3VpY2lkZSIpLCAxLCAwKSkpCiAgICAgICAgICAgICAKCnByaW50KG1hc3Nob290KQpgYGAKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwojT3ZlcnZpZXcgb2YgRGF0YQoKIyMjI01hc3Mgc2hvb3RlcnMgYXJlIG92ZXJ3aGVsbWluZ2x5IHdoaXRlIGNvbXBhcmVkIHRvIG90aGVyIHJhY2VzLgoKYGBge3J9CmdncGxvdChtYXNzaG9vdCwgYWVzKHNob290ZXJyYWNlKSApICsKICBnZW9tX2JhcigpICsgY29vcmRfZmxpcCgpCmBgYApfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCiMjIyNNYXNzIHNob290ZXJzIGFsc28gdGVuZCB0byBiZSBtZW4uIApgYGB7cn0KZ2dwbG90KG1hc3Nob290LCBhZXMoc2hvb3RlcmdlbmRlcikgKSArCiAgZ2VvbV9iYXIoKSArIGNvb3JkX2ZsaXAoKQpgYGAKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwojIyMjVGhlIG1ham9yaXR5IG9mIG1hc3Mgc2hvb3RlcnMgYXJlIGVpdGhlciBhcHByZWhlbmRlZCAobm90IGFwcGxpY2FibGUpLCBob3dldmVyIG1hbnkgb2YgdGhlbSBjb21taXQgc3VpY2lkZS4gCmBgYHtyfQpnZ3Bsb3QobWFzc2hvb3QsIGFlcyhzaG9vdGVyZmF0ZSkgKSArCiAgZ2VvbV9iYXIoKSArIGNvb3JkX2ZsaXAoKQpgYGAKCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KCiNHZW5lcmF0aW5nIFplbGlnIE1vZGVsCgojIyMjI01lbiBhbmQgd2hpdGVzIG1vcmUgbGlrZWx5IHRvIGRpZSBhdCB0aGUgc2NlbmUgb2YgdGhlaXIgY3JpbWUuCgpgYGB7cn0Kc2hvb3R6ZWxpZyA8LSB6ZWxpZyhzaG9vdGVyZGllZCB+IHNob290ZXJ3aGl0ZSArIHNob290ZXJnZW5kZXIsIG1vZGVsID0gImxvZ2l0IiwgZGF0YSA9IG1hc3Nob290LCBjaXRlID0gRikKCnN1bW1hcnkoc2hvb3R6ZWxpZykKYGBgCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCgojR2VuZXJhdGluZyBTaW11bGF0aW9ucyAtIFJhY2lhbCBWYXJpYXRpb25zIGluIEdlbmRlciBEaWZmZXJlbmNlCgpUaGUgZmlyc3Qgc2ltdWxhdGlvbiBmaW5kcyB0aGF0IG1hc3Mgc2hvb3RlcnMgd2hvIGFyZSB3aGl0ZSBtZW4gYXJlIG1vcmUgbGlrZWx5IHRvIGRpZSBhdCB0aGUgc2NlbmUgb2YgdGhlaXIgY3JpbWVzIHRoYW4gd2hpdGUgd29tZW4gd2hvIGFyZSBtYXNzIHNob290ZXJzLCB3aXRoIGEgZmlyc3QgZGlmZmVyZW5jZSBvZiAtLjExCgpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KYTF4IDwtICBzZXR4KHNob290emVsaWcsIHNob290ZXJnZW5kZXIgPSAiTWFsZSIsIHNob290ZXJ3aGl0ZT0xKQphMXgxIDwtIHNldHgoc2hvb3R6ZWxpZywgc2hvb3RlcmdlbmRlcj0gIkZlbWFsZSIsIHNob290ZXJ3aGl0ZT0xKQphMXMgPC0gc2ltKHNob290emVsaWcsIHggPSBhMXgsIHgxPSBhMXgxKQoKc3VtbWFyeShhMXMpCmBgYApgYGB7cn0KcGxvdChhMXMpCmBgYApfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCgpUaGUgc2Vjb25kIHNpbXVsYXRpb24gc2hvd3MgdGhhdCBtYXNzIHNob290ZXJzIHdobyBhcmUgbm90IHdoaXRlIGJ1dCBtYWxlIGFyZSBhbHNvIG1vcmUgbGlrZWx5IHRvIGRpZSBhdCB0aGUgc2NlbmUgb2YgdGhlaXIgY3JpbWVzIGluIGNvbXBhcmlzb24gdG8gbm9uLXdoaXRlIGZlbWFsZSBzaG9vdGVycywgd2l0aCBhIGZpcnN0IGRpZmZlcmVuY2Ugb2YgLS4wNwoKRXZpZGVudGx5LCBtYXNzIHNob290ZXJzIHdobyBhcmUgbWVuIGFyZSBtb3JlIGxpa2VseSB0byBkaWUgYXQgdGhlIHNjZW5lIHRoYW4gd29tZW4sIHdoZXRoZXIgdGhleSBhcmUgd2hpdGUgb3Igbm9uLXdoaXRlLgoKYGBge3IsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CmEyeCA8LSBzZXR4KHNob290emVsaWcsIHNob290ZXJnZW5kZXI9Ik1hbGUiLCBzaG9vdGVyd2hpdGU9MCkKYTJ4MSA8LSBzZXR4KHNob290emVsaWcsIHNob290ZXJnZW5kZXI9ICJGZW1hbGUiLCBzaG9vdGVyd2hpdGU9MCkKYTJzIDwtIHNpbShzaG9vdHplbGlnLCB4PWEyeCwgeDE9YTJ4MSkKCnN1bW1hcnkoYTJzKQpgYGAKCmBgYHtyfQpwbG90KGEycykKYGBgCgojQ29tYmluaW5nIFNpbXVsYXRpb25zIEludG8gRGF0YWZyYW1lCgpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KZmQxIDwtIGExcyRnZXRfcWkoeHZhbHVlPSJ4MSIsIHFpPSJmZCIpCmZkMiA8LSBhMnMkZ2V0X3FpKHh2YWx1ZT0ieDEiLCBxaT0iZmQiKQpuZXdmZCA8LSBhcy5kYXRhLmZyYW1lKGNiaW5kKGZkMSwgZmQyKSkKY29sbmFtZXMobmV3ZmQpWzFdIDwtICJ3aGl0ZU0vRiIKY29sbmFtZXMobmV3ZmQpWzJdIDwtICJub253aGl0ZU0vRiIKaGVhZChuZXdmZCkKYGBgCgojR3JvdXAgU3VtbWFyeSBTdGF0cwpBbW9uZyB0aG9zZSB3aG8gYXJlIHdoaXRlIChWMSksIG1hbGUgYW5kIGZlbWFsZSBtYXNzIHNob290ZXJzIGFyZSBsZXNzIGxpa2VseSB0byBzdXJ2aXZlIChraWxsZWQgb3IgYnkgc3VpY2lkZSksIHdpdGggYSBnZW5kZXIgZGlmZmVyZW5jZSBvZiAuMTEsIGNvbXBhcmVkIHRvIG5vbi13aGl0ZSBtYWxlIGFuZCBmZW1hbGUgbWFzcyBzaG9vdGVycyAoVjIpLgoKYGBge3IsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CmZkc2hvb3RlciU+JQogIGdyb3VwX2J5KHYxKSU+JQogIHN1bW1hcml6ZShtZWFuPW1lYW4odjIpLCBzZD1zZCh2MikpCmBgYAoKCiNQbG90dGluZyBSZXN1bHRzClRoZSBmaWd1cmVzIHNob3cgdGhhdCB3aGl0ZSBtYWxlIGFuZCBmZW1hbGUgc2hvb3RlcnMgYXJlIGxlc3MgbGlrZWx5IHRvIHN1cnZpdmUgYXMgdGhlIGJhcnMgc2tldyBtb3JlIHRvIHRoZSBsZWZ0LCBjb21wYXJlZCB0byBwb3NpdGl2ZSBza2V3bmVzcyBvZiBub24td2hpdGUgbWFzcyBzaG9vdGVycyB3aG8gYXJlIG1hbGUgYW5kIGZlbWFsZS4KYGBge3IsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CmdncGxvdChmZHNob290ZXIsIGFlcyh2MikpICsgZ2VvbV9oaXN0b2dyYW0oKSArZmFjZXRfZ3JpZCh+djEpCmBgYAoKI0FuYWx5c2lzCgpJbiB0aGUgZW5kLCB0aGUgcmVzdWx0cyBzaG93cyB0aGF0IGEgZ2VuZGVyIGRpZmZlcmVuY2UgZXhpc3RzIGluIHRoZSBmYXRlIG9mIG1hc3Mgc2hvb3RlcnMsIHdpdGggbWFsZSBtYXNzIHNob290ZXJzLCByZWdhcmRsZXNzIG9mIHJhY2UsIGJlaW5nIG1vcmUgbGlrZWx5IHRvIGRpZSB0aGFuIGZlbWFsZSBtYXNzIHNob290ZXJzLiBXaGl0ZXMgYXJlIGFsc28gbW9yZSBsaWtlbHkgdG8gZGllLiBSYWNpYWwgdmFyaWF0aW9ucyBpbiBnZW5kZXIgZGlmZmVyZW5jZXMgc2hvdyB0aGF0IHdoaXRlIG1hbGUgYW5kIGZlbWFsZSBzaG9vdGVycyBhcmUgbGVzcyBsaWtlbHkgdG8gc3Vydml2ZSBjb21wYXJlZCB0byBub24td2hpdGUgZmVtYWxlIGFuZCBtYWxlIG1hc3Mgc2hvb3RlcnMuIAoKSXQgc2hvdWxkIGJlIG5vdGVkIHRoYXQgbXVjaCBvZiB0aGlzIGFuYWx5c2lzIGhpbmdlcyBvbiBvbmUgcmVhbGl0eSBpbmRpY2F0ZWQgYnkgdGhlIGludHJvZHVjdG9yeSBkYXRhIG92ZXJ2aWV3OiB0aGUgbWFqb3JpdHkgb2YgcmVjb3JkZWQgbWFzcyBzaG9vdGVycyBhcmUgd2hpdGUgYW5kL29yIG1hbGUuIE5hdHVyYWxseSwgYmVjYXVzZSBvZiB0aGlzLCBpdCBpcyBub3Qgc3VycHJpc2luZyB0byBzZWUgdGhhdCB0aGVzZSBncm91cHMgbGVhc3QgbGlrZWx5IHRvIHN1cnZpdmUgYWZ0ZXIgYSBtYXNzIHNob290aW5nIChlaXRoZXIga2lsbGVkIGJ5IGxhdyBlbmZvcmNlbWVudCBvciB0aGV5IHRha2UgdGhlaXIgb3duIGxpdmVzKS4KCk5lZWRsZXNzIHRvIHNheSwgdGhpcyBhbG9uZSBpcyBpbnRlcmVzdGluZyBpbiBhIHNvY2lldHkgd2hlcmUgbWFzcyBzaG9vdGluZ3MgYXJlIGJlY29taW5nIG1vcmUgY29tbW9ucGxhY2UgYW5kIHRoZSBjb252ZXJzYXRpb24gYXJvdW5kIChkb21lc3RpYykgdGVycm9yaXNtIHJlbWFpbnMgbGFyZ2VseSBjZW50ZXJlZCBvbiBzby1jYWxsZWQgcGVyY2VpdmVkICJzb2NpYWwgaWxscyIgb2YgcGFydGljdWxhciBjb21tdW5pdGllcyBvZiBjb2xvciAoaS5lLiBNdXNsaW1zKS4=