Introduction
The Diffusion Index is a powerful tool in economic analysis that
summarizes the proportion of indicators showing improvement versus
decline. In this project, I have constructed a Diffusion Index for the
United States using three critical economic variables: the unemployment
rate (UNRATE), the industrial production index (INDPRO), and the
consumer sentiment index (UMCSENT). These variables provide insights
into labor market conditions, production activity, and consumer
confidence, making them vital for assessing economic trends.
To evaluate the effectiveness of our Diffusion Index, I compare it to
the Chicago Fed National Activity Index: Diffusion Index (CFNAIDIFF), a
widely-used measure of economic performance. This comparison includes
calculating the correlation coefficient and plotting both indexes side
by side to analyze their alignment and trends. The results offer
insights into how well our custom index mirrors broader economic
activity and what it reveals about the current state of the U.S.
economy.
library(plotly)
library(htmlwidgets)
library(tidyverse)
library(quantmod)
library(ggplot2)
library(scales)
start_date <- as.Date("2000-01-01")
end_date <- as.Date("2024-10-01")
getSymbols(c("UNRATE", "INDPRO", "UMCSENT"), src = "FRED", from = start_date, to = end_date)
data <- data.frame(
date = index(UNRATE),
unemployment = coredata(UNRATE),
industrial_production = coredata(INDPRO),
consumer_sentiment = coredata(UMCSENT)
)
data <- na.omit(data)
Methods
To create the Diffusion Index, I selected three key economic
variables from the U.S. economy: the unemployment rate (UNRATE), the
industrial production index (INDPRO), and the consumer sentiment index
(UMCSENT). These variables were retrieved from the Federal Reserve
Economic Data (FRED) platform. Each variable represents critical aspects
of economic performance: labor market conditions, industrial activity,
and consumer confidence, respectively.
Calculating the Diffusion Index
The Diffusion Index was constructed by analyzing the month-over-month
changes in each variable. Specifically: - A positive change in
INDPRO or UMCSENT was marked as an
improvement, while a negative change indicated a decline. - For
UNRATE, a decrease was considered an improvement since
lower unemployment signals economic strength.
For each period, the proportion of improving variables was calculated
and scaled to a percentage (0–100), with the formula:
\[
\text{Diffusion Index} = \frac{\text{Number of Improving
Variables}}{\text{Total Variables}} \times 100
\]
data <- data %>%
mutate(
unem_change = c(0, diff(UNRATE)) < 0,
ip_change = c(0, diff(INDPRO)) > 0,
cs_change = c(0, diff(UMCSENT)) > 0
)
data <- data %>%
mutate(
diffusion_index = rowMeans(select(., unem_change, ip_change, cs_change), na.rm = TRUE) * 100
)
To smooth out short-term fluctuations, I computed a 6-month moving
average of the Diffusion Index.
Comparison with CFNAIDIFF
To evaluate the effectiveness of the custom Diffusion Index, I
compared it to the Chicago Fed National Activity Index: Diffusion Index
(CFNAIDIFF), a widely recognized measure of economic activity. The
comparison involved: 1. Calculating the Pearson correlation
coefficient to quantify the alignment between the two
indices.
[1] "CFNAIDIFF"
[1] "Correlation coefficient: 0.41"
[1] "Correlation coefficient with smooth data: 0.41"
- Visualizing both series side by side using
ggplot2 to
assess trends and divergences.
Results
Correlation Between Diffusion Index and CFNAIDIFF
The custom Diffusion Index, calculated using three key economic
variables (unemployment rate, industrial production, and consumer
sentiment), shows a moderate positive correlation with the Chicago Fed
National Activity Index: Diffusion Index (CFNAIDIFF). The calculated
correlation coefficient is approximately 0.41,
indicating that while the two indices align in some trends, they are not
perfectly synchronized.
This correlation suggests that the custom Diffusion Index captures
important elements of broader economic activity but is less
comprehensive than CFNAIDIFF, which incorporates a larger number of
indicators. The moderate correlation highlights the validity of the
custom index as a simpler, more focused measure of economic activity
while acknowledging that some nuances captured by CFNAIDIFF may not be
fully represented.
Downward Trend Observed
The plot reveals a clear downward trend in both the
custom Diffusion Index and CFNAIDIFF in recent months. This decline is
particularly noticeable in the 6-month moving average of the custom
Diffusion Index (blue line) and aligns with the CFNAIDIFF (red line).
This suggests a weakening in economic momentum as fewer variables are
showing consistent improvement.
Key observations about the downward trend include:
- Post-2022 Performance:
- Following the post-pandemic recovery in 2020 and 2021, both indices
show a gradual weakening trend starting in late 2022, suggesting reduced
economic growth or a potential cooling phase in the economy.
- Magnitude of the Decline:
- The raw Diffusion Index (green line) shows greater volatility, while
the smoother (blue line) provides a clearer picture of sustained
decline. The CFNAIDIFF also mirrors this downward movement, reinforcing
the likelihood of a broad-based slowdown.
- Economic Implications:
- This downward trend may reflect challenges such as slowing
industrial production, cooling consumer sentiment, and persistent
uncertainties in labor market conditions. The alignment of both indices
during this period strengthens the argument for a potential deceleration
in economic activity.
Overall Findings
The custom Diffusion Index effectively tracks major trends in
CFNAIDIFF, particularly during significant economic turning points. The
observed downward trend in recent months signals that economic activity
may be losing momentum, with fewer indicators showing improvement. While
the correlation of 0.41 highlights that the custom index is not a
perfect substitute for CFNAIDIFF, it remains a useful tool for tracking
broad economic dynamics.
LS0tCnRpdGxlOiAiRGlmZnVzaW9uIEluZGV4IEFuYWx5c2lzIEVDT042NjM1LTAxIgpzdWJ0aXRsZTogIlVuaXZlcnNpdHkgb2YgTmV3IEhhdmVuIC0gUG9tcGVhIFNjaG9vbCBvZiBCdXNpbmVzcyIKYXV0aG9yOiAiTmFnYSBTYWkgUHJhc2FudGggRGl2dmVsYSAoMDA4NzY1ODMpIgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKLS0tCgojIyBJbnRyb2R1Y3Rpb24KClRoZSBEaWZmdXNpb24gSW5kZXggaXMgYSBwb3dlcmZ1bCB0b29sIGluIGVjb25vbWljIGFuYWx5c2lzIHRoYXQgc3VtbWFyaXplcyB0aGUgcHJvcG9ydGlvbiBvZiBpbmRpY2F0b3JzIHNob3dpbmcgaW1wcm92ZW1lbnQgdmVyc3VzIGRlY2xpbmUuIEluIHRoaXMgcHJvamVjdCwgSSBoYXZlIGNvbnN0cnVjdGVkIGEgRGlmZnVzaW9uIEluZGV4IGZvciB0aGUgVW5pdGVkIFN0YXRlcyB1c2luZyB0aHJlZSBjcml0aWNhbCBlY29ub21pYyB2YXJpYWJsZXM6IHRoZSB1bmVtcGxveW1lbnQgcmF0ZSAoVU5SQVRFKSwgdGhlIGluZHVzdHJpYWwgcHJvZHVjdGlvbiBpbmRleCAoSU5EUFJPKSwgYW5kIHRoZSBjb25zdW1lciBzZW50aW1lbnQgaW5kZXggKFVNQ1NFTlQpLiBUaGVzZSB2YXJpYWJsZXMgcHJvdmlkZSBpbnNpZ2h0cyBpbnRvIGxhYm9yIG1hcmtldCBjb25kaXRpb25zLCBwcm9kdWN0aW9uIGFjdGl2aXR5LCBhbmQgY29uc3VtZXIgY29uZmlkZW5jZSwgbWFraW5nIHRoZW0gdml0YWwgZm9yIGFzc2Vzc2luZyBlY29ub21pYyB0cmVuZHMuCgpUbyBldmFsdWF0ZSB0aGUgZWZmZWN0aXZlbmVzcyBvZiBvdXIgRGlmZnVzaW9uIEluZGV4LCBJIGNvbXBhcmUgaXQgdG8gdGhlIENoaWNhZ28gRmVkIE5hdGlvbmFsIEFjdGl2aXR5IEluZGV4OiBEaWZmdXNpb24gSW5kZXggKENGTkFJRElGRiksIGEgd2lkZWx5LXVzZWQgbWVhc3VyZSBvZiBlY29ub21pYyBwZXJmb3JtYW5jZS4gVGhpcyBjb21wYXJpc29uIGluY2x1ZGVzIGNhbGN1bGF0aW5nIHRoZSBjb3JyZWxhdGlvbiBjb2VmZmljaWVudCBhbmQgcGxvdHRpbmcgYm90aCBpbmRleGVzIHNpZGUgYnkgc2lkZSB0byBhbmFseXplIHRoZWlyIGFsaWdubWVudCBhbmQgdHJlbmRzLiBUaGUgcmVzdWx0cyBvZmZlciBpbnNpZ2h0cyBpbnRvIGhvdyB3ZWxsIG91ciBjdXN0b20gaW5kZXggbWlycm9ycyBicm9hZGVyIGVjb25vbWljIGFjdGl2aXR5IGFuZCB3aGF0IGl0IHJldmVhbHMgYWJvdXQgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIFUuUy4gZWNvbm9teS4KCmBgYHtyIERhdGEtcHJlcGFyYXRpb24sIGVjaG89VFJVRSwgcmVzdWx0cz0naGlkZSd9CmxpYnJhcnkocGxvdGx5KQpsaWJyYXJ5KGh0bWx3aWRnZXRzKQpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeShxdWFudG1vZCkKbGlicmFyeShnZ3Bsb3QyKQpsaWJyYXJ5KHNjYWxlcykKCnN0YXJ0X2RhdGUgPC0gYXMuRGF0ZSgiMjAwMC0wMS0wMSIpCmVuZF9kYXRlIDwtIGFzLkRhdGUoIjIwMjQtMTAtMDEiKQoKZ2V0U3ltYm9scyhjKCJVTlJBVEUiLCAiSU5EUFJPIiwgIlVNQ1NFTlQiKSwgc3JjID0gIkZSRUQiLCBmcm9tID0gc3RhcnRfZGF0ZSwgdG8gPSBlbmRfZGF0ZSkKCmRhdGEgPC0gZGF0YS5mcmFtZSgKICBkYXRlID0gaW5kZXgoVU5SQVRFKSwKICB1bmVtcGxveW1lbnQgPSBjb3JlZGF0YShVTlJBVEUpLAogIGluZHVzdHJpYWxfcHJvZHVjdGlvbiA9IGNvcmVkYXRhKElORFBSTyksCiAgY29uc3VtZXJfc2VudGltZW50ID0gY29yZWRhdGEoVU1DU0VOVCkKKQoKZGF0YSA8LSBuYS5vbWl0KGRhdGEpCgpgYGAKCgojIyBNZXRob2RzCgpUbyBjcmVhdGUgdGhlIERpZmZ1c2lvbiBJbmRleCwgSSBzZWxlY3RlZCB0aHJlZSBrZXkgZWNvbm9taWMgdmFyaWFibGVzIGZyb20gdGhlIFUuUy4gZWNvbm9teTogdGhlIHVuZW1wbG95bWVudCByYXRlIChVTlJBVEUpLCB0aGUgaW5kdXN0cmlhbCBwcm9kdWN0aW9uIGluZGV4IChJTkRQUk8pLCBhbmQgdGhlIGNvbnN1bWVyIHNlbnRpbWVudCBpbmRleCAoVU1DU0VOVCkuIFRoZXNlIHZhcmlhYmxlcyB3ZXJlIHJldHJpZXZlZCBmcm9tIHRoZSBGZWRlcmFsIFJlc2VydmUgRWNvbm9taWMgRGF0YSAoRlJFRCkgcGxhdGZvcm0uIEVhY2ggdmFyaWFibGUgcmVwcmVzZW50cyBjcml0aWNhbCBhc3BlY3RzIG9mIGVjb25vbWljIHBlcmZvcm1hbmNlOiBsYWJvciBtYXJrZXQgY29uZGl0aW9ucywgaW5kdXN0cmlhbCBhY3Rpdml0eSwgYW5kIGNvbnN1bWVyIGNvbmZpZGVuY2UsIHJlc3BlY3RpdmVseS4KCiMjIyBDYWxjdWxhdGluZyB0aGUgRGlmZnVzaW9uIEluZGV4ClRoZSBEaWZmdXNpb24gSW5kZXggd2FzIGNvbnN0cnVjdGVkIGJ5IGFuYWx5emluZyB0aGUgbW9udGgtb3Zlci1tb250aCBjaGFuZ2VzIGluIGVhY2ggdmFyaWFibGUuIFNwZWNpZmljYWxseToKLSBBIHBvc2l0aXZlIGNoYW5nZSBpbiAqKklORFBSTyoqIG9yICoqVU1DU0VOVCoqIHdhcyBtYXJrZWQgYXMgYW4gaW1wcm92ZW1lbnQsIHdoaWxlIGEgbmVnYXRpdmUgY2hhbmdlIGluZGljYXRlZCBhIGRlY2xpbmUuCi0gRm9yICoqVU5SQVRFKiosIGEgZGVjcmVhc2Ugd2FzIGNvbnNpZGVyZWQgYW4gaW1wcm92ZW1lbnQgc2luY2UgbG93ZXIgdW5lbXBsb3ltZW50IHNpZ25hbHMgZWNvbm9taWMgc3RyZW5ndGguCgpGb3IgZWFjaCBwZXJpb2QsIHRoZSBwcm9wb3J0aW9uIG9mIGltcHJvdmluZyB2YXJpYWJsZXMgd2FzIGNhbGN1bGF0ZWQgYW5kIHNjYWxlZCB0byBhIHBlcmNlbnRhZ2UgKDDigJMxMDApLCB3aXRoIHRoZSBmb3JtdWxhOgoKXFsKXHRleHR7RGlmZnVzaW9uIEluZGV4fSA9IFxmcmFje1x0ZXh0e051bWJlciBvZiBJbXByb3ZpbmcgVmFyaWFibGVzfX17XHRleHR7VG90YWwgVmFyaWFibGVzfX0gXHRpbWVzIDEwMApcXQpgYGB7cn0KZGF0YSA8LSBkYXRhICU+JQogIG11dGF0ZSgKICAgIHVuZW1fY2hhbmdlID0gYygwLCBkaWZmKFVOUkFURSkpIDwgMCwKICAgIGlwX2NoYW5nZSA9IGMoMCwgZGlmZihJTkRQUk8pKSA+IDAsCiAgICBjc19jaGFuZ2UgPSBjKDAsIGRpZmYoVU1DU0VOVCkpID4gMAogICkKCmRhdGEgPC0gZGF0YSAlPiUKICBtdXRhdGUoCiAgICBkaWZmdXNpb25faW5kZXggPSByb3dNZWFucyhzZWxlY3QoLiwgdW5lbV9jaGFuZ2UsIGlwX2NoYW5nZSwgY3NfY2hhbmdlKSwgbmEucm0gPSBUUlVFKSAqIDEwMAogICkKYGBgCgpUbyBzbW9vdGggb3V0IHNob3J0LXRlcm0gZmx1Y3R1YXRpb25zLCBJIGNvbXB1dGVkIGEgNi1tb250aCBtb3ZpbmcgYXZlcmFnZSBvZiB0aGUgRGlmZnVzaW9uIEluZGV4LgoKCmBgYHtyIGludGVyYWN0aXZlLXBsb3QsIGVjaG89RkFMU0V9CmxpYnJhcnkocGxvdGx5KQpsaWJyYXJ5KGRwbHlyKQpsaWJyYXJ5KHpvbykKCnBsb3RfZGF0YSA8LSBkYXRhICU+JQogIGFycmFuZ2UoZGF0ZSkgJT4lCiAgbXV0YXRlKG1vdmluZ19hdmVyYWdlID0gem9vOjpyb2xsbWVhbihkaWZmdXNpb25faW5kZXgsIGsgPSA2LCBmaWxsID0gTkEsIGFsaWduID0gInJpZ2h0IikpCgpwbG90bHlfb2JqZWN0IDwtIHBsb3RfbHkocGxvdF9kYXRhLCB4ID0gfmRhdGUpICU+JQogIGFkZF9saW5lcyh5ID0gfmRpZmZ1c2lvbl9pbmRleCwgbmFtZSA9ICJSYXcgRGlmZnVzaW9uIEluZGV4IiwgbGluZSA9IGxpc3QoY29sb3IgPSAibGlnaHRncmVlbiIpKSAlPiUKICBhZGRfbGluZXMoeSA9IH5tb3ZpbmdfYXZlcmFnZSwgbmFtZSA9ICI2LU1vbnRoIE1vdmluZyBBdmVyYWdlIiwgbGluZSA9IGxpc3QoY29sb3IgPSAiYmx1ZSIpKSAlPiUKICBhZGRfbGluZXMoeSA9IDAsIG5hbWUgPSAiQmFzZWxpbmUgKDApIiwgbGluZSA9IGxpc3QoY29sb3IgPSAiYmxhY2siLCBkYXNoID0gImRhc2giKSkgJT4lCiAgbGF5b3V0KAogICAgdGl0bGUgPSAiQ1QgRWNvbm9taWMgU2NvcmVjYXJkOiBEaWZmdXNpb24gSW5kZXgiLAogICAgeGF4aXMgPSBsaXN0KAogICAgICB0aXRsZSA9ICJEYXRlIiwKICAgICAgcmFuZ2VzbGlkZXIgPSBsaXN0KHZpc2libGUgPSBUUlVFKSAgIyBFbmFibGUgc2xpZGVyIGZvciBkYXRlcwogICAgKSwKICAgIHlheGlzID0gbGlzdCh0aXRsZSA9ICJOZXQgUmlzaW5nICglKSIpLAogICAgbGVnZW5kID0gbGlzdCgKICAgICAgb3JpZW50YXRpb24gPSAiaCIsICAjIEhvcml6b250YWwgbGVnZW5kCiAgICAgIHggPSAwLjUsICAgICAgICAgICAgIyBDZW50ZXJlZCBob3Jpem9udGFsbHkKICAgICAgeSA9IC45NSwgICAgICAgICAgICAjIFBvc2l0aW9uIGFib3ZlIHRoZSBwbG90CiAgICAgIHhhbmNob3IgPSAiY2VudGVyIiwgIyBBbGlnbiB0byB0aGUgY2VudGVyCiAgICAgIHlhbmNob3IgPSAiYm90dG9tIiAgIyBBbGlnbiBib3R0b20gb2YgdGhlIGxlZ2VuZCB0byB0aGUgdG9wIG9mIHRoZSBwbG90CiAgICApCiAgKQoKCnBsb3RseV9vYmplY3QKCmBgYAoKCiMjIyBDb21wYXJpc29uIHdpdGggQ0ZOQUlESUZGClRvIGV2YWx1YXRlIHRoZSBlZmZlY3RpdmVuZXNzIG9mIHRoZSBjdXN0b20gRGlmZnVzaW9uIEluZGV4LCBJIGNvbXBhcmVkIGl0IHRvIHRoZSBDaGljYWdvIEZlZCBOYXRpb25hbCBBY3Rpdml0eSBJbmRleDogRGlmZnVzaW9uIEluZGV4IChDRk5BSURJRkYpLCBhIHdpZGVseSByZWNvZ25pemVkIG1lYXN1cmUgb2YgZWNvbm9taWMgYWN0aXZpdHkuIFRoZSBjb21wYXJpc29uIGludm9sdmVkOgoxLiBDYWxjdWxhdGluZyB0aGUgKipQZWFyc29uIGNvcnJlbGF0aW9uIGNvZWZmaWNpZW50KiogdG8gcXVhbnRpZnkgdGhlIGFsaWdubWVudCBiZXR3ZWVuIHRoZSB0d28gaW5kaWNlcy4KCmBgYHtyLCBlY2hvPUZBTFNFfQoKZ2V0U3ltYm9scygiQ0ZOQUlESUZGIiwgc3JjID0gIkZSRUQiLCBmcm9tID0gc3RhcnRfZGF0ZSwgdG8gPSBlbmRfZGF0ZSkKY2ZuYWlkaWZmIDwtIGRhdGEuZnJhbWUoCiAgZGF0ZSA9IGluZGV4KENGTkFJRElGRiksCiAgY2ZuYWlkaWZmID0gY29yZWRhdGEoQ0ZOQUlESUZGKQopCgpmaW5hbF9kYXRhIDwtIG1lcmdlKGRhdGEsIGNmbmFpZGlmZiwgYnkgPSAiZGF0ZSIpCgpmaW5hbF9kYXRhIDwtIGZpbmFsX2RhdGEgJT4lCiAgZmlsdGVyKCFpcy5uYSh1bmVtX2NoYW5nZSkgJiAhaXMubmEoaXBfY2hhbmdlKSAmICFpcy5uYShjc19jaGFuZ2UpKQoKcGxvdF9kYXRhIDwtIGZpbmFsX2RhdGEgJT4lCiAgYXJyYW5nZShkYXRlKSAlPiUKICBtdXRhdGUobW92aW5nX2F2ZXJhZ2UgPSB6b286OnJvbGxtZWFuKGRpZmZ1c2lvbl9pbmRleCwgayA9IDYsIGZpbGwgPSBOQSwgYWxpZ24gPSAicmlnaHQiKSkKCmNvcnJlbGF0aW9uIDwtIGNvcihmaW5hbF9kYXRhJGRpZmZ1c2lvbl9pbmRleCwgZmluYWxfZGF0YSRDRk5BSURJRkYsIHVzZSA9ICJjb21wbGV0ZS5vYnMiKQoKY29ycmVsYXRpb25fc21vb3RoIDwtY29yKHBsb3RfZGF0YSRtb3ZpbmdfYXZlcmFnZSwgcGxvdF9kYXRhJENGTkFJRElGRiwgdXNlID0gImNvbXBsZXRlLm9icyIpCnByaW50KHBhc3RlKCJDb3JyZWxhdGlvbiBjb2VmZmljaWVudDoiLCByb3VuZChjb3JyZWxhdGlvbiwgMikpKQpwcmludChwYXN0ZSgiQ29ycmVsYXRpb24gY29lZmZpY2llbnQgd2l0aCBzbW9vdGggZGF0YToiLCByb3VuZChjb3JyZWxhdGlvbiwgMikpKQpgYGAKMi4gVmlzdWFsaXppbmcgYm90aCBzZXJpZXMgc2lkZSBieSBzaWRlIHVzaW5nIGBnZ3Bsb3QyYCB0byBhc3Nlc3MgdHJlbmRzIGFuZCBkaXZlcmdlbmNlcy4KYGBge3IgZWNobz1GQUxTRX0KaW50ZXJhY3RpdmVfcGxvdCA8LSBwbG90X2x5KCkgJT4lCiAgIyBQbG90IERpZmZ1c2lvbiBJbmRleCAobGVmdCB5LWF4aXMpCiAgYWRkX2xpbmVzKAogICAgZGF0YSA9IHBsb3RfZGF0YSwKICAgIHggPSB+ZGF0ZSwKICAgIHkgPSB+ZGlmZnVzaW9uX2luZGV4LAogICAgbmFtZSA9ICJEaWZmdXNpb24gSW5kZXgiLAogICAgbGluZSA9IGxpc3QoY29sb3IgPSAibGlnaHRncmVlbiIsIHdpZHRoID0gMiksCiAgICB5YXhpcyA9ICJ5IiAgIyBBc3NpZ24gdG8gdGhlIHByaW1hcnkgeS1heGlzCiAgKSAlPiUKICAjIEFkZCBzbW9vdGhlciBmb3IgRGlmZnVzaW9uIEluZGV4IChsZWZ0IHktYXhpcykKICBhZGRfbGluZXMoCiAgICBkYXRhID0gcGxvdF9kYXRhLAogICAgeCA9IH5kYXRlLAogICAgeSA9IH5tb3ZpbmdfYXZlcmFnZSwKICAgIG5hbWUgPSAiRGlmZnVzaW9uIEluZGV4IFNtb290aGVyIiwKICAgIGxpbmUgPSBsaXN0KGNvbG9yID0gImJsdWUiLCB3aWR0aCA9IDIsIGRhc2ggPSAic29saWQiKSwKICAgIHlheGlzID0gInkiICAjIEFzc2lnbiB0byB0aGUgcHJpbWFyeSB5LWF4aXMKICApICU+JQogICMgUGxvdCBDRk5BSURJRkYgb24gdGhlIHNlY29uZGFyeSB5LWF4aXMgKHJpZ2h0KQogIGFkZF9saW5lcygKICAgIGRhdGEgPSBwbG90X2RhdGEsCiAgICB4ID0gfmRhdGUsCiAgICB5ID0gfkNGTkFJRElGRiwKICAgIG5hbWUgPSAiQ0ZOQUlESUZGIiwKICAgIGxpbmUgPSBsaXN0KGNvbG9yID0gInJlZCIsIHdpZHRoID0gMiksCiAgICB5YXhpcyA9ICJ5MiIgICMgQXNzaWduIHRvIHRoZSBzZWNvbmRhcnkgeS1heGlzCiAgKSAlPiUKICAjIExheW91dCB3aXRoIHR3byB5LWF4ZXMKICBsYXlvdXQoCiAgICB0aXRsZSA9IGxpc3QodGV4dCA9ICJEaWZmdXNpb24gSW5kZXggdnMgQ0ZOQUlESUZGIiksCiAgICB4YXhpcyA9IGxpc3QoCiAgICAgIHRpdGxlID0gIkRhdGUiLAogICAgICByYW5nZXNsaWRlciA9IGxpc3QodmlzaWJsZSA9IFRSVUUpICAjIEFkZCBzbGlkZXIgdG8gc2VsZWN0IGRhdGUgcmFuZ2UKICAgICksCiAgICB5YXhpcyA9IGxpc3QoCiAgICAgIHRpdGxlID0gIkRpZmZ1c2lvbiBJbmRleCAoMC0xMDApIiwKICAgICAgdGlja2ZvbnQgPSBsaXN0KGNvbG9yID0gImxpZ2h0Z3JlZW4iKSwKICAgICAgc2hvd2dyaWQgPSBUUlVFCiAgICApLAogICAgeWF4aXMyID0gbGlzdCgKICAgICAgdGl0bGUgPSAiQ0ZOQUlESUZGICgtMSB0byAxKSIsCiAgICAgIG92ZXJsYXlpbmcgPSAieSIsICAjIE92ZXJsYXkgb24gdGhlIHNhbWUgY2hhcnQKICAgICAgc2lkZSA9ICJyaWdodCIsICAgICMgUGxhY2Ugb24gdGhlIHJpZ2h0IHNpZGUKICAgICAgdGlja2ZvbnQgPSBsaXN0KGNvbG9yID0gInJlZCIpLAogICAgICBzaG93Z3JpZCA9IEZBTFNFCiAgICApLAogICAgbGVnZW5kID0gbGlzdCgKICAgICAgb3JpZW50YXRpb24gPSAiaCIsICAjIEhvcml6b250YWwgbGVnZW5kCiAgICAgIHggPSAwLjUsICAgICAgICAgICAgIyBDZW50ZXJlZCBob3Jpem9udGFsbHkKICAgICAgeSA9IC45NSwgICAgICAgICAgICAjIFBvc2l0aW9uIGFib3ZlIHRoZSBwbG90CiAgICAgIHhhbmNob3IgPSAiY2VudGVyIiwgIyBBbGlnbiB0byB0aGUgY2VudGVyCiAgICAgIHlhbmNob3IgPSAiYm90dG9tIiAgIyBBbGlnbiBib3R0b20gb2YgdGhlIGxlZ2VuZCB0byB0aGUgdG9wIG9mIHRoZSBwbG90CiAgICApCiAgKQoKIyBEaXNwbGF5IHRoZSBpbnRlcmFjdGl2ZSBwbG90CmludGVyYWN0aXZlX3Bsb3QKYGBgCiMjIFJlc3VsdHMKCiMjIyBDb3JyZWxhdGlvbiBCZXR3ZWVuIERpZmZ1c2lvbiBJbmRleCBhbmQgQ0ZOQUlESUZGClRoZSBjdXN0b20gRGlmZnVzaW9uIEluZGV4LCBjYWxjdWxhdGVkIHVzaW5nIHRocmVlIGtleSBlY29ub21pYyB2YXJpYWJsZXMgKHVuZW1wbG95bWVudCByYXRlLCBpbmR1c3RyaWFsIHByb2R1Y3Rpb24sIGFuZCBjb25zdW1lciBzZW50aW1lbnQpLCBzaG93cyBhIG1vZGVyYXRlIHBvc2l0aXZlIGNvcnJlbGF0aW9uIHdpdGggdGhlIENoaWNhZ28gRmVkIE5hdGlvbmFsIEFjdGl2aXR5IEluZGV4OiBEaWZmdXNpb24gSW5kZXggKENGTkFJRElGRikuIFRoZSBjYWxjdWxhdGVkIGNvcnJlbGF0aW9uIGNvZWZmaWNpZW50IGlzIGFwcHJveGltYXRlbHkgKiowLjQxKiosIGluZGljYXRpbmcgdGhhdCB3aGlsZSB0aGUgdHdvIGluZGljZXMgYWxpZ24gaW4gc29tZSB0cmVuZHMsIHRoZXkgYXJlIG5vdCBwZXJmZWN0bHkgc3luY2hyb25pemVkLgoKVGhpcyBjb3JyZWxhdGlvbiBzdWdnZXN0cyB0aGF0IHRoZSBjdXN0b20gRGlmZnVzaW9uIEluZGV4IGNhcHR1cmVzIGltcG9ydGFudCBlbGVtZW50cyBvZiBicm9hZGVyIGVjb25vbWljIGFjdGl2aXR5IGJ1dCBpcyBsZXNzIGNvbXByZWhlbnNpdmUgdGhhbiBDRk5BSURJRkYsIHdoaWNoIGluY29ycG9yYXRlcyBhIGxhcmdlciBudW1iZXIgb2YgaW5kaWNhdG9ycy4gVGhlIG1vZGVyYXRlIGNvcnJlbGF0aW9uIGhpZ2hsaWdodHMgdGhlIHZhbGlkaXR5IG9mIHRoZSBjdXN0b20gaW5kZXggYXMgYSBzaW1wbGVyLCBtb3JlIGZvY3VzZWQgbWVhc3VyZSBvZiBlY29ub21pYyBhY3Rpdml0eSB3aGlsZSBhY2tub3dsZWRnaW5nIHRoYXQgc29tZSBudWFuY2VzIGNhcHR1cmVkIGJ5IENGTkFJRElGRiBtYXkgbm90IGJlIGZ1bGx5IHJlcHJlc2VudGVkLgoKIyMjIERvd253YXJkIFRyZW5kIE9ic2VydmVkClRoZSBwbG90IHJldmVhbHMgYSBjbGVhciAqKmRvd253YXJkIHRyZW5kKiogaW4gYm90aCB0aGUgY3VzdG9tIERpZmZ1c2lvbiBJbmRleCBhbmQgQ0ZOQUlESUZGIGluIHJlY2VudCBtb250aHMuIFRoaXMgZGVjbGluZSBpcyBwYXJ0aWN1bGFybHkgbm90aWNlYWJsZSBpbiB0aGUgNi1tb250aCBtb3ZpbmcgYXZlcmFnZSBvZiB0aGUgY3VzdG9tIERpZmZ1c2lvbiBJbmRleCAoYmx1ZSBsaW5lKSBhbmQgYWxpZ25zIHdpdGggdGhlIENGTkFJRElGRiAocmVkIGxpbmUpLiBUaGlzIHN1Z2dlc3RzIGEgd2Vha2VuaW5nIGluIGVjb25vbWljIG1vbWVudHVtIGFzIGZld2VyIHZhcmlhYmxlcyBhcmUgc2hvd2luZyBjb25zaXN0ZW50IGltcHJvdmVtZW50LgoKIyMjIyBLZXkgb2JzZXJ2YXRpb25zIGFib3V0IHRoZSBkb3dud2FyZCB0cmVuZCBpbmNsdWRlOgoxLiAqKlBvc3QtMjAyMiBQZXJmb3JtYW5jZToqKgogICAtIEZvbGxvd2luZyB0aGUgcG9zdC1wYW5kZW1pYyByZWNvdmVyeSBpbiAyMDIwIGFuZCAyMDIxLCBib3RoIGluZGljZXMgc2hvdyBhIGdyYWR1YWwgd2Vha2VuaW5nIHRyZW5kIHN0YXJ0aW5nIGluIGxhdGUgMjAyMiwgc3VnZ2VzdGluZyByZWR1Y2VkIGVjb25vbWljIGdyb3d0aCBvciBhIHBvdGVudGlhbCBjb29saW5nIHBoYXNlIGluIHRoZSBlY29ub215LgoKMi4gKipNYWduaXR1ZGUgb2YgdGhlIERlY2xpbmU6KioKICAgLSBUaGUgcmF3IERpZmZ1c2lvbiBJbmRleCAoZ3JlZW4gbGluZSkgc2hvd3MgZ3JlYXRlciB2b2xhdGlsaXR5LCB3aGlsZSB0aGUgc21vb3RoZXIgKGJsdWUgbGluZSkgcHJvdmlkZXMgYSBjbGVhcmVyIHBpY3R1cmUgb2Ygc3VzdGFpbmVkIGRlY2xpbmUuIFRoZSBDRk5BSURJRkYgYWxzbyBtaXJyb3JzIHRoaXMgZG93bndhcmQgbW92ZW1lbnQsIHJlaW5mb3JjaW5nIHRoZSBsaWtlbGlob29kIG9mIGEgYnJvYWQtYmFzZWQgc2xvd2Rvd24uCgozLiAqKkVjb25vbWljIEltcGxpY2F0aW9uczoqKgogICAtIFRoaXMgZG93bndhcmQgdHJlbmQgbWF5IHJlZmxlY3QgY2hhbGxlbmdlcyBzdWNoIGFzIHNsb3dpbmcgaW5kdXN0cmlhbCBwcm9kdWN0aW9uLCBjb29saW5nIGNvbnN1bWVyIHNlbnRpbWVudCwgYW5kIHBlcnNpc3RlbnQgdW5jZXJ0YWludGllcyBpbiBsYWJvciBtYXJrZXQgY29uZGl0aW9ucy4gVGhlIGFsaWdubWVudCBvZiBib3RoIGluZGljZXMgZHVyaW5nIHRoaXMgcGVyaW9kIHN0cmVuZ3RoZW5zIHRoZSBhcmd1bWVudCBmb3IgYSBwb3RlbnRpYWwgZGVjZWxlcmF0aW9uIGluIGVjb25vbWljIGFjdGl2aXR5LgoKIyMjIE92ZXJhbGwgRmluZGluZ3MKVGhlIGN1c3RvbSBEaWZmdXNpb24gSW5kZXggZWZmZWN0aXZlbHkgdHJhY2tzIG1ham9yIHRyZW5kcyBpbiBDRk5BSURJRkYsIHBhcnRpY3VsYXJseSBkdXJpbmcgc2lnbmlmaWNhbnQgZWNvbm9taWMgdHVybmluZyBwb2ludHMuIFRoZSBvYnNlcnZlZCBkb3dud2FyZCB0cmVuZCBpbiByZWNlbnQgbW9udGhzIHNpZ25hbHMgdGhhdCBlY29ub21pYyBhY3Rpdml0eSBtYXkgYmUgbG9zaW5nIG1vbWVudHVtLCB3aXRoIGZld2VyIGluZGljYXRvcnMgc2hvd2luZyBpbXByb3ZlbWVudC4gV2hpbGUgdGhlIGNvcnJlbGF0aW9uIG9mIDAuNDEgaGlnaGxpZ2h0cyB0aGF0IHRoZSBjdXN0b20gaW5kZXggaXMgbm90IGEgcGVyZmVjdCBzdWJzdGl0dXRlIGZvciBDRk5BSURJRkYsIGl0IHJlbWFpbnMgYSB1c2VmdWwgdG9vbCBmb3IgdHJhY2tpbmcgYnJvYWQgZWNvbm9taWMgZHluYW1pY3MuCgoK