Background

NextEra Energy, Inc. is one of the largest electric power companies in North America, its main focus is on clean and renewable energy. This company was founded in 1925 as the Florida Power & Light Company (FPL), the company has grown and diversified over the years.NextEra is the world’s largest generator of renewable energy from the wind and sun. It operates in 37 states and four Canadian provinces. This company has been a leader in the transition towards clean energy.

Over the years, NextEra Energy has showed strong financial performance, with consistent growth in revenues and profitability, making it an attractive option for many investors.

How has been the stock price / variable’s performance in the last year?

  • The latest closing stock price for NextEra Energy as of August 31, 2023 is 66.80.
  • The all-time high NextEra Energy stock closing price was 89.66 on December 31, 2021.
  • The NextEra Energy 52-week high stock price is 91.06, which is 36.3% above the current share price.
  • The NextEra Energy 52-week low stock price is 66.67, which is 0.2% below the current share price.
  • The average NextEra Energy stock price for the last 52 weeks is 77.21.

Libraries

library(xts)
library(dplyr)
library(zoo)
library(tseries)
library(stats)
library(forecast)
library(astsa)
library(corrplot)
library(AER)
library(vars)
library(dynlm)
library(TSstudio)
library(tidyverse)
library(sarima)
library(dygraphs)

Visualization

Stock price historical data

# setting time series format 
NEE$Date<-as.Date(NEE$Date,"%Y-%m-%d")

# Descriptive stadistics of the dependet variable 
summary(NEE$Adj.Close)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   19.44   26.81   40.04   47.19   69.48   89.62
# visualizing time series data 
# time series plot 
NEExts<-xts(NEE$Adj.Close,order.by=NEE$Date)
dygraph(NEExts, main = "NextEra Energy Stock Price") %>% 
  dyOptions(colors = RColorBrewer::brewer.pal(4, "Dark2")) %>%
  dyShading(from = "2019-1-7",
            to = "2022-12-26", 
            color = "#FFE6E6")

Decomposation of time series

# Decompose a time series
# 1) observed: data observations 
# 2) trend: increasing / decreasing value of data observations
# 3) seasonality: repeating short-term cycle in time series 
# 4) noise: random variation in time series 
NEEts<-ts(NEE$Adj.Close,frequency=52,start=c(2015,1))
NEE_ts_decompose<-decompose(NEEts)
plot(NEE_ts_decompose)      

Do the time series data show a trend?

Based on the graph, it is possible to see a positive trend according to the periods from 2015 to mid-2022, this tells us that the stock had a good performance over time since, unlike each year, its increase was maintained, for it shows us a positive trend behavior.

Do the time series data show seasonality? How is the change of the seasonal component over time?

At first glance it is possible to identify the seasonality, it is possible to see that the action follows a constant pattern over time, at the beginning of 2015 it is observed that the action decreases drastically in the middle of the year, but ends with a high peak. With the information provided, we can infer that this pattern will happen again since it tends to start at the top and in the middle of the year it has a drastic decrease and by the end of the period it increases drastically.

Estimation

Stationary

# Stationary Test 
# H0: Non-stationary and HA: Stationary. p-values < 0.05 reject the H0.
adf.test(NEE$Adj.Close)
## 
##  Augmented Dickey-Fuller Test
## 
## data:  NEE$Adj.Close
## Dickey-Fuller = -3.1841, Lag order = 7, p-value = 0.09078
## alternative hypothesis: stationary
# P-Value > 0.05. Fail to reject the H0. The time series data is non-stationary. 

Serial autocorrelation

# Serial Autocorrelation
acf(NEE$Adj.Close,main="Significant Autocorrelations")

# There is high serial autocorrelation despite the number of lags of the variable

Models

Model 1 - ARMA(log)

summary(NEE_ARMA<-arma(log(NEE$Adj.Close),order=c(1,1))) # Transforming into log to having a stationary time series
## 
## Call:
## arma(x = log(NEE$Adj.Close), order = c(1, 1))
## 
## Model:
## ARMA(1,1)
## 
## Residuals:
##       Min        1Q    Median        3Q       Max 
## -0.203261 -0.014812  0.001953  0.016020  0.179213 
## 
## Coefficient(s):
##            Estimate  Std. Error  t value Pr(>|t|)    
## ar1        0.997876    0.003145  317.275   <2e-16 ***
## ma1       -0.050680    0.051828   -0.978    0.328    
## intercept  0.011187    0.011864    0.943    0.346    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Fit:
## sigma^2 estimated as 0.001036,  Conditional Sum-of-Squares = 0.43,  AIC = -1676.21
NEE_estimated_stock_price<-exp(NEE_ARMA$fitted.values) # Applying exp to make interpretations on real numbers
plot(NEE_estimated_stock_price)

Model 2 - ARIMA

NEE_ARIMA <- Arima(NEE$Adj.Close,order=c(1,1,1))
print(NEE_ARIMA)
## Series: NEE$Adj.Close 
## ARIMA(1,1,1) 
## 
## Coefficients:
##           ar1      ma1
##       -0.0025  -0.0027
## s.e.   1.8575   1.8588
## 
## sigma^2 = 3.725:  log likelihood = -862.79
## AIC=1731.57   AICc=1731.63   BIC=1743.67
plot(NEE_ARIMA$fitted)

Model 3 - ARiMA(log)

tsmodel = Arima(log(NEE$Adj.Close),order=c(1,1,1))# Transforming into log to having a stationary time series
print(tsmodel)
## Series: log(NEE$Adj.Close) 
## ARIMA(1,1,1) 
## 
## Coefficients:
##          ar1      ma1
##       0.7705  -0.8397
## s.e.  0.0889   0.0724
## 
## sigma^2 = 0.001041:  log likelihood = 839.21
## AIC=-1672.42   AICc=-1672.36   BIC=-1660.33
confint(tsmodel)
##          2.5 %     97.5 %
## ar1  0.5962488  0.9446956
## ma1 -0.9816467 -0.6976623
plot(exp(tsmodel$fitted))# Applying exp to make interpretations on real numbers

Evaluation

Testing serial autocorrelation in regression residuals
Ho: There is no serial autocorrelation
Ha: There is serial autocorrelation

Model 1 - ARMA(log)

NEE_ARMA_residuals<-NEE_ARMA$residuals
Box.test(NEE_ARMA_residuals,lag=5,type="Ljung-Box") 
## 
##  Box-Ljung test
## 
## data:  NEE_ARMA_residuals
## X-squared = 15.638, df = 5, p-value = 0.007957
# Reject the Ho. P-value is < 0.05 indicating that ARMA Model does show residual serial autocorrelation. 

adf.test(na.omit(NEE_estimated_stock_price))
## 
##  Augmented Dickey-Fuller Test
## 
## data:  na.omit(NEE_estimated_stock_price)
## Dickey-Fuller = -3.1595, Lag order = 7, p-value = 0.09497
## alternative hypothesis: stationary
# ADF test suggest that ARMA residuals are stationary since p-value is < 0.05. 

Model 2 - ARIMA

acf(NEE_ARIMA$residuals,main="ACF - ARIMA (1,1,1)")                

# ACF plot displays weak or no autocorrelation. 

Box.test(NEE_ARIMA$residuals,lag=3,type="Ljung-Box")               
## 
##  Box-Ljung test
## 
## data:  NEE_ARIMA$residuals
## X-squared = 1.5426, df = 3, p-value = 0.6725
# P-value is > 0.05 indicating that ARMA model does not show residual serial autocorrelation. 

adf.test(NEE_ARIMA$residuals)                                      
## Warning in adf.test(NEE_ARIMA$residuals): p-value smaller than printed p-value
## 
##  Augmented Dickey-Fuller Test
## 
## data:  NEE_ARIMA$residuals
## Dickey-Fuller = -10.346, Lag order = 7, p-value = 0.01
## alternative hypothesis: stationary
# ADF test suggest that ARIMA residuals are stationary since p-value is < 0.05. 

Model 3 - ARIMA(log)

acf(tsmodel$residuals,main="ACF - ARIMA (1,1,1)") 

# ACF plot displays weak or no autocorrelation.

Box.test(tsmodel$residuals,lag=3,type="Ljung-Box")
## 
##  Box-Ljung test
## 
## data:  tsmodel$residuals
## X-squared = 3.0945, df = 3, p-value = 0.3773
# P-value is > 0.05 indicating that ARMA model does not show residual serial autocorrelation.

adf.test(tsmodel$residuals) 
## 
##  Augmented Dickey-Fuller Test
## 
## data:  tsmodel$residuals
## Dickey-Fuller = -9.082, Lag order = 7, p-value = 0.01
## alternative hypothesis: stationary
# ADF test suggest that ARMA residuals are stationary since p-value is < 0.05. 

Selected Model

To decide our winning model we compared AIC from the ARMA and ARIMA models. In our model you can see a minimal difference where the ARMA is better, has the lower AIC.

It should be mentioned that our time series is NOT stationary, however we need our time series to be stationary in order to get the best model. When our series is not stationary as was the case, the ARIMA model should be used.

Using the diagnostic tests of both models you can see if there is stationery in the residues of both models. In the residuals we can see that there is no serial autocorrelation in the ARIMA (so the difference transformations were applied) and the ARMA model if there.

Under the above context our winning model is ARIMA(Model 3).

Forecast

temp_forecast<-autoplot(forecast(exp(tsmodel$fitted)))
plot(temp_forecast)

forecast(exp(tsmodel$fitted),h=5)
##     Point Forecast    Lo 80    Hi 80    Lo 95    Hi 95
## 418       82.52227 79.37690 85.66763 77.71185 87.33269
## 419       82.64569 78.39067 86.90070 76.13820 89.15318
## 420       82.76911 77.63594 87.90227 74.91861 90.61960
## 421       82.89253 77.00815 88.77691 73.89315 91.89191
## 422       83.01595 76.46347 89.56842 72.99480 93.03709

Interpreting Results

  1. ARMA(log) regression results (AIC=-1676.21) shows better performance than ARIMA(log) results (AIC=-1672.42)
  2. Both ARMA and ARIMA results suggest that residuals are stationary
  3. ARIMA results suggest that there is no serial autocorrelation in the residuals, on the other hand, in the ARMA model it is found
  4. The forecast for the next 5 periods is for an increase the NextEra Energy stock price.

References

“NextEra Energy - 40 Year Stock Price History | NEE.” (August 31st 2023) Www.macrotrends.net, www.macrotrends.net/stocks/charts/NEE/nextera-energy/stock-price-history.

LS0tDQp0aXRsZTogIk5leHRFcmEgRW5lcmd5IFN0b2NrIFByaWNlIg0KYXV0aG9yOiAiSm9zw6kgQXJ0dXJvIFNpbHZhIEZsb3JlcyBBMDExOTgwNDksIE1hcmlhbmEgTGVhbCBMb3BleiBBMDE1NzA5NzcsIFNlYmFzdGlhbiBFc3Bpbm96YSBBMDA4MzM3MDQiDQpkYXRlOiAiYHIgU3lzLkRhdGUoKWAiDQpvdXRwdXQ6IA0KICBodG1sX2RvY3VtZW50Og0KICAgIHRvYzogVFJVRQ0KICAgIHRvY19mbG9hdDogVFJVRQ0KICAgIGNvZGVfZG93bmxvYWQ6IFRSVUUNCi0tLQ0KYGBge3IgaW5jbHVkZT1GQUxTRX0NCk5FRTwtcmVhZC5jc3YoIkM6XFxVc2Vyc1xcU2lsdmFcXERvY3VtZW50c1xcVGVjXFxDU1ZcXFNlbWVzdHJlNVxcdHNfc3RvY2tfcHJpY2VzXFx0c19zdG9ja19wcmljZXNcXE5FRS5jc3YiKQ0KYGBgDQoNCiFbXShDOlxcVXNlcnNcXFNpbHZhXFxEb2N1bWVudHNcXFRlY1xcSW1hZ2VuZXNfYWN0c1xcTkVFLmpwZykNCg0KIyMgQmFja2dyb3VuZA0KDQpOZXh0RXJhIEVuZXJneSwgSW5jLiBpcyBvbmUgb2YgdGhlIGxhcmdlc3QgZWxlY3RyaWMgcG93ZXIgY29tcGFuaWVzIGluIE5vcnRoIEFtZXJpY2EsIGl0cyBtYWluIGZvY3VzIGlzIG9uIGNsZWFuIGFuZCByZW5ld2FibGUgZW5lcmd5LiBUaGlzIGNvbXBhbnkgd2FzIGZvdW5kZWQgaW4gMTkyNSBhcyB0aGUgRmxvcmlkYSBQb3dlciAmIExpZ2h0IENvbXBhbnkgKEZQTCksIHRoZSBjb21wYW55IGhhcyBncm93biBhbmQgZGl2ZXJzaWZpZWQgb3ZlciB0aGUgeWVhcnMuTmV4dEVyYSBpcyB0aGUgd29ybGQncyBsYXJnZXN0IGdlbmVyYXRvciBvZiByZW5ld2FibGUgZW5lcmd5IGZyb20gdGhlIHdpbmQgYW5kIHN1bi4gSXQgb3BlcmF0ZXMgaW4gMzcgc3RhdGVzIGFuZCBmb3VyIENhbmFkaWFuIHByb3ZpbmNlcy4gVGhpcyBjb21wYW55IGhhcyBiZWVuIGEgbGVhZGVyIGluIHRoZSB0cmFuc2l0aW9uIHRvd2FyZHMgY2xlYW4gZW5lcmd5LiAgDQoNCk92ZXIgdGhlIHllYXJzLCBOZXh0RXJhIEVuZXJneSBoYXMgc2hvd2VkIHN0cm9uZyBmaW5hbmNpYWwgcGVyZm9ybWFuY2UsIHdpdGggY29uc2lzdGVudCBncm93dGggaW4gcmV2ZW51ZXMgYW5kIHByb2ZpdGFiaWxpdHksIG1ha2luZyBpdCBhbiBhdHRyYWN0aXZlIG9wdGlvbiBmb3IgbWFueSBpbnZlc3RvcnMuICANCiAgDQogIA0KIyMjIyBIb3cgaGFzIGJlZW4gdGhlIHN0b2NrIHByaWNlIC8gdmFyaWFibGXigJlzIHBlcmZvcm1hbmNlIGluIHRoZSBsYXN0IHllYXI/ICANCg0KLSBUaGUgbGF0ZXN0IGNsb3Npbmcgc3RvY2sgcHJpY2UgZm9yIE5leHRFcmEgRW5lcmd5IGFzIG9mIEF1Z3VzdCAzMSwgMjAyMyBpcyA2Ni44MC4gIA0KLSBUaGUgYWxsLXRpbWUgaGlnaCBOZXh0RXJhIEVuZXJneSBzdG9jayBjbG9zaW5nIHByaWNlIHdhcyA4OS42NiBvbiBEZWNlbWJlciAzMSwgMjAyMS4gIA0KLSBUaGUgTmV4dEVyYSBFbmVyZ3kgNTItd2VlayBoaWdoIHN0b2NrIHByaWNlIGlzIDkxLjA2LCB3aGljaCBpcyAzNi4zJSBhYm92ZSB0aGUgY3VycmVudCBzaGFyZSBwcmljZS4gIA0KLSBUaGUgTmV4dEVyYSBFbmVyZ3kgNTItd2VlayBsb3cgc3RvY2sgcHJpY2UgaXMgNjYuNjcsIHdoaWNoIGlzIDAuMiUgYmVsb3cgdGhlIGN1cnJlbnQgc2hhcmUgcHJpY2UuICANCi0gVGhlIGF2ZXJhZ2UgTmV4dEVyYSBFbmVyZ3kgc3RvY2sgcHJpY2UgZm9yIHRoZSBsYXN0IDUyIHdlZWtzIGlzIDc3LjIxLiAgDQoNCg0KIyMgTGlicmFyaWVzDQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KbGlicmFyeSh4dHMpDQpsaWJyYXJ5KGRwbHlyKQ0KbGlicmFyeSh6b28pDQpsaWJyYXJ5KHRzZXJpZXMpDQpsaWJyYXJ5KHN0YXRzKQ0KbGlicmFyeShmb3JlY2FzdCkNCmxpYnJhcnkoYXN0c2EpDQpsaWJyYXJ5KGNvcnJwbG90KQ0KbGlicmFyeShBRVIpDQpsaWJyYXJ5KHZhcnMpDQpsaWJyYXJ5KGR5bmxtKQ0KbGlicmFyeShUU3N0dWRpbykNCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShzYXJpbWEpDQpsaWJyYXJ5KGR5Z3JhcGhzKQ0KYGBgDQoNCiMjIFZpc3VhbGl6YXRpb24NCg0KIyMjIFN0b2NrIHByaWNlIGhpc3RvcmljYWwgZGF0YQ0KYGBge3IgdGltZSBzZXJpZXMgcGxvdCwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCiMgc2V0dGluZyB0aW1lIHNlcmllcyBmb3JtYXQgDQpORUUkRGF0ZTwtYXMuRGF0ZShORUUkRGF0ZSwiJVktJW0tJWQiKQ0KDQojIERlc2NyaXB0aXZlIHN0YWRpc3RpY3Mgb2YgdGhlIGRlcGVuZGV0IHZhcmlhYmxlIA0Kc3VtbWFyeShORUUkQWRqLkNsb3NlKQ0KDQojIHZpc3VhbGl6aW5nIHRpbWUgc2VyaWVzIGRhdGEgDQojIHRpbWUgc2VyaWVzIHBsb3QgDQpORUV4dHM8LXh0cyhORUUkQWRqLkNsb3NlLG9yZGVyLmJ5PU5FRSREYXRlKQ0KZHlncmFwaChORUV4dHMsIG1haW4gPSAiTmV4dEVyYSBFbmVyZ3kgU3RvY2sgUHJpY2UiKSAlPiUgDQogIGR5T3B0aW9ucyhjb2xvcnMgPSBSQ29sb3JCcmV3ZXI6OmJyZXdlci5wYWwoNCwgIkRhcmsyIikpICU+JQ0KICBkeVNoYWRpbmcoZnJvbSA9ICIyMDE5LTEtNyIsDQogICAgICAgICAgICB0byA9ICIyMDIyLTEyLTI2IiwgDQogICAgICAgICAgICBjb2xvciA9ICIjRkZFNkU2IikNCmBgYA0KDQojIyMgRGVjb21wb3NhdGlvbiBvZiB0aW1lIHNlcmllcw0KYGBge3IgRGVjb21wb3NlLCB3YXJuaW5nPUZBTFNFfQ0KIyBEZWNvbXBvc2UgYSB0aW1lIHNlcmllcw0KIyAxKSBvYnNlcnZlZDogZGF0YSBvYnNlcnZhdGlvbnMgDQojIDIpIHRyZW5kOiBpbmNyZWFzaW5nIC8gZGVjcmVhc2luZyB2YWx1ZSBvZiBkYXRhIG9ic2VydmF0aW9ucw0KIyAzKSBzZWFzb25hbGl0eTogcmVwZWF0aW5nIHNob3J0LXRlcm0gY3ljbGUgaW4gdGltZSBzZXJpZXMgDQojIDQpIG5vaXNlOiByYW5kb20gdmFyaWF0aW9uIGluIHRpbWUgc2VyaWVzIA0KTkVFdHM8LXRzKE5FRSRBZGouQ2xvc2UsZnJlcXVlbmN5PTUyLHN0YXJ0PWMoMjAxNSwxKSkNCk5FRV90c19kZWNvbXBvc2U8LWRlY29tcG9zZShORUV0cykNCnBsb3QoTkVFX3RzX2RlY29tcG9zZSkgICAgICANCmBgYA0KDQojIyMjIERvIHRoZSB0aW1lIHNlcmllcyBkYXRhIHNob3cgYSB0cmVuZD8gICAgDQpCYXNlZCBvbiB0aGUgZ3JhcGgsIGl0IGlzIHBvc3NpYmxlIHRvIHNlZSBhIHBvc2l0aXZlIHRyZW5kIGFjY29yZGluZyB0byB0aGUgcGVyaW9kcyBmcm9tIDIwMTUgdG8gbWlkLTIwMjIsIHRoaXMgdGVsbHMgdXMgdGhhdCB0aGUgc3RvY2sgaGFkIGEgZ29vZCBwZXJmb3JtYW5jZSBvdmVyIHRpbWUgc2luY2UsIHVubGlrZSBlYWNoIHllYXIsIGl0cyBpbmNyZWFzZSB3YXMgbWFpbnRhaW5lZCwgZm9yIGl0IHNob3dzIHVzIGEgcG9zaXRpdmUgdHJlbmQgYmVoYXZpb3IuICANCg0KIyMjIyBEbyB0aGUgdGltZSBzZXJpZXMgZGF0YSBzaG93IHNlYXNvbmFsaXR5PyBIb3cgaXMgdGhlIGNoYW5nZSBvZiB0aGUgc2Vhc29uYWwgY29tcG9uZW50IG92ZXIgdGltZT8gICAgDQpBdCBmaXJzdCBnbGFuY2UgaXQgaXMgcG9zc2libGUgdG8gaWRlbnRpZnkgdGhlIHNlYXNvbmFsaXR5LCBpdCBpcyBwb3NzaWJsZSB0byBzZWUgdGhhdCB0aGUgYWN0aW9uIGZvbGxvd3MgYSBjb25zdGFudCBwYXR0ZXJuIG92ZXIgdGltZSwgYXQgdGhlIGJlZ2lubmluZyBvZiAyMDE1IGl0IGlzIG9ic2VydmVkIHRoYXQgdGhlIGFjdGlvbiBkZWNyZWFzZXMgZHJhc3RpY2FsbHkgaW4gdGhlIG1pZGRsZSBvZiB0aGUgeWVhciwgYnV0IGVuZHMgd2l0aCBhIGhpZ2ggcGVhay4gV2l0aCB0aGUgaW5mb3JtYXRpb24gcHJvdmlkZWQsIHdlIGNhbiBpbmZlciB0aGF0IHRoaXMgcGF0dGVybiB3aWxsIGhhcHBlbiBhZ2FpbiBzaW5jZSBpdCB0ZW5kcyB0byBzdGFydCBhdCB0aGUgdG9wIGFuZCBpbiB0aGUgbWlkZGxlIG9mIHRoZSB5ZWFyIGl0IGhhcyBhIGRyYXN0aWMgZGVjcmVhc2UgYW5kIGJ5IHRoZSBlbmQgb2YgdGhlIHBlcmlvZCBpdCBpbmNyZWFzZXMgZHJhc3RpY2FsbHkuICANCg0KIyMgRXN0aW1hdGlvbg0KDQojIyMgU3RhdGlvbmFyeQ0KYGBge3IgU3RhdGlvbmFyeSB0ZXN0LCB3YXJuaW5nPUZBTFNFfQ0KIyBTdGF0aW9uYXJ5IFRlc3QgDQojIEgwOiBOb24tc3RhdGlvbmFyeSBhbmQgSEE6IFN0YXRpb25hcnkuIHAtdmFsdWVzIDwgMC4wNSByZWplY3QgdGhlIEgwLg0KYWRmLnRlc3QoTkVFJEFkai5DbG9zZSkNCiMgUC1WYWx1ZSA+IDAuMDUuIEZhaWwgdG8gcmVqZWN0IHRoZSBIMC4gVGhlIHRpbWUgc2VyaWVzIGRhdGEgaXMgbm9uLXN0YXRpb25hcnkuIA0KYGBgDQoNCiMjIyBTZXJpYWwgYXV0b2NvcnJlbGF0aW9uDQpgYGB7cn0NCiMgU2VyaWFsIEF1dG9jb3JyZWxhdGlvbg0KYWNmKE5FRSRBZGouQ2xvc2UsbWFpbj0iU2lnbmlmaWNhbnQgQXV0b2NvcnJlbGF0aW9ucyIpDQojIFRoZXJlIGlzIGhpZ2ggc2VyaWFsIGF1dG9jb3JyZWxhdGlvbiBkZXNwaXRlIHRoZSBudW1iZXIgb2YgbGFncyBvZiB0aGUgdmFyaWFibGUNCmBgYA0KDQoNCiMjIyBNb2RlbHMgDQoNCiMjIyMgTW9kZWwgMSAtIEFSTUEobG9nKQ0KYGBge3J9DQpzdW1tYXJ5KE5FRV9BUk1BPC1hcm1hKGxvZyhORUUkQWRqLkNsb3NlKSxvcmRlcj1jKDEsMSkpKSAjIFRyYW5zZm9ybWluZyBpbnRvIGxvZyB0byBoYXZpbmcgYSBzdGF0aW9uYXJ5IHRpbWUgc2VyaWVzDQpORUVfZXN0aW1hdGVkX3N0b2NrX3ByaWNlPC1leHAoTkVFX0FSTUEkZml0dGVkLnZhbHVlcykgIyBBcHBseWluZyBleHAgdG8gbWFrZSBpbnRlcnByZXRhdGlvbnMgb24gcmVhbCBudW1iZXJzDQpwbG90KE5FRV9lc3RpbWF0ZWRfc3RvY2tfcHJpY2UpDQpgYGANCg0KIyMjIyBNb2RlbCAyIC0gQVJJTUENCmBgYHtyfQ0KTkVFX0FSSU1BIDwtIEFyaW1hKE5FRSRBZGouQ2xvc2Usb3JkZXI9YygxLDEsMSkpDQpwcmludChORUVfQVJJTUEpDQpwbG90KE5FRV9BUklNQSRmaXR0ZWQpDQpgYGANCg0KIyMjIyBNb2RlbCAzIC0gQVJpTUEobG9nKQ0KYGBge3J9DQp0c21vZGVsID0gQXJpbWEobG9nKE5FRSRBZGouQ2xvc2UpLG9yZGVyPWMoMSwxLDEpKSMgVHJhbnNmb3JtaW5nIGludG8gbG9nIHRvIGhhdmluZyBhIHN0YXRpb25hcnkgdGltZSBzZXJpZXMNCnByaW50KHRzbW9kZWwpDQoNCmNvbmZpbnQodHNtb2RlbCkNCg0KcGxvdChleHAodHNtb2RlbCRmaXR0ZWQpKSMgQXBwbHlpbmcgZXhwIHRvIG1ha2UgaW50ZXJwcmV0YXRpb25zIG9uIHJlYWwgbnVtYmVycw0KYGBgDQoNCiMjIEV2YWx1YXRpb24NCg0KVGVzdGluZyBzZXJpYWwgYXV0b2NvcnJlbGF0aW9uIGluIHJlZ3Jlc3Npb24gcmVzaWR1YWxzICAgDQpIbzogVGhlcmUgaXMgbm8gc2VyaWFsIGF1dG9jb3JyZWxhdGlvbiAgIA0KSGE6IFRoZXJlIGlzIHNlcmlhbCBhdXRvY29ycmVsYXRpb24gIA0KDQojIyMjIE1vZGVsIDEgLSBBUk1BKGxvZykNCmBgYHtyfQ0KTkVFX0FSTUFfcmVzaWR1YWxzPC1ORUVfQVJNQSRyZXNpZHVhbHMNCkJveC50ZXN0KE5FRV9BUk1BX3Jlc2lkdWFscyxsYWc9NSx0eXBlPSJManVuZy1Cb3giKSANCiMgUmVqZWN0IHRoZSBIby4gUC12YWx1ZSBpcyA8IDAuMDUgaW5kaWNhdGluZyB0aGF0IEFSTUEgTW9kZWwgZG9lcyBzaG93IHJlc2lkdWFsIHNlcmlhbCBhdXRvY29ycmVsYXRpb24uIA0KDQphZGYudGVzdChuYS5vbWl0KE5FRV9lc3RpbWF0ZWRfc3RvY2tfcHJpY2UpKQ0KIyBBREYgdGVzdCBzdWdnZXN0IHRoYXQgQVJNQSByZXNpZHVhbHMgYXJlIHN0YXRpb25hcnkgc2luY2UgcC12YWx1ZSBpcyA8IDAuMDUuIA0KYGBgDQoNCiMjIyMgTW9kZWwgMiAtIEFSSU1BDQpgYGB7cn0NCmFjZihORUVfQVJJTUEkcmVzaWR1YWxzLG1haW49IkFDRiAtIEFSSU1BICgxLDEsMSkiKSAgICAgICAgICAgICAgICANCiMgQUNGIHBsb3QgZGlzcGxheXMgd2VhayBvciBubyBhdXRvY29ycmVsYXRpb24uIA0KDQpCb3gudGVzdChORUVfQVJJTUEkcmVzaWR1YWxzLGxhZz0zLHR5cGU9IkxqdW5nLUJveCIpICAgICAgICAgICAgICAgDQojIFAtdmFsdWUgaXMgPiAwLjA1IGluZGljYXRpbmcgdGhhdCBBUk1BIG1vZGVsIGRvZXMgbm90IHNob3cgcmVzaWR1YWwgc2VyaWFsIGF1dG9jb3JyZWxhdGlvbi4gDQoNCmFkZi50ZXN0KE5FRV9BUklNQSRyZXNpZHVhbHMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiMgQURGIHRlc3Qgc3VnZ2VzdCB0aGF0IEFSSU1BIHJlc2lkdWFscyBhcmUgc3RhdGlvbmFyeSBzaW5jZSBwLXZhbHVlIGlzIDwgMC4wNS4gDQoNCmBgYA0KDQojIyMjIE1vZGVsIDMgLSBBUklNQShsb2cpDQpgYGB7ciB3YXJuaW5nPUZBTFNFfQ0KIA0KYWNmKHRzbW9kZWwkcmVzaWR1YWxzLG1haW49IkFDRiAtIEFSSU1BICgxLDEsMSkiKSANCiMgQUNGIHBsb3QgZGlzcGxheXMgd2VhayBvciBubyBhdXRvY29ycmVsYXRpb24uDQoNCkJveC50ZXN0KHRzbW9kZWwkcmVzaWR1YWxzLGxhZz0zLHR5cGU9IkxqdW5nLUJveCIpDQojIFAtdmFsdWUgaXMgPiAwLjA1IGluZGljYXRpbmcgdGhhdCBBUk1BIG1vZGVsIGRvZXMgbm90IHNob3cgcmVzaWR1YWwgc2VyaWFsIGF1dG9jb3JyZWxhdGlvbi4NCg0KYWRmLnRlc3QodHNtb2RlbCRyZXNpZHVhbHMpIA0KIyBBREYgdGVzdCBzdWdnZXN0IHRoYXQgQVJNQSByZXNpZHVhbHMgYXJlIHN0YXRpb25hcnkgc2luY2UgcC12YWx1ZSBpcyA8IDAuMDUuIA0KYGBgDQoNCiMjIyBTZWxlY3RlZCBNb2RlbA0KVG8gZGVjaWRlIG91ciB3aW5uaW5nIG1vZGVsIHdlIGNvbXBhcmVkIEFJQyBmcm9tIHRoZSBBUk1BIGFuZCBBUklNQSBtb2RlbHMuIEluIG91ciBtb2RlbCB5b3UgY2FuIHNlZSBhIG1pbmltYWwgZGlmZmVyZW5jZSB3aGVyZSB0aGUgQVJNQSBpcyBiZXR0ZXIsIGhhcyB0aGUgbG93ZXIgQUlDLiAgDQoNCkl0IHNob3VsZCBiZSBtZW50aW9uZWQgdGhhdCBvdXIgdGltZSBzZXJpZXMgaXMgTk9UIHN0YXRpb25hcnksIGhvd2V2ZXIgd2UgbmVlZCBvdXIgdGltZSBzZXJpZXMgdG8gYmUgc3RhdGlvbmFyeSBpbiBvcmRlciB0byBnZXQgdGhlIGJlc3QgbW9kZWwuIFdoZW4gb3VyIHNlcmllcyBpcyBub3Qgc3RhdGlvbmFyeSBhcyB3YXMgdGhlIGNhc2UsIHRoZSBBUklNQSBtb2RlbCBzaG91bGQgYmUgdXNlZC4gICANCg0KVXNpbmcgdGhlIGRpYWdub3N0aWMgdGVzdHMgb2YgYm90aCBtb2RlbHMgeW91IGNhbiBzZWUgaWYgdGhlcmUgaXMgc3RhdGlvbmVyeSBpbiB0aGUgcmVzaWR1ZXMgb2YgYm90aCBtb2RlbHMuIEluIHRoZSByZXNpZHVhbHMgd2UgY2FuIHNlZSB0aGF0IHRoZXJlIGlzIG5vIHNlcmlhbCBhdXRvY29ycmVsYXRpb24gaW4gdGhlIEFSSU1BIChzbyB0aGUgZGlmZmVyZW5jZSB0cmFuc2Zvcm1hdGlvbnMgd2VyZSBhcHBsaWVkKSBhbmQgdGhlIEFSTUEgbW9kZWwgaWYgdGhlcmUuICAgDQoNClVuZGVyIHRoZSBhYm92ZSBjb250ZXh0IG91ciB3aW5uaW5nIG1vZGVsIGlzIEFSSU1BKE1vZGVsIDMpLiAgDQoNCiMjIEZvcmVjYXN0DQpgYGB7cn0NCnRlbXBfZm9yZWNhc3Q8LWF1dG9wbG90KGZvcmVjYXN0KGV4cCh0c21vZGVsJGZpdHRlZCkpKQ0KcGxvdCh0ZW1wX2ZvcmVjYXN0KQ0KDQpmb3JlY2FzdChleHAodHNtb2RlbCRmaXR0ZWQpLGg9NSkNCmBgYA0KDQojIyMjIEludGVycHJldGluZyBSZXN1bHRzDQoNCmEuIEFSTUEobG9nKSByZWdyZXNzaW9uIHJlc3VsdHMgKEFJQz0tMTY3Ni4yMSkgc2hvd3MgYmV0dGVyIHBlcmZvcm1hbmNlIHRoYW4gQVJJTUEobG9nKSByZXN1bHRzIChBSUM9LTE2NzIuNDIpICANCmIuIEJvdGggQVJNQSBhbmQgQVJJTUEgcmVzdWx0cyBzdWdnZXN0IHRoYXQgcmVzaWR1YWxzIGFyZSBzdGF0aW9uYXJ5DQpjLiBBUklNQSByZXN1bHRzIHN1Z2dlc3QgdGhhdCB0aGVyZSBpcyBubyBzZXJpYWwgYXV0b2NvcnJlbGF0aW9uIGluIHRoZSByZXNpZHVhbHMsIG9uIHRoZSBvdGhlciBoYW5kLCBpbiB0aGUgQVJNQSBtb2RlbCBpdCBpcyBmb3VuZA0KZC4gVGhlIGZvcmVjYXN0IGZvciB0aGUgbmV4dCA1IHBlcmlvZHMgaXMgZm9yIGFuIGluY3JlYXNlIHRoZSBOZXh0RXJhIEVuZXJneSBzdG9jayBwcmljZS4NCg0KDQojIyBSZWZlcmVuY2VzDQrigJxOZXh0RXJhIEVuZXJneSAtIDQwIFllYXIgU3RvY2sgUHJpY2UgSGlzdG9yeSB8IE5FRS7igJ0gKEF1Z3VzdCAzMXN0IDIwMjMpIFd3dy5tYWNyb3RyZW5kcy5uZXQsIHd3dy5tYWNyb3RyZW5kcy5uZXQvc3RvY2tzL2NoYXJ0cy9ORUUvbmV4dGVyYS1lbmVyZ3kvc3RvY2stcHJpY2UtaGlzdG9yeS4gIA==