R Notebook: Provides reproducible analysis for gas chromatography (GC) data in the following manuscript:

Citation: Romanowicz, KJ, Crump, BC, Kling, GW. (2021) Rainfall alters permafrost soil redox conditions, but meta-omics show divergent microbial community responses by tundra type in the arctic. Soil Systems 5(1): 17. https://doi.org/10.3390/soilsystems5010017

GitHub Repository: https://github.com/kromanowicz/2021-Romanowicz-SoilSystems

NCBI BioProject: https://www.ncbi.nlm.nih.gov/bioproject/PRJNA666429

Accepted for Publication: Soil Systems 10 March 2021

Experiment

This R Notebook provides complete reproducibility of the data analysis in “Rainfall alters permafrost soil redox conditions, but meta-omics show divergent microbial community responses by tundra type in the Arctic” by Romanowicz, Crump, and Kling. In this experiment, mesocosms containing soil from the active layer of two dominant tundra types were subjected to simulated rainfall to alter redox conditions. The microbial functional potential (metagenomics) and gene expression (metatranscriptomics) patterns were measured during saturated anoxic redox conditions prior to rainfall and at multiple time points following the simulated rainfall event. Other measurements include soil properties as well as microbial respiration (CO2) and methane (CH4) production from soil subsamples collected at each sampling time point. The purpose was to determine if rainfall, as a form of soil oxidation, is sufficient to alter the anoxic redox conditions in arctic tundra and enhance the microbial degradation of organic carbon and CH4 to CO2.

Conceptual Figure. A total of 12 tundra mesocosms (3 replicates x 2 tundra types x 2 sets of response cores) were acclimated initially under anoxic redox conditions to mimic field conditions (T0). Dissolved oxygen was supplied to soils through the downward flow of oxygenated water during a simulated rainfall event. Dissolved oxygen will likely change the redox gradient directly following rainfall (T4) as a short-term effect. Anoxic conditions will likely be re-established after 24 hours (T24) as the pulse of oxygen is consumed through abiotic and biotic soil processes. Under anoxic redox conditions (T0), microorganisms likely degrade organic carbon through anaerobic and fermentation pathways, producing CH4 and reducing Fe(III) to Fe(II). Rainfall-induced soil oxidation (T4) should stimulate heterotrophic microorganisms that degrade organic carbon and CH4 through aerobic metabolic pathways, releasing CO2. Soil oxidation should also stimulate aerobic autotrophic iron oxidizing bacteria that oxidize Fe(II) to Fe(III) and convert CO2 into microbial biomass. The long-term response (T24) will likely be a combination of aerobic and anaerobic metabolism as well as a combination of reduction and oxidation iron reactions as dissolved oxygen is consumed. The predicted redox conditions and predicted redox reactions for coupled Fe(II)/Fe(III) cycling, as well as the microbial-induced release of CO2 or CH4 at each time point are based on the predicted availability of dissolved oxygen entering tundra soils through simulated rainfall.

Soil Sampling for Microbial Gene Expression

An initial soil sampling event for microbial activity was conducted at the end of the anoxic acclimation period (4-7 days) in all mesocosm replicates, representing sampling time point T0. Mesocosms were then flushed to simulate a rainfall event. Additional soil sampling events were conducted at T4 (4-hrs) and T24 (24-hrs) following the rainfall event to determine the temporal extent of microbial gene expression. Soil cores (2.54 cm diameter, 30 cm length) were extracted in duplicate from each mesocosm replicate at each sampling time point and homogenized by depth in 10-cm increments. The 10-20 cm soil increment, composed of organic soil in all mesocosm replicates, was chosen for microbial gene expression analysis and preserved in RNAlater Stabilization Reagent in sterile tubes at 4°C for 18 hours and then stored at -80°C until extraction.

Field Experiment. Tundra soil cores were collected from field sites in August 2017 (top left) and placed in buckets to establish the mesocosm experiment (bottom left). Tussock tundra cores were composed of an organic soil layer overlying a mineral soil layer (top middle) while wet sedge tundra cores were composed entirely of organic soil (bottom middle). Soil subsampling for microbial activity was taken from the 10-20 cm depth of duplicate soil cores in Tussock (top right) and Wet Sedge (bottom right).

# Make a vector of required packages
required.packages <- c("ape","cowplot","data.table","devtools","dplyr","DT","ggplot2","ggpubr","grid","gridExtra","kableExtra","knitr","pheatmap","png","RColorBrewer","reshape","rstatix","statmod","stringr","tibble","tidyr","tidyverse","vegan","yaml")

# Load required packages
lapply(required.packages, library, character.only = TRUE)

Soil Incubation

A subset of each soil sample collected from the 10-20 cm depth during the mesocosm experiment were sealed in jars for an incubation experiment to measure microbial respiration and methane production. Jars containing soil from the wet sedge tundra ecosystem were purged with N2 to reproduce anaerobic field conditions. Each jar was sealed with an airtight lid that contained a septum for gas sampling. Jars were incubated for 5 days in the dark at field temperature (4\(^\circ\)C). Following the 5-day incubation, we removed 20 mL of headspace gas in an evacuated syringe and immediately analyzed CO2 and CH4 concentrations via gas chromotography.

Microbial Respiration

Plot the CO2 data for microbial respiration.

# Place categories in preferred order for plotting
co2_gas$Veg<-factor(co2_gas$Veg, levels=c("Tussock","Wet Sedge"))

co2_gas$Sample <- factor(co2_gas$Sample,levels=c("Tuss-T0","WS-T0","Tuss-T4","WS-T4","Tuss-T24","WS-T24"))

co2_gas_barplot<-ggplot(co2_gas, aes(x = Veg, y = Mean, fill = Sample)) + geom_bar(stat = "identity", position = "dodge", color="black") + geom_errorbar(aes(ymin = Mean - SD, ymax = Mean + SD), width = 0.2, position = position_dodge(0.9)) + ylab(expression(atop("Microbial Respiration", paste(CO[2]~(ng~C~g^{"-1"}~soil~hr^{"-1"}))))) + theme_classic() + theme(axis.text=element_text(size=10), axis.title=element_text(size=12), axis.title.x=element_blank()) + theme(legend.position = "bottom", legend.title=element_blank(), legend.text=element_text(size=8), panel.background = element_blank(), panel.grid.major = element_blank(), panel.grid.minor = element_blank(), panel.border = element_blank()) + scale_size(guide=FALSE) + scale_fill_manual(values=c("palegreen","lightskyblue1", "green3", "dodgerblue1", "darkgreen", "midnightblue")) + scale_y_continuous(expand = c(0, 0), limits = c(0, 120)) + annotate(geom="text", x=1.0, y=85, label="italic(N.S.)", parse=TRUE) + annotate(geom="text", x=2.0, y=23, label="italic(N.S.)", parse=TRUE) + geom_segment(aes(x = 1.0, y = 90, xend = 1.0, yend = 100)) + geom_segment(aes(x = 1.0, y = 100, xend = 2.0, yend = 100)) + geom_segment(aes(x = 2.0, y = 100, xend = 2.0, yend = 32)) + annotate("text", x = 1.5, y = 110, label = "Mean Difference (4.5x)") + annotate("text", x = 1.5, y = 103.5, size=3, label = "Paired~t-test~(italic(p) < 0.001)", parse = TRUE)
co2_gas_barplot

Run statistics for differences between sampling time points within each tundra ecosystem.

# Load CO2 data
co2_anova<-read.csv("Stats.Data/co2.anova.csv")
# Run ANOVA for Tuss differences
tuss_co2_anova<-aov(Tuss_CO2~Time, data=co2_anova)
summary.aov(tuss_co2_anova)
            Df Sum Sq Mean Sq F value Pr(>F)
Time         2   21.4    10.7   0.033  0.968
Residuals    6 1941.3   323.6               
TukeyHSD(tuss_co2_anova)
  Tukey multiple comparisons of means
    95% family-wise confidence level

Fit: aov(formula = Tuss_CO2 ~ Time, data = co2_anova)

$Time
            diff       lwr      upr     p adj
T24-T0  3.687107 -41.37615 48.75037 0.9660478
T4-T0   2.553929 -42.50933 47.61719 0.9835136
T4-T24 -1.133178 -46.19644 43.93008 0.9967251
# Run ANOVA for WS differences
ws_co2_anova<-aov(WS_CO2~Time, data=co2_anova)
summary.aov(ws_co2_anova)
            Df Sum Sq Mean Sq F value Pr(>F)
Time         2  12.61   6.303   1.512  0.294
Residuals    6  25.02   4.170               
TukeyHSD(ws_co2_anova)
  Tukey multiple comparisons of means
    95% family-wise confidence level

Fit: aov(formula = WS_CO2 ~ Time, data = co2_anova)

$Time
             diff       lwr      upr     p adj
T24-T0  2.0835744 -3.032353 7.199502 0.4701724
T4-T0  -0.7038709 -5.819798 4.412056 0.9078917
T4-T24 -2.7874453 -7.903373 2.328482 0.2898464

Run t-test for differences in CO2 production between tundra ecosystems

t.test(co2.t.test$Tuss,co2.t.test$WS,paired=TRUE)

    Paired t-test

data:  co2.t.test$Tuss and co2.t.test$WS
t = 47.676, df = 2, p-value = 0.0004397
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 40.79162 48.88477
sample estimates:
mean of the differences 
               44.83819 

Methane Production

Plot the CH4 data for methane production.

# Place categories in preferred order for plotting
ch4_gas$Veg<-factor(ch4_gas$Veg, levels=c("Tussock","Wet Sedge"))

ch4_gas$Sample <- factor(ch4_gas$Sample,levels=c("Tuss-T0","WS-T0","Tuss-T4","WS-T4","Tuss-T24","WS-T24"))

ch4_gas_barplot<-ggplot(ch4_gas, aes(x = Veg, y = Mean, fill = Sample)) + geom_bar(stat = "identity", position = "dodge", color="black") + geom_errorbar(aes(ymin = Mean - SD, ymax = Mean + SD), width = 0.2, position = position_dodge(0.9)) + ylab(expression(atop("Methane Production", paste(CH[4]~(pg~C~g^{"-1"}~soil~hr^{"-1"}))))) + theme_classic() + theme(axis.text=element_text(size=10), axis.title=element_text(size=12), axis.title.x=element_blank()) + theme(legend.position = "bottom", legend.title=element_blank(), legend.text=element_text(size=8), panel.background = element_blank(), panel.grid.major = element_blank(), panel.grid.minor = element_blank(), panel.border = element_blank()) + scale_size(guide=FALSE) + scale_fill_manual(values=c("palegreen", "lightskyblue1", "green3", "dodgerblue1", "darkgreen", "midnightblue")) + scale_y_continuous(expand = c(0, 0), limits = c(-10, 40)) + geom_hline(aes(yintercept = 0), color="black") + annotate(geom="text", x=0.7, y=25, label="a", parse=TRUE) + annotate(geom="text", x=1.0, y=-6, label="b", parse=TRUE) + annotate(geom="text", x=1.3, y=-6, label="b", parse=TRUE) + annotate(geom="text", x=1.7, y=13, label="a", parse=TRUE) + annotate(geom="text", x=2.0, y=-8, label="b", parse=TRUE) + annotate(geom="text", x=2.3, y=-8, label="b", parse=TRUE)
ch4_gas_barplot

Run statistics for differences between sampling time points within each tundra ecosystem.

# Run ANOVA for Tuss differences
tuss_ch4_anova<-aov(Tuss_CH4~Time, data=ch4_anova)
tuss_ch4_anova
Call:
   aov(formula = Tuss_CH4 ~ Time, data = ch4_anova)

Terms:
                    Time Residuals
Sum of Squares  758.3840   48.1623
Deg. of Freedom        2         6

Residual standard error: 2.833204
Estimated effects may be unbalanced
TukeyHSD(tuss_ch4_anova)
  Tukey multiple comparisons of means
    95% family-wise confidence level

Fit: aov(formula = Tuss_CH4 ~ Time, data = ch4_anova)

$Time
              diff        lwr        upr     p adj
T24-T0 -19.6798033 -26.777647 -12.581960 0.0003546
T4-T0  -19.2590856 -26.356929 -12.161242 0.0003999
T4-T24   0.4207178  -6.677126   7.518561 0.9819852
# Run ANOVA for WS differences
ws_ch4_anova<-aov(WS_CH4~Time, data=ch4_anova)
ws_ch4_anova
Call:
   aov(formula = WS_CH4 ~ Time, data = ch4_anova)

Terms:
                    Time Residuals
Sum of Squares  327.3446   17.3485
Deg. of Freedom        2         6

Residual standard error: 1.700418
Estimated effects may be unbalanced
TukeyHSD(ws_ch4_anova)
  Tukey multiple comparisons of means
    95% family-wise confidence level

Fit: aov(formula = WS_CH4 ~ Time, data = ch4_anova)

$Time
            diff        lwr       upr     p adj
T24-T0 -13.29290 -17.552844 -9.032951 0.0001826
T4-T0  -12.22735 -16.487295 -7.967402 0.0002923
T4-T24   1.06555  -3.194397  5.325496 0.7349851

Reproducibility

The session information is provided for full reproducibility.

devtools::session_info()
─ Session info ──────────────────────────────────────────────────────────────────────────────────────
 setting  value
 version  R version 4.1.2 (2021-11-01)
 os       macOS Big Sur 10.16
 system   x86_64, darwin17.0
 ui       RStudio
 language (EN)
 collate  en_US.UTF-8
 ctype    en_US.UTF-8
 tz       America/Los_Angeles
 date     2022-01-24
 rstudio  1.4.1106 Tiger Daylily (desktop)
 pandoc   2.11.4 @ /Applications/RStudio.app/Contents/MacOS/pandoc/ (via rmarkdown)

─ Packages ──────────────────────────────────────────────────────────────────────────────────────────
 package      * version date (UTC) lib source
 abind          1.4-5   2016-07-21 [1] CRAN (R 4.1.0)
 ape          * 5.6-1   2022-01-07 [1] CRAN (R 4.1.2)
 assertthat     0.2.1   2019-03-21 [1] CRAN (R 4.1.0)
 backports      1.4.1   2021-12-13 [1] CRAN (R 4.1.0)
 brio           1.1.3   2021-11-30 [1] CRAN (R 4.1.0)
 broom          0.7.11  2022-01-03 [1] CRAN (R 4.1.2)
 cachem         1.0.6   2021-08-19 [1] CRAN (R 4.1.0)
 callr          3.7.0   2021-04-20 [1] CRAN (R 4.1.0)
 car            3.0-12  2021-11-06 [1] CRAN (R 4.1.0)
 carData        3.0-5   2022-01-06 [1] CRAN (R 4.1.2)
 cellranger     1.1.0   2016-07-27 [1] CRAN (R 4.1.0)
 cli            3.1.1   2022-01-20 [1] CRAN (R 4.1.2)
 cluster        2.1.2   2021-04-17 [1] CRAN (R 4.1.2)
 colorspace     2.0-2   2021-06-24 [1] CRAN (R 4.1.0)
 cowplot      * 1.1.1   2020-12-30 [1] CRAN (R 4.1.0)
 crayon         1.4.2   2021-10-29 [1] CRAN (R 4.1.0)
 data.table   * 1.14.2  2021-09-27 [1] CRAN (R 4.1.0)
 DBI            1.1.2   2021-12-20 [1] CRAN (R 4.1.0)
 dbplyr         2.1.1   2021-04-06 [1] CRAN (R 4.1.0)
 desc           1.4.0   2021-09-28 [1] CRAN (R 4.1.0)
 devtools     * 2.4.3   2021-11-30 [1] CRAN (R 4.1.0)
 digest         0.6.29  2021-12-01 [1] CRAN (R 4.1.0)
 dplyr        * 1.0.7   2021-06-18 [1] CRAN (R 4.1.0)
 DT           * 0.20    2021-11-15 [1] CRAN (R 4.1.0)
 ellipsis       0.3.2   2021-04-29 [1] CRAN (R 4.1.0)
 evaluate       0.14    2019-05-28 [1] CRAN (R 4.1.0)
 fansi          1.0.2   2022-01-14 [1] CRAN (R 4.1.2)
 farver         2.1.0   2021-02-28 [1] CRAN (R 4.1.0)
 fastmap        1.1.0   2021-01-25 [1] CRAN (R 4.1.0)
 forcats      * 0.5.1   2021-01-27 [1] CRAN (R 4.1.0)
 fs             1.5.2   2021-12-08 [1] CRAN (R 4.1.0)
 generics       0.1.1   2021-10-25 [1] CRAN (R 4.1.0)
 ggplot2      * 3.3.5   2021-06-25 [1] CRAN (R 4.1.0)
 ggpubr       * 0.4.0   2020-06-27 [1] CRAN (R 4.1.0)
 ggsignif       0.6.3   2021-09-09 [1] CRAN (R 4.1.0)
 glue           1.6.0   2021-12-17 [1] CRAN (R 4.1.0)
 gridExtra    * 2.3     2017-09-09 [1] CRAN (R 4.1.0)
 gtable         0.3.0   2019-03-25 [1] CRAN (R 4.1.0)
 haven          2.4.3   2021-08-04 [1] CRAN (R 4.1.0)
 highr          0.9     2021-04-16 [1] CRAN (R 4.1.0)
 hms            1.1.1   2021-09-26 [1] CRAN (R 4.1.0)
 htmltools      0.5.2   2021-08-25 [1] CRAN (R 4.1.0)
 htmlwidgets    1.5.4   2021-09-08 [1] CRAN (R 4.1.0)
 httr           1.4.2   2020-07-20 [1] CRAN (R 4.1.0)
 jquerylib      0.1.4   2021-04-26 [1] CRAN (R 4.1.0)
 jsonlite       1.7.3   2022-01-17 [1] CRAN (R 4.1.2)
 kableExtra   * 1.3.4   2021-02-20 [1] CRAN (R 4.1.0)
 knitr        * 1.37    2021-12-16 [1] CRAN (R 4.1.0)
 labeling       0.4.2   2020-10-20 [1] CRAN (R 4.1.0)
 lattice      * 0.20-45 2021-09-22 [1] CRAN (R 4.1.2)
 lifecycle      1.0.1   2021-09-24 [1] CRAN (R 4.1.0)
 lubridate      1.8.0   2021-10-07 [1] CRAN (R 4.1.0)
 magrittr       2.0.1   2020-11-17 [1] CRAN (R 4.1.0)
 MASS           7.3-55  2022-01-13 [1] CRAN (R 4.1.2)
 Matrix         1.4-0   2021-12-08 [1] CRAN (R 4.1.0)
 memoise        2.0.1   2021-11-26 [1] CRAN (R 4.1.0)
 mgcv           1.8-38  2021-10-06 [1] CRAN (R 4.1.2)
 modelr         0.1.8   2020-05-19 [1] CRAN (R 4.1.0)
 munsell        0.5.0   2018-06-12 [1] CRAN (R 4.1.0)
 nlme           3.1-155 2022-01-13 [1] CRAN (R 4.1.2)
 permute      * 0.9-5   2019-03-12 [1] CRAN (R 4.1.0)
 pheatmap     * 1.0.12  2019-01-04 [1] CRAN (R 4.1.0)
 pillar         1.6.4   2021-10-18 [1] CRAN (R 4.1.0)
 pkgbuild       1.3.1   2021-12-20 [1] CRAN (R 4.1.0)
 pkgconfig      2.0.3   2019-09-22 [1] CRAN (R 4.1.0)
 pkgload        1.2.4   2021-11-30 [1] CRAN (R 4.1.0)
 plyr           1.8.6   2020-03-03 [1] CRAN (R 4.1.0)
 png          * 0.1-7   2013-12-03 [1] CRAN (R 4.1.0)
 prettyunits    1.1.1   2020-01-24 [1] CRAN (R 4.1.0)
 processx       3.5.2   2021-04-30 [1] CRAN (R 4.1.0)
 ps             1.6.0   2021-02-28 [1] CRAN (R 4.1.0)
 purrr        * 0.3.4   2020-04-17 [1] CRAN (R 4.1.0)
 R6             2.5.1   2021-08-19 [1] CRAN (R 4.1.0)
 RColorBrewer * 1.1-2   2014-12-07 [1] CRAN (R 4.1.0)
 Rcpp           1.0.8   2022-01-13 [1] CRAN (R 4.1.2)
 readr        * 2.1.1   2021-11-30 [1] CRAN (R 4.1.0)
 readxl         1.3.1   2019-03-13 [1] CRAN (R 4.1.0)
 remotes        2.4.2   2021-11-30 [1] CRAN (R 4.1.0)
 reprex         2.0.1   2021-08-05 [1] CRAN (R 4.1.0)
 reshape      * 0.8.8   2018-10-23 [1] CRAN (R 4.1.0)
 rlang          0.4.12  2021-10-18 [1] CRAN (R 4.1.0)
 rmarkdown      2.11    2021-09-14 [1] CRAN (R 4.1.0)
 rprojroot      2.0.2   2020-11-15 [1] CRAN (R 4.1.0)
 rsconnect      0.8.25  2021-11-19 [1] CRAN (R 4.1.0)
 rstatix      * 0.7.0   2021-02-13 [1] CRAN (R 4.1.0)
 rstudioapi     0.13    2020-11-12 [1] CRAN (R 4.1.0)
 rvest          1.0.2   2021-10-16 [1] CRAN (R 4.1.0)
 scales         1.1.1   2020-05-11 [1] CRAN (R 4.1.0)
 sessioninfo    1.2.2   2021-12-06 [1] CRAN (R 4.1.0)
 statmod      * 1.4.36  2021-05-10 [1] CRAN (R 4.1.0)
 stringi        1.7.6   2021-11-29 [1] CRAN (R 4.1.0)
 stringr      * 1.4.0   2019-02-10 [1] CRAN (R 4.1.0)
 svglite        2.0.0   2021-02-20 [1] CRAN (R 4.1.0)
 systemfonts    1.0.3   2021-10-13 [1] CRAN (R 4.1.2)
 testthat       3.1.2   2022-01-20 [1] CRAN (R 4.1.2)
 tibble       * 3.1.6   2021-11-07 [1] CRAN (R 4.1.0)
 tidyr        * 1.1.4   2021-09-27 [1] CRAN (R 4.1.0)
 tidyselect     1.1.1   2021-04-30 [1] CRAN (R 4.1.0)
 tidyverse    * 1.3.1   2021-04-15 [1] CRAN (R 4.1.0)
 tinytex        0.36    2021-12-19 [1] CRAN (R 4.1.0)
 tzdb           0.2.0   2021-10-27 [1] CRAN (R 4.1.0)
 usethis      * 2.1.5   2021-12-09 [1] CRAN (R 4.1.0)
 utf8           1.2.2   2021-07-24 [1] CRAN (R 4.1.0)
 vctrs          0.3.8   2021-04-29 [1] CRAN (R 4.1.0)
 vegan        * 2.5-7   2020-11-28 [1] CRAN (R 4.1.0)
 viridisLite    0.4.0   2021-04-13 [1] CRAN (R 4.1.0)
 webshot        0.5.2   2019-11-22 [1] CRAN (R 4.1.0)
 withr          2.4.3   2021-11-30 [1] CRAN (R 4.1.0)
 xfun           0.29    2021-12-14 [1] CRAN (R 4.1.0)
 xml2           1.3.3   2021-11-30 [1] CRAN (R 4.1.0)
 yaml         * 2.2.1   2020-02-01 [1] CRAN (R 4.1.0)

 [1] /Library/Frameworks/R.framework/Versions/4.1/Resources/library

─────────────────────────────────────────────────────────────────────────────────────────────────────
LS0tCnRpdGxlOiAiTWljcm9iaWFsIFJlc3BvbnNlIHRvIFJhaW5mYWxsIC0tIEdhcyBDaHJvbWF0b2dyYXBoeSBBbmFseXNpcyIKYXV0aG9yOiAnQXV0aG9yczogW0thcmwgSi4gUm9tYW5vd2ljel0oaHR0cHM6Ly9sc2EudW1pY2guZWR1L2VlYi9wZW9wbGUvZ3JhZHVhdGUtc3R1ZGVudHMva2pyb21hbm8uaHRtbCksCiAgQnlyb24gQy4gQ3J1bXAsIEdlb3JnZSBXLiBLbGluZycKb3V0cHV0OgogIGh0bWxfbm90ZWJvb2s6CiAgICB0aGVtZTogc3BhY2VsYWIKICAgIHRvYzogeWVzCiAgICB0b2NfZGVwdGg6IDUKICAgIHRvY19mbG9hdDoKICAgICAgY29sbGFwc2VkOiB5ZXMKICAgICAgc21vb3RoX3Njcm9sbDogeWVzCiAgaHRtbF9kb2N1bWVudDoKICAgIHRvYzogeWVzCiAgICB0b2NfZGVwdGg6ICc1JwogICAgZGZfcHJpbnQ6IHBhZ2VkCiAgcGRmX2RvY3VtZW50OgogICAgdG9jOiB5ZXMKICAgIHRvY19kZXB0aDogJzUnCi0tLQoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KCioqUiBOb3RlYm9vazoqKiBQcm92aWRlcyByZXByb2R1Y2libGUgYW5hbHlzaXMgZm9yIGdhcyBjaHJvbWF0b2dyYXBoeSAoR0MpIGRhdGEgaW4gdGhlIGZvbGxvd2luZyBtYW51c2NyaXB0OgoKKipDaXRhdGlvbjoqKiBSb21hbm93aWN6LCBLSiwgQ3J1bXAsIEJDLCBLbGluZywgR1cuICgyMDIxKSBSYWluZmFsbCBhbHRlcnMgcGVybWFmcm9zdCBzb2lsIHJlZG94IGNvbmRpdGlvbnMsIGJ1dCBtZXRhLW9taWNzIHNob3cgZGl2ZXJnZW50IG1pY3JvYmlhbCBjb21tdW5pdHkgcmVzcG9uc2VzIGJ5IHR1bmRyYSB0eXBlIGluIHRoZSBhcmN0aWMuIFNvaWwgU3lzdGVtcyA1KDEpOiAxNy4gW2h0dHBzOi8vZG9pLm9yZy8xMC4zMzkwL3NvaWxzeXN0ZW1zNTAxMDAxN10oaHR0cHM6Ly9kb2kub3JnLzEwLjMzOTAvc29pbHN5c3RlbXM1MDEwMDE3KQoKKipHaXRIdWIgUmVwb3NpdG9yeToqKiBbaHR0cHM6Ly9naXRodWIuY29tL2tyb21hbm93aWN6LzIwMjEtUm9tYW5vd2ljei1Tb2lsU3lzdGVtc10oaHR0cHM6Ly9naXRodWIuY29tL2tyb21hbm93aWN6LzIwMjEtUm9tYW5vd2ljei1Tb2lsU3lzdGVtcykKCioqTkNCSSBCaW9Qcm9qZWN0OioqIFtodHRwczovL3d3dy5uY2JpLm5sbS5uaWguZ292L2Jpb3Byb2plY3QvUFJKTkE2NjY0MjldKGh0dHBzOi8vd3d3Lm5jYmkubmxtLm5paC5nb3YvYmlvcHJvamVjdC9QUkpOQTY2NjQyOSkKCioqQWNjZXB0ZWQgZm9yIFB1YmxpY2F0aW9uOioqICpTb2lsIFN5c3RlbXMqIDEwIE1hcmNoIDIwMjEKCiMgRXhwZXJpbWVudAoKVGhpcyBSIE5vdGVib29rIHByb3ZpZGVzIGNvbXBsZXRlIHJlcHJvZHVjaWJpbGl0eSBvZiB0aGUgZGF0YSBhbmFseXNpcyBpbiAqKioiUmFpbmZhbGwgYWx0ZXJzIHBlcm1hZnJvc3Qgc29pbCByZWRveCBjb25kaXRpb25zLCBidXQgbWV0YS1vbWljcyBzaG93IGRpdmVyZ2VudCBtaWNyb2JpYWwgY29tbXVuaXR5IHJlc3BvbnNlcyBieSB0dW5kcmEgdHlwZSBpbiB0aGUgQXJjdGljICIqKiogYnkgUm9tYW5vd2ljeiwgQ3J1bXAsIGFuZCBLbGluZy4gSW4gdGhpcyBleHBlcmltZW50LCBtZXNvY29zbXMgY29udGFpbmluZyBzb2lsIGZyb20gdGhlIGFjdGl2ZSBsYXllciBvZiB0d28gZG9taW5hbnQgdHVuZHJhIHR5cGVzIHdlcmUgc3ViamVjdGVkIHRvIHNpbXVsYXRlZCByYWluZmFsbCB0byBhbHRlciByZWRveCBjb25kaXRpb25zLiAgVGhlIG1pY3JvYmlhbCBmdW5jdGlvbmFsIHBvdGVudGlhbCAobWV0YWdlbm9taWNzKSBhbmQgZ2VuZSBleHByZXNzaW9uIChtZXRhdHJhbnNjcmlwdG9taWNzKSBwYXR0ZXJucyB3ZXJlIG1lYXN1cmVkIGR1cmluZyBzYXR1cmF0ZWQgYW5veGljIHJlZG94IGNvbmRpdGlvbnMgcHJpb3IgdG8gcmFpbmZhbGwgYW5kIGF0IG11bHRpcGxlIHRpbWUgcG9pbnRzIGZvbGxvd2luZyB0aGUgc2ltdWxhdGVkIHJhaW5mYWxsIGV2ZW50LiBPdGhlciBtZWFzdXJlbWVudHMgaW5jbHVkZSBzb2lsIHByb3BlcnRpZXMgYXMgd2VsbCBhcyBtaWNyb2JpYWwgcmVzcGlyYXRpb24gKENPfjJ+KSBhbmQgbWV0aGFuZSAoQ0h+NH4pIHByb2R1Y3Rpb24gZnJvbSBzb2lsIHN1YnNhbXBsZXMgY29sbGVjdGVkIGF0IGVhY2ggc2FtcGxpbmcgdGltZSBwb2ludC4gVGhlIHB1cnBvc2Ugd2FzIHRvIGRldGVybWluZSBpZiByYWluZmFsbCwgYXMgYSBmb3JtIG9mIHNvaWwgb3hpZGF0aW9uLCBpcyBzdWZmaWNpZW50IHRvIGFsdGVyIHRoZSBhbm94aWMgcmVkb3ggY29uZGl0aW9ucyBpbiBhcmN0aWMgdHVuZHJhIGFuZCBlbmhhbmNlIHRoZSBtaWNyb2JpYWwgZGVncmFkYXRpb24gb2Ygb3JnYW5pYyBjYXJib24gYW5kIENIfjR+IHRvIENPfjJ+LgoKPCEtLSBEaXNwbGF5IEZpZ3VyZSAxIC0tPgohW10oUi5JbWFnZXMvQ29uY2VwdDEucG5nKQoqKkNvbmNlcHR1YWwgRmlndXJlLioqICBBIHRvdGFsIG9mIDEyIHR1bmRyYSBtZXNvY29zbXMgKDMgcmVwbGljYXRlcyB4IDIgdHVuZHJhIHR5cGVzIHggMiBzZXRzIG9mIHJlc3BvbnNlIGNvcmVzKSB3ZXJlIGFjY2xpbWF0ZWQgaW5pdGlhbGx5IHVuZGVyIGFub3hpYyByZWRveCBjb25kaXRpb25zIHRvIG1pbWljIGZpZWxkIGNvbmRpdGlvbnMgKFQwKS4gIERpc3NvbHZlZCBveHlnZW4gd2FzIHN1cHBsaWVkIHRvIHNvaWxzIHRocm91Z2ggdGhlIGRvd253YXJkIGZsb3cgb2Ygb3h5Z2VuYXRlZCB3YXRlciBkdXJpbmcgYSBzaW11bGF0ZWQgcmFpbmZhbGwgZXZlbnQuICBEaXNzb2x2ZWQgb3h5Z2VuIHdpbGwgbGlrZWx5IGNoYW5nZSB0aGUgcmVkb3ggZ3JhZGllbnQgZGlyZWN0bHkgZm9sbG93aW5nIHJhaW5mYWxsIChUNCkgYXMgYSBzaG9ydC10ZXJtIGVmZmVjdC4gIEFub3hpYyBjb25kaXRpb25zIHdpbGwgbGlrZWx5IGJlIHJlLWVzdGFibGlzaGVkIGFmdGVyIDI0IGhvdXJzIChUMjQpIGFzIHRoZSBwdWxzZSBvZiBveHlnZW4gaXMgY29uc3VtZWQgdGhyb3VnaCBhYmlvdGljIGFuZCBiaW90aWMgc29pbCBwcm9jZXNzZXMuICBVbmRlciBhbm94aWMgcmVkb3ggY29uZGl0aW9ucyAoVDApLCBtaWNyb29yZ2FuaXNtcyBsaWtlbHkgZGVncmFkZSBvcmdhbmljIGNhcmJvbiB0aHJvdWdoIGFuYWVyb2JpYyBhbmQgZmVybWVudGF0aW9uIHBhdGh3YXlzLCBwcm9kdWNpbmcgQ0h+NH4gYW5kIHJlZHVjaW5nIEZlKElJSSkgdG8gRmUoSUkpLiAgUmFpbmZhbGwtaW5kdWNlZCBzb2lsIG94aWRhdGlvbiAoVDQpIHNob3VsZCBzdGltdWxhdGUgaGV0ZXJvdHJvcGhpYyBtaWNyb29yZ2FuaXNtcyB0aGF0IGRlZ3JhZGUgb3JnYW5pYyBjYXJib24gYW5kIENIfjR+IHRocm91Z2ggYWVyb2JpYyBtZXRhYm9saWMgcGF0aHdheXMsIHJlbGVhc2luZyBDT34yfi4gU29pbCBveGlkYXRpb24gc2hvdWxkIGFsc28gc3RpbXVsYXRlIGFlcm9iaWMgYXV0b3Ryb3BoaWMgaXJvbiBveGlkaXppbmcgYmFjdGVyaWEgdGhhdCBveGlkaXplIEZlKElJKSB0byBGZShJSUkpIGFuZCBjb252ZXJ0IENPfjJ+IGludG8gbWljcm9iaWFsIGJpb21hc3MuICBUaGUgbG9uZy10ZXJtIHJlc3BvbnNlIChUMjQpIHdpbGwgbGlrZWx5IGJlIGEgY29tYmluYXRpb24gb2YgYWVyb2JpYyBhbmQgYW5hZXJvYmljIG1ldGFib2xpc20gYXMgd2VsbCBhcyBhIGNvbWJpbmF0aW9uIG9mIHJlZHVjdGlvbiBhbmQgb3hpZGF0aW9uIGlyb24gcmVhY3Rpb25zIGFzIGRpc3NvbHZlZCBveHlnZW4gaXMgY29uc3VtZWQuICBUaGUgcHJlZGljdGVkIHJlZG94IGNvbmRpdGlvbnMgYW5kIHByZWRpY3RlZCByZWRveCByZWFjdGlvbnMgZm9yIGNvdXBsZWQgRmUoSUkpL0ZlKElJSSkgY3ljbGluZywgYXMgd2VsbCBhcyB0aGUgbWljcm9iaWFsLWluZHVjZWQgcmVsZWFzZSBvZiBDT34yfiBvciBDSH40fiBhdCBlYWNoIHRpbWUgcG9pbnQgYXJlIGJhc2VkIG9uIHRoZSBwcmVkaWN0ZWQgYXZhaWxhYmlsaXR5IG9mIGRpc3NvbHZlZCBveHlnZW4gZW50ZXJpbmcgdHVuZHJhIHNvaWxzIHRocm91Z2ggc2ltdWxhdGVkIHJhaW5mYWxsLgoKPGZvbnQgY29sb3I9ImJsdWUiPioqU29pbCBTYW1wbGluZyBmb3IgTWljcm9iaWFsIEdlbmUgRXhwcmVzc2lvbioqPC9mb250PgoKQW4gaW5pdGlhbCBzb2lsIHNhbXBsaW5nIGV2ZW50IGZvciBtaWNyb2JpYWwgYWN0aXZpdHkgd2FzIGNvbmR1Y3RlZCBhdCB0aGUgZW5kIG9mIHRoZSBhbm94aWMgYWNjbGltYXRpb24gcGVyaW9kICg0LTcgZGF5cykgaW4gYWxsIG1lc29jb3NtIHJlcGxpY2F0ZXMsIHJlcHJlc2VudGluZyBzYW1wbGluZyB0aW1lIHBvaW50ICoqVDAqKi4gIE1lc29jb3NtcyB3ZXJlIHRoZW4gZmx1c2hlZCB0byBzaW11bGF0ZSBhIHJhaW5mYWxsIGV2ZW50LiAgQWRkaXRpb25hbCBzb2lsIHNhbXBsaW5nIGV2ZW50cyB3ZXJlIGNvbmR1Y3RlZCBhdCAqKlQ0KiogKDQtaHJzKSBhbmQgKipUMjQqKiAoMjQtaHJzKSBmb2xsb3dpbmcgdGhlIHJhaW5mYWxsIGV2ZW50IHRvIGRldGVybWluZSB0aGUgdGVtcG9yYWwgZXh0ZW50IG9mIG1pY3JvYmlhbCBnZW5lIGV4cHJlc3Npb24uICBTb2lsIGNvcmVzICgyLjU0IGNtIGRpYW1ldGVyLCAzMCBjbSBsZW5ndGgpIHdlcmUgZXh0cmFjdGVkIGluIGR1cGxpY2F0ZSBmcm9tIGVhY2ggbWVzb2Nvc20gcmVwbGljYXRlIGF0IGVhY2ggc2FtcGxpbmcgdGltZSBwb2ludCBhbmQgaG9tb2dlbml6ZWQgYnkgZGVwdGggaW4gMTAtY20gaW5jcmVtZW50cy4gIFRoZSAxMC0yMCBjbSBzb2lsIGluY3JlbWVudCwgY29tcG9zZWQgb2Ygb3JnYW5pYyBzb2lsIGluIGFsbCBtZXNvY29zbSByZXBsaWNhdGVzLCB3YXMgY2hvc2VuIGZvciBtaWNyb2JpYWwgZ2VuZSBleHByZXNzaW9uIGFuYWx5c2lzIGFuZCBwcmVzZXJ2ZWQgaW4gUk5BbGF0ZXIgU3RhYmlsaXphdGlvbiBSZWFnZW50IGluIHN0ZXJpbGUgdHViZXMgYXQgNCZkZWc7QyBmb3IgMTggaG91cnMgYW5kIHRoZW4gc3RvcmVkIGF0IC04MCZkZWc7QyB1bnRpbCBleHRyYWN0aW9uLgoKIVtdKFIuSW1hZ2VzL0J1Y2tldHMucG5nKQoKKipGaWVsZCBFeHBlcmltZW50LioqIFR1bmRyYSBzb2lsIGNvcmVzIHdlcmUgY29sbGVjdGVkIGZyb20gZmllbGQgc2l0ZXMgaW4gQXVndXN0IDIwMTcgKHRvcCBsZWZ0KSBhbmQgcGxhY2VkIGluIGJ1Y2tldHMgdG8gZXN0YWJsaXNoIHRoZSBtZXNvY29zbSBleHBlcmltZW50IChib3R0b20gbGVmdCkuICBUdXNzb2NrIHR1bmRyYSBjb3JlcyB3ZXJlIGNvbXBvc2VkIG9mIGFuIG9yZ2FuaWMgc29pbCBsYXllciBvdmVybHlpbmcgYSBtaW5lcmFsIHNvaWwgbGF5ZXIgKHRvcCBtaWRkbGUpIHdoaWxlIHdldCBzZWRnZSB0dW5kcmEgY29yZXMgd2VyZSBjb21wb3NlZCBlbnRpcmVseSBvZiBvcmdhbmljIHNvaWwgKGJvdHRvbSBtaWRkbGUpLiAgU29pbCBzdWJzYW1wbGluZyBmb3IgbWljcm9iaWFsIGFjdGl2aXR5IHdhcyB0YWtlbiBmcm9tIHRoZSAxMC0yMCBjbSBkZXB0aCBvZiBkdXBsaWNhdGUgc29pbCBjb3JlcyBpbiBUdXNzb2NrICh0b3AgcmlnaHQpIGFuZCBXZXQgU2VkZ2UgKGJvdHRvbSByaWdodCkuCgpgYGB7ciBlY2hvPUZBTFNFfQojIFNldCBnbG9iYWwgb3B0aW9ucyBmb3Igbm90ZWJvb2sKa25pdHI6Om9wdHNfa25pdCRzZXQocm9vdC5kaXIgPSBub3JtYWxpemVQYXRoKCJ+L0Rlc2t0b3AvUmFpblNpbTIwMTciKSkKa25pdHI6Om9wdHNfY2h1bmskc2V0KGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD04LCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFKQpgYGAKCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHJlc3VsdHM9J2hpZGUnLCB3YXJuaW5nPUZBTFNFfQojIE1ha2UgYSB2ZWN0b3Igb2YgcmVxdWlyZWQgcGFja2FnZXMKcmVxdWlyZWQucGFja2FnZXMgPC0gYygiYXBlIiwiY293cGxvdCIsImRhdGEudGFibGUiLCJkZXZ0b29scyIsImRwbHlyIiwiRFQiLCJnZ3Bsb3QyIiwiZ2dwdWJyIiwiZ3JpZCIsImdyaWRFeHRyYSIsImthYmxlRXh0cmEiLCJrbml0ciIsInBoZWF0bWFwIiwicG5nIiwiUkNvbG9yQnJld2VyIiwicmVzaGFwZSIsInJzdGF0aXgiLCJzdGF0bW9kIiwic3RyaW5nciIsInRpYmJsZSIsInRpZHlyIiwidGlkeXZlcnNlIiwidmVnYW4iLCJ5YW1sIikKCiMgTG9hZCByZXF1aXJlZCBwYWNrYWdlcwpsYXBwbHkocmVxdWlyZWQucGFja2FnZXMsIGxpYnJhcnksIGNoYXJhY3Rlci5vbmx5ID0gVFJVRSkKYGBgCgojIFNvaWwgSW5jdWJhdGlvbgoKQSBzdWJzZXQgb2YgZWFjaCBzb2lsIHNhbXBsZSBjb2xsZWN0ZWQgZnJvbSB0aGUgMTAtMjAgY20gZGVwdGggZHVyaW5nIHRoZSBtZXNvY29zbSBleHBlcmltZW50IHdlcmUgc2VhbGVkIGluIGphcnMgZm9yIGFuIGluY3ViYXRpb24gZXhwZXJpbWVudCB0byBtZWFzdXJlIG1pY3JvYmlhbCByZXNwaXJhdGlvbiBhbmQgbWV0aGFuZSBwcm9kdWN0aW9uLiAgSmFycyBjb250YWluaW5nIHNvaWwgZnJvbSB0aGUgd2V0IHNlZGdlIHR1bmRyYSBlY29zeXN0ZW0gd2VyZSBwdXJnZWQgd2l0aCBOfjJ+IHRvIHJlcHJvZHVjZSBhbmFlcm9iaWMgZmllbGQgY29uZGl0aW9ucy4gIEVhY2ggamFyIHdhcyBzZWFsZWQgd2l0aCBhbiBhaXJ0aWdodCBsaWQgdGhhdCBjb250YWluZWQgYSBzZXB0dW0gZm9yIGdhcyBzYW1wbGluZy4gIEphcnMgd2VyZSBpbmN1YmF0ZWQgZm9yIDUgZGF5cyBpbiB0aGUgZGFyayBhdCBmaWVsZCB0ZW1wZXJhdHVyZSAoNCReXGNpcmMkQykuICBGb2xsb3dpbmcgdGhlIDUtZGF5IGluY3ViYXRpb24sIHdlIHJlbW92ZWQgMjAgbUwgb2YgaGVhZHNwYWNlIGdhcyBpbiBhbiBldmFjdWF0ZWQgc3lyaW5nZSBhbmQgaW1tZWRpYXRlbHkgYW5hbHl6ZWQgQ09+Mn4gYW5kIENIfjR+IGNvbmNlbnRyYXRpb25zIHZpYSBnYXMgY2hyb21vdG9ncmFwaHkuCgohW10oUi5JbWFnZXMvR2FzZXMucG5nKQoKIyMgTWljcm9iaWFsIFJlc3BpcmF0aW9uCgpgYGB7ciBlY2hvPUZBTFNFfQojIExvYWQgdGhlIENPMiBwcm9kdWN0aW9uIGRhdGEKY28yX2dhczwtcmVhZC5jc3YoIlBsb3QuRGF0YS9DTzIuZ2FzLmJhcnBsb3QuY3N2IikKYGBgCgpQbG90IHRoZSBDT34yfiBkYXRhIGZvciBtaWNyb2JpYWwgcmVzcGlyYXRpb24uCgpgYGB7cn0KIyBQbGFjZSBjYXRlZ29yaWVzIGluIHByZWZlcnJlZCBvcmRlciBmb3IgcGxvdHRpbmcKY28yX2dhcyRWZWc8LWZhY3RvcihjbzJfZ2FzJFZlZywgbGV2ZWxzPWMoIlR1c3NvY2siLCJXZXQgU2VkZ2UiKSkKCmNvMl9nYXMkU2FtcGxlIDwtIGZhY3RvcihjbzJfZ2FzJFNhbXBsZSxsZXZlbHM9YygiVHVzcy1UMCIsIldTLVQwIiwiVHVzcy1UNCIsIldTLVQ0IiwiVHVzcy1UMjQiLCJXUy1UMjQiKSkKCmNvMl9nYXNfYmFycGxvdDwtZ2dwbG90KGNvMl9nYXMsIGFlcyh4ID0gVmVnLCB5ID0gTWVhbiwgZmlsbCA9IFNhbXBsZSkpICsgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIHBvc2l0aW9uID0gImRvZGdlIiwgY29sb3I9ImJsYWNrIikgKyBnZW9tX2Vycm9yYmFyKGFlcyh5bWluID0gTWVhbiAtIFNELCB5bWF4ID0gTWVhbiArIFNEKSwgd2lkdGggPSAwLjIsIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2UoMC45KSkgKyB5bGFiKGV4cHJlc3Npb24oYXRvcCgiTWljcm9iaWFsIFJlc3BpcmF0aW9uIiwgcGFzdGUoQ09bMl1+KG5nfkN+Z157Ii0xIn1+c29pbH5ocl57Ii0xIn0pKSkpKSArIHRoZW1lX2NsYXNzaWMoKSArIHRoZW1lKGF4aXMudGV4dD1lbGVtZW50X3RleHQoc2l6ZT0xMCksIGF4aXMudGl0bGU9ZWxlbWVudF90ZXh0KHNpemU9MTIpLCBheGlzLnRpdGxlLng9ZWxlbWVudF9ibGFuaygpKSArIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iLCBsZWdlbmQudGl0bGU9ZWxlbWVudF9ibGFuaygpLCBsZWdlbmQudGV4dD1lbGVtZW50X3RleHQoc2l6ZT04KSwgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfYmxhbmsoKSwgcGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfYmxhbmsoKSwgcGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSwgcGFuZWwuYm9yZGVyID0gZWxlbWVudF9ibGFuaygpKSArIHNjYWxlX3NpemUoZ3VpZGU9RkFMU0UpICsgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzPWMoInBhbGVncmVlbiIsImxpZ2h0c2t5Ymx1ZTEiLCAiZ3JlZW4zIiwgImRvZGdlcmJsdWUxIiwgImRhcmtncmVlbiIsICJtaWRuaWdodGJsdWUiKSkgKyBzY2FsZV95X2NvbnRpbnVvdXMoZXhwYW5kID0gYygwLCAwKSwgbGltaXRzID0gYygwLCAxMjApKSArIGFubm90YXRlKGdlb209InRleHQiLCB4PTEuMCwgeT04NSwgbGFiZWw9Iml0YWxpYyhOLlMuKSIsIHBhcnNlPVRSVUUpICsgYW5ub3RhdGUoZ2VvbT0idGV4dCIsIHg9Mi4wLCB5PTIzLCBsYWJlbD0iaXRhbGljKE4uUy4pIiwgcGFyc2U9VFJVRSkgKyBnZW9tX3NlZ21lbnQoYWVzKHggPSAxLjAsIHkgPSA5MCwgeGVuZCA9IDEuMCwgeWVuZCA9IDEwMCkpICsgZ2VvbV9zZWdtZW50KGFlcyh4ID0gMS4wLCB5ID0gMTAwLCB4ZW5kID0gMi4wLCB5ZW5kID0gMTAwKSkgKyBnZW9tX3NlZ21lbnQoYWVzKHggPSAyLjAsIHkgPSAxMDAsIHhlbmQgPSAyLjAsIHllbmQgPSAzMikpICsgYW5ub3RhdGUoInRleHQiLCB4ID0gMS41LCB5ID0gMTEwLCBsYWJlbCA9ICJNZWFuIERpZmZlcmVuY2UgKDQuNXgpIikgKyBhbm5vdGF0ZSgidGV4dCIsIHggPSAxLjUsIHkgPSAxMDMuNSwgc2l6ZT0zLCBsYWJlbCA9ICJQYWlyZWR+dC10ZXN0fihpdGFsaWMocCkgPCAwLjAwMSkiLCBwYXJzZSA9IFRSVUUpCmBgYAoKYGBge3J9CmNvMl9nYXNfYmFycGxvdApgYGAKClJ1biBzdGF0aXN0aWNzIGZvciBkaWZmZXJlbmNlcyBiZXR3ZWVuIHNhbXBsaW5nIHRpbWUgcG9pbnRzIHdpdGhpbiBlYWNoIHR1bmRyYSBlY29zeXN0ZW0uCgpgYGB7cn0KIyBMb2FkIENPMiBkYXRhCmNvMl9hbm92YTwtcmVhZC5jc3YoIlN0YXRzLkRhdGEvY28yLmFub3ZhLmNzdiIpCmBgYAoKYGBge3J9CiMgUnVuIEFOT1ZBIGZvciBUdXNzIGRpZmZlcmVuY2VzCnR1c3NfY28yX2Fub3ZhPC1hb3YoVHVzc19DTzJ+VGltZSwgZGF0YT1jbzJfYW5vdmEpCnN1bW1hcnkuYW92KHR1c3NfY28yX2Fub3ZhKQpUdWtleUhTRCh0dXNzX2NvMl9hbm92YSkKCiMgUnVuIEFOT1ZBIGZvciBXUyBkaWZmZXJlbmNlcwp3c19jbzJfYW5vdmE8LWFvdihXU19DTzJ+VGltZSwgZGF0YT1jbzJfYW5vdmEpCnN1bW1hcnkuYW92KHdzX2NvMl9hbm92YSkKVHVrZXlIU0Qod3NfY28yX2Fub3ZhKQpgYGAKClJ1biB0LXRlc3QgZm9yIGRpZmZlcmVuY2VzIGluIENPMiBwcm9kdWN0aW9uIGJldHdlZW4gdHVuZHJhIGVjb3N5c3RlbXMKYGBge3IgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRX0KY28yLnQudGVzdDwtcmVhZC5jc3YoIlN0YXRzLkRhdGEvY28yLnQudGVzdC5jc3YiKQpgYGAKCmBgYHtyIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0V9CnQudGVzdChjbzIudC50ZXN0JFR1c3MsY28yLnQudGVzdCRXUyxwYWlyZWQ9VFJVRSkKYGBgCgojIyBNZXRoYW5lIFByb2R1Y3Rpb24KCmBgYHtyIGVjaG89RkFMU0V9CiMgTG9hZCB0aGUgQ0g0IHByb2R1Y3Rpb24gZGF0YQpjaDRfZ2FzPC1yZWFkLmNzdigiUGxvdC5EYXRhL0NINC5nYXMuYmFycGxvdC5jc3YiKQpgYGAKClBsb3QgdGhlIENIfjR+IGRhdGEgZm9yIG1ldGhhbmUgcHJvZHVjdGlvbi4KCmBgYHtyfQojIFBsYWNlIGNhdGVnb3JpZXMgaW4gcHJlZmVycmVkIG9yZGVyIGZvciBwbG90dGluZwpjaDRfZ2FzJFZlZzwtZmFjdG9yKGNoNF9nYXMkVmVnLCBsZXZlbHM9YygiVHVzc29jayIsIldldCBTZWRnZSIpKQoKY2g0X2dhcyRTYW1wbGUgPC0gZmFjdG9yKGNoNF9nYXMkU2FtcGxlLGxldmVscz1jKCJUdXNzLVQwIiwiV1MtVDAiLCJUdXNzLVQ0IiwiV1MtVDQiLCJUdXNzLVQyNCIsIldTLVQyNCIpKQoKY2g0X2dhc19iYXJwbG90PC1nZ3Bsb3QoY2g0X2dhcywgYWVzKHggPSBWZWcsIHkgPSBNZWFuLCBmaWxsID0gU2FtcGxlKSkgKyBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgcG9zaXRpb24gPSAiZG9kZ2UiLCBjb2xvcj0iYmxhY2siKSArIGdlb21fZXJyb3JiYXIoYWVzKHltaW4gPSBNZWFuIC0gU0QsIHltYXggPSBNZWFuICsgU0QpLCB3aWR0aCA9IDAuMiwgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSgwLjkpKSArIHlsYWIoZXhwcmVzc2lvbihhdG9wKCJNZXRoYW5lIFByb2R1Y3Rpb24iLCBwYXN0ZShDSFs0XX4ocGd+Q35nXnsiLTEifX5zb2lsfmhyXnsiLTEifSkpKSkpICsgdGhlbWVfY2xhc3NpYygpICsgdGhlbWUoYXhpcy50ZXh0PWVsZW1lbnRfdGV4dChzaXplPTEwKSwgYXhpcy50aXRsZT1lbGVtZW50X3RleHQoc2l6ZT0xMiksIGF4aXMudGl0bGUueD1lbGVtZW50X2JsYW5rKCkpICsgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIsIGxlZ2VuZC50aXRsZT1lbGVtZW50X2JsYW5rKCksIGxlZ2VuZC50ZXh0PWVsZW1lbnRfdGV4dChzaXplPTgpLCBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9ibGFuaygpLCBwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9ibGFuaygpLCBwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpLCBwYW5lbC5ib3JkZXIgPSBlbGVtZW50X2JsYW5rKCkpICsgc2NhbGVfc2l6ZShndWlkZT1GQUxTRSkgKyBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9YygicGFsZWdyZWVuIiwgImxpZ2h0c2t5Ymx1ZTEiLCAiZ3JlZW4zIiwgImRvZGdlcmJsdWUxIiwgImRhcmtncmVlbiIsICJtaWRuaWdodGJsdWUiKSkgKyBzY2FsZV95X2NvbnRpbnVvdXMoZXhwYW5kID0gYygwLCAwKSwgbGltaXRzID0gYygtMTAsIDQwKSkgKyBnZW9tX2hsaW5lKGFlcyh5aW50ZXJjZXB0ID0gMCksIGNvbG9yPSJibGFjayIpICsgYW5ub3RhdGUoZ2VvbT0idGV4dCIsIHg9MC43LCB5PTI1LCBsYWJlbD0iYSIsIHBhcnNlPVRSVUUpICsgYW5ub3RhdGUoZ2VvbT0idGV4dCIsIHg9MS4wLCB5PS02LCBsYWJlbD0iYiIsIHBhcnNlPVRSVUUpICsgYW5ub3RhdGUoZ2VvbT0idGV4dCIsIHg9MS4zLCB5PS02LCBsYWJlbD0iYiIsIHBhcnNlPVRSVUUpICsgYW5ub3RhdGUoZ2VvbT0idGV4dCIsIHg9MS43LCB5PTEzLCBsYWJlbD0iYSIsIHBhcnNlPVRSVUUpICsgYW5ub3RhdGUoZ2VvbT0idGV4dCIsIHg9Mi4wLCB5PS04LCBsYWJlbD0iYiIsIHBhcnNlPVRSVUUpICsgYW5ub3RhdGUoZ2VvbT0idGV4dCIsIHg9Mi4zLCB5PS04LCBsYWJlbD0iYiIsIHBhcnNlPVRSVUUpCmBgYAoKYGBge3J9CmNoNF9nYXNfYmFycGxvdApgYGAKCmBgYHtyIGVjaG89RkFMU0UsIGV2YWw9RkFMU0V9CiMgU2F2ZSB0aGUgQ08yIGFuZCBDSDQgcGxvdHMgdG9nZXRoZXIKc2V0RVBTKCkKcG9zdHNjcmlwdCgiRmlnLjUuR2FzZXMuQ08yLkNINC5lcHMiLCB3aWR0aD0xMC4wLCBoZWlnaHQgPSA1LjApCmdnYXJyYW5nZShjbzJfZ2FzX2JhcnBsb3QsIGNoNF9nYXNfYmFycGxvdCwgaGVpZ2h0cz1jKDUsNSksCiAgICAgICAgICBsYWJlbHMgPSBjKCJBIiwiQiIpLAogICAgICAgICAgbmNvbCA9IDIsIG5yb3cgPSAxLCBhbGlnbj0idiIpCmRldi5vZmYoKQpgYGAKClJ1biBzdGF0aXN0aWNzIGZvciBkaWZmZXJlbmNlcyBiZXR3ZWVuIHNhbXBsaW5nIHRpbWUgcG9pbnRzIHdpdGhpbiBlYWNoIHR1bmRyYSBlY29zeXN0ZW0uCgpgYGB7ciBlY2hvPUZBTFNFfQojIExvYWQgQ0g0IGRhdGEKY2g0X2Fub3ZhPC1yZWFkLmNzdigiU3RhdHMuRGF0YS9jaDQuYW5vdmEuY3N2IikKYGBgCgpgYGB7cn0KIyBSdW4gQU5PVkEgZm9yIFR1c3MgZGlmZmVyZW5jZXMKdHVzc19jaDRfYW5vdmE8LWFvdihUdXNzX0NINH5UaW1lLCBkYXRhPWNoNF9hbm92YSkKdHVzc19jaDRfYW5vdmEKVHVrZXlIU0QodHVzc19jaDRfYW5vdmEpCgojIFJ1biBBTk9WQSBmb3IgV1MgZGlmZmVyZW5jZXMKd3NfY2g0X2Fub3ZhPC1hb3YoV1NfQ0g0flRpbWUsIGRhdGE9Y2g0X2Fub3ZhKQp3c19jaDRfYW5vdmEKVHVrZXlIU0Qod3NfY2g0X2Fub3ZhKQpgYGAKCiMgUmVwcm9kdWNpYmlsaXR5CgpUaGUgc2Vzc2lvbiBpbmZvcm1hdGlvbiBpcyBwcm92aWRlZCBmb3IgZnVsbCByZXByb2R1Y2liaWxpdHkuCmBgYHtyfQpkZXZ0b29sczo6c2Vzc2lvbl9pbmZvKCkKYGBg