Markov modelling presents an analytical framework for modeling state switching processes occuring with an individual or within a family unit using panel study longitudinal data. Income mobility and poverty switching dynamics particularly have generated some interest in the economics/social policy field. Similar to the analysis of Costa and Angelis, in this paper, I am trying to model the switching states of poverty. They postulate that there are two underlying poverty states; transitionary and permenent. I aim to discover these states using the data from the Panel Study of Income Dynamics run by the Institute of Social Research at the University of Michigan.

The Data

The panel study of income dynamics (PSID) is a long running longitudinal household survey which began in 1968. It studies a nationally representative sample of over 18000 individuals living in 5000 families in the United States. The design of the survey, interviewing both individuals and family units over time, presents an interesting opportunity to study poverty transition by family unit. The poverty proxy used in this analysis takes the median of the Total Income variable - similar to the process used by Costa and Angelis - and keeps only those indivials below the median level. I also use socio-economic indicators from the data as transition covariates in the HMM model. Specifically, the age, employment status, years of education completed and race variables. Costa and Angelis use the same covariates with the inclusion of housing htatus, gender and geographical area. Gender was not included in the HMM model in this analysis as this is an individual level variable that does not apply to the family as a unit of observation. Below is a break down of the specific variables used, transformations to the variables, as well as year of waves. Years: For this analysis I have used 6 waves of the study, 2005, 2007, 2009, 2011, 2013 and 2015. After excluding families over the median level of income, and dropping observations with non-responses in any of the covariates, the number of observations in each wave are as follows.

Year of study 2005 2007 2009 2011 2013 2015
No. of observations 17033 15767 14324 14185 12857 11078

These numbers were inclded in the model to account for the cycles of the longitudinal dataset.

Age: This is a continuous variable from the dataset ranging from 3 - 40. Since the income level reported (see income) is by family level and not individual, all the age observations were preserved. Observations with 999 indicating a refusal to answer the question were coded as missing and excluded form the model.

Employment Status: This variable was derived using the ‘Employment Status’ sequence of questions. The data is coded as Employed if a responded answered 1 - Working Now, Unemployed if the respondent answered 2 - Temporarily laid off, 3 - Looking for work, unemployed, 6 - Housewife, coded Retired if the respondent answered 4 - Retired and and coded Other for everything else.

Years of Education Completed: This is another continuous variable with years of education completed in lifetime of respondent. The range of this variable is 0 - 12 with 99 for respondents who refused to reply. All observtions with a response of 99 were coded as missing and dropped from the analysis.

Race: This variable was derived as the combination of two response variables from the data. The race of the head of household and the race of spouse. If the head and spouse have the same race, the family unit is coded as that race. If the head of household and spouse are of different races, the Race variable was coded as other. Due to the different combinations of races, more than 10, assigning dummy variables to all the mixed race families was not feasible. All the major race categories were preserved.

Total Income: Total household income in dollars reported by respondents. This income level is the same for all individuals in the household.

Model For this analysis, I used a hidden markov model which is defined by the following: \[\begin{array}{l} f_{X_{0}}(x_0\params\theta), \ f_{X_{n}|X_{n-1}}(x_{n}\given x_{n-1}\params\theta), \ f_{Y_{n}|X_n}(y_{n}\given x_n\params\theta), \end{array}\] for \(n=1:N\) Here I assume that family has a latent rate \(X_i(t)\) of transitiong out or back into poverty states. Each data point \(y_{ij}\) is the total income level for a family between time \(t_{j-1}\) and \(t_j\), where \(i=1,\dots,85244\) and \(j=1,\dots,6\). The unobserved poverty process \(\{X_i(t)\}\) is connected to the data through change in income for each family unit \(i\) in number of reporting cycles \(j\), which can be written as \[C_{ij}= \int_{t_{j-1}}^{t_j} X_i(t)\, dt,\]. [2]
A stochastic mixture model for gaussian distributed data was used to model \(y_{ij}\) as a gaussian random variable with mean \(\mu\) and variance \(\sigma^2\). This model was chosen after examining the vizually density of the response variable and testing the fit of different distributions to the data and comparing AIC. The distributions tested were lognormal, normal, weibull and gamma. Only the lognormal and gaussian distributions could be fitted to the data, and Like the plot suggests, the data is best fit by a normal/gaussian model as it had the lower AIC of 1904573 compared to 2032992 with the lognormal. The Mixture Hidden Markov Model(MHMM) was selected for this analysis vs the Partially Observed Markov Model (POMP) because it allows for a continuous gaussian distributed response variable which a POMP does not. The possibility of a general dependence on \(n\) includes the possibility that there is some covariate time series \(z_{0:N}\) such that \[\begin{array}{lcl} f_{X_{0}}(x_0\params\theta)&=& f_{X_{0}}(x_0\params\theta,z_0) \ f_{X_{n}|X_{n-1}}(x_{n}\given x_{n-1}\params\theta) &=& f_{X_{n}|X_{n-1}}(x_{n}\given x_{n-1}\params\theta,z_n), \ f_{Y_{n}|X_n}(y_{n}\given x_n\params\theta) &=& f_{Y_{n}|X_n}(y_{n}\given x_n\params\theta,z_n), \end{array}\] for \(n=1:N\)
To derive a multidimensional concept of poverty, the covariates age, years of education, employment status and race were included in the model as I hypothesized these soci-economic factors to have an effect on the transition of poverty states. To test this hypothesis, I ran a glm regression on the response variable total income using the covariates as independent variables (see analysis section). The regression Parameter estimation for the MHMM model was achieved by means of a variant of the EM procedure, forward-backward or Baum-Welch algorithm.

Analysis First, after using a glm regression to the hypothesis of a relationship between total income levels and the four independent variables, I found age, as well as employment status to be statistically significant. The difference income levels between white households compared to black and american indian households was also statistically significant. Note that these households are households below the median income levels overall. Years completed education is not significant but the model including it as a transition covariate performed better in terms of log likelihood, AIC and BIC values (Table 1).


Call:
glm(formula = log(TotalIncome) ~ Age + as.factor(EmploymentStatus) + 
    as.factor(Race) + YearsCompletedEducation, data = PSIDdat)

Deviance Residuals: 
     Min        1Q    Median        3Q       Max  
-12.6766   -0.2183    0.2954    0.6621    1.7196  

Coefficients:
                                          Estimate Std. Error t value Pr(>|t|)    
(Intercept)                             10.0168328  0.0103971 963.422  < 2e-16 ***
Age                                     -0.0022776  0.0003552  -6.411 1.45e-10 ***
as.factor(EmploymentStatus)Employed      0.3887984  0.0165892  23.437  < 2e-16 ***
as.factor(EmploymentStatus)Unemployed   -0.3289443  0.0201588 -16.318  < 2e-16 ***
as.factor(EmploymentStatus)Retired       0.1603831  0.0303615   5.282 1.28e-07 ***
as.factor(Race)Other                     0.0231736  0.0210058   1.103    0.270    
as.factor(Race)Black/African-American   -0.4039575  0.0110886 -36.430  < 2e-16 ***
as.factor(Race)American Indian          -0.4215158  0.0618219  -6.818 9.28e-12 ***
as.factor(Race)Asian                    -0.0191417  0.0554854  -0.345    0.730    
as.factor(Race)Native Hawaiian/Islander  0.2628725  0.4071302   0.646    0.518    
YearsCompletedEducation                  0.0008535  0.0008495   1.005    0.315    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for gaussian family taken to be 2.319653)

    Null deviance: 205549  on 85243  degrees of freedom
Residual deviance: 197711  on 85233  degrees of freedom
AIC: 313651

Number of Fisher Scoring iterations: 2

I also examined the autocorrelation between the two continuous covariates and income levels using a CCF plot of each and found evidence for autocorrelation at different lag periods.

The next step is to determing if the number of transitionary states; 2, hypothesized by Costa and Angelis is the optimal number of hidden/latent states present in my data. After running the model with number of states from 2-5, as well as with all the transition covariates, transition covariates except years of education completed and none of the covariates, we can examine the likelihood, AIC and BIC values to compare performance (see table 1). I also ran a multivariate response hidden markov model with total income as well as employment status, indicating in the model that this is a multinomial variable. We can see that the model with the best performace in terms of log likelihood, AIC and BIC is the 2 hidden state model, with 1 response and transition covariates age and race.

Table 1
States Log.Lik AIC BIC df Response Covariates
2 -922865.3 1845773 1845969 21 Total Income Race, Age, Years of Education
3 -934894.0 1869900 1870424 56 Total Income Race, Age, Years of Education
4 -934894.0 1870002 1871003 107 Total Income Race, Age, Years of Education
2 -1028984.0 2057994 2058115 13 Total Income and Employment Status None
2 -934894.0 1869842 1870095 27 Total Income Race, Age, Years of Education, Years of Employment
3 -934894.0 1869816 1869947 14 Total Income None
2 -934894.0 1869826 1870004 19 Total Income Race and Age
3 -934894.0 1869888 1870356 50 Total Income Race and Age

Results and Discussion

Because the algorithm allows covariates on the transition probabilities, the default baseline category is the first state. The probability of being in the first state is the second state value in the first component, and the probability of being in the second state is the second state value in the second state component. We can also see the probability of being in each state withing each state component when the covariates are set at 0. (See table below)

Table 2
State Component 1
State Component 2
Covariates State.1.1 State.1.2 State.2.1 State.2.2
(Intercept) 0.0000000 -1.6952652 0.000000 1.6539263
RaceWhite 0.0000000 0.3452791 0.000000 -0.1616289
RaceBlack/African-American 0.0000000 -0.0162066 0.000000 -0.8061333
RaceAmerican Indian 0.0000000 0.4283429 0.000000 -0.6587425
RaceAsian 0.0000000 -0.3316479 0.000000 0.3998702
RaceNative Hawaiian/Islander 0.0000000 0.0955277 0.000000 -0.4882065
Age 0.0000000 0.0094510 0.000000 -0.0065010
YearsCompletedEducation 0.0000000 0.0057672 0.000000 -0.0049468
Probalities at zero values of the covariates 0.8449153 0.1550847 0.160579 0.8394210

To analyze the state for each individual in a household, and compare it to the covariates, we use the posterior viterbi algorithm to find the most likely state sequence. We vizualize the most probable state for each household and analyze the result. Looking at the results, there are clear indications that state 1 is the permanent poverty state, and state 2 is the transitionary poverty state. We can see some interesting results looking at charts 1 and 2. It seems like white and mixed households on average, are less likely to be in the permanent poverty state than black households. It also seems (chart 2), that households where the head of house and spouse are employed are more likely to be in the transtionary poverty state than households with unemployed individuals. Looking also at income levels by state, we can see that households with higher income levels are overwhelmenly more likely to be in the transitionary poverty state than those with lower income levels. For the age covariate, on average, younger individuals are more likely to be in a permanent poverty state,but the difference is trivial.

References

A Dynamic Latent Model for Poverty Measurement; Michelle Costa and Luca De Angelis
Panel Study of Income Dynamics (PSID) University of Michigan
https://pdfs.semanticscholar.org/207e/81cf7b5c22176ae3972da2ecd09f6b2c3c67.pdf
http://yunus.hacettepe.edu.tr/~iozkan/eco742/hmm.html Lecture Notes: https://ionides.github.io/531w18/13/notes13.html
Depmix4 CRAN

LS0tDQp0aXRsZTogIk1peHR1cmUgSGlkZGVuIE1hcmtvdiBNb2RlbCBmb3IgUG92ZXJ0eSBNZWFzdXJlbWVudCB1c2luZyBMb25naXR1ZGluYWwgRGF0YSINCm91dHB1dDogaHRtbF9ub3RlYm9vaw0KLS0tDQpgYGB7ciBldmFsID0gVFJVRSwgZWNobyA9IEZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KbGlicmFyeShwbHlyKQ0KbGlicmFyeShyZXNoYXBlMikNCmxpYnJhcnkocmVhZHhsKQ0KbGlicmFyeShkYXRhLnRhYmxlKQ0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShkZXBtaXhTNCkNCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkoZ3JpZEV4dHJhKQ0KbGlicmFyeShrYWJsZUV4dHJhKQ0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkoZGF0YS50YWJsZSkNCmxpYnJhcnkoTUFTUykNCmxpYnJhcnkoem9vKQ0KbGlicmFyeSh4dHMpDQpgYGANCg0KYGBge3IgZXZhbCA9IEZBTFNFLCBlY2hvPUZBTFNFfQ0KIyNDTEVBTiBVUCBEQVRBDQpQU0lEIDwtIHJlYWRfZXhjZWwoIkM6L1VzZXJzL1NhbmRyYS9EZXNrdG9wL1Ugb2YgTWljaGlnYW4vV29yay9QU0lEIEV4Y2VsL0oyNDE5NzYueGxzeCIsICNDaGFuZ2UgcmVmZXJlbmNlIG9mIGZpbGUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sX3R5cGVzID0gYygic2tpcCIsICJza2lwIiwgInNraXAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibnVtZXJpYyIsICJudW1lcmljIiwgIm51bWVyaWMiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibnVtZXJpYyIsICJudW1lcmljIiwgInNraXAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibnVtZXJpYyIsICJudW1lcmljIiwgIm51bWVyaWMiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibnVtZXJpYyIsICJudW1lcmljIiwgIm51bWVyaWMiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibnVtZXJpYyIsICJza2lwIiwgIm51bWVyaWMiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibnVtZXJpYyIsICJudW1lcmljIiwgIm51bWVyaWMiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibnVtZXJpYyIsICJudW1lcmljIiwgIm51bWVyaWMiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2tpcCIsICJudW1lcmljIiwgIm51bWVyaWMiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibnVtZXJpYyIsICJudW1lcmljIiwgIm51bWVyaWMiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibnVtZXJpYyIsICJudW1lcmljIiwgInNraXAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibnVtZXJpYyIsICJudW1lcmljIiwgIm51bWVyaWMiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibnVtZXJpYyIsICJudW1lcmljIiwgIm51bWVyaWMiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibnVtZXJpYyIsICJza2lwIiwgIm51bWVyaWMiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibnVtZXJpYyIsICJudW1lcmljIiwgIm51bWVyaWMiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibnVtZXJpYyIsICJudW1lcmljIiwgIm51bWVyaWMiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2tpcCIsICJudW1lcmljIiwgIm51bWVyaWMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJudW1lcmljIiwgIm51bWVyaWMiLCAibnVtZXJpYyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm51bWVyaWMiLCAibnVtZXJpYyIsICJudW1lcmljIikpDQoNClBTSUQgPC0gYGNvbG5hbWVzPC1gKFBTSUQsIGMoIlJlbGVhc2VOdW1iZXIuMjAwNSIsICJUb3RhbEluY29tZS4yMDA1IiwgIk1hcml0YWxTdGF0dXMuMjAwNSIsICJJbnRlcnZpZXdOdW0uMjAwNSIsICJTZXF1ZW5jZU51bS4yMDA1IiwgIlR5cGVvZlJlY29yZC4yMDA1IiwgIldoeU5vbnJlc3BvbnNpdmUuMjAwNSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSZWxlYXNlTnVtYmVyLjIwMDciLCAiVG90YWxJbmNvbWUuMjAwNyIsICJNYXJpdGFsU3RhdHVzLjIwMDciLCAiSW50ZXJ2aWV3TnVtLjIwMDciLCAiU2VxdWVuY2VOdW0uMjAwNyIsICJUeXBlb2ZSZWNvcmQuMjAwNyIsICJXaHlOb25yZXNwb25zaXZlLjIwMDciLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUmVsZWFzZU51bWJlci4yMDA5IiwgIlRvdGFsSW5jb21lLjIwMDkiLCAiTWFyaXRhbFN0YXR1cy4yMDA5IiwgIkludGVydmlld051bS4yMDA5IiwgIlNlcXVlbmNlTnVtLjIwMDkiLCAiVHlwZW9mUmVjb3JkLjIwMDkiLCAiV2h5Tm9ucmVzcG9uc2l2ZS4yMDA5IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJlbGVhc2VOdW1iZXIuMjAxMSIsICJUb3RhbEluY29tZS4yMDExIiwgIk1hcml0YWxTdGF0dXMuMjAxMSIsICJJbnRlcnZpZXdOdW0uMjAxMSIsICJTZXF1ZW5jZU51bS4yMDExIiwgIlR5cGVvZlJlY29yZC4yMDExIiwgIldoeU5vbnJlc3BvbnNpdmUuMjAxMSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSZWxlYXNlTnVtYmVyLjIwMTMiLCAiVG90YWxJbmNvbWUuMjAxMyIsICJNYXJpdGFsU3RhdHVzLjIwMTMiLCAiSW50ZXJ2aWV3TnVtLjIwMTMiLCAiU2VxdWVuY2VOdW0uMjAxMyIsICJUeXBlb2ZSZWNvcmQuMjAxMyIsICJXaHlOb25yZXNwb25zaXZlLjIwMTMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUmVsZWFzZU51bWJlci4yMDE1IiwgIlRvdGFsSW5jb21lLjIwMTUiLCAiTWFyaXRhbFN0YXR1cy4yMDE1IiwgIkludGVydmlld051bS4yMDE1IiwgIlNlcXVlbmNlTnVtLjIwMTUiLCAiVHlwZW9mUmVjb3JkLjIwMTUiLCAiV2h5Tm9ucmVzcG9uc2l2ZS4yMDE1IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVtcGxveW1lbnRTdGF0dXMuMjAwNSIsICJFbXBsb3ltZW50U3RhdHVzLjIwMDciLCAiRW1wbG95bWVudFN0YXR1cy4yMDA5IiwgIkVtcGxveW1lbnRTdGF0dXMuMjAxMSIsICJFbXBsb3ltZW50U3RhdHVzLjIwMTMiLCAiRW1wbG95bWVudFN0YXR1cy4yMDE1IikpDQoNClBTSUQyIDwtIHJlYWRfZXhjZWwoIkM6L1VzZXJzL1NhbmRyYS9EZXNrdG9wL1Ugb2YgTWljaGlnYW4vV29yay9QU0lEIEV4Y2VsL0oyNDM5MTEueGxzeCIpICNDaGFuZ2UgcmVmZXJlbmNlDQoNClBTSUQgPC0gY2JpbmQoUFNJRCwgUFNJRDIpDQoNCiNDb252ZXJ0IHRvIGxvbmcgZm9ybWF0IC0tIE1vdmUgc2V4IHRvIGJlZ2lubmluZyBvZiBkYXRhZnJhbWUgZmlyc3QNCiN4IDwtICJTZXgiDQpQU0lEIDwtIFBTSURbYyh4LCBzZXRkaWZmKG5hbWVzKFBTSUQpLCB4KSldDQojUFNJRCA8LSBQU0lEWywyOjc5XQ0KUFNJRCA8LSByZXNoYXBlKFBTSURbLDI6NzldLCBkaXIgPSAibG9uZyIsIHZhcnlpbmcgPSAxOjc4LCBzZXAgPSAiLiIpDQojUmVtb3ZlIGFsbCB2YXJpYWJsZXMgZXhjZXB0IGNvdmFyaWF0ZXMsIElEIGFuZCByZXNwb25zZQ0KUFNJRC5wb21wIDwtIHN1YnNldChQU0lEWyxjKCJUb3RhbEluY29tZSIsICJFbXBsb3ltZW50U3RhdHVzIiwgIk93bk9yUmVudCIsICJSYWNlIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQWdlIiwgIlllYXJzQ29tcGxldGVkRWR1Y2F0aW9uIiwgImlkIiwgInRpbWUiLCAiSW50ZXJ2aWV3TnVtIiwgIlNlcXVlbmNlTnVtIildKQ0KDQpQU0lEJFJhY2UgPC0gaWZlbHNlKFBTSUQkV2lmZVJhY2UxID09IDEgJiBQU0lEJEhlYWRSYWNlMSA9PSAxLCAxLA0KICAgICAgICAgICAgICAgICAgICBpZmVsc2UoUFNJRCRXaWZlUmFjZTEgPT0gMSAmIFBTSUQkSGVhZFJhY2UxID09IDAsIDEsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoUFNJRCRXaWZlUmFjZTEgPT0gMCAmIFBTSUQkSGVhZFJhY2UxID09IDEsIDEsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKFBTSUQkV2lmZVJhY2UxID09IDIgJiBQU0lEJFdpZmVSYWNlMSA9PSAyLCAyLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoUFNJRCRXaWZlUmFjZTEgPT0gMiAmIFBTSUQkSGVhZFJhY2UxID09IDAsIDIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoUFNJRCRXaWZlUmFjZTEgPT0gMCAmIFBTSUQkSGVhZFJhY2UxID09IDIsIDIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKFBTSUQkV2lmZVJhY2UxID09IDMgJiBQU0lEJEhlYWRSYWNlMSA9PSAzLCAzLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKFBTSUQkV2lmZVJhY2UxID09IDMgJiBQU0lEJEhlYWRSYWNlMSA9PSAwLCAzLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKFBTSUQkV2lmZVJhY2UxID09IDAgJiBQU0lEJEhlYWRSYWNlMSA9PSAzLCAzLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShQU0lEJFdpZmVSYWNlMSA9PSA0ICYgUFNJRCRIZWFkUmFjZTEgPT0gNCwgNCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKFBTSUQkV2lmZVJhY2UxID09IDQgJiBQU0lEJEhlYWRSYWNlMSA9PSAwLCA0LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKFBTSUQkV2lmZVJhY2UxID09IDAgJiBQU0lEJEhlYWRSYWNlMSA9PSA0LCA0LCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoUFNJRCRXaWZlUmFjZTEgPT0gNSAmIFBTSUQkSGVhZFJhY2UxID09IDUsIDUsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShQU0lEJFdpZmVSYWNlMSA9PSA1ICYgUFNJRCRIZWFkUmFjZTEgPT0gMCwgNSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShQU0lEJFdpZmVSYWNlMSA9PSAwICYgUFNJRCRIZWFkUmFjZTEgPT0gNSwgNSwgMCkpKSkpKSkpKSkpKSkpKQ0KDQoNCg0Kc3VtbWFyeShQU0lELnBvbXAkVG90YWxJbmNvbWUpDQoNCiNDb2xsYXBzZSBieSBpbnRlcnZpZXcgSUQsIHllYXIgYW5kIGluY29tZSBsZXZlbC4gU2luY2UgaW5jb21lIGxldmVsIGlzIHRoZSBzYW1lIGFjcm9zcyBhbGwgUidzIGluIGEgDQojaG91c2Vob2xkIEkgYW0gb25seSB1c2luZyB0aGUgdW5pcXVlIHZhbHVlLiBNYXJpdGFsIHN0YXR1cyBpcyBhbHNvIHRoZSBzYW1lLiANClBTSUQucG9tcCA8LSBhcy5kYXRhLnRhYmxlKFBTSUQucG9tcCkNClBTSUQucG9tcCA8LSBQU0lELnBvbXBbLCBJbnRlcnZpZXdQZXJzb25OdW0gOj0gcGFzdGUoSW50ZXJ2aWV3TnVtLFNlcXVlbmNlTnVtLHNlcCA9ICIuIildDQpQU0lELnBvbXAgPC0gUFNJRC5wb21wWywgU2VxdWVuY2VOdW0gOj0gTlVMTF0NCg0KI1RvIG9ic2VydmUgbGF0ZW50IHN0YXRlcyB3aXRoaW4gdGhlIHBvb3IsIEkgd2lsbCBzdWJzZXQgdGhlIGRhdGEgdXNpbmcgb25seSBob3VzZWhvbGRzIHdpdGggaW5jb21lcyA8IG1lZGlhbg0KUFNJRC5wb21wIDwtIHN1YnNldChQU0lELnBvbXAsIFBTSUQucG9tcCRUb3RhbEluY29tZSA8IG1lZGlhbihQU0lELnBvbXAkVG90YWxJbmNvbWUsIG5hLnJtID0gVFJVRSkpDQpQU0lELnBvbXAgPC0gbmEub21pdChQU0lELnBvbXApDQoNCiNSZW1vdmUgZXZlcnlvbmUgd2l0aCBpbmNvbWUgbG9zcy4gDQpQU0lELnBvbXAgPC0gc3Vic2V0KFBTSUQucG9tcCwgUFNJRC5wb21wJFRvdGFsSW5jb21lID49IDApDQojQ29kZSBubyBpbmNvbWUgYXMgIDAuMSBpbnN0ZWFkIG9mIDAgZm9yIGNvbXB1dGF0aW9ucyBwdXJwb3Nlcw0KUFNJRC5wb21wJFRvdGFsSW5jb21lIDwtIGlmZWxzZShQU0lELnBvbXAkVG90YWxJbmNvbWUgPT0gMCwgMC4xLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKFBTSUQucG9tcCRUb3RhbEluY29tZSA8PSAwLCAwLjEsIFBTSUQucG9tcCRUb3RhbEluY29tZSkpDQpQU0lELnBvbXAkRW1wbG95bWVudFN0YXR1cyA8LSBpZmVsc2UoUFNJRC5wb21wJEVtcGxveW1lbnRTdGF0dXMgPT0gMSwgMSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKFBTSUQucG9tcCRFbXBsb3ltZW50U3RhdHVzID09IDIgfCBQU0lELnBvbXAkRW1wbG95bWVudFN0YXR1cyA9PSAzIHwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQU0lELnBvbXAkRW1wbG95bWVudFN0YXR1cyA9PSA2LCAyLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoUFNJRC5wb21wJEVtcGxveW1lbnRTdGF0dXMgPT0gNCwgMywgMCkpKQ0KDQpQU0lELnBvbXAkUmFjZTIgPC0gaWZlbHNlKFBTSUQucG9tcCRSYWNlID09IDEsIDEsIDApICMxIGlzIHdoaXRlLCBub24gd2hpdGUgDQoNCiNDaGVja2luZyBmb3IgZGRpc3RyaWJ1dGlvbg0KbG9nbm9ybWFsIDwtIGZpdGRpc3RyKFBTSUQucG9tcCRUb3RhbEluY29tZSwgImxvZ25vcm1hbCIpDQpnYW1tYSA8LSBmaXRkaXN0cihQU0lELnBvbXAkVG90YWxJbmNvbWUsICJnYW1tYSIpDQpnYXVzc2lhbiA8LSBmaXRkaXN0cihQU0lELnBvbXAkVG90YWxJbmNvbWUsICJub3JtYWwiKQ0Kd2VpYnVsbCA8IGZpdGRpc3RyKFBTSUQucG9tcCRUb3RhbEluY29tZSwgIndlaWJ1bGwiKQ0KIyBjb21wYXJlIEFJQ3MNCkFJQyhsb2dub3JtYWwpDQpBSUMoZ2F1c3NpYW4pDQojTm9ybWFsIGRpc3RyaWJ1dGlvbiBmaXRzIHRoZSBtb2RlbCBiZXR0ZXIuIFdlaWJ1bGwgb3B0aW1pemF0aW9uIGZhaWxlZCwgDQojZ2FtbWEgYWxnb3JpdGhtIGhpdCBhIG5vbi1maW5pdGUgZmluaXRlLWRpZmZlcmVuY2UgdmFsdWUNCiNDQ0YNCmxpYnJhcnkoem9vKQ0KbGlicmFyeSh4dHMpDQpQU0lELnBvbXAkdGltZSA8LSBhcy5EYXRlKGFzLnllYXJtb24oUFNJRC5wb21wJHRpbWUpKQ0KUFNJRC5wb21wJHRpbWUgPC0gYXMuRGF0ZShQU0lELnBvbXAkdGltZSwgIiV5JW0lZCIpDQpwc2lkLnRzIDwtIHh0cyhQU0lELnBvbXAsIG9yZGVyLmJ5PWFzLkRhdGUoUFNJRC5wb21wJHRpbWUpKQ0KaW5jIDwtIHh0cyhQU0lELnBvbXAkVG90YWxJbmNvbWUsIG9yZGVyLmJ5PWFzLkRhdGUoUFNJRC5wb21wJHRpbWUpKQ0KaW5jIDwtIGFzLnZlY3RvcihpbmMpDQpwbG90KGluYykNCg0KZWR1YyA8LSB4dHMoUFNJRC5wb21wJFllYXJzQ29tcGxldGVkRWR1Y2F0aW9uLCBvcmRlci5ieT1hcy5EYXRlKFBTSUQucG9tcCR0aW1lKSkNCmVkdWMgPC0gYXMudmVjdG9yKGVkdWMpDQpjY2YoZWR1YywgaW5jKQ0KDQpyYWNlIDwtIHh0cyhQU0lELnBvbXAkUmFjZTIsIG9yZGVyLmJ5PWFzLkRhdGUoUFNJRC5wb21wJHRpbWUpKQ0KcmFjZSA8LSBhcy52ZWN0b3IocmFjZSkNCmNjZihyYWNlLCBpbmMpDQoNCmFnZSA8LSB4dHMoUFNJRC5wb21wJEFnZSwgb3JkZXIuYnk9YXMuRGF0ZShQU0lELnBvbXAkdGltZSkpDQphZ2UgPC0gYXMudmVjdG9yKGFnZSkNCmNjZihhZ2UsIGluYykNCmBgYA0KDQpNYXJrb3YgbW9kZWxsaW5nIHByZXNlbnRzIGFuIGFuYWx5dGljYWwgZnJhbWV3b3JrIGZvciBtb2RlbGluZyBzdGF0ZSBzd2l0Y2hpbmcgcHJvY2Vzc2VzIG9jY3VyaW5nIHdpdGggYW4gaW5kaXZpZHVhbCBvciB3aXRoaW4gYSBmYW1pbHkgdW5pdCB1c2luZyBwYW5lbCBzdHVkeSBsb25naXR1ZGluYWwgZGF0YS4gSW5jb21lIG1vYmlsaXR5IGFuZCBwb3ZlcnR5IHN3aXRjaGluZyBkeW5hbWljcyBwYXJ0aWN1bGFybHkgaGF2ZSBnZW5lcmF0ZWQgc29tZSBpbnRlcmVzdCBpbiB0aGUgZWNvbm9taWNzL3NvY2lhbCBwb2xpY3kgZmllbGQuIFNpbWlsYXIgdG8gdGhlIGFuYWx5c2lzIG9mIENvc3RhIGFuZCBBbmdlbGlzLCBpbiB0aGlzIHBhcGVyLCBJIGFtIHRyeWluZyB0byBtb2RlbCB0aGUgc3dpdGNoaW5nIHN0YXRlcyBvZiBwb3ZlcnR5LiBUaGV5IHBvc3R1bGF0ZSB0aGF0IHRoZXJlIGFyZSB0d28gdW5kZXJseWluZyBwb3ZlcnR5IHN0YXRlczsgKnRyYW5zaXRpb25hcnkqIGFuZCAqcGVybWVuZW50Ki4gSSBhaW0gdG8gZGlzY292ZXIgdGhlc2Ugc3RhdGVzIHVzaW5nIHRoZSBkYXRhIGZyb20gdGhlIFBhbmVsIFN0dWR5IG9mIEluY29tZSBEeW5hbWljcyBydW4gYnkgdGhlIEluc3RpdHV0ZSBvZiBTb2NpYWwgUmVzZWFyY2ggYXQgdGhlIFVuaXZlcnNpdHkgb2YgTWljaGlnYW4uIA0KDQojIyNUaGUgRGF0YQ0KVGhlIHBhbmVsIHN0dWR5IG9mIGluY29tZSBkeW5hbWljcyAoUFNJRCkgaXMgYSBsb25nIHJ1bm5pbmcgbG9uZ2l0dWRpbmFsIGhvdXNlaG9sZCBzdXJ2ZXkgd2hpY2ggYmVnYW4gaW4gMTk2OC4gSXQgc3R1ZGllcyBhIG5hdGlvbmFsbHkgcmVwcmVzZW50YXRpdmUgc2FtcGxlIG9mIG92ZXIgMTgwMDAgaW5kaXZpZHVhbHMgbGl2aW5nIGluIDUwMDAgZmFtaWxpZXMgaW4gdGhlIFVuaXRlZCBTdGF0ZXMuIFRoZSBkZXNpZ24gb2YgdGhlIHN1cnZleSwgaW50ZXJ2aWV3aW5nIGJvdGggaW5kaXZpZHVhbHMgYW5kIGZhbWlseSB1bml0cyBvdmVyIHRpbWUsIHByZXNlbnRzIGFuIGludGVyZXN0aW5nIG9wcG9ydHVuaXR5IHRvIHN0dWR5IHBvdmVydHkgdHJhbnNpdGlvbiBieSBmYW1pbHkgdW5pdC4gVGhlIHBvdmVydHkgcHJveHkgdXNlZCBpbiB0aGlzIGFuYWx5c2lzIHRha2VzIHRoZSBtZWRpYW4gb2YgdGhlIFRvdGFsIEluY29tZSB2YXJpYWJsZSAtIHNpbWlsYXIgdG8gdGhlIHByb2Nlc3MgdXNlZCBieSBDb3N0YSBhbmQgQW5nZWxpcyAtIGFuZCBrZWVwcyBvbmx5IHRob3NlIGluZGl2aWFscyBiZWxvdyB0aGUgbWVkaWFuIGxldmVsLiBJIGFsc28gdXNlIHNvY2lvLWVjb25vbWljIGluZGljYXRvcnMgZnJvbSB0aGUgZGF0YSBhcyB0cmFuc2l0aW9uIGNvdmFyaWF0ZXMgaW4gdGhlIEhNTSBtb2RlbC4gU3BlY2lmaWNhbGx5LCB0aGUgKmFnZSosICplbXBsb3ltZW50IHN0YXR1cyosICp5ZWFycyBvZiBlZHVjYXRpb24gY29tcGxldGVkKiBhbmQgKnJhY2UqIHZhcmlhYmxlcy4gQ29zdGEgYW5kIEFuZ2VsaXMgdXNlIHRoZSBzYW1lIGNvdmFyaWF0ZXMgd2l0aCB0aGUgaW5jbHVzaW9uIG9mICpob3VzaW5nIGh0YXR1cyosICpnZW5kZXIqIGFuZCAqZ2VvZ3JhcGhpY2FsIGFyZWEqLiBHZW5kZXIgd2FzIG5vdCBpbmNsdWRlZCBpbiB0aGUgSE1NIG1vZGVsIGluIHRoaXMgYW5hbHlzaXMgYXMgdGhpcyBpcyBhbiBpbmRpdmlkdWFsIGxldmVsIHZhcmlhYmxlIHRoYXQgZG9lcyBub3QgYXBwbHkgdG8gdGhlIGZhbWlseSBhcyBhIHVuaXQgb2Ygb2JzZXJ2YXRpb24uIEJlbG93IGlzIGEgYnJlYWsgZG93biBvZiB0aGUgc3BlY2lmaWMgdmFyaWFibGVzIHVzZWQsIHRyYW5zZm9ybWF0aW9ucyB0byB0aGUgdmFyaWFibGVzLCBhcyB3ZWxsIGFzIHllYXIgb2Ygd2F2ZXMuIA0KWWVhcnM6IEZvciB0aGlzIGFuYWx5c2lzIEkgaGF2ZSB1c2VkIDYgd2F2ZXMgb2YgdGhlIHN0dWR5LCAyMDA1LCAyMDA3LCAyMDA5LCAyMDExLCAyMDEzIGFuZCAyMDE1LiBBZnRlciBleGNsdWRpbmcgZmFtaWxpZXMgb3ZlciB0aGUgbWVkaWFuIGxldmVsIG9mIGluY29tZSwgYW5kIGRyb3BwaW5nIG9ic2VydmF0aW9ucyB3aXRoIG5vbi1yZXNwb25zZXMgaW4gYW55IG9mIHRoZSBjb3ZhcmlhdGVzLCB0aGUgbnVtYmVyIG9mIG9ic2VydmF0aW9ucyBpbiBlYWNoIHdhdmUgYXJlIGFzIGZvbGxvd3MuICANCg0KfCBZZWFyIG9mIHN0dWR5ICAgICAgIHwgMjAwNSAgfCAyMDA3ICB8IDIwMDkgIHwgMjAxMSAgfCAyMDEzICB8IDIwMTUgIHwNCnwtLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLXwtLS0tLS0tfC0tLS0tLS18LS0tLS0tLXwtLS0tLS0tfC0tLS0tLS18DQp8IE5vLiBvZiBvYnNlcnZhdGlvbnMgfCAxNzAzMyB8IDE1NzY3IHwgMTQzMjQgfCAxNDE4NSB8IDEyODU3IHwgMTEwNzggfCAgDQoNClRoZXNlIG51bWJlcnMgd2VyZSBpbmNsZGVkIGluIHRoZSBtb2RlbCB0byBhY2NvdW50IGZvciB0aGUgY3ljbGVzIG9mIHRoZSBsb25naXR1ZGluYWwgZGF0YXNldC4gDQoNCioqQWdlOioqIFRoaXMgaXMgYSBjb250aW51b3VzIHZhcmlhYmxlIGZyb20gdGhlIGRhdGFzZXQgcmFuZ2luZyBmcm9tIDMgLSA0MC4gU2luY2UgdGhlIGluY29tZSBsZXZlbCByZXBvcnRlZCAoc2VlIGluY29tZSkgaXMgYnkgZmFtaWx5IGxldmVsIGFuZCBub3QgaW5kaXZpZHVhbCwgYWxsIHRoZSBhZ2Ugb2JzZXJ2YXRpb25zIHdlcmUgcHJlc2VydmVkLiBPYnNlcnZhdGlvbnMgd2l0aCA5OTkgaW5kaWNhdGluZyBhIHJlZnVzYWwgdG8gYW5zd2VyIHRoZSBxdWVzdGlvbiB3ZXJlIGNvZGVkIGFzIG1pc3NpbmcgYW5kIGV4Y2x1ZGVkIGZvcm0gdGhlIG1vZGVsLiAgIA0KDQoqKkVtcGxveW1lbnQgU3RhdHVzOioqIFRoaXMgdmFyaWFibGUgd2FzIGRlcml2ZWQgdXNpbmcgdGhlICdFbXBsb3ltZW50IFN0YXR1cycgc2VxdWVuY2Ugb2YgcXVlc3Rpb25zLiBUaGUgZGF0YSBpcyBjb2RlZCBhcyAqRW1wbG95ZWQqIGlmIGEgcmVzcG9uZGVkIGFuc3dlcmVkIGAxIC0gV29ya2luZyBOb3dgLCAqVW5lbXBsb3llZCogaWYgdGhlIHJlc3BvbmRlbnQgYW5zd2VyZWQgYDIgLSBUZW1wb3JhcmlseSBsYWlkIG9mZmAsIGAzIC0gTG9va2luZyBmb3Igd29yaywgdW5lbXBsb3llZGAsIGA2IC0gSG91c2V3aWZlYCwgY29kZWQgUmV0aXJlZCBpZiB0aGUgcmVzcG9uZGVudCBhbnN3ZXJlZCBgNCAtIFJldGlyZWRgIGFuZCBhbmQgY29kZWQgKk90aGVyKiBmb3IgZXZlcnl0aGluZyBlbHNlLiAgDQoNCioqWWVhcnMgb2YgRWR1Y2F0aW9uIENvbXBsZXRlZDoqKiBUaGlzIGlzIGFub3RoZXIgY29udGludW91cyB2YXJpYWJsZSB3aXRoIHllYXJzIG9mIGVkdWNhdGlvbiBjb21wbGV0ZWQgaW4gbGlmZXRpbWUgb2YgcmVzcG9uZGVudC4gVGhlIHJhbmdlIG9mIHRoaXMgdmFyaWFibGUgaXMgMCAtIDEyIHdpdGggOTkgZm9yIHJlc3BvbmRlbnRzIHdobyByZWZ1c2VkIHRvIHJlcGx5LiBBbGwgb2JzZXJ2dGlvbnMgd2l0aCBhIHJlc3BvbnNlIG9mIDk5IHdlcmUgY29kZWQgYXMgbWlzc2luZyBhbmQgZHJvcHBlZCBmcm9tIHRoZSBhbmFseXNpcy4gDQoNCioqUmFjZToqKiBUaGlzIHZhcmlhYmxlIHdhcyBkZXJpdmVkIGFzIHRoZSBjb21iaW5hdGlvbiBvZiB0d28gcmVzcG9uc2UgdmFyaWFibGVzIGZyb20gdGhlIGRhdGEuIFRoZSByYWNlIG9mIHRoZSBoZWFkIG9mIGhvdXNlaG9sZCBhbmQgdGhlIHJhY2Ugb2Ygc3BvdXNlLiBJZiB0aGUgaGVhZCBhbmQgc3BvdXNlIGhhdmUgdGhlIHNhbWUgcmFjZSwgdGhlIGZhbWlseSB1bml0IGlzIGNvZGVkIGFzIHRoYXQgcmFjZS4gSWYgdGhlIGhlYWQgb2YgaG91c2Vob2xkIGFuZCBzcG91c2UgYXJlIG9mIGRpZmZlcmVudCByYWNlcywgdGhlICpSYWNlKiB2YXJpYWJsZSB3YXMgY29kZWQgYXMgb3RoZXIuIER1ZSB0byB0aGUgZGlmZmVyZW50IGNvbWJpbmF0aW9ucyBvZiByYWNlcywgbW9yZSB0aGFuIDEwLCBhc3NpZ25pbmcgZHVtbXkgdmFyaWFibGVzIHRvIGFsbCB0aGUgbWl4ZWQgcmFjZSBmYW1pbGllcyB3YXMgbm90IGZlYXNpYmxlLiBBbGwgdGhlIG1ham9yIHJhY2UgY2F0ZWdvcmllcyB3ZXJlIHByZXNlcnZlZC4gDQoNCioqVG90YWwgSW5jb21lOioqIFRvdGFsIGhvdXNlaG9sZCBpbmNvbWUgaW4gZG9sbGFycyByZXBvcnRlZCBieSByZXNwb25kZW50cy4gVGhpcyBpbmNvbWUgbGV2ZWwgaXMgdGhlIHNhbWUgZm9yIGFsbCBpbmRpdmlkdWFscyBpbiB0aGUgaG91c2Vob2xkLiAgDQoNCmBgYHtyIGV2YWwgPSBUUlVFLCBlY2hvID0gRkFMU0V9DQpkIDwtIGRlbnNpdHkoUFNJRC5wb21wJFRvdGFsSW5jb21lKQ0KICBwbG90KGQsIHR5cGU9Im4iLCBtYWluID0gIkRlbnNpdHkgUGxvdCBUb3RhbCBJbmNvbWUiKQ0KICBwb2x5Z29uKGQsIGNvbD0iZ3JleSIsIGJvcmRlcj0iZ3JheSIpDQoNCnBsbyA8LSBnZ3Bsb3QoUFNJRGRhdCwgYWVzKFRvdGFsSW5jb21lKSkgKyBnZW9tX2hpc3RvZ3JhbShiaW5zID0gMzApDQpwbG8gKyBmYWNldF9ncmlkKHRpbWUgfi4gKSArIGdndGl0bGUoIlJlcG9ydGVkIGluY29tZSBsZXZlbHMgYnkgeWVhciIpDQpgYGANCg0KDQpNb2RlbCANCkZvciB0aGlzIGFuYWx5c2lzLCBJIHVzZWQgYSBoaWRkZW4gbWFya292IG1vZGVsIHdoaWNoIGlzIGRlZmluZWQgYnkgdGhlIGZvbGxvd2luZzogJCRcYmVnaW57YXJyYXl9e2x9IGZfe1hfezB9fSh4XzBccGFyYW1zXHRoZXRhKSwgXCBmX3tYX3tufXxYX3tuLTF9fSh4X3tufVxnaXZlbiB4X3tuLTF9XHBhcmFtc1x0aGV0YSksIFwgZl97WV97bn18WF9ufSh5X3tufVxnaXZlbiB4X25ccGFyYW1zXHRoZXRhKSwgXGVuZHthcnJheX0kJCBmb3IgJG49MTpOJA0KSGVyZSBJIGFzc3VtZSB0aGF0IGZhbWlseSBoYXMgYSBsYXRlbnQgcmF0ZSAkWF9pKHQpJCBvZiB0cmFuc2l0aW9uZyBvdXQgb3IgYmFjayBpbnRvIHBvdmVydHkgc3RhdGVzLiBFYWNoIGRhdGEgcG9pbnQgJHlfe2lqfSQgaXMgdGhlIHRvdGFsIGluY29tZSBsZXZlbCBmb3IgYSBmYW1pbHkgYmV0d2VlbiB0aW1lICR0X3tqLTF9JCBhbmQgJHRfaiQsIHdoZXJlICRpPTEsXGRvdHMsODUyNDQkIGFuZCAkaj0xLFxkb3RzLDYkLiBUaGUgdW5vYnNlcnZlZCBwb3ZlcnR5IHByb2Nlc3MgICRce1hfaSh0KVx9JCBpcyBjb25uZWN0ZWQgdG8gdGhlIGRhdGEgdGhyb3VnaCBjaGFuZ2UgaW4gaW5jb21lIGZvciBlYWNoIGZhbWlseSB1bml0ICRpJCBpbiBudW1iZXIgb2YgcmVwb3J0aW5nIGN5Y2xlcyAkaiQsIHdoaWNoIGNhbiBiZSB3cml0dGVuIGFzICQkQ197aWp9PSBcaW50X3t0X3tqLTF9fV57dF9qfSBYX2kodClcLCBkdCwkJC4gWzJdICANCkEgc3RvY2hhc3RpYyBtaXh0dXJlIG1vZGVsIGZvciBnYXVzc2lhbiBkaXN0cmlidXRlZCBkYXRhIHdhcyB1c2VkIHRvIG1vZGVsICR5X3tpan0kIGFzIGEgZ2F1c3NpYW4gcmFuZG9tIHZhcmlhYmxlIHdpdGggbWVhbiAkXG11JCBhbmQgdmFyaWFuY2UgJFxzaWdtYV4yJC4gVGhpcyBtb2RlbCB3YXMgY2hvc2VuIGFmdGVyIGV4YW1pbmluZyB0aGUgdml6dWFsbHkgZGVuc2l0eSBvZiB0aGUgcmVzcG9uc2UgdmFyaWFibGUgYW5kIHRlc3RpbmcgdGhlIGZpdCBvZiBkaWZmZXJlbnQgZGlzdHJpYnV0aW9ucyB0byB0aGUgZGF0YSBhbmQgY29tcGFyaW5nIEFJQy4gVGhlIGRpc3RyaWJ1dGlvbnMgdGVzdGVkIHdlcmUgKipsb2dub3JtYWwqKiwgKipub3JtYWwqKiwgKip3ZWlidWxsKiogYW5kICoqZ2FtbWEqKi4gT25seSB0aGUgKipsb2dub3JtYWwqKiBhbmQgKipnYXVzc2lhbioqIGRpc3RyaWJ1dGlvbnMgY291bGQgYmUgZml0dGVkIHRvIHRoZSBkYXRhLCBhbmQgTGlrZSB0aGUgcGxvdCBzdWdnZXN0cywgdGhlIGRhdGEgaXMgYmVzdCBmaXQgYnkgYSBub3JtYWwvZ2F1c3NpYW4gbW9kZWwgYXMgaXQgaGFkIHRoZSBsb3dlciBBSUMgb2YgYDE5MDQ1NzNgIGNvbXBhcmVkIHRvIGAyMDMyOTkyYCB3aXRoIHRoZSBsb2dub3JtYWwuIFRoZSBNaXh0dXJlIEhpZGRlbiBNYXJrb3YgTW9kZWwoTUhNTSkgd2FzIHNlbGVjdGVkIGZvciB0aGlzIGFuYWx5c2lzIHZzIHRoZSBQYXJ0aWFsbHkgT2JzZXJ2ZWQgTWFya292IE1vZGVsIChQT01QKSBiZWNhdXNlIGl0IGFsbG93cyBmb3IgYSBjb250aW51b3VzIGdhdXNzaWFuIGRpc3RyaWJ1dGVkIHJlc3BvbnNlIHZhcmlhYmxlIHdoaWNoIGEgUE9NUCBkb2VzIG5vdC4NClRoZSBwb3NzaWJpbGl0eSBvZiBhIGdlbmVyYWwgZGVwZW5kZW5jZSBvbiAkbiQgaW5jbHVkZXMgdGhlIHBvc3NpYmlsaXR5IHRoYXQgdGhlcmUgaXMgc29tZSBjb3ZhcmlhdGUgdGltZSBzZXJpZXMgJHpfezA6Tn0kIHN1Y2ggdGhhdCAkJFxiZWdpbnthcnJheX17bGNsfSBmX3tYX3swfX0oeF8wXHBhcmFtc1x0aGV0YSkmPSYgZl97WF97MH19KHhfMFxwYXJhbXNcdGhldGEsel8wKSBcIGZfe1hfe259fFhfe24tMX19KHhfe259XGdpdmVuIHhfe24tMX1ccGFyYW1zXHRoZXRhKSAmPSYgZl97WF97bn18WF97bi0xfX0oeF97bn1cZ2l2ZW4geF97bi0xfVxwYXJhbXNcdGhldGEsel9uKSwgXCBmX3tZX3tufXxYX259KHlfe259XGdpdmVuIHhfblxwYXJhbXNcdGhldGEpICY9JiBmX3tZX3tufXxYX259KHlfe259XGdpdmVuIHhfblxwYXJhbXNcdGhldGEsel9uKSwgXGVuZHthcnJheX0kJCBmb3IgJG49MTpOJCAgDQpUbyBkZXJpdmUgYSBtdWx0aWRpbWVuc2lvbmFsIGNvbmNlcHQgb2YgcG92ZXJ0eSwgdGhlIGNvdmFyaWF0ZXMgKiphZ2UqKiwgKip5ZWFycyBvZiBlZHVjYXRpb24qKiwgKiplbXBsb3ltZW50IHN0YXR1cyoqIGFuZCAqKnJhY2UqKiB3ZXJlIGluY2x1ZGVkIGluIHRoZSBtb2RlbCBhcyBJIGh5cG90aGVzaXplZCB0aGVzZSBzb2NpLWVjb25vbWljIGZhY3RvcnMgdG8gaGF2ZSBhbiBlZmZlY3Qgb24gdGhlIHRyYW5zaXRpb24gb2YgcG92ZXJ0eSBzdGF0ZXMuIFRvIHRlc3QgdGhpcyBoeXBvdGhlc2lzLCBJIHJhbiBhIGdsbSByZWdyZXNzaW9uIG9uIHRoZSByZXNwb25zZSB2YXJpYWJsZSAqKnRvdGFsIGluY29tZSoqIHVzaW5nIHRoZSBjb3ZhcmlhdGVzIGFzIGluZGVwZW5kZW50IHZhcmlhYmxlcyAoc2VlIGFuYWx5c2lzIHNlY3Rpb24pLiBUaGUgcmVncmVzc2lvbiBQYXJhbWV0ZXIgZXN0aW1hdGlvbiBmb3IgdGhlIE1ITU0gbW9kZWwgd2FzIGFjaGlldmVkIGJ5IG1lYW5zIG9mIGEgdmFyaWFudCBvZiB0aGUgRU0gcHJvY2VkdXJlLCBmb3J3YXJkLWJhY2t3YXJkIG9yIEJhdW0tV2VsY2ggYWxnb3JpdGhtLiANCg0KDQpBbmFseXNpcw0KRmlyc3QsIGFmdGVyIHVzaW5nIGEgZ2xtIHJlZ3Jlc3Npb24gdG8gdGhlIGh5cG90aGVzaXMgb2YgYSByZWxhdGlvbnNoaXAgYmV0d2VlbiB0b3RhbCBpbmNvbWUgbGV2ZWxzIGFuZCB0aGUgZm91ciBpbmRlcGVuZGVudCB2YXJpYWJsZXMsIEkgZm91bmQgYWdlLCBhcyB3ZWxsIGFzIGVtcGxveW1lbnQgc3RhdHVzIHRvIGJlIHN0YXRpc3RpY2FsbHkgc2lnbmlmaWNhbnQuIFRoZSBkaWZmZXJlbmNlIGluY29tZSBsZXZlbHMgYmV0d2VlbiB3aGl0ZSBob3VzZWhvbGRzIGNvbXBhcmVkIHRvIGJsYWNrIGFuZCBhbWVyaWNhbiBpbmRpYW4gaG91c2Vob2xkcyB3YXMgYWxzbyBzdGF0aXN0aWNhbGx5IHNpZ25pZmljYW50LiBOb3RlIHRoYXQgdGhlc2UgaG91c2Vob2xkcyBhcmUgaG91c2Vob2xkcyBiZWxvdyB0aGUgbWVkaWFuIGluY29tZSBsZXZlbHMgb3ZlcmFsbC4gWWVhcnMgY29tcGxldGVkIGVkdWNhdGlvbiBpcyBub3Qgc2lnbmlmaWNhbnQgYnV0IHRoZSBtb2RlbCBpbmNsdWRpbmcgaXQgYXMgYSB0cmFuc2l0aW9uIGNvdmFyaWF0ZSBwZXJmb3JtZWQgYmV0dGVyIGluIHRlcm1zIG9mIGxvZyBsaWtlbGlob29kLCBBSUMgYW5kIEJJQyB2YWx1ZXMgKFRhYmxlIDEpLg0KDQpgYGB7ciBldmFsPVRSVUUsIGVjaG8gPSBGQUxTRX0NCiMjU2V0dGluZyB1cCBQU0lELmRhdCBmb3IgbW9kZWxzDQpQU0lEZGF0IDwtIFBTSUQucG9tcA0KUFNJRGRhdCRFbXBsb3ltZW50U3RhdHVzIDwtIGZhY3RvcihQU0lEZGF0JEVtcGxveW1lbnRTdGF0dXMsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygwLDEsMiwzKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIk90aGVyIiwgIkVtcGxveWVkIiwgIlVuZW1wbG95ZWQiLCAiUmV0aXJlZCIpKQ0KUFNJRGRhdCRSYWNlIDwtIGZhY3RvcihQU0lEZGF0JFJhY2UsDQogICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoMCwgMSwgMiwgMywgNCwgNSksDQogICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIk90aGVyIiwgIldoaXRlIiwgIkJsYWNrL0FmcmljYW4tQW1lcmljYW4iLCAiQW1lcmljYW4gSW5kaWFuIiwgIkFzaWFuIiwgIk5hdGl2ZSBIYXdhaWlhbi9Jc2xhbmRlciIpKQ0KUFNJRGRhdCRPd25PclJlbnQgPC0gZmFjdG9yKFBTSURkYXQkT3duT3JSZW50LA0KICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoMSwgNSwgOCwgOSksDQogICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiT3ducyBIb21lIiwgIlJlbnRzIiwgIk5laXRoZXIiLCAiT3RoZXIiKSkNClBTSURkYXQkQWdlIDwtIGlmZWxzZShQU0lEZGF0JEFnZSA9PSA5OTksIE5BLCBQU0lEZGF0JEFnZSkNClBTSURkYXQkWWVhcnNDb21wbGV0ZWRFZHVjYXRpb24gPC0gaWZlbHNlKFBTSURkYXQkWWVhcnNDb21wbGV0ZWRFZHVjYXRpb24gPT0gOTksIE5BLCBQU0lEZGF0JFllYXJzQ29tcGxldGVkRWR1Y2F0aW9uKQ0KUFNJRGRhdCA8LSBuYS5vbWl0KFBTSURkYXQpDQpQU0lEZGF0JHRpbWUgPC0gc3Vic3RyaW5nKFBTSURkYXQkdGltZSwxLCA0KQ0KUFNJRGRhdCR0aW1lIDwtIGFzLm51bWVyaWMoUFNJRGRhdCR0aW1lKQ0KDQojI1JlZ3Jlc3Npb24gbW9kZWwNClBTSURkYXQgPC0gd2l0aGluKFBTSURkYXQsIFJhY2UgPC0gcmVsZXZlbChSYWNlLCByZWY9MikpDQpteS5tb2QgPC0gZ2xtKGxvZyhUb3RhbEluY29tZSkgfiBBZ2UgKyBhcy5mYWN0b3IoRW1wbG95bWVudFN0YXR1cykgKyBhcy5mYWN0b3IoUmFjZSkgKyBZZWFyc0NvbXBsZXRlZEVkdWNhdGlvbiwgZGF0YSA9IFBTSURkYXQpDQoNCnN1bW1hcnkobXkubW9kKQ0KYGBgDQpJIGFsc28gZXhhbWluZWQgdGhlIGF1dG9jb3JyZWxhdGlvbiBiZXR3ZWVuIHRoZSB0d28gY29udGludW91cyBjb3ZhcmlhdGVzIGFuZCBpbmNvbWUgbGV2ZWxzIHVzaW5nIGEgQ0NGICBwbG90IG9mIGVhY2ggYW5kIGZvdW5kIGV2aWRlbmNlIGZvciBhdXRvY29ycmVsYXRpb24gYXQgZGlmZmVyZW50IGxhZyBwZXJpb2RzLiAgDQoNCmBgYHtyIGV2YWw9VFJVRSwgZWNobz1GQUxTRX0NClBTSUQucG9tcCR0aW1lIDwtIGFzLkRhdGUoYXMueWVhcm1vbihQU0lELnBvbXAkdGltZSkpDQpQU0lELnBvbXAkdGltZSA8LSBhcy5EYXRlKFBTSUQucG9tcCR0aW1lLCAiJXklbSVkIikNCg0KaW5jIDwtIHh0cyhQU0lELnBvbXAkVG90YWxJbmNvbWUsIG9yZGVyLmJ5PWFzLkRhdGUoUFNJRC5wb21wJHRpbWUpKQ0KaW5jIDwtIGFzLnZlY3RvcihpbmMpDQoNCmVkdWMgPC0geHRzKFBTSUQucG9tcCRZZWFyc0NvbXBsZXRlZEVkdWNhdGlvbiwgb3JkZXIuYnk9YXMuRGF0ZShQU0lELnBvbXAkdGltZSkpDQplZHVjIDwtIGFzLnZlY3RvcihlZHVjKQ0KY2NmKGVkdWMsIGluYykNCg0KYWdlIDwtIHh0cyhQU0lELnBvbXAkQWdlLCBvcmRlci5ieT1hcy5EYXRlKFBTSUQucG9tcCR0aW1lKSkNCmFnZSA8LSBhcy52ZWN0b3IoYWdlKQ0KY2NmKGFnZSwgaW5jKQ0KYGBgDQpUaGUgbmV4dCBzdGVwIGlzIHRvIGRldGVybWluZyBpZiB0aGUgbnVtYmVyIG9mIHRyYW5zaXRpb25hcnkgc3RhdGVzOyAyLCBoeXBvdGhlc2l6ZWQgYnkgQ29zdGEgYW5kIEFuZ2VsaXMgaXMgdGhlIG9wdGltYWwgbnVtYmVyIG9mIGhpZGRlbi9sYXRlbnQgc3RhdGVzIHByZXNlbnQgaW4gbXkgZGF0YS4gQWZ0ZXIgcnVubmluZyB0aGUgbW9kZWwgd2l0aCBudW1iZXIgb2Ygc3RhdGVzIGZyb20gMi01LCBhcyB3ZWxsIGFzIHdpdGggYWxsIHRoZSB0cmFuc2l0aW9uIGNvdmFyaWF0ZXMsIHRyYW5zaXRpb24gY292YXJpYXRlcyBleGNlcHQgKip5ZWFycyBvZiBlZHVjYXRpb24gY29tcGxldGVkKiogYW5kIG5vbmUgb2YgdGhlIGNvdmFyaWF0ZXMsIHdlIGNhbiBleGFtaW5lIHRoZSBsaWtlbGlob29kLCBBSUMgYW5kIEJJQyB2YWx1ZXMgdG8gY29tcGFyZSBwZXJmb3JtYW5jZSAoc2VlIHRhYmxlIDEpLiBJIGFsc28gcmFuIGEgbXVsdGl2YXJpYXRlIHJlc3BvbnNlIGhpZGRlbiBtYXJrb3YgbW9kZWwgd2l0aCAqKnRvdGFsIGluY29tZSoqIGFzIHdlbGwgYXMgKiplbXBsb3ltZW50IHN0YXR1cyoqLCBpbmRpY2F0aW5nIGluIHRoZSBtb2RlbCB0aGF0IHRoaXMgaXMgYSBtdWx0aW5vbWlhbCB2YXJpYWJsZS4gV2UgY2FuIHNlZSB0aGF0IHRoZSBtb2RlbCB3aXRoIHRoZSBiZXN0IHBlcmZvcm1hY2UgaW4gdGVybXMgb2YgbG9nIGxpa2VsaWhvb2QsIEFJQyBhbmQgQklDIGlzIHRoZSAyIGhpZGRlbiBzdGF0ZSBtb2RlbCwgd2l0aCAxIHJlc3BvbnNlIGFuZCB0cmFuc2l0aW9uIGNvdmFyaWF0ZXMgKiphZ2UqKiBhbmQgKipyYWNlKiouIA0KYGBge3IgZXZhbCA9IEZBTFNFLCBlY2hvID0gRkFMU0V9DQojI01vZGVscw0Kc2V0LnNlZWQoMTIzNCkNCnRyc3QgPC0gYygwLjksIDAuMSwgMCwgMCwgMC4xLCAwLjksIDAsIDApDQpwc2lkLmdobW0gPC0gZGVwbWl4KFRvdGFsSW5jb21lIH4gMSwgDQogICAgICAgICAgICAgICAgICAgZGF0YSA9IFBTSURkYXQsIG5zdGF0ZXMgPSAyLCBpbnN0YXJ0ID0gcnVuaWYoMiksIA0KICAgICAgICAgICAgICAgICAgIG50aW1lcyA9IGMoMTcwMzMsIDE1NzY3LCAxNDMyNCwgMTQxODUsIDEyODU3LCAxMTA3OCksDQogICAgICAgICAgICAgICAgICAgZmFtaWx5ID0gZ2F1c3NpYW4oKSwNCiAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uID0gfiBSYWNlICsgQWdlICsgWWVhcnNDb21wbGV0ZWRFZHVjYXRpb24pDQoNCmZtIDwtIGZpdChwc2lkLmdobW0sIHZlcmJvc2UgPSBGQUxTRSwgZW1jPWVtLmNvbnRyb2wobWF4aXQgPSA1MDApKQ0Kc3VtbWFyeShmbSwgd2hpY2ggPSAicmVzcG9uc2UiKQ0Kc3VtbWFyeShmbSwgd2hpY2ggPSAidHJhbnNpdGlvbiIpDQoNCg0KI0NoZWNrIG90aGVyIGhpZGRlbiBzdGF0ZSB2YWx1ZXMNCiAgZm14IDwtIGZpdChkZXBtaXgoVG90YWxJbmNvbWUgfiAxLCANCiAgICAgICAgICAgICAgICAgICBkYXRhID0gUFNJRGRhdCwgbnN0YXRlcyA9IDMsIGluc3RhcnQgPSBydW5pZigzKSwgDQogICAgICAgICAgICAgICAgICAgbnRpbWVzID0gYygxNzAzMywgMTU3NjcsIDE0MzI0LCAxNDE4NSwgMTI4NTcsIDExMDc4KSwNCiAgICAgICAgICAgICAgICAgICBmYW1pbHkgPSBnYXVzc2lhbigpLA0KICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb24gPSB+IFJhY2UgKyBBZ2UgKyBZZWFyc0NvbXBsZXRlZEVkdWNhdGlvbiksIHZlcmJvc2UgPSBGQUxTRSwgDQogICAgICAgICAgZW1jPWVtLmNvbnRyb2wobWF4aXQgPSA1MDApKQ0KICANCiAgZm14eCA8LSBmaXQoZGVwbWl4KFRvdGFsSW5jb21lIH4gMSwgDQogICAgICAgICAgICAgICAgICAgIGRhdGEgPSBQU0lEZGF0LCBuc3RhdGVzID0gNCwgaW5zdGFydCA9IHJ1bmlmKDQpLCANCiAgICAgICAgICAgICAgICAgICAgbnRpbWVzID0gYygxNzAzMywgMTU3NjcsIDE0MzI0LCAxNDE4NSwgMTI4NTcsIDExMDc4KSwNCiAgICAgICAgICAgICAgICAgICAgZmFtaWx5ID0gZ2F1c3NpYW4oKSwNCiAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvbiA9IH4gUmFjZSArIEFnZSArIFllYXJzQ29tcGxldGVkRWR1Y2F0aW9uKSwgDQogICAgICAgICAgICAgIA0KICAgICAgICAgICAgICB2ZXJib3NlID0gRkFMU0UsIA0KICAgICAgICAgICAgIGVtYz1lbS5jb250cm9sKG1heGl0ID0gNTAwKSkNCiAgDQoNCiAgZiA8LSBmaXQoZGVwbWl4KGxpc3QoVG90YWxJbmNvbWUgfiAxLCBFbXBsb3ltZW50U3RhdHVzIH4gMSksDQogICAgICAgICAgICAgICAgICAgICBkYXRhID0gUFNJRGRhdCwgbnN0YXRlcyA9IDIsIGluc3RhcnQgPSBydW5pZigyKSwgDQogICAgICAgICAgICAgICAgICAgICBudGltZXMgPSBjKDE3MDMzLCAxNTc2NywgMTQzMjQsIDE0MTg1LCAxMjg1NywgMTEwNzgpLA0KICAgICAgICAgICAgICAgICAgICAgZmFtaWx5ID0gbGlzdChnYXVzc2lhbigpLCBtdWx0aW5vbWlhbCgiaWRlbnRpdHkiKSkpLCANCiAgICAgICAgICAgIHZlcmJvc2UgPSBGQUxTRSwgDQogICAgICAgICAgICBlbWM9ZW0uY29udHJvbChtYXhpdCA9IDUwMCkpDQogIA0KICBmZiA8LSBmaXQoZGVwbWl4KFRvdGFsSW5jb21lIH4gMSwgDQogICAgICAgICAgICAgICAgICAgZGF0YSA9IFBTSURkYXQsIG5zdGF0ZXMgPSAyLCBpbnN0YXJ0ID0gcnVuaWYoMiksIA0KICAgICAgICAgICAgICAgICAgIG50aW1lcyA9IGMoMTcwMzMsIDE1NzY3LCAxNDMyNCwgMTQxODUsIDEyODU3LCAxMTA3OCksDQogICAgICAgICAgICAgICAgICAgZmFtaWx5ID0gZ2F1c3NpYW4oKSwNCiAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uID0gfiBSYWNlICsgQWdlICsgWWVhcnNDb21wbGV0ZWRFZHVjYXRpb24gKyBFbXBsb3ltZW50U3RhdHVzKSwgDQogICAgICAgICAgIHZlcmJvc2UgPSBGQUxTRSwgDQogICAgICAgICAgICBlbWM9ZW0uY29udHJvbChtYXhpdCA9IDUwMCkpDQogIA0KICANCiAgZnIgPC0gZml0KGRlcG1peChUb3RhbEluY29tZSB+IDEsDQogICAgICAgICAgICAgICAgICAgZGF0YSA9IFBTSURkYXQsIG5zdGF0ZXMgPSAzLCBpbnN0YXJ0ID0gcnVuaWYoMyksIA0KICAgICAgICAgICAgICAgICAgIG50aW1lcyA9IGMoMTcwMzMsIDE1NzY3LCAxNDMyNCwgMTQxODUsIDEyODU3LCAxMTA3OCksDQogICAgICAgICAgICAgICAgICAgZmFtaWx5ID0gZ2F1c3NpYW4oKSksIA0KICAgICAgICAgICAgdmVyYm9zZSA9IEZBTFNFLCANCiAgICAgICAgICAgIGVtYz1lbS5jb250cm9sKG1heGl0ID0gNTAwKSkNCiAgDQogIGZlIDwtIGRlcG1peChUb3RhbEluY29tZSB+IDEsIA0KICAgICAgICAgICAgICAgZGF0YSA9IFBTSURkYXQsIG5zdGF0ZXMgPSAyLCBpbnN0YXJ0ID0gcnVuaWYoMiksIA0KICAgICAgICAgICAgICAgbnRpbWVzID0gYygxNzAzMywgMTU3NjcsIDE0MzI0LCAxNDE4NSwgMTI4NTcsIDExMDc4KSwNCiAgICAgICAgICAgICAgIGZhbWlseSA9IGdhdXNzaWFuKCksDQogICAgICAgICAgICAgICB0cmFuc2l0aW9uID0gfiBSYWNlICsgQWdlKQ0KICANCiAgZmUuZml0IDwtIGZpdChmZSwgdmVyYm9zZSA9IEZBTFNFLCBlbWM9ZW0uY29udHJvbChtYXhpdCA9IDUwMCkpDQogIA0KICBmZWUgPC0gZml0KGRlcG1peChUb3RhbEluY29tZSB+IDEsIA0KICAgICAgICAgICAgICAgICAgIGRhdGEgPSBQU0lEZGF0LCBuc3RhdGVzID0gMywgaW5zdGFydCA9IHJ1bmlmKDMpLCANCiAgICAgICAgICAgICAgICAgICBudGltZXMgPSBjKDE3MDMzLCAxNTc2NywgMTQzMjQsIDE0MTg1LCAxMjg1NywgMTEwNzgpLA0KICAgICAgICAgICAgICAgICAgIGZhbWlseSA9IGdhdXNzaWFuKCksDQogICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvbiA9IH4gUmFjZSArIEFnZSksIA0KICAgICAgICAgICAgdmVyYm9zZSA9IEZBTFNFLCANCiAgICAgICAgICAgIGVtYz1lbS5jb250cm9sKG1heGl0ID0gNTAwKSkNCg0KDQoNCg0KcG9zdCA8LSBwb3N0ZXJpb3IoZm0pDQpyZXN1bHRzIDwtIGNiaW5kKFBTSURkYXQsIHBvc3RbLDFdKQ0Kc2V0bmFtZXMocmVzdWx0cywgIlYyIiwgInN0YXRlIikNCnJlc3VsdHMkc3RhdGUgPC0gZmFjdG9yKHJlc3VsdHMkc3RhdGUsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygxLDIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiU3RhdGUgMSIsICJTdGF0ZSAyIikpDQoNCnJlczIgPC0gcmVzdWx0cw0KcmVzMiRzdGF0ZSA8LSBmYWN0b3IocmVzMiRzdGF0ZSwgDQogICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKDEsMiksDQogICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJTdGF0ZSAxIiwgIlN0YXRlIDIiKSkNCg0KDQoNCmBgYA0KDQoNCmBgYHtyIGV2YWw9VFJVRSwgZWNobz1GQUxTRX0NCg0KYyA8LSBkYXRhLmZyYW1lKFN0YXRlcyA9IGMoMiwzLDQsMiwyLDMsMiwzKSwgDQogICAgICAgICAgICAgICAgYExvZyBMaWtgID0gYygtOTIyODY1LjMsIC05MzQ4OTQsIC05MzQ4OTQsIC0xMDI4OTg0LCAtOTM0ODk0LCAtOTM0ODk0LCAtOTM0ODk0LCAtOTM0ODk0KSwgDQogICAgICAgICAgICAgICAgQUlDID0gYygxODQ1NzczLCAxODY5OTAwLCAxODcwMDAyLCAyMDU3OTk0LCAxODY5ODQyLCAxODY5ODE2LCAxODY5ODI2LCAxODY5ODg4KSwgDQogICAgICAgICAgICAgICAgQklDID0gYygxODQ1OTY5LCAxODcwNDI0LCAxODcxMDAzLCAyMDU4MTE1LCAxODcwMDk1LCAxODY5OTQ3LCAxODcwMDA0LCAxODcwMzU2KSwgDQogICAgICAgICAgICAgICAgZGYgPSBjKDIxLCA1NiwgMTA3LCAxMywgMjcsIDE0LCAxOSwgNTApLCANCiAgICAgICAgICAgICAgICBSZXNwb25zZSA9IGMoIlRvdGFsIEluY29tZSIsICJUb3RhbCBJbmNvbWUiLCAiVG90YWwgSW5jb21lIiwgIlRvdGFsIEluY29tZSBhbmQgRW1wbG95bWVudCBTdGF0dXMiLCAiVG90YWwgSW5jb21lIiwgIlRvdGFsIEluY29tZSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUb3RhbCBJbmNvbWUiLCAiVG90YWwgSW5jb21lIiksDQogICAgICAgICAgICAgICAgQ292YXJpYXRlcyA9IGMoIlJhY2UsIEFnZSwgWWVhcnMgb2YgRWR1Y2F0aW9uIiwiUmFjZSwgQWdlLCBZZWFycyBvZiBFZHVjYXRpb24iLCAiUmFjZSwgQWdlLCBZZWFycyBvZiBFZHVjYXRpb24iLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5vbmUiLCAgIlJhY2UsIEFnZSwgWWVhcnMgb2YgRWR1Y2F0aW9uLCBZZWFycyBvZiBFbXBsb3ltZW50IiwgIk5vbmUiLCAiUmFjZSBhbmQgQWdlIiwgIlJhY2UgYW5kIEFnZSIpKQ0KDQoNCmthYmxlKGMsICJodG1sIiwgY2FwdGlvbiA9ICJUYWJsZSAxIikgJT4lDQogIGthYmxlX3N0eWxpbmcoYm9vdHN0cmFwX29wdGlvbnMgPSBjKCJzdHJpcGVkIiwgImhvdmVyIiksIGZ1bGxfd2lkdGggPSBGLCBwb3NpdGlvbiA9ICJmbG9hdF9sZWZ0IikgJT4lDQogIHJvd19zcGVjKDEsIGJvbGQgPSBUKSAlPiUNCiAgcm93X3NwZWMoMTo4LCBjb2xvciA9ICJibGFjayIpDQpgYGANCg0KDQojI1Jlc3VsdHMgYW5kIERpc2N1c3Npb24NCkJlY2F1c2UgdGhlIGFsZ29yaXRobSBhbGxvd3MgY292YXJpYXRlcyBvbiB0aGUgdHJhbnNpdGlvbiBwcm9iYWJpbGl0aWVzLCB0aGUgZGVmYXVsdCBiYXNlbGluZSBjYXRlZ29yeSBpcyB0aGUgZmlyc3Qgc3RhdGUuIFRoZSBwcm9iYWJpbGl0eSBvZiBiZWluZyBpbiB0aGUgZmlyc3Qgc3RhdGUgaXMgdGhlIHNlY29uZCBzdGF0ZSB2YWx1ZSBpbiB0aGUgZmlyc3QgY29tcG9uZW50LCBhbmQgdGhlIHByb2JhYmlsaXR5IG9mIGJlaW5nIGluIHRoZSBzZWNvbmQgc3RhdGUgaXMgdGhlIHNlY29uZCBzdGF0ZSB2YWx1ZSBpbiB0aGUgc2Vjb25kIHN0YXRlIGNvbXBvbmVudC4gV2UgY2FuIGFsc28gc2VlIHRoZSBwcm9iYWJpbGl0eSBvZiBiZWluZyBpbiBlYWNoIHN0YXRlIHdpdGhpbmcgZWFjaCBzdGF0ZSBjb21wb25lbnQgd2hlbiB0aGUgY292YXJpYXRlcyBhcmUgc2V0IGF0IDAuIChTZWUgdGFibGUgYmVsb3cpDQoNCmBgYHtyIGV2YWw9VFJVRSwgZWNobz1GQUxTRX0NCmZtLm1vZCA8LSBkYXRhLmZyYW1lKENvdmFyaWF0ZXMgPSBjKCIoSW50ZXJjZXB0KSIsICJSYWNlV2hpdGUiLCAiUmFjZUJsYWNrL0FmcmljYW4tQW1lcmljYW4iLCAiUmFjZUFtZXJpY2FuIEluZGlhbiAiLCAiUmFjZUFzaWFuIiwgIlJhY2VOYXRpdmUgSGF3YWlpYW4vSXNsYW5kZXIiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBZ2UiLCAiWWVhcnNDb21wbGV0ZWRFZHVjYXRpb24iLCAiUHJvYmFsaXRpZXMgYXQgemVybyB2YWx1ZXMgb2YgdGhlIGNvdmFyaWF0ZXMiKSwNCiAgICAgICAgICAgICAgICAgICAgIGBTdGF0ZSAxLjFgID0gYygwLDAsMCwwLDAsMCwwLDAsMC44NDQ5MTUzKSwgDQogICAgICAgICAgICAgICAgICAgICBgU3RhdGUgMS4yYCA9IGMoLTEuNjk1MjY1MjE3LCAwLjM0NTI3OTEyOCwgLTAuMDE2MjA2NTU4LCAwLjQyODM0Mjk0MSwgLTAuMzMxNjQ3ODgwLCAwLjA5NTUyNzY5NywgMC4wMDk0NTEwNDMsIDAuMDA1NzY3MjQ4LCAwLjE1NTA4NDcpLA0KICAgICAgICAgICAgICAgICAgICAgYFN0YXRlIDIuMWAgPSBjKDAsMCwwLDAsMCwwLDAsMCwgMC4xNjA1NzkpLA0KICAgICAgICAgICAgICAgICAgICAgYFN0YXRlIDIuMmAgPSBjKDEuNjUzOTI2MjU2LCAtMC4xNjE2Mjg5MjksIC0wLjgwNjEzMzMzOSwgLTAuNjU4NzQyNDk5LDAuMzk5ODcwMTU4LCAtMC40ODgyMDY1NDcsIC0wLjAwNjUwMTAyNCwgLTAuMDA0OTQ2ODA5LCAwLjgzOTQyMSkpDQoNCg0Ka2FibGUoZm0ubW9kLCAiaHRtbCIsIGNhcHRpb24gPSAiVGFibGUgMiIpICU+JQ0KICBrYWJsZV9zdHlsaW5nKGJvb3RzdHJhcF9vcHRpb25zID0gYygic3RyaXBlZCIsICJob3ZlciIpLCBmdWxsX3dpZHRoID0gRikgJT4lDQogIHJvd19zcGVjKDE6OSwgY29sb3IgPSAiYmxhY2siKSAlPiUNCiAgYWRkX2hlYWRlcl9hYm92ZShjKCIgIiA9IDEsICJTdGF0ZSBDb21wb25lbnQgMSIgPSAyLCAiU3RhdGUgQ29tcG9uZW50IDIiID0gMikpDQpgYGANCg0KDQoNClRvIGFuYWx5emUgdGhlIHN0YXRlIGZvciBlYWNoIGluZGl2aWR1YWwgaW4gYSBob3VzZWhvbGQsIGFuZCBjb21wYXJlIGl0IHRvIHRoZSBjb3ZhcmlhdGVzLCB3ZSB1c2UgdGhlIHBvc3RlcmlvciB2aXRlcmJpIGFsZ29yaXRobSB0byBmaW5kIHRoZSBtb3N0IGxpa2VseSBzdGF0ZSBzZXF1ZW5jZS4gV2Ugdml6dWFsaXplIHRoZSBtb3N0IHByb2JhYmxlIHN0YXRlIGZvciBlYWNoIGhvdXNlaG9sZCBhbmQgYW5hbHl6ZSB0aGUgcmVzdWx0LiBMb29raW5nIGF0IHRoZSByZXN1bHRzLCB0aGVyZSBhcmUgY2xlYXIgaW5kaWNhdGlvbnMgdGhhdCBzdGF0ZSAxIGlzIHRoZSBwZXJtYW5lbnQgcG92ZXJ0eSBzdGF0ZSwgYW5kIHN0YXRlIDIgaXMgdGhlIHRyYW5zaXRpb25hcnkgcG92ZXJ0eSBzdGF0ZS4gV2UgY2FuIHNlZSBzb21lIGludGVyZXN0aW5nIHJlc3VsdHMgbG9va2luZyBhdCBjaGFydHMgMSBhbmQgMi4gSXQgc2VlbXMgbGlrZSB3aGl0ZSBhbmQgbWl4ZWQgaG91c2Vob2xkcyBvbiBhdmVyYWdlLCBhcmUgbGVzcyBsaWtlbHkgdG8gYmUgaW4gdGhlIHBlcm1hbmVudCBwb3ZlcnR5IHN0YXRlIHRoYW4gYmxhY2sgaG91c2Vob2xkcy4gSXQgYWxzbyBzZWVtcyAoY2hhcnQgMiksIHRoYXQgaG91c2Vob2xkcyB3aGVyZSB0aGUgaGVhZCBvZiBob3VzZSBhbmQgc3BvdXNlIGFyZSBlbXBsb3llZCBhcmUgbW9yZSBsaWtlbHkgdG8gYmUgaW4gdGhlIHRyYW5zdGlvbmFyeSBwb3ZlcnR5IHN0YXRlIHRoYW4gaG91c2Vob2xkcyB3aXRoIHVuZW1wbG95ZWQgaW5kaXZpZHVhbHMuIExvb2tpbmcgYWxzbyBhdCBpbmNvbWUgbGV2ZWxzIGJ5IHN0YXRlLCB3ZSBjYW4gc2VlIHRoYXQgaG91c2Vob2xkcyB3aXRoIGhpZ2hlciBpbmNvbWUgbGV2ZWxzIGFyZSBvdmVyd2hlbG1lbmx5IG1vcmUgbGlrZWx5IHRvIGJlIGluIHRoZSB0cmFuc2l0aW9uYXJ5IHBvdmVydHkgc3RhdGUgdGhhbiB0aG9zZSB3aXRoIGxvd2VyIGluY29tZSBsZXZlbHMuIEZvciB0aGUgYWdlIGNvdmFyaWF0ZSwgb24gYXZlcmFnZSwgeW91bmdlciBpbmRpdmlkdWFscyBhcmUgbW9yZSBsaWtlbHkgdG8gYmUgaW4gYSBwZXJtYW5lbnQgcG92ZXJ0eSBzdGF0ZSxidXQgdGhlIGRpZmZlcmVuY2UgaXMgdHJpdmlhbC4gDQoNCg0KYGBge3IgZXZhbD1UUlVFLCBlY2hvPUZBTFNFLCBmaWcuaGVpZ2h0PTEwLCBmaWcud2lkdGg9MTB9DQogIyNSQUNFDQpyYWNlMSA8LSBnZ3Bsb3Qoc3Vic2V0KHJlc3VsdHMsIHN0YXRlID09IDEpLCBhZXMoeCA9ICIiLCBmaWxsID0gZmFjdG9yKFJhY2UpKSkgKyANCiAgZ2VvbV9iYXIod2lkdGggPSAxKSArDQogIHRoZW1lKGF4aXMubGluZSA9IGVsZW1lbnRfYmxhbmsoKSwgDQogICAgICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3Q9MC41KSkgKyANCiAgbGFicyhmaWxsPSJSYWNlIiwgDQogICAgICAgeD1OVUxMLCANCiAgICAgICB5PU5VTEwsIA0KICAgICAgIHRpdGxlPSJTdGF0ZSAxIC0gUGVybWFuZW50IFBvdmVydHkiKQ0KDQpyYWNlMSA8LSByYWNlMSArIGNvb3JkX3BvbGFyKHRoZXRhID0gInkiLCBzdGFydD0wKQ0KDQoNCnJhY2UyIDwtIGdncGxvdChzdWJzZXQocmVzdWx0cywgc3RhdGUgPT0gMiksIGFlcyh4ID0gIiIsIGZpbGwgPSBmYWN0b3IoUmFjZSkpKSArIA0KICBnZW9tX2Jhcih3aWR0aCA9IDEpICsNCiAgdGhlbWUoYXhpcy5saW5lID0gZWxlbWVudF9ibGFuaygpLCANCiAgICAgICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdD0wLjUpKSArIA0KICBsYWJzKGZpbGw9IlJhY2UiLCANCiAgICAgICB4PU5VTEwsIA0KICAgICAgIHk9TlVMTCwgDQogICAgICAgdGl0bGU9IlN0YXRlIDIgLSBUcmFuc2l0aW9uYXJ5IFBvdmVydHkiLCANCiAgICAgICBjYXB0aW9uPSJDaGFydCAxIC0gUmFjZSIpDQoNCnJhY2UyIDwtIHJhY2UyICsgY29vcmRfcG9sYXIodGhldGEgPSAieSIsIHN0YXJ0PTApDQpsaWJyYXJ5KGdyaWRFeHRyYSkNCmdyaWQuYXJyYW5nZShyYWNlMSwgcmFjZTIpDQoNCg0KIyNFTVBMT1lNRU5UDQplbXAxIDwtIGdncGxvdChzdWJzZXQocmVzdWx0cywgc3RhdGUgPT0gMSksIGFlcyh4ID0gIiIsIGZpbGwgPSBmYWN0b3IoRW1wbG95bWVudFN0YXR1cykpKSArIA0KICBnZW9tX2Jhcih3aWR0aCA9IDEpICsNCiAgdGhlbWUoYXhpcy5saW5lID0gZWxlbWVudF9ibGFuaygpLCANCiAgICAgICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdD0wLjUpKSArIA0KICBsYWJzKGZpbGw9IlJhY2UiLCANCiAgICAgICB4PU5VTEwsIA0KICAgICAgIHk9TlVMTCwgDQogICAgICAgdGl0bGU9IlN0YXRlIDEgLSBQZXJtYW5lbnQgUG92ZXJ0eSIpDQoNCmVtcDEgPC0gZW1wMSArIGNvb3JkX3BvbGFyKHRoZXRhID0gInkiLCBzdGFydD0wKQ0KDQoNCmVtcDIgPC0gZ2dwbG90KHN1YnNldChyZXN1bHRzLCBzdGF0ZSA9PSAyKSwgYWVzKHggPSAiIiwgZmlsbCA9IGZhY3RvcihFbXBsb3ltZW50U3RhdHVzKSkpICsgDQogIGdlb21fYmFyKHdpZHRoID0gMSkgKw0KICB0aGVtZShheGlzLmxpbmUgPSBlbGVtZW50X2JsYW5rKCksIA0KICAgICAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0PTAuNSkpICsgDQogIGxhYnMoZmlsbD0iUmFjZSIsIA0KICAgICAgIHg9TlVMTCwgDQogICAgICAgeT1OVUxMLCANCiAgICAgICB0aXRsZT0iU3RhdGUgMiAtIFRyYW5zaXRpb25hcnkgUG92ZXJ0eSIsIA0KICAgICAgIGNhcHRpb249IkNoYXJ0IDIgLSBSYWNlIikNCg0KZW1wMiA8LSBlbXAyICsgY29vcmRfcG9sYXIodGhldGEgPSAieSIsIHN0YXJ0PTApDQpncmlkLmFycmFuZ2UoZW1wMSwgZW1wMikNCg0KaW5jb21lLmxldiA8LSBnZ3Bsb3QocmVzMiwgYWVzKFRvdGFsSW5jb21lKSkgKyBzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlID0gIlNwZWN0cmFsIikNCiAgDQppbmNvbWUubGV2IDwtIGluY29tZS5sZXYgKyBnZW9tX2hpc3RvZ3JhbShhZXMoZmlsbCA9IHN0YXRlKSwNCiAgICAgICAgICAgICAgICAgICAgYmlucz01LCANCiAgICAgICAgICAgICAgICAgICAgY29sPSJibGFjayIsIA0KICAgICAgICAgICAgICAgICAgICBzaXplPS4xKSArICAgIyBjaGFuZ2UgbnVtYmVyIG9mIGJpbnMNCiAgICAgICAgICAgICAgICAgICAgbGFicyh0aXRsZT0iQ2hhcnQgMzogU3RhdGUgY2xhc3NpZmljYXRpb24gYnkgaW5jb21lIGxldmVscyIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VidGl0bGU9IlN0YXRlIDEgLSBQZXJtYW5lbnQgUG92ZXJ0eTsgU3RhdGUgMiAtIFRyYW5zaXRpb25hcnkgUG92ZXJ0eSIpIA0KICANCmluY29tZS5sZXYNCg0KIyNBR0UNCmFnZS5sZXYgPC0gZ2dwbG90KHJlczIsIGFlcyhBZ2UpKSArIHNjYWxlX2ZpbGxfYnJld2VyKHBhbGV0dGUgPSAiU3BlY3RyYWwiKQ0KDQphZ2UubGV2IDwtIGFnZS5sZXYgKyBnZW9tX2hpc3RvZ3JhbShhZXMoZmlsbCA9IHN0YXRlKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpbnM9NSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2w9ImJsYWNrIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplPS4xKSArICAgIyBjaGFuZ2UgbnVtYmVyIG9mIGJpbnMNCiAgbGFicyh0aXRsZT0iU3RhdGUgY2xhc3NpZmljYXRpb24gYnkgYWdlIGxldmVscyIsIA0KICAgICAgIHN1YnRpdGxlPSJTdGF0ZSAxIC0gVHJhbnNpdGlvbmFyeSBQb3ZlcnR5OyBTdGF0ZSAyIC0gUGVybWFuZW50IFBvdmVydHkiKQ0KDQphZ2UubGV2DQpgYGANCg0KIyNSZWZlcmVuY2VzDQpBIER5bmFtaWMgTGF0ZW50IE1vZGVsIGZvciBQb3ZlcnR5IE1lYXN1cmVtZW50OyBNaWNoZWxsZSBDb3N0YSBhbmQgTHVjYSBEZSBBbmdlbGlzICANClBhbmVsIFN0dWR5IG9mIEluY29tZSBEeW5hbWljcyAoUFNJRCkgVW5pdmVyc2l0eSBvZiBNaWNoaWdhbiAgDQpodHRwczovL3BkZnMuc2VtYW50aWNzY2hvbGFyLm9yZy8yMDdlLzgxY2Y3YjVjMjIxNzZhZTM5NzJkYTJlY2QwOWY2YjJjM2M2Ny5wZGYgIA0KaHR0cDovL3l1bnVzLmhhY2V0dGVwZS5lZHUudHIvfmlvemthbi9lY283NDIvaG1tLmh0bWwNCkxlY3R1cmUgTm90ZXM6IGh0dHBzOi8vaW9uaWRlcy5naXRodWIuaW8vNTMxdzE4LzEzL25vdGVzMTMuaHRtbCAgDQpEZXBtaXg0IENSQU4NCg0KDQoNCg==