Quitting from lines 16-98 (appendix_I.Rmd) 

1 Eliminate duplicate responses

First, we will check if the duplicated responses were consistent. If not, we will retain the response in which EDC use was marked as “Yes.” The reason is that the respondent who answered No may not be aware of EDC use in the clinical trial. If the responses are concordant, then the 2nd response will be removed. We will use the following code segment for this.

In the first segment, we make a data frame of duplicated trials with serial numbers of responses.

In the second segment, we make a data frame for the first responses and then merge it with the data frame comprising of a list of duplicated trials. For each row, we make a variable that selects the serial of response with the EDC use response = Yes if there is a discordance. The final two code chunks make a data frame with trials for which a single response has been obtained.

2 Statistical Analysis Plan

2.1 Participation Statistics

The following table shows the statistics related to participation in the survey. The number of investigators who were contacted is different from the number of trials as for a trial more than one investigator may have been contacted.

2.2 Included trial characteristics

First we take a look at the trial characteristics of all trials were were in the sampling frame.

Next we compare the trial characteristics of those studies which have responded versus those which have not.

2.3 EDC Adoption Rate

EDC Adoption Rate (EAR): The primary outcome measure is EAR. This will be defined as the ratio of the number of CTRI registered trials that use an EDC with sophistication level 2 or more to that of the participating trials (unique CTRI registered trials for which investigators agreed to participate in the study. The proportion and the binomial 95% confidence intervals of the same will be reported.

The EDC sophistication level is defined as follows:

  • Level 1: There is a unique account and password for each user to access the online system.

  • Level 2: Sites enter subject visit data through a Web interface into electronic case report forms (eCRFs). The completion status of each eCRF for each subject can be tracked automatically online. The system provides an audit trail for all data entry and data modification

  • Level 3: Data validation happens automatically when data are entered into the eCRF. The system will automatically log the user off after a period of inactivity.

  • Level 4: Subjects are randomized automatically

  • Level 5: Subject recruitment can be tracked online for each site

  • Level 6: The system allows tracking of medication inventory at the sites.

For a level to be considered complete, all the questions should be marked as Yes. If one of the questions is marked as No and a higher level is marked Yes then the higher level will be taken. For each unique trial we will therefore calculate the highest EDC sophistication level. If EDC is not used then sophistication level will be marked as missing.

The following table shows the EDC adoption rate and the different levels in the trials for which responses were received in the survey.

The following table shows the breakdown of key trial characteristics by EDC adoption status. Comparison between groups has been done using Chi-square test for categorical variables and Wilcox rank sum test for continuous variables.

2.4 Influence of trial parameters on EAR

Influence of trial parameters on EAR

To determine the influence of the trial parameters on EAR, we will use a logistic regression model where the dependent variable will be EDC adoption with EDC sophistication level 2 or more (modeled as Yes or No). Independent variables will be:
1. Trial sponsor: Industry or Investigator-Initiated. In studies where the primary sponsor is a pharmaceutical company or device manufacturer, the user will be considered industry-sponsored, and the rest will be considered investigator-initiated.
2. Trial sample size: Total trial sample size will be modeled as a continuous variable. To relax the linearity assumption, this will be expanded using a restricted cubic spline with 3 knots.
3. Trial sites: The number of sites will also be modeled as a continuous variable. Again to relax the linearity assumptions, the model term will be expanded using a restricted cubic spline with three knots.

Interactions will be testing in an omnibus model containing all interaction terms. Wald test will be used for determining the significance of any interaction. Odds ratios with 95% confidence intervals will be reported.

                Wald Statistics          Response: edc_adoption 

 Factor                                                       Chi-Square d.f. P     
 sample_size  (Factor+Higher Order Factors)                    6.30      6    0.3905
  All Interactions                                             2.62      4    0.6233
  Nonlinear (Factor+Higher Order Factors)                      2.75      3    0.4315
 sites  (Factor+Higher Order Factors)                         11.31      3    0.0101
  All Interactions                                             1.39      2    0.4994
 industry_funded  (Factor+Higher Order Factors)                1.83      3    0.6095
  All Interactions                                             0.91      2    0.6335
 sample_size * sites  (Factor+Higher Order Factors)            1.39      2    0.4994
  Nonlinear                                                    0.46      1    0.4958
  Nonlinear Interaction : f(A,B) vs. AB                        0.46      1    0.4958
 sample_size * industry_funded  (Factor+Higher Order Factors)  0.91      2    0.6335
  Nonlinear                                                    0.81      1    0.3674
  Nonlinear Interaction : f(A,B) vs. AB                        0.81      1    0.3674
 TOTAL NONLINEAR                                               2.75      3    0.4315
 TOTAL INTERACTION                                             2.62      4    0.6233
 TOTAL NONLINEAR + INTERACTION                                 3.65      5    0.6008
 TOTAL                                                        24.95      8    0.0016

As the results of the above ANOVA show, the Wald test for non-linear terms as well as interactions is not significant. Hence we show the simplified model without the interaction terms as well as without the non-linear assumption. The table below shows the results of the logistic regression analysis.

2.5 EDC Sophistication Level

We will provide data on the median EDC sophistication levels as well as a plot showing the proportion of CTRI registered trials with different levels of EDC sophistication. Further visualization and analysis will also explore the association between trial sample size, number of trial sites, and type of trial sponsorship with EDC sophistication.

In the following table we will show the univariable analysis of the factors which influenced EDC sophistication level. We will dichotomize the level into two categories (score 6 or score 1-5).

3 Additional Analyses

Additionally the survey collected data on alternative methods for data collection used in the trial as well a single item question on the key perceived barriers towards adoption of EDC in their trial.

Other reasons identified for not using EDC were:

Finally two additional questions were asked about the trial center weather they had access to a CTU and an IRB. We will evaluate the data in relation to EDC use.

4 Industry Sponsored trials

The percentage of industry sponsored trials by each year of registration is shown in the figure below.

5 Packages used

  1. R : R Core Team (2020). R: A language and environment for statistical computing. R Foundation for Statistical Computing, Vienna, Austria. URL https://www.R-project.org/.

  2. Tidyverse : Wickham et al., (2019). Welcome to the tidyverse. Journal of Open Source Software, 4(43), 1686, https://doi.org/10.21105/joss.01686

  3. gtsummary : Daniel D. Sjoberg, Michael Curry, Margie Hannum, Joseph Larmarange, Karissa Whiting and Emily C. Zabor (2021). gtsummary: Presentation-Ready Data Summary and Analytic Result Tables. <https://github.com/ddsjoberg/gtsummary>, http://www.danieldsjoberg.com/gtsummary/.

  4. Hmisc : Frank E Harrell Jr, with contributions from Charles Dupont and many others. (2021). Hmisc: Harrell Miscellaneous. https://hbiostat.org/R/Hmisc/, https://github.com/harrelfe/Hmisc/

  5. flextable : flextable: Functions for Tabular Reporting. https://ardata-fr.github.io/flextable-book/, https://davidgohel.github.io/flextable/.

  6. rms : Frank E Harrell Jr (2021). rms: Regression Modeling Strategies. https://hbiostat.org/R/rms/, https://github.com/harrelfe/rms.

  7. ggplot2: H. Wickham. ggplot2: Elegant Graphics for Data Analysis. Springer-Verlag New York, 2016.

  8. Lubridate: Garrett Grolemund, Hadley Wickham (2011). Dates and Times Made Easy with lubridate. Journal of Statistical Software, 40(3), 1-25. URL https://www.jstatsoft.org/v40/i03/.

LS0tCnRpdGxlOiAiQXBwZW5kaXggSUkgRWxlY3Ryb25pYyBEYXRhIENhcHR1cmUgU3lzdGVtcyBpbiBJbmRpYSBTdXJ2ZXkiCm91dHB1dDoKICBodG1sX25vdGVib29rOgogICAgdG9jOiB5ZXMKICAgIHRoZW1lOiBwYXBlcgogICAgbnVtYmVyX3NlY3Rpb25zOiB5ZXMKICB3b3JkX2RvY3VtZW50OgogICAgdG9jOiB5ZXMKICBodG1sX2RvY3VtZW50OgogICAgdG9jOiB5ZXMKICAgIGRmX3ByaW50OiBwYWdlZAotLS0KCmBgYHtyIHNldHVwfQprbml0cjo6b3B0c19jaHVuayRzZXQod2FybmluZyA9IEZBTFNFLAogICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9IEZBTFNFLAogICAgICAgICAgICAgICAgICAgICAgZWNobz0gRkFMU0UsCiAgICAgICAgICAgICAgICAgICAgICBzZXR3ZCA9ICIuLi9wcm9qZWN0LyIsCiAgICAgICAgICAgICAgICAgICAgICBkZXY9YygicG5nIiwidGlmZiIpKQpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeShndHN1bW1hcnkpCmxpYnJhcnkoSG1pc2MpCmxpYnJhcnkocm1zKQpsaWJyYXJ5KGx1YnJpZGF0ZSkKbGlicmFyeShmbGV4dGFibGUpCgpkZiA8LSByZWFkLmNzdigiY2xpbmljYWxfdHJpYWxzX2luZnJhc3RydWN0dXJlX3MgKDkpLmNzdiIpCnRyaWFsX2RldGFpbHMgPC0gcmVhZC5jc3YoImZpbmFsX21lcmdlZF9uY2lfY3RyaV9kYXRhLmNzdiIpCmNvbnRhY3RzIDwtIHJlYWQuY3N2KCJmaW5hbF9jb250YWN0X2xpc3QuY3N2IikKY2FtX3N0YXRzMSA8LSByZWFkLmNzdigiR01hc3MtUmVwb3J0LTExNzY2MjEwLU1haW4tQ2FtcGFpZ24tU3RhdHMuY3N2IikKY2FtX3N0YXRzMiA8LSByZWFkLmNzdigiR01hc3MtUmVwb3J0LTEyNjMxNjQ2LU1haW4tQ2FtcGFpZ24tU3RhdHMuY3N2IikKY2FtX3N0YXRzMyA8LSByZWFkLmNzdigiR01hc3MtUmVwb3J0LTEyOTYwNDE0LU1haW4tQ2FtcGFpZ24tU3RhdHMuY3N2IikKY2FtX3N0YXRzMSA8LSBjYW1fc3RhdHMxICU+JSBzZWxlY3QoZW1haWxhZGRyZXNzLElELE9wZW5zLFVuc3Vic2NyaWJlZCxCb3VuY2VkLEJsb2NrZWQpIApjYW1fc3RhdHMyIDwtIGNhbV9zdGF0czIgJT4lIHNlbGVjdChlbWFpbGFkZHJlc3MsSUQsT3BlbnMsVW5zdWJzY3JpYmVkLEJvdW5jZWQsQmxvY2tlZCkgCmNhbV9zdGF0czMgPC0gY2FtX3N0YXRzMyAlPiUgc2VsZWN0KGVtYWlsYWRkcmVzcyxJRCxPcGVucyxVbnN1YnNjcmliZWQsQm91bmNlZCxCbG9ja2VkKSAKCgoKY2FtX3N0YXRzIDwtIHJiaW5kKGNhbV9zdGF0czEsY2FtX3N0YXRzMixjYW1fc3RhdHMzKQojIFNwb25zb3IgdHlwZSBhcyBpbnN0aXR1dGlvbmFsLCBnb3Zlcm5tZW50YWwgYW5kIGluZHVzdHJ5IGFzIHdlbGwgYXMgb3RoZXJzLiAKCnRyaWFsX2RldGFpbHMgPC0gdHJpYWxfZGV0YWlscyAlPiUgIAogIG11dGF0ZShzcG9uc29yID0gdHJpbXdzKHRvbG93ZXIoc3BvbnNvcikpKSAlPiUgCiAgbXV0YXRlKHNwb25zb3JfdHlwZSA9IGNhc2Vfd2hlbihzdHJfZGV0ZWN0KHNwb25zb3IsImluc3RpdHV8Y29sbGVnZXx1bml2ZXJzaXR5IikgfiAiSW5zdGl0dXRpb25hbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJfZGV0ZWN0KHNwb25zb3IsImdvdmVyIikgfiAiR292ZXJubWVudGFsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cl9kZXRlY3Qoc3BvbnNvciwgImNvbW1lcmNpYWx8Y29uc3VtZXJ8ZXhwb3J0fG1hcmtldHxkZXZpY2V8bmF0cmFjZXxpbmR1c3RyeXxwaGFybWF8Y29tcGFufGNvbnRyYWN0fG1hbnVmYWN0fHB2dFxcLiIpIH4gIkluZHVzdHJ5IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiAiT3RoZXIiKSwKICAgICAgICAgaW5kdXN0cnlfZnVuZGVkID0gY2FzZV93aGVuKHNwb25zb3JfdHlwZSA9PSAiSW5kdXN0cnkiIH4gIlllcyIsIFRSVUUgfiAiTm8iKSkgCgojIFRyaWFsIHBoYXNlIGRpdmlkZWQgaW50byBjYXRlZ29yaWVzLiAKdHJpYWxfZGV0YWlscyA8LSB0cmlhbF9kZXRhaWxzICU+JSAKICBtdXRhdGUocGhhc2UgPSB0cmltd3MocGhhc2UpKSAlPiUgCiAgbXV0YXRlKHBoYXNlID0gc3RyX3JlbW92ZV9hbGwocGhhc2UsIlBoYXNlfEVhcmx5IikpICU+JSAKICBtdXRhdGUocGhhc2UgPSBzdHJfcmVtb3ZlX2FsbChwaGFzZSwiXFxzK3xcbnxcdCIpKSAlPiUgCiAgbXV0YXRlKHBoYXNlID0gc3RyX3JlcGxhY2UocGhhc2UsIlBvc3RNYXJrZXRpbmdTdXJ2ZWlsbGFuY2UiLCI0IikpICU+JSAKICBtdXRhdGUocGhhc2UgPSBzdHJfcmVwbGFjZShwaGFzZSwiTm90QXBwbGljYWJsZSIsIk4vQSIpKSAlPiUgCiAgbXV0YXRlKHBoYXNlID0gc3RyX3JlcGxhY2UocGhhc2UsIlxcfCIsIi8iKSkgJT4lIAogIG11dGF0ZShwaGFzZV90eXBlID0gY2FzZV93aGVuKAogICAgc3RyX2RldGVjdChwaGFzZSwiMVxcLzJ8MSR8MiQiKSB+ICJQaGFzZSAxIC0gMiIsCiAgICBzdHJfZGV0ZWN0KHBoYXNlLCIyXFwvM3wzJCIpIH4gIlBoYXNlIDIgLSAzIiwKICAgIHN0cl9kZXRlY3QocGhhc2UsIjNcXC80fDQkIikgfiAiUGhhc2UgNCIsIAogICAgVFJVRSB+ICJVbmtub3duIgogICkpCgp0cmlhbF9kZXRhaWxzPC0gdHJpYWxfZGV0YWlscyAlPiUgCiAgbXV0YXRlKGNvbmRpdGlvbiA9IHRvbG93ZXIoY29uZGl0aW9uKSkgJT4lIAogIG11dGF0ZShjb25kaXRpb24gPSB0cmltd3MoY29uZGl0aW9uKSkgJT4lIAogIG11dGF0ZSgKICAgIGNvbmRpdGlvbl90eXBlID0gY2FzZV93aGVuKAogICAgICBzdHJfZGV0ZWN0KGNvbmRpdGlvbiwibHltcGhvYmxhc3RpY3xuZW9wbGFzaWF8dHVtb3VyfHR1bW9yfGNhbmNlcnxseW1waG9tYXxsZXVrZW1pYXxuZW9wbGFzbXxjYXJjaW5vbWF8c2FyY29tYXxjYXN0bGVtYW58Y2hlbW90aGVyYXB5fHJhZGlvdGhlcmFweXxlYnJ0fHJhZGlhdGlvbnxteWVsb2R5c3BsYXN0aWN8YXBsYXN0aWN8c3RlbSBjZWxsfCBtYmMgfGNhIG92YXJ5fG15ZWxvbWF8bnNjbGN8Z2VzdGF0aW9uYWwgdHJvcGhvYmxhc3RpYyBkaXNlYXNlfGZpYnJvYWRlbm9tYXxnbGlvYmxhc3RvbWF8bGV1a29wbGFraWF8bWFsaWduYW5jeSIpIH4gIk5lb3BsYXNtcyIsCiAgICAgIHN0cl9kZXRlY3QoY29uZGl0aW9uLCJkaWFiZXRlc3xkaWFiZXRpY3x0aHlyb2lkaXNtfG1hbG51dHJpdGlvbnxtZXRhYm9saWN8bnV0cml0aW9uYWwgZGVmaWNpZW5jeXxvYmVzaXR5fG9iZXNlfGh5cGVyYWxpbWVudGF0aW9ufGdseWNlbWlhfGdyb3d0aHxvdmVyd2VpZ2h0fHN0dW50fG51dHJpdGlvbmFsIHN1cHBsZW1lbnR8ZW5kb2NyaW5lIGdsYW5kfGRpc29yZGVyIG9mIHRoeXJvaWR8dGh5cm9pZCBzdXJnZXJ5fG9iZWlzaXR5fGFjcm9tZWdhbHl8cGl0dWl0YXJ5fHdlaWdodCBsb3NzfHR5cGUgaWkgZG0iKSB+ICJFbmRvY3JpbmUgZGlzZWFzZSIsCiAgICAgIHN0cl9kZXRlY3QoY29uZGl0aW9uLCIobXx4KWRyKC4qPyl0YiB8dHViZXJjdXxiYWN0ZXJpYWx8cG5ldW1vbmlhfHNlcHRpY2VtaWF8bWFsYXJpYXxoaXZ8YWlkc3xpbmZlY3Rpb258bGVwcm9zeXxzdXBwdXJhdGl2ZXxkZW5ndWV8bWFsYXJpYXxwbGFzbW9kaXVtfGluZmVjdGlvdXN8YWJzY2Vzc3xedGIgfGFjdXRlIHBhbmNyZWF0aXRpc3xjb3JvbmF8Y292aWR8ZmlsYXJpYXxtdWNvcnx3YXJ0c3xqYXBhbmVzZXx0eXBob2lkfHNlcHNpc3xhY2FudGhhbXxoZXBhdGl0aXMoXFwtfCApKGF8YnxjKShcXHMrfCQpfGRpZmZpY2lsZXx0aW5lYXxsZXB0b3NwaXxmdW5nYWx8c2VwdGljfHNjYWJpZXN8cmFiaWVzfGxlaXNobWFuaWFzaXN8aGlkcmFkZW5pdGlzIikgfiAiSW5mZWN0aXZlIERpc2Vhc2VzIiwKICAgICAgc3RyX2RldGVjdChjb25kaXRpb24sImZyYWN0dXJlfHRyYXVtYXxpbmp1cnl8YWNjaWRlbnR8YnVybnxpbmp1cmllc3xzbW9rZXxmaXJlfGZsYW1lfHNwcmFpbnxzbmFrZSIpIH4gIkFjY2lkZW50cyBhbmQgSW5qdXJpZXMiLAogICAgICBzdHJfZGV0ZWN0KGNvbmRpdGlvbiwiYW54aWV0eXxwc3ljaG9hY3RpdmV8cmVsYXRlZCBzdHJlc3N8ZGVwcmVzc2l2ZXxkZXByZXNzaW9ufHNjaGl6b3BocmVuaWF8d2l0aGRyYXdsfGFkZGljdGlvbnxhZmZlY3RpdmV8YXR0ZW50aW9ufG9ic2Vzc2l8Y29tcHVsc2l8c2VpenVyZXxtZW50YWwgcmV0YXJkfHBhcmtpbnNvbnxhbHpoZWltZXJ8bmV1cm90aWN8bW9vZHxuZXVyb3BhdGh5fHJhZGljdWxvcGF0aHl8Y2VyZWJyYWwgcGFsc3l8YXV0aXN8ZGVtZW50aWF8KGFsY29ob2x8dG9iYWNjb3xuaWNvdGluZSkgKGNvbnN1bXB0fGFkZGljfHdpdGhkcmF8ZGVwZW5kYSl8bWlncmFpbmV8aW5zb21uaWF8YWRoZHxpbnRlbGxlY3R1YWx8ZXBpbGVwdGljfChkaXNvcmRlcnxkaXNvcmRlcnN8ZGlzZWFzZXxkaXNlYXNlcykgb2YgKGJyYWlufGNlbnRyYWwgbmVydm91cyl8ZXBpbGVwc2llc3xwb3N0IGhlcnBldGljIG5ldXJhbGdpYXx6b3N0ZXIgYXNzb2NpYXRlZCBwYWlufHBzeWNob3Npc3xiaXBvbGFyfGVwaWxlcHN5fGVuY2VwaGFsb3BhdGh5fHNtb2tpbmcgY2Vzc2F0aW9uIikgfiAiTWVudGFsIEJlaGF2aW91cmFsIERpc29yZGVycyBhbmQgbmVydm91cyBzeXN0ZW0gZGlzZWFzZSIsCiAgICAgIHN0cl9kZXRlY3QoY29uZGl0aW9uLCJhc3RobWF8Y2hyb25pYyBvYnN0cnVjdHxjb3BkfGJyb25jaGlvbGl0aXN8d2hlZXplfChkaXNlYXNlfGRpc29yZGVyKSguKj8pKHJlc3BpcmF0b3J5fGx1bmcpfHJlc3BpcmF0b3J5ICh0cmFjdHxkaXN0cmVzc3xkaXNvcmRlcil8d2hlZXppbmciKSB+ICJEaXNlYXNlcyBvZiByZXNwaXJhdG9yeSBzeXN0ZW0iLAogICAgICBzdHJfZGV0ZWN0KGNvbmRpdGlvbiwiKGNhbGN1bHVzKSguKj8pKGtpZG5leXx1cmV0ZXJ8dXJldGhyYXxibGFkZGVyKXxuZXBocm90aWN8KG5lcGhyb3x1cm8pbGl0aHxlbmQoLio/KXN0YWdlIChyZW5hbHxraWRuZXkpIGRpc2Vhc2V8ZXNyZHxkaWFseXNpc3xuZXBocm9wYXRoeXxnbG9tZXJ1bGFyfHVyaW5hcnkgaW5jb250aW5lbmNlfHJlbmFsIHN0b25lfGRpc29yZGVyIG9mIHByb3N0YXRlfHByb3N0YXRpYyBoeXBlcnx1cmV0aHJhfHB5ZWxvcGxhc3R5fGh5cG9zcGFkaWFzfChkaXNlYXNlc3xkaXNlYXNlKSguKj8pKGdlbml0b3VyaW5hcnl8a2lkbmV5fHVyZXRlcil8dXJvbG9naWNhbHwoYXpvb3xvbGlnbylzcGVybWlhfChibGFkZGVyfGtpZG5leXxyZW5hbHx1cmV0ZXJpY3xwcm9zdGF0aWMpKC4qPykoZGlzb3JkZXJ8ZGlzZWFzZSkiKSB+ICJEaXNlYXNlcyBvZiBnZW5pdG91cmluYXJ5IHN5c3RlbSIsCiAgICAgIHN0cl9kZXRlY3QoY29uZGl0aW9uLCJleWUgZGlzZWFzZXxnbGF1Y29tYXxjYXRhcmFjdHxjb3JuZWF8cmV0aW5hbHxyZXRpbm9wYXRoeXxjb25qdW5jdHxleWVsaWR8dXZlaXRpc3xvcHRpY3xvY3VsYXJ8ZXllbGlkfGFzdGlnbWF8bXlvcGlhfGh5cGVybWV0cm9waWF8ZXBpc2NsZXJ8c2NsZXJhfGV5ZSBoZWFsdGh8cHRlcnlnaXVtfGtlcmF0b3BhdGh5fGNob3JvaWQiKSB+ICJEaXNlYXNlcyBvZiBFeWUiLAogICAgICBzdHJfZGV0ZWN0KGNvbmRpdGlvbiwicGVyaW9kb250aXRpc3xnZXJkfGNpcnJob3Nlc3xnYXN0cml0aXN8ZGVudGluYWx8cHVscGl0aXN8ZW5kb2RvbnRvdGljfGVkZW50dWxvdXN8ZGVudGFsfG1vbGFyfHRvb3RofGdpbmdpdnxjYXJpZXN8Y2lycmhvc2lzfGNpcnJob3RpY3xlbmQgc3RhZ2UgKGxpdmVyfGhlcGF0aWMpfChsaXZlcnxoZXBhdGljKSBmYWlsdXJlfGNvbGl0aXN8KGVzb3BoYWdlYWx8Z2FzdHJpY3xkdW9kZW5hbHxqZWp1bmFsfGludGVzdGluYWx8Y29sb25pY3xyZWN0YWx8cGVwdGljfGFuYWx8Y29sb3JlY3RhbCkoLio/KSh1bGNlcnxzdHJpY3R1cmV8b2JzdHJ1Y3Rpb258ZmlzdHVsYXxkaXNvcmRlcnxkaXNlYXNlKXxnYXN0cm9pbnRlc3RpbmFsIGRpc29yZGVyfGhhZW1vcnJob2lkc3xoZW1vcnJob2lkc3xhbnVzfChmaXN0dWxhfGZpc3N1cmUpIGluIChhbm98YW51cyl8Y2hvbGVsaXRoaWFzaXN8aGVwYXRpdGlzfHBhbmNyZWF0aXRpc3woZGlzZWFzZXxkaXNlYXNlc3xkaXNvcmRlcikoLio/KShkaWdlc3RpdmV8bGl2ZXJ8YmlsaWFyeXxiaWxlKXxpY3RlcmljfGFjdXRlIGRpYXJyaGVhfGNob2xpbGl0aGlhc2lzfGR5c3BlcHNpYXxwcm9jdGl0aXN8ZXJjcHxoeXBlcmJpbGlydWJpbmVtaWF8amF1bmRpY2V8Z2F1Y2hlcnxsaXZlciBkaXNlYXNlfGFjaGFsYXNpYSBvZiBjYXJkaWF8Z2FzdHJvZXNvcGhhZ2VhbCByZWZsdXh8YnVkZC1jaGlhcml8cGFuY3JlYXMiKSB+ICJEaXNlYXNlcyBvZiBkaWdlc3RpdmUgc3lzdGVtIiwKICAgICAgc3RyX2RldGVjdChjb25kaXRpb24sInJoZW11YXRpYyBmZXZlcnxoeXBlcnRlbihzaW9ufHNpdmUpfGNhcmRpYWN8YW5naW5hfGNvcm9uYXJ5IHN5bmRyb21lfGNvcm9uYXJ5fGFtaXxteW9jYXJkaWFsIGluZmFyY3Rpb258aGVhcnQgZmFpbHVyZXxpc2NoZW1pY3xjYXJkaW9teW9wYXRoeXxhdHJpYWx8Y2FyZGlvdmFzY3VsYXIgZGlzZWFzZXwodGFjaHl8YnJhZHkpY2FyZGlhfGNvbmdlbml0YWwgaGVhcnR8bXlvY2FyZGlhbHxwdWxtb25hcnkgaHlwZXJ0ZW5zaW9ufHN0cm9rZXxjZXJlYnJvdmFzY3VsYXIgZGlzZWFzZXxjdmR8Y2hkfGJ5cGFzc3xpbmZhcmN0aW9ufGF0aGVyb3NjbGVyb3Npc3woZGlzZWFzZXxkaXNvcmRlcikoLio/KShjaXJjdWxhdG9yeXxoZWFydHxjYXJkaWFjKSIpIH4gIkRpc2Vhc2VzIG9mIENpcmN1bGF0b3J5IFN5c3RlbSIsCiAgICAgIHN0cl9kZXRlY3QoY29uZGl0aW9uLCJhcnRocm9wYXRoaWVzfGFydGhyaXRpc3xjaHJvbmljfHBvbHljeXN0aWN8Zmlicm9zaXN8ZW5kb21ldHJpb3Npc3xyaGV1bWF0b2lkfGNyb2hufGdvdXR8aHlwZXJ1cmljZW1pYXxpbmZlcnRpbGl0eXxsdXB1c3xvc3Rlb3Bvcm9zaXN8c2xlfGFua3lsb3Npbmd8c3lzdGVtaWMgc2NsZXJvc2lzIil+IkNocm9uaWMgbm9uLWNvbW11bmljYWJsZSBkaXNlYXNlcyIsCiAgICAgIHN0cl9kZXRlY3QoY29uZGl0aW9uLCJoZWFsdGh5fHBsYXllcnN8dm9sdW50ZWVyfGFudGktYWdpbmd8bm9ybWFsIGNoaWxkcmVufG5vIHNwZWNpZmljIGhlYWx0aCBjb25kaXRpb258b3JhbCBoZWFsdGgiKSB+ICJOb3JtYWwgaGVhbHRoeSB2b2x1bnRlZXJzIiwKICAgICAgVFJVRX4iT3RoZXJzIikpCgp0cmlhbF9kZXRhaWxzIDwtIHRyaWFsX2RldGFpbHMgJT4lIG11dGF0ZShtdWx0aWNlbnRyaWM9Y2FzZV93aGVuKHNpdGVzID4gMSB+ICJZZXMiLCBUUlVFIH4gIk5vIikpCgpkZiA8LSBkZiAlPiUgcmVuYW1lKElEID0gdHJpYWxfaWQpCgoKc2V0X2ZsZXh0YWJsZV9kZWZhdWx0cygKICBmb250LmZhbWlseSA9ICJBcmlhbCIsIAogIGZvbnQuc2l6ZSA9IDEwLAogIGZvbnQuY29sb3IgPSAiYmxhY2siLAogIHRhYmxlLmxheW91dCA9ICJhdXRvZml0IiwKICBkaWdpdHMgPSAxLAogIHRoZW1lX2Z1biA9ICJ0aGVtZV96ZWJyYSIKICApCmBgYAoKIyBFbGltaW5hdGUgZHVwbGljYXRlIHJlc3BvbnNlcwoKRmlyc3QsIHdlIHdpbGwgY2hlY2sgaWYgdGhlIGR1cGxpY2F0ZWQgcmVzcG9uc2VzIHdlcmUgY29uc2lzdGVudC4gSWYgbm90LCB3ZSB3aWxsIHJldGFpbiB0aGUgcmVzcG9uc2UgaW4gd2hpY2ggRURDIHVzZSB3YXMgbWFya2VkIGFzICJZZXMuIiBUaGUgcmVhc29uIGlzIHRoYXQgdGhlIHJlc3BvbmRlbnQgd2hvIGFuc3dlcmVkIE5vIG1heSBub3QgYmUgYXdhcmUgb2YgRURDIHVzZSBpbiB0aGUgY2xpbmljYWwgdHJpYWwuIElmIHRoZSByZXNwb25zZXMgYXJlIGNvbmNvcmRhbnQsIHRoZW4gdGhlIDJuZCByZXNwb25zZSB3aWxsIGJlIHJlbW92ZWQuIFdlIHdpbGwgdXNlIHRoZSBmb2xsb3dpbmcgY29kZSBzZWdtZW50IGZvciB0aGlzLgoKSW4gdGhlIGZpcnN0IHNlZ21lbnQsIHdlIG1ha2UgYSBkYXRhIGZyYW1lIG9mIGR1cGxpY2F0ZWQgdHJpYWxzIHdpdGggc2VyaWFsIG51bWJlcnMgb2YgcmVzcG9uc2VzLgoKSW4gdGhlIHNlY29uZCBzZWdtZW50LCB3ZSBtYWtlIGEgZGF0YSBmcmFtZSBmb3IgdGhlIGZpcnN0IHJlc3BvbnNlcyBhbmQgdGhlbiBtZXJnZSBpdCB3aXRoIHRoZSBkYXRhIGZyYW1lIGNvbXByaXNpbmcgb2YgYSBsaXN0IG9mIGR1cGxpY2F0ZWQgdHJpYWxzLiBGb3IgZWFjaCByb3csIHdlIG1ha2UgYSB2YXJpYWJsZSB0aGF0IHNlbGVjdHMgdGhlIHNlcmlhbCBvZiByZXNwb25zZSB3aXRoIHRoZSBFREMgdXNlIHJlc3BvbnNlID0gWWVzIGlmIHRoZXJlIGlzIGEgZGlzY29yZGFuY2UuIFRoZSBmaW5hbCB0d28gY29kZSBjaHVua3MgbWFrZSBhIGRhdGEgZnJhbWUgd2l0aCB0cmlhbHMgZm9yIHdoaWNoIGEgc2luZ2xlIHJlc3BvbnNlIGhhcyBiZWVuIG9idGFpbmVkLgoKYGBge3J9CmR1cCA8LSBkZiAlPiUgc2VsZWN0KHNlcmlhbCxJRCxlZGNfdXNlKSAlPiUgCiAgZ3JvdXBfYnkoSUQpICU+JSAKICBtdXRhdGUoc2VyaWFsLm51bWJlcj1yb3dfbnVtYmVyKCkpICU+JSAKICBmaWx0ZXIoc2VyaWFsLm51bWJlcj4xKSAgJT4lIAogIHVuZ3JvdXAoKQoKZHVwIDwtIGRmICU+JSBzZWxlY3Qoc2VyaWFsLElELGVkY191c2UpICU+JSAKICBncm91cF9ieShJRCkgJT4lIAogIG11dGF0ZShzZXJpYWwubnVtYmVyPXJvd19udW1iZXIoKSkgJT4lCiAgZmlsdGVyKHNlcmlhbC5udW1iZXI9PTEpICU+JSAKICBsZWZ0X2pvaW4oZHVwLC4sYnk9IklEIikgJT4lIAogIGZpbHRlcihzZXJpYWwueCAhPSBzZXJpYWwueSkgJT4lIAogIGZpbHRlcihzZXJpYWwubnVtYmVyLnggIT0gc2VyaWFsLm51bWJlci55KSAlPiUgCiAgbXV0YXRlKHNlcmlhbF9yZXRhaW4gPSBjYXNlX3doZW4oZWRjX3VzZS55PT0iWWVzIiB+IHNlcmlhbC55LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVkY191c2UueT09Ik5vIiAmIGVkY191c2UueCA9PSAiWWVzIiB+IHNlcmlhbC54LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVkY191c2UueT09ICJObyIgJiBlZGNfdXNlLnggPT0gIk5vIiB+c2VyaWFsLnkpKSAlPiUgCiAgc2VsZWN0KElELHNlcmlhbF9yZXRhaW4pICU+JSAKICBkaXN0aW5jdCguLElELC5rZWVwX2FsbD1UKSAlPiUgCiAgcmVuYW1lKHNlcmlhbCA9IHNlcmlhbF9yZXRhaW4pCgpkZl91bmlxdWUgPC0gZGYgJT4lIGFudGlfam9pbiguLGR1cCxieT0iSUQiKQoKZGZfZHVwIDwtIGRmICU+JSBzZW1pX2pvaW4oLixkdXAsYnk9InNlcmlhbCIpCgpkZiA8LSByYmluZChkZl91bmlxdWUsZGZfZHVwKQpgYGAKCmBgYHtyfQpjb250YWN0cyA8LSBjb250YWN0cyAlPiUgCiAgbXV0YXRlKGVtYWlsPXRyaW13cyhlbWFpbCkpICU+JSAKICBtdXRhdGUoZW1haWw9c3RyX3JlbW92ZV9hbGwoZW1haWwsIlxccyt8XG58XHQiKSkKCiMgT2J0YWluIHRoZSBsaXN0IG9mIENUUkkgdHJpYWwgSURzIGZyb20gcmVzcG9uZGVudHMKCnJlc3AgPC0gZGYgJT4lIAogIHNlbGVjdChJRCkKCiMgUmVtb3ZlIHRoZSByZXNwb25kZW50IHRyaWFscyBmcm9tIHRoZSBsaXN0Cgpjb250YWN0czIgPC0gY29udGFjdHMgJT4lIGFudGlfam9pbiguLHJlc3AsYnk9IklEIikgIAoKIyBNYWtlIGEgbGlzdCBvZiByZXNwb25kZW50cyB3aG8gaGF2ZSByZXNwb25kZWQgZm9yIG9uZSBjbGluaWNhbCB0cmlhbC4gRG8gbm90IHNlbmQgdGhlbSBhbm90aGVyIG1haWwuIAoKcmVzcG9uZGVudF9lbWFpbHMgPC0gY29udGFjdHMgJT4lIAogIHNlbWlfam9pbiguLHJlc3AsYnk9IklEIikgJT4lIAogIHNlbGVjdChlbWFpbCxJRCkgJT4lIAogIHJlbmFtZShyZXNwb25kZWRfdHJpYWw9SUQpICU+JSAKICBtdXRhdGUoZW1haWw9dHJpbXdzKGVtYWlsKSkgJT4lIAogIG11dGF0ZShlbWFpbD1zdHJfcmVtb3ZlX2FsbChlbWFpbCwiXFxzK3xcbnxcdCIpKSAlPiUgCiAgZGlzdGluY3QoLixlbWFpbCxyZXNwb25kZWRfdHJpYWwsLmtlZXBfYWxsPVQpCgpyZXNwb25kZXJzIDwtIGNvbnRhY3RzMiAlPiUgaW5uZXJfam9pbihyZXNwb25kZW50X2VtYWlscywuLGJ5PSJlbWFpbCIpICU+JSAKICBkaXN0aW5jdCguLElELC5rZWVwX2FsbCA9IFQpICU+JSAKICBzZWxlY3QocmVzcG9uZGVkX3RyaWFsLElEKSAlPiUgCiAgcmVuYW1lKElEPXJlc3BvbmRlZF90cmlhbCxvdGhlcl9JRD1JRCkgJT4lIAogIGxlZnRfam9pbiguLGRmLGJ5PSJJRCIpICU+JSAKICBzZWxlY3QoLWMoSUQpKSAlPiUgCiAgcmVuYW1lKElEPW90aGVyX0lEKSAlPiUgCiAgZ3JvdXBfYnkoc2VyaWFsKSAlPiUgCiAgbXV0YXRlKHNubyA9IHJvd19udW1iZXIoKSkgJT4lIAogIG11dGF0ZShzbm8gPSBzbm8rMSkgJT4lIAogIG11dGF0ZShzZXJpYWwgPSBwYXN0ZShzZXJpYWwsc25vLHNlcD0iXyIpKSAlPiUgCiAgc2VsZWN0KC1zbm8pCgpkZiA8LSByYmluZChkZixyZXNwb25kZXJzKQpgYGAKCmBgYHtyfQojIE1lcmdlIHRyaWFsIGRldGFpbHMgd2l0aCB0aGUgZGF0YXNldCBvZiBzdXJ2ZXkgcmVzcG9uc2VzIHRvIGVuc3VyZSB0cmlhbCBjaGFyYWN0ZXJpc3RpY3MgY2FuIGJlIGFzY2VydGFpbmVkLiAKCmRmIDwtIGRmICU+JSAKICBsZWZ0X2pvaW4oLix0cmlhbF9kZXRhaWxzLGJ5PSJJRCIpCmRmIDwtIGRmICU+JSBzZWxlY3QoLXJlbW90ZV9hZGRyKQpgYGAKCmBgYHtyfQoKY2lfZnVuY3Rpb25fY2F0IDwtIGZ1bmN0aW9uKGRhdGEsIHZhcmlhYmxlLCBieSwgdGJsLCAuLi4pIHsKICAjIGZpcnN0IGNhbGN1bGF0ZSBDSXMgZm9yIGFsbCBsZXZlbHMKICByZXN1bHQgPC0KICAgIGRhdGEgJT4lIAogICAgZnJlcXRhYmxlczo6ZnJlcV90YWJsZSghIXN5bShieSksICEhc3ltKHZhcmlhYmxlKSkgJT4lIAogICAgbXV0YXRlKGNpID0gc3RyX2dsdWUoIntzdHlsZV9wZXJjZW50KGxjbF9yb3cgLyAxMDAsIHN5bWJvbCA9IFRSVUUpfSAtIHtzdHlsZV9wZXJjZW50KHVjbF9yb3cgLyAxMDAsIHN5bWJvbCA9IFRSVUUpfSIpKSAlPiUKICAgIHNlbGVjdChyb3dfY2F0LCBjb2xfY2F0LCBjaSkgJT4lCiAgICBwaXZvdF93aWRlcihpZF9jb2xzID0gY29sX2NhdCwgbmFtZXNfZnJvbSA9IHJvd19jYXQsIHZhbHVlc19mcm9tID0gY2kpIAogIAogICMgaWYgdmFyaWFibGUgaXMgdHlwZSAnZGljaG90b21vdXMnLCBvbmx5IGtlZXAgb25lIHJvdwogIHZhcl9tZXRhX2RhdGEgPC0gdGJsJG1ldGFfZGF0YSAlPiUgZmlsdGVyKC5kYXRhJHZhcmlhYmxlICVpbiUgLmVudiR2YXJpYWJsZSkKICBpZiAodmFyX21ldGFfZGF0YSRzdW1tYXJ5X3R5cGUgJWluJSAiZGljaG90b21vdXMiKSB7CiAgICByZXN1bHQgPC0gcmVzdWx0ICU+JSBmaWx0ZXIoY29sX2NhdCAlaW4lIHZhcl9tZXRhX2RhdGEkZGljaG90b21vdXNfdmFsdWVbWzFdXSkKICB9CiAgCiAgcmVzdWx0ICU+JQogICAgc2VsZWN0KC0xKSAlPiUKICAgIHNldF9uYW1lcyhwYXN0ZTAoImFkZF9zdGF0XyIsIHNlcV9sZW4obmNvbCguKSkpKQp9CgpjaV9mdW5jdGlvbl9jb24gPC0gZnVuY3Rpb24oZGF0YSwgdmFyaWFibGUsIGJ5LCAuLi4pIHsKICBkYXRhICU+JQogICAgYXJyYW5nZSguZGF0YVtbYnldXSkgJT4lCiAgICBncm91cF9ieSguZGF0YVtbYnldXSkgJT4lCiAgICBncm91cF9tYXAoCiAgICAgIH4ueFtbdmFyaWFibGVdXSAlPiUgCiAgICAgICAgdC50ZXN0KCkgJT4lIAogICAgICAgIGJyb29tOjp0aWR5KCkgJT4lCiAgICAgICAgbXV0YXRlX2F0KHZhcnMoY29uZi5sb3csIGNvbmYuaGlnaCksIHN0eWxlX3NpZ2ZpZykgJT4lCiAgICAgICAgbXV0YXRlKGNpID0gc3RyX2dsdWUoIntjb25mLmxvd30gLSB7Y29uZi5oaWdofSIpKSAlPiUKICAgICAgICBzZWxlY3QoY2kpCiAgICApICU+JQogICAgaW1hcF9kZnIofi54ICU+JSBtdXRhdGUoY29sX25hbWUgPSBwYXN0ZTAoImFkZF9zdGF0XyIsIC55KSkpICU+JQogICAgcGl2b3Rfd2lkZXIodmFsdWVzX2Zyb20gPSBjaSwgbmFtZXNfZnJvbSA9IGNvbF9uYW1lKQp9CgpgYGAKCiMgU3RhdGlzdGljYWwgQW5hbHlzaXMgUGxhbgoKIyMgUGFydGljaXBhdGlvbiBTdGF0aXN0aWNzCgpUaGUgZm9sbG93aW5nIHRhYmxlIHNob3dzIHRoZSBzdGF0aXN0aWNzIHJlbGF0ZWQgdG8gcGFydGljaXBhdGlvbiBpbiB0aGUgc3VydmV5LiBUaGUgbnVtYmVyIG9mIGludmVzdGlnYXRvcnMgd2hvIHdlcmUgY29udGFjdGVkIGlzIGRpZmZlcmVudCBmcm9tIHRoZSBudW1iZXIgb2YgdHJpYWxzIGFzIGZvciBhIHRyaWFsIG1vcmUgdGhhbiBvbmUgaW52ZXN0aWdhdG9yIG1heSBoYXZlIGJlZW4gY29udGFjdGVkLgoKYGBge3J9CnVuaXF1ZV90cmlhbHMgPC0gY29udGFjdHMgJT4lIHNlbGVjdChJRCkgJT4lIGRpc3RpbmN0KCkgJT4lIHN1bW1hcmlzZSh0b3RhbF90cmlhbHM9bigpKQp1bmlxdWVfY29udGFjdHMgPC0gY29udGFjdHMgJT4lIHNlbGVjdChlbWFpbCkgJT4lIGRpc3RpbmN0KCkgJT4lIHN1bW1hcmlzZSh1bmlxdWVfZW1haWxzID0gbigpKQp1bmlxdWVfb3BlbnMgPC0gY2FtX3N0YXRzICU+JSBmaWx0ZXIoT3BlbnM+MCkgJT4lIGRpc3RpbmN0KGVtYWlsYWRkcmVzcykgJT4lIHN1bW1hcmlzZSh1bmlxdWVfb3BlbnM9bigpKQp1bmlxdWVfdHJpYWxfb3BlbnMgPC0gY2FtX3N0YXRzICU+JSBmaWx0ZXIoT3BlbnM+MCkgJT4lIGRpc3RpbmN0KElEKSAlPiUgc3VtbWFyaXNlKHVuaXF1ZV90cmlhbF9vcGVucz1uKCkpCnBhcnRfdHJpYWxzIDwtIGRmICU+JSBzZWxlY3QoSUQpICU+JSBkaXN0aW5jdCgpICU+JSBzdW1tYXJpc2UocGFydGljaXBhdGluZ190cmlhbHMgPSBuKCkpCgpzdGF0aXN0aWNzIDwtIGNiaW5kKHVuaXF1ZV9jb250YWN0cyx1bmlxdWVfdHJpYWxzLHVuaXF1ZV9vcGVucyx1bmlxdWVfdHJpYWxfb3BlbnMscGFydF90cmlhbHMpCgpzdGF0aXN0aWNzICU+JSAKICBtdXRhdGUoCiAgICBpbnZlc3RpZ2F0b3Jfb3Blbl9yYXRlID0gcm91bmQoMTAwKnVuaXF1ZV9vcGVucy91bmlxdWVfZW1haWxzLDEpLAogICAgdHJpYWxfb3Blbl9yYXRlID0gcm91bmQoMTAwKih1bmlxdWVfdHJpYWxfb3BlbnMvdG90YWxfdHJpYWxzKSwxKSwKICAgIHBhcnRpY2lwYXRpb25fcmF0ZT1yb3VuZCgxMDAqcGFydGljaXBhdGluZ190cmlhbHMvdG90YWxfdHJpYWxzLDEpKSAlPiUKICBzZWxlY3QodW5pcXVlX2VtYWlscyx1bmlxdWVfb3BlbnMsaW52ZXN0aWdhdG9yX29wZW5fcmF0ZSx0b3RhbF90cmlhbHMsdW5pcXVlX3RyaWFsX29wZW5zLHRyaWFsX29wZW5fcmF0ZSxwYXJ0aWNpcGF0aW5nX3RyaWFscyxwYXJ0aWNpcGF0aW9uX3JhdGUpICU+JSAKICByZW5hbWUoCiAgICAiSW52ZXN0aWdhdG9ycyAoTikiID0gdW5pcXVlX2VtYWlscywKICAgICJUcmlhbHMgKE4pIiA9IHRvdGFsX3RyaWFscywKICAgICJJbnZlc3RpZ2F0b3JzIHdobyBvcGVuZWQgZW1haWwgKE4pIiA9IHVuaXF1ZV9vcGVucywKICAgICJUcmlhbHMgd2hvc2UgZW1haWwgd2FzIG9wZW5lZCAoTikiID0gdW5pcXVlX3RyaWFsX29wZW5zLAogICAgIlBhcnRpY2lwYXRpbmcgVHJpYWxzIChOKSIgPSBwYXJ0aWNpcGF0aW5nX3RyaWFscywKICAgICJJbnZlc3RpZ2F0b3Igb3BlbiByYXRlICglKSIgPSBpbnZlc3RpZ2F0b3Jfb3Blbl9yYXRlLAogICAgIlRyaWFsIG9wZW4gcmF0ZSAoJSkiID0gdHJpYWxfb3Blbl9yYXRlLAogICAgIlBhcnRpY2lwYXRpb24gcmF0ZSAoJSkiID1wYXJ0aWNpcGF0aW9uX3JhdGUKICApICU+JSAKICBmbGV4dGFibGUoKSAlPiUgCiAgc2V0X2NhcHRpb24oLiwiVGFibGUgMSA6IFBhcnRpY2lwYXRpb24gU3RhdGlzdGljcyIpCmBgYAoKIyMgSW5jbHVkZWQgdHJpYWwgY2hhcmFjdGVyaXN0aWNzCgpGaXJzdCB3ZSB0YWtlIGEgbG9vayBhdCB0aGUgdHJpYWwgY2hhcmFjdGVyaXN0aWNzIG9mIGFsbCB0cmlhbHMgd2VyZSB3ZXJlIGluIHRoZSBzYW1wbGluZyBmcmFtZS4KCmBgYHtyfQp0cmlhbF9kZXRhaWxzICU+JSAKICBzZW1pX2pvaW4oLixjb250YWN0cyxieT0iSUQiKSAlPiUgCiAgc2VsZWN0KElELHNwb25zb3JfdHlwZSxpbmR1c3RyeV9mdW5kZWQsdHJpYWxfdHlwZSxwaGFzZV90eXBlLHRyaWFsX2R1cmF0aW9uLHNhbXBsZV9zaXplLHNpdGVzLG11bHRpY2VudHJpYyxuYXRpb25zLGNvbmRpdGlvbl90eXBlKSAlPiUgCiAgZGlzdGluY3QoLixJRCwua2VlcF9hbGwgPSBUKSAlPiUgCiAgc2VsZWN0KC1JRCkgJT4lIAogIHRibF9zdW1tYXJ5KHR5cGUgPSBsaXN0IChtdWx0aWNlbnRyaWMgfiAiY2F0ZWdvcmljYWwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBpbmR1c3RyeV9mdW5kZWQgfiAiY2F0ZWdvcmljYWwiKSwKICAgICAgICAgICAgICBsYWJlbCA9IGxpc3Qoc3BvbnNvcl90eXBlIH4gIlNwb25zb3IgVHlwZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZHVzdHJ5X2Z1bmRlZCB+ICJJbmR1c3RyeSBGdW5kZWQgVHJpYWwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICB0cmlhbF90eXBlIH4gIlR5cGUgb2YgVHJpYWwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBwaGFzZV90eXBlIH4gIlRyaWFsIFBoYXNlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJpYWxfZHVyYXRpb24gfiAiRHVyYXRpb24gb2YgVHJpYWwgKERheXMpIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlX3NpemUgfiAiU2FtcGxlIFNpemUgKFRvdGFsKSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpdGVzIH4gIk51bWJlciBvZiBzaXRlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIG11bHRpY2VudHJpYyB+ICJNdWx0aWNlbnRyaWMgVHJpYWwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBuYXRpb25zIH4gIkNvdW50cnkgb2YgUmVjcnVpdG1lbnQiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICkpICU+JSAKICBib2xkX2xhYmVscygpJT4lIAogIGFzX2ZsZXhfdGFibGUoKSAlPiUgCiAgc2V0X2NhcHRpb24oLiwiVGFibGUgMiA6IFRyaWFsIENoYXJhY3RlcmlzdGljcyIpCmBgYAoKTmV4dCB3ZSBjb21wYXJlIHRoZSB0cmlhbCBjaGFyYWN0ZXJpc3RpY3Mgb2YgdGhvc2Ugc3R1ZGllcyB3aGljaCBoYXZlIHJlc3BvbmRlZCB2ZXJzdXMgdGhvc2Ugd2hpY2ggaGF2ZSBub3QuCgpgYGB7cn0KcGFydF90cmlhbHMgPC0gZGYgJT4lIHNlbGVjdChJRCkgJT4lIG11dGF0ZShwYXJ0aWNpcGFudD0iWWVzIikKCgp0cmlhbF9kZXRhaWxzICU+JSAKICBzZW1pX2pvaW4oLixjb250YWN0cyxieT0iSUQiKSAlPiUgCiAgc2VsZWN0KElELHNwb25zb3JfdHlwZSxpbmR1c3RyeV9mdW5kZWQsdHJpYWxfdHlwZSxwaGFzZV90eXBlLHRyaWFsX2R1cmF0aW9uLHNhbXBsZV9zaXplLHNpdGVzLG11bHRpY2VudHJpYyxuYXRpb25zLGNvbmRpdGlvbl90eXBlKSAlPiUgCiAgZGlzdGluY3QoLixJRCwua2VlcF9hbGwgPSBUKSAlPiUgCiAgbGVmdF9qb2luKC4scGFydF90cmlhbHMsYnk9IklEIikgJT4lIAogIG11dGF0ZShwYXJ0aWNpcGFudCA9IGNhc2Vfd2hlbihpcy5uYShwYXJ0aWNpcGFudCkgfiAiTm8iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFfiJZZXMiKSkgJT4lIAogIHNlbGVjdCgtSUQpICU+JSAKICB0Ymxfc3VtbWFyeShieT1wYXJ0aWNpcGFudCwKICAgICAgICAgICAgICB0eXBlID0gbGlzdCAobXVsdGljZW50cmljIH4gImNhdGVnb3JpY2FsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kdXN0cnlfZnVuZGVkIH4gImNhdGVnb3JpY2FsIiksCiAgICAgICAgICAgICAgbGFiZWwgPSBsaXN0KHNwb25zb3JfdHlwZSB+ICJTcG9uc29yIFR5cGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBpbmR1c3RyeV9mdW5kZWQgfiAiSW5kdXN0cnkgRnVuZGVkIFRyaWFsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJpYWxfdHlwZSB+ICJUeXBlIG9mIFRyaWFsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgcGhhc2VfdHlwZSB+ICJUcmlhbCBQaGFzZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyaWFsX2R1cmF0aW9uIH4gIkR1cmF0aW9uIG9mIFRyaWFsIChEYXlzKSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZV9zaXplIH4gIlNhbXBsZSBTaXplIChUb3RhbCkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBzaXRlcyB+ICJOdW1iZXIgb2Ygc2l0ZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBtdWx0aWNlbnRyaWMgfiAiTXVsdGljZW50cmljIFRyaWFsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgbmF0aW9ucyB+ICJDb3VudHJ5IG9mIFJlY3J1aXRtZW50IgogICAgICAgICAgICAgICAgICAgICAgICAgICApKSAlPiUgCiAgYm9sZF9sYWJlbHMoKSU+JSAKICBhc19mbGV4X3RhYmxlKCkgJT4lIAogIHNldF9jYXB0aW9uKC4sIlRhYmxlIDMgOiBUcmlhbCBjaGFyYWN0ZXJpc3RpY3MgY29tcGFyZWQgYmV0d2VlbiB0cmlhbHMgd2hpY2ggcGFydGljaXBhdGVkIGluIHRoZSBzdXJ2ZXkgYW5kIHRob3NlIHRoYXQgZGlkIG5vdC4iKQpgYGAKCiMjIEVEQyBBZG9wdGlvbiBSYXRlCgoqKkVEQyBBZG9wdGlvbiBSYXRlIChFQVIpKio6IFRoZSBwcmltYXJ5IG91dGNvbWUgbWVhc3VyZSBpcyBFQVIuIFRoaXMgd2lsbCBiZSBkZWZpbmVkIGFzIHRoZSByYXRpbyBvZiB0aGUgbnVtYmVyIG9mIENUUkkgcmVnaXN0ZXJlZCB0cmlhbHMgdGhhdCB1c2UgYW4gRURDIHdpdGggc29waGlzdGljYXRpb24gbGV2ZWwgMiBvciBtb3JlIHRvIHRoYXQgb2YgdGhlIHBhcnRpY2lwYXRpbmcgdHJpYWxzICh1bmlxdWUgQ1RSSSByZWdpc3RlcmVkIHRyaWFscyBmb3Igd2hpY2ggaW52ZXN0aWdhdG9ycyBhZ3JlZWQgdG8gcGFydGljaXBhdGUgaW4gdGhlIHN0dWR5LiBUaGUgcHJvcG9ydGlvbiBhbmQgdGhlIGJpbm9taWFsIDk1JSBjb25maWRlbmNlIGludGVydmFscyBvZiB0aGUgc2FtZSB3aWxsIGJlIHJlcG9ydGVkLgoKVGhlICoqRURDIHNvcGhpc3RpY2F0aW9uIGxldmVsKiogaXMgZGVmaW5lZCBhcyBmb2xsb3dzOgoKLSAgICoqTGV2ZWwgMToqKiBUaGVyZSBpcyBhIHVuaXF1ZSBhY2NvdW50IGFuZCBwYXNzd29yZCBmb3IgZWFjaCB1c2VyIHRvIGFjY2VzcyB0aGUgb25saW5lIHN5c3RlbS4KCi0gICAqKkxldmVsIDI6KiogU2l0ZXMgZW50ZXIgc3ViamVjdCB2aXNpdCBkYXRhIHRocm91Z2ggYSBXZWIgaW50ZXJmYWNlIGludG8gZWxlY3Ryb25pYyBjYXNlIHJlcG9ydCBmb3JtcyAoZUNSRnMpLiBUaGUgY29tcGxldGlvbiBzdGF0dXMgb2YgZWFjaCBlQ1JGIGZvciBlYWNoIHN1YmplY3QgY2FuIGJlIHRyYWNrZWQgYXV0b21hdGljYWxseSBvbmxpbmUuIFRoZSBzeXN0ZW0gcHJvdmlkZXMgYW4gYXVkaXQgdHJhaWwgZm9yIGFsbCBkYXRhIGVudHJ5IGFuZCBkYXRhIG1vZGlmaWNhdGlvbgoKLSAgICoqTGV2ZWwgMzoqKiBEYXRhIHZhbGlkYXRpb24gaGFwcGVucyBhdXRvbWF0aWNhbGx5IHdoZW4gZGF0YSBhcmUgZW50ZXJlZCBpbnRvIHRoZSBlQ1JGLiBUaGUgc3lzdGVtIHdpbGwgYXV0b21hdGljYWxseSBsb2cgdGhlIHVzZXIgb2ZmIGFmdGVyIGEgcGVyaW9kIG9mIGluYWN0aXZpdHkuCgotICAgKipMZXZlbCA0OioqIFN1YmplY3RzIGFyZSByYW5kb21pemVkIGF1dG9tYXRpY2FsbHkKCi0gICAqKkxldmVsIDU6KiogU3ViamVjdCByZWNydWl0bWVudCBjYW4gYmUgdHJhY2tlZCBvbmxpbmUgZm9yIGVhY2ggc2l0ZQoKLSAgICoqTGV2ZWwgNjoqKiBUaGUgc3lzdGVtIGFsbG93cyB0cmFja2luZyBvZiBtZWRpY2F0aW9uIGludmVudG9yeSBhdCB0aGUgc2l0ZXMuCgpGb3IgYSBsZXZlbCB0byBiZSBjb25zaWRlcmVkIGNvbXBsZXRlLCAqKmFsbCB0aGUgcXVlc3Rpb25zKiogc2hvdWxkIGJlIG1hcmtlZCBhcyAqKlllcyoqLiBJZiBvbmUgb2YgdGhlIHF1ZXN0aW9ucyBpcyBtYXJrZWQgYXMgTm8gYW5kIGEgaGlnaGVyIGxldmVsIGlzIG1hcmtlZCBZZXMgdGhlbiB0aGUgKipoaWdoZXIgbGV2ZWwqKiB3aWxsIGJlIHRha2VuLiBGb3IgZWFjaCB1bmlxdWUgdHJpYWwgd2Ugd2lsbCB0aGVyZWZvcmUgY2FsY3VsYXRlIHRoZSBoaWdoZXN0IEVEQyBzb3BoaXN0aWNhdGlvbiBsZXZlbC4gSWYgRURDIGlzIG5vdCB1c2VkIHRoZW4gc29waGlzdGljYXRpb24gbGV2ZWwgd2lsbCBiZSBtYXJrZWQgYXMgbWlzc2luZy4KCmBgYHtyIENhbGN1bGF0ZSBoaWdoZXN0IEVEQyBTb3BoaXN0aWNhdGlvbiBSYXRlfQpkZiA8LSBkZiAlPiUgCiAgbXV0YXRlKGxldmVsMSA9IGNhc2Vfd2hlbihmZWF0dXJlX2FjY2VzcyA9PSAiWWVzIiB+IDEsIFRSVUUgfiAwKSwKICAgICAgICAgbGV2ZWwyID0gY2FzZV93aGVuKGZlYXR1cmVfZWNyZiA9PSAiWWVzIiAmIGZlYXR1cmVfYXVkaXQgPT0gIlllcyIgfiAxLCBUUlVFIH4gMCksCiAgICAgICAgIGxldmVsMyA9IGNhc2Vfd2hlbihmZWF0dXJlX3ZhbGlkYXRpb24gPT0gIlllcyIgJiBmZWF0dXJlX3NlY3VyaXR5ID09ICJZZXMiIH4gMSwgVFJVRSB+IDApLAogICAgICAgICBsZXZlbDQgPSBjYXNlX3doZW4oZmVhdHVyZV9yYW5kb21pemUgPT0gIlllcyIgfiAxLCBUUlVFIH4gMCksCiAgICAgICAgIGxldmVsNSA9IGNhc2Vfd2hlbihmZWF0dXJlX3RyYWNraW5nID09ICJZZXMiIH4gMSwgVFJVRSB+IDApLAogICAgICAgICBsZXZlbDYgPSBjYXNlX3doZW4oZmVhdHVyZV9tZWRfaW52ZW50b3J5ID09ICJZZXMiIH4gMSwgVFJVRSB+IDApCiAgICAgICAgICkgJT4lIAogIHNlbGVjdChzZXJpYWwsbGV2ZWwxOmxldmVsNikgJT4lIAogIHBpdm90X2xvbmdlcihjb2xzPS1zZXJpYWwsIG5hbWVzX3RvID0gIkxldmVsIiwgdmFsdWVzX3RvID0gIlN0YXR1cyIpICU+JSAKICBtdXRhdGUoTGV2ZWwgPSBzdHJfcmVtb3ZlKExldmVsLCJsZXZlbCIpKSAlPiUgCiAgbXV0YXRlKExldmVsID0gYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIoTGV2ZWwpKSkgJT4lIAogIGFycmFuZ2UoLixzZXJpYWwsIExldmVsKSAlPiUgCiAgZmlsdGVyKFN0YXR1cyA9PSAxKSAlPiUgCiAgZ3JvdXBfYnkoc2VyaWFsKSAlPiUgCiAgc3VtbWFyaXNlKGVkY19zb3BoaXN0aWNhdGlvbl9sZXZlbCA9IG1heChMZXZlbCkpICU+JSAKICB1bmdyb3VwKCkgJT4lIAogIGxlZnRfam9pbihkZiwuLGJ5PSJzZXJpYWwiKQoKYGBgCgpgYGB7ciBBZGQgZGF0YSBvbiBlYWNoIGluZGl2aWR1YWwgbGV2ZWwgb2YgRURDIFNvcGhpc3RpY2F0aW9ufQpkZiA8LSBkZiAlPiUgCiAgbXV0YXRlKGxldmVsXzEgPSBjYXNlX3doZW4oZmVhdHVyZV9hY2Nlc3MgPT0gIlllcyIgfiAiWWVzIiwgVFJVRSB+ICJObyIpLAogICAgICAgICBsZXZlbF8yID0gY2FzZV93aGVuKGZlYXR1cmVfZWNyZiA9PSAiWWVzIiAmIGZlYXR1cmVfYXVkaXQgPT0gIlllcyIgfiJZZXMiLCBUUlVFIH4gIk5vIiksCiAgICAgICAgIGxldmVsXzMgPSBjYXNlX3doZW4oZmVhdHVyZV92YWxpZGF0aW9uID09ICJZZXMiICYgZmVhdHVyZV9zZWN1cml0eSA9PSAiWWVzIiB+ICJZZXMiLCBUUlVFIH4gIk5vIiksCiAgICAgICAgIGxldmVsXzQgPSBjYXNlX3doZW4oZmVhdHVyZV9yYW5kb21pemUgPT0gIlllcyIgfiAiWWVzIiwgVFJVRSB+ICJObyIpLAogICAgICAgICBsZXZlbF81ID0gY2FzZV93aGVuKGZlYXR1cmVfdHJhY2tpbmcgPT0gIlllcyIgfiAiWWVzIiwgVFJVRSB+ICJObyIpLAogICAgICAgICBsZXZlbF82ID0gY2FzZV93aGVuKGZlYXR1cmVfbWVkX2ludmVudG9yeSA9PSAiWWVzIiB+ICJZZXMiLCBUUlVFIH4gIk5vIikKICAgICAgICAgKSAlPiUgCiAgc2VsZWN0KHNlcmlhbCxsZXZlbF8xOmxldmVsXzYpICU+JSAKICBsZWZ0X2pvaW4oZGYsLixieT0ic2VyaWFsIikKYGBgCgpgYGB7ciBBZGQgZGF0YSBvbiBFREMgQWRvcHRpb24gUmF0ZX0KZGYgPC0gZGYgJT4lIAogIG11dGF0ZShlZGNfYWRvcHRpb24gPSBjYXNlX3doZW4oZWRjX3NvcGhpc3RpY2F0aW9uX2xldmVsID4gMSB+ICJZZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSB+ICJObyIpKQpgYGAKClRoZSBmb2xsb3dpbmcgdGFibGUgc2hvd3MgdGhlIEVEQyBhZG9wdGlvbiByYXRlIGFuZCB0aGUgZGlmZmVyZW50IGxldmVscyBpbiB0aGUgdHJpYWxzIGZvciB3aGljaCByZXNwb25zZXMgd2VyZSByZWNlaXZlZCBpbiB0aGUgc3VydmV5LgoKYGBge3J9CmRmICU+JSBzZWxlY3Qoc2VyaWFsLGVkY191c2UsZWRjX2Fkb3B0aW9uLCBsZXZlbF8xOmxldmVsXzYpICU+JSAKICBwaXZvdF9sb25nZXIoY29scz0tc2VyaWFsKSAlPiUgCiAgZ3JvdXBfYnkobmFtZSx2YWx1ZSkgJT4lIAogIHN1bW1hcmlzZShjb3VudD1uKCkpICU+JSAKICB1bmdyb3VwKCkgJT4lIAogIHBpdm90X3dpZGVyKC4saWRfY29scz1uYW1lLG5hbWVzX2Zyb209dmFsdWUsdmFsdWVzX2Zyb20gPSBjb3VudCkgJT4lIAogIG11dGF0ZSh0b3RhbD1ZZXMrTm8pICU+JSAKICBtdXRhdGUocHJvcG9ydGlvbiA9IHJvdW5kKChZZXMvdG90YWwpKjEwMCwxKSkgJT4lIAogIHJvd3dpc2UoKSAlPiUgCiAgbXV0YXRlKGNpX2xvd2VyID0gcm91bmQoKGJpbmNvbmYoWWVzLHRvdGFsLG1ldGhvZD0id2lsc29uIilbMl0pKjEwMCwxKSwKICAgICAgICAgY2lfdXBwZXIgPSByb3VuZCgoYmluY29uZihZZXMsdG90YWwsbWV0aG9kPSJ3aWxzb24iKVszXSkqMTAwLDEpKSAlPiUgCiAgc2VsZWN0KG5hbWUsdG90YWwsWWVzLHByb3BvcnRpb24sY2lfbG93ZXIsY2lfdXBwZXIpICU+JSAKICBtdXRhdGUobmFtZSA9IHRvdXBwZXIoc3RyX3JlcGxhY2UobmFtZSwiXFxfIiwgIiAiKSkpICU+JSAKICBtdXRhdGUoIkNJIiA9IHBhc3RlKCIoICIsY2lfbG93ZXIsIiAtICIsIGNpX3VwcGVyLCIpIikpICU+JSAKICBzZWxlY3QobmFtZSx0b3RhbCxZZXMscHJvcG9ydGlvbixDSSkgJT4lIAogIHJlbmFtZShWYXJpYWJsZT1uYW1lLFRvdGFsID0gdG90YWwsIFBlcmNlbnRhZ2UgPSBwcm9wb3J0aW9uLCAiOTUlIENJIiA9IENJKSAlPiUgCiAgZmxleHRhYmxlKCkgJT4lIAogIHNldF9jYXB0aW9uKC4sIlRhYmxlIDQgOiBFREMgdXNlIGFuZCBhZG9wdGlvbiByYXRlIHdpdGggRURDIHNvcGhpc3RpY2F0aW9uIGxldmVscyBhbW9uZyByZXNwb25kaW5nIHN0dWRpZXMiKQogIApgYGAKClRoZSBmb2xsb3dpbmcgdGFibGUgc2hvd3MgdGhlIGJyZWFrZG93biBvZiBrZXkgdHJpYWwgY2hhcmFjdGVyaXN0aWNzIGJ5IEVEQyBhZG9wdGlvbiBzdGF0dXMuIENvbXBhcmlzb24gYmV0d2VlbiBncm91cHMgaGFzIGJlZW4gZG9uZSB1c2luZyBDaGktc3F1YXJlIHRlc3QgZm9yIGNhdGVnb3JpY2FsIHZhcmlhYmxlcyBhbmQgV2lsY294IHJhbmsgc3VtIHRlc3QgZm9yIGNvbnRpbnVvdXMgdmFyaWFibGVzLgoKYGBge3IgRURDIEFkb3B0aW9uIGJ5IHRyaWFsIHZhcmlhYmxlc30KCmRmICU+JSAKICBzZWxlY3QoZWRjX2Fkb3B0aW9uLHNwb25zb3JfdHlwZSxpbmR1c3RyeV9mdW5kZWQsdHJpYWxfdHlwZSxwaGFzZV90eXBlLHRyaWFsX2R1cmF0aW9uLHNhbXBsZV9zaXplLHNpdGVzLG11bHRpY2VudHJpYyxuYXRpb25zLGN0dV9hY2Nlc3MpICU+JQogIHRibF9zdW1tYXJ5KGJ5ID0gZWRjX2Fkb3B0aW9uLAogICAgICAgICAgICAgIHR5cGUgPSBsaXN0IChtdWx0aWNlbnRyaWMgfiAiY2F0ZWdvcmljYWwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBpbmR1c3RyeV9mdW5kZWQgfiAiY2F0ZWdvcmljYWwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBjdHVfYWNjZXNzIH4gImNhdGVnb3JpY2FsIiksCiAgICAgICAgICAgICAgbGFiZWwgPSBsaXN0KHNwb25zb3JfdHlwZSB+ICJTcG9uc29yIFR5cGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBpbmR1c3RyeV9mdW5kZWQgfiAiSW5kdXN0cnkgRnVuZGVkIFRyaWFsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJpYWxfdHlwZSB+ICJUeXBlIG9mIFRyaWFsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgcGhhc2VfdHlwZSB+ICJUcmlhbCBQaGFzZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyaWFsX2R1cmF0aW9uIH4gIkR1cmF0aW9uIG9mIFRyaWFsIChEYXlzKSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZV9zaXplIH4gIlNhbXBsZSBTaXplIChUb3RhbCkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBzaXRlcyB+ICJOdW1iZXIgb2Ygc2l0ZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBtdWx0aWNlbnRyaWMgfiAiTXVsdGljZW50cmljIFRyaWFsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgbmF0aW9ucyB+ICJDb3VudHJ5IG9mIFJlY3J1aXRtZW50IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R1X2FjY2VzcyB+ICJBY2Nlc3MgdG8gSW5zdGl0dXRpb25hbCBDVFUiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICkpICU+JSAKICBhZGRfc3RhdCgKICAgIGZucyA9IGxpc3QoYWxsX2NhdGVnb3JpY2FsKCkgfiBjaV9mdW5jdGlvbl9jYXQsCiAgICAgICAgICAgICAgIGFsbF9jb250aW51b3VzKCkgfiBjaV9mdW5jdGlvbl9jb24pLAogICAgbG9jYXRpb24gPSBhbGxfY2F0ZWdvcmljYWwoRkFMU0UpIH4gImxldmVsIgogICkgJT4lIAogIG1vZGlmeV9oZWFkZXIoc3RhcnRzX3dpdGgoImFkZF9zdGF0XyIpIH4gIioqOTUlIENJKioiKSAlPiUKICAjIG1vdmUgY29sdW1ucyB0byBhbGlnbiBDSXMgd2l0aCBjZW50cmFsIGVzdGltYXRlcwogIG1vZGlmeV90YWJsZV9ib2R5KH4ueCAlPiUgcmVsb2NhdGUoYWRkX3N0YXRfMSwgLmFmdGVyID0gc3RhdF8xKSkgJT4lIAogIGFkZF9uKCkgJT4lIAogIGFkZF9wKCkgJT4lIAogIGJvbGRfbGFiZWxzKCkgJT4lIAogIGFkZF9vdmVyYWxsKCkgJT4lIAogIGFzX2ZsZXhfdGFibGUoKSU+JSAKICBzZXRfY2FwdGlvbiguLCJUYWJsZSA1IDogQ29tcGFyaXNpb24gb2YgdHJpYWwgY2hhcmFjdGVyaXN0aWNzIGJldHdlZW4gdHJpYWxzIHdpdGggYWRvcHRlZCBhbiBFREMgYW5kIHRob3NlIHRoYXQgZGlkIG5vdCIpCgpgYGAKCiMjIEluZmx1ZW5jZSBvZiB0cmlhbCBwYXJhbWV0ZXJzIG9uIEVBUgoKSW5mbHVlbmNlIG9mIHRyaWFsIHBhcmFtZXRlcnMgb24gRUFSCgpUbyBkZXRlcm1pbmUgdGhlIGluZmx1ZW5jZSBvZiB0aGUgdHJpYWwgcGFyYW1ldGVycyBvbiBFQVIsIHdlIHdpbGwgdXNlIGEgbG9naXN0aWMgcmVncmVzc2lvbiBtb2RlbCB3aGVyZSB0aGUgZGVwZW5kZW50IHZhcmlhYmxlIHdpbGwgYmUgRURDIGFkb3B0aW9uIHdpdGggRURDIHNvcGhpc3RpY2F0aW9uIGxldmVsIDIgb3IgbW9yZSAobW9kZWxlZCBhcyBZZXMgb3IgTm8pLiBJbmRlcGVuZGVudCB2YXJpYWJsZXMgd2lsbCBiZTpcCjEuIFRyaWFsIHNwb25zb3I6IEluZHVzdHJ5IG9yIEludmVzdGlnYXRvci1Jbml0aWF0ZWQuIEluIHN0dWRpZXMgd2hlcmUgdGhlIHByaW1hcnkgc3BvbnNvciBpcyBhIHBoYXJtYWNldXRpY2FsIGNvbXBhbnkgb3IgZGV2aWNlIG1hbnVmYWN0dXJlciwgdGhlIHVzZXIgd2lsbCBiZSBjb25zaWRlcmVkIGluZHVzdHJ5LXNwb25zb3JlZCwgYW5kIHRoZSByZXN0IHdpbGwgYmUgY29uc2lkZXJlZCBpbnZlc3RpZ2F0b3ItaW5pdGlhdGVkLlwKMi4gVHJpYWwgc2FtcGxlIHNpemU6IFRvdGFsIHRyaWFsIHNhbXBsZSBzaXplIHdpbGwgYmUgbW9kZWxlZCBhcyBhIGNvbnRpbnVvdXMgdmFyaWFibGUuIFRvIHJlbGF4IHRoZSBsaW5lYXJpdHkgYXNzdW1wdGlvbiwgdGhpcyB3aWxsIGJlIGV4cGFuZGVkIHVzaW5nIGEgcmVzdHJpY3RlZCBjdWJpYyBzcGxpbmUgd2l0aCAzIGtub3RzLlwKMy4gVHJpYWwgc2l0ZXM6IFRoZSBudW1iZXIgb2Ygc2l0ZXMgd2lsbCBhbHNvIGJlIG1vZGVsZWQgYXMgYSBjb250aW51b3VzIHZhcmlhYmxlLiBBZ2FpbiB0byByZWxheCB0aGUgbGluZWFyaXR5IGFzc3VtcHRpb25zLCB0aGUgbW9kZWwgdGVybSB3aWxsIGJlIGV4cGFuZGVkIHVzaW5nIGEgcmVzdHJpY3RlZCBjdWJpYyBzcGxpbmUgd2l0aCB0aHJlZSBrbm90cy4KCkludGVyYWN0aW9ucyB3aWxsIGJlIHRlc3RpbmcgaW4gYW4gb21uaWJ1cyBtb2RlbCBjb250YWluaW5nIGFsbCBpbnRlcmFjdGlvbiB0ZXJtcy4gV2FsZCB0ZXN0IHdpbGwgYmUgdXNlZCBmb3IgZGV0ZXJtaW5pbmcgdGhlIHNpZ25pZmljYW5jZSBvZiBhbnkgaW50ZXJhY3Rpb24uIE9kZHMgcmF0aW9zIHdpdGggOTUlIGNvbmZpZGVuY2UgaW50ZXJ2YWxzIHdpbGwgYmUgcmVwb3J0ZWQuCgpgYGB7cn0KZGQgPC0gZGF0YWRpc3QoZGYpCm9wdGlvbnMoZGF0YWRpc3Q9ImRkIikKbW9kZWwxIDwtIGxybShlZGNfYWRvcHRpb25+cmNzKHNhbXBsZV9zaXplLDMpKihzaXRlcytpbmR1c3RyeV9mdW5kZWQpLGRhdGE9ZGYseCA9IFQseT1ULGxpbmVhci5wcmVkaWN0b3JzID0gVCkKYW5vdmEobW9kZWwxKQpgYGAKCkFzIHRoZSByZXN1bHRzIG9mIHRoZSBhYm92ZSBBTk9WQSBzaG93LCB0aGUgV2FsZCB0ZXN0IGZvciBub24tbGluZWFyIHRlcm1zIGFzIHdlbGwgYXMgaW50ZXJhY3Rpb25zIGlzIG5vdCBzaWduaWZpY2FudC4gSGVuY2Ugd2Ugc2hvdyB0aGUgc2ltcGxpZmllZCBtb2RlbCB3aXRob3V0IHRoZSBpbnRlcmFjdGlvbiB0ZXJtcyBhcyB3ZWxsIGFzIHdpdGhvdXQgdGhlIG5vbi1saW5lYXIgYXNzdW1wdGlvbi4gVGhlIHRhYmxlIGJlbG93IHNob3dzIHRoZSByZXN1bHRzIG9mIHRoZSBsb2dpc3RpYyByZWdyZXNzaW9uIGFuYWx5c2lzLgoKYGBge3J9CmRmIDwtIGRmICU+JSBtdXRhdGUoZWRjX2Fkb3B0aW9uID0gYXMuZmFjdG9yKGVkY19hZG9wdGlvbikpIAptb2RlbDEgPC0gZ2xtKGVkY19hZG9wdGlvbn5zYW1wbGVfc2l6ZStzaXRlcytpbmR1c3RyeV9mdW5kZWQsZGF0YT1kZiwgZmFtaWx5PWJpbm9taWFsKQp0YmxfcmVncmVzc2lvbihtb2RlbDEsZXhwb25lbnRpYXRlID0gVCxpbnRlcmNlcHQ9VCkgJT4lIAogIGFkZF9uZXZlbnQoKSAlPiUgCiAgYWRkX24oKSAlPiUgCiAgYm9sZF9sYWJlbHMoKSAlPiUgCiAgYXNfZmxleF90YWJsZSgpICU+JSAKICBzZXRfY2FwdGlvbiguLCJUYWJsZSA2IDogTXVsdGl2YXJpYWJsZSBhbmFseXNpcyBvZiBmYWN0b3JzIGluZmx1ZW5jaW5nIEVEQyB1c2UiKQpgYGAKCiMjIEVEQyBTb3BoaXN0aWNhdGlvbiBMZXZlbAoKV2Ugd2lsbCBwcm92aWRlIGRhdGEgb24gdGhlIG1lZGlhbiBFREMgc29waGlzdGljYXRpb24gbGV2ZWxzIGFzIHdlbGwgYXMgYSBwbG90IHNob3dpbmcgdGhlIHByb3BvcnRpb24gb2YgQ1RSSSByZWdpc3RlcmVkIHRyaWFscyB3aXRoIGRpZmZlcmVudCBsZXZlbHMgb2YgRURDIHNvcGhpc3RpY2F0aW9uLiBGdXJ0aGVyIHZpc3VhbGl6YXRpb24gYW5kIGFuYWx5c2lzIHdpbGwgYWxzbyBleHBsb3JlIHRoZSBhc3NvY2lhdGlvbiBiZXR3ZWVuIHRyaWFsIHNhbXBsZSBzaXplLCBudW1iZXIgb2YgdHJpYWwgc2l0ZXMsIGFuZCB0eXBlIG9mIHRyaWFsIHNwb25zb3JzaGlwIHdpdGggRURDIHNvcGhpc3RpY2F0aW9uLgoKYGBge3J9CmRmICU+JSBzZWxlY3QoZWRjX3NvcGhpc3RpY2F0aW9uX2xldmVsKSAlPiUgCiAgcmVuYW1lKCJIaWdoZXN0IEVEQyBzb3BoaXN0aWNhdGlvbiBMZXZlbCIgPSBlZGNfc29waGlzdGljYXRpb25fbGV2ZWwpICU+JSAKICB0Ymxfc3VtbWFyeSgpICU+JQogIGFzX2ZsZXhfdGFibGUoKSAlPiUgCiAgc2V0X2NhcHRpb24oLiwiVGFibGUgNyA6IEhpZ2hlc3QgbGV2ZWwgb2YgRURDIHNvcGhpc3RpY2F0aW9uIikKCmRmICU+JSBzZWxlY3QoZWRjX3NvcGhpc3RpY2F0aW9uX2xldmVsKSAlPiUgCiAgZ3JvdXBfYnkoZWRjX3NvcGhpc3RpY2F0aW9uX2xldmVsKSAlPiUgCiAgc3VtbWFyaXNlKGNvdW50PW4oKSkgJT4lIAogIGZpbHRlcighaXMubmEoZWRjX3NvcGhpc3RpY2F0aW9uX2xldmVsKSkgJT4lIAogIG11dGF0ZShlZGNfc29waGlzdGljYXRpb25fbGV2ZWw9YXMuZmFjdG9yKGVkY19zb3BoaXN0aWNhdGlvbl9sZXZlbCkpICU+JSAKICBnZ3Bsb3QoLixhZXMoeD1lZGNfc29waGlzdGljYXRpb25fbGV2ZWwseT1jb3VudCkpK2dlb21fYmFyKHN0YXQ9ImlkZW50aXR5IikrZ2VvbV9sYWJlbChhZXMobGFiZWw9Y291bnQpKSArIGxhYnModGl0bGU9IkZpZ3VyZSAxOiBIaWdoZXN0IEVEQyBzb3BoaXN0aWNhdGlvbiBMZXZlbCIseD0iRURDIFNvcGhpc3RpY2F0aW9uIExldmVsIix5PSJOdW1iZXIgb2YgVHJpYWxzIikgCgoKYGBgCgpJbiB0aGUgZm9sbG93aW5nIHRhYmxlIHdlIHdpbGwgc2hvdyB0aGUgdW5pdmFyaWFibGUgYW5hbHlzaXMgb2YgdGhlIGZhY3RvcnMgd2hpY2ggaW5mbHVlbmNlZCBFREMgc29waGlzdGljYXRpb24gbGV2ZWwuIFdlIHdpbGwgZGljaG90b21pemUgdGhlIGxldmVsIGludG8gdHdvIGNhdGVnb3JpZXMgKHNjb3JlIDYgb3Igc2NvcmUgMS01KS4KCmBgYHtyfQpkZiAlPiUgCiAgc2VsZWN0KGVkY19zb3BoaXN0aWNhdGlvbl9sZXZlbCxzcG9uc29yX3R5cGUsaW5kdXN0cnlfZnVuZGVkLHRyaWFsX3R5cGUscGhhc2VfdHlwZSx0cmlhbF9kdXJhdGlvbixzYW1wbGVfc2l6ZSxzaXRlcyxuYXRpb25zLG11bHRpY2VudHJpYyxjdHVfYWNjZXNzKSAlPiUgCiAgbXV0YXRlKGVkY19zb3BoaXN0aWNhdGlvbl9sZXZlbF90eXBlID0gY2FzZV93aGVuKGVkY19zb3BoaXN0aWNhdGlvbl9sZXZlbCA9PSA2IH4gIkxldmVsIDYiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZGNfc29waGlzdGljYXRpb25fbGV2ZWwgPDYgfiAiTGV2ZWwgMSAtIDUiKSkgJT4lIAogIHNlbGVjdCgtZWRjX3NvcGhpc3RpY2F0aW9uX2xldmVsKSAlPiUgCiAgdGJsX3N1bW1hcnkoYnk9ZWRjX3NvcGhpc3RpY2F0aW9uX2xldmVsX3R5cGUsCiAgICAgICAgICAgICAgdHlwZSA9IGxpc3QgKG11bHRpY2VudHJpYyB+ICJjYXRlZ29yaWNhbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZHVzdHJ5X2Z1bmRlZCB+ICJjYXRlZ29yaWNhbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0dV9hY2Nlc3MgfiAiY2F0ZWdvcmljYWwiKSwKICAgICAgICAgICAgICBsYWJlbCA9IGxpc3Qoc3BvbnNvcl90eXBlIH4gIlNwb25zb3IgVHlwZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZHVzdHJ5X2Z1bmRlZCB+ICJJbmR1c3RyeSBGdW5kZWQgVHJpYWwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICB0cmlhbF90eXBlIH4gIlR5cGUgb2YgVHJpYWwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBwaGFzZV90eXBlIH4gIlRyaWFsIFBoYXNlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJpYWxfZHVyYXRpb24gfiAiRHVyYXRpb24gb2YgVHJpYWwgKERheXMpIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlX3NpemUgfiAiU2FtcGxlIFNpemUgKFRvdGFsKSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpdGVzIH4gIk51bWJlciBvZiBzaXRlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIG11bHRpY2VudHJpYyB+ICJNdWx0aWNlbnRyaWMgVHJpYWwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBuYXRpb25zIH4gIkNvdW50cnkgb2YgUmVjcnVpdG1lbnQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBjdHVfYWNjZXNzIH4gIkFjY2VzcyB0byBJbnN0aXR1dGlvbmFsIENUVSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgKSkgJT4lIAogIGFkZF9wKCkgJT4lCiAgYm9sZF9sYWJlbHMoKSAlPiUgCiAgYXNfZmxleF90YWJsZSgpICU+JSAKICBzZXRfY2FwdGlvbiguLCJUYWJsZSA4IDogVW5pdmFyaWF0ZSBhbmFseXNpcyBvZiBmYWN0b3JzIGFzc29jaWF0ZWQgd2l0aCBFREMgc29waGlzdGljYXRpb24gbGV2ZWwiKQpgYGAKCiMjIEVBUiBUaW1lIHRyZW5kcwoKRm9yIHVuaXF1ZSByZXNwb25kaW5nIENUUkkgcmVnaXN0ZXJlZCB0cmlhbHMsIHdlIHdpbGwgY3JlYXRlIGEgc3Vic2V0IGNvbnRhaW5pbmcgdHJpYWxzIHJlZ2lzdGVyZWQgb24gb3IgYWZ0ZXIgMXN0IEphbnVhcnkgMjAxMC4gRnJvbSB0aGlzIHN1YnNldCwgd2Ugd2lsbCB0aGVuIGFnZ3JlZ2F0ZSB0aGUgRUFSIGZvciBlYWNoIHllYXIgYmFzZWQgb24gdGhlIG1ldGhvZG9sb2d5IGZvciBjYWxjdWxhdGluZyBFQVIgYXMgYWJvdmUuIFRoaXMgd2lsbCBiZSBncmFwaGljYWxseSBkZW1vbnN0cmF0ZWQgdXNpbmcgYSBiYXIgcGxvdCBvciBhIGRvdCBwbG90IHdpdGggYSBiYXIgZm9yIGVhY2ggeWVhci4gTm90ZSB0aGF0IGFzIGVhY2ggdHJpYWwgaXMgaW5kZXBlbmRlbnQgb2YgZWFjaCBvdGhlcnMsIHdlIHdpbGwgbm90IHVzZSBhIGxpbmUgcGxvdCBmb3IgdGhlIHZpc3VhbGl6YXRpb24uIEVBUiB3aWxsIGJlIGNvbXBhcmVkIGJldHdlZW4gdHdvIHRpbWUgcGVyaW9kczogcGVyaW9kIDEgZnJvbSAxc3QgSmFudWFyeSAyMDE1IHRvIDMxc3QgRGVjZW1iZXIgMjAxOSBhbmQgcGVyaW9kIDIgZnJvbSAxc3QgSmFudWFyeSAyMDEwIHRvIDMxc3QgRGVjZW1iZXIgMjAxNC4gR2l2ZW4gdGhhdCBtb3N0IHJhbmRvbWl6ZWQgdHJpYWxzIHdpbGwgYmUgY29tcGxldGVkIGJ5IDEwIHllYXJzLCB3ZSBleHBlY3QgdG8gaGF2ZSBmZXcgb3BlbiBjbGluaWNhbCB0cmlhbHMgYXZhaWxhYmxlIGZvciBhbmFseXNpcyB0aGF0IHdhcyByZWdpc3RlcmVkIGJlZm9yZSAyMDEwLiBIb3dldmVyLCBpZiBtb3JlIHRoYW4gMzAgdHJpYWxzIGFyZSBhdmFpbGFibGUsIHdlIHdpbGwgYWxzbyBhbmFseXplIGFuIGVhcmxpZXIgdGltZSBwb2ludCwgaS5lLiwgYmV0d2VlbiAxc3QgSmFudWFyeSAyMDA1IGFuZCAzMXN0IERlY2VtYmVyIDIwMDkuCgpgYGB7cn0KZGYgJT4lIHNlbGVjdChzZXJpYWwsZGF0ZV9yZWdpc3RlcmVkLGVkY19hZG9wdGlvbikgJT4lIAogIG11dGF0ZShkYXRlX3JlZ2lzdGVyZWQgPSBkbXkoZGF0ZV9yZWdpc3RlcmVkKSkgJT4lIAogIG11dGF0ZShyZWdfcGVyaW9kID0gY2FzZV93aGVuKGRhdGVfcmVnaXN0ZXJlZCA8PSAiMjAwOS0xMi0zMSIgfiAiUHJlIDIwMTAiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGVfcmVnaXN0ZXJlZCA+PSAiMjAxMC0wMS0wMSIgJiBkYXRlX3JlZ2lzdGVyZWQgPD0gIjIwMTQtMTItMzEiIH4gIlBlcmlvZCAyICgyMDEwIC0gMjAxNCkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGVfcmVnaXN0ZXJlZCA+PSAiMjAxNS0wMS0wMSIgJiBkYXRlX3JlZ2lzdGVyZWQgPD0gIjIwMTktMTItMzEiIH4gIlBlcmlvZCAxICgyMDE1IC0gMjAxOSkiKSkgJT4lIAogIHNlbGVjdChlZGNfYWRvcHRpb24scmVnX3BlcmlvZCkgJT4lIAogIHRibF9zdW1tYXJ5KGJ5PXJlZ19wZXJpb2QpICU+JSAKICBhc19mbGV4X3RhYmxlKCkgJT4lIAogIHNldF9jYXB0aW9uKC4sIlRhYmxlIDkgOiBFQVIgYWNyb3NzIHRpbWUgcGVyaW9kIikKCgpkZiAlPiUgc2VsZWN0KGVkY19hZG9wdGlvbixkYXRlX3JlZ2lzdGVyZWQpICU+JQogIG11dGF0ZSh5ZWFyX3JlZ2lzdGVyZWQgPSB5ZWFyKGRteShkYXRlX3JlZ2lzdGVyZWQpKSkgJT4lIAogIHNlbGVjdCh5ZWFyX3JlZ2lzdGVyZWQsZWRjX2Fkb3B0aW9uKSAlPiUgCiAgZ3JvdXBfYnkoeWVhcl9yZWdpc3RlcmVkLGVkY19hZG9wdGlvbikgJT4lIAogIHN1bW1hcmlzZShjb3VudD0gbigpKSAlPiUgCiAgcGl2b3Rfd2lkZXIoaWRfY29scyA9IHllYXJfcmVnaXN0ZXJlZCwgbmFtZXNfZnJvbSA9IGVkY19hZG9wdGlvbiwgdmFsdWVzX2Zyb209Y291bnQsdmFsdWVzX2ZpbGwgPSAwKSAlPiUgCiAgbXV0YXRlKHRvdGFsID0gWWVzK05vKSAlPiUgCiAgbXV0YXRlKGVhciA9IHJvdW5kKChZZXMvdG90YWwpKjEwMCwxKSkgJT4lIAogIG11dGF0ZShjaV9sb3dlciA9IHJvdW5kKChiaW5jb25mKFllcyx0b3RhbCxtZXRob2Q9IndpbHNvbiIpWzJdKSoxMDAsMSksCiAgICAgICAgIGNpX3VwcGVyID0gcm91bmQoKGJpbmNvbmYoWWVzLHRvdGFsLG1ldGhvZD0id2lsc29uIilbM10pKjEwMCwxKSkgJT4lIAogIGZpbHRlcihZZXM+MSkgJT4lIAogIG11dGF0ZSh5ZWFyX3JlZ2lzdGVyZWQ9YXMuZmFjdG9yKHllYXJfcmVnaXN0ZXJlZCkpICU+JSAKICBnZ3Bsb3QoLixhZXMoeD15ZWFyX3JlZ2lzdGVyZWQseT1lYXIpKStnZW9tX3BvaW50KCkgKyBnZW9tX2Vycm9yYmFyKGFlcyh5bWF4PWNpX3VwcGVyLHltaW49Y2lfbG93ZXIpKStnZW9tX2xhYmVsKGFlcyhsYWJlbD1lYXIpKSsKICBnZ3RpdGxlKCJGaWd1cmUgMjogVGltZSBUcmVuZCBvZiBFREMgQWRvcHRpb24gcmF0ZSIpICsgeGxhYigiWWVhciIpICsgeWxhYigiRURDIEFkb3B0aW9uIFJhdGUgKCUpIikKYGBgCgojIEFkZGl0aW9uYWwgQW5hbHlzZXMKCkFkZGl0aW9uYWxseSB0aGUgc3VydmV5IGNvbGxlY3RlZCBkYXRhIG9uIGFsdGVybmF0aXZlIG1ldGhvZHMgZm9yIGRhdGEgY29sbGVjdGlvbiB1c2VkIGluIHRoZSB0cmlhbCBhcyB3ZWxsIGEgc2luZ2xlIGl0ZW0gcXVlc3Rpb24gb24gdGhlIGtleSBwZXJjZWl2ZWQgYmFycmllcnMgdG93YXJkcyBhZG9wdGlvbiBvZiBFREMgaW4gdGhlaXIgdHJpYWwuCgpgYGB7cn0KZGYgJT4lICBmaWx0ZXIoZWRjX3VzZT09Ik5vIikgJT4lIAogIHNlbGVjdChub19lZGNfX3NwcmVhZHNoZWV0LG5vX2VkY19fbWFpbCxub19lZGNfX2ZheCkgJT4lIAogIHJlbmFtZSgiU3ByZWFkc2hlZXQiID0gbm9fZWRjX19zcHJlYWRzaGVldCwKICAgICAgICAgIkRhdGEgc2VudCBieSBFbWFpbCIgPSBub19lZGNfX21haWwsCiAgICAgICAgICJEYXRhIHNlbnQgYnkgRmF4IiA9IG5vX2VkY19fZmF4CiAgICAgICAgICkgJT4lIAogIHRibF9zdW1tYXJ5KCkgJT4lIAogIGFkZF9uKCkgJT4lIAogIGJvbGRfbGFiZWxzKCkgJT4lIAogIGFzX2ZsZXhfdGFibGUoKSU+JSAKICBzZXRfY2FwdGlvbiguLCJUYWJsZSAxMCA6IERhdGEgY29sbGVjdGlvbiBtZXRob2RzIHVzZWQgd2hlbiBFREMgd2FzIG5vdCB1c2VkIikKYGBgCgpgYGB7cn0KZGYgJT4lCiAgZmlsdGVyKGVkY191c2U9PSJObyIpICU+JSAKICBzZWxlY3Qod2hpY2hfb2ZfdGhlX2ZvbGxvd2luZ193ZXJlX3RoZV9pbXBvcnRhbnRfYmFycmllcl90b19pbXBsZW1lbnRhdF9fQ29tcGxleC5yZWd1bGF0b3J5LnJlcXVpcmVtZW50cywKICAgICAgICAgICAgICB3aGljaF9vZl90aGVfZm9sbG93aW5nX3dlcmVfdGhlX2ltcG9ydGFudF9iYXJyaWVyX3RvX2ltcGxlbWVudGF0X19MYWNrLm9mLnRlY2huaWNhbC5zdXBwb3J0LAogICAgICAgICAgICAgIHdoaWNoX29mX3RoZV9mb2xsb3dpbmdfd2VyZV90aGVfaW1wb3J0YW50X2JhcnJpZXJfdG9faW1wbGVtZW50YXRfX0Nvc3RseS5Tb2Z0d2FyZSwKICAgICAgICAgICAgICB3aGljaF9vZl90aGVfZm9sbG93aW5nX3dlcmVfdGhlX2ltcG9ydGFudF9iYXJyaWVyX3RvX2ltcGxlbWVudGF0X19MYWNrLm9mLm1vdGl2YXRpb24uYW1vbmcuY2xpbmljYWwudHJpYWwuc3RhZmYsCiAgICAgICAgICAgICAgd2hpY2hfb2ZfdGhlX2ZvbGxvd2luZ193ZXJlX3RoZV9pbXBvcnRhbnRfYmFycmllcl90b19pbXBsZW1lbnRhdF9fTGFjay5vZi51c2VyLmZyaWVuZGx5LnNvZnR3YXJlKSAlPiUgCiAgbXV0YXRlKGFjcm9zcyhzdGFydHNfd2l0aCgid2hpY2hfb2YiKSx+Y2FzZV93aGVuKC49PSJYIiB+ICJZZXMiLFRSVUV+Ik5vIikpKSAlPiUgIAogIHJlbmFtZSgiQ29tcGxleCBSZWd1bGF0b3J5IFJlcXVpcmVtZW50cyIgPSB3aGljaF9vZl90aGVfZm9sbG93aW5nX3dlcmVfdGhlX2ltcG9ydGFudF9iYXJyaWVyX3RvX2ltcGxlbWVudGF0X19Db21wbGV4LnJlZ3VsYXRvcnkucmVxdWlyZW1lbnRzLAogICAgICAgICAiTGFjayBvZiBUZWNobmljYWwgU3VwcG9ydCIgPSB3aGljaF9vZl90aGVfZm9sbG93aW5nX3dlcmVfdGhlX2ltcG9ydGFudF9iYXJyaWVyX3RvX2ltcGxlbWVudGF0X19MYWNrLm9mLnRlY2huaWNhbC5zdXBwb3J0LAogICAgICAgICAiU29mdHdhcmUgQ29zdCIgPSAgd2hpY2hfb2ZfdGhlX2ZvbGxvd2luZ193ZXJlX3RoZV9pbXBvcnRhbnRfYmFycmllcl90b19pbXBsZW1lbnRhdF9fQ29zdGx5LlNvZnR3YXJlLAogICAgICAgICAiQ1RVIFN0YWZmIE1vdGl2YXRpb24gdG8gaW1wbGVtZW50IEVEQyIgPSB3aGljaF9vZl90aGVfZm9sbG93aW5nX3dlcmVfdGhlX2ltcG9ydGFudF9iYXJyaWVyX3RvX2ltcGxlbWVudGF0X19MYWNrLm9mLm1vdGl2YXRpb24uYW1vbmcuY2xpbmljYWwudHJpYWwuc3RhZmYsCiAgICAgICAgICJMYWNrIG9mIHVzZXIgZnJpZW5kbHkgU29mdHdhcmUiID0gd2hpY2hfb2ZfdGhlX2ZvbGxvd2luZ193ZXJlX3RoZV9pbXBvcnRhbnRfYmFycmllcl90b19pbXBsZW1lbnRhdF9fTGFjay5vZi51c2VyLmZyaWVuZGx5LnNvZnR3YXJlKSAlPiUKICBwaXZvdF9sb25nZXIoY29scz1jKDE6NSksbmFtZXNfdG8gPSAiUmVhc29uIikgJT4lIAogIGdyb3VwX2J5KFJlYXNvbix2YWx1ZSkgJT4lIAogIHN1bW1hcmlzZShjb3VudD1uKCkpICU+JSAKICBwaXZvdF93aWRlcihpZF9jb2xzID0gUmVhc29uLCBuYW1lc19mcm9tPXZhbHVlLHZhbHVlc19mcm9tPWNvdW50KSAlPiUgCiAgbXV0YXRlKHRvdGFsID0gTm8rWWVzLAogICAgICAgICBwZXJjZW50ID0gcm91bmQoKFllcy90b3RhbCkqMTAwLDEpKSAlPiUgCiAgbXV0YXRlKGNpX2xvd2VyID0gcm91bmQoKGJpbmNvbmYoWWVzLHRvdGFsLG1ldGhvZD0id2lsc29uIilbMl0pKjEwMCwxKSwKICAgICAgICAgY2lfdXBwZXIgPSByb3VuZCgoYmluY29uZihZZXMsdG90YWwsbWV0aG9kPSJ3aWxzb24iKVszXSkqMTAwLDEpKSAlPiUgCiAgc2VsZWN0KFJlYXNvbix0b3RhbCxZZXMscGVyY2VudCxjaV9sb3dlcixjaV91cHBlcikgJT4lIAogIG11dGF0ZSgiQ0kiID0gcGFzdGUoIiggIixjaV9sb3dlciwiIC0gIiwgY2lfdXBwZXIsIikiKSkgJT4lIAogIHNlbGVjdChSZWFzb24sdG90YWwsWWVzLHBlcmNlbnQsQ0kpICU+JSAKICBhcnJhbmdlKC1wZXJjZW50KSAlPiUgCiAgcmVuYW1lKFRvdGFsID0gdG90YWwsIFBlcmNlbnRhZ2UgPSBwZXJjZW50LCAiOTUlIENJIiA9IENJKSAlPiUgCiAgZmxleHRhYmxlKCklPiUgCiAgc2V0X2NhcHRpb24oLiwiVGFibGUgMTEgOiBSZWFzb24gZm9yIG5vdCB1c2luZyBFREMiKQogIAoKYGBgCgpPdGhlciByZWFzb25zIGlkZW50aWZpZWQgZm9yIG5vdCB1c2luZyBFREMgd2VyZToKCmBgYHtyfQpkZiAlPiUKICBmaWx0ZXIoZWRjX3VzZT09Ik5vIikgJT4lIAogIGZpbHRlcih3aGljaF9vZl90aGVfZm9sbG93aW5nX3dlcmVfdGhlX2ltcG9ydGFudF9iYXJyaWVyX3RvX2ltcGxlbWVudGF0X19PdGhlciE9IiIpICU+JSAKICBzZWxlY3Qod2hpY2hfb2ZfdGhlX2ZvbGxvd2luZ193ZXJlX3RoZV9pbXBvcnRhbnRfYmFycmllcl90b19pbXBsZW1lbnRhdF9fT3RoZXIpICU+JSAKICBkaXN0aW5jdCguKSAlPiUgCiAgcmVuYW1lKCJSZWFzb25zIiA9IHdoaWNoX29mX3RoZV9mb2xsb3dpbmdfd2VyZV90aGVfaW1wb3J0YW50X2JhcnJpZXJfdG9faW1wbGVtZW50YXRfX090aGVyKSAlPiUgCiAgZmxleHRhYmxlKCkgJT4lIAogIHNldF9jYXB0aW9uKC4sIlRhYmxlIDEyIDogRnJlZSB0ZXh0IHJlc3BvbnNlcyB0byByZWFzb25zIGZvciBub3QgdXNpbmcgRURDIGluIHRyaWFsIikKYGBgCgpGaW5hbGx5IHR3byBhZGRpdGlvbmFsIHF1ZXN0aW9ucyB3ZXJlIGFza2VkIGFib3V0IHRoZSB0cmlhbCBjZW50ZXIgd2VhdGhlciB0aGV5IGhhZCBhY2Nlc3MgdG8gYSBDVFUgYW5kIGFuIElSQi4gV2Ugd2lsbCBldmFsdWF0ZSB0aGUgZGF0YSBpbiByZWxhdGlvbiB0byBFREMgdXNlLgoKYGBge3J9CmRmICU+JSAKICBtdXRhdGUocmVzb3VyY2UgPSBjYXNlX3doZW4oY3R1X2FjY2VzcyA9PSAiWWVzIiAmIGlyYiA9PSAiWWVzIiB+ICJCb3RoIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R1X2FjY2VzcyA9PSAiWWVzIiAmIGlyYiA9PSAiTm8iIH4gIk9ubHkgQ1RVIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R1X2FjY2VzcyA9PSAiTm8iICYgaXJiID09ICJZZW8iIH4gIk9ubHkgSVJCIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSB+ICJOb25lIikpICU+JSAKICBzZWxlY3QoZWRjX2Fkb3B0aW9uLHJlc291cmNlKSAlPiUgCiAgdGJsX3N1bW1hcnkoYnk9ZWRjX2Fkb3B0aW9uKSAlPiUgCiAgYWRkX24oKSAlPiUgCiAgYm9sZF9sYWJlbHMoKSAlPiUgCiAgYWRkX3AoKSAlPiUgCiAgYXNfZmxleF90YWJsZSgpICU+JSAKICBzZXRfY2FwdGlvbiguLCJUYWJsZSAxMyA6IEVEQyBhZG9wdGlvbiBieSBDVFUgYW5kIElSQiBhdmFpbGFiaWxpdHkiKQoKYGBgCgoKIyBJbmR1c3RyeSBTcG9uc29yZWQgdHJpYWxzCgpUaGUgcGVyY2VudGFnZSBvZiBpbmR1c3RyeSBzcG9uc29yZWQgdHJpYWxzIGJ5IGVhY2ggeWVhciBvZiByZWdpc3RyYXRpb24gaXMgc2hvd24gaW4gdGhlIGZpZ3VyZSBiZWxvdy4gCgoKYGBge3J9CnRyaWFsX2RldGFpbHMgJT4lIAogIHNlbGVjdChzcG9uc29yX3R5cGUsZGF0ZV9yZWdpc3RlcmVkKSAlPiUKICBtdXRhdGUoZGF0ZV9yZWdpc3RlcmVkID0gZG15KGRhdGVfcmVnaXN0ZXJlZCkpICU+JSAKICBtdXRhdGUoeWVhciA9IHllYXIoZGF0ZV9yZWdpc3RlcmVkKSkgJT4lIAogIGdyb3VwX2J5KHllYXIsc3BvbnNvcl90eXBlKSAlPiUgCiAgc3VtbWFyaXNlKG4gPSBuKCkpICU+JSAKICB1bmdyb3VwKCkgJT4lIAogIHBpdm90X3dpZGVyKGlkX2NvbHM9eWVhcixuYW1lc19mcm9tID0gc3BvbnNvcl90eXBlLHZhbHVlc19mcm9tID0gbikgJT4lCiAgcm93d2lzZSgpICU+JSAKICBtdXRhdGUodG90YWwgPSBzdW0oT3RoZXIsSW5kdXN0cnksSW5zdGl0dXRpb25hbCxHb3Zlcm5tZW50YWwsbmEucm09VCkpICU+JSAKICBtdXRhdGUoaW5kdXN0cnlfcHJvcCA9IHJvdW5kKEluZHVzdHJ5L3RvdGFsKjEwMCwxKSkgJT4lIAogIGZpbHRlcighaXMubmEoeWVhcikpICU+JSAKICBmaWx0ZXIoIWlzLm5hKGluZHVzdHJ5X3Byb3ApKSAlPiUgCiAgbXV0YXRlKHllYXIgPSBhcy5mYWN0b3IoeWVhcikpICU+JSAKICBnZ3Bsb3QoLixhZXMoeT1pbmR1c3RyeV9wcm9wLHg9eWVhcikpK2dlb21fYmFyKHN0YXQ9ImlkZW50aXR5IixmaWxsPSJzdGVlbGJsdWUiKSsKICBnZW9tX3RleHQoYWVzKGxhYmVsPWluZHVzdHJ5X3Byb3ApLHZqdXN0ID0gMS42LCBjb2xvcj0id2hpdGUiKSsKICB0aGVtZV9taW5pbWFsKCkrCiAgbGFicyh4ID0gIlllYXIgb2YgVHJpYWwgUmVnaXN0cmF0aW9uIiwgeSA9ICJQZXJjZW50YWdlIG9mIEluZHVzdHJ5IFNwb25zb3JlZCBUcmlhbHMiLCB0aXRsZSA9ICJGaWd1cmUgMzogWWVhciB3aXNlIGNoYW5nZSBpbiBwZXJjZW50YWdlIG9mIEluZHVzdHJ5IHNwb25zb3JlZCB0cmlhbHMiKQpgYGAKCgoKIyBQYWNrYWdlcyB1c2VkCgoxLiAgUiA6IFIgQ29yZSBUZWFtICgyMDIwKS4gUjogQSBsYW5ndWFnZSBhbmQgZW52aXJvbm1lbnQgZm9yIHN0YXRpc3RpY2FsIGNvbXB1dGluZy4gUiBGb3VuZGF0aW9uIGZvciBTdGF0aXN0aWNhbCBDb21wdXRpbmcsIFZpZW5uYSwgQXVzdHJpYS4gVVJMIDxodHRwczovL3d3dy5SLXByb2plY3Qub3JnLy4+CgoyLiAgVGlkeXZlcnNlIDogV2lja2hhbSBldCBhbC4sICgyMDE5KS4gV2VsY29tZSB0byB0aGUgdGlkeXZlcnNlLiBKb3VybmFsIG9mIE9wZW4gU291cmNlIFNvZnR3YXJlLCA0KDQzKSwgMTY4NiwgPGh0dHBzOi8vZG9pLm9yZy8xMC4yMTEwNS9qb3NzLjAxNjg2PgoKMy4gIGd0c3VtbWFyeSA6IERhbmllbCBELiBTam9iZXJnLCBNaWNoYWVsIEN1cnJ5LCBNYXJnaWUgSGFubnVtLCBKb3NlcGggTGFybWFyYW5nZSwgS2FyaXNzYSBXaGl0aW5nIGFuZCBFbWlseSBDLiBaYWJvciAoMjAyMSkuIGd0c3VtbWFyeTogUHJlc2VudGF0aW9uLVJlYWR5IERhdGEgU3VtbWFyeSBhbmQgQW5hbHl0aWMgUmVzdWx0IFRhYmxlcy4gW1w8aHR0cHM6Ly9naXRodWIuY29tL2Rkc2pvYmVyZy9ndHN1bW1hcnlcPixdKGh0dHBzOi8vZ2l0aHViLmNvbS9kZHNqb2JlcmcvZ3RzdW1tYXJ5LCkgPGh0dHA6Ly93d3cuZGFuaWVsZHNqb2JlcmcuY29tL2d0c3VtbWFyeS8uPgoKNC4gIEhtaXNjIDogRnJhbmsgRSBIYXJyZWxsIEpyLCB3aXRoIGNvbnRyaWJ1dGlvbnMgZnJvbSBDaGFybGVzIER1cG9udCBhbmQgbWFueSBvdGhlcnMuICgyMDIxKS4gSG1pc2M6IEhhcnJlbGwgTWlzY2VsbGFuZW91cy4gPGh0dHBzOi8vaGJpb3N0YXQub3JnL1IvSG1pc2MvLD4gPGh0dHBzOi8vZ2l0aHViLmNvbS9oYXJyZWxmZS9IbWlzYy8+Cgo1LiAgZmxleHRhYmxlIDogZmxleHRhYmxlOiBGdW5jdGlvbnMgZm9yIFRhYnVsYXIgUmVwb3J0aW5nLiA8aHR0cHM6Ly9hcmRhdGEtZnIuZ2l0aHViLmlvL2ZsZXh0YWJsZS1ib29rLyw+IDxodHRwczovL2RhdmlkZ29oZWwuZ2l0aHViLmlvL2ZsZXh0YWJsZS8uPgoKNi4gIHJtcyA6IEZyYW5rIEUgSGFycmVsbCBKciAoMjAyMSkuIHJtczogUmVncmVzc2lvbiBNb2RlbGluZyBTdHJhdGVnaWVzLiA8aHR0cHM6Ly9oYmlvc3RhdC5vcmcvUi9ybXMvLD4gPGh0dHBzOi8vZ2l0aHViLmNvbS9oYXJyZWxmZS9ybXMuPgoKNy4gIGdncGxvdDI6IEguIFdpY2toYW0uIGdncGxvdDI6IEVsZWdhbnQgR3JhcGhpY3MgZm9yIERhdGEgQW5hbHlzaXMuIFNwcmluZ2VyLVZlcmxhZyBOZXcgWW9yaywgMjAxNi4KCjguICBMdWJyaWRhdGU6IEdhcnJldHQgR3JvbGVtdW5kLCBIYWRsZXkgV2lja2hhbSAoMjAxMSkuIERhdGVzIGFuZCBUaW1lcyBNYWRlIEVhc3kgd2l0aCBsdWJyaWRhdGUuIEpvdXJuYWwgb2YgU3RhdGlzdGljYWwgU29mdHdhcmUsIDQwKDMpLCAxLTI1LiBVUkwgPGh0dHBzOi8vd3d3LmpzdGF0c29mdC5vcmcvdjQwL2kwMy8uPgo=