Packages Required

Data Formatting

walleye<-read.csv("E:/Grad School/Spring 2020/Quantitative Fisheries Analysis/Population Assessment/walleye.csv")
sampling<-read.csv("E:/Grad School/Spring 2020/Quantitative Fisheries Analysis/Population Assessment/merritsamples.csv")
left_join(sampling,walleye,by=c("Linker","WaterbodyCode","Area","MethodCode","Station","Effort"))->combined
combined %<>% 
  tidyr::separate(surveydate.x, c("month","day","year"),remove=F) %>% 
  mutate(year=as.numeric(year),
    lencat10=lencat(FishLength,w=10),
         psd=lencat(FishLength,breaks=psdVal("Walleye",units = "mm"),use.names=T))
Expected 3 pieces. Additional pieces discarded in 1928 rows [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, ...].

Takeaways: 1. All sampling events were successfull in capturing walleye, therefore there is no need to add CPUE of 0 to any sampling event if all sizes of walleye are being used. I will refer to this in teh Relative abundance section.

General Summary Statistics

#Otoliths collected summary
combined %>% filter(is.na(LengthGroup),!is.na(Age)) %>% group_by(year) %>% dplyr::summarise(n=n()) %>% summarise(mean=mean(n),sd=sd(n),n=sum(n)) #n=1409, mean=108 sd=24.65
#number of nets set = 51
length(unique(combined$Linker))
[1] 51
#number of nets set per year
combined %>% group_by(year) %>% dplyr::summarise(fish=n(),length(unique(Linker))) 

General Length Frequency

#Length Freq for all years to determine length at recruit and visualize data
combined %>% dplyr::select(Linker,year,LengthGroup,FishCount,FishLength,FishWeight,lencat10)->lengthdata
#Count fish by length category 
lengthdata %>%filter(is.na(LengthGroup)) %>% group_by( lencat10) %>% 
  dplyr::summarise(n=n())->no_LengthGroup1 
#Count fish by length category in Length Group column
lengthdata %>% group_by(LengthGroup,FishCount,year,Linker) %>% 
  dplyr::summarise() %>%  filter(!is.na(LengthGroup)) ->LengthGroup1 
#Combing for full count (use for plotting & analysis)
full_join(no_LengthGroup1,LengthGroup1,by=c("lencat10"="LengthGroup","n"="FishCount"))->fish_counts1
#Total fish Captured
fish_counts1 %>% summarise(n=sum(n)) #n = 1949
#Giving each fish unique identity (LengthGroup)
uncount(LengthGroup1, FishCount)->uncount_lengthgroup # n=32
full_join(subset(lengthdata,is.na(LengthGroup)),uncount_lengthgroup,by=c("FishLength"="LengthGroup","year","Linker"))->all_fish_lengths#n=1949
#Mean # of fish captured per year
all_fish_lengths %>% group_by(year) %>% dplyr::summarise(n=n()) %>% summarise(mean(n),sd(n),sum(n))
#Mean length (no Counted fish, minimal effect) n=1949, mean=443.7019, sd=97.06711
all_fish_lengths %<>% dplyr::select(-LengthGroup,-FishCount,-lencat10) %>% mutate(lencat10=lencat(FishLength,w=10))
all_fish_lengths %>% group_by() %>% dplyr::summarise(n=n(),mean=mean(FishLength),sd(FishLength))#1,949
#Length Freq plot
fish_counts1 %>% dplyr::select(-year,-Linker) %>% group_by(lencat10,n) %>% dplyr::summarise() %>% 
ggplot(aes(x=lencat10,y=n))+theme_classic()+
  geom_vline(aes(xintercept=635),linetype="dashed")+
  geom_vline(aes(xintercept=457),linetype="dashed")+
    geom_rect(aes(xmin=457,xmax=635,ymin=0,ymax=110),fill="grey50",alpha=.01)+
    geom_rect(aes(xmin=457,xmax=750,ymin=0,ymax=110),fill="grey50",alpha=.01)+
  geom_col(fill="grey60",col="black",position = "dodge")+
scale_fill_manual(values = alpha("white", .8))  +
geom_vline(aes(xintercept=444),cex=1.2)+
  labs(x="Total Length (mm)",y="Count")+
  scale_x_continuous(breaks = seq(0,750,50))+
  theme(axis.line = element_blank(),
        axis.text = element_text(family = "serif",size = 12))->all_lengths_histo
ggsave(all_lengths_histo,file="E:/Grad School/Spring 2020/Quantitative Fisheries Analysis/Population Assessment/tiffs/all_lengths_histo.tiff",dpi=500,width = 9,height = 6)

Takeaways: 1. First, there were a number of fish and LINKERS that used counts instead of measuring each fish. This means that to plot and analyze length properly, I must combined the two types of data. 2. Total fish captured was 1,949. Using this number, I made sure the data that was analyzed and plot always had a n=1,949. 3. Mean total lengths of combined sampling years=444 sd=97.06711.

Stat Analysis of Length Here I analyzed mean lengths across years and plotted means with 95% CI’s

#test of normality
all_fish_lengths$year<-as.factor(all_fish_lengths$year)#making year a factor to allow stat testing
shapiro.test(all_fish_lengths$FishLength)

    Shapiro-Wilk normality test

data:  all_fish_lengths$FishLength
W = 0.99016, p-value = 3.14e-10
(ggdensity(all_fish_lengths$FishLength))#normality will be assumed
Summarize(all_fish_lengths$FishLength)
         n       mean         sd        min         Q1     median         Q3        max 
1949.00000  443.70190   97.06711  179.00000  380.00000  454.00000  508.00000  734.00000 
lm(FishLength~year,data=subset(all_fish_lengths,FishLength>=250 ))->lm_lengths_year
summary(lm_lengths_year)

Call:
lm(formula = FishLength ~ year, data = subset(all_fish_lengths, 
    FishLength >= 250))

Residuals:
     Min       1Q   Median       3Q      Max 
-205.124  -60.518   -4.191   49.550  280.541 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept)  439.459      6.682  65.766  < 2e-16 ***
year1995      11.798      9.593   1.230  0.21888    
year1996      41.666      9.085   4.586 4.82e-06 ***
year1997     -53.227      9.030  -5.894 4.45e-09 ***
year1998       3.868      8.500   0.455  0.64911    
year1999     -17.762     10.356  -1.715  0.08648 .  
year2000      25.624      9.626   2.662  0.00784 ** 
year2001     -12.035     11.275  -1.067  0.28592    
year2002       6.590     11.363   0.580  0.56203    
year2003       9.541      9.950   0.959  0.33770    
year2004      53.392     10.303   5.182 2.43e-07 ***
year2005      67.606      9.751   6.933 5.64e-12 ***
year2006      18.340      9.496   1.931  0.05359 .  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 83.73 on 1883 degrees of freedom
Multiple R-squared:  0.1211,    Adjusted R-squared:  0.1155 
F-statistic: 21.62 on 12 and 1883 DF,  p-value: < 2.2e-16
leng_tuk <- multcomp::glht(lm_lengths_year,mcp(year="Tukey"))#no difference in age
summary(leng_tuk)
Completion with error > absepsCompletion with error > absepsCompletion with error > absepsCompletion with error > absepsCompletion with error > absepsCompletion with error > absepsCompletion with error > absepsCompletion with error > absepsCompletion with error > absepsCompletion with error > absepsCompletion with error > absepsCompletion with error > absepsCompletion with error > absepsCompletion with error > absepsCompletion with error > absepsCompletion with error > absepsCompletion with error > absepsCompletion with error > abseps

     Simultaneous Tests for General Linear Hypotheses

Multiple Comparisons of Means: Tukey Contrasts


Fit: lm(formula = FishLength ~ year, data = subset(all_fish_lengths, 
    FishLength >= 250))

Linear Hypotheses:
                 Estimate Std. Error t value Pr(>|t|)    
1995 - 1994 == 0   11.798      9.593   1.230   0.9911    
1996 - 1994 == 0   41.666      9.085   4.586    <0.01 ***
1997 - 1994 == 0  -53.227      9.030  -5.894    <0.01 ***
1998 - 1994 == 0    3.868      8.500   0.455   1.0000    
1999 - 1994 == 0  -17.762     10.356  -1.715   0.8859    
2000 - 1994 == 0   25.624      9.626   2.662   0.2698    
2001 - 1994 == 0  -12.035     11.275  -1.067   0.9976    
2002 - 1994 == 0    6.590     11.363   0.580   1.0000    
2003 - 1994 == 0    9.541      9.950   0.959   0.9991    
2004 - 1994 == 0   53.392     10.303   5.182    <0.01 ***
2005 - 1994 == 0   67.606      9.751   6.933    <0.01 ***
2006 - 1994 == 0   18.340      9.496   1.931   0.7720    
1996 - 1995 == 0   29.868      9.234   3.235   0.0630 .  
1997 - 1995 == 0  -65.025      9.180  -7.084    <0.01 ***
1998 - 1995 == 0   -7.930      8.658  -0.916   0.9995    
1999 - 1995 == 0  -29.560     10.486  -2.819   0.1895    
2000 - 1995 == 0   13.825      9.766   1.416   0.9711    
2001 - 1995 == 0  -23.833     11.395  -2.092   0.6646    
2002 - 1995 == 0   -5.209     11.482  -0.454   1.0000    
2003 - 1995 == 0   -2.257     10.085  -0.224   1.0000    
2004 - 1995 == 0   41.594     10.434   3.987    <0.01 ** 
2005 - 1995 == 0   55.808      9.889   5.643    <0.01 ***
2006 - 1995 == 0    6.542      9.638   0.679   1.0000    
1997 - 1996 == 0  -94.893      8.648 -10.973    <0.01 ***
1998 - 1996 == 0  -37.798      8.093  -4.671    <0.01 ***
1999 - 1996 == 0  -59.428     10.024  -5.928    <0.01 ***
2000 - 1996 == 0  -16.042      9.269  -1.731   0.8786    
2001 - 1996 == 0  -53.701     10.971  -4.895    <0.01 ***
2002 - 1996 == 0  -35.076     11.061  -3.171   0.0748 .  
2003 - 1996 == 0  -32.124      9.604  -3.345   0.0439 *  
2004 - 1996 == 0   11.727      9.969   1.176   0.9940    
2005 - 1996 == 0   25.940      9.398   2.760   0.2171    
2006 - 1996 == 0  -23.326      9.133  -2.554   0.3340    
1998 - 1997 == 0   57.095      8.031   7.109    <0.01 ***
1999 - 1997 == 0   35.465      9.974   3.556   0.0229 *  
2000 - 1997 == 0   78.851      9.215   8.557    <0.01 ***
2001 - 1997 == 0   41.192     10.926   3.770   0.0106 *  
2002 - 1997 == 0   59.817     11.016   5.430    <0.01 ***
2003 - 1997 == 0   62.768      9.552   6.571    <0.01 ***
2004 - 1997 == 0  106.619      9.919  10.749    <0.01 ***
2005 - 1997 == 0  120.833      9.345  12.930    <0.01 ***
2006 - 1997 == 0   71.567      9.078   7.883    <0.01 ***
1999 - 1998 == 0  -21.630      9.497  -2.278   0.5273    
2000 - 1998 == 0   21.755      8.696   2.502   0.3670    
2001 - 1998 == 0  -15.903     10.492  -1.516   0.9511    
2002 - 1998 == 0    2.721     10.586   0.257   1.0000    
2003 - 1998 == 0    5.673      9.052   0.627   1.0000    
2004 - 1998 == 0   49.524      9.439   5.247    <0.01 ***
2005 - 1998 == 0   63.738      8.834   7.215    <0.01 ***
2006 - 1998 == 0   14.472      8.551   1.692   0.8953    
2000 - 1999 == 0   43.386     10.517   4.125    <0.01 ** 
2001 - 1999 == 0    5.727     12.044   0.476   1.0000    
2002 - 1999 == 0   24.352     12.127   2.008   0.7227    
2003 - 1999 == 0   27.304     10.814   2.525   0.3510    
2004 - 1999 == 0   71.154     11.139   6.388    <0.01 ***
2005 - 1999 == 0   85.368     10.631   8.030    <0.01 ***
2006 - 1999 == 0   36.102     10.398   3.472   0.0293 *  
2001 - 2000 == 0  -37.659     11.423  -3.297   0.0521 .  
2002 - 2000 == 0  -19.034     11.510  -1.654   0.9098    
2003 - 2000 == 0  -16.082     10.117  -1.590   0.9308    
2004 - 2000 == 0   27.769     10.465   2.654   0.2735    
2005 - 2000 == 0   41.983      9.922   4.231    <0.01 ** 
2006 - 2000 == 0   -7.283      9.671  -0.753   0.9999    
2002 - 2001 == 0   18.625     12.920   1.441   0.9666    
2003 - 2001 == 0   21.576     11.697   1.845   0.8223    
2004 - 2001 == 0   65.427     11.999   5.453    <0.01 ***
2005 - 2001 == 0   79.641     11.529   6.908    <0.01 ***
2006 - 2001 == 0   30.375     11.314   2.685   0.2556    
2003 - 2002 == 0    2.952     11.782   0.251   1.0000    
2004 - 2002 == 0   46.803     12.081   3.874    <0.01 ** 
2005 - 2002 == 0   61.017     11.614   5.253    <0.01 ***
2006 - 2002 == 0   11.751     11.401   1.031   0.9983    
2004 - 2003 == 0   43.851     10.763   4.074    <0.01 ** 
2005 - 2003 == 0   58.065     10.236   5.673    <0.01 ***
2006 - 2003 == 0    8.799      9.993   0.880   0.9996    
2005 - 2004 == 0   14.214     10.580   1.344   0.9810    
2006 - 2004 == 0  -35.052     10.345  -3.388   0.0396 *  
2006 - 2005 == 0  -49.266      9.796  -5.029    <0.01 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
(Adjusted p values reported -- single-step method)
(cld(leng_tuk))
Completion with error > absepsCompletion with error > absepsCompletion with error > absepsCompletion with error > absepsCompletion with error > absepsCompletion with error > absepsCompletion with error > absepsCompletion with error > absepsCompletion with error > absepsCompletion with error > absepsCompletion with error > absepsCompletion with error > absepsCompletion with error > absepsCompletion with error > absepsCompletion with error > absepsCompletion with error > absepsCompletion with error > absepsCompletion with error > absepsCompletion with error > absepsCompletion with error > absepsCompletion with error > abseps
 1994  1995  1996  1997  1998  1999  2000  2001  2002  2003  2004  2005  2006 
 "bc"  "bd"  "df"   "a"  "bc"   "b" "cde"  "bc"  "bd"  "bc"  "ef"   "f"  "cd" 
results_len<-data.frame(year=as.factor(c(1994,  1995,  1996  ,1997 , 1998  ,1999  ,2000 , 2001 ,2002 , 2003,  2004 , 2005  ,2006 )),label=c(  "bc" , "bd",  "df"   ,"a" , "bc"  , "b" ,"cde" ,"bc" , "bd" , "bc" , "ef" ,  "f"  ,"cd" ))
all_fish_lengths  %>% filter(FishLength>=250) %>% 
group_by(year) %>% dplyr::summarise(mean=mean(FishLength),
                   difference=508-mean,#difference between mean and preferred length (managment goal)
                   n=n(),
                   sd=sd(FishLength),
                   error= qnorm(0.975)*sd/sqrt(n),
                   LCI = mean - error,
                   UCI = mean + error)->all_fish_mean_lengths
ggplot()+theme_classic()+
 geom_point(data=all_fish_mean_lengths,aes(x=year,y=mean),cex=2)+
  geom_errorbar(data=all_fish_mean_lengths,aes(x=year,y=mean,ymin=LCI,ymax=UCI))+
  labs(x="Year",y="Mean Total Length (mm)")+
  geom_hline(aes(yintercept=457),linetype="dotted")+
  geom_smooth(data=subset(all_fish_lengths,FishLength>=250),
              aes(x=as.numeric(year),y=lencat10),method="lm",cex=1,linetype="dashed",col="grey50",se=F)+
  geom_text(data=results_len,aes(x=as.numeric(year), y=all_fish_mean_lengths$UCI, label=label),fontface="bold",vjust=-.5)+
  theme(text=element_text(family = "serif",size=12),
        axis.text.x = element_text(angle = 45,hjust=.8,vjust=.8))->len_means
ggsave(len_means,file="E:/Grad School/Spring 2020/Quantitative Fisheries Analysis/Population Assessment/tiffs/len_means.tiff",dpi=500,width=8,height=6)

summary(lm(FishLength~as.numeric(year),data=subset(all_fish_lengths,FishLength>=250 )))#Multiple R-squared:  0.02115,   Adjusted R-squared:  0.02064 F-statistic: 40.93 on 1 and 1894 DF,  p-value: 1.983e-10

Call:
lm(formula = FishLength ~ as.numeric(year), data = subset(all_fish_lengths, 
    FishLength >= 250))

Residuals:
     Min       1Q   Median       3Q      Max 
-219.757  -61.795    6.823   57.613  288.297 

Coefficients:
                 Estimate Std. Error t value Pr(>|t|)    
(Intercept)      428.2817     4.0339 106.171  < 2e-16 ***
as.numeric(year)   3.4212     0.5348   6.398 1.98e-10 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 88.1 on 1894 degrees of freedom
Multiple R-squared:  0.02115,   Adjusted R-squared:  0.02064 
F-statistic: 40.93 on 1 and 1894 DF,  p-value: 1.983e-10
#creating PSD categories
all_fish_lengths %<>% mutate(psd=lencat(FishLength,breaks=psdVal("Walleye",units = "mm"),use.names=T))

Takeaways: 1. Shapiro-wilks indicated abnormal, however visual appears to fit assumption of Normality well. 2. Assuming Normality, I preceded with an one-way Analysis of Variance (ANOVA) to see if there was differences in the mean total length between years. 3. Anova indicated significant difference between years(DF 12-1936, Fvalue 17.55 ,<2e-16 ***) 4. Next, I conducted a Tukey’s pos hoc test to find which years were significantly different from one another. There were 35 combinations of years that were different, signifying high variability in the mean length between years.

Discussion: High variability in mean length led to many significant differences between years. One possible reason for high variability is low sample size. ALl years had four nets sets, except 1999 which had three. The mean number of fish caught per years was 149.9231 sd=47.87042 n=1949. Although the mean number per year was high, there are many reasons why 4 nets is not adequate to sample Walleye. This warrents discussion in the report.

Relative Abundance Calculations Before starting: All sampling events in the sampling data file (n=51) were successful in catching at least one walleye. Therefore subsequent analysis which look at a particular size category must have at least 51 sampling events. If NA’s are present, replace with a 0.

#Each subset should be 51 nets set, regardless of success
combined %>% group_by(year,Linker) %>% dplyr::summarise() ->netset_success#allnets set
combined %>% group_by(year,Linker) %>% dplyr::summarise(fish=n())%>% mutate(model="All Fish")->fishcaptured
left_join(fishcaptured,netset_success,by=c("year","Linker"))->effort_all #n = 51? YE
effort_all %<>% mutate(fish=ifelse(is.na(fish),0,fish),model=ifelse(is.na(model),"All Fish",model)) 
effort_all %>% 
  group_by(year) %>% dplyr::summarise(n=n(),
                                      fish=sum(fish),
                                      CPUE=fish/n,model="All Fish")->CPUE_all
combined %>% filter(FishLength>=250) %>%  group_by(year,Linker) %>% dplyr::summarise( fish=n()) %>% mutate(model="Stock")->fishcaptured_stock
left_join(fishcaptured_stock,netset_success,by=c("year","Linker"))->effort_stock#n = 51? YES
effort_stock %<>% mutate(fish=ifelse(is.na(fish),0,fish),model=ifelse(is.na(model),"Stock",model)) 
effort_stock %>% 
  group_by(year) %>% dplyr::summarise(n=n(),
                                      fish=sum(fish),
                                      CPUE=fish/n,model="Stock")->CPUE_stock
combined %>% filter(FishLength>=510) %>%  group_by(year,Linker) %>% dplyr::summarise( fish=n())%>% mutate(model="Preferred")->fishcaptured_pref
left_join(fishcaptured_pref,netset_success,by=c("year","Linker"))->effort_pref#n = 51? YES
effort_pref %<>% mutate(fish=ifelse(is.na(fish),0,fish),model=ifelse(is.na(model),"Preferred",model))
effort_pref %>% 
  group_by(year) %>% dplyr::summarise(n=n(),
                                      fish=sum(fish),
                                      CPUE=fish/n,model="Preferred")->CPUE_pref
combined %>% filter(FishLength<=380) %>%  group_by(year,Linker) %>% dplyr::summarise( fish=n())%>% mutate(model="Quality")->fishcaptured_qual
left_join(netset_success,fishcaptured_qual,by=c("year","Linker"))->effort_qual#n = 51? YES
effort_qual %<>% mutate(fish=ifelse(is.na(fish),0,fish),model=ifelse(is.na(model),"Quality",model))
effort_qual %>% 
  group_by(year) %>% dplyr::summarise(n=n(),
                                      fish=sum(fish),
                                      CPUE=fish/n,model="Quality")->CPUE_qual
rbind(CPUE_stock,CPUE_pref,CPUE_qual)->effort
(ggplot(data=effort)+theme_classic()+
  geom_point(aes(x=year,y=CPUE,pch=model))+
  scale_shape_manual(values = c(15,1,2,0))+
  geom_path(aes(x=year,y=CPUE,linetype=model,group=model))+
    labs(x="Year",y="CPUE (fish per net night)")+
  scale_linetype_manual(values=c("solid","dashed","dotted"))+
  scale_x_continuous(breaks = seq(1994,2006,2))->CPUE_plot)

 # ggsave(CPUE_plot,file="E:/Grad School/Spring 2020/Quantitative Fisheries Analysis/Population Assessment/tiffs/CPUE.tiff",dpi=500,width = 9,height = 6)

Takeaways:

Discussion: Abundance of Preferred-length individuals is variable during the early years of the survey, a trough occured around 10 years in to the restriction and then as been very steadily on the rise, with little variation. Something that must be looked into is the number of years which is required for individuals to reach preferred-length in this system. Additionally, poor reservoir conditions accompanied by poor recruit years may have influenced the variation seen in the early years of the regulation.

Relative Abundance stats

#visual inspection of CPUE for different size classes
ggdensity(effort_all$fish)

#negative bionomial CPUE  
#Log10 transformation
effort_all$log_fish<-(log10(effort_all$fish)+1)
effort_qual$log_fish<-(log10(effort_qual$fish)+1)
effort_stock$log_fish<-(log10(effort_stock$fish)+1)
effort_pref$log_fish<-(log10(effort_pref$fish)+1)
#Visual inspection of log CPUE for different size classes
ggdensity(effort_all$log_fish)

shapiro.test(effort_all$log_fish)

    Shapiro-Wilk normality test

data:  effort_all$log_fish
W = 0.97823, p-value = 0.4666
ggdensity(effort_qual$log_fish)

ggdensity(effort_stock$log_fish)

ggdensity(effort_pref$log_fish)

#normality not achieve for all
summary(lm(year~fish,data=effort_pref))

Call:
lm(formula = year ~ fish, data = effort_pref)

Residuals:
    Min      1Q  Median      3Q     Max 
-6.3882 -3.8882  0.3461  3.6118  5.1713 

Coefficients:
             Estimate Std. Error  t value Pr(>|t|)    
(Intercept) 1.999e+03  1.008e+00 1982.187   <2e-16 ***
fish        1.469e-01  9.068e-02    1.619    0.112    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 3.753 on 49 degrees of freedom
Multiple R-squared:  0.0508,    Adjusted R-squared:  0.03143 
F-statistic: 2.623 on 1 and 49 DF,  p-value: 0.1118
summary(lm(year~fish,data=effort_qual))

Call:
lm(formula = year ~ fish, data = effort_qual)

Residuals:
   Min     1Q Median     3Q    Max 
-6.254 -1.539 -0.254  2.392  8.166 

Coefficients:
              Estimate Std. Error  t value Pr(>|t|)    
(Intercept) 2001.39270    0.76164 2627.739   <2e-16 ***
fish          -0.14233    0.05867   -2.426    0.019 *  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 3.639 on 49 degrees of freedom
Multiple R-squared:  0.1072,    Adjusted R-squared:  0.089 
F-statistic: 5.885 on 1 and 49 DF,  p-value: 0.019
summary(lm(year~fish,data=effort_stock))

Call:
lm(formula = year ~ fish, data = effort_stock)

Residuals:
    Min      1Q  Median      3Q     Max 
-7.3208 -2.1646 -0.1996  2.7748  6.7814 

Coefficients:
              Estimate Std. Error  t value Pr(>|t|)    
(Intercept) 2002.58217    1.29171 1550.338   <2e-16 ***
fish          -0.07008    0.03239   -2.163   0.0354 *  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 3.68 on 49 degrees of freedom
Multiple R-squared:  0.08719,   Adjusted R-squared:  0.06856 
F-statistic: 4.681 on 1 and 49 DF,  p-value: 0.03541
rbind(effort_stock,effort_pref,effort_qual)->effort2
duration<-data.frame(year=unique(effort2$year),duration=c(2:14))
left_join(effort2,duration,by=c("year"))->effort2
(effort2 %>% mutate(model=factor(model,levels = c("Stock","Quality","Preferred"))) %>% 
ggplot()+theme_classic()+
  geom_point(aes(x=duration,y=log_fish),pch=1)+
  geom_smooth(aes(x=duration,y=log_fish,group=model),linetype="dashed",col="black",method = "lm",se=F)+
    labs(x="Years of Regulation ",y="log10 CPUE (fish / net)")+facet_wrap(~model)+
  theme(text = element_text(family = "serif",size = 12),
    strip.background = element_blank())+
  scale_x_continuous(breaks=seq(4,12,4))->abundance_duration_categories)
  ggsave(abundance_duration_categories,file="E:/Grad School/Spring 2020/Quantitative Fisheries Analysis/Population Assessment/tiffs/abundance_duration_categories.tiff",dpi=500,width = 9,height = 6)

  
effort %>% ggplot(aes(x=year,y=CPUE))+theme_classic()+geom_point(aes(pch=model))+geom_line(aes(group=model))

Condition

ggdensity(combined$FishLength)

ggdensity(combined$FishWeight)

wsVal(("Walleye") ,simplify=TRUE,unit="metric")->wsWA
combined %>% filter(is.na(LengthGroup)) %>% 
  mutate( logL=log10(FishLength),
          logW=log10(FishWeight),
    Ws=(10^(wsWA[["int"]]+wsWA[["slope"]]*logL)),
         Wr=FishWeight/Ws*100)->condition
ggdensity(condition$Wr)

shapiro.test(condition$Wr)

    Shapiro-Wilk normality test

data:  condition$Wr
W = 0.99609, p-value = 7.379e-05
condition$year<-as.factor(condition$year)
condition_lm<-lm(Wr~year,data=condition)
summary(lm(Wr~as.numeric(year),data=subset(condition,psd=="preferred")))

Call:
lm(formula = Wr ~ as.numeric(year), data = subset(condition, 
    psd == "preferred"))

Residuals:
    Min      1Q  Median      3Q     Max 
-43.575  -5.638  -0.637   5.897  28.174 

Coefficients:
                 Estimate Std. Error t value Pr(>|t|)    
(Intercept)       97.7692     0.9828  99.477  < 2e-16 ***
as.numeric(year)   0.4897     0.1146   4.275 2.36e-05 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 9.75 on 429 degrees of freedom
Multiple R-squared:  0.04085,   Adjusted R-squared:  0.03862 
F-statistic: 18.27 on 1 and 429 DF,  p-value: 2.361e-05
summary(condition_lm)

Call:
lm(formula = Wr ~ year, data = condition)

Residuals:
    Min      1Q  Median      3Q     Max 
-39.705  -5.302  -0.416   5.461  35.844 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept)  99.4015     0.6577 151.136  < 2e-16 ***
year1995      6.5635     0.9549   6.873 8.48e-12 ***
year1996     -0.8240     0.8924  -0.923   0.3559    
year1997     -7.0235     0.8945  -7.852 6.79e-15 ***
year1998    -11.4655     0.8424 -13.610  < 2e-16 ***
year1999     -2.0954     1.1438  -1.832   0.0671 .  
year2000      1.1543     0.9584   1.204   0.2286    
year2001     -2.7048     1.1130  -2.430   0.0152 *  
year2002      1.0816     1.1346   0.953   0.3405    
year2003      1.1279     0.9912   1.138   0.2553    
year2004      5.5812     1.0271   5.434 6.21e-08 ***
year2005      4.0983     0.9637   4.253 2.21e-05 ***
year2006      0.1176     0.9154   0.128   0.8978    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 8.423 on 1902 degrees of freedom
  (2 observations deleted due to missingness)
Multiple R-squared:  0.2876,    Adjusted R-squared:  0.2831 
F-statistic: 63.99 on 12 and 1902 DF,  p-value: < 2.2e-16
cond_tuk <- multcomp::glht(condition_lm,mcp(year="Tukey"))#no difference in age
(cld(cond_tuk))
Completion with error > absepsCompletion with error > absepsCompletion with error > absepsCompletion with error > absepsCompletion with error > absepsCompletion with error > absepsCompletion with error > absepsCompletion with error > absepsCompletion with error > absepsCompletion with error > absepsCompletion with error > absepsCompletion with error > absepsCompletion with error > absepsCompletion with error > absepsCompletion with error > absepsCompletion with error > absepsCompletion with error > abseps
1994 1995 1996 1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 
"cd"  "f" "cd"  "b"  "a" "cd" "de"  "c" "ce" "ce"  "f" "ef" "cd" 
condition %>% ggplot(aes(x=as.numeric(year),y=Wr))+theme_classic()+geom_point()+
  geom_smooth(method="lm",se=F)+facet_wrap(~psd)
conditiontable<-condition %>% filter(!is.na(Wr)) %>% group_by(year,psd) %>% dplyr::summarise(mean=mean(Wr),
                   n=n(),
                   sd=sd(Wr),
                   error= qnorm(0.975)*sd/sqrt(n),
                   LCI = mean - error,
                   UCI = mean + error)
conditiontable %<>% filter(n>1)
#looking at psd
conditiontable %>% filter(psd%in%c("preferred","quality","stock")) %>% 
ggplot(aes(x=year,y=mean))+theme_classic()+geom_hline(aes(yintercept=100),linetype="dashed",col="grey50")+
  geom_point()+geom_errorbar(aes(ymin=LCI,ymax=UCI),width=.5)+facet_wrap(~psd,ncol = 1)+
  geom_path(aes(group=psd))+labs(x="Year",y="")+
  theme(strip.background = element_blank(),
        axis.text.x = element_text(angle = 45,vjust=.5),
        axis.ticks.x = element_line())->condition_psd
#COmbined PSD categories
conditiontable_all<-condition %>% filter(!is.na(Wr),psd%in%c("preferred","quality","stock")) %>% group_by(year) %>% dplyr::summarise(mean=mean(Wr),
                   n=n(),
                   sd=sd(Wr),
                   error= qnorm(0.975)*sd/sqrt(n),
                   LCI = mean - error,
                   UCI = mean + error)
condition %>% filter(!is.na(Wr),psd%in%c("preferred","quality","stock")) %>% group_by() %>% dplyr::summarise(mean=mean(Wr))
conditiontable_all %>% 
ggplot(aes(x=year,y=mean))+theme_classic()+geom_hline(aes(yintercept=100),linetype="dashed",col="grey50")+
  geom_point()+geom_errorbar(aes(ymin=LCI,ymax=UCI),width=.5)+
  geom_path(aes())+labs(y="Mean Relative Weight (Wr)",x="Year")+
  theme(strip.background = element_blank(),
        axis.text.x = element_text(angle = 45,vjust=.5))->condition_all
ggarrange(condition_all,condition_psd,ncol=2)->condition_plot
geom_path: Each group consists of only one observation. Do you need to adjust the
group aesthetic?
 ggsave(condition_plot,file="E:/Grad School/Spring 2020/Quantitative Fisheries Analysis/Population Assessment/tiffs/condition_plot.tiff",dpi=500,width = 9,height = 6)

Age and Growth Von Bertalanffy Growth

  combined %>%filter(!is.na(Age)) %>%  dplyr::select(year,FishLength,Age:Annulus30)->age_data
#visualize data
ggplot(data=age_data,aes(y=FishLength,x=Age))+theme_classic()+geom_point()+geom_smooth(method = "loess",se=F,col="black")

#Von B Growth curve
(svTyp1 <- vbStarts(FishLength~Age,data=age_data))#start ages
$`Linf`
[1] 772.2778

$K
[1] 0.1845135

$t0
[1] -1.634973
(vbTyp <- function(age,Linf,K,t0) Linf*(1-exp(-K*(age-t0))))#making VBLF function
function(age,Linf,K,t0) Linf*(1-exp(-K*(age-t0)))
# Model Formula
(fitTyp <- nls(FishLength~vbTyp(Age,Linf,K,t0), data = age_data, start = svTyp1))
Nonlinear regression model
  model: FishLength ~ vbTyp(Age, Linf, K, t0)
   data: age_data
    Linf        K       t0 
731.1103   0.1932  -1.8463 
 residual sum-of-squares: 2064737

Number of iterations to convergence: 4 
Achieved convergence tolerance: 5.821e-07
# extract parameters from nls() object with coef()
coef(fitTyp)#linf=731.1103119   k=0.1932223  t0=-1.8462618 
       Linf           K          t0 
731.1103119   0.1932223  -1.8462618 
# fit confidence intervals with from nls() with confint()
confint(fitTyp)
Waiting for profiling to be done...
            2.5%       97.5%
Linf 703.1967490 764.8466416
K      0.1714312   0.2156038
t0    -2.0682640  -1.6471211
bootTyp <-nlsBoot(fitTyp)
headtail(bootTyp$coefboot,n=2)
           Linf         K        t0
[1,]   724.0829 0.1976146 -1.842576
[2,]   737.1911 0.1882552 -1.903502
[998,] 727.8511 0.2001721 -1.750622
[999,] 735.6324 0.1942933 -1.798989
confint(bootTyp, plot=TRUE)
         95% LCI     95% UCI
Linf 703.2287734 764.1821776
K      0.1713741   0.2157366
t0    -2.0760166  -1.6578644

summary(bootTyp)

------
Bootstrap statistics
        Estimate  Std. error
Linf 732.3180293 15.58353070
K      0.1929125  0.01110442
t0    -1.8533778  0.10537776

------
Median of bootstrap estimates and percentile confidence intervals
          Median        2.5%       97.5%
Linf 731.5494841 703.2287734 764.1821776
K      0.1931985   0.1713741   0.2157366
t0    -1.8462313  -2.0760166  -1.6578644
CIall<-confint(bootTyp)
nd <- data.frame(Age=c(0:13))
nd$Length<-predict(fitTyp,nd)
residPlot(fitTyp)
vonb  <- data.frame(vbTyp(0:13,Linf = 731.1103119, K = 0.1932223, t0 = -1.8462618 ))
colnames(vonb)[1] <- "vonb"
vonb$max<-vbTyp(0:13,Linf = 764.8466416, K = 0.2156038, t0 = -1.6471211 )
vonb$Age<-c(0:13)
vonb$min<-vbTyp(0:13,Linf = 703.1967490, K = 0.1714312, t0 =-2.0682640 )
ggplot(data=age_data,aes(y=FishLength,x=Age))+theme_classic()+geom_point(pch=1)+
  scale_y_continuous(breaks = seq(150,750,100))+
  geom_line(data=vonb,aes(x=Age,y=vonb),cex=1)+
  scale_x_continuous(breaks = seq(1,13,1))+
  labs(x="Age",y="Total Length (mm)")+
  geom_hline(aes(yintercept=457),linetype="dashed",col="grey30")+
  geom_hline(aes(yintercept=635),linetype="dashed",col="grey30")->growth_curve
ggsave(growth_curve,file="E:/Grad School/Spring 2020/Quantitative Fisheries Analysis/Population Assessment/tiffs/growth_curve.tiff",dpi=500,width = 9,height = 6)

Age-at-Length

#Length Categories
age_data %<>%  mutate(Annulus0=ifelse(is.na(Annulus1),Edge,NA)) %>% mutate(lencat10=lencat(FishLength,10)) 
#Frequency of Length cat by age, creating Matrix for proportion of age categories within lencat categories. 
alk.freq <- xtabs(~lencat10+Age,data=age_data) 
rowSums(alk.freq)
170 180 190 200 210 220 240 250 260 270 280 290 300 310 320 330 340 350 360 370 380 390 
  1   2   8   3   1   1   2   5   8  13  22  33  25  23  21  17  30  32  32  40  41  40 
400 410 420 430 440 450 460 470 480 490 500 510 520 530 540 550 560 570 580 590 600 610 
 42  59  52  53  59  56  55  66  65  52  47  49  59  54  42  27  29  29  16  15  14   7 
620 630 640 650 660 670 680 690 700 710 720 730 
 10  10   8   5   4   5   4   2   6   1   6   1 
alk <- prop.table(alk.freq,margin=1)
cc.mlr <- nnet::multinom(Age~lencat10,data=age_data)
# weights:  39 (24 variable)
initial  value 3614.013645 
iter  10 value 3038.674952
iter  20 value 2077.005888
iter  30 value 1649.602111
iter  40 value 1438.217383
iter  50 value 1409.010800
iter  60 value 1408.866317
iter  70 value 1407.389981
iter  80 value 1406.734571
iter  90 value 1406.190467
iter 100 value 1406.098352
final  value 1406.098352 
stopped after 100 iterations
lens <- seq(170,740,10)
alk.sm <- predict(cc.mlr,data.frame(lencat10=lens),type="probs")
row.names(alk.sm) <- lens
round(alk.sm,3)
        0     1     2     3     4     5     6     7     8     9    10    11    13
170 0.999 0.001 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
180 0.997 0.003 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
190 0.991 0.009 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
200 0.972 0.028 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
210 0.916 0.084 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
220 0.773 0.227 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
230 0.516 0.484 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
240 0.250 0.749 0.001 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
250 0.094 0.902 0.003 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
260 0.031 0.962 0.007 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
270 0.010 0.977 0.013 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
280 0.003 0.972 0.025 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
290 0.001 0.951 0.047 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
300 0.000 0.912 0.087 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
310 0.000 0.844 0.155 0.001 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
320 0.000 0.737 0.260 0.003 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
330 0.000 0.591 0.402 0.007 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
340 0.000 0.427 0.557 0.016 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
350 0.000 0.276 0.691 0.033 0.001 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
360 0.000 0.161 0.776 0.061 0.001 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
370 0.000 0.087 0.804 0.106 0.003 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
380 0.000 0.044 0.779 0.170 0.008 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
390 0.000 0.021 0.707 0.256 0.016 0.001 0.000 0.000 0.000 0.000 0.000 0.000 0.000
400 0.000 0.009 0.599 0.359 0.031 0.002 0.000 0.000 0.000 0.000 0.000 0.000 0.000
410 0.000 0.004 0.469 0.467 0.056 0.004 0.000 0.000 0.000 0.000 0.000 0.000 0.000
420 0.000 0.001 0.338 0.558 0.094 0.008 0.000 0.000 0.000 0.000 0.000 0.000 0.000
430 0.000 0.000 0.224 0.614 0.144 0.017 0.000 0.000 0.000 0.000 0.000 0.000 0.000
440 0.000 0.000 0.138 0.625 0.205 0.031 0.001 0.000 0.000 0.000 0.000 0.000 0.000
450 0.000 0.000 0.079 0.593 0.271 0.055 0.002 0.000 0.000 0.000 0.000 0.000 0.000
460 0.000 0.000 0.042 0.527 0.336 0.090 0.005 0.000 0.000 0.000 0.000 0.000 0.000
470 0.000 0.000 0.021 0.439 0.390 0.139 0.009 0.001 0.000 0.000 0.000 0.000 0.000
480 0.000 0.000 0.010 0.343 0.426 0.201 0.017 0.002 0.001 0.000 0.000 0.000 0.000
490 0.000 0.000 0.004 0.251 0.435 0.273 0.030 0.003 0.002 0.001 0.000 0.000 0.000
500 0.000 0.000 0.002 0.173 0.418 0.349 0.048 0.006 0.003 0.001 0.000 0.000 0.000
510 0.000 0.000 0.001 0.112 0.378 0.418 0.073 0.011 0.005 0.002 0.000 0.000 0.000
520 0.000 0.000 0.000 0.068 0.323 0.474 0.106 0.017 0.008 0.003 0.000 0.000 0.000
530 0.000 0.000 0.000 0.040 0.262 0.511 0.144 0.026 0.013 0.005 0.000 0.000 0.000
540 0.000 0.000 0.000 0.022 0.202 0.524 0.187 0.037 0.019 0.008 0.001 0.000 0.000
550 0.000 0.000 0.000 0.012 0.150 0.515 0.234 0.052 0.026 0.011 0.001 0.000 0.000
560 0.000 0.000 0.000 0.006 0.107 0.486 0.280 0.069 0.035 0.016 0.002 0.000 0.000
570 0.000 0.000 0.000 0.003 0.073 0.443 0.323 0.088 0.046 0.022 0.003 0.000 0.000
580 0.000 0.000 0.000 0.001 0.048 0.390 0.360 0.110 0.058 0.029 0.005 0.000 0.000
590 0.000 0.000 0.000 0.001 0.031 0.333 0.390 0.132 0.070 0.037 0.007 0.000 0.000
600 0.000 0.000 0.000 0.000 0.019 0.277 0.411 0.155 0.083 0.046 0.009 0.000 0.000
610 0.000 0.000 0.000 0.000 0.012 0.224 0.422 0.177 0.096 0.056 0.013 0.000 0.000
620 0.000 0.000 0.000 0.000 0.007 0.178 0.424 0.198 0.109 0.066 0.017 0.000 0.000
630 0.000 0.000 0.000 0.000 0.004 0.138 0.419 0.217 0.121 0.078 0.023 0.000 0.000
640 0.000 0.000 0.000 0.000 0.002 0.106 0.406 0.234 0.132 0.089 0.029 0.001 0.000
650 0.000 0.000 0.000 0.000 0.001 0.080 0.388 0.249 0.143 0.101 0.037 0.001 0.000
660 0.000 0.000 0.000 0.000 0.001 0.059 0.366 0.261 0.151 0.113 0.047 0.002 0.000
670 0.000 0.000 0.000 0.000 0.000 0.044 0.340 0.270 0.158 0.125 0.058 0.004 0.000
680 0.000 0.000 0.000 0.000 0.000 0.032 0.312 0.276 0.164 0.136 0.072 0.008 0.001
690 0.000 0.000 0.000 0.000 0.000 0.022 0.282 0.277 0.167 0.146 0.086 0.015 0.004
700 0.000 0.000 0.000 0.000 0.000 0.016 0.250 0.273 0.166 0.153 0.102 0.028 0.013
710 0.000 0.000 0.000 0.000 0.000 0.011 0.213 0.258 0.159 0.154 0.116 0.051 0.038
720 0.000 0.000 0.000 0.000 0.000 0.007 0.169 0.228 0.142 0.145 0.123 0.086 0.101
730 0.000 0.000 0.000 0.000 0.000 0.004 0.117 0.175 0.111 0.119 0.113 0.125 0.236
740 0.000 0.000 0.000 0.000 0.000 0.002 0.065 0.109 0.069 0.079 0.084 0.147 0.446
len.n <- xtabs(~lencat10,data=age_data)
tmp <- sweep(alk,MARGIN=1,FUN="*",STATS=len.n)
ad1 <- colSums(tmp)
round(prop.table(ad1),3)
    0     1     2     3     4     5     6     7     8     9    10    11    13 
0.012 0.128 0.196 0.223 0.164 0.160 0.069 0.023 0.013 0.008 0.003 0.001 0.001 
alkAgeDist(alk,lenA.n=rowSums(alk.freq),len.n=len.n)
alkMeanVar(alk,FishLength~lencat10+Age,data=age_data,len.n=len.n)->age_key
#Applying to all-unaged individuals. Final step will be to combined aged fish (done), unaged measured fish(A), and unaged unmeasured fish (B, LengthGroup)
#A. Make Dataframe of all unaged fish lengths (no.ages.final)
combined %>%filter(is.na(LengthGroup),is.na(Age)) %>% group_by( year,lencat10) %>% 
  dplyr::summarise(n=n())->no.ages.measured#508 measured, non-aged fish
combined %>%filter(!is.na(LengthGroup),is.na(Age)) %>%  group_by(LengthGroup,FishCount,year) %>% 
  dplyr::summarise()->no.ages.LG
full_join(no.ages.measured,no.ages.LG,by=c("year"="year","lencat10"="LengthGroup","n"="FishCount"))->no.ages.final
sum(no.ages.final$n)#508+32=540 correct
[1] 540
uncount(no.ages.final,n)->no.ages.final
no.ages.final$Age<-as.numeric(NA)
assign.ages <- alkIndivAge(alk,Age~lencat10,data=no.ages.final)
#Df of aged fish
combined %>% filter(!is.na(Age)) %>% dplyr::select(year,lencat10,Age)-> aged.fish
#combined ages all fish (n=1,949)
rbind(aged.fish,assign.ages)->all.age

Description: Here I created an age-at-length key using a proportional age-length matrix. Essentially, this matrix samples the population of aged fish I have and states the proportion of fish with a certain length category that fit into a given age category. Using this matrix I was able to create an age_length key that fit my VonB very very closely. The next step was to assign ages to fish that were not aged using the age-length matrix and procedure described by Iserman & knight (2005?). THe last step was to combine the dataframes with originally aged fish and the df with predicted ages. THhs will allow comparisons of mortality

Back Calculations

#formatting data for back-calculations
age_data %>% dplyr::select(- Annulus14:-Annulus30) %>% #delete unneeded columns 
  mutate(Annulus0=ifelse(is.na(Annulus1),Edge,NA)) %>% #presevering age 0 in new dataframe
  pivot_longer(cols = Annulus1:Annulus0,names_to = "Annuli",values_to = "radius") %>% #Format long data
  separate(Annuli,c("delete","Annuli"),"s") %>% #cleanup 
  dplyr::select(-delete) %>% #cleanup 
  filter(!is.na(radius)) %>% #cleanup
  mutate(Annuli=as.numeric(Annuli),#creating formula for Dahl Lea calculations
         dahl_lea= round(FishLength*(radius/Edge),2),
         year_at=(year-Age+Annuli),
         nat_year=year-Age)->backcalc
lm1 <- lm(dahl_lea~radius,data=backcalc)
anova(lm1)
Analysis of Variance Table

Response: dahl_lea
            Df   Sum Sq  Mean Sq F value    Pr(>F)    
radius       1 52041432 52041432  4868.2 < 2.2e-16 ***
Residuals 4859 51943571    10690                      
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
a <- coef(lm1)[1]               # get the correction factor (first coefficient in lm1)
backcalc$Fraser_lee <- a + (backcalc$FishLength-a)*(backcalc$radius/backcalc$Edge)
left_join(backcalc,duration,by=c("year"))->backcalc
backcalc %<>% mutate(era=ifelse(duration<=5,"0-5",ifelse(duration>10,"10+","5-10")))
#visuals
ggplot(data=backcalc,aes(x=year_at,y=Fraser_lee))+geom_point()+facet_wrap(~nat_year)

ggplot(data=subset(FL_sumbackcalc,Annuli!=14),aes(x=Annuli,y=mean))+theme_classic()+
  geom_hline(aes(yintercept=508))+
  geom_vline(aes(xintercept=4.3),linetype="dashed")+
  geom_hline(aes(yintercept=508))+
  geom_line(data=vonb,aes(x=Age,y=vonb),linetype="dashed",col="grey30",cex=1)+
  geom_point(col="black")+scale_x_continuous(breaks = seq(1,13,1))+
  labs(y="Mean Back-Calculated Length (mm)",x="Age")+
  geom_errorbar(aes(ymin=LCI,ymax=UCI),width=.5,col="black")
Error in subset(FL_sumbackcalc, Annuli != 14) : 
  object 'FL_sumbackcalc' not found

Takeaways: 1. No evidence for lee’s Phenonomenon occuring

Traditional, Catch-Curve Mortality Estimates Across all Years Excerise material only, do not include in report

Takeaway: 1. Catch curve analysis indicated little difference in mortality across the 3 distinct eras. This is shown in the models lm13,lm12,lm23 results and mort_plot_era. 2. Catch_curve analysis however, is likely not fitting as a key assumption is that recruitement stays consistant across all other covariates like time or location. We know that walleye can have highly variable recruitment caused by either natural variations or stocking efforts. Therefore, catch curves are likely not the most useful too to investigate the mortality of this population.

Year-Class Strength

all.age %>% mutate(yearcl=year-Age)  %>% filter(Age%in%c(1,2,3,4,5,6),yearcl%in%c(1992:2001)) %>% 
  dplyr::select(-lencat10,-duration) %>%  group_by(year,yearcl,Age) %>% dplyr::summarise(n=n(),logn=log(n))->year_class
Error in eval(lhs, parent, parent) : object 'all.age' not found
LS0tDQp0aXRsZTogIlBvcHVsYXRpb24gQXNzZXNzbWVudCINCmF1dGhvcjogIlF1aW50aW4gRGVhbiINCm91dHB1dDoNCiAgcGRmX2RvY3VtZW50OiBkZWZhdWx0DQogIGh0bWxfbm90ZWJvb2s6IGRlZmF1bHQNCi0tLQ0KKipQYWNrYWdlcyBSZXF1aXJlZCoqDQpgYGB7ciAsIG1lc3NhZ2U9RkFMU0UsIGVycm9yPUZBTFNFLGluY2x1ZGU9RkFMU0V9DQojaW5zdGFsbC5wYWNrYWdlcygiZWFzeXBhY2thZ2VzIikNCiNsaWJyYXJ5KGVhc3lwYWNrYWdlcykNCiNsaWJyYXJpZXMoImRwbHlyIiwiZ2dwbG90MiIsInBseXIiLCJzdGF0cyIsImNhciIsInRpZHlyIiwidGlkeXNlbGVjdCIsIkZTQSIsImdncHViciIsInBsb3RyaXgiLCJlbW1lYW5zIiwiTWF0Y2hpbmciLCJtYWdyaXR0ciIsIm12dG5vcm0iLCJtdWx0Y29tcCIsIm11bHRjb21wVmlldyIsIk1hdGNoaW5nIiwiTWF0cml4IiwiZm9yY2F0cyIsIm5sc3Rvb2xzIiwibWdjdiIsIm5uZXQiLCJLZW5kYWxsIikNCmBgYA0KDQoqKkRhdGEgRm9ybWF0dGluZyoqDQpgYGB7cn0NCndhbGxleWU8LXJlYWQuY3N2KCJFOi9HcmFkIFNjaG9vbC9TcHJpbmcgMjAyMC9RdWFudGl0YXRpdmUgRmlzaGVyaWVzIEFuYWx5c2lzL1BvcHVsYXRpb24gQXNzZXNzbWVudC93YWxsZXllLmNzdiIpDQpzYW1wbGluZzwtcmVhZC5jc3YoIkU6L0dyYWQgU2Nob29sL1NwcmluZyAyMDIwL1F1YW50aXRhdGl2ZSBGaXNoZXJpZXMgQW5hbHlzaXMvUG9wdWxhdGlvbiBBc3Nlc3NtZW50L21lcnJpdHNhbXBsZXMuY3N2IikNCg0KbGVmdF9qb2luKHNhbXBsaW5nLHdhbGxleWUsYnk9YygiTGlua2VyIiwiV2F0ZXJib2R5Q29kZSIsIkFyZWEiLCJNZXRob2RDb2RlIiwiU3RhdGlvbiIsIkVmZm9ydCIpKS0+Y29tYmluZWQNCg0KY29tYmluZWQgJTw+JSANCiAgdGlkeXI6OnNlcGFyYXRlKHN1cnZleWRhdGUueCwgYygibW9udGgiLCJkYXkiLCJ5ZWFyIikscmVtb3ZlPUYpICU+JSANCiAgbXV0YXRlKHllYXI9YXMubnVtZXJpYyh5ZWFyKSwNCiAgICBsZW5jYXQxMD1sZW5jYXQoRmlzaExlbmd0aCx3PTEwKSwNCiAgICAgICAgIHBzZD1sZW5jYXQoRmlzaExlbmd0aCxicmVha3M9cHNkVmFsKCJXYWxsZXllIix1bml0cyA9ICJtbSIpLHVzZS5uYW1lcz1UKSkNCmBgYA0KVGFrZWF3YXlzOiANCiAgMS4gQWxsIHNhbXBsaW5nIGV2ZW50cyB3ZXJlIHN1Y2Nlc3NmdWxsIGluIGNhcHR1cmluZyB3YWxsZXllLCB0aGVyZWZvcmUgdGhlcmUgaXMgbm8gbmVlZCB0byBhZGQgQ1BVRSBvZiAwIHRvIGFueSBzYW1wbGluZyBldmVudCBpZiBhbGwgc2l6ZXMgb2Ygd2FsbGV5ZSBhcmUgYmVpbmcgdXNlZC4gSSB3aWxsIHJlZmVyIHRvIHRoaXMgaW4gdGVoIFJlbGF0aXZlIGFidW5kYW5jZSBzZWN0aW9uLg0KDQoqKkdlbmVyYWwgU3VtbWFyeSBTdGF0aXN0aWNzKioNCmBgYHtyfQ0KI090b2xpdGhzIGNvbGxlY3RlZCBzdW1tYXJ5DQpjb21iaW5lZCAlPiUgZmlsdGVyKGlzLm5hKExlbmd0aEdyb3VwKSwhaXMubmEoQWdlKSkgJT4lIGdyb3VwX2J5KHllYXIpICU+JSBkcGx5cjo6c3VtbWFyaXNlKG49bigpKSAlPiUgc3VtbWFyaXNlKG1lYW49bWVhbihuKSxzZD1zZChuKSxuPXN1bShuKSkgI249MTQwOSwgbWVhbj0xMDggc2Q9MjQuNjUNCg0KI251bWJlciBvZiBuZXRzIHNldCA9IDUxDQpsZW5ndGgodW5pcXVlKGNvbWJpbmVkJExpbmtlcikpDQoNCiNudW1iZXIgb2YgbmV0cyBzZXQgcGVyIHllYXINCmNvbWJpbmVkICU+JSBncm91cF9ieSh5ZWFyKSAlPiUgZHBseXI6OnN1bW1hcmlzZShmaXNoPW4oKSxsZW5ndGgodW5pcXVlKExpbmtlcikpKSANCmBgYA0KICANCiAgDQoqKkdlbmVyYWwgTGVuZ3RoIEZyZXF1ZW5jeSoqDQpgYGB7cn0NCiNMZW5ndGggRnJlcSBmb3IgYWxsIHllYXJzIHRvIGRldGVybWluZSBsZW5ndGggYXQgcmVjcnVpdCBhbmQgdmlzdWFsaXplIGRhdGENCmNvbWJpbmVkICU+JSBkcGx5cjo6c2VsZWN0KExpbmtlcix5ZWFyLExlbmd0aEdyb3VwLEZpc2hDb3VudCxGaXNoTGVuZ3RoLEZpc2hXZWlnaHQsbGVuY2F0MTApLT5sZW5ndGhkYXRhDQoNCiNDb3VudCBmaXNoIGJ5IGxlbmd0aCBjYXRlZ29yeSANCmxlbmd0aGRhdGEgJT4lZmlsdGVyKGlzLm5hKExlbmd0aEdyb3VwKSkgJT4lIGdyb3VwX2J5KCBsZW5jYXQxMCkgJT4lIA0KICBkcGx5cjo6c3VtbWFyaXNlKG49bigpKS0+bm9fTGVuZ3RoR3JvdXAxIA0KDQojQ291bnQgZmlzaCBieSBsZW5ndGggY2F0ZWdvcnkgaW4gTGVuZ3RoIEdyb3VwIGNvbHVtbg0KbGVuZ3RoZGF0YSAlPiUgZ3JvdXBfYnkoTGVuZ3RoR3JvdXAsRmlzaENvdW50LHllYXIsTGlua2VyKSAlPiUgDQogIGRwbHlyOjpzdW1tYXJpc2UoKSAlPiUgIGZpbHRlcighaXMubmEoTGVuZ3RoR3JvdXApKSAtPkxlbmd0aEdyb3VwMSANCg0KI0NvbWJpbmcgZm9yIGZ1bGwgY291bnQgKHVzZSBmb3IgcGxvdHRpbmcgJiBhbmFseXNpcykNCmZ1bGxfam9pbihub19MZW5ndGhHcm91cDEsTGVuZ3RoR3JvdXAxLGJ5PWMoImxlbmNhdDEwIj0iTGVuZ3RoR3JvdXAiLCJuIj0iRmlzaENvdW50IikpLT5maXNoX2NvdW50czENCg0KI1RvdGFsIGZpc2ggQ2FwdHVyZWQNCmZpc2hfY291bnRzMSAlPiUgc3VtbWFyaXNlKG49c3VtKG4pKSAjbiA9IDE5NDkNCg0KI0dpdmluZyBlYWNoIGZpc2ggdW5pcXVlIGlkZW50aXR5IChMZW5ndGhHcm91cCkNCnVuY291bnQoTGVuZ3RoR3JvdXAxLCBGaXNoQ291bnQpLT51bmNvdW50X2xlbmd0aGdyb3VwICMgbj0zMg0KZnVsbF9qb2luKHN1YnNldChsZW5ndGhkYXRhLGlzLm5hKExlbmd0aEdyb3VwKSksdW5jb3VudF9sZW5ndGhncm91cCxieT1jKCJGaXNoTGVuZ3RoIj0iTGVuZ3RoR3JvdXAiLCJ5ZWFyIiwiTGlua2VyIikpLT5hbGxfZmlzaF9sZW5ndGhzI249MTk0OQ0KDQojTWVhbiAjIG9mIGZpc2ggY2FwdHVyZWQgcGVyIHllYXINCmFsbF9maXNoX2xlbmd0aHMgJT4lIGdyb3VwX2J5KHllYXIpICU+JSBkcGx5cjo6c3VtbWFyaXNlKG49bigpKSAlPiUgc3VtbWFyaXNlKG1lYW4obiksc2Qobiksc3VtKG4pKQ0KDQojTWVhbiBsZW5ndGggKG5vIENvdW50ZWQgZmlzaCwgbWluaW1hbCBlZmZlY3QpIG49MTk0OSwgbWVhbj00NDMuNzAxOSwgc2Q9OTcuMDY3MTENCmFsbF9maXNoX2xlbmd0aHMgJTw+JSBkcGx5cjo6c2VsZWN0KC1MZW5ndGhHcm91cCwtRmlzaENvdW50LC1sZW5jYXQxMCkgJT4lIG11dGF0ZShsZW5jYXQxMD1sZW5jYXQoRmlzaExlbmd0aCx3PTEwKSkNCmFsbF9maXNoX2xlbmd0aHMgJT4lIGdyb3VwX2J5KCkgJT4lIGRwbHlyOjpzdW1tYXJpc2Uobj1uKCksbWVhbj1tZWFuKEZpc2hMZW5ndGgpLHNkKEZpc2hMZW5ndGgpKSMxLDk0OQ0KDQojTGVuZ3RoIEZyZXEgcGxvdA0KZmlzaF9jb3VudHMxICU+JSBkcGx5cjo6c2VsZWN0KC15ZWFyLC1MaW5rZXIpICU+JSBncm91cF9ieShsZW5jYXQxMCxuKSAlPiUgZHBseXI6OnN1bW1hcmlzZSgpICU+JSANCmdncGxvdChhZXMoeD1sZW5jYXQxMCx5PW4pKSt0aGVtZV9jbGFzc2ljKCkrDQogIGdlb21fdmxpbmUoYWVzKHhpbnRlcmNlcHQ9NjM1KSxsaW5ldHlwZT0iZGFzaGVkIikrDQogIGdlb21fdmxpbmUoYWVzKHhpbnRlcmNlcHQ9NDU3KSxsaW5ldHlwZT0iZGFzaGVkIikrDQogICAgZ2VvbV9yZWN0KGFlcyh4bWluPTQ1Nyx4bWF4PTYzNSx5bWluPTAseW1heD0xMTApLGZpbGw9ImdyZXk1MCIsYWxwaGE9LjAxKSsNCiAgICBnZW9tX3JlY3QoYWVzKHhtaW49NDU3LHhtYXg9NzUwLHltaW49MCx5bWF4PTExMCksZmlsbD0iZ3JleTUwIixhbHBoYT0uMDEpKw0KICBnZW9tX2NvbChmaWxsPSJncmV5NjAiLGNvbD0iYmxhY2siLHBvc2l0aW9uID0gImRvZGdlIikrDQpzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBhbHBoYSgid2hpdGUiLCAuOCkpICArDQpnZW9tX3ZsaW5lKGFlcyh4aW50ZXJjZXB0PTQ0NCksY2V4PTEuMikrDQogIGxhYnMoeD0iVG90YWwgTGVuZ3RoIChtbSkiLHk9IkNvdW50IikrDQogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBzZXEoMCw3NTAsNTApKSsNCiAgdGhlbWUoYXhpcy5saW5lID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gInNlcmlmIixzaXplID0gMTIpKS0+YWxsX2xlbmd0aHNfaGlzdG8NCmdnc2F2ZShhbGxfbGVuZ3Roc19oaXN0byxmaWxlPSJFOi9HcmFkIFNjaG9vbC9TcHJpbmcgMjAyMC9RdWFudGl0YXRpdmUgRmlzaGVyaWVzIEFuYWx5c2lzL1BvcHVsYXRpb24gQXNzZXNzbWVudC90aWZmcy9hbGxfbGVuZ3Roc19oaXN0by50aWZmIixkcGk9NTAwLHdpZHRoID0gOSxoZWlnaHQgPSA2KQ0KYGBgDQpUYWtlYXdheXM6IA0KICAxLiBGaXJzdCwgdGhlcmUgd2VyZSBhIG51bWJlciBvZiBmaXNoIGFuZCBMSU5LRVJTIHRoYXQgdXNlZCBjb3VudHMgaW5zdGVhZCBvZiBtZWFzdXJpbmcgZWFjaCBmaXNoLiBUaGlzIG1lYW5zIHRoYXQgdG8gcGxvdCBhbmQgYW5hbHl6ZSBsZW5ndGggcHJvcGVybHksIEkgbXVzdCBjb21iaW5lZCB0aGUgdHdvIHR5cGVzIG9mIGRhdGEuDQogIDIuIFRvdGFsIGZpc2ggY2FwdHVyZWQgd2FzIDEsOTQ5LiBVc2luZyB0aGlzIG51bWJlciwgSSBtYWRlIHN1cmUgdGhlIGRhdGEgdGhhdCB3YXMgYW5hbHl6ZWQgYW5kIHBsb3QgYWx3YXlzIGhhZCBhIG49MSw5NDkuDQogIDMuIE1lYW4gdG90YWwgbGVuZ3RocyBvZiBjb21iaW5lZCBzYW1wbGluZyB5ZWFycz00NDQgc2Q9OTcuMDY3MTEuIA0KICANCg0KKipTdGF0IEFuYWx5c2lzIG9mIExlbmd0aCoqDQpIZXJlIEkgYW5hbHl6ZWQgbWVhbiBsZW5ndGhzIGFjcm9zcyB5ZWFycyBhbmQgcGxvdHRlZCBtZWFucyB3aXRoIDk1JSBDSSdzDQpgYGB7cn0NCiN0ZXN0IG9mIG5vcm1hbGl0eQ0KYWxsX2Zpc2hfbGVuZ3RocyR5ZWFyPC1hcy5mYWN0b3IoYWxsX2Zpc2hfbGVuZ3RocyR5ZWFyKSNtYWtpbmcgeWVhciBhIGZhY3RvciB0byBhbGxvdyBzdGF0IHRlc3RpbmcNCnNoYXBpcm8udGVzdChhbGxfZmlzaF9sZW5ndGhzJEZpc2hMZW5ndGgpDQooZ2dkZW5zaXR5KGFsbF9maXNoX2xlbmd0aHMkRmlzaExlbmd0aCkpI25vcm1hbGl0eSB3aWxsIGJlIGFzc3VtZWQNClN1bW1hcml6ZShhbGxfZmlzaF9sZW5ndGhzJEZpc2hMZW5ndGgpDQoNCg0KbG0oRmlzaExlbmd0aH55ZWFyLGRhdGE9c3Vic2V0KGFsbF9maXNoX2xlbmd0aHMsRmlzaExlbmd0aD49MjUwICkpLT5sbV9sZW5ndGhzX3llYXINCnN1bW1hcnkobG1fbGVuZ3Roc195ZWFyKQ0KbGVuZ190dWsgPC0gbXVsdGNvbXA6OmdsaHQobG1fbGVuZ3Roc195ZWFyLG1jcCh5ZWFyPSJUdWtleSIpKSNubyBkaWZmZXJlbmNlIGluIGFnZQ0Kc3VtbWFyeShsZW5nX3R1aykNCihjbGQobGVuZ190dWspKQ0KcmVzdWx0c19sZW48LWRhdGEuZnJhbWUoeWVhcj1hcy5mYWN0b3IoYygxOTk0LCAgMTk5NSwgIDE5OTYgICwxOTk3ICwgMTk5OCAgLDE5OTkgICwyMDAwICwgMjAwMSAsMjAwMiAsIDIwMDMsICAyMDA0ICwgMjAwNSAgLDIwMDYgKSksbGFiZWw9YyggICJiYyIgLCAiYmQiLCAgImRmIiAgICwiYSIgLCAiYmMiICAsICJiIiAsImNkZSIgLCJiYyIgLCAiYmQiICwgImJjIiAsICJlZiIgLCAgImYiICAsImNkIiApKQ0KDQphbGxfZmlzaF9sZW5ndGhzICAlPiUgZmlsdGVyKEZpc2hMZW5ndGg+PTI1MCkgJT4lIA0KZ3JvdXBfYnkoeWVhcikgJT4lIGRwbHlyOjpzdW1tYXJpc2UobWVhbj1tZWFuKEZpc2hMZW5ndGgpLA0KICAgICAgICAgICAgICAgICAgIGRpZmZlcmVuY2U9NTA4LW1lYW4sI2RpZmZlcmVuY2UgYmV0d2VlbiBtZWFuIGFuZCBwcmVmZXJyZWQgbGVuZ3RoIChtYW5hZ21lbnQgZ29hbCkNCiAgICAgICAgICAgICAgICAgICBuPW4oKSwNCiAgICAgICAgICAgICAgICAgICBzZD1zZChGaXNoTGVuZ3RoKSwNCiAgICAgICAgICAgICAgICAgICBlcnJvcj0gcW5vcm0oMC45NzUpKnNkL3NxcnQobiksDQogICAgICAgICAgICAgICAgICAgTENJID0gbWVhbiAtIGVycm9yLA0KICAgICAgICAgICAgICAgICAgIFVDSSA9IG1lYW4gKyBlcnJvciktPmFsbF9maXNoX21lYW5fbGVuZ3Rocw0KDQpnZ3Bsb3QoKSt0aGVtZV9jbGFzc2ljKCkrDQogZ2VvbV9wb2ludChkYXRhPWFsbF9maXNoX21lYW5fbGVuZ3RocyxhZXMoeD15ZWFyLHk9bWVhbiksY2V4PTIpKw0KICBnZW9tX2Vycm9yYmFyKGRhdGE9YWxsX2Zpc2hfbWVhbl9sZW5ndGhzLGFlcyh4PXllYXIseT1tZWFuLHltaW49TENJLHltYXg9VUNJKSkrDQogIGxhYnMoeD0iWWVhciIseT0iTWVhbiBUb3RhbCBMZW5ndGggKG1tKSIpKw0KICBnZW9tX2hsaW5lKGFlcyh5aW50ZXJjZXB0PTQ1NyksbGluZXR5cGU9ImRvdHRlZCIpKw0KICBnZW9tX3Ntb290aChkYXRhPXN1YnNldChhbGxfZmlzaF9sZW5ndGhzLEZpc2hMZW5ndGg+PTI1MCksDQogICAgICAgICAgICAgIGFlcyh4PWFzLm51bWVyaWMoeWVhcikseT1sZW5jYXQxMCksbWV0aG9kPSJsbSIsY2V4PTEsbGluZXR5cGU9ImRhc2hlZCIsY29sPSJncmV5NTAiLHNlPUYpKw0KICBnZW9tX3RleHQoZGF0YT1yZXN1bHRzX2xlbixhZXMoeD1hcy5udW1lcmljKHllYXIpLCB5PWFsbF9maXNoX21lYW5fbGVuZ3RocyRVQ0ksIGxhYmVsPWxhYmVsKSxmb250ZmFjZT0iYm9sZCIsdmp1c3Q9LS41KSsNCiAgdGhlbWUodGV4dD1lbGVtZW50X3RleHQoZmFtaWx5ID0gInNlcmlmIixzaXplPTEyKSwNCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSxoanVzdD0uOCx2anVzdD0uOCkpLT5sZW5fbWVhbnMNCmdnc2F2ZShsZW5fbWVhbnMsZmlsZT0iRTovR3JhZCBTY2hvb2wvU3ByaW5nIDIwMjAvUXVhbnRpdGF0aXZlIEZpc2hlcmllcyBBbmFseXNpcy9Qb3B1bGF0aW9uIEFzc2Vzc21lbnQvdGlmZnMvbGVuX21lYW5zLnRpZmYiLGRwaT01MDAsd2lkdGg9OCxoZWlnaHQ9NikNCnN1bW1hcnkobG0oRmlzaExlbmd0aH5hcy5udW1lcmljKHllYXIpLGRhdGE9c3Vic2V0KGFsbF9maXNoX2xlbmd0aHMsRmlzaExlbmd0aD49MjUwICkpKSNNdWx0aXBsZSBSLXNxdWFyZWQ6ICAwLjAyMTE1LAlBZGp1c3RlZCBSLXNxdWFyZWQ6ICAwLjAyMDY0IEYtc3RhdGlzdGljOiA0MC45MyBvbiAxIGFuZCAxODk0IERGLCAgcC12YWx1ZTogMS45ODNlLTEwDQoNCiNjcmVhdGluZyBQU0QgY2F0ZWdvcmllcw0KYWxsX2Zpc2hfbGVuZ3RocyAlPD4lIG11dGF0ZShwc2Q9bGVuY2F0KEZpc2hMZW5ndGgsYnJlYWtzPXBzZFZhbCgiV2FsbGV5ZSIsdW5pdHMgPSAibW0iKSx1c2UubmFtZXM9VCkpDQoNCmBgYA0KVGFrZWF3YXlzOg0KICAxLiBTaGFwaXJvLXdpbGtzIGluZGljYXRlZCBhYm5vcm1hbCwgaG93ZXZlciB2aXN1YWwgYXBwZWFycyB0byBmaXQgYXNzdW1wdGlvbiBvZiBOb3JtYWxpdHkgd2VsbC4NCiAgMi4gQXNzdW1pbmcgTm9ybWFsaXR5LCBJIHByZWNlZGVkIHdpdGggYW4gb25lLXdheSBBbmFseXNpcyBvZiBWYXJpYW5jZSAoQU5PVkEpIHRvIHNlZSBpZiB0aGVyZSB3YXMgZGlmZmVyZW5jZXMgaW4gdGhlIG1lYW4gdG90YWwgbGVuZ3RoIGJldHdlZW4geWVhcnMuIA0KICAzLiBBbm92YSBpbmRpY2F0ZWQgc2lnbmlmaWNhbnQgZGlmZmVyZW5jZSBiZXR3ZWVuIHllYXJzKERGIDEyLTE5MzYsIEZ2YWx1ZSAxNy41NSAsPDJlLTE2ICoqKikNCiAgNC4gTmV4dCwgSSBjb25kdWN0ZWQgYSBUdWtleSdzIHBvcyBob2MgdGVzdCB0byBmaW5kIHdoaWNoIHllYXJzIHdlcmUgc2lnbmlmaWNhbnRseSBkaWZmZXJlbnQgZnJvbSBvbmUgYW5vdGhlci4gVGhlcmUgd2VyZSAzNSBjb21iaW5hdGlvbnMgb2YgeWVhcnMgdGhhdCB3ZXJlIGRpZmZlcmVudCwgc2lnbmlmeWluZyBoaWdoIHZhcmlhYmlsaXR5IGluIHRoZSBtZWFuIGxlbmd0aCBiZXR3ZWVuIHllYXJzLiANCiAgDQogIERpc2N1c3Npb246IA0KICBIaWdoIHZhcmlhYmlsaXR5IGluIG1lYW4gbGVuZ3RoIGxlZCB0byBtYW55IHNpZ25pZmljYW50IGRpZmZlcmVuY2VzIGJldHdlZW4geWVhcnMuIE9uZSBwb3NzaWJsZSByZWFzb24gZm9yIGhpZ2ggdmFyaWFiaWxpdHkgaXMgbG93IHNhbXBsZSBzaXplLiBBTGwgeWVhcnMgaGFkICBmb3VyIG5ldHMgc2V0cywgZXhjZXB0IDE5OTkgd2hpY2ggaGFkIHRocmVlLiAgVGhlIG1lYW4gbnVtYmVyIG9mIGZpc2ggY2F1Z2h0IHBlciB5ZWFycyB3YXMgMTQ5LjkyMzEJc2Q9NDcuODcwNDIJbj0xOTQ5LiBBbHRob3VnaCB0aGUgbWVhbiBudW1iZXIgcGVyIHllYXIgd2FzIGhpZ2gsIHRoZXJlIGFyZSBtYW55IHJlYXNvbnMgd2h5IDQgbmV0cyBpcyBub3QgYWRlcXVhdGUgdG8gc2FtcGxlIFdhbGxleWUuIFRoaXMgd2FycmVudHMgZGlzY3Vzc2lvbiBpbiB0aGUgcmVwb3J0LiAJDQoNCioqUmVsYXRpdmUgQWJ1bmRhbmNlIENhbGN1bGF0aW9ucyoqDQpCZWZvcmUgc3RhcnRpbmc6IEFsbCBzYW1wbGluZyBldmVudHMgaW4gdGhlIHNhbXBsaW5nIGRhdGEgZmlsZSAobj01MSkgd2VyZSBzdWNjZXNzZnVsIGluIGNhdGNoaW5nIGF0IGxlYXN0IG9uZSB3YWxsZXllLiANClRoZXJlZm9yZSBzdWJzZXF1ZW50IGFuYWx5c2lzIHdoaWNoIGxvb2sgYXQgYSBwYXJ0aWN1bGFyIHNpemUgY2F0ZWdvcnkgbXVzdCBoYXZlIGF0IGxlYXN0IDUxIHNhbXBsaW5nIGV2ZW50cy4gDQpJZiBOQSdzIGFyZSBwcmVzZW50LCByZXBsYWNlIHdpdGggYSAwLg0KYGBge3J9DQojRWFjaCBzdWJzZXQgc2hvdWxkIGJlIDUxIG5ldHMgc2V0LCByZWdhcmRsZXNzIG9mIHN1Y2Nlc3MNCmNvbWJpbmVkICU+JSBncm91cF9ieSh5ZWFyLExpbmtlcikgJT4lIGRwbHlyOjpzdW1tYXJpc2UoKSAtPm5ldHNldF9zdWNjZXNzI2FsbG5ldHMgc2V0DQoNCmNvbWJpbmVkICU+JSBncm91cF9ieSh5ZWFyLExpbmtlcikgJT4lIGRwbHlyOjpzdW1tYXJpc2UoZmlzaD1uKCkpJT4lIG11dGF0ZShtb2RlbD0iQWxsIEZpc2giKS0+ZmlzaGNhcHR1cmVkDQpsZWZ0X2pvaW4oZmlzaGNhcHR1cmVkLG5ldHNldF9zdWNjZXNzLGJ5PWMoInllYXIiLCJMaW5rZXIiKSktPmVmZm9ydF9hbGwgI24gPSA1MT8gWUUNCmVmZm9ydF9hbGwgJTw+JSBtdXRhdGUoZmlzaD1pZmVsc2UoaXMubmEoZmlzaCksMCxmaXNoKSxtb2RlbD1pZmVsc2UoaXMubmEobW9kZWwpLCJBbGwgRmlzaCIsbW9kZWwpKSANCmVmZm9ydF9hbGwgJT4lIA0KICBncm91cF9ieSh5ZWFyKSAlPiUgZHBseXI6OnN1bW1hcmlzZShuPW4oKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlzaD1zdW0oZmlzaCksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQVUU9ZmlzaC9uLG1vZGVsPSJBbGwgRmlzaCIpLT5DUFVFX2FsbA0KDQpjb21iaW5lZCAlPiUgZmlsdGVyKEZpc2hMZW5ndGg+PTI1MCkgJT4lICBncm91cF9ieSh5ZWFyLExpbmtlcikgJT4lIGRwbHlyOjpzdW1tYXJpc2UoIGZpc2g9bigpKSAlPiUgbXV0YXRlKG1vZGVsPSJTdG9jayIpLT5maXNoY2FwdHVyZWRfc3RvY2sNCmxlZnRfam9pbihmaXNoY2FwdHVyZWRfc3RvY2ssbmV0c2V0X3N1Y2Nlc3MsYnk9YygieWVhciIsIkxpbmtlciIpKS0+ZWZmb3J0X3N0b2NrI24gPSA1MT8gWUVTDQplZmZvcnRfc3RvY2sgJTw+JSBtdXRhdGUoZmlzaD1pZmVsc2UoaXMubmEoZmlzaCksMCxmaXNoKSxtb2RlbD1pZmVsc2UoaXMubmEobW9kZWwpLCJTdG9jayIsbW9kZWwpKSANCmVmZm9ydF9zdG9jayAlPiUgDQogIGdyb3VwX2J5KHllYXIpICU+JSBkcGx5cjo6c3VtbWFyaXNlKG49bigpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXNoPXN1bShmaXNoKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BVRT1maXNoL24sbW9kZWw9IlN0b2NrIiktPkNQVUVfc3RvY2sNCg0KY29tYmluZWQgJT4lIGZpbHRlcihGaXNoTGVuZ3RoPj01MTApICU+JSAgZ3JvdXBfYnkoeWVhcixMaW5rZXIpICU+JSBkcGx5cjo6c3VtbWFyaXNlKCBmaXNoPW4oKSklPiUgbXV0YXRlKG1vZGVsPSJQcmVmZXJyZWQiKS0+ZmlzaGNhcHR1cmVkX3ByZWYNCmxlZnRfam9pbihmaXNoY2FwdHVyZWRfcHJlZixuZXRzZXRfc3VjY2VzcyxieT1jKCJ5ZWFyIiwiTGlua2VyIikpLT5lZmZvcnRfcHJlZiNuID0gNTE/IFlFUw0KZWZmb3J0X3ByZWYgJTw+JSBtdXRhdGUoZmlzaD1pZmVsc2UoaXMubmEoZmlzaCksMCxmaXNoKSxtb2RlbD1pZmVsc2UoaXMubmEobW9kZWwpLCJQcmVmZXJyZWQiLG1vZGVsKSkNCmVmZm9ydF9wcmVmICU+JSANCiAgZ3JvdXBfYnkoeWVhcikgJT4lIGRwbHlyOjpzdW1tYXJpc2Uobj1uKCksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpc2g9c3VtKGZpc2gpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUFVFPWZpc2gvbixtb2RlbD0iUHJlZmVycmVkIiktPkNQVUVfcHJlZg0KDQpjb21iaW5lZCAlPiUgZmlsdGVyKEZpc2hMZW5ndGg8PTM4MCkgJT4lICBncm91cF9ieSh5ZWFyLExpbmtlcikgJT4lIGRwbHlyOjpzdW1tYXJpc2UoIGZpc2g9bigpKSU+JSBtdXRhdGUobW9kZWw9IlF1YWxpdHkiKS0+ZmlzaGNhcHR1cmVkX3F1YWwNCmxlZnRfam9pbihuZXRzZXRfc3VjY2VzcyxmaXNoY2FwdHVyZWRfcXVhbCxieT1jKCJ5ZWFyIiwiTGlua2VyIikpLT5lZmZvcnRfcXVhbCNuID0gNTE/IFlFUw0KZWZmb3J0X3F1YWwgJTw+JSBtdXRhdGUoZmlzaD1pZmVsc2UoaXMubmEoZmlzaCksMCxmaXNoKSxtb2RlbD1pZmVsc2UoaXMubmEobW9kZWwpLCJRdWFsaXR5Iixtb2RlbCkpDQplZmZvcnRfcXVhbCAlPiUgDQogIGdyb3VwX2J5KHllYXIpICU+JSBkcGx5cjo6c3VtbWFyaXNlKG49bigpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXNoPXN1bShmaXNoKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BVRT1maXNoL24sbW9kZWw9IlF1YWxpdHkiKS0+Q1BVRV9xdWFsDQoNCnJiaW5kKENQVUVfc3RvY2ssQ1BVRV9wcmVmLENQVUVfcXVhbCktPmVmZm9ydA0KKGdncGxvdChkYXRhPWVmZm9ydCkrdGhlbWVfY2xhc3NpYygpKw0KICBnZW9tX3BvaW50KGFlcyh4PXllYXIseT1DUFVFLHBjaD1tb2RlbCkpKw0KICBzY2FsZV9zaGFwZV9tYW51YWwodmFsdWVzID0gYygxNSwxLDIsMCkpKw0KICBnZW9tX3BhdGgoYWVzKHg9eWVhcix5PUNQVUUsbGluZXR5cGU9bW9kZWwsZ3JvdXA9bW9kZWwpKSsNCiAgICBsYWJzKHg9IlllYXIiLHk9IkNQVUUgKGZpc2ggcGVyIG5ldCBuaWdodCkiKSsNCiAgc2NhbGVfbGluZXR5cGVfbWFudWFsKHZhbHVlcz1jKCJzb2xpZCIsImRhc2hlZCIsImRvdHRlZCIpKSsNCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgxOTk0LDIwMDYsMikpLT5DUFVFX3Bsb3QpDQogIyBnZ3NhdmUoQ1BVRV9wbG90LGZpbGU9IkU6L0dyYWQgU2Nob29sL1NwcmluZyAyMDIwL1F1YW50aXRhdGl2ZSBGaXNoZXJpZXMgQW5hbHlzaXMvUG9wdWxhdGlvbiBBc3Nlc3NtZW50L3RpZmZzL0NQVUUudGlmZiIsZHBpPTUwMCx3aWR0aCA9IDksaGVpZ2h0ID0gNikNCmBgYA0KVGFrZWF3YXlzOg0KDQpEaXNjdXNzaW9uOiBBYnVuZGFuY2Ugb2YgUHJlZmVycmVkLWxlbmd0aCBpbmRpdmlkdWFscyBpcyB2YXJpYWJsZSBkdXJpbmcgdGhlIGVhcmx5IHllYXJzIG9mIHRoZSBzdXJ2ZXksIGEgdHJvdWdoIG9jY3VyZWQgYXJvdW5kIDEwIHllYXJzIGluIHRvIHRoZSByZXN0cmljdGlvbiBhbmQgdGhlbiBhcyBiZWVuIHZlcnkgc3RlYWRpbHkgb24gdGhlIHJpc2UsIHdpdGggbGl0dGxlIHZhcmlhdGlvbi4gU29tZXRoaW5nIHRoYXQgbXVzdCBiZSBsb29rZWQgaW50byBpcyB0aGUgbnVtYmVyIG9mIHllYXJzIHdoaWNoIGlzIHJlcXVpcmVkIGZvciBpbmRpdmlkdWFscyB0byByZWFjaCBwcmVmZXJyZWQtbGVuZ3RoIGluIHRoaXMgc3lzdGVtLiBBZGRpdGlvbmFsbHksIHBvb3IgcmVzZXJ2b2lyIGNvbmRpdGlvbnMgYWNjb21wYW5pZWQgYnkgcG9vciByZWNydWl0IHllYXJzIG1heSBoYXZlIGluZmx1ZW5jZWQgdGhlIHZhcmlhdGlvbiBzZWVuIGluIHRoZSBlYXJseSB5ZWFycyBvZiB0aGUgcmVndWxhdGlvbi4gDQoNCioqUmVsYXRpdmUgQWJ1bmRhbmNlIHN0YXRzKioNCmBgYHtyfQ0KI3Zpc3VhbCBpbnNwZWN0aW9uIG9mIENQVUUgZm9yIGRpZmZlcmVudCBzaXplIGNsYXNzZXMNCmdnZGVuc2l0eShlZmZvcnRfYWxsJGZpc2gpDQojbmVnYXRpdmUgYmlvbm9taWFsIENQVUUgIA0KDQojTG9nMTAgdHJhbnNmb3JtYXRpb24NCmVmZm9ydF9hbGwkbG9nX2Zpc2g8LShsb2cxMChlZmZvcnRfYWxsJGZpc2gpKzEpDQplZmZvcnRfcXVhbCRsb2dfZmlzaDwtKGxvZzEwKGVmZm9ydF9xdWFsJGZpc2gpKzEpDQplZmZvcnRfc3RvY2skbG9nX2Zpc2g8LShsb2cxMChlZmZvcnRfc3RvY2skZmlzaCkrMSkNCmVmZm9ydF9wcmVmJGxvZ19maXNoPC0obG9nMTAoZWZmb3J0X3ByZWYkZmlzaCkrMSkNCg0KI1Zpc3VhbCBpbnNwZWN0aW9uIG9mIGxvZyBDUFVFIGZvciBkaWZmZXJlbnQgc2l6ZSBjbGFzc2VzDQpnZ2RlbnNpdHkoZWZmb3J0X2FsbCRsb2dfZmlzaCkNCnNoYXBpcm8udGVzdChlZmZvcnRfYWxsJGxvZ19maXNoKQ0KZ2dkZW5zaXR5KGVmZm9ydF9xdWFsJGxvZ19maXNoKQ0KZ2dkZW5zaXR5KGVmZm9ydF9zdG9jayRsb2dfZmlzaCkNCmdnZGVuc2l0eShlZmZvcnRfcHJlZiRsb2dfZmlzaCkNCg0KI25vcm1hbGl0eSBub3QgYWNoaWV2ZSBmb3IgYWxsDQpzdW1tYXJ5KGxtKHllYXJ+ZmlzaCxkYXRhPWVmZm9ydF9wcmVmKSkNCnN1bW1hcnkobG0oeWVhcn5maXNoLGRhdGE9ZWZmb3J0X3F1YWwpKQ0Kc3VtbWFyeShsbSh5ZWFyfmZpc2gsZGF0YT1lZmZvcnRfc3RvY2spKQ0KDQpyYmluZChlZmZvcnRfc3RvY2ssZWZmb3J0X3ByZWYsZWZmb3J0X3F1YWwpLT5lZmZvcnQyDQpkdXJhdGlvbjwtZGF0YS5mcmFtZSh5ZWFyPXVuaXF1ZShlZmZvcnQyJHllYXIpLGR1cmF0aW9uPWMoMjoxNCkpDQpsZWZ0X2pvaW4oZWZmb3J0MixkdXJhdGlvbixieT1jKCJ5ZWFyIikpLT5lZmZvcnQyDQooZWZmb3J0MiAlPiUgbXV0YXRlKG1vZGVsPWZhY3Rvcihtb2RlbCxsZXZlbHMgPSBjKCJTdG9jayIsIlF1YWxpdHkiLCJQcmVmZXJyZWQiKSkpICU+JSANCmdncGxvdCgpK3RoZW1lX2NsYXNzaWMoKSsNCiAgZ2VvbV9wb2ludChhZXMoeD1kdXJhdGlvbix5PWxvZ19maXNoKSxwY2g9MSkrDQogIGdlb21fc21vb3RoKGFlcyh4PWR1cmF0aW9uLHk9bG9nX2Zpc2gsZ3JvdXA9bW9kZWwpLGxpbmV0eXBlPSJkYXNoZWQiLGNvbD0iYmxhY2siLG1ldGhvZCA9ICJsbSIsc2U9RikrDQogICAgbGFicyh4PSJZZWFycyBvZiBSZWd1bGF0aW9uICIseT0ibG9nMTAgQ1BVRSAoZmlzaCAvIG5ldCkiKStmYWNldF93cmFwKH5tb2RlbCkrDQogIHRoZW1lKHRleHQgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gInNlcmlmIixzaXplID0gMTIpLA0KICAgIHN0cmlwLmJhY2tncm91bmQgPSBlbGVtZW50X2JsYW5rKCkpKw0KICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzPXNlcSg0LDEyLDQpKS0+YWJ1bmRhbmNlX2R1cmF0aW9uX2NhdGVnb3JpZXMpDQoNCiAgZ2dzYXZlKGFidW5kYW5jZV9kdXJhdGlvbl9jYXRlZ29yaWVzLGZpbGU9IkU6L0dyYWQgU2Nob29sL1NwcmluZyAyMDIwL1F1YW50aXRhdGl2ZSBGaXNoZXJpZXMgQW5hbHlzaXMvUG9wdWxhdGlvbiBBc3Nlc3NtZW50L3RpZmZzL2FidW5kYW5jZV9kdXJhdGlvbl9jYXRlZ29yaWVzLnRpZmYiLGRwaT01MDAsd2lkdGggPSA5LGhlaWdodCA9IDYpDQogIA0KZWZmb3J0ICU+JSBnZ3Bsb3QoYWVzKHg9eWVhcix5PUNQVUUpKSt0aGVtZV9jbGFzc2ljKCkrZ2VvbV9wb2ludChhZXMocGNoPW1vZGVsKSkrZ2VvbV9saW5lKGFlcyhncm91cD1tb2RlbCkpDQoNCg0KYGBgDQoNCg0KKipDb25kaXRpb24qKg0KYGBge3J9DQpnZ2RlbnNpdHkoY29tYmluZWQkRmlzaExlbmd0aCkNCmdnZGVuc2l0eShjb21iaW5lZCRGaXNoV2VpZ2h0KQ0KDQp3c1ZhbCgoIldhbGxleWUiKSAsc2ltcGxpZnk9VFJVRSx1bml0PSJtZXRyaWMiKS0+d3NXQQ0KY29tYmluZWQgJT4lIGZpbHRlcihpcy5uYShMZW5ndGhHcm91cCkpICU+JSANCiAgbXV0YXRlKCBsb2dMPWxvZzEwKEZpc2hMZW5ndGgpLA0KICAgICAgICAgIGxvZ1c9bG9nMTAoRmlzaFdlaWdodCksDQogICAgV3M9KDEwXih3c1dBW1siaW50Il1dK3dzV0FbWyJzbG9wZSJdXSpsb2dMKSksDQogICAgICAgICBXcj1GaXNoV2VpZ2h0L1dzKjEwMCktPmNvbmRpdGlvbg0KDQpnZ2RlbnNpdHkoY29uZGl0aW9uJFdyKQ0Kc2hhcGlyby50ZXN0KGNvbmRpdGlvbiRXcikNCmNvbmRpdGlvbiR5ZWFyPC1hcy5mYWN0b3IoY29uZGl0aW9uJHllYXIpDQpjb25kaXRpb25fbG08LWxtKFdyfnllYXIsZGF0YT1jb25kaXRpb24pDQpzdW1tYXJ5KGxtKFdyfmFzLm51bWVyaWMoeWVhciksZGF0YT1zdWJzZXQoY29uZGl0aW9uLHBzZD09InByZWZlcnJlZCIpKSkNCnN1bW1hcnkoY29uZGl0aW9uX2xtKQ0KY29uZF90dWsgPC0gbXVsdGNvbXA6OmdsaHQoY29uZGl0aW9uX2xtLG1jcCh5ZWFyPSJUdWtleSIpKSNubyBkaWZmZXJlbmNlIGluIGFnZQ0KKGNsZChjb25kX3R1aykpDQoNCmNvbmRpdGlvbiAlPiUgZ2dwbG90KGFlcyh4PWFzLm51bWVyaWMoeWVhcikseT1XcikpK3RoZW1lX2NsYXNzaWMoKStnZW9tX3BvaW50KCkrDQogIGdlb21fc21vb3RoKG1ldGhvZD0ibG0iLHNlPUYpK2ZhY2V0X3dyYXAofnBzZCkNCg0KY29uZGl0aW9udGFibGU8LWNvbmRpdGlvbiAlPiUgZmlsdGVyKCFpcy5uYShXcikpICU+JSBncm91cF9ieSh5ZWFyLHBzZCkgJT4lIGRwbHlyOjpzdW1tYXJpc2UobWVhbj1tZWFuKFdyKSwNCiAgICAgICAgICAgICAgICAgICBuPW4oKSwNCiAgICAgICAgICAgICAgICAgICBzZD1zZChXciksDQogICAgICAgICAgICAgICAgICAgZXJyb3I9IHFub3JtKDAuOTc1KSpzZC9zcXJ0KG4pLA0KICAgICAgICAgICAgICAgICAgIExDSSA9IG1lYW4gLSBlcnJvciwNCiAgICAgICAgICAgICAgICAgICBVQ0kgPSBtZWFuICsgZXJyb3IpDQpjb25kaXRpb250YWJsZSAlPD4lIGZpbHRlcihuPjEpDQoNCiNsb29raW5nIGF0IHBzZA0KY29uZGl0aW9udGFibGUgJT4lIGZpbHRlcihwc2QlaW4lYygicHJlZmVycmVkIiwicXVhbGl0eSIsInN0b2NrIikpICU+JSANCmdncGxvdChhZXMoeD15ZWFyLHk9bWVhbikpK3RoZW1lX2NsYXNzaWMoKStnZW9tX2hsaW5lKGFlcyh5aW50ZXJjZXB0PTEwMCksbGluZXR5cGU9ImRhc2hlZCIsY29sPSJncmV5NTAiKSsNCiAgZ2VvbV9wb2ludCgpK2dlb21fZXJyb3JiYXIoYWVzKHltaW49TENJLHltYXg9VUNJKSx3aWR0aD0uNSkrZmFjZXRfd3JhcCh+cHNkLG5jb2wgPSAxKSsNCiAgZ2VvbV9wYXRoKGFlcyhncm91cD1wc2QpKStsYWJzKHg9IlllYXIiLHk9IiIpKw0KICB0aGVtZShzdHJpcC5iYWNrZ3JvdW5kID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LHZqdXN0PS41KSwNCiAgICAgICAgYXhpcy50aWNrcy54ID0gZWxlbWVudF9saW5lKCkpLT5jb25kaXRpb25fcHNkDQoNCiNDT21iaW5lZCBQU0QgY2F0ZWdvcmllcw0KY29uZGl0aW9udGFibGVfYWxsPC1jb25kaXRpb24gJT4lIGZpbHRlcighaXMubmEoV3IpLHBzZCVpbiVjKCJwcmVmZXJyZWQiLCJxdWFsaXR5Iiwic3RvY2siKSkgJT4lIGdyb3VwX2J5KHllYXIpICU+JSBkcGx5cjo6c3VtbWFyaXNlKG1lYW49bWVhbihXciksDQogICAgICAgICAgICAgICAgICAgbj1uKCksDQogICAgICAgICAgICAgICAgICAgc2Q9c2QoV3IpLA0KICAgICAgICAgICAgICAgICAgIGVycm9yPSBxbm9ybSgwLjk3NSkqc2Qvc3FydChuKSwNCiAgICAgICAgICAgICAgICAgICBMQ0kgPSBtZWFuIC0gZXJyb3IsDQogICAgICAgICAgICAgICAgICAgVUNJID0gbWVhbiArIGVycm9yKQ0KY29uZGl0aW9uICU+JSBmaWx0ZXIoIWlzLm5hKFdyKSxwc2QlaW4lYygicHJlZmVycmVkIiwicXVhbGl0eSIsInN0b2NrIikpICU+JSBncm91cF9ieSgpICU+JSBkcGx5cjo6c3VtbWFyaXNlKG1lYW49bWVhbihXcikpDQpjb25kaXRpb250YWJsZV9hbGwgJT4lIA0KZ2dwbG90KGFlcyh4PXllYXIseT1tZWFuKSkrdGhlbWVfY2xhc3NpYygpK2dlb21faGxpbmUoYWVzKHlpbnRlcmNlcHQ9MTAwKSxsaW5ldHlwZT0iZGFzaGVkIixjb2w9ImdyZXk1MCIpKw0KICBnZW9tX3BvaW50KCkrZ2VvbV9lcnJvcmJhcihhZXMoeW1pbj1MQ0kseW1heD1VQ0kpLHdpZHRoPS41KSsNCiAgZ2VvbV9wYXRoKGFlcygpKStsYWJzKHk9Ik1lYW4gUmVsYXRpdmUgV2VpZ2h0IChXcikiLHg9IlllYXIiKSsNCiAgdGhlbWUoc3RyaXAuYmFja2dyb3VuZCA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSx2anVzdD0uNSkpLT5jb25kaXRpb25fYWxsDQpnZ2FycmFuZ2UoY29uZGl0aW9uX2FsbCxjb25kaXRpb25fcHNkLG5jb2w9MiktPmNvbmRpdGlvbl9wbG90DQogZ2dzYXZlKGNvbmRpdGlvbl9wbG90LGZpbGU9IkU6L0dyYWQgU2Nob29sL1NwcmluZyAyMDIwL1F1YW50aXRhdGl2ZSBGaXNoZXJpZXMgQW5hbHlzaXMvUG9wdWxhdGlvbiBBc3Nlc3NtZW50L3RpZmZzL2NvbmRpdGlvbl9wbG90LnRpZmYiLGRwaT01MDAsd2lkdGggPSA5LGhlaWdodCA9IDYpDQoNCg0KYGBgDQoNCg0KKipBZ2UgYW5kIEdyb3d0aCoqDQogICpWb24gQmVydGFsYW5mZnkgR3Jvd3RoKg0KYGBge3J9DQogIGNvbWJpbmVkICU+JWZpbHRlcighaXMubmEoQWdlKSkgJT4lICBkcGx5cjo6c2VsZWN0KHllYXIsRmlzaExlbmd0aCxBZ2U6QW5udWx1czMwKS0+YWdlX2RhdGENCiN2aXN1YWxpemUgZGF0YQ0KZ2dwbG90KGRhdGE9YWdlX2RhdGEsYWVzKHk9RmlzaExlbmd0aCx4PUFnZSkpK3RoZW1lX2NsYXNzaWMoKStnZW9tX3BvaW50KCkrZ2VvbV9zbW9vdGgobWV0aG9kID0gImxvZXNzIixzZT1GLGNvbD0iYmxhY2siKQ0KDQojVm9uIEIgR3Jvd3RoIGN1cnZlDQooc3ZUeXAxIDwtIHZiU3RhcnRzKEZpc2hMZW5ndGh+QWdlLGRhdGE9YWdlX2RhdGEpKSNzdGFydCBhZ2VzDQoodmJUeXAgPC0gZnVuY3Rpb24oYWdlLExpbmYsSyx0MCkgTGluZiooMS1leHAoLUsqKGFnZS10MCkpKSkjbWFraW5nIFZCTEYgZnVuY3Rpb24NCg0KIyBNb2RlbCBGb3JtdWxhDQooZml0VHlwIDwtIG5scyhGaXNoTGVuZ3RofnZiVHlwKEFnZSxMaW5mLEssdDApLCBkYXRhID0gYWdlX2RhdGEsIHN0YXJ0ID0gc3ZUeXAxKSkNCg0KIyBleHRyYWN0IHBhcmFtZXRlcnMgZnJvbSBubHMoKSBvYmplY3Qgd2l0aCBjb2VmKCkNCmNvZWYoZml0VHlwKSNsaW5mPTczMS4xMTAzMTE5ICAgaz0wLjE5MzIyMjMgIHQwPS0xLjg0NjI2MTggDQoNCiMgZml0IGNvbmZpZGVuY2UgaW50ZXJ2YWxzIHdpdGggZnJvbSBubHMoKSB3aXRoIGNvbmZpbnQoKQ0KY29uZmludChmaXRUeXApDQoNCmJvb3RUeXAgPC1ubHNCb290KGZpdFR5cCkNCmhlYWR0YWlsKGJvb3RUeXAkY29lZmJvb3Qsbj0yKQ0KY29uZmludChib290VHlwLCBwbG90PVRSVUUpDQpzdW1tYXJ5KGJvb3RUeXApDQpDSWFsbDwtY29uZmludChib290VHlwKQ0KDQpuZCA8LSBkYXRhLmZyYW1lKEFnZT1jKDA6MTMpKQ0KbmQkTGVuZ3RoPC1wcmVkaWN0KGZpdFR5cCxuZCkNCnJlc2lkUGxvdChmaXRUeXApDQoNCnZvbmIgIDwtIGRhdGEuZnJhbWUodmJUeXAoMDoxMyxMaW5mID0gNzMxLjExMDMxMTksIEsgPSAwLjE5MzIyMjMsIHQwID0gLTEuODQ2MjYxOCApKQ0KY29sbmFtZXModm9uYilbMV0gPC0gInZvbmIiDQp2b25iJG1heDwtdmJUeXAoMDoxMyxMaW5mID0gNzY0Ljg0NjY0MTYsIEsgPSAwLjIxNTYwMzgsIHQwID0gLTEuNjQ3MTIxMSApDQp2b25iJEFnZTwtYygwOjEzKQ0Kdm9uYiRtaW48LXZiVHlwKDA6MTMsTGluZiA9IDcwMy4xOTY3NDkwLCBLID0gMC4xNzE0MzEyLCB0MCA9LTIuMDY4MjY0MCApDQoNCmdncGxvdChkYXRhPWFnZV9kYXRhLGFlcyh5PUZpc2hMZW5ndGgseD1BZ2UpKSt0aGVtZV9jbGFzc2ljKCkrZ2VvbV9wb2ludChwY2g9MSkrDQogIHNjYWxlX3lfY29udGludW91cyhicmVha3MgPSBzZXEoMTUwLDc1MCwxMDApKSsNCiAgZ2VvbV9saW5lKGRhdGE9dm9uYixhZXMoeD1BZ2UseT12b25iKSxjZXg9MSkrDQogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBzZXEoMSwxMywxKSkrDQogIGxhYnMoeD0iQWdlIix5PSJUb3RhbCBMZW5ndGggKG1tKSIpKw0KICBnZW9tX2hsaW5lKGFlcyh5aW50ZXJjZXB0PTQ1NyksbGluZXR5cGU9ImRhc2hlZCIsY29sPSJncmV5MzAiKSsNCiAgZ2VvbV9obGluZShhZXMoeWludGVyY2VwdD02MzUpLGxpbmV0eXBlPSJkYXNoZWQiLGNvbD0iZ3JleTMwIiktPmdyb3d0aF9jdXJ2ZQ0KZ2dzYXZlKGdyb3d0aF9jdXJ2ZSxmaWxlPSJFOi9HcmFkIFNjaG9vbC9TcHJpbmcgMjAyMC9RdWFudGl0YXRpdmUgRmlzaGVyaWVzIEFuYWx5c2lzL1BvcHVsYXRpb24gQXNzZXNzbWVudC90aWZmcy9ncm93dGhfY3VydmUudGlmZiIsZHBpPTUwMCx3aWR0aCA9IDksaGVpZ2h0ID0gNikNCg0KDQpgYGANCg0KICAqKkFnZS1hdC1MZW5ndGgqKg0KYGBge3J9DQojTGVuZ3RoIENhdGVnb3JpZXMNCmFnZV9kYXRhICU8PiUgIG11dGF0ZShBbm51bHVzMD1pZmVsc2UoaXMubmEoQW5udWx1czEpLEVkZ2UsTkEpKSAlPiUgbXV0YXRlKGxlbmNhdDEwPWxlbmNhdChGaXNoTGVuZ3RoLDEwKSkgDQoNCiNGcmVxdWVuY3kgb2YgTGVuZ3RoIGNhdCBieSBhZ2UsIGNyZWF0aW5nIE1hdHJpeCBmb3IgcHJvcG9ydGlvbiBvZiBhZ2UgY2F0ZWdvcmllcyB3aXRoaW4gbGVuY2F0IGNhdGVnb3JpZXMuIA0KYWxrLmZyZXEgPC0geHRhYnMofmxlbmNhdDEwK0FnZSxkYXRhPWFnZV9kYXRhKSANCnJvd1N1bXMoYWxrLmZyZXEpDQphbGsgPC0gcHJvcC50YWJsZShhbGsuZnJlcSxtYXJnaW49MSkNCmNjLm1sciA8LSBubmV0OjptdWx0aW5vbShBZ2V+bGVuY2F0MTAsZGF0YT1hZ2VfZGF0YSkNCmxlbnMgPC0gc2VxKDE3MCw3NDAsMTApDQphbGsuc20gPC0gcHJlZGljdChjYy5tbHIsZGF0YS5mcmFtZShsZW5jYXQxMD1sZW5zKSx0eXBlPSJwcm9icyIpDQpyb3cubmFtZXMoYWxrLnNtKSA8LSBsZW5zDQpyb3VuZChhbGsuc20sMykNCmxlbi5uIDwtIHh0YWJzKH5sZW5jYXQxMCxkYXRhPWFnZV9kYXRhKQ0KdG1wIDwtIHN3ZWVwKGFsayxNQVJHSU49MSxGVU49IioiLFNUQVRTPWxlbi5uKQ0KYWQxIDwtIGNvbFN1bXModG1wKQ0Kcm91bmQocHJvcC50YWJsZShhZDEpLDMpDQphbGtBZ2VEaXN0KGFsayxsZW5BLm49cm93U3VtcyhhbGsuZnJlcSksbGVuLm49bGVuLm4pDQphbGtNZWFuVmFyKGFsayxGaXNoTGVuZ3RofmxlbmNhdDEwK0FnZSxkYXRhPWFnZV9kYXRhLGxlbi5uPWxlbi5uKS0+YWdlX2tleQ0KDQojQXBwbHlpbmcgdG8gYWxsLXVuYWdlZCBpbmRpdmlkdWFscy4gRmluYWwgc3RlcCB3aWxsIGJlIHRvIGNvbWJpbmVkIGFnZWQgZmlzaCAoZG9uZSksIHVuYWdlZCBtZWFzdXJlZCBmaXNoKEEpLCBhbmQgdW5hZ2VkIHVubWVhc3VyZWQgZmlzaCAoQiwgTGVuZ3RoR3JvdXApDQoNCiNBLiBNYWtlIERhdGFmcmFtZSBvZiBhbGwgdW5hZ2VkIGZpc2ggbGVuZ3RocyAobm8uYWdlcy5maW5hbCkNCmNvbWJpbmVkICU+JWZpbHRlcihpcy5uYShMZW5ndGhHcm91cCksaXMubmEoQWdlKSkgJT4lIGdyb3VwX2J5KCB5ZWFyLGxlbmNhdDEwKSAlPiUgDQogIGRwbHlyOjpzdW1tYXJpc2Uobj1uKCkpLT5uby5hZ2VzLm1lYXN1cmVkIzUwOCBtZWFzdXJlZCwgbm9uLWFnZWQgZmlzaA0KDQpjb21iaW5lZCAlPiVmaWx0ZXIoIWlzLm5hKExlbmd0aEdyb3VwKSxpcy5uYShBZ2UpKSAlPiUgIGdyb3VwX2J5KExlbmd0aEdyb3VwLEZpc2hDb3VudCx5ZWFyKSAlPiUgDQogIGRwbHlyOjpzdW1tYXJpc2UoKS0+bm8uYWdlcy5MRw0KDQpmdWxsX2pvaW4obm8uYWdlcy5tZWFzdXJlZCxuby5hZ2VzLkxHLGJ5PWMoInllYXIiPSJ5ZWFyIiwibGVuY2F0MTAiPSJMZW5ndGhHcm91cCIsIm4iPSJGaXNoQ291bnQiKSktPm5vLmFnZXMuZmluYWwNCnN1bShuby5hZ2VzLmZpbmFsJG4pIzUwOCszMj01NDAgY29ycmVjdA0KdW5jb3VudChuby5hZ2VzLmZpbmFsLG4pLT5uby5hZ2VzLmZpbmFsDQpuby5hZ2VzLmZpbmFsJEFnZTwtYXMubnVtZXJpYyhOQSkNCmFzc2lnbi5hZ2VzIDwtIGFsa0luZGl2QWdlKGFsayxBZ2V+bGVuY2F0MTAsZGF0YT1uby5hZ2VzLmZpbmFsKQ0KDQojRGYgb2YgYWdlZCBmaXNoDQpjb21iaW5lZCAlPiUgZmlsdGVyKCFpcy5uYShBZ2UpKSAlPiUgZHBseXI6OnNlbGVjdCh5ZWFyLGxlbmNhdDEwLEFnZSktPiBhZ2VkLmZpc2gNCiNjb21iaW5lZCBhZ2VzIGFsbCBmaXNoIChuPTEsOTQ5KQ0KcmJpbmQoYWdlZC5maXNoLGFzc2lnbi5hZ2VzKS0+YWxsLmFnZQ0KYGBgDQpEZXNjcmlwdGlvbjogDQogIEhlcmUgSSBjcmVhdGVkIGFuIGFnZS1hdC1sZW5ndGgga2V5IHVzaW5nIGEgcHJvcG9ydGlvbmFsIGFnZS1sZW5ndGggbWF0cml4LiBFc3NlbnRpYWxseSwgdGhpcyBtYXRyaXggc2FtcGxlcyB0aGUgcG9wdWxhdGlvbiBvZiBhZ2VkIGZpc2ggSSBoYXZlIGFuZCBzdGF0ZXMgdGhlIHByb3BvcnRpb24gb2YgZmlzaCB3aXRoIGEgY2VydGFpbiBsZW5ndGggY2F0ZWdvcnkgdGhhdCBmaXQgaW50byBhIGdpdmVuIGFnZSBjYXRlZ29yeS4gVXNpbmcgdGhpcyBtYXRyaXggSSB3YXMgYWJsZSB0byBjcmVhdGUgYW4gYWdlX2xlbmd0aCBrZXkgdGhhdCBmaXQgbXkgVm9uQiB2ZXJ5IHZlcnkgY2xvc2VseS4gVGhlIG5leHQgc3RlcCB3YXMgdG8gYXNzaWduIGFnZXMgdG8gZmlzaCB0aGF0IHdlcmUgbm90IGFnZWQgdXNpbmcgdGhlIGFnZS1sZW5ndGggbWF0cml4IGFuZCBwcm9jZWR1cmUgZGVzY3JpYmVkIGJ5IElzZXJtYW4gJiBrbmlnaHQgKDIwMDU/KS4gVEhlIGxhc3Qgc3RlcCB3YXMgdG8gY29tYmluZSB0aGUgZGF0YWZyYW1lcyB3aXRoIG9yaWdpbmFsbHkgYWdlZCBmaXNoIGFuZCB0aGUgZGYgd2l0aCBwcmVkaWN0ZWQgYWdlcy4gVEhocyB3aWxsIGFsbG93IGNvbXBhcmlzb25zIG9mIG1vcnRhbGl0eQ0KDQoNCiAgKipCYWNrIENhbGN1bGF0aW9ucyoqDQpgYGB7cn0NCiNmb3JtYXR0aW5nIGRhdGEgZm9yIGJhY2stY2FsY3VsYXRpb25zDQphZ2VfZGF0YSAlPiUgZHBseXI6OnNlbGVjdCgtIEFubnVsdXMxNDotQW5udWx1czMwKSAlPiUgI2RlbGV0ZSB1bm5lZWRlZCBjb2x1bW5zIA0KICBtdXRhdGUoQW5udWx1czA9aWZlbHNlKGlzLm5hKEFubnVsdXMxKSxFZGdlLE5BKSkgJT4lICNwcmVzZXZlcmluZyBhZ2UgMCBpbiBuZXcgZGF0YWZyYW1lDQogIHBpdm90X2xvbmdlcihjb2xzID0gQW5udWx1czE6QW5udWx1czAsbmFtZXNfdG8gPSAiQW5udWxpIix2YWx1ZXNfdG8gPSAicmFkaXVzIikgJT4lICNGb3JtYXQgbG9uZyBkYXRhDQogIHNlcGFyYXRlKEFubnVsaSxjKCJkZWxldGUiLCJBbm51bGkiKSwicyIpICU+JSAjY2xlYW51cCANCiAgZHBseXI6OnNlbGVjdCgtZGVsZXRlKSAlPiUgI2NsZWFudXAgDQogIGZpbHRlcighaXMubmEocmFkaXVzKSkgJT4lICNjbGVhbnVwDQogIG11dGF0ZShBbm51bGk9YXMubnVtZXJpYyhBbm51bGkpLCNjcmVhdGluZyBmb3JtdWxhIGZvciBEYWhsIExlYSBjYWxjdWxhdGlvbnMNCiAgICAgICAgIGRhaGxfbGVhPSByb3VuZChGaXNoTGVuZ3RoKihyYWRpdXMvRWRnZSksMiksDQogICAgICAgICB5ZWFyX2F0PSh5ZWFyLUFnZStBbm51bGkpLA0KICAgICAgICAgbmF0X3llYXI9eWVhci1BZ2UpLT5iYWNrY2FsYw0KbG0xIDwtIGxtKGRhaGxfbGVhfnJhZGl1cyxkYXRhPWJhY2tjYWxjKQ0KYW5vdmEobG0xKQ0KYSA8LSBjb2VmKGxtMSlbMV0gICAgICAgICAgICAgICAjIGdldCB0aGUgY29ycmVjdGlvbiBmYWN0b3IgKGZpcnN0IGNvZWZmaWNpZW50IGluIGxtMSkNCmJhY2tjYWxjJEZyYXNlcl9sZWUgPC0gYSArIChiYWNrY2FsYyRGaXNoTGVuZ3RoLWEpKihiYWNrY2FsYyRyYWRpdXMvYmFja2NhbGMkRWRnZSkNCmxlZnRfam9pbihiYWNrY2FsYyxkdXJhdGlvbixieT1jKCJ5ZWFyIikpLT5iYWNrY2FsYw0KYmFja2NhbGMgJTw+JSBtdXRhdGUoZXJhPWlmZWxzZShkdXJhdGlvbjw9NSwiMC01IixpZmVsc2UoZHVyYXRpb24+MTAsIjEwKyIsIjUtMTAiKSkpDQoNCiN2aXN1YWxzDQpnZ3Bsb3QoZGF0YT1iYWNrY2FsYyxhZXMoeD15ZWFyX2F0LHk9RnJhc2VyX2xlZSkpK2dlb21fcG9pbnQoKStmYWNldF93cmFwKH5uYXRfeWVhcikNCg0KZ2dwbG90KGRhdGE9c3Vic2V0KEZMX3N1bWJhY2tjYWxjLEFubnVsaSE9MTQpLGFlcyh4PUFubnVsaSx5PW1lYW4pKSt0aGVtZV9jbGFzc2ljKCkrDQogIGdlb21faGxpbmUoYWVzKHlpbnRlcmNlcHQ9NTA4KSkrDQogIGdlb21fdmxpbmUoYWVzKHhpbnRlcmNlcHQ9NC4zKSxsaW5ldHlwZT0iZGFzaGVkIikrDQogIGdlb21faGxpbmUoYWVzKHlpbnRlcmNlcHQ9NTA4KSkrDQogIGdlb21fbGluZShkYXRhPXZvbmIsYWVzKHg9QWdlLHk9dm9uYiksbGluZXR5cGU9ImRhc2hlZCIsY29sPSJncmV5MzAiLGNleD0xKSsNCiAgZ2VvbV9wb2ludChjb2w9ImJsYWNrIikrc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgxLDEzLDEpKSsNCiAgbGFicyh5PSJNZWFuIEJhY2stQ2FsY3VsYXRlZCBMZW5ndGggKG1tKSIseD0iQWdlIikrDQogIGdlb21fZXJyb3JiYXIoYWVzKHltaW49TENJLHltYXg9VUNJKSx3aWR0aD0uNSxjb2w9ImJsYWNrIikNCg0KI2xvb2tpbmcgZm9yIExlZSdzIFBoZW5vbi4uLg0KYmFja2NhbGMgJT4lIGZpbHRlcihBbm51bGk9PTEpJT4lIGRwbHlyOjpzZWxlY3QobmF0X3llYXIsRnJhc2VyX2xlZSkgLT5sZWVzcCANCiAgc3VtbWFyeShsbShGcmFzZXJfbGVlfm5hdF95ZWFyLGRhdGE9bGVlc3ApKQ0KICBnZ3Bsb3QoZGF0YT1sZWVzcCxhZXMoeD1uYXRfeWVhcix5PUZyYXNlcl9sZWUpKSt0aGVtZV9jbGFzc2ljKCkrZ2VvbV9wb2ludCgpK2dlb21fc21vb3RoKG1ldGhvZD0ibG0iLHNlPUYsY29sPSJibGFjayIpDQogIGxlZXNwICU+JSBncm91cF9ieShuYXRfeWVhcikgJT4lICBkcGx5cjo6c3VtbWFyaXNlKG49bigpLG1lYW49bWVhbihGcmFzZXJfbGVlKSxzZD1zZChGcmFzZXJfbGVlKSxlcnJvcj0gcW5vcm0oMC45NzUpKnNkL3NxcnQobiksTENJID0gbWVhbiAtIGVycm9yLFVDSSA9IG1lYW4gKyBlcnJvcikgJT4lIA0KICAgIGdncGxvdChhZXMoeD1uYXRfeWVhcix5PW1lYW4pKSt0aGVtZV9jbGFzc2ljKCkrZ2VvbV9wb2ludChjZXg9MS41KStnZW9tX2Vycm9yYmFyKGFlcyh5bWluPUxDSSx5bWF4PVVDSSksd2lkdGg9LjUpKw0KICAgIGdlb21fc21vb3RoKGRhdGE9bGVlc3AsYWVzKHg9bmF0X3llYXIseT1GcmFzZXJfbGVlKSxtZXRob2Q9ImxtIixzZT1GLGNvbD0iYmxhY2siKStsYWJzKHg9IlllYXItQ2xhc3MiLHk9Ik1lYW4gQWdlLWF0LUxlbmd0aCAobW0pIikNCg0KDQpgYGANClRha2Vhd2F5czogDQogIDEuIE5vIGV2aWRlbmNlIGZvciBsZWUncyBQaGVub25vbWVub24gb2NjdXJpbmcNCg0KDQoqKlRyYWRpdGlvbmFsLCBDYXRjaC1DdXJ2ZSBNb3J0YWxpdHkgRXN0aW1hdGVzIEFjcm9zcyBhbGwgWWVhcnMqKg0KICAqKkV4Y2VyaXNlIG1hdGVyaWFsIG9ubHksIGRvIG5vdCBpbmNsdWRlIGluIHJlcG9ydCoqDQpgYGB7cn0NCiN1c2VkIGZvciBmaW5kaW5nIHRoZSBnZWFyLXJlY3J1aXRtZW50IGFnZSAofjMgb3IgNCkNCmFsbC5hZ2UgJT4lIGdyb3VwX2J5KEFnZSkgJT4lIGRwbHlyOjpzdW1tYXJpc2Uobj1uKCksbG9nbj1sb2cobikpIC0+bW9ydF9zdW10YWINCiNmaWx0ZXJpbmcgZm9yIGFnZS1yZWNydWl0ZSB0byBnZWFyIGFuZCBzYW1wbGUgPj01IA0KbW9ydF9zdW10YWIgJT4lIGZpbHRlcihBZ2U+PTMsbj49NSktPm1vcnRfc3VtdGFiX2ZuDQojY2FsY3VsYXRpbmcgbW9ydGFsaXR5IHRocm91Z2ggbGluZWFyIG1vZGVsIG9mIGxvZ25+QWdlDQpzdW1tYXJ5KGxtKGxvZ25+QWdlLGRhdGE9bW9ydF9zdW10YWJfZm4pLT56KSNBZGp1c3RlZCBSLXNxdWFyZWQ6ICAwLjk0MzEgLHo9LTAuNjgzMzINCiBjcjEgPC0gY2hhcG1hblJvYnNvbihtb3J0X3N1bXRhYl9mbiRBZ2UsbW9ydF9zdW10YWJfZm4kbG9nbiwzOjkpDQpzdW1tYXJ5KGNyMSkNCg0KbW9ydF9zdW10YWIgICU+JSANCiAgZ2dwbG90KCkrdGhlbWVfY2xhc3NpYygpKw0KICBnZW9tX3BvaW50KGRhdGE9c3Vic2V0KG1vcnRfc3VtdGFiLEFnZSVpbiVjKDAsMSwyLDEwLDExLDEzKSksIGFlcyh4PUFnZSx5PWxvZ24pLGNvbD0iZ3JleTUwIixwY2g9NCkrDQogIGdlb21fcG9pbnQoZGF0YT1tb3J0X3N1bXRhYl9mbixhZXMoeD1BZ2UseT1sb2duKSxjb2w9ImJsYWNrIixjZXg9MikrDQogIGxhYnMoeD0iQWdlIix5PSJsb2cgKG51bWJlciBvZiBpbmRpdmlkdWFscykiLHRpdGxlPSJaPSAtMC42OCIpKw0KICBnZW9tX3ZsaW5lKGFlcyh4aW50ZXJjZXB0PTMpLGxpbmV0eXBlPSJkb3R0ZWQiLGNleD0xKStzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDAsMTMsMikpKw0KICBnZW9tX3Ntb290aChkYXRhPW1vcnRfc3VtdGFiX2ZuLGFlcyh4PUFnZSx5PWxvZ24pLG1ldGhvZCA9ICJsbSIsc2U9Rixjb2w9ImJsYWNrIixjZXg9MSkrDQogIHRoZW1lKHRleHQgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gInNlcmlmIixzaXplID0gMTIpLA0KICAgICAgICB0aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDUpKQ0KIyMjIyMjDQphbGwuYWdlICU+JSBncm91cF9ieSh5ZWFyLEFnZSkgJT4lIGRwbHlyOjpzdW1tYXJpc2Uobj1uKCksbG9nbj1sb2cobikpIC0+bW9ydF9zdW10YWJfeWVhcnMNCm1vcnRfc3VtdGFiX3llYXJzICU+JSBmaWx0ZXIoQWdlPj0zLG4+PTUpLT5tb3J0X3N1bXRhYl9mbl95ZWFycw0KI2NhbGN1bGF0aW5nIG1vcnRhbGl0eSB0aHJvdWdoIGxpbmVhciBtb2RlbCBvZiBsb2dufkFnZQ0Kc3VtbWFyeShsbShsb2dufkFnZSxkYXRhPXN1YnNldChtb3J0X3N1bXRhYl9mbl95ZWFycyx5ZWFyPT0xOTk0KSktPnoxOTk0KSN6PS0xLjEwNzgsIEFkaiBSLXNxdTowLjk1ODcsRi1zdGF0aXN0aWM6IDQ3LjQ2IG9uIDEgYW5kIDEgREYsICBwLXZhbHVlOiAwLjA5MTc3DQpzdW1tYXJ5KGxtKGxvZ25+QWdlLGRhdGE9c3Vic2V0KG1vcnRfc3VtdGFiX2ZuX3llYXJzLHllYXI9PTE5OTUpKS0+ejE5OTUpI3o9IC0wLjcwMDgsQWRqIFItc3F1OiAwLjg5MjIsIEYtc3RhdGlzdGljOiAyNS44MyBvbiAxIGFuZCAyIERGLCAgcC12YWx1ZTogMC4wMzY2DQpzdW1tYXJ5KGxtKGxvZ25+QWdlLGRhdGE9c3Vic2V0KG1vcnRfc3VtdGFiX2ZuX3llYXJzLHllYXI9PTE5OTYpKS0+ejE5OTYpI3o9IC0wLjI0NjIsIEFkaiBSLXNxdTogMC4yNjk1LCAsRi1zdGF0aXN0aWM6IDIuMTA3IG9uIDEgYW5kIDIgREYsICBwLXZhbHVlOiAwLjI4MzgNCnN1bW1hcnkobG0obG9nbn5BZ2UsZGF0YT1zdWJzZXQobW9ydF9zdW10YWJfZm5feWVhcnMseWVhcj09MTk5NykpLT56MTk5NykjeiA9IC0wLjEzNTIsIEFkanVzdGVkIFItc3F1YXJlZDogIC0wLjM4NTkgRi1zdGF0aXN0aWM6IDAuMTY0NyBvbiAxIGFuZCAyIERGLCAgcC12YWx1ZTogMC43MjQyDQpzdW1tYXJ5KGxtKGxvZ25+QWdlLGRhdGE9c3Vic2V0KG1vcnRfc3VtdGFiX2ZuX3llYXJzLHllYXI9PTE5OTgpKS0+ejE5OTgpI3ogPSAtMC4yNjkxLCBBZGp1c3RlZCBSLXNxdWFyZWQ6ICAwLjIyODcgRi1zdGF0aXN0aWM6IDEuODg5IG9uIDEgYW5kIDIgREYsICBwLXZhbHVlOiAwLjMwMw0KIHN1bW1hcnkobG0obG9nbn5BZ2UsZGF0YT1zdWJzZXQobW9ydF9zdW10YWJfZm5feWVhcnMseWVhcj09MTk5OSkpLT56MTk5OSkjeiA9IC0wLjc5NDYsIEFBZGp1c3RlZCBSLXNxdWFyZWQ6ICAwLjE3NjcgRi1zdGF0aXN0aWM6IDEuNDI5IG9uIDEgYW5kIDEgREYsICBwLXZhbHVlOiAwLjQ0MzUNCnN1bW1hcnkobG0obG9nbn5BZ2UsZGF0YT1zdWJzZXQobW9ydF9zdW10YWJfZm5feWVhcnMseWVhcj09MjAwMCkpLT56MjAwMCkjeiA9IC0wLjgxNTQsIEFkanVzdGVkIFItc3F1YXJlZDogIDAuODAwNiBGLXN0YXRpc3RpYzogMTMuMDUgb24gMSBhbmQgMiBERiwgIHAtdmFsdWU6IDAuMDY4ODMNCnN1bW1hcnkobG0obG9nbn5BZ2UsZGF0YT1zdWJzZXQobW9ydF9zdW10YWJfZm5feWVhcnMseWVhcj09MjAwMikpLT56MjAwMikjeiA9IC0wLjE3ODMsIEFkanVzdGVkIFItc3F1YXJlZDogIC0wLjA3MzQ5IEYtc3RhdGlzdGljOiAwLjg2MzEgb24gMSBhbmQgMSBERiwgIHAtdmFsdWU6IDAuNTIzNA0Kc3VtbWFyeShsbShsb2dufkFnZSxkYXRhPXN1YnNldChtb3J0X3N1bXRhYl9mbl95ZWFycyx5ZWFyPT0yMDAzKSktPnoyMDAzKSN6ID0gLTAuNTIwNjksIEFkanVzdGVkIFItc3F1YXJlZDogIDAuOTY5NCBGLXN0YXRpc3RpYzogMTI3Ljkgb24gMSBhbmQgMyBERiwgIHAtdmFsdWU6IDAuMDAxNDgzDQpzdW1tYXJ5KGxtKGxvZ25+QWdlLGRhdGE9c3Vic2V0KG1vcnRfc3VtdGFiX2ZuX3llYXJzLHllYXI9PTIwMDQpKS0+ejIwMDQpI3ogPSAtMC4yNjkxLCBBZGp1c3RlZCBSLXNxdWFyZWQ6ICAtMC4wMzM3NCBGLXN0YXRpc3RpYzogMC44Njk1IG9uIDEgYW5kIDMgREYsICBwLXZhbHVlOiAwLjQxOTkNCnN1bW1hcnkobG0obG9nbn5BZ2UsZGF0YT1zdWJzZXQobW9ydF9zdW10YWJfZm5feWVhcnMseWVhcj09MjAwNSkpLT56MjAwNSkjeiA9IC0wLjM5OTc5LCBBZGp1c3RlZCBSLXNxdWFyZWQ6ICAwLjgyMzEgRi1zdGF0aXN0aWM6IDE5LjYxIG9uIDEgYW5kIDMgREYsICBwLXZhbHVlOiAwLjAyMTM5DQpzdW1tYXJ5KGxtKGxvZ25+QWdlLGRhdGE9c3Vic2V0KG1vcnRfc3VtdGFiX2ZuX3llYXJzLHllYXI9PTIwMDYpKS0+ejIwMDYpI3ogPSAgLTAuMDc2NjEsIEFkanVzdGVkIFItc3F1YXJlZDogIC0wLjI4OCBGLXN0YXRpc3RpYzogMC4xMDU2IG9uIDEgYW5kIDMgREYsICBwLXZhbHVlOiAwLjc2NjYNCiMjIyMjIyMNCiNFcmFzDQpsZWZ0X2pvaW4oYWxsLmFnZSxkdXJhdGlvbixiPSJ5ZWFyIiktPmFsbC5hZ2UNCmFsbC5hZ2UgJT4lIG11dGF0ZShlcmE9aWZlbHNlKGR1cmF0aW9uPD01LCIwLTUiLGlmZWxzZShkdXJhdGlvbj4xMCwiMTArIiwiNS0xMCIpKSkgICU+JQ0KICBncm91cF9ieShlcmEsQWdlKSAlPiUgZHBseXI6OnN1bW1hcmlzZShuPW4oKSxsb2duPWxvZyhuKSkgLT5tb3J0X3N1bXRhYl9lcmENCm1vcnRfc3VtdGFiX2VyYSAlPiUgZmlsdGVyKEFnZT49MyxuPj01KS0+bW9ydF9zdW10YWJfZXJhX2ZuDQpzdW1tYXJ5KGxtKGxvZ25+QWdlLGRhdGE9c3Vic2V0KG1vcnRfc3VtdGFiX2VyYSxlcmE9PSIwLTUiKSkpI3o9LTAuNjYwMjMsIEFkanVzdGVkIFItc3F1YXJlZDogIDAuOTQ0NiBGLXN0YXRpc3RpYzogMTAzLjQgb24gMSBhbmQgNSBERiwgIHAtdmFsdWU6IDAuMDAwMTU3OA0Kc3VtbWFyeShsbShsb2dufkFnZSxkYXRhPXN1YnNldChtb3J0X3N1bXRhYl9lcmEsZXJhPT0iNS0xMCIpKSkjej0tMC44NjA4ICwgQWRqdXN0ZWQgUi1zcXVhcmVkOiAgMC44NTY4IEYtc3RhdGlzdGljOiAyNC45MyBvbiAxIGFuZCAzIERGLCAgcC12YWx1ZTogMC4wMTU0NQ0Kc3VtbWFyeShsbShsb2dufkFnZSxkYXRhPXN1YnNldChtb3J0X3N1bXRhYl9lcmEsZXJhPT0iMTArIikpKSN6PS0wLjU0MjM4ICwgQWRqdXN0ZWQgUi1zcXVhcmVkOiAgMC44NTEgRi1zdGF0aXN0aWM6IDM1LjI2IG9uIDEgYW5kIDUgREYsICBwLXZhbHVlOiAwLjAwMTkzNA0KDQpsbTEzIDwtIGxtKGxvZ25+QWdlKmVyYSxkYXRhPXN1YnNldChtb3J0X3N1bXRhYl9lcmFfZm4sZXJhIT0iNS0xMCIpKQ0KYW5vdmEobG0xMykNCkFub3ZhKGxtMTMsdHlwZT0iSUlJIikNCkFub3ZhKGxtMTMsdHlwZT0iSUkiKQ0KbG0xMiA8LSBsbShsb2dufkFnZSplcmEsZGF0YT1zdWJzZXQobW9ydF9zdW10YWJfZXJhX2ZuLGVyYSE9IjEwKyIpKQ0KYW5vdmEobG0xMikNCkFub3ZhKGxtMTIsdHlwZT0iSUlJIikNCkFub3ZhKGxtMTIsdHlwZT0iSUkiKQ0KbG0yMyA8LSBsbShsb2dufkFnZSplcmEsZGF0YT1zdWJzZXQobW9ydF9zdW10YWJfZXJhX2ZuLGVyYSE9IjAtNSIpKQ0KYW5vdmEobG0yMykNCkFub3ZhKGxtMjMsdHlwZT0iSUlJIikNCkFub3ZhKGxtMjMsdHlwZT0iSUkiKQ0KDQptb3J0X3N1bXRhYl9lcmEgJTw+JSAgbXV0YXRlKGxhYmVsPSBpZmVsc2UoZXJhPT0iMC01IiwiQSIsaWZlbHNlKGVyYT09IjUtMTAiLCJCIiwiQyIpKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbD1mYWN0b3IobGFiZWwsbGV2ZWxzID0gYygiQSIsIkIiLCJDIikpKSAgDQptb3J0X3N1bXRhYl9lcmFfZm4gJTw+JSAgbXV0YXRlKGxhYmVsPSBpZmVsc2UoZXJhPT0iMC01IiwiQSIsaWZlbHNlKGVyYT09IjUtMTAiLCJCIiwiQyIpKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbD1mYWN0b3IobGFiZWwsbGV2ZWxzID0gYygiQSIsIkIiLCJDIikpKSAgDQoNCg0KZ2dwbG90KCkrdGhlbWVfY2xhc3NpYygpK2dlb21fcG9pbnQoZGF0YT1tb3J0X3N1bXRhYl9lcmEsYWVzKHg9QWdlLHk9bG9nbiksY29sPSJncmV5NTAiLHBjaD00KStmYWNldF93cmFwKH5sYWJlbCkrDQogIGdlb21fcG9pbnQoZGF0YT1tb3J0X3N1bXRhYl9lcmFfZm4sYWVzKHg9QWdlLHk9bG9nbiksY29sPSJibGFjayIsY2V4PTIpKw0KICBnZW9tX3Ntb290aChkYXRhPW1vcnRfc3VtdGFiX2VyYV9mbixhZXMoeD1BZ2UseT1sb2duKSxjb2w9ImJsYWNrIixsaW5ldHlwZT0iZGFzaGVkIixtZXRob2Q9ImxtIixzZT1GKStmYWNldF93cmFwKH5sYWJlbCxuY29sPTEpKw0KICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzPWMoImJsYWNrIiwiZ3JleTI1IiwiZ3JleTYwIikpKw0KICBsYWJzKHg9IkFnZSIseT0ibG9nIE51bWJlciBvZiBJbmRpdmlkdWFscyIpKw0KICB0aGVtZSh0ZXh0PWVsZW1lbnRfdGV4dChmYW1pbHk9InNlcmlmIixzaXplPTEyKSwNCiAgICAgICAgc3RyaXAuYmFja2dyb3VuZCA9IGVsZW1lbnRfYmxhbmsoKSxzdHJpcC50ZXh0ID0gZWxlbWVudF90ZXh0KGhqdXN0PTApKSsNCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcz1zZXEoMCwxMiwzKSktPm1vcnRfcGxvdF9lcmENCg0KZ2dzYXZlKG1vcnRfcGxvdF9lcmEsZmlsZT0iRTovR3JhZCBTY2hvb2wvU3ByaW5nIDIwMjAvUXVhbnRpdGF0aXZlIEZpc2hlcmllcyBBbmFseXNpcy9Qb3B1bGF0aW9uIEFzc2Vzc21lbnQvdGlmZnMvbW9ydF9wbG90X2VyYS50aWZmIixkcGk9NTAwLHdpZHRoPTQsaGVpZ2h0PTgpDQoNCg0KYGBgDQoNClRha2Vhd2F5Og0KICAxLiBDYXRjaCBjdXJ2ZSBhbmFseXNpcyBpbmRpY2F0ZWQgbGl0dGxlIGRpZmZlcmVuY2UgaW4gbW9ydGFsaXR5IGFjcm9zcyB0aGUgMyBkaXN0aW5jdCBlcmFzLiBUaGlzIGlzIHNob3duIGluIHRoZSBtb2RlbHMgbG0xMyxsbTEyLGxtMjMgcmVzdWx0cyBhbmQgbW9ydF9wbG90X2VyYS4NCiAgMi4gQ2F0Y2hfY3VydmUgYW5hbHlzaXMgaG93ZXZlciwgaXMgbGlrZWx5IG5vdCBmaXR0aW5nIGFzIGEga2V5IGFzc3VtcHRpb24gaXMgdGhhdCByZWNydWl0ZW1lbnQgc3RheXMgY29uc2lzdGFudCBhY3Jvc3MgYWxsIG90aGVyIGNvdmFyaWF0ZXMgbGlrZSB0aW1lIG9yIGxvY2F0aW9uLiBXZSBrbm93IHRoYXQgd2FsbGV5ZSBjYW4gaGF2ZSBoaWdobHkgdmFyaWFibGUgcmVjcnVpdG1lbnQgY2F1c2VkIGJ5IGVpdGhlciBuYXR1cmFsIHZhcmlhdGlvbnMgb3Igc3RvY2tpbmcgZWZmb3J0cy4gVGhlcmVmb3JlLCBjYXRjaCBjdXJ2ZXMgYXJlIGxpa2VseSBub3QgdGhlIG1vc3QgdXNlZnVsIHRvbyB0byBpbnZlc3RpZ2F0ZSB0aGUgbW9ydGFsaXR5IG9mIHRoaXMgcG9wdWxhdGlvbi4gDQoNCg0KKipZZWFyLUNsYXNzIFN0cmVuZ3RoKioNCmBgYHtyfQ0KYWxsLmFnZSAlPiUgbXV0YXRlKHllYXJjbD15ZWFyLUFnZSkgICU+JSBmaWx0ZXIoQWdlJWluJWMoMSwyLDMsNCw1LDYpLHllYXJjbCVpbiVjKDE5OTI6MjAwMSkpICU+JSANCiAgZHBseXI6OnNlbGVjdCgtbGVuY2F0MTAsLWR1cmF0aW9uKSAlPiUgIGdyb3VwX2J5KHllYXIseWVhcmNsLEFnZSkgJT4lIGRwbHlyOjpzdW1tYXJpc2Uobj1uKCksbG9nbj1sb2cobikpLT55ZWFyX2NsYXNzDQp5ZWFyX2NsYXNzJEFnZTwtYXMuZmFjdG9yKHllYXJfY2xhc3MkQWdlKQ0KICB5ZWFyX2NsYXNzJHllYXJjbDwtYXMuZmFjdG9yKHllYXJfY2xhc3MkeWVhcmNsKQ0KICANCmdncGxvdCgpK3RoZW1lX2NsYXNzaWMoKStnZW9tX3BvaW50KGRhdGE9eWVhcl9jbGFzcyxhZXMoeD15ZWFyY2wseT1sb2duKSxwY2g9MSkrZmFjZXRfd3JhcCh+QWdlKSsNCiAgZ2VvbV9zbW9vdGgoZGF0YT15ZWFyX2NsYXNzLGFlcyh4PXllYXJjbCx5PWxvZ24sZ3JvdXA9QWdlKSxtZXRob2Q9ImxtIixzZT1GLGNvbD0iYmxhY2siLGxpbmV0eXBlPSJkYXNoZWQiKQ0KDQp4dGFicyh+QWdlK3llYXJjbCxkYXRhPXllYXJfY2xhc3MpDQoNCmxtMSA8LSBsbShsb2dufkFnZSt5ZWFyY2wsZGF0YT15ZWFyX2NsYXNzKQ0KQW5vdmEobG0xKQ0KbHNtZWFuczo6bHNtZWFucyhsbTEsfkFnZSkNCmFzLmRhdGEuZnJhbWUobHNtZWFuczo6bHNtZWFucyhsbTEsfnllYXJjbCkpLT55ZWFyY2xfdGFibGUNCg0KbWMxIDwtIG11bHRjb21wOjpnbGh0KGxtMSxtY3AoQWdlPSJUdWtleSIpKSNubyBkaWZmZXJlbmNlIGluIGFnZQ0KDQptYzFhIDwtIG11bHRjb21wOjpnbGh0KGxtMSxtY3AoeWVhcmNsPSJUdWtleSIpKQ0Kc3VtbWFyeShtYzFhKQ0KKGNsZChtYzFhKSktPmxhYmVsc195cmNsDQpyZXN1bHRzPC1kYXRhLmZyYW1lKHllYXJjbD1jKCIxOTkzIiwgIjE5OTQiLCAiMTk5NSIsICIxOTk2IiwgIjE5OTciLCAiMTk5OCIsICIxOTk5IiwgIjIwMDAiLCAiMjAwMSIsICIyMDAyIiksbGFiZWw9YyggImEiLCAiYWIiICwgImEiLCAiYiIsICJhYiIgICwiYSIgLCAiYSIgLCJhYiIgLCJhYiIgLCAiYSIgKSkNCg0KeWVhcl9jbGFzcyAlPiUgZ3JvdXBfYnkoeWVhcmNsKSAlPiUgZHBseXI6OnN1bW1hcmlzZShuc3VtPWxvZyhzdW0obikpLG1lYW49bG9nKG1lYW4obikpLHNkPWxvZyhzZChuKSksIGVycm9yPSBxbm9ybSgwLjk3NSkqc2Qvc3FydChuc3VtKSwgTENJID0gbWVhbiAtIGVycm9yLFVDSSA9IG1lYW4gKyBlcnJvcikNCmdncGxvdChhZXMoeD15ZWFyY2wseT1tZWFuKSkrdGhlbWVfY2xhc3NpYygpK2dlb21fcG9pbnQoY2V4PTMsY29sPSJibGFjayIpKw0KICBnZW9tX2Vycm9yYmFyKGFlcyh5bWluPUxDSSx5bWF4PVVDSSkpDQogIGdlb21fdGV4dChkYXRhPXJlc3VsdHMsYWVzKHg9eWVhcmNsLHk9KHllYXJjbF90YWJsZSR1cHBlci5DTCsuMiksbGFiZWw9bGFiZWwpKQ0KDQogIHllYXJfY2xhc3MgJT4lIGdncGxvdChhZXMoeD15ZWFyLCB5PWxvZ24pKSt0aGVtZV9jbGFzc2ljKCkrDQogICAgZ2VvbV9wb2ludCgpK2dlb21fbGluZShhZXMoZ3JvdXA9QWdlKSkNCiAgDQpmaXRQbG90KGxtMSx3aGljaD0ieWVhcmNsIix4bGFiPSJZZWFyIENsYXNzIix5bGFiPSJMb2dlKENhdGNoKSIsbWFpbj0iIixjb25mLmxldmVsID0gMC45NSkNCmBgYA0KDQoNCg0KDQoNCg==