1 Introduction

1.1 Background

In recent months, media outlets have notified the public about fluctuations in energy prices with headlines such as Australia’s High Electricity Prices the ‘New Normal’, Report Says (Hutchens, 2018), and Higher Energy Prices are Here to Stay – Here’s What We Can Do About It (Percival, 2018) and ‘No Likelihood of Relief Ahead’: Future Power Prices Continue to Rise (Latimer, 2018). These articles create a sense of concern due to the impact to Australian’s financial wellbeing. However, there is very little fact in these articles that are grounded in statistical evidence.

While these articles may have lacked academic rigour and rhetoric, the sentiment is still reflected in academic literature. Sardar (2015) justifies in his 2015 article entitled Research and Development, Welfare and Efficiency: An Australian Energy Perspective that increasing numbers of Australians are being driven to welfare as a direct result of Energy Prices. Moreover, in a 2017 article entitled Australian Energy Policy and Economic Rationalism, Horan et al. (2017) accuse the Australian Government of having irrational and inefficient energy policy, which is placing increasing and unnecessary financial pressure on Australian households and businesses. Furthermore, Lincoln (2012) proposes a succinct set of options for change which may curb this pressure, as articulated in the his article Options for Change in the Australian Energy Profile. As shown, the landscape of the Australian Energy Market environment is changing, and this trend may have dire consequences for the future of the Australian economy.

Therefore, with the intent to add some statistical rigour to the discourse around the Australian Energy Prices, this paper aims to model the aggregated monthly Energy Point Price in order to create a prediction of the for the future. The data is extracted from an Australian Government website, visualised, analysed, tested, and then forecast, in order to create such prediction. The resulting prediction will allow citizens to adequately plan for the future, and can also provide advice back to Governmental Agencies in order to advise future policy.

1.2 Research Question

Is the future energy price (monthly mean aggregate) able to be predicted solely using univariate time series data?

1.3 Data Source

The data used in this analysis has been obtained from the official website for the Australian Energy Market Operator (AEMO) (www.aemo.com.au). The data obtained from AEMO had the following characteristics and limitations:

  1. The raw data was an Energy Point Price, obtained at half hourly increments.
  2. The data was split by State.
  3. The prices for the Australian Capital Territory was included in the prices for New South Whales.
  4. The prices for the Northern Territory were missing from the website.
  5. The prices for Western Australia were in an inconsistent format and inconsistent time-stamp to the rest of the country, and was not able to be merged together.
  6. The website only included data that dated back to 1999.

2 Data Exploration

Having aggregated the data in to an average monthly price, the AEMO data can be explored to establish its trend, seasonality, stationarity, and regularity. With reference to Figure 1, the following conclusions can be drawn:

  1. The data does not indicate a seasonal increase and decrease in price; neither by month nor by year.
  2. The data trend indicates a steady increase in price per year, as shown by the fitted linear model line.
  3. At approximately the year 2017, there appears to be a step increase in prices across all states.
  4. Around the end of 2009 and the start of 2019, there appears to be a substantial spike in prices which is consistent across all states.
  5. Each State shows a different level of stability, along with a differing level of price increase. Noting the following differences per state:

    1. QLD appears to have the least steep linear model, as given by the slope of the line being 1.8, while VIC has the steepest with the slope being 2.4.
    2. While QLD, SA and VIC appeared to have relatively stable prices between the years 2002 and 2008, NSW appeared to have much more unstable prices in the same period.
    3. The prices for VIC and for SA appear to have the highest average price between the hears of 2017 and 2019.

Figure 1: The Temperature Fluctuations over time, by state, by week

In addition to visualising the observed prices, as displayed in Figure 1, the time-series data can also be decomposed down to it’s relevant attributes. The two most pertinent attributes for time-series is the Trend and the Seasonal attributes. As shown in Figure 2, the relevant states each have a distance trend and seasonality. The Residual attribute is the residual data, remaining after the data has been decomposed to its Trend and the Seasonal particulars.

This figure has had a smoothed trend line added to the Trend plot. This trend line shows a distinct and prominent upward trend for all states, indicating that this upward trend is likely to continue in to the future, and will increase its price over time.

Figure 2: The Decomposition of Additive Time Series, by State, by Month

3 Testing the Data

In order to establish whether the data is suitable for time series analysis and prediction, a number of statistical tests need to be applied to the data. Namely:

  1. Test for Whitenoise
  2. Test for Stationarity
  3. (optional) Test for Seasonality
  4. (optional) Test for Regularity
  5. (optional) Test for Stability
  6. Test for Auto-Correlation

3.1 Test for Whitenoise

The test for Whitenoise is intended to establish whether or not the data is just random points across a period of time. If the data is ‘whitenoise’ (ie. is random data points), then the data cannot be used for time-series forecasting.

For this, the Box-Ljung Test for Whitenoise (Ljung & Box, 1978; R-Core, nd.) was applied to the AEMO data, with the results displayed in Table 1. As seen by each of the tests returning a value of less than the threshold (0.02), then each of the states are not whitenoise; therefore the data can be used for time-series forecasting

Feature State Test Value Threshold Outcome
Mean Monthly Price NSW Box-Ljung Test <0.0000000000000002 0.02 Not Whitenoise
Mean Monthly Price QLD Box-Ljung Test <0.0000000000000002 0.02 Not Whitenoise
Mean Monthly Price SA Box-Ljung Test <0.0000000000000002 0.02 Not Whitenoise
Mean Monthly Price VIC Box-Ljung Test <0.0000000000000002 0.02 Not Whitenoise

Table 1: Test for Whitenoise for each State

3.2 Test for Stationarity

The test for Stationarity is intended to establish whether or not the data is stationary or not. By declaring that the data is ‘stationary’ indicates that the data does not vary sufficiently per period. In this instance, the period is by year; thus, the data must vary sufficiently per year so as the time-series forecasting can forecast the values for the proceeding periods. Srivastava (2015) provides three effective pictorial examples of non-stationary data, as displayed in Figure 3 for non-stationary Means, Figure 4 for non-stationary Variance, and Figure 5 for non-stationary Covariance.

The KPSS Unit Root Test (Kwiatkowski et al., 1992; Pfaff, nd.) determines if the data is stationary, with a p-value less than the threshold (0.02) indicating that the data is stationary. This test has been applied to the AEMO data set, with the results displayed in Table 2. The results of this test shows that the data sets are not stationary, and can be used for time-series forecasting.

Feature State Test Value Threshold Outcome
Mean Monthly Price NSW KPSS Unit Root Test 0.7093 0.02 Not Stationary
Mean Monthly Price QLD KPSS Unit Root Test 0.6555 0.02 Not Stationary
Mean Monthly Price SA KPSS Unit Root Test 0.5563 0.02 Not Stationary
Mean Monthly Price VIC KPSS Unit Root Test 0.6539 0.02 Not Stationary

Table 2: Test for Stationarity for each State

Figure 3: Non-Stationary Data with Changing Mean (Srivastava, 2015)

Figure 4: Non-Stationary Data with Changing Variance (Srivastava, 2015)

Figure 5: Non-Stationary Data with Changing Covariance (Srivastava, 2015)

3.3 Test for Seasonality

The test for Seasonality is not a necessary test before doing a time-series forecasting. However, it is beneficial to understand to what extent does the data vary or remain consistent throughout each period of analysis. By declaring that the data is ‘seasonal’ is to say that the peaks and troughs are the same for each of the periods, and that the future seasonal periods could be predicted with a reasonable level of confidence.

For this, there are two seasonality tests that can be applied to the AEMO data, the first being the QS test (Ollech, 2019; Sax, nd.), and the second is the Seasonal Strength test (Yang & Hyndman, 2019; Hyndman, nd.(a)). The QS test will to determine its level of seasonality, while the Seasonal Strength test will determine the strength of the seasonality. The results of these tests are displayed in Table 3. The threshold p-value are 0.02, indicating that if a value is below this threshold, then it is seasonal; but if it is above this threshold, then it is not seasonal. As shown, the data in SA is seasonal, while the other states are not seasonal. This information can be used to control the hyper-parameters in the ARIMA forecasting model.

Feature State Test Value Threshold Outcome
Mean Monthly Price NSW QS Test 1.0000 0.02 Not Seasonal
Mean Monthly Price QLD QS Test 0.3621 0.02 Not Seasonal
Mean Monthly Price SA QS Test 0.0161 0.02 Is Seasonal
Mean Monthly Price VIC QS Test 0.1703 0.02 Not Seasonal
Mean Monthly Price NSW Seasonal Strength Test 0.1342 0.02 Weak Seasonality
Mean Monthly Price QLD Seasonal Strength Test 0.2175 0.02 Weak Seasonality
Mean Monthly Price SA Seasonal Strength Test 0.3088 0.02 Weak Seasonality
Mean Monthly Price VIC Seasonal Strength Test 0.2272 0.02 Weak Seasonality

Table 3: Test for Seasonality for each State

In addition to the formal tests for Seasonality, the seasonality of the data can also be visualised. As shown by the ‘Seasonal’ plots within Figure 2 (and plotted again in Figure 6), the data for all four states can be seen as having a semi-seasonal trend. This is because there is no smooth undulation between the seasons; only sharp sporadic spikes throughout each period.

Figure 7: Seasonality Plot for each State

3.4 Test for Regularity

Like with testing for Seasonality, it is not necessary to test for Regularity in order to produce a time-series forecast. However, it is beneficial to do as it provides information about the attributes for the data. To state that the data is ‘regular’ is to say that the data point are evenly spaced, regularly collected, and not missing data points (ie. do not contain excessive NA values). Logically, it is not always necessary to conduct the Test for Regularity on automatically collected data (like for example with Energy Prices, or Daily Temperature), however if this data was collected manually then it is highly recommended. If the data does not meet the requirements of Regularity, then it is necessary to return to the data collection plan, and revise the methodology used.

For the AEMO data, the Is Regular (Zeileis & Grothendieck nd.; Zeileis nd.) test was conducted, with the resulting outcome reported in Table 4. As shown, all of the states meet the requirements for regular data points, and thus can be used for time-series forecasting.

Feature State Test Value Outcome
Mean Monthly Price NSW Is Regular TRUE Is Regular
Mean Monthly Price QLD Is Regular TRUE Is Regular
Mean Monthly Price SA Is Regular TRUE Is Regular
Mean Monthly Price VIC Is Regular TRUE Is Regular

Table 4: Test for Regularity for each State

3.5 Test for Stability

Like with the Test for Seasonality and the Test for Regularity, the test for Stability is not a necessary test in order to perform time-series forecasting. It is, however, quite beneficial as a measure of how much the data varies over each period of time. If a data-set is to be ‘stable’, that means that the means of each time period do not vary dramatically over time. In other words, the higher the variance between the means of each time-period, the more unstable the data is.

For the AEMO data, there are two tests which can be used: the Test for Stability (Yang & Hyndman, 2019; Hyndman, nd.(a)) and the Test for Lumpiness (Yang & Hyndman, 2019; Hyndman, nd.(a)). While the Stability test measures the variance of the means, the Lumpiness test measures the variance of the variances. For both of these measures, they simply indicate the extent to which each series varies by. The limits for this test are 0 and 1, whereby, a score of 0 would indicate a perfectly stable (or perfectly smooth) data set, while a score of 1 would indicate a completely unstable (or completely sporadic) data set. As displayed in Table 5, the measures for NSW and VIC are somewhat stable, while the other states are not. Noting that the measures are very close to the threshold. However, all four states are recordedly not lumpy.

Feature State Test Value Threshold Outcome
Mean Monthly Price NSW Stability Test 0.5943 0.5 Is Stable
Mean Monthly Price QLD Stability Test 0.4988 0.5 Not Stable
Mean Monthly Price SA Stability Test 0.4926 0.5 Not Stable
Mean Monthly Price VIC Stability Test 0.6077 0.5 Is Stable
Mean Monthly Price NSW Lumpiness Test 0.1344 0.5 Not Lumpy
Mean Monthly Price QLD Lumpiness Test 0.2744 0.5 Not Lumpy
Mean Monthly Price SA Lumpiness Test 0.2197 0.5 Not Lumpy
Mean Monthly Price VIC Lumpiness Test 0.0608 0.5 Not Lumpy

Table 5: Test for Stability for each State

3.6 Test for Auto-Correlation

An important test to do on Time-Series data is to measure it’s level of Auto-Correlation (McMurry & Politis, 2010; Hyndman, nd.(b)). While ‘correlation’ refers to how two variables change based on the other’s value, ‘auto-correlation’ is how a variable changes based on it’s own value over time (the phrase “auto” refers to “self”). For the Auto-Correlation Function, it uses a ‘lag’ function. For example, a lag value of 0 is 100% correlated, which is logical, because that is it’s own value; whereas a lag value of 1 or greater, the level of auto-correlation decreases as it get’s further away from lag0.

For well-structured time-series data sets, it would be expected to see a conical-shaped Auto-Correlation plot. If it were not a well-structured time-series data set, then this Auto-Correlation plot would look more like white noise, and there would not be any logical shape. The blue dotted lines are included as a reference point for determining if any of the observations are significantly different from zero.

Moreover, analysis of the data’s Auto-Correlation (ACF) should be combined with analysis of its Partial Auto-Correlation (PACF). While the ACF is the “direct” relationship between an observation and it’s relevant lag observation, the PACF removes the “indirect” relationship between these observations. Effectively, the Partial Auto-Correlation between lag1 and lag5 is the “actual” correlation between these two observations, after removing the influence that lag2, lag3, and lag4 has on lag5.

What this means is that the Partial Auto-Correlation plot would have a very high value at lag0, which will drop very quickly at lag1, and should remain below the blue reference lines for the remainder of the Correlogram. The observations of lag > 0 should resemble white noise data points. If it does not resemble white noise, and there is a distinct pattern occurring, then the data is not suitable for time-series forecasting.

When applied to the AEMO data, as displayed in Figure 8, the following conclusions can be drawn:

  1. (ACF) All four states are suitable for use in time-series forecasting due to their conical shape;
  2. (PACF) The data is relatively stable, due to the fact that the vast majority of the data points are falling within the blue limit lines.
  3. (ACF) There is a slight increase in correlation between lag50 and lag70, which is congruent with the trend pattern increase in price between 2013 and 2015 (Figure 2).
  4. (PACF) All four states are suitable for use in time-series forecasting due to:

    1. Their rapid drop between lag0 and lag1;
    2. Their constant, random pattern in lag > 0; and

Figure 8: Auto-Correlation Functions for each State

4 Forecast

4.1 Context

The result of having applied this testing then allows the data to be forecast forward to create a prediction for the future. The chosen prediction model for this forecast is the ARIMA model. ‘ARIMA’ is an acronym for ‘Auto-Regressive Integrated Moving Average’ (Kang, 2017), and is broken in to three parts in order to make the model fit the data as well as possible:

  1. Auto Regressive: Indicating level to which an evolving variable (predictor) is regressed (predicted) based on it’s own lagged (previous) observed values.
  2. Integrated: Indicating the level of differencing to be applied to the data between the observed value (predictor) and an observed value in the previous time step (previous). Effectively, by doing this subtraction allows the properties of the time-series data to not depend on the time of the observation, thus eliminating trend and seasonality, and then also stabilises the mean of the time series.
  3. Moving Average: Indicating the level of dependency between an observed value (predictor) and the residual error from a moving average model applied to it’s own lagged (previous) observed values.

4.2 Prediction

This ARIMA model thus being applied to the AEMO data produces a prediction as recorded in Figure 9. This figure has the following features:

  1. The coloured line indicates the state.
  2. The darker ribbon is the forecast prediction with an 80% confidence interval.
  3. The lighter ribbon is the forecast prediction with an 90% confidence interval.
  4. The thick black line is the actual observations, for the data has been split in to Test and Train data sets.

Upon analysis of this forecast, the following predictions can be made:

  1. The forecast for NSW and QLD have a ribbon shape, while SA and VIC have a conical shape.
  2. The forecast for QLD and VIC have a relatively stable, flat prediction, while the forecast for NSW and SA have a slightly upward trend.
  3. All four states have a wide level of uncertainty ( ≈  ± $40 per Gwh)

Figure 9: Plot of Forecast for each State, Including Actual Temperature

4.3 Accuracy

Using the data in the Test/Train split, the level of accuracy for the prediction can be calculated.

There are four measurement scores shown in Table 6, being:

  1. Root Mean Square Error (RMSE),
  2. Mean Average Error (MAE),
  3. Mean Absolute Percentage Error (MAPE), and
  4. Mean Absolute Scaled Error (MASE).

The chosen metric for this analysis is the RMSE due to it’s ability to punish scores that are further away from the prediction. For RMSE, a lower score is better, as it indicates a lower amount of error. As shown in this table, the NSW Prediction scored best in all four metrics, while VIC scored the worst. This result is in alignment with the actual scores shown in Figure 9, because NSW is closest to the prediction while VIC is consistently the furthest away.

State RMSE MAE MAPE MASE
NSW 9.38 7.061 9.555 0.3941
QLD 11.32 9.696 12.334 0.5056
SA 16.05 12.431 12.347 0.5982
VIC 19.66 18.569 18.538 1.1052

Table 6: Score of the Forecast for each State

4.4 Long-Term Forecast

Using this trained model, the forecast is then projected forward to the year 2026, as displayed in Figure 10. Analysis of this projected forecast indicates the following:

  1. That the long-term energy prices will not be significantly different than the prices seen in the year 2019.
  2. Due to the sporadic nature of the historic prices, the level of uncertainty of this forecast gets wider in VIC and SA; as seen by the conical shape of the forecast.
  3. The shape of the NSW and QLD forecasts are more ribbon-like, indicating less volatility in future prices.

Figure 10: Long Term Forecast for each State

5 Findings

Based off the analysis conducted, and the forecast predicted, there are four key findings.

  • History of Energy Prices: Firstly, the Energy Prices for all four states were comparatively stable up until circa 2013, after which the prices have begun to escalate at an increasingly steep rate. Combine this with the sporadicity of the seasonal prices for the states indicates that a time-series forecast for the future of energy prices may not be perfectly accurate.

  • Suitable for Forecasting: Secondly, while the data may not be perfectly accurate for time-series prediction, it is still suitable for forecasting. That is because it is:

    1. Not Whitenoise;
    2. Not Stationary;
    3. Not Seasonal (or Marginally Seasonal, as with the SA data);
    4. Is Regular;
    5. Is Moderately Stable (all scores close to the Stability Threshold);
    6. Not Lumpy; and
    7. Is Auto-Correlated.
  • Relatively Predictable: Thirdly, having fed the data in to an ARIMA forecasting model, the predictions are relatively accurate, with predictions falling between 40% inaccuracy (as with NSW), and 90% inaccuracy rate (as with VIC).

  • Forward Projections: Fourthly, using the forecast model to project forward, and combined with the historic trends, it can be concluded that the energy prices will not be significantly different than the prices seen in the year 2019. The exact energy price could vary dramatically in this forecast due to the broad scope of the actual forecast model.

6 Limitations

Resulting from this research, a number of limitations have been identified. As listed:

  1. The Future prices are simply based on a single input variable: Past prices.
  2. The Time-Series model does not take in to account external variables which may affect energy prices, such as energy production or energy capacity or percentage of renewable energy in the Grid.
  3. The Analysis does not take in to account Government Policies which may have influenced the prices.

7 Opportunities for Future Research

In order to further increase the accuracy of the prediction model, and to address some of the identified limitations, there are some other opportunities for future research. Including:

  1. Investigate the amount in which the Federal Legislative Landscape has changed since circa 2015, and the extent to which that has influenced energy prices.
  2. Correlate the energy price fluctuations with the closures of energy production plants.
  3. Use the results of this prediction as an ensemble feature in a multivariate regression model to predict Future Energy Prices. Other features could potentially include:

    1. Percentage breakdown of Renewable vs. Non-Renewable Energy sources per state per month.
    2. Amount of Energy Produced (or Energy Capacity) per state per month.
    3. Average temperature (or temperature range) per state per month.

It is recommended that these opportunities be explored in full, so as to provide a detailed prediction model for future energy prices.

8 Conclusion

In conclusion, analysis of the AEMO historic energy prices provides a suitable method of forecasting future prices. Exploration of the data revealed that the prices have indeed been increasing over the last 20 years, and have begun an exponential increase since approximately 2013. Moreover, having applied various statistical tests to the data, the data is suitable for time-series forecasting, due to it being not stationary, not whitenoise, marginally seasonal, and moderately stable.

With the intention of wanting to explore whether the future energy prices are able to be predicted solely using univariate time series data, the answer is yes. The historic AEMO data is regular and univariate, and is able to be fed in to an ARIMA forecasting model to predict the future prices to a certain level of confidence. This confidence interval is tighter for NSW and QLD, and very broad for VIC and SA. However, the accuracy level of this model can be greatly improved when modeled in conjunction with various other external influences, as outlined in Future Opportunities. Therefore, this research is able to provide assistance to Australian households and businesses, and is able to advise Government policy to curb this trend.

9 References

Australian Energy Market Operator (AEMO) nd., viewed 1/Oct/2019, <https://www.aemo.com.au/>.

Horan, S, McGrath, T, & Santha, N 2017, ‘Australian energy policy and economic rationalism’, Energy News, vol. 35, no. 3, pp. 16-7, ISSN: 1445-2227.

Hutchens, G 2018, ‘Australia’s high electricity prices the ’new normal’, report says’, The Guardian, viewed 10/Oct/2019, <https://www.theguardian.com/australia-news/2018/jul/01/australias-high-electricity-prices-the-new-normal-report-says>.

Hyndman, R nd.(a), ‘stl_features’, R Documentation, viewed 28/Oct/2019, <https://www.rdocumentation.org/packages/tsfeatures/versions/1.0.1/topics/stl_features>.

Hyndman, R nd.(b), ‘Acf’, R Documentation, viewed 1/Nov/2019, <https://www.rdocumentation.org/packages/forecast/versions/8.9/topics/Acf>.

Kang, E 2017, ‘Time Series: ARIMA Model’, Medium, viewed 30/Oct/2019, <https://medium.com/@kangeugine/time-series-arima-model-11140bc08c6>.

Kwiatkowski, D., Phillips, P., Schmidt, P., & Shin, Y. 1992, ‘Testing the Null Hypothesis of Stationarity Against the Alternative of a Unit Root: How Sure Are We That Economic Time Series Have a Unit Root?’, Journal of Econometrics, vol. 54, no. 1, pp. 159-178, DOI: 10.1016/0304-4076(92)90104-Y.

Latimer, C 2018, ‘’No likelihood of relief ahead’: Future power prices continue to rise’, The Sydney Morning Herals, viewed 10/Oct/2018, <https://www.smh.com.au/business/the-economy/no-likelihood-of-relief-ahead-future-power-prices-continue-to-rise-20181030-p50cu1.html>.

Lincoln, S 2012, ‘Options for Change in the Australian Energy Profile’, AMBIO, vol. 41, no. 8, pp. 841-50, DOI: 10.1007/s13280-012-0315-0.

Ljung, G & Box, G 1978, ‘On a measure of lack of fit in time series models’, Biometrika, vol. 65, no. 2, pp.297-303, DOI: 10.2307/2335207.

McMurry, T., & Politis, N. 2010, ‘Banded and tapered estimates for autocovariance matrices and the linear process bootstrap’, Journal of Time Series Analysis, vol. 31, no. 6, pp. 471-482, DOI: 10.1111/j.1467-9892.2010.00679.x.

Ollech, D 2019, ‘seastests - Seasonality tests’, R Vignette, viewed 28/Oct/2019, <https://cran.r-project.org/web/packages/seastests/vignettes/seastests-vignette.html>.

Percival, L 2018, ‘Higher energy prices are here to stay – here’s what we can do about it’, The Conversation, viewed 10/Oct/2019, <http://theconversation.com/higher-energy-prices-are-here-to-stay-heres-what-we-can-do-about-it-99187>.

Pfaff, B nd., ‘ur.kpss’, R Documentation, viewed 28/Oct/2019, <https://www.rdocumentation.org/packages/urca/versions/1.3-0/topics/ur.kpss>.

R-Core, nd., ‘Box.test’, R Documentation, viewed 28/Oct/2019, <https://www.rdocumentation.org/packages/stats/versions/3.6.1/topics/Box.test>.

Sax, C nd., ‘qs’, R Documentation, viewed 28/Oct/2019, <https://www.rdocumentation.org/packages/seasonal/versions/1.2.1/topics/qs>.

Srivastava, T 2015, ‘A Complete Tutorial on Time Series Modelling in R’, Analytics Vidya, viewed 29/Oct/2019, <https://www.analyticsvidhya.com/blog/2015/12/complete-tutorial-time-series-modeling/>.

Sardar, P 2015, ‘Research and development, welfare and efficiency: an Australian energy perspective’, International Journal of Flobal Energy Issues, vol. 11, no. 1, pp. 155-60, ISSN: 0954-7118.

Yang, Y, & Hyndman, RJ 2019, ‘Introduction to the tsfeatures package’, R Vignette, viewed 28/Oct/2019, <https://cran.r-project.org/web/packages/tsfeatures/vignettes/tsfeatures.html>.

Zeileis, A, & Grothendieck, G nd., ‘zoo: An S3 Class and Methods for Indexed Totally Ordered Observations’, R Vignette, viewed 28/Oct/2019, <https://cran.r-project.org/web/packages/zoo/vignettes/zoo.pdf>.

Zeileis, A, nd. ‘is.regular’, R Documentation, viewed 28/Oct/2019, <https://www.rdocumentation.org/packages/zoo/versions/1.8-6/topics/is.regular>.

10 Post Script

Acknowledgements: This report was compiled with some assistance from others. Acknowledgements go to:

  1. Yan Holtz for his code for how to add the footer elements (https://holtzy.github.io/Pimp-my-rmd/ & https://github.com/holtzy/epuRate).
  2. Tim Holman for his code for how to add the GitHub corner (https://github.com/tholman/github-corners).
  3. William Dai for his assistance to write the scripts to web-scrape the AEMO website.
  4. Michael Gordon for his assistance to write the scripts to web-scrape the BOM website.

Publications: This report is also published on the following sites:

  1. RPubs: RPubs/chrimaho/AusEnergyPrices
  2. GitHub: GitHub/chrimaho/AusEnergyPrices
  3. Medium: Medium/chrimaho/AusEnergyPrices
  4. LinkedIn: LinkedIn/chrimaho/AusEnergyPrices

Change Log: This publication was modified on the following dates:

  1. 02/Nov/2019: Original Publication date.
LS0tDQp0aXRsZTogJ1RoZSBGdXR1cmUgb2YgQXVzdHJhbGlhbiBFbmVyZ3kgUHJpY2VzJw0Kc3VidGl0bGU6ICdUaW1lLVNlcmllcyBBbmFseXNpcyBvZiBIaXN0b3JpYyBQcmljZXMgYW5kIEZvcmVjYXN0IGZvciBGdXR1cmUgUHJpY2VzJw0KYXV0aG9yOiAnQXV0aG9yOiBbQ2hyaXMgTWFob25leV0oaHR0cHM6Ly93d3cubGlua2VkaW4uY29tL2luL2NocmltYWhvLyknDQpkYXRlOiAnUHVibGlzaGVkOiAwMi9Ob3YvMjAxOScNCiNkYXRlOiAnRGF0ZTogYHIgZm9ybWF0KFN5cy5EYXRlKCksICIlZC8lYi8lWSIpYCcNCnRvYy10aXRsZTogQ29udGVudHMNCm91dHB1dDoNCiAgaHRtbF9kb2N1bWVudDoNCiAgICBjb2RlX2Rvd25sb2FkOiB5ZXMNCiAgICBoaWdobGlnaHQ6IGhhZGRvY2sNCiAgICBudW1iZXJfc2VjdGlvbnM6IHllcw0KICAgIHRlbXBsYXRlOiBkZWZhdWx0X3RvYy5odG1sDQogICAgdGhlbWU6IGx1bWVuDQogICAgdG9jOiB5ZXMNCiAgICB0b2NfZGVwdGg6IDQNCiAgICB0b2NfZmxvYXQ6DQogICAgICBjb2xsYXBzZWQ6IG5vDQogICAgaW5jbHVkZXM6DQogICAgICBpbl9oZWFkZXI6IGhlYWRlci5odG1sDQogICAgICBhZnRlcl9ib2R5OiBmb290ZXIuaHRtbA0KICBodG1sX25vdGVib29rOg0KICAgIGhpZ2hsaWdodDogaGFkZG9jaw0KICAgIG51bWJlcl9zZWN0aW9uczogeWVzDQogICAgdGhlbWU6IGx1bWVuDQogICAgdG9jOiB5ZXMNCiAgICB0b2NfZGVwdGg6IDQNCiAgICB0b2NfZmxvYXQ6IG5vDQogICAgaW5jbHVkZXM6DQogICAgICBpbl9oZWFkZXI6IGhlYWRlci5odG1sDQogICAgICBhZnRlcl9ib2R5OiBmb290ZXIuaHRtbA0KLS0tDQoNCjxzdHlsZT4NCi5tYXRoIHsNCiAgICBmb250LXNpemU6IDEyMCU7DQogICAgZm9udC1zdHlsZTogbm9ybWFsOw0KICAgIGZvbnQtZmFtaWx5OiAiQ2FtYnJpYSBNYXRoIjsNCn0NCi5jb2x1bW4gew0KICAgIGZsb2F0OiBsZWZ0Ow0KICAgIHdpZHRoOiA1MCU7DQogICAgYm9yZGVyOiAxcHggc29saWQgYmxhY2s7DQp9DQoucm93OmFmdGVyIHsNCiAgICBjb250ZW50OiAiIjsNCiAgICBkaXNwbGF5OiB0YWJsZTsNCiAgICBjbGVhcjogYm90aDsNCn0NCmgxLCAuaDEgew0KICAgIG1hcmdpbi10b3A6IDQwcHg7DQogICAgZm9udC13ZWlnaHQ6IGJvbGQ7DQp9DQpoMiwgLmgyIHsNCiAgICBtYXJnaW4tdG9wOiA0MHB4Ow0KICAgIG1hcmdpbi1sZWZ0OiA0MHB4Ow0KfQ0KPC9zdHlsZT4NCg0KDQo8IS0tIEFja25vd2xlZGdlbWVudHM6IC0tPg0KPCEtLSAxLiBUbyBZYW4gSG9sdHogZm9yIGhpcyBjb2RlIGZvciBob3cgdG8gYWRkIHRoZSBmb290ZXIgZWxlbWVudHMgKGh0dHBzOi8vaG9sdHp5LmdpdGh1Yi5pby9QaW1wLW15LXJtZC8gJiBodHRwczovL2dpdGh1Yi5jb20vaG9sdHp5L2VwdVJhdGUpLiAtLT4NCjwhLS0gMi4gVG8gVGltIEhvbG1hbiBmb3IgaGlzIGNvZGUgZm9yIGhvdyB0byBhZGQgdGhlIEdpdEh1YiBjb3JuZXIgKGh0dHBzOi8vZ2l0aHViLmNvbS90aG9sbWFuL2dpdGh1Yi1jb3JuZXJzKS4gLS0+DQo8IS0tIDMuIFRvIFdpbGxpYW0gRGFpIGZvciBoaXMgYXNzaXN0YW5jZSB0byB3cml0ZSB0aGUgc2NyaXB0cyB0byB3ZWItc2NyYXBlIHRoZSBBRU1PIHdlYnNpdGUuIC0tPg0KPCEtLSAzLiBUbyBNaWNoYWVsIEdvcmRvbiBmb3IgaGlzIGFzc2lzdGFuY2UgdG8gd3JpdGUgdGhlIHNjcmlwdHMgdG8gd2ViLXNjcmFwZSB0aGUgQk9NIHdlYnNpdGUuIC0tPg0KDQoNCjwhLS0gU2V0IFVwIEVudmlyb25tZW50IC0tPg0KDQpgYGB7ciBMT0FEIFBhY2thZ2VzLCBlY2hvPUZBTFNFLCBldmFsPVRSVUUsIHJlc3VsdHM9ImhpZGUiLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFfQ0KIyBSZW1vdmUgYWxsIHBhY2thZ2VzLiBOb3RlOiBUaGUgc3VwcHJlc3Npb24gZnVuY3Rpb25zIGFyZSB0byBsaW1pdCB0aGUgYW1vdW50IG9mIHByaW50ZWQgb3V0cHV0Lg0KZm9yIChwYWNrYWdlIGluIC5wYWNrYWdlcygpKSB7DQogICAgaWYgKCFwYWNrYWdlICVpbiUgYygicGFyYWxsZWwiLCAic3RhdHMiLCAiZ3JhcGhpY3MiLCAiZ3JEZXZpY2VzIiwgImRhdGFzZXRzIiwgInV0aWxzIiwgIm1ldGhvZHMiLCAiYmFzZSIpKSB7ICNUSEVTRSBQQUNLQUdFUyBBUkUgUEFSVCBPRiBCQVNFISEgWU9VIENBTk5PVCBSRU1PVkUgVEhFTSEhIEJ1dCB5b3UgY2FuIHJlbW92ZSBldmVyeXRoaW5nIGVsc2UuLi4NCiAgICAgICAgc3VwcHJlc3NQYWNrYWdlU3RhcnR1cE1lc3NhZ2VzICggDQogICAgICAgICAgICBzdXBwcmVzc01lc3NhZ2VzICggDQogICAgICAgICAgICAgICAgc3VwcHJlc3NXYXJuaW5ncyAoIA0KICAgICAgICAgICAgICAgICAgICBkZXRhY2ggKCBwYXN0ZTAoInBhY2thZ2U6IiwgcGFja2FnZSkgI2RldGFjaCgpIGlzIGxpa2UgdGhlIHJldmVyc2Ugb2YgbGlicmFyeSgpIG9yIHJlcXVpcmUoKS4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICwgdW5sb2FkID0gVFJVRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgLCBjaGFyYWN0ZXIub25seSA9IFRSVUUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICkNCiAgICAgICAgICAgICAgICApDQogICAgICAgICAgICApDQogICAgICAgICkNCiAgICB9DQp9DQoNCiMgRGVmaW5lIHBhY2thZ2VzIHJlcXVpcmVkLiBUaGVzZSBhcmUgc29tZSBvZiB0aGUgYXdlc29tZSBwYWNrYWdlcyB0aGF0IEkgaGF2ZSB1c2VkIGluIHRoZSBwYXN0Lg0KcmVxdWlyZWRfcGFja2FnZXMgPC0gYyAoICJNQVNTIiAgICAgICwgInJlYWRhYnMiICAgICAgLCAiZm9yZWFjaCIgICAgLCAiZGF0YS50YWJsZSINCiAgICAgICAgICAgICAgICAgICAgICAgLCAidGlkeXZlcnNlIiAsICJsdWJyaWRhdGUiICAgICwgImdncmVwZWwiICAgICwgInVyY2EiDQogICAgICAgICAgICAgICAgICAgICAgICwgInJlYWRyIiAgICAgLCAia25pdHIiICAgICAgICAsICJrYWJsZUV4dHJhIiAsICJybWFya2Rvd24iICANCiAgICAgICAgICAgICAgICAgICAgICAgLCAic3RyaW5naSIgICAsICJSQ29sb3JCcmV3ZXIiICwgIm1hZ3JpdHRyIiAgICwgInRpZHlyIg0KICAgICAgICAgICAgICAgICAgICAgICAsICJmb3JlY2FzdCIgICwgImdyaWQiICAgICAgICAgLCAib3V0bGllcnMiICAgLCAiaHR0ciINCiAgICAgICAgICAgICAgICAgICAgICAgLCAianNvbmxpdGUiICAsICJsZWFmbGV0IiAgICAgICwgImdyaWRFeHRyYSIgICwgInNjYWxlcyIgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICAgLCAiY2FwdGlvbmVyIiAsICJ0aWN0b2MiICAgICAgICwgImdncHViciIgICAgICwgInNlYXN0ZXN0cyINCiAgICAgICAgICAgICAgICAgICAgICAgLCAiem9vIiAgICAgICAsICJkdHBseXIiICAgICAgICwgInRzZmVhdHVyZXMiICwgImJvb2tkb3duIg0KICAgICAgICAgICAgICAgICAgICAgICApDQoNCiMgSW5zdGFsbCBhbGwgZGVmaW5lZCBwYWNrYWdlcw0KZm9yIChwYWNrYWdlIGluIHJlcXVpcmVkX3BhY2thZ2VzKSB7DQogICAgaWYgKCFwYWNrYWdlICVpbiUgaW5zdGFsbGVkLnBhY2thZ2VzKCkpIHsgI2luc3RhbGxlZC5wYWNrYWdlcygpIHJldHVybnMgYSB2ZWN0b3Igb2YgYWxsIHRoZSBpbnN0YWxsZWQgcGFja2FnZXMuLi4NCiAgICAgICAgaW5zdGFsbC5wYWNrYWdlcyAoIHBhY2thZ2UNCiAgICAgICAgICAgICAgICAgICAgICAgICAjICwgcXVpZXQgPSBUUlVFDQogICAgICAgICAgICAgICAgICAgICAgICAgIyAsIHZlcmJvc2UgPSBGQUxTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICwgZGVwZW5kZW5jaWVzID0gVFJVRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICkNCiAgICB9DQp9DQoNCiMgTG9hZCBhbGwgZGVmaW5lZCBwYWNrYWdlcw0KZm9yIChwYWNrYWdlIGluIHJlcXVpcmVkX3BhY2thZ2VzKSB7ICNOZWVkIHRvIGxvb3AgdGhyb3VnaCBhIHNlY29uZCB0aW1lIGJlY2F1c2UgaXQgZG9lcyBmdW5ueSB0aGluZ3MgaWYgeW91IGNvbWJpbmUgdGhlIGluc3RhbGwucGFja2FnZXMoKSBhbmQgbGlicmFyeSgpIHN0ZXBzIGluIHRvIG9uZS4NCiAgICBpZiAoIXBhY2thZ2UgJWluJSAucGFja2FnZXMoKSkgeyAjLnBhY2thZ2VzKCkgcmV0dXJucyBhIHZlY3RvciBvZiBhbGwgdGhlIGxvYWRlZCBwYWNrYWdlcy4uLg0KICAgICAgICBzdXBwcmVzc1BhY2thZ2VTdGFydHVwTWVzc2FnZXMgKA0KICAgICAgICAgICAgbGlicmFyeSAoIHBhY2thZ2UNCiAgICAgICAgICAgICAgICAgICAgLCBjaGFyYWN0ZXIub25seSA9IFRSVUUNCiAgICAgICAgICAgICAgICAgICAgLCBxdWlldGx5ID0gVFJVRQ0KICAgICAgICAgICAgICAgICAgICAsIHdhcm4uY29uZmxpY3RzID0gRkFMU0UNCiAgICAgICAgICAgICAgICAgICAgLCB2ZXJib3NlID0gRkFMU0UNCiAgICAgICAgICAgICAgICAgICAgKQ0KICAgICAgICApDQogICAgfQ0KfQ0KDQojIENsZWFuIHVwDQpybShyZXF1aXJlZF9wYWNrYWdlcywgcGFja2FnZSkNCmBgYA0KDQpgYGB7ciBTRVQgRGVmYXVsdHMsIGVjaG89RkFMU0UsIGV2YWw9VFJVRX0NCiMgU2V0IERlZmF1bHQgdGhlbWVzDQp0aGVtZV9zZXQodGhlbWVfYncoKSkNCnRoZW1lX3VwZGF0ZSggcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdD0wLjUpDQogICAgICAgICAgICAsIHBsb3Quc3VidGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3Q9MC41KQ0KICAgICAgICAgICAgKQ0KDQojIFNldCBEZWZhdWx0IHRhYmxlIGFuZCBmaWd1cmUgc2l6ZXMNCmtuaXRyOjpvcHRzX2NodW5rJHNldChyb3dzLnByaW50PTIwMCwgY29scy5wcmludD0zMCwgZmlnLndpZHRoPTEwLCBmaWcuaGVpZ2h0PTcpDQoNCiMgU2V0IERlZmF1bHQgcm91bmRpbmcgbGVuZ3RoDQpvcHRpb25zKGRpZ2l0cyA9IDQpDQpvcHRpb25zKHNjaXBlbiA9IDk5OSkNCg0KIyBTZXQgdGhlIFRhYmxlIGFuZCBGaWd1cmUgY2FwdGlvbg0KdGFibGUgPC0gY2FwdGlvbmVyKHByZWZpeD0iVGFibGUiKQ0KZmlndXJlIDwtIGNhcHRpb25lcihwcmVmaXg9IkZpZ3VyZSIpDQpgYGANCg0KYGBge3IgU0VUIEZ1bmN0aW9uLCBlY2hvPUZBTFNFLCBldmFsPVRSVUV9DQojIyMjIFRocmVlIHN0cmluZyBtYW5pcHVsYXRpb24gZnVuY3Rpb25zIChMRUZULFJJR0hULE1JRCkgIyMjIw0Kc3RyX2xlZnQgPC0gZnVuY3Rpb24oc3RyaW5nLCBudW1fY2hhcnMpIHsNCiAgICANCiAgICAjIElucHV0Og0KICAgICMgLSAnc3RyaW5nJyBpcyB0aGUgdGV4dCBzdHJpbmcgeW91IHdhbnQgdG8gc2VsZWN0IGZyb207IG11c3QgYmUgYW4gY2hhcmFjdGVyIHR5cGUuDQogICAgIyAtICdudW1fY2hhcnMnIGlzIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB0aGF0IHlvdSB3YW50IHRvIHNlbGVjdDsgbXVzdCBiZSBhbiBhdG9taWMgbnVtZXJpYyB0eXBlLg0KICAgIA0KICAgICMgT3V0cHV0Og0KICAgICMgLSBBIHRleHQgc3RyaW5nIG9mIGxlbmd0aCAnbnVtX2NoYXJzJyB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBsZWZ0IG1vc3QgbnVtYmVyIG9mIGNoYXJhY3RlcnMgZnJvbSB0aGUgJ3N0cmluZycgb3B0aW9uLg0KICAgIA0KICAgICMgVmFsaWRhdGlvbnM6DQogICAgc3RvcGlmbm90KGlzLmNoYXJhY3RlcihzdHJpbmcpKQ0KICAgIHN0b3BpZm5vdChpcy5udW1lcmljKG51bV9jaGFycykpDQogICAgc3RvcGlmbm90KGlzLmF0b21pYyhudW1fY2hhcnMpKQ0KICAgIA0KICAgICMgRG8gd29yaw0KICAgIHJldHVybiA8LSBzdWJzdHIoc3RyaW5nLCAxLCBudW1fY2hhcnMpDQogICAgDQogICAgIyBSZXR1cm4NCiAgICByZXR1cm4ocmV0dXJuKQ0KICAgIA0KfQ0KDQpzdHJfbWlkIDwtIGZ1bmN0aW9uKHN0cmluZywgc3RhcnRfbnVtLCBudW1fY2hhcnMpIHsNCiAgICANCiAgICAjIElucHV0Og0KICAgICMgLSAnc3RyaW5nJyBpcyB0aGUgdGV4dCBzdHJpbmcgeW91IHdhbnQgdG8gc2VsZWN0IGZyb207IG11c3QgYmUgYW4gYXRvcGljIHN0cmluZy4NCiAgICAjIC0gJ3N0YXJ0X251bScgaXMgdGhlIHN0YXJ0aW5nIHBvc2l0aW9uIG9mIHRoZSBtaWQtdGV4dCBzdHJpbmcgeW91IHdhbnQgdG8gc2VsZWN0IGZyb207IG11c3QgYmUgYW4gYXRvbWljIG51bWVyaWMgdHlwZS4NCiAgICAjIC0gJ251bV9jaGFycycgaXMgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRoYXQgeW91IHdhbnQgdG8gc2VsZWN0OyBtdXN0IGJlIGFuIGF0b21pYyBudW1lcmljIHR5cGUuDQogICAgDQogICAgIyBPdXRwdXQ6DQogICAgIyAtIEEgdGV4dCBzdHJpbmcgb2YgbGVuZ3RoICdudW1fY2hhcnMnIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGNoYXJhY3RlcnMgZnJvbSB0aGUgJ3N0YXJ0X251bScgc3RhcnRpbmcgcG9zaXRpb24gZnJvbSB0aGUgJ3N0cmluZycgb3B0aW9uLg0KICAgIA0KICAgICMgVmFsaWRhdGlvbnM6DQogICAgc3RvcGlmbm90KGlzLmNoYXJhY3RlcihzdHJpbmcpKQ0KICAgIHN0b3BpZm5vdChpcy5udW1lcmljKHN0YXJ0X251bSkpDQogICAgc3RvcGlmbm90KGlzLmF0b21pYyhzdGFydF9udW0pKQ0KICAgIHN0b3BpZm5vdChpcy5udW1lcmljKG51bV9jaGFycykpDQogICAgc3RvcGlmbm90KGlzLmF0b21pYyhudW1fY2hhcnMpKQ0KICAgIA0KICAgICMgRG8gd29yaw0KICAgIHJldHVybiA8LSBzdWJzdHIoc3RyaW5nLCBzdGFydF9udW0sIHN0YXJ0X251bSArIG51bV9jaGFycyAtIDEpDQogICAgDQogICAgIyBSZXR1cm4NCiAgICByZXR1cm4ocmV0dXJuKQ0KICAgIA0KfQ0KDQpzdHJfcmlnaHQgPC0gZnVuY3Rpb24oc3RyaW5nLCBudW1fY2hhcnMpIHsNCiAgICANCiAgICAjIElucHV0Og0KICAgICMgLSAnc3RyaW5nJyBpcyB0aGUgdGV4dCBzdHJpbmcgeW91IHdhbnQgdG8gc2VsZWN0IGZyb207IG11c3QgYmUgYW4gY2hhcmFjdGVyIHR5cGUuDQogICAgIyAtICdudW1fY2hhcnMnIGlzIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB0aGF0IHlvdSB3YW50IHRvIHNlbGVjdDsgbXVzdCBiZSBhbiBhdG9taWMgbnVtZXJpYyB0eXBlLg0KICAgIA0KICAgICMgT3V0cHV0Og0KICAgICMgLSBBIHRleHQgc3RyaW5nIG9mIGxlbmd0aCAnbnVtX2NoYXJzJyB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSByaWdodCBtb3N0IG51bWJlciBvZiBjaGFyYWN0ZXJzIGZyb20gdGhlICdzdHJpbmcnIG9wdGlvbi4NCiAgICANCiAgICAjIFZhbGlkYXRpb25zOg0KICAgIHN0b3BpZm5vdChpcy5jaGFyYWN0ZXIoc3RyaW5nKSkNCiAgICBzdG9waWZub3QoaXMubnVtZXJpYyhudW1fY2hhcnMpKQ0KICAgIHN0b3BpZm5vdChpcy5hdG9taWMobnVtX2NoYXJzKSkNCiAgICANCiAgICAjIERvIHdvcmsNCiAgICByZXR1cm4gPC0gc3Vic3RyKHN0cmluZywgbmNoYXIoc3RyaW5nKSAtIChudW1fY2hhcnMgLSAxKSwgbmNoYXIoc3RyaW5nKSkNCiAgICANCiAgICAjIFJldHVybg0KICAgIHJldHVybihyZXR1cm4pDQogICAgDQp9DQoNCiMjIyMgRnVuY3Rpb24gd3JpdHRlbiBieSBNaWNoZWxsZSAjIyMjDQpoZWFkZXIudHJ1ZSA8LSBmdW5jdGlvbihkZikgew0KICAgIG5hbWVzKGRmKSA8LSBhcy5jaGFyYWN0ZXIodW5saXN0KGRmWzEsXSkpDQogICAgZGZbLTEsXQ0KfQ0KDQojIyMjIEZ1bmN0aW9uIGZvciBmaW5kaW5nIHRoZSBkaW1lbnNpb25zIG9mIGEgbnVtYmVyIG9mIERhdGFGcmFtZXMgIyMjIw0KRGF0YUZyYW1lRGltZW5zaW9ucyA8LSBmdW5jdGlvbiAoRGF0YUZyYW1lcykgew0KICANCiAgICAjIElucHV0Og0KICAgICMgLSAnRGF0YUZyYW1lcycgbXVzdCBiZSBhIGNoYXJhY3RlciB2ZWN0b3Igb2YgZWFjaCBkYXRhLmZyYW1lIHRoYXQgeW91IHdhbnQgdG8gcmV2aWV3IHRoZSBkaW1lbnNpb25zIG9mLg0KICAgIA0KICAgICMgVmFsaWRhdGlvbnM6DQogICAgc3RvcGlmbm90KGlzLmNoYXJhY3RlcihEYXRhRnJhbWVzKSkNCiAgICANCiAgICBmb3IoRGF0YUZyYW1lIGluIERhdGFGcmFtZXMpIHsNCiAgICANCiAgICAgICAgaWYgKCFleGlzdHMoRGF0YUZyYW1lKSkgew0KICAgICAgICAgICAgd2FybmluZyAocGFzdGUwKCJcbiIsICInIiwgRGF0YUZyYW1lLCAiJyIsICIgaXMgbm90IGEgdmFsaWQgZGF0YSBmcmFtZSIsICJcbiIpKQ0KICAgICAgICAgICAgbmV4dA0KICAgICAgICB9DQogICAgICAgIA0KICAgICAgICAjIEdldCB0aGUgRGF0YUZyYW1lDQogICAgICAgIEdldERhdGFGcmFtZSA8LSBnZXQoRGF0YUZyYW1lKQ0KICAgICAgICANCiAgICAgICAgIyBJbml0aWFsaXNlIHRoZSBEaW1zVGFibGUNCiAgICAgICAgaWYgKCFleGlzdHMoIkRpbXNUYWJsZSIpKSB7RGltc1RhYmxlIDwtIE5VTEx9DQogICAgICAgIA0KICAgICAgICAjIENvbXBpbGUgdGhlIERpbXNUYWJsZQ0KICAgICAgICBEaW1zVGFibGUgPC0gcmJpbmQoRGltc1RhYmxlLCBkYXRhLmZyYW1lKA0KICAgICAgICAgICAgRGF0YUZyYW1lID0gRGF0YUZyYW1lLA0KICAgICAgICAgICAgTnVtUm93cyA9IGRpbShHZXREYXRhRnJhbWUpWzFdLA0KICAgICAgICAgICAgTnVtQ29scyA9IGRpbShHZXREYXRhRnJhbWUpWzJdDQogICAgICAgICAgICApKQ0KICAgIA0KICAgIH0NCiAgDQogICMgUmV0dXJuIHRoZSBEaW1zVGFibGUNCiAgcmV0dXJuIChEaW1zVGFibGUpDQogIA0KfQ0KDQojIyMjIElzRW1wdHkgIyMjIw0KSXNFbXB0eSA8LSBmdW5jdGlvbiAoeCkgew0KICAgIGlmIChpcy5mdW5jdGlvbih4KSB8fCB0eXBlb2YoeCkgPT0gIlM0Iikgew0KICAgICAgICByZXR1cm4gKEZBTFNFKQ0KICAgIH0gZWxzZSB7DQogICAgICAgIHJldHVybiAoaXMubnVsbCh4KSB8fCBsZW5ndGgoeCkgPT0gMCB8fCBhbGwoaXMubmEoeCkpKQ0KICAgIH0NCn0NCg0KIyMjIyBSZXZpZXcgRGF0YUZyYW1lIFN0YXRpc3RpY3MgIyMjIw0KUmV2aWV3RGZTdGF0cyA8LSBmdW5jdGlvbiAoRGF0YUZyYW1lKSB7DQogIA0KICAgICMgSW5wdXQ6DQogICAgIyAtICdEYXRhRnJhbWUnIGlzIGEgZGF0YWZyYW1lLg0KICAgIA0KICAgICMgVmFsaWRhdGlvbnM6DQogICAgc3RvcGlmbm90KCFJc0VtcHR5KERhdGFGcmFtZSkpDQogICAgc3RvcGlmbm90KGlzLmRhdGEuZnJhbWUoRGF0YUZyYW1lKSkNCiAgICANCiAgICAjIExvYWQgbmVjZXNzYXJ5IHBhY2thZ2VzDQogICAgaWYgKCEicGFzdGVjcyIgJWluJSBpbnN0YWxsZWQucGFja2FnZXMoKSkgeyANCiAgICAgICAgaW5zdGFsbC5wYWNrYWdlcyAoICJwYXN0ZWNzIg0KICAgICAgICAgICAgICAgICAgICAgICAgICwgcXVpZXQgPSBUUlVFDQogICAgICAgICAgICAgICAgICAgICAgICAgLCB2ZXJib3NlID0gRkFMU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAsIGRlcGVuZGVuY2llcyA9IFRSVUUNCiAgICAgICAgICAgICAgICAgICAgICAgICApDQogICAgfQ0KICAgIGlmICghInBhc3RlY3MiICVpbiUgLnBhY2thZ2VzKCkpIHsgIy5wYWNrYWdlcygpIHJldHVybnMgYSB2ZWN0b3Igb2YgYWxsIHRoZSBsb2FkZWQgcGFja2FnZXMuLi4NCiAgICAgICAgc3VwcHJlc3NQYWNrYWdlU3RhcnR1cE1lc3NhZ2VzICgNCiAgICAgICAgICAgIHN1cHByZXNzV2FybmluZ3MgKA0KICAgICAgICAgICAgICAgIHN1cHByZXNzTWVzc2FnZXMgKA0KICAgICAgICAgICAgICAgICAgICBsaWJyYXJ5ICggInBhc3RlY3MiDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLCBjaGFyYWN0ZXIub25seSA9IFRSVUUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAsIHF1aWV0bHkgPSBUUlVFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLCB3YXJuLmNvbmZsaWN0cyA9IEZBTFNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLCB2ZXJib3NlID0gRkFMU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApDQogICAgICAgICAgICAgICAgKQ0KICAgICAgICAgICAgKQ0KICAgICAgICApDQogICAgfQ0KICANCiAgICAjIFNldCB1cCB0aGUgRmluYWxEYXRhRnJhbWUNCiAgICBEYXRhRnJhbWUgJT4lIA0KICAgICAgICBzdW1tYXJ5LmRlZmF1bHQoKSAlPiUgDQogICAgICAgIGRhdGEuZnJhbWUoKSAlPiUgDQogICAgICAgIHNwcmVhZChrZXk9VmFyMiwgdmFsdWU9RnJlcSkgJT4lIA0KICAgICAgICByZW5hbWUoInZhcmlhYmxlIj0iVmFyMSIpICU+JSANCiAgICAgICAgbXV0YXRlX2lmKGlzLmZhY3Rvcixhcy5jaGFyYWN0ZXIoKSkgJT4lIA0KICAgICAgICBtdXRhdGUoTW9kZT1yZXBsYWNlKE1vZGUsIENsYXNzPT0iZmFjdG9yIiwgImNoYXJhY3RlciIpLA0KICAgICAgICAgICAgTW9kZT1yZXBsYWNlKE1vZGUsIENsYXNzPT0ib3JkZXJlZCIsICJjaGFyYWN0ZXIiKSkgLT4NCiAgICAgICAgRmluYWxEYXRhRnJhbWUNCiAgDQogICAgIyBEZWNsYXJlIE51bUNvbHMNCiAgICBEYXRhRnJhbWUgJT4lIA0KICAgICAgICBzZWxlY3RfaWYoaXMubnVtZXJpYykgJT4lIA0KICAgICAgICBuYW1lcygpIC0+DQogICAgICAgIG51bWNvbHMNCiAgICANCiAgICAjIERldGVybWluZSBpZiBOb3JtVGVzdCBpcyBuZWVkZWQNCiAgICBpZiAobnJvdyhEYXRhRnJhbWUpID4gNTAwMCkgew0KICAgICAgICBEb05vcm0gPC0gRkFMU0UNCiAgICB9IGVsc2Ugew0KICAgICAgICBEb05vcm0gPC0gVFJVRQ0KICAgIH0NCiAgDQogICAgIyBEZXNjcmliZSB3aXRoIHBhc3RlY3MNCiAgICBEYXRhRnJhbWUgJT4lDQogICAgICAgIHNlbGVjdChudW1jb2xzKSAlPiUNCiAgICAgICAgc3RhdC5kZXNjKGJhc2ljPVQsIGRlc2M9VCwgbm9ybT1Eb05vcm0sIHA9MC45NSkgJT4lDQogICAgICAgIHJvdW5kKGRpZ2l0cz0yKSAlPiUNCiAgICAgICAgcm93bmFtZXNfdG9fY29sdW1uKCkgJT4lDQogICAgICAgIG11dGF0ZShyb3duYW1lPWZhY3Rvcihyb3duYW1lLGxldmVscz1jKCAibWVhbiINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsICJzdGQuZGV2Ig0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgIm1lZGlhbiINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsICJtYXgiDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAibWluIg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgInJhbmdlIg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgInN1bSINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsICJ2YXIiDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAic2tld25lc3MiDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAia3VydG9zaXMiDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAibm9ybXRlc3QuVyINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsICJub3JtdGVzdC5wIg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgIlNFLm1lYW4iDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAiQ0kubWVhbi4wLjk1Ig0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgImNvZWYudmFyIg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgInNrZXcuMlNFIg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgImt1cnQuMlNFIg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgIm5ici52YWwiDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAibmJyLm51bGwiDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAibmJyLm5hIg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkNCiAgICAgICAgICApKSAlPiUNCiAgICAgICAgYXJyYW5nZShyb3duYW1lKSAlPiUNCiAgICAgICAgdCgpICU+JQ0KICAgICAgICBhcy5kYXRhLmZyYW1lKCkgJT4lDQogICAgICAgIHJvd25hbWVzX3RvX2NvbHVtbigpIC0+DQogICAgICAgIHN0YXRfdGFibGUNCg0KICAgICMgRml4IGNvbCBuYW1lcw0KICAgIG5hbWVzKHN0YXRfdGFibGUpIDwtIGFzLm1hdHJpeChzdGF0X3RhYmxlWzEsXSkNCg0KICAgICMgU2VsZWN0IG9ubHkgdGhlIGNvbHVtbnMgbmVlZGVkDQogICAgc3RhdF90YWJsZSA8LSBzdGF0X3RhYmxlWy0xLCAhbmFtZXMoc3RhdF90YWJsZSkgJWluJSBjKCJ2YXIiLCAia3VydG9zaXMiLCAibm9ybXRlc3QucCIsICJTRS5tZWFuIiwgIkNJLm1lYW4uMC45NSIsICJjb2VmLnZhciIsICJza2V3LjJTRSIsICJrdXJ0LjJTRSIpXQ0KICAgIA0KICAgICMgTWFrZSBwcmV0dHkNCiAgICBzdGF0X3RhYmxlIDwtIHN0YXRfdGFibGUgJT4lDQogICAgICAgIG11dGF0ZSggbmJyLnZhbD1nc3ViKCIuMDAiLCIiLG5ici52YWwsZml4ZWQ9VCkNCiAgICAgICAgICAgICAgLCBuYnIubnVsbD1nc3ViKCIuMDAiLCIiLG5ici5udWxsLGZpeGVkPVQpDQogICAgICAgICAgICAgICwgbmJyLm5hPWdzdWIoIi4wMCIsIiIsbmJyLm5hLGZpeGVkPVQpDQogICAgICAgICAgICAgICwgbWluPWdzdWIoIi4wMCIsIiIsbWluLGZpeGVkPVQpDQogICAgICAgICAgICAgICwgbmJyLnZhbD1nc3ViKCIuMCIsIiIsbmJyLnZhbCxmaXhlZD1UKQ0KICAgICAgICAgICAgICAsIG5ici5udWxsPWdzdWIoIi4wIiwiIixuYnIubnVsbCxmaXhlZD1UKQ0KICAgICAgICAgICAgICAsIG5ici5uYT1nc3ViKCIuMCIsIiIsbmJyLm5hLGZpeGVkPVQpDQogICAgICAgICAgICAgICwgbWluPWdzdWIoIi4wIiwiIixtaW4sZml4ZWQ9VCkNCiAgICAgICAgICAgICAgKSAlPiUNCiAgICAgICAgcmVuYW1lKCB2YXJpYWJsZT1yb3duYW1lDQogICAgICAgICAgICAgICwgIm51bV92YWwiPW5ici52YWwNCiAgICAgICAgICAgICAgLCAibnVtX251bGwiPW5ici5udWxsDQogICAgICAgICAgICAgICwgIm51bV9uYSI9bmJyLm5hDQogICAgICAgICAgICAgICkgJT4lDQogICAgICAgIG11dGF0ZSggbWVhbj1hcy5udW1lcmljKGFzLmNoYXJhY3RlcihtZWFuKSkNCiAgICAgICAgICAgICAgLCBzdGQuZGV2PWFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKHN0ZC5kZXYpKQ0KICAgICAgICAgICAgICAsIG1lZGlhbj1hcy5udW1lcmljKGFzLmNoYXJhY3RlcihtZWRpYW4pKQ0KICAgICAgICAgICAgICAsIG1heD1hcy5udW1lcmljKGFzLmNoYXJhY3RlcihtYXgpKQ0KICAgICAgICAgICAgICAsIG1pbj1hcy5udW1lcmljKGFzLmNoYXJhY3RlcihtaW4pKQ0KICAgICAgICAgICAgICAsIHJhbmdlPWFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKHJhbmdlKSkNCiAgICAgICAgICAgICAgLCAibnVtX3ZhbCI9YXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIoIm51bV92YWwiKSkNCiAgICAgICAgICAgICAgLCAibnVtX251bGwiPWFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKCJudW1fbnVsbCIpKQ0KICAgICAgICAgICAgICAsICJudW1fbmEiPWFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKCJudW1fbmEiKSkNCiAgICAgICAgICAgICAgKQ0KDQogICAgIyBGaXggTm9ybSBwYXJ0cw0KICAgIGlmIChEb05vcm09PVRSVUUpIHsNCiAgICAgICAgc3RhdF90YWJsZSA8LSBzdGF0X3RhYmxlICU+JQ0KICAgICAgICByZW5hbWUoc2tldz1za2V3bmVzcywNCiAgICAgICAgICAgIG5vcm10ZXN0PW5vcm10ZXN0LlcpICU+JQ0KICAgICAgICBtdXRhdGUoc2tldz1hcy5udW1lcmljKGFzLmNoYXJhY3Rlcihza2V3KSksDQogICAgICAgICAgICBub3JtdGVzdD1hcy5udW1lcmljKGFzLmNoYXJhY3Rlcihub3JtdGVzdCkpKQ0KICAgIH0NCiAgDQogICAgIyBKb2luIGJhY2sgb24gRmluYWxEYXRhRnJhbWUNCiAgICBGaW5hbERhdGFGcmFtZSAlPiUgDQogICAgICAgIGxlZnRfam9pbihzdGF0X3RhYmxlLCBieT0idmFyaWFibGUiKSAtPg0KICAgICAgICBGaW5hbERhdGFGcmFtZQ0KICANCiAgICAjIEZpbmQgbnVtYmVyIG9mIGRpc3RpbmN0IHZhbHVlcw0KICAgIERhdGFGcmFtZSAlPiUNCiAgICAgICAgc3VtbWFyaXNlX2FsbChmdW5zKG5fZGlzdGluY3QoLikpKSAlPiUNCiAgICAgICAgdCgpICU+JQ0KICAgICAgICBkYXRhLmZyYW1lKG51bV9kaXN0aW5jdD0uKSAlPiUNCiAgICAgICAgcm93bmFtZXNfdG9fY29sdW1uKHZhcj0idmFyaWFibGUiKSAtPg0KICAgICAgICBkaXN0aW5jdHMNCiAgDQogICAgIyBGaW5kIG51bWJlciBvZiBOQSdzDQogICAgRGF0YUZyYW1lICU+JSANCiAgICAgICAgc3VtbWFyaXNlX2FsbChmdW5zKHN1bShpcy5uYSguKSkpKSAlPiUgDQogICAgICAgIHQoKSAlPiUgDQogICAgICAgIGRhdGEuZnJhbWUobnVtX25hPS4pICU+JSANCiAgICAgICAgcm93bmFtZXNfdG9fY29sdW1uKHZhcj0idmFyaWFibGUiKSAtPg0KICAgICAgICBuYXMNCiAgDQogICAgIyBGaW5kIG51bWJlciBvZiBOQSdzDQogICAgRGF0YUZyYW1lICU+JSANCiAgICAgICAgc3VtbWFyaXNlX2FsbChmdW5zKHN1bShpcy5udWxsKC4pKSkpICU+JSANCiAgICAgICAgdCgpICU+JSANCiAgICAgICAgZGF0YS5mcmFtZShudW1fbnVsbD0uKSAlPiUgDQogICAgICAgIHJvd25hbWVzX3RvX2NvbHVtbih2YXI9InZhcmlhYmxlIikgLT4NCiAgICAgICAgbnVsbHMNCg0KICAgICMgQXBwbHkgYmFjayB0byB0aGUgRmluYWxEYXRhRnJhbWUNCiAgICBGaW5hbERhdGFGcmFtZSAlPiUgDQogICAgICAgIHNlbGVjdCgtbnVtX25hLCAtbnVtX251bGwsIC1udW1fdmFsKSAlPiUgDQogICAgICAgIGxlZnRfam9pbihkaXN0aW5jdHMsIGJ5PSJ2YXJpYWJsZSIpICU+JSANCiAgICAgICAgbGVmdF9qb2luKG5hcywgYnk9InZhcmlhYmxlIikgJT4lIA0KICAgICAgICBsZWZ0X2pvaW4obnVsbHMsIGJ5PSJ2YXJpYWJsZSIpIC0+DQogICAgICAgIEZpbmFsRGF0YUZyYW1lDQogIA0KICAgICMgUmV0dXJuDQogICAgcmV0dXJuIChGaW5hbERhdGFGcmFtZSkNCg0KfQ0KDQojIyMjIFJldmlldyBEaXN0cmlidXRpb25zIG9mIGVhY2ggVmFyaWFibGUgaW4gRGF0YUZyYW1lICMjIyMNClJldmlld0RmRGlzdHJpYnV0aW9ucyA8LSBmdW5jdGlvbiAoRGF0YUZyYW1lLCBFeGNsdWRlQ29sdW1ucz1OQSwgVGFyZ2V0Q29sdW1uPU5BKSB7DQogIA0KICAgICMgSW5wdXQ6DQogICAgIyAtIERhdGFGcmFtZSBtdXN0IGJlIGEgZGF0YS5mcmFtZS4NCiAgICAjIC0gRXhsdWRlRG9sdW1ucyBpcyBvcHRpb25hbC4gSWYgYXBwbGllZCwgdGhlc2UgY29sdW1ucyB3aWxsIG5vdCBiZSB2aWV3ZWQuDQogICAgIyAtIFRhcmdldENvbHVtbiBpcyBvcHRpb25hbC4gSWYgYXBwbGllZCwgd2lsbCBwcm9kdWNlIGRvdCBwbG90cy4NCiAgICANCiAgICAjIFN0b3AgaWYgRGF0YUZyYW1lIG5vdCBhIGRhdGEuZnJhbWUNCiAgICBpZiAoIWMoImRhdGEuZnJhbWUiKSAlaW4lIGNsYXNzKERhdGFGcmFtZSkpIHsNCiAgICAgICAgc3RvcCAoIlBsZWFzZSBwYXJzZSBhIGRhdGEuZnJhbWUgYXMgdGhlIGZpcnN0IGVsZW1lbnQgb2YgdGhlIFJldmlld0RmRGlzdHJpYnV0aW9ucyBmdW5jdGlvbi4iKQ0KICAgIH0NCiAgDQogICAgIyBMb29wIHRocm91Z2ggYWxsIHRoZSB2YXJpYWJsZXMgaW4gdGhlIERhdGFGcmFtZQ0KICAgIGZvciAodmFyaWFibGUgaW4gbmFtZXMoRGF0YUZyYW1lKSkgew0KICAgIA0KICAgICAgICAjIENoZWNrIGlmIHZhcmlhYmxlIGluIEV4Y2x1ZGVDb2x1bW5zLiBJZiB5ZXMsIHRoZW4gc2tpcCB0byBuZXh0IHZhcmlhYmxlLg0KICAgICAgICBpZiAodmFyaWFibGUgJWluJSBFeGNsdWRlQ29sdW1ucykge25leHR9DQogICAgICAgIA0KICAgICAgICAjIFByb2R1Y2UgZGF0YS5mcmFtZSBvZiBlYWNoIHZhcmlhYmxlIGFuZCBpdCdzIHR5cGUuDQogICAgICAgIGlmICghZXhpc3RzKCJSZXR1cm5GcmFtZSIpKSB7UmV0dXJuRnJhbWUgPC0gTlVMTH0NCiAgICAgICAgUmV0dXJuRnJhbWUgPC0gcmJpbmQoUmV0dXJuRnJhbWUsIGRhdGEuZnJhbWUoIHZhcmlhYmxlPXZhcmlhYmxlDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCBjbGFzcz11bmxpc3QobGFwcGx5KERhdGFGcmFtZVssdmFyaWFibGVdLGNsYXNzKSkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsIG1vZGU9dW5saXN0KGxhcHBseShEYXRhRnJhbWVbLHZhcmlhYmxlXSxtb2RlKSkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsIHR5cGVvZj11bmxpc3QobGFwcGx5KERhdGFGcmFtZVssdmFyaWFibGVdLHR5cGVvZikpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSkNCiAgICAgICAgDQogICAgICAgICMgUHJvZHVjdCBQbG90cyBmb3IgdGhlIG51bWVyaWMgdmFyaWFibGVzLg0KICAgICAgICBpZiAodW5saXN0KGxhcHBseShEYXRhRnJhbWVbLHZhcmlhYmxlXSxtb2RlKSk9PSJudW1lcmljIiAmICghdW5saXN0KGxhcHBseShEYXRhRnJhbWVbLHZhcmlhYmxlXSxjbGFzcykpICVpbiUgYygiZmFjdG9yIiwib3JkZXJlZCIsIlBPU0lYY3QiKSkpIHsNCiAgICAgICAgICANCiAgICAgICAgICAgICMgUmVtb3ZlIHRoZSBOQSdzIGluIHRoZSB2YXJpYWJsZS4NCiAgICAgICAgICAgIGRhdCA8LSBEYXRhRnJhbWUgJT4lIGRyb3BfbmEodmFyaWFibGUpDQogICAgICAgICAgDQogICAgICAgICAgICAjIFNldCBTdGF0aXN0aWNzDQogICAgICAgICAgICBtYXggPC0gZGF0ICU+JSBzZWxlY3QodmFyaWFibGUpICU+JSBwdWxsKCkgJT4lIG1heCgpDQogICAgICAgICAgICBtaW4gPC0gZGF0ICU+JSBzZWxlY3QodmFyaWFibGUpICU+JSBwdWxsKCkgJT4lIG1pbigpDQogICAgICAgICAgICBhdmcgPC0gZGF0ICU+JSBzZWxlY3QodmFyaWFibGUpICU+JSBwdWxsKCkgJT4lIG1lYW4oKQ0KICAgICAgICAgICAgc3RkIDwtIGRhdCAlPiUgc2VsZWN0KHZhcmlhYmxlKSAlPiUgcHVsbCgpICU+JSBzZCgpDQogICAgICAgICAgICBsZW4gPC0gZGF0ICU+JSBzZWxlY3QodmFyaWFibGUpICU+JSBwdWxsKCkgJT4lIGxlbmd0aCgpDQogICAgICAgICAgICBiaW5zIDwtIDMwDQogICAgICAgICAgICBidyA8LSAobWF4IC0gbWluKSAvIChiaW5zICsgMSkNCiAgICAgICAgICANCiAgICAgICAgICAgICMgU2V0IEhpc3RvZ3JhbSBQbG90DQogICAgICAgICAgICBoaXN0IDwtIGRhdCAlPiUgDQogICAgICAgICAgICAgICAgZ2dwbG90KGFlc19zdHJpbmcodmFyaWFibGUpKSArDQogICAgICAgICAgICAgICAgZ2VvbV9oaXN0b2dyYW0oYWVzKHk9Li5jb3VudC4uKSwgZmlsbD0iY29ybmZsb3dlcmJsdWUiLCBjb2xvcj0iYmxhY2siLCBhbHBoYT0wLjcsIGJpbndpZHRoID0gYncpICsNCiAgICAgICAgICAgICAgICBzdGF0X2Z1bmN0aW9uKGZ1bj1mdW5jdGlvbih4KSBkbm9ybSh4LCBtZWFuPWF2Zywgc2Q9c3RkKSAqIGxlbiAqIGJ3LCBjb2xvcj0ib3JhbmdlcmVkIiwgc2l6ZT0xLjUpICsNCiAgICAgICAgICAgICAgICBsYWJzKCB0aXRsZT1wYXN0ZTAoIkhpc3RvZ3JhbSBQbG90IikNCiAgICAgICAgICAgICAgICAgICAgLCBzdWJ0aXRsZT1wYXN0ZTAoIiciLCB2YXJpYWJsZSwgIiciLCAiXG4iLCAiYXZnPSciLCByb3VuZChhdmcsMyksICInIHN0ZD0nIiwgcm91bmQoc3RkLDMpLCAiJyIpDQogICAgICAgICAgICAgICAgICAgICkNCiAgICAgICAgICANCiAgICAgICAgICAgICMgU2V0IHRoZSBRUSBQbG90DQogICAgICAgICAgICBxcSA8LSBkYXQgJT4lIA0KICAgICAgICAgICAgICAgIGdncGxvdChhZXNfc3RyaW5nKHNhbXBsZT12YXJpYWJsZSkpICsNCiAgICAgICAgICAgICAgICBnZW9tX3FxKGNvbG9yPSJjb3JuZmxvd2VyYmx1ZSIsIGFscGhhPTAuNykgKw0KICAgICAgICAgICAgICAgIGdlb21fcXFfbGluZShjb2xvcj0ib3JhbmdlcmVkIiwgc2l6ZT0xLjUpICsNCiAgICAgICAgICAgICAgICBsYWJzKCB0aXRsZT1wYXN0ZTAoIlFRIFBsb3QiKQ0KICAgICAgICAgICAgICAgICAgICAsIHN1YnRpdGxlPXBhc3RlMCgiJyIsIHZhcmlhYmxlLCAiJyIpDQogICAgICAgICAgICAgICAgICAgICkNCiAgICAgICAgICANCiAgICAgICAgICAgICMgSWYgVGFyZ2V0Q29sdW1uIGlzIG5vdCBtaXNzaW5nIHRoZW4gcHJvZHVjZSBEb3QgUGxvdA0KICAgICAgICAgICAgaWYgKCFtaXNzaW5nKFRhcmdldENvbHVtbikpIHsNCiAgICAgICAgICAgICAgICBkb3QgPC0gZGF0ICU+JSANCiAgICAgICAgICAgICAgICAgICAgbXV0YXRlX2VhY2goZnVucyhmYWN0b3IpLCBUYXJnZXRDb2x1bW4pICU+JSANCiAgICAgICAgICAgICAgICAgICAgZ2dwbG90KGFlc19zdHJpbmcoeD12YXJpYWJsZSwgeT1UYXJnZXRDb2x1bW4sIGZpbGw9VGFyZ2V0Q29sdW1uKSkgKw0KICAgICAgICAgICAgICAgICAgICBnZW9tX2RlbnNpdHlfcmlkZ2VzKGFscGhhPTAuNiwgYmFuZHdpZHRoPTEsIHNjYWxlPTEuNSkgKw0KICAgICAgICAgICAgICAgICAgICBsYWJzKCB0aXRsZT1wYXN0ZTAoIlJpZGdlIFBsb3QiKQ0KICAgICAgICAgICAgICAgICAgICAgICAgLCBzdWJ0aXRsZT1wYXN0ZTAoIiciLCB2YXJpYWJsZSwgIiciLCAiXG4iLCAidnMiLCAiXG4iLCAiJyIsIFRhcmdldENvbHVtbiwgIiciKQ0KICAgICAgICAgICAgICAgICAgICAgICAgKQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgIA0KICAgICAgICAgICAgIyBQcmludCB0aGUgUGxvdHMgYWxsIHNpZGUgYnkgc2lkZS4NCiAgICAgICAgICAgIGlmIChtaXNzaW5nKFRhcmdldENvbHVtbikpIHsNCiAgICAgICAgICAgICAgICBncmlkLmFycmFuZ2UoaGlzdCwgcXEsIG5jb2w9MikNCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgZ3JpZC5hcnJhbmdlKGhpc3QsIHFxLCBkb3QsIG5jb2w9MykNCiAgICAgICAgICAgIH0NCiAgICAgICAgICANCiAgICAgICAgfQ0KICAgICAgICANCiAgICAgICAgIyBQcm9kdWNlIFBsb3RzIGZvciB0aGUgTG9naWNhbCB2YXJpYWJsZXMNCiAgICAgICAgaWYgKHVubGlzdChsYXBwbHkoRGF0YUZyYW1lWyx2YXJpYWJsZV0sbW9kZSkpPT0ibG9naWNhbCIpIHsNCiAgICAgICAgICANCiAgICAgICAgICAgICMgUmVtb3ZlIE5BJ3MgaW4gdGhlIHZhcmlhYmxlDQogICAgICAgICAgICBkYXQgPC0gRGF0YUZyYW1lICU+JSBkcm9wX25hKHZhcmlhYmxlKQ0KICAgICAgICAgIA0KICAgICAgICAgICAgIyBTZXQgQmFyIFBsb3QNCiAgICAgICAgICAgIGJhciA8LSBkYXQgJT4lIA0KICAgICAgICAgICAgICAgIGdncGxvdChhZXNfc3RyaW5nKHZhcmlhYmxlLCBmaWxsPXZhcmlhYmxlKSkgKw0KICAgICAgICAgICAgICAgIGdlb21fYmFyKGFlcyh5PS4uY291bnQuLiksIGFscGhhPTAuNykgKw0KICAgICAgICAgICAgICAgIGdlb21fdGV4dChhZXMobGFiZWw9Li5jb3VudC4uKSwgc3RhdD0iY291bnQiLCBwb3NpdGlvbj1wb3NpdGlvbl9zdGFjaygwLjUpKSArDQogICAgICAgICAgICAgICAgbGFicyggdGl0bGU9cGFzdGUwKCJCYXIgUGxvdCIpDQogICAgICAgICAgICAgICAgICAgICwgc3VidGl0bGU9cGFzdGUwKCInIiwgdmFyaWFibGUsICInIikNCiAgICAgICAgICAgICAgICAgICAgKQ0KICAgICAgICAgIA0KICAgICAgICAgICAgIyBJZiBUYXJnZXRDb2x1bW4gaXMgbm90IG1pc3NpbmcsIHRoZW4gcHJvZHVjZSBHcm91cGVkIEJhciBQbG90DQogICAgICAgICAgICBpZiAoIW1pc3NpbmcoVGFyZ2V0Q29sdW1uKSkgew0KICAgICAgICAgICAgICAgIGdycGJhciA8LSBkYXQgJT4lIA0KICAgICAgICAgICAgICAgICAgICBnZ3Bsb3QoYWVzX3N0cmluZyhUYXJnZXRDb2x1bW4sIGZpbGw9dmFyaWFibGUpKSArDQogICAgICAgICAgICAgICAgICAgIGdlb21fYmFyKGFlcyh5PS4uY291bnQuLiksIGFscGhhPTAuNywgcG9zaXRpb249InN0YWNrIikgKw0KICAgICAgICAgICAgICAgICAgICBnZW9tX3RleHQoYWVzKGxhYmVsPS4uY291bnQuLiksIHN0YXQ9ImNvdW50IiwgcG9zaXRpb249cG9zaXRpb25fc3RhY2soMC41KSkgKw0KICAgICAgICAgICAgICAgICAgICBsYWJzKCB0aXRsZT1wYXN0ZTAoIkdyb3VwZWQgQmFyIFBsb3QiKQ0KICAgICAgICAgICAgICAgICAgICAgICAgLCBzdWJ0aXRsZT1wYXN0ZTAoIiciLCB2YXJpYWJsZSwgIiciLCAiXG4iLCAiYnkiLCAiXG4iLCAiJyIsIFRhcmdldENvbHVtbikNCiAgICAgICAgICAgICAgICAgICAgICAgICkNCiAgICAgICAgICAgIH0NCiAgICAgICAgICANCiAgICAgICAgICAgICMgUHJpbnQgdGhlIFBsb3RzIGFsbCBzaWRlIGJ5IHNpZGUNCiAgICAgICAgICAgIGlmIChtaXNzaW5nKFRhcmdldENvbHVtbikpIHsNCiAgICAgICAgICAgICAgICBncmlkLmFycmFuZ2UoYmFyLCBuY29sPTEpDQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgIGdyaWQuYXJyYW5nZShiYXIsIGdycGJhciwgbmNvbD0yKQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgIA0KICAgICAgICB9DQogICAgICAgIA0KICAgICAgICAjIFByb2R1Y2UgUGxvdHMgZm9yIHRoZSBDYXRlZ29yaWNhbCBDaGFyYWN0ZXIgdmFyaWFibGVzDQogICAgICAgIGlmICh1bmxpc3QobGFwcGx5KERhdGFGcmFtZVssdmFyaWFibGVdLCBtb2RlKSk9PSJudW1lcmljIiAmICh1bmxpc3QobGFwcGx5KERhdGFGcmFtZVssdmFyaWFibGVdLGNsYXNzKSkgJWluJSBjKCJmYWN0b3IiLCJvcmRlcmVkIikpKSB7DQogICAgICAgICAgDQogICAgICAgICAgICAjIFJlbW92ZSBOQSdzIGZyb20gdGhlIHZhcmlhYmxlDQogICAgICAgICAgICBkYXQgPC0gRGF0YUZyYW1lICU+JSBkcm9wX25hKHZhcmlhYmxlKQ0KICAgICAgICAgIA0KICAgICAgICAgICAgIyBTZXQgQmFyIFBsb3QNCiAgICAgICAgICAgIGJhciA8LSBkYXQgJT4lIA0KICAgICAgICAgICAgICAgIGdncGxvdChhZXNfc3RyaW5nKHZhcmlhYmxlLCBmaWxsPXZhcmlhYmxlKSkgKw0KICAgICAgICAgICAgICAgIGdlb21fYmFyKGFlcyh5PS4uY291bnQuLiksIGFscGhhPTAuNykgKw0KICAgICAgICAgICAgICAgIGxhYnMoIHRpdGxlPXBhc3RlMCgiQmFyIFBsb3QiKQ0KICAgICAgICAgICAgICAgICAgICAsIHN1YnRpdGxlPXBhc3RlMCgiJyIsIHZhcmlhYmxlLCAiJyIpDQogICAgICAgICAgICAgICAgICAgICkNCiAgICAgICAgICANCiAgICAgICAgICAgICMgSWYgVGFyZ2V0Q29sdW1uIGlzIG5vdCBtaXNzaW5nLCB0aGVuIHByb2R1Y2UgR3JvdXBlZCBCYXIgUGxvdA0KICAgICAgICAgICAgaWYgKCFtaXNzaW5nKFRhcmdldENvbHVtbikpIHsNCiAgICAgICAgICAgICAgICBncnBiYXIgPC0gZGF0ICU+JSANCiAgICAgICAgICAgICAgICAgICAgZ2dwbG90KGFlc19zdHJpbmcoVGFyZ2V0Q29sdW1uLCBmaWxsPXZhcmlhYmxlKSkgKw0KICAgICAgICAgICAgICAgICAgICBnZW9tX2JhcihhZXMoeT0uLmNvdW50Li4pLCBhbHBoYT0wLjcsIHBvc2l0aW9uPSJzdGFjayIpICsNCiAgICAgICAgICAgICAgICBsYWJzKCB0aXRsZT1wYXN0ZTAoIkdyb3VwZWQgQmFyIFBsb3QiKQ0KICAgICAgICAgICAgICAgICAgICAsIHN1YnRpdGxlPXBhc3RlMCgiJyIsIHZhcmlhYmxlLCAiJyIsICJcbiIsICJieSIsICJcbiIsICInIiwgVGFyZ2V0Q29sdW1uLCAiJyIpDQogICAgICAgICAgICAgICAgICAgICkNCiAgICAgICAgICB9DQogICAgICAgICAgDQogICAgICAgICAgIyBQcmludCB0aGUgUGxvdHMgYWxsIHNpZGUgYnkgc2lkZQ0KICAgICAgICAgIGlmIChtaXNzaW5nKFRhcmdldENvbHVtbikpIHsNCiAgICAgICAgICAgICAgICBncmlkLmFycmFuZ2UoYmFyLCBuY29sPTEpDQogICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICBncmlkLmFycmFuZ2UoYmFyLGdycGJhciwgbmNvbD0yKQ0KICAgICAgICAgIH0NCiAgICAgICAgICANCiAgICAgICAgfQ0KICAgIA0KICAgIH0NCiAgDQogIHJldHVybiAoUmV0dXJuRnJhbWUpDQogIA0KfQ0KYGBgDQoNCg0KPCEtLSBHZXQgRGF0YSAtLT4NCg0KYGBge3IgR0VUIEFFTU8gRW5lcmd5IERhdGEsIGVjaG89RkFMU0UsIGV2YWw9RkFMU0UsIHJlc3VsdHM9ImhpZGUifQ0KIyBDcmVkaXQgdG8gV2lsbGlhbSBEYWkgZm9yIGhlbHBpbmcgd2l0aCB0aGUgQ29kZSBpbiB0aGlzIGNodW5rLg0KDQpzdGF0ZXMgPC0gYygiUUxEMSIsIk5TVzEiLCJWSUMxIiwiVEFTMSIsIlNBMSIpDQpkYXRhX2RsX2xpc3QgPC0gYygpDQoNCiNXaGF0IGRvZXMgdGhpcyBkbz8NCiNGZXRjaGVzIHRoZSBhY3R1YWwgY3N2IGZpbGUgZnJvbSBBRU1PDQpnZXRfZGF0YV9mcm9tX2FlbW8gPC0gZnVuY3Rpb24odXJsLGZpbGVuYW1lKSB7DQogICAgZGF0YSA8LSByZWFkLmNzdih0ZXh0ID0gZ2V0VVJMKHVybCkpDQogICAgcHJpbnQocGFzdGUwKCJXcm90ZSBmaWxlIHRvIGRpc2s6ICIsZmlsZW5hbWUpKQ0KICAgIHJldHVybihkYXRhKQ0KfQ0KDQoNCiNQcmV0dHkgc3VyZSB0aGVyZSBpcyBhIGJldHRlciB3YXkgb2YgZG9pbmcgdGhpcyBhcyBvcHBvc2VkIHRvIGEgdHJpcGxlIGZvciBsb29wLCBWRVJZIFZFUlkgQkFEIQ0KI1doYXQgZG9lcyB0aGlzIGRvPw0KI0NyZWF0ZXMgdGhlIGRhdGEgdXJsLCBhcyBJIGZvdW5kIG91dCBsaW5rcyBhcmUgY29kZWQgaW4gdGhlIGZvbGxvd2luZyBmb3JtYXQ6DQojaHR0cHM6Ly93d3cuYWVtby5jb20uYXUvYWVtby9kYXRhL25lbS9wcmljZWFuZGRlbWFuZC9QUklDRV9BTkRfREVNQU5EXzxZWVlZTU0+X1NUQVRFMS5jc3YNCiNpLmUuIGh0dHBzOi8vd3d3LmFlbW8uY29tLmF1L2FlbW8vZGF0YS9uZW0vcHJpY2VhbmRkZW1hbmQvUFJJQ0VfQU5EX0RFTUFORF8yMDE5MDFfTlNXMS5jc3YNCg0KYnVpbGRfZGxfZmlsZV9saXN0IDwtIGZ1bmN0aW9uKHN0YXJ0X3lycywgZW5kX3lyKSB7DQogICAgDQogICAgZm9yKHN0YXRlIGluIDE6bGVuZ3RoKHN0YXRlcykpIHsNCiAgICAgICAgc3RhcnRfeXIgPC0gc3RhcnRfeXJzDQogICAgICAgIA0KICAgICAgICBmb3Ioc3RhcnRfeXIgaW4gc3RhcnRfeXJzOmVuZF95cikgew0KICAgICAgICAgICAgbW9udGhfYyA8LSAxDQogICAgICAgICAgICANCiAgICAgICAgICAgIGZvcihtb250aF9jIGluIDE6MTIpIHsNCiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICBpZihtb250aF9jIDwgMTApIHsgbW9udGggPC0gcGFzdGUoJzAnLG1vbnRoX2Msc2VwPSIiKSB9DQogICAgICAgICAgICAgICAgZWxzZSB7IG1vbnRoIDwtIG1vbnRoX2MgfQ0KICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIGZpbGVfbmFtZSA8LSBwYXN0ZSgnUFJJQ0VfQU5EX0RFTUFORF8nLHN0YXJ0X3lyLG1vbnRoLCdfJyxzdGF0ZXNbc3RhdGVdLCIuY3N2IixzZXA9IiIpDQogICAgICAgICAgICAgICAgZGF0YV9kbF9saXN0IDwtIGFwcGVuZChkYXRhX2RsX2xpc3QsZmlsZV9uYW1lKQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfQ0KICAgICNERUJVRyAtLSB3cml0ZS5jc3YoZGF0YV9kbF9saXN0LCBmaWxlID0gImRhdGFfZGxfbGlzdC5jc3YiLHJvdy5uYW1lcz1GQUxTRSxjb2wubmFtZXM9RkFMU0UsIHNlcD0iLCIpDQogICAgcmV0dXJuKGRhdGFfZGxfbGlzdCkNCn0NCg0KI1doYXQgZG9lcyB0aGlzIGRvPw0KI2ZvciBsb29wIHRvIGxvb3AgdGhyb3VnaCBhbGwgdGhlIGZpbGVzIHRvIGJlIGRvd25sb2FkZWQgYW5kIGdldHMgdGhlIGRhdGEgZnJvbSBBRU1PIHVzaW5nIFJDdXJsLg0KcHJvY2Vzc19hZW1vX2xpbmtzIDwtIGZ1bmN0aW9uKGFlbW9fZGF0YV9saXN0KSB7DQogICAgdG1wX21hc3Rlcl9kYXRhX2xpc3QgPC0gYygpDQogICAgZm9yKGxrIGluIDE6bGVuZ3RoKGFlbW9fZGF0YV9saXN0KSkgew0KICAgICAgICBkZiA8LSBnZXRfZGF0YV9mcm9tX2FlbW8ocGFzdGUwKCdodHRwczovL3d3dy5hZW1vLmNvbS5hdS9hZW1vL2RhdGEvbmVtL3ByaWNlYW5kZGVtYW5kLycsYWVtb19kYXRhX2xpc3RbbGtdKSxwYXN0ZTAoJy4vZGF0YS8nLGFlbW9fZGF0YV9saXN0W2xrXSkpIA0KICAgICAgICB0cnlDYXRjaCh7DQogICAgICAgICAgICB0bXBfbWFzdGVyX2RhdGFfbGlzdCA8LSBzdXBwcmVzc1dhcm5pbmdzKHJiaW5kKHRtcF9tYXN0ZXJfZGF0YV9saXN0LGRmKSkNCiAgICAgICAgfSwgZXJyb3I9ZnVuY3Rpb24oZSl7DQogICAgICAgICAgICBwcmludChwYXN0ZTAoIkVycm9yIHByb2Nlc3MgZmlsZTogIixhZW1vX2RhdGFfbGlzdFtsa10pKQ0KICAgICAgICB9LGZpbmFsbHk9ew0KICAgICAgICAgICAgbmV4dA0KICAgICAgICB9KQ0KICAgIH0NCiAgICByZXR1cm4odG1wX21hc3Rlcl9kYXRhX2xpc3QpDQp9DQoNCiNXaGF0IGRvZXMgdGhpcyBkbz8NCiNSdW5zIHRoZSBwcm9ncmFtIGJhc2VkIG9mZiB0aGUgaW5wdXRzIGluIG1haW4NCm1haW4gPC0gZnVuY3Rpb24oYmVnaW5feXIsZW5kX3lyLG91dF9jb25zb2xpZGF0ZWRfbG9jKSB7DQogICAgDQogICAgbWFzdGVyX2RhdGFfbGlzdCA8LSBjKCkNCiAgICANCiAgICBkYXRhX2RsX2xpc3QgPC0gYnVpbGRfZGxfZmlsZV9saXN0KGJlZ2luX3lyLGVuZF95cikNCiAgICANCiAgICBtYXN0ZXJfZGF0YV9saXN0IDw8LSBwcm9jZXNzX2FlbW9fbGlua3MoZGF0YV9kbF9saXN0KQ0KICAgIA0KICAgIHNhdmVSRFMobWFzdGVyX2RhdGFfbGlzdCwiQUVNT19EYXRhX0V4dHJhY3RfQ29uc29saWRhdGVkLnJkcyIpDQogICAgDQogICAgI3RoZSBiZWxvdyB3cml0ZS5jc3YgY29kZSBpcyBmb3IgREVCVUcgb25seQ0KICAgICN3cml0ZS5jc3YobWFzdGVyX2RhdGFfbGlzdCwgZmlsZSA9ICJBRU1PX0RhdGFfRXh0cmFjdF9Db25zb2xpZGF0ZWQuY3N2Iixyb3cubmFtZXM9RkFMU0UsY29sLm5hbWVzPUZBTFNFLCBzZXA9IiwiKQ0KICAgIA0KICAgIHByaW50KCJEYXRhIHByb2Nlc3NlZCBzdWNjZXNzZnVsbHkgLSB0ZXJtaW5hdGluZyBwcm9ncmFtIikNCn0NCg0KI1doYXQgZG9lcyB0aGlzIGRvPw0KI0FyZyAxOiBZZWFyIHRvIGNvbW1lbmNlIHNjcmFwaW5nDQojQXJnIDI6IFllYXIgdG8gZW5kIHNjcmFwaW5nDQojQXJnIDM6IExvY2F0aW9uIHRvIHN0b3JlIHNjcmFwZWQgZGF0YS4NCg0KIyBSZWFkIGRhdGEgaW4gdG8gTWVtb3J5DQppZiAoZmlsZS5leGlzdHMocGFzdGUwKGdldHdkKCksICIvZGF0YS9BRU1PLyIsICJBRU1PX0RhdGFfRXh0cmFjdF9Db25zb2xpZGF0ZWQucmRzIikpKSB7DQogICAgaWYgKCFleGlzdHMoImFlbW9fQ29uc29saWRhdGVkIikpIHsNCiAgICAgICAgYXNzaWduKCJhZW1vX0NvbnNvbGlkYXRlZCIsIHJlYWRSRFMocGFzdGUwKGdldHdkKCksICIvZGF0YS9BRU1PLyIsICJBRU1PX0RhdGFfRXh0cmFjdF9Db25zb2xpZGF0ZWQucmRzIikpKQ0KICAgIH0NCn0gZWxzZSB7DQogICAgbWFpbigxOTk4LCAyMDE5LCAiLi9kYXRhIikNCiAgICBhc3NpZ24oImFlbW9fQ29uc29saWRhdGVkIiwgbWFzdGVyX2RhdGFfbGlzdCkNCiAgICBybShtYXN0ZXJfZGF0YV9saXN0KQ0KfQ0KDQpgYGANCg0KYGBge3IgR0VUIEJPTSBXZWF0aGVyIERhdGEsIGVjaG89RkFMU0UsIGV2YWw9RkFMU0UsIHJlc3VsdHM9ImhpZGUifQ0KIyBDcmVkaXQgdG8gTWljaGFlbCBHb3Jkb24gZm9yIGhlbHBpbmcgd2l0aCB0aGUgQ29kZSBpbiB0aGlzIGNodW5rLg0KIyBXQVJOSU5HOiBpZiB5b3UgZXhlY3V0ZSB0aGlzIGNvZGUgYm9tLmdvdi5hdSBzaXRlIHdpbGwgYmxvY2sgeW91ciBpcCBhZGRyZXNzLg0KDQppZiAoRkFMU0UpIHsNCiAgICANCiAgICAjIGdldHMgdGhlIHBhdGggdG8gdGhlIGJvbS5kYiBTUUxpdGUgZmlsZQ0KICAgIGdldEJPTURCUGF0aCA8LSBmdW5jdGlvbigpew0KICAgICAgcmV0dXJuKGZpbGUucGF0aChwYXRoLmV4cGFuZCgifiIpLCAiLmJvbV9jYWNoZSIsICJib20uZGIiKSkNCiAgICB9DQogICAgDQogICAgIyB0aGlzIGZ1bmN0aW9uIHdpbGwgY3JlYXRlIHRoZSAuYm9tX2NhY2hlIGRpcmVjdG9yeSBpbiB5b3UgaG9tZSBkaXJlY3RvcnkgaWYgaXQgZG9lcw0KICAgICMgbm90IGFscmVhZHkgZXhpc3QNCiAgICBlbnN1cmVCT01DYWNoZVBhdGggPC0gZnVuY3Rpb24oKXsNCiAgICAgIGNhY2hlX3BhdGggPSBmaWxlLnBhdGgocGF0aC5leHBhbmQoIn4iKSwgIi5ib21fY2FjaGUiKQ0KICAgICAgDQogICAgICBpZighZGlyLmV4aXN0cyhjYWNoZV9wYXRoKSl7DQogICAgICAgIGRpci5jcmVhdGUoY2FjaGVfcGF0aCwgcmVjdXJzaXZlID0gVFJVRSkNCiAgICAgIH0NCiAgICAgIA0KICAgICAgcmV0dXJuKGNhY2hlX3BhdGgpDQogICAgfQ0KICAgIA0KICAgICMgaW5pdGlsaXplcyB0aGUgcmVtb3RlIHNlbGVuaXVtIGRyaXZlciwgY3VycmVudGx5IGRlcGVuZGVudCBvbiBzZWxlbml1bSBzZXJ2ZXINCiAgICAjIHJ1bm5pbmcgaW5zaWRlIGEgZG9ja2VyIGNvbnRhaW5lcg0KICAgIGdldFJlbW90ZURyaXZlciA8LSBmdW5jdGlvbigpew0KICAgICAgIyBSdW4gdGhpcyB0byBzdGFydCB0aGUgc2VsZW5pdW0gc2VydmVyDQogICAgICAjIHN1ZG8gZG9ja2VyIHJ1biAtZCAtcCA0NDQ1OjQ0NDQgc2VsZW5pdW0vc3RhbmRhbG9uZS1jaHJvbWUNCiAgICAgIHJlbW90ZV9kcml2ZXIgPC0gcmVtb3RlRHJpdmVyKA0KICAgICAgICByZW1vdGVTZXJ2ZXJBZGRyID0gImxvY2FsaG9zdCIsDQogICAgICAgIHBvcnQgPSA0NDQ1TCwNCiAgICAgICAgYnJvd3Nlck5hbWUgPSAiY2hyb21lIg0KICAgICAgKQ0KICAgICAgcmV0dXJuKHJlbW90ZV9kcml2ZXIpDQogICAgfQ0KICAgIA0KICAgICMgY3JlYXRlcyBhIGNvbm5lY3Rpb24gdG8gdGhlIFNRTGl0ZSBjYWNoZSBkYXRhYmFzZQ0KICAgIGdldERCQ29ubmVjdGlvbiA8LSBmdW5jdGlvbigpew0KICAgICAgZW5zdXJlQk9NQ2FjaGVQYXRoKCkNCiAgICAgIGNvbm5lY3Rpb24gPC0gZGJDb25uZWN0KFJTUUxpdGU6OlNRTGl0ZSgpLCBnZXRCT01EQlBhdGgoKSkNCiAgICAgIHJldHVybihjb25uZWN0aW9uKQ0KICAgIH0NCiAgICANCiAgICBjb25uZWN0aW9uIDwtIGdldERCQ29ubmVjdGlvbigpDQogICAgDQogICAgZ2V0V2VhdGhlclN0YXRpb25EZXRhaWxzIDwtIGZ1bmN0aW9uKHJlbURyKXsNCiAgICAgIA0KICAgICAgIyBUaGVzZSBhcmUgdGhlIHBhZ2VzIHdoaWNoIGhhdmUgdGhlIGRldGFpbHMgb2YgdGhlIHdlYXRoZXIgc3RhdGlvbnMgZm9yIHRoZSB2YXJpb3VzIHN0YXRlcw0KICAgICAgIyB1bmZvcnR1bmF0bHkgbm90IGFsbCB0aGUgaW5mb3JtYXRpb24gZm9yIHRoZSB3ZWF0aGVyIHN0YXRpb25zIGFyZSBvbiB0aGVzZSBwYWdlcyBzbyB0aGlzDQogICAgICAjIGlzIGEgdHdvIHN0ZXAgcHJvY2Vzcywgd2UgZ2V0IHRoZSBpbml0aWFsIGluZm9ybWF0aW9uIGZyb20gdGhlc2UgcGFnZXMgcGx1cyBhIGxpbmsgdG8gYSANCiAgICAgICMgcGFnZSB3aGloYyBoYXMgdGhlIHJlc3Qgb2YgdGhlIGluZm9ybWF0aW9uIHdlIHdhbnQuDQogICAgICBwYWdlc190b19jcmF3bCA9IGMoDQogICAgICAgICJodHRwOi8vcmVnLmJvbS5nb3YuYXUvYWN0L29ic2VydmF0aW9ucy9jYW5iZXJyYS5zaHRtbCINCiAgICAgICAgLCAiaHR0cDovL3d3dy5ib20uZ292LmF1L25zdy9vYnNlcnZhdGlvbnMvbnN3YWxsLnNodG1sIg0KICAgICAgICAsICJodHRwOi8vd3d3LmJvbS5nb3YuYXUvbnQvb2JzZXJ2YXRpb25zL250YWxsLnNodG1sIg0KICAgICAgICAsICJodHRwOi8vd3d3LmJvbS5nb3YuYXUvcWxkL29ic2VydmF0aW9ucy9xbGRhbGwuc2h0bWwiDQogICAgICAgICwgImh0dHA6Ly93d3cuYm9tLmdvdi5hdS9zYS9vYnNlcnZhdGlvbnMvc2FhbGwuc2h0bWwiDQogICAgICAgICwgImh0dHA6Ly93d3cuYm9tLmdvdi5hdS90YXMvb2JzZXJ2YXRpb25zL3Rhc2FsbC5zaHRtbCINCiAgICAgICAgLCAiaHR0cDovL3d3dy5ib20uZ292LmF1L3ZpYy9vYnNlcnZhdGlvbnMvdmljYWxsLnNodG1sIg0KICAgICAgICAsICJodHRwOi8vd3d3LmJvbS5nb3YuYXUvd2Evb2JzZXJ2YXRpb25zL3dhYWxsLnNodG1sIg0KICAgICAgKQ0KICAgICAgDQogICAgICBuYW1lcyhwYWdlc190b19jcmF3bCkgPSBjKA0KICAgICAgICAiQUNUIg0KICAgICAgICAsICJOU1ciDQogICAgICAgICwgIk5UIg0KICAgICAgICAsICJRTEQiDQogICAgICAgICwgIlNBIg0KICAgICAgICAsICJUQVMiDQogICAgICAgICwgIlZJQyINCiAgICAgICAgLCAiV0EiDQogICAgICApDQogICAgICANCiAgICAgIGlkbl9wYXR0ZXJuID0gIihbQS1aXXszfVswLTldezV9XFwuWzAtOV17NX0pIg0KICAgICAgDQogICAgICANCiAgICAgIHN0YXRlX2NvbCA8LSBjKCkNCiAgICAgIGlkbl9jb2wgPC0gYygpDQogICAgICBuYW1lX2NvbCA8LSBjKCkNCiAgICAgIGlkX2NvbCA8LSBjKCkNCiAgICAgIGxhdF9jb2wgPC0gYygpDQogICAgICBsb25fY29sIDwtIGMoKQ0KICAgICAgaGVpZ2h0X2NvbCA8LSBjKCkNCiAgICAgIHVybF9jb2wgPC0gYygpDQogICAgICANCiAgICAgIA0KICAgICAgY291bnRlciA9IDENCiAgICAgIA0KICAgICAgIyBpbiB0aGlzIGxvb3Agd2UgZ2V0IHRoZSBpbml0aWFsIGluZm9ybWF0aW9uIHBsdXMgbGluayB0byBvdGhlciBwYWdlIHdpdGggbW9yZSBpbmZvcm1hdGlvbg0KICAgICAgZm9yKHN0YXRlX25hbWUgaW4gbmFtZXMocGFnZXNfdG9fY3Jhd2wpKXsNCiAgICAgICAgDQogICAgICAgIHJlbURyJG5hdmlnYXRlKHBhZ2VzX3RvX2NyYXdsW3N0YXRlX25hbWVdKQ0KICAgICAgICBhbmNob3JzIDwtIHJlbURyJGZpbmRFbGVtZW50cyh1c2luZyA9ICdjc3Mgc2VsZWN0b3InLCAidGgucm93bGVmdGNvbHVtbiBhIikNCiAgICAgICAgDQogICAgICAgIGZvcihhIGluIGFuY2hvcnMpew0KICAgICAgICAgIA0KICAgICAgICAgICMgZ2V0IHRoZSB1cmwgdG8gdGhlIG90aGVyIHBhZ2UNCiAgICAgICAgICB1cmwgPC0gYSRnZXRFbGVtZW50QXR0cmlidXRlKCdocmVmJylbWzFdXQ0KICAgICAgICAgIHVybF9jb2xbY291bnRlcl0gPC0gdXJsDQogICAgICAgICAgDQogICAgICAgICAgIyBnZXQgdGhlIElETiBudW1iZXIgb2YgdGhlIHN0YXRpb24NCiAgICAgICAgICBpZG4gPC0gc3RyX2V4dHJhY3QodXJsLCBpZG5fcGF0dGVybikNCiAgICAgICAgICBpZG4gPC0gc3Ryc3BsaXQoaWRuLCAnXFwuJylbWzFdXVsxXQ0KICAgICAgICAgIA0KICAgICAgICAgICMgZ2V0IHRoZSBuYW1lIG9mIHRoZSBzdGF0aW9uDQogICAgICAgICAgbmFtZSA8LSBhJGdldEVsZW1lbnRUZXh0KClbWzFdXQ0KICAgICAgICAgIA0KICAgICAgICAgICMgcmVjb3JkIHRob3NlIHZhbHVlcyBpbiBsaXN0cyB0byBiZSBjb252ZXJ0ZWQgdG8gZGF0YWZyYW1lIGxhdGVyDQogICAgICAgICAgc3RhdGVfY29sW2NvdW50ZXJdIDwtIHN0YXRlX25hbWUNCiAgICAgICAgICBpZG5fY29sW2NvdW50ZXJdIDwtIGlkbg0KICAgICAgICAgIG5hbWVfY29sW2NvdW50ZXJdIDwtIG5hbWUNCiAgICAgICAgICANCiAgICAgICAgICBjb3VudGVyIDwtIGNvdW50ZXIgKyAxIA0KICAgICAgICB9DQogICAgICAgIA0KICAgICAgfQ0KICAgICAgDQogICAgICBjb3VudGVyID0gMQ0KICAgICAgDQogICAgICAjIGluIHRoaXMgbG9vcCB3ZSBuYXZpZ2F0IHRvIHRoZSBvdGhlciB1cmwgd2Ugb2J0YWluZWQgZnJvbSB0aGUgZmlyc3QgcGFnZQ0KICAgICAgZm9yKHVybCBpbiB1cmxfY29sKXsNCiAgICAgICAgDQogICAgICAgIHJlbURyJG5hdmlnYXRlKHVybCkNCiAgICAgICAgc3RhdGlvbl90YWJsZSA9IHJlbURyJGZpbmRFbGVtZW50cyh1c2luZyA9ICJjc3Mgc2VsZWN0b3IiLCAiLnN0YXRpb25kZXRhaWxzIHRkIikNCiAgICAgICAgDQogICAgICAgICMgZ2V0IHRoZSBzdGF0aW9uIGlkDQogICAgICAgIHN0YXRpb25faWQgPC0gc3RhdGlvbl90YWJsZVtbMl1dJGdldEVsZW1lbnRUZXh0KCkNCiAgICAgICAgc3RhdGlvbl9pZCA8LSBzdHJfcmVtb3ZlKHN0YXRpb25faWQsICIuezR9IikNCiAgICAgICAgaWRfY29sW2NvdW50ZXJdIDwtIHN0YXRpb25faWQNCiAgICAgICAgDQogICAgICAgICMgZ2V0IHRoZSBsb2NhdGlvbiBsYXRpdHVkZSB2YWx1ZQ0KICAgICAgICBzdGF0aW9uX2xhdCA8LSBzdGF0aW9uX3RhYmxlW1s0XV0kZ2V0RWxlbWVudFRleHQoKQ0KICAgICAgICBzdGF0aW9uX2xhdCA8LSBzdHJfcmVtb3ZlKHN0YXRpb25fbGF0LCAiLns1fSIpDQogICAgICAgIGxhdF9jb2xbY291bnRlcl0gPC0gc3RhdGlvbl9sYXQNCiAgICAgICAgDQogICAgICAgICMgZ2V0IHRoZSBsb2NhdGlvbiBsb25naXR1ZGUgdmFsdWUNCiAgICAgICAgc3RhdGlvbl9sb24gPC0gc3RhdGlvbl90YWJsZVtbNV1dJGdldEVsZW1lbnRUZXh0KCkNCiAgICAgICAgc3RhdGlvbl9sb24gPC0gc3RyX3JlbW92ZShzdGF0aW9uX2xvbiwgIi57NX0iKQ0KICAgICAgICBsb25fY29sW2NvdW50ZXJdIDwtIHN0YXRpb25fbG9uDQogICAgICAgIA0KICAgICAgICAjIGdldCB0aGUgZWxldmF0aW9uIG9mIHRoZSBzdGF0aW9uDQogICAgICAgIHN0YXRpb25faGVpZ2h0IDwtIHN0YXRpb25fdGFibGVbWzZdXSRnZXRFbGVtZW50VGV4dCgpDQogICAgICAgIHN0YXRpb25faGVpZ2h0IDwtIHN0cl9yZW1vdmUoc3RhdGlvbl9oZWlnaHQsICIuezh9IikNCiAgICAgICAgaGVpZ2h0X2NvbFtjb3VudGVyXSA8LSBzdGF0aW9uX2hlaWdodA0KICAgICAgICANCiAgICAgICAgY291bnRlciA8LSBjb3VudGVyICsgMSANCiAgICAgIH0NCiAgICAgIA0KICAgICAgd2VhdGhlcl9zdGF0aW9ucyA8LSBkYXRhLmZyYW1lKA0KICAgICAgICBpZG4gPSBpZG5fY29sDQogICAgICAgICwgbmFtZSA9IG5hbWVfY29sDQogICAgICAgICwgc3RhdGUgPSBzdGF0ZV9jb2wNCiAgICAgICAgLCBzdGF0aW9uX2lkID0gaWRfY29sDQogICAgICAgICwgbGF0ID0gbGF0X2NvbA0KICAgICAgICAsIGxvbiA9IGxvbl9jb2wNCiAgICAgICAgLCBlbGV2YXRpb24gPSBoZWlnaHRfY29sDQogICAgICApDQogICAgICANCiAgICAgIGRiV3JpdGVUYWJsZShjb25uZWN0aW9uLCAid2VhdGhlcl9zdGF0aW9ucyIsIHdlYXRoZXJfc3RhdGlvbnMsIG92ZXJ3cml0ZSA9IFRSVUUpDQogICAgfQ0KICAgIA0KICAgIGVycm9ycyA9IGxpc3Qoc3RhdGlvbl9pZCA9IGxpc3QoKSwgbmNjID0gbGlzdCgpLCBlcnJvciA9IGxpc3QoKSkNCiAgICANCiAgICBnZXRXZWF0aGVyU3RhdGlvbkRhdGEgPC0gZnVuY3Rpb24oZGF0YV91cmxfdGVtcGxhdGUsIG5jYywgc3RhdGlvbl9pZCl7DQogICAgICANCiAgICAgIHVybCA9IHNwcmludGYoZGF0YV91cmxfdGVtcGxhdGUsIG5jYywgc3RhdGlvbl9pZCkNCiAgICAgIA0KICAgICAgIyBuZWVkIHRvIHBsYWNlIGVycm9yIGhhbmRsaW5nIGhlcmUgYmVjYXVzZSBzb21lIHdlYXRoZXIgc3RhdGlvbnMgYXJlIG1pc3NpbmcgdGhpcyBkYXRhDQogICAgICAjIHRoaXMgY2F1c2VzIHRoZSBwcm9jZXNzIHRvIGNyYXNoIGJlY2F1c2UgaXQgY2Fubm90IGxvY2F0ZSB0aGUgemlwX2xpbmtfc2VsZWN0b3INCiAgICAgIGRmIDwtIHRyeUNhdGNoKHsNCiAgICAgICAgDQogICAgICAgICMgdGhpcyBpcyBhIGNzcyBhdHRyaWJ1dGUgc2VsZWN0b3IgZXhwcmVzc2lvbiwgaXQgYmFzaWNhbGx5IG1lYW5zIGZpbmQgYW4gYW5jaG9yIHRhZyB3aXRoaW4gYW4gDQogICAgICAgICMgdW5vcmRlcmVkIGxpc3Qgd2l0aCB0aGUgY2xhc3MgJ2Rvd25sb2FkJyB3aGVyZSAgdGhlIGhyZWYgKGkuZS4gdXJsKSBjb250YWlucyAnZGFpbHlaaXBwZWREYXRhRmlsZScNCiAgICAgICAgemlwX2xpbmtfc2VsZWN0b3IgPSAidWwuZG93bmxvYWRzIGFbaHJlZio9J2RhaWx5WmlwcGVkRGF0YUZpbGUnXSINCiAgICAgICAgDQogICAgICAgIGRyaXZlciRuYXZpZ2F0ZSh1cmwpDQogICAgICAgIA0KICAgICAgICAjIG9idGFpbmluZyB0aGUgZG93bmxvYWQgbGluayBmb3IgdGhlIHppcCBmaWxlIGNvbnRhaW5pbmcgdGhlIGRhdGEgd2UgYXJlIGludGVyZXN0ZWQgaW4uDQogICAgICAgIHppcF9saW5rID0gZHJpdmVyJGZpbmRFbGVtZW50KCJjc3Mgc2VsZWN0b3IiLCB6aXBfbGlua19zZWxlY3RvcikNCiAgICAgICAgZG93bmxvYWRfdXJsID0gemlwX2xpbmskZ2V0RWxlbWVudEF0dHJpYnV0ZSgnaHJlZicpW1sxXV0NCiAgICAgICAgDQogICAgICAgICMgZG93bmxvYWQgdGhlIHppcCBmaWxlIHRvIHRoZSAuYm9tX2NhY2hlIGRpcmVjdG9yeS4NCiAgICAgICAgemlwX2Rlc3RpbmF0aW9uIDwtIHNwcmludGYoIiVzLyVzXyVzLnppcCIsIGVuc3VyZUJPTUNhY2hlUGF0aCgpLCBzdGF0aW9uX2lkLCBuY2MpDQogICAgICAgIGRvd25sb2FkLmZpbGUoZG93bmxvYWRfdXJsLCBkZXN0ZmlsZSA9IHppcF9kZXN0aW5hdGlvbiwgbWV0aG9kID0gIndnZXQiKQ0KICAgICAgICANCiAgICAgICAgIyB1bnppcCB0aGUgZG93bmxhb2RlZCB6aXAgZmlsZSBpbnRvIGEgbmV3IGRpcmVjdG9yeSB3aXRoaW4gdGhlIC5ib21fY2FjaGUgZGlyZWN0b3J5Lg0KICAgICAgICBkZXN0aW5hdGlvbl9kaXJlY3RvcnkgPC0gc3ByaW50ZigiJXMvJXNfJXMiLCBlbnN1cmVCT01DYWNoZVBhdGgoKSwgc3RhdGlvbl9pZCwgbmNjKQ0KICAgICAgICB1bnppcCh6aXBfZGVzdGluYXRpb24sIGV4ZGlyID0gZGVzdGluYXRpb25fZGlyZWN0b3J5KQ0KICAgICAgICANCiAgICAgICAgIyBmaW5kIGFuZCBsb2FkIHRoZSAuY3N2IGZpbGUgd2l0aGluIHRoZSBuZXcgZGlyZWN0b3J5DQogICAgICAgIGZpbGVfbGlzdCA8LSBsaXN0LmZpbGVzKHBhdGggPSBkZXN0aW5hdGlvbl9kaXJlY3RvcnkpDQogICAgICAgIGRhdGFfZmlsZSA8LSBmaWxlX2xpc3RbZ3JlcGwoJy4qXFwuY3N2JywgZmlsZV9saXN0KV0NCiAgICAgICAgZGYgPC0gcmVhZF9jc3YoZmlsZS5wYXRoKGRlc3RpbmF0aW9uX2RpcmVjdG9yeSwgZGF0YV9maWxlKSkNCiAgICAgICAgDQogICAgICAgICMgY2xlYW4gdXAgZG93bmxvYWRlZCBhbmQgZXh0cmFjdGVkIGZpbGVzIHdlIG5vIGxvbmdlciByZXF1aXJlIHRoZW0uDQogICAgICAgIGZvcihmaWxlX25hbWUgaW4gZmlsZV9saXN0KXsNCiAgICAgICAgICBmaWxlLnJlbW92ZShmaWxlLnBhdGgoZGVzdGluYXRpb25fZGlyZWN0b3J5LCBmaWxlX25hbWUpKQ0KICAgICAgICB9DQogICAgICAgIGZpbGUucmVtb3ZlKGRlc3RpbmF0aW9uX2RpcmVjdG9yeSkNCiAgICAgICAgZmlsZS5yZW1vdmUoemlwX2Rlc3RpbmF0aW9uKQ0KICAgICAgICANCiAgICAgICAgIyByZW5hbWUgdGhlIGNvbHVtbnMgaW4gdGhlIGRhdGFmcmFtZSBkZXBlbmRpbmcgb24gdGhlIG5jYyBpZA0KICAgICAgICBpZihuY2MgPT0gMTIyKXsNCiAgICAgICAgICAjIE9yaWdpbmFsIGNvbHVtbiBuYW1lczoNCiAgICAgICAgICAjIFByb2R1Y3QgY29kZSxCdXJlYXUgb2YgTWV0ZW9yb2xvZ3kgc3RhdGlvbiBudW1iZXIsWWVhcixNb250aCxEYXksTWF4aW11bSB0ZW1wZXJhdHVyZSAoRGVncmVlIEMpLERheXMgb2YgYWNjdW11bGF0aW9uIG9mIG1heGltdW0gdGVtcGVyYXR1cmUsUXVhbGl0eQ0KICAgICAgICAgIG5hbWVzKGRmKSA8LSBjKA0KICAgICAgICAgICAgInByb2R1Y3RfY29kZSINCiAgICAgICAgICAgICwgInN0YXRpb25faWQiDQogICAgICAgICAgICAsICJ5ZWFyIg0KICAgICAgICAgICAgLCAibW9udGgiDQogICAgICAgICAgICAsICJkYXkiDQogICAgICAgICAgICAsICJtYXhfdGVtcCINCiAgICAgICAgICAgICwgImRheXNfb2ZfYWNjdW11bGF0aW9uIg0KICAgICAgICAgICAgLCAicXVhbGl0eSINCiAgICAgICAgICApDQogICAgICAgIH0gZWxzZSBpZiAobmNjID09IDEyMyl7DQogICAgICAgICAgIyBPcmlnaW5hbCBjb2x1bW4gbmFtZXM6DQogICAgICAgICAgIyBQcm9kdWN0IGNvZGUsQnVyZWF1IG9mIE1ldGVvcm9sb2d5IHN0YXRpb24gbnVtYmVyLFllYXIsTW9udGgsRGF5LE1pbmltdW0gdGVtcGVyYXR1cmUgKERlZ3JlZSBDKSxEYXlzIG9mIGFjY3VtdWxhdGlvbiBvZiBtaW5pbXVtIHRlbXBlcmF0dXJlLFF1YWxpdHkNCiAgICAgICAgICBuYW1lcyhkZikgPC0gYygNCiAgICAgICAgICAgICJwcm9kdWN0X2NvZGUiDQogICAgICAgICAgICAsICJzdGF0aW9uX2lkIg0KICAgICAgICAgICAgLCAieWVhciINCiAgICAgICAgICAgICwgIm1vbnRoIg0KICAgICAgICAgICAgLCAiZGF5Ig0KICAgICAgICAgICAgLCAibWluX3RlbXAiDQogICAgICAgICAgICAsICJkYXlzX29mX2FjY3VtdWxhdGlvbiINCiAgICAgICAgICAgICwgInF1YWxpdHkiDQogICAgICAgICAgKQ0KICAgICAgICB9ZWxzZSBpZihuY2MgPT0gMTM2KXsNCiAgICAgICAgICAjIE9yaWdpbmFsIGNvbHVtbiBuYW1lczoNCiAgICAgICAgICAjIFByb2R1Y3QgY29kZSxCdXJlYXUgb2YgTWV0ZW9yb2xvZ3kgc3RhdGlvbiBudW1iZXIsWWVhcixNb250aCxEYXksUmFpbmZhbGwgYW1vdW50IChtaWxsaW1ldHJlcyksUGVyaW9kIG92ZXIgd2hpY2ggcmFpbmZhbGwgd2FzIG1lYXN1cmVkIChkYXlzKSxRdWFsaXR5DQogICAgICAgICAgbmFtZXMoZGYpIDwtIGMoDQogICAgICAgICAgICAicHJvZHVjdF9jb2RlIg0KICAgICAgICAgICAgLCAic3RhdGlvbl9pZCINCiAgICAgICAgICAgICwgInllYXIiDQogICAgICAgICAgICAsICJtb250aCINCiAgICAgICAgICAgICwgImRheSINCiAgICAgICAgICAgICwgInJhaW5mYWxsX21pbGxpbWV0cmVzIg0KICAgICAgICAgICAgLCAiZGF5c19vZl9hY2N1bXVsYXRpb24iDQogICAgICAgICAgICAsICJxdWFsaXR5Ig0KICAgICAgICAgICkNCiAgICAgICAgfWVsc2UgaWYobmNjID09IDE5Myl7DQogICAgICAgICAgIyBPcmlnaW5hbCBjb2x1bW4gbmFtZXM6DQogICAgICAgICAgIyBQcm9kdWN0IGNvZGUsQnVyZWF1IG9mIE1ldGVvcm9sb2d5IHN0YXRpb24gbnVtYmVyLFllYXIsTW9udGgsRGF5LERhaWx5IGdsb2JhbCBzb2xhciBleHBvc3VyZSAoTUovbSptKQ0KICAgICAgICAgIG5hbWVzKGRmKSA8LSBjKA0KICAgICAgICAgICAgInByb2R1Y3RfY29kZSINCiAgICAgICAgICAgICwgInN0YXRpb25faWQiDQogICAgICAgICAgICAsICJ5ZWFyIg0KICAgICAgICAgICAgLCAibW9udGgiDQogICAgICAgICAgICAsICJkYXkiDQogICAgICAgICAgICAsICJnbG9iYWxfc29sYXJfZXhwb3N1cmUiDQogICAgICAgICAgKQ0KICAgICAgICB9DQogICAgICAgIHJldHVybihkZikgIA0KICAgICAgICANCiAgICAgIH0sIGVycm9yID0gZnVuY3Rpb24oZXJyKXsNCiAgICAgICAgDQogICAgICAgICMgcmVjb3JkIHRoZSBlcnJvcnMgc28gd2UgY2FuIGxvb2sgYXQgdGhlbSBsYXRlci4NCiAgICAgICAgbmV3X2luZGV4ID0gbGVuZ3RoKGVycm9ycyRlcnJvcikrMQ0KICAgICAgICBlcnJvcnMkc3RhdGlvbl9pZFtuZXdfaW5kZXhdIDwtIHN0YXRpb25faWQNCiAgICAgICAgZXJyb3JzJG5jY1tuZXdfaW5kZXhdIDwtIG5jYw0KICAgICAgICBlcnJvcnMkZXJyb3JbbmV3X2luZGV4XSA8LSBlcnINCiAgICAgICAgDQogICAgICB9KQ0KICAgICAgDQogICAgICByZXR1cm4oZGYpDQogICAgfQ0KICAgIA0KICAgIGdldEhpc3RvcmljYWxXZWF0aGVyRGF0YSA8LSBmdW5jdGlvbihkcml2ZXIpew0KICAgICAgDQogICAgICB3ZWF0aGVyX3N0YXRpb24gPC0gZGF0YS5mcmFtZShkYlJlYWRUYWJsZShjb25uZWN0aW9uLCAid2VhdGhlcl9zdGF0aW9ucyIpKQ0KICAgICAgDQogICAgICBzdGF0aW9uX2lkcyA8LSBhcy52ZWN0b3Iod2VhdGhlcl9zdGF0aW9uJHN0YXRpb25faWQpDQogICAgICAjc3RhdGlvbl9pZHMgPC0gaGVhZChzdGF0aW9uX2lkcywgMikgIyBsaW1pdCB0aGUgbnVtYmVyIG9mIHdlYXRoZXIgc3RhdGlvbnMgZm9yIHRlc3RpbmcgcHVycG9zZXMNCiAgICAgIA0KICAgICAgIyBUaGlzIGlzIHRoZSBmb3JtYXQgb2YgdGhlIHVybCB0byBhIHBhZ2Ugd2hpY2ggaGFzIGEgbGluayB0byB0aGUgemlwIGZpbGUgd2Ugd2FudCB0byBkb3dubG9hZA0KICAgICAgZGF0YV91cmxfdGVtcGxhdGUgPC0gImh0dHA6Ly93d3cuYm9tLmdvdi5hdS9qc3AvbmNjL2NkaW8vd2VhdGhlckRhdGEvYXY/cF9uY2NPYnNDb2RlPSVzJnBfZGlzcGxheV90eXBlPWRhaWx5RGF0YUZpbGUmcF9zdGFydFllYXI9JnBfYz0mcF9zdG5fbnVtPSVzIg0KICAgICAgDQogICAgICBtaW5fdGVtcF9uY2MgPC0gMTIzDQogICAgICBtYXhfdGVtX25jYyA8LSAxMjINCiAgICAgIHJpbmZhbGxfbmNjIDwtIDEzNg0KICAgICAgc29sYXJfZXhwb3N1cmUgPC0gMTkzDQogICAgICANCiAgICAgIGZvcihzdGF0aW9uX2lkIGluIHN0YXRpb25faWRzKXsNCiAgICAgICAgDQogICAgICAgICMgVGhzaSBmb3IgbG9vcCBjb2xkIGJlIHJlZmFjdG9yZWQgZnVydGhlciBidXQgc2luY2UgdGhpcyBpcyBhIHJ1biBvbmNlIHRhc2sgaXRzIG5vdCByZWFsbHkgd29ydGggaXQuDQogICAgICAgIHByaW50KHBhc3RlKCJjb2xsZWN0aW5nIG1pbiB0ZW1wIGRhdGEgZm9yIHdlYXRoZXIgc3RhdGlvbiIsIHN0YXRpb25faWQpKQ0KICAgICAgICBtaW5fdGVtcF9kZiA8LSBnZXRXZWF0aGVyU3RhdGlvbkRhdGEoZGF0YV91cmxfdGVtcGxhdGUsIG1pbl90ZW1wX25jYywgc3RhdGlvbl9pZCkNCiAgICAgICAgaWYoaXMuZGF0YS5mcmFtZShtaW5fdGVtcF9kZikpew0KICAgICAgICAgIHByaW50KHBhc3RlKCJ3cml0aW5nIG1pbiB0ZW1wIGRhdGEgZm9yIHdlYXRoZXIgc3RhdGlvbiIsIHN0YXRpb25faWQpKQ0KICAgICAgICAgIGRiV3JpdGVUYWJsZShjb25uZWN0aW9uLCAiZGFpbHlfbWluaW11bV90ZW1wZXJhdHVyZSIsIG1pbl90ZW1wX2RmLCBhcHBlbmQgPSBUUlVFKQ0KICAgICAgICB9ZWxzZXsNCiAgICAgICAgICBwcmludCgnYW4gZXJyb3Igb2NjdXJlZCwgY2hlY2sgZXJyb3JzIGxvZy4nKQ0KICAgICAgICB9DQogICAgICAgIA0KICAgICAgICANCiAgICAgICAgcHJpbnQocGFzdGUoImNvbGxlY3RpbmcgbWF4IHRlbXAgZGF0YSBmb3Igd2VhdGhlciBzdGF0aW9uIiwgc3RhdGlvbl9pZCkpDQogICAgICAgIG1heF90ZW1wX2RmIDwtIGdldFdlYXRoZXJTdGF0aW9uRGF0YShkYXRhX3VybF90ZW1wbGF0ZSwgbWF4X3RlbV9uY2MsIHN0YXRpb25faWQpDQogICAgICAgIGlmKGlzLmRhdGEuZnJhbWUobWF4X3RlbXBfZGYpKXsNCiAgICAgICAgICBwcmludChwYXN0ZSgid3JpdGluZyBtYXggdGVtcCBkYXRhIGZvciB3ZWF0aGVyIHN0YXRpb24iLCBzdGF0aW9uX2lkKSkNCiAgICAgICAgICBkYldyaXRlVGFibGUoY29ubmVjdGlvbiwgImRhaWx5X21heGltdW1fdGVtcGVyYXR1cmUiLCBtYXhfdGVtcF9kZiwgYXBwZW5kID0gVFJVRSkNCiAgICAgICAgfWVsc2V7DQogICAgICAgICAgcHJpbnQoJ2FuIGVycm9yIG9jY3VyZWQsIGNoZWNrIGVycm9ycyBsb2cuJykNCiAgICAgICAgfQ0KICAgICAgICANCiAgICAgICAgDQogICAgICAgIHByaW50KHBhc3RlKCJjb2xsZWN0aW5nIHJhaW5mYWxsIGRhdGEgZm9yIHdlYXRoZXIgc3RhdGlvbiIsIHN0YXRpb25faWQpKQ0KICAgICAgICByYWluZmFsbF9kZiA8LSBnZXRXZWF0aGVyU3RhdGlvbkRhdGEoZGF0YV91cmxfdGVtcGxhdGUsIHJpbmZhbGxfbmNjLCBzdGF0aW9uX2lkKQ0KICAgICAgICBpZihpcy5kYXRhLmZyYW1lKHJhaW5mYWxsX2RmKSl7DQogICAgICAgICAgcHJpbnQocGFzdGUoIndyaXRpbmcgcmFpbmZhbGwgZGF0YSBmb3Igd2VhdGhlciBzdGF0aW9uIiwgc3RhdGlvbl9pZCkpDQogICAgICAgICAgZGJXcml0ZVRhYmxlKGNvbm5lY3Rpb24sICJkYWlseV9yYWluZmFsbCIsIHJhaW5mYWxsX2RmLCBhcHBlbmQgPSBUUlVFKQ0KICAgICAgICB9ZWxzZXsNCiAgICAgICAgICBwcmludCgnYW4gZXJyb3Igb2NjdXJlZCwgY2hlY2sgZXJyb3JzIGxvZy4nKQ0KICAgICAgICB9DQogICAgICAgIA0KICAgICAgICBwcmludChwYXN0ZSgiY29sbGVjdGluZyBzb2xhciBleHBvc3VyZSBkYXRhIGZvciB3ZWF0aGVyIHN0YXRpb24iLCBzdGF0aW9uX2lkKSkNCiAgICAgICAgc29sYXJfZGYgPC0gZ2V0V2VhdGhlclN0YXRpb25EYXRhKGRhdGFfdXJsX3RlbXBsYXRlLCBzb2xhcl9leHBvc3VyZSwgc3RhdGlvbl9pZCkNCiAgICAgICAgaWYoaXMuZGF0YS5mcmFtZShzb2xhcl9kZikpew0KICAgICAgICAgIHByaW50KHBhc3RlKCJ3cml0aW5nIHNvbGFyIGV4cG9zdXJlIGRhdGEgZm9yIHdlYXRoZXIgc3RhdGlvbiIsIHN0YXRpb25faWQpKQ0KICAgICAgICAgIGRiV3JpdGVUYWJsZShjb25uZWN0aW9uLCAiZGFpbHlfc29sYXJfZXhwb3N1cmUiLCBzb2xhcl9kZiwgYXBwZW5kID0gVFJVRSkNCiAgICAgICAgfWVsc2V7DQogICAgICAgICAgcHJpbnQoJ2FuIGVycm9yIG9jY3VyZWQsIGNoZWNrIGVycm9ycyBsb2cuJykNCiAgICAgICAgfQ0KICAgICAgICANCiAgICAgIH0NCiAgICAgIA0KICAgIH0NCiAgICANCiAgICBjb252ZXJ0Qm9tREJUb1JEUyA8LSBmdW5jdGlvbigpew0KICAgICAgDQogICAgICBib21fd2VhdGhlcl9zdGF0aW9uc19kZiA8LSBkYlJlYWRUYWJsZShjb25uZWN0aW9uLCAid2VhdGhlcl9zdGF0aW9ucyIpDQogICAgICBib21fZGFpbHlfbWluaW11bV90ZW1wZXJhdHVyZV9kZiA8LSBkYlJlYWRUYWJsZShjb25uZWN0aW9uLCAiZGFpbHlfbWluaW11bV90ZW1wZXJhdHVyZSIpDQogICAgICBib21fZGFpbHlfbWF4aW11bV90ZW1wZXJhdHVyZV9kZiA8LSBkYlJlYWRUYWJsZShjb25uZWN0aW9uLCAiZGFpbHlfbWF4aW11bV90ZW1wZXJhdHVyZSIpDQogICAgICBib21fZGFpbHlfcmFpbmZhbGxfZGYgPC0gZGJSZWFkVGFibGUoY29ubmVjdGlvbiwgImRhaWx5X3JhaW5mYWxsIikNCiAgICAgIGJvbV9kYWlseV9zb2xhcl9leHBvc3VyZV9kZiA8LSBkYlJlYWRUYWJsZShjb25uZWN0aW9uLCAiZGFpbHlfc29sYXJfZXhwb3N1cmUiKQ0KICAgICAgDQogICAgICBzYXZlUkRTKGJvbV93ZWF0aGVyX3N0YXRpb25zX2RmLCBmaWxlID0gZmlsZS5wYXRoKGVuc3VyZUJPTUNhY2hlUGF0aCgpLCAid2VhdGhlcl9zdGF0aW9ucy5yZHMiKSkNCiAgICAgIHNhdmVSRFMoYm9tX2RhaWx5X21pbmltdW1fdGVtcGVyYXR1cmVfZGYsIGZpbGUgPSBmaWxlLnBhdGgoZW5zdXJlQk9NQ2FjaGVQYXRoKCksICJkYWlseV9taW5pbXVtX3RlbXBlcmF0dXJlLnJkcyIpKQ0KICAgICAgc2F2ZVJEUyhib21fZGFpbHlfbWF4aW11bV90ZW1wZXJhdHVyZV9kZiwgZmlsZSA9IGZpbGUucGF0aChlbnN1cmVCT01DYWNoZVBhdGgoKSwgImRhaWx5X21heGltdW1fdGVtcGVyYXR1cmUucmRzIikpDQogICAgICBzYXZlUkRTKGJvbV9kYWlseV9yYWluZmFsbF9kZiwgZmlsZSA9IGZpbGUucGF0aChlbnN1cmVCT01DYWNoZVBhdGgoKSwgImRhaWx5X3JhaW5mYWxsLnJkcyIpKQ0KICAgICAgc2F2ZVJEUyhib21fZGFpbHlfc29sYXJfZXhwb3N1cmVfZGYsIGZpbGUgPSBmaWxlLnBhdGgoZW5zdXJlQk9NQ2FjaGVQYXRoKCksICJkYWlseV9zb2xhcl9leHBvc3VyZS5yZHMiKSkNCiAgICAgIA0KICAgIH0NCiAgICANCiAgICBJbXBvcnRGaWxlcyA8LSBsaXN0LmZpbGVzKHBhc3RlMChnZXR3ZCgpLCAiL2RhdGEvQk9NLyIpLCBwYXR0ZXJuPSIqLnJkcyIpDQogICAgaWYgKGxlbmd0aChJbXBvcnRGaWxlcykgPiAwKSB7DQogICAgICAgIGZvciAoZmlsZSBpbiBJbXBvcnRGaWxlcykgew0KICAgICAgICAgICAgaWYgKCFzdHJfZGV0ZWN0KGZpbGUsICJfdjIiKSkgew0KICAgICAgICAgICAgICAgIGlmICghZXhpc3RzKHBhc3RlMCgiYm9tXyIsc3RyX3JlcGxhY2UoZmlsZSwiLnJkcyIsIiIpKSkpIHsNCiAgICAgICAgICAgICAgICAgICAgYXNzaWduKHBhc3RlMCgiYm9tXyIsc3RyX3JlcGxhY2UoZmlsZSwiLnJkcyIsIiIpKSwgcmVhZFJEUyhwYXN0ZTAoZ2V0d2QoKSwgIi9kYXRhL0JPTS8iLCBmaWxlKSkpDQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfSBlbHNlIHsNCiAgICAgICAgcHJpbnQoInN0b3AiKQ0KICAgICAgICAjT3Blbg0KICAgICAgICBkcml2ZXIgPC0gZ2V0UmVtb3RlRHJpdmVyKCkNCiAgICAgICAgZHJpdmVyJG9wZW4oKQ0KICAgIA0KICAgICAgICAjR2V0DQogICAgICAgIGdldFdlYXRoZXJTdGF0aW9uRGV0YWlscyhkcml2ZXIpDQogICAgICAgIGdldEhpc3RvcmljYWxXZWF0aGVyRGF0YShkcml2ZXIpDQogICAgDQogICAgICAgICNXcml0ZQ0KICAgICAgICBjb252ZXJ0Qm9tREJUb1JEUygpDQogICAgDQogICAgICAgICNDbG9zZQ0KICAgICAgICBkcml2ZXIkY2xvc2UoKQ0KICAgICAgICBybShkcml2ZXIpDQogICAgfQ0KICAgIA0KICAgICMgQ2xlYW4gVXANCiAgICBybShJbXBvcnRGaWxlcywgZmlsZSwgY29ubmVjdGlvbiwgZXJyb3JzKQ0KDQp9DQpgYGANCg0KYGBge3IgR0VUIEJPTSBTb2xhciBGYXJtIERhdGEsIGVjaG89RkFMU0UsIGV2YWw9RkFMU0UsIHJlc3VsdHM9ImhpZGUifQ0KIyBDcmVkaXQgdG8gTWljaGFlbCBHb3Jkb24gZm9yIGhlbHBpbmcgd2l0aCB0aGUgQ29kZSBpbiB0aGlzIGNodW5rLg0KDQppZiAoRkFMU0UpIHsNCg0KICAgIGlmIChleGlzdHMoImJvbV9zb2xhcl9mYXJtcyIpKSB7DQogICAgICAgICMgRG8gbm90aGluZy4uLg0KICAgIH0gZWxzZSB7IA0KICAgICAgICBpZiAoZmlsZS5leGlzdHMocGFzdGUwKGdldHdkKCksIi9kYXRhL0JPTS8iLCJzb2xhcl9mYXJtcyIsIi5yZHMiKSkpIHsNCiAgICAgICAgICAgIGFzc2lnbigiYm9tX3NvbGFyX2Zhcm1zIiwgcmVhZFJEUyhwYXN0ZTAoZ2V0d2QoKSwiL2RhdGEvQk9NLyIsInNvbGFyX2Zhcm1zIiwiLnJkcyIpKSkNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICBBUElfS0VZID0gIjx5b3VyIGdvb2dsZSBtYXBzIGFwaSBrZXkgZ29lcyBoZXJlPiINCiAgICAgICAgICAgIA0KICAgICAgICAgICAgbG9jYXRpb25fcXVlcnlfY2FjaGUgPC0gZGljdCgpDQogICAgICAgICAgICANCiAgICAgICAgICAgICMgbGlzdCBvZiBzb2xvciBmYXJtcyBvYnRhaW5lZCBmcm9tOg0KICAgICAgICAgICAgIyBodHRwczovL3d3dy5jYW5zdGFyYmx1ZS5jb20uYXUvc29sYXItcG93ZXIvc29sYXItZmFybXMtYXVzdHJhbGlhLw0KICAgICAgICAgICAgc29sYXJfZmFybXNfcmF3IDwtIGMoDQogICAgICAgICAgICAgICAgIkJyb2tlbiBIaWxsIFNvbGFyIFBsYW50LCA1M01XLCBOU1ciDQogICAgICAgICAgICAgICAgLCAiTW9yZWUgU29sYXIgRmFybSwgNTZNVywgTlNXIg0KICAgICAgICAgICAgICAgICwgIlBhcmtlcyBTb2xhciBGYXJtLCA2NU1XLCBOU1ciDQogICAgICAgICAgICAgICAgLCAiQmVyeWwgU29sYXIgRmFybSwgODdNVywgTlNXIg0KICAgICAgICAgICAgICAgICwgIk55bmdhbiBTb2xhciBQbGFudCwgMTAyTVcsIE5TVyINCiAgICAgICAgICAgICAgICAsICJDb2xlYW1iYWxseSBTb2xhciBGYXJtLCAxNTBNVywgTlNXIg0KICAgICAgICAgICAgICAgICwgIkdhbm5hd2FycmEgU29sYXIgRmFybSwgNTBNVywgVklDIg0KICAgICAgICAgICAgICAgICwgIldlbWVuIFNvbGFyIEZhcm0sIDg4TVcsIFZJQyINCiAgICAgICAgICAgICAgICAsICJCYW5uZXJ0b24gU29sYXIgUGFyaywgODhNVywgVklDIg0KICAgICAgICAgICAgICAgICwgIkthcmFkb2MgU29sYXIgRmFtLCA5ME1XLCBWSUMiDQogICAgICAgICAgICAgICAgLCAiTnVtdXJrYWggU29sYXIgRmFtLCAxMDBNVywgVklDIg0KICAgICAgICAgICAgICAgICwgIkhheW1hbiBTb2xhciBGYXJtLCA1ME1XLCBRTEQiDQogICAgICAgICAgICAgICAgLCAiRXRocmlkZ2UgU29sYXIgRmFybSwgNTBNVywgUUxEIg0KICAgICAgICAgICAgICAgICwgIkNoaWxkZXJzIFNvbGFyIEZhcm0sIDU2TVcsIFFMRCINCiAgICAgICAgICAgICAgICAsICJXaGl0c3VuZGF5IFNvbGFyIEZhcm0sIDU3LjVNVywgUUxEIg0KICAgICAgICAgICAgICAgICwgIkhhbWlsdG9uIFNvbGFyIEZhcm0sIDU3LjUgTVcsIFFMRCINCiAgICAgICAgICAgICAgICAsICJFbWVyYWxkIFNvbGFyIFBhcmssIDY4TVcsIFFMRCINCiAgICAgICAgICAgICAgICAsICJTdXNhbiBSaXZlciBTb2xhciBGYXJtLCA3NU1XLCBRTEQiDQogICAgICAgICAgICAgICAgLCAiTGlseXZhbGUgU29sYXIgRmFybSwgMTAwTVcsIFFMRCINCiAgICAgICAgICAgICAgICAsICJDbGFyZSBTb2xhciBGYXJtLCAxMDBNVywgUUxEIg0KICAgICAgICAgICAgICAgICwgIkRhcmxpbmcgRG93bnMgU29sYXIgRmFybSwgMTEwTVcsIFFMRCINCiAgICAgICAgICAgICAgICAsICJSb3NzIFJpdmVyIFNvbGFyIEZhcm0sIDExNk1XLCBRTEQiDQogICAgICAgICAgICAgICAgLCAiU3VuIE1ldGFscyBTb2xhciBGYXJtLCAxMjRNVywgUUxEIg0KICAgICAgICAgICAgICAgICwgIkRheWRyZWFtIFNvbGFyIEZhcm0sIDE2OE1XLCBRTEQiDQogICAgICAgICAgICAgICAgLCAiVGFpbGVtIEJlbmQgU29sYXIgUG93ZXIgUHJvamVjdCwgMTA4TVcsIFNBIg0KICAgICAgICAgICAgICAgICwgIkJ1bmdhbGEgU29sYXIgUG93ZXIgUHJvamVjdCwgMjIwTVcsIFNBIg0KICAgICAgICAgICAgICAgICwgIk1lcnJlZGluIFNvbGFyIEZhcm0sIDEzMk1XLCBXQSINCiAgICAgICAgICAgICAgICAsICJCYWRnaW5nYXJyYSBSZW5ld2FibGUgRmFjaWxpdHksIDE0Ny41TVcsIFdBIg0KICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgKQ0KICAgICAgICAgICAgDQogICAgICAgICAgICBzb2xhcl9mYXJtcyA8LSBsaXN0KA0KICAgICAgICAgICAgICAgIG5hbWVzID0gYygpDQogICAgICAgICAgICAgICAgLCBjYXBhY2l0aWVzID0gYygpDQogICAgICAgICAgICAgICAgLCBzdGF0ZXMgPSBjKCkNCiAgICAgICAgICAgICAgICAsIGxhdHMgPSBjKCkNCiAgICAgICAgICAgICAgICAsIGxvbnMgPSBjKCkNCiAgICAgICAgICAgICkNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgDQogICAgICAgICAgICBnZXRfbG9jYXRpb25fZGF0YSA8LSBmdW5jdGlvbihhZGRyZXNzLCBwcmludF9tZXNzYWdlcyA9IEZBTFNFKXsNCiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICBhcGlfdXJsIDwtICJodHRwczovL21hcHMuZ29vZ2xlYXBpcy5jb20vbWFwcy9hcGkvZ2VvY29kZS9qc29uIg0KICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIHByaW50KHBhc3RlMCgiY2FsbGluZyBhcGkgd2l0aCBhZGRyZXNzOiAoIiwgYWRkcmVzcywgIikuLi4iKSkNCiAgICAgICAgICAgICAgICBhcmdzIDwtIGxpc3QoYWRkcmVzcyA9IGFkZHJlc3MsIHNlbnNvciA9ICdmYWxzZScsIHJlZ2lvbiA9ICdBdXN0cmFsaWEnLCBrZXk9IEFQSV9LRVkpDQogICAgICAgICAgICAgICAgcmVzcG9uc2UgPC0gR0VUKGFwaV91cmwsIHF1ZXJ5ID0gYXJncykNCiAgICAgICAgICAgICAgICByZXNwb25zZV9qc29uIDwtIGNvbnRlbnQocmVzcG9uc2UsICJ0ZXh0IikNCiAgICAgICAgICAgICAgICBkZXRhaWxzIDwtIGZyb21KU09OKHJlc3BvbnNlX2pzb24pDQogICAgICAgICAgICAgICAgaWYocHJpbnRfbWVzc2FnZXMpIHByaW50KHJlc3BvbnNlX2pzb24pDQogICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIHJlc3VsdCA8LSBsaXN0KA0KICAgICAgICAgICAgICAgICAgICBsYXQgPSBkZXRhaWxzJHJlc3VsdHMkZ2VvbWV0cnkkbG9jYXRpb24kbGF0DQogICAgICAgICAgICAgICAgICAgICwgbG9uID0gZGV0YWlscyRyZXN1bHRzJGdlb21ldHJ5JGxvY2F0aW9uJGxuZw0KICAgICAgICAgICAgICAgICkNCiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICByZXR1cm4ocmVzdWx0KQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgDQogICAgICAgICAgICBjb3VudGVyID0gMQ0KICAgICAgICAgICAgZm9yKHNvbGFyX2Zhcm0gaW4gc29sYXJfZmFybXNfcmF3KXsNCiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICBhZGRyZXNzX3BhcnRzIDwtIHN0cnNwbGl0KHNvbGFyX2Zhcm0sICcsICcpDQogICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgbmFtZSA8LSBhZGRyZXNzX3BhcnRzW1sxXV1bWzFdXQ0KICAgICAgICAgICAgICAgIGNhcGFjaXR5IDwtIGFkZHJlc3NfcGFydHNbWzFdXVtbMl1dDQogICAgICAgICAgICAgICAgc3RhdGUgPC0gYWRkcmVzc19wYXJ0c1tbMV1dW1szXV0NCiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICBhcmcgPC0gcGFzdGUobmFtZSwgc3RhdGUsIHNlcCA9ICcsICcpDQogICAgICAgICAgICAgICAgcmVzdWx0IDwtIGdldF9sb2NhdGlvbl9kYXRhKGFyZykNCiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICBzb2xhcl9mYXJtcyRuYW1lc1tjb3VudGVyXSA8LSBuYW1lDQogICAgICAgICAgICAgICAgc29sYXJfZmFybXMkY2FwYWNpdGllc1tjb3VudGVyXSA8LSBjYXBhY2l0eQ0KICAgICAgICAgICAgICAgIHNvbGFyX2Zhcm1zJHN0YXRlc1tjb3VudGVyXSA8LSBzdGF0ZQ0KICAgICAgICAgICAgICAgIHNvbGFyX2Zhcm1zJGxhdHNbY291bnRlcl0gPC0gcmVzdWx0JGxhdA0KICAgICAgICAgICAgICAgIHNvbGFyX2Zhcm1zJGxvbnNbY291bnRlcl0gPC0gcmVzdWx0JGxvbg0KICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIGNvdW50ZXIgPC0gY291bnRlciArIDENCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIA0KICAgICAgICAgICAgc29sYXJfZmFybXNfZGYgPC0gYXMuZGF0YS5mcmFtZShzb2xhcl9mYXJtcykNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgc2F2ZVJEUyhzb2xhcl9mYXJtc19kZiwgZmlsZSA9IHBhc3RlMChnZXR3ZCgpLCAiL2RhdGEvQk9NL3NvbGFyX2Zhcm1zLnJkcyIpKQ0KICAgICAgICAgICAgDQogICAgICAgICAgICBib21fc29sYXJfZmFybXMgPC0gc29sYXJfZmFybXNfZGYNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgcm0oc29sYXJfZmFybXNfZGYsQVBJX0tFWSxzb2xhcl9mYXJtc19yYXcsY291bnRlcixzb2xhcl9mYXJtLHNvbGFyX2Zhcm1zLGFkZHJlc3NfcGFydHMsbmFtZSxjYXBhY2l0eSxzdGF0ZSxhcmcscmVzdWx0LCkNCiAgICANCiAgICAgICAgfQ0KICAgIH0NCn0NCmBgYA0KDQpgYGB7ciBHRVQgQk9NIFdpbmQgRmFybSBEYXRhLCBlY2hvPUZBTFNFLCBldmFsPUZBTFNFLCByZXN1bHRzPSJoaWRlIn0NCiMgQ3JlZGl0IHRvIE1pY2hhZWwgR29yZG9uIGZvciBoZWxwaW5nIHdpdGggdGhlIENvZGUgaW4gdGhpcyBjaHVuay4NCg0KaWYgKEZBTFNFKSB7DQoNCiAgICBpZiAoZXhpc3RzKCJib21fd2luZF9mYXJtcyIpKSB7DQogICAgICAgICMgRG8gbm90aGluZy4uLg0KICAgIH0gZWxzZSB7IA0KICAgICAgICBpZiAoZmlsZS5leGlzdHMocGFzdGUwKGdldHdkKCksIi9kYXRhL0JPTS8iLCJ3aW5kX2Zhcm1zIiwiLnJkcyIpKSkgew0KICAgICAgICAgICAgYXNzaWduKCJib21fd2luZF9mYXJtcyIsIHJlYWRSRFMocGFzdGUwKGdldHdkKCksIi9kYXRhL0JPTS8iLCJ3aW5kX2Zhcm1zIiwiLnJkcyIpKSkNCiAgICAgICAgfSBlbHNlIHsNCiAgICANCiAgICAgICAgICAgICMgd2luZCBmYXJtcyBsaXN0Og0KICAgICAgICAgICAgIyBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9MaXN0X29mX3dpbmRfZmFybXNfaW5fQXVzdHJhbGlhDQogICAgICAgICAgICANCiAgICAgICAgICAgIHN0YXRlc19sb29rdXAgPC0gZGljdCgpDQogICAgICAgICAgICANCiAgICAgICAgICAgIHN0YXRlc19sb29rdXBbWydOZXcgU291dGggV2FsZXMnXV0gPC0gJ05TVycNCiAgICAgICAgICAgIHN0YXRlc19sb29rdXBbWydWaWN0b3JpYSddXSA8LSAnVklDJw0KICAgICAgICAgICAgc3RhdGVzX2xvb2t1cFtbJ1NvdXRoIEF1c3RyYWxpYSddXSA8LSAnU0EnDQogICAgICAgICAgICBzdGF0ZXNfbG9va3VwW1snV2VzdGVybiBBdXN0cmFsaWEnXV0gPC0gJ1dBJw0KICAgICAgICAgICAgc3RhdGVzX2xvb2t1cFtbJ1Rhc21hbmlhJ11dIDwtICdUQVMnDQogICAgICAgICAgICANCiAgICAgICAgICAgIGdldF9yZW1vdGVfZHJpdmVyIDwtIGZ1bmN0aW9uKCl7DQogICAgICAgICAgICAgICAgIyBSdW4gdGhpcyB0byBzdGFydCB0aGUgc2VsZW5pdW0gc2VydmVyDQogICAgICAgICAgICAgICAgIyBzdWRvIGRvY2tlciBydW4gLWQgLXAgNDQ0NTo0NDQ0IHNlbGVuaXVtL3N0YW5kYWxvbmUtY2hyb21lDQogICAgICAgICAgICAgICAgcmVtb3RlX2RyaXZlciA8LSByZW1vdGVEcml2ZXIoDQogICAgICAgICAgICAgICAgICAgIHJlbW90ZVNlcnZlckFkZHIgPSAibG9jYWxob3N0IiwNCiAgICAgICAgICAgICAgICAgICAgcG9ydCA9IDQ0NDVMLA0KICAgICAgICAgICAgICAgICAgICBicm93c2VyTmFtZSA9ICJjaHJvbWUiDQogICAgICAgICAgICAgICAgKQ0KICAgICAgICAgICAgICAgIHJldHVybihyZW1vdGVfZHJpdmVyKQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgDQogICAgICAgICAgICANCiAgICAgICAgICAgIGdldF93aW5kX2Zhcm1zX3RhYmxlIDwtIGZ1bmN0aW9uKCl7DQogICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgdGFibGVzIDwtIGRyaXZlciRmaW5kRWxlbWVudHMoImNzcyIsICIud2lraXRhYmxlIikNCiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICBmb3IodGFibGUgaW4gdGFibGVzKXsNCiAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgIGNhcHRpb24gPC0gdGFibGUkZmluZENoaWxkRWxlbWVudCgndGFnIG5hbWUnLCAnY2FwdGlvbicpDQogICAgICAgICAgICAgICAgICAgIGNhcHRpb25fdGV4dCA8LSBjYXB0aW9uJGdldEVsZW1lbnRUZXh0KCkNCiAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgIGlmKHN0cl9zdGFydHMoY2FwdGlvbl90ZXh0LCAiTGFyZ2Ugb3BlcmF0aW9uYWwgd2luZCBmYXJtcyBpbiBBdXN0cmFsaWEiKSl7DQogICAgICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybih0YWJsZSkNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIA0KICAgICAgICAgICAgY29udmVydF90b19kZWNpbWFsX2RlZ3JlZXMgPC0gZnVuY3Rpb24oY29vcmRpbmF0ZXMpew0KICAgICAgICAgICAgICAgICMgaHR0cHM6Ly93d3cubGF0bG9uZy5uZXQvZGVncmVlcy1taW51dGVzLXNlY29uZHMtdG8tZGVjaW1hbC1kZWdyZWVzDQogICAgICAgICAgICAgICAgIyAiIE4gPSAiKyIgUyA9ICItIiBFID0gIisiIFcgPSAiLSINCiAgICAgICAgICAgICAgICAjIERlY2ltYWwgRGVncmVlcyA9IGRlZ3JlZXMgKyAobWludXRlcy82MCkgKyAoc2Vjb25kcy8zNjAwKQ0KICAgICAgICAgICAgICAgICMgREQgPSBkICsgKG1pbi82MCkgKyAoc2VjLzM2MDApDQogICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgIyB0aGUgcmVnZXggYXBwcm9hY2ggZmFpbHMsIGFsdGhvdWdoIHRoZSByZWdleCBwYXR0ZXJuIHdvcmtzIG9uIHJlZ2V4MTAxLCBSIGRvZXMgaGFuZGxlIHVuaWNvZGUgY2hhcnMgd2VsbA0KICAgICAgICAgICAgICAgICMgcGF0dGVybiA8LSAnKF5cXGQqKcKwKFxcZCop4oCyXChcZCop4oCzKFtBLVpdKScNCiAgICAgICAgICAgICAgICAjIFIgb3IgcnN0dWRpbyBjYW4ndCBoYW5kbGUgcHJpbWUgYW5kIGRvdWJsZSBwcmltZSBzeW1ib2wNCiAgICAgICAgICAgICAgICAjIHBhdHRlcm4gPC0gJyheXFxkKinCsChcXGQpXHUyMDMyKFxcZCopXHUyMDMzKFtBLVpdKScNCiAgICAgICAgICAgICAgICBtYXRjaGVzIDwtIHN0cnNwbGl0KGNvb3JkaW5hdGVzLCAnwrB8XHUyMDMzfFx1MjAzMicpICMgXHUyMDMzID09IGRvdWJsZSBwcmltZSwgXHUyMDMyID09IHByaW1lDQogICAgICAgICAgICAgICAgaW5kZXggPC0gMQ0KICAgICAgICAgICAgICAgIGRlZ3JlZXMgPC0gc3VwcHJlc3NXYXJuaW5ncyhhcy5udW1lcmljKG1hdGNoZXNbWzFdXVtpbmRleF0pKQ0KICAgICAgICAgICAgICAgIGluZGV4IDwtIDEgKyBpbmRleA0KICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIG1pbnV0ZXMgPC0gMA0KICAgICAgICAgICAgICAgIGlmKGdyZXBsKCdcdTIwMzInLCBjb29yZGluYXRlcykpew0KICAgICAgICAgICAgICAgICAgICBtaW51dGVzIDwtIHN1cHByZXNzV2FybmluZ3MoYXMubnVtZXJpYyhtYXRjaGVzW1sxXV1baW5kZXhdKSkNCiAgICAgICAgICAgICAgICAgICAgaW5kZXggPC0gMSArIGluZGV4DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIHNlY29uZHMgPC0gMA0KICAgICAgICAgICAgICAgIGlmKGdyZXBsKCdcdTIwMzMnLCBjb29yZGluYXRlcykpew0KICAgICAgICAgICAgICAgICAgICBzZWNvbmRzIDwtIHN1cHByZXNzV2FybmluZ3MoYXMubnVtZXJpYyhtYXRjaGVzW1sxXV1baW5kZXhdKSkNCiAgICAgICAgICAgICAgICAgICAgaW5kZXggPC0gMSArIGluZGV4DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIGRpcmVjdGlvbiA8LSBtYXRjaGVzW1sxXV1baW5kZXhdDQogICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgbWludXRlc19jb252ZXJ0ZWQgPC0gMA0KICAgICAgICAgICAgICAgIGlmKCFpcy5uYShtaW51dGVzKSl7DQogICAgICAgICAgICAgICAgICAgIG1pbnV0ZXNfY29udmVydGVkIDwtIChtaW51dGVzLzYwKQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICBzZWNvbmRzX2NvbnZlcnRlZCA8LSAwDQogICAgICAgICAgICAgICAgaWYoIWlzLm5hKHNlY29uZHMpKXsNCiAgICAgICAgICAgICAgICAgICAgc2Vjb25kc19jb252ZXJ0ZWQgPC0gKHNlY29uZHMvMzYwMCkNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgY29udmVydGVkIDwtIGRlZ3JlZXMgKyBtaW51dGVzX2NvbnZlcnRlZCArIG1pbnV0ZXNfY29udmVydGVkDQogICAgICAgICAgICAgICAgaWYoZGlyZWN0aW9uID09ICdTJyB8IGRpcmVjdGlvbiA9PSAnVycpew0KICAgICAgICAgICAgICAgICAgICBjb252ZXJ0ZWQgPC0gLWNvbnZlcnRlZA0KICAgICAgICAgICAgICAgIH0gDQogICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgcmV0dXJuKGNvbnZlcnRlZCkNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIA0KICAgICAgICAgICAgZHJpdmVyIDwtIGdldF9yZW1vdGVfZHJpdmVyKCkNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgZHJpdmVyJG9wZW4oKQ0KICAgICAgICAgICAgZHJpdmVyJG5hdmlnYXRlKCJodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9MaXN0X29mX3dpbmRfZmFybXNfaW5fQXVzdHJhbGlhIikNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgDQogICAgICAgICAgICBmYXJtX3RhYmxlIDwtIGdldF93aW5kX2Zhcm1zX3RhYmxlKCkNCiAgICAgICAgICAgIHJvd3MgPC0gZmFybV90YWJsZSRmaW5kQ2hpbGRFbGVtZW50cygnY3NzJywgJ3Rib2R5IHRyJykNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgd2luZF9mYXJtcyA8LSBsaXN0KA0KICAgICAgICAgICAgICAgIG5hbWUgPSBjKCkNCiAgICAgICAgICAgICAgICAsIGNhcGFjaXR5ID0gYygpDQogICAgICAgICAgICAgICAgLCBzdGF0ZSA9IGMoKQ0KICAgICAgICAgICAgICAgICwgbGF0ID0gYygpDQogICAgICAgICAgICAgICAgLCBsb24gPSBjKCkNCiAgICAgICAgICAgICAgICAsIG93bmVyID0gYygpDQogICAgICAgICAgICApDQogICAgICAgICAgICBjb3VudGVyIDwtIDENCiAgICAgICAgICAgIGZvcihyb3cgaW4gcm93cyl7DQogICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgdF9jb2x1bW5zIDwtIHJvdyRmaW5kQ2hpbGRFbGVtZW50cygndGFnIG5hbWUnLCAndGQnKQ0KICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIG5hbWUgPC0gdF9jb2x1bW5zW1sxXV0kZ2V0RWxlbWVudFRleHQoKVtbMV1dDQogICAgICAgICAgICAgICAgY2FwYWNpdHkgPC0gdF9jb2x1bW5zW1syXV0kZ2V0RWxlbWVudFRleHQoKVtbMV1dDQogICAgICAgICAgICAgICAgb3duZXIgPC0gdF9jb2x1bW5zW1szXV0kZ2V0RWxlbWVudFRleHQoKVtbMV1dDQogICAgICAgICAgICAgICAgc3RhdGUgPC0gdF9jb2x1bW5zW1s0XV0kZ2V0RWxlbWVudFRleHQoKVtbMV1dDQogICAgICAgICAgICAgICAgY29vcmRpbmF0ZXMgPC0gdF9jb2x1bW5zW1s1XV0kZ2V0RWxlbWVudFRleHQoKVtbMV1dDQogICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgY29vcmRpbmF0ZXMgPC0gc3Ryc3BsaXQoY29vcmRpbmF0ZXMsICcgJykNCiAgICAgICAgICAgICAgICBsYXQgPC0gY29udmVydF90b19kZWNpbWFsX2RlZ3JlZXMoY29vcmRpbmF0ZXNbWzFdXVsxXSkNCiAgICAgICAgICAgICAgICBsb24gPC0gY29udmVydF90b19kZWNpbWFsX2RlZ3JlZXMoY29vcmRpbmF0ZXNbWzFdXVsyXSkNCiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICB3aW5kX2Zhcm1zJG5hbWVbY291bnRlcl0gPC0gbmFtZQ0KICAgICAgICAgICAgICAgIHdpbmRfZmFybXMkY2FwYWNpdHlbY291bnRlcl0gPC0gY2FwYWNpdHkNCiAgICAgICAgICAgICAgICB3aW5kX2Zhcm1zJHN0YXRlW2NvdW50ZXJdIDwtIHN0YXRlc19sb29rdXBbW3N0YXRlXV0NCiAgICAgICAgICAgICAgICB3aW5kX2Zhcm1zJGxhdFtjb3VudGVyXSA8LSBsYXQNCiAgICAgICAgICAgICAgICB3aW5kX2Zhcm1zJGxvbltjb3VudGVyXSAgPC0gbG9uDQogICAgICAgICAgICAgICAgd2luZF9mYXJtcyRvd25lcltjb3VudGVyXSA8LSBvd25lcg0KICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIHByaW50KHBhc3RlKG5hbWUsIGNhcGFjaXR5LCBvd25lciwgc3RhdGUsIGNvb3JkaW5hdGVzLGxhdCxsb24pKQ0KICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIGNvdW50ZXIgPC0gMSArIGNvdW50ZXINCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIA0KICAgICAgICAgICAgZHJpdmVyJGNsb3NlKCkNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgd2luZF9mYXJtc19kZiA8LSBhcy5kYXRhLmZyYW1lKHdpbmRfZmFybXMpDQogICAgICAgICAgICBzYXZlUkRTKHdpbmRfZmFybXNfZGYsIGZpbGUgPSBwYXN0ZTAoZ2V0d2QoKSwgIi9kYXRhL0JPTS93aW5kX2Zhcm1zLnJkcyIpKQ0KICAgICAgICAgICAgDQogICAgICAgICAgICBib21fd2luZF9mYXJtcyA8LSB3aW5kX2Zhcm1zX2RmDQogICAgICAgICAgICANCiAgICAgICAgICAgIHJtKHdpbmRfZmFybXNfZGYsY291bnRlcix0X2NvbHVtbnMsbmFtZSxjYXBhY2l0eSxvd25lcixzdGF0ZSxjb29yZGluYXRlcyxsYXQsbG9uLHJvdyxyb3dzLHdpbmRfZmFybXMsZmFybV90YWJsZSxkcml2ZXIsc3RhdGVzX2xvb2t1cCkNCiAgICAgICAgICAgIA0KICAgICAgICB9DQogICAgfQ0KfQ0KYGBgDQoNCmBgYHtyIEZJWCBCT00gRGUtRHVwbGljYXRlIFdlYXRoZXIgRGF0YSwgZWNobz1GQUxTRSwgZXZhbD1GQUxTRSwgcmVzdWx0cz0iaGlkZSJ9DQojIENyZWRpdCB0byBNaWNoYWVsIEdvcmRvbiBmb3IgaGVscGluZyB3aXRoIHRoZSBDb2RlIGluIHRoaXMgY2h1bmsuDQoNCmlmIChGQUxTRSkgew0KDQogICAgQVBJX0tFWSA9ICI8eW91ciBnb29nbGUgbWFwcyBhcGkga2V5IGdvZXMgaGVyZT4iDQogICAgDQogICAgbG9jYXRpb25fcXVlcnlfY2FjaGUgPC0gZGljdCgpDQogICAgDQogICAgbG9hZF93ZWF0aGVyX3N0YXRpb25zIDwtIGZ1bmN0aW9uKCl7DQogICAgICAgIHN0YXRpb25zIDwtIHJlYWRSRFMocGFzdGUwKGdldHdkKCksICIvZGF0YS9CT00vd2VhdGhlcl9zdGF0aW9ucy5yZHMiKSkNCiAgICAgICAgcmV0dXJuKHN0YXRpb25zKQ0KICAgIH0NCiAgICANCiAgICBsb2FkX21pbl90ZW1wX2RhdGEgPC0gZnVuY3Rpb24oKXsNCiAgICAgICAgbWluX3RlbXAgPC0gcmVhZFJEUyhwYXN0ZTAoZ2V0d2QoKSwgIi9kYXRhL0JPTS9kYWlseV9taW5pbXVtX3RlbXBlcmF0dXJlLnJkcyIpKQ0KICAgICAgICByZXR1cm4obWluX3RlbXApDQogICAgfQ0KICAgIA0KICAgIGxvYWRfbWF4X3RlbXBfZGF0YSA8LSBmdW5jdGlvbigpew0KICAgICAgICBtYXhfdGVtcCA8LSByZWFkUkRTKHBhc3RlMChnZXR3ZCgpLCAiL2RhdGEvQk9NL2RhaWx5X21heGltdW1fdGVtcGVyYXR1cmUucmRzIikpDQogICAgICAgIHJldHVybihtYXhfdGVtcCkNCiAgICB9DQogICAgDQogICAgbG9hZF9yYWluZmFsbF9kYXRhIDwtIGZ1bmN0aW9uKCl7DQogICAgICAgIHJhaW5mYWxsX2RhdGEgPC0gcmVhZFJEUyhwYXN0ZTAoZ2V0d2QoKSwgIi9kYXRhL0JPTS9kYWlseV9yYWluZmFsbC5yZHMiKSkNCiAgICAgICAgcmV0dXJuKHJhaW5mYWxsX2RhdGEpDQogICAgfQ0KICAgIA0KICAgIGxvYWRfc29sYXJfZXhwb3N1cmVfZGF0YSA8LSBmdW5jdGlvbigpew0KICAgICAgICBzb2xhcl9leHBvc3VyZV9kYXRhIDwtIHJlYWRSRFMocGFzdGUwKGdldHdkKCksICIvZGF0YS9CT00vZGFpbHlfc29sYXJfZXhwb3N1cmUucmRzIikpDQogICAgICAgIHJldHVybihzb2xhcl9leHBvc3VyZV9kYXRhKQ0KICAgIH0NCiAgICANCiAgICBnZXRfbG9jYXRpb25fZGF0YSA8LSBmdW5jdGlvbihsYXQsIGxuZywgYWRkcmVzcywgcHJpbnRfbWVzc2FnZXMgPSBGQUxTRSwgdXNlX2NhY2hlID0gVFJVRSl7DQogICAgICAgIA0KICAgICAgICBsYXRfbG9uX2FyZyA8LSBwYXN0ZShsYXQsIGxuZywgc2VwID0gJywnKQ0KICAgICAgICBhcGlfdXJsIDwtICJodHRwczovL21hcHMuZ29vZ2xlYXBpcy5jb20vbWFwcy9hcGkvZ2VvY29kZS9qc29uIg0KICAgICAgICANCiAgICAgICAgaWYodXNlX2NhY2hlICYgbGF0X2xvbl9hcmcgJWluJSBsb2NhdGlvbl9xdWVyeV9jYWNoZSRrZXlzKCkpew0KICAgICAgICAgICAgcHJpbnQoInJldHJlaXZpbmcgZnJvbSBjYWNoZSIpDQogICAgICAgICAgICByZXN1bHQgPC0gbG9jYXRpb25fcXVlcnlfY2FjaGVbW2xhdF9sb25fYXJnXV1bWzFdXQ0KICAgICAgICAgICAgcmV0dXJuKHJlc3VsdCkNCiAgICAgICAgICAgIA0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgcHJpbnQoImNhbGxpbmcgYXBpIikNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgcmVzcG9uc2UgPC0gR0VUKGFwaV91cmwsIHF1ZXJ5ID0gbGlzdChsYXRsbmcgPSBsYXRfbG9uX2FyZywga2V5PSBBUElfS0VZKSkNCiAgICAgICAgICAgIHJlc3BvbnNlX2pzb24gPC0gY29udGVudChyZXNwb25zZSwgInRleHQiKQ0KICAgICAgICAgICAgZGV0YWlscyA8LSBmcm9tSlNPTihyZXNwb25zZV9qc29uKQ0KICAgICAgICAgICAgaWYocHJpbnRfbWVzc2FnZXMpIHByaW50KHJlc3BvbnNlX2pzb24pDQogICAgICAgICAgICBhYyA8LSBkZXRhaWxzJHJlc3VsdHMkYWRkcmVzc19jb21wb25lbnRzW1sxXV0NCiAgICAgICAgICAgIHBvc3Rjb2RlIDwtIE5BDQogICAgICAgICAgICByZWdpb24gPC0gTkENCiAgICAgICAgICAgIHN0YXRlIDwtIE5BDQogICAgICAgICAgICANCiAgICAgICAgICAgIGlmICghaXMubnVsbChhYykpIHsNCiAgICAgICAgICAgICAgICAjIEl0ZXJhdGUgdGhlIHR5cGVzIG9mIHRoZSBjdXJyZW50IGFkZHJlc3NfY29tcG9uZW50cy4NCiAgICAgICAgICAgICAgICBmb3IgKGogaW4gMTpsZW5ndGgoYWMkdHlwZXMpKSB7DQogICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICBpZiAoYWMkdHlwZXNbW2pdXVtbMV1dID09ICJwb3N0YWxfY29kZSIpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHBvc3Rjb2RlIDwtIGFjJGxvbmdfbmFtZVtbal1dDQogICAgICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgfWVsc2UgaWYoImFkbWluaXN0cmF0aXZlX2FyZWFfbGV2ZWxfMiIgJWluJSBhYyR0eXBlc1tbal1dW1sxXV0pew0KICAgICAgICAgICAgICAgICAgICAgICAgcmVnaW9uIDwtIGFjJHNob3J0X25hbWVbW2pdXQ0KICAgICAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgIH1lbHNlIGlmKCJhZG1pbmlzdHJhdGl2ZV9hcmVhX2xldmVsXzEiICVpbiUgYWMkdHlwZXNbW2pdXVtbMV1dKXsNCiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlIDwtIGFjJHNob3J0X25hbWVbW2pdXQ0KICAgICAgICAgICAgICAgICAgICAgICAgaWYoc3RhdGUgPT0gJ0pCVCcpew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlIDwtICdOU1cnDQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICANCiAgICAgICAgICAgIGlmKGlzLm5hKHBvc3Rjb2RlKSB8IGlzLm5hKHJlZ2lvbikpew0KICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIGlmKCFpcy5uYShzdGF0ZSkpew0KICAgICAgICAgICAgICAgICAgICBhZGRyZXNzIDwtIHBhc3RlKGFkZHJlc3MsIHN0YXRlLCAiQXVzdHJhbGlhIiwgc2VwID0gJywgJykNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgcHJpbnQocGFzdGUwKCJyZS1jYWxsaW5nIGFwaSB3aXRoIGFkZHJlc3M6ICgiLCBhZGRyZXNzLCAiKS4uLiIpKQ0KICAgICAgICAgICAgICAgIGFyZ3MgPC0gbGlzdChhZGRyZXNzID0gYWRkcmVzcywgc2Vuc29yID0gJ2ZhbHNlJywgcmVnaW9uID0gJ0F1c3RyYWxpYScsIGtleT0gQVBJX0tFWSkNCiAgICAgICAgICAgICAgICByZXNwb25zZSA8LSBHRVQoYXBpX3VybCwgcXVlcnkgPSBhcmdzKQ0KICAgICAgICAgICAgICAgIHJlc3BvbnNlX2pzb24gPC0gY29udGVudChyZXNwb25zZSwgInRleHQiKQ0KICAgICAgICAgICAgICAgIGRldGFpbHMgPC0gZnJvbUpTT04ocmVzcG9uc2VfanNvbikNCiAgICAgICAgICAgICAgICBpZihwcmludF9tZXNzYWdlcykgcHJpbnQocmVzcG9uc2VfanNvbikNCiAgICAgICAgICAgICAgICBhYyA8LSBkZXRhaWxzJHJlc3VsdHMkYWRkcmVzc19jb21wb25lbnRzW1sxXV0NCiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICBpZiAoIWlzLm51bGwoYWMpKSB7DQogICAgICAgICAgICAgICAgICAgICMgSXRlcmF0ZSB0aGUgdHlwZXMgb2YgdGhlIGN1cnJlbnQgYWRkcmVzc19jb21wb25lbnRzLg0KICAgICAgICAgICAgICAgICAgICBmb3IgKGogaW4gMTpsZW5ndGgoYWMkdHlwZXMpKSB7DQogICAgICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpcy5uYShwb3N0Y29kZSkgJiBhYyR0eXBlc1tbal1dW1sxXV0gPT0gInBvc3RhbF9jb2RlIikgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc3Rjb2RlIDwtIGFjJGxvbmdfbmFtZVtbal1dDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZSBpZihpcy5uYShyZWdpb24pICYgImFkbWluaXN0cmF0aXZlX2FyZWFfbGV2ZWxfMiIgJWluJSBhYyR0eXBlc1tbal1dW1sxXV0pew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lvbiA8LSBhYyRzaG9ydF9uYW1lW1tqXV0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIA0KICAgICAgICAgICAgbG9jYXRpb25fcXVlcnlfY2FjaGVbW2xhdF9sb25fYXJnXV0gPC0gbGlzdChsYXRfbG9uX2FyZyA9IGxpc3QocG9zdGNvZGUgPSBwb3N0Y29kZSwgcmVnaW9uID0gcmVnaW9uLCBzdGF0ZSA9IHN0YXRlKSkNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgcmVzdWx0IDwtIGxvY2F0aW9uX3F1ZXJ5X2NhY2hlW1tsYXRfbG9uX2FyZ11dW1sxXV0NCiAgICAgICAgICAgIA0KICAgICAgICAgICAgcmV0dXJuKHJlc3VsdCkNCiAgICAgICAgfQ0KICAgICAgICAjIE5vcmFoIEhlYWQgTlNXIDIyNjMNCiAgICB9DQogICAgDQogICAgZ2V0X2xvY2F0aW9uX3N0YXRlIDwtIGZ1bmN0aW9uKGxhdCwgbG5nLCBuYW1lKXsNCiAgICAgICAgcmVzdWx0IDwtIGdldF9sb2NhdGlvbl9kYXRhKGxhdCwgbG5nLCBuYW1lKQ0KICAgICAgICByZXR1cm4ocmVzdWx0JHN0YXRlKQ0KICAgIH0NCiAgICANCiAgICBnZXRfbG9jYXRpb25fcmVnaW9uIDwtIGZ1bmN0aW9uKGxhdCwgbG5nLCBuYW1lKXsNCiAgICAgICAgcmVzdWx0IDwtIGdldF9sb2NhdGlvbl9kYXRhKGxhdCwgbG5nLCBuYW1lKQ0KICAgICAgICByZXR1cm4ocmVzdWx0JHJlZ2lvbikNCiAgICB9DQogICAgDQogICAgZ2V0X2xvY2F0aW9uX3Bvc3Rjb2RlIDwtIGZ1bmN0aW9uKGxhdCwgbG5nLCBuYW1lKXsNCiAgICAgICAgcmVzdWx0IDwtIGdldF9sb2NhdGlvbl9kYXRhKGxhdCwgbG5nLCBuYW1lKQ0KICAgICAgICByZXR1cm4ocmVzdWx0JHBvc3Rjb2RlKQ0KICAgIH0NCiAgICANCiAgICBzdGF0ZXMgPC0gYygNCiAgICAgICAgIkFDVCINCiAgICAgICAgLCAiTlNXIg0KICAgICAgICAsICJOVCINCiAgICAgICAgLCAiUUxEIg0KICAgICAgICAsICJTQSINCiAgICAgICAgLCAiVEFTIg0KICAgICAgICAsICJWSUMiDQogICAgICAgICwgIldBIg0KICAgICkNCiAgICANCiAgICBkZV9kdXBsaWNhdGVfYW5kX2VuaGFuY2Vfd2VhdGhlcl9zdGF0aW9uX2RhdGEgPC0gZnVuY3Rpb24oKXsNCiAgICAgICAgDQogICAgICAgIHdlYXRoZXJfc3RhdGlvbnMgPC0gbG9hZF93ZWF0aGVyX3N0YXRpb25zKCkNCiAgICAgICAgDQogICAgICAgIHdlYXRoZXJfc3RhdGlvbnMgPC0gd2VhdGhlcl9zdGF0aW9ucyAlPiUNCiAgICAgICAgICAgIG11dGF0ZSgNCiAgICAgICAgICAgICAgICBzdGF0ZSA9IG1hcHBseShnZXRfbG9jYXRpb25fc3RhdGUsIGxhdCwgbG9uLCBuYW1lKQ0KICAgICAgICAgICAgICAgICwgcmVnaW9uID0gbWFwcGx5KGdldF9sb2NhdGlvbl9yZWdpb24sIGxhdCwgbG9uLCBuYW1lKQ0KICAgICAgICAgICAgICAgICwgcG9zdGNvZGUgPSBtYXBwbHkoZ2V0X2xvY2F0aW9uX3Bvc3Rjb2RlLCBsYXQsIGxvbiwgbmFtZSkNCiAgICAgICAgICAgICkNCiAgICAgICAgDQogICAgICAgICMgcHJvYmxlbV9zdGF0ZXMgPC0gd2VhdGhlcl9zdGF0aW9ucyAlPiUgZmlsdGVyKCEoc3RhdGUgJWluJSBzdGF0ZXMpKQ0KICAgICAgICAjIHByb2JsZW1fcG9zdGNvZGVzIDwtIHdlYXRoZXJfc3RhdGlvbnMgJT4lIGZpbHRlcihpcy5uYShwb3N0Y29kZSkpDQogICAgICAgICMgcHJvYmxlbV9yZWdpb25zIDwtIHdlYXRoZXJfc3RhdGlvbnMgJT4lIGZpbHRlcihpcy5uYShyZWdpb24pKQ0KICAgICAgICANCiAgICAgICAgY29sbGFwc2VkX3N0YXRpb25zIDwtIHdlYXRoZXJfc3RhdGlvbnMgJT4lIA0KICAgICAgICAgICAgZ3JvdXBfYnkobmFtZSwgc3RhdGlvbl9pZCkgJT4lDQogICAgICAgICAgICBzdW1tYXJpc2UoDQogICAgICAgICAgICAgICAgc3RhdGUgPSBmaXJzdChzdGF0ZSkNCiAgICAgICAgICAgICAgICAsIGxhdCA9IGZpcnN0KGxhdCkNCiAgICAgICAgICAgICAgICAsIGxvbiA9IGZpcnN0KGxvbikNCiAgICAgICAgICAgICAgICAsIGVsZXZhdGlvbiA9IGZpcnN0KGVsZXZhdGlvbikNCiAgICAgICAgICAgICAgICAsIHJlZ2lvbiA9IGZpcnN0KHJlZ2lvbikNCiAgICAgICAgICAgICAgICAsIHBvc3Rjb2RlID0gZmlyc3QocG9zdGNvZGUpDQogICAgICAgICAgICApDQogICAgICAgIA0KICAgICAgICBzYXZlUkRTKGNvbGxhcHNlZF9zdGF0aW9ucywgZmlsZSA9IHBhc3RlMChnZXR3ZCgpLCAiL2RhdGEvQk9NL3dlYXRoZXJfc3RhdGlvbnNfdjIucmRzIikpDQogICAgfQ0KICAgIA0KICAgIGRlX2R1cGxpY2F0ZV9taW5fdGVtcCA8LSBmdW5jdGlvbigpew0KICAgICAgICANCiAgICAgICAgbWluX3RlbXAgPC0gbG9hZF9taW5fdGVtcF9kYXRhKCkNCiAgICAgICAgbWluX3RlbXAgPC0gbWluX3RlbXAgJT4lIA0KICAgICAgICAgICAgZ3JvdXBfYnkoc3RhdGlvbl9pZCwgeWVhciwgbW9udGgsIGRheSkgJT4lDQogICAgICAgICAgICBzdW1tYXJpc2UoDQogICAgICAgICAgICAgICAgbWluX3RlbXAgPSBmaXJzdChtaW5fdGVtcCkNCiAgICAgICAgICAgICAgICAsIGRheXNfb2ZfYWNjdW11bGF0aW9uID0gZmlyc3QoZGF5c19vZl9hY2N1bXVsYXRpb24pDQogICAgICAgICAgICAgICAgLCBxdWFsaXR5ID0gZmlyc3QocXVhbGl0eSkNCiAgICAgICAgICAgICAgICAsIHByb2R1Y3RfY29kZSA9IGZpcnN0KHByb2R1Y3RfY29kZSkNCiAgICAgICAgICAgICkNCiAgICAgICAgDQogICAgICAgIHNhdmVSRFMobWluX3RlbXAsIGZpbGUgPSBwYXN0ZTAoZ2V0d2QoKSwgIi9kYXRhL0JPTS9kYWlseV9taW5pbXVtX3RlbXBlcmF0dXJlX3YyLnJkcyIpKQ0KICAgICAgICBybShtaW5fdGVtcCkNCiAgICB9DQogICAgDQogICAgZGVfZHVwbGljYXRlX21heF90ZW1wIDwtIGZ1bmN0aW9uKCl7DQogICAgICAgIA0KICAgICAgICBtYXhfdGVtcCA8LSBsb2FkX21heF90ZW1wX2RhdGEoKQ0KICAgICAgICBtYXhfdGVtcCA8LSBtYXhfdGVtcCAlPiUgDQogICAgICAgICAgICBncm91cF9ieShzdGF0aW9uX2lkLCB5ZWFyLCBtb250aCwgZGF5KSAlPiUNCiAgICAgICAgICAgIHN1bW1hcmlzZSgNCiAgICAgICAgICAgICAgICBtYXhfdGVtcCA9IGZpcnN0KG1heF90ZW1wKQ0KICAgICAgICAgICAgICAgICwgZGF5c19vZl9hY2N1bXVsYXRpb24gPSBmaXJzdChkYXlzX29mX2FjY3VtdWxhdGlvbikNCiAgICAgICAgICAgICAgICAsIHF1YWxpdHkgPSBmaXJzdChxdWFsaXR5KQ0KICAgICAgICAgICAgICAgICwgcHJvZHVjdF9jb2RlID0gZmlyc3QocHJvZHVjdF9jb2RlKQ0KICAgICAgICAgICAgKQ0KICAgICAgICBzYXZlUkRTKG1heF90ZW1wLCBmaWxlID0gcGFzdGUwKGdldHdkKCksICIvZGF0YS9CT00vZGFpbHlfbWF4aW11bV90ZW1wZXJhdHVyZV92Mi5yZHMiKSkNCiAgICAgICAgcm0obWF4X3RlbXApDQogICAgfQ0KICAgIA0KICAgIGRlX2R1cGxpY2F0ZV9yYWluZmFsbF9kYXRhIDwtIGZ1bmN0aW9uKCl7DQogICAgICAgIA0KICAgICAgICByYWluZmFsbF9kYXRhIDwtIGxvYWRfcmFpbmZhbGxfZGF0YSgpDQogICAgICAgIHJhaW5mYWxsX2RhdGEgPC0gcmFpbmZhbGxfZGF0YSAlPiUgDQogICAgICAgICAgICBncm91cF9ieShzdGF0aW9uX2lkLCB5ZWFyLCBtb250aCwgZGF5KSAlPiUNCiAgICAgICAgICAgIHN1bW1hcmlzZSgNCiAgICAgICAgICAgICAgICByYWluZmFsbF9taWxsaW1ldHJlcyA9IGZpcnN0KHJhaW5mYWxsX21pbGxpbWV0cmVzKQ0KICAgICAgICAgICAgICAgICwgZGF5c19vZl9hY2N1bXVsYXRpb24gPSBmaXJzdChkYXlzX29mX2FjY3VtdWxhdGlvbikNCiAgICAgICAgICAgICAgICAsIHF1YWxpdHkgPSBmaXJzdChxdWFsaXR5KQ0KICAgICAgICAgICAgICAgICwgcHJvZHVjdF9jb2RlID0gZmlyc3QocHJvZHVjdF9jb2RlKQ0KICAgICAgICAgICAgKQ0KICAgICAgICBzYXZlUkRTKHJhaW5mYWxsX2RhdGEsIGZpbGUgPSBwYXN0ZTAoZ2V0d2QoKSwgIi9kYXRhL0JPTS9kYWlseV9yYWluZmFsbF92Mi5yZHMiKSkNCiAgICAgICAgcm0ocmFpbmZhbGxfZGF0YSkNCiAgICB9DQogICAgDQogICAgZGVfZHVwbGljYXRlX3NvbGFyX2V4cG9zdXJlX2RhdGEgPC0gZnVuY3Rpb24oKXsNCiAgICAgICAgDQogICAgICAgIHNvbGFyX2V4cG9zdXJlX2RhdGEgPC0gbG9hZF9zb2xhcl9leHBvc3VyZV9kYXRhKCkNCiAgICAgICAgc29sYXJfZXhwb3N1cmVfZGF0YSA8LSBzb2xhcl9leHBvc3VyZV9kYXRhICU+JSANCiAgICAgICAgICAgIGdyb3VwX2J5KHN0YXRpb25faWQsIHllYXIsIG1vbnRoLCBkYXkpICU+JQ0KICAgICAgICAgICAgc3VtbWFyaXNlKA0KICAgICAgICAgICAgICAgIGdsb2JhbF9zb2xhcl9leHBvc3VyZSA9IGZpcnN0KGdsb2JhbF9zb2xhcl9leHBvc3VyZSkNCiAgICAgICAgICAgICAgICAsIHByb2R1Y3RfY29kZSA9IGZpcnN0KHByb2R1Y3RfY29kZSkNCiAgICAgICAgICAgICkNCiAgICAgICAgc2F2ZVJEUyhzb2xhcl9leHBvc3VyZV9kYXRhLCBmaWxlID0gcGFzdGUwKGdldHdkKCksICIvZGF0YS9CT00vZGFpbHlfc29sYXJfZXhwb3N1cmVfdjIucmRzIikpDQogICAgICAgIHJtKHNvbGFyX2V4cG9zdXJlX2RhdGEpIA0KICAgIH0NCiAgICANCiAgICAjIEltcG9ydCBkYXRhDQogICAgSW1wb3J0RmlsZXMgPC0gbGlzdC5maWxlcyhwYXN0ZTAoZ2V0d2QoKSwgIi9kYXRhL0JPTS8iKSwgcGF0dGVybj0iKl92Mi5yZHMiKQ0KICAgIGlmIChsZW5ndGgoSW1wb3J0RmlsZXMpID4gMCkgew0KICAgICAgICBmb3IgKGZpbGUgaW4gSW1wb3J0RmlsZXMpIHsNCiAgICAgICAgICAgIEltcG9ydEZpbGUgPC0gcGFzdGUwKCJib21fIixzdHJfcmVwbGFjZShmaWxlLCIucmRzIiwiIikpDQogICAgICAgICAgICBpZiAoIWV4aXN0cyhJbXBvcnRGaWxlKSkgew0KICAgICAgICAgICAgICAgIGFzc2lnbihJbXBvcnRGaWxlLCByZWFkUkRTKHBhc3RlMChnZXR3ZCgpLCAiL2RhdGEvQk9NLyIsIGZpbGUpKSkNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmIChJbXBvcnRGaWxlICU+JSBnZXQoKSAlPiUgaXMuZ3JvdXBlZF9kZigpKSB7DQogICAgICAgICAgICAgICAgYXNzaWduKEltcG9ydEZpbGUsIEltcG9ydEZpbGUgJT4lIGdldCgpICU+JSB1bmdyb3VwKCkpDQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9IGVsc2Ugew0KICAgICAgICBkZV9kdXBsaWNhdGVfYW5kX2VuaGFuY2Vfd2VhdGhlcl9zdGF0aW9uX2RhdGEoKQ0KICAgICAgICBkZV9kdXBsaWNhdGVfbWluX3RlbXAoKQ0KICAgICAgICBkZV9kdXBsaWNhdGVfbWF4X3RlbXAoKQ0KICAgICAgICBkZV9kdXBsaWNhdGVfcmFpbmZhbGxfZGF0YSgpDQogICAgICAgIGRlX2R1cGxpY2F0ZV9zb2xhcl9leHBvc3VyZV9kYXRhKCkNCiAgICB9DQogICAgDQogICAgIyBDbGVhbiB1cA0KICAgIHJtKGZpbGUsIEltcG9ydEZpbGVzLCBJbXBvcnRGaWxlKQ0KfQ0KYGBgDQoNCmBgYHtyIEZJWCBCT00gSm9pbiBUZW1wZXJhdHVyZSBEYXRhLCBlY2hvPUZBTFNFLCBldmFsPUZBTFNFLCByZXN1bHRzPSJoaWRlIn0NCg0KaWYgKEZBTFNFKSB7DQogICAgIyBSZXZpZXcgdGhlIGRhdGENCiAgICBnbGltcHNlKGJvbV9kYWlseV9tYXhpbXVtX3RlbXBlcmF0dXJlX3YyKQ0KICAgIGdsaW1wc2UoYm9tX2RhaWx5X21pbmltdW1fdGVtcGVyYXR1cmVfdjIpDQogICAgDQogICAgIyBQcm92ZSBpZiBhbGwgY29sdW1uIG5hbWVzIG1hdGNoDQogICAgYWxsKG5hbWVzKGJvbV9kYWlseV9tYXhpbXVtX3RlbXBlcmF0dXJlX3YyKSA9PSBuYW1lcyhib21fZGFpbHlfbWluaW11bV90ZW1wZXJhdHVyZV92MikpDQogICAgDQogICAgIyBSZXZpZXcgdGhlIGRpbWVuc2lvbnMNCiAgICBEYXRhRnJhbWVEaW1lbnNpb25zKGMoImJvbV9kYWlseV9tYXhpbXVtX3RlbXBlcmF0dXJlIiwiYm9tX2RhaWx5X21pbmltdW1fdGVtcGVyYXR1cmUiKSkNCiAgICAjIFlvdSdsbCBmaW5kIHRoYXQgdGhleSBhcmUgYm90aCBuZWFybHkgMTBtaWxsaW9uIHJlY29yZHMgbG9uZy4gVGhpcyBpcyB0b28gbXVjaCBkYXRhIHRvIGhhbmRsZS4NCiAgICANCiAgICAjIFJldmlldyB0aGUgbWluICYgbWF4IG9mIGVhY2guDQogICAgYm9tX2RhaWx5X21heGltdW1fdGVtcGVyYXR1cmVfdjIgJT4lIA0KICAgICAgICBzZWxlY3QoeWVhcikgJT4lIA0KICAgICAgICByYW5nZSgpDQogICAgYm9tX2RhaWx5X21pbmltdW1fdGVtcGVyYXR1cmVfdjIgJT4lIA0KICAgICAgICBzZWxlY3QoeWVhcikgJT4lIA0KICAgICAgICByYW5nZSgpDQogICAgIyBZb3UnbGwgZmluZCB0aGV5IGJvdGggZ28gYmFjayB0byAxODU5LiBXZSdsbCBuZWVkIHRvIHJlZHVjZSB0aGlzIHRvIGp1c3QgdGhlIGxhc3QgMTAgeWVhcnMuDQogICAgDQogICAgIyBNYW5pcHVsYXRlIHRoZSBmcmFtZXMNCiAgICBib21fZGFpbHlfbWF4X3RlbXAgPC0gYm9tX2RhaWx5X21heGltdW1fdGVtcGVyYXR1cmVfdjIgJT4lICAgICAgIzwtLSBSZS1kZWZpbmUgdGhlIG9yaWdpbmFsIGZyYW1lDQogICAgICAgIHNlbGVjdCgtcHJvZHVjdF9jb2RlLC1xdWFsaXR5KSAlPiUgICAgICAgICAgICAgICAgICAgICAgICAgICM8LS0gV2UgZG9uJ3QgbmVlZCB0aGVzZSBmaWVsZHMNCiAgICAgICAgZmlsdGVyKHllYXI+MjAwOCkgJT4lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIzwtLSBSZWR1Y2UgdGhlIHNpemUgb2YgdGhlIGZyYW1lcyBjb25zaWRlcmFibHkNCiAgICAgICAgcmVuYW1lKG1heF9kYXlzX29mX2FjY3VtdWxhdGlvbiA9IGRheXNfb2ZfYWNjdW11bGF0aW9uKSAlPiUgIzwtLSBSZW5hbWUgdG8gbWFrZSBpdCBlYXNpZXIgdG8gcmVhZCBwb3N0LWpvaW4NCiAgICAgICAgbXV0YXRlKCBqb2luID0gcGFzdGUoc3RhdGlvbl9pZCx5ZWFyLG1vbnRoLGRheSxzZXA9Il8iKSAgICAgIzwtLSBUaGlzIGlzIHRoZSBmaWVsZCB0aGF0IHdlIHdpbGwgam9pbiBvbg0KICAgICAgICAgICAgICAsIGRhdGUgPSBhcy5EYXRlKHBhc3RlKHllYXIsbW9udGgsZGF5LHNlcD0iLyIpKSAgICAgICAjPC0tIEFkZCB0aGlzIGZpZWxkIHRvIHRoZW4gcmVtb3ZlIHRocmVlIG90aGVyIGZpZWxkcw0KICAgICAgICAgICAgICApICU+JSANCiAgICAgICAgc2VsZWN0KC15ZWFyLC1tb250aCwtZGF5KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIzwtLSBDbGVhbiB0aGUgdW53YW50ZWQgZmllbGRzDQogICAgDQogICAgYm9tX2RhaWx5X21pbl90ZW1wIDwtIGJvbV9kYWlseV9taW5pbXVtX3RlbXBlcmF0dXJlX3YyICU+JSAgICAgICM8LS0gUmVwbGljYXRlIHRoZXNlIHN0ZXBzIG92ZXIgdGhlIG90aGVyIHRlbXAgZnJhbWUNCiAgICAgICAgc2VsZWN0KC1wcm9kdWN0X2NvZGUsLXF1YWxpdHkpICU+JSANCiAgICAgICAgZmlsdGVyKHllYXI+MjAwOCkgJT4lIA0KICAgICAgICByZW5hbWUobWluX2RheXNfb2ZfYWNjdW11bGF0aW9uID0gZGF5c19vZl9hY2N1bXVsYXRpb24pICU+JSANCiAgICAgICAgbXV0YXRlKCBqb2luID0gcGFzdGUoc3RhdGlvbl9pZCx5ZWFyLG1vbnRoLGRheSxzZXA9Il8iKQ0KICAgICAgICAgICAgICwgZGF0ZSA9IGFzLkRhdGUocGFzdGUoeWVhcixtb250aCxkYXksc2VwPSIvIikpDQogICAgICAgICAgICAgKSAlPiUgDQogICAgICAgIHNlbGVjdCgteWVhciwtbW9udGgsLWRheSkNCiAgICANCiAgICAjIEpvaW4gdGhlbSB0b2dldGhlcg0KICAgIGJvbV9kYWlseV90ZW1wZXJhdHVyZSA8LSBib21fZGFpbHlfbWluX3RlbXAgJT4lIA0KICAgICAgICBmdWxsX2pvaW4oYm9tX2RhaWx5X21heF90ZW1wICU+JSBzZWxlY3QoLXN0YXRpb25faWQsLWRhdGUpLCBieT0iam9pbiIpICU+JSANCiAgICAgICAgc2VsZWN0KHN0YXRpb25faWQsZGF0ZSxldmVyeXRoaW5nKCksLWpvaW4pDQogICAgDQogICAgIyBSZS1jaGVjayB0aGUgZGltZW5zaW9ucw0KICAgIERhdGFGcmFtZURpbWVuc2lvbnMoImJvbV9kYWlseV90ZW1wZXJhdHVyZSIpDQp9DQpgYGANCg0KYGBge3IgTE9BRCBEYXRhLCBlY2hvPUZBTFNFLCBldmFsPVRSVUV9DQojIExvYWQgYWxsIGRhdGEgLS0tLQ0KZmlsZXMgPC0gbGlzdCggQUVNTz1jKCJhZW1vX0NvbnNvbGlkYXRlZCIpDQogICAgICAgICAgICAgLCBCT009YygiYm9tX0RhaWx5TWF4VGVtcCINCiAgICAgICAgICAgICAgICAgICAgLCJib21fRGFpbHlNaW5UZW1wIg0KICAgICAgICAgICAgICAgICAgICAsImJvbV9EYWlseVJhaW5mYWxsIg0KICAgICAgICAgICAgICAgICAgICAsImJvbV9EYWlseVNvbGFyRXhwb3N1cmUiDQogICAgICAgICAgICAgICAgICAgICwiYm9tX1NvbGFyRmFybXMiDQogICAgICAgICAgICAgICAgICAgICwiYm9tX1dlYXRoZXJTdGF0aW9ucyINCiAgICAgICAgICAgICAgICAgICAgLCJib21fV2luZEZhcm1zIg0KICAgICAgICAgICAgICAgICAgICApDQogICAgICAgICAgICAgLCBFbmVyZ3lNYXJrZXQ9YygiZW5nX0Z1ZWxNaXhDYWxlbmRhciINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCJlbmdfRnVlbE1peEZpbmFuY2lhbCINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQ0KICAgICAgICAgICAgICkNCmNhdGVnIDwtICJBRU1PIg0KZm9yIChmaWxlIGluIGZpbGVzW1tjYXRlZ11dKSB7DQogICAgICAgIGFzc2lnbihmaWxlLCByZWFkX3JkcyhwYXN0ZTAoZ2V0d2QoKSwgIi9EYXRhLyIsIGNhdGVnLCAiLyIsIGZpbGUsICIucmRzIikpKQ0KICAgIH0NCmZvciAoY2F0ZWdvcnkgaW4gbmFtZXMoZmlsZXMpKSB7DQogICAgZm9yIChmaWxlIGluIGZpbGVzW1tjYXRlZ29yeV1dKSB7DQogICAgICAgIGFzc2lnbihmaWxlLCByZWFkX3JkcyhwYXN0ZTAoZ2V0d2QoKSwgIi9EYXRhLyIsIGNhdGVnb3J5LCAiLyIsIGZpbGUsICIucmRzIikpKQ0KICAgIH0NCn0NCnJtKGZpbGVzLCBjYXRlZ29yeSwgZmlsZSwgY2F0ZWcpDQoNCmFzc2lnbigiYWVtb19Db25zb2xpZGF0ZWQiLCByZWFkX3JkcyhwYXN0ZTAoZ2V0d2QoKSwgIi9EYXRhL0FFTU8vYWVtb19Db25zb2xpZGF0ZWRPbGQucmRzIikpKQ0KDQpgYGANCg0KYGBge3IgRklYIERhdGEsIGVjaG89RkFMU0UsIGV2YWw9RkFMU0UsIHJlc3VsdHM9ImhpZGUiLCByb3dzLnByaW50PTUwLCBjb2xzLnByaW50PTMwLCBmaWcud2lkdGg9MTAsIGZpZy5oZWlnaHQ9NX0NCiMgU2tpcCB0aGUgbmV4dCBiaXQuIFRoZSAuUkRTJ3MgYXJlIHNldCB1cCBhcyBuZWVkZWQuIA0KaWYgKEZBTFNFKSB7DQogIA0KICAgICMgRml4IEJPTSBkYXRhIC0tLS0NCiAgICANCiAgICBpZiAoRkFMU0UpIHsNCiAgICAgICAgIyBGaXggTWF4IFRlbXAgLS0tLQ0KICAgICAgICBib21fRGFpbHlNYXhUZW1wICU8PiUgDQogICAgICAgICAgICBzZWxlY3QoLXByb2R1Y3RfY29kZSwtcXVhbGl0eSwtZGF5c19vZl9hY2N1bXVsYXRpb24pICU+JSANCiAgICAgICAgICAgIGZpbHRlcih5ZWFyPjIwMDgpICU+JSANCiAgICAgICAgICAgIG11dGF0ZSggam9pbiA9IHBhc3RlKHN0YXRpb25faWQseWVhcixtb250aCxkYXksc2VwPSJfIikgDQogICAgICAgICAgICAgICAgICAsIGRhdGUgPSBhcy5EYXRlKHBhc3RlKHllYXIsbW9udGgsZGF5LHNlcD0iLyIpKSANCiAgICAgICAgICAgICAgICAgICwgbW9udGhfaWQgPSBwYXN0ZTAoIGRhdGUgJT4lIHltZCAlPiUgeWVhciAlPiUgYXMuY2hhcmFjdGVyDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCBkYXRlICU+JSB5bWQgJT4lIG1vbnRoICU+JSBzdHJfcGFkKHdpZHRoPTIscGFkPSIwIikNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApDQogICAgICAgICAgICAgICAgICApICU+JSANCiAgICAgICAgICAgIHNlbGVjdCgteWVhciwtbW9udGgsLWRheSkNCiAgICAgICAgDQogICAgICAgICMgRml4IE1pbiBUZW1wIC0tLS0NCiAgICAgICAgYm9tX0RhaWx5TWluVGVtcCAlPD4lIA0KICAgICAgICAgICAgc2VsZWN0KC1wcm9kdWN0X2NvZGUsLXF1YWxpdHksLWRheXNfb2ZfYWNjdW11bGF0aW9uKSAlPiUgDQogICAgICAgICAgICBmaWx0ZXIoeWVhcj4yMDA4KSAlPiUgDQogICAgICAgICAgICBtdXRhdGUoIGpvaW4gPSBwYXN0ZShzdGF0aW9uX2lkLHllYXIsbW9udGgsZGF5LHNlcD0iXyIpDQogICAgICAgICAgICAgICAgICAsIGRhdGUgPSBhcy5EYXRlKHBhc3RlKHllYXIsbW9udGgsZGF5LHNlcD0iLyIpKQ0KICAgICAgICAgICAgICAgICAgLCBtb250aF9pZCA9IHBhc3RlMCggZGF0ZSAlPiUgeW1kICU+JSB5ZWFyICU+JSBhcy5jaGFyYWN0ZXINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsIGRhdGUgJT4lIHltZCAlPiUgbW9udGggJT4lIHN0cl9wYWQod2lkdGg9MixwYWQ9IjAiKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkNCiAgICAgICAgICAgICAgICAgKSAlPiUgDQogICAgICAgICAgICBzZWxlY3QoLXllYXIsLW1vbnRoLC1kYXkpDQogICAgICAgIA0KICAgICAgICAjIEZpeCBSYWluZmFsbCAtLS0tDQogICAgICAgIGJvbV9EYWlseVJhaW5mYWxsICU8PiUgDQogICAgICAgICAgICBzZWxlY3QoLXByb2R1Y3RfY29kZSwtcXVhbGl0eSwtZGF5c19vZl9hY2N1bXVsYXRpb24pICU+JSANCiAgICAgICAgICAgIGZpbHRlcih5ZWFyPjIwMDgpICU+JQ0KICAgICAgICAgICAgbXV0YXRlKCBqb2luID0gcGFzdGUoc3RhdGlvbl9pZCx5ZWFyLG1vbnRoLGRheSxzZXA9Il8iKQ0KICAgICAgICAgICAgICAgICAgLCBkYXRlID0gYXMuRGF0ZShwYXN0ZSh5ZWFyLG1vbnRoLGRheSxzZXA9Ii8iKSkNCiAgICAgICAgICAgICAgICAgICwgbW9udGhfaWQgPSBwYXN0ZTAoIGRhdGUgJT4lIHltZCAlPiUgeWVhciAlPiUgYXMuY2hhcmFjdGVyDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCBkYXRlICU+JSB5bWQgJT4lIG1vbnRoICU+JSBzdHJfcGFkKHdpZHRoPTIscGFkPSIwIikNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApDQogICAgICAgICAgICAgICAgICkgJT4lIA0KICAgICAgICAgICAgc2VsZWN0KC15ZWFyLC1tb250aCwtZGF5KQ0KICAgICAgICANCiAgICAgICAgIyBGaXggU29sYXIgRXhwb3N1cmUgLS0tLQ0KICAgICAgICBib21fRGFpbHlTb2xhckV4cG9zdXJlICU8PiUgDQogICAgICAgICAgICBzZWxlY3QoLXByb2R1Y3RfY29kZSkgJT4lIA0KICAgICAgICAgICAgZmlsdGVyKHllYXI+MjAwOCkgJT4lIA0KICAgICAgICAgICAgcmVuYW1lKHNvbGFyX2V4cG9zdXJlID0gZ2xvYmFsX3NvbGFyX2V4cG9zdXJlKSAlPiUgDQogICAgICAgICAgICBtdXRhdGUoIGpvaW4gPSBwYXN0ZShzdGF0aW9uX2lkLHllYXIsbW9udGgsZGF5LHNlcD0iXyIpDQogICAgICAgICAgICAgICAgICAsIGRhdGUgPSBhcy5EYXRlKHBhc3RlKHllYXIsbW9udGgsZGF5LHNlcD0iLyIpKQ0KICAgICAgICAgICAgICAgICAgLCBtb250aF9pZCA9IHBhc3RlMCggZGF0ZSAlPiUgeW1kICU+JSB5ZWFyICU+JSBhcy5jaGFyYWN0ZXINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsIGRhdGUgJT4lIHltZCAlPiUgbW9udGggJT4lIHN0cl9wYWQod2lkdGg9MixwYWQ9IjAiKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkNCiAgICAgICAgICAgICAgICAgKSAlPiUgDQogICAgICAgICAgICBzZWxlY3QoLXllYXIsLW1vbnRoLC1kYXkpDQogICAgDQogICAgfQ0KICAgIA0KICAgIA0KICAgICMgRml4IEFFTU8gZGF0YSAtLS0tDQogICAgYWVtb19Db25zb2xpZGF0ZWQgJTw+JSANCiAgICAgICAgcmVuYW1lX2FsbChmdW5zKHN0cl90b19sb3dlciguKSkpICU+JSANCiAgICAgICAgcmVuYW1lKCBzdGF0ZSA9IHJlZ2lvbg0KICAgICAgICAgICAgICAsIHRvdF9kZW1hbmQgPSB0b3RhbGRlbWFuZA0KICAgICAgICAgICAgICAsIHByaWNlID0gcnJwDQogICAgICAgICAgICAgICwgc3RyX2RhdGV0aW1lID0gc2V0dGxlbWVudGRhdGUNCiAgICAgICAgICAgICAgKSAlPiUgDQogICAgICAgIHNlbGVjdCgtcGVyaW9kdHlwZSkgJT4lDQogICAgICAgIHNlcGFyYXRlKHN0cl9kYXRldGltZSwgYygic3RyX2RhdGUiLCJzdHJfdGltZSIpLCBzZXA9IiAiLCByZW1vdmU9RikgJT4lIA0KICAgICAgICBtdXRhdGUoIHN0YXRlID0gc3RyX3JlcGxhY2Uoc3RhdGUsIjEiLCIiKQ0KICAgICAgICAgICAgICAsIHN0cl9kYXRldGltZSA9IGlmZWxzZShzdHJfbGVuZ3RoKHN0cl9kYXRldGltZT4xNiksIHN0cl9sZWZ0KHN0cl9kYXRldGltZSwxNiksIHN0cl9kYXRldGltZSkNCiAgICAgICAgICAgICAgLCBkYXRldGltZSA9IHltZF9obShzdHJfZGF0ZXRpbWUpDQogICAgICAgICAgICAgICwgZGF0ZSA9IHltZChzdHJfZGF0ZSkNCiAgICAgICAgICAgICAgKSAlPiUgDQogICAgICAgICMgZmlsdGVyKHllYXIoZGF0ZSk+MjAwOCkgJT4lIA0KICAgICAgICByZW5hbWUodGltZT1zdHJfdGltZSwgZGVtYW5kPXRvdF9kZW1hbmQpICU+JSANCiAgICAgICAgc2VsZWN0KHN0YXRlLGRhdGUsdGltZSxkZW1hbmQscHJpY2UpDQogICAgDQp9DQpgYGANCg0KDQo8IS0tIFNldCBVcCBEYXRhIC0tPg0KDQpgYGB7ciBBRU1POiBTZXQgVXAsIGVjaG89RkFMU0UsIGV2YWw9VFJVRSwgcmVzdWx0cz1GQUxTRSwgaW5jbHVkZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCiMgTWFzdGVyIC0tLS0NCmFlbW9fTWFzdGVyIDwtIGFlbW9fQ29uc29saWRhdGVkICU+JQ0KICAgIG11dGF0ZShtb250aF9pZD1wYXN0ZTAoZGF0ZSAlPiUgeW1kICU+JSB5ZWFyICU+JSBhcy5jaGFyYWN0ZXINCiAgICAgICAgICAgICAgICAgICAgICAgICAgLGRhdGUgJT4lIHltZCAlPiUgbW9udGggJT4lIHN0cl9wYWQod2lkdGg9MixwYWQ9IjAiKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICApDQogICAgICAgICAgLHdlZWtfaWQ9cGFzdGUwKGRhdGUgJT4lIHltZCAlPiUgeWVhciAlPiUgYXMuY2hhcmFjdGVyDQogICAgICAgICAgICAgICAgICAgICAgICAgLGRhdGUgJT4lIHltZCAlPiUgd2VlayAlPiUgc3RyX3BhZCh3aWR0aD0yLHBhZD0iMCIpDQogICAgICAgICAgICAgICAgICAgICAgICAgKQ0KICAgICAgICAgICx5ZWFyX2lkPXBhc3RlMChkYXRlICU+JSB5bWQgJT4lIHllYXIgJT4lIGFzLmNoYXJhY3RlcikNCiAgICAgICAgICApICU+JSANCiAgICAjIGZpbHRlcih5ZWFyX2lkID4gMjAwOCkgJT4lIA0KICAgIHNlbGVjdChzdGF0ZSx5ZWFyX2lkLG1vbnRoX2lkLHdlZWtfaWQsZXZlcnl0aGluZygpKSANCg0KDQojIFllYXJseSAtLS0tDQphZW1vX1llYXJseSA8LSBhZW1vX01hc3RlciAlPiUgDQogICAgZ3JvdXBfYnkoc3RhdGUseWVhcl9pZCkgJT4lIA0KICAgIHN1bW1hcmlzZShtaW5fZGVtYW5kPW1pbihkZW1hbmQpDQogICAgICAgICAgICAgLG1heF9kZW1hbmQ9bWF4KGRlbWFuZCkNCiAgICAgICAgICAgICAscm5nX2RlbWFuZD1kaWZmKHJhbmdlKGRlbWFuZCkpDQogICAgICAgICAgICAgLGF2Z19kZW1hbmQ9bWVhbihkZW1hbmQpDQogICAgICAgICAgICAgLG1pbl9wcmljZT1taW4ocHJpY2UpDQogICAgICAgICAgICAgLG1heF9wcmljZT1tYXgocHJpY2UpDQogICAgICAgICAgICAgLHJuZ19wcmljZT1kaWZmKHJhbmdlKHByaWNlKSkNCiAgICAgICAgICAgICAsYXZnX3ByaWNlPW1lYW4ocHJpY2UpDQogICAgICAgICAgICAgKSAlPiUgDQogICAgdW5ncm91cCgpDQoNCg0KIyBNb250aGx5IC0tLS0NCmFlbW9fTW9udGhseSA8LSBhZW1vX01hc3RlciAlPiUgDQogICAgZ3JvdXBfYnkoc3RhdGUsbW9udGhfaWQpICU+JSANCiAgICBzdW1tYXJpc2UobWluX2RlbWFuZD1taW4oZGVtYW5kKQ0KICAgICAgICAgICAgICxtYXhfZGVtYW5kPW1heChkZW1hbmQpDQogICAgICAgICAgICAgLHJuZ19kZW1hbmQ9ZGlmZihyYW5nZShkZW1hbmQpKQ0KICAgICAgICAgICAgICxhdmdfZGVtYW5kPW1lYW4oZGVtYW5kKQ0KICAgICAgICAgICAgICxtaW5fcHJpY2U9bWluKHByaWNlKQ0KICAgICAgICAgICAgICxtYXhfcHJpY2U9bWF4KHByaWNlKQ0KICAgICAgICAgICAgICxybmdfcHJpY2U9ZGlmZihyYW5nZShwcmljZSkpDQogICAgICAgICAgICAgLGF2Z19wcmljZT1tZWFuKHByaWNlKQ0KICAgICAgICAgICAgICkgJT4lIA0KICAgIHVuZ3JvdXAoKQ0KDQoNCiMgU2V0IEFFTU8gV2Vla2x5IC0tLS0NCmFlbW9fV2Vla2x5IDwtIGFlbW9fTWFzdGVyICU+JQ0KICAgIGdyb3VwX2J5KHN0YXRlLHdlZWtfaWQpICU+JSANCiAgICBzdW1tYXJpc2UobWluX2RlbWFuZD1taW4oZGVtYW5kKQ0KICAgICAgICAgICAgICxtYXhfZGVtYW5kPW1heChkZW1hbmQpDQogICAgICAgICAgICAgLHJuZ19kZW1hbmQ9ZGlmZihyYW5nZShkZW1hbmQpKQ0KICAgICAgICAgICAgICxhdmdfZGVtYW5kPW1lYW4oZGVtYW5kKQ0KICAgICAgICAgICAgICxtaW5fcHJpY2U9bWluKHByaWNlKQ0KICAgICAgICAgICAgICxtYXhfcHJpY2U9bWF4KHByaWNlKQ0KICAgICAgICAgICAgICxybmdfcHJpY2U9ZGlmZihyYW5nZShwcmljZSkpDQogICAgICAgICAgICAgLGF2Z19wcmljZT1tZWFuKHByaWNlKQ0KICAgICAgICAgICAgICkgJT4lIA0KICAgIHVuZ3JvdXAoKQ0KDQoNCiMgVFNERidzIC0tLS0NCiMgRGVjaWRlIEZlYXR1cmVzDQojIEZlYXR1cmVzIDwtIGMoImF2Z19wcmljZSIpDQpGZWF0dXJlcyA8LSBjKCJhdmdfcHJpY2UiLCJybmdfcHJpY2UiKQ0KIyBGZWF0dXJlcyA8LSBjKCJhdmdfcHJpY2UiLCJybmdfcHJpY2UiLCJhdmdfZGVtYW5kIiwicm5nX2RlbWFuZCIpDQoNCmZvciAoRmVhdHVyZSBpbiBGZWF0dXJlcykgew0KICAgIA0KICAgICMgWWVhcmx5IC0tLS0NCiAgICBhc3NpZ24ocGFzdGUoImFlbW9fWWVhcmx5VFNERiIsRmVhdHVyZSxzZXA9Il8iKQ0KICAgICAgICAgICxhZW1vX1llYXJseSAlPiUNCiAgICAgICAgICAgICAgZmlsdGVyKHN0YXRlICVpbiUgYygiTlNXIiwiVklDIiwiUUxEIiwiU0EiKSkgJT4lIA0KICAgICAgICAgICAgICBzZWxlY3Qoc3RhdGUsRmVhdHVyZSx5ZWFyX2lkKSAlPiUgDQogICAgICAgICAgICAgIChmdW5jdGlvbih4KSB7DQogICAgICAgICAgICAgICAgICBzdGF0ZXMgPC0geCAlPiUgDQogICAgICAgICAgICAgICAgICAgICAgc2VsZWN0KHN0YXRlKSAlPiUgDQogICAgICAgICAgICAgICAgICAgICAgZGlzdGluY3QoKSAlPiUgDQogICAgICAgICAgICAgICAgICAgICAgcHVsbCgpDQogICAgICAgICAgICAgICAgICBkZl9yZXR1cm4gPC0geCAlPiUgDQogICAgICAgICAgICAgICAgICAgICAgc2VsZWN0KHllYXJfaWQpICU+JSANCiAgICAgICAgICAgICAgICAgICAgICBkaXN0aW5jdCgpDQogICAgICAgICAgICAgICAgICBmb3IgKHN0cl9zdGF0ZSBpbiBzdGF0ZXMpIHsNCiAgICAgICAgICAgICAgICAgICAgICBkZl9yZXR1cm4gPC0geCAlPiUgDQogICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcihzdGF0ZT09c3RyX3N0YXRlKSAlPiUgDQogICAgICAgICAgICAgICAgICAgICAgICAgIHJlbmFtZV9hdCh2YXJzKHN0YXJ0c193aXRoKCJhdmciKSksIGZ1bnMocGFzdGUwKHN0cl9zdGF0ZSkpKSAlPiUgDQogICAgICAgICAgICAgICAgICAgICAgICAgIHJlbmFtZV9hdCh2YXJzKHN0YXJ0c193aXRoKCJybmciKSksIGZ1bnMocGFzdGUwKHN0cl9zdGF0ZSkpKSAlPiUgDQogICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdCgtc3RhdGUpICU+JSANCiAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmdF9qb2luKHg9ZGZfcmV0dXJuLCB5PS4sIGJ5PSJ5ZWFyX2lkIikNCiAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICByZXR1cm4oZGZfcmV0dXJuKQ0KICAgICAgICAgICAgICAgICAgfSkgJT4lIA0KICAgICAgICAgICAgICBhcnJhbmdlKHllYXJfaWQpICU+JSANCiAgICAgICAgICAgICAgc2VsZWN0KC15ZWFyX2lkKQ0KICAgICAgICAgICkNCiAgICANCiAgICANCiAgICAjIE1vbnRobHkgLS0tLQ0KICAgIGFzc2lnbihwYXN0ZSgiYWVtb19Nb250aGx5VFNERiIsRmVhdHVyZSxzZXA9Il8iKQ0KICAgICAgICAgICxhZW1vX01vbnRobHkgJT4lIA0KICAgICAgICAgICAgICBmaWx0ZXIoc3RhdGUgJWluJSBjKCJOU1ciLCJWSUMiLCJRTEQiLCJTQSIpKSAlPiUgDQogICAgICAgICAgICAgIHNlbGVjdChzdGF0ZSxGZWF0dXJlLG1vbnRoX2lkKSAlPiUgDQogICAgICAgICAgICAgIChmdW5jdGlvbih4KSB7DQogICAgICAgICAgICAgICAgICBzdGF0ZXMgPC0geCAlPiUgDQogICAgICAgICAgICAgICAgICAgICAgc2VsZWN0KHN0YXRlKSAlPiUgDQogICAgICAgICAgICAgICAgICAgICAgZGlzdGluY3QoKSAlPiUgDQogICAgICAgICAgICAgICAgICAgICAgcHVsbCgpDQogICAgICAgICAgICAgICAgICBkZl9yZXR1cm4gPC0geCAlPiUgDQogICAgICAgICAgICAgICAgICAgICAgc2VsZWN0KG1vbnRoX2lkKSAlPiUgDQogICAgICAgICAgICAgICAgICAgICAgZGlzdGluY3QoKQ0KICAgICAgICAgICAgICAgICAgZm9yIChzdHJfc3RhdGUgaW4gc3RhdGVzKSB7DQogICAgICAgICAgICAgICAgICAgICAgZGZfcmV0dXJuIDwtIHggJT4lIA0KICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIoc3RhdGU9PXN0cl9zdGF0ZSkgJT4lIA0KICAgICAgICAgICAgICAgICAgICAgICAgICByZW5hbWVfYXQodmFycyhzdGFydHNfd2l0aCgiYXZnIikpLCBmdW5zKHBhc3RlMChzdHJfc3RhdGUpKSkgJT4lDQogICAgICAgICAgICAgICAgICAgICAgICAgIHJlbmFtZV9hdCh2YXJzKHN0YXJ0c193aXRoKCJybmciKSksIGZ1bnMocGFzdGUwKHN0cl9zdGF0ZSkpKSAlPiUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0KC1zdGF0ZSkgJT4lIA0KICAgICAgICAgICAgICAgICAgICAgICAgICBsZWZ0X2pvaW4oeD1kZl9yZXR1cm4sIHk9LiwgYnk9Im1vbnRoX2lkIikNCiAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICByZXR1cm4oZGZfcmV0dXJuKQ0KICAgICAgICAgICAgICAgICAgfSkgJT4lIA0KICAgICAgICAgICAgICBhcnJhbmdlKG1vbnRoX2lkKSAlPiUgDQogICAgICAgICAgICAgIHNlbGVjdCgtbW9udGhfaWQpDQogICAgICAgICAgKQ0KICAgIA0KICAgIA0KICAgICMgV2Vla2x5IC0tLS0NCiAgICBhc3NpZ24ocGFzdGUoImFlbW9fV2Vla2x5VFNERiIsRmVhdHVyZSxzZXA9Il8iKQ0KICAgICAgICAgICxhZW1vX1dlZWtseSAlPiUNCiAgICAgICAgICAgICAgZmlsdGVyKHN0YXRlICVpbiUgYygiTlNXIiwiVklDIiwiUUxEIiwiU0EiKSkgJT4lIA0KICAgICAgICAgICAgICBzZWxlY3Qoc3RhdGUsRmVhdHVyZSx3ZWVrX2lkKSAlPiUgDQogICAgICAgICAgICAgIChmdW5jdGlvbih4KSB7DQogICAgICAgICAgICAgICAgICBzdGF0ZXMgPC0geCAlPiUgDQogICAgICAgICAgICAgICAgICAgICAgc2VsZWN0KHN0YXRlKSAlPiUgDQogICAgICAgICAgICAgICAgICAgICAgZGlzdGluY3QoKSAlPiUgDQogICAgICAgICAgICAgICAgICAgICAgcHVsbCgpDQogICAgICAgICAgICAgICAgICBkZl9yZXR1cm4gPC0geCAlPiUgDQogICAgICAgICAgICAgICAgICAgICAgc2VsZWN0KHdlZWtfaWQpICU+JSANCiAgICAgICAgICAgICAgICAgICAgICBkaXN0aW5jdCgpDQogICAgICAgICAgICAgICAgICBmb3IgKHN0cl9zdGF0ZSBpbiBzdGF0ZXMpIHsNCiAgICAgICAgICAgICAgICAgICAgICBkZl9yZXR1cm4gPC0geCAlPiUgDQogICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcihzdGF0ZT09c3RyX3N0YXRlKSAlPiUgDQogICAgICAgICAgICAgICAgICAgICAgICAgIHJlbmFtZV9hdCh2YXJzKHN0YXJ0c193aXRoKCJhdmciKSksIGZ1bnMocGFzdGUwKHN0cl9zdGF0ZSkpKSAlPiUgDQogICAgICAgICAgICAgICAgICAgICAgICAgIHJlbmFtZV9hdCh2YXJzKHN0YXJ0c193aXRoKCJybmciKSksIGZ1bnMocGFzdGUwKHN0cl9zdGF0ZSkpKSAlPiUgDQogICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdCgtc3RhdGUpICU+JSANCiAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmdF9qb2luKHg9ZGZfcmV0dXJuLCB5PS4sIGJ5PSJ3ZWVrX2lkIikNCiAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICByZXR1cm4oZGZfcmV0dXJuKQ0KICAgICAgICAgICAgICAgICAgfSkgJT4lIA0KICAgICAgICAgICAgICBhcnJhbmdlKHdlZWtfaWQpICU+JSANCiAgICAgICAgICAgICAgc2VsZWN0KC13ZWVrX2lkKQ0KICAgICAgICAgICkNCiAgICANCn0NCg0KDQojIFRTJ3MgLS0tLQ0KZm9yIChGZWF0dXJlIGluIEZlYXR1cmVzKSB7DQogICAgDQogICAgIyBZZWFybHkgLS0tLQ0KICAgIGFzc2lnbihwYXN0ZSgiYWVtb19ZZWFybHlUUyIsRmVhdHVyZSxzZXA9Il8iKQ0KICAgICAgICAgICxwYXN0ZSgiYWVtb19ZZWFybHlUU0RGIixGZWF0dXJlLHNlcD0iXyIpICU+JSANCiAgICAgICAgICAgICAgZ2V0KCkgJT4lIA0KICAgICAgICAgICAgICBhcy5tYXRyaXgoKSAlPiUgDQogICAgICAgICAgICAgIHRzKHN0YXJ0PWMoMTk5OSwxKSxmcmVxdWVuY3k9MSkNCiAgICAgICAgICApDQogICAgDQogICAgIyBNb250aGx5IC0tLS0NCiAgICBhc3NpZ24ocGFzdGUoImFlbW9fTW9udGhseVRTIixGZWF0dXJlLHNlcD0iXyIpDQogICAgICAgICAgLHBhc3RlKCJhZW1vX01vbnRobHlUU0RGIixGZWF0dXJlLHNlcD0iXyIpICU+JQ0KICAgICAgICAgICAgICBnZXQoKSAlPiUgDQogICAgICAgICAgICAgIGFzLm1hdHJpeCgpICU+JSANCiAgICAgICAgICAgICAgdHMoc3RhcnQ9YygxOTk5LDEpLGZyZXF1ZW5jeT0xMikNCiAgICAgICAgICApDQogICAgDQogICAgIyBXZWVrbHkgLS0tLQ0KICAgIGFzc2lnbihwYXN0ZSgiYWVtb19XZWVrbHlUUyIsRmVhdHVyZSxzZXA9Il8iKQ0KICAgICAgICAgICxwYXN0ZSgiYWVtb19XZWVrbHlUU0RGIixGZWF0dXJlLHNlcD0iXyIpICU+JSANCiAgICAgICAgICAgICAgZ2V0KCkgJT4lIA0KICAgICAgICAgICAgICBhcy5tYXRyaXgoKSAlPiUgDQogICAgICAgICAgICAgIHRzKHN0YXJ0PWMoMTk5OSwxKSxmcmVxdWVuY3k9NTIpDQogICAgICAgICAgKQ0KICAgIA0KfQ0KDQpgYGANCg0KYGBge3IgQUVNTzogVmFsaWRhdGUsIGVjaG89RkFMU0UsIGV2YWw9VFJVRSwgcmVzdWx0cz1GQUxTRSwgaW5jbHVkZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCiMgQ2hlY2sgZGZzIC0tLS0NCiAgICAjIFllYXJseQ0KICAgIGFlbW9fWWVhcmx5ICU+JSANCiAgICAgICAgbXV0YXRlKHllYXJfaWQ9YXMubnVtZXJpYyh5ZWFyX2lkKSkgJT4lIA0KICAgICAgICBmaWx0ZXIoc3RhdGUgJWluJSBjKCJOU1ciLCJWSUMiLCJRTEQiLCJTQSIpKSAlPiUgDQogICAgICAgIGdyb3VwX2J5KHN0YXRlKSAlPiUgDQogICAgICAgIHN1bW1hcmlzZShtaW49bWluKHllYXJfaWQpDQogICAgICAgICAgICAgICAgICxtYXg9bWF4KHllYXJfaWQpDQogICAgICAgICAgICAgICAgICxudW09bigpDQogICAgICAgICAgICAgICAgICxsZW49bGVuZ3RoKHVuaXF1ZSh5ZWFyX2lkKSkNCiAgICAgICAgICAgICAgICAgKQ0KDQogICAgIyBNb250aGx5DQogICAgYWVtb19Nb250aGx5ICU+JSANCiAgICAgICAgbXV0YXRlKG1vbnRoX2lkPWFzLm51bWVyaWMobW9udGhfaWQpKSAlPiUgDQogICAgICAgIGZpbHRlcihzdGF0ZSAlaW4lIGMoIk5TVyIsIlZJQyIsIlFMRCIsIlNBIikpICU+JSANCiAgICAgICAgZ3JvdXBfYnkoc3RhdGUpICU+JSANCiAgICAgICAgc3VtbWFyaXNlKG1pbj1taW4obW9udGhfaWQpDQogICAgICAgICAgICAgICAgICxtYXg9bWF4KG1vbnRoX2lkKQ0KICAgICAgICAgICAgICAgICAsbnVtPW4oKQ0KICAgICAgICAgICAgICAgICAsbGVuPWxlbmd0aCh1bmlxdWUobW9udGhfaWQpKQ0KICAgICAgICAgICAgICAgICApDQogICAgDQogICAgIyBXZWVrbHkNCiAgICBhZW1vX1dlZWtseSAlPiUgDQogICAgICAgIG11dGF0ZSh3ZWVrX2lkPWFzLm51bWVyaWMod2Vla19pZCkpICU+JSANCiAgICAgICAgZmlsdGVyKHN0YXRlICVpbiUgYygiTlNXIiwiVklDIiwiUUxEIiwiU0EiKSkgJT4lIA0KICAgICAgICBncm91cF9ieShzdGF0ZSkgJT4lIA0KICAgICAgICBzdW1tYXJpc2UobWluPW1pbih3ZWVrX2lkKQ0KICAgICAgICAgICAgICAgICAsbWF4PW1heCh3ZWVrX2lkKQ0KICAgICAgICAgICAgICAgICAsbnVtPW4oKQ0KICAgICAgICAgICAgICAgICAsbGVuPWxlbmd0aCh1bmlxdWUod2Vla19pZCkpDQogICAgICAgICAgICAgICAgICkNCmBgYA0KDQoNCjwhLS0gRmlyc3QgUm91bmQgVmlzdWFsaXNhdGlvbiAtLT4NCg0KYGBge3IgQUVNTzogVmlzdWFsaXNlLCBlY2hvPUZBTFNFLCBldmFsPVRSVUUsIHJlc3VsdHM9RkFMU0UsIGluY2x1ZGU9RkFMU0UsIGZpZy53aWR0aD0xNSwgZmlnLmhlaWdodD0xMH0NCiMgUGxvdCB0cygpIG9iamVjdHMgLS0tLQ0KIyBmb3IgKEZlYXR1cmUgaW4gRmVhdHVyZXMpIHsNCmZvciAoRmVhdHVyZSBpbiBjKCJhdmdfcHJpY2UiKSkgew0KICAgIA0KICAgICMgZm9yIChUaW1lIGluIGMoIlllYXIiLCJNb250aCIsIldlZWsiKSkgew0KICAgIGZvciAoVGltZSBpbiBjKCJNb250aCIpKSB7DQogICAgICAgIA0KICAgICAgICBwcmludChwYXN0ZTAoImFlbW9fIixUaW1lLCJseVRTXyIsRmVhdHVyZSkgJT4lIA0KICAgICAgICAgICAgZ2V0KCkgJT4lIA0KICAgICAgICAgICAgYXV0b3Bsb3QoKSArDQogICAgICAgICAgICBmYWNldF93cmFwKH5zZXJpZXMsIG5jb2w9MSkgKw0KICAgICAgICAgICAgZ2VvbV9zbW9vdGgobWV0aG9kPSJsbSIsIHNpemU9MSkgKw0KICAgICAgICAgICAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcz1zZXEoMTk5OSwgMjAxOSkpICsNCiAgICAgICAgICAgIGdncHVicjo6c3RhdF9yZWdsaW5lX2VxdWF0aW9uKCkgKw0KICAgICAgICAgICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJ0b3AiDQogICAgICAgICAgICAgICAgICxwYW5lbC5ncmlkLm1pbm9yLng9ZWxlbWVudF9ibGFuaygpDQogICAgICAgICAgICAgICAgICkgKw0KICAgICAgICAgICAgbGFicyh0aXRsZT1GZWF0dXJlDQogICAgICAgICAgICAgICAgLHN1YnRpdGxlPXBhc3RlMCgiQnkgU3RhdGUsIEJ5ICIsVGltZSkNCiAgICAgICAgICAgICAgICAseT0iUHJpY2UgKCQvR3dIKSINCiAgICAgICAgICAgICAgICAsY2FwdGlvbj0iU291cmNlPVwiQUVNT1wiIg0KICAgICAgICAgICAgICAgICkpDQogICAgfQ0KICAgIA0KfQ0KIyBOb3RpbmcgdGhhdCBkdWUgdG8gdGhlIGZhY3QgdGhhdCB0aGVyZSBhcmUgbWFueSBvdXRsaWVyIHBvaW50cyBpbiB0aGlzIHBsaXQsIGl0IG5lZWRzIHRvIGJlIHJlY3RpZmllZCB0byBub3JtYWxpc2UgdGhlIHBvaW50cyB0aGF0IGFyZSBvdmVyIDMgc3RhbmRhcmQgZGV2aWF0aW9ucyBhd2F5IGZyb20gdGhlIG1lYW4uDQojIEFsc28sIHRoZSBvcHRpb25zIGFyZSBzZXQgZm9yIHJlc3VsdHM9RkFMU0Ugc28gYXMgdG8gbm90IGRpc3BsYXkgdGhpcyBwbG90IGluIHRoZSBmaW5hbCBrbml0J2VkIGRvY3VtZW50Lg0KYGBgDQoNCmBgYHtyIEFFTU86IEZpeCwgZWNobz1GQUxTRSwgZXZhbD1UUlVFLCByZXN1bHRzPSJoaWRlIiwgcm93cy5wcmludD01MCwgY29scy5wcmludD0zMCwgZmlnLndpZHRoPTE1LCBmaWcuaGVpZ2h0PTEwfQ0KIyBGaXggdGhlIG91dGxpZXJzIGluIHRoZSBNb250aGx5IGRhdGEgLS0tLQ0KIyBVc2UgdGhlIG91dGxpZXJzOjpzY29yZXMoKSBmdW5jdGlvbiB0byBkZXRlcm1pbmUgdGhlIG91dGxpZXJzIGFuZCByZXBsYWNlIHdpdGggTkEuIFNldCB0byBwcm9iPTAuOTksIGFuZCB0aGVuIHJlbW92ZSB0aG9zZSB2YWx1ZXMgZnJvbSB0aGUgZGF0YS5mcmFtZS4NCmZvciAoRmVhdHVyZSBpbiBGZWF0dXJlcykgew0KICAgIGFlbW9fTW9udGhseU91dGxpZXJzIDwtIGxpc3QoKQ0KICAgIGZvciAoc3RhdGUgaW4gYygiTlNXIiwiVklDIiwiUUxEIiwiU0EiKSkgew0KICAgICAgICBhZW1vX01vbnRobHlPdXRsaWVyc1tbc3RhdGVdXSA8LSBwYXN0ZSgiYWVtb19Nb250aGx5VFNERiIsRmVhdHVyZSxzZXA9Il8iKSAlPiUgDQogICAgICAgICAgICBnZXQoKSAlPiUgDQogICAgICAgICAgICBzZWxlY3Qoc3RhdGUpICU+JSANCiAgICAgICAgICAgIHB1bGwoKSAlPiUgDQogICAgICAgICAgICBzY29yZXModHlwZT0ieiIsIHByb2I9MC45OSkgJT4lIA0KICAgICAgICAgICAgZGF0YS5mcmFtZSgpICU+JSANCiAgICAgICAgICAgIHJlbmFtZV9hdCh2YXJzKGNvbnRhaW5zKCIuIikpLCBmdW5zKHN0cl90b19sb3dlcihzdGF0ZSkpKSAlPiUgDQogICAgICAgICAgICByb3dpZF90b19jb2x1bW4oc3RhdGUpICU+JSANCiAgICAgICAgICAgIGZpbHRlciguWywyXT09IlRSVUUiKSAlPiUgDQogICAgICAgICAgICBzZWxlY3QoMSkgJT4lIA0KICAgICAgICAgICAgcHVsbCgpDQogICAgICAgIGFzc2lnbihwYXN0ZSgiYWVtb19Nb250aGx5VFNERiIsRmVhdHVyZSxzZXA9Il8iKQ0KICAgICAgICAgICAgICAscGFzdGUoImFlbW9fTW9udGhseVRTREYiLEZlYXR1cmUsc2VwPSJfIikgJT4lIA0KICAgICAgICAgICAgICAgICAgZ2V0KCkgJT4lIA0KICAgICAgICAgICAgICAgICAgcm93aWRfdG9fY29sdW1uKCkgJT4lIA0KICAgICAgICAgICAgICAgICAgbXV0YXRlX2F0KC52YXJzPXZhcnMoY29udGFpbnMoc3RhdGUpKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgLC5mdW5zPWZ1bnMoaWZlbHNlKHJvd2lkICVpbiUgYWVtb19Nb250aGx5T3V0bGllcnNbW3N0YXRlXV0sTkEsLikpDQogICAgICAgICAgICAgICAgICAgICAgICAgICApICU+JSANCiAgICAgICAgICAgICAgICAgIHNlbGVjdCgtcm93aWQpDQogICAgICAgICAgICAgICkNCiAgICB9DQp9DQoNCg0KIyBSZXBsYWNlIE5BJ3MgLS0tLQ0KIyBGb3IgdGhlIE5BJ3MsIGdpdmUgYSB2YWx1ZSB0aGF0IGlzIHRoZSBhdmVyYWdlIGlmIHRoZSB2YWx1ZXMgYmVmb3JlIGFuZCBhZnRlciB0aGUgTkEncy4NCiMgTW9udGhseQ0KYWVtb19Nb250aGx5VFNERl9hdmdfcHJpY2UgJTw+JSANCiAgICBtdXRhdGUoTlNXID0gaWZlbHNlKGlzLm5hKE5TVyksIChsZWFkKE5TVykrbGFnKE5TVykpLzIsIE5TVykNCiAgICAgICAgICAsUUxEID0gaWZlbHNlKGlzLm5hKFFMRCksIChsZWFkKFFMRCkrbGFnKFFMRCkpLzIsIFFMRCkNCiAgICAgICAgICAsU0EgID0gaWZlbHNlKGlzLm5hKFNBKSAsIChsZWFkKFNBKStsYWcoU0EpKS8yLCBTQSkNCiAgICAgICAgICAsVklDID0gaWZlbHNlKGlzLm5hKFZJQyksIChsZWFkKFZJQykrbGFnKFZJQykpLzIsIFZJQykNCiAgICAgICAgICAsUUxEID0gaWZlbHNlKGlzLm5hKFFMRCksIGlmZWxzZShpcy5uYShsYWcoUUxEKSksIGxhZyhRTEQsMikrKGxlYWQoUUxEKS1sYWcoUUxELDIpKSooMi8zKSwgbGFnKFFMRCkrKGxlYWQoUUxELDIpLWxhZyhRTEQpKSooMS8zKSksIFFMRCkgI1RoaXMgaXMgYmVjYXVzZSB0aGVyZSB3ZXJlIHR3byBOQSdzIGluIFFMRCBpbiBhIHJvdy4uLg0KICAgICAgICAgICkNCg0KIyBXZWVrbHkNCmFlbW9fTW9udGhseVRTREZfcm5nX3ByaWNlICU8PiUgDQogICAgbXV0YXRlKE5TVyA9IGlmZWxzZShpcy5uYShOU1cpLCAobGVhZChOU1cpK2xhZyhOU1cpKS8yLCBOU1cpDQogICAgICAgICAgLFFMRCA9IGlmZWxzZShpcy5uYShRTEQpLCAobGVhZChRTEQpK2xhZyhRTEQpKS8yLCBRTEQpDQogICAgICAgICAgLFNBICA9IGlmZWxzZShpcy5uYShTQSkgLCAobGVhZChTQSkrbGFnKFNBKSkvMiwgU0EpDQogICAgICAgICAgLFZJQyA9IGlmZWxzZShpcy5uYShWSUMpLCAobGVhZChWSUMpK2xhZyhWSUMpKS8yLCBWSUMpDQogICAgICAgICAgLE5TVyA9IGlmZWxzZShpcy5uYShOU1cpLCBpZmVsc2UoaXMubmEobGFnKE5TVykpLCBsYWcoTlNXLDIpKyhsZWFkKE5TVyktbGFnKE5TVywyKSkqKDIvMyksIGxhZyhOU1cpKyhsZWFkKE5TVywyKS1sYWcoTlNXKSkqKDEvMykpLCBOU1cpICNUaGlzIGlzIGJlY2F1c2UgdGhlcmUgd2VyZSB0d28gTkEncyBpbiBOU1cgaW4gYSByb3cuLi4NCiAgICAgICAgICAsUUxEID0gaWZlbHNlKGlzLm5hKFFMRCksIGlmZWxzZShpcy5uYShsYWcoUUxEKSksIGxhZyhRTEQsMikrKGxlYWQoUUxEKS1sYWcoUUxELDIpKSooMi8zKSwgbGFnKFFMRCkrKGxlYWQoUUxELDIpLWxhZyhRTEQpKSooMS8zKSksIFFMRCkgI1RoaXMgaXMgYmVjYXVzZSB0aGVyZSB3ZXJlIHR3byBOQSdzIGluIFFMRCBpbiBhIHJvdy4uLg0KICAgICAgICAgICkNCg0KDQojIFJlLVNldCBUaW1lU2VyaWVzIC0tLS0NCmZvciAoRmVhdHVyZSBpbiBGZWF0dXJlcykgew0KICAgICMgWWVhcmx5DQogICAgYXNzaWduKHBhc3RlKCJhZW1vX1llYXJseVRTIixGZWF0dXJlLHNlcD0iXyIpDQogICAgICAgICAgLHBhc3RlKCJhZW1vX1llYXJseVRTREYiLEZlYXR1cmUsc2VwPSJfIikgJT4lIA0KICAgICAgICAgICAgICBnZXQoKSAlPiUgDQogICAgICAgICAgICAgIGFzLm1hdHJpeCgpICU+JSANCiAgICAgICAgICAgICAgdHMoc3RhcnQ9YygxOTk5LDEpLGZyZXF1ZW5jeT0xKQ0KICAgICAgICAgICkNCiAgICANCiAgICAjIE1vbnRobHkNCiAgICBhc3NpZ24ocGFzdGUoImFlbW9fTW9udGhseVRTIixGZWF0dXJlLHNlcD0iXyIpDQogICAgICAgICAgLHBhc3RlKCJhZW1vX01vbnRobHlUU0RGIixGZWF0dXJlLHNlcD0iXyIpICU+JQ0KICAgICAgICAgICAgICBnZXQoKSAlPiUgDQogICAgICAgICAgICAgIGFzLm1hdHJpeCgpICU+JSANCiAgICAgICAgICAgICAgdHMoc3RhcnQ9YygxOTk5LDEpLGZyZXF1ZW5jeT0xMikNCiAgICAgICAgICApDQogICAgDQogICAgIyBXZWVrbHkNCiAgICBhc3NpZ24ocGFzdGUoImFlbW9fV2Vla2x5VFMiLEZlYXR1cmUsc2VwPSJfIikNCiAgICAgICAgICAscGFzdGUoImFlbW9fV2Vla2x5VFNERiIsRmVhdHVyZSxzZXA9Il8iKSAlPiUgDQogICAgICAgICAgICAgIGdldCgpICU+JSANCiAgICAgICAgICAgICAgYXMubWF0cml4KCkgJT4lIA0KICAgICAgICAgICAgICB0cyhzdGFydD1jKDE5OTksMSksZnJlcXVlbmN5PTUyKQ0KICAgICAgICAgICkNCn0NCg0KYGBgDQoNCg0KPCEtLSBDb3ZlciBJbWFnZSAtLT4NCg0KYGBge3IgQUVNTzogQ292ZXIgSW1hZ2UsIGVjaG89RkFMU0UsIGV2YWw9VFJVRSwgcmVzdWx0cz0iaGlkZSIsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIGZpZy53aWR0aD04LCBmaWcuaGVpZ2h0PTMuNn0NCmVsZW1lbnRfdGV4dGJveCA8LSBmdW5jdGlvbiguLi4pIHsNCiAgZWwgPC0gZWxlbWVudF90ZXh0KC4uLikNCiAgY2xhc3MoZWwpIDwtIGMoImVsZW1lbnRfdGV4dGJveCIsIGNsYXNzKGVsKSkNCiAgZWwNCn0NCg0KZWxlbWVudF9ncm9iLmVsZW1lbnRfdGV4dGJveCA8LSBmdW5jdGlvbihlbGVtZW50LCAuLi4pIHsNCiAgdGV4dF9ncm9iIDwtIE5leHRNZXRob2QoKQ0KICByZWN0X2dyb2IgPC0gZWxlbWVudF9ncm9iKGNhbGNfZWxlbWVudCgic3RyaXAuYmFja2dyb3VuZCIsIHRoZW1lX2J3KCkpKQ0KICANCiAgZ2dwbG90Mjo6OmFic29sdXRlR3JvYigNCiAgICBncmlkOjpnTGlzdCgNCiAgICAgIGVsZW1lbnRfZ3JvYihjYWxjX2VsZW1lbnQoInN0cmlwLmJhY2tncm91bmQiLCB0aGVtZV9idygpKSksDQogICAgICB0ZXh0X2dyb2INCiAgICApLA0KICAgIGhlaWdodCA9IGdyaWQ6Omdyb2JIZWlnaHQodGV4dF9ncm9iKSwgDQogICAgd2lkdGggPSBncmlkOjp1bml0KDEsICJucGMiKQ0KICApDQp9DQoNCiMgR2VuZXJhdGUgQ292ZXIgSW1hZ2UgLS0tLQ0KYWVtb19Nb250aGx5VFNfYXZnX3ByaWNlWywiTlNXIl0gJT4lIA0KICAgIGRlY29tcG9zZSgpICU+JSANCiAgICBwbHVjaygidHJlbmQiKSAlPiUgDQogICAgKGZ1bmN0aW9uKHgpew0KICAgICAgICAjIEdlbmVyYXRlIFBsb3QNCiAgICAgICAgcGxvdCA8LSB4ICU+JSANCiAgICAgICAgICAgIGF1dG9wbG90KGNvbG9yPSJkYXJrb3JhbmdlIikgKw0KICAgICAgICAgICAgZ2VvbV9zbW9vdGgoY29sb3I9InJlZCINCiAgICAgICAgICAgICAgICAgICAgICAgLHNlPUZBTFNFDQogICAgICAgICAgICAgICAgICAgICAgICxzaXplPTEuNA0KICAgICAgICAgICAgICAgICAgICAgICAsYXJyb3c9YXJyb3codHlwZT0ib3BlbiIpDQogICAgICAgICAgICAgICAgICAgICAgICkgKw0KICAgICAgICAgICAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcz1zZXEoMTk5OSwyMDE5LDEpKSArDQogICAgICAgICAgICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzPXNlcSgyMCw5MywxMCkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICxsaW1pdHM9YygyNSw5NSkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgKw0KICAgICAgICAgICAgY29vcmRfY2FydGVzaWFuKHhsaW09YygyMDEwLDIwMTkpKSArDQogICAgICAgICAgICBnZW9tX3NlZ21lbnQoDQogICAgICAgICAgICAgICAgZGF0YT1kYXRhLmZyYW1lKA0KICAgICAgICAgICAgICAgICAgICB4MT0yMDE5LSgyLzEyKQ0KICAgICAgICAgICAgICAgICAgICAseDI9MjAxOSsoMS8xMikNCiAgICAgICAgICAgICAgICAgICAgLHkxPTg5LjY5DQogICAgICAgICAgICAgICAgICAgICx5Mj05My4wNg0KICAgICAgICAgICAgICAgICAgICApDQogICAgICAgICAgICAgICAgLGFlcygNCiAgICAgICAgICAgICAgICAgICAgeD14MQ0KICAgICAgICAgICAgICAgICAgICAseT15MQ0KICAgICAgICAgICAgICAgICAgICAseGVuZD14Mg0KICAgICAgICAgICAgICAgICAgICAseWVuZD15Mg0KICAgICAgICAgICAgICAgICAgICApDQogICAgICAgICAgICAgICAgLGFycm93PWFycm93KGFuZ2xlPTMwKQ0KICAgICAgICAgICAgICAgICxjb2xvcj0icmVkIg0KICAgICAgICAgICAgICAgICxzaXplPTEuNA0KICAgICAgICAgICAgICAgICkgKw0KICAgICAgICAgICAgZ2VvbV9sYWJlbCgNCiAgICAgICAgICAgICAgICBkYXRhPWRhdGEuZnJhbWUoDQogICAgICAgICAgICAgICAgICAgIGxhYmVsID0gYygiSGlzdG9yaWMgTlNXIFByaWNlIiwiRnV0dXJlIE5TVyBQcmljZSIpDQogICAgICAgICAgICAgICAgICAgICx4PWMoMjAxMywyMDE3LjkpDQogICAgICAgICAgICAgICAgICAgICx5PWMoNjAsNjYpDQogICAgICAgICAgICAgICAgICAgICkNCiAgICAgICAgICAgICAgICAsbWFwcGluZz1hZXMoeD14LCB5PXksIGxhYmVsPWxhYmVsLCBjb2xvcj1sYWJlbCkNCiAgICAgICAgICAgICAgICAsbnVkZ2VfeD0wLjQNCiAgICAgICAgICAgICAgICApICsNCiAgICAgICAgICAgIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXM9YygicmVkIiwiZGFya29yYW5nZSIpKSArDQogICAgICAgICAgICB0aGVtZShwYW5lbC5ncmlkLm1pbm9yLng9ZWxlbWVudF9ibGFuaygpDQogICAgICAgICAgICAgICAgICxwYW5lbC5ncmlkLm1pbm9yLnk9ZWxlbWVudF9ibGFuaygpDQogICAgICAgICAgICAgICAgICxwbG90LnRpdGxlPWVsZW1lbnRfdGV4dGJveChtYXJnaW49bWFyZ2luKHQ9NSxiPTUpKQ0KICAgICAgICAgICAgICAgICAsbGVnZW5kLnBvc2l0aW9uPSJub25lIg0KICAgICAgICAgICAgICAgICApICsNCiAgICAgICAgICAgIGxhYnModGl0bGU9Ik91ciBGdXR1cmUgRW5lcmd5IFByaWNlcyINCiAgICAgICAgICAgICAgICAseT0iUHJpY2UgKCQvR3dIKSINCiAgICAgICAgICAgICAgICAseD0iWWVhciINCiAgICAgICAgICAgICAgICApDQogICAgICAgIGdnc2F2ZShwbG90PXBsb3QsIGZpbGU9IkltYWdlcy9Db3ZlckltYWdlLnBuZyIpDQogICAgICAgIHJldHVybihwbG90KQ0KICAgIH0pDQpgYGANCg0KDQojIEludHJvZHVjdGlvbiB7I2ludHJvZHVjdGlvbn0NCg0KDQojIyBCYWNrZ3JvdW5kIHsjYmFja2dyb3VuZH0NCg0KSW4gcmVjZW50IG1vbnRocywgbWVkaWEgb3V0bGV0cyBoYXZlIG5vdGlmaWVkIHRoZSBwdWJsaWMgYWJvdXQgZmx1Y3R1YXRpb25zIGluIGVuZXJneSBwcmljZXMgd2l0aCBoZWFkbGluZXMgc3VjaCBhcyAqQXVzdHJhbGlhJ3MgSGlnaCBFbGVjdHJpY2l0eSBQcmljZXMgdGhlICdOZXcgTm9ybWFsJywgUmVwb3J0IFNheXMqIChbSHV0Y2hlbnMsIDIwMThdKCNyZWY6aHV0Y2hlbnNfMjAxOCkpLCBhbmQgKkhpZ2hlciBFbmVyZ3kgUHJpY2VzIGFyZSBIZXJlIHRvIFN0YXkg4oCTIEhlcmXigJlzIFdoYXQgV2UgQ2FuIERvIEFib3V0IEl0KiAoW1BlcmNpdmFsLCAyMDE4XSgjcmVmOnBlcmNpdmFsXzIwMTgpKSBhbmQgKidObyBMaWtlbGlob29kIG9mIFJlbGllZiBBaGVhZCc6IEZ1dHVyZSBQb3dlciBQcmljZXMgQ29udGludWUgdG8gUmlzZSogKFtMYXRpbWVyLCAyMDE4XSgjcmVmOmxhdGltZXJfMjAxOCkpLiBUaGVzZSBhcnRpY2xlcyBjcmVhdGUgYSBzZW5zZSBvZiBjb25jZXJuIGR1ZSB0byB0aGUgaW1wYWN0IHRvIEF1c3RyYWxpYW4ncyBmaW5hbmNpYWwgd2VsbGJlaW5nLiBIb3dldmVyLCB0aGVyZSBpcyB2ZXJ5IGxpdHRsZSBmYWN0IGluIHRoZXNlIGFydGljbGVzIHRoYXQgYXJlIGdyb3VuZGVkIGluIHN0YXRpc3RpY2FsIGV2aWRlbmNlLg0KDQpXaGlsZSB0aGVzZSBhcnRpY2xlcyBtYXkgaGF2ZSBsYWNrZWQgYWNhZGVtaWMgcmlnb3VyIGFuZCByaGV0b3JpYywgdGhlIHNlbnRpbWVudCBpcyBzdGlsbCByZWZsZWN0ZWQgaW4gYWNhZGVtaWMgbGl0ZXJhdHVyZS4gU2FyZGFyIChbMjAxNV0oI3JlZjpzYXJkYXJfMjAxNSkpIGp1c3RpZmllcyBpbiBoaXMgMjAxNSBhcnRpY2xlIGVudGl0bGVkICpSZXNlYXJjaCBhbmQgRGV2ZWxvcG1lbnQsIFdlbGZhcmUgYW5kIEVmZmljaWVuY3k6IEFuIEF1c3RyYWxpYW4gRW5lcmd5IFBlcnNwZWN0aXZlKiB0aGF0IGluY3JlYXNpbmcgbnVtYmVycyBvZiBBdXN0cmFsaWFucyBhcmUgYmVpbmcgZHJpdmVuIHRvIHdlbGZhcmUgYXMgYSBkaXJlY3QgcmVzdWx0IG9mIEVuZXJneSBQcmljZXMuIE1vcmVvdmVyLCBpbiBhIDIwMTcgYXJ0aWNsZSBlbnRpdGxlZCAqQXVzdHJhbGlhbiBFbmVyZ3kgUG9saWN5IGFuZCBFY29ub21pYyBSYXRpb25hbGlzbSosIEhvcmFuIGV0IGFsLiAoWzIwMTddKCNyZWY6aG9yYW5fZXRhbF8yMDE3KSkgYWNjdXNlIHRoZSBBdXN0cmFsaWFuIEdvdmVybm1lbnQgb2YgaGF2aW5nIGlycmF0aW9uYWwgYW5kIGluZWZmaWNpZW50IGVuZXJneSBwb2xpY3ksIHdoaWNoIGlzIHBsYWNpbmcgaW5jcmVhc2luZyBhbmQgdW5uZWNlc3NhcnkgZmluYW5jaWFsIHByZXNzdXJlIG9uIEF1c3RyYWxpYW4gaG91c2Vob2xkcyBhbmQgYnVzaW5lc3Nlcy4gRnVydGhlcm1vcmUsIExpbmNvbG4gKFsyMDEyXSgjcmVmOmxpbmNvbG5fMjAxMikpIHByb3Bvc2VzIGEgc3VjY2luY3Qgc2V0IG9mIG9wdGlvbnMgZm9yIGNoYW5nZSB3aGljaCBtYXkgY3VyYiB0aGlzIHByZXNzdXJlLCBhcyBhcnRpY3VsYXRlZCBpbiB0aGUgaGlzIGFydGljbGUgKk9wdGlvbnMgZm9yIENoYW5nZSBpbiB0aGUgQXVzdHJhbGlhbiBFbmVyZ3kgUHJvZmlsZSouIEFzIHNob3duLCB0aGUgbGFuZHNjYXBlIG9mIHRoZSBBdXN0cmFsaWFuIEVuZXJneSBNYXJrZXQgZW52aXJvbm1lbnQgaXMgY2hhbmdpbmcsIGFuZCB0aGlzIHRyZW5kIG1heSBoYXZlIGRpcmUgY29uc2VxdWVuY2VzIGZvciB0aGUgZnV0dXJlIG9mIHRoZSBBdXN0cmFsaWFuIGVjb25vbXkuDQoNClRoZXJlZm9yZSwgd2l0aCB0aGUgaW50ZW50IHRvIGFkZCBzb21lIHN0YXRpc3RpY2FsIHJpZ291ciB0byB0aGUgZGlzY291cnNlIGFyb3VuZCB0aGUgQXVzdHJhbGlhbiBFbmVyZ3kgUHJpY2VzLCB0aGlzIHBhcGVyIGFpbXMgdG8gbW9kZWwgdGhlIGFnZ3JlZ2F0ZWQgbW9udGhseSBFbmVyZ3kgUG9pbnQgUHJpY2UgaW4gb3JkZXIgdG8gY3JlYXRlIGEgcHJlZGljdGlvbiBvZiB0aGUgZm9yIHRoZSBmdXR1cmUuIFRoZSBkYXRhIGlzIGV4dHJhY3RlZCBmcm9tIGFuIEF1c3RyYWxpYW4gR292ZXJubWVudCB3ZWJzaXRlLCB2aXN1YWxpc2VkLCBhbmFseXNlZCwgdGVzdGVkLCBhbmQgdGhlbiBmb3JlY2FzdCwgaW4gb3JkZXIgdG8gY3JlYXRlIHN1Y2ggcHJlZGljdGlvbi4gVGhlIHJlc3VsdGluZyBwcmVkaWN0aW9uIHdpbGwgYWxsb3cgY2l0aXplbnMgdG8gYWRlcXVhdGVseSBwbGFuIGZvciB0aGUgZnV0dXJlLCBhbmQgY2FuIGFsc28gcHJvdmlkZSBhZHZpY2UgYmFjayB0byBHb3Zlcm5tZW50YWwgQWdlbmNpZXMgaW4gb3JkZXIgdG8gYWR2aXNlIGZ1dHVyZSBwb2xpY3kuDQoNCg0KIyMgUmVzZWFyY2ggUXVlc3Rpb24geyNxdWVzdGlvbn0NCg0KSXMgdGhlIGZ1dHVyZSBlbmVyZ3kgcHJpY2UgKG1vbnRobHkgbWVhbiBhZ2dyZWdhdGUpIGFibGUgdG8gYmUgcHJlZGljdGVkIHNvbGVseSB1c2luZyB1bml2YXJpYXRlIHRpbWUgc2VyaWVzIGRhdGE/DQoNCg0KIyMgRGF0YSBTb3VyY2UNCg0KVGhlIGRhdGEgdXNlZCBpbiB0aGlzIGFuYWx5c2lzIGhhcyBiZWVuIG9idGFpbmVkIGZyb20gdGhlIG9mZmljaWFsIHdlYnNpdGUgZm9yIHRoZSBBdXN0cmFsaWFuIEVuZXJneSBNYXJrZXQgT3BlcmF0b3IgKEFFTU8pIChbd3d3LmFlbW8uY29tLmF1XSh3d3cuYWVtby5jb20uYXUpKS4gVGhlIGRhdGEgb2J0YWluZWQgZnJvbSBBRU1PIGhhZCB0aGUgZm9sbG93aW5nIGNoYXJhY3RlcmlzdGljcyBhbmQgbGltaXRhdGlvbnM6DQoNCjEuIFRoZSByYXcgZGF0YSB3YXMgYW4gRW5lcmd5IFBvaW50IFByaWNlLCBvYnRhaW5lZCBhdCBoYWxmIGhvdXJseSBpbmNyZW1lbnRzLg0KMS4gVGhlIGRhdGEgd2FzIHNwbGl0IGJ5IFN0YXRlLg0KMS4gVGhlIHByaWNlcyBmb3IgdGhlIEF1c3RyYWxpYW4gQ2FwaXRhbCBUZXJyaXRvcnkgd2FzIGluY2x1ZGVkIGluIHRoZSBwcmljZXMgZm9yIE5ldyBTb3V0aCBXaGFsZXMuDQoxLiBUaGUgcHJpY2VzIGZvciB0aGUgTm9ydGhlcm4gVGVycml0b3J5IHdlcmUgbWlzc2luZyBmcm9tIHRoZSB3ZWJzaXRlLg0KMS4gVGhlIHByaWNlcyBmb3IgV2VzdGVybiBBdXN0cmFsaWEgd2VyZSBpbiBhbiBpbmNvbnNpc3RlbnQgZm9ybWF0IGFuZCBpbmNvbnNpc3RlbnQgdGltZS1zdGFtcCB0byB0aGUgcmVzdCBvZiB0aGUgY291bnRyeSwgYW5kIHdhcyBub3QgYWJsZSB0byBiZSBtZXJnZWQgdG9nZXRoZXIuDQoxLiBUaGUgd2Vic2l0ZSBvbmx5IGluY2x1ZGVkIGRhdGEgdGhhdCBkYXRlZCBiYWNrIHRvIDE5OTkuDQoNCg0KIyBEYXRhIEV4cGxvcmF0aW9uIHsjZXhwbG9yYXRpb259DQoNCkhhdmluZyBhZ2dyZWdhdGVkIHRoZSBkYXRhIGluIHRvIGFuIGF2ZXJhZ2UgbW9udGhseSBwcmljZSwgdGhlIEFFTU8gZGF0YSBjYW4gYmUgZXhwbG9yZWQgdG8gZXN0YWJsaXNoIGl0cyB0cmVuZCwgc2Vhc29uYWxpdHksIHN0YXRpb25hcml0eSwgYW5kIHJlZ3VsYXJpdHkuIFdpdGggcmVmZXJlbmNlIHRvICpbYHIgZmlndXJlKCJBZW1vTWVhblByaWNlQnlTdGF0ZUJ5TW9udGgiKSAlPiUgc3Ryc3BsaXQoIjoiKSAlPiUgdW5saXN0KCkgJT4lIGZpcnN0KClgXSgjZmlnOkFlbW9NZWFuUHJpY2VCeVN0YXRlQnlNb250aCkqLCB0aGUgZm9sbG93aW5nIGNvbmNsdXNpb25zIGNhbiBiZSBkcmF3bjoNCg0KMS4gVGhlIGRhdGEgZG9lcyBub3QgaW5kaWNhdGUgYSBzZWFzb25hbCBpbmNyZWFzZSBhbmQgZGVjcmVhc2UgaW4gcHJpY2U7IG5laXRoZXIgYnkgbW9udGggbm9yIGJ5IHllYXIuDQoxLiBUaGUgZGF0YSB0cmVuZCBpbmRpY2F0ZXMgYSBzdGVhZHkgaW5jcmVhc2UgaW4gcHJpY2UgcGVyIHllYXIsIGFzIHNob3duIGJ5IHRoZSBmaXR0ZWQgbGluZWFyIG1vZGVsIGxpbmUuDQoxLiBBdCBhcHByb3hpbWF0ZWx5IHRoZSB5ZWFyICQyMDE3JCwgdGhlcmUgYXBwZWFycyB0byBiZSBhIHN0ZXAgaW5jcmVhc2UgaW4gcHJpY2VzIGFjcm9zcyBhbGwgc3RhdGVzLg0KMS4gQXJvdW5kIHRoZSBlbmQgb2YgJDIwMDkkIGFuZCB0aGUgc3RhcnQgb2YgJDIwMTkkLCB0aGVyZSBhcHBlYXJzIHRvIGJlIGEgc3Vic3RhbnRpYWwgc3Bpa2UgaW4gcHJpY2VzIHdoaWNoIGlzIGNvbnNpc3RlbnQgYWNyb3NzIGFsbCBzdGF0ZXMuDQoxLiBFYWNoIFN0YXRlIHNob3dzIGEgZGlmZmVyZW50IGxldmVsIG9mIHN0YWJpbGl0eSwgYWxvbmcgd2l0aCBhIGRpZmZlcmluZyBsZXZlbCBvZiBwcmljZSBpbmNyZWFzZS4gTm90aW5nIHRoZSBmb2xsb3dpbmcgZGlmZmVyZW5jZXMgcGVyIHN0YXRlOg0KDQogICAgMS4gJFFMRCQgYXBwZWFycyB0byBoYXZlIHRoZSBsZWFzdCBzdGVlcCBsaW5lYXIgbW9kZWwsIGFzIGdpdmVuIGJ5IHRoZSBzbG9wZSBvZiB0aGUgbGluZSBiZWluZyAkMS44JCwgd2hpbGUgJFZJQyQgaGFzIHRoZSBzdGVlcGVzdCB3aXRoIHRoZSBzbG9wZSBiZWluZyAkMi40JC4NCiAgICAxLiBXaGlsZSAkUUxEJCwgJFNBJCBhbmQgJFZJQyQgYXBwZWFyZWQgdG8gaGF2ZSByZWxhdGl2ZWx5IHN0YWJsZSBwcmljZXMgYmV0d2VlbiB0aGUgeWVhcnMgJDIwMDIkIGFuZCAkMjAwOCQsICROU1ckIGFwcGVhcmVkIHRvIGhhdmUgbXVjaCBtb3JlIHVuc3RhYmxlIHByaWNlcyBpbiB0aGUgc2FtZSBwZXJpb2QuDQogICAgMS4gVGhlIHByaWNlcyBmb3IgJFZJQyQgYW5kIGZvciAkU0EkIGFwcGVhciB0byBoYXZlIHRoZSBoaWdoZXN0IGF2ZXJhZ2UgcHJpY2UgYmV0d2VlbiB0aGUgaGVhcnMgb2YgJDIwMTckIGFuZCAkMjAxOSQuDQoNCg0KW10oKXsjZmlnOkFlbW9NZWFuUHJpY2VCeVN0YXRlQnlNb250aH0NCg0KYGBge3IgQUVNTzogUmUtVmlzdWFsaXNlLCBlY2hvPUZBTFNFLCBldmFsPVRSVUUsIHJlc3VsdHM9ImhpZGUiLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCBmaWcud2lkdGg9MTUsIGZpZy5oZWlnaHQ9MTB9DQojIFBsb3QgdHMoKSBvYmplY3RzIC0tLS0NCiMgZm9yIChGZWF0dXJlIGluIEZlYXR1cmVzKSB7DQpmb3IgKEZlYXR1cmUgaW4gYygiYXZnX3ByaWNlIikpIHsNCiAgICANCiAgICAjIGZvciAoVGltZSBpbiBjKCJZZWFyIiwiTW9udGgiLCJXZWVrIikpIHsNCiAgICBmb3IgKFRpbWUgaW4gYygiTW9udGgiKSkgew0KICAgICAgICANCiAgICAgICAgcGFzdGUwKCJhZW1vXyIsVGltZSwibHlUU18iLEZlYXR1cmUpICU+JSANCiAgICAgICAgICAgIGdldCgpICU+JSANCiAgICAgICAgICAgIChmdW5jdGlvbih4KXsNCiAgICAgICAgICAgICAgICBwbG90IDwtIHggJT4lIA0KICAgICAgICAgICAgICAgICAgICBhdXRvcGxvdCgpICsNCiAgICAgICAgICAgICAgICAgICAgZmFjZXRfd3JhcCh+c2VyaWVzLCBuY29sPTEsIHN3aXRjaD0ieSIpICsNCiAgICAgICAgICAgICAgICAgICAgZ2VvbV9zbW9vdGgobWV0aG9kPSJsbSIsIHNpemU9MSkgKw0KICAgICAgICAgICAgICAgICAgICBnZW9tX3RleHQoDQogICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gZGF0YS5mcmFtZSgNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbCA9IGMocmVwbGljYXRlKDQsIk1lYW4gUHJpY2UiKSxyZXBsaWNhdGUoNCwiTGluZWFyIE1vZGVsIikpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLHNlcmllcyA9IHJlcGxpY2F0ZSgyLHBhc3RlMCgiYWVtb18iLFRpbWUsImx5VFNfIixGZWF0dXJlKSAlPiUgZ2V0KCkgJT4lIGNvbG5hbWVzKCkpICU+JSBhcy52ZWN0b3IoKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICx4PXJlcGxpY2F0ZSg4LDIwMjApDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLHk9Yyg1MCw1NCwxMDUsMTA1LDcwLDcwLDc1LDcwKQ0KICAgICAgICAgICAgICAgICAgICAgICAgKQ0KICAgICAgICAgICAgICAgICAgICAgICAgLG1hcHBpbmcgPSBhZXMoeD14LCB5PXksIGxhYmVsPWxhYmVsKQ0KICAgICAgICAgICAgICAgICAgICAgICAgLG51ZGdlX3g9MC40DQogICAgICAgICAgICAgICAgICAgICkgKw0KICAgICAgICAgICAgICAgICAgICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzPXNlcSgxOTk5LCAyMDIxKSkgKw0KICAgICAgICAgICAgICAgICAgICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzPXNlcSgwLCAxNDAsIGJ5PTIwKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsbGltaXRzPWMoMCwxNDApDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgKw0KICAgICAgICAgICAgICAgICAgICBzdGF0X3JlZ2xpbmVfZXF1YXRpb24obGFiZWwueT00MCwgbGFiZWwueD0yMDE3KSArDQogICAgICAgICAgICAgICAgICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSINCiAgICAgICAgICAgICAgICAgICAgICAgICAscGFuZWwuZ3JpZC5taW5vci54PWVsZW1lbnRfYmxhbmsoKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICxwYW5lbC5ncmlkLm1pbm9yLnk9ZWxlbWVudF9ibGFuaygpDQogICAgICAgICAgICAgICAgICAgICAgICAgLHBsb3QubWFyZ2luPXVuaXQoYygwLjEsMywwLjEsMyksIm1tIikNCiAgICAgICAgICAgICAgICAgICAgICAgICApICsNCiAgICAgICAgICAgICAgICAgICAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcz1jKCJyZWQiLCJsaW1lZ3JlZW4iLCJibHVlIiwib3JhbmdlIikpICsgDQogICAgICAgICAgICAgICAgICAgIGxhYnModGl0bGU9RmVhdHVyZSAlPiUgc3RyX3JlcGxhY2UoIl8iLCAiICIpICU+JSBzdHJfcmVwbGFjZSgiYXZnIiwgIm1lYW4iKSAlPiUgc3RyX3JlcGxhY2UoInJuZyIsICJyYW5nZSIpICU+JSBzdHJfdG9fdGl0bGUoKQ0KICAgICAgICAgICAgICAgICAgICAgICAgLHN1YnRpdGxlPXBhc3RlMCgiQnkgU3RhdGUsIEJ5ICIsVGltZSkNCiAgICAgICAgICAgICAgICAgICAgICAgICx5PSJQcmljZSAoJC9Hd0gpIg0KICAgICAgICAgICAgICAgICAgICAgICAgLGNhcHRpb249IlNvdXJjZT1cIkFFTU9cIlxuT3V0bGllciBEYXRhIFBvaW50cyBSZW1vdmVkIg0KICAgICAgICAgICAgICAgICAgICAgICAgKQ0KICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIGdnc2F2ZShwbG90PXBsb3QsIGZpbGU9IkltYWdlcy9BZW1vTWVhblByaWNlQnlTdGF0ZUJ5TW9udGgucG5nIikNCiAgICAgICAgICAgICAgICBwcmludChwbG90KQ0KICAgICAgICAgICAgICAgIHJldHVybihwbG90KQ0KICAgICAgICAgICAgfSkNCiAgICB9DQp9DQpgYGANCg0KKmByIGZpZ3VyZShuYW1lPSJBZW1vTWVhblByaWNlQnlTdGF0ZUJ5TW9udGgiLCBjYXB0aW9uPSJUaGUgVGVtcGVyYXR1cmUgRmx1Y3R1YXRpb25zIG92ZXIgdGltZSwgYnkgc3RhdGUsIGJ5IHdlZWsiKWAqIA0KDQoNCkluIGFkZGl0aW9uIHRvIHZpc3VhbGlzaW5nIHRoZSBvYnNlcnZlZCBwcmljZXMsIGFzIGRpc3BsYXllZCBpbiAqW2ByIGZpZ3VyZSgiQWVtb01lYW5QcmljZUJ5U3RhdGVCeU1vbnRoIikgJT4lIHN0cnNwbGl0KCI6IikgJT4lIHVubGlzdCgpICU+JSBmaXJzdCgpYF0oI2ZpZzpBZW1vTWVhblByaWNlQnlTdGF0ZUJ5TW9udGgpKiwgdGhlIHRpbWUtc2VyaWVzIGRhdGEgY2FuIGFsc28gYmUgZGVjb21wb3NlZCBkb3duIHRvIGl0J3MgcmVsZXZhbnQgYXR0cmlidXRlcy4gVGhlIHR3byBtb3N0IHBlcnRpbmVudCBhdHRyaWJ1dGVzIGZvciB0aW1lLXNlcmllcyBpcyB0aGUgVHJlbmQgYW5kIHRoZSBTZWFzb25hbCBhdHRyaWJ1dGVzLiBBcyBzaG93biBpbiAqW2ByIGZpZ3VyZSgiQWVtb0RlY29tcG9zaXRpb25CeVN0YXRlIikgJT4lIHN0cnNwbGl0KCI6IikgJT4lIHVubGlzdCgpICU+JSBmaXJzdCgpYF0oI2ZpZzpBZW1vRGVjb21wb3NpdGlvbkJ5U3RhdGUpKiwgdGhlIHJlbGV2YW50IHN0YXRlcyBlYWNoIGhhdmUgYSBkaXN0YW5jZSB0cmVuZCBhbmQgc2Vhc29uYWxpdHkuIFRoZSBSZXNpZHVhbCBhdHRyaWJ1dGUgaXMgdGhlIHJlc2lkdWFsIGRhdGEsIHJlbWFpbmluZyBhZnRlciB0aGUgZGF0YSBoYXMgYmVlbiBkZWNvbXBvc2VkIHRvIGl0cyBUcmVuZCBhbmQgdGhlIFNlYXNvbmFsIHBhcnRpY3VsYXJzLg0KDQpUaGlzIGZpZ3VyZSBoYXMgaGFkIGEgc21vb3RoZWQgdHJlbmQgbGluZSBhZGRlZCB0byB0aGUgVHJlbmQgcGxvdC4gVGhpcyB0cmVuZCBsaW5lIHNob3dzIGEgZGlzdGluY3QgYW5kIHByb21pbmVudCB1cHdhcmQgdHJlbmQgZm9yIGFsbCBzdGF0ZXMsIGluZGljYXRpbmcgdGhhdCB0aGlzIHVwd2FyZCB0cmVuZCBpcyBsaWtlbHkgdG8gY29udGludWUgaW4gdG8gdGhlIGZ1dHVyZSwgYW5kIHdpbGwgaW5jcmVhc2UgaXRzIHByaWNlIG92ZXIgdGltZS4NCg0KDQpbXSgpeyNmaWc6QWVtb0RlY29tcG9zaXRpb25CeVN0YXRlfQ0KDQpgYGB7ciBBRU1POiBWaXN1YWxpc2UgRGVjb21wb3NpdGlvbiwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgZXJyb3I9RkFMU0UsIGVjaG89RkFMU0UsIGV2YWw9VFJVRSwgZmlnLndpZHRoPTE1LCBmaWcuaGVpZ2h0PTE4fQ0KIyBQbG90IGRlY29tcG9zaXRpb24gLS0tLQ0KYWVtb19Nb250aGx5VFNfYXZnX3ByaWNlICU+JQ0KICAgIChmdW5jdGlvbih4KXsNCiAgICAgICAgZm9yIChzdGF0ZSBpbiBjb2xuYW1lcyh4KSkgew0KICAgICAgICAgICAgY29sIDwtIGNhc2Vfd2hlbihzdGF0ZT09Ik5TVyIgfiAicmVkIg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICxzdGF0ZT09IlFMRCIgfiAibGltZWdyZWVuIg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICxzdGF0ZT09IlNBIiAgfiAiYmx1ZSINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAsc3RhdGU9PSJWSUMiIH4gIm9yYW5nZSINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApDQogICAgICAgICAgICBhc3NpZ24oDQogICAgICAgICAgICAgICAgc3RhdGUsDQogICAgICAgICAgICAgICAgeFssc3RhdGVdICU+JSANCiAgICAgICAgICAgICAgICBkZWNvbXBvc2UoKSAlPiUgDQogICAgICAgICAgICAgICAgKGZ1bmN0aW9uKHgpew0KICAgICAgICAgICAgICAgICAgICBjYmluZCgiVHJlbmQiPXggJT4lIHBsdWNrKCJ0cmVuZCIpDQogICAgICAgICAgICAgICAgICAgICAgICAgLCJTZWFzb25hbCI9eCAlPiUgcGx1Y2soInNlYXNvbmFsIikNCiAgICAgICAgICAgICAgICAgICAgICAgICAsIlJlc2lkdWFsIj14ICU+JSBwbHVjaygicmFuZG9tIikNCiAgICAgICAgICAgICAgICAgICAgICAgICApICU+JSANCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuKCkNCiAgICAgICAgICAgICAgICB9KSAlPiUgDQogICAgICAgICAgICAgICAgYXV0b3Bsb3QoLixjb2xvcj1jb2wpICsgDQogICAgICAgICAgICAgICAgZmFjZXRfd3JhcCh+c2VyaWVzLCBuY29sPTEsIHNjYWxlcz0iZnJlZV95Iiwgc3dpdGNoPSJ5IikgKw0KICAgICAgICAgICAgICAgIHNjYWxlX3hfY29udGludW91cyhicmVha3M9c2VxKDE5OTksIDIwMjEpKSArIA0KICAgICAgICAgICAgICAgIGdlb21fc21vb3RoKGRhdGE9ZnVuY3Rpb24oeCl7IHggJT4lIGZpbHRlcihzZXJpZXM9PSJUcmVuZCIpICU+JSByZXR1cm4oKSB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAsY29sb3I9Y29sDQogICAgICAgICAgICAgICAgICAgICAgICAgICAsc2U9RkFMU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICkgKw0KICAgICAgICAgICAgICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSINCiAgICAgICAgICAgICAgICAgICAgICxwYW5lbC5ncmlkLm1pbm9yLng9ZWxlbWVudF9ibGFuaygpDQogICAgICAgICAgICAgICAgICAgICAsYXhpcy50aXRsZS54PWVsZW1lbnRfYmxhbmsoKQ0KICAgICAgICAgICAgICAgICAgICAgLHBsb3QudGl0bGU9ZWxlbWVudF90ZXh0KHZqdXN0PS03LCBjb2xvcj1jb2wpDQogICAgICAgICAgICAgICAgICAgICApICsgDQogICAgICAgICAgICAgICAgbGFicyh0aXRsZT1zdGF0ZQ0KICAgICAgICAgICAgICAgICAgICAseT1wYXN0ZTAoc3RhdGUsIiBQcmljZSAoJC9Hd2gpIikNCiAgICAgICAgICAgICAgICAgICAgKQ0KICAgICAgICAgICAgICAgICkNCiAgICAgICAgfQ0KICAgICAgICBncmlkLmFycmFuZ2UoTlNXDQogICAgICAgICAgICAgICAgICAgICxRTEQNCiAgICAgICAgICAgICAgICAgICAgLFNBDQogICAgICAgICAgICAgICAgICAgICxWSUMNCiAgICAgICAgICAgICAgICAgICAgLG5jb2w9MQ0KICAgICAgICAgICAgICAgICAgICAsYm90dG9tPXRleHRHcm9iKCJUaW1lIiwgaGp1c3Q9MC41KQ0KICAgICAgICAgICAgICAgICAgICAsdG9wPXRleHRHcm9iKGV4cHJlc3Npb24oYm9sZCh1bmRlcmxpbmUoIkRlY29tcG9zaXRpb24gb2YgQWRkaXRpdmUgVGltZSBTZXJpZXMiKSkpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsaGp1c3Q9MC41DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsZ3A9Z3Bhcihmb250c2l6ZT0yMCkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkNCiAgICAgICAgICAgICAgICAgICAgLHBhZGRpbmc9dW5pdCgwLjEsImxpbmUiKQ0KICAgICAgICAgICAgICAgICAgICApICU+JSANCiAgICAgICAgKGZ1bmN0aW9uKHgpew0KICAgICAgICAgICAgZ2dzYXZlKHBsb3Q9eCwgZmlsZT0iSW1hZ2VzL0FlbW9EZWNvbXBvc2l0aW9uQnlTdGF0ZS5wbmciKQ0KICAgICAgICB9KQ0KICAgIH0pDQoNCmBgYA0KDQoqYHIgZmlndXJlKG5hbWU9IkFlbW9EZWNvbXBvc2l0aW9uQnlTdGF0ZSIsIGNhcHRpb249IlRoZSBEZWNvbXBvc2l0aW9uIG9mIEFkZGl0aXZlIFRpbWUgU2VyaWVzLCBieSBTdGF0ZSwgYnkgTW9udGgiKWAqDQoNCg0KIyBUZXN0aW5nIHRoZSBEYXRhIHsjdGVzdGluZ30NCg0KSW4gb3JkZXIgdG8gZXN0YWJsaXNoIHdoZXRoZXIgdGhlIGRhdGEgaXMgc3VpdGFibGUgZm9yIHRpbWUgc2VyaWVzIGFuYWx5c2lzIGFuZCBwcmVkaWN0aW9uLCBhIG51bWJlciBvZiBzdGF0aXN0aWNhbCB0ZXN0cyBuZWVkIHRvIGJlIGFwcGxpZWQgdG8gdGhlIGRhdGEuIE5hbWVseToNCg0KMS4gVGVzdCBmb3IgV2hpdGVub2lzZQ0KMS4gVGVzdCBmb3IgU3RhdGlvbmFyaXR5DQoxLiAob3B0aW9uYWwpIFRlc3QgZm9yIFNlYXNvbmFsaXR5DQoxLiAob3B0aW9uYWwpIFRlc3QgZm9yIFJlZ3VsYXJpdHkNCjEuIChvcHRpb25hbCkgVGVzdCBmb3IgU3RhYmlsaXR5DQoxLiBUZXN0IGZvciBBdXRvLUNvcnJlbGF0aW9uDQoNCg0KIyMgVGVzdCBmb3IgV2hpdGVub2lzZSB7I3doaXRlbm9pc2V9DQoNClRoZSB0ZXN0IGZvciBXaGl0ZW5vaXNlIGlzIGludGVuZGVkIHRvIGVzdGFibGlzaCB3aGV0aGVyIG9yIG5vdCB0aGUgZGF0YSBpcyBqdXN0IHJhbmRvbSBwb2ludHMgYWNyb3NzIGEgcGVyaW9kIG9mIHRpbWUuIElmIHRoZSBkYXRhIGlzICd3aGl0ZW5vaXNlJyAoaWUuIGlzIHJhbmRvbSBkYXRhIHBvaW50cyksIHRoZW4gdGhlIGRhdGEgY2Fubm90IGJlIHVzZWQgZm9yIHRpbWUtc2VyaWVzIGZvcmVjYXN0aW5nLg0KDQpGb3IgdGhpcywgdGhlIEJveC1ManVuZyBUZXN0IGZvciBXaGl0ZW5vaXNlIChbTGp1bmcgJiBCb3gsIDE5NzhdKCNyZWY6bGp1bmdfYm94XzE5NzgpOyBbUi1Db3JlLCBuZC5dKCNyZWY6cmNvcmVfbmQpKSB3YXMgYXBwbGllZCB0byB0aGUgQUVNTyBkYXRhLCB3aXRoIHRoZSByZXN1bHRzIGRpc3BsYXllZCBpbiAqW2ByIHRhYmxlKCJXaGl0ZW5vaXNlVGVzdEJ5U3RhdGUiKSAlPiUgc3Ryc3BsaXQoIjoiKSAlPiUgdW5saXN0KCkgJT4lIGZpcnN0KClgXSgjdGFiOldoaXRlbm9pc2VUZXN0QnlTdGF0ZSkqLiBBcyBzZWVuIGJ5IGVhY2ggb2YgdGhlIHRlc3RzIHJldHVybmluZyBhIHZhbHVlIG9mIGxlc3MgdGhhbiB0aGUgdGhyZXNob2xkICgkMC4wMiQpLCB0aGVuIGVhY2ggb2YgdGhlIHN0YXRlcyBhcmUgbm90IHdoaXRlbm9pc2U7IHRoZXJlZm9yZSB0aGUgZGF0YSBjYW4gYmUgdXNlZCBmb3IgdGltZS1zZXJpZXMgZm9yZWNhc3RpbmcNCg0KDQpbXSgpeyN0YWI6V2hpdGVub2lzZVRlc3RCeVN0YXRlfQ0KDQpgYGB7ciBBRU1POiBUZXN0IFRTIFdoaXRlIE5vaXNlLCBlY2hvPUZBTFNFLCBldmFsPVRSVUUsIHJvd3MucHJpbnQ9NTAsIGNvbHMucHJpbnQ9MzAsIGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD03fQ0KIyBUZXN0IGZvciBXaGl0ZW5vaXNlIC0tLS0NCmFlbW9fTW9udGhseVRTX2F2Z19wcmljZSAlPiUgDQogICAgKGZ1bmN0aW9uKHgpew0KICAgICAgICByZXR1cm4gPC0gY29sbmFtZXMoeCkgJT4lIGRhdGEuZnJhbWUoInN0YXRlIj0uLCJ2YWx1ZSI9TkEpDQogICAgICAgIGZvciAoc3RhdGUgaW4gcmV0dXJuWywic3RhdGUiXSkgew0KICAgICAgICAgICAgcmV0dXJuW3JldHVyblssInN0YXRlIl09PXN0YXRlLCJ2YWx1ZSJdIDwtIHhbLHN0YXRlXSAlPiUgQm94LnRlc3QobGFnPTI0LCB0eXBlPSJMaiIpICU+JSBleHRyYWN0KCJwLnZhbHVlIikNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4ocmV0dXJuKQ0KICAgIH0pICU+JSANCiAgICBtdXRhdGUodGhyZXNob2xkPTAuMDINCiAgICAgICAgICAsb3V0Y29tZT1pZmVsc2UodmFsdWU8dGhyZXNob2xkLCJOb3QgV2hpdGVub2lzZSIsIklzIFdoaXRlbm9pc2UiKQ0KICAgICAgICAgICx2YWx1ZT1pZmVsc2UodmFsdWU8MC4wMDAwMDAwMDAwMDAwMDAyLCI8MC4wMDAwMDAwMDAwMDAwMDAyIixhcy5jaGFyYWN0ZXIodmFsdWUpKQ0KICAgICAgICAgICx0ZXN0PSJCb3gtTGp1bmcgVGVzdCINCiAgICAgICAgICAsZmVhdHVyZT0iTWVhbiBNb250aGx5IFByaWNlIg0KICAgICAgICAgICkgJT4lIA0KICAgIHNlbGVjdChmZWF0dXJlLHN0YXRlLHRlc3QsZXZlcnl0aGluZygpKSAlPiUgDQogICAgcmVuYW1lX2FsbChmdW5zKHN0cl90b190aXRsZSguKSkpICU+JSANCiAgICBrYWJsZShhbGlnbj0ibCIpICU+JSANCiAgICBrYWJsZV9zdHlsaW5nKGJvb3RzdHJhcF9vcHRpb25zPWMoInN0cmlwZWQiLCJib3JkZXJlZCIsImNvbmRlbnNlZCIpDQogICAgICAgICAgICAgICAgICxmdWxsX3dpZHRoPUZBTFNFDQogICAgICAgICAgICAgICAgICxwb3NpdGlvbj0ibGVmdCINCiAgICAgICAgICAgICAgICAgKSAlPiUgDQogICAgKGZ1bmN0aW9uKHgpew0KICAgICAgICB4ICU+JSBzYXZlX2thYmxlKCJJbWFnZXMvV2hpdGVub2lzZVRlc3RCeVN0YXRlLnBuZyIpDQogICAgICAgIHggJT4lIHJldHVybigpDQogICAgfSkNCmBgYA0KDQoqYHIgdGFibGUobmFtZT0iV2hpdGVub2lzZVRlc3RCeVN0YXRlIiwgY2FwdGlvbj0iVGVzdCBmb3IgV2hpdGVub2lzZSBmb3IgZWFjaCBTdGF0ZSIpYCoNCg0KDQojIyBUZXN0IGZvciBTdGF0aW9uYXJpdHkgeyNzdGF0aW9uYXJpdHl9DQoNClRoZSB0ZXN0IGZvciBTdGF0aW9uYXJpdHkgaXMgaW50ZW5kZWQgdG8gZXN0YWJsaXNoIHdoZXRoZXIgb3Igbm90IHRoZSBkYXRhIGlzIHN0YXRpb25hcnkgb3Igbm90LiBCeSBkZWNsYXJpbmcgdGhhdCB0aGUgZGF0YSBpcyAnc3RhdGlvbmFyeScgaW5kaWNhdGVzIHRoYXQgdGhlIGRhdGEgZG9lcyBub3QgdmFyeSBzdWZmaWNpZW50bHkgcGVyIHBlcmlvZC4gSW4gdGhpcyBpbnN0YW5jZSwgdGhlIHBlcmlvZCBpcyBieSB5ZWFyOyB0aHVzLCB0aGUgZGF0YSBtdXN0IHZhcnkgc3VmZmljaWVudGx5IHBlciB5ZWFyIHNvIGFzIHRoZSB0aW1lLXNlcmllcyBmb3JlY2FzdGluZyBjYW4gZm9yZWNhc3QgdGhlIHZhbHVlcyBmb3IgdGhlIHByb2NlZWRpbmcgcGVyaW9kcy4gU3JpdmFzdGF2YSAoWzIwMTVdKCNyZWY6c3JpdmFzdGF2YV8yMDE1KSkgcHJvdmlkZXMgdGhyZWUgZWZmZWN0aXZlIHBpY3RvcmlhbCBleGFtcGxlcyBvZiBub24tc3RhdGlvbmFyeSBkYXRhLCBhcyBkaXNwbGF5ZWQgaW4gKltgciBmaWd1cmUoIk5vblN0YXRpb25hcnlEYXRhQ2hhbmdpbmdNZWFuIikgJT4lIHN0cnNwbGl0KCI6IikgJT4lIHVubGlzdCgpICU+JSBmaXJzdCgpYF0oI2ZpZzpOb25TdGF0aW9uYXJ5RGF0YUNoYW5naW5nTWVhbikqIGZvciBub24tc3RhdGlvbmFyeSBNZWFucywgKltgciBmaWd1cmUoIk5vblN0YXRpb25hcnlEYXRhQ2hhbmdpbmdWYXJpYW5jZSIpICU+JSBzdHJzcGxpdCgiOiIpICU+JSB1bmxpc3QoKSAlPiUgZmlyc3QoKWBdKCNmaWc6Tm9uU3RhdGlvbmFyeURhdGFDaGFuZ2luZ1ZhcmlhbmNlKSogZm9yIG5vbi1zdGF0aW9uYXJ5IFZhcmlhbmNlLCBhbmQgKltgciBmaWd1cmUoIk5vblN0YXRpb25hcnlEYXRhQ2hhbmdpbmdDb3ZhcmlhbmNlIikgJT4lIHN0cnNwbGl0KCI6IikgJT4lIHVubGlzdCgpICU+JSBmaXJzdCgpYF0oI2ZpZzpOb25TdGF0aW9uYXJ5RGF0YUNoYW5naW5nQ292YXJpYW5jZSkqIGZvciBub24tc3RhdGlvbmFyeSBDb3ZhcmlhbmNlLg0KDQpUaGUgS1BTUyBVbml0IFJvb3QgVGVzdCAoW0t3aWF0a293c2tpIGV0IGFsLiwgMTk5Ml0oI3JlZjprd2lhdGtvd3NraV9ldGFsXzE5OTIpOyBbUGZhZmYsIG5kLl0oI3JlZjpwZmFmZl9uZCkpIGRldGVybWluZXMgaWYgdGhlIGRhdGEgaXMgc3RhdGlvbmFyeSwgd2l0aCBhIHAtdmFsdWUgbGVzcyB0aGFuIHRoZSB0aHJlc2hvbGQgKCQwLjAyJCkgaW5kaWNhdGluZyB0aGF0IHRoZSBkYXRhIGlzIHN0YXRpb25hcnkuIFRoaXMgdGVzdCBoYXMgYmVlbiBhcHBsaWVkIHRvIHRoZSBBRU1PIGRhdGEgc2V0LCB3aXRoIHRoZSByZXN1bHRzIGRpc3BsYXllZCBpbiAqW2ByIHRhYmxlKCJTdGF0aW9uYXJpdHlUZXN0QnlTdGF0ZSIpICU+JSBzdHJzcGxpdCgiOiIpICU+JSB1bmxpc3QoKSAlPiUgZmlyc3QoKWBdKCN0YWI6U3RhdGlvbmFyaXR5VGVzdEJ5U3RhdGUpKi4gVGhlIHJlc3VsdHMgb2YgdGhpcyB0ZXN0IHNob3dzIHRoYXQgdGhlIGRhdGEgc2V0cyBhcmUgbm90IHN0YXRpb25hcnksIGFuZCBjYW4gYmUgdXNlZCBmb3IgdGltZS1zZXJpZXMgZm9yZWNhc3RpbmcuDQoNCg0KW10oKXsjdGFiOlN0YXRpb25hcml0eVRlc3RCeVN0YXRlfQ0KDQpgYGB7ciBBRU1POiBUZXN0IFRTIFN0YXRpb25hcml0eSwgZWNobz1GQUxTRSwgZXZhbD1UUlVFLCByb3dzLnByaW50PTUwLCBjb2xzLnByaW50PTMwLCBmaWcud2lkdGg9MTAsIGZpZy5oZWlnaHQ9N30NCiMgVGVzdCBmb3IgU3RhdGlvbmFyaXR5IC0tLS0NCmFlbW9fTW9udGhseVRTX2F2Z19wcmljZSAlPiUgDQogICAgKGZ1bmN0aW9uKHgpew0KICAgICAgICByZXR1cm4gPC0gY29sbmFtZXMoeCkgJT4lIGRhdGEuZnJhbWUoInN0YXRlIj0uLCJ2YWx1ZSI9TkEpDQogICAgICAgIGZvciAoc3RhdGUgaW4gcmV0dXJuWywic3RhdGUiXSkgew0KICAgICAgICAgICAgcmV0dXJuW3JldHVyblssInN0YXRlIl09PXN0YXRlLCJ2YWx1ZSJdIDwtICh4WyxzdGF0ZV0gJT4lIHVyLmtwc3ModXNlLmxhZz0yNCkpQHRlc3RzdGF0DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuKHJldHVybikNCiAgICB9KSAlPiUgDQogICAgbXV0YXRlKHRlc3Q9IktQU1MgVW5pdCBSb290IFRlc3QiDQogICAgICAgICAgLHRocmVzaG9sZD0wLjAyDQogICAgICAgICAgLGZlYXR1cmU9Ik1lYW4gTW9udGhseSBQcmljZSINCiAgICAgICAgICAsb3V0Y29tZT1pZmVsc2UodmFsdWU8dGhyZXNob2xkLCJJcyBTdGF0aW9uYXJ5IiwiTm90IFN0YXRpb25hcnkiKQ0KICAgICAgICAgICkgJT4lIA0KICAgIHNlbGVjdChmZWF0dXJlLHN0YXRlLHRlc3QsZXZlcnl0aGluZygpKSAlPiUgDQogICAgcmVuYW1lX2FsbChmdW5zKHN0cl90b190aXRsZSguKSkpICU+JSANCiAgICBrYWJsZShhbGlnbj0ibCIpJT4lIA0KICAgIGthYmxlX3N0eWxpbmcoYm9vdHN0cmFwX29wdGlvbnM9Yygic3RyaXBlZCIsImJvcmRlcmVkIiwiY29uZGVuc2VkIikNCiAgICAgICAgICAgICAgICAgLGZ1bGxfd2lkdGg9RkFMU0UNCiAgICAgICAgICAgICAgICAgLHBvc2l0aW9uPSJsZWZ0Ig0KICAgICAgICAgICAgICAgICApICU+JSANCiAgICAoZnVuY3Rpb24oeCl7DQogICAgICAgIHggJT4lIHNhdmVfa2FibGUoIkltYWdlcy9TdGF0aW9uYXJpdHlUZXN0QnlTdGF0ZS5wbmciKQ0KICAgICAgICB4ICU+JSByZXR1cm4oKQ0KICAgIH0pDQpgYGANCg0KKmByIHRhYmxlKG5hbWU9IlN0YXRpb25hcml0eVRlc3RCeVN0YXRlIiwgY2FwdGlvbj0iVGVzdCBmb3IgU3RhdGlvbmFyaXR5IGZvciBlYWNoIFN0YXRlIilgKg0KDQoNCjxkaXYgY2xhc3M9InJvdyI+DQoNCjxkaXYgY2xhc3M9ImNvbHVtbiIgc3R5bGU9ImhlaWdodDoyNTBweCI+DQoNCiFbXShodHRwczovL3d3dy5hbmFseXRpY3N2aWRoeWEuY29tL3dwLWNvbnRlbnQvdXBsb2Fkcy8yMDE1LzAyL01lYW5fbm9uc3RhdGlvbmFyeS5wbmcpeyNmaWc6Tm9uU3RhdGlvbmFyeURhdGFDaGFuZ2luZ01lYW59DQoNCipgciBmaWd1cmUobmFtZT0iTm9uU3RhdGlvbmFyeURhdGFDaGFuZ2luZ01lYW4iLCBjYXB0aW9uPSJOb24tU3RhdGlvbmFyeSBEYXRhIHdpdGggQ2hhbmdpbmcgTWVhbiAoW1NyaXZhc3RhdmEsIDIwMTVdKCNyZWY6c3JpdmFzdGF2YV8yMDE1KSkiKWAqDQoNCjwvZGl2Pg0KDQo8ZGl2IGNsYXNzPSJjb2x1bW4iIHN0eWxlPSJoZWlnaHQ6MjUwcHgiPg0KDQohW10oaHR0cHM6Ly93d3cuYW5hbHl0aWNzdmlkaHlhLmNvbS93cC1jb250ZW50L3VwbG9hZHMvMjAxNS8wMi9WYXJfbm9uc3RhdGlvbmFyeS5wbmcpeyNmaWc6Tm9uU3RhdGlvbmFyeURhdGFDaGFuZ2luZ1ZhcmlhbmNlfQ0KDQoqYHIgZmlndXJlKG5hbWU9Ik5vblN0YXRpb25hcnlEYXRhQ2hhbmdpbmdWYXJpYW5jZSIsIGNhcHRpb249Ik5vbi1TdGF0aW9uYXJ5IERhdGEgd2l0aCBDaGFuZ2luZyBWYXJpYW5jZSAoW1NyaXZhc3RhdmEsIDIwMTVdKCNyZWY6c3JpdmFzdGF2YV8yMDE1KSkiKWAqDQoNCjwvZGl2Pg0KDQo8L2Rpdj4NCg0KPGRpdiBjbGFzcz0icm93IiBhbGlnbj0iY2VudGVyIj4NCg0KPGNlbnRlcj4NCg0KPGRpdiBjbGFzcz0iY29sdW1uIiBzdHlsZT0id2lkdGg6NTAlIj4NCg0KIVtdKGh0dHBzOi8vd3d3LmFuYWx5dGljc3ZpZGh5YS5jb20vd3AtY29udGVudC91cGxvYWRzLzIwMTUvMDIvQ292X25vbnN0YXRpb25hcnkucG5nKXsjZmlnOk5vblN0YXRpb25hcnlEYXRhQ2hhbmdpbmdDb3ZhcmlhbmNlfQ0KDQoqYHIgZmlndXJlKG5hbWU9Ik5vblN0YXRpb25hcnlEYXRhQ2hhbmdpbmdDb3ZhcmlhbmNlIiwgY2FwdGlvbj0iTm9uLVN0YXRpb25hcnkgRGF0YSB3aXRoIENoYW5naW5nIENvdmFyaWFuY2UgKFtTcml2YXN0YXZhLCAyMDE1XSgjcmVmOnNyaXZhc3RhdmFfMjAxNSkpIilgKg0KDQo8L2Rpdj4NCg0KPC9jZW50ZXI+DQoNCjwvZGl2Pg0KDQoNCiMjIFRlc3QgZm9yIFNlYXNvbmFsaXR5IHsjc2Fzb25hbGl0eX0NCg0KVGhlIHRlc3QgZm9yIFNlYXNvbmFsaXR5IGlzIG5vdCBhIG5lY2Vzc2FyeSB0ZXN0IGJlZm9yZSBkb2luZyBhIHRpbWUtc2VyaWVzIGZvcmVjYXN0aW5nLiBIb3dldmVyLCBpdCBpcyBiZW5lZmljaWFsIHRvIHVuZGVyc3RhbmQgdG8gd2hhdCBleHRlbnQgZG9lcyB0aGUgZGF0YSB2YXJ5IG9yIHJlbWFpbiBjb25zaXN0ZW50IHRocm91Z2hvdXQgZWFjaCBwZXJpb2Qgb2YgYW5hbHlzaXMuIEJ5IGRlY2xhcmluZyB0aGF0IHRoZSBkYXRhIGlzICdzZWFzb25hbCcgaXMgdG8gc2F5IHRoYXQgdGhlIHBlYWtzIGFuZCB0cm91Z2hzIGFyZSB0aGUgc2FtZSBmb3IgZWFjaCBvZiB0aGUgcGVyaW9kcywgYW5kIHRoYXQgdGhlIGZ1dHVyZSBzZWFzb25hbCBwZXJpb2RzIGNvdWxkIGJlIHByZWRpY3RlZCB3aXRoIGEgcmVhc29uYWJsZSBsZXZlbCBvZiBjb25maWRlbmNlLg0KDQpGb3IgdGhpcywgdGhlcmUgYXJlIHR3byBzZWFzb25hbGl0eSB0ZXN0cyB0aGF0IGNhbiBiZSBhcHBsaWVkIHRvIHRoZSBBRU1PIGRhdGEsIHRoZSBmaXJzdCBiZWluZyB0aGUgUVMgdGVzdCAoW09sbGVjaCwgMjAxOV0oI3JlZjpvbGxlY2hfMjAxOSk7IFtTYXgsIG5kLl0oI3JlZjpzYXhfbmQpKSwgYW5kIHRoZSBzZWNvbmQgaXMgdGhlIFNlYXNvbmFsIFN0cmVuZ3RoIHRlc3QgKFtZYW5nICYgSHluZG1hbiwgMjAxOV0oI3JlZjp5YW5nX2h5bmRtYW5fMjAxOSk7IFtIeW5kbWFuLCBuZC4oYSldKCNyZWY6aHluZG1hbl9uZGEpKS4gVGhlIFFTIHRlc3Qgd2lsbCB0byBkZXRlcm1pbmUgaXRzIGxldmVsIG9mIHNlYXNvbmFsaXR5LCB3aGlsZSB0aGUgU2Vhc29uYWwgU3RyZW5ndGggdGVzdCB3aWxsIGRldGVybWluZSB0aGUgc3RyZW5ndGggb2YgdGhlIHNlYXNvbmFsaXR5LiBUaGUgcmVzdWx0cyBvZiB0aGVzZSB0ZXN0cyBhcmUgZGlzcGxheWVkIGluICpbYHIgdGFibGUoIlNlYXNvbmFsaXR5VGVzdEJ5U3RhdGUiKSAlPiUgc3Ryc3BsaXQoIjoiKSAlPiUgdW5saXN0KCkgJT4lIGZpcnN0KClgXSgjdGFiOlNlYXNvbmFsaXR5VGVzdEJ5U3RhdGUpKi4gVGhlIHRocmVzaG9sZCBwLXZhbHVlIGFyZSAkMC4wMiQsIGluZGljYXRpbmcgdGhhdCBpZiBhIHZhbHVlIGlzIGJlbG93IHRoaXMgdGhyZXNob2xkLCB0aGVuIGl0IGlzIHNlYXNvbmFsOyBidXQgaWYgaXQgaXMgYWJvdmUgdGhpcyB0aHJlc2hvbGQsIHRoZW4gaXQgaXMgbm90IHNlYXNvbmFsLiBBcyBzaG93biwgdGhlIGRhdGEgaW4gJFNBJCBpcyBzZWFzb25hbCwgd2hpbGUgdGhlIG90aGVyIHN0YXRlcyBhcmUgbm90IHNlYXNvbmFsLiBUaGlzIGluZm9ybWF0aW9uIGNhbiBiZSB1c2VkIHRvIGNvbnRyb2wgdGhlIGh5cGVyLXBhcmFtZXRlcnMgaW4gdGhlIEFSSU1BIGZvcmVjYXN0aW5nIG1vZGVsLg0KDQoNCltdKCl7I3RhYjpTZWFzb25hbGl0eVRlc3RCeVN0YXRlfQ0KDQpgYGB7ciBBRU1POiBUZXN0IFRTIFNlYXNvbmFsaXR5IFRhYmxlLCBlY2hvPUZBTFNFLCBldmFsPVRSVUUsIHJvd3MucHJpbnQ9NTAsIGNvbHMucHJpbnQ9MzAsIGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD03fQ0KIyBUZXN0IGZvciBTZWFzb25hbGl0eSAtLS0tDQphZW1vX01vbnRobHlUU19hdmdfcHJpY2UgJT4lIA0KICAgIChmdW5jdGlvbih4KXsNCiAgICAgICAgcmV0dXJuMSA8LSBjb2xuYW1lcyh4KSAlPiUgZGF0YS5mcmFtZSgic3RhdGUiPS4sInZhbHVlIj1OQSwidGVzdCI9IlFTIFRlc3QiKQ0KICAgICAgICByZXR1cm4yIDwtIGNvbG5hbWVzKHgpICU+JSBkYXRhLmZyYW1lKCJzdGF0ZSI9LiwidmFsdWUiPU5BLCJ0ZXN0Ij0iU2Vhc29uYWwgU3RyZW5ndGggVGVzdCIpDQogICAgICAgIGZvciAoc3RhdGUgaW4gcmV0dXJuMVssInN0YXRlIl0pIHsNCiAgICAgICAgICAgIHJldHVybjFbcmV0dXJuMVssInN0YXRlIl09PXN0YXRlLCJ2YWx1ZSJdIDwtIHhbLHN0YXRlXSAlPiUgcXMoZnJlcT0xMikgJT4lIHBsdWNrKCJQdmFsIikNCiAgICAgICAgICAgIHJldHVybjJbcmV0dXJuMlssInN0YXRlIl09PXN0YXRlLCJ2YWx1ZSJdIDwtIHhbLHN0YXRlXSAlPiUgc3RsX2ZlYXR1cmVzKCkgJT4lIHBsdWNrKCJzZWFzb25hbF9zdHJlbmd0aCIpDQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuKHJiaW5kKHJldHVybjEscmV0dXJuMikpDQogICAgfSkgJT4lIA0KICAgIG11dGF0ZSh0aHJlc2hvbGQ9MC4wMg0KICAgICAgICAgICxmZWF0dXJlPSJNZWFuIE1vbnRobHkgUHJpY2UiDQogICAgICAgICAgLG91dGNvbWU9Y2FzZV93aGVuKHRlc3Q9PSJRUyBUZXN0IiAmIHZhbHVlPHRocmVzaG9sZCB+ICJJcyBTZWFzb25hbCINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAsdGVzdD09IlFTIFRlc3QiICYgdmFsdWU+dGhyZXNob2xkIH4gIk5vdCBTZWFzb25hbCINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAsdGVzdD09IlNlYXNvbmFsIFN0cmVuZ3RoIFRlc3QiICYgdmFsdWU8dGhyZXNob2xkIH4gIlN0cm9uZyBTZWFzb25hbGl0eSINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAsdGVzdD09IlNlYXNvbmFsIFN0cmVuZ3RoIFRlc3QiICYgdmFsdWU+dGhyZXNob2xkIH4gIldlYWsgU2Vhc29uYWxpdHkiDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKQ0KICAgICAgICAgICkgJT4lIA0KICAgIHNlbGVjdChmZWF0dXJlLHN0YXRlLHRlc3QsZXZlcnl0aGluZygpKSAlPiUgDQogICAgcmVuYW1lX2FsbChmdW5zKHN0cl90b190aXRsZSguKSkpICU+JSANCiAgICBrYWJsZShhbGlnbj0ibCIpICU+JSANCiAgICBrYWJsZV9zdHlsaW5nKGJvb3RzdHJhcF9vcHRpb25zPWMoInN0cmlwZWQiLCJib3JkZXJlZCIsImNvbmRlbnNlZCIpDQogICAgICAgICAgICAgICAgICxmdWxsX3dpZHRoPUZBTFNFDQogICAgICAgICAgICAgICAgICxwb3NpdGlvbj0ibGVmdCINCiAgICAgICAgICAgICAgICAgKSAlPiUgDQogICAgKGZ1bmN0aW9uKHgpew0KICAgICAgICB4ICU+JSBzYXZlX2thYmxlKCJJbWFnZXMvU2Vhc29uYWxpdHlUZXN0QnlTdGF0ZS5wbmciKQ0KICAgICAgICB4ICU+JSByZXR1cm4oKQ0KICAgIH0pDQpgYGANCg0KKmByIHRhYmxlKG5hbWU9IlNlYXNvbmFsaXR5VGVzdEJ5U3RhdGUiLCBjYXB0aW9uPSJUZXN0IGZvciBTZWFzb25hbGl0eSBmb3IgZWFjaCBTdGF0ZSIpYCoNCg0KDQpJbiBhZGRpdGlvbiB0byB0aGUgZm9ybWFsIHRlc3RzIGZvciBTZWFzb25hbGl0eSwgdGhlIHNlYXNvbmFsaXR5IG9mIHRoZSBkYXRhIGNhbiBhbHNvIGJlIHZpc3VhbGlzZWQuIEFzIHNob3duIGJ5IHRoZSAnU2Vhc29uYWwnIHBsb3RzIHdpdGhpbiAqW2ByIGZpZ3VyZSgiQWVtb0RlY29tcG9zaXRpb25CeVN0YXRlIikgJT4lIHN0cnNwbGl0KCI6IikgJT4lIHVubGlzdCgpICU+JSBmaXJzdCgpYF0oI2ZpZzpBZW1vRGVjb21wb3NpdGlvbkJ5U3RhdGUpKiAoYW5kIHBsb3R0ZWQgYWdhaW4gaW4gKltgciBmaWd1cmUoIlNlYXNvbmFsaXR5VGVzdEJ5U3RhdGUiKSAlPiUgc3Ryc3BsaXQoIjoiKSAlPiUgdW5saXN0KCkgJT4lIGZpcnN0KClgXSgjZmlnOlNlYXNvbmFsaXR5VGVzdEJ5U3RhdGUpKiksIHRoZSBkYXRhIGZvciBhbGwgZm91ciBzdGF0ZXMgY2FuIGJlIHNlZW4gYXMgaGF2aW5nIGEgc2VtaS1zZWFzb25hbCB0cmVuZC4gVGhpcyBpcyBiZWNhdXNlIHRoZXJlIGlzIG5vIHNtb290aCB1bmR1bGF0aW9uIGJldHdlZW4gdGhlIHNlYXNvbnM7IG9ubHkgc2hhcnAgc3BvcmFkaWMgc3Bpa2VzIHRocm91Z2hvdXQgZWFjaCBwZXJpb2QuDQoNCg0KW10oKXsjZmlnOlNlYXNvbmFsaXR5UGxvdEJ5U3RhdGV9DQoNCmBgYHtyIEFFTU86IFBsb3QgU2Vhc29uYWxpdHksIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGVjaG89RkFMU0UsIGV2YWw9VFJVRSwgZmlnLndpZHRoPTE1LCBmaWcuaGVpZ2h0PTh9DQojIFBsb3QgU2Vhc29uYWxpdHkgLS0tLQ0KYWVtb19Nb250aGx5VFNfYXZnX3ByaWNlICU+JQ0KICAgIChmdW5jdGlvbih4KXsNCiAgICAgICAgZm9yIChzdGF0ZSBpbiBjb2xuYW1lcyh4KSkgew0KICAgICAgICAgICAgY29sIDwtIGNhc2Vfd2hlbihzdGF0ZT09Ik5TVyIgfiAicmVkIg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICxzdGF0ZT09IlFMRCIgfiAibGltZWdyZWVuIg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICxzdGF0ZT09IlNBIiAgfiAiYmx1ZSINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAsc3RhdGU9PSJWSUMiIH4gIm9yYW5nZSINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApDQogICAgICAgICAgICBhc3NpZ24oc3RhdGUNCiAgICAgICAgICAgICAgICAgICx4WyxzdGF0ZV0gJT4lIA0KICAgICAgICAgICAgICAgICAgICAgIGRlY29tcG9zZSgpICU+JSANCiAgICAgICAgICAgICAgICAgICAgICBwbHVjaygic2Vhc29uYWwiKSAlPiUgDQogICAgICAgICAgICAgICAgICAgICAgYXV0b3Bsb3QoLixjb2xvcj1jb2wpICsgDQogICAgICAgICAgICAgICAgICAgICAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcz1zZXEoMTk5OSwgMjAyMSkpICsgDQogICAgICAgICAgICAgICAgICAgICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJub25lIg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgLHBhbmVsLmdyaWQubWlub3IueD1lbGVtZW50X2JsYW5rKCkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICxheGlzLnRpdGxlLng9ZWxlbWVudF9ibGFuaygpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAscGxvdC50aXRsZT1lbGVtZW50X3RleHQoY29sb3I9Y29sKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgKSArIA0KICAgICAgICAgICAgICAgICAgICAgIGxhYnModGl0bGU9c3RhdGUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgLHk9cGFzdGUwKHN0YXRlLCIgUHJpY2UgKCQvR3doKSIpDQogICAgICAgICAgICAgICAgICAgICAgICAgICx4PSJZZWFyIg0KICAgICAgICAgICAgICAgICAgICAgICAgICApDQogICAgICAgICAgICAgICAgICAsZW52aXI9Z2xvYmFsZW52KCkNCiAgICAgICAgICAgICAgICApDQogICAgICAgICAgICB9DQogICAgICAgIGdyaWQuYXJyYW5nZShOU1cNCiAgICAgICAgICAgICAgICAgICAgLFFMRA0KICAgICAgICAgICAgICAgICAgICAsU0ENCiAgICAgICAgICAgICAgICAgICAgLFZJQw0KICAgICAgICAgICAgICAgICAgICAsbmNvbD0xDQogICAgICAgICAgICAgICAgICAgICxib3R0b209dGV4dEdyb2IoIlRpbWUiLCBoanVzdD0wLjUpDQogICAgICAgICAgICAgICAgICAgICx0b3A9dGV4dEdyb2IoZXhwcmVzc2lvbihib2xkKHVuZGVybGluZSgiU2Vhc29uYWxpdHkgb2YgVGltZSBTZXJpZXMiKSkpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsaGp1c3Q9MC41DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsZ3A9Z3Bhcihmb250c2l6ZT0yMCkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkNCiAgICAgICAgICAgICAgICAgICAgLHBhZGRpbmc9dW5pdCgwLjEsImxpbmUiKQ0KICAgICAgICAgICAgICAgICAgICApICU+JSANCiAgICAgICAgICAgIChmdW5jdGlvbih4KXsNCiAgICAgICAgICAgICAgICBnZ3NhdmUocGxvdD14LCBmaWxlPSJJbWFnZXMvU2Vhc29uYWxpdHlQbG90QnlTdGF0ZS5wbmciKQ0KICAgICAgICAgICAgfSkNCiAgICB9KQ0KYGBgDQoNCipgciBmaWd1cmUobmFtZT0iU2Vhc29uYWxpdHlQbG90QnlTdGF0ZSIsIGNhcHRpb249IlNlYXNvbmFsaXR5IFBsb3QgZm9yIGVhY2ggU3RhdGUiKWAqDQoNCg0KIyMgVGVzdCBmb3IgUmVndWxhcml0eSB7I3JlZ3VsYXJpdHl9DQoNCkxpa2Ugd2l0aCB0ZXN0aW5nIGZvciBTZWFzb25hbGl0eSwgaXQgaXMgbm90IG5lY2Vzc2FyeSB0byB0ZXN0IGZvciBSZWd1bGFyaXR5IGluIG9yZGVyIHRvIHByb2R1Y2UgYSB0aW1lLXNlcmllcyBmb3JlY2FzdC4gSG93ZXZlciwgaXQgaXMgYmVuZWZpY2lhbCB0byBkbyBhcyBpdCBwcm92aWRlcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgYXR0cmlidXRlcyBmb3IgdGhlIGRhdGEuIFRvIHN0YXRlIHRoYXQgdGhlIGRhdGEgaXMgJ3JlZ3VsYXInIGlzIHRvIHNheSB0aGF0IHRoZSBkYXRhIHBvaW50IGFyZSBldmVubHkgc3BhY2VkLCByZWd1bGFybHkgY29sbGVjdGVkLCBhbmQgbm90IG1pc3NpbmcgZGF0YSBwb2ludHMgKGllLiBkbyBub3QgY29udGFpbiBleGNlc3NpdmUgYE5BYCB2YWx1ZXMpLiBMb2dpY2FsbHksIGl0IGlzIG5vdCBhbHdheXMgbmVjZXNzYXJ5IHRvIGNvbmR1Y3QgdGhlIFRlc3QgZm9yIFJlZ3VsYXJpdHkgb24gYXV0b21hdGljYWxseSBjb2xsZWN0ZWQgZGF0YSAobGlrZSBmb3IgZXhhbXBsZSB3aXRoIEVuZXJneSBQcmljZXMsIG9yIERhaWx5IFRlbXBlcmF0dXJlKSwgaG93ZXZlciBpZiB0aGlzIGRhdGEgd2FzIGNvbGxlY3RlZCBtYW51YWxseSB0aGVuIGl0IGlzIGhpZ2hseSByZWNvbW1lbmRlZC4gSWYgdGhlIGRhdGEgZG9lcyBub3QgbWVldCB0aGUgcmVxdWlyZW1lbnRzIG9mIFJlZ3VsYXJpdHksIHRoZW4gaXQgaXMgbmVjZXNzYXJ5IHRvIHJldHVybiB0byB0aGUgZGF0YSBjb2xsZWN0aW9uIHBsYW4sIGFuZCByZXZpc2UgdGhlIG1ldGhvZG9sb2d5IHVzZWQuDQoNCkZvciB0aGUgQUVNTyBkYXRhLCB0aGUgSXMgUmVndWxhciAoW1plaWxlaXMgJiBHcm90aGVuZGllY2sgbmQuXSgjcmVmOnplaWxlaXNfZ3JvdGhlbmRpZWNrX25kKTsgW1plaWxlaXMgbmQuXSgjcmVmOnplaWxlaXNfbmQpKSB0ZXN0IHdhcyBjb25kdWN0ZWQsIHdpdGggdGhlIHJlc3VsdGluZyBvdXRjb21lIHJlcG9ydGVkIGluICpbYHIgdGFibGUoIlJlZ3VsYXJpdHlUZXN0QnlTdGF0ZSIpICU+JSBzdHJzcGxpdCgiOiIpICU+JSB1bmxpc3QoKSAlPiUgZmlyc3QoKWBdKCN0YWI6UmVndWxhcml0eVRlc3RCeVN0YXRlKSouIEFzIHNob3duLCBhbGwgb2YgdGhlIHN0YXRlcyBtZWV0IHRoZSByZXF1aXJlbWVudHMgZm9yIHJlZ3VsYXIgZGF0YSBwb2ludHMsIGFuZCB0aHVzIGNhbiBiZSB1c2VkIGZvciB0aW1lLXNlcmllcyBmb3JlY2FzdGluZy4NCg0KDQpbXSgpeyN0YWI6UmVndWxhcml0eVRlc3RCeVN0YXRlfQ0KDQpgYGB7ciBBRU1POiBUZXN0IFRTIFJlZ3VsYXJpdHksIGVjaG89RkFMU0UsIGV2YWw9VFJVRSwgcm93cy5wcmludD01MCwgY29scy5wcmludD0zMCwgZmlnLndpZHRoPTEwLCBmaWcuaGVpZ2h0PTd9DQojIFRlc3QgZm9yIFJlZ3VsYXJpdHkgLS0tLQ0KYWVtb19Nb250aGx5VFNfYXZnX3ByaWNlICU+JSANCiAgICAoZnVuY3Rpb24oeCl7DQogICAgICAgIHJldHVybiA8LSBjb2xuYW1lcyh4KSAlPiUgZGF0YS5mcmFtZSgic3RhdGUiPS4sInZhbHVlIj1OQSkNCiAgICAgICAgZm9yIChzdGF0ZSBpbiByZXR1cm5bLCJzdGF0ZSJdKSB7DQogICAgICAgICAgICByZXR1cm5bcmV0dXJuWywic3RhdGUiXT09c3RhdGUsInZhbHVlIl0gPC0geFssc3RhdGVdICU+JSBpcy5yZWd1bGFyKCkNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4ocmV0dXJuKQ0KICAgIH0pICU+JSANCiAgICBtdXRhdGUodGVzdD0iSXMgUmVndWxhciINCiAgICAgICAgICAsZmVhdHVyZT0iTWVhbiBNb250aGx5IFByaWNlIg0KICAgICAgICAgICxvdXRjb21lPWlmZWxzZSh2YWx1ZT09VFJVRSwiSXMgUmVndWxhciIsIk5vdCBSZWd1bGFyIikNCiAgICAgICAgICApICU+JSANCiAgICBzZWxlY3QoZmVhdHVyZSxzdGF0ZSx0ZXN0LGV2ZXJ5dGhpbmcoKSkgJT4lIA0KICAgIHJlbmFtZV9hbGwoZnVucyhzdHJfdG9fdGl0bGUoLikpKSAlPiUgDQogICAga2FibGUoYWxpZ249ImwiKSAlPiUgDQogICAga2FibGVfc3R5bGluZyhib290c3RyYXBfb3B0aW9ucz1jKCJzdHJpcGVkIiwiYm9yZGVyZWQiLCJjb25kZW5zZWQiKQ0KICAgICAgICAgICAgICAgICAsZnVsbF93aWR0aD1GQUxTRQ0KICAgICAgICAgICAgICAgICAscG9zaXRpb249ImxlZnQiDQogICAgICAgICAgICAgICAgICkgJT4lIA0KICAgIChmdW5jdGlvbih4KXsNCiAgICAgICAgeCAlPiUgc2F2ZV9rYWJsZSgiSW1hZ2VzL1JlZ3VsYXJpdHlUZXN0QnlTdGF0ZS5wbmciKQ0KICAgICAgICB4ICU+JSByZXR1cm4oKQ0KICAgIH0pDQpgYGANCg0KKmByIHRhYmxlKG5hbWU9IlJlZ3VsYXJpdHlUZXN0QnlTdGF0ZSIsIGNhcHRpb249IlRlc3QgZm9yIFJlZ3VsYXJpdHkgZm9yIGVhY2ggU3RhdGUiKWAqDQoNCg0KIyMgVGVzdCBmb3IgU3RhYmlsaXR5IHsjc3RhYmlsaXR5fQ0KDQpMaWtlIHdpdGggdGhlIFRlc3QgZm9yIFNlYXNvbmFsaXR5IGFuZCB0aGUgVGVzdCBmb3IgUmVndWxhcml0eSwgdGhlIHRlc3QgZm9yIFN0YWJpbGl0eSBpcyBub3QgYSBuZWNlc3NhcnkgdGVzdCBpbiBvcmRlciB0byBwZXJmb3JtIHRpbWUtc2VyaWVzIGZvcmVjYXN0aW5nLiBJdCBpcywgaG93ZXZlciwgcXVpdGUgYmVuZWZpY2lhbCBhcyBhIG1lYXN1cmUgb2YgaG93IG11Y2ggdGhlIGRhdGEgdmFyaWVzIG92ZXIgZWFjaCBwZXJpb2Qgb2YgdGltZS4gSWYgYSBkYXRhLXNldCBpcyB0byBiZSAnc3RhYmxlJywgdGhhdCBtZWFucyB0aGF0IHRoZSBtZWFucyBvZiBlYWNoIHRpbWUgcGVyaW9kIGRvIG5vdCB2YXJ5IGRyYW1hdGljYWxseSBvdmVyIHRpbWUuIEluIG90aGVyIHdvcmRzLCB0aGUgaGlnaGVyIHRoZSB2YXJpYW5jZSBiZXR3ZWVuIHRoZSBtZWFucyBvZiBlYWNoIHRpbWUtcGVyaW9kLCB0aGUgbW9yZSB1bnN0YWJsZSB0aGUgZGF0YSBpcy4NCg0KRm9yIHRoZSBBRU1PIGRhdGEsIHRoZXJlIGFyZSB0d28gdGVzdHMgd2hpY2ggY2FuIGJlIHVzZWQ6IHRoZSBUZXN0IGZvciBTdGFiaWxpdHkgKFtZYW5nICYgSHluZG1hbiwgMjAxOV0oI3JlZjp5YW5nX2h5bmRtYW5fMjAxOSk7IFtIeW5kbWFuLCBuZC4oYSldKCNyZWY6aHluZG1hbl9uZGEpKSBhbmQgdGhlIFRlc3QgZm9yIEx1bXBpbmVzcyAoW1lhbmcgJiBIeW5kbWFuLCAyMDE5XSgjcmVmOnlhbmdfaHluZG1hbl8yMDE5KTsgW0h5bmRtYW4sIG5kLihhKV0oI3JlZjpoeW5kbWFuX25kYSkpLiBXaGlsZSB0aGUgU3RhYmlsaXR5IHRlc3QgbWVhc3VyZXMgdGhlIHZhcmlhbmNlIG9mIHRoZSBtZWFucywgdGhlIEx1bXBpbmVzcyB0ZXN0IG1lYXN1cmVzIHRoZSB2YXJpYW5jZSBvZiB0aGUgdmFyaWFuY2VzLiBGb3IgYm90aCBvZiB0aGVzZSBtZWFzdXJlcywgdGhleSBzaW1wbHkgaW5kaWNhdGUgdGhlIGV4dGVudCB0byB3aGljaCBlYWNoIHNlcmllcyB2YXJpZXMgYnkuIFRoZSBsaW1pdHMgZm9yIHRoaXMgdGVzdCBhcmUgJDAkIGFuZCAkMSQsIHdoZXJlYnksIGEgc2NvcmUgb2YgJDAkIHdvdWxkIGluZGljYXRlIGEgcGVyZmVjdGx5IHN0YWJsZSAob3IgcGVyZmVjdGx5IHNtb290aCkgZGF0YSBzZXQsIHdoaWxlIGEgc2NvcmUgb2YgJDEkIHdvdWxkIGluZGljYXRlIGEgY29tcGxldGVseSB1bnN0YWJsZSAob3IgY29tcGxldGVseSBzcG9yYWRpYykgZGF0YSBzZXQuIEFzIGRpc3BsYXllZCBpbiAqW2ByIHRhYmxlKCJTdGFiaWxpdHlUZXN0QnlTdGF0ZSIpICU+JSBzdHJzcGxpdCgiOiIpICU+JSB1bmxpc3QoKSAlPiUgZmlyc3QoKWBdKCN0YWI6U3RhYmlsaXR5VGVzdEJ5U3RhdGUpKiwgdGhlIG1lYXN1cmVzIGZvciAkTlNXJCBhbmQgJFZJQyQgYXJlIHNvbWV3aGF0IHN0YWJsZSwgd2hpbGUgdGhlIG90aGVyIHN0YXRlcyBhcmUgbm90LiBOb3RpbmcgdGhhdCB0aGUgbWVhc3VyZXMgYXJlIHZlcnkgY2xvc2UgdG8gdGhlIHRocmVzaG9sZC4gSG93ZXZlciwgYWxsIGZvdXIgc3RhdGVzIGFyZSByZWNvcmRlZGx5IG5vdCBsdW1weS4NCg0KDQpbXSgpeyN0YWI6U3RhYmlsaXR5VGVzdEJ5U3RhdGV9DQoNCmBgYHtyIEFFTU86IFRlc3QgVFMgU3RhYmlsaXR5LCBlY2hvPUZBTFNFLCBldmFsPVRSVUUsIHJvd3MucHJpbnQ9NTAsIGNvbHMucHJpbnQ9MzAsIGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD03fQ0KIyBUZXN0IGZvciBTdGFiaWxpdHkgLS0tLQ0KYWVtb19Nb250aGx5VFNfYXZnX3ByaWNlICU+JSANCiAgICAoZnVuY3Rpb24oeCl7DQogICAgICAgIHJldHVybjEgPC0gY29sbmFtZXMoeCkgJT4lIGRhdGEuZnJhbWUoInN0YXRlIj0uLCJ2YWx1ZSI9TkEsInRlc3QiPSJTdGFiaWxpdHkgVGVzdCIpDQogICAgICAgIHJldHVybjIgPC0gY29sbmFtZXMoeCkgJT4lIGRhdGEuZnJhbWUoInN0YXRlIj0uLCJ2YWx1ZSI9TkEsInRlc3QiPSJMdW1waW5lc3MgVGVzdCIpDQogICAgICAgIGZvciAoc3RhdGUgaW4gcmV0dXJuMVssInN0YXRlIl0pIHsNCiAgICAgICAgICAgIHJldHVybjFbcmV0dXJuMVssInN0YXRlIl09PXN0YXRlLCJ2YWx1ZSJdIDwtIHhbLHN0YXRlXSAlPiUgc3RhYmlsaXR5KHdpZHRoPTEyKQ0KICAgICAgICAgICAgcmV0dXJuMltyZXR1cm4yWywic3RhdGUiXT09c3RhdGUsInZhbHVlIl0gPC0geFssc3RhdGVdICU+JSBsdW1waW5lc3Mod2lkdGg9MTIpDQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuKHJiaW5kKHJldHVybjEscmV0dXJuMikpDQogICAgfSkgJT4lIA0KICAgIG11dGF0ZSh0aHJlc2hvbGQ9MC41DQogICAgICAgICAgLGZlYXR1cmU9Ik1lYW4gTW9udGhseSBQcmljZSINCiAgICAgICAgICAsb3V0Y29tZT1jYXNlX3doZW4odGVzdD09IlN0YWJpbGl0eSBUZXN0IiAmIHZhbHVlPnRocmVzaG9sZCB+ICJJcyBTdGFibGUiDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLHRlc3Q9PSJTdGFiaWxpdHkgVGVzdCIgJiB2YWx1ZTx0aHJlc2hvbGQgfiAiTm90IFN0YWJsZSINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAsdGVzdD09Ikx1bXBpbmVzcyBUZXN0IiAmIHZhbHVlPnRocmVzaG9sZCB+ICJJcyBMdW1weSINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAsdGVzdD09Ikx1bXBpbmVzcyBUZXN0IiAmIHZhbHVlPHRocmVzaG9sZCB+ICJOb3QgTHVtcHkiDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKQ0KICAgICAgICAgICkgJT4lIA0KICAgIHNlbGVjdChmZWF0dXJlLHN0YXRlLHRlc3QsZXZlcnl0aGluZygpKSAlPiUgDQogICAgcmVuYW1lX2FsbChmdW5zKHN0cl90b190aXRsZSguKSkpICU+JSANCiAgICBrYWJsZShhbGlnbj0ibCIpICU+JSANCiAgICBrYWJsZV9zdHlsaW5nKGJvb3RzdHJhcF9vcHRpb25zPWMoInN0cmlwZWQiLCJib3JkZXJlZCIsImNvbmRlbnNlZCIpDQogICAgICAgICAgICAgICAgICxmdWxsX3dpZHRoPUZBTFNFDQogICAgICAgICAgICAgICAgICxwb3NpdGlvbj0ibGVmdCINCiAgICAgICAgICAgICAgICAgKSAlPiUgDQogICAgKGZ1bmN0aW9uKHgpew0KICAgICAgICB4ICU+JSBzYXZlX2thYmxlKCJJbWFnZXMvU3RhYmlsaXR5VGVzdEJ5U3RhdGUucG5nIikNCiAgICAgICAgeCAlPiUgcmV0dXJuKCkNCiAgICB9KQ0KYGBgDQoNCipgciB0YWJsZShuYW1lPSJTdGFiaWxpdHlUZXN0QnlTdGF0ZSIsIGNhcHRpb249IlRlc3QgZm9yIFN0YWJpbGl0eSBmb3IgZWFjaCBTdGF0ZSIpYCoNCg0KDQojIyBUZXN0IGZvciBBdXRvLUNvcnJlbGF0aW9uIHsjY29ycmVsYXRpb259DQoNCkFuIGltcG9ydGFudCB0ZXN0IHRvIGRvIG9uIFRpbWUtU2VyaWVzIGRhdGEgaXMgdG8gbWVhc3VyZSBpdCdzIGxldmVsIG9mIEF1dG8tQ29ycmVsYXRpb24gKFtNY011cnJ5ICYgUG9saXRpcywgMjAxMF0oI3JlZjptY211cnJ5X3BvbGl0aXNfMjAxMCk7IFtIeW5kbWFuLCBuZC4oYildKCNyZWY6aHluZG1hbl9uZGIpKS4gV2hpbGUgJ2NvcnJlbGF0aW9uJyByZWZlcnMgdG8gaG93IHR3byB2YXJpYWJsZXMgY2hhbmdlIGJhc2VkIG9uIHRoZSBvdGhlcidzIHZhbHVlLCAnYXV0by1jb3JyZWxhdGlvbicgaXMgaG93IGEgdmFyaWFibGUgY2hhbmdlcyBiYXNlZCBvbiBpdCdzIG93biB2YWx1ZSBvdmVyIHRpbWUgKHRoZSBwaHJhc2UgImF1dG8iIHJlZmVycyB0byAic2VsZiIpLiBGb3IgdGhlIEF1dG8tQ29ycmVsYXRpb24gRnVuY3Rpb24sIGl0IHVzZXMgYSAnJGxhZyQnIGZ1bmN0aW9uLiBGb3IgZXhhbXBsZSwgYSBsYWcgdmFsdWUgb2YgJDAkIGlzICQxMDBcJSQgY29ycmVsYXRlZCwgd2hpY2ggaXMgbG9naWNhbCwgYmVjYXVzZSB0aGF0IGlzIGl0J3Mgb3duIHZhbHVlOyB3aGVyZWFzIGEgbGFnIHZhbHVlIG9mICQxJCBvciBncmVhdGVyLCB0aGUgbGV2ZWwgb2YgYXV0by1jb3JyZWxhdGlvbiBkZWNyZWFzZXMgYXMgaXQgZ2V0J3MgZnVydGhlciBhd2F5IGZyb20gJGxhZ18wJC4NCg0KRm9yIHdlbGwtc3RydWN0dXJlZCB0aW1lLXNlcmllcyBkYXRhIHNldHMsIGl0IHdvdWxkIGJlIGV4cGVjdGVkIHRvIHNlZSBhIGNvbmljYWwtc2hhcGVkIEF1dG8tQ29ycmVsYXRpb24gcGxvdC4gSWYgaXQgd2VyZSBub3QgYSB3ZWxsLXN0cnVjdHVyZWQgdGltZS1zZXJpZXMgZGF0YSBzZXQsIHRoZW4gdGhpcyBBdXRvLUNvcnJlbGF0aW9uIHBsb3Qgd291bGQgbG9vayBtb3JlIGxpa2Ugd2hpdGUgbm9pc2UsIGFuZCB0aGVyZSB3b3VsZCBub3QgYmUgYW55IGxvZ2ljYWwgc2hhcGUuIFRoZSBibHVlIGRvdHRlZCBsaW5lcyBhcmUgaW5jbHVkZWQgYXMgYSByZWZlcmVuY2UgcG9pbnQgZm9yIGRldGVybWluaW5nIGlmIGFueSBvZiB0aGUgb2JzZXJ2YXRpb25zIGFyZSBzaWduaWZpY2FudGx5IGRpZmZlcmVudCBmcm9tIHplcm8uDQoNCk1vcmVvdmVyLCBhbmFseXNpcyBvZiB0aGUgZGF0YSdzIEF1dG8tQ29ycmVsYXRpb24gKEFDRikgc2hvdWxkIGJlIGNvbWJpbmVkIHdpdGggYW5hbHlzaXMgb2YgaXRzIFBhcnRpYWwgQXV0by1Db3JyZWxhdGlvbiAoUEFDRikuIFdoaWxlIHRoZSBBQ0YgaXMgdGhlICJkaXJlY3QiIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGFuIG9ic2VydmF0aW9uIGFuZCBpdCdzIHJlbGV2YW50IGxhZyBvYnNlcnZhdGlvbiwgdGhlIFBBQ0YgcmVtb3ZlcyB0aGUgImluZGlyZWN0IiByZWxhdGlvbnNoaXAgYmV0d2VlbiB0aGVzZSBvYnNlcnZhdGlvbnMuIEVmZmVjdGl2ZWx5LCB0aGUgUGFydGlhbCBBdXRvLUNvcnJlbGF0aW9uIGJldHdlZW4gJGxhZ18xJCBhbmQgJGxhZ181JCBpcyB0aGUgImFjdHVhbCIgY29ycmVsYXRpb24gYmV0d2VlbiB0aGVzZSB0d28gb2JzZXJ2YXRpb25zLCBhZnRlciByZW1vdmluZyB0aGUgaW5mbHVlbmNlIHRoYXQgJGxhZ18yJCwgJGxhZ18zJCwgYW5kICRsYWdfNCQgaGFzIG9uICRsYWdfNSQuDQoNCldoYXQgdGhpcyBtZWFucyBpcyB0aGF0IHRoZSBQYXJ0aWFsIEF1dG8tQ29ycmVsYXRpb24gcGxvdCB3b3VsZCBoYXZlIGEgdmVyeSBoaWdoIHZhbHVlIGF0ICRsYWdfMCQsIHdoaWNoIHdpbGwgZHJvcCB2ZXJ5IHF1aWNrbHkgYXQgJGxhZ18xJCwgYW5kIHNob3VsZCByZW1haW4gYmVsb3cgdGhlIGJsdWUgcmVmZXJlbmNlIGxpbmVzIGZvciB0aGUgcmVtYWluZGVyIG9mIHRoZSBDb3JyZWxvZ3JhbS4gVGhlIG9ic2VydmF0aW9ucyBvZiAkbGFnX3s+MH0kIHNob3VsZCByZXNlbWJsZSB3aGl0ZSBub2lzZSBkYXRhIHBvaW50cy4gSWYgaXQgZG9lcyBub3QgcmVzZW1ibGUgd2hpdGUgbm9pc2UsIGFuZCB0aGVyZSBpcyBhIGRpc3RpbmN0IHBhdHRlcm4gb2NjdXJyaW5nLCB0aGVuIHRoZSBkYXRhIGlzIG5vdCBzdWl0YWJsZSBmb3IgdGltZS1zZXJpZXMgZm9yZWNhc3RpbmcuDQoNCldoZW4gYXBwbGllZCB0byB0aGUgQUVNTyBkYXRhLCBhcyBkaXNwbGF5ZWQgaW4gKltgciBmaWd1cmUoIkF1dG9Db3JyZWxhdGlvbkZ1bmN0aW9uQnlTdGF0ZSIpICU+JSBzdHJzcGxpdCgiOiIpICU+JSB1bmxpc3QoKSAlPiUgZmlyc3QoKWBdKCNmaWc6QXV0b0NvcnJlbGF0aW9uRnVuY3Rpb25CeVN0YXRlKSosIHRoZSBmb2xsb3dpbmcgY29uY2x1c2lvbnMgY2FuIGJlIGRyYXduOg0KDQoxLiAoQUNGKSBBbGwgZm91ciBzdGF0ZXMgYXJlIHN1aXRhYmxlIGZvciB1c2UgaW4gdGltZS1zZXJpZXMgZm9yZWNhc3RpbmcgZHVlIHRvIHRoZWlyIGNvbmljYWwgc2hhcGU7DQoxLiAoUEFDRikgVGhlIGRhdGEgaXMgcmVsYXRpdmVseSBzdGFibGUsIGR1ZSB0byB0aGUgZmFjdCB0aGF0IHRoZSB2YXN0IG1ham9yaXR5IG9mIHRoZSBkYXRhIHBvaW50cyBhcmUgZmFsbGluZyB3aXRoaW4gdGhlIGJsdWUgbGltaXQgbGluZXMuDQoxLiAoQUNGKSBUaGVyZSBpcyBhIHNsaWdodCBpbmNyZWFzZSBpbiBjb3JyZWxhdGlvbiBiZXR3ZWVuICRsYWdfezUwfSQgYW5kICRsYWdfezcwfSQsIHdoaWNoIGlzIGNvbmdydWVudCB3aXRoIHRoZSB0cmVuZCBwYXR0ZXJuIGluY3JlYXNlIGluIHByaWNlIGJldHdlZW4gMjAxMyBhbmQgMjAxNSAoKltgciBmaWd1cmUoIkFlbW9EZWNvbXBvc2l0aW9uQnlTdGF0ZSIpICU+JSBzdHJzcGxpdCgiOiIpICU+JSB1bmxpc3QoKSAlPiUgZmlyc3QoKWBdKCNmaWc6QWVtb0RlY29tcG9zaXRpb25CeVN0YXRlKSopLg0KMS4gKFBBQ0YpIEFsbCBmb3VyIHN0YXRlcyBhcmUgc3VpdGFibGUgZm9yIHVzZSBpbiB0aW1lLXNlcmllcyBmb3JlY2FzdGluZyBkdWUgdG86DQoNCiAgICAxLiBUaGVpciByYXBpZCBkcm9wIGJldHdlZW4gJGxhZ18wJCBhbmQgJGxhZ18xJDsNCiAgICAxLiBUaGVpciBjb25zdGFudCwgcmFuZG9tIHBhdHRlcm4gaW4gJGxhZ197PjB9JDsgYW5kDQoNCg0KW10oKXsjZmlnOkF1dG9Db3JyZWxhdGlvbkZ1bmN0aW9uQnlTdGF0ZX0NCg0KYGBge3IgQUVNTzogVGVzdCBBdXRvLUNvcnJlbGF0aW9uLCBlY2hvPUZBTFNFLCBldmFsPVRSVUUsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGZpZy53aWR0aD0xNSwgZmlnLmhlaWdodD0xMH0NCiMgU2V0IEFDRiAtLS0tDQphZW1vX01vbnRobHlBQ0ZfYXZnX3ByaWNlIDwtIGFlbW9fTW9udGhseVRTREZfYXZnX3ByaWNlICU+JSANCiAgICBnYXRoZXIoInN0YXRlIiwidGVtcCIpICU+JSANCiAgICBncm91cF9ieShzdGF0ZSkgJT4lIA0KICAgIHN1bW1hcmlzZShsaXN0X2FjZj1saXN0KGFjZih0ZW1wLCBsYWcubWF4PTEwOCwgcGxvdD1GQUxTRSkpKSAlPiUNCiAgICBtdXRhdGUoYWNmX3ZhbHM9cHVycnI6Om1hcChsaXN0X2FjZiwgfmFzLm51bWVyaWMoLngkYWNmKSkpICU+JSANCiAgICBzZWxlY3QoLWxpc3RfYWNmKSAlPiUgDQogICAgdW5uZXN0KCkgJT4lDQogICAgZ3JvdXBfYnkoc3RhdGUpICU+JSANCiAgICBtdXRhdGUobGFnPXJvd19udW1iZXIoKSAtIDEpICU+JSANCiAgICB1bmdyb3VwKCkgJT4lIA0KICAgIG11dGF0ZShzdGF0ZT1wYXN0ZShzdGF0ZSwiKEF1dG8tQ29ycmVsYXRpb24pIikpICU+JSANCiAgICBnZ3Bsb3QoYWVzKHg9bGFnLCB5PWFjZl92YWxzLCBjb2xvcj1zdGF0ZSkpICsNCiAgICBnZW9tX2JhcihzdGF0PSJpZGVudGl0eSIsIHdpZHRoPS4wNSkgKw0KICAgIGZhY2V0X3dyYXAofnN0YXRlLCBuY29sPTEsIHN3aXRjaD0ieSIpICsNCiAgICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzPWMoInJlZCIsImxpbWVncmVlbiIsImJsdWUiLCJvcmFuZ2UiKSkgKyANCiAgICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwKSArDQogICAgZ2VvbV9obGluZShkYXRhID0gLiAlPiUgZ3JvdXBfYnkoc3RhdGUpICU+JSBzdW1tYXJpc2UoY2kgPSBxbm9ybSgoMSswLjk1KS8yKS9zcXJ0KG4oKSkpDQogICAgICAgICAgICAgICAsYWVzKHlpbnRlcmNlcHQgPSAtY2kpDQogICAgICAgICAgICAgICAsY29sb3I9ImJsdWUiDQogICAgICAgICAgICAgICAsbGluZXR5cGU9ImRhc2hlZCINCiAgICAgICAgICAgICAgICkgKw0KICAgIGdlb21faGxpbmUoZGF0YSA9IC4gJT4lIGdyb3VwX2J5KHN0YXRlKSAlPiUgc3VtbWFyaXNlKGNpID0gcW5vcm0oKDErMC45NSkvMikvc3FydChuKCkpKQ0KICAgICAgICAgICAgICAgLGFlcyh5aW50ZXJjZXB0ID0gY2kpDQogICAgICAgICAgICAgICAsY29sb3I9ImJsdWUiDQogICAgICAgICAgICAgICAsbGluZXR5cGU9ImRhc2hlZCINCiAgICAgICAgICAgICAgICkgKw0KICAgIHNjYWxlX3hfY29udGludW91cyhicmVha3M9c2VxKDAsMTEwLGJ5PTIwKSkgKw0KICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSINCiAgICAgICAgICAscGFuZWwuZ3JpZC5taW5vci54PWVsZW1lbnRfYmxhbmsoKQ0KICAgICAgICAgICxwYW5lbC5ncmlkLm1pbm9yLnk9ZWxlbWVudF9ibGFuaygpDQogICAgICAgICAgKSArDQogICAgbGFicyh4PSJMYWcgKDEwOCBwZXJpb2RzKSINCiAgICAgICAgICx5PSJMZXZlbCBvZiBDb3JyZWxhdGlvbiAobGltaXRzOiAtMSAmIDEpIg0KICAgICAgICAgKQ0KDQoNCiMgU2V0IFBBQ0YgLS0tLQ0KYWVtb19Nb250aGx5UEFDRl9hdmdfcHJpY2UgPC0gYWVtb19Nb250aGx5VFNERl9hdmdfcHJpY2UgJT4lIA0KICAgIGdhdGhlcigic3RhdGUiLCJ0ZW1wIikgJT4lIA0KICAgIGdyb3VwX2J5KHN0YXRlKSAlPiUgDQogICAgc3VtbWFyaXNlKGxpc3RfYWNmPWxpc3QocGFjZih0ZW1wLCBsYWcubWF4PTEwOCwgcGxvdD1GQUxTRSkpKSAlPiUNCiAgICBtdXRhdGUoYWNmX3ZhbHM9cHVycnI6Om1hcChsaXN0X2FjZiwgfmFzLm51bWVyaWMoLngkYWNmKSkpICU+JSANCiAgICBzZWxlY3QoLWxpc3RfYWNmKSAlPiUgDQogICAgdW5uZXN0KCkgJT4lDQogICAgZ3JvdXBfYnkoc3RhdGUpICU+JSANCiAgICBtdXRhdGUobGFnPXJvd19udW1iZXIoKSAtIDEpICU+JSANCiAgICB1bmdyb3VwKCkgJT4lIA0KICAgIG11dGF0ZShzdGF0ZT1wYXN0ZShzdGF0ZSwiKFBhcnRpYWwgQXV0by1Db3JyZWxhdGlvbikiKSkgJT4lIA0KICAgIGdncGxvdChhZXMoeD1sYWcsIHk9YWNmX3ZhbHMsIGNvbG9yPXN0YXRlKSkgKw0KICAgIGdlb21fYmFyKHN0YXQ9ImlkZW50aXR5Iiwgd2lkdGg9LjA1KSArDQogICAgZmFjZXRfd3JhcCh+c3RhdGUsIG5jb2w9MSwgc3dpdGNoPSJ5IikgKw0KICAgIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXM9YygicmVkIiwibGltZWdyZWVuIiwiYmx1ZSIsIm9yYW5nZSIpKSArIA0KICAgIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDApICsNCiAgICBnZW9tX2hsaW5lKGRhdGEgPSAuICU+JSBncm91cF9ieShzdGF0ZSkgJT4lIHN1bW1hcmlzZShjaSA9IHFub3JtKCgxKzAuOTUpLzIpL3NxcnQobigpKSkNCiAgICAgICAgICAgICAgICxhZXMoeWludGVyY2VwdCA9IC1jaSkNCiAgICAgICAgICAgICAgICxjb2xvcj0iYmx1ZSINCiAgICAgICAgICAgICAgICxsaW5ldHlwZT0iZGFzaGVkIg0KICAgICAgICAgICAgICAgKSArDQogICAgZ2VvbV9obGluZShkYXRhID0gLiAlPiUgZ3JvdXBfYnkoc3RhdGUpICU+JSBzdW1tYXJpc2UoY2kgPSBxbm9ybSgoMSswLjk1KS8yKS9zcXJ0KG4oKSkpDQogICAgICAgICAgICAgICAsYWVzKHlpbnRlcmNlcHQgPSBjaSkNCiAgICAgICAgICAgICAgICxjb2xvcj0iYmx1ZSINCiAgICAgICAgICAgICAgICxsaW5ldHlwZT0iZGFzaGVkIg0KICAgICAgICAgICAgICAgKSArDQogICAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcz1zZXEoMCwxMTAsYnk9MjApKSArDQogICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJub25lIg0KICAgICAgICAgICxwYW5lbC5ncmlkLm1pbm9yLng9ZWxlbWVudF9ibGFuaygpDQogICAgICAgICAgLHBhbmVsLmdyaWQubWlub3IueT1lbGVtZW50X2JsYW5rKCkNCiAgICAgICAgICApICsNCiAgICBsYWJzKHg9IkxhZyAoMTA4IHBlcmlvZHMpIg0KICAgICAgICAgLHk9IkxldmVsIG9mIENvcnJlbGF0aW9uIChsaW1pdHM6IC0xICYgMSkiDQogICAgICAgICApDQoNCg0KIyBEaXNwbGF5IC0tLS0NCmdyaWQuYXJyYW5nZShhZW1vX01vbnRobHlBQ0ZfYXZnX3ByaWNlDQogICAgLGFlbW9fTW9udGhseVBBQ0ZfYXZnX3ByaWNlDQogICAgLG5jb2w9Mg0KICAgICx0b3A9dGV4dEdyb2IoZXhwcmVzc2lvbihib2xkKHVuZGVybGluZSgiQXV0by1Db3JyZWxhdGlvbiBGdW5jdGlvbiBmb3IgTWVhbiBQcmljZSIpKSkNCiAgICAgICAgICAgICAgICAgICxoanVzdD0wLjUNCiAgICAgICAgICAgICAgICAgICxncD1ncGFyKGZvbnRzaXplPTIwKQ0KICAgICAgICAgICAgICAgICAgKQ0KICAgICkgJT4lIA0KICAgIChmdW5jdGlvbih4KXsNCiAgICAgICAgZ2dzYXZlKHBsb3Q9eCwgZmlsZT0iSW1hZ2VzL0F1dG9Db3JyZWxhdGlvbkZ1bmN0aW9uQnlTdGF0ZS5wbmciKQ0KICAgIH0pDQpgYGANCg0KKmByIGZpZ3VyZShuYW1lPSJBdXRvQ29ycmVsYXRpb25GdW5jdGlvbkJ5U3RhdGUiLCBjYXB0aW9uPSJBdXRvLUNvcnJlbGF0aW9uIEZ1bmN0aW9ucyBmb3IgZWFjaCBTdGF0ZSIpYCoNCg0KDQojIEZvcmVjYXN0IHsjZm9yZWNhc3R9DQoNCiMjIENvbnRleHQgeyNjb250ZXh0fQ0KDQpUaGUgcmVzdWx0IG9mIGhhdmluZyBhcHBsaWVkIHRoaXMgdGVzdGluZyB0aGVuIGFsbG93cyB0aGUgZGF0YSB0byBiZSBmb3JlY2FzdCBmb3J3YXJkIHRvIGNyZWF0ZSBhIHByZWRpY3Rpb24gZm9yIHRoZSBmdXR1cmUuIFRoZSBjaG9zZW4gcHJlZGljdGlvbiBtb2RlbCBmb3IgdGhpcyBmb3JlY2FzdCBpcyB0aGUgQVJJTUEgbW9kZWwuICdBUklNQScgaXMgYW4gYWNyb255bSBmb3IgJ0F1dG8tUmVncmVzc2l2ZSBJbnRlZ3JhdGVkIE1vdmluZyBBdmVyYWdlJyAoW0thbmcsIDIwMTddKCNyZWY6a2FuZ18yMDE3KSksIGFuZCBpcyBicm9rZW4gaW4gdG8gdGhyZWUgcGFydHMgaW4gb3JkZXIgdG8gbWFrZSB0aGUgbW9kZWwgZml0IHRoZSBkYXRhIGFzIHdlbGwgYXMgcG9zc2libGU6DQoNCjEuICoqQXV0byBSZWdyZXNzaXZlKio6IEluZGljYXRpbmcgbGV2ZWwgdG8gd2hpY2ggYW4gZXZvbHZpbmcgdmFyaWFibGUgKCpwcmVkaWN0b3IqKSBpcyByZWdyZXNzZWQgKCpwcmVkaWN0ZWQqKSBiYXNlZCBvbiBpdCdzIG93biBsYWdnZWQgKCpwcmV2aW91cyopIG9ic2VydmVkIHZhbHVlcy4NCjEuICoqSW50ZWdyYXRlZCoqOiBJbmRpY2F0aW5nIHRoZSBsZXZlbCBvZiAqZGlmZmVyZW5jaW5nKiB0byBiZSBhcHBsaWVkIHRvIHRoZSBkYXRhIGJldHdlZW4gdGhlIG9ic2VydmVkIHZhbHVlICgqcHJlZGljdG9yKikgYW5kIGFuIG9ic2VydmVkIHZhbHVlIGluIHRoZSBwcmV2aW91cyB0aW1lIHN0ZXAgKCpwcmV2aW91cyopLiBFZmZlY3RpdmVseSwgYnkgZG9pbmcgdGhpcyBzdWJ0cmFjdGlvbiBhbGxvd3MgdGhlIHByb3BlcnRpZXMgb2YgdGhlIHRpbWUtc2VyaWVzIGRhdGEgdG8gbm90IGRlcGVuZCBvbiB0aGUgdGltZSBvZiB0aGUgb2JzZXJ2YXRpb24sIHRodXMgZWxpbWluYXRpbmcgdHJlbmQgYW5kIHNlYXNvbmFsaXR5LCBhbmQgdGhlbiBhbHNvIHN0YWJpbGlzZXMgdGhlIG1lYW4gb2YgdGhlIHRpbWUgc2VyaWVzLg0KMS4gKipNb3ZpbmcgQXZlcmFnZSoqOiBJbmRpY2F0aW5nIHRoZSBsZXZlbCBvZiBkZXBlbmRlbmN5IGJldHdlZW4gYW4gb2JzZXJ2ZWQgdmFsdWUgKCpwcmVkaWN0b3IqKSBhbmQgdGhlIHJlc2lkdWFsIGVycm9yIGZyb20gYSBtb3ZpbmcgYXZlcmFnZSBtb2RlbCBhcHBsaWVkIHRvIGl0J3Mgb3duIGxhZ2dlZCAoKnByZXZpb3VzKikgb2JzZXJ2ZWQgdmFsdWVzLg0KDQoNCiMjIFByZWRpY3Rpb24geyNwcmVkaWN0aW9ufQ0KDQpUaGlzIEFSSU1BIG1vZGVsIHRodXMgYmVpbmcgYXBwbGllZCB0byB0aGUgQUVNTyBkYXRhIHByb2R1Y2VzIGEgcHJlZGljdGlvbiBhcyByZWNvcmRlZCBpbiAqW2ByIGZpZ3VyZSgiRm9yZWNhc3RQbG90QnlTdGF0ZSIpICU+JSBzdHJzcGxpdCgiOiIpICU+JSB1bmxpc3QoKSAlPiUgZmlyc3QoKWBdKCNmaWc6Rm9yZWNhc3RQbG90QnlTdGF0ZSkqLiBUaGlzIGZpZ3VyZSBoYXMgdGhlIGZvbGxvd2luZyBmZWF0dXJlczoNCg0KMS4gVGhlIGNvbG91cmVkIGxpbmUgaW5kaWNhdGVzIHRoZSBzdGF0ZS4NCjEuIFRoZSBkYXJrZXIgcmliYm9uIGlzIHRoZSBmb3JlY2FzdCBwcmVkaWN0aW9uIHdpdGggYW4gJDgwXCUkIGNvbmZpZGVuY2UgaW50ZXJ2YWwuDQoxLiBUaGUgbGlnaHRlciByaWJib24gaXMgdGhlIGZvcmVjYXN0IHByZWRpY3Rpb24gd2l0aCBhbiAkOTBcJSQgY29uZmlkZW5jZSBpbnRlcnZhbC4NCjEuIFRoZSB0aGljayBibGFjayBsaW5lIGlzIHRoZSBhY3R1YWwgb2JzZXJ2YXRpb25zLCBmb3IgdGhlIGRhdGEgaGFzIGJlZW4gc3BsaXQgaW4gdG8gKlRlc3QqIGFuZCAqVHJhaW4qIGRhdGEgc2V0cy4NCg0KVXBvbiBhbmFseXNpcyBvZiB0aGlzIGZvcmVjYXN0LCB0aGUgZm9sbG93aW5nIHByZWRpY3Rpb25zIGNhbiBiZSBtYWRlOg0KDQoxLiBUaGUgZm9yZWNhc3QgZm9yICROU1ckIGFuZCAkUUxEJCBoYXZlIGEgcmliYm9uIHNoYXBlLCB3aGlsZSAkU0EkIGFuZCAkVklDJCBoYXZlIGEgY29uaWNhbCBzaGFwZS4NCjEuIFRoZSBmb3JlY2FzdCBmb3IgJFFMRCQgYW5kICRWSUMkIGhhdmUgYSByZWxhdGl2ZWx5IHN0YWJsZSwgZmxhdCBwcmVkaWN0aW9uLCB3aGlsZSB0aGUgZm9yZWNhc3QgZm9yICROU1ckIGFuZCAkU0EkIGhhdmUgYSBzbGlnaHRseSB1cHdhcmQgdHJlbmQuDQoxLiBBbGwgZm91ciBzdGF0ZXMgaGF2ZSBhIHdpZGUgbGV2ZWwgb2YgdW5jZXJ0YWludHkgKCRcYXBwcm94XHBtXCQ0MFwgcGVyXCBHd2gkKQ0KDQoNCltdKCl7I2ZpZzpGb3JlY2FzdFBsb3RCeVN0YXRlfQ0KDQpgYGB7ciBBRU1POiBGb3JlY2FzdCwgZWNobz1GQUxTRSwgZXZhbD1UUlVFLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCBmaWcud2lkdGg9MTUsIGZpZy5oZWlnaHQ9MTB9DQojIFBlcmZvcm0gRm9yZWNhc3QgLS0tLQ0KYWVtb19Nb250aGx5VFNfYXZnX3ByaWNlICU+JSANCiAgICAoZnVuY3Rpb24oeCl7DQogICAgICAgIA0KICAgICAgICAjIFNldCB1cA0KICAgICAgICBhZW1vX2FjYyA8PC0gTlVMTA0KICAgICAgICB0ZXN0eWVhcnMgPC0gMQ0KICAgICAgICB5ZWFyc2JhY2sgPC0gMjANCg0KICAgICAgICBmb3IgKHN0YXRlIGluIGNvbG5hbWVzKHgpKSB7DQogICAgICAgICAgICANCiAgICAgICAgICAgIHhbLHN0YXRlXSAlPiUgKGZ1bmN0aW9uKHgpew0KICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgIyBTdWIgU2V0IHVwDQogICAgICAgICAgICAgICAgY29sIDwtIGNhc2Vfd2hlbigNCiAgICAgICAgICAgICAgICAgICAgc3RhdGU9PSJOU1ciIH4gInJlZCINCiAgICAgICAgICAgICAgICAgICAgLHN0YXRlPT0iUUxEIiB+ICJncmVlbiINCiAgICAgICAgICAgICAgICAgICAgLHN0YXRlPT0iU0EiIH4gImJsdWUiDQogICAgICAgICAgICAgICAgICAgICxzdGF0ZT09IlZJQyIgfiAib3JhbmdlIg0KICAgICAgICAgICAgICAgICAgICApDQogICAgICAgICAgICAgICAgZnJlcXVlbmN5IDwtIHggJT4lIA0KICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzKCkgJT4lIA0KICAgICAgICAgICAgICAgICAgICBwbHVjaygidHNwIikgJT4lIA0KICAgICAgICAgICAgICAgICAgICBsYXN0KCkNCiAgICAgICAgICAgICAgICBpZiAoZnJlcXVlbmN5ICVpbiUgYygxMiwxMykpIHsNCiAgICAgICAgICAgICAgICAgICAgZm9yZWNhc3RwZXJpb2QgPC0gY2FzZV93aGVuKA0KICAgICAgICAgICAgICAgICAgICAgICAgdGVzdHllYXJzPT0xIH4gKDEyKjIrNSkNCiAgICAgICAgICAgICAgICAgICAgICAgICx0ZXN0eWVhcnM9PTIgfiAoMTIqMys1KQ0KICAgICAgICAgICAgICAgICAgICAgICAgLHRlc3R5ZWFycz09MyB+ICgxMio0KzUpDQogICAgICAgICAgICAgICAgICAgICAgICApDQogICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgZm9yZWNhc3RwZXJpb2QgPC0gY2FzZV93aGVuKA0KICAgICAgICAgICAgICAgICAgICAgICAgdGVzdHllYXJzPT0xIH4gKDUyKjIgKyAxMCkNCiAgICAgICAgICAgICAgICAgICAgICAgICx0ZXN0eWVhcnM9PTIgfiAoNTIqMyArIDEwKQ0KICAgICAgICAgICAgICAgICAgICAgICAgLHRlc3R5ZWFycz09MyB+ICg1Mio0ICsgMTApDQogICAgICAgICAgICAgICAgICAgICAgICApDQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIHN0YXRpb25hcnkgPC0gY2FzZV93aGVuKA0KICAgICAgICAgICAgICAgICAgICBzdGF0ZT09Ik5TVyIgfiBGQUxTRQ0KICAgICAgICAgICAgICAgICAgICAsc3RhdGU9PSJRTEQiIH4gRkFMU0UNCiAgICAgICAgICAgICAgICAgICAgLHN0YXRlPT0iU0EiIH4gRkFMU0UNCiAgICAgICAgICAgICAgICAgICAgLHN0YXRlPT0iVklDIiB+IEZBTFNFDQogICAgICAgICAgICAgICAgICAgICkNCiAgICAgICAgICAgICAgICBzZWFzb25hbCA8LSBjYXNlX3doZW4oDQogICAgICAgICAgICAgICAgICAgIHN0YXRlPT0iTlNXIiB+IFRSVUUNCiAgICAgICAgICAgICAgICAgICAgLHN0YXRlPT0iUUxEIiB+IFRSVUUNCiAgICAgICAgICAgICAgICAgICAgLHN0YXRlPT0iU0EiIH4gVFJVRQ0KICAgICAgICAgICAgICAgICAgICAsc3RhdGU9PSJWSUMiIH4gVFJVRQ0KICAgICAgICAgICAgICAgICAgICApDQogICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgIyBTZWdtZW50DQogICAgICAgICAgICAgICAgaWYgKHllYXJzYmFjaz4wKSB7DQogICAgICAgICAgICAgICAgICAgIHggJTw+JSB3aW5kb3coc3RhcnQ9Yyh4ICU+JSBlbmQoKSAlPiUgZmlyc3QoKS0oeWVhcnNiYWNrK3Rlc3R5ZWFycykNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLHggJT4lIGVuZCgpICU+JSBsYXN0KCkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSkNCiAgICAgICAgICAgICAgICB9IA0KICAgICAgICAgICAgICAgIGFlbW9fdHJuIDwtIHggJT4lIA0KICAgICAgICAgICAgICAgICAgICB3aW5kb3coZW5kPWMoeCAlPiUgZW5kKCkgJT4lIGZpcnN0KCktdGVzdHllYXJzDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICx4ICU+JSBlbmQoKSAlPiUgbGFzdCgpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkpDQogICAgICAgICAgICAgICAgYWVtb190c3QgPC0geCAlPiUgDQogICAgICAgICAgICAgICAgICAgIHdpbmRvdyhzdGFydD1jKHggJT4lIGVuZCgpICU+JSBmaXJzdCgpLXRlc3R5ZWFycw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICx4ICU+JSBlbmQoKSAlPiUgbGFzdCgpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSkNCiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAjIEZpdA0KICAgICAgICAgICAgICAgIGFlbW9fZml0IDwtIGFlbW9fdHJuICU+JSBhdXRvLmFyaW1hKG1heC5wPTIwDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsbWF4LnE9MjANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICxzdGF0aW9uYXJ5PXN0YXRpb25hcnkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICxzZWFzb25hbD1zZWFzb25hbA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLGljPSJhaWNjIg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLHN0ZXB3aXNlPUZBTFNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApDQogICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgIyBGb3JlY2FzdA0KICAgICAgICAgICAgICAgIGFlbW9fZmNzIDwtIGFlbW9fZml0ICU+JSBmb3JlY2FzdChoPWxlbmd0aChhZW1vX3RzdCkpDQogICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgIyBUZXN0DQogICAgICAgICAgICAgICAgYWVtb19hY2MgPDwtIGFjY3VyYWN5KGFlbW9fZmNzLCBhZW1vX3RzdCkgJT4lIA0KICAgICAgICAgICAgICAgICAgICBkYXRhLmZyYW1lKCkgJT4lIA0KICAgICAgICAgICAgICAgICAgICBzZWxlY3QoIlJNU0UiLCJNQUUiLCJNQVBFIiwiTUFTRSIpICU+JSANCiAgICAgICAgICAgICAgICAgICAgcm93bmFtZXNfdG9fY29sdW1uKCJTZXRUeXBlIikgJT4lIA0KICAgICAgICAgICAgICAgICAgICBmaWx0ZXIoU2V0VHlwZT09IlRlc3Qgc2V0IikgJT4lIA0KICAgICAgICAgICAgICAgICAgICBzZWxlY3QoLVNldFR5cGUpICU+JSANCiAgICAgICAgICAgICAgICAgICAgbXV0YXRlKFN0YXRlPXN0YXRlKSAlPiUgDQogICAgICAgICAgICAgICAgICAgIHNlbGVjdChTdGF0ZSxldmVyeXRoaW5nKCkpICU+JSANCiAgICAgICAgICAgICAgICAgICAgcmJpbmQoYWVtb19hY2MsLikNCiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAjIFBsb3QNCiAgICAgICAgICAgICAgICBhc3NpZ24ocGFzdGUwKCJhZW1vX0Zjc1BsdF8iLHN0YXRlKQ0KICAgICAgICAgICAgICAgICAgICAgICx4ICU+JQ0KICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvcGxvdChjb2xvcj1wYXN0ZTAoImRhcmsiLGNvbCkpICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0b2xheWVyKGFlbW9fZml0ICU+JSBmb3JlY2FzdChoPWZvcmVjYXN0cGVyaW9kKSwgUEk9VFJVRSwgc2VyaWVzPSJGb3JlY2FzdCIsIGNvbG9yPWNvbCwgc2l6ZT0xKSArDQogICAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9sYXllcihhZW1vX3RzdCwgY29sb3I9ImJsYWNrIiwgc2l6ZT0xKSArDQogICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlX3hfY29udGludW91cyhicmVha3M9c2VxKDE5OTksMjAyMSkpICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcz1zZXEoMCwxODAsNDApDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICxsaW1pdHM9YygwLDE4MCkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSArDQogICAgICAgICAgICAgICAgICAgICAgICAgIHRoZW1lKGF4aXMudGl0bGUueD1lbGVtZW50X2JsYW5rKCkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAscGxvdC50aXRsZT1lbGVtZW50X3RleHQodmp1c3Q9LTYsIGNvbG9yPXBhc3RlMCgiZGFyayIsY29sKSkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAscGFuZWwuZ3JpZC5taW5vci54PWVsZW1lbnRfYmxhbmsoKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICxwbG90Lm1hcmdpbj11bml0KGMoMC4xLDMsMC4xLDMpLCJtbSIpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSArDQogICAgICAgICAgICAgICAgICAgICAgICAgIGxhYnModGl0bGU9c3RhdGUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICx5PXBhc3RlKHN0YXRlLCJQcmljZSAoJC9Hd0gpIikNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICxjYXB0aW9uPWFlbW9fYWNjICU+JSBmaWx0ZXIoU3RhdGU9PXN0YXRlKSAlPiUgc2VsZWN0KCJSTVNFIikgJT4lIHB1bGwoKSAlPiUgcm91bmQoMikgJT4lIHBhc3RlMCgiU2NvcmVkIFJNU0U9IiwuKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQ0KICAgICAgICAgICAgICAgICAgICAgICxlbnZpcj1nbG9iYWxlbnYoKQ0KICAgICAgICAgICAgICAgICAgICAgICkNCiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgIH0pDQogICAgICAgICAgICANCiAgICAgICAgfQ0KICAgICAgICANCiAgICAgICAgIyBSZXR1cm4NCiAgICAgICAgZ3JpZC5hcnJhbmdlKA0KICAgICAgICAgICAgYWVtb19GY3NQbHRfTlNXDQogICAgICAgICAgICAsYWVtb19GY3NQbHRfUUxEDQogICAgICAgICAgICAsYWVtb19GY3NQbHRfU0ENCiAgICAgICAgICAgICxhZW1vX0Zjc1BsdF9WSUMNCiAgICAgICAgICAgICxuY29sPTENCiAgICAgICAgICAgICxib3R0b209dGV4dEdyb2IoIlRpbWUiLCBoanVzdD0wLjUpDQogICAgICAgICAgICAsdG9wPXRleHRHcm9iKGV4cHJlc3Npb24oYm9sZCh1bmRlcmxpbmUoIkZvcmVjYXN0IGJ5IFN0YXRlIikpKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAsaGp1c3Q9MC41DQogICAgICAgICAgICAgICAgICAgICAgICAgICxncD1ncGFyKGZvbnRzaXplPTIwKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICApDQogICAgICAgICAgICAscGFkZGluZz11bml0KDAuMSwibGluZSIpDQogICAgICAgICAgICApICU+JSANCiAgICAgICAgICAgIChmdW5jdGlvbih4KXsNCiAgICAgICAgICAgICAgICBnZ3NhdmUocGxvdD14LCBmaWxlPSJJbWFnZXMvRm9yZWNhc3RQbG90QnlTdGF0ZS5wbmciKQ0KICAgICAgICAgICAgfSkNCiAgICANCiAgICB9KQ0KYGBgDQoNCipgciBmaWd1cmUobmFtZT0iRm9yZWNhc3RQbG90QnlTdGF0ZSIsIGNhcHRpb249IlBsb3Qgb2YgRm9yZWNhc3QgZm9yIGVhY2ggU3RhdGUsIEluY2x1ZGluZyBBY3R1YWwgVGVtcGVyYXR1cmUiKWAqDQoNCg0KIyMgQWNjdXJhY3kgeyNhY2N1cmFjeX0NCg0KVXNpbmcgdGhlIGRhdGEgaW4gdGhlICpUZXN0Ki8qVHJhaW4qIHNwbGl0LCB0aGUgbGV2ZWwgb2YgYWNjdXJhY3kgZm9yIHRoZSBwcmVkaWN0aW9uIGNhbiBiZSBjYWxjdWxhdGVkLg0KDQpUaGVyZSBhcmUgZm91ciBtZWFzdXJlbWVudCBzY29yZXMgc2hvd24gaW4gKltgciB0YWJsZSgiRm9yZWNhc3RTY29yZUJ5U3RhdGUiKSAlPiUgc3Ryc3BsaXQoIjoiKSAlPiUgdW5saXN0KCkgJT4lIGZpcnN0KClgXSgjZmlnOkZvcmVjYXN0U2NvcmVCeVN0YXRlKSosIGJlaW5nOg0KDQoxLiBSb290IE1lYW4gU3F1YXJlIEVycm9yIChSTVNFKSwNCjEuIE1lYW4gQXZlcmFnZSBFcnJvciAoTUFFKSwNCjEuIE1lYW4gQWJzb2x1dGUgUGVyY2VudGFnZSBFcnJvciAoTUFQRSksIGFuZA0KMS4gTWVhbiBBYnNvbHV0ZSBTY2FsZWQgRXJyb3IgKE1BU0UpLg0KDQpUaGUgY2hvc2VuIG1ldHJpYyBmb3IgdGhpcyBhbmFseXNpcyBpcyB0aGUgUk1TRSBkdWUgdG8gaXQncyBhYmlsaXR5IHRvIHB1bmlzaCBzY29yZXMgdGhhdCBhcmUgZnVydGhlciBhd2F5IGZyb20gdGhlIHByZWRpY3Rpb24uIEZvciBSTVNFLCBhIGxvd2VyIHNjb3JlIGlzIGJldHRlciwgYXMgaXQgaW5kaWNhdGVzIGEgbG93ZXIgYW1vdW50IG9mIGVycm9yLiBBcyBzaG93biBpbiB0aGlzIHRhYmxlLCB0aGUgTlNXIFByZWRpY3Rpb24gc2NvcmVkIGJlc3QgaW4gYWxsIGZvdXIgbWV0cmljcywgd2hpbGUgVklDIHNjb3JlZCB0aGUgd29yc3QuIFRoaXMgcmVzdWx0IGlzIGluIGFsaWdubWVudCB3aXRoIHRoZSBhY3R1YWwgc2NvcmVzIHNob3duIGluICpbYHIgZmlndXJlKCJGb3JlY2FzdFBsb3RCeVN0YXRlIikgJT4lIHN0cnNwbGl0KCI6IikgJT4lIHVubGlzdCgpICU+JSBmaXJzdCgpYF0oI2ZpZzpGb3JlY2FzdFBsb3RCeVN0YXRlKSosIGJlY2F1c2UgTlNXIGlzIGNsb3Nlc3QgdG8gdGhlIHByZWRpY3Rpb24gd2hpbGUgVklDIGlzIGNvbnNpc3RlbnRseSB0aGUgZnVydGhlc3QgYXdheS4NCg0KDQpbXSgpeyN0YWI6Rm9yZWNhc3RTY29yZUJ5U3RhdGV9DQoNCmBgYHtyIEFFTU86IFNjb3JlLCBlY2hvPUZBTFNFLCBldmFsPVRSVUUsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIGZpZy53aWR0aD0xNSwgZmlnLmhlaWdodD04fQ0KIyBTY29yZSAtLS0tDQphZW1vX2FjYyAlPiUgDQogICAga2FibGUoYWxpZ249ImwiKSAlPiUgDQogICAga2FibGVfc3R5bGluZyhib290c3RyYXBfb3B0aW9ucz1jKCJzdHJpcGVkIiwiYm9yZGVyZWQiLCJjb25kZW5zZWQiKQ0KICAgICAgICAgICAgICAgICAsZnVsbF93aWR0aD1GQUxTRQ0KICAgICAgICAgICAgICAgICAscG9zaXRpb249ImxlZnQiDQogICAgICAgICAgICAgICAgICkgJT4lIA0KICAgIChmdW5jdGlvbih4KXsNCiAgICAgICAgeCAlPiUgc2F2ZV9rYWJsZSgiSW1hZ2VzL0ZvcmVjYXN0U2NvcmVCeVN0YXRlLnBuZyIpDQogICAgICAgIHggJT4lIHJldHVybigpDQogICAgfSkNCmBgYA0KDQoqYHIgdGFibGUobmFtZT0iRm9yZWNhc3RTY29yZUJ5U3RhdGUiLCBjYXB0aW9uPSJTY29yZSBvZiB0aGUgRm9yZWNhc3QgZm9yIGVhY2ggU3RhdGUiKWAqDQoNCg0KIyMgTG9uZy1UZXJtIEZvcmVjYXN0IHsjbG9uZ3JhbmdlfQ0KDQpVc2luZyB0aGlzIHRyYWluZWQgbW9kZWwsIHRoZSBmb3JlY2FzdCBpcyB0aGVuIHByb2plY3RlZCBmb3J3YXJkIHRvIHRoZSB5ZWFyICQyMDI2JCwgYXMgZGlzcGxheWVkIGluICpbYHIgZmlndXJlKCJMb25nVGVybUZvcmVjYXN0UGxvdEJ5U3RhdGUiKSAlPiUgc3Ryc3BsaXQoIjoiKSAlPiUgdW5saXN0KCkgJT4lIGZpcnN0KClgXSgjZmlnOkxvbmdUZXJtRm9yZWNhc3RQbG90QnlTdGF0ZSkqLiBBbmFseXNpcyBvZiB0aGlzIHByb2plY3RlZCBmb3JlY2FzdCBpbmRpY2F0ZXMgdGhlIGZvbGxvd2luZzoNCg0KMS4gVGhhdCB0aGUgbG9uZy10ZXJtIGVuZXJneSBwcmljZXMgd2lsbCBub3QgYmUgc2lnbmlmaWNhbnRseSBkaWZmZXJlbnQgdGhhbiB0aGUgcHJpY2VzIHNlZW4gaW4gdGhlIHllYXIgJDIwMTkkLg0KMS4gRHVlIHRvIHRoZSBzcG9yYWRpYyBuYXR1cmUgb2YgdGhlIGhpc3RvcmljIHByaWNlcywgdGhlIGxldmVsIG9mIHVuY2VydGFpbnR5IG9mIHRoaXMgZm9yZWNhc3QgZ2V0cyB3aWRlciBpbiAkVklDJCBhbmQgJFNBJDsgYXMgc2VlbiBieSB0aGUgY29uaWNhbCBzaGFwZSBvZiB0aGUgZm9yZWNhc3QuDQoxLiBUaGUgc2hhcGUgb2YgdGhlICROU1ckIGFuZCAkUUxEJCBmb3JlY2FzdHMgYXJlIG1vcmUgcmliYm9uLWxpa2UsIGluZGljYXRpbmcgbGVzcyB2b2xhdGlsaXR5IGluIGZ1dHVyZSBwcmljZXMuDQoNCg0KW10oKXsjZmlnOkxvbmdUZXJtRm9yZWNhc3RQbG90QnlTdGF0ZX0NCg0KYGBge3IgQUVNTzogTG9uZyBUZXJtIEZvcmVjYXN0LCBlY2hvPUZBTFNFLCBldmFsPVRSVUUsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIGZpZy53aWR0aD0xNSwgZmlnLmhlaWdodD0xMH0NCiMgUGVyZm9ybSBGb3JlY2FzdCAtLS0tDQphZW1vX01vbnRobHlUU19hdmdfcHJpY2UgJT4lIA0KICAgIChmdW5jdGlvbih4KXsNCiAgICAgICAgDQogICAgICAgICMgU2V0IHVwDQogICAgICAgIHllYXJzZm9ydyA8LSA2DQoNCiAgICAgICAgZm9yIChzdGF0ZSBpbiBjb2xuYW1lcyh4KSkgew0KICAgICAgICAgICAgDQogICAgICAgICAgICB4WyxzdGF0ZV0gJT4lIChmdW5jdGlvbih4KXsNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICMgU3ViIFNldCB1cA0KICAgICAgICAgICAgICAgIGNvbCA8LSBjYXNlX3doZW4oDQogICAgICAgICAgICAgICAgICAgIHN0YXRlPT0iTlNXIiB+ICJyZWQiDQogICAgICAgICAgICAgICAgICAgICxzdGF0ZT09IlFMRCIgfiAiZ3JlZW4iDQogICAgICAgICAgICAgICAgICAgICxzdGF0ZT09IlNBIiB+ICJibHVlIg0KICAgICAgICAgICAgICAgICAgICAsc3RhdGU9PSJWSUMiIH4gIm9yYW5nZSINCiAgICAgICAgICAgICAgICAgICAgKQ0KICAgICAgICAgICAgICAgIGZyZXF1ZW5jeSA8LSB4ICU+JSANCiAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlcygpICU+JSANCiAgICAgICAgICAgICAgICAgICAgcGx1Y2soInRzcCIpICU+JSANCiAgICAgICAgICAgICAgICAgICAgbGFzdCgpDQogICAgICAgICAgICAgICAgaWYgKGZyZXF1ZW5jeSAlaW4lIGMoMTIpKSB7DQogICAgICAgICAgICAgICAgICAgIGZvcmVjYXN0cGVyaW9kIDwtIHllYXJzZm9ydyAqIGZyZXF1ZW5jeQ0KICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZnJlcXVlbmN5ICVpbiUgYyg1MikpIHsNCiAgICAgICAgICAgICAgICAgICAgZm9yZWNhc3RwZXJpb2QgPC0geWVhcnNmb3J3ICogZnJlcXVlbmN5DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIHN0YXRpb25hcnkgPC0gY2FzZV93aGVuKA0KICAgICAgICAgICAgICAgICAgICBzdGF0ZT09Ik5TVyIgfiBGQUxTRQ0KICAgICAgICAgICAgICAgICAgICAsc3RhdGU9PSJRTEQiIH4gRkFMU0UNCiAgICAgICAgICAgICAgICAgICAgLHN0YXRlPT0iU0EiIH4gRkFMU0UNCiAgICAgICAgICAgICAgICAgICAgLHN0YXRlPT0iVklDIiB+IEZBTFNFDQogICAgICAgICAgICAgICAgICAgICkNCiAgICAgICAgICAgICAgICBzZWFzb25hbCA8LSBjYXNlX3doZW4oDQogICAgICAgICAgICAgICAgICAgIHN0YXRlPT0iTlNXIiB+IFRSVUUNCiAgICAgICAgICAgICAgICAgICAgLHN0YXRlPT0iUUxEIiB+IFRSVUUNCiAgICAgICAgICAgICAgICAgICAgLHN0YXRlPT0iU0EiIH4gVFJVRQ0KICAgICAgICAgICAgICAgICAgICAsc3RhdGU9PSJWSUMiIH4gVFJVRQ0KICAgICAgICAgICAgICAgICAgICApDQogICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgIyBTZWdtZW50DQogICAgICAgICAgICAgICAgYWVtb190cmVuZCA8LSB4ICU+JSANCiAgICAgICAgICAgICAgICAgICAgZGVjb21wb3NlKCkgJT4lIA0KICAgICAgICAgICAgICAgICAgICBwbHVjaygidHJlbmQiKQ0KICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICMgRml0DQogICAgICAgICAgICAgICAgYWVtb19maXQgPC0geCAlPiUgYXV0by5hcmltYShtYXgucD0yMA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsbWF4LnE9MjANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLHN0YXRpb25hcnk9c3RhdGlvbmFyeQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsc2Vhc29uYWw9c2Vhc29uYWwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLGljPSJhaWNjIg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsc3RlcHdpc2U9RkFMU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQ0KICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICMgRm9yZWNhc3QNCiAgICAgICAgICAgICAgICBhZW1vX2ZjcyA8LSBhZW1vX2ZpdCAlPiUgZm9yZWNhc3QoaD1mb3JlY2FzdHBlcmlvZCkNCiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAjIFBsb3QNCiAgICAgICAgICAgICAgICBhc3NpZ24oc3RhdGUNCiAgICAgICAgICAgICAgICAgICAgICAseCAlPiUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0b3Bsb3QoY29sb3I9cGFzdGUwKCJkYXJrIixjb2wpKSArDQogICAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9sYXllcihhZW1vX2ZjcywgUEk9VFJVRSwgc2VyaWVzPSJGb3JlY2FzdCIsIGNvbG9yPWNvbCwgc2l6ZT0xKSArDQogICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlX3hfY29udGludW91cyhicmVha3M9c2VxKDE5OTksMjAyNikpICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcz1zZXEoLTQwLDIwMCw0MCkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAsbGltaXRzPWMoLTIwLDIwMCkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSArDQogICAgICAgICAgICAgICAgICAgICAgICAgIGNvb3JkX2NhcnRlc2lhbih5bGltPWMoMCwxNjApKSArDQogICAgICAgICAgICAgICAgICAgICAgICAgIHRoZW1lKGF4aXMudGl0bGUueD1lbGVtZW50X2JsYW5rKCkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAscGxvdC50aXRsZT1lbGVtZW50X3RleHQodmp1c3Q9LTYsIGNvbG9yPXBhc3RlMCgiZGFyayIsY29sKSkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAscGFuZWwuZ3JpZC5taW5vci54PWVsZW1lbnRfYmxhbmsoKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICxwbG90Lm1hcmdpbj11bml0KGMoMC4xLDMsMC4xLDMpLCJtbSIpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSArDQogICAgICAgICAgICAgICAgICAgICAgICAgIGxhYnModGl0bGU9c3RhdGUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICx5PXBhc3RlKHN0YXRlLCJQcmljZSAoJC9Hd0gpIikNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkNCiAgICAgICAgICAgICAgICAgICAgICAsZW52aXI9Z2xvYmFsZW52KCkNCiAgICAgICAgICAgICAgICAgICAgICApDQogICAgICAgICAgICAgICAgDQogICAgICAgICAgICB9KQ0KICAgICAgICAgICAgDQogICAgICAgIH0NCiAgICAgICAgDQogICAgICAgICMgUmV0dXJuDQogICAgICAgIGdyaWQuYXJyYW5nZShOU1cNCiAgICAgICAgICAgICAgICAgICAgLFFMRA0KICAgICAgICAgICAgICAgICAgICAsU0ENCiAgICAgICAgICAgICAgICAgICAgLFZJQw0KICAgICAgICAgICAgICAgICAgICAsbmNvbD0xDQogICAgICAgICAgICAgICAgICAgICxib3R0b209dGV4dEdyb2IoIlRpbWUiLCBoanVzdD0wLjUpDQogICAgICAgICAgICAgICAgICAgICx0b3A9dGV4dEdyb2IoZXhwcmVzc2lvbihib2xkKHVuZGVybGluZSgiTG9uZy1UZXJtIEZvcmVjYXN0IGJ5IFN0YXRlIikpKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLGhqdXN0PTAuNQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLGdwPWdwYXIoZm9udHNpemU9MjApDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApDQogICAgICAgICAgICAgICAgICAgICxwYWRkaW5nPXVuaXQoMC4xLCJsaW5lIikNCiAgICAgICAgICAgICAgICAgICAgKSAlPiUgDQogICAgICAgICAgICAoZnVuY3Rpb24oeCl7DQogICAgICAgICAgICAgICAgZ2dzYXZlKHBsb3Q9eCwgZmlsZT0iSW1hZ2VzL0xvbmdUZXJtRm9yZWNhc3RQbG90QnlTdGF0ZS5wbmciKQ0KICAgICAgICAgICAgfSkNCiAgICANCiAgICB9KQ0KYGBgDQoNCipgciBmaWd1cmUobmFtZT0iTG9uZ1Rlcm1Gb3JlY2FzdFBsb3RCeVN0YXRlIiwgY2FwdGlvbj0iTG9uZyBUZXJtIEZvcmVjYXN0IGZvciBlYWNoIFN0YXRlIilgKg0KDQoNCjwhLS0gIU5PVEUhIFRoaXMgbmV4dCBiaXQgaXMgdGhlIGFuYWx5c2lzIGRvbmUgZm9yIHRoZSBCT00gZGF0YS4gLS0+DQo8IS0tIEl0IHdhc24ndCBpbmNsdWRlZCBpbiB0aGUgb3JpZ2luYWwgYW5hbHlzaXMsIGJ1dCBpcyBhIGdvb2QgY29tcGFyaXNvbiBmb3IgaGlnaGx5IHNlYXNvbmFsIGRhdGEgb24gdGhlIHNhbWUgcGVyaW9kIGFzIHRoZSBBRU1PIGRhdGEuIC0tPg0KPCEtLSBCRUdJTiBoaWRkZW4gc2VjdGlvbg0KDQpgYGB7ciBCT006IFNldCBVcCwgZWNobz1GQUxTRSwgZXZhbD1GQUxTRSwgcmVzdWx0cz0iaGlkZSIsIHdhcm5pbmc9RkFMU0UsIHJvd3MucHJpbnQ9NTAsIGNvbHMucHJpbnQ9MzAsIGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD01fQ0KIyBNYXN0ZXIgLS0tLQ0KYm9tX01hc3RlciA8LSBleHBhbmQuZ3JpZCggZGF0ZSA9IHNlcS5EYXRlKGRteSgiMS8xLzA5IiksZG15KCIzMS8xMi8xOSIpLCJkYXkiKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICwgc3RhdGlvbl9pZCA9IGJvbV9XZWF0aGVyU3RhdGlvbnNbLCJzdGF0aW9uX2lkIl0NCiAgICAgICAgICAgICAgICAgICAgICAgICApICU+JSANCiAgICBtdXRhdGUoam9pbiA9IHBhc3RlMChzdGF0aW9uX2lkLCAiXyIsIHN0cl9yZXBsYWNlX2FsbChkYXRlLCItIiwiXyIpKSkgJT4lIA0KICAgIHNlbGVjdChqb2luKSAlPiUgDQogICAgbGVmdF9qb2luKGJvbV9EYWlseU1pblRlbXAsImpvaW4iKSAlPiUgDQogICAgbGVmdF9qb2luKGJvbV9EYWlseU1heFRlbXAgJT4lIHNlbGVjdChqb2luLG1heF90ZW1wKSwgImpvaW4iKSAlPiUgDQogICAgbGVmdF9qb2luKGJvbV9EYWlseVJhaW5mYWxsICU+JSBzZWxlY3Qoam9pbixyYWluZmFsbF9taWxzKSwgImpvaW4iKSAlPiUgDQogICAgbGVmdF9qb2luKGJvbV9EYWlseVNvbGFyRXhwb3N1cmUgJT4lIHNlbGVjdChqb2luLCBzb2xhcl9leHBvc3VyZSksICJqb2luIikgJT4lIA0KICAgIGxlZnRfam9pbihib21fV2VhdGhlclN0YXRpb25zICU+JSBzZWxlY3Qoc3RhdGlvbl9pZCwgc3RhdGUpLCAic3RhdGlvbl9pZCIpICU+JSANCiAgICBmaWx0ZXIoIWlzLm5hKHN0YXRpb25faWQpKSAlPiUgDQogICAgbXV0YXRlKHdlZWtfaWQgPSBwYXN0ZTAoZGF0ZSAlPiUgeW1kICU+JSB5ZWFyICU+JSBhcy5jaGFyYWN0ZXINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICxkYXRlICU+JSB5bWQgJT4lIHdlZWsgJT4lIHN0cl9wYWQod2lkdGg9MixwYWQ9IjAiKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgKQ0KICAgICAgICAgICx5ZWFyX2lkID0gZGF0ZSAlPiUgeWVhcg0KICAgICAgICAgICxhdmdfdGVtcCA9IHJvd01lYW5zKC5bLGMoIm1pbl90ZW1wIiwibWF4X3RlbXAiKV0sbmEucm09VCkNCiAgICAgICAgICAscm5nX3RlbXAgPSBtYXhfdGVtcC1taW5fdGVtcA0KICAgICAgICAgICkgJT4lIA0KICAgIHNlbGVjdChzdGF0aW9uX2lkLHN0YXRlLGRhdGUseWVhcl9pZCxtb250aF9pZCx3ZWVrX2lkLGNvbnRhaW5zKCJ0ZW1wIiksY29udGFpbnMoInJhaW4iKSxjb250YWlucygic29sYXIiKSkNCg0KDQojIFllYXJseSAtLS0tDQpib21fWWVhcmx5IDwtIGJvbV9NYXN0ZXIgJT4lIA0KICAgIGdyb3VwX2J5KHN0YXRlLHllYXJfaWQpICU+JSANCiAgICBzdW1tYXJpc2UobWluX3RlbXAgPSBtaW4obWluX3RlbXAsIG5hLnJtPVQpDQogICAgICAgICAgICAgLG1heF90ZW1wID0gbWF4KG1heF90ZW1wLCBuYS5ybT1UKQ0KICAgICAgICAgICAgICxybmdfdGVtcCA9IGRpZmYoYyhtaW4obWluX3RlbXAsIG5hLnJtPVQpLG1heChtYXhfdGVtcCwgbmEucm09VCkpKQ0KICAgICAgICAgICAgICxhdmdfdGVtcCA9IG1lYW4oYXZnX3RlbXAsIG5hLnJtPVQpDQogICAgICAgICAgICAgLG1pbl9yYWluZmFsbCA9IG1pbihyYWluZmFsbF9taWxzLCBuYS5ybT1UKQ0KICAgICAgICAgICAgICxtYXhfcmFpbmZhbGwgPSBtYXgocmFpbmZhbGxfbWlscywgbmEucm09VCkNCiAgICAgICAgICAgICAscm5nX3JhaW5mYWxsID0gZGlmZihyYW5nZShyYWluZmFsbF9taWxzLCBuYS5ybT1UKSkNCiAgICAgICAgICAgICAsYXZnX3JhaW5mYWxsID0gbWVhbihyYWluZmFsbF9taWxzLCBuYS5ybT1UKQ0KICAgICAgICAgICAgICxtaW5fc29sYXIgPSBtaW4oc29sYXJfZXhwb3N1cmUsIG5hLnJtPVQpDQogICAgICAgICAgICAgLG1heF9zb2xhciA9IG1heChzb2xhcl9leHBvc3VyZSwgbmEucm09VCkNCiAgICAgICAgICAgICAscm5nX3NvbGFyID0gZGlmZihyYW5nZShzb2xhcl9leHBvc3VyZSwgbmEucm09VCkpDQogICAgICAgICAgICAgLGF2Z19zb2xhciA9IG1lYW4oc29sYXJfZXhwb3N1cmUsIG5hLnJtPVQpDQogICAgICAgICAgICAgKSU+JSANCiAgICB1bmdyb3VwKCkgJT4lIA0KICAgIHNlbGVjdChzdGF0ZSx5ZWFyX2lkLGNvbnRhaW5zKCJ0ZW1wIiksY29udGFpbnMoInJhaW5mYWxsIiksY29udGFpbnMoInNvbGFyIikpICU+JSANCiAgICBtdXRhdGVfYWxsKH5yZXBsYWNlKC4sIGlzLmluZmluaXRlKC4pLCAwKQ0KICAgICAgICAgICAgICAsfnJlcGxhY2UoLiwgaXMuZmluaXRlKC4pLCAwKQ0KICAgICAgICAgICAgICApDQoNCg0KIyBNb250aGx5IC0tLS0NCmJvbV9Nb250aGx5IDwtIGJvbV9NYXN0ZXIgJT4lIA0KICAgIGdyb3VwX2J5KHN0YXRlLG1vbnRoX2lkKSAlPiUgDQogICAgc3VtbWFyaXNlKG1pbl90ZW1wID0gbWluKG1pbl90ZW1wLCBuYS5ybT1UKQ0KICAgICAgICAgICAgICxtYXhfdGVtcCA9IG1heChtYXhfdGVtcCwgbmEucm09VCkNCiAgICAgICAgICAgICAscm5nX3RlbXAgPSBkaWZmKGMobWluKG1pbl90ZW1wLCBuYS5ybT1UKSxtYXgobWF4X3RlbXAsIG5hLnJtPVQpKSkNCiAgICAgICAgICAgICAsYXZnX3RlbXAgPSBtZWFuKGF2Z190ZW1wLCBuYS5ybT1UKQ0KICAgICAgICAgICAgICxtaW5fcmFpbmZhbGwgPSBtaW4ocmFpbmZhbGxfbWlscywgbmEucm09VCkNCiAgICAgICAgICAgICAsbWF4X3JhaW5mYWxsID0gbWF4KHJhaW5mYWxsX21pbHMsIG5hLnJtPVQpDQogICAgICAgICAgICAgLHJuZ19yYWluZmFsbCA9IGRpZmYocmFuZ2UocmFpbmZhbGxfbWlscywgbmEucm09VCkpDQogICAgICAgICAgICAgLGF2Z19yYWluZmFsbCA9IG1lYW4ocmFpbmZhbGxfbWlscywgbmEucm09VCkNCiAgICAgICAgICAgICAsbWluX3NvbGFyID0gbWluKHNvbGFyX2V4cG9zdXJlLCBuYS5ybT1UKQ0KICAgICAgICAgICAgICxtYXhfc29sYXIgPSBtYXgoc29sYXJfZXhwb3N1cmUsIG5hLnJtPVQpDQogICAgICAgICAgICAgLHJuZ19zb2xhciA9IGRpZmYocmFuZ2Uoc29sYXJfZXhwb3N1cmUsIG5hLnJtPVQpKQ0KICAgICAgICAgICAgICxhdmdfc29sYXIgPSBtZWFuKHNvbGFyX2V4cG9zdXJlLCBuYS5ybT1UKQ0KICAgICAgICAgICAgICklPiUgDQogICAgdW5ncm91cCgpICU+JSANCiAgICBzZWxlY3Qoc3RhdGUsbW9udGhfaWQsY29udGFpbnMoInRlbXAiKSxjb250YWlucygicmFpbmZhbGwiKSxjb250YWlucygic29sYXIiKSkgJT4lIA0KICAgIG11dGF0ZV9hbGwofnJlcGxhY2UoLiwgaXMuaW5maW5pdGUoLiksIDApDQogICAgICAgICAgICAgICx+cmVwbGFjZSguLCBpcy5maW5pdGUoLiksIDApDQogICAgICAgICAgICAgICkNCg0KDQojIFdlZWtseSAtLS0tDQpib21fV2Vla2x5IDwtIGJvbV9NYXN0ZXIgJT4lIA0KICAgIGdyb3VwX2J5KHN0YXRlLHdlZWtfaWQpICU+JSANCiAgICBzdW1tYXJpc2UobWluX3RlbXAgPSBtaW4obWluX3RlbXAsIG5hLnJtPVQpDQogICAgICAgICAgICAgLG1heF90ZW1wID0gbWF4KG1heF90ZW1wLCBuYS5ybT1UKQ0KICAgICAgICAgICAgICxybmdfdGVtcCA9IGRpZmYoYyhtaW4obWluX3RlbXAsIG5hLnJtPVQpLG1heChtYXhfdGVtcCwgbmEucm09VCkpKQ0KICAgICAgICAgICAgICxhdmdfdGVtcCA9IG1lYW4oYXZnX3RlbXAsIG5hLnJtPVQpDQogICAgICAgICAgICAgLG1pbl9yYWluZmFsbCA9IG1pbihyYWluZmFsbF9taWxzLCBuYS5ybT1UKQ0KICAgICAgICAgICAgICxtYXhfcmFpbmZhbGwgPSBtYXgocmFpbmZhbGxfbWlscywgbmEucm09VCkNCiAgICAgICAgICAgICAscm5nX3JhaW5mYWxsID0gZGlmZihyYW5nZShyYWluZmFsbF9taWxzLCBuYS5ybT1UKSkNCiAgICAgICAgICAgICAsYXZnX3JhaW5mYWxsID0gbWVhbihyYWluZmFsbF9taWxzLCBuYS5ybT1UKQ0KICAgICAgICAgICAgICxtaW5fc29sYXIgPSBtaW4oc29sYXJfZXhwb3N1cmUsIG5hLnJtPVQpDQogICAgICAgICAgICAgLG1heF9zb2xhciA9IG1heChzb2xhcl9leHBvc3VyZSwgbmEucm09VCkNCiAgICAgICAgICAgICAscm5nX3NvbGFyID0gZGlmZihyYW5nZShzb2xhcl9leHBvc3VyZSwgbmEucm09VCkpDQogICAgICAgICAgICAgLGF2Z19zb2xhciA9IG1lYW4oc29sYXJfZXhwb3N1cmUsIG5hLnJtPVQpDQogICAgICAgICAgICAgKSU+JSANCiAgICB1bmdyb3VwKCkgJT4lIA0KICAgIHNlbGVjdChzdGF0ZSx3ZWVrX2lkLGNvbnRhaW5zKCJ0ZW1wIiksY29udGFpbnMoInJhaW5mYWxsIiksY29udGFpbnMoInNvbGFyIikpICU+JSANCiAgICBtdXRhdGVfYWxsKH5yZXBsYWNlKC4sIGlzLmluZmluaXRlKC4pLCAwKQ0KICAgICAgICAgICAgICAsfnJlcGxhY2UoLiwgaXMuZmluaXRlKC4pLCAwKQ0KICAgICAgICAgICAgICApDQoNCg0KIyBUU0RGJ3MgLS0tLQ0KDQojIERlY2lkZSBGZWF0dXJlcw0KIyBGZWF0dXJlcyA8LSBjKCJhdmdfdGVtcCIpDQpGZWF0dXJlcyA8LSBjKCJhdmdfdGVtcCIsInJuZ190ZW1wIikNCiMgRmVhdHVyZXMgPC0gYygiYXZnX3RlbXAiLCJybmdfdGVtcCIsInJuZ19yYWluZmFsbCIsImF2Z19yYWluZmFsbCIsInJuZ19zb2xhciIsImF2Z19zb2xhciIpDQoNCmZvciAoRmVhdHVyZSBpbiBGZWF0dXJlcykgew0KICAgIA0KICAgICMgWWVhcmx5IC0tLS0NCiAgICBhc3NpZ24ocGFzdGUoImJvbV9ZZWFybHlUU0RGIixGZWF0dXJlLHNlcD0iXyIpDQogICAgICAgICAgLGJvbV9ZZWFybHkgJT4lDQogICAgICAgICAgICAgIGZpbHRlcihzdGF0ZSAlaW4lIGMoIk5TVyIsIlZJQyIsIlFMRCIsIlNBIikpICU+JSANCiAgICAgICAgICAgICAgc2VsZWN0KHN0YXRlLEZlYXR1cmUseWVhcl9pZCkgJT4lIA0KICAgICAgICAgICAgICAoZnVuY3Rpb24oeCkgew0KICAgICAgICAgICAgICAgICAgc3RhdGVzIDwtIHggJT4lIA0KICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdChzdGF0ZSkgJT4lIA0KICAgICAgICAgICAgICAgICAgICAgIGRpc3RpbmN0KCkgJT4lIA0KICAgICAgICAgICAgICAgICAgICAgIHB1bGwoKQ0KICAgICAgICAgICAgICAgICAgZGZfcmV0dXJuIDwtIHggJT4lIA0KICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdCh5ZWFyX2lkKSAlPiUgDQogICAgICAgICAgICAgICAgICAgICAgZGlzdGluY3QoKQ0KICAgICAgICAgICAgICAgICAgZm9yIChzdHJfc3RhdGUgaW4gc3RhdGVzKSB7DQogICAgICAgICAgICAgICAgICAgICAgZGZfcmV0dXJuIDwtIHggJT4lIA0KICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIoc3RhdGU9PXN0cl9zdGF0ZSkgJT4lIA0KICAgICAgICAgICAgICAgICAgICAgICAgICByZW5hbWVfYXQodmFycyhzdGFydHNfd2l0aCgiYXZnIikpLCBmdW5zKHBhc3RlMChzdHJfc3RhdGUpKSkgJT4lIA0KICAgICAgICAgICAgICAgICAgICAgICAgICByZW5hbWVfYXQodmFycyhzdGFydHNfd2l0aCgicm5nIikpLCBmdW5zKHBhc3RlMChzdHJfc3RhdGUpKSkgJT4lIA0KICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3QoLXN0YXRlKSAlPiUgDQogICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnRfam9pbih4PWRmX3JldHVybiwgeT0uLCBieT0ieWVhcl9pZCIpDQogICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgcmV0dXJuKGRmX3JldHVybikNCiAgICAgICAgICAgICAgICAgIH0pICU+JSANCiAgICAgICAgICAgICAgYXJyYW5nZSh5ZWFyX2lkKSAlPiUgDQogICAgICAgICAgICAgIHNlbGVjdCgteWVhcl9pZCkNCiAgICAgICAgICApDQogICAgDQogICAgDQogICAgIyBNb250aGx5IC0tLS0NCiAgICBhc3NpZ24ocGFzdGUoImJvbV9Nb250aGx5VFNERiIsRmVhdHVyZSxzZXA9Il8iKQ0KICAgICAgICAgICxib21fTW9udGhseSAlPiUgDQogICAgICAgICAgICAgIGZpbHRlcihzdGF0ZSAlaW4lIGMoIk5TVyIsIlZJQyIsIlFMRCIsIlNBIikpICU+JSANCiAgICAgICAgICAgICAgc2VsZWN0KHN0YXRlLEZlYXR1cmUsbW9udGhfaWQpICU+JSANCiAgICAgICAgICAgICAgKGZ1bmN0aW9uKHgpIHsNCiAgICAgICAgICAgICAgICAgIHN0YXRlcyA8LSB4ICU+JSANCiAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Qoc3RhdGUpICU+JSANCiAgICAgICAgICAgICAgICAgICAgICBkaXN0aW5jdCgpICU+JSANCiAgICAgICAgICAgICAgICAgICAgICBwdWxsKCkNCiAgICAgICAgICAgICAgICAgIGRmX3JldHVybiA8LSB4ICU+JSANCiAgICAgICAgICAgICAgICAgICAgICBzZWxlY3QobW9udGhfaWQpICU+JSANCiAgICAgICAgICAgICAgICAgICAgICBkaXN0aW5jdCgpDQogICAgICAgICAgICAgICAgICBmb3IgKHN0cl9zdGF0ZSBpbiBzdGF0ZXMpIHsNCiAgICAgICAgICAgICAgICAgICAgICBkZl9yZXR1cm4gPC0geCAlPiUgDQogICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcihzdGF0ZT09c3RyX3N0YXRlKSAlPiUgDQogICAgICAgICAgICAgICAgICAgICAgICAgIHJlbmFtZV9hdCh2YXJzKHN0YXJ0c193aXRoKCJhdmciKSksIGZ1bnMocGFzdGUwKHN0cl9zdGF0ZSkpKSAlPiUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgcmVuYW1lX2F0KHZhcnMoc3RhcnRzX3dpdGgoInJuZyIpKSwgZnVucyhwYXN0ZTAoc3RyX3N0YXRlKSkpICU+JQ0KICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3QoLXN0YXRlKSAlPiUgDQogICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnRfam9pbih4PWRmX3JldHVybiwgeT0uLCBieT0ibW9udGhfaWQiKQ0KICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgIHJldHVybihkZl9yZXR1cm4pDQogICAgICAgICAgICAgICAgICB9KSAlPiUgDQogICAgICAgICAgICAgIGFycmFuZ2UobW9udGhfaWQpICU+JSANCiAgICAgICAgICAgICAgc2VsZWN0KC1tb250aF9pZCkNCiAgICAgICAgICApDQogICAgDQogICAgDQogICAgIyBXZWVrbHkgLS0tLQ0KICAgIGFzc2lnbihwYXN0ZSgiYm9tX1dlZWtseVRTREYiLEZlYXR1cmUsc2VwPSJfIikNCiAgICAgICAgICAsYm9tX1dlZWtseSAlPiUNCiAgICAgICAgICAgICAgZmlsdGVyKHN0YXRlICVpbiUgYygiTlNXIiwiVklDIiwiUUxEIiwiU0EiKSkgJT4lIA0KICAgICAgICAgICAgICBzZWxlY3Qoc3RhdGUsRmVhdHVyZSx3ZWVrX2lkKSAlPiUgDQogICAgICAgICAgICAgIChmdW5jdGlvbih4KSB7DQogICAgICAgICAgICAgICAgICBzdGF0ZXMgPC0geCAlPiUgDQogICAgICAgICAgICAgICAgICAgICAgc2VsZWN0KHN0YXRlKSAlPiUgDQogICAgICAgICAgICAgICAgICAgICAgZGlzdGluY3QoKSAlPiUgDQogICAgICAgICAgICAgICAgICAgICAgcHVsbCgpDQogICAgICAgICAgICAgICAgICBkZl9yZXR1cm4gPC0geCAlPiUgDQogICAgICAgICAgICAgICAgICAgICAgc2VsZWN0KHdlZWtfaWQpICU+JSANCiAgICAgICAgICAgICAgICAgICAgICBkaXN0aW5jdCgpDQogICAgICAgICAgICAgICAgICBmb3IgKHN0cl9zdGF0ZSBpbiBzdGF0ZXMpIHsNCiAgICAgICAgICAgICAgICAgICAgICBkZl9yZXR1cm4gPC0geCAlPiUgDQogICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcihzdGF0ZT09c3RyX3N0YXRlKSAlPiUgDQogICAgICAgICAgICAgICAgICAgICAgICAgIHJlbmFtZV9hdCh2YXJzKHN0YXJ0c193aXRoKCJhdmciKSksIGZ1bnMocGFzdGUwKHN0cl9zdGF0ZSkpKSAlPiUgDQogICAgICAgICAgICAgICAgICAgICAgICAgIHJlbmFtZV9hdCh2YXJzKHN0YXJ0c193aXRoKCJybmciKSksIGZ1bnMocGFzdGUwKHN0cl9zdGF0ZSkpKSAlPiUgDQogICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdCgtc3RhdGUpICU+JSANCiAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmdF9qb2luKHg9ZGZfcmV0dXJuLCB5PS4sIGJ5PSJ3ZWVrX2lkIikNCiAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICByZXR1cm4oZGZfcmV0dXJuKQ0KICAgICAgICAgICAgICAgICAgfSkgJT4lIA0KICAgICAgICAgICAgICBhcnJhbmdlKHdlZWtfaWQpICU+JSANCiAgICAgICAgICAgICAgc2VsZWN0KC13ZWVrX2lkKQ0KICAgICAgICAgICkNCiAgICANCn0NCg0KDQojIFRTJ3MgLS0tLQ0KZm9yIChGZWF0dXJlIGluIEZlYXR1cmVzKSB7DQogICAgDQogICAgIyBZZWFybHkgLS0tLQ0KICAgIGFzc2lnbihwYXN0ZSgiYm9tX1llYXJseVRTIixGZWF0dXJlLHNlcD0iXyIpDQogICAgICAgICAgLHBhc3RlKCJib21fWWVhcmx5VFNERiIsRmVhdHVyZSxzZXA9Il8iKSAlPiUgDQogICAgICAgICAgICAgIGdldCgpICU+JSANCiAgICAgICAgICAgICAgYXMubWF0cml4KCkgJT4lIA0KICAgICAgICAgICAgICB0cyhzdGFydD1jKDIwMDksMSksZnJlcXVlbmN5PTEpDQogICAgICAgICAgKQ0KICAgIA0KICAgICMgTW9udGhseSAtLS0tDQogICAgYXNzaWduKHBhc3RlKCJib21fTW9udGhseVRTIixGZWF0dXJlLHNlcD0iXyIpDQogICAgICAgICAgLHBhc3RlKCJib21fTW9udGhseVRTREYiLEZlYXR1cmUsc2VwPSJfIikgJT4lDQogICAgICAgICAgICAgIGdldCgpICU+JSANCiAgICAgICAgICAgICAgYXMubWF0cml4KCkgJT4lIA0KICAgICAgICAgICAgICB0cyhzdGFydD1jKDIwMDksMSksZnJlcXVlbmN5PTEyKQ0KICAgICAgICAgICkNCiAgICANCiAgICAjIFdlZWtseSAtLS0tDQogICAgYXNzaWduKHBhc3RlKCJib21fV2Vla2x5VFMiLEZlYXR1cmUsc2VwPSJfIikNCiAgICAgICAgICAscGFzdGUoImJvbV9XZWVrbHlUU0RGIixGZWF0dXJlLHNlcD0iXyIpICU+JSANCiAgICAgICAgICAgICAgZ2V0KCkgJT4lIA0KICAgICAgICAgICAgICBhcy5tYXRyaXgoKSAlPiUgDQogICAgICAgICAgICAgIHRzKHN0YXJ0PWMoMjAwOSwxKSxmcmVxdWVuY3k9NTIpDQogICAgICAgICAgKQ0KICAgIA0KfQ0KDQpgYGANCg0KYGBge3IgQk9NOiBWYWxpZGF0ZSwgZWNobz1GQUxTRSwgZXZhbD1GQUxTRSwgcmVzdWx0cz0iaGlkZSIsIHJvd3MucHJpbnQ9NTAsIGNvbHMucHJpbnQ9MzAsIGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD01fQ0KIyBDaGVjayBkZnMgLS0tLQ0KIyBZZWFybHkNCmJvbV9ZZWFybHkgJT4lIA0KICAgIG11dGF0ZSh5ZWFyX2lkPWFzLm51bWVyaWMoeWVhcl9pZCkpICU+JSANCiAgICBmaWx0ZXIoIXN0YXRlICVpbiUgYygiVEFTIikpICU+JSANCiAgICBncm91cF9ieShzdGF0ZSkgJT4lIA0KICAgIHN1bW1hcmlzZShtaW49bWluKHllYXJfaWQpDQogICAgICAgICAgICAgLG1heD1tYXgoeWVhcl9pZCkNCiAgICAgICAgICAgICAsbnVtPW4oKQ0KICAgICAgICAgICAgICxsZW49bGVuZ3RoKHVuaXF1ZSh5ZWFyX2lkKSkNCiAgICAgICAgICAgICApDQoNCiMgTW9udGhseQ0KYm9tX01vbnRobHkgJT4lIA0KICAgIG11dGF0ZShtb250aF9pZD1hcy5udW1lcmljKG1vbnRoX2lkKSkgJT4lIA0KICAgIGZpbHRlcighc3RhdGUgJWluJSBjKCJUQVMiKSkgJT4lIA0KICAgIGdyb3VwX2J5KHN0YXRlKSAlPiUgDQogICAgc3VtbWFyaXNlKG1pbj1taW4obW9udGhfaWQpDQogICAgICAgICAgICAgLG1heD1tYXgobW9udGhfaWQpDQogICAgICAgICAgICAgLG51bT1uKCkNCiAgICAgICAgICAgICAsbGVuPWxlbmd0aCh1bmlxdWUobW9udGhfaWQpKQ0KICAgICAgICAgICAgICkNCg0KIyBXZWVrbHkNCmJvbV9XZWVrbHkgJT4lIA0KICAgIG11dGF0ZSh3ZWVrX2lkPWFzLm51bWVyaWMod2Vla19pZCkpICU+JSANCiAgICBmaWx0ZXIoIXN0YXRlICVpbiUgYygiVEFTIikpICU+JSANCiAgICBncm91cF9ieShzdGF0ZSkgJT4lIA0KICAgIHN1bW1hcmlzZShtaW49bWluKHdlZWtfaWQpDQogICAgICAgICAgICAgLG1heD1tYXgod2Vla19pZCkNCiAgICAgICAgICAgICAsbnVtPW4oKQ0KICAgICAgICAgICAgICxsZW49bGVuZ3RoKHVuaXF1ZSh3ZWVrX2lkKSkNCiAgICAgICAgICAgICApDQoNCmJvbV9XZWVrbHlUU19hdmdfdGVtcCAlPiUgYXV0b3Bsb3QoKQ0KYm9tX1dlZWtseVRTX3JuZ190ZW1wICU+JSBhdXRvcGxvdCgpDQpgYGANCg0KYGBge3IgQk9NOiBWaXN1YWxpc2UsIGVjaG89RkFMU0UsIGV2YWw9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIGZpZy53aWR0aD0xNSwgZmlnLmhlaWdodD0xMH0NCiMgUGxvdCBCT00gRGF0YSAtLS0tDQpib21fV2Vla2x5VFNfYXZnX3RlbXAgJT4lIA0KICAgIGF1dG9wbG90KHNpemU9MSkgKw0KICAgIGF1dG9sYXllcihib21fV2Vla2x5VFNfcm5nX3RlbXApICsNCiAgICBmYWNldF93cmFwKH5zZXJpZXMsIG5jb2w9MSkgKw0KICAgIGdlb21fc21vb3RoKG1ldGhvZD0ibG0iLCBzaXplPTIpICsNCiAgICBnZW9tX3RleHQoDQogICAgICAgIGRhdGEgPSBkYXRhLmZyYW1lKA0KICAgICAgICAgICAgbGFiZWwgPSBjKHJlcGxpY2F0ZSg0LCJNZWFuIFRlbXAiKSxyZXBsaWNhdGUoNCwiTGluZWFyIE1vZGVsIikscmVwbGljYXRlKDQsIlJhbmdlIFRlbXAiKSkNCiAgICAgICAgICAgICxzZXJpZXMgPSByZXBsaWNhdGUoMyxib21fV2Vla2x5VFNERiAlPiUgbmFtZXMpICU+JSBhcy52ZWN0b3IoKQ0KICAgICAgICAgICAgLHggPSByZXBsaWNhdGUoMTIsMjAyMCkNCiAgICAgICAgICAgICx5ID0gYyg3LDEzLDgsNCwxOSwyNSwxOSwxNSw0NSw0NSw0MCwzNSkNCiAgICAgICAgKSwNCiAgICAgICAgbWFwcGluZyA9IGFlcyh4PXgsIHk9eSwgbGFiZWw9bGFiZWwpLA0KICAgICAgICBudWRnZV94ID0gMC4yDQogICAgKSArDQogICAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcz1zZXEoMjAwOSwyMDIzKSkgKw0KICAgIHNjYWxlX3lfY29udGludW91cyhsaW1pdHM9YygwLDU1KQ0KICAgICAgICAgICAgICAgICAgICAgICxicmVha3M9c2VxKDAsNTAsYnk9MTApDQogICAgICAgICAgICAgICAgICAgICAgKSArDQogICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJub25lIg0KICAgICAgICAgLHBhbmVsLmdyaWQubWlub3IueD1lbGVtZW50X2JsYW5rKCkNCiAgICAgICAgICxwYW5lbC5ncmlkLm1pbm9yLnk9ZWxlbWVudF9ibGFuaygpDQogICAgICAgICApICsNCiAgICBsYWJzKHRpdGxlPSJUZW1wZXJhdHVyZSBGbHVjdHVhdGlvbnMgT3ZlciBUaW1lIg0KICAgICAgICAsc3VidGl0bGU9IkJ5IFN0YXRlLCBCeSBXZWVrIg0KICAgICAgICAseT0iVGVtcGVyYXR1cmUiDQogICAgICAgICxjYXB0aW9uPSJTb3VyY2U6IEJ1cmVhdSBvZiBNZXRlcm9sb2d5Ig0KICAgICAgICApDQoNCmBgYA0KDQpgYGB7ciBCT006IFRlc3QgVFMgU3RhdGlvbmFyaXR5LCBlY2hvPUZBTFNFLCBldmFsPUZBTFNFLCByb3dzLnByaW50PTUwLCBjb2xzLnByaW50PTMwLCBmaWcud2lkdGg9MTAsIGZpZy5oZWlnaHQ9N30NCiMgVGVzdCBmb3Igc3RhdGlvbmFyaXR5IC0tLS0NCmJvbV9XZWVrbHlUU19hdmdfdGVtcCAlPiUgDQogICAgKGZ1bmN0aW9uKHgpew0KICAgICAgICByZXR1cm4gPC0gY29sbmFtZXMoeCkgJT4lIGRhdGEuZnJhbWUoInN0YXRlIj0uLCJ2YWx1ZSI9TkEpDQogICAgICAgIGZvciAoc3RhdGUgaW4gcmV0dXJuWywic3RhdGUiXSkgew0KICAgICAgICAgICAgcmV0dXJuW3JldHVyblssInN0YXRlIl09PXN0YXRlLCJ2YWx1ZSJdIDwtICh4WyxzdGF0ZV0gJT4lIHVyLmtwc3ModXNlLmxhZz0xMDgpKUB0ZXN0c3RhdA0KICAgICAgICB9DQogICAgICAgIHJldHVybihyZXR1cm4pDQogICAgfSkgJT4lIA0KICAgIG11dGF0ZSh0ZXN0PSJLUFNTIFVuaXQgUm9vdCBUZXN0Ig0KICAgICAgICAgICx0aHJlc2hvbGQ9MC4wMg0KICAgICAgICAgICxmZWF0dXJlPSJNZWFuIFdlZWtseSBUZW1wIg0KICAgICAgICAgICxvdXRjb21lPWlmZWxzZSh2YWx1ZTx0aHJlc2hvbGQsIklzIFN0YXRpb25hcnkiLCJOb3QgU3RhdGlvbmFyeSIpDQogICAgICAgICAgKSAlPiUgDQogICAgc2VsZWN0KGZlYXR1cmUsc3RhdGUsdGVzdCxldmVyeXRoaW5nKCkpICU+JSANCiAgICByZW5hbWVfYWxsKGZ1bnMoc3RyX3RvX3RpdGxlKC4pKSkgJT4lIA0KICAgIGthYmxlKGFsaWduPSJsIiklPiUgDQogICAga2FibGVfc3R5bGluZyhib290c3RyYXBfb3B0aW9ucz1jKCJzdHJpcGVkIiwiYm9yZGVyZWQiLCJjb25kZW5zZWQiKQ0KICAgICAgICAgICAgICAgICAsZnVsbF93aWR0aD1GQUxTRQ0KICAgICAgICAgICAgICAgICAscG9zaXRpb249ImxlZnQiDQogICAgICAgICAgICAgICAgICkNCmBgYA0KDQpgYGB7ciBCT006IFRlc3QgVFMgV2hpdGUgTm9pc2UsIGVjaG89RkFMU0UsIGV2YWw9RkFMU0UsIHJvd3MucHJpbnQ9NTAsIGNvbHMucHJpbnQ9MzAsIGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD03fQ0KIyBUZXN0IHRvIGVuc3VyZSBpcyBub3Qgd2hpdGUtbm9pc2UgLS0tLQ0KYm9tX1dlZWtseVRTX2F2Z190ZW1wICU+JSANCiAgICAoZnVuY3Rpb24oeCl7DQogICAgICAgIHJldHVybiA8LSBjb2xuYW1lcyh4KSAlPiUgZGF0YS5mcmFtZSgic3RhdGUiPS4sInZhbHVlIj1OQSkNCiAgICAgICAgZm9yIChzdGF0ZSBpbiByZXR1cm5bLCJzdGF0ZSJdKSB7DQogICAgICAgICAgICByZXR1cm5bcmV0dXJuWywic3RhdGUiXT09c3RhdGUsInZhbHVlIl0gPC0geFssc3RhdGVdICU+JSBCb3gudGVzdChsYWc9MTA4LCB0eXBlPSJMaiIpICU+JSBleHRyYWN0KCJwLnZhbHVlIikNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4ocmV0dXJuKQ0KICAgIH0pICU+JSANCiAgICBtdXRhdGUodGhyZXNob2xkPTAuMDINCiAgICAgICAgICAsb3V0Y29tZT1pZmVsc2UodmFsdWU8dGhyZXNob2xkLCJOb3QgV2hpdGVub2lzZSIsIklzIFdoaXRlbm9pc2UiKQ0KICAgICAgICAgICx2YWx1ZT1pZmVsc2UodmFsdWU8MC4wMDAwMDAwMDAwMDAwMDAyLCI8MC4wMDAwMDAwMDAwMDAwMDAyIixhcy5jaGFyYWN0ZXIodmFsdWUpKQ0KICAgICAgICAgICx0ZXN0PSJCb3gtTGp1bmcgVGVzdCINCiAgICAgICAgICAsZmVhdHVyZT0iTWVhbiBXZWVrbHkgVGVtcCINCiAgICAgICAgICApICU+JSANCiAgICBzZWxlY3QoZmVhdHVyZSxzdGF0ZSx0ZXN0LGV2ZXJ5dGhpbmcoKSkgJT4lIA0KICAgIHJlbmFtZV9hbGwoZnVucyhzdHJfdG9fdGl0bGUoLikpKSAlPiUgDQogICAga2FibGUoYWxpZ249ImwiKSAlPiUgDQogICAga2FibGVfc3R5bGluZyhib290c3RyYXBfb3B0aW9ucz1jKCJzdHJpcGVkIiwiYm9yZGVyZWQiLCJjb25kZW5zZWQiKQ0KICAgICAgICAgICAgICAgICAsZnVsbF93aWR0aD1GQUxTRQ0KICAgICAgICAgICAgICAgICAscG9zaXRpb249ImxlZnQiDQogICAgICAgICAgICAgICAgICkNCmBgYA0KDQpgYGB7ciBCT006IFRlc3QgQXV0by1Db3JyZWxhdGlvbiwgZWNobz1GQUxTRSwgZXZhbD1GQUxTRSwgcm93cy5wcmludD01MCwgY29scy5wcmludD0zMCwgZmlnLndpZHRoPTE1LCBmaWcuaGVpZ2h0PTEwfQ0KIyBTZXQgQUNGIC0tLS0NCmJvbV9XZWVrbHlBQ0ZfYXZnX3RlbXAgPC0gYm9tX1dlZWtseVRTREZfYXZnX3RlbXAgJT4lIA0KICAgIGdhdGhlcigic3RhdGUiLCJ0ZW1wIikgJT4lIA0KICAgIGdyb3VwX2J5KHN0YXRlKSAlPiUgDQogICAgc3VtbWFyaXNlKGxpc3RfYWNmPWxpc3QoYWNmKHRlbXAsIGxhZy5tYXg9MTA4LCBwbG90PUZBTFNFKSkpICU+JQ0KICAgIG11dGF0ZShhY2ZfdmFscz1wdXJycjo6bWFwKGxpc3RfYWNmLCB+YXMubnVtZXJpYygueCRhY2YpKSkgJT4lIA0KICAgIHNlbGVjdCgtbGlzdF9hY2YpICU+JSANCiAgICB1bm5lc3QoKSAlPiUNCiAgICBncm91cF9ieShzdGF0ZSkgJT4lIA0KICAgIG11dGF0ZShsYWc9cm93X251bWJlcigpIC0gMSkgJT4lIA0KICAgIHVuZ3JvdXAoKSAlPiUgDQogICAgbXV0YXRlKHN0YXRlPXBhc3RlKHN0YXRlLCIoQXV0by1Db3JyZWxhdGlvbikiKSkgJT4lIA0KICAgIGdncGxvdChhZXMoeD1sYWcsIHk9YWNmX3ZhbHMsIGNvbG9yPXN0YXRlKSkgKw0KICAgIGdlb21fYmFyKHN0YXQ9ImlkZW50aXR5Iiwgd2lkdGg9LjA1KSArDQogICAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCkgKw0KICAgIGdlb21faGxpbmUoZGF0YSA9IC4gJT4lIGdyb3VwX2J5KHN0YXRlKSAlPiUgc3VtbWFyaXNlKGNpID0gcW5vcm0oKDErMC45NSkvMikvc3FydChuKCkpKQ0KICAgICAgICAgICAgICAgLGFlcyh5aW50ZXJjZXB0ID0gLWNpKQ0KICAgICAgICAgICAgICAgLGNvbG9yPSJibHVlIg0KICAgICAgICAgICAgICAgLGxpbmV0eXBlPSJkb3R0ZWQiDQogICAgICAgICAgICAgICApICsNCiAgICBnZW9tX2hsaW5lKGRhdGEgPSAuICU+JSBncm91cF9ieShzdGF0ZSkgJT4lIHN1bW1hcmlzZShjaSA9IHFub3JtKCgxKzAuOTUpLzIpL3NxcnQobigpKSkNCiAgICAgICAgICAgICAgICxhZXMoeWludGVyY2VwdCA9IGNpKQ0KICAgICAgICAgICAgICAgLGNvbG9yPSJibHVlIg0KICAgICAgICAgICAgICAgLGxpbmV0eXBlPSJkb3R0ZWQiDQogICAgICAgICAgICAgICApICsNCiAgICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzPXNlcSgwLDExMCxieT0yMCkpICsNCiAgICB0aGVtZShsZWdlbmQucG9zaXRpb249Im5vbmUiDQogICAgICAgICAgLHBhbmVsLmdyaWQubWlub3IueD1lbGVtZW50X2JsYW5rKCkNCiAgICAgICAgICAscGFuZWwuZ3JpZC5taW5vci55PWVsZW1lbnRfYmxhbmsoKQ0KICAgICAgICAgICkgKw0KICAgIGxhYnMoeD0iTGFnICgxMDggcGVyaW9kcykiDQogICAgICAgICAseT0iTGV2ZWwgb2YgQ29ycmVsYXRpb24gKGxpbWl0czogLTEgJiAxKSINCiAgICAgICAgICkgKw0KICAgIGZhY2V0X3dyYXAofnN0YXRlLCBuY29sPTEpDQoNCiMgU2V0IFBBQ0YgLS0tLQ0KYm9tX1dlZWtseVBBQ0ZfYXZnX3RlbXAgPC0gYm9tX1dlZWtseVRTREZfYXZnX3RlbXAgJT4lIA0KICAgICAgICBnYXRoZXIoInN0YXRlIiwidGVtcCIpICU+JSANCiAgICAgICAgZ3JvdXBfYnkoc3RhdGUpICU+JSANCiAgICAgICAgc3VtbWFyaXNlKGxpc3RfYWNmPWxpc3QocGFjZih0ZW1wLCBsYWcubWF4PTEwOCwgcGxvdD1GQUxTRSkpKSAlPiUNCiAgICAgICAgbXV0YXRlKGFjZl92YWxzPXB1cnJyOjptYXAobGlzdF9hY2YsIH5hcy5udW1lcmljKC54JGFjZikpKSAlPiUgDQogICAgICAgIHNlbGVjdCgtbGlzdF9hY2YpICU+JSANCiAgICAgICAgdW5uZXN0KCkgJT4lDQogICAgICAgIGdyb3VwX2J5KHN0YXRlKSAlPiUgDQogICAgICAgIG11dGF0ZShsYWc9cm93X251bWJlcigpIC0gMSkgJT4lIA0KICAgICAgICB1bmdyb3VwKCkgJT4lIA0KICAgICAgICBtdXRhdGUoc3RhdGU9cGFzdGUoc3RhdGUsIihQYXJ0aWFsIEF1dG8tQ29ycmVsYXRpb24pIikpICU+JSANCiAgICAgICAgZ2dwbG90KGFlcyh4PWxhZywgeT1hY2ZfdmFscywgY29sb3I9c3RhdGUpKSArDQogICAgICAgIGdlb21fYmFyKHN0YXQ9ImlkZW50aXR5Iiwgd2lkdGg9LjA1KSArDQogICAgICAgIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDApICsNCiAgICAgICAgZ2VvbV9obGluZShkYXRhID0gLiAlPiUgZ3JvdXBfYnkoc3RhdGUpICU+JSBzdW1tYXJpc2UoY2kgPSBxbm9ybSgoMSswLjk1KS8yKS9zcXJ0KG4oKSkpDQogICAgICAgICAgICAgICAgICAgLGFlcyh5aW50ZXJjZXB0ID0gLWNpKQ0KICAgICAgICAgICAgICAgICAgICxjb2xvcj0iYmx1ZSINCiAgICAgICAgICAgICAgICAgICAsbGluZXR5cGU9ImRvdHRlZCINCiAgICAgICAgICAgICAgICAgICApICsNCiAgICAgICAgZ2VvbV9obGluZShkYXRhID0gLiAlPiUgZ3JvdXBfYnkoc3RhdGUpICU+JSBzdW1tYXJpc2UoY2kgPSBxbm9ybSgoMSswLjk1KS8yKS9zcXJ0KG4oKSkpDQogICAgICAgICAgICAgICAgICAgLGFlcyh5aW50ZXJjZXB0ID0gY2kpDQogICAgICAgICAgICAgICAgICAgLGNvbG9yPSJibHVlIg0KICAgICAgICAgICAgICAgICAgICxsaW5ldHlwZT0iZG90dGVkIg0KICAgICAgICAgICAgICAgICAgICkgKw0KICAgICAgICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzPXNlcSgwLDExMCxieT0yMCkpICsNCiAgICAgICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJub25lIg0KICAgICAgICAgICAgICAscGFuZWwuZ3JpZC5taW5vci54PWVsZW1lbnRfYmxhbmsoKQ0KICAgICAgICAgICAgICAscGFuZWwuZ3JpZC5taW5vci55PWVsZW1lbnRfYmxhbmsoKQ0KICAgICAgICAgICAgICApICsNCiAgICAgICAgbGFicyh4PSJMYWcgKDEwOCBwZXJpb2RzKSINCiAgICAgICAgICAgICAseT0iTGV2ZWwgb2YgQ29ycmVsYXRpb24gKGxpbWl0czogLTEgJiAxKSINCiAgICAgICAgICAgICApICsNCiAgICAgICAgZmFjZXRfd3JhcCh+c3RhdGUsIG5jb2w9MSkNCg0KIyBEaXNwbGF5IC0tLS0NCmdyaWQuYXJyYW5nZShib21fV2Vla2x5QUNGX2F2Z190ZW1wDQogICAgLGJvbV9XZWVrbHlQQUNGX2F2Z190ZW1wDQogICAgLG5jb2w9Mg0KICAgICx0b3A9dGV4dEdyb2IoZXhwcmVzc2lvbihib2xkKHVuZGVybGluZSgiQXV0by1Db3JyZWxhdGlvbiBGdW5jdGlvbiBmb3IgTWVhbiBUZW1wZXJhdHVyZSIpKSkNCiAgICAgICAgICAgICAgICAgICxoanVzdD0wLjUNCiAgICAgICAgICAgICAgICAgICxncD1ncGFyKGZvbnRzaXplPTIwKQ0KICAgICAgICAgICAgICAgICAgKQ0KKQ0KYGBgDQoNCmBgYHtyIEJPTTogRm9yZWNhc3QsIGVjaG89RkFMU0UsIGV2YWw9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHJvd3MucHJpbnQ9NTAsIGNvbHMucHJpbnQ9MzAsIGZpZy53aWR0aD0xNSwgZmlnLmhlaWdodD04fQ0KdGltX3N0YSA8LSBwcm9jLnRpbWUoKQ0KYm9tX2FjYyA8LSBOVUxMDQpmb3IgKHN0YXRlIGluIGMoIk5TVyIsIlZJQyIsIlFMRCIsIlNBIikpIHsNCiAgICBib21fV2Vla2x5VFNfYXZnX3RlbXBbLHN0YXRlXSAlPiUgDQogICAgICAgIChmdW5jdGlvbih4KSB7DQogICAgICAgICAgICB0aW1fc3RhIDwtIHByb2MudGltZSgpDQogICAgICAgICAgICANCiAgICAgICAgICAgICMgU2V0IHVwDQogICAgICAgICAgICBjb2wgPC0gY2FzZV93aGVuKHN0YXRlPT0iTlNXIiB+ICJyZWQiDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLHN0YXRlPT0iUUxEIiB+ICJncmVlbiINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAsc3RhdGU9PSJTQSIgfiAiYmx1ZSINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAsc3RhdGU9PSJWSUMiIH4gIm9yYW5nZSINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApDQogICAgICAgICAgICB0ZXN0eWVhcnMgPC0gMQ0KICAgICAgICAgICAgeWVhcnNiYWNrIDwtIDUNCiAgICAgICAgICAgIGlmIChmaW5kZnJlcXVlbmN5KHgpPT0xMikgew0KICAgICAgICAgICAgICAgIGZvcmVjYXN0cGVyaW9kIDwtIGNhc2Vfd2hlbih0ZXN0eWVhcnM9PTEgfiAoMTIqMis1KQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICx0ZXN0eWVhcnM9PTIgfiAoMTIqMys1KQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICx0ZXN0eWVhcnM9PTMgfiAoMTIqNCs1KQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkNCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgZm9yZWNhc3RwZXJpb2QgPC0gY2FzZV93aGVuKHRlc3R5ZWFycz09MSB+ICg1MioyICsgMTApDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICx0ZXN0eWVhcnM9PTIgfiAoNTIqMyArIDEwKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsdGVzdHllYXJzPT0zIH4gKDUyKjQgKyAxMCkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgDQogICAgICAgICAgICAjIFNlZ21lbnQNCiAgICAgICAgICAgIGlmICh5ZWFyc2JhY2s+MCkgew0KICAgICAgICAgICAgICAgIHggJTw+JSB3aW5kb3coc3RhcnQ9Yyh4ICU+JSBlbmQoKSAlPiUgZmlyc3QoKS0oeWVhcnNiYWNrK3Rlc3R5ZWFycykNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAseCAlPiUgZW5kKCkgJT4lIGxhc3QoKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkpDQogICAgICAgICAgICB9IA0KICAgICAgICAgICAgYm9tX3RybiA8LSB4ICU+JSANCiAgICAgICAgICAgICAgICB3aW5kb3coZW5kPWMoeCAlPiUgZW5kKCkgJT4lIGZpcnN0KCktdGVzdHllYXJzDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLHggJT4lIGVuZCgpICU+JSBsYXN0KCkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApKQ0KICAgICAgICAgICAgYm9tX3RzdCA8LSB4ICU+JSANCiAgICAgICAgICAgICAgICB3aW5kb3coc3RhcnQ9Yyh4ICU+JSBlbmQoKSAlPiUgZmlyc3QoKS10ZXN0eWVhcnMNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICx4ICU+JSBlbmQoKSAlPiUgbGFzdCgpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICApKQ0KICAgICAgICAgICAgDQogICAgICAgICAgICAjIEZpdA0KICAgICAgICAgICAgYm9tX2ZpdCA8LSBib21fdHJuICU+JSBhdXRvLmFyaW1hKG1heC5wPTIwLCBtYXgucT0yMCwgaWM9ImFpY2MiKQ0KICAgICAgICAgICAgDQogICAgICAgICAgICAjIFRlc3QNCiAgICAgICAgICAgIGJvbV9mY3MgPC0gYm9tX2ZpdCAlPiUgZm9yZWNhc3QoaD1sZW5ndGgoYm9tX3RzdCkpDQogICAgICAgICAgICBib21fYWNjIDw8LSBhY2N1cmFjeShib21fZmNzLCBib21fdHN0KSAlPiUgDQogICAgICAgICAgICAgICAgZGF0YS5mcmFtZSgpICU+JSANCiAgICAgICAgICAgICAgICBzZWxlY3QoIlJNU0UiLCJNQUUiLCJNQVBFIiwiTUFTRSIpICU+JSANCiAgICAgICAgICAgICAgICByb3duYW1lc190b19jb2x1bW4oIlNldFR5cGUiKSAlPiUgDQogICAgICAgICAgICAgICAgZmlsdGVyKFNldFR5cGU9PSJUZXN0IHNldCIpICU+JSANCiAgICAgICAgICAgICAgICBzZWxlY3QoLVNldFR5cGUpICU+JSANCiAgICAgICAgICAgICAgICBtdXRhdGUoU3RhdGU9c3RhdGUpICU+JSANCiAgICAgICAgICAgICAgICBzZWxlY3QoU3RhdGUsZXZlcnl0aGluZygpKSAlPiUgDQogICAgICAgICAgICAgICAgcmJpbmQoYm9tX2FjYywuKQ0KICAgICAgICAgICAgDQogICAgICAgICAgICAjICMgUHJpbnQNCiAgICAgICAgICAgICMgcHJpbnQoeCAlPiUgDQogICAgICAgICAgICAjICAgICAgICAgICBhdXRvcGxvdChjb2xvcj1wYXN0ZTAoImRhcmsiLGNvbCkpICsNCiAgICAgICAgICAgICMgICAgICAgICAgIGF1dG9sYXllcihib21fZml0ICU+JSBmb3JlY2FzdChoPWZvcmVjYXN0cGVyaW9kKSwgUEk9VFJVRSwgc2VyaWVzPSJBUklNQSIsIGNvbG9yPWNvbCwgc2l6ZT0xKSArIA0KICAgICAgICAgICAgIyAgICAgICAgICAgYXV0b2xheWVyKGJvbV90c3QsIGNvbG9yPSJibGFjayIsIHNpemU9MSkgKyANCiAgICAgICAgICAgICMgICAgICAgICAgIHNjYWxlX3hfY29udGludW91cyhicmVha3M9c2VxKDIwMDksMjAyMSkNCiAgICAgICAgICAgICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgKw0KICAgICAgICAgICAgIyAgICAgICAgICAgdGhlbWUocGFuZWwuZ3JpZC5taW5vci54PWVsZW1lbnRfYmxhbmsoKQ0KICAgICAgICAgICAgIyAgICAgICAgICAgICAgICAscGxvdC50aXRsZT1lbGVtZW50X3RleHQodmp1c3Q9LTEwLCBjb2xvcj1wYXN0ZTAoImRhcmsiLGNvbCkpDQogICAgICAgICAgICAjICAgICAgICAgICAgICAgICkgKw0KICAgICAgICAgICAgIyAgICAgICAgICAgbGFicyh0aXRsZT1wYXN0ZTAoIkZvcmVjYXN0IGZvciAiLHN0YXRlKQ0KICAgICAgICAgICAgIyAgICAgICAgICAgICAgICx5PSJUZW1wIg0KICAgICAgICAgICAgIyAgICAgICAgICAgICAgICx4PSJUaW1lIg0KICAgICAgICAgICAgIyAgICAgICAgICAgICAgICkNCiAgICAgICAgICAgICMgICAgICAgKQ0KICAgICAgICAgICAgDQogICAgICAgICAgICAjIFJldHVybg0KICAgICAgICAgICAgYXNzaWduKHBhc3RlMCgiYm9tX0Zjc1BsdF8iLHN0YXRlKQ0KICAgICAgICAgICAgICAgICAgLHggJT4lDQogICAgICAgICAgICAgICAgICAgICAgYXV0b3Bsb3QoY29sb3I9cGFzdGUwKCJkYXJrIixjb2wpKSArDQogICAgICAgICAgICAgICAgICAgICAgYXV0b2xheWVyKGJvbV9maXQgJT4lIGZvcmVjYXN0KGg9Zm9yZWNhc3RwZXJpb2QpLCBQST1UUlVFLCBzZXJpZXM9IkZvcmVjYXN0IiwgY29sb3I9Y29sLCBzaXplPTEpICsNCiAgICAgICAgICAgICAgICAgICAgICBhdXRvbGF5ZXIoYm9tX3RzdCwgY29sb3I9ImJsYWNrIiwgc2l6ZT0xKSArIA0KICAgICAgICAgICAgICAgICAgICAgIHNjYWxlX3hfY29udGludW91cyhicmVha3M9c2VxKDIwMDksMjAyMSkpICsNCiAgICAgICAgICAgICAgICAgICAgICB0aGVtZShheGlzLnRpdGxlLng9ZWxlbWVudF9ibGFuaygpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAsYXhpcy50aXRsZS55PWVsZW1lbnRfYmxhbmsoKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgLHBsb3QudGl0bGU9ZWxlbWVudF90ZXh0KHZqdXN0PS02LCBjb2xvcj1wYXN0ZTAoImRhcmsiLGNvbCkpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAscGFuZWwuZ3JpZC5taW5vci54PWVsZW1lbnRfYmxhbmsoKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgLHBsb3QubWFyZ2luPXVuaXQoYygwLjEsMywwLjEsMyksIm1tIikNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICkgKw0KICAgICAgICAgICAgICAgICAgICAgIGxhYnModGl0bGU9c3RhdGUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgLGNhcHRpb249Ym9tX2FjYyAlPiUgZmlsdGVyKFN0YXRlPT1zdGF0ZSkgJT4lIHNlbGVjdCgiUk1TRSIpICU+JSBwdWxsKCkgJT4lIHJvdW5kKDIpICU+JSBwYXN0ZTAoIlNjb3JlZCBSTVNFPSIsLikNCiAgICAgICAgICAgICAgICAgICAgICAgICAgKQ0KICAgICAgICAgICAgICAgICAgLGVudmlyPWdsb2JhbGVudigpDQogICAgICAgICAgICAgICAgICApDQogICAgICAgICAgICAjIChwcm9jLnRpbWUoKS10aW1fc3RhKVszXSAlPiUgYXMubnVtZXJpYygpICU+JSBzZWNvbmRzX3RvX3BlcmlvZCgpICU+JSBwcmludCgpDQogICAgICAgIH0pDQp9DQoNCmdyaWQuYXJyYW5nZShib21fRmNzUGx0X05TVw0KICAgICAgICAgICAgICxib21fRmNzUGx0X1FMRA0KICAgICAgICAgICAgICxib21fRmNzUGx0X1NBDQogICAgICAgICAgICAgLGJvbV9GY3NQbHRfVklDDQogICAgICAgICAgICAgLG5jb2w9MQ0KICAgICAgICAgICAgICxsZWZ0PXRleHRHcm9iKCJBdmcgV2Vla2x5IFRlbXAiLCByb3Q9OTAsIHZqdXN0PTEpDQogICAgICAgICAgICAgLGJvdHRvbT10ZXh0R3JvYigiVGltZSIsIGhqdXN0PTAuNSkNCiAgICAgICAgICAgICAsdG9wPXRleHRHcm9iKGV4cHJlc3Npb24oYm9sZCh1bmRlcmxpbmUoIkZvcmVjYXN0IGJ5IFN0YXRlIikpKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAsaGp1c3Q9MC41DQogICAgICAgICAgICAgICAgICAgICAgICAgICxncD1ncGFyKGZvbnRzaXplPTIwKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICApDQogICAgICAgICAgICAgLHBhZGRpbmc9dW5pdCgwLjEsImxpbmUiKQ0KICAgICAgICAgICAgICkNCg0KIyAocHJvYy50aW1lKCktdGltX3N0YSlbM10gJT4lIGFzLm51bWVyaWMoKSAlPiUgc2Vjb25kc190b19wZXJpb2QoKSAlPiUgcHJpbnQoKQ0KDQpgYGANCg0KYGBge3IgQk9NOiBTY29yZSwgZWNobz1GQUxTRSwgZXZhbD1GQUxTRSwgd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgcm93cy5wcmludD01MCwgY29scy5wcmludD0zMCwgZmlnLndpZHRoPTE1LCBmaWcuaGVpZ2h0PTh9DQpib21fYWNjICU+JSANCiAgICBrYWJsZShhbGlnbj0ibCIpICU+JSANCiAgICBrYWJsZV9zdHlsaW5nKGJvb3RzdHJhcF9vcHRpb25zPWMoInN0cmlwZWQiLCJib3JkZXJlZCIsImNvbmRlbnNlZCIpDQogICAgICAgICAgICAgICAgICxmdWxsX3dpZHRoPUZBTFNFDQogICAgICAgICAgICAgICAgICxwb3NpdGlvbj0ibGVmdCINCiAgICAgICAgICAgICAgICAgKQ0KYGBgDQoNCjwhLS0gRU5EIGhpZGRlbiBzZWN0aW9uIC0tPg0KDQoNCiMgRmluZGluZ3MgeyNmaW5kaW5nc30NCg0KQmFzZWQgb2ZmIHRoZSBhbmFseXNpcyBjb25kdWN0ZWQsIGFuZCB0aGUgZm9yZWNhc3QgcHJlZGljdGVkLCB0aGVyZSBhcmUgZm91ciBrZXkgZmluZGluZ3MuDQoNCiogKipIaXN0b3J5IG9mIEVuZXJneSBQcmljZXMqKjogRmlyc3RseSwgdGhlIEVuZXJneSBQcmljZXMgZm9yIGFsbCBmb3VyIHN0YXRlcyB3ZXJlIGNvbXBhcmF0aXZlbHkgc3RhYmxlIHVwIHVudGlsIGNpcmNhICQyMDEzJCwgYWZ0ZXIgd2hpY2ggdGhlIHByaWNlcyBoYXZlIGJlZ3VuIHRvIGVzY2FsYXRlIGF0IGFuIGluY3JlYXNpbmdseSBzdGVlcCByYXRlLiBDb21iaW5lIHRoaXMgd2l0aCB0aGUgc3BvcmFkaWNpdHkgb2YgdGhlIHNlYXNvbmFsIHByaWNlcyBmb3IgdGhlIHN0YXRlcyBpbmRpY2F0ZXMgdGhhdCBhIHRpbWUtc2VyaWVzIGZvcmVjYXN0IGZvciB0aGUgZnV0dXJlIG9mIGVuZXJneSBwcmljZXMgbWF5IG5vdCBiZSBwZXJmZWN0bHkgYWNjdXJhdGUuDQoNCiogKipTdWl0YWJsZSBmb3IgRm9yZWNhc3RpbmcqKjogU2Vjb25kbHksIHdoaWxlIHRoZSBkYXRhIG1heSBub3QgYmUgcGVyZmVjdGx5IGFjY3VyYXRlIGZvciB0aW1lLXNlcmllcyBwcmVkaWN0aW9uLCBpdCBpcyBzdGlsbCBzdWl0YWJsZSBmb3IgZm9yZWNhc3RpbmcuIFRoYXQgaXMgYmVjYXVzZSBpdCBpczoNCg0KICAgIDEuIE5vdCBXaGl0ZW5vaXNlOw0KICAgIDEuIE5vdCBTdGF0aW9uYXJ5Ow0KICAgIDEuIE5vdCBTZWFzb25hbCAob3IgTWFyZ2luYWxseSBTZWFzb25hbCwgYXMgd2l0aCB0aGUgJFNBJCBkYXRhKTsNCiAgICAxLiBJcyBSZWd1bGFyOw0KICAgIDEuIElzIE1vZGVyYXRlbHkgU3RhYmxlIChhbGwgc2NvcmVzIGNsb3NlIHRvIHRoZSBTdGFiaWxpdHkgVGhyZXNob2xkKTsNCiAgICAxLiBOb3QgTHVtcHk7IGFuZA0KICAgIDEuIElzIEF1dG8tQ29ycmVsYXRlZC4NCiAgICANCiogKipSZWxhdGl2ZWx5IFByZWRpY3RhYmxlKio6IFRoaXJkbHksIGhhdmluZyBmZWQgdGhlIGRhdGEgaW4gdG8gYW4gQVJJTUEgZm9yZWNhc3RpbmcgbW9kZWwsIHRoZSBwcmVkaWN0aW9ucyBhcmUgcmVsYXRpdmVseSBhY2N1cmF0ZSwgd2l0aCBwcmVkaWN0aW9ucyBmYWxsaW5nIGJldHdlZW4gJDQwXCUkIGluYWNjdXJhY3kgKGFzIHdpdGggTlNXKSwgYW5kICQ5MFwlJCBpbmFjY3VyYWN5IHJhdGUgKGFzIHdpdGggJFZJQyQpLg0KDQoqICoqRm9yd2FyZCBQcm9qZWN0aW9ucyoqOiBGb3VydGhseSwgdXNpbmcgdGhlIGZvcmVjYXN0IG1vZGVsIHRvIHByb2plY3QgZm9yd2FyZCwgYW5kIGNvbWJpbmVkIHdpdGggdGhlIGhpc3RvcmljIHRyZW5kcywgaXQgY2FuIGJlIGNvbmNsdWRlZCB0aGF0IHRoZSBlbmVyZ3kgcHJpY2VzIHdpbGwgbm90IGJlIHNpZ25pZmljYW50bHkgZGlmZmVyZW50IHRoYW4gdGhlIHByaWNlcyBzZWVuIGluIHRoZSB5ZWFyICQyMDE5JC4gVGhlIGV4YWN0IGVuZXJneSBwcmljZSBjb3VsZCB2YXJ5IGRyYW1hdGljYWxseSBpbiB0aGlzIGZvcmVjYXN0IGR1ZSB0byB0aGUgYnJvYWQgc2NvcGUgb2YgdGhlIGFjdHVhbCBmb3JlY2FzdCBtb2RlbC4NCg0KDQojIExpbWl0YXRpb25zIHsjbGltaXRhdGlvbnN9DQoNClJlc3VsdGluZyBmcm9tIHRoaXMgcmVzZWFyY2gsIGEgbnVtYmVyIG9mIGxpbWl0YXRpb25zIGhhdmUgYmVlbiBpZGVudGlmaWVkLiBBcyBsaXN0ZWQ6DQoNCjEuIFRoZSBGdXR1cmUgcHJpY2VzIGFyZSBzaW1wbHkgYmFzZWQgb24gYSBzaW5nbGUgaW5wdXQgdmFyaWFibGU6IFBhc3QgcHJpY2VzLg0KMS4gVGhlIFRpbWUtU2VyaWVzIG1vZGVsIGRvZXMgbm90IHRha2UgaW4gdG8gYWNjb3VudCBleHRlcm5hbCB2YXJpYWJsZXMgd2hpY2ggbWF5IGFmZmVjdCBlbmVyZ3kgcHJpY2VzLCBzdWNoIGFzIGVuZXJneSBwcm9kdWN0aW9uIG9yIGVuZXJneSBjYXBhY2l0eSBvciBwZXJjZW50YWdlIG9mIHJlbmV3YWJsZSBlbmVyZ3kgaW4gdGhlIEdyaWQuDQoxLiBUaGUgQW5hbHlzaXMgZG9lcyBub3QgdGFrZSBpbiB0byBhY2NvdW50IEdvdmVybm1lbnQgUG9saWNpZXMgd2hpY2ggbWF5IGhhdmUgaW5mbHVlbmNlZCB0aGUgcHJpY2VzLg0KDQoNCiMgT3Bwb3J0dW5pdGllcyBmb3IgRnV0dXJlIFJlc2VhcmNoIHsjb3Bwb3J0dW5pdGllc30NCg0KSW4gb3JkZXIgdG8gZnVydGhlciBpbmNyZWFzZSB0aGUgYWNjdXJhY3kgb2YgdGhlIHByZWRpY3Rpb24gbW9kZWwsIGFuZCB0byBhZGRyZXNzIHNvbWUgb2YgdGhlIGlkZW50aWZpZWQgbGltaXRhdGlvbnMsIHRoZXJlIGFyZSBzb21lIG90aGVyIG9wcG9ydHVuaXRpZXMgZm9yIGZ1dHVyZSByZXNlYXJjaC4gSW5jbHVkaW5nOg0KDQoxLiBJbnZlc3RpZ2F0ZSB0aGUgYW1vdW50IGluIHdoaWNoIHRoZSBGZWRlcmFsIExlZ2lzbGF0aXZlIExhbmRzY2FwZSBoYXMgY2hhbmdlZCBzaW5jZSBjaXJjYSAyMDE1LCBhbmQgdGhlIGV4dGVudCB0byB3aGljaCB0aGF0IGhhcyBpbmZsdWVuY2VkIGVuZXJneSBwcmljZXMuDQoxLiBDb3JyZWxhdGUgdGhlIGVuZXJneSBwcmljZSBmbHVjdHVhdGlvbnMgd2l0aCB0aGUgY2xvc3VyZXMgb2YgZW5lcmd5IHByb2R1Y3Rpb24gcGxhbnRzLg0KMS4gVXNlIHRoZSByZXN1bHRzIG9mIHRoaXMgcHJlZGljdGlvbiBhcyBhbiBlbnNlbWJsZSBmZWF0dXJlIGluIGEgbXVsdGl2YXJpYXRlIHJlZ3Jlc3Npb24gbW9kZWwgdG8gcHJlZGljdCBGdXR1cmUgRW5lcmd5IFByaWNlcy4gT3RoZXIgZmVhdHVyZXMgY291bGQgcG90ZW50aWFsbHkgaW5jbHVkZToNCiAgDQogICAgMS4gUGVyY2VudGFnZSBicmVha2Rvd24gb2YgUmVuZXdhYmxlIHZzLiBOb24tUmVuZXdhYmxlIEVuZXJneSBzb3VyY2VzIHBlciBzdGF0ZSBwZXIgbW9udGguDQogICAgMS4gQW1vdW50IG9mIEVuZXJneSBQcm9kdWNlZCAob3IgRW5lcmd5IENhcGFjaXR5KSBwZXIgc3RhdGUgcGVyIG1vbnRoLg0KICAgIDEuIEF2ZXJhZ2UgdGVtcGVyYXR1cmUgKG9yIHRlbXBlcmF0dXJlIHJhbmdlKSBwZXIgc3RhdGUgcGVyIG1vbnRoLg0KDQpJdCBpcyByZWNvbW1lbmRlZCB0aGF0IHRoZXNlIG9wcG9ydHVuaXRpZXMgYmUgZXhwbG9yZWQgaW4gZnVsbCwgc28gYXMgdG8gcHJvdmlkZSBhIGRldGFpbGVkIHByZWRpY3Rpb24gbW9kZWwgZm9yIGZ1dHVyZSBlbmVyZ3kgcHJpY2VzLg0KDQoNCiMgQ29uY2x1c2lvbiB7I2NvbmNsdXNpb259DQoNCkluIGNvbmNsdXNpb24sIGFuYWx5c2lzIG9mIHRoZSBBRU1PIGhpc3RvcmljIGVuZXJneSBwcmljZXMgcHJvdmlkZXMgYSBzdWl0YWJsZSBtZXRob2Qgb2YgZm9yZWNhc3RpbmcgZnV0dXJlIHByaWNlcy4gRXhwbG9yYXRpb24gb2YgdGhlIGRhdGEgcmV2ZWFsZWQgdGhhdCB0aGUgcHJpY2VzIGhhdmUgaW5kZWVkIGJlZW4gaW5jcmVhc2luZyBvdmVyIHRoZSBsYXN0IDIwIHllYXJzLCBhbmQgaGF2ZSBiZWd1biBhbiBleHBvbmVudGlhbCBpbmNyZWFzZSBzaW5jZSBhcHByb3hpbWF0ZWx5ICQyMDEzJC4gTW9yZW92ZXIsIGhhdmluZyBhcHBsaWVkIHZhcmlvdXMgc3RhdGlzdGljYWwgdGVzdHMgdG8gdGhlIGRhdGEsIHRoZSBkYXRhIGlzIHN1aXRhYmxlIGZvciB0aW1lLXNlcmllcyBmb3JlY2FzdGluZywgZHVlIHRvIGl0IGJlaW5nIG5vdCBzdGF0aW9uYXJ5LCBub3Qgd2hpdGVub2lzZSwgbWFyZ2luYWxseSBzZWFzb25hbCwgYW5kIG1vZGVyYXRlbHkgc3RhYmxlLg0KDQpXaXRoIHRoZSBpbnRlbnRpb24gb2Ygd2FudGluZyB0byBleHBsb3JlIHdoZXRoZXIgdGhlIGZ1dHVyZSBlbmVyZ3kgcHJpY2VzIGFyZSBhYmxlIHRvIGJlIHByZWRpY3RlZCBzb2xlbHkgdXNpbmcgdW5pdmFyaWF0ZSB0aW1lIHNlcmllcyBkYXRhLCB0aGUgYW5zd2VyIGlzIHllcy4gVGhlIGhpc3RvcmljIEFFTU8gZGF0YSBpcyByZWd1bGFyIGFuZCB1bml2YXJpYXRlLCBhbmQgaXMgYWJsZSB0byBiZSBmZWQgaW4gdG8gYW4gQVJJTUEgZm9yZWNhc3RpbmcgbW9kZWwgdG8gcHJlZGljdCB0aGUgZnV0dXJlIHByaWNlcyB0byBhIGNlcnRhaW4gbGV2ZWwgb2YgY29uZmlkZW5jZS4gVGhpcyBjb25maWRlbmNlIGludGVydmFsIGlzIHRpZ2h0ZXIgZm9yICROU1ckIGFuZCAkUUxEJCwgYW5kIHZlcnkgYnJvYWQgZm9yICRWSUMkIGFuZCAkU0EkLiBIb3dldmVyLCB0aGUgYWNjdXJhY3kgbGV2ZWwgb2YgdGhpcyBtb2RlbCBjYW4gYmUgZ3JlYXRseSBpbXByb3ZlZCB3aGVuIG1vZGVsZWQgaW4gY29uanVuY3Rpb24gd2l0aCB2YXJpb3VzIG90aGVyIGV4dGVybmFsIGluZmx1ZW5jZXMsIGFzIG91dGxpbmVkIGluIEZ1dHVyZSBPcHBvcnR1bml0aWVzLiBUaGVyZWZvcmUsIHRoaXMgcmVzZWFyY2ggaXMgYWJsZSB0byBwcm92aWRlIGFzc2lzdGFuY2UgdG8gQXVzdHJhbGlhbiBob3VzZWhvbGRzIGFuZCBidXNpbmVzc2VzLCBhbmQgaXMgYWJsZSB0byBhZHZpc2UgR292ZXJubWVudCBwb2xpY3kgdG8gY3VyYiB0aGlzIHRyZW5kLg0KDQogIA0KIyBSZWZlcmVuY2VzIHsjcmVmZXJlbmNlc30NCg0KW10oKXsjcmVmOmFlbW9fbmR9DQpBdXN0cmFsaWFuIEVuZXJneSBNYXJrZXQgT3BlcmF0b3IgKEFFTU8pIG5kLiwgdmlld2VkIDEvT2N0LzIwMTksIDw8aHR0cHM6Ly93d3cuYWVtby5jb20uYXUvPj4uDQoNCltdKCl7I3JlZjpob3Jhbl9ldGFsXzIwMTd9DQpIb3JhbiwgUywgTWNHcmF0aCwgVCwgJiBTYW50aGEsIE4gMjAxNywgJ0F1c3RyYWxpYW4gZW5lcmd5IHBvbGljeSBhbmQgZWNvbm9taWMgcmF0aW9uYWxpc20nLCAqRW5lcmd5IE5ld3MqLCB2b2wuIDM1LCBuby4gMywgcHAuIDE2LTcsIElTU046IDE0NDUtMjIyNy4NCg0KW10oKXsjcmVmOmh1dGNoZW5zXzIwMTh9DQpIdXRjaGVucywgRyAyMDE4LCAnQXVzdHJhbGlhJ3MgaGlnaCBlbGVjdHJpY2l0eSBwcmljZXMgdGhlICduZXcgbm9ybWFsJywgcmVwb3J0IHNheXMnLCAqVGhlIEd1YXJkaWFuKiwgdmlld2VkIDEwL09jdC8yMDE5LCA8PGh0dHBzOi8vd3d3LnRoZWd1YXJkaWFuLmNvbS9hdXN0cmFsaWEtbmV3cy8yMDE4L2p1bC8wMS9hdXN0cmFsaWFzLWhpZ2gtZWxlY3RyaWNpdHktcHJpY2VzLXRoZS1uZXctbm9ybWFsLXJlcG9ydC1zYXlzPj4uDQoNCltdKCl7I3JlZjpoeW5kbWFuX25kYX0NCkh5bmRtYW4sIFIgbmQuKGEpLCAnc3RsX2ZlYXR1cmVzJywgICpSIERvY3VtZW50YXRpb24qLCB2aWV3ZWQgMjgvT2N0LzIwMTksIDw8aHR0cHM6Ly93d3cucmRvY3VtZW50YXRpb24ub3JnL3BhY2thZ2VzL3RzZmVhdHVyZXMvdmVyc2lvbnMvMS4wLjEvdG9waWNzL3N0bF9mZWF0dXJlcz4+Lg0KDQpbXSgpeyNyZWY6aHluZG1hbl9uZGJ9DQpIeW5kbWFuLCBSIG5kLihiKSwgJ0FjZicsICAqUiBEb2N1bWVudGF0aW9uKiwgdmlld2VkIDEvTm92LzIwMTksIDw8aHR0cHM6Ly93d3cucmRvY3VtZW50YXRpb24ub3JnL3BhY2thZ2VzL2ZvcmVjYXN0L3ZlcnNpb25zLzguOS90b3BpY3MvQWNmPj4uDQoNCltdKCl7I3JlZjprYW5nXzIwMTd9DQpLYW5nLCBFIDIwMTcsICdUaW1lIFNlcmllczogQVJJTUEgTW9kZWwnLCAgKk1lZGl1bSosIHZpZXdlZCAzMC9PY3QvMjAxOSwgPDxodHRwczovL21lZGl1bS5jb20vQGthbmdldWdpbmUvdGltZS1zZXJpZXMtYXJpbWEtbW9kZWwtMTExNDBiYzA4YzY+Pi4NCg0KW10oKXsjcmVmOmt3aWF0a293c2tpX2V0YWxfMTk5Mn0NCkt3aWF0a293c2tpLCBELiwgUGhpbGxpcHMsIFAuLCBTY2htaWR0LCBQLiwgJiBTaGluLCBZLiAxOTkyLCAnVGVzdGluZyB0aGUgTnVsbCBIeXBvdGhlc2lzIG9mIFN0YXRpb25hcml0eSBBZ2FpbnN0IHRoZSBBbHRlcm5hdGl2ZSBvZiBhIFVuaXQgUm9vdDogSG93IFN1cmUgQXJlIFdlIFRoYXQgRWNvbm9taWMgVGltZSBTZXJpZXMgSGF2ZSBhIFVuaXQgUm9vdD8nLCAqSm91cm5hbCBvZiBFY29ub21ldHJpY3MqLCB2b2wuIDU0LCBuby4gMSwgcHAuIDE1OS0xNzgsIERPSTogMTAuMTAxNi8wMzA0LTQwNzYoOTIpOTAxMDQtWS4NCg0KW10oKXsjcmVmOmxhdGltZXJfMjAxOH0NCkxhdGltZXIsIEMgMjAxOCwgJydObyBsaWtlbGlob29kIG9mIHJlbGllZiBhaGVhZCc6IEZ1dHVyZSBwb3dlciBwcmljZXMgY29udGludWUgdG8gcmlzZScsICpUaGUgU3lkbmV5IE1vcm5pbmcgSGVyYWxzKiwgdmlld2VkIDEwL09jdC8yMDE4LCA8PGh0dHBzOi8vd3d3LnNtaC5jb20uYXUvYnVzaW5lc3MvdGhlLWVjb25vbXkvbm8tbGlrZWxpaG9vZC1vZi1yZWxpZWYtYWhlYWQtZnV0dXJlLXBvd2VyLXByaWNlcy1jb250aW51ZS10by1yaXNlLTIwMTgxMDMwLXA1MGN1MS5odG1sPj4uDQoNCltdKCl7I3JlZjpsaW5jb2xuXzIwMTJ9DQpMaW5jb2xuLCBTIDIwMTIsICdPcHRpb25zIGZvciBDaGFuZ2UgaW4gdGhlIEF1c3RyYWxpYW4gRW5lcmd5IFByb2ZpbGUnLCAqQU1CSU8qLCB2b2wuIDQxLCBuby4gOCwgcHAuIDg0MS01MCwgRE9JOiAxMC4xMDA3L3MxMzI4MC0wMTItMDMxNS0wLg0KDQpbXSgpeyNyZWY6bGp1bmdfYm94XzE5Nzh9DQpManVuZywgRyAmIEJveCwgRyAxOTc4LCAnT24gYSBtZWFzdXJlIG9mIGxhY2sgb2YgZml0IGluIHRpbWUgc2VyaWVzIG1vZGVscycsICAqQmlvbWV0cmlrYSosIHZvbC4gNjUsIG5vLiAyLCBwcC4yOTctMzAzLCBET0k6IDEwLjIzMDcvMjMzNTIwNy4NCg0KW10oKXsjcmVmOm1jbXVycnlfcG9saXRpc18yMDEwfQ0KTWNNdXJyeSwgVC4sICYgUG9saXRpcywgTi4gMjAxMCwgJ0JhbmRlZCBhbmQgdGFwZXJlZCBlc3RpbWF0ZXMgZm9yIGF1dG9jb3ZhcmlhbmNlIG1hdHJpY2VzIGFuZCB0aGUgbGluZWFyIHByb2Nlc3MgYm9vdHN0cmFwJywgKkpvdXJuYWwgb2YgVGltZSBTZXJpZXMgQW5hbHlzaXMqLCB2b2wuIDMxLCBuby4gNiwgcHAuIDQ3MS00ODIsIERPSTogMTAuMTExMS9qLjE0NjctOTg5Mi4yMDEwLjAwNjc5LnguDQoNCltdKCl7I3JlZjpvbGxlY2hfMjAxOX0NCk9sbGVjaCwgRCAyMDE5LCAnc2Vhc3Rlc3RzIC0gU2Vhc29uYWxpdHkgdGVzdHMnLCAgKlIgVmlnbmV0dGUqLCB2aWV3ZWQgMjgvT2N0LzIwMTksIDw8aHR0cHM6Ly9jcmFuLnItcHJvamVjdC5vcmcvd2ViL3BhY2thZ2VzL3NlYXN0ZXN0cy92aWduZXR0ZXMvc2Vhc3Rlc3RzLXZpZ25ldHRlLmh0bWw+Pi4NCg0KW10oKXsjcmVmOnBlcmNpdmFsXzIwMTh9DQpQZXJjaXZhbCwgTCAyMDE4LCAnSGlnaGVyIGVuZXJneSBwcmljZXMgYXJlIGhlcmUgdG8gc3RheSDigJMgaGVyZeKAmXMgd2hhdCB3ZSBjYW4gZG8gYWJvdXQgaXQnLCAqVGhlIENvbnZlcnNhdGlvbiosIHZpZXdlZCAxMC9PY3QvMjAxOSwgPDxodHRwOi8vdGhlY29udmVyc2F0aW9uLmNvbS9oaWdoZXItZW5lcmd5LXByaWNlcy1hcmUtaGVyZS10by1zdGF5LWhlcmVzLXdoYXQtd2UtY2FuLWRvLWFib3V0LWl0LTk5MTg3Pj4uDQoNCltdKCl7I3JlZjpwZmFmZl9uZH0NClBmYWZmLCBCIG5kLiwgJ3VyLmtwc3MnLCAgKlIgRG9jdW1lbnRhdGlvbiosIHZpZXdlZCAyOC9PY3QvMjAxOSwgPDxodHRwczovL3d3dy5yZG9jdW1lbnRhdGlvbi5vcmcvcGFja2FnZXMvdXJjYS92ZXJzaW9ucy8xLjMtMC90b3BpY3MvdXIua3Bzcz4+Lg0KDQpbXSgpeyNyZWY6cmNvcmVfbmR9DQpSLUNvcmUsIG5kLiwgJ0JveC50ZXN0JywgICpSIERvY3VtZW50YXRpb24qLCB2aWV3ZWQgMjgvT2N0LzIwMTksIDw8aHR0cHM6Ly93d3cucmRvY3VtZW50YXRpb24ub3JnL3BhY2thZ2VzL3N0YXRzL3ZlcnNpb25zLzMuNi4xL3RvcGljcy9Cb3gudGVzdD4+Lg0KDQpbXSgpeyNyZWY6c2F4X25kfQ0KU2F4LCBDIG5kLiwgJ3FzJywgICpSIERvY3VtZW50YXRpb24qLCB2aWV3ZWQgMjgvT2N0LzIwMTksIDw8aHR0cHM6Ly93d3cucmRvY3VtZW50YXRpb24ub3JnL3BhY2thZ2VzL3NlYXNvbmFsL3ZlcnNpb25zLzEuMi4xL3RvcGljcy9xcz4+Lg0KDQpbXSgpeyNyZWY6c3JpdmFzdGF2YV8yMDE1fQ0KU3JpdmFzdGF2YSwgVCAyMDE1LCAnQSBDb21wbGV0ZSBUdXRvcmlhbCBvbiBUaW1lIFNlcmllcyBNb2RlbGxpbmcgaW4gUicsICAqQW5hbHl0aWNzIFZpZHlhKiwgdmlld2VkIDI5L09jdC8yMDE5LCA8PGh0dHBzOi8vd3d3LmFuYWx5dGljc3ZpZGh5YS5jb20vYmxvZy8yMDE1LzEyL2NvbXBsZXRlLXR1dG9yaWFsLXRpbWUtc2VyaWVzLW1vZGVsaW5nLz4+Lg0KDQpbXSgpeyNyZWY6c2FyZGFyXzIwMTV9DQpTYXJkYXIsIFAgMjAxNSwgJ1Jlc2VhcmNoIGFuZCBkZXZlbG9wbWVudCwgd2VsZmFyZSBhbmQgZWZmaWNpZW5jeTogYW4gQXVzdHJhbGlhbiBlbmVyZ3kgcGVyc3BlY3RpdmUnLCAqSW50ZXJuYXRpb25hbCBKb3VybmFsIG9mIEZsb2JhbCBFbmVyZ3kgSXNzdWVzKiwgdm9sLiAxMSwgbm8uIDEsIHBwLiAxNTUtNjAsIElTU046IDA5NTQtNzExOC4NCg0KW10oKXsjcmVmOnlhbmdfaHluZG1hbl8yMDE5fQ0KWWFuZywgWSwgJiBIeW5kbWFuLCBSSiAyMDE5LCAnSW50cm9kdWN0aW9uIHRvIHRoZSB0c2ZlYXR1cmVzIHBhY2thZ2UnLCAgKlIgVmlnbmV0dGUqLCB2aWV3ZWQgMjgvT2N0LzIwMTksIDw8aHR0cHM6Ly9jcmFuLnItcHJvamVjdC5vcmcvd2ViL3BhY2thZ2VzL3RzZmVhdHVyZXMvdmlnbmV0dGVzL3RzZmVhdHVyZXMuaHRtbD4+LiANCg0KW10oKXsjcmVmOnplaWxlaXNfZ3JvdGhlbmRpZWNrX25kfQ0KWmVpbGVpcywgQSwgJiBHcm90aGVuZGllY2ssIEcgbmQuLCAnem9vOiBBbiBTMyBDbGFzcyBhbmQgTWV0aG9kcyBmb3IgSW5kZXhlZCBUb3RhbGx5IE9yZGVyZWQgT2JzZXJ2YXRpb25zJywgICpSIFZpZ25ldHRlKiwgdmlld2VkIDI4L09jdC8yMDE5LCA8PGh0dHBzOi8vY3Jhbi5yLXByb2plY3Qub3JnL3dlYi9wYWNrYWdlcy96b28vdmlnbmV0dGVzL3pvby5wZGY+Pi4NCg0KW10oKXsjcmVmOnplaWxlaXNfbmR9DQpaZWlsZWlzLCBBLCBuZC4gJ2lzLnJlZ3VsYXInLCAgKlIgRG9jdW1lbnRhdGlvbiosIHZpZXdlZCAyOC9PY3QvMjAxOSwgPDxodHRwczovL3d3dy5yZG9jdW1lbnRhdGlvbi5vcmcvcGFja2FnZXMvem9vL3ZlcnNpb25zLzEuOC02L3RvcGljcy9pcy5yZWd1bGFyPj4uDQoNCg0KIyBQb3N0IFNjcmlwdCB7I3Bvc3RzY3JpcHR9DQoNCioqQWNrbm93bGVkZ2VtZW50cyoqOiBUaGlzIHJlcG9ydCB3YXMgY29tcGlsZWQgd2l0aCBzb21lIGFzc2lzdGFuY2UgZnJvbSBvdGhlcnMuIEFja25vd2xlZGdlbWVudHMgZ28gdG86DQoNCjEuIFlhbiBIb2x0eiBmb3IgaGlzIGNvZGUgZm9yIGhvdyB0byBhZGQgdGhlIGZvb3RlciBlbGVtZW50cyAoPGh0dHBzOi8vaG9sdHp5LmdpdGh1Yi5pby9QaW1wLW15LXJtZC8+ICYgPGh0dHBzOi8vZ2l0aHViLmNvbS9ob2x0enkvZXB1UmF0ZT4pLg0KMS4gVGltIEhvbG1hbiBmb3IgaGlzIGNvZGUgZm9yIGhvdyB0byBhZGQgdGhlIEdpdEh1YiBjb3JuZXIgKDxodHRwczovL2dpdGh1Yi5jb20vdGhvbG1hbi9naXRodWItY29ybmVycz4pLg0KMS4gV2lsbGlhbSBEYWkgZm9yIGhpcyBhc3Npc3RhbmNlIHRvIHdyaXRlIHRoZSBzY3JpcHRzIHRvIHdlYi1zY3JhcGUgdGhlIEFFTU8gd2Vic2l0ZS4NCjEuIE1pY2hhZWwgR29yZG9uIGZvciBoaXMgYXNzaXN0YW5jZSB0byB3cml0ZSB0aGUgc2NyaXB0cyB0byB3ZWItc2NyYXBlIHRoZSBCT00gd2Vic2l0ZS4NCg0KDQoqKlB1YmxpY2F0aW9ucyoqOiBUaGlzIHJlcG9ydCBpcyBhbHNvIHB1Ymxpc2hlZCBvbiB0aGUgZm9sbG93aW5nIHNpdGVzOg0KDQoxLiBSUHViczogW1JQdWJzL2NocmltYWhvL0F1c0VuZXJneVByaWNlc10oaHR0cDovL3JwdWJzLmNvbS9jaHJpbWFoby9BdXNFbmVyZ3lQcmljZXMpDQoxLiBHaXRIdWI6IFtHaXRIdWIvY2hyaW1haG8vQXVzRW5lcmd5UHJpY2VzXShodHRwczovL2dpdGh1Yi5jb20vY2hyaW1haG8vQXVzRW5lcmd5UHJpY2VzKQ0KMS4gTWVkaXVtOiBbTWVkaXVtL2NocmltYWhvL0F1c0VuZXJneVByaWNlc10oaHR0cHM6Ly9tZWRpdW0uY29tL0BjaHJpbWFoby9hdXNlbmVyZ3lwcmljZXMtNzM3YjljYmU1NTQwP3NrPThkMGRkMGJjMzE2N2MyY2U1OWQ5YjM4OWQ1YzQ0M2FmKQ0KMS4gTGlua2VkSW46IFtMaW5rZWRJbi9jaHJpbWFoby9BdXNFbmVyZ3lQcmljZXNdKGh0dHBzOi8vd3d3LmxpbmtlZGluLmNvbS9wdWxzZS9mdXR1cmUtYXVzdHJhbGlhbi1lbmVyZ3ktcHJpY2VzLWNocmlzLW1haG9uZXkpDQoNCioqQ2hhbmdlIExvZyoqOiBUaGlzIHB1YmxpY2F0aW9uIHdhcyBtb2RpZmllZCBvbiB0aGUgZm9sbG93aW5nIGRhdGVzOg0KDQoxLiAwMi9Ob3YvMjAxOTogT3JpZ2luYWwgUHVibGljYXRpb24gZGF0ZS4NCg==
 

Report compiled by Chris Mahoney

chrismahoney@hotmail.com