max.ts = 15
delta = 1
startproxel=c(1,0,0,1,0)
RG=matrix(c(1,1,0,1,
            0,1,1,1,
            0,0,1,1,
            0,0,0,1),ncol = 4,byrow = T)

Proxel_algo=function(RG,startproxel,delta,max.ts,Print=T){
  
counter_prob=0

unihrf <- function(age, a, b) {
  if (a <= age && age < b) {
    return (1.0 / (b - age))
  } else {
    return (0)
  }
}

exphrf <- function(age, l) {
  return (l)
}
  
proxel_list=list()
proxel_list[[max.ts+1]]=list()
proxel_list[[1]]=list(STEP=c(0),proxel=data.frame(state=startproxel[1],tau=startproxel[2],tau_k=startproxel[3],prob=startproxel[4],prev=startproxel[5]))
if(Print) print("initial proxel:")
if(Print) print(proxel_list[[1]])

for (timestep in 1:max.ts) {
  proxel_list[[timestep+1]]=list(timestep=c(timestep),proxel=data.frame(state=numeric(),tau=numeric(),tau_k=numeric(),prob=numeric(),prev=numeric()))     # erstelle schonmal eine neue leere liste für den nächsten timestep
  
  for (l in 1:nrow(proxel_list[[timestep]]$proxel)) {
    currprox = proxel_list[[timestep]]$proxel[l,]                                     # aktueller proxel zu dem folgeproxels erzeugt werden sollen
    folger = RG[as.numeric(currprox[1]),]                                             # folgestates von aktuellem proxel
    
    for (i in 1:4) {
      if (folger[i]==1) {                                                             # erstelle folgeproxel falls pfeil dahin gibt
        proxel_list[[timestep+1]]$proxel[nrow(proxel_list[[timestep+1]]$proxel)+1,1] = i                       # state vom nächsten proxel
        
        if(currprox$state==i) proxel_list[[timestep+1]]$proxel[nrow(proxel_list[[timestep+1]]$proxel),2] = currprox$tau + delta
          else proxel_list[[timestep+1]]$proxel[nrow(proxel_list[[timestep+1]]$proxel),2] = 0                    # tau vom nächsten proxel
        
        if(currprox$state %in% c(1,2,3) & i!=4) proxel_list[[timestep+1]]$proxel[nrow(proxel_list[[timestep+1]]$proxel),3] = currprox$tau_k + delta
          else if(currprox$state==4 & i==4) proxel_list[[timestep+1]]$proxel[nrow(proxel_list[[timestep+1]]$proxel),3] = currprox$tau_k - delta
            else proxel_list[[timestep+1]]$proxel[nrow(proxel_list[[timestep+1]]$proxel),3] = 0                   # tau_k vom nächsten proxel
          
        if(currprox$state==1 & i==2) {
          proxel_list[[timestep+1]]$proxel[nrow(proxel_list[[timestep+1]]$proxel),4] = (unihrf(currprox$tau_k,2,4) * delta) * currprox$prob
          counter_prob = counter_prob + unihrf(currprox$tau_k,2,4) * delta}                 # transition von S1 zu S2
        if(currprox$state==2 & i==3) {
          proxel_list[[timestep+1]]$proxel[nrow(proxel_list[[timestep+1]]$proxel),4] = (exphrf(currprox$tau_k,0.1) * delta) * currprox$prob
          counter_prob = counter_prob + exphrf(currprox$tau_k,0.1) * delta}                 # transition von S2 zu S3
        if(currprox$state!=4 & i==4) {
          proxel_list[[timestep+1]]$proxel[nrow(proxel_list[[timestep+1]]$proxel),4] = (unihrf(currprox$tau_k,7,14)* delta) * currprox$prob
          counter_prob = counter_prob + unihrf(currprox$tau_k,7,14)* delta}                 # transtion zu heal von S1,S2 oder S3
        if(currprox$state==1 & i==1) {
          proxel_list[[timestep+1]]$proxel[nrow(proxel_list[[timestep+1]]$proxel),4] = (1 - (unihrf(currprox$tau_k,2,4) * delta) - (unihrf(currprox$tau_k,7,14)* delta)) * currprox$prob}
        if(currprox$state==2 & i==2) {
          proxel_list[[timestep+1]]$proxel[nrow(proxel_list[[timestep+1]]$proxel),4] = (1 - (exphrf(currprox$tau_k,0.1) * delta) - (unihrf(currprox$tau_k,7,14)* delta)) * currprox$prob}
        if(currprox$state==3 & i==3) {
          proxel_list[[timestep+1]]$proxel[nrow(proxel_list[[timestep+1]]$proxel),4] = (1 - (unihrf(currprox$tau_k,7,14)* delta)) * currprox$prob}
        if(currprox$state==4 & i==4) {
          proxel_list[[timestep+1]]$proxel[nrow(proxel_list[[timestep+1]]$proxel),4] = 1 }
            
         proxel_list[[timestep+1]]$proxel[nrow(proxel_list[[timestep+1]]$proxel),5] = l   
            
      }
    } 
    
    #proxel_list[[timestep+1]]$proxel[which(is.na(proxel_list[[timestep+1]]$proxel[,4])),4] = 1-counter_prob #* proxel_list[[timestep]]$proxel$prob[l] # rest wkt im state zu bleiben
    counter_prob=0
  }
  if(length(which(proxel_list[[timestep+1]]$proxel[,4]<=0))!=0) proxel_list[[timestep+1]]$proxel=proxel_list[[timestep+1]]$proxel[-which(proxel_list[[timestep+1]]$proxel[,4]<=0),]
  if(length(which(proxel_list[[timestep+1]]$proxel[,3]< 0))!=0) proxel_list[[timestep+1]]$proxel=proxel_list[[timestep+1]]$proxel[-which(proxel_list[[timestep+1]]$proxel[,3]< 0),]
  
  if(Print) print(paste("Time step:",timestep))
  if(Print) print(proxel_list[[timestep+1]])
}

return(proxel_list)
}
proxel_list=Proxel_algo(RG,startproxel,delta,max.ts,T)
## [1] "initial proxel:"
## $STEP
## [1] 0
## 
## $proxel
##   state tau tau_k prob prev
## 1     1   0     0    1    0
## 
## [1] "Time step: 1"
## $timestep
## [1] 1
## 
## $proxel
##   state tau tau_k prob prev
## 1     1   1     1    1    1
## 
## [1] "Time step: 2"
## $timestep
## [1] 2
## 
## $proxel
##   state tau tau_k prob prev
## 1     1   2     2    1    1
## 
## [1] "Time step: 3"
## $timestep
## [1] 3
## 
## $proxel
##   state tau tau_k prob prev
## 1     1   3     3  0.5    1
## 2     2   0     3  0.5    1
## 
## [1] "Time step: 4"
## $timestep
## [1] 4
## 
## $proxel
##   state tau tau_k prob prev
## 2     2   0     4 0.50    1
## 4     2   1     4 0.45    2
## 5     3   0     4 0.05    2
## 
## [1] "Time step: 5"
## $timestep
## [1] 5
## 
## $proxel
##   state tau tau_k  prob prev
## 1     2   1     5 0.450    1
## 2     3   0     5 0.050    1
## 4     2   2     5 0.405    2
## 5     3   0     5 0.045    2
## 7     3   1     5 0.050    3
## 
## [1] "Time step: 6"
## $timestep
## [1] 6
## 
## $proxel
##    state tau tau_k   prob prev
## 1      2   2     6 0.4050    1
## 2      3   0     6 0.0450    1
## 4      3   1     6 0.0500    2
## 6      2   3     6 0.3645    3
## 7      3   0     6 0.0405    3
## 9      3   1     6 0.0450    4
## 11     3   2     6 0.0500    5
## 
## [1] "Time step: 7"
## $timestep
## [1] 7
## 
## $proxel
##    state tau tau_k    prob prev
## 1      2   3     7 0.36450    1
## 2      3   0     7 0.04050    1
## 4      3   1     7 0.04500    2
## 6      3   2     7 0.05000    3
## 8      2   4     7 0.32805    4
## 9      3   0     7 0.03645    4
## 11     3   1     7 0.04050    5
## 13     3   2     7 0.04500    6
## 15     3   3     7 0.05000    7
## 
## [1] "Time step: 8"
## $timestep
## [1] 8
## 
## $proxel
##    state tau tau_k        prob prev
## 1      2   4     8 0.275978571    1
## 2      3   0     8 0.036450000    1
## 3      4   0     0 0.052071429    1
## 4      3   1     8 0.034714286    2
## 5      4   0     0 0.005785714    2
## 6      3   2     8 0.038571429    3
## 7      4   0     0 0.006428571    3
## 8      3   3     8 0.042857143    4
## 9      4   0     0 0.007142857    4
## 10     2   5     8 0.248380714    5
## 11     3   0     8 0.032805000    5
## 12     4   0     0 0.046864286    5
## 13     3   1     8 0.031242857    6
## 14     4   0     0 0.005207143    6
## 15     3   2     8 0.034714286    7
## 16     4   0     0 0.005785714    7
## 17     3   3     8 0.038571429    8
## 18     4   0     0 0.006428571    8
## 19     3   4     8 0.042857143    9
## 20     4   0     0 0.007142857    9
## 
## [1] "Time step: 9"
## $timestep
## [1] 9
## 
## $proxel
##    state tau tau_k        prob prev
## 1      2   5     9 0.202384286    1
## 2      3   0     9 0.027597857    1
## 3      4   0     0 0.045996429    1
## 4      3   1     9 0.030375000    2
## 5      4   0     0 0.006075000    2
## 7      3   2     9 0.028928571    4
## 8      4   0     0 0.005785714    4
## 10     3   3     9 0.032142857    6
## 11     4   0     0 0.006428571    6
## 13     3   4     9 0.035714286    8
## 14     4   0     0 0.007142857    8
## 16     2   6     9 0.182145857   10
## 17     3   0     9 0.024838071   10
## 18     4   0     0 0.041396786   10
## 19     3   1     9 0.027337500   11
## 20     4   0     0 0.005467500   11
## 22     3   2     9 0.026035714   13
## 23     4   0     0 0.005207143   13
## 25     3   3     9 0.028928571   15
## 26     4   0     0 0.005785714   15
## 28     3   4     9 0.032142857   17
## 29     4   0     0 0.006428571   17
## 31     3   5     9 0.035714286   19
## 32     4   0     0 0.007142857   19
## 
## [1] "Time step: 10"
## $timestep
## [1] 10
## 
## $proxel
##    state tau tau_k        prob prev
## 1      2   6    10 0.141669000    1
## 2      3   0    10 0.020238429    1
## 3      4   0     0 0.040476857    1
## 4      3   1    10 0.022078286    2
## 5      4   0     0 0.005519571    2
## 7      3   2    10 0.024300000    4
## 8      4   0     0 0.006075000    4
## 10     3   3    10 0.023142857    6
## 11     4   0     0 0.005785714    6
## 13     3   4    10 0.025714286    8
## 14     4   0     0 0.006428571    8
## 16     3   5    10 0.028571429   10
## 17     4   0     0 0.007142857   10
## 19     2   7    10 0.127502100   12
## 20     3   0    10 0.018214586   12
## 21     4   0     0 0.036429171   12
## 22     3   1    10 0.019870457   13
## 23     4   0     0 0.004967614   13
## 25     3   2    10 0.021870000   15
## 26     4   0     0 0.005467500   15
## 28     3   3    10 0.020828571   17
## 29     4   0     0 0.005207143   17
## 31     3   4    10 0.023142857   19
## 32     4   0     0 0.005785714   19
## 34     3   5    10 0.025714286   21
## 35     4   0     0 0.006428571   21
## 37     3   6    10 0.028571429   23
## 38     4   0     0 0.007142857   23
## 
## [1] "Time step: 11"
## $timestep
## [1] 11
## 
## $proxel
##    state tau tau_k        prob prev
## 1      2   7    11 0.092084850    1
## 2      3   0    11 0.014166900    1
## 3      4   0     0 0.035417250    1
## 4      3   1    11 0.015178821    2
## 5      4   0     0 0.005059607    2
## 7      3   2    11 0.016558714    4
## 8      4   0     0 0.005519571    4
## 10     3   3    11 0.018225000    6
## 11     4   0     0 0.006075000    6
## 13     3   4    11 0.017357143    8
## 14     4   0     0 0.005785714    8
## 16     3   5    11 0.019285714   10
## 17     4   0     0 0.006428571   10
## 19     3   6    11 0.021428571   12
## 20     4   0     0 0.007142857   12
## 22     2   8    11 0.082876365   14
## 23     3   0    11 0.012750210   14
## 24     4   0     0 0.031875525   14
## 25     3   1    11 0.013660939   15
## 26     4   0     0 0.004553646   15
## 28     3   2    11 0.014902843   17
## 29     4   0     0 0.004967614   17
## 31     3   3    11 0.016402500   19
## 32     4   0     0 0.005467500   19
## 34     3   4    11 0.015621429   21
## 35     4   0     0 0.005207143   21
## 37     3   5    11 0.017357143   23
## 38     4   0     0 0.005785714   23
## 40     3   6    11 0.019285714   25
## 41     4   0     0 0.006428571   25
## 43     3   7    11 0.021428571   27
## 44     4   0     0 0.007142857   27
## 
## [1] "Time step: 12"
## $timestep
## [1] 12
## 
## $proxel
##    state tau tau_k        prob prev
## 1      2   8    12 0.052181415    1
## 2      3   0    12 0.009208485    1
## 3      4   0     0 0.030694950    1
## 4      3   1    12 0.009444600    2
## 5      4   0     0 0.004722300    2
## 7      3   2    12 0.010119214    4
## 8      4   0     0 0.005059607    4
## 10     3   3    12 0.011039143    6
## 11     4   0     0 0.005519571    6
## 13     3   4    12 0.012150000    8
## 14     4   0     0 0.006075000    8
## 16     3   5    12 0.011571429   10
## 17     4   0     0 0.005785714   10
## 19     3   6    12 0.012857143   12
## 20     4   0     0 0.006428571   12
## 22     3   7    12 0.014285714   14
## 23     4   0     0 0.007142857   14
## 25     2   9    12 0.046963274   16
## 26     3   0    12 0.008287637   16
## 27     4   0     0 0.027625455   16
## 28     3   1    12 0.008500140   17
## 29     4   0     0 0.004250070   17
## 31     3   2    12 0.009107293   19
## 32     4   0     0 0.004553646   19
## 34     3   3    12 0.009935229   21
## 35     4   0     0 0.004967614   21
## 37     3   4    12 0.010935000   23
## 38     4   0     0 0.005467500   23
## 40     3   5    12 0.010414286   25
## 41     4   0     0 0.005207143   25
## 43     3   6    12 0.011571429   27
## 44     4   0     0 0.005785714   27
## 46     3   7    12 0.012857143   29
## 47     4   0     0 0.006428571   29
## 49     3   8    12 0.014285714   31
## 50     4   0     0 0.007142857   31
## 
## [1] "Time step: 13"
## $timestep
## [1] 13
## 
## $proxel
##    state tau tau_k        prob prev
## 1      2   9    13 0.020872566    1
## 2      3   0    13 0.005218142    1
## 3      4   0     0 0.026090708    1
## 4      3   1    13 0.004604243    2
## 5      4   0     0 0.004604243    2
## 7      3   2    13 0.004722300    4
## 8      4   0     0 0.004722300    4
## 10     3   3    13 0.005059607    6
## 11     4   0     0 0.005059607    6
## 13     3   4    13 0.005519571    8
## 14     4   0     0 0.005519571    8
## 16     3   5    13 0.006075000   10
## 17     4   0     0 0.006075000   10
## 19     3   6    13 0.005785714   12
## 20     4   0     0 0.005785714   12
## 22     3   7    13 0.006428571   14
## 23     4   0     0 0.006428571   14
## 25     3   8    13 0.007142857   16
## 26     4   0     0 0.007142857   16
## 28     2  10    13 0.018785309   18
## 29     3   0    13 0.004696327   18
## 30     4   0     0 0.023481637   18
## 31     3   1    13 0.004143818   19
## 32     4   0     0 0.004143818   19
## 34     3   2    13 0.004250070   21
## 35     4   0     0 0.004250070   21
## 37     3   3    13 0.004553646   23
## 38     4   0     0 0.004553646   23
## 40     3   4    13 0.004967614   25
## 41     4   0     0 0.004967614   25
## 43     3   5    13 0.005467500   27
## 44     4   0     0 0.005467500   27
## 46     3   6    13 0.005207143   29
## 47     4   0     0 0.005207143   29
## 49     3   7    13 0.005785714   31
## 50     4   0     0 0.005785714   31
## 52     3   8    13 0.006428571   33
## 53     4   0     0 0.006428571   33
## 55     3   9    13 0.007142857   35
## 56     4   0     0 0.007142857   35
## 
## [1] "Time step: 14"
## $timestep
## [1] 14
## 
## $proxel
##    state tau tau_k        prob prev
## 2      3   0    14 0.002087257    1
## 3      4   0     0 0.020872566    1
## 5      4   0     0 0.005218142    2
## 8      4   0     0 0.004604243    4
## 11     4   0     0 0.004722300    6
## 14     4   0     0 0.005059607    8
## 17     4   0     0 0.005519571   10
## 20     4   0     0 0.006075000   12
## 23     4   0     0 0.005785714   14
## 26     4   0     0 0.006428571   16
## 29     4   0     0 0.007142857   18
## 32     3   0    14 0.001878531   20
## 33     4   0     0 0.018785309   20
## 35     4   0     0 0.004696327   21
## 38     4   0     0 0.004143818   23
## 41     4   0     0 0.004250070   25
## 44     4   0     0 0.004553646   27
## 47     4   0     0 0.004967614   29
## 50     4   0     0 0.005467500   31
## 53     4   0     0 0.005207143   33
## 56     4   0     0 0.005785714   35
## 59     4   0     0 0.006428571   37
## 62     4   0     0 0.007142857   39
## 
## [1] "Time step: 15"
## $timestep
## [1] 15
## 
## $proxel
##    state tau tau_k        prob prev
## 1      3   1    15 0.002087257    1
## 13     3   1    15 0.001878531   12
proxel_list
## [[1]]
## [[1]]$STEP
## [1] 0
## 
## [[1]]$proxel
##   state tau tau_k prob prev
## 1     1   0     0    1    0
## 
## 
## [[2]]
## [[2]]$timestep
## [1] 1
## 
## [[2]]$proxel
##   state tau tau_k prob prev
## 1     1   1     1    1    1
## 
## 
## [[3]]
## [[3]]$timestep
## [1] 2
## 
## [[3]]$proxel
##   state tau tau_k prob prev
## 1     1   2     2    1    1
## 
## 
## [[4]]
## [[4]]$timestep
## [1] 3
## 
## [[4]]$proxel
##   state tau tau_k prob prev
## 1     1   3     3  0.5    1
## 2     2   0     3  0.5    1
## 
## 
## [[5]]
## [[5]]$timestep
## [1] 4
## 
## [[5]]$proxel
##   state tau tau_k prob prev
## 2     2   0     4 0.50    1
## 4     2   1     4 0.45    2
## 5     3   0     4 0.05    2
## 
## 
## [[6]]
## [[6]]$timestep
## [1] 5
## 
## [[6]]$proxel
##   state tau tau_k  prob prev
## 1     2   1     5 0.450    1
## 2     3   0     5 0.050    1
## 4     2   2     5 0.405    2
## 5     3   0     5 0.045    2
## 7     3   1     5 0.050    3
## 
## 
## [[7]]
## [[7]]$timestep
## [1] 6
## 
## [[7]]$proxel
##    state tau tau_k   prob prev
## 1      2   2     6 0.4050    1
## 2      3   0     6 0.0450    1
## 4      3   1     6 0.0500    2
## 6      2   3     6 0.3645    3
## 7      3   0     6 0.0405    3
## 9      3   1     6 0.0450    4
## 11     3   2     6 0.0500    5
## 
## 
## [[8]]
## [[8]]$timestep
## [1] 7
## 
## [[8]]$proxel
##    state tau tau_k    prob prev
## 1      2   3     7 0.36450    1
## 2      3   0     7 0.04050    1
## 4      3   1     7 0.04500    2
## 6      3   2     7 0.05000    3
## 8      2   4     7 0.32805    4
## 9      3   0     7 0.03645    4
## 11     3   1     7 0.04050    5
## 13     3   2     7 0.04500    6
## 15     3   3     7 0.05000    7
## 
## 
## [[9]]
## [[9]]$timestep
## [1] 8
## 
## [[9]]$proxel
##    state tau tau_k        prob prev
## 1      2   4     8 0.275978571    1
## 2      3   0     8 0.036450000    1
## 3      4   0     0 0.052071429    1
## 4      3   1     8 0.034714286    2
## 5      4   0     0 0.005785714    2
## 6      3   2     8 0.038571429    3
## 7      4   0     0 0.006428571    3
## 8      3   3     8 0.042857143    4
## 9      4   0     0 0.007142857    4
## 10     2   5     8 0.248380714    5
## 11     3   0     8 0.032805000    5
## 12     4   0     0 0.046864286    5
## 13     3   1     8 0.031242857    6
## 14     4   0     0 0.005207143    6
## 15     3   2     8 0.034714286    7
## 16     4   0     0 0.005785714    7
## 17     3   3     8 0.038571429    8
## 18     4   0     0 0.006428571    8
## 19     3   4     8 0.042857143    9
## 20     4   0     0 0.007142857    9
## 
## 
## [[10]]
## [[10]]$timestep
## [1] 9
## 
## [[10]]$proxel
##    state tau tau_k        prob prev
## 1      2   5     9 0.202384286    1
## 2      3   0     9 0.027597857    1
## 3      4   0     0 0.045996429    1
## 4      3   1     9 0.030375000    2
## 5      4   0     0 0.006075000    2
## 7      3   2     9 0.028928571    4
## 8      4   0     0 0.005785714    4
## 10     3   3     9 0.032142857    6
## 11     4   0     0 0.006428571    6
## 13     3   4     9 0.035714286    8
## 14     4   0     0 0.007142857    8
## 16     2   6     9 0.182145857   10
## 17     3   0     9 0.024838071   10
## 18     4   0     0 0.041396786   10
## 19     3   1     9 0.027337500   11
## 20     4   0     0 0.005467500   11
## 22     3   2     9 0.026035714   13
## 23     4   0     0 0.005207143   13
## 25     3   3     9 0.028928571   15
## 26     4   0     0 0.005785714   15
## 28     3   4     9 0.032142857   17
## 29     4   0     0 0.006428571   17
## 31     3   5     9 0.035714286   19
## 32     4   0     0 0.007142857   19
## 
## 
## [[11]]
## [[11]]$timestep
## [1] 10
## 
## [[11]]$proxel
##    state tau tau_k        prob prev
## 1      2   6    10 0.141669000    1
## 2      3   0    10 0.020238429    1
## 3      4   0     0 0.040476857    1
## 4      3   1    10 0.022078286    2
## 5      4   0     0 0.005519571    2
## 7      3   2    10 0.024300000    4
## 8      4   0     0 0.006075000    4
## 10     3   3    10 0.023142857    6
## 11     4   0     0 0.005785714    6
## 13     3   4    10 0.025714286    8
## 14     4   0     0 0.006428571    8
## 16     3   5    10 0.028571429   10
## 17     4   0     0 0.007142857   10
## 19     2   7    10 0.127502100   12
## 20     3   0    10 0.018214586   12
## 21     4   0     0 0.036429171   12
## 22     3   1    10 0.019870457   13
## 23     4   0     0 0.004967614   13
## 25     3   2    10 0.021870000   15
## 26     4   0     0 0.005467500   15
## 28     3   3    10 0.020828571   17
## 29     4   0     0 0.005207143   17
## 31     3   4    10 0.023142857   19
## 32     4   0     0 0.005785714   19
## 34     3   5    10 0.025714286   21
## 35     4   0     0 0.006428571   21
## 37     3   6    10 0.028571429   23
## 38     4   0     0 0.007142857   23
## 
## 
## [[12]]
## [[12]]$timestep
## [1] 11
## 
## [[12]]$proxel
##    state tau tau_k        prob prev
## 1      2   7    11 0.092084850    1
## 2      3   0    11 0.014166900    1
## 3      4   0     0 0.035417250    1
## 4      3   1    11 0.015178821    2
## 5      4   0     0 0.005059607    2
## 7      3   2    11 0.016558714    4
## 8      4   0     0 0.005519571    4
## 10     3   3    11 0.018225000    6
## 11     4   0     0 0.006075000    6
## 13     3   4    11 0.017357143    8
## 14     4   0     0 0.005785714    8
## 16     3   5    11 0.019285714   10
## 17     4   0     0 0.006428571   10
## 19     3   6    11 0.021428571   12
## 20     4   0     0 0.007142857   12
## 22     2   8    11 0.082876365   14
## 23     3   0    11 0.012750210   14
## 24     4   0     0 0.031875525   14
## 25     3   1    11 0.013660939   15
## 26     4   0     0 0.004553646   15
## 28     3   2    11 0.014902843   17
## 29     4   0     0 0.004967614   17
## 31     3   3    11 0.016402500   19
## 32     4   0     0 0.005467500   19
## 34     3   4    11 0.015621429   21
## 35     4   0     0 0.005207143   21
## 37     3   5    11 0.017357143   23
## 38     4   0     0 0.005785714   23
## 40     3   6    11 0.019285714   25
## 41     4   0     0 0.006428571   25
## 43     3   7    11 0.021428571   27
## 44     4   0     0 0.007142857   27
## 
## 
## [[13]]
## [[13]]$timestep
## [1] 12
## 
## [[13]]$proxel
##    state tau tau_k        prob prev
## 1      2   8    12 0.052181415    1
## 2      3   0    12 0.009208485    1
## 3      4   0     0 0.030694950    1
## 4      3   1    12 0.009444600    2
## 5      4   0     0 0.004722300    2
## 7      3   2    12 0.010119214    4
## 8      4   0     0 0.005059607    4
## 10     3   3    12 0.011039143    6
## 11     4   0     0 0.005519571    6
## 13     3   4    12 0.012150000    8
## 14     4   0     0 0.006075000    8
## 16     3   5    12 0.011571429   10
## 17     4   0     0 0.005785714   10
## 19     3   6    12 0.012857143   12
## 20     4   0     0 0.006428571   12
## 22     3   7    12 0.014285714   14
## 23     4   0     0 0.007142857   14
## 25     2   9    12 0.046963274   16
## 26     3   0    12 0.008287637   16
## 27     4   0     0 0.027625455   16
## 28     3   1    12 0.008500140   17
## 29     4   0     0 0.004250070   17
## 31     3   2    12 0.009107293   19
## 32     4   0     0 0.004553646   19
## 34     3   3    12 0.009935229   21
## 35     4   0     0 0.004967614   21
## 37     3   4    12 0.010935000   23
## 38     4   0     0 0.005467500   23
## 40     3   5    12 0.010414286   25
## 41     4   0     0 0.005207143   25
## 43     3   6    12 0.011571429   27
## 44     4   0     0 0.005785714   27
## 46     3   7    12 0.012857143   29
## 47     4   0     0 0.006428571   29
## 49     3   8    12 0.014285714   31
## 50     4   0     0 0.007142857   31
## 
## 
## [[14]]
## [[14]]$timestep
## [1] 13
## 
## [[14]]$proxel
##    state tau tau_k        prob prev
## 1      2   9    13 0.020872566    1
## 2      3   0    13 0.005218142    1
## 3      4   0     0 0.026090708    1
## 4      3   1    13 0.004604243    2
## 5      4   0     0 0.004604243    2
## 7      3   2    13 0.004722300    4
## 8      4   0     0 0.004722300    4
## 10     3   3    13 0.005059607    6
## 11     4   0     0 0.005059607    6
## 13     3   4    13 0.005519571    8
## 14     4   0     0 0.005519571    8
## 16     3   5    13 0.006075000   10
## 17     4   0     0 0.006075000   10
## 19     3   6    13 0.005785714   12
## 20     4   0     0 0.005785714   12
## 22     3   7    13 0.006428571   14
## 23     4   0     0 0.006428571   14
## 25     3   8    13 0.007142857   16
## 26     4   0     0 0.007142857   16
## 28     2  10    13 0.018785309   18
## 29     3   0    13 0.004696327   18
## 30     4   0     0 0.023481637   18
## 31     3   1    13 0.004143818   19
## 32     4   0     0 0.004143818   19
## 34     3   2    13 0.004250070   21
## 35     4   0     0 0.004250070   21
## 37     3   3    13 0.004553646   23
## 38     4   0     0 0.004553646   23
## 40     3   4    13 0.004967614   25
## 41     4   0     0 0.004967614   25
## 43     3   5    13 0.005467500   27
## 44     4   0     0 0.005467500   27
## 46     3   6    13 0.005207143   29
## 47     4   0     0 0.005207143   29
## 49     3   7    13 0.005785714   31
## 50     4   0     0 0.005785714   31
## 52     3   8    13 0.006428571   33
## 53     4   0     0 0.006428571   33
## 55     3   9    13 0.007142857   35
## 56     4   0     0 0.007142857   35
## 
## 
## [[15]]
## [[15]]$timestep
## [1] 14
## 
## [[15]]$proxel
##    state tau tau_k        prob prev
## 2      3   0    14 0.002087257    1
## 3      4   0     0 0.020872566    1
## 5      4   0     0 0.005218142    2
## 8      4   0     0 0.004604243    4
## 11     4   0     0 0.004722300    6
## 14     4   0     0 0.005059607    8
## 17     4   0     0 0.005519571   10
## 20     4   0     0 0.006075000   12
## 23     4   0     0 0.005785714   14
## 26     4   0     0 0.006428571   16
## 29     4   0     0 0.007142857   18
## 32     3   0    14 0.001878531   20
## 33     4   0     0 0.018785309   20
## 35     4   0     0 0.004696327   21
## 38     4   0     0 0.004143818   23
## 41     4   0     0 0.004250070   25
## 44     4   0     0 0.004553646   27
## 47     4   0     0 0.004967614   29
## 50     4   0     0 0.005467500   31
## 53     4   0     0 0.005207143   33
## 56     4   0     0 0.005785714   35
## 59     4   0     0 0.006428571   37
## 62     4   0     0 0.007142857   39
## 
## 
## [[16]]
## [[16]]$timestep
## [1] 15
## 
## [[16]]$proxel
##    state tau tau_k        prob prev
## 1      3   1    15 0.002087257    1
## 13     3   1    15 0.001878531   12

What is the probability that the patient is still sick after 8 days for different discrete time steps (e.g. 2, 1, 0.5, 0.25, 0.1)?

What is the probability of measuring fever on the 9th day for different discrete time steps (e.g. 2, 1, 0.5, 0.25, 0.1)?

## [1] "Wkt = 0.608"
## [1] "Wkt = 0.5284065"
## [1] "Wkt = 0.52882555229399"
## [1] "Wkt = 0.52913153254786"
## [1] "Wkt = 0.536988812479435"

What is the expected duration until healing with probability 99% for different discrete time steps (e.g. 2, 1, 0.5, 0.25, 0.1)?

##   state tau tau_k    prob prev
## 2     3   0    14 0.01792    1
## [1] "Für 2 An Tag: 12"
##    state tau tau_k        prob prev
## 2      3   0    14 0.002087257    1
## 32     3   0    14 0.001878531   20
## [1] "Für 1 An Tag: 14"
##     state tau tau_k         prob prev
## 2       3   0    14 0.0002843604    1
## 62      3   0    14 0.0002701424   40
## 125     3   0    14 0.0002566352   81
## 191     3   0    14 0.0002438035  124
## [1] "Für .5 An Tag: 14"
##     state tau tau_k         prob prev
## 2       3   0    14 3.761015e-05    1
## 122     3   0    14 3.666990e-05   80
## 245     3   0    14 3.575315e-05  161
## 371     3   0    14 3.485932e-05  244
## 500     3   0    14 3.398784e-05  329
## 632     3   0    14 3.313814e-05  416
## 767     3   0    14 3.230969e-05  505
## 905     3   0    14 3.150194e-05  596
## [1] "Für .25 An Tag: 14"
LS0tDQp0aXRsZTogIkFETSBUYXNrIDQiDQphdXRob3I6ICJEb21pbmlrIERpZWRyaWNoIg0KZGF0ZTogImByIFN5cy5EYXRlKClgIg0Kb3V0cHV0Og0KICBodG1sX2RvY3VtZW50Og0KICAgIGNvZGVfZG93bmxvYWQ6IHllcw0KLS0tDQoNCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFKQ0KbGlicmFyeShwZXRyaW5ldFIpDQpsaWJyYXJ5KG1hcmtvdmNoYWluKQ0KYGBgDQoNCmBgYHtyIGV2YWw9RkFMU0UsIGluY2x1ZGU9RkFMU0V9DQojIFNwZWNpYWwgUHVycG9zZSBQcm94ZWwtQmFzZWQgU29sdmVyDQoNCk1JTlBST0IgPC0gMS4wZS0xMg0KUzEgPC0gMA0KUzIgPC0gMg0KUzMgPC0gNA0KSCA8LSAgNg0KREVMVEEgPC0gMQ0KRU5EVElNRSA8LSA1MA0KUEkgPC0gMy4xNDE1OTI2DQoNCiMgRGVmaW5pdGlvbiBvZiBhIHByb3hlbCBzdHJ1Y3R1cmUNCnByb3hlbCA8LSBmdW5jdGlvbihpZCwgcywgdGF1MWssIHRhdTJrLCB2YWwsIGxlZnQgPSBOVUxMLCByaWdodCA9IE5VTEwpIHsNCiAgbGlzdChpZCA9IGlkLCBzID0gcywgdGF1MWsgPSB0YXUxaywgdGF1MmsgPSB0YXUyaywgdmFsID0gdmFsLCBsZWZ0ID0gbGVmdCwgcmlnaHQgPSByaWdodCkNCn0NCg0KeSA8LSB2ZWN0b3IoImxpc3QiLCA0KQ0KdG1heCA8LSBFTkRUSU1FDQpUQVVNQVggPC0gdG1heCAvIERFTFRBDQp0b3RjbnQgPC0gMA0KbWF4Y2NwIDwtIDANCmNjcGNudCA8LSAwDQpyb290IDwtIHZlY3RvcigibGlzdCIsIDIpDQpmaXJzdGZyZWUgPC0gTlVMTA0KZWVycm9yIDwtIDANCnN3IDwtIDENCmxlbiA8LSAwDQpkdCA8LSBERUxUQQ0KDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgZGlzdHJpYnV0aW9ucyAjIyMjIyMjIyMjIyMjIyMNCiMgdW5pZm9ybSBJUkYNCnVuaWhyZiA8LSBmdW5jdGlvbih4LCBhLCBiKSB7DQogIGlmICh4ID49IGEgJiYgeCA8IGIpIHsNCiAgICB5IDwtIDEuMCAvIChiIC0geCkNCiAgfSBlbHNlIHsNCiAgICB5IDwtIDAuMA0KICB9DQoNCiAgcmV0dXJuKHkpDQp9DQoNCiMgZXhwb25lbnRpYWwgSVJGDQpleHBocmYgPC0gZnVuY3Rpb24oeCwgbCkgew0KICByZXR1cm4obCkNCn0NCg0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIG91dHB1dCBmdW5jdGlvbnMgIyMjIyMjIyMjIyMjIyMNCiMgUHJpbnQgYWxsIHByb3hlbHMgaW4gdHJlZQ0KcHJpbnR0cmVlIDwtIGZ1bmN0aW9uKHApIHsNCiAgaWYgKGlzLm51bGwocCkpDQogICAgcmV0dXJuDQogIGNhdCgicyIsIHAkcywgInQxIiwgcCR0YXUxaywgInQyIiwgcCR0YXUyaywgInZhbCIsIHAkdmFsLCAiXG4iKQ0KICBwcmludHRyZWUocCRsZWZ0KQ0KICBwcmludHRyZWUocCRyaWdodCkNCn0NCg0KIyBQcmludCBvdXQgY29tcGxldGUgc29sdXRpb24NCnBsb3Rzb2x1dGlvbiA8LSBmdW5jdGlvbihrbWF4KSB7DQogIGNhdCgiXG5cbiIpDQogIGZvciAoayBpbiAxOihrbWF4ICsgMSkpDQogICAgY2F0KGZvcm1hdChrICogZHQsIGRpZ2l0cyA9IDcpLCAiXHQiLCBmb3JtYXQoeVtbMV1dW2tdLCBzY2llbnRpZmljID0gVFJVRSwgZGlnaXRzID0gNyksICJcdCIsIGZvcm1hdCh5W1szXV1ba10sIHNjaWVudGlmaWMgPSBUUlVFLCBkaWdpdHMgPSA3KSwgIlxuIikNCn0NCg0KIyBQcmludCBvdXQgYSBwcm94ZWwNCnByaW50cHJveGVsIDwtIGZ1bmN0aW9uKGMpIHsNCiAgY2F0KCJwcm9jZXNzaW5nIiwgYyRzLCBjJHRhdTFrLCBjJHZhbCwgIlxuIikNCn0NCg0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgcHJveGVsIG1hbmlwdWxhdGlvbiBmdW5jdGlvbiAjIyMjIyMjIyMNCiMgQ29tcHV0ZSB1bmlxdWUgaWQgZnJvbSBwcm94ZWwgc3RhdGUNCnN0YXRlMmlkIDwtIGZ1bmN0aW9uKHMsIHQxaywgdDJrKSB7DQogIFRBVU1BWCAqIChUQVVNQVggKiBzICsgdDFrKSArIHQyaw0KfQ0KDQojIENvbXB1dGUgc2l6ZSBvZiB0cmVlDQpzaXplIDwtIGZ1bmN0aW9uKHApIHsNCiAgaWYgKGlzLm51bGwocCkpDQogICAgcmV0dXJuKDApDQogIHNsIDwtIHNpemUocCRsZWZ0KQ0KICBzciA8LSBzaXplKHAkcmlnaHQpDQogIHNsICsgc3IgKyAxDQp9DQoNCiMgR2V0IGEgcHJveGVsIGZyb20gdGhlIHRyZWUNCmdldHByb3hlbCA8LSBmdW5jdGlvbigpIHsNCiAgdGVtcCA8LSByb290W1sxIC0gc3ddXQ0KICBvbGQgPC0gdGVtcA0KDQogICMgTW92ZSBkb3duIHRoZSB0cmVlIHRvIGEgbGVhZg0KICB3aGlsZSAoIWlzLm51bGwodGVtcCkpIHsNCiAgICAjIEdvIHJpZ2h0DQogICAgaWYgKCFpcy5udWxsKHRlbXAkcmlnaHQpICYmIGlzLm51bGwodGVtcCRsZWZ0KSkgew0KICAgICAgb2xkIDwtIHRlbXANCiAgICAgIHRlbXAgPC0gdGVtcCRyaWdodA0KICAgIH0NCiAgICAjIEdvIGxlZnQNCiAgICBlbHNlIGlmIChpcy5udWxsKHRlbXAkcmlnaHQpICYmICFpcy5udWxsKHRlbXAkbGVmdCkpIHsNCiAgICAgIG9sZCA8LSB0ZW1wDQogICAgICB0ZW1wIDwtIHRlbXAkbGVmdA0KICAgIH0NCiAgICAjIENob29zZSByaWdodC9sZWZ0IGF0IHJhbmRvbQ0KICAgIGVsc2UgaWYgKCFpcy5udWxsKHRlbXAkcmlnaHQpICYmICFpcy5udWxsKHRlbXAkbGVmdCkpIHsNCiAgICAgIGlmIChydW5pZigxKSA+IDAuNSkgew0KICAgICAgICBvbGQgPC0gdGVtcA0KICAgICAgICB0ZW1wIDwtIHRlbXAkbGVmdA0KICAgICAgfSBlbHNlIHsNCiAgICAgICAgb2xkIDwtIHRlbXANCiAgICAgICAgdGVtcCA8LSB0ZW1wJHJpZ2h0DQogICAgICB9DQogICAgfSBlbHNlDQogICAgICBicmVhaw0KICB9DQoNCiAgaWYgKGlkZW50aWNhbCh0ZW1wLCByb290W1sxIC0gc3ddXSkpDQogICAgcm9vdFtbMSAtIHN3XV0gPC0gTlVMTA0KICBlbHNlIHsNCiAgICBpZiAoIWlzLm51bGwodGVtcCRyaWdodCkpDQogICAgICBvbGQkcmlnaHQgPC0gTlVMTA0KICAgIGVsc2UNCiAgICAgIG9sZCRsZWZ0IDwtIE5VTEwNCiAgfQ0KDQogIG9sZCA8LSBmaXJzdGZyZWUNCiAgZmlyc3RmcmVlIDw8LSB0ZW1wDQogIHRlbXAkcmlnaHQgPC0gb2xkDQogIGNjcGNudCA8PC0gY2NwY250IC0gMQ0KDQogIHJldHVybih0ZW1wKQ0KfQ0KDQojIEdldCBhIGZyZXNoIHByb3hlbCBhbmQgY29weSBkYXRhIGludG8gaXQNCmluc2VydHByb3hlbCA8LSBmdW5jdGlvbihzLCB0YXUxaywgdGF1MmssIHZhbCkgew0KICB0ZW1wIDwtIHByb3hlbChzdGF0ZTJpZChzLCB0YXUxaywgdGF1MmspLCBzLCB0YXUxaywgdGF1MmssIHZhbCkNCiAgY2NwY250IDw8LSBjY3BjbnQgKyAxDQoNCiAgaWYgKG1heGNjcCA8IGNjcGNudCkNCiAgICBtYXhjY3AgPDwtIGNjcGNudA0KDQogIHJldHVybih0ZW1wKQ0KfQ0KDQojIEFkZHMgYSBuZXcgcHJveGVsIHRvIHRoZSB0cmVlDQphZGRwcm94ZWwgPC0gZnVuY3Rpb24ocywgdGF1MWssIHRhdTJrLCB2YWwpIHsNCiAgY29udCA8LSAxDQoNCiAgIyBBbGFybSEgVEFVTUFYIG92ZXJzdGVwcGVkIQ0KICBpZiAodGF1MWsgPj0gVEFVTUFYKSB7DQogICAgdGF1MWsgPDwtIFRBVU1BWCAtIDENCiAgfQ0KDQogICMgTmV3IHRyZWUsIGFkZCByb290DQogIGlmIChpcy5udWxsKHJvb3RbW3N3XV0pKSB7DQogICAgcm9vdFtbc3ddXSA8PC0gaW5zZXJ0cHJveGVsKHMsIHRhdTFrLCB0YXUyaywgdmFsKQ0KICAgIHJvb3RbW3N3XV0kbGVmdCA8PC0gTlVMTA0KICAgIHJvb3RbW3N3XV0kcmlnaHQgPDwtIE5VTEwNCiAgICByZXR1cm4oKQ0KICB9DQoNCiAgIyBDb21wdXRlIGlkIG9mIG5ldyBwcm94ZWwNCiAgaWQgPC0gc3RhdGUyaWQocywgdGF1MWssIHRhdTJrKQ0KDQogICMgTG9jYXRlIGluc2VydGlvbiBwb2ludCBpbiB0cmVlDQogIHRlbXAgPC0gcm9vdFtbc3ddXQ0KICB3aGlsZSAoY29udCA9PSAxKSB7DQogICAgaWYgKCFpcy5udWxsKHRlbXAkbGVmdCkgJiYgaWQgPCB0ZW1wJGlkKQ0KICAgICAgdGVtcCA8LSB0ZW1wJGxlZnQNCiAgICBlbHNlIGlmICghaXMubnVsbCh0ZW1wJHJpZ2h0KSAmJiBpZCA+IHRlbXAkaWQpDQogICAgICB0ZW1wIDwtIHRlbXAkcmlnaHQNCiAgICBlbHNlDQogICAgICBjb250IDwtIDANCiAgfQ0KDQogICMgSW5zZXJ0IGxlZnQgbGVhZiBpbnRvIHRyZWUNCiAgaWYgKGlzLm51bGwodGVtcCRsZWZ0KSAmJiBpZCA8IHRlbXAkaWQpIHsNCiAgICB0ZW1wMiA8LSBpbnNlcnRwcm94ZWwocywgdGF1MWssIHRhdTJrLCB2YWwpDQogICAgdGVtcCRsZWZ0IDw8LSB0ZW1wMg0KICAgIHRlbXAyJGxlZnQgPDwtIE5VTEwNCiAgICB0ZW1wMiRyaWdodCA8PC0gTlVMTA0KICAgIHJldHVybigpDQogIH0NCg0KICAjIEluc2VydCByaWdodCBsZWFmIGludG8gdHJlZQ0KICBpZiAoaXMubnVsbCh0ZW1wJHJpZ2h0KSAmJiBpZCA+IHRlbXAkaWQpIHsNCiAgICB0ZW1wMiA8LSBpbnNlcnRwcm94ZWwocywgdGF1MWssIHRhdTJrLCB2YWwpDQogICAgdGVtcCRyaWdodCA8PC0gdGVtcDINCiAgICB0ZW1wMiRsZWZ0IDw8LSBOVUxMDQogICAgdGVtcDIkcmlnaHQgPDwtIE5VTEwNCiAgICByZXR1cm4oKQ0KICB9DQoNCiAgIyBQcm94ZWxzIGhhdmUgdGhlIHNhbWUgaWQsIGp1c3QgYWRkIHRoZWlyIHZhbHMNCiAgaWYgKGlkID09IHRlbXAkaWQpIHsNCiAgICB0ZW1wJHZhbCA8PC0gdGVtcCR2YWwgKyB2YWwNCiAgICByZXR1cm4oKQ0KICB9DQoNCiAgY2F0KCJcblxuXG4hISEhISEgYWRkcHJveGVsIGZhaWxlZCAhISEhIVxuXG5cbiIpDQp9DQoNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgbW9kZWwgc3BlY2lmaWMgZGlzdHMgIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMgSW5zdGFudGFuZW91cyByYXRlIGZ1bmN0aW9uIDENClMxX3RvX1MyIDwtIGZ1bmN0aW9uKGFnZSkgew0KICByZXR1cm4odW5paHJmKGFnZSwgMiwgNCkpDQp9DQoNCiMgSW5zdGFudGFuZW91cyByYXRlIGZ1bmN0aW9uIDINClMyX3RvX1MzIDwtIGZ1bmN0aW9uKGFnZSkgew0KICByZXR1cm4oZXhwaHJmKGFnZSwgMC4xKSkNCn0NCg0KIyBJbnN0YW50YW5lb3VzIHJhdGUgZnVuY3Rpb24gMw0KaGVhbCA8LSBmdW5jdGlvbihhZ2UpIHsNCiAgcmV0dXJuKHVuaWhyZihhZ2UsIDcsIDE0KSkNCn0NCg0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgbWFpbiBsb29wICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KbWFpbiA8LSBmdW5jdGlvbigpIHsNCiAga21heCA8LSBhcy5pbnRlZ2VyKEVORFRJTUUgLyBERUxUQSkgKyAxDQoNCiAgIyBJbml0aWFsaXplIHRoZSBzaW11bGF0aW9uDQogIHJvb3RbWzFdXSA8PC0gTlVMTA0KICByb290W1syXV0gPDwtIE5VTEwNCiAgZWVycm9yIDw8LSAwLjANCiAgdG90Y250IDw8LSAwDQogIG1heGNjcCA8PC0gMA0KICBjY3BjbnQgPDwtIDANCg0KICBmb3IgKGsgaW4gMTo0KSB7DQogICAgeVtba11dIDwtIHJlcCgwLjAsIGttYXggKyAyKQ0KICB9DQoNCiAgVEFVTUFYIDw8LSBhcy5pbnRlZ2VyKEVORFRJTUUgLyBERUxUQSkgKyAxDQoNCiAgIyBTZXQgaW5pdGlhbCBwcm94ZWwNCiAgYWRkcHJveGVsKFMxLCAwLCAwLCAxLjApDQoNCiAgIyBGaXJzdCBsb29wOiBpdGVyYXRpb24gb3ZlciBhbGwgdGltZSBzdGVwcw0KICBmb3IgKGsgaW4gMjooa21heCArIDEpKSB7DQoNCiAgICAjIFByaW50IHByb2dyZXNzIGluZm9ybWF0aW9uDQogICAgaWYgKGsgJSUgMTAwID09IDApIHsNCiAgICAgIGNhdCgiXG5TVEVQIiwgaywgIlxuIikNCiAgICAgIGNhdCgiU2l6ZSBvZiB0cmVlIiwgc2l6ZShyb290W1tzd11dKSwgIlxuIikNCiAgICB9DQoNCiAgICBzdyA8PC0gMSAtIHN3DQoNCiAgICAjIFNlY29uZCBsb29wOiBpdGVyYXRpbmcgb3ZlciBhbGwgcHJveGVscyBvZiBhIHRpbWUgc3RlcA0KICAgIHdoaWxlICghaXMubnVsbChyb290W1sxIC0gc3ddXSkpIHsNCiAgICAgIHRvdGNudCA8PC0gdG90Y250ICsgMQ0KICAgICAgY3VycnByb3hlbCA8LSBnZXRwcm94ZWwoKQ0KICAgICAgcHJpbnQoeSkNCiAgICAgIHdoaWxlIChjdXJycHJveGVsJHZhbCA8IE1JTlBST0IgJiYgIWlzLm51bGwocm9vdFtbMSAtIHN3XV0pKSB7DQogICAgICAgIHZhbCA8LSBjdXJycHJveGVsJHZhbA0KICAgICAgICBlZXJyb3IgPDwtIGVlcnJvciArIHZhbA0KICAgICAgICBjdXJycHJveGVsIDwtIGdldHByb3hlbCgpDQogICAgICB9DQoNCiAgICAgIHZhbCA8LSBjdXJycHJveGVsJHZhbA0KICAgICAgdGF1MWsgPC0gY3VycnByb3hlbCR0YXUxaw0KICAgICAgdGF1MmsgPC0gY3VycnByb3hlbCR0YXUyaw0KICAgICAgcyA8LSBjdXJycHJveGVsJHMNCiAgICAgIHlbW3NdXVtrIC0gMV0gPDwtIHlbW3NdXVtrIC0gMV0gKyB2YWwNCg0KICAgICAgIyBDcmVhdGUgY2hpbGQgcHJveGVscw0KICAgICAgc3dpdGNoKHMsDQogICAgICAgICAgICAgUzEgPSB7DQogICAgICAgICAgICAgICB6IDwtIGR0ICogUzFfdG9fUzIodGF1MWsgKiBkdCkNCiAgICAgICAgICAgICAgIHoyIDwtIGR0ICogaGVhbCh0YXUyayAqIGR0KQ0KICAgICAgICAgICAgICAgaWYgKHogPCAxLjAgJiB6MiA8IDEuMCkgew0KICAgICAgICAgICAgICAgICBhZGRwcm94ZWwoUzIsIDAsIHRhdTJrICsgMSwgdmFsICogeikNCiAgICAgICAgICAgICAgICAgYWRkcHJveGVsKEggLCAwLCB0YXUyayArIDEsIHZhbCAqIHoyKQ0KICAgICAgICAgICAgICAgICBhZGRwcm94ZWwoUzEsIHRhdTFrICsgMSwgdGF1MmsgKyAxLCB2YWwgKiAoMSAtIHogLSB6MikpDQogICAgICAgICAgICAgICB9IA0KICAgICAgICAgICAgICAgaWYgKHo9PTEuMCkgew0KICAgICAgICAgICAgICAgICBhZGRwcm94ZWwoUzIsIDAsIHRhdTJrICsgMSwgdmFsKQ0KICAgICAgICAgICAgICAgICB9IGVsc2UNCiAgICAgICAgICAgICAgICAgICBhZGRwcm94ZWwoSCwgMCwgMCwgdmFsKQ0KICAgICAgICAgICAgIH0sDQogICAgICAgICAgICAgUzIgPSB7DQogICAgICAgICAgICAgICB6IDwtIGR0ICogUzJfdG9fUzModGF1MWsgKiBkdCkNCiAgICAgICAgICAgICAgIHoyIDwtIGR0ICogaGVhbCh0YXUyayAqIGR0KQ0KICAgICAgICAgICAgICAgaWYgKHogPCAxLjAgJiB6MiA8IDEuMCkgew0KICAgICAgICAgICAgICAgICBhZGRwcm94ZWwoUzMsIDAsIHRhdTJrICsgMSwgdmFsICogeikNCiAgICAgICAgICAgICAgICAgYWRkcHJveGVsKEggLCAwLCB0YXUyayArIDEsIHZhbCAqIHoyKQ0KICAgICAgICAgICAgICAgICBhZGRwcm94ZWwoUzIsIHRhdTFrICsgMSwgdGF1MmsgKyAxLCB2YWwgKiAoMSAtIHogLSB6MikpDQogICAgICAgICAgICAgICB9IA0KICAgICAgICAgICAgICAgaWYgKHo9PTEuMCkgew0KICAgICAgICAgICAgICAgICBhZGRwcm94ZWwoUzMsIDAsIHRhdTJrICsgMSwgdmFsKQ0KICAgICAgICAgICAgICAgICB9IGVsc2UNCiAgICAgICAgICAgICAgICAgICBhZGRwcm94ZWwoSCwgMCwgMCwgdmFsKQ0KICAgICAgICAgICAgIH0sDQogICAgICAgICAgICAgUzMgPSB7DQogICAgICAgICAgICAgICB6IDwtIGR0ICogaGVhbCh0YXUyayAqIGR0KQ0KICAgICAgICAgICAgICAgaWYgKHogPCAxLjApIHsNCiAgICAgICAgICAgICAgICAgYWRkcHJveGVsKEgsIDAsIHRhdTJrICsgMSwgdmFsICogeikNCiAgICAgICAgICAgICAgICAgYWRkcHJveGVsKFMzLCB0YXUxayArIDEsIHRhdTJrICsgMSwgdmFsICogKDEgLSB6KSkNCiAgICAgICAgICAgICAgIH0gZWxzZQ0KICAgICAgICAgICAgICAgICBhZGRwcm94ZWwoSCwgMCwgMCwgdmFsKQ0KICAgICAgICAgICAgIH0sDQogICAgICAgICAgICAgSCA9IHsNCiAgICAgICAgICAgICAgIGFkZHByb3hlbChILCB0YXUxayArIDEsIDAsIDEpDQogICAgICAgICAgICAgfSkNCiAgICB9DQogIH0NCg0KICBjYXQoImVycm9yID0iLCBlZXJyb3IsICJcbiIpDQogIGNhdCgiY2NweCA9IiwgbWF4Y2NwLCAiXG4iKQ0KICBjYXQoImNvdW50ID0iLCB0b3RjbnQsICJcbiIpDQogIHBsb3Rzb2x1dGlvbihrbWF4KQ0KfQ0KbWFpbigpDQpgYGANCg0KDQpgYGB7ciBldmFsPUZBTFNFLCBpbmNsdWRlPUZBTFNFfQ0KTUlOUFJPQiA8LSAxLjBlLTEyDQpTVEFHRTEgPC0gMQ0KU1RBR0UyIDwtIDINClNUQUdFMyA8LSAzDQpIRUFMVEhZIDwtIDQNCkRFTFRBIDwtIGMoMiwgMSwgMC41LCAwLjI1LCAwLjEpDQpFTkRUSU1FIDwtIDEzDQpQSSA8LSAzLjE0MTU5MjYNCg0Kc2V0Q2xhc3MoIlByb3hlbCIscmVwcmVzZW50YXRpb24gPSBsaXN0KGlkID0gIm51bWVyaWMiLCBzID0gIm51bWVyaWMiLCB0YXUxayA9ICJudW1lcmljIiwgdGF1MmsgPSAibnVtZXJpYyIsIHZhbCA9ICJudW1lcmljIiwgbGVmdCA9ICJQcm94ZWwiLCByaWdodCA9ICJQcm94ZWwiDQogICkpDQpQcm94ZWwgPC0gZnVuY3Rpb24oKSB7DQogIGxpc3QoDQogICAgaWQgPSAwLA0KICAgIHMgPSAwLA0KICAgIHRhdTFrID0gMCwNCiAgICB0YXUyayA9IDAsDQogICAgdmFsID0gMC4wLA0KICAgIGxlZnQgPSBOVUxMLA0KICAgIHJpZ2h0ID0gTlVMTA0KICApDQp9DQoNCnkgPC0gbGlzdChOVUxMLCBOVUxMLCBOVUxMLCBOVUxMKQ0KdG1heCA8LSAwLjANClRBVU1BWCA8LSAwDQp0b3RjbnQgPC0gMA0KbWF4Y2NwIDwtIDANCmNjcGNudCA8LSAwDQpyb290IDwtIGxpc3QoTlVMTCwgTlVMTCkNCmZpcnN0ZnJlZSA8LSBOVUxMDQplZXJyb3IgPC0gMA0Kc3cgPC0gMA0KbGVuIDwtIDANCmR0IDwtIDANCg0KdW5paHJmIDwtIGZ1bmN0aW9uKHgsIGEsIGIpIHsNCiAgaWYgKGEgPD0geCAmJiB4IDwgYikgew0KICAgIHJldHVybiAoMS4wIC8gKGIgLSB4KSkNCiAgfSBlbHNlIHsNCiAgICByZXR1cm4gKDApDQogIH0NCn0NCg0KZXhwaHJmIDwtIGZ1bmN0aW9uKHgsIGwpIHsNCiAgcmV0dXJuIChsKQ0KfQ0KDQpwcmludHRyZWUgPC0gZnVuY3Rpb24ocCkgew0KICBpZiAoaXMubnVsbChwKSkgew0KICAgIHJldHVybg0KICB9DQogIGNhdCgicyIsIHAkcywgInQxIiwgcCR0YXUxaywgInQyIiwgcCR0YXUyaywgInZhbCIsIHAkdmFsLCAiXG4iKQ0KICBwcmludHRyZWUocCRsZWZ0KQ0KICBwcmludHRyZWUocCRyaWdodCkNCn0NCg0KcGxvdHNvbHV0aW9uIDwtIGZ1bmN0aW9uKGttYXgpIHsNCiAgY2F0KCJcblxuIikNCiAgZm9yIChrIGluIDE6KGttYXggKyAxKSkgew0KICAgIGNhdChzcHJpbnRmKCIlLjVmXHQlLjVlXHQlLjVlXHQlLjVlXHQlLjVlXG4iLCBrICogZHQsIHlbWzFdXVtrXSwgeVtbMl1dW2tdLCB5W1szXV1ba10sIHlbWzRdXVtrXSkpDQogIH0NCn0NCg0KcHJpbnRwcm94ZWwgPC0gZnVuY3Rpb24oYykgew0KICBjYXQoInByb2Nlc3NpbmciLCBjJHMsIGMkdGF1MWssIGMkdmFsLCAiXG4iKQ0KfQ0KDQpzdGF0ZTJpZCA8LSBmdW5jdGlvbihzLCB0MWssIHQyaykgew0KICByZXR1cm4gKFRBVU1BWCAqIChUQVVNQVggKiBzICsgdDFrKSArIHQyaykNCn0NCg0Kc2l6ZSA8LSBmdW5jdGlvbihwKSB7DQogIGlmIChpcy5udWxsKHApKSB7DQogICAgcmV0dXJuICgwKQ0KICB9DQogIHNsIDwtIHNpemUocCRsZWZ0KQ0KICBzciA8LSBzaXplKHAkcmlnaHQpDQogIHJldHVybiAoc2wgKyBzciArIDEpDQp9DQoNCmdldHByb3hlbCA8LSBmdW5jdGlvbigpIHsNCiAgTEVGVCA8LSAwDQogIFJJR0hUIDwtIDENCiAgZGlyIDwtIDENCiAgY29udCA8LSAxDQoNCiAgaWYgKGlzLm51bGwocm9vdFtbMSAtIHN3KzFdXSkpIHsNCiAgICByZXR1cm4oTlVMTCkNCiAgfQ0KDQogIHRlbXAgPC0gcm9vdFtbMSAtIHN3KzFdXQ0KICBvbGQgPC0gdGVtcA0KDQogIHdoaWxlIChjb250ID09IDEpIHsNCiAgICBpZiAoIWlzLm51bGwodGVtcCRyaWdodCkgJiYgaXMubnVsbCh0ZW1wJGxlZnQpKSB7DQogICAgICBvbGQgPC0gdGVtcA0KICAgICAgdGVtcCA8LSB0ZW1wJHJpZ2h0DQogICAgICBkaXIgPC0gUklHSFQNCiAgICB9IGVsc2UgaWYgKGlzLm51bGwodGVtcCRyaWdodCkgJiYgIWlzLm51bGwodGVtcCRsZWZ0KSkgew0KICAgICAgb2xkIDwtIHRlbXANCiAgICAgIHRlbXAgPC0gdGVtcCRsZWZ0DQogICAgICBkaXIgPC0gTEVGVA0KICAgIH0gZWxzZSBpZiAoIWlzLm51bGwodGVtcCRyaWdodCkgJiYgIWlzLm51bGwodGVtcCRsZWZ0KSkgew0KICAgICAgaWYgKHJ1bmlmKDEpID4gMC41KSB7DQogICAgICAgIG9sZCA8LSB0ZW1wDQogICAgICAgIHRlbXAgPC0gdGVtcCRsZWZ0DQogICAgICAgIGRpciA8LSBMRUZUDQogICAgICB9IGVsc2Ugew0KICAgICAgICBvbGQgPC0gdGVtcA0KICAgICAgICB0ZW1wIDwtIHRlbXAkcmlnaHQNCiAgICAgICAgZGlyIDwtIFJJR0hUDQogICAgICB9DQogICAgfSBlbHNlIHsNCiAgICAgIGNvbnQgPC0gMA0KICAgIH0NCiAgfQ0KDQogIGlmIChpZGVudGljYWwodGVtcCwgcm9vdFtbMSAtIHN3KzFdXSkpIHsNCiAgICByb290W1sxIC0gc3crMV1dIDwtIE5VTEwNCiAgfSBlbHNlIHsNCiAgICBpZiAoZGlyID09IFJJR0hUKSB7DQogICAgICBvbGQkcmlnaHQgPC0gTlVMTA0KICAgIH0gZWxzZSB7DQogICAgICBvbGQkbGVmdCA8LSBOVUxMDQogICAgfQ0KICB9DQoNCiAgb2xkIDwtIGZpcnN0ZnJlZQ0KICBmaXJzdGZyZWUgPC0gdGVtcA0KICB0ZW1wJHJpZ2h0IDwtIG9sZA0KICBjY3BjbnQgPC0gY2NwY250IC0gMQ0KICByZXR1cm4odGVtcCkNCn0NCg0KaW5zZXJ0cHJveGVsIDwtIGZ1bmN0aW9uKHMsIHRhdTFrLCB0YXUyaywgdmFsKSB7DQogIGlmIChpcy5udWxsKGZpcnN0ZnJlZSkpIHsNCiAgICB0ZW1wIDwtIFByb3hlbCgpDQogIH0gZWxzZSB7DQogICAgdGVtcCA8LSBmaXJzdGZyZWUNCiAgICBmaXJzdGZyZWUgPC0gZmlyc3RmcmVlJHJpZ2h0DQogIH0NCg0KICB0ZW1wJGlkIDwtIHN0YXRlMmlkKHMsIHRhdTFrLCB0YXUyaykNCiAgdGVtcCRzIDwtIHMNCiAgdGVtcCR0YXUxayA8LSB0YXUxaw0KICB0ZW1wJHRhdTJrIDwtIHRhdTJrDQogIHRlbXAkdmFsIDwtIHZhbA0KICBjY3BjbnQgPC0gY2NwY250ICsgMQ0KDQogIGlmIChtYXhjY3AgPCBjY3BjbnQpIHsNCiAgICBtYXhjY3AgPC0gY2NwY250DQogIH0NCg0KICByZXR1cm4odGVtcCkNCn0NCg0KYWRkcHJveGVsIDwtIGZ1bmN0aW9uKHMsIHRhdTFrLCB0YXUyaywgdmFsKSB7DQogIHRlbXAgPC0gTlVMTA0KICB0ZW1wMiA8LSBOVUxMDQogIGNvbnQgPC0gMQ0KICBpZCA8LSBzdGF0ZTJpZChzLCB0YXUxaywgdGF1MmspDQoNCiAgaWYgKHRhdTFrID49IFRBVU1BWCkgew0KICAgIHRhdTFrIDwtIFRBVU1BWCAtIDENCiAgfQ0KICBpZiAoaXMubnVsbChyb290W1tzdysxXV0pKSB7DQogICAgcm9vdFtbc3crMV1dIDwtIGluc2VydHByb3hlbChzLCB0YXUxaywgdGF1MmssIHZhbCkNCiAgICByb290W1tzdysxXV0kbGVmdCA8LSBOVUxMDQogICAgcm9vdFtbc3crMV1dJHJpZ2h0IDwtIE5VTEwNCiAgICByZXR1cm4oTlVMTCkNCiAgfQ0KDQogIHRlbXAgPC0gcm9vdFtbc3crMV1dDQoNCiAgd2hpbGUgKGNvbnQgPT0gMSkgew0KICAgIGlmICghaXMubnVsbCh0ZW1wJGxlZnQpICYmIGlkIDwgdGVtcCRpZCkgew0KICAgICAgdGVtcCA8LSB0ZW1wJGxlZnQNCiAgICB9IGVsc2UgaWYgKCFpcy5udWxsKHRlbXAkcmlnaHQpICYmIGlkID4gdGVtcCRpZCkgew0KICAgICAgdGVtcCA8LSB0ZW1wJHJpZ2h0DQogICAgfSBlbHNlIHsNCiAgICAgIGNvbnQgPC0gMA0KICAgIH0NCiAgfQ0KDQogIGlmIChpcy5udWxsKHRlbXAkbGVmdCkgJiYgaWQgPCB0ZW1wJGlkKSB7DQogICAgdGVtcDIgPC0gaW5zZXJ0cHJveGVsKHMsIHRhdTFrLCB0YXUyaywgdmFsKQ0KICAgIHRlbXAkbGVmdCA8LSB0ZW1wMg0KICAgIHRlbXAyJGxlZnQgPC0gTlVMTA0KICAgIHRlbXAyJHJpZ2h0IDwtIE5VTEwNCiAgfSBlbHNlIGlmIChpcy5udWxsKHRlbXAkcmlnaHQpICYmIGlkID4gdGVtcCRpZCkgew0KICAgIHRlbXAyIDwtIGluc2VydHByb3hlbChzLCB0YXUxaywgdGF1MmssIHZhbCkNCiAgICB0ZW1wJHJpZ2h0IDwtIHRlbXAyDQogICAgdGVtcDIkbGVmdCA8LSBOVUxMDQogICAgdGVtcDIkcmlnaHQgPC0gTlVMTA0KICB9IGVsc2UgaWYgKGlkID09IHRlbXAkaWQpIHsNCiAgICB0ZW1wJHZhbCA8LSB0ZW1wJHZhbCArIHZhbA0KICB9IGVsc2Ugew0KICAgIGNhdCgiXG5cblxuISEhISEhIGFkZHByb3hlbCBmYWlsZWQgISEhISFcblxuXG4iKQ0KICB9DQp9DQoNCmluY3ViYXRpb24gPC0gZnVuY3Rpb24oYWdlKSB7DQogIHJldHVybiAodW5paHJmKGFnZSwgMiwgNCkpDQp9DQoNCmdldF93b3JzZSA8LSBmdW5jdGlvbihhZ2UpIHsNCiAgcmV0dXJuIChleHBocmYoYWdlLCAxLzEwKSkNCn0NCg0KaGVhbCA8LSBmdW5jdGlvbihhZ2UpIHsNCiAgcmV0dXJuICh1bmlocmYoYWdlLCA3LCAxNCkpDQp9DQoNCm1haW4gPC0gZnVuY3Rpb24oKSB7DQogIHJvb3QgPC0gbGlzdChOVUxMLCBOVUxMKQ0KICBlZXJyb3IgPC0gMC4wDQogIHRvdGNudCA8LSAwDQogIG1heGNjcCA8LSAwDQogIHRtYXggPC0gRU5EVElNRQ0KICBkdCA8LSBERUxUQVsyXQ0KICBrbWF4IDwtIGFzLmludGVnZXIodG1heCAvIGR0KSArIDENCg0KICBmb3IgKGsgaW4gMTo0KSB7DQogICAgeVtba11dIDwtIHJlcCgwLjAsIGttYXggKyAyKQ0KICB9DQoNCiAgVEFVTUFYIDwtIGFzLmludGVnZXIodG1heCAvIGR0KSArIDENCg0KICBhZGRwcm94ZWwoU1RBR0UxLCAwLCAwLCAxLjApDQoNCiAgZm9yIChrIGluIDI6KGttYXggKyAyKSkgew0KICAgIGlmIChrICUlIDEwMCA9PSAwKSB7DQogICAgICBjYXQoIlxuU1RFUCIsIGssICJcbiIpDQogICAgICBjYXQoIlNpemUgb2YgdHJlZSIsIHNpemUocm9vdFtbc3crMV1dKSwgIlxuIikNCiAgICB9DQoNCiAgICB3aGlsZSAoIWlzLm51bGwocm9vdFtbMSAtIHN3KzFdXSkpIHsNCiAgICAgIHRvdGNudCA8LSB0b3RjbnQgKyAxDQogICAgICBjdXJycHJveGVsIDwtIGdldHByb3hlbCgpDQoNCiAgICAgIHdoaWxlIChjdXJycHJveGVsJHZhbCA8IE1JTlBST0IgJiYgIWlzLm51bGwocm9vdFtbMSAtIHN3KzFdXSkpIHsNCiAgICAgICAgdmFsIDwtIGN1cnJwcm94ZWwkdmFsDQogICAgICAgIGVlcnJvciA8LSBlZXJyb3IgKyB2YWwNCiAgICAgICAgY3VycnByb3hlbCA8LSBnZXRwcm94ZWwoKQ0KICAgICAgfQ0KDQogICAgICB2YWwgPC0gY3VycnByb3hlbCR2YWwNCiAgICAgIHRhdTFrIDwtIGN1cnJwcm94ZWwkdGF1MWsNCiAgICAgIHRhdTJrIDwtIGN1cnJwcm94ZWwkdGF1MmsNCiAgICAgIHMgPC0gY3VycnByb3hlbCRzDQogICAgICB5W1tzXV1bayAtIDFdIDwtIHlbW3NdXVtrIC0gMV0gKyB2YWwNCg0KICAgICAgaWYgKHMgPT0gU1RBR0UxKSB7DQogICAgICAgIHogPC0gZHQgKiBpbmN1YmF0aW9uKHRhdTFrICogZHQpDQogICAgICAgIHoyIDwtIGR0ICogaGVhbCh0YXUyayAqIGR0KQ0KICAgICAgICBpZiAoejIgPCAxLjApIHsNCiAgICAgICAgICBpZiAoeiA8IDEuMCkgew0KICAgICAgICAgICAgYWRkcHJveGVsKFNUQUdFMiwgMCwgdGF1MmsgKyAxLCB2YWwgKiB6KQ0KICAgICAgICAgICAgYWRkcHJveGVsKFNUQUdFMSwgdGF1MWsgKyAxLCB0YXUyayArIDEsIHZhbCAqICgxIC0geiAtIHoyKSkNCiAgICAgICAgICAgIGFkZHByb3hlbChIRUFMVEhZLCAwLCAwLCB2YWwgKiAoejIpKQ0KICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICBhZGRwcm94ZWwoU1RBR0UyLCAwLCB0YXUyayArIDEsIHZhbCkNCiAgICAgICAgICB9DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgYWRkcHJveGVsKEhFQUxUSFksIDAsIDAsIHZhbCkNCiAgICAgICAgfQ0KICAgICAgfSBlbHNlIGlmIChzID09IFNUQUdFMikgew0KICAgICAgICB6IDwtIGR0ICogZ2V0X3dvcnNlKHRhdTFrICogZHQpDQogICAgICAgIHoyIDwtIGR0ICogaGVhbCh0YXUyayAqIGR0KQ0KICAgICAgICBpZiAoejIgPCAxLjApIHsNCiAgICAgICAgICBpZiAoeiA8IDEuMCkgew0KICAgICAgICAgICAgYWRkcHJveGVsKFNUQUdFMywgMCwgdGF1MmsgKyAxLCB2YWwgKiB6KQ0KICAgICAgICAgICAgYWRkcHJveGVsKFNUQUdFMiwgdGF1MWsgKyAxLCB0YXUyayArIDEsIHZhbCAqICgxIC0geiAtIHoyKSkNCiAgICAgICAgICAgIGFkZHByb3hlbChIRUFMVEhZLCAwLCAwLCB2YWwgKiAoejIpKQ0KICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICBhZGRwcm94ZWwoU1RBR0UzLCAwLCB0YXUyayArIDEsIHZhbCkNCiAgICAgICAgICB9DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgYWRkcHJveGVsKEhFQUxUSFksIDAsIDAsIHZhbCkNCiAgICAgICAgfQ0KICAgICAgfSBlbHNlIGlmIChzID09IFNUQUdFMykgew0KICAgICAgICB6IDwtIGR0ICogaGVhbCh0YXUyayAqIGR0KQ0KICAgICAgICBpZiAoeiA8IDEuMCkgew0KICAgICAgICAgIGFkZHByb3hlbChIRUFMVEhZLCAwLCAwLCB2YWwgKiB6KQ0KICAgICAgICAgIGFkZHByb3hlbChTVEFHRTMsIHRhdTFrICsgMSwgdGF1MmsgKyAxLCB2YWwgKiAoMSAtIHopKQ0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgIGFkZHByb3hlbChIRUFMVEhZLCAwLCAwLCB2YWwpDQogICAgICAgIH0NCiAgICAgIH0gZWxzZSBpZiAocyA9PSBIRUFMVEhZKSB7DQogICAgICAgIGFkZHByb3hlbChIRUFMVEhZLCB0YXUxayArIDEsIHRhdTJrICsgMSwgMSkNCiAgICAgIH0NCiAgICB9DQogICAgaWYgKHN3PT0wKSBzdz0xDQogICAgaWYgKHN3PT0xKSBzdz0wDQogIH0NCg0KICBjYXQoIlxuXG4iKQ0KICBjYXQoImVycm9yID0iLCBzcHJpbnRmKCIlLjVlIiwgZWVycm9yKSwgIlxuIikNCiAgY2F0KCJjY3B4ID0iLCBtYXhjY3AsICJcbiIpDQogIGNhdCgiY291bnQgPSIsIHRvdGNudCwgIlxuIikNCiAgcGxvdHNvbHV0aW9uKGttYXgpDQp9DQoNCm1haW4oKQ0KYGBgDQoNCg0KYGBge3IgZXZhbD1GQUxTRSwgaW5jbHVkZT1GQUxTRX0NCg0KbWF4LnRzID0gMTQNCmRlbHRhID0gMQ0Kc3RhcnRwcm94ZWw9YygxLDAsMSkNClJHPW1hdHJpeChjKDEsMSwwLDEsDQogICAgICAgICAgICAwLDEsMSwxLA0KICAgICAgICAgICAgMCwwLDEsMSwNCiAgICAgICAgICAgIDAsMCwwLDEpLG5jb2wgPSA0LGJ5cm93ID0gVCkNCg0KUHJveGVsX2FsZ289ZnVuY3Rpb24oUkcsc3RhcnRwcm94ZWwsZGVsdGEsbWF4LnRzLFByaW50PVQpew0KICANCmNvdW50ZXJfcHJvYj0wDQoNCnVuaWhyZiA8LSBmdW5jdGlvbihhZ2UsIGEsIGIpIHsNCiAgaWYgKGEgPD0gYWdlICYmIGFnZSA8IGIpIHsNCiAgICByZXR1cm4gKDEuMCAvIChiIC0gYWdlKSkNCiAgfSBlbHNlIHsNCiAgICByZXR1cm4gKDApDQogIH0NCn0NCg0KZXhwaHJmIDwtIGZ1bmN0aW9uKGFnZSwgbCkgew0KICByZXR1cm4gKGwpDQp9DQogIA0KcHJveGVsX2xpc3Q9bGlzdCgpDQpwcm94ZWxfbGlzdFtbbWF4LnRzKzFdXT1saXN0KCkNCnByb3hlbF9saXN0W1sxXV09bGlzdChTVEVQPWMoMCkscHJveGVsPWRhdGEuZnJhbWUoc3RhdGU9c3RhcnRwcm94ZWxbMV0sdGF1PXN0YXJ0cHJveGVsWzJdLHByb2I9c3RhcnRwcm94ZWxbM10pKQ0KaWYoUHJpbnQpIHByaW50KCJpbml0aWFsIHByb3hlbDoiKQ0KaWYoUHJpbnQpIHByaW50KHByb3hlbF9saXN0W1sxXV0pDQoNCmZvciAodGltZXN0ZXAgaW4gMTptYXgudHMpIHsNCiAgcHJveGVsX2xpc3RbW3RpbWVzdGVwKzFdXT1saXN0KHRpbWVzdGVwPWModGltZXN0ZXApLHByb3hlbD1kYXRhLmZyYW1lKHN0YXRlPW51bWVyaWMoKSx0YXU9bnVtZXJpYygpLHByb2I9bnVtZXJpYygpKSkgICAgICMgZXJzdGVsbGUgc2Nob25tYWwgZWluZSBuZXVlIGxlZXJlIGxpc3RlIGbDvHIgZGVuIG7DpGNoc3RlbiB0aW1lc3RlcA0KICANCiAgZm9yIChsIGluIDE6bnJvdyhwcm94ZWxfbGlzdFtbdGltZXN0ZXBdXSRwcm94ZWwpKSB7DQogICAgY3VycnByb3ggPSBwcm94ZWxfbGlzdFtbdGltZXN0ZXBdXSRwcm94ZWxbbCxdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgYWt0dWVsbGVyIHByb3hlbCB6dSBkZW0gZm9sZ2Vwcm94ZWxzIGVyemV1Z3Qgd2VyZGVuIHNvbGxlbg0KICAgIGZvbGdlciA9IFJHW2FzLm51bWVyaWMoY3VycnByb3hbMV0pLF0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGZvbGdlc3RhdGVzIHZvbiBha3R1ZWxsZW0gcHJveGVsDQogICAgZm9yIChpIGluIDE6NCkgew0KICAgICAgaWYgKGZvbGdlcltpXT09MSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGVyc3RlbGxlIGZvbGdlcHJveGVsIGZhbGxzIHBmZWlsIGRhaGluIGdpYnQNCiAgICAgICAgcHJveGVsX2xpc3RbW3RpbWVzdGVwKzFdXSRwcm94ZWxbbnJvdyhwcm94ZWxfbGlzdFtbdGltZXN0ZXArMV1dJHByb3hlbCkrMSwxXSA9IGkgICAgICAgICAgICAgICAgICAgICAgICMgc3RhdGUgdm9tIG7DpGNoc3RlbiBwcm94ZWwNCiAgICAgICAgDQogICAgICAgIGlmKGN1cnJwcm94JHN0YXRlPT1pKSBwcm94ZWxfbGlzdFtbdGltZXN0ZXArMV1dJHByb3hlbFtucm93KHByb3hlbF9saXN0W1t0aW1lc3RlcCsxXV0kcHJveGVsKSwyXSA9IGN1cnJwcm94JHRhdSArIGRlbHRhDQogICAgICAgICAgZWxzZSBwcm94ZWxfbGlzdFtbdGltZXN0ZXArMV1dJHByb3hlbFtucm93KHByb3hlbF9saXN0W1t0aW1lc3RlcCsxXV0kcHJveGVsKSwyXSA9IDAgICAgICAgICAgICAgICAgICAgICMgdGF1IHZvbSBuw6RjaHN0ZW4gcHJveGVsDQogICAgICAgICAgDQogICAgICAgIGlmKGN1cnJwcm94JHN0YXRlPT0xICYgaT09Mikgew0KICAgICAgICAgIHByb3hlbF9saXN0W1t0aW1lc3RlcCsxXV0kcHJveGVsW25yb3cocHJveGVsX2xpc3RbW3RpbWVzdGVwKzFdXSRwcm94ZWwpLDNdID0gdW5paHJmKGN1cnJwcm94JHRhdSwyLDQpICogZGVsdGENCiAgICAgICAgICBjb3VudGVyX3Byb2IgPSBjb3VudGVyX3Byb2IgKyB1bmlocmYoY3VycnByb3gkdGF1LDIsNCkgKiBkZWx0YX0gICAgICAgICAgICAgICAgICMgdHJhbnNpdGlvbiB2b24gUzEgenUgUzINCiAgICAgICAgaWYoY3VycnByb3gkc3RhdGU9PTIgJiBpPT0zKSB7DQogICAgICAgICAgcHJveGVsX2xpc3RbW3RpbWVzdGVwKzFdXSRwcm94ZWxbbnJvdyhwcm94ZWxfbGlzdFtbdGltZXN0ZXArMV1dJHByb3hlbCksM10gPSBleHBocmYoY3VycnByb3gkdGF1LDAuMSkgKiBkZWx0YQ0KICAgICAgICAgIGNvdW50ZXJfcHJvYiA9IGNvdW50ZXJfcHJvYiArIGV4cGhyZihjdXJycHJveCR0YXUsMC4xKSAqIGRlbHRhfSAgICAgICAgICAgICAgICAgIyB0cmFuc2l0aW9uIHZvbiBTMiB6dSBTMw0KICAgICAgICBpZihjdXJycHJveCRzdGF0ZSE9NCAmIGk9PTQpIHsNCiAgICAgICAgICBwcm94ZWxfbGlzdFtbdGltZXN0ZXArMV1dJHByb3hlbFtucm93KHByb3hlbF9saXN0W1t0aW1lc3RlcCsxXV0kcHJveGVsKSwzXSA9IHVuaWhyZihjdXJycHJveCR0YXUsNywxNCkqIGRlbHRhIA0KICAgICAgICAgIGNvdW50ZXJfcHJvYiA9IGNvdW50ZXJfcHJvYiArIHVuaWhyZihjdXJycHJveCR0YXUsNywxNCkqIGRlbHRhfSAgICAgICAgICAgICAgICAgIyB0cmFuc3Rpb24genUgaGVhbCB2b24gUzEsUzIgb2RlciBTMw0KICAgICAgfQ0KICAgIH0gDQogICAgcHJveGVsX2xpc3RbW3RpbWVzdGVwKzFdXSRwcm94ZWxbd2hpY2goaXMubmEocHJveGVsX2xpc3RbW3RpbWVzdGVwKzFdXSRwcm94ZWxbLDNdKSksM10gPSAxLWNvdW50ZXJfcHJvYiAgIyByZXN0IHdrdCBpbSBzdGF0ZSB6dSBibGVpYmVuDQogICAgY291bnRlcl9wcm9iPTANCiAgfQ0KICANCiAgcHJveGVsX2xpc3RbW3RpbWVzdGVwKzFdXSRwcm94ZWw9cHJveGVsX2xpc3RbW3RpbWVzdGVwKzFdXSRwcm94ZWxbLXdoaWNoKHByb3hlbF9saXN0W1t0aW1lc3RlcCsxXV0kcHJveGVsWywzXT09MCksXQ0KICANCiAgaWYoUHJpbnQpIHByaW50KHBhc3RlKCJUaW1lIHN0ZXA6Iix0aW1lc3RlcCkpDQogIGlmKFByaW50KSBwcmludChwcm94ZWxfbGlzdFtbdGltZXN0ZXArMV1dKQ0KfQ0KDQpyZXR1cm4ocHJveGVsX2xpc3QpDQp9DQpQcm94ZWxfYWxnbyhSRyxzdGFydHByb3hlbCxkZWx0YSxtYXgudHMsVCkNCmBgYA0KDQpgYGB7cn0NCm1heC50cyA9IDE1DQpkZWx0YSA9IDENCnN0YXJ0cHJveGVsPWMoMSwwLDAsMSwwKQ0KUkc9bWF0cml4KGMoMSwxLDAsMSwNCiAgICAgICAgICAgIDAsMSwxLDEsDQogICAgICAgICAgICAwLDAsMSwxLA0KICAgICAgICAgICAgMCwwLDAsMSksbmNvbCA9IDQsYnlyb3cgPSBUKQ0KDQpQcm94ZWxfYWxnbz1mdW5jdGlvbihSRyxzdGFydHByb3hlbCxkZWx0YSxtYXgudHMsUHJpbnQ9VCl7DQogIA0KY291bnRlcl9wcm9iPTANCg0KdW5paHJmIDwtIGZ1bmN0aW9uKGFnZSwgYSwgYikgew0KICBpZiAoYSA8PSBhZ2UgJiYgYWdlIDwgYikgew0KICAgIHJldHVybiAoMS4wIC8gKGIgLSBhZ2UpKQ0KICB9IGVsc2Ugew0KICAgIHJldHVybiAoMCkNCiAgfQ0KfQ0KDQpleHBocmYgPC0gZnVuY3Rpb24oYWdlLCBsKSB7DQogIHJldHVybiAobCkNCn0NCiAgDQpwcm94ZWxfbGlzdD1saXN0KCkNCnByb3hlbF9saXN0W1ttYXgudHMrMV1dPWxpc3QoKQ0KcHJveGVsX2xpc3RbWzFdXT1saXN0KFNURVA9YygwKSxwcm94ZWw9ZGF0YS5mcmFtZShzdGF0ZT1zdGFydHByb3hlbFsxXSx0YXU9c3RhcnRwcm94ZWxbMl0sdGF1X2s9c3RhcnRwcm94ZWxbM10scHJvYj1zdGFydHByb3hlbFs0XSxwcmV2PXN0YXJ0cHJveGVsWzVdKSkNCmlmKFByaW50KSBwcmludCgiaW5pdGlhbCBwcm94ZWw6IikNCmlmKFByaW50KSBwcmludChwcm94ZWxfbGlzdFtbMV1dKQ0KDQpmb3IgKHRpbWVzdGVwIGluIDE6bWF4LnRzKSB7DQogIHByb3hlbF9saXN0W1t0aW1lc3RlcCsxXV09bGlzdCh0aW1lc3RlcD1jKHRpbWVzdGVwKSxwcm94ZWw9ZGF0YS5mcmFtZShzdGF0ZT1udW1lcmljKCksdGF1PW51bWVyaWMoKSx0YXVfaz1udW1lcmljKCkscHJvYj1udW1lcmljKCkscHJldj1udW1lcmljKCkpKSAgICAgIyBlcnN0ZWxsZSBzY2hvbm1hbCBlaW5lIG5ldWUgbGVlcmUgbGlzdGUgZsO8ciBkZW4gbsOkY2hzdGVuIHRpbWVzdGVwDQogIA0KICBmb3IgKGwgaW4gMTpucm93KHByb3hlbF9saXN0W1t0aW1lc3RlcF1dJHByb3hlbCkpIHsNCiAgICBjdXJycHJveCA9IHByb3hlbF9saXN0W1t0aW1lc3RlcF1dJHByb3hlbFtsLF0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBha3R1ZWxsZXIgcHJveGVsIHp1IGRlbSBmb2xnZXByb3hlbHMgZXJ6ZXVndCB3ZXJkZW4gc29sbGVuDQogICAgZm9sZ2VyID0gUkdbYXMubnVtZXJpYyhjdXJycHJveFsxXSksXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgZm9sZ2VzdGF0ZXMgdm9uIGFrdHVlbGxlbSBwcm94ZWwNCiAgICANCiAgICBmb3IgKGkgaW4gMTo0KSB7DQogICAgICBpZiAoZm9sZ2VyW2ldPT0xKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgZXJzdGVsbGUgZm9sZ2Vwcm94ZWwgZmFsbHMgcGZlaWwgZGFoaW4gZ2lidA0KICAgICAgICBwcm94ZWxfbGlzdFtbdGltZXN0ZXArMV1dJHByb3hlbFtucm93KHByb3hlbF9saXN0W1t0aW1lc3RlcCsxXV0kcHJveGVsKSsxLDFdID0gaSAgICAgICAgICAgICAgICAgICAgICAgIyBzdGF0ZSB2b20gbsOkY2hzdGVuIHByb3hlbA0KICAgICAgICANCiAgICAgICAgaWYoY3VycnByb3gkc3RhdGU9PWkpIHByb3hlbF9saXN0W1t0aW1lc3RlcCsxXV0kcHJveGVsW25yb3cocHJveGVsX2xpc3RbW3RpbWVzdGVwKzFdXSRwcm94ZWwpLDJdID0gY3VycnByb3gkdGF1ICsgZGVsdGENCiAgICAgICAgICBlbHNlIHByb3hlbF9saXN0W1t0aW1lc3RlcCsxXV0kcHJveGVsW25yb3cocHJveGVsX2xpc3RbW3RpbWVzdGVwKzFdXSRwcm94ZWwpLDJdID0gMCAgICAgICAgICAgICAgICAgICAgIyB0YXUgdm9tIG7DpGNoc3RlbiBwcm94ZWwNCiAgICAgICAgDQogICAgICAgIGlmKGN1cnJwcm94JHN0YXRlICVpbiUgYygxLDIsMykgJiBpIT00KSBwcm94ZWxfbGlzdFtbdGltZXN0ZXArMV1dJHByb3hlbFtucm93KHByb3hlbF9saXN0W1t0aW1lc3RlcCsxXV0kcHJveGVsKSwzXSA9IGN1cnJwcm94JHRhdV9rICsgZGVsdGENCiAgICAgICAgICBlbHNlIGlmKGN1cnJwcm94JHN0YXRlPT00ICYgaT09NCkgcHJveGVsX2xpc3RbW3RpbWVzdGVwKzFdXSRwcm94ZWxbbnJvdyhwcm94ZWxfbGlzdFtbdGltZXN0ZXArMV1dJHByb3hlbCksM10gPSBjdXJycHJveCR0YXVfayAtIGRlbHRhDQogICAgICAgICAgICBlbHNlIHByb3hlbF9saXN0W1t0aW1lc3RlcCsxXV0kcHJveGVsW25yb3cocHJveGVsX2xpc3RbW3RpbWVzdGVwKzFdXSRwcm94ZWwpLDNdID0gMCAgICAgICAgICAgICAgICAgICAjIHRhdV9rIHZvbSBuw6RjaHN0ZW4gcHJveGVsDQogICAgICAgICAgDQogICAgICAgIGlmKGN1cnJwcm94JHN0YXRlPT0xICYgaT09Mikgew0KICAgICAgICAgIHByb3hlbF9saXN0W1t0aW1lc3RlcCsxXV0kcHJveGVsW25yb3cocHJveGVsX2xpc3RbW3RpbWVzdGVwKzFdXSRwcm94ZWwpLDRdID0gKHVuaWhyZihjdXJycHJveCR0YXVfaywyLDQpICogZGVsdGEpICogY3VycnByb3gkcHJvYg0KICAgICAgICAgIGNvdW50ZXJfcHJvYiA9IGNvdW50ZXJfcHJvYiArIHVuaWhyZihjdXJycHJveCR0YXVfaywyLDQpICogZGVsdGF9ICAgICAgICAgICAgICAgICAjIHRyYW5zaXRpb24gdm9uIFMxIHp1IFMyDQogICAgICAgIGlmKGN1cnJwcm94JHN0YXRlPT0yICYgaT09Mykgew0KICAgICAgICAgIHByb3hlbF9saXN0W1t0aW1lc3RlcCsxXV0kcHJveGVsW25yb3cocHJveGVsX2xpc3RbW3RpbWVzdGVwKzFdXSRwcm94ZWwpLDRdID0gKGV4cGhyZihjdXJycHJveCR0YXVfaywwLjEpICogZGVsdGEpICogY3VycnByb3gkcHJvYg0KICAgICAgICAgIGNvdW50ZXJfcHJvYiA9IGNvdW50ZXJfcHJvYiArIGV4cGhyZihjdXJycHJveCR0YXVfaywwLjEpICogZGVsdGF9ICAgICAgICAgICAgICAgICAjIHRyYW5zaXRpb24gdm9uIFMyIHp1IFMzDQogICAgICAgIGlmKGN1cnJwcm94JHN0YXRlIT00ICYgaT09NCkgew0KICAgICAgICAgIHByb3hlbF9saXN0W1t0aW1lc3RlcCsxXV0kcHJveGVsW25yb3cocHJveGVsX2xpc3RbW3RpbWVzdGVwKzFdXSRwcm94ZWwpLDRdID0gKHVuaWhyZihjdXJycHJveCR0YXVfayw3LDE0KSogZGVsdGEpICogY3VycnByb3gkcHJvYg0KICAgICAgICAgIGNvdW50ZXJfcHJvYiA9IGNvdW50ZXJfcHJvYiArIHVuaWhyZihjdXJycHJveCR0YXVfayw3LDE0KSogZGVsdGF9ICAgICAgICAgICAgICAgICAjIHRyYW5zdGlvbiB6dSBoZWFsIHZvbiBTMSxTMiBvZGVyIFMzDQogICAgICAgIGlmKGN1cnJwcm94JHN0YXRlPT0xICYgaT09MSkgew0KICAgICAgICAgIHByb3hlbF9saXN0W1t0aW1lc3RlcCsxXV0kcHJveGVsW25yb3cocHJveGVsX2xpc3RbW3RpbWVzdGVwKzFdXSRwcm94ZWwpLDRdID0gKDEgLSAodW5paHJmKGN1cnJwcm94JHRhdV9rLDIsNCkgKiBkZWx0YSkgLSAodW5paHJmKGN1cnJwcm94JHRhdV9rLDcsMTQpKiBkZWx0YSkpICogY3VycnByb3gkcHJvYn0NCiAgICAgICAgaWYoY3VycnByb3gkc3RhdGU9PTIgJiBpPT0yKSB7DQogICAgICAgICAgcHJveGVsX2xpc3RbW3RpbWVzdGVwKzFdXSRwcm94ZWxbbnJvdyhwcm94ZWxfbGlzdFtbdGltZXN0ZXArMV1dJHByb3hlbCksNF0gPSAoMSAtIChleHBocmYoY3VycnByb3gkdGF1X2ssMC4xKSAqIGRlbHRhKSAtICh1bmlocmYoY3VycnByb3gkdGF1X2ssNywxNCkqIGRlbHRhKSkgKiBjdXJycHJveCRwcm9ifQ0KICAgICAgICBpZihjdXJycHJveCRzdGF0ZT09MyAmIGk9PTMpIHsNCiAgICAgICAgICBwcm94ZWxfbGlzdFtbdGltZXN0ZXArMV1dJHByb3hlbFtucm93KHByb3hlbF9saXN0W1t0aW1lc3RlcCsxXV0kcHJveGVsKSw0XSA9ICgxIC0gKHVuaWhyZihjdXJycHJveCR0YXVfayw3LDE0KSogZGVsdGEpKSAqIGN1cnJwcm94JHByb2J9DQogICAgICAgIGlmKGN1cnJwcm94JHN0YXRlPT00ICYgaT09NCkgew0KICAgICAgICAgIHByb3hlbF9saXN0W1t0aW1lc3RlcCsxXV0kcHJveGVsW25yb3cocHJveGVsX2xpc3RbW3RpbWVzdGVwKzFdXSRwcm94ZWwpLDRdID0gMSB9DQogICAgICAgICAgICANCiAgICAgICAgIHByb3hlbF9saXN0W1t0aW1lc3RlcCsxXV0kcHJveGVsW25yb3cocHJveGVsX2xpc3RbW3RpbWVzdGVwKzFdXSRwcm94ZWwpLDVdID0gbCAgIA0KICAgICAgICAgICAgDQogICAgICB9DQogICAgfSANCiAgICANCiAgICAjcHJveGVsX2xpc3RbW3RpbWVzdGVwKzFdXSRwcm94ZWxbd2hpY2goaXMubmEocHJveGVsX2xpc3RbW3RpbWVzdGVwKzFdXSRwcm94ZWxbLDRdKSksNF0gPSAxLWNvdW50ZXJfcHJvYiAjKiBwcm94ZWxfbGlzdFtbdGltZXN0ZXBdXSRwcm94ZWwkcHJvYltsXSAjIHJlc3Qgd2t0IGltIHN0YXRlIHp1IGJsZWliZW4NCiAgICBjb3VudGVyX3Byb2I9MA0KICB9DQogIGlmKGxlbmd0aCh3aGljaChwcm94ZWxfbGlzdFtbdGltZXN0ZXArMV1dJHByb3hlbFssNF08PTApKSE9MCkgcHJveGVsX2xpc3RbW3RpbWVzdGVwKzFdXSRwcm94ZWw9cHJveGVsX2xpc3RbW3RpbWVzdGVwKzFdXSRwcm94ZWxbLXdoaWNoKHByb3hlbF9saXN0W1t0aW1lc3RlcCsxXV0kcHJveGVsWyw0XTw9MCksXQ0KICBpZihsZW5ndGgod2hpY2gocHJveGVsX2xpc3RbW3RpbWVzdGVwKzFdXSRwcm94ZWxbLDNdPCAwKSkhPTApIHByb3hlbF9saXN0W1t0aW1lc3RlcCsxXV0kcHJveGVsPXByb3hlbF9saXN0W1t0aW1lc3RlcCsxXV0kcHJveGVsWy13aGljaChwcm94ZWxfbGlzdFtbdGltZXN0ZXArMV1dJHByb3hlbFssM108IDApLF0NCiAgDQogIGlmKFByaW50KSBwcmludChwYXN0ZSgiVGltZSBzdGVwOiIsdGltZXN0ZXApKQ0KICBpZihQcmludCkgcHJpbnQocHJveGVsX2xpc3RbW3RpbWVzdGVwKzFdXSkNCn0NCg0KcmV0dXJuKHByb3hlbF9saXN0KQ0KfQ0KcHJveGVsX2xpc3Q9UHJveGVsX2FsZ28oUkcsc3RhcnRwcm94ZWwsZGVsdGEsbWF4LnRzLFQpDQpwcm94ZWxfbGlzdA0KDQpgYGANCg0KDQpXaGF0IGlzIHRoZSBwcm9iYWJpbGl0eSB0aGF0IHRoZSBwYXRpZW50IGlzIHN0aWxsIHNpY2sgYWZ0ZXIgOCBkYXlzIGZvciBkaWZmZXJlbnQgZGlzY3JldGUgdGltZSBzdGVwcyAoZS5nLiAyLCAxLCAwLjUsIDAuMjUsIDAuMSk/DQoNCmBgYHtyIGluY2x1ZGU9RkFMU0V9DQpQMj1Qcm94ZWxfYWxnbyhSRyxzdGFydHByb3hlbCwyLDgsVCkNClAxPVByb3hlbF9hbGdvKFJHLHN0YXJ0cHJveGVsLDEsMTUsVCkNClAwNT1Qcm94ZWxfYWxnbyhSRyxzdGFydHByb3hlbCwwLjUsMjksVCkNClAwMjU9UHJveGVsX2FsZ28oUkcsc3RhcnRwcm94ZWwsMC4yNSw1NyxUKQ0KUDAxPVByb3hlbF9hbGdvKFJHLHN0YXJ0cHJveGVsLDAuMSw4MixUKQ0KYGBgDQoNCg0KYGBge3IgaW5jbHVkZT1GQUxTRX0NClAyW1s1XV0gICANClAxW1s5XV0gICANClAwNVtbMTddXSANClAwMjVbWzMzXV0NClAwMVtbODFdXSANCg0Kc3VtKFAyW1s1XV0kcHJveGVsJHByb2JbUDJbWzVdXSRwcm94ZWwkc3RhdGUgIT0gNF0pDQpzdW0oUDFbWzldXSRwcm94ZWwkcHJvYltQMVtbOV1dJHByb3hlbCRzdGF0ZSAhPSA0XSkNCnN1bShQMDVbWzE3XV0kcHJveGVsJHByb2JbUDA1W1sxN11dJHByb3hlbCRzdGF0ZSAhPSA0XSkNCnN1bShQMDI1W1szM11dJHByb3hlbCRwcm9iW1AwMjVbWzMzXV0kcHJveGVsJHN0YXRlICE9IDRdKQ0Kc3VtKFAwMVtbODFdXSRwcm94ZWwkcHJvYltQMDFbWzgxXV0kcHJveGVsJHN0YXRlICE9IDRdKQ0KYGBgDQoNCg0KV2hhdCBpcyB0aGUgcHJvYmFiaWxpdHkgb2YgbWVhc3VyaW5nIGZldmVyIG9uIHRoZSA5dGggZGF5IGZvciBkaWZmZXJlbnQgZGlzY3JldGUgdGltZSBzdGVwcyAoZS5nLiAyLCAxLCAwLjUsIDAuMjUsIDAuMSk/IA0KDQoNCmBgYHtyIGVjaG89RkFMU0V9DQoNCnBhc3RlKCJXa3QgPSIsc3VtKGFnZ3JlZ2F0ZS5kYXRhLmZyYW1lKFAyW1s1XV0kcHJveGVsJHByb2IsYnk9bGlzdChQMltbNV1dJHByb3hlbCRzdGF0ZSksRlVOID0gc3VtKSR4ICpjKDAuNSwwLjgpKSkNCnBhc3RlKCJXa3QgPSIsc3VtKGFnZ3JlZ2F0ZS5kYXRhLmZyYW1lKFAxW1s5XV0kcHJveGVsJHByb2IsYnk9bGlzdChQMVtbOV1dJHByb3hlbCRzdGF0ZSksRlVOID0gc3VtKSR4ICpjKDAuNSwwLjgsMCkpKQ0KcGFzdGUoIldrdCA9IixzdW0oYWdncmVnYXRlLmRhdGEuZnJhbWUoUDA1W1sxN11dJHByb3hlbCRwcm9iLGJ5PWxpc3QoUDA1W1sxN11dJHByb3hlbCRzdGF0ZSksRlVOID0gc3VtKSR4ICpjKDAuNSwwLjgsMCkpKQ0KcGFzdGUoIldrdCA9IixzdW0oYWdncmVnYXRlLmRhdGEuZnJhbWUoUDAyNVtbMzNdXSRwcm94ZWwkcHJvYixieT1saXN0KFAwMjVbWzMzXV0kcHJveGVsJHN0YXRlKSxGVU4gPSBzdW0pJHggKmMoMC41LDAuOCwwKSkpDQpwYXN0ZSgiV2t0ID0iLHN1bShhZ2dyZWdhdGUuZGF0YS5mcmFtZShQMDFbWzgxXV0kcHJveGVsJHByb2IsYnk9bGlzdChQMDFbWzgxXV0kcHJveGVsJHN0YXRlKSxGVU4gPSBzdW0pJHggKmMoMC41LDAuOCwwKSkpDQpgYGANCg0KDQoNCldoYXQgaXMgdGhlIGV4cGVjdGVkIGR1cmF0aW9uIHVudGlsIGhlYWxpbmcgd2l0aCBwcm9iYWJpbGl0eSA5OSUgZm9yIGRpZmZlcmVudCBkaXNjcmV0ZSB0aW1lIHN0ZXBzIChlLmcuIDIsIDEsIDAuNSwgMC4yNSwgMC4xKT8NCg0KDQpgYGB7ciBlY2hvPUZBTFNFfQ0KaT03DQojd2hpbGUgKHN1bShQMltbaV1dJHByb3hlbCRwcm9iW1AyW1tpXV0kcHJveGVsJHN0YXRlICE9IDRdKSA+IDAuMDEgKSBpPWkrMQ0KUDJbWzhdXSRwcm94ZWxbUDJbWzhdXSRwcm94ZWwkc3RhdGUgIT0gNCxdDQpwcmludChwYXN0ZSgiRsO8ciAyIEFuIFRhZzoiLChpLTEpKjIpKSAjIyBuYWNoIFRhZyAxNA0KDQppPTENCndoaWxlIChzdW0oUDFbW2ldXSRwcm94ZWwkcHJvYltQMVtbaV1dJHByb3hlbCRzdGF0ZSAhPSA0XSkgPiAwLjAxICkgaT1pKzENClAxW1tpXV0kcHJveGVsW1AxW1tpXV0kcHJveGVsJHN0YXRlICE9IDQsXQ0KcHJpbnQocGFzdGUoIkbDvHIgMSBBbiBUYWc6IiwoaS0xKSoxKSkNCg0KaT0xDQp3aGlsZSAoc3VtKFAwNVtbaV1dJHByb3hlbCRwcm9iW1AwNVtbaV1dJHByb3hlbCRzdGF0ZSAhPSA0XSkgPiAwLjAxICkgaT1pKzENClAwNVtbaV1dJHByb3hlbFtQMDVbW2ldXSRwcm94ZWwkc3RhdGUgIT0gNCxdDQpwcmludChwYXN0ZSgiRsO8ciAuNSBBbiBUYWc6IiwoaS0xKSowLjUpKQ0KDQppPTENCndoaWxlIChzdW0oUDAyNVtbaV1dJHByb3hlbCRwcm9iW1AwMjVbW2ldXSRwcm94ZWwkc3RhdGUgIT0gNF0pID4gMC4wMSApIGk9aSsxDQpQMDI1W1tpXV0kcHJveGVsW1AwMjVbW2ldXSRwcm94ZWwkc3RhdGUgIT0gNCxdDQpwcmludChwYXN0ZSgiRsO8ciAuMjUgQW4gVGFnOiIsKGktMSkqMC4yNSkpDQpgYGANCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0K