1. Model Introduction

The following model is developed from SIR-type compartmental models for COVID-19, including hospitalization as an intervention strategy. Contrary to basic SIR model in which the whole population is considered susceptible, the proposed deterministic model takes into account the fact that only certain percentage of the population being susceptible to get the disease.

Compartments

This model is proposed to trace epidemic evolution in an isolated population of \(N\) individuals. At each moment of time (day), the population could be divided into five states (compartments):

  • Susceptible \((S)\): currently at risk of getting the disease
  • Newly Infected \((I)\): currently infected and infectious (being able to transmit the disease)
  • Hospitalized \((H)\): currently infected and in critical conditions but no longer infectious. (beingisolated in hospital)
  • Non-Hospitalized \((NH)\): Still infected but not in the hospital so is still infectious
  • Recovered \((R)\): was infected but successfully recovered (no matter if hospitalized or not), and isnow immune from the disease (transferred to the Non-Susceptible group).
  • Dead \((D)\): difference between Infected and Recovered (I−R) i.e. was infected but failed to recover.

Note that there is one additional end state that recovered people will be counted in:

  • Non-Susceptible \((NS)\): either successfully recovered or initially at no risk of getting infected.

Assumptions

The model is built upon several assumptions:

  • Hospitalized individuals can no longer spread the disease. This follows that individuals once hos-pitalized are isolated from the community. For Non-hospitalized individuals, we will assume thatthey still spread the disease, but at a lower rate than that of newely infected individuals.
  • Immunity from the disease is achieved and becomes permanent upon recovery, which makesRanabsorbing state. This means once recovered, an individual can no longer be susceptible (and thusmoved intoNSstate). This assumption can be made as we have only literature finds the rate ofre-infection to be negligible.
  • The next day from being infected, a percentage of individuals will be placed into the hospital.
  • Once becoming hospitalized or not hospitalized, individuals will leave the compartment at someaverage rate. Afterwards, they will have either recovered or died.

Parameters

At the beginning of the disease, we will have an initial number of people susceptible to the diseaseand a initial number of people infected with the disease. Therefore, the compartments at \(t= 0\) are: * \(S_0, I_0 > 0\) * \(NS_0 \geq 0\) * \(H_0 = R_0 = D_0 = {NH}_0 = 0\)

The compartmentalization of the population are governed by a set of parameters:

  • Transmission rate \(\beta\): the infection rate (The probability of an infection from a single contact multiplied by the average amount of contacts per person).
  • Hospitalization percentage \(\varepsilon\): the percentage ofinfected individuals that will endup being hospitalized.
  • Hospitalized removal rate \(\psi\): The rate at which people will leave the hospital. The inverse ofthis parameter represents the average time spent in the hospital.
  • Non-hospitalized removal rate \(\lambda\): The rate at which people will leave the hospital.The inverse of this parameter represents the average amount of time an infected individual remains infectedand infective before moving to the next stage (recover or die).
  • Recovery percentage without hospitalization \(\gamma\): The percentage of non-hospitalized infectedpeople who recovered from the disease. \(1-\gamma\) is the percentage of people who will die after not being hospitalized.
  • Recovery percentage with hospitalization \(\theta\): the percentage chance that an individual has ofbecoming fully recovered after being hospitalized. \(1-\theta\) is the percentage of people who will die after being hospitalized.

Schematic flow chart between compartments

Mathematical Equations

Taking into consideration our 5 compartments, the model is described by a set of equations:

\[\begin{align*} \Delta{S_t} & = - \frac{\beta S_{t-1}}{N} (I_{t-1} + \textit{NH}_{t-1}) \\ \Delta{I_t} & = \frac{\beta S_{t-1}}{N}I_{t-1} - I_{t-1} \\ \Delta{H_{t}} & = \varepsilon*I_{t-1} - \psi H_{t-1} \\ \Delta{NH_{t}} & = (1-\varepsilon)I_{t-1} - \lambda \textit{NH}_{t-1} \\ \Delta{R_{t}} & = \lambda \gamma \textit{NH}_{t-1} + \psi \theta H_{t-1} \\ \Delta{D_{t}} & = \lambda (1 - \gamma) \textit{NH}_{t-1} + \psi (1 - \theta) H_{t-1} \end{align*}\]

Notice that \(\Delta{S_t} + \Delta I_{t} + \Delta {H_{t}} + \Delta {NH_{t}} + \Delta {R_{t}} + \Delta {D_{t}} = 0\) which means no person will leave or be added to the system.

Moreover, \(S_t + I_t + H_t + H_t + NH_t + NS_t + D_t = P\) (Note: \(NS\) includes people who have recovered and who were initially non-susceptible.)

Example

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

Iowa State Experiments

Applying this model to the state of Iowa, which has a population of roughly 3 million (\(N = 3,000,000\)), with a susceptible group of 1,499,995 (\(p = 0.5\)) with 5 being initially infected (i.e the beginning of the disease). We use the per capita transmission rate of 3 over the total population (\(\beta = 0.000001\)), hospitalization percentage of 70% (\(\varepsilon = 0.7\)), a recovery rate of 90% (\(\gamma = 0.9\)) for infected individual not being hospitalized, and 80% (\(\theta = 0.8\)) for people in hospitalization. We assume that everyday around 10% of the infected group in the hospital the previous day will either recover or die (\(\psi = 0.1\)). For people not hospitalized, we’ll have 20% (\(\lambda = 0.2\)) either recover or die.

Before getting detected and hospitalized, the 5 initial infected had spread the disease to \(5 \times 0.000001 \times 1,499,995 = 7\) other people. On the first day, there are \(1,499,995 - 7 = 1,499,988\) people left in the susceptible group, \(5 \times 0.8 = 4\) infected people in the hospital and \(7 + 5 - 4 = 8\) infected and infective people in the community. The total number of infected individuals is \(8 + 4 = 12\), but only 8 people will be the source of transmission for the second day.

At the end of the first day, for the new 7 cases, \(7 \times 0.8 = 5\) will be admitted to the hospital, increasing the total number of hospitalized individuals to \(4 + 5 = 9\), and \(12 - 9 = 3\) remained infected in the community. On the second day, \(8 \times 0.000001 \times 1,499,988 = 12\) people are newly infected with the disease, leaving \(1,499,988 - 12 = 1,499,976\) in the susceptible group. The total number of infected at this point is \(12 + 12 = 24\), but only \(12 + 3 = 15\) people will be the source of transmission for the second day. This model examines the disease for 81 days before it reaches equilibrium state, newly infected = 0.

Evolution of Infectious Disease in Iowa State

2. Factorial Experiment Design

Response Variables

  • Total Death Proportion
  • Total Infected Proportion
  • Number of Days (disease lasts)
  • Peak Prevalence (Max Infected Proportion)
  • Max Hospitalized Proportion

Explanatory Variables of 7 factors with 288 levels

  • Population \(N\)
    • small town - 10,000
    • big town - 100,000
    • mega city - 1,000,000
  • Transmission Rate \(\beta\)
    • \(2/N\)
    • \(4/N\)
  • Hospitalization Rate \(\varepsilon\)
    • 5%
    • 10%
    • 15%
  • Recovery Rate with Hospitalization \(\theta\)
    • 90%
    • 95%
  • Recovery Rate without Hospitalization \(\gamma\)
    • 90%
    • 95%
  • Average time in hospital \({\psi}^{-1}\)
    • 5 days
    • 10 days
  • Average time in infected status \({\lambda}^{-1}\)
    • 1 day
    • 5 days

Response Variable: Total Death Proportion

                             Df  Sum Sq  Mean Sq F value  Pr(>F)    
Population                    2 0.00012 0.000061   1.674 0.18947    
TransmissionRate              3 0.03872 0.012905 355.643 < 2e-16 ***
HospitalizationRate           2 0.00004 0.000019   0.513 0.59955    
HospitalizedRecoveryRate      1 0.00007 0.000067   1.856 0.17417    
NonHospitalizedRecoveryRate   1 0.01244 0.012442 342.884 < 2e-16 ***
HospitalizationTime           1 0.00000 0.000005   0.124 0.72485    
InfectionTime                 1 0.00029 0.000292   8.042 0.00491 ** 
Residuals                   276 0.01002 0.000036                    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Response Variable: Total Infected Proportion

                             Df Sum Sq Mean Sq F value Pr(>F)    
Population                    2   0.21    0.11   0.488  0.615    
TransmissionRate              3  86.98   28.99 131.731 <2e-16 ***
HospitalizationRate           2   0.95    0.48   2.163  0.117    
HospitalizedRecoveryRate      1   0.00    0.00   0.000  1.000    
NonHospitalizedRecoveryRate   1   0.00    0.00   0.000  1.000    
HospitalizationTime           1   0.23    0.23   1.049  0.307    
InfectionTime                 1  97.16   97.16 441.463 <2e-16 ***
Residuals                   276  60.75    0.22                   
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Response Variable: Maximum New Case Proportion

                             Df Sum Sq Mean Sq  F value   Pr(>F)    
Population                    2 0.0009  0.0004    8.742 0.000208 ***
TransmissionRate              3 1.2113  0.4038 8038.183  < 2e-16 ***
HospitalizationRate           2 0.0052  0.0026   51.471  < 2e-16 ***
HospitalizedRecoveryRate      1 0.0000  0.0000    0.000 1.000000    
NonHospitalizedRecoveryRate   1 0.0000  0.0000    0.000 1.000000    
HospitalizationTime           1 0.0000  0.0000    0.000 1.000000    
InfectionTime                 1 0.1068  0.1068 2126.243  < 2e-16 ***
Residuals                   276 0.0139  0.0001                      
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Response Variable: Peak Day of Infected

                             Df Sum Sq Mean Sq  F value   Pr(>F)    
Population                    2   2187  1093.6 1104.224  < 2e-16 ***
TransmissionRate              3   4353  1451.1 1465.268  < 2e-16 ***
HospitalizationRate           2     16     8.2    8.302 0.000315 ***
HospitalizedRecoveryRate      1      0     0.0    0.000 1.000000    
NonHospitalizedRecoveryRate   1      0     0.0    0.000 1.000000    
HospitalizationTime           1      0     0.0    0.000 1.000000    
InfectionTime                 1    321   320.9  324.020  < 2e-16 ***
Residuals                   276    273     1.0                      
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Response Variable: Total Hospitalized Proportion

                             Df  Sum Sq  Mean Sq F value   Pr(>F)    
Population                    2 0.00003 0.000016    0.75    0.473    
TransmissionRate              3 0.00380 0.001268   60.09  < 2e-16 ***
HospitalizationRate           2 0.05479 0.027393 1298.09  < 2e-16 ***
HospitalizedRecoveryRate      1 0.00000 0.000000    0.00    1.000    
NonHospitalizedRecoveryRate   1 0.00000 0.000000    0.00    1.000    
HospitalizationTime           1 0.00036 0.000358   16.95 5.06e-05 ***
InfectionTime                 1 0.00302 0.003023  143.25  < 2e-16 ***
Residuals                   276 0.00582 0.000021                     
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Response Variable: Peak Day of Hospitalization

                             Df Sum Sq Mean Sq  F value  Pr(>F)    
Population                    2   2107  1053.4  700.192 < 2e-16 ***
TransmissionRate              3   7457  2485.8 1652.344 < 2e-16 ***
HospitalizationRate           2     19     9.7    6.462 0.00181 ** 
HospitalizedRecoveryRate      1      0     0.0    0.000 1.00000    
NonHospitalizedRecoveryRate   1      0     0.0    0.000 1.00000    
HospitalizationTime           1      5     4.5    2.991 0.08484 .  
InfectionTime                 1    480   480.5  319.390 < 2e-16 ***
Residuals                   276    415     1.5                     
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
LS0tCnRpdGxlOiAiSW5mZWN0aW91cyBEaXNlYXNlIE1vZGVsaW5nIgphdXRob3I6ICJMaW5oIFRhbmcsIEJyaXRuZXkgSGUsIEJvd2VuIE1pbmNlIgpkYXRlOiAiMTIvMTEvMjAyMCIKb3V0cHV0OiAKICBodG1sX25vdGVib29rOgogICAgY29kZV9mb2xkaW5nOiBoaWRlCi0tLQoKYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9CmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gRkFMU0UsIG1lc3NhZ2UgPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFKQpsaWJyYXJ5KGRwbHlyKQpsaWJyYXJ5KGdncGxvdDIpCmBgYAoKIyMgMS4gTW9kZWwgSW50cm9kdWN0aW9uCgpUaGUgZm9sbG93aW5nIG1vZGVsIGlzIGRldmVsb3BlZCBmcm9tIFNJUi10eXBlIGNvbXBhcnRtZW50YWwgbW9kZWxzIGZvciBDT1ZJRC0xOSwgaW5jbHVkaW5nIGhvc3BpdGFsaXphdGlvbiBhcyBhbiBpbnRlcnZlbnRpb24gc3RyYXRlZ3kuIENvbnRyYXJ5IHRvIGJhc2ljIFNJUiBtb2RlbCBpbiB3aGljaCB0aGUgd2hvbGUgcG9wdWxhdGlvbiBpcyBjb25zaWRlcmVkIHN1c2NlcHRpYmxlLCB0aGUgcHJvcG9zZWQgZGV0ZXJtaW5pc3RpYyBtb2RlbCB0YWtlcyBpbnRvIGFjY291bnQgdGhlIGZhY3QgdGhhdCBvbmx5IGNlcnRhaW4gcGVyY2VudGFnZSBvZiB0aGUgcG9wdWxhdGlvbiBiZWluZyBzdXNjZXB0aWJsZSB0byBnZXQgdGhlIGRpc2Vhc2UuIAoKIyMjIENvbXBhcnRtZW50cwoKVGhpcyBtb2RlbCBpcyBwcm9wb3NlZCB0byB0cmFjZSBlcGlkZW1pYyBldm9sdXRpb24gaW4gYW4gaXNvbGF0ZWQgcG9wdWxhdGlvbiBvZiAkTiQgaW5kaXZpZHVhbHMuIEF0IGVhY2ggbW9tZW50IG9mIHRpbWUgKGRheSksIHRoZSBwb3B1bGF0aW9uIGNvdWxkIGJlIGRpdmlkZWQgaW50byBmaXZlIHN0YXRlcyAoY29tcGFydG1lbnRzKToKCiogKipTdXNjZXB0aWJsZSAkKFMpJCoqOiBjdXJyZW50bHkgYXQgcmlzayBvZiBnZXR0aW5nIHRoZSBkaXNlYXNlCiogKipOZXdseSBJbmZlY3RlZCAkKEkpJCoqOiBjdXJyZW50bHkgaW5mZWN0ZWQgYW5kIGluZmVjdGlvdXMgKGJlaW5nIGFibGUgdG8gdHJhbnNtaXQgdGhlIGRpc2Vhc2UpCiogKipIb3NwaXRhbGl6ZWQgJChIKSQqKjogY3VycmVudGx5IGluZmVjdGVkIGFuZCBpbiBjcml0aWNhbCBjb25kaXRpb25zIGJ1dCBubyBsb25nZXIgaW5mZWN0aW91cy4gIChiZWluZ2lzb2xhdGVkIGluIGhvc3BpdGFsKQoqICoqTm9uLUhvc3BpdGFsaXplZCAkKE5IKSQqKjogU3RpbGwgaW5mZWN0ZWQgYnV0IG5vdCBpbiB0aGUgaG9zcGl0YWwgc28gaXMgc3RpbGwgaW5mZWN0aW91cwoqICoqUmVjb3ZlcmVkICQoUikkKio6IHdhcyBpbmZlY3RlZCBidXQgc3VjY2Vzc2Z1bGx5IHJlY292ZXJlZCAobm8gbWF0dGVyIGlmIGhvc3BpdGFsaXplZCBvciBub3QpLCBhbmQgaXNub3cgaW1tdW5lIGZyb20gdGhlIGRpc2Vhc2UgKHRyYW5zZmVycmVkIHRvIHRoZSBOb24tU3VzY2VwdGlibGUgZ3JvdXApLgoqICoqRGVhZCAkKEQpJCoqOiBkaWZmZXJlbmNlIGJldHdlZW4gSW5mZWN0ZWQgYW5kIFJlY292ZXJlZCAoSeKIklIpIGkuZS4gIHdhcyBpbmZlY3RlZCBidXQgZmFpbGVkIHRvIHJlY292ZXIuCgpOb3RlIHRoYXQgdGhlcmUgaXMgb25lIGFkZGl0aW9uYWwgZW5kIHN0YXRlIHRoYXQgcmVjb3ZlcmVkIHBlb3BsZSB3aWxsIGJlIGNvdW50ZWQgaW46CgoqICoqTm9uLVN1c2NlcHRpYmxlICQoTlMpJCoqOiBlaXRoZXIgc3VjY2Vzc2Z1bGx5IHJlY292ZXJlZCBvciBpbml0aWFsbHkgYXQgbm8gcmlzayBvZiBnZXR0aW5nIGluZmVjdGVkLgoKIyMjIEFzc3VtcHRpb25zCgpUaGUgbW9kZWwgaXMgYnVpbHQgdXBvbiBzZXZlcmFsIGFzc3VtcHRpb25zOgoKKiBIb3NwaXRhbGl6ZWQgaW5kaXZpZHVhbHMgY2FuIG5vIGxvbmdlciBzcHJlYWQgdGhlIGRpc2Vhc2UuIFRoaXMgZm9sbG93cyB0aGF0IGluZGl2aWR1YWxzIG9uY2UgaG9zLXBpdGFsaXplZCBhcmUgaXNvbGF0ZWQgZnJvbSB0aGUgY29tbXVuaXR5LiBGb3IgTm9uLWhvc3BpdGFsaXplZCBpbmRpdmlkdWFscywgd2Ugd2lsbCBhc3N1bWUgdGhhdHRoZXkgc3RpbGwgc3ByZWFkIHRoZSBkaXNlYXNlLCBidXQgYXQgYSBsb3dlciByYXRlIHRoYW4gdGhhdCBvZiBuZXdlbHkgaW5mZWN0ZWQgaW5kaXZpZHVhbHMuCiogSW1tdW5pdHkgZnJvbSB0aGUgZGlzZWFzZSBpcyBhY2hpZXZlZCBhbmQgYmVjb21lcyBwZXJtYW5lbnQgdXBvbiByZWNvdmVyeSwgd2hpY2ggbWFrZXNSYW5hYnNvcmJpbmcgc3RhdGUuIFRoaXMgbWVhbnMgb25jZSByZWNvdmVyZWQsIGFuIGluZGl2aWR1YWwgY2FuIG5vIGxvbmdlciBiZSBzdXNjZXB0aWJsZSAoYW5kIHRodXNtb3ZlZCBpbnRvTlNzdGF0ZSkuIFRoaXMgYXNzdW1wdGlvbiBjYW4gYmUgbWFkZSBhcyB3ZSBoYXZlIG9ubHkgbGl0ZXJhdHVyZSBmaW5kcyB0aGUgcmF0ZSBvZnJlLWluZmVjdGlvbiB0byBiZSBuZWdsaWdpYmxlLgoqIFRoZSBuZXh0IGRheSBmcm9tIGJlaW5nIGluZmVjdGVkLCBhIHBlcmNlbnRhZ2Ugb2YgaW5kaXZpZHVhbHMgd2lsbCBiZSBwbGFjZWQgaW50byB0aGUgaG9zcGl0YWwuCiogT25jZSBiZWNvbWluZyBob3NwaXRhbGl6ZWQgb3Igbm90IGhvc3BpdGFsaXplZCwgIGluZGl2aWR1YWxzIHdpbGwgbGVhdmUgdGhlIGNvbXBhcnRtZW50IGF0IHNvbWVhdmVyYWdlIHJhdGUuIEFmdGVyd2FyZHMsIHRoZXkgd2lsbCBoYXZlIGVpdGhlciByZWNvdmVyZWQgb3IgZGllZC4KCiMjIyBQYXJhbWV0ZXJzCgpBdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBkaXNlYXNlLCB3ZSB3aWxsIGhhdmUgYW4gaW5pdGlhbCBudW1iZXIgb2YgcGVvcGxlIHN1c2NlcHRpYmxlIHRvIHRoZSBkaXNlYXNlYW5kIGEgaW5pdGlhbCBudW1iZXIgb2YgcGVvcGxlIGluZmVjdGVkIHdpdGggdGhlIGRpc2Vhc2UuICBUaGVyZWZvcmUsIHRoZSBjb21wYXJ0bWVudHMgYXQgJHQ9IDAkIGFyZToKKiAkU18wLCBJXzAgPiAwJAoqICROU18wIFxnZXEgMCQKKiAkSF8wID0gUl8wID0gRF8wID0ge05IfV8wID0gMCQKClRoZSBjb21wYXJ0bWVudGFsaXphdGlvbiBvZiB0aGUgcG9wdWxhdGlvbiBhcmUgZ292ZXJuZWQgYnkgYSBzZXQgb2YgcGFyYW1ldGVyczoKCiogKipUcmFuc21pc3Npb24gcmF0ZSAkXGJldGEkKio6IHRoZSBpbmZlY3Rpb24gcmF0ZSAoVGhlIHByb2JhYmlsaXR5IG9mIGFuIGluZmVjdGlvbiBmcm9tIGEgc2luZ2xlIGNvbnRhY3QgbXVsdGlwbGllZCBieSB0aGUgYXZlcmFnZSBhbW91bnQgb2YgY29udGFjdHMgcGVyIHBlcnNvbikuCiogKipIb3NwaXRhbGl6YXRpb24gcGVyY2VudGFnZSAkXHZhcmVwc2lsb24kKio6IHRoZSAgcGVyY2VudGFnZSBvZmluZmVjdGVkIGluZGl2aWR1YWxzIHRoYXQgd2lsbCBlbmR1cCAgYmVpbmcgaG9zcGl0YWxpemVkLgoqICoqSG9zcGl0YWxpemVkIHJlbW92YWwgcmF0ZSAkXHBzaSQqKjogVGhlIHJhdGUgYXQgd2hpY2ggcGVvcGxlIHdpbGwgbGVhdmUgdGhlIGhvc3BpdGFsLiAgVGhlIGludmVyc2Ugb2Z0aGlzIHBhcmFtZXRlciByZXByZXNlbnRzIHRoZSBhdmVyYWdlIHRpbWUgc3BlbnQgaW4gdGhlIGhvc3BpdGFsLgoqICoqTm9uLWhvc3BpdGFsaXplZCByZW1vdmFsIHJhdGUgJFxsYW1iZGEkKio6IFRoZSByYXRlIGF0IHdoaWNoIHBlb3BsZSB3aWxsIGxlYXZlIHRoZSBob3NwaXRhbC5UaGUgaW52ZXJzZSBvZiAgdGhpcyBwYXJhbWV0ZXIgcmVwcmVzZW50cyB0aGUgYXZlcmFnZSBhbW91bnQgIG9mICB0aW1lICBhbiAgaW5mZWN0ZWQgIGluZGl2aWR1YWwgIHJlbWFpbnMgIGluZmVjdGVkYW5kIGluZmVjdGl2ZSBiZWZvcmUgbW92aW5nIHRvIHRoZSBuZXh0IHN0YWdlIChyZWNvdmVyIG9yIGRpZSkuCiogKipSZWNvdmVyeSBwZXJjZW50YWdlIHdpdGhvdXQgaG9zcGl0YWxpemF0aW9uICRcZ2FtbWEkKio6IFRoZSBwZXJjZW50YWdlIG9mIG5vbi1ob3NwaXRhbGl6ZWQgaW5mZWN0ZWRwZW9wbGUgd2hvIHJlY292ZXJlZCBmcm9tIHRoZSBkaXNlYXNlLiAqKiQxLVxnYW1tYSQqKiBpcyB0aGUgcGVyY2VudGFnZSBvZiBwZW9wbGUgd2hvIHdpbGwgZGllIGFmdGVyIG5vdCBiZWluZyBob3NwaXRhbGl6ZWQuCiogKipSZWNvdmVyeSBwZXJjZW50YWdlIHdpdGggaG9zcGl0YWxpemF0aW9uICRcdGhldGEkKio6IHRoZSBwZXJjZW50YWdlIGNoYW5jZSB0aGF0IGFuIGluZGl2aWR1YWwgaGFzIG9mYmVjb21pbmcgZnVsbHkgcmVjb3ZlcmVkIGFmdGVyIGJlaW5nIGhvc3BpdGFsaXplZC4gKiokMS1cdGhldGEkKiogaXMgdGhlIHBlcmNlbnRhZ2Ugb2YgcGVvcGxlIHdobyB3aWxsIGRpZSBhZnRlciBiZWluZyBob3NwaXRhbGl6ZWQuCgo8Y2VudGVyPgoKIVtTY2hlbWF0aWMgZmxvdyBjaGFydCBiZXR3ZWVuIGNvbXBhcnRtZW50c10oQ29tcGxleEFwcC9zY2hlbWUucG5nKXt3aWR0aD03MCV9Cgo8L2NlbnRlcj4KCiMjIyBNYXRoZW1hdGljYWwgRXF1YXRpb25zCgpUYWtpbmcgaW50byBjb25zaWRlcmF0aW9uIG91ciA1IGNvbXBhcnRtZW50cywgdGhlIG1vZGVsIGlzIGRlc2NyaWJlZCBieSBhIHNldCBvZiBlcXVhdGlvbnM6CgpcYmVnaW57YWxpZ24qfQogICAgXERlbHRhe1NfdH0gJiA9ICAtIFxmcmFje1xiZXRhIFNfe3QtMX19e059IChJX3t0LTF9ICsgXHRleHRpdHtOSH1fe3QtMX0pIFxcCiAgICBcRGVsdGF7SV90fSAmID0gXGZyYWN7XGJldGEgU197dC0xfX17Tn1JX3t0LTF9IC0gSV97dC0xfSAgXFwgCiAgICBcRGVsdGF7SF97dH19ICYgPSBcdmFyZXBzaWxvbipJX3t0LTF9IC0gXHBzaSBIX3t0LTF9IFxcCiAgICBcRGVsdGF7Tkhfe3R9fSAmID0gKDEtXHZhcmVwc2lsb24pSV97dC0xfSAtIFxsYW1iZGEgXHRleHRpdHtOSH1fe3QtMX0gXFwKICAgIFxEZWx0YXtSX3t0fX0gJiA9IFxsYW1iZGEgXGdhbW1hIFx0ZXh0aXR7Tkh9X3t0LTF9ICsgXHBzaSBcdGhldGEgSF97dC0xfSBcXAogICAgXERlbHRhe0Rfe3R9fSAmID0gXGxhbWJkYSAoMSAtIFxnYW1tYSkgXHRleHRpdHtOSH1fe3QtMX0gKyBccHNpICgxIC0gXHRoZXRhKSBIX3t0LTF9ClxlbmR7YWxpZ24qfQoKTm90aWNlIHRoYXQgJFxEZWx0YXtTX3R9ICsgXERlbHRhIElfe3R9ICsgXERlbHRhIHtIX3t0fX0gKyBcRGVsdGEge05IX3t0fX0gKyBcRGVsdGEge1Jfe3R9fSArIFxEZWx0YSB7RF97dH19ID0gMCQgd2hpY2ggbWVhbnMgbm8gcGVyc29uIHdpbGwgbGVhdmUgb3IgYmUgYWRkZWQgdG8gdGhlIHN5c3RlbS4KCk1vcmVvdmVyLCAkU190ICsgSV90ICsgSF90ICsgSF90ICsgTkhfdCArIE5TX3QgKyBEX3QgPSBQJCAoTm90ZTogJE5TJCBpbmNsdWRlcyBwZW9wbGUgd2hvIGhhdmUgcmVjb3ZlcmVkIGFuZCB3aG8gd2VyZSBpbml0aWFsbHkgbm9uLXN1c2NlcHRpYmxlLikKCmBgYHtyfQptb2RlbC5kYXRhID0gZnVuY3Rpb24oTiwgYmV0YSwgSS4wLCBwLCBlcHNpbG9uLCB0aGV0YSwgZ2FtbWEsIFRpbWVILCBUaW1lTkgpewogIEkucmF0ZSA9IGJldGEvTgogIHBzaSA9IDEvVGltZUgKICBsYW1iZGEgPSAxL1RpbWVOSAogIGN1cnIuZGF5ID0gMAogIFMgPSBwICogTiAtIEkuMAogIE5TLjAgPSBOIC0gUyAtIEkuMAogIE5TID0gTlMuMAogIE5ld0luZmVjdGVkID0gSS4wCiAgVG90YWwuSG9zcGl0YWwgPSAwCiAgVG90YWwuTm9uSG9zcGl0YWwgPSAwCiAgVG90YWwuSW5mZWN0ZWQgPSBOZXdJbmZlY3RlZCArIFRvdGFsLkhvc3BpdGFsICsgVG90YWwuTm9uSG9zcGl0YWwKICBUb3RhbC5JbmZlY3RpdmUgPSBOZXdJbmZlY3RlZCArIFRvdGFsLk5vbkhvc3BpdGFsCiAgSG9zcGl0YWwuUmVjb3ZlcmVkID0gMAogIE5vbkhvc3BpdGFsLlJlY292ZXJlZCA9IDAKICBIb3NwaXRhbC5EZWFkID0gMAogIE5vbkhvc3BpdGFsLkRlYWQgPSAwCiAgVG90YWwuUmVjb3ZlcmVkID0gSG9zcGl0YWwuUmVjb3ZlcmVkICsgTm9uSG9zcGl0YWwuUmVjb3ZlcmVkCiAgVG90YWwuRGVhZCA9IEhvc3BpdGFsLkRlYWQgKyBOb25Ib3NwaXRhbC5EZWFkCiAgUG9wID0gUyArIE5TICsgVG90YWwuSW5mZWN0ZWQgKyBUb3RhbC5EZWFkCiAgCiAgIyBJZiB5b3Ugd2FudCBhIGZ1bGwgdGFibGUgbGlrZSB0aGUgZXhjZWwsIHVuY29tbWVudCBhbGwgbGluZXMgaW4gdGhlIGRmIGJlbG93CiAgZGYgPSBkYXRhX2ZyYW1lKERheSA9IGN1cnIuZGF5LAogICAgICAgICAgICAgICAgICBTdXNjZXB0aWJsZSA9IFMsCiAgICAgICAgICAgICAgICAgIE5vbi5TdXNjZXB0aWJsZSA9IE5TLAogICAgICAgICAgICAgICAgICBEYWlseS5OZXcuQ2FzZSA9IE5ld0luZmVjdGVkLAogICAgICAgICAgICAgICAgICBUb3RhbC5Jbi5Ib3NwaXRhbCA9IFRvdGFsLkhvc3BpdGFsLAogICAgICAgICAgICAgICAgICAjIFRvdGFsLk5vbkhvc3BpdGFsID0gVG90YWwuTm9uSG9zcGl0YWwsCiAgICAgICAgICAgICAgICAgIEluZmVjdGVkID0gVG90YWwuSW5mZWN0ZWQsCiAgICAgICAgICAgICAgICAgICMgVG90YWwuSW5mZWN0aXZlID0gVG90YWwuSW5mZWN0aXZlLAogICAgICAgICAgICAgICAgICAjIFJlY292ZXJlZC5Jbi5Ib3NwaXRhbCA9IEhvc3BpdGFsLlJlY292ZXJlZCwKICAgICAgICAgICAgICAgICAgIyBEZWFkLkluLkhvc3BpdGFsID0gSG9zcGl0YWwuRGVhZCwKICAgICAgICAgICAgICAgICAgVG90YWwuUmVjb3ZlcmVkID0gVG90YWwuUmVjb3ZlcmVkLAogICAgICAgICAgICAgICAgICBUb3RhbC5EZWFkID0gVG90YWwuRGVhZCkKICAKICAjIFdhdGNoIHRoZSBkaXNlYXNlIHVudGlsIGl0IGVuZHMgKGRhaWx5IG5ldyBjYXNlID0gMCkgb3IgYXQgbWF4IDIwMCBkYXlzCiAgd2hpbGUoTmV3SW5mZWN0ZWQgKiBTID4gMCAmIGN1cnIuZGF5IDwgMjAwKXsKICAgIGN1cnIuZGF5ID0gY3Vyci5kYXkgKyAxCiAgICAKICAgICMgTnVtYmVyIG9mIGluZGl2aWR1YWxzIHJlY292ZXJlZCBmcm9tIHRoZSBpbmZlY3RlZCBpbiBob3NwaXRhbCAocHJldmlvdXMgZGF5KQogICAgSG9zcGl0YWwuUmVjb3ZlcmVkID0gSG9zcGl0YWwuUmVjb3ZlcmVkICsgcm91bmQodGhldGEgKiByb3VuZChUb3RhbC5Ib3NwaXRhbCAqIHBzaSkpCiAgICBIb3NwaXRhbC5EZWFkID0gSG9zcGl0YWwuRGVhZCArIHJvdW5kKFRvdGFsLkhvc3BpdGFsICogcHNpKSAtIHJvdW5kKHRoZXRhICogcm91bmQoVG90YWwuSG9zcGl0YWwgKiBwc2kpKQogICAgCiAgICAjIE51bWJlciBvZiBpbmRpdmlkdWFscyBkZWFkIGZyb20gdGhlIGluZmVjdGVkIGluIGhvc3BpdGFsIChwcmV2aW91cyBkYXkpCiAgICBOb25Ib3NwaXRhbC5SZWNvdmVyZWQgPSBOb25Ib3NwaXRhbC5SZWNvdmVyZWQgKyByb3VuZChnYW1tYSAqIHJvdW5kKFRvdGFsLk5vbkhvc3BpdGFsICogbGFtYmRhKSkKICAgIE5vbkhvc3BpdGFsLkRlYWQgPSBOb25Ib3NwaXRhbC5EZWFkICsgcm91bmQoVG90YWwuTm9uSG9zcGl0YWwgKiBsYW1iZGEpIC0gcm91bmQoZ2FtbWEgKiByb3VuZChUb3RhbC5Ob25Ib3NwaXRhbCAqIGxhbWJkYSkpCiAgICAKICAgICMgVG90YWwgbnVtYmVyIG9mIHJlY292ZXJlZCBvciBkZWFkIHNvIGZhciAoY3VtdWxhdGl2ZSkKICAgIFRvdGFsLlJlY292ZXJlZCA9IEhvc3BpdGFsLlJlY292ZXJlZCArIE5vbkhvc3BpdGFsLlJlY292ZXJlZAogICAgVG90YWwuRGVhZCA9IEhvc3BpdGFsLkRlYWQgKyBOb25Ib3NwaXRhbC5EZWFkCiAgICAKICAgICMgTnVtYmVyIG9mIGluZGl2aWR1YWxzIGhvc3BpdGFsaXplZCBmcm9tIHRoZSBpbmZlY3RlZCBpbiB0aGUgcHJldmlvdXMgZGF5CiAgICBUb3RhbC5Ib3NwaXRhbCA9IHJvdW5kKE5ld0luZmVjdGVkICogZXBzaWxvbikgKyBUb3RhbC5Ib3NwaXRhbCAtIHJvdW5kKFRvdGFsLkhvc3BpdGFsICogcHNpKQogICAgVG90YWwuTm9uSG9zcGl0YWwgPSBOZXdJbmZlY3RlZCAtIHJvdW5kKE5ld0luZmVjdGVkICogZXBzaWxvbikgKyBUb3RhbC5Ob25Ib3NwaXRhbCAtIHJvdW5kKFRvdGFsLk5vbkhvc3BpdGFsICogbGFtYmRhKQogICAgCiAgICAjIE5ld2x5IGluZmVjdGVkIGNhc2UgdG9kYXkgYW5kIHRvdGFsIGFjdGl2ZWx5IGluZmVjdGVkIHNvIGZhcgogICAgTmV3SW5mZWN0ZWQgPSByb3VuZChJLnJhdGUgKiBTICogVG90YWwuSW5mZWN0aXZlKQogICAgVG90YWwuSW5mZWN0ZWQgPSBOZXdJbmZlY3RlZCArIFRvdGFsLkhvc3BpdGFsICsgVG90YWwuTm9uSG9zcGl0YWwKICAgIAogICAgIyBTdXNjZXB0aWJsZSBwb3B1bGF0aW9uIGxlZnQKICAgIFMgPSBTIC0gTmV3SW5mZWN0ZWQKICAgIAogICAgIyBDdXJyZW50IG5vbi1zdXNjZXB0aWJsZSBncm91cAogICAgTlMgPSBOUy4wICsgVG90YWwuUmVjb3ZlcmVkCiAgICAKICAgICMgSW5mZWN0aXZlIGdyb3VwIHRoYXQgY2FuIHNwcmVhZCB0aGUgZGlzZWFzZSB0aGUgbmV4dCBkYXkKICAgIFRvdGFsLkluZmVjdGl2ZSA9IE5ld0luZmVjdGVkICsgVG90YWwuTm9uSG9zcGl0YWwKICAgIAogICAgIyBDb25maXJtIHBvcHVsYXRpb24KICAgIFBvcCA9IFMgKyBOUyArIFRvdGFsLkluZmVjdGVkICsgVG90YWwuRGVhZAogICAgCiAgICAjIElmIHlvdSB3YW50IGEgZnVsbCB0YWJsZSBsaWtlIHRoZSBleGNlbCwgdW5jb21tZW50IHRoaXMKICAgICMgZGF0YSA9IGMoY3Vyci5kYXksIFMsIE5TLCBOZXdJbmZlY3RlZCwgVG90YWwuSG9zcGl0YWwsIFRvdGFsLk5vbkhvc3BpdGFsLCBUb3RhbC5JbmZlY3RlZCwgVG90YWwuSW5mZWN0aXZlLCBIb3NwaXRhbC5SZWNvdmVyZWQsIEhvc3BpdGFsLkRlYWQsIFRvdGFsLlJlY292ZXJlZCwgVG90YWwuRGVhZCwgUG9wKQogICAgZGF0YSA9IGMoY3Vyci5kYXksIFMsIE5TLCBOZXdJbmZlY3RlZCwgVG90YWwuSG9zcGl0YWwsIFRvdGFsLkluZmVjdGVkLCBUb3RhbC5SZWNvdmVyZWQsIFRvdGFsLkRlYWQpCiAgICBkZiA9IHJiaW5kKGRmLCBkYXRhKQogIH0KICByZXR1cm4oZGYpCn0KCm1vZGVsLnBsb3QgPSBmdW5jdGlvbihkYXRhKXsKICBwID0gZ2dwbG90KGRhdGEgID0gZGF0YSwgYWVzKHggPSBEYXkpKSArCiAgICAgICAgZ2VvbV9saW5lKGFlcyh5ID0gU3VzY2VwdGlibGUsIGNvbG9yID0gIlN1c2NlcHRpYmxlIikpICsKICAgICAgICBnZW9tX2xpbmUoYWVzKHkgPSBEYWlseS5OZXcuQ2FzZSwgY29sb3IgPSAiRGFpbHkgTmV3IENhc2UiKSkgKwogICAgICAgIGdlb21fbGluZShhZXMoeSA9IEluZmVjdGVkLCBjb2xvciA9ICJJbmZlY3RlZCIpKSArCiAgICAgICAgZ2VvbV9saW5lKGFlcyh5ID0gVG90YWwuSW4uSG9zcGl0YWwsIGNvbG9yID0gIkN1cnJlbnRseSBJbiBIb3NwaXRhbCIpKSArCiAgICAgICAgZ2VvbV9saW5lKGFlcyh5ID0gVG90YWwuUmVjb3ZlcmVkLCBjb2xvciA9ICJUb3RhbCBSZWNvdmVyZCIpKSArCiAgICAgICAgZ2VvbV9saW5lKGFlcyh5ID0gVG90YWwuRGVhZCwgY29sb3IgPSAiVG90YWwgRGVhZCIpKSArCiAgICAgICAgc2NhbGVfY29sb3JfZGlzY3JldGUobmFtZSA9ICJDb21wYXJ0bWVudCIpICsKICAgICAgICBsYWJzKHkgPSAiUG9wdWxhdGlvbiIsIHRpdGxlID0gIlNJUkhEIE1vZGVsIikgKyAKICAgICAgICB0aGVtZV9taW5pbWFsKCkKICByZXR1cm4ocCkKfQoKbW9kZWwuaW5mbyA9IGZ1bmN0aW9uKGRhdGEpewogIExhc3QuRGF5ID0gbnJvdyhkYXRhKQogIFN0YXR1cyA9IGlmZWxzZShkYXRhW0xhc3QuRGF5LF0kRGFpbHkuTmV3LkNhc2UgPT0gMCwgIkVuZGVkIiwgIkdvaW5nIikKICBUb3RhbC5EZWF0aCA9IGRhdGFbTGFzdC5EYXksXSRUb3RhbC5EZWFkCiAgVG90YWwuSW5mZWN0ZWQgPSBzdW0oZGF0YSRJbmZlY3RlZCkKICBNYXguTmV3LkNhc2UgPSBtYXgoZGF0YSREYWlseS5OZXcuQ2FzZSkKICBQZWFrLkRheS5OZXcuQ2FzZSA9IGRhdGFbZGF0YSREYWlseS5OZXcuQ2FzZSA9PSBNYXguTmV3LkNhc2UsXSREYXkKICBNYXguSW4uSG9zcGl0YWwgPSBtYXgoZGF0YSRUb3RhbC5Jbi5Ib3NwaXRhbCkKICBQZWFrLkRheS5Ib3NwaXRhbD0gZGF0YVtkYXRhJFRvdGFsLkluLkhvc3BpdGFsID09IE1heC5Jbi5Ib3NwaXRhbCxdJERheQogIGluZm8gPSBjKExhc3QuRGF5LCBTdGF0dXMsIFRvdGFsLkRlYXRoLCBUb3RhbC5JbmZlY3RlZCwgTWF4Lk5ldy5DYXNlLCBQZWFrLkRheS5OZXcuQ2FzZSwgTWF4LkluLkhvc3BpdGFsLCBQZWFrLkRheS5Ib3NwaXRhbCkKICByZXR1cm4oaW5mbykKfQoKIyBDb25maXJtIHRoZSBtb2RlbCBieSBjYWxjdWxhdGluZyB0aGF0IGFsbCBjb21wYXJ0bWVudHMgc3VtIHRvIHBvcHVsYXRpb24gYXQgYW55IGRheQptb2RlbC5jb25maXJtID0gZnVuY3Rpb24oZGF0YSl7CiAgZGF0YSRQb3AgPSBkYXRhJFMgKyBkYXRhJE5TICsgZGF0YSRUb3RhbC5JbmZlY3RlZCArIGRhdGEkVG90YWwuRGVhZAogIHJldHVybihkYXRhKQp9CgpTSVJIRC5tb2RlbCA9IGZ1bmN0aW9uKE4sIGJldGEsIEkuMCwgcCwgZXBzaWxvbiwgdGhldGEsIGdhbW1hLCBUaW1lSCwgVGltZU5IKXsKICBwYXJhbSA9IGMoTiwgYmV0YS9OLCBlcHNpbG9uLCB0aGV0YSwgZ2FtbWEsIFRpbWVILCBUaW1lTkgpCiAgZGF0YSA9IG1vZGVsLmRhdGEoTiwgYmV0YSwgSS4wLCBwLCBlcHNpbG9uLCB0aGV0YSwgZ2FtbWEsIFRpbWVILCBUaW1lTkgpCiAgcGxvdCA9IG1vZGVsLnBsb3QoZGF0YSkKICByZXN1bHRfaW5mbyA9IG1vZGVsLmluZm8oZGF0YSkKICBpbmZvID0gYyhwYXJhbSwgcmVzdWx0X2luZm8pCiAgcmV0dXJuKGxpc3QoZGF0YSxwbG90LGluZm8pKQp9CiMgdGVzdC5tb2RlbCA9IFNJUkhELm1vZGVsKDEwMDAwLCAyLCA1LCAwLjUsIDAuOCwgMC45LCAwLjksIDEwLCA1KQpgYGAKCiMjIyBFeGFtcGxlCgpCZWxvdyBpcyBhbiBleGFtcGxlIG9mIGEgbW9kZWwgb24gMTAwMDAgcG9wdWxhdGlvbiB3aXRoIGEgdHJhbm1pc3Npb24gcmF0ZSA9IDIvMTAwMDAsIDUgaW5pdGlhbCBpbmZlY3RlZCBpbmlkaXZpZHVhbCwgNTAlIHN1c2NlcHRpYmxlIHJhdGUsIDIwJSBob3NwaXRhbGl6YXRpb24gcmF0ZSwgcmVjb3ZlcnkgcmF0ZSBmb3IgYm90aCBob3NwaXRhbGl6ZWQgYW5kIG5vbi1ob3NwaXRhbGl6ZWQgaW5kaXZpZHVhbHMgYXJlIDkwJSwgdGltZSBzcGVuZCBpbiBob3NwaXRhbCBpcyAxMCBkYXlzLCBhbmQgaW5mZWN0aW91cyB0aW1lIChub24taG9zcGl0YWxpemVkKSBpcyA1IGRheXMuCgpgYGB7cn0KdGVzdC5tb2RlbCA9IFNJUkhELm1vZGVsKDEwMDAwLCAyLCA1LCAwLjUsIDAuMiwgMC45LCAwLjksIDEwLCA1KQp0ZXN0Lm1vZGVsW1sxXV0KdGVzdC5tb2RlbFtbMl1dCm1vZGVsLnN1bW1hcnkgPSBjYmluZChjKCJQb3B1bGF0aW9uIiwgIlRyYW5zbWlzc2lvblJhdGUiLCAiSG9zcGl0YWxpemF0aW9uUmF0ZSIsICJIb3NwaXRhbGl6ZWRSZWNvdmVyeVJhdGUiLCAiTm9uSG9zcGl0YWxpemVkUmVjb3ZlcnlSYXRlIiwgIkhvc3BpdGFsaXphdGlvblRpbWUiLCAiSW5mZWN0aW9uVGltZSIpLCB0ZXN0Lm1vZGVsW1szXV1bMTo3XSwgYygiTGFzdERheSIsICJTdGF0dXMiLCAiVG90YWxEZWF0aCIsICJUb3RhbEluZmVjdGVkIiwgIk1heE5ld0Nhc2UiLCAiUGVha0RheU5ld0Nhc2UiLCAiTWF4SW5Ib3NwaXRhbCIsICJQZWFrRGF5SG9zcGl0YWwiKSwgdGVzdC5tb2RlbFtbM11dWzg6MTVdKQptb2RlbC5zdW1tYXJ5ID0gYXMuZGF0YS5mcmFtZShtb2RlbC5zdW1tYXJ5KQpjb2xuYW1lcyhtb2RlbC5zdW1tYXJ5KSA9IGMoIlBhcmFtZXRlciIsICJWYWx1ZSIsICJSZXN1bHQiLCAiVmFsdWUiKQptb2RlbC5zdW1tYXJ5CmBgYAoKIyMjIElvd2EgU3RhdGUgRXhwZXJpbWVudHMKCkFwcGx5aW5nIHRoaXMgbW9kZWwgdG8gdGhlIHN0YXRlIG9mIElvd2EsIHdoaWNoIGhhcyBhIHBvcHVsYXRpb24gb2Ygcm91Z2hseSAzIG1pbGxpb24gKCROID0gMywwMDAsMDAwJCksIHdpdGggYSBzdXNjZXB0aWJsZSBncm91cCBvZiAxLDQ5OSw5OTUgKCRwID0gMC41JCkgd2l0aCA1IGJlaW5nIGluaXRpYWxseSBpbmZlY3RlZCAgKGkuZSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBkaXNlYXNlKS4gV2UgdXNlIHRoZSBwZXIgY2FwaXRhIHRyYW5zbWlzc2lvbiByYXRlIG9mIDMgb3ZlciB0aGUgdG90YWwgcG9wdWxhdGlvbiAoJFxiZXRhID0gMC4wMDAwMDEkKSwgaG9zcGl0YWxpemF0aW9uIHBlcmNlbnRhZ2Ugb2YgNzBcJSAoJFx2YXJlcHNpbG9uID0gMC43JCksIGEgcmVjb3ZlcnkgcmF0ZSBvZiA5MFwlICgkXGdhbW1hID0gMC45JCkgZm9yIGluZmVjdGVkIGluZGl2aWR1YWwgbm90IGJlaW5nIGhvc3BpdGFsaXplZCwgYW5kIDgwXCUgKCRcdGhldGEgPSAwLjgkKSBmb3IgcGVvcGxlIGluIGhvc3BpdGFsaXphdGlvbi4gV2UgYXNzdW1lIHRoYXQgZXZlcnlkYXkgYXJvdW5kIDEwXCUgb2YgdGhlIGluZmVjdGVkIGdyb3VwIGluIHRoZSBob3NwaXRhbCB0aGUgcHJldmlvdXMgZGF5IHdpbGwgZWl0aGVyIHJlY292ZXIgb3IgZGllICgkXHBzaSA9IDAuMSQpLiBGb3IgcGVvcGxlIG5vdCBob3NwaXRhbGl6ZWQsIHdlJ2xsIGhhdmUgMjBcJSAoJFxsYW1iZGEgPSAwLjIkKSBlaXRoZXIgcmVjb3ZlciBvciBkaWUuIAoKQmVmb3JlIGdldHRpbmcgZGV0ZWN0ZWQgYW5kIGhvc3BpdGFsaXplZCwgdGhlIDUgaW5pdGlhbCBpbmZlY3RlZCBoYWQgc3ByZWFkIHRoZSBkaXNlYXNlIHRvICQ1IFx0aW1lcyAwLjAwMDAwMSBcdGltZXMgMSw0OTksOTk1ID0gNyQgb3RoZXIgcGVvcGxlLiBPbiB0aGUgZmlyc3QgZGF5LCB0aGVyZSBhcmUgJDEsNDk5LDk5NSAtIDcgPSAxLDQ5OSw5ODgkIHBlb3BsZSBsZWZ0IGluIHRoZSBzdXNjZXB0aWJsZSBncm91cCwgJDUgXHRpbWVzIDAuOCA9IDQkIGluZmVjdGVkIHBlb3BsZSBpbiB0aGUgaG9zcGl0YWwgYW5kICQ3ICsgNSAtIDQgPSA4JCBpbmZlY3RlZCBhbmQgaW5mZWN0aXZlIHBlb3BsZSBpbiB0aGUgY29tbXVuaXR5LiBUaGUgdG90YWwgbnVtYmVyIG9mIGluZmVjdGVkIGluZGl2aWR1YWxzIGlzICQ4ICsgNCA9IDEyJCwgYnV0IG9ubHkgOCBwZW9wbGUgd2lsbCBiZSB0aGUgc291cmNlIG9mIHRyYW5zbWlzc2lvbiBmb3IgdGhlIHNlY29uZCBkYXkuCgpBdCB0aGUgZW5kIG9mIHRoZSBmaXJzdCBkYXksIGZvciB0aGUgbmV3IDcgY2FzZXMsICQ3IFx0aW1lcyAwLjggPSA1JCB3aWxsIGJlIGFkbWl0dGVkIHRvIHRoZSBob3NwaXRhbCwgaW5jcmVhc2luZyB0aGUgdG90YWwgbnVtYmVyIG9mIGhvc3BpdGFsaXplZCBpbmRpdmlkdWFscyB0byAkNCArIDUgPSA5JCwgYW5kICQxMiAtIDkgPSAzJCByZW1haW5lZCBpbmZlY3RlZCBpbiB0aGUgY29tbXVuaXR5LiBPbiB0aGUgc2Vjb25kIGRheSwgJDggXHRpbWVzIDAuMDAwMDAxIFx0aW1lcyAxLDQ5OSw5ODggPSAxMiQgcGVvcGxlIGFyZSBuZXdseSBpbmZlY3RlZCB3aXRoIHRoZSBkaXNlYXNlLCBsZWF2aW5nICQxLDQ5OSw5ODggLSAxMiA9IDEsNDk5LDk3NiQgaW4gdGhlIHN1c2NlcHRpYmxlIGdyb3VwLiBUaGUgdG90YWwgbnVtYmVyIG9mIGluZmVjdGVkIGF0IHRoaXMgcG9pbnQgaXMgJDEyICsgMTIgPSAyNCQsIGJ1dCBvbmx5ICQxMiArIDMgPSAxNSQgcGVvcGxlIHdpbGwgYmUgdGhlIHNvdXJjZSBvZiB0cmFuc21pc3Npb24gZm9yIHRoZSBzZWNvbmQgZGF5LiBUaGlzIG1vZGVsIGV4YW1pbmVzIHRoZSBkaXNlYXNlIGZvciA4MSBkYXlzIGJlZm9yZSBpdCByZWFjaGVzIGVxdWlsaWJyaXVtIHN0YXRlLCBuZXdseSBpbmZlY3RlZCA9IDAuCgohW0V2b2x1dGlvbiBvZiBJbmZlY3Rpb3VzIERpc2Vhc2UgaW4gSW93YSBTdGF0ZV0oQ29tcGxleEFwcC9Jb3dhU3RhdGVNb2RlbC5wbmcpCgoKIyMgMi4gRmFjdG9yaWFsIEV4cGVyaW1lbnQgRGVzaWduIAoKIyMjIFJlc3BvbnNlIFZhcmlhYmxlcworIFRvdGFsIERlYXRoIFByb3BvcnRpb24KKyBUb3RhbCBJbmZlY3RlZCBQcm9wb3J0aW9uCisgTnVtYmVyIG9mIERheXMgKGRpc2Vhc2UgbGFzdHMpCisgUGVhayBQcmV2YWxlbmNlIChNYXggSW5mZWN0ZWQgUHJvcG9ydGlvbikKKyBNYXggSG9zcGl0YWxpemVkIFByb3BvcnRpb24KICAKIyMjIEV4cGxhbmF0b3J5IFZhcmlhYmxlcyBvZiA3IGZhY3RvcnMgd2l0aCAyODggbGV2ZWxzCisgUG9wdWxhdGlvbiAkTiQKICAqIHNtYWxsIHRvd24gLSAxMCwwMDAKICAqIGJpZyB0b3duIC0gMTAwLDAwMAogICogbWVnYSBjaXR5IC0gMSwwMDAsMDAwCisgVHJhbnNtaXNzaW9uIFJhdGUgJFxiZXRhJAogICogJDIvTiQKICAqICQ0L04kCisgSG9zcGl0YWxpemF0aW9uIFJhdGUgJFx2YXJlcHNpbG9uJAogICogNVwlCiAgKiAxMFwlCiAgKiAxNVwlCisgUmVjb3ZlcnkgUmF0ZSB3aXRoIEhvc3BpdGFsaXphdGlvbiAkXHRoZXRhJAogICogOTAlCiAgKiA5NSUKKyBSZWNvdmVyeSBSYXRlIHdpdGhvdXQgSG9zcGl0YWxpemF0aW9uICRcZ2FtbWEkCiAgKiA5MCUKICAqIDk1JQorIEF2ZXJhZ2UgdGltZSBpbiBob3NwaXRhbCAke1xwc2l9XnstMX0kCiAgKiA1IGRheXMKICAqIDEwIGRheXMKKyBBdmVyYWdlIHRpbWUgaW4gaW5mZWN0ZWQgc3RhdHVzICR7XGxhbWJkYX1eey0xfSQKICAqIDEgZGF5CiAgKiA1IGRheXMKCmBgYHtyfQpJLjAgPSA1ClMucmF0ZSA9IDAuNQoKIyBMaXN0IG9mIEV4cGxhbmF0b3J5IFZhcmlhYmxlczoKUG9wLkxzdCA9IGMoMTAwMDAsIDEwMDAwMCwgMTAwMDAwMCkKQmV0YS5Mc3QgPSBjKDIsNCkKSHJhdGUuTHN0ID0gYygwLjA1LCAwLjEsIDAuMTUpClJyYXRlSC5Mc3QgPSBjKDAuOSwgMC45NSkKUnJhdGVOSC5Mc3QgPSBjKDAuOSwgMC45NSkKVGltZUguTHN0ID0gYygxMCwgMTUpClRpbWVOSC5Mc3QgPSBjKDEsIDUpCgojUG9wLkxzdCwgQmV0YS5Mc3QsIEhyYXRlLkxzdCwgUnJhdGVILkxzdCwgUnJhdGVOSC5Mc3QsIFRpbWVILkxzdCwgVGltZU5ILkxzdApyZXN1bHRfdGFibGUgPSBkYXRhLmZyYW1lKCkKZm9yKE4gaW4gUG9wLkxzdCl7CiAgZm9yKGIgaW4gQmV0YS5Mc3QpewogICAgZm9yKGhyIGluIEhyYXRlLkxzdCl7CiAgICAgIGZvcihycmggaW4gUnJhdGVILkxzdCl7CiAgICAgICAgZm9yKHJybmggaW4gUnJhdGVOSC5Mc3QpewogICAgICAgICAgZm9yKHRoIGluIFRpbWVILkxzdCl7CiAgICAgICAgICAgIGZvcih0bmggaW4gVGltZU5ILkxzdCl7CiAgICAgICAgICAgICAgbW9kZWwgPSBTSVJIRC5tb2RlbChOLCBiLCBJLjAsIFMucmF0ZSwgaHIsIHJyaCwgcnJuaCwgdGgsIHRuaCkKICAgICAgICAgICAgICByZXN1bHRfdGFibGUgPSByYmluZChyZXN1bHRfdGFibGUsIG1vZGVsW1szXV0sIHN0cmluZ3NBc0ZhY3RvcnMgPSBGQUxTRSkKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KfQpjb2xuYW1lcyhyZXN1bHRfdGFibGUpID0gYygiUG9wdWxhdGlvbiIsICJUcmFuc21pc3Npb25SYXRlIiwgIkhvc3BpdGFsaXphdGlvblJhdGUiLCAiSG9zcGl0YWxpemVkUmVjb3ZlcnlSYXRlIiwgIk5vbkhvc3BpdGFsaXplZFJlY292ZXJ5UmF0ZSIsICJIb3NwaXRhbGl6YXRpb25UaW1lIiwgIkluZmVjdGlvblRpbWUiLCAiTGFzdERheSIsICJTdGF0dXMiLCAiVG90YWxEZWF0aCIsICJUb3RhbEluZmVjdGVkIiwgIk1heE5ld0Nhc2UiLCAiUGVha0RheU5ld0Nhc2UiLCAiTWF4SW5Ib3NwaXRhbCIsICJQZWFrRGF5SG9zcGl0YWwiKQpyZXN1bHRfdGFibGVbMTo3XSA9IGFzLmRhdGEuZnJhbWUoc2FwcGx5KHJlc3VsdF90YWJsZVsxOjddLCBhcy5udW1lcmljKSkKcmVzdWx0X3RhYmxlWzE6N10gPSBmb3JtYXQocmVzdWx0X3RhYmxlWzE6N10sIHNjaWVudGlmaWMgPSBGQUxTRSkKcmVzdWx0X3RhYmxlW2MoMTo3LDkpXSA9IGFzLmRhdGEuZnJhbWUoc2FwcGx5KHJlc3VsdF90YWJsZVtjKDE6Nyw5KV0sIGFzLmZhY3RvcikpCnJlc3VsdF90YWJsZVtjKDgsMTA6MTUpXSA9IGFzLmRhdGEuZnJhbWUoc2FwcGx5KHJlc3VsdF90YWJsZVtjKDgsMTA6MTUpXSwgYXMubnVtZXJpYykpCgpudW1lcmljUG9wID0gYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIocmVzdWx0X3RhYmxlJFBvcHVsYXRpb24pKQoKcmVzdWx0X3RhYmxlJERlYXRoUHJvcG9ydGlvbiA9IHJlc3VsdF90YWJsZSRUb3RhbERlYXRoIC8gbnVtZXJpY1BvcApyZXN1bHRfdGFibGUkSW5mZWN0ZWRQcm9wb3J0aW9uID0gcmVzdWx0X3RhYmxlJFRvdGFsSW5mZWN0ZWQgLyBudW1lcmljUG9wCnJlc3VsdF90YWJsZSRNYXhDYXNlUHJvcG9ydGlvbiA9IHJlc3VsdF90YWJsZSRNYXhOZXdDYXNlIC8gbnVtZXJpY1BvcApyZXN1bHRfdGFibGUkTWF4SG9zcGl0YWxQcm9wb3J0aW9uID0gcmVzdWx0X3RhYmxlJE1heEluSG9zcGl0YWwgLyBudW1lcmljUG9wCnJlc3VsdF90YWJsZQpgYGAKCiMjIyMgUmVzcG9uc2UgVmFyaWFibGU6IFRvdGFsIERlYXRoIFByb3BvcnRpb24KCmBgYHtyfQpEZWF0aC5Bbm92YSA9IGFvdihEZWF0aFByb3BvcnRpb24gfiBQb3B1bGF0aW9uICsgVHJhbnNtaXNzaW9uUmF0ZSArIEhvc3BpdGFsaXphdGlvblJhdGUgKyBIb3NwaXRhbGl6ZWRSZWNvdmVyeVJhdGUgKyBOb25Ib3NwaXRhbGl6ZWRSZWNvdmVyeVJhdGUgKyBIb3NwaXRhbGl6YXRpb25UaW1lICsgSW5mZWN0aW9uVGltZSwgZGF0YSA9IHJlc3VsdF90YWJsZSkgCnN1bW1hcnkoRGVhdGguQW5vdmEpCmBgYAoKIyMjIyBSZXNwb25zZSBWYXJpYWJsZTogVG90YWwgSW5mZWN0ZWQgUHJvcG9ydGlvbgoKYGBge3J9CkluZmVjdGVkLkFub3ZhID0gYW92KEluZmVjdGVkUHJvcG9ydGlvbiB+IFBvcHVsYXRpb24gKyBUcmFuc21pc3Npb25SYXRlICsgSG9zcGl0YWxpemF0aW9uUmF0ZSArIEhvc3BpdGFsaXplZFJlY292ZXJ5UmF0ZSArIE5vbkhvc3BpdGFsaXplZFJlY292ZXJ5UmF0ZSArIEhvc3BpdGFsaXphdGlvblRpbWUgKyBJbmZlY3Rpb25UaW1lLCBkYXRhID0gcmVzdWx0X3RhYmxlKQpzdW1tYXJ5KEluZmVjdGVkLkFub3ZhKQpgYGAKCiMjIyMgUmVzcG9uc2UgVmFyaWFibGU6IE1heGltdW0gTmV3IENhc2UgUHJvcG9ydGlvbgoKYGBge3J9Ck5ld0Nhc2UuQW5vdmEgPSBhb3YoTWF4Q2FzZVByb3BvcnRpb24gfiBQb3B1bGF0aW9uICsgVHJhbnNtaXNzaW9uUmF0ZSArIEhvc3BpdGFsaXphdGlvblJhdGUgKyBIb3NwaXRhbGl6ZWRSZWNvdmVyeVJhdGUgKyBOb25Ib3NwaXRhbGl6ZWRSZWNvdmVyeVJhdGUgKyBIb3NwaXRhbGl6YXRpb25UaW1lICsgSW5mZWN0aW9uVGltZSwgZGF0YSA9IHJlc3VsdF90YWJsZSkKc3VtbWFyeShOZXdDYXNlLkFub3ZhKQpgYGAKCiMjIyMgUmVzcG9uc2UgVmFyaWFibGU6IFBlYWsgRGF5IG9mIEluZmVjdGVkCgpgYGB7cn0KUGVha0RheS5Bbm92YSA9IGFvdihQZWFrRGF5TmV3Q2FzZSB+IFBvcHVsYXRpb24gKyBUcmFuc21pc3Npb25SYXRlICsgSG9zcGl0YWxpemF0aW9uUmF0ZSArIEhvc3BpdGFsaXplZFJlY292ZXJ5UmF0ZSArIE5vbkhvc3BpdGFsaXplZFJlY292ZXJ5UmF0ZSArIEhvc3BpdGFsaXphdGlvblRpbWUgKyBJbmZlY3Rpb25UaW1lLCBkYXRhID0gcmVzdWx0X3RhYmxlKQpzdW1tYXJ5KFBlYWtEYXkuQW5vdmEpCmBgYAoKIyMjIyBSZXNwb25zZSBWYXJpYWJsZTogVG90YWwgSG9zcGl0YWxpemVkIFByb3BvcnRpb24KCmBgYHtyfQpIb3NwaXRhbC5Bbm92YSA9IGFvdihNYXhIb3NwaXRhbFByb3BvcnRpb24gfiBQb3B1bGF0aW9uICsgVHJhbnNtaXNzaW9uUmF0ZSArIEhvc3BpdGFsaXphdGlvblJhdGUgKyBIb3NwaXRhbGl6ZWRSZWNvdmVyeVJhdGUgKyBOb25Ib3NwaXRhbGl6ZWRSZWNvdmVyeVJhdGUgKyBIb3NwaXRhbGl6YXRpb25UaW1lICsgSW5mZWN0aW9uVGltZSwgZGF0YSA9IHJlc3VsdF90YWJsZSkKc3VtbWFyeShIb3NwaXRhbC5Bbm92YSkKYGBgCgojIyMjIFJlc3BvbnNlIFZhcmlhYmxlOiBQZWFrIERheSBvZiBIb3NwaXRhbGl6YXRpb24KCmBgYHtyfQpQZWFrRGF5SC5Bbm92YSA9IGFvdihQZWFrRGF5SG9zcGl0YWwgfiBQb3B1bGF0aW9uICsgVHJhbnNtaXNzaW9uUmF0ZSArIEhvc3BpdGFsaXphdGlvblJhdGUgKyBIb3NwaXRhbGl6ZWRSZWNvdmVyeVJhdGUgKyBOb25Ib3NwaXRhbGl6ZWRSZWNvdmVyeVJhdGUgKyBIb3NwaXRhbGl6YXRpb25UaW1lICsgSW5mZWN0aW9uVGltZSwgZGF0YSA9IHJlc3VsdF90YWJsZSkKc3VtbWFyeShQZWFrRGF5SC5Bbm92YSkKYGBg