Start Using the neg.esm() Function

From the negligible R package


Introduction

What is the purpose/goal of neg.esm()?

The purpose of the neg.esm function is to evaluate whether substantial mediation (negligible direct effect) is present via negligible effect (equivalence) testing and David Kenny’s method for assessing full mediation.

What is the theory behind neg.esm()?

Substantial mediation testing is a negligible effect testing based procedure that evaluates whether a variable is able to explain a considerable (i.e., substantial) proportion of the variability in the relationship between a predictor and an outcome. It is important to point out that this is distinct from assessing the statistical significance of the indirect effect, where the focus is only on the indirect effect (and no interest is paid to the distribution of variability across the indirect and direct effects). With the proposed method, we can estimate the equivalence of \(b_{YX}\) and \(b_{MX}b_{YM.X}\) from the direct effect of X upon Y, \(b_{YX.M}\) (Preacher & Kelley, 2011). This can be evaluated by demonstrating that the (1 − 2α)% confidence interval for \(b_{YX.M}\) falls within the negligible effect interval from −δ to δ, where δ represents a pre-specified difference between the coefficients \(b_{YX}\) and \(b_{MX}b_{YM.X}\) (or equivalently the magnitude of \(b_{YX.M}\) that would be considered meaningless within the framework of the study.

For more details regarding the methods, please see:

Beribisky, N., Mara, C. A., & Cribbie, R. A. (2020). An equivalence testing approach for evaluating substantial mediation. The Quantitative Methods for Psychology, 16(5), 424–441. https://doi.org/10.20982/tqmp.16.4.p424

https://davidakenny.net/cm/mediate.htm

Null and Alternate Hypotheses of the Procedure

The null hypothesis specifies that the total effect of X on Y is non-negligibly (i.e., meaningfully) larger in magnitude than the indirect of X on Y, through M. [This is actually assessed by evaluating whether the effect of X on Y, controlling for M (i.e., the ‘direct effect’), falls at or beyond the bounds of the negligible effect (equivalence) interval.] The alternate hypothesis states that the the effect of X on Y, controlling for M (i.e., the ‘direct effect’), falls within the negligible effect (equivalence) interval.

\(H_{01}: b^*_{YX.M} \le ei_L\)

\(H_{02}: b^*_{YX.M} \ge ei_U\)

\(H_{11}: b^*_{YX.M} \gt ei_L\)

\(H_{12}: b^*_{YX.M} \lt ei_U\)

Using neg.esm()

The basic set-up of the function looks like this:

neg.esm(X, Y, M, alpha = 0.05, minc = 0.15, eil = -0.15, eiu = 0.15, nboot = 1000L, data = NULL, plot = TRUE, saveplot = FALSE, seed = NA)

Required arguments (no default)

X - independent/predictor variable

Y - dependent/outcome variable

M - mediating variable

Optional arguments (has a default)

alpha - nominal Type I error rate. The default is .05, but any value can be used (e.g., .01, .10, .06)

minc - minimum standardized regression coefficient for the total effect (with a default of .15 in absolute value)

eil/eiu - lower and upper negligible effect bounds (standardized units), respectively, for the direct effect (c’ = c - ab). The default is (eil = -.15, eiu = .15)

nboot - number of bootstrap samples used to compute the confidence interval for the indirect effect (ab = c-c’). The default is 1000

data - the name of the R dataset which contains the variables

plot - whether a plot of the effect, along with the proportional distance, should be produced. The default is TRUE.

saveplot - whether the plot should be saved, the default is FALSE.

seed - seed number used for the bootstrap samples, if NA a random seed is used. The default is NA.

Examples

Example 1

Let’s look at an example using the mtcars dataset from R. We want to know if the weight (wt) of a vehicle mediates the relationship between the horsepower (hp) and the miles per gallon (mpg).

hp -> wt -> mpg

d <- mtcars # open the dataset and store it in the object d
names(d) # look at the variable names
 [1] "mpg"  "cyl"  "disp" "hp"   "drat" "wt"   "qsec" "vs"   "am"   "gear"
[11] "carb"

Let’s start by running a traditional mediation analysis:

library(mediation)

med_model <- lm(wt ~ hp, data = d)
tot_model <- lm(mpg ~ hp + wt,
                data = d)
res <- mediate(model.m = med_model,
               model.y = tot_model,
               treat = 'hp',
               mediator = 'wt',
               boot = TRUE, sims = 50)

summary(res)

Causal Mediation Analysis 

Nonparametric Bootstrap Confidence Intervals with the Percentile Method

               Estimate 95% CI Lower 95% CI Upper p-value    
ACME            -0.0365      -0.0684        -0.02  <2e-16 ***
ADE             -0.0318      -0.0542        -0.02  <2e-16 ***
Total Effect    -0.0682      -0.1020        -0.05  <2e-16 ***
Prop. Mediated   0.5343       0.4084         0.71  <2e-16 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Sample Size Used: 32 


Simulations: 50 

We see that both the indirect (ACME) and direct (ADE) effects are statistically significant, and that 54% of the total effect is mediated.

Now, let’s apply the neg.esm function to see if we can reject the null hypothesis that the mediation effect is non-negligible. We will use all defaults, with the exception that we will only use 10 bootstrap samples (to reduce the time of the analysis) and we will specify the dataset explicitly.

library(negligible)
neg.esm(X = hp, Y = mpg, M = wt, nboot = 10, data = d)
Bootstrapping may take several minutes 
 
Bootstrapping may take several minutes 
 
Bootstrapping may take several minutes 
 
*** ***

Proportion Mediated: 0.534 
95% CI for Proportion Mediated: (0.401, 1.035)
Completely Standardized Indirect Effect (CSIE): 0.172 
95% CI for CSIE: (0.06, 0.316)

*** Equivalence Testing Method for Substantial Mediation (ESM) ***

Number of Bootstrap Iterations: 10(random seed = 8465)
Indirect Effect: -0.415 
Correlation between X and Y (must be greater in magnitude than 0.15): -0.776
90% CI on Direct Effect: (-0.581, -0.276)
Equivalence Interval: Lower = -0.15; Upper = 0.15

Decision from the ESM: The null hypothesis that the direct effect (difference between the total and indirect effect) is non-negligible cannot be rejected. Substantial Mediation CANNOT be concluded. Be sure to interpret the magnitude (and precision) of the effect size. 

**********************

*** Kenny Method for Full Mediation ***

ab/c (must be greater in magnitude than .80): 0.535 
Correlation between X and Y (must be greater in magnitude than .2): -0.776

Decision from Kenny Procedure: Full Mediation CANNOT be concluded 

**********************

*** Proportional Distance (the proportional distance from the effect of interest to the equivalence interval of the same sign) *** 

Proportional Distance (PD): -2.41 
95% CI for PD: (-3.988, 0.5)
**********************

Note that coefficients are now in standardized units. The total effect was large enough to conduct the analysis [r(hp, mpg) = -.78], however the direct effect was non-negligible (the confidence interval on the direct effect did not fall completely within the negligible effect interval) and thus substantial mediation cannot be concluded. The proportional distance highlights that the direct effect is 241% of the distance from 0 to the lower bound of the negligible effect interval (-.15). Using the Kenny approach to evaluating full mediation, we cannot conclude that full mediation has occurred.

Example 2

In this example, we look at whether pretest anxiety (Beck Anxiety Inventory) substantially mediates the relationship between pretest perfectionistic cognitions (Perfectionism Cognititions Inventory) and pretest depression (Centre for Epidemiological Studies of Depression). We are using the dataset perfectionism from the negligible package. In this example, we use \(\alpha\) = .10 and set the seed for replicability.

library(negligible)
neg.esm(pcipre.total,cesdpre.total,baipre.total, data=perfectionism, nboot=50,alpha=.10,seed=116)
Bootstrapping may take several minutes 
 
Bootstrapping may take several minutes 
 
Bootstrapping may take several minutes 
 
*** ***

Proportion Mediated: 1.364 
90% CI for Proportion Mediated: (0.749, 9.722)
Completely Standardized Indirect Effect (CSIE): 0.058 
90% CI for CSIE: (0.007, 0.165)

*** Equivalence Testing Method for Substantial Mediation (ESM) ***

Number of Bootstrap Iterations: 50(random seed = 116)
Indirect Effect: 0.241 
Correlation between X and Y (must be greater in magnitude than 0.15): 0.177
80% CI on Direct Effect: (-0.127, 0.032)
Equivalence Interval: Lower = -0.15; Upper = 0.15

Decision from the ESM: The null hypothesis that the direct effect (difference between the total and indirect effect) is non-negligible can be rejected. Substantial Mediation CAN be concluded. Be sure to interpret the magnitude (and precision) of the effect size. 

**********************

*** Kenny Method for Full Mediation ***

ab/c (must be greater in magnitude than .80): 1.363 
Correlation between X and Y (must be greater in magnitude than .2): 0.177

Decision from Kenny Procedure: Full Mediation CANNOT be concluded 

**********************

*** Proportional Distance (the proportional distance from the effect of interest to the equivalence interval of the same sign) *** 

Proportional Distance (PD): -0.429 
90% CI for PD: (-1.213, 0.471)
**********************

In this example, the confidence interval for the direct effect (\(b_{YX.M}\)) of perfectionstic cognitions on depression, controlling for anxiety (-.13, .03), falls completely within the negligible effect interval (-.15, .15) and therefore we can reject the null hypothesis that the direct effect is non-negligible. For the Kenny approach, although the proportion mediated is large, the minimum correlation between X and Y (perfectionstic cognitions and depression) was not met (i.e., there was not a large enough relationship between X and Y to discuss the proportion mediated). The small X-Y correlation, and the proportion mediated > 1, raise concerns regarding the validity of the substantial mediation analysis as well.

Extractable Elements

A number of elements of the output can be extracted, including:

minc: Minimum correlation between X and Y for a valid negligible effect (equivalence) test

corxy: Sample correlation between the IV (X) and DV (Y)

dir_eff: Sample standardized direct effect between the IV (X) and DV (Y) after controlling for the mediator (M)

eiL: Lower bound of the negligible effect (equivalence) interval

eiU: Upper bound of the negligible effect (equivalence) interval

cil: Lower bound of the 1-2*alpha CI for the standardized direct effect of X on Y

ciu: Upper bound of the 1-2*alpha CI for the standardized direct effect of X on Y

PD: Proportional distance (PD)

cilpd: Lower bound of the 1-alpha CI for the PD

ciupd: Upper bound of the 1-alpha CI for the PD

ab_par: Standardized indirect effect

abdivc_k: Proportion mediated: Standardized indirect effect divided by the standardized total effect

alpha: Nominal Type I error rate

LS0tDQp0aXRsZTogIlN0YXJ0IFVzaW5nIHRoZSBgbmVnLmVzbSgpYCBGdW5jdGlvbiINCnN1YnRpdGxlOiB8IA0KICAgIEZyb20gdGhlIFtgbmVnbGlnaWJsZWBdKGh0dHBzOi8vY3Jhbi5yLXByb2plY3Qub3JnL3dlYi9wYWNrYWdlcy9uZWdsaWdpYmxlL2luZGV4Lmh0bWwpIFIgcGFja2FnZSFbXShuZWcubG9nby5wbmcpe3dpZHRoPTEwJX0gIA0KYXV0aG9yOiAiW05hdGFseSBCZXJpYmlza3kgJiBSb2IgQ3JpYmJpZV0oaHR0cHM6Ly9uYXRhbHliLm5ldGxpZnkuYXBwLykiDQpkYXRlOiAiYHIgZm9ybWF0KFN5cy50aW1lKCkpYCINCm91dHB1dDoNCiAgcm1kZm9ybWF0czo6cm9ib2Jvb2s6DQogICAgY29kZV9kb3dubG9hZDogeWVzDQogICAgaGlnaGxpZ2h0OiB0YW5nbw0KLS0tDQoNCmBgYHtyIHNldHVwLCBlY2hvPUZBTFNFLCBjYWNoZT1GQUxTRSwgbWVzc2FnZXM9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQojaW5zdGFsbC5wYWNrYWdlcygicm1kZm9ybWF0cyIpDQpzdXBwcmVzc1BhY2thZ2VTdGFydHVwTWVzc2FnZXMobGlicmFyeShybWRmb3JtYXRzLCB3YXJuLmNvbmZsaWN0cz1GQUxTRSkpDQpzdXBwcmVzc1BhY2thZ2VTdGFydHVwTWVzc2FnZXMobGlicmFyeShrbml0ciwgd2Fybi5jb25mbGljdHM9RkFMU0UpKQ0Kc3VwcHJlc3NQYWNrYWdlU3RhcnR1cE1lc3NhZ2VzKGxpYnJhcnkodGlkeXZlcnNlLCB3YXJuLmNvbmZsaWN0cz1GQUxTRSkpDQpzdXBwcmVzc1BhY2thZ2VTdGFydHVwTWVzc2FnZXMobGlicmFyeShwbG90bHksIHdhcm4uY29uZmxpY3RzPUZBTFNFKSkNCnN1cHByZXNzUGFja2FnZVN0YXJ0dXBNZXNzYWdlcyhsaWJyYXJ5KHJlYWR4bCwgd2Fybi5jb25mbGljdHM9RkFMU0UpKQ0Kc3VwcHJlc3NQYWNrYWdlU3RhcnR1cE1lc3NhZ2VzKGxpYnJhcnkocGxvdGx5LCB3YXJuLmNvbmZsaWN0cz1GQUxTRSkpDQpzdXBwcmVzc1BhY2thZ2VTdGFydHVwTWVzc2FnZXMobGlicmFyeShNZXRCcmV3ZXIsIHdhcm4uY29uZmxpY3RzPUZBTFNFKSkNCnN1cHByZXNzUGFja2FnZVN0YXJ0dXBNZXNzYWdlcyhsaWJyYXJ5KGdnYW5pbWF0ZSwgd2Fybi5jb25mbGljdHM9RkFMU0UpKQ0Kc3VwcHJlc3NQYWNrYWdlU3RhcnR1cE1lc3NhZ2VzKGxpYnJhcnkoZHBseXIsIHdhcm4uY29uZmxpY3RzPUZBTFNFKSkNCg0KIyMgR2xvYmFsIG9wdGlvbnMNCm9wdGlvbnMobWF4LnByaW50PSI3NSIpDQpvcHRzX2NodW5rJHNldChlY2hvPVRSVUUsDQoJICAgICAgICAgICAgIGNhY2hlPVRSVUUsDQogICAgICAgICAgICAgICBwcm9tcHQ9RkFMU0UsDQogICAgICAgICAgICAgICBjb21tZW50PU5BLA0KICAgICAgICAgICAgICAgbWVzc2FnZT1GQUxTRSwNCiAgICAgICAgICAgICAgIHdhcm5pbmc9RkFMU0UpDQpvcHRzX2tuaXQkc2V0KHdpZHRoPTc1KQ0KYGBgDQoNCjxici8+DQoNCg0KDQojIyAqKkludHJvZHVjdGlvbioqDQoNCiMjIyAqKldoYXQgaXMgdGhlIHB1cnBvc2UvZ29hbCBvZiBgbmVnLmVzbSgpYD8qKg0KDQpUaGUgcHVycG9zZSBvZiB0aGUgbmVnLmVzbSBmdW5jdGlvbiBpcyB0byBldmFsdWF0ZSB3aGV0aGVyIHN1YnN0YW50aWFsIG1lZGlhdGlvbiAobmVnbGlnaWJsZSBkaXJlY3QgZWZmZWN0KSBpcyBwcmVzZW50IHZpYSBuZWdsaWdpYmxlIGVmZmVjdCAoZXF1aXZhbGVuY2UpIHRlc3RpbmcgYW5kIERhdmlkIEtlbm554oCZcyBtZXRob2QgZm9yIGFzc2Vzc2luZyBmdWxsIG1lZGlhdGlvbi4NCg0KDQojIyMgKipXaGF0IGlzIHRoZSB0aGVvcnkgYmVoaW5kIGBuZWcuZXNtKClgPyoqDQoNClN1YnN0YW50aWFsIG1lZGlhdGlvbiB0ZXN0aW5nIGlzIGEgbmVnbGlnaWJsZSBlZmZlY3QgdGVzdGluZyBiYXNlZCBwcm9jZWR1cmUgdGhhdCBldmFsdWF0ZXMgd2hldGhlciBhIHZhcmlhYmxlIGlzIGFibGUgdG8gZXhwbGFpbiBhIGNvbnNpZGVyYWJsZSAoaS5lLiwgc3Vic3RhbnRpYWwpIHByb3BvcnRpb24gb2YgdGhlIHZhcmlhYmlsaXR5IGluIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBhIHByZWRpY3RvciBhbmQgYW4gb3V0Y29tZS4gSXQgaXMgaW1wb3J0YW50IHRvIHBvaW50IG91dCB0aGF0IHRoaXMgaXMgZGlzdGluY3QgZnJvbSBhc3Nlc3NpbmcgdGhlIHN0YXRpc3RpY2FsIHNpZ25pZmljYW5jZSBvZiB0aGUgaW5kaXJlY3QgZWZmZWN0LCB3aGVyZSB0aGUgZm9jdXMgaXMgb25seSBvbiB0aGUgaW5kaXJlY3QgZWZmZWN0IChhbmQgbm8gaW50ZXJlc3QgaXMgcGFpZCB0byB0aGUgZGlzdHJpYnV0aW9uIG9mIHZhcmlhYmlsaXR5IGFjcm9zcyB0aGUgaW5kaXJlY3QgYW5kIGRpcmVjdCBlZmZlY3RzKS4gV2l0aCB0aGUgcHJvcG9zZWQgbWV0aG9kLCB3ZSBjYW4gZXN0aW1hdGUgdGhlIGVxdWl2YWxlbmNlIG9mICRiX3tZWH0kIGFuZCAkYl97TVh9Yl97WU0uWH0kIGZyb20gdGhlIGRpcmVjdCBlZmZlY3Qgb2YgWCB1cG9uIFksICRiX3tZWC5NfSQgKFByZWFjaGVyICYgS2VsbGV5LCAyMDExKS4gVGhpcyBjYW4gYmUgZXZhbHVhdGVkIGJ5IGRlbW9uc3RyYXRpbmcgdGhhdCB0aGUgKDEg4oiSIDLOsSklIGNvbmZpZGVuY2UgaW50ZXJ2YWwgZm9yICRiX3tZWC5NfSQgZmFsbHMgd2l0aGluIHRoZSBuZWdsaWdpYmxlIGVmZmVjdCBpbnRlcnZhbCBmcm9tIOKIks60IHRvIM60LCB3aGVyZSDOtCByZXByZXNlbnRzIGEgcHJlLXNwZWNpZmllZCBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIGNvZWZmaWNpZW50cyAkYl97WVh9JCBhbmQgJGJfe01YfWJfe1lNLlh9JCAob3IgZXF1aXZhbGVudGx5IHRoZSBtYWduaXR1ZGUgb2YgJGJfe1lYLk19JCB0aGF0DQp3b3VsZCBiZSBjb25zaWRlcmVkIG1lYW5pbmdsZXNzIHdpdGhpbiB0aGUgZnJhbWV3b3JrIG9mDQp0aGUgc3R1ZHkuDQoNCkZvciBtb3JlIGRldGFpbHMgcmVnYXJkaW5nIHRoZSBtZXRob2RzLCBwbGVhc2Ugc2VlOg0KDQpCZXJpYmlza3ksIE4uLCBNYXJhLCBDLiBBLiwgJiBDcmliYmllLCBSLiBBLiAoMjAyMCkuIEFuIGVxdWl2YWxlbmNlIHRlc3RpbmcgYXBwcm9hY2ggZm9yIGV2YWx1YXRpbmcgc3Vic3RhbnRpYWwgbWVkaWF0aW9uLiBUaGUgUXVhbnRpdGF0aXZlIE1ldGhvZHMgZm9yIFBzeWNob2xvZ3ksIDE2KDUpLCA0MjTigJM0NDEuIGh0dHBzOi8vZG9pLm9yZy8xMC4yMDk4Mi90cW1wLjE2LjQucDQyNA0KDQpodHRwczovL2RhdmlkYWtlbm55Lm5ldC9jbS9tZWRpYXRlLmh0bQ0KDQoNCiMjIyMgKk51bGwgYW5kIEFsdGVybmF0ZSBIeXBvdGhlc2VzIG9mIHRoZSBQcm9jZWR1cmUqDQoNClRoZSBudWxsIGh5cG90aGVzaXMgc3BlY2lmaWVzIHRoYXQgdGhlIHRvdGFsIGVmZmVjdCBvZiBYIG9uIFkgaXMgbm9uLW5lZ2xpZ2libHkgKGkuZS4sIG1lYW5pbmdmdWxseSkgbGFyZ2VyIGluIG1hZ25pdHVkZSB0aGFuIHRoZSBpbmRpcmVjdCBvZiBYIG9uIFksIHRocm91Z2ggTS4gW1RoaXMgaXMgYWN0dWFsbHkgYXNzZXNzZWQgYnkgZXZhbHVhdGluZyB3aGV0aGVyIHRoZSBlZmZlY3Qgb2YgWCBvbiBZLCBjb250cm9sbGluZyBmb3IgTSAoaS5lLiwgdGhlIOKAmGRpcmVjdCBlZmZlY3TigJkpLCBmYWxscyBhdCBvciBiZXlvbmQgdGhlIGJvdW5kcyBvZiB0aGUgbmVnbGlnaWJsZSBlZmZlY3QgKGVxdWl2YWxlbmNlKSBpbnRlcnZhbC5dIFRoZSBhbHRlcm5hdGUgaHlwb3RoZXNpcyBzdGF0ZXMgdGhhdCB0aGUgdGhlIGVmZmVjdCBvZiBYIG9uIFksIGNvbnRyb2xsaW5nIGZvciBNIChpLmUuLCB0aGUg4oCYZGlyZWN0IGVmZmVjdOKAmSksIGZhbGxzIHdpdGhpbiB0aGUgbmVnbGlnaWJsZSBlZmZlY3QgKGVxdWl2YWxlbmNlKSBpbnRlcnZhbC4NCg0KJEhfezAxfTogIGJeKl97WVguTX0gXGxlIGVpX0wkIA0KDQokSF97MDJ9OiAgYl4qX3tZWC5NfSBcZ2UgZWlfVSQNCg0KJEhfezExfTogIGJeKl97WVguTX0gXGd0IGVpX0wkIA0KDQokSF97MTJ9OiAgYl4qX3tZWC5NfSBcbHQgZWlfVSQNCg0KDQojIyMgKipVc2luZyBgbmVnLmVzbSgpYCoqDQoNClRoZSBiYXNpYyBzZXQtdXAgb2YgdGhlIGZ1bmN0aW9uIGxvb2tzIGxpa2UgdGhpczoNCg0KbmVnLmVzbShYLCBZLCBNLCBhbHBoYSA9IDAuMDUsIG1pbmMgPSAwLjE1LCBlaWwgPSAtMC4xNSwgZWl1ID0gMC4xNSwgbmJvb3QgPSAxMDAwTCwgZGF0YSA9IE5VTEwsIHBsb3QgPSBUUlVFLCBzYXZlcGxvdCA9IEZBTFNFLCBzZWVkID0gTkEpDQoNCg0KIyMjIyAqUmVxdWlyZWQgYXJndW1lbnRzIChubyBkZWZhdWx0KSoNCg0KKlgqIC0gaW5kZXBlbmRlbnQvcHJlZGljdG9yIHZhcmlhYmxlDQoNCipZKiAtIGRlcGVuZGVudC9vdXRjb21lIHZhcmlhYmxlDQoNCipNKiAtIG1lZGlhdGluZyB2YXJpYWJsZQ0KDQoNCiMjIyMgKk9wdGlvbmFsIGFyZ3VtZW50cyAoaGFzIGEgZGVmYXVsdCkqDQoNCg0KKmFscGhhKiAtIG5vbWluYWwgVHlwZSBJIGVycm9yIHJhdGUuIFRoZSBkZWZhdWx0IGlzIC4wNSwgYnV0IGFueSB2YWx1ZSBjYW4gYmUgdXNlZCAoZS5nLiwgLjAxLCAuMTAsIC4wNikNCg0KKm1pbmMqIC0gbWluaW11bSBzdGFuZGFyZGl6ZWQgcmVncmVzc2lvbiBjb2VmZmljaWVudCBmb3IgdGhlIHRvdGFsIGVmZmVjdCAod2l0aCBhIGRlZmF1bHQgb2YgLjE1IGluIGFic29sdXRlIHZhbHVlKQ0KDQoqZWlsL2VpdSogLSBsb3dlciBhbmQgdXBwZXIgbmVnbGlnaWJsZSBlZmZlY3QgYm91bmRzIChzdGFuZGFyZGl6ZWQgdW5pdHMpLCByZXNwZWN0aXZlbHksIGZvciB0aGUgZGlyZWN0IGVmZmVjdCAoKmPigJkqID0gKmMqIC0gKmFiKikuIFRoZSBkZWZhdWx0IGlzICgqZWlsKiA9IC0uMTUsICplaXUqID0gLjE1KQ0KDQoqbmJvb3QqIC0gbnVtYmVyIG9mIGJvb3RzdHJhcCBzYW1wbGVzIHVzZWQgdG8gY29tcHV0ZSB0aGUgY29uZmlkZW5jZSBpbnRlcnZhbCBmb3IgdGhlIGluZGlyZWN0IGVmZmVjdCAoYWIgPSBjLWPigJkpLiBUaGUgZGVmYXVsdCBpcyAxMDAwDQoNCipkYXRhKiAtIHRoZSBuYW1lIG9mIHRoZSBSIGRhdGFzZXQgd2hpY2ggY29udGFpbnMgdGhlIHZhcmlhYmxlcw0KDQoqcGxvdCogLSB3aGV0aGVyIGEgcGxvdCBvZiB0aGUgZWZmZWN0LCBhbG9uZyB3aXRoIHRoZSBwcm9wb3J0aW9uYWwgZGlzdGFuY2UsIHNob3VsZCBiZSBwcm9kdWNlZC4gVGhlIGRlZmF1bHQgaXMgVFJVRS4NCg0KKnNhdmVwbG90KiAtIHdoZXRoZXIgdGhlIHBsb3Qgc2hvdWxkIGJlIHNhdmVkLCB0aGUgZGVmYXVsdCBpcyBGQUxTRS4NCg0KKnNlZWQqIC0gc2VlZCBudW1iZXIgdXNlZCBmb3IgdGhlIGJvb3RzdHJhcCBzYW1wbGVzLCBpZiBOQSBhIHJhbmRvbSBzZWVkIGlzIHVzZWQuIFRoZSBkZWZhdWx0IGlzIE5BLg0KDQoNCiMjICoqRXhhbXBsZXMqKg0KDQojIyMgKipFeGFtcGxlIDEqKg0KDQpMZXTigJlzIGxvb2sgYXQgYW4gZXhhbXBsZSB1c2luZyB0aGUgKiptdGNhcnMqKiBkYXRhc2V0IGZyb20gUi4gV2Ugd2FudCB0byBrbm93IGlmIHRoZSB3ZWlnaHQgKHd0KSBvZiBhIHZlaGljbGUgbWVkaWF0ZXMgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHRoZSBob3JzZXBvd2VyIChocCkgYW5kIHRoZSBtaWxlcyBwZXIgZ2FsbG9uIChtcGcpLg0KDQpocCAtPiB3dCAtPiBtcGcNCg0KYGBge3J9DQoNCmQgPC0gbXRjYXJzICMgb3BlbiB0aGUgZGF0YXNldCBhbmQgc3RvcmUgaXQgaW4gdGhlIG9iamVjdCBkDQpuYW1lcyhkKSAjIGxvb2sgYXQgdGhlIHZhcmlhYmxlIG5hbWVzDQpgYGANCg0KTGV0J3Mgc3RhcnQgYnkgcnVubmluZyBhIHRyYWRpdGlvbmFsIG1lZGlhdGlvbiBhbmFseXNpczoNCg0KYGBge3J9DQpsaWJyYXJ5KG1lZGlhdGlvbikNCg0KbWVkX21vZGVsIDwtIGxtKHd0IH4gaHAsIGRhdGEgPSBkKQ0KdG90X21vZGVsIDwtIGxtKG1wZyB+IGhwICsgd3QsDQogICAgICAgICAgICAgICAgZGF0YSA9IGQpDQpyZXMgPC0gbWVkaWF0ZShtb2RlbC5tID0gbWVkX21vZGVsLA0KICAgICAgICAgICAgICAgbW9kZWwueSA9IHRvdF9tb2RlbCwNCiAgICAgICAgICAgICAgIHRyZWF0ID0gJ2hwJywNCiAgICAgICAgICAgICAgIG1lZGlhdG9yID0gJ3d0JywNCiAgICAgICAgICAgICAgIGJvb3QgPSBUUlVFLCBzaW1zID0gNTApDQoNCnN1bW1hcnkocmVzKQ0KYGBgDQoNCldlIHNlZSB0aGF0IGJvdGggdGhlIGluZGlyZWN0IChBQ01FKSBhbmQgZGlyZWN0IChBREUpIGVmZmVjdHMgYXJlIHN0YXRpc3RpY2FsbHkgc2lnbmlmaWNhbnQsIGFuZCB0aGF0IDU0JSBvZiB0aGUgdG90YWwgZWZmZWN0IGlzIG1lZGlhdGVkLg0KDQpOb3csIGxldOKAmXMgYXBwbHkgdGhlICpuZWcuZXNtKiBmdW5jdGlvbiB0byBzZWUgaWYgd2UgY2FuIHJlamVjdCB0aGUgbnVsbCBoeXBvdGhlc2lzIHRoYXQgdGhlIG1lZGlhdGlvbiBlZmZlY3QgaXMgbm9uLW5lZ2xpZ2libGUuIFdlIHdpbGwgdXNlIGFsbCBkZWZhdWx0cywgd2l0aCB0aGUgZXhjZXB0aW9uIHRoYXQgd2Ugd2lsbCBvbmx5IHVzZSAxMCBib290c3RyYXAgc2FtcGxlcyAodG8gcmVkdWNlIHRoZSB0aW1lIG9mIHRoZSBhbmFseXNpcykgYW5kIHdlIHdpbGwgc3BlY2lmeSB0aGUgZGF0YXNldCBleHBsaWNpdGx5Lg0KDQpgYGB7cn0NCmxpYnJhcnkobmVnbGlnaWJsZSkNCm5lZy5lc20oWCA9IGhwLCBZID0gbXBnLCBNID0gd3QsIG5ib290ID0gMTAsIGRhdGEgPSBkKQ0KYGBgDQoNCk5vdGUgdGhhdCBjb2VmZmljaWVudHMgYXJlIG5vdyBpbiBzdGFuZGFyZGl6ZWQgdW5pdHMuIFRoZSB0b3RhbCBlZmZlY3Qgd2FzIGxhcmdlIGVub3VnaCB0byBjb25kdWN0IHRoZSBhbmFseXNpcyBbcihocCwgbXBnKSA9IC0uNzhdLCBob3dldmVyIHRoZSBkaXJlY3QgZWZmZWN0IHdhcyBub24tbmVnbGlnaWJsZSAodGhlIGNvbmZpZGVuY2UgaW50ZXJ2YWwgb24gdGhlIGRpcmVjdCBlZmZlY3QgZGlkIG5vdCBmYWxsIGNvbXBsZXRlbHkgd2l0aGluIHRoZSBuZWdsaWdpYmxlIGVmZmVjdCBpbnRlcnZhbCkgYW5kIHRodXMgc3Vic3RhbnRpYWwgbWVkaWF0aW9uIGNhbm5vdCBiZSBjb25jbHVkZWQuIFRoZSBwcm9wb3J0aW9uYWwgZGlzdGFuY2UgaGlnaGxpZ2h0cyB0aGF0IHRoZSBkaXJlY3QgZWZmZWN0IGlzIDI0MSUgb2YgdGhlIGRpc3RhbmNlIGZyb20gMCB0byB0aGUgbG93ZXIgYm91bmQgb2YgdGhlIG5lZ2xpZ2libGUgZWZmZWN0IGludGVydmFsICgtLjE1KS4gVXNpbmcgdGhlIEtlbm55IGFwcHJvYWNoIHRvIGV2YWx1YXRpbmcgZnVsbCBtZWRpYXRpb24sIHdlIGNhbm5vdCBjb25jbHVkZSB0aGF0IGZ1bGwgbWVkaWF0aW9uIGhhcyBvY2N1cnJlZC4NCg0KDQojIyMgKipFeGFtcGxlIDIqKg0KDQpJbiB0aGlzIGV4YW1wbGUsIHdlIGxvb2sgYXQgd2hldGhlciBwcmV0ZXN0IGFueGlldHkgKEJlY2sgQW54aWV0eSBJbnZlbnRvcnkpIHN1YnN0YW50aWFsbHkgbWVkaWF0ZXMgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHByZXRlc3QgcGVyZmVjdGlvbmlzdGljIGNvZ25pdGlvbnMgKFBlcmZlY3Rpb25pc20gQ29nbml0aXRpb25zIEludmVudG9yeSkgYW5kIHByZXRlc3QgZGVwcmVzc2lvbiAoQ2VudHJlIGZvciBFcGlkZW1pb2xvZ2ljYWwgU3R1ZGllcyBvZiBEZXByZXNzaW9uKS4gV2UgYXJlIHVzaW5nIHRoZSBkYXRhc2V0ICpwZXJmZWN0aW9uaXNtKiBmcm9tIHRoZSAqKm5lZ2xpZ2libGUqKiBwYWNrYWdlLiBJbiB0aGlzIGV4YW1wbGUsIHdlIHVzZSAkXGFscGhhJCA9IC4xMCBhbmQgc2V0IHRoZSBzZWVkIGZvciByZXBsaWNhYmlsaXR5Lg0KDQpgYGB7cn0NCmxpYnJhcnkobmVnbGlnaWJsZSkNCm5lZy5lc20ocGNpcHJlLnRvdGFsLGNlc2RwcmUudG90YWwsYmFpcHJlLnRvdGFsLCBkYXRhPXBlcmZlY3Rpb25pc20sIG5ib290PTUwLGFscGhhPS4xMCxzZWVkPTExNikNCmBgYA0KDQpJbiB0aGlzIGV4YW1wbGUsIHRoZSBjb25maWRlbmNlIGludGVydmFsIGZvciB0aGUgZGlyZWN0IGVmZmVjdCAoJGJfe1lYLk19JCkgb2YgcGVyZmVjdGlvbnN0aWMgY29nbml0aW9ucyBvbiBkZXByZXNzaW9uLCBjb250cm9sbGluZyBmb3IgYW54aWV0eSAoLS4xMywgLjAzKSwgZmFsbHMgY29tcGxldGVseSB3aXRoaW4gdGhlIG5lZ2xpZ2libGUgZWZmZWN0IGludGVydmFsICgtLjE1LCAuMTUpIGFuZCB0aGVyZWZvcmUgd2UgY2FuIHJlamVjdCB0aGUgbnVsbCBoeXBvdGhlc2lzIHRoYXQgdGhlIGRpcmVjdCBlZmZlY3QgaXMgbm9uLW5lZ2xpZ2libGUuIEZvciB0aGUgS2VubnkgYXBwcm9hY2gsIGFsdGhvdWdoIHRoZSBwcm9wb3J0aW9uIG1lZGlhdGVkIGlzIGxhcmdlLCB0aGUgbWluaW11bSBjb3JyZWxhdGlvbiBiZXR3ZWVuIFggYW5kIFkgKHBlcmZlY3Rpb25zdGljIGNvZ25pdGlvbnMgYW5kIGRlcHJlc3Npb24pIHdhcyBub3QgbWV0IChpLmUuLCB0aGVyZSB3YXMgbm90IGEgbGFyZ2UgZW5vdWdoIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIFggYW5kIFkgdG8gZGlzY3VzcyB0aGUgcHJvcG9ydGlvbiBtZWRpYXRlZCkuIFRoZSBzbWFsbCBYLVkgY29ycmVsYXRpb24sIGFuZCB0aGUgcHJvcG9ydGlvbiBtZWRpYXRlZCA+IDEsIHJhaXNlIGNvbmNlcm5zIHJlZ2FyZGluZyB0aGUgdmFsaWRpdHkgb2YgdGhlIHN1YnN0YW50aWFsIG1lZGlhdGlvbiBhbmFseXNpcyBhcyB3ZWxsLg0KDQoNCiMjIEV4dHJhY3RhYmxlIEVsZW1lbnRzDQoNCkEgbnVtYmVyIG9mIGVsZW1lbnRzIG9mIHRoZSBvdXRwdXQgY2FuIGJlIGV4dHJhY3RlZCwgaW5jbHVkaW5nOg0KDQoqbWluYyo6IE1pbmltdW0gY29ycmVsYXRpb24gYmV0d2VlbiBYIGFuZCBZIGZvciBhIHZhbGlkIG5lZ2xpZ2libGUgZWZmZWN0IChlcXVpdmFsZW5jZSkgdGVzdA0KDQoqY29yeHkqOiBTYW1wbGUgY29ycmVsYXRpb24gYmV0d2VlbiB0aGUgSVYgKFgpIGFuZCBEViAoWSkNCg0KKmRpcl9lZmYqOiBTYW1wbGUgc3RhbmRhcmRpemVkIGRpcmVjdCBlZmZlY3QgYmV0d2VlbiB0aGUgSVYgKFgpIGFuZCBEViAoWSkgYWZ0ZXIgY29udHJvbGxpbmcgZm9yIHRoZSBtZWRpYXRvciAoTSkNCg0KKmVpTCo6IExvd2VyIGJvdW5kIG9mIHRoZSBuZWdsaWdpYmxlIGVmZmVjdCAoZXF1aXZhbGVuY2UpIGludGVydmFsDQoNCiplaVUqOiBVcHBlciBib3VuZCBvZiB0aGUgbmVnbGlnaWJsZSBlZmZlY3QgKGVxdWl2YWxlbmNlKSBpbnRlcnZhbA0KDQoqY2lsKjogTG93ZXIgYm91bmQgb2YgdGhlIDEtMiphbHBoYSBDSSBmb3IgdGhlIHN0YW5kYXJkaXplZCBkaXJlY3QgZWZmZWN0IG9mIFggb24gWQ0KDQoqY2l1KjogVXBwZXIgYm91bmQgb2YgdGhlIDEtMiphbHBoYSBDSSBmb3IgdGhlIHN0YW5kYXJkaXplZCBkaXJlY3QgZWZmZWN0IG9mIFggb24gWQ0KDQoqUEQqOiBQcm9wb3J0aW9uYWwgZGlzdGFuY2UgKFBEKQ0KDQoqY2lscGQqOiBMb3dlciBib3VuZCBvZiB0aGUgMS1hbHBoYSBDSSBmb3IgdGhlIFBEDQoNCipjaXVwZCo6IFVwcGVyIGJvdW5kIG9mIHRoZSAxLWFscGhhIENJIGZvciB0aGUgUEQNCg0KKmFiX3Bhcio6IFN0YW5kYXJkaXplZCBpbmRpcmVjdCBlZmZlY3QNCg0KKmFiZGl2Y19rKjogUHJvcG9ydGlvbiBtZWRpYXRlZDogU3RhbmRhcmRpemVkIGluZGlyZWN0IGVmZmVjdCBkaXZpZGVkIGJ5IHRoZSBzdGFuZGFyZGl6ZWQgdG90YWwgZWZmZWN0DQoNCiphbHBoYSo6IE5vbWluYWwgVHlwZSBJIGVycm9yIHJhdGU=