Project Overview:
This exploratory
data analysis (EDA) focuses on a subset of 30 variables from the
National Health Interview Surveys (NHIS) collected from 2020 to 2023.
The analysis examines the correlation between 29 selected variables and
the variable MIEV_A, which indicates whether a participant has ever been
told they had a heart attack. Note:
the variables were renamed and converted to factors to simplify their
interpretation.
Data Source (as retrieved in
December 2024):
National Health Interview Surveys (NHIS)
2020, 2021, 2022, and 2023 (Sample Adult Interviews)
Data Documentation Link (as of December 2024):
https://www.cdc.gov/nchs/nhis/
Data
Structure:
'data.frame': 109842 obs. of 30 variables:
$ UrbanRuralClassification : Factor w/ 4 levels "L_Central_Metro",..: 3 4 4 4 4 4 3 3 3 1 ...
$ SurveyYear : Factor w/ 4 levels "2020","2021",..: 4 4 4 4 4 4 4 4 4 4 ...
$ HouseholdRegion : Factor w/ 4 levels "Northeast","Midwest",..: 3 3 3 3 3 3 3 3 3 3 ...
$ InterviewQuarter : Factor w/ 4 levels "Q1","Q2","Q3",..: 1 1 1 1 1 1 1 1 1 1 ...
$ InterviewMonth : Factor w/ 12 levels "January","February",..: 1 1 1 1 1 1 1 1 1 1 ...
$ SampleAdultSex : Factor w/ 2 levels "Male","Female": 1 1 1 2 2 2 2 1 2 1 ...
$ SampleAdultAge : int 67 73 48 42 50 46 36 44 80 61 ...
$ RaceEthnicity : Factor w/ 7 levels "Hispanic","White",..: 3 2 3 2 2 2 2 3 2 3 ...
$ EducationLevel : Factor w/ 11 levels "Never_Kindergarten",..: 2 9 6 10 8 9 9 11 9 2 ...
$ GeneralHealthStatus : Factor w/ 5 levels "Excellent","Very_Good",..: 5 3 1 1 2 2 1 2 3 3 ...
$ HypertensionHistory : Factor w/ 2 levels "Yes","No": 1 1 2 2 2 2 2 2 1 2 ...
$ HighCholesterolHistory : Factor w/ 2 levels "Yes","No": 1 2 2 2 2 2 2 2 2 2 ...
$ CoronaryHeartDiseaseHistory: Factor w/ 2 levels "Yes","No": 2 1 2 2 2 2 2 2 2 2 ...
$ AnginaHistory : Factor w/ 2 levels "Yes","No": 2 2 2 2 2 2 2 2 2 2 ...
$ StrokeHistory : Factor w/ 2 levels "Yes","No": 1 2 2 2 2 2 2 2 2 2 ...
$ AsthmaHistory : Factor w/ 2 levels "Yes","No": 2 1 2 2 2 2 2 2 2 2 ...
$ CancerHistory : Factor w/ 2 levels "Yes","No": 2 2 2 2 2 2 2 2 1 2 ...
$ DiabetesHistory : Factor w/ 2 levels "Yes","No": 2 1 2 2 2 2 2 2 2 2 ...
$ ChrObsPulmDisHistory : Factor w/ 2 levels "Yes","No": 2 2 2 2 2 2 2 2 2 1 ...
$ ArthritisHistory : Factor w/ 2 levels "Yes","No": 1 2 2 2 2 1 2 2 1 1 ...
$ DementiaHistory : Factor w/ 2 levels "Yes","No": 2 2 2 2 2 2 2 2 2 2 ...
$ AnxietyDisorderHistory : Factor w/ 2 levels "Yes","No": 2 2 2 2 2 1 2 2 2 2 ...
$ DepressionHistory : Factor w/ 2 levels "Yes","No": 1 2 2 2 2 2 2 2 2 2 ...
$ BMICategory : Factor w/ 4 levels "Underweight",..: 3 3 4 3 2 3 2 4 4 3 ...
$ SmokelessTobaccoUsage : Factor w/ 2 levels "Yes","No": 1 2 2 2 2 2 2 2 2 2 ...
$ PipeTobaccoUsage : Factor w/ 2 levels "Yes","No": 2 2 2 2 2 1 2 2 2 2 ...
$ CigarUsage : Factor w/ 2 levels "Yes","No": 2 2 2 2 2 2 2 2 2 2 ...
$ ECigaretteUsageStatus : Factor w/ 3 levels "Current","Former",..: 3 3 3 3 3 3 3 3 3 2 ...
$ CigaretteSmokingStatus : Factor w/ 4 levels "Every_Day","Some_Days",..: 4 1 4 3 4 4 4 4 3 1 ...
$ HeartAttackHistory : Factor w/ 2 levels "Yes","No": 2 1 2 2 2 2 2 2 2 2 ...
Textual representation of the
variable ‘HeartAttackHistory’:
Levels attribute for the variable HeartAttackHistory:
Level Numeric_Value Frequency
[1,] "Yes" "1" "3960"
[2,] "No" "2" "105882"
Visual representation of the
variable ‘UrbanRuralClassification’:

Visual representation of the
variables ‘UrbanRuralClassification’ and
‘HouseholdRegion’ side-by-side:

Line graph of monthly participant
distribution by year using the variables ‘InterviewMonth’ and
‘SurveyYear’:

Line graph of the first
quarter by year using the variables ‘InterviewMonth’,
‘SurveyYear’, and
‘InterviewQuarter’:

Line graph of the second
quarter by year using the variables ‘InterviewMonth’,
‘SurveyYear’, and
‘InterviewQuarter’:

Line graph of the third
quarter by year using the variables ‘InterviewMonth’,
‘SurveyYear’, and
‘InterviewQuarter’:

Line graph of the last
quarter by year using the variables ‘InterviewMonth’,
‘SurveyYear’, and
‘InterviewQuarter’:

Side-by-side bar chart of
participant distribution by race/ethnicity and gender using the
variables ‘RaceEthnicity’ and
‘SampleAdultSex’:

Stacked area graph of education
levels across age groups using the variables ‘EducationLevel’
and ‘SampleAdultAge’:

Radial bar chart of the BMI
category and the general health status using the variables
‘BMICategory’ and
‘GeneralHealthStatus’:

Stacked bar chart of the 17
variables that contain 2 factors (Yes, No):

Side-by-side frequency
tables of the variables ‘ECigaretteUsageStatus’ and
‘CigaretteSmokingStatus’:

Table of P-Values - To be used for
determining the statistical relationship or association between the
target variable ‘HeartAttackHistory’ and other
variables:
Variable P-Values
[1,] "UrbanRuralClassification" "< 2.2e-16"
[2,] "SurveyYear" "= 0.8319"
[3,] "HouseholdRegion" "< 2.2e-16"
[4,] "InterviewQuarter" "= 0.1108"
[5,] "InterviewMonth" "= 0.173"
[6,] "SampleAdultSex" "< 2.2e-16"
[7,] "SampleAdultAge" "< 2e-16"
[8,] "RaceEthnicity" "< 2.2e-16"
[9,] "EducationLevel" "< 2.2e-16"
[10,] "GeneralHealthStatus" "< 2.2e-16"
[11,] "HypertensionHistory" "< 2.2e-16"
[12,] "HighCholesterolHistory" "< 2.2e-16"
[13,] "CoronaryHeartDiseaseHistory" "< 2.2e-16"
[14,] "AnginaHistory" "< 2.2e-16"
[15,] "StrokeHistory" "< 2.2e-16"
[16,] "AsthmaHistory" "= 0.0003294"
[17,] "CancerHistory" "< 2.2e-16"
[18,] "DiabetesHistory" "< 2.2e-16"
[19,] "ChrObsPulmDisHistory" "< 2.2e-16"
[20,] "ArthritisHistory" "< 2.2e-16"
[21,] "DementiaHistory" "< 2.2e-16"
[22,] "AnxietyDisorderHistory" "= 3.359e-10"
[23,] "DepressionHistory" "< 2.2e-16"
[24,] "BMICategory" "< 2.2e-16"
[25,] "SmokelessTobaccoUsage" "= 6.07e-12"
[26,] "PipeTobaccoUsage" "< 2.2e-16"
[27,] "CigarUsage" "< 2.2e-16"
[28,] "ECigaretteUsageStatus" "= 6.762e-10"
[29,] "CigaretteSmokingStatus" "< 2.2e-16"
LS0tCnRpdGxlOiAiRXhwbG9yYXRvcnkgRGF0YSBBbmFseXNpcyIKc3VidGl0bGU6ICJOYXRpb25hbCBIZWFsdGggSW50ZXJ2aWV3IFN1cnZleSAoTkhJUykiCmF1dGhvcjogIkNyZWF0ZWQgYnk6IEVsb3kgQWx2aW4gTHVuYSIKZGF0ZTogIkxhc3QgbW9kaWZpZWQgb246IDIvNi8yNSIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQo8IS0tIApOYW1lIG9mIHRoaXMgZmlsZTogbmhpcy1leHBsb3JhdG9yeS1kYXRhLWFuYWx5c2lzLlJtZAotLT4KPGJyPjxicj4KPHN0cm9uZz5Qcm9qZWN0IE92ZXJ2aWV3Ojwvc3Ryb25nPgo8YnI+ClRoaXMgZXhwbG9yYXRvcnkgZGF0YSBhbmFseXNpcyAoRURBKSBmb2N1c2VzIG9uIGEgc3Vic2V0IG9mIDMwIHZhcmlhYmxlcyBmcm9tIHRoZSBOYXRpb25hbCBIZWFsdGggSW50ZXJ2aWV3IFN1cnZleXMgKE5ISVMpIGNvbGxlY3RlZCBmcm9tIDIwMjAgdG8gMjAyMy4gVGhlIGFuYWx5c2lzIGV4YW1pbmVzIHRoZSBjb3JyZWxhdGlvbiBiZXR3ZWVuIDI5IHNlbGVjdGVkIHZhcmlhYmxlcyBhbmQgdGhlIHZhcmlhYmxlIE1JRVZfQSwgd2hpY2ggaW5kaWNhdGVzIHdoZXRoZXIgYSBwYXJ0aWNpcGFudCBoYXMgZXZlciBiZWVuIHRvbGQgdGhleSBoYWQgYSBoZWFydCBhdHRhY2suIDxmb250IGNvbG9yPSJyZWQiPjxzdHJvbmc+Tm90ZTogPC9zdHJvbmc+IHRoZSB2YXJpYWJsZXMgd2VyZSByZW5hbWVkIGFuZCBjb252ZXJ0ZWQgdG8gZmFjdG9ycyB0byBzaW1wbGlmeSB0aGVpciBpbnRlcnByZXRhdGlvbi48L2ZvbnQ+Cjxicj48YnI+CjxzdHJvbmc+RGF0YSBTb3VyY2UgKGFzIHJldHJpZXZlZCBpbiBEZWNlbWJlciAyMDI0KTo8L3N0cm9uZz4KPGJyPgpOYXRpb25hbCBIZWFsdGggSW50ZXJ2aWV3IFN1cnZleXMgKE5ISVMpIDIwMjAsIDIwMjEsIDIwMjIsIGFuZCAyMDIzIChTYW1wbGUgQWR1bHQgSW50ZXJ2aWV3cykKPGJyPjxicj4KPHN0cm9uZz5EYXRhIERvY3VtZW50YXRpb24gTGluayAoYXMgb2YgRGVjZW1iZXIgMjAyNCk6PC9zdHJvbmc+Cjxicj4KaHR0cHM6Ly93d3cuY2RjLmdvdi9uY2hzL25oaXMvCgo8IS0tClIgRGF0YSBTZXJpYWxpemF0aW9uICgucmRzKSBmb3JtYXQ6CgpTYXZlOiBzYXZlUkRTKG9iamVjdCwgZmlsZSA9ICJmaWxlLnJkcyIpCkxvYWQ6IHJlYWRSRFMoImZpbGUucmRzIikgKHJldHVybnMgdGhlIG9iamVjdCwgd2hpY2ggeW91IGNhbiBhc3NpZ24gdG8gYSB2YXJpYWJsZSkKLS0+CmBgYHtyIGVjaG8gPSBGQUxTRX0KY2xlYW5lZENhdGVnb3JpY2FsX2RmIDwtIHJlYWRSRFMoImNsZWFuZWRDYXRlZ29yaWNhbENvbWJpbmVkU3VydmV5cy5yZHMiKQpgYGAKCmBgYHtyIGVjaG8gPSBGQUxTRX0KbHZsc19pbmZvcm1hdGlvbiA8LSBmdW5jdGlvbihkZiwgY29sdW1uSW5kZXgpewogICAgCiAgbHZscyA8LSBsZXZlbHMoZGZbICwgY29sdW1uSW5kZXhdKQogIAogIG51bVZhbHVlcyA9IHNlcV9hbG9uZyhsZXZlbHMoZGZbICwgY29sdW1uSW5kZXhdKSkKICAKICB0YmwwMSA8LSB0YWJsZShkZlsgLCBjb2x1bW5JbmRleF0pCiAgCiAgZm9yIChpIGluIDE6bGVuZ3RoKGx2bHMpKXsKICAgIGlmKGx2bHNbW2ldXSA9PSBkaW1uYW1lcyh0YmwwMSlbWzFdXVtpXSl7CiAgICAgIGlmKGkgPT0gMSl7CiAgICAgICAgY291bnRzIDwtIHRibDAxW1tpXV0KICAgICAgfWVsc2UgewogICAgICAgIGNvdW50cyA8LSBjKGNvdW50cywgdGJsMDFbW2ldXSkKICAgICAgfSNlbmQgb2YgaW5uZXIgaWYtc3RhdGVtZW50CiAgICB9ZWxzZXsKICAgICAgaWYoaSA9PSAxKXsKICAgICAgICBjb3VudHMgPC0gMAogICAgICB9ZWxzZSB7CiAgICAgICAgY291bnRzIDwtIGMoY291bnRzLCAwKQogICAgICB9I2VuZCBvZiBpbm5lciBpZi1zdGF0ZW1lbnQKICAgIH0jZW5kIG9mIG91dGVyIGlmLXN0YXRlbWVudAogIH0jZW5kIG9mIGZvci1sb29wCiAgCiAgY2F0KCJMZXZlbHMgYXR0cmlidXRlIGZvciB0aGUgdmFyaWFibGUgIiwgY29sbmFtZXMoZGZbY29sdW1uSW5kZXhdKSwgIjoiLCAiXG5cbiIsIHNlcCA9ICIiKQogIAogIGx2bHNNYXRyaXggPC0gbWF0cml4KGRhdGEgPSBjKGx2bHMsIG51bVZhbHVlcywgY291bnRzKSwgbnJvdyA9IGxlbmd0aChsdmxzKSwgbmNvbCA9IDMpCiAgY29sbmFtZXMobHZsc01hdHJpeCkgPC0gYygiTGV2ZWwiLCAiTnVtZXJpY19WYWx1ZSIsICJGcmVxdWVuY3kiKQogIAogIGx2bHNNYXRyaXgKfQpgYGAKPGJyPjxicj48YnI+PGJyPgo8Zm9udCBjb2xvcj0ibmF2eSI+PHN0cm9uZz5EYXRhIFN0cnVjdHVyZTo8L3N0cm9uZz48L2ZvbnQ+CmBgYHtyIGVjaG8gPSBGQUxTRX0Kc3RyKGNsZWFuZWRDYXRlZ29yaWNhbF9kZikKYGBgCjxicj48YnI+Cjxmb250IGNvbG9yPSJuYXZ5Ij48c3Ryb25nPlRleHR1YWwgcmVwcmVzZW50YXRpb24gb2YgdGhlIHZhcmlhYmxlICc8ZW0+SGVhcnRBdHRhY2tIaXN0b3J5PC9lbT4nOjwvc3Ryb25nPjwvZm9udD4KYGBge3IgZWNobyA9IEZBTFNFfQpsdmxzX2luZm9ybWF0aW9uKGNsZWFuZWRDYXRlZ29yaWNhbF9kZiwgMzApCmBgYAoKYGBge3IgZWNobyA9IEZBTFNFfQpwZXJjX3RhYmxlIDwtIHByb3AudGFibGUodGFibGUoY2xlYW5lZENhdGVnb3JpY2FsX2RmJEhlYXJ0QXR0YWNrSGlzdG9yeSkpICogMTAwCmRmIDwtIGFzLmRhdGEuZnJhbWUocGVyY190YWJsZSkKY29sbmFtZXMoZGYpIDwtIGMoIkxldmVsIiwgIlBlcmNlbnRhZ2UiKQpkZgpgYGAKCgoKPGJyPjxicj4KPGZvbnQgY29sb3I9Im5hdnkiPjxzdHJvbmc+VmlzdWFsIHJlcHJlc2VudGF0aW9uIG9mIHRoZSB2YXJpYWJsZSAnPGVtPlVyYmFuUnVyYWxDbGFzc2lmaWNhdGlvbjwvZW0+Jzo8L3N0cm9uZz48L2ZvbnQ+CmBgYHtyIGVjaG8gPSBGQUxTRX0KIyBGcmVxdWVuY3kgdGFibGU6CnRibDAxIDwtIHRhYmxlKGNsZWFuZWRDYXRlZ29yaWNhbF9kZiRVcmJhblJ1cmFsQ2xhc3NpZmljYXRpb24pCgojIENhdGVnb3J5IG5hbWVzIChsYWJlbHMpOgpub21icmVzIDwtIGMoIkxDTSIsICJMRk0iLCAiTVNNIiwgIk5vbk0iKQoKIyBDYXRlZ29yeSBwZXJjZW50YWdlczoKcG9yY2VudGFqZSA8LSByb3VuZCh0YmwwMSAvIGxlbmd0aChjbGVhbmVkQ2F0ZWdvcmljYWxfZGYkVXJiYW5SdXJhbENsYXNzaWZpY2F0aW9uKSAqIDEwMCwgMikKIyBBZGRpbmcgdGhlIGZpcnN0IHBhcmVudGhlc2lzIHRvIHRoZSBsYWJlbHM6CmV0aXF1ZXRhcyA8LSBwYXN0ZSgiKCIsIG5vbWJyZXMsIHNlcCA9ICIiKQojIEFkZGluZyB0aGUgc2Vjb25kIHBhcmVudGhlc2lzIGFuZCB0aGUgcGVyY2VudGFnZXMgdG8gbGFiZWxzOgpldGlxdWV0YXMgPC0gcGFzdGUoZXRpcXVldGFzLCBwb3JjZW50YWplLCBzZXAgPSAiKSAiKQojIEFkZGluZyB0aGUgJSBzeW1ib2xzIHRvIGxhYmVscwpldGlxdWV0YXMgPC0gcGFzdGUoZXRpcXVldGFzLCIlIixzZXAgPSAiIikKCiMgU2F2ZSB0aGUgZGVmYXVsdCBwYXJhbWV0ZXJzIGJlZm9yZSBjaGFuZ2luZyB0aGVtCmRlZmF1bHRfcGFyIDwtIHBhcihuby5yZWFkb25seSA9IFRSVUUpCgojIFNldHRpbmcgdXAgdGhlIHNpZGUtYnktc2lkZSBncmFwaGljYWwgbGF5b3V0ICgyIGluIHRoaXMgY2FzZSk6CnBhcihtZnJvdyA9IGMoMSwgMiksIG1haSA9IGMoMSwgMSwgMC41LCAxKSkgICMgKG1mcm93ID0gMSByb3csIDIgY29sdW1ucyk7IChtYWkgaW4gaW5jaGVzID0gYm90dG9tLCBsZWZ0LCB0b3AsIHJpZ2h0KQoKIyBDcmVhdGluZyB0aGUgcGllIGNoYXJ0IHdpdGggdGhlIGxhYmVscyBhbmQgcGVyY2VudGFnZXMsIGFuZCB3aXRoIHNvbWUgc3BlY2lmaWMgY29sb3JzLgpwaWUodGJsMDEsIG1haW4gPSAiVXJiYW5SdXJhbENsYXNzaWZpY2F0aW9uXG4ocGVyY2VudGFnZSkiLCBsYWJlbHMgPSBldGlxdWV0YXMsIGNvbCA9IGMoInJlZCIsICJibHVlIiwgInBpbmsiLCAibGlnaHRibHVlMiIpKQoKIyBDcmVhdGlvbiBvZiB0aGUgYmFyIHBsb3Qgd2l0aCBjb2xvcnMgYW5kIGN1c3RvbWl6ZWQgYmFyIHdpZHRoOgpiYXJwbG90KHRibDAxLCBuYW1lcy5hcmcgPSBub21icmVzLCBtYWluID0gIlVyYmFuUnVyYWxDbGFzc2lmaWNhdGlvblxuKGZyZXF1ZW5jeSkiLCBjb2wgPSBjKCJyZWQiLCAiYmx1ZSIsICJwaW5rIiwgImxpZ2h0Ymx1ZTIiKSwgd2lkdGggPSBjKDEuNCwgMSwgMS43LCAwLjY1KSwgbGFzID0gMikKCiMgUmVzZXQgdGhlIGxheW91dCB0byB0aGUgZGVmYXVsdCBzZXR0aW5nczoKcGFyKGRlZmF1bHRfcGFyKQpgYGAKPGJyPjxicj4KPGZvbnQgY29sb3I9Im5hdnkiPjxzdHJvbmc+VmlzdWFsIHJlcHJlc2VudGF0aW9uIG9mIHRoZSB2YXJpYWJsZXMgJzxlbT5VcmJhblJ1cmFsQ2xhc3NpZmljYXRpb248L2VtPicgYW5kICc8ZW0+SG91c2Vob2xkUmVnaW9uPC9lbT4nIHNpZGUtYnktc2lkZTo8L3N0cm9uZz48L2ZvbnQ+CmBgYHtyIGVjaG8gPSBGQUxTRX0KIyBGcmVxdWVuY3kgdGFibGUgZm9yIFVyYmFuUnVyYWxDbGFzc2lmaWNhdGlvbjoKdGJsMDEgPC0gdGFibGUoY2xlYW5lZENhdGVnb3JpY2FsX2RmJFVyYmFuUnVyYWxDbGFzc2lmaWNhdGlvbikKIyBGcmVxdWVuY3kgdGFibGUgZm9yIEhvdXNlaG9sZFJlZ2lvbjoKdGJsMDIgPC0gdGFibGUoY2xlYW5lZENhdGVnb3JpY2FsX2RmJEhvdXNlaG9sZFJlZ2lvbikKCiMgQ2F0ZWdvcnkgbmFtZXMgKGxhYmVscykgZm9yIFVyYmFuUnVyYWxDbGFzc2lmaWNhdGlvbjoKbm9tYnJlczAxIDwtIGMoIkxDTSIsICJMRk0iLCAiTVNNIiwgIk5vbk0iKQojIENhdGVnb3J5IG5hbWVzIChsYWJlbHMpIGZvciBIb3VzZWhvbGRSZWdpb246Cm5vbWJyZXMwMiA8LSBjKCJOb3J0aGVhc3QiLCAiTWlkd2VzdCIsICJTb3V0aCIsICJXZXN0IikKCiMgQ2F0ZWdvcnkgcGVyY2VudGFnZXMgZm9yIFVyYmFuUnVyYWxDbGFzc2lmaWNhdGlvbjoKcG9yY2VudGFqZTAxIDwtIHJvdW5kKHRibDAxIC8gbGVuZ3RoKGNsZWFuZWRDYXRlZ29yaWNhbF9kZiRVcmJhblJ1cmFsQ2xhc3NpZmljYXRpb24pICogMTAwLCAyKQojIEFkZGluZyB0aGUgZmlyc3QgcGFyZW50aGVzaXMgdG8gdGhlIGxhYmVsczoKZXRpcXVldGFzMDEgPC0gcGFzdGUoIigiLCBub21icmVzMDEsIHNlcCA9ICIiKQojIEFkZGluZyB0aGUgc2Vjb25kIHBhcmVudGhlc2lzIGFuZCB0aGUgcGVyY2VudGFnZXMgdG8gbGFiZWxzOgpldGlxdWV0YXMwMSA8LSBwYXN0ZShldGlxdWV0YXMwMSwgcG9yY2VudGFqZTAxLCBzZXAgPSAiKSAiKQojIEFkZGluZyB0aGUgJSBzeW1ib2xzIHRvIGxhYmVscwpldGlxdWV0YXMwMSA8LSBwYXN0ZShldGlxdWV0YXMwMSwiJSIsc2VwID0gIiIpCgojIENhdGVnb3J5IHBlcmNlbnRhZ2VzIGZvciBIb3VzZWhvbGRSZWdpb246CnBvcmNlbnRhamUwMiA8LSByb3VuZCh0YmwwMiAvIGxlbmd0aChjbGVhbmVkQ2F0ZWdvcmljYWxfZGYkSG91c2Vob2xkUmVnaW9uKSAqIDEwMCwgMikKIyBBZGRpbmcgdGhlIGZpcnN0IHBhcmVudGhlc2lzIHRvIHRoZSBsYWJlbHM6CmV0aXF1ZXRhczAyIDwtIHBhc3RlKCIoIiwgbm9tYnJlczAyLCBzZXAgPSAiIikKIyBBZGRpbmcgdGhlIHNlY29uZCBwYXJlbnRoZXNpcyBhbmQgdGhlIHBlcmNlbnRhZ2VzIHRvIGxhYmVsczoKZXRpcXVldGFzMDIgPC0gcGFzdGUoZXRpcXVldGFzMDIsIHBvcmNlbnRhamUwMiwgc2VwID0gIikgIikKIyBBZGRpbmcgdGhlICUgc3ltYm9scyB0byBsYWJlbHMKZXRpcXVldGFzMDIgPC0gcGFzdGUoZXRpcXVldGFzMDIsIiUiLHNlcCA9ICIiKQoKCiMgU2F2ZSB0aGUgZGVmYXVsdCBwYXJhbWV0ZXJzIGJlZm9yZSBjaGFuZ2luZyB0aGVtCmRlZmF1bHRfcGFyIDwtIHBhcihuby5yZWFkb25seSA9IFRSVUUpCgojIFNldHRpbmcgdXAgdGhlIHNpZGUtYnktc2lkZSBncmFwaGljYWwgbGF5b3V0ICg0IGluIHRoaXMgY2FzZSk6CnBhcihtZnJvdyA9IGMoMiwgMiksIG1haSA9IGMoMC45LCAxLCAwLjUsIDEpKSAgIyAobWZyb3cgPSAxIHJvdywgMiBjb2x1bW5zKTsgKG1haSBpbiBpbmNoZXMgPSBib3R0b20sIGxlZnQsIHRvcCwgcmlnaHQpCgoKIyBDcmVhdGluZyB0aGUgcGllIGNoYXJ0IHdpdGggdGhlIGxhYmVscyBhbmQgcGVyY2VudGFnZXMsIGFuZCB3aXRoIHNvbWUgc3BlY2lmaWMgY29sb3JzLgpwaWUodGJsMDEsIG1haW4gPSAiVXJiYW5SdXJhbENsYXNzaWZpY2F0aW9uXG4ocGVyY2VudGFnZSkiLCBsYWJlbHMgPSBldGlxdWV0YXMwMSwgY29sID0gYygicmVkIiwgImJsdWUiLCAicGluayIsICJsaWdodGJsdWUyIikpCiMgQ3JlYXRpb24gb2YgdGhlIGJhciBwbG90IHdpdGggY29sb3JzIGFuZCBjdXN0b21pemVkIGJhciB3aWR0aDoKYmFycGxvdCh0YmwwMSwgbmFtZXMuYXJnID0gbm9tYnJlczAxLCBtYWluID0gIlVyYmFuUnVyYWxDbGFzc2lmaWNhdGlvblxuKGZyZXF1ZW5jeSkiLCBjb2wgPSBjKCJyZWQiLCAiYmx1ZSIsICJwaW5rIiwgImxpZ2h0Ymx1ZTIiKSwgd2lkdGggPSBjKDEuNCwgMSwgMS43LCAwLjY1KSwgbGFzID0gMikKCiMgQ3JlYXRpbmcgdGhlIHBpZSBjaGFydCB3aXRoIHRoZSBsYWJlbHMgYW5kIHBlcmNlbnRhZ2VzLCBhbmQgd2l0aCBzb21lIHNwZWNpZmljIGNvbG9ycy4KcGllKHRibDAyLCBtYWluID0gIkhvdXNlaG9sZFJlZ2lvblxuKHBlcmNlbnRhZ2UpIiwgbGFiZWxzID0gZXRpcXVldGFzMDIsIGNvbCA9IGMoImdyZWVuIiwgImJyb3duIiwgIm9yYW5nZSIsICJwdXJwbGUiKSkKIyBDcmVhdGlvbiBvZiB0aGUgYmFyIHBsb3Qgd2l0aCBjb2xvcnMgYW5kIGN1c3RvbWl6ZWQgYmFyIHdpZHRoOgpiYXJwbG90KHRibDAyLCBuYW1lcy5hcmcgPSBub21icmVzMDIsIG1haW4gPSAiSG91c2Vob2xkUmVnaW9uXG4oZnJlcXVlbmN5KSIsIGNvbCA9IGMoImdyZWVuIiwgImJyb3duIiwgIm9yYW5nZSIsICJwdXJwbGUiKSwgd2lkdGggPSBjKDAuNjUsIDEsIDEuOSwgMS4yKSwgbGFzID0gMikKCgojIFJlc2V0IHRoZSBsYXlvdXQgdG8gdGhlIGRlZmF1bHQgc2V0dGluZ3M6CnBhcihkZWZhdWx0X3BhcikKYGBgCgpgYGB7ciBlY2hvID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRX0KIyBGb3IgdGhlIGxpbmUgZ3JhcGggdXNpbmcgdGhlIGdncGxvdCBjb2RlOgppZiAoIXJlcXVpcmVOYW1lc3BhY2UoImdncGxvdDIiLCBxdWlldGx5ID0gVFJVRSkpIHsKICBpbnN0YWxsLnBhY2thZ2VzKCJnZ3Bsb3QyIikKfQpsaWJyYXJ5KGdncGxvdDIpCmBgYAo8YnI+PGJyPgo8Zm9udCBjb2xvcj0ibmF2eSI+PHN0cm9uZz5MaW5lIGdyYXBoIG9mIG1vbnRobHkgcGFydGljaXBhbnQgZGlzdHJpYnV0aW9uIGJ5IHllYXIgdXNpbmcgdGhlIHZhcmlhYmxlcyAnPGVtPkludGVydmlld01vbnRoPC9lbT4nIGFuZCAnPGVtPlN1cnZleVllYXI8L2VtPic6PC9zdHJvbmc+PC9mb250PgpgYGB7ciBlY2hvID0gRkFMU0V9CiMgSSBhbSB1c2luZyB0aGUgYWdncmVnYXRlKCkgZnVuY3Rpb24gaGVyZSAoZm9yIHNpbXBsaWNpdHkpLgojIFRoZSBhZ2dyZWdhdGUoKSBmdW5jdGlvbiB3aWxsIGNyZWF0ZSBhIG5ldyBkYXRhIGZyYW1lLgojIEZvciB0aGUgYWdncmVnYXRlKCkgZnVuY3Rpb24gSSBhbSB1c2luZywgZnJvbSB0aGUgY2xlYW5lZENhdGVnb3JpY2FsIGRhdGEgZnJhbWU6CiMgICAgIC0gKHgpIFRoZSBjb2x1bW4gSW50ZXJ2aWV3TW9udGggYXMgdGhlIGRhdGEuCiMgICAgIC0gKGJ5KSBHcm91cGVkIGJ5IGJvdGggY29sdW1ucyBJbnRlcnZpZXdNb250aCBhbmQgU3VydmV5WWVhci4KIyAgICAgLSAoRlVOKSBDb21wdXRlZCB0aGUgc3VtbWFyeSBzdGF0aXN0aWMgImxlbmd0aCIsIHdoaWNoIGlzIHRoZSBjb3VudCBvZiB0aGUgb2NjdXJyZW5jZSBvZiBlYWNoIGNvbWJpbmF0aW9uIG1hZGUgYnkgbW9udGggYW5kIHllYXIuCnRtcF9kZiA8LSBhZ2dyZWdhdGUoeCA9IGNsZWFuZWRDYXRlZ29yaWNhbF9kZiRJbnRlcnZpZXdNb250aCxieSA9IGxpc3QoY2xlYW5lZENhdGVnb3JpY2FsX2RmJEludGVydmlld01vbnRoLCBjbGVhbmVkQ2F0ZWdvcmljYWxfZGYkU3VydmV5WWVhciksIEZVTiA9IGxlbmd0aCApCgojc3RyKHRtcF9kZikKI2NhdCgiXG5cbiIsICJWYXJpYWJsZXM6IiwgIlxuIikKI2NvbG5hbWVzKHRtcF9kZikKI3RtcF9kZgoKIyBIZXJlIEkgYW0gcmVuYW1pbmcgdGhlIHZhcmlhYmxlcyBvZiB0aGUgbmV3IGRhdGEgZnJhbWUgYmVjYXVzZSB0aGUgYWdncmVnYXRlKCkgZnVuY3Rpb24gbmFtZWQgCiMgdGhlbTogIkdyb3VwLjEiLCAiR3JvdXAuMiIsIGFuZCAieCIuCmNvbG5hbWVzKHRtcF9kZilbY29sbmFtZXModG1wX2RmKSA9PSAiR3JvdXAuMSJdIDwtICJNb250aHMiCmNvbG5hbWVzKHRtcF9kZilbY29sbmFtZXModG1wX2RmKSA9PSAiR3JvdXAuMiJdIDwtICJZZWFycyIKY29sbmFtZXModG1wX2RmKVtjb2xuYW1lcyh0bXBfZGYpID09ICJ4Il0gPC0gIlBhcnRpY2lwYW50cyIKCmdncGxvdChkYXRhID0gdG1wX2RmLCBhZXMoeCA9IE1vbnRocywgeSA9IFBhcnRpY2lwYW50cywgZ3JvdXAgPSBZZWFycywgY29sb3VyID0gWWVhcnMgKSkgKyAKICBnZW9tX2xpbmUoKSArIAogIGdlb21fcG9pbnQoKSArIAogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCJvbGl2ZWRyYWIiLCAidG9tYXRvIiwgImRvZGdlcmJsdWUyIiwgIm1hZ2VudGEzIikpICArIAogIGdndGl0bGUoIk1vbnRobHkgUGFydGljaXBhbnQgRGlzdHJpYnV0aW9uIGJ5IFllYXIiKSArIAogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoY29sb3IgPSAibmF2eWJsdWUiLCBmYWNlID0gImJvbGQiLCBzaXplID0gcmVsKDEuNSksIGhqdXN0ID0gMC41KSkgKyAKICBzY2FsZV94X2Rpc2NyZXRlKGxhYmVscyA9IG1vbnRoLmFiYikgKwogIHRoZW1lKGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChmYWNlID0gImJvbGQuaXRhbGljIikpICsgCiAgeWxpbSgwLCBtYXgodG1wX2RmJFBhcnRpY2lwYW50cykpICsgCiAgdGhlbWUoYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KGZhY2UgPSAiYm9sZC5pdGFsaWMiKSkKYGBgCjwhLS0KICBEbyBub3QgcHJpbnQgdGhpcyBpbiB0aGUgSFRNTCBmaWxlISBVc2Ugb25seSB0byBnZXQgaW5mb3JtYXRpb24gZnJvbSB0aGUgZ3JhcGggYWJvdmUgd2hlbiBuZWVkZWQuCi0tPgpgYGB7ciBlY2hvID0gRkFMU0UsIGV2YWwgPSBGQUxTRX0KIyBMb29rcyBmb3IgdGhlIG1pbmltdW0gdmFsdWVzIG9mIHRoZSBQYXJ0aWNpcGFudCBjb3VudHMgYnkgZWFjaCB5ZWFyLCBmcm9tIDIwMjEgdG8gMjAyMzoKbWluKHRtcF9kZiRQYXJ0aWNpcGFudHNbdG1wX2RmJFllYXJzID09ICIyMDIxIl0pCm1pbih0bXBfZGYkUGFydGljaXBhbnRzW3RtcF9kZiRZZWFycyA9PSAiMjAyMiJdKQptaW4odG1wX2RmJFBhcnRpY2lwYW50c1t0bXBfZGYkWWVhcnMgPT0gIjIwMjMiXSkKIyBQcmludHMgdGhlIG1vbnRoIG9mIHRoZSBtaW5pbXVtIHZhbHVlIG9mIHRoZSBQYXJ0aWNpcGFudCBjb3VudHMgYWxsIHRoZSB5ZWFycyBmcm9tIDIwMjEgdG8gMjAyMzoKdG1wX2RmJE1vbnRoc1t0bXBfZGYkUGFydGljaXBhbnRzID09IDIwMjUgJiB0bXBfZGYkWWVhcnMgPT0gIjIwMjIiXQoKIyBMb29rcyBmb3IgdGhlIG1heGltdW0gdmFsdWVzIG9mIHRoZSBQYXJ0aWNpcGFudCBjb3VudHMgYnkgZWFjaCB5ZWFyLCBmcm9tIDIwMjEgdG8gMjAyMzoKbWF4KHRtcF9kZiRQYXJ0aWNpcGFudHNbdG1wX2RmJFllYXJzID09ICIyMDIxIl0pCm1heCh0bXBfZGYkUGFydGljaXBhbnRzW3RtcF9kZiRZZWFycyA9PSAiMjAyMiJdKQptYXgodG1wX2RmJFBhcnRpY2lwYW50c1t0bXBfZGYkWWVhcnMgPT0gIjIwMjMiXSkKIyBQcmludHMgdGhlIG1vbnRoIG9mIHRoZSBtYXhpbXVtIHZhbHVlIG9mIHRoZSBQYXJ0aWNpcGFudCBjb3VudHMgYWxsIHRoZSB5ZWFycyBmcm9tIDIwMjEgdG8gMjAyMzoKdG1wX2RmJE1vbnRoc1t0bXBfZGYkUGFydGljaXBhbnRzID09IDI0NzUgJiB0bXBfZGYkWWVhcnMgPT0gIjIwMjEiXQoKIyBMb29rcyBmb3IgdGhlIG1pbmltdW0gdmFsdWVzIG9mIHRoZSBQYXJ0aWNpcGFudCBjb3VudHMgb2YgMjAyMDoKbWluKHRtcF9kZiRQYXJ0aWNpcGFudHNbdG1wX2RmJFllYXJzID09ICIyMDIwIl0pCiMgUHJpbnRzIHRoZSBtb250aCBvZiB0aGUgbWluaW11bSB2YWx1ZSBvZiB0aGUgUGFydGljaXBhbnQgY291bnRzIG9mIDIwMjA6CnRtcF9kZiRNb250aHNbdG1wX2RmJFBhcnRpY2lwYW50cyA9PSAxNzM4ICYgdG1wX2RmJFllYXJzID09ICIyMDIwIl0KCiMgTG9va3MgZm9yIHRoZSBtYXhpbXVtIHZhbHVlcyBvZiB0aGUgUGFydGljaXBhbnQgY291bnRzIG9mIDIwMjA6Cm1heCh0bXBfZGYkUGFydGljaXBhbnRzW3RtcF9kZiRZZWFycyA9PSAiMjAyMCJdKQojIFByaW50cyB0aGUgbW9udGggb2YgdGhlIG1heGltdW0gdmFsdWUgb2YgdGhlIFBhcnRpY2lwYW50IGNvdW50cyBvZiAyMDIwOgp0bXBfZGYkTW9udGhzW3RtcF9kZiRQYXJ0aWNpcGFudHMgPT0gMzI4MCAmIHRtcF9kZiRZZWFycyA9PSAiMjAyMCJdCgoKdG1wX2RmJFBhcnRpY2lwYW50c1t0bXBfZGYkTW9udGhzID09ICJNYXJjaCIgJiB0bXBfZGYkWWVhcnMgPT0gIjIwMjAiXQoKdG1wX2RmJFBhcnRpY2lwYW50c1t0bXBfZGYkTW9udGhzID09ICJKdWx5IiAmIHRtcF9kZiRZZWFycyA9PSAiMjAyMCJdCgp0bXBfZGYkUGFydGljaXBhbnRzW3RtcF9kZiRNb250aHMgPT0gIkZlYnJ1YXJ5IiAmIHRtcF9kZiRZZWFycyA9PSAiMjAyMSJdCgp0bXBfZGYkUGFydGljaXBhbnRzW3RtcF9kZiRNb250aHMgPT0gIk1hcmNoIiAmIHRtcF9kZiRZZWFycyA9PSAiMjAyMSJdCmBgYAoKCgoKPGJyPjxicj4KPGZvbnQgY29sb3I9Im5hdnkiPjxzdHJvbmc+TGluZSBncmFwaCBvZiB0aGUgPHU+Zmlyc3Q8L3U+IHF1YXJ0ZXIgYnkgeWVhciB1c2luZyB0aGUgdmFyaWFibGVzICc8ZW0+SW50ZXJ2aWV3TW9udGg8L2VtPicsICAnPGVtPlN1cnZleVllYXI8L2VtPicsIGFuZCAnPGVtPkludGVydmlld1F1YXJ0ZXI8L2VtPic6PC9zdHJvbmc+PC9mb250PgpgYGB7ciBlY2hvID0gRkFMU0V9CiMgSSBhbSBjcmVhdGluZyBhIG5ldyBkYXRhIGZyYW1lIHdpdGggb25seSB0aGUgb2JzZXJ2YXRpb25zIHJlbGF0ZWQgdG8gUTE6CnExX2RmIDwtIGNsZWFuZWRDYXRlZ29yaWNhbF9kZltjbGVhbmVkQ2F0ZWdvcmljYWxfZGYkSW50ZXJ2aWV3UXVhcnRlciA9PSAiUTEiLCBdCiMgSSBhbSB1c2luZyB0aGUgYWdncmVnYXRlKCkgZnVuY3Rpb24gaGVyZSAoZm9yIHNpbXBsaWNpdHkpLgojIFRoZSBhZ2dyZWdhdGUoKSBmdW5jdGlvbiB3aWxsIGNyZWF0ZSBhIG5ldyBkYXRhIGZyYW1lLgojIEZvciB0aGUgYWdncmVnYXRlKCkgZnVuY3Rpb24gSSBhbSB1c2luZywgZnJvbSB0aGUgY2xlYW5lZENhdGVnb3JpY2FsIGRhdGEgZnJhbWU6CiMgICAgIC0gKHgpIFRoZSBjb2x1bW4gSW50ZXJ2aWV3TW9udGggYXMgdGhlIGRhdGEuCiMgICAgIC0gKGJ5KSBHcm91cGVkIGJ5IGJvdGggY29sdW1ucyBJbnRlcnZpZXdNb250aCBhbmQgU3VydmV5WWVhci4KIyAgICAgLSAoRlVOKSBDb21wdXRlZCB0aGUgc3VtbWFyeSBzdGF0aXN0aWMgImxlbmd0aCIsIHdoaWNoIGlzIHRoZSBjb3VudCBvZiB0aGUgb2NjdXJyZW5jZSBvZiBlYWNoIGNvbWJpbmF0aW9uIG1hZGUgYnkgbW9udGggYW5kIHllYXIuCnRtcF9kZiA8LSBhZ2dyZWdhdGUoeCA9IHExX2RmJEludGVydmlld01vbnRoLGJ5ID0gbGlzdChxMV9kZiRJbnRlcnZpZXdNb250aCwgcTFfZGYkU3VydmV5WWVhciwgcTFfZGYkSW50ZXJ2aWV3UXVhcnRlciksIEZVTiA9IGxlbmd0aCApCgojc3RyKHRtcF9kZikKI2NhdCgiXG5cbiIsICJWYXJpYWJsZXM6IiwgIlxuIikKI2NvbG5hbWVzKHRtcF9kZikKI3RtcF9kZgoKIyBIZXJlIEkgYW0gcmVuYW1pbmcgdGhlIHZhcmlhYmxlcyBvZiB0aGUgbmV3IGRhdGEgZnJhbWUgYmVjYXVzZSB0aGUgYWdncmVnYXRlKCkgZnVuY3Rpb24gbmFtZWQgCiMgdGhlbTogIkdyb3VwLjEiLCAiR3JvdXAuMiIsIGFuZCAieCIuCmNvbG5hbWVzKHRtcF9kZilbY29sbmFtZXModG1wX2RmKSA9PSAiR3JvdXAuMSJdIDwtICJNb250aHMiCmNvbG5hbWVzKHRtcF9kZilbY29sbmFtZXModG1wX2RmKSA9PSAiR3JvdXAuMiJdIDwtICJZZWFycyIKY29sbmFtZXModG1wX2RmKVtjb2xuYW1lcyh0bXBfZGYpID09ICJHcm91cC4zIl0gPC0gIlF1YXJ0ZXJzIgpjb2xuYW1lcyh0bXBfZGYpW2NvbG5hbWVzKHRtcF9kZikgPT0gIngiXSA8LSAiUGFydGljaXBhbnRzIgoKZ2dwbG90KGRhdGEgPSB0bXBfZGYsIGFlcyh4ID0gTW9udGhzLCB5ID0gUGFydGljaXBhbnRzLCBncm91cCA9IFllYXJzLCBjb2xvdXIgPSBZZWFycykpICsgCiAgZ2VvbV9saW5lKCkgKyAKICBnZW9tX3BvaW50KCkgKyAKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygib2xpdmVkcmFiIiwgInRvbWF0byIsICJkb2RnZXJibHVlMiIsICJtYWdlbnRhMyIpKSArIAogIGdndGl0bGUoIlF1YXJ0ZXIgMSIpICsgCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJuYXZ5Ymx1ZSIsIGZhY2UgPSAiYm9sZCIsIHNpemUgPSByZWwoMS41KSwgaGp1c3QgPSAwLjUpKSArIAogIHRoZW1lKGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChmYWNlID0gImJvbGQuaXRhbGljIikpICsKICB5bGltKDE3MDAsIG1heCh0bXBfZGYkUGFydGljaXBhbnRzKSkgKyAKICB0aGVtZShheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoZmFjZSA9ICJib2xkLml0YWxpYyIpKQpgYGAKPGJyPjxicj4KPGZvbnQgY29sb3I9Im5hdnkiPjxzdHJvbmc+TGluZSBncmFwaCBvZiB0aGUgPHU+c2Vjb25kPC91PiBxdWFydGVyIGJ5IHllYXIgdXNpbmcgdGhlIHZhcmlhYmxlcyAnPGVtPkludGVydmlld01vbnRoPC9lbT4nLCAgJzxlbT5TdXJ2ZXlZZWFyPC9lbT4nLCBhbmQgJzxlbT5JbnRlcnZpZXdRdWFydGVyPC9lbT4nOjwvc3Ryb25nPjwvZm9udD4KYGBge3IgZWNobyA9IEZBTFNFfQojIEkgYW0gY3JlYXRpbmcgYSBuZXcgZGF0YSBmcmFtZSB3aXRoIG9ubHkgdGhlIG9ic2VydmF0aW9ucyByZWxhdGVkIHRvIFEyOgpxMl9kZiA8LSBjbGVhbmVkQ2F0ZWdvcmljYWxfZGZbY2xlYW5lZENhdGVnb3JpY2FsX2RmJEludGVydmlld1F1YXJ0ZXIgPT0gIlEyIiwgXQojIEkgYW0gdXNpbmcgdGhlIGFnZ3JlZ2F0ZSgpIGZ1bmN0aW9uIGhlcmUgKGZvciBzaW1wbGljaXR5KS4KIyBUaGUgYWdncmVnYXRlKCkgZnVuY3Rpb24gd2lsbCBjcmVhdGUgYSBuZXcgZGF0YSBmcmFtZS4KIyBGb3IgdGhlIGFnZ3JlZ2F0ZSgpIGZ1bmN0aW9uIEkgYW0gdXNpbmcsIGZyb20gdGhlIGNsZWFuZWRDYXRlZ29yaWNhbCBkYXRhIGZyYW1lOgojICAgICAtICh4KSBUaGUgY29sdW1uIEludGVydmlld01vbnRoIGFzIHRoZSBkYXRhLgojICAgICAtIChieSkgR3JvdXBlZCBieSBib3RoIGNvbHVtbnMgSW50ZXJ2aWV3TW9udGggYW5kIFN1cnZleVllYXIuCiMgICAgIC0gKEZVTikgQ29tcHV0ZWQgdGhlIHN1bW1hcnkgc3RhdGlzdGljICJsZW5ndGgiLCB3aGljaCBpcyB0aGUgY291bnQgb2YgdGhlIG9jY3VycmVuY2Ugb2YgZWFjaCBjb21iaW5hdGlvbiBtYWRlIGJ5IG1vbnRoIGFuZCB5ZWFyLgp0bXBfZGYgPC0gYWdncmVnYXRlKHggPSBxMl9kZiRJbnRlcnZpZXdNb250aCxieSA9IGxpc3QocTJfZGYkSW50ZXJ2aWV3TW9udGgsIHEyX2RmJFN1cnZleVllYXIsIHEyX2RmJEludGVydmlld1F1YXJ0ZXIpLCBGVU4gPSBsZW5ndGggKQoKI3N0cih0bXBfZGYpCiNjYXQoIlxuXG4iLCAiVmFyaWFibGVzOiIsICJcbiIpCiNjb2xuYW1lcyh0bXBfZGYpCiN0bXBfZGYKCiMgSGVyZSBJIGFtIHJlbmFtaW5nIHRoZSB2YXJpYWJsZXMgb2YgdGhlIG5ldyBkYXRhIGZyYW1lIGJlY2F1c2UgdGhlIGFnZ3JlZ2F0ZSgpIGZ1bmN0aW9uIG5hbWVkIAojIHRoZW06ICJHcm91cC4xIiwgIkdyb3VwLjIiLCBhbmQgIngiLgpjb2xuYW1lcyh0bXBfZGYpW2NvbG5hbWVzKHRtcF9kZikgPT0gIkdyb3VwLjEiXSA8LSAiTW9udGhzIgpjb2xuYW1lcyh0bXBfZGYpW2NvbG5hbWVzKHRtcF9kZikgPT0gIkdyb3VwLjIiXSA8LSAiWWVhcnMiCmNvbG5hbWVzKHRtcF9kZilbY29sbmFtZXModG1wX2RmKSA9PSAiR3JvdXAuMyJdIDwtICJRdWFydGVycyIKY29sbmFtZXModG1wX2RmKVtjb2xuYW1lcyh0bXBfZGYpID09ICJ4Il0gPC0gIlBhcnRpY2lwYW50cyIKCmdncGxvdChkYXRhID0gdG1wX2RmLCBhZXMoeCA9IE1vbnRocywgeSA9IFBhcnRpY2lwYW50cywgZ3JvdXAgPSBZZWFycywgY29sb3VyID0gWWVhcnMpKSArIAogIGdlb21fbGluZSgpICsgCiAgZ2VvbV9wb2ludCgpICsgCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoIm9saXZlZHJhYiIsICJ0b21hdG8iLCAiZG9kZ2VyYmx1ZTIiLCAibWFnZW50YTMiKSkgKyAKICBnZ3RpdGxlKCJRdWFydGVyIDIiKSArIAogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoY29sb3IgPSAibmF2eWJsdWUiLCBmYWNlID0gImJvbGQiLCBzaXplID0gcmVsKDEuNSksIGhqdXN0ID0gMC41KSkgKyAKICB0aGVtZShheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoZmFjZSA9ICJib2xkLml0YWxpYyIpKSArCiAgeWxpbSgxNzAwLCBtYXgodG1wX2RmJFBhcnRpY2lwYW50cykpICsgCiAgdGhlbWUoYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KGZhY2UgPSAiYm9sZC5pdGFsaWMiKSkKYGBgCjxicj48YnI+Cjxmb250IGNvbG9yPSJuYXZ5Ij48c3Ryb25nPkxpbmUgZ3JhcGggb2YgdGhlIDx1PnRoaXJkPC91PiBxdWFydGVyIGJ5IHllYXIgdXNpbmcgdGhlIHZhcmlhYmxlcyAnPGVtPkludGVydmlld01vbnRoPC9lbT4nLCAgJzxlbT5TdXJ2ZXlZZWFyPC9lbT4nLCBhbmQgJzxlbT5JbnRlcnZpZXdRdWFydGVyPC9lbT4nOjwvc3Ryb25nPjwvZm9udD4KYGBge3IgZWNobyA9IEZBTFNFfQojIEkgYW0gY3JlYXRpbmcgYSBuZXcgZGF0YSBmcmFtZSB3aXRoIG9ubHkgdGhlIG9ic2VydmF0aW9ucyByZWxhdGVkIHRvIFEzOgpxM19kZiA8LSBjbGVhbmVkQ2F0ZWdvcmljYWxfZGZbY2xlYW5lZENhdGVnb3JpY2FsX2RmJEludGVydmlld1F1YXJ0ZXIgPT0gIlEzIiwgXQojIEkgYW0gdXNpbmcgdGhlIGFnZ3JlZ2F0ZSgpIGZ1bmN0aW9uIGhlcmUgKGZvciBzaW1wbGljaXR5KS4KIyBUaGUgYWdncmVnYXRlKCkgZnVuY3Rpb24gd2lsbCBjcmVhdGUgYSBuZXcgZGF0YSBmcmFtZS4KIyBGb3IgdGhlIGFnZ3JlZ2F0ZSgpIGZ1bmN0aW9uIEkgYW0gdXNpbmcsIGZyb20gdGhlIGNsZWFuZWRDYXRlZ29yaWNhbCBkYXRhIGZyYW1lOgojICAgICAtICh4KSBUaGUgY29sdW1uIEludGVydmlld01vbnRoIGFzIHRoZSBkYXRhLgojICAgICAtIChieSkgR3JvdXBlZCBieSBib3RoIGNvbHVtbnMgSW50ZXJ2aWV3TW9udGggYW5kIFN1cnZleVllYXIuCiMgICAgIC0gKEZVTikgQ29tcHV0ZWQgdGhlIHN1bW1hcnkgc3RhdGlzdGljICJsZW5ndGgiLCB3aGljaCBpcyB0aGUgY291bnQgb2YgdGhlIG9jY3VycmVuY2Ugb2YgZWFjaCBjb21iaW5hdGlvbiBtYWRlIGJ5IG1vbnRoIGFuZCB5ZWFyLgp0bXBfZGYgPC0gYWdncmVnYXRlKHggPSBxM19kZiRJbnRlcnZpZXdNb250aCxieSA9IGxpc3QocTNfZGYkSW50ZXJ2aWV3TW9udGgsIHEzX2RmJFN1cnZleVllYXIsIHEzX2RmJEludGVydmlld1F1YXJ0ZXIpLCBGVU4gPSBsZW5ndGggKQoKI3N0cih0bXBfZGYpCiNjYXQoIlxuXG4iLCAiVmFyaWFibGVzOiIsICJcbiIpCiNjb2xuYW1lcyh0bXBfZGYpCiN0bXBfZGYKCiMgSGVyZSBJIGFtIHJlbmFtaW5nIHRoZSB2YXJpYWJsZXMgb2YgdGhlIG5ldyBkYXRhIGZyYW1lIGJlY2F1c2UgdGhlIGFnZ3JlZ2F0ZSgpIGZ1bmN0aW9uIG5hbWVkIAojIHRoZW06ICJHcm91cC4xIiwgIkdyb3VwLjIiLCBhbmQgIngiLgpjb2xuYW1lcyh0bXBfZGYpW2NvbG5hbWVzKHRtcF9kZikgPT0gIkdyb3VwLjEiXSA8LSAiTW9udGhzIgpjb2xuYW1lcyh0bXBfZGYpW2NvbG5hbWVzKHRtcF9kZikgPT0gIkdyb3VwLjIiXSA8LSAiWWVhcnMiCmNvbG5hbWVzKHRtcF9kZilbY29sbmFtZXModG1wX2RmKSA9PSAiR3JvdXAuMyJdIDwtICJRdWFydGVycyIKY29sbmFtZXModG1wX2RmKVtjb2xuYW1lcyh0bXBfZGYpID09ICJ4Il0gPC0gIlBhcnRpY2lwYW50cyIKCmdncGxvdChkYXRhID0gdG1wX2RmLCBhZXMoeCA9IE1vbnRocywgeSA9IFBhcnRpY2lwYW50cywgZ3JvdXAgPSBZZWFycywgY29sb3VyID0gWWVhcnMpKSArIAogIGdlb21fbGluZSgpICsgCiAgZ2VvbV9wb2ludCgpICsgCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoIm9saXZlZHJhYiIsICJ0b21hdG8iLCAiZG9kZ2VyYmx1ZTIiLCAibWFnZW50YTMiKSkgKyAKICBnZ3RpdGxlKCJRdWFydGVyIDMiKSArIAogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoY29sb3IgPSAibmF2eWJsdWUiLCBmYWNlID0gImJvbGQiLCBzaXplID0gcmVsKDEuNSksIGhqdXN0ID0gMC41KSkgKyAKICB0aGVtZShheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoZmFjZSA9ICJib2xkLml0YWxpYyIpKSArCiAgeWxpbSgxNzAwLCBtYXgodG1wX2RmJFBhcnRpY2lwYW50cykpICsgCiAgdGhlbWUoYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KGZhY2UgPSAiYm9sZC5pdGFsaWMiKSkKYGBgCjxicj48YnI+Cjxmb250IGNvbG9yPSJuYXZ5Ij48c3Ryb25nPkxpbmUgZ3JhcGggb2YgdGhlIDx1Pmxhc3Q8L3U+IHF1YXJ0ZXIgYnkgeWVhciB1c2luZyB0aGUgdmFyaWFibGVzICc8ZW0+SW50ZXJ2aWV3TW9udGg8L2VtPicsICAnPGVtPlN1cnZleVllYXI8L2VtPicsIGFuZCAnPGVtPkludGVydmlld1F1YXJ0ZXI8L2VtPic6PC9zdHJvbmc+PC9mb250PgpgYGB7ciBlY2hvID0gRkFMU0V9CiMgSSBhbSBjcmVhdGluZyBhIG5ldyBkYXRhIGZyYW1lIHdpdGggb25seSB0aGUgb2JzZXJ2YXRpb25zIHJlbGF0ZWQgdG8gUTQ6CnE0X2RmIDwtIGNsZWFuZWRDYXRlZ29yaWNhbF9kZltjbGVhbmVkQ2F0ZWdvcmljYWxfZGYkSW50ZXJ2aWV3UXVhcnRlciA9PSAiUTQiLCBdCiMgSSBhbSB1c2luZyB0aGUgYWdncmVnYXRlKCkgZnVuY3Rpb24gaGVyZSAoZm9yIHNpbXBsaWNpdHkpLgojIFRoZSBhZ2dyZWdhdGUoKSBmdW5jdGlvbiB3aWxsIGNyZWF0ZSBhIG5ldyBkYXRhIGZyYW1lLgojIEZvciB0aGUgYWdncmVnYXRlKCkgZnVuY3Rpb24gSSBhbSB1c2luZywgZnJvbSB0aGUgY2xlYW5lZENhdGVnb3JpY2FsIGRhdGEgZnJhbWU6CiMgICAgIC0gKHgpIFRoZSBjb2x1bW4gSW50ZXJ2aWV3TW9udGggYXMgdGhlIGRhdGEuCiMgICAgIC0gKGJ5KSBHcm91cGVkIGJ5IGJvdGggY29sdW1ucyBJbnRlcnZpZXdNb250aCBhbmQgU3VydmV5WWVhci4KIyAgICAgLSAoRlVOKSBDb21wdXRlZCB0aGUgc3VtbWFyeSBzdGF0aXN0aWMgImxlbmd0aCIsIHdoaWNoIGlzIHRoZSBjb3VudCBvZiB0aGUgb2NjdXJyZW5jZSBvZiBlYWNoIGNvbWJpbmF0aW9uIG1hZGUgYnkgbW9udGggYW5kIHllYXIuCnRtcF9kZiA8LSBhZ2dyZWdhdGUoeCA9IHE0X2RmJEludGVydmlld01vbnRoLGJ5ID0gbGlzdChxNF9kZiRJbnRlcnZpZXdNb250aCwgcTRfZGYkU3VydmV5WWVhciwgcTRfZGYkSW50ZXJ2aWV3UXVhcnRlciksIEZVTiA9IGxlbmd0aCApCgojc3RyKHRtcF9kZikKI2NhdCgiXG5cbiIsICJWYXJpYWJsZXM6IiwgIlxuIikKI2NvbG5hbWVzKHRtcF9kZikKI3RtcF9kZgoKIyBIZXJlIEkgYW0gcmVuYW1pbmcgdGhlIHZhcmlhYmxlcyBvZiB0aGUgbmV3IGRhdGEgZnJhbWUgYmVjYXVzZSB0aGUgYWdncmVnYXRlKCkgZnVuY3Rpb24gbmFtZWQgCiMgdGhlbTogIkdyb3VwLjEiLCAiR3JvdXAuMiIsIGFuZCAieCIuCmNvbG5hbWVzKHRtcF9kZilbY29sbmFtZXModG1wX2RmKSA9PSAiR3JvdXAuMSJdIDwtICJNb250aHMiCmNvbG5hbWVzKHRtcF9kZilbY29sbmFtZXModG1wX2RmKSA9PSAiR3JvdXAuMiJdIDwtICJZZWFycyIKY29sbmFtZXModG1wX2RmKVtjb2xuYW1lcyh0bXBfZGYpID09ICJHcm91cC4zIl0gPC0gIlF1YXJ0ZXJzIgpjb2xuYW1lcyh0bXBfZGYpW2NvbG5hbWVzKHRtcF9kZikgPT0gIngiXSA8LSAiUGFydGljaXBhbnRzIgoKZ2dwbG90KGRhdGEgPSB0bXBfZGYsIGFlcyh4ID0gTW9udGhzLCB5ID0gUGFydGljaXBhbnRzLCBncm91cCA9IFllYXJzLCBjb2xvdXIgPSBZZWFycykpICsgCiAgZ2VvbV9saW5lKCkgKyAKICBnZW9tX3BvaW50KCkgKyAKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygib2xpdmVkcmFiIiwgInRvbWF0byIsICJkb2RnZXJibHVlMiIsICJtYWdlbnRhMyIpKSArIAogIGdndGl0bGUoIlF1YXJ0ZXIgNCIpICsgCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJuYXZ5Ymx1ZSIsIGZhY2UgPSAiYm9sZCIsIHNpemUgPSByZWwoMS41KSwgaGp1c3QgPSAwLjUpKSArIAogIHRoZW1lKGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChmYWNlID0gImJvbGQuaXRhbGljIikpICsKICB5bGltKDE3MDAsIG1heCh0bXBfZGYkUGFydGljaXBhbnRzKSkgKyAKICB0aGVtZShheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoZmFjZSA9ICJib2xkLml0YWxpYyIpKQpgYGAKPGJyPjxicj4KPGZvbnQgY29sb3I9Im5hdnkiPjxzdHJvbmc+U2lkZS1ieS1zaWRlIGJhciBjaGFydCBvZiBwYXJ0aWNpcGFudCBkaXN0cmlidXRpb24gYnkgcmFjZS9ldGhuaWNpdHkgYW5kIGdlbmRlciB1c2luZyB0aGUgdmFyaWFibGVzICc8ZW0+UmFjZUV0aG5pY2l0eTwvZW0+JyBhbmQgJzxlbT5TYW1wbGVBZHVsdFNleDwvZW0+Jzo8L3N0cm9uZz48L2ZvbnQ+CmBgYHtyIGVjaG8gPSBGQUxTRX0KdG1wX2RmIDwtIGFnZ3JlZ2F0ZSh4ID0gY2xlYW5lZENhdGVnb3JpY2FsX2RmJFJhY2VFdGhuaWNpdHksYnkgPSBsaXN0KGNsZWFuZWRDYXRlZ29yaWNhbF9kZiRSYWNlRXRobmljaXR5LCBjbGVhbmVkQ2F0ZWdvcmljYWxfZGYkU2FtcGxlQWR1bHRTZXgpLCBGVU4gPSBsZW5ndGggKQoKY29sbmFtZXModG1wX2RmKVtjb2xuYW1lcyh0bXBfZGYpID09ICJHcm91cC4xIl0gPC0gIlJhY2VFdGhuaWNpdHkiCmNvbG5hbWVzKHRtcF9kZilbY29sbmFtZXModG1wX2RmKSA9PSAiR3JvdXAuMiJdIDwtICJHZW5kZXIiCmNvbG5hbWVzKHRtcF9kZilbY29sbmFtZXModG1wX2RmKSA9PSAieCJdIDwtICJQYXJ0aWNpcGFudHMiCgpnZ3Bsb3QoZGF0YSA9IHRtcF9kZiwgYWVzKHggPSByZW9yZGVyKFJhY2VFdGhuaWNpdHksIFBhcnRpY2lwYW50cyksIHkgPSBQYXJ0aWNpcGFudHMsIGZpbGwgPSBHZW5kZXIpKSArCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIHBvc2l0aW9uID0gImRvZGdlIikgKwogIGNvb3JkX2ZsaXAoKSArCiAgZmFjZXRfd3JhcCh+IEdlbmRlcikgKyAKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCJkZWVwc2t5Ymx1ZTIiLCAicGluazIiKSkgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKHBhbmVsLmdyaWQubWFqb3IueCA9IGVsZW1lbnRfYmxhbmsoKSwgcGFuZWwuZ3JpZC5taW5vci54ID0gZWxlbWVudF9ibGFuaygpLCBwYW5lbC5ncmlkLm1ham9yLnkgPSBlbGVtZW50X2xpbmUoY29sb3VyID0gImdyZXk2MCIsIGxpbmV0eXBlID0gImRhc2hlZCIpKSArCiAgZ2d0aXRsZSgiUGFydGljaXBhbnQgRGlzdHJpYnV0aW9uIGJ5IFJhY2UvRXRobmljaXR5IGFuZCBHZW5kZXIiKSArCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJuYXZ5Ymx1ZSIsIGZhY2UgPSAiYm9sZCIsIHNpemUgPSByZWwoMS41KSwgaGp1c3QgPSAwLjUpKSArCiAgdGhlbWUoYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KGZhY2UgPSAiYm9sZC5pdGFsaWMiKSkgKwogIHRoZW1lKGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KGZhY2UgPSAiYm9sZCIpKSArCiAgbGFicyh4ID0gTlVMTCkKYGBgCjxicj48YnI+Cjxmb250IGNvbG9yPSJuYXZ5Ij48c3Ryb25nPlN0YWNrZWQgYXJlYSBncmFwaCBvZiBlZHVjYXRpb24gbGV2ZWxzIGFjcm9zcyBhZ2UgZ3JvdXBzIHVzaW5nIHRoZSB2YXJpYWJsZXMgJzxlbT5FZHVjYXRpb25MZXZlbDwvZW0+JyBhbmQgJzxlbT5TYW1wbGVBZHVsdEFnZTwvZW0+Jzo8L3N0cm9uZz48L2ZvbnQ+CmBgYHtyIGVjaG8gPSBGQUxTRX0KdG1wX2RmIDwtIGFnZ3JlZ2F0ZSh4ID0gY2xlYW5lZENhdGVnb3JpY2FsX2RmJEVkdWNhdGlvbkxldmVsLGJ5ID0gbGlzdChjbGVhbmVkQ2F0ZWdvcmljYWxfZGYkRWR1Y2F0aW9uTGV2ZWwsIGNsZWFuZWRDYXRlZ29yaWNhbF9kZiRTYW1wbGVBZHVsdEFnZSksIEZVTiA9IGxlbmd0aCApCgpjb2xuYW1lcyh0bXBfZGYpW2NvbG5hbWVzKHRtcF9kZikgPT0gIkdyb3VwLjEiXSA8LSAiTGV2ZWxzIgpjb2xuYW1lcyh0bXBfZGYpW2NvbG5hbWVzKHRtcF9kZikgPT0gIkdyb3VwLjIiXSA8LSAiQWdlIgpjb2xuYW1lcyh0bXBfZGYpW2NvbG5hbWVzKHRtcF9kZikgPT0gIngiXSA8LSAiUGFydGljaXBhbnRzIgoKIyBDYWxjdWxhdGUgdGhlIHRvdGFsIHBhcnRpY2lwYW50cyBmb3IgZWFjaCBMZXZlbAp0b3RhbF9wYXJ0aWNpcGFudHMgPC0gYWdncmVnYXRlKFBhcnRpY2lwYW50cyB+IExldmVscywgZGF0YSA9IHRtcF9kZiwgc3VtKQoKIyBSZW9yZGVyIExldmVscyBiYXNlZCBvbiB0b3RhbCBwYXJ0aWNpcGFudHMKdG1wX2RmJExldmVscyA8LSBmYWN0b3IoCiAgdG1wX2RmJExldmVscywKICBsZXZlbHMgPSB0b3RhbF9wYXJ0aWNpcGFudHNbb3JkZXIodG90YWxfcGFydGljaXBhbnRzJFBhcnRpY2lwYW50cywgZGVjcmVhc2luZyA9IFRSVUUpLCAiTGV2ZWxzIl0KKQoKZ2dwbG90KGRhdGEgPSB0bXBfZGYsIGFlcyh4ID0gQWdlLCB5ID0gUGFydGljaXBhbnRzLCBmaWxsID0gTGV2ZWxzICkpICsgCiAgZ2VvbV9hcmVhKGNvbG9yID0gTkEsIGFscGhhID0gLjgpICsKICBnZW9tX2xpbmUocG9zaXRpb24gPSAic3RhY2siLCBsaW5ld2lkdGggPSAuMDIpICsKICBzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlID0gIlNwZWN0cmFsIikgKwogIHRoZW1lX2J3KCkgKwogIGdndGl0bGUoIkVkdWNhdGlvbiBMZXZlbHMiKSArIAogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoY29sb3IgPSAibmF2eWJsdWUiLCBmYWNlID0gImJvbGQiLCBzaXplID0gcmVsKDEuNSksIGhqdXN0ID0gMC41KSkgKyAKICBsYWJzKHN1YnRpdGxlID0gIkFjcm9zcyBBZ2UgR3JvdXBzIikgKwogIHRoZW1lKHBsb3Quc3VidGl0bGUgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiZGFya29yYW5nZSIsIGZhY2UgPSAiYm9sZCIsIHNpemUgPSByZWwoMSksIGhqdXN0ID0gMC41KSkgKwogIHRoZW1lKGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChmYWNlID0gImJvbGQuaXRhbGljIikpICsKICB0aGVtZShheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoZmFjZSA9ICJib2xkLml0YWxpYyIpKQoKCiMgSG93IHRvIHJlYWQgdGhpcyBTdGFja2VkIEFyZWEgR3JhcGg/CiMKIyBZLWF4aXM6IGFtb3VudCBvZiBwYXJ0aWNpcGFudHMgY291bnRlZCBwZXIgYWdlIGdyb3VwLgojIFgtYXhpczogYWdlIGdyb3VwLgojCiMgVGhlIGxldmVscyBhcmUgcmVwcmVzZW50ZWQgZWFjaCBieSBhIHVuaXF1ZSBjb2xvci4gVGhlIGJpZ2dlciB0aGUgYXJlYSwgdGhlIG1vcmUgcGFydGljaXBhbnRzIG9mIHRoYXQgbGV2ZWwgaW4gYSBhZ2UgZ3JvdXAuCiMgCiMgRWFjaCBhZ2UgZ3JvdXAgaXMgcmVwcmVzZW50ZWQgYnkgdGhlIHRvdGFsIG9mIGFsbCBwYXJ0aWNpcGFudHMgd2l0aGluIGFsbCBsZXZlbHMgd2l0aGluIGl0LiBUaGlzIG1lYW5zIHRoYXQsIGZvciBleGFtcGxlLAojIGFnZSA3MCdzIGdyb3VwIGhhcyBhIHRvdGFsIG9mIG5lYXIgMiwwMDAgcGFydGljaXBhbnRzIHRoYXQgaW5jbHVkZXMgYWxsIHRoZSBwYXJ0aWNpcGFudCB3aXRoaW4gdGhhdCBhZ2UgaW4gYWxsIHRoZSBsZXZlbHMuCiMKIyBOb3RlOiBGb3IgdGhpcyBncmFwaCwgaW4gb3JkZXIgdG8gbWFrZSBpdCByZWFkYWJsZSwgSSBuZWVkZWQgdG8gY2FsY3VsYXRlIHRoZSB0b3RhbCBwYXJ0aWNpcGFudHMgZm9yIGVhY2ggbGV2ZWxzIGFuZCB0aGVuLAojICAgICAgIHNvcnQgdGhlbS4gVGhpcyBpcyB0byBiZSBhYmxlIHRvIHNob3cgdGhlIGxldmVscyBvcmdhbml6ZWQgZnJvbSBzbWFsbGVyIHNoYXBlL2FyZWEgdG8gYmlnZ2VyIG9uZS4gSWYgeW91IHJlbW92ZSB0aGUKIyAgICAgICBjb2RlIGZvciBjYWxjdWxhdGluZyB0aGUgdG90YWwgb2YgcGFydGljaXBhbnRzIGFuZCB0aGVuIHNvcnQgdGhlbSAoaXQgd2lsbCBiZSBzYXZlIHRvIGRvIHNvKSwgeW91IHdpbGwgc2VlIHRoYXQgdGhlCiMgICAgICAgZ3JhcGggb3JnYW5pemUgdGhlIGxldmVscyBieSB0aGUgZGVmYXVsdCBsZXZlbHMgbWFraW5nIHRoZSBncmFwaCBoYXJkIHRvIGludGVycHJldC4KYGBgCjwhLS0KICBEbyBub3QgcHJpbnQgdGhpcyBpbiB0aGUgSFRNTCBmaWxlISBVc2Ugb25seSB0byBnZXQgaW5mb3JtYXRpb24gZnJvbSB0aGUgZ3JhcGggYWJvdmUgd2hlbiBuZWVkZWQuCi0tPgpgYGB7ciBlY2hvID0gRkFMU0UsIGV2YWwgPSBGQUxTRX0KdGFibGUoY2xlYW5lZENhdGVnb3JpY2FsX2RmJEVkdWNhdGlvbkxldmVsKQp0bXBfZGYkUGFydGljaXBhbnRzW3RtcF9kZiRBZ2UgPT0gNzAgJiB0bXBfZGYkTGV2ZWxzID09ICIxLTExIl0KIyAxMjgKdG1wX2RmJFBhcnRpY2lwYW50c1t0bXBfZGYkQWdlID09IDcwICYgdG1wX2RmJExldmVscyA9PSAiMTIiXQojIDI5CnRtcF9kZiRQYXJ0aWNpcGFudHNbdG1wX2RmJEFnZSA9PSA3MCAmIHRtcF9kZiRMZXZlbHMgPT0gIkdFRCJdCiMgNDEKdG1wX2RmJFBhcnRpY2lwYW50c1t0bXBfZGYkQWdlID09IDcwICYgdG1wX2RmJExldmVscyA9PSAiSFNfR3JhZHVhdGUiXQojIDQ0Ngp0bXBfZGYkUGFydGljaXBhbnRzW3RtcF9kZiRBZ2UgPT0gNzAgJiB0bXBfZGYkTGV2ZWxzID09ICJTb21lX0NvbGxlZ2UiXQojIDMwNQp0bXBfZGYkUGFydGljaXBhbnRzW3RtcF9kZiRBZ2UgPT0gNzAgJiB0bXBfZGYkTGV2ZWxzID09ICJCYWNoZWxvciJdCiMgNDE3CnRtcF9kZiRQYXJ0aWNpcGFudHNbdG1wX2RmJEFnZSA9PSA3MCAmIHRtcF9kZiRMZXZlbHMgPT0gIlBTX0RvY3RvcmFsIl0KIyA3NQpgYGAKCjxicj48YnI+Cjxmb250IGNvbG9yPSJuYXZ5Ij48c3Ryb25nPlJhZGlhbCBiYXIgY2hhcnQgb2YgdGhlIEJNSSBjYXRlZ29yeSBhbmQgdGhlIGdlbmVyYWwgaGVhbHRoIHN0YXR1cyB1c2luZyB0aGUgdmFyaWFibGVzICc8ZW0+Qk1JQ2F0ZWdvcnk8L2VtPicgYW5kICc8ZW0+R2VuZXJhbEhlYWx0aFN0YXR1czwvZW0+Jzo8L3N0cm9uZz48L2ZvbnQ+CmBgYHtyIGVjaG8gPSBGQUxTRX0KdG1wX2RmIDwtIGFnZ3JlZ2F0ZSh4ID0gY2xlYW5lZENhdGVnb3JpY2FsX2RmJEdlbmVyYWxIZWFsdGhTdGF0dXMsYnkgPSBsaXN0KGNsZWFuZWRDYXRlZ29yaWNhbF9kZiRHZW5lcmFsSGVhbHRoU3RhdHVzLCBjbGVhbmVkQ2F0ZWdvcmljYWxfZGYkQk1JQ2F0ZWdvcnkpLCBGVU4gPSBsZW5ndGggKQoKY29sbmFtZXModG1wX2RmKVtjb2xuYW1lcyh0bXBfZGYpID09ICJHcm91cC4xIl0gPC0gIkhlYWx0aF9TdGF0dXMiCmNvbG5hbWVzKHRtcF9kZilbY29sbmFtZXModG1wX2RmKSA9PSAiR3JvdXAuMiJdIDwtICJCTUkiCmNvbG5hbWVzKHRtcF9kZilbY29sbmFtZXModG1wX2RmKSA9PSAieCJdIDwtICJQYXJ0aWNpcGFudHMiCgoKCgojIFJhZGlhbCBCYXIgQ2hhcnQKZ2dwbG90KHRtcF9kZiwgYWVzKHggPSBCTUksIHkgPSBQYXJ0aWNpcGFudHMsIGZpbGwgPSBIZWFsdGhfU3RhdHVzKSkgKwogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiKSArCiAgY29vcmRfcG9sYXIodGhldGEgPSAieSIpICsKICBnZ3RpdGxlKCJCTUkgQ2F0ZWdvcnkgYW5kIEdlbmVyYWwgSGVhbHRoIFN0YXR1cyIpICsKICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGNvbG9yID0gIm5hdnlibHVlIiwgZmFjZSA9ICJib2xkIiwgc2l6ZSA9IHJlbCgxLjUpLCBoanVzdCA9IDAuNSkpICsKICBsYWJzKHN1YnRpdGxlID0gIkRpc3RyaWJ1dGlvbiBvZiBQYXJ0aWNpcGFudHMiKSArCiAgdGhlbWUocGxvdC5zdWJ0aXRsZSA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJkYXJrb3JhbmdlIiwgZmFjZSA9ICJib2xkIiwgc2l6ZSA9IHJlbCgxKSwgaGp1c3QgPSAwLjUpKSArCiAgdGhlbWUoYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoZmFjZSA9ICJib2xkIikpICsKICB0aGVtZShheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoZmFjZSA9ICJib2xkLml0YWxpYyIpKSArCiAgdGhlbWUoYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KGZhY2UgPSAiYm9sZC5pdGFsaWMiKSkKICAKYGBgCgo8IS0tCiAgRG8gbm90IHByaW50IHRoaXMgaW4gdGhlIEhUTUwgZmlsZSEgVXNlIG9ubHkgdG8gZ2V0IGluZm9ybWF0aW9uIGZyb20gdGhlIGdyYXBoIGFib3ZlIHdoZW4gbmVlZGVkLgotLT4KYGBge3IgZWNobyA9IEZBTFNFLCBldmFsID0gRkFMU0V9CnRtcF9kZiRQYXJ0aWNpcGFudHNbdG1wX2RmJEJNSSA9PSAiT2Jlc2UiICYgdG1wX2RmJEhlYWx0aF9TdGF0dXMgPT0gIlBvb3IiXQojIDEsNjM3CnN1bShjbGVhbmVkQ2F0ZWdvcmljYWxfZGYkQk1JQ2F0ZWdvcnkgPT0gIk9iZXNlIiAmIGNsZWFuZWRDYXRlZ29yaWNhbF9kZiRHZW5lcmFsSGVhbHRoU3RhdHVzID09ICJQb29yIikKIyAxLDYzNwoKdG1wX2RmJFBhcnRpY2lwYW50c1t0bXBfZGYkQk1JID09ICJPYmVzZSIgJiB0bXBfZGYkSGVhbHRoX1N0YXR1cyA9PSAiRmFpciJdCiMgNSw5MzEKc3VtKGNsZWFuZWRDYXRlZ29yaWNhbF9kZiRCTUlDYXRlZ29yeSA9PSAiT2Jlc2UiICYgY2xlYW5lZENhdGVnb3JpY2FsX2RmJEdlbmVyYWxIZWFsdGhTdGF0dXMgPT0gIkZhaXIiKQojIDUsOTMxCgp0bXBfZGYkUGFydGljaXBhbnRzW3RtcF9kZiRCTUkgPT0gIk9iZXNlIiAmIHRtcF9kZiRIZWFsdGhfU3RhdHVzID09ICJHb29kIl0KIyAxMywyMjYKc3VtKGNsZWFuZWRDYXRlZ29yaWNhbF9kZiRCTUlDYXRlZ29yeSA9PSAiT2Jlc2UiICYgY2xlYW5lZENhdGVnb3JpY2FsX2RmJEdlbmVyYWxIZWFsdGhTdGF0dXMgPT0gIkdvb2QiKQojIDEzLDIyNgoKdG1wX2RmJFBhcnRpY2lwYW50c1t0bXBfZGYkQk1JID09ICJPYmVzZSIgJiB0bXBfZGYkSGVhbHRoX1N0YXR1cyA9PSAiVmVyeV9Hb29kIl0KIyAxMSwxNDYKc3VtKGNsZWFuZWRDYXRlZ29yaWNhbF9kZiRCTUlDYXRlZ29yeSA9PSAiT2Jlc2UiICYgY2xlYW5lZENhdGVnb3JpY2FsX2RmJEdlbmVyYWxIZWFsdGhTdGF0dXMgPT0gIlZlcnlfR29vZCIpCiMgMTEsMTQ2Cgp0bXBfZGYkUGFydGljaXBhbnRzW3RtcF9kZiRCTUkgPT0gIk9iZXNlIiAmIHRtcF9kZiRIZWFsdGhfU3RhdHVzID09ICJFeGNlbGxlbnQiXQojIDMsOTMwCnN1bShjbGVhbmVkQ2F0ZWdvcmljYWxfZGYkQk1JQ2F0ZWdvcnkgPT0gIk9iZXNlIiAmIGNsZWFuZWRDYXRlZ29yaWNhbF9kZiRHZW5lcmFsSGVhbHRoU3RhdHVzID09ICJFeGNlbGxlbnQiKQojIDMsOTMwCgoKIyBPYmVzZSB0b3RhbDoKc3VtKDE2MzcsIDU5MzEsIDEzMjI2LCAxMTE0NiwgMzkzMCkKIyAzNSw4NzAKCgpzdW0odG1wX2RmJFBhcnRpY2lwYW50c1t0bXBfZGYkQk1JID09ICJPYmVzZSJdKQojIDM1LDg3MApzdW0oY2xlYW5lZENhdGVnb3JpY2FsX2RmJEJNSUNhdGVnb3J5ID09ICJPYmVzZSIpCiMgMzUsODcwCgpzdW0odG1wX2RmJFBhcnRpY2lwYW50c1t0bXBfZGYkQk1JID09ICJPdmVyd2VpZ2h0Il0pCiMgMzcsOTE2CnN1bShjbGVhbmVkQ2F0ZWdvcmljYWxfZGYkQk1JQ2F0ZWdvcnkgPT0gIk92ZXJ3ZWlnaHQiKQojIDM3LDkxNgoKc3VtKHRtcF9kZiRQYXJ0aWNpcGFudHNbdG1wX2RmJEJNSSA9PSAiSGVhbHRoeV9XZWlnaHQiXSkKIyAzNCwzNTkKc3VtKGNsZWFuZWRDYXRlZ29yaWNhbF9kZiRCTUlDYXRlZ29yeSA9PSAiSGVhbHRoeV9XZWlnaHQiKQojIDM0LDM1OQoKc3VtKHRtcF9kZiRQYXJ0aWNpcGFudHNbdG1wX2RmJEJNSSA9PSAiVW5kZXJ3ZWlnaHQiXSkKIyAxLDY5NwpzdW0oY2xlYW5lZENhdGVnb3JpY2FsX2RmJEJNSUNhdGVnb3J5ID09ICJVbmRlcndlaWdodCIpCiMgMSw2OTcKYGBgCgpgYGB7ciBlY2hvID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRX0KIyBGb3IgdGhlIHBpdm90X2xvbmdlciBjb2RlOgppZiAoIXJlcXVpcmVOYW1lc3BhY2UoInRpZHlyIiwgcXVpZXRseSA9IFRSVUUpKSB7CiAgaW5zdGFsbC5wYWNrYWdlcygidGlkeXIiKQp9CmxpYnJhcnkodGlkeXIpCmBgYAo8YnI+PGJyPgo8Zm9udCBjb2xvcj0ibmF2eSI+PHN0cm9uZz5TdGFja2VkIGJhciBjaGFydCBvZiB0aGUgMTcgdmFyaWFibGVzIHRoYXQgY29udGFpbiAyIGZhY3RvcnMgKFllcywgTm8pOjwvc3Ryb25nPjwvZm9udD4KYGBge3IgZWNobyA9IEZBTFNFfQojIFRoZXNlIHR3byBsaW5lcyBvZiBjb2RlIHJldHJpZXZlIHRob3NlIHZhcmlhYmxlcyB3aXRoIDIgZmFjdG9ycyAod2hpY2ggc2hvdWxkIGNvcnJlc3BvbmQgdG8gWWVzIG9yIE5vIGFuc3dlcnMgb25seSk6CnRtcF9kZiA8LSBjbGVhbmVkQ2F0ZWdvcmljYWxfZGZbICwgMTE6MzBdCnRtcF9kZiA8LSB0bXBfZGZbICwgLWMoMTQsIDE4LCAxOSldCgojIFJlc2hhcGUgdGhlIGRhdGFzZXQgZnJvbSB3aWRlIHRvIGxvbmcgZm9ybWF0CnRtcF9sb25nIDwtIHBpdm90X2xvbmdlcih0bXBfZGYsIGNvbHMgPSBldmVyeXRoaW5nKCksIG5hbWVzX3RvID0gIlZhcmlhYmxlIiwgdmFsdWVzX3RvID0gIlJlc3BvbnNlIikKCiMgQ3JlYXRlIHRoZSBzdGFja2VkIGJhciBjaGFydApnZ3Bsb3QodG1wX2xvbmcsIGFlcyh4ID0gVmFyaWFibGUsIGZpbGwgPSBSZXNwb25zZSkpICsKICBnZW9tX2Jhcihwb3NpdGlvbiA9IHBvc2l0aW9uX3N0YWNrKHJldmVyc2UgPSBUUlVFKSkgKyAgI1JldmVyc2UgdGhlIHN0YWNraW5nIG9yZGVyCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygiWWVzIiA9ICJza3libHVlMyIsICJObyIgPSAiYnJvd240IikpICsgICMgQ3VzdG9tIGNvbG9ycwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSkpICsgICMgUm90YXRlIHgtYXhpcyBsYWJlbHMKICBsYWJzKHRpdGxlID0gIkNvbXBhcmlzb24gb2YgMTcgVmFyaWFibGVzIHdpdGggWWVzL05vIFJlc3BvbnNlcyIsIHggPSAiVmFyaWFibGVzIiwgeSA9ICJQYXJ0aWNpcGFudHMiKSArCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJuYXZ5Ymx1ZSIgLCBoanVzdCA9IDAuNSwgZmFjZSA9ICJib2xkIiwgc2l6ZSA9IDE0KSkgKwogIHRoZW1lKGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChmYWNlID0gImJvbGQuaXRhbGljIikpICsKICB0aGVtZShheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoZmFjZSA9ICJib2xkLml0YWxpYyIpKQoKYGBgCgpgYGB7ciBlY2hvID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRX0KIyBGb3IgdGhlIGdndGV4dHRhYmxlIHRhYmxlczoKaWYgKCFyZXF1aXJlTmFtZXNwYWNlKCJnZ3B1YnIiLCBxdWlldGx5ID0gVFJVRSkpIHsKICBpbnN0YWxsLnBhY2thZ2VzKCJnZ3B1YnIiKQp9CmxpYnJhcnkoZ2dwdWJyKQpgYGAKPGJyPjxicj48YnI+PGJyPgo8Zm9udCBjb2xvcj0ibmF2eSI+PHN0cm9uZz5TaWRlLWJ5LXNpZGUgZnJlcXVlbmN5IHRhYmxlcyBvZiB0aGUgdmFyaWFibGVzICc8ZW0+RUNpZ2FyZXR0ZVVzYWdlU3RhdHVzPC9lbT4nIGFuZCAnPGVtPkNpZ2FyZXR0ZVNtb2tpbmdTdGF0dXM8L2VtPic6PC9zdHJvbmc+PC9mb250PgpgYGB7ciBlY2hvID0gRkFMU0V9CiMgRm9yIHRhYmxlIDEgKEVDaWdhcmV0dGVVc2FnZVN0YXR1cyk6CnRtcF9kZiA8LSBhZ2dyZWdhdGUoeCA9IGNsZWFuZWRDYXRlZ29yaWNhbF9kZiRFQ2lnYXJldHRlVXNhZ2VTdGF0dXMsYnkgPSBsaXN0KGNsZWFuZWRDYXRlZ29yaWNhbF9kZiRFQ2lnYXJldHRlVXNhZ2VTdGF0dXMpLCBGVU4gPSBsZW5ndGggKQoKY29sbmFtZXModG1wX2RmKVtjb2xuYW1lcyh0bXBfZGYpID09ICJHcm91cC4xIl0gPC0gIlN0YXR1cyIKY29sbmFtZXModG1wX2RmKVtjb2xuYW1lcyh0bXBfZGYpID09ICJ4Il0gPC0gIlBhcnRpY2lwYW50cyIKCnRibDAxIDwtIGdndGV4dHRhYmxlKHggPSB0bXBfZGYsIHJvd3MgPSBOVUxMLCB0aGVtZSA9IHR0aGVtZSgibUJsdWUiKSkgJT4lCiAgdGFiX2FkZF90aXRsZSh0ZXh0ID0gIkUtQ2lnYXJldHRlIFVzYWdlIFN0YXR1cyIsIGZhY2UgPSAiYm9sZCIsIHNpemUgPSAxMCwgaGp1c3QgPSAwLCBwYWRkaW5nID0gdW5pdCgxLCAibGluZSIpKQoKIyBGb3IgdGFibGUgMSAoQ2lnYXJldHRlU21va2luZ1N0YXR1cyk6CnRtcF9kZiA8LSBhZ2dyZWdhdGUoeCA9IGNsZWFuZWRDYXRlZ29yaWNhbF9kZiRDaWdhcmV0dGVTbW9raW5nU3RhdHVzLGJ5ID0gbGlzdChjbGVhbmVkQ2F0ZWdvcmljYWxfZGYkQ2lnYXJldHRlU21va2luZ1N0YXR1cyksIEZVTiA9IGxlbmd0aCApCgpjb2xuYW1lcyh0bXBfZGYpW2NvbG5hbWVzKHRtcF9kZikgPT0gIkdyb3VwLjEiXSA8LSAiU3RhdHVzIgpjb2xuYW1lcyh0bXBfZGYpW2NvbG5hbWVzKHRtcF9kZikgPT0gIngiXSA8LSAiUGFydGljaXBhbnRzIgoKdGJsMDIgPC0gZ2d0ZXh0dGFibGUoeCA9IHRtcF9kZiwgcm93cyA9IE5VTEwsIHRoZW1lID0gdHRoZW1lKCJtQmx1ZSIpKSAlPiUKICB0YWJfYWRkX3RpdGxlKHRleHQgPSAiQ2lnYXJldHRlIFNtb2tpbmcgU3RhdHVzIiwgZmFjZSA9ICJib2xkIiwgc2l6ZSA9IDEwLCBoanVzdCA9IC0wLjA1LCBwYWRkaW5nID0gdW5pdCgxLCAibGluZSIpKQoKIyBBcnJhbmdlIHRhYmxlcyBzaWRlIGJ5IHNpZGUKZ2dhcnJhbmdlKHRibDAxLCB0YmwwMiwgbmNvbCA9IDIsIG5yb3cgPSAxKQpgYGAKCjxmb250IGNvbG9yPSJuYXZ5Ij48c3Ryb25nPlRhYmxlIG9mIFAtVmFsdWVzIC0gVG8gYmUgdXNlZCBmb3IgZGV0ZXJtaW5pbmcgdGhlIHN0YXRpc3RpY2FsIHJlbGF0aW9uc2hpcCBvciBhc3NvY2lhdGlvbiBiZXR3ZWVuIHRoZSB0YXJnZXQgdmFyaWFibGUgJzxlbT5IZWFydEF0dGFja0hpc3Rvcnk8L2VtPicgYW5kIG90aGVyIHZhcmlhYmxlczo8L3N0cm9uZz48L2ZvbnQ+CmBgYHtyIGVjaG8gPSBGQUxTRX0KIyBTZWUgdGhlIGRvY3VtZW50IHRpdGxlZCBuaGlzLXN0YXRpc3RpY2FsLWluZmVyZW5jZS5SbWQgZm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBzZWN0aW9uLgoKbm1zIDwtIGMoIlVyYmFuUnVyYWxDbGFzc2lmaWNhdGlvbiIsICJTdXJ2ZXlZZWFyIiwgIkhvdXNlaG9sZFJlZ2lvbiIsICJJbnRlcnZpZXdRdWFydGVyIiwgIkludGVydmlld01vbnRoIiwgIlNhbXBsZUFkdWx0U2V4IiwgIlNhbXBsZUFkdWx0QWdlIiwgIlJhY2VFdGhuaWNpdHkiLCAiRWR1Y2F0aW9uTGV2ZWwiLCAiR2VuZXJhbEhlYWx0aFN0YXR1cyIsICJIeXBlcnRlbnNpb25IaXN0b3J5IiwgIkhpZ2hDaG9sZXN0ZXJvbEhpc3RvcnkiLCAiQ29yb25hcnlIZWFydERpc2Vhc2VIaXN0b3J5IiwgIkFuZ2luYUhpc3RvcnkiLCAiU3Ryb2tlSGlzdG9yeSIsICJBc3RobWFIaXN0b3J5IiwgIkNhbmNlckhpc3RvcnkiLCAiRGlhYmV0ZXNIaXN0b3J5IiwgIkNock9ic1B1bG1EaXNIaXN0b3J5IiwgIkFydGhyaXRpc0hpc3RvcnkiLCAiRGVtZW50aWFIaXN0b3J5IiwgIkFueGlldHlEaXNvcmRlckhpc3RvcnkiLCAiRGVwcmVzc2lvbkhpc3RvcnkiLCAiQk1JQ2F0ZWdvcnkiLCAiU21va2VsZXNzVG9iYWNjb1VzYWdlIiwgIlBpcGVUb2JhY2NvVXNhZ2UiLCAiQ2lnYXJVc2FnZSIsICJFQ2lnYXJldHRlVXNhZ2VTdGF0dXMiLCAiQ2lnYXJldHRlU21va2luZ1N0YXR1cyIpCgpwVmFsdWVzIDwtIGMoIjwgMi4yZS0xNiIsICI9IDAuODMxOSIsICI8IDIuMmUtMTYiLCAiPSAwLjExMDgiLCAiPSAwLjE3MyIsICI8IDIuMmUtMTYiLCAiPCAyZS0xNiIsICI8IDIuMmUtMTYiLCAiPCAyLjJlLTE2IiwgIjwgMi4yZS0xNiIsICI8IDIuMmUtMTYiLCAiPCAyLjJlLTE2IiwgIjwgMi4yZS0xNiIsICI8IDIuMmUtMTYiLCAiPCAyLjJlLTE2IiwgIj0gMC4wMDAzMjk0IiwgIjwgMi4yZS0xNiIsICI8IDIuMmUtMTYiLCAiPCAyLjJlLTE2IiwgIjwgMi4yZS0xNiIsICI8IDIuMmUtMTYiLCAiPSAzLjM1OWUtMTAiLCAiPCAyLjJlLTE2IiwgIjwgMi4yZS0xNiIsICI9IDYuMDdlLTEyIiwgIjwgMi4yZS0xNiIsICI8IDIuMmUtMTYiLCAiPSA2Ljc2MmUtMTAiLCAiPCAyLjJlLTE2IikKCnRtcF9tdHJ4IDwtIG1hdHJpeChkYXRhID0gYyhubXMsIHBWYWx1ZXMpLCBucm93ID0gMjksIG5jb2wgPSAyKQpjb2xuYW1lcyh0bXBfbXRyeCkgPC0gYygiVmFyaWFibGUiLCAiUC1WYWx1ZXMiKQoKdG1wX210cngKYGBgCgpgYGB7ciBlY2hvID0gRkFMU0V9CiMgImNsZWFuZWRDYXRlZ29yaWNhbF9kZiIgTUlOVVMgIlN1cnZleVllYXIiLCAiSW50ZXJ2aWV3UXVhcnRlciIsIGFuZCAiSW50ZXJ2aWV3TW9udGgiOgp0b0tlZXAgPC0gYygiVXJiYW5SdXJhbENsYXNzaWZpY2F0aW9uIiwiSG91c2Vob2xkUmVnaW9uIiwgIlNhbXBsZUFkdWx0U2V4IiwgIlNhbXBsZUFkdWx0QWdlIiwgIlJhY2VFdGhuaWNpdHkiLCAiRWR1Y2F0aW9uTGV2ZWwiLCAiR2VuZXJhbEhlYWx0aFN0YXR1cyIsICJIeXBlcnRlbnNpb25IaXN0b3J5IiwgIkhpZ2hDaG9sZXN0ZXJvbEhpc3RvcnkiLCAiQ29yb25hcnlIZWFydERpc2Vhc2VIaXN0b3J5IiwgIkFuZ2luYUhpc3RvcnkiLCAiU3Ryb2tlSGlzdG9yeSIsICJBc3RobWFIaXN0b3J5IiwgIkNhbmNlckhpc3RvcnkiLCAiRGlhYmV0ZXNIaXN0b3J5IiwgIkNock9ic1B1bG1EaXNIaXN0b3J5IiwgIkFydGhyaXRpc0hpc3RvcnkiLCAiRGVtZW50aWFIaXN0b3J5IiwgIkFueGlldHlEaXNvcmRlckhpc3RvcnkiLCAiRGVwcmVzc2lvbkhpc3RvcnkiLCAiQk1JQ2F0ZWdvcnkiLCAiU21va2VsZXNzVG9iYWNjb1VzYWdlIiwgIlBpcGVUb2JhY2NvVXNhZ2UiLCAiQ2lnYXJVc2FnZSIsICJFQ2lnYXJldHRlVXNhZ2VTdGF0dXMiLCAiQ2lnYXJldHRlU21va2luZ1N0YXR1cyIsIkhlYXJ0QXR0YWNrSGlzdG9yeSIpCgpkZl9zaWduaWZpY2FuY2UgPC0gY2xlYW5lZENhdGVnb3JpY2FsX2RmWyAsIHRvS2VlcF0KCiMgUiBEYXRhIFNlcmlhbGl6YXRpb24gKC5yZHMpIGZvcm1hdDoKIwojIFNhdmU6IHNhdmVSRFMob2JqZWN0LCBmaWxlID0gImZpbGUucmRzIikKIyBMb2FkOiByZWFkUkRTKCJmaWxlLnJkcyIpIChyZXR1cm5zIHRoZSBvYmplY3QsIHdoaWNoIHlvdSBjYW4gYXNzaWduIHRvIGEgdmFyaWFibGUpCiMKc2F2ZVJEUyhvYmplY3QgPSBkZl9zaWduaWZpY2FuY2UsIGZpbGUgPSAiZmVhdXR1cmVzRm9yTW9kZWxpbmcucmRzIikKYGBgCgpgYGB7ciBlY2hvID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRX0KIyBJIGFtIHVzaW5nIHRoaXMgaW4gb3JkZXIgdG8gY2xlYW4gc3BhY2Ugd2hpbGUgdXNpbmcgbXVsdGlwbGUgUiBOb3RlYm9vayBvciBSIE1hcmtkb3duLiBUaGlzIG1pZ2h0IG5vdCBiZSBuZWNlc3NhcnkgaWYgeW91IGhhdmUKIyBlbm91Z2ggbWVtb3J5IHRvIGhhbmRsZSB3aGF0IHlvdSBhcmUgZG9pbmcuCiMKIyBEbyB0aGlzIGF0IHRoZSBlbmQgb2YgdGhlIGNvZGUgb25seS4KIwojIFlvdSBtaWdodCBuZWVkIHRvIGRpc2FibGUgdGhpcyB3aGlsZSB3b3JraW5nIHNvIHlvdSBkb24ndCBjbGVhciB5b3VyIGRhdGEgKGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMpLiBGb3IgdGhpcyB1c2UgZXZhbD1GQUxTRSBpbiB0aGUgUiBjb2RlIHNlY3Rpb24ncyBoZWFkZXIgbGlrZSB0aGlzOiAKIwojICAgICAgICAgICAgICAgICAgICAgICAgICAge3IgZWNobyA9IEZBTFNFLCBldmFsID0gRkFMU0V9CiMKIyBVc2UgbHMoKSBvciBvYmplY3RzKCkgaW4gb3JkZXIgdG8gc2VlIHRoZSBsaXN0IG9mIHRoZSBkYXRhIHNhdmVkIGluIG1lbW9yeS4KIwpybSh0YmwwMSkKcm0odGJsMDIpCnJtKHExX2RmKQpybShxMl9kZikKcm0ocTNfZGYpCnJtKHE0X2RmKQpybSh0bXBfZGYpCnJtKGNsZWFuZWRDYXRlZ29yaWNhbF9kZikKcm0oZGVmYXVsdF9wYXIsIGV0aXF1ZXRhcywgZXRpcXVldGFzMDEsIGV0aXF1ZXRhczAyLCBsdmxzX2luZm9ybWF0aW9uLCBub21icmVzLCBub21icmVzMDEsIG5vbWJyZXMwMiwgcG9yY2VudGFqZSwgcG9yY2VudGFqZTAxLCBwb3JjZW50YWplMDIsIHRtcF9sb25nLCBubXMsIHBWYWx1ZXMsIHRtcF9tdHJ4LCBhZGRpdGlvbmFsX2xhYmVsLCB0b3RhbF9wYXJ0aWNpcGFudHMsIHRvS2VlcCkKcm0oZGZfc2lnbmlmaWNhbmNlKQpgYGAKCg==