The Populist Trump Economy

Donald J. Trump campaigned in 2016 on tax cuts, deregulation, tariffs on foreign imports, exiting global trade treaties like TPP and renegotiating NAFTA. Trump claimed his approach would help U.S. wage earners by reversing the globalist trends that shipped middle class jobs overseas. To suggest that experts disagreed would be a marked understatement. Trump’s populist economic nationalism was pilloried by pundits.

Research Questions

  1. Did Trump era wage growth patterns significantly exceed the historic trend? If so, to what degree and for which strata of wage earner?
  2. How did Trump era wage growth compare to the Obama era?
  3. How did Trump era wage growth compare to the last three years of the Obama era, e.g. the cherry-picked best three years from that era?

Results Summary. The Trump era wage growth significantly exceeded the historic trend and the Obama era trends at the 0.01 level in virtually all cases. The results are summarized in the chart below. Forty linear models were analyzed including diagnostics, and the slope coefficients from the regression lines appear in the table representing growth rates for weekly wages.

US Weekly Wage Growth Per Quarter: All Wage Earners

\[\begin{array}{lccccc} &\textbf{10th Percentile}&\textbf{25th Percentile}&\textbf{Median}&\textbf{75th Percentile}&\textbf{90th Percentile}\\ \text{Historic} & \$2.03& \$2.77& \$4.05& \$7.49& \$12.02\\ \text{Trump Era} &\$4.95 & \$5.14 & \$6.90 & \$10.45 & \$20.72\\ \text{Obama Era} & \$1.49 & \$1.48 & \$3.20 & \$6.03 & \$8.34\\ \text{Obama Last 3 Yrs} & \$1.68 & \$2.06 & \$5.08 & \$6.40 & \$6.70 \end{array}\]

The historic median was calculated based on a 40-year trend (since Q1 of 1981). The other historic values are calculated based upon a 20-year trend (since Q1 of 2000) because the publicly available data did not go any further back.

The U.S. Bureau of Labor Statistics states that their data are inflation-adjusted values represented in 2020 (present day) dollars.

US Weekly Wage Growth Per Quarter: African American Wage Earners Only

\[\begin{array}{lccccc} &\textbf{10th Percentile}&\textbf{25th Percentile}&\textbf{Median}&\textbf{75th Percentile}&\textbf{90th Percentile}\\ \text{Historic} & \$1.65 & \$2.25 & \$3.11 & \$5.26 & \$9.23\\ \text{Trump Era} & \$3.24 & \$4.66 & \$4.54 & \$9.82 & \$11.57\\ \text{Obama Era} & \$0.88 & \$1.32 & \$1.66 & \$3.79 & \$9.85\\ \text{Obama Last 3 Yrs} & \$1.68 & \$1.65 & \$0.92 & \$2.47 & \$4.60 \end{array}\]

All historic values are calculated based upon a 20-year trend (since Q1 of 2000).

Hypothesis Tests

Generally, students are cautioned against using linear regression modeling for time series data. The one exception is the usage below: determining growth trends over equally spaced time intervals, a practice widely utilized especially for economic data.

Bootstrapping confidence intervals for the slope coefficient were created for each of the eight Trump era models. The 90% and 98% confidence intervals were generated to test the one-tailed hypothesis that the Trump era growth rate was significantly higher than (a) the historic growth rate, (b) the Obama era growth rate and (c) the growth during the cherry-picked last three years of the Obama era.

Summary of Results

In every case but one, the Trump era growth was significantly higher than all three other growth rates at the 0.01 level. For the median wage for African Americans, the Trump era growth was not significantly higher than the historic median at the 0.05 level but was at the 0.1 level. However, when evaluating the significance for hypothesis that the Trump era growth was higher than for the two Obama cases, both were significant at the 0.01 level. The Trump era growth rates in wages were especially large for the 10th and 25th percentiles and for the models that used African American wage earners only.

Initializing RStudio

The code block below uses ensures that the Mosaic package is loaded and will import the U.S. wages data frames Med, Perc and PercB which were created using downloads from the U.S. Bureau of Labor Statistics using Table 2 for the Med data set and Table 5 for Perc and PerB data sets. The charts were coerced into data frames using Microsoft Excel’s vlookup function.

library(mosaic)
library(readxl)
Data3350 = read_excel("Data3350.xlsx")
Med = read_excel("Med.xlsx")
MedUpdate = read_excel("MedUpdate.xlsx")
Perc = read_excel("Perc.xlsx")
PerB = read_excel("PercB.xlsx")
New names:
* `` -> ...10
* `` -> ...11
PerH = read_excel("PerH.xlsx")

1. Eliminating COVID Outliers

The chart below shows outliers in 2020 Q1 and Q2 due to COVID layoffs mainly for those earning below the median wage. This spike in median wage growth would artificially bias the Trump era growth rates, and the outliers have thus been eliminated from the data sets and comparisons.

xyplot(Median ~ Period, data = Med, 
       xlab = "Quarters since 1981 Q1", 
       ylab = "Number of Wage Earners (in thousands)")

Why did median weekly wages increase when COVID shutdowns hit? The vast majority of those laid off were had earnings below the median causing an upward shift in the median.

xyplot(Earners ~ Period, data = Med, 
       xlab = "Quarters since 1981 Q1", 
       ylab = "Number of Wage Earners (in thousands)")

I have updated the wage earners picture now that Q3 data is available.

xyplot(Earners ~ Period, data = MedUpdate, 
       xlab = "Quarters since 1981 Q1", 
       ylab = "Number of Wage Earners (in thousands)")

newMed = subset( Med , Period <= 155 )

To be clear, the outliers would help Trump by artificially inflating wage growth during his term. Eliminating 2020 Q1 and Q2 allow for an analysis absent the black swan COVID event. Notice the uptick during the Trump administration still jumps above the 40-year trend line.

# Update: Number of Wage Earners updated to include 2020.

xyplot(Earners ~ Period, data = Med, 
       xlab = "Quarters since 1981 Q1", 
       ylab = "Number of Wage Earners (in thousands)")

xyplot( Median ~ Period, data = newMed , 
        type = c("p","r") ,
        xlab = "Quarters since 1981 Q1" , 
        ylab = "U.S. Median Wage")

2. Building a Linear Model for Growth of U.S. Median Wage

mod50 = lm( Median ~ Period, data = newMed)
mod50

Call:
lm(formula = Median ~ Period, data = newMed)

Coefficients:
(Intercept)       Period  
    262.613        4.053  
rsquared(mod50)
[1] 0.9949136
qqmath(~resid(mod50))

Results. The xyplot indicates strong linearity, and the qq-plot indicates approximately normality of residuals.

3. Linear Models for Trump and Obama Eras

Since U.S. Presidents take office on January 20 of the year following their election, the data set begins with 1981 Q1 when Reagan took office (Period 0). Bush 41 took office 8 years (32 quarters) later, so his term begins in Period 32. Clinton’s term begins 12 quarters later in Period 48. Bush 43’s term begins 32 quarters later in Period 80. Obama’s term begins 32 quarters later in Period 112. Trump’s term begins 32 quarters after that in Period 144. The final four quarters of the Carter administration were not included in this analysis despite being present in the original data. The choice was made to include only data that covered entire presidential terms. Note that, for example, Barack Obama’s term runs from Q1 2009 to Q4 2016, and Donald Trump’s term begins in Q1 2017. Again, by truncating the Trump era at Period 155 (Q4 2019), we avoid the COVID outliers skewing the analysis of the Trump data in a direction that would be deceptively helpful to Trump. Period 160 is Q1 2021, 40 years and 160 quarters after Reagan, so Period 156 is Q1 2020.

TrumpMed = subset( Med , Period >=  144 & Period <= 155)
ObamaMed = subset( Med , Period >= 112 & Period <= 143 )
ObamaMedL3 = subset( Med , Period >= 132 & Period <= 143 )

Comparing Median Wage Growth: Historic vs. Trump vs. Obama

Creating the linear models for Tump, Obama, and Obama L3 (last 3 years). The slope coefficient is labeled “Period” and indicates the weekly U.S. median wage growth per quarter.

mod50T = lm( Median ~ Period, data = TrumpMed)
mod50B = lm( Median ~ Period, data = ObamaMed)
mod50BL3 = lm( Median ~ Period, data = ObamaMedL3)
mod50

Call:
lm(formula = Median ~ Period, data = newMed)

Coefficients:
(Intercept)       Period  
    262.613        4.053  
mod50T

Call:
lm(formula = Median ~ Period, data = TrumpMed)

Coefficients:
(Intercept)       Period  
   -143.152        6.895  
mod50B

Call:
lm(formula = Median ~ Period, data = ObamaMed)

Coefficients:
(Intercept)       Period  
    369.154        3.203  
mod50BL3

Call:
lm(formula = Median ~ Period, data = ObamaMedL3)

Coefficients:
(Intercept)       Period  
    112.923        5.077  

Evaluating the diagnostics for linearity and normality assumptions

XYPlots including regression line to assess bivariate linearity

The linearity assumption appears valid for all three models.

p1 = xyplot(Median ~ Period, data = newMed, type = c("p","r"), main = "Historic Median")
p2 = xyplot(Median ~ Period, data = TrumpMed, type = c("p","r"), main = "Trump Era Median")
p3 = xyplot(Median ~ Period, data = ObamaMed, type = c("p","r"), main = "Obama Era Median")
p4 = xyplot(Median ~ Period, data = ObamaMedL3, type = c("p","r"), main = "Obama Last 3 Yrs Median")
print(p1, position = c(0, 0.5, 0.5, 1), more = TRUE)
print(p2, position = c(0.5, 0.5, 1, 1), more = TRUE)
print(p3, position = c(0, 0, 0.5, 0.5), more = TRUE)
print(p4, position = c(0.5, 0, 1, 0.5))

QQ-Plots to assess bivariate normality

A perfectly straight line of points in the qq-plot would indicate the errors (residuals) are scattered in a perfect bell-shape around the regression line. All three qq-plot are approximately linear indicating the normality assumption appears justified. However, bootstrapping confidence intervals will be used for all estimates, a process which is robust even when the residuals are not normally distributed, as long as they are symmetrically distributed (Guass-Markov Theorem.)

q1 = qqmath(~resid(mod50) ,type = c("p", "r"), main = "Historic Median")
q2 = qqmath(~resid(mod50T) ,type = c("p", "r"), main = "Trump Era Median")
q3 = qqmath(~resid(mod50B),type = c("p", "r"), main = "Obama Era Median")
q4 = qqmath(~resid(mod50BL3),type = c("p", "r"), main = "Obama Last 3 Yrs Median")
print(q1, position = c(0, 0.5, 0.5, 1), more = TRUE)
print(q2, position = c(0.5, 0.5, 1, 1), more = TRUE)
print(q3, position = c(0, 0, 0.5, 0.5), more = TRUE)
print(q4, position = c(0.5, 0, 1, 0.5))

Comparing Wage Growth in 10th, 25th, 75th and 90th Percentiles

The data for the 10th, 25th 75th and 90th percentiles are only available back to Q1 2000.

TrumpPerc = subset( Perc , Period >=  68 & Period <= 79)
ObamaPerc = subset( Perc , Period >=  36 & Period <= 67)
ObamaPercL3 = subset( Perc, Period >=  56 & Period <= 67)

Modeling the Trump Era

mod10T = lm(P10 ~ Period, data = TrumpPerc)
mod25T = lm(P25 ~ Period, data = TrumpPerc)
mod75T = lm(P75 ~ Period, data = TrumpPerc)
mod90T = lm(P90 ~ Period, data = TrumpPerc)
mod10T

Call:
lm(formula = P10 ~ Period, data = TrumpPerc)

Coefficients:
(Intercept)       Period  
     21.985        5.591  
mod25T

Call:
lm(formula = P25 ~ Period, data = TrumpPerc)

Coefficients:
(Intercept)       Period  
    264.209        4.479  
mod75T

Call:
lm(formula = P75 ~ Period, data = TrumpPerc)

Coefficients:
(Intercept)       Period  
     559.87        11.56  
mod90T

Call:
lm(formula = P90 ~ Period, data = TrumpPerc)

Coefficients:
(Intercept)       Period  
     464.60        23.12  

Diagnostics for linearity and normality in Trump era data sets

The xyplots all confirm the linearity assumption is reasonable, though each plot shows a slight acceleration of growth in the Trump era (Periods 68 to 79). The most pronounced acceleration appears visually in the 10th percentile xyplot.

p1 = xyplot(P10 ~ Period, data = TrumpPerc, type = c("p","r"), main = "Trump 10th Percentile")
p2 = xyplot(P25 ~ Period, data = TrumpPerc, type = c("p","r"), main = "Trump 25th Percentile")
p3 = xyplot(P75 ~ Period, data = TrumpPerc, type = c("p","r"), main = "Trump 75th Percentile")
p4 = xyplot(P90 ~ Period, data = TrumpPerc, type = c("p","r"), main = "Trump 90th Percentile")
print(p1, position = c(0, 0.5, 0.5, 1), more = TRUE)
print(p2, position = c(0.5, 0.5, 1, 1), more = TRUE)
print(p3, position = c(0, 0, 0.5, 0.5), more = TRUE)
print(p4, position = c(0.5, 0, 1, 0.5))

All four qq-plots indicate the normality assumption for the residuals is a reasonable assumption.

q1 = qqmath(~resid(mod10T) ,type = c("p", "r"), main = "Trump 10th Percentile")
q2 = qqmath(~resid(mod25T),type = c("p", "r"), main = "Trump 25th Percentile")
q3 = qqmath(~resid(mod75T),type = c("p", "r"), main = "Trump 75th Percentile")
q4 = qqmath(~resid(mod90T),type = c("p", "r"), main = "Trump 90th Percentile")
print(q1, position = c(0, 0.5, 0.5, 1), more = TRUE)
print(q2, position = c(0.5, 0.5, 1, 1), more = TRUE)
print(q3, position = c(0, 0, 0.5, 0.5), more = TRUE)
print(q4, position = c(0.5, 0, 1, 0.5))

Modeling the Obama Era

mod10B = lm(P10 ~ Period, data = ObamaPerc)
mod25B = lm(P25 ~ Period, data = ObamaPerc)
mod75B = lm(P75 ~ Period, data = ObamaPerc)
mod90B = lm(P90 ~ Period, data = ObamaPerc)
mod10B

Call:
lm(formula = P10 ~ Period, data = ObamaPerc)

Coefficients:
(Intercept)       Period  
    284.144        1.652  
mod25B

Call:
lm(formula = P25 ~ Period, data = ObamaPerc)

Coefficients:
(Intercept)       Period  
    415.834        1.859  
mod75B

Call:
lm(formula = P75 ~ Period, data = ObamaPerc)

Coefficients:
(Intercept)       Period  
    885.219        6.588  
mod90B

Call:
lm(formula = P90 ~ Period, data = ObamaPerc)

Coefficients:
(Intercept)       Period  
   1401.144        9.035  

Diagnostics for linearity and normality in Obama era data sets

The xyplots all confirm the linearity assumption is reasonable, though each plot shows a slight acceleration of growth in the Trump era (Periods 68 to 79). The most pronounced acceleration appears visually in the 10th percentile xyplot.

p1 = xyplot(P10 ~ Period, data = ObamaPerc, type = c("p","r"), main = "Obama 10th Percentile")
p2 = xyplot(P25 ~ Period, data = ObamaPerc, type = c("p","r"), main = "Obama 25th Percentile")
p3 = xyplot(P75 ~ Period, data = ObamaPerc, type = c("p","r"), main = "Obama 75th Percentile")
p4 = xyplot(P90 ~ Period, data = ObamaPerc, type = c("p","r"), main = "Obama 90th Percentile")
print(p1, position = c(0, 0.5, 0.5, 1), more = TRUE)
print(p2, position = c(0.5, 0.5, 1, 1), more = TRUE)
print(p3, position = c(0, 0, 0.5, 0.5), more = TRUE)
print(p4, position = c(0.5, 0, 1, 0.5))

All four qq-plots indicate the normality assumption for the residuals is a reasonable assumption.

q1 = qqmath(~resid(mod10B) ,type = c("p", "r"), main = "Obama 10th Percentile")
q2 = qqmath(~resid(mod25B),type = c("p", "r"), main = "Obama 25th Percentile")
q3 = qqmath(~resid(mod75B),type = c("p", "r"), main = "Obama 75th Percentile")
q4 = qqmath(~resid(mod90B),type = c("p", "r"), main = "Obama 90th Percentile")
print(q1, position = c(0, 0.5, 0.5, 1), more = TRUE)
print(q2, position = c(0.5, 0.5, 1, 1), more = TRUE)
print(q3, position = c(0, 0, 0.5, 0.5), more = TRUE)
print(q4, position = c(0.5, 0, 1, 0.5))

Modeling Obama’s Last 3 Years

mod10BL3 = lm(P10 ~ Period, data = ObamaPercL3)
mod25BL3 = lm(P25 ~ Period, data = ObamaPercL3)
mod75BL3 = lm(P75 ~ Period, data = ObamaPercL3)
mod90BL3 = lm(P90 ~ Period, data = ObamaPercL3)
mod10BL3

Call:
lm(formula = P10 ~ Period, data = ObamaPercL3)

Coefficients:
(Intercept)       Period  
    246.200        2.287  
mod25BL3

Call:
lm(formula = P25 ~ Period, data = ObamaPercL3)

Coefficients:
(Intercept)       Period  
    302.800        3.713  
mod75BL3

Call:
lm(formula = P75 ~ Period, data = ObamaPercL3)

Coefficients:
(Intercept)       Period  
     662.17        10.22  
mod90BL3

Call:
lm(formula = P90 ~ Period, data = ObamaPercL3)

Coefficients:
(Intercept)       Period  
    1065.98        14.38  

Diagnostics for linearity and normality in data sets from Obama’s Last 3 Years

The xyplots all confirm the linearity assumption is reasonable, though each plot shows a slight acceleration of growth in the Trump era (Periods 68 to 79). The most pronounced acceleration appears visually in the 10th percentile xyplot.

p1 = xyplot(P10 ~ Period, data = ObamaPercL3, type = c("p","r"), main = "Obama Last 3 Yrs 10th Percentile")
p2 = xyplot(P25 ~ Period, data = ObamaPercL3, type = c("p","r"), main = "Obama Last 3 Yrs 25th Percentile")
p3 = xyplot(P75 ~ Period, data = ObamaPercL3, type = c("p","r"), main = "Obama Last 3 Yrs 75th Percentile")
p4 = xyplot(P90 ~ Period, data = ObamaPercL3, type = c("p","r"), main = "Obama Last 3 Yrs 90th Percentile")
print(p1, position = c(0, 0.5, 0.5, 1), more = TRUE)
print(p2, position = c(0.5, 0.5, 1, 1), more = TRUE)
print(p3, position = c(0, 0, 0.5, 0.5), more = TRUE)
print(p4, position = c(0.5, 0, 1, 0.5))

All four qq-plots indicate the normality assumption for the residuals is a reasonable assumption.

q1 = qqmath(~resid(mod10BL3) ,type = c("p", "r"), main = "Obama Last 3 Yrs 10th Percentile")
q2 = qqmath(~resid(mod25BL3),type = c("p", "r"), main = "Obama Last 3 Yrs 25th Percentile")
q3 = qqmath(~resid(mod75BL3),type = c("p", "r"), main = "Obama Last 3 Yrs 75th Percentile")
q4 = qqmath(~resid(mod90BL3),type = c("p", "r"), main = "Obama Last 3 Yrs 90th Percentile")
print(q1, position = c(0, 0.5, 0.5, 1), more = TRUE)
print(q2, position = c(0.5, 0.5, 1, 1), more = TRUE)
print(q3, position = c(0, 0, 0.5, 0.5), more = TRUE)
print(q4, position = c(0.5, 0, 1, 0.5))

4. Modeling Wage Growth for African Americans Only

TrumpPerB = subset( PerB , Period >=  68 & Period <= 79)
ObamaPerB = subset( PerB , Period >=  36 & Period <= 67)
ObamaPerBL3 = subset( PerB, Period >=  56 & Period <= 67)

Median wage growth models for African Americans only: Historic vs. Trump vs. Obama

modB50 = lm(P50 ~ Period, data = PerB)
modB50T = lm(P50 ~ Period, data = TrumpPerB)
modB50B = lm(P50 ~ Period, data = ObamaPerB)
modB50BL3 = lm(P50 ~ Period, data = ObamaPerBL3)
modB50

Call:
lm(formula = P50 ~ Period, data = PerB)

Coefficients:
(Intercept)       Period  
    466.594        3.294  
modB50T

Call:
lm(formula = P50 ~ Period, data = TrumpPerB)

Coefficients:
(Intercept)       Period  
    243.976        6.262  
modB50B

Call:
lm(formula = P50 ~ Period, data = ObamaPerB)

Coefficients:
(Intercept)       Period  
    514.435        2.238  
modB50BL3

Call:
lm(formula = P50 ~ Period, data = ObamaPerBL3)

Coefficients:
(Intercept)       Period  
    408.914        3.958  

Diagnostics for median wage growth of African Americans only

p1 = xyplot(P50 ~ Period, data = PerB, type = c("p","r"), main = "Historic Median Growth")
p2 = xyplot(P50 ~ Period, data = TrumpPerB, type = c("p","r"), main = "Trump Median Growth")
p3 = xyplot(P75 ~ Period, data = ObamaPerB, type = c("p","r"), main = "Obama Median Grwoth")
p4 = xyplot(P90 ~ Period, data = ObamaPerBL3, type = c("p","r"), main = "Obama Last 3 Yrs Median Growth")
print(p1, position = c(0, 0.5, 0.5, 1), more = TRUE)
print(p2, position = c(0.5, 0.5, 1, 1), more = TRUE)
print(p3, position = c(0, 0, 0.5, 0.5), more = TRUE)
print(p4, position = c(0.5, 0, 1, 0.5))

The xyplots all confirm the linearity assumption is reasonable, but the data for the last 3 years of the Obama era show a very weak correlation, and the Trump era may actually have a growth curve that is accelerating slightly (non-linear, concave up).

q1 = qqmath(~resid(modB50) ,type = c("p", "r"), main = "Historic Median")
q2 = qqmath(~resid(modB50T),type = c("p", "r"), main = "Trump Median")
q3 = qqmath(~resid(modB50B),type = c("p", "r"), main = "Obama Median")
q4 = qqmath(~resid(modB50BL3),type = c("p", "r"), main = "Obama Last 3 Median")
print(q1, position = c(0, 0.5, 0.5, 1), more = TRUE)
print(q2, position = c(0.5, 0.5, 1, 1), more = TRUE)
print(q3, position = c(0, 0, 0.5, 0.5), more = TRUE)
print(q4, position = c(0.5, 0, 1, 0.5))

All 4 qq-plots indicate the normality assumption is reasonable.

Trump Era

modB10T = lm(P10 ~ Period, data = TrumpPerB)
modB25T = lm(P25 ~ Period, data = TrumpPerB)
modB75T = lm(P75 ~ Period, data = TrumpPerB)
modB90T = lm(P90 ~ Period, data = TrumpPerB)
modB10T

Call:
lm(formula = P10 ~ Period, data = TrumpPerB)

Coefficients:
(Intercept)       Period  
    141.079        3.294  
modB25T

Call:
lm(formula = P25 ~ Period, data = TrumpPerB)

Coefficients:
(Intercept)       Period  
     66.438        5.948  
modB50T

Call:
lm(formula = P50 ~ Period, data = TrumpPerB)

Coefficients:
(Intercept)       Period  
    243.976        6.262  
modB75T

Call:
lm(formula = P75 ~ Period, data = TrumpPerB)

Coefficients:
(Intercept)       Period  
     280.52        10.83  
modB90T

Call:
lm(formula = P90 ~ Period, data = TrumpPerB)

Coefficients:
(Intercept)       Period  
     419.96        16.27  

Diagnostics for Trump era

p1 = xyplot(P10 ~ Period, data = TrumpPerB, type = c("p","r"), main = "Trump 10th Percentile")
p2 = xyplot(P25 ~ Period, data = TrumpPerB, type = c("p","r"), main = "Trump 25th Percentile")
p3 = xyplot(P75 ~ Period, data = TrumpPerB, type = c("p","r"), main = "Trump 75th Percentile")
p4 = xyplot(P90 ~ Period, data = TrumpPerB, type = c("p","r"), main = "Trump 90th Percentile")
print(p1, position = c(0, 0.5, 0.5, 1), more = TRUE)
print(p2, position = c(0.5, 0.5, 1, 1), more = TRUE)
print(p3, position = c(0, 0, 0.5, 0.5), more = TRUE)
print(p4, position = c(0.5, 0, 1, 0.5))

The xyplots all confirm the linearity assumption is reasonable, though each plot shows a slight acceleration of growth in the Trump era (Periods 68 to 79). The most pronounced acceleration appears visually in the 10th percentile xyplot.

q1 = qqmath(~resid(modB10T),type = c("p", "r"), main = "Trump 10th Percentile")
q2 = qqmath(~resid(modB25T),type = c("p", "r"), main = "Trump 25th Percentile")
q3 = qqmath(~resid(modB75T),type = c("p", "r"), main = "Trump 75th Percentile")
q4 = qqmath(~resid(modB90T),type = c("p", "r"), main = "Trump 90th Percentile")
print(q1, position = c(0, 0.5, 0.5, 1), more = TRUE)
print(q2, position = c(0.5, 0.5, 1, 1), more = TRUE)
print(q3, position = c(0, 0, 0.5, 0.5), more = TRUE)
print(q4, position = c(0.5, 0, 1, 0.5))

All qq-plots suggest the normality assumption is reasonable.

Obama Era

modB10B = lm(P10 ~ Period, data = ObamaPerB)
modB25B = lm(P25 ~ Period, data = ObamaPerB)
modB50B = lm(P50 ~ Period, data = ObamaPerB)
modB75B = lm(P75 ~ Period, data = ObamaPerB)
modB90B = lm(P90 ~ Period, data = ObamaPerB)
modB10B

Call:
lm(formula = P10 ~ Period, data = ObamaPerB)

Coefficients:
(Intercept)       Period  
    270.872        1.179  
modB25B

Call:
lm(formula = P25 ~ Period, data = ObamaPerB)

Coefficients:
(Intercept)       Period  
    346.702        1.745  
modB50B

Call:
lm(formula = P50 ~ Period, data = ObamaPerB)

Coefficients:
(Intercept)       Period  
    514.435        2.238  
modB75B

Call:
lm(formula = P75 ~ Period, data = ObamaPerB)

Coefficients:
(Intercept)       Period  
    756.113        3.748  
modB90B

Call:
lm(formula = P90 ~ Period, data = ObamaPerB)

Coefficients:
(Intercept)       Period  
    924.691        9.544  

Diagnostics for Obama era

p1 = xyplot(P10 ~ Period, data = ObamaPerB, type = c("p","r"), main = "Obama 10th Percentile")
p2 = xyplot(P25 ~ Period, data = ObamaPerB, type = c("p","r"), main = "Obama 25th Percentile")
p3 = xyplot(P75 ~ Period, data = ObamaPerB, type = c("p","r"), main = "Obama 75th Percentile")
p4 = xyplot(P90 ~ Period, data = ObamaPerB, type = c("p","r"), main = "Obama 90th Percentile")
print(p1, position = c(0, 0.5, 0.5, 1), more = TRUE)
print(p2, position = c(0.5, 0.5, 1, 1), more = TRUE)
print(p3, position = c(0, 0, 0.5, 0.5), more = TRUE)
print(p4, position = c(0.5, 0, 1, 0.5))

The xyplots all confirm the linearity assumption is reasonable, though each plot shows a slight acceleration of growth in the Trump era (Periods 68 to 79). The most pronounced acceleration appears visually in the 10th percentile xyplot.

q1 = qqmath(~resid(modB10B),type = c("p", "r"), main = "Obama 10th Percentile")
q2 = qqmath(~resid(modB25B),type = c("p", "r"), main = "Obama 25th Percentile")
q3 = qqmath(~resid(modB75B),type = c("p", "r"), main = "Obama 75th Percentile")
q4 = qqmath(~resid(modB90B),type = c("p", "r"), main = "Obama 90th Percentile")
print(q1, position = c(0, 0.5, 0.5, 1), more = TRUE)
print(q2, position = c(0.5, 0.5, 1, 1), more = TRUE)
print(q3, position = c(0, 0, 0.5, 0.5), more = TRUE)
print(q4, position = c(0.5, 0, 1, 0.5))

All qq-plots suggest the normality assumption is reasonable.

Obama Last 3 Years

modB10BL3 = lm(P10 ~ Period, data = ObamaPerBL3)
modB25BL3 = lm(P25 ~ Period, data = ObamaPerBL3)
modB50BL3 = lm(P50 ~ Period, data = ObamaPerBL3)
modB75BL3 = lm(P75 ~ Period, data = ObamaPerBL3)
modB90BL3 = lm(P90 ~ Period, data = ObamaPerBL3)
modB10BL3

Call:
lm(formula = P10 ~ Period, data = ObamaPerBL3)

Coefficients:
(Intercept)       Period  
    190.737        2.507  
modB25BL3

Call:
lm(formula = P25 ~ Period, data = ObamaPerBL3)

Coefficients:
(Intercept)       Period  
    242.545        3.455  
modB50BL3

Call:
lm(formula = P50 ~ Period, data = ObamaPerBL3)

Coefficients:
(Intercept)       Period  
    408.914        3.958  
modB75BL3

Call:
lm(formula = P75 ~ Period, data = ObamaPerBL3)

Coefficients:
(Intercept)       Period  
    800.737        3.007  
modB90BL3

Call:
lm(formula = P90 ~ Period, data = ObamaPerBL3)

Coefficients:
(Intercept)       Period  
   1027.526        7.769  

Diagnostics for Obama Last 3 Years

p1 = xyplot(P10 ~ Period, data = ObamaPerBL3, type = c("p","r"), main = "Obama Last 3 Yrs 10th Percentile")
p2 = xyplot(P25 ~ Period, data = ObamaPerBL3, type = c("p","r"), main = "Obama Last 3 Yrs 25th Percentile")
p3 = xyplot(P75 ~ Period, data = ObamaPerBL3, type = c("p","r"), main = "Obama Last 3 Yrs 75th Percentile")
p4 = xyplot(P90 ~ Period, data = ObamaPerBL3, type = c("p","r"), main = "Obama Last 3 Yrs 90th Percentile")
print(p1, position = c(0, 0.5, 0.5, 1), more = TRUE)
print(p2, position = c(0.5, 0.5, 1, 1), more = TRUE)
print(p3, position = c(0, 0, 0.5, 0.5), more = TRUE)
print(p4, position = c(0.5, 0, 1, 0.5))

The xyplots all confirm the linearity assumption is reasonable, though each plot shows a slight acceleration of growth in the Trump era (Periods 68 to 79). The most pronounced acceleration appears visually in the 10th percentile xyplot.

q1 = qqmath(~resid(modB10BL3),type = c("p", "r"), main = "Obama Last 3 Yrs 10th Percentile")
q2 = qqmath(~resid(modB25BL3),type = c("p", "r"), main = "Obama Last 3 Yrs 25th Percentile")
q3 = qqmath(~resid(modB75BL3),type = c("p", "r"), main = "Obama Last 3 Yrs 75th Percentile")
q4 = qqmath(~resid(modB90BL3),type = c("p", "r"), main = "Obama Last 3 Yrs 90th Percentile")
print(q1, position = c(0, 0.5, 0.5, 1), more = TRUE)
print(q2, position = c(0.5, 0.5, 1, 1), more = TRUE)
print(q3, position = c(0, 0, 0.5, 0.5), more = TRUE)
print(q4, position = c(0.5, 0, 1, 0.5))

All qq-plots suggest the normality assumption is reasonable.

5. Testing Trump Wage Models for Significantly Higher Growth Rates

We will use bootstrapping confidence intervals rather than \(t\)-intervals because the bootstrapping approach is more robust with respect to violations of the normality assumption than \(t\)-procedures. A few of the qq-plots suggested the normality assumption was at least slightly at issue. Since we are hypothesis testing with confidence intervals, we will create 90% confidence interevals and 98% confidence intervals to correspond to one-tailed test of significance at the 0.05 and 0.01 levels respectively.

All Wage Earners

Trump Era: 10th Percentile

bootstrap = do(2000) * coef(lm(P10 ~ Period, data=resample(TrumpPerc)))
round(qdata(~Period, p=c(0.05, 0.95), data=bootstrap),2)
  5%  95% 
5.07 6.18 
round(qdata(~Period, p=c(0.01, 0.99), data=bootstrap),2)
  1%  99% 
4.70 6.51 

Trump Era: 25th Percentile

bootstrap = do(2000) * coef(lm(P25 ~ Period, data=resample(TrumpPerc)))
round(qdata(~Period, p=c(0.05, 0.95), data=bootstrap),2)
  5%  95% 
3.95 5.15 
round(qdata(~Period, p=c(0.01, 0.99), data=bootstrap),2)
  1%  99% 
3.69 5.44 

Trump Era: Median

bootstrap = do(2000) * coef(lm(Median ~ Period, data=resample(TrumpMed)))
round(qdata(~Period, p=c(0.05, 0.95), data=bootstrap),2)
  5%  95% 
5.55 8.39 
round(qdata(~Period, p=c(0.01, 0.99), data=bootstrap),2)
  1%  99% 
5.04 9.00 

Trump Era: 75th Percentile

bootstrap = do(2000) * coef(lm(P75 ~ Period, data=resample(TrumpPerc)))
round(qdata(~Period, p=c(0.05, 0.95), data=bootstrap),2)
   5%   95% 
 9.64 13.78 
round(qdata(~Period, p=c(0.01, 0.99), data=bootstrap),2)
   1%   99% 
 8.51 14.62 

Trump Era: 90th Percentile

bootstrap = do(2000) * coef(lm(P90 ~ Period, data=resample(TrumpPerc)))
round(qdata(~Period, p=c(0.05, 0.95), data=bootstrap),2)
   5%   95% 
18.99 29.52 
round(qdata(~Period, p=c(0.01, 0.99), data=bootstrap),2)
   1%   99% 
15.67 32.73 

Wage Growth for African Americans

Trump Era: 10th Percentile

bootstrap = do(2000) * coef(lm(P10 ~ Period, data=resample(TrumpPerB)))
round(qdata(~Period, p=c(0.05, 0.95), data=bootstrap),2)
  5%  95% 
2.41 4.13 
round(qdata(~Period, p=c(0.01, 0.99), data=bootstrap),2)
  1%  99% 
2.24 4.45 

Trump Era: 25th Percentile

bootstrap = do(2000) * coef(lm(P25 ~ Period, data=resample(TrumpPerB)))
round(qdata(~Period, p=c(0.05, 0.95), data=bootstrap),2)
  5%  95% 
4.60 7.05 
round(qdata(~Period, p=c(0.01, 0.99), data=bootstrap),2)
  1%  99% 
3.85 7.78 

Trump Era: Median

Neither of the hypothesis tests would reject the null, not at the 0.05 significance level nor the 0.01 level. An 80% confidence interval was added to this model only to check if the null would be rejected in the one-tailed test at the very liberal 0.1 level. It was, but that does not indicate significance. We estimate the one-tailed \(p\)-value between 0.10 and 0.05, and fail to reject the null. We find no evidence for a Trump growth rate that is significant higher than the historic trend.

bootstrap = do(2000) * coef(lm(P50 ~ Period, data=resample(TrumpPerB)))
round(qdata(~Period, p=c(0.10, 0.90), data=bootstrap),2)
 10%  90% 
4.74 7.90 
round(qdata(~Period, p=c(0.05, 0.95), data=bootstrap),2)
  5%  95% 
4.24 8.55 
round(qdata(~Period, p=c(0.01, 0.99), data=bootstrap),2)
   1%   99% 
 3.12 10.24 

Trump Era: 75th Percentile

bootstrap = do(2000) * coef(lm(P75 ~ Period, data=resample(TrumpPerB)))
round(qdata(~Period, p=c(0.05, 0.95), data=bootstrap),2)
   5%   95% 
 8.84 13.32 
round(qdata(~Period, p=c(0.01, 0.99), data=bootstrap),2)
   1%   99% 
 7.90 14.88 

Trump Era: 90th Percentile

bootstrap = do(2000) * coef(lm(P90 ~ Period, data=resample(TrumpPerc)))
round(qdata(~Period, p=c(0.05, 0.95), data=bootstrap),2)
   5%   95% 
19.39 29.39 
round(qdata(~Period, p=c(0.01, 0.99), data=bootstrap),2)
   1%   99% 
16.44 32.32 
LS0tDQp0aXRsZTogIldhZ2UgR3Jvd3RoIEFuYWx5c2lzOiBUcnVtcCBFcmEgdnMuIEhpc3RvcmljIFRyZW5kcyINCm91dHB1dDogaHRtbF9ub3RlYm9vaw0KLS0tDQojIDxzcGFuIHN0eWxlPSJjb2xvcjogYmx1ZTsiPlRoZSBQb3B1bGlzdCBUcnVtcCBFY29ub215PC9zcGFuPg0KDQpEb25hbGQgSi4gVHJ1bXAgY2FtcGFpZ25lZCBpbiAyMDE2IG9uIHRheCBjdXRzLCBkZXJlZ3VsYXRpb24sIHRhcmlmZnMgb24gZm9yZWlnbiBpbXBvcnRzLCBleGl0aW5nIGdsb2JhbCB0cmFkZSB0cmVhdGllcyBsaWtlIFRQUCBhbmQgcmVuZWdvdGlhdGluZyBOQUZUQS4gVHJ1bXAgY2xhaW1lZCBoaXMgYXBwcm9hY2ggd291bGQgaGVscCBVLlMuIHdhZ2UgZWFybmVycyBieSByZXZlcnNpbmcgdGhlIGdsb2JhbGlzdCB0cmVuZHMgdGhhdCBzaGlwcGVkIG1pZGRsZSBjbGFzcyBqb2JzIG92ZXJzZWFzLiBUbyBzdWdnZXN0IHRoYXQgZXhwZXJ0cyBkaXNhZ3JlZWQgd291bGQgYmUgYSBtYXJrZWQgdW5kZXJzdGF0ZW1lbnQuIFRydW1wJ3MgcG9wdWxpc3QgZWNvbm9taWMgbmF0aW9uYWxpc20gd2FzIDxhIGhyZWYgPSBodHRwczovL3d3dy53YXNoaW5ndG9ucG9zdC5jb20vb3BpbmlvbnMvYS1wcmVzaWRlbnQtdHJ1bXAtY291bGQtZGVzdHJveS10aGUtd29ybGQtZWNvbm9teS8yMDE2LzEwLzA1L2Y3MDAxOWMwLTg0ZGYtMTFlNi05MmMyLTE0YjY0ZjNkNDUzZl9zdG9yeS5odG1sPnBpbGxvcmllZCBieSBwdW5kaXRzPC9hPi4NCg0KIyMgUmVzZWFyY2ggUXVlc3Rpb25zDQoNCjEuIERpZCBUcnVtcCBlcmEgd2FnZSBncm93dGggcGF0dGVybnMgc2lnbmlmaWNhbnRseSBleGNlZWQgdGhlIGhpc3RvcmljIHRyZW5kPyBJZiBzbywgdG8gd2hhdCBkZWdyZWUgYW5kIGZvciB3aGljaCBzdHJhdGEgb2Ygd2FnZSBlYXJuZXI/DQoyLiBIb3cgZGlkIFRydW1wIGVyYSB3YWdlIGdyb3d0aCBjb21wYXJlIHRvIHRoZSBPYmFtYSBlcmE/DQozLiBIb3cgZGlkIFRydW1wIGVyYSB3YWdlIGdyb3d0aCBjb21wYXJlIHRvIHRoZSBsYXN0IHRocmVlIHllYXJzIG9mIHRoZSBPYmFtYSBlcmEsIGUuZy4gdGhlIGNoZXJyeS1waWNrZWQgYmVzdCB0aHJlZSB5ZWFycyBmcm9tIHRoYXQgZXJhPw0KDQoqKlJlc3VsdHMgU3VtbWFyeS4qKiBUaGUgVHJ1bXAgZXJhIHdhZ2UgZ3Jvd3RoIHNpZ25pZmljYW50bHkgZXhjZWVkZWQgdGhlIGhpc3RvcmljIHRyZW5kIGFuZCB0aGUgT2JhbWEgZXJhIHRyZW5kcyBhdCB0aGUgMC4wMSBsZXZlbCBpbiB2aXJ0dWFsbHkgYWxsIGNhc2VzLiBUaGUgcmVzdWx0cyBhcmUgc3VtbWFyaXplZCBpbiB0aGUgY2hhcnQgYmVsb3cuIEZvcnR5IGxpbmVhciBtb2RlbHMgd2VyZSBhbmFseXplZCBpbmNsdWRpbmcgZGlhZ25vc3RpY3MsIGFuZCB0aGUgc2xvcGUgY29lZmZpY2llbnRzIGZyb20gdGhlIHJlZ3Jlc3Npb24gbGluZXMgYXBwZWFyIGluIHRoZSB0YWJsZSByZXByZXNlbnRpbmcgZ3Jvd3RoIHJhdGVzIGZvciB3ZWVrbHkgd2FnZXMuDQoNCiMjIyMgPHNwYW4gc3R5bGU9ImNvbG9yOiBibHVlOyI+VVMgV2Vla2x5IFdhZ2UgR3Jvd3RoIFBlciBRdWFydGVyOjwvc3Bhbj4gPHNwYW4gc3R5bGU9ImNvbG9yOiByZWQ7Ij5BbGwgV2FnZSBFYXJuZXJzPC9zcGFuPg0KDQokJFxiZWdpbnthcnJheX17bGNjY2NjfQ0KJlx0ZXh0YmZ7MTB0aCBQZXJjZW50aWxlfSZcdGV4dGJmezI1dGggUGVyY2VudGlsZX0mXHRleHRiZntNZWRpYW59Jlx0ZXh0YmZ7NzV0aCBQZXJjZW50aWxlfSZcdGV4dGJmezkwdGggUGVyY2VudGlsZX1cXA0KXHRleHR7SGlzdG9yaWN9ICYgXCQyLjAzJiBcJDIuNzcmIFwkNC4wNSYgXCQ3LjQ5JiBcJDEyLjAyXFwNClx0ZXh0e1RydW1wIEVyYX0gJlwkNC45NSAmIFwkNS4xNCAmIFwkNi45MCAmIFwkMTAuNDUgJiBcJDIwLjcyXFwNClx0ZXh0e09iYW1hIEVyYX0gJiBcJDEuNDkgJiBcJDEuNDggJiBcJDMuMjAgJiBcJDYuMDMgJiBcJDguMzRcXA0KXHRleHR7T2JhbWEgTGFzdCAzIFlyc30gJiBcJDEuNjggJiBcJDIuMDYgJiBcJDUuMDggJiBcJDYuNDAgJiBcJDYuNzANClxlbmR7YXJyYXl9JCQNCg0KVGhlIGhpc3RvcmljIG1lZGlhbiB3YXMgY2FsY3VsYXRlZCBiYXNlZCBvbiBhIDQwLXllYXIgdHJlbmQgKHNpbmNlIFExIG9mIDE5ODEpLiBUaGUgb3RoZXIgaGlzdG9yaWMgdmFsdWVzIGFyZSBjYWxjdWxhdGVkIGJhc2VkIHVwb24gYSAyMC15ZWFyIHRyZW5kIChzaW5jZSBRMSBvZiAyMDAwKSBiZWNhdXNlIHRoZSBwdWJsaWNseSBhdmFpbGFibGUgZGF0YSBkaWQgbm90IGdvIGFueSBmdXJ0aGVyIGJhY2suDQoNClRoZSA8YSBocmVmID0gaHR0cHM6Ly93d3cuYmxzLmdvdi8+VS5TLiBCdXJlYXUgb2YgTGFib3IgU3RhdGlzdGljczwvYT4gc3RhdGVzIHRoYXQgdGhlaXIgZGF0YSBhcmUgaW5mbGF0aW9uLWFkanVzdGVkIHZhbHVlcyByZXByZXNlbnRlZCBpbiAyMDIwIChwcmVzZW50IGRheSkgZG9sbGFycy4NCg0KIyMjIyA8c3BhbiBzdHlsZT0iY29sb3I6IGJsdWU7Ij5VUyBXZWVrbHkgV2FnZSBHcm93dGggUGVyIFF1YXJ0ZXI6PC9zcGFuPiA8c3BhbiBzdHlsZT0iY29sb3I6IHJlZDsiPkFmcmljYW4gQW1lcmljYW4gV2FnZSBFYXJuZXJzIE9ubHk8L3NwYW4+DQoNCiQkXGJlZ2lue2FycmF5fXtsY2NjY2N9DQomXHRleHRiZnsxMHRoIFBlcmNlbnRpbGV9Jlx0ZXh0YmZ7MjV0aCBQZXJjZW50aWxlfSZcdGV4dGJme01lZGlhbn0mXHRleHRiZns3NXRoIFBlcmNlbnRpbGV9Jlx0ZXh0YmZ7OTB0aCBQZXJjZW50aWxlfVxcDQpcdGV4dHtIaXN0b3JpY30gJiBcJDEuNjUgJiBcJDIuMjUgJiBcJDMuMTEgJiBcJDUuMjYgJiBcJDkuMjNcXA0KXHRleHR7VHJ1bXAgRXJhfSAmIFwkMy4yNCAmIFwkNC42NiAmIFwkNC41NCAmIFwkOS44MiAmIFwkMTEuNTdcXA0KXHRleHR7T2JhbWEgRXJhfSAmIFwkMC44OCAmIFwkMS4zMiAmIFwkMS42NiAmIFwkMy43OSAmIFwkOS44NVxcDQpcdGV4dHtPYmFtYSBMYXN0IDMgWXJzfSAmIFwkMS42OCAmIFwkMS42NSAmIFwkMC45MiAmIFwkMi40NyAmIFwkNC42MA0KXGVuZHthcnJheX0kJA0KDQpBbGwgaGlzdG9yaWMgdmFsdWVzIGFyZSBjYWxjdWxhdGVkIGJhc2VkIHVwb24gYSAyMC15ZWFyIHRyZW5kIChzaW5jZSBRMSBvZiAyMDAwKS4NCg0KIyMjIyBIeXBvdGhlc2lzIFRlc3RzDQoNCkdlbmVyYWxseSwgc3R1ZGVudHMgYXJlIGNhdXRpb25lZCBhZ2FpbnN0IHVzaW5nIGxpbmVhciByZWdyZXNzaW9uIG1vZGVsaW5nIGZvciB0aW1lIHNlcmllcyBkYXRhLiBUaGUgb25lIGV4Y2VwdGlvbiBpcyB0aGUgdXNhZ2UgYmVsb3c6IGRldGVybWluaW5nIGdyb3d0aCB0cmVuZHMgb3ZlciBlcXVhbGx5IHNwYWNlZCB0aW1lIGludGVydmFscywgYSBwcmFjdGljZSB3aWRlbHkgdXRpbGl6ZWQgZXNwZWNpYWxseSBmb3IgZWNvbm9taWMgZGF0YS4NCg0KQm9vdHN0cmFwcGluZyBjb25maWRlbmNlIGludGVydmFscyBmb3IgdGhlIHNsb3BlIGNvZWZmaWNpZW50IHdlcmUgY3JlYXRlZCBmb3IgZWFjaCBvZiB0aGUgZWlnaHQgVHJ1bXAgZXJhIG1vZGVscy4gVGhlIDkwJSBhbmQgOTglIGNvbmZpZGVuY2UgaW50ZXJ2YWxzIHdlcmUgZ2VuZXJhdGVkIHRvIHRlc3QgdGhlIG9uZS10YWlsZWQgaHlwb3RoZXNpcyB0aGF0IHRoZSBUcnVtcCBlcmEgZ3Jvd3RoIHJhdGUgd2FzIHNpZ25pZmljYW50bHkgaGlnaGVyIHRoYW4gKGEpIHRoZSBoaXN0b3JpYyBncm93dGggcmF0ZSwgKGIpIHRoZSBPYmFtYSBlcmEgZ3Jvd3RoIHJhdGUgYW5kIChjKSB0aGUgZ3Jvd3RoIGR1cmluZyB0aGUgY2hlcnJ5LXBpY2tlZCBsYXN0IHRocmVlIHllYXJzIG9mIHRoZSBPYmFtYSBlcmEuIA0KDQojIDxzcGFuIHN0eWxlPSJjb2xvcjogYmx1ZTsiPlN1bW1hcnkgb2YgUmVzdWx0czwvc3Bhbj4NCg0KSW4gZXZlcnkgY2FzZSBidXQgb25lLCB0aGUgVHJ1bXAgZXJhIGdyb3d0aCB3YXMgc2lnbmlmaWNhbnRseSBoaWdoZXIgdGhhbiBhbGwgdGhyZWUgb3RoZXIgZ3Jvd3RoIHJhdGVzIGF0IHRoZSAwLjAxIGxldmVsLiBGb3IgdGhlIG1lZGlhbiB3YWdlIGZvciBBZnJpY2FuIEFtZXJpY2FucywgdGhlIFRydW1wIGVyYSBncm93dGggd2FzIG5vdCBzaWduaWZpY2FudGx5IGhpZ2hlciB0aGFuIHRoZSBoaXN0b3JpYyBtZWRpYW4gYXQgdGhlIDAuMDUgbGV2ZWwgYnV0IHdhcyBhdCB0aGUgMC4xIGxldmVsLiBIb3dldmVyLCB3aGVuIGV2YWx1YXRpbmcgdGhlIHNpZ25pZmljYW5jZSBmb3IgaHlwb3RoZXNpcyB0aGF0IHRoZSBUcnVtcCBlcmEgZ3Jvd3RoIHdhcyBoaWdoZXIgdGhhbiBmb3IgdGhlIHR3byBPYmFtYSBjYXNlcywgYm90aCB3ZXJlIHNpZ25pZmljYW50IGF0IHRoZSAwLjAxIGxldmVsLiAqKlRoZSBUcnVtcCBlcmEgZ3Jvd3RoIHJhdGVzIGluIHdhZ2VzIHdlcmUgZXNwZWNpYWxseSBsYXJnZSBmb3IgdGhlIDEwdGggYW5kIDI1dGggcGVyY2VudGlsZXMgYW5kIGZvciB0aGUgbW9kZWxzIHRoYXQgdXNlZCBBZnJpY2FuIEFtZXJpY2FuIHdhZ2UgZWFybmVycyBvbmx5LioqDQoNCjxkaXYgc3R5bGU9ImZsb2F0OnJpZ2h0OyBtYXJnaW46IDhweDsgYm9yZGVyOjJweCBibGFjayBzb2xpZDsgcGFkZGluZzogMHB4IDEwcHggNXB4Ij4NCiMjIyA8c3BhbiBzdHlsZT0iY29sb3I6IHJlZDsiPkluaXRpYWxpemluZyBSU3R1ZGlvPC9zcGFuPg0KVGhlIGNvZGUgYmxvY2sgYmVsb3cgdXNlcyBlbnN1cmVzIHRoYXQgdGhlICoqTW9zYWljKiogcGFja2FnZSBpcyBsb2FkZWQgYW5kIHdpbGwgaW1wb3J0IHRoZSBVLlMuIHdhZ2VzIGRhdGEgZnJhbWVzICoqTWVkKiosICoqUGVyYyoqIGFuZCAqKlBlcmNCKiogd2hpY2ggd2VyZSBjcmVhdGVkIHVzaW5nIGRvd25sb2FkcyBmcm9tIHRoZSA8YSBocmVmID0gaHR0cHM6Ly93d3cuYmxzLmdvdi8+VS5TLiBCdXJlYXUgb2YgTGFib3IgU3RhdGlzdGljczwvYT4gdXNpbmcgPGEgaHJlZiA9IGh0dHBzOi8vd3d3LmJscy5nb3Yvd2ViYXBwcy9sZWdhY3kvY3Bzd2t0YWIyLmh0bT5UYWJsZSAyPC9hPiBmb3IgdGhlICoqTWVkKiogZGF0YSBzZXQgYW5kIDxhIGhyZWYgPSBodHRwczovL3d3dy5ibHMuZ292L3dlYmFwcHMvbGVnYWN5L2Nwc3drdGFiNS5odG0+VGFibGUgNTwvYT4gZm9yICoqUGVyYyoqIGFuZCAqKlBlckIqKiBkYXRhIHNldHMuIFRoZSBjaGFydHMgd2VyZSBjb2VyY2VkIGludG8gZGF0YSBmcmFtZXMgdXNpbmcgTWljcm9zb2Z0IEV4Y2VsJ3MgKip2bG9va3VwKiogZnVuY3Rpb24uDQoNCmBgYHtyfQ0KbGlicmFyeShtb3NhaWMpDQpsaWJyYXJ5KHJlYWR4bCkNCkRhdGEzMzUwID0gcmVhZF9leGNlbCgiRGF0YTMzNTAueGxzeCIpDQpNZWQgPSByZWFkX2V4Y2VsKCJNZWQueGxzeCIpDQpNZWRVcGRhdGUgPSByZWFkX2V4Y2VsKCJNZWRVcGRhdGUueGxzeCIpDQpQZXJjID0gcmVhZF9leGNlbCgiUGVyYy54bHN4IikNClBlckIgPSByZWFkX2V4Y2VsKCJQZXJjQi54bHN4IikNClBlckggPSByZWFkX2V4Y2VsKCJQZXJILnhsc3giKQ0KYGBgDQo8L2Rpdj4NCg0KDQojIDxzcGFuIHN0eWxlPSJjb2xvcjogYmx1ZTsiPjEuIEVsaW1pbmF0aW5nIENPVklEIE91dGxpZXJzPC9zcGFuPg0KVGhlIGNoYXJ0IGJlbG93IHNob3dzIG91dGxpZXJzIGluIDIwMjAgUTEgYW5kIFEyIGR1ZSB0byBDT1ZJRCBsYXlvZmZzIG1haW5seSBmb3IgdGhvc2UgZWFybmluZyBiZWxvdyB0aGUgbWVkaWFuIHdhZ2UuIFRoaXMgc3Bpa2UgaW4gbWVkaWFuIHdhZ2UgZ3Jvd3RoIHdvdWxkIGFydGlmaWNpYWxseSBiaWFzIHRoZSBUcnVtcCBlcmEgZ3Jvd3RoIHJhdGVzLCBhbmQgdGhlIG91dGxpZXJzIGhhdmUgdGh1cyBiZWVuIGVsaW1pbmF0ZWQgZnJvbSB0aGUgZGF0YSBzZXRzIGFuZCBjb21wYXJpc29ucy4NCg0KYGBge3J9DQp4eXBsb3QoTWVkaWFuIH4gUGVyaW9kLCBkYXRhID0gTWVkLCANCiAgICAgICB4bGFiID0gIlF1YXJ0ZXJzIHNpbmNlIDE5ODEgUTEiLCANCiAgICAgICB5bGFiID0gIk51bWJlciBvZiBXYWdlIEVhcm5lcnMgKGluIHRob3VzYW5kcykiKQ0KYGBgDQoNCldoeSBkaWQgbWVkaWFuIHdlZWtseSB3YWdlcyAqKmluY3JlYXNlKiogd2hlbiBDT1ZJRCBzaHV0ZG93bnMgaGl0PyBUaGUgdmFzdCBtYWpvcml0eSBvZiB0aG9zZSBsYWlkIG9mZiB3ZXJlIGhhZCBlYXJuaW5ncyBiZWxvdyB0aGUgbWVkaWFuIGNhdXNpbmcgYW4gdXB3YXJkIHNoaWZ0IGluIHRoZSBtZWRpYW4uDQoNCmBgYHtyfQ0KeHlwbG90KEVhcm5lcnMgfiBQZXJpb2QsIGRhdGEgPSBNZWQsIA0KICAgICAgIHhsYWIgPSAiUXVhcnRlcnMgc2luY2UgMTk4MSBRMSIsIA0KICAgICAgIHlsYWIgPSAiTnVtYmVyIG9mIFdhZ2UgRWFybmVycyAoaW4gdGhvdXNhbmRzKSIpDQpgYGANCg0KIyMjIyBJIGhhdmUgdXBkYXRlZCB0aGUgd2FnZSBlYXJuZXJzIHBpY3R1cmUgbm93IHRoYXQgUTMgZGF0YSBpcyBhdmFpbGFibGUuDQoNCmBgYHtyfQ0KeHlwbG90KEVhcm5lcnMgfiBQZXJpb2QsIGRhdGEgPSBNZWRVcGRhdGUsIA0KICAgICAgIHhsYWIgPSAiUXVhcnRlcnMgc2luY2UgMTk4MSBRMSIsIA0KICAgICAgIHlsYWIgPSAiTnVtYmVyIG9mIFdhZ2UgRWFybmVycyAoaW4gdGhvdXNhbmRzKSIpDQpgYGANCg0KYGBge3J9DQpuZXdNZWQgPSBzdWJzZXQoIE1lZCAsIFBlcmlvZCA8PSAxNTUgKQ0KYGBgDQoNClRvIGJlIGNsZWFyLCB0aGUgb3V0bGllcnMgd291bGQgKipoZWxwKiogVHJ1bXAgYnkgYXJ0aWZpY2lhbGx5IGluZmxhdGluZyB3YWdlIGdyb3d0aCBkdXJpbmcgaGlzIHRlcm0uIEVsaW1pbmF0aW5nIDIwMjAgUTEgYW5kIFEyIGFsbG93IGZvciBhbiBhbmFseXNpcyBhYnNlbnQgdGhlIGJsYWNrIHN3YW4gQ09WSUQgZXZlbnQuIE5vdGljZSB0aGUgdXB0aWNrIGR1cmluZyB0aGUgVHJ1bXAgYWRtaW5pc3RyYXRpb24gc3RpbGwganVtcHMgYWJvdmUgdGhlIDQwLXllYXIgdHJlbmQgbGluZS4NCg0KIyMjIyAjIDxzcGFuIHN0eWxlPSJjb2xvcjogcmVkOyI+VXBkYXRlOiBOdW1iZXIgb2YgV2FnZSBFYXJuZXJzIHVwZGF0ZWQgdG8gaW5jbHVkZSAyMDIwLjwvc3Bhbj4NCg0KYGBge3J9DQp4eXBsb3QoRWFybmVycyB+IFBlcmlvZCwgZGF0YSA9IE1lZCwgDQogICAgICAgeGxhYiA9ICJRdWFydGVycyBzaW5jZSAxOTgxIFExIiwgDQogICAgICAgeWxhYiA9ICJOdW1iZXIgb2YgV2FnZSBFYXJuZXJzIChpbiB0aG91c2FuZHMpIikNCmBgYA0KDQpgYGB7cn0NCnh5cGxvdCggTWVkaWFuIH4gUGVyaW9kLCBkYXRhID0gbmV3TWVkICwgDQogICAgICAgIHR5cGUgPSBjKCJwIiwiciIpICwNCiAgICAgICAgeGxhYiA9ICJRdWFydGVycyBzaW5jZSAxOTgxIFExIiAsIA0KICAgICAgICB5bGFiID0gIlUuUy4gTWVkaWFuIFdhZ2UiKQ0KYGBgDQoNCiMgPHNwYW4gc3R5bGU9ImNvbG9yOiBibHVlOyI+Mi4gQnVpbGRpbmcgYSBMaW5lYXIgTW9kZWwgZm9yIEdyb3d0aCBvZiBVLlMuIE1lZGlhbiBXYWdlPC9zcGFuPg0KDQpgYGB7cn0NCm1vZDUwID0gbG0oIE1lZGlhbiB+IFBlcmlvZCwgZGF0YSA9IG5ld01lZCkNCm1vZDUwDQpyc3F1YXJlZChtb2Q1MCkNCmBgYA0KYGBge3J9DQpxcW1hdGgofnJlc2lkKG1vZDUwKSkNCmBgYA0KDQoqKlJlc3VsdHMuKiogVGhlIHh5cGxvdCBpbmRpY2F0ZXMgc3Ryb25nIGxpbmVhcml0eSwgYW5kIHRoZSBxcS1wbG90IGluZGljYXRlcyBhcHByb3hpbWF0ZWx5IG5vcm1hbGl0eSBvZiByZXNpZHVhbHMuDQoNCiMgPHNwYW4gc3R5bGU9ImNvbG9yOiBibHVlOyI+My4gTGluZWFyIE1vZGVscyBmb3IgVHJ1bXAgYW5kIE9iYW1hIEVyYXM8L3NwYW4+DQoNClNpbmNlIFUuUy4gUHJlc2lkZW50cyB0YWtlIG9mZmljZSBvbiBKYW51YXJ5IDIwIG9mIHRoZSB5ZWFyIGZvbGxvd2luZyB0aGVpciBlbGVjdGlvbiwgdGhlIGRhdGEgc2V0IGJlZ2lucyB3aXRoIDE5ODEgUTEgd2hlbiBSZWFnYW4gdG9vayBvZmZpY2UgKFBlcmlvZCAwKS4gQnVzaCA0MSB0b29rIG9mZmljZSA4IHllYXJzICgzMiBxdWFydGVycykgbGF0ZXIsIHNvIGhpcyB0ZXJtIGJlZ2lucyBpbiBQZXJpb2QgMzIuIENsaW50b24ncyB0ZXJtIGJlZ2lucyAxMiBxdWFydGVycyBsYXRlciBpbiBQZXJpb2QgNDguIEJ1c2ggNDMncyB0ZXJtIGJlZ2lucyAzMiBxdWFydGVycyBsYXRlciBpbiBQZXJpb2QgODAuIE9iYW1hJ3MgdGVybSBiZWdpbnMgMzIgcXVhcnRlcnMgbGF0ZXIgaW4gUGVyaW9kIDExMi4gVHJ1bXAncyB0ZXJtIGJlZ2lucyAzMiBxdWFydGVycyBhZnRlciB0aGF0IGluIFBlcmlvZCAxNDQuIFRoZSBmaW5hbCBmb3VyIHF1YXJ0ZXJzIG9mIHRoZSBDYXJ0ZXIgYWRtaW5pc3RyYXRpb24gd2VyZSBub3QgaW5jbHVkZWQgaW4gdGhpcyBhbmFseXNpcyBkZXNwaXRlIGJlaW5nIHByZXNlbnQgaW4gdGhlIG9yaWdpbmFsIGRhdGEuIFRoZSBjaG9pY2Ugd2FzIG1hZGUgdG8gaW5jbHVkZSBvbmx5IGRhdGEgdGhhdCBjb3ZlcmVkIGVudGlyZSBwcmVzaWRlbnRpYWwgdGVybXMuIE5vdGUgdGhhdCwgZm9yIGV4YW1wbGUsIEJhcmFjayBPYmFtYSdzIHRlcm0gcnVucyBmcm9tIFExIDIwMDkgdG8gUTQgMjAxNiwgYW5kIERvbmFsZCBUcnVtcCdzIHRlcm0gYmVnaW5zIGluIFExIDIwMTcuIEFnYWluLCBieSB0cnVuY2F0aW5nIHRoZSBUcnVtcCBlcmEgYXQgUGVyaW9kIDE1NSAoUTQgMjAxOSksIHdlIGF2b2lkIHRoZSBDT1ZJRCBvdXRsaWVycyBza2V3aW5nIHRoZSBhbmFseXNpcyBvZiB0aGUgVHJ1bXAgZGF0YSBpbiBhIGRpcmVjdGlvbiB0aGF0IHdvdWxkIGJlIGRlY2VwdGl2ZWx5IGhlbHBmdWwgdG8gVHJ1bXAuIFBlcmlvZCAxNjAgaXMgUTEgMjAyMSwgNDAgeWVhcnMgYW5kIDE2MCBxdWFydGVycyBhZnRlciBSZWFnYW4sIHNvIFBlcmlvZCAxNTYgaXMgUTEgMjAyMC4NCg0KYGBge3J9DQpUcnVtcE1lZCA9IHN1YnNldCggTWVkICwgUGVyaW9kID49ICAxNDQgJiBQZXJpb2QgPD0gMTU1KQ0KT2JhbWFNZWQgPSBzdWJzZXQoIE1lZCAsIFBlcmlvZCA+PSAxMTIgJiBQZXJpb2QgPD0gMTQzICkNCk9iYW1hTWVkTDMgPSBzdWJzZXQoIE1lZCAsIFBlcmlvZCA+PSAxMzIgJiBQZXJpb2QgPD0gMTQzICkNCmBgYA0KDQojIyBDb21wYXJpbmcgTWVkaWFuIFdhZ2UgR3Jvd3RoOiBIaXN0b3JpYyB2cy4gVHJ1bXAgdnMuIE9iYW1hDQoNCkNyZWF0aW5nIHRoZSBsaW5lYXIgbW9kZWxzIGZvciBUdW1wLCBPYmFtYSwgYW5kIE9iYW1hIEwzIChsYXN0IDMgeWVhcnMpLiBUaGUgc2xvcGUgY29lZmZpY2llbnQgaXMgbGFiZWxlZCAiUGVyaW9kIiBhbmQgaW5kaWNhdGVzIHRoZSB3ZWVrbHkgVS5TLiBtZWRpYW4gd2FnZSBncm93dGggcGVyIHF1YXJ0ZXIuDQoNCmBgYHtyfQ0KbW9kNTBUID0gbG0oIE1lZGlhbiB+IFBlcmlvZCwgZGF0YSA9IFRydW1wTWVkKQ0KbW9kNTBCID0gbG0oIE1lZGlhbiB+IFBlcmlvZCwgZGF0YSA9IE9iYW1hTWVkKQ0KbW9kNTBCTDMgPSBsbSggTWVkaWFuIH4gUGVyaW9kLCBkYXRhID0gT2JhbWFNZWRMMykNCm1vZDUwDQptb2Q1MFQNCm1vZDUwQg0KbW9kNTBCTDMNCmBgYA0KDQojIyMgRXZhbHVhdGluZyB0aGUgZGlhZ25vc3RpY3MgZm9yIGxpbmVhcml0eSBhbmQgbm9ybWFsaXR5IGFzc3VtcHRpb25zDQoNCiMjIyMgWFlQbG90cyBpbmNsdWRpbmcgcmVncmVzc2lvbiBsaW5lIHRvIGFzc2VzcyBiaXZhcmlhdGUgbGluZWFyaXR5DQpUaGUgbGluZWFyaXR5IGFzc3VtcHRpb24gYXBwZWFycyB2YWxpZCBmb3IgYWxsIHRocmVlIG1vZGVscy4NCg0KYGBge3J9DQpwMSA9IHh5cGxvdChNZWRpYW4gfiBQZXJpb2QsIGRhdGEgPSBuZXdNZWQsIHR5cGUgPSBjKCJwIiwiciIpLCBtYWluID0gIkhpc3RvcmljIE1lZGlhbiIpDQpwMiA9IHh5cGxvdChNZWRpYW4gfiBQZXJpb2QsIGRhdGEgPSBUcnVtcE1lZCwgdHlwZSA9IGMoInAiLCJyIiksIG1haW4gPSAiVHJ1bXAgRXJhIE1lZGlhbiIpDQpwMyA9IHh5cGxvdChNZWRpYW4gfiBQZXJpb2QsIGRhdGEgPSBPYmFtYU1lZCwgdHlwZSA9IGMoInAiLCJyIiksIG1haW4gPSAiT2JhbWEgRXJhIE1lZGlhbiIpDQpwNCA9IHh5cGxvdChNZWRpYW4gfiBQZXJpb2QsIGRhdGEgPSBPYmFtYU1lZEwzLCB0eXBlID0gYygicCIsInIiKSwgbWFpbiA9ICJPYmFtYSBMYXN0IDMgWXJzIE1lZGlhbiIpDQpwcmludChwMSwgcG9zaXRpb24gPSBjKDAsIDAuNSwgMC41LCAxKSwgbW9yZSA9IFRSVUUpDQpwcmludChwMiwgcG9zaXRpb24gPSBjKDAuNSwgMC41LCAxLCAxKSwgbW9yZSA9IFRSVUUpDQpwcmludChwMywgcG9zaXRpb24gPSBjKDAsIDAsIDAuNSwgMC41KSwgbW9yZSA9IFRSVUUpDQpwcmludChwNCwgcG9zaXRpb24gPSBjKDAuNSwgMCwgMSwgMC41KSkNCmBgYA0KDQojIyMjIFFRLVBsb3RzIHRvIGFzc2VzcyBiaXZhcmlhdGUgbm9ybWFsaXR5DQoNCkEgcGVyZmVjdGx5IHN0cmFpZ2h0IGxpbmUgb2YgcG9pbnRzIGluIHRoZSBxcS1wbG90IHdvdWxkIGluZGljYXRlIHRoZSBlcnJvcnMgKHJlc2lkdWFscykgYXJlIHNjYXR0ZXJlZCBpbiBhIHBlcmZlY3QgYmVsbC1zaGFwZSBhcm91bmQgdGhlIHJlZ3Jlc3Npb24gbGluZS4gQWxsIHRocmVlIHFxLXBsb3QgYXJlIGFwcHJveGltYXRlbHkgbGluZWFyIGluZGljYXRpbmcgdGhlIG5vcm1hbGl0eSBhc3N1bXB0aW9uIGFwcGVhcnMganVzdGlmaWVkLiBIb3dldmVyLCBib290c3RyYXBwaW5nIGNvbmZpZGVuY2UgaW50ZXJ2YWxzIHdpbGwgYmUgdXNlZCBmb3IgYWxsIGVzdGltYXRlcywgYSBwcm9jZXNzIHdoaWNoIGlzIHJvYnVzdCBldmVuIHdoZW4gdGhlIHJlc2lkdWFscyBhcmUgbm90IG5vcm1hbGx5IGRpc3RyaWJ1dGVkLCBhcyBsb25nIGFzIHRoZXkgYXJlIHN5bW1ldHJpY2FsbHkgZGlzdHJpYnV0ZWQgKDxhIGhyZWYgPSBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9HYXVzcyVFMiU4MCU5M01hcmtvdl90aGVvcmVtPkd1YXNzLU1hcmtvdiBUaGVvcmVtPC9hPi4pDQoNCmBgYHtyfQ0KcTEgPSBxcW1hdGgofnJlc2lkKG1vZDUwKSAsdHlwZSA9IGMoInAiLCAiciIpLCBtYWluID0gIkhpc3RvcmljIE1lZGlhbiIpDQpxMiA9IHFxbWF0aCh+cmVzaWQobW9kNTBUKSAsdHlwZSA9IGMoInAiLCAiciIpLCBtYWluID0gIlRydW1wIEVyYSBNZWRpYW4iKQ0KcTMgPSBxcW1hdGgofnJlc2lkKG1vZDUwQiksdHlwZSA9IGMoInAiLCAiciIpLCBtYWluID0gIk9iYW1hIEVyYSBNZWRpYW4iKQ0KcTQgPSBxcW1hdGgofnJlc2lkKG1vZDUwQkwzKSx0eXBlID0gYygicCIsICJyIiksIG1haW4gPSAiT2JhbWEgTGFzdCAzIFlycyBNZWRpYW4iKQ0KcHJpbnQocTEsIHBvc2l0aW9uID0gYygwLCAwLjUsIDAuNSwgMSksIG1vcmUgPSBUUlVFKQ0KcHJpbnQocTIsIHBvc2l0aW9uID0gYygwLjUsIDAuNSwgMSwgMSksIG1vcmUgPSBUUlVFKQ0KcHJpbnQocTMsIHBvc2l0aW9uID0gYygwLCAwLCAwLjUsIDAuNSksIG1vcmUgPSBUUlVFKQ0KcHJpbnQocTQsIHBvc2l0aW9uID0gYygwLjUsIDAsIDEsIDAuNSkpDQpgYGANCg0KIyMgQ29tcGFyaW5nIFdhZ2UgR3Jvd3RoIGluIDEwdGgsIDI1dGgsIDc1dGggYW5kIDkwdGggUGVyY2VudGlsZXMNCg0KVGhlIGRhdGEgZm9yIHRoZSAxMHRoLCAyNXRoIDc1dGggYW5kIDkwdGggcGVyY2VudGlsZXMgYXJlIG9ubHkgYXZhaWxhYmxlIGJhY2sgdG8gUTEgMjAwMC4NCg0KYGBge3J9DQpUcnVtcFBlcmMgPSBzdWJzZXQoIFBlcmMgLCBQZXJpb2QgPj0gIDY4ICYgUGVyaW9kIDw9IDc5KQ0KT2JhbWFQZXJjID0gc3Vic2V0KCBQZXJjICwgUGVyaW9kID49ICAzNiAmIFBlcmlvZCA8PSA2NykNCk9iYW1hUGVyY0wzID0gc3Vic2V0KCBQZXJjLCBQZXJpb2QgPj0gIDU2ICYgUGVyaW9kIDw9IDY3KQ0KYGBgDQoNCiMjIyBFc3RhYmxpc2hpbmcgSGlzdG9yaWMgVHJlbmRzDQoNCmBgYHtyfQ0KbW9kMTAgPSBsbShQMTAgfiBQZXJpb2QsIGRhdGEgPSBQZXJjKQ0KbW9kMjUgPSBsbShQMjUgfiBQZXJpb2QsIGRhdGEgPSBQZXJjKQ0KbW9kNzUgPSBsbShQNzUgfiBQZXJpb2QsIGRhdGEgPSBQZXJjKQ0KbW9kOTAgPSBsbShQOTAgfiBQZXJpb2QsIGRhdGEgPSBQZXJjKQ0KbW9kMTANCm1vZDI1DQptb2Q3NQ0KbW9kOTANCmBgYA0KIyMjIyBEaWFnbm9zdGljcyBmb3IgbGluZWFyaXR5IGFuZCBub3JtYWxpdHkgaW4gaGlzdG9yaWMgZGF0YSBzZXRzDQpUaGUgeHlwbG90cyBhbGwgY29uZmlybSB0aGUgbGluZWFyaXR5IGFzc3VtcHRpb24gaXMgcmVhc29uYWJsZSwgdGhvdWdoIGVhY2ggcGxvdCBzaG93cyBhIHNsaWdodCBhY2NlbGVyYXRpb24gb2YgZ3Jvd3RoIGluIHRoZSBUcnVtcCBlcmEgKFBlcmlvZHMgNjggdG8gNzkpLiBUaGUgbW9zdCBwcm9ub3VuY2VkIGFjY2VsZXJhdGlvbiBhcHBlYXJzIHZpc3VhbGx5IGluIHRoZSAxMHRoIHBlcmNlbnRpbGUgeHlwbG90Lg0KDQpgYGB7cn0NCnAxID0geHlwbG90KFAxMCB+IFBlcmlvZCwgZGF0YSA9IFBlcmMsIHR5cGUgPSBjKCJwIiwiciIpLCBtYWluID0gIjEwdGggUGVyY2VudGlsZSIpDQpwMiA9IHh5cGxvdChQMjUgfiBQZXJpb2QsIGRhdGEgPSBQZXJjLCB0eXBlID0gYygicCIsInIiKSwgbWFpbiA9ICIyNXRoIFBlcmNlbnRpbGUiKQ0KcDMgPSB4eXBsb3QoUDc1IH4gUGVyaW9kLCBkYXRhID0gUGVyYywgdHlwZSA9IGMoInAiLCJyIiksIG1haW4gPSAiNzV0aCBQZXJjZW50aWxlIikNCnA0ID0geHlwbG90KFA5MCB+IFBlcmlvZCwgZGF0YSA9IFBlcmMsIHR5cGUgPSBjKCJwIiwiciIpLCBtYWluID0gIjkwdGggUGVyY2VudGlsZSIpDQpwcmludChwMSwgcG9zaXRpb24gPSBjKDAsIDAuNSwgMC41LCAxKSwgbW9yZSA9IFRSVUUpDQpwcmludChwMiwgcG9zaXRpb24gPSBjKDAuNSwgMC41LCAxLCAxKSwgbW9yZSA9IFRSVUUpDQpwcmludChwMywgcG9zaXRpb24gPSBjKDAsIDAsIDAuNSwgMC41KSwgbW9yZSA9IFRSVUUpDQpwcmludChwNCwgcG9zaXRpb24gPSBjKDAuNSwgMCwgMSwgMC41KSkNCmBgYA0KDQoNClRocmVlIG9mIHRoZSBmb3VyIHFxLXBsb3RzIGluZGljYXRlIHRoZSBub3JtYWxpdHkgYXNzdW1wdGlvbiBmb3IgdGhlIHJlc2lkdWFscyBpcyBhIHJlYXNvbmFibGUgYXNzdW1wdGlvbi4gVGhlIHFxLXBsb3QgZm9yIHRoZSAxMHRoIHBlcmNlbnRpbGUgaW5kaWNhdGVzIHRoZSByZXNpZHVhbHMgYXJlIGxpa2VseSBza2V3ZWQgdG8gdGhlIHJpZ2h0IHdoaWNoIG1lYW5zIG91dGxpZXJzIGFyZSBtb3JlIGxpa2VseSBhbmQgbW9yZSBwcm9taW5lbnQgYWJvdmUgdGhlIHJlZ3Jlc3Npb24gbGluZSB3aGVyZSByZXNpZHVhbHMgYXJlIHBvc2l0aXZlLiBSZWdyZXNzaW9uIHByb2NlZHVyZXMgYXJlIHJvYnVzdCB3aXRoIHJlc3BlY3QgdG8gdmlvbGF0aW9ucyBvZiB0aGUgbm9ybWFsaXR5IGFzc3VtcHRpb24sIGJ1dCB3ZSBzaG91bGQgdXNlIGJvb3RzdHJhcHBpbmcgaW50ZXJ2YWxzIHJhdGhlciB0aGFuICR0JC1pbnRlcnZhbHMgZm9yIGFueSBlc3RpbWF0ZXMgb2Ygc2xvcGUgY29lZmZpY2llbnRzIChHYXVzcy1NYXJrb3YgVGhlb3JlbSkuDQoNCmBgYHtyfQ0KcTEgPSBxcW1hdGgofnJlc2lkKG1vZDEwKSAsdHlwZSA9IGMoInAiLCAiciIpLCBtYWluID0gIjEwdGggUGVyY2VudGlsZSIpDQpxMiA9IHFxbWF0aCh+cmVzaWQobW9kMjUpLHR5cGUgPSBjKCJwIiwgInIiKSwgbWFpbiA9ICIyNXRoIFBlcmNlbnRpbGUiKQ0KcTMgPSBxcW1hdGgofnJlc2lkKG1vZDc1KSx0eXBlID0gYygicCIsICJyIiksIG1haW4gPSAiNzV0aCBQZXJjZW50aWxlIikNCnE0ID0gcXFtYXRoKH5yZXNpZChtb2Q5MCksdHlwZSA9IGMoInAiLCAiciIpLCBtYWluID0gIjkwdGggUGVyY2VudGlsZSIpDQpwcmludChxMSwgcG9zaXRpb24gPSBjKDAsIDAuNSwgMC41LCAxKSwgbW9yZSA9IFRSVUUpDQpwcmludChxMiwgcG9zaXRpb24gPSBjKDAuNSwgMC41LCAxLCAxKSwgbW9yZSA9IFRSVUUpDQpwcmludChxMywgcG9zaXRpb24gPSBjKDAsIDAsIDAuNSwgMC41KSwgbW9yZSA9IFRSVUUpDQpwcmludChxMywgcG9zaXRpb24gPSBjKDAuNSwgMCwgMSwgMC41KSkNCmBgYA0KDQojIyMgTW9kZWxpbmcgdGhlIFRydW1wIEVyYQ0KDQpgYGB7cn0NCm1vZDEwVCA9IGxtKFAxMCB+IFBlcmlvZCwgZGF0YSA9IFRydW1wUGVyYykNCm1vZDI1VCA9IGxtKFAyNSB+IFBlcmlvZCwgZGF0YSA9IFRydW1wUGVyYykNCm1vZDc1VCA9IGxtKFA3NSB+IFBlcmlvZCwgZGF0YSA9IFRydW1wUGVyYykNCm1vZDkwVCA9IGxtKFA5MCB+IFBlcmlvZCwgZGF0YSA9IFRydW1wUGVyYykNCm1vZDEwVA0KbW9kMjVUDQptb2Q3NVQNCm1vZDkwVA0KYGBgDQoNCiMjIyMgRGlhZ25vc3RpY3MgZm9yIGxpbmVhcml0eSBhbmQgbm9ybWFsaXR5IGluIFRydW1wIGVyYSBkYXRhIHNldHMNCg0KVGhlIHh5cGxvdHMgYWxsIGNvbmZpcm0gdGhlIGxpbmVhcml0eSBhc3N1bXB0aW9uIGlzIHJlYXNvbmFibGUsIHRob3VnaCBlYWNoIHBsb3Qgc2hvd3MgYSBzbGlnaHQgYWNjZWxlcmF0aW9uIG9mIGdyb3d0aCBpbiB0aGUgVHJ1bXAgZXJhIChQZXJpb2RzIDY4IHRvIDc5KS4gVGhlIG1vc3QgcHJvbm91bmNlZCBhY2NlbGVyYXRpb24gYXBwZWFycyB2aXN1YWxseSBpbiB0aGUgMTB0aCBwZXJjZW50aWxlIHh5cGxvdC4NCg0KYGBge3J9DQpwMSA9IHh5cGxvdChQMTAgfiBQZXJpb2QsIGRhdGEgPSBUcnVtcFBlcmMsIHR5cGUgPSBjKCJwIiwiciIpLCBtYWluID0gIlRydW1wIDEwdGggUGVyY2VudGlsZSIpDQpwMiA9IHh5cGxvdChQMjUgfiBQZXJpb2QsIGRhdGEgPSBUcnVtcFBlcmMsIHR5cGUgPSBjKCJwIiwiciIpLCBtYWluID0gIlRydW1wIDI1dGggUGVyY2VudGlsZSIpDQpwMyA9IHh5cGxvdChQNzUgfiBQZXJpb2QsIGRhdGEgPSBUcnVtcFBlcmMsIHR5cGUgPSBjKCJwIiwiciIpLCBtYWluID0gIlRydW1wIDc1dGggUGVyY2VudGlsZSIpDQpwNCA9IHh5cGxvdChQOTAgfiBQZXJpb2QsIGRhdGEgPSBUcnVtcFBlcmMsIHR5cGUgPSBjKCJwIiwiciIpLCBtYWluID0gIlRydW1wIDkwdGggUGVyY2VudGlsZSIpDQpwcmludChwMSwgcG9zaXRpb24gPSBjKDAsIDAuNSwgMC41LCAxKSwgbW9yZSA9IFRSVUUpDQpwcmludChwMiwgcG9zaXRpb24gPSBjKDAuNSwgMC41LCAxLCAxKSwgbW9yZSA9IFRSVUUpDQpwcmludChwMywgcG9zaXRpb24gPSBjKDAsIDAsIDAuNSwgMC41KSwgbW9yZSA9IFRSVUUpDQpwcmludChwNCwgcG9zaXRpb24gPSBjKDAuNSwgMCwgMSwgMC41KSkNCmBgYA0KQWxsIGZvdXIgcXEtcGxvdHMgaW5kaWNhdGUgdGhlIG5vcm1hbGl0eSBhc3N1bXB0aW9uIGZvciB0aGUgcmVzaWR1YWxzIGlzIGEgcmVhc29uYWJsZSBhc3N1bXB0aW9uLiANCg0KYGBge3J9DQpxMSA9IHFxbWF0aCh+cmVzaWQobW9kMTBUKSAsdHlwZSA9IGMoInAiLCAiciIpLCBtYWluID0gIlRydW1wIDEwdGggUGVyY2VudGlsZSIpDQpxMiA9IHFxbWF0aCh+cmVzaWQobW9kMjVUKSx0eXBlID0gYygicCIsICJyIiksIG1haW4gPSAiVHJ1bXAgMjV0aCBQZXJjZW50aWxlIikNCnEzID0gcXFtYXRoKH5yZXNpZChtb2Q3NVQpLHR5cGUgPSBjKCJwIiwgInIiKSwgbWFpbiA9ICJUcnVtcCA3NXRoIFBlcmNlbnRpbGUiKQ0KcTQgPSBxcW1hdGgofnJlc2lkKG1vZDkwVCksdHlwZSA9IGMoInAiLCAiciIpLCBtYWluID0gIlRydW1wIDkwdGggUGVyY2VudGlsZSIpDQpwcmludChxMSwgcG9zaXRpb24gPSBjKDAsIDAuNSwgMC41LCAxKSwgbW9yZSA9IFRSVUUpDQpwcmludChxMiwgcG9zaXRpb24gPSBjKDAuNSwgMC41LCAxLCAxKSwgbW9yZSA9IFRSVUUpDQpwcmludChxMywgcG9zaXRpb24gPSBjKDAsIDAsIDAuNSwgMC41KSwgbW9yZSA9IFRSVUUpDQpwcmludChxNCwgcG9zaXRpb24gPSBjKDAuNSwgMCwgMSwgMC41KSkNCmBgYA0KDQoNCiMjIyBNb2RlbGluZyB0aGUgT2JhbWEgRXJhDQoNCmBgYHtyfQ0KbW9kMTBCID0gbG0oUDEwIH4gUGVyaW9kLCBkYXRhID0gT2JhbWFQZXJjKQ0KbW9kMjVCID0gbG0oUDI1IH4gUGVyaW9kLCBkYXRhID0gT2JhbWFQZXJjKQ0KbW9kNzVCID0gbG0oUDc1IH4gUGVyaW9kLCBkYXRhID0gT2JhbWFQZXJjKQ0KbW9kOTBCID0gbG0oUDkwIH4gUGVyaW9kLCBkYXRhID0gT2JhbWFQZXJjKQ0KbW9kMTBCDQptb2QyNUINCm1vZDc1Qg0KbW9kOTBCDQpgYGANCg0KIyMjIyBEaWFnbm9zdGljcyBmb3IgbGluZWFyaXR5IGFuZCBub3JtYWxpdHkgaW4gT2JhbWEgZXJhIGRhdGEgc2V0cw0KDQpUaGUgeHlwbG90cyBhbGwgY29uZmlybSB0aGUgbGluZWFyaXR5IGFzc3VtcHRpb24gaXMgcmVhc29uYWJsZSwgdGhvdWdoIGVhY2ggcGxvdCBzaG93cyBhIHNsaWdodCBhY2NlbGVyYXRpb24gb2YgZ3Jvd3RoIGluIHRoZSBUcnVtcCBlcmEgKFBlcmlvZHMgNjggdG8gNzkpLiBUaGUgbW9zdCBwcm9ub3VuY2VkIGFjY2VsZXJhdGlvbiBhcHBlYXJzIHZpc3VhbGx5IGluIHRoZSAxMHRoIHBlcmNlbnRpbGUgeHlwbG90Lg0KDQpgYGB7cn0NCnAxID0geHlwbG90KFAxMCB+IFBlcmlvZCwgZGF0YSA9IE9iYW1hUGVyYywgdHlwZSA9IGMoInAiLCJyIiksIG1haW4gPSAiT2JhbWEgMTB0aCBQZXJjZW50aWxlIikNCnAyID0geHlwbG90KFAyNSB+IFBlcmlvZCwgZGF0YSA9IE9iYW1hUGVyYywgdHlwZSA9IGMoInAiLCJyIiksIG1haW4gPSAiT2JhbWEgMjV0aCBQZXJjZW50aWxlIikNCnAzID0geHlwbG90KFA3NSB+IFBlcmlvZCwgZGF0YSA9IE9iYW1hUGVyYywgdHlwZSA9IGMoInAiLCJyIiksIG1haW4gPSAiT2JhbWEgNzV0aCBQZXJjZW50aWxlIikNCnA0ID0geHlwbG90KFA5MCB+IFBlcmlvZCwgZGF0YSA9IE9iYW1hUGVyYywgdHlwZSA9IGMoInAiLCJyIiksIG1haW4gPSAiT2JhbWEgOTB0aCBQZXJjZW50aWxlIikNCnByaW50KHAxLCBwb3NpdGlvbiA9IGMoMCwgMC41LCAwLjUsIDEpLCBtb3JlID0gVFJVRSkNCnByaW50KHAyLCBwb3NpdGlvbiA9IGMoMC41LCAwLjUsIDEsIDEpLCBtb3JlID0gVFJVRSkNCnByaW50KHAzLCBwb3NpdGlvbiA9IGMoMCwgMCwgMC41LCAwLjUpLCBtb3JlID0gVFJVRSkNCnByaW50KHA0LCBwb3NpdGlvbiA9IGMoMC41LCAwLCAxLCAwLjUpKQ0KYGBgDQoNCkFsbCBmb3VyIHFxLXBsb3RzIGluZGljYXRlIHRoZSBub3JtYWxpdHkgYXNzdW1wdGlvbiBmb3IgdGhlIHJlc2lkdWFscyBpcyBhIHJlYXNvbmFibGUgYXNzdW1wdGlvbi4gDQoNCmBgYHtyfQ0KcTEgPSBxcW1hdGgofnJlc2lkKG1vZDEwQikgLHR5cGUgPSBjKCJwIiwgInIiKSwgbWFpbiA9ICJPYmFtYSAxMHRoIFBlcmNlbnRpbGUiKQ0KcTIgPSBxcW1hdGgofnJlc2lkKG1vZDI1QiksdHlwZSA9IGMoInAiLCAiciIpLCBtYWluID0gIk9iYW1hIDI1dGggUGVyY2VudGlsZSIpDQpxMyA9IHFxbWF0aCh+cmVzaWQobW9kNzVCKSx0eXBlID0gYygicCIsICJyIiksIG1haW4gPSAiT2JhbWEgNzV0aCBQZXJjZW50aWxlIikNCnE0ID0gcXFtYXRoKH5yZXNpZChtb2Q5MEIpLHR5cGUgPSBjKCJwIiwgInIiKSwgbWFpbiA9ICJPYmFtYSA5MHRoIFBlcmNlbnRpbGUiKQ0KcHJpbnQocTEsIHBvc2l0aW9uID0gYygwLCAwLjUsIDAuNSwgMSksIG1vcmUgPSBUUlVFKQ0KcHJpbnQocTIsIHBvc2l0aW9uID0gYygwLjUsIDAuNSwgMSwgMSksIG1vcmUgPSBUUlVFKQ0KcHJpbnQocTMsIHBvc2l0aW9uID0gYygwLCAwLCAwLjUsIDAuNSksIG1vcmUgPSBUUlVFKQ0KcHJpbnQocTQsIHBvc2l0aW9uID0gYygwLjUsIDAsIDEsIDAuNSkpDQpgYGANCg0KIyMjIE1vZGVsaW5nIE9iYW1hJ3MgTGFzdCAzIFllYXJzDQoNCg0KYGBge3J9DQptb2QxMEJMMyA9IGxtKFAxMCB+IFBlcmlvZCwgZGF0YSA9IE9iYW1hUGVyY0wzKQ0KbW9kMjVCTDMgPSBsbShQMjUgfiBQZXJpb2QsIGRhdGEgPSBPYmFtYVBlcmNMMykNCm1vZDc1QkwzID0gbG0oUDc1IH4gUGVyaW9kLCBkYXRhID0gT2JhbWFQZXJjTDMpDQptb2Q5MEJMMyA9IGxtKFA5MCB+IFBlcmlvZCwgZGF0YSA9IE9iYW1hUGVyY0wzKQ0KbW9kMTBCTDMNCm1vZDI1QkwzDQptb2Q3NUJMMw0KbW9kOTBCTDMNCmBgYA0KIyMjIyBEaWFnbm9zdGljcyBmb3IgbGluZWFyaXR5IGFuZCBub3JtYWxpdHkgaW4gZGF0YSBzZXRzIGZyb20gT2JhbWEncyBMYXN0IDMgWWVhcnMNCg0KDQpUaGUgeHlwbG90cyBhbGwgY29uZmlybSB0aGUgbGluZWFyaXR5IGFzc3VtcHRpb24gaXMgcmVhc29uYWJsZSwgdGhvdWdoIGVhY2ggcGxvdCBzaG93cyBhIHNsaWdodCBhY2NlbGVyYXRpb24gb2YgZ3Jvd3RoIGluIHRoZSBUcnVtcCBlcmEgKFBlcmlvZHMgNjggdG8gNzkpLiBUaGUgbW9zdCBwcm9ub3VuY2VkIGFjY2VsZXJhdGlvbiBhcHBlYXJzIHZpc3VhbGx5IGluIHRoZSAxMHRoIHBlcmNlbnRpbGUgeHlwbG90Lg0KDQpgYGB7cn0NCnAxID0geHlwbG90KFAxMCB+IFBlcmlvZCwgZGF0YSA9IE9iYW1hUGVyY0wzLCB0eXBlID0gYygicCIsInIiKSwgbWFpbiA9ICJPYmFtYSBMYXN0IDMgWXJzIDEwdGggUGVyY2VudGlsZSIpDQpwMiA9IHh5cGxvdChQMjUgfiBQZXJpb2QsIGRhdGEgPSBPYmFtYVBlcmNMMywgdHlwZSA9IGMoInAiLCJyIiksIG1haW4gPSAiT2JhbWEgTGFzdCAzIFlycyAyNXRoIFBlcmNlbnRpbGUiKQ0KcDMgPSB4eXBsb3QoUDc1IH4gUGVyaW9kLCBkYXRhID0gT2JhbWFQZXJjTDMsIHR5cGUgPSBjKCJwIiwiciIpLCBtYWluID0gIk9iYW1hIExhc3QgMyBZcnMgNzV0aCBQZXJjZW50aWxlIikNCnA0ID0geHlwbG90KFA5MCB+IFBlcmlvZCwgZGF0YSA9IE9iYW1hUGVyY0wzLCB0eXBlID0gYygicCIsInIiKSwgbWFpbiA9ICJPYmFtYSBMYXN0IDMgWXJzIDkwdGggUGVyY2VudGlsZSIpDQpwcmludChwMSwgcG9zaXRpb24gPSBjKDAsIDAuNSwgMC41LCAxKSwgbW9yZSA9IFRSVUUpDQpwcmludChwMiwgcG9zaXRpb24gPSBjKDAuNSwgMC41LCAxLCAxKSwgbW9yZSA9IFRSVUUpDQpwcmludChwMywgcG9zaXRpb24gPSBjKDAsIDAsIDAuNSwgMC41KSwgbW9yZSA9IFRSVUUpDQpwcmludChwNCwgcG9zaXRpb24gPSBjKDAuNSwgMCwgMSwgMC41KSkNCmBgYA0KQWxsIGZvdXIgcXEtcGxvdHMgaW5kaWNhdGUgdGhlIG5vcm1hbGl0eSBhc3N1bXB0aW9uIGZvciB0aGUgcmVzaWR1YWxzIGlzIGEgcmVhc29uYWJsZSBhc3N1bXB0aW9uLiANCg0KYGBge3J9DQpxMSA9IHFxbWF0aCh+cmVzaWQobW9kMTBCTDMpICx0eXBlID0gYygicCIsICJyIiksIG1haW4gPSAiT2JhbWEgTGFzdCAzIFlycyAxMHRoIFBlcmNlbnRpbGUiKQ0KcTIgPSBxcW1hdGgofnJlc2lkKG1vZDI1QkwzKSx0eXBlID0gYygicCIsICJyIiksIG1haW4gPSAiT2JhbWEgTGFzdCAzIFlycyAyNXRoIFBlcmNlbnRpbGUiKQ0KcTMgPSBxcW1hdGgofnJlc2lkKG1vZDc1QkwzKSx0eXBlID0gYygicCIsICJyIiksIG1haW4gPSAiT2JhbWEgTGFzdCAzIFlycyA3NXRoIFBlcmNlbnRpbGUiKQ0KcTQgPSBxcW1hdGgofnJlc2lkKG1vZDkwQkwzKSx0eXBlID0gYygicCIsICJyIiksIG1haW4gPSAiT2JhbWEgTGFzdCAzIFlycyA5MHRoIFBlcmNlbnRpbGUiKQ0KcHJpbnQocTEsIHBvc2l0aW9uID0gYygwLCAwLjUsIDAuNSwgMSksIG1vcmUgPSBUUlVFKQ0KcHJpbnQocTIsIHBvc2l0aW9uID0gYygwLjUsIDAuNSwgMSwgMSksIG1vcmUgPSBUUlVFKQ0KcHJpbnQocTMsIHBvc2l0aW9uID0gYygwLCAwLCAwLjUsIDAuNSksIG1vcmUgPSBUUlVFKQ0KcHJpbnQocTQsIHBvc2l0aW9uID0gYygwLjUsIDAsIDEsIDAuNSkpDQpgYGANCg0KIyA8c3BhbiBzdHlsZT0iY29sb3I6IGJsdWU7Ij40LiBNb2RlbGluZyBXYWdlIEdyb3d0aCBmb3IgQWZyaWNhbiBBbWVyaWNhbnMgT25seTwvc3Bhbj4NCg0KYGBge3J9DQpUcnVtcFBlckIgPSBzdWJzZXQoIFBlckIgLCBQZXJpb2QgPj0gIDY4ICYgUGVyaW9kIDw9IDc5KQ0KT2JhbWFQZXJCID0gc3Vic2V0KCBQZXJCICwgUGVyaW9kID49ICAzNiAmIFBlcmlvZCA8PSA2NykNCk9iYW1hUGVyQkwzID0gc3Vic2V0KCBQZXJCLCBQZXJpb2QgPj0gIDU2ICYgUGVyaW9kIDw9IDY3KQ0KYGBgDQoNCiMjIE1lZGlhbiB3YWdlIGdyb3d0aCBtb2RlbHMgZm9yIEFmcmljYW4gQW1lcmljYW5zIG9ubHk6IEhpc3RvcmljIHZzLiBUcnVtcCB2cy4gT2JhbWENCmBgYHtyfQ0KbW9kQjUwID0gbG0oUDUwIH4gUGVyaW9kLCBkYXRhID0gUGVyQikNCm1vZEI1MFQgPSBsbShQNTAgfiBQZXJpb2QsIGRhdGEgPSBUcnVtcFBlckIpDQptb2RCNTBCID0gbG0oUDUwIH4gUGVyaW9kLCBkYXRhID0gT2JhbWFQZXJCKQ0KbW9kQjUwQkwzID0gbG0oUDUwIH4gUGVyaW9kLCBkYXRhID0gT2JhbWFQZXJCTDMpDQptb2RCNTANCm1vZEI1MFQNCm1vZEI1MEINCm1vZEI1MEJMMw0KYGBgDQoNCiMjIyBEaWFnbm9zdGljcyBmb3IgbWVkaWFuIHdhZ2UgZ3Jvd3RoIG9mIEFmcmljYW4gQW1lcmljYW5zIG9ubHkNCg0KYGBge3J9DQpwMSA9IHh5cGxvdChQNTAgfiBQZXJpb2QsIGRhdGEgPSBQZXJCLCB0eXBlID0gYygicCIsInIiKSwgbWFpbiA9ICJIaXN0b3JpYyBNZWRpYW4gR3Jvd3RoIikNCnAyID0geHlwbG90KFA1MCB+IFBlcmlvZCwgZGF0YSA9IFRydW1wUGVyQiwgdHlwZSA9IGMoInAiLCJyIiksIG1haW4gPSAiVHJ1bXAgTWVkaWFuIEdyb3d0aCIpDQpwMyA9IHh5cGxvdChQNzUgfiBQZXJpb2QsIGRhdGEgPSBPYmFtYVBlckIsIHR5cGUgPSBjKCJwIiwiciIpLCBtYWluID0gIk9iYW1hIE1lZGlhbiBHcndvdGgiKQ0KcDQgPSB4eXBsb3QoUDkwIH4gUGVyaW9kLCBkYXRhID0gT2JhbWFQZXJCTDMsIHR5cGUgPSBjKCJwIiwiciIpLCBtYWluID0gIk9iYW1hIExhc3QgMyBZcnMgTWVkaWFuIEdyb3d0aCIpDQpwcmludChwMSwgcG9zaXRpb24gPSBjKDAsIDAuNSwgMC41LCAxKSwgbW9yZSA9IFRSVUUpDQpwcmludChwMiwgcG9zaXRpb24gPSBjKDAuNSwgMC41LCAxLCAxKSwgbW9yZSA9IFRSVUUpDQpwcmludChwMywgcG9zaXRpb24gPSBjKDAsIDAsIDAuNSwgMC41KSwgbW9yZSA9IFRSVUUpDQpwcmludChwNCwgcG9zaXRpb24gPSBjKDAuNSwgMCwgMSwgMC41KSkNCmBgYA0KDQpUaGUgeHlwbG90cyBhbGwgY29uZmlybSB0aGUgbGluZWFyaXR5IGFzc3VtcHRpb24gaXMgcmVhc29uYWJsZSwgYnV0IHRoZSBkYXRhIGZvciB0aGUgbGFzdCAzIHllYXJzIG9mIHRoZSBPYmFtYSBlcmEgc2hvdyBhIHZlcnkgd2VhayBjb3JyZWxhdGlvbiwgYW5kIHRoZSBUcnVtcCBlcmEgbWF5IGFjdHVhbGx5IGhhdmUgYSBncm93dGggY3VydmUgdGhhdCBpcyBhY2NlbGVyYXRpbmcgc2xpZ2h0bHkgKG5vbi1saW5lYXIsIGNvbmNhdmUgdXApLg0KDQoNCmBgYHtyfQ0KcTEgPSBxcW1hdGgofnJlc2lkKG1vZEI1MCkgLHR5cGUgPSBjKCJwIiwgInIiKSwgbWFpbiA9ICJIaXN0b3JpYyBNZWRpYW4iKQ0KcTIgPSBxcW1hdGgofnJlc2lkKG1vZEI1MFQpLHR5cGUgPSBjKCJwIiwgInIiKSwgbWFpbiA9ICJUcnVtcCBNZWRpYW4iKQ0KcTMgPSBxcW1hdGgofnJlc2lkKG1vZEI1MEIpLHR5cGUgPSBjKCJwIiwgInIiKSwgbWFpbiA9ICJPYmFtYSBNZWRpYW4iKQ0KcTQgPSBxcW1hdGgofnJlc2lkKG1vZEI1MEJMMyksdHlwZSA9IGMoInAiLCAiciIpLCBtYWluID0gIk9iYW1hIExhc3QgMyBNZWRpYW4iKQ0KcHJpbnQocTEsIHBvc2l0aW9uID0gYygwLCAwLjUsIDAuNSwgMSksIG1vcmUgPSBUUlVFKQ0KcHJpbnQocTIsIHBvc2l0aW9uID0gYygwLjUsIDAuNSwgMSwgMSksIG1vcmUgPSBUUlVFKQ0KcHJpbnQocTMsIHBvc2l0aW9uID0gYygwLCAwLCAwLjUsIDAuNSksIG1vcmUgPSBUUlVFKQ0KcHJpbnQocTQsIHBvc2l0aW9uID0gYygwLjUsIDAsIDEsIDAuNSkpDQpgYGANCkFsbCA0IHFxLXBsb3RzIGluZGljYXRlIHRoZSBub3JtYWxpdHkgYXNzdW1wdGlvbiBpcyByZWFzb25hYmxlLg0KDQojIyMgSGlzdG9yaWMgVHJlbmRzIGZvciAxMHRoLCAyNXRoLCA3NXRoIGFuZCA5MHRoIHBlcmNlbnRpbGVzDQoNCmBgYHtyfQ0KbW9kQjEwID0gbG0oUDEwIH4gUGVyaW9kLCBkYXRhID0gUGVyQikNCm1vZEIyNSA9IGxtKFAyNSB+IFBlcmlvZCwgZGF0YSA9IFBlckIpDQptb2RCNzUgPSBsbShQNzUgfiBQZXJpb2QsIGRhdGEgPSBQZXJCKQ0KbW9kQjkwID0gbG0oUDkwIH4gUGVyaW9kLCBkYXRhID0gUGVyQikNCm1vZEIxMA0KbW9kQjI1DQptb2RCNTANCm1vZEI3NQ0KbW9kQjkwDQpgYGANCg0KIyMjIERpYWdub3N0aWNzIGZvciBIaXN0b3JpYyBUcmVuZHMNCg0KYGBge3J9DQpwMSA9IHh5cGxvdChQMTAgfiBQZXJpb2QsIGRhdGEgPSBQZXJCLCB0eXBlID0gYygicCIsInIiKSwgbWFpbiA9ICJIaXN0b3JpYyAxMHRoIFBlcmNlbnRpbGUiKQ0KcDIgPSB4eXBsb3QoUDI1IH4gUGVyaW9kLCBkYXRhID0gUGVyQiwgdHlwZSA9IGMoInAiLCJyIiksIG1haW4gPSAiSGlzdG9yaWMgMjV0aCBQZXJjZW50aWxlIikNCnAzID0geHlwbG90KFA3NSB+IFBlcmlvZCwgZGF0YSA9IFBlckIsIHR5cGUgPSBjKCJwIiwiciIpLCBtYWluID0gIkhpc3RvcmljIDc1dGggUGVyY2VudGlsZSIpDQpwNCA9IHh5cGxvdChQOTAgfiBQZXJpb2QsIGRhdGEgPSBQZXJCLCB0eXBlID0gYygicCIsInIiKSwgbWFpbiA9ICJIaXN0b3JpYyA5MHRoIFBlcmNlbnRpbGUiKQ0KcHJpbnQocDEsIHBvc2l0aW9uID0gYygwLCAwLjUsIDAuNSwgMSksIG1vcmUgPSBUUlVFKQ0KcHJpbnQocDIsIHBvc2l0aW9uID0gYygwLjUsIDAuNSwgMSwgMSksIG1vcmUgPSBUUlVFKQ0KcHJpbnQocDMsIHBvc2l0aW9uID0gYygwLCAwLCAwLjUsIDAuNSksIG1vcmUgPSBUUlVFKQ0KcHJpbnQocDQsIHBvc2l0aW9uID0gYygwLjUsIDAsIDEsIDAuNSkpDQpgYGANCg0KVGhlIHh5cGxvdHMgYWxsIGNvbmZpcm0gdGhlIGxpbmVhcml0eSBhc3N1bXB0aW9uIGlzIHJlYXNvbmFibGUsIHRob3VnaCBlYWNoIHBsb3Qgc2hvd3MgYSBzbGlnaHQgYWNjZWxlcmF0aW9uIG9mIGdyb3d0aCBpbiB0aGUgVHJ1bXAgZXJhIChQZXJpb2RzIDY4IHRvIDc5KS4gVGhlIG1vc3QgcHJvbm91bmNlZCBhY2NlbGVyYXRpb24gYXBwZWFycyB2aXN1YWxseSBpbiB0aGUgMTB0aCBwZXJjZW50aWxlIHh5cGxvdC4NCg0KDQpgYGB7cn0NCnExID0gcXFtYXRoKH5yZXNpZChtb2RCMTApICx0eXBlID0gYygicCIsICJyIiksIG1haW4gPSAiSGlzdG9yaWMgMTB0aCBQZXJjZW50aWxlIikNCnEyID0gcXFtYXRoKH5yZXNpZChtb2RCMjUpLHR5cGUgPSBjKCJwIiwgInIiKSwgbWFpbiA9ICJIaXN0b3JpYyAyNXRoIFBlcmNlbnRpbGUiKQ0KcTMgPSBxcW1hdGgofnJlc2lkKG1vZEI3NSksdHlwZSA9IGMoInAiLCAiciIpLCBtYWluID0gIkhpc3RvcmljIDc1dGggUGVyY2VudGlsZSIpDQpxNCA9IHFxbWF0aCh+cmVzaWQobW9kQjkwKSx0eXBlID0gYygicCIsICJyIiksIG1haW4gPSAiSGlzdG9yaWMgOTB0aCBQZXJjZW50aWxlIikNCnByaW50KHExLCBwb3NpdGlvbiA9IGMoMCwgMC41LCAwLjUsIDEpLCBtb3JlID0gVFJVRSkNCnByaW50KHEyLCBwb3NpdGlvbiA9IGMoMC41LCAwLjUsIDEsIDEpLCBtb3JlID0gVFJVRSkNCnByaW50KHEzLCBwb3NpdGlvbiA9IGMoMCwgMCwgMC41LCAwLjUpLCBtb3JlID0gVFJVRSkNCnByaW50KHE0LCBwb3NpdGlvbiA9IGMoMC41LCAwLCAxLCAwLjUpKQ0KYGBgDQoNCkFsbCBxcS1wbG90cyBzdWdnZXN0IHRoZSBub3JtYWxpdHkgYXNzdW1wdGlvbiBpcyByZWFzb25hYmxlLg0KDQojIyMgVHJ1bXAgRXJhDQoNCmBgYHtyfQ0KbW9kQjEwVCA9IGxtKFAxMCB+IFBlcmlvZCwgZGF0YSA9IFRydW1wUGVyQikNCm1vZEIyNVQgPSBsbShQMjUgfiBQZXJpb2QsIGRhdGEgPSBUcnVtcFBlckIpDQptb2RCNzVUID0gbG0oUDc1IH4gUGVyaW9kLCBkYXRhID0gVHJ1bXBQZXJCKQ0KbW9kQjkwVCA9IGxtKFA5MCB+IFBlcmlvZCwgZGF0YSA9IFRydW1wUGVyQikNCm1vZEIxMFQNCm1vZEIyNVQNCm1vZEI1MFQNCm1vZEI3NVQNCm1vZEI5MFQNCmBgYA0KDQojIyMgRGlhZ25vc3RpY3MgZm9yIFRydW1wIGVyYQ0KDQpgYGB7cn0NCnAxID0geHlwbG90KFAxMCB+IFBlcmlvZCwgZGF0YSA9IFRydW1wUGVyQiwgdHlwZSA9IGMoInAiLCJyIiksIG1haW4gPSAiVHJ1bXAgMTB0aCBQZXJjZW50aWxlIikNCnAyID0geHlwbG90KFAyNSB+IFBlcmlvZCwgZGF0YSA9IFRydW1wUGVyQiwgdHlwZSA9IGMoInAiLCJyIiksIG1haW4gPSAiVHJ1bXAgMjV0aCBQZXJjZW50aWxlIikNCnAzID0geHlwbG90KFA3NSB+IFBlcmlvZCwgZGF0YSA9IFRydW1wUGVyQiwgdHlwZSA9IGMoInAiLCJyIiksIG1haW4gPSAiVHJ1bXAgNzV0aCBQZXJjZW50aWxlIikNCnA0ID0geHlwbG90KFA5MCB+IFBlcmlvZCwgZGF0YSA9IFRydW1wUGVyQiwgdHlwZSA9IGMoInAiLCJyIiksIG1haW4gPSAiVHJ1bXAgOTB0aCBQZXJjZW50aWxlIikNCnByaW50KHAxLCBwb3NpdGlvbiA9IGMoMCwgMC41LCAwLjUsIDEpLCBtb3JlID0gVFJVRSkNCnByaW50KHAyLCBwb3NpdGlvbiA9IGMoMC41LCAwLjUsIDEsIDEpLCBtb3JlID0gVFJVRSkNCnByaW50KHAzLCBwb3NpdGlvbiA9IGMoMCwgMCwgMC41LCAwLjUpLCBtb3JlID0gVFJVRSkNCnByaW50KHA0LCBwb3NpdGlvbiA9IGMoMC41LCAwLCAxLCAwLjUpKQ0KYGBgDQoNClRoZSB4eXBsb3RzIGFsbCBjb25maXJtIHRoZSBsaW5lYXJpdHkgYXNzdW1wdGlvbiBpcyByZWFzb25hYmxlLCB0aG91Z2ggZWFjaCBwbG90IHNob3dzIGEgc2xpZ2h0IGFjY2VsZXJhdGlvbiBvZiBncm93dGggaW4gdGhlIFRydW1wIGVyYSAoUGVyaW9kcyA2OCB0byA3OSkuIFRoZSBtb3N0IHByb25vdW5jZWQgYWNjZWxlcmF0aW9uIGFwcGVhcnMgdmlzdWFsbHkgaW4gdGhlIDEwdGggcGVyY2VudGlsZSB4eXBsb3QuDQoNCg0KYGBge3J9DQpxMSA9IHFxbWF0aCh+cmVzaWQobW9kQjEwVCksdHlwZSA9IGMoInAiLCAiciIpLCBtYWluID0gIlRydW1wIDEwdGggUGVyY2VudGlsZSIpDQpxMiA9IHFxbWF0aCh+cmVzaWQobW9kQjI1VCksdHlwZSA9IGMoInAiLCAiciIpLCBtYWluID0gIlRydW1wIDI1dGggUGVyY2VudGlsZSIpDQpxMyA9IHFxbWF0aCh+cmVzaWQobW9kQjc1VCksdHlwZSA9IGMoInAiLCAiciIpLCBtYWluID0gIlRydW1wIDc1dGggUGVyY2VudGlsZSIpDQpxNCA9IHFxbWF0aCh+cmVzaWQobW9kQjkwVCksdHlwZSA9IGMoInAiLCAiciIpLCBtYWluID0gIlRydW1wIDkwdGggUGVyY2VudGlsZSIpDQpwcmludChxMSwgcG9zaXRpb24gPSBjKDAsIDAuNSwgMC41LCAxKSwgbW9yZSA9IFRSVUUpDQpwcmludChxMiwgcG9zaXRpb24gPSBjKDAuNSwgMC41LCAxLCAxKSwgbW9yZSA9IFRSVUUpDQpwcmludChxMywgcG9zaXRpb24gPSBjKDAsIDAsIDAuNSwgMC41KSwgbW9yZSA9IFRSVUUpDQpwcmludChxNCwgcG9zaXRpb24gPSBjKDAuNSwgMCwgMSwgMC41KSkNCmBgYA0KDQpBbGwgcXEtcGxvdHMgc3VnZ2VzdCB0aGUgbm9ybWFsaXR5IGFzc3VtcHRpb24gaXMgcmVhc29uYWJsZS4NCg0KDQojIyMgT2JhbWEgRXJhDQoNCmBgYHtyfQ0KbW9kQjEwQiA9IGxtKFAxMCB+IFBlcmlvZCwgZGF0YSA9IE9iYW1hUGVyQikNCm1vZEIyNUIgPSBsbShQMjUgfiBQZXJpb2QsIGRhdGEgPSBPYmFtYVBlckIpDQptb2RCNTBCID0gbG0oUDUwIH4gUGVyaW9kLCBkYXRhID0gT2JhbWFQZXJCKQ0KbW9kQjc1QiA9IGxtKFA3NSB+IFBlcmlvZCwgZGF0YSA9IE9iYW1hUGVyQikNCm1vZEI5MEIgPSBsbShQOTAgfiBQZXJpb2QsIGRhdGEgPSBPYmFtYVBlckIpDQptb2RCMTBCDQptb2RCMjVCDQptb2RCNTBCDQptb2RCNzVCDQptb2RCOTBCDQpgYGANCiMjIyBEaWFnbm9zdGljcyBmb3IgT2JhbWEgZXJhDQoNCmBgYHtyfQ0KcDEgPSB4eXBsb3QoUDEwIH4gUGVyaW9kLCBkYXRhID0gT2JhbWFQZXJCLCB0eXBlID0gYygicCIsInIiKSwgbWFpbiA9ICJPYmFtYSAxMHRoIFBlcmNlbnRpbGUiKQ0KcDIgPSB4eXBsb3QoUDI1IH4gUGVyaW9kLCBkYXRhID0gT2JhbWFQZXJCLCB0eXBlID0gYygicCIsInIiKSwgbWFpbiA9ICJPYmFtYSAyNXRoIFBlcmNlbnRpbGUiKQ0KcDMgPSB4eXBsb3QoUDc1IH4gUGVyaW9kLCBkYXRhID0gT2JhbWFQZXJCLCB0eXBlID0gYygicCIsInIiKSwgbWFpbiA9ICJPYmFtYSA3NXRoIFBlcmNlbnRpbGUiKQ0KcDQgPSB4eXBsb3QoUDkwIH4gUGVyaW9kLCBkYXRhID0gT2JhbWFQZXJCLCB0eXBlID0gYygicCIsInIiKSwgbWFpbiA9ICJPYmFtYSA5MHRoIFBlcmNlbnRpbGUiKQ0KcHJpbnQocDEsIHBvc2l0aW9uID0gYygwLCAwLjUsIDAuNSwgMSksIG1vcmUgPSBUUlVFKQ0KcHJpbnQocDIsIHBvc2l0aW9uID0gYygwLjUsIDAuNSwgMSwgMSksIG1vcmUgPSBUUlVFKQ0KcHJpbnQocDMsIHBvc2l0aW9uID0gYygwLCAwLCAwLjUsIDAuNSksIG1vcmUgPSBUUlVFKQ0KcHJpbnQocDQsIHBvc2l0aW9uID0gYygwLjUsIDAsIDEsIDAuNSkpDQpgYGANCg0KVGhlIHh5cGxvdHMgYWxsIGNvbmZpcm0gdGhlIGxpbmVhcml0eSBhc3N1bXB0aW9uIGlzIHJlYXNvbmFibGUsIHRob3VnaCBlYWNoIHBsb3Qgc2hvd3MgYSBzbGlnaHQgYWNjZWxlcmF0aW9uIG9mIGdyb3d0aCBpbiB0aGUgVHJ1bXAgZXJhIChQZXJpb2RzIDY4IHRvIDc5KS4gVGhlIG1vc3QgcHJvbm91bmNlZCBhY2NlbGVyYXRpb24gYXBwZWFycyB2aXN1YWxseSBpbiB0aGUgMTB0aCBwZXJjZW50aWxlIHh5cGxvdC4NCg0KDQpgYGB7cn0NCnExID0gcXFtYXRoKH5yZXNpZChtb2RCMTBCKSx0eXBlID0gYygicCIsICJyIiksIG1haW4gPSAiT2JhbWEgMTB0aCBQZXJjZW50aWxlIikNCnEyID0gcXFtYXRoKH5yZXNpZChtb2RCMjVCKSx0eXBlID0gYygicCIsICJyIiksIG1haW4gPSAiT2JhbWEgMjV0aCBQZXJjZW50aWxlIikNCnEzID0gcXFtYXRoKH5yZXNpZChtb2RCNzVCKSx0eXBlID0gYygicCIsICJyIiksIG1haW4gPSAiT2JhbWEgNzV0aCBQZXJjZW50aWxlIikNCnE0ID0gcXFtYXRoKH5yZXNpZChtb2RCOTBCKSx0eXBlID0gYygicCIsICJyIiksIG1haW4gPSAiT2JhbWEgOTB0aCBQZXJjZW50aWxlIikNCnByaW50KHExLCBwb3NpdGlvbiA9IGMoMCwgMC41LCAwLjUsIDEpLCBtb3JlID0gVFJVRSkNCnByaW50KHEyLCBwb3NpdGlvbiA9IGMoMC41LCAwLjUsIDEsIDEpLCBtb3JlID0gVFJVRSkNCnByaW50KHEzLCBwb3NpdGlvbiA9IGMoMCwgMCwgMC41LCAwLjUpLCBtb3JlID0gVFJVRSkNCnByaW50KHE0LCBwb3NpdGlvbiA9IGMoMC41LCAwLCAxLCAwLjUpKQ0KYGBgDQoNCkFsbCBxcS1wbG90cyBzdWdnZXN0IHRoZSBub3JtYWxpdHkgYXNzdW1wdGlvbiBpcyByZWFzb25hYmxlLg0KDQojIyMgT2JhbWEgTGFzdCAzIFllYXJzDQoNCmBgYHtyfQ0KbW9kQjEwQkwzID0gbG0oUDEwIH4gUGVyaW9kLCBkYXRhID0gT2JhbWFQZXJCTDMpDQptb2RCMjVCTDMgPSBsbShQMjUgfiBQZXJpb2QsIGRhdGEgPSBPYmFtYVBlckJMMykNCm1vZEI1MEJMMyA9IGxtKFA1MCB+IFBlcmlvZCwgZGF0YSA9IE9iYW1hUGVyQkwzKQ0KbW9kQjc1QkwzID0gbG0oUDc1IH4gUGVyaW9kLCBkYXRhID0gT2JhbWFQZXJCTDMpDQptb2RCOTBCTDMgPSBsbShQOTAgfiBQZXJpb2QsIGRhdGEgPSBPYmFtYVBlckJMMykNCm1vZEIxMEJMMw0KbW9kQjI1QkwzDQptb2RCNTBCTDMNCm1vZEI3NUJMMw0KbW9kQjkwQkwzDQpgYGANCg0KIyMjIERpYWdub3N0aWNzIGZvciBPYmFtYSBMYXN0IDMgWWVhcnMNCg0KYGBge3J9DQpwMSA9IHh5cGxvdChQMTAgfiBQZXJpb2QsIGRhdGEgPSBPYmFtYVBlckJMMywgdHlwZSA9IGMoInAiLCJyIiksIG1haW4gPSAiT2JhbWEgTGFzdCAzIFlycyAxMHRoIFBlcmNlbnRpbGUiKQ0KcDIgPSB4eXBsb3QoUDI1IH4gUGVyaW9kLCBkYXRhID0gT2JhbWFQZXJCTDMsIHR5cGUgPSBjKCJwIiwiciIpLCBtYWluID0gIk9iYW1hIExhc3QgMyBZcnMgMjV0aCBQZXJjZW50aWxlIikNCnAzID0geHlwbG90KFA3NSB+IFBlcmlvZCwgZGF0YSA9IE9iYW1hUGVyQkwzLCB0eXBlID0gYygicCIsInIiKSwgbWFpbiA9ICJPYmFtYSBMYXN0IDMgWXJzIDc1dGggUGVyY2VudGlsZSIpDQpwNCA9IHh5cGxvdChQOTAgfiBQZXJpb2QsIGRhdGEgPSBPYmFtYVBlckJMMywgdHlwZSA9IGMoInAiLCJyIiksIG1haW4gPSAiT2JhbWEgTGFzdCAzIFlycyA5MHRoIFBlcmNlbnRpbGUiKQ0KcHJpbnQocDEsIHBvc2l0aW9uID0gYygwLCAwLjUsIDAuNSwgMSksIG1vcmUgPSBUUlVFKQ0KcHJpbnQocDIsIHBvc2l0aW9uID0gYygwLjUsIDAuNSwgMSwgMSksIG1vcmUgPSBUUlVFKQ0KcHJpbnQocDMsIHBvc2l0aW9uID0gYygwLCAwLCAwLjUsIDAuNSksIG1vcmUgPSBUUlVFKQ0KcHJpbnQocDQsIHBvc2l0aW9uID0gYygwLjUsIDAsIDEsIDAuNSkpDQpgYGANCg0KVGhlIHh5cGxvdHMgYWxsIGNvbmZpcm0gdGhlIGxpbmVhcml0eSBhc3N1bXB0aW9uIGlzIHJlYXNvbmFibGUsIHRob3VnaCBlYWNoIHBsb3Qgc2hvd3MgYSBzbGlnaHQgYWNjZWxlcmF0aW9uIG9mIGdyb3d0aCBpbiB0aGUgVHJ1bXAgZXJhIChQZXJpb2RzIDY4IHRvIDc5KS4gVGhlIG1vc3QgcHJvbm91bmNlZCBhY2NlbGVyYXRpb24gYXBwZWFycyB2aXN1YWxseSBpbiB0aGUgMTB0aCBwZXJjZW50aWxlIHh5cGxvdC4NCg0KDQpgYGB7cn0NCnExID0gcXFtYXRoKH5yZXNpZChtb2RCMTBCTDMpLHR5cGUgPSBjKCJwIiwgInIiKSwgbWFpbiA9ICJPYmFtYSBMYXN0IDMgWXJzIDEwdGggUGVyY2VudGlsZSIpDQpxMiA9IHFxbWF0aCh+cmVzaWQobW9kQjI1QkwzKSx0eXBlID0gYygicCIsICJyIiksIG1haW4gPSAiT2JhbWEgTGFzdCAzIFlycyAyNXRoIFBlcmNlbnRpbGUiKQ0KcTMgPSBxcW1hdGgofnJlc2lkKG1vZEI3NUJMMyksdHlwZSA9IGMoInAiLCAiciIpLCBtYWluID0gIk9iYW1hIExhc3QgMyBZcnMgNzV0aCBQZXJjZW50aWxlIikNCnE0ID0gcXFtYXRoKH5yZXNpZChtb2RCOTBCTDMpLHR5cGUgPSBjKCJwIiwgInIiKSwgbWFpbiA9ICJPYmFtYSBMYXN0IDMgWXJzIDkwdGggUGVyY2VudGlsZSIpDQpwcmludChxMSwgcG9zaXRpb24gPSBjKDAsIDAuNSwgMC41LCAxKSwgbW9yZSA9IFRSVUUpDQpwcmludChxMiwgcG9zaXRpb24gPSBjKDAuNSwgMC41LCAxLCAxKSwgbW9yZSA9IFRSVUUpDQpwcmludChxMywgcG9zaXRpb24gPSBjKDAsIDAsIDAuNSwgMC41KSwgbW9yZSA9IFRSVUUpDQpwcmludChxNCwgcG9zaXRpb24gPSBjKDAuNSwgMCwgMSwgMC41KSkNCmBgYA0KDQpBbGwgcXEtcGxvdHMgc3VnZ2VzdCB0aGUgbm9ybWFsaXR5IGFzc3VtcHRpb24gaXMgcmVhc29uYWJsZS4NCg0KIyA8c3BhbiBzdHlsZT0iY29sb3I6IGJsdWU7Ij41LiBUZXN0aW5nIFRydW1wIFdhZ2UgTW9kZWxzIGZvciBTaWduaWZpY2FudGx5IEhpZ2hlciBHcm93dGggUmF0ZXM8L3NwYW4+DQoNCldlIHdpbGwgdXNlIGJvb3RzdHJhcHBpbmcgY29uZmlkZW5jZSBpbnRlcnZhbHMgcmF0aGVyIHRoYW4gJHQkLWludGVydmFscyBiZWNhdXNlIHRoZSBib290c3RyYXBwaW5nIGFwcHJvYWNoIGlzIG1vcmUgcm9idXN0IHdpdGggcmVzcGVjdCB0byB2aW9sYXRpb25zIG9mIHRoZSBub3JtYWxpdHkgYXNzdW1wdGlvbiB0aGFuICR0JC1wcm9jZWR1cmVzLiBBIGZldyBvZiB0aGUgcXEtcGxvdHMgc3VnZ2VzdGVkIHRoZSBub3JtYWxpdHkgYXNzdW1wdGlvbiB3YXMgYXQgbGVhc3Qgc2xpZ2h0bHkgYXQgaXNzdWUuIFNpbmNlIHdlIGFyZSBoeXBvdGhlc2lzIHRlc3Rpbmcgd2l0aCBjb25maWRlbmNlIGludGVydmFscywgd2Ugd2lsbCBjcmVhdGUgOTAlIGNvbmZpZGVuY2UgaW50ZXJldmFscyBhbmQgOTglIGNvbmZpZGVuY2UgaW50ZXJ2YWxzIHRvIGNvcnJlc3BvbmQgdG8gb25lLXRhaWxlZCB0ZXN0IG9mIHNpZ25pZmljYW5jZSBhdCB0aGUgMC4wNSBhbmQgMC4wMSBsZXZlbHMgcmVzcGVjdGl2ZWx5Lg0KDQojIyBBbGwgV2FnZSBFYXJuZXJzDQoNCiMjIyMgVHJ1bXAgRXJhOiAxMHRoIFBlcmNlbnRpbGUNCg0KYGBge3J9DQpib290c3RyYXAgPSBkbygyMDAwKSAqIGNvZWYobG0oUDEwIH4gUGVyaW9kLCBkYXRhPXJlc2FtcGxlKFRydW1wUGVyYykpKQ0Kcm91bmQocWRhdGEoflBlcmlvZCwgcD1jKDAuMDUsIDAuOTUpLCBkYXRhPWJvb3RzdHJhcCksMikNCnJvdW5kKHFkYXRhKH5QZXJpb2QsIHA9YygwLjAxLCAwLjk5KSwgZGF0YT1ib290c3RyYXApLDIpDQpgYGANCiMjIyMgVHJ1bXAgRXJhOiAyNXRoIFBlcmNlbnRpbGUNCg0KYGBge3J9DQpib290c3RyYXAgPSBkbygyMDAwKSAqIGNvZWYobG0oUDI1IH4gUGVyaW9kLCBkYXRhPXJlc2FtcGxlKFRydW1wUGVyYykpKQ0Kcm91bmQocWRhdGEoflBlcmlvZCwgcD1jKDAuMDUsIDAuOTUpLCBkYXRhPWJvb3RzdHJhcCksMikNCnJvdW5kKHFkYXRhKH5QZXJpb2QsIHA9YygwLjAxLCAwLjk5KSwgZGF0YT1ib290c3RyYXApLDIpDQpgYGANCiMjIyMgVHJ1bXAgRXJhOiBNZWRpYW4NCg0KYGBge3J9DQpib290c3RyYXAgPSBkbygyMDAwKSAqIGNvZWYobG0oTWVkaWFuIH4gUGVyaW9kLCBkYXRhPXJlc2FtcGxlKFRydW1wTWVkKSkpDQpyb3VuZChxZGF0YSh+UGVyaW9kLCBwPWMoMC4wNSwgMC45NSksIGRhdGE9Ym9vdHN0cmFwKSwyKQ0Kcm91bmQocWRhdGEoflBlcmlvZCwgcD1jKDAuMDEsIDAuOTkpLCBkYXRhPWJvb3RzdHJhcCksMikNCmBgYA0KIyMjIyBUcnVtcCBFcmE6IDc1dGggUGVyY2VudGlsZQ0KDQpgYGB7cn0NCmJvb3RzdHJhcCA9IGRvKDIwMDApICogY29lZihsbShQNzUgfiBQZXJpb2QsIGRhdGE9cmVzYW1wbGUoVHJ1bXBQZXJjKSkpDQpyb3VuZChxZGF0YSh+UGVyaW9kLCBwPWMoMC4wNSwgMC45NSksIGRhdGE9Ym9vdHN0cmFwKSwyKQ0Kcm91bmQocWRhdGEoflBlcmlvZCwgcD1jKDAuMDEsIDAuOTkpLCBkYXRhPWJvb3RzdHJhcCksMikNCmBgYA0KIyMjIyBUcnVtcCBFcmE6IDkwdGggUGVyY2VudGlsZQ0KDQpgYGB7cn0NCmJvb3RzdHJhcCA9IGRvKDIwMDApICogY29lZihsbShQOTAgfiBQZXJpb2QsIGRhdGE9cmVzYW1wbGUoVHJ1bXBQZXJjKSkpDQpyb3VuZChxZGF0YSh+UGVyaW9kLCBwPWMoMC4wNSwgMC45NSksIGRhdGE9Ym9vdHN0cmFwKSwyKQ0Kcm91bmQocWRhdGEoflBlcmlvZCwgcD1jKDAuMDEsIDAuOTkpLCBkYXRhPWJvb3RzdHJhcCksMikNCmBgYA0KDQojIyBXYWdlIEdyb3d0aCBmb3IgQWZyaWNhbiBBbWVyaWNhbnMNCg0KIyMjIyBUcnVtcCBFcmE6IDEwdGggUGVyY2VudGlsZQ0KDQpgYGB7cn0NCmJvb3RzdHJhcCA9IGRvKDIwMDApICogY29lZihsbShQMTAgfiBQZXJpb2QsIGRhdGE9cmVzYW1wbGUoVHJ1bXBQZXJCKSkpDQpyb3VuZChxZGF0YSh+UGVyaW9kLCBwPWMoMC4wNSwgMC45NSksIGRhdGE9Ym9vdHN0cmFwKSwyKQ0Kcm91bmQocWRhdGEoflBlcmlvZCwgcD1jKDAuMDEsIDAuOTkpLCBkYXRhPWJvb3RzdHJhcCksMikNCmBgYA0KIyMjIyBUcnVtcCBFcmE6IDI1dGggUGVyY2VudGlsZQ0KDQpgYGB7cn0NCmJvb3RzdHJhcCA9IGRvKDIwMDApICogY29lZihsbShQMjUgfiBQZXJpb2QsIGRhdGE9cmVzYW1wbGUoVHJ1bXBQZXJCKSkpDQpyb3VuZChxZGF0YSh+UGVyaW9kLCBwPWMoMC4wNSwgMC45NSksIGRhdGE9Ym9vdHN0cmFwKSwyKQ0Kcm91bmQocWRhdGEoflBlcmlvZCwgcD1jKDAuMDEsIDAuOTkpLCBkYXRhPWJvb3RzdHJhcCksMikNCmBgYA0KIyMjIyBUcnVtcCBFcmE6IE1lZGlhbg0KDQpOZWl0aGVyIG9mIHRoZSBoeXBvdGhlc2lzIHRlc3RzIHdvdWxkIHJlamVjdCB0aGUgbnVsbCwgbm90IGF0IHRoZSAwLjA1IHNpZ25pZmljYW5jZSBsZXZlbCBub3IgdGhlIDAuMDEgbGV2ZWwuIEFuIDgwJSBjb25maWRlbmNlIGludGVydmFsIHdhcyBhZGRlZCB0byB0aGlzIG1vZGVsIG9ubHkgdG8gY2hlY2sgaWYgdGhlIG51bGwgd291bGQgYmUgcmVqZWN0ZWQgaW4gdGhlIG9uZS10YWlsZWQgdGVzdCBhdCB0aGUgdmVyeSBsaWJlcmFsIDAuMSBsZXZlbC4gSXQgd2FzLCBidXQgdGhhdCBkb2VzIG5vdCBpbmRpY2F0ZSBzaWduaWZpY2FuY2UuIFdlIGVzdGltYXRlIHRoZSBvbmUtdGFpbGVkICRwJC12YWx1ZSBiZXR3ZWVuIDAuMTAgYW5kIDAuMDUsIGFuZCBmYWlsIHRvIHJlamVjdCB0aGUgbnVsbC4gV2UgZmluZCBubyBldmlkZW5jZSBmb3IgYSBUcnVtcCBncm93dGggcmF0ZSB0aGF0IGlzIHNpZ25pZmljYW50IGhpZ2hlciB0aGFuIHRoZSBoaXN0b3JpYyB0cmVuZC4NCg0KYGBge3J9DQpib290c3RyYXAgPSBkbygyMDAwKSAqIGNvZWYobG0oUDUwIH4gUGVyaW9kLCBkYXRhPXJlc2FtcGxlKFRydW1wUGVyQikpKQ0Kcm91bmQocWRhdGEoflBlcmlvZCwgcD1jKDAuMTAsIDAuOTApLCBkYXRhPWJvb3RzdHJhcCksMikNCnJvdW5kKHFkYXRhKH5QZXJpb2QsIHA9YygwLjA1LCAwLjk1KSwgZGF0YT1ib290c3RyYXApLDIpDQpyb3VuZChxZGF0YSh+UGVyaW9kLCBwPWMoMC4wMSwgMC45OSksIGRhdGE9Ym9vdHN0cmFwKSwyKQ0KYGBgDQojIyMjIFRydW1wIEVyYTogNzV0aCBQZXJjZW50aWxlDQoNCmBgYHtyfQ0KYm9vdHN0cmFwID0gZG8oMjAwMCkgKiBjb2VmKGxtKFA3NSB+IFBlcmlvZCwgZGF0YT1yZXNhbXBsZShUcnVtcFBlckIpKSkNCnJvdW5kKHFkYXRhKH5QZXJpb2QsIHA9YygwLjA1LCAwLjk1KSwgZGF0YT1ib290c3RyYXApLDIpDQpyb3VuZChxZGF0YSh+UGVyaW9kLCBwPWMoMC4wMSwgMC45OSksIGRhdGE9Ym9vdHN0cmFwKSwyKQ0KYGBgDQojIyMjIFRydW1wIEVyYTogOTB0aCBQZXJjZW50aWxlDQoNCmBgYHtyfQ0KYm9vdHN0cmFwID0gZG8oMjAwMCkgKiBjb2VmKGxtKFA5MCB+IFBlcmlvZCwgZGF0YT1yZXNhbXBsZShUcnVtcFBlcmMpKSkNCnJvdW5kKHFkYXRhKH5QZXJpb2QsIHA9YygwLjA1LCAwLjk1KSwgZGF0YT1ib290c3RyYXApLDIpDQpyb3VuZChxZGF0YSh+UGVyaW9kLCBwPWMoMC4wMSwgMC45OSksIGRhdGE9Ym9vdHN0cmFwKSwyKQ0KYGBgDQoNCg==