1. Building Model

Model Functions

Example

Below is an example of a model on 10000 population with a tranmission rate = 2/10000, 5 initial infected inidividual, 50% susceptible rate, 5% hospitalization rate, recovery rate for both hospitalized and non-hospitalized individuals are 90%, time spend in hospital is 10 days, and strict quarantine is applied.

Running 10 simulations to show randomness and variability

2. Factorial Experiment Design

Response Variable: Total Death Proportion

ANOVA result
                                                  Df Sum Sq Mean Sq   F value   Pr(>F)    
Beta                                               1 0.0096  0.0096 6.075e+03  < 2e-16 ***
HospitalizationRate                                2 0.0000  0.0000 1.047e+01 2.93e-05 ***
HospitalizedRecoveryRate                           1 0.0041  0.0041 2.614e+03  < 2e-16 ***
NonHospitalizedRecoveryRate                        1 0.3296  0.3296 2.085e+05  < 2e-16 ***
InfectionTime                                      1 0.0092  0.0092 5.803e+03  < 2e-16 ***
Beta:HospitalizationRate                           2 0.0001  0.0000 1.691e+01 5.01e-08 ***
Beta:HospitalizedRecoveryRate                      1 0.0000  0.0000 1.882e+01 1.48e-05 ***
Beta:NonHospitalizedRecoveryRate                   1 0.0008  0.0008 5.231e+02  < 2e-16 ***
HospitalizationRate:HospitalizedRecoveryRate       2 0.0006  0.0003 2.011e+02  < 2e-16 ***
Beta:InfectionTime                                 1 0.0095  0.0095 5.993e+03  < 2e-16 ***
HospitalizationRate:NonHospitalizedRecoveryRate    2 0.0007  0.0004 2.279e+02  < 2e-16 ***
HospitalizationRate:InfectionTime                  2 0.0000  0.0000 9.243e+00 9.98e-05 ***
HospitalizedRecoveryRate:InfectionTime             1 0.0000  0.0000 6.906e+00  0.00864 ** 
NonHospitalizedRecoveryRate:InfectionTime          1 0.0007  0.0007 4.629e+02  < 2e-16 ***
Residuals                                       2860 0.0045  0.0000                       
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Call:
lm(formula = DeathProportion ~ Beta + HospitalizationRate + HospitalizedRecoveryRate + 
    NonHospitalizedRecoveryRate + InfectionTime + Beta:HospitalizationRate + 
    Beta:HospitalizedRecoveryRate + Beta:NonHospitalizedRecoveryRate + 
    HospitalizationRate:HospitalizedRecoveryRate + Beta:InfectionTime + 
    HospitalizationRate:HospitalizedRecoveryRate + HospitalizationRate:NonHospitalizedRecoveryRate + 
    HospitalizationRate:InfectionTime + HospitalizedRecoveryRate:InfectionTime + 
    NonHospitalizedRecoveryRate:InfectionTime, data = result_table)

Residuals:
       Min         1Q     Median         3Q        Max 
-0.0058695 -0.0006401  0.0000296  0.0006535  0.0058347 

Coefficients:
                                                          Estimate Std. Error  t value Pr(>|t|)    
(Intercept)                                              4.137e-02  1.048e-04  394.832  < 2e-16 ***
Beta4                                                    8.246e-03  1.148e-04   71.843  < 2e-16 ***
HospitalizationRate0.10                                 -3.690e-04  1.283e-04   -2.876  0.00406 ** 
HospitalizationRate0.15                                 -9.132e-04  1.283e-04   -7.117 1.39e-12 ***
HospitalizedRecoveryRate0.95                            -9.162e-04  1.048e-04   -8.744  < 2e-16 ***
NonHospitalizedRecoveryRate0.95                         -2.053e-02  1.048e-04 -195.899  < 2e-16 ***
InfectionTime5                                           8.100e-03  1.148e-04   70.569  < 2e-16 ***
Beta4:HospitalizationRate0.10                            2.636e-04  1.148e-04    2.296  0.02172 *  
Beta4:HospitalizationRate0.15                            6.629e-04  1.148e-04    5.775 8.52e-09 ***
Beta4:HospitalizedRecoveryRate0.95                      -4.066e-04  9.372e-05   -4.338 1.48e-05 ***
Beta4:NonHospitalizedRecoveryRate0.95                   -2.143e-03  9.372e-05  -22.871  < 2e-16 ***
HospitalizationRate0.10:HospitalizedRecoveryRate0.95    -1.157e-03  1.148e-04  -10.084  < 2e-16 ***
HospitalizationRate0.15:HospitalizedRecoveryRate0.95    -2.302e-03  1.148e-04  -20.054  < 2e-16 ***
Beta4:InfectionTime5                                    -7.255e-03  9.372e-05  -77.417  < 2e-16 ***
HospitalizationRate0.10:NonHospitalizedRecoveryRate0.95  1.176e-03  1.148e-04   10.244  < 2e-16 ***
HospitalizationRate0.15:NonHospitalizedRecoveryRate0.95  2.450e-03  1.148e-04   21.344  < 2e-16 ***
HospitalizationRate0.10:InfectionTime5                   1.960e-04  1.148e-04    1.708  0.08777 .  
HospitalizationRate0.15:InfectionTime5                   4.902e-04  1.148e-04    4.271 2.01e-05 ***
HospitalizedRecoveryRate0.95:InfectionTime5             -2.463e-04  9.372e-05   -2.628  0.00864 ** 
NonHospitalizedRecoveryRate0.95:InfectionTime5          -2.016e-03  9.372e-05  -21.514  < 2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.001257 on 2860 degrees of freedom
Multiple R-squared:  0.9878,    Adjusted R-squared:  0.9877 
F-statistic: 1.216e+04 on 19 and 2860 DF,  p-value: < 2.2e-16
Main Effects Plot
Interaction Effects Plot

Response Variable: Total Infected Proportion

ANOVA result
Main Effects Plot
Interaction Effects Plot

Response Variable: Maximum New Case Proportion

ANOVA result
Main Effects Plot
Interaction Effects Plot

Response Variable: Max Hospitalized Proportion

ANOVA result
Main Effects Plot
Interaction Effects Plot
LS0tCnRpdGxlOiAiSW5mZWN0aW91cyBEaXNlYXNlIE1vZGVsaW5nIgphdXRob3I6ICJMaW5oIFRhbmcsIEJyaXRuZXkgSGUsIEJvd2VuIE1pbmNlIgpkYXRlOiAiMTIvMTEvMjAyMCIKb3V0cHV0OiAKICBodG1sX25vdGVib29rOgogICAgY29kZV9mb2xkaW5nOiBoaWRlCi0tLQoKYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9CmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gRkFMU0UsIG1lc3NhZ2UgPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFKQpsaWJyYXJ5KGRwbHlyKQpsaWJyYXJ5KGdncGxvdDIpCmBgYAoKIyMjIDEuIEJ1aWxkaW5nIE1vZGVsCgojIyMgTW9kZWwgRnVuY3Rpb25zCgpgYGB7ciBmdW5jfQojIFNpbXVsYXRlIERhdGEKbW9kZWwuZGF0YSA9IGZ1bmN0aW9uKE4sIGJldGEsIEkuMCwgcCwgZXBzaWxvbiwgdGhldGEsIGdhbW1hLCBUaW1lSCwgVGltZU5IKXsKICBJLnJhdGUgPSBiZXRhL04KICBwc2kgPSAxL1RpbWVICiAgbGFtYmRhID0gMS9UaW1lTkgKICBjdXJyLmRheSA9IDAKICBTID0gcCAqIE4gLSBJLjAKICBOUy4wID0gTiAtIFMgLSBJLjAKICBOUyA9IE5TLjAKICBOZXdJbmZlY3RlZCA9IEkuMAogIFRvdGFsLkhvc3BpdGFsID0gMAogIFRvdGFsLk5vbkhvc3BpdGFsID0gMAogIFRvdGFsLkluZmVjdGVkID0gTmV3SW5mZWN0ZWQgKyBUb3RhbC5Ib3NwaXRhbCArIFRvdGFsLk5vbkhvc3BpdGFsCiAgVG90YWwuSW5mZWN0aXZlID0gTmV3SW5mZWN0ZWQgKyBUb3RhbC5Ob25Ib3NwaXRhbAogIEhvc3BpdGFsLlJlY292ZXJlZCA9IDAKICBOb25Ib3NwaXRhbC5SZWNvdmVyZWQgPSAwCiAgSG9zcGl0YWwuRGVhZCA9IDAKICBOb25Ib3NwaXRhbC5EZWFkID0gMAogIFRvdGFsLlJlY292ZXJlZCA9IEhvc3BpdGFsLlJlY292ZXJlZCArIE5vbkhvc3BpdGFsLlJlY292ZXJlZAogIFRvdGFsLkRlYWQgPSBIb3NwaXRhbC5EZWFkICsgTm9uSG9zcGl0YWwuRGVhZAogIFBvcCA9IFMgKyBOUyArIFRvdGFsLkluZmVjdGVkICsgVG90YWwuRGVhZAogIExlYXZpbmcuSG9zcGl0YWwgPSAwCiAgTGVhdmluZy5Ob25Ib3NwaXRhbCA9IDAKICBSZWNvdmVyZWQuSG9zcGl0YWwudG9kYXkgPSAwCiAgUmVjb3ZlcmVkLk5vbkhvc3BpdGFsLnRvZGF5ID0gMAogIEVudGVyaW5nLkhvc3BpdGFsID0gMAogIAogICMgSWYgeW91IHdhbnQgYSBmdWxsIHRhYmxlIGxpa2UgdGhlIGV4Y2VsLCB1bmNvbW1lbnQgYWxsIGxpbmVzIGluIHRoZSBkZiBiZWxvdwogIGRmID0gZGF0YV9mcmFtZShEYXkgPSBjdXJyLmRheSwKICAgICAgICAgICAgICAgICAgU3VzY2VwdGlibGUgPSBTLAogICAgICAgICAgICAgICAgICBOb24uU3VzY2VwdGlibGUgPSBOUywKICAgICAgICAgICAgICAgICAgRGFpbHkuTmV3LkNhc2UgPSBOZXdJbmZlY3RlZCwKICAgICAgICAgICAgICAgICAgVG90YWwuSW4uSG9zcGl0YWwgPSBUb3RhbC5Ib3NwaXRhbCwKICAgICAgICAgICAgICAgICAgIyBUb3RhbC5Ob25Ib3NwaXRhbCA9IFRvdGFsLk5vbkhvc3BpdGFsLAogICAgICAgICAgICAgICAgICBJbmZlY3RlZCA9IFRvdGFsLkluZmVjdGVkLAogICAgICAgICAgICAgICAgICAjIFRvdGFsLkluZmVjdGl2ZSA9IFRvdGFsLkluZmVjdGl2ZSwKICAgICAgICAgICAgICAgICAgIyBSZWNvdmVyZWQuSW4uSG9zcGl0YWwgPSBIb3NwaXRhbC5SZWNvdmVyZWQsCiAgICAgICAgICAgICAgICAgICMgRGVhZC5Jbi5Ib3NwaXRhbCA9IEhvc3BpdGFsLkRlYWQsCiAgICAgICAgICAgICAgICAgIFRvdGFsLlJlY292ZXJlZCA9IFRvdGFsLlJlY292ZXJlZCwKICAgICAgICAgICAgICAgICAgVG90YWwuRGVhZCA9IFRvdGFsLkRlYWQpCiAgCiAgIyBXYXRjaCB0aGUgZGlzZWFzZSB1bnRpbCBpdCBlbmRzIChkYWlseSBuZXcgY2FzZSA9IDApIG9yIGF0IG1heCAyMDAgZGF5cwogIHdoaWxlKFRvdGFsLkluZmVjdGVkID4gMCAmIGN1cnIuZGF5IDwgMTAwMCl7CiAgICBjdXJyLmRheSA9IGN1cnIuZGF5ICsgMQogICAgCiAgICAjIE51bWJlciBvZiBpbmRpdmlkdWFscyByZWNvdmVyZWQgZnJvbSB0aGUgaW5mZWN0ZWQgaW4gaG9zcGl0YWwgKHByZXZpb3VzIGRheSkKICAgICMgRmlyc3QgbmVlZCB0byBzZWUgaG93IG1hbnkgYXJlIGxlYXZpbmcgdGhlIGhvc3BpdGFsCiAgICBMZWF2aW5nLkhvc3BpdGFsID0gcmJpbm9tKDEsIFRvdGFsLkhvc3BpdGFsLCBwc2kpCiAgICAjIFRoZW4gaG93IG1hbnkgb2YgdGhvc2UgcmVjb3ZlcmVkCiAgICBSZWNvdmVyZWQuSG9zcGl0YWwudG9kYXkgPSByYmlub20oMSwgTGVhdmluZy5Ib3NwaXRhbCwgdGhldGEpCiAgICBIb3NwaXRhbC5SZWNvdmVyZWQgPSBIb3NwaXRhbC5SZWNvdmVyZWQgKyBSZWNvdmVyZWQuSG9zcGl0YWwudG9kYXkKICAgIEhvc3BpdGFsLkRlYWQgPSBIb3NwaXRhbC5EZWFkICsgTGVhdmluZy5Ib3NwaXRhbCAtIFJlY292ZXJlZC5Ib3NwaXRhbC50b2RheQogICAgCiAgICAjIE51bWJlciBvZiBpbmRpdmlkdWFscyBkZWFkIGZyb20gdGhlIGluZmVjdGVkIGluIGhvc3BpdGFsIChwcmV2aW91cyBkYXkpCiAgICAjIEZpcnN0IG5lZWQgdG8gc2VlIGhvdyBtYW55IG5vdCBpbiBob3NwaXRhbCBhcmUgZ2V0dGluZyBvdmVyIGRpc2Vhc2UKICAgIE5vbkhvc3BpdGFsLmxlYXZpbmcgPSByYmlub20oMSwgVG90YWwuTm9uSG9zcGl0YWwsIGxhbWJkYSkKICAgICMgSG93IG1hbnkgb2YgdGhvc2UgYXJlIHJlY292ZXJpbmcKICAgIFJlY292ZXJlZC5Ob25Ib3NwaXRhbC50b2RheSA9IHJiaW5vbSgxLCBOb25Ib3NwaXRhbC5sZWF2aW5nLCBnYW1tYSkKICAgIE5vbkhvc3BpdGFsLlJlY292ZXJlZCA9IE5vbkhvc3BpdGFsLlJlY292ZXJlZCArIFJlY292ZXJlZC5Ob25Ib3NwaXRhbC50b2RheQogICAgTm9uSG9zcGl0YWwuRGVhZCA9IE5vbkhvc3BpdGFsLkRlYWQgKyBOb25Ib3NwaXRhbC5sZWF2aW5nIC0gUmVjb3ZlcmVkLk5vbkhvc3BpdGFsLnRvZGF5CiAgICAKICAgICMgVG90YWwgbnVtYmVyIG9mIHJlY292ZXJlZCBvciBkZWFkIHNvIGZhciAoY3VtdWxhdGl2ZSkKICAgIFRvdGFsLlJlY292ZXJlZCA9IEhvc3BpdGFsLlJlY292ZXJlZCArIE5vbkhvc3BpdGFsLlJlY292ZXJlZAogICAgVG90YWwuRGVhZCA9IEhvc3BpdGFsLkRlYWQgKyBOb25Ib3NwaXRhbC5EZWFkCiAgICAKICAgICMgTnVtYmVyIG9mIGluZGl2aWR1YWxzIGhvc3BpdGFsaXplZCBmcm9tIHRoZSBpbmZlY3RlZCBpbiB0aGUgcHJldmlvdXMgZGF5CiAgICBFbnRlcmluZy5Ib3NwaXRhbCA9IHJiaW5vbSgxLCBOZXdJbmZlY3RlZCwgZXBzaWxvbikKICAgIFRvdGFsLkhvc3BpdGFsID0gIEVudGVyaW5nLkhvc3BpdGFsICsgVG90YWwuSG9zcGl0YWwgLSBMZWF2aW5nLkhvc3BpdGFsCiAgICBUb3RhbC5Ob25Ib3NwaXRhbCA9IE5ld0luZmVjdGVkICsgVG90YWwuTm9uSG9zcGl0YWwgLSBFbnRlcmluZy5Ib3NwaXRhbCAtIE5vbkhvc3BpdGFsLmxlYXZpbmcKICAgIAogICAgIyBOZXdseSBpbmZlY3RlZCBjYXNlIHRvZGF5IGFuZCB0b3RhbCBhY3RpdmVseSBpbmZlY3RlZCBzbyBmYXIKICAgIE5ld0luZmVjdGVkID0gbWluKFMsIHJiaW5vbSgxLCBTICogVG90YWwuSW5mZWN0aXZlLCBJLnJhdGUpKQogICAgVG90YWwuSW5mZWN0ZWQgPSBOZXdJbmZlY3RlZCArIFRvdGFsLkhvc3BpdGFsICsgVG90YWwuTm9uSG9zcGl0YWwKICAgIAogICAgIyBTdXNjZXB0aWJsZSBwb3B1bGF0aW9uIGxlZnQKICAgIFMgPSBTIC0gTmV3SW5mZWN0ZWQKICAgIAogICAgIyBDdXJyZW50IG5vbi1zdXNjZXB0aWJsZSBncm91cAogICAgTlMgPSBOUy4wICsgVG90YWwuUmVjb3ZlcmVkCiAgICAKICAgICMgSW5mZWN0aXZlIGdyb3VwIHRoYXQgY2FuIHNwcmVhZCB0aGUgZGlzZWFzZSB0aGUgbmV4dCBkYXkKICAgIFRvdGFsLkluZmVjdGl2ZSA9IE5ld0luZmVjdGVkICsgVG90YWwuTm9uSG9zcGl0YWwKICAgIAogICAgIyBDb25maXJtIHBvcHVsYXRpb24KICAgIFBvcCA9IFMgKyBOUyArIFRvdGFsLkluZmVjdGVkICsgVG90YWwuRGVhZAogICAgCiAgICAjIElmIHlvdSB3YW50IGEgZnVsbCB0YWJsZSBsaWtlIHRoZSBleGNlbCwgdW5jb21tZW50IHRoaXMKICAgICMgZGF0YSA9IGMoY3Vyci5kYXksIFMsIE5TLCBOZXdJbmZlY3RlZCwgVG90YWwuSG9zcGl0YWwsIFRvdGFsLk5vbkhvc3BpdGFsLCBUb3RhbC5JbmZlY3RlZCwgVG90YWwuSW5mZWN0aXZlLCBIb3NwaXRhbC5SZWNvdmVyZWQsIEhvc3BpdGFsLkRlYWQsIFRvdGFsLlJlY292ZXJlZCwgVG90YWwuRGVhZCwgUG9wKQogICAgZGF0YSA9IGMoY3Vyci5kYXksIFMsIE5TLCBOZXdJbmZlY3RlZCwgVG90YWwuSG9zcGl0YWwsIFRvdGFsLkluZmVjdGVkLCBUb3RhbC5SZWNvdmVyZWQsIFRvdGFsLkRlYWQpCiAgICBkZiA9IHJiaW5kKGRmLCBkYXRhKQogIH0KICByZXR1cm4oZGYpCn0KCiMgUGxvdCBvdXQgdGhlIGV2b2x1dGlvbiBvdmVyIHRpbWUKbW9kZWwucGxvdCA9IGZ1bmN0aW9uKGRhdGEpewogIHAgPSBnZ3Bsb3QoZGF0YSAgPSBkYXRhLCBhZXMoeCA9IERheSkpICsKICAgICAgICBnZW9tX2xpbmUoYWVzKHkgPSBTdXNjZXB0aWJsZSwgY29sb3IgPSAiU3VzY2VwdGlibGUiKSkgKwogICAgICAgIGdlb21fbGluZShhZXMoeSA9IERhaWx5Lk5ldy5DYXNlLCBjb2xvciA9ICJEYWlseSBOZXcgQ2FzZSIpKSArCiAgICAgICAgZ2VvbV9saW5lKGFlcyh5ID0gSW5mZWN0ZWQsIGNvbG9yID0gIkluZmVjdGVkIikpICsKICAgICAgICBnZW9tX2xpbmUoYWVzKHkgPSBUb3RhbC5Jbi5Ib3NwaXRhbCwgY29sb3IgPSAiQ3VycmVudGx5IEluIEhvc3BpdGFsIikpICsKICAgICAgICBnZW9tX2xpbmUoYWVzKHkgPSBUb3RhbC5SZWNvdmVyZWQsIGNvbG9yID0gIlRvdGFsIFJlY292ZXJkIikpICsKICAgICAgICBnZW9tX2xpbmUoYWVzKHkgPSBUb3RhbC5EZWFkLCBjb2xvciA9ICJUb3RhbCBEZWFkIikpICsKICAgICAgICBzY2FsZV9jb2xvcl9kaXNjcmV0ZShuYW1lID0gIkNvbXBhcnRtZW50IikgKwogICAgICAgIGxhYnMoeSA9ICJQb3B1bGF0aW9uIiwgdGl0bGUgPSAiU0lIUkQgTW9kZWwiKSArIAogICAgICAgIHRoZW1lX21pbmltYWwoKQogIHJldHVybihwKQp9CgojIEV4dHJhY3QgaW5mbyBmcm9tIHRoZSBkYXRhCm1vZGVsLmluZm8gPSBmdW5jdGlvbihkYXRhKXsKICBMYXN0LkRheSA9IG5yb3coZGF0YSkKICBTdGF0dXMgPSBpZmVsc2UoZGF0YVtMYXN0LkRheSxdJERhaWx5Lk5ldy5DYXNlID09IDAsICJFbmRlZCIsICJHb2luZyIpCiAgVG90YWwuRGVhdGggPSBkYXRhW0xhc3QuRGF5LF0kVG90YWwuRGVhZAogIFRvdGFsLkluZmVjdGVkID0gc3VtKGRhdGEkRGFpbHkuTmV3LkNhc2UpCiAgTWF4Lk5ldy5DYXNlID0gbWF4KGRhdGEkRGFpbHkuTmV3LkNhc2UpCiAgUGVhay5EYXkuTmV3LkNhc2UgPSBkYXRhW2RhdGEkRGFpbHkuTmV3LkNhc2UgPT0gTWF4Lk5ldy5DYXNlLF0kRGF5CiAgTWF4LkluLkhvc3BpdGFsID0gbWF4KGRhdGEkVG90YWwuSW4uSG9zcGl0YWwpCiAgUGVhay5EYXkuSG9zcGl0YWw9IGRhdGFbZGF0YSRUb3RhbC5Jbi5Ib3NwaXRhbCA9PSBNYXguSW4uSG9zcGl0YWwsXSREYXkKICBpbmZvID0gYyhMYXN0LkRheSwgU3RhdHVzLCBUb3RhbC5EZWF0aCwgVG90YWwuSW5mZWN0ZWQsIE1heC5OZXcuQ2FzZSwgUGVhay5EYXkuTmV3LkNhc2UsIE1heC5Jbi5Ib3NwaXRhbCwgUGVhay5EYXkuSG9zcGl0YWwpCiAgcmV0dXJuKGluZm8pCn0KCiMgQ29uZmlybSB0aGUgbW9kZWwgYnkgY2FsY3VsYXRpbmcgdGhhdCBhbGwgY29tcGFydG1lbnRzIHN1bSB0byBwb3B1bGF0aW9uIGF0IGFueSBkYXkKbW9kZWwuY29uZmlybSA9IGZ1bmN0aW9uKGRhdGEpewogIGRhdGEkUG9wID0gZGF0YSRTICsgZGF0YSROUyArIGRhdGEkVG90YWwuSW5mZWN0ZWQgKyBkYXRhJFRvdGFsLkRlYWQKICByZXR1cm4oZGF0YSkKfQoKIyBDb21iaW5lIGFsbCBmdW5jdGlvbnMKU0lIUkQubW9kZWwgPSBmdW5jdGlvbihOLCBiZXRhLCBJLjAsIHAsIGVwc2lsb24sIHRoZXRhLCBnYW1tYSwgVGltZUgsIFRpbWVOSCl7CiAgcGFyYW0gPSBjKE4sIGJldGEsIGVwc2lsb24sIHRoZXRhLCBnYW1tYSwgVGltZUgsIFRpbWVOSCkKICBkYXRhID0gbW9kZWwuZGF0YShOLCBiZXRhLCBJLjAsIHAsIGVwc2lsb24sIHRoZXRhLCBnYW1tYSwgVGltZUgsIFRpbWVOSCkKICBwbG90ID0gbW9kZWwucGxvdChkYXRhKQogIHJlc3VsdF9pbmZvID0gbW9kZWwuaW5mbyhkYXRhKQogIGluZm8gPSBjKHBhcmFtLCByZXN1bHRfaW5mbykKICByZXR1cm4obGlzdChkYXRhLHBsb3QsaW5mbykpCn0KCiMgSGVscGVyIGZ1bmN0aW9uIGZvciBzdHJpbmcgd3JhcHBpbmcgaW4gZmFjZXQgcGxvdHMsIGRlZmF1bHQgaXMgMTIgY2hhcmFjdGVycwpzd3IgPSBmdW5jdGlvbihzdHJpbmcsIG53cmFwPTEyKSB7CiAgcGFzdGUoc3Ryd3JhcChzdHJpbmcsIHdpZHRoPW53cmFwKSwgY29sbGFwc2U9IlxuIikKfQpzd3IgPSBWZWN0b3JpemUoc3dyKQpgYGAKCiMjIyBFeGFtcGxlCgpCZWxvdyBpcyBhbiBleGFtcGxlIG9mIGEgbW9kZWwgb24gMTAwMDAgcG9wdWxhdGlvbiB3aXRoIGEgdHJhbm1pc3Npb24gcmF0ZSA9IDIvMTAwMDAsIDUgaW5pdGlhbCBpbmZlY3RlZCBpbmlkaXZpZHVhbCwgNTAlIHN1c2NlcHRpYmxlIHJhdGUsIDUlIGhvc3BpdGFsaXphdGlvbiByYXRlLCByZWNvdmVyeSByYXRlIGZvciBib3RoIGhvc3BpdGFsaXplZCBhbmQgbm9uLWhvc3BpdGFsaXplZCBpbmRpdmlkdWFscyBhcmUgOTAlLCB0aW1lIHNwZW5kIGluIGhvc3BpdGFsIGlzIDEwIGRheXMsIGFuZCBzdHJpY3QgcXVhcmFudGluZSBpcyBhcHBsaWVkLgoKYGBge3IgZXhhbXBsZX0KdGVzdC5tb2RlbCA9IFNJSFJELm1vZGVsKDEwMDAwLCAyLCA1LCAwLjUsIDAuMDUsIDAuOSwgMC45LCAxMCwgMSkKIyBkYXRhCnRlc3QubW9kZWxbWzJdXQojIGdyYXBoCnRlc3QubW9kZWxbWzJdXQojIHN1bW1hcnkKbW9kZWwuc3VtbWFyeSA9IGNiaW5kKGMoIlBvcHVsYXRpb24iLCAiQmV0YSIsICJIb3NwaXRhbGl6YXRpb25SYXRlIiwgIkhvc3BpdGFsaXplZFJlY292ZXJ5UmF0ZSIsICJOb25Ib3NwaXRhbGl6ZWRSZWNvdmVyeVJhdGUiLCAiSG9zcGl0YWxpemF0aW9uVGltZSIsICJJbmZlY3Rpb25UaW1lIiksIHRlc3QubW9kZWxbWzNdXVsxOjddLCBjKCJMYXN0RGF5IiwgIlN0YXR1cyIsICJUb3RhbERlYXRoIiwgIlRvdGFsSW5mZWN0ZWQiLCAiTWF4TmV3Q2FzZSIsICJQZWFrRGF5TmV3Q2FzZSIsICJNYXhJbkhvc3BpdGFsIiwgIlBlYWtEYXlIb3NwaXRhbCIpLCB0ZXN0Lm1vZGVsW1szXV1bODoxNV0pCm1vZGVsLnN1bW1hcnkgPSBhcy5kYXRhLmZyYW1lKG1vZGVsLnN1bW1hcnkpCmNvbG5hbWVzKG1vZGVsLnN1bW1hcnkpID0gYygiUGFyYW1ldGVyIiwgIlZhbHVlIiwgIlJlc3VsdCIsICJWYWx1ZSIpCm1vZGVsLnN1bW1hcnkKYGBgCgojIFJ1bm5pbmcgMTAgc2ltdWxhdGlvbnMgdG8gc2hvdyByYW5kb21uZXNzIGFuZCB2YXJpYWJpbGl0eQoKYGBge3IgMTBzaW1zfQojIDEwIHNpbXVsYXRpb25zIG9mIHRoZSBhYm92ZSBtb2RlbAptb2RlbC5yZXAucGxvdCA9IGZ1bmN0aW9uKE4sIGJldGEsIEkuMCwgcCwgZXBzaWxvbiwgdGhldGEsIGdhbW1hLCBUaW1lSCwgVGltZU5ILCByZXBzID0gMTApewogIGxpbmUucGxvdCA9IGZ1bmN0aW9uKGRhdGEpewogICAgc2l6ZSA9IDAuMgogICAgbGlzdChnZW9tX2xpbmUoZGF0YSA9IGRhdGEsIGFlcyh4ID0gRGF5LCB5ID0gSW5mZWN0ZWQsIGNvbG9yID0gIkRhaWx5IEluZmVjdGVkIiksIHNpemUgPSBzaXplKSwKICAgICAgICAgZ2VvbV9hcmVhKGRhdGEgPSBkYXRhLCBhZXMoeCA9IERheSwgeSA9IEluZmVjdGVkKSwgZmlsbCA9ICJjb3JhbCIsIGFscGhhID0gMC4wNSksCiAgICAgICAgIGdlb21fbGluZShkYXRhID0gZGF0YSwgYWVzKHggPSBEYXksIHkgPSBUb3RhbC5EZWFkLCBjb2xvciA9ICJUb3RhbCBEZWFkIiksIHNpemUgPSBzaXplKSwKICAgICAgICAgZ2VvbV9saW5lKGRhdGEgPSBkYXRhLCBhZXMoeCA9IERheSwgeSA9IFN1c2NlcHRpYmxlLCBjb2xvciA9ICJTdXNjZXB0aWJsZSIpLCBzaXplID0gc2l6ZSksCiAgICAgICAgIGdlb21fbGluZShkYXRhID0gZGF0YSwgYWVzKHggPSBEYXksIHkgPSBUb3RhbC5SZWNvdmVyZWQsIGNvbG9yID0gIlRvdGFsIFJlY292ZXJkIiksIHNpemUgPSBzaXplKSwKICAgICAgICAgZ2VvbV9saW5lKGRhdGEgPSBkYXRhLCBhZXMoeCA9IERheSwgeSA9IFRvdGFsLkluLkhvc3BpdGFsLCBjb2xvciA9ICJEYWlseSBIb3NwaXRhbGl6ZWQiKSwgc2l6ZSA9IHNpemUpLAogICAgICAgICBnZW9tX2xpbmUoZGF0YSA9IGRhdGEsIGFlcyh4ID0gRGF5LCB5ID0gRGFpbHkuTmV3LkNhc2UsIGNvbG9yID0gIkRhaWx5IE5ldyBDYXNlIiksIHNpemUgPSBzaXplKSwKICAgICAgICAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoIkRhaWx5IEluZmVjdGVkIiA9ICJyZWQiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVG90YWwgRGVhZCI9ICJibGFjayIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTdXNjZXB0aWJsZSIgPSAiZGFya29yYW5nZSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUb3RhbCBSZWNvdmVyZCIgPSAiZ3JlZW4iLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRGFpbHkgSG9zcGl0YWxpemVkIiA9ICJkYXJrb3JjaGlkMSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEYWlseSBOZXcgQ2FzZSI9ICJibHVlMiIpKQogICAgKQogIH0KICBpZihUaW1lTkggPT0gMSl7CiAgICB0aXRsZSA9ICJTSUhSRCBNb2RlbCB3aXRoIHF1YXJhbnRpbmUgZW5mb3JjZWQiCiAgfSBlbHNlIHsKICAgIHRpdGxlID0gIlNJSFJEIE1vZGVsIHdpdGhvdXQgcXVhcmFudGluZSIKICB9CiAgcGxvdCA9IGdncGxvdCgpICsgbGFicyh5ID0gIlBvcHVsYXRpb24iLCB0aXRsZSA9IHRpdGxlLCBjb2xvciA9ICJDb21wYXJ0bWVudCIpICsgdGhlbWVfbWluaW1hbCgpCiAgZm9yKGkgaW4gMTpyZXBzKXsKICAgIGRhdGEgPSBtb2RlbC5kYXRhKE4sIGJldGEsIEkuMCwgcCwgZXBzaWxvbiwgdGhldGEsIGdhbW1hLCBUaW1lSCwgVGltZU5IKQogICAgcGxvdCA9IHBsb3QgKyBsaW5lLnBsb3QoZGF0YSkKICB9CiAgcGxvdAogIHJldHVybihwbG90KQp9CgojIFNJSFJEIG1vZGVsIHdpdGggMTAgcmVwcyBhbmQgYWxsIHBhcmFtZXRlcnMgc2V0IAojIGF0IGxvd2VzdCBsZXZlbCB1bmRlciAyIGNvbmRpdGlvbnM6IHdpdGggYW5kIHdpdGhvdXQgcXVhcmFudGluZQphID0gbW9kZWwucmVwLnBsb3QoMTAwMDAsIDIsIDUsIDAuNSwgMC4wNSwgMC45LCAwLjksIDEwLCAxKQphICsgYW5ub3RhdGUoZ2VvbSA9ICJjdXJ2ZSIsIHhlbmQgPSA2NSwgeWVuZCA9IDE2MDAsIHggPSA3MywgeSA9IDQwMCwgY3VydmF0dXJlID0gLjIsIGFycm93ID0gYXJyb3cobGVuZ3RoID0gdW5pdCgxLCAibW0iKSksIHNpemU9MC43LCBhbHBoYT0wLjYpICsKICBhbm5vdGF0ZShnZW9tID0gInRleHQiLCB4ID0gNTcsIHkgPSAxODAwLCBsYWJlbCA9ICJUb3RhbCBEZWF0aCIsIGhqdXN0ID0gImxlZnQiKSArIAogIAogIGFubm90YXRlKGdlb20gPSAiY3VydmUiLCB4ZW5kID0gMjQsIHllbmQgPSAyMTUwLCB4ID0gMTMuNSwgeSA9IDU1MCwgY3VydmF0dXJlID0gLS4yLCBhcnJvdyA9IGFycm93KGxlbmd0aCA9IHVuaXQoMiwgIm1tIikpLCBjb2xvciA9ICJibHVlIiwgc2l6ZT0wLjcsIGFscGhhPTAuNikgKwogIGFubm90YXRlKGdlb20gPSAidGV4dCIsIHggPSAyNCwgeSA9IDIzMDAsIGxhYmVsID0gIk1heCBEYWlseSBOZXcgQ2FzZSIsIGhqdXN0ID0gImxlZnQiLCBjb2xvciA9ICJibHVlIikgKyAKICAKICBhbm5vdGF0ZShnZW9tID0gImN1cnZlIiwgeGVuZCA9IDMwLCB5ZW5kID0gMTMwMCwgeCA9IDE1LCB5ID0gNjgwLCBjdXJ2YXR1cmUgPSAtLjIsIGFycm93ID0gYXJyb3cobGVuZ3RoID0gdW5pdCgyLCAibW0iKSksIGNvbG9yID0gInJlZCIsIHNpemU9MC43LCBhbHBoYT0wLjYpICsgCiAgYW5ub3RhdGUoZ2VvbSA9ICJ0ZXh0IiwgeCA9IDMxLCB5ID0gMTQwMCwgbGFiZWwgPSAiVG90YWwgSW5mZWN0ZWQiLCBoanVzdCA9ICJsZWZ0IiwgY29sb3IgPSAicmVkIikgKwogIAogIGFubm90YXRlKGdlb20gPSAiY3VydmUiLCB4ZW5kID0gMzAsIHllbmQgPSA2MDAsIHggPSAxOCwgeSA9IDExMCwgY3VydmF0dXJlID0gLS4yLCBhcnJvdyA9IGFycm93KGxlbmd0aCA9IHVuaXQoMiwgIm1tIikpLCBjb2xvciA9ICJkYXJrb3JjaGlkMSIsIHNpemU9MC43LCBhbHBoYT0wLjYpICsgCiAgYW5ub3RhdGUoZ2VvbSA9ICJ0ZXh0IiwgeCA9IDMxLCB5ID0gNjUwLCBsYWJlbCA9ICJNYXggRGFpbHkgSG9zcGl0YWxpemVkIiwgaGp1c3QgPSAibGVmdCIsIGNvbG9yID0gImRhcmtvcmNoaWQxIikgKyAgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJib3R0b20iKQpiID0gbW9kZWwucmVwLnBsb3QoMTAwMDAsIDIsIDUsIDAuNSwgMC4wNSwgMC45LCAwLjksIDEwLCA1KQpiICsgYW5ub3RhdGUoZ2VvbSA9ICJjdXJ2ZSIsIHhlbmQgPSA3MCwgeWVuZCA9IDEwMDAsIHggPSA2MiwgeSA9IDYwMCwgY3VydmF0dXJlID0gLS4yLCBhcnJvdyA9IGFycm93KGxlbmd0aCA9IHVuaXQoMSwgIm1tIikpLCBzaXplPTAuNywgYWxwaGE9MC42KSArCiAgYW5ub3RhdGUoZ2VvbSA9ICJ0ZXh0IiwgeCA9IDcxLCB5ID0gMTA1MCwgbGFiZWwgPSAiVG90YWwgRGVhdGgiLCBoanVzdCA9ICJsZWZ0IikgKyAKICAKICBhbm5vdGF0ZShnZW9tID0gImN1cnZlIiwgeGVuZCA9IDI0LCB5ZW5kID0gMjQwMCwgeCA9IDExLCB5ID0gMTA3MCwgY3VydmF0dXJlID0gLS4yLCBhcnJvdyA9IGFycm93KGxlbmd0aCA9IHVuaXQoMiwgIm1tIikpLCBjb2xvciA9ICJibHVlIiwgc2l6ZT0wLjcsIGFscGhhPTAuNikgKwogIGFubm90YXRlKGdlb20gPSAidGV4dCIsIHggPSAyNCwgeSA9IDI2MDAsIGxhYmVsID0gIk1heCBEYWlseSBOZXcgQ2FzZSIsIGhqdXN0ID0gImxlZnQiLCBjb2xvciA9ICJibHVlIikgKyAKICAKICBhbm5vdGF0ZShnZW9tID0gImN1cnZlIiwgeGVuZCA9IDMwLCB5ZW5kID0gMTUwMCwgeCA9IDE2LCB5ID0gMTAwMCwgY3VydmF0dXJlID0gLS4yLCBhcnJvdyA9IGFycm93KGxlbmd0aCA9IHVuaXQoMiwgIm1tIikpLCBjb2xvciA9ICJyZWQiLCBzaXplPTAuNywgYWxwaGE9MC42KSArIAogIGFubm90YXRlKGdlb20gPSAidGV4dCIsIHggPSAzMSwgeSA9IDE2MDAsIGxhYmVsID0gIlRvdGFsIEluZmVjdGVkIiwgaGp1c3QgPSAibGVmdCIsIGNvbG9yID0gInJlZCIpICsKICAKICBhbm5vdGF0ZShnZW9tID0gImN1cnZlIiwgeGVuZCA9IDMwLCB5ZW5kID0gOTAwLCB4ID0gMTQsIHkgPSAyMzAsIGN1cnZhdHVyZSA9IC0uMiwgYXJyb3cgPSBhcnJvdyhsZW5ndGggPSB1bml0KDIsICJtbSIpKSwgY29sb3IgPSAiZGFya29yY2hpZDEiLCBzaXplPTAuNywgYWxwaGE9MC42KSArIAogIGFubm90YXRlKGdlb20gPSAidGV4dCIsIHggPSAzMSwgeSA9IDEwMDAsIGxhYmVsID0gIk1heCBEYWlseSBIb3NwaXRhbGl6ZWQiLCBoanVzdCA9ICJsZWZ0IiwgY29sb3IgPSAiZGFya29yY2hpZDEiKSAgKyAgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJib3R0b20iKQpgYGAKCiMjIDIuIEZhY3RvcmlhbCBFeHBlcmltZW50IERlc2lnbiAKCmBgYHtyIGZhY3QuZXhwfQojIEZhY3RvcmlhbCBFeHBlcmltZW50CkkuMCA9IDUKUy5yYXRlID0gMC41CgojIExpc3Qgb2YgRXhwbGFuYXRvcnkgVmFyaWFibGVzOgpQb3AuTHN0ID0gYygxMDAwMCwgMTAwMDAwLCAxMDAwMDAwKQpCZXRhLkxzdCA9IGMoMiw0KQpIcmF0ZS5Mc3QgPSBjKDAuMDUsIDAuMSwgMC4xNSkKUnJhdGVILkxzdCA9IGMoMC45LCAwLjk1KQpScmF0ZU5ILkxzdCA9IGMoMC45LCAwLjk1KQpUaW1lSC5Mc3QgPSBjKDEwLCAxNSkKVGltZU5ILkxzdCA9IGMoMSwgNSkKCiNQb3AuTHN0LCBCZXRhLkxzdCwgSHJhdGUuTHN0LCBScmF0ZUguTHN0LCBScmF0ZU5ILkxzdCwgVGltZUguTHN0LCBUaW1lTkguTHN0CnJlc3VsdF90YWJsZSA9IGRhdGEuZnJhbWUoKQoKIyBSdW4gMTAgc2ltdWxhdGlvbnMgb2YgZXZlcnkgMjg4IGNvbWJpbmF0aW9ucwpzaW1zID0gMTAKZm9yKGkgaW4gMTpzaW1zKXsKICBmb3IoTiBpbiBQb3AuTHN0KXsKICAgIGZvcihiIGluIEJldGEuTHN0KXsKICAgICAgZm9yKGhyIGluIEhyYXRlLkxzdCl7CiAgICAgICAgZm9yKHJyaCBpbiBScmF0ZUguTHN0KXsKICAgICAgICAgIGZvcihycm5oIGluIFJyYXRlTkguTHN0KXsKICAgICAgICAgICAgZm9yKHRoIGluIFRpbWVILkxzdCl7CiAgICAgICAgICAgICAgZm9yKHRuaCBpbiBUaW1lTkguTHN0KXsKICAgICAgICAgICAgICAgIG1vZGVsID0gU0lIUkQubW9kZWwoTiwgYiwgSS4wLCBTLnJhdGUsIGhyLCBycmgsIHJybmgsIHRoLCB0bmgpCiAgICAgICAgICAgICAgICByZXN1bHRfdGFibGUgPSByYmluZChyZXN1bHRfdGFibGUsIG1vZGVsW1szXV0sIHN0cmluZ3NBc0ZhY3RvcnMgPSBGQUxTRSkKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9Cn0KCmNvbG5hbWVzKHJlc3VsdF90YWJsZSkgPSBjKCJQb3B1bGF0aW9uIiwgIkJldGEiLCAiSG9zcGl0YWxpemF0aW9uUmF0ZSIsICJIb3NwaXRhbGl6ZWRSZWNvdmVyeVJhdGUiLCAiTm9uSG9zcGl0YWxpemVkUmVjb3ZlcnlSYXRlIiwgIkhvc3BpdGFsaXphdGlvblRpbWUiLCAiSW5mZWN0aW9uVGltZSIsICJMYXN0RGF5IiwgIlN0YXR1cyIsICJUb3RhbERlYXRoIiwgIlRvdGFsSW5mZWN0ZWQiLCAiTWF4TmV3Q2FzZSIsICJQZWFrRGF5TmV3Q2FzZSIsICJNYXhJbkhvc3BpdGFsIiwgIlBlYWtEYXlIb3NwaXRhbCIpCnJlc3VsdF90YWJsZVsxOjddID0gYXMuZGF0YS5mcmFtZShzYXBwbHkocmVzdWx0X3RhYmxlWzE6N10sIGFzLm51bWVyaWMpKQpyZXN1bHRfdGFibGVbMTo3XSA9IGZvcm1hdChyZXN1bHRfdGFibGVbMTo3XSwgc2NpZW50aWZpYyA9IEZBTFNFKQpyZXN1bHRfdGFibGVbYygxOjcsOSldID0gYXMuZGF0YS5mcmFtZShzYXBwbHkocmVzdWx0X3RhYmxlW2MoMTo3LDkpXSwgYXMuZmFjdG9yKSkKcmVzdWx0X3RhYmxlW2MoOCwxMDoxNSldID0gYXMuZGF0YS5mcmFtZShzYXBwbHkocmVzdWx0X3RhYmxlW2MoOCwxMDoxNSldLCBhcy5udW1lcmljKSkKCm51bWVyaWNQb3AgPSBhcy5udW1lcmljKGFzLmNoYXJhY3RlcihyZXN1bHRfdGFibGUkUG9wdWxhdGlvbikpCgpyZXN1bHRfdGFibGUkRGVhdGhQcm9wb3J0aW9uID0gcmVzdWx0X3RhYmxlJFRvdGFsRGVhdGggLyBudW1lcmljUG9wCnJlc3VsdF90YWJsZSRJbmZlY3RlZFByb3BvcnRpb24gPSByZXN1bHRfdGFibGUkVG90YWxJbmZlY3RlZCAvIG51bWVyaWNQb3AKcmVzdWx0X3RhYmxlJE1heENhc2VQcm9wb3J0aW9uID0gcmVzdWx0X3RhYmxlJE1heE5ld0Nhc2UgLyBudW1lcmljUG9wCnJlc3VsdF90YWJsZSRNYXhIb3NwaXRhbFByb3BvcnRpb24gPSByZXN1bHRfdGFibGUkTWF4SW5Ib3NwaXRhbCAvIG51bWVyaWNQb3AKcmVzdWx0X3RhYmxlCmBgYAoKYGBge3IgYW5vdmEubG0uZnVuY30KcmVzcG9uc2UudmFyID0gIlBvcHVsYXRpb24gKyBCZXRhICsgSG9zcGl0YWxpemF0aW9uUmF0ZSArIEhvc3BpdGFsaXplZFJlY292ZXJ5UmF0ZSArIE5vbkhvc3BpdGFsaXplZFJlY292ZXJ5UmF0ZSArIEhvc3BpdGFsaXphdGlvblRpbWUgKyBJbmZlY3Rpb25UaW1lICsgUG9wdWxhdGlvbiAqIEJldGEgKyBQb3B1bGF0aW9uICogSG9zcGl0YWxpemF0aW9uUmF0ZSArIFBvcHVsYXRpb24gKiBIb3NwaXRhbGl6ZWRSZWNvdmVyeVJhdGUgKyBQb3B1bGF0aW9uICogTm9uSG9zcGl0YWxpemVkUmVjb3ZlcnlSYXRlICsgUG9wdWxhdGlvbiAqIEhvc3BpdGFsaXphdGlvblRpbWUgKyBQb3B1bGF0aW9uICogSW5mZWN0aW9uVGltZSArIEJldGEgKiBIb3NwaXRhbGl6YXRpb25SYXRlICsgQmV0YSAqIEhvc3BpdGFsaXplZFJlY292ZXJ5UmF0ZSArIEJldGEgKiBOb25Ib3NwaXRhbGl6ZWRSZWNvdmVyeVJhdGUgKyBCZXRhICogSG9zcGl0YWxpemF0aW9uVGltZSArIEJldGEgKiBJbmZlY3Rpb25UaW1lICsgSG9zcGl0YWxpemF0aW9uUmF0ZSogSG9zcGl0YWxpemVkUmVjb3ZlcnlSYXRlICsgSG9zcGl0YWxpemF0aW9uUmF0ZSpOb25Ib3NwaXRhbGl6ZWRSZWNvdmVyeVJhdGUgKyBIb3NwaXRhbGl6YXRpb25SYXRlKkhvc3BpdGFsaXphdGlvblRpbWUgKyBIb3NwaXRhbGl6YXRpb25SYXRlKkluZmVjdGlvblRpbWUgKyBIb3NwaXRhbGl6ZWRSZWNvdmVyeVJhdGUgKiBOb25Ib3NwaXRhbGl6ZWRSZWNvdmVyeVJhdGUgKyBIb3NwaXRhbGl6ZWRSZWNvdmVyeVJhdGUgKiBIb3NwaXRhbGl6ZWRSZWNvdmVyeVJhdGUgKiBIb3NwaXRhbGl6YXRpb25UaW1lICsgSG9zcGl0YWxpemVkUmVjb3ZlcnlSYXRlICogSW5mZWN0aW9uVGltZSArIE5vbkhvc3BpdGFsaXplZFJlY292ZXJ5UmF0ZSAqIEhvc3BpdGFsaXphdGlvblRpbWUgKyBOb25Ib3NwaXRhbGl6ZWRSZWNvdmVyeVJhdGUgKiBJbmZlY3Rpb25UaW1lICsgSG9zcGl0YWxpemF0aW9uVGltZSAqIEluZmVjdGlvblRpbWUiCgphbm92YSA9IGZ1bmN0aW9uKHBhcmFtKXsKICBmb3JtID0gYXMuZm9ybXVsYShwYXN0ZShwYXJhbSwgcmVzcG9uc2UudmFyLCBzZXAgPSAiIH4gIikpCiAgcmV0dXJuKGFvdihmb3JtLCBkYXRhID0gcmVzdWx0X3RhYmxlKSkKfQpsaW5lYXIgPSBmdW5jdGlvbihwYXJhbSl7CiAgZm9ybSA9IGFzLmZvcm11bGEocGFzdGUocGFyYW0sIHJlc3BvbnNlLnZhciwgc2VwID0gIiB+ICIpKQogIHJldHVybihsbShmb3JtLCBkYXRhID0gcmVzdWx0X3RhYmxlKSkKfQoKcmVzaWR1YWwucGxvdCA9IGZ1bmN0aW9uKG1vZGVsKXsKICByZXNpZHVhbHMgPSBtb2RlbCRyZXNpZHVhbHMKICBwYXIobWZyb3cgPSBjKDEsMikpCiAgaGlzdChyZXNpZHVhbHMpCiAgcXFub3JtKHJlc2lkdWFscykKICBxcWxpbmUocmVzaWR1YWxzKQp9CmBgYAoKIyMjIyBSZXNwb25zZSBWYXJpYWJsZTogVG90YWwgRGVhdGggUHJvcG9ydGlvbgoKIyMjIyMgQU5PVkEgcmVzdWx0CgpgYGB7ciBkZWF0aC5hbm92YX0KRGVhdGguQW5vdmEgPSBhbm92YSgiRGVhdGhQcm9wb3J0aW9uIikKc3VtbWFyeShEZWF0aC5Bbm92YSkKRGVhdGguTG0gPSBsaW5lYXIoIkRlYXRoUHJvcG9ydGlvbiIpCnN1bW1hcnkoRGVhdGguTG0pCnJlc2lkdWFsLnBsb3QoRGVhdGguQW5vdmEpCgpEZWF0aC5Bbm92YS5yZWR1Y2VkID0gYW92KERlYXRoUHJvcG9ydGlvbiB+IEJldGEgKyBIb3NwaXRhbGl6YXRpb25SYXRlICsgSG9zcGl0YWxpemVkUmVjb3ZlcnlSYXRlICsgTm9uSG9zcGl0YWxpemVkUmVjb3ZlcnlSYXRlICsgSW5mZWN0aW9uVGltZSArIEJldGE6SG9zcGl0YWxpemF0aW9uUmF0ZSArIEJldGE6SG9zcGl0YWxpemVkUmVjb3ZlcnlSYXRlICsgQmV0YTpOb25Ib3NwaXRhbGl6ZWRSZWNvdmVyeVJhdGUgKyBIb3NwaXRhbGl6YXRpb25SYXRlOkhvc3BpdGFsaXplZFJlY292ZXJ5UmF0ZSArIEJldGE6SW5mZWN0aW9uVGltZSArIEhvc3BpdGFsaXphdGlvblJhdGU6SG9zcGl0YWxpemVkUmVjb3ZlcnlSYXRlICsgSG9zcGl0YWxpemF0aW9uUmF0ZTpOb25Ib3NwaXRhbGl6ZWRSZWNvdmVyeVJhdGUgKyBIb3NwaXRhbGl6YXRpb25SYXRlOkluZmVjdGlvblRpbWUgKyBIb3NwaXRhbGl6ZWRSZWNvdmVyeVJhdGU6SW5mZWN0aW9uVGltZSArIE5vbkhvc3BpdGFsaXplZFJlY292ZXJ5UmF0ZTpJbmZlY3Rpb25UaW1lLCBkYXRhID0gcmVzdWx0X3RhYmxlKQoKc3VtbWFyeShEZWF0aC5Bbm92YS5yZWR1Y2VkKQpzdW1tYXJ5KGxtKERlYXRoUHJvcG9ydGlvbiB+IEJldGEgKyBIb3NwaXRhbGl6YXRpb25SYXRlICsgSG9zcGl0YWxpemVkUmVjb3ZlcnlSYXRlICsgTm9uSG9zcGl0YWxpemVkUmVjb3ZlcnlSYXRlICsgSW5mZWN0aW9uVGltZSArIEJldGE6SG9zcGl0YWxpemF0aW9uUmF0ZSArIEJldGE6SG9zcGl0YWxpemVkUmVjb3ZlcnlSYXRlICsgQmV0YTpOb25Ib3NwaXRhbGl6ZWRSZWNvdmVyeVJhdGUgKyBIb3NwaXRhbGl6YXRpb25SYXRlOkhvc3BpdGFsaXplZFJlY292ZXJ5UmF0ZSArIEJldGE6SW5mZWN0aW9uVGltZSArIEhvc3BpdGFsaXphdGlvblJhdGU6SG9zcGl0YWxpemVkUmVjb3ZlcnlSYXRlICsgSG9zcGl0YWxpemF0aW9uUmF0ZTpOb25Ib3NwaXRhbGl6ZWRSZWNvdmVyeVJhdGUgKyBIb3NwaXRhbGl6YXRpb25SYXRlOkluZmVjdGlvblRpbWUgKyBIb3NwaXRhbGl6ZWRSZWNvdmVyeVJhdGU6SW5mZWN0aW9uVGltZSArIE5vbkhvc3BpdGFsaXplZFJlY292ZXJ5UmF0ZTpJbmZlY3Rpb25UaW1lLCBkYXRhID0gcmVzdWx0X3RhYmxlKSkKYGBgCgojIyMjIyBNYWluIEVmZmVjdHMgUGxvdAoKYGBge3IgZGVhdGgubWFpbn0KIyBTdW1tYXJpemUgbWFpbiBlZmZlY3RzIG9mIGVhY2ggc2lnbmlmaWNhbnQgdmFyaWFibGUKYXZnLkJldGEgPSByZXN1bHRfdGFibGUgJT4lIGdyb3VwX2J5KEJldGEpICU+JSBzdW1tYXJpc2UoQXZlcmFnZS5EZWF0aC5Qcm9wb3J0aW9uID0gbWVhbihEZWF0aFByb3BvcnRpb24pKQphdmcuSG9zcGl0YWxpemF0aW9uUmF0ZSA9IHJlc3VsdF90YWJsZSAlPiUgZ3JvdXBfYnkoSG9zcGl0YWxpemF0aW9uUmF0ZSkgJT4lIHN1bW1hcmlzZShBdmVyYWdlLkRlYXRoLlByb3BvcnRpb24gPSBtZWFuKERlYXRoUHJvcG9ydGlvbikpCmF2Zy5Ib3NwaXRhbGl6ZWRSZWNvdmVyeVJhdGUgPSByZXN1bHRfdGFibGUgJT4lIGdyb3VwX2J5KEhvc3BpdGFsaXplZFJlY292ZXJ5UmF0ZSkgJT4lIHN1bW1hcmlzZShBdmVyYWdlLkRlYXRoLlByb3BvcnRpb24gPSBtZWFuKERlYXRoUHJvcG9ydGlvbikpCmF2Zy5Ob25Ib3NwaXRhbGl6ZWRSZWNvdmVyeVJhdGUgPSByZXN1bHRfdGFibGUgJT4lIGdyb3VwX2J5KE5vbkhvc3BpdGFsaXplZFJlY292ZXJ5UmF0ZSkgJT4lIHN1bW1hcmlzZShBdmVyYWdlLkRlYXRoLlByb3BvcnRpb24gPSBtZWFuKERlYXRoUHJvcG9ydGlvbikpCmF2Zy5JbmZlY3Rpb25UaW1lID0gcmVzdWx0X3RhYmxlICU+JSBncm91cF9ieShJbmZlY3Rpb25UaW1lKSAlPiUgc3VtbWFyaXNlKEF2ZXJhZ2UuRGVhdGguUHJvcG9ydGlvbiA9IG1lYW4oRGVhdGhQcm9wb3J0aW9uKSkKCmF2Zy5CZXRhJFZhciA9ICJCZXRhIgpuYW1lcyhhdmcuQmV0YSkgPSBjKCJMZXZlbCIsICJBdmVyYWdlLkRlYXRoLlByb3BvcnRpb24iLCAiVmFyIikKCmF2Zy5Ib3NwaXRhbGl6YXRpb25SYXRlJFZhciA9ICJIb3NwaXRhbGl6YXRpb24gUmF0ZSIKbmFtZXMoYXZnLkhvc3BpdGFsaXphdGlvblJhdGUpID0gYygiTGV2ZWwiLCAiQXZlcmFnZS5EZWF0aC5Qcm9wb3J0aW9uIiwgIlZhciIpCgphdmcuSG9zcGl0YWxpemVkUmVjb3ZlcnlSYXRlJFZhciA9ICJIb3NwaXRhbGl6ZWQgUmVjb3ZlcnkgUmF0ZSIKbmFtZXMoYXZnLkhvc3BpdGFsaXplZFJlY292ZXJ5UmF0ZSkgPSBjKCJMZXZlbCIsICJBdmVyYWdlLkRlYXRoLlByb3BvcnRpb24iLCAiVmFyIikKCmF2Zy5Ob25Ib3NwaXRhbGl6ZWRSZWNvdmVyeVJhdGUkVmFyID0gIk5vbi1Ib3NwaXRhbGl6ZWQgUmVjb3ZlcnkgUmF0ZSIKbmFtZXMoYXZnLk5vbkhvc3BpdGFsaXplZFJlY292ZXJ5UmF0ZSkgPSBjKCJMZXZlbCIsICJBdmVyYWdlLkRlYXRoLlByb3BvcnRpb24iLCAiVmFyIikKCmF2Zy5JbmZlY3Rpb25UaW1lJFZhciA9ICJRdWFyYW50aW5lIgpuYW1lcyhhdmcuSW5mZWN0aW9uVGltZSkgPSBjKCJMZXZlbCIsICJBdmVyYWdlLkRlYXRoLlByb3BvcnRpb24iLCAiVmFyIikKYXZnLkluZmVjdGlvblRpbWUkTGV2ZWwgPSBpZmVsc2UoYXZnLkluZmVjdGlvblRpbWUkTGV2ZWwgPT0gIjEiLCAieWVzIiwgIm5vIikKCmF2Zy5hbGwgPSByYmluZChhdmcuQmV0YSwgYXZnLkhvc3BpdGFsaXphdGlvblJhdGUsIGF2Zy5JbmZlY3Rpb25UaW1lLCBhdmcuSG9zcGl0YWxpemVkUmVjb3ZlcnlSYXRlLCBhdmcuTm9uSG9zcGl0YWxpemVkUmVjb3ZlcnlSYXRlKQojIE1haW4gRWZmZWN0IFBsb3RzCmFubl90ZXh0IDwtIHRyaWJibGUoCiAgflZhciwgfkF2ZXJhZ2UuRGVhdGguUHJvcG9ydGlvbiwgfkxldmVsLAogICMtLXwtLXwtLQogICJCZXRhIiwgMC4wMzcsICIyIikKYXZnLmFsbCRWYXIgPSBzd3IoYXZnLmFsbCRWYXIsIDIwKQpnZ3Bsb3QoYXZnLmFsbCwgYWVzKHggPSBMZXZlbCwgeSA9IEF2ZXJhZ2UuRGVhdGguUHJvcG9ydGlvbiwgZ3JvdXAgPSBWYXIpKSArIAogIGZhY2V0X2dyaWQoY29scyA9IHZhcnMoVmFyKSwgc2NhbGVzID0gImZyZWVfeCIpICsgCiAgdGhlbWVfYncoKSArIAogIGxhYnMoeSA9ICJBdmVyYWdlIFRvdGFsIERlYXRoIFByb3BvcnRpb24iLCB4ID0gIlZhcmlhYmxlIExldmVsIikgKyAKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSBtZWFuKHJlc3VsdF90YWJsZSREZWF0aFByb3BvcnRpb24pLCBsaW5ldHlwZT0nZGFzaGVkJywgY29sID0gJ2JsdWUnKSArIGdlb21fbGluZSgpICsKICBnZW9tX3BvaW50KCkgKyAKICBnZW9tX3RleHQoZGF0YSA9IGFubl90ZXh0LCBsYWJlbCA9IHN3cigiR3JhbmQgQXZlcmFnZSIsIDUpLCBjb2xvdXIgPSAnYmx1ZScsIHNpemUgPSAyLjgpCmBgYAoKIyMjIyMgSW50ZXJhY3Rpb24gRWZmZWN0cyBQbG90CgpgYGB7ciBkZWF0aC5pbnRlcmFjdH0KIyBTdW1tYXJpemUgaW50ZXJhY3Rpb24gZWZmZWN0cyBieSBhbGwgY29tYmluYXRpb25zIG9mIHNpZ25pZmljYW50IHZhcmlhYmxlcwpEZWF0aFN1bW1hcnkgPSByZXN1bHRfdGFibGUgJT4lIGdyb3VwX2J5KEJldGEsIEhvc3BpdGFsaXphdGlvblJhdGUsIEhvc3BpdGFsaXplZFJlY292ZXJ5UmF0ZSwgTm9uSG9zcGl0YWxpemVkUmVjb3ZlcnlSYXRlLCBJbmZlY3Rpb25UaW1lKSAlPiUgc3VtbWFyaXNlKEF2ZXJhZ2UuRGVhdGguUHJvcG9ydGlvbiA9IG1lYW4oRGVhdGhQcm9wb3J0aW9uKSkKCiMgTmV3IGZhY2V0IGxhYmVsIG5hbWVzIGZvciB2YXJpYWJsZXMKSW5mZWN0aW9uVGltZS5sYWJzIDwtIGMoIldpdGggcXVhcmFudGluZSIsICJXaXRob3V0IHF1YXJhbnRpbmUiKQpuYW1lcyhJbmZlY3Rpb25UaW1lLmxhYnMpIDwtIGMoIjEiLCAiNSIpCgpCZXRhLmxhYnMgPC0gYygiQmV0YSA9IDIiLCAiQmV0YSA9IDQiKQpuYW1lcyhCZXRhLmxhYnMpIDwtIGMoIjIiLCAiNCIpCgpIb3NwaXRhbGl6YXRpb25SYXRlLmxhYnMgPC0gYygiNSUgSG9zcGl0YWxpemF0aW9uIiwgIjEwJSBIb3NwaXRhbGl6YXRpb24iLCAiMTUlIEhvc3BpdGFsaXphdGlvbiIpCm5hbWVzKEhvc3BpdGFsaXphdGlvblJhdGUubGFicykgPC0gYygiMC4wNSIsICIwLjEwIiwgIjAuMTUiKQoKRGVhdGhTdW1tYXJ5JEluZmVjdGlvblRpbWUgPSBpZmVsc2UoRGVhdGhTdW1tYXJ5JEluZmVjdGlvblRpbWUgPT0gMSwgIldpdGggcXVhcmFudGluZSIsICJXaXRob3V0IHF1YXJhbnRpbmUiKQpEZWF0aFN1bW1hcnkkSW5mZWN0aW9uVGltZSA9IHN3cihEZWF0aFN1bW1hcnkkSW5mZWN0aW9uVGltZSkKIyBJbnRlcmFjdGlvbiBQbG90CmdncGxvdChEZWF0aFN1bW1hcnksIAogICAgICAgYWVzKHggPSBOb25Ib3NwaXRhbGl6ZWRSZWNvdmVyeVJhdGUsIAogICAgICAgICAgIHkgPSBBdmVyYWdlLkRlYXRoLlByb3BvcnRpb24sCiAgICAgICAgICAgY29sb3IgPSBIb3NwaXRhbGl6ZWRSZWNvdmVyeVJhdGUsCiAgICAgICAgICAgZ3JvdXAgPSBIb3NwaXRhbGl6ZWRSZWNvdmVyeVJhdGUpKSArCiAgZ2VvbV9wb2ludCgpICsgCiAgZ2VvbV9saW5lKCkgKwogIGZhY2V0X2dyaWQoSW5mZWN0aW9uVGltZSB+IEJldGEgKyBIb3NwaXRhbGl6YXRpb25SYXRlLCBsYWJlbGxlciA9IGxhYmVsbGVyKEJldGEgPSBCZXRhLmxhYnMsIEhvc3BpdGFsaXphdGlvblJhdGUgPSBzd3IoSG9zcGl0YWxpemF0aW9uUmF0ZS5sYWJzKSkpICsKICAjIGdlb21fcG9pbnQoYWVzKGNvbG9yID0gSG9zcGl0YWxpemVkUmVjb3ZlcnlSYXRlKSkgKyAKICB0aGVtZV9idygpICsgCiAgbGFicyh5ID0gIkF2ZXJhZ2UgVG90YWwgRGVhdGggUHJvcG9ydGlvbiIsIAogICAgICAgeCA9ICJOb24tSG9zcGl0YWxpemVkIFJlY292ZXJ5IFJhdGUiLAogICAgICAgY29sb3IgPSAiSG9zcGl0YWxpemVkIFJlY292ZXJ5IFJhdGUiKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJ0b3AiKQpgYGAKCiMjIyMgUmVzcG9uc2UgVmFyaWFibGU6IFRvdGFsIEluZmVjdGVkIFByb3BvcnRpb24KCiMjIyMjIEFOT1ZBIHJlc3VsdAoKYGBge3IgaW5mZWN0ZWQuYW5vdmF9CkluZmVjdGVkLkFub3ZhID0gYW5vdmEoIkluZmVjdGVkUHJvcG9ydGlvbiIpCnN1bW1hcnkoSW5mZWN0ZWQuQW5vdmEpCkluZmVjdGVkLkxtID0gbGluZWFyKCJJbmZlY3RlZFByb3BvcnRpb24iKQpzdW1tYXJ5KEluZmVjdGVkLkxtKQpyZXNpZHVhbC5wbG90KEluZmVjdGVkLkFub3ZhKQpgYGAKCiMjIyMjIE1haW4gRWZmZWN0cyBQbG90CgpgYGB7ciBpbmZlY3RlZC5tYWlufQojIFN1bW1hcml6ZSBtYWluIGVmZmVjdHMgb2YgZWFjaCBzaWduaWZpY2FudCB2YXJpYWJsZQphdmcuQmV0YSA9IHJlc3VsdF90YWJsZSAlPiUgZ3JvdXBfYnkoQmV0YSkgJT4lIHN1bW1hcmlzZShBdmVyYWdlLkluZmVjdGVkLlByb3BvcnRpb24gPSBtZWFuKEluZmVjdGVkUHJvcG9ydGlvbikpCmF2Zy5JbmZlY3Rpb25UaW1lID0gcmVzdWx0X3RhYmxlICU+JSBncm91cF9ieShJbmZlY3Rpb25UaW1lKSAlPiUgc3VtbWFyaXNlKEF2ZXJhZ2UuSW5mZWN0ZWQuUHJvcG9ydGlvbiA9IG1lYW4oSW5mZWN0ZWRQcm9wb3J0aW9uKSkKYXZnLkhvc3BpdGFsaXphdGlvblJhdGUgPSByZXN1bHRfdGFibGUgJT4lIGdyb3VwX2J5KEhvc3BpdGFsaXphdGlvblJhdGUpICU+JSBzdW1tYXJpc2UoQXZlcmFnZS5JbmZlY3RlZC5Qcm9wb3J0aW9uID0gbWVhbihJbmZlY3RlZFByb3BvcnRpb24pKQoKYXZnLkJldGEkVmFyID0gIkJldGEiCm5hbWVzKGF2Zy5CZXRhKSA9IGMoIkxldmVsIiwgIkF2ZXJhZ2UuSW5mZWN0ZWQuUHJvcG9ydGlvbiIsICJWYXIiKQoKYXZnLkhvc3BpdGFsaXphdGlvblJhdGUkVmFyID0gIkhvc3BpdGFsaXphdGlvbiBSYXRlIgpuYW1lcyhhdmcuSG9zcGl0YWxpemF0aW9uUmF0ZSkgPSBjKCJMZXZlbCIsICJBdmVyYWdlLkluZmVjdGVkLlByb3BvcnRpb24iLCAiVmFyIikKCmF2Zy5JbmZlY3Rpb25UaW1lJFZhciA9ICJRdWFyYW50aW5lIgpuYW1lcyhhdmcuSW5mZWN0aW9uVGltZSkgPSBjKCJMZXZlbCIsICJBdmVyYWdlLkluZmVjdGVkLlByb3BvcnRpb24iLCAiVmFyIikKYXZnLkluZmVjdGlvblRpbWUkTGV2ZWwgPSBpZmVsc2UoYXZnLkluZmVjdGlvblRpbWUkTGV2ZWwgPT0gIjEiLCAieWVzIiwgIm5vIikKCmF2Zy5hbGwgPSByYmluZChhdmcuQmV0YSwgYXZnLkhvc3BpdGFsaXphdGlvblJhdGUsIGF2Zy5JbmZlY3Rpb25UaW1lKQphdmcuYWxsJFZhciA9IHN3cihhdmcuYWxsJFZhciwgMjApCgojIE1haW4gRWZmZWN0IFBsb3RzCmFubl90ZXh0IDwtIHRyaWJibGUoCiAgflZhciwgfkF2ZXJhZ2UuSW5mZWN0ZWQuUHJvcG9ydGlvbiwgfkxldmVsLAogICMtLXwtLXwtLQogICJCZXRhIiwgbWVhbihyZXN1bHRfdGFibGUkSW5mZWN0ZWRQcm9wb3J0aW9uKSArIDAuMDA0LCAiMiIpCgpnZ3Bsb3QoYXZnLmFsbCwgYWVzKHggPSBMZXZlbCwgeSA9IEF2ZXJhZ2UuSW5mZWN0ZWQuUHJvcG9ydGlvbiwgZ3JvdXAgPSBWYXIpKSArIAogIGZhY2V0X2dyaWQoY29scyA9IHZhcnMoVmFyKSwgc2NhbGVzID0gImZyZWVfeCIpICsgCiAgZ2VvbV9saW5lKCkgKwogIGdlb21fcG9pbnQoKSArIAogIHRoZW1lX2J3KCkgKyAKICBsYWJzKHkgPSAiQXZlcmFnZSBUb3RhbCBJbmZlY3RlZCBQcm9wb3J0aW9uIiwgeCA9ICJWYXJpYWJsZSBMZXZlbCIpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSBtZWFuKHJlc3VsdF90YWJsZSRJbmZlY3RlZFByb3BvcnRpb24pLCBsaW5ldHlwZT0nZGFzaGVkJywgY29sID0gJ2JsdWUnKSArIAogIGdlb21fdGV4dChkYXRhID0gYW5uX3RleHQsIGxhYmVsID0gc3dyKCJHcmFuZCBBdmVyYWdlIiwgNSksIGNvbG91ciA9ICdibHVlJywgc2l6ZSA9IDMpCmBgYAoKIyMjIyMgSW50ZXJhY3Rpb24gRWZmZWN0cyBQbG90CgpgYGB7ciBpbmZlY3RlZC5pbnRlcmFjdH0KIyBTdW1tYXJpemUgaW50ZXJhY3Rpb24gZWZmZWN0cyBieSBhbGwgY29tYmluYXRpb25zIG9mIHNpZ25pZmljYW50IHZhcmlhYmxlcwpJbmZlY3RlZFN1bW1hcnkgPSByZXN1bHRfdGFibGUgJT4lIGdyb3VwX2J5KEJldGEsIEluZmVjdGlvblRpbWUsIEhvc3BpdGFsaXphdGlvblJhdGUpICU+JSBzdW1tYXJpc2UoQXZlcmFnZS5JbmZlY3RlZC5Qcm9wb3J0aW9uID0gbWVhbihJbmZlY3RlZFByb3BvcnRpb24pKQpJbmZlY3RlZFN1bW1hcnkkSW5mZWN0aW9uVGltZSA9IGlmZWxzZShJbmZlY3RlZFN1bW1hcnkkSW5mZWN0aW9uVGltZSA9PSAiMSIsICJ5ZXMiLCAibm8iKQpJbmZlY3RlZFN1bW1hcnkkSW5mZWN0aW9uVGltZSA9IGZhY3RvcihJbmZlY3RlZFN1bW1hcnkkSW5mZWN0aW9uVGltZSwgbGV2ZWxzID0gYygieWVzIiwgIm5vIiksIG9yZGVyZWQgPSBUUlVFICkKCiMgSW50ZXJhY3Rpb24gUGxvdApnZ3Bsb3QoSW5mZWN0ZWRTdW1tYXJ5LCAKICAgICAgIGFlcyh4ID0gSW5mZWN0aW9uVGltZSwgCiAgICAgICAgICAgeSA9IEF2ZXJhZ2UuSW5mZWN0ZWQuUHJvcG9ydGlvbiwgCiAgICAgICAgICAgZ3JvdXAgPSBCZXRhLAogICAgICAgICAgIGNvbG9yID0gQmV0YSkpICsgCiAgZ2VvbV9saW5lKCkgKwogIGdlb21fcG9pbnQoKSArIAogIGZhY2V0X2dyaWQofiBIb3NwaXRhbGl6YXRpb25SYXRlLCBsYWJlbGxlciA9IGxhYmVsbGVyKEhvc3BpdGFsaXphdGlvblJhdGUgPSBIb3NwaXRhbGl6YXRpb25SYXRlLmxhYnMpKSArCiAgdGhlbWVfYncoKSArIAogIGxhYnMoeSA9ICJBdmVyYWdlIFRvdGFsIEluZmVjdGVkIFByb3BvcnRpb24iLCAKICAgICAgIHggPSAiUXVhcmFudGluZSIpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb249InRvcCIpCmBgYAoKIyMjIyBSZXNwb25zZSBWYXJpYWJsZTogTWF4aW11bSBOZXcgQ2FzZSBQcm9wb3J0aW9uCgojIyMjIyBBTk9WQSByZXN1bHQKCmBgYHtyIG5ld2Nhc2UuYW5vdmF9Ck1heENhc2UuQW5vdmEgPSBhbm92YSgiTWF4Q2FzZVByb3BvcnRpb24iKQpzdW1tYXJ5KE1heENhc2UuQW5vdmEpCk1heENhc2UuTG0gPSBsaW5lYXIoIk1heENhc2VQcm9wb3J0aW9uIikKc3VtbWFyeShNYXhDYXNlLkxtKQpyZXNpZHVhbC5wbG90KE1heENhc2UuQW5vdmEpCmBgYAoKIyMjIyMgTWFpbiBFZmZlY3RzIFBsb3QKCmBgYHtyIG5ld2Nhc2UubWFpbn0KIyBTdW1tYXJpemUgbWFpbiBlZmZlY3RzIG9mIGVhY2ggc2lnbmlmaWNhbnQgdmFyaWFibGUKYXZnLlBvcHVsYXRpb24gPSByZXN1bHRfdGFibGUgJT4lIGdyb3VwX2J5KFBvcHVsYXRpb24pICU+JSBzdW1tYXJpc2UoQXZlcmFnZS5NYXhDYXNlUHJvcG9ydGlvbiA9IG1lYW4oTWF4Q2FzZVByb3BvcnRpb24pKQphdmcuQmV0YSA9IHJlc3VsdF90YWJsZSAlPiUgZ3JvdXBfYnkoQmV0YSkgJT4lIHN1bW1hcmlzZShBdmVyYWdlLk1heENhc2VQcm9wb3J0aW9uID0gbWVhbihNYXhDYXNlUHJvcG9ydGlvbikpCmF2Zy5JbmZlY3Rpb25UaW1lID0gcmVzdWx0X3RhYmxlICU+JSBncm91cF9ieShJbmZlY3Rpb25UaW1lKSAlPiUgc3VtbWFyaXNlKEF2ZXJhZ2UuTWF4Q2FzZVByb3BvcnRpb24gPSBtZWFuKE1heENhc2VQcm9wb3J0aW9uKSkKYXZnLkhvc3BpdGFsaXphdGlvblJhdGUgPSByZXN1bHRfdGFibGUgJT4lIGdyb3VwX2J5KEhvc3BpdGFsaXphdGlvblJhdGUpICU+JSBzdW1tYXJpc2UoQXZlcmFnZS5NYXhDYXNlUHJvcG9ydGlvbiA9IG1lYW4oTWF4Q2FzZVByb3BvcnRpb24pKQoKYXZnLlBvcHVsYXRpb24kVmFyID0gIlBvcHVsYXRpb24iCm5hbWVzKGF2Zy5Qb3B1bGF0aW9uKSA9IGMoIkxldmVsIiwgIkF2ZXJhZ2UuTWF4Q2FzZVByb3BvcnRpb24iLCAiVmFyIikKCmF2Zy5CZXRhJFZhciA9ICJCZXRhIgpuYW1lcyhhdmcuQmV0YSkgPSBjKCJMZXZlbCIsICJBdmVyYWdlLk1heENhc2VQcm9wb3J0aW9uIiwgIlZhciIpCgphdmcuSG9zcGl0YWxpemF0aW9uUmF0ZSRWYXIgPSAiSG9zcGl0YWxpemF0aW9uIFJhdGUiCm5hbWVzKGF2Zy5Ib3NwaXRhbGl6YXRpb25SYXRlKSA9IGMoIkxldmVsIiwgIkF2ZXJhZ2UuTWF4Q2FzZVByb3BvcnRpb24iLCAiVmFyIikKCmF2Zy5JbmZlY3Rpb25UaW1lJFZhciA9ICJRdWFyYW50aW5lIgpuYW1lcyhhdmcuSW5mZWN0aW9uVGltZSkgPSBjKCJMZXZlbCIsICJBdmVyYWdlLk1heENhc2VQcm9wb3J0aW9uIiwgIlZhciIpCmF2Zy5JbmZlY3Rpb25UaW1lJExldmVsID0gaWZlbHNlKGF2Zy5JbmZlY3Rpb25UaW1lJExldmVsID09ICIxIiwgInllcyIsICJubyIpCgphdmcuYWxsID0gcmJpbmQoYXZnLlBvcHVsYXRpb24sIGF2Zy5CZXRhLCBhdmcuSG9zcGl0YWxpemF0aW9uUmF0ZSwgYXZnLkluZmVjdGlvblRpbWUpCmF2Zy5hbGwkVmFyID0gc3dyKGF2Zy5hbGwkVmFyLCAyMCkKCiMgTWFpbiBFZmZlY3QgUGxvdHMKYW5uX3RleHQgPC0gdHJpYmJsZSgKICB+VmFyLCB+QXZlcmFnZS5NYXhDYXNlUHJvcG9ydGlvbiwgfkxldmVsLAogICMtLXwtLXwtLQogICJCZXRhIiwgbWVhbihyZXN1bHRfdGFibGUkTWF4Q2FzZVByb3BvcnRpb24pICsgMC4wMDcsICIyIikKCmdncGxvdChhdmcuYWxsLCBhZXMoeCA9IExldmVsLCB5ID0gQXZlcmFnZS5NYXhDYXNlUHJvcG9ydGlvbiwgZ3JvdXAgPSBWYXIpKSArIAogIGZhY2V0X2dyaWQoY29scyA9IHZhcnMoVmFyKSwgc2NhbGVzID0gImZyZWVfeCIpICsgCiAgZ2VvbV9saW5lKCkgKwogIGdlb21fcG9pbnQoKSArIAogIHRoZW1lX2J3KCkgKyAKICBsYWJzKHkgPSAiQXZlcmFnZSBNYXhpbXVtIERhaWx5IE5ldyBDYXNlIFByb3BvcnRpb24iLCB4ID0gIlZhcmlhYmxlIExldmVsIikgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IG1lYW4ocmVzdWx0X3RhYmxlJE1heENhc2VQcm9wb3J0aW9uKSwgbGluZXR5cGU9J2Rhc2hlZCcsIGNvbCA9ICdibHVlJykgKyAKICBnZW9tX3RleHQoZGF0YSA9IGFubl90ZXh0LCBsYWJlbCA9IHN3cigiR3JhbmQgQXZlcmFnZSIsIDUpLCBjb2xvdXIgPSAnYmx1ZScsIHNpemUgPSAzKQpgYGAKCiMjIyMjIEludGVyYWN0aW9uIEVmZmVjdHMgUGxvdAoKYGBge3IgbmV3Y2FzZS5pbnRlcmFjdH0KIyBTdW1tYXJpemUgaW50ZXJhY3Rpb24gZWZmZWN0cyBieSBhbGwgY29tYmluYXRpb25zIG9mIHNpZ25pZmljYW50IHZhcmlhYmxlcwpNYXhDYXNlU3VtbWFyeSA9IHJlc3VsdF90YWJsZSAlPiUgZ3JvdXBfYnkoUG9wdWxhdGlvbiwgQmV0YSwgSW5mZWN0aW9uVGltZSwgSG9zcGl0YWxpemF0aW9uUmF0ZSkgJT4lIHN1bW1hcmlzZShBdmVyYWdlLk1heENhc2VQcm9wb3J0aW9uID0gbWVhbihNYXhDYXNlUHJvcG9ydGlvbikpCk1heENhc2VTdW1tYXJ5JEluZmVjdGlvblRpbWUgPSBpZmVsc2UoTWF4Q2FzZVN1bW1hcnkkSW5mZWN0aW9uVGltZSA9PSAxLCAiV2l0aCBxdWFyYW50aW5lIiwgIldpdGhvdXQgcXVhcmFudGluZSIpCiMgTWF4Q2FzZVN1bW1hcnkkSW5mZWN0aW9uVGltZSA9IGZhY3RvcihNYXhDYXNlU3VtbWFyeSRJbmZlY3Rpb25UaW1lLCBsZXZlbHMgPSBjKCJ5ZXMiLCAibm8iKSwgb3JkZXJlZCA9IFRSVUUgKQoKIyBJbnRlcmFjdGlvbiBQbG90CmdncGxvdChNYXhDYXNlU3VtbWFyeSwgCiAgICAgICBhZXMoeCA9IFBvcHVsYXRpb24sIAogICAgICAgICAgIHkgPSBBdmVyYWdlLk1heENhc2VQcm9wb3J0aW9uLCAKICAgICAgICAgICBncm91cCA9IEJldGEsCiAgICAgICAgICAgY29sb3IgPSBCZXRhKSkgKyAKICBnZW9tX2xpbmUoKSArCiAgZ2VvbV9wb2ludCgpICsgCiAgZmFjZXRfZ3JpZChJbmZlY3Rpb25UaW1lIH4gSG9zcGl0YWxpemF0aW9uUmF0ZSwgbGFiZWxsZXIgPSBsYWJlbGxlcihIb3NwaXRhbGl6YXRpb25SYXRlID0gSG9zcGl0YWxpemF0aW9uUmF0ZS5sYWJzKSkgKwogIHRoZW1lX2J3KCkgKyAKICBsYWJzKHkgPSAiQXZlcmFnZSBNYXhpbXVtIERhaWx5IE5ldyBDYXNlIFByb3BvcnRpb24iKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJ0b3AiKQpgYGAKCiMjIyMgUmVzcG9uc2UgVmFyaWFibGU6IE1heCBIb3NwaXRhbGl6ZWQgUHJvcG9ydGlvbgoKIyMjIyMgQU5PVkEgcmVzdWx0CgpgYGB7ciBob3NwaXRhbC5hbm92YX0KTWF4SG9zcGl0YWwuQW5vdmEgPSBhbm92YSgiTWF4SG9zcGl0YWxQcm9wb3J0aW9uIikKc3VtbWFyeShNYXhIb3NwaXRhbC5Bbm92YSkKTWF4SG9zcGl0YWwuTG0gPSBsaW5lYXIoIk1heEhvc3BpdGFsUHJvcG9ydGlvbiIpCnN1bW1hcnkoTWF4SG9zcGl0YWwuTG0pCnJlc2lkdWFsLnBsb3QoTWF4SG9zcGl0YWwuQW5vdmEpCmBgYAoKIyMjIyMgTWFpbiBFZmZlY3RzIFBsb3QKCmBgYHtyIGhvc3BpdGFsLm1haW59CiMgU3VtbWFyaXplIG1haW4gZWZmZWN0cyBvZiBlYWNoIHNpZ25pZmljYW50IHZhcmlhYmxlCmF2Zy5CZXRhID0gcmVzdWx0X3RhYmxlICU+JSBncm91cF9ieShCZXRhKSAlPiUgc3VtbWFyaXNlKEF2ZXJhZ2UuTWF4SG9zcGl0YWxQcm9wb3J0aW9uID0gbWVhbihNYXhIb3NwaXRhbFByb3BvcnRpb24pKQphdmcuSG9zcGl0YWxpemF0aW9uUmF0ZSA9IHJlc3VsdF90YWJsZSAlPiUgZ3JvdXBfYnkoSG9zcGl0YWxpemF0aW9uUmF0ZSkgJT4lIHN1bW1hcmlzZShBdmVyYWdlLk1heEhvc3BpdGFsUHJvcG9ydGlvbiA9IG1lYW4oTWF4SG9zcGl0YWxQcm9wb3J0aW9uKSkKYXZnLkhvc3BpdGFsaXphdGlvblRpbWUgPSByZXN1bHRfdGFibGUgJT4lIGdyb3VwX2J5KEhvc3BpdGFsaXphdGlvblRpbWUpICU+JSBzdW1tYXJpc2UoQXZlcmFnZS5NYXhIb3NwaXRhbFByb3BvcnRpb24gPSBtZWFuKE1heEhvc3BpdGFsUHJvcG9ydGlvbikpCmF2Zy5JbmZlY3Rpb25UaW1lID0gcmVzdWx0X3RhYmxlICU+JSBncm91cF9ieShJbmZlY3Rpb25UaW1lKSAlPiUgc3VtbWFyaXNlKEF2ZXJhZ2UuTWF4SG9zcGl0YWxQcm9wb3J0aW9uID0gbWVhbihNYXhIb3NwaXRhbFByb3BvcnRpb24pKQoKYXZnLkJldGEkVmFyID0gIkJldGEiCm5hbWVzKGF2Zy5CZXRhKSA9IGMoIkxldmVsIiwgIkF2ZXJhZ2UuTWF4SG9zcGl0YWxQcm9wb3J0aW9uIiwgIlZhciIpCgphdmcuSG9zcGl0YWxpemF0aW9uUmF0ZSRWYXIgPSAiSG9zcGl0YWxpemF0aW9uIFJhdGUiCm5hbWVzKGF2Zy5Ib3NwaXRhbGl6YXRpb25SYXRlKSA9IGMoIkxldmVsIiwgIkF2ZXJhZ2UuTWF4SG9zcGl0YWxQcm9wb3J0aW9uIiwgIlZhciIpCgphdmcuSG9zcGl0YWxpemF0aW9uVGltZSRWYXIgPSAiSG9zcGl0YWxpemF0aW9uIFRpbWUgKGRheXMpIgpuYW1lcyhhdmcuSG9zcGl0YWxpemF0aW9uVGltZSkgPSBjKCJMZXZlbCIsICJBdmVyYWdlLk1heEhvc3BpdGFsUHJvcG9ydGlvbiIsICJWYXIiKQoKYXZnLkluZmVjdGlvblRpbWUkVmFyID0gIlF1YXJhbnRpbmUiCm5hbWVzKGF2Zy5JbmZlY3Rpb25UaW1lKSA9IGMoIkxldmVsIiwgIkF2ZXJhZ2UuTWF4SG9zcGl0YWxQcm9wb3J0aW9uIiwgIlZhciIpCmF2Zy5JbmZlY3Rpb25UaW1lJExldmVsID0gaWZlbHNlKGF2Zy5JbmZlY3Rpb25UaW1lJExldmVsID09ICIxIiwgInllcyIsICJubyIpCgphdmcuYWxsID0gcmJpbmQoYXZnLkJldGEsIGF2Zy5Ib3NwaXRhbGl6YXRpb25SYXRlLCBhdmcuSW5mZWN0aW9uVGltZSwgYXZnLkhvc3BpdGFsaXphdGlvblRpbWUpCmF2Zy5hbGwkVmFyID0gc3dyKGF2Zy5hbGwkVmFyLCAyMCkKCiMgTWFpbiBFZmZlY3QgUGxvdHMKYW5uX3RleHQgPC0gdHJpYmJsZSgKICB+VmFyLCB+QXZlcmFnZS5NYXhIb3NwaXRhbFByb3BvcnRpb24sIH5MZXZlbCwKICAjLS18LS18LS0KICAiQmV0YSIsIG1lYW4ocmVzdWx0X3RhYmxlJE1heEhvc3BpdGFsUHJvcG9ydGlvbikgKyAwLjAwMywgIjIiKQoKZ2dwbG90KGF2Zy5hbGwsIGFlcyh4ID0gTGV2ZWwsIHkgPSBBdmVyYWdlLk1heEhvc3BpdGFsUHJvcG9ydGlvbiwgZ3JvdXAgPSBWYXIpKSArIAogIGZhY2V0X2dyaWQoY29scyA9IHZhcnMoVmFyKSwgc2NhbGVzID0gImZyZWVfeCIpICsgCiAgZ2VvbV9saW5lKCkgKwogIGdlb21fcG9pbnQoKSArIAogIHRoZW1lX2J3KCkgKyAKICBsYWJzKHkgPSAiQXZlcmFnZSBNYXhpbXVtIERhaWx5IEhvc3BpdGFsaXphdGlvbiBQcm9wb3J0aW9uIiwgeCA9ICJWYXJpYWJsZSBMZXZlbCIpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSBtZWFuKHJlc3VsdF90YWJsZSRNYXhIb3NwaXRhbFByb3BvcnRpb24pLCBsaW5ldHlwZT0nZGFzaGVkJywgY29sID0gJ2JsdWUnKSArIAogIGdlb21fdGV4dChkYXRhID0gYW5uX3RleHQsIGxhYmVsID0gc3dyKCJHcmFuZCBBdmVyYWdlIiwgNSksIGNvbG91ciA9ICdibHVlJywgc2l6ZSA9IDMpCmBgYAoKIyMjIyMgSW50ZXJhY3Rpb24gRWZmZWN0cyBQbG90CgpgYGB7ciBob3NwaXRhbC5pbnRlcmFjdH0KIyBTdW1tYXJpemUgaW50ZXJhY3Rpb24gZWZmZWN0cyBieSBhbGwgY29tYmluYXRpb25zIG9mIHNpZ25pZmljYW50IHZhcmlhYmxlcwpNYXhIb3NwaXRhbFN1bW1hcnkgPSByZXN1bHRfdGFibGUgJT4lIGdyb3VwX2J5KEJldGEsIEluZmVjdGlvblRpbWUsIEhvc3BpdGFsaXphdGlvblJhdGUsIEhvc3BpdGFsaXphdGlvblRpbWUpICU+JSBzdW1tYXJpc2UoQXZlcmFnZS5NYXhIb3NwaXRhbFByb3BvcnRpb24gPSBtZWFuKE1heEhvc3BpdGFsUHJvcG9ydGlvbikpCk1heEhvc3BpdGFsU3VtbWFyeSRJbmZlY3Rpb25UaW1lID0gaWZlbHNlKE1heEhvc3BpdGFsU3VtbWFyeSRJbmZlY3Rpb25UaW1lID09IDEsICJXaXRoIHF1YXJhbnRpbmUiLCAiV2l0aG91dCBxdWFyYW50aW5lIikKCiMgSW50ZXJhY3Rpb24gUGxvdApnZ3Bsb3QoTWF4SG9zcGl0YWxTdW1tYXJ5LCAKICAgICAgIGFlcyh4ID0gSG9zcGl0YWxpemF0aW9uVGltZSwgCiAgICAgICAgICAgeSA9IEF2ZXJhZ2UuTWF4SG9zcGl0YWxQcm9wb3J0aW9uLCAKICAgICAgICAgICBncm91cCA9IEJldGEsCiAgICAgICAgICAgY29sb3IgPSBCZXRhKSkgKyAKICBnZW9tX2xpbmUoKSArCiAgZ2VvbV9wb2ludCgpICsgCiAgZmFjZXRfZ3JpZChJbmZlY3Rpb25UaW1lIH4gSG9zcGl0YWxpemF0aW9uUmF0ZSwgbGFiZWxsZXIgPSBsYWJlbGxlcihIb3NwaXRhbGl6YXRpb25SYXRlID0gSG9zcGl0YWxpemF0aW9uUmF0ZS5sYWJzKSkgKwogIHRoZW1lX2J3KCkgKyAKICBsYWJzKHkgPSAiQXZlcmFnZSBNYXhpbXVtIERhaWx5IEhvc3BpdGFsaXphdGlvbiBQcm9wb3J0aW9uIikgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0idG9wIikKYGBg