This is the formal version of the document that’ll be done better than the previous versions.

This’ll be refactored properly too.

Setup

base_web_path <- snakemake@params$base_web_path

notebook_paths <- list(cellularity_depth = snakemake@input$cellularity_depth, 
    pathways_immunoediting = snakemake@input$pathways_immunoediting, rooney_comparison = snakemake@input$rooney_comparison, 
    tilcluster_robustness = snakemake@input$tilcluster_robustness, whole_genome_duplication = snakemake@input$whole_genome_duplication, 
    tilcluster_exprclassification = snakemake@input$tilcluster_exprclassification, 
    tcr_neoepitope_correlation = snakemake@input$tcr_neoepitope_correlation, 
    tilcluster_multipleassignments = snakemake@input$tilcluster_multipleassignments, 
    tilcluster_immuneproperties = snakemake@input$tilcluster_immuneproperties, 
    statistical_errata_posthoc = snakemake@input$statistical_errata_posthoc, 
    neoediting_additional = snakemake@input$neoediting_additional, tildensity_xcrexpansion = snakemake@input$tildensity_xcrexpansion, 
    tilcluster_xcrdiversity = snakemake@input$tilcluster_xcrdiversity, public_clonotypes = snakemake@input$public_clonotypes, 
    immune_variation = snakemake@input$immune_variation)

notebook_relative_paths <- lapply(notebook_paths, function(x) {
    # x2 <- gsub(base_web_path, '', x) x2 <- stringr::str_replace(x2, '^/', '')
    x2 <- basename(x)
    return(x2)
})

Comments

Reviewer 1

In this study, the authors examine the tumor cell and immunologic variations between patients and between sites within patients with ovarian cancer. They use whole genome sequencing, IHC, gene expression profiling, and T/B cell receptor sequencing to examine immune and tumor cell interactions. They show that TIL levels were inversely associated with cancer cell diversity and show evidence of subclonal neoepitope elimination. They also show that inversion genomic aberrations lead to worse outcomes even in the presence of TILs. In general, this paper presents a large amount of data. The observations are important and the findings impactful. However, it is largely descriptive and can benefit from some measure of mechanistic validation. There are a number of important issues that need to be dealt with.

Allen’s impression: Appears interested in the work; mechanistic validation is the biggest component lacking from the reviewer. The strategy here would be to (1) experimentally validate neoantigen results; and (2) emphasize the importance/value of corroborating evidence from other avenues. For example, neoAg editing, ITH <=> TILs, clonal tracking across space, and LOHHLA would all support immune editing.

Points to highlight: This reviewer appears to misunderstand our point on subclonal neoAg editing – seems to think that this implies lack of clonal neoAg editing. Lots of ways to tackle this – incl. Nicky’s LOHHLA paper which brings up the idea that subclonal neoepitopes may also be subject to elimination.

Comment 1

Q: Introduction line 3…..should be more careful with statements. “advanced” HGSC is difficult to cure (HGSC not always incurable). It may be helpful for a trained clinician to double check the statements made concerning disease impact.

Our clinician (J.M.) disagrees with this statement, though I suppose this could be a matter of interpreting incurable on a case-by-case basis. To address this comment we can change ‘incurable’ to a ‘difficult to cure’ or something similar.

Comment 2

Q: Fig 1 is quite difficult to decipher for the reader.

To address this, we have enlarged the borders of Fig 1a, added a reference to Supplemental Table X containing the mapping for all shortened sample IDs, and changed the lower part of Figure 1b to a barplot. We acknowledge that the line-and-dot plot, although adding information, was difficult to decipher – hence, we have opted to use a barplot which shows the most pertinent findings while leaving the exact sample mapping in Supplemental Table X.

Q: May want to consider additional descriptors to clarify the primary observations.

I’m unclear on what descriptors the reviewer could be referring to – ideas?

Comment 3

Q: It is imperative that the authors confirm that the clonal measures were not affected by tumor purity.

Tumour purity and ITH (for the 3 clonal measures) do not correlate – refer to the supplemental figure and accompanying text. The 4th measure – subclonal CN proportion – correlates with tumour purity, likely because CN estimates are less stable for samples with low purity (refs?). Therefore, non-integer CN calls may be more likely in tumours with low purity. The other 3 measures account for this – in clonal inference, mutation clusters with unstable subclonal CN status are filtered out (refer to appropriate section of methods). Can argue that entropy is minimally affected by sequencing depth too – very rare mutations that are missed due to sequencing depth (which is already >10000X, so taking our lowest tumour purity of ~20% that’s an effective seq depth of 2000X) – will not affect the entropy statistic substantially as that’s purely based on the sizes of clones. The presence/absence of a clone present at <1% has virtually no effect on entropy.

Nevertheless, we can again respond to this. Let’s do this by taking our targeted sequencing data, and empirically generating lower purity samples from it (we’d have to do this at the alt/ref count level). Then, we can rerun all the processing pipelines, infer each one of the measures, and do the comparison.

Q: The affect of tumor mutation allele fraction diversity as a function of cancer cell purity should be modeled and the sensitivity to detect the mutations as a function of sequencing depth shown.

Do this, I suppose …

The last part is kind of out-of-scope since that question is about published mutation callers (MutationSeq and Strelka) rather than a method specific to our paper. But we’ll do it anyways.

Sequencing depth, cellularity, and mutation detection

Comment 4

Q: Page 7. The authors do not consider the expression of immune checkpoint molecules or gene expression programs that could be preventing immunoediting. This may confound the analysis relating intratumoral heterogeneity and TIL density. The authors need to examine these factors.

This is a valid point. However, the activity of these programs does not rule out the possibility that immunoediting has occurred. Immunoediting have occurred in the past and left genomic marks on the tumour – e.g. subclonal neoepitope depletion and lower ITH. Genomic diversity/ITH may have not recovered from the time since a past bottleneck. Even if exhaustion/immune suppressive programs were active at the time of surgery/expression profiling, this does not rule out the possibility that the immune system was actively editing the tumour sometime during the tumour’s history.

Additionally, it is well known that certain immune checkpoint markers, like PD1, are enriched in TIL populations in HGSC and other cancers (ref: to Rosenberg melanoma paper, and to Brad’s various HGSC papers + other papers in HGSC). Despite this, the presence of PD1+ TIL is associated with superior outcomes in HGSC. Neoantigen reactivity has been elicited in PD1+ TIL populations (refs? Brad?).

Nevertheless, we’ll look at this. Although only expression is requested, we include both mutation (point mutation and CNV) and expression analyses to address this point.

Mutation and expression analysis of immune checkpoint molecules/other relevant pathways

Comment 5

Q: Why are clonal neoepitopes not targeted? This is hard to rationalize.

We acknowledge that our explanation may not have been entirely clear. We’d like to emphasize:

  • Lack of depletion (evidence of elimination) does not imply lack of targeting. For example, in ____ cancers (endometrial POLE? Check to make sure.) neoepitopes are not depleted, despite extensive TIL infiltrate (source) and evidence of neoantigen reactivity in these cancers (check source). In our cohort, clonal neoepitopes may be targeted, but not subject to depletion. The McGranahan et al. analysis of clonal neoepitopes in lung adenocarcinoma and squamous cell carcinoma only refers to targeting, not depletion.
  • The corresponding low levels of ITH in ES-TIL samples, together with evidence of subclonal neoepitope elimination, implies that the mechanism of neoepitope depletion may be clonal loss. This cannot be proven with the available data, but if a similar mechanism were to exist for clonal neoepitopes, it would result in the loss of all tumour. Therefore, it is also possible that clonal neoepitope elimination occurs, but those cases never reach the threshold for clinical detection/inclusion in our multi-site cohort.
  • While we only have the data and raw materials to explore the genomics of neoepitope depletion, it is also possible that depletion occurs at the transcriptomic level for both clonal and subclonal neoepitopes.

To address this we have added …

Q: What could prevent clonal neoepitopes but not subclonal ones from being immunoedited. What could be a rationale basis behind this interpretation of the data?

Aside from the fact that editing of clonal neoepitopes could result in the elimination of the entire tumour; these clonal epitopes may also be edited at other levels (e.g. epigenetic, which could be shown in transcriptomes if these were available). The ITH-TIL and subclonal neoepitope analysis implies that tumour clones are eliminated in ES-TIL samples (hence, their associated neoantigens are genomically eradicated); other mechanisms may be dominant for clonal neoepitopes. To put this cogently – our methods are able to infer genomic elimination of neoepitopes. If genomic elimination of a neoepitope is complete, by definition the tumour populations defined by that antigen is completely eradicated. If this were to happen to a clonal neoantigen, the associated populations – i.e. all tumour cells – would be eliminated; or a minor population without the antigen could emerge, but then by definition the antigen would no longer be clonal. Other methods of elimination, i.e. at the transcriptomic level, may apply to clonal neoepitopes, but this is not possible to assess with our data. Check whether McGranahan et al. looked at transcriptomic level & Jimenez-Sanchez’s finding with clonal neoepitopes.

Comment 6

Q: The authors claim that subclonal but not clonal neoepitopes are targeted by T cells. The authors need to validate that this is the case as it goes against previously published results by the Swanton group (McGrahan et al Science). The latter validated T cell reactivity… The authors here should as well…they need to but do not show the presence of T cell reactivity against the immunoedited neoantigens. Without this, the interpretation is not adequately supported.

Clarify claim about clonal neoepitope targeting. We do not state – and do not mean to imply – that clonal neoepitopes cannot be targeted, see below. I’m not sure how this reviewer made the leap to that. Additionally, elimination may be occurring at the transcriptomic level for some neoepitopes.

Additionally: Nicky’s paper (LOHHLA) shows (Fig 4) that subclonal neoantigens assoc. w/ lost allele are eliminated in LOHHLA events, implying that indeed, subclonal neoepitope elimination DOES happen, in rebuttal to reviewer 1. TO READ this part of Nicky’s paper again and see what they say about clonal neoantigens.

Experimental validation will come in here and Comment 5.

Comment 7

Q: Aside from the point above, it would be beneficial to restructure the data presentation so it is more focuses, less purely descriptive, and more coherent. As written, the paper rambles. Suggest reworking to present the major findings in a more cogent manner,

Get rid of mutational signatures paper – and think about how to restructure?

Comment 8

Q: Fig 3 panel A and B are complex to the point of being not useful. The authors should strive to communicate these points in a more coherent manner.

Remove and replace with some other figure. As it stands, together with Reviewer 3’s comments Figure 3 is going to be VERY crowded.

Comment 9

Q: It is unclear why B and T cell spatial associations are meaningful. Are the B cells activated in areas where active CD4+ T cells congregate (and not exhausted T cells or T regs)? The authors should describe this.

??? The lack of acknowledgement about the relationship showing how T-, but not B cells track with tumour clones across space in the general comments and other comments given by this reviewer leads me to believe that they did not fully appreciate the significance of this finding. If T cells are able to track with specific tumour clones across space, that strengthens the evidence for the existence of clone-specific targeting/elimination in HGSC.

Comment 10

Q: The authors should stain their path specimens with dextramers to validate the localication and clustering of T cell clonotypes. At least a few should be validated.

?? To validate that particular T-cell clonotypes cluster with each other? This seems out of scope and would be better suited for a study looking at the microscopic relationships between tumour clones and T-cell clonotypes. Also, assessing clustering of those clonotypes would require knowledge of their clonotype-specific antigens, which we do not have.

Argue back on this one.

Comment 11

Q: The authors should provide a more detailed comparison to the results of Rooney et al. (Hacohen group).

This is a good point and of interest for addressing the question of what determines the level of TIL infiltrate/expression within each tumour. We identify 2 questions of interest here: (1) understanding the determinants of immune activity across the cohort; and (2) within patients (as we provide the first evidence of extensive immune infiltration in a HGSC cohort of this size + extensivity in sampling).

To address this, we have repeated the analysis of Rooney et al. (modeling the association between SNVs/CNVs and cytotoxicity expression signature) on our data. Using their analysis methods for across-cohort comparisons, and adding patient as a random effect for within-patient comparison, we show that …

Rooney comparison: Immune association and neoepitope elimination

Q: Do the assocations with ES-TIL groups validate across other cancer types?

While we appreciate that the answer to this question is of interest in other cancer types, we believe that it is out of scope for this manuscript, which only captures HGSC.

An investigation of the associations with ES-TIL groups in other cancer types would require (1) identification of N/S/ES-TIL groups in other cancer types; and (2) robust malignant clonal measurements. Other groups have found evidence of (1) – for example, Morag Park’s group from McGill has discovered analogous groups in breast cancer, but accurate determination of (2) demands multi-site cases to resolve clonal overlap.

Reviewer 2

Zhang et al characterized the interplay between tumor-infiltrating lymphocytes (TIL) and cancer cells in 143 samples from 21 patients (a multi-region cohort study) by establishing a multi-modal data consisting of whole-genome sequencing, immunohistochmistry, histologic image analysis, (nanostring) gene expression profiling, and T/B cell receptor sequencing. This highly diverse and cutting edge dataset is combined with insightful analyses by an expert team of authors which results in conclusions that appear justified. The major highlight of the results are the description of coupled evolutionary dynamics between immune and malignant populations. More specifically, they find that a relative depletion of subclonal neoepitopes to be associated with the presence of CD8+ cells and conclude that immune infiltrates may perform purifying selection to shape patterns of cancer cell complexity. This is a highly interesting result and has significant implications for our understanding of the interplay between tumor cells and their environment.

Allen’s impression: This reviewer appears to be very positive about the study – with no reservations identified in the summary paragraph above. Additionally, the reviewer appears to understand all aspects of the study they commented on. Comments from this reviewer are generally easy to address.

Points to highlight: Clarify robustness in areas they identified, and improve organization of the manuscript.

Comment 1

Q: The figures are poorly annotated. Some examples: Figure 1 - legend missing, font size too small. Figure 2 - what does clonotype publicity mean? What are the codes (ROv3, Adnx1, etc) mean? What do the lines mean? This figure is particularly hard to understand. Figure 3A/B: visually appealing but no idea what it means. The sample codes need explaining as do colors etc. All other figures should be critically reviewed in the same way.

We acknowledge this point about clarity – and have made the following modifications to address this:

Lines are mentioned in figure legend but could be clarified. Clonotype publicity needs to (if not already) be mentioned in figure legend. Pretty sure Figure 1 has a legend … An example expanded site code can be given in legend, and others can be provided in supplemental table. Check over other figures.

Comment 2

Q: The differences between S-TIL and ES-TIL in both TIL densities and immune-associated pathway gene expression profiles appear modest and statistical tests for robustness of the clustering could be used to demonstrate their relevance.

This is a good point. First, we’d like to clarify that S-TIL and ES-TIL are indeed similar in immune-associated pathway gene expression – we meant to show this in order to emphasize that immune-associated expression data alone cannot distinguish these 2 classes of tumours. IHC provides the necessary information to distinguish them. We’d additionally like to emphasize the following excerpt from the Figure legend:

PASTE PART ABOUT THE CLUSTERING ONLY BEING BASED ON TIL DENSITIES

to avoid possible confusion. To address the comment that the differences for TIL densities appear modest, we have made the following changes:

  • Heatmap is no longer clustered by row – instead, all epithelial TILs are listed, then all stromal TILs. This helps emphasize the observation that ES-TIL are specifically higher in epithelial TIL densities compared to S-TIL.
  • We’ve applied the following statistical tests to determine the number of TIL clusters in the cohort. Our approaches converge on the common solution of 3 clusters.

TIL cluster robustness

Comment 3

Q: Like presence of CD8+ cells, ovarian cancers that have not yet undergone whole genome doubling are associated with favorable outcome (PMID 22544022). Whole genome doubling may interfere with the classification of point mutations as clonal or subclonal. Is it possible that samples that have undergone whole genome doubling are associated with increased numbers of subclonal mutations, and by extension, an increased number of neoepitopes?

This is a great point. First, we’d like to acknowledge that our clonal model incorporates total and parental (major/minor) copy number in order to prevent WGD events/extensive CNV from incorrectly confounding clonality calls. This point is especially important for HGSC, which is subject to extensive CNV, as the reviewer has acknowledged.

To directly explore the potential effect CNVs/WGD may have had on our estimates, we explore the association between ploidy and subclonal neoepitope load and proportion:

Whole genome duplication

Remember to explore proportion too, not just load here.

Comment 4

Q: The immune subtypes N-TIL/S-TIL/ES-TIL are very likely reflected in common gene expression profiles. There are more than 60 TCGA ovarian carcinoma whole genomes that can presumably be (indirectly) classified into these subtypes through their matching expression data. Can this set be used to find independent validation of the association between immune environment and clonal complexity? While the dataset presented in the manuscript is substantial, it would be great to maximize the robustness of the results by including additional data (and easily accessible) datasets.

We acknowledge that this would be desirable to do. We first attempted to craft an expression-based classifier of N/S/ES-TIL, but the resulting classifier, trained and tested on our Nanostring expression data (immune-associated pathways + Leong et al. molecular subtype markers) did not achieve a reasonable degree of accuracy (LIST). This is not entirely surprising given the similarity between S-TIL and ES-TIL in terms of immune-associated pathway expression.

Exploring the possibility that our set of genes profiled with Nanostring may not have been sufficiently extensive to do this, we leveraged U133A2 microarray data for XX cases out of our cohort, and repeated our procedures. We note that the sample size here was extremely small. To control for patient, training and validation sets in cross-validation were derived from different sets of patients (drawn randomly). Again, we were not able to produce a good classifier by multiple methods.

To address the possibility that other data types may provide the features necessary to deconvolve S-TIL and ES-TIL subtypes, we looked to characterize these subtypes based on H&E data, which is readily available for TCGA samples. Based on the results from our cohort that S-TIL samples have less lymphocyte-tumour cell colocalization in tumour epithelium compared to ES-TIL, we trained a classifier that achieved a XX% degree of accuracy on our cohort using the features shown in FIGURE (i.e. density features derived from H&E and hotspot features). From this … (AFTER FINN AND MY ANALYSIS).

Then, we attempted to see whether these subtypes identified from TCGA had different clonal complexity patterns. Prior to this analysis, we note that clonal complexity determination from single samples – especially exomes – can be subject to a lot of noise, given the issue of clonal overlap.

TIL cluster classification by expression data

Comment 5

Q: It is described that T-cell repertoire correlated with malignant clone composition. Would an inverse relation between the number of subclonal neo-epitopes and clonotype diversity or density be able to corroborate the previous point that CD8+ cells play a role in subclonal neoepitope depletion?

This analysis is interesting – but we believe it would not directly address that question. Firstly, we’d like to show the following Figure, indicating that clonally complex tumours do not necessarily harbor diverse T- or B-cell clonotype repertoires. Nevertheless, we do acknowledge the possibility that if more diverse T-cell clonotype repertoires – shown in REF, REF, and REF as evidence of more robust TIL responses – are associated with subclonal neoepitope depletion, this may indicate that T cells, and therefore likely CD8+ T cells, have a role in subclonal neoepitope depletion.

However, prior to doing this, we do want to point out that, as CD8+ T cell density and clonotype diversity are correlated, this analysis suffers from a collinearity problem.

First, we looked at T-cell/B-cell clonotype diversity individually, finding an association – although not significant – with subclonal neoepitope depletion. Then, we added epithelial CD8+ TIL density to the model. As expected given the collinear relationship between epithelial CD8+ TIL density and T-cell clonotype diversity, the coefficient of T-cell clonotype diversity flipped signs.

Therefore, while there is a trend between TCR clonotype diversity and subclonal neoepitope elimination, this does not reach significance.

TCR-neoepitope depletion correlation

Comment 6

Q: The sample cohort includes a few samples from post-treatment tumors. This aspect is understated in the current presentation of results. It is hard to imagine that treatment does not affect the immune milieu. Description of where these samples were used is needed, or datasets from these samples should be withheld in the analysis. While not essential for the manuscript, one would expect there that a longitudinal comparison of the microenvironment and intratumoral heterogeneity would yield interesting results and the authors might consider reporting specifically on that.

Perhaps exclude the temporal samples from any statistical correlations where necessary? I.e. may be worth excluding from ITH-TIL correlation, and the XCRmapscapes (exclude those patients from the #’s in the text). Also exclude from numbers for Fig 1b 12/20, etc. It’s already excluded from the BCR phylogenetics section.

Shouldn’t really change the results, as there are only 4 of these or so.

Comment 7

Q: The final section (“Mutation signature…”) does not really align with the rest of the manuscript and seems a bit out of place. Consider whether it is needed to convey the main message of this work, or whether it is best preserved for presentation elsewhere.

Remove this section.

Minor comment 1

Q: Avoid overly complex jargon and unnecessary acronyms, such as the sentence “Om1 and Ov2 were ES-TIL whereas Om2 and Ov1 were N-TIL”. This sentence is unreadable without a glossary.

I mean – ok, but those are our sample identifiers. Maybe we can expand them?

Minor comment 2

Q: Both PMID 25269487 and PMID 23257362 found that ovarian carcinoma specimens could in majority be assigned to more than one transcriptional class. Is it possible that allowing the samples presented here to be classified into more than one group could further clarify the relation between immune groups and expression groups?

Obviously we can’t do anything akin to ssGSEA, with only 8 features (TIL types). To address this question we need to do some sort of fuzzy clustering or post-hoc assessment.

TIL cluster multiple assignment analysis

NOTE: Make sure I’m standardizing/normalizing when doing the silhouette part of the analysis.

Minor comment 3

Q: The concept of predicting the number of neoepitopes is an important aspect in the analysis and deserves a sentence of explanation in the main text.

Easily done, as long as it’s under the character limit.

Minor comment 4

Q: The majority of the manuscript discusses specimens by immune subtype but this is switched to expression class (C1) in the TCR/BCR sequencing section. Consider consistent use of the same subtypes or at least explain why this section diverges.

Our original intention was to provide a comparison of our subtypes to the Tothill subtypes. However, we agree that this analysis could be more clearly presented with our own subtypes. To address this, we have changed Figures XX, XX, and XX to use our own subtypes.

TIL cluster immune properties

Minor comment 5

Q: Four measures of intratumoral heterogeneity are mentioned as correlated but this data does not appear to have been presented in the form of a figure. Same for the observation that these metrics were not confounded by tumor purity. This data needs to be represented more clearly.

We had these plots in our Supplementals, but excluded them from the final submission due to space restrictions. As this has been brought up, we’ve included them here for the reviewer to peruse.

Minor comment 6

Q: “Our data indicate that co-registration of immune and malignant cell diversity may provide a new biomarker for patient or tissue sample stratification in clinical trials or retrospective cohort analyses.” seems far fetched. How do the authors envision that to be implemented?

Sohrab, Brad – ideas?

Minor comment 7

Q: Possible typo’s: a. Page 8 “To test this, we trained a classifier to separate TCRs as CD8- or CD4-type on the basis of V/J genes … The ratio of CD8/CD4- type TCRs was highly correlated with the ratio of CD8+/CD4+ densities by IHC” CD8- or CD4- type —> CD8+ or CD4+ type? and, CD8/CD4- —> CD8+/CD4+? b. Page 8 " CD8-type TCRs were significantly more broadly distributed than CD4-type TCRs " CD8+ type TCRs and CD4+ type TCRs?

We apologize for any confusion about this. The ‘-’ sign was intended as a hyphen, but as indicated by this reviewer could be confused for a minus sign. We didn’t want to use ‘+-’ adjacent to one another, but as the reviewer suggests ‘+’ may be clearer overall.

To address this, we have made these revisions suggested by the reviewer on pages XX of the revised manuscript.

Reviewer 3

Zhang et al. analyse 143 tumors from 21 patients with high-grade serous ovarian cancer (HGSC) using whole-genome sequencing, nanostring gene expression, histologic image analysis, and TCR/BCR sequencing. The main findings of the study are:

  1. Classification of tumors based on expression profile associate to lymphocytes and immune activation, and frequent co-existence in distinct tumor-immune infiltrates within tumors from the same patients.
  2. An inverse association between intra-tumor heterogeneity and presence of CD8+ tumor infiltrating lymphocytes (TIL).
  3. T-cell repertoire similarity correlate with tumor clone composition in patients with the highest CD8+ TIL density.
  4. Fold-back inversions associate with worse outcome even in the presence of T cell cytotoxicity.

General comment

This paper provides new ways to analyze and dissect clonal dynamics at tumor-immune interface. Although the above-mentioned conclusions and analyses are interesting, the observations drawn in the manuscript are generally not well connected and the manuscript lacks of depth. The implications of the conclusions are superficially explored. The link between the inverse association between intra-tumor heterogeneity and TILs and the other results of the study is weak (only a few conclusions can be drawn from the BCR seq, TCR similarity, H&E image analysis presented in figures 3-5). The mutation signature analysis is interesting, but it is weakly associated with the rest of the manuscript: there is no association with the clonal dynamics of the cancer cells or the T cells, and no mechanistic insight is proposed or discussed. The strongest results/figures are figure 1 and 6, the results/conclusions from figures 2, 3, 4, 5 are weakly justified and do not add significantly to the overall message… The immunoediting analysis, which is even mentioned in the abstract, does not have any associated figures and is considered to be preliminary (and not corroborated with additional analyses of other datasets). The BCR analysis was based on a novel approach and therefore hard to judge and the message was not clear. Overall, characterizing the immuno-malignant interface of ovarian cancer is of high relevance but this important message is buried by several unrelated/preliminary analyses that do not immediately support the main message

Allen’s impression: The most critical of the 3 reviewers. Brings up many good points (including several from a statistical standpoint), but also says ‘lack of depth and clarity’ with few directly addressible avenues proposed. I think this reviewer needs convincing – i.e. with experimental validation and additional corroborative evidence (e.g. LOHHLA).

Points to highlight: Strength that can be added by additional corroborative evidence. Strengthen Figures 2-5, and clarify BCR phylogenetics analysis + conclusions.

Comment 1

Q: BCR analysis is original but not very well justified, and the conclusions from that analysis are very vague. Are B cells and their clonal dynamics are important in HGCS?, or if not, then why? As it is now, one could skip that section completely and still get the message of the paper. The authors do not mention this result in the abstract, which supports this point.

The key point here is that the B-cell response – even in patients with high CD20+ TIL – is spatially homogeneous. Not much is known about the antigens of B cells in HGSC; this analysis suggests that those antigens may be broadly distributed as opposed to site-specific. To drive home the point that these B cells are not just bystanders, the phylogenetic signal analysis demonstrates that there in fact is evidence of antigen-driven expansion in B cells in HGSC, specifically in patients with high CD20+ TIL.

Thoughts everyone?

Comment 2

Q: The mutational signature analysis is interesting but it comes out of context because it does not mention whether different samples from the same patient have different mutational signatures that could explain the infiltration status.

We acknowledge that this section may be out of context. Both this reviewer and reviewer 2 bring this up – hence, we have decided to remove the Mutational signatures section from the manuscript.

Comment 3

Q: Statistical test in figure S4B has two samples in the category “Same” that do not have a paired sample in the category “Different”: how did the authors compute a Wilcoxon signed-rank test with unequal number of samples in each group?

We acknowledge that this may have been confusing. Patients with data in only one group were also plotted (but could not be included for the statistical test, of course). To remove any confusion around this, those patients are no longer shown.

Statistical errata

Q: What analysis was performed in the sentence “(p > 0.3, permutation test, Figure S4B)” on page 6, which permutation test? Figure S4B is not a permutation test.

We apologize for the mix-up here. This was actually a nested ranks test – which involves permuting INSERT … It is incorrectly noted as a Wilcoxon signed-rank within the legend of Figure XX.

To address this, we have modified the legend of Figure XX to reflect this.

Q: In figure S4A, the correlation between “proportion sub-clonal” and “cellularity” is significant (p=0.0169), yet in the manuscript the authors say: “and none of the clonal measures were confounded by tumor purity (all p > 0.2, Figure S4A)”. Page 6.

We acknowledge that the wording here is confusing. What we meant to say is that none of the clonally-determined measures (i.e. not proportion subclonal CN, which is purely copy number-based without any knowledge of clonal architecture or phylogeny) were associated with tumour purity.

To answer the question of why proportion subclonal copy number may be associated with tumour purity, we point out that copy number calling in highly rearranged genomes (common in HGSC) with low copy number is difficult due to a lower proportion of tumour-derived reads for a given sequencing depth.

To address this, we have clarified our statement by listing out all the measures not associated with tumour purity.

Q: Figure 1C does not say which statistical test was used, and if a Kruskal-Wallis was used, a post hoc analysis should be employed.

This is a good point. To address this, we’ve attempted to do post-hoc tests wherever appropriate.

For Figure 1C, which is associated with a Kruskal-Wallis test, the most appropriate post-hoc test to use is the Dunn test (REF).

Statistical errata

Q: Statistical analysis of 6B should include post hoc test.

We’ve also done this for Figure 6B, shown below. As the Mutation signature selection has been removed from the manuscript, we are not including this Figure in the manuscript.

Statistical errata

Section: Epithelial CD8+ TIL are associated with subclonal neoepitope elimination

Comment 4

Q: Plots and a supplementary table with the neoepitope depletion values are required for this section.

We acknowledge that these would be helpful. To address this, we have added plots, shown in Figure XX, and the appropriate data in Supplementary Table XX.

Tables of all neoantigens, neoepitopes, and nonsynonymous SNVs can be obtained from the authors.

Neoediting additional analysis

Section: Regional variation in T-cell clonotypes tracks with the spatial distribution of tumor clones

Comment 5

Q: It is interesting that “TCR diversity was strongly correlated with IHC-based CD8+ and CD4+ TIL densities” because T cell activation in the right conditions would lead to clonal expansion and higher T cell density, but would reduce TIL diversity. Stacked bar plots with the top 5 TCR clonotypes showing their proportion in the T cell population would be required to corroborate whether higher density is accompanied with clonal expansion or not, and how that relates to the diversity metrics used by the authors.

TIL density - XCR expansion analysis

Comment 6

Q: For figures S5A-B the statistical test used is not mentioned anywhere.

These were paired Wilcoxon (Wilcoxon signed-rank) tests. They are now corrected to Dunn tests (for the pairwise comparisons post-hoc); with the Kruskal-Wallis p-value shown and the Dunn significance indicated by asterisks.

Q: Also the authors should consider if this could be just an artifact, because infiltrated tumors have much more TCRs to be sequenced, thus it could be that rare TCRs are missed, while in non-infiltrated tumors, most TCRs would be sequenced. Also, what is the point and conclusion of this analysis?

Naively, if it was true that less infiltrated tumours have more TCRs to be sequenced, N-TIL tumours should also have higher TCR/BCR diversity, which is not the case.

This is a valid point for ES-TIL vs. S-TIL. It could be argued that having more expanded TIL that result in missing detection of rare TIL clonotypes in high-TIL samples is actually signal that we’re trying to capture, though. If very rare clonotypes are squeezed out because we don’t have enough reads, that means that the clonotypes that we do see are expanded relative to those – and this should be quantified as less diversity. This was the motivation behind using species diversity measures like Shannon entropy (in addition to just using unique clonotype count).

TIL cluster - XCR diversity analysis

Comment 7

Q: For the rarely observed TCR clonotypes shared between patients, it would be interesting to see if (this analysis may not be possible if there are too few shared clonotypes) these clonotypes are subject to clonal expansion, correlate with any BCR clones, and/or are present in patients with shared mutataions/neoepitopes.

TODO: Check if there’s sharing at the neoEPITOPE level, not just at the neoantigen level.

Public clonotype and neoantigen analysis

Comment 8

Q: In figure S5C-E, how was the “variation” calculated? Short explanation in manuscript should be added. Also what is the point/hypothesis/conclusion of this analysis?

There’s a description in the supplementals for this. Perhaps this isn’t properly referenced in the main text, or the reviewer thinks the explanation should be moved there?

Honestly, I’m kind of uncomfortable with the variation analysis. Mostly because we power-law normalize everything (or log-normalize everything) and then just compute variance as a simple variance (i.e. R’s var) calculation or something along those lines.

Comment 9

Q: The sentence: “For example, while 4 profiled samples from patient 10 (ROv-1-4) had uniformly low expression of T cell associated genes and CD8+ and CD4+ TIL densities (Figure 1B), they harbored distinct TCR repertoires (Figure 3C)” on page 8. Is this not expected? As mentioned above, an increase TIL density would be expected after T cell activation, which leads to clonal expansion, which leads to lower TCR repertoire complexity (higher similarity).

Q: Figure 3C and S2E could be sorted by TCR similarity and TIL density and expression data added.

Q: A correlation analysis could be done, not with the variation across sites, but between TCR similarity and TIL density/expression.

Immune variation analysis

Section: B-cell evolutionary dynamics recapitulate patterns of immune infiltration

Comment 10

Q: The conclusion: “Together, these findings imply that patients with high epithelial TIL densities mount spatially homogenous, antigen-driven B cell responses.” on page 9 in an over interpretation.

Q: Is this important or not, how and why would it be different from the T cell response?

Q: If it is antigen-driven, why then BCRs do not correlate with cancer clones as TCRs do?

Q: The BCR-TCR interface could be explored further than what was done in figure 3A-B, to address the questions above.

Really not sure what part of this is an interpretation. Assuming the spatially homogeneous stuff is obvious (which I think it is from the phylogeographic analysis) – perhaps they’re referring to the antigen-driven part? Maybe we should reword as BCR-sequence-biased/dependent expansion? That sounds awfully clunky but completely avoids overinterpretation, I suppose.

Section: Histologic interaction topologies of TIL and tumor cells

Comment 11 and 12

Q: The sentence: “We hypothesized that the extent of spatial co-localization between cancer and immune cells would be greatest in samples with high epithelial TIL density” seems to be trivial. This cannot be a hypothesis; instead it seems to be a validation of the trained algorithm.

Q: On page 10: “Thus, our results provide evidence of localized interaction in situ between cancer cells and TIL in ES-TIL tumors”. The analysis performed here is circular and the conclusion is trivial: the authors find more epithelial TILs (based on the H&E algorithm) where they see more epithelial TILs (IHC counts). If the authors have the IHC sections (which they do not show), what is the need to use the H&E images? If anything, the H&E based algorithm can be used as a score in the clustergram of figure 1B. A whole figure for this is not needed. Besides, fc, fi and fci are all related measures and not independently validating their approach, and furthermore, the Kruskal-Wallis test lacks a post hoc test.

Does highlighting the fact that we’re looking at HOTSPOTS, not just where the cells are, address these comments? I think it does, but only partially – since epithelial areas are far more likely to be cancer cell hotspots. The missing ingredient is that we don’t do hotspot analysis WITHIN epithelial and stromal regions (but we’d have to come up with a way to determine those bounds from H&E data). Thoughts?

Section: Mutation signature correlates of immune activity

Comment 13

Q: The analysis in figure 6B should take into account mutational load as that could an important contributing factor behind the differences between the HRD and FBI tumors.

We’re moving the mutation signatures section – this comment will not be relevant.

Comment 14

Q: I would encourage the authors to discuss further why they see immunoediting in the subclonal neoepitope set and not in the clonal one, and what are the implications for immunotherapy. However, as they do not show figures of the immunoediting analysis, it is difficult to assess the veracity and magnitude of this finding.

This requires a detailed answer. But for now, I’ll note that our results don’t preclude neoantigen editing at other levels, e.g. transcriptomic, acting on clonal neoantigens.

Comment 15

Q: The paragraph regarding the mutational signatures and the immune association should consider a more in depth interpretation and discussing the paper by Davoli et al. Science 2017 (DOI: 10.1126/science.aaf8399) where associations between tumor aneuploidy and immune evasion is analyzed in various cancer types. Also the papers by Smid et al. Nat. Comm. 2016 (DOI: 10.1038/ncomms12910) and Connor et al. JAMA 2017 (DOI: 10.1001/jamaoncol.2016.3916) should be considered for discussion of this section. Causal mechanistic insights of the associations observed should be at least proposed or hypothesized, ideally based on experimental data from this or other studies.

My personal opinions on the lack of statistical rigor in the Davoli paper aside (+ the suspect confounding effects of tumour purity), this will no longer be relevant after excluding the mutation signatures section. But perhaps this is something to think about for adding to the mutational signatures work?

Comment 16

Q: The order in which the figures are mentioned in the text is very disorganized, which makes it difficult to read and follow the paper. The authors should make an effort to organize the figures in a similar order to which they are mentioned in the text.

I assume they’re referring to the supplemental figures being out of order? Or are the main figures also out of order?

Minor comment: Title

Q: The word “immunologic” could be changed to “lymphocytic”, to be more precise.

Minor comment: Summary

Summary

a) Write the immunologic response categories defined.

b) Write that TIL “density” was inversely associated.

c) The last sentence of the summary is very vague: “Thus, regional variation in immune contexture mirrors the pattern of intraperitoneal malignant spread”. This was observed in no more than half of the patients.

Perhaps add, ‘in patients with extensive TIL infiltrate’ or something similar?

d) “provoking new perspectives for treatment of this challenging disease”. Which perspectives?

Minor comment: Results

Section: Intratumoral heterogeneity is lowest in tumors with high epithelial lymphocyte infiltration

a) For figure 2 a diagram explaining how to interpret each plot would be very useful.

This is a good idea – we could put this as the first XCR-mapscape plot, shift everything over one, and put the clonotype publicity legend at the top/side. Or perhaps better, just annotate one of the plots.

b) Why does patient 7 have more cancer clones in the phylogeny than in the pie charts?

Sufficient quality RNA (RIN >= 7 from Nanodrop) was not obtained for the sample that contained those clones (BrnM; check RIN value, it was really low). As a result it did not have TCR/BCR-seq data and was excluded from Fig 2. For completeness, the clonal composition of BrnM, along with additional archival samples for several patients, is shown in Fig S3.

c) Tumor site phylogenies would be useful to visualize how the cancer clones have disseminated spatially.

The correct way to do this is with clonal migration analysis (Ben Raphael) not with tumour site phylogenies. Sites do not ‘evolve’ from one another and hence should not be represented on a phylogenetic tree. We can provide migration analysis results here after we have them.

Posted at http://www.bcgsc.ca/downloads/immune_project/machina_results.nb.html. How should we add this to the paper though? We can try to cram all 14 of the migration plots into one Supplemental Figure, but I’m not sure if that’ll fit. Additionally, we can add a sentence/two when introducing the results of clonal analysis saying that most patients followed a simple parallel mono/polyclonal seeding pattern while only 1-2 followed a reseeding pattern.

d) Add TIL category information (N-TIL, S-TIL, ES-TIL) to each sample in figure 2.

Was being lazy here, so can add this. Some samples do not have this information, though.

Section: Epithelial CD8+ TIL are associated with subclonal neoepitope elimination

**a) Different HLAs have different HLA binding affinities, thus HLA specific binding cut-offs could be a better approach for the prediction of neo-epitopes. https://help.iedb.org/hc/en-us/articles/114094151811-Selecting-thresholds-cut-offs-for-MHC-class-I-and-II-binding-predictions**

While this is a good idea, unfortunately many of our HLA alleles (~50% of unique alleles) are not present in this list, which only includes 38 of the most common HLA-A and B alleles (and no HLA-C alleles). It would be unfair to use different standards to determine cutoffs for different alleles.

b) A permutation approach to compare tumor samples within patients would be interesting to test.

What would we be permuting here?? Certainly shouldn’t be HLA genotypes – for the most part they’re the same!

Thoughts everyone?

c) The R formulas used for the generalized linear mixed model should be also shown in the methods.

Easily done.

d) Evidence of immunoediting is a big claim and needs corroborative evidence from additional datasets.

And/or additional lines of evidence from the same dataset, e.g. LOHHLA? The issue with using additional datasets is that the correlation between subclonal neoepitope elimination and epithelial CD8+ TIL density requires the use of patient as a random effect (i.e. the magnitude of this effect is variable between patients). Hence, this requires a HGSC dataset (other cancers would be out of scope) with sequencing data attainable from multiple sites + immune data available. To our knowledge, there is no other dataset with this?

Section: Regional variation in T-cell clonotypes tracks with the spatial distribution of tumor clones

a) The sentence: “Similarly, BCR diversity was significantly correlated with CD20+ and plasma cell densities (all Spearman p < 0.001, Figure S2D).” should be more specific, because in figure S2D the Shannon entropy has a correlation p-value = 0.021.

Right. This was referring to the unique clonotype count specifically. This can be specified, or the p-value in the text changed.

b) Figure S2E, S2F could be added to figure 3.

Sounds like a good idea. Can do this. Another reviewer suggested something related.

c) How was TCR similarity calculated? A short sentence describing how the measurement is done when is not obvious should be added (this lack of clarity happens throughout the manuscript).

This is described in the supplementary methods, should clarify with appropriate reference to sup methods and link the formula shown in sup methods here.

d) The sentence: “Thus, higher resolution clonotype measurements carried additional information than could be ascertained by TIL densities alone”. This sentence is too obvious to be used as a concluding statement. The authors should consider removing completely this sentence and trying to get more biological insights from their previous analysis as suggested above.

e) The analysis on figure 3D could be performed using all samples (not only the mean), and could be done also for BCR.

There are statistical issues with this approach. Doing this with all samples introduces (1) patient as a random effect; and (2) dependency between similarity values within each patient (TCR repertoire similarity is computed between all sample pairs, and these values are therefore dependent on one another). If it makes the reviewers happy we can include a plot showing this, but without a P-value (or we could try to figure out how to robustly compute significance). Similar plots for BCRs could be shown, either here or in supplementals. A more pressing issue is that we are interested in the trends ACROSS patients here, not in accounting for patient as a random effect and looking at the trends within patients.

f) Although significant, the difference in the distribution broadness between CD4 and CD8 is very small. It would be interesting to see what the differences are between patients that have a higher CD8+ broadness and the ones that have higher CD4+ broadness.

Try a different measure of CD8+ broadness/CD4+ broadness that highlights the proportion of broadly distributed clonotypes rather than this terrible mean.

g) The analysis done on BCR is not shown: “In contrast, intrapatient BCR similarity was not significantly correlated with IHC-based CD20+ or plasma cell density (all Spearman p >0.1)” on page 8. Where is the figure? Also, this result could be expected since B cell activation and expansion happens in the lymph nodes and germinal centers, which should be mentioned and discussed further.

h) Figures 2 and S3 could be summarized in bar plots or box plots, using the Mantel’s p-values. Although the circular plots look nice, they are difficult to parse and in the end, they are not particulary informative. I would suggest to have a summarized figure for TCR and BCR that conveys the message with a couple of examples of the circular plots and the rest in the supplementary.

Perhaps include a Mantel correlogram-like plot – but instead of having distances on the x-axis, have patient number, ordered by epithelial CD8+ TIL density? Potentially exclude patient 11 because it only has 3 samples (and some of these are temporal – so they should really be excluded).

Section: B-cell evolutionary dynamics recapitulate patterns of immune infiltration

a) Instead of “the absence of spatial tracking between B cells and tumor clones implies that B cells might recognize antigens with a more homogeneous spatial distribution” the absence of spatial tracking could be explained by the fact that B cells do not require direct contact with cancer cells for killing.

Probably related to one of the major comments by this reviewer – thoughts? Perhaps the appropriate response is to just say that ‘the B cell response is more spatially homogeneous’ without mention of antigens.

b) The analysis done in figure 4D could be done using samples independently, instead of aggregating the samples in each patient.

Unlikely, as phylogenetic signal values are family (i.e tree)-specific. Subsetting by sample could theoretically be done, but as some ancestral sequences will not have been present in X sample, this may be an issue. Migration association could be done at the sample level, but that’s not what we want to look for statistically. If you did this at the sample level, you could have to account for the random effect of patient – which would completely abrogate the inter-patient effect.

Section: Mutation signature correlates of immune activity

This section will be completely removed.

a) The authors could give more biological context/background about the three groups of mutational signatures in terms of effect of the alterations in the genome and potential causes intrinsic or extrinsic causes.

b) The analysis done using OV-AU samples should be accompanied with a figure, not only a table.

Section: Discussion

a) For the sentence: “Our data indicate that co-registration…” on page 11 the authors should do survival analyses to show that this could be done with their own patient progression free survival and overall survival data (Kaplan-Meier curves). The survival analyses done include only the mutational signature but not the immune or malignant diversity analyses. Otherwise, this sentence is speculative.

Not really valid to do this … not only is the cohort size relatively small and thus amenable to this type of analysis – especially when multiple explanatory variables like mutational signature, immune and clonal diversity are considered, but the latter two measures are sample-specific. After excluding temporally sampled patients, an n=18 is not large enough to do this analysis.

Perhaps we should just reword that sentence – that seems most amenable.

b) Would be good to show a figure showing the data described in the sentence: “Intriguingly, in this small cohort, ES-pure patients had better outcomes…” on page 12 and also to expand the analysis to other data sets like TCGA and ICGC to confirm the observation.

???? There are very few TCGA and ICGC patients that are spatially sampled pre-treatment. Check cohort sizes and make a response. There’s basically no space for a figure and the observations are intended as anecdotal–preliminary at best–as stated.

c) One element missing from the discussion and the whole manuscript is: Which are the underlying mechanisms behind immune infiltration in some sites but not others? It would be valuable if the authors could share their ideas on what could be the potential mechanisms and/or the type studies required to tackle this challenging question.

This is a tough one. Will need input from all of you here.

LS0tCnRpdGxlOiAiUmV2aWV3ZXIgcmVzcG9uc2UiCmRhdGU6ICJgciBmb3JtYXQoU3lzLnRpbWUoKSwgJyVkICVCLCAlWScpYCIKLS0tCiAgICAgICAgICAgICAgICAgICAgICAgIGBgYHtyLCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQoKIyMjIyMjIyMgU25ha2VtYWtlIGhlYWRlciAjIyMjIyMjIwpsaWJyYXJ5KG1ldGhvZHMpClNuYWtlbWFrZSA8LSBzZXRDbGFzcygKICAgICJTbmFrZW1ha2UiLAogICAgc2xvdHMgPSBjKAogICAgICAgIGlucHV0ID0gImxpc3QiLAogICAgICAgIG91dHB1dCA9ICJsaXN0IiwKICAgICAgICBwYXJhbXMgPSAibGlzdCIsCiAgICAgICAgd2lsZGNhcmRzID0gImxpc3QiLAogICAgICAgIHRocmVhZHMgPSAibnVtZXJpYyIsCiAgICAgICAgbG9nID0gImxpc3QiLAogICAgICAgIHJlc291cmNlcyA9ICJsaXN0IiwKICAgICAgICBjb25maWcgPSAibGlzdCIsCiAgICAgICAgcnVsZSA9ICJjaGFyYWN0ZXIiCiAgICApCikKc25ha2VtYWtlIDwtIFNuYWtlbWFrZSgKICAgIGlucHV0ID0gbGlzdCgnL3NoYWhsYWIvYWx6aGFuZy9wcm9qZWN0cy9JVEhfSW1tdW5lL3BhcGVyL3Jlc3VsdHMvcmV2aWV3L25vdGVib29rcy9ydW4yL3Jvb25leV9jb21wYXJpc29uLm5iLmh0bWwnLCAnL3NoYWhsYWIvYWx6aGFuZy9wcm9qZWN0cy9JVEhfSW1tdW5lL3BhcGVyL3Jlc3VsdHMvcmV2aWV3L25vdGVib29rcy9ydW4yL3Rjcl9uZW9lcGl0b3BlX2NvcnJlbGF0aW9uLm5iLmh0bWwnLCAnL3NoYWhsYWIvYWx6aGFuZy9wcm9qZWN0cy9JVEhfSW1tdW5lL3BhcGVyL3Jlc3VsdHMvcmV2aWV3L25vdGVib29rcy9ydW4yL3BhdGh3YXlzX2ltbXVub2VkaXRpbmcubmIuaHRtbCcsICcvc2hhaGxhYi9hbHpoYW5nL3Byb2plY3RzL0lUSF9JbW11bmUvcGFwZXIvcmVzdWx0cy9yZXZpZXcvbm90ZWJvb2tzL3J1bjIvY2VsbHVsYXJpdHlfZGVwdGgubmIuaHRtbCcsICcvc2hhaGxhYi9hbHpoYW5nL3Byb2plY3RzL0lUSF9JbW11bmUvcGFwZXIvcmVzdWx0cy9yZXZpZXcvbm90ZWJvb2tzL3J1bjIvdGlsY2x1c3Rlcl94Y3JkaXZlcnNpdHkubmIuaHRtbCcsICcvc2hhaGxhYi9hbHpoYW5nL3Byb2plY3RzL0lUSF9JbW11bmUvcGFwZXIvcmVzdWx0cy9yZXZpZXcvbm90ZWJvb2tzL3J1bjIvdGlsY2x1c3Rlcl9tdWx0aXBsZWFzc2lnbm1lbnRzLm5iLmh0bWwnLCAnbm90ZWJvb2tzL2Zvcm1hbF9yZXZpZXdlcl9yZXNwb25zZS5SbWQnLCAnL3NoYWhsYWIvYWx6aGFuZy9wcm9qZWN0cy9JVEhfSW1tdW5lL3BhcGVyL3Jlc3VsdHMvcmV2aWV3L25vdGVib29rcy9ydW4yL3RpbGNsdXN0ZXJfcm9idXN0bmVzcy5uYi5odG1sJywgJy9zaGFobGFiL2FsemhhbmcvcHJvamVjdHMvSVRIX0ltbXVuZS9wYXBlci9yZXN1bHRzL3Jldmlldy9ub3RlYm9va3MvcnVuMi93aG9sZV9nZW5vbWVfZHVwbGljYXRpb24ubmIuaHRtbCcsICcvc2hhaGxhYi9hbHpoYW5nL3Byb2plY3RzL0lUSF9JbW11bmUvcGFwZXIvcmVzdWx0cy9yZXZpZXcvbm90ZWJvb2tzL3J1bjIvdGlsY2x1c3Rlcl9leHByY2xhc3NpZmljYXRpb24ubmIuaHRtbCcsICcvc2hhaGxhYi9hbHpoYW5nL3Byb2plY3RzL0lUSF9JbW11bmUvcGFwZXIvcmVzdWx0cy9yZXZpZXcvbm90ZWJvb2tzL3J1bjIvc3RhdGlzdGljYWxfZXJyYXRhX3Bvc3Rob2MubmIuaHRtbCcsICcvc2hhaGxhYi9hbHpoYW5nL3Byb2plY3RzL0lUSF9JbW11bmUvcGFwZXIvcmVzdWx0cy9yZXZpZXcvbm90ZWJvb2tzL3J1bjIvaW1tdW5lX3ZhcmlhdGlvbi5uYi5odG1sJywgJy9zaGFobGFiL2FsemhhbmcvcHJvamVjdHMvSVRIX0ltbXVuZS9wYXBlci9yZXN1bHRzL3Jldmlldy9ub3RlYm9va3MvcnVuMi90aWxkZW5zaXR5X3hjcmV4cGFuc2lvbi5uYi5odG1sJywgJy9zaGFobGFiL2FsemhhbmcvcHJvamVjdHMvSVRIX0ltbXVuZS9wYXBlci9yZXN1bHRzL3Jldmlldy9ub3RlYm9va3MvcnVuMi90aWxjbHVzdGVyX2ltbXVuZXByb3BlcnRpZXMubmIuaHRtbCcsICcvc2hhaGxhYi9hbHpoYW5nL3Byb2plY3RzL0lUSF9JbW11bmUvcGFwZXIvcmVzdWx0cy9yZXZpZXcvbm90ZWJvb2tzL3J1bjIvbmVvZWRpdGluZ19hZGRpdGlvbmFsLm5iLmh0bWwnLCAnL3NoYWhsYWIvYWx6aGFuZy9wcm9qZWN0cy9JVEhfSW1tdW5lL3BhcGVyL3Jlc3VsdHMvcmV2aWV3L25vdGVib29rcy9ydW4yL3B1YmxpY19jbG9ub3R5cGVzLm5iLmh0bWwnLCAicm9vbmV5X2NvbXBhcmlzb24iID0gJy9zaGFobGFiL2FsemhhbmcvcHJvamVjdHMvSVRIX0ltbXVuZS9wYXBlci9yZXN1bHRzL3Jldmlldy9ub3RlYm9va3MvcnVuMi9yb29uZXlfY29tcGFyaXNvbi5uYi5odG1sJywgInRjcl9uZW9lcGl0b3BlX2NvcnJlbGF0aW9uIiA9ICcvc2hhaGxhYi9hbHpoYW5nL3Byb2plY3RzL0lUSF9JbW11bmUvcGFwZXIvcmVzdWx0cy9yZXZpZXcvbm90ZWJvb2tzL3J1bjIvdGNyX25lb2VwaXRvcGVfY29ycmVsYXRpb24ubmIuaHRtbCcsICJwYXRod2F5c19pbW11bm9lZGl0aW5nIiA9ICcvc2hhaGxhYi9hbHpoYW5nL3Byb2plY3RzL0lUSF9JbW11bmUvcGFwZXIvcmVzdWx0cy9yZXZpZXcvbm90ZWJvb2tzL3J1bjIvcGF0aHdheXNfaW1tdW5vZWRpdGluZy5uYi5odG1sJywgImNlbGx1bGFyaXR5X2RlcHRoIiA9ICcvc2hhaGxhYi9hbHpoYW5nL3Byb2plY3RzL0lUSF9JbW11bmUvcGFwZXIvcmVzdWx0cy9yZXZpZXcvbm90ZWJvb2tzL3J1bjIvY2VsbHVsYXJpdHlfZGVwdGgubmIuaHRtbCcsICJ0aWxjbHVzdGVyX3hjcmRpdmVyc2l0eSIgPSAnL3NoYWhsYWIvYWx6aGFuZy9wcm9qZWN0cy9JVEhfSW1tdW5lL3BhcGVyL3Jlc3VsdHMvcmV2aWV3L25vdGVib29rcy9ydW4yL3RpbGNsdXN0ZXJfeGNyZGl2ZXJzaXR5Lm5iLmh0bWwnLCAidGlsY2x1c3Rlcl9tdWx0aXBsZWFzc2lnbm1lbnRzIiA9ICcvc2hhaGxhYi9hbHpoYW5nL3Byb2plY3RzL0lUSF9JbW11bmUvcGFwZXIvcmVzdWx0cy9yZXZpZXcvbm90ZWJvb2tzL3J1bjIvdGlsY2x1c3Rlcl9tdWx0aXBsZWFzc2lnbm1lbnRzLm5iLmh0bWwnLCAibm90ZWJvb2siID0gJ25vdGVib29rcy9mb3JtYWxfcmV2aWV3ZXJfcmVzcG9uc2UuUm1kJywgInRpbGNsdXN0ZXJfcm9idXN0bmVzcyIgPSAnL3NoYWhsYWIvYWx6aGFuZy9wcm9qZWN0cy9JVEhfSW1tdW5lL3BhcGVyL3Jlc3VsdHMvcmV2aWV3L25vdGVib29rcy9ydW4yL3RpbGNsdXN0ZXJfcm9idXN0bmVzcy5uYi5odG1sJywgIndob2xlX2dlbm9tZV9kdXBsaWNhdGlvbiIgPSAnL3NoYWhsYWIvYWx6aGFuZy9wcm9qZWN0cy9JVEhfSW1tdW5lL3BhcGVyL3Jlc3VsdHMvcmV2aWV3L25vdGVib29rcy9ydW4yL3dob2xlX2dlbm9tZV9kdXBsaWNhdGlvbi5uYi5odG1sJywgInRpbGNsdXN0ZXJfZXhwcmNsYXNzaWZpY2F0aW9uIiA9ICcvc2hhaGxhYi9hbHpoYW5nL3Byb2plY3RzL0lUSF9JbW11bmUvcGFwZXIvcmVzdWx0cy9yZXZpZXcvbm90ZWJvb2tzL3J1bjIvdGlsY2x1c3Rlcl9leHByY2xhc3NpZmljYXRpb24ubmIuaHRtbCcsICJzdGF0aXN0aWNhbF9lcnJhdGFfcG9zdGhvYyIgPSAnL3NoYWhsYWIvYWx6aGFuZy9wcm9qZWN0cy9JVEhfSW1tdW5lL3BhcGVyL3Jlc3VsdHMvcmV2aWV3L25vdGVib29rcy9ydW4yL3N0YXRpc3RpY2FsX2VycmF0YV9wb3N0aG9jLm5iLmh0bWwnLCAiaW1tdW5lX3ZhcmlhdGlvbiIgPSAnL3NoYWhsYWIvYWx6aGFuZy9wcm9qZWN0cy9JVEhfSW1tdW5lL3BhcGVyL3Jlc3VsdHMvcmV2aWV3L25vdGVib29rcy9ydW4yL2ltbXVuZV92YXJpYXRpb24ubmIuaHRtbCcsICJ0aWxkZW5zaXR5X3hjcmV4cGFuc2lvbiIgPSAnL3NoYWhsYWIvYWx6aGFuZy9wcm9qZWN0cy9JVEhfSW1tdW5lL3BhcGVyL3Jlc3VsdHMvcmV2aWV3L25vdGVib29rcy9ydW4yL3RpbGRlbnNpdHlfeGNyZXhwYW5zaW9uLm5iLmh0bWwnLCAidGlsY2x1c3Rlcl9pbW11bmVwcm9wZXJ0aWVzIiA9ICcvc2hhaGxhYi9hbHpoYW5nL3Byb2plY3RzL0lUSF9JbW11bmUvcGFwZXIvcmVzdWx0cy9yZXZpZXcvbm90ZWJvb2tzL3J1bjIvdGlsY2x1c3Rlcl9pbW11bmVwcm9wZXJ0aWVzLm5iLmh0bWwnLCAibmVvZWRpdGluZ19hZGRpdGlvbmFsIiA9ICcvc2hhaGxhYi9hbHpoYW5nL3Byb2plY3RzL0lUSF9JbW11bmUvcGFwZXIvcmVzdWx0cy9yZXZpZXcvbm90ZWJvb2tzL3J1bjIvbmVvZWRpdGluZ19hZGRpdGlvbmFsLm5iLmh0bWwnLCAicHVibGljX2Nsb25vdHlwZXMiID0gJy9zaGFobGFiL2FsemhhbmcvcHJvamVjdHMvSVRIX0ltbXVuZS9wYXBlci9yZXN1bHRzL3Jldmlldy9ub3RlYm9va3MvcnVuMi9wdWJsaWNfY2xvbm90eXBlcy5uYi5odG1sJyksCiAgICBvdXRwdXQgPSBsaXN0KCcvc2hhaGxhYi9hbHpoYW5nL3Byb2plY3RzL0lUSF9JbW11bmUvcGFwZXIvcmVzdWx0cy9yZXZpZXcvbm90ZWJvb2tzL3J1bjIvZm9ybWFsX3Jldmlld2VyX3Jlc3BvbnNlLm5iLmh0bWwnKSwKICAgIHBhcmFtcyA9IGxpc3QoJ2NlbGxfcjFfcmVzcG9uc2UnLCAibmFtZSIgPSAnY2VsbF9yMV9yZXNwb25zZScpLAogICAgd2lsZGNhcmRzID0gbGlzdCgpLAogICAgdGhyZWFkcyA9IDEsCiAgICBsb2cgPSBsaXN0KCcvc2hhaGxhYi9hbHpoYW5nL2NsdXN0dG1wL3BhcGVycmV2aWV3Mi9ub3RlYm9va3MvY2VsbF9yb3VuZDFfcmVzcG9uc2UubG9nJyksCiAgICByZXNvdXJjZXMgPSBsaXN0KCksCiAgICBjb25maWcgPSBsaXN0KCJiZW5jaG1hcmtkaXIiID0gJy9zaGFobGFiL2FsemhhbmcvYmVuY2htYXJrcy9wYXBlcnJldmlldzInLCAidGNyX2RpdmVyc2l0eSIgPSAnL3NoYWhsYWIvYWx6aGFuZy9waXBlbGluZV9vdXRwdXRzL2l0aF9pbW11bmUvbWl4Y3IvbWl4Y3JfcnVucy9pdGhfMV8yXzMvbWl4Y3I1L3Bvc3Rwcm9jZXNzL1RSQi9wb3N0ZmlsdGVyX2RpdmVyc2l0eV9zdGF0cy9kaXZlcnNpdHkuc3RyaWN0LnJlc2FtcGxlZC50eHQnLCAicm9vbmV5X211dHNpZ2N2X2ZpbGUiID0gJy9zaGFobGFiL2FsemhhbmcvcHJvamVjdHMvSVRIX0ltbXVuZS9leHRlcm5hbC9vdGhlcl9wYXBlcnMvbW1jNi54bHN4JywgIml0aF9zdGF0X3R5cGVzIiA9IGMoJ2VudHJvcHknLCAncG9zdHByb2Nlc3NlZF9kaXZlcmdlbmNlJywgJ2NvbWJpbmVkX2l0aF9ub3JtYWxpemVkJywgJ3Byb3BvcnRpb25fc3ViY2xvbmFsJyksICJpZ3BhcnRpdGlvbl9vdXRkaXIiID0gJy9zaGFobGFiL2FsemhhbmcvcGlwZWxpbmVfb3V0cHV0cy9pdGhfaW1tdW5lL2lncGFydGl0aW9uL3J1bjIyJywgIm5hbm9zdHJpbmdfZGF0YSIgPSAnL3NoYWhsYWIvYWx6aGFuZy9wcm9qZWN0cy9JVEhfSW1tdW5lL3Jlc3VsdHMvbmFub3N0cmluZ19yZXN1bHRzL2l0aF9mdWxsL3FjL2xpbW1hX3F1YW50aWxlL25vcm1hbGl6ZWRfZXhwcmVzc2lvbl92b2FfbGFiZWxzX2ZpbHRlcmVkLnRzdicsICJjb3B5bnVtYmVyX3RhYmxlIiA9ICcvc2hhaGxhYi9hbHpoYW5nL2RhdGEvaXRoaS9tYXN0ZXJfY29weW51bWJlcl9maWxlLnRzdicsICJ0Y2dhX292X2JhbV9kaXIiID0gJy9zaGFobGFiL2FyY2hpdmUvaW1tdW5lX3Byb2plY3QvVENHQS1PVi9iYW0nLCAiZXBpdG9wZXNfdW5pcXVlX2ZpbHRlcmVkIiA9ICcvc2hhaGxhYi9hbHpoYW5nL3Byb2plY3RzL0lUSF9JbW11bmUvcGFwZXIvcmVzdWx0cy90YWJsZXMvcnVuMi9lcGl0b3Blc191bmlxdWVfZmlsdGVyZWQudHN2JywgImNsb25lX2JyYW5jaF9sZW5ndGhzIiA9ICcvc2hhaGxhYi9hbHpoYW5nL3Byb2plY3RzL0lUSF9JbW11bmUvcGFwZXIvcmVzdWx0cy90YWJsZXMvcnVuMi9jbG9uZXMvYnJhbmNoX2RhdGEudHN2JywgImxvaGhsYV9pY2djX291dGRpciIgPSAnL3NoYWhsYWIvYWx6aGFuZy9waXBlbGluZV9vdXRwdXRzL2l0aF9pbW11bmUvbG9oaGxhL3J1bjFfaWNnYycsICJpdGhfc3RhdHMiID0gJy9zaGFobGFiL2FsemhhbmcvcHJvamVjdHMvSVRIX0ltbXVuZS9wYXBlci9yZXN1bHRzL3RhYmxlcy9ydW4yL2l0aF9zdGF0aXN0aWNzLnRzdicsICJpY2djX3N1YnR5cGVzIiA9ICcvc2hhaGxhYi9hbHpoYW5nL2RhdGEvSUNHQy9pY2djX3ByaW1hcnlfdHVtb3VyX3N1YnR5cGVzLnRzdicsICJtb2xzdWJ0eXBlcyIgPSAnL3NoYWhsYWIvYWx6aGFuZy9wcm9qZWN0cy9JVEhfSW1tdW5lL3BhcGVyL3Jlc3VsdHMvdGFibGVzL3J1bjIvbW9sc3VidHlwZXMudHN2JywgImxvaGhsYV90Y2dhX291dGRpciIgPSAnL3NoYWhsYWIvYWx6aGFuZy9waXBlbGluZV9vdXRwdXRzL2l0aF9pbW11bmUvbG9oaGxhL3J1bjhfdGNnYScsICJ0YWJsZV9kaXIiID0gJy9zaGFobGFiL2FsemhhbmcvcHJvamVjdHMvSVRIX0ltbXVuZS9wYXBlci9yZXN1bHRzL3Jldmlldy90YWJsZXMvcnVuMicsICJyZW1peHRfY2VsbHVsYXJpdHlfcGxvaWR5IiA9ICcvc2hhaGxhYi9hbHpoYW5nL3Byb2plY3RzL0lUSF9JbW11bmUvcGFwZXIvcmVzdWx0cy90YWJsZXMvcnVuMi9yZW1peHRfY2VsbHVsYXJpdHlfcGxvaWR5LnRzdicsICJpaGNfdGFibGUiID0gJy9zaGFobGFiL2FsemhhbmcvcHJvamVjdHMvSVRIX0ltbXVuZS9wYXBlci9yZXN1bHRzL3RhYmxlcy9ydW4yL2loY190YWJsZS50c3YnLCAiY2xvbmVfcHJldmFsZW5jZXMiID0gJy9zaGFobGFiL2FsemhhbmcvcHJvamVjdHMvSVRIX0ltbXVuZS9wYXBlci9yZXN1bHRzL3RhYmxlcy9ydW4yL2Nsb25lcy9jbG9uZV9kYXRhLnRzdicsICJpY2djX2V4cHJfbWF0IiA9ICcvc2hhaGxhYi9hbHpoYW5nL2RhdGEvSUNHQy9PVkFVX2V4cHJfbWF0cml4LnRzdicsICJpdGhfaWNnY19iYyIgPSAnL3NoYWhsYWIvYWx6aGFuZy9wcm9qZWN0cy9JVEhfSW1tdW5lL3BhcGVyL3Jlc3VsdHMvdGFibGVzL3J1bjIvaXRoX2ljZ2NfbWVyZ2VkX2JjLnRzdicsICJpbWFnZV9zdW1tYXJ5MiIgPSAnL3NoYWhsYWIvYWx6aGFuZy9kYXRhL2l0aGkveXVhbl9oZWNyX2ltYWdlX3Jlc3VsdHNfMi5jc3YnLCAidGlsY2x1c3Rlcl9zdXBlcnZpc2VkX2lweW5iIiA9ICcvc2hhaGxhYi9hbHpoYW5nL3Byb2plY3RzL0lUSF9JbW11bmUvcGFwZXIvcmV2aWV3L2lweS90aWxjbHVzdGVyX3N1cGVydmlzZWRtdWx0aWNsYXNzLmlweW5iJywgInRpbHNfZm9yX3ZhcmlhYmlsaXR5IiA9IGMoJ1RfQ0Q4X2RlbnNpdHknLCAnVF9DRDRfZGVuc2l0eScsICdUX0NEMjBfZGVuc2l0eScsICdUX1BsYXNtYV9kZW5zaXR5JyksICJub3RlYm9va19kaXIiID0gJy9zaGFobGFiL2FsemhhbmcvcHJvamVjdHMvSVRIX0ltbXVuZS9wYXBlci9yZXN1bHRzL3Jldmlldy9ub3RlYm9va3MvcnVuMicsICJzbnZfY2x1c3Rlcl9kaXIiID0gJy9zaGFobGFiL2FsemhhbmcvcHJvamVjdHMvSVRIX0ltbXVuZS9wYXBlci9yZXN1bHRzL3RhYmxlcy9ydW4yL2Nsb25lcy9zbnZfY2x1c3RlcicsICJpaGNfZmVhdHVyZXNfb3V0cHV0IiA9ICcvc2hhaGxhYi9hbHpoYW5nL3Byb2plY3RzL0lUSF9JbW11bmUvcGFwZXIvcmVzdWx0cy9pbnRlcm1lZGlhdGVzL3J1bjIvaWhjX2ZlYXR1cmVzX291dHB1dC50eHQnLCAidGNnYV9wYXBlcl9zdWJ0eXBlc19wb3NzaWxob3VldHRlIiA9ICcvc2hhaGxhYi9hbHpoYW5nL2RhdGEvVENHQS9UQ0dBXzQ4OV9VRS5rNC5wb3NTaWxob3VldHRlLnR4dCcsICJtbWN0bV9maW5hbF9wYXRpZW50X2RpciIgPSAnL3NoYWhsYWIvYWx6aGFuZy9wcm9qZWN0cy9JVEhfSW1tdW5lL3Jlc3VsdHMvbW1jdG1fcmVzdWx0cy9pdGhfYnktcGF0aWVudF93aXRoLW92JywgInZhcmlhYmlsaXR5X3R5cGUiID0gJ3N0YWJpbGl6ZScsICJsb2dkaXIiID0gJy9zaGFobGFiL2FsemhhbmcvY2x1c3R0bXAvcGFwZXJyZXZpZXcyJywgImZpbm5oZV9waXBlbGluZV9yZXN1bHRzX2RpciIgPSAnL3NoYWhsYWIvYWx6aGFuZy9waXBlbGluZV9vdXRwdXRzL2l0aF9pbW11bmUvZmlubmhlL3J1bjEnLCAia25vd25fc3VidHlwZXNfYXJyYXkiID0gJy9zaGFobGFiL2FsemhhbmcvcHJvamVjdHMvSVRIX0ltbXVuZS9kYXRhL2V4cHJlc3Npb24vYXJyYXkvc3VidHlwZXMva25vd25fc3VidHlwZXMudHN2JywgInBhdGllbnRzX2Zvcl9jbG9uYWwiID0gYygxLCAyLCAzLCA0LCA3LCA5LCAxMCwgMTEsIDEyLCAxMywgMTQsIDE1LCAxNiwgMTcpLCAiY2xvbmVfdHJlZXMiID0gJy9zaGFobGFiL2FsemhhbmcvcHJvamVjdHMvSVRIX0ltbXVuZS9wYXBlci9yZXN1bHRzL3RhYmxlcy9ydW4yL2Nsb25lcy90cmVlX2RhdGEudHN2JywgInByZXZhbGVuY2VfdGhyZXNob2xkIiA9IDAuMDEsICJpY2djX3NwZWNpbWVuIiA9ICcvc2hhaGxhYi9hbHpoYW5nL2RhdGEvSUNHQy9zcGVjaW1lbi50c3YnLCAibmVvZWRpdGluZ19vdXRkaXIiID0gJy9zaGFobGFiL2FsemhhbmcvcGlwZWxpbmVfb3V0cHV0cy9pdGhfaW1tdW5lL25lb2VkaXRpbmcvcnVuNicsICJhcnJheV9ubWZfc3VidHlwZXMiID0gJy9zaGFobGFiL2FsemhhbmcvcHJvamVjdHMvSVRIX0ltbXVuZS9kYXRhL2V4cHJlc3Npb24vYXJyYXkvc3VidHlwZXMvbm1mX3N1YnR5cGVzLnR4dCcsICJiY3JfZGl2ZXJzaXR5IiA9ICcvc2hhaGxhYi9hbHpoYW5nL3BpcGVsaW5lX291dHB1dHMvaXRoX2ltbXVuZS9taXhjci9taXhjcl9ydW5zL2l0aF8xXzJfMy9taXhjcjUvcG9zdHByb2Nlc3MvSUdIL3Bvc3RmaWx0ZXJfZGl2ZXJzaXR5X3N0YXRzL2RpdmVyc2l0eS5zdHJpY3QucmVzYW1wbGVkLnR4dCcsICJhcnJheV9leHByZXNzaW9uX2ZpbGUiID0gJy9zaGFobGFiL2FsemhhbmcvcHJvamVjdHMvSVRIX0ltbXVuZS9kYXRhL2V4cHJlc3Npb24vYXJyYXkvZ2VuZV9leHByc19ybWFfYmF0Y2hfY29ycmVjdGVkLnR4dCcsICJ0aWxzX2Zvcl9jbHVzdGVyIiA9IGMoJ0VfQ0Q4X2RlbnNpdHknLCAnRV9DRDRfZGVuc2l0eScsICdFX0NEMjBfZGVuc2l0eScsICdFX1BsYXNtYV9kZW5zaXR5JywgJ1NfQ0Q4X2RlbnNpdHknLCAnU19DRDRfZGVuc2l0eScsICdTX0NEMjBfZGVuc2l0eScsICdTX1BsYXNtYV9kZW5zaXR5JyksICJuYW5vc3RyaW5nX2Fubm90YXRpb25zIiA9ICcvc2hhaGxhYi9hbHpoYW5nL3Byb2plY3RzL0lUSF9JbW11bmUvZGF0YS9leHByZXNzaW9uL25hbm9zdHJpbmcvcGFuY2FuY2VyX2Fubm90YXRpb25zLnRzdicsICJ0aWxfY2x1c3RlcnNfb3V0cHV0IiA9ICcvc2hhaGxhYi9hbHpoYW5nL3Byb2plY3RzL0lUSF9JbW11bmUvcGFwZXIvcmVzdWx0cy9pbnRlcm1lZGlhdGVzL3J1bjIvdGlsX2NsdXN0ZXJzX291dHB1dC50eHQnLCAidGNnYV9wYXBlcl9zdWJ0eXBlc19yYXciID0gJy9zaGFobGFiL2FsemhhbmcvZGF0YS9UQ0dBL1RDR0FfNDg5X1VFLms0LnR4dCcsICJyZWZzZXFfZ2VuZV9maWxlIiA9ICcvc2hhaGxhYi9hbHpoYW5nL2RhdGEvZ2Vub21lL2hnMTkvcmVmc2VxX2dlbmVzLmJlZCcsICJjbG9sYV9yZXN1bHRfZmlsZSIgPSAnL3NoYWhsYWIvYWx6aGFuZy9waXBlbGluZV9vdXRwdXRzL2l0aF9pbW11bmUvY2xvbGEvcnVuNS9jbG9sYV9jb25kZW5zZWRfcmVzdWx0cy9tdWx0X2ZhY3Rvci90cnVuY25vcm1hbC9jbG9sYV9yZXN1bHRzLnRzdicsICJhbGxfdGlsdHlwZXMiID0gYygnVF9DRDhfZGVuc2l0eScsICdUX0NENF9kZW5zaXR5JywgJ1RfQ0QyMF9kZW5zaXR5JywgJ1RfUGxhc21hX2RlbnNpdHknLCAnRV9DRDhfZGVuc2l0eScsICdFX0NENF9kZW5zaXR5JywgJ0VfQ0QyMF9kZW5zaXR5JywgJ0VfUGxhc21hX2RlbnNpdHknLCAnU19DRDhfZGVuc2l0eScsICdTX0NENF9kZW5zaXR5JywgJ1NfQ0QyMF9kZW5zaXR5JywgJ1NfUGxhc21hX2RlbnNpdHknKSwgInhjcl90YWJsZSIgPSAnL3NoYWhsYWIvYWx6aGFuZy9wcm9qZWN0cy9JVEhfSW1tdW5lL3BhcGVyL3Jlc3VsdHMvdGFibGVzL3J1bjIveGNyX3RhYmxlLnRzdicsICJ0Y2dhX292X2Fubm90YXRpb25zIiA9ICcvc2hhaGxhYi9hbHpoYW5nL2RhdGEvVENHQS90Y2dhX292X2Fubm90YXRpb25fc3VwMTMudHh0JywgImRpc3RhbmNlX21ldGhvZCIgPSAnaG9ybicsICJ0dW1vdXJfcHVyaXR5IiA9ICcvc2hhaGxhYi9hbHpoYW5nL3Byb2plY3RzL0lUSF9JbW11bmUvcGFwZXIvcmVzdWx0cy90YWJsZXMvcnVuMi90dW1vdXJfcHVyaXR5LnRzdicsICJoZV9yZXN1bHRzX2RpciIgPSAnL3NoYWhsYWIvYWx6aGFuZy9kYXRhL2l0aGkvZmlubl9yZXN1bHRzL2hlX291dHB1dF9Ob3YyOScsICJ0b3RhbF90aWx0eXBlcyIgPSBjKCdUX0NEOF9kZW5zaXR5JywgJ1RfQ0Q0X2RlbnNpdHknLCAnVF9DRDIwX2RlbnNpdHknLCAnVF9QbGFzbWFfZGVuc2l0eScpLCAiZGIiID0gJy9zaGFobGFiL2FsemhhbmcvcHJvamVjdHMvSVRIX0ltbXVuZS9tZXRhZGF0YS9kYi9pbW11bmVfcHJvamVjdC5zcWxpdGUzJywgImJyZWFrcG9pbnRfdGFibGUiID0gJy9zaGFobGFiL2FtY3BoZXJzb24vcHJvamVjdHMvaXRoMy9pdGgzL25vdGVib29rcy9iZXNwb2tlL2l0aF9icmVha3BvaW50cy50c3YnLCAibG9oaGxhX21pc21hdGNoX3NpdGVfdGhyZXNob2xkIiA9IDUuMCwgImltYWdlX3N1bW1hcnkiID0gJy9zaGFobGFiL2FsemhhbmcvZGF0YS9pdGhpL3l1YW5faGVjcl9pbWFnZV9yZXN1bHRzLmNzdicsICJsb2hobGFfc3VwcG9ydGl2ZV9zaXRlX3RocmVzaG9sZCIgPSA5MC4wLCAidGNnYV9ub25zdGRfZXhwciIgPSAnL3NoYWhsYWIvYWx6aGFuZy9kYXRhL1RDR0EvZXhwcl9tYXRyaXhfbm9ybWFsaXplX25vZHVwbGljYXRlcy50c3YnLCAic29tYXRpY19jb2RpbmdfcmVzdWx0X2RpciIgPSAnL3NoYWhsYWIvYWx6aGFuZy9wcm9qZWN0cy9JVEhfSW1tdW5lL3BhcGVyL3Jlc3VsdHMvdGFibGVzL3J1bjIvc29tYXRpY19jb2RpbmdfdmFyaWFudHMnLCAic252X3RhYmxlIiA9ICcvc2hhaGxhYi9hbWNwaGVyc29uL3Byb2plY3RzL2l0aDMvaXRoMy9ub3RlYm9va3MvYmVzcG9rZS9pdGhfc252cy50c3YnKSwKICAgIHJ1bGUgPSAnY2VsbF9yb3VuZDFfcmVzcG9uc2UnCikKIyMjIyMjIyMgT3JpZ2luYWwgc2NyaXB0ICMjIyMjIyMjIwoKICAgICAgICAgICAgICAgICAgICAgICAgYGBgCgoKVGhpcyBpcyB0aGUgZm9ybWFsIHZlcnNpb24gb2YgdGhlIGRvY3VtZW50IHRoYXQnbGwgYmUgZG9uZSBiZXR0ZXIgdGhhbiB0aGUgcHJldmlvdXMgdmVyc2lvbnMuIAoKVGhpcydsbCBiZSByZWZhY3RvcmVkIHByb3Blcmx5IHRvby4gCgojIyBTZXR1cAoKYGBge3IgZ2xvYmFsX2NodW5rX29wdGlvbnMsIGluY2x1ZGU9RkFMU0V9CmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSwgdGlkeT1UUlVFLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCBjYWNoZT1UUlVFKSAjY2FjaGU9VFJVRQpgYGAKCmBgYHtyfQpiYXNlX3dlYl9wYXRoIDwtIHNuYWtlbWFrZUBwYXJhbXMkYmFzZV93ZWJfcGF0aAoKbm90ZWJvb2tfcGF0aHMgPC0gbGlzdCgKICAnY2VsbHVsYXJpdHlfZGVwdGgnPXNuYWtlbWFrZUBpbnB1dCRjZWxsdWxhcml0eV9kZXB0aCwKICAncGF0aHdheXNfaW1tdW5vZWRpdGluZyc9c25ha2VtYWtlQGlucHV0JHBhdGh3YXlzX2ltbXVub2VkaXRpbmcsCiAgJ3Jvb25leV9jb21wYXJpc29uJz1zbmFrZW1ha2VAaW5wdXQkcm9vbmV5X2NvbXBhcmlzb24sCiAgJ3RpbGNsdXN0ZXJfcm9idXN0bmVzcyc9c25ha2VtYWtlQGlucHV0JHRpbGNsdXN0ZXJfcm9idXN0bmVzcywKICAnd2hvbGVfZ2Vub21lX2R1cGxpY2F0aW9uJz1zbmFrZW1ha2VAaW5wdXQkd2hvbGVfZ2Vub21lX2R1cGxpY2F0aW9uLAogICd0aWxjbHVzdGVyX2V4cHJjbGFzc2lmaWNhdGlvbic9c25ha2VtYWtlQGlucHV0JHRpbGNsdXN0ZXJfZXhwcmNsYXNzaWZpY2F0aW9uLAogICd0Y3JfbmVvZXBpdG9wZV9jb3JyZWxhdGlvbic9c25ha2VtYWtlQGlucHV0JHRjcl9uZW9lcGl0b3BlX2NvcnJlbGF0aW9uLAogICd0aWxjbHVzdGVyX211bHRpcGxlYXNzaWdubWVudHMnPXNuYWtlbWFrZUBpbnB1dCR0aWxjbHVzdGVyX211bHRpcGxlYXNzaWdubWVudHMsCiAgJ3RpbGNsdXN0ZXJfaW1tdW5lcHJvcGVydGllcyc9c25ha2VtYWtlQGlucHV0JHRpbGNsdXN0ZXJfaW1tdW5lcHJvcGVydGllcywKICAnc3RhdGlzdGljYWxfZXJyYXRhX3Bvc3Rob2MnPXNuYWtlbWFrZUBpbnB1dCRzdGF0aXN0aWNhbF9lcnJhdGFfcG9zdGhvYywKICAnbmVvZWRpdGluZ19hZGRpdGlvbmFsJz1zbmFrZW1ha2VAaW5wdXQkbmVvZWRpdGluZ19hZGRpdGlvbmFsLAogICd0aWxkZW5zaXR5X3hjcmV4cGFuc2lvbic9c25ha2VtYWtlQGlucHV0JHRpbGRlbnNpdHlfeGNyZXhwYW5zaW9uLAogICd0aWxjbHVzdGVyX3hjcmRpdmVyc2l0eSc9c25ha2VtYWtlQGlucHV0JHRpbGNsdXN0ZXJfeGNyZGl2ZXJzaXR5LAogICdwdWJsaWNfY2xvbm90eXBlcyc9c25ha2VtYWtlQGlucHV0JHB1YmxpY19jbG9ub3R5cGVzLAogICdpbW11bmVfdmFyaWF0aW9uJz1zbmFrZW1ha2VAaW5wdXQkaW1tdW5lX3ZhcmlhdGlvbgopCgpub3RlYm9va19yZWxhdGl2ZV9wYXRocyA8LSBsYXBwbHkobm90ZWJvb2tfcGF0aHMsIGZ1bmN0aW9uKHgpIHsKICAjeDIgPC0gZ3N1YihiYXNlX3dlYl9wYXRoLCAiIiwgeCkKICAjeDIgPC0gc3RyaW5ncjo6c3RyX3JlcGxhY2UoeDIsICJeLyIsICIiKQogIHgyIDwtIGJhc2VuYW1lKHgpCiAgcmV0dXJuKHgyKQp9KQpgYGAKCiMgQ29tbWVudHMKCiMjIFJldmlld2VyIDEKCkluIHRoaXMgc3R1ZHksIHRoZSBhdXRob3JzIGV4YW1pbmUgdGhlIHR1bW9yIGNlbGwgYW5kIGltbXVub2xvZ2ljIHZhcmlhdGlvbnMgYmV0d2VlbiBwYXRpZW50cyBhbmQgYmV0d2VlbiBzaXRlcyB3aXRoaW4gcGF0aWVudHMgd2l0aCBvdmFyaWFuIGNhbmNlci4gVGhleSB1c2Ugd2hvbGUgZ2Vub21lIHNlcXVlbmNpbmcsIElIQywgZ2VuZSBleHByZXNzaW9uIHByb2ZpbGluZywgYW5kIFQvQiBjZWxsIHJlY2VwdG9yIHNlcXVlbmNpbmcgdG8gZXhhbWluZSBpbW11bmUgYW5kIHR1bW9yIGNlbGwgaW50ZXJhY3Rpb25zLiBUaGV5IHNob3cgdGhhdCBUSUwgbGV2ZWxzIHdlcmUgaW52ZXJzZWx5IGFzc29jaWF0ZWQgd2l0aCBjYW5jZXIgY2VsbCBkaXZlcnNpdHkgYW5kIHNob3cgZXZpZGVuY2Ugb2Ygc3ViY2xvbmFsIG5lb2VwaXRvcGUgZWxpbWluYXRpb24uIFRoZXkgYWxzbyBzaG93IHRoYXQgaW52ZXJzaW9uIGdlbm9taWMgYWJlcnJhdGlvbnMgbGVhZCB0byB3b3JzZSBvdXRjb21lcyBldmVuIGluIHRoZSBwcmVzZW5jZSBvZiBUSUxzLiBJbiBnZW5lcmFsLCB0aGlzIHBhcGVyIHByZXNlbnRzIGEgbGFyZ2UgYW1vdW50IG9mIGRhdGEuIFRoZSBvYnNlcnZhdGlvbnMgYXJlIGltcG9ydGFudCBhbmQgdGhlIGZpbmRpbmdzIGltcGFjdGZ1bC4gSG93ZXZlciwgaXQgaXMgbGFyZ2VseSBkZXNjcmlwdGl2ZSBhbmQgY2FuIGJlbmVmaXQgZnJvbSBzb21lIG1lYXN1cmUgb2YgbWVjaGFuaXN0aWMgdmFsaWRhdGlvbi4gVGhlcmUgYXJlIGEgbnVtYmVyIG9mIGltcG9ydGFudCBpc3N1ZXMgdGhhdCBuZWVkIHRvIGJlIGRlYWx0IHdpdGguCgoqQWxsZW4ncyBpbXByZXNzaW9uKjogQXBwZWFycyBpbnRlcmVzdGVkIGluIHRoZSB3b3JrOyBtZWNoYW5pc3RpYyB2YWxpZGF0aW9uIGlzIHRoZSBiaWdnZXN0IGNvbXBvbmVudCBsYWNraW5nIGZyb20gdGhlIHJldmlld2VyLiBUaGUgc3RyYXRlZ3kgaGVyZSB3b3VsZCBiZSB0byAoMSkgZXhwZXJpbWVudGFsbHkgdmFsaWRhdGUgbmVvYW50aWdlbiByZXN1bHRzOyBhbmQgKDIpIGVtcGhhc2l6ZSB0aGUgaW1wb3J0YW5jZS92YWx1ZSBvZiBjb3Jyb2JvcmF0aW5nIGV2aWRlbmNlIGZyb20gb3RoZXIgYXZlbnVlcy4gRm9yIGV4YW1wbGUsIG5lb0FnIGVkaXRpbmcsIElUSCA8PT4gVElMcywgY2xvbmFsIHRyYWNraW5nIGFjcm9zcyBzcGFjZSwgYW5kIExPSEhMQSB3b3VsZCBhbGwgc3VwcG9ydCBpbW11bmUgZWRpdGluZy4gCgoqUG9pbnRzIHRvIGhpZ2hsaWdodCo6IFRoaXMgcmV2aWV3ZXIgYXBwZWFycyB0byBtaXN1bmRlcnN0YW5kIG91ciBwb2ludCBvbiBzdWJjbG9uYWwgbmVvQWcgZWRpdGluZyAtLSBzZWVtcyB0byB0aGluayB0aGF0IHRoaXMgaW1wbGllcyBsYWNrIG9mIGNsb25hbCBuZW9BZyBlZGl0aW5nLiBMb3RzIG9mIHdheXMgdG8gdGFja2xlIHRoaXMgLS0gaW5jbC4gTmlja3kncyBMT0hITEEgcGFwZXIgd2hpY2ggYnJpbmdzIHVwIHRoZSBpZGVhIHRoYXQgc3ViY2xvbmFsIG5lb2VwaXRvcGVzIG1heSBhbHNvIGJlIHN1YmplY3QgdG8gZWxpbWluYXRpb24uIAoKIyMjIENvbW1lbnQgMQoKKipROiBJbnRyb2R1Y3Rpb24gbGluZSAz4oCmLi5zaG91bGQgYmUgbW9yZSBjYXJlZnVsIHdpdGggc3RhdGVtZW50cy4gImFkdmFuY2VkIiBIR1NDIGlzIGRpZmZpY3VsdCB0byBjdXJlIChIR1NDIG5vdCBhbHdheXMgaW5jdXJhYmxlKS4gSXQgbWF5IGJlIGhlbHBmdWwgZm9yIGEgdHJhaW5lZCBjbGluaWNpYW4gdG8gZG91YmxlIGNoZWNrIHRoZSBzdGF0ZW1lbnRzIG1hZGUgY29uY2VybmluZyBkaXNlYXNlIGltcGFjdC4qKgoKT3VyIGNsaW5pY2lhbiAoSi5NLikgZGlzYWdyZWVzIHdpdGggdGhpcyBzdGF0ZW1lbnQsIHRob3VnaCBJIHN1cHBvc2UgdGhpcyBjb3VsZCBiZSBhIG1hdHRlciBvZiBpbnRlcnByZXRpbmcgaW5jdXJhYmxlIG9uIGEgY2FzZS1ieS1jYXNlIGJhc2lzLiBUbyBhZGRyZXNzIHRoaXMgY29tbWVudCB3ZSBjYW4gY2hhbmdlICdpbmN1cmFibGUnIHRvIGEgJ2RpZmZpY3VsdCB0byBjdXJlJyBvciBzb21ldGhpbmcgc2ltaWxhci4gCgojIyMgQ29tbWVudCAyCgoqKlE6IEZpZyAxIGlzIHF1aXRlIGRpZmZpY3VsdCB0byBkZWNpcGhlciBmb3IgdGhlIHJlYWRlci4qKgoKVG8gYWRkcmVzcyB0aGlzLCB3ZSBoYXZlIGVubGFyZ2VkIHRoZSBib3JkZXJzIG9mIEZpZyAxYSwgYWRkZWQgYSByZWZlcmVuY2UgdG8gU3VwcGxlbWVudGFsIFRhYmxlIFggY29udGFpbmluZyB0aGUgbWFwcGluZyBmb3IgYWxsIHNob3J0ZW5lZCBzYW1wbGUgSURzLCBhbmQgY2hhbmdlZCB0aGUgbG93ZXIgcGFydCBvZiBGaWd1cmUgMWIgdG8gYSBiYXJwbG90LiBXZSBhY2tub3dsZWRnZSB0aGF0IHRoZSBsaW5lLWFuZC1kb3QgcGxvdCwgYWx0aG91Z2ggYWRkaW5nIGluZm9ybWF0aW9uLCB3YXMgZGlmZmljdWx0IHRvIGRlY2lwaGVyIC0tIGhlbmNlLCB3ZSBoYXZlIG9wdGVkIHRvIHVzZSBhIGJhcnBsb3Qgd2hpY2ggc2hvd3MgdGhlIG1vc3QgcGVydGluZW50IGZpbmRpbmdzIHdoaWxlIGxlYXZpbmcgdGhlIGV4YWN0IHNhbXBsZSBtYXBwaW5nIGluIFN1cHBsZW1lbnRhbCBUYWJsZSBYLiAKCioqUTogTWF5IHdhbnQgdG8gY29uc2lkZXIgYWRkaXRpb25hbCBkZXNjcmlwdG9ycyB0byBjbGFyaWZ5IHRoZSBwcmltYXJ5IG9ic2VydmF0aW9ucy4qKgoKSSdtIHVuY2xlYXIgb24gd2hhdCBkZXNjcmlwdG9ycyB0aGUgcmV2aWV3ZXIgY291bGQgYmUgcmVmZXJyaW5nIHRvIC0tIGlkZWFzPyAKCiMjIyBDb21tZW50IDMKCioqUTogSXQgaXMgaW1wZXJhdGl2ZSB0aGF0IHRoZSBhdXRob3JzIGNvbmZpcm0gdGhhdCB0aGUgY2xvbmFsIG1lYXN1cmVzIHdlcmUgbm90IGFmZmVjdGVkIGJ5IHR1bW9yIHB1cml0eS4qKgoKVHVtb3VyIHB1cml0eSBhbmQgSVRIIChmb3IgdGhlIDMgY2xvbmFsIG1lYXN1cmVzKSBkbyBub3QgY29ycmVsYXRlIC0tIHJlZmVyIHRvIHRoZSBzdXBwbGVtZW50YWwgZmlndXJlIGFuZCBhY2NvbXBhbnlpbmcgdGV4dC4gVGhlIDR0aCBtZWFzdXJlIC0tIHN1YmNsb25hbCBDTiBwcm9wb3J0aW9uIC0tIGNvcnJlbGF0ZXMgd2l0aCB0dW1vdXIgcHVyaXR5LCBsaWtlbHkgYmVjYXVzZSBDTiBlc3RpbWF0ZXMgYXJlIGxlc3Mgc3RhYmxlIGZvciBzYW1wbGVzIHdpdGggbG93IHB1cml0eSAocmVmcz8pLiBUaGVyZWZvcmUsIG5vbi1pbnRlZ2VyIENOIGNhbGxzIG1heSBiZSBtb3JlIGxpa2VseSBpbiB0dW1vdXJzIHdpdGggbG93IHB1cml0eS4gVGhlIG90aGVyIDMgbWVhc3VyZXMgYWNjb3VudCBmb3IgdGhpcyAtLSBpbiBjbG9uYWwgaW5mZXJlbmNlLCBtdXRhdGlvbiBjbHVzdGVycyB3aXRoIHVuc3RhYmxlIHN1YmNsb25hbCBDTiBzdGF0dXMgYXJlIGZpbHRlcmVkIG91dCAocmVmZXIgdG8gYXBwcm9wcmlhdGUgc2VjdGlvbiBvZiBtZXRob2RzKS4KQ2FuIGFyZ3VlIHRoYXQgZW50cm9weSBpcyBtaW5pbWFsbHkgYWZmZWN0ZWQgYnkgc2VxdWVuY2luZyBkZXB0aCB0b28gLS0gdmVyeSByYXJlIG11dGF0aW9ucyB0aGF0IGFyZSBtaXNzZWQgZHVlIHRvIHNlcXVlbmNpbmcgZGVwdGggKHdoaWNoIGlzIGFscmVhZHkgPjEwMDAwWCwgc28gdGFraW5nIG91ciBsb3dlc3QgdHVtb3VyIHB1cml0eSBvZiB+MjAlIHRoYXTigJlzIGFuIGVmZmVjdGl2ZSBzZXEgZGVwdGggb2YgMjAwMFgpIC0tIHdpbGwgbm90IGFmZmVjdCB0aGUgZW50cm9weSBzdGF0aXN0aWMgc3Vic3RhbnRpYWxseSBhcyB0aGF04oCZcyBwdXJlbHkgYmFzZWQgb24gdGhlIHNpemVzIG9mIGNsb25lcy4gVGhlIHByZXNlbmNlL2Fic2VuY2Ugb2YgYSBjbG9uZSBwcmVzZW50IGF0IDwxJSBoYXMgdmlydHVhbGx5IG5vIGVmZmVjdCBvbiBlbnRyb3B5LiAKCk5ldmVydGhlbGVzcywgd2UgY2FuIGFnYWluIHJlc3BvbmQgdG8gdGhpcy4gTGV0J3MgZG8gdGhpcyBieSB0YWtpbmcgb3VyIHRhcmdldGVkIHNlcXVlbmNpbmcgZGF0YSwgYW5kIGVtcGlyaWNhbGx5IGdlbmVyYXRpbmcgbG93ZXIgcHVyaXR5IHNhbXBsZXMgZnJvbSBpdCAod2UnZCBoYXZlIHRvIGRvIHRoaXMgYXQgdGhlIGFsdC9yZWYgY291bnQgbGV2ZWwpLiBUaGVuLCB3ZSBjYW4gcmVydW4gYWxsIHRoZSBwcm9jZXNzaW5nIHBpcGVsaW5lcywgaW5mZXIgZWFjaCBvbmUgb2YgdGhlIG1lYXN1cmVzLCBhbmQgZG8gdGhlIGNvbXBhcmlzb24uIAoKKipROiBUaGUgYWZmZWN0IG9mIHR1bW9yIG11dGF0aW9uIGFsbGVsZSBmcmFjdGlvbiBkaXZlcnNpdHkgYXMgYSBmdW5jdGlvbiBvZiBjYW5jZXIgY2VsbCBwdXJpdHkgc2hvdWxkIGJlIG1vZGVsZWQgYW5kIHRoZSBzZW5zaXRpdml0eSB0byBkZXRlY3QgdGhlIG11dGF0aW9ucyBhcyBhIGZ1bmN0aW9uIG9mIHNlcXVlbmNpbmcgZGVwdGggc2hvd24uKioKCkRvIHRoaXMsIEkgc3VwcG9zZSAuLi4KClRoZSBsYXN0IHBhcnQgaXMga2luZCBvZiBvdXQtb2Ytc2NvcGUgc2luY2UgdGhhdCBxdWVzdGlvbiBpcyBhYm91dCBwdWJsaXNoZWQgbXV0YXRpb24gY2FsbGVycyAoTXV0YXRpb25TZXEgYW5kIFN0cmVsa2EpIHJhdGhlciB0aGFuIGEgbWV0aG9kIHNwZWNpZmljIHRvIG91ciBwYXBlci4gQnV0IHdlJ2xsIGRvIGl0IGFueXdheXMuCgpbU2VxdWVuY2luZyBkZXB0aCwgY2VsbHVsYXJpdHksIGFuZCBtdXRhdGlvbiBkZXRlY3Rpb25dKGByIG5vdGVib29rX3JlbGF0aXZlX3BhdGhzJGNlbGx1bGFyaXR5X2RlcHRoYCkKCiMjIyBDb21tZW50IDQKCioqUTogUGFnZSA3LiBUaGUgYXV0aG9ycyBkbyBub3QgY29uc2lkZXIgdGhlIGV4cHJlc3Npb24gb2YgaW1tdW5lIGNoZWNrcG9pbnQgbW9sZWN1bGVzIG9yIGdlbmUgZXhwcmVzc2lvbiBwcm9ncmFtcyB0aGF0IGNvdWxkIGJlIHByZXZlbnRpbmcgaW1tdW5vZWRpdGluZy4gVGhpcyBtYXkgY29uZm91bmQgdGhlIGFuYWx5c2lzIHJlbGF0aW5nIGludHJhdHVtb3JhbCBoZXRlcm9nZW5laXR5IGFuZCBUSUwgZGVuc2l0eS4gVGhlIGF1dGhvcnMgbmVlZCB0byBleGFtaW5lIHRoZXNlIGZhY3RvcnMuKioKClRoaXMgaXMgYSB2YWxpZCBwb2ludC4gSG93ZXZlciwgdGhlIGFjdGl2aXR5IG9mIHRoZXNlIHByb2dyYW1zIGRvZXMgbm90IHJ1bGUgb3V0IHRoZSBwb3NzaWJpbGl0eSB0aGF0IGltbXVub2VkaXRpbmcgaGFzIG9jY3VycmVkLiBJbW11bm9lZGl0aW5nIGhhdmUgb2NjdXJyZWQgaW4gdGhlIHBhc3QgYW5kIGxlZnQgZ2Vub21pYyBtYXJrcyBvbiB0aGUgdHVtb3VyIC0tIGUuZy4gc3ViY2xvbmFsIG5lb2VwaXRvcGUgZGVwbGV0aW9uIGFuZCBsb3dlciBJVEguIEdlbm9taWMgZGl2ZXJzaXR5L0lUSCBtYXkgaGF2ZSBub3QgcmVjb3ZlcmVkIGZyb20gdGhlIHRpbWUgc2luY2UgYSBwYXN0IGJvdHRsZW5lY2suIEV2ZW4gaWYgZXhoYXVzdGlvbi9pbW11bmUgc3VwcHJlc3NpdmUgcHJvZ3JhbXMgd2VyZSBhY3RpdmUgYXQgdGhlIHRpbWUgb2Ygc3VyZ2VyeS9leHByZXNzaW9uIHByb2ZpbGluZywgdGhpcyBkb2VzIG5vdCBydWxlIG91dCB0aGUgcG9zc2liaWxpdHkgdGhhdCB0aGUgaW1tdW5lIHN5c3RlbSB3YXMgYWN0aXZlbHkgZWRpdGluZyB0aGUgdHVtb3VyIHNvbWV0aW1lIGR1cmluZyB0aGUgdHVtb3VyJ3MgaGlzdG9yeS4gCgpBZGRpdGlvbmFsbHksIGl0IGlzIHdlbGwga25vd24gdGhhdCBjZXJ0YWluIGltbXVuZSBjaGVja3BvaW50IG1hcmtlcnMsIGxpa2UgUEQxLCBhcmUgZW5yaWNoZWQgaW4gVElMIHBvcHVsYXRpb25zIGluIEhHU0MgYW5kIG90aGVyIGNhbmNlcnMgKHJlZjogdG8gUm9zZW5iZXJnIG1lbGFub21hIHBhcGVyLCBhbmQgdG8gQnJhZCdzIHZhcmlvdXMgSEdTQyBwYXBlcnMgKyBvdGhlciBwYXBlcnMgaW4gSEdTQykuIERlc3BpdGUgdGhpcywgdGhlIHByZXNlbmNlIG9mIFBEMSsgVElMIGlzIGFzc29jaWF0ZWQgd2l0aCBzdXBlcmlvciBvdXRjb21lcyBpbiBIR1NDLiBOZW9hbnRpZ2VuIHJlYWN0aXZpdHkgaGFzIGJlZW4gZWxpY2l0ZWQgaW4gUEQxKyBUSUwgcG9wdWxhdGlvbnMgKHJlZnM/IEJyYWQ/KS4gCgpOZXZlcnRoZWxlc3MsIHdlJ2xsIGxvb2sgYXQgdGhpcy4gQWx0aG91Z2ggb25seSBleHByZXNzaW9uIGlzIHJlcXVlc3RlZCwgd2UgaW5jbHVkZSBib3RoICptdXRhdGlvbiogKHBvaW50IG11dGF0aW9uIGFuZCBDTlYpIGFuZCAqZXhwcmVzc2lvbiogYW5hbHlzZXMgdG8gYWRkcmVzcyB0aGlzIHBvaW50LiAKCltNdXRhdGlvbiBhbmQgZXhwcmVzc2lvbiBhbmFseXNpcyBvZiBpbW11bmUgY2hlY2twb2ludCBtb2xlY3VsZXMvb3RoZXIgcmVsZXZhbnQgcGF0aHdheXNdKGByIG5vdGVib29rX3JlbGF0aXZlX3BhdGhzJHBhdGh3YXlzX2ltbXVub2VkaXRpbmdgKQoKIyMjIENvbW1lbnQgNQoKKipROiBXaHkgYXJlIGNsb25hbCBuZW9lcGl0b3BlcyBub3QgdGFyZ2V0ZWQ/IFRoaXMgaXMgaGFyZCB0byByYXRpb25hbGl6ZS4qKgoKV2UgYWNrbm93bGVkZ2UgdGhhdCBvdXIgZXhwbGFuYXRpb24gbWF5IG5vdCBoYXZlIGJlZW4gZW50aXJlbHkgY2xlYXIuIFdlJ2QgbGlrZSB0byBlbXBoYXNpemU6CgoqIExhY2sgb2YgZGVwbGV0aW9uIChldmlkZW5jZSBvZiBlbGltaW5hdGlvbikgZG9lcyBub3QgaW1wbHkgbGFjayBvZiB0YXJnZXRpbmcuIEZvciBleGFtcGxlLCBpbiBfX19fIGNhbmNlcnMgKGVuZG9tZXRyaWFsIFBPTEU/IENoZWNrIHRvIG1ha2Ugc3VyZS4pIG5lb2VwaXRvcGVzIGFyZSBub3QgZGVwbGV0ZWQsIGRlc3BpdGUgZXh0ZW5zaXZlIFRJTCBpbmZpbHRyYXRlIChzb3VyY2UpIGFuZCBldmlkZW5jZSBvZiBuZW9hbnRpZ2VuIHJlYWN0aXZpdHkgaW4gdGhlc2UgY2FuY2VycyAoY2hlY2sgc291cmNlKS4gSW4gb3VyIGNvaG9ydCwgY2xvbmFsIG5lb2VwaXRvcGVzIG1heSBiZSB0YXJnZXRlZCwgYnV0IG5vdCBzdWJqZWN0IHRvIGRlcGxldGlvbi4gVGhlIE1jR3JhbmFoYW4gZXQgYWwuIGFuYWx5c2lzIG9mIGNsb25hbCBuZW9lcGl0b3BlcyBpbiBsdW5nIGFkZW5vY2FyY2lub21hIGFuZCBzcXVhbW91cyBjZWxsIGNhcmNpbm9tYSBvbmx5IHJlZmVycyB0byB0YXJnZXRpbmcsIG5vdCBkZXBsZXRpb24uIAoqIFRoZSBjb3JyZXNwb25kaW5nIGxvdyBsZXZlbHMgb2YgSVRIIGluIEVTLVRJTCBzYW1wbGVzLCB0b2dldGhlciB3aXRoIGV2aWRlbmNlIG9mIHN1YmNsb25hbCBuZW9lcGl0b3BlIGVsaW1pbmF0aW9uLCBpbXBsaWVzIHRoYXQgdGhlIG1lY2hhbmlzbSBvZiBuZW9lcGl0b3BlIGRlcGxldGlvbiBtYXkgYmUgY2xvbmFsIGxvc3MuIFRoaXMgY2Fubm90IGJlIHByb3ZlbiB3aXRoIHRoZSBhdmFpbGFibGUgZGF0YSwgYnV0IGlmIGEgc2ltaWxhciBtZWNoYW5pc20gd2VyZSB0byBleGlzdCBmb3IgY2xvbmFsIG5lb2VwaXRvcGVzLCBpdCB3b3VsZCByZXN1bHQgaW4gdGhlIGxvc3Mgb2YgYWxsIHR1bW91ci4gVGhlcmVmb3JlLCBpdCBpcyBhbHNvIHBvc3NpYmxlIHRoYXQgY2xvbmFsIG5lb2VwaXRvcGUgZWxpbWluYXRpb24gb2NjdXJzLCBidXQgdGhvc2UgY2FzZXMgbmV2ZXIgcmVhY2ggdGhlIHRocmVzaG9sZCBmb3IgY2xpbmljYWwgZGV0ZWN0aW9uL2luY2x1c2lvbiBpbiBvdXIgbXVsdGktc2l0ZSBjb2hvcnQuIAoqIFdoaWxlIHdlIG9ubHkgaGF2ZSB0aGUgZGF0YSBhbmQgcmF3IG1hdGVyaWFscyB0byBleHBsb3JlIHRoZSBnZW5vbWljcyBvZiBuZW9lcGl0b3BlIGRlcGxldGlvbiwgaXQgaXMgYWxzbyBwb3NzaWJsZSB0aGF0IGRlcGxldGlvbiBvY2N1cnMgYXQgdGhlIHRyYW5zY3JpcHRvbWljIGxldmVsIGZvciBib3RoIGNsb25hbCBhbmQgc3ViY2xvbmFsIG5lb2VwaXRvcGVzLiAKClRvIGFkZHJlc3MgdGhpcyB3ZSBoYXZlIGFkZGVkIC4uLgoKKipROiBXaGF0IGNvdWxkIHByZXZlbnQgY2xvbmFsIG5lb2VwaXRvcGVzIGJ1dCBub3Qgc3ViY2xvbmFsIG9uZXMgZnJvbSBiZWluZyBpbW11bm9lZGl0ZWQuIFdoYXQgY291bGQgYmUgYSByYXRpb25hbGUgYmFzaXMgYmVoaW5kIHRoaXMgaW50ZXJwcmV0YXRpb24gb2YgdGhlIGRhdGE/KioKCkFzaWRlIGZyb20gdGhlIGZhY3QgdGhhdCBlZGl0aW5nIG9mIGNsb25hbCBuZW9lcGl0b3BlcyBjb3VsZCByZXN1bHQgaW4gdGhlIGVsaW1pbmF0aW9uIG9mIHRoZSBlbnRpcmUgdHVtb3VyOyB0aGVzZSBjbG9uYWwgZXBpdG9wZXMgbWF5IGFsc28gYmUgZWRpdGVkIGF0IG90aGVyIGxldmVscyAoZS5nLiBlcGlnZW5ldGljLCB3aGljaCBjb3VsZCBiZSBzaG93biBpbiB0cmFuc2NyaXB0b21lcyBpZiB0aGVzZSB3ZXJlIGF2YWlsYWJsZSkuIFRoZSBJVEgtVElMIGFuZCBzdWJjbG9uYWwgbmVvZXBpdG9wZSBhbmFseXNpcyBpbXBsaWVzIHRoYXQgdHVtb3VyIGNsb25lcyBhcmUgZWxpbWluYXRlZCBpbiBFUy1USUwgc2FtcGxlcyAoaGVuY2UsIHRoZWlyIGFzc29jaWF0ZWQgbmVvYW50aWdlbnMgYXJlIGdlbm9taWNhbGx5IGVyYWRpY2F0ZWQpOyBvdGhlciBtZWNoYW5pc21zIG1heSBiZSBkb21pbmFudCBmb3IgY2xvbmFsIG5lb2VwaXRvcGVzLiAKVG8gcHV0IHRoaXMgY29nZW50bHkgLS0gb3VyIG1ldGhvZHMgYXJlIGFibGUgdG8gaW5mZXIgKmdlbm9taWMqIGVsaW1pbmF0aW9uIG9mIG5lb2VwaXRvcGVzLiBJZiBnZW5vbWljIGVsaW1pbmF0aW9uIG9mIGEgbmVvZXBpdG9wZSBpcyBjb21wbGV0ZSwgYnkgZGVmaW5pdGlvbiB0aGUgdHVtb3VyIHBvcHVsYXRpb25zIGRlZmluZWQgYnkgdGhhdCBhbnRpZ2VuIGlzIGNvbXBsZXRlbHkgZXJhZGljYXRlZC4gSWYgdGhpcyB3ZXJlIHRvIGhhcHBlbiB0byBhIGNsb25hbCBuZW9hbnRpZ2VuLCB0aGUgYXNzb2NpYXRlZCBwb3B1bGF0aW9ucyAtLSBpLmUuIGFsbCB0dW1vdXIgY2VsbHMgLS0gd291bGQgYmUgZWxpbWluYXRlZDsgb3IgYSBtaW5vciBwb3B1bGF0aW9uIHdpdGhvdXQgdGhlIGFudGlnZW4gY291bGQgZW1lcmdlLCBidXQgdGhlbiBieSBkZWZpbml0aW9uIHRoZSBhbnRpZ2VuIHdvdWxkIG5vIGxvbmdlciBiZSBjbG9uYWwuIE90aGVyIG1ldGhvZHMgb2YgZWxpbWluYXRpb24sIGkuZS4gYXQgdGhlIHRyYW5zY3JpcHRvbWljIGxldmVsLCBtYXkgYXBwbHkgdG8gY2xvbmFsIG5lb2VwaXRvcGVzLCBidXQgdGhpcyBpcyBub3QgcG9zc2libGUgdG8gYXNzZXNzIHdpdGggb3VyIGRhdGEuIApDaGVjayB3aGV0aGVyIE1jR3JhbmFoYW4gZXQgYWwuIGxvb2tlZCBhdCB0cmFuc2NyaXB0b21pYyBsZXZlbCAmIEppbWVuZXotU2FuY2hleuKAmXMgZmluZGluZyB3aXRoIGNsb25hbCBuZW9lcGl0b3Blcy4gCgojIyMgQ29tbWVudCA2CgoqKlE6IFRoZSBhdXRob3JzIGNsYWltIHRoYXQgc3ViY2xvbmFsIGJ1dCBub3QgY2xvbmFsIG5lb2VwaXRvcGVzIGFyZSB0YXJnZXRlZCBieSBUIGNlbGxzLiBUaGUgYXV0aG9ycyBuZWVkIHRvIHZhbGlkYXRlIHRoYXQgdGhpcyBpcyB0aGUgY2FzZSBhcyBpdCBnb2VzIGFnYWluc3QgcHJldmlvdXNseSBwdWJsaXNoZWQgcmVzdWx0cyBieSB0aGUgU3dhbnRvbiBncm91cCAoTWNHcmFoYW4gZXQgYWwgU2NpZW5jZSkuIFRoZSBsYXR0ZXIgdmFsaWRhdGVkIFQgY2VsbCByZWFjdGl2aXR54oCmIFRoZSBhdXRob3JzIGhlcmUgc2hvdWxkIGFzIHdlbGzigKZ0aGV5IG5lZWQgdG8gYnV0IGRvIG5vdCBzaG93IHRoZSBwcmVzZW5jZSBvZiBUIGNlbGwgcmVhY3Rpdml0eSBhZ2FpbnN0IHRoZSBpbW11bm9lZGl0ZWQgbmVvYW50aWdlbnMuIFdpdGhvdXQgdGhpcywgdGhlIGludGVycHJldGF0aW9uIGlzIG5vdCBhZGVxdWF0ZWx5IHN1cHBvcnRlZC4qKgoKQ2xhcmlmeSBjbGFpbSBhYm91dCBjbG9uYWwgbmVvZXBpdG9wZSB0YXJnZXRpbmcuIFdlIGRvIG5vdCBzdGF0ZSAtLSBhbmQgZG8gbm90IG1lYW4gdG8gaW1wbHkgLS0gdGhhdCBjbG9uYWwgbmVvZXBpdG9wZXMgY2Fubm90IGJlIHRhcmdldGVkLCBzZWUgYmVsb3cuIEknbSBub3Qgc3VyZSBob3cgdGhpcyByZXZpZXdlciBtYWRlIHRoZSBsZWFwIHRvIHRoYXQuIEFkZGl0aW9uYWxseSwgZWxpbWluYXRpb24gbWF5IGJlIG9jY3VycmluZyBhdCB0aGUgdHJhbnNjcmlwdG9taWMgbGV2ZWwgZm9yIHNvbWUgbmVvZXBpdG9wZXMuIAoKQWRkaXRpb25hbGx5OiBOaWNreeKAmXMgcGFwZXIgKExPSEhMQSkgc2hvd3MgKEZpZyA0KSB0aGF0IHN1YmNsb25hbCBuZW9hbnRpZ2VucyBhc3NvYy4gdy8gbG9zdCBhbGxlbGUgYXJlIGVsaW1pbmF0ZWQgaW4gTE9ISExBIGV2ZW50cywgaW1wbHlpbmcgdGhhdCBpbmRlZWQsIHN1YmNsb25hbCBuZW9lcGl0b3BlIGVsaW1pbmF0aW9uIERPRVMgaGFwcGVuLCBpbiByZWJ1dHRhbCB0byByZXZpZXdlciAxLiAqKlRPIFJFQUQqKiB0aGlzIHBhcnQgb2YgTmlja3kncyBwYXBlciBhZ2FpbiBhbmQgc2VlIHdoYXQgdGhleSBzYXkgYWJvdXQgY2xvbmFsIG5lb2FudGlnZW5zLiAKCkV4cGVyaW1lbnRhbCB2YWxpZGF0aW9uIHdpbGwgY29tZSBpbiBoZXJlIGFuZCBDb21tZW50IDUuIAoKIyMjIENvbW1lbnQgNwoKKipROiBBc2lkZSBmcm9tIHRoZSBwb2ludCBhYm92ZSwgaXQgd291bGQgYmUgYmVuZWZpY2lhbCB0byByZXN0cnVjdHVyZSB0aGUgZGF0YSBwcmVzZW50YXRpb24gc28gaXQgaXMgbW9yZSBmb2N1c2VzLCBsZXNzIHB1cmVseSBkZXNjcmlwdGl2ZSwgYW5kIG1vcmUgY29oZXJlbnQuIEFzIHdyaXR0ZW4sIHRoZSBwYXBlciByYW1ibGVzLiBTdWdnZXN0IHJld29ya2luZyB0byBwcmVzZW50IHRoZSBtYWpvciBmaW5kaW5ncyBpbiBhIG1vcmUgY29nZW50IG1hbm5lciwqKgoKR2V0IHJpZCBvZiBtdXRhdGlvbmFsIHNpZ25hdHVyZXMgcGFwZXIgLS0gYW5kIHRoaW5rIGFib3V0IGhvdyB0byByZXN0cnVjdHVyZT8gCgojIyMgQ29tbWVudCA4CgoqKlE6IEZpZyAzIHBhbmVsIEEgYW5kIEIgYXJlIGNvbXBsZXggdG8gdGhlIHBvaW50IG9mIGJlaW5nIG5vdCB1c2VmdWwuIFRoZSBhdXRob3JzIHNob3VsZCBzdHJpdmUgdG8gY29tbXVuaWNhdGUgdGhlc2UgcG9pbnRzIGluIGEgbW9yZSBjb2hlcmVudCBtYW5uZXIuKioKClJlbW92ZSBhbmQgcmVwbGFjZSB3aXRoIHNvbWUgb3RoZXIgZmlndXJlLiBBcyBpdCBzdGFuZHMsIHRvZ2V0aGVyIHdpdGggUmV2aWV3ZXIgMydzIGNvbW1lbnRzIEZpZ3VyZSAzIGlzIGdvaW5nIHRvIGJlIFZFUlkgY3Jvd2RlZC4gCgojIyMgQ29tbWVudCA5CgoqKlE6IEl0IGlzIHVuY2xlYXIgd2h5IEIgYW5kIFQgY2VsbCBzcGF0aWFsIGFzc29jaWF0aW9ucyBhcmUgbWVhbmluZ2Z1bC4gQXJlIHRoZSBCIGNlbGxzIGFjdGl2YXRlZCBpbiBhcmVhcyB3aGVyZSBhY3RpdmUgQ0Q0KyBUIGNlbGxzIGNvbmdyZWdhdGUgKGFuZCBub3QgZXhoYXVzdGVkIFQgY2VsbHMgb3IgVCByZWdzKT8gVGhlIGF1dGhvcnMgc2hvdWxkIGRlc2NyaWJlIHRoaXMuKioKCj8/PyBUaGUgbGFjayBvZiBhY2tub3dsZWRnZW1lbnQgYWJvdXQgdGhlIHJlbGF0aW9uc2hpcCBzaG93aW5nIGhvdyBULSwgYnV0IG5vdCBCIGNlbGxzIHRyYWNrIHdpdGggdHVtb3VyIGNsb25lcyBhY3Jvc3Mgc3BhY2UgaW4gdGhlIGdlbmVyYWwgY29tbWVudHMgYW5kIG90aGVyIGNvbW1lbnRzIGdpdmVuIGJ5IHRoaXMgcmV2aWV3ZXIgbGVhZHMgbWUgdG8gYmVsaWV2ZSB0aGF0IHRoZXkgZGlkIG5vdCBmdWxseSBhcHByZWNpYXRlIHRoZSBzaWduaWZpY2FuY2Ugb2YgdGhpcyBmaW5kaW5nLiBJZiBUIGNlbGxzIGFyZSBhYmxlIHRvIHRyYWNrIHdpdGggc3BlY2lmaWMgdHVtb3VyIGNsb25lcyBhY3Jvc3Mgc3BhY2UsIHRoYXQgc3RyZW5ndGhlbnMgdGhlIGV2aWRlbmNlIGZvciB0aGUgZXhpc3RlbmNlIG9mIGNsb25lLXNwZWNpZmljIHRhcmdldGluZy9lbGltaW5hdGlvbiBpbiBIR1NDLiAKCiMjIyBDb21tZW50IDEwCgoqKlE6IFRoZSBhdXRob3JzIHNob3VsZCBzdGFpbiB0aGVpciBwYXRoIHNwZWNpbWVucyB3aXRoIGRleHRyYW1lcnMgdG8gdmFsaWRhdGUgdGhlIGxvY2FsaWNhdGlvbiBhbmQgY2x1c3RlcmluZyBvZiBUIGNlbGwgY2xvbm90eXBlcy4gQXQgbGVhc3QgYSBmZXcgc2hvdWxkIGJlIHZhbGlkYXRlZC4qKgoKPz8gVG8gdmFsaWRhdGUgdGhhdCBwYXJ0aWN1bGFyIFQtY2VsbCBjbG9ub3R5cGVzIGNsdXN0ZXIgd2l0aCBlYWNoIG90aGVyPyBUaGlzIHNlZW1zIG91dCBvZiBzY29wZSBhbmQgd291bGQgYmUgYmV0dGVyIHN1aXRlZCBmb3IgYSBzdHVkeSBsb29raW5nIGF0IHRoZSBtaWNyb3Njb3BpYyByZWxhdGlvbnNoaXBzIGJldHdlZW4gdHVtb3VyIGNsb25lcyBhbmQgVC1jZWxsIGNsb25vdHlwZXMuIEFsc28sIGFzc2Vzc2luZyBjbHVzdGVyaW5nIG9mIHRob3NlIGNsb25vdHlwZXMgd291bGQgcmVxdWlyZSBrbm93bGVkZ2Ugb2YgdGhlaXIgY2xvbm90eXBlLXNwZWNpZmljIGFudGlnZW5zLCB3aGljaCB3ZSBkbyBub3QgaGF2ZS4gCgpBcmd1ZSBiYWNrIG9uIHRoaXMgb25lLiAKCiMjIyBDb21tZW50IDExCgoqKlE6IFRoZSBhdXRob3JzIHNob3VsZCBwcm92aWRlIGEgbW9yZSBkZXRhaWxlZCBjb21wYXJpc29uIHRvIHRoZSByZXN1bHRzIG9mIFJvb25leSBldCBhbC4gKEhhY29oZW4gZ3JvdXApLioqCgpUaGlzIGlzIGEgZ29vZCBwb2ludCBhbmQgb2YgaW50ZXJlc3QgZm9yIGFkZHJlc3NpbmcgdGhlIHF1ZXN0aW9uIG9mIHdoYXQgZGV0ZXJtaW5lcyB0aGUgbGV2ZWwgb2YgVElMIGluZmlsdHJhdGUvZXhwcmVzc2lvbiB3aXRoaW4gZWFjaCB0dW1vdXIuIFdlIGlkZW50aWZ5IDIgcXVlc3Rpb25zIG9mIGludGVyZXN0IGhlcmU6ICgxKSB1bmRlcnN0YW5kaW5nIHRoZSBkZXRlcm1pbmFudHMgb2YgaW1tdW5lIGFjdGl2aXR5IGFjcm9zcyB0aGUgY29ob3J0OyBhbmQgKDIpIHdpdGhpbiBwYXRpZW50cyAoYXMgd2UgcHJvdmlkZSB0aGUgZmlyc3QgZXZpZGVuY2Ugb2YgZXh0ZW5zaXZlIGltbXVuZSBpbmZpbHRyYXRpb24gaW4gYSBIR1NDIGNvaG9ydCBvZiB0aGlzIHNpemUgKyBleHRlbnNpdml0eSBpbiBzYW1wbGluZykuIAoKVG8gYWRkcmVzcyB0aGlzLCB3ZSBoYXZlIHJlcGVhdGVkIHRoZSBhbmFseXNpcyBvZiBSb29uZXkgZXQgYWwuIChtb2RlbGluZyB0aGUgYXNzb2NpYXRpb24gYmV0d2VlbiBTTlZzL0NOVnMgYW5kIGN5dG90b3hpY2l0eSBleHByZXNzaW9uIHNpZ25hdHVyZSkgb24gb3VyIGRhdGEuIFVzaW5nIHRoZWlyIGFuYWx5c2lzIG1ldGhvZHMgZm9yIGFjcm9zcy1jb2hvcnQgY29tcGFyaXNvbnMsIGFuZCBhZGRpbmcgcGF0aWVudCBhcyBhIHJhbmRvbSBlZmZlY3QgZm9yIHdpdGhpbi1wYXRpZW50IGNvbXBhcmlzb24sIHdlIHNob3cgdGhhdCAuLi4KCltSb29uZXkgY29tcGFyaXNvbjogSW1tdW5lIGFzc29jaWF0aW9uIGFuZCBuZW9lcGl0b3BlIGVsaW1pbmF0aW9uXShgciBub3RlYm9va19yZWxhdGl2ZV9wYXRocyRyb29uZXlfY29tcGFyaXNvbmApCgoqKlE6IERvIHRoZSBhc3NvY2F0aW9ucyB3aXRoIEVTLVRJTCBncm91cHMgdmFsaWRhdGUgYWNyb3NzIG90aGVyIGNhbmNlciB0eXBlcz8qKgoKV2hpbGUgd2UgYXBwcmVjaWF0ZSB0aGF0IHRoZSBhbnN3ZXIgdG8gdGhpcyBxdWVzdGlvbiBpcyBvZiBpbnRlcmVzdCBpbiBvdGhlciBjYW5jZXIgdHlwZXMsIHdlIGJlbGlldmUgdGhhdCBpdCBpcyBvdXQgb2Ygc2NvcGUgZm9yIHRoaXMgbWFudXNjcmlwdCwgd2hpY2ggb25seSBjYXB0dXJlcyBIR1NDLiAKCkFuIGludmVzdGlnYXRpb24gb2YgdGhlIGFzc29jaWF0aW9ucyB3aXRoIEVTLVRJTCBncm91cHMgaW4gb3RoZXIgY2FuY2VyIHR5cGVzIHdvdWxkIHJlcXVpcmUgKDEpIGlkZW50aWZpY2F0aW9uIG9mIE4vUy9FUy1USUwgZ3JvdXBzIGluIG90aGVyIGNhbmNlciB0eXBlczsgYW5kICgyKSByb2J1c3QgbWFsaWduYW50IGNsb25hbCBtZWFzdXJlbWVudHMuIE90aGVyIGdyb3VwcyBoYXZlIGZvdW5kIGV2aWRlbmNlIG9mICgxKSAtLSBmb3IgZXhhbXBsZSwgTW9yYWcgUGFyaydzIGdyb3VwIGZyb20gTWNHaWxsIGhhcyBkaXNjb3ZlcmVkIGFuYWxvZ291cyBncm91cHMgaW4gYnJlYXN0IGNhbmNlciwgYnV0IGFjY3VyYXRlIGRldGVybWluYXRpb24gb2YgKDIpIGRlbWFuZHMgbXVsdGktc2l0ZSBjYXNlcyB0byByZXNvbHZlIGNsb25hbCBvdmVybGFwLiAKCgojIyBSZXZpZXdlciAyCgpaaGFuZyBldCBhbCBjaGFyYWN0ZXJpemVkIHRoZSBpbnRlcnBsYXkgYmV0d2VlbiB0dW1vci1pbmZpbHRyYXRpbmcgbHltcGhvY3l0ZXMgKFRJTCkgYW5kIGNhbmNlciBjZWxscyBpbiAxNDMgc2FtcGxlcyBmcm9tIDIxIHBhdGllbnRzIChhIG11bHRpLXJlZ2lvbiBjb2hvcnQgc3R1ZHkpIGJ5IGVzdGFibGlzaGluZyBhIG11bHRpLW1vZGFsIGRhdGEgY29uc2lzdGluZyBvZiB3aG9sZS1nZW5vbWUgc2VxdWVuY2luZywgaW1tdW5vaGlzdG9jaG1pc3RyeSwgaGlzdG9sb2dpYyBpbWFnZSBhbmFseXNpcywgKG5hbm9zdHJpbmcpIGdlbmUgZXhwcmVzc2lvbiBwcm9maWxpbmcsIGFuZCBUL0IgY2VsbCByZWNlcHRvciBzZXF1ZW5jaW5nLiBUaGlzIGhpZ2hseSBkaXZlcnNlIGFuZCBjdXR0aW5nIGVkZ2UgZGF0YXNldCBpcyBjb21iaW5lZCB3aXRoIGluc2lnaHRmdWwgYW5hbHlzZXMgYnkgYW4gZXhwZXJ0IHRlYW0gb2YgYXV0aG9ycyB3aGljaCByZXN1bHRzIGluIGNvbmNsdXNpb25zIHRoYXQgYXBwZWFyIGp1c3RpZmllZC4gVGhlIG1ham9yIGhpZ2hsaWdodCBvZiB0aGUgcmVzdWx0cyBhcmUgdGhlIGRlc2NyaXB0aW9uIG9mIGNvdXBsZWQgZXZvbHV0aW9uYXJ5IGR5bmFtaWNzIGJldHdlZW4gaW1tdW5lIGFuZCBtYWxpZ25hbnQgcG9wdWxhdGlvbnMuIE1vcmUgc3BlY2lmaWNhbGx5LCB0aGV5IGZpbmQgdGhhdCBhIHJlbGF0aXZlIGRlcGxldGlvbiBvZiBzdWJjbG9uYWwgbmVvZXBpdG9wZXMgdG8gYmUgYXNzb2NpYXRlZCB3aXRoIHRoZSBwcmVzZW5jZSBvZiBDRDgrIGNlbGxzIGFuZCBjb25jbHVkZSB0aGF0IGltbXVuZSBpbmZpbHRyYXRlcyBtYXkgcGVyZm9ybSBwdXJpZnlpbmcgc2VsZWN0aW9uIHRvIHNoYXBlIHBhdHRlcm5zIG9mIGNhbmNlciBjZWxsIGNvbXBsZXhpdHkuIFRoaXMgaXMgYSBoaWdobHkgaW50ZXJlc3RpbmcgcmVzdWx0IGFuZCBoYXMgc2lnbmlmaWNhbnQgaW1wbGljYXRpb25zIGZvciBvdXIgdW5kZXJzdGFuZGluZyBvZiB0aGUgaW50ZXJwbGF5IGJldHdlZW4gdHVtb3IgY2VsbHMgYW5kIHRoZWlyIGVudmlyb25tZW50LgoKKkFsbGVuJ3MgaW1wcmVzc2lvbio6IFRoaXMgcmV2aWV3ZXIgYXBwZWFycyB0byBiZSB2ZXJ5IHBvc2l0aXZlIGFib3V0IHRoZSBzdHVkeSAtLSB3aXRoIG5vIHJlc2VydmF0aW9ucyBpZGVudGlmaWVkIGluIHRoZSBzdW1tYXJ5IHBhcmFncmFwaCBhYm92ZS4gQWRkaXRpb25hbGx5LCB0aGUgcmV2aWV3ZXIgYXBwZWFycyB0byB1bmRlcnN0YW5kIGFsbCBhc3BlY3RzIG9mIHRoZSBzdHVkeSB0aGV5IGNvbW1lbnRlZCBvbi4gQ29tbWVudHMgZnJvbSB0aGlzIHJldmlld2VyIGFyZSBnZW5lcmFsbHkgZWFzeSB0byBhZGRyZXNzLiAKCipQb2ludHMgdG8gaGlnaGxpZ2h0KjogQ2xhcmlmeSByb2J1c3RuZXNzIGluIGFyZWFzIHRoZXkgaWRlbnRpZmllZCwgYW5kIGltcHJvdmUgb3JnYW5pemF0aW9uIG9mIHRoZSBtYW51c2NyaXB0LiAKCiMjIyBDb21tZW50IDEKCioqUTogVGhlIGZpZ3VyZXMgYXJlIHBvb3JseSBhbm5vdGF0ZWQuIFNvbWUgZXhhbXBsZXM6IEZpZ3VyZSAxIC0gbGVnZW5kIG1pc3NpbmcsIGZvbnQgc2l6ZSB0b28gc21hbGwuIEZpZ3VyZSAyIC0gd2hhdCBkb2VzIGNsb25vdHlwZSBwdWJsaWNpdHkgbWVhbj8gV2hhdCBhcmUgdGhlIGNvZGVzIChST3YzLCBBZG54MSwgZXRjKSBtZWFuPyBXaGF0IGRvIHRoZSBsaW5lcyBtZWFuPyBUaGlzIGZpZ3VyZSBpcyBwYXJ0aWN1bGFybHkgaGFyZCB0byB1bmRlcnN0YW5kLiBGaWd1cmUgM0EvQjogdmlzdWFsbHkgYXBwZWFsaW5nIGJ1dCBubyBpZGVhIHdoYXQgaXQgbWVhbnMuIFRoZSBzYW1wbGUgY29kZXMgbmVlZCBleHBsYWluaW5nIGFzIGRvIGNvbG9ycyBldGMuIEFsbCBvdGhlciBmaWd1cmVzIHNob3VsZCBiZSBjcml0aWNhbGx5IHJldmlld2VkIGluIHRoZSBzYW1lIHdheS4qKgoKV2UgYWNrbm93bGVkZ2UgdGhpcyBwb2ludCBhYm91dCBjbGFyaXR5IC0tIGFuZCBoYXZlIG1hZGUgdGhlIGZvbGxvd2luZyBtb2RpZmljYXRpb25zIHRvIGFkZHJlc3MgdGhpczoKCkxpbmVzIGFyZSBtZW50aW9uZWQgaW4gZmlndXJlIGxlZ2VuZCBidXQgY291bGQgYmUgY2xhcmlmaWVkLiAKQ2xvbm90eXBlIHB1YmxpY2l0eSBuZWVkcyB0byAoaWYgbm90IGFscmVhZHkpIGJlIG1lbnRpb25lZCBpbiBmaWd1cmUgbGVnZW5kLiAKUHJldHR5IHN1cmUgRmlndXJlIDEgaGFzIGEgbGVnZW5kIC4uLgpBbiBleGFtcGxlIGV4cGFuZGVkIHNpdGUgY29kZSBjYW4gYmUgZ2l2ZW4gaW4gbGVnZW5kLCBhbmQgb3RoZXJzIGNhbiBiZSBwcm92aWRlZCBpbiBzdXBwbGVtZW50YWwgdGFibGUuIApDaGVjayBvdmVyIG90aGVyIGZpZ3VyZXMuCgojIyMgQ29tbWVudCAyCgoqKlE6IFRoZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIFMtVElMIGFuZCBFUy1USUwgaW4gYm90aCBUSUwgZGVuc2l0aWVzIGFuZCBpbW11bmUtYXNzb2NpYXRlZCBwYXRod2F5IGdlbmUgZXhwcmVzc2lvbiBwcm9maWxlcyBhcHBlYXIgbW9kZXN0IGFuZCBzdGF0aXN0aWNhbCB0ZXN0cyBmb3Igcm9idXN0bmVzcyBvZiB0aGUgY2x1c3RlcmluZyBjb3VsZCBiZSB1c2VkIHRvIGRlbW9uc3RyYXRlIHRoZWlyIHJlbGV2YW5jZS4qKgoKVGhpcyBpcyBhIGdvb2QgcG9pbnQuIEZpcnN0LCB3ZSdkIGxpa2UgdG8gY2xhcmlmeSB0aGF0IFMtVElMIGFuZCBFUy1USUwgYXJlIGluZGVlZCBzaW1pbGFyIGluIGltbXVuZS1hc3NvY2lhdGVkIHBhdGh3YXkgZ2VuZSBleHByZXNzaW9uIC0tIHdlIG1lYW50IHRvIHNob3cgdGhpcyBpbiBvcmRlciB0byBlbXBoYXNpemUgdGhhdCBpbW11bmUtYXNzb2NpYXRlZCBleHByZXNzaW9uIGRhdGEgYWxvbmUgY2Fubm90IGRpc3Rpbmd1aXNoIHRoZXNlIDIgY2xhc3NlcyBvZiB0dW1vdXJzLiBJSEMgcHJvdmlkZXMgdGhlIG5lY2Vzc2FyeSBpbmZvcm1hdGlvbiB0byBkaXN0aW5ndWlzaCB0aGVtLiBXZSdkIGFkZGl0aW9uYWxseSBsaWtlIHRvIGVtcGhhc2l6ZSB0aGUgZm9sbG93aW5nIGV4Y2VycHQgZnJvbSB0aGUgRmlndXJlIGxlZ2VuZDoKClBBU1RFIFBBUlQgQUJPVVQgVEhFIENMVVNURVJJTkcgT05MWSBCRUlORyBCQVNFRCBPTiBUSUwgREVOU0lUSUVTCgp0byBhdm9pZCBwb3NzaWJsZSBjb25mdXNpb24uIFRvIGFkZHJlc3MgdGhlIGNvbW1lbnQgdGhhdCB0aGUgZGlmZmVyZW5jZXMgZm9yIFRJTCBkZW5zaXRpZXMgYXBwZWFyIG1vZGVzdCwgd2UgaGF2ZSBtYWRlIHRoZSBmb2xsb3dpbmcgY2hhbmdlczoKCiogSGVhdG1hcCBpcyBubyBsb25nZXIgY2x1c3RlcmVkIGJ5IHJvdyAtLSBpbnN0ZWFkLCBhbGwgZXBpdGhlbGlhbCBUSUxzIGFyZSBsaXN0ZWQsIHRoZW4gYWxsIHN0cm9tYWwgVElMcy4gVGhpcyBoZWxwcyBlbXBoYXNpemUgdGhlIG9ic2VydmF0aW9uIHRoYXQgRVMtVElMIGFyZSBzcGVjaWZpY2FsbHkgaGlnaGVyIGluIGVwaXRoZWxpYWwgVElMIGRlbnNpdGllcyBjb21wYXJlZCB0byBTLVRJTC4gCiogV2UndmUgYXBwbGllZCB0aGUgZm9sbG93aW5nIHN0YXRpc3RpY2FsIHRlc3RzIHRvIGRldGVybWluZSB0aGUgbnVtYmVyIG9mIFRJTCBjbHVzdGVycyBpbiB0aGUgY29ob3J0LiBPdXIgYXBwcm9hY2hlcyBjb252ZXJnZSBvbiB0aGUgY29tbW9uIHNvbHV0aW9uIG9mIDMgY2x1c3RlcnMuIAoKW1RJTCBjbHVzdGVyIHJvYnVzdG5lc3NdKGByIG5vdGVib29rX3JlbGF0aXZlX3BhdGhzJHRpbGNsdXN0ZXJfcm9idXN0bmVzc2ApCgojIyMgQ29tbWVudCAzCgoqKlE6IExpa2UgcHJlc2VuY2Ugb2YgQ0Q4KyBjZWxscywgb3ZhcmlhbiBjYW5jZXJzIHRoYXQgaGF2ZSBub3QgeWV0IHVuZGVyZ29uZSB3aG9sZSBnZW5vbWUgZG91YmxpbmcgYXJlIGFzc29jaWF0ZWQgd2l0aCBmYXZvcmFibGUgb3V0Y29tZSAoUE1JRCAyMjU0NDAyMikuIFdob2xlIGdlbm9tZSBkb3VibGluZyBtYXkgaW50ZXJmZXJlIHdpdGggdGhlIGNsYXNzaWZpY2F0aW9uIG9mIHBvaW50IG11dGF0aW9ucyBhcyBjbG9uYWwgb3Igc3ViY2xvbmFsLiBJcyBpdCBwb3NzaWJsZSB0aGF0IHNhbXBsZXMgdGhhdCBoYXZlIHVuZGVyZ29uZSB3aG9sZSBnZW5vbWUgZG91YmxpbmcgYXJlIGFzc29jaWF0ZWQgd2l0aCBpbmNyZWFzZWQgbnVtYmVycyBvZiBzdWJjbG9uYWwgbXV0YXRpb25zLCBhbmQgYnkgZXh0ZW5zaW9uLCBhbiBpbmNyZWFzZWQgbnVtYmVyIG9mIG5lb2VwaXRvcGVzPyoqCgpUaGlzIGlzIGEgZ3JlYXQgcG9pbnQuIEZpcnN0LCB3ZSdkIGxpa2UgdG8gYWNrbm93bGVkZ2UgdGhhdCBvdXIgY2xvbmFsIG1vZGVsIGluY29ycG9yYXRlcyB0b3RhbCBhbmQgcGFyZW50YWwgKG1ham9yL21pbm9yKSBjb3B5IG51bWJlciBpbiBvcmRlciB0byBwcmV2ZW50IFdHRCBldmVudHMvZXh0ZW5zaXZlIENOViBmcm9tIGluY29ycmVjdGx5IGNvbmZvdW5kaW5nIGNsb25hbGl0eSBjYWxscy4gVGhpcyBwb2ludCBpcyBlc3BlY2lhbGx5IGltcG9ydGFudCBmb3IgSEdTQywgd2hpY2ggaXMgc3ViamVjdCB0byBleHRlbnNpdmUgQ05WLCBhcyB0aGUgcmV2aWV3ZXIgaGFzIGFja25vd2xlZGdlZC4gCgpUbyBkaXJlY3RseSBleHBsb3JlIHRoZSBwb3RlbnRpYWwgZWZmZWN0IENOVnMvV0dEIG1heSBoYXZlIGhhZCBvbiBvdXIgZXN0aW1hdGVzLCB3ZSBleHBsb3JlIHRoZSBhc3NvY2lhdGlvbiBiZXR3ZWVuIHBsb2lkeSBhbmQgc3ViY2xvbmFsIG5lb2VwaXRvcGUgbG9hZCBhbmQgcHJvcG9ydGlvbjoKCltXaG9sZSBnZW5vbWUgZHVwbGljYXRpb25dKGByIG5vdGVib29rX3JlbGF0aXZlX3BhdGhzJHdob2xlX2dlbm9tZV9kdXBsaWNhdGlvbmApCgpSZW1lbWJlciB0byBleHBsb3JlIHByb3BvcnRpb24gdG9vLCBub3QganVzdCBsb2FkIGhlcmUuIAoKIyMjIENvbW1lbnQgNAoKKipROiBUaGUgaW1tdW5lIHN1YnR5cGVzIE4tVElML1MtVElML0VTLVRJTCBhcmUgdmVyeSBsaWtlbHkgcmVmbGVjdGVkIGluIGNvbW1vbiBnZW5lIGV4cHJlc3Npb24gcHJvZmlsZXMuIFRoZXJlIGFyZSBtb3JlIHRoYW4gNjAgVENHQSBvdmFyaWFuIGNhcmNpbm9tYSB3aG9sZSBnZW5vbWVzIHRoYXQgY2FuIHByZXN1bWFibHkgYmUgKGluZGlyZWN0bHkpIGNsYXNzaWZpZWQgaW50byB0aGVzZSBzdWJ0eXBlcyB0aHJvdWdoIHRoZWlyIG1hdGNoaW5nIGV4cHJlc3Npb24gZGF0YS4gQ2FuIHRoaXMgc2V0IGJlIHVzZWQgdG8gZmluZCBpbmRlcGVuZGVudCB2YWxpZGF0aW9uIG9mIHRoZSBhc3NvY2lhdGlvbiBiZXR3ZWVuIGltbXVuZSBlbnZpcm9ubWVudCBhbmQgY2xvbmFsIGNvbXBsZXhpdHk/IFdoaWxlIHRoZSBkYXRhc2V0IHByZXNlbnRlZCBpbiB0aGUgbWFudXNjcmlwdCBpcyBzdWJzdGFudGlhbCwgaXQgd291bGQgYmUgZ3JlYXQgdG8gbWF4aW1pemUgdGhlIHJvYnVzdG5lc3Mgb2YgdGhlIHJlc3VsdHMgYnkgaW5jbHVkaW5nIGFkZGl0aW9uYWwgZGF0YSAoYW5kIGVhc2lseSBhY2Nlc3NpYmxlKSBkYXRhc2V0cy4qKgoKV2UgYWNrbm93bGVkZ2UgdGhhdCB0aGlzIHdvdWxkIGJlIGRlc2lyYWJsZSB0byBkby4gV2UgZmlyc3QgYXR0ZW1wdGVkIHRvIGNyYWZ0IGFuIGV4cHJlc3Npb24tYmFzZWQgY2xhc3NpZmllciBvZiBOL1MvRVMtVElMLCBidXQgdGhlIHJlc3VsdGluZyBjbGFzc2lmaWVyLCB0cmFpbmVkIGFuZCB0ZXN0ZWQgb24gb3VyIE5hbm9zdHJpbmcgZXhwcmVzc2lvbiBkYXRhIChpbW11bmUtYXNzb2NpYXRlZCBwYXRod2F5cyArIExlb25nIGV0IGFsLiBtb2xlY3VsYXIgc3VidHlwZSBtYXJrZXJzKSBkaWQgbm90IGFjaGlldmUgYSByZWFzb25hYmxlIGRlZ3JlZSBvZiBhY2N1cmFjeSAoTElTVCkuIFRoaXMgaXMgbm90IGVudGlyZWx5IHN1cnByaXNpbmcgZ2l2ZW4gdGhlIHNpbWlsYXJpdHkgYmV0d2VlbiBTLVRJTCBhbmQgRVMtVElMIGluIHRlcm1zIG9mIGltbXVuZS1hc3NvY2lhdGVkIHBhdGh3YXkgZXhwcmVzc2lvbi4gCgpFeHBsb3JpbmcgdGhlIHBvc3NpYmlsaXR5IHRoYXQgb3VyIHNldCBvZiBnZW5lcyBwcm9maWxlZCB3aXRoIE5hbm9zdHJpbmcgbWF5IG5vdCBoYXZlIGJlZW4gc3VmZmljaWVudGx5IGV4dGVuc2l2ZSB0byBkbyB0aGlzLCB3ZSBsZXZlcmFnZWQgVTEzM0EyIG1pY3JvYXJyYXkgZGF0YSBmb3IgWFggY2FzZXMgb3V0IG9mIG91ciBjb2hvcnQsIGFuZCByZXBlYXRlZCBvdXIgcHJvY2VkdXJlcy4gV2Ugbm90ZSB0aGF0IHRoZSBzYW1wbGUgc2l6ZSBoZXJlIHdhcyBleHRyZW1lbHkgc21hbGwuIFRvIGNvbnRyb2wgZm9yIHBhdGllbnQsIHRyYWluaW5nIGFuZCB2YWxpZGF0aW9uIHNldHMgaW4gY3Jvc3MtdmFsaWRhdGlvbiB3ZXJlIGRlcml2ZWQgZnJvbSBkaWZmZXJlbnQgc2V0cyBvZiBwYXRpZW50cyAoZHJhd24gcmFuZG9tbHkpLiBBZ2Fpbiwgd2Ugd2VyZSBub3QgYWJsZSB0byBwcm9kdWNlIGEgZ29vZCBjbGFzc2lmaWVyIGJ5IG11bHRpcGxlIG1ldGhvZHMuIAoKVG8gYWRkcmVzcyB0aGUgcG9zc2liaWxpdHkgdGhhdCBvdGhlciBkYXRhIHR5cGVzIG1heSBwcm92aWRlIHRoZSBmZWF0dXJlcyBuZWNlc3NhcnkgdG8gZGVjb252b2x2ZSBTLVRJTCBhbmQgRVMtVElMIHN1YnR5cGVzLCB3ZSBsb29rZWQgdG8gY2hhcmFjdGVyaXplIHRoZXNlIHN1YnR5cGVzIGJhc2VkIG9uIEhcJkUgZGF0YSwgd2hpY2ggaXMgcmVhZGlseSBhdmFpbGFibGUgZm9yIFRDR0Egc2FtcGxlcy4gQmFzZWQgb24gdGhlIHJlc3VsdHMgZnJvbSBvdXIgY29ob3J0IHRoYXQgUy1USUwgc2FtcGxlcyBoYXZlIGxlc3MgbHltcGhvY3l0ZS10dW1vdXIgY2VsbCBjb2xvY2FsaXphdGlvbiBpbiB0dW1vdXIgZXBpdGhlbGl1bSBjb21wYXJlZCB0byBFUy1USUwsIHdlIHRyYWluZWQgYSBjbGFzc2lmaWVyIHRoYXQgYWNoaWV2ZWQgYSBYWFwlIGRlZ3JlZSBvZiBhY2N1cmFjeSBvbiBvdXIgY29ob3J0IHVzaW5nIHRoZSBmZWF0dXJlcyBzaG93biBpbiBGSUdVUkUgKGkuZS4gZGVuc2l0eSBmZWF0dXJlcyBkZXJpdmVkIGZyb20gSFwmRSBhbmQgaG90c3BvdCBmZWF0dXJlcykuIEZyb20gdGhpcyAuLi4gKEFGVEVSIEZJTk4gQU5EIE1ZIEFOQUxZU0lTKS4gCgpUaGVuLCB3ZSBhdHRlbXB0ZWQgdG8gc2VlIHdoZXRoZXIgdGhlc2Ugc3VidHlwZXMgaWRlbnRpZmllZCBmcm9tIFRDR0EgaGFkIGRpZmZlcmVudCBjbG9uYWwgY29tcGxleGl0eSBwYXR0ZXJucy4gUHJpb3IgdG8gdGhpcyBhbmFseXNpcywgd2Ugbm90ZSB0aGF0IGNsb25hbCBjb21wbGV4aXR5IGRldGVybWluYXRpb24gZnJvbSBzaW5nbGUgc2FtcGxlcyAtLSBlc3BlY2lhbGx5IGV4b21lcyAtLSBjYW4gYmUgc3ViamVjdCB0byBhIGxvdCBvZiBub2lzZSwgZ2l2ZW4gdGhlIGlzc3VlIG9mIGNsb25hbCBvdmVybGFwLiAKCltUSUwgY2x1c3RlciBjbGFzc2lmaWNhdGlvbiBieSBleHByZXNzaW9uIGRhdGFdKGByIG5vdGVib29rX3JlbGF0aXZlX3BhdGhzJHRpbGNsdXN0ZXJfZXhwcmNsYXNzaWZpY2F0aW9uYCkKCiMjIyBDb21tZW50IDUKCioqUTogSXQgaXMgZGVzY3JpYmVkIHRoYXQgVC1jZWxsIHJlcGVydG9pcmUgY29ycmVsYXRlZCB3aXRoIG1hbGlnbmFudCBjbG9uZSBjb21wb3NpdGlvbi4gV291bGQgYW4gaW52ZXJzZSByZWxhdGlvbiBiZXR3ZWVuIHRoZSBudW1iZXIgb2Ygc3ViY2xvbmFsIG5lby1lcGl0b3BlcyBhbmQgY2xvbm90eXBlIGRpdmVyc2l0eSBvciBkZW5zaXR5IGJlIGFibGUgdG8gY29ycm9ib3JhdGUgdGhlIHByZXZpb3VzIHBvaW50IHRoYXQgQ0Q4KyBjZWxscyBwbGF5IGEgcm9sZSBpbiBzdWJjbG9uYWwgbmVvZXBpdG9wZSBkZXBsZXRpb24/KioKClRoaXMgYW5hbHlzaXMgaXMgaW50ZXJlc3RpbmcgLS0gYnV0IHdlIGJlbGlldmUgaXQgd291bGQgbm90IGRpcmVjdGx5IGFkZHJlc3MgdGhhdCBxdWVzdGlvbi4gRmlyc3RseSwgd2UnZCBsaWtlIHRvIHNob3cgdGhlIGZvbGxvd2luZyBGaWd1cmUsIGluZGljYXRpbmcgdGhhdCBjbG9uYWxseSBjb21wbGV4IHR1bW91cnMgZG8gbm90IG5lY2Vzc2FyaWx5IGhhcmJvciBkaXZlcnNlIFQtIG9yIEItY2VsbCBjbG9ub3R5cGUgcmVwZXJ0b2lyZXMuIE5ldmVydGhlbGVzcywgd2UgZG8gYWNrbm93bGVkZ2UgdGhlIHBvc3NpYmlsaXR5IHRoYXQgaWYgbW9yZSBkaXZlcnNlIFQtY2VsbCBjbG9ub3R5cGUgcmVwZXJ0b2lyZXMgLS0gc2hvd24gaW4gUkVGLCBSRUYsIGFuZCBSRUYgYXMgZXZpZGVuY2Ugb2YgbW9yZSByb2J1c3QgVElMIHJlc3BvbnNlcyAtLSBhcmUgYXNzb2NpYXRlZCB3aXRoIHN1YmNsb25hbCBuZW9lcGl0b3BlIGRlcGxldGlvbiwgdGhpcyBtYXkgaW5kaWNhdGUgdGhhdCBUIGNlbGxzLCBhbmQgdGhlcmVmb3JlIGxpa2VseSBDRDgrIFQgY2VsbHMsIGhhdmUgYSByb2xlIGluIHN1YmNsb25hbCBuZW9lcGl0b3BlIGRlcGxldGlvbi4gCgpIb3dldmVyLCBwcmlvciB0byBkb2luZyB0aGlzLCB3ZSBkbyB3YW50IHRvIHBvaW50IG91dCB0aGF0LCBhcyBDRDgrIFQgY2VsbCBkZW5zaXR5IGFuZCBjbG9ub3R5cGUgZGl2ZXJzaXR5IGFyZSBjb3JyZWxhdGVkLCB0aGlzIGFuYWx5c2lzIHN1ZmZlcnMgZnJvbSBhIGNvbGxpbmVhcml0eSBwcm9ibGVtLiAKCkZpcnN0LCB3ZSBsb29rZWQgYXQgVC1jZWxsL0ItY2VsbCBjbG9ub3R5cGUgZGl2ZXJzaXR5IGluZGl2aWR1YWxseSwgZmluZGluZyBhbiBhc3NvY2lhdGlvbiAtLSBhbHRob3VnaCBub3Qgc2lnbmlmaWNhbnQgLS0gd2l0aCBzdWJjbG9uYWwgbmVvZXBpdG9wZSBkZXBsZXRpb24uIFRoZW4sIHdlIGFkZGVkIGVwaXRoZWxpYWwgQ0Q4KyBUSUwgZGVuc2l0eSB0byB0aGUgbW9kZWwuIEFzIGV4cGVjdGVkIGdpdmVuIHRoZSBjb2xsaW5lYXIgcmVsYXRpb25zaGlwIGJldHdlZW4gZXBpdGhlbGlhbCBDRDgrIFRJTCBkZW5zaXR5IGFuZCBULWNlbGwgY2xvbm90eXBlIGRpdmVyc2l0eSwgdGhlIGNvZWZmaWNpZW50IG9mIFQtY2VsbCBjbG9ub3R5cGUgZGl2ZXJzaXR5IGZsaXBwZWQgc2lnbnMuIAoKVGhlcmVmb3JlLCB3aGlsZSB0aGVyZSBpcyBhIHRyZW5kIGJldHdlZW4gVENSIGNsb25vdHlwZSBkaXZlcnNpdHkgYW5kIHN1YmNsb25hbCBuZW9lcGl0b3BlIGVsaW1pbmF0aW9uLCB0aGlzIGRvZXMgbm90IHJlYWNoIHNpZ25pZmljYW5jZS4gCgpbVENSLW5lb2VwaXRvcGUgZGVwbGV0aW9uIGNvcnJlbGF0aW9uXShgciBub3RlYm9va19yZWxhdGl2ZV9wYXRocyR0Y3JfbmVvZXBpdG9wZV9jb3JyZWxhdGlvbmApCgoKIyMjIENvbW1lbnQgNgoKKipROiBUaGUgc2FtcGxlIGNvaG9ydCBpbmNsdWRlcyBhIGZldyBzYW1wbGVzIGZyb20gcG9zdC10cmVhdG1lbnQgdHVtb3JzLiBUaGlzIGFzcGVjdCBpcyB1bmRlcnN0YXRlZCBpbiB0aGUgY3VycmVudCBwcmVzZW50YXRpb24gb2YgcmVzdWx0cy4gSXQgaXMgaGFyZCB0byBpbWFnaW5lIHRoYXQgdHJlYXRtZW50IGRvZXMgbm90IGFmZmVjdCB0aGUgaW1tdW5lIG1pbGlldS4gRGVzY3JpcHRpb24gb2Ygd2hlcmUgdGhlc2Ugc2FtcGxlcyB3ZXJlIHVzZWQgaXMgbmVlZGVkLCBvciBkYXRhc2V0cyBmcm9tIHRoZXNlIHNhbXBsZXMgc2hvdWxkIGJlIHdpdGhoZWxkIGluIHRoZSBhbmFseXNpcy4gV2hpbGUgbm90IGVzc2VudGlhbCBmb3IgdGhlIG1hbnVzY3JpcHQsIG9uZSB3b3VsZCBleHBlY3QgdGhlcmUgdGhhdCBhIGxvbmdpdHVkaW5hbCBjb21wYXJpc29uIG9mIHRoZSBtaWNyb2Vudmlyb25tZW50IGFuZCBpbnRyYXR1bW9yYWwgaGV0ZXJvZ2VuZWl0eSB3b3VsZCB5aWVsZCBpbnRlcmVzdGluZyByZXN1bHRzIGFuZCB0aGUgYXV0aG9ycyBtaWdodCBjb25zaWRlciByZXBvcnRpbmcgc3BlY2lmaWNhbGx5IG9uIHRoYXQuKioKClBlcmhhcHMgZXhjbHVkZSB0aGUgdGVtcG9yYWwgc2FtcGxlcyBmcm9tIGFueSBzdGF0aXN0aWNhbCBjb3JyZWxhdGlvbnMgd2hlcmUgbmVjZXNzYXJ5PyBJLmUuIG1heSBiZSB3b3J0aCBleGNsdWRpbmcgZnJvbSBJVEgtVElMIGNvcnJlbGF0aW9uLCBhbmQgdGhlIFhDUm1hcHNjYXBlcyAoZXhjbHVkZSB0aG9zZSBwYXRpZW50cyBmcm9tIHRoZSAj4oCZcyBpbiB0aGUgdGV4dCkuIEFsc28gZXhjbHVkZSBmcm9tIG51bWJlcnMgZm9yIEZpZyAxYiAxMi8yMCwgZXRjLiBJdOKAmXMgYWxyZWFkeSBleGNsdWRlZCBmcm9tIHRoZSBCQ1IgcGh5bG9nZW5ldGljcyBzZWN0aW9uLiAKClNob3VsZG4ndCByZWFsbHkgY2hhbmdlIHRoZSByZXN1bHRzLCBhcyB0aGVyZSBhcmUgb25seSA0IG9mIHRoZXNlIG9yIHNvLiAKCiMjIyBDb21tZW50IDcKCioqUTogVGhlIGZpbmFsIHNlY3Rpb24gKCJNdXRhdGlvbiBzaWduYXR1cmXigKYiKSBkb2VzIG5vdCByZWFsbHkgYWxpZ24gd2l0aCB0aGUgcmVzdCBvZiB0aGUgbWFudXNjcmlwdCBhbmQgc2VlbXMgYSBiaXQgb3V0IG9mIHBsYWNlLiBDb25zaWRlciB3aGV0aGVyIGl0IGlzIG5lZWRlZCB0byBjb252ZXkgdGhlIG1haW4gbWVzc2FnZSBvZiB0aGlzIHdvcmssIG9yIHdoZXRoZXIgaXQgaXMgYmVzdCBwcmVzZXJ2ZWQgZm9yIHByZXNlbnRhdGlvbiBlbHNld2hlcmUuKioKClJlbW92ZSB0aGlzIHNlY3Rpb24uIAoKIyMjIE1pbm9yIGNvbW1lbnQgMQoKKipROiBBdm9pZCBvdmVybHkgY29tcGxleCBqYXJnb24gYW5kIHVubmVjZXNzYXJ5IGFjcm9ueW1zLCBzdWNoIGFzIHRoZSBzZW50ZW5jZSAiT20xIGFuZCBPdjIgd2VyZSBFUy1USUwgd2hlcmVhcyBPbTIgYW5kIE92MSB3ZXJlIE4tVElMIi4gVGhpcyBzZW50ZW5jZSBpcyB1bnJlYWRhYmxlIHdpdGhvdXQgYSBnbG9zc2FyeS4qKgoKSSBtZWFuIC0tIG9rLCBidXQgdGhvc2UgYXJlIG91ciBzYW1wbGUgaWRlbnRpZmllcnMuIE1heWJlIHdlIGNhbiBleHBhbmQgdGhlbT8gCgojIyMgTWlub3IgY29tbWVudCAyCgoqKlE6IEJvdGggUE1JRCAyNTI2OTQ4NyBhbmQgUE1JRCAyMzI1NzM2MiBmb3VuZCB0aGF0IG92YXJpYW4gY2FyY2lub21hIHNwZWNpbWVucyBjb3VsZCBpbiBtYWpvcml0eSBiZSBhc3NpZ25lZCB0byBtb3JlIHRoYW4gb25lIHRyYW5zY3JpcHRpb25hbCBjbGFzcy4gSXMgaXQgcG9zc2libGUgdGhhdCBhbGxvd2luZyB0aGUgc2FtcGxlcyBwcmVzZW50ZWQgaGVyZSB0byBiZSBjbGFzc2lmaWVkIGludG8gbW9yZSB0aGFuIG9uZSBncm91cCBjb3VsZCBmdXJ0aGVyIGNsYXJpZnkgdGhlIHJlbGF0aW9uIGJldHdlZW4gaW1tdW5lIGdyb3VwcyBhbmQgZXhwcmVzc2lvbiBncm91cHM/KioKCk9idmlvdXNseSB3ZSBjYW4ndCBkbyBhbnl0aGluZyBha2luIHRvIHNzR1NFQSwgd2l0aCBvbmx5IDggZmVhdHVyZXMgKFRJTCB0eXBlcykuIFRvIGFkZHJlc3MgdGhpcyBxdWVzdGlvbiB3ZSBuZWVkIHRvIGRvIHNvbWUgc29ydCBvZiBmdXp6eSBjbHVzdGVyaW5nIG9yIHBvc3QtaG9jIGFzc2Vzc21lbnQuIAoKW1RJTCBjbHVzdGVyIG11bHRpcGxlIGFzc2lnbm1lbnQgYW5hbHlzaXNdKGByIG5vdGVib29rX3JlbGF0aXZlX3BhdGhzJHRpbGNsdXN0ZXJfbXVsdGlwbGVhc3NpZ25tZW50c2ApCgpOT1RFOiBNYWtlIHN1cmUgSSdtIHN0YW5kYXJkaXppbmcvbm9ybWFsaXppbmcgd2hlbiBkb2luZyB0aGUgc2lsaG91ZXR0ZSBwYXJ0IG9mIHRoZSBhbmFseXNpcy4gCgojIyMgTWlub3IgY29tbWVudCAzCgoqKlE6IFRoZSBjb25jZXB0IG9mIHByZWRpY3RpbmcgdGhlIG51bWJlciBvZiBuZW9lcGl0b3BlcyBpcyBhbiBpbXBvcnRhbnQgYXNwZWN0IGluIHRoZSBhbmFseXNpcyBhbmQgZGVzZXJ2ZXMgYSBzZW50ZW5jZSBvZiBleHBsYW5hdGlvbiBpbiB0aGUgbWFpbiB0ZXh0LioqCgpFYXNpbHkgZG9uZSwgYXMgbG9uZyBhcyBpdCdzIHVuZGVyIHRoZSBjaGFyYWN0ZXIgbGltaXQuIAoKIyMjIE1pbm9yIGNvbW1lbnQgNAoKKipROiBUaGUgbWFqb3JpdHkgb2YgdGhlIG1hbnVzY3JpcHQgZGlzY3Vzc2VzIHNwZWNpbWVucyBieSBpbW11bmUgc3VidHlwZSBidXQgdGhpcyBpcyBzd2l0Y2hlZCB0byBleHByZXNzaW9uIGNsYXNzIChDMSkgaW4gdGhlIFRDUi9CQ1Igc2VxdWVuY2luZyBzZWN0aW9uLiBDb25zaWRlciBjb25zaXN0ZW50IHVzZSBvZiB0aGUgc2FtZSBzdWJ0eXBlcyBvciBhdCBsZWFzdCBleHBsYWluIHdoeSB0aGlzIHNlY3Rpb24gZGl2ZXJnZXMuKioKCk91ciBvcmlnaW5hbCBpbnRlbnRpb24gd2FzIHRvIHByb3ZpZGUgYSBjb21wYXJpc29uIG9mIG91ciBzdWJ0eXBlcyB0byB0aGUgVG90aGlsbCBzdWJ0eXBlcy4gSG93ZXZlciwgd2UgYWdyZWUgdGhhdCB0aGlzIGFuYWx5c2lzIGNvdWxkIGJlIG1vcmUgY2xlYXJseSBwcmVzZW50ZWQgd2l0aCBvdXIgb3duIHN1YnR5cGVzLiBUbyBhZGRyZXNzIHRoaXMsIHdlIGhhdmUgY2hhbmdlZCBGaWd1cmVzIFhYLCBYWCwgYW5kIFhYIHRvIHVzZSBvdXIgb3duIHN1YnR5cGVzLgoKW1RJTCBjbHVzdGVyIGltbXVuZSBwcm9wZXJ0aWVzXShgciBub3RlYm9va19yZWxhdGl2ZV9wYXRocyR0aWxjbHVzdGVyX2ltbXVuZXByb3BlcnRpZXNgKQoKCiMjIyBNaW5vciBjb21tZW50IDUKCioqUTogRm91ciBtZWFzdXJlcyBvZiBpbnRyYXR1bW9yYWwgaGV0ZXJvZ2VuZWl0eSBhcmUgbWVudGlvbmVkIGFzIGNvcnJlbGF0ZWQgYnV0IHRoaXMgZGF0YSBkb2VzIG5vdCBhcHBlYXIgdG8gaGF2ZSBiZWVuIHByZXNlbnRlZCBpbiB0aGUgZm9ybSBvZiBhIGZpZ3VyZS4gU2FtZSBmb3IgdGhlIG9ic2VydmF0aW9uIHRoYXQgdGhlc2UgbWV0cmljcyB3ZXJlIG5vdCBjb25mb3VuZGVkIGJ5IHR1bW9yIHB1cml0eS4gVGhpcyBkYXRhIG5lZWRzIHRvIGJlIHJlcHJlc2VudGVkIG1vcmUgY2xlYXJseS4qKgoKV2UgaGFkIHRoZXNlIHBsb3RzIGluIG91ciBTdXBwbGVtZW50YWxzLCBidXQgZXhjbHVkZWQgdGhlbSBmcm9tIHRoZSBmaW5hbCBzdWJtaXNzaW9uIGR1ZSB0byBzcGFjZSByZXN0cmljdGlvbnMuIEFzIHRoaXMgaGFzIGJlZW4gYnJvdWdodCB1cCwgd2UndmUgaW5jbHVkZWQgdGhlbSBoZXJlIGZvciB0aGUgcmV2aWV3ZXIgdG8gcGVydXNlLiAKCiMjIyBNaW5vciBjb21tZW50IDYKCioqUTogIk91ciBkYXRhIGluZGljYXRlIHRoYXQgY28tcmVnaXN0cmF0aW9uIG9mIGltbXVuZSBhbmQgbWFsaWduYW50IGNlbGwgZGl2ZXJzaXR5IG1heSBwcm92aWRlIGEgbmV3IGJpb21hcmtlciBmb3IgcGF0aWVudCBvciB0aXNzdWUgc2FtcGxlIHN0cmF0aWZpY2F0aW9uIGluIGNsaW5pY2FsIHRyaWFscyBvciByZXRyb3NwZWN0aXZlIGNvaG9ydCBhbmFseXNlcy4gIiBzZWVtcyBmYXIgZmV0Y2hlZC4gSG93IGRvIHRoZSBhdXRob3JzIGVudmlzaW9uIHRoYXQgdG8gYmUgaW1wbGVtZW50ZWQ/KioKClNvaHJhYiwgQnJhZCAtLSBpZGVhcz8gCgojIyMgTWlub3IgY29tbWVudCA3CgoqKlE6IFBvc3NpYmxlIHR5cG8nczoqKgoqKmEuIFBhZ2UgOCAiVG8gdGVzdCB0aGlzLCB3ZSB0cmFpbmVkIGEgY2xhc3NpZmllciB0byBzZXBhcmF0ZSBUQ1JzIGFzIENEOC0gb3IgQ0Q0LXR5cGUgb24gdGhlIGJhc2lzIG9mIFYvSiBnZW5lcyAuLi4gVGhlIHJhdGlvIG9mIENEOC9DRDQtIHR5cGUgVENScyB3YXMgaGlnaGx5IGNvcnJlbGF0ZWQgd2l0aCB0aGUgcmF0aW8gb2YgQ0Q4Ky9DRDQrIGRlbnNpdGllcyBieSBJSEMgIiBDRDgtIG9yIENENC0gdHlwZSDigJQ+IENEOCsgb3IgQ0Q0KyB0eXBlPyBhbmQsIENEOC9DRDQtIOKAlD4gQ0Q4Ky9DRDQrPyoqCioqYi4gUGFnZSA4ICIgQ0Q4LXR5cGUgVENScyB3ZXJlIHNpZ25pZmljYW50bHkgbW9yZSBicm9hZGx5IGRpc3RyaWJ1dGVkIHRoYW4gQ0Q0LXR5cGUgVENScyAiIENEOCsgdHlwZSBUQ1JzIGFuZCBDRDQrIHR5cGUgVENScz8qKgoKV2UgYXBvbG9naXplIGZvciBhbnkgY29uZnVzaW9uIGFib3V0IHRoaXMuIFRoZSAnLScgc2lnbiB3YXMgaW50ZW5kZWQgYXMgYSBoeXBoZW4sIGJ1dCBhcyBpbmRpY2F0ZWQgYnkgdGhpcyByZXZpZXdlciBjb3VsZCBiZSBjb25mdXNlZCBmb3IgYSBtaW51cyBzaWduLiBXZSBkaWRuJ3Qgd2FudCB0byB1c2UgJystJyBhZGphY2VudCB0byBvbmUgYW5vdGhlciwgYnV0IGFzIHRoZSByZXZpZXdlciBzdWdnZXN0cyAnKycgbWF5IGJlIGNsZWFyZXIgb3ZlcmFsbC4gCgpUbyBhZGRyZXNzIHRoaXMsIHdlIGhhdmUgbWFkZSB0aGVzZSByZXZpc2lvbnMgc3VnZ2VzdGVkIGJ5IHRoZSByZXZpZXdlciBvbiBwYWdlcyBYWCBvZiB0aGUgcmV2aXNlZCBtYW51c2NyaXB0LiAKCiMjIFJldmlld2VyIDMKCgpaaGFuZyBldCBhbC4gYW5hbHlzZSAxNDMgdHVtb3JzIGZyb20gMjEgcGF0aWVudHMgd2l0aCBoaWdoLWdyYWRlIHNlcm91cyBvdmFyaWFuIGNhbmNlciAoSEdTQykgdXNpbmcgd2hvbGUtZ2Vub21lIHNlcXVlbmNpbmcsIG5hbm9zdHJpbmcgZ2VuZSBleHByZXNzaW9uLCBoaXN0b2xvZ2ljIGltYWdlIGFuYWx5c2lzLCBhbmQgVENSL0JDUiBzZXF1ZW5jaW5nLiBUaGUgbWFpbiBmaW5kaW5ncyBvZiB0aGUgc3R1ZHkgYXJlOgoKMS4gQ2xhc3NpZmljYXRpb24gb2YgdHVtb3JzIGJhc2VkIG9uIGV4cHJlc3Npb24gcHJvZmlsZSBhc3NvY2lhdGUgdG8gbHltcGhvY3l0ZXMgYW5kIGltbXVuZSBhY3RpdmF0aW9uLCBhbmQgZnJlcXVlbnQgY28tZXhpc3RlbmNlIGluIGRpc3RpbmN0IHR1bW9yLWltbXVuZSBpbmZpbHRyYXRlcyB3aXRoaW4gdHVtb3JzIGZyb20gdGhlIHNhbWUgcGF0aWVudHMuCjIuIEFuIGludmVyc2UgYXNzb2NpYXRpb24gYmV0d2VlbiBpbnRyYS10dW1vciBoZXRlcm9nZW5laXR5IGFuZCBwcmVzZW5jZSBvZiBDRDgrIHR1bW9yIGluZmlsdHJhdGluZyBseW1waG9jeXRlcyAoVElMKS4KMy4gVC1jZWxsIHJlcGVydG9pcmUgc2ltaWxhcml0eSBjb3JyZWxhdGUgd2l0aCB0dW1vciBjbG9uZSBjb21wb3NpdGlvbiBpbiBwYXRpZW50cyB3aXRoIHRoZSBoaWdoZXN0IENEOCsgVElMIGRlbnNpdHkuCjQuIEZvbGQtYmFjayBpbnZlcnNpb25zIGFzc29jaWF0ZSB3aXRoIHdvcnNlIG91dGNvbWUgZXZlbiBpbiB0aGUgcHJlc2VuY2Ugb2YgVCBjZWxsIGN5dG90b3hpY2l0eS4KCkdlbmVyYWwgY29tbWVudAoKVGhpcyBwYXBlciBwcm92aWRlcyBuZXcgd2F5cyB0byBhbmFseXplIGFuZCBkaXNzZWN0IGNsb25hbCBkeW5hbWljcyBhdCB0dW1vci1pbW11bmUgaW50ZXJmYWNlLiBBbHRob3VnaCB0aGUgYWJvdmUtbWVudGlvbmVkIGNvbmNsdXNpb25zIGFuZCBhbmFseXNlcyBhcmUgaW50ZXJlc3RpbmcsIHRoZSBvYnNlcnZhdGlvbnMgZHJhd24gaW4gdGhlIG1hbnVzY3JpcHQgYXJlIGdlbmVyYWxseSBub3Qgd2VsbCBjb25uZWN0ZWQgYW5kIHRoZSBtYW51c2NyaXB0IGxhY2tzIG9mIGRlcHRoLiBUaGUgaW1wbGljYXRpb25zIG9mIHRoZSBjb25jbHVzaW9ucyBhcmUgc3VwZXJmaWNpYWxseSBleHBsb3JlZC4gVGhlIGxpbmsgYmV0d2VlbiB0aGUgaW52ZXJzZSBhc3NvY2lhdGlvbiBiZXR3ZWVuIGludHJhLXR1bW9yIGhldGVyb2dlbmVpdHkgYW5kIFRJTHMgYW5kIHRoZSBvdGhlciByZXN1bHRzIG9mIHRoZSBzdHVkeSBpcyB3ZWFrIChvbmx5IGEgZmV3IGNvbmNsdXNpb25zIGNhbiBiZSBkcmF3biBmcm9tIHRoZSBCQ1Igc2VxLCBUQ1Igc2ltaWxhcml0eSwgSCZFIGltYWdlIGFuYWx5c2lzIHByZXNlbnRlZCBpbiBmaWd1cmVzIDMtNSkuIFRoZSBtdXRhdGlvbiBzaWduYXR1cmUgYW5hbHlzaXMgaXMgaW50ZXJlc3RpbmcsIGJ1dCBpdCBpcyB3ZWFrbHkgYXNzb2NpYXRlZCB3aXRoIHRoZSByZXN0IG9mIHRoZSBtYW51c2NyaXB0OiB0aGVyZSBpcyBubyBhc3NvY2lhdGlvbiB3aXRoIHRoZSBjbG9uYWwgZHluYW1pY3Mgb2YgdGhlIGNhbmNlciBjZWxscyBvciB0aGUgVCBjZWxscywgYW5kIG5vIG1lY2hhbmlzdGljIGluc2lnaHQgaXMgcHJvcG9zZWQgb3IgZGlzY3Vzc2VkLiBUaGUgc3Ryb25nZXN0IHJlc3VsdHMvZmlndXJlcyBhcmUgZmlndXJlIDEgYW5kIDYsIHRoZSByZXN1bHRzL2NvbmNsdXNpb25zIGZyb20gZmlndXJlcyAyLCAzLCA0LCA1IGFyZSB3ZWFrbHkganVzdGlmaWVkIGFuZCBkbyBub3QgYWRkIHNpZ25pZmljYW50bHkgdG8gdGhlIG92ZXJhbGwgbWVzc2FnZS4uLiBUaGUgaW1tdW5vZWRpdGluZyBhbmFseXNpcywgd2hpY2ggaXMgZXZlbiBtZW50aW9uZWQgaW4gdGhlIGFic3RyYWN0LCBkb2VzIG5vdCBoYXZlIGFueSBhc3NvY2lhdGVkIGZpZ3VyZXMgYW5kIGlzIGNvbnNpZGVyZWQgdG8gYmUgcHJlbGltaW5hcnkgKGFuZCBub3QgY29ycm9ib3JhdGVkIHdpdGggYWRkaXRpb25hbCBhbmFseXNlcyBvZiBvdGhlciBkYXRhc2V0cykuIFRoZSBCQ1IgYW5hbHlzaXMgd2FzIGJhc2VkIG9uIGEgbm92ZWwgYXBwcm9hY2ggYW5kIHRoZXJlZm9yZSBoYXJkIHRvIGp1ZGdlIGFuZCB0aGUgbWVzc2FnZSB3YXMgbm90IGNsZWFyLiBPdmVyYWxsLCBjaGFyYWN0ZXJpemluZyB0aGUgaW1tdW5vLW1hbGlnbmFudCBpbnRlcmZhY2Ugb2Ygb3ZhcmlhbiBjYW5jZXIgaXMgb2YgaGlnaCByZWxldmFuY2UgYnV0IHRoaXMgaW1wb3J0YW50IG1lc3NhZ2UgaXMgYnVyaWVkIGJ5IHNldmVyYWwgdW5yZWxhdGVkL3ByZWxpbWluYXJ5IGFuYWx5c2VzIHRoYXQgZG8gbm90IGltbWVkaWF0ZWx5IHN1cHBvcnQgdGhlIG1haW4gbWVzc2FnZQoKKkFsbGVuJ3MgaW1wcmVzc2lvbio6IFRoZSBtb3N0IGNyaXRpY2FsIG9mIHRoZSAzIHJldmlld2Vycy4gQnJpbmdzIHVwIG1hbnkgZ29vZCBwb2ludHMgKGluY2x1ZGluZyBzZXZlcmFsIGZyb20gYSBzdGF0aXN0aWNhbCBzdGFuZHBvaW50KSwgYnV0IGFsc28gc2F5cyAnbGFjayBvZiBkZXB0aCBhbmQgY2xhcml0eScgd2l0aCBmZXcgZGlyZWN0bHkgYWRkcmVzc2libGUgYXZlbnVlcyBwcm9wb3NlZC4gSSB0aGluayB0aGlzIHJldmlld2VyIG5lZWRzIGNvbnZpbmNpbmcgLS0gaS5lLiB3aXRoIGV4cGVyaW1lbnRhbCB2YWxpZGF0aW9uIGFuZCBhZGRpdGlvbmFsIGNvcnJvYm9yYXRpdmUgZXZpZGVuY2UgKGUuZy4gTE9ISExBKS4gCgoqUG9pbnRzIHRvIGhpZ2hsaWdodCo6IFN0cmVuZ3RoIHRoYXQgY2FuIGJlIGFkZGVkIGJ5IGFkZGl0aW9uYWwgY29ycm9ib3JhdGl2ZSBldmlkZW5jZS4gU3RyZW5ndGhlbiBGaWd1cmVzIDItNSwgYW5kIGNsYXJpZnkgQkNSIHBoeWxvZ2VuZXRpY3MgYW5hbHlzaXMgKyBjb25jbHVzaW9ucy4gCgojIyMgQ29tbWVudCAxCgoqKlE6IEJDUiBhbmFseXNpcyBpcyBvcmlnaW5hbCBidXQgbm90IHZlcnkgd2VsbCBqdXN0aWZpZWQsIGFuZCB0aGUgY29uY2x1c2lvbnMgZnJvbSB0aGF0IGFuYWx5c2lzIGFyZSB2ZXJ5IHZhZ3VlLiBBcmUgQiBjZWxscyBhbmQgdGhlaXIgY2xvbmFsIGR5bmFtaWNzIGFyZSBpbXBvcnRhbnQgaW4gSEdDUz8sIG9yIGlmIG5vdCwgdGhlbiB3aHk/IEFzIGl0IGlzIG5vdywgb25lIGNvdWxkIHNraXAgdGhhdCBzZWN0aW9uIGNvbXBsZXRlbHkgYW5kIHN0aWxsIGdldCB0aGUgbWVzc2FnZSBvZiB0aGUgcGFwZXIuIFRoZSBhdXRob3JzIGRvIG5vdCBtZW50aW9uIHRoaXMgcmVzdWx0IGluIHRoZSBhYnN0cmFjdCwgd2hpY2ggc3VwcG9ydHMgdGhpcyBwb2ludC4qKgoKVGhlIGtleSBwb2ludCBoZXJlIGlzIHRoYXQgdGhlIEItY2VsbCByZXNwb25zZSAtLSBldmVuIGluIHBhdGllbnRzIHdpdGggaGlnaCBDRDIwKyBUSUwgLS0gaXMgc3BhdGlhbGx5IGhvbW9nZW5lb3VzLiBOb3QgbXVjaCBpcyBrbm93biBhYm91dCB0aGUgYW50aWdlbnMgb2YgQiBjZWxscyBpbiBIR1NDOyB0aGlzIGFuYWx5c2lzIHN1Z2dlc3RzIHRoYXQgdGhvc2UgYW50aWdlbnMgbWF5IGJlIGJyb2FkbHkgZGlzdHJpYnV0ZWQgYXMgb3Bwb3NlZCB0byBzaXRlLXNwZWNpZmljLiBUbyBkcml2ZSBob21lIHRoZSBwb2ludCB0aGF0IHRoZXNlIEIgY2VsbHMgYXJlIG5vdCBqdXN0IGJ5c3RhbmRlcnMsIHRoZSBwaHlsb2dlbmV0aWMgc2lnbmFsIGFuYWx5c2lzIGRlbW9uc3RyYXRlcyB0aGF0IHRoZXJlIGluIGZhY3QgaXMgZXZpZGVuY2Ugb2YgYW50aWdlbi1kcml2ZW4gZXhwYW5zaW9uIGluIEIgY2VsbHMgaW4gSEdTQywgc3BlY2lmaWNhbGx5IGluIHBhdGllbnRzIHdpdGggaGlnaCBDRDIwKyBUSUwuIAoKVGhvdWdodHMgZXZlcnlvbmU/IAoKIyMjIENvbW1lbnQgMgoKKipROiBUaGUgbXV0YXRpb25hbCBzaWduYXR1cmUgYW5hbHlzaXMgaXMgaW50ZXJlc3RpbmcgYnV0IGl0IGNvbWVzIG91dCBvZiBjb250ZXh0IGJlY2F1c2UgaXQgZG9lcyBub3QgbWVudGlvbiB3aGV0aGVyIGRpZmZlcmVudCBzYW1wbGVzIGZyb20gdGhlIHNhbWUgcGF0aWVudCBoYXZlIGRpZmZlcmVudCBtdXRhdGlvbmFsIHNpZ25hdHVyZXMgdGhhdCBjb3VsZCBleHBsYWluIHRoZSBpbmZpbHRyYXRpb24gc3RhdHVzLioqCgpXZSBhY2tub3dsZWRnZSB0aGF0IHRoaXMgc2VjdGlvbiBtYXkgYmUgb3V0IG9mIGNvbnRleHQuIEJvdGggdGhpcyByZXZpZXdlciBhbmQgcmV2aWV3ZXIgMiBicmluZyB0aGlzIHVwIC0tIGhlbmNlLCB3ZSBoYXZlIGRlY2lkZWQgdG8gcmVtb3ZlIHRoZSBNdXRhdGlvbmFsIHNpZ25hdHVyZXMgc2VjdGlvbiBmcm9tIHRoZSBtYW51c2NyaXB0LiAKCiMjIyBDb21tZW50IDMKCioqUTogU3RhdGlzdGljYWwgdGVzdCBpbiBmaWd1cmUgUzRCIGhhcyB0d28gc2FtcGxlcyBpbiB0aGUgY2F0ZWdvcnkgIlNhbWUiIHRoYXQgZG8gbm90IGhhdmUgYSBwYWlyZWQgc2FtcGxlIGluIHRoZSBjYXRlZ29yeSAiRGlmZmVyZW50IjogaG93IGRpZCB0aGUgYXV0aG9ycyBjb21wdXRlIGEgV2lsY294b24gc2lnbmVkLXJhbmsgdGVzdCB3aXRoIHVuZXF1YWwgbnVtYmVyIG9mIHNhbXBsZXMgaW4gZWFjaCBncm91cD8qKgoKV2UgYWNrbm93bGVkZ2UgdGhhdCB0aGlzIG1heSBoYXZlIGJlZW4gY29uZnVzaW5nLiBQYXRpZW50cyB3aXRoIGRhdGEgaW4gb25seSBvbmUgZ3JvdXAgd2VyZSBhbHNvIHBsb3R0ZWQgKGJ1dCBjb3VsZCBub3QgYmUgaW5jbHVkZWQgZm9yIHRoZSBzdGF0aXN0aWNhbCB0ZXN0LCBvZiBjb3Vyc2UpLiBUbyByZW1vdmUgYW55IGNvbmZ1c2lvbiBhcm91bmQgdGhpcywgdGhvc2UgcGF0aWVudHMgYXJlIG5vIGxvbmdlciBzaG93bi4gCgpbU3RhdGlzdGljYWwgZXJyYXRhXShgciBub3RlYm9va19yZWxhdGl2ZV9wYXRocyRzdGF0aXN0aWNhbF9lcnJhdGFfcG9zdGhvY2ApCgoqKlE6IFdoYXQgYW5hbHlzaXMgd2FzIHBlcmZvcm1lZCBpbiB0aGUgc2VudGVuY2UgIihwID4gMC4zLCBwZXJtdXRhdGlvbiB0ZXN0LCBGaWd1cmUgUzRCKSIgb24gcGFnZSA2LCB3aGljaCBwZXJtdXRhdGlvbiB0ZXN0PyBGaWd1cmUgUzRCIGlzIG5vdCBhIHBlcm11dGF0aW9uIHRlc3QuKioKCldlIGFwb2xvZ2l6ZSBmb3IgdGhlIG1peC11cCBoZXJlLiBUaGlzIHdhcyBhY3R1YWxseSBhIG5lc3RlZCByYW5rcyB0ZXN0IC0tIHdoaWNoIGludm9sdmVzIHBlcm11dGluZyBJTlNFUlQgLi4uIEl0IGlzIGluY29ycmVjdGx5IG5vdGVkIGFzIGEgV2lsY294b24gc2lnbmVkLXJhbmsgd2l0aGluIHRoZSBsZWdlbmQgb2YgRmlndXJlIFhYLiAKClRvIGFkZHJlc3MgdGhpcywgd2UgaGF2ZSBtb2RpZmllZCB0aGUgbGVnZW5kIG9mIEZpZ3VyZSBYWCB0byByZWZsZWN0IHRoaXMuIAoKKipROiBJbiBmaWd1cmUgUzRBLCB0aGUgY29ycmVsYXRpb24gYmV0d2VlbiAicHJvcG9ydGlvbiBzdWItY2xvbmFsIiBhbmQgImNlbGx1bGFyaXR5IiBpcyBzaWduaWZpY2FudCAocD0wLjAxNjkpLCB5ZXQgaW4gdGhlIG1hbnVzY3JpcHQgdGhlIGF1dGhvcnMgc2F5OiAiYW5kIG5vbmUgb2YgdGhlIGNsb25hbCBtZWFzdXJlcyB3ZXJlIGNvbmZvdW5kZWQgYnkgdHVtb3IgcHVyaXR5IChhbGwgcCA+IDAuMiwgRmlndXJlIFM0QSkiLiBQYWdlIDYuKioKCldlIGFja25vd2xlZGdlIHRoYXQgdGhlIHdvcmRpbmcgaGVyZSBpcyBjb25mdXNpbmcuIFdoYXQgd2UgbWVhbnQgdG8gc2F5IGlzIHRoYXQgbm9uZSBvZiB0aGUgY2xvbmFsbHktZGV0ZXJtaW5lZCBtZWFzdXJlcyAoaS5lLiBub3QgcHJvcG9ydGlvbiBzdWJjbG9uYWwgQ04sIHdoaWNoIGlzIHB1cmVseSBjb3B5IG51bWJlci1iYXNlZCB3aXRob3V0IGFueSBrbm93bGVkZ2Ugb2YgY2xvbmFsIGFyY2hpdGVjdHVyZSBvciBwaHlsb2dlbnkpIHdlcmUgYXNzb2NpYXRlZCB3aXRoIHR1bW91ciBwdXJpdHkuIAoKVG8gYW5zd2VyIHRoZSBxdWVzdGlvbiBvZiB3aHkgcHJvcG9ydGlvbiBzdWJjbG9uYWwgY29weSBudW1iZXIgbWF5IGJlIGFzc29jaWF0ZWQgd2l0aCB0dW1vdXIgcHVyaXR5LCB3ZSBwb2ludCBvdXQgdGhhdCBjb3B5IG51bWJlciBjYWxsaW5nIGluIGhpZ2hseSByZWFycmFuZ2VkIGdlbm9tZXMgKGNvbW1vbiBpbiBIR1NDKSB3aXRoIGxvdyBjb3B5IG51bWJlciBpcyBkaWZmaWN1bHQgZHVlIHRvIGEgbG93ZXIgcHJvcG9ydGlvbiBvZiB0dW1vdXItZGVyaXZlZCByZWFkcyBmb3IgYSBnaXZlbiBzZXF1ZW5jaW5nIGRlcHRoLiAKClRvIGFkZHJlc3MgdGhpcywgd2UgaGF2ZSBjbGFyaWZpZWQgb3VyIHN0YXRlbWVudCBieSBsaXN0aW5nIG91dCBhbGwgdGhlIG1lYXN1cmVzIG5vdCBhc3NvY2lhdGVkIHdpdGggdHVtb3VyIHB1cml0eS4gCgoKKipROiBGaWd1cmUgMUMgZG9lcyBub3Qgc2F5IHdoaWNoIHN0YXRpc3RpY2FsIHRlc3Qgd2FzIHVzZWQsIGFuZCBpZiBhIEtydXNrYWwtV2FsbGlzIHdhcyB1c2VkLCBhIHBvc3QgaG9jIGFuYWx5c2lzIHNob3VsZCBiZSBlbXBsb3llZC4qKgoKVGhpcyBpcyBhIGdvb2QgcG9pbnQuIFRvIGFkZHJlc3MgdGhpcywgd2UndmUgYXR0ZW1wdGVkIHRvIGRvIHBvc3QtaG9jIHRlc3RzIHdoZXJldmVyIGFwcHJvcHJpYXRlLiAKCkZvciBGaWd1cmUgMUMsIHdoaWNoIGlzIGFzc29jaWF0ZWQgd2l0aCBhIEtydXNrYWwtV2FsbGlzIHRlc3QsIHRoZSBtb3N0IGFwcHJvcHJpYXRlIHBvc3QtaG9jIHRlc3QgdG8gdXNlIGlzIHRoZSBEdW5uIHRlc3QgKFJFRikuIAoKW1N0YXRpc3RpY2FsIGVycmF0YV0oYHIgbm90ZWJvb2tfcmVsYXRpdmVfcGF0aHMkc3RhdGlzdGljYWxfZXJyYXRhX3Bvc3Rob2NgKQoKKipROiBTdGF0aXN0aWNhbCBhbmFseXNpcyBvZiA2QiBzaG91bGQgaW5jbHVkZSBwb3N0IGhvYyB0ZXN0LioqCgpXZSd2ZSBhbHNvIGRvbmUgdGhpcyBmb3IgRmlndXJlIDZCLCBzaG93biBiZWxvdy4gQXMgdGhlIE11dGF0aW9uIHNpZ25hdHVyZSBzZWxlY3Rpb24gaGFzIGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSBtYW51c2NyaXB0LCB3ZSBhcmUgbm90IGluY2x1ZGluZyB0aGlzIEZpZ3VyZSBpbiB0aGUgbWFudXNjcmlwdC4gCgpbU3RhdGlzdGljYWwgZXJyYXRhXShgciBub3RlYm9va19yZWxhdGl2ZV9wYXRocyRzdGF0aXN0aWNhbF9lcnJhdGFfcG9zdGhvY2ApCgoqU2VjdGlvbjogRXBpdGhlbGlhbCBDRDgrIFRJTCBhcmUgYXNzb2NpYXRlZCB3aXRoIHN1YmNsb25hbCBuZW9lcGl0b3BlIGVsaW1pbmF0aW9uKgoKIyMjIyBDb21tZW50IDQKCioqUTogUGxvdHMgYW5kIGEgc3VwcGxlbWVudGFyeSB0YWJsZSB3aXRoIHRoZSBuZW9lcGl0b3BlIGRlcGxldGlvbiB2YWx1ZXMgYXJlIHJlcXVpcmVkIGZvciB0aGlzIHNlY3Rpb24uKioKCldlIGFja25vd2xlZGdlIHRoYXQgdGhlc2Ugd291bGQgYmUgaGVscGZ1bC4gVG8gYWRkcmVzcyB0aGlzLCB3ZSBoYXZlIGFkZGVkIHBsb3RzLCBzaG93biBpbiBGaWd1cmUgWFgsIGFuZCB0aGUgYXBwcm9wcmlhdGUgZGF0YSBpbiBTdXBwbGVtZW50YXJ5IFRhYmxlIFhYLiAKClRhYmxlcyBvZiBhbGwgbmVvYW50aWdlbnMsIG5lb2VwaXRvcGVzLCBhbmQgbm9uc3lub255bW91cyBTTlZzIGNhbiBiZSBvYnRhaW5lZCBmcm9tIHRoZSBhdXRob3JzLiAKCltOZW9lZGl0aW5nIGFkZGl0aW9uYWwgYW5hbHlzaXNdKGByIG5vdGVib29rX3JlbGF0aXZlX3BhdGhzJG5lb2VkaXRpbmdfYWRkaXRpb25hbGApCgoKKlNlY3Rpb246IFJlZ2lvbmFsIHZhcmlhdGlvbiBpbiBULWNlbGwgY2xvbm90eXBlcyB0cmFja3Mgd2l0aCB0aGUgc3BhdGlhbCBkaXN0cmlidXRpb24gb2YgdHVtb3IgY2xvbmVzKgoKIyMjIENvbW1lbnQgNQoKKipROiBJdCBpcyBpbnRlcmVzdGluZyB0aGF0ICJUQ1IgZGl2ZXJzaXR5IHdhcyBzdHJvbmdseSBjb3JyZWxhdGVkIHdpdGggSUhDLWJhc2VkIENEOCsgYW5kIENENCsgVElMIGRlbnNpdGllcyIgYmVjYXVzZSBUIGNlbGwgYWN0aXZhdGlvbiBpbiB0aGUgcmlnaHQgY29uZGl0aW9ucyB3b3VsZCBsZWFkIHRvIGNsb25hbCBleHBhbnNpb24gYW5kIGhpZ2hlciBUIGNlbGwgZGVuc2l0eSwgYnV0IHdvdWxkIHJlZHVjZSBUSUwgZGl2ZXJzaXR5LiBTdGFja2VkIGJhciBwbG90cyB3aXRoIHRoZSB0b3AgNSBUQ1IgY2xvbm90eXBlcyBzaG93aW5nIHRoZWlyIHByb3BvcnRpb24gaW4gdGhlIFQgY2VsbCBwb3B1bGF0aW9uIHdvdWxkIGJlIHJlcXVpcmVkIHRvIGNvcnJvYm9yYXRlIHdoZXRoZXIgaGlnaGVyIGRlbnNpdHkgaXMgYWNjb21wYW5pZWQgd2l0aCBjbG9uYWwgZXhwYW5zaW9uIG9yIG5vdCwgYW5kIGhvdyB0aGF0IHJlbGF0ZXMgdG8gdGhlIGRpdmVyc2l0eSBtZXRyaWNzIHVzZWQgYnkgdGhlIGF1dGhvcnMuKioKCltUSUwgZGVuc2l0eSAtIFhDUiBleHBhbnNpb24gYW5hbHlzaXNdKGByIG5vdGVib29rX3JlbGF0aXZlX3BhdGhzJHRpbGRlbnNpdHlfeGNyZXhwYW5zaW9uYCkKCgojIyMgQ29tbWVudCA2CgoqKlE6IEZvciBmaWd1cmVzIFM1QS1CIHRoZSBzdGF0aXN0aWNhbCB0ZXN0IHVzZWQgaXMgbm90IG1lbnRpb25lZCBhbnl3aGVyZS4qKgoKVGhlc2Ugd2VyZSBwYWlyZWQgV2lsY294b24gKFdpbGNveG9uIHNpZ25lZC1yYW5rKSB0ZXN0cy4gVGhleSBhcmUgbm93IGNvcnJlY3RlZCB0byBEdW5uIHRlc3RzIChmb3IgdGhlIHBhaXJ3aXNlIGNvbXBhcmlzb25zIHBvc3QtaG9jKTsgd2l0aCB0aGUgS3J1c2thbC1XYWxsaXMgcC12YWx1ZSBzaG93biBhbmQgdGhlIER1bm4gc2lnbmlmaWNhbmNlIGluZGljYXRlZCBieSBhc3Rlcmlza3MuIAoKKipROiBBbHNvIHRoZSBhdXRob3JzIHNob3VsZCBjb25zaWRlciBpZiB0aGlzIGNvdWxkIGJlIGp1c3QgYW4gYXJ0aWZhY3QsIGJlY2F1c2UgaW5maWx0cmF0ZWQgdHVtb3JzIGhhdmUgbXVjaCBtb3JlIFRDUnMgdG8gYmUgc2VxdWVuY2VkLCB0aHVzIGl0IGNvdWxkIGJlIHRoYXQgcmFyZSBUQ1JzIGFyZSBtaXNzZWQsIHdoaWxlIGluIG5vbi1pbmZpbHRyYXRlZCB0dW1vcnMsIG1vc3QgVENScyB3b3VsZCBiZSBzZXF1ZW5jZWQuIEFsc28sIHdoYXQgaXMgdGhlIHBvaW50IGFuZCBjb25jbHVzaW9uIG9mIHRoaXMgYW5hbHlzaXM/KioKCk5haXZlbHksIGlmIGl0IHdhcyB0cnVlIHRoYXQgbGVzcyBpbmZpbHRyYXRlZCB0dW1vdXJzIGhhdmUgbW9yZSBUQ1JzIHRvIGJlIHNlcXVlbmNlZCwgTi1USUwgdHVtb3VycyBzaG91bGQgYWxzbyBoYXZlIGhpZ2hlciBUQ1IvQkNSIGRpdmVyc2l0eSwgd2hpY2ggaXMgbm90IHRoZSBjYXNlLiAKClRoaXMgaXMgYSB2YWxpZCBwb2ludCBmb3IgRVMtVElMIHZzLiBTLVRJTC4gSXQgY291bGQgYmUgYXJndWVkIHRoYXQgaGF2aW5nIG1vcmUgZXhwYW5kZWQgVElMIHRoYXQgcmVzdWx0IGluIG1pc3NpbmcgZGV0ZWN0aW9uIG9mIHJhcmUgVElMIGNsb25vdHlwZXMgaW4gaGlnaC1USUwgc2FtcGxlcyBpcyBhY3R1YWxseSBzaWduYWwgdGhhdCB3ZSdyZSB0cnlpbmcgdG8gY2FwdHVyZSwgdGhvdWdoLiBJZiB2ZXJ5IHJhcmUgY2xvbm90eXBlcyBhcmUgc3F1ZWV6ZWQgb3V0IGJlY2F1c2Ugd2UgZG9uJ3QgaGF2ZSBlbm91Z2ggcmVhZHMsIHRoYXQgbWVhbnMgdGhhdCB0aGUgY2xvbm90eXBlcyB0aGF0IHdlIGRvIHNlZSBhcmUgZXhwYW5kZWQgcmVsYXRpdmUgdG8gdGhvc2UgLS0gYW5kIHRoaXMgc2hvdWxkIGJlIHF1YW50aWZpZWQgYXMgbGVzcyBkaXZlcnNpdHkuIFRoaXMgd2FzIHRoZSBtb3RpdmF0aW9uIGJlaGluZCB1c2luZyBzcGVjaWVzIGRpdmVyc2l0eSBtZWFzdXJlcyBsaWtlIFNoYW5ub24gZW50cm9weSAoaW4gYWRkaXRpb24gdG8ganVzdCB1c2luZyB1bmlxdWUgY2xvbm90eXBlIGNvdW50KS4gCgpbVElMIGNsdXN0ZXIgLSBYQ1IgZGl2ZXJzaXR5IGFuYWx5c2lzXShgciBub3RlYm9va19yZWxhdGl2ZV9wYXRocyR0aWxjbHVzdGVyX3hjcmRpdmVyc2l0eWApCgoKIyMjIENvbW1lbnQgNwoKKipROiBGb3IgdGhlIHJhcmVseSBvYnNlcnZlZCBUQ1IgY2xvbm90eXBlcyBzaGFyZWQgYmV0d2VlbiBwYXRpZW50cywgaXQgd291bGQgYmUgaW50ZXJlc3RpbmcgdG8gc2VlIGlmICh0aGlzIGFuYWx5c2lzIG1heSBub3QgYmUgcG9zc2libGUgaWYgdGhlcmUgYXJlIHRvbyBmZXcgc2hhcmVkIGNsb25vdHlwZXMpIHRoZXNlIGNsb25vdHlwZXMgYXJlIHN1YmplY3QgdG8gY2xvbmFsIGV4cGFuc2lvbiwgY29ycmVsYXRlIHdpdGggYW55IEJDUiBjbG9uZXMsIGFuZC9vciBhcmUgcHJlc2VudCBpbiBwYXRpZW50cyB3aXRoIHNoYXJlZCBtdXRhdGFpb25zL25lb2VwaXRvcGVzLioqCgoqKlRPRE8qKjogQ2hlY2sgaWYgdGhlcmUncyBzaGFyaW5nIGF0IHRoZSBuZW9FUElUT1BFIGxldmVsLCBub3QganVzdCBhdCB0aGUgbmVvYW50aWdlbiBsZXZlbC4gCgpbUHVibGljIGNsb25vdHlwZSBhbmQgbmVvYW50aWdlbiBhbmFseXNpc10oYHIgbm90ZWJvb2tfcmVsYXRpdmVfcGF0aHMkcHVibGljX2Nsb25vdHlwZXNgKQoKCiMjIyBDb21tZW50IDgKCioqUTogSW4gZmlndXJlIFM1Qy1FLCBob3cgd2FzIHRoZSAidmFyaWF0aW9uIiBjYWxjdWxhdGVkPyBTaG9ydCBleHBsYW5hdGlvbiBpbiBtYW51c2NyaXB0IHNob3VsZCBiZSBhZGRlZC4gQWxzbyB3aGF0IGlzIHRoZSBwb2ludC9oeXBvdGhlc2lzL2NvbmNsdXNpb24gb2YgdGhpcyBhbmFseXNpcz8qKgoKVGhlcmUncyBhIGRlc2NyaXB0aW9uIGluIHRoZSBzdXBwbGVtZW50YWxzIGZvciB0aGlzLiBQZXJoYXBzIHRoaXMgaXNuJ3QgcHJvcGVybHkgcmVmZXJlbmNlZCBpbiB0aGUgbWFpbiB0ZXh0LCBvciB0aGUgcmV2aWV3ZXIgdGhpbmtzIHRoZSBleHBsYW5hdGlvbiBzaG91bGQgYmUgbW92ZWQgdGhlcmU/CgpIb25lc3RseSwgSSdtIGtpbmQgb2YgdW5jb21mb3J0YWJsZSB3aXRoIHRoZSB2YXJpYXRpb24gYW5hbHlzaXMuIE1vc3RseSBiZWNhdXNlIHdlIHBvd2VyLWxhdyBub3JtYWxpemUgZXZlcnl0aGluZyAob3IgbG9nLW5vcm1hbGl6ZSBldmVyeXRoaW5nKSBhbmQgdGhlbiBqdXN0IGNvbXB1dGUgdmFyaWFuY2UgYXMgYSBzaW1wbGUgdmFyaWFuY2UgKGkuZS4gUidzIGB2YXJgKSBjYWxjdWxhdGlvbiBvciBzb21ldGhpbmcgYWxvbmcgdGhvc2UgbGluZXMuIAoKCiMjIyBDb21tZW50IDkKCioqUTogVGhlIHNlbnRlbmNlOiAiRm9yIGV4YW1wbGUsIHdoaWxlIDQgcHJvZmlsZWQgc2FtcGxlcyBmcm9tIHBhdGllbnQgMTAgKFJPdi0xLTQpIGhhZCB1bmlmb3JtbHkgbG93IGV4cHJlc3Npb24gb2YgVCBjZWxsIGFzc29jaWF0ZWQgZ2VuZXMgYW5kIENEOCsgYW5kIENENCsgVElMIGRlbnNpdGllcyAoRmlndXJlIDFCKSwgdGhleSBoYXJib3JlZCBkaXN0aW5jdCBUQ1IgcmVwZXJ0b2lyZXMgKEZpZ3VyZSAzQykiIG9uIHBhZ2UgOC4gSXMgdGhpcyBub3QgZXhwZWN0ZWQ/IEFzIG1lbnRpb25lZCBhYm92ZSwgYW4gaW5jcmVhc2UgVElMIGRlbnNpdHkgd291bGQgYmUgZXhwZWN0ZWQgYWZ0ZXIgVCBjZWxsIGFjdGl2YXRpb24sIHdoaWNoIGxlYWRzIHRvIGNsb25hbCBleHBhbnNpb24sIHdoaWNoIGxlYWRzIHRvIGxvd2VyIFRDUiByZXBlcnRvaXJlIGNvbXBsZXhpdHkgKGhpZ2hlciBzaW1pbGFyaXR5KS4qKgoKCioqUTogRmlndXJlIDNDIGFuZCBTMkUgY291bGQgYmUgc29ydGVkIGJ5IFRDUiBzaW1pbGFyaXR5IGFuZCBUSUwgZGVuc2l0eSBhbmQgZXhwcmVzc2lvbiBkYXRhIGFkZGVkLioqCgoqKlE6IEEgY29ycmVsYXRpb24gYW5hbHlzaXMgY291bGQgYmUgZG9uZSwgbm90IHdpdGggdGhlIHZhcmlhdGlvbiBhY3Jvc3Mgc2l0ZXMsIGJ1dCBiZXR3ZWVuIFRDUiBzaW1pbGFyaXR5IGFuZCBUSUwgZGVuc2l0eS9leHByZXNzaW9uLioqCgpbSW1tdW5lIHZhcmlhdGlvbiBhbmFseXNpc10oYHIgbm90ZWJvb2tfcmVsYXRpdmVfcGF0aHMkaW1tdW5lX3ZhcmlhdGlvbmApCgoKKlNlY3Rpb246IEItY2VsbCBldm9sdXRpb25hcnkgZHluYW1pY3MgcmVjYXBpdHVsYXRlIHBhdHRlcm5zIG9mIGltbXVuZSBpbmZpbHRyYXRpb24qCgojIyMgQ29tbWVudCAxMAoKKipROiBUaGUgY29uY2x1c2lvbjogIlRvZ2V0aGVyLCB0aGVzZSBmaW5kaW5ncyBpbXBseSB0aGF0IHBhdGllbnRzIHdpdGggaGlnaCBlcGl0aGVsaWFsIFRJTCBkZW5zaXRpZXMgbW91bnQgc3BhdGlhbGx5IGhvbW9nZW5vdXMsIGFudGlnZW4tZHJpdmVuIEIgY2VsbCByZXNwb25zZXMuIiBvbiBwYWdlIDkgaW4gYW4gb3ZlciBpbnRlcnByZXRhdGlvbi4qKgoKKipROiBJcyB0aGlzIGltcG9ydGFudCBvciBub3QsIGhvdyBhbmQgd2h5IHdvdWxkIGl0IGJlIGRpZmZlcmVudCBmcm9tIHRoZSBUIGNlbGwgcmVzcG9uc2U/KioKCioqUTogSWYgaXQgaXMgYW50aWdlbi1kcml2ZW4sIHdoeSB0aGVuIEJDUnMgZG8gbm90IGNvcnJlbGF0ZSB3aXRoIGNhbmNlciBjbG9uZXMgYXMgVENScyBkbz8qKgoKKipROiBUaGUgQkNSLVRDUiBpbnRlcmZhY2UgY291bGQgYmUgZXhwbG9yZWQgZnVydGhlciB0aGFuIHdoYXQgd2FzIGRvbmUgaW4gZmlndXJlIDNBLUIsIHRvIGFkZHJlc3MgdGhlIHF1ZXN0aW9ucyBhYm92ZS4qKgoKUmVhbGx5IG5vdCBzdXJlIHdoYXQgcGFydCBvZiB0aGlzIGlzIGFuIGludGVycHJldGF0aW9uLiBBc3N1bWluZyB0aGUgc3BhdGlhbGx5IGhvbW9nZW5lb3VzIHN0dWZmIGlzIG9idmlvdXMgKHdoaWNoIEkgdGhpbmsgaXQgaXMgZnJvbSB0aGUgcGh5bG9nZW9ncmFwaGljIGFuYWx5c2lzKSAtLSBwZXJoYXBzIHRoZXkncmUgcmVmZXJyaW5nIHRvIHRoZSBhbnRpZ2VuLWRyaXZlbiBwYXJ0PyBNYXliZSB3ZSBzaG91bGQgcmV3b3JkIGFzIEJDUi1zZXF1ZW5jZS1iaWFzZWQvZGVwZW5kZW50IGV4cGFuc2lvbj8gVGhhdCBzb3VuZHMgYXdmdWxseSBjbHVua3kgYnV0IGNvbXBsZXRlbHkgYXZvaWRzIG92ZXJpbnRlcnByZXRhdGlvbiwgSSBzdXBwb3NlLiAKCipTZWN0aW9uOiBIaXN0b2xvZ2ljIGludGVyYWN0aW9uIHRvcG9sb2dpZXMgb2YgVElMIGFuZCB0dW1vciBjZWxscyoKCiMjIyBDb21tZW50IDExIGFuZCAxMgoKKipROiBUaGUgc2VudGVuY2U6ICJXZSBoeXBvdGhlc2l6ZWQgdGhhdCB0aGUgZXh0ZW50IG9mIHNwYXRpYWwgY28tbG9jYWxpemF0aW9uIGJldHdlZW4gY2FuY2VyIGFuZCBpbW11bmUgY2VsbHMgd291bGQgYmUgZ3JlYXRlc3QgaW4gc2FtcGxlcyB3aXRoIGhpZ2ggZXBpdGhlbGlhbCBUSUwgZGVuc2l0eSIgc2VlbXMgdG8gYmUgdHJpdmlhbC4gVGhpcyBjYW5ub3QgYmUgYSBoeXBvdGhlc2lzOyBpbnN0ZWFkIGl0IHNlZW1zIHRvIGJlIGEgdmFsaWRhdGlvbiBvZiB0aGUgdHJhaW5lZCBhbGdvcml0aG0uKioKCioqUTogT24gcGFnZSAxMDogIlRodXMsIG91ciByZXN1bHRzIHByb3ZpZGUgZXZpZGVuY2Ugb2YgbG9jYWxpemVkIGludGVyYWN0aW9uIGluIHNpdHUgYmV0d2VlbiBjYW5jZXIgY2VsbHMgYW5kIFRJTCBpbiBFUy1USUwgdHVtb3JzIi4gVGhlIGFuYWx5c2lzIHBlcmZvcm1lZCBoZXJlIGlzIGNpcmN1bGFyIGFuZCB0aGUgY29uY2x1c2lvbiBpcyB0cml2aWFsOiB0aGUgYXV0aG9ycyBmaW5kIG1vcmUgZXBpdGhlbGlhbCBUSUxzIChiYXNlZCBvbiB0aGUgSCZFIGFsZ29yaXRobSkgd2hlcmUgdGhleSBzZWUgbW9yZSBlcGl0aGVsaWFsIFRJTHMgKElIQyBjb3VudHMpLiBJZiB0aGUgYXV0aG9ycyBoYXZlIHRoZSBJSEMgc2VjdGlvbnMgKHdoaWNoIHRoZXkgZG8gbm90IHNob3cpLCB3aGF0IGlzIHRoZSBuZWVkIHRvIHVzZSB0aGUgSCZFIGltYWdlcz8gSWYgYW55dGhpbmcsIHRoZSBIJkUgYmFzZWQgYWxnb3JpdGhtIGNhbiBiZSB1c2VkIGFzIGEgc2NvcmUgaW4gdGhlIGNsdXN0ZXJncmFtIG9mIGZpZ3VyZSAxQi4gQSB3aG9sZSBmaWd1cmUgZm9yIHRoaXMgaXMgbm90IG5lZWRlZC4gQmVzaWRlcywgZmMsIGZpIGFuZCBmY2kgYXJlIGFsbCByZWxhdGVkIG1lYXN1cmVzIGFuZCBub3QgaW5kZXBlbmRlbnRseSB2YWxpZGF0aW5nIHRoZWlyIGFwcHJvYWNoLCBhbmQgZnVydGhlcm1vcmUsIHRoZSBLcnVza2FsLVdhbGxpcyB0ZXN0IGxhY2tzIGEgcG9zdCBob2MgdGVzdC4qKgoKRG9lcyBoaWdobGlnaHRpbmcgdGhlIGZhY3QgdGhhdCB3ZSdyZSBsb29raW5nIGF0IEhPVFNQT1RTLCBub3QganVzdCB3aGVyZSB0aGUgY2VsbHMgYXJlLCBhZGRyZXNzIHRoZXNlIGNvbW1lbnRzPyBJIHRoaW5rIGl0IGRvZXMsIGJ1dCBvbmx5IHBhcnRpYWxseSAtLSBzaW5jZSBlcGl0aGVsaWFsIGFyZWFzIGFyZSBmYXIgbW9yZSBsaWtlbHkgdG8gYmUgY2FuY2VyIGNlbGwgaG90c3BvdHMuIFRoZSBtaXNzaW5nIGluZ3JlZGllbnQgaXMgdGhhdCB3ZSBkb24ndCBkbyBob3RzcG90IGFuYWx5c2lzIFdJVEhJTiBlcGl0aGVsaWFsIGFuZCBzdHJvbWFsIHJlZ2lvbnMgKGJ1dCB3ZSdkIGhhdmUgdG8gY29tZSB1cCB3aXRoIGEgd2F5IHRvIGRldGVybWluZSB0aG9zZSBib3VuZHMgZnJvbSBIJkUgZGF0YSkuIFRob3VnaHRzPyAKCipTZWN0aW9uOiBNdXRhdGlvbiBzaWduYXR1cmUgY29ycmVsYXRlcyBvZiBpbW11bmUgYWN0aXZpdHkqCgojIyMgQ29tbWVudCAxMwoKKipROiBUaGUgYW5hbHlzaXMgaW4gZmlndXJlIDZCIHNob3VsZCB0YWtlIGludG8gYWNjb3VudCBtdXRhdGlvbmFsIGxvYWQgYXMgdGhhdCBjb3VsZCBhbiBpbXBvcnRhbnQgY29udHJpYnV0aW5nIGZhY3RvciBiZWhpbmQgdGhlIGRpZmZlcmVuY2VzIGJldHdlZW4gdGhlIEhSRCBhbmQgRkJJIHR1bW9ycy4qKgoKV2UncmUgbW92aW5nIHRoZSBtdXRhdGlvbiBzaWduYXR1cmVzIHNlY3Rpb24gLS0gdGhpcyBjb21tZW50IHdpbGwgbm90IGJlIHJlbGV2YW50LgoKIyMjIENvbW1lbnQgMTQKCioqUTogSSB3b3VsZCBlbmNvdXJhZ2UgdGhlIGF1dGhvcnMgdG8gZGlzY3VzcyBmdXJ0aGVyIHdoeSB0aGV5IHNlZSBpbW11bm9lZGl0aW5nIGluIHRoZSBzdWJjbG9uYWwgbmVvZXBpdG9wZSBzZXQgYW5kIG5vdCBpbiB0aGUgY2xvbmFsIG9uZSwgYW5kIHdoYXQgYXJlIHRoZSBpbXBsaWNhdGlvbnMgZm9yIGltbXVub3RoZXJhcHkuIEhvd2V2ZXIsIGFzIHRoZXkgZG8gbm90IHNob3cgZmlndXJlcyBvZiB0aGUgaW1tdW5vZWRpdGluZyBhbmFseXNpcywgaXQgaXMgZGlmZmljdWx0IHRvIGFzc2VzcyB0aGUgdmVyYWNpdHkgYW5kIG1hZ25pdHVkZSBvZiB0aGlzIGZpbmRpbmcuKioKClRoaXMgcmVxdWlyZXMgYSBkZXRhaWxlZCBhbnN3ZXIuIEJ1dCBmb3Igbm93LCBJJ2xsIG5vdGUgdGhhdCBvdXIgcmVzdWx0cyBkb24ndCBwcmVjbHVkZSBuZW9hbnRpZ2VuIGVkaXRpbmcgYXQgb3RoZXIgbGV2ZWxzLCBlLmcuIHRyYW5zY3JpcHRvbWljLCBhY3Rpbmcgb24gY2xvbmFsIG5lb2FudGlnZW5zLiAKCiMjIyBDb21tZW50IDE1CgoqKlE6IFRoZSBwYXJhZ3JhcGggcmVnYXJkaW5nIHRoZSBtdXRhdGlvbmFsIHNpZ25hdHVyZXMgYW5kIHRoZSBpbW11bmUgYXNzb2NpYXRpb24gc2hvdWxkIGNvbnNpZGVyIGEgbW9yZSBpbiBkZXB0aCBpbnRlcnByZXRhdGlvbiBhbmQgZGlzY3Vzc2luZyB0aGUgcGFwZXIgYnkgRGF2b2xpIGV0IGFsLiBTY2llbmNlIDIwMTcgKERPSTogMTAuMTEyNi9zY2llbmNlLmFhZjgzOTkpIHdoZXJlIGFzc29jaWF0aW9ucyBiZXR3ZWVuIHR1bW9yIGFuZXVwbG9pZHkgYW5kIGltbXVuZSBldmFzaW9uIGlzIGFuYWx5emVkIGluIHZhcmlvdXMgY2FuY2VyIHR5cGVzLiBBbHNvIHRoZSBwYXBlcnMgYnkgU21pZCBldCBhbC4gTmF0LiBDb21tLiAyMDE2IChET0k6IDEwLjEwMzgvbmNvbW1zMTI5MTApIGFuZCBDb25ub3IgZXQgYWwuIEpBTUEgMjAxNyAoRE9JOiAxMC4xMDAxL2phbWFvbmNvbC4yMDE2LjM5MTYpIHNob3VsZCBiZSBjb25zaWRlcmVkIGZvciBkaXNjdXNzaW9uIG9mIHRoaXMgc2VjdGlvbi4gQ2F1c2FsIG1lY2hhbmlzdGljIGluc2lnaHRzIG9mIHRoZSBhc3NvY2lhdGlvbnMgb2JzZXJ2ZWQgc2hvdWxkIGJlIGF0IGxlYXN0IHByb3Bvc2VkIG9yIGh5cG90aGVzaXplZCwgaWRlYWxseSBiYXNlZCBvbiBleHBlcmltZW50YWwgZGF0YSBmcm9tIHRoaXMgb3Igb3RoZXIgc3R1ZGllcy4qKgoKTXkgcGVyc29uYWwgb3BpbmlvbnMgb24gdGhlIGxhY2sgb2Ygc3RhdGlzdGljYWwgcmlnb3IgaW4gdGhlIERhdm9saSBwYXBlciBhc2lkZSAoKyB0aGUgc3VzcGVjdCBjb25mb3VuZGluZyBlZmZlY3RzIG9mIHR1bW91ciBwdXJpdHkpLCB0aGlzIHdpbGwgbm8gbG9uZ2VyIGJlIHJlbGV2YW50IGFmdGVyIGV4Y2x1ZGluZyB0aGUgbXV0YXRpb24gc2lnbmF0dXJlcyBzZWN0aW9uLiBCdXQgcGVyaGFwcyB0aGlzIGlzIHNvbWV0aGluZyB0byB0aGluayBhYm91dCBmb3IgYWRkaW5nIHRvIHRoZSBtdXRhdGlvbmFsIHNpZ25hdHVyZXMgd29yaz8gCgojIyMgQ29tbWVudCAxNgoKKipROiBUaGUgb3JkZXIgaW4gd2hpY2ggdGhlIGZpZ3VyZXMgYXJlIG1lbnRpb25lZCBpbiB0aGUgdGV4dCBpcyB2ZXJ5IGRpc29yZ2FuaXplZCwgd2hpY2ggbWFrZXMgaXQgZGlmZmljdWx0IHRvIHJlYWQgYW5kIGZvbGxvdyB0aGUgcGFwZXIuIFRoZSBhdXRob3JzIHNob3VsZCBtYWtlIGFuIGVmZm9ydCB0byBvcmdhbml6ZSB0aGUgZmlndXJlcyBpbiBhIHNpbWlsYXIgb3JkZXIgdG8gd2hpY2ggdGhleSBhcmUgbWVudGlvbmVkIGluIHRoZSB0ZXh0LioqCgpJIGFzc3VtZSB0aGV5J3JlIHJlZmVycmluZyB0byB0aGUgc3VwcGxlbWVudGFsIGZpZ3VyZXMgYmVpbmcgb3V0IG9mIG9yZGVyPyBPciBhcmUgdGhlIG1haW4gZmlndXJlcyBhbHNvIG91dCBvZiBvcmRlcj8gCgojIyMgTWlub3IgY29tbWVudDogVGl0bGUKCioqUTogVGhlIHdvcmQgImltbXVub2xvZ2ljIiBjb3VsZCBiZSBjaGFuZ2VkIHRvICJseW1waG9jeXRpYyIsIHRvIGJlIG1vcmUgcHJlY2lzZS4qKgoKCiMjIyBNaW5vciBjb21tZW50OiBTdW1tYXJ5CgpTdW1tYXJ5CgoqKmEpIFdyaXRlIHRoZSBpbW11bm9sb2dpYyByZXNwb25zZSBjYXRlZ29yaWVzIGRlZmluZWQuKioKCioqYikgV3JpdGUgdGhhdCBUSUwgImRlbnNpdHkiIHdhcyBpbnZlcnNlbHkgYXNzb2NpYXRlZC4qKgoKKipjKSBUaGUgbGFzdCBzZW50ZW5jZSBvZiB0aGUgc3VtbWFyeSBpcyB2ZXJ5IHZhZ3VlOiAiVGh1cywgcmVnaW9uYWwgdmFyaWF0aW9uIGluIGltbXVuZSBjb250ZXh0dXJlIG1pcnJvcnMgdGhlIHBhdHRlcm4gb2YgaW50cmFwZXJpdG9uZWFsIG1hbGlnbmFudCBzcHJlYWQiLiBUaGlzIHdhcyBvYnNlcnZlZCBpbiBubyBtb3JlIHRoYW4gaGFsZiBvZiB0aGUgcGF0aWVudHMuKioKClBlcmhhcHMgYWRkLCDigJhpbiBwYXRpZW50cyB3aXRoIGV4dGVuc2l2ZSBUSUwgaW5maWx0cmF0ZeKAmSBvciBzb21ldGhpbmcgc2ltaWxhcj8KCioqZCkgInByb3Zva2luZyBuZXcgcGVyc3BlY3RpdmVzIGZvciB0cmVhdG1lbnQgb2YgdGhpcyBjaGFsbGVuZ2luZyBkaXNlYXNlIi4gV2hpY2ggcGVyc3BlY3RpdmVzPyoqCgoKIyMjIE1pbm9yIGNvbW1lbnQ6IFJlc3VsdHMKCipTZWN0aW9uOiBJbnRyYXR1bW9yYWwgaGV0ZXJvZ2VuZWl0eSBpcyBsb3dlc3QgaW4gdHVtb3JzIHdpdGggaGlnaCBlcGl0aGVsaWFsIGx5bXBob2N5dGUgaW5maWx0cmF0aW9uKgoKKiphKSBGb3IgZmlndXJlIDIgYSBkaWFncmFtIGV4cGxhaW5pbmcgaG93IHRvIGludGVycHJldCBlYWNoIHBsb3Qgd291bGQgYmUgdmVyeSB1c2VmdWwuKioKClRoaXMgaXMgYSBnb29kIGlkZWEgLS0gd2UgY291bGQgcHV0IHRoaXMgYXMgdGhlIGZpcnN0IFhDUi1tYXBzY2FwZSBwbG90LCBzaGlmdCBldmVyeXRoaW5nIG92ZXIgb25lLCBhbmQgcHV0IHRoZSBjbG9ub3R5cGUgcHVibGljaXR5IGxlZ2VuZCBhdCB0aGUgdG9wL3NpZGUuIApPciBwZXJoYXBzIGJldHRlciwganVzdCBhbm5vdGF0ZSBvbmUgb2YgdGhlIHBsb3RzLiAKCioqYikgV2h5IGRvZXMgcGF0aWVudCA3IGhhdmUgbW9yZSBjYW5jZXIgY2xvbmVzIGluIHRoZSBwaHlsb2dlbnkgdGhhbiBpbiB0aGUgcGllIGNoYXJ0cz8qKgoKU3VmZmljaWVudCBxdWFsaXR5IFJOQSAoUklOID49IDcgZnJvbSBOYW5vZHJvcCkgd2FzIG5vdCBvYnRhaW5lZCBmb3IgdGhlIHNhbXBsZSB0aGF0IGNvbnRhaW5lZCB0aG9zZSBjbG9uZXMgKEJybk07IGNoZWNrIFJJTiB2YWx1ZSwgaXQgd2FzIHJlYWxseSBsb3cpLiBBcyBhIHJlc3VsdCBpdCBkaWQgbm90IGhhdmUgVENSL0JDUi1zZXEgZGF0YSBhbmQgd2FzIGV4Y2x1ZGVkIGZyb20gRmlnIDIuIEZvciBjb21wbGV0ZW5lc3MsIHRoZSBjbG9uYWwgY29tcG9zaXRpb24gb2YgQnJuTSwgYWxvbmcgd2l0aCBhZGRpdGlvbmFsIGFyY2hpdmFsIHNhbXBsZXMgZm9yIHNldmVyYWwgcGF0aWVudHMsIGlzIHNob3duIGluIEZpZyBTMy4gCgoqKmMpIFR1bW9yIHNpdGUgcGh5bG9nZW5pZXMgd291bGQgYmUgdXNlZnVsIHRvIHZpc3VhbGl6ZSBob3cgdGhlIGNhbmNlciBjbG9uZXMgaGF2ZSBkaXNzZW1pbmF0ZWQgc3BhdGlhbGx5LioqCgpUaGUgY29ycmVjdCB3YXkgdG8gZG8gdGhpcyBpcyB3aXRoIGNsb25hbCBtaWdyYXRpb24gYW5hbHlzaXMgKEJlbiBSYXBoYWVsKSBub3Qgd2l0aCB0dW1vdXIgc2l0ZSBwaHlsb2dlbmllcy4gU2l0ZXMgZG8gbm90IOKAmGV2b2x2ZeKAmSBmcm9tIG9uZSBhbm90aGVyIGFuZCBoZW5jZSBzaG91bGQgbm90IGJlIHJlcHJlc2VudGVkIG9uIGEgcGh5bG9nZW5ldGljIHRyZWUuIFdlIGNhbiBwcm92aWRlIG1pZ3JhdGlvbiBhbmFseXNpcyByZXN1bHRzIGhlcmUgYWZ0ZXIgd2UgaGF2ZSB0aGVtLiAKClBvc3RlZCBhdCBodHRwOi8vd3d3LmJjZ3NjLmNhL2Rvd25sb2Fkcy9pbW11bmVfcHJvamVjdC9tYWNoaW5hX3Jlc3VsdHMubmIuaHRtbC4gSG93IHNob3VsZCB3ZSBhZGQgdGhpcyB0byB0aGUgcGFwZXIgdGhvdWdoPyBXZSBjYW4gdHJ5IHRvIGNyYW0gYWxsIDE0IG9mIHRoZSBtaWdyYXRpb24gcGxvdHMgaW50byBvbmUgU3VwcGxlbWVudGFsIEZpZ3VyZSwgYnV0IEnigJltIG5vdCBzdXJlIGlmIHRoYXTigJlsbCBmaXQuIEFkZGl0aW9uYWxseSwgd2UgY2FuIGFkZCBhIHNlbnRlbmNlL3R3byB3aGVuIGludHJvZHVjaW5nIHRoZSByZXN1bHRzIG9mIGNsb25hbCBhbmFseXNpcyBzYXlpbmcgdGhhdCBtb3N0IHBhdGllbnRzIGZvbGxvd2VkIGEgc2ltcGxlIHBhcmFsbGVsIG1vbm8vcG9seWNsb25hbCBzZWVkaW5nIHBhdHRlcm4gd2hpbGUgb25seSAxLTIgZm9sbG93ZWQgYSByZXNlZWRpbmcgcGF0dGVybi4gCgoqKmQpIEFkZCBUSUwgY2F0ZWdvcnkgaW5mb3JtYXRpb24gKE4tVElMLCBTLVRJTCwgRVMtVElMKSB0byBlYWNoIHNhbXBsZSBpbiBmaWd1cmUgMi4qKgoKV2FzIGJlaW5nIGxhenkgaGVyZSwgc28gY2FuIGFkZCB0aGlzLiBTb21lIHNhbXBsZXMgZG8gbm90IGhhdmUgdGhpcyBpbmZvcm1hdGlvbiwgdGhvdWdoLiAKCipTZWN0aW9uOiBFcGl0aGVsaWFsIENEOCsgVElMIGFyZSBhc3NvY2lhdGVkIHdpdGggc3ViY2xvbmFsIG5lb2VwaXRvcGUgZWxpbWluYXRpb24qCgoqKmEpIERpZmZlcmVudCBITEFzIGhhdmUgZGlmZmVyZW50IEhMQSBiaW5kaW5nIGFmZmluaXRpZXMsIHRodXMgSExBIHNwZWNpZmljIGJpbmRpbmcgY3V0LW9mZnMgY291bGQgYmUgYSBiZXR0ZXIgYXBwcm9hY2ggZm9yIHRoZSBwcmVkaWN0aW9uIG9mIG5lby1lcGl0b3Blcy4gaHR0cHM6Ly9oZWxwLmllZGIub3JnL2hjL2VuLXVzL2FydGljbGVzLzExNDA5NDE1MTgxMS1TZWxlY3RpbmctdGhyZXNob2xkcy1jdXQtb2Zmcy1mb3ItTUhDLWNsYXNzLUktYW5kLUlJLWJpbmRpbmctcHJlZGljdGlvbnMqKgoKV2hpbGUgdGhpcyBpcyBhIGdvb2QgaWRlYSwgdW5mb3J0dW5hdGVseSBtYW55IG9mIG91ciBITEEgYWxsZWxlcyAofjUwJSBvZiB1bmlxdWUgYWxsZWxlcykgYXJlIG5vdCBwcmVzZW50IGluIHRoaXMgbGlzdCwgd2hpY2ggb25seSBpbmNsdWRlcyAzOCBvZiB0aGUgbW9zdCBjb21tb24gSExBLUEgYW5kIEIgYWxsZWxlcyAoYW5kIG5vIEhMQS1DIGFsbGVsZXMpLiBJdCB3b3VsZCBiZSB1bmZhaXIgdG8gdXNlIGRpZmZlcmVudCBzdGFuZGFyZHMgdG8gZGV0ZXJtaW5lIGN1dG9mZnMgZm9yIGRpZmZlcmVudCBhbGxlbGVzLiAKCioqYikgQSBwZXJtdXRhdGlvbiBhcHByb2FjaCB0byBjb21wYXJlIHR1bW9yIHNhbXBsZXMgd2l0aGluIHBhdGllbnRzIHdvdWxkIGJlIGludGVyZXN0aW5nIHRvIHRlc3QuKioKCldoYXQgd291bGQgd2UgYmUgcGVybXV0aW5nIGhlcmU/PyBDZXJ0YWlubHkgc2hvdWxkbuKAmXQgYmUgSExBIGdlbm90eXBlcyAtLSBmb3IgdGhlIG1vc3QgcGFydCB0aGV54oCZcmUgdGhlIHNhbWUhIAoKVGhvdWdodHMgZXZlcnlvbmU/CgoqKmMpIFRoZSBSIGZvcm11bGFzIHVzZWQgZm9yIHRoZSBnZW5lcmFsaXplZCBsaW5lYXIgbWl4ZWQgbW9kZWwgc2hvdWxkIGJlIGFsc28gc2hvd24gaW4gdGhlIG1ldGhvZHMuKioKCkVhc2lseSBkb25lLiAKCioqZCkgRXZpZGVuY2Ugb2YgaW1tdW5vZWRpdGluZyBpcyBhIGJpZyBjbGFpbSBhbmQgbmVlZHMgY29ycm9ib3JhdGl2ZSBldmlkZW5jZSBmcm9tIGFkZGl0aW9uYWwgZGF0YXNldHMuKioKCkFuZC9vciBhZGRpdGlvbmFsIGxpbmVzIG9mIGV2aWRlbmNlIGZyb20gdGhlIHNhbWUgZGF0YXNldCwgZS5nLiBMT0hITEE/IApUaGUgaXNzdWUgd2l0aCB1c2luZyBhZGRpdGlvbmFsIGRhdGFzZXRzIGlzIHRoYXQgdGhlIGNvcnJlbGF0aW9uIGJldHdlZW4gc3ViY2xvbmFsIG5lb2VwaXRvcGUgZWxpbWluYXRpb24gYW5kIGVwaXRoZWxpYWwgQ0Q4KyBUSUwgZGVuc2l0eSByZXF1aXJlcyB0aGUgdXNlIG9mIHBhdGllbnQgYXMgYSByYW5kb20gZWZmZWN0IChpLmUuIHRoZSBtYWduaXR1ZGUgb2YgdGhpcyBlZmZlY3QgaXMgdmFyaWFibGUgYmV0d2VlbiBwYXRpZW50cykuIEhlbmNlLCB0aGlzIHJlcXVpcmVzIGEgSEdTQyBkYXRhc2V0IChvdGhlciBjYW5jZXJzIHdvdWxkIGJlIG91dCBvZiBzY29wZSkgd2l0aCBzZXF1ZW5jaW5nIGRhdGEgYXR0YWluYWJsZSBmcm9tIG11bHRpcGxlIHNpdGVzICsgaW1tdW5lIGRhdGEgYXZhaWxhYmxlLiBUbyBvdXIga25vd2xlZGdlLCB0aGVyZSBpcyBubyBvdGhlciBkYXRhc2V0IHdpdGggdGhpcz8KCipTZWN0aW9uOiBSZWdpb25hbCB2YXJpYXRpb24gaW4gVC1jZWxsIGNsb25vdHlwZXMgdHJhY2tzIHdpdGggdGhlIHNwYXRpYWwgZGlzdHJpYnV0aW9uIG9mIHR1bW9yIGNsb25lcyoKCioqYSkgVGhlIHNlbnRlbmNlOiAiU2ltaWxhcmx5LCBCQ1IgZGl2ZXJzaXR5IHdhcyBzaWduaWZpY2FudGx5IGNvcnJlbGF0ZWQgd2l0aCBDRDIwKyBhbmQgcGxhc21hIGNlbGwgZGVuc2l0aWVzIChhbGwgU3BlYXJtYW4gcCA8IDAuMDAxLCBGaWd1cmUgUzJEKS4iIHNob3VsZCBiZSBtb3JlIHNwZWNpZmljLCBiZWNhdXNlIGluIGZpZ3VyZSBTMkQgdGhlIFNoYW5ub24gZW50cm9weSBoYXMgYSBjb3JyZWxhdGlvbiBwLXZhbHVlID0gMC4wMjEuKioKClJpZ2h0LiBUaGlzIHdhcyByZWZlcnJpbmcgdG8gdGhlIHVuaXF1ZSBjbG9ub3R5cGUgY291bnQgc3BlY2lmaWNhbGx5LiBUaGlzIGNhbiBiZSBzcGVjaWZpZWQsIG9yIHRoZSBwLXZhbHVlIGluIHRoZSB0ZXh0IGNoYW5nZWQuIAoKKipiKSBGaWd1cmUgUzJFLCBTMkYgY291bGQgYmUgYWRkZWQgdG8gZmlndXJlIDMuKioKClNvdW5kcyBsaWtlIGEgZ29vZCBpZGVhLiBDYW4gZG8gdGhpcy4gQW5vdGhlciByZXZpZXdlciBzdWdnZXN0ZWQgc29tZXRoaW5nIHJlbGF0ZWQuIAoKKipjKSBIb3cgd2FzIFRDUiBzaW1pbGFyaXR5IGNhbGN1bGF0ZWQ/IEEgc2hvcnQgc2VudGVuY2UgZGVzY3JpYmluZyBob3cgdGhlIG1lYXN1cmVtZW50IGlzIGRvbmUgd2hlbiBpcyBub3Qgb2J2aW91cyBzaG91bGQgYmUgYWRkZWQgKHRoaXMgbGFjayBvZiBjbGFyaXR5IGhhcHBlbnMgdGhyb3VnaG91dCB0aGUgbWFudXNjcmlwdCkuKioKClRoaXMgaXMgZGVzY3JpYmVkIGluIHRoZSBzdXBwbGVtZW50YXJ5IG1ldGhvZHMsIHNob3VsZCBjbGFyaWZ5IHdpdGggYXBwcm9wcmlhdGUgcmVmZXJlbmNlIHRvIHN1cCBtZXRob2RzIGFuZCBsaW5rIHRoZSBmb3JtdWxhIHNob3duIGluIHN1cCBtZXRob2RzIGhlcmUuIAoKKipkKSBUaGUgc2VudGVuY2U6ICJUaHVzLCBoaWdoZXIgcmVzb2x1dGlvbiBjbG9ub3R5cGUgbWVhc3VyZW1lbnRzIGNhcnJpZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiB0aGFuIGNvdWxkIGJlIGFzY2VydGFpbmVkIGJ5IFRJTCBkZW5zaXRpZXMgYWxvbmUiLiBUaGlzIHNlbnRlbmNlIGlzIHRvbyBvYnZpb3VzIHRvIGJlIHVzZWQgYXMgYSBjb25jbHVkaW5nIHN0YXRlbWVudC4gVGhlIGF1dGhvcnMgc2hvdWxkIGNvbnNpZGVyIHJlbW92aW5nIGNvbXBsZXRlbHkgdGhpcyBzZW50ZW5jZSBhbmQgdHJ5aW5nIHRvIGdldCBtb3JlIGJpb2xvZ2ljYWwgaW5zaWdodHMgZnJvbSB0aGVpciBwcmV2aW91cyBhbmFseXNpcyBhcyBzdWdnZXN0ZWQgYWJvdmUuKioKCgoqKmUpIFRoZSBhbmFseXNpcyBvbiBmaWd1cmUgM0QgY291bGQgYmUgcGVyZm9ybWVkIHVzaW5nIGFsbCBzYW1wbGVzIChub3Qgb25seSB0aGUgbWVhbiksIGFuZCBjb3VsZCBiZSBkb25lIGFsc28gZm9yIEJDUi4qKgoKVGhlcmUgYXJlIHN0YXRpc3RpY2FsIGlzc3VlcyB3aXRoIHRoaXMgYXBwcm9hY2guIERvaW5nIHRoaXMgd2l0aCBhbGwgc2FtcGxlcyBpbnRyb2R1Y2VzICgxKSBwYXRpZW50IGFzIGEgcmFuZG9tIGVmZmVjdDsgYW5kICgyKSBkZXBlbmRlbmN5IGJldHdlZW4gc2ltaWxhcml0eSB2YWx1ZXMgd2l0aGluIGVhY2ggcGF0aWVudCAoVENSIHJlcGVydG9pcmUgc2ltaWxhcml0eSBpcyBjb21wdXRlZCBiZXR3ZWVuIGFsbCBzYW1wbGUgcGFpcnMsIGFuZCB0aGVzZSB2YWx1ZXMgYXJlIHRoZXJlZm9yZSBkZXBlbmRlbnQgb24gb25lIGFub3RoZXIpLiBJZiBpdCBtYWtlcyB0aGUgcmV2aWV3ZXJzIGhhcHB5IHdlIGNhbiBpbmNsdWRlIGEgcGxvdCBzaG93aW5nIHRoaXMsIGJ1dCB3aXRob3V0IGEgUC12YWx1ZSAob3Igd2UgY291bGQgdHJ5IHRvIGZpZ3VyZSBvdXQgaG93IHRvIHJvYnVzdGx5IGNvbXB1dGUgc2lnbmlmaWNhbmNlKS4gClNpbWlsYXIgcGxvdHMgZm9yIEJDUnMgY291bGQgYmUgc2hvd24sIGVpdGhlciBoZXJlIG9yIGluIHN1cHBsZW1lbnRhbHMuIApBIG1vcmUgcHJlc3NpbmcgaXNzdWUgaXMgdGhhdCB3ZSBhcmUgaW50ZXJlc3RlZCBpbiB0aGUgdHJlbmRzIEFDUk9TUyBwYXRpZW50cyBoZXJlLCBub3QgaW4gYWNjb3VudGluZyBmb3IgcGF0aWVudCBhcyBhIHJhbmRvbSBlZmZlY3QgYW5kIGxvb2tpbmcgYXQgdGhlIHRyZW5kcyB3aXRoaW4gcGF0aWVudHMuIAoKKipmKSBBbHRob3VnaCBzaWduaWZpY2FudCwgdGhlIGRpZmZlcmVuY2UgaW4gdGhlIGRpc3RyaWJ1dGlvbiBicm9hZG5lc3MgYmV0d2VlbiBDRDQgYW5kIENEOCBpcyB2ZXJ5IHNtYWxsLiBJdCB3b3VsZCBiZSBpbnRlcmVzdGluZyB0byBzZWUgd2hhdCB0aGUgZGlmZmVyZW5jZXMgYXJlIGJldHdlZW4gcGF0aWVudHMgdGhhdCBoYXZlIGEgaGlnaGVyIENEOCsgYnJvYWRuZXNzIGFuZCB0aGUgb25lcyB0aGF0IGhhdmUgaGlnaGVyIENENCsgYnJvYWRuZXNzLioqCgpUcnkgYSBkaWZmZXJlbnQgbWVhc3VyZSBvZiBDRDgrIGJyb2FkbmVzcy9DRDQrIGJyb2FkbmVzcyB0aGF0IGhpZ2hsaWdodHMgdGhlIHByb3BvcnRpb24gb2YgYnJvYWRseSBkaXN0cmlidXRlZCBjbG9ub3R5cGVzIHJhdGhlciB0aGFuIHRoaXMgdGVycmlibGUgbWVhbi4gCgoqKmcpIFRoZSBhbmFseXNpcyBkb25lIG9uIEJDUiBpcyBub3Qgc2hvd246ICJJbiBjb250cmFzdCwgaW50cmFwYXRpZW50IEJDUiBzaW1pbGFyaXR5IHdhcyBub3Qgc2lnbmlmaWNhbnRseSBjb3JyZWxhdGVkIHdpdGggSUhDLWJhc2VkIENEMjArIG9yIHBsYXNtYSBjZWxsIGRlbnNpdHkgKGFsbCBTcGVhcm1hbiBwID4wLjEpIiBvbiBwYWdlIDguIFdoZXJlIGlzIHRoZSBmaWd1cmU/IEFsc28sIHRoaXMgcmVzdWx0IGNvdWxkIGJlIGV4cGVjdGVkIHNpbmNlIEIgY2VsbCBhY3RpdmF0aW9uIGFuZCBleHBhbnNpb24gaGFwcGVucyBpbiB0aGUgbHltcGggbm9kZXMgYW5kIGdlcm1pbmFsIGNlbnRlcnMsIHdoaWNoIHNob3VsZCBiZSBtZW50aW9uZWQgYW5kIGRpc2N1c3NlZCBmdXJ0aGVyLioqCgoKKipoKSBGaWd1cmVzIDIgYW5kIFMzIGNvdWxkIGJlIHN1bW1hcml6ZWQgaW4gYmFyIHBsb3RzIG9yIGJveCBwbG90cywgdXNpbmcgdGhlIE1hbnRlbCdzIHAtdmFsdWVzLiBBbHRob3VnaCB0aGUgY2lyY3VsYXIgcGxvdHMgbG9vayBuaWNlLCB0aGV5IGFyZSBkaWZmaWN1bHQgdG8gcGFyc2UgYW5kIGluIHRoZSBlbmQsIHRoZXkgYXJlIG5vdCBwYXJ0aWN1bGFyeSBpbmZvcm1hdGl2ZS4gSSB3b3VsZCBzdWdnZXN0IHRvIGhhdmUgYSBzdW1tYXJpemVkIGZpZ3VyZSBmb3IgVENSIGFuZCBCQ1IgdGhhdCBjb252ZXlzIHRoZSBtZXNzYWdlIHdpdGggYSBjb3VwbGUgb2YgZXhhbXBsZXMgb2YgdGhlIGNpcmN1bGFyIHBsb3RzIGFuZCB0aGUgcmVzdCBpbiB0aGUgc3VwcGxlbWVudGFyeS4qKgoKUGVyaGFwcyBpbmNsdWRlIGEgTWFudGVsIGNvcnJlbG9ncmFtLWxpa2UgcGxvdCAtLSBidXQgaW5zdGVhZCBvZiBoYXZpbmcgZGlzdGFuY2VzIG9uIHRoZSB4LWF4aXMsIGhhdmUgcGF0aWVudCBudW1iZXIsIG9yZGVyZWQgYnkgZXBpdGhlbGlhbCBDRDgrIFRJTCBkZW5zaXR5PyBQb3RlbnRpYWxseSBleGNsdWRlIHBhdGllbnQgMTEgYmVjYXVzZSBpdCBvbmx5IGhhcyAzIHNhbXBsZXMgKGFuZCBzb21lIG9mIHRoZXNlIGFyZSB0ZW1wb3JhbCAtLSBzbyB0aGV5IHNob3VsZCByZWFsbHkgYmUgZXhjbHVkZWQpLiAKCipTZWN0aW9uOiBCLWNlbGwgZXZvbHV0aW9uYXJ5IGR5bmFtaWNzIHJlY2FwaXR1bGF0ZSBwYXR0ZXJucyBvZiBpbW11bmUgaW5maWx0cmF0aW9uKgoKKiphKSBJbnN0ZWFkIG9mICJ0aGUgYWJzZW5jZSBvZiBzcGF0aWFsIHRyYWNraW5nIGJldHdlZW4gQiBjZWxscyBhbmQgdHVtb3IgY2xvbmVzIGltcGxpZXMgdGhhdCBCIGNlbGxzIG1pZ2h0IHJlY29nbml6ZSBhbnRpZ2VucyB3aXRoIGEgbW9yZSBob21vZ2VuZW91cyBzcGF0aWFsIGRpc3RyaWJ1dGlvbiIgdGhlIGFic2VuY2Ugb2Ygc3BhdGlhbCB0cmFja2luZyBjb3VsZCBiZSBleHBsYWluZWQgYnkgdGhlIGZhY3QgdGhhdCBCIGNlbGxzIGRvIG5vdCByZXF1aXJlIGRpcmVjdCBjb250YWN0IHdpdGggY2FuY2VyIGNlbGxzIGZvciBraWxsaW5nLioqCgpQcm9iYWJseSByZWxhdGVkIHRvIG9uZSBvZiB0aGUgbWFqb3IgY29tbWVudHMgYnkgdGhpcyByZXZpZXdlciAtLSB0aG91Z2h0cz8gUGVyaGFwcyB0aGUgYXBwcm9wcmlhdGUgcmVzcG9uc2UgaXMgdG8ganVzdCBzYXkgdGhhdCDigJh0aGUgQiBjZWxsIHJlc3BvbnNlIGlzIG1vcmUgc3BhdGlhbGx5IGhvbW9nZW5lb3Vz4oCZIHdpdGhvdXQgbWVudGlvbiBvZiBhbnRpZ2Vucy4KCioqYikgVGhlIGFuYWx5c2lzIGRvbmUgaW4gZmlndXJlIDREIGNvdWxkIGJlIGRvbmUgdXNpbmcgc2FtcGxlcyBpbmRlcGVuZGVudGx5LCBpbnN0ZWFkIG9mIGFnZ3JlZ2F0aW5nIHRoZSBzYW1wbGVzIGluIGVhY2ggcGF0aWVudC4qKgoKVW5saWtlbHksIGFzIHBoeWxvZ2VuZXRpYyBzaWduYWwgdmFsdWVzIGFyZSBmYW1pbHkgKGkuZSB0cmVlKS1zcGVjaWZpYy4gU3Vic2V0dGluZyBieSBzYW1wbGUgY291bGQgdGhlb3JldGljYWxseSBiZSBkb25lLCBidXQgYXMgc29tZSBhbmNlc3RyYWwgc2VxdWVuY2VzIHdpbGwgbm90IGhhdmUgYmVlbiBwcmVzZW50IGluIFggc2FtcGxlLCB0aGlzIG1heSBiZSBhbiBpc3N1ZS4gCk1pZ3JhdGlvbiBhc3NvY2lhdGlvbiBjb3VsZCBiZSBkb25lIGF0IHRoZSBzYW1wbGUgbGV2ZWwsIGJ1dCB0aGF0J3Mgbm90IHdoYXQgd2Ugd2FudCB0byBsb29rIGZvciBzdGF0aXN0aWNhbGx5LiBJZiB5b3UgZGlkIHRoaXMgYXQgdGhlIHNhbXBsZSBsZXZlbCwgeW91IGNvdWxkIGhhdmUgdG8gYWNjb3VudCBmb3IgdGhlIHJhbmRvbSBlZmZlY3Qgb2YgcGF0aWVudCAtLSB3aGljaCB3b3VsZCBjb21wbGV0ZWx5IGFicm9nYXRlIHRoZSBpbnRlci1wYXRpZW50IGVmZmVjdC4gCgoqU2VjdGlvbjogTXV0YXRpb24gc2lnbmF0dXJlIGNvcnJlbGF0ZXMgb2YgaW1tdW5lIGFjdGl2aXR5KgoKVGhpcyBzZWN0aW9uIHdpbGwgYmUgY29tcGxldGVseSByZW1vdmVkLiAKCioqYSkgVGhlIGF1dGhvcnMgY291bGQgZ2l2ZSBtb3JlIGJpb2xvZ2ljYWwgY29udGV4dC9iYWNrZ3JvdW5kIGFib3V0IHRoZSB0aHJlZSBncm91cHMgb2YgbXV0YXRpb25hbCBzaWduYXR1cmVzIGluIHRlcm1zIG9mIGVmZmVjdCBvZiB0aGUgYWx0ZXJhdGlvbnMgaW4gdGhlIGdlbm9tZSBhbmQgcG90ZW50aWFsIGNhdXNlcyBpbnRyaW5zaWMgb3IgZXh0cmluc2ljIGNhdXNlcy4qKgoKKipiKSBUaGUgYW5hbHlzaXMgZG9uZSB1c2luZyBPVi1BVSBzYW1wbGVzIHNob3VsZCBiZSBhY2NvbXBhbmllZCB3aXRoIGEgZmlndXJlLCBub3Qgb25seSBhIHRhYmxlLioqCgoqU2VjdGlvbjogRGlzY3Vzc2lvbioKCioqYSkgRm9yIHRoZSBzZW50ZW5jZTogIk91ciBkYXRhIGluZGljYXRlIHRoYXQgY28tcmVnaXN0cmF0aW9u4oCmIiBvbiBwYWdlIDExIHRoZSBhdXRob3JzIHNob3VsZCBkbyBzdXJ2aXZhbCBhbmFseXNlcyB0byBzaG93IHRoYXQgdGhpcyBjb3VsZCBiZSBkb25lIHdpdGggdGhlaXIgb3duIHBhdGllbnQgcHJvZ3Jlc3Npb24gZnJlZSBzdXJ2aXZhbCBhbmQgb3ZlcmFsbCBzdXJ2aXZhbCBkYXRhIChLYXBsYW4tTWVpZXIgY3VydmVzKS4gVGhlIHN1cnZpdmFsIGFuYWx5c2VzIGRvbmUgaW5jbHVkZSBvbmx5IHRoZSBtdXRhdGlvbmFsIHNpZ25hdHVyZSBidXQgbm90IHRoZSBpbW11bmUgb3IgbWFsaWduYW50IGRpdmVyc2l0eSBhbmFseXNlcy4gT3RoZXJ3aXNlLCB0aGlzIHNlbnRlbmNlIGlzIHNwZWN1bGF0aXZlLioqCgoKTm90IHJlYWxseSB2YWxpZCB0byBkbyB0aGlzIOKApiBub3Qgb25seSBpcyB0aGUgY29ob3J0IHNpemUgcmVsYXRpdmVseSBzbWFsbCBhbmQgdGh1cyBhbWVuYWJsZSB0byB0aGlzIHR5cGUgb2YgYW5hbHlzaXMgLS0gZXNwZWNpYWxseSB3aGVuIG11bHRpcGxlIGV4cGxhbmF0b3J5IHZhcmlhYmxlcyBsaWtlIG11dGF0aW9uYWwgc2lnbmF0dXJlLCBpbW11bmUgYW5kIGNsb25hbCBkaXZlcnNpdHkgYXJlIGNvbnNpZGVyZWQsIGJ1dCB0aGUgbGF0dGVyIHR3byBtZWFzdXJlcyBhcmUgc2FtcGxlLXNwZWNpZmljLiBBZnRlciBleGNsdWRpbmcgdGVtcG9yYWxseSBzYW1wbGVkIHBhdGllbnRzLCBhbiBuPTE4IGlzIG5vdCBsYXJnZSBlbm91Z2ggdG8gZG8gdGhpcyBhbmFseXNpcy4gCgpQZXJoYXBzIHdlIHNob3VsZCBqdXN0IHJld29yZCB0aGF0IHNlbnRlbmNlIC0tIHRoYXQgc2VlbXMgbW9zdCBhbWVuYWJsZS4gCgoqKmIpIFdvdWxkIGJlIGdvb2QgdG8gc2hvdyBhIGZpZ3VyZSBzaG93aW5nIHRoZSBkYXRhIGRlc2NyaWJlZCBpbiB0aGUgc2VudGVuY2U6ICJJbnRyaWd1aW5nbHksIGluIHRoaXMgc21hbGwgY29ob3J0LCBFUy1wdXJlIHBhdGllbnRzIGhhZCBiZXR0ZXIgb3V0Y29tZXPigKYiIG9uIHBhZ2UgMTIgYW5kIGFsc28gdG8gZXhwYW5kIHRoZSBhbmFseXNpcyB0byBvdGhlciBkYXRhIHNldHMgbGlrZSBUQ0dBIGFuZCBJQ0dDIHRvIGNvbmZpcm0gdGhlIG9ic2VydmF0aW9uLioqCgo/Pz8/IFRoZXJlIGFyZSB2ZXJ5IGZldyBUQ0dBIGFuZCBJQ0dDIHBhdGllbnRzIHRoYXQgYXJlIHNwYXRpYWxseSBzYW1wbGVkIHByZS10cmVhdG1lbnQuIENoZWNrIGNvaG9ydCBzaXplcyBhbmQgbWFrZSBhIHJlc3BvbnNlLgpUaGVyZSdzIGJhc2ljYWxseSBubyBzcGFjZSBmb3IgYSBmaWd1cmUgYW5kIHRoZSBvYnNlcnZhdGlvbnMgYXJlIGludGVuZGVkIGFzIGFuZWNkb3RhbC0tcHJlbGltaW5hcnkgYXQgYmVzdC0tYXMgc3RhdGVkLiAKCioqYykgT25lIGVsZW1lbnQgbWlzc2luZyBmcm9tIHRoZSBkaXNjdXNzaW9uIGFuZCB0aGUgd2hvbGUgbWFudXNjcmlwdCBpczogV2hpY2ggYXJlIHRoZSB1bmRlcmx5aW5nIG1lY2hhbmlzbXMgYmVoaW5kIGltbXVuZSBpbmZpbHRyYXRpb24gaW4gc29tZSBzaXRlcyBidXQgbm90IG90aGVycz8gSXQgd291bGQgYmUgdmFsdWFibGUgaWYgdGhlIGF1dGhvcnMgY291bGQgc2hhcmUgdGhlaXIgaWRlYXMgb24gd2hhdCBjb3VsZCBiZSB0aGUgcG90ZW50aWFsIG1lY2hhbmlzbXMgYW5kL29yIHRoZSB0eXBlIHN0dWRpZXMgcmVxdWlyZWQgdG8gdGFja2xlIHRoaXMgY2hhbGxlbmdpbmcgcXVlc3Rpb24uKioKClRoaXMgaXMgYSB0b3VnaCBvbmUuIFdpbGwgbmVlZCBpbnB1dCBmcm9tIGFsbCBvZiB5b3UgaGVyZS4gCgo=