Introduction
Alvin Tan created interesting Noteboook, which is partly
used in this presentation. The Investopedia information source
is also used. In addition, a Bookdown of Technical
Analysis with R (second edition) from Ko Chiu Yu and ChatGPT were
helpful with the coding in R.
Technical analysis is a method to predict price movement in the
financial markets. Unlike the usual balance sheet analysis (fundamental
investing), technical analysis estimates the value of a given stock
using underlying trends of the price movement. The core assumption
behind this method is that the fundamentals (information from financial
statements) were factored into the price fluctuation, hence, detecting
the patterns and signals from the fluctuation should provide sufficient
indicator for future performance.
For this project, we are going to explore some of the common
technical indicators using the TQQQ Exchange trade fund (ETF) stock.
Among leveraged ETFs, ProShares UltraPro QQQ (TQQQ) is one of the
largest with assets under management of \(\$18.56\) billion as of July 2022. TQQQ is
also one of the more heavily traded leveraged ETFs in the U.S. with an
average daily volume of \(\$5.29\)
billion (compared with QQQ’s \(\$21\)
billion).
TQQQ carries an expense
ratio of 0.95%.
#install.packages("quantmod")
#install.packages("data.table")
#install.packages("ggplot2")
#install.packages("tidyquant")
library(quantmod)
library(data.table)
library(ggplot2)
library(tidyquant)
structure of the stock data
stock <<- as.data.table(MSFT) ###### change TQQQ ticker to Your ticker symbol #########
names(stock)[1] <- c('Date')
tail(stock)
Interpretation of the HLCO graph
In finance, HLCO graph is a type of financial chart that plots the
high, low, close, and open prices for a given period of time. The HLCO
chart is similar to a candlestick chart, but it includes the open price
in addition to the high, low, and close prices.
The interpretation of an HLCO chart can provide insights into the
price action of a security during a given period of time. Here is a
brief explanation of how to interpret each component of an HLCO
chart:
High: The top of the vertical line represents the highest price
reached during the given period. This shows the highest price that
buyers were willing to pay for the security during the period.
Low: The bottom of the vertical line represents the lowest price
reached during the given period. This shows the lowest price that
sellers were willing to accept for the security during the
period.
Close: The horizontal line to the right of the vertical line
represents the closing price for the period. This shows the final price
at which the security traded during the period.
Open: The horizontal line to the left of the vertical line
represents the opening price for the period. This shows the initial
price at which the security traded during the period.
By looking at the patterns of the high, low, close, and open prices
in an HLCO chart, traders and investors can gain insight into the
overall trend and sentiment of the market for the given security. For
example, a long green candlestick with a high close and low open may
indicate bullish sentiment, while a long red candlestick with a low
close and high open may indicate bearish sentiment.
# feel free to change "HLCO" to "candlestick" or to some other types ("lines", "auto").
chartSeries(stock, subset='2020-01-01::2020-09-23', type = "candlesticks", bar.type = "ohlc",theme=chartTheme('white'))

My analysis is based on Microsoft. The code of this company is MSFT.
I used two different charts to carry out the analysis: the first is the
“HLCO chart” and the second is the last chart of the ” Price - Moving
Average “.
The HLCO chart is a chart that shows the high, low, close and open
prices for the trading periods (usually on a daily time frame). These
prices represent the fundamental characteristics of the price movement
of a particular security (e.g. a stock). The trading period is observed
in the chart from 2 January 2020 to 23 September 2020. After the open,
the value of Microsoft shares was around $160million. In the following
periods, it started to rise slightly, reaching roughly 165 million at
the end of January. Then a tiny drop was seen in early February to 160
million. After that, we see a sharp rise until around the beginning of
March, when it reached $190 million. From the beginning of March, the
share price started to fluctuate continuously, with the result that by
about mid-April the share price had reached its low point, i.e. it had
fallen to around 125 million. Thereafter, a steady rise was seen until
the beginning of July, after which a slight decline was seen. By the
beginning of September, the share reaches the high point of almost 240
million dollars. Then it starts to fall again.
Volume
One of the most common basic indicators traders examine is the
trading volume. Trading volume is an indication for the ‘activeness’ of
a financial instrument. Depending on the financial instruments, trading
volume can be measured either using the number of stocks traded or
number of contracts with changed ownerships. To put this in practice, if
an increase in volume is observed with a steady increase in price, the
instrument can be viewed as steady and strong. However, if volume and
price are changing in different directions, a reversal might be
happened.
You can analyze it in the previous picture.
Price - Moving Average
chartSeries(stock,
subset='2020-01-01::2020-09-23', type = "candlestick",
theme=chartTheme('white'))

addSMA(n = 12, on = 1, with.col = Cl, overlay = TRUE, col = "brown")

addSMA(n = 24, on = 1, with.col = Cl, overlay = TRUE, col = "blue")

NA
NA
Here you can see my next analysis, which is the Moving Avarage. The
period shown in the figure is also from 2 January 2020 to 23 August
2020. After the opening, an increase in the market can be seen. The blue
line crosses the red line around the beginning of March. Then a decline
is seen until mid April, where the two lines, red and blue, cross again.
Then the market starts a sharp rise until mid-July. Then a small decline
is seen until around the beginning of August. Then it starts to rise
again and reaches a peak in early September and then starts to fall
again.
Moving Average Convergence Divergence (MACD)
chartSeries(stock,
subset='2020-01-01::2020-09-23', type = "bars",
theme=chartTheme('white'))

addMACD(fast=12,slow=26,signal=9,type="EMA")

Bollinger Band
chartSeries(stock,
subset='2020-01-01::2020-09-23', type = "bars",
theme=chartTheme('white'))

addBBands(n = 20, sd = 2, maType = "SMA", draw = 'bands', on = -1)

Relative Strength Index (RSI)
chartSeries(stock,
subset='2020-01-01::2020-09-23', type = "bars",
theme=chartTheme('white'))

addRSI(n = 14, maType = "EMA", wilder = TRUE)

Parabolic stop and reversal
chartSeries(stock,
subset='2020-01-01::2020-09-23', type = "bars",
theme=chartTheme('white'))

addSAR(accel = c(0.02, 0.2), col = "blue")

NA
NA
Summary graphs
Apart from the few that was mentioned above, other indicators include
rate of change, money flow index (MFI), MACD and etc.
Chart Series
ChartSeries provides an alternative way to summarise the plot.
Instead of one plot for each indicator, all of them can now be compiled
into a single figure, where indicators can be added to the bottom of the
existing plot.
chartSeries(stock,
subset='2020-01-01::2020-09-23', type = "bars",
theme=chartTheme('white'))

addBBands(n=20,sd=2)

addRSI(n=14,maType="EMA")

addMACD(fast=12,slow=26,signal=9,type="EMA")

LS0tCnRpdGxlOiAiVGVjaG5pY2FsIGFuYWx5c2lzIGluIFIiCm91dHB1dDogaHRtbF9ub3RlYm9vawotLS0KCiMjIEludHJvZHVjdGlvbgoKQWx2aW4gVGFuIGNyZWF0ZWQgaW50ZXJlc3RpbmcgW05vdGVib29va10oaHR0cDovL3JwdWJzLmNvbS96aGVzaHVlbi82NjU2MTYpLCB3aGljaCBpcyBwYXJ0bHkgdXNlZCBpbiB0aGlzIHByZXNlbnRhdGlvbi4gVGhlIFtJbnZlc3RvcGVkaWFdKGh0dHBzOi8vd3d3LmludmVzdG9wZWRpYS5jb20vKSBpbmZvcm1hdGlvbiBzb3VyY2UgaXMgYWxzbyB1c2VkLiBJbiBhZGRpdGlvbiwgYSBCb29rZG93biBvZiBbVGVjaG5pY2FsIEFuYWx5c2lzIHdpdGggUiAoc2Vjb25kIGVkaXRpb24pIGZyb20gS28gQ2hpdSBZdV0oaHR0cHM6Ly9ib29rZG93bi5vcmcva29jaGl1eXUvdGVjaG5pY2FsLWFuYWx5c2lzLXdpdGgtci1zZWNvbmQtZWRpdGlvbjIvKSAgYW5kIENoYXRHUFQgd2VyZSBoZWxwZnVsIHdpdGggdGhlIGNvZGluZyBpbiBSLgoKVGVjaG5pY2FsIGFuYWx5c2lzIGlzIGEgbWV0aG9kIHRvIHByZWRpY3QgcHJpY2UgbW92ZW1lbnQgaW4gdGhlIGZpbmFuY2lhbCBtYXJrZXRzLiBVbmxpa2UgdGhlIHVzdWFsIGJhbGFuY2Ugc2hlZXQgYW5hbHlzaXMgKGZ1bmRhbWVudGFsIGludmVzdGluZyksIHRlY2huaWNhbCBhbmFseXNpcyBlc3RpbWF0ZXMgdGhlIHZhbHVlIG9mIGEgZ2l2ZW4gc3RvY2sgdXNpbmcgdW5kZXJseWluZyB0cmVuZHMgb2YgdGhlIHByaWNlIG1vdmVtZW50LiBUaGUgY29yZSBhc3N1bXB0aW9uIGJlaGluZCB0aGlzIG1ldGhvZCBpcyB0aGF0IHRoZSBmdW5kYW1lbnRhbHMgKGluZm9ybWF0aW9uIGZyb20gZmluYW5jaWFsIHN0YXRlbWVudHMpIHdlcmUgZmFjdG9yZWQgaW50byB0aGUgcHJpY2UgZmx1Y3R1YXRpb24sIGhlbmNlLCBkZXRlY3RpbmcgdGhlIHBhdHRlcm5zIGFuZCBzaWduYWxzIGZyb20gdGhlIGZsdWN0dWF0aW9uIHNob3VsZCBwcm92aWRlIHN1ZmZpY2llbnQgaW5kaWNhdG9yIGZvciBmdXR1cmUgcGVyZm9ybWFuY2UuCgpGb3IgdGhpcyBwcm9qZWN0LCB3ZSBhcmUgZ29pbmcgdG8gZXhwbG9yZSBzb21lIG9mIHRoZSBjb21tb24gdGVjaG5pY2FsIGluZGljYXRvcnMgdXNpbmcgdGhlIFRRUVEgRXhjaGFuZ2UgdHJhZGUgZnVuZCAoRVRGKSBzdG9jay4gQW1vbmcgbGV2ZXJhZ2VkIEVURnMsIFByb1NoYXJlcyBVbHRyYVBybyBRUVEgKFRRUVEpIGlzIG9uZSBvZiB0aGUgbGFyZ2VzdCB3aXRoIGFzc2V0cyB1bmRlciBtYW5hZ2VtZW50IG9mICRcJDE4LjU2JCBiaWxsaW9uIGFzIG9mIEp1bHkgMjAyMi4gVFFRUSBpcyBhbHNvIG9uZSBvZiB0aGUgbW9yZSBoZWF2aWx5IHRyYWRlZCBsZXZlcmFnZWQgRVRGcyBpbiB0aGUgVS5TLiB3aXRoIGFuIGF2ZXJhZ2UgZGFpbHkgdm9sdW1lIG9mICRcJDUuMjkkIGJpbGxpb24gKGNvbXBhcmVkIHdpdGggUVFRJ3MgJFwkMjEkIGJpbGxpb24pLgoKVFFRUSBjYXJyaWVzIGFuIFtleHBlbnNlIHJhdGlvXShodHRwczovL3d3dy5pbnZlc3RvcGVkaWEuY29tL3Rlcm1zL2UvZXhwZW5zZXJhdGlvLmFzcCkgb2YgMC45NSUuCgpgYGB7cn0KI2luc3RhbGwucGFja2FnZXMoInF1YW50bW9kIikKI2luc3RhbGwucGFja2FnZXMoImRhdGEudGFibGUiKQojaW5zdGFsbC5wYWNrYWdlcygiZ2dwbG90MiIpCiNpbnN0YWxsLnBhY2thZ2VzKCJ0aWR5cXVhbnQiKQpsaWJyYXJ5KHF1YW50bW9kKQpsaWJyYXJ5KGRhdGEudGFibGUpCmxpYnJhcnkoZ2dwbG90MikKbGlicmFyeSh0aWR5cXVhbnQpICAKYGBgCgojIyBEYXRhIEV4dHJhY3Rpb24gJiBNYW5pcHVsYXRpb24sIERhdGEgc3RydWN0dXJlCgpUUVFRIGRhdGEgaXMgZXh0cmFjdGVkIHVzaW5nIHRoZSBnZXRTeW1ib2xzIGZ1bmN0aW9uIGZyb20gWWFob28gRmluYW5jZS4gQWx0ZXJuYXRpdmVseSwgdGhlIHNvdXJjZSBjYW4gYmUgcmVwbGFjZWQgd2l0aCBGUkVELCBNeVNRTCwgR29vZ2xlLCBvciBvdGhlcnMuIFRoZSBkYXRhIGV4dHJhY3RlZCBzaG91bGQgYmUgaW4gYW4g4oCYeHRz4oCZIG9iamVjdCAtIGEgZm9ybWF0IGNvbW1vbmx5IHVzZWQgaW4gdGltZSBzZXJpZXMgYW5hbHlzaXMgd2hlcmUgb2JzZXJ2YXRpb25zIGFyZSByZWNvcmRlZCBpbiBhIG1hdHJpeCBzdHJ1Y3R1cmUgd2l0aCBhbiBpbmRleCBvZiBjb3JyZXNwb25kaW5nIHRpbWUuCgpUZWNobmljYWxseSwgYW5hbHlzaXMgY2FuIGJlIGRvbmUgaW4geHRzIGZvcm1hdCBhbG9uZSwgYnV0IGZvciB0aGUgc2FrZSBvZiBzaW1wbGljaXR5LCBkYXRhIGlzIGNvbnZlcnRlZCBpbnRvIGEgc3RhbmRhcmQgZGF0YWZyYW1lIGFuZCBpbmRleCBjb2x1bW4gaXMgcmVuYW1lZCBhcyAiRGF0ZeKAmS4gVGhlIGVuZCByZXN1bHQgaXMgc2hvd24gYXMgYmVsb3c6CgpgYGB7ciBkb3dubG9hZF9zdG9ja19oaXN0b3J5fQpnZXRTeW1ib2xzKCdNU0ZUJyxzcmMgPSAneWFob28nKSAgICAgICAjIyBjaGFuZ2UgVFFRUSB0aWNrZXIgdG8gWW91ciB0aWNrZXIgc3ltYm9sCmBgYAoKIyMgc3RydWN0dXJlIG9mIHRoZSAqc3RvY2sqIGRhdGEKCmBgYHtyfQpzdG9jayA8PC0gYXMuZGF0YS50YWJsZShNU0ZUKSAgICAgICAgIyMjIyMjIGNoYW5nZSBUUVFRIHRpY2tlciB0byBZb3VyIHRpY2tlciBzeW1ib2wgICMjIyMjIyMjIwpuYW1lcyhzdG9jaylbMV0gPC0gYygnRGF0ZScpCgp0YWlsKHN0b2NrKQpgYGAKCgojIyBJbnRlcnByZXRhdGlvbiBvZiB0aGUgSExDTyBncmFwaAoKSW4gZmluYW5jZSwgSExDTyBncmFwaCBpcyBhIHR5cGUgb2YgZmluYW5jaWFsIGNoYXJ0IHRoYXQgcGxvdHMgdGhlIGhpZ2gsIGxvdywgY2xvc2UsIGFuZCBvcGVuIHByaWNlcyBmb3IgYSBnaXZlbiBwZXJpb2Qgb2YgdGltZS4gVGhlIEhMQ08gY2hhcnQgaXMgc2ltaWxhciB0byBhIGNhbmRsZXN0aWNrIGNoYXJ0LCBidXQgaXQgaW5jbHVkZXMgdGhlIG9wZW4gcHJpY2UgaW4gYWRkaXRpb24gdG8gdGhlIGhpZ2gsIGxvdywgYW5kIGNsb3NlIHByaWNlcy4KClRoZSBpbnRlcnByZXRhdGlvbiBvZiBhbiBITENPIGNoYXJ0IGNhbiBwcm92aWRlIGluc2lnaHRzIGludG8gdGhlIHByaWNlIGFjdGlvbiBvZiBhIHNlY3VyaXR5IGR1cmluZyBhIGdpdmVuIHBlcmlvZCBvZiB0aW1lLiBIZXJlIGlzIGEgYnJpZWYgZXhwbGFuYXRpb24gb2YgaG93IHRvIGludGVycHJldCBlYWNoIGNvbXBvbmVudCBvZiBhbiBITENPIGNoYXJ0OgoKMS4gSGlnaDogVGhlIHRvcCBvZiB0aGUgdmVydGljYWwgbGluZSByZXByZXNlbnRzIHRoZSBoaWdoZXN0IHByaWNlIHJlYWNoZWQgZHVyaW5nIHRoZSBnaXZlbiBwZXJpb2QuIFRoaXMgc2hvd3MgdGhlIGhpZ2hlc3QgcHJpY2UgdGhhdCBidXllcnMgd2VyZSB3aWxsaW5nIHRvIHBheSBmb3IgdGhlIHNlY3VyaXR5IGR1cmluZyB0aGUgcGVyaW9kLgoKMi4gTG93OiBUaGUgYm90dG9tIG9mIHRoZSB2ZXJ0aWNhbCBsaW5lIHJlcHJlc2VudHMgdGhlIGxvd2VzdCBwcmljZSByZWFjaGVkIGR1cmluZyB0aGUgZ2l2ZW4gcGVyaW9kLiBUaGlzIHNob3dzIHRoZSBsb3dlc3QgcHJpY2UgdGhhdCBzZWxsZXJzIHdlcmUgd2lsbGluZyB0byBhY2NlcHQgZm9yIHRoZSBzZWN1cml0eSBkdXJpbmcgdGhlIHBlcmlvZC4KCjMuIENsb3NlOiBUaGUgaG9yaXpvbnRhbCBsaW5lIHRvIHRoZSByaWdodCBvZiB0aGUgdmVydGljYWwgbGluZSByZXByZXNlbnRzIHRoZSBjbG9zaW5nIHByaWNlIGZvciB0aGUgcGVyaW9kLiBUaGlzIHNob3dzIHRoZSBmaW5hbCBwcmljZSBhdCB3aGljaCB0aGUgc2VjdXJpdHkgdHJhZGVkIGR1cmluZyB0aGUgcGVyaW9kLgoKNC4gT3BlbjogVGhlIGhvcml6b250YWwgbGluZSB0byB0aGUgbGVmdCBvZiB0aGUgdmVydGljYWwgbGluZSByZXByZXNlbnRzIHRoZSBvcGVuaW5nIHByaWNlIGZvciB0aGUgcGVyaW9kLiBUaGlzIHNob3dzIHRoZSBpbml0aWFsIHByaWNlIGF0IHdoaWNoIHRoZSBzZWN1cml0eSB0cmFkZWQgZHVyaW5nIHRoZSBwZXJpb2QuCgpCeSBsb29raW5nIGF0IHRoZSBwYXR0ZXJucyBvZiB0aGUgaGlnaCwgbG93LCBjbG9zZSwgYW5kIG9wZW4gcHJpY2VzIGluIGFuIEhMQ08gY2hhcnQsIHRyYWRlcnMgYW5kIGludmVzdG9ycyBjYW4gZ2FpbiBpbnNpZ2h0IGludG8gdGhlIG92ZXJhbGwgdHJlbmQgYW5kIHNlbnRpbWVudCBvZiB0aGUgbWFya2V0IGZvciB0aGUgZ2l2ZW4gc2VjdXJpdHkuIEZvciBleGFtcGxlLCBhIGxvbmcgZ3JlZW4gY2FuZGxlc3RpY2sgd2l0aCBhIGhpZ2ggY2xvc2UgYW5kIGxvdyBvcGVuIG1heSBpbmRpY2F0ZSBidWxsaXNoIHNlbnRpbWVudCwgd2hpbGUgYSBsb25nIHJlZCBjYW5kbGVzdGljayB3aXRoIGEgbG93IGNsb3NlIGFuZCBoaWdoIG9wZW4gbWF5IGluZGljYXRlIGJlYXJpc2ggc2VudGltZW50LgoKYGBge3J9CiMgZmVlbCBmcmVlIHRvIGNoYW5nZSAiSExDTyIgdG8gImNhbmRsZXN0aWNrIiBvciB0byBzb21lIG90aGVyIHR5cGVzICgibGluZXMiLCAiYXV0byIpLiAKY2hhcnRTZXJpZXMoc3RvY2ssIHN1YnNldD0nMjAyMC0wMS0wMTo6MjAyMC0wOS0yMycsIHR5cGUgPSAiY2FuZGxlc3RpY2tzIiwgYmFyLnR5cGUgPSAib2hsYyIsdGhlbWU9Y2hhcnRUaGVtZSgnd2hpdGUnKSkKYGBgCk15IGFuYWx5c2lzIGlzIGJhc2VkIG9uIE1pY3Jvc29mdC4gVGhlIGNvZGUgb2YgdGhpcyBjb21wYW55IGlzIE1TRlQuIEkgdXNlZCB0d28gZGlmZmVyZW50IGNoYXJ0cyB0byBjYXJyeSBvdXQgdGhlIGFuYWx5c2lzOiB0aGUgZmlyc3QgaXMgdGhlICJITENPIGNoYXJ0IiBhbmQgdGhlIHNlY29uZCBpcyB0aGUgbGFzdCBjaGFydCBvZiB0aGUgIiBQcmljZSAtIE1vdmluZyBBdmVyYWdlICIuCgogVGhlIEhMQ08gY2hhcnQgaXMgYSBjaGFydCB0aGF0IHNob3dzIHRoZSBoaWdoLCBsb3csIGNsb3NlIGFuZCBvcGVuIHByaWNlcyBmb3IgdGhlIHRyYWRpbmcgcGVyaW9kcyAodXN1YWxseSBvbiBhIGRhaWx5IHRpbWUgZnJhbWUpLiBUaGVzZSBwcmljZXMgcmVwcmVzZW50IHRoZSBmdW5kYW1lbnRhbCBjaGFyYWN0ZXJpc3RpY3Mgb2YgdGhlIHByaWNlIG1vdmVtZW50IG9mIGEgcGFydGljdWxhciBzZWN1cml0eSAoZS5nLiBhIHN0b2NrKS4gClRoZSB0cmFkaW5nIHBlcmlvZCBpcyBvYnNlcnZlZCBpbiB0aGUgY2hhcnQgZnJvbSAyIEphbnVhcnkgMjAyMCB0byAyMyBTZXB0ZW1iZXIgMjAyMC4gQWZ0ZXIgdGhlIG9wZW4sIHRoZSB2YWx1ZSBvZiBNaWNyb3NvZnQgc2hhcmVzIHdhcyBhcm91bmQgJDE2MG1pbGxpb24uIEluIHRoZSBmb2xsb3dpbmcgcGVyaW9kcywgaXQgc3RhcnRlZCB0byByaXNlIHNsaWdodGx5LCByZWFjaGluZyByb3VnaGx5IDE2NSBtaWxsaW9uIGF0IHRoZSBlbmQgb2YgSmFudWFyeS4gVGhlbiBhIHRpbnkgZHJvcCB3YXMgc2VlbiBpbiBlYXJseSBGZWJydWFyeSB0byAxNjAgbWlsbGlvbi4gQWZ0ZXIgdGhhdCwgd2Ugc2VlIGEgc2hhcnAgcmlzZSB1bnRpbCBhcm91bmQgdGhlIGJlZ2lubmluZyBvZiBNYXJjaCwgd2hlbiBpdCByZWFjaGVkICQxOTAgbWlsbGlvbi4gIEZyb20gdGhlIGJlZ2lubmluZyBvZiBNYXJjaCwgdGhlIHNoYXJlIHByaWNlIHN0YXJ0ZWQgdG8gZmx1Y3R1YXRlIGNvbnRpbnVvdXNseSwgd2l0aCB0aGUgcmVzdWx0IHRoYXQgYnkgYWJvdXQgbWlkLUFwcmlsIHRoZSBzaGFyZSBwcmljZSBoYWQgcmVhY2hlZCBpdHMgbG93IHBvaW50LCBpLmUuIGl0IGhhZCBmYWxsZW4gdG8gYXJvdW5kIDEyNSBtaWxsaW9uLiBUaGVyZWFmdGVyLCBhIHN0ZWFkeSByaXNlIHdhcyBzZWVuIHVudGlsIHRoZSBiZWdpbm5pbmcgb2YgSnVseSwgYWZ0ZXIgd2hpY2ggYSBzbGlnaHQgZGVjbGluZSB3YXMgc2Vlbi4gQnkgdGhlIGJlZ2lubmluZyBvZiBTZXB0ZW1iZXIsIHRoZSBzaGFyZSByZWFjaGVzIHRoZSBoaWdoIHBvaW50IG9mIGFsbW9zdCAyNDAgbWlsbGlvbiBkb2xsYXJzLiBUaGVuIGl0IHN0YXJ0cyB0byBmYWxsIGFnYWluLiAKCgoKCiMjIFZvbHVtZSAKCk9uZSBvZiB0aGUgbW9zdCBjb21tb24gYmFzaWMgaW5kaWNhdG9ycyB0cmFkZXJzIGV4YW1pbmUgaXMgdGhlIHRyYWRpbmcgdm9sdW1lLiBUcmFkaW5nIHZvbHVtZSBpcyBhbiBpbmRpY2F0aW9uIGZvciB0aGUg4oCYYWN0aXZlbmVzc+KAmSBvZiBhIGZpbmFuY2lhbCBpbnN0cnVtZW50LiBEZXBlbmRpbmcgb24gdGhlIGZpbmFuY2lhbCBpbnN0cnVtZW50cywgdHJhZGluZyB2b2x1bWUgY2FuIGJlIG1lYXN1cmVkIGVpdGhlciB1c2luZyB0aGUgbnVtYmVyIG9mIHN0b2NrcyB0cmFkZWQgb3IgbnVtYmVyIG9mIGNvbnRyYWN0cyB3aXRoIGNoYW5nZWQgb3duZXJzaGlwcy4gVG8gcHV0IHRoaXMgaW4gcHJhY3RpY2UsIGlmIGFuIGluY3JlYXNlIGluIHZvbHVtZSBpcyBvYnNlcnZlZCB3aXRoIGEgc3RlYWR5IGluY3JlYXNlIGluIHByaWNlLCB0aGUgaW5zdHJ1bWVudCBjYW4gYmUgdmlld2VkIGFzIHN0ZWFkeSBhbmQgc3Ryb25nLiBIb3dldmVyLCBpZiB2b2x1bWUgYW5kIHByaWNlIGFyZSBjaGFuZ2luZyBpbiBkaWZmZXJlbnQgZGlyZWN0aW9ucywgYSByZXZlcnNhbCBtaWdodCBiZSBoYXBwZW5lZC4KCllvdSBjYW4gYW5hbHl6ZSBpdCBpbiB0aGUgcHJldmlvdXMgcGljdHVyZS4KCgojIyBQcmljZSAtIE1vdmluZyBBdmVyYWdlCgoKCmBgYHtyfQpjaGFydFNlcmllcyhzdG9jaywKICAgICAgICAgICAgc3Vic2V0PScyMDIwLTAxLTAxOjoyMDIwLTA5LTIzJywgdHlwZSA9ICJjYW5kbGVzdGljayIsCiAgICAgICAgICAgIHRoZW1lPWNoYXJ0VGhlbWUoJ3doaXRlJykpCmFkZFNNQShuID0gMTIsIG9uID0gMSwgd2l0aC5jb2wgPSBDbCwgb3ZlcmxheSA9IFRSVUUsIGNvbCA9ICJicm93biIpCmFkZFNNQShuID0gMjQsIG9uID0gMSwgd2l0aC5jb2wgPSBDbCwgb3ZlcmxheSA9IFRSVUUsIGNvbCA9ICJibHVlIikKCgpgYGAKSGVyZSB5b3UgY2FuIHNlZSBteSBuZXh0IGFuYWx5c2lzLCB3aGljaCBpcyB0aGUgTW92aW5nIEF2YXJhZ2UuIFRoZSBwZXJpb2Qgc2hvd24gaW4gdGhlIGZpZ3VyZSBpcyBhbHNvIGZyb20gMiBKYW51YXJ5IDIwMjAgdG8gMjMgQXVndXN0IDIwMjAuIEFmdGVyIHRoZSBvcGVuaW5nLCBhbiBpbmNyZWFzZSBpbiB0aGUgbWFya2V0IGNhbiBiZSBzZWVuLiBUaGUgYmx1ZSBsaW5lIGNyb3NzZXMgdGhlIHJlZCBsaW5lIGFyb3VuZCB0aGUgYmVnaW5uaW5nIG9mIE1hcmNoLiBUaGVuIGEgZGVjbGluZSBpcyBzZWVuIHVudGlsIG1pZCBBcHJpbCwgd2hlcmUgdGhlIHR3byBsaW5lcywgcmVkIGFuZCBibHVlLCBjcm9zcyBhZ2Fpbi4gVGhlbiB0aGUgbWFya2V0IHN0YXJ0cyBhIHNoYXJwIHJpc2UgdW50aWwgbWlkLUp1bHkuIFRoZW4gYSBzbWFsbCBkZWNsaW5lIGlzIHNlZW4gdW50aWwgYXJvdW5kIHRoZSBiZWdpbm5pbmcgb2YgQXVndXN0LiBUaGVuIGl0IHN0YXJ0cyB0byByaXNlIGFnYWluIGFuZCByZWFjaGVzIGEgcGVhayBpbiBlYXJseSBTZXB0ZW1iZXIgYW5kIHRoZW4gc3RhcnRzIHRvIGZhbGwgYWdhaW4uIAoKIyMgTW92aW5nIEF2ZXJhZ2UgQ29udmVyZ2VuY2UgRGl2ZXJnZW5jZSAoTUFDRCkKCgoKYGBge3J9CmNoYXJ0U2VyaWVzKHN0b2NrLAogICAgICAgICAgICBzdWJzZXQ9JzIwMjAtMDEtMDE6OjIwMjAtMDktMjMnLCB0eXBlID0gImJhcnMiLAogICAgICAgICAgICB0aGVtZT1jaGFydFRoZW1lKCd3aGl0ZScpKQphZGRNQUNEKGZhc3Q9MTIsc2xvdz0yNixzaWduYWw9OSx0eXBlPSJFTUEiKQoKYGBgCgoKIyMgQm9sbGluZ2VyIEJhbmQKCgoKCmBgYHtyfQpjaGFydFNlcmllcyhzdG9jaywKICAgICAgICAgICAgc3Vic2V0PScyMDIwLTAxLTAxOjoyMDIwLTA5LTIzJywgdHlwZSA9ICJiYXJzIiwKICAgICAgICAgICAgdGhlbWU9Y2hhcnRUaGVtZSgnd2hpdGUnKSkKYWRkQkJhbmRzKG4gPSAyMCwgc2QgPSAyLCBtYVR5cGUgPSAiU01BIiwgZHJhdyA9ICdiYW5kcycsIG9uID0gLTEpCmBgYAoKCiMjIFJlbGF0aXZlIFN0cmVuZ3RoIEluZGV4IChSU0kpCgoKCmBgYHtyfQpjaGFydFNlcmllcyhzdG9jaywKICAgICAgICAgICAgc3Vic2V0PScyMDIwLTAxLTAxOjoyMDIwLTA5LTIzJywgdHlwZSA9ICJiYXJzIiwKICAgICAgICAgICAgdGhlbWU9Y2hhcnRUaGVtZSgnd2hpdGUnKSkKYWRkUlNJKG4gPSAxNCwgbWFUeXBlID0gIkVNQSIsIHdpbGRlciA9IFRSVUUpCgpgYGAKCgoKCgojIyBQYXJhYm9saWMgc3RvcCBhbmQgcmV2ZXJzYWwKCgoKCgoKYGBge3J9CmNoYXJ0U2VyaWVzKHN0b2NrLAogICAgICAgICAgICBzdWJzZXQ9JzIwMjAtMDEtMDE6OjIwMjAtMDktMjMnLCB0eXBlID0gImJhcnMiLAogICAgICAgICAgICB0aGVtZT1jaGFydFRoZW1lKCd3aGl0ZScpKQphZGRTQVIoYWNjZWwgPSBjKDAuMDIsIDAuMiksIGNvbCA9ICJibHVlIikKCgpgYGAKCgoKCiMjIFN1bW1hcnkgZ3JhcGhzCgpBcGFydCBmcm9tIHRoZSBmZXcgdGhhdCB3YXMgbWVudGlvbmVkIGFib3ZlLCBvdGhlciBpbmRpY2F0b3JzIGluY2x1ZGUgcmF0ZSBvZiBjaGFuZ2UsIG1vbmV5IGZsb3cgaW5kZXggKE1GSSksIE1BQ0QgYW5kIGV0Yy4KCiMjIENoYXJ0IFNlcmllcwoKQ2hhcnRTZXJpZXMgcHJvdmlkZXMgYW4gYWx0ZXJuYXRpdmUgd2F5IHRvIHN1bW1hcmlzZSB0aGUgcGxvdC4gSW5zdGVhZCBvZiBvbmUgcGxvdCBmb3IgZWFjaCBpbmRpY2F0b3IsIGFsbCBvZiB0aGVtIGNhbiBub3cgYmUgY29tcGlsZWQgaW50byBhIHNpbmdsZSBmaWd1cmUsIHdoZXJlIGluZGljYXRvcnMgY2FuIGJlIGFkZGVkIHRvIHRoZSBib3R0b20gb2YgdGhlIGV4aXN0aW5nIHBsb3QuCgpgYGB7cn0KY2hhcnRTZXJpZXMoc3RvY2ssCiAgICAgICAgICAgIHN1YnNldD0nMjAyMC0wMS0wMTo6MjAyMC0wOS0yMycsIHR5cGUgPSAiYmFycyIsCiAgICAgICAgICAgIHRoZW1lPWNoYXJ0VGhlbWUoJ3doaXRlJykpCmFkZEJCYW5kcyhuPTIwLHNkPTIpCmFkZFJTSShuPTE0LG1hVHlwZT0iRU1BIikKYWRkTUFDRChmYXN0PTEyLHNsb3c9MjYsc2lnbmFsPTksdHlwZT0iRU1BIikKCmBgYAoKCg==