Sociology
Plots of the
Sociology department
snet1_g <- igraph::graph_from_adjacency_matrix(snet1, mode = c("undirected"))
snet2_g <- igraph::graph_from_adjacency_matrix(snet2, mode = c("undirected"))
snet3_g <- igraph::graph_from_adjacency_matrix(snet3, mode = c("undirected"))
socdef_df$twitter_dum[socdef_df$id==36]<- 1
socdef_df$twitcol <- ifelse(socdef_df$twitter_dum == 0, "#56B4E9", "#66ff99")
#Dit zou ik nog even moeten checken of dit klopt, want er lijken ineens ties weg te vallen door die coördinaten toe te voegen?
l <- igraph::layout_with_mds(snet1_g)
l[14,1] <- 0
l1 <- igraph::layout_with_mds(snet2_g)
l1[14,1] <- 0
l2 <- igraph::layout_with_mds(snet3_g)
l2[14,1] <- 0
#Wat wil ik met de nummers in de plot, moet ik die nog veranderen in namen? Maar wil het graag anoniem houden.
plot(snet1_g, vertex.color = socdef_df$twitcol, vertex.size=socdef_df$ki, vertex.size = 10, vertex.frame.color = "gray",
vertex.label.color = "black", vertex.label.family = "Helvetica", vertex.label.cex = 0.7, vertex.label.dist = 0.8,
edge.curved = 0.2, edge.arrow.size = 0.5, layout=l)

plot(snet2_g, vertex.color = socdef_df$twitcol, vertex.size=socdef_df$ki, vertex.size = 10, vertex.frame.color = "gray",
vertex.label.color = "black", vertex.label.family = "Helvetica", vertex.label.cex = 0.7, vertex.label.dist = 0.8,
edge.curved = 0.2, edge.arrow.size = 0.5, layout=l1)

plot(snet3_g, vertex.color = socdef_df$twitcol, vertex.size=socdef_df$ki, vertex.size = 10, vertex.frame.color = "gray",
vertex.label.color = "black", vertex.label.family = "Helvetica", vertex.label.cex = 0.7, vertex.label.dist = 0.8,
edge.curved = 0.2, edge.arrow.size = 0.5, layout=l2)

From the plots of the Sociology department it’s visible that there
are quite a lot of co-publications within the network of Sociology. The
first plot (of the year 2016-2017) shows that many scientists did not
co-publish yet, but this increased over the years. This can be explained
by the fact that a number of (younger) scientists did not yet work at
the department in e.g. 2016, which results in no co-publication tie.
Since node 14 is the most “productive” in the sense of co-publishing
with others, I have put this node central in all the plots to show the
evolution. This is an older scientist who has had more opportunities to
publish with other individuals of the staff.
Another conclusion that can be drawn from the plot, is that
individuals with a higher k-index do not have more co-publication ties.
As I based the vertex size on the k-index, a higher k-index results in a
larger vertex in the plot. It is visible that node 28 and 30 have the
highest k-index, but this did not result in co-publications for node 30.
For node 28, there is an increase of 3 co-publication ties when
comparing the latter 2 plots. This could signal that this scientist is
attractive to others because of the k-index, but this conclusion cannot
be drawn yet from this plot alone. Therefore, this plot does not hint at
selection effects based on k-index.
Descriptives of the
Sociology network
sdegree <- igraph::degree(snet1_g)
sdegree2 <- igraph::degree(snet2_g)
sdegree3 <- igraph::degree(snet3_g)
#par(mfrow=c(3,1))
hist(sdegree, col="#99d6ff")

hist(sdegree2, col="#99d6ff")

hist(sdegree3, col="#99d6ff")

In the histograms above it is shown that the degree of the network is
right-skewed. This means that most scientists in the network don’t have
many other scientists within the department they co-published with. This
is strongest for first the histogram, showing the first wave
(2016-2017). In the following year, there still is a right-skewed
distribution of the degrees, but there are a little more staff members
in the tail of the distribution, meaning that these scientists have
quite a lot of copublication ties. This occurs the most strongly in the
histogram of the last years (2020 until now).
igraph::dyad.census(snet1_g)
#> $mut
#> [1] 26
#>
#> $asym
#> [1] 0
#>
#> $null
#> [1] 502
igraph::triad.census(snet1_g)
#> [1] 4750 0 616 0 0 0 0 0 0 0 80 0 0 0 0 10
igraph::edge_density(snet1_g)
#> [1] 0.04924242
igraph::dyad.census(snet2_g)
#> $mut
#> [1] 27
#>
#> $asym
#> [1] 0
#>
#> $null
#> [1] 501
igraph::triad.census(snet2_g)
#> [1] 4715 0 656 0 0 0 0 0 0 0 74 0 0 0 0 11
igraph::edge_density(snet2_g)
#> [1] 0.05113636
igraph::dyad.census(snet3_g)
#> $mut
#> [1] 38
#>
#> $asym
#> [1] 0
#>
#> $null
#> [1] 490
igraph::triad.census(snet3_g)
#> [1] 4398 0 949 0 0 0 0 0 0 0 98 0 0 0 0 11
igraph::edge_density(snet3_g)
#> [1] 0.0719697
Regarding density and dyads in the network, there are 26 dyads in the
first wave. The edge density is 0.049, which means that the number of
edges existing in the network is relatively low compared to the the
maximum number of edges there could possibly be. In the second wave,
there is an increase of 1 dyad, and the edge density also has increased
slightly towards a number of 0.051. In the last wave, there are 38 dyads
and the edge density has increased to 0.072. Regarding the triad census
[@davis1967structure], there are first 10
and then 11 complete triads, and first a decrease and then an increase
of triads with one central node. Still, the triad 003 (with 3 null
relations) occurs most. All in all, the co-publications within the
network of sociology have increased, and over the years, the scientists
at the department have used more of their opportunities to collaborate
with members within the network.
igraph::transitivity(snet1_g)
#> [1] 0.2727273
igraph::transitivity(snet2_g)
#> [1] 0.3084112
igraph::transitivity(snet3_g)
#> [1] 0.2519084
Last but not least, the transitivity effect shows whether co-authors
of co-authors become co-authors. For this network, no linear change can
be observed. In the first wave, there is a transitivity number of 0.27.
If one staff member A is connected to staff member B and staff member C,
the probability is 0.27 that staff member B and C will also co-publish.
In the second wave, we see that this probability has even increased to
0.308. In the last wave, the transitivity number is the lowest.
Possibly, the fact that there are more mebers in the networks could
increase the opportunities to co-publish with others, not depending on
co-authors of co-authors.
K-index at the
Sociology department
twsocbar <- ggplot2:::ggplot(socdef_df, aes(factor(twitter_dum), fill = factor(twitter_dum))) + geom_bar()
twsocbar <- twsocbar + scale_fill_manual(values=c("#56B4E9", "#66ff99"))
ggplotly(twsocbar)
Before diving into the k-index, it is insightful to see how many of
the scientist at the department of Sociology have Twitter. In the above
(interactive) graph, it is shown that 13 scientist do not have Twitter,
while 20 scientists do have Twitter.
sel <- socdef_df$twitter_dum==1
hist(socdef_df$ki[sel], col="lightblue", border="darkblue")

The above histogram shows the distribution of the k-index of
scientists at the Sociology department. The distribution is
right-skewed: Most scientists have a k-index between 0 and 2, and a few
scientists have a high index. A few staff members have a k-index that
would be categorized as “Kardashian Scientist” (Hall, 2014)
modelki <- lm(ki ~ gender + dutch + pub_first, data=socdef_df)
summary(modelki)
#>
#> Call:
#> lm(formula = ki ~ gender + dutch + pub_first, data = socdef_df)
#>
#> Residuals:
#> Min 1Q Median 3Q Max
#> -3.5728 -0.9822 -0.0788 0.9981 4.8327
#>
#> Coefficients:
#> Estimate Std. Error t value Pr(>|t|)
#> (Intercept) -321.56977 95.80579 -3.356 0.00222 **
#> gendermale 2.08062 0.75754 2.747 0.01024 *
#> dutch -2.63707 0.92753 -2.843 0.00810 **
#> pub_first 0.16104 0.04749 3.391 0.00203 **
#> ---
#> Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#>
#> Residual standard error: 1.896 on 29 degrees of freedom
#> Multiple R-squared: 0.4394, Adjusted R-squared: 0.3814
#> F-statistic: 7.577 on 3 and 29 DF, p-value: 0.0006882
Lastly, it is insightful to see to what extent the k-index is
predicted by other factors. The above linear regression teaches us that
male scientist of Sociology have a significantly higher k-index than
female staff members. It is also visible that Dutch scientists have a
significantly lower k-index than non-Dutch scientists. Lastly, age is
significantly related to the k-index: as age decreases, the k-index
increases. Younger individuals thus have a higher k-index than older
individuals. These effects can also be seen in the (interactive) graph
below.
regplotsoc <- ggplot(socdef_df, mapping = aes(x = pub_first, y = ki, color=gender)) +
geom_line()
ggplotly(regplotsoc)
Data science
dnet1 <- dnet_array[ ,, 1]
dnet2 <- dnet_array[ ,, 2]
dnet3 <- dnet_array[ ,, 3]
diag(dnet1) <- 0
diag(dnet2) <- 0
diag(dnet3) <- 0
Plots of the Data
Science department
dnet1_g <- igraph::graph_from_adjacency_matrix(dnet1, mode = c("undirected"))
dnet2_g <- igraph::graph_from_adjacency_matrix(dnet2, mode = c("undirected"))
dnet3_g <- igraph::graph_from_adjacency_matrix(dnet3, mode = c("undirected"))
datadef_df$twitcol <- ifelse(datadef_df$twitter_dum == 0, "#56B4E9", "#66ff99")
#Dit zou ik nog even moeten checken of dit klopt, want er lijken ineens ties weg te vallen door die coördinaten toe te voegen?
# l <- igraph::layout_with_mds(snet1_g)
# l[14,1] <- 0
# l1 <- igraph::layout_with_mds(snet2_g)
# l1[14,1] <- 0
# l2 <- igraph::layout_with_mds(snet3_g)
# l2[14,1] <- 0
#Wat wil ik met de nummers in de plot, moet ik die nog veranderen in namen? Maar wil het graag anoniem houden.
plot(dnet1_g, vertex.color = datadef_df$twitcol, vertex.size=datadef_df$ki, vertex.size = 10, vertex.frame.color = "gray",
vertex.label.color = "black", vertex.label.family = "Helvetica", vertex.label.cex = 0.7, vertex.label.dist = 0.8,
edge.curved = 0.2, edge.arrow.size = 0.5)

plot(dnet2_g, vertex.color = datadef_df$twitcol, vertex.size=datadef_df$ki, vertex.size = 10, vertex.frame.color = "gray",
vertex.label.color = "black", vertex.label.family = "Helvetica", vertex.label.cex = 0.7, vertex.label.dist = 0.8,
edge.curved = 0.2, edge.arrow.size = 0.5)

plot(dnet3_g, vertex.color = datadef_df$twitcol, vertex.size=datadef_df$ki, vertex.size = 10, vertex.frame.color = "gray",
vertex.label.color = "black", vertex.label.family = "Helvetica", vertex.label.cex = 0.7, vertex.label.dist = 0.8,
edge.curved = 0.2, edge.arrow.size = 0.5)

In the network plots of Data Science, it shows that during the year
2016-2017 there were not many co-publications. Just like at the
Sociology department, it is likely that a high number of scientists did
not work at the department yet. In the years 2018-2019, there is a
strong increase in the co-publications of the staff members of Data
Science. Node 1, 3 and 5 seem to have a central role in the network,
with the highest number of edges, and thus the most co-pulications with
other scientists within the department. In the last plot, again an
increase in co-publications is visible. Node 1, 3 and 5 still have a
central role in the network, but there now are other nodes with a
relative high number of co-publications as well.Similarly to the
Sociology department, there are only a few nodes with a high k-index
(shown by the largest vertex size), and it does not seem as if these
scientists are especially attractive to others to co-publish an
article.
Descriptives of the
Data Science network
ddegree1 <- igraph::degree(dnet1_g)
hist(ddegree1, col="purple")

ddegree2 <- igraph::degree(dnet2_g)
hist(ddegree2, col="purple")

ddegree3 <- igraph::degree(dnet3_g)
hist(ddegree3, col="purple")
Similarly to Sociology, the Data Science department shows a right-skewed
distribution of the degrees. In the first wave, most scientists had not
co-published, or only little. In the histogram of the second wave, it
can be observed that the degrees remain skewed to the right.
Furthermore, it is visible that one scientist has more than 8
copublications, and that in general, the number of outdegrees increased.
However, most individuals still have no co-publications. In the last
histogram, more scientists are in the tail, as also observed at the
Sociology department. Furthermore, there are even staff scientist with
10-11 copublications. This is a higher number of copublications than
observed at the Sociology department.
igraph::dyad.census(dnet1_g)
#> $mut
#> [1] 22
#>
#> $asym
#> [1] 0
#>
#> $null
#> [1] 1013
igraph::triad.census(dnet1_g)
#> [1] 14245 0 909 0 0 0 0 0 0 0 19 0 0 0 0 7
igraph::edge_density(dnet1_g)
#> [1] 0.02125604
igraph::dyad.census(dnet2_g)
#> $mut
#> [1] 38
#>
#> $asym
#> [1] 0
#>
#> $null
#> [1] 997
igraph::triad.census(dnet2_g)
#> [1] 13611 0 1484 0 0 0 0 0 0 0 67 0 0 0 0 18
igraph::edge_density(dnet2_g)
#> [1] 0.03671498
igraph::dyad.census(dnet3_g)
#> $mut
#> [1] 70
#>
#> $asym
#> [1] 0
#>
#> $null
#> [1] 965
igraph::triad.census(dnet3_g)
#> [1] 12395 0 2537 0 0 0 0 0 0 0 201 0 0 0 0 47
igraph::edge_density(dnet3_g)
#> [1] 0.06763285
Looking at the dyad census and density, the number of dyads in
2016-2017 counts 22. The edge density is 0.0212. Both of these numbers
are lower than at the Sociology department. In 2018-2019, the number of
dyads has increased to 38 and the edge density has increased to 0.037.
This is still lower than the edge density within the sociology
department in the same years. In the last years, there are 70 dyads and
the edge density increased towards a number of 0.068. This remains a
little lower than the edge density of the Sociology department at that
time. With regard to the triads, we see a similar pattern as at the
Sociology department. However, there are more complete triads at Data
Science, and this number has increased rather strongly over the
years.
igraph::transitivity(dnet1_g)
#> [1] 0.525
igraph::transitivity(dnet2_g)
#> [1] 0.446281
igraph::transitivity(dnet3_g)
#> [1] 0.4122807
Regarding the transitivity, this has decreased at Data Science over
the years. In the first period, the probability that scientist B and C -
both as co-authors of scientist A - would co-publish was 0.52. In the
next year, this decreased to a 45% chance, while in the last year this
chance is 41,2%. Still, this is a higher number than observed at the
Sociology department. Also, there is a linear decrease at the department
of Data Science, while at the Sociology department no linear trend could
be observed. In conclusion, staff members at Data Science are more
likely to co-publish with co-authors of their co-authors than at
Sociology, which is in line with the larger increase in triads.
K-index at the
department of Data Science
twdatbar <- ggplot2:::ggplot(datadef_df, aes(factor(twitter_dum), fill = factor(twitter_dum))) + geom_bar()
twdatbar <- twdatbar + scale_fill_manual(values=c("#56B4E9", "#66ff99"))
ggplotly(twdatbar)
At the Data Science department, the majority of scientist has a
Twitter account: 30 scientists have a Twitter account while 16 do not
have one.
sel2 <- datadef_df$twitter_dum==1
hist(datadef_df$ki[sel2], col="red")
The histogram shows that at the Data Science department, the
distribution of the k-index is even more skewed than at the Sociology
department. Most scientist have a k-index between 0 and 1, while only a
few scientists have a k-index higher than that. Approximately two
scientist would be categorized as “Kardashian Scientists” by Hall
(2014)
modelki2 <- lm(ki ~ gender + dutch + pub_first, data=datadef_df)
summary(modelki2)
#>
#> Call:
#> lm(formula = ki ~ gender + dutch + pub_first, data = datadef_df)
#>
#> Residuals:
#> Min 1Q Median 3Q Max
#> -1.5814 -0.9685 -0.4150 0.2484 11.7131
#>
#> Coefficients:
#> Estimate Std. Error t value Pr(>|t|)
#> (Intercept) -127.56740 61.00338 -2.091 0.0426 *
#> gendermale -0.01333 0.70774 -0.019 0.9851
#> dutch -0.14260 0.72191 -0.198 0.8444
#> pub_first 0.06392 0.03033 2.107 0.0411 *
#> ---
#> Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#>
#> Residual standard error: 2.116 on 42 degrees of freedom
#> Multiple R-squared: 0.09806, Adjusted R-squared: 0.03364
#> F-statistic: 1.522 on 3 and 42 DF, p-value: 0.2227
At the Data Science department, the k-index is predicted differently
than at the Sociology department when looking at the linear regression
above. For the Data Science department, the effect of gender and
ethnicity are not significant. Age is a significant predictor of the
k-index. The younger the scientist, the higher the k-index. In the
(interactive) plot below, it is also visible that gender and age are
lesser determinants of the k-index than at the Sociology department.
# Dit nog bij assigning gender neerzetten (webscraping)
datadef_df$gender[datadef_df$id==261] <- "male"
datadef_df$gender[datadef_df$id==273] <- "male"
regplotdat <- ggplot(datadef_df, mapping = aes(x = pub_first, y = ki, color=gender)) +
geom_line()
ggplotly(regplotdat)
Comparison of the two
departments
When comparing the two departments, there are some things worth
noting. Regarding the network structure, the density of the
co-publication network of Sociology is higher than that of the Data
Science department. Within Sociology, scientists thus co-publish more
with others of the same department, but at both cases the density is
low. This shows that at both departments the co-publication network is
rather sparse. This is not strange, as within academia it is not always
possible to co-publish with any scientist in the network, as they might
have different research interests. The transitivity differs as well
between the two departments. The transitivity is higher at Data Science
than at Sociology. This signals that it is more common among Data
Scientists to publish articles with co-authors of co-authors.
With regard to Twitter and the k-index, the descriptives show that at
both departments, the majority has a Twitter account. At the Data
Science department, most scientists have a very low k-index with some
exceptions, while at the Sociology department there are a few more
scientists with a k-index above 1. This could show that for
Sociologists, Twitter activity may be considered as more important than
for Data Scientists, and for Sociologists the actual scientific output
in terms of articles might be less important. Possibly, this could be
explained by the fact that Sociologists would like to engage with
society to share their research, as this society is often the research
topic. However, for both departments, there are no clear hints that
these scientists with a high k-index have more or less co-publications
than scientists with a lower k-index.
LS0tCnRpdGxlOiAiRGVzY3JpcHRpdmUgU3RhdGlzdGljcyIKYXV0aG9yOiAiQW51c2Noa2EgUGVlbGVuIgpkYXRlOiAiYHIgU3lzLkRhdGUoKWAiCm91dHB1dDogCiAgaHRtbF9kb2N1bWVudDoKICAgICBjb2RlX2ZvbGRpbmc6ICJoaWRlIgplZGl0b3Jfb3B0aW9uczogCiAgbWFya2Rvd246IAogICAgd3JhcDogNzIKLS0tCgpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFKQpgYGAKCmBgYHtyLCBnbG9iYWxzZXR0aW5ncywgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRSwgcmVzdWx0cz0naGlkZSd9CmxpYnJhcnkoa25pdHIpCgprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUpCm9wdHNfY2h1bmskc2V0KHRpZHkub3B0cz1saXN0KHdpZHRoLmN1dG9mZj0xMDApLHRpZHk9VFJVRSwgd2FybmluZyA9IEZBTFNFLCBtZXNzYWdlID0gRkFMU0UsY29tbWVudCA9ICIjPiIsIGNhY2hlPVRSVUUsIGNsYXNzLnNvdXJjZT1jKCJ0ZXN0IiksIGNsYXNzLm91dHB1dD1jKCJ0ZXN0MiIpKQpvcHRpb25zKHdpZHRoID0gMTAwKQpyZ2w6OnNldHVwS25pdHIoKQoKCmNvbG9yaXplIDwtIGZ1bmN0aW9uKHgsIGNvbG9yKSB7c3ByaW50ZigiPHNwYW4gc3R5bGU9J2NvbG9yOiAlczsnPiVzPC9zcGFuPiIsIGNvbG9yLCB4KSB9CmBgYAoKYGBge3Iga2xpcHB5LCBlY2hvPUZBTFNFLCBpbmNsdWRlPVRSVUV9CmtsaXBweTo6a2xpcHB5KHBvc2l0aW9uID0gYygndG9wJywgJ3JpZ2h0JykpCiNrbGlwcHk6OmtsaXBweShjb2xvciA9ICdkYXJrcmVkJykKI2tsaXBweTo6a2xpcHB5KHRvb2x0aXBfbWVzc2FnZSA9ICdDbGljayB0byBjb3B5JywgdG9vbHRpcF9zdWNjZXNzID0gJ0RvbmUnKQpgYGAKCmBgYHtyLCBlY2hvPUZBTFNFLCByZXN1bHRzPSdoaWRlJ30KI3N0YXJ0IHdpdGggY2xlYW4gd29ya3NwYWNlIApybShsaXN0PWxzKCkpCmdldHdkKCkKYGBgCgpgYGB7ciwgZWNobz1GQUxTRX0KbGlicmFyeShkYXRhLnRhYmxlKSAKbGlicmFyeSh0aWR5dmVyc2UpIApyZXF1aXJlKHN0cmluZ2kpCnJlcXVpcmUoUnNpZW5hKQpyZXF1aXJlKGlncmFwaCkKbGlicmFyeShnZ3Bsb3QyKQoKI2luc3RhbGwucGFja2FnZXMoInBsb3RseSIpCmxpYnJhcnkocGxvdGx5KQoKYGBgCgpgYGB7ciwgZWNobz1GQUxTRX0KI2xvYWQgZGF0YW9iamVjdHMKbG9hZCgiL1VzZXJzL2FudXNjaGthL0RvY3VtZW50cy9sYWJqb3VybmFsL2RhdGEvc29jZGVmX25ldF9hcnJheS5SRGF0YSIpCmxvYWQoIi9Vc2Vycy9hbnVzY2hrYS9Eb2N1bWVudHMvbGFiam91cm5hbC9kYXRhL3NvY2RlZl9kZi5SRGF0YSIpCmBgYAoKYGBge3IsIGVjaG89RkFMU0V9CnNuZXQxIDwtIHNvY19uZXRfYXJyYXlbICwsIDFdCnNuZXQyIDwtIHNvY19uZXRfYXJyYXlbICwsIDJdCnNuZXQzIDwtIHNvY19uZXRfYXJyYXlbICwsIDNdCgpkaWFnKHNuZXQxKSA8LSAwCmRpYWcoc25ldDIpIDwtIDAKZGlhZyhzbmV0MykgPC0gMApgYGAKCiMgU29jaW9sb2d5CgojIyBQbG90cyBvZiB0aGUgU29jaW9sb2d5IGRlcGFydG1lbnQgCmBgYHtyfQpzbmV0MV9nIDwtIGlncmFwaDo6Z3JhcGhfZnJvbV9hZGphY2VuY3lfbWF0cml4KHNuZXQxLCBtb2RlID0gYygidW5kaXJlY3RlZCIpKQpzbmV0Ml9nIDwtIGlncmFwaDo6Z3JhcGhfZnJvbV9hZGphY2VuY3lfbWF0cml4KHNuZXQyLCBtb2RlID0gYygidW5kaXJlY3RlZCIpKQpzbmV0M19nIDwtIGlncmFwaDo6Z3JhcGhfZnJvbV9hZGphY2VuY3lfbWF0cml4KHNuZXQzLCBtb2RlID0gYygidW5kaXJlY3RlZCIpKQoKc29jZGVmX2RmJHR3aXR0ZXJfZHVtW3NvY2RlZl9kZiRpZD09MzZdPC0gMQpzb2NkZWZfZGYkdHdpdGNvbCA8LSBpZmVsc2Uoc29jZGVmX2RmJHR3aXR0ZXJfZHVtID09IDAsICIjNTZCNEU5IiwgIiM2NmZmOTkiKQoKI0RpdCB6b3UgaWsgbm9nIGV2ZW4gbW9ldGVuIGNoZWNrZW4gb2YgZGl0IGtsb3B0LCB3YW50IGVyIGxpamtlbiBpbmVlbnMgdGllcyB3ZWcgdGUgdmFsbGVuIGRvb3IgZGllIGNvw7ZyZGluYXRlbiB0b2UgdGUgdm9lZ2VuPwpsIDwtIGlncmFwaDo6bGF5b3V0X3dpdGhfbWRzKHNuZXQxX2cpCmxbMTQsMV0gPC0gMApsMSA8LSBpZ3JhcGg6OmxheW91dF93aXRoX21kcyhzbmV0Ml9nKQpsMVsxNCwxXSA8LSAwCmwyIDwtIGlncmFwaDo6bGF5b3V0X3dpdGhfbWRzKHNuZXQzX2cpCmwyWzE0LDFdIDwtIDAKCiNXYXQgd2lsIGlrIG1ldCBkZSBudW1tZXJzIGluIGRlIHBsb3QsIG1vZXQgaWsgZGllIG5vZyB2ZXJhbmRlcmVuIGluIG5hbWVuPyBNYWFyIHdpbCBoZXQgZ3JhYWcgYW5vbmllbSBob3VkZW4uCnBsb3Qoc25ldDFfZywgdmVydGV4LmNvbG9yID0gc29jZGVmX2RmJHR3aXRjb2wsIHZlcnRleC5zaXplPXNvY2RlZl9kZiRraSwgIHZlcnRleC5zaXplID0gMTAsIHZlcnRleC5mcmFtZS5jb2xvciA9ICJncmF5IiwKICAgIHZlcnRleC5sYWJlbC5jb2xvciA9ICJibGFjayIsIHZlcnRleC5sYWJlbC5mYW1pbHkgPSAiSGVsdmV0aWNhIiwgdmVydGV4LmxhYmVsLmNleCA9IDAuNywgdmVydGV4LmxhYmVsLmRpc3QgPSAwLjgsCiAgICBlZGdlLmN1cnZlZCA9IDAuMiwgZWRnZS5hcnJvdy5zaXplID0gMC41LCBsYXlvdXQ9bCkKcGxvdChzbmV0Ml9nLCB2ZXJ0ZXguY29sb3IgPSBzb2NkZWZfZGYkdHdpdGNvbCwgdmVydGV4LnNpemU9c29jZGVmX2RmJGtpLCAgdmVydGV4LnNpemUgPSAxMCwgdmVydGV4LmZyYW1lLmNvbG9yID0gImdyYXkiLAogICAgdmVydGV4LmxhYmVsLmNvbG9yID0gImJsYWNrIiwgdmVydGV4LmxhYmVsLmZhbWlseSA9ICJIZWx2ZXRpY2EiLCB2ZXJ0ZXgubGFiZWwuY2V4ID0gMC43LCB2ZXJ0ZXgubGFiZWwuZGlzdCA9IDAuOCwKICAgIGVkZ2UuY3VydmVkID0gMC4yLCBlZGdlLmFycm93LnNpemUgPSAwLjUsIGxheW91dD1sMSkKcGxvdChzbmV0M19nLCB2ZXJ0ZXguY29sb3IgPSBzb2NkZWZfZGYkdHdpdGNvbCwgdmVydGV4LnNpemU9c29jZGVmX2RmJGtpLCAgdmVydGV4LnNpemUgPSAxMCwgdmVydGV4LmZyYW1lLmNvbG9yID0gImdyYXkiLAogICAgdmVydGV4LmxhYmVsLmNvbG9yID0gImJsYWNrIiwgdmVydGV4LmxhYmVsLmZhbWlseSA9ICJIZWx2ZXRpY2EiLCB2ZXJ0ZXgubGFiZWwuY2V4ID0gMC43LCB2ZXJ0ZXgubGFiZWwuZGlzdCA9IDAuOCwKICAgIGVkZ2UuY3VydmVkID0gMC4yLCBlZGdlLmFycm93LnNpemUgPSAwLjUsIGxheW91dD1sMikKCmBgYAoKCkZyb20gdGhlIHBsb3RzIG9mIHRoZSBTb2Npb2xvZ3kgZGVwYXJ0bWVudCBpdCdzIHZpc2libGUgdGhhdCB0aGVyZSBhcmUgcXVpdGUgYSBsb3Qgb2YgY28tcHVibGljYXRpb25zIHdpdGhpbiB0aGUgbmV0d29yayBvZiBTb2Npb2xvZ3kuIFRoZSBmaXJzdCBwbG90IChvZiB0aGUgeWVhciAyMDE2LTIwMTcpIHNob3dzIHRoYXQgbWFueSBzY2llbnRpc3RzIGRpZCBub3QgY28tcHVibGlzaCB5ZXQsIGJ1dCB0aGlzIGluY3JlYXNlZCBvdmVyIHRoZSB5ZWFycy4gVGhpcyBjYW4gYmUgZXhwbGFpbmVkIGJ5IHRoZSBmYWN0IHRoYXQgYSBudW1iZXIgb2YgKHlvdW5nZXIpIHNjaWVudGlzdHMgZGlkIG5vdCB5ZXQgd29yayBhdCB0aGUgZGVwYXJ0bWVudCBpbiBlLmcuIDIwMTYsIHdoaWNoIHJlc3VsdHMgaW4gbm8gY28tcHVibGljYXRpb24gdGllLiBTaW5jZSBub2RlIDE0IGlzIHRoZSBtb3N0ICJwcm9kdWN0aXZlIiBpbiB0aGUgc2Vuc2Ugb2YgY28tcHVibGlzaGluZyB3aXRoIG90aGVycywgSSBoYXZlIHB1dCB0aGlzIG5vZGUgY2VudHJhbCBpbiBhbGwgdGhlIHBsb3RzIHRvIHNob3cgdGhlIGV2b2x1dGlvbi4gVGhpcyBpcyBhbiBvbGRlciBzY2llbnRpc3Qgd2hvIGhhcyBoYWQgbW9yZSBvcHBvcnR1bml0aWVzIHRvIHB1Ymxpc2ggd2l0aCBvdGhlciBpbmRpdmlkdWFscyBvZiB0aGUgc3RhZmYuICAgCgpBbm90aGVyIGNvbmNsdXNpb24gdGhhdCBjYW4gYmUgZHJhd24gZnJvbSB0aGUgcGxvdCwgaXMgdGhhdCBpbmRpdmlkdWFscyB3aXRoIGEgaGlnaGVyIGstaW5kZXggZG8gbm90IGhhdmUgbW9yZSBjby1wdWJsaWNhdGlvbiB0aWVzLiBBcyBJIGJhc2VkIHRoZSB2ZXJ0ZXggc2l6ZSBvbiB0aGUgay1pbmRleCwgYSBoaWdoZXIgay1pbmRleCByZXN1bHRzIGluIGEgbGFyZ2VyIHZlcnRleCBpbiB0aGUgcGxvdC4gSXQgaXMgdmlzaWJsZSB0aGF0IG5vZGUgMjggYW5kIDMwIGhhdmUgdGhlIGhpZ2hlc3Qgay1pbmRleCwgYnV0IHRoaXMgZGlkIG5vdCByZXN1bHQgaW4gY28tcHVibGljYXRpb25zIGZvciBub2RlIDMwLiBGb3Igbm9kZSAyOCwgdGhlcmUgaXMgYW4gaW5jcmVhc2Ugb2YgMyBjby1wdWJsaWNhdGlvbiB0aWVzIHdoZW4gY29tcGFyaW5nIHRoZSBsYXR0ZXIgMiBwbG90cy4gVGhpcyBjb3VsZCBzaWduYWwgdGhhdCB0aGlzIHNjaWVudGlzdCBpcyBhdHRyYWN0aXZlIHRvIG90aGVycyBiZWNhdXNlIG9mIHRoZSBrLWluZGV4LCBidXQgdGhpcyBjb25jbHVzaW9uIGNhbm5vdCBiZSBkcmF3biB5ZXQgZnJvbSB0aGlzIHBsb3QgYWxvbmUuIFRoZXJlZm9yZSwgdGhpcyBwbG90IGRvZXMgbm90IGhpbnQgYXQgc2VsZWN0aW9uIGVmZmVjdHMgYmFzZWQgb24gay1pbmRleC4gIAoKIyMgRGVzY3JpcHRpdmVzIG9mIHRoZSBTb2Npb2xvZ3kgbmV0d29yawoKYGBge3J9CnNkZWdyZWUgPC0gaWdyYXBoOjpkZWdyZWUoc25ldDFfZykKc2RlZ3JlZTIgPC0gaWdyYXBoOjpkZWdyZWUoc25ldDJfZykKc2RlZ3JlZTMgPC0gaWdyYXBoOjpkZWdyZWUoc25ldDNfZykKCgojcGFyKG1mcm93PWMoMywxKSkKaGlzdChzZGVncmVlLCBjb2w9IiM5OWQ2ZmYiKQpoaXN0KHNkZWdyZWUyLCBjb2w9IiM5OWQ2ZmYiKQpoaXN0KHNkZWdyZWUzLCBjb2w9IiM5OWQ2ZmYiKQpgYGAKCkluIHRoZSBoaXN0b2dyYW1zIGFib3ZlIGl0IGlzIHNob3duIHRoYXQgdGhlIGRlZ3JlZSBvZiB0aGUgbmV0d29yayBpcyByaWdodC1za2V3ZWQuIFRoaXMgbWVhbnMgdGhhdCBtb3N0IHNjaWVudGlzdHMgaW4gdGhlIG5ldHdvcmsgZG9uJ3QgaGF2ZSBtYW55IG90aGVyIHNjaWVudGlzdHMgd2l0aGluIHRoZSBkZXBhcnRtZW50IHRoZXkgY28tcHVibGlzaGVkIHdpdGguIApUaGlzIGlzIHN0cm9uZ2VzdCBmb3IgZmlyc3QgdGhlIGhpc3RvZ3JhbSwgc2hvd2luZyB0aGUgZmlyc3Qgd2F2ZSAoMjAxNi0yMDE3KS4gSW4gdGhlIGZvbGxvd2luZyB5ZWFyLCB0aGVyZSBzdGlsbCBpcyBhIHJpZ2h0LXNrZXdlZCBkaXN0cmlidXRpb24gb2YgdGhlIGRlZ3JlZXMsIGJ1dCB0aGVyZSBhcmUgYSBsaXR0bGUgbW9yZSBzdGFmZiBtZW1iZXJzIGluIHRoZSB0YWlsIG9mIHRoZSBkaXN0cmlidXRpb24sIG1lYW5pbmcgdGhhdCB0aGVzZSBzY2llbnRpc3RzIGhhdmUgcXVpdGUgYSBsb3Qgb2YgY29wdWJsaWNhdGlvbiB0aWVzLiBUaGlzIG9jY3VycyB0aGUgbW9zdCBzdHJvbmdseSBpbiB0aGUgaGlzdG9ncmFtIG9mIHRoZSBsYXN0IHllYXJzICgyMDIwIHVudGlsIG5vdykuIAoKCmBgYHtyfQppZ3JhcGg6OmR5YWQuY2Vuc3VzKHNuZXQxX2cpCmlncmFwaDo6dHJpYWQuY2Vuc3VzKHNuZXQxX2cpCmlncmFwaDo6ZWRnZV9kZW5zaXR5KHNuZXQxX2cpCgoKaWdyYXBoOjpkeWFkLmNlbnN1cyhzbmV0Ml9nKQppZ3JhcGg6OnRyaWFkLmNlbnN1cyhzbmV0Ml9nKQppZ3JhcGg6OmVkZ2VfZGVuc2l0eShzbmV0Ml9nKQoKaWdyYXBoOjpkeWFkLmNlbnN1cyhzbmV0M19nKQppZ3JhcGg6OnRyaWFkLmNlbnN1cyhzbmV0M19nKQppZ3JhcGg6OmVkZ2VfZGVuc2l0eShzbmV0M19nKQpgYGAKClJlZ2FyZGluZyBkZW5zaXR5IGFuZCBkeWFkcyBpbiB0aGUgbmV0d29yaywgdGhlcmUgYXJlIDI2IGR5YWRzIGluIHRoZSBmaXJzdCB3YXZlLiBUaGUgZWRnZSBkZW5zaXR5IGlzCjAuMDQ5LCB3aGljaCBtZWFucyB0aGF0IHRoZSBudW1iZXIgb2YgZWRnZXMgZXhpc3RpbmcgaW4gdGhlIG5ldHdvcmsgaXMKcmVsYXRpdmVseSBsb3cgY29tcGFyZWQgdG8gdGhlIHRoZSBtYXhpbXVtIG51bWJlciBvZiBlZGdlcyB0aGVyZSBjb3VsZCBwb3NzaWJseSBiZS4KSW4gdGhlIHNlY29uZCB3YXZlLCB0aGVyZSBpcyBhbiBpbmNyZWFzZSBvZiAxIGR5YWQsIGFuZCB0aGUgZWRnZSBkZW5zaXR5IGFsc28gaGFzIGluY3JlYXNlZCBzbGlnaHRseSB0b3dhcmRzIGEgbnVtYmVyIG9mIDAuMDUxLiBJbiB0aGUgbGFzdCB3YXZlLCB0aGVyZSBhcmUgMzggZHlhZHMgYW5kIHRoZSBlZGdlIGRlbnNpdHkgaGFzIGluY3JlYXNlZCB0byAwLjA3Mi4gUmVnYXJkaW5nIHRoZSB0cmlhZCBjZW5zdXMgW0BkYXZpczE5NjdzdHJ1Y3R1cmVdLCB0aGVyZSBhcmUgZmlyc3QgMTAgYW5kIHRoZW4gMTEgY29tcGxldGUgdHJpYWRzLCBhbmQgZmlyc3QgYSBkZWNyZWFzZSBhbmQgdGhlbiBhbiBpbmNyZWFzZSBvZiB0cmlhZHMgd2l0aCBvbmUgY2VudHJhbCBub2RlLiBTdGlsbCwgdGhlIHRyaWFkIDAwMyAod2l0aCAzIG51bGwgcmVsYXRpb25zKSBvY2N1cnMgbW9zdC4gQWxsIGluIGFsbCwgdGhlIGNvLXB1YmxpY2F0aW9ucyB3aXRoaW4gdGhlIG5ldHdvcmsgb2Ygc29jaW9sb2d5IGhhdmUgaW5jcmVhc2VkLCBhbmQgb3ZlciB0aGUgeWVhcnMsIHRoZSBzY2llbnRpc3RzIGF0IHRoZSBkZXBhcnRtZW50IGhhdmUgdXNlZCBtb3JlIG9mIHRoZWlyIG9wcG9ydHVuaXRpZXMgdG8gY29sbGFib3JhdGUgd2l0aCBtZW1iZXJzIHdpdGhpbiB0aGUgbmV0d29yay4gCgpgYGB7cn0KaWdyYXBoOjp0cmFuc2l0aXZpdHkoc25ldDFfZykKaWdyYXBoOjp0cmFuc2l0aXZpdHkoc25ldDJfZykKaWdyYXBoOjp0cmFuc2l0aXZpdHkoc25ldDNfZykKYGBgCgpMYXN0IGJ1dCBub3QgbGVhc3QsIHRoZSB0cmFuc2l0aXZpdHkgZWZmZWN0IHNob3dzIHdoZXRoZXIgY28tYXV0aG9ycyBvZiBjby1hdXRob3JzIGJlY29tZSBjby1hdXRob3JzLiAKRm9yIHRoaXMgbmV0d29yaywgbm8gbGluZWFyIGNoYW5nZSBjYW4gYmUgb2JzZXJ2ZWQuIApJbiB0aGUgZmlyc3Qgd2F2ZSwgdGhlcmUgaXMgYQp0cmFuc2l0aXZpdHkgbnVtYmVyIG9mIDAuMjcuIElmIG9uZSBzdGFmZiBtZW1iZXIgQSBpcyBjb25uZWN0ZWQgdG8gc3RhZmYKbWVtYmVyIEIgYW5kIHN0YWZmIG1lbWJlciBDLCB0aGUgcHJvYmFiaWxpdHkgaXMgMC4yNyB0aGF0IHN0YWZmIG1lbWJlciBCCmFuZCBDIHdpbGwgYWxzbyBjby1wdWJsaXNoLiBJbiB0aGUgc2Vjb25kIHdhdmUsIHdlIHNlZSB0aGF0IHRoaXMKcHJvYmFiaWxpdHkgaGFzIGV2ZW4gaW5jcmVhc2VkIHRvIDAuMzA4LiBJbiB0aGUgbGFzdCB3YXZlLCB0aGUKdHJhbnNpdGl2aXR5IG51bWJlciBpcyB0aGUgbG93ZXN0LiBQb3NzaWJseSwgdGhlIGZhY3QgdGhhdCB0aGVyZSBhcmUgbW9yZSBtZWJlcnMgaW4gdGhlIG5ldHdvcmtzIGNvdWxkIGluY3JlYXNlIHRoZSBvcHBvcnR1bml0aWVzIHRvIGNvLXB1Ymxpc2ggd2l0aCBvdGhlcnMsIG5vdCBkZXBlbmRpbmcgb24gY28tYXV0aG9ycyBvZiBjby1hdXRob3JzLiAKCiMjIEstaW5kZXggYXQgdGhlIFNvY2lvbG9neSBkZXBhcnRtZW50CgpgYGB7ciwgZWNobz1GQUxTRX0KbG9hZCgiL1VzZXJzL2FudXNjaGthL0RvY3VtZW50cy9sYWJqb3VybmFsL2RhdGEvc29jZGVmX2RmLlJEYXRhIikKYGBgCgpgYGB7cn0KdHdzb2NiYXIgPC0gZ2dwbG90Mjo6OmdncGxvdChzb2NkZWZfZGYsIGFlcyhmYWN0b3IodHdpdHRlcl9kdW0pLCBmaWxsID0gZmFjdG9yKHR3aXR0ZXJfZHVtKSkpICsgZ2VvbV9iYXIoKQp0d3NvY2JhciA8LSB0d3NvY2JhciArIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcz1jKCIjNTZCNEU5IiwgIiM2NmZmOTkiKSkKZ2dwbG90bHkodHdzb2NiYXIpCmBgYApCZWZvcmUgZGl2aW5nIGludG8gdGhlIGstaW5kZXgsIGl0IGlzIGluc2lnaHRmdWwgdG8gc2VlIGhvdyBtYW55IG9mIHRoZSBzY2llbnRpc3QgYXQgdGhlIGRlcGFydG1lbnQgb2YgU29jaW9sb2d5IGhhdmUgVHdpdHRlci4gSW4gdGhlIGFib3ZlIChpbnRlcmFjdGl2ZSkgZ3JhcGgsIGl0IGlzIHNob3duIHRoYXQgMTMgc2NpZW50aXN0IGRvIG5vdCBoYXZlIFR3aXR0ZXIsIHdoaWxlIDIwIHNjaWVudGlzdHMgZG8gaGF2ZSBUd2l0dGVyLiAKCmBgYHtyfQpzZWwgPC0gc29jZGVmX2RmJHR3aXR0ZXJfZHVtPT0xCmhpc3Qoc29jZGVmX2RmJGtpW3NlbF0sIGNvbD0ibGlnaHRibHVlIiwgYm9yZGVyPSJkYXJrYmx1ZSIpCmBgYAoKVGhlIGFib3ZlIGhpc3RvZ3JhbSBzaG93cyB0aGUgZGlzdHJpYnV0aW9uIG9mIHRoZSBrLWluZGV4IG9mIHNjaWVudGlzdHMgYXQgdGhlIFNvY2lvbG9neSBkZXBhcnRtZW50LiBUaGUgZGlzdHJpYnV0aW9uIGlzIHJpZ2h0LXNrZXdlZDogTW9zdCBzY2llbnRpc3RzIGhhdmUgYSBrLWluZGV4IGJldHdlZW4gMCBhbmQgMiwgYW5kIGEgZmV3IHNjaWVudGlzdHMgaGF2ZSBhIGhpZ2ggaW5kZXguIEEgZmV3IHN0YWZmIG1lbWJlcnMgaGF2ZSBhIGstaW5kZXggdGhhdCB3b3VsZCBiZSBjYXRlZ29yaXplZCBhcyAiS2FyZGFzaGlhbiBTY2llbnRpc3QiIChIYWxsLCAyMDE0KQoKYGBge3J9Cm1vZGVsa2kgPC0gbG0oa2kgfiBnZW5kZXIgKyBkdXRjaCArIHB1Yl9maXJzdCwgZGF0YT1zb2NkZWZfZGYpCnN1bW1hcnkobW9kZWxraSkKYGBgCkxhc3RseSwgaXQgaXMgaW5zaWdodGZ1bCB0byBzZWUgdG8gd2hhdCBleHRlbnQgdGhlIGstaW5kZXggaXMgcHJlZGljdGVkIGJ5IG90aGVyIGZhY3RvcnMuIFRoZSBhYm92ZSBsaW5lYXIgcmVncmVzc2lvbiB0ZWFjaGVzIHVzIHRoYXQgbWFsZSBzY2llbnRpc3Qgb2YgU29jaW9sb2d5IGhhdmUgYQpzaWduaWZpY2FudGx5IGhpZ2hlciBrLWluZGV4IHRoYW4gZmVtYWxlIHN0YWZmIG1lbWJlcnMuIEl0IGlzIGFsc28gdmlzaWJsZSB0aGF0CkR1dGNoIHNjaWVudGlzdHMgaGF2ZSBhIHNpZ25pZmljYW50bHkgbG93ZXIgay1pbmRleCB0aGFuIG5vbi1EdXRjaCBzY2llbnRpc3RzLiBMYXN0bHksIGFnZSBpcyBzaWduaWZpY2FudGx5IHJlbGF0ZWQgdG8gdGhlIGstaW5kZXg6IGFzIGFnZQpkZWNyZWFzZXMsIHRoZSBrLWluZGV4IGluY3JlYXNlcy4gWW91bmdlciBpbmRpdmlkdWFscyB0aHVzIGhhdmUgYSBoaWdoZXIgay1pbmRleAp0aGFuIG9sZGVyIGluZGl2aWR1YWxzLiBUaGVzZSBlZmZlY3RzIGNhbiBhbHNvIGJlIHNlZW4gaW4gdGhlIChpbnRlcmFjdGl2ZSkgZ3JhcGggYmVsb3cuIAoKYGBge3J9CnJlZ3Bsb3Rzb2MgPC0gZ2dwbG90KHNvY2RlZl9kZiwgbWFwcGluZyA9IGFlcyh4ID0gcHViX2ZpcnN0LCB5ID0ga2ksIGNvbG9yPWdlbmRlcikpICsKICAgIGdlb21fbGluZSgpIAogCmdncGxvdGx5KHJlZ3Bsb3Rzb2MpCmBgYAoKIyBEYXRhIHNjaWVuY2UKCmBgYHtyLCBlY2hvPUZBTFNFfQojbG9hZCBkYXRhb2JqZWN0cwpsb2FkKCIvVXNlcnMvYW51c2Noa2EvRG9jdW1lbnRzL2xhYmpvdXJuYWwvZGF0YS9kYXRhX25ldF9hcnJheS5SRGF0YSIpCmxvYWQoIi9Vc2Vycy9hbnVzY2hrYS9Eb2N1bWVudHMvbGFiam91cm5hbC9kYXRhL2RhdGFkZWZfZGYuUkRhdGEiKQpgYGAKCmBgYHtyfQpkbmV0MSA8LSBkbmV0X2FycmF5WyAsLCAxXQpkbmV0MiA8LSBkbmV0X2FycmF5WyAsLCAyXQpkbmV0MyA8LSBkbmV0X2FycmF5WyAsLCAzXQpgYGAKCmBgYHtyfQpkaWFnKGRuZXQxKSA8LSAwCmRpYWcoZG5ldDIpIDwtIDAKZGlhZyhkbmV0MykgPC0gMApgYGAKCiMjIFBsb3RzIG9mIHRoZSBEYXRhIFNjaWVuY2UgZGVwYXJ0bWVudAoKYGBge3J9CmRuZXQxX2cgPC0gaWdyYXBoOjpncmFwaF9mcm9tX2FkamFjZW5jeV9tYXRyaXgoZG5ldDEsIG1vZGUgPSBjKCJ1bmRpcmVjdGVkIikpCmRuZXQyX2cgPC0gaWdyYXBoOjpncmFwaF9mcm9tX2FkamFjZW5jeV9tYXRyaXgoZG5ldDIsIG1vZGUgPSBjKCJ1bmRpcmVjdGVkIikpCmRuZXQzX2cgPC0gaWdyYXBoOjpncmFwaF9mcm9tX2FkamFjZW5jeV9tYXRyaXgoZG5ldDMsIG1vZGUgPSBjKCJ1bmRpcmVjdGVkIikpCgpkYXRhZGVmX2RmJHR3aXRjb2wgPC0gaWZlbHNlKGRhdGFkZWZfZGYkdHdpdHRlcl9kdW0gPT0gMCwgIiM1NkI0RTkiLCAiIzY2ZmY5OSIpCgojRGl0IHpvdSBpayBub2cgZXZlbiBtb2V0ZW4gY2hlY2tlbiBvZiBkaXQga2xvcHQsIHdhbnQgZXIgbGlqa2VuIGluZWVucyB0aWVzIHdlZyB0ZSB2YWxsZW4gZG9vciBkaWUgY2/DtnJkaW5hdGVuIHRvZSB0ZSB2b2VnZW4/CiMgbCA8LSBpZ3JhcGg6OmxheW91dF93aXRoX21kcyhzbmV0MV9nKQojIGxbMTQsMV0gPC0gMAojIGwxIDwtIGlncmFwaDo6bGF5b3V0X3dpdGhfbWRzKHNuZXQyX2cpCiMgbDFbMTQsMV0gPC0gMAojIGwyIDwtIGlncmFwaDo6bGF5b3V0X3dpdGhfbWRzKHNuZXQzX2cpCiMgbDJbMTQsMV0gPC0gMAoKI1dhdCB3aWwgaWsgbWV0IGRlIG51bW1lcnMgaW4gZGUgcGxvdCwgbW9ldCBpayBkaWUgbm9nIHZlcmFuZGVyZW4gaW4gbmFtZW4/IE1hYXIgd2lsIGhldCBncmFhZyBhbm9uaWVtIGhvdWRlbi4KcGxvdChkbmV0MV9nLCB2ZXJ0ZXguY29sb3IgPSBkYXRhZGVmX2RmJHR3aXRjb2wsIHZlcnRleC5zaXplPWRhdGFkZWZfZGYka2ksICB2ZXJ0ZXguc2l6ZSA9IDEwLCB2ZXJ0ZXguZnJhbWUuY29sb3IgPSAiZ3JheSIsCiAgICB2ZXJ0ZXgubGFiZWwuY29sb3IgPSAiYmxhY2siLCB2ZXJ0ZXgubGFiZWwuZmFtaWx5ID0gIkhlbHZldGljYSIsIHZlcnRleC5sYWJlbC5jZXggPSAwLjcsIHZlcnRleC5sYWJlbC5kaXN0ID0gMC44LAogICAgZWRnZS5jdXJ2ZWQgPSAwLjIsIGVkZ2UuYXJyb3cuc2l6ZSA9IDAuNSkKcGxvdChkbmV0Ml9nLCB2ZXJ0ZXguY29sb3IgPSBkYXRhZGVmX2RmJHR3aXRjb2wsIHZlcnRleC5zaXplPWRhdGFkZWZfZGYka2ksICB2ZXJ0ZXguc2l6ZSA9IDEwLCB2ZXJ0ZXguZnJhbWUuY29sb3IgPSAiZ3JheSIsCiAgICB2ZXJ0ZXgubGFiZWwuY29sb3IgPSAiYmxhY2siLCB2ZXJ0ZXgubGFiZWwuZmFtaWx5ID0gIkhlbHZldGljYSIsIHZlcnRleC5sYWJlbC5jZXggPSAwLjcsIHZlcnRleC5sYWJlbC5kaXN0ID0gMC44LAogICAgZWRnZS5jdXJ2ZWQgPSAwLjIsIGVkZ2UuYXJyb3cuc2l6ZSA9IDAuNSkKcGxvdChkbmV0M19nLCB2ZXJ0ZXguY29sb3IgPSBkYXRhZGVmX2RmJHR3aXRjb2wsIHZlcnRleC5zaXplPWRhdGFkZWZfZGYka2ksICB2ZXJ0ZXguc2l6ZSA9IDEwLCB2ZXJ0ZXguZnJhbWUuY29sb3IgPSAiZ3JheSIsCiAgICB2ZXJ0ZXgubGFiZWwuY29sb3IgPSAiYmxhY2siLCB2ZXJ0ZXgubGFiZWwuZmFtaWx5ID0gIkhlbHZldGljYSIsIHZlcnRleC5sYWJlbC5jZXggPSAwLjcsIHZlcnRleC5sYWJlbC5kaXN0ID0gMC44LAogICAgZWRnZS5jdXJ2ZWQgPSAwLjIsIGVkZ2UuYXJyb3cuc2l6ZSA9IDAuNSkKCmBgYAoKSW4gdGhlIG5ldHdvcmsgcGxvdHMgb2YgRGF0YSBTY2llbmNlLCBpdCBzaG93cyB0aGF0IGR1cmluZyB0aGUgeWVhciAyMDE2LTIwMTcgdGhlcmUgd2VyZSBub3QgbWFueSBjby1wdWJsaWNhdGlvbnMuIEp1c3QgbGlrZSBhdCB0aGUgU29jaW9sb2d5IGRlcGFydG1lbnQsIGl0IGlzIGxpa2VseSB0aGF0IGEgaGlnaCBudW1iZXIgb2Ygc2NpZW50aXN0cyBkaWQgbm90IHdvcmsgYXQgdGhlIGRlcGFydG1lbnQgeWV0LiBJbiB0aGUgeWVhcnMgMjAxOC0yMDE5LCB0aGVyZSBpcyBhIHN0cm9uZyBpbmNyZWFzZSBpbiB0aGUgY28tcHVibGljYXRpb25zIG9mIHRoZSBzdGFmZiBtZW1iZXJzIG9mIERhdGEgU2NpZW5jZS4gTm9kZSAxLCAzIGFuZCA1IHNlZW0gdG8gaGF2ZSBhIGNlbnRyYWwgcm9sZSBpbiB0aGUgbmV0d29yaywgd2l0aCB0aGUgaGlnaGVzdCBudW1iZXIgb2YgZWRnZXMsIGFuZCB0aHVzIHRoZSBtb3N0IGNvLXB1bGljYXRpb25zIHdpdGggb3RoZXIgc2NpZW50aXN0cyB3aXRoaW4gdGhlIGRlcGFydG1lbnQuIApJbiB0aGUgbGFzdCBwbG90LCBhZ2FpbiBhbiBpbmNyZWFzZSBpbiBjby1wdWJsaWNhdGlvbnMgaXMgdmlzaWJsZS4gTm9kZSAxLCAzCmFuZCA1IHN0aWxsIGhhdmUgYSBjZW50cmFsIHJvbGUgaW4gdGhlIG5ldHdvcmssIGJ1dCB0aGVyZSBub3cgYXJlIG90aGVyCm5vZGVzIHdpdGggYSByZWxhdGl2ZSBoaWdoIG51bWJlciBvZiBjby1wdWJsaWNhdGlvbnMgYXMgd2VsbC5TaW1pbGFybHkgdG8gdGhlIFNvY2lvbG9neSBkZXBhcnRtZW50LCB0aGVyZSBhcmUgb25seSBhIGZldyBub2RlcyB3aXRoIGEgaGlnaCBrLWluZGV4IChzaG93biBieSB0aGUgbGFyZ2VzdCB2ZXJ0ZXggc2l6ZSksIGFuZCBpdCBkb2VzIG5vdCBzZWVtIGFzIGlmIHRoZXNlIHNjaWVudGlzdHMgYXJlIGVzcGVjaWFsbHkgYXR0cmFjdGl2ZSB0byBvdGhlcnMgdG8gY28tcHVibGlzaCBhbiBhcnRpY2xlLiAKCiMjIERlc2NyaXB0aXZlcyBvZiB0aGUgRGF0YSBTY2llbmNlIG5ldHdvcmsKYGBge3J9CmRkZWdyZWUxIDwtIGlncmFwaDo6ZGVncmVlKGRuZXQxX2cpCmhpc3QoZGRlZ3JlZTEsIGNvbD0icHVycGxlIikKZGRlZ3JlZTIgPC0gaWdyYXBoOjpkZWdyZWUoZG5ldDJfZykKaGlzdChkZGVncmVlMiwgY29sPSJwdXJwbGUiKQpkZGVncmVlMyA8LSBpZ3JhcGg6OmRlZ3JlZShkbmV0M19nKQpoaXN0KGRkZWdyZWUzLCBjb2w9InB1cnBsZSIpCmBgYApTaW1pbGFybHkgdG8gU29jaW9sb2d5LCB0aGUgRGF0YSBTY2llbmNlIGRlcGFydG1lbnQgc2hvd3MgYSByaWdodC1za2V3ZWQgZGlzdHJpYnV0aW9uIG9mIHRoZSBkZWdyZWVzLiAKSW4gdGhlIGZpcnN0IHdhdmUsIG1vc3Qgc2NpZW50aXN0cyBoYWQgbm90IGNvLXB1Ymxpc2hlZCwgb3Igb25seSBsaXR0bGUuIEluIHRoZSBoaXN0b2dyYW0gb2YgdGhlIHNlY29uZCB3YXZlLCBpdCBjYW4gYmUgb2JzZXJ2ZWQgdGhhdCB0aGUgZGVncmVlcyByZW1haW4gc2tld2VkIHRvIHRoZSByaWdodC4gRnVydGhlcm1vcmUsIGl0IGlzIHZpc2libGUgdGhhdCBvbmUgc2NpZW50aXN0IGhhcyBtb3JlIHRoYW4gOCBjb3B1YmxpY2F0aW9ucywgYW5kIHRoYXQgaW4gZ2VuZXJhbCwgdGhlIG51bWJlciBvZiBvdXRkZWdyZWVzIGluY3JlYXNlZC4gSG93ZXZlciwgbW9zdCBpbmRpdmlkdWFscyBzdGlsbCBoYXZlIG5vIGNvLXB1YmxpY2F0aW9ucy4gSW4gdGhlIGxhc3QgaGlzdG9ncmFtLCBtb3JlIHNjaWVudGlzdHMgYXJlIGluIHRoZSB0YWlsLCBhcyBhbHNvIG9ic2VydmVkIGF0IHRoZSBTb2Npb2xvZ3kgZGVwYXJ0bWVudC4gRnVydGhlcm1vcmUsIHRoZXJlIGFyZSBldmVuIHN0YWZmIHNjaWVudGlzdCB3aXRoIDEwLTExIGNvcHVibGljYXRpb25zLiBUaGlzIGlzIGEgaGlnaGVyIG51bWJlciBvZiBjb3B1YmxpY2F0aW9ucyB0aGFuIG9ic2VydmVkIGF0IHRoZSBTb2Npb2xvZ3kgZGVwYXJ0bWVudC4KCmBgYHtyfQppZ3JhcGg6OmR5YWQuY2Vuc3VzKGRuZXQxX2cpCmlncmFwaDo6dHJpYWQuY2Vuc3VzKGRuZXQxX2cpCmlncmFwaDo6ZWRnZV9kZW5zaXR5KGRuZXQxX2cpCgppZ3JhcGg6OmR5YWQuY2Vuc3VzKGRuZXQyX2cpCmlncmFwaDo6dHJpYWQuY2Vuc3VzKGRuZXQyX2cpCmlncmFwaDo6ZWRnZV9kZW5zaXR5KGRuZXQyX2cpCgppZ3JhcGg6OmR5YWQuY2Vuc3VzKGRuZXQzX2cpCmlncmFwaDo6dHJpYWQuY2Vuc3VzKGRuZXQzX2cpCmlncmFwaDo6ZWRnZV9kZW5zaXR5KGRuZXQzX2cpCgpgYGAKCkxvb2tpbmcgYXQgdGhlIGR5YWQgY2Vuc3VzIGFuZCBkZW5zaXR5LCB0aGUgbnVtYmVyIG9mIGR5YWRzIGluIDIwMTYtMjAxNyBjb3VudHMgMjIuIFRoZSBlZGdlIGRlbnNpdHkgaXMgMC4wMjEyLiBCb3RoIG9mIHRoZXNlIG51bWJlcnMgYXJlIGxvd2VyIHRoYW4gYXQgdGhlIFNvY2lvbG9neSBkZXBhcnRtZW50LiAKSW4gMjAxOC0yMDE5LCB0aGUgbnVtYmVyIG9mIGR5YWRzIGhhcyBpbmNyZWFzZWQgdG8gMzggYW5kIHRoZSBlZGdlCmRlbnNpdHkgaGFzIGluY3JlYXNlZCB0byAwLjAzNy4gVGhpcyBpcyBzdGlsbCBsb3dlciB0aGFuCnRoZSBlZGdlIGRlbnNpdHkgd2l0aGluIHRoZSBzb2Npb2xvZ3kgZGVwYXJ0bWVudCBpbiB0aGUgc2FtZSB5ZWFycy4gSW4gdGhlIGxhc3QgeWVhcnMsIHRoZXJlIGFyZSA3MCBkeWFkcyBhbmQgdGhlIGVkZ2UgZGVuc2l0eSBpbmNyZWFzZWQgdG93YXJkcyBhIG51bWJlciBvZiAwLjA2OC4gVGhpcyByZW1haW5zIGEgbGl0dGxlIGxvd2VyIHRoYW4gdGhlIGVkZ2UgZGVuc2l0eSBvZiB0aGUgU29jaW9sb2d5IGRlcGFydG1lbnQgYXQgdGhhdCB0aW1lLiBXaXRoIHJlZ2FyZCB0byB0aGUgdHJpYWRzLCB3ZSBzZWUgYSBzaW1pbGFyIHBhdHRlcm4gYXMgYXQgdGhlIFNvY2lvbG9neSBkZXBhcnRtZW50LiBIb3dldmVyLCB0aGVyZSBhcmUgbW9yZSBjb21wbGV0ZSB0cmlhZHMgYXQgRGF0YSBTY2llbmNlLCBhbmQgdGhpcyBudW1iZXIgaGFzIGluY3JlYXNlZCByYXRoZXIgc3Ryb25nbHkgb3ZlciB0aGUgeWVhcnMuCgpgYGB7cn0KaWdyYXBoOjp0cmFuc2l0aXZpdHkoZG5ldDFfZykKaWdyYXBoOjp0cmFuc2l0aXZpdHkoZG5ldDJfZykKaWdyYXBoOjp0cmFuc2l0aXZpdHkoZG5ldDNfZykKYGBgCgpSZWdhcmRpbmcgdGhlIHRyYW5zaXRpdml0eSwgdGhpcyBoYXMgZGVjcmVhc2VkIGF0IERhdGEgU2NpZW5jZSBvdmVyIHRoZSB5ZWFycy4gCkluIHRoZSBmaXJzdCBwZXJpb2QsIHRoZSBwcm9iYWJpbGl0eSB0aGF0IHNjaWVudGlzdCBCIGFuZCBDIC0gYm90aCBhcwpjby1hdXRob3JzIG9mIHNjaWVudGlzdCBBIC0gd291bGQgY28tcHVibGlzaCB3YXMgMC41Mi4gSW4gdGhlIG5leHQgeWVhciwgdGhpcwpkZWNyZWFzZWQgdG8gYSA0NSUgY2hhbmNlLCB3aGlsZSBpbiB0aGUgbGFzdCB5ZWFyIHRoaXMgY2hhbmNlIGlzIDQxLDIlLgpTdGlsbCwgdGhpcyBpcyBhIGhpZ2hlciBudW1iZXIgdGhhbiBvYnNlcnZlZCBhdCB0aGUgU29jaW9sb2d5CmRlcGFydG1lbnQuIEFsc28sIHRoZXJlIGlzIGEgbGluZWFyIGRlY3JlYXNlIGF0IHRoZSBkZXBhcnRtZW50IG9mIERhdGEKU2NpZW5jZSwgd2hpbGUgYXQgdGhlIFNvY2lvbG9neSBkZXBhcnRtZW50IG5vIGxpbmVhciB0cmVuZCBjb3VsZCBiZQpvYnNlcnZlZC4gSW4gY29uY2x1c2lvbiwgc3RhZmYgbWVtYmVycyBhdCBEYXRhIFNjaWVuY2UgYXJlIG1vcmUgbGlrZWx5CnRvIGNvLXB1Ymxpc2ggd2l0aCBjby1hdXRob3JzIG9mIHRoZWlyIGNvLWF1dGhvcnMgdGhhbiBhdCBTb2Npb2xvZ3ksIHdoaWNoIGlzIGluIGxpbmUgd2l0aCB0aGUgbGFyZ2VyIGluY3JlYXNlIGluIHRyaWFkcy4gCgojIyBLLWluZGV4IGF0IHRoZSBkZXBhcnRtZW50IG9mIERhdGEgU2NpZW5jZQoKYGBge3IsIGVjaG89RkFMU0V9CmxvYWQoIi9Vc2Vycy9hbnVzY2hrYS9Eb2N1bWVudHMvbGFiam91cm5hbC9kYXRhL2RhdGFkZWZfZGYuUkRhdGEiKQpgYGAKCmBgYHtyfQp0d2RhdGJhciA8LSBnZ3Bsb3QyOjo6Z2dwbG90KGRhdGFkZWZfZGYsIGFlcyhmYWN0b3IodHdpdHRlcl9kdW0pLCBmaWxsID0gZmFjdG9yKHR3aXR0ZXJfZHVtKSkpICsgZ2VvbV9iYXIoKQp0d2RhdGJhciA8LSB0d2RhdGJhciArIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcz1jKCIjNTZCNEU5IiwgIiM2NmZmOTkiKSkKZ2dwbG90bHkodHdkYXRiYXIpCmBgYApBdCB0aGUgRGF0YSBTY2llbmNlIGRlcGFydG1lbnQsIHRoZSBtYWpvcml0eSBvZiBzY2llbnRpc3QgaGFzIGEgVHdpdHRlciBhY2NvdW50OiAzMCBzY2llbnRpc3RzIGhhdmUgYSBUd2l0dGVyIGFjY291bnQgd2hpbGUgMTYgZG8gbm90IGhhdmUgb25lLiAgCgpgYGB7cn0Kc2VsMiA8LSBkYXRhZGVmX2RmJHR3aXR0ZXJfZHVtPT0xCmhpc3QoZGF0YWRlZl9kZiRraVtzZWwyXSwgY29sPSJyZWQiKQpgYGAKVGhlIGhpc3RvZ3JhbSBzaG93cyB0aGF0IGF0IHRoZSBEYXRhIFNjaWVuY2UgZGVwYXJ0bWVudCwgdGhlIGRpc3RyaWJ1dGlvbiBvZiB0aGUgay1pbmRleCBpcyBldmVuIG1vcmUgc2tld2VkIHRoYW4gYXQgdGhlIFNvY2lvbG9neSBkZXBhcnRtZW50LiBNb3N0IHNjaWVudGlzdCBoYXZlIGEgay1pbmRleCBiZXR3ZWVuIDAgYW5kIDEsIHdoaWxlIG9ubHkgYSBmZXcgc2NpZW50aXN0cyBoYXZlIGEgay1pbmRleCBoaWdoZXIgdGhhbiB0aGF0LiBBcHByb3hpbWF0ZWx5IHR3byBzY2llbnRpc3Qgd291bGQgYmUgY2F0ZWdvcml6ZWQgYXMgIkthcmRhc2hpYW4gU2NpZW50aXN0cyIgYnkgSGFsbCAoMjAxNCkKCgpgYGB7cn0KbW9kZWxraTIgPC0gbG0oa2kgfiBnZW5kZXIgKyBkdXRjaCArIHB1Yl9maXJzdCwgZGF0YT1kYXRhZGVmX2RmKQpzdW1tYXJ5KG1vZGVsa2kyKQpgYGAKCkF0IHRoZSBEYXRhIFNjaWVuY2UgZGVwYXJ0bWVudCwgdGhlIGstaW5kZXggaXMgcHJlZGljdGVkCmRpZmZlcmVudGx5IHRoYW4gYXQgdGhlIFNvY2lvbG9neSBkZXBhcnRtZW50IHdoZW4gbG9va2luZyBhdCB0aGUgbGluZWFyIHJlZ3Jlc3Npb24gYWJvdmUuIApGb3IgdGhlIERhdGEgU2NpZW5jZSBkZXBhcnRtZW50LCB0aGUgZWZmZWN0IG9mIGdlbmRlciBhbmQKZXRobmljaXR5IGFyZSBub3Qgc2lnbmlmaWNhbnQuIEFnZSBpcyBhIHNpZ25pZmljYW50IHByZWRpY3RvciBvZiB0aGUgay1pbmRleC4gVGhlIHlvdW5nZXIgdGhlIHNjaWVudGlzdCwgdGhlIGhpZ2hlciB0aGUgay1pbmRleC4gSW4gdGhlIChpbnRlcmFjdGl2ZSkgcGxvdCBiZWxvdywgaXQgaXMgYWxzbyB2aXNpYmxlIHRoYXQgZ2VuZGVyIGFuZCBhZ2UgYXJlIGxlc3NlciBkZXRlcm1pbmFudHMgb2YgdGhlIGstaW5kZXggdGhhbiBhdCB0aGUgU29jaW9sb2d5IGRlcGFydG1lbnQuIAoKYGBge3J9CiMgRGl0IG5vZyBiaWogYXNzaWduaW5nIGdlbmRlciBuZWVyemV0dGVuICh3ZWJzY3JhcGluZykKZGF0YWRlZl9kZiRnZW5kZXJbZGF0YWRlZl9kZiRpZD09MjYxXSA8LSAibWFsZSIKZGF0YWRlZl9kZiRnZW5kZXJbZGF0YWRlZl9kZiRpZD09MjczXSA8LSAibWFsZSIKCnJlZ3Bsb3RkYXQgPC0gZ2dwbG90KGRhdGFkZWZfZGYsIG1hcHBpbmcgPSBhZXMoeCA9IHB1Yl9maXJzdCwgeSA9IGtpLCBjb2xvcj1nZW5kZXIpKSArCiAgICBnZW9tX2xpbmUoKSAKIApnZ3Bsb3RseShyZWdwbG90ZGF0KQpgYGAKCiMgQ29tcGFyaXNvbiBvZiB0aGUgdHdvIGRlcGFydG1lbnRzCldoZW4gY29tcGFyaW5nIHRoZSB0d28gZGVwYXJ0bWVudHMsIHRoZXJlIGFyZSBzb21lIHRoaW5ncyB3b3J0aCBub3RpbmcuIFJlZ2FyZGluZyB0aGUgbmV0d29yayBzdHJ1Y3R1cmUsIHRoZSBkZW5zaXR5IG9mIHRoZSBjby1wdWJsaWNhdGlvbiBuZXR3b3JrIG9mIFNvY2lvbG9neSBpcyBoaWdoZXIgdGhhbiB0aGF0IG9mIHRoZSBEYXRhIFNjaWVuY2UgZGVwYXJ0bWVudC4gV2l0aGluIFNvY2lvbG9neSwgc2NpZW50aXN0cyB0aHVzIGNvLXB1Ymxpc2ggbW9yZSB3aXRoIG90aGVycyBvZiB0aGUgc2FtZSBkZXBhcnRtZW50LCBidXQgYXQgYm90aCBjYXNlcyB0aGUgZGVuc2l0eSBpcyBsb3cuIFRoaXMgc2hvd3MgdGhhdCBhdCBib3RoIGRlcGFydG1lbnRzIHRoZSBjby1wdWJsaWNhdGlvbiBuZXR3b3JrIGlzIHJhdGhlciBzcGFyc2UuIFRoaXMgaXMgbm90IHN0cmFuZ2UsIGFzIHdpdGhpbiBhY2FkZW1pYSBpdCBpcyBub3QgYWx3YXlzIHBvc3NpYmxlIHRvIGNvLXB1Ymxpc2ggd2l0aCBhbnkgc2NpZW50aXN0IGluIHRoZSBuZXR3b3JrLCBhcyB0aGV5IG1pZ2h0IGhhdmUgZGlmZmVyZW50IHJlc2VhcmNoIGludGVyZXN0cy4gVGhlIHRyYW5zaXRpdml0eSBkaWZmZXJzIGFzIHdlbGwgYmV0d2VlbiB0aGUgdHdvIGRlcGFydG1lbnRzLiBUaGUgdHJhbnNpdGl2aXR5IGlzIGhpZ2hlciBhdCBEYXRhIFNjaWVuY2UgdGhhbiBhdCBTb2Npb2xvZ3kuIFRoaXMgc2lnbmFscyB0aGF0IGl0IGlzIG1vcmUgY29tbW9uIGFtb25nIERhdGEgU2NpZW50aXN0cyB0byBwdWJsaXNoIGFydGljbGVzIHdpdGggY28tYXV0aG9ycyBvZiBjby1hdXRob3JzLiAKCldpdGggcmVnYXJkIHRvIFR3aXR0ZXIgYW5kIHRoZSBrLWluZGV4LCB0aGUgZGVzY3JpcHRpdmVzIHNob3cgdGhhdCBhdCBib3RoIGRlcGFydG1lbnRzLCB0aGUgbWFqb3JpdHkgaGFzIGEgVHdpdHRlciBhY2NvdW50LiBBdCB0aGUgRGF0YSBTY2llbmNlIGRlcGFydG1lbnQsIG1vc3Qgc2NpZW50aXN0cyBoYXZlIGEgdmVyeSBsb3cgay1pbmRleCB3aXRoIHNvbWUgZXhjZXB0aW9ucywgd2hpbGUgYXQgdGhlIFNvY2lvbG9neSBkZXBhcnRtZW50IHRoZXJlIGFyZSBhIGZldyBtb3JlIHNjaWVudGlzdHMgd2l0aCBhIGstaW5kZXggYWJvdmUgMS4gVGhpcyBjb3VsZCBzaG93IHRoYXQgZm9yIFNvY2lvbG9naXN0cywgVHdpdHRlciBhY3Rpdml0eSBtYXkgYmUgY29uc2lkZXJlZCBhcyBtb3JlIGltcG9ydGFudCB0aGFuIGZvciBEYXRhIFNjaWVudGlzdHMsIGFuZCBmb3IgU29jaW9sb2dpc3RzIHRoZSBhY3R1YWwgc2NpZW50aWZpYyBvdXRwdXQgaW4gdGVybXMgb2YgYXJ0aWNsZXMgbWlnaHQgYmUgbGVzcyBpbXBvcnRhbnQuIFBvc3NpYmx5LCB0aGlzIGNvdWxkIGJlIGV4cGxhaW5lZCBieSB0aGUgZmFjdCB0aGF0IFNvY2lvbG9naXN0cyB3b3VsZCBsaWtlIHRvIGVuZ2FnZSB3aXRoIHNvY2lldHkgdG8gc2hhcmUgdGhlaXIgcmVzZWFyY2gsIGFzIHRoaXMgc29jaWV0eSBpcyBvZnRlbiB0aGUgcmVzZWFyY2ggdG9waWMuIEhvd2V2ZXIsIGZvciBib3RoIGRlcGFydG1lbnRzLCB0aGVyZSBhcmUgbm8gY2xlYXIgaGludHMgdGhhdCB0aGVzZSBzY2llbnRpc3RzIHdpdGggYSBoaWdoIGstaW5kZXggaGF2ZSBtb3JlIG9yIGxlc3MgY28tcHVibGljYXRpb25zIHRoYW4gc2NpZW50aXN0cyB3aXRoIGEgbG93ZXIgay1pbmRleC4gCg==