library(ChainLadder)
rm=list(ls())
source("http://freakonometrics.free.fr/bases.R")
#ls() #list of data

PAID #cumulative paid claims for AY i after j-1 years
     [,1] [,2] [,3] [,4] [,5] [,6]
[1,] 3209 4372 4411 4428 4435 4456
[2,] 3367 4659 4696 4720 4730   NA
[3,] 3871 5345 5398 5420   NA   NA
[4,] 4239 5917 6020   NA   NA   NA
[5,] 4929 6794   NA   NA   NA   NA
[6,] 5217   NA   NA   NA   NA   NA
NUMBER #declared in year i after j-1 years 
       [,1]   [,2]   [,3]   [,4]   [,5]   [,6]
[1,] 1043.4 1045.5 1047.5 1047.7 1047.7 1047.7
[2,] 1043.0 1027.1 1028.7 1028.9 1028.7     NA
[3,]  965.1  967.9  967.8  970.1     NA     NA
[4,]  977.0  984.7  986.8     NA     NA     NA
[5,] 1099.0 1118.5     NA     NA     NA     NA
[6,] 1076.3     NA     NA     NA     NA     NA
INCURRED
     [,1] [,2] [,3] [,4] [,5] [,6]
[1,] 4975 4629 4497 4470 4456 4456
[2,] 5135 4949 4783 4760 4750   NA
[3,] 5681 5631 5492 5470   NA   NA
[4,] 6272 6198 6131   NA   NA   NA
[5,] 7326 7087   NA   NA   NA   NA
[6,] 7353   NA   NA   NA   NA   NA
(CASE.OUTSTANDING <- INCURRED-PAID)
     [,1] [,2] [,3] [,4] [,5] [,6]
[1,] 1766  257   86   42   21    0
[2,] 1768  290   87   40   20   NA
[3,] 1810  286   94   50   NA   NA
[4,] 2033  281  111   NA   NA   NA
[5,] 2397  293   NA   NA   NA   NA
[6,] 2136   NA   NA   NA   NA   NA

#STEP 1:
PAID
     [,1] [,2] [,3] [,4] [,5] [,6]
[1,] 3209 4372 4411 4428 4435 4456
[2,] 3367 4659 4696 4720 4730   NA
[3,] 3871 5345 5398 5420   NA   NA
[4,] 4239 5917 6020   NA   NA   NA
[5,] 4929 6794   NA   NA   NA   NA
[6,] 5217   NA   NA   NA   NA   NA
#STEP 2-3-4 (we will only use simple average) : 
#CHAIN LADDER/DEVELOPMENT
D12.24 <- sum(PAID[1:5,2])/sum(PAID[1:5,1])
D24.36 <- sum(PAID[1:4,3])/sum(PAID[1:4,2])
D36.48 <- sum(PAID[1:3,4])/sum(PAID[1:3,3])
D48.60 <- sum(PAID[1:2,5])/sum(PAID[1:2,4])
D60.72 <- sum(PAID[1:1,6])/sum(PAID[1:1,5])


#STEP 6 (Cumulative Development Factors) :
Cult <- 1  
#under the assumption that no more development after 72 months
C60 <- D60.72
C48 <- D60.72*D48.60
C36 <- D60.72*D48.60*D36.48
C24 <- D60.72*D48.60*D36.48*D24.36
C12 <- D60.72*D48.60*D36.48*D24.36*D12.24
Dev.Fact <- c(C12,C24,C36,C48,C60,Cult)

#STEP 7 (Project Ultimate Claims) :
c(C12,C24,C36,C48,C60,Cult)^-1
[1] 0.7081910 0.9779643 0.9891449 0.9934411 0.9952873 1.0000000
Ult.1 <- PAID[6,1]*C12
Ult.2 <- PAID[5,2]*C24
Ult.3 <- PAID[4,3]*C36
Ult.4 <- PAID[3,4]*C48
Ult.5 <- PAID[2,5]*C60
Ult.6 <- PAID[1,6]*Cult
c(Ult.1,Ult.2,Ult.3,Ult.4,Ult.5,Ult.6)
[1] 7366.656 6947.084 6086.065 5455.784 4752.397 4456.000
#IBNR=UNPAID assuming PAID=REPORTED
c(Ult.1-PAID[6,1],Ult.2-PAID[5,2],Ult.3-PAID[4,3],Ult.4-PAID[3,4],
Ult.5-PAID[2,5],Ult.6-PAID[1,6])
[1] 2149.65640  153.08358   66.06466   35.78388   22.39684    0.00000
c(L1,L2,L3,L4)
[1] 2.087074 1.379946 1.147869 1.064478
c(I1,I2,I3,I4)
 [1] 2.195918 1.427006 1.158336 1.064478 2.149065 1.389283 1.138382       NA
 [9] 2.041704 1.347161       NA       NA 2.037584       NA       NA       NA
#Arithmetic Average
A1 <- (I1[1]+I2[1]+I3[1]+I4[1])/4
A2 <- (I1[2]+I2[2]+I3[2])/3
A3 <- (I1[3]+I2[3])/2
A4 <- I1[4]
c(A1,A2,A4,A4)
[1] 2.106068 1.387816 1.064478 1.064478
#Geometric mean
G1 <- (I1[1]*I2[1]*I3[1]*I4[1])^0.25
G2 <- (I1[2]*I2[2]*I3[2])^(1/3)
G3 <- (I1[3]*I2[3])^(0.5)
G4 <-  I1[4]
c(G1,G2,G3,G4)
[1] 2.104958 1.387433 1.148316 1.064478
#Weigthed Average
W1 <- (I1[1]*Y1[1]+I2[1]*Y2[1]+I3[1]*Y3[1]+I4[1]*Y4[1])/(Y1[1]+Y2[1]+Y3[1]+Y4[1])
W2 <- (I1[2]*Y1[2]+I2[2]*Y2[2]+I3[2]*Y3[2])/(Y1[2]+Y2[2]+Y3[2])
W3 <- (I1[3]*Y1[3]+I2[3]*Y2[3])/(Y1[3]+Y2[3])
W4 <- I1[4]*Y1[4]/Y1[4]
c(W1,W2,W3,W4)
[1] 2.087074 1.379946 1.147869 1.064478
#Remove min
RMin1 <- (I1[1]+I2[1]+I3[1])/3
RMin2 <- (I1[2]+I2[2])/2
RMin3 <- I1[3]
RMin4 <- I1[4]
#Remove max
RMax1 <- (I4[1]+I2[1]+I3[1])/3
RMax2 <- (I3[2]+I2[2])/2
RMax3 <- I2[3]
RMax4 <- I1[4]

#CL 4200001.221.161.081.04-420000 #BF 10000000.6(1-1/(1.221.161.081.04)) 10000000.4(1/(1.221.161.081.04))



<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVJMFY0WVcxd2JHVWdRMHhjYmxreElEd3RJR01vTVRBd0xDQXhOVEFzSURFM05Td2dNVGd3SUN3Z01qQXdLVnh1V1RJZ1BDMGdZeWd4TVRBc0lERTJPQ3dnTVRreUxDQXlNRFVzSUU1QklDbGNibGt6SUR3dElHTW9NVEUxTENBeE5qa3NJREl3TWl3Z1RrRXNJRTVCS1Z4dVdUUWdQQzBnWXlneE1qVXNJREU0TlN3Z1RrRXNJRTVCTENCT1FTbGNibGsxSUR3dElHTW9NVFV3TENCT1FTd2dUa0VzSUU1QkxDQk9RU2tnWEc1Y2JrTlZUU0E4TFNCdFlYUnlhWGdvWXloWk1TeFpNaXhaTXl4Wk5DeFpOU2tzYm1OdmJEMDFMRzV5YjNjOU5Td2dZbmx5YjNjOU1TQXBYRzVNTVNBOExTQnpkVzBvUTFWTld6RTZOQ3d5WFNrdmMzVnRLRU5WVFZzeE9qUXNNVjBwWEc1TU1pQThMU0J6ZFcwb1ExVk5XekU2TXl3elhTa3ZjM1Z0S0VOVlRWc3hPak1zTWwwcFhHNU1NeUE4TFNCemRXMG9RMVZOV3pFNk1pdzBYU2t2YzNWdEtFTlZUVnN4T2pJc00xMHBYRzVNTkNBOExTQnpkVzBvUTFWTld6RTZNU3cxWFNrdmMzVnRLRU5WVFZzeE9qRXNORjBwWEc1aktFd3hMRXd5TEV3ekxFdzBLVnh1WUdCZ0luMD0gLS0+XG5cbmBgYHJcbiNFeGFtcGxlIENMXG5ZMSA8LSBjKDEwMCwgMTUwLCAxNzUsIDE4MCAsIDIwMClcblkyIDwtIGMoMTEwLCAxNjgsIDE5MiwgMjA1LCBOQSApXG5ZMyA8LSBjKDExNSwgMTY5LCAyMDIsIE5BLCBOQSlcblk0IDwtIGMoMTI1LCAxODUsIE5BLCBOQSwgTkEpXG5ZNSA8LSBjKDE1MCwgTkEsIE5BLCBOQSwgTkEpIFxuXG5DVU0gPC0gbWF0cml4KGMoWTEsWTIsWTMsWTQsWTUpLG5jb2w9NSxucm93PTUsIGJ5cm93PTEgKVxuTDEgPC0gc3VtKENVTVsxOjQsMl0pL3N1bShDVU1bMTo0LDFdKVxuTDIgPC0gc3VtKENVTVsxOjMsM10pL3N1bShDVU1bMTozLDJdKVxuTDMgPC0gc3VtKENVTVsxOjIsNF0pL3N1bShDVU1bMToyLDNdKVxuTDQgPC0gc3VtKENVTVsxOjEsNV0pL3N1bShDVU1bMToxLDRdKVxuYyhMMSxMMixMMyxMNClcbmBgYFxuXG48IS0tIHJuYi1zb3VyY2UtZW5kIC0tPlxuIn0= -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuI0V4YW1wbGUgQ0xcblkxIDwtIGMoMTAwLCAxNTAsIDE3NSwgMTgwICwgMjAwKVxuWTIgPC0gYygxMTAsIDE2OCwgMTkyLCAyMDUsIE5BIClcblkzIDwtIGMoMTE1LCAxNjksIDIwMiwgTkEsIE5BKVxuWTQgPC0gYygxMjUsIDE4NSwgTkEsIE5BLCBOQSlcblk1IDwtIGMoMTUwLCBOQSwgTkEsIE5BLCBOQSkgXG5cbkNVTSA8LSBtYXRyaXgoYyhZMSxZMixZMyxZNCxZNSksbmNvbD01LG5yb3c9NSwgYnlyb3c9MSApXG5MMSA8LSBzdW0oQ1VNWzE6NCwyXSkvc3VtKENVTVsxOjQsMV0pXG5MMiA8LSBzdW0oQ1VNWzE6MywzXSkvc3VtKENVTVsxOjMsMl0pXG5MMyA8LSBzdW0oQ1VNWzE6Miw0XSkvc3VtKENVTVsxOjIsM10pXG5MNCA8LSBzdW0oQ1VNWzE6MSw1XSkvc3VtKENVTVsxOjEsNF0pXG5jKEwxLEwyLEwzLEw0KVxuYGBgIn0= -->

```r
#Example CL
Y1 <- c(100, 150, 175, 180 , 200)
Y2 <- c(110, 168, 192, 205, NA )
Y3 <- c(115, 169, 202, NA, NA)
Y4 <- c(125, 185, NA, NA, NA)
Y5 <- c(150, NA, NA, NA, NA) 

CUM <- matrix(c(Y1,Y2,Y3,Y4,Y5),ncol=5,nrow=5, byrow=1 )
L1 <- sum(CUM[1:4,2])/sum(CUM[1:4,1])
L2 <- sum(CUM[1:3,3])/sum(CUM[1:3,2])
L3 <- sum(CUM[1:2,4])/sum(CUM[1:2,3])
L4 <- sum(CUM[1:1,5])/sum(CUM[1:1,4])
c(L1,L2,L3,L4)
#Example BF
R.2011 <- c(26,40,48,51)
R.2012 <- c(40,43,51)
R.2013 <- c(44,67)
R.2014 <- c(69)
l3 <- 51/48
l2 <- (48+51)/(40+43)
l1 <- (40+43+67)/(44+40+26)
c(l1,l2,l3)
c.ult <- l1*l2*l3
200*0.51*(1-1/c.ult) + 69
library(ChainLadder)
## Building the database
pmt <- c(100 ,200 ,325 ,350 ,125 ,225 ,335 ,75 ,175 ,50)
Year <- c(1,2,3,4,1,2,3,1,2,1)
Delay <- c(1,1,1,1,2,2,2,3,3,4)
dda <- data.frame(ptm = pmt , Year = Year , Delay = Delay)

### quasi -Poisson model fit
model2 <- glm(pmt ~ as.factor(Year) + as.factor(Delay),
family = quasipoisson, data = dda)
summary(model2)


tri <- matrix(c(425,532,717,440,620,522,657,730,560,NA,612,714,802,
 NA,NA,714,732,NA,NA,NA,730,NA,NA,NA,NA), ncol = 5)
triINC <- cum2incr(tri)
pmt <- c(425, 532, 717, 440, 620, 97,125, 13, 120, 90, 57, 72, 102, 18, 16)
Year <- as.factor(c(1,2,3,4,5,1,2,3,4,1,2,3,1,2,1))
Delay <- as.factor(c(1,1,1,1,1,2,2,2,2,3,3,3,4,4,5))
dda <- data.frame(pmt = pmt, Year = Year, Delay = Delay)
model2 <- glm(pmt ~ Year + Delay, family = quasipoisson, data = dda)
summary(model2)

ddaNEW <- data.frame(Year = as.factor(c(1,2,3,4,5,1,2,3,4,5,1,2,3,
  4,5,1,2,3,4,5,1,2,3,4,5)), Delay = as.factor(c(1,1,1,1,1,
  2,2,2,2,2,3,3,3,3,3,4,4,4,4,4,5,5,5,5,5)))
ddaNEW$pred <- predict(model2, newdata = ddaNEW, type = "response")
matrix(ddaNEW$pred, ncol = 5)

104.11542 + 83.07034 + 73.04849 + 19.72514 + 64.24306 + 
56.49258 + 15.25458+  72.57919 + 19.59841 + 16.40336

#Var1 = 0
#Var2 = 16,40
#Var3 = 72,57919 + 19,59841 = 92,1776
#Var4 = 64,24306 + 56,49258 + 15,25458 = 135,9902
#Var5 = 104,11542 + 83,07034 + 73,04849 + 19,72514 = 279,9594.
LS0tCnRpdGxlOiAiQUNUVS00NTcgKE1hc3QgNzI0KSBSaXNrIFRoZW9yeSIKYXV0aG9yOiAiUHJvZi4gTWVsaW5hIE1haWxob3QiCmRhdGU6ICIyMDI1LTA0LTIiCm91dHB1dDoKICBodG1sX25vdGVib29rOiBkZWZhdWx0CiAgcGRmX2RvY3VtZW50OiBkZWZhdWx0Ci0tLQoKYGBge3J9CmxpYnJhcnkoQ2hhaW5MYWRkZXIpCnJtPWxpc3QobHMoKSkKc291cmNlKCJodHRwOi8vZnJlYWtvbm9tZXRyaWNzLmZyZWUuZnIvYmFzZXMuUiIpCiNscygpICNsaXN0IG9mIGRhdGEKClBBSUQgI2N1bXVsYXRpdmUgcGFpZCBjbGFpbXMgZm9yIEFZIGkgYWZ0ZXIgai0xIHllYXJzCk5VTUJFUiAjZGVjbGFyZWQgaW4geWVhciBpIGFmdGVyIGotMSB5ZWFycyAKSU5DVVJSRUQKKENBU0UuT1VUU1RBTkRJTkcgPC0gSU5DVVJSRUQtUEFJRCkKCmBgYAoKYGBge3J9CgojU1RFUCAxOgpQQUlECgojU1RFUCAyLTMtNCAod2Ugd2lsbCBvbmx5IHVzZSBzaW1wbGUgYXZlcmFnZSkgOiAKI0NIQUlOIExBRERFUi9ERVZFTE9QTUVOVApEMTIuMjQgPC0gc3VtKFBBSURbMTo1LDJdKS9zdW0oUEFJRFsxOjUsMV0pCkQyNC4zNiA8LSBzdW0oUEFJRFsxOjQsM10pL3N1bShQQUlEWzE6NCwyXSkKRDM2LjQ4IDwtIHN1bShQQUlEWzE6Myw0XSkvc3VtKFBBSURbMTozLDNdKQpENDguNjAgPC0gc3VtKFBBSURbMToyLDVdKS9zdW0oUEFJRFsxOjIsNF0pCkQ2MC43MiA8LSBzdW0oUEFJRFsxOjEsNl0pL3N1bShQQUlEWzE6MSw1XSkKCgojU1RFUCA2IChDdW11bGF0aXZlIERldmVsb3BtZW50IEZhY3RvcnMpIDoKQ3VsdCA8LSAxICAKI3VuZGVyIHRoZSBhc3N1bXB0aW9uIHRoYXQgbm8gbW9yZSBkZXZlbG9wbWVudCBhZnRlciA3MiBtb250aHMKQzYwIDwtIEQ2MC43MgpDNDggPC0gRDYwLjcyKkQ0OC42MApDMzYgPC0gRDYwLjcyKkQ0OC42MCpEMzYuNDgKQzI0IDwtIEQ2MC43MipENDguNjAqRDM2LjQ4KkQyNC4zNgpDMTIgPC0gRDYwLjcyKkQ0OC42MCpEMzYuNDgqRDI0LjM2KkQxMi4yNApEZXYuRmFjdCA8LSBjKEMxMixDMjQsQzM2LEM0OCxDNjAsQ3VsdCkKCiNTVEVQIDcgKFByb2plY3QgVWx0aW1hdGUgQ2xhaW1zKSA6CmMoQzEyLEMyNCxDMzYsQzQ4LEM2MCxDdWx0KV4tMQpVbHQuMSA8LSBQQUlEWzYsMV0qQzEyClVsdC4yIDwtIFBBSURbNSwyXSpDMjQKVWx0LjMgPC0gUEFJRFs0LDNdKkMzNgpVbHQuNCA8LSBQQUlEWzMsNF0qQzQ4ClVsdC41IDwtIFBBSURbMiw1XSpDNjAKVWx0LjYgPC0gUEFJRFsxLDZdKkN1bHQKYyhVbHQuMSxVbHQuMixVbHQuMyxVbHQuNCxVbHQuNSxVbHQuNikKYGBgCgpgYGB7cn0KI0lCTlI9VU5QQUlEIGFzc3VtaW5nIFBBSUQ9UkVQT1JURUQKYyhVbHQuMS1QQUlEWzYsMV0sVWx0LjItUEFJRFs1LDJdLFVsdC4zLVBBSURbNCwzXSxVbHQuNC1QQUlEWzMsNF0sClVsdC41LVBBSURbMiw1XSxVbHQuNi1QQUlEWzEsNl0pCmBgYAoKCgpgYGB7cn0KI0V4YW1wbGUgQ0wKWTEgPC0gYygyNjMxMiwgNTc3NzksIDgyNDUxLCA5NTUwNiAsIDEwMTY2NCkKWTIgPC0gYygzMDQ3MCwgNjU0ODIsIDkwOTczLCAxMDM1NjIsIE5BICkKWTMgPC0gYyg0OTc1NiwgMTAxNTg3LCAxMzY4NTQsIE5BLCBOQSkKWTQgPC0gYyg1MDQyMCwgMTAyNzM1LCBOQSwgTkEsIE5BKQpZNSA8LSBjKDU2NzYyLCBOQSwgTkEsIE5BLCBOQSkgCgpDVU0gPC0gbWF0cml4KGMoWTEsWTIsWTMsWTQsWTUpLG5jb2w9NSxucm93PTUsIGJ5cm93PTEgKQoKTDEgPC0gc3VtKENVTVsxOjQsMl0pL3N1bShDVU1bMTo0LDFdKQpMMiA8LSBzdW0oQ1VNWzE6MywzXSkvc3VtKENVTVsxOjMsMl0pCkwzIDwtIHN1bShDVU1bMToyLDRdKS9zdW0oQ1VNWzE6MiwzXSkKTDQgPC0gc3VtKENVTVsxOjEsNV0pL3N1bShDVU1bMToxLDRdKQpjKEwxLEwyLEwzLEw0KQoKYGBgCmBgYHtyfQojSW5kaXZpZHVhbCBEZXZlbG9wbWVudApJMSA8LSBjKDU3Nzc5LzI2MzEyLCA4MjQ1MS81Nzc3OSwgOTU1MDYvIDgyNDUxICwgMTAxNjY0Lzk1NTA2KQpJMiA8LSBjKDY1NDgyLzMwNDcwLCA5MDk3My82NTQ4MiwgMTAzNTYyLzkwOTczLCBOQSApCkkzIDwtIGMoMTAxNTg3LzQ5NzU2LCAxMzY4NTQvMTAxNTg3LCBOQSwgTkEpCkk0IDwtIGMoMTAyNzM1LzUwNDIwLCBOQSwgTkEsIE5BKQpjKEkxLEkyLEkzLEk0KQpgYGAKCmBgYHtyfQojQXJpdGhtZXRpYyBBdmVyYWdlCkExIDwtIChJMVsxXStJMlsxXStJM1sxXStJNFsxXSkvNApBMiA8LSAoSTFbMl0rSTJbMl0rSTNbMl0pLzMKQTMgPC0gKEkxWzNdK0kyWzNdKS8yCkE0IDwtIEkxWzRdCmMoQTEsQTIsQTQsQTQpCiNHZW9tZXRyaWMgbWVhbgpHMSA8LSAoSTFbMV0qSTJbMV0qSTNbMV0qSTRbMV0pXjAuMjUKRzIgPC0gKEkxWzJdKkkyWzJdKkkzWzJdKV4oMS8zKQpHMyA8LSAoSTFbM10qSTJbM10pXigwLjUpCkc0IDwtICBJMVs0XQpjKEcxLEcyLEczLEc0KQojV2VpZ3RoZWQgQXZlcmFnZQpXMSA8LSAoSTFbMV0qWTFbMV0rSTJbMV0qWTJbMV0rSTNbMV0qWTNbMV0rSTRbMV0qWTRbMV0pLyhZMVsxXStZMlsxXStZM1sxXStZNFsxXSkKVzIgPC0gKEkxWzJdKlkxWzJdK0kyWzJdKlkyWzJdK0kzWzJdKlkzWzJdKS8oWTFbMl0rWTJbMl0rWTNbMl0pClczIDwtIChJMVszXSpZMVszXStJMlszXSpZMlszXSkvKFkxWzNdK1kyWzNdKQpXNCA8LSBJMVs0XSpZMVs0XS9ZMVs0XQpjKFcxLFcyLFczLFc0KQojUmVtb3ZlIG1pbgpSTWluMSA8LSAoSTFbMV0rSTJbMV0rSTNbMV0pLzMKUk1pbjIgPC0gKEkxWzJdK0kyWzJdKS8yClJNaW4zIDwtIEkxWzNdClJNaW40IDwtIEkxWzRdCiNSZW1vdmUgbWF4ClJNYXgxIDwtIChJNFsxXStJMlsxXStJM1sxXSkvMwpSTWF4MiA8LSAoSTNbMl0rSTJbMl0pLzIKUk1heDMgPC0gSTJbM10KUk1heDQgPC0gSTFbNF0KYGBgCgojQ0wKNDIwMDAwKjEuMjIqMS4xNioxLjA4KjEuMDQtNDIwMDAwCiNCRgoxMDAwMDAwKjAuNiooMS0xLygxLjIyKjEuMTYqMS4wOCoxLjA0KSkKMTAwMDAwMCowLjQqKDEvKDEuMjIqMS4xNioxLjA4KjEuMDQpKQpgYGAKCmBgYHtyfQojRXhhbXBsZSBDTApZMSA8LSBjKDEwMCwgMTUwLCAxNzUsIDE4MCAsIDIwMCkKWTIgPC0gYygxMTAsIDE2OCwgMTkyLCAyMDUsIE5BICkKWTMgPC0gYygxMTUsIDE2OSwgMjAyLCBOQSwgTkEpClk0IDwtIGMoMTI1LCAxODUsIE5BLCBOQSwgTkEpClk1IDwtIGMoMTUwLCBOQSwgTkEsIE5BLCBOQSkgCgpDVU0gPC0gbWF0cml4KGMoWTEsWTIsWTMsWTQsWTUpLG5jb2w9NSxucm93PTUsIGJ5cm93PTEgKQpMMSA8LSBzdW0oQ1VNWzE6NCwyXSkvc3VtKENVTVsxOjQsMV0pCkwyIDwtIHN1bShDVU1bMTozLDNdKS9zdW0oQ1VNWzE6MywyXSkKTDMgPC0gc3VtKENVTVsxOjIsNF0pL3N1bShDVU1bMToyLDNdKQpMNCA8LSBzdW0oQ1VNWzE6MSw1XSkvc3VtKENVTVsxOjEsNF0pCmMoTDEsTDIsTDMsTDQpCmBgYAoKYGBge3J9CiNFeGFtcGxlIEJGClIuMjAxMSA8LSBjKDI2LDQwLDQ4LDUxKQpSLjIwMTIgPC0gYyg0MCw0Myw1MSkKUi4yMDEzIDwtIGMoNDQsNjcpClIuMjAxNCA8LSBjKDY5KQpsMyA8LSA1MS80OApsMiA8LSAoNDgrNTEpLyg0MCs0MykKbDEgPC0gKDQwKzQzKzY3KS8oNDQrNDArMjYpCmMobDEsbDIsbDMpCmMudWx0IDwtIGwxKmwyKmwzCjIwMCowLjUxKigxLTEvYy51bHQpICsgNjkKYGBgCgpgYGB7cn0KbGlicmFyeShDaGFpbkxhZGRlcikKIyMgQnVpbGRpbmcgdGhlIGRhdGFiYXNlCnBtdCA8LSBjKDEwMCAsMjAwICwzMjUgLDM1MCAsMTI1ICwyMjUgLDMzNSAsNzUgLDE3NSAsNTApClllYXIgPC0gYygxLDIsMyw0LDEsMiwzLDEsMiwxKQpEZWxheSA8LSBjKDEsMSwxLDEsMiwyLDIsMywzLDQpCmRkYSA8LSBkYXRhLmZyYW1lKHB0bSA9IHBtdCAsIFllYXIgPSBZZWFyICwgRGVsYXkgPSBEZWxheSkKCiMjIyBxdWFzaSAtUG9pc3NvbiBtb2RlbCBmaXQKbW9kZWwyIDwtIGdsbShwbXQgfiBhcy5mYWN0b3IoWWVhcikgKyBhcy5mYWN0b3IoRGVsYXkpLApmYW1pbHkgPSBxdWFzaXBvaXNzb24sIGRhdGEgPSBkZGEpCnN1bW1hcnkobW9kZWwyKQoKCnRyaSA8LSBtYXRyaXgoYyg0MjUsNTMyLDcxNyw0NDAsNjIwLDUyMiw2NTcsNzMwLDU2MCxOQSw2MTIsNzE0LDgwMiwKIE5BLE5BLDcxNCw3MzIsTkEsTkEsTkEsNzMwLE5BLE5BLE5BLE5BKSwgbmNvbCA9IDUpCnRyaUlOQyA8LSBjdW0yaW5jcih0cmkpCnBtdCA8LSBjKDQyNSwgNTMyLCA3MTcsIDQ0MCwgNjIwLCA5NywxMjUsIDEzLCAxMjAsIDkwLCA1NywgNzIsIDEwMiwgMTgsIDE2KQpZZWFyIDwtIGFzLmZhY3RvcihjKDEsMiwzLDQsNSwxLDIsMyw0LDEsMiwzLDEsMiwxKSkKRGVsYXkgPC0gYXMuZmFjdG9yKGMoMSwxLDEsMSwxLDIsMiwyLDIsMywzLDMsNCw0LDUpKQpkZGEgPC0gZGF0YS5mcmFtZShwbXQgPSBwbXQsIFllYXIgPSBZZWFyLCBEZWxheSA9IERlbGF5KQptb2RlbDIgPC0gZ2xtKHBtdCB+IFllYXIgKyBEZWxheSwgZmFtaWx5ID0gcXVhc2lwb2lzc29uLCBkYXRhID0gZGRhKQpzdW1tYXJ5KG1vZGVsMikKCmRkYU5FVyA8LSBkYXRhLmZyYW1lKFllYXIgPSBhcy5mYWN0b3IoYygxLDIsMyw0LDUsMSwyLDMsNCw1LDEsMiwzLAogIDQsNSwxLDIsMyw0LDUsMSwyLDMsNCw1KSksIERlbGF5ID0gYXMuZmFjdG9yKGMoMSwxLDEsMSwxLAogIDIsMiwyLDIsMiwzLDMsMywzLDMsNCw0LDQsNCw0LDUsNSw1LDUsNSkpKQpkZGFORVckcHJlZCA8LSBwcmVkaWN0KG1vZGVsMiwgbmV3ZGF0YSA9IGRkYU5FVywgdHlwZSA9ICJyZXNwb25zZSIpCm1hdHJpeChkZGFORVckcHJlZCwgbmNvbCA9IDUpCgoxMDQuMTE1NDIgKyA4My4wNzAzNCArIDczLjA0ODQ5ICsgMTkuNzI1MTQgKyA2NC4yNDMwNiArIAo1Ni40OTI1OCArIDE1LjI1NDU4KyAgNzIuNTc5MTkgKyAxOS41OTg0MSArIDE2LjQwMzM2CgojVmFyMSA9IDAKI1ZhcjIgPSAxNiw0MAojVmFyMyA9IDcyLDU3OTE5ICsgMTksNTk4NDEgPSA5MiwxNzc2CiNWYXI0ID0gNjQsMjQzMDYgKyA1Niw0OTI1OCArIDE1LDI1NDU4ID0gMTM1LDk5MDIKI1ZhcjUgPSAxMDQsMTE1NDIgKyA4MywwNzAzNCArIDczLDA0ODQ5ICsgMTksNzI1MTQgPSAyNzksOTU5NC4KYGBgCgo=