This is now on: https://rpubs.com/friendly/propensity

In his 1831 Research on the Propensity for Crime and Different Ages, Quetelet presents the data below as Table 13 (p. 57) giving the numbers of men and women accused of crime according to age groups, and then measures of “degrees of the propensity for crime”.

table13 <- read_table("https://www.dropbox.com/s/shi1g3hx1z34i8o/Quetelet-table13.dat?raw=1", 
                      show_col_types = FALSE)
table13
## # A tibble: 14 x 8
##    age_gp m_acc w_acc   w_m prop_all prop_m prop_w calculated
##    <chr>  <dbl> <dbl> <dbl>    <dbl>  <dbl>  <dbl>      <dbl>
##  1 <16      438    82   187     0.02   0.02   0.02       0.02
##  2 16-21   3901   726   186     0.76   0.79   0.64       0.66
##  3 21-25   3762   845   225     1      1      0.98       1   
##  4 25-30   4260  1017   239     0.97   0.96   1          0.92
##  5 30-35   3254   782   240     0.81   0.8    0.83       0.81
##  6 35-40   2105   621   295     0.59   0.56   0.75       0.71
##  7 40-45   1831   468   256     0.55   0.54   0.6        0.6 
##  8 45-50   1357   363   267     0.46   0.44   0.51       0.51
##  9 50-55    896   203   227     0.33   0.33   0.33       0.42
## 10 55-60    555   113   204     0.24   0.24   0.22       0.34
## 11 60-65    445    97   218     0.24   0.24   0.23       0.27
## 12 65-70    230    45   196     0.16   0.17   0.14       0.21
## 13 70-80    163    38   233     0.12   0.12   0.12       0.12
## 14 >80       18     1    56     0.05   0.06   0.01       0.04

He presents the plot below of the calculated column against age (Fig. 4, Pl III): The first question is, how did he calculate this?

Variables

The variables in this table are:

Variable description
age_gp age group
m_acc number of men accused, 1826-1827
w_acc number of women accused
w_m number of women for 1000 men
prop_all degrees of propensity for crime: in general
prop_m … men
prop_w … women
calculated … calculated by the formula

Quetelet’s formula

He says (p. 57), “The last column offers results calculated by this very simple empirical formula”:

\[ Y = (1 - \sin{X})\frac{1}{1 + m} \quad\quad\mbox{ supposing }\quad\quad m = \frac{1}{2^X - 18}\]

Quetelet’s graph

First, make a numeric variable,age using midpoints of the age intervals, mostly of width 5:

table13$age_gp
##  [1] "<16"   "16-21" "21-25" "25-30" "30-35" "35-40" "40-45" "45-50" "50-55"
## [10] "55-60" "60-65" "65-70" "70-80" ">80"
# make a quantitative age variable
age <- c(14, 18, 23, 27, 32, 37, 42, 47, 52, 57, 62, 67, 75, 82)
table13 <- cbind(age, table13)

I’ll plot both the data propensity variable, prop_all, so transform the data to a long format:

#' transform to long
table13 |>
  select(-c(age_gp, m_acc, w_acc, w_m)) |>
  gather(prop_all:calculated, 
         key = "measure", 
         value = "propensity")              -> table13_long

Plot the overall propensity and the calculated one, reproducing Quetelet’s graph. Quetelet notes that propensity crime reaches a peak around 25 years of age.

I’m plotting the data points as well as loess smoothed curves because Quetelet obviously did some smoothing. He that the calculated curve matches the data, at least approximately. We can see that it matches quite well up to age 30, but not in the higher age groups.

#' Reproduce Quetelet's graph
table13_long |>
  filter(measure %in% c("prop_all", "calculated")) |>
  ggplot(
       aes(x=age, y=propensity, color=measure)) +
  geom_smooth(method="loess", formula = y~x, se=FALSE, size=1.25) +
  geom_point(size = 1.5) + 
  labs(x = "Age",
       y = "Propensity to Crime",
       color = "Curve") +
  scale_color_manual(labels = c("calculated", "data"),
                     values = c("blue", "red")) +
  theme_bw(base_size = 16) +
  theme(legend.position = c(0.75, 0.75))

Quetelet’s formula

I don’t understand how his calculated variable comes from the formula. He says:

It is necessary to take, as one sees, for the axis of the abscissas, the quarter of the circumference rectified and divided according to decimal division.

I don’t see how this is reflected in the formula. A plot of what this formula against age gives an expected sinusoid, with a period that expands with age:

m <- 1/ (2^age - 18)
formula <- 1 - (sin(age) / (1+m))


plot(age, formula,
     type = "b")

However, a plot of the formula against his calculated values is perplexing:

par(xpd = TRUE)
plot(table13$calculated, formula, 
     type = "b",
     xlab = "Quetelet calculated")
text(x = table13$calculated,
     y = formula,
     labels = age, pos = 3)

An answer

A kind reader of StackOverflow pointed out that (a) the parentheses in my formula were wrong, and (b) Quetelet probably used radians. With this, I get:

m <- 1/ (2^age - 18)
formula <- 1 - (sin(age * pi / 180)) / (1+m)  # radians

plot(age, formula,
     type = "b")

The graph now looks reasonable, except for the two lowest points:

par(xpd = TRUE)
plot(table13$calculated, formula, 
     type = "b",
     xlab = "Quetelet calculated")
text(x = table13$calculated,
     y = formula,
     labels = age, pos = 3)

Propensities

A second puzzle is the question of how Quetelet calculated the “degrees of propensity” in Table 13. The data is provided in his Table 12:

table12 <- read_csv("https://www.dropbox.com/s/pca1k5aqhx48iuv/Quetelet-table12.csv?raw=1", 
                    show_col_types = FALSE)
head(table12)
## # A tibble: 6 x 6
##   age_gp pers_crime prop_crime pct_prop population propensity
##   <chr>       <dbl>      <dbl>    <dbl>      <dbl>      <dbl>
## 1 <16            80        440       85       3304        161
## 2 16-21         904       3723       80        887       5217
## 3 21-25        1278       3329       72        673       6846
## 4 25-30        1575       3702       70        791       6671
## 5 30-35        1153       2883       71        732       5514
## 6 35-40         650       2076       76        672       4057

This records the number of crimes against persons (pers_crime) and of crimes against property (prop_crime) committed in France by both sexes in the years 1826-1829. The fourth column (pct_prop) is the percent of crimes against property out of 100 crimes of both types.

The column population, headed “Population according to ages” indicates “how a population of 10,000 souls is divided up in France according to ages. Of the last column (propensity), he says this:

indicates the relationship of the total number of crimes to the corresponding number in the preceeding column

The question is how this relates to the column prop_all in Table 13.

LS0tDQp0aXRsZTogIlF1ZXRlbGV0J3MgUHJvcGVuc2l0eSBQdXp6bGVzIg0KYXV0aG9yOiAiTWljaGFlbCBGcmllbmRseSINCmRhdGU6ICI0LzE3LzIwMjIiDQpvdXRwdXQ6DQogIGh0bWxfZG9jdW1lbnQ6DQogICAgdGhlbWU6IHJlYWRhYmxlDQogICAgY29kZV9kb3dubG9hZDogdHJ1ZQ0KLS0tDQoNClRoaXMgaXMgbm93IG9uOiBodHRwczovL3JwdWJzLmNvbS9mcmllbmRseS9wcm9wZW5zaXR5DQoNCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFLCB3YXJuaW5nID0gRkFMU0UpDQpsaWJyYXJ5KHJlYWRyKQ0KbGlicmFyeSh0aWR5cikNCmxpYnJhcnkoZHBseXIpDQpsaWJyYXJ5KGdncGxvdDIpDQpgYGANCg0KSW4gaGlzIDE4MzEgX1Jlc2VhcmNoIG9uIHRoZSBQcm9wZW5zaXR5IGZvciBDcmltZSBhbmQgRGlmZmVyZW50IEFnZXNfLCBRdWV0ZWxldCBwcmVzZW50cyB0aGUgZGF0YSBiZWxvdyBhcyBUYWJsZSAxMyAocC4gNTcpDQpnaXZpbmcgdGhlIG51bWJlcnMgb2YgbWVuIGFuZCB3b21lbiBhY2N1c2VkIG9mIGNyaW1lIGFjY29yZGluZyB0byBhZ2UgZ3JvdXBzLCBhbmQgdGhlbiBtZWFzdXJlcyBvZiAiZGVncmVlcyBvZiB0aGUgcHJvcGVuc2l0eSANCmZvciBjcmltZSIuDQoNCmBgYHtyIHRhYjEzfQ0KdGFibGUxMyA8LSByZWFkX3RhYmxlKCJodHRwczovL3d3dy5kcm9wYm94LmNvbS9zL3NoaTFnM2h4MXozNGk4by9RdWV0ZWxldC10YWJsZTEzLmRhdD9yYXc9MSIsIA0KICAgICAgICAgICAgICAgICAgICAgIHNob3dfY29sX3R5cGVzID0gRkFMU0UpDQp0YWJsZTEzDQpgYGANCg0KSGUgcHJlc2VudHMgdGhlIHBsb3QgYmVsb3cgb2YgdGhlIGBjYWxjdWxhdGVkYCBjb2x1bW4gYWdhaW5zdCBhZ2UgKEZpZy4gNCwgUGwgSUlJKToNClRoZSBmaXJzdCBxdWVzdGlvbiBpcywgaG93IGRpZCBoZSBjYWxjdWxhdGUgdGhpcz8NCg0KIVtdKHByb3BlbnNpdHktdG8tY3JpbWUucG5nKQ0KDQojIyBWYXJpYWJsZXMNCg0KVGhlIHZhcmlhYmxlcyBpbiB0aGlzIHRhYmxlIGFyZToNCg0KfCAgVmFyaWFibGUgICB8ICBkZXNjcmlwdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQp8Oi0tLS0tLS0tLS0tLXw6LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwNCnwgYGFnZV9ncGAgICAgfCAgYWdlIGdyb3VwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KfCBgbV9hY2NgICAgICB8ICBudW1iZXIgb2YgbWVuIGFjY3VzZWQsICAxODI2LTE4MjcgICAgICAgICAgICB8DQp8IGB3X2FjY2AgICAgIHwgIG51bWJlciBvZiB3b21lbiBhY2N1c2VkICAgICAgICAgICAgICAgICAgICAgIHwNCnwgYHdfbWAgICAgICAgfCAgbnVtYmVyIG9mIHdvbWVuIGZvciAxMDAwIG1lbiAgICAgICAgICAgICAgICAgfA0KfCBgcHJvcF9hbGxgICB8ICBkZWdyZWVzIG9mIHByb3BlbnNpdHkgZm9yIGNyaW1lOiBpbiBnZW5lcmFsICB8DQp8IGBwcm9wX21gICAgIHwgIC4uLiBtZW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCnwgYHByb3Bfd2AgICAgfCAgLi4uIHdvbWVuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KfCBgY2FsY3VsYXRlZGB8ICAuLi4gY2FsY3VsYXRlZCBieSB0aGUgZm9ybXVsYSAgICAgICAgICAgICAgICB8DQoNCg0KDQojIyBRdWV0ZWxldCdzIGZvcm11bGENCg0KSGUgc2F5cyAocC4gNTcpLCAiVGhlIGxhc3QgY29sdW1uIG9mZmVycyByZXN1bHRzIGNhbGN1bGF0ZWQgYnkgdGhpcyB2ZXJ5IHNpbXBsZSBlbXBpcmljYWwgZm9ybXVsYSI6DQoNCiQkIFkgPSAoMSAtIFxzaW57WH0pXGZyYWN7MX17MSArIG19ICBccXVhZFxxdWFkXG1ib3h7ICAgICAgICBzdXBwb3NpbmcgICAgICAgIH1ccXVhZFxxdWFkIG0gPSBcZnJhY3sxfXsyXlggLSAxOH0kJA0KDQoNCg0KIyMgUXVldGVsZXQncyBncmFwaA0KDQpGaXJzdCwgbWFrZSBhIG51bWVyaWMgdmFyaWFibGUsYGFnZWAgdXNpbmcgbWlkcG9pbnRzIG9mIHRoZSBhZ2UgaW50ZXJ2YWxzLCBtb3N0bHkgb2Ygd2lkdGggNToNCg0KYGBge3IgYWdlfQ0KdGFibGUxMyRhZ2VfZ3ANCiMgbWFrZSBhIHF1YW50aXRhdGl2ZSBhZ2UgdmFyaWFibGUNCmFnZSA8LSBjKDE0LCAxOCwgMjMsIDI3LCAzMiwgMzcsIDQyLCA0NywgNTIsIDU3LCA2MiwgNjcsIDc1LCA4MikNCnRhYmxlMTMgPC0gY2JpbmQoYWdlLCB0YWJsZTEzKQ0KYGBgDQoNCkknbGwgcGxvdCBib3RoIHRoZSBkYXRhIHByb3BlbnNpdHkgdmFyaWFibGUsIGBwcm9wX2FsbGAsIHNvIHRyYW5zZm9ybSB0aGUgZGF0YSB0byBhIGxvbmcgZm9ybWF0Og0KYGBge3IgdG9sb25nfQ0KIycgdHJhbnNmb3JtIHRvIGxvbmcNCnRhYmxlMTMgfD4NCiAgc2VsZWN0KC1jKGFnZV9ncCwgbV9hY2MsIHdfYWNjLCB3X20pKSB8Pg0KICBnYXRoZXIocHJvcF9hbGw6Y2FsY3VsYXRlZCwgDQogICAgICAgICBrZXkgPSAibWVhc3VyZSIsIA0KICAgICAgICAgdmFsdWUgPSAicHJvcGVuc2l0eSIpICAgICAgICAgICAgICAtPiB0YWJsZTEzX2xvbmcNCmBgYA0KDQpQbG90IHRoZSBvdmVyYWxsIHByb3BlbnNpdHkgYW5kIHRoZSBjYWxjdWxhdGVkIG9uZSwgcmVwcm9kdWNpbmcgUXVldGVsZXQncyBncmFwaC4gUXVldGVsZXQgbm90ZXMgdGhhdA0KcHJvcGVuc2l0eSBjcmltZSByZWFjaGVzIGEgcGVhayBhcm91bmQgMjUgeWVhcnMgb2YgYWdlLiANCg0KSSdtIHBsb3R0aW5nIHRoZSBkYXRhIHBvaW50cyBhcyB3ZWxsIGFzIGxvZXNzIHNtb290aGVkIGN1cnZlcyBiZWNhdXNlIFF1ZXRlbGV0DQpvYnZpb3VzbHkgZGlkIHNvbWUgc21vb3RoaW5nLiBIZSB0aGF0IHRoZSBjYWxjdWxhdGVkIGN1cnZlIG1hdGNoZXMgdGhlIGRhdGEsIGF0DQpsZWFzdCBhcHByb3hpbWF0ZWx5LiBXZSBjYW4gc2VlIHRoYXQgaXQgbWF0Y2hlcyBxdWl0ZSB3ZWxsIHVwIHRvIGFnZSAzMCwgYnV0IG5vdA0KaW4gdGhlIGhpZ2hlciBhZ2UgZ3JvdXBzLg0KDQoNCmBgYHtyIGdyYXBofQ0KIycgUmVwcm9kdWNlIFF1ZXRlbGV0J3MgZ3JhcGgNCnRhYmxlMTNfbG9uZyB8Pg0KICBmaWx0ZXIobWVhc3VyZSAlaW4lIGMoInByb3BfYWxsIiwgImNhbGN1bGF0ZWQiKSkgfD4NCiAgZ2dwbG90KA0KICAgICAgIGFlcyh4PWFnZSwgeT1wcm9wZW5zaXR5LCBjb2xvcj1tZWFzdXJlKSkgKw0KICBnZW9tX3Ntb290aChtZXRob2Q9ImxvZXNzIiwgZm9ybXVsYSA9IHl+eCwgc2U9RkFMU0UsIHNpemU9MS4yNSkgKw0KICBnZW9tX3BvaW50KHNpemUgPSAxLjUpICsgDQogIGxhYnMoeCA9ICJBZ2UiLA0KICAgICAgIHkgPSAiUHJvcGVuc2l0eSB0byBDcmltZSIsDQogICAgICAgY29sb3IgPSAiQ3VydmUiKSArDQogIHNjYWxlX2NvbG9yX21hbnVhbChsYWJlbHMgPSBjKCJjYWxjdWxhdGVkIiwgImRhdGEiKSwNCiAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGMoImJsdWUiLCAicmVkIikpICsNCiAgdGhlbWVfYncoYmFzZV9zaXplID0gMTYpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gYygwLjc1LCAwLjc1KSkNCmBgYA0KDQojIyBRdWV0ZWxldCdzICBmb3JtdWxhDQoNCkkgZG9uJ3QgdW5kZXJzdGFuZCBob3cgaGlzIGBjYWxjdWxhdGVkYCB2YXJpYWJsZSBjb21lcyBmcm9tIHRoZSBmb3JtdWxhLiAgSGUgc2F5czoNCg0KPiBJdCBpcyBuZWNlc3NhcnkgdG8gdGFrZSwgYXMgb25lIHNlZXMsIGZvciB0aGUgYXhpcyBvZiB0aGUgYWJzY2lzc2FzLCB0aGUgcXVhcnRlciBvZiB0aGUNCj4gY2lyY3VtZmVyZW5jZSByZWN0aWZpZWQgYW5kIGRpdmlkZWQgYWNjb3JkaW5nIHRvIGRlY2ltYWwgZGl2aXNpb24uDQoNCkkgZG9uJ3Qgc2VlIGhvdyB0aGlzIGlzIHJlZmxlY3RlZCBpbiB0aGUgZm9ybXVsYS4gQSBwbG90IG9mIHdoYXQgdGhpcyBmb3JtdWxhIGFnYWluc3QgYGFnZWAgZ2l2ZXMNCmFuIGV4cGVjdGVkIHNpbnVzb2lkLCB3aXRoIGEgcGVyaW9kIHRoYXQgZXhwYW5kcyB3aXRoIGFnZToNCg0KYGBge3IgcGxvdF9mb3JtdWxhMX0NCm0gPC0gMS8gKDJeYWdlIC0gMTgpDQpmb3JtdWxhIDwtIDEgLSAoc2luKGFnZSkgLyAoMSttKSkNCg0KDQpwbG90KGFnZSwgZm9ybXVsYSwNCiAgICAgdHlwZSA9ICJiIikNCmBgYA0KDQoNCkhvd2V2ZXIsIGEgcGxvdCBvZiB0aGUgYGZvcm11bGFgIGFnYWluc3QgaGlzIGBjYWxjdWxhdGVkYCB2YWx1ZXMgaXMgcGVycGxleGluZzoNCmBgYHtyIGZvcm11bGEyfQ0KcGFyKHhwZCA9IFRSVUUpDQpwbG90KHRhYmxlMTMkY2FsY3VsYXRlZCwgZm9ybXVsYSwgDQogICAgIHR5cGUgPSAiYiIsDQogICAgIHhsYWIgPSAiUXVldGVsZXQgY2FsY3VsYXRlZCIpDQp0ZXh0KHggPSB0YWJsZTEzJGNhbGN1bGF0ZWQsDQogICAgIHkgPSBmb3JtdWxhLA0KICAgICBsYWJlbHMgPSBhZ2UsIHBvcyA9IDMpDQpgYGANCg0KDQojIyBBbiBhbnN3ZXINCg0KQSBraW5kIHJlYWRlciBvZiBbU3RhY2tPdmVyZmxvd10oaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvNzE5MTgzMjMvcXVldGVsZXRzLXByb3BlbnNpdHktcHV6emxlcykNCnBvaW50ZWQgb3V0IHRoYXQgKGEpIHRoZSBwYXJlbnRoZXNlcyBpbiBteSBmb3JtdWxhIHdlcmUgd3JvbmcsIGFuZCAoYikgUXVldGVsZXQgcHJvYmFibHkgdXNlZCByYWRpYW5zLg0KV2l0aCB0aGlzLCBJIGdldDoNCg0KYGBge3IgcGxvdF9mb3JtdWxhM30NCm0gPC0gMS8gKDJeYWdlIC0gMTgpDQpmb3JtdWxhIDwtIDEgLSAoc2luKGFnZSAqIHBpIC8gMTgwKSkgLyAoMSttKSAgIyByYWRpYW5zDQoNCnBsb3QoYWdlLCBmb3JtdWxhLA0KICAgICB0eXBlID0gImIiKQ0KYGBgDQoNClRoZSBncmFwaCBub3cgbG9va3MgcmVhc29uYWJsZSwgZXhjZXB0IGZvciB0aGUgdHdvIGxvd2VzdCBwb2ludHM6DQpgYGB7ciBmb3JtdWxhNH0NCnBhcih4cGQgPSBUUlVFKQ0KcGxvdCh0YWJsZTEzJGNhbGN1bGF0ZWQsIGZvcm11bGEsIA0KICAgICB0eXBlID0gImIiLA0KICAgICB4bGFiID0gIlF1ZXRlbGV0IGNhbGN1bGF0ZWQiKQ0KdGV4dCh4ID0gdGFibGUxMyRjYWxjdWxhdGVkLA0KICAgICB5ID0gZm9ybXVsYSwNCiAgICAgbGFiZWxzID0gYWdlLCBwb3MgPSAzKQ0KYGBgDQoNCg0KIyMgUHJvcGVuc2l0aWVzDQoNCkEgc2Vjb25kIHB1enpsZSBpcyB0aGUgcXVlc3Rpb24gb2YgaG93IFF1ZXRlbGV0IGNhbGN1bGF0ZWQgdGhlICJkZWdyZWVzIG9mIHByb3BlbnNpdHkiIGluIFRhYmxlIDEzLg0KVGhlIGRhdGEgaXMgcHJvdmlkZWQgaW4gaGlzIFRhYmxlIDEyOg0KDQpgYGB7ciB0YWIxMn0NCnRhYmxlMTIgPC0gcmVhZF9jc3YoImh0dHBzOi8vd3d3LmRyb3Bib3guY29tL3MvcGNhMWs1YXFoeDQ4aXV2L1F1ZXRlbGV0LXRhYmxlMTIuY3N2P3Jhdz0xIiwgDQogICAgICAgICAgICAgICAgICAgIHNob3dfY29sX3R5cGVzID0gRkFMU0UpDQpoZWFkKHRhYmxlMTIpDQoNCmBgYA0KDQpUaGlzIHJlY29yZHMgdGhlIG51bWJlciBvZiBjcmltZXMgYWdhaW5zdCBwZXJzb25zIChgcGVyc19jcmltZWApIGFuZCBvZiBjcmltZXMgYWdhaW5zdCBwcm9wZXJ0eSAoYHByb3BfY3JpbWVgKSBjb21taXR0ZWQgaW4gRnJhbmNlIGJ5IGJvdGggc2V4ZXMgaW4gdGhlIHllYXJzIDE4MjYtMTgyOS4gVGhlIGZvdXJ0aCBjb2x1bW4gKGBwY3RfcHJvcGApIGlzIHRoZSBwZXJjZW50IG9mIGNyaW1lcyBhZ2FpbnN0IHByb3BlcnR5IG91dCBvZiAxMDANCmNyaW1lcyBvZiBib3RoIHR5cGVzLg0KDQpUaGUgY29sdW1uIGBwb3B1bGF0aW9uYCwgaGVhZGVkICJQb3B1bGF0aW9uIGFjY29yZGluZyB0byBhZ2VzIiBpbmRpY2F0ZXMgImhvdyBhIHBvcHVsYXRpb24gb2YgMTAsMDAwIHNvdWxzIGlzIA0KZGl2aWRlZCB1cCBpbiBGcmFuY2UgYWNjb3JkaW5nIHRvIGFnZXMuIE9mIHRoZSBsYXN0IGNvbHVtbiAoYHByb3BlbnNpdHlgKSwgaGUgc2F5cyB0aGlzOg0KDQo+IGluZGljYXRlcyB0aGUgcmVsYXRpb25zaGlwIG9mIHRoZSB0b3RhbCBudW1iZXIgb2YgY3JpbWVzIHRvIHRoZSBjb3JyZXNwb25kaW5nIG51bWJlciBpbiB0aGUgcHJlY2VlZGluZyBjb2x1bW4NCg0KVGhlIHF1ZXN0aW9uIGlzIGhvdyB0aGlzIHJlbGF0ZXMgdG8gdGhlIGNvbHVtbiBgcHJvcF9hbGxgIGluIFRhYmxlIDEzLg0KDQo=