1 Introduction

This analysis accompanies the article “Khattab, G., Al-Tamimi, J., and Al-Siraih, W., (2018). Nasalisation in the production of Iraqi Arabic pharyngeals. Phonetica. DOI: https://10.1159/000487806”. Below is an analysis of the perceptual experiment that was run to evaluate raters impressions of voice quality changes and/or nasalisation that was present within pharyngeals in Iraqi Arabic.

2 Material

Data were recorded from nine Iraqi Arabic speakers producing a list of items containing the two pharyngeal consonants /ħ ʕ/ and either an oral context (i.e., oral consonant), a nasal context (i.e., nasal consonant), or only two pharyngeals (/ʕ-ʕ/). The “control” contexts were oral-oral, oral-nasal, nasal-oral, nasal-nasal, and Isolation (which was all vowels in the items produced in isolation). The items were in a CVC environment.

Our aim in this analysis was to evaluate the impression of harsh/tense voice quality and/or nasalisation in the pharyngeal contexts, as compared with all other contexts specified above was perceptually salient or not. For this, six phonetically trained raters (including the first two authors) rated these items using Praat’s MFC experiment. The data used here were a subset of the data (around 20% of the full dataset). The first author rated all items from the full dataset and the results obtained from the full set and the subset are comparable. We ran this as a rating experiment, with three levels rating for Voice Quality (experiment 1) and five levels rating for Nasalisation (experiment 2). For more details, see the article.

3 Statistical analyses

The results of the rating experiment were analysed using an Inter-Rater Reliability test and then using a Cumulative Logit Mixed Models. The aim of these two analsyes is to shed light into how pharyngeals, when in a nasal context show clear patterns of a nasal context.

3.1 Inter-Rater Reliability

We started by evaluating Inter-Rater Reliability (IRR) using Intra-Class Correlations (ICC) on each of the Voice Quality and the Nasalisation rating experiments. We were interested in both consistency and agreement between the six rater. Results in the article are reported only for the agreement. Here we present and discuss both.

3.1.1 Loading required packages

requiredPackages = c('dplyr','irr','reshape2')
for(p in requiredPackages){
  if(!require(p,character.only = TRUE)) install.packages(p)
  library(p,character.only = TRUE)
}

3.1.2 Reading in data

We read in the data and check the structure

pharyngealsVQIRR <- read.csv("pharyngealsVQIRR.csv")
pharyngealsNasIRR <- read.csv("pharyngealsNasIRR.csv")
str(pharyngealsVQIRR)
'data.frame':   2430 obs. of  4 variables:
 $ subjectNew  : Factor w/ 9 levels "p01","p02","p03",..: 4 4 4 4 4 4 4 4 4 4 ...
 $ wordTarget  : Factor w/ 45 levels "3aaf-w","3aam-w",..: 38 37 24 23 41 40 8 7 27 19 ...
 $ raterNumber : Factor w/ 6 levels "R01","R02","R03",..: 2 2 2 2 2 2 2 2 2 2 ...
 $ responseNumb: int  3 2 3 3 3 2 3 3 3 3 ...
str(pharyngealsNasIRR)
'data.frame':   2430 obs. of  4 variables:
 $ subjectNew  : Factor w/ 9 levels "p01","p02","p03",..: 4 4 4 4 4 4 4 4 4 4 ...
 $ wordTarget  : Factor w/ 45 levels "3aaf-w","3aam-w",..: 38 37 24 23 41 40 8 7 27 19 ...
 $ raterNumber : Factor w/ 6 levels "R01","R02","R03",..: 2 2 2 2 2 2 2 2 2 2 ...
 $ responseNumb: int  4 4 4 3 3 4 2 3 2 4 ...

3.1.3 Melting and casting the data

We change a few points in the data-frame. We transform the responses into numbers. We then melt and decast the data to have it in a wide format. The new structure has 9 rows (representing data from each producing subject) and 270 columns with the ratings from each word and rater ID.

## change response into a number
pharyngealsVQIRR$responseNumb <- as.numeric(pharyngealsVQIRR$responseNumb)
pharyngealsNasIRR$responseNumb <- as.numeric(pharyngealsNasIRR$responseNumb)
## casting and melting the data frame, VQ first
pharyngealsVQIRRCast <- dcast(melt(pharyngealsVQIRR, id.vars=c("subjectNew", "wordTarget","raterNumber")), subjectNew~wordTarget+raterNumber)
## casting and melting the data frame, nasalisation second
pharyngealsNasIRRCast <- dcast(melt(pharyngealsNasIRR, id.vars=c("subjectNew", "wordTarget","raterNumber")), subjectNew~wordTarget+raterNumber)
str(pharyngealsVQIRRCast)
'data.frame':   9 obs. of  271 variables:
 $ subjectNew : Factor w/ 9 levels "p01","p02","p03",..: 1 2 3 4 5 6 7 8 9
 $ 3aaf-w_R01 : num  3 3 3 2 3 3 2 2 3
 $ 3aaf-w_R02 : num  3 3 3 3 3 3 3 3 3
 $ 3aaf-w_R03 : num  2 2 2 2 3 2 2 2 3
 $ 3aaf-w_R04 : num  3 2 3 1 3 1 3 3 3
 $ 3aaf-w_R05 : num  2 3 3 3 3 3 3 3 3
 $ 3aaf-w_R06 : num  3 3 3 3 3 3 3 2 3
 $ 3aam-w_R01 : num  3 2 3 2 3 3 2 3 2
 $ 3aam-w_R02 : num  3 3 3 3 3 3 3 3 3
 $ 3aam-w_R03 : num  2 2 2 2 3 2 2 2 2
 $ 3aam-w_R04 : num  3 2 3 2 3 1 2 3 2
 $ 3aam-w_R05 : num  2 3 3 3 3 2 3 3 2
 $ 3aam-w_R06 : num  2 2 2 2 2 2 2 3 2
 $ 3eeb-v_R01 : num  2 2 2 1 2 2 2 2 2
 $ 3eeb-v_R02 : num  2 3 2 2 2 2 3 3 2
 $ 3eeb-v_R03 : num  2 2 2 2 2 2 2 2 2
 $ 3eeb-v_R04 : num  2 3 2 1 2 1 2 1 2
 $ 3eeb-v_R05 : num  3 3 3 3 3 1 3 3 2
 $ 3eeb-v_R06 : num  2 3 3 3 2 3 2 3 2
 $ 3eeb-w_R01 : num  3 3 3 2 3 2 3 2 2
 $ 3eeb-w_R02 : num  3 3 3 3 3 2 3 3 2
 $ 3eeb-w_R03 : num  3 3 3 2 2 2 3 2 2
 $ 3eeb-w_R04 : num  3 3 3 3 2 2 3 2 2
 $ 3eeb-w_R05 : num  3 3 3 3 2 3 3 3 2
 $ 3eeb-w_R06 : num  2 3 3 3 2 2 2 3 2
 $ 3een-w_R01 : num  3 2 2 2 3 2 2 3 3
 $ 3een-w_R02 : num  3 3 3 3 3 3 2 3 3
 $ 3een-w_R03 : num  3 3 2 2 2 2 2 3 3
 $ 3een-w_R04 : num  3 2 2 2 3 2 2 3 2
 $ 3een-w_R05 : num  2 3 3 3 2 3 2 3 3
 $ 3een-w_R06 : num  2 2 3 3 3 2 2 2 2
 $ 3iish-w_R01: num  3 3 3 3 3 3 1 3 3
 $ 3iish-w_R02: num  3 3 3 3 3 3 2 3 3
 $ 3iish-w_R03: num  3 3 3 3 3 3 2 3 3
 $ 3iish-w_R04: num  3 2 3 2 2 2 3 1 2
 $ 3iish-w_R05: num  2 3 3 3 3 3 2 3 3
 $ 3iish-w_R06: num  2 3 3 3 3 3 2 2 3
 $ 3oo3-v_R01 : num  2 2 2 2 2 2 2 2 2
 $ 3oo3-v_R02 : num  2 3 2 3 3 2 3 2 2
 $ 3oo3-v_R03 : num  2 2 2 2 2 2 2 2 2
 $ 3oo3-v_R04 : num  2 2 2 2 1 1 2 1 2
 $ 3oo3-v_R05 : num  3 3 3 1 3 2 2 1 3
 $ 3oo3-v_R06 : num  2 2 2 3 2 2 3 2 2
 $ 3oo3-w_R01 : num  3 3 3 3 3 3 3 1 3
 $ 3oo3-w_R02 : num  3 3 3 3 3 3 3 3 3
 $ 3oo3-w_R03 : num  2 2 2 2 3 2 3 2 3
 $ 3oo3-w_R04 : num  3 3 3 2 3 1 3 2 3
 $ 3oo3-w_R05 : num  3 3 3 2 2 3 3 2 3
 $ 3oo3-w_R06 : num  3 3 3 2 3 3 3 2 2
 $ 3oon-w_R01 : num  3 3 3 2 3 3 2 3 1
 $ 3oon-w_R02 : num  3 2 3 2 3 2 2 3 3
 $ 3oon-w_R03 : num  3 2 3 2 3 2 2 3 3
 $ 3oon-w_R04 : num  3 2 2 2 3 2 2 3 3
 $ 3oon-w_R05 : num  2 3 3 2 1 2 2 3 2
 $ 3oon-w_R06 : num  1 3 3 2 3 2 2 2 3
 $ 7aad-w_R01 : num  3 2 3 3 3 2 2 3 3
 $ 7aad-w_R02 : num  3 3 3 3 3 3 3 3 3
 $ 7aad-w_R03 : num  2 2 3 3 2 2 2 3 3
 $ 7aad-w_R04 : num  3 2 3 2 3 3 2 3 2
 $ 7aad-w_R05 : num  2 3 3 3 2 2 3 3 2
 $ 7aad-w_R06 : num  2 3 3 2 2 3 2 2 2
 $ 7eef-v_R01 : num  2 1 1 2 2 2 2 2 2
 $ 7eef-v_R02 : num  2 3 2 2 2 2 2 3 2
 $ 7eef-v_R03 : num  2 2 2 2 2 2 2 2 2
 $ 7eef-v_R04 : num  2 1 2 1 2 2 3 2 2
 $ 7eef-v_R05 : num  1 3 2 3 3 2 1 3 2
 $ 7eef-v_R06 : num  1 3 3 1 2 2 3 2 2
 $ 7eef-w_R01 : num  2 2 2 2 2 2 2 3 2
 $ 7eef-w_R02 : num  3 3 3 3 3 2 3 3 2
 $ 7eef-w_R03 : num  2 2 2 2 2 2 2 2 1
 $ 7eef-w_R04 : num  3 2 2 2 1 2 2 3 3
 $ 7eef-w_R05 : num  2 2 3 2 2 2 3 3 3
 $ 7eef-w_R06 : num  2 3 3 1 3 2 2 2 3
 $ 7en-w_R01  : num  3 2 2 2 3 2 2 2 2
 $ 7en-w_R02  : num  3 3 3 2 3 2 3 3 3
 $ 7en-w_R03  : num  2 2 2 2 3 2 2 3 3
 $ 7en-w_R04  : num  3 3 3 2 2 1 2 3 3
 $ 7en-w_R05  : num  3 3 3 2 2 2 2 3 2
 $ 7en-w_R06  : num  2 3 3 2 3 2 2 2 2
 $ 7ook-w_R01 : num  3 2 2 2 3 2 2 3 2
 $ 7ook-w_R02 : num  3 3 3 2 3 2 3 3 3
 $ 7ook-w_R03 : num  2 3 2 2 3 2 2 2 1
 $ 7ook-w_R04 : num  2 2 3 2 3 1 2 2 2
 $ 7ook-w_R05 : num  1 2 3 2 2 2 3 2 1
 $ 7ook-w_R06 : num  2 3 3 2 3 2 2 2 1
 $ 7oom-w_R01 : num  3 2 2 1 3 2 1 3 1
 $ 7oom-w_R02 : num  3 3 3 2 3 2 3 3 3
 $ 7oom-w_R03 : num  2 2 2 2 2 2 2 3 1
 $ 7oom-w_R04 : num  2 2 2 1 3 1 2 3 2
 $ 7oom-w_R05 : num  1 2 3 1 2 2 3 3 1
 $ 7oom-w_R06 : num  2 2 2 3 3 2 3 2 1
 $ baa3-w_R01 : num  2 2 3 3 3 2 2 2 2
 $ baa3-w_R02 : num  3 3 3 3 3 3 3 2 2
 $ baa3-w_R03 : num  2 2 2 3 2 3 2 2 2
 $ baa3-w_R04 : num  2 2 2 2 3 3 2 2 2
 $ baa3-w_R05 : num  3 3 3 3 3 3 3 3 3
 $ baa3-w_R06 : num  2 2 3 2 3 2 2 2 2
 $ beet-w_R01 : num  2 2 1 2 2 2 2 2 2
 $ beet-w_R02 : num  2 2 2 2 2 2 2 2 2
  [list output truncated]

3.1.4 Intra-Class Correlations (ICC)

We used ICCs to compute inter-rater reliability. For details see the article. We ran two types of tests. We wanted to check how consistent the raters were in their choices and also how they agree between each other. The agreements were reported in the article. We start by reporting the overall consistency and agreement levels for each of the VQ and Nasalisation experiments and then on the consistency and agreement on each word, i.e., an Item-based analysis.

3.1.4.1 Voice Quality (VQ)

We start with the VQ experiment.

3.1.4.1.1 Consistency

Below are the model specifications for the consistency.

VQICCRatingConsWordAver <- icc(pharyngealsVQIRRCast[2:271],model="twoway",type="consistency",unit="average")
VQICCRatingConsWordAver3aafw <- icc(pharyngealsVQIRRCast[2:7],model="twoway",type="consistency",unit="average")
VQICCRatingConsWordAver3aamw <- icc(pharyngealsVQIRRCast[8:13],model="twoway",type="consistency",unit="average")
VQICCRatingConsWordAver3eebv <- icc(pharyngealsVQIRRCast[14:19],model="twoway",type="consistency",unit="average")
VQICCRatingConsWordAver3eebw <- icc(pharyngealsVQIRRCast[20:25],model="twoway",type="consistency",unit="average")
VQICCRatingConsWordAver3eenw <- icc(pharyngealsVQIRRCast[26:31],model="twoway",type="consistency",unit="average")
VQICCRatingConsWordAver3iishw <- icc(pharyngealsVQIRRCast[32:37],model="twoway",type="consistency",unit="average")
VQICCRatingConsWordAver3oo3v <- icc(pharyngealsVQIRRCast[38:43],model="twoway",type="consistency",unit="average")
VQICCRatingConsWordAver3oo3w <- icc(pharyngealsVQIRRCast[44:49],model="twoway",type="consistency",unit="average")
VQICCRatingConsWordAver3oonw <- icc(pharyngealsVQIRRCast[50:55],model="twoway",type="consistency",unit="average")
VQICCRatingConsWordAver7aadw <- icc(pharyngealsVQIRRCast[56:61],model="twoway",type="consistency",unit="average")
VQICCRatingConsWordAver7eefv <- icc(pharyngealsVQIRRCast[62:67],model="twoway",type="consistency",unit="average")
VQICCRatingConsWordAver7eefw <- icc(pharyngealsVQIRRCast[68:73],model="twoway",type="consistency",unit="average")
VQICCRatingConsWordAver7enw <- icc(pharyngealsVQIRRCast[74:79],model="twoway",type="consistency",unit="average")
VQICCRatingConsWordAver7ookw <- icc(pharyngealsVQIRRCast[80:85],model="twoway",type="consistency",unit="average")
VQICCRatingConsWordAver7oomw <- icc(pharyngealsVQIRRCast[86:91],model="twoway",type="consistency",unit="average")
VQICCRatingConsWordAverbaa3w <- icc(pharyngealsVQIRRCast[92:97],model="twoway",type="consistency",unit="average")
VQICCRatingConsWordAverbeetw <- icc(pharyngealsVQIRRCast[98:103],model="twoway",type="consistency",unit="average")
VQICCRatingConsWordAverbii3v <- icc(pharyngealsVQIRRCast[104:109],model="twoway",type="consistency",unit="average")
VQICCRatingConsWordAverbii3w <- icc(pharyngealsVQIRRCast[110:115],model="twoway",type="consistency",unit="average")
VQICCRatingConsWordAverbooshw <- icc(pharyngealsVQIRRCast[116:121],model="twoway",type="consistency",unit="average")
VQICCRatingConsWordAverdaasw <- icc(pharyngealsVQIRRCast[122:127],model="twoway",type="consistency",unit="average")
VQICCRatingConsWordAverdiinw <- icc(pharyngealsVQIRRCast[128:133],model="twoway",type="consistency",unit="average")
VQICCRatingConsWordAverdjuu3v <- icc(pharyngealsVQIRRCast[134:139],model="twoway",type="consistency",unit="average")
VQICCRatingConsWordAverdjuu3w <- icc(pharyngealsVQIRRCast[140:145],model="twoway",type="consistency",unit="average")
VQICCRatingConsWordAverdoomv <- icc(pharyngealsVQIRRCast[146:151],model="twoway",type="consistency",unit="average")
VQICCRatingConsWordAverdoomw <- icc(pharyngealsVQIRRCast[152:157],model="twoway",type="consistency",unit="average")
VQICCRatingConsWordAverloo7w <- icc(pharyngealsVQIRRCast[158:163],model="twoway",type="consistency",unit="average")
VQICCRatingConsWordAvermaatv <- icc(pharyngealsVQIRRCast[164:169],model="twoway",type="consistency",unit="average")
VQICCRatingConsWordAvermaatw <- icc(pharyngealsVQIRRCast[170:175],model="twoway",type="consistency",unit="average")
VQICCRatingConsWordAvermoozw <- icc(pharyngealsVQIRRCast[176:181],model="twoway",type="consistency",unit="average")
VQICCRatingConsWordAvermuunw <- icc(pharyngealsVQIRRCast[182:187],model="twoway",type="consistency",unit="average")
VQICCRatingConsWordAvermuusw <- icc(pharyngealsVQIRRCast[188:193],model="twoway",type="consistency",unit="average")
VQICCRatingConsWordAvernaa7v <- icc(pharyngealsVQIRRCast[194:199],model="twoway",type="consistency",unit="average")
VQICCRatingConsWordAvernaa7w <- icc(pharyngealsVQIRRCast[200:205],model="twoway",type="consistency",unit="average")
VQICCRatingConsWordAvernaamv <- icc(pharyngealsVQIRRCast[206:211],model="twoway",type="consistency",unit="average")
VQICCRatingConsWordAvernaamw <- icc(pharyngealsVQIRRCast[212:217],model="twoway",type="consistency",unit="average")
VQICCRatingConsWordAvernoo3v <- icc(pharyngealsVQIRRCast[218:223],model="twoway",type="consistency",unit="average")
VQICCRatingConsWordAvernoo3w <- icc(pharyngealsVQIRRCast[224:229],model="twoway",type="consistency",unit="average")
VQICCRatingConsWordAvernoomw <- icc(pharyngealsVQIRRCast[230:235],model="twoway",type="consistency",unit="average")
VQICCRatingConsWordAvernuu7v <- icc(pharyngealsVQIRRCast[236:241],model="twoway",type="consistency",unit="average")
VQICCRatingConsWordAvernuu7w <- icc(pharyngealsVQIRRCast[242:247],model="twoway",type="consistency",unit="average")
VQICCRatingConsWordAversaamv <- icc(pharyngealsVQIRRCast[248:253],model="twoway",type="consistency",unit="average")
VQICCRatingConsWordAversaamw <- icc(pharyngealsVQIRRCast[254:259],model="twoway",type="consistency",unit="average")
VQICCRatingConsWordAverzaa7w <- icc(pharyngealsVQIRRCast[260:265],model="twoway",type="consistency",unit="average")
VQICCRatingConsWordAverzii7w <- icc(pharyngealsVQIRRCast[266:271],model="twoway",type="consistency",unit="average")
3.1.4.1.2 Agreement

Below are the model specifications for the agreement

VQICCRatingAgreeWordAver <- icc(pharyngealsVQIRRCast[2:271],model="twoway",type="agreement",unit="average")
VQICCRatingAgreeWordAver3aafw <- icc(pharyngealsVQIRRCast[2:7],model="twoway",type="agreement",unit="average")
VQICCRatingAgreeWordAver3aamw <- icc(pharyngealsVQIRRCast[8:13],model="twoway",type="agreement",unit="average")
VQICCRatingAgreeWordAver3eebv <- icc(pharyngealsVQIRRCast[14:19],model="twoway",type="agreement",unit="average")
VQICCRatingAgreeWordAver3eebw <- icc(pharyngealsVQIRRCast[20:25],model="twoway",type="agreement",unit="average")
VQICCRatingAgreeWordAver3eenw <- icc(pharyngealsVQIRRCast[26:31],model="twoway",type="agreement",unit="average")
VQICCRatingAgreeWordAver3iishw <- icc(pharyngealsVQIRRCast[32:37],model="twoway",type="agreement",unit="average")
VQICCRatingAgreeWordAver3oo3v <- icc(pharyngealsVQIRRCast[38:43],model="twoway",type="agreement",unit="average")
VQICCRatingAgreeWordAver3oo3w <- icc(pharyngealsVQIRRCast[44:49],model="twoway",type="agreement",unit="average")
VQICCRatingAgreeWordAver3oonw <- icc(pharyngealsVQIRRCast[50:55],model="twoway",type="agreement",unit="average")
VQICCRatingAgreeWordAver7aadw <- icc(pharyngealsVQIRRCast[56:61],model="twoway",type="agreement",unit="average")
VQICCRatingAgreeWordAver7eefv <- icc(pharyngealsVQIRRCast[62:67],model="twoway",type="agreement",unit="average")
VQICCRatingAgreeWordAver7eefw <- icc(pharyngealsVQIRRCast[68:73],model="twoway",type="agreement",unit="average")
VQICCRatingAgreeWordAver7enw <- icc(pharyngealsVQIRRCast[74:79],model="twoway",type="agreement",unit="average")
VQICCRatingAgreeWordAver7ookw <- icc(pharyngealsVQIRRCast[80:85],model="twoway",type="agreement",unit="average")
VQICCRatingAgreeWordAver7oomw <- icc(pharyngealsVQIRRCast[86:91],model="twoway",type="agreement",unit="average")
VQICCRatingAgreeWordAverbaa3w <- icc(pharyngealsVQIRRCast[92:97],model="twoway",type="agreement",unit="average")
VQICCRatingAgreeWordAverbeetw <- icc(pharyngealsVQIRRCast[98:103],model="twoway",type="agreement",unit="average")
VQICCRatingAgreeWordAverbii3v <- icc(pharyngealsVQIRRCast[104:109],model="twoway",type="agreement",unit="average")
VQICCRatingAgreeWordAverbii3w <- icc(pharyngealsVQIRRCast[110:115],model="twoway",type="agreement",unit="average")
VQICCRatingAgreeWordAverbooshw <- icc(pharyngealsVQIRRCast[116:121],model="twoway",type="agreement",unit="average")
VQICCRatingAgreeWordAverdaasw <- icc(pharyngealsVQIRRCast[122:127],model="twoway",type="agreement",unit="average")
VQICCRatingAgreeWordAverdiinw <- icc(pharyngealsVQIRRCast[128:133],model="twoway",type="agreement",unit="average")
VQICCRatingAgreeWordAverdjuu3v <- icc(pharyngealsVQIRRCast[134:139],model="twoway",type="agreement",unit="average")
VQICCRatingAgreeWordAverdjuu3w <- icc(pharyngealsVQIRRCast[140:145],model="twoway",type="agreement",unit="average")
VQICCRatingAgreeWordAverdoomv <- icc(pharyngealsVQIRRCast[146:151],model="twoway",type="agreement",unit="average")
VQICCRatingAgreeWordAverdoomw <- icc(pharyngealsVQIRRCast[152:157],model="twoway",type="agreement",unit="average")
VQICCRatingAgreeWordAverloo7w <- icc(pharyngealsVQIRRCast[158:163],model="twoway",type="agreement",unit="average")
VQICCRatingAgreeWordAvermaatv <- icc(pharyngealsVQIRRCast[164:169],model="twoway",type="agreement",unit="average")
VQICCRatingAgreeWordAvermaatw <- icc(pharyngealsVQIRRCast[170:175],model="twoway",type="agreement",unit="average")
VQICCRatingAgreeWordAvermoozw <- icc(pharyngealsVQIRRCast[176:181],model="twoway",type="agreement",unit="average")
VQICCRatingAgreeWordAvermuunw <- icc(pharyngealsVQIRRCast[182:187],model="twoway",type="agreement",unit="average")
VQICCRatingAgreeWordAvermuusw <- icc(pharyngealsVQIRRCast[188:193],model="twoway",type="agreement",unit="average")
VQICCRatingAgreeWordAvernaa7v <- icc(pharyngealsVQIRRCast[194:199],model="twoway",type="agreement",unit="average")
VQICCRatingAgreeWordAvernaa7w <- icc(pharyngealsVQIRRCast[200:205],model="twoway",type="agreement",unit="average")
VQICCRatingAgreeWordAvernaamv <- icc(pharyngealsVQIRRCast[206:211],model="twoway",type="agreement",unit="average")
VQICCRatingAgreeWordAvernaamw <- icc(pharyngealsVQIRRCast[212:217],model="twoway",type="agreement",unit="average")
VQICCRatingAgreeWordAvernoo3v <- icc(pharyngealsVQIRRCast[218:223],model="twoway",type="agreement",unit="average")
VQICCRatingAgreeWordAvernoo3w <- icc(pharyngealsVQIRRCast[224:229],model="twoway",type="agreement",unit="average")
VQICCRatingAgreeWordAvernoomw <- icc(pharyngealsVQIRRCast[230:235],model="twoway",type="agreement",unit="average")
VQICCRatingAgreeWordAvernuu7v <- icc(pharyngealsVQIRRCast[236:241],model="twoway",type="agreement",unit="average")
VQICCRatingAgreeWordAvernuu7w <- icc(pharyngealsVQIRRCast[242:247],model="twoway",type="agreement",unit="average")
VQICCRatingAgreeWordAversaamv <- icc(pharyngealsVQIRRCast[248:253],model="twoway",type="agreement",unit="average")
VQICCRatingAgreeWordAversaamw <- icc(pharyngealsVQIRRCast[254:259],model="twoway",type="agreement",unit="average")
VQICCRatingAgreeWordAverzaa7w <- icc(pharyngealsVQIRRCast[260:265],model="twoway",type="agreement",unit="average")
VQICCRatingAgreeWordAverzii7w <- icc(pharyngealsVQIRRCast[266:271],model="twoway",type="agreement",unit="average")

3.1.4.2 Nasalisation

We move to the nasalisation experiment.

3.1.4.2.1 Consistency

Below are the model specifications for the consistency.

NasICCRatingConsWordAver <- icc(pharyngealsNasIRRCast[2:271],model="twoway",type="consistency",unit="average")
NasICCRatingConsWordAver3aafw <- icc(pharyngealsNasIRRCast[2:7],model="twoway",type="consistency",unit="average")
NasICCRatingConsWordAver3aamw <- icc(pharyngealsNasIRRCast[8:13],model="twoway",type="consistency",unit="average")
NasICCRatingConsWordAver3eebv <- icc(pharyngealsNasIRRCast[14:19],model="twoway",type="consistency",unit="average")
NasICCRatingConsWordAver3eebw <- icc(pharyngealsNasIRRCast[20:25],model="twoway",type="consistency",unit="average")
NasICCRatingConsWordAver3eenw <- icc(pharyngealsNasIRRCast[26:31],model="twoway",type="consistency",unit="average")
NasICCRatingConsWordAver3iishw <- icc(pharyngealsNasIRRCast[32:37],model="twoway",type="consistency",unit="average")
NasICCRatingConsWordAver3oo3v <- icc(pharyngealsNasIRRCast[38:43],model="twoway",type="consistency",unit="average")
NasICCRatingConsWordAver3oo3w <- icc(pharyngealsNasIRRCast[44:49],model="twoway",type="consistency",unit="average")
NasICCRatingConsWordAver3oonw <- icc(pharyngealsNasIRRCast[50:55],model="twoway",type="consistency",unit="average")
NasICCRatingConsWordAver7aadw <- icc(pharyngealsNasIRRCast[56:61],model="twoway",type="consistency",unit="average")
NasICCRatingConsWordAver7eefv <- icc(pharyngealsNasIRRCast[62:67],model="twoway",type="consistency",unit="average")
NasICCRatingConsWordAver7eefw <- icc(pharyngealsNasIRRCast[68:73],model="twoway",type="consistency",unit="average")
NasICCRatingConsWordAver7enw <- icc(pharyngealsNasIRRCast[74:79],model="twoway",type="consistency",unit="average")
NasICCRatingConsWordAver7ookw <- icc(pharyngealsNasIRRCast[80:85],model="twoway",type="consistency",unit="average")
NasICCRatingConsWordAver7oomw <- icc(pharyngealsNasIRRCast[86:91],model="twoway",type="consistency",unit="average")
NasICCRatingConsWordAverbaa3w <- icc(pharyngealsNasIRRCast[92:97],model="twoway",type="consistency",unit="average")
NasICCRatingConsWordAverbeetw <- icc(pharyngealsNasIRRCast[98:103],model="twoway",type="consistency",unit="average")
NasICCRatingConsWordAverbii3v <- icc(pharyngealsNasIRRCast[104:109],model="twoway",type="consistency",unit="average")
NasICCRatingConsWordAverbii3w <- icc(pharyngealsNasIRRCast[110:115],model="twoway",type="consistency",unit="average")
NasICCRatingConsWordAverbooshw <- icc(pharyngealsNasIRRCast[116:121],model="twoway",type="consistency",unit="average")
NasICCRatingConsWordAverdaasw <- icc(pharyngealsNasIRRCast[122:127],model="twoway",type="consistency",unit="average")
NasICCRatingConsWordAverdiinw <- icc(pharyngealsNasIRRCast[128:133],model="twoway",type="consistency",unit="average")
NasICCRatingConsWordAverdjuu3v <- icc(pharyngealsNasIRRCast[134:139],model="twoway",type="consistency",unit="average")
NasICCRatingConsWordAverdjuu3w <- icc(pharyngealsNasIRRCast[140:145],model="twoway",type="consistency",unit="average")
NasICCRatingConsWordAverdoomv <- icc(pharyngealsNasIRRCast[146:151],model="twoway",type="consistency",unit="average")
NasICCRatingConsWordAverdoomw <- icc(pharyngealsNasIRRCast[152:157],model="twoway",type="consistency",unit="average")
NasICCRatingConsWordAverloo7w <- icc(pharyngealsNasIRRCast[158:163],model="twoway",type="consistency",unit="average")
NasICCRatingConsWordAvermaatv <- icc(pharyngealsNasIRRCast[164:169],model="twoway",type="consistency",unit="average")
NasICCRatingConsWordAvermaatw <- icc(pharyngealsNasIRRCast[170:175],model="twoway",type="consistency",unit="average")
NasICCRatingConsWordAvermoozw <- icc(pharyngealsNasIRRCast[176:181],model="twoway",type="consistency",unit="average")
NasICCRatingConsWordAvermuunw <- icc(pharyngealsNasIRRCast[182:187],model="twoway",type="consistency",unit="average")
NasICCRatingConsWordAvermuusw <- icc(pharyngealsNasIRRCast[188:193],model="twoway",type="consistency",unit="average")
NasICCRatingConsWordAvernaa7v <- icc(pharyngealsNasIRRCast[194:199],model="twoway",type="consistency",unit="average")
NasICCRatingConsWordAvernaa7w <- icc(pharyngealsNasIRRCast[200:205],model="twoway",type="consistency",unit="average")
NasICCRatingConsWordAvernaamv <- icc(pharyngealsNasIRRCast[206:211],model="twoway",type="consistency",unit="average")
NasICCRatingConsWordAvernaamw <- icc(pharyngealsNasIRRCast[212:217],model="twoway",type="consistency",unit="average")
NasICCRatingConsWordAvernoo3v <- icc(pharyngealsNasIRRCast[218:223],model="twoway",type="consistency",unit="average")
NasICCRatingConsWordAvernoo3w <- icc(pharyngealsNasIRRCast[224:229],model="twoway",type="consistency",unit="average")
NasICCRatingConsWordAvernoomw <- icc(pharyngealsNasIRRCast[230:235],model="twoway",type="consistency",unit="average")
NasICCRatingConsWordAvernuu7v <- icc(pharyngealsNasIRRCast[236:241],model="twoway",type="consistency",unit="average")
NasICCRatingConsWordAvernuu7w <- icc(pharyngealsNasIRRCast[242:247],model="twoway",type="consistency",unit="average")
NasICCRatingConsWordAversaamv <- icc(pharyngealsNasIRRCast[248:253],model="twoway",type="consistency",unit="average")
NasICCRatingConsWordAversaamw <- icc(pharyngealsNasIRRCast[254:259],model="twoway",type="consistency",unit="average")
NasICCRatingConsWordAverzaa7w <- icc(pharyngealsNasIRRCast[260:265],model="twoway",type="consistency",unit="average")
NasICCRatingConsWordAverzii7w <- icc(pharyngealsNasIRRCast[266:271],model="twoway",type="consistency",unit="average")
3.1.4.2.2 Agreement

Below are the model specifications for the agreement

NasICCRatingAgreeWordAver <- icc(pharyngealsNasIRRCast[2:271],model="twoway",type="agreement",unit="average")
NasICCRatingAgreeWordAver3aafw <- icc(pharyngealsNasIRRCast[2:7],model="twoway",type="agreement",unit="average")
NasICCRatingAgreeWordAver3aamw <- icc(pharyngealsNasIRRCast[8:13],model="twoway",type="agreement",unit="average")
NasICCRatingAgreeWordAver3eebv <- icc(pharyngealsNasIRRCast[14:19],model="twoway",type="agreement",unit="average")
NasICCRatingAgreeWordAver3eebw <- icc(pharyngealsNasIRRCast[20:25],model="twoway",type="agreement",unit="average")
NasICCRatingAgreeWordAver3eenw <- icc(pharyngealsNasIRRCast[26:31],model="twoway",type="agreement",unit="average")
NasICCRatingAgreeWordAver3iishw <- icc(pharyngealsNasIRRCast[32:37],model="twoway",type="agreement",unit="average")
NasICCRatingAgreeWordAver3oo3v <- icc(pharyngealsNasIRRCast[38:43],model="twoway",type="agreement",unit="average")
NasICCRatingAgreeWordAver3oo3w <- icc(pharyngealsNasIRRCast[44:49],model="twoway",type="agreement",unit="average")
NasICCRatingAgreeWordAver3oonw <- icc(pharyngealsNasIRRCast[50:55],model="twoway",type="agreement",unit="average")
NasICCRatingAgreeWordAver7aadw <- icc(pharyngealsNasIRRCast[56:61],model="twoway",type="agreement",unit="average")
NasICCRatingAgreeWordAver7eefv <- icc(pharyngealsNasIRRCast[62:67],model="twoway",type="agreement",unit="average")
NasICCRatingAgreeWordAver7eefw <- icc(pharyngealsNasIRRCast[68:73],model="twoway",type="agreement",unit="average")
NasICCRatingAgreeWordAver7enw <- icc(pharyngealsNasIRRCast[74:79],model="twoway",type="agreement",unit="average")
NasICCRatingAgreeWordAver7ookw <- icc(pharyngealsNasIRRCast[80:85],model="twoway",type="agreement",unit="average")
NasICCRatingAgreeWordAver7oomw <- icc(pharyngealsNasIRRCast[86:91],model="twoway",type="agreement",unit="average")
NasICCRatingAgreeWordAverbaa3w <- icc(pharyngealsNasIRRCast[92:97],model="twoway",type="agreement",unit="average")
NasICCRatingAgreeWordAverbeetw <- icc(pharyngealsNasIRRCast[98:103],model="twoway",type="agreement",unit="average")
NasICCRatingAgreeWordAverbii3v <- icc(pharyngealsNasIRRCast[104:109],model="twoway",type="agreement",unit="average")
NasICCRatingAgreeWordAverbii3w <- icc(pharyngealsNasIRRCast[110:115],model="twoway",type="agreement",unit="average")
NasICCRatingAgreeWordAverbooshw <- icc(pharyngealsNasIRRCast[116:121],model="twoway",type="agreement",unit="average")
NasICCRatingAgreeWordAverdaasw <- icc(pharyngealsNasIRRCast[122:127],model="twoway",type="agreement",unit="average")
NasICCRatingAgreeWordAverdiinw <- icc(pharyngealsNasIRRCast[128:133],model="twoway",type="agreement",unit="average")
NasICCRatingAgreeWordAverdjuu3v <- icc(pharyngealsNasIRRCast[134:139],model="twoway",type="agreement",unit="average")
NasICCRatingAgreeWordAverdjuu3w <- icc(pharyngealsNasIRRCast[140:145],model="twoway",type="agreement",unit="average")
NasICCRatingAgreeWordAverdoomv <- icc(pharyngealsNasIRRCast[146:151],model="twoway",type="agreement",unit="average")
NasICCRatingAgreeWordAverdoomw <- icc(pharyngealsNasIRRCast[152:157],model="twoway",type="agreement",unit="average")
NasICCRatingAgreeWordAverloo7w <- icc(pharyngealsNasIRRCast[158:163],model="twoway",type="agreement",unit="average")
NasICCRatingAgreeWordAvermaatv <- icc(pharyngealsNasIRRCast[164:169],model="twoway",type="agreement",unit="average")
NasICCRatingAgreeWordAvermaatw <- icc(pharyngealsNasIRRCast[170:175],model="twoway",type="agreement",unit="average")
NasICCRatingAgreeWordAvermoozw <- icc(pharyngealsNasIRRCast[176:181],model="twoway",type="agreement",unit="average")
NasICCRatingAgreeWordAvermuunw <- icc(pharyngealsNasIRRCast[182:187],model="twoway",type="agreement",unit="average")
NasICCRatingAgreeWordAvermuusw <- icc(pharyngealsNasIRRCast[188:193],model="twoway",type="agreement",unit="average")
NasICCRatingAgreeWordAvernaa7v <- icc(pharyngealsNasIRRCast[194:199],model="twoway",type="agreement",unit="average")
NasICCRatingAgreeWordAvernaa7w <- icc(pharyngealsNasIRRCast[200:205],model="twoway",type="agreement",unit="average")
NasICCRatingAgreeWordAvernaamv <- icc(pharyngealsNasIRRCast[206:211],model="twoway",type="agreement",unit="average")
NasICCRatingAgreeWordAvernaamw <- icc(pharyngealsNasIRRCast[212:217],model="twoway",type="agreement",unit="average")
NasICCRatingAgreeWordAvernoo3v <- icc(pharyngealsNasIRRCast[218:223],model="twoway",type="agreement",unit="average")
NasICCRatingAgreeWordAvernoo3w <- icc(pharyngealsNasIRRCast[224:229],model="twoway",type="agreement",unit="average")
NasICCRatingAgreeWordAvernoomw <- icc(pharyngealsNasIRRCast[230:235],model="twoway",type="agreement",unit="average")
NasICCRatingAgreeWordAvernuu7v <- icc(pharyngealsNasIRRCast[236:241],model="twoway",type="agreement",unit="average")
NasICCRatingAgreeWordAvernuu7w <- icc(pharyngealsNasIRRCast[242:247],model="twoway",type="agreement",unit="average")
NasICCRatingAgreeWordAversaamv <- icc(pharyngealsNasIRRCast[248:253],model="twoway",type="agreement",unit="average")
NasICCRatingAgreeWordAversaamw <- icc(pharyngealsNasIRRCast[254:259],model="twoway",type="agreement",unit="average")
NasICCRatingAgreeWordAverzaa7w <- icc(pharyngealsNasIRRCast[260:265],model="twoway",type="agreement",unit="average")
NasICCRatingAgreeWordAverzii7w <- icc(pharyngealsNasIRRCast[266:271],model="twoway",type="agreement",unit="average")

3.1.5 Getting coefficients

Below, we use a a modified script that will allow us to get all coefficients from the models (thanks to Bodo Winter for sharing).

###########################################
#getting coefficients # Adapted from Bodo Winter
###########################################
## Get character vectors with all model names for full and null models:
all_models <- grep('ICCRating', ls(), value = T)
## Create an empty data frame to be filled with results from likelihood ratio tests:
resultsICC <- data.frame(Type = character(length(all_models)),
                              ICCVal = numeric(length(all_models)),
                              lowerConfInt = numeric(length(all_models)),
                              upperConfInt = numeric(length(all_models)),
                              pValue = numeric(length(all_models)),
                         stringsAsFactors=FALSE)
## Loop through model names and append do data frame:
for (i in 1:length(all_models)) {
  this_full <- get(all_models[i])
  
  resultsICC[i, ]$Type <- this_full$type
  resultsICC[i, ]$ICCVal <- this_full$value
  resultsICC[i, ]$lowerConfInt <- this_full$lbound
  resultsICC[i, ]$upperConfInt <- this_full$ubound
  resultsICC[i, ]$pValue <- this_full$p.value
}
rownames(resultsICC) <- gsub('ICCRating', 'ICCRating', all_models)
write.csv(resultsICC, file = "PhoneticaResultsICCRating.csv")

3.1.6 Reading and subsetting the ICC data

We have done some minor changes to the saved data-frame in terms of names, etc.. and so we read the data-frame again. We start by subsetting the data and creating four new data-frames for each of the VQ and Nasalisation experiments and the consistency and agreement. We then change factor levels.

PhoneticaICCRatingWord <- read.csv("PhoneticaICCRatingWord.csv")
# some subsetting
PhoneticaICCRatingWordNasAgree <- PhoneticaICCRatingWord[which(PhoneticaICCRatingWord$experiment =='Nasalisation'
                                                          & PhoneticaICCRatingWord$Type == 'agreement'),]
PhoneticaICCRatingWordNasCons <- PhoneticaICCRatingWord[which(PhoneticaICCRatingWord$experiment =='Nasalisation'
                                                               & PhoneticaICCRatingWord$Type == 'consistency'),]
PhoneticaICCRatingWordVQAgree <- PhoneticaICCRatingWord[which(PhoneticaICCRatingWord$experiment =='Voice Quality'
                                                               & PhoneticaICCRatingWord$Type == 'agreement'),]
PhoneticaICCRatingWordVQCons <- PhoneticaICCRatingWord[which(PhoneticaICCRatingWord$experiment =='Voice Quality'
                                                              & PhoneticaICCRatingWord$Type == 'consistency'),]
### below is to be used to change levels of factor after subsetting
PhoneticaICCRatingWordNasAgree$experiment <- factor(PhoneticaICCRatingWordNasAgree$experiment)
PhoneticaICCRatingWordNasAgree$Type <- factor(PhoneticaICCRatingWordNasAgree$Type)
PhoneticaICCRatingWordNasCons$experiment <- factor(PhoneticaICCRatingWordNasCons$experiment)
PhoneticaICCRatingWordNasCons$Type <- factor(PhoneticaICCRatingWordNasCons$Type)
PhoneticaICCRatingWordVQAgree$experiment <- factor(PhoneticaICCRatingWordVQAgree$experiment)
PhoneticaICCRatingWordVQAgree$Type <- factor(PhoneticaICCRatingWordVQAgree$Type)
PhoneticaICCRatingWordVQCons$experiment <- factor(PhoneticaICCRatingWordVQCons$experiment)
PhoneticaICCRatingWordVQCons$Type <- factor(PhoneticaICCRatingWordVQCons$Type)

3.1.7 Figures

Below we change the order of the four data-frame according to the ICC value from lowest to highest. We then reorder the factor level “context”. Then we change the name of each of the words into IPA (International Phonetic Alphabet). We create a new ordered factor and then we draw the figure.

3.1.7.1 Voice Quality (VQ)

We start with the first experiment on Voice Quality. Overall, the raters reported difficulties with their ratings of the voice quality experiment, mostly in deciding on the third category “tense”. This showed in their consistency and agreements

3.1.7.1.1 Consistency

We start with the consistency

3.1.7.1.1.1 Reordering and changing names
## Consistency voice quality 
ord.reRatingConsVQ <- PhoneticaICCRatingWordVQCons[order(PhoneticaICCRatingWordVQCons$ICCVal),]
rownames(ord.reRatingConsVQ) <- NULL
ord.reRatingConsVQ$context <- factor(ord.reRatingConsVQ$context)
ord.reRatingConsVQ$context <- as.character(ord.reRatingConsVQ$context)
ord.reRatingConsVQ$context[ord.reRatingConsVQ$context == "7aad-w"] <- "\u0127a:d"
ord.reRatingConsVQ$context[ord.reRatingConsVQ$context == "7eef-w"] <- "\u0127e:f"
ord.reRatingConsVQ$context[ord.reRatingConsVQ$context == "7eef-v"] <- "\u0127e:f-v"
ord.reRatingConsVQ$context[ord.reRatingConsVQ$context == "7en-w"] <- "\u0127enn"
ord.reRatingConsVQ$context[ord.reRatingConsVQ$context == "7ook-w"] <- "\u0127o:k"
ord.reRatingConsVQ$context[ord.reRatingConsVQ$context == "7oom-w"] <- "\u0127o:m"
ord.reRatingConsVQ$context[ord.reRatingConsVQ$context == "loo7-w"] <- "lo:\u0127"
ord.reRatingConsVQ$context[ord.reRatingConsVQ$context == "naa7-w"] <- "na:\u0127"
ord.reRatingConsVQ$context[ord.reRatingConsVQ$context == "naa7-v"] <- "na:\u0127-v"
ord.reRatingConsVQ$context[ord.reRatingConsVQ$context == "nuu7-w"] <- "nu:\u0127"
ord.reRatingConsVQ$context[ord.reRatingConsVQ$context == "nuu7-v"] <- "nu:\u0127-v"
ord.reRatingConsVQ$context[ord.reRatingConsVQ$context == "zaa7-w"] <- "za:\u0127"
ord.reRatingConsVQ$context[ord.reRatingConsVQ$context == "zii7-w"] <- "zi:\u0127"
ord.reRatingConsVQ$context[ord.reRatingConsVQ$context == "3aaf-w"] <- "ʕa:f"
ord.reRatingConsVQ$context[ord.reRatingConsVQ$context == "3aam-w"] <- "ʕa:m"
ord.reRatingConsVQ$context[ord.reRatingConsVQ$context == "3eeb-w"] <- "ʕe:b"
ord.reRatingConsVQ$context[ord.reRatingConsVQ$context == "3eeb-v"] <- "ʕe:b-v"
ord.reRatingConsVQ$context[ord.reRatingConsVQ$context == "3een-w"] <- "ʕe:n"
ord.reRatingConsVQ$context[ord.reRatingConsVQ$context == "3iish-w"] <- "ʕa:ʃ"
ord.reRatingConsVQ$context[ord.reRatingConsVQ$context == "3oo3-w"] <- "ʕo:ʕ"
ord.reRatingConsVQ$context[ord.reRatingConsVQ$context == "3oo3-v"] <- "ʕo:ʕ-v"
ord.reRatingConsVQ$context[ord.reRatingConsVQ$context == "3oon-w"] <- "ʕo:n"
ord.reRatingConsVQ$context[ord.reRatingConsVQ$context == "baa3-w"] <- "ba:ʕ"
ord.reRatingConsVQ$context[ord.reRatingConsVQ$context == "bii3-w"] <- "bi:ʕ"
ord.reRatingConsVQ$context[ord.reRatingConsVQ$context == "bii3-v"] <- "bi:ʕ-v"
ord.reRatingConsVQ$context[ord.reRatingConsVQ$context == "boosh-w"] <- "bo:ʃ"
ord.reRatingConsVQ$context[ord.reRatingConsVQ$context == "djuu3-w"] <- "d͡ʒu:ʕ"
ord.reRatingConsVQ$context[ord.reRatingConsVQ$context == "djuu3-v"] <- "d͡ʒu:ʕ-v"
ord.reRatingConsVQ$context[ord.reRatingConsVQ$context == "noo3-w"] <- "no:ʕ"
ord.reRatingConsVQ$context[ord.reRatingConsVQ$context == "noo3-v"] <- "no:ʕ-v"
ord.reRatingConsVQ$context[ord.reRatingConsVQ$context == "beet-w"] <- "be:t"
ord.reRatingConsVQ$context[ord.reRatingConsVQ$context == "daas-w"] <- "da:s"
ord.reRatingConsVQ$context[ord.reRatingConsVQ$context == "diin-w"] <- "di:n"
ord.reRatingConsVQ$context[ord.reRatingConsVQ$context == "doom-w"] <- "do:m"
ord.reRatingConsVQ$context[ord.reRatingConsVQ$context == "doom-v"] <- "do:m-v"
ord.reRatingConsVQ$context[ord.reRatingConsVQ$context == "beet-w"] <- "be:t"
ord.reRatingConsVQ$context[ord.reRatingConsVQ$context == "maat-w"] <- "ma:t"
ord.reRatingConsVQ$context[ord.reRatingConsVQ$context == "maat-v"] <- "ma:t-v"
ord.reRatingConsVQ$context[ord.reRatingConsVQ$context == "mooz-w"] <- "mo:z"
ord.reRatingConsVQ$context[ord.reRatingConsVQ$context == "muun-w"] <- "mu:n"
ord.reRatingConsVQ$context[ord.reRatingConsVQ$context == "muus-w"] <- "mu:s"
ord.reRatingConsVQ$context[ord.reRatingConsVQ$context == "naam-w"] <- "na:m"
ord.reRatingConsVQ$context[ord.reRatingConsVQ$context == "naam-v"] <- "na:m-v"
ord.reRatingConsVQ$context[ord.reRatingConsVQ$context == "noom-w"] <- "no:m"
ord.reRatingConsVQ$context[ord.reRatingConsVQ$context == "saam-w"] <- "sa:m"
ord.reRatingConsVQ$context[ord.reRatingConsVQ$context == "saam-v"] <- "sa:m-v"
ord.reRatingConsVQ$context[ord.reRatingConsVQ$context == "beet-w"] <- "be:t"
ord.reRatingConsVQ$context <- as.factor(ord.reRatingConsVQ$context)
#
ord.reRatingConsVQ$context <- as.vector(ord.reRatingConsVQ$context) #get rid of factors
ord.reRatingConsVQ$context = factor(ord.reRatingConsVQ$context,ord.reRatingConsVQ$context) #add ordered factors back
ord.reRatingConsVQ
3.1.7.1.1.2 Drawing the IRR figure

We use the code below to draw the ICC with confidence intervals for the consistency in rating voice quality.

## code below allows to draw the figure
par(oma = c(0, 0, 0, 0))
plot(1:45, ord.reRatingConsVQ$ICCVal, axes=FALSE, ylim=c(-3,1),
     ylab="ICC. 95% CI", xlab="",cex=2,cex.lab=1.5,cex.main=1.5,
     main="Consistency ICC for voice quality",cex.axis=1.5)
axis(2,cex.lab=2,cex.axis=1.5)
axis(1,at=1:45, labels = levels(ord.reRatingConsVQ$context), 
     las=2,cex.lab=1.5,cex.axis=1.5)
for(i in 1:45) segments(i,ord.reRatingConsVQ$lowerConfInt[i],
                        i,ord.reRatingConsVQ$upperConfInt[i])
abline(h = 0, lty=2)
abline(v = 32.5, lty=2)

As can be seen from the figure above, the rater were generally consistent in their ratings as all the words, minus the first 6 received positive ratings. The ratings for the last 12 words showed a consistently statistically significant positive rating.

3.1.7.1.2 Agreement

We move to the agreement between raters

3.1.7.1.2.1 Reordering and changing names
## Agreement Voice Quality 
ord.reRatingAgreeVQ <- PhoneticaICCRatingWordVQAgree[order(PhoneticaICCRatingWordVQAgree$ICCVal),]
rownames(ord.reRatingAgreeVQ) <- NULL
ord.reRatingAgreeVQ$context <- factor(ord.reRatingAgreeVQ$context)
ord.reRatingAgreeVQ$context <- as.character(ord.reRatingAgreeVQ$context)
ord.reRatingAgreeVQ$context[ord.reRatingAgreeVQ$context == "7aad-w"] <- "\u0127a:d"
ord.reRatingAgreeVQ$context[ord.reRatingAgreeVQ$context == "7eef-w"] <- "\u0127e:f"
ord.reRatingAgreeVQ$context[ord.reRatingAgreeVQ$context == "7eef-v"] <- "\u0127e:f-v"
ord.reRatingAgreeVQ$context[ord.reRatingAgreeVQ$context == "7en-w"] <- "\u0127enn"
ord.reRatingAgreeVQ$context[ord.reRatingAgreeVQ$context == "7ook-w"] <- "\u0127o:k"
ord.reRatingAgreeVQ$context[ord.reRatingAgreeVQ$context == "7oom-w"] <- "\u0127o:m"
ord.reRatingAgreeVQ$context[ord.reRatingAgreeVQ$context == "loo7-w"] <- "lo:\u0127"
ord.reRatingAgreeVQ$context[ord.reRatingAgreeVQ$context == "naa7-w"] <- "na:\u0127"
ord.reRatingAgreeVQ$context[ord.reRatingAgreeVQ$context == "naa7-v"] <- "na:\u0127-v"
ord.reRatingAgreeVQ$context[ord.reRatingAgreeVQ$context == "nuu7-w"] <- "nu:\u0127"
ord.reRatingAgreeVQ$context[ord.reRatingAgreeVQ$context == "nuu7-v"] <- "nu:\u0127-v"
ord.reRatingAgreeVQ$context[ord.reRatingAgreeVQ$context == "zaa7-w"] <- "za:\u0127"
ord.reRatingAgreeVQ$context[ord.reRatingAgreeVQ$context == "zii7-w"] <- "zi:\u0127"
ord.reRatingAgreeVQ$context[ord.reRatingAgreeVQ$context == "3aaf-w"] <- "ʕa:f"
ord.reRatingAgreeVQ$context[ord.reRatingAgreeVQ$context == "3aam-w"] <- "ʕa:m"
ord.reRatingAgreeVQ$context[ord.reRatingAgreeVQ$context == "3eeb-w"] <- "ʕe:b"
ord.reRatingAgreeVQ$context[ord.reRatingAgreeVQ$context == "3eeb-v"] <- "ʕe:b-v"
ord.reRatingAgreeVQ$context[ord.reRatingAgreeVQ$context == "3een-w"] <- "ʕe:n"
ord.reRatingAgreeVQ$context[ord.reRatingAgreeVQ$context == "3iish-w"] <- "ʕa:ʃ"
ord.reRatingAgreeVQ$context[ord.reRatingAgreeVQ$context == "3oo3-w"] <- "ʕo:ʕ"
ord.reRatingAgreeVQ$context[ord.reRatingAgreeVQ$context == "3oo3-v"] <- "ʕo:ʕ-v"
ord.reRatingAgreeVQ$context[ord.reRatingAgreeVQ$context == "3oon-w"] <- "ʕo:n"
ord.reRatingAgreeVQ$context[ord.reRatingAgreeVQ$context == "baa3-w"] <- "ba:ʕ"
ord.reRatingAgreeVQ$context[ord.reRatingAgreeVQ$context == "bii3-w"] <- "bi:ʕ"
ord.reRatingAgreeVQ$context[ord.reRatingAgreeVQ$context == "bii3-v"] <- "bi:ʕ-v"
ord.reRatingAgreeVQ$context[ord.reRatingAgreeVQ$context == "boosh-w"] <- "bo:ʃ"
ord.reRatingAgreeVQ$context[ord.reRatingAgreeVQ$context == "djuu3-w"] <- "d͡ʒu:ʕ"
ord.reRatingAgreeVQ$context[ord.reRatingAgreeVQ$context == "djuu3-v"] <- "d͡ʒu:ʕ-v"
ord.reRatingAgreeVQ$context[ord.reRatingAgreeVQ$context == "noo3-w"] <- "no:ʕ"
ord.reRatingAgreeVQ$context[ord.reRatingAgreeVQ$context == "noo3-v"] <- "no:ʕ-v"
ord.reRatingAgreeVQ$context[ord.reRatingAgreeVQ$context == "beet-w"] <- "be:t"
ord.reRatingAgreeVQ$context[ord.reRatingAgreeVQ$context == "daas-w"] <- "da:s"
ord.reRatingAgreeVQ$context[ord.reRatingAgreeVQ$context == "diin-w"] <- "di:n"
ord.reRatingAgreeVQ$context[ord.reRatingAgreeVQ$context == "doom-w"] <- "do:m"
ord.reRatingAgreeVQ$context[ord.reRatingAgreeVQ$context == "doom-v"] <- "do:m-v"
ord.reRatingAgreeVQ$context[ord.reRatingAgreeVQ$context == "beet-w"] <- "be:t"
ord.reRatingAgreeVQ$context[ord.reRatingAgreeVQ$context == "maat-w"] <- "ma:t"
ord.reRatingAgreeVQ$context[ord.reRatingAgreeVQ$context == "maat-v"] <- "ma:t-v"
ord.reRatingAgreeVQ$context[ord.reRatingAgreeVQ$context == "mooz-w"] <- "mo:z"
ord.reRatingAgreeVQ$context[ord.reRatingAgreeVQ$context == "muun-w"] <- "mu:n"
ord.reRatingAgreeVQ$context[ord.reRatingAgreeVQ$context == "muus-w"] <- "mu:s"
ord.reRatingAgreeVQ$context[ord.reRatingAgreeVQ$context == "naam-w"] <- "na:m"
ord.reRatingAgreeVQ$context[ord.reRatingAgreeVQ$context == "naam-v"] <- "na:m-v"
ord.reRatingAgreeVQ$context[ord.reRatingAgreeVQ$context == "noom-w"] <- "no:m"
ord.reRatingAgreeVQ$context[ord.reRatingAgreeVQ$context == "saam-w"] <- "sa:m"
ord.reRatingAgreeVQ$context[ord.reRatingAgreeVQ$context == "saam-v"] <- "sa:m-v"
ord.reRatingAgreeVQ$context[ord.reRatingAgreeVQ$context == "beet-w"] <- "be:t"
ord.reRatingAgreeVQ$context <- as.factor(ord.reRatingAgreeVQ$context)
ord.reRatingAgreeVQ$context <- as.vector(ord.reRatingAgreeVQ$context) #get rid of factors
ord.reRatingAgreeVQ$context = factor(ord.reRatingAgreeVQ$context,ord.reRatingAgreeVQ$context) #add ordered factors back
ord.reRatingAgreeVQ
3.1.7.1.2.2 Drawing the IRR figure
plot(1:45, ord.reRatingAgreeVQ$ICCVal, axes=FALSE, ylim=c(-1,1),
     ylab="ICC. 95% CI", xlab="",cex=2,cex.lab=1.5,cex.main=1.5,
     main="Agreement ICC for voice quality",cex.axis=1.5)
axis(2,cex.lab=2,cex.axis=1.5)
axis(1,at=1:45, labels = levels(ord.reRatingAgreeVQ$context), 
     las=2,cex.lab=1.5,cex.axis=1.5)
for(i in 1:45) segments(i,ord.reRatingAgreeVQ$lowerConfInt[i],
                        i,ord.reRatingAgreeVQ$upperConfInt[i])
abline(h = 0, lty=2)
abline(v = 33.5, lty=2)

As with the consistency above, the raters agreed among themselves on the majority of words as these received positive ICCs. The last 12 again received an agreement in ratings that was statistically significant. Some words containing pharyngeals, and specifically the voiced pharyngeal, receive positive ratings.

3.1.7.2 Nasalisation

We move to the second experiment on Nasalisation. Overall, this experiment was slightly easier for the raters as evidenced by the consistency and agreement in their ICC scores.

3.1.7.2.1 Consistency

We start with the consistency

3.1.7.2.1.1 Reordering and changing names
## Consistency nasalisation 
ord.reRatingConsNas <- PhoneticaICCRatingWordNasCons[order(PhoneticaICCRatingWordNasCons$ICCVal),]
rownames(ord.reRatingConsNas) <- NULL
ord.reRatingConsNas$context <- factor(ord.reRatingConsNas$context)
ord.reRatingConsNas$context <- as.character(ord.reRatingConsNas$context)
ord.reRatingConsNas$context[ord.reRatingConsNas$context == "7aad-w"] <- "\u0127a:d"
ord.reRatingConsNas$context[ord.reRatingConsNas$context == "7eef-w"] <- "\u0127e:f"
ord.reRatingConsNas$context[ord.reRatingConsNas$context == "7eef-v"] <- "\u0127e:f-v"
ord.reRatingConsNas$context[ord.reRatingConsNas$context == "7en-w"] <- "\u0127enn"
ord.reRatingConsNas$context[ord.reRatingConsNas$context == "7ook-w"] <- "\u0127o:k"
ord.reRatingConsNas$context[ord.reRatingConsNas$context == "7oom-w"] <- "\u0127o:m"
ord.reRatingConsNas$context[ord.reRatingConsNas$context == "loo7-w"] <- "lo:\u0127"
ord.reRatingConsNas$context[ord.reRatingConsNas$context == "naa7-w"] <- "na:\u0127"
ord.reRatingConsNas$context[ord.reRatingConsNas$context == "naa7-v"] <- "na:\u0127-v"
ord.reRatingConsNas$context[ord.reRatingConsNas$context == "nuu7-w"] <- "nu:\u0127"
ord.reRatingConsNas$context[ord.reRatingConsNas$context == "nuu7-v"] <- "nu:\u0127-v"
ord.reRatingConsNas$context[ord.reRatingConsNas$context == "zaa7-w"] <- "za:\u0127"
ord.reRatingConsNas$context[ord.reRatingConsNas$context == "zii7-w"] <- "zi:\u0127"
ord.reRatingConsNas$context[ord.reRatingConsNas$context == "3aaf-w"] <- "ʕa:f"
ord.reRatingConsNas$context[ord.reRatingConsNas$context == "3aam-w"] <- "ʕa:m"
ord.reRatingConsNas$context[ord.reRatingConsNas$context == "3eeb-w"] <- "ʕe:b"
ord.reRatingConsNas$context[ord.reRatingConsNas$context == "3eeb-v"] <- "ʕe:b-v"
ord.reRatingConsNas$context[ord.reRatingConsNas$context == "3een-w"] <- "ʕe:n"
ord.reRatingConsNas$context[ord.reRatingConsNas$context == "3iish-w"] <- "ʕa:ʃ"
ord.reRatingConsNas$context[ord.reRatingConsNas$context == "3oo3-w"] <- "ʕo:ʕ"
ord.reRatingConsNas$context[ord.reRatingConsNas$context == "3oo3-v"] <- "ʕo:ʕ-v"
ord.reRatingConsNas$context[ord.reRatingConsNas$context == "3oon-w"] <- "ʕo:n"
ord.reRatingConsNas$context[ord.reRatingConsNas$context == "baa3-w"] <- "ba:ʕ"
ord.reRatingConsNas$context[ord.reRatingConsNas$context == "bii3-w"] <- "bi:ʕ"
ord.reRatingConsNas$context[ord.reRatingConsNas$context == "bii3-v"] <- "bi:ʕ-v"
ord.reRatingConsNas$context[ord.reRatingConsNas$context == "boosh-w"] <- "bo:ʃ"
ord.reRatingConsNas$context[ord.reRatingConsNas$context == "djuu3-w"] <- "d͡ʒu:ʕ"
ord.reRatingConsNas$context[ord.reRatingConsNas$context == "djuu3-v"] <- "d͡ʒu:ʕ-v"
ord.reRatingConsNas$context[ord.reRatingConsNas$context == "noo3-w"] <- "no:ʕ"
ord.reRatingConsNas$context[ord.reRatingConsNas$context == "noo3-v"] <- "no:ʕ-v"
ord.reRatingConsNas$context[ord.reRatingConsNas$context == "beet-w"] <- "be:t"
ord.reRatingConsNas$context[ord.reRatingConsNas$context == "daas-w"] <- "da:s"
ord.reRatingConsNas$context[ord.reRatingConsNas$context == "diin-w"] <- "di:n"
ord.reRatingConsNas$context[ord.reRatingConsNas$context == "doom-w"] <- "do:m"
ord.reRatingConsNas$context[ord.reRatingConsNas$context == "doom-v"] <- "do:m-v"
ord.reRatingConsNas$context[ord.reRatingConsNas$context == "beet-w"] <- "be:t"
ord.reRatingConsNas$context[ord.reRatingConsNas$context == "maat-w"] <- "ma:t"
ord.reRatingConsNas$context[ord.reRatingConsNas$context == "maat-v"] <- "ma:t-v"
ord.reRatingConsNas$context[ord.reRatingConsNas$context == "mooz-w"] <- "mo:z"
ord.reRatingConsNas$context[ord.reRatingConsNas$context == "muun-w"] <- "mu:n"
ord.reRatingConsNas$context[ord.reRatingConsNas$context == "muus-w"] <- "mu:s"
ord.reRatingConsNas$context[ord.reRatingConsNas$context == "naam-w"] <- "na:m"
ord.reRatingConsNas$context[ord.reRatingConsNas$context == "naam-v"] <- "na:m-v"
ord.reRatingConsNas$context[ord.reRatingConsNas$context == "noom-w"] <- "no:m"
ord.reRatingConsNas$context[ord.reRatingConsNas$context == "saam-w"] <- "sa:m"
ord.reRatingConsNas$context[ord.reRatingConsNas$context == "saam-v"] <- "sa:m-v"
ord.reRatingConsNas$context[ord.reRatingConsNas$context == "beet-w"] <- "be:t"
ord.reRatingConsNas$context <- as.factor(ord.reRatingConsNas$context)
ord.reRatingConsNas$context <- as.vector(ord.reRatingConsNas$context) #get rid of factors
ord.reRatingConsNas$context = factor(ord.reRatingConsNas$context,ord.reRatingConsNas$context) #add ordered factors back
ord.reRatingConsNas
3.1.7.2.1.2 Drawing the IRR figure
par(oma = c(0, 0, 0, 0))
plot(1:45, ord.reRatingConsNas$ICCVal, axes=FALSE, ylim=c(-1,1),
     ylab="ICC. 95% CI", xlab="",cex=2,cex.lab=1.5,cex.main=1.5,
     main="Consistency ICC for nasalisation",cex.axis=1.5)
axis(2,cex.lab=2,cex.axis=1.5)
axis(1,at=1:45, labels = levels(ord.reRatingConsNas$context), 
     las=2,cex.lab=1.5,cex.axis=1.5)
for(i in 1:45) segments(i,ord.reRatingConsNas$lowerConfInt[i],
                        i,ord.reRatingConsNas$upperConfInt[i])
abline(h = 0, lty=2)
abline(v = 21.5, lty=2)

The nasalisation experiment was somehow “easier” to raters as they were always consistent in their ratings with only two words received negative ICCs and nearly half of the words showing a statistically significant positive rating.

3.1.7.2.2 Agreement

We move to the agreement

3.1.7.2.2.1 Reordering and changing names
## Agreement nasalisation 
ord.reRatingAgreeNas <- PhoneticaICCRatingWordNasAgree[order(PhoneticaICCRatingWordNasAgree$ICCVal),]
rownames(ord.reRatingAgreeNas) <- NULL
ord.reRatingAgreeNas$context <- factor(ord.reRatingAgreeNas$context)
ord.reRatingAgreeNas$context <- as.character(ord.reRatingAgreeNas$context)
ord.reRatingAgreeNas$context[ord.reRatingAgreeNas$context == "7aad-w"] <- "\u0127a:d"
ord.reRatingAgreeNas$context[ord.reRatingAgreeNas$context == "7eef-w"] <- "\u0127e:f"
ord.reRatingAgreeNas$context[ord.reRatingAgreeNas$context == "7eef-v"] <- "\u0127e:f-v"
ord.reRatingAgreeNas$context[ord.reRatingAgreeNas$context == "7en-w"] <- "\u0127enn"
ord.reRatingAgreeNas$context[ord.reRatingAgreeNas$context == "7ook-w"] <- "\u0127o:k"
ord.reRatingAgreeNas$context[ord.reRatingAgreeNas$context == "7oom-w"] <- "\u0127o:m"
ord.reRatingAgreeNas$context[ord.reRatingAgreeNas$context == "loo7-w"] <- "lo:\u0127"
ord.reRatingAgreeNas$context[ord.reRatingAgreeNas$context == "naa7-w"] <- "na:\u0127"
ord.reRatingAgreeNas$context[ord.reRatingAgreeNas$context == "naa7-v"] <- "na:\u0127-v"
ord.reRatingAgreeNas$context[ord.reRatingAgreeNas$context == "nuu7-w"] <- "nu:\u0127"
ord.reRatingAgreeNas$context[ord.reRatingAgreeNas$context == "nuu7-v"] <- "nu:\u0127-v"
ord.reRatingAgreeNas$context[ord.reRatingAgreeNas$context == "zaa7-w"] <- "za:\u0127"
ord.reRatingAgreeNas$context[ord.reRatingAgreeNas$context == "zii7-w"] <- "zi:\u0127"
ord.reRatingAgreeNas$context[ord.reRatingAgreeNas$context == "3aaf-w"] <- "ʕa:f"
ord.reRatingAgreeNas$context[ord.reRatingAgreeNas$context == "3aam-w"] <- "ʕa:m"
ord.reRatingAgreeNas$context[ord.reRatingAgreeNas$context == "3eeb-w"] <- "ʕe:b"
ord.reRatingAgreeNas$context[ord.reRatingAgreeNas$context == "3eeb-v"] <- "ʕe:b-v"
ord.reRatingAgreeNas$context[ord.reRatingAgreeNas$context == "3een-w"] <- "ʕe:n"
ord.reRatingAgreeNas$context[ord.reRatingAgreeNas$context == "3iish-w"] <- "ʕa:ʃ"
ord.reRatingAgreeNas$context[ord.reRatingAgreeNas$context == "3oo3-w"] <- "ʕo:ʕ"
ord.reRatingAgreeNas$context[ord.reRatingAgreeNas$context == "3oo3-v"] <- "ʕo:ʕ-v"
ord.reRatingAgreeNas$context[ord.reRatingAgreeNas$context == "3oon-w"] <- "ʕo:n"
ord.reRatingAgreeNas$context[ord.reRatingAgreeNas$context == "baa3-w"] <- "ba:ʕ"
ord.reRatingAgreeNas$context[ord.reRatingAgreeNas$context == "bii3-w"] <- "bi:ʕ"
ord.reRatingAgreeNas$context[ord.reRatingAgreeNas$context == "bii3-v"] <- "bi:ʕ-v"
ord.reRatingAgreeNas$context[ord.reRatingAgreeNas$context == "boosh-w"] <- "bo:ʃ"
ord.reRatingAgreeNas$context[ord.reRatingAgreeNas$context == "djuu3-w"] <- "d͡ʒu:ʕ"
ord.reRatingAgreeNas$context[ord.reRatingAgreeNas$context == "djuu3-v"] <- "d͡ʒu:ʕ-v"
ord.reRatingAgreeNas$context[ord.reRatingAgreeNas$context == "noo3-w"] <- "no:ʕ"
ord.reRatingAgreeNas$context[ord.reRatingAgreeNas$context == "noo3-v"] <- "no:ʕ-v"
ord.reRatingAgreeNas$context[ord.reRatingAgreeNas$context == "beet-w"] <- "be:t"
ord.reRatingAgreeNas$context[ord.reRatingAgreeNas$context == "daas-w"] <- "da:s"
ord.reRatingAgreeNas$context[ord.reRatingAgreeNas$context == "diin-w"] <- "di:n"
ord.reRatingAgreeNas$context[ord.reRatingAgreeNas$context == "doom-w"] <- "do:m"
ord.reRatingAgreeNas$context[ord.reRatingAgreeNas$context == "doom-v"] <- "do:m-v"
ord.reRatingAgreeNas$context[ord.reRatingAgreeNas$context == "beet-w"] <- "be:t"
ord.reRatingAgreeNas$context[ord.reRatingAgreeNas$context == "maat-w"] <- "ma:t"
ord.reRatingAgreeNas$context[ord.reRatingAgreeNas$context == "maat-v"] <- "ma:t-v"
ord.reRatingAgreeNas$context[ord.reRatingAgreeNas$context == "mooz-w"] <- "mo:z"
ord.reRatingAgreeNas$context[ord.reRatingAgreeNas$context == "muun-w"] <- "mu:n"
ord.reRatingAgreeNas$context[ord.reRatingAgreeNas$context == "muus-w"] <- "mu:s"
ord.reRatingAgreeNas$context[ord.reRatingAgreeNas$context == "naam-w"] <- "na:m"
ord.reRatingAgreeNas$context[ord.reRatingAgreeNas$context == "naam-v"] <- "na:m-v"
ord.reRatingAgreeNas$context[ord.reRatingAgreeNas$context == "noom-w"] <- "no:m"
ord.reRatingAgreeNas$context[ord.reRatingAgreeNas$context == "saam-w"] <- "sa:m"
ord.reRatingAgreeNas$context[ord.reRatingAgreeNas$context == "saam-v"] <- "sa:m-v"
ord.reRatingAgreeNas$context[ord.reRatingAgreeNas$context == "beet-w"] <- "be:t"
ord.reRatingAgreeNas$context <- as.factor(ord.reRatingAgreeNas$context)
ord.reRatingAgreeNas$context <- as.vector(ord.reRatingAgreeNas$context) #get rid of factors
ord.reRatingAgreeNas$context = factor(ord.reRatingAgreeNas$context,ord.reRatingAgreeNas$context) #add ordered factors back
ord.reRatingAgreeNas
3.1.7.2.2.2 Drawing the IRR figure
par(oma = c(0, 0, 0, 0))
plot(1:45, ord.reRatingAgreeNas$ICCVal, axes=FALSE, ylim=c(-1,1),
     ylab="ICC. 95% CI", xlab="",cex=2,cex.lab=1.5,cex.main=1.5,
     main="Agreement ICC for nasalisation",cex.axis=1.5)
axis(2,cex.lab=2,cex.axis=1.5)
axis(1,at=1:45, labels = levels(ord.reRatingAgreeNas$context), 
     las=2,cex.lab=1.5,cex.axis=1.5)
for(i in 1:45) segments(i,ord.reRatingAgreeNas$lowerConfInt[i],
                        i,ord.reRatingAgreeNas$upperConfInt[i])
abline(h = 0, lty=2)
abline(v = 20.5, lty=2)

Again, only the last two words showed a negative agreement between raters, with nearly half of the words receiving a statistically significant positive rating. And as expected, most of the words having nasal sounds sounds, received the highest ratings, with some having both nasals and pharyngeals receiving positive ratings.

3.1.8 Conclusion

Given the level of variance observed in the ICC scores for both consistency and agreements, it was necessary to use a statistical technique that takes into account this. It is possible that the raters were variables in some of their responses due to variable productions by the producing subjects and/or by the inherent differences between the raters.
Below we report on the results of the Cumulative Logit Mixed Model with subjects, raters and items as random effects.

3.2 Cumulative Logit Mixed Models (clmm)

The data were analysed using Cumulative Link Mixed Models (CLMM) using the “ordinal” package.

Given the structure of the data, we used a random effects structure to account for the design. A crossed random effects structure (for the producing subjects, the raters and the items) was used. A by-rater random slope for Context was used as it improved the model fit compared to a model with it.

Our outcome is the response entered as a factor (3 for Voice Quality; 5 for Nasalisation). Our predictor was Context with the reference level being set to “Isolation”.

We compared various combinations, e.g., by subject and item random slopes; interactions with vowel, etc. and all these did not improve the model fit. Hence the models reported below are the optimal ones

3.2.1 Models

3.2.1.1 Loading packages

Start by loading packages and install those that are not installed

requiredPackages = c('ordinal')
for(p in requiredPackages){
  if(!require(p,character.only = TRUE)) install.packages(p)
  library(p,character.only = TRUE)
}

3.2.1.2 Reading the data

We then read in the data and look at the structure to verify the class of each column.

percVQDF <- read.csv("percVQDF.csv")
percNasDF <- read.csv("percNasDF.csv")
str(percVQDF)
'data.frame':   2430 obs. of  6 variables:
 $ X       : int  1 2 3 4 5 6 7 8 9 10 ...
 $ Response: int  3 2 3 3 3 2 3 3 3 3 ...
 $ Context : Factor w/ 14 levels "3--3","3-n","3-o",..: 7 6 11 6 8 6 1 6 12 11 ...
 $ Subject : Factor w/ 9 levels "p01","p02","p03",..: 4 4 4 4 4 4 4 4 4 4 ...
 $ Item    : Factor w/ 45 levels "3aaf-w","3aam-w",..: 38 37 24 23 41 40 8 7 27 19 ...
 $ Rater   : Factor w/ 6 levels "R01","R02","R03",..: 2 2 2 2 2 2 2 2 2 2 ...
str(percNasDF)
'data.frame':   2430 obs. of  6 variables:
 $ X       : int  1 2 3 4 5 6 7 8 9 10 ...
 $ Response: int  4 4 4 3 3 4 2 3 2 4 ...
 $ Context : Factor w/ 14 levels "3--3","3-n","3-o",..: 7 6 11 6 8 6 1 6 12 11 ...
 $ Subject : Factor w/ 9 levels "p01","p02","p03",..: 4 4 4 4 4 4 4 4 4 4 ...
 $ Item    : Factor w/ 45 levels "3aaf-w","3aam-w",..: 38 37 24 23 41 40 8 7 27 19 ...
 $ Rater   : Factor w/ 6 levels "R01","R02","R03",..: 2 2 2 2 2 2 2 2 2 2 ...

3.2.1.3 Changing a few things

We are changing a few things in both data-frames

  1. Changing type of “response” to factor to suite the Cumulative Logit Mixed Model

  2. Checking the levels of Context and changing the reference category to “Isolation”

  3. Creating a new variable “ContextIPA” that contains the IPA symbols to be plotted in the figures below

# factor level
percVQDF$Response <- as.factor(percVQDF$Response)
percNasDF$Response <- as.factor(percNasDF$Response)
# Changing the reference level
levels(percVQDF$Context)
 [1] "3--3"      "3-n"       "3-o"       "7-n"       "7-o"       "isolation"
 [7] "n-3"       "n-7"       "n-n"       "n-o"       "o-3"       "o-7"      
[13] "o-n"       "o-o"      
percVQDF$Context <- relevel(percVQDF$Context, ref="isolation")
levels(percNasDF$Context)
 [1] "3--3"      "3-n"       "3-o"       "7-n"       "7-o"       "isolation"
 [7] "n-3"       "n-7"       "n-n"       "n-o"       "o-3"       "o-7"      
[13] "o-n"       "o-o"      
percNasDF$Context <- relevel(percNasDF$Context, ref="isolation")
# Creating a new variable "ContextIPA"
## for Voice Quallity
percVQDF$ContextIPA <- percVQDF$Context
percVQDF$ContextIPA <- as.character(percVQDF$ContextIPA)
percVQDF$ContextIPA[percVQDF$ContextIPA == "7-o"] <- "\u0127-o"
percVQDF$ContextIPA[percVQDF$ContextIPA == "o-7"] <- "o-\u0127"
percVQDF$ContextIPA[percVQDF$ContextIPA == "7-n"] <- "\u0127-n"
percVQDF$ContextIPA[percVQDF$ContextIPA == "n-7"] <- "n-\u0127"
percVQDF$ContextIPA[percVQDF$ContextIPA == "3-o"] <- "ʕ-o"
percVQDF$ContextIPA[percVQDF$ContextIPA == "o-3"] <- "o-ʕ"
percVQDF$ContextIPA[percVQDF$ContextIPA == "3-n"] <- "ʕ-n"
percVQDF$ContextIPA[percVQDF$ContextIPA == "n-3"] <- "n-ʕ"
percVQDF$ContextIPA[percVQDF$ContextIPA == "3--3"] <- "ʕ-ʕ"
percVQDF$ContextIPA[percVQDF$ContextIPA == "isolation"] <- "Isolation"
percVQDF$ContextIPA <- as.factor(percVQDF$ContextIPA)
percVQDF$ContextIPA <- relevel(percVQDF$ContextIPA, ref="Isolation")
levels(percVQDF$ContextIPA)
 [1] "Isolation" "ʕ-ʕ"       "ʕ-n"       "ʕ-o"       "ħ-n"       "ħ-o"      
 [7] "n-ʕ"       "n-ħ"       "n-n"       "n-o"       "o-ʕ"       "o-ħ"      
[13] "o-n"       "o-o"      
# reordering levels of predictor
percVQDF$Context <- factor(percVQDF$Context, levels = c("isolation","7-n","7-o","n-7","n-n","n-o","n-3","o-7","o-n","o-o","o-3","3-n","3-o","3--3"))
percVQDF$ContextIPA <- factor(percVQDF$ContextIPA, levels = c("Isolation","\u0127-n","\u0127-o","n-\u0127","n-n","n-o","n-ʕ","o-\u0127","o-n","o-o","o-ʕ","ʕ-n","ʕ-o","ʕ-ʕ"))
levels(percVQDF$Context)
 [1] "isolation" "7-n"       "7-o"       "n-7"       "n-n"       "n-o"      
 [7] "n-3"       "o-7"       "o-n"       "o-o"       "o-3"       "3-n"      
[13] "3-o"       "3--3"     
levels(percVQDF$ContextIPA)
 [1] "Isolation" "ħ-n"       "ħ-o"       "n-ħ"       "n-n"       "n-o"      
 [7] "n-ʕ"       "o-ħ"       "o-n"       "o-o"       "o-ʕ"       "ʕ-n"      
[13] "ʕ-o"       "ʕ-ʕ"      
## for Nasalisation
percNasDF$ContextIPA <- percNasDF$Context
percNasDF$ContextIPA <- as.character(percNasDF$ContextIPA)
percNasDF$ContextIPA[percNasDF$ContextIPA == "7-o"] <- "\u0127-o"
percNasDF$ContextIPA[percNasDF$ContextIPA == "o-7"] <- "o-\u0127"
percNasDF$ContextIPA[percNasDF$ContextIPA == "7-n"] <- "\u0127-n"
percNasDF$ContextIPA[percNasDF$ContextIPA == "n-7"] <- "n-\u0127"
percNasDF$ContextIPA[percNasDF$ContextIPA == "3-o"] <- "ʕ-o"
percNasDF$ContextIPA[percNasDF$ContextIPA == "o-3"] <- "o-ʕ"
percNasDF$ContextIPA[percNasDF$ContextIPA == "3-n"] <- "ʕ-n"
percNasDF$ContextIPA[percNasDF$ContextIPA == "n-3"] <- "n-ʕ"
percNasDF$ContextIPA[percNasDF$ContextIPA == "3--3"] <- "ʕ-ʕ"
percNasDF$ContextIPA[percNasDF$ContextIPA == "isolation"] <- "Isolation"
percNasDF$ContextIPA <- as.factor(percNasDF$ContextIPA)
percNasDF$ContextIPA <- relevel(percNasDF$ContextIPA, ref="Isolation")
levels(percNasDF$ContextIPA)
 [1] "Isolation" "ʕ-ʕ"       "ʕ-n"       "ʕ-o"       "ħ-n"       "ħ-o"      
 [7] "n-ʕ"       "n-ħ"       "n-n"       "n-o"       "o-ʕ"       "o-ħ"      
[13] "o-n"       "o-o"      
# reordering levels of predictor
percNasDF$Context <- factor(percNasDF$Context, levels = c("isolation","7-n","7-o","n-7","n-n","n-o","n-3","o-7","o-n","o-o","o-3","3-n","3-o","3--3"))
percNasDF$ContextIPA <- factor(percNasDF$ContextIPA, levels = c("Isolation","\u0127-n","\u0127-o","n-\u0127","n-n","n-o","n-ʕ","o-\u0127","o-n","o-o","o-ʕ","ʕ-n","ʕ-o","ʕ-ʕ"))
levels(percNasDF$Context)
 [1] "isolation" "7-n"       "7-o"       "n-7"       "n-n"       "n-o"      
 [7] "n-3"       "o-7"       "o-n"       "o-o"       "o-3"       "3-n"      
[13] "3-o"       "3--3"     
levels(percNasDF$ContextIPA)
 [1] "Isolation" "ħ-n"       "ħ-o"       "n-ħ"       "n-n"       "n-o"      
 [7] "n-ʕ"       "o-ħ"       "o-n"       "o-o"       "o-ʕ"       "ʕ-n"      
[13] "ʕ-o"       "ʕ-ʕ"      

3.2.2 Model specifications

As can be seem from the results of system time, it took roungly one hour to run the first model with a 4-Core machine running Microsoft R Open version 3.5.0 that ran the model using parallel computing (total around 4:30 hours). With the base R, it may take at least double this time to run, if not more given that with base R, only one core is used (unless specifically using parallel computing).

3.2.2.1 Voice Quality (VQ)

Below is our model specification for the full model that improved the model fit (we have tried various combinations, including by-Subject and by-Item random slopes for context; adding vowel as a fixed and random slope; consonant*vowel interactions, etc. However all these models either did not converge or did not improve the model fit compared to our model below)

3.2.2.1.1 Full model
system.time(fullCLMMVQSlope <- clmm(Response ~ Context + (1|Subject)+(1|Item)+(Context|Rater), data=percVQDF))
    user   system  elapsed 
12092.34  1770.03  3481.42 
3.2.2.1.2 Null model
system.time(fullCLMMVQNull <- clmm(Response ~ 1 + (1|Subject)+(1|Item)+(Context|Rater), data=percVQDF))
   user  system elapsed 
2465.16    0.18 2467.66 

3.2.2.2 Nasalisation

Below is our model specification for the full model that improved the model fit (we have tried various combinations, including by-Subject and by-Item random slopes for context; adding vowel as a fixed and random slope; consonant*vowel interactions, etc. However all these models either did not converge or did not improve the model fit compared to our model below)

3.2.2.2.1 Full model
system.time(fullCLMMNasSlope <- clmm(Response ~ Context + (1|Subject)+(1|Item)+(Context|Rater), data=percNasDF))
    user   system  elapsed 
14250.61  2189.17  4125.80 
3.2.2.2.2 Null model
system.time(fullCLMMNasNull <- clmm(Response ~ 1 + (1|Subject)+(1|Item)+(Context|Rater), data=percNasDF))
   user  system elapsed 
4406.65    1.21 4422.56 

3.2.3 Results

The results below are divided into those on Voice Quality (VQ) followed by those on Nasalisation.

3.2.3.1 Voice Quality (VQ)

3.2.3.1.1 Model comparisons

Through model comparison between the optimal model and the null model (aka Intercept only model), the results show that using our optimal model improved the model fit.

anova(fullCLMMVQNull,fullCLMMVQSlope)
Likelihood ratio tests of cumulative link models:
 

                no.par    AIC  logLik LR.stat df Pr(>Chisq)  
fullCLMMVQNull     109 4019.0 -1900.5                        
fullCLMMVQSlope    122 4024.2 -1890.1  20.773 13    0.07754 .
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
3.2.3.1.2 Summary

Next the summary presented below shows the results for each of the coefficients (minus the Intercept) and of the thresholds (1|2 and 2|3).

Starting with the threshlods, the results show that overall, a decrease in ratings of tense voice quality is obtained for ratings between 1 and 2, which increases with ratings between 2 to 3. The coefficients of the 12 levels of the fixed effect “Context” show either negative or positive values. The negative ones indicate that the ratings of “tense” are decreased in these contexts (e.g., o-o or n-o) which obtained lower betas compared to the reference value “Isolation”. All positive values are associated with increase in ratings of “tense” voice quality, though some are not statistically significant.

summary(fullCLMMVQSlope)
Cumulative Link Mixed Model fitted with the Laplace approximation

formula: Response ~ Context + (1 | Subject) + (1 | Item) + (Context |      Rater)
data:    percVQDF

Random effects:
 Groups  Name        Variance Std.Dev. Corr                                     
 Item    (Intercept) 0.15224  0.3902                                            
 Subject (Intercept) 0.21167  0.4601                                            
 Rater   (Intercept) 0.87299  0.9343                                            
         Context7-n  0.72657  0.8524   -0.501                                   
         Context7-o  0.96219  0.9809   -0.471  0.960                            
         Contextn-7  0.83035  0.9112    0.004  0.642  0.748                     
         Contextn-n  0.08637  0.2939   -0.357  0.951  0.957  0.812              
         Contextn-o  0.68494  0.8276   -0.677  0.772  0.597  0.137  0.644       
         Contextn-3  0.56401  0.7510    0.549  0.302  0.342  0.750  0.435 -0.179
         Contexto-7  0.22833  0.4778   -0.433  0.686  0.775  0.870  0.771  0.318
         Contexto-n  0.14326  0.3785    0.219 -0.912 -0.811 -0.489 -0.842 -0.738
         Contexto-o  0.12513  0.3537   -0.760  0.230  0.373  0.170  0.178  0.092
         Contexto-3  0.78046  0.8834   -0.299  0.206  0.394  0.663  0.337 -0.169
         Context3-n  0.75679  0.8699   -0.657  0.821  0.910  0.705  0.815  0.477
         Context3-o  0.29034  0.5388   -0.528  0.765  0.906  0.687  0.789  0.337
         Context3--3 2.58037  1.6064   -0.148  0.842  0.933  0.849  0.918  0.342
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
  0.444                                           
 -0.387 -0.389                                    
 -0.344  0.558  0.154                             
  0.273  0.833  0.160  0.724                      
  0.188  0.894 -0.530  0.703  0.678               
  0.173  0.777 -0.510  0.654  0.610  0.945        
  0.550  0.709 -0.754  0.189  0.388  0.783  0.859 
Number of groups:  Item 45,  Subject 9,  Rater 6 

Coefficients:
             Estimate Std. Error z value Pr(>|z|)    
Context7-n   0.991035   0.511102   1.939 0.052499 .  
Context7-o   1.351805   0.511351   2.644 0.008203 ** 
Contextn-7   1.227045   0.533426   2.300 0.021431 *  
Contextn-n   0.081502   0.334631   0.244 0.807573    
Contextn-o  -0.161309   0.460430  -0.350 0.726080    
Contextn-3   0.969618   0.605949   1.600 0.109562    
Contexto-7   1.088271   0.369180   2.948 0.003200 ** 
Contexto-n   0.218397   0.346296   0.631 0.528259    
Contexto-o  -0.005013   0.343046  -0.015 0.988340    
Contexto-3   1.421408   0.479182   2.966 0.003014 ** 
Context3-n   1.679047   0.475315   3.532 0.000412 ***
Context3-o   2.536368   0.396778   6.392 1.63e-10 ***
Context3--3  3.001442   0.967364   3.103 0.001918 ** 
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Threshold coefficients:
    Estimate Std. Error z value
1|2  -2.0512     0.4378  -4.685
2|3   1.6294     0.4365   3.732
3.2.3.1.3 Figure

The summary of the results showed some statistically significant coefficients that displayed an association with increased ratings of “tense”. To allow us to visualise the ratings, we use the script below, which is a modified version of two scripts (see references in article).

The “beta” is the coefficient for each level of the fixed effect “Context” and “Theta” is the coefficient for each threshold of the ratings “Response”, 1|2, 2|3, etc…

## below changes the margins
par(oma=c(1, 0, 0, 3),mgp=c(2, 1, 0))
xlimVQ = c(min(fullCLMMVQSlope$beta), max(fullCLMMVQSlope$beta))
ylimVQ = c(0,1)
plot(0,0,xlim=xlimVQ, ylim=ylimVQ, type="n", ylab=expression(Probability), xlab="", xaxt = "n",main="Predicted curves - Voice Quality",cex=2,cex.lab=1.5,cex.main=1.5,cex.axis=1.5)
axis(side = 1, at = c(0,fullCLMMVQSlope$beta),labels = levels(percVQDF$ContextIPA), las=2,cex=2,cex.lab=1.5,cex.axis=1.5)
xsVQ = seq(xlimVQ[1], xlimVQ[2], length.out=100)
lines(xsVQ, plogis(fullCLMMVQSlope$Theta[1] - xsVQ), col='black')
lines(xsVQ, plogis(fullCLMMVQSlope$Theta[2] - xsVQ)-plogis(fullCLMMVQSlope$Theta[1] - xsVQ), col='red')
lines(xsVQ, 1- (plogis(fullCLMMVQSlope$Theta[2] - xsVQ)), col='blue')
abline(v=c(0,fullCLMMVQSlope$beta),lty=3)
abline(h=0, lty="dashed")
abline(h=1, lty="dashed")
legend(par('usr')[2], par('usr')[4], bty='n', xpd=NA,lty=1, col=c("black", "red", "blue"), 
       legend=c("Breathy", "Modal", "Tense"),cex=0.75)

The figure above show that ratings of “Breathy” received less than 15% specifically and this was mainly either in the “Isolation” context or contexts with nasal consonants. This same group showed increase in ratings of “Modal” voice at a rate close to 75%. Ratings associated with the “Tense” voice increased steadily from this first group until reaching the pharyngeal contexts, with the highest ratings of “Tense” being present in /ʕ-ʕ/ context at a rate of 80%, with the remaining 20% being associated with “Modal” voice

3.2.3.2 Nasalisation

3.2.3.2.1 Model comparisons

With Nasalisation, model comparisons showed again an improvement of the model fit with our optimal model.

anova(fullCLMMNasNull,fullCLMMNasSlope)
Likelihood ratio tests of cumulative link models:
 

                 no.par    AIC  logLik LR.stat df Pr(>Chisq)  
fullCLMMNasNull     111 6016.0 -2897.0                        
fullCLMMNasSlope    124 6014.9 -2883.5  27.103 13    0.01204 *
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
3.2.3.2.2 Summary

The summary of the model showed again a steady increase in ratings associated with nasal from 1 to 5. Ratings of 1|2 and 2|3 are not statistically significant; those from 3 to 5 are statistically and significantly associated with nasalisation. The coefficients of the 12 levels of the fixed effect are either negative, i.e., not associated with ratings of nasalisation, specifically when an oral context is in initial position, or when a pharyngeal is associated with an oral context. When pharyngeals are associated with nasals, ratings of nasalisation are increased.

summary(fullCLMMNasSlope)
Cumulative Link Mixed Model fitted with the Laplace approximation

formula: Response ~ Context + (1 | Subject) + (1 | Item) + (Context |      Rater)
data:    percNasDF

Random effects:
 Groups  Name        Variance Std.Dev. Corr                                     
 Item    (Intercept) 0.08327  0.2886                                            
 Subject (Intercept) 0.08686  0.2947                                            
 Rater   (Intercept) 2.06158  1.4358                                            
         Context7-n  1.23832  1.1128   -0.977                                   
         Context7-o  0.40683  0.6378    0.060  0.076                            
         Contextn-7  1.09881  1.0482   -0.959  0.907 -0.141                     
         Contextn-n  1.12499  1.0607   -0.947  0.944  0.015  0.966              
         Contextn-o  1.89869  1.3779   -0.988  0.972  0.033  0.952  0.963       
         Contextn-3  1.18456  1.0884   -0.936  0.921  0.146  0.951  0.972  0.970
         Contexto-7  0.13583  0.3685   -0.104  0.090  0.669  0.206  0.227  0.205
         Contexto-n  0.45232  0.6726   -0.856  0.857  0.270  0.841  0.902  0.926
         Contexto-o  0.22277  0.4720   -0.823  0.855  0.463  0.812  0.874  0.872
         Contexto-3  0.20164  0.4490    0.302 -0.322  0.564 -0.149 -0.153 -0.221
         Context3-n  0.48303  0.6950   -0.697  0.782  0.632  0.588  0.716  0.773
         Context3-o  0.91593  0.9570    0.517 -0.383  0.876 -0.544 -0.391 -0.429
         Context3--3 2.11385  1.4539    0.663 -0.562  0.692 -0.777 -0.682 -0.601
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
  0.406                                           
  0.958  0.462                                    
  0.938  0.583  0.915                             
  0.004  0.894  0.033  0.202                      
  0.793  0.480  0.877  0.900  0.071               
 -0.293  0.529 -0.161  0.029  0.640  0.207        
 -0.562  0.251 -0.386 -0.287  0.392  0.014  0.853 
Number of groups:  Item 45,  Subject 9,  Rater 6 

Coefficients:
            Estimate Std. Error z value Pr(>|z|)    
Context7-n    2.9132     0.5458   5.337 9.43e-08 ***
Context7-o    0.2361     0.3665   0.644   0.5194    
Contextn-7    3.0051     0.5272   5.700 1.20e-08 ***
Contextn-n    4.0126     0.5105   7.860 3.83e-15 ***
Contextn-o    4.0212     0.6239   6.446 1.15e-10 ***
Contextn-3    3.6125     0.6113   5.910 3.43e-09 ***
Contexto-7   -0.6175     0.3039  -2.032   0.0422 *  
Contexto-n    3.1367     0.3768   8.324  < 2e-16 ***
Contexto-o   -0.2339     0.3204  -0.730   0.4653    
Contexto-3   -0.1837     0.3203  -0.573   0.5663    
Context3-n    3.5573     0.3917   9.081  < 2e-16 ***
Context3-o   -0.3729     0.4812  -0.775   0.4383    
Context3--3  -1.6660     0.9537  -1.747   0.0807 .  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Threshold coefficients:
    Estimate Std. Error z value
1|2  -0.6635     0.6068  -1.093
2|3   0.9297     0.6066   1.533
3|4   1.9334     0.6076   3.182
4|5   3.6733     0.6115   6.007
3.2.3.2.3 Figure
## below changes the margins
par(oma=c(1, 0, 0, 3),mgp=c(2, 1, 0))
xlimNas = c(min(fullCLMMNasSlope$beta), max(fullCLMMNasSlope$beta))
ylimNas = c(0,1)
plot(0,0,xlim=xlimNas, ylim=ylimNas, type="n", ylab=expression(Probability), xlab="", xaxt = "n",main="Predicted curves - Nasalisation",cex=2,cex.lab=1.5,cex.main=1.5,cex.axis=1.5)
axis(side = 1, at = c(0,fullCLMMNasSlope$beta),labels = levels(percNasDF$ContextIPA), las=2,cex=2,cex.lab=1.5,cex.axis=1.5)
xsNas = seq(xlimNas[1], xlimNas[2], length.out=100)
lines(xsNas, plogis(fullCLMMNasSlope$Theta[1] - xsNas), col='black')
lines(xsNas, plogis(fullCLMMNasSlope$Theta[2] - xsNas)-plogis(fullCLMMNasSlope$Theta[1] - xsNas), col='red')
lines(xsNas, plogis(fullCLMMNasSlope$Theta[3] - xsNas)-plogis(fullCLMMNasSlope$Theta[2] - xsNas), col='green')
lines(xsNas, plogis(fullCLMMNasSlope$Theta[4] - xsNas)-plogis(fullCLMMNasSlope$Theta[3] - xsNas), col='orange')
lines(xsNas, 1-(plogis(fullCLMMNasSlope$Theta[4] - xsNas)), col='blue')
abline(v=c(0,fullCLMMNasSlope$beta),lty=3)
abline(h=0, lty="dashed")
abline(h=1, lty="dashed")
legend(par('usr')[2], par('usr')[4], bty='n', xpd=NA,lty=1, col=c("black", "red", "green", "orange", "blue"), 
       legend=c("Oral", "2", "3", "4", "Nasal"),cex=0.75)

The figure above shows how two groups are formed. The first group includes all oral contexts, Isolation and pharyngeals either on their own or with an oral context. The second group include all nasal contexts and those including pharyngeals and nasals. It is interesting to see that the percept of nasality is increased when a pharyngeal is associated with a nasal context; when associated with an oral context, the ratings are mostly “Oral”. The context “n-o” and “n-n” received the highest ratings of “Nasal” (4 and 5) with a sum of around 85-90%. This was followed by both “n-ʕ” and “ʕ-n” at a combined rating of around 80%.

3.2.4 Exploring random effects

This section is not part of the analsyes presented in the article, but are crucial at understanding how the rating experiment worked and how the random factors were crucial in generalising the results. Without including random effects, the model would have provided wrong predictions, given that our subjects, raters and words showed clear variance. This was taken into account in the models presented above.

3.2.4.1 Voice Quality (VQ)

3.2.4.1.1 Preprocessing data

We start by preprocessing the data. We create data-frames with intercepts and variances of all random effects; the first column is the grouping factor, followed by 5 columns of intercepts, columns 7-11 are the variances.

#### 
# 
#getting betas
betasVQ <- as.data.frame(fullCLMMVQSlope$beta)
# getting random effects coeficients and conditional variance
# for subjects
randomsVQSubject <- as.data.frame(ranef(fullCLMMVQSlope, condVar = F)$Subject)
varVQSubject     <- as.data.frame(condVar(fullCLMMVQSlope)$Subject)
dfVQSubject      <- merge(randomsVQSubject, varVQSubject, by ="row.names")
betasVQ
dfVQSubject
subRanefVQSubj <- fullCLMMVQSlope$ranef[46:54]
subcondVarVQSubj <- condVar(fullCLMMVQSlope)$Subject[1]
subcondVarVQSubj <- matrix(as.numeric(unlist(subcondVarVQSubj)),nrow=nrow(subcondVarVQSubj)) 
# getting random effects coeficients and conditional variance
# for raters
randomsVQRater <- as.data.frame(ranef(fullCLMMVQSlope, condVar = F)$Rater)
varVQRater     <- as.data.frame(condVar(fullCLMMVQSlope)$Rater)
dfVQRater      <- merge(randomsVQRater, varVQRater, by ="row.names")
dfVQRater
subRanefVQRater <- fullCLMMVQSlope$ranef[55:60]
subcondVarVQRater <- condVar(fullCLMMVQSlope)$Rater[1]
subcondVarVQRater <- matrix(as.numeric(unlist(subcondVarVQRater)),nrow=nrow(subcondVarVQRater)) 
# getting random effects coeficients and conditional variance
# for words
randomsVQWord <- as.data.frame(ranef(fullCLMMVQSlope, condVar = F)$Item)
varVQWord     <- as.data.frame(condVar(fullCLMMVQSlope)$Item)
dfVQWord      <- merge(randomsVQWord, varVQWord, by ="row.names")
dfVQWord
subRanefVQWord <- fullCLMMVQSlope$ranef[1:45]
subcondVarVQWord <- condVar(fullCLMMVQSlope)$Item[1]
subcondVarVQWord <- matrix(as.numeric(unlist(subcondVarVQWord)),nrow=nrow(subcondVarVQWord)) 

We then reorder the random effects by their labels. We also change a few things

labelsVQ <- c(levels(percVQDF$Item),levels(percVQDF$Subject),
             levels(percVQDF$Rater))
ord.reLabelVQ <- as.data.frame(fullCLMMVQSlope$ranef[1:60])
ord.reLabelVQ$var <- row.names(fullCLMMVQSlope$ranef[1:60])
ord.reLabelVQ <- merge(labelsVQ,ord.reLabelVQ,by ="row.names")
ord.reLabelVQ
ord.reLabelVQ$Row.names <- as.numeric(ord.reLabelVQ$Row.names)
ord.reLabelVQ <- ord.reLabelVQ[ order(ord.reLabelVQ[,1]), ]
rownames(ord.reLabelVQ) <- NULL
ord.reLabelVQ
ord.reLabelVQWord <- ord.reLabelVQ[1:45,]
ord.reLabelVQSubj <- ord.reLabelVQ[46:54,]
ord.reLabelVQRater <- ord.reLabelVQ[55:60,]
ord.reLabelVQWord$x <- factor(ord.reLabelVQWord$x)
ord.reLabelVQSubj$x <- factor(ord.reLabelVQSubj$x)
ord.reLabelVQRater$x <- factor(ord.reLabelVQRater$x)
#changing items from transliteration to IPA
ord.reLabelVQWord$x <- as.character(ord.reLabelVQWord$x)
ord.reLabelVQWord$x[ord.reLabelVQWord$x == "7aad-w"] <- "\u0127a:d"
ord.reLabelVQWord$x[ord.reLabelVQWord$x == "7eef-w"] <- "\u0127e:f"
ord.reLabelVQWord$x[ord.reLabelVQWord$x == "7eef-v"] <- "\u0127e:f-v"
ord.reLabelVQWord$x[ord.reLabelVQWord$x == "7en-w"] <- "\u0127enn"
ord.reLabelVQWord$x[ord.reLabelVQWord$x == "7ook-w"] <- "\u0127o:k"
ord.reLabelVQWord$x[ord.reLabelVQWord$x == "7oom-w"] <- "\u0127o:m"
ord.reLabelVQWord$x[ord.reLabelVQWord$x == "loo7-w"] <- "lo:\u0127"
ord.reLabelVQWord$x[ord.reLabelVQWord$x == "naa7-w"] <- "na:\u0127"
ord.reLabelVQWord$x[ord.reLabelVQWord$x == "naa7-v"] <- "na:\u0127-v"
ord.reLabelVQWord$x[ord.reLabelVQWord$x == "nuu7-w"] <- "nu:\u0127"
ord.reLabelVQWord$x[ord.reLabelVQWord$x == "nuu7-v"] <- "nu:\u0127-v"
ord.reLabelVQWord$x[ord.reLabelVQWord$x == "zaa7-w"] <- "za:\u0127"
ord.reLabelVQWord$x[ord.reLabelVQWord$x == "zii7-w"] <- "zi:\u0127"
ord.reLabelVQWord$x[ord.reLabelVQWord$x == "3aaf-w"] <- "ʕa:f"
ord.reLabelVQWord$x[ord.reLabelVQWord$x == "3aam-w"] <- "ʕa:m"
ord.reLabelVQWord$x[ord.reLabelVQWord$x == "3eeb-w"] <- "ʕe:b"
ord.reLabelVQWord$x[ord.reLabelVQWord$x == "3eeb-v"] <- "ʕe:b-v"
ord.reLabelVQWord$x[ord.reLabelVQWord$x == "3een-w"] <- "ʕe:n"
ord.reLabelVQWord$x[ord.reLabelVQWord$x == "3iish-w"] <- "ʕa:ʃ"
ord.reLabelVQWord$x[ord.reLabelVQWord$x == "3oo3-w"] <- "ʕo:ʕ"
ord.reLabelVQWord$x[ord.reLabelVQWord$x == "3oo3-v"] <- "ʕo:ʕ-v"
ord.reLabelVQWord$x[ord.reLabelVQWord$x == "3oon-w"] <- "ʕo:n"
ord.reLabelVQWord$x[ord.reLabelVQWord$x == "baa3-w"] <- "ba:ʕ"
ord.reLabelVQWord$x[ord.reLabelVQWord$x == "bii3-w"] <- "bi:ʕ"
ord.reLabelVQWord$x[ord.reLabelVQWord$x == "bii3-v"] <- "bi:ʕ-v"
ord.reLabelVQWord$x[ord.reLabelVQWord$x == "boosh-w"] <- "bo:ʃ"
ord.reLabelVQWord$x[ord.reLabelVQWord$x == "djuu3-w"] <- "d͡ʒu:ʕ"
ord.reLabelVQWord$x[ord.reLabelVQWord$x == "djuu3-v"] <- "d͡ʒu:ʕ-v"
ord.reLabelVQWord$x[ord.reLabelVQWord$x == "noo3-w"] <- "no:ʕ"
ord.reLabelVQWord$x[ord.reLabelVQWord$x == "noo3-v"] <- "no:ʕ-v"
ord.reLabelVQWord$x[ord.reLabelVQWord$x == "beet-w"] <- "be:t"
ord.reLabelVQWord$x[ord.reLabelVQWord$x == "daas-w"] <- "da:s"
ord.reLabelVQWord$x[ord.reLabelVQWord$x == "diin-w"] <- "di:n"
ord.reLabelVQWord$x[ord.reLabelVQWord$x == "doom-w"] <- "do:m"
ord.reLabelVQWord$x[ord.reLabelVQWord$x == "doom-v"] <- "do:m-v"
ord.reLabelVQWord$x[ord.reLabelVQWord$x == "beet-w"] <- "be:t"
ord.reLabelVQWord$x[ord.reLabelVQWord$x == "maat-w"] <- "ma:t"
ord.reLabelVQWord$x[ord.reLabelVQWord$x == "maat-v"] <- "ma:t-v"
ord.reLabelVQWord$x[ord.reLabelVQWord$x == "mooz-w"] <- "mo:z"
ord.reLabelVQWord$x[ord.reLabelVQWord$x == "muun-w"] <- "mu:n"
ord.reLabelVQWord$x[ord.reLabelVQWord$x == "muus-w"] <- "mu:s"
ord.reLabelVQWord$x[ord.reLabelVQWord$x == "naam-w"] <- "na:m"
ord.reLabelVQWord$x[ord.reLabelVQWord$x == "naam-v"] <- "na:m-v"
ord.reLabelVQWord$x[ord.reLabelVQWord$x == "noom-w"] <- "no:m"
ord.reLabelVQWord$x[ord.reLabelVQWord$x == "saam-w"] <- "sa:m"
ord.reLabelVQWord$x[ord.reLabelVQWord$x == "saam-v"] <- "sa:m-v"
ord.reLabelVQWord$x[ord.reLabelVQWord$x == "beet-w"] <- "be:t"
ord.reLabelVQWord$x <- as.factor(ord.reLabelVQWord$x)
# reordering
ord.reLabelVQWord <- ord.reLabelVQWord %>% arrange(`fullCLMMVQSlope$ranef[1:60]`)
ord.reLabelVQWord$x <- as.vector(ord.reLabelVQWord$x) #get rid of factors
ord.reLabelVQWord$x = factor(ord.reLabelVQWord$x,ord.reLabelVQWord$x) #add ordered factors back
ord.reLabelVQSubj <- ord.reLabelVQSubj %>% arrange(`fullCLMMVQSlope$ranef[1:60]`)
ord.reLabelVQSubj$x <- as.vector(ord.reLabelVQSubj$x) #get rid of factors
ord.reLabelVQSubj$x = factor(ord.reLabelVQSubj$x,ord.reLabelVQSubj$x) #add ordered factors back
ord.reLabelVQRater <- ord.reLabelVQRater %>% arrange(`fullCLMMVQSlope$ranef[1:60]`)
ord.reLabelVQRater$x <- as.vector(ord.reLabelVQRater$x) #get rid of factors
ord.reLabelVQRater$x = factor(ord.reLabelVQRater$x,ord.reLabelVQRater$x) #add ordered factors back
3.2.4.1.2 Figures
3.2.4.1.2.1 Subjects
ciVQSubj <- subRanefVQSubj + qnorm(0.975) * sqrt(as.numeric(subcondVarVQSubj)) %o% c(-1, 1)
ord.reVQSubj <- order(subRanefVQSubj)
ciVQSubj <- ciVQSubj[order(subRanefVQSubj),]
plot(subRanefVQSubj[ord.reVQSubj], 1:9, axes=FALSE, xlim=range(ciVQSubj),
     xlab="Subject variation", ylab="",cex=2,cex.lab=2,cex.main=2,
     main="BLUPs Subject VQ",cex.axis=1.5)
axis(1,cex.lab=2,cex.axis=1.5)
axis(2,at=1:9, labels = levels(ord.reLabelVQSubj$x), las=2,cex.lab=2,cex.axis=1.5)
for(i in 1:9) segments(ciVQSubj[i,1], i, ciVQSubj[i, 2],i)
abline(v = 0, lty=2)

It is interesting to see that not all subjects (who produced the items) were rated as more or less “tense”. The first two subjects (2 and 3) contributed more to the percept of “tense” voice quality whereas speakers 6, 9 and 4, contributed less to this percept.

3.2.4.1.2.2 Raters
ciVQRater <- subRanefVQRater + qnorm(0.975) * sqrt(as.numeric(subcondVarVQRater)) %o% c(-1, 1)
ord.reVQRater <- order(subRanefVQRater)
ciVQRater <- ciVQRater[order(subRanefVQRater),]
plot(subRanefVQRater[ord.reVQRater], 1:6, axes=FALSE, xlim=range(ciVQRater),
     xlab="Rater variation", ylab="",cex=2,cex.lab=2,cex.main=2,
     main="BLUPs Rater VQ",cex.axis=1.5)
axis(1,cex.lab=2,cex.axis=1.5)
axis(2,at=1:6, labels = levels(ord.reLabelVQRater$x), las=2,cex.lab=2,cex.axis=1.5)
for(i in 1:6) segments(ciVQRater[i,1], i, ciVQRater[i, 2],i)
abline(v = 0, lty=2)

With respect to raters, it is interesting to see that there is a clear split between raters (that was already picked up in the IRR analyses above). The first three (2, 5 and 6) were more likely to provide postive responses to “tense” whereas 1 and 4 (and potentially 3) were more conservative in their responses. R01 is the first author and R02 is the second. This shows that R01 is more conservative in their responses than R02.

3.2.4.1.2.3 Items
ciVQWord <- subRanefVQWord + qnorm(0.975) * sqrt(as.numeric(subcondVarVQWord)) %o% c(-1, 1)
ord.reVQWord <- order(subRanefVQWord)
ciVQWord <- ciVQWord[order(subRanefVQWord),]
par(oma = c(0, 1.5, 0, 0))
plot(1:45,subRanefVQWord[ord.reVQWord], axes=FALSE, ylim=range(ciVQWord),
       ylab="Item variation", xlab="",cex=2,cex.lab=2,cex.main=2,
     main="BLUPs Item VQ",cex.axis=1.5)
axis(2,cex.lab=2,cex.axis=1.5)
axis(1,at=1:45, labels = levels(ord.reLabelVQWord$x), las=2,cex.lab=2,cex.axis=1.5)
for(i in 1:45) segments(i, ciVQWord[i,1], i, ciVQWord[i, 2])
abline(h = 0, lty=2)

With item variation, not all words contributed positively to the “tense” quality and there is a clear gradation in impact of words on ratings. This is important to take into account of course in our model

3.2.4.2 Nasalisation

3.2.4.2.1 Preprocessing data

We start by preprocessing the data. We create data-frames with intercepts and variances of all random effects; the first column is the grouping factor, followed by 5 columns of intercepts, columns 7-11 are the variances.

#### 
# 
#getting betas
betasNas <- as.data.frame(fullCLMMNasSlope$beta)
# getting random effects coeficients and conditional variance
# for subjects
randomsNasSubject <- as.data.frame(ranef(fullCLMMNasSlope, condVar = F)$Subject)
varNasSubject     <- as.data.frame(condVar(fullCLMMNasSlope)$Subject)
dfNasSubject      <- merge(randomsNasSubject, varNasSubject, by ="row.names")
betasNas
dfNasSubject
subRanefNasSubj <- fullCLMMNasSlope$ranef[46:54]
subcondVarNasSubj <- condVar(fullCLMMNasSlope)$Subject[1]
subcondVarNasSubj <- matrix(as.numeric(unlist(subcondVarNasSubj)),nrow=nrow(subcondVarNasSubj)) 
# getting random effects coeficients and conditional variance
# for raters
randomsNasRater <- as.data.frame(ranef(fullCLMMNasSlope, condVar = F)$Rater)
varNasRater     <- as.data.frame(condVar(fullCLMMNasSlope)$Rater)
dfNasRater      <- merge(randomsNasRater, varNasRater, by ="row.names")
dfNasRater
subRanefNasRater <- fullCLMMNasSlope$ranef[55:60]
subcondVarNasRater <- condVar(fullCLMMNasSlope)$Rater[1]
subcondVarNasRater <- matrix(as.numeric(unlist(subcondVarNasRater)),nrow=nrow(subcondVarNasRater)) 
# getting random effects coeficients and conditional variance
# for words
randomsNasWord <- as.data.frame(ranef(fullCLMMNasSlope, condVar = F)$Item)
varNasWord     <- as.data.frame(condVar(fullCLMMNasSlope)$Item)
dfNasWord      <- merge(randomsNasWord, varNasWord, by ="row.names")
dfNasWord
subRanefNasWord <- fullCLMMNasSlope$ranef[1:45]
subcondVarNasWord <- condVar(fullCLMMNasSlope)$Item[1]
subcondVarNasWord <- matrix(as.numeric(unlist(subcondVarNasWord)),nrow=nrow(subcondVarNasWord)) 

We then reorder the random effects by their labels. We also change a few things

labelsNas <- c(levels(percNasDF$Item),levels(percNasDF$Subject),levels(percNasDF$Rater))
ord.reLabelNas <- as.data.frame(fullCLMMNasSlope$ranef[1:60])
ord.reLabelNas$var <- row.names(fullCLMMNasSlope$ranef[1:60])
ord.reLabelNas <- merge(labelsNas,ord.reLabelNas,by ="row.names")
ord.reLabelNas
ord.reLabelNas$Row.names <- as.numeric(ord.reLabelNas$Row.names)
ord.reLabelNas <- ord.reLabelNas[ order(ord.reLabelNas[,1]), ]
rownames(ord.reLabelNas) <- NULL
ord.reLabelNas
ord.reLabelNasWord <- ord.reLabelNas[1:45,]
ord.reLabelNasSubj <- ord.reLabelNas[46:54,]
ord.reLabelNasRater <- ord.reLabelNas[55:60,]
ord.reLabelNasWord$x <- factor(ord.reLabelNasWord$x)
ord.reLabelNasSubj$x <- factor(ord.reLabelNasSubj$x)
ord.reLabelNasRater$x <- factor(ord.reLabelNasRater$x)
#changing items from transliteration to IPA
ord.reLabelNasWord$x <- as.character(ord.reLabelNasWord$x)
ord.reLabelNasWord$x[ord.reLabelNasWord$x == "7aad-w"] <- "\u0127a:d"
ord.reLabelNasWord$x[ord.reLabelNasWord$x == "7eef-w"] <- "\u0127e:f"
ord.reLabelNasWord$x[ord.reLabelNasWord$x == "7eef-v"] <- "\u0127e:f-v"
ord.reLabelNasWord$x[ord.reLabelNasWord$x == "7en-w"] <- "\u0127enn"
ord.reLabelNasWord$x[ord.reLabelNasWord$x == "7ook-w"] <- "\u0127o:k"
ord.reLabelNasWord$x[ord.reLabelNasWord$x == "7oom-w"] <- "\u0127o:m"
ord.reLabelNasWord$x[ord.reLabelNasWord$x == "loo7-w"] <- "lo:\u0127"
ord.reLabelNasWord$x[ord.reLabelNasWord$x == "naa7-w"] <- "na:\u0127"
ord.reLabelNasWord$x[ord.reLabelNasWord$x == "naa7-v"] <- "na:\u0127-v"
ord.reLabelNasWord$x[ord.reLabelNasWord$x == "nuu7-w"] <- "nu:\u0127"
ord.reLabelNasWord$x[ord.reLabelNasWord$x == "nuu7-v"] <- "nu:\u0127-v"
ord.reLabelNasWord$x[ord.reLabelNasWord$x == "zaa7-w"] <- "za:\u0127"
ord.reLabelNasWord$x[ord.reLabelNasWord$x == "zii7-w"] <- "zi:\u0127"
ord.reLabelNasWord$x[ord.reLabelNasWord$x == "3aaf-w"] <- "ʕa:f"
ord.reLabelNasWord$x[ord.reLabelNasWord$x == "3aam-w"] <- "ʕa:m"
ord.reLabelNasWord$x[ord.reLabelNasWord$x == "3eeb-w"] <- "ʕe:b"
ord.reLabelNasWord$x[ord.reLabelNasWord$x == "3eeb-v"] <- "ʕe:b-v"
ord.reLabelNasWord$x[ord.reLabelNasWord$x == "3een-w"] <- "ʕe:n"
ord.reLabelNasWord$x[ord.reLabelNasWord$x == "3iish-w"] <- "ʕa:ʃ"
ord.reLabelNasWord$x[ord.reLabelNasWord$x == "3oo3-w"] <- "ʕo:ʕ"
ord.reLabelNasWord$x[ord.reLabelNasWord$x == "3oo3-v"] <- "ʕo:ʕ-v"
ord.reLabelNasWord$x[ord.reLabelNasWord$x == "3oon-w"] <- "ʕo:n"
ord.reLabelNasWord$x[ord.reLabelNasWord$x == "baa3-w"] <- "ba:ʕ"
ord.reLabelNasWord$x[ord.reLabelNasWord$x == "bii3-w"] <- "bi:ʕ"
ord.reLabelNasWord$x[ord.reLabelNasWord$x == "bii3-v"] <- "bi:ʕ-v"
ord.reLabelNasWord$x[ord.reLabelNasWord$x == "boosh-w"] <- "bo:ʃ"
ord.reLabelNasWord$x[ord.reLabelNasWord$x == "djuu3-w"] <- "d͡ʒu:ʕ"
ord.reLabelNasWord$x[ord.reLabelNasWord$x == "djuu3-v"] <- "d͡ʒu:ʕ-v"
ord.reLabelNasWord$x[ord.reLabelNasWord$x == "noo3-w"] <- "no:ʕ"
ord.reLabelNasWord$x[ord.reLabelNasWord$x == "noo3-v"] <- "no:ʕ-v"
ord.reLabelNasWord$x[ord.reLabelNasWord$x == "beet-w"] <- "be:t"
ord.reLabelNasWord$x[ord.reLabelNasWord$x == "daas-w"] <- "da:s"
ord.reLabelNasWord$x[ord.reLabelNasWord$x == "diin-w"] <- "di:n"
ord.reLabelNasWord$x[ord.reLabelNasWord$x == "doom-w"] <- "do:m"
ord.reLabelNasWord$x[ord.reLabelNasWord$x == "doom-v"] <- "do:m-v"
ord.reLabelNasWord$x[ord.reLabelNasWord$x == "beet-w"] <- "be:t"
ord.reLabelNasWord$x[ord.reLabelNasWord$x == "maat-w"] <- "ma:t"
ord.reLabelNasWord$x[ord.reLabelNasWord$x == "maat-v"] <- "ma:t-v"
ord.reLabelNasWord$x[ord.reLabelNasWord$x == "mooz-w"] <- "mo:z"
ord.reLabelNasWord$x[ord.reLabelNasWord$x == "muun-w"] <- "mu:n"
ord.reLabelNasWord$x[ord.reLabelNasWord$x == "muus-w"] <- "mu:s"
ord.reLabelNasWord$x[ord.reLabelNasWord$x == "naam-w"] <- "na:m"
ord.reLabelNasWord$x[ord.reLabelNasWord$x == "naam-v"] <- "na:m-v"
ord.reLabelNasWord$x[ord.reLabelNasWord$x == "noom-w"] <- "no:m"
ord.reLabelNasWord$x[ord.reLabelNasWord$x == "saam-w"] <- "sa:m"
ord.reLabelNasWord$x[ord.reLabelNasWord$x == "saam-v"] <- "sa:m-v"
ord.reLabelNasWord$x[ord.reLabelNasWord$x == "beet-w"] <- "be:t"
ord.reLabelNasWord$x <- as.factor(ord.reLabelNasWord$x)
# reordering
ord.reLabelNasWord <- ord.reLabelNasWord %>% arrange(`fullCLMMNasSlope$ranef[1:60]`)
ord.reLabelNasWord$x <- as.vector(ord.reLabelNasWord$x) #get rid of factors
ord.reLabelNasWord$x = factor(ord.reLabelNasWord$x,ord.reLabelNasWord$x) #add ordered factors back
ord.reLabelNasSubj <- ord.reLabelNasSubj %>% arrange(`fullCLMMNasSlope$ranef[1:60]`)
ord.reLabelNasSubj$x <- as.vector(ord.reLabelNasSubj$x) #get rid of factors
ord.reLabelNasSubj$x = factor(ord.reLabelNasSubj$x,ord.reLabelNasSubj$x) #add ordered factors back
ord.reLabelNasRater <- ord.reLabelNasRater %>% arrange(`fullCLMMNasSlope$ranef[1:60]`)
ord.reLabelNasRater$x <- as.vector(ord.reLabelNasRater$x) #get rid of factors
ord.reLabelNasRater$x = factor(ord.reLabelNasRater$x,ord.reLabelNasRater$x) #add ordered factors back
3.2.4.2.2 Figures
3.2.4.2.2.1 Subjects
ciNasSubj <- subRanefNasSubj + qnorm(0.975) * sqrt(as.numeric(subcondVarNasSubj)) %o% c(-1, 1)
ord.reNasSubj <- order(subRanefNasSubj)
ciNasSubj <- ciNasSubj[order(subRanefNasSubj),]
plot(subRanefNasSubj[ord.reNasSubj], 1:9, axes=FALSE, xlim=range(ciNasSubj),
     xlab="Subject variation", ylab="",cex=2,cex.lab=2,cex.main=2,
     main="BLUPs Subject Nas",cex.axis=1.5)
axis(1,cex.lab=2,cex.axis=1.5)
axis(2,at=1:9, labels = levels(ord.reLabelNasSubj$x), las=2,cex.lab=2,cex.axis=1.5)
for(i in 1:9) segments(ciNasSubj[i,1], i, ciNasSubj[i, 2],i)
abline(v = 0, lty=2)

As with the ratings of VQ, some subjects were producing sounds that were judged as more or less nasal. It is interesting to note that subject p02 was judged as being the one contributing the most to the percept of nasalisation and to the percept of tense voice quality seen above; the same pattern applies to subject p06 who is contributing the least to the percept of nasalisation and tense voice quality.

3.2.4.2.2.2 Raters
ciNasRater <- subRanefNasRater + qnorm(0.975) * sqrt(as.numeric(subcondVarNasRater)) %o% c(-1, 1)
ord.reNasRater <- order(subRanefNasRater)
ciNasRater <- ciNasRater[order(subRanefNasRater),]
plot(subRanefNasRater[ord.reNasRater], 1:6, axes=FALSE, xlim=range(ciNasRater),
     xlab="Rater variation", ylab="",cex=2,cex.lab=2,cex.main=2,
     main="BLUPs Rater Nas",cex.axis=1.5)
axis(1,cex.lab=2,cex.axis=1.5)
axis(2,at=1:6, labels = levels(ord.reLabelNasRater$x), las=2,cex.lab=2,cex.axis=1.5)
for(i in 1:6) segments(ciNasRater[i,1], i, ciNasRater[i, 2],i)
abline(v = 0, lty=2)

With respect to random effects related to the rater, there is a clear clustering with four rater being more favorable to rating “nasality” more often that the remaining two. Raters R01 and R02 (first and second authors, respectively) are equally postively providing ratings. associated with the percept of nasality.

3.2.4.2.2.3 Items
ciNasWord <- subRanefNasWord + qnorm(0.975) * sqrt(as.numeric(subcondVarNasWord)) %o% c(-1, 1)
ord.reNasWord <- order(subRanefNasWord)
ciNasWord <- ciNasWord[order(subRanefNasWord),]
par(oma = c(0, 1.5, 0, 0))
plot(1:45,subRanefNasWord[ord.reNasWord], axes=FALSE, ylim=range(ciNasWord),
       ylab="Item variation", xlab="",cex=2,cex.lab=2,cex.main=2,
     main="BLUPs Item Nas",cex.axis=1.5)
axis(2,cex.lab=2,cex.axis=1.5)
axis(1,at=1:45, labels = levels(ord.reLabelNasWord$x), las=2,cex.lab=2,cex.axis=1.5)
for(i in 1:45) segments(i, ciNasWord[i,1], i, ciNasWord[i, 2])
abline(h = 0, lty=2)

As above, various items were rated as more nasal than others. What is interesting to note is that all Items that were rated as more nasal contained a [+back] and +[high] vowels, and the only word that was significantly rated as not contributing to nasality is the one containing /ʕ-ʕ/.

LS0tDQp0aXRsZTogIlJhdGluZyBWUSBhbmQgTmFzYWxpc2F0aW9uIFBoYXJ5bmdlYWxzIg0KYXV0aG9yOiANCiAgbmFtZTogIkphbGFsIEFsLVRhbWltaSINCiAgYWZmaWxpYXRpb246ICJOZXdjYXN0bGUgVW5pdmVyc2l0eSINCmRhdGU6ICIwOSBKdW5lIDIwMTgiDQpvdXRwdXQ6IA0KICBodG1sX25vdGVib29rOg0KICAgIG51bWJlcl9zZWN0aW9uczogdHJ1ZQ0KICAgIHRvYzogdHJ1ZQ0KICAgIHRvY19kZXB0aDogNg0KICAgIHRvY19mbG9hdDoNCiAgICAgIGNvbGxhcHNlZDogdHJ1ZQ0KLS0tDQoNCiMgSW50cm9kdWN0aW9uDQpUaGlzIGFuYWx5c2lzIGFjY29tcGFuaWVzIHRoZSBhcnRpY2xlICJLaGF0dGFiLCBHLiwgQWwtVGFtaW1pLCBKLiwgYW5kIEFsLVNpcmFpaCwgVy4sICgyMDE4KS4gTmFzYWxpc2F0aW9uIGluIHRoZSBwcm9kdWN0aW9uIG9mIElyYXFpIEFyYWJpYyBwaGFyeW5nZWFscy4gUGhvbmV0aWNhLiBET0k6IGh0dHBzOi8vMTAuMTE1OS8wMDA0ODc4MDYiLiANCkJlbG93IGlzIGFuIGFuYWx5c2lzIG9mIHRoZSBwZXJjZXB0dWFsIGV4cGVyaW1lbnQgdGhhdCB3YXMgcnVuIHRvIGV2YWx1YXRlIHJhdGVycyBpbXByZXNzaW9ucyBvZiB2b2ljZSBxdWFsaXR5IGNoYW5nZXMgYW5kL29yIG5hc2FsaXNhdGlvbiB0aGF0IHdhcyBwcmVzZW50IHdpdGhpbiBwaGFyeW5nZWFscyBpbiBJcmFxaSBBcmFiaWMuIA0KDQojIE1hdGVyaWFsDQpEYXRhIHdlcmUgcmVjb3JkZWQgZnJvbSBuaW5lIElyYXFpIEFyYWJpYyBzcGVha2VycyBwcm9kdWNpbmcgYSBsaXN0IG9mIGl0ZW1zIGNvbnRhaW5pbmcgdGhlIHR3byBwaGFyeW5nZWFsIGNvbnNvbmFudHMgL8SnIMqVLyBhbmQgZWl0aGVyIGFuIG9yYWwgY29udGV4dCAoaS5lLiwgb3JhbCBjb25zb25hbnQpLCBhIG5hc2FsIGNvbnRleHQgKGkuZS4sIG5hc2FsIGNvbnNvbmFudCksIG9yIG9ubHkgdHdvIHBoYXJ5bmdlYWxzICgvypUtypUvKS4gVGhlICJjb250cm9sIiBjb250ZXh0cyB3ZXJlIG9yYWwtb3JhbCwgb3JhbC1uYXNhbCwgbmFzYWwtb3JhbCwgbmFzYWwtbmFzYWwsIGFuZCBJc29sYXRpb24gKHdoaWNoIHdhcyBhbGwgdm93ZWxzIGluIHRoZSBpdGVtcyBwcm9kdWNlZCBpbiBpc29sYXRpb24pLiBUaGUgaXRlbXMgd2VyZSBpbiBhIENWQyBlbnZpcm9ubWVudC4gDQoNCk91ciBhaW0gaW4gdGhpcyBhbmFseXNpcyB3YXMgdG8gZXZhbHVhdGUgdGhlIGltcHJlc3Npb24gb2YgaGFyc2gvdGVuc2Ugdm9pY2UgcXVhbGl0eSBhbmQvb3IgbmFzYWxpc2F0aW9uIGluIHRoZSBwaGFyeW5nZWFsIGNvbnRleHRzLCBhcyBjb21wYXJlZCB3aXRoIGFsbCBvdGhlciBjb250ZXh0cyBzcGVjaWZpZWQgYWJvdmUgd2FzIHBlcmNlcHR1YWxseSBzYWxpZW50IG9yIG5vdC4gRm9yIHRoaXMsIHNpeCBwaG9uZXRpY2FsbHkgdHJhaW5lZCByYXRlcnMgKGluY2x1ZGluZyB0aGUgZmlyc3QgdHdvIGF1dGhvcnMpIHJhdGVkIHRoZXNlIGl0ZW1zIHVzaW5nIFByYWF0J3MgTUZDIGV4cGVyaW1lbnQuIFRoZSBkYXRhIHVzZWQgaGVyZSB3ZXJlIGEgc3Vic2V0IG9mIHRoZSBkYXRhIChhcm91bmQgMjAlIG9mIHRoZSBmdWxsIGRhdGFzZXQpLiBUaGUgZmlyc3QgYXV0aG9yIHJhdGVkIGFsbCBpdGVtcyBmcm9tIHRoZSBmdWxsIGRhdGFzZXQgYW5kIHRoZSByZXN1bHRzIG9idGFpbmVkIGZyb20gdGhlIGZ1bGwgc2V0IGFuZCB0aGUgc3Vic2V0IGFyZSBjb21wYXJhYmxlLiBXZSByYW4gdGhpcyBhcyBhIHJhdGluZyBleHBlcmltZW50LCB3aXRoIHRocmVlIGxldmVscyByYXRpbmcgZm9yIFZvaWNlIFF1YWxpdHkgKGV4cGVyaW1lbnQgMSkgYW5kIGZpdmUgbGV2ZWxzIHJhdGluZyBmb3IgTmFzYWxpc2F0aW9uIChleHBlcmltZW50IDIpLiBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgdGhlIGFydGljbGUuDQoNCiMgU3RhdGlzdGljYWwgYW5hbHlzZXMNClRoZSByZXN1bHRzIG9mIHRoZSByYXRpbmcgZXhwZXJpbWVudCB3ZXJlIGFuYWx5c2VkIHVzaW5nIGFuIEludGVyLVJhdGVyIFJlbGlhYmlsaXR5IHRlc3QgYW5kIHRoZW4gdXNpbmcgYSBDdW11bGF0aXZlIExvZ2l0IE1peGVkIE1vZGVscy4gVGhlIGFpbSBvZiB0aGVzZSB0d28gYW5hbHN5ZXMgaXMgdG8gc2hlZCBsaWdodCBpbnRvIGhvdyBwaGFyeW5nZWFscywgd2hlbiBpbiBhIG5hc2FsIGNvbnRleHQgc2hvdyBjbGVhciBwYXR0ZXJucyBvZiBhIG5hc2FsIGNvbnRleHQuDQoNCiMjIEludGVyLVJhdGVyIFJlbGlhYmlsaXR5DQpXZSBzdGFydGVkIGJ5IGV2YWx1YXRpbmcgSW50ZXItUmF0ZXIgUmVsaWFiaWxpdHkgKElSUikgdXNpbmcgSW50cmEtQ2xhc3MgQ29ycmVsYXRpb25zIChJQ0MpIG9uIGVhY2ggb2YgdGhlIFZvaWNlIFF1YWxpdHkgYW5kIHRoZSBOYXNhbGlzYXRpb24gcmF0aW5nIGV4cGVyaW1lbnRzLiBXZSB3ZXJlIGludGVyZXN0ZWQgaW4gYm90aCBjb25zaXN0ZW5jeSBhbmQgYWdyZWVtZW50IGJldHdlZW4gdGhlIHNpeCByYXRlci4gUmVzdWx0cyBpbiB0aGUgYXJ0aWNsZSBhcmUgcmVwb3J0ZWQgb25seSBmb3IgdGhlIGFncmVlbWVudC4gSGVyZSB3ZSBwcmVzZW50IGFuZCBkaXNjdXNzIGJvdGguDQoNCiMjIyBMb2FkaW5nIHJlcXVpcmVkIHBhY2thZ2VzDQoNCmBgYHtyIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIGVycm9yPUZBTFNFfQ0KcmVxdWlyZWRQYWNrYWdlcyA9IGMoJ2RwbHlyJywnaXJyJywncmVzaGFwZTInKQ0KZm9yKHAgaW4gcmVxdWlyZWRQYWNrYWdlcyl7DQogIGlmKCFyZXF1aXJlKHAsY2hhcmFjdGVyLm9ubHkgPSBUUlVFKSkgaW5zdGFsbC5wYWNrYWdlcyhwKQ0KICBsaWJyYXJ5KHAsY2hhcmFjdGVyLm9ubHkgPSBUUlVFKQ0KfQ0KYGBgDQoNCiMjIyBSZWFkaW5nIGluIGRhdGENCg0KV2UgcmVhZCBpbiB0aGUgZGF0YSBhbmQgY2hlY2sgdGhlIHN0cnVjdHVyZQ0KDQpgYGB7ciB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCBlcnJvcj1GQUxTRX0NCnBoYXJ5bmdlYWxzVlFJUlIgPC0gcmVhZC5jc3YoInBoYXJ5bmdlYWxzVlFJUlIuY3N2IikNCnBoYXJ5bmdlYWxzTmFzSVJSIDwtIHJlYWQuY3N2KCJwaGFyeW5nZWFsc05hc0lSUi5jc3YiKQ0KDQpzdHIocGhhcnluZ2VhbHNWUUlSUikNCnN0cihwaGFyeW5nZWFsc05hc0lSUikNCmBgYA0KDQojIyMgTWVsdGluZyBhbmQgY2FzdGluZyB0aGUgZGF0YQ0KDQpXZSBjaGFuZ2UgYSBmZXcgcG9pbnRzIGluIHRoZSBkYXRhLWZyYW1lLiBXZSB0cmFuc2Zvcm0gdGhlIHJlc3BvbnNlcyBpbnRvIG51bWJlcnMuIFdlIHRoZW4gbWVsdCBhbmQgZGVjYXN0IHRoZSBkYXRhIHRvIGhhdmUgaXQgaW4gYSB3aWRlIGZvcm1hdC4gVGhlIG5ldyBzdHJ1Y3R1cmUgaGFzIDkgcm93cyAocmVwcmVzZW50aW5nIGRhdGEgZnJvbSBlYWNoIHByb2R1Y2luZyBzdWJqZWN0KSBhbmQgMjcwIGNvbHVtbnMgd2l0aCB0aGUgcmF0aW5ncyBmcm9tIGVhY2ggd29yZCBhbmQgcmF0ZXIgSUQuIA0KYGBge3Igd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgZXJyb3I9RkFMU0V9DQojIyBjaGFuZ2UgcmVzcG9uc2UgaW50byBhIG51bWJlcg0KcGhhcnluZ2VhbHNWUUlSUiRyZXNwb25zZU51bWIgPC0gYXMubnVtZXJpYyhwaGFyeW5nZWFsc1ZRSVJSJHJlc3BvbnNlTnVtYikNCnBoYXJ5bmdlYWxzTmFzSVJSJHJlc3BvbnNlTnVtYiA8LSBhcy5udW1lcmljKHBoYXJ5bmdlYWxzTmFzSVJSJHJlc3BvbnNlTnVtYikNCg0KIyMgY2FzdGluZyBhbmQgbWVsdGluZyB0aGUgZGF0YSBmcmFtZSwgVlEgZmlyc3QNCnBoYXJ5bmdlYWxzVlFJUlJDYXN0IDwtIGRjYXN0KG1lbHQocGhhcnluZ2VhbHNWUUlSUiwgaWQudmFycz1jKCJzdWJqZWN0TmV3IiwgIndvcmRUYXJnZXQiLCJyYXRlck51bWJlciIpKSwgc3ViamVjdE5ld353b3JkVGFyZ2V0K3JhdGVyTnVtYmVyKQ0KDQojIyBjYXN0aW5nIGFuZCBtZWx0aW5nIHRoZSBkYXRhIGZyYW1lLCBuYXNhbGlzYXRpb24gc2Vjb25kDQpwaGFyeW5nZWFsc05hc0lSUkNhc3QgPC0gZGNhc3QobWVsdChwaGFyeW5nZWFsc05hc0lSUiwgaWQudmFycz1jKCJzdWJqZWN0TmV3IiwgIndvcmRUYXJnZXQiLCJyYXRlck51bWJlciIpKSwgc3ViamVjdE5ld353b3JkVGFyZ2V0K3JhdGVyTnVtYmVyKQ0KDQpzdHIocGhhcnluZ2VhbHNWUUlSUkNhc3QpDQpgYGANCg0KIyMjIEludHJhLUNsYXNzIENvcnJlbGF0aW9ucyAoSUNDKQ0KV2UgdXNlZCBJQ0NzIHRvIGNvbXB1dGUgaW50ZXItcmF0ZXIgcmVsaWFiaWxpdHkuIEZvciBkZXRhaWxzIHNlZSB0aGUgYXJ0aWNsZS4gV2UgcmFuIHR3byB0eXBlcyBvZiB0ZXN0cy4gV2Ugd2FudGVkIHRvIGNoZWNrIGhvdyBjb25zaXN0ZW50IHRoZSByYXRlcnMgd2VyZSBpbiB0aGVpciBjaG9pY2VzIGFuZCBhbHNvIGhvdyB0aGV5IGFncmVlIGJldHdlZW4gZWFjaCBvdGhlci4gVGhlIGFncmVlbWVudHMgd2VyZSByZXBvcnRlZCBpbiB0aGUgYXJ0aWNsZS4gV2Ugc3RhcnQgYnkgcmVwb3J0aW5nIHRoZSBvdmVyYWxsIGNvbnNpc3RlbmN5IGFuZCBhZ3JlZW1lbnQgbGV2ZWxzIGZvciBlYWNoIG9mIHRoZSBWUSBhbmQgTmFzYWxpc2F0aW9uIGV4cGVyaW1lbnRzIGFuZCB0aGVuIG9uIHRoZSBjb25zaXN0ZW5jeSBhbmQgYWdyZWVtZW50IG9uIGVhY2ggd29yZCwgaS5lLiwgYW4gSXRlbS1iYXNlZCBhbmFseXNpcy4NCg0KIyMjIyBWb2ljZSBRdWFsaXR5IChWUSkNCldlIHN0YXJ0IHdpdGggdGhlIFZRIGV4cGVyaW1lbnQuDQoNCiMjIyMjIENvbnNpc3RlbmN5DQpCZWxvdyBhcmUgdGhlIG1vZGVsIHNwZWNpZmljYXRpb25zIGZvciB0aGUgY29uc2lzdGVuY3kuDQoNCmBgYHtyfQ0KVlFJQ0NSYXRpbmdDb25zV29yZEF2ZXIgPC0gaWNjKHBoYXJ5bmdlYWxzVlFJUlJDYXN0WzI6MjcxXSxtb2RlbD0idHdvd2F5Iix0eXBlPSJjb25zaXN0ZW5jeSIsdW5pdD0iYXZlcmFnZSIpDQoNClZRSUNDUmF0aW5nQ29uc1dvcmRBdmVyM2FhZncgPC0gaWNjKHBoYXJ5bmdlYWxzVlFJUlJDYXN0WzI6N10sbW9kZWw9InR3b3dheSIsdHlwZT0iY29uc2lzdGVuY3kiLHVuaXQ9ImF2ZXJhZ2UiKQ0KVlFJQ0NSYXRpbmdDb25zV29yZEF2ZXIzYWFtdyA8LSBpY2MocGhhcnluZ2VhbHNWUUlSUkNhc3RbODoxM10sbW9kZWw9InR3b3dheSIsdHlwZT0iY29uc2lzdGVuY3kiLHVuaXQ9ImF2ZXJhZ2UiKQ0KVlFJQ0NSYXRpbmdDb25zV29yZEF2ZXIzZWVidiA8LSBpY2MocGhhcnluZ2VhbHNWUUlSUkNhc3RbMTQ6MTldLG1vZGVsPSJ0d293YXkiLHR5cGU9ImNvbnNpc3RlbmN5Iix1bml0PSJhdmVyYWdlIikNClZRSUNDUmF0aW5nQ29uc1dvcmRBdmVyM2VlYncgPC0gaWNjKHBoYXJ5bmdlYWxzVlFJUlJDYXN0WzIwOjI1XSxtb2RlbD0idHdvd2F5Iix0eXBlPSJjb25zaXN0ZW5jeSIsdW5pdD0iYXZlcmFnZSIpDQpWUUlDQ1JhdGluZ0NvbnNXb3JkQXZlcjNlZW53IDwtIGljYyhwaGFyeW5nZWFsc1ZRSVJSQ2FzdFsyNjozMV0sbW9kZWw9InR3b3dheSIsdHlwZT0iY29uc2lzdGVuY3kiLHVuaXQ9ImF2ZXJhZ2UiKQ0KVlFJQ0NSYXRpbmdDb25zV29yZEF2ZXIzaWlzaHcgPC0gaWNjKHBoYXJ5bmdlYWxzVlFJUlJDYXN0WzMyOjM3XSxtb2RlbD0idHdvd2F5Iix0eXBlPSJjb25zaXN0ZW5jeSIsdW5pdD0iYXZlcmFnZSIpDQpWUUlDQ1JhdGluZ0NvbnNXb3JkQXZlcjNvbzN2IDwtIGljYyhwaGFyeW5nZWFsc1ZRSVJSQ2FzdFszODo0M10sbW9kZWw9InR3b3dheSIsdHlwZT0iY29uc2lzdGVuY3kiLHVuaXQ9ImF2ZXJhZ2UiKQ0KVlFJQ0NSYXRpbmdDb25zV29yZEF2ZXIzb28zdyA8LSBpY2MocGhhcnluZ2VhbHNWUUlSUkNhc3RbNDQ6NDldLG1vZGVsPSJ0d293YXkiLHR5cGU9ImNvbnNpc3RlbmN5Iix1bml0PSJhdmVyYWdlIikNClZRSUNDUmF0aW5nQ29uc1dvcmRBdmVyM29vbncgPC0gaWNjKHBoYXJ5bmdlYWxzVlFJUlJDYXN0WzUwOjU1XSxtb2RlbD0idHdvd2F5Iix0eXBlPSJjb25zaXN0ZW5jeSIsdW5pdD0iYXZlcmFnZSIpDQpWUUlDQ1JhdGluZ0NvbnNXb3JkQXZlcjdhYWR3IDwtIGljYyhwaGFyeW5nZWFsc1ZRSVJSQ2FzdFs1Njo2MV0sbW9kZWw9InR3b3dheSIsdHlwZT0iY29uc2lzdGVuY3kiLHVuaXQ9ImF2ZXJhZ2UiKQ0KVlFJQ0NSYXRpbmdDb25zV29yZEF2ZXI3ZWVmdiA8LSBpY2MocGhhcnluZ2VhbHNWUUlSUkNhc3RbNjI6NjddLG1vZGVsPSJ0d293YXkiLHR5cGU9ImNvbnNpc3RlbmN5Iix1bml0PSJhdmVyYWdlIikNClZRSUNDUmF0aW5nQ29uc1dvcmRBdmVyN2VlZncgPC0gaWNjKHBoYXJ5bmdlYWxzVlFJUlJDYXN0WzY4OjczXSxtb2RlbD0idHdvd2F5Iix0eXBlPSJjb25zaXN0ZW5jeSIsdW5pdD0iYXZlcmFnZSIpDQpWUUlDQ1JhdGluZ0NvbnNXb3JkQXZlcjdlbncgPC0gaWNjKHBoYXJ5bmdlYWxzVlFJUlJDYXN0Wzc0Ojc5XSxtb2RlbD0idHdvd2F5Iix0eXBlPSJjb25zaXN0ZW5jeSIsdW5pdD0iYXZlcmFnZSIpDQpWUUlDQ1JhdGluZ0NvbnNXb3JkQXZlcjdvb2t3IDwtIGljYyhwaGFyeW5nZWFsc1ZRSVJSQ2FzdFs4MDo4NV0sbW9kZWw9InR3b3dheSIsdHlwZT0iY29uc2lzdGVuY3kiLHVuaXQ9ImF2ZXJhZ2UiKQ0KVlFJQ0NSYXRpbmdDb25zV29yZEF2ZXI3b29tdyA8LSBpY2MocGhhcnluZ2VhbHNWUUlSUkNhc3RbODY6OTFdLG1vZGVsPSJ0d293YXkiLHR5cGU9ImNvbnNpc3RlbmN5Iix1bml0PSJhdmVyYWdlIikNClZRSUNDUmF0aW5nQ29uc1dvcmRBdmVyYmFhM3cgPC0gaWNjKHBoYXJ5bmdlYWxzVlFJUlJDYXN0WzkyOjk3XSxtb2RlbD0idHdvd2F5Iix0eXBlPSJjb25zaXN0ZW5jeSIsdW5pdD0iYXZlcmFnZSIpDQpWUUlDQ1JhdGluZ0NvbnNXb3JkQXZlcmJlZXR3IDwtIGljYyhwaGFyeW5nZWFsc1ZRSVJSQ2FzdFs5ODoxMDNdLG1vZGVsPSJ0d293YXkiLHR5cGU9ImNvbnNpc3RlbmN5Iix1bml0PSJhdmVyYWdlIikNClZRSUNDUmF0aW5nQ29uc1dvcmRBdmVyYmlpM3YgPC0gaWNjKHBoYXJ5bmdlYWxzVlFJUlJDYXN0WzEwNDoxMDldLG1vZGVsPSJ0d293YXkiLHR5cGU9ImNvbnNpc3RlbmN5Iix1bml0PSJhdmVyYWdlIikNClZRSUNDUmF0aW5nQ29uc1dvcmRBdmVyYmlpM3cgPC0gaWNjKHBoYXJ5bmdlYWxzVlFJUlJDYXN0WzExMDoxMTVdLG1vZGVsPSJ0d293YXkiLHR5cGU9ImNvbnNpc3RlbmN5Iix1bml0PSJhdmVyYWdlIikNClZRSUNDUmF0aW5nQ29uc1dvcmRBdmVyYm9vc2h3IDwtIGljYyhwaGFyeW5nZWFsc1ZRSVJSQ2FzdFsxMTY6MTIxXSxtb2RlbD0idHdvd2F5Iix0eXBlPSJjb25zaXN0ZW5jeSIsdW5pdD0iYXZlcmFnZSIpDQpWUUlDQ1JhdGluZ0NvbnNXb3JkQXZlcmRhYXN3IDwtIGljYyhwaGFyeW5nZWFsc1ZRSVJSQ2FzdFsxMjI6MTI3XSxtb2RlbD0idHdvd2F5Iix0eXBlPSJjb25zaXN0ZW5jeSIsdW5pdD0iYXZlcmFnZSIpDQpWUUlDQ1JhdGluZ0NvbnNXb3JkQXZlcmRpaW53IDwtIGljYyhwaGFyeW5nZWFsc1ZRSVJSQ2FzdFsxMjg6MTMzXSxtb2RlbD0idHdvd2F5Iix0eXBlPSJjb25zaXN0ZW5jeSIsdW5pdD0iYXZlcmFnZSIpDQpWUUlDQ1JhdGluZ0NvbnNXb3JkQXZlcmRqdXUzdiA8LSBpY2MocGhhcnluZ2VhbHNWUUlSUkNhc3RbMTM0OjEzOV0sbW9kZWw9InR3b3dheSIsdHlwZT0iY29uc2lzdGVuY3kiLHVuaXQ9ImF2ZXJhZ2UiKQ0KVlFJQ0NSYXRpbmdDb25zV29yZEF2ZXJkanV1M3cgPC0gaWNjKHBoYXJ5bmdlYWxzVlFJUlJDYXN0WzE0MDoxNDVdLG1vZGVsPSJ0d293YXkiLHR5cGU9ImNvbnNpc3RlbmN5Iix1bml0PSJhdmVyYWdlIikNClZRSUNDUmF0aW5nQ29uc1dvcmRBdmVyZG9vbXYgPC0gaWNjKHBoYXJ5bmdlYWxzVlFJUlJDYXN0WzE0NjoxNTFdLG1vZGVsPSJ0d293YXkiLHR5cGU9ImNvbnNpc3RlbmN5Iix1bml0PSJhdmVyYWdlIikNClZRSUNDUmF0aW5nQ29uc1dvcmRBdmVyZG9vbXcgPC0gaWNjKHBoYXJ5bmdlYWxzVlFJUlJDYXN0WzE1MjoxNTddLG1vZGVsPSJ0d293YXkiLHR5cGU9ImNvbnNpc3RlbmN5Iix1bml0PSJhdmVyYWdlIikNClZRSUNDUmF0aW5nQ29uc1dvcmRBdmVybG9vN3cgPC0gaWNjKHBoYXJ5bmdlYWxzVlFJUlJDYXN0WzE1ODoxNjNdLG1vZGVsPSJ0d293YXkiLHR5cGU9ImNvbnNpc3RlbmN5Iix1bml0PSJhdmVyYWdlIikNClZRSUNDUmF0aW5nQ29uc1dvcmRBdmVybWFhdHYgPC0gaWNjKHBoYXJ5bmdlYWxzVlFJUlJDYXN0WzE2NDoxNjldLG1vZGVsPSJ0d293YXkiLHR5cGU9ImNvbnNpc3RlbmN5Iix1bml0PSJhdmVyYWdlIikNClZRSUNDUmF0aW5nQ29uc1dvcmRBdmVybWFhdHcgPC0gaWNjKHBoYXJ5bmdlYWxzVlFJUlJDYXN0WzE3MDoxNzVdLG1vZGVsPSJ0d293YXkiLHR5cGU9ImNvbnNpc3RlbmN5Iix1bml0PSJhdmVyYWdlIikNClZRSUNDUmF0aW5nQ29uc1dvcmRBdmVybW9vencgPC0gaWNjKHBoYXJ5bmdlYWxzVlFJUlJDYXN0WzE3NjoxODFdLG1vZGVsPSJ0d293YXkiLHR5cGU9ImNvbnNpc3RlbmN5Iix1bml0PSJhdmVyYWdlIikNClZRSUNDUmF0aW5nQ29uc1dvcmRBdmVybXV1bncgPC0gaWNjKHBoYXJ5bmdlYWxzVlFJUlJDYXN0WzE4MjoxODddLG1vZGVsPSJ0d293YXkiLHR5cGU9ImNvbnNpc3RlbmN5Iix1bml0PSJhdmVyYWdlIikNClZRSUNDUmF0aW5nQ29uc1dvcmRBdmVybXV1c3cgPC0gaWNjKHBoYXJ5bmdlYWxzVlFJUlJDYXN0WzE4ODoxOTNdLG1vZGVsPSJ0d293YXkiLHR5cGU9ImNvbnNpc3RlbmN5Iix1bml0PSJhdmVyYWdlIikNClZRSUNDUmF0aW5nQ29uc1dvcmRBdmVybmFhN3YgPC0gaWNjKHBoYXJ5bmdlYWxzVlFJUlJDYXN0WzE5NDoxOTldLG1vZGVsPSJ0d293YXkiLHR5cGU9ImNvbnNpc3RlbmN5Iix1bml0PSJhdmVyYWdlIikNClZRSUNDUmF0aW5nQ29uc1dvcmRBdmVybmFhN3cgPC0gaWNjKHBoYXJ5bmdlYWxzVlFJUlJDYXN0WzIwMDoyMDVdLG1vZGVsPSJ0d293YXkiLHR5cGU9ImNvbnNpc3RlbmN5Iix1bml0PSJhdmVyYWdlIikNClZRSUNDUmF0aW5nQ29uc1dvcmRBdmVybmFhbXYgPC0gaWNjKHBoYXJ5bmdlYWxzVlFJUlJDYXN0WzIwNjoyMTFdLG1vZGVsPSJ0d293YXkiLHR5cGU9ImNvbnNpc3RlbmN5Iix1bml0PSJhdmVyYWdlIikNClZRSUNDUmF0aW5nQ29uc1dvcmRBdmVybmFhbXcgPC0gaWNjKHBoYXJ5bmdlYWxzVlFJUlJDYXN0WzIxMjoyMTddLG1vZGVsPSJ0d293YXkiLHR5cGU9ImNvbnNpc3RlbmN5Iix1bml0PSJhdmVyYWdlIikNClZRSUNDUmF0aW5nQ29uc1dvcmRBdmVybm9vM3YgPC0gaWNjKHBoYXJ5bmdlYWxzVlFJUlJDYXN0WzIxODoyMjNdLG1vZGVsPSJ0d293YXkiLHR5cGU9ImNvbnNpc3RlbmN5Iix1bml0PSJhdmVyYWdlIikNClZRSUNDUmF0aW5nQ29uc1dvcmRBdmVybm9vM3cgPC0gaWNjKHBoYXJ5bmdlYWxzVlFJUlJDYXN0WzIyNDoyMjldLG1vZGVsPSJ0d293YXkiLHR5cGU9ImNvbnNpc3RlbmN5Iix1bml0PSJhdmVyYWdlIikNClZRSUNDUmF0aW5nQ29uc1dvcmRBdmVybm9vbXcgPC0gaWNjKHBoYXJ5bmdlYWxzVlFJUlJDYXN0WzIzMDoyMzVdLG1vZGVsPSJ0d293YXkiLHR5cGU9ImNvbnNpc3RlbmN5Iix1bml0PSJhdmVyYWdlIikNClZRSUNDUmF0aW5nQ29uc1dvcmRBdmVybnV1N3YgPC0gaWNjKHBoYXJ5bmdlYWxzVlFJUlJDYXN0WzIzNjoyNDFdLG1vZGVsPSJ0d293YXkiLHR5cGU9ImNvbnNpc3RlbmN5Iix1bml0PSJhdmVyYWdlIikNClZRSUNDUmF0aW5nQ29uc1dvcmRBdmVybnV1N3cgPC0gaWNjKHBoYXJ5bmdlYWxzVlFJUlJDYXN0WzI0MjoyNDddLG1vZGVsPSJ0d293YXkiLHR5cGU9ImNvbnNpc3RlbmN5Iix1bml0PSJhdmVyYWdlIikNClZRSUNDUmF0aW5nQ29uc1dvcmRBdmVyc2FhbXYgPC0gaWNjKHBoYXJ5bmdlYWxzVlFJUlJDYXN0WzI0ODoyNTNdLG1vZGVsPSJ0d293YXkiLHR5cGU9ImNvbnNpc3RlbmN5Iix1bml0PSJhdmVyYWdlIikNClZRSUNDUmF0aW5nQ29uc1dvcmRBdmVyc2FhbXcgPC0gaWNjKHBoYXJ5bmdlYWxzVlFJUlJDYXN0WzI1NDoyNTldLG1vZGVsPSJ0d293YXkiLHR5cGU9ImNvbnNpc3RlbmN5Iix1bml0PSJhdmVyYWdlIikNClZRSUNDUmF0aW5nQ29uc1dvcmRBdmVyemFhN3cgPC0gaWNjKHBoYXJ5bmdlYWxzVlFJUlJDYXN0WzI2MDoyNjVdLG1vZGVsPSJ0d293YXkiLHR5cGU9ImNvbnNpc3RlbmN5Iix1bml0PSJhdmVyYWdlIikNClZRSUNDUmF0aW5nQ29uc1dvcmRBdmVyemlpN3cgPC0gaWNjKHBoYXJ5bmdlYWxzVlFJUlJDYXN0WzI2NjoyNzFdLG1vZGVsPSJ0d293YXkiLHR5cGU9ImNvbnNpc3RlbmN5Iix1bml0PSJhdmVyYWdlIikNCg0KYGBgDQoNCiMjIyMjIEFncmVlbWVudA0KQmVsb3cgYXJlIHRoZSBtb2RlbCBzcGVjaWZpY2F0aW9ucyBmb3IgdGhlIGFncmVlbWVudA0KDQpgYGB7cn0NCg0KVlFJQ0NSYXRpbmdBZ3JlZVdvcmRBdmVyIDwtIGljYyhwaGFyeW5nZWFsc1ZRSVJSQ2FzdFsyOjI3MV0sbW9kZWw9InR3b3dheSIsdHlwZT0iYWdyZWVtZW50Iix1bml0PSJhdmVyYWdlIikNCg0KVlFJQ0NSYXRpbmdBZ3JlZVdvcmRBdmVyM2FhZncgPC0gaWNjKHBoYXJ5bmdlYWxzVlFJUlJDYXN0WzI6N10sbW9kZWw9InR3b3dheSIsdHlwZT0iYWdyZWVtZW50Iix1bml0PSJhdmVyYWdlIikNClZRSUNDUmF0aW5nQWdyZWVXb3JkQXZlcjNhYW13IDwtIGljYyhwaGFyeW5nZWFsc1ZRSVJSQ2FzdFs4OjEzXSxtb2RlbD0idHdvd2F5Iix0eXBlPSJhZ3JlZW1lbnQiLHVuaXQ9ImF2ZXJhZ2UiKQ0KVlFJQ0NSYXRpbmdBZ3JlZVdvcmRBdmVyM2VlYnYgPC0gaWNjKHBoYXJ5bmdlYWxzVlFJUlJDYXN0WzE0OjE5XSxtb2RlbD0idHdvd2F5Iix0eXBlPSJhZ3JlZW1lbnQiLHVuaXQ9ImF2ZXJhZ2UiKQ0KVlFJQ0NSYXRpbmdBZ3JlZVdvcmRBdmVyM2VlYncgPC0gaWNjKHBoYXJ5bmdlYWxzVlFJUlJDYXN0WzIwOjI1XSxtb2RlbD0idHdvd2F5Iix0eXBlPSJhZ3JlZW1lbnQiLHVuaXQ9ImF2ZXJhZ2UiKQ0KVlFJQ0NSYXRpbmdBZ3JlZVdvcmRBdmVyM2VlbncgPC0gaWNjKHBoYXJ5bmdlYWxzVlFJUlJDYXN0WzI2OjMxXSxtb2RlbD0idHdvd2F5Iix0eXBlPSJhZ3JlZW1lbnQiLHVuaXQ9ImF2ZXJhZ2UiKQ0KVlFJQ0NSYXRpbmdBZ3JlZVdvcmRBdmVyM2lpc2h3IDwtIGljYyhwaGFyeW5nZWFsc1ZRSVJSQ2FzdFszMjozN10sbW9kZWw9InR3b3dheSIsdHlwZT0iYWdyZWVtZW50Iix1bml0PSJhdmVyYWdlIikNClZRSUNDUmF0aW5nQWdyZWVXb3JkQXZlcjNvbzN2IDwtIGljYyhwaGFyeW5nZWFsc1ZRSVJSQ2FzdFszODo0M10sbW9kZWw9InR3b3dheSIsdHlwZT0iYWdyZWVtZW50Iix1bml0PSJhdmVyYWdlIikNClZRSUNDUmF0aW5nQWdyZWVXb3JkQXZlcjNvbzN3IDwtIGljYyhwaGFyeW5nZWFsc1ZRSVJSQ2FzdFs0NDo0OV0sbW9kZWw9InR3b3dheSIsdHlwZT0iYWdyZWVtZW50Iix1bml0PSJhdmVyYWdlIikNClZRSUNDUmF0aW5nQWdyZWVXb3JkQXZlcjNvb253IDwtIGljYyhwaGFyeW5nZWFsc1ZRSVJSQ2FzdFs1MDo1NV0sbW9kZWw9InR3b3dheSIsdHlwZT0iYWdyZWVtZW50Iix1bml0PSJhdmVyYWdlIikNClZRSUNDUmF0aW5nQWdyZWVXb3JkQXZlcjdhYWR3IDwtIGljYyhwaGFyeW5nZWFsc1ZRSVJSQ2FzdFs1Njo2MV0sbW9kZWw9InR3b3dheSIsdHlwZT0iYWdyZWVtZW50Iix1bml0PSJhdmVyYWdlIikNClZRSUNDUmF0aW5nQWdyZWVXb3JkQXZlcjdlZWZ2IDwtIGljYyhwaGFyeW5nZWFsc1ZRSVJSQ2FzdFs2Mjo2N10sbW9kZWw9InR3b3dheSIsdHlwZT0iYWdyZWVtZW50Iix1bml0PSJhdmVyYWdlIikNClZRSUNDUmF0aW5nQWdyZWVXb3JkQXZlcjdlZWZ3IDwtIGljYyhwaGFyeW5nZWFsc1ZRSVJSQ2FzdFs2ODo3M10sbW9kZWw9InR3b3dheSIsdHlwZT0iYWdyZWVtZW50Iix1bml0PSJhdmVyYWdlIikNClZRSUNDUmF0aW5nQWdyZWVXb3JkQXZlcjdlbncgPC0gaWNjKHBoYXJ5bmdlYWxzVlFJUlJDYXN0Wzc0Ojc5XSxtb2RlbD0idHdvd2F5Iix0eXBlPSJhZ3JlZW1lbnQiLHVuaXQ9ImF2ZXJhZ2UiKQ0KVlFJQ0NSYXRpbmdBZ3JlZVdvcmRBdmVyN29va3cgPC0gaWNjKHBoYXJ5bmdlYWxzVlFJUlJDYXN0WzgwOjg1XSxtb2RlbD0idHdvd2F5Iix0eXBlPSJhZ3JlZW1lbnQiLHVuaXQ9ImF2ZXJhZ2UiKQ0KVlFJQ0NSYXRpbmdBZ3JlZVdvcmRBdmVyN29vbXcgPC0gaWNjKHBoYXJ5bmdlYWxzVlFJUlJDYXN0Wzg2OjkxXSxtb2RlbD0idHdvd2F5Iix0eXBlPSJhZ3JlZW1lbnQiLHVuaXQ9ImF2ZXJhZ2UiKQ0KVlFJQ0NSYXRpbmdBZ3JlZVdvcmRBdmVyYmFhM3cgPC0gaWNjKHBoYXJ5bmdlYWxzVlFJUlJDYXN0WzkyOjk3XSxtb2RlbD0idHdvd2F5Iix0eXBlPSJhZ3JlZW1lbnQiLHVuaXQ9ImF2ZXJhZ2UiKQ0KVlFJQ0NSYXRpbmdBZ3JlZVdvcmRBdmVyYmVldHcgPC0gaWNjKHBoYXJ5bmdlYWxzVlFJUlJDYXN0Wzk4OjEwM10sbW9kZWw9InR3b3dheSIsdHlwZT0iYWdyZWVtZW50Iix1bml0PSJhdmVyYWdlIikNClZRSUNDUmF0aW5nQWdyZWVXb3JkQXZlcmJpaTN2IDwtIGljYyhwaGFyeW5nZWFsc1ZRSVJSQ2FzdFsxMDQ6MTA5XSxtb2RlbD0idHdvd2F5Iix0eXBlPSJhZ3JlZW1lbnQiLHVuaXQ9ImF2ZXJhZ2UiKQ0KVlFJQ0NSYXRpbmdBZ3JlZVdvcmRBdmVyYmlpM3cgPC0gaWNjKHBoYXJ5bmdlYWxzVlFJUlJDYXN0WzExMDoxMTVdLG1vZGVsPSJ0d293YXkiLHR5cGU9ImFncmVlbWVudCIsdW5pdD0iYXZlcmFnZSIpDQpWUUlDQ1JhdGluZ0FncmVlV29yZEF2ZXJib29zaHcgPC0gaWNjKHBoYXJ5bmdlYWxzVlFJUlJDYXN0WzExNjoxMjFdLG1vZGVsPSJ0d293YXkiLHR5cGU9ImFncmVlbWVudCIsdW5pdD0iYXZlcmFnZSIpDQpWUUlDQ1JhdGluZ0FncmVlV29yZEF2ZXJkYWFzdyA8LSBpY2MocGhhcnluZ2VhbHNWUUlSUkNhc3RbMTIyOjEyN10sbW9kZWw9InR3b3dheSIsdHlwZT0iYWdyZWVtZW50Iix1bml0PSJhdmVyYWdlIikNClZRSUNDUmF0aW5nQWdyZWVXb3JkQXZlcmRpaW53IDwtIGljYyhwaGFyeW5nZWFsc1ZRSVJSQ2FzdFsxMjg6MTMzXSxtb2RlbD0idHdvd2F5Iix0eXBlPSJhZ3JlZW1lbnQiLHVuaXQ9ImF2ZXJhZ2UiKQ0KVlFJQ0NSYXRpbmdBZ3JlZVdvcmRBdmVyZGp1dTN2IDwtIGljYyhwaGFyeW5nZWFsc1ZRSVJSQ2FzdFsxMzQ6MTM5XSxtb2RlbD0idHdvd2F5Iix0eXBlPSJhZ3JlZW1lbnQiLHVuaXQ9ImF2ZXJhZ2UiKQ0KVlFJQ0NSYXRpbmdBZ3JlZVdvcmRBdmVyZGp1dTN3IDwtIGljYyhwaGFyeW5nZWFsc1ZRSVJSQ2FzdFsxNDA6MTQ1XSxtb2RlbD0idHdvd2F5Iix0eXBlPSJhZ3JlZW1lbnQiLHVuaXQ9ImF2ZXJhZ2UiKQ0KVlFJQ0NSYXRpbmdBZ3JlZVdvcmRBdmVyZG9vbXYgPC0gaWNjKHBoYXJ5bmdlYWxzVlFJUlJDYXN0WzE0NjoxNTFdLG1vZGVsPSJ0d293YXkiLHR5cGU9ImFncmVlbWVudCIsdW5pdD0iYXZlcmFnZSIpDQpWUUlDQ1JhdGluZ0FncmVlV29yZEF2ZXJkb29tdyA8LSBpY2MocGhhcnluZ2VhbHNWUUlSUkNhc3RbMTUyOjE1N10sbW9kZWw9InR3b3dheSIsdHlwZT0iYWdyZWVtZW50Iix1bml0PSJhdmVyYWdlIikNClZRSUNDUmF0aW5nQWdyZWVXb3JkQXZlcmxvbzd3IDwtIGljYyhwaGFyeW5nZWFsc1ZRSVJSQ2FzdFsxNTg6MTYzXSxtb2RlbD0idHdvd2F5Iix0eXBlPSJhZ3JlZW1lbnQiLHVuaXQ9ImF2ZXJhZ2UiKQ0KVlFJQ0NSYXRpbmdBZ3JlZVdvcmRBdmVybWFhdHYgPC0gaWNjKHBoYXJ5bmdlYWxzVlFJUlJDYXN0WzE2NDoxNjldLG1vZGVsPSJ0d293YXkiLHR5cGU9ImFncmVlbWVudCIsdW5pdD0iYXZlcmFnZSIpDQpWUUlDQ1JhdGluZ0FncmVlV29yZEF2ZXJtYWF0dyA8LSBpY2MocGhhcnluZ2VhbHNWUUlSUkNhc3RbMTcwOjE3NV0sbW9kZWw9InR3b3dheSIsdHlwZT0iYWdyZWVtZW50Iix1bml0PSJhdmVyYWdlIikNClZRSUNDUmF0aW5nQWdyZWVXb3JkQXZlcm1vb3p3IDwtIGljYyhwaGFyeW5nZWFsc1ZRSVJSQ2FzdFsxNzY6MTgxXSxtb2RlbD0idHdvd2F5Iix0eXBlPSJhZ3JlZW1lbnQiLHVuaXQ9ImF2ZXJhZ2UiKQ0KVlFJQ0NSYXRpbmdBZ3JlZVdvcmRBdmVybXV1bncgPC0gaWNjKHBoYXJ5bmdlYWxzVlFJUlJDYXN0WzE4MjoxODddLG1vZGVsPSJ0d293YXkiLHR5cGU9ImFncmVlbWVudCIsdW5pdD0iYXZlcmFnZSIpDQpWUUlDQ1JhdGluZ0FncmVlV29yZEF2ZXJtdXVzdyA8LSBpY2MocGhhcnluZ2VhbHNWUUlSUkNhc3RbMTg4OjE5M10sbW9kZWw9InR3b3dheSIsdHlwZT0iYWdyZWVtZW50Iix1bml0PSJhdmVyYWdlIikNClZRSUNDUmF0aW5nQWdyZWVXb3JkQXZlcm5hYTd2IDwtIGljYyhwaGFyeW5nZWFsc1ZRSVJSQ2FzdFsxOTQ6MTk5XSxtb2RlbD0idHdvd2F5Iix0eXBlPSJhZ3JlZW1lbnQiLHVuaXQ9ImF2ZXJhZ2UiKQ0KVlFJQ0NSYXRpbmdBZ3JlZVdvcmRBdmVybmFhN3cgPC0gaWNjKHBoYXJ5bmdlYWxzVlFJUlJDYXN0WzIwMDoyMDVdLG1vZGVsPSJ0d293YXkiLHR5cGU9ImFncmVlbWVudCIsdW5pdD0iYXZlcmFnZSIpDQpWUUlDQ1JhdGluZ0FncmVlV29yZEF2ZXJuYWFtdiA8LSBpY2MocGhhcnluZ2VhbHNWUUlSUkNhc3RbMjA2OjIxMV0sbW9kZWw9InR3b3dheSIsdHlwZT0iYWdyZWVtZW50Iix1bml0PSJhdmVyYWdlIikNClZRSUNDUmF0aW5nQWdyZWVXb3JkQXZlcm5hYW13IDwtIGljYyhwaGFyeW5nZWFsc1ZRSVJSQ2FzdFsyMTI6MjE3XSxtb2RlbD0idHdvd2F5Iix0eXBlPSJhZ3JlZW1lbnQiLHVuaXQ9ImF2ZXJhZ2UiKQ0KVlFJQ0NSYXRpbmdBZ3JlZVdvcmRBdmVybm9vM3YgPC0gaWNjKHBoYXJ5bmdlYWxzVlFJUlJDYXN0WzIxODoyMjNdLG1vZGVsPSJ0d293YXkiLHR5cGU9ImFncmVlbWVudCIsdW5pdD0iYXZlcmFnZSIpDQpWUUlDQ1JhdGluZ0FncmVlV29yZEF2ZXJub28zdyA8LSBpY2MocGhhcnluZ2VhbHNWUUlSUkNhc3RbMjI0OjIyOV0sbW9kZWw9InR3b3dheSIsdHlwZT0iYWdyZWVtZW50Iix1bml0PSJhdmVyYWdlIikNClZRSUNDUmF0aW5nQWdyZWVXb3JkQXZlcm5vb213IDwtIGljYyhwaGFyeW5nZWFsc1ZRSVJSQ2FzdFsyMzA6MjM1XSxtb2RlbD0idHdvd2F5Iix0eXBlPSJhZ3JlZW1lbnQiLHVuaXQ9ImF2ZXJhZ2UiKQ0KVlFJQ0NSYXRpbmdBZ3JlZVdvcmRBdmVybnV1N3YgPC0gaWNjKHBoYXJ5bmdlYWxzVlFJUlJDYXN0WzIzNjoyNDFdLG1vZGVsPSJ0d293YXkiLHR5cGU9ImFncmVlbWVudCIsdW5pdD0iYXZlcmFnZSIpDQpWUUlDQ1JhdGluZ0FncmVlV29yZEF2ZXJudXU3dyA8LSBpY2MocGhhcnluZ2VhbHNWUUlSUkNhc3RbMjQyOjI0N10sbW9kZWw9InR3b3dheSIsdHlwZT0iYWdyZWVtZW50Iix1bml0PSJhdmVyYWdlIikNClZRSUNDUmF0aW5nQWdyZWVXb3JkQXZlcnNhYW12IDwtIGljYyhwaGFyeW5nZWFsc1ZRSVJSQ2FzdFsyNDg6MjUzXSxtb2RlbD0idHdvd2F5Iix0eXBlPSJhZ3JlZW1lbnQiLHVuaXQ9ImF2ZXJhZ2UiKQ0KVlFJQ0NSYXRpbmdBZ3JlZVdvcmRBdmVyc2FhbXcgPC0gaWNjKHBoYXJ5bmdlYWxzVlFJUlJDYXN0WzI1NDoyNTldLG1vZGVsPSJ0d293YXkiLHR5cGU9ImFncmVlbWVudCIsdW5pdD0iYXZlcmFnZSIpDQpWUUlDQ1JhdGluZ0FncmVlV29yZEF2ZXJ6YWE3dyA8LSBpY2MocGhhcnluZ2VhbHNWUUlSUkNhc3RbMjYwOjI2NV0sbW9kZWw9InR3b3dheSIsdHlwZT0iYWdyZWVtZW50Iix1bml0PSJhdmVyYWdlIikNClZRSUNDUmF0aW5nQWdyZWVXb3JkQXZlcnppaTd3IDwtIGljYyhwaGFyeW5nZWFsc1ZRSVJSQ2FzdFsyNjY6MjcxXSxtb2RlbD0idHdvd2F5Iix0eXBlPSJhZ3JlZW1lbnQiLHVuaXQ9ImF2ZXJhZ2UiKQ0KDQpgYGANCg0KIyMjIyBOYXNhbGlzYXRpb24NCldlIG1vdmUgdG8gdGhlIG5hc2FsaXNhdGlvbiBleHBlcmltZW50Lg0KDQojIyMjIyBDb25zaXN0ZW5jeQ0KQmVsb3cgYXJlIHRoZSBtb2RlbCBzcGVjaWZpY2F0aW9ucyBmb3IgdGhlIGNvbnNpc3RlbmN5Lg0KDQpgYGB7cn0NCk5hc0lDQ1JhdGluZ0NvbnNXb3JkQXZlciA8LSBpY2MocGhhcnluZ2VhbHNOYXNJUlJDYXN0WzI6MjcxXSxtb2RlbD0idHdvd2F5Iix0eXBlPSJjb25zaXN0ZW5jeSIsdW5pdD0iYXZlcmFnZSIpDQoNCk5hc0lDQ1JhdGluZ0NvbnNXb3JkQXZlcjNhYWZ3IDwtIGljYyhwaGFyeW5nZWFsc05hc0lSUkNhc3RbMjo3XSxtb2RlbD0idHdvd2F5Iix0eXBlPSJjb25zaXN0ZW5jeSIsdW5pdD0iYXZlcmFnZSIpDQpOYXNJQ0NSYXRpbmdDb25zV29yZEF2ZXIzYWFtdyA8LSBpY2MocGhhcnluZ2VhbHNOYXNJUlJDYXN0Wzg6MTNdLG1vZGVsPSJ0d293YXkiLHR5cGU9ImNvbnNpc3RlbmN5Iix1bml0PSJhdmVyYWdlIikNCk5hc0lDQ1JhdGluZ0NvbnNXb3JkQXZlcjNlZWJ2IDwtIGljYyhwaGFyeW5nZWFsc05hc0lSUkNhc3RbMTQ6MTldLG1vZGVsPSJ0d293YXkiLHR5cGU9ImNvbnNpc3RlbmN5Iix1bml0PSJhdmVyYWdlIikNCk5hc0lDQ1JhdGluZ0NvbnNXb3JkQXZlcjNlZWJ3IDwtIGljYyhwaGFyeW5nZWFsc05hc0lSUkNhc3RbMjA6MjVdLG1vZGVsPSJ0d293YXkiLHR5cGU9ImNvbnNpc3RlbmN5Iix1bml0PSJhdmVyYWdlIikNCk5hc0lDQ1JhdGluZ0NvbnNXb3JkQXZlcjNlZW53IDwtIGljYyhwaGFyeW5nZWFsc05hc0lSUkNhc3RbMjY6MzFdLG1vZGVsPSJ0d293YXkiLHR5cGU9ImNvbnNpc3RlbmN5Iix1bml0PSJhdmVyYWdlIikNCk5hc0lDQ1JhdGluZ0NvbnNXb3JkQXZlcjNpaXNodyA8LSBpY2MocGhhcnluZ2VhbHNOYXNJUlJDYXN0WzMyOjM3XSxtb2RlbD0idHdvd2F5Iix0eXBlPSJjb25zaXN0ZW5jeSIsdW5pdD0iYXZlcmFnZSIpDQpOYXNJQ0NSYXRpbmdDb25zV29yZEF2ZXIzb28zdiA8LSBpY2MocGhhcnluZ2VhbHNOYXNJUlJDYXN0WzM4OjQzXSxtb2RlbD0idHdvd2F5Iix0eXBlPSJjb25zaXN0ZW5jeSIsdW5pdD0iYXZlcmFnZSIpDQpOYXNJQ0NSYXRpbmdDb25zV29yZEF2ZXIzb28zdyA8LSBpY2MocGhhcnluZ2VhbHNOYXNJUlJDYXN0WzQ0OjQ5XSxtb2RlbD0idHdvd2F5Iix0eXBlPSJjb25zaXN0ZW5jeSIsdW5pdD0iYXZlcmFnZSIpDQpOYXNJQ0NSYXRpbmdDb25zV29yZEF2ZXIzb29udyA8LSBpY2MocGhhcnluZ2VhbHNOYXNJUlJDYXN0WzUwOjU1XSxtb2RlbD0idHdvd2F5Iix0eXBlPSJjb25zaXN0ZW5jeSIsdW5pdD0iYXZlcmFnZSIpDQpOYXNJQ0NSYXRpbmdDb25zV29yZEF2ZXI3YWFkdyA8LSBpY2MocGhhcnluZ2VhbHNOYXNJUlJDYXN0WzU2OjYxXSxtb2RlbD0idHdvd2F5Iix0eXBlPSJjb25zaXN0ZW5jeSIsdW5pdD0iYXZlcmFnZSIpDQpOYXNJQ0NSYXRpbmdDb25zV29yZEF2ZXI3ZWVmdiA8LSBpY2MocGhhcnluZ2VhbHNOYXNJUlJDYXN0WzYyOjY3XSxtb2RlbD0idHdvd2F5Iix0eXBlPSJjb25zaXN0ZW5jeSIsdW5pdD0iYXZlcmFnZSIpDQpOYXNJQ0NSYXRpbmdDb25zV29yZEF2ZXI3ZWVmdyA8LSBpY2MocGhhcnluZ2VhbHNOYXNJUlJDYXN0WzY4OjczXSxtb2RlbD0idHdvd2F5Iix0eXBlPSJjb25zaXN0ZW5jeSIsdW5pdD0iYXZlcmFnZSIpDQpOYXNJQ0NSYXRpbmdDb25zV29yZEF2ZXI3ZW53IDwtIGljYyhwaGFyeW5nZWFsc05hc0lSUkNhc3RbNzQ6NzldLG1vZGVsPSJ0d293YXkiLHR5cGU9ImNvbnNpc3RlbmN5Iix1bml0PSJhdmVyYWdlIikNCk5hc0lDQ1JhdGluZ0NvbnNXb3JkQXZlcjdvb2t3IDwtIGljYyhwaGFyeW5nZWFsc05hc0lSUkNhc3RbODA6ODVdLG1vZGVsPSJ0d293YXkiLHR5cGU9ImNvbnNpc3RlbmN5Iix1bml0PSJhdmVyYWdlIikNCk5hc0lDQ1JhdGluZ0NvbnNXb3JkQXZlcjdvb213IDwtIGljYyhwaGFyeW5nZWFsc05hc0lSUkNhc3RbODY6OTFdLG1vZGVsPSJ0d293YXkiLHR5cGU9ImNvbnNpc3RlbmN5Iix1bml0PSJhdmVyYWdlIikNCk5hc0lDQ1JhdGluZ0NvbnNXb3JkQXZlcmJhYTN3IDwtIGljYyhwaGFyeW5nZWFsc05hc0lSUkNhc3RbOTI6OTddLG1vZGVsPSJ0d293YXkiLHR5cGU9ImNvbnNpc3RlbmN5Iix1bml0PSJhdmVyYWdlIikNCk5hc0lDQ1JhdGluZ0NvbnNXb3JkQXZlcmJlZXR3IDwtIGljYyhwaGFyeW5nZWFsc05hc0lSUkNhc3RbOTg6MTAzXSxtb2RlbD0idHdvd2F5Iix0eXBlPSJjb25zaXN0ZW5jeSIsdW5pdD0iYXZlcmFnZSIpDQpOYXNJQ0NSYXRpbmdDb25zV29yZEF2ZXJiaWkzdiA8LSBpY2MocGhhcnluZ2VhbHNOYXNJUlJDYXN0WzEwNDoxMDldLG1vZGVsPSJ0d293YXkiLHR5cGU9ImNvbnNpc3RlbmN5Iix1bml0PSJhdmVyYWdlIikNCk5hc0lDQ1JhdGluZ0NvbnNXb3JkQXZlcmJpaTN3IDwtIGljYyhwaGFyeW5nZWFsc05hc0lSUkNhc3RbMTEwOjExNV0sbW9kZWw9InR3b3dheSIsdHlwZT0iY29uc2lzdGVuY3kiLHVuaXQ9ImF2ZXJhZ2UiKQ0KTmFzSUNDUmF0aW5nQ29uc1dvcmRBdmVyYm9vc2h3IDwtIGljYyhwaGFyeW5nZWFsc05hc0lSUkNhc3RbMTE2OjEyMV0sbW9kZWw9InR3b3dheSIsdHlwZT0iY29uc2lzdGVuY3kiLHVuaXQ9ImF2ZXJhZ2UiKQ0KTmFzSUNDUmF0aW5nQ29uc1dvcmRBdmVyZGFhc3cgPC0gaWNjKHBoYXJ5bmdlYWxzTmFzSVJSQ2FzdFsxMjI6MTI3XSxtb2RlbD0idHdvd2F5Iix0eXBlPSJjb25zaXN0ZW5jeSIsdW5pdD0iYXZlcmFnZSIpDQpOYXNJQ0NSYXRpbmdDb25zV29yZEF2ZXJkaWludyA8LSBpY2MocGhhcnluZ2VhbHNOYXNJUlJDYXN0WzEyODoxMzNdLG1vZGVsPSJ0d293YXkiLHR5cGU9ImNvbnNpc3RlbmN5Iix1bml0PSJhdmVyYWdlIikNCk5hc0lDQ1JhdGluZ0NvbnNXb3JkQXZlcmRqdXUzdiA8LSBpY2MocGhhcnluZ2VhbHNOYXNJUlJDYXN0WzEzNDoxMzldLG1vZGVsPSJ0d293YXkiLHR5cGU9ImNvbnNpc3RlbmN5Iix1bml0PSJhdmVyYWdlIikNCk5hc0lDQ1JhdGluZ0NvbnNXb3JkQXZlcmRqdXUzdyA8LSBpY2MocGhhcnluZ2VhbHNOYXNJUlJDYXN0WzE0MDoxNDVdLG1vZGVsPSJ0d293YXkiLHR5cGU9ImNvbnNpc3RlbmN5Iix1bml0PSJhdmVyYWdlIikNCk5hc0lDQ1JhdGluZ0NvbnNXb3JkQXZlcmRvb212IDwtIGljYyhwaGFyeW5nZWFsc05hc0lSUkNhc3RbMTQ2OjE1MV0sbW9kZWw9InR3b3dheSIsdHlwZT0iY29uc2lzdGVuY3kiLHVuaXQ9ImF2ZXJhZ2UiKQ0KTmFzSUNDUmF0aW5nQ29uc1dvcmRBdmVyZG9vbXcgPC0gaWNjKHBoYXJ5bmdlYWxzTmFzSVJSQ2FzdFsxNTI6MTU3XSxtb2RlbD0idHdvd2F5Iix0eXBlPSJjb25zaXN0ZW5jeSIsdW5pdD0iYXZlcmFnZSIpDQpOYXNJQ0NSYXRpbmdDb25zV29yZEF2ZXJsb283dyA8LSBpY2MocGhhcnluZ2VhbHNOYXNJUlJDYXN0WzE1ODoxNjNdLG1vZGVsPSJ0d293YXkiLHR5cGU9ImNvbnNpc3RlbmN5Iix1bml0PSJhdmVyYWdlIikNCk5hc0lDQ1JhdGluZ0NvbnNXb3JkQXZlcm1hYXR2IDwtIGljYyhwaGFyeW5nZWFsc05hc0lSUkNhc3RbMTY0OjE2OV0sbW9kZWw9InR3b3dheSIsdHlwZT0iY29uc2lzdGVuY3kiLHVuaXQ9ImF2ZXJhZ2UiKQ0KTmFzSUNDUmF0aW5nQ29uc1dvcmRBdmVybWFhdHcgPC0gaWNjKHBoYXJ5bmdlYWxzTmFzSVJSQ2FzdFsxNzA6MTc1XSxtb2RlbD0idHdvd2F5Iix0eXBlPSJjb25zaXN0ZW5jeSIsdW5pdD0iYXZlcmFnZSIpDQpOYXNJQ0NSYXRpbmdDb25zV29yZEF2ZXJtb296dyA8LSBpY2MocGhhcnluZ2VhbHNOYXNJUlJDYXN0WzE3NjoxODFdLG1vZGVsPSJ0d293YXkiLHR5cGU9ImNvbnNpc3RlbmN5Iix1bml0PSJhdmVyYWdlIikNCk5hc0lDQ1JhdGluZ0NvbnNXb3JkQXZlcm11dW53IDwtIGljYyhwaGFyeW5nZWFsc05hc0lSUkNhc3RbMTgyOjE4N10sbW9kZWw9InR3b3dheSIsdHlwZT0iY29uc2lzdGVuY3kiLHVuaXQ9ImF2ZXJhZ2UiKQ0KTmFzSUNDUmF0aW5nQ29uc1dvcmRBdmVybXV1c3cgPC0gaWNjKHBoYXJ5bmdlYWxzTmFzSVJSQ2FzdFsxODg6MTkzXSxtb2RlbD0idHdvd2F5Iix0eXBlPSJjb25zaXN0ZW5jeSIsdW5pdD0iYXZlcmFnZSIpDQpOYXNJQ0NSYXRpbmdDb25zV29yZEF2ZXJuYWE3diA8LSBpY2MocGhhcnluZ2VhbHNOYXNJUlJDYXN0WzE5NDoxOTldLG1vZGVsPSJ0d293YXkiLHR5cGU9ImNvbnNpc3RlbmN5Iix1bml0PSJhdmVyYWdlIikNCk5hc0lDQ1JhdGluZ0NvbnNXb3JkQXZlcm5hYTd3IDwtIGljYyhwaGFyeW5nZWFsc05hc0lSUkNhc3RbMjAwOjIwNV0sbW9kZWw9InR3b3dheSIsdHlwZT0iY29uc2lzdGVuY3kiLHVuaXQ9ImF2ZXJhZ2UiKQ0KTmFzSUNDUmF0aW5nQ29uc1dvcmRBdmVybmFhbXYgPC0gaWNjKHBoYXJ5bmdlYWxzTmFzSVJSQ2FzdFsyMDY6MjExXSxtb2RlbD0idHdvd2F5Iix0eXBlPSJjb25zaXN0ZW5jeSIsdW5pdD0iYXZlcmFnZSIpDQpOYXNJQ0NSYXRpbmdDb25zV29yZEF2ZXJuYWFtdyA8LSBpY2MocGhhcnluZ2VhbHNOYXNJUlJDYXN0WzIxMjoyMTddLG1vZGVsPSJ0d293YXkiLHR5cGU9ImNvbnNpc3RlbmN5Iix1bml0PSJhdmVyYWdlIikNCk5hc0lDQ1JhdGluZ0NvbnNXb3JkQXZlcm5vbzN2IDwtIGljYyhwaGFyeW5nZWFsc05hc0lSUkNhc3RbMjE4OjIyM10sbW9kZWw9InR3b3dheSIsdHlwZT0iY29uc2lzdGVuY3kiLHVuaXQ9ImF2ZXJhZ2UiKQ0KTmFzSUNDUmF0aW5nQ29uc1dvcmRBdmVybm9vM3cgPC0gaWNjKHBoYXJ5bmdlYWxzTmFzSVJSQ2FzdFsyMjQ6MjI5XSxtb2RlbD0idHdvd2F5Iix0eXBlPSJjb25zaXN0ZW5jeSIsdW5pdD0iYXZlcmFnZSIpDQpOYXNJQ0NSYXRpbmdDb25zV29yZEF2ZXJub29tdyA8LSBpY2MocGhhcnluZ2VhbHNOYXNJUlJDYXN0WzIzMDoyMzVdLG1vZGVsPSJ0d293YXkiLHR5cGU9ImNvbnNpc3RlbmN5Iix1bml0PSJhdmVyYWdlIikNCk5hc0lDQ1JhdGluZ0NvbnNXb3JkQXZlcm51dTd2IDwtIGljYyhwaGFyeW5nZWFsc05hc0lSUkNhc3RbMjM2OjI0MV0sbW9kZWw9InR3b3dheSIsdHlwZT0iY29uc2lzdGVuY3kiLHVuaXQ9ImF2ZXJhZ2UiKQ0KTmFzSUNDUmF0aW5nQ29uc1dvcmRBdmVybnV1N3cgPC0gaWNjKHBoYXJ5bmdlYWxzTmFzSVJSQ2FzdFsyNDI6MjQ3XSxtb2RlbD0idHdvd2F5Iix0eXBlPSJjb25zaXN0ZW5jeSIsdW5pdD0iYXZlcmFnZSIpDQpOYXNJQ0NSYXRpbmdDb25zV29yZEF2ZXJzYWFtdiA8LSBpY2MocGhhcnluZ2VhbHNOYXNJUlJDYXN0WzI0ODoyNTNdLG1vZGVsPSJ0d293YXkiLHR5cGU9ImNvbnNpc3RlbmN5Iix1bml0PSJhdmVyYWdlIikNCk5hc0lDQ1JhdGluZ0NvbnNXb3JkQXZlcnNhYW13IDwtIGljYyhwaGFyeW5nZWFsc05hc0lSUkNhc3RbMjU0OjI1OV0sbW9kZWw9InR3b3dheSIsdHlwZT0iY29uc2lzdGVuY3kiLHVuaXQ9ImF2ZXJhZ2UiKQ0KTmFzSUNDUmF0aW5nQ29uc1dvcmRBdmVyemFhN3cgPC0gaWNjKHBoYXJ5bmdlYWxzTmFzSVJSQ2FzdFsyNjA6MjY1XSxtb2RlbD0idHdvd2F5Iix0eXBlPSJjb25zaXN0ZW5jeSIsdW5pdD0iYXZlcmFnZSIpDQpOYXNJQ0NSYXRpbmdDb25zV29yZEF2ZXJ6aWk3dyA8LSBpY2MocGhhcnluZ2VhbHNOYXNJUlJDYXN0WzI2NjoyNzFdLG1vZGVsPSJ0d293YXkiLHR5cGU9ImNvbnNpc3RlbmN5Iix1bml0PSJhdmVyYWdlIikNCg0KYGBgDQoNCiMjIyMjIEFncmVlbWVudA0KQmVsb3cgYXJlIHRoZSBtb2RlbCBzcGVjaWZpY2F0aW9ucyBmb3IgdGhlIGFncmVlbWVudA0KDQpgYGB7cn0NCg0KTmFzSUNDUmF0aW5nQWdyZWVXb3JkQXZlciA8LSBpY2MocGhhcnluZ2VhbHNOYXNJUlJDYXN0WzI6MjcxXSxtb2RlbD0idHdvd2F5Iix0eXBlPSJhZ3JlZW1lbnQiLHVuaXQ9ImF2ZXJhZ2UiKQ0KDQpOYXNJQ0NSYXRpbmdBZ3JlZVdvcmRBdmVyM2FhZncgPC0gaWNjKHBoYXJ5bmdlYWxzTmFzSVJSQ2FzdFsyOjddLG1vZGVsPSJ0d293YXkiLHR5cGU9ImFncmVlbWVudCIsdW5pdD0iYXZlcmFnZSIpDQpOYXNJQ0NSYXRpbmdBZ3JlZVdvcmRBdmVyM2FhbXcgPC0gaWNjKHBoYXJ5bmdlYWxzTmFzSVJSQ2FzdFs4OjEzXSxtb2RlbD0idHdvd2F5Iix0eXBlPSJhZ3JlZW1lbnQiLHVuaXQ9ImF2ZXJhZ2UiKQ0KTmFzSUNDUmF0aW5nQWdyZWVXb3JkQXZlcjNlZWJ2IDwtIGljYyhwaGFyeW5nZWFsc05hc0lSUkNhc3RbMTQ6MTldLG1vZGVsPSJ0d293YXkiLHR5cGU9ImFncmVlbWVudCIsdW5pdD0iYXZlcmFnZSIpDQpOYXNJQ0NSYXRpbmdBZ3JlZVdvcmRBdmVyM2VlYncgPC0gaWNjKHBoYXJ5bmdlYWxzTmFzSVJSQ2FzdFsyMDoyNV0sbW9kZWw9InR3b3dheSIsdHlwZT0iYWdyZWVtZW50Iix1bml0PSJhdmVyYWdlIikNCk5hc0lDQ1JhdGluZ0FncmVlV29yZEF2ZXIzZWVudyA8LSBpY2MocGhhcnluZ2VhbHNOYXNJUlJDYXN0WzI2OjMxXSxtb2RlbD0idHdvd2F5Iix0eXBlPSJhZ3JlZW1lbnQiLHVuaXQ9ImF2ZXJhZ2UiKQ0KTmFzSUNDUmF0aW5nQWdyZWVXb3JkQXZlcjNpaXNodyA8LSBpY2MocGhhcnluZ2VhbHNOYXNJUlJDYXN0WzMyOjM3XSxtb2RlbD0idHdvd2F5Iix0eXBlPSJhZ3JlZW1lbnQiLHVuaXQ9ImF2ZXJhZ2UiKQ0KTmFzSUNDUmF0aW5nQWdyZWVXb3JkQXZlcjNvbzN2IDwtIGljYyhwaGFyeW5nZWFsc05hc0lSUkNhc3RbMzg6NDNdLG1vZGVsPSJ0d293YXkiLHR5cGU9ImFncmVlbWVudCIsdW5pdD0iYXZlcmFnZSIpDQpOYXNJQ0NSYXRpbmdBZ3JlZVdvcmRBdmVyM29vM3cgPC0gaWNjKHBoYXJ5bmdlYWxzTmFzSVJSQ2FzdFs0NDo0OV0sbW9kZWw9InR3b3dheSIsdHlwZT0iYWdyZWVtZW50Iix1bml0PSJhdmVyYWdlIikNCk5hc0lDQ1JhdGluZ0FncmVlV29yZEF2ZXIzb29udyA8LSBpY2MocGhhcnluZ2VhbHNOYXNJUlJDYXN0WzUwOjU1XSxtb2RlbD0idHdvd2F5Iix0eXBlPSJhZ3JlZW1lbnQiLHVuaXQ9ImF2ZXJhZ2UiKQ0KTmFzSUNDUmF0aW5nQWdyZWVXb3JkQXZlcjdhYWR3IDwtIGljYyhwaGFyeW5nZWFsc05hc0lSUkNhc3RbNTY6NjFdLG1vZGVsPSJ0d293YXkiLHR5cGU9ImFncmVlbWVudCIsdW5pdD0iYXZlcmFnZSIpDQpOYXNJQ0NSYXRpbmdBZ3JlZVdvcmRBdmVyN2VlZnYgPC0gaWNjKHBoYXJ5bmdlYWxzTmFzSVJSQ2FzdFs2Mjo2N10sbW9kZWw9InR3b3dheSIsdHlwZT0iYWdyZWVtZW50Iix1bml0PSJhdmVyYWdlIikNCk5hc0lDQ1JhdGluZ0FncmVlV29yZEF2ZXI3ZWVmdyA8LSBpY2MocGhhcnluZ2VhbHNOYXNJUlJDYXN0WzY4OjczXSxtb2RlbD0idHdvd2F5Iix0eXBlPSJhZ3JlZW1lbnQiLHVuaXQ9ImF2ZXJhZ2UiKQ0KTmFzSUNDUmF0aW5nQWdyZWVXb3JkQXZlcjdlbncgPC0gaWNjKHBoYXJ5bmdlYWxzTmFzSVJSQ2FzdFs3NDo3OV0sbW9kZWw9InR3b3dheSIsdHlwZT0iYWdyZWVtZW50Iix1bml0PSJhdmVyYWdlIikNCk5hc0lDQ1JhdGluZ0FncmVlV29yZEF2ZXI3b29rdyA8LSBpY2MocGhhcnluZ2VhbHNOYXNJUlJDYXN0WzgwOjg1XSxtb2RlbD0idHdvd2F5Iix0eXBlPSJhZ3JlZW1lbnQiLHVuaXQ9ImF2ZXJhZ2UiKQ0KTmFzSUNDUmF0aW5nQWdyZWVXb3JkQXZlcjdvb213IDwtIGljYyhwaGFyeW5nZWFsc05hc0lSUkNhc3RbODY6OTFdLG1vZGVsPSJ0d293YXkiLHR5cGU9ImFncmVlbWVudCIsdW5pdD0iYXZlcmFnZSIpDQpOYXNJQ0NSYXRpbmdBZ3JlZVdvcmRBdmVyYmFhM3cgPC0gaWNjKHBoYXJ5bmdlYWxzTmFzSVJSQ2FzdFs5Mjo5N10sbW9kZWw9InR3b3dheSIsdHlwZT0iYWdyZWVtZW50Iix1bml0PSJhdmVyYWdlIikNCk5hc0lDQ1JhdGluZ0FncmVlV29yZEF2ZXJiZWV0dyA8LSBpY2MocGhhcnluZ2VhbHNOYXNJUlJDYXN0Wzk4OjEwM10sbW9kZWw9InR3b3dheSIsdHlwZT0iYWdyZWVtZW50Iix1bml0PSJhdmVyYWdlIikNCk5hc0lDQ1JhdGluZ0FncmVlV29yZEF2ZXJiaWkzdiA8LSBpY2MocGhhcnluZ2VhbHNOYXNJUlJDYXN0WzEwNDoxMDldLG1vZGVsPSJ0d293YXkiLHR5cGU9ImFncmVlbWVudCIsdW5pdD0iYXZlcmFnZSIpDQpOYXNJQ0NSYXRpbmdBZ3JlZVdvcmRBdmVyYmlpM3cgPC0gaWNjKHBoYXJ5bmdlYWxzTmFzSVJSQ2FzdFsxMTA6MTE1XSxtb2RlbD0idHdvd2F5Iix0eXBlPSJhZ3JlZW1lbnQiLHVuaXQ9ImF2ZXJhZ2UiKQ0KTmFzSUNDUmF0aW5nQWdyZWVXb3JkQXZlcmJvb3NodyA8LSBpY2MocGhhcnluZ2VhbHNOYXNJUlJDYXN0WzExNjoxMjFdLG1vZGVsPSJ0d293YXkiLHR5cGU9ImFncmVlbWVudCIsdW5pdD0iYXZlcmFnZSIpDQpOYXNJQ0NSYXRpbmdBZ3JlZVdvcmRBdmVyZGFhc3cgPC0gaWNjKHBoYXJ5bmdlYWxzTmFzSVJSQ2FzdFsxMjI6MTI3XSxtb2RlbD0idHdvd2F5Iix0eXBlPSJhZ3JlZW1lbnQiLHVuaXQ9ImF2ZXJhZ2UiKQ0KTmFzSUNDUmF0aW5nQWdyZWVXb3JkQXZlcmRpaW53IDwtIGljYyhwaGFyeW5nZWFsc05hc0lSUkNhc3RbMTI4OjEzM10sbW9kZWw9InR3b3dheSIsdHlwZT0iYWdyZWVtZW50Iix1bml0PSJhdmVyYWdlIikNCk5hc0lDQ1JhdGluZ0FncmVlV29yZEF2ZXJkanV1M3YgPC0gaWNjKHBoYXJ5bmdlYWxzTmFzSVJSQ2FzdFsxMzQ6MTM5XSxtb2RlbD0idHdvd2F5Iix0eXBlPSJhZ3JlZW1lbnQiLHVuaXQ9ImF2ZXJhZ2UiKQ0KTmFzSUNDUmF0aW5nQWdyZWVXb3JkQXZlcmRqdXUzdyA8LSBpY2MocGhhcnluZ2VhbHNOYXNJUlJDYXN0WzE0MDoxNDVdLG1vZGVsPSJ0d293YXkiLHR5cGU9ImFncmVlbWVudCIsdW5pdD0iYXZlcmFnZSIpDQpOYXNJQ0NSYXRpbmdBZ3JlZVdvcmRBdmVyZG9vbXYgPC0gaWNjKHBoYXJ5bmdlYWxzTmFzSVJSQ2FzdFsxNDY6MTUxXSxtb2RlbD0idHdvd2F5Iix0eXBlPSJhZ3JlZW1lbnQiLHVuaXQ9ImF2ZXJhZ2UiKQ0KTmFzSUNDUmF0aW5nQWdyZWVXb3JkQXZlcmRvb213IDwtIGljYyhwaGFyeW5nZWFsc05hc0lSUkNhc3RbMTUyOjE1N10sbW9kZWw9InR3b3dheSIsdHlwZT0iYWdyZWVtZW50Iix1bml0PSJhdmVyYWdlIikNCk5hc0lDQ1JhdGluZ0FncmVlV29yZEF2ZXJsb283dyA8LSBpY2MocGhhcnluZ2VhbHNOYXNJUlJDYXN0WzE1ODoxNjNdLG1vZGVsPSJ0d293YXkiLHR5cGU9ImFncmVlbWVudCIsdW5pdD0iYXZlcmFnZSIpDQpOYXNJQ0NSYXRpbmdBZ3JlZVdvcmRBdmVybWFhdHYgPC0gaWNjKHBoYXJ5bmdlYWxzTmFzSVJSQ2FzdFsxNjQ6MTY5XSxtb2RlbD0idHdvd2F5Iix0eXBlPSJhZ3JlZW1lbnQiLHVuaXQ9ImF2ZXJhZ2UiKQ0KTmFzSUNDUmF0aW5nQWdyZWVXb3JkQXZlcm1hYXR3IDwtIGljYyhwaGFyeW5nZWFsc05hc0lSUkNhc3RbMTcwOjE3NV0sbW9kZWw9InR3b3dheSIsdHlwZT0iYWdyZWVtZW50Iix1bml0PSJhdmVyYWdlIikNCk5hc0lDQ1JhdGluZ0FncmVlV29yZEF2ZXJtb296dyA8LSBpY2MocGhhcnluZ2VhbHNOYXNJUlJDYXN0WzE3NjoxODFdLG1vZGVsPSJ0d293YXkiLHR5cGU9ImFncmVlbWVudCIsdW5pdD0iYXZlcmFnZSIpDQpOYXNJQ0NSYXRpbmdBZ3JlZVdvcmRBdmVybXV1bncgPC0gaWNjKHBoYXJ5bmdlYWxzTmFzSVJSQ2FzdFsxODI6MTg3XSxtb2RlbD0idHdvd2F5Iix0eXBlPSJhZ3JlZW1lbnQiLHVuaXQ9ImF2ZXJhZ2UiKQ0KTmFzSUNDUmF0aW5nQWdyZWVXb3JkQXZlcm11dXN3IDwtIGljYyhwaGFyeW5nZWFsc05hc0lSUkNhc3RbMTg4OjE5M10sbW9kZWw9InR3b3dheSIsdHlwZT0iYWdyZWVtZW50Iix1bml0PSJhdmVyYWdlIikNCk5hc0lDQ1JhdGluZ0FncmVlV29yZEF2ZXJuYWE3diA8LSBpY2MocGhhcnluZ2VhbHNOYXNJUlJDYXN0WzE5NDoxOTldLG1vZGVsPSJ0d293YXkiLHR5cGU9ImFncmVlbWVudCIsdW5pdD0iYXZlcmFnZSIpDQpOYXNJQ0NSYXRpbmdBZ3JlZVdvcmRBdmVybmFhN3cgPC0gaWNjKHBoYXJ5bmdlYWxzTmFzSVJSQ2FzdFsyMDA6MjA1XSxtb2RlbD0idHdvd2F5Iix0eXBlPSJhZ3JlZW1lbnQiLHVuaXQ9ImF2ZXJhZ2UiKQ0KTmFzSUNDUmF0aW5nQWdyZWVXb3JkQXZlcm5hYW12IDwtIGljYyhwaGFyeW5nZWFsc05hc0lSUkNhc3RbMjA2OjIxMV0sbW9kZWw9InR3b3dheSIsdHlwZT0iYWdyZWVtZW50Iix1bml0PSJhdmVyYWdlIikNCk5hc0lDQ1JhdGluZ0FncmVlV29yZEF2ZXJuYWFtdyA8LSBpY2MocGhhcnluZ2VhbHNOYXNJUlJDYXN0WzIxMjoyMTddLG1vZGVsPSJ0d293YXkiLHR5cGU9ImFncmVlbWVudCIsdW5pdD0iYXZlcmFnZSIpDQpOYXNJQ0NSYXRpbmdBZ3JlZVdvcmRBdmVybm9vM3YgPC0gaWNjKHBoYXJ5bmdlYWxzTmFzSVJSQ2FzdFsyMTg6MjIzXSxtb2RlbD0idHdvd2F5Iix0eXBlPSJhZ3JlZW1lbnQiLHVuaXQ9ImF2ZXJhZ2UiKQ0KTmFzSUNDUmF0aW5nQWdyZWVXb3JkQXZlcm5vbzN3IDwtIGljYyhwaGFyeW5nZWFsc05hc0lSUkNhc3RbMjI0OjIyOV0sbW9kZWw9InR3b3dheSIsdHlwZT0iYWdyZWVtZW50Iix1bml0PSJhdmVyYWdlIikNCk5hc0lDQ1JhdGluZ0FncmVlV29yZEF2ZXJub29tdyA8LSBpY2MocGhhcnluZ2VhbHNOYXNJUlJDYXN0WzIzMDoyMzVdLG1vZGVsPSJ0d293YXkiLHR5cGU9ImFncmVlbWVudCIsdW5pdD0iYXZlcmFnZSIpDQpOYXNJQ0NSYXRpbmdBZ3JlZVdvcmRBdmVybnV1N3YgPC0gaWNjKHBoYXJ5bmdlYWxzTmFzSVJSQ2FzdFsyMzY6MjQxXSxtb2RlbD0idHdvd2F5Iix0eXBlPSJhZ3JlZW1lbnQiLHVuaXQ9ImF2ZXJhZ2UiKQ0KTmFzSUNDUmF0aW5nQWdyZWVXb3JkQXZlcm51dTd3IDwtIGljYyhwaGFyeW5nZWFsc05hc0lSUkNhc3RbMjQyOjI0N10sbW9kZWw9InR3b3dheSIsdHlwZT0iYWdyZWVtZW50Iix1bml0PSJhdmVyYWdlIikNCk5hc0lDQ1JhdGluZ0FncmVlV29yZEF2ZXJzYWFtdiA8LSBpY2MocGhhcnluZ2VhbHNOYXNJUlJDYXN0WzI0ODoyNTNdLG1vZGVsPSJ0d293YXkiLHR5cGU9ImFncmVlbWVudCIsdW5pdD0iYXZlcmFnZSIpDQpOYXNJQ0NSYXRpbmdBZ3JlZVdvcmRBdmVyc2FhbXcgPC0gaWNjKHBoYXJ5bmdlYWxzTmFzSVJSQ2FzdFsyNTQ6MjU5XSxtb2RlbD0idHdvd2F5Iix0eXBlPSJhZ3JlZW1lbnQiLHVuaXQ9ImF2ZXJhZ2UiKQ0KTmFzSUNDUmF0aW5nQWdyZWVXb3JkQXZlcnphYTd3IDwtIGljYyhwaGFyeW5nZWFsc05hc0lSUkNhc3RbMjYwOjI2NV0sbW9kZWw9InR3b3dheSIsdHlwZT0iYWdyZWVtZW50Iix1bml0PSJhdmVyYWdlIikNCk5hc0lDQ1JhdGluZ0FncmVlV29yZEF2ZXJ6aWk3dyA8LSBpY2MocGhhcnluZ2VhbHNOYXNJUlJDYXN0WzI2NjoyNzFdLG1vZGVsPSJ0d293YXkiLHR5cGU9ImFncmVlbWVudCIsdW5pdD0iYXZlcmFnZSIpDQoNCmBgYA0KDQojIyMgR2V0dGluZyBjb2VmZmljaWVudHMNCkJlbG93LCB3ZSB1c2UgYSBhIG1vZGlmaWVkIHNjcmlwdCB0aGF0IHdpbGwgYWxsb3cgdXMgdG8gZ2V0IGFsbCBjb2VmZmljaWVudHMgZnJvbSB0aGUgbW9kZWxzICh0aGFua3MgdG8gQm9kbyBXaW50ZXIgZm9yIHNoYXJpbmcpLg0KDQpgYGB7cn0NCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiNnZXR0aW5nIGNvZWZmaWNpZW50cyAjIEFkYXB0ZWQgZnJvbSBCb2RvIFdpbnRlcg0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KDQojIyBHZXQgY2hhcmFjdGVyIHZlY3RvcnMgd2l0aCBhbGwgbW9kZWwgbmFtZXMgZm9yIGZ1bGwgYW5kIG51bGwgbW9kZWxzOg0KDQphbGxfbW9kZWxzIDwtIGdyZXAoJ0lDQ1JhdGluZycsIGxzKCksIHZhbHVlID0gVCkNCg0KIyMgQ3JlYXRlIGFuIGVtcHR5IGRhdGEgZnJhbWUgdG8gYmUgZmlsbGVkIHdpdGggcmVzdWx0cyBmcm9tIGxpa2VsaWhvb2QgcmF0aW8gdGVzdHM6DQoNCnJlc3VsdHNJQ0MgPC0gZGF0YS5mcmFtZShUeXBlID0gY2hhcmFjdGVyKGxlbmd0aChhbGxfbW9kZWxzKSksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQ0NWYWwgPSBudW1lcmljKGxlbmd0aChhbGxfbW9kZWxzKSksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb3dlckNvbmZJbnQgPSBudW1lcmljKGxlbmd0aChhbGxfbW9kZWxzKSksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cHBlckNvbmZJbnQgPSBudW1lcmljKGxlbmd0aChhbGxfbW9kZWxzKSksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVmFsdWUgPSBudW1lcmljKGxlbmd0aChhbGxfbW9kZWxzKSksDQogICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nc0FzRmFjdG9ycz1GQUxTRSkNCg0KIyMgTG9vcCB0aHJvdWdoIG1vZGVsIG5hbWVzIGFuZCBhcHBlbmQgZG8gZGF0YSBmcmFtZToNCg0KZm9yIChpIGluIDE6bGVuZ3RoKGFsbF9tb2RlbHMpKSB7DQogIHRoaXNfZnVsbCA8LSBnZXQoYWxsX21vZGVsc1tpXSkNCiAgDQogIHJlc3VsdHNJQ0NbaSwgXSRUeXBlIDwtIHRoaXNfZnVsbCR0eXBlDQogIHJlc3VsdHNJQ0NbaSwgXSRJQ0NWYWwgPC0gdGhpc19mdWxsJHZhbHVlDQogIHJlc3VsdHNJQ0NbaSwgXSRsb3dlckNvbmZJbnQgPC0gdGhpc19mdWxsJGxib3VuZA0KICByZXN1bHRzSUNDW2ksIF0kdXBwZXJDb25mSW50IDwtIHRoaXNfZnVsbCR1Ym91bmQNCiAgcmVzdWx0c0lDQ1tpLCBdJHBWYWx1ZSA8LSB0aGlzX2Z1bGwkcC52YWx1ZQ0KfQ0Kcm93bmFtZXMocmVzdWx0c0lDQykgPC0gZ3N1YignSUNDUmF0aW5nJywgJ0lDQ1JhdGluZycsIGFsbF9tb2RlbHMpDQoNCndyaXRlLmNzdihyZXN1bHRzSUNDLCBmaWxlID0gIlBob25ldGljYVJlc3VsdHNJQ0NSYXRpbmcuY3N2IikNCg0KYGBgDQoNCiMjIyBSZWFkaW5nIGFuZCBzdWJzZXR0aW5nIHRoZSBJQ0MgZGF0YQ0KV2UgaGF2ZSBkb25lIHNvbWUgbWlub3IgY2hhbmdlcyB0byB0aGUgc2F2ZWQgZGF0YS1mcmFtZSBpbiB0ZXJtcyBvZiBuYW1lcywgZXRjLi4gYW5kIHNvIHdlIHJlYWQgdGhlIGRhdGEtZnJhbWUgYWdhaW4uDQpXZSBzdGFydCBieSBzdWJzZXR0aW5nIHRoZSBkYXRhIGFuZCBjcmVhdGluZyBmb3VyIG5ldyBkYXRhLWZyYW1lcyBmb3IgZWFjaCBvZiB0aGUgVlEgYW5kIE5hc2FsaXNhdGlvbiBleHBlcmltZW50cyBhbmQgdGhlIGNvbnNpc3RlbmN5IGFuZCBhZ3JlZW1lbnQuIFdlIHRoZW4gY2hhbmdlIGZhY3RvciBsZXZlbHMuDQoNCmBgYHtyfQ0KUGhvbmV0aWNhSUNDUmF0aW5nV29yZCA8LSByZWFkLmNzdigiUGhvbmV0aWNhSUNDUmF0aW5nV29yZC5jc3YiKQ0KDQojIHNvbWUgc3Vic2V0dGluZw0KUGhvbmV0aWNhSUNDUmF0aW5nV29yZE5hc0FncmVlIDwtIFBob25ldGljYUlDQ1JhdGluZ1dvcmRbd2hpY2goUGhvbmV0aWNhSUNDUmF0aW5nV29yZCRleHBlcmltZW50ID09J05hc2FsaXNhdGlvbicNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmIFBob25ldGljYUlDQ1JhdGluZ1dvcmQkVHlwZSA9PSAnYWdyZWVtZW50JyksXQ0KDQpQaG9uZXRpY2FJQ0NSYXRpbmdXb3JkTmFzQ29ucyA8LSBQaG9uZXRpY2FJQ0NSYXRpbmdXb3JkW3doaWNoKFBob25ldGljYUlDQ1JhdGluZ1dvcmQkZXhwZXJpbWVudCA9PSdOYXNhbGlzYXRpb24nDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmIFBob25ldGljYUlDQ1JhdGluZ1dvcmQkVHlwZSA9PSAnY29uc2lzdGVuY3knKSxdDQoNCg0KUGhvbmV0aWNhSUNDUmF0aW5nV29yZFZRQWdyZWUgPC0gUGhvbmV0aWNhSUNDUmF0aW5nV29yZFt3aGljaChQaG9uZXRpY2FJQ0NSYXRpbmdXb3JkJGV4cGVyaW1lbnQgPT0nVm9pY2UgUXVhbGl0eScNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYgUGhvbmV0aWNhSUNDUmF0aW5nV29yZCRUeXBlID09ICdhZ3JlZW1lbnQnKSxdDQoNClBob25ldGljYUlDQ1JhdGluZ1dvcmRWUUNvbnMgPC0gUGhvbmV0aWNhSUNDUmF0aW5nV29yZFt3aGljaChQaG9uZXRpY2FJQ0NSYXRpbmdXb3JkJGV4cGVyaW1lbnQgPT0nVm9pY2UgUXVhbGl0eScNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiBQaG9uZXRpY2FJQ0NSYXRpbmdXb3JkJFR5cGUgPT0gJ2NvbnNpc3RlbmN5JyksXQ0KDQojIyMgYmVsb3cgaXMgdG8gYmUgdXNlZCB0byBjaGFuZ2UgbGV2ZWxzIG9mIGZhY3RvciBhZnRlciBzdWJzZXR0aW5nDQoNClBob25ldGljYUlDQ1JhdGluZ1dvcmROYXNBZ3JlZSRleHBlcmltZW50IDwtIGZhY3RvcihQaG9uZXRpY2FJQ0NSYXRpbmdXb3JkTmFzQWdyZWUkZXhwZXJpbWVudCkNClBob25ldGljYUlDQ1JhdGluZ1dvcmROYXNBZ3JlZSRUeXBlIDwtIGZhY3RvcihQaG9uZXRpY2FJQ0NSYXRpbmdXb3JkTmFzQWdyZWUkVHlwZSkNCg0KDQpQaG9uZXRpY2FJQ0NSYXRpbmdXb3JkTmFzQ29ucyRleHBlcmltZW50IDwtIGZhY3RvcihQaG9uZXRpY2FJQ0NSYXRpbmdXb3JkTmFzQ29ucyRleHBlcmltZW50KQ0KUGhvbmV0aWNhSUNDUmF0aW5nV29yZE5hc0NvbnMkVHlwZSA8LSBmYWN0b3IoUGhvbmV0aWNhSUNDUmF0aW5nV29yZE5hc0NvbnMkVHlwZSkNCg0KDQpQaG9uZXRpY2FJQ0NSYXRpbmdXb3JkVlFBZ3JlZSRleHBlcmltZW50IDwtIGZhY3RvcihQaG9uZXRpY2FJQ0NSYXRpbmdXb3JkVlFBZ3JlZSRleHBlcmltZW50KQ0KUGhvbmV0aWNhSUNDUmF0aW5nV29yZFZRQWdyZWUkVHlwZSA8LSBmYWN0b3IoUGhvbmV0aWNhSUNDUmF0aW5nV29yZFZRQWdyZWUkVHlwZSkNCg0KDQpQaG9uZXRpY2FJQ0NSYXRpbmdXb3JkVlFDb25zJGV4cGVyaW1lbnQgPC0gZmFjdG9yKFBob25ldGljYUlDQ1JhdGluZ1dvcmRWUUNvbnMkZXhwZXJpbWVudCkNClBob25ldGljYUlDQ1JhdGluZ1dvcmRWUUNvbnMkVHlwZSA8LSBmYWN0b3IoUGhvbmV0aWNhSUNDUmF0aW5nV29yZFZRQ29ucyRUeXBlKQ0KDQpgYGANCg0KDQojIyMgRmlndXJlcw0KQmVsb3cgd2UgY2hhbmdlIHRoZSBvcmRlciBvZiB0aGUgZm91ciBkYXRhLWZyYW1lIGFjY29yZGluZyB0byB0aGUgSUNDIHZhbHVlIGZyb20gbG93ZXN0IHRvIGhpZ2hlc3QuIFdlIHRoZW4gcmVvcmRlciB0aGUgZmFjdG9yIGxldmVsICJjb250ZXh0Ii4gVGhlbiB3ZSBjaGFuZ2UgdGhlIG5hbWUgb2YgZWFjaCBvZiB0aGUgd29yZHMgaW50byBJUEEgKEludGVybmF0aW9uYWwgUGhvbmV0aWMgQWxwaGFiZXQpLiBXZSBjcmVhdGUgYSBuZXcgb3JkZXJlZCBmYWN0b3IgYW5kIHRoZW4gd2UgZHJhdyB0aGUgZmlndXJlLg0KDQojIyMjIFZvaWNlIFF1YWxpdHkgKFZRKQ0KV2Ugc3RhcnQgd2l0aCB0aGUgZmlyc3QgZXhwZXJpbWVudCBvbiBWb2ljZSBRdWFsaXR5LiBPdmVyYWxsLCB0aGUgcmF0ZXJzIHJlcG9ydGVkIGRpZmZpY3VsdGllcyB3aXRoIHRoZWlyIHJhdGluZ3Mgb2YgdGhlIHZvaWNlIHF1YWxpdHkgZXhwZXJpbWVudCwgbW9zdGx5IGluIGRlY2lkaW5nIG9uIHRoZSB0aGlyZCBjYXRlZ29yeSAidGVuc2UiLiBUaGlzIHNob3dlZCBpbiB0aGVpciBjb25zaXN0ZW5jeSBhbmQgYWdyZWVtZW50cw0KDQojIyMjIyBDb25zaXN0ZW5jeQ0KV2Ugc3RhcnQgd2l0aCB0aGUgY29uc2lzdGVuY3kNCg0KIyMjIyMjIFJlb3JkZXJpbmcgYW5kIGNoYW5naW5nIG5hbWVzDQpgYGB7cn0NCiMjIENvbnNpc3RlbmN5IHZvaWNlIHF1YWxpdHkgDQoNCm9yZC5yZVJhdGluZ0NvbnNWUSA8LSBQaG9uZXRpY2FJQ0NSYXRpbmdXb3JkVlFDb25zW29yZGVyKFBob25ldGljYUlDQ1JhdGluZ1dvcmRWUUNvbnMkSUNDVmFsKSxdDQpyb3duYW1lcyhvcmQucmVSYXRpbmdDb25zVlEpIDwtIE5VTEwNCm9yZC5yZVJhdGluZ0NvbnNWUSRjb250ZXh0IDwtIGZhY3RvcihvcmQucmVSYXRpbmdDb25zVlEkY29udGV4dCkNCg0Kb3JkLnJlUmF0aW5nQ29uc1ZRJGNvbnRleHQgPC0gYXMuY2hhcmFjdGVyKG9yZC5yZVJhdGluZ0NvbnNWUSRjb250ZXh0KQ0Kb3JkLnJlUmF0aW5nQ29uc1ZRJGNvbnRleHRbb3JkLnJlUmF0aW5nQ29uc1ZRJGNvbnRleHQgPT0gIjdhYWQtdyJdIDwtICJcdTAxMjdhOmQiDQpvcmQucmVSYXRpbmdDb25zVlEkY29udGV4dFtvcmQucmVSYXRpbmdDb25zVlEkY29udGV4dCA9PSAiN2VlZi13Il0gPC0gIlx1MDEyN2U6ZiINCm9yZC5yZVJhdGluZ0NvbnNWUSRjb250ZXh0W29yZC5yZVJhdGluZ0NvbnNWUSRjb250ZXh0ID09ICI3ZWVmLXYiXSA8LSAiXHUwMTI3ZTpmLXYiDQpvcmQucmVSYXRpbmdDb25zVlEkY29udGV4dFtvcmQucmVSYXRpbmdDb25zVlEkY29udGV4dCA9PSAiN2VuLXciXSA8LSAiXHUwMTI3ZW5uIg0Kb3JkLnJlUmF0aW5nQ29uc1ZRJGNvbnRleHRbb3JkLnJlUmF0aW5nQ29uc1ZRJGNvbnRleHQgPT0gIjdvb2stdyJdIDwtICJcdTAxMjdvOmsiDQpvcmQucmVSYXRpbmdDb25zVlEkY29udGV4dFtvcmQucmVSYXRpbmdDb25zVlEkY29udGV4dCA9PSAiN29vbS13Il0gPC0gIlx1MDEyN286bSINCm9yZC5yZVJhdGluZ0NvbnNWUSRjb250ZXh0W29yZC5yZVJhdGluZ0NvbnNWUSRjb250ZXh0ID09ICJsb283LXciXSA8LSAibG86XHUwMTI3Ig0Kb3JkLnJlUmF0aW5nQ29uc1ZRJGNvbnRleHRbb3JkLnJlUmF0aW5nQ29uc1ZRJGNvbnRleHQgPT0gIm5hYTctdyJdIDwtICJuYTpcdTAxMjciDQpvcmQucmVSYXRpbmdDb25zVlEkY29udGV4dFtvcmQucmVSYXRpbmdDb25zVlEkY29udGV4dCA9PSAibmFhNy12Il0gPC0gIm5hOlx1MDEyNy12Ig0Kb3JkLnJlUmF0aW5nQ29uc1ZRJGNvbnRleHRbb3JkLnJlUmF0aW5nQ29uc1ZRJGNvbnRleHQgPT0gIm51dTctdyJdIDwtICJudTpcdTAxMjciDQpvcmQucmVSYXRpbmdDb25zVlEkY29udGV4dFtvcmQucmVSYXRpbmdDb25zVlEkY29udGV4dCA9PSAibnV1Ny12Il0gPC0gIm51Olx1MDEyNy12Ig0Kb3JkLnJlUmF0aW5nQ29uc1ZRJGNvbnRleHRbb3JkLnJlUmF0aW5nQ29uc1ZRJGNvbnRleHQgPT0gInphYTctdyJdIDwtICJ6YTpcdTAxMjciDQpvcmQucmVSYXRpbmdDb25zVlEkY29udGV4dFtvcmQucmVSYXRpbmdDb25zVlEkY29udGV4dCA9PSAiemlpNy13Il0gPC0gInppOlx1MDEyNyINCm9yZC5yZVJhdGluZ0NvbnNWUSRjb250ZXh0W29yZC5yZVJhdGluZ0NvbnNWUSRjb250ZXh0ID09ICIzYWFmLXciXSA8LSAiypVhOmYiDQpvcmQucmVSYXRpbmdDb25zVlEkY29udGV4dFtvcmQucmVSYXRpbmdDb25zVlEkY29udGV4dCA9PSAiM2FhbS13Il0gPC0gIsqVYTptIg0Kb3JkLnJlUmF0aW5nQ29uc1ZRJGNvbnRleHRbb3JkLnJlUmF0aW5nQ29uc1ZRJGNvbnRleHQgPT0gIjNlZWItdyJdIDwtICLKlWU6YiINCm9yZC5yZVJhdGluZ0NvbnNWUSRjb250ZXh0W29yZC5yZVJhdGluZ0NvbnNWUSRjb250ZXh0ID09ICIzZWViLXYiXSA8LSAiypVlOmItdiINCm9yZC5yZVJhdGluZ0NvbnNWUSRjb250ZXh0W29yZC5yZVJhdGluZ0NvbnNWUSRjb250ZXh0ID09ICIzZWVuLXciXSA8LSAiypVlOm4iDQpvcmQucmVSYXRpbmdDb25zVlEkY29udGV4dFtvcmQucmVSYXRpbmdDb25zVlEkY29udGV4dCA9PSAiM2lpc2gtdyJdIDwtICLKlWE6yoMiDQpvcmQucmVSYXRpbmdDb25zVlEkY29udGV4dFtvcmQucmVSYXRpbmdDb25zVlEkY29udGV4dCA9PSAiM29vMy13Il0gPC0gIsqVbzrKlSINCm9yZC5yZVJhdGluZ0NvbnNWUSRjb250ZXh0W29yZC5yZVJhdGluZ0NvbnNWUSRjb250ZXh0ID09ICIzb28zLXYiXSA8LSAiypVvOsqVLXYiDQpvcmQucmVSYXRpbmdDb25zVlEkY29udGV4dFtvcmQucmVSYXRpbmdDb25zVlEkY29udGV4dCA9PSAiM29vbi13Il0gPC0gIsqVbzpuIg0Kb3JkLnJlUmF0aW5nQ29uc1ZRJGNvbnRleHRbb3JkLnJlUmF0aW5nQ29uc1ZRJGNvbnRleHQgPT0gImJhYTMtdyJdIDwtICJiYTrKlSINCm9yZC5yZVJhdGluZ0NvbnNWUSRjb250ZXh0W29yZC5yZVJhdGluZ0NvbnNWUSRjb250ZXh0ID09ICJiaWkzLXciXSA8LSAiYmk6ypUiDQpvcmQucmVSYXRpbmdDb25zVlEkY29udGV4dFtvcmQucmVSYXRpbmdDb25zVlEkY29udGV4dCA9PSAiYmlpMy12Il0gPC0gImJpOsqVLXYiDQpvcmQucmVSYXRpbmdDb25zVlEkY29udGV4dFtvcmQucmVSYXRpbmdDb25zVlEkY29udGV4dCA9PSAiYm9vc2gtdyJdIDwtICJibzrKgyINCm9yZC5yZVJhdGluZ0NvbnNWUSRjb250ZXh0W29yZC5yZVJhdGluZ0NvbnNWUSRjb250ZXh0ID09ICJkanV1My13Il0gPC0gImTNocqSdTrKlSINCm9yZC5yZVJhdGluZ0NvbnNWUSRjb250ZXh0W29yZC5yZVJhdGluZ0NvbnNWUSRjb250ZXh0ID09ICJkanV1My12Il0gPC0gImTNocqSdTrKlS12Ig0Kb3JkLnJlUmF0aW5nQ29uc1ZRJGNvbnRleHRbb3JkLnJlUmF0aW5nQ29uc1ZRJGNvbnRleHQgPT0gIm5vbzMtdyJdIDwtICJubzrKlSINCm9yZC5yZVJhdGluZ0NvbnNWUSRjb250ZXh0W29yZC5yZVJhdGluZ0NvbnNWUSRjb250ZXh0ID09ICJub28zLXYiXSA8LSAibm86ypUtdiINCm9yZC5yZVJhdGluZ0NvbnNWUSRjb250ZXh0W29yZC5yZVJhdGluZ0NvbnNWUSRjb250ZXh0ID09ICJiZWV0LXciXSA8LSAiYmU6dCINCm9yZC5yZVJhdGluZ0NvbnNWUSRjb250ZXh0W29yZC5yZVJhdGluZ0NvbnNWUSRjb250ZXh0ID09ICJkYWFzLXciXSA8LSAiZGE6cyINCm9yZC5yZVJhdGluZ0NvbnNWUSRjb250ZXh0W29yZC5yZVJhdGluZ0NvbnNWUSRjb250ZXh0ID09ICJkaWluLXciXSA8LSAiZGk6biINCm9yZC5yZVJhdGluZ0NvbnNWUSRjb250ZXh0W29yZC5yZVJhdGluZ0NvbnNWUSRjb250ZXh0ID09ICJkb29tLXciXSA8LSAiZG86bSINCm9yZC5yZVJhdGluZ0NvbnNWUSRjb250ZXh0W29yZC5yZVJhdGluZ0NvbnNWUSRjb250ZXh0ID09ICJkb29tLXYiXSA8LSAiZG86bS12Ig0Kb3JkLnJlUmF0aW5nQ29uc1ZRJGNvbnRleHRbb3JkLnJlUmF0aW5nQ29uc1ZRJGNvbnRleHQgPT0gImJlZXQtdyJdIDwtICJiZTp0Ig0Kb3JkLnJlUmF0aW5nQ29uc1ZRJGNvbnRleHRbb3JkLnJlUmF0aW5nQ29uc1ZRJGNvbnRleHQgPT0gIm1hYXQtdyJdIDwtICJtYTp0Ig0Kb3JkLnJlUmF0aW5nQ29uc1ZRJGNvbnRleHRbb3JkLnJlUmF0aW5nQ29uc1ZRJGNvbnRleHQgPT0gIm1hYXQtdiJdIDwtICJtYTp0LXYiDQpvcmQucmVSYXRpbmdDb25zVlEkY29udGV4dFtvcmQucmVSYXRpbmdDb25zVlEkY29udGV4dCA9PSAibW9vei13Il0gPC0gIm1vOnoiDQpvcmQucmVSYXRpbmdDb25zVlEkY29udGV4dFtvcmQucmVSYXRpbmdDb25zVlEkY29udGV4dCA9PSAibXV1bi13Il0gPC0gIm11Om4iDQpvcmQucmVSYXRpbmdDb25zVlEkY29udGV4dFtvcmQucmVSYXRpbmdDb25zVlEkY29udGV4dCA9PSAibXV1cy13Il0gPC0gIm11OnMiDQpvcmQucmVSYXRpbmdDb25zVlEkY29udGV4dFtvcmQucmVSYXRpbmdDb25zVlEkY29udGV4dCA9PSAibmFhbS13Il0gPC0gIm5hOm0iDQpvcmQucmVSYXRpbmdDb25zVlEkY29udGV4dFtvcmQucmVSYXRpbmdDb25zVlEkY29udGV4dCA9PSAibmFhbS12Il0gPC0gIm5hOm0tdiINCm9yZC5yZVJhdGluZ0NvbnNWUSRjb250ZXh0W29yZC5yZVJhdGluZ0NvbnNWUSRjb250ZXh0ID09ICJub29tLXciXSA8LSAibm86bSINCm9yZC5yZVJhdGluZ0NvbnNWUSRjb250ZXh0W29yZC5yZVJhdGluZ0NvbnNWUSRjb250ZXh0ID09ICJzYWFtLXciXSA8LSAic2E6bSINCm9yZC5yZVJhdGluZ0NvbnNWUSRjb250ZXh0W29yZC5yZVJhdGluZ0NvbnNWUSRjb250ZXh0ID09ICJzYWFtLXYiXSA8LSAic2E6bS12Ig0Kb3JkLnJlUmF0aW5nQ29uc1ZRJGNvbnRleHRbb3JkLnJlUmF0aW5nQ29uc1ZRJGNvbnRleHQgPT0gImJlZXQtdyJdIDwtICJiZTp0Ig0Kb3JkLnJlUmF0aW5nQ29uc1ZRJGNvbnRleHQgPC0gYXMuZmFjdG9yKG9yZC5yZVJhdGluZ0NvbnNWUSRjb250ZXh0KQ0KIw0Kb3JkLnJlUmF0aW5nQ29uc1ZRJGNvbnRleHQgPC0gYXMudmVjdG9yKG9yZC5yZVJhdGluZ0NvbnNWUSRjb250ZXh0KSAjZ2V0IHJpZCBvZiBmYWN0b3JzDQpvcmQucmVSYXRpbmdDb25zVlEkY29udGV4dCA9IGZhY3RvcihvcmQucmVSYXRpbmdDb25zVlEkY29udGV4dCxvcmQucmVSYXRpbmdDb25zVlEkY29udGV4dCkgI2FkZCBvcmRlcmVkIGZhY3RvcnMgYmFjaw0KDQoNCm9yZC5yZVJhdGluZ0NvbnNWUQ0KDQpgYGANCg0KIyMjIyMjIERyYXdpbmcgdGhlIElSUiBmaWd1cmUNCldlIHVzZSB0aGUgY29kZSBiZWxvdyB0byBkcmF3IHRoZSBJQ0Mgd2l0aCBjb25maWRlbmNlIGludGVydmFscyBmb3IgdGhlIGNvbnNpc3RlbmN5IGluIHJhdGluZyB2b2ljZSBxdWFsaXR5LiANCmBgYHtyIGZpZy53aWR0aD05LCBmaWcuaGVpZ2h0PTV9DQoNCiMjIGNvZGUgYmVsb3cgYWxsb3dzIHRvIGRyYXcgdGhlIGZpZ3VyZQ0KcGFyKG9tYSA9IGMoMCwgMCwgMCwgMCkpDQpwbG90KDE6NDUsIG9yZC5yZVJhdGluZ0NvbnNWUSRJQ0NWYWwsIGF4ZXM9RkFMU0UsIHlsaW09YygtMywxKSwNCiAgICAgeWxhYj0iSUNDLiA5NSUgQ0kiLCB4bGFiPSIiLGNleD0yLGNleC5sYWI9MS41LGNleC5tYWluPTEuNSwNCiAgICAgbWFpbj0iQ29uc2lzdGVuY3kgSUNDIGZvciB2b2ljZSBxdWFsaXR5IixjZXguYXhpcz0xLjUpDQpheGlzKDIsY2V4LmxhYj0yLGNleC5heGlzPTEuNSkNCmF4aXMoMSxhdD0xOjQ1LCBsYWJlbHMgPSBsZXZlbHMob3JkLnJlUmF0aW5nQ29uc1ZRJGNvbnRleHQpLCANCiAgICAgbGFzPTIsY2V4LmxhYj0xLjUsY2V4LmF4aXM9MS41KQ0KZm9yKGkgaW4gMTo0NSkgc2VnbWVudHMoaSxvcmQucmVSYXRpbmdDb25zVlEkbG93ZXJDb25mSW50W2ldLA0KICAgICAgICAgICAgICAgICAgICAgICAgaSxvcmQucmVSYXRpbmdDb25zVlEkdXBwZXJDb25mSW50W2ldKQ0KDQphYmxpbmUoaCA9IDAsIGx0eT0yKQ0KYWJsaW5lKHYgPSAzMi41LCBsdHk9MikNCg0KYGBgDQoNCkFzIGNhbiBiZSBzZWVuIGZyb20gdGhlIGZpZ3VyZSBhYm92ZSwgdGhlIHJhdGVyIHdlcmUgZ2VuZXJhbGx5IGNvbnNpc3RlbnQgaW4gdGhlaXIgcmF0aW5ncyBhcyBhbGwgdGhlIHdvcmRzLCBtaW51cyB0aGUgZmlyc3QgNiByZWNlaXZlZCBwb3NpdGl2ZSByYXRpbmdzLiBUaGUgcmF0aW5ncyBmb3IgdGhlIGxhc3QgMTIgd29yZHMgc2hvd2VkIGEgY29uc2lzdGVudGx5IHN0YXRpc3RpY2FsbHkgc2lnbmlmaWNhbnQgcG9zaXRpdmUgcmF0aW5nLg0KDQojIyMjIyBBZ3JlZW1lbnQNCldlIG1vdmUgdG8gdGhlIGFncmVlbWVudCBiZXR3ZWVuIHJhdGVycw0KDQojIyMjIyMgUmVvcmRlcmluZyBhbmQgY2hhbmdpbmcgbmFtZXMNCmBgYHtyfQ0KIyMgQWdyZWVtZW50IFZvaWNlIFF1YWxpdHkgDQoNCm9yZC5yZVJhdGluZ0FncmVlVlEgPC0gUGhvbmV0aWNhSUNDUmF0aW5nV29yZFZRQWdyZWVbb3JkZXIoUGhvbmV0aWNhSUNDUmF0aW5nV29yZFZRQWdyZWUkSUNDVmFsKSxdDQpyb3duYW1lcyhvcmQucmVSYXRpbmdBZ3JlZVZRKSA8LSBOVUxMDQpvcmQucmVSYXRpbmdBZ3JlZVZRJGNvbnRleHQgPC0gZmFjdG9yKG9yZC5yZVJhdGluZ0FncmVlVlEkY29udGV4dCkNCg0Kb3JkLnJlUmF0aW5nQWdyZWVWUSRjb250ZXh0IDwtIGFzLmNoYXJhY3RlcihvcmQucmVSYXRpbmdBZ3JlZVZRJGNvbnRleHQpDQpvcmQucmVSYXRpbmdBZ3JlZVZRJGNvbnRleHRbb3JkLnJlUmF0aW5nQWdyZWVWUSRjb250ZXh0ID09ICI3YWFkLXciXSA8LSAiXHUwMTI3YTpkIg0Kb3JkLnJlUmF0aW5nQWdyZWVWUSRjb250ZXh0W29yZC5yZVJhdGluZ0FncmVlVlEkY29udGV4dCA9PSAiN2VlZi13Il0gPC0gIlx1MDEyN2U6ZiINCm9yZC5yZVJhdGluZ0FncmVlVlEkY29udGV4dFtvcmQucmVSYXRpbmdBZ3JlZVZRJGNvbnRleHQgPT0gIjdlZWYtdiJdIDwtICJcdTAxMjdlOmYtdiINCm9yZC5yZVJhdGluZ0FncmVlVlEkY29udGV4dFtvcmQucmVSYXRpbmdBZ3JlZVZRJGNvbnRleHQgPT0gIjdlbi13Il0gPC0gIlx1MDEyN2VubiINCm9yZC5yZVJhdGluZ0FncmVlVlEkY29udGV4dFtvcmQucmVSYXRpbmdBZ3JlZVZRJGNvbnRleHQgPT0gIjdvb2stdyJdIDwtICJcdTAxMjdvOmsiDQpvcmQucmVSYXRpbmdBZ3JlZVZRJGNvbnRleHRbb3JkLnJlUmF0aW5nQWdyZWVWUSRjb250ZXh0ID09ICI3b29tLXciXSA8LSAiXHUwMTI3bzptIg0Kb3JkLnJlUmF0aW5nQWdyZWVWUSRjb250ZXh0W29yZC5yZVJhdGluZ0FncmVlVlEkY29udGV4dCA9PSAibG9vNy13Il0gPC0gImxvOlx1MDEyNyINCm9yZC5yZVJhdGluZ0FncmVlVlEkY29udGV4dFtvcmQucmVSYXRpbmdBZ3JlZVZRJGNvbnRleHQgPT0gIm5hYTctdyJdIDwtICJuYTpcdTAxMjciDQpvcmQucmVSYXRpbmdBZ3JlZVZRJGNvbnRleHRbb3JkLnJlUmF0aW5nQWdyZWVWUSRjb250ZXh0ID09ICJuYWE3LXYiXSA8LSAibmE6XHUwMTI3LXYiDQpvcmQucmVSYXRpbmdBZ3JlZVZRJGNvbnRleHRbb3JkLnJlUmF0aW5nQWdyZWVWUSRjb250ZXh0ID09ICJudXU3LXciXSA8LSAibnU6XHUwMTI3Ig0Kb3JkLnJlUmF0aW5nQWdyZWVWUSRjb250ZXh0W29yZC5yZVJhdGluZ0FncmVlVlEkY29udGV4dCA9PSAibnV1Ny12Il0gPC0gIm51Olx1MDEyNy12Ig0Kb3JkLnJlUmF0aW5nQWdyZWVWUSRjb250ZXh0W29yZC5yZVJhdGluZ0FncmVlVlEkY29udGV4dCA9PSAiemFhNy13Il0gPC0gInphOlx1MDEyNyINCm9yZC5yZVJhdGluZ0FncmVlVlEkY29udGV4dFtvcmQucmVSYXRpbmdBZ3JlZVZRJGNvbnRleHQgPT0gInppaTctdyJdIDwtICJ6aTpcdTAxMjciDQpvcmQucmVSYXRpbmdBZ3JlZVZRJGNvbnRleHRbb3JkLnJlUmF0aW5nQWdyZWVWUSRjb250ZXh0ID09ICIzYWFmLXciXSA8LSAiypVhOmYiDQpvcmQucmVSYXRpbmdBZ3JlZVZRJGNvbnRleHRbb3JkLnJlUmF0aW5nQWdyZWVWUSRjb250ZXh0ID09ICIzYWFtLXciXSA8LSAiypVhOm0iDQpvcmQucmVSYXRpbmdBZ3JlZVZRJGNvbnRleHRbb3JkLnJlUmF0aW5nQWdyZWVWUSRjb250ZXh0ID09ICIzZWViLXciXSA8LSAiypVlOmIiDQpvcmQucmVSYXRpbmdBZ3JlZVZRJGNvbnRleHRbb3JkLnJlUmF0aW5nQWdyZWVWUSRjb250ZXh0ID09ICIzZWViLXYiXSA8LSAiypVlOmItdiINCm9yZC5yZVJhdGluZ0FncmVlVlEkY29udGV4dFtvcmQucmVSYXRpbmdBZ3JlZVZRJGNvbnRleHQgPT0gIjNlZW4tdyJdIDwtICLKlWU6biINCm9yZC5yZVJhdGluZ0FncmVlVlEkY29udGV4dFtvcmQucmVSYXRpbmdBZ3JlZVZRJGNvbnRleHQgPT0gIjNpaXNoLXciXSA8LSAiypVhOsqDIg0Kb3JkLnJlUmF0aW5nQWdyZWVWUSRjb250ZXh0W29yZC5yZVJhdGluZ0FncmVlVlEkY29udGV4dCA9PSAiM29vMy13Il0gPC0gIsqVbzrKlSINCm9yZC5yZVJhdGluZ0FncmVlVlEkY29udGV4dFtvcmQucmVSYXRpbmdBZ3JlZVZRJGNvbnRleHQgPT0gIjNvbzMtdiJdIDwtICLKlW86ypUtdiINCm9yZC5yZVJhdGluZ0FncmVlVlEkY29udGV4dFtvcmQucmVSYXRpbmdBZ3JlZVZRJGNvbnRleHQgPT0gIjNvb24tdyJdIDwtICLKlW86biINCm9yZC5yZVJhdGluZ0FncmVlVlEkY29udGV4dFtvcmQucmVSYXRpbmdBZ3JlZVZRJGNvbnRleHQgPT0gImJhYTMtdyJdIDwtICJiYTrKlSINCm9yZC5yZVJhdGluZ0FncmVlVlEkY29udGV4dFtvcmQucmVSYXRpbmdBZ3JlZVZRJGNvbnRleHQgPT0gImJpaTMtdyJdIDwtICJiaTrKlSINCm9yZC5yZVJhdGluZ0FncmVlVlEkY29udGV4dFtvcmQucmVSYXRpbmdBZ3JlZVZRJGNvbnRleHQgPT0gImJpaTMtdiJdIDwtICJiaTrKlS12Ig0Kb3JkLnJlUmF0aW5nQWdyZWVWUSRjb250ZXh0W29yZC5yZVJhdGluZ0FncmVlVlEkY29udGV4dCA9PSAiYm9vc2gtdyJdIDwtICJibzrKgyINCm9yZC5yZVJhdGluZ0FncmVlVlEkY29udGV4dFtvcmQucmVSYXRpbmdBZ3JlZVZRJGNvbnRleHQgPT0gImRqdXUzLXciXSA8LSAiZM2hypJ1OsqVIg0Kb3JkLnJlUmF0aW5nQWdyZWVWUSRjb250ZXh0W29yZC5yZVJhdGluZ0FncmVlVlEkY29udGV4dCA9PSAiZGp1dTMtdiJdIDwtICJkzaHKknU6ypUtdiINCm9yZC5yZVJhdGluZ0FncmVlVlEkY29udGV4dFtvcmQucmVSYXRpbmdBZ3JlZVZRJGNvbnRleHQgPT0gIm5vbzMtdyJdIDwtICJubzrKlSINCm9yZC5yZVJhdGluZ0FncmVlVlEkY29udGV4dFtvcmQucmVSYXRpbmdBZ3JlZVZRJGNvbnRleHQgPT0gIm5vbzMtdiJdIDwtICJubzrKlS12Ig0Kb3JkLnJlUmF0aW5nQWdyZWVWUSRjb250ZXh0W29yZC5yZVJhdGluZ0FncmVlVlEkY29udGV4dCA9PSAiYmVldC13Il0gPC0gImJlOnQiDQpvcmQucmVSYXRpbmdBZ3JlZVZRJGNvbnRleHRbb3JkLnJlUmF0aW5nQWdyZWVWUSRjb250ZXh0ID09ICJkYWFzLXciXSA8LSAiZGE6cyINCm9yZC5yZVJhdGluZ0FncmVlVlEkY29udGV4dFtvcmQucmVSYXRpbmdBZ3JlZVZRJGNvbnRleHQgPT0gImRpaW4tdyJdIDwtICJkaTpuIg0Kb3JkLnJlUmF0aW5nQWdyZWVWUSRjb250ZXh0W29yZC5yZVJhdGluZ0FncmVlVlEkY29udGV4dCA9PSAiZG9vbS13Il0gPC0gImRvOm0iDQpvcmQucmVSYXRpbmdBZ3JlZVZRJGNvbnRleHRbb3JkLnJlUmF0aW5nQWdyZWVWUSRjb250ZXh0ID09ICJkb29tLXYiXSA8LSAiZG86bS12Ig0Kb3JkLnJlUmF0aW5nQWdyZWVWUSRjb250ZXh0W29yZC5yZVJhdGluZ0FncmVlVlEkY29udGV4dCA9PSAiYmVldC13Il0gPC0gImJlOnQiDQpvcmQucmVSYXRpbmdBZ3JlZVZRJGNvbnRleHRbb3JkLnJlUmF0aW5nQWdyZWVWUSRjb250ZXh0ID09ICJtYWF0LXciXSA8LSAibWE6dCINCm9yZC5yZVJhdGluZ0FncmVlVlEkY29udGV4dFtvcmQucmVSYXRpbmdBZ3JlZVZRJGNvbnRleHQgPT0gIm1hYXQtdiJdIDwtICJtYTp0LXYiDQpvcmQucmVSYXRpbmdBZ3JlZVZRJGNvbnRleHRbb3JkLnJlUmF0aW5nQWdyZWVWUSRjb250ZXh0ID09ICJtb296LXciXSA8LSAibW86eiINCm9yZC5yZVJhdGluZ0FncmVlVlEkY29udGV4dFtvcmQucmVSYXRpbmdBZ3JlZVZRJGNvbnRleHQgPT0gIm11dW4tdyJdIDwtICJtdTpuIg0Kb3JkLnJlUmF0aW5nQWdyZWVWUSRjb250ZXh0W29yZC5yZVJhdGluZ0FncmVlVlEkY29udGV4dCA9PSAibXV1cy13Il0gPC0gIm11OnMiDQpvcmQucmVSYXRpbmdBZ3JlZVZRJGNvbnRleHRbb3JkLnJlUmF0aW5nQWdyZWVWUSRjb250ZXh0ID09ICJuYWFtLXciXSA8LSAibmE6bSINCm9yZC5yZVJhdGluZ0FncmVlVlEkY29udGV4dFtvcmQucmVSYXRpbmdBZ3JlZVZRJGNvbnRleHQgPT0gIm5hYW0tdiJdIDwtICJuYTptLXYiDQpvcmQucmVSYXRpbmdBZ3JlZVZRJGNvbnRleHRbb3JkLnJlUmF0aW5nQWdyZWVWUSRjb250ZXh0ID09ICJub29tLXciXSA8LSAibm86bSINCm9yZC5yZVJhdGluZ0FncmVlVlEkY29udGV4dFtvcmQucmVSYXRpbmdBZ3JlZVZRJGNvbnRleHQgPT0gInNhYW0tdyJdIDwtICJzYTptIg0Kb3JkLnJlUmF0aW5nQWdyZWVWUSRjb250ZXh0W29yZC5yZVJhdGluZ0FncmVlVlEkY29udGV4dCA9PSAic2FhbS12Il0gPC0gInNhOm0tdiINCm9yZC5yZVJhdGluZ0FncmVlVlEkY29udGV4dFtvcmQucmVSYXRpbmdBZ3JlZVZRJGNvbnRleHQgPT0gImJlZXQtdyJdIDwtICJiZTp0Ig0Kb3JkLnJlUmF0aW5nQWdyZWVWUSRjb250ZXh0IDwtIGFzLmZhY3RvcihvcmQucmVSYXRpbmdBZ3JlZVZRJGNvbnRleHQpDQoNCg0Kb3JkLnJlUmF0aW5nQWdyZWVWUSRjb250ZXh0IDwtIGFzLnZlY3RvcihvcmQucmVSYXRpbmdBZ3JlZVZRJGNvbnRleHQpICNnZXQgcmlkIG9mIGZhY3RvcnMNCm9yZC5yZVJhdGluZ0FncmVlVlEkY29udGV4dCA9IGZhY3RvcihvcmQucmVSYXRpbmdBZ3JlZVZRJGNvbnRleHQsb3JkLnJlUmF0aW5nQWdyZWVWUSRjb250ZXh0KSAjYWRkIG9yZGVyZWQgZmFjdG9ycyBiYWNrDQoNCm9yZC5yZVJhdGluZ0FncmVlVlENCg0KYGBgDQoNCiMjIyMjIyBEcmF3aW5nIHRoZSBJUlIgZmlndXJlDQoNCmBgYHtyIGZpZy53aWR0aD05LCBmaWcuaGVpZ2h0PTV9DQpwbG90KDE6NDUsIG9yZC5yZVJhdGluZ0FncmVlVlEkSUNDVmFsLCBheGVzPUZBTFNFLCB5bGltPWMoLTEsMSksDQogICAgIHlsYWI9IklDQy4gOTUlIENJIiwgeGxhYj0iIixjZXg9MixjZXgubGFiPTEuNSxjZXgubWFpbj0xLjUsDQogICAgIG1haW49IkFncmVlbWVudCBJQ0MgZm9yIHZvaWNlIHF1YWxpdHkiLGNleC5heGlzPTEuNSkNCmF4aXMoMixjZXgubGFiPTIsY2V4LmF4aXM9MS41KQ0KYXhpcygxLGF0PTE6NDUsIGxhYmVscyA9IGxldmVscyhvcmQucmVSYXRpbmdBZ3JlZVZRJGNvbnRleHQpLCANCiAgICAgbGFzPTIsY2V4LmxhYj0xLjUsY2V4LmF4aXM9MS41KQ0KZm9yKGkgaW4gMTo0NSkgc2VnbWVudHMoaSxvcmQucmVSYXRpbmdBZ3JlZVZRJGxvd2VyQ29uZkludFtpXSwNCiAgICAgICAgICAgICAgICAgICAgICAgIGksb3JkLnJlUmF0aW5nQWdyZWVWUSR1cHBlckNvbmZJbnRbaV0pDQphYmxpbmUoaCA9IDAsIGx0eT0yKQ0KYWJsaW5lKHYgPSAzMy41LCBsdHk9MikNCmBgYA0KQXMgd2l0aCB0aGUgY29uc2lzdGVuY3kgYWJvdmUsIHRoZSByYXRlcnMgYWdyZWVkIGFtb25nIHRoZW1zZWx2ZXMgb24gdGhlIG1ham9yaXR5IG9mIHdvcmRzIGFzIHRoZXNlIHJlY2VpdmVkIHBvc2l0aXZlIElDQ3MuIFRoZSBsYXN0IDEyIGFnYWluIHJlY2VpdmVkIGFuIGFncmVlbWVudCBpbiByYXRpbmdzIHRoYXQgd2FzIHN0YXRpc3RpY2FsbHkgc2lnbmlmaWNhbnQuIFNvbWUgd29yZHMgY29udGFpbmluZyBwaGFyeW5nZWFscywgYW5kIHNwZWNpZmljYWxseSB0aGUgdm9pY2VkIHBoYXJ5bmdlYWwsIHJlY2VpdmUgcG9zaXRpdmUgcmF0aW5ncy4NCg0KIyMjIyBOYXNhbGlzYXRpb24NCldlIG1vdmUgdG8gdGhlIHNlY29uZCBleHBlcmltZW50IG9uIE5hc2FsaXNhdGlvbi4gT3ZlcmFsbCwgdGhpcyBleHBlcmltZW50IHdhcyBzbGlnaHRseSBlYXNpZXIgZm9yIHRoZSByYXRlcnMgYXMgZXZpZGVuY2VkIGJ5IHRoZSBjb25zaXN0ZW5jeSBhbmQgYWdyZWVtZW50IGluIHRoZWlyIElDQyBzY29yZXMuDQoNCiMjIyMjIENvbnNpc3RlbmN5DQpXZSBzdGFydCB3aXRoIHRoZSBjb25zaXN0ZW5jeQ0KDQojIyMjIyMgUmVvcmRlcmluZyBhbmQgY2hhbmdpbmcgbmFtZXMNCg0KYGBge3J9DQojIyBDb25zaXN0ZW5jeSBuYXNhbGlzYXRpb24gDQoNCm9yZC5yZVJhdGluZ0NvbnNOYXMgPC0gUGhvbmV0aWNhSUNDUmF0aW5nV29yZE5hc0NvbnNbb3JkZXIoUGhvbmV0aWNhSUNDUmF0aW5nV29yZE5hc0NvbnMkSUNDVmFsKSxdDQpyb3duYW1lcyhvcmQucmVSYXRpbmdDb25zTmFzKSA8LSBOVUxMDQpvcmQucmVSYXRpbmdDb25zTmFzJGNvbnRleHQgPC0gZmFjdG9yKG9yZC5yZVJhdGluZ0NvbnNOYXMkY29udGV4dCkNCg0Kb3JkLnJlUmF0aW5nQ29uc05hcyRjb250ZXh0IDwtIGFzLmNoYXJhY3RlcihvcmQucmVSYXRpbmdDb25zTmFzJGNvbnRleHQpDQpvcmQucmVSYXRpbmdDb25zTmFzJGNvbnRleHRbb3JkLnJlUmF0aW5nQ29uc05hcyRjb250ZXh0ID09ICI3YWFkLXciXSA8LSAiXHUwMTI3YTpkIg0Kb3JkLnJlUmF0aW5nQ29uc05hcyRjb250ZXh0W29yZC5yZVJhdGluZ0NvbnNOYXMkY29udGV4dCA9PSAiN2VlZi13Il0gPC0gIlx1MDEyN2U6ZiINCm9yZC5yZVJhdGluZ0NvbnNOYXMkY29udGV4dFtvcmQucmVSYXRpbmdDb25zTmFzJGNvbnRleHQgPT0gIjdlZWYtdiJdIDwtICJcdTAxMjdlOmYtdiINCm9yZC5yZVJhdGluZ0NvbnNOYXMkY29udGV4dFtvcmQucmVSYXRpbmdDb25zTmFzJGNvbnRleHQgPT0gIjdlbi13Il0gPC0gIlx1MDEyN2VubiINCm9yZC5yZVJhdGluZ0NvbnNOYXMkY29udGV4dFtvcmQucmVSYXRpbmdDb25zTmFzJGNvbnRleHQgPT0gIjdvb2stdyJdIDwtICJcdTAxMjdvOmsiDQpvcmQucmVSYXRpbmdDb25zTmFzJGNvbnRleHRbb3JkLnJlUmF0aW5nQ29uc05hcyRjb250ZXh0ID09ICI3b29tLXciXSA8LSAiXHUwMTI3bzptIg0Kb3JkLnJlUmF0aW5nQ29uc05hcyRjb250ZXh0W29yZC5yZVJhdGluZ0NvbnNOYXMkY29udGV4dCA9PSAibG9vNy13Il0gPC0gImxvOlx1MDEyNyINCm9yZC5yZVJhdGluZ0NvbnNOYXMkY29udGV4dFtvcmQucmVSYXRpbmdDb25zTmFzJGNvbnRleHQgPT0gIm5hYTctdyJdIDwtICJuYTpcdTAxMjciDQpvcmQucmVSYXRpbmdDb25zTmFzJGNvbnRleHRbb3JkLnJlUmF0aW5nQ29uc05hcyRjb250ZXh0ID09ICJuYWE3LXYiXSA8LSAibmE6XHUwMTI3LXYiDQpvcmQucmVSYXRpbmdDb25zTmFzJGNvbnRleHRbb3JkLnJlUmF0aW5nQ29uc05hcyRjb250ZXh0ID09ICJudXU3LXciXSA8LSAibnU6XHUwMTI3Ig0Kb3JkLnJlUmF0aW5nQ29uc05hcyRjb250ZXh0W29yZC5yZVJhdGluZ0NvbnNOYXMkY29udGV4dCA9PSAibnV1Ny12Il0gPC0gIm51Olx1MDEyNy12Ig0Kb3JkLnJlUmF0aW5nQ29uc05hcyRjb250ZXh0W29yZC5yZVJhdGluZ0NvbnNOYXMkY29udGV4dCA9PSAiemFhNy13Il0gPC0gInphOlx1MDEyNyINCm9yZC5yZVJhdGluZ0NvbnNOYXMkY29udGV4dFtvcmQucmVSYXRpbmdDb25zTmFzJGNvbnRleHQgPT0gInppaTctdyJdIDwtICJ6aTpcdTAxMjciDQpvcmQucmVSYXRpbmdDb25zTmFzJGNvbnRleHRbb3JkLnJlUmF0aW5nQ29uc05hcyRjb250ZXh0ID09ICIzYWFmLXciXSA8LSAiypVhOmYiDQpvcmQucmVSYXRpbmdDb25zTmFzJGNvbnRleHRbb3JkLnJlUmF0aW5nQ29uc05hcyRjb250ZXh0ID09ICIzYWFtLXciXSA8LSAiypVhOm0iDQpvcmQucmVSYXRpbmdDb25zTmFzJGNvbnRleHRbb3JkLnJlUmF0aW5nQ29uc05hcyRjb250ZXh0ID09ICIzZWViLXciXSA8LSAiypVlOmIiDQpvcmQucmVSYXRpbmdDb25zTmFzJGNvbnRleHRbb3JkLnJlUmF0aW5nQ29uc05hcyRjb250ZXh0ID09ICIzZWViLXYiXSA8LSAiypVlOmItdiINCm9yZC5yZVJhdGluZ0NvbnNOYXMkY29udGV4dFtvcmQucmVSYXRpbmdDb25zTmFzJGNvbnRleHQgPT0gIjNlZW4tdyJdIDwtICLKlWU6biINCm9yZC5yZVJhdGluZ0NvbnNOYXMkY29udGV4dFtvcmQucmVSYXRpbmdDb25zTmFzJGNvbnRleHQgPT0gIjNpaXNoLXciXSA8LSAiypVhOsqDIg0Kb3JkLnJlUmF0aW5nQ29uc05hcyRjb250ZXh0W29yZC5yZVJhdGluZ0NvbnNOYXMkY29udGV4dCA9PSAiM29vMy13Il0gPC0gIsqVbzrKlSINCm9yZC5yZVJhdGluZ0NvbnNOYXMkY29udGV4dFtvcmQucmVSYXRpbmdDb25zTmFzJGNvbnRleHQgPT0gIjNvbzMtdiJdIDwtICLKlW86ypUtdiINCm9yZC5yZVJhdGluZ0NvbnNOYXMkY29udGV4dFtvcmQucmVSYXRpbmdDb25zTmFzJGNvbnRleHQgPT0gIjNvb24tdyJdIDwtICLKlW86biINCm9yZC5yZVJhdGluZ0NvbnNOYXMkY29udGV4dFtvcmQucmVSYXRpbmdDb25zTmFzJGNvbnRleHQgPT0gImJhYTMtdyJdIDwtICJiYTrKlSINCm9yZC5yZVJhdGluZ0NvbnNOYXMkY29udGV4dFtvcmQucmVSYXRpbmdDb25zTmFzJGNvbnRleHQgPT0gImJpaTMtdyJdIDwtICJiaTrKlSINCm9yZC5yZVJhdGluZ0NvbnNOYXMkY29udGV4dFtvcmQucmVSYXRpbmdDb25zTmFzJGNvbnRleHQgPT0gImJpaTMtdiJdIDwtICJiaTrKlS12Ig0Kb3JkLnJlUmF0aW5nQ29uc05hcyRjb250ZXh0W29yZC5yZVJhdGluZ0NvbnNOYXMkY29udGV4dCA9PSAiYm9vc2gtdyJdIDwtICJibzrKgyINCm9yZC5yZVJhdGluZ0NvbnNOYXMkY29udGV4dFtvcmQucmVSYXRpbmdDb25zTmFzJGNvbnRleHQgPT0gImRqdXUzLXciXSA8LSAiZM2hypJ1OsqVIg0Kb3JkLnJlUmF0aW5nQ29uc05hcyRjb250ZXh0W29yZC5yZVJhdGluZ0NvbnNOYXMkY29udGV4dCA9PSAiZGp1dTMtdiJdIDwtICJkzaHKknU6ypUtdiINCm9yZC5yZVJhdGluZ0NvbnNOYXMkY29udGV4dFtvcmQucmVSYXRpbmdDb25zTmFzJGNvbnRleHQgPT0gIm5vbzMtdyJdIDwtICJubzrKlSINCm9yZC5yZVJhdGluZ0NvbnNOYXMkY29udGV4dFtvcmQucmVSYXRpbmdDb25zTmFzJGNvbnRleHQgPT0gIm5vbzMtdiJdIDwtICJubzrKlS12Ig0Kb3JkLnJlUmF0aW5nQ29uc05hcyRjb250ZXh0W29yZC5yZVJhdGluZ0NvbnNOYXMkY29udGV4dCA9PSAiYmVldC13Il0gPC0gImJlOnQiDQpvcmQucmVSYXRpbmdDb25zTmFzJGNvbnRleHRbb3JkLnJlUmF0aW5nQ29uc05hcyRjb250ZXh0ID09ICJkYWFzLXciXSA8LSAiZGE6cyINCm9yZC5yZVJhdGluZ0NvbnNOYXMkY29udGV4dFtvcmQucmVSYXRpbmdDb25zTmFzJGNvbnRleHQgPT0gImRpaW4tdyJdIDwtICJkaTpuIg0Kb3JkLnJlUmF0aW5nQ29uc05hcyRjb250ZXh0W29yZC5yZVJhdGluZ0NvbnNOYXMkY29udGV4dCA9PSAiZG9vbS13Il0gPC0gImRvOm0iDQpvcmQucmVSYXRpbmdDb25zTmFzJGNvbnRleHRbb3JkLnJlUmF0aW5nQ29uc05hcyRjb250ZXh0ID09ICJkb29tLXYiXSA8LSAiZG86bS12Ig0Kb3JkLnJlUmF0aW5nQ29uc05hcyRjb250ZXh0W29yZC5yZVJhdGluZ0NvbnNOYXMkY29udGV4dCA9PSAiYmVldC13Il0gPC0gImJlOnQiDQpvcmQucmVSYXRpbmdDb25zTmFzJGNvbnRleHRbb3JkLnJlUmF0aW5nQ29uc05hcyRjb250ZXh0ID09ICJtYWF0LXciXSA8LSAibWE6dCINCm9yZC5yZVJhdGluZ0NvbnNOYXMkY29udGV4dFtvcmQucmVSYXRpbmdDb25zTmFzJGNvbnRleHQgPT0gIm1hYXQtdiJdIDwtICJtYTp0LXYiDQpvcmQucmVSYXRpbmdDb25zTmFzJGNvbnRleHRbb3JkLnJlUmF0aW5nQ29uc05hcyRjb250ZXh0ID09ICJtb296LXciXSA8LSAibW86eiINCm9yZC5yZVJhdGluZ0NvbnNOYXMkY29udGV4dFtvcmQucmVSYXRpbmdDb25zTmFzJGNvbnRleHQgPT0gIm11dW4tdyJdIDwtICJtdTpuIg0Kb3JkLnJlUmF0aW5nQ29uc05hcyRjb250ZXh0W29yZC5yZVJhdGluZ0NvbnNOYXMkY29udGV4dCA9PSAibXV1cy13Il0gPC0gIm11OnMiDQpvcmQucmVSYXRpbmdDb25zTmFzJGNvbnRleHRbb3JkLnJlUmF0aW5nQ29uc05hcyRjb250ZXh0ID09ICJuYWFtLXciXSA8LSAibmE6bSINCm9yZC5yZVJhdGluZ0NvbnNOYXMkY29udGV4dFtvcmQucmVSYXRpbmdDb25zTmFzJGNvbnRleHQgPT0gIm5hYW0tdiJdIDwtICJuYTptLXYiDQpvcmQucmVSYXRpbmdDb25zTmFzJGNvbnRleHRbb3JkLnJlUmF0aW5nQ29uc05hcyRjb250ZXh0ID09ICJub29tLXciXSA8LSAibm86bSINCm9yZC5yZVJhdGluZ0NvbnNOYXMkY29udGV4dFtvcmQucmVSYXRpbmdDb25zTmFzJGNvbnRleHQgPT0gInNhYW0tdyJdIDwtICJzYTptIg0Kb3JkLnJlUmF0aW5nQ29uc05hcyRjb250ZXh0W29yZC5yZVJhdGluZ0NvbnNOYXMkY29udGV4dCA9PSAic2FhbS12Il0gPC0gInNhOm0tdiINCm9yZC5yZVJhdGluZ0NvbnNOYXMkY29udGV4dFtvcmQucmVSYXRpbmdDb25zTmFzJGNvbnRleHQgPT0gImJlZXQtdyJdIDwtICJiZTp0Ig0Kb3JkLnJlUmF0aW5nQ29uc05hcyRjb250ZXh0IDwtIGFzLmZhY3RvcihvcmQucmVSYXRpbmdDb25zTmFzJGNvbnRleHQpDQoNCg0Kb3JkLnJlUmF0aW5nQ29uc05hcyRjb250ZXh0IDwtIGFzLnZlY3RvcihvcmQucmVSYXRpbmdDb25zTmFzJGNvbnRleHQpICNnZXQgcmlkIG9mIGZhY3RvcnMNCm9yZC5yZVJhdGluZ0NvbnNOYXMkY29udGV4dCA9IGZhY3RvcihvcmQucmVSYXRpbmdDb25zTmFzJGNvbnRleHQsb3JkLnJlUmF0aW5nQ29uc05hcyRjb250ZXh0KSAjYWRkIG9yZGVyZWQgZmFjdG9ycyBiYWNrDQoNCg0Kb3JkLnJlUmF0aW5nQ29uc05hcw0KDQpgYGANCg0KIyMjIyMjIERyYXdpbmcgdGhlIElSUiBmaWd1cmUNCg0KYGBge3IgZmlnLndpZHRoPTksIGZpZy5oZWlnaHQ9NX0NCnBhcihvbWEgPSBjKDAsIDAsIDAsIDApKQ0KcGxvdCgxOjQ1LCBvcmQucmVSYXRpbmdDb25zTmFzJElDQ1ZhbCwgYXhlcz1GQUxTRSwgeWxpbT1jKC0xLDEpLA0KICAgICB5bGFiPSJJQ0MuIDk1JSBDSSIsIHhsYWI9IiIsY2V4PTIsY2V4LmxhYj0xLjUsY2V4Lm1haW49MS41LA0KICAgICBtYWluPSJDb25zaXN0ZW5jeSBJQ0MgZm9yIG5hc2FsaXNhdGlvbiIsY2V4LmF4aXM9MS41KQ0KYXhpcygyLGNleC5sYWI9MixjZXguYXhpcz0xLjUpDQpheGlzKDEsYXQ9MTo0NSwgbGFiZWxzID0gbGV2ZWxzKG9yZC5yZVJhdGluZ0NvbnNOYXMkY29udGV4dCksIA0KICAgICBsYXM9MixjZXgubGFiPTEuNSxjZXguYXhpcz0xLjUpDQpmb3IoaSBpbiAxOjQ1KSBzZWdtZW50cyhpLG9yZC5yZVJhdGluZ0NvbnNOYXMkbG93ZXJDb25mSW50W2ldLA0KICAgICAgICAgICAgICAgICAgICAgICAgaSxvcmQucmVSYXRpbmdDb25zTmFzJHVwcGVyQ29uZkludFtpXSkNCg0KYWJsaW5lKGggPSAwLCBsdHk9MikNCmFibGluZSh2ID0gMjEuNSwgbHR5PTIpDQpgYGANClRoZSBuYXNhbGlzYXRpb24gZXhwZXJpbWVudCB3YXMgc29tZWhvdyAiZWFzaWVyIiB0byByYXRlcnMgYXMgdGhleSB3ZXJlIGFsd2F5cyBjb25zaXN0ZW50IGluIHRoZWlyIHJhdGluZ3Mgd2l0aCBvbmx5IHR3byB3b3JkcyByZWNlaXZlZCBuZWdhdGl2ZSBJQ0NzIGFuZCBuZWFybHkgaGFsZiBvZiB0aGUgd29yZHMgc2hvd2luZyBhIHN0YXRpc3RpY2FsbHkgc2lnbmlmaWNhbnQgcG9zaXRpdmUgcmF0aW5nLg0KDQojIyMjIyBBZ3JlZW1lbnQNCldlIG1vdmUgdG8gdGhlIGFncmVlbWVudA0KDQojIyMjIyMgUmVvcmRlcmluZyBhbmQgY2hhbmdpbmcgbmFtZXMNCg0KYGBge3J9DQoNCiMjIEFncmVlbWVudCBuYXNhbGlzYXRpb24gDQoNCm9yZC5yZVJhdGluZ0FncmVlTmFzIDwtIFBob25ldGljYUlDQ1JhdGluZ1dvcmROYXNBZ3JlZVtvcmRlcihQaG9uZXRpY2FJQ0NSYXRpbmdXb3JkTmFzQWdyZWUkSUNDVmFsKSxdDQpyb3duYW1lcyhvcmQucmVSYXRpbmdBZ3JlZU5hcykgPC0gTlVMTA0Kb3JkLnJlUmF0aW5nQWdyZWVOYXMkY29udGV4dCA8LSBmYWN0b3Iob3JkLnJlUmF0aW5nQWdyZWVOYXMkY29udGV4dCkNCg0Kb3JkLnJlUmF0aW5nQWdyZWVOYXMkY29udGV4dCA8LSBhcy5jaGFyYWN0ZXIob3JkLnJlUmF0aW5nQWdyZWVOYXMkY29udGV4dCkNCm9yZC5yZVJhdGluZ0FncmVlTmFzJGNvbnRleHRbb3JkLnJlUmF0aW5nQWdyZWVOYXMkY29udGV4dCA9PSAiN2FhZC13Il0gPC0gIlx1MDEyN2E6ZCINCm9yZC5yZVJhdGluZ0FncmVlTmFzJGNvbnRleHRbb3JkLnJlUmF0aW5nQWdyZWVOYXMkY29udGV4dCA9PSAiN2VlZi13Il0gPC0gIlx1MDEyN2U6ZiINCm9yZC5yZVJhdGluZ0FncmVlTmFzJGNvbnRleHRbb3JkLnJlUmF0aW5nQWdyZWVOYXMkY29udGV4dCA9PSAiN2VlZi12Il0gPC0gIlx1MDEyN2U6Zi12Ig0Kb3JkLnJlUmF0aW5nQWdyZWVOYXMkY29udGV4dFtvcmQucmVSYXRpbmdBZ3JlZU5hcyRjb250ZXh0ID09ICI3ZW4tdyJdIDwtICJcdTAxMjdlbm4iDQpvcmQucmVSYXRpbmdBZ3JlZU5hcyRjb250ZXh0W29yZC5yZVJhdGluZ0FncmVlTmFzJGNvbnRleHQgPT0gIjdvb2stdyJdIDwtICJcdTAxMjdvOmsiDQpvcmQucmVSYXRpbmdBZ3JlZU5hcyRjb250ZXh0W29yZC5yZVJhdGluZ0FncmVlTmFzJGNvbnRleHQgPT0gIjdvb20tdyJdIDwtICJcdTAxMjdvOm0iDQpvcmQucmVSYXRpbmdBZ3JlZU5hcyRjb250ZXh0W29yZC5yZVJhdGluZ0FncmVlTmFzJGNvbnRleHQgPT0gImxvbzctdyJdIDwtICJsbzpcdTAxMjciDQpvcmQucmVSYXRpbmdBZ3JlZU5hcyRjb250ZXh0W29yZC5yZVJhdGluZ0FncmVlTmFzJGNvbnRleHQgPT0gIm5hYTctdyJdIDwtICJuYTpcdTAxMjciDQpvcmQucmVSYXRpbmdBZ3JlZU5hcyRjb250ZXh0W29yZC5yZVJhdGluZ0FncmVlTmFzJGNvbnRleHQgPT0gIm5hYTctdiJdIDwtICJuYTpcdTAxMjctdiINCm9yZC5yZVJhdGluZ0FncmVlTmFzJGNvbnRleHRbb3JkLnJlUmF0aW5nQWdyZWVOYXMkY29udGV4dCA9PSAibnV1Ny13Il0gPC0gIm51Olx1MDEyNyINCm9yZC5yZVJhdGluZ0FncmVlTmFzJGNvbnRleHRbb3JkLnJlUmF0aW5nQWdyZWVOYXMkY29udGV4dCA9PSAibnV1Ny12Il0gPC0gIm51Olx1MDEyNy12Ig0Kb3JkLnJlUmF0aW5nQWdyZWVOYXMkY29udGV4dFtvcmQucmVSYXRpbmdBZ3JlZU5hcyRjb250ZXh0ID09ICJ6YWE3LXciXSA8LSAiemE6XHUwMTI3Ig0Kb3JkLnJlUmF0aW5nQWdyZWVOYXMkY29udGV4dFtvcmQucmVSYXRpbmdBZ3JlZU5hcyRjb250ZXh0ID09ICJ6aWk3LXciXSA8LSAiemk6XHUwMTI3Ig0Kb3JkLnJlUmF0aW5nQWdyZWVOYXMkY29udGV4dFtvcmQucmVSYXRpbmdBZ3JlZU5hcyRjb250ZXh0ID09ICIzYWFmLXciXSA8LSAiypVhOmYiDQpvcmQucmVSYXRpbmdBZ3JlZU5hcyRjb250ZXh0W29yZC5yZVJhdGluZ0FncmVlTmFzJGNvbnRleHQgPT0gIjNhYW0tdyJdIDwtICLKlWE6bSINCm9yZC5yZVJhdGluZ0FncmVlTmFzJGNvbnRleHRbb3JkLnJlUmF0aW5nQWdyZWVOYXMkY29udGV4dCA9PSAiM2VlYi13Il0gPC0gIsqVZTpiIg0Kb3JkLnJlUmF0aW5nQWdyZWVOYXMkY29udGV4dFtvcmQucmVSYXRpbmdBZ3JlZU5hcyRjb250ZXh0ID09ICIzZWViLXYiXSA8LSAiypVlOmItdiINCm9yZC5yZVJhdGluZ0FncmVlTmFzJGNvbnRleHRbb3JkLnJlUmF0aW5nQWdyZWVOYXMkY29udGV4dCA9PSAiM2Vlbi13Il0gPC0gIsqVZTpuIg0Kb3JkLnJlUmF0aW5nQWdyZWVOYXMkY29udGV4dFtvcmQucmVSYXRpbmdBZ3JlZU5hcyRjb250ZXh0ID09ICIzaWlzaC13Il0gPC0gIsqVYTrKgyINCm9yZC5yZVJhdGluZ0FncmVlTmFzJGNvbnRleHRbb3JkLnJlUmF0aW5nQWdyZWVOYXMkY29udGV4dCA9PSAiM29vMy13Il0gPC0gIsqVbzrKlSINCm9yZC5yZVJhdGluZ0FncmVlTmFzJGNvbnRleHRbb3JkLnJlUmF0aW5nQWdyZWVOYXMkY29udGV4dCA9PSAiM29vMy12Il0gPC0gIsqVbzrKlS12Ig0Kb3JkLnJlUmF0aW5nQWdyZWVOYXMkY29udGV4dFtvcmQucmVSYXRpbmdBZ3JlZU5hcyRjb250ZXh0ID09ICIzb29uLXciXSA8LSAiypVvOm4iDQpvcmQucmVSYXRpbmdBZ3JlZU5hcyRjb250ZXh0W29yZC5yZVJhdGluZ0FncmVlTmFzJGNvbnRleHQgPT0gImJhYTMtdyJdIDwtICJiYTrKlSINCm9yZC5yZVJhdGluZ0FncmVlTmFzJGNvbnRleHRbb3JkLnJlUmF0aW5nQWdyZWVOYXMkY29udGV4dCA9PSAiYmlpMy13Il0gPC0gImJpOsqVIg0Kb3JkLnJlUmF0aW5nQWdyZWVOYXMkY29udGV4dFtvcmQucmVSYXRpbmdBZ3JlZU5hcyRjb250ZXh0ID09ICJiaWkzLXYiXSA8LSAiYmk6ypUtdiINCm9yZC5yZVJhdGluZ0FncmVlTmFzJGNvbnRleHRbb3JkLnJlUmF0aW5nQWdyZWVOYXMkY29udGV4dCA9PSAiYm9vc2gtdyJdIDwtICJibzrKgyINCm9yZC5yZVJhdGluZ0FncmVlTmFzJGNvbnRleHRbb3JkLnJlUmF0aW5nQWdyZWVOYXMkY29udGV4dCA9PSAiZGp1dTMtdyJdIDwtICJkzaHKknU6ypUiDQpvcmQucmVSYXRpbmdBZ3JlZU5hcyRjb250ZXh0W29yZC5yZVJhdGluZ0FncmVlTmFzJGNvbnRleHQgPT0gImRqdXUzLXYiXSA8LSAiZM2hypJ1OsqVLXYiDQpvcmQucmVSYXRpbmdBZ3JlZU5hcyRjb250ZXh0W29yZC5yZVJhdGluZ0FncmVlTmFzJGNvbnRleHQgPT0gIm5vbzMtdyJdIDwtICJubzrKlSINCm9yZC5yZVJhdGluZ0FncmVlTmFzJGNvbnRleHRbb3JkLnJlUmF0aW5nQWdyZWVOYXMkY29udGV4dCA9PSAibm9vMy12Il0gPC0gIm5vOsqVLXYiDQpvcmQucmVSYXRpbmdBZ3JlZU5hcyRjb250ZXh0W29yZC5yZVJhdGluZ0FncmVlTmFzJGNvbnRleHQgPT0gImJlZXQtdyJdIDwtICJiZTp0Ig0Kb3JkLnJlUmF0aW5nQWdyZWVOYXMkY29udGV4dFtvcmQucmVSYXRpbmdBZ3JlZU5hcyRjb250ZXh0ID09ICJkYWFzLXciXSA8LSAiZGE6cyINCm9yZC5yZVJhdGluZ0FncmVlTmFzJGNvbnRleHRbb3JkLnJlUmF0aW5nQWdyZWVOYXMkY29udGV4dCA9PSAiZGlpbi13Il0gPC0gImRpOm4iDQpvcmQucmVSYXRpbmdBZ3JlZU5hcyRjb250ZXh0W29yZC5yZVJhdGluZ0FncmVlTmFzJGNvbnRleHQgPT0gImRvb20tdyJdIDwtICJkbzptIg0Kb3JkLnJlUmF0aW5nQWdyZWVOYXMkY29udGV4dFtvcmQucmVSYXRpbmdBZ3JlZU5hcyRjb250ZXh0ID09ICJkb29tLXYiXSA8LSAiZG86bS12Ig0Kb3JkLnJlUmF0aW5nQWdyZWVOYXMkY29udGV4dFtvcmQucmVSYXRpbmdBZ3JlZU5hcyRjb250ZXh0ID09ICJiZWV0LXciXSA8LSAiYmU6dCINCm9yZC5yZVJhdGluZ0FncmVlTmFzJGNvbnRleHRbb3JkLnJlUmF0aW5nQWdyZWVOYXMkY29udGV4dCA9PSAibWFhdC13Il0gPC0gIm1hOnQiDQpvcmQucmVSYXRpbmdBZ3JlZU5hcyRjb250ZXh0W29yZC5yZVJhdGluZ0FncmVlTmFzJGNvbnRleHQgPT0gIm1hYXQtdiJdIDwtICJtYTp0LXYiDQpvcmQucmVSYXRpbmdBZ3JlZU5hcyRjb250ZXh0W29yZC5yZVJhdGluZ0FncmVlTmFzJGNvbnRleHQgPT0gIm1vb3otdyJdIDwtICJtbzp6Ig0Kb3JkLnJlUmF0aW5nQWdyZWVOYXMkY29udGV4dFtvcmQucmVSYXRpbmdBZ3JlZU5hcyRjb250ZXh0ID09ICJtdXVuLXciXSA8LSAibXU6biINCm9yZC5yZVJhdGluZ0FncmVlTmFzJGNvbnRleHRbb3JkLnJlUmF0aW5nQWdyZWVOYXMkY29udGV4dCA9PSAibXV1cy13Il0gPC0gIm11OnMiDQpvcmQucmVSYXRpbmdBZ3JlZU5hcyRjb250ZXh0W29yZC5yZVJhdGluZ0FncmVlTmFzJGNvbnRleHQgPT0gIm5hYW0tdyJdIDwtICJuYTptIg0Kb3JkLnJlUmF0aW5nQWdyZWVOYXMkY29udGV4dFtvcmQucmVSYXRpbmdBZ3JlZU5hcyRjb250ZXh0ID09ICJuYWFtLXYiXSA8LSAibmE6bS12Ig0Kb3JkLnJlUmF0aW5nQWdyZWVOYXMkY29udGV4dFtvcmQucmVSYXRpbmdBZ3JlZU5hcyRjb250ZXh0ID09ICJub29tLXciXSA8LSAibm86bSINCm9yZC5yZVJhdGluZ0FncmVlTmFzJGNvbnRleHRbb3JkLnJlUmF0aW5nQWdyZWVOYXMkY29udGV4dCA9PSAic2FhbS13Il0gPC0gInNhOm0iDQpvcmQucmVSYXRpbmdBZ3JlZU5hcyRjb250ZXh0W29yZC5yZVJhdGluZ0FncmVlTmFzJGNvbnRleHQgPT0gInNhYW0tdiJdIDwtICJzYTptLXYiDQpvcmQucmVSYXRpbmdBZ3JlZU5hcyRjb250ZXh0W29yZC5yZVJhdGluZ0FncmVlTmFzJGNvbnRleHQgPT0gImJlZXQtdyJdIDwtICJiZTp0Ig0Kb3JkLnJlUmF0aW5nQWdyZWVOYXMkY29udGV4dCA8LSBhcy5mYWN0b3Iob3JkLnJlUmF0aW5nQWdyZWVOYXMkY29udGV4dCkNCg0KDQpvcmQucmVSYXRpbmdBZ3JlZU5hcyRjb250ZXh0IDwtIGFzLnZlY3RvcihvcmQucmVSYXRpbmdBZ3JlZU5hcyRjb250ZXh0KSAjZ2V0IHJpZCBvZiBmYWN0b3JzDQpvcmQucmVSYXRpbmdBZ3JlZU5hcyRjb250ZXh0ID0gZmFjdG9yKG9yZC5yZVJhdGluZ0FncmVlTmFzJGNvbnRleHQsb3JkLnJlUmF0aW5nQWdyZWVOYXMkY29udGV4dCkgI2FkZCBvcmRlcmVkIGZhY3RvcnMgYmFjaw0KDQoNCm9yZC5yZVJhdGluZ0FncmVlTmFzDQoNCmBgYA0KDQojIyMjIyMgRHJhd2luZyB0aGUgSVJSIGZpZ3VyZQ0KDQpgYGB7ciBmaWcud2lkdGg9OSwgZmlnLmhlaWdodD01fQ0KcGFyKG9tYSA9IGMoMCwgMCwgMCwgMCkpDQpwbG90KDE6NDUsIG9yZC5yZVJhdGluZ0FncmVlTmFzJElDQ1ZhbCwgYXhlcz1GQUxTRSwgeWxpbT1jKC0xLDEpLA0KICAgICB5bGFiPSJJQ0MuIDk1JSBDSSIsIHhsYWI9IiIsY2V4PTIsY2V4LmxhYj0xLjUsY2V4Lm1haW49MS41LA0KICAgICBtYWluPSJBZ3JlZW1lbnQgSUNDIGZvciBuYXNhbGlzYXRpb24iLGNleC5heGlzPTEuNSkNCmF4aXMoMixjZXgubGFiPTIsY2V4LmF4aXM9MS41KQ0KYXhpcygxLGF0PTE6NDUsIGxhYmVscyA9IGxldmVscyhvcmQucmVSYXRpbmdBZ3JlZU5hcyRjb250ZXh0KSwgDQogICAgIGxhcz0yLGNleC5sYWI9MS41LGNleC5heGlzPTEuNSkNCmZvcihpIGluIDE6NDUpIHNlZ21lbnRzKGksb3JkLnJlUmF0aW5nQWdyZWVOYXMkbG93ZXJDb25mSW50W2ldLA0KICAgICAgICAgICAgICAgICAgICAgICAgaSxvcmQucmVSYXRpbmdBZ3JlZU5hcyR1cHBlckNvbmZJbnRbaV0pDQoNCmFibGluZShoID0gMCwgbHR5PTIpDQphYmxpbmUodiA9IDIwLjUsIGx0eT0yKQ0KYGBgDQpBZ2Fpbiwgb25seSB0aGUgbGFzdCB0d28gd29yZHMgc2hvd2VkIGEgbmVnYXRpdmUgYWdyZWVtZW50IGJldHdlZW4gcmF0ZXJzLCB3aXRoIG5lYXJseSBoYWxmIG9mIHRoZSB3b3JkcyByZWNlaXZpbmcgYSBzdGF0aXN0aWNhbGx5IHNpZ25pZmljYW50IHBvc2l0aXZlIHJhdGluZy4gQW5kIGFzIGV4cGVjdGVkLCBtb3N0IG9mIHRoZSB3b3JkcyBoYXZpbmcgbmFzYWwgc291bmRzIHNvdW5kcywgcmVjZWl2ZWQgdGhlIGhpZ2hlc3QgcmF0aW5ncywgd2l0aCBzb21lIGhhdmluZyBib3RoIG5hc2FscyBhbmQgcGhhcnluZ2VhbHMgcmVjZWl2aW5nIHBvc2l0aXZlIHJhdGluZ3MuDQoNCiMjIyBDb25jbHVzaW9uDQpHaXZlbiB0aGUgbGV2ZWwgb2YgdmFyaWFuY2Ugb2JzZXJ2ZWQgaW4gdGhlIElDQyBzY29yZXMgZm9yIGJvdGggY29uc2lzdGVuY3kgYW5kIGFncmVlbWVudHMsIGl0IHdhcyBuZWNlc3NhcnkgdG8gdXNlIGEgc3RhdGlzdGljYWwgdGVjaG5pcXVlIHRoYXQgdGFrZXMgaW50byBhY2NvdW50IHRoaXMuIEl0IGlzIHBvc3NpYmxlIHRoYXQgdGhlIHJhdGVycyB3ZXJlIHZhcmlhYmxlcyBpbiBzb21lIG9mIHRoZWlyIHJlc3BvbnNlcyBkdWUgdG8gdmFyaWFibGUgcHJvZHVjdGlvbnMgYnkgdGhlIHByb2R1Y2luZyBzdWJqZWN0cyBhbmQvb3IgYnkgdGhlIGluaGVyZW50IGRpZmZlcmVuY2VzIGJldHdlZW4gdGhlIHJhdGVycy4gIA0KQmVsb3cgd2UgcmVwb3J0IG9uIHRoZSByZXN1bHRzIG9mIHRoZSBDdW11bGF0aXZlIExvZ2l0IE1peGVkIE1vZGVsIHdpdGggc3ViamVjdHMsIHJhdGVycyBhbmQgaXRlbXMgYXMgcmFuZG9tIGVmZmVjdHMuDQoNCiMjIEN1bXVsYXRpdmUgTG9naXQgTWl4ZWQgTW9kZWxzIChjbG1tKQ0KVGhlIGRhdGEgd2VyZSBhbmFseXNlZCB1c2luZyBDdW11bGF0aXZlIExpbmsgTWl4ZWQgTW9kZWxzIChDTE1NKSB1c2luZyB0aGUgIm9yZGluYWwiIHBhY2thZ2UuIA0KDQpHaXZlbiB0aGUgc3RydWN0dXJlIG9mIHRoZSBkYXRhLCB3ZSB1c2VkIGEgcmFuZG9tIGVmZmVjdHMgc3RydWN0dXJlIHRvIGFjY291bnQgZm9yIHRoZSBkZXNpZ24uIEEgY3Jvc3NlZCByYW5kb20gZWZmZWN0cyBzdHJ1Y3R1cmUgKGZvciB0aGUgcHJvZHVjaW5nIHN1YmplY3RzLCB0aGUgcmF0ZXJzIGFuZCB0aGUgaXRlbXMpIHdhcyB1c2VkLiBBIGJ5LXJhdGVyIHJhbmRvbSBzbG9wZSBmb3IgQ29udGV4dCB3YXMgdXNlZCBhcyBpdCBpbXByb3ZlZCB0aGUgbW9kZWwgZml0IGNvbXBhcmVkIHRvIGEgbW9kZWwgd2l0aCBpdC4gDQoNCk91ciBvdXRjb21lIGlzIHRoZSByZXNwb25zZSBlbnRlcmVkIGFzIGEgZmFjdG9yICgzIGZvciBWb2ljZSBRdWFsaXR5OyA1IGZvciBOYXNhbGlzYXRpb24pLiBPdXIgcHJlZGljdG9yIHdhcyBDb250ZXh0IHdpdGggdGhlIHJlZmVyZW5jZSBsZXZlbCBiZWluZyBzZXQgdG8gIklzb2xhdGlvbiIuIA0KDQpXZSBjb21wYXJlZCB2YXJpb3VzIGNvbWJpbmF0aW9ucywgZS5nLiwgYnkgc3ViamVjdCBhbmQgaXRlbSByYW5kb20gc2xvcGVzOyBpbnRlcmFjdGlvbnMgd2l0aCB2b3dlbCwgZXRjLiBhbmQgYWxsIHRoZXNlIGRpZCBub3QgaW1wcm92ZSB0aGUgbW9kZWwgZml0LiBIZW5jZSB0aGUgbW9kZWxzIHJlcG9ydGVkIGJlbG93IGFyZSB0aGUgb3B0aW1hbCBvbmVzIA0KDQojIyMgTW9kZWxzDQoNCiMjIyMgTG9hZGluZyBwYWNrYWdlcw0KU3RhcnQgYnkgbG9hZGluZyBwYWNrYWdlcyBhbmQgaW5zdGFsbCB0aG9zZSB0aGF0IGFyZSBub3QgaW5zdGFsbGVkDQoNCmBgYHtyIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIGVycm9yPUZBTFNFfQ0KcmVxdWlyZWRQYWNrYWdlcyA9IGMoJ29yZGluYWwnKQ0KZm9yKHAgaW4gcmVxdWlyZWRQYWNrYWdlcyl7DQogIGlmKCFyZXF1aXJlKHAsY2hhcmFjdGVyLm9ubHkgPSBUUlVFKSkgaW5zdGFsbC5wYWNrYWdlcyhwKQ0KICBsaWJyYXJ5KHAsY2hhcmFjdGVyLm9ubHkgPSBUUlVFKQ0KfQ0KYGBgDQoNCiMjIyMgUmVhZGluZyB0aGUgZGF0YQ0KV2UgdGhlbiByZWFkIGluIHRoZSBkYXRhIGFuZCBsb29rIGF0IHRoZSBzdHJ1Y3R1cmUgdG8gdmVyaWZ5IHRoZSBjbGFzcyBvZiBlYWNoIGNvbHVtbi4NCmBgYHtyIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIGVycm9yPUZBTFNFfQ0KcGVyY1ZRREYgPC0gcmVhZC5jc3YoInBlcmNWUURGLmNzdiIpDQpwZXJjTmFzREYgPC0gcmVhZC5jc3YoInBlcmNOYXNERi5jc3YiKQ0Kc3RyKHBlcmNWUURGKQ0Kc3RyKHBlcmNOYXNERikNCmBgYA0KDQojIyMjIENoYW5naW5nIGEgZmV3IHRoaW5ncw0KV2UgYXJlIGNoYW5naW5nIGEgZmV3IHRoaW5ncyBpbiBib3RoIGRhdGEtZnJhbWVzDQoNCjEuIENoYW5naW5nIHR5cGUgb2YgInJlc3BvbnNlIiB0byBmYWN0b3IgdG8gc3VpdGUgdGhlIEN1bXVsYXRpdmUgTG9naXQgTWl4ZWQgTW9kZWwNCg0KMi4gQ2hlY2tpbmcgdGhlIGxldmVscyBvZiBDb250ZXh0IGFuZCBjaGFuZ2luZyB0aGUgcmVmZXJlbmNlIGNhdGVnb3J5IHRvICJJc29sYXRpb24iDQoNCjMuIENyZWF0aW5nIGEgbmV3IHZhcmlhYmxlICJDb250ZXh0SVBBIiB0aGF0IGNvbnRhaW5zIHRoZSBJUEEgc3ltYm9scyB0byBiZSBwbG90dGVkIGluIHRoZSBmaWd1cmVzIGJlbG93DQoNCmBgYHtyIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIGVycm9yPUZBTFNFfQ0KIyBmYWN0b3IgbGV2ZWwNCnBlcmNWUURGJFJlc3BvbnNlIDwtIGFzLmZhY3RvcihwZXJjVlFERiRSZXNwb25zZSkNCnBlcmNOYXNERiRSZXNwb25zZSA8LSBhcy5mYWN0b3IocGVyY05hc0RGJFJlc3BvbnNlKQ0KDQoNCiMgQ2hhbmdpbmcgdGhlIHJlZmVyZW5jZSBsZXZlbA0KbGV2ZWxzKHBlcmNWUURGJENvbnRleHQpDQpwZXJjVlFERiRDb250ZXh0IDwtIHJlbGV2ZWwocGVyY1ZRREYkQ29udGV4dCwgcmVmPSJpc29sYXRpb24iKQ0KbGV2ZWxzKHBlcmNOYXNERiRDb250ZXh0KQ0KcGVyY05hc0RGJENvbnRleHQgPC0gcmVsZXZlbChwZXJjTmFzREYkQ29udGV4dCwgcmVmPSJpc29sYXRpb24iKQ0KDQojIENyZWF0aW5nIGEgbmV3IHZhcmlhYmxlICJDb250ZXh0SVBBIg0KIyMgZm9yIFZvaWNlIFF1YWxsaXR5DQpwZXJjVlFERiRDb250ZXh0SVBBIDwtIHBlcmNWUURGJENvbnRleHQNCnBlcmNWUURGJENvbnRleHRJUEEgPC0gYXMuY2hhcmFjdGVyKHBlcmNWUURGJENvbnRleHRJUEEpDQpwZXJjVlFERiRDb250ZXh0SVBBW3BlcmNWUURGJENvbnRleHRJUEEgPT0gIjctbyJdIDwtICJcdTAxMjctbyINCnBlcmNWUURGJENvbnRleHRJUEFbcGVyY1ZRREYkQ29udGV4dElQQSA9PSAiby03Il0gPC0gIm8tXHUwMTI3Ig0KcGVyY1ZRREYkQ29udGV4dElQQVtwZXJjVlFERiRDb250ZXh0SVBBID09ICI3LW4iXSA8LSAiXHUwMTI3LW4iDQpwZXJjVlFERiRDb250ZXh0SVBBW3BlcmNWUURGJENvbnRleHRJUEEgPT0gIm4tNyJdIDwtICJuLVx1MDEyNyINCnBlcmNWUURGJENvbnRleHRJUEFbcGVyY1ZRREYkQ29udGV4dElQQSA9PSAiMy1vIl0gPC0gIsqVLW8iDQpwZXJjVlFERiRDb250ZXh0SVBBW3BlcmNWUURGJENvbnRleHRJUEEgPT0gIm8tMyJdIDwtICJvLcqVIg0KcGVyY1ZRREYkQ29udGV4dElQQVtwZXJjVlFERiRDb250ZXh0SVBBID09ICIzLW4iXSA8LSAiypUtbiINCnBlcmNWUURGJENvbnRleHRJUEFbcGVyY1ZRREYkQ29udGV4dElQQSA9PSAibi0zIl0gPC0gIm4typUiDQpwZXJjVlFERiRDb250ZXh0SVBBW3BlcmNWUURGJENvbnRleHRJUEEgPT0gIjMtLTMiXSA8LSAiypUtypUiDQpwZXJjVlFERiRDb250ZXh0SVBBW3BlcmNWUURGJENvbnRleHRJUEEgPT0gImlzb2xhdGlvbiJdIDwtICJJc29sYXRpb24iDQpwZXJjVlFERiRDb250ZXh0SVBBIDwtIGFzLmZhY3RvcihwZXJjVlFERiRDb250ZXh0SVBBKQ0KcGVyY1ZRREYkQ29udGV4dElQQSA8LSByZWxldmVsKHBlcmNWUURGJENvbnRleHRJUEEsIHJlZj0iSXNvbGF0aW9uIikNCmxldmVscyhwZXJjVlFERiRDb250ZXh0SVBBKQ0KIyByZW9yZGVyaW5nIGxldmVscyBvZiBwcmVkaWN0b3INCnBlcmNWUURGJENvbnRleHQgPC0gZmFjdG9yKHBlcmNWUURGJENvbnRleHQsIGxldmVscyA9IGMoImlzb2xhdGlvbiIsIjctbiIsIjctbyIsIm4tNyIsIm4tbiIsIm4tbyIsIm4tMyIsIm8tNyIsIm8tbiIsIm8tbyIsIm8tMyIsIjMtbiIsIjMtbyIsIjMtLTMiKSkNCnBlcmNWUURGJENvbnRleHRJUEEgPC0gZmFjdG9yKHBlcmNWUURGJENvbnRleHRJUEEsIGxldmVscyA9IGMoIklzb2xhdGlvbiIsIlx1MDEyNy1uIiwiXHUwMTI3LW8iLCJuLVx1MDEyNyIsIm4tbiIsIm4tbyIsIm4typUiLCJvLVx1MDEyNyIsIm8tbiIsIm8tbyIsIm8typUiLCLKlS1uIiwiypUtbyIsIsqVLcqVIikpDQpsZXZlbHMocGVyY1ZRREYkQ29udGV4dCkNCmxldmVscyhwZXJjVlFERiRDb250ZXh0SVBBKQ0KDQojIyBmb3IgTmFzYWxpc2F0aW9uDQpwZXJjTmFzREYkQ29udGV4dElQQSA8LSBwZXJjTmFzREYkQ29udGV4dA0KcGVyY05hc0RGJENvbnRleHRJUEEgPC0gYXMuY2hhcmFjdGVyKHBlcmNOYXNERiRDb250ZXh0SVBBKQ0KcGVyY05hc0RGJENvbnRleHRJUEFbcGVyY05hc0RGJENvbnRleHRJUEEgPT0gIjctbyJdIDwtICJcdTAxMjctbyINCnBlcmNOYXNERiRDb250ZXh0SVBBW3BlcmNOYXNERiRDb250ZXh0SVBBID09ICJvLTciXSA8LSAiby1cdTAxMjciDQpwZXJjTmFzREYkQ29udGV4dElQQVtwZXJjTmFzREYkQ29udGV4dElQQSA9PSAiNy1uIl0gPC0gIlx1MDEyNy1uIg0KcGVyY05hc0RGJENvbnRleHRJUEFbcGVyY05hc0RGJENvbnRleHRJUEEgPT0gIm4tNyJdIDwtICJuLVx1MDEyNyINCnBlcmNOYXNERiRDb250ZXh0SVBBW3BlcmNOYXNERiRDb250ZXh0SVBBID09ICIzLW8iXSA8LSAiypUtbyINCnBlcmNOYXNERiRDb250ZXh0SVBBW3BlcmNOYXNERiRDb250ZXh0SVBBID09ICJvLTMiXSA8LSAiby3KlSINCnBlcmNOYXNERiRDb250ZXh0SVBBW3BlcmNOYXNERiRDb250ZXh0SVBBID09ICIzLW4iXSA8LSAiypUtbiINCnBlcmNOYXNERiRDb250ZXh0SVBBW3BlcmNOYXNERiRDb250ZXh0SVBBID09ICJuLTMiXSA8LSAibi3KlSINCnBlcmNOYXNERiRDb250ZXh0SVBBW3BlcmNOYXNERiRDb250ZXh0SVBBID09ICIzLS0zIl0gPC0gIsqVLcqVIg0KcGVyY05hc0RGJENvbnRleHRJUEFbcGVyY05hc0RGJENvbnRleHRJUEEgPT0gImlzb2xhdGlvbiJdIDwtICJJc29sYXRpb24iDQpwZXJjTmFzREYkQ29udGV4dElQQSA8LSBhcy5mYWN0b3IocGVyY05hc0RGJENvbnRleHRJUEEpDQpwZXJjTmFzREYkQ29udGV4dElQQSA8LSByZWxldmVsKHBlcmNOYXNERiRDb250ZXh0SVBBLCByZWY9Iklzb2xhdGlvbiIpDQpsZXZlbHMocGVyY05hc0RGJENvbnRleHRJUEEpDQoNCiMgcmVvcmRlcmluZyBsZXZlbHMgb2YgcHJlZGljdG9yDQpwZXJjTmFzREYkQ29udGV4dCA8LSBmYWN0b3IocGVyY05hc0RGJENvbnRleHQsIGxldmVscyA9IGMoImlzb2xhdGlvbiIsIjctbiIsIjctbyIsIm4tNyIsIm4tbiIsIm4tbyIsIm4tMyIsIm8tNyIsIm8tbiIsIm8tbyIsIm8tMyIsIjMtbiIsIjMtbyIsIjMtLTMiKSkNCnBlcmNOYXNERiRDb250ZXh0SVBBIDwtIGZhY3RvcihwZXJjTmFzREYkQ29udGV4dElQQSwgbGV2ZWxzID0gYygiSXNvbGF0aW9uIiwiXHUwMTI3LW4iLCJcdTAxMjctbyIsIm4tXHUwMTI3Iiwibi1uIiwibi1vIiwibi3KlSIsIm8tXHUwMTI3Iiwiby1uIiwiby1vIiwiby3KlSIsIsqVLW4iLCLKlS1vIiwiypUtypUiKSkNCmxldmVscyhwZXJjTmFzREYkQ29udGV4dCkNCmxldmVscyhwZXJjTmFzREYkQ29udGV4dElQQSkNCmBgYA0KDQojIyMgTW9kZWwgc3BlY2lmaWNhdGlvbnMNCkFzIGNhbiBiZSBzZWVtIGZyb20gdGhlIHJlc3VsdHMgb2Ygc3lzdGVtIHRpbWUsIGl0IHRvb2sgcm91bmdseSBvbmUgaG91ciB0byBydW4gdGhlIGZpcnN0IG1vZGVsIHdpdGggYSA0LUNvcmUgbWFjaGluZSBydW5uaW5nIE1pY3Jvc29mdCBSIE9wZW4gdmVyc2lvbiAzLjUuMCB0aGF0IHJhbiB0aGUgbW9kZWwgdXNpbmcgcGFyYWxsZWwgY29tcHV0aW5nICh0b3RhbCBhcm91bmQgNDozMCBob3VycykuIFdpdGggdGhlIGJhc2UgUiwgaXQgbWF5IHRha2UgYXQgbGVhc3QgZG91YmxlIHRoaXMgdGltZSB0byBydW4sIGlmIG5vdCBtb3JlIGdpdmVuIHRoYXQgd2l0aCBiYXNlIFIsIG9ubHkgb25lIGNvcmUgaXMgdXNlZCAodW5sZXNzIHNwZWNpZmljYWxseSB1c2luZyBwYXJhbGxlbCBjb21wdXRpbmcpLg0KDQojIyMjIFZvaWNlIFF1YWxpdHkgKFZRKSANCkJlbG93IGlzIG91ciBtb2RlbCBzcGVjaWZpY2F0aW9uIGZvciB0aGUgZnVsbCBtb2RlbCB0aGF0IGltcHJvdmVkIHRoZSBtb2RlbCBmaXQgKHdlIGhhdmUgdHJpZWQgdmFyaW91cyBjb21iaW5hdGlvbnMsIGluY2x1ZGluZyBieS1TdWJqZWN0IGFuZCBieS1JdGVtIHJhbmRvbSBzbG9wZXMgZm9yIGNvbnRleHQ7IGFkZGluZyB2b3dlbCBhcyBhIGZpeGVkIGFuZCByYW5kb20gc2xvcGU7IGNvbnNvbmFudCp2b3dlbCBpbnRlcmFjdGlvbnMsIGV0Yy4gSG93ZXZlciBhbGwgdGhlc2UgbW9kZWxzIGVpdGhlciBkaWQgbm90IGNvbnZlcmdlIG9yIGRpZCBub3QgaW1wcm92ZSB0aGUgbW9kZWwgZml0IGNvbXBhcmVkIHRvIG91ciBtb2RlbCBiZWxvdykNCg0KIyMjIyMgRnVsbCBtb2RlbA0KYGBge3Igd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgZXJyb3I9RkFMU0V9DQpzeXN0ZW0udGltZShmdWxsQ0xNTVZRU2xvcGUgPC0gY2xtbShSZXNwb25zZSB+IENvbnRleHQgKyAoMXxTdWJqZWN0KSsoMXxJdGVtKSsoQ29udGV4dHxSYXRlciksIGRhdGE9cGVyY1ZRREYpKQ0KYGBgDQoNCiMjIyMjIE51bGwgbW9kZWwNCg0KYGBge3J9DQpzeXN0ZW0udGltZShmdWxsQ0xNTVZRTnVsbCA8LSBjbG1tKFJlc3BvbnNlIH4gMSArICgxfFN1YmplY3QpKygxfEl0ZW0pKyhDb250ZXh0fFJhdGVyKSwgZGF0YT1wZXJjVlFERikpDQoNCmBgYA0KDQojIyMjIE5hc2FsaXNhdGlvbg0KQmVsb3cgaXMgb3VyIG1vZGVsIHNwZWNpZmljYXRpb24gZm9yIHRoZSBmdWxsIG1vZGVsIHRoYXQgaW1wcm92ZWQgdGhlIG1vZGVsIGZpdCAod2UgaGF2ZSB0cmllZCB2YXJpb3VzIGNvbWJpbmF0aW9ucywgaW5jbHVkaW5nIGJ5LVN1YmplY3QgYW5kIGJ5LUl0ZW0gcmFuZG9tIHNsb3BlcyBmb3IgY29udGV4dDsgYWRkaW5nIHZvd2VsIGFzIGEgZml4ZWQgYW5kIHJhbmRvbSBzbG9wZTsgY29uc29uYW50KnZvd2VsIGludGVyYWN0aW9ucywgZXRjLiBIb3dldmVyIGFsbCB0aGVzZSBtb2RlbHMgZWl0aGVyIGRpZCBub3QgY29udmVyZ2Ugb3IgZGlkIG5vdCBpbXByb3ZlIHRoZSBtb2RlbCBmaXQgY29tcGFyZWQgdG8gb3VyIG1vZGVsIGJlbG93KQ0KDQojIyMjIyBGdWxsIG1vZGVsDQpgYGB7ciB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCBlcnJvcj1GQUxTRX0NCnN5c3RlbS50aW1lKGZ1bGxDTE1NTmFzU2xvcGUgPC0gY2xtbShSZXNwb25zZSB+IENvbnRleHQgKyAoMXxTdWJqZWN0KSsoMXxJdGVtKSsoQ29udGV4dHxSYXRlciksIGRhdGE9cGVyY05hc0RGKSkNCmBgYA0KDQojIyMjIyBOdWxsIG1vZGVsDQoNCmBgYHtyfQ0Kc3lzdGVtLnRpbWUoZnVsbENMTU1OYXNOdWxsIDwtIGNsbW0oUmVzcG9uc2UgfiAxICsgKDF8U3ViamVjdCkrKDF8SXRlbSkrKENvbnRleHR8UmF0ZXIpLCBkYXRhPXBlcmNOYXNERikpDQoNCmBgYA0KDQojIyMgUmVzdWx0cw0KVGhlIHJlc3VsdHMgYmVsb3cgYXJlIGRpdmlkZWQgaW50byB0aG9zZSBvbiBWb2ljZSBRdWFsaXR5IChWUSkgZm9sbG93ZWQgYnkgdGhvc2Ugb24gTmFzYWxpc2F0aW9uLiAgDQoNCiMjIyMgVm9pY2UgUXVhbGl0eSAoVlEpDQoNCiMjIyMjIE1vZGVsIGNvbXBhcmlzb25zDQoNClRocm91Z2ggbW9kZWwgY29tcGFyaXNvbiBiZXR3ZWVuIHRoZSBvcHRpbWFsIG1vZGVsIGFuZCB0aGUgbnVsbCBtb2RlbCAoYWthIEludGVyY2VwdCBvbmx5IG1vZGVsKSwgdGhlIHJlc3VsdHMgc2hvdyB0aGF0IHVzaW5nIG91ciBvcHRpbWFsIG1vZGVsIGltcHJvdmVkIHRoZSBtb2RlbCBmaXQuIA0KYGBge3Igd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgZXJyb3I9RkFMU0V9DQphbm92YShmdWxsQ0xNTVZRTnVsbCxmdWxsQ0xNTVZRU2xvcGUpDQpgYGANCg0KIyMjIyMgU3VtbWFyeQ0KTmV4dCB0aGUgc3VtbWFyeSBwcmVzZW50ZWQgYmVsb3cgc2hvd3MgdGhlIHJlc3VsdHMgZm9yIGVhY2ggb2YgdGhlIGNvZWZmaWNpZW50cyAobWludXMgdGhlIEludGVyY2VwdCkgYW5kIG9mIHRoZSB0aHJlc2hvbGRzICgxfDIgYW5kIDJ8MykuIA0KDQpTdGFydGluZyB3aXRoIHRoZSB0aHJlc2hsb2RzLCB0aGUgcmVzdWx0cyBzaG93IHRoYXQgb3ZlcmFsbCwgYSBkZWNyZWFzZSBpbiByYXRpbmdzIG9mIHRlbnNlIHZvaWNlIHF1YWxpdHkgaXMgb2J0YWluZWQgZm9yIHJhdGluZ3MgYmV0d2VlbiAxIGFuZCAyLCB3aGljaCBpbmNyZWFzZXMgd2l0aCByYXRpbmdzIGJldHdlZW4gMiB0byAzLiBUaGUgY29lZmZpY2llbnRzIG9mIHRoZSAxMiBsZXZlbHMgb2YgdGhlIGZpeGVkIGVmZmVjdCAiQ29udGV4dCIgc2hvdyBlaXRoZXIgbmVnYXRpdmUgb3IgcG9zaXRpdmUgdmFsdWVzLiBUaGUgbmVnYXRpdmUgb25lcyBpbmRpY2F0ZSB0aGF0IHRoZSByYXRpbmdzIG9mICJ0ZW5zZSIgYXJlIGRlY3JlYXNlZCBpbiB0aGVzZSBjb250ZXh0cyAoZS5nLiwgby1vIG9yIG4tbykgd2hpY2ggb2J0YWluZWQgbG93ZXIgYmV0YXMgY29tcGFyZWQgdG8gdGhlIHJlZmVyZW5jZSB2YWx1ZSAiSXNvbGF0aW9uIi4gQWxsIHBvc2l0aXZlIHZhbHVlcyBhcmUgYXNzb2NpYXRlZCB3aXRoIGluY3JlYXNlIGluIHJhdGluZ3Mgb2YgInRlbnNlIiB2b2ljZSBxdWFsaXR5LCB0aG91Z2ggc29tZSBhcmUgbm90IHN0YXRpc3RpY2FsbHkgc2lnbmlmaWNhbnQuDQoNCmBgYHtyIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIGVycm9yPUZBTFNFfQ0Kc3VtbWFyeShmdWxsQ0xNTVZRU2xvcGUpDQpgYGANCg0KIyMjIyMgRmlndXJlDQpUaGUgc3VtbWFyeSBvZiB0aGUgcmVzdWx0cyBzaG93ZWQgc29tZSBzdGF0aXN0aWNhbGx5IHNpZ25pZmljYW50IGNvZWZmaWNpZW50cyB0aGF0IGRpc3BsYXllZCBhbiBhc3NvY2lhdGlvbiB3aXRoIGluY3JlYXNlZCByYXRpbmdzIG9mICJ0ZW5zZSIuIFRvIGFsbG93IHVzIHRvIHZpc3VhbGlzZSB0aGUgcmF0aW5ncywgd2UgdXNlIHRoZSBzY3JpcHQgYmVsb3csIHdoaWNoIGlzIGEgbW9kaWZpZWQgdmVyc2lvbiBvZiB0d28gc2NyaXB0cyAoc2VlIHJlZmVyZW5jZXMgaW4gYXJ0aWNsZSkuIA0KDQpUaGUgImJldGEiIGlzIHRoZSBjb2VmZmljaWVudCBmb3IgZWFjaCBsZXZlbCBvZiB0aGUgZml4ZWQgZWZmZWN0ICJDb250ZXh0IiBhbmQgIlRoZXRhIiBpcyB0aGUgY29lZmZpY2llbnQgZm9yIGVhY2ggdGhyZXNob2xkIG9mIHRoZSByYXRpbmdzICJSZXNwb25zZSIsIDF8MiwgMnwzLCBldGMuLi4NCg0KDQpgYGB7ciB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCBlcnJvcj1GQUxTRX0NCiMjIGJlbG93IGNoYW5nZXMgdGhlIG1hcmdpbnMNCnBhcihvbWE9YygxLCAwLCAwLCAzKSxtZ3A9YygyLCAxLCAwKSkNCnhsaW1WUSA9IGMobWluKGZ1bGxDTE1NVlFTbG9wZSRiZXRhKSwgbWF4KGZ1bGxDTE1NVlFTbG9wZSRiZXRhKSkNCnlsaW1WUSA9IGMoMCwxKQ0KcGxvdCgwLDAseGxpbT14bGltVlEsIHlsaW09eWxpbVZRLCB0eXBlPSJuIiwgeWxhYj1leHByZXNzaW9uKFByb2JhYmlsaXR5KSwgeGxhYj0iIiwgeGF4dCA9ICJuIixtYWluPSJQcmVkaWN0ZWQgY3VydmVzIC0gVm9pY2UgUXVhbGl0eSIsY2V4PTIsY2V4LmxhYj0xLjUsY2V4Lm1haW49MS41LGNleC5heGlzPTEuNSkNCmF4aXMoc2lkZSA9IDEsIGF0ID0gYygwLGZ1bGxDTE1NVlFTbG9wZSRiZXRhKSxsYWJlbHMgPSBsZXZlbHMocGVyY1ZRREYkQ29udGV4dElQQSksIGxhcz0yLGNleD0yLGNleC5sYWI9MS41LGNleC5heGlzPTEuNSkNCnhzVlEgPSBzZXEoeGxpbVZRWzFdLCB4bGltVlFbMl0sIGxlbmd0aC5vdXQ9MTAwKQ0KbGluZXMoeHNWUSwgcGxvZ2lzKGZ1bGxDTE1NVlFTbG9wZSRUaGV0YVsxXSAtIHhzVlEpLCBjb2w9J2JsYWNrJykNCmxpbmVzKHhzVlEsIHBsb2dpcyhmdWxsQ0xNTVZRU2xvcGUkVGhldGFbMl0gLSB4c1ZRKS1wbG9naXMoZnVsbENMTU1WUVNsb3BlJFRoZXRhWzFdIC0geHNWUSksIGNvbD0ncmVkJykNCmxpbmVzKHhzVlEsIDEtIChwbG9naXMoZnVsbENMTU1WUVNsb3BlJFRoZXRhWzJdIC0geHNWUSkpLCBjb2w9J2JsdWUnKQ0KYWJsaW5lKHY9YygwLGZ1bGxDTE1NVlFTbG9wZSRiZXRhKSxsdHk9MykNCmFibGluZShoPTAsIGx0eT0iZGFzaGVkIikNCmFibGluZShoPTEsIGx0eT0iZGFzaGVkIikNCmxlZ2VuZChwYXIoJ3VzcicpWzJdLCBwYXIoJ3VzcicpWzRdLCBidHk9J24nLCB4cGQ9TkEsbHR5PTEsIGNvbD1jKCJibGFjayIsICJyZWQiLCAiYmx1ZSIpLCANCiAgICAgICBsZWdlbmQ9YygiQnJlYXRoeSIsICJNb2RhbCIsICJUZW5zZSIpLGNleD0wLjc1KQ0KYGBgDQoNClRoZSBmaWd1cmUgYWJvdmUgc2hvdyB0aGF0IHJhdGluZ3Mgb2YgIkJyZWF0aHkiIHJlY2VpdmVkIGxlc3MgdGhhbiAxNSUgc3BlY2lmaWNhbGx5IGFuZCB0aGlzIHdhcyBtYWlubHkgZWl0aGVyIGluIHRoZSAiSXNvbGF0aW9uIiBjb250ZXh0IG9yIGNvbnRleHRzIHdpdGggbmFzYWwgY29uc29uYW50cy4gVGhpcyBzYW1lIGdyb3VwIHNob3dlZCBpbmNyZWFzZSBpbiByYXRpbmdzIG9mICJNb2RhbCIgdm9pY2UgYXQgYSByYXRlIGNsb3NlIHRvIDc1JS4gUmF0aW5ncyBhc3NvY2lhdGVkIHdpdGggdGhlICJUZW5zZSIgdm9pY2UgaW5jcmVhc2VkIHN0ZWFkaWx5IGZyb20gdGhpcyBmaXJzdCBncm91cCB1bnRpbCByZWFjaGluZyB0aGUgcGhhcnluZ2VhbCBjb250ZXh0cywgd2l0aCB0aGUgaGlnaGVzdCByYXRpbmdzIG9mICJUZW5zZSIgYmVpbmcgcHJlc2VudCBpbiAvypUtypUvIGNvbnRleHQgYXQgYSByYXRlIG9mIDgwJSwgd2l0aCB0aGUgcmVtYWluaW5nIDIwJSBiZWluZyBhc3NvY2lhdGVkIHdpdGggIk1vZGFsIiB2b2ljZQ0KDQojIyMjIE5hc2FsaXNhdGlvbg0KDQojIyMjIyBNb2RlbCBjb21wYXJpc29ucw0KDQpXaXRoIE5hc2FsaXNhdGlvbiwgbW9kZWwgY29tcGFyaXNvbnMgc2hvd2VkIGFnYWluIGFuIGltcHJvdmVtZW50IG9mIHRoZSBtb2RlbCBmaXQgd2l0aCBvdXIgb3B0aW1hbCBtb2RlbC4gDQpgYGB7ciB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCBlcnJvcj1GQUxTRX0NCmFub3ZhKGZ1bGxDTE1NTmFzTnVsbCxmdWxsQ0xNTU5hc1Nsb3BlKQ0KYGBgDQoNCiMjIyMjIFN1bW1hcnkNCg0KVGhlIHN1bW1hcnkgb2YgdGhlIG1vZGVsIHNob3dlZCBhZ2FpbiBhIHN0ZWFkeSBpbmNyZWFzZSBpbiByYXRpbmdzIGFzc29jaWF0ZWQgd2l0aCBuYXNhbCBmcm9tIDEgdG8gNS4gUmF0aW5ncyBvZiAxfDIgYW5kIDJ8MyBhcmUgbm90IHN0YXRpc3RpY2FsbHkgc2lnbmlmaWNhbnQ7IHRob3NlIGZyb20gMyB0byA1IGFyZSBzdGF0aXN0aWNhbGx5IGFuZCBzaWduaWZpY2FudGx5IGFzc29jaWF0ZWQgd2l0aCBuYXNhbGlzYXRpb24uIFRoZSBjb2VmZmljaWVudHMgb2YgdGhlIDEyIGxldmVscyBvZiB0aGUgZml4ZWQgZWZmZWN0IGFyZSBlaXRoZXIgbmVnYXRpdmUsIGkuZS4sIG5vdCBhc3NvY2lhdGVkIHdpdGggcmF0aW5ncyBvZiBuYXNhbGlzYXRpb24sIHNwZWNpZmljYWxseSB3aGVuIGFuIG9yYWwgY29udGV4dCBpcyBpbiBpbml0aWFsIHBvc2l0aW9uLCBvciB3aGVuIGEgcGhhcnluZ2VhbCBpcyBhc3NvY2lhdGVkIHdpdGggYW4gb3JhbCBjb250ZXh0LiBXaGVuIHBoYXJ5bmdlYWxzIGFyZSBhc3NvY2lhdGVkIHdpdGggbmFzYWxzLCByYXRpbmdzIG9mIG5hc2FsaXNhdGlvbiBhcmUgaW5jcmVhc2VkLg0KDQoNCmBgYHtyIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIGVycm9yPUZBTFNFfQ0Kc3VtbWFyeShmdWxsQ0xNTU5hc1Nsb3BlKQ0KYGBgDQoNCg0KIyMjIyMgRmlndXJlDQpgYGB7ciB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCBlcnJvcj1GQUxTRX0NCiMjIGJlbG93IGNoYW5nZXMgdGhlIG1hcmdpbnMNCnBhcihvbWE9YygxLCAwLCAwLCAzKSxtZ3A9YygyLCAxLCAwKSkNCnhsaW1OYXMgPSBjKG1pbihmdWxsQ0xNTU5hc1Nsb3BlJGJldGEpLCBtYXgoZnVsbENMTU1OYXNTbG9wZSRiZXRhKSkNCnlsaW1OYXMgPSBjKDAsMSkNCnBsb3QoMCwwLHhsaW09eGxpbU5hcywgeWxpbT15bGltTmFzLCB0eXBlPSJuIiwgeWxhYj1leHByZXNzaW9uKFByb2JhYmlsaXR5KSwgeGxhYj0iIiwgeGF4dCA9ICJuIixtYWluPSJQcmVkaWN0ZWQgY3VydmVzIC0gTmFzYWxpc2F0aW9uIixjZXg9MixjZXgubGFiPTEuNSxjZXgubWFpbj0xLjUsY2V4LmF4aXM9MS41KQ0KYXhpcyhzaWRlID0gMSwgYXQgPSBjKDAsZnVsbENMTU1OYXNTbG9wZSRiZXRhKSxsYWJlbHMgPSBsZXZlbHMocGVyY05hc0RGJENvbnRleHRJUEEpLCBsYXM9MixjZXg9MixjZXgubGFiPTEuNSxjZXguYXhpcz0xLjUpDQp4c05hcyA9IHNlcSh4bGltTmFzWzFdLCB4bGltTmFzWzJdLCBsZW5ndGgub3V0PTEwMCkNCmxpbmVzKHhzTmFzLCBwbG9naXMoZnVsbENMTU1OYXNTbG9wZSRUaGV0YVsxXSAtIHhzTmFzKSwgY29sPSdibGFjaycpDQpsaW5lcyh4c05hcywgcGxvZ2lzKGZ1bGxDTE1NTmFzU2xvcGUkVGhldGFbMl0gLSB4c05hcyktcGxvZ2lzKGZ1bGxDTE1NTmFzU2xvcGUkVGhldGFbMV0gLSB4c05hcyksIGNvbD0ncmVkJykNCmxpbmVzKHhzTmFzLCBwbG9naXMoZnVsbENMTU1OYXNTbG9wZSRUaGV0YVszXSAtIHhzTmFzKS1wbG9naXMoZnVsbENMTU1OYXNTbG9wZSRUaGV0YVsyXSAtIHhzTmFzKSwgY29sPSdncmVlbicpDQpsaW5lcyh4c05hcywgcGxvZ2lzKGZ1bGxDTE1NTmFzU2xvcGUkVGhldGFbNF0gLSB4c05hcyktcGxvZ2lzKGZ1bGxDTE1NTmFzU2xvcGUkVGhldGFbM10gLSB4c05hcyksIGNvbD0nb3JhbmdlJykNCmxpbmVzKHhzTmFzLCAxLShwbG9naXMoZnVsbENMTU1OYXNTbG9wZSRUaGV0YVs0XSAtIHhzTmFzKSksIGNvbD0nYmx1ZScpDQphYmxpbmUodj1jKDAsZnVsbENMTU1OYXNTbG9wZSRiZXRhKSxsdHk9MykNCmFibGluZShoPTAsIGx0eT0iZGFzaGVkIikNCmFibGluZShoPTEsIGx0eT0iZGFzaGVkIikNCmxlZ2VuZChwYXIoJ3VzcicpWzJdLCBwYXIoJ3VzcicpWzRdLCBidHk9J24nLCB4cGQ9TkEsbHR5PTEsIGNvbD1jKCJibGFjayIsICJyZWQiLCAiZ3JlZW4iLCAib3JhbmdlIiwgImJsdWUiKSwgDQogICAgICAgbGVnZW5kPWMoIk9yYWwiLCAiMiIsICIzIiwgIjQiLCAiTmFzYWwiKSxjZXg9MC43NSkNCmBgYA0KDQpUaGUgZmlndXJlIGFib3ZlIHNob3dzIGhvdyB0d28gZ3JvdXBzIGFyZSBmb3JtZWQuIFRoZSBmaXJzdCBncm91cCBpbmNsdWRlcyBhbGwgb3JhbCBjb250ZXh0cywgSXNvbGF0aW9uIGFuZCBwaGFyeW5nZWFscyBlaXRoZXIgb24gdGhlaXIgb3duIG9yIHdpdGggYW4gb3JhbCBjb250ZXh0LiBUaGUgc2Vjb25kIGdyb3VwIGluY2x1ZGUgYWxsIG5hc2FsIGNvbnRleHRzIGFuZCB0aG9zZSBpbmNsdWRpbmcgcGhhcnluZ2VhbHMgYW5kIG5hc2Fscy4gSXQgaXMgaW50ZXJlc3RpbmcgdG8gc2VlIHRoYXQgdGhlIHBlcmNlcHQgb2YgbmFzYWxpdHkgaXMgaW5jcmVhc2VkIHdoZW4gYSBwaGFyeW5nZWFsIGlzIGFzc29jaWF0ZWQgd2l0aCBhIG5hc2FsIGNvbnRleHQ7IHdoZW4gYXNzb2NpYXRlZCB3aXRoIGFuIG9yYWwgY29udGV4dCwgdGhlIHJhdGluZ3MgYXJlIG1vc3RseSAiT3JhbCIuIFRoZSBjb250ZXh0ICJuLW8iIGFuZCAibi1uIiByZWNlaXZlZCB0aGUgaGlnaGVzdCByYXRpbmdzIG9mICJOYXNhbCIgKDQgYW5kIDUpIHdpdGggYSBzdW0gb2YgYXJvdW5kIDg1LTkwJS4gVGhpcyB3YXMgZm9sbG93ZWQgYnkgYm90aCAibi3KlSIgYW5kICLKlS1uIiBhdCBhIGNvbWJpbmVkIHJhdGluZyBvZiBhcm91bmQgODAlLg0KDQojIyMgRXhwbG9yaW5nIHJhbmRvbSBlZmZlY3RzDQpUaGlzIHNlY3Rpb24gaXMgbm90IHBhcnQgb2YgdGhlIGFuYWxzeWVzIHByZXNlbnRlZCBpbiB0aGUgYXJ0aWNsZSwgYnV0IGFyZSBjcnVjaWFsIGF0IHVuZGVyc3RhbmRpbmcgaG93IHRoZSByYXRpbmcgZXhwZXJpbWVudCB3b3JrZWQgYW5kIGhvdyB0aGUgcmFuZG9tIGZhY3RvcnMgd2VyZSBjcnVjaWFsIGluIGdlbmVyYWxpc2luZyB0aGUgcmVzdWx0cy4gV2l0aG91dCBpbmNsdWRpbmcgcmFuZG9tIGVmZmVjdHMsIHRoZSBtb2RlbCB3b3VsZCBoYXZlIHByb3ZpZGVkIHdyb25nIHByZWRpY3Rpb25zLCBnaXZlbiB0aGF0IG91ciBzdWJqZWN0cywgcmF0ZXJzIGFuZCB3b3JkcyBzaG93ZWQgY2xlYXIgdmFyaWFuY2UuIFRoaXMgd2FzIHRha2VuIGludG8gYWNjb3VudCBpbiB0aGUgbW9kZWxzIHByZXNlbnRlZCBhYm92ZS4NCg0KIyMjIyBWb2ljZSBRdWFsaXR5IChWUSkNCg0KIyMjIyMgUHJlcHJvY2Vzc2luZyBkYXRhDQpXZSBzdGFydCBieSBwcmVwcm9jZXNzaW5nIHRoZSBkYXRhLiBXZSBjcmVhdGUgZGF0YS1mcmFtZXMgd2l0aCBpbnRlcmNlcHRzIGFuZCB2YXJpYW5jZXMgb2YgYWxsIHJhbmRvbSBlZmZlY3RzOyB0aGUgZmlyc3QgY29sdW1uIGlzIHRoZSBncm91cGluZyBmYWN0b3IsIGZvbGxvd2VkIGJ5IDUgY29sdW1ucyBvZiBpbnRlcmNlcHRzLCBjb2x1bW5zIDctMTEgYXJlIHRoZSB2YXJpYW5jZXMuDQpgYGB7cn0NCiMjIyMgDQojIA0KDQojZ2V0dGluZyBiZXRhcw0KYmV0YXNWUSA8LSBhcy5kYXRhLmZyYW1lKGZ1bGxDTE1NVlFTbG9wZSRiZXRhKQ0KDQojIGdldHRpbmcgcmFuZG9tIGVmZmVjdHMgY29lZmljaWVudHMgYW5kIGNvbmRpdGlvbmFsIHZhcmlhbmNlDQojIGZvciBzdWJqZWN0cw0KcmFuZG9tc1ZRU3ViamVjdCA8LSBhcy5kYXRhLmZyYW1lKHJhbmVmKGZ1bGxDTE1NVlFTbG9wZSwgY29uZFZhciA9IEYpJFN1YmplY3QpDQp2YXJWUVN1YmplY3QgICAgIDwtIGFzLmRhdGEuZnJhbWUoY29uZFZhcihmdWxsQ0xNTVZRU2xvcGUpJFN1YmplY3QpDQoNCmRmVlFTdWJqZWN0ICAgICAgPC0gbWVyZ2UocmFuZG9tc1ZRU3ViamVjdCwgdmFyVlFTdWJqZWN0LCBieSA9InJvdy5uYW1lcyIpDQpiZXRhc1ZRDQpkZlZRU3ViamVjdA0Kc3ViUmFuZWZWUVN1YmogPC0gZnVsbENMTU1WUVNsb3BlJHJhbmVmWzQ2OjU0XQ0Kc3ViY29uZFZhclZRU3ViaiA8LSBjb25kVmFyKGZ1bGxDTE1NVlFTbG9wZSkkU3ViamVjdFsxXQ0Kc3ViY29uZFZhclZRU3ViaiA8LSBtYXRyaXgoYXMubnVtZXJpYyh1bmxpc3Qoc3ViY29uZFZhclZRU3ViaikpLG5yb3c9bnJvdyhzdWJjb25kVmFyVlFTdWJqKSkgDQoNCg0KIyBnZXR0aW5nIHJhbmRvbSBlZmZlY3RzIGNvZWZpY2llbnRzIGFuZCBjb25kaXRpb25hbCB2YXJpYW5jZQ0KIyBmb3IgcmF0ZXJzDQpyYW5kb21zVlFSYXRlciA8LSBhcy5kYXRhLmZyYW1lKHJhbmVmKGZ1bGxDTE1NVlFTbG9wZSwgY29uZFZhciA9IEYpJFJhdGVyKQ0KdmFyVlFSYXRlciAgICAgPC0gYXMuZGF0YS5mcmFtZShjb25kVmFyKGZ1bGxDTE1NVlFTbG9wZSkkUmF0ZXIpDQpkZlZRUmF0ZXIgICAgICA8LSBtZXJnZShyYW5kb21zVlFSYXRlciwgdmFyVlFSYXRlciwgYnkgPSJyb3cubmFtZXMiKQ0KZGZWUVJhdGVyDQpzdWJSYW5lZlZRUmF0ZXIgPC0gZnVsbENMTU1WUVNsb3BlJHJhbmVmWzU1OjYwXQ0Kc3ViY29uZFZhclZRUmF0ZXIgPC0gY29uZFZhcihmdWxsQ0xNTVZRU2xvcGUpJFJhdGVyWzFdDQpzdWJjb25kVmFyVlFSYXRlciA8LSBtYXRyaXgoYXMubnVtZXJpYyh1bmxpc3Qoc3ViY29uZFZhclZRUmF0ZXIpKSxucm93PW5yb3coc3ViY29uZFZhclZRUmF0ZXIpKSANCg0KIyBnZXR0aW5nIHJhbmRvbSBlZmZlY3RzIGNvZWZpY2llbnRzIGFuZCBjb25kaXRpb25hbCB2YXJpYW5jZQ0KIyBmb3Igd29yZHMNCnJhbmRvbXNWUVdvcmQgPC0gYXMuZGF0YS5mcmFtZShyYW5lZihmdWxsQ0xNTVZRU2xvcGUsIGNvbmRWYXIgPSBGKSRJdGVtKQ0KdmFyVlFXb3JkICAgICA8LSBhcy5kYXRhLmZyYW1lKGNvbmRWYXIoZnVsbENMTU1WUVNsb3BlKSRJdGVtKQ0KZGZWUVdvcmQgICAgICA8LSBtZXJnZShyYW5kb21zVlFXb3JkLCB2YXJWUVdvcmQsIGJ5ID0icm93Lm5hbWVzIikNCmRmVlFXb3JkDQpzdWJSYW5lZlZRV29yZCA8LSBmdWxsQ0xNTVZRU2xvcGUkcmFuZWZbMTo0NV0NCnN1YmNvbmRWYXJWUVdvcmQgPC0gY29uZFZhcihmdWxsQ0xNTVZRU2xvcGUpJEl0ZW1bMV0NCnN1YmNvbmRWYXJWUVdvcmQgPC0gbWF0cml4KGFzLm51bWVyaWModW5saXN0KHN1YmNvbmRWYXJWUVdvcmQpKSxucm93PW5yb3coc3ViY29uZFZhclZRV29yZCkpIA0KDQpgYGANCg0KV2UgdGhlbiByZW9yZGVyIHRoZSByYW5kb20gZWZmZWN0cyBieSB0aGVpciBsYWJlbHMuIFdlIGFsc28gY2hhbmdlIGEgZmV3IHRoaW5ncw0KDQpgYGB7cn0NCmxhYmVsc1ZRIDwtIGMobGV2ZWxzKHBlcmNWUURGJEl0ZW0pLGxldmVscyhwZXJjVlFERiRTdWJqZWN0KSwNCiAgICAgICAgICAgICBsZXZlbHMocGVyY1ZRREYkUmF0ZXIpKQ0KDQpvcmQucmVMYWJlbFZRIDwtIGFzLmRhdGEuZnJhbWUoZnVsbENMTU1WUVNsb3BlJHJhbmVmWzE6NjBdKQ0Kb3JkLnJlTGFiZWxWUSR2YXIgPC0gcm93Lm5hbWVzKGZ1bGxDTE1NVlFTbG9wZSRyYW5lZlsxOjYwXSkNCm9yZC5yZUxhYmVsVlEgPC0gbWVyZ2UobGFiZWxzVlEsb3JkLnJlTGFiZWxWUSxieSA9InJvdy5uYW1lcyIpDQpvcmQucmVMYWJlbFZRDQoNCm9yZC5yZUxhYmVsVlEkUm93Lm5hbWVzIDwtIGFzLm51bWVyaWMob3JkLnJlTGFiZWxWUSRSb3cubmFtZXMpDQpvcmQucmVMYWJlbFZRIDwtIG9yZC5yZUxhYmVsVlFbIG9yZGVyKG9yZC5yZUxhYmVsVlFbLDFdKSwgXQ0Kcm93bmFtZXMob3JkLnJlTGFiZWxWUSkgPC0gTlVMTA0KDQpvcmQucmVMYWJlbFZRDQoNCm9yZC5yZUxhYmVsVlFXb3JkIDwtIG9yZC5yZUxhYmVsVlFbMTo0NSxdDQpvcmQucmVMYWJlbFZRU3ViaiA8LSBvcmQucmVMYWJlbFZRWzQ2OjU0LF0NCm9yZC5yZUxhYmVsVlFSYXRlciA8LSBvcmQucmVMYWJlbFZRWzU1OjYwLF0NCm9yZC5yZUxhYmVsVlFXb3JkJHggPC0gZmFjdG9yKG9yZC5yZUxhYmVsVlFXb3JkJHgpDQpvcmQucmVMYWJlbFZRU3ViaiR4IDwtIGZhY3RvcihvcmQucmVMYWJlbFZRU3ViaiR4KQ0Kb3JkLnJlTGFiZWxWUVJhdGVyJHggPC0gZmFjdG9yKG9yZC5yZUxhYmVsVlFSYXRlciR4KQ0KDQojY2hhbmdpbmcgaXRlbXMgZnJvbSB0cmFuc2xpdGVyYXRpb24gdG8gSVBBDQpvcmQucmVMYWJlbFZRV29yZCR4IDwtIGFzLmNoYXJhY3RlcihvcmQucmVMYWJlbFZRV29yZCR4KQ0Kb3JkLnJlTGFiZWxWUVdvcmQkeFtvcmQucmVMYWJlbFZRV29yZCR4ID09ICI3YWFkLXciXSA8LSAiXHUwMTI3YTpkIg0Kb3JkLnJlTGFiZWxWUVdvcmQkeFtvcmQucmVMYWJlbFZRV29yZCR4ID09ICI3ZWVmLXciXSA8LSAiXHUwMTI3ZTpmIg0Kb3JkLnJlTGFiZWxWUVdvcmQkeFtvcmQucmVMYWJlbFZRV29yZCR4ID09ICI3ZWVmLXYiXSA8LSAiXHUwMTI3ZTpmLXYiDQpvcmQucmVMYWJlbFZRV29yZCR4W29yZC5yZUxhYmVsVlFXb3JkJHggPT0gIjdlbi13Il0gPC0gIlx1MDEyN2VubiINCm9yZC5yZUxhYmVsVlFXb3JkJHhbb3JkLnJlTGFiZWxWUVdvcmQkeCA9PSAiN29vay13Il0gPC0gIlx1MDEyN286ayINCm9yZC5yZUxhYmVsVlFXb3JkJHhbb3JkLnJlTGFiZWxWUVdvcmQkeCA9PSAiN29vbS13Il0gPC0gIlx1MDEyN286bSINCm9yZC5yZUxhYmVsVlFXb3JkJHhbb3JkLnJlTGFiZWxWUVdvcmQkeCA9PSAibG9vNy13Il0gPC0gImxvOlx1MDEyNyINCm9yZC5yZUxhYmVsVlFXb3JkJHhbb3JkLnJlTGFiZWxWUVdvcmQkeCA9PSAibmFhNy13Il0gPC0gIm5hOlx1MDEyNyINCm9yZC5yZUxhYmVsVlFXb3JkJHhbb3JkLnJlTGFiZWxWUVdvcmQkeCA9PSAibmFhNy12Il0gPC0gIm5hOlx1MDEyNy12Ig0Kb3JkLnJlTGFiZWxWUVdvcmQkeFtvcmQucmVMYWJlbFZRV29yZCR4ID09ICJudXU3LXciXSA8LSAibnU6XHUwMTI3Ig0Kb3JkLnJlTGFiZWxWUVdvcmQkeFtvcmQucmVMYWJlbFZRV29yZCR4ID09ICJudXU3LXYiXSA8LSAibnU6XHUwMTI3LXYiDQpvcmQucmVMYWJlbFZRV29yZCR4W29yZC5yZUxhYmVsVlFXb3JkJHggPT0gInphYTctdyJdIDwtICJ6YTpcdTAxMjciDQpvcmQucmVMYWJlbFZRV29yZCR4W29yZC5yZUxhYmVsVlFXb3JkJHggPT0gInppaTctdyJdIDwtICJ6aTpcdTAxMjciDQpvcmQucmVMYWJlbFZRV29yZCR4W29yZC5yZUxhYmVsVlFXb3JkJHggPT0gIjNhYWYtdyJdIDwtICLKlWE6ZiINCm9yZC5yZUxhYmVsVlFXb3JkJHhbb3JkLnJlTGFiZWxWUVdvcmQkeCA9PSAiM2FhbS13Il0gPC0gIsqVYTptIg0Kb3JkLnJlTGFiZWxWUVdvcmQkeFtvcmQucmVMYWJlbFZRV29yZCR4ID09ICIzZWViLXciXSA8LSAiypVlOmIiDQpvcmQucmVMYWJlbFZRV29yZCR4W29yZC5yZUxhYmVsVlFXb3JkJHggPT0gIjNlZWItdiJdIDwtICLKlWU6Yi12Ig0Kb3JkLnJlTGFiZWxWUVdvcmQkeFtvcmQucmVMYWJlbFZRV29yZCR4ID09ICIzZWVuLXciXSA8LSAiypVlOm4iDQpvcmQucmVMYWJlbFZRV29yZCR4W29yZC5yZUxhYmVsVlFXb3JkJHggPT0gIjNpaXNoLXciXSA8LSAiypVhOsqDIg0Kb3JkLnJlTGFiZWxWUVdvcmQkeFtvcmQucmVMYWJlbFZRV29yZCR4ID09ICIzb28zLXciXSA8LSAiypVvOsqVIg0Kb3JkLnJlTGFiZWxWUVdvcmQkeFtvcmQucmVMYWJlbFZRV29yZCR4ID09ICIzb28zLXYiXSA8LSAiypVvOsqVLXYiDQpvcmQucmVMYWJlbFZRV29yZCR4W29yZC5yZUxhYmVsVlFXb3JkJHggPT0gIjNvb24tdyJdIDwtICLKlW86biINCm9yZC5yZUxhYmVsVlFXb3JkJHhbb3JkLnJlTGFiZWxWUVdvcmQkeCA9PSAiYmFhMy13Il0gPC0gImJhOsqVIg0Kb3JkLnJlTGFiZWxWUVdvcmQkeFtvcmQucmVMYWJlbFZRV29yZCR4ID09ICJiaWkzLXciXSA8LSAiYmk6ypUiDQpvcmQucmVMYWJlbFZRV29yZCR4W29yZC5yZUxhYmVsVlFXb3JkJHggPT0gImJpaTMtdiJdIDwtICJiaTrKlS12Ig0Kb3JkLnJlTGFiZWxWUVdvcmQkeFtvcmQucmVMYWJlbFZRV29yZCR4ID09ICJib29zaC13Il0gPC0gImJvOsqDIg0Kb3JkLnJlTGFiZWxWUVdvcmQkeFtvcmQucmVMYWJlbFZRV29yZCR4ID09ICJkanV1My13Il0gPC0gImTNocqSdTrKlSINCm9yZC5yZUxhYmVsVlFXb3JkJHhbb3JkLnJlTGFiZWxWUVdvcmQkeCA9PSAiZGp1dTMtdiJdIDwtICJkzaHKknU6ypUtdiINCm9yZC5yZUxhYmVsVlFXb3JkJHhbb3JkLnJlTGFiZWxWUVdvcmQkeCA9PSAibm9vMy13Il0gPC0gIm5vOsqVIg0Kb3JkLnJlTGFiZWxWUVdvcmQkeFtvcmQucmVMYWJlbFZRV29yZCR4ID09ICJub28zLXYiXSA8LSAibm86ypUtdiINCm9yZC5yZUxhYmVsVlFXb3JkJHhbb3JkLnJlTGFiZWxWUVdvcmQkeCA9PSAiYmVldC13Il0gPC0gImJlOnQiDQpvcmQucmVMYWJlbFZRV29yZCR4W29yZC5yZUxhYmVsVlFXb3JkJHggPT0gImRhYXMtdyJdIDwtICJkYTpzIg0Kb3JkLnJlTGFiZWxWUVdvcmQkeFtvcmQucmVMYWJlbFZRV29yZCR4ID09ICJkaWluLXciXSA8LSAiZGk6biINCm9yZC5yZUxhYmVsVlFXb3JkJHhbb3JkLnJlTGFiZWxWUVdvcmQkeCA9PSAiZG9vbS13Il0gPC0gImRvOm0iDQpvcmQucmVMYWJlbFZRV29yZCR4W29yZC5yZUxhYmVsVlFXb3JkJHggPT0gImRvb20tdiJdIDwtICJkbzptLXYiDQpvcmQucmVMYWJlbFZRV29yZCR4W29yZC5yZUxhYmVsVlFXb3JkJHggPT0gImJlZXQtdyJdIDwtICJiZTp0Ig0Kb3JkLnJlTGFiZWxWUVdvcmQkeFtvcmQucmVMYWJlbFZRV29yZCR4ID09ICJtYWF0LXciXSA8LSAibWE6dCINCm9yZC5yZUxhYmVsVlFXb3JkJHhbb3JkLnJlTGFiZWxWUVdvcmQkeCA9PSAibWFhdC12Il0gPC0gIm1hOnQtdiINCm9yZC5yZUxhYmVsVlFXb3JkJHhbb3JkLnJlTGFiZWxWUVdvcmQkeCA9PSAibW9vei13Il0gPC0gIm1vOnoiDQpvcmQucmVMYWJlbFZRV29yZCR4W29yZC5yZUxhYmVsVlFXb3JkJHggPT0gIm11dW4tdyJdIDwtICJtdTpuIg0Kb3JkLnJlTGFiZWxWUVdvcmQkeFtvcmQucmVMYWJlbFZRV29yZCR4ID09ICJtdXVzLXciXSA8LSAibXU6cyINCm9yZC5yZUxhYmVsVlFXb3JkJHhbb3JkLnJlTGFiZWxWUVdvcmQkeCA9PSAibmFhbS13Il0gPC0gIm5hOm0iDQpvcmQucmVMYWJlbFZRV29yZCR4W29yZC5yZUxhYmVsVlFXb3JkJHggPT0gIm5hYW0tdiJdIDwtICJuYTptLXYiDQpvcmQucmVMYWJlbFZRV29yZCR4W29yZC5yZUxhYmVsVlFXb3JkJHggPT0gIm5vb20tdyJdIDwtICJubzptIg0Kb3JkLnJlTGFiZWxWUVdvcmQkeFtvcmQucmVMYWJlbFZRV29yZCR4ID09ICJzYWFtLXciXSA8LSAic2E6bSINCm9yZC5yZUxhYmVsVlFXb3JkJHhbb3JkLnJlTGFiZWxWUVdvcmQkeCA9PSAic2FhbS12Il0gPC0gInNhOm0tdiINCm9yZC5yZUxhYmVsVlFXb3JkJHhbb3JkLnJlTGFiZWxWUVdvcmQkeCA9PSAiYmVldC13Il0gPC0gImJlOnQiDQpvcmQucmVMYWJlbFZRV29yZCR4IDwtIGFzLmZhY3RvcihvcmQucmVMYWJlbFZRV29yZCR4KQ0KDQojIHJlb3JkZXJpbmcNCm9yZC5yZUxhYmVsVlFXb3JkIDwtIG9yZC5yZUxhYmVsVlFXb3JkICU+JSBhcnJhbmdlKGBmdWxsQ0xNTVZRU2xvcGUkcmFuZWZbMTo2MF1gKQ0KDQpvcmQucmVMYWJlbFZRV29yZCR4IDwtIGFzLnZlY3RvcihvcmQucmVMYWJlbFZRV29yZCR4KSAjZ2V0IHJpZCBvZiBmYWN0b3JzDQpvcmQucmVMYWJlbFZRV29yZCR4ID0gZmFjdG9yKG9yZC5yZUxhYmVsVlFXb3JkJHgsb3JkLnJlTGFiZWxWUVdvcmQkeCkgI2FkZCBvcmRlcmVkIGZhY3RvcnMgYmFjaw0KDQoNCm9yZC5yZUxhYmVsVlFTdWJqIDwtIG9yZC5yZUxhYmVsVlFTdWJqICU+JSBhcnJhbmdlKGBmdWxsQ0xNTVZRU2xvcGUkcmFuZWZbMTo2MF1gKQ0KDQpvcmQucmVMYWJlbFZRU3ViaiR4IDwtIGFzLnZlY3RvcihvcmQucmVMYWJlbFZRU3ViaiR4KSAjZ2V0IHJpZCBvZiBmYWN0b3JzDQpvcmQucmVMYWJlbFZRU3ViaiR4ID0gZmFjdG9yKG9yZC5yZUxhYmVsVlFTdWJqJHgsb3JkLnJlTGFiZWxWUVN1YmokeCkgI2FkZCBvcmRlcmVkIGZhY3RvcnMgYmFjaw0KDQoNCm9yZC5yZUxhYmVsVlFSYXRlciA8LSBvcmQucmVMYWJlbFZRUmF0ZXIgJT4lIGFycmFuZ2UoYGZ1bGxDTE1NVlFTbG9wZSRyYW5lZlsxOjYwXWApDQoNCm9yZC5yZUxhYmVsVlFSYXRlciR4IDwtIGFzLnZlY3RvcihvcmQucmVMYWJlbFZRUmF0ZXIkeCkgI2dldCByaWQgb2YgZmFjdG9ycw0Kb3JkLnJlTGFiZWxWUVJhdGVyJHggPSBmYWN0b3Iob3JkLnJlTGFiZWxWUVJhdGVyJHgsb3JkLnJlTGFiZWxWUVJhdGVyJHgpICNhZGQgb3JkZXJlZCBmYWN0b3JzIGJhY2sNCg0KYGBgDQoNCg0KIyMjIyMgRmlndXJlcw0KDQojIyMjIyMgU3ViamVjdHMNCg0KYGBge3J9DQpjaVZRU3ViaiA8LSBzdWJSYW5lZlZRU3ViaiArIHFub3JtKDAuOTc1KSAqIHNxcnQoYXMubnVtZXJpYyhzdWJjb25kVmFyVlFTdWJqKSkgJW8lIGMoLTEsIDEpDQpvcmQucmVWUVN1YmogPC0gb3JkZXIoc3ViUmFuZWZWUVN1YmopDQpjaVZRU3ViaiA8LSBjaVZRU3VialtvcmRlcihzdWJSYW5lZlZRU3ViaiksXQ0KcGxvdChzdWJSYW5lZlZRU3VialtvcmQucmVWUVN1YmpdLCAxOjksIGF4ZXM9RkFMU0UsIHhsaW09cmFuZ2UoY2lWUVN1YmopLA0KICAgICB4bGFiPSJTdWJqZWN0IHZhcmlhdGlvbiIsIHlsYWI9IiIsY2V4PTIsY2V4LmxhYj0yLGNleC5tYWluPTIsDQogICAgIG1haW49IkJMVVBzIFN1YmplY3QgVlEiLGNleC5heGlzPTEuNSkNCmF4aXMoMSxjZXgubGFiPTIsY2V4LmF4aXM9MS41KQ0KYXhpcygyLGF0PTE6OSwgbGFiZWxzID0gbGV2ZWxzKG9yZC5yZUxhYmVsVlFTdWJqJHgpLCBsYXM9MixjZXgubGFiPTIsY2V4LmF4aXM9MS41KQ0KZm9yKGkgaW4gMTo5KSBzZWdtZW50cyhjaVZRU3VialtpLDFdLCBpLCBjaVZRU3VialtpLCAyXSxpKQ0KYWJsaW5lKHYgPSAwLCBsdHk9MikNCmBgYA0KDQpJdCBpcyBpbnRlcmVzdGluZyB0byBzZWUgdGhhdCBub3QgYWxsIHN1YmplY3RzICh3aG8gcHJvZHVjZWQgdGhlIGl0ZW1zKSB3ZXJlIHJhdGVkIGFzIG1vcmUgb3IgbGVzcyAidGVuc2UiLiBUaGUgZmlyc3QgdHdvIHN1YmplY3RzICgyIGFuZCAzKSBjb250cmlidXRlZCBtb3JlIHRvIHRoZSBwZXJjZXB0IG9mICJ0ZW5zZSIgdm9pY2UgcXVhbGl0eSB3aGVyZWFzIHNwZWFrZXJzIDYsIDkgYW5kIDQsIGNvbnRyaWJ1dGVkIGxlc3MgdG8gdGhpcyBwZXJjZXB0LiAgDQoNCiMjIyMjIyBSYXRlcnMNCmBgYHtyfQ0KDQpjaVZRUmF0ZXIgPC0gc3ViUmFuZWZWUVJhdGVyICsgcW5vcm0oMC45NzUpICogc3FydChhcy5udW1lcmljKHN1YmNvbmRWYXJWUVJhdGVyKSkgJW8lIGMoLTEsIDEpDQpvcmQucmVWUVJhdGVyIDwtIG9yZGVyKHN1YlJhbmVmVlFSYXRlcikNCmNpVlFSYXRlciA8LSBjaVZRUmF0ZXJbb3JkZXIoc3ViUmFuZWZWUVJhdGVyKSxdDQpwbG90KHN1YlJhbmVmVlFSYXRlcltvcmQucmVWUVJhdGVyXSwgMTo2LCBheGVzPUZBTFNFLCB4bGltPXJhbmdlKGNpVlFSYXRlciksDQogICAgIHhsYWI9IlJhdGVyIHZhcmlhdGlvbiIsIHlsYWI9IiIsY2V4PTIsY2V4LmxhYj0yLGNleC5tYWluPTIsDQogICAgIG1haW49IkJMVVBzIFJhdGVyIFZRIixjZXguYXhpcz0xLjUpDQpheGlzKDEsY2V4LmxhYj0yLGNleC5heGlzPTEuNSkNCmF4aXMoMixhdD0xOjYsIGxhYmVscyA9IGxldmVscyhvcmQucmVMYWJlbFZRUmF0ZXIkeCksIGxhcz0yLGNleC5sYWI9MixjZXguYXhpcz0xLjUpDQpmb3IoaSBpbiAxOjYpIHNlZ21lbnRzKGNpVlFSYXRlcltpLDFdLCBpLCBjaVZRUmF0ZXJbaSwgMl0saSkNCmFibGluZSh2ID0gMCwgbHR5PTIpDQoNCmBgYA0KDQpXaXRoIHJlc3BlY3QgdG8gcmF0ZXJzLCBpdCBpcyBpbnRlcmVzdGluZyB0byBzZWUgdGhhdCB0aGVyZSBpcyBhIGNsZWFyIHNwbGl0IGJldHdlZW4gcmF0ZXJzICh0aGF0IHdhcyBhbHJlYWR5IHBpY2tlZCB1cCBpbiB0aGUgSVJSIGFuYWx5c2VzIGFib3ZlKS4gVGhlIGZpcnN0IHRocmVlICgyLCA1IGFuZCA2KSB3ZXJlIG1vcmUgbGlrZWx5IHRvIHByb3ZpZGUgcG9zdGl2ZSByZXNwb25zZXMgdG8gInRlbnNlIiB3aGVyZWFzIDEgYW5kIDQgKGFuZCBwb3RlbnRpYWxseSAzKSB3ZXJlIG1vcmUgY29uc2VydmF0aXZlIGluIHRoZWlyIHJlc3BvbnNlcy4gUjAxIGlzIHRoZSBmaXJzdCBhdXRob3IgYW5kIFIwMiBpcyB0aGUgc2Vjb25kLiBUaGlzIHNob3dzIHRoYXQgUjAxIGlzIG1vcmUgY29uc2VydmF0aXZlIGluIHRoZWlyIHJlc3BvbnNlcyB0aGFuIFIwMi4NCg0KIyMjIyMjIEl0ZW1zDQpgYGB7ciBmaWcud2lkdGg9OSwgZmlnLmhlaWdodD01fQ0KDQpjaVZRV29yZCA8LSBzdWJSYW5lZlZRV29yZCArIHFub3JtKDAuOTc1KSAqIHNxcnQoYXMubnVtZXJpYyhzdWJjb25kVmFyVlFXb3JkKSkgJW8lIGMoLTEsIDEpDQpvcmQucmVWUVdvcmQgPC0gb3JkZXIoc3ViUmFuZWZWUVdvcmQpDQpjaVZRV29yZCA8LSBjaVZRV29yZFtvcmRlcihzdWJSYW5lZlZRV29yZCksXQ0KcGFyKG9tYSA9IGMoMCwgMS41LCAwLCAwKSkNCnBsb3QoMTo0NSxzdWJSYW5lZlZRV29yZFtvcmQucmVWUVdvcmRdLCBheGVzPUZBTFNFLCB5bGltPXJhbmdlKGNpVlFXb3JkKSwNCiAgICAgICB5bGFiPSJJdGVtIHZhcmlhdGlvbiIsIHhsYWI9IiIsY2V4PTIsY2V4LmxhYj0yLGNleC5tYWluPTIsDQogICAgIG1haW49IkJMVVBzIEl0ZW0gVlEiLGNleC5heGlzPTEuNSkNCmF4aXMoMixjZXgubGFiPTIsY2V4LmF4aXM9MS41KQ0KYXhpcygxLGF0PTE6NDUsIGxhYmVscyA9IGxldmVscyhvcmQucmVMYWJlbFZRV29yZCR4KSwgbGFzPTIsY2V4LmxhYj0yLGNleC5heGlzPTEuNSkNCmZvcihpIGluIDE6NDUpIHNlZ21lbnRzKGksIGNpVlFXb3JkW2ksMV0sIGksIGNpVlFXb3JkW2ksIDJdKQ0KYWJsaW5lKGggPSAwLCBsdHk9MikNCmBgYA0KDQpXaXRoIGl0ZW0gdmFyaWF0aW9uLCBub3QgYWxsIHdvcmRzIGNvbnRyaWJ1dGVkIHBvc2l0aXZlbHkgdG8gdGhlICJ0ZW5zZSIgcXVhbGl0eSBhbmQgdGhlcmUgaXMgYSBjbGVhciBncmFkYXRpb24gaW4gaW1wYWN0IG9mIHdvcmRzIG9uIHJhdGluZ3MuIFRoaXMgaXMgaW1wb3J0YW50IHRvIHRha2UgaW50byBhY2NvdW50IG9mIGNvdXJzZSBpbiBvdXIgbW9kZWwNCg0KIyMjIyBOYXNhbGlzYXRpb24NCg0KIyMjIyMgUHJlcHJvY2Vzc2luZyBkYXRhDQpXZSBzdGFydCBieSBwcmVwcm9jZXNzaW5nIHRoZSBkYXRhLiBXZSBjcmVhdGUgZGF0YS1mcmFtZXMgd2l0aCBpbnRlcmNlcHRzIGFuZCB2YXJpYW5jZXMgb2YgYWxsIHJhbmRvbSBlZmZlY3RzOyB0aGUgZmlyc3QgY29sdW1uIGlzIHRoZSBncm91cGluZyBmYWN0b3IsIGZvbGxvd2VkIGJ5IDUgY29sdW1ucyBvZiBpbnRlcmNlcHRzLCBjb2x1bW5zIDctMTEgYXJlIHRoZSB2YXJpYW5jZXMuDQpgYGB7cn0NCiMjIyMgDQojIA0KDQojZ2V0dGluZyBiZXRhcw0KYmV0YXNOYXMgPC0gYXMuZGF0YS5mcmFtZShmdWxsQ0xNTU5hc1Nsb3BlJGJldGEpDQoNCiMgZ2V0dGluZyByYW5kb20gZWZmZWN0cyBjb2VmaWNpZW50cyBhbmQgY29uZGl0aW9uYWwgdmFyaWFuY2UNCiMgZm9yIHN1YmplY3RzDQpyYW5kb21zTmFzU3ViamVjdCA8LSBhcy5kYXRhLmZyYW1lKHJhbmVmKGZ1bGxDTE1NTmFzU2xvcGUsIGNvbmRWYXIgPSBGKSRTdWJqZWN0KQ0KdmFyTmFzU3ViamVjdCAgICAgPC0gYXMuZGF0YS5mcmFtZShjb25kVmFyKGZ1bGxDTE1NTmFzU2xvcGUpJFN1YmplY3QpDQoNCmRmTmFzU3ViamVjdCAgICAgIDwtIG1lcmdlKHJhbmRvbXNOYXNTdWJqZWN0LCB2YXJOYXNTdWJqZWN0LCBieSA9InJvdy5uYW1lcyIpDQpiZXRhc05hcw0KZGZOYXNTdWJqZWN0DQpzdWJSYW5lZk5hc1N1YmogPC0gZnVsbENMTU1OYXNTbG9wZSRyYW5lZls0Njo1NF0NCnN1YmNvbmRWYXJOYXNTdWJqIDwtIGNvbmRWYXIoZnVsbENMTU1OYXNTbG9wZSkkU3ViamVjdFsxXQ0Kc3ViY29uZFZhck5hc1N1YmogPC0gbWF0cml4KGFzLm51bWVyaWModW5saXN0KHN1YmNvbmRWYXJOYXNTdWJqKSksbnJvdz1ucm93KHN1YmNvbmRWYXJOYXNTdWJqKSkgDQoNCg0KIyBnZXR0aW5nIHJhbmRvbSBlZmZlY3RzIGNvZWZpY2llbnRzIGFuZCBjb25kaXRpb25hbCB2YXJpYW5jZQ0KIyBmb3IgcmF0ZXJzDQpyYW5kb21zTmFzUmF0ZXIgPC0gYXMuZGF0YS5mcmFtZShyYW5lZihmdWxsQ0xNTU5hc1Nsb3BlLCBjb25kVmFyID0gRikkUmF0ZXIpDQp2YXJOYXNSYXRlciAgICAgPC0gYXMuZGF0YS5mcmFtZShjb25kVmFyKGZ1bGxDTE1NTmFzU2xvcGUpJFJhdGVyKQ0KZGZOYXNSYXRlciAgICAgIDwtIG1lcmdlKHJhbmRvbXNOYXNSYXRlciwgdmFyTmFzUmF0ZXIsIGJ5ID0icm93Lm5hbWVzIikNCmRmTmFzUmF0ZXINCnN1YlJhbmVmTmFzUmF0ZXIgPC0gZnVsbENMTU1OYXNTbG9wZSRyYW5lZls1NTo2MF0NCnN1YmNvbmRWYXJOYXNSYXRlciA8LSBjb25kVmFyKGZ1bGxDTE1NTmFzU2xvcGUpJFJhdGVyWzFdDQpzdWJjb25kVmFyTmFzUmF0ZXIgPC0gbWF0cml4KGFzLm51bWVyaWModW5saXN0KHN1YmNvbmRWYXJOYXNSYXRlcikpLG5yb3c9bnJvdyhzdWJjb25kVmFyTmFzUmF0ZXIpKSANCg0KIyBnZXR0aW5nIHJhbmRvbSBlZmZlY3RzIGNvZWZpY2llbnRzIGFuZCBjb25kaXRpb25hbCB2YXJpYW5jZQ0KIyBmb3Igd29yZHMNCnJhbmRvbXNOYXNXb3JkIDwtIGFzLmRhdGEuZnJhbWUocmFuZWYoZnVsbENMTU1OYXNTbG9wZSwgY29uZFZhciA9IEYpJEl0ZW0pDQp2YXJOYXNXb3JkICAgICA8LSBhcy5kYXRhLmZyYW1lKGNvbmRWYXIoZnVsbENMTU1OYXNTbG9wZSkkSXRlbSkNCmRmTmFzV29yZCAgICAgIDwtIG1lcmdlKHJhbmRvbXNOYXNXb3JkLCB2YXJOYXNXb3JkLCBieSA9InJvdy5uYW1lcyIpDQpkZk5hc1dvcmQNCnN1YlJhbmVmTmFzV29yZCA8LSBmdWxsQ0xNTU5hc1Nsb3BlJHJhbmVmWzE6NDVdDQpzdWJjb25kVmFyTmFzV29yZCA8LSBjb25kVmFyKGZ1bGxDTE1NTmFzU2xvcGUpJEl0ZW1bMV0NCnN1YmNvbmRWYXJOYXNXb3JkIDwtIG1hdHJpeChhcy5udW1lcmljKHVubGlzdChzdWJjb25kVmFyTmFzV29yZCkpLG5yb3c9bnJvdyhzdWJjb25kVmFyTmFzV29yZCkpIA0KDQpgYGANCg0KV2UgdGhlbiByZW9yZGVyIHRoZSByYW5kb20gZWZmZWN0cyBieSB0aGVpciBsYWJlbHMuIFdlIGFsc28gY2hhbmdlIGEgZmV3IHRoaW5ncw0KDQpgYGB7cn0NCmxhYmVsc05hcyA8LSBjKGxldmVscyhwZXJjTmFzREYkSXRlbSksbGV2ZWxzKHBlcmNOYXNERiRTdWJqZWN0KSxsZXZlbHMocGVyY05hc0RGJFJhdGVyKSkNCg0Kb3JkLnJlTGFiZWxOYXMgPC0gYXMuZGF0YS5mcmFtZShmdWxsQ0xNTU5hc1Nsb3BlJHJhbmVmWzE6NjBdKQ0Kb3JkLnJlTGFiZWxOYXMkdmFyIDwtIHJvdy5uYW1lcyhmdWxsQ0xNTU5hc1Nsb3BlJHJhbmVmWzE6NjBdKQ0Kb3JkLnJlTGFiZWxOYXMgPC0gbWVyZ2UobGFiZWxzTmFzLG9yZC5yZUxhYmVsTmFzLGJ5ID0icm93Lm5hbWVzIikNCm9yZC5yZUxhYmVsTmFzDQoNCm9yZC5yZUxhYmVsTmFzJFJvdy5uYW1lcyA8LSBhcy5udW1lcmljKG9yZC5yZUxhYmVsTmFzJFJvdy5uYW1lcykNCm9yZC5yZUxhYmVsTmFzIDwtIG9yZC5yZUxhYmVsTmFzWyBvcmRlcihvcmQucmVMYWJlbE5hc1ssMV0pLCBdDQpyb3duYW1lcyhvcmQucmVMYWJlbE5hcykgPC0gTlVMTA0KDQpvcmQucmVMYWJlbE5hcw0KDQpvcmQucmVMYWJlbE5hc1dvcmQgPC0gb3JkLnJlTGFiZWxOYXNbMTo0NSxdDQpvcmQucmVMYWJlbE5hc1N1YmogPC0gb3JkLnJlTGFiZWxOYXNbNDY6NTQsXQ0Kb3JkLnJlTGFiZWxOYXNSYXRlciA8LSBvcmQucmVMYWJlbE5hc1s1NTo2MCxdDQpvcmQucmVMYWJlbE5hc1dvcmQkeCA8LSBmYWN0b3Iob3JkLnJlTGFiZWxOYXNXb3JkJHgpDQpvcmQucmVMYWJlbE5hc1N1YmokeCA8LSBmYWN0b3Iob3JkLnJlTGFiZWxOYXNTdWJqJHgpDQpvcmQucmVMYWJlbE5hc1JhdGVyJHggPC0gZmFjdG9yKG9yZC5yZUxhYmVsTmFzUmF0ZXIkeCkNCg0KI2NoYW5naW5nIGl0ZW1zIGZyb20gdHJhbnNsaXRlcmF0aW9uIHRvIElQQQ0Kb3JkLnJlTGFiZWxOYXNXb3JkJHggPC0gYXMuY2hhcmFjdGVyKG9yZC5yZUxhYmVsTmFzV29yZCR4KQ0Kb3JkLnJlTGFiZWxOYXNXb3JkJHhbb3JkLnJlTGFiZWxOYXNXb3JkJHggPT0gIjdhYWQtdyJdIDwtICJcdTAxMjdhOmQiDQpvcmQucmVMYWJlbE5hc1dvcmQkeFtvcmQucmVMYWJlbE5hc1dvcmQkeCA9PSAiN2VlZi13Il0gPC0gIlx1MDEyN2U6ZiINCm9yZC5yZUxhYmVsTmFzV29yZCR4W29yZC5yZUxhYmVsTmFzV29yZCR4ID09ICI3ZWVmLXYiXSA8LSAiXHUwMTI3ZTpmLXYiDQpvcmQucmVMYWJlbE5hc1dvcmQkeFtvcmQucmVMYWJlbE5hc1dvcmQkeCA9PSAiN2VuLXciXSA8LSAiXHUwMTI3ZW5uIg0Kb3JkLnJlTGFiZWxOYXNXb3JkJHhbb3JkLnJlTGFiZWxOYXNXb3JkJHggPT0gIjdvb2stdyJdIDwtICJcdTAxMjdvOmsiDQpvcmQucmVMYWJlbE5hc1dvcmQkeFtvcmQucmVMYWJlbE5hc1dvcmQkeCA9PSAiN29vbS13Il0gPC0gIlx1MDEyN286bSINCm9yZC5yZUxhYmVsTmFzV29yZCR4W29yZC5yZUxhYmVsTmFzV29yZCR4ID09ICJsb283LXciXSA8LSAibG86XHUwMTI3Ig0Kb3JkLnJlTGFiZWxOYXNXb3JkJHhbb3JkLnJlTGFiZWxOYXNXb3JkJHggPT0gIm5hYTctdyJdIDwtICJuYTpcdTAxMjciDQpvcmQucmVMYWJlbE5hc1dvcmQkeFtvcmQucmVMYWJlbE5hc1dvcmQkeCA9PSAibmFhNy12Il0gPC0gIm5hOlx1MDEyNy12Ig0Kb3JkLnJlTGFiZWxOYXNXb3JkJHhbb3JkLnJlTGFiZWxOYXNXb3JkJHggPT0gIm51dTctdyJdIDwtICJudTpcdTAxMjciDQpvcmQucmVMYWJlbE5hc1dvcmQkeFtvcmQucmVMYWJlbE5hc1dvcmQkeCA9PSAibnV1Ny12Il0gPC0gIm51Olx1MDEyNy12Ig0Kb3JkLnJlTGFiZWxOYXNXb3JkJHhbb3JkLnJlTGFiZWxOYXNXb3JkJHggPT0gInphYTctdyJdIDwtICJ6YTpcdTAxMjciDQpvcmQucmVMYWJlbE5hc1dvcmQkeFtvcmQucmVMYWJlbE5hc1dvcmQkeCA9PSAiemlpNy13Il0gPC0gInppOlx1MDEyNyINCm9yZC5yZUxhYmVsTmFzV29yZCR4W29yZC5yZUxhYmVsTmFzV29yZCR4ID09ICIzYWFmLXciXSA8LSAiypVhOmYiDQpvcmQucmVMYWJlbE5hc1dvcmQkeFtvcmQucmVMYWJlbE5hc1dvcmQkeCA9PSAiM2FhbS13Il0gPC0gIsqVYTptIg0Kb3JkLnJlTGFiZWxOYXNXb3JkJHhbb3JkLnJlTGFiZWxOYXNXb3JkJHggPT0gIjNlZWItdyJdIDwtICLKlWU6YiINCm9yZC5yZUxhYmVsTmFzV29yZCR4W29yZC5yZUxhYmVsTmFzV29yZCR4ID09ICIzZWViLXYiXSA8LSAiypVlOmItdiINCm9yZC5yZUxhYmVsTmFzV29yZCR4W29yZC5yZUxhYmVsTmFzV29yZCR4ID09ICIzZWVuLXciXSA8LSAiypVlOm4iDQpvcmQucmVMYWJlbE5hc1dvcmQkeFtvcmQucmVMYWJlbE5hc1dvcmQkeCA9PSAiM2lpc2gtdyJdIDwtICLKlWE6yoMiDQpvcmQucmVMYWJlbE5hc1dvcmQkeFtvcmQucmVMYWJlbE5hc1dvcmQkeCA9PSAiM29vMy13Il0gPC0gIsqVbzrKlSINCm9yZC5yZUxhYmVsTmFzV29yZCR4W29yZC5yZUxhYmVsTmFzV29yZCR4ID09ICIzb28zLXYiXSA8LSAiypVvOsqVLXYiDQpvcmQucmVMYWJlbE5hc1dvcmQkeFtvcmQucmVMYWJlbE5hc1dvcmQkeCA9PSAiM29vbi13Il0gPC0gIsqVbzpuIg0Kb3JkLnJlTGFiZWxOYXNXb3JkJHhbb3JkLnJlTGFiZWxOYXNXb3JkJHggPT0gImJhYTMtdyJdIDwtICJiYTrKlSINCm9yZC5yZUxhYmVsTmFzV29yZCR4W29yZC5yZUxhYmVsTmFzV29yZCR4ID09ICJiaWkzLXciXSA8LSAiYmk6ypUiDQpvcmQucmVMYWJlbE5hc1dvcmQkeFtvcmQucmVMYWJlbE5hc1dvcmQkeCA9PSAiYmlpMy12Il0gPC0gImJpOsqVLXYiDQpvcmQucmVMYWJlbE5hc1dvcmQkeFtvcmQucmVMYWJlbE5hc1dvcmQkeCA9PSAiYm9vc2gtdyJdIDwtICJibzrKgyINCm9yZC5yZUxhYmVsTmFzV29yZCR4W29yZC5yZUxhYmVsTmFzV29yZCR4ID09ICJkanV1My13Il0gPC0gImTNocqSdTrKlSINCm9yZC5yZUxhYmVsTmFzV29yZCR4W29yZC5yZUxhYmVsTmFzV29yZCR4ID09ICJkanV1My12Il0gPC0gImTNocqSdTrKlS12Ig0Kb3JkLnJlTGFiZWxOYXNXb3JkJHhbb3JkLnJlTGFiZWxOYXNXb3JkJHggPT0gIm5vbzMtdyJdIDwtICJubzrKlSINCm9yZC5yZUxhYmVsTmFzV29yZCR4W29yZC5yZUxhYmVsTmFzV29yZCR4ID09ICJub28zLXYiXSA8LSAibm86ypUtdiINCm9yZC5yZUxhYmVsTmFzV29yZCR4W29yZC5yZUxhYmVsTmFzV29yZCR4ID09ICJiZWV0LXciXSA8LSAiYmU6dCINCm9yZC5yZUxhYmVsTmFzV29yZCR4W29yZC5yZUxhYmVsTmFzV29yZCR4ID09ICJkYWFzLXciXSA8LSAiZGE6cyINCm9yZC5yZUxhYmVsTmFzV29yZCR4W29yZC5yZUxhYmVsTmFzV29yZCR4ID09ICJkaWluLXciXSA8LSAiZGk6biINCm9yZC5yZUxhYmVsTmFzV29yZCR4W29yZC5yZUxhYmVsTmFzV29yZCR4ID09ICJkb29tLXciXSA8LSAiZG86bSINCm9yZC5yZUxhYmVsTmFzV29yZCR4W29yZC5yZUxhYmVsTmFzV29yZCR4ID09ICJkb29tLXYiXSA8LSAiZG86bS12Ig0Kb3JkLnJlTGFiZWxOYXNXb3JkJHhbb3JkLnJlTGFiZWxOYXNXb3JkJHggPT0gImJlZXQtdyJdIDwtICJiZTp0Ig0Kb3JkLnJlTGFiZWxOYXNXb3JkJHhbb3JkLnJlTGFiZWxOYXNXb3JkJHggPT0gIm1hYXQtdyJdIDwtICJtYTp0Ig0Kb3JkLnJlTGFiZWxOYXNXb3JkJHhbb3JkLnJlTGFiZWxOYXNXb3JkJHggPT0gIm1hYXQtdiJdIDwtICJtYTp0LXYiDQpvcmQucmVMYWJlbE5hc1dvcmQkeFtvcmQucmVMYWJlbE5hc1dvcmQkeCA9PSAibW9vei13Il0gPC0gIm1vOnoiDQpvcmQucmVMYWJlbE5hc1dvcmQkeFtvcmQucmVMYWJlbE5hc1dvcmQkeCA9PSAibXV1bi13Il0gPC0gIm11Om4iDQpvcmQucmVMYWJlbE5hc1dvcmQkeFtvcmQucmVMYWJlbE5hc1dvcmQkeCA9PSAibXV1cy13Il0gPC0gIm11OnMiDQpvcmQucmVMYWJlbE5hc1dvcmQkeFtvcmQucmVMYWJlbE5hc1dvcmQkeCA9PSAibmFhbS13Il0gPC0gIm5hOm0iDQpvcmQucmVMYWJlbE5hc1dvcmQkeFtvcmQucmVMYWJlbE5hc1dvcmQkeCA9PSAibmFhbS12Il0gPC0gIm5hOm0tdiINCm9yZC5yZUxhYmVsTmFzV29yZCR4W29yZC5yZUxhYmVsTmFzV29yZCR4ID09ICJub29tLXciXSA8LSAibm86bSINCm9yZC5yZUxhYmVsTmFzV29yZCR4W29yZC5yZUxhYmVsTmFzV29yZCR4ID09ICJzYWFtLXciXSA8LSAic2E6bSINCm9yZC5yZUxhYmVsTmFzV29yZCR4W29yZC5yZUxhYmVsTmFzV29yZCR4ID09ICJzYWFtLXYiXSA8LSAic2E6bS12Ig0Kb3JkLnJlTGFiZWxOYXNXb3JkJHhbb3JkLnJlTGFiZWxOYXNXb3JkJHggPT0gImJlZXQtdyJdIDwtICJiZTp0Ig0Kb3JkLnJlTGFiZWxOYXNXb3JkJHggPC0gYXMuZmFjdG9yKG9yZC5yZUxhYmVsTmFzV29yZCR4KQ0KDQojIHJlb3JkZXJpbmcNCm9yZC5yZUxhYmVsTmFzV29yZCA8LSBvcmQucmVMYWJlbE5hc1dvcmQgJT4lIGFycmFuZ2UoYGZ1bGxDTE1NTmFzU2xvcGUkcmFuZWZbMTo2MF1gKQ0KDQpvcmQucmVMYWJlbE5hc1dvcmQkeCA8LSBhcy52ZWN0b3Iob3JkLnJlTGFiZWxOYXNXb3JkJHgpICNnZXQgcmlkIG9mIGZhY3RvcnMNCm9yZC5yZUxhYmVsTmFzV29yZCR4ID0gZmFjdG9yKG9yZC5yZUxhYmVsTmFzV29yZCR4LG9yZC5yZUxhYmVsTmFzV29yZCR4KSAjYWRkIG9yZGVyZWQgZmFjdG9ycyBiYWNrDQoNCg0Kb3JkLnJlTGFiZWxOYXNTdWJqIDwtIG9yZC5yZUxhYmVsTmFzU3ViaiAlPiUgYXJyYW5nZShgZnVsbENMTU1OYXNTbG9wZSRyYW5lZlsxOjYwXWApDQoNCm9yZC5yZUxhYmVsTmFzU3ViaiR4IDwtIGFzLnZlY3RvcihvcmQucmVMYWJlbE5hc1N1YmokeCkgI2dldCByaWQgb2YgZmFjdG9ycw0Kb3JkLnJlTGFiZWxOYXNTdWJqJHggPSBmYWN0b3Iob3JkLnJlTGFiZWxOYXNTdWJqJHgsb3JkLnJlTGFiZWxOYXNTdWJqJHgpICNhZGQgb3JkZXJlZCBmYWN0b3JzIGJhY2sNCg0KDQpvcmQucmVMYWJlbE5hc1JhdGVyIDwtIG9yZC5yZUxhYmVsTmFzUmF0ZXIgJT4lIGFycmFuZ2UoYGZ1bGxDTE1NTmFzU2xvcGUkcmFuZWZbMTo2MF1gKQ0KDQpvcmQucmVMYWJlbE5hc1JhdGVyJHggPC0gYXMudmVjdG9yKG9yZC5yZUxhYmVsTmFzUmF0ZXIkeCkgI2dldCByaWQgb2YgZmFjdG9ycw0Kb3JkLnJlTGFiZWxOYXNSYXRlciR4ID0gZmFjdG9yKG9yZC5yZUxhYmVsTmFzUmF0ZXIkeCxvcmQucmVMYWJlbE5hc1JhdGVyJHgpICNhZGQgb3JkZXJlZCBmYWN0b3JzIGJhY2sNCg0KYGBgDQoNCg0KIyMjIyMgRmlndXJlcw0KDQojIyMjIyMgU3ViamVjdHMNCg0KYGBge3J9DQpjaU5hc1N1YmogPC0gc3ViUmFuZWZOYXNTdWJqICsgcW5vcm0oMC45NzUpICogc3FydChhcy5udW1lcmljKHN1YmNvbmRWYXJOYXNTdWJqKSkgJW8lIGMoLTEsIDEpDQpvcmQucmVOYXNTdWJqIDwtIG9yZGVyKHN1YlJhbmVmTmFzU3ViaikNCmNpTmFzU3ViaiA8LSBjaU5hc1N1Ympbb3JkZXIoc3ViUmFuZWZOYXNTdWJqKSxdDQpwbG90KHN1YlJhbmVmTmFzU3VialtvcmQucmVOYXNTdWJqXSwgMTo5LCBheGVzPUZBTFNFLCB4bGltPXJhbmdlKGNpTmFzU3ViaiksDQogICAgIHhsYWI9IlN1YmplY3QgdmFyaWF0aW9uIiwgeWxhYj0iIixjZXg9MixjZXgubGFiPTIsY2V4Lm1haW49MiwNCiAgICAgbWFpbj0iQkxVUHMgU3ViamVjdCBOYXMiLGNleC5heGlzPTEuNSkNCmF4aXMoMSxjZXgubGFiPTIsY2V4LmF4aXM9MS41KQ0KYXhpcygyLGF0PTE6OSwgbGFiZWxzID0gbGV2ZWxzKG9yZC5yZUxhYmVsTmFzU3ViaiR4KSwgbGFzPTIsY2V4LmxhYj0yLGNleC5heGlzPTEuNSkNCmZvcihpIGluIDE6OSkgc2VnbWVudHMoY2lOYXNTdWJqW2ksMV0sIGksIGNpTmFzU3VialtpLCAyXSxpKQ0KYWJsaW5lKHYgPSAwLCBsdHk9MikNCmBgYA0KQXMgd2l0aCB0aGUgcmF0aW5ncyBvZiBWUSwgc29tZSBzdWJqZWN0cyB3ZXJlIHByb2R1Y2luZyBzb3VuZHMgdGhhdCB3ZXJlIGp1ZGdlZCBhcyBtb3JlIG9yIGxlc3MgbmFzYWwuIEl0IGlzIGludGVyZXN0aW5nIHRvIG5vdGUgdGhhdCBzdWJqZWN0IHAwMiB3YXMganVkZ2VkIGFzIGJlaW5nIHRoZSBvbmUgY29udHJpYnV0aW5nIHRoZSBtb3N0IHRvIHRoZSBwZXJjZXB0IG9mIG5hc2FsaXNhdGlvbiBhbmQgdG8gdGhlIHBlcmNlcHQgb2YgdGVuc2Ugdm9pY2UgcXVhbGl0eSBzZWVuIGFib3ZlOyB0aGUgc2FtZSBwYXR0ZXJuIGFwcGxpZXMgdG8gc3ViamVjdCBwMDYgd2hvIGlzIGNvbnRyaWJ1dGluZyB0aGUgbGVhc3QgdG8gdGhlIHBlcmNlcHQgb2YgbmFzYWxpc2F0aW9uIGFuZCB0ZW5zZSB2b2ljZSBxdWFsaXR5LiANCg0KIyMjIyMjIFJhdGVycw0KYGBge3J9DQoNCmNpTmFzUmF0ZXIgPC0gc3ViUmFuZWZOYXNSYXRlciArIHFub3JtKDAuOTc1KSAqIHNxcnQoYXMubnVtZXJpYyhzdWJjb25kVmFyTmFzUmF0ZXIpKSAlbyUgYygtMSwgMSkNCm9yZC5yZU5hc1JhdGVyIDwtIG9yZGVyKHN1YlJhbmVmTmFzUmF0ZXIpDQpjaU5hc1JhdGVyIDwtIGNpTmFzUmF0ZXJbb3JkZXIoc3ViUmFuZWZOYXNSYXRlciksXQ0KcGxvdChzdWJSYW5lZk5hc1JhdGVyW29yZC5yZU5hc1JhdGVyXSwgMTo2LCBheGVzPUZBTFNFLCB4bGltPXJhbmdlKGNpTmFzUmF0ZXIpLA0KICAgICB4bGFiPSJSYXRlciB2YXJpYXRpb24iLCB5bGFiPSIiLGNleD0yLGNleC5sYWI9MixjZXgubWFpbj0yLA0KICAgICBtYWluPSJCTFVQcyBSYXRlciBOYXMiLGNleC5heGlzPTEuNSkNCmF4aXMoMSxjZXgubGFiPTIsY2V4LmF4aXM9MS41KQ0KYXhpcygyLGF0PTE6NiwgbGFiZWxzID0gbGV2ZWxzKG9yZC5yZUxhYmVsTmFzUmF0ZXIkeCksIGxhcz0yLGNleC5sYWI9MixjZXguYXhpcz0xLjUpDQpmb3IoaSBpbiAxOjYpIHNlZ21lbnRzKGNpTmFzUmF0ZXJbaSwxXSwgaSwgY2lOYXNSYXRlcltpLCAyXSxpKQ0KYWJsaW5lKHYgPSAwLCBsdHk9MikNCg0KYGBgDQoNCldpdGggcmVzcGVjdCB0byByYW5kb20gZWZmZWN0cyByZWxhdGVkIHRvIHRoZSByYXRlciwgdGhlcmUgaXMgYSBjbGVhciBjbHVzdGVyaW5nIHdpdGggZm91ciByYXRlciBiZWluZyBtb3JlIGZhdm9yYWJsZSB0byByYXRpbmcgIm5hc2FsaXR5IiBtb3JlIG9mdGVuIHRoYXQgdGhlIHJlbWFpbmluZyB0d28uIFJhdGVycyBSMDEgYW5kIFIwMiAoZmlyc3QgYW5kIHNlY29uZCBhdXRob3JzLCByZXNwZWN0aXZlbHkpIGFyZSBlcXVhbGx5IHBvc3RpdmVseSBwcm92aWRpbmcgcmF0aW5ncy4gYXNzb2NpYXRlZCB3aXRoIHRoZSBwZXJjZXB0IG9mIG5hc2FsaXR5LiANCg0KIyMjIyMjIEl0ZW1zDQpgYGB7ciBmaWcud2lkdGg9OSwgZmlnLmhlaWdodD01fQ0KDQpjaU5hc1dvcmQgPC0gc3ViUmFuZWZOYXNXb3JkICsgcW5vcm0oMC45NzUpICogc3FydChhcy5udW1lcmljKHN1YmNvbmRWYXJOYXNXb3JkKSkgJW8lIGMoLTEsIDEpDQpvcmQucmVOYXNXb3JkIDwtIG9yZGVyKHN1YlJhbmVmTmFzV29yZCkNCmNpTmFzV29yZCA8LSBjaU5hc1dvcmRbb3JkZXIoc3ViUmFuZWZOYXNXb3JkKSxdDQpwYXIob21hID0gYygwLCAxLjUsIDAsIDApKQ0KcGxvdCgxOjQ1LHN1YlJhbmVmTmFzV29yZFtvcmQucmVOYXNXb3JkXSwgYXhlcz1GQUxTRSwgeWxpbT1yYW5nZShjaU5hc1dvcmQpLA0KICAgICAgIHlsYWI9Ikl0ZW0gdmFyaWF0aW9uIiwgeGxhYj0iIixjZXg9MixjZXgubGFiPTIsY2V4Lm1haW49MiwNCiAgICAgbWFpbj0iQkxVUHMgSXRlbSBOYXMiLGNleC5heGlzPTEuNSkNCmF4aXMoMixjZXgubGFiPTIsY2V4LmF4aXM9MS41KQ0KYXhpcygxLGF0PTE6NDUsIGxhYmVscyA9IGxldmVscyhvcmQucmVMYWJlbE5hc1dvcmQkeCksIGxhcz0yLGNleC5sYWI9MixjZXguYXhpcz0xLjUpDQpmb3IoaSBpbiAxOjQ1KSBzZWdtZW50cyhpLCBjaU5hc1dvcmRbaSwxXSwgaSwgY2lOYXNXb3JkW2ksIDJdKQ0KYWJsaW5lKGggPSAwLCBsdHk9MikNCmBgYA0KDQoNCiBBcyBhYm92ZSwgdmFyaW91cyBpdGVtcyB3ZXJlIHJhdGVkIGFzIG1vcmUgbmFzYWwgdGhhbiBvdGhlcnMuIFdoYXQgaXMgaW50ZXJlc3RpbmcgdG8gbm90ZSBpcyB0aGF0IGFsbCBJdGVtcyB0aGF0IHdlcmUgcmF0ZWQgYXMgbW9yZSBuYXNhbCBjb250YWluZWQgYSBbK2JhY2tdIGFuZCArW2hpZ2hdIHZvd2VscywgYW5kIHRoZSBvbmx5IHdvcmQgdGhhdCB3YXMgc2lnbmlmaWNhbnRseSByYXRlZCBhcyBub3QgY29udHJpYnV0aW5nIHRvIG5hc2FsaXR5IGlzIHRoZSBvbmUgY29udGFpbmluZyAvypUtypUvLiA=