Heirarchy of Evidence

경험과학적 자료를 분석하는 수준 (황정규(1998))

Introduction to meta-analysis

  1. 개별 연구들의 연구결과가 일관성이 있는 경우 검정력이 높아지며, 증가 표본수로 인해 정밀도 증가
  2. 개별 연구들의 연구결과가 일관성이 없는 경우 연구결과에 영향을 주는 요인들을 파악 (예: Colditz et. al (1994) BCG 백신의 효과)
  3. 새로운 연구가 필요할 때, 연구설계에 도움
  1. 개별 연구의 특성이 서로 이질적이어서 통합자체가 의미가 없는 경우
  2. 개별 연구 자체가 심각한 비뚤림(bias)을 가지고 있을 때
  3. 심각한 출판 비뚤림(publication bias)이 있는 경우 ※ 아무리 훌륭한 메타분석도 연구의 질이 낮은 개별 연구의 한계점을 극복할 수 없다는 점

Procedures of meta-analysis

  1. 연구주제를 명확히 설정
  2. 프로토콜 작성: 검색할 연구 특성(연구대상자, 결과변수 등), 검색방법, 연구들의 선정/제외기준 등 포함
  3. 프로토콜 바탕으로 메타분석을 위한 연구들을 최종 선정하고, 필요한 자료 추출하여 정리
  4. 선정된 연구들의 연구특성 및 연구방법 등을 고려하여 연구들이 동질하다고 판단이 되는 경우에 메타분석 수행함.

메타분석 방법의 선정 (출처 : Health Information and Quality Authority, 2011)

메타분석 결과해석에 포함되어야 할 사항

  1. 메타분석에 포함된 개별연구의 수와 편의의 위험이 포함된 제시된 증거
  2. 효과크기 수준 및 연구 수준의 효과에 대한 정확도에 대한 평가
  3. 메타분석에 포함된 개별연구들이 동일 모집단에서 추출된 것인지에 대한 판단을 위해 연구간 효과들의 동질성 검정
  4. 개별효과 크기들을 종합한 효과크기를 계산하면서, 추정치(point estimate)에 대한 크기와 방향, 신뢰구간, 통계적 및 실체적 유의성, 잠재적 편의 위험에 대해 해석 및 논의
  5. 조절변인분석 실시 및 해석을 실시

통계적 방법 절차

  1. 효과크기 추정: 독립된 두 그룹 또는 단일군/ 연속형 또는 이분형
  2. 통합추정치 추정: 고정효과모형/ 랜덤효과모형
  3. 이질성 검토: 통계적 이질성, 하위그룹분석, 메타회귀분석
  4. 출판 비뚤림 검토: funnel plot, Beg’s test, Egger’s test trim-and-fill 방법, fall-safe N 방법, 누적 메타분석
  5. 민감도 분석: standardized residuals, Cook’s distances, leave-one-out analyses

1. Standardized outcome measure(효과크기추정)

  • effect size (θ, 효과크기) : standardized measure of effect (such as r, Cohen’s d, or the odds ratio), or to an unstandardized measure (e.g., the difference between group means or the unstandardized regression coefficients). 출처 https://en.wikipedia.org/wiki/Effect_size

  • 효과크기에 대한 일반적인 해석기준 (Cohen(1988))
  • 작은 효과크기: 상관계수(r) 0.1, 평균차 효과크기(d) 0.2
  • 중간 효과크기: 상관계수 0.3, 평균차 효과크기 0.5
  • 큰 효과크기: 상관계수 0.5, 평균차 효과크기 0.8

  • Rate (비): a comparison between two measurements of different units (eg. 40 miles/hour)
  • Ratio(비율) : the relationship between the number, size of two or more similar things (eg. The ratio of Romy’s mangoes to Edgar’s is 3:6) 출처 http://www.differencebetween.net/science/mathematics-statistics/difference-between-rate-and-ratio/

2. Calculating overall effect(통합추정치 추정)

• 개별연구의 중요도에 따른 가중치를 이용  개별 연구의 가중치가 클수록 해당 연구가 통합추정치에 크게 기여한다. 더 정밀한 추정치를 제공한 연구 또는 표본 크기가 더 큰 연구에 더 많은 가중치 부여하는 것이 원칙 • 더 정밀한 추정치를 제공한 연구 분산의 역수이용 표본 크기가 더 큰 연구에 더 많은 가중치 부여하는 것이 원칙

1) Fixed effect model (FE, 고정효과모형):

메타분석에 포함된 연구들의 특성이 동질적일 때 이용 \(Y_i=\theta+\epsilon_i\) (i=1,…,k)

개별 연구의 가중치를 \(W_i\)라고 할 때, 통합추정치 \(\hat{\theta}\)는 가중평균으로 산출

\[\hat{\theta}=\frac{\sum_{k}^{i=1}W_iY_i}{\sum_{k}^{i=1}W_i}\] ① Inversevariance (IV, 역분산가중치) => 결과 발생이 드문 관심사건에 대한 메타분석은 bias가 생길 가능성이 높으므로, IV방법은 적합하지 않음

② Mantel-Haenszel (MH, 멘텔-헨젤)

③ Peto

2) Random effect model (RE, 랜덤효과모형):

메타분석에 포함된 연구들의 특성이 이질적일 때 이용 개별 연구들의 효과크기의 참값은 하나만 존재하는 것이 아니라 전체 평균을 중심으로 하는 정규분포를 따른다고 가정하는 모형

i번째 연구의 효과크기의 참값 \(\theta_i\)는 전체 평균 \(\mu\)를 평균으로 정규분포를 따른다고 가정.

\[Y_i = \theta_i+\epsilon_i = \mu+\zeta_i+\epsilon_i, (i=1,\cdots,k)\] \(\theta_i\)는 전체평균 \(\mu\)와 효과크기 변동을 나타내는 \(\zeta_i\)로 나타낼 수 있고, \(\epsilon_i\)는 i번째 연구 내 표본오차 \[\zeta_i \sim N(0, \tau^2)\] \[\epsilon_i \sim N(0, \sigma^2)\] \(\theta_i^2\)는 효과크기의 연구간 분산, \(\sigma^2\)은 i번째 연구의 표본오차인 \(\epsilon_i\)의 분산.

여기서 \(Var(Y_i) = \tau^2+\sigma^2\)이 되는데, RE 모형에서는 통합추정치의 분산을 최소화하기 위해 \(Var(Y_i)\)의 역수를 가중치로 이용한다.

Random effect 모형에서 사용 가능한 방법 : DerSimonian-Laird (DL), Hunter-Schmidt (HS), Hedges (HE), maximum likelihood (ML), and restricted maximum likelihood (REML) DL 방법이 많이 사용되며 결과 발생이 드문 관심사건에서 bias가 커지기 때문에 권하지 않음

-> FE or RE 의 선택은 Heterogeneity (이질성) 고려 후에 판단

3. Heterogeneity

Heterogeneity in effect sizes means the dispersion in the true effect size • Causes of heterogeneity ( Clinical, Statistical) : - Participants : condition, demographics, geographical variation, trial inclusion criteria - Interventions : type, duration, mode of administration, additional components, experience of practitioners, nature of controls - Outcomes : type, follow-up duration, ways of measuring, definition of an event - Design : randomised, non-randomised, cluster randomised, parallel vs. crossover, length - Conduct : allocation concealment, blinding, approach to analysis, imputation methods for missing data - Variation in true treatment effects in magnitude or direction

3-1. Assessing Heterogeneity : Q-statistics & \(H^2\)

코크란의 Q통계량: 개별 연구들의 효과크기가 통합추정치와 떨어져 있는 정도 \[Q=\sum_{i=1}^{k}W_i(Y_i-\hat\theta)^2=\sum_{i=1}^{k}W_iY_i^2-\frac{(\sum_{i=1}^{k}W_iY_i)^2}{\sum_{i=1}^{k}W_i}\sim\chi^2(k-1)\] 통계량이 자유도에 비해 클수록 효과크기가 통계적 이질성이 있을 가능성이 높아진다.

-> 연구수가 작거나, 연구 내 표본수가 작거나, 관심결과 발생이 드문 경우 또는 하나의 연구가 다른 연구에 비해 가중치가 많이 클 경우 power(검정력)가 낮다.

-> 유의수준은 0.05보다 0.1을 많이 사용한다.

Q 통계량을 이용하여 정의하는 \(H^2\)통계량은

\(H^2=\frac{Q}{df}\)

로 정의하고, \(H^2>1\) 일 경우 설명할 수 없는 이질성이 있다고 판단한다.

3-2. Assessing Heterogeneity : \(\tau^2\) & \(I^2\)-statistics

\(\tau^2\) 통계량: 효과크기의 연구간 변동을 나타내는 분산 \[\tau^2=\frac{Q-df}{C}\] 여기서 C는 \(C=\sum_{i=1}^{k}W_i-\frac{\sum_{i=1}^{k}W_i^2}{\sum_{i=1}^{k}W_i}\)

\(\tau^2\)값이 클수록 연구간 변동이 크다는 뜻

\(I^2\) 통계량: 통계적 이질성으로 인한 효과크기의 변동을 백분율로 나타내는 것. ->효과크기의 총 변동 중 연구간 변동의 비 \(I^2=\frac{Q-df}{Q}X100\)%

\(I^2\)=0~40%: 통계적 이질성이 중요하지 않을 수 있음 \(I^2\)=30~60%: 중간정도의 통계적 이질성이 있을 수 있음 \(I^2\)=50~90%: 상당한 통계적 이질성이 있을 수 있음 \(I^2\)=75~100%: 무시할 수 없는 통계적 이질성이 있을 수 있음

4. Publication bias

효과크기가 크고, 유의한 결과를 가지는 연구가 출판되는 경향이 높고, 연구 결과의 방향에 따라 출판여부가 달라지는 경향이 있다.

->실제 효과크기에 비해 과대 추정된 효과크기를 산출 출판비뚤림

Funnel plot: 시각적인 방법 깔대기 그림이 비대칭적인지에 대한 가설검정: Begg’s, Egger’s test 위의 방법을 통해 출판비뚤림이 있다고 판단되면, 출판 비뚤림이 연구결과에 미치는 영향을 파악할 필요 있다 trim-and-fill, fial-safe N

Funnel plot:X축은 효과를 나타내고, Y축은 표본크기를 나타내 표본수, 표준오차, 표준오차의 역수, 분산, 분산의 역수가 쓰일 수 있다. 95% Pseudo CI (=통합추정치\(\pm1.95SE\))밖에 위치한 연구수가 많을수록 이질적 이다고 할 수 있다.

Trim & Fill method

이 방법은 funnel plot에서 효과크기의 분포를 확인하는 방법으로 균등 한 분포를 보인 경우에는 출판오류가 없는 것으로 판단할 수 있다. 균등하지 못한 분포를 보인 경우에는 가상의 연구 결측값을 넣어 보정하게 되는데 보정 이후에 효과크기의 변화가 <10%이면 출판오류 가 없는 것으로 판단 (Sutton et al., 2000)

Fail-safe number (Nfs)

고정효과모형에서 확인할 수 있는 안전계수(Nfs) 산정이다. 이 방법은 종 합적 치료 효과크기가 유의하지 않은 것으로 나타나기 위해 숨겨진 연구 들이 얼마나 더 필요한지 계산하는 방법이다 (Orwin, 1983).  자명 효과(trivial effect)가 0.20, 결측연구 효과(missing study effect)가 0인 상황에서 효과크기 값을 0.20 미만으로 만들기 위해 필요한 연구 수로 확인.  안전계수는 ‘충분히 크다’라고 판단할 수 있는 기준이 일반적으로 5n+10 (n=분석에 포함된 연구의 수) 이상이어야 한다.

5. Sensitivity analysis (민감도분석)

민감도 분석이란 영향력 있는 study 혹은 outliers 를 찾아내거나, 또는 각 단계에서 행하여진 방법에 따라 통합추정치가 얼마나 바뀌는지 살펴보는 것. Standardized residuals, Cook’s distances, leave-one-out analyses등이 사용 가능함 leave-one-out analyses의 경우 study를 하나씩 빼가며 통합추정치를 구하고 이때 결과가 크게 달라지는 보는 것임

메타분석 실습

Meta-Analyses in R with the metafor Package

※ Measures

※ 함수정리 - escalc: 효과크기(yi)와 분산(vi)를 계산 - rma: 통합추정치 계산 - FE(IV방법), RE(DL방법)  RE가 default임 - rma.mh: 통합추정치 계산 (Fixed effect model Mantel-Haensze방법) - rma.peto:통합추정치 계산 (Fixed effect model Peto 방법)

getwd()
[1] "D:/Study/xwmooc_Rmeetup/Meetup_5/MetaAnalysis"
#dat<- read.table ('normand1999.csv', header=TRUE, sep=",")
#dat

[Ex1] Fixed effect model using IV-평균차 (MD)이용

MD와 MD의 분산을 계산하여 dat_MD라는 데이터셋으로 저장함

library(metafor)
Warning message:
In strsplit(code, "\n", fixed = TRUE) :
  input string 1 is invalid in this locale
#dat.normand1999: 특별치료 vs 일반치료(뇌졸증 환자대상)의 입원일수 비교, continuous outcomes: Mean Diffrence, Standarized Mean Difference
dat <- get(data(dat.normand1999))
head(dat,3)
dat <- get(data(dat.normand1999))
dat_MD <- escalc(measure="MD", m1i=m1i, sd1i=sd1i, n1i=n1i, m2i=m2i, sd2i=sd2i, n2i=n2i, data=dat)  
head(dat_MD,3)
  study             source n1i m1i sd1i n2i m2i sd2i       yi      vi
1     1          Edinburgh 155  55   47 156  75   64 -20.0000 40.5080
2     2     Orpington-Mild  31  27    7  32  29    4  -2.0000  2.0806
3     3 Orpington-Moderate  75  64   17  71 119   29 -55.0000 15.6984

MD의 IV(역분산가중치)방법 이용한 통합추정치 계산

#Normand(1999)-stroke patients
#1= specialized care
#2= routine non-specialist care
#n= no of patients
#m= avg length of hospital stay
#sd=sd of hospital stay 
res1<- rma(yi, vi, data= dat_MD, method="FE")
res1

Fixed-Effects Model (k = 9)

Test for Heterogeneity: 
Q(df = 8) = 238.9158, p-val < .0001

Model Results:

estimate      se     zval    pval    ci.lb    ci.ub     
 -3.4636  0.7648  -4.5286  <.0001  -4.9626  -1.9646  ***

---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 
summary(res1)

Fixed-Effects Model (k = 9)

   logLik   deviance        AIC        BIC       AICc  
-140.0210   238.9158   282.0421   282.2393   282.6135  

Test for Heterogeneity: 
Q(df = 8) = 238.9158, p-val < .0001

Model Results:

estimate      se     zval    pval    ci.lb    ci.ub     
 -3.4636  0.7648  -4.5286  <.0001  -4.9626  -1.9646  ***

---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 

해석: \(\hat{\theta}\)=-3.4636, \(SE\hat{\theta}\)=0.7648, 95%CI=[-4.9626, -1.9646], p-val<0.001 ->특별치료 군의 입원일수가 일반치료 군보다 3.46일 짧다고 할 수 있다.

[Ex2] Fixed effect model using IV-오즈비 (OR) 이용

#dat.bcg: Coldtiz (1994), 백신 접종군 vs 대조군 (event=결핵 발생자), binary outcomes: OR, RR, RD(Risk difference)
data(dat.bcg)     
Warning message:
In strsplit(code, "\n", fixed = TRUE) :
  input string 1 is invalid in this locale
dat_lnOR <- escalc(measure="OR", ai=tpos, bi=tneg, ci=cpos, di=cneg, data=dat.bcg)
head(dat_lnOR ,3)
  trial           author year tpos tneg cpos cneg ablat  alloc      yi     vi
1     1          Aronson 1948    4  119   11  128    44 random -0.9387 0.3571
2     2 Ferguson & Simes 1949    6  300   29  274    55 random -1.6662 0.2081
3     3  Rosenthal et al 1960    3  228   11  209    42 random -1.3863 0.4334

ln(OR)의 IV(역분산가중치)방법 이용한 통합추정치 계산

res2 <- rma(yi, vi, data= dat_lnOR, method="FE") 
res2

Fixed-Effects Model (k = 13)

Test for Heterogeneity: 
Q(df = 12) = 163.1649, p-val < .0001

Model Results:

estimate      se      zval    pval    ci.lb    ci.ub     
 -0.4361  0.0423  -10.3190  <.0001  -0.5190  -0.3533  ***

---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 

\(ln(\hat{OR})\)=-0.4361, \(SE(\hat{\theta})\)=0.0423, 95%CI=[-0.5190, -0.3533]

predict(res2, transf=exp, digits=4)
   pred  ci.lb  ci.ub
 0.6465 0.5951 0.7024

해석: predict()함수를 통해 지수 변환된 값은 \(\hat{OR}\)=exp(-0.4361)=0.6465, 95%CI for \(\hat{OR}\)=[0.5951, 0.7024]

->BCG 백순군에서 대조군에 비해 결핵발생이 35% 감소한다고 할 수 있다.

[Ex3] Fixed effect model using MH-오즈비 (OR) 이용

Mantel-Haenszel(MH)방법은 이분형 자료에서만 사용할 수 있기에, 효과크기가 위험비(RR), 오즈비(OR), 위험차(RD)인 경우에 사용할 수 있다. R 함수: rma.mhሺሻ()

res3 <- rma.mh(ai=tpos, bi=tneg, ci=cpos, di=cneg, data=dat.bcg, measure="OR") 
res3

Fixed-Effects Model (k = 13)

Test for Heterogeneity: 
Q(df = 12) = 163.9426, p-val < .0001

Model Results (log scale):

estimate      se      zval    pval    ci.lb    ci.ub
 -0.4734  0.0410  -11.5444  <.0001  -0.5538  -0.3930

Model Results (OR scale):

estimate   ci.lb   ci.ub
  0.6229  0.5748  0.6750

Cochran-Mantel-Haenszel Test:    CMH = 135.6889, df = 1,  p-val < 0.0001
Tarone's Test for Heterogeneity: X^2 = 171.7567, df = 12, p-val < 0.0001

함수 rma.mh는 ln\(\hat{OR}\)\(\hat{OR}\) 각각의 결과를 보여줌

① ln\(\hat{OR}\)=-0.4763, SE(ln\(\hat{OR}\))=0.0410, 95%CI for ln\(\hat{OR}\)ሻ=[-0.5538,-0.3930] ② \(\hat{OR}\)=0.6229, 95%CI for \(\hat{OR}\)=[0.5748, 0.6750] ③ CMH검정: 모든 개별연구의 OR가 1인지 검정  p-val<0.001이므로 모든 개별연구의 OR가 1로 동일하다고 할 수 없다.

[Ex4] Fixed effect model using MH-위험비 (RR) 이용

res4 <- rma.mh(ai=tpos, bi=tneg, ci=cpos, di=cneg, data=dat.bcg, measure="RR") 
res4

Fixed-Effects Model (k = 13)

Test for Heterogeneity: 
Q(df = 12) = 152.5676, p-val < .0001

Model Results (log scale):

estimate      se      zval    pval    ci.lb    ci.ub
 -0.4537  0.0393  -11.5338  <.0001  -0.5308  -0.3766

Model Results (RR scale):

estimate   ci.lb   ci.ub
  0.6353  0.5881  0.6862

Mantel-Haenszel(MH)방법에 의한 로그 위험비의 통합추정치는 다음과 같다.

\(ln\hat{RR}\)==-0.4537, \(SE(ln\hat{RR})\)=0.0393, 95%CI for \(ln\hat{RR}\)=[-0.5308,-0.3766]  p-val<0.001이므로 BCG백신군과 대조군간에 결핵발생이 다르다고 할 수 있다.

\(hat{RR}\)=0.6353, 95%CI for ܴ\(hat{RR}\)=[0.5881, 0.6862] ->대조군에 비해 BCG백신군에서 결핵발생이 36.5% 감소한다고 할 수 있다.

[Ex5] Fixed effect model using MH-위험차 (RD) 이용

res5<- rma.mh(ai=tpos, bi=tneg, ci=cpos, di=cneg, data=dat.bcg, measure="RD") 
res5

Fixed-Effects Model (k = 13)

Test for Heterogeneity: 
Q(df = 12) = 386.7759, p-val < .0001

Model Results:

estimate      se      zval    pval    ci.lb    ci.ub
 -0.0033  0.0003  -11.4708  <.0001  -0.0039  -0.0027

Mantel-Haenszel(MH)방법에 의한 위험차의 통합추정치는 다음과 같다.

\(\hat{RD}\)=0.0033, 95%CI for \(hat{RD}\)=[-0.0039, -0.0027] ->p-val<0.001이므로 위험차가 0이라는 귀무가설을 기각함. 즉, BCG백신 군과 대조군 간에 결핵발생이 다르다고 할 수 있고, 대조 군에 비해 BCG백신 군에서 결핵발생이 0.33% 낮다고 할 수 있다.

[Ex6] Fixed effect model using Peto -오즈비 (OR) 이용

Peto 방법은 오즈비의 통합에만 사용할 수 있다.

R 함수: rma.petoሺ ()

res6<- rma.peto(ai=tpos, bi=tneg, ci=cpos, di=cneg, data=dat.bcg) 
res6

Fixed-Effects Model (k = 13)

Test for Heterogeneity: 
Q(df = 12) = 167.7302, p-val < .0001

Model Results (log scale):

estimate      se      zval    pval    ci.lb    ci.ub
 -0.4744  0.0407  -11.6689  <.0001  -0.5541  -0.3948

Model Results (OR scale):

estimate   ci.lb   ci.ub
  0.6222  0.5746  0.6738

함수 rma.peto는 ln\(\hat{OR}\)\(\hat{OR}\) 각각의 결과를 보여줌

① ln\(\hat{OR}\)=-0.4744, SE(ln\(\hat{OR}\))=0.0407, 95%CI for ln\(\hat{OR}\)ሻ=[-0.5541, -0.3948]

->p-val<0.001이므로 BCG백신 군과 대조 군간에 결핵발생이 다르다고 할 수 있다.

\(\hat{OR}\)=0.6222, 95%CI for \(\hat{OR}\)=[0.5746, 0.6738]

->대조 군의 결핵발생에 대한 OR에 비해 BCG백신 군의 결핵발생에 대한 OR가 0.62배라고 할 수 있다.

[Ex7] Random effect model using DL-평균차 (MD)이용

MD와 MD의 분산 계산

dat_MD <- escalc(measure="MD", m1i=m1i, sd1i=sd1i, n1i=n1i, m2i=m2i, sd2i=sd2i, n2i=n2i, data=dat)

MD의 DerSimonian-Laird 방법 통합추정치 계산

res7<- rma(yi, vi, data= dat_MD, method="DL") 
res7

Random-Effects Model (k = 9; tau^2 estimator: DL)

tau^2 (estimated amount of total heterogeneity): 205.4094 (SE = 179.7183)
tau (square root of estimated tau^2 value):      14.3321
I^2 (total heterogeneity / total variability):   96.65%
H^2 (total variability / sampling variability):  29.86

Test for Heterogeneity: 
Q(df = 8) = 238.9158, p-val < .0001

Model Results:

estimate      se     zval    pval     ci.lb    ci.ub    
-13.9817  5.1267  -2.7272  0.0064  -24.0299  -3.9336  **

---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 

① DL방법으로 추정된 연구간 분산 \(\hat\tau^2=205.4094\)

② Q의 유의확률이 p‐val<0.0001로 개별연구들의 효과크기가 상당히 이질적임. Random effect model로 통합추정치를 구하는 것이 적절함

\(\hat{MD}=-13.9817, SE(\hat{MD})=5.1267, p-val=0.0064,95%CI=[-24.0299, -3.9339]\)

-> 특별치료 군의 입원일수가 일반치료 군의 것보다 13.98일 짧다고 할 수 있다.

[Ex8] Random effect model using DL-오즈비 (OR) 이용

ln(OR)의 DerSimonian-Laird 방법 통합추정치 계산

#dat_lnOR <- escalc(measure="OR", ai=tpos, bi=tneg, ci=cpos, di=cneg, data=dat.bcg)     
res8<- rma(yi, vi, data= dat_lnOR, method="DL") 
res8

Random-Effects Model (k = 13; tau^2 estimator: DL)

tau^2 (estimated amount of total heterogeneity): 0.3663 (SE = 0.2659)
tau (square root of estimated tau^2 value):      0.6053
I^2 (total heterogeneity / total variability):   92.65%
H^2 (total variability / sampling variability):  13.60

Test for Heterogeneity: 
Q(df = 12) = 163.1649, p-val < .0001

Model Results:

estimate      se     zval    pval    ci.lb    ci.ub     
 -0.7474  0.1923  -3.8873  0.0001  -1.1242  -0.3706  ***

---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 

① DL방법으로 추정된 연구간 분산 \(\hat\tau^2=20.3663\)

② Q의 유의확률이 p‐val<0.0001로 개별연구들의 효과크기가 상당히 이질적임. ->Random effect model로 통합추정치를 구하는 것이 적절함

\(ln(\hat{MD})=-13.9817, SE(ln(\hat{MD}))=5.1267, p-val=0.0001,95%CI=[-1.1242,-0.3706]\)

->\(\hat{MD}=exp(-13.9817)=0.4736, 95%CI for \hat{OR}=[0.3249, 0.6903]\)

대조 군에 비해 BCG 백신 군에서 결핵발생이 53% 감소한다고 할 수 있다.

[Ex9] Heterogeneity : Forest plot

res_RE <- rma(yi, vi, data= dat_lnOR, method="DL")
forest(res_RE, xlim=c(-16, 10), at=log(c(.05, .25, 1, 4)), atransf=exp, 
       ilab=cbind(dat.bcg$tpos, dat.bcg$tneg, dat.bcg$cpos, dat.bcg$cneg), 
       ilab.xpos=c(-9.5,-8,-6,-4.5), cex=.75, showweight=TRUE)
text(c(-9.5,-8,-6,-4.5), 15, c("TB+", "TB-", "TB+", "TB-"), cex=0.75)
text(c(-8.75,-5.25), 16, c("Vaccinated", "Control"), cex=0.75)
text(5, 15, "Weights", pos=2, cex=0.75)
text(9, 15, "OR[95% CI]", pos=2, cex=0.75)

[Ex10] Heterogeneity : Q-statistics & H^2

res <- rma(ai=tpos, bi=tneg, ci=cpos, di=cneg, data=dat.bcg, measure="OR", method="DL")   
# Q-value
res$QE
[1] 163.1649
res$QEp
[1] 1.188773e-28
summary(res)

Random-Effects Model (k = 13; tau^2 estimator: DL)

  logLik  deviance       AIC       BIC      AICc  
-13.1398   37.3865   30.2795   31.4094   31.4795  

tau^2 (estimated amount of total heterogeneity): 0.3663 (SE = 0.2659)
tau (square root of estimated tau^2 value):      0.6053
I^2 (total heterogeneity / total variability):   92.65%
H^2 (total variability / sampling variability):  13.60

Test for Heterogeneity: 
Q(df = 12) = 163.1649, p-val < .0001

Model Results:

estimate      se     zval    pval    ci.lb    ci.ub     
 -0.7474  0.1923  -3.8873  0.0001  -1.1242  -0.3706  ***

---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 
names(res)
 [1] "b"         "beta"      "se"        "zval"      "pval"      "ci.lb"     "ci.ub"     "vb"        "tau2"     
[10] "se.tau2"   "tau2.fix"  "k"         "k.f"       "k.eff"     "p"         "p.eff"     "parms"     "m"        
[19] "QE"        "QEp"       "QM"        "QMp"       "I2"        "H2"        "R2"        "int.only"  "int.incl" 
[28] "allvipos"  "coef.na"   "yi"        "vi"        "X"         "weights"   "yi.f"      "vi.f"      "X.f"      
[37] "weights.f" "M"         "ai.f"      "bi.f"      "ci.f"      "di.f"      "x1i.f"     "x2i.f"     "t1i.f"    
[46] "t2i.f"     "ni"        "ni.f"      "ids"       "not.na"    "subset"    "slab"      "slab.null" "measure"  
[55] "method"    "weighted"  "test"      "dfs"       "s2w"       "btt"       "intercept" "digits"    "level"    
[64] "control"   "verbose"   "add"       "to"        "drop00"    "fit.stats" "version"   "model"     "call"     

[Ex11] Heterogeneity : tau^2 and I^2 statistics

res$I2
[1] 92.64548
res$tau2
[1] 0.3663434
confint(res) # confidence intervals

       estimate   ci.lb   ci.ub
tau^2    0.3663  0.1302  1.1812
tau      0.6053  0.3608  1.0868
I^2(%)  92.6455 81.7376 97.5971
H^2     13.5971  5.4757 41.6164

\(I^2\) 통계량=92.6455, 95%CI=[81.74%, 97.60%]이므로 무시할 수 없는 통계적 이질성이 있다고 할 수 있다. ※ 이질성 판단여부는 효과크기의 방향과 크기, Q 통계량을 이용한 가설검정 결과, \(I^2\) 통계량의 신뢰구간 등을 함께 고려해야 한다.

[Ex12] Subgroup analysis

개별 연구들간 효과크기의 이질성의 원인을 파악하기 위하여, 전체 대상 연구들을 동질적 이라 예상되는 하위그룹으로 구분하여 메타분석을 하위 그룹별로 각각 실시한다

# Total and subgroups
res   <- rma(ai=tpos, bi=tneg, ci=cpos, di=cneg, data=dat.bcg, measure="RR", slab=paste(author, year, sep=", "), method="DL") 
res.s <- rma(ai=tpos, bi=tneg, ci=cpos, di=cneg, data=dat.bcg, measure="RR", subset=(alloc=="systematic"), method="DL")   
res.r <- rma(ai=tpos, bi=tneg, ci=cpos, di=cneg, data=dat.bcg, measure="RR", subset=(alloc=="random"), method="DL")  
res.a <- rma(ai=tpos, bi=tneg, ci=cpos, di=cneg, data=dat.bcg, measure="RR", subset=(alloc=="alternate"), method="DL")  
forest(res, xlim=c(-16, 6), at=log(c(.05, .25, 1, 4)), atransf=exp, 
       ilab=cbind(dat.bcg$tpos, dat.bcg$tneg, dat.bcg$cpos, dat.bcg$cneg), 
       ilab.xpos=c(-9.5,-8,-6,-4.5), cex=.75, ylim=c(-1,27),  order=order(dat.bcg$alloc), 
       rows=c(3:4, 9:15, 20:23),   xlab="Relative Risk", mlab="RE Model for All studies")
text(-16, c(24, 16, 5), pos=4, c("Systematic Allocation","Random Allocation", "Alternate Allocation"), cex=.75, font=4)
text(c(-9.5,-8,-6,-4.5), 26, c("TB+", "TB-", "TB+", "TB-"), cex=0.75)
text(c(-8.75,-5.25), 27, c("Vaccinated", "Control"), cex=0.75)
text(-16,            26, "Author(s) and Year", pos=4, cex=0.75)
text(6,              26, "Relative Risk [95% CI]", pos=2, cex=0.75)
# Add polygons to forest plosts for subgroup
addpoly(res.s, row=18.5, cex=.75, atransf=exp, mlab="RE Model for Subgroup")
addpoly(res.r, row=7.5, cex=.75, atransf=exp, mlab="RE Model for Subgroup")
addpoly(res.a, row=1.5, cex=.75, atransf=exp, mlab="RE Model for Subgroup")

res.s

Random-Effects Model (k = 4; tau^2 estimator: DL)

tau^2 (estimated amount of total heterogeneity): 0.2850 (SE = 0.3334)
tau (square root of estimated tau^2 value):      0.5338
I^2 (total heterogeneity / total variability):   81.92%
H^2 (total variability / sampling variability):  5.53

Test for Heterogeneity: 
Q(df = 3) = 16.5919, p-val = 0.0009

Model Results:

estimate      se     zval    pval    ci.lb   ci.ub   
 -0.4393  0.3133  -1.4021  0.1609  -1.0535  0.1748   

---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 
res.r

Random-Effects Model (k = 7; tau^2 estimator: DL)

tau^2 (estimated amount of total heterogeneity): 0.7631 (SE = 0.7774)
tau (square root of estimated tau^2 value):      0.8735
I^2 (total heterogeneity / total variability):   94.56%
H^2 (total variability / sampling variability):  18.37

Test for Heterogeneity: 
Q(df = 6) = 110.2133, p-val < .0001

Model Results:

estimate      se     zval    pval    ci.lb    ci.ub    
 -1.0042  0.3621  -2.7731  0.0056  -1.7139  -0.2944  **

---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 
res.a

Random-Effects Model (k = 2; tau^2 estimator: DL)

tau^2 (estimated amount of total heterogeneity): 0.1326 (SE = 0.2286)
tau (square root of estimated tau^2 value):      0.3641
I^2 (total heterogeneity / total variability):   82.02%
H^2 (total variability / sampling variability):  5.56

Test for Heterogeneity: 
Q(df = 1) = 5.5625, p-val = 0.0183

Model Results:

estimate      se     zval    pval    ci.lb   ci.ub   
 -0.5408  0.2816  -1.9204  0.0548  -1.0927  0.0111  .

---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 

[Ex13] Publication bias : Funnel plot

dat <- get(data(dat.hackshaw1998))
res <- rma(yi, vi, data=dat, measure="OR", method="FE")
par(mfrow=c(1,3))
funnel(res, atransf=exp, xlab="Odds Ratio", at=log(c(.25, .5, 1, 2, 4)))
# contour-enhanced funnel plot centered at 0
funnel(res, level=c(90, 95, 99), shade=c("white","gray","darkgray"), 
       refline=0, atransf=exp, xlab="Odds Ratio", at=log(c(.25, .5, 1, 2, 4)))
# contour-enhanced funnel plot : Y-axis=inverse of the standard error
funnel(res, level=c(90, 95, 99), shade=c("white","gray","darkgray"), 
       refline=0, atransf=exp, xlab="Odds Ratio", at=log(c(.25, .5, 1, 2, 4)), yaxis="seinv")

X축은 effect size, Y축은 표본크기(표본수, SE, 분산 등)를 나타내고, 출판삐뚤림이 없으면 표본크기가 작은 연구들은 아래쪽에 골고루, 표본크기가 큰 연구들은 윗쪽에 집중적으로 보임.

첫번째 그림에서 좌측 하단 연구들이 없음->표본크기 작고, 효과크기가 1보다 작은 연구들은 포함되어있지 않으므로, 출판삐뚤림이 의심됨

[Ex14] Publication bias : Begg’s test, Egger’s test

# Begg’s test
ranktest(res) 

Rank Correlation Test for Funnel Plot Asymmetry

Kendall's tau = 0.1441, p = 0.2157
Warning message:
In strsplit(code, "\n", fixed = TRUE) :
  input string 1 is invalid in this locale

p-value=0.2157 -> 출판 비뚤림이 있다고 할 수 없다

# Egger’s test 
regtest(res)

Regression Test for Funnel Plot Asymmetry

model:     fixed-effects meta-regression model
predictor: standard error

test for funnel plot asymmetry: z = 2.5759, p = 0.0100
Warning message:
In strsplit(code, "\n", fixed = TRUE) :
  input string 1 is invalid in this locale

p-value=0.0100 -> 출판 비뚤림이 있다고 할 수 없다

※ Begg, Egger 방법은 메타 분석에 포함된 연구수가 10개보다 작거나, 심각한 출판 비뚤림이 없는 경우 검정력이 낮다. 회귀분석 방법을 이용한 Egger방법이 Begg에 비해 검정력이 다소 높다.

[Ex15] Publication bias : Trim-and-fill, Fail-safe N

res <- rma(yi, vi, data=dat, method="FE")
res.tf <- trimfill(res)
res.tf

Estimated number of missing studies on the left side: 7 (SE = 4.0407)

Fixed-Effects Model (k = 44)

Test for Heterogeneity: 
Q(df = 43) = 61.8712, p-val = 0.0310

Model Results:

estimate      se    zval    pval   ci.lb   ci.ub     
  0.1555  0.0364  4.2706  <.0001  0.0842  0.2269  ***

---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 

Trim-and-fill결과:원래 통합추정치는 0.1857, 수정된 통합추정치는 0.1555

funnel(res.tf, atransf=exp, xlab="Odds Ratio", at=log(c(.25, .5, 1, 2, 4)))

fsn(yi, vi, data=dat, type="Rosenthal")

Fail-safe N Calculation Using the Rosenthal Approach 

Observed Significance Level: <.0001 
Target Significance Level:   0.05 

Fail-safe N: 393 

Fail-safe N 결과: 5k+10보다 크면 전체 효과크기에 미치는 영향이 크지 않다고 한다. Fail-safe N은 393으로 5*37+10=195 보다 크므로 전체 효과 크기가 출판 비뚤림에 영향을 받는다고 할 수 없다.

[Ex16] Cumulative meta-analysis (i.e., adding one obervation at a time)

res <- rma(yi, vi, data=dat, method="FE", slab=paste(author, year, sep=","))
# By the size of case 
cumul_case <- cumul(res, order=order(dat$cases, decreasing = TRUE))
forest(cumul_case, at=log(c(.75, 1, 2)), atransf=exp, cex=0.75, xlab="Odds Ratio")
text(c(-0.6,0.85), 40, c("Study", "OR [95% CI]"), cex=0.75)

# By published year (from new to old)
cumul_year <- cumul(res, order=order(dat$year, decreasing = TRUE))
forest(cumul_year, at=log(c(.75, 1, 2)), atransf=exp, cex=0.75, xlab="Odds Ratio")
text(c(-0.6,0.85), 40, c("Study", "OR [95% CI]"), cex=0.75)

[Ex17] Sensitivity analysis

### calculate log relative risks and corresponding sampling variances
dat <- escalc(measure="RR", ai=tpos, bi=tneg, ci=cpos, di=cneg, data=dat.bcg)  
Warning message:
In strsplit(code, "\n", fixed = TRUE) :
  input string 1 is invalid in this locale
res <- rma(yi, vi, data=dat)  # deault는 random effect
leave1out(res); LO1<- leave1out(res, transf=exp);
   estimate     se    zval   pval   ci.lb   ci.ub        Q     Qp   tau2      I2      H2
1   -0.7071 0.1900 -3.7223 0.0002 -1.0794 -0.3348 151.5826 0.0000 0.3362 93.2259 14.7622
2   -0.6540 0.1807 -3.6195 0.0003 -1.0082 -0.2999 145.3176 0.0000 0.2926 92.2540 12.9098
3   -0.6856 0.1857 -3.6916 0.0002 -1.0495 -0.3216 150.1970 0.0000 0.3207 92.9354 14.1551
4   -0.6284 0.1766 -3.5580 0.0004 -0.9746 -0.2822  96.5626 0.0000 0.2628 90.4125 10.4302
5   -0.7642 0.1918 -3.9845 0.0001 -1.1401 -0.3883 151.3200 0.0000 0.3278 92.7634 13.8187
6   -0.7109 0.2003 -3.5499 0.0004 -1.1034 -0.3184 128.1867 0.0000 0.3596 90.9118 11.0033
7   -0.6552 0.1805 -3.6307 0.0003 -1.0090 -0.3015 145.8296 0.0000 0.2930 92.2777 12.9495
8   -0.7948 0.1799 -4.4184 0.0000 -1.1473 -0.4422  67.9858 0.0000 0.2732 87.0314  7.7109
9   -0.7412 0.1967 -3.7686 0.0002 -1.1267 -0.3557 152.2051 0.0000 0.3495 93.2133 14.7346
10  -0.6530 0.1843 -3.5439 0.0004 -1.0142 -0.2919 139.8271 0.0000 0.2987 92.2322 12.8737
11  -0.7579 0.1958 -3.8708 0.0001 -1.1416 -0.3741 151.4655 0.0000 0.3405 91.8110 12.2114
12  -0.7598 0.1821 -4.1727 0.0000 -1.1167 -0.4029 150.7868 0.0000 0.3082 92.6782 13.6579
13  -0.7775 0.1855 -4.1908 0.0000 -1.1412 -0.4139 149.7884 0.0000 0.3037 92.3444 13.0623
### meta-analysis of the (log) relative risks using the Mantel-Haenszel method
res <- rma.mh(measure="RR", ai=tpos, bi=tneg, ci=cpos, di=cneg, data=dat.bcg)
leave1out(res);LO2<- leave1out(res, transf=exp);
   estimate     se     zval   pval   ci.lb   ci.ub        Q     Qp
1   -0.4514 0.0394 -11.4462 0.0000 -0.5287 -0.3741 151.9153 0.0000
2   -0.4410 0.0395 -11.1512 0.0000 -0.5185 -0.3635 145.5727 0.0000
3   -0.4495 0.0394 -11.4001 0.0000 -0.5267 -0.3722 150.5130 0.0000
4   -0.3392 0.0414  -8.1874 0.0000 -0.4205 -0.2580  96.5629 0.0000
5   -0.4614 0.0400 -11.5474 0.0000 -0.5397 -0.3831 151.6611 0.0000
6   -0.3666 0.0448  -8.1809 0.0000 -0.4544 -0.2788 129.2200 0.0000
7   -0.4466 0.0395 -11.3046 0.0000 -0.5241 -0.3692 146.2134 0.0000
8   -0.7758 0.0520 -14.9267 0.0000 -0.8777 -0.6739  68.3763 0.0000
9   -0.4532 0.0399 -11.3633 0.0000 -0.5314 -0.3751 152.5497 0.0000
10  -0.4278 0.0399 -10.7338 0.0000 -0.5059 -0.3497 140.0446 0.0000
11  -0.4698 0.0421 -11.1706 0.0000 -0.5522 -0.3874 151.8140 0.0000
12  -0.4566 0.0394 -11.5865 0.0000 -0.5338 -0.3794 151.1253 0.0000
13  -0.4637 0.0398 -11.6542 0.0000 -0.5417 -0.3858 150.1246 0.0000
In strsplit(code, "\n", fixed = TRUE) :
  input string 1 is invalid in this locale
leave1out(res);LO3<- leave1out(res, transf=exp);
   estimate     se     zval   pval   ci.lb   ci.ub        Q     Qp
1   -0.4722 0.0408 -11.5791 0.0000 -0.5521 -0.3923 167.2005 0.0000
2   -0.4616 0.0409 -11.2751 0.0000 -0.5418 -0.3814 160.5154 0.0000
3   -0.4702 0.0408 -11.5317 0.0000 -0.5501 -0.3903 165.7913 0.0000
4   -0.3591 0.0435  -8.2533 0.0000 -0.4443 -0.2738 112.1274 0.0000
5   -0.4832 0.0413 -11.6873 0.0000 -0.5642 -0.4021 166.3727 0.0000
6   -0.3710 0.0451  -8.2328 0.0000 -0.4593 -0.2827 139.3918 0.0000
7   -0.4660 0.0408 -11.4343 0.0000 -0.5459 -0.3861 158.6048 0.0000
8   -0.8161 0.0531 -15.3842 0.0000 -0.9201 -0.7122  67.1837 0.0000
9   -0.4747 0.0413 -11.4973 0.0000 -0.5557 -0.3938 167.7284 0.0000
10  -0.4486 0.0413 -10.8488 0.0000 -0.5296 -0.3675 155.8992 0.0000
11  -0.4911 0.0434 -11.3135 0.0000 -0.5762 -0.4060 166.5326 0.0000
12  -0.4775 0.0407 -11.7236 0.0000 -0.5573 -0.3976 166.0703 0.0000
13  -0.4853 0.0411 -11.7960 0.0000 -0.5659 -0.4046 164.7427 0.0000
LO1;LO2;LO3
   estimate    zval   pval  ci.lb  ci.ub        Q     Qp   tau2      I2      H2
1    0.4931 -3.7223 0.0002 0.3398 0.7155 151.5826 0.0000 0.3362 93.2259 14.7622
2    0.5199 -3.6195 0.0003 0.3649 0.7409 145.3176 0.0000 0.2926 92.2540 12.9098
3    0.5038 -3.6916 0.0002 0.3501 0.7250 150.1970 0.0000 0.3207 92.9354 14.1551
4    0.5334 -3.5580 0.0004 0.3774 0.7541  96.5626 0.0000 0.2628 90.4125 10.4302
5    0.4657 -3.9845 0.0001 0.3198 0.6782 151.3200 0.0000 0.3278 92.7634 13.8187
6    0.4912 -3.5499 0.0004 0.3318 0.7273 128.1867 0.0000 0.3596 90.9118 11.0033
7    0.5193 -3.6307 0.0003 0.3646 0.7397 145.8296 0.0000 0.2930 92.2777 12.9495
8    0.4517 -4.4184 0.0000 0.3175 0.6426  67.9858 0.0000 0.2732 87.0314  7.7109
9    0.4765 -3.7686 0.0002 0.3241 0.7007 152.2051 0.0000 0.3495 93.2133 14.7346
10   0.5205 -3.5439 0.0004 0.3627 0.7469 139.8271 0.0000 0.2987 92.2322 12.8737
11   0.4687 -3.8708 0.0001 0.3193 0.6879 151.4655 0.0000 0.3405 91.8110 12.2114
12   0.4678 -4.1727 0.0000 0.3274 0.6684 150.7868 0.0000 0.3082 92.6782 13.6579
13   0.4595 -4.1908 0.0000 0.3194 0.6611 149.7884 0.0000 0.3037 92.3444 13.0623
   estimate     zval   pval  ci.lb  ci.ub        Q     Qp
1    0.6367 -11.4462 0.0000 0.5894 0.6879 151.9153 0.0000
2    0.6434 -11.1512 0.0000 0.5954 0.6952 145.5727 0.0000
3    0.6380 -11.4001 0.0000 0.5905 0.6892 150.5130 0.0000
4    0.7123  -8.1874 0.0000 0.6568 0.7726  96.5629 0.0000
5    0.6304 -11.5474 0.0000 0.5829 0.6818 151.6611 0.0000
6    0.6931  -8.1809 0.0000 0.6348 0.7567 129.2200 0.0000
7    0.6398 -11.3046 0.0000 0.5921 0.6913 146.2134 0.0000
8    0.4603 -14.9267 0.0000 0.4158 0.5097  68.3763 0.0000
9    0.6356 -11.3633 0.0000 0.5878 0.6872 152.5497 0.0000
10   0.6520 -10.7338 0.0000 0.6030 0.7049 140.0446 0.0000
11   0.6251 -11.1706 0.0000 0.5757 0.6788 151.8140 0.0000
12   0.6334 -11.5865 0.0000 0.5864 0.6843 151.1253 0.0000
13   0.6289 -11.6542 0.0000 0.5817 0.6799 150.1246 0.0000
   estimate     zval   pval  ci.lb  ci.ub        Q     Qp
1    0.6236 -11.5791 0.0000 0.5757 0.6755 167.2005 0.0000
2    0.6303 -11.2751 0.0000 0.5817 0.6829 160.5154 0.0000
3    0.6249 -11.5317 0.0000 0.5769 0.6769 165.7913 0.0000
4    0.6983  -8.2533 0.0000 0.6413 0.7605 112.1274 0.0000
5    0.6168 -11.6873 0.0000 0.5688 0.6689 166.3727 0.0000
6    0.6900  -8.2328 0.0000 0.6317 0.7538 139.3918 0.0000
7    0.6275 -11.4343 0.0000 0.5793 0.6797 158.6048 0.0000
8    0.4421 -15.3842 0.0000 0.3985 0.4906  67.1837 0.0000
9    0.6220 -11.4973 0.0000 0.5737 0.6745 167.7284 0.0000
10   0.6385 -10.8488 0.0000 0.5888 0.6924 155.8992 0.0000
11   0.6120 -11.3135 0.0000 0.5621 0.6663 166.5326 0.0000
12   0.6204 -11.7236 0.0000 0.5728 0.6719 166.0703 0.0000
13   0.6155 -11.7960 0.0000 0.5679 0.6672 164.7427 0.0000

[Ex18] IRR 기준으로 hart1999 데이터 메타 분석 및 시각화

#dat.hart1999: 와파린 군 vs 대조군 (심방세동 환자대상)의 뇌졸증 발생수, events counts: Log Incidence Rate ratio(IRR), Incidence Rate Difference(IRD), squre-root transformed incidence rate difference(IRSD)
dat <- get(data(dat.hart1999))
Warning message:
In strsplit(code, "\n", fixed = TRUE) :
  input string 1 is invalid in this locale
### calculate log incidence rate ratios and corresponding sampling variances
dat <- escalc(measure="IRR", x1i=x1i, x2i=x2i, t1i=t1i, t2i=t2i, data=dat)
dat
  trial  study year x1i n1i t1i x2i n2i t2i compgrp  prevtype   trinr      yi     vi
1     1 AFASAK 1989   9 335 413  19 336 398 placebo   primary 2.8-4.2 -0.7842 0.1637
2     2   SPAF 1991   8 210 263  19 211 245 placebo   primary 2.0-4.5 -0.9359 0.1776
3     3 BAATAF 1990   3 212 487  13 208 435 control   primary 1.5-2.7 -1.5793 0.4103
4     4   CAFA 1991   6 187 237   9 191 241 placebo   primary 2.0-3.0 -0.3887 0.2778
5     5 SPINAF 1992   7 281 489  23 290 483 placebo   primary 1.4-2.8 -1.2019 0.1863
6     6   EAFT 1993  20 225 507  50 214 405 placebo secondary 2.5-4.0 -1.1409 0.0700
### meta-analysis of log incidence rate ratios using a random-effects model
res <- rma(yi, vi, data=dat)
res

Random-Effects Model (k = 6; tau^2 estimator: REML)

tau^2 (estimated amount of total heterogeneity): 0 (SE = 0.0987)
tau (square root of estimated tau^2 value):      0
I^2 (total heterogeneity / total variability):   0.00%
H^2 (total variability / sampling variability):  1.00

Test for Heterogeneity: 
Q(df = 5) = 2.9625, p-val = 0.7058

Model Results:

estimate      se     zval    pval    ci.lb    ci.ub     
 -1.0168  0.1635  -6.2206  <.0001  -1.3372  -0.6964  ***

---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 
### average incidence rate ratio with 95% CI
predict(res, transf=exp)
   pred  ci.lb  ci.ub  cr.lb  cr.ub
 0.3617 0.2626 0.4984 0.2626 0.4984
### forest plot with extra annotations
par(mar=c(5,4,1,2))
forest(res, xlim=c(-11, 5), at=log(c(.05, .25, 1, 4)), atransf=exp,
       slab=paste0(dat$study, " (", dat$year, ")"),
       ilab=cbind(paste(dat$x1i, "/", dat$t1i, sep=" "),
                  paste(dat$x2i, "/", dat$t2i, sep=" ")),
       ilab.xpos=c(-6.5,-4), cex=.85)
op <- par(cex=.85, font=2)
text(-11, 7.5, "Study (Year)", pos=4)
text( 5, 7.5, "IRR [95% CI]", pos=2)
text(c(-6.5,-4), 8.0, c("Warfarin", "Control"))
text(c(-6.5,-4), 7.5, c("Strokes / PT", "Strokes / PT"))
segments(x0=-7.75, y0=7.75, x1=-2.75, y1=7.75)
par(op)

### meta-analysis of incidence rate differences using a random-effects model
res <- rma(measure="IRD", x1i=x1i, x2i=x2i, t1i=t1i, t2i=t2i, data=dat)

[Ex19] RR 기준으로 hart1999 데이터 메타 분석 및 시각화

res <- rma(measure="RR", ai=tpos, bi=tneg, ci=cpos, di=cneg, mods = ~ ablat,
           slab=paste(author, year, sep=", "), data=dat.bcg)
### forest plot of the observed relative risks
forest(res, addfit=FALSE, atransf=exp, xlim=c(-8,5), ylim=c(-4.5,16), cex=.8,
       order=order(dat.bcg$ablat), ilab=dat.bcg$ablat, ilab.xpos=-2.8, ilab.pos=2)
### predicted average log relative risk for 10, 30, and 50 degrees absolute latitude
x <- predict(res, newmods=c(10, 30, 50))
### add predicted average relative risks to forest plot
addpoly(x$pred, sei=x$se, atransf=exp, col="white", rows=-2,
        mlab=c("- at 10 Degrees", "- at 30 Degrees", "- at 50 Degrees"), cex=.8)
abline(h=0)
text(-8, -1, "Model-Based Estimates of RR:", pos=4, cex=.8)
text(-8, 15, "Author(s) and Year", pos=4, cex=.8)
text(5, 15, "Relative Risk [95% CI]", pos=2, cex=.8)
text(-3.3, 15, "Latitude", cex=.8)

### forest plot of the observed relative risks
jpeg('myplot.jpeg')
forest(res, addfit=FALSE, atransf=exp, xlim=c(-8,5), ylim=c(-4.5,16), cex=.8,
       order=order(dat.bcg$ablat), ilab=dat.bcg$ablat, ilab.xpos=-2.8, ilab.pos=2)
### predicted average log relative risk for 10, 30, and 50 degrees absolute latitude
x <- predict(res, newmods=c(10, 30, 50))
### add predicted average relative risks to forest plot
addpoly(x$pred, sei=x$se, atransf=exp, col="white", rows=-2,
        mlab=c("- at 10 Degrees", "- at 30 Degrees", "- at 50 Degrees"), cex=.8)
abline(h=0)
text(-8, -1, "Model-Based Estimates of RR:", pos=4, cex=.8)
text(-8, 15, "Author(s) and Year", pos=4, cex=.8)
text(5, 15, "Relative Risk [95% CI]", pos=2, cex=.8)
text(-3.3, 15, "Latitude", cex=.8)
dev.off()
null device 
          1 

[Ex20] ZCOR 기준으로 molloy2014 데이터 메타 분석 및 시각화

Warning message:
In strsplit(code, "\n", fixed = TRUE) :
  input string 1 is invalid in this locale
### calculate r-to-z transformed correlations and corresponding sampling variances
dat <- escalc(measure="ZCOR", ri=ri, ni=ni, data=dat, slab=paste(authors, year, sep=", "))
dat
               authors year  ni     ri controls          design   a_measure c_measure meanage quality      yi     vi
1      Axelsson et al. 2009 109  0.187     none cross-sectional self-report     other   22.00       1  0.1892 0.0094
2      Axelsson et al. 2011 749  0.162     none cross-sectional self-report       NEO   53.59       1  0.1634 0.0013
3         Bruce et al. 2010  55  0.340     none     prospective       other       NEO   43.36       2  0.3541 0.0192
4   Christensen et al. 1999 107  0.320     none cross-sectional self-report     other   41.70       1  0.3316 0.0096
5  Christensen & Smith 1995  72  0.270     none     prospective       other       NEO   46.39       2  0.2769 0.0145
6         Cohen et al. 2004  65  0.000     none     prospective       other       NEO   41.20       2  0.0000 0.0161
7       Dobbels et al. 2005 174  0.175     none cross-sectional self-report       NEO   52.30       1  0.1768 0.0058
8        Ediger et al. 2007 326  0.050 multiple     prospective self-report       NEO   41.00       3  0.0500 0.0031
9         Insel et al. 2006  58  0.260     none     prospective       other     other   77.00       2  0.2661 0.0182
10       Jerant et al. 2011 771  0.010 multiple     prospective       other       NEO   78.60       3  0.0100 0.0013
11        Moran et al. 1997  56 -0.090 multiple     prospective       other       NEO   57.20       2 -0.0902 0.0189
12   O'Cleirigh et al. 2007  91  0.370     none     prospective self-report       NEO   37.90       2  0.3884 0.0114
13       Penedo et al. 2003 116  0.000     none cross-sectional self-report       NEO   39.20       1  0.0000 0.0088
14        Quine et al. 2012 537  0.150     none     prospective self-report     other   69.00       2  0.1511 0.0019
15      Stilley et al. 2004 158  0.240     none     prospective       other       NEO   46.20       3  0.2448 0.0065
16 Wiebe & Christensen 1997  65  0.040     none     prospective       other       NEO   56.00       1  0.0400 0.0161
### meta-analysis of the transformed correlations using a random-effects model
res <- rma(yi, vi, data=dat)
res

Random-Effects Model (k = 16; tau^2 estimator: REML)

tau^2 (estimated amount of total heterogeneity): 0.0081 (SE = 0.0055)
tau (square root of estimated tau^2 value):      0.0901
I^2 (total heterogeneity / total variability):   61.73%
H^2 (total variability / sampling variability):  2.61

Test for Heterogeneity: 
Q(df = 15) = 38.1595, p-val = 0.0009

Model Results:

estimate      se    zval    pval   ci.lb   ci.ub     
  0.1499  0.0316  4.7501  <.0001  0.0881  0.2118  ***

---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 
### average correlation with 95% CI
predict(res, digits=3, transf=transf.ztor)
  pred ci.lb ci.ub  cr.lb cr.ub
 0.149 0.088 0.209 -0.037 0.325
### forest plot
forest(res, addcred=TRUE, xlim=c(-1.6,1.6), atransf=transf.ztor,
       at=transf.rtoz(c(-.4,-.2,0,.2,.4,.6)), digits=c(2,1), cex=.8)
text(-1.6, 18, "Author(s), Year", pos=4, cex=.8)
text( 1.6, 18, "Correlation [95% CI]", pos=2, cex=.8)

### funnel plot
funnel(res)

Reference

LS0tDQp0aXRsZTogIlLsnYQg7J207Jqp7ZWcIOuplO2DgOu2hOyEnSINCm91dHB1dDogaHRtbF9ub3RlYm9vaw0KLS0tDQoNCg0KIyMgSGVpcmFyY2h5IG9mIEV2aWRlbmNlDQohW10oaW1nL01lZGljYWwtSGVpcmFyY2h5LW9mLUV2aWRlbmNlLnBuZykNCg0KIyMg6rK97ZeY6rO87ZWZ7KCBIOyekOujjOulvCDrtoTshJ3tlZjripQg7IiY7KSAICjtmansoJXqt5woMTk5OCkpDQotIOygnDHssKgg67aE7ISdKHByaW1hcnkgYW5hbHlzaXMpOiDsl7Dqtazsl5DshJwg7Ja77J2AIOybkOyekOujjChvcmlnaW5hbCBkYXRhKeulvCDsp4HsoJEg67aE7ISdDQotIOygnDLssKjrtoTshJ0oc2Vjb25kYXJ5IGFuYWx5c2lzKTog7KCcMeywqCDrtoTshJ0g7J6Q66OM66W8IOyerOu2hOyEnSwg7KCcMeywqOu2hOyEneydmCDsl7DqtazrrLjsoJzsl5Ag64yA7ZW0IOuztOuLpCDrgpjsnYAg7Ya16rOE7KCBIOuwqeuyleydhCDsgqzsmqntlZjqsbDrgpgg7IOI66Gc7Jq0IOyXsOq1rCDsp4jrrLjsl5Ag64yA64u17J2EIOq1rO2VmOugpOuKlCDrqqnsoIENCi0g66mU7YOA67aE7ISdKG1ldGEtYW5hbHlzaXMpOiDqsJzrs4TsoIEg7Jew6rWswrfqsrDqs7zrk6TsnYQg7Ya16rOE7KCB7Jy866GcIOu2hOyEne2VmOuKlCDsnbTroaAg67CPIOuwqeuylQ0KDQojIyBJbnRyb2R1Y3Rpb24gdG8gbWV0YS1hbmFseXNpcw0KLSDrqZTtg4DrtoTshJ06IO2VmOuCmOydmCDso7zsoJzsl5Ag64yA7ZW0IOyXsOq1rO2VnCDsl6zrn6wg6rCc67OEIOyEoO2WieyXsOq1rOuTpOydmCDqsrDqs7zrpbwg7JaR7KCB7Jy866GcDQrthrXtlantlZjquLAg7JyE7ZW0IOyCrOyaqe2VmOuKlCDthrXqs4TsoIEg67Cp67KVLg0KLSDtlYTsmpTshLE6DQogMS4g6rCc67OEIOyXsOq1rOuTpOydmCDsl7DqtazqsrDqs7zqsIAg7J286rSA7ISx7J20IOyeiOuKlCDqsr3smrAg6rKA7KCV66Cl7J20IOuGkuyVhOyngOupsCwg7Kad6rCAIO2RnOuzuOyImOuhnCDsnbjtlbQg7KCV67CA64+EIOymneqwgA0KIDIuIOqwnOuzhCDsl7Dqtazrk6TsnZgg7Jew6rWs6rKw6rO86rCAIOydvOq0gOyEseydtCDsl4bripQg6rK97JqwIOyXsOq1rOqysOqzvOyXkCDsmIHtlqXsnYQg7KO864qUIOyalOyduOuTpOydhCDtjIzslYUgKOyYiDogQ29sZGl0eiBldC4gYWwgKDE5OTQpIEJDRyDrsLHsi6DsnZgg7Zqo6rO8KQ0KIDMuIOyDiOuhnOyatCDsl7DqtazqsIAg7ZWE7JqU7ZWgIOuVjCwg7Jew6rWs7ISk6rOE7JeQIOuPhOybgA0KLSDsnKDsnZjtlaAg7KCQOg0KIDEuIOqwnOuzhCDsl7DqtazsnZgg7Yq57ISx7J20IOyEnOuhnCDsnbTsp4jsoIHsnbTslrTshJwg7Ya17ZWp7J6Q7LK06rCAIOydmOuvuOqwgCDsl4bripQg6rK97JqwDQogMi4g6rCc67OEIOyXsOq1rCDsnpDssrTqsIAg7Ius6rCB7ZWcIOu5hOuapOumvChiaWFzKeydhCDqsIDsp4Dqs6Ag7J6I7J2EIOuVjA0KIDMuIOyLrOqwge2VnCDstpztjJAg67mE65qk66a8KHB1YmxpY2F0aW9uIGJpYXMp7J20IOyeiOuKlCDqsr3smrANCuKAuyDslYTrrLTrpqwg7ZuM66Wt7ZWcIOuplO2DgOu2hOyEneuPhCDsl7DqtazsnZgg7KeI7J20IOuCruydgCDqsJzrs4Qg7Jew6rWs7J2YIO2VnOqzhOygkOydhCDqt7nrs7XtlaAg7IiYIOyXhuuLpOuKlCDsoJANCg0KIyMgUHJvY2VkdXJlcyBvZiBtZXRhLWFuYWx5c2lzDQoxLiDsl7Dqtazso7zsoJzrpbwg66qF7ZmV7Z6IIOyEpOyglQ0KMi4g7ZSE66Gc7Yag7L2cIOyekeyEsTog6rKA7IOJ7ZWgIOyXsOq1rCDtirnshLEo7Jew6rWs64yA7IOB7J6QLCDqsrDqs7zrs4DsiJgg65OxKSwg6rKA7IOJ67Cp67KVLCDsl7Dqtazrk6TsnZgg7ISg7KCVL+ygnOyZuOq4sOykgCDrk7Eg7Y+s7ZWoDQozLiDtlITroZzthqDsvZwg67CU7YOV7Jy866GcIOuplO2DgOu2hOyEneydhCDsnITtlZwg7Jew6rWs65Ok7J2EIOy1nOyihSDshKDsoJXtlZjqs6AsIO2VhOyalO2VnCDsnpDro4wg7LaU7Lac7ZWY7JesIOygleumrA0KNC4g7ISg7KCV65CcIOyXsOq1rOuTpOydmCDsl7DqtaztirnshLEg67CPIOyXsOq1rOuwqeuylSDrk7HsnYQg6rOg66Ck7ZWY7JesIOyXsOq1rOuTpOydtCDrj5nsp4jtlZjri6Tqs6Ag7YyQ64uo7J20IOuQmOuKlCDqsr3smrDsl5Ag66mU7YOA67aE7ISdIOyImO2Wie2VqC4NCg0KIVtdKGltZy9maWcxLnBuZykNCg0KIyMgIOuplO2DgOu2hOyEnSDrsKnrspXsnZgg7ISg7KCVICjstpzsspggOiBIZWFsdGggSW5mb3JtYXRpb24gYW5kIFF1YWxpdHkgQXV0aG9yaXR5LCAyMDExKQ0KIVtdKGltZy9tZXRhQW5hbHlzZXNfc2VsZWN0aW9uLnBuZykNCg0KIyMg66mU7YOA67aE7ISdIOqysOqzvO2VtOyEneyXkCDtj6ztlajrkJjslrTslbwg7ZWgIOyCrO2VrQ0KMS4g66mU7YOA67aE7ISd7JeQIO2PrO2VqOuQnCDqsJzrs4Tsl7DqtazsnZgg7IiY7JmAIO2OuOydmOydmCDsnITtl5jsnbQg7Y+s7ZWo65CcIOygnOyLnOuQnCDspp3qsbANCjIuIO2aqOqzvO2BrOq4sCDsiJjspIAg67CPIOyXsOq1rCDsiJjspIDsnZgg7Zqo6rO87JeQIOuMgO2VnCDsoJXtmZXrj4Tsl5Ag64yA7ZWcIO2PieqwgA0KMy4g66mU7YOA67aE7ISd7JeQIO2PrO2VqOuQnCDqsJzrs4Tsl7Dqtazrk6TsnbQg64+Z7J28IOuqqOynkeuLqOyXkOyEnCDstpTstpzrkJwg6rKD7J247KeA7JeQIOuMgO2VnCDtjJDri6jsnYQg7JyE7ZW0IOyXsOq1rOqwhCDtmqjqs7zrk6TsnZgg64+Z7KeI7ISxIOqygOyglQ0KNC4g6rCc67OE7Zqo6rO8IO2BrOq4sOuTpOydhCDsooXtlantlZwg7Zqo6rO87YGs6riw66W8IOqzhOyCsO2VmOuptOyEnCwg7LaU7KCV7LmYKHBvaW50IGVzdGltYXRlKeyXkCDrjIDtlZwg7YGs6riw7JmAIOuwqe2WpSwg7Iug66Kw6rWs6rCELCDthrXqs4TsoIEg67CPIOyLpOyytOyggSDsnKDsnZjshLEsIOyeoOyerOyggSDtjrjsnZgg7JyE7ZeY7JeQIOuMgO2VtCDtlbTshJ0g67CPIOuFvOydmA0KNS4g7KGw7KCI67OA7J2467aE7ISdIOyLpOyLnCDrsI8g7ZW07ISd7J2EIOyLpOyLnA0KDQojIyMg7Ya16rOE7KCBIOuwqeuylSDsoIjssKgNCjEuIO2aqOqzvO2BrOq4sCDstpTsoJU6IOuPheumveuQnCDrkZAg6re466O5IOuYkOuKlCDri6jsnbzqtbAvIOyXsOyGje2YlSDrmJDripQg7J2067aE7ZiVDQoyLiDthrXtlanstpTsoJXsuZgg7LaU7KCVOiDqs6DsoJXtmqjqs7zrqqjtmJUvIOuenOuNpO2aqOqzvOuqqO2YlQ0KMy4g7J207KeI7ISxIOqygO2GoDog7Ya16rOE7KCBIOydtOyniOyEsSwg7ZWY7JyE6re466O567aE7ISdLCDrqZTtg4Dtmozqt4DrtoTshJ0NCjQuIOy2nO2MkCDruYTrmqTrprwg6rKA7YagOiBmdW5uZWwgcGxvdCwgQmVn4oCZcyB0ZXN0LCBFZ2dlcuKAmXMgdGVzdA0KdHJpbS1hbmQtZmlsbCDrsKnrspUsIGZhbGwtc2FmZSBOIOuwqeuylSwg64iE7KCBIOuplO2DgOu2hOyEnQ0KNS4g66+86rCQ64+EIOu2hOyEnTogc3RhbmRhcmRpemVkIHJlc2lkdWFscywgQ29va+KAmXMgZGlzdGFuY2VzLA0KbGVhdmUtb25lLW91dCBhbmFseXNlcw0KDQohW10oaW1nL2ZpZzIucG5nKQ0KDQojIyMjIDEuIFN0YW5kYXJkaXplZCBvdXRjb21lIG1lYXN1cmUo7Zqo6rO87YGs6riw7LaU7KCVKQ0KDQohW10oaW1nL2ZpZzMucG5nKQ0KDQotIGVmZmVjdCBzaXplICjOuCwg7Zqo6rO87YGs6riwKSA6IHN0YW5kYXJkaXplZCBtZWFzdXJlIG9mIGVmZmVjdCAoc3VjaCBhcyByLCBDb2hlbidzIGQsIG9yIHRoZSBvZGRzIHJhdGlvKSwgb3IgdG8gYW4gdW5zdGFuZGFyZGl6ZWQgbWVhc3VyZSAoZS5nLiwgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBncm91cCBtZWFucyBvciB0aGUgdW5zdGFuZGFyZGl6ZWQgcmVncmVzc2lvbiBjb2VmZmljaWVudHMpLg0K7Lac7LKYIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0VmZmVjdF9zaXplDQoNCi0g7Zqo6rO87YGs6riw7JeQIOuMgO2VnCDsnbzrsJjsoIHsnbgg7ZW07ISd6riw7KSAIChDb2hlbigxOTg4KSkNCisgIOyekeydgCDtmqjqs7ztgazquLA6IOyDgeq0gOqzhOyImChyKSAwLjEsIO2Pieq3oOywqCDtmqjqs7ztgazquLAoZCkgMC4yDQorICDspJHqsIQg7Zqo6rO87YGs6riwOiDsg4HqtIDqs4TsiJggMC4zLCDtj4nqt6DssKgg7Zqo6rO87YGs6riwIDAuNQ0KKyAg7YGwIO2aqOqzvO2BrOq4sDog7IOB6rSA6rOE7IiYIDAuNSwg7Y+J6reg7LCoIO2aqOqzvO2BrOq4sCAwLjgNCg0KLSBSYXRlICjruYQpOiBhIGNvbXBhcmlzb24gYmV0d2VlbiB0d28gbWVhc3VyZW1lbnRzIG9mIGRpZmZlcmVudCB1bml0cyAoZWcuIDQwIG1pbGVzL2hvdXIpDQotIFJhdGlvKOu5hOycqCkgOiB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gdGhlIG51bWJlciwgc2l6ZSBvZiB0d28gb3IgbW9yZSBzaW1pbGFyIHRoaW5ncyAoZWcuIFRoZQ0KcmF0aW8gb2YgUm9teeKAmXMgbWFuZ29lcyB0byBFZGdhcuKAmXMgaXMgMzo2KQ0K7Lac7LKYIGh0dHA6Ly93d3cuZGlmZmVyZW5jZWJldHdlZW4ubmV0L3NjaWVuY2UvbWF0aGVtYXRpY3Mtc3RhdGlzdGljcy9kaWZmZXJlbmNlLWJldHdlZW4tcmF0ZS1hbmQtcmF0aW8vDQoNCiMjIyMgMi4gQ2FsY3VsYXRpbmcgb3ZlcmFsbCBlZmZlY3Qo7Ya17ZWp7LaU7KCV7LmYIOy2lOyglSkNCuKAoiDqsJzrs4Tsl7DqtazsnZgg7KSR7JqU64+E7JeQIOuUsOuluCDqsIDspJHsuZjrpbwg7J207JqpDQrvg6Ag6rCc67OEIOyXsOq1rOydmCDqsIDspJHsuZjqsIAg7YG07IiY66GdIO2VtOuLuSDsl7DqtazqsIAg7Ya17ZWp7LaU7KCV7LmY7JeQIO2BrOqyjCDquLDsl6ztlZzri6QuDQrrjZQg7KCV67CA7ZWcIOy2lOygley5mOulvCDsoJzqs7XtlZwg7Jew6rWsIOuYkOuKlCDtkZzrs7gg7YGs6riw6rCAIOuNlCDtgbAg7Jew6rWs7JeQIOuNlCDrp47snYANCuqwgOykkey5mCDrtoDsl6ztlZjripQg6rKD7J20IOybkOy5mQ0K4oCiIOuNlCDsoJXrsIDtlZwg7LaU7KCV7LmY66W8IOygnOqzte2VnCDsl7Dqtazvg6gg67aE7IKw7J2YIOyXreyImOydtOyaqQ0K7ZGc67O4IO2BrOq4sOqwgCDrjZQg7YGwIOyXsOq1rOyXkCDrjZQg66eO7J2AIOqwgOykkey5mCDrtoDsl6ztlZjripQg6rKD7J20IOybkOy5mQ0KDQojIyMjIyAxKSBGaXhlZCBlZmZlY3QgbW9kZWwgKEZFLCDqs6DsoJXtmqjqs7zrqqjtmJUpOg0K66mU7YOA67aE7ISd7JeQIO2PrO2VqOuQnCDsl7Dqtazrk6TsnZgg7Yq57ISx7J20IOuPmeyniOyggeydvCDrlYwg7J207JqpDQokWV9pPVx0aGV0YStcZXBzaWxvbl9pJCAoaT0xLC4uLixrKQ0KDQrqsJzrs4Qg7Jew6rWs7J2YIOqwgOykkey5mOulvCAkV19pJOudvOqzoCDtlaAg65WMLCDthrXtlanstpTsoJXsuZggJFxoYXR7XHRoZXRhfSTripQg6rCA7KSR7Y+J6reg7Jy866GcIOyCsOy2nA0KDQokJFxoYXR7XHRoZXRhfT1cZnJhY3tcc3VtX3trfV57aT0xfVdfaVlfaX17XHN1bV97a31ee2k9MX1XX2l9JCQNCuKRoCBJbnZlcnNldmFyaWFuY2UgKElWLCDsl63rtoTsgrDqsIDspJHsuZgpID0+IOqysOqzvCDrsJzsg53snbQg65Oc66y4IOq0gOyLrOyCrOqxtOyXkCDrjIDtlZwg66mU7YOA67aE7ISd7J2AIGJpYXPqsIAg7IOd6ri4IOqwgOuKpeyEseydtCDrhpLsnLzrr4DroZwsDQpJVuuwqeuyleydgCDsoIHtlantlZjsp4Ag7JWK7J2MDQoNCuKRoSBNYW50ZWwtSGFlbnN6ZWwgKE1ILCDrqZjthZQt7Zeo7KCkKQ0KDQrikaIgUGV0bw0KDQojIyMjIyAyKSBSYW5kb20gZWZmZWN0IG1vZGVsIChSRSwg656c642k7Zqo6rO866qo7ZiVKToNCuuplO2DgOu2hOyEneyXkCDtj6ztlajrkJwg7Jew6rWs65Ok7J2YIO2KueyEseydtCDsnbTsp4jsoIHsnbwg65WMIOydtOyaqQ0K6rCc67OEIOyXsOq1rOuTpOydmCDtmqjqs7ztgazquLDsnZgg7LC46rCS7J2AIO2VmOuCmOunjCDsobTsnqztlZjripQg6rKD7J20IOyVhOuLiOudvA0K7KCE7LK0IO2Pieq3oOydhCDspJHsi6zsnLzroZwg7ZWY64qUIOygleq3nOu2hO2PrOulvCDrlLDrpbjri6Tqs6Ag6rCA7KCV7ZWY64qUIOuqqO2YlQ0KDQpp67KI7Ke4IOyXsOq1rOydmCDtmqjqs7ztgazquLDsnZgg7LC46rCSICRcdGhldGFfaSTripQg7KCE7LK0IO2Pieq3oCAkXG11JOulvCDtj4nqt6DsnLzroZwg7KCV6rec67aE7Y+s66W8IOuUsOuluOuLpOqzoCDqsIDsoJUuDQoNCiQkWV9pID0gXHRoZXRhX2krXGVwc2lsb25faSA9IFxtdStcemV0YV9pK1xlcHNpbG9uX2ksIChpPTEsXGNkb3RzLGspJCQNCiRcdGhldGFfaSTripQg7KCE7LK07Y+J6regICRcbXUk7JmAIO2aqOqzvO2BrOq4sCDrs4Drj5nsnYQg64KY7YOA64K064qUICRcemV0YV9pJOuhnCDrgpjtg4Drgrwg7IiYIOyeiOqzoCwNCiRcZXBzaWxvbl9pJOuKlCBp67KI7Ke4IOyXsOq1rCDrgrQg7ZGc67O47Jik7LCoDQokJFx6ZXRhX2kgXHNpbSBOKDAsIFx0YXVeMikkJA0KJCRcZXBzaWxvbl9pIFxzaW0gTigwLCBcc2lnbWFeMikkJA0KJFx0aGV0YV9pXjIk64qUIO2aqOqzvO2BrOq4sOydmCDsl7DqtazqsIQg67aE7IKwLCAkXHNpZ21hXjIk7J2AIGnrsojsp7gg7Jew6rWs7J2YIO2RnOuzuOyYpOywqOyduCAkXGVwc2lsb25faSTsnZgg67aE7IKwLg0KDQrsl6zquLDshJwgJFZhcihZX2kpID0gXHRhdV4yK1xzaWdtYV4yJOydtCDrkJjripTrjbAsIFJFIOuqqO2YleyXkOyEnOuKlCDthrXtlanstpTsoJXsuZjsnZgg67aE7IKw7J2EIOy1nOyGjO2ZlO2VmOq4sCDsnITtlbQgJFZhcihZX2kpJOydmCDsl63siJjrpbwg6rCA7KSR7LmY66GcIOydtOyaqe2VnOuLpC4NCg0KUmFuZG9tIGVmZmVjdCDrqqjtmJXsl5DshJwg7IKs7JqpIOqwgOuKpe2VnCDrsKnrspUgOg0KRGVyU2ltb25pYW4tTGFpcmQgKERMKSwgSHVudGVyLVNjaG1pZHQgKEhTKSwgSGVkZ2VzIChIRSksIG1heGltdW0NCmxpa2VsaWhvb2QgKE1MKSwgYW5kIHJlc3RyaWN0ZWQgbWF4aW11bSBsaWtlbGlob29kIChSRU1MKQ0KREwg67Cp67KV7J20IOunjuydtCDsgqzsmqnrkJjrqbAg6rKw6rO8IOuwnOyDneydtCDrk5zrrLgg6rSA7Ius7IKs6rG07JeQ7IScIGJpYXPqsIAg7Luk7KeA6riwIOuVjOusuOyXkCDqtoztlZjsp4Ag7JWK7J2MDQoNCi0+IEZFIG9yIFJFIOydmCDshKDtg53snYAgSGV0ZXJvZ2VuZWl0eSAo7J207KeI7ISxKSDqs6DroKQg7ZuE7JeQIO2MkOuLqA0KDQojIyMjIDMuIEhldGVyb2dlbmVpdHkNCkhldGVyb2dlbmVpdHkgaW4gZWZmZWN0IHNpemVzIG1lYW5zIHRoZSBkaXNwZXJzaW9uIGluIHRoZSB0cnVlIGVmZmVjdCBzaXplDQrigKIgQ2F1c2VzIG9mIGhldGVyb2dlbmVpdHkgKO+DpyBDbGluaWNhbCwgU3RhdGlzdGljYWwpIDoNCu+DvC0gIFBhcnRpY2lwYW50cyA6IGNvbmRpdGlvbiwgZGVtb2dyYXBoaWNzLCBnZW9ncmFwaGljYWwgdmFyaWF0aW9uLCB0cmlhbCBpbmNsdXNpb24gY3JpdGVyaWENCu+DvC0gIEludGVydmVudGlvbnMgOiB0eXBlLCBkdXJhdGlvbiwgbW9kZSBvZiBhZG1pbmlzdHJhdGlvbiwgYWRkaXRpb25hbCBjb21wb25lbnRzLA0KIGV4cGVyaWVuY2Ugb2YgcHJhY3RpdGlvbmVycywgbmF0dXJlIG9mIGNvbnRyb2xzDQrvg7wtICBPdXRjb21lcyA6IHR5cGUsIGZvbGxvdy11cCBkdXJhdGlvbiwgd2F5cyBvZiBtZWFzdXJpbmcsIGRlZmluaXRpb24gb2YgYW4gZXZlbnQNCu+DvC0gIERlc2lnbiA6IHJhbmRvbWlzZWQsIG5vbi1yYW5kb21pc2VkLCBjbHVzdGVyIHJhbmRvbWlzZWQsDQogcGFyYWxsZWwgdnMuIGNyb3Nzb3ZlciwgbGVuZ3RoDQrvg7wtICBDb25kdWN0IDogYWxsb2NhdGlvbiBjb25jZWFsbWVudCwgYmxpbmRpbmcsIGFwcHJvYWNoIHRvIGFuYWx5c2lzLA0KIGltcHV0YXRpb24gbWV0aG9kcyBmb3IgbWlzc2luZyBkYXRhDQot74O8IFZhcmlhdGlvbiBpbiB0cnVlIHRyZWF0bWVudCBlZmZlY3RzIGluIG1hZ25pdHVkZSBvciBkaXJlY3Rpb24NCg0KIyMjIyAzLTEuIEFzc2Vzc2luZyBIZXRlcm9nZW5laXR5IDogUS1zdGF0aXN0aWNzICYgJEheMiQNCuy9lO2BrOuegOydmCBR7Ya16rOE65+JOiDqsJzrs4Qg7Jew6rWs65Ok7J2YIO2aqOqzvO2BrOq4sOqwgCDthrXtlanstpTsoJXsuZjsmYAg65ao7Ja07KC4IOyeiOuKlCDsoJXrj4QNCiQkUT1cc3VtX3tpPTF9XntrfVdfaShZX2ktXGhhdFx0aGV0YSleMj1cc3VtX3tpPTF9XntrfVdfaVlfaV4yLVxmcmFjeyhcc3VtX3tpPTF9XntrfVdfaVlfaSleMn17XHN1bV97aT0xfV57a31XX2l9XHNpbVxjaGleMihrLTEpJCQNCu2GteqzhOufieydtCDsnpDsnKDrj4Tsl5Ag67mE7ZW0IO2BtOyImOuhnSDtmqjqs7ztgazquLDqsIAg7Ya16rOE7KCBIOydtOyniOyEseydtCDsnojsnYQg6rCA64ql7ISx7J20IOuGkuyVhOynhOuLpC4NCg0KLT4g7Jew6rWs7IiY6rCAIOyekeqxsOuCmCwg7Jew6rWsIOuCtCDtkZzrs7jsiJjqsIAg7J6R6rGw64KYLCDqtIDsi6zqsrDqs7wg67Cc7IOd7J20IOuTnOusuCDqsr3smrAg65iQ64qUIO2VmOuCmOydmA0K7Jew6rWs6rCAIOuLpOuluCDsl7Dqtazsl5Ag67mE7ZW0IOqwgOykkey5mOqwgCDrp47snbQg7YG0IOqyveyasCBwb3dlcijqsoDsoJXroKUp6rCAIOuCruuLpC4NCg0KLT4g7Jyg7J2Y7IiY7KSA7J2AIDAuMDXrs7Tri6QgMC4x7J2EIOunjuydtCDsgqzsmqntlZzri6QuDQoNClEg7Ya16rOE65+J7J2EIOydtOyaqe2VmOyXrCDsoJXsnZjtlZjripQgJEheMiTthrXqs4Trn4nsnYANCg0KJEheMj1cZnJhY3tRfXtkZn0kDQoNCuuhnCDsoJXsnZjtlZjqs6AsICRIXjI+MSQg7J28IOqyveyasCDshKTrqoXtlaAg7IiYIOyXhuuKlCDsnbTsp4jshLHsnbQg7J6I64uk6rOgIO2MkOuLqO2VnOuLpC4NCg0KIyMjIyAzLTIuIEFzc2Vzc2luZyBIZXRlcm9nZW5laXR5IDogJFx0YXVeMiQgJiAkSV4yJC1zdGF0aXN0aWNzDQokXHRhdV4yJCDthrXqs4Trn4k6IO2aqOqzvO2BrOq4sOydmCDsl7DqtazqsIQg67OA64+Z7J2EIOuCmO2DgOuCtOuKlCDrtoTsgrANCiQkXHRhdV4yPVxmcmFje1EtZGZ9e0N9JCQNCuyXrOq4sOyEnCBD64qUICRDPVxzdW1fe2k9MX1ee2t9V19pLVxmcmFje1xzdW1fe2k9MX1ee2t9V19pXjJ9e1xzdW1fe2k9MX1ee2t9V19pfSQNCg0KJFx0YXVeMiTqsJLsnbQg7YG07IiY66GdIOyXsOq1rOqwhCDrs4Drj5nsnbQg7YGs64uk64qUIOucuw0KDQokSV4yJCDthrXqs4Trn4k6IO2GteqzhOyggSDsnbTsp4jshLHsnLzroZwg7J247ZWcIO2aqOqzvO2BrOq4sOydmCDrs4Drj5nsnYQg67Cx67aE7Jyo66GcIOuCmO2DgOuCtOuKlCDqsoMuDQotPu+DoO2aqOqzvO2BrOq4sOydmCDstJ0g67OA64+ZIOykkSDsl7DqtazqsIQg67OA64+Z7J2YIOu5hA0KJEleMj1cZnJhY3tRLWRmfXtRfVgxMDAkJQ0KDQokSV4yJD0wfjQwJTog7Ya16rOE7KCBIOydtOyniOyEseydtCDspJHsmpTtlZjsp4Ag7JWK7J2EIOyImCDsnojsnYwNCiRJXjIkPTMwfjYwJTog7KSR6rCE7KCV64+E7J2YIO2GteqzhOyggSDsnbTsp4jshLHsnbQg7J6I7J2EIOyImCDsnojsnYwNCiRJXjIkPTUwfjkwJTog7IOB64u57ZWcIO2GteqzhOyggSDsnbTsp4jshLHsnbQg7J6I7J2EIOyImCDsnojsnYwNCiRJXjIkPTc1fjEwMCU6IOustOyLnO2VoCDsiJgg7JeG64qUIO2GteqzhOyggSDsnbTsp4jshLHsnbQg7J6I7J2EIOyImCDsnojsnYwNCg0KDQojIyMjIyBSIHBhY2thZ2VzDQotIGh0dHBzOi8vY3Jhbi5yLXByb2plY3Qub3JnL3dlYi92aWV3cy9NZXRhQW5hbHlzaXMuaHRtbA0KLSBodHRwOi8vd3d3Lm1ldGFmb3ItcHJvamVjdC5vcmcNCi0gaHR0cHM6Ly9jcmFuLnItcHJvamVjdC5vcmcvd2ViL3BhY2thZ2VzL21ldGFmb3IvbWV0YWZvci5wZGYNCg0KIyMjIyA0LiBQdWJsaWNhdGlvbiBiaWFzDQrtmqjqs7ztgazquLDqsIAg7YGs6rOgLCDsnKDsnZjtlZwg6rKw6rO866W8IOqwgOyngOuKlCDsl7DqtazqsIAg7Lac7YyQ65CY64qUIOqyve2WpeydtCDrhpLqs6AsDQrsl7Dqtawg6rKw6rO87J2YIOuwqe2WpeyXkCDrlLDrnbwg7Lac7YyQ7Jes67aA6rCAIOuLrOudvOyngOuKlCDqsr3tlqXsnbQg7J6I64ukLg0KDQotPuyLpOygnCDtmqjqs7ztgazquLDsl5Ag67mE7ZW0IOqzvOuMgCDstpTsoJXrkJwg7Zqo6rO87YGs6riw66W8IOyCsOy2nO+DqCDstpztjJDruYTrmqTrprwNCg0KRnVubmVsIHBsb3Q6IOyLnOqwgeyggeyduCDrsKnrspUNCuq5lOuMgOq4sCDqt7jrprzsnbQg67mE64yA7Lmt7KCB7J247KeA7JeQIOuMgO2VnCDqsIDshKTqsoDsoJU6IEJlZ2figJlzLCBFZ2dlcuKAmXMgdGVzdA0K7JyE7J2YIOuwqeuyleydhCDthrXtlbQg7Lac7YyQ67mE65qk66a87J20IOyeiOuLpOqzoCDtjJDri6jrkJjrqbQsIOy2nO2MkCDruYTrmqTrprzsnbQNCuyXsOq1rOqysOqzvOyXkCDrr7jsuZjripQg7JiB7Zal7J2EIO2MjOyVhe2VoCDtlYTsmpQg7J6I64uk74OgIHRyaW0tYW5kLWZpbGwsIGZpYWwtc2FmZSBODQoNCkZ1bm5lbCBwbG90OljstpXsnYAg7Zqo6rO866W8IOuCmO2DgOuCtOqzoCwgWey2leydgCDtkZzrs7jtgazquLDrpbwg64KY7YOA64K0IO2RnOuzuOyImCwNCu2RnOykgOyYpOywqCwg7ZGc7KSA7Jik7LCo7J2YIOyXreyImCwg67aE7IKwLCDrtoTsgrDsnZgg7Jet7IiY6rCAIOyTsOydvCDsiJgg7J6I64ukLg0KOTUlIFBzZXVkbyBDSSAoPe2Gte2Vqey2lOygley5mCRccG0xLjk1U0UkKeuwluyXkCDsnITsuZjtlZwg7Jew6rWs7IiY6rCADQrrp47snYTsiJjroZ0g7J207KeI7KCBIOydtOuLpOqzoCDtlaAg7IiYIOyeiOuLpC4NCg0KIVtdKGltZy9mdW5uZWxwbG90MS5wbmcpDQoNCiFbXShpbWcvZnVubmVscGxvdDIucG5nKQ0KDQojIyMjIyBUcmltICYgRmlsbCBtZXRob2QNCuydtCDrsKnrspXsnYAgZnVubmVsIHBsb3Tsl5DshJwg7Zqo6rO87YGs6riw7J2YIOu2hO2PrOulvCDtmZXsnbjtlZjripQg67Cp67KV7Jy866GcIOq3oOuTsQ0K7ZWcIOu2hO2PrOulvCDrs7Tsnbgg6rK97Jqw7JeQ64qUIOy2nO2MkOyYpOulmOqwgCDsl4bripQg6rKD7Jy866GcIO2MkOuLqO2VoCDsiJgg7J6I64ukLg0K6reg65Ox7ZWY7KeAIOuqu+2VnCDrtoTtj6zrpbwg67O07J24IOqyveyasOyXkOuKlCDqsIDsg4HsnZgg7Jew6rWsIOqysOy4oeqwkuydhCDrhKPslrQNCuuztOygle2VmOqyjCDrkJjripTrjbAg67O07KCVIOydtO2bhOyXkCDtmqjqs7ztgazquLDsnZgg67OA7ZmU6rCAIDwxMCXsnbTrqbQg7Lac7YyQ7Jik66WYDQrqsIAg7JeG64qUIOqyg+ycvOuhnCDtjJDri6ggKFN1dHRvbiBldCBhbC4sIDIwMDApDQoNCiFbXShpbWcvdHJpbWFuZGZpbGwucG5nKQ0KDQojIyMjIyBGYWlsLXNhZmUgbnVtYmVyIChOZnMpDQrqs6DsoJXtmqjqs7zrqqjtmJXsl5DshJwg7ZmV7J247ZWgIOyImCDsnojripQg7JWI7KCE6rOE7IiYKE5mcykg7IKw7KCV7J2064ukLiDsnbQg67Cp67KV7J2AIOyihQ0K7ZWp7KCBIOy5mOujjCDtmqjqs7ztgazquLDqsIAg7Jyg7J2Y7ZWY7KeAIOyViuydgCDqsoPsnLzroZwg64KY7YOA64KY6riwIOychO2VtCDsiKjqsqjsp4Qg7Jew6rWsDQrrk6TsnbQg7Ja866eI64KYIOuNlCDtlYTsmpTtlZzsp4Ag6rOE7IKw7ZWY64qUIOuwqeuyleydtOuLpCAoT3J3aW4sIDE5ODMpLg0K74OoIOyekOuqhSDtmqjqs7wodHJpdmlhbCBlZmZlY3Qp6rCAIDAuMjAsIOqysOy4oeyXsOq1rCDtmqjqs7wobWlzc2luZyBzdHVkeSBlZmZlY3Qp6rCAIDDsnbgNCuyDge2ZqeyXkOyEnCDtmqjqs7ztgazquLAg6rCS7J2EIDAuMjAg66+466eM7Jy866GcIOunjOuTpOq4sCDsnITtlbQg7ZWE7JqU7ZWcIOyXsOq1rCDsiJjroZwg7ZmV7J24Lg0K74OoIOyViOyghOqzhOyImOuKlCDigJjstqnrtoTtnogg7YGs64uk4oCZ65286rOgIO2MkOuLqO2VoCDsiJgg7J6I64qUIOq4sOykgOydtCDsnbzrsJjsoIHsnLzroZwgNW4rMTANCihuPeu2hOyEneyXkCDtj6ztlajrkJwg7Jew6rWs7J2YIOyImCkg7J207IOB7J207Ja07JW8IO2VnOuLpC4NCg0KIyMjIyA1LiBTZW5zaXRpdml0eSBhbmFseXNpcyAo66+86rCQ64+E67aE7ISdKQ0K66+86rCQ64+EIOu2hOyEneydtOuegCDsmIHtlqXroKUg7J6I64qUIHN0dWR5IO2YueydgCBvdXRsaWVycyDrpbwg7LC+7JWE64K06rGw64KYLCDrmJDripQg6rCBIOuLqOqzhOyXkOyEnA0K7ZaJ7ZWY7Jes7KeEIOuwqeuyleyXkCDrlLDrnbwg7Ya17ZWp7LaU7KCV7LmY6rCAIOyWvOuniOuCmCDrsJTrgIzripTsp4Ag7IK07Y6067O064qUIOqygy4NClN0YW5kYXJkaXplZCByZXNpZHVhbHMsIENvb2vigJlzIGRpc3RhbmNlcywgbGVhdmUtb25lLW91dCBhbmFseXNlc+uTseydtCDsgqzsmqkg6rCA64ql7ZWoDQpsZWF2ZS1vbmUtb3V0IGFuYWx5c2Vz7J2YIOqyveyasCBzdHVkeeulvCDtlZjrgpjslKkg67m86rCA66mwIO2Gte2Vqey2lOygley5mOulvCDqtaztlZjqs6Ag7J2065WMDQrqsrDqs7zqsIAg7YGs6rKMIOuLrOudvOyngOuKlCDrs7TripQg6rKD7J6EDQoNCiMjIOuplO2DgOu2hOyEnSDsi6TsirUNCg0KIyMjIE1ldGEtQW5hbHlzZXMgaW4gUiB3aXRoIHRoZSAgbWV0YWZvciBQYWNrYWdlDQoNCiFbXShpbWcvbWV0YWZvcl9wYXBlci5wbmcpDQoNCiFbXShpbWcvbWV0YUFuYWx5c2VzX3BhY2thZ2VzLnBuZykNCg0K4oC7IE1lYXN1cmVzDQohW10oaW1nL21ldGFmb3JfbWVhc3VyZS5wbmcpDQoNCuKAuyDtlajsiJjsoJXrpqwNCi0gZXNjYWxjOiDtmqjqs7ztgazquLAoeWkp7JmAIOu2hOyCsCh2aSnrpbwg6rOE7IKwDQotIHJtYTog7Ya17ZWp7LaU7KCV7LmYIOqzhOyCsCAtIEZFKElW67Cp67KVKSwgUkUoREzrsKnrspUpIO+DnyBSReqwgCBkZWZhdWx07J6EDQotIHJtYS5taDog7Ya17ZWp7LaU7KCV7LmYIOqzhOyCsCAoRml4ZWQgZWZmZWN0IG1vZGVsIE1hbnRlbC1IYWVuc3pl67Cp67KVKQ0KLSBybWEucGV0bzrthrXtlanstpTsoJXsuZgg6rOE7IKwIChGaXhlZCBlZmZlY3QgbW9kZWwgUGV0byDrsKnrspUpDQoNCmBgYHtyfQ0KZ2V0d2QoKQ0KYGBgDQoNCmBgYHtyfQ0KI2RhdDwtIHJlYWQudGFibGUgKCdub3JtYW5kMTk5OS5jc3YnLCBoZWFkZXI9VFJVRSwgc2VwPSIsIikNCiNkYXQNCmBgYA0KDQojIyBbRXgxXSBGaXhlZCBlZmZlY3QgbW9kZWwgdXNpbmcgSVYt7Y+J6reg7LCoIChNRCnsnbTsmqkNCk1E7JmAIE1E7J2YIOu2hOyCsOydhCDqs4TsgrDtlZjsl6wgZGF0X01E652864qUIOuNsOydtO2EsOyFi+ycvOuhnCDsoIDsnqXtlagNCg0KYGBge3J9DQpsaWJyYXJ5KG1ldGFmb3IpDQoNCiNkYXQubm9ybWFuZDE5OTk6IO2KueuzhOy5mOujjCB2cyDsnbzrsJjsuZjro4wo64eM7KG47KadIO2ZmOyekOuMgOyDgSnsnZgg7J6F7JuQ7J287IiYIOu5hOq1kCwgY29udGludW91cyBvdXRjb21lczogTWVhbiBEaWZmcmVuY2UsIFN0YW5kYXJpemVkIE1lYW4gRGlmZmVyZW5jZQ0KDQpkYXQgPC0gZ2V0KGRhdGEoZGF0Lm5vcm1hbmQxOTk5KSkNCmhlYWQoZGF0LDMpDQpgYGANCg0KYGBge3J9DQpkYXQgPC0gZ2V0KGRhdGEoZGF0Lm5vcm1hbmQxOTk5KSkNCmRhdF9NRCA8LSBlc2NhbGMobWVhc3VyZT0iTUQiLCBtMWk9bTFpLCBzZDFpPXNkMWksIG4xaT1uMWksIG0yaT1tMmksIHNkMmk9c2QyaSwgbjJpPW4yaSwgZGF0YT1kYXQpICANCmhlYWQoZGF0X01ELDMpDQpgYGANCg0KIyMjIE1E7J2YIElWKOyXreu2hOyCsOqwgOykkey5mCnrsKnrspUg7J207Jqp7ZWcIO2Gte2Vqey2lOygley5mCDqs4TsgrANCg0KYGBge3J9DQojTm9ybWFuZCgxOTk5KS1zdHJva2UgcGF0aWVudHMNCiMxPSBzcGVjaWFsaXplZCBjYXJlDQojMj0gcm91dGluZSBub24tc3BlY2lhbGlzdCBjYXJlDQojbj0gbm8gb2YgcGF0aWVudHMNCiNtPSBhdmcgbGVuZ3RoIG9mIGhvc3BpdGFsIHN0YXkNCiNzZD1zZCBvZiBob3NwaXRhbCBzdGF5IA0KDQpyZXMxPC0gcm1hKHlpLCB2aSwgZGF0YT0gZGF0X01ELCBtZXRob2Q9IkZFIikNCnJlczENCnN1bW1hcnkocmVzMSkNCmBgYA0K7ZW07ISdOiAkXGhhdHtcdGhldGF9JD0tMy40NjM2LCAkU0VcaGF0e1x0aGV0YX0kPTAuNzY0OCwgOTUlQ0k9Wy00Ljk2MjYsIC0xLjk2NDZdLCBwLXZhbDwwLjAwMQ0KLT7tirnrs4TsuZjro4wg6rWw7J2YIOyeheybkOydvOyImOqwgCDsnbzrsJjsuZjro4wg6rWw67O064ukIDMuNDbsnbwg7Ken64uk6rOgIO2VoCDsiJgg7J6I64ukLg0KDQojIyBbRXgyXSBGaXhlZCBlZmZlY3QgbW9kZWwgdXNpbmcgSVYt7Jik7KaI67mEIChPUikg7J207JqpDQoNCmBgYHtyfQ0KI2RhdC5iY2c6IENvbGR0aXogKDE5OTQpLCDrsLHsi6Ag7KCR7KKF6rWwIHZzIOuMgOyhsOq1sCAoZXZlbnQ96rKw7ZW1IOuwnOyDneyekCksIGJpbmFyeSBvdXRjb21lczogT1IsIFJSLCBSRChSaXNrIGRpZmZlcmVuY2UpDQpkYXRhKGRhdC5iY2cpICAgICANCmRhdF9sbk9SIDwtIGVzY2FsYyhtZWFzdXJlPSJPUiIsIGFpPXRwb3MsIGJpPXRuZWcsIGNpPWNwb3MsIGRpPWNuZWcsIGRhdGE9ZGF0LmJjZykNCmhlYWQoZGF0X2xuT1IgLDMpDQpgYGANCg0KIyMjIGxuKE9SKeydmCBJVijsl63rtoTsgrDqsIDspJHsuZgp67Cp67KVIOydtOyaqe2VnCDthrXtlanstpTsoJXsuZgg6rOE7IKwIA0KYGBge3J9DQpyZXMyIDwtIHJtYSh5aSwgdmksIGRhdGE9IGRhdF9sbk9SLCBtZXRob2Q9IkZFIikgDQpyZXMyDQpgYGANCiRsbihcaGF0e09SfSkkPS0wLjQzNjEsICRTRShcaGF0e1x0aGV0YX0pJD0wLjA0MjMsIDk1JUNJPVstMC41MTkwLCAtMC4zNTMzXQ0KDQpgYGB7cn0NCnByZWRpY3QocmVzMiwgdHJhbnNmPWV4cCwgZGlnaXRzPTQpDQpgYGANCu2VtOyEnTogcHJlZGljdCgp7ZWo7IiY66W8IO2Gte2VtCDsp4DsiJgg67OA7ZmY65CcIOqwkuydgCAkXGhhdHtPUn0kPWV4cCgtMC40MzYxKT0wLjY0NjUsIDk1JUNJIGZvciAkXGhhdHtPUn0kPVswLjU5NTEsIDAuNzAyNF0NCg0KLT5CQ0cg67Cx7Iic6rWw7JeQ7IScIOuMgOyhsOq1sOyXkCDruYTtlbQg6rKw7ZW167Cc7IOd7J20IDM1JSDqsJDshoztlZzri6Tqs6Ag7ZWgIOyImCDsnojri6QuDQoNCg0KIyNbRXgzXSBGaXhlZCBlZmZlY3QgbW9kZWwgdXNpbmcgTUgt7Jik7KaI67mEIChPUikg7J207JqpDQpNYW50ZWwtSGFlbnN6ZWwoTUgp67Cp67KV7J2AIOydtOu2hO2YlSDsnpDro4zsl5DshJzrp4wg7IKs7Jqp7ZWgIOyImCDsnojquLDsl5AsDQrtmqjqs7ztgazquLDqsIAg7JyE7ZeY67mEKFJSKSwg7Jik7KaI67mEKE9SKSwg7JyE7ZeY7LCoKFJEKeyduCDqsr3smrDsl5Ag7IKs7Jqp7ZWgIOyImCDsnojri6QuDQpSCe2VqOyImDrvg6ggcm1hLm1o4Yi64Yi7KCkNCmBgYHtyfQ0KcmVzMyA8LSBybWEubWgoYWk9dHBvcywgYmk9dG5lZywgY2k9Y3BvcywgZGk9Y25lZywgZGF0YT1kYXQuYmNnLCBtZWFzdXJlPSJPUiIpIA0KcmVzMw0KYGBgDQoNCu2VqOyImCBybWEubWjripQgbG4kXGhhdHtPUn0k7JmAICRcaGF0e09SfSQg6rCB6rCB7J2YIOqysOqzvOulvCDrs7Tsl6zspIwNCg0K4pGgIGxuJFxoYXR7T1J9JD0tMC40NzYzLCBTRShsbiRcaGF0e09SfSQpPTAuMDQxMCwgOTUlQ0kgZm9yIGxuJFxoYXR7T1J9JOGIuz1bLTAuNTUzOCwtMC4zOTMwXQ0K4pGhCSRcaGF0e09SfSQ9MC42MjI5LCA5NSVDSSBmb3IgJFxoYXR7T1J9JD1bMC41NzQ4LCAwLjY3NTBdDQrikaIgQ01I6rKA7KCVOiDrqqjrk6Ag6rCc67OE7Jew6rWs7J2YICBPUuqwgCAx7J247KeAIOqygOyglQ0K74OoIHAtdmFsPDAuMDAx7J2066+A66GcIOuqqOuToCDqsJzrs4Tsl7DqtazsnZggT1LqsIAgMeuhnCDrj5nsnbztlZjri6Tqs6Ag7ZWgIOyImCDsl4bri6QuDQoNCiMjIFtFeDRdIEZpeGVkIGVmZmVjdCBtb2RlbCB1c2luZyBNSC3snITtl5jruYQgKFJSKSDsnbTsmqkNCmBgYHtyfQ0KcmVzNCA8LSBybWEubWgoYWk9dHBvcywgYmk9dG5lZywgY2k9Y3BvcywgZGk9Y25lZywgZGF0YT1kYXQuYmNnLCBtZWFzdXJlPSJSUiIpIA0KcmVzNA0KYGBgDQoNCk1hbnRlbC1IYWVuc3plbChNSCnrsKnrspXsl5Ag7J2Y7ZWcIOuhnOq3uCDsnITtl5jruYTsnZgg7Ya17ZWp7LaU7KCV7LmY64qUIOuLpOydjOqzvCDqsJnri6QuDQoNCuKRoCAkbG5caGF0e1JSfSQ9PS0wLjQ1MzcsICRTRShsblxoYXR7UlJ9KSQ9MC4wMzkzLA0KOTUlQ0kgZm9yICRsblxoYXR7UlJ9JD1bLTAuNTMwOCwtMC4zNzY2XQ0K74OoIHAtdmFsPDAuMDAx7J2066+A66GcIEJDR+uwseyLoOq1sOqzvCDrjIDsobDqtbDqsITsl5Ag6rKw7ZW167Cc7IOd7J20IOuLpOultOuLpOqzoCDtlaAg7IiYIOyeiOuLpC4NCg0K4pGhJGhhdHtSUn0kPTAuNjM1MywgOTUlQ0kgZm9yINy0JGhhdHtSUn0kPVswLjU4ODEsIDAuNjg2Ml0NCi0+64yA7KGw6rWw7JeQIOu5hO2VtCBCQ0frsLHsi6DqtbDsl5DshJwg6rKw7ZW167Cc7IOd7J20IDM2LjUlIOqwkOyGjO2VnOuLpOqzoCDtlaAg7IiYIOyeiOuLpC4gDQoNCiMjIFtFeDVdIEZpeGVkIGVmZmVjdCBtb2RlbCB1c2luZyBNSC3snITtl5jssKggKFJEKSDsnbTsmqkNCmBgYHtyfQ0KcmVzNTwtIHJtYS5taChhaT10cG9zLCBiaT10bmVnLCBjaT1jcG9zLCBkaT1jbmVnLCBkYXRhPWRhdC5iY2csIG1lYXN1cmU9IlJEIikgDQpyZXM1DQpgYGANCk1hbnRlbC1IYWVuc3plbChNSCnrsKnrspXsl5Ag7J2Y7ZWcIOychO2XmOywqOydmCDthrXtlanstpTsoJXsuZjripQg64uk7J2M6rO8IOqwmeuLpC4NCg0KJFxoYXR7UkR9JD0wLjAwMzMsIDk1JUNJIGZvciAkaGF0e1JEfSQ9Wy0wLjAwMzksICAtMC4wMDI3XQ0KLT5wLXZhbDwwLjAwMeydtOuvgOuhnCDsnITtl5jssKjqsIAgMOydtOudvOuKlCDqt4DrrLTqsIDshKTsnYQg6riw6rCB7ZWoLg0K7KaJLCBCQ0frsLHsi6Ag6rWw6rO8IOuMgOyhsOq1sCDqsITsl5Ag6rKw7ZW167Cc7IOd7J20IOuLpOultOuLpOqzoCDtlaAg7IiYIOyeiOqzoCwNCuuMgOyhsCDqtbDsl5Ag67mE7ZW0IEJDR+uwseyLoCDqtbDsl5DshJwg6rKw7ZW167Cc7IOd7J20IDAuMzMlIOuCruuLpOqzoCDtlaAg7IiYIOyeiOuLpC4gDQoNCiMjIFtFeDZdIEZpeGVkIGVmZmVjdCBtb2RlbCB1c2luZyBQZXRvIC3smKTspojruYQgKE9SKSDsnbTsmqkNClBldG8g67Cp67KV7J2AIOyYpOymiOu5hOydmCDthrXtlansl5Drp4wg7IKs7Jqp7ZWgIOyImCDsnojri6QuDQoNClIJ7ZWo7IiYOu+DqCBybWEucGV0b+GIuiAoKQ0KYGBge3J9DQpyZXM2PC0gcm1hLnBldG8oYWk9dHBvcywgYmk9dG5lZywgY2k9Y3BvcywgZGk9Y25lZywgZGF0YT1kYXQuYmNnKSANCnJlczYNCmBgYA0K7ZWo7IiYIHJtYS5wZXRv64qUIGxuJFxoYXR7T1J9JOyZgCAkXGhhdHtPUn0kIOqwgeqwgeydmCDqsrDqs7zrpbwg67O07Jes7KSMDQoNCuKRoCBsbiRcaGF0e09SfSQ9LTAuNDc0NCwgU0UobG4kXGhhdHtPUn0kKT0wLjA0MDcsIDk1JUNJIGZvciBsbiRcaGF0e09SfSThiLs9Wy0wLjU1NDEsIC0wLjM5NDhdDQoNCi0+cC12YWw8MC4wMDHsnbTrr4DroZwgQkNH67Cx7IugIOq1sOqzvCDrjIDsobAg6rWw6rCE7JeQIOqysO2VteuwnOyDneydtCDri6TrpbTri6Tqs6Ag7ZWgIOyImCDsnojri6QuIA0KDQrikaEJJFxoYXR7T1J9JD0wLjYyMjIsIDk1JUNJIGZvciAkXGhhdHtPUn0kPVswLjU3NDYsIDAuNjczOF0NCg0KLT7rjIDsobAg6rWw7J2YIOqysO2VteuwnOyDneyXkCDrjIDtlZwgT1Lsl5Ag67mE7ZW0IEJDR+uwseyLoCDqtbDsnZgg6rKw7ZW167Cc7IOd7JeQIOuMgO2VnCBPUuqwgCAwLjYy67Cw65286rOgDQrtlaAg7IiYIOyeiOuLpC4gDQoNCiMjICBbRXg3XSBSYW5kb20gZWZmZWN0IG1vZGVsIHVzaW5nIERMLe2Pieq3oOywqCAoTUQp7J207JqpDQpNROyZgCBNROydmCDrtoTsgrAg6rOE7IKwIA0KYGBge3J9DQpkYXRfTUQgPC0gZXNjYWxjKG1lYXN1cmU9Ik1EIiwgbTFpPW0xaSwgc2QxaT1zZDFpLCBuMWk9bjFpLCBtMmk9bTJpLCBzZDJpPXNkMmksIG4yaT1uMmksIGRhdGE9ZGF0KQ0KYGBgDQoNCk1E7J2YIERlclNpbW9uaWFuLUxhaXJkIOuwqeuylSDthrXtlanstpTsoJXsuZgg6rOE7IKwIA0KYGBge3J9DQpyZXM3PC0gcm1hKHlpLCB2aSwgZGF0YT0gZGF0X01ELCBtZXRob2Q9IkRMIikgDQpyZXM3DQpgYGANCg0K4pGgIERM67Cp67KV7Jy866GcIOy2lOygleuQnCDsl7DqtazqsIQg67aE7IKwICRcaGF0XHRhdV4yPTIwNS40MDk0JA0KDQrikaEgUeydmCDsnKDsnZjtmZXrpaDsnbQgcOKAkHZhbDwwLjAwMDHroZwg6rCc67OE7Jew6rWs65Ok7J2YIO2aqOqzvO2BrOq4sOqwgCDsg4Hri7ntnogg7J207KeI7KCB7J6ELgkNCu+DqFJhbmRvbQllZmZlY3QJbW9kZWzroZwg7Ya17ZWp7LaU7KCV7LmY66W8IOq1rO2VmOuKlCDqsoPsnbQg7KCB7KCI7ZWoDQoNCuKRoiAkXGhhdHtNRH09LTEzLjk4MTcsIFNFKFxoYXR7TUR9KT01LjEyNjcsIHAtdmFsPTAuMDA2NCw5NSVDST1bLTI0LjAyOTksIC0zLjkzMzldJA0KDQotPiDtirnrs4TsuZjro4wg6rWw7J2YIOyeheybkOydvOyImOqwgCDsnbzrsJjsuZjro4wg6rWw7J2YIOqyg+uztOuLpCAxMy45OOydvCDsp6fri6Tqs6Ag7ZWgIOyImCDsnojri6QuDQoNCg0KIyMgIFtFeDhdIFJhbmRvbSBlZmZlY3QgbW9kZWwgdXNpbmcgREwt7Jik7KaI67mEIChPUikg7J207JqpDQpsbihPUinsnZggRGVyU2ltb25pYW4tTGFpcmQg67Cp67KVIO2Gte2Vqey2lOygley5mCDqs4TsgrAgDQpgYGB7cn0NCiNkYXRfbG5PUiA8LSBlc2NhbGMobWVhc3VyZT0iT1IiLCBhaT10cG9zLCBiaT10bmVnLCBjaT1jcG9zLCBkaT1jbmVnLCBkYXRhPWRhdC5iY2cpICAgICANCnJlczg8LSBybWEoeWksIHZpLCBkYXRhPSBkYXRfbG5PUiwgbWV0aG9kPSJETCIpIA0KcmVzOA0KYGBgDQoNCuKRoCBETOuwqeuyleycvOuhnCDstpTsoJXrkJwg7Jew6rWs6rCEIOu2hOyCsCAkXGhhdFx0YXVeMj0yMC4zNjYzJA0KDQrikaEgUeydmCDsnKDsnZjtmZXrpaDsnbQgcOKAkHZhbDwwLjAwMDHroZwg6rCc67OE7Jew6rWs65Ok7J2YIO2aqOqzvO2BrOq4sOqwgCDsg4Hri7ntnogg7J207KeI7KCB7J6ELgkNCi0+UmFuZG9tCWVmZmVjdAltb2RlbOuhnCDthrXtlanstpTsoJXsuZjrpbwg6rWs7ZWY64qUIOqyg+ydtCDsoIHsoIjtlagNCg0K4pGiICRsbihcaGF0e01EfSk9LTEzLjk4MTcsIFNFKGxuKFxoYXR7TUR9KSk9NS4xMjY3LCBwLXZhbD0wLjAwMDEsOTUlQ0k9Wy0xLjEyNDIsLTAuMzcwNl0kDQoNCi0+JFxoYXR7TUR9PWV4cCgtMTMuOTgxNyk9MC40NzM2LCA5NSVDSSBmb3IgXGhhdHtPUn09WzAuMzI0OSwgMC42OTAzXSQNCg0K64yA7KGwIOq1sOyXkCDruYTtlbQgQkNHIOuwseyLoCDqtbDsl5DshJwg6rKw7ZW167Cc7IOd7J20IDUzJSDqsJDshoztlZzri6Tqs6Ag7ZWgIOyImCDsnojri6QuDQoNCiMjICBbRXg5XSBIZXRlcm9nZW5laXR5IDogRm9yZXN0IHBsb3QNCmBgYHtyfQ0KcmVzX1JFIDwtIHJtYSh5aSwgdmksIGRhdGE9IGRhdF9sbk9SLCBtZXRob2Q9IkRMIikNCmZvcmVzdChyZXNfUkUsIHhsaW09YygtMTYsIDEwKSwgYXQ9bG9nKGMoLjA1LCAuMjUsIDEsIDQpKSwgYXRyYW5zZj1leHAsIA0KICAgICAgIGlsYWI9Y2JpbmQoZGF0LmJjZyR0cG9zLCBkYXQuYmNnJHRuZWcsIGRhdC5iY2ckY3BvcywgZGF0LmJjZyRjbmVnKSwgDQogICAgICAgaWxhYi54cG9zPWMoLTkuNSwtOCwtNiwtNC41KSwgY2V4PS43NSwgc2hvd3dlaWdodD1UUlVFKQ0KDQp0ZXh0KGMoLTkuNSwtOCwtNiwtNC41KSwgMTUsIGMoIlRCKyIsICJUQi0iLCAiVEIrIiwgIlRCLSIpLCBjZXg9MC43NSkNCg0KdGV4dChjKC04Ljc1LC01LjI1KSwgMTYsIGMoIlZhY2NpbmF0ZWQiLCAiQ29udHJvbCIpLCBjZXg9MC43NSkNCnRleHQoNSwgMTUsICJXZWlnaHRzIiwgcG9zPTIsIGNleD0wLjc1KQ0KdGV4dCg5LCAxNSwgIk9SWzk1JSBDSV0iLCBwb3M9MiwgY2V4PTAuNzUpDQpgYGANCiANCiMjICBbRXgxMF0gSGV0ZXJvZ2VuZWl0eSA6IFEtc3RhdGlzdGljcyAmIEheMg0KYGBge3J9DQpyZXMgPC0gcm1hKGFpPXRwb3MsIGJpPXRuZWcsIGNpPWNwb3MsIGRpPWNuZWcsIGRhdGE9ZGF0LmJjZywgbWVhc3VyZT0iT1IiLCBtZXRob2Q9IkRMIikgICANCmBgYA0KDQpgYGB7cn0NCiMgUS12YWx1ZQ0KcmVzJFFFDQpgYGANCg0KYGBge3J9DQpyZXMkUUVwDQpgYGANCg0KYGBge3J9DQpzdW1tYXJ5KHJlcykNCm5hbWVzKHJlcykNCmBgYA0KDQojIyBbRXgxMV0gSGV0ZXJvZ2VuZWl0eSA6IHRhdV4yIGFuZCBJXjIgc3RhdGlzdGljcw0KYGBge3J9DQpyZXMkSTINCmBgYA0KDQpgYGB7cn0NCnJlcyR0YXUyDQpgYGANCg0KYGBge3J9DQpjb25maW50KHJlcykgIyBjb25maWRlbmNlIGludGVydmFscw0KYGBgDQoNCiRJXjIkIO2GteqzhOufiT05Mi42NDU1LCA5NSVDST1bODEuNzQlLCA5Ny42MCVd7J2066+A66GcIOustOyLnO2VoCDsiJgg7JeG64qUIO2GteqzhOyggQ0K7J207KeI7ISx7J20IOyeiOuLpOqzoCDtlaAg7IiYIOyeiOuLpC4NCuKAuyDsnbTsp4jshLEg7YyQ64uo7Jes67aA64qUIO2aqOqzvO2BrOq4sOydmCDrsKntlqXqs7wg7YGs6riwLCBRIO2GteqzhOufieydhCDsnbTsmqntlZwg6rCA7ISk6rKA7KCVIOqysOqzvCwNCiRJXjIkIO2GteqzhOufieydmCDsi6DrorDqtazqsIQg65Ox7J2EIO2VqOq7mCDqs6DroKTtlbTslbwg7ZWc64ukLiANCg0KIyMgW0V4MTJdIFN1Ymdyb3VwIGFuYWx5c2lzDQrqsJzrs4Qg7Jew6rWs65Ok6rCEIO2aqOqzvO2BrOq4sOydmCDsnbTsp4jshLHsnZgg7JuQ7J247J2EIO2MjOyVhe2VmOq4sCDsnITtlZjsl6wsIOyghOyytCDrjIDsg4Eg7Jew6rWs65Ok7J2EIOuPmeyniOyggQ0K7J206528IOyYiOyDgeuQmOuKlCDtlZjsnITqt7jro7nsnLzroZwg6rWs67aE7ZWY7JesIOuplO2DgOu2hOyEneydhCDtlZjsnIQg6re466O567OE66GcIOqwgeqwgSDsi6Tsi5ztlZzri6QNCg0KYGBge3J9DQojIFRvdGFsIGFuZCBzdWJncm91cHMNCnJlcyAgIDwtIHJtYShhaT10cG9zLCBiaT10bmVnLCBjaT1jcG9zLCBkaT1jbmVnLCBkYXRhPWRhdC5iY2csIG1lYXN1cmU9IlJSIiwgc2xhYj1wYXN0ZShhdXRob3IsIHllYXIsIHNlcD0iLCAiKSwgbWV0aG9kPSJETCIpIA0KcmVzLnMgPC0gcm1hKGFpPXRwb3MsIGJpPXRuZWcsIGNpPWNwb3MsIGRpPWNuZWcsIGRhdGE9ZGF0LmJjZywgbWVhc3VyZT0iUlIiLCBzdWJzZXQ9KGFsbG9jPT0ic3lzdGVtYXRpYyIpLCBtZXRob2Q9IkRMIikgICANCnJlcy5yIDwtIHJtYShhaT10cG9zLCBiaT10bmVnLCBjaT1jcG9zLCBkaT1jbmVnLCBkYXRhPWRhdC5iY2csIG1lYXN1cmU9IlJSIiwgc3Vic2V0PShhbGxvYz09InJhbmRvbSIpLCBtZXRob2Q9IkRMIikgIA0KcmVzLmEgPC0gcm1hKGFpPXRwb3MsIGJpPXRuZWcsIGNpPWNwb3MsIGRpPWNuZWcsIGRhdGE9ZGF0LmJjZywgbWVhc3VyZT0iUlIiLCBzdWJzZXQ9KGFsbG9jPT0iYWx0ZXJuYXRlIiksIG1ldGhvZD0iREwiKSAgDQpgYGANCg0KYGBge3J9DQpmb3Jlc3QocmVzLCB4bGltPWMoLTE2LCA2KSwgYXQ9bG9nKGMoLjA1LCAuMjUsIDEsIDQpKSwgYXRyYW5zZj1leHAsIA0KICAgICAgIGlsYWI9Y2JpbmQoZGF0LmJjZyR0cG9zLCBkYXQuYmNnJHRuZWcsIGRhdC5iY2ckY3BvcywgZGF0LmJjZyRjbmVnKSwgDQogICAgICAgaWxhYi54cG9zPWMoLTkuNSwtOCwtNiwtNC41KSwgY2V4PS43NSwgeWxpbT1jKC0xLDI3KSwgIG9yZGVyPW9yZGVyKGRhdC5iY2ckYWxsb2MpLCANCiAgICAgICByb3dzPWMoMzo0LCA5OjE1LCAyMDoyMyksICAgeGxhYj0iUmVsYXRpdmUgUmlzayIsIG1sYWI9IlJFIE1vZGVsIGZvciBBbGwgc3R1ZGllcyIpDQp0ZXh0KC0xNiwgYygyNCwgMTYsIDUpLCBwb3M9NCwgYygiU3lzdGVtYXRpYyBBbGxvY2F0aW9uIiwiUmFuZG9tIEFsbG9jYXRpb24iLCAiQWx0ZXJuYXRlIEFsbG9jYXRpb24iKSwgY2V4PS43NSwgZm9udD00KQ0KdGV4dChjKC05LjUsLTgsLTYsLTQuNSksIDI2LCBjKCJUQisiLCAiVEItIiwgIlRCKyIsICJUQi0iKSwgY2V4PTAuNzUpDQp0ZXh0KGMoLTguNzUsLTUuMjUpLCAyNywgYygiVmFjY2luYXRlZCIsICJDb250cm9sIiksIGNleD0wLjc1KQ0KdGV4dCgtMTYsICAgICAgICAgICAgMjYsICJBdXRob3IocykgYW5kIFllYXIiLCBwb3M9NCwgY2V4PTAuNzUpDQp0ZXh0KDYsICAgICAgICAgICAgICAyNiwgIlJlbGF0aXZlIFJpc2sgWzk1JSBDSV0iLCBwb3M9MiwgY2V4PTAuNzUpDQoNCiMgQWRkIHBvbHlnb25zIHRvIGZvcmVzdCBwbG9zdHMgZm9yIHN1Ymdyb3VwDQphZGRwb2x5KHJlcy5zLCByb3c9MTguNSwgY2V4PS43NSwgYXRyYW5zZj1leHAsIG1sYWI9IlJFIE1vZGVsIGZvciBTdWJncm91cCIpDQphZGRwb2x5KHJlcy5yLCByb3c9Ny41LCBjZXg9Ljc1LCBhdHJhbnNmPWV4cCwgbWxhYj0iUkUgTW9kZWwgZm9yIFN1Ymdyb3VwIikNCmFkZHBvbHkocmVzLmEsIHJvdz0xLjUsIGNleD0uNzUsIGF0cmFuc2Y9ZXhwLCBtbGFiPSJSRSBNb2RlbCBmb3IgU3ViZ3JvdXAiKQ0KYGBgDQoNCmBgYHtyfQ0KcmVzLnMNCnJlcy5yDQpyZXMuYQ0KYGBgDQoNCg0KIyNbRXgxM10gUHVibGljYXRpb24gYmlhcyA6IEZ1bm5lbCBwbG90DQpgYGB7cn0NCmRhdCA8LSBnZXQoZGF0YShkYXQuaGFja3NoYXcxOTk4KSkNCnJlcyA8LSBybWEoeWksIHZpLCBkYXRhPWRhdCwgbWVhc3VyZT0iT1IiLCBtZXRob2Q9IkZFIikNCmBgYA0KDQpgYGB7cn0NCnBhcihtZnJvdz1jKDEsMykpDQpmdW5uZWwocmVzLCBhdHJhbnNmPWV4cCwgeGxhYj0iT2RkcyBSYXRpbyIsIGF0PWxvZyhjKC4yNSwgLjUsIDEsIDIsIDQpKSkNCiMgY29udG91ci1lbmhhbmNlZCBmdW5uZWwgcGxvdCBjZW50ZXJlZCBhdCAwDQpmdW5uZWwocmVzLCBsZXZlbD1jKDkwLCA5NSwgOTkpLCBzaGFkZT1jKCJ3aGl0ZSIsImdyYXkiLCJkYXJrZ3JheSIpLCANCiAgICAgICByZWZsaW5lPTAsIGF0cmFuc2Y9ZXhwLCB4bGFiPSJPZGRzIFJhdGlvIiwgYXQ9bG9nKGMoLjI1LCAuNSwgMSwgMiwgNCkpKQ0KIyBjb250b3VyLWVuaGFuY2VkIGZ1bm5lbCBwbG90IDogWS1heGlzPWludmVyc2Ugb2YgdGhlIHN0YW5kYXJkIGVycm9yDQpmdW5uZWwocmVzLCBsZXZlbD1jKDkwLCA5NSwgOTkpLCBzaGFkZT1jKCJ3aGl0ZSIsImdyYXkiLCJkYXJrZ3JheSIpLCANCiAgICAgICByZWZsaW5lPTAsIGF0cmFuc2Y9ZXhwLCB4bGFiPSJPZGRzIFJhdGlvIiwgYXQ9bG9nKGMoLjI1LCAuNSwgMSwgMiwgNCkpLCB5YXhpcz0ic2VpbnYiKQ0KYGBgDQpY7LaV7J2AIGVmZmVjdCBzaXplLCBZ7LaV7J2AIO2RnOuzuO2BrOq4sCjtkZzrs7jsiJgsIFNFLCDrtoTsgrAg65OxKeulvCDrgpjtg4DrgrTqs6AsIOy2nO2MkOyCkOuapOumvOydtA0K7JeG7Jy866m0IO2RnOuzuO2BrOq4sOqwgCDsnpHsnYAg7Jew6rWs65Ok7J2AIOyVhOuemOyqveyXkCDqs6jqs6Dro6gsIO2RnOuzuO2BrOq4sOqwgCDtgbAg7Jew6rWs65Ok7J2AIOycl+yqveyXkA0K7KeR7KSR7KCB7Jy866GcIOuztOyehC4NCg0K7LKr67KI7Ke4IOq3uOumvOyXkOyEnCDsoozsuKEg7ZWY64uoIOyXsOq1rOuTpOydtCDsl4bsnYzvg6gtPu2RnOuzuO2BrOq4sCDsnpHqs6AsIO2aqOqzvO2BrOq4sOqwgCAx67O064ukIOyekeydgCDsl7Dqtazrk6TsnYANCu2PrO2VqOuQmOyWtOyeiOyngCDslYrsnLzrr4DroZwsIOy2nO2MkOyCkOuapOumvOydtCDsnZjsi6zrkKgNCg0KIyNbRXgxNF0gUHVibGljYXRpb24gYmlhcyA6IEJlZ2figJlzIHRlc3QsIEVnZ2Vy4oCZcyB0ZXN0IA0KYGBge3J9DQojIEJlZ2figJlzIHRlc3QNCnJhbmt0ZXN0KHJlcykgDQpgYGANCnAtdmFsdWU9MC4yMTU3IC0+74OgIOy2nO2MkCDruYTrmqTrprzsnbQg7J6I64uk6rOgIO2VoCDsiJgg7JeG64ukDQoNCmBgYHtyfQ0KIyBFZ2dlcuKAmXMgdGVzdCANCnJlZ3Rlc3QocmVzKQ0KYGBgDQpwLXZhbHVlPTAuMDEwMCAtPu+DoCDstpztjJAg67mE65qk66a87J20IOyeiOuLpOqzoCDtlaAg7IiYIOyXhuuLpA0KDQrigLsgQmVnZywgRWdnZXIg67Cp67KV7J2AIOuplO2DgCDrtoTshJ3sl5Ag7Y+s7ZWo65CcIOyXsOq1rOyImOqwgCAxMOqwnOuztOuLpCDsnpHqsbDrgpgsDQrsi6zqsIHtlZwg7Lac7YyQIOu5hOuapOumvOydtCDsl4bripQg6rK97JqwIOqygOygleugpeydtCDrgq7ri6QuIO2ajOq3gOu2hOyEnSDrsKnrspXsnYQg7J207Jqp7ZWcDQpFZ2dlcuuwqeuyleydtCBCZWdn7JeQIOu5hO2VtCDqsoDsoJXroKXsnbQg64uk7IaMIOuGkuuLpC4gDQoNCiMjW0V4MTVdIFB1YmxpY2F0aW9uIGJpYXMgOiBUcmltLWFuZC1maWxsLCBGYWlsLXNhZmUgTg0KYGBge3J9DQpyZXMgPC0gcm1hKHlpLCB2aSwgZGF0YT1kYXQsIG1ldGhvZD0iRkUiKQ0KcmVzLnRmIDwtIHRyaW1maWxsKHJlcykNCnJlcy50Zg0KYGBgDQpUcmltLWFuZC1maWxs6rKw6rO8OuybkOuemCDthrXtlanstpTsoJXsuZjripQgMC4xODU3LCDsiJjsoJXrkJwg7Ya17ZWp7LaU7KCV7LmY64qUIDAuMTU1NQ0KDQpgYGB7cn0NCmZ1bm5lbChyZXMudGYsIGF0cmFuc2Y9ZXhwLCB4bGFiPSJPZGRzIFJhdGlvIiwgYXQ9bG9nKGMoLjI1LCAuNSwgMSwgMiwgNCkpKQ0KYGBgDQogDQpgYGB7cn0NCmZzbih5aSwgdmksIGRhdGE9ZGF0LCB0eXBlPSJSb3NlbnRoYWwiKQ0KYGBgDQpGYWlsLXNhZmUgTiDqsrDqs7w6IDVrKzEw67O064ukIO2BrOuptCDsoITssrQg7Zqo6rO87YGs6riw7JeQIOuvuOy5mOuKlCDsmIHtlqXsnbQNCu2BrOyngCDslYrri6Tqs6Ag7ZWc64ukLiBGYWlsLXNhZmUgTuydgCAzOTPsnLzroZwgNSozNysxMD0xOTUg67O064ukDQrtgazrr4DroZwg7KCE7LK0IO2aqOqzvCDtgazquLDqsIAg7Lac7YyQIOu5hOuapOumvOyXkCDsmIHtlqXsnYQg67Cb64qU64uk6rOgIO2VoCDsiJgg7JeG64ukLg0KDQojI1tFeDE2XSBDdW11bGF0aXZlIG1ldGEtYW5hbHlzaXMgKGkuZS4sIGFkZGluZyBvbmUgb2JlcnZhdGlvbiBhdCBhIHRpbWUpIA0KYGBge3J9DQpyZXMgPC0gcm1hKHlpLCB2aSwgZGF0YT1kYXQsIG1ldGhvZD0iRkUiLCBzbGFiPXBhc3RlKGF1dGhvciwgeWVhciwgc2VwPSIsIikpDQpgYGANCg0KYGBge3J9DQojIEJ5IHRoZSBzaXplIG9mIGNhc2UgDQpjdW11bF9jYXNlIDwtIGN1bXVsKHJlcywgb3JkZXI9b3JkZXIoZGF0JGNhc2VzLCBkZWNyZWFzaW5nID0gVFJVRSkpDQpmb3Jlc3QoY3VtdWxfY2FzZSwgYXQ9bG9nKGMoLjc1LCAxLCAyKSksIGF0cmFuc2Y9ZXhwLCBjZXg9MC43NSwgeGxhYj0iT2RkcyBSYXRpbyIpDQp0ZXh0KGMoLTAuNiwwLjg1KSwgNDAsIGMoIlN0dWR5IiwgIk9SIFs5NSUgQ0ldIiksIGNleD0wLjc1KQ0KYGBgDQoNCmBgYHtyfQ0KIyBCeSBwdWJsaXNoZWQgeWVhciAoZnJvbSBuZXcgdG8gb2xkKQ0KY3VtdWxfeWVhciA8LSBjdW11bChyZXMsIG9yZGVyPW9yZGVyKGRhdCR5ZWFyLCBkZWNyZWFzaW5nID0gVFJVRSkpDQpmb3Jlc3QoY3VtdWxfeWVhciwgYXQ9bG9nKGMoLjc1LCAxLCAyKSksIGF0cmFuc2Y9ZXhwLCBjZXg9MC43NSwgeGxhYj0iT2RkcyBSYXRpbyIpDQp0ZXh0KGMoLTAuNiwwLjg1KSwgNDAsIGMoIlN0dWR5IiwgIk9SIFs5NSUgQ0ldIiksIGNleD0wLjc1KQ0KYGBgDQoNCiMjW0V4MTddIFNlbnNpdGl2aXR5IGFuYWx5c2lzIA0KYGBge3J9DQojIyMgY2FsY3VsYXRlIGxvZyByZWxhdGl2ZSByaXNrcyBhbmQgY29ycmVzcG9uZGluZyBzYW1wbGluZyB2YXJpYW5jZXMNCmRhdCA8LSBlc2NhbGMobWVhc3VyZT0iUlIiLCBhaT10cG9zLCBiaT10bmVnLCBjaT1jcG9zLCBkaT1jbmVnLCBkYXRhPWRhdC5iY2cpICANCnJlcyA8LSBybWEoeWksIHZpLCBkYXRhPWRhdCkgICMgZGVhdWx064qUIHJhbmRvbSBlZmZlY3QNCmxlYXZlMW91dChyZXMpOyBMTzE8LSBsZWF2ZTFvdXQocmVzLCB0cmFuc2Y9ZXhwKTsNCmBgYA0KDQpgYGB7cn0NCiMjIyBtZXRhLWFuYWx5c2lzIG9mIHRoZSAobG9nKSByZWxhdGl2ZSByaXNrcyB1c2luZyB0aGUgTWFudGVsLUhhZW5zemVsIG1ldGhvZA0KcmVzIDwtIHJtYS5taChtZWFzdXJlPSJSUiIsIGFpPXRwb3MsIGJpPXRuZWcsIGNpPWNwb3MsIGRpPWNuZWcsIGRhdGE9ZGF0LmJjZykNCmxlYXZlMW91dChyZXMpO0xPMjwtIGxlYXZlMW91dChyZXMsIHRyYW5zZj1leHApOw0KYGBgDQoNCmBgYHtyfQ0KIyMjIG1ldGEtYW5hbHlzaXMgb2YgdGhlIChsb2cpIG9kZHMgcmF0aW9zIHVzaW5nIFBldG8ncyBtZXRob2QNCnJlcyA8LSBybWEucGV0byhhaT10cG9zLCBiaT10bmVnLCBjaT1jcG9zLCBkaT1jbmVnLCBkYXRhPWRhdC5iY2cpI09S7J20IGRlZmF1bHTsnoQNCmxlYXZlMW91dChyZXMpO0xPMzwtIGxlYXZlMW91dChyZXMsIHRyYW5zZj1leHApOw0KTE8xO0xPMjtMTzMNCmBgYA0KDQojI1tFeDE4XSBJUlIg6riw7KSA7Jy866GcIGhhcnQxOTk5IOuNsOydtO2EsCDrqZTtg4Ag67aE7ISdIOuwjyDsi5zqsIHtmZQNCg0KYGBge3J9DQojZGF0LmhhcnQxOTk5OiDsmYDtjIzrprAg6rWwIHZzIOuMgOyhsOq1sCAo7Ius67Cp7IS464+ZIO2ZmOyekOuMgOyDgSnsnZgg64eM7KG47KadIOuwnOyDneyImCwgZXZlbnRzIGNvdW50czogTG9nIEluY2lkZW5jZSBSYXRlIHJhdGlvKElSUiksIEluY2lkZW5jZSBSYXRlIERpZmZlcmVuY2UoSVJEKSwgc3F1cmUtcm9vdCB0cmFuc2Zvcm1lZCBpbmNpZGVuY2UgcmF0ZSBkaWZmZXJlbmNlKElSU0QpDQpkYXQgPC0gZ2V0KGRhdGEoZGF0LmhhcnQxOTk5KSkNCiMjIyBjYWxjdWxhdGUgbG9nIGluY2lkZW5jZSByYXRlIHJhdGlvcyBhbmQgY29ycmVzcG9uZGluZyBzYW1wbGluZyB2YXJpYW5jZXMNCmRhdCA8LSBlc2NhbGMobWVhc3VyZT0iSVJSIiwgeDFpPXgxaSwgeDJpPXgyaSwgdDFpPXQxaSwgdDJpPXQyaSwgZGF0YT1kYXQpDQpkYXQNCmBgYA0KDQpgYGB7cn0NCiMjIyBtZXRhLWFuYWx5c2lzIG9mIGxvZyBpbmNpZGVuY2UgcmF0ZSByYXRpb3MgdXNpbmcgYSByYW5kb20tZWZmZWN0cyBtb2RlbA0KcmVzIDwtIHJtYSh5aSwgdmksIGRhdGE9ZGF0KQ0KcmVzDQpgYGANCg0KYGBge3J9DQojIyMgYXZlcmFnZSBpbmNpZGVuY2UgcmF0ZSByYXRpbyB3aXRoIDk1JSBDSQ0KcHJlZGljdChyZXMsIHRyYW5zZj1leHApDQpgYGANCg0KYGBge3J9DQojIyMgZm9yZXN0IHBsb3Qgd2l0aCBleHRyYSBhbm5vdGF0aW9ucw0KcGFyKG1hcj1jKDUsNCwxLDIpKQ0KZm9yZXN0KHJlcywgeGxpbT1jKC0xMSwgNSksIGF0PWxvZyhjKC4wNSwgLjI1LCAxLCA0KSksIGF0cmFuc2Y9ZXhwLA0KICAgICAgIHNsYWI9cGFzdGUwKGRhdCRzdHVkeSwgIiAoIiwgZGF0JHllYXIsICIpIiksDQogICAgICAgaWxhYj1jYmluZChwYXN0ZShkYXQkeDFpLCAiLyIsIGRhdCR0MWksIHNlcD0iICIpLA0KICAgICAgICAgICAgICAgICAgcGFzdGUoZGF0JHgyaSwgIi8iLCBkYXQkdDJpLCBzZXA9IiAiKSksDQogICAgICAgaWxhYi54cG9zPWMoLTYuNSwtNCksIGNleD0uODUpDQpvcCA8LSBwYXIoY2V4PS44NSwgZm9udD0yKQ0KdGV4dCgtMTEsIDcuNSwgIlN0dWR5IChZZWFyKSIsIHBvcz00KQ0KdGV4dCggNSwgNy41LCAiSVJSIFs5NSUgQ0ldIiwgcG9zPTIpDQp0ZXh0KGMoLTYuNSwtNCksIDguMCwgYygiV2FyZmFyaW4iLCAiQ29udHJvbCIpKQ0KdGV4dChjKC02LjUsLTQpLCA3LjUsIGMoIlN0cm9rZXMgLyBQVCIsICJTdHJva2VzIC8gUFQiKSkNCnNlZ21lbnRzKHgwPS03Ljc1LCB5MD03Ljc1LCB4MT0tMi43NSwgeTE9Ny43NSkNCnBhcihvcCkNCmBgYA0KDQpgYGB7cn0NCiMjIyBtZXRhLWFuYWx5c2lzIG9mIGluY2lkZW5jZSByYXRlIGRpZmZlcmVuY2VzIHVzaW5nIGEgcmFuZG9tLWVmZmVjdHMgbW9kZWwNCnJlcyA8LSBybWEobWVhc3VyZT0iSVJEIiwgeDFpPXgxaSwgeDJpPXgyaSwgdDFpPXQxaSwgdDJpPXQyaSwgZGF0YT1kYXQpDQpgYGANCg0KDQojI1tFeDE5XSBSUiDquLDspIDsnLzroZwgaGFydDE5OTkg642w7J207YSwIOuplO2DgCDrtoTshJ0g67CPIOyLnOqwge2ZlA0KYGBge3J9DQpyZXMgPC0gcm1hKG1lYXN1cmU9IlJSIiwgYWk9dHBvcywgYmk9dG5lZywgY2k9Y3BvcywgZGk9Y25lZywgbW9kcyA9IH4gYWJsYXQsDQogICAgICAgICAgIHNsYWI9cGFzdGUoYXV0aG9yLCB5ZWFyLCBzZXA9IiwgIiksIGRhdGE9ZGF0LmJjZykNCmBgYA0KDQoNCmBgYHtyfQ0KIyMjIGZvcmVzdCBwbG90IG9mIHRoZSBvYnNlcnZlZCByZWxhdGl2ZSByaXNrcw0KZm9yZXN0KHJlcywgYWRkZml0PUZBTFNFLCBhdHJhbnNmPWV4cCwgeGxpbT1jKC04LDUpLCB5bGltPWMoLTQuNSwxNiksIGNleD0uOCwNCiAgICAgICBvcmRlcj1vcmRlcihkYXQuYmNnJGFibGF0KSwgaWxhYj1kYXQuYmNnJGFibGF0LCBpbGFiLnhwb3M9LTIuOCwgaWxhYi5wb3M9MikNCg0KIyMjIHByZWRpY3RlZCBhdmVyYWdlIGxvZyByZWxhdGl2ZSByaXNrIGZvciAxMCwgMzAsIGFuZCA1MCBkZWdyZWVzIGFic29sdXRlIGxhdGl0dWRlDQp4IDwtIHByZWRpY3QocmVzLCBuZXdtb2RzPWMoMTAsIDMwLCA1MCkpDQoNCiMjIyBhZGQgcHJlZGljdGVkIGF2ZXJhZ2UgcmVsYXRpdmUgcmlza3MgdG8gZm9yZXN0IHBsb3QNCmFkZHBvbHkoeCRwcmVkLCBzZWk9eCRzZSwgYXRyYW5zZj1leHAsIGNvbD0id2hpdGUiLCByb3dzPS0yLA0KICAgICAgICBtbGFiPWMoIi0gYXQgMTAgRGVncmVlcyIsICItIGF0IDMwIERlZ3JlZXMiLCAiLSBhdCA1MCBEZWdyZWVzIiksIGNleD0uOCkNCmFibGluZShoPTApDQp0ZXh0KC04LCAtMSwgIk1vZGVsLUJhc2VkIEVzdGltYXRlcyBvZiBSUjoiLCBwb3M9NCwgY2V4PS44KQ0KdGV4dCgtOCwgMTUsICJBdXRob3IocykgYW5kIFllYXIiLCBwb3M9NCwgY2V4PS44KQ0KdGV4dCg1LCAxNSwgIlJlbGF0aXZlIFJpc2sgWzk1JSBDSV0iLCBwb3M9MiwgY2V4PS44KQ0KdGV4dCgtMy4zLCAxNSwgIkxhdGl0dWRlIiwgY2V4PS44KQ0KYGBgDQoNCmBgYHtyfQ0KIyMjIGZvcmVzdCBwbG90IG9mIHRoZSBvYnNlcnZlZCByZWxhdGl2ZSByaXNrcw0KanBlZygnbXlwbG90LmpwZWcnKQ0KZm9yZXN0KHJlcywgYWRkZml0PUZBTFNFLCBhdHJhbnNmPWV4cCwgeGxpbT1jKC04LDUpLCB5bGltPWMoLTQuNSwxNiksIGNleD0uOCwNCiAgICAgICBvcmRlcj1vcmRlcihkYXQuYmNnJGFibGF0KSwgaWxhYj1kYXQuYmNnJGFibGF0LCBpbGFiLnhwb3M9LTIuOCwgaWxhYi5wb3M9MikNCg0KIyMjIHByZWRpY3RlZCBhdmVyYWdlIGxvZyByZWxhdGl2ZSByaXNrIGZvciAxMCwgMzAsIGFuZCA1MCBkZWdyZWVzIGFic29sdXRlIGxhdGl0dWRlDQp4IDwtIHByZWRpY3QocmVzLCBuZXdtb2RzPWMoMTAsIDMwLCA1MCkpDQoNCiMjIyBhZGQgcHJlZGljdGVkIGF2ZXJhZ2UgcmVsYXRpdmUgcmlza3MgdG8gZm9yZXN0IHBsb3QNCmFkZHBvbHkoeCRwcmVkLCBzZWk9eCRzZSwgYXRyYW5zZj1leHAsIGNvbD0id2hpdGUiLCByb3dzPS0yLA0KICAgICAgICBtbGFiPWMoIi0gYXQgMTAgRGVncmVlcyIsICItIGF0IDMwIERlZ3JlZXMiLCAiLSBhdCA1MCBEZWdyZWVzIiksIGNleD0uOCkNCmFibGluZShoPTApDQp0ZXh0KC04LCAtMSwgIk1vZGVsLUJhc2VkIEVzdGltYXRlcyBvZiBSUjoiLCBwb3M9NCwgY2V4PS44KQ0KdGV4dCgtOCwgMTUsICJBdXRob3IocykgYW5kIFllYXIiLCBwb3M9NCwgY2V4PS44KQ0KdGV4dCg1LCAxNSwgIlJlbGF0aXZlIFJpc2sgWzk1JSBDSV0iLCBwb3M9MiwgY2V4PS44KQ0KdGV4dCgtMy4zLCAxNSwgIkxhdGl0dWRlIiwgY2V4PS44KQ0KZGV2Lm9mZigpDQpgYGANCg0KIyNbRXgyMF0gWkNPUiDquLDspIDsnLzroZwgbW9sbG95MjAxNCDrjbDsnbTthLAg66mU7YOAIOu2hOyEnSDrsI8g7Iuc6rCB7ZmUDQpgYGB7cn0NCiNkYXQubW9sbG95MjAxNDog7ISx7Iuk7ZWo6rO8IOyVveygnCDsuZjro4zsnbTtlonqs7zsnZgg7IOB6rSA6rSA6rOEDQojTWVhc3VyZXMgZm9yIFR3byBRdWFudGl0YXRpdmUgVmFyaWFibGVzOiByYXcgY29ycmVsYXRpb24gY29lZmZpY2llbnQoQ09SKSwNCiNyYXcgY29ycmVsYXRpb24gY29lZmZpY2llbnQgY29ycmVjdGVkIGZvciBpdHMgc2xpZ2h0IG5lZ2F0aXZlIGJpYXMgKFVDT1IpLA0KI0Zpc2hlcidzIHItdG8teiB0cmFuc2Zvcm1lZCBjb3JyZWxhdGlvbiBjb2VmZmljaWVudCAoWkNPUikNCmRhdCA8LSBnZXQoZGF0YShkYXQubW9sbG95MjAxNCkpDQoNCiMjIyBjYWxjdWxhdGUgci10by16IHRyYW5zZm9ybWVkIGNvcnJlbGF0aW9ucyBhbmQgY29ycmVzcG9uZGluZyBzYW1wbGluZyB2YXJpYW5jZXMNCmRhdCA8LSBlc2NhbGMobWVhc3VyZT0iWkNPUiIsIHJpPXJpLCBuaT1uaSwgZGF0YT1kYXQsIHNsYWI9cGFzdGUoYXV0aG9ycywgeWVhciwgc2VwPSIsICIpKQ0KZGF0DQpgYGANCg0KYGBge3J9DQojIyMgbWV0YS1hbmFseXNpcyBvZiB0aGUgdHJhbnNmb3JtZWQgY29ycmVsYXRpb25zIHVzaW5nIGEgcmFuZG9tLWVmZmVjdHMgbW9kZWwNCnJlcyA8LSBybWEoeWksIHZpLCBkYXRhPWRhdCkNCnJlcw0KYGBgDQoNCmBgYHtyfQ0KIyMjIGF2ZXJhZ2UgY29ycmVsYXRpb24gd2l0aCA5NSUgQ0kNCnByZWRpY3QocmVzLCBkaWdpdHM9MywgdHJhbnNmPXRyYW5zZi56dG9yKQ0KYGBgDQoNCmBgYHtyfQ0KIyMjIGZvcmVzdCBwbG90DQpmb3Jlc3QocmVzLCBhZGRjcmVkPVRSVUUsIHhsaW09YygtMS42LDEuNiksIGF0cmFuc2Y9dHJhbnNmLnp0b3IsDQogICAgICAgYXQ9dHJhbnNmLnJ0b3ooYygtLjQsLS4yLDAsLjIsLjQsLjYpKSwgZGlnaXRzPWMoMiwxKSwgY2V4PS44KQ0KdGV4dCgtMS42LCAxOCwgIkF1dGhvcihzKSwgWWVhciIsIHBvcz00LCBjZXg9LjgpDQp0ZXh0KCAxLjYsIDE4LCAiQ29ycmVsYXRpb24gWzk1JSBDSV0iLCBwb3M9MiwgY2V4PS44KQ0KYGBgDQoNCmBgYHtyfQ0KIyMjIGZ1bm5lbCBwbG90DQpmdW5uZWwocmVzKQ0KYGBgDQoNCiMjIFJlZmVyZW5jZQ0KLSBJbnRyb2R1Y3Rpb24gdG8gTWV0YS1BbmFseXNpcywgQm9yZW5zdGVpbiBldCBhbC4NCi0gUuqzvCBXaW5CVUdT66W8IOydtOyaqe2VnCDrqZTtg4DrtoTshJ0tIOq5gOuLrO2YuCBldCBhbC4NCi0gaHR0cHM6Ly9ibG9nLm5hdmVyLmNvbS9Qb3N0TGlzdC5uaG4/YmxvZ0lkPTkwNjUwMzENCi0gaHR0cDovL2hhbmRib29rLmNvY2hyYW5lLm9yZw0KLSBodHRwczovL2NyYW4uci1wcm9qZWN0Lm9yZy93ZWIvdmlld3MvTWV0YUFuYWx5c2lzLmh0bWwNCi0gaHR0cDovL3d3dy5tZXRhZm9yLXByb2plY3Qub3JnDQotIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0VmZmVjdF9zaXplDQotIGh0dHA6Ly93d3cuZGlmZmVyZW5jZWJldHdlZW4ubmV0L3NjaWVuY2UvbWF0aGVtYXRpY3Mtc3RhdGlzdGljcw0KLSBodHRwOi8vaGluZWNhLmtyL2VudHJ5L1ZvbDQtOCVFQyU5QiU5NCVFRCU5OCVCOC0lRUMlOTUlOEMlRUElQjglQjAtJUVDJTg5JUFDJUVDJTlBJUI0LUVCTS0lRUIlODQlQTQlRUQlOEElQjglRUMlOUIlOEMlRUQlODElQUMtJUVCJUE5JTk0JUVEJTgzJTgwJUVCJUI2JTg0JUVDJTg0JTlEDQoNCg==