suppressWarnings(library(ggplot2))
suppressWarnings(library(gridExtra))

Summary

It has been suggested that Jews who would otherwise have voted Labour may have responded to the Labour Party leadership’s failure to take concerns about antisemitism seriously by voting for the Conservative Party. In order to find out how plausible this idea was, I carried out following analysis of voting in the 20 British parliamentary constituencies with the highest Jewish population.1

This list of constituencies was taken from the Institute for Jewish Policy Research’s Guide to the 2015 General Election in the UK (Boyd, 2015). For each one, I compare the Jewish proportion of the population with the 2015-2017 change in the vote share of each of the three main parliamentary parties outside Scotland, i.e. the Conservative Party, the Labour Party, and the Liberal Democrats.2 Figures for vote share can be verified at the BBC website. Simple linear regression was used in order to estimate the degree to which it is possible to predict the change in vote share for each party within a constituency from the size of the Jewish population in that constituency.

It appears that, across those 20 constituencies, a larger Jewish population predicts a smaller increase in the Labour vote (with high statistical significance) and a larger increase in the Liberal Democrat vote (without statistical significance, although see below). However, it turns out to be totally impossible to predict changes in the Conservative vote from the Jewish population. So the analysis does support the view that Labour’s antisemitism crisis drove Jewish voters away from the party. But it does not support the view that the Conservative Party will have benefited in a direct way. Instead, it suggests that the Labour Party’s lost Jewish votes may have been more likely to have gone to the Liberal Democrats — although that inference is less robust.

As noted above, the relationship between the size of the Jewish population and the change in the Labour vote is highly statistically significant: if there were no relationship, the chances of obtaining a result this extreme by chance would be less than one in a thousand. And although the relationship between the size of the Jewish population and the change in the Liberal Democrate vote across all twenty constituencies is not statistically significant, that doesn’t mean that it is not real: it just means that we can’t reject the possibility that it was just a fluke as confidently as we can in the case of the Labour vote, because we would expect to obtain equally extreme results by chance about one time in five even if there were no relationship.

As a final note, I observe that British census data only exists for Jews as a religious, rather than an ethnic group. This means that the figures used here probably underestimate the number of people in each constituency who might (a) identify as Jews and/or (b) recognise antisemitic hate as a threat to themselves or their loved ones. However, it is impossible to know by how much those figures are underestimated. Different data will be required in order if we are to investigate the ways in which non-religious Jewish voters responded to the Corbyn-led Labour Party.

Scatterplots

# Get data
constituencies <- read.table('top20_jewish_labour_tory_libdem.txt',
                             header=TRUE, row.names=1, sep='\t')
constituencies <- constituencies[order(rownames(constituencies)), ]
# Define chart-drawing function
vote.chart <- function(independent, dependent, title) {
  df <- data.frame(independent, dependent)
  colnames(df) <- c('independent','dependent')
  p <- ggplot(df, aes(x=independent, y=dependent)) 
  p <- p + geom_point() 
  p <- p + geom_smooth(method='lm', color='red', fill=NA)
  p <- p + xlab('Jewish population (percent)')
  p <- p + ylab('Change in vote share (percent)')
  p <- p + ggtitle(title)
  p <- p + coord_fixed()
  p <- p + scale_x_continuous(expand=c(0, 0), 
                              limits=c(0, 25),
                              breaks=seq(0, 25, 5),
                              minor_breaks=seq(0, 25, 5)) 
  p <- p + scale_y_continuous(expand=c(0, 0), 
                              limits=c(-20, 20), 
                              breaks=seq(-20, 20, 5),
                              minor_breaks=seq(-20, 20, 5))
}
# Create charts for each party
lab.chart <- vote.chart(constituencies$Percent.Jewish, constituencies$Labour.Gain,'Labour Party')
con.chart <- vote.chart(constituencies$Percent.Jewish, constituencies$Tory.Gain, 'Conservative Party')
lib.chart <- vote.chart(constituencies$Percent.Jewish, constituencies$Libdem.Gain, 'Liberal Democrats')
# Create PDF file with vector graphics version for Jewish Chronicle
pdf(file='vote_change_and_jewish_population.pdf', width=10, height=6, 
    colormodel='cmyk', paper='a4r', pagecentre=TRUE,
    title='Changes in vote share, 2015-2017')
grid.arrange(lab.chart, con.chart, lib.chart, ncol=3)
invisible(dev.off())
# Create raster image for HTML notebook
grid.arrange(lab.chart, con.chart, lib.chart, ncol=3)

Dots represent individual constituencies. The red line on each chart represents the trend: the ‘linear model’ that comes closest to the actual constituency figures. As noted above, the trend is statistically highly significant for changes in the Labour vote, which means that there is very likely to be a relationship between that vote and the Jewish population, and statistically non-significant for the Liberal Democrat vote, which means that there may well be a relationship between changes in that vote and the Jewish population, but we cannot rule out the possibility that such a relationship does not exist — although, as noted above, the idea that the relationship is real appears more plausible if we permit ourselves to exclude the most extreme shifts in the Liberal Democrat vote from the analysis.

By contrast, the chart showing changes in the Conservative vote looks exactly as we would expect if there were no relationship at all between changes in that vote and the size of the Jewish population. This means that the analysis provides no evidence that substantial numbers of Jewish voters switched from Labour to Conservative between 2015 and 2017.

Regression output is presented below. A version of the above graphic suitable for printing is available from my website.

Table of Jewish population and party vote changes for all 20 constituencies

knitr::kable(constituencies[,c('Percent.Jewish','Labour.Gain','Tory.Gain','Libdem.Gain')], col.names=c('Jewish population (percent)','Rise in Labour vote share, 2015-2017 (percent)', 'Rise in Conservative vote share, 2015-2017 (percent)', 'Rise in Liberal Democrat vote share, 2015-2017 (percent)'))
Jewish population (percent) Rise in Labour vote share, 2015-2017 (percent) Rise in Conservative vote share, 2015-2017 (percent) Rise in Liberal Democrat vote share, 2015-2017 (percent)
Altrincham and Sale West 2.3 12.2 -2.0 -0.7
Blackley and Broughton 7.2 8.5 6.5 -0.5
Bury South 10.2 8.2 6.9 -1.5
Chipping Barnet 6.8 11.5 -2.3 0.9
Cities of London and Westminster 2.8 11.1 -7.5 4.1
Enfield Southgate 3.3 12.7 -6.7 0.7
Epping Forest 3.8 9.9 7.2 -1.3
Finchley and Golders Green 21.1 4.1 -3.9 3.3
Gateshead 3.1 8.4 9.4 -2.8
Hackney North and Stoke Newington 11.3 12.2 -2.1 1.8
Hampstead and Kilburn 6.5 14.6 -10.0 1.4
Harrow East 7.3 5.3 -0.9 1.0
Hendon 17.0 4.5 -1.0 1.6
Hertsmere 14.3 6.2 1.8 -0.2
Hornsey and Wood Green 3.4 14.5 5.6 -15.7
Ilford North 6.5 13.9 -3.1 -0.4
Leeds North East 5.3 15.2 -1.9 -1.6
Ruislip, Northwood, and Pinner 3.7 10.9 -2.3 2.2
Tottenham 2.7 14.2 -0.5 -0.7
Westminster North 3.7 13.1 -8.5 1.5

Regression analyses

Linear model for the Labour vote

const.model <- lm(Labour.Gain ~ Percent.Jewish, data = constituencies)
summary(const.model)

Call:
lm(formula = Labour.Gain ~ Percent.Jewish, data = constituencies)

Residuals:
    Min      1Q  Median      3Q     Max 
-5.1724 -1.4099 -0.2387  1.7071  3.7805 

Coefficients:
               Estimate Std. Error t value Pr(>|t|)    
(Intercept)     13.9294     0.9925  14.034  3.9e-11 ***
Percent.Jewish  -0.4736     0.1135  -4.171 0.000573 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 2.579 on 18 degrees of freedom
Multiple R-squared:  0.4915,    Adjusted R-squared:  0.4633 
F-statistic:  17.4 on 1 and 18 DF,  p-value: 0.0005734

Linear model for the Conservative vote

const.model <- lm(Tory.Gain ~ Percent.Jewish, data = constituencies)
summary(const.model)

Call:
lm(formula = Tory.Gain ~ Percent.Jewish, data = constituencies)

Residuals:
   Min     1Q Median     3Q    Max 
-9.238 -2.522 -1.199  3.534 10.148 

Coefficients:
                Estimate Std. Error t value Pr(>|t|)
(Intercept)    -0.735360   2.176360  -0.338    0.739
Percent.Jewish -0.004166   0.248935  -0.017    0.987

Residual standard error: 5.656 on 18 degrees of freedom
Multiple R-squared:  1.556e-05, Adjusted R-squared:  -0.05554 
F-statistic: 0.00028 on 1 and 18 DF,  p-value: 0.9868

Linear model for the Liberal Democrat vote

const.model <- lm(Libdem.Gain ~ Percent.Jewish, data = constituencies)
summary(const.model)

Call:
lm(formula = Libdem.Gain ~ Percent.Jewish, data = constituencies)

Residuals:
     Min       1Q   Median       3Q      Max 
-14.5423  -0.3869   0.5983   1.4553   5.3889 

Coefficients:
               Estimate Std. Error t value Pr(>|t|)
(Intercept)     -1.9014     1.5177  -1.253    0.226
Percent.Jewish   0.2187     0.1736   1.260    0.224

Residual standard error: 3.944 on 18 degrees of freedom
Multiple R-squared:  0.08106,   Adjusted R-squared:  0.03001 
F-statistic: 1.588 on 1 and 18 DF,  p-value: 0.2237

  1. This document is an R notebook: a document containing explanatory text, R code, and the output of that code. It was created with RStudio. To see the code, click the ‘code’ buttons. I’m making it available in the interests of replicability. The text file containing the data is also available from my website, and contains links where you can verify the voting figures. Please note that I retain copyright for this document, so I would be grateful if you would contact me for permssion before doing any of the things that copyright is usually supposed to restrict you from doing! (E.g. redistributing it or quoting large amounts of text.) I’m usually pretty easy to get in touch with. Please note that this analysis follows an earlier one focusing on the Labour vote in North London constituencies. If you want to link to it, please link to the relevant post on my blog, as the URL for this notebook may change.

  2. U.S. readers please note that the words ‘Liberal Democrat’ have an entirely different meaning in the U.K., where the Liberal Democrats are a centrist party positioned between the left-wing Labour Party and the right-wing Conservative (or ‘Tory’) Party.

LS0tDQp0aXRsZTogIkRpZCBKZXdpc2ggTGFib3VyIHZvdGVycyB0dXJuIHRvd2FyZHMgdGhlIENvbnNlcnZhdGl2ZSBQYXJ0eSBvciB0aGUgTGliZXJhbCBEZW1vY3JhdHMgaW4gMjAxNz8iDQphdXRob3I6ICJEYW5pZWwgQWxsaW5ndG9uIg0KZGF0ZTogIjI2IEp1bmUgMjAxNyINCm91dHB1dDogDQogIGh0bWxfbm90ZWJvb2s6DQogICAgY29kZV9mb2xkaW5nOiBoaWRlDQogICAgc2VsZl9jb250YWluZWQ6IHRydWUNCiAgICB0b2M6IHllcw0KLS0tDQoNCmBgYHtyfQ0Kc3VwcHJlc3NXYXJuaW5ncyhsaWJyYXJ5KGdncGxvdDIpKQ0Kc3VwcHJlc3NXYXJuaW5ncyhsaWJyYXJ5KGdyaWRFeHRyYSkpDQpgYGANCg0KIyBTdW1tYXJ5DQpJdCBbaGFzIGJlZW4gc3VnZ2VzdGVkXShodHRwczovL3d3dy50aGVqYy5jb20vY29tbWVudC9jb2x1bW5pc3RzL2RpZC1qZXdpc2gtdm90ZXJzLWNvc3QtamVyZW15LWNvcmJ5bi10aGUtZWxlY3Rpb24tMS40Mzk3OTIpIHRoYXQgSmV3cyB3aG8gd291bGQgb3RoZXJ3aXNlIGhhdmUgdm90ZWQgTGFib3VyIG1heSBoYXZlIHJlc3BvbmRlZCB0byB0aGUgTGFib3VyIFBhcnR5IGxlYWRlcnNoaXAncyBmYWlsdXJlIHRvIHRha2UgY29uY2VybnMgYWJvdXQgYW50aXNlbWl0aXNtIHNlcmlvdXNseSBieSB2b3RpbmcgZm9yIHRoZSBDb25zZXJ2YXRpdmUgUGFydHkuIEluIG9yZGVyIHRvIGZpbmQgb3V0IGhvdyBwbGF1c2libGUgdGhpcyBpZGVhIHdhcywgSSBjYXJyaWVkIG91dCBmb2xsb3dpbmcgYW5hbHlzaXMgb2Ygdm90aW5nIGluIHRoZSAyMCBCcml0aXNoIHBhcmxpYW1lbnRhcnkgY29uc3RpdHVlbmNpZXMgd2l0aCB0aGUgaGlnaGVzdCBKZXdpc2ggcG9wdWxhdGlvbi5bXmZuMV0gDQoNClteZm4xXTogVGhpcyBkb2N1bWVudCBpcyBhbiBSIG5vdGVib29rOiBhIGRvY3VtZW50IGNvbnRhaW5pbmcgZXhwbGFuYXRvcnkgdGV4dCwgW1JdKGh0dHBzOi8vd3d3LnItcHJvamVjdC5vcmcvKSBjb2RlLCBhbmQgdGhlIG91dHB1dCBvZiB0aGF0IGNvZGUuIEl0IHdhcyBjcmVhdGVkIHdpdGggW1JTdHVkaW9dKGh0dHBzOi8vd3d3LnJzdHVkaW8uY29tLykuIFRvIHNlZSB0aGUgY29kZSwgY2xpY2sgdGhlICdjb2RlJyBidXR0b25zLiBJJ20gbWFraW5nIGl0IGF2YWlsYWJsZSBpbiB0aGUgaW50ZXJlc3RzIG9mIHJlcGxpY2FiaWxpdHkuIFRoZSB0ZXh0IGZpbGUgY29udGFpbmluZyB0aGUgZGF0YSBpcyBhbHNvIGF2YWlsYWJsZSBbZnJvbSBteSB3ZWJzaXRlXShodHRwOi8vd3d3LmRhbmllbGFsbGluZ3Rvbi5uZXQvdG9wMjBfamV3aXNoX2xhYm91cl90b3J5X2xpYmRlbS8pLCBhbmQgY29udGFpbnMgbGlua3Mgd2hlcmUgeW91IGNhbiB2ZXJpZnkgdGhlIHZvdGluZyBmaWd1cmVzLiBQbGVhc2Ugbm90ZSB0aGF0IEkgcmV0YWluIGNvcHlyaWdodCBmb3IgdGhpcyBkb2N1bWVudCwgc28gSSB3b3VsZCBiZSBncmF0ZWZ1bCBpZiB5b3Ugd291bGQgY29udGFjdCBtZSBmb3IgcGVybXNzaW9uIGJlZm9yZSBkb2luZyBhbnkgb2YgdGhlIHRoaW5ncyB0aGF0IGNvcHlyaWdodCBpcyB1c3VhbGx5IHN1cHBvc2VkIHRvIHJlc3RyaWN0IHlvdSBmcm9tIGRvaW5nISAoRS5nLiByZWRpc3RyaWJ1dGluZyBpdCBvciBxdW90aW5nIGxhcmdlIGFtb3VudHMgb2YgdGV4dC4pIEknbSB1c3VhbGx5IHByZXR0eSBlYXN5IHRvIFtnZXQgaW4gdG91Y2ggd2l0aF0oaHR0cDovL3d3dy5kYW5pZWxhbGxpbmd0b24ubmV0L2NvbnRhY3QvKS4gUGxlYXNlIG5vdGUgdGhhdCB0aGlzIGFuYWx5c2lzIGZvbGxvd3MgW2FuIGVhcmxpZXIgb25lXShodHRwOi8vd3d3LmRhbmllbGFsbGluZ3Rvbi5uZXQvMjAxNy8wNi9lbGVjdG9yYWwtY29zdC1sZWZ0LXdpbmctYW50aXNlbWl0aXNtLykgZm9jdXNpbmcgb24gdGhlIExhYm91ciB2b3RlIGluIE5vcnRoIExvbmRvbiBjb25zdGl0dWVuY2llcy4gSWYgeW91IHdhbnQgdG8gbGluayB0byBpdCwgcGxlYXNlIFtsaW5rIHRvIHRoZSByZWxldmFudCBwb3N0IG9uIG15IGJsb2ddKGh0dHA6Ly93d3cuZGFuaWVsYWxsaW5ndG9uLm5ldC8yMDE3LzA2L2pld2lzaC12b3RlcnMtbGFib3VyLWNvbnNlcnZhdGl2ZS1saWJlcmFsLWRlbW9jcmF0KSwgYXMgdGhlIFVSTCBmb3IgdGhpcyBub3RlYm9vayBtYXkgY2hhbmdlLg0KDQpUaGlzIGxpc3Qgb2YgY29uc3RpdHVlbmNpZXMgd2FzIHRha2VuIGZyb20gdGhlIEluc3RpdHV0ZSBmb3IgSmV3aXNoIFBvbGljeSBSZXNlYXJjaCdzIFtHdWlkZSB0byB0aGUgMjAxNSBHZW5lcmFsIEVsZWN0aW9uIGluIHRoZSBVS10oaHR0cDovL2FyY2hpdmUuanByLm9yZy51ay9vYmplY3QtdWsyMDcpIChCb3lkLCAyMDE1KS4gRm9yIGVhY2ggb25lLCBJIGNvbXBhcmUgdGhlIEpld2lzaCBwcm9wb3J0aW9uIG9mIHRoZSBwb3B1bGF0aW9uIHdpdGggdGhlIDIwMTUtMjAxNyBjaGFuZ2UgaW4gdGhlIHZvdGUgc2hhcmUgb2YgZWFjaCBvZiB0aGUgdGhyZWUgbWFpbiBwYXJsaWFtZW50YXJ5IHBhcnRpZXMgb3V0c2lkZSBTY290bGFuZCwgaS5lLiB0aGUgQ29uc2VydmF0aXZlIFBhcnR5LCB0aGUgTGFib3VyIFBhcnR5LCBhbmQgdGhlIExpYmVyYWwgRGVtb2NyYXRzLlteZm4yXSBGaWd1cmVzIGZvciB2b3RlIHNoYXJlIGNhbiBiZSB2ZXJpZmllZCBhdCB0aGUgW0JCQ10oaHR0cDovL3d3dy5iYmMuY28udWsvKSB3ZWJzaXRlLiBbU2ltcGxlIGxpbmVhciByZWdyZXNzaW9uXShodHRwczovL2hici5vcmcvMjAxNS8xMS9hLXJlZnJlc2hlci1vbi1yZWdyZXNzaW9uLWFuYWx5c2lzKSB3YXMgdXNlZCBpbiBvcmRlciB0byBlc3RpbWF0ZSB0aGUgZGVncmVlIHRvIHdoaWNoIGl0IGlzIHBvc3NpYmxlIHRvIHByZWRpY3QgdGhlIGNoYW5nZSBpbiB2b3RlIHNoYXJlIGZvciBlYWNoIHBhcnR5IHdpdGhpbiBhIGNvbnN0aXR1ZW5jeSBmcm9tIHRoZSBzaXplIG9mIHRoZSBKZXdpc2ggcG9wdWxhdGlvbiBpbiB0aGF0IGNvbnN0aXR1ZW5jeS4NCg0KW15mbjJdOiBVLlMuIHJlYWRlcnMgcGxlYXNlIG5vdGUgdGhhdCB0aGUgd29yZHMgJ0xpYmVyYWwgRGVtb2NyYXQnIGhhdmUgYW4gZW50aXJlbHkgZGlmZmVyZW50IG1lYW5pbmcgaW4gdGhlIFUuSy4sIHdoZXJlIHRoZSBMaWJlcmFsIERlbW9jcmF0cyBhcmUgYSBjZW50cmlzdCBwYXJ0eSBwb3NpdGlvbmVkIGJldHdlZW4gdGhlIGxlZnQtd2luZyBMYWJvdXIgUGFydHkgYW5kIHRoZSByaWdodC13aW5nIENvbnNlcnZhdGl2ZSAob3IgJ1RvcnknKSBQYXJ0eS4NCg0KSXQgYXBwZWFycyB0aGF0LCBhY3Jvc3MgdGhvc2UgMjAgY29uc3RpdHVlbmNpZXMsIGEgbGFyZ2VyIEpld2lzaCBwb3B1bGF0aW9uIHByZWRpY3RzIGEgc21hbGxlciBpbmNyZWFzZSBpbiB0aGUgTGFib3VyIHZvdGUgKHdpdGggaGlnaCBzdGF0aXN0aWNhbCBzaWduaWZpY2FuY2UpIGFuZCBhIGxhcmdlciBpbmNyZWFzZSBpbiB0aGUgTGliZXJhbCBEZW1vY3JhdCB2b3RlICh3aXRob3V0IHN0YXRpc3RpY2FsIHNpZ25pZmljYW5jZSwgYWx0aG91Z2ggc2VlIGJlbG93KS4gSG93ZXZlciwgaXQgdHVybnMgb3V0IHRvIGJlIHRvdGFsbHkgaW1wb3NzaWJsZSB0byBwcmVkaWN0IGNoYW5nZXMgaW4gdGhlIENvbnNlcnZhdGl2ZSB2b3RlIGZyb20gdGhlIEpld2lzaCBwb3B1bGF0aW9uLiBTbyB0aGUgYW5hbHlzaXMgKmRvZXMqIHN1cHBvcnQgdGhlIHZpZXcgdGhhdCBMYWJvdXIncyBhbnRpc2VtaXRpc20gY3Jpc2lzIGRyb3ZlIEpld2lzaCB2b3RlcnMgYXdheSBmcm9tIHRoZSBwYXJ0eS4gQnV0IGl0ICpkb2VzIG5vdCogc3VwcG9ydCB0aGUgdmlldyB0aGF0IHRoZSBDb25zZXJ2YXRpdmUgUGFydHkgd2lsbCBoYXZlIGJlbmVmaXRlZCBpbiBhIGRpcmVjdCB3YXkuIEluc3RlYWQsIGl0IHN1Z2dlc3RzIHRoYXQgdGhlIExhYm91ciBQYXJ0eSdzIGxvc3QgSmV3aXNoIHZvdGVzIG1heSBoYXZlIGJlZW4gbW9yZSBsaWtlbHkgdG8gaGF2ZSBnb25lIHRvIHRoZSBMaWJlcmFsIERlbW9jcmF0cyAtLS0gYWx0aG91Z2ggdGhhdCBpbmZlcmVuY2UgaXMgbGVzcyByb2J1c3QuDQoNCkFzIG5vdGVkIGFib3ZlLCB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gdGhlIHNpemUgb2YgdGhlIEpld2lzaCBwb3B1bGF0aW9uIGFuZCB0aGUgY2hhbmdlIGluIHRoZSBMYWJvdXIgdm90ZSBpcyBoaWdobHkgc3RhdGlzdGljYWxseSBzaWduaWZpY2FudDogaWYgdGhlcmUgd2VyZSBubyByZWxhdGlvbnNoaXAsIHRoZSBjaGFuY2VzIG9mIG9idGFpbmluZyBhIHJlc3VsdCB0aGlzIGV4dHJlbWUgYnkgY2hhbmNlIHdvdWxkIGJlIGxlc3MgdGhhbiBvbmUgaW4gYSB0aG91c2FuZC4gQW5kIGFsdGhvdWdoIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiB0aGUgc2l6ZSBvZiB0aGUgSmV3aXNoIHBvcHVsYXRpb24gYW5kIHRoZSBjaGFuZ2UgaW4gdGhlIExpYmVyYWwgRGVtb2NyYXRlIHZvdGUgYWNyb3NzIGFsbCB0d2VudHkgY29uc3RpdHVlbmNpZXMgaXMgbm90IHN0YXRpc3RpY2FsbHkgc2lnbmlmaWNhbnQsIHRoYXQgZG9lc24ndCBtZWFuIHRoYXQgaXQgaXMgbm90IHJlYWw6IGl0IGp1c3QgbWVhbnMgdGhhdCB3ZSBjYW4ndCByZWplY3QgdGhlIHBvc3NpYmlsaXR5IHRoYXQgaXQgd2FzIGp1c3QgYSBmbHVrZSBhcyBjb25maWRlbnRseSBhcyB3ZSBjYW4gaW4gdGhlIGNhc2Ugb2YgdGhlIExhYm91ciB2b3RlLCBiZWNhdXNlIHdlIHdvdWxkIGV4cGVjdCB0byBvYnRhaW4gZXF1YWxseSBleHRyZW1lIHJlc3VsdHMgYnkgY2hhbmNlIGFib3V0IG9uZSB0aW1lIGluIGZpdmUgZXZlbiBpZiB0aGVyZSB3ZXJlIG5vIHJlbGF0aW9uc2hpcC4gDQoNCkFzIGEgZmluYWwgbm90ZSwgSSBvYnNlcnZlIHRoYXQgQnJpdGlzaCBjZW5zdXMgZGF0YSBvbmx5IGV4aXN0cyBmb3IgSmV3cyBhcyBhICpyZWxpZ2lvdXMqLCByYXRoZXIgdGhhbiBhbiAqZXRobmljKiBncm91cC4gVGhpcyBtZWFucyB0aGF0IHRoZSBmaWd1cmVzIHVzZWQgaGVyZSBwcm9iYWJseSB1bmRlcmVzdGltYXRlIHRoZSBudW1iZXIgb2YgcGVvcGxlIGluIGVhY2ggY29uc3RpdHVlbmN5IHdobyBtaWdodCAoYSkgaWRlbnRpZnkgYXMgSmV3cyBhbmQvb3IgKGIpIHJlY29nbmlzZSBhbnRpc2VtaXRpYyBoYXRlIGFzIGEgdGhyZWF0IHRvIHRoZW1zZWx2ZXMgb3IgdGhlaXIgbG92ZWQgb25lcy4gSG93ZXZlciwgaXQgaXMgaW1wb3NzaWJsZSB0byBrbm93IGJ5IGhvdyBtdWNoIHRob3NlIGZpZ3VyZXMgYXJlIHVuZGVyZXN0aW1hdGVkLiBEaWZmZXJlbnQgZGF0YSB3aWxsIGJlIHJlcXVpcmVkIGluIG9yZGVyIGlmIHdlIGFyZSB0byBpbnZlc3RpZ2F0ZSB0aGUgd2F5cyBpbiB3aGljaCBub24tcmVsaWdpb3VzIEpld2lzaCB2b3RlcnMgcmVzcG9uZGVkIHRvIHRoZSBDb3JieW4tbGVkIExhYm91ciBQYXJ0eS4NCg0KIyBTY2F0dGVycGxvdHMNCmBgYHtyfQ0KIyBHZXQgZGF0YQ0KY29uc3RpdHVlbmNpZXMgPC0gcmVhZC50YWJsZSgndG9wMjBfamV3aXNoX2xhYm91cl90b3J5X2xpYmRlbS50eHQnLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXI9VFJVRSwgcm93Lm5hbWVzPTEsIHNlcD0nXHQnKQ0KY29uc3RpdHVlbmNpZXMgPC0gY29uc3RpdHVlbmNpZXNbb3JkZXIocm93bmFtZXMoY29uc3RpdHVlbmNpZXMpKSwgXQ0KDQojIERlZmluZSBjaGFydC1kcmF3aW5nIGZ1bmN0aW9uDQp2b3RlLmNoYXJ0IDwtIGZ1bmN0aW9uKGluZGVwZW5kZW50LCBkZXBlbmRlbnQsIHRpdGxlKSB7DQogIGRmIDwtIGRhdGEuZnJhbWUoaW5kZXBlbmRlbnQsIGRlcGVuZGVudCkNCiAgY29sbmFtZXMoZGYpIDwtIGMoJ2luZGVwZW5kZW50JywnZGVwZW5kZW50JykNCiAgcCA8LSBnZ3Bsb3QoZGYsIGFlcyh4PWluZGVwZW5kZW50LCB5PWRlcGVuZGVudCkpIA0KICBwIDwtIHAgKyBnZW9tX3BvaW50KCkgDQogIHAgPC0gcCArIGdlb21fc21vb3RoKG1ldGhvZD0nbG0nLCBjb2xvcj0ncmVkJywgZmlsbD1OQSkNCiAgcCA8LSBwICsgeGxhYignSmV3aXNoIHBvcHVsYXRpb24gKHBlcmNlbnQpJykNCiAgcCA8LSBwICsgeWxhYignQ2hhbmdlIGluIHZvdGUgc2hhcmUgKHBlcmNlbnQpJykNCiAgcCA8LSBwICsgZ2d0aXRsZSh0aXRsZSkNCiAgcCA8LSBwICsgY29vcmRfZml4ZWQoKQ0KICBwIDwtIHAgKyBzY2FsZV94X2NvbnRpbnVvdXMoZXhwYW5kPWMoMCwgMCksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGltaXRzPWMoMCwgMjUpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtzPXNlcSgwLCAyNSwgNSksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5vcl9icmVha3M9c2VxKDAsIDI1LCA1KSkgDQogIHAgPC0gcCArIHNjYWxlX3lfY29udGludW91cyhleHBhbmQ9YygwLCAwKSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW1pdHM9YygtMjAsIDIwKSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVha3M9c2VxKC0yMCwgMjAsIDUpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWlub3JfYnJlYWtzPXNlcSgtMjAsIDIwLCA1KSkNCn0NCg0KIyBDcmVhdGUgY2hhcnRzIGZvciBlYWNoIHBhcnR5DQpsYWIuY2hhcnQgPC0gdm90ZS5jaGFydChjb25zdGl0dWVuY2llcyRQZXJjZW50Lkpld2lzaCwgY29uc3RpdHVlbmNpZXMkTGFib3VyLkdhaW4sJ0xhYm91ciBQYXJ0eScpDQpjb24uY2hhcnQgPC0gdm90ZS5jaGFydChjb25zdGl0dWVuY2llcyRQZXJjZW50Lkpld2lzaCwgY29uc3RpdHVlbmNpZXMkVG9yeS5HYWluLCAnQ29uc2VydmF0aXZlIFBhcnR5JykNCmxpYi5jaGFydCA8LSB2b3RlLmNoYXJ0KGNvbnN0aXR1ZW5jaWVzJFBlcmNlbnQuSmV3aXNoLCBjb25zdGl0dWVuY2llcyRMaWJkZW0uR2FpbiwgJ0xpYmVyYWwgRGVtb2NyYXRzJykNCg0KIyBDcmVhdGUgUERGIGZpbGUgd2l0aCB2ZWN0b3IgZ3JhcGhpY3MgdmVyc2lvbg0KcGRmKGZpbGU9J3ZvdGVfY2hhbmdlX2FuZF9qZXdpc2hfcG9wdWxhdGlvbi5wZGYnLCB3aWR0aD0xMCwgaGVpZ2h0PTYsIA0KICAgIGNvbG9ybW9kZWw9J2NteWsnLCBwYXBlcj0nYTRyJywgcGFnZWNlbnRyZT1UUlVFLA0KICAgIHRpdGxlPSdDaGFuZ2VzIGluIHZvdGUgc2hhcmUsIDIwMTUtMjAxNycpDQpncmlkLmFycmFuZ2UobGFiLmNoYXJ0LCBjb24uY2hhcnQsIGxpYi5jaGFydCwgbmNvbD0zKQ0KaW52aXNpYmxlKGRldi5vZmYoKSkNCg0KIyBDcmVhdGUgcmFzdGVyIGltYWdlIGZvciBIVE1MIG5vdGVib29rIGFuZCBmb3Igd2Vic2l0ZQ0KZ3JpZC5hcnJhbmdlKGxhYi5jaGFydCwgY29uLmNoYXJ0LCBsaWIuY2hhcnQsIG5jb2w9MykNCmBgYA0KRG90cyByZXByZXNlbnQgaW5kaXZpZHVhbCBjb25zdGl0dWVuY2llcy4gVGhlIHJlZCBsaW5lIG9uIGVhY2ggY2hhcnQgcmVwcmVzZW50cyB0aGUgdHJlbmQ6IHRoZSAnbGluZWFyIG1vZGVsJyB0aGF0IGNvbWVzIGNsb3Nlc3QgdG8gdGhlIGFjdHVhbCBjb25zdGl0dWVuY3kgZmlndXJlcy4gQXMgbm90ZWQgYWJvdmUsIHRoZSB0cmVuZCBpcyBzdGF0aXN0aWNhbGx5IGhpZ2hseSBzaWduaWZpY2FudCBmb3IgY2hhbmdlcyBpbiB0aGUgTGFib3VyIHZvdGUsIHdoaWNoIG1lYW5zIHRoYXQgdGhlcmUgaXMgdmVyeSBsaWtlbHkgdG8gYmUgYSByZWxhdGlvbnNoaXAgYmV0d2VlbiB0aGF0IHZvdGUgYW5kIHRoZSBKZXdpc2ggcG9wdWxhdGlvbiwgYW5kIHN0YXRpc3RpY2FsbHkgbm9uLXNpZ25pZmljYW50IGZvciB0aGUgTGliZXJhbCBEZW1vY3JhdCB2b3RlLCB3aGljaCBtZWFucyB0aGF0IHRoZXJlIG1heSB3ZWxsIGJlIGEgcmVsYXRpb25zaGlwIGJldHdlZW4gY2hhbmdlcyBpbiB0aGF0IHZvdGUgYW5kIHRoZSBKZXdpc2ggcG9wdWxhdGlvbiwgYnV0IHdlIGNhbm5vdCBydWxlIG91dCB0aGUgcG9zc2liaWxpdHkgdGhhdCBzdWNoIGEgcmVsYXRpb25zaGlwIGRvZXMgbm90IGV4aXN0IC0tLSBhbHRob3VnaCwgYXMgbm90ZWQgYWJvdmUsIHRoZSBpZGVhIHRoYXQgdGhlIHJlbGF0aW9uc2hpcCBpcyByZWFsIGFwcGVhcnMgbW9yZSBwbGF1c2libGUgaWYgd2UgcGVybWl0IG91cnNlbHZlcyB0byBleGNsdWRlIHRoZSBtb3N0IGV4dHJlbWUgc2hpZnRzIGluIHRoZSBMaWJlcmFsIERlbW9jcmF0IHZvdGUgZnJvbSB0aGUgYW5hbHlzaXMuIA0KDQpCeSBjb250cmFzdCwgdGhlIGNoYXJ0IHNob3dpbmcgY2hhbmdlcyBpbiB0aGUgQ29uc2VydmF0aXZlIHZvdGUgbG9va3MgZXhhY3RseSBhcyB3ZSB3b3VsZCBleHBlY3QgaWYgdGhlcmUgd2VyZSAqbm8gcmVsYXRpb25zaGlwIGF0IGFsbCogYmV0d2VlbiBjaGFuZ2VzIGluIHRoYXQgdm90ZSBhbmQgdGhlIHNpemUgb2YgdGhlIEpld2lzaCBwb3B1bGF0aW9uLiBUaGlzIG1lYW5zIHRoYXQgdGhlIGFuYWx5c2lzIHByb3ZpZGVzIG5vIGV2aWRlbmNlIHRoYXQgc3Vic3RhbnRpYWwgbnVtYmVycyBvZiBKZXdpc2ggdm90ZXJzIHN3aXRjaGVkIGZyb20gTGFib3VyIHRvIENvbnNlcnZhdGl2ZSBiZXR3ZWVuIDIwMTUgYW5kIDIwMTcuDQoNClJlZ3Jlc3Npb24gb3V0cHV0IGlzIHByZXNlbnRlZCBbYmVsb3ddKCNtb2RlbHMpLiBBIHZlcnNpb24gb2YgdGhlIGFib3ZlIGdyYXBoaWMgc3VpdGFibGUgZm9yIHByaW50aW5nIGlzIGF2YWlsYWJsZSBmcm9tIFtteSB3ZWJzaXRlXShodHRwOi8vd3d3LmRhbmllbGFsbGluZ3Rvbi5uZXQvd3AtY29udGVudC91cGxvYWRzLzIwMTcvMDYvdm90ZV9jaGFuZ2VfYW5kX2pld2lzaF9wb3B1bGF0aW9uLnBkZikuDQoNCiMgVGFibGUgb2YgSmV3aXNoIHBvcHVsYXRpb24gYW5kIHBhcnR5IHZvdGUgY2hhbmdlcyBmb3IgYWxsIDIwIGNvbnN0aXR1ZW5jaWVzDQpgYGB7ciwgcmVzdWx0cz0nYXNpcyd9DQprbml0cjo6a2FibGUoY29uc3RpdHVlbmNpZXNbLGMoJ1BlcmNlbnQuSmV3aXNoJywnTGFib3VyLkdhaW4nLCdUb3J5LkdhaW4nLCdMaWJkZW0uR2FpbicpXSwgY29sLm5hbWVzPWMoJ0pld2lzaCBwb3B1bGF0aW9uIChwZXJjZW50KScsJ1Jpc2UgaW4gTGFib3VyIHZvdGUgc2hhcmUsIDIwMTUtMjAxNyAocGVyY2VudCknLCAnUmlzZSBpbiBDb25zZXJ2YXRpdmUgdm90ZSBzaGFyZSwgMjAxNS0yMDE3IChwZXJjZW50KScsICdSaXNlIGluIExpYmVyYWwgRGVtb2NyYXQgdm90ZSBzaGFyZSwgMjAxNS0yMDE3IChwZXJjZW50KScpKQ0KYGBgDQojIFJlZ3Jlc3Npb24gYW5hbHlzZXMgeyNtb2RlbHN9DQoNCiMjIExpbmVhciBtb2RlbCBmb3IgdGhlIExhYm91ciB2b3RlDQpgYGB7cn0NCmNvbnN0Lm1vZGVsIDwtIGxtKExhYm91ci5HYWluIH4gUGVyY2VudC5KZXdpc2gsIGRhdGEgPSBjb25zdGl0dWVuY2llcykNCnN1bW1hcnkoY29uc3QubW9kZWwpDQpgYGANCg0KIyMgTGluZWFyIG1vZGVsIGZvciB0aGUgQ29uc2VydmF0aXZlIHZvdGUNCmBgYHtyfQ0KY29uc3QubW9kZWwgPC0gbG0oVG9yeS5HYWluIH4gUGVyY2VudC5KZXdpc2gsIGRhdGEgPSBjb25zdGl0dWVuY2llcykNCnN1bW1hcnkoY29uc3QubW9kZWwpDQpgYGANCg0KIyMgTGluZWFyIG1vZGVsIGZvciB0aGUgTGliZXJhbCBEZW1vY3JhdCB2b3RlDQpgYGB7cn0NCmNvbnN0Lm1vZGVsIDwtIGxtKExpYmRlbS5HYWluIH4gUGVyY2VudC5KZXdpc2gsIGRhdGEgPSBjb25zdGl0dWVuY2llcykNCnN1bW1hcnkoY29uc3QubW9kZWwpDQpgYGANCg==