Introduction
A vector is a fundamental data structure in R and it can store a
sequence of values of the same date type, such as numbers, characters,
or logical values. Vectors in R can be created using various functions
such as ‘c()’ (combine), ‘seq()’ (sequence), ‘rep()’ (repeat), and
‘vector()’. Once created, we can perform various operations on vectors,
including slicing, filtering, sorting, merging, and more.
Operations
Creating Vectors
Here are some examples of creating vectors.
with the c() function:
Vectors can be created using the ‘c()’ function, which concatenates
values into a vector. And we can check the type of a vector using the
‘class()’ function
# a numeric vector
x <- c(1, 2, 3, 4, 5)
x
## [1] 1 2 3 4 5
class(x) # "numeric"
## [1] "numeric"
# a character vector
y <- c("apple", "banana", "cherry")
y
## [1] "apple" "banana" "cherry"
class(y) # "character"
## [1] "character"
# a logical vector
z <- c(TRUE, FALSE, TRUE)
z
## [1] TRUE FALSE TRUE
class(z) # "logical"
## [1] "logical"
with the seq() function:
# create a numeric vector with sequence 1 to 10
nums_seq <- seq(from = 1, to = 10, by = 1)
nums_seq
## [1] 1 2 3 4 5 6 7 8 9 10
# create a numeric vector with sequence 1 to 10, incrementing by 2
nums_seq2 <- seq(from = 1, to = 10, by = 2)
nums_seq2
## [1] 1 3 5 7 9
with the rep() function:
# create a numeric vector with 5 repeated values of 1
repeated_nums <- rep(1, times = 5)
repeated_nums
## [1] 1 1 1 1 1
# create a character vector with 5 repeated values of "hello"
repeated_strings <- rep("hello", times = 5)
repeated_strings
## [1] "hello" "hello" "hello" "hello" "hello"
with the vector() function:
# create an empty numeric vector with length 5
empty_nums <- vector("numeric", length = 5)
empty_nums
## [1] 0 0 0 0 0
# create an empty character vector with length 5
empty_strings <- vector("character", length = 5)
empty_strings
## [1] "" "" "" "" ""
Accessing Vector Elements
We can access individual elements of a vector using the square
brackets notation [ ]. The index of the element we want to access goes
inside the square brackets.
x <- c(1, 2, 3, 4, 10)
y <- c("apple", "banana", "cherry")
z <- c(TRUE, FALSE, TRUE)
# accessing the second element of x
x[2] # 2
## [1] 2
# accessing the first element of y
y[1] # "apple"
## [1] "apple"
# accessing the thrid element of z
z[3] # TRUE
## [1] TRUE
We can also access multiple elements of a vector using a sequence of
indices. For example, to access the first three elements of x, we can
use the : operator:
# accessing the first three elements of x
x[1:3] # 1 2 3
## [1] 1 2 3
We can also use logical vectors to index elements of a vector. For
example, to select only the even elements of x, we can create a logical
vector that identifies the even elements:
# selecting only the even elements of x
x[c(FALSE, TRUE, FALSE, TRUE, FALSE)] # 2 4
## [1] 2 4
Vector Arithmetic
We can perform arithmetic operations on vectors in R.
addition
# create two numeric vectors
# create two numeric vectors
x <- c(1, 2, 3, 4, 10)
y <- c(6, 7, 8, 9, 5)
# add two vectors element-wise
x + y # Output: 7 9 11 13 15
## [1] 7 9 11 13 15
subtraction
# subtract two vectors element-wise
x - y # Output: -5 -5 -5 -5 5
## [1] -5 -5 -5 -5 5
multiplication
# multiply two vectors element-wise
x * y # Output: 6 14 24 36 50
## [1] 6 14 24 36 50
division
# divide two vectors element-wise
y / x # Output: 6.000000 3.500000 2.666667 2.250000 0.500000
## [1] 6.000000 3.500000 2.666667 2.250000 0.500000
others
# multiplying a vector by a scalar
2 * x # 2 4 6 8 20
## [1] 2 4 6 8 20
# raise one vector to the power of another element-wise
x ^ y # Output: 1 128 6561 262144 100000
## [1] 1 128 6561 262144 100000
# compare two vectors element-wise
x < y # Output: TRUE TRUE TRUE TRUE FALSE
## [1] TRUE TRUE TRUE TRUE FALSE
# concatenate two vectors
c(x, y) # Output: 1 2 3 4 10 6 7 8 9 5
## [1] 1 2 3 4 10 6 7 8 9 5
# calculate the dot product of two vectors
sum(x * y) # Output: 130
## [1] 130
Note that in order to add, subtract, multiply, or divide two vectors
element-wise, they must be of the same length. If they are not of the
same length, R will recycle the shorter vector to match the length of
the longer vector, which may lead to unexpected results.
Vector Element Sorting
# create a numeric vector
x <- c(5, 2, 9, 1, 8)
# sort the elements in ascending order
sort(x) # Output: 1 2 5 8 9
## [1] 1 2 5 8 9
# sort the elements in descending order
sort(x, decreasing = TRUE) # Output: 9 8 5 2 1
## [1] 9 8 5 2 1
In this example, we create a vector x with five numeric elements. We
then use the sort() function to sort the elements of x in ascending
order by default. We can also sort the elements in descending order by
setting the decreasing argument to TRUE. The sort() function returns a
new vector with the elements sorted in the specified order. Note that
the original vector x is not modified.
Slicing
To extract a range of elements from a vector, we can use square
brackets ([]) with the start and end indices separated by a colon (:).
For example:
x <- c(1, 2, 3, 4, 5)
x[2:4] # extracts the second through fourth elements of x, which are 2, 3, and 4
## [1] 2 3 4
Reversing
To reverse the order of elements in a vector, we can use the ‘rev()’
function. For example:
x <- c(1, 2, 3, 4, 5)
rev(x) # returns a new vector with the elements of x in reverse order: 5, 4, 3, 2, 1
## [1] 5 4 3 2 1
Filtering
To extract a subset of elements from a vector based on a condition,
we can use logical indexing. For example, to extract all elements of x
that are greater than 3:
x <- c(1, 2, 3, 4, 5)
x[x > 3] # returns a new vector with the elements of x that are greater than 3: 4, 5
## [1] 4 5
Aggregating
To calculate statistics for a vector, we can use various functions
like sum(), mean(), min(), max(), median(), sd(), and var():
x <- c(1, 2, 3, 4, 5)
sum(x)
## [1] 15
mean(x)
## [1] 3
min(x)
## [1] 1
max(x)
## [1] 5
median(x)
## [1] 3
sd(x)
## [1] 1.581139
var(x)
## [1] 2.5
Combining
To combine two or more vectors into a single vector, we can use the
‘c()’ function.
x <- c(1, 2, 3)
y <- c(4, 5, 6)
z <- c(x, y) # combines x and y into a single vector: 1, 2, 3, 4, 5, 6
z
## [1] 1 2 3 4 5 6
Checking for Membership
To check if a vector contains a particular element, we can use the
%in% operator. For example, to check if x contains the value 3:
x <- c(1, 2, 3, 4, 5)
3 %in% x # returns TRUE because x contains the value 3
## [1] TRUE
6 %in% x # returns FALSE because x doesn't contain the value 6
## [1] FALSE
LS0tCnRpdGxlOiAiUiBWZWN0b3JzIgphdXRob3I6ICJFbG0gQ29tcHV0aW5nIgpvdXRwdXQ6CiAgaHRtbF9kb2N1bWVudDoKICAgIHRvYzogeWVzCiAgICB0b2NfZGVwdGg6IDIKICAgIHRvY19mbG9hdDoKICAgICAgY29sbGFwc2VkOiB5ZXMKICAgIGNzczogc3R5bGVzLmNzcwogICAgY29kZV9kb3dubG9hZDogeWVzCiAgICB0aGVtZTogcmVhZGFibGUKICBwZGZfZG9jdW1lbnQ6CiAgICB0b2M6IHllcwogICAgdG9jX2RlcHRoOiAnMicKICB3b3JkX2RvY3VtZW50OgogICAgdG9jOiB5ZXMKICAgIHRvY19kZXB0aDogJzInCi0tLQoKIyBJbnRyb2R1Y3Rpb24KCkEgdmVjdG9yIGlzIGEgZnVuZGFtZW50YWwgZGF0YSBzdHJ1Y3R1cmUgaW4gUiBhbmQgaXQgY2FuIHN0b3JlIGEgc2VxdWVuY2Ugb2YgdmFsdWVzIG9mIHRoZSBzYW1lIGRhdGUgdHlwZSwgc3VjaCBhcyBudW1iZXJzLCBjaGFyYWN0ZXJzLCBvciBsb2dpY2FsIHZhbHVlcy4gVmVjdG9ycyBpbiBSIGNhbiBiZSBjcmVhdGVkIHVzaW5nIHZhcmlvdXMgZnVuY3Rpb25zIHN1Y2ggYXMgJ2MoKScgKGNvbWJpbmUpLCAnc2VxKCknIChzZXF1ZW5jZSksICdyZXAoKScgKHJlcGVhdCksIGFuZCAndmVjdG9yKCknLiBPbmNlIGNyZWF0ZWQsIHdlIGNhbiBwZXJmb3JtIHZhcmlvdXMgb3BlcmF0aW9ucyBvbiB2ZWN0b3JzLCBpbmNsdWRpbmcgc2xpY2luZywgZmlsdGVyaW5nLCBzb3J0aW5nLCBtZXJnaW5nLCBhbmQgbW9yZS4KCgojIE9wZXJhdGlvbnMKCiMjIENyZWF0aW5nIFZlY3RvcnMKCkhlcmUgYXJlIHNvbWUgZXhhbXBsZXMgb2YgY3JlYXRpbmcgdmVjdG9ycy4KCiMjIyB3aXRoIHRoZSBjKCkgZnVuY3Rpb246CgpWZWN0b3JzIGNhbiBiZSBjcmVhdGVkIHVzaW5nIHRoZSAnYygpJyBmdW5jdGlvbiwgd2hpY2ggY29uY2F0ZW5hdGVzIHZhbHVlcyBpbnRvIGEgdmVjdG9yLiBBbmQgd2UgY2FuIGNoZWNrIHRoZSB0eXBlIG9mIGEgdmVjdG9yIHVzaW5nIHRoZSAnY2xhc3MoKScgZnVuY3Rpb24KCgpgYGB7cn0KIyBhIG51bWVyaWMgdmVjdG9yCnggPC0gYygxLCAyLCAzLCA0LCA1KQp4CmNsYXNzKHgpICMgIm51bWVyaWMiCgoKIyBhIGNoYXJhY3RlciB2ZWN0b3IKeSA8LSBjKCJhcHBsZSIsICJiYW5hbmEiLCAiY2hlcnJ5IikKeQpjbGFzcyh5KSAjICJjaGFyYWN0ZXIiCgojIGEgbG9naWNhbCB2ZWN0b3IKeiA8LSBjKFRSVUUsIEZBTFNFLCBUUlVFKQp6CmNsYXNzKHopICMgImxvZ2ljYWwiCmBgYAoKIyMjIHdpdGggdGhlIHNlcSgpIGZ1bmN0aW9uOgoKYGBge3J9CiMgY3JlYXRlIGEgbnVtZXJpYyB2ZWN0b3Igd2l0aCBzZXF1ZW5jZSAxIHRvIDEwCm51bXNfc2VxIDwtIHNlcShmcm9tID0gMSwgdG8gPSAxMCwgYnkgPSAxKQpudW1zX3NlcQoKIyBjcmVhdGUgYSBudW1lcmljIHZlY3RvciB3aXRoIHNlcXVlbmNlIDEgdG8gMTAsIGluY3JlbWVudGluZyBieSAyCm51bXNfc2VxMiA8LSBzZXEoZnJvbSA9IDEsIHRvID0gMTAsIGJ5ID0gMikKbnVtc19zZXEyCmBgYAoKIyMjIHdpdGggdGhlIHJlcCgpIGZ1bmN0aW9uOgoKYGBge3J9CiMgY3JlYXRlIGEgbnVtZXJpYyB2ZWN0b3Igd2l0aCA1IHJlcGVhdGVkIHZhbHVlcyBvZiAxCnJlcGVhdGVkX251bXMgPC0gcmVwKDEsIHRpbWVzID0gNSkKcmVwZWF0ZWRfbnVtcwoKIyBjcmVhdGUgYSBjaGFyYWN0ZXIgdmVjdG9yIHdpdGggNSByZXBlYXRlZCB2YWx1ZXMgb2YgImhlbGxvIgpyZXBlYXRlZF9zdHJpbmdzIDwtIHJlcCgiaGVsbG8iLCB0aW1lcyA9IDUpCnJlcGVhdGVkX3N0cmluZ3MKYGBgCgojIyMgd2l0aCB0aGUgdmVjdG9yKCkgZnVuY3Rpb246CgpgYGB7cn0KIyBjcmVhdGUgYW4gZW1wdHkgbnVtZXJpYyB2ZWN0b3Igd2l0aCBsZW5ndGggNQplbXB0eV9udW1zIDwtIHZlY3RvcigibnVtZXJpYyIsIGxlbmd0aCA9IDUpCmVtcHR5X251bXMKCiMgY3JlYXRlIGFuIGVtcHR5IGNoYXJhY3RlciB2ZWN0b3Igd2l0aCBsZW5ndGggNQplbXB0eV9zdHJpbmdzIDwtIHZlY3RvcigiY2hhcmFjdGVyIiwgbGVuZ3RoID0gNSkKZW1wdHlfc3RyaW5ncwpgYGAKCiMjIyB1c2luZyBhIGZvcm11bGE6CgpgYGB7cn0KIyBjcmVhdGUgYSBudW1lcmljIHZlY3RvciB3aXRoIHZhbHVlcyBjYWxjdWxhdGVkIHVzaW5nIGEgZm9ybXVsYQp4IDwtIDE6NQp4CmZvcm11bGFfbnVtcyA8LSAzICogeCArIDUKZm9ybXVsYV9udW1zCmBgYAoKIyMgQWNjZXNzaW5nIFZlY3RvciBFbGVtZW50cwoKV2UgY2FuIGFjY2VzcyBpbmRpdmlkdWFsIGVsZW1lbnRzIG9mIGEgdmVjdG9yIHVzaW5nIHRoZSBzcXVhcmUgYnJhY2tldHMgbm90YXRpb24gWyBdLiBUaGUgaW5kZXggb2YgdGhlIGVsZW1lbnQgd2Ugd2FudCB0byBhY2Nlc3MgZ29lcyBpbnNpZGUgdGhlIHNxdWFyZSBicmFja2V0cy4KCmBgYHtyfQp4IDwtIGMoMSwgMiwgMywgNCwgMTApCnkgPC0gYygiYXBwbGUiLCAiYmFuYW5hIiwgImNoZXJyeSIpCnogPC0gYyhUUlVFLCBGQUxTRSwgVFJVRSkKCiMgYWNjZXNzaW5nIHRoZSBzZWNvbmQgZWxlbWVudCBvZiB4CnhbMl0gIyAyCgojIGFjY2Vzc2luZyB0aGUgZmlyc3QgZWxlbWVudCBvZiB5CnlbMV0gIyAiYXBwbGUiCgojIGFjY2Vzc2luZyB0aGUgdGhyaWQgZWxlbWVudCBvZiB6CnpbM10gIyBUUlVFCmBgYAoKV2UgY2FuIGFsc28gYWNjZXNzIG11bHRpcGxlIGVsZW1lbnRzIG9mIGEgdmVjdG9yIHVzaW5nIGEgc2VxdWVuY2Ugb2YgaW5kaWNlcy4gRm9yIGV4YW1wbGUsIHRvIGFjY2VzcyB0aGUgZmlyc3QgdGhyZWUgZWxlbWVudHMgb2YgeCwgd2UgY2FuIHVzZSB0aGUgOiBvcGVyYXRvcjoKCmBgYHtyfQojIGFjY2Vzc2luZyB0aGUgZmlyc3QgdGhyZWUgZWxlbWVudHMgb2YgeAp4WzE6M10gIyAxIDIgMwpgYGAKCldlIGNhbiBhbHNvIHVzZSBsb2dpY2FsIHZlY3RvcnMgdG8gaW5kZXggZWxlbWVudHMgb2YgYSB2ZWN0b3IuIEZvciBleGFtcGxlLCB0byBzZWxlY3Qgb25seSB0aGUgZXZlbiBlbGVtZW50cyBvZiB4LCB3ZSBjYW4gY3JlYXRlIGEgbG9naWNhbCB2ZWN0b3IgdGhhdCBpZGVudGlmaWVzIHRoZSBldmVuIGVsZW1lbnRzOgoKYGBge3J9CiMgc2VsZWN0aW5nIG9ubHkgdGhlIGV2ZW4gZWxlbWVudHMgb2YgeAp4W2MoRkFMU0UsIFRSVUUsIEZBTFNFLCBUUlVFLCBGQUxTRSldICMgMiA0CmBgYAoKIyMgVmVjdG9yIEFyaXRobWV0aWMKCldlIGNhbiBwZXJmb3JtIGFyaXRobWV0aWMgb3BlcmF0aW9ucyBvbiB2ZWN0b3JzIGluIFIuCgojIyMgYWRkaXRpb24KCmBgYHtyfQojIGNyZWF0ZSB0d28gbnVtZXJpYyB2ZWN0b3JzCiMgY3JlYXRlIHR3byBudW1lcmljIHZlY3RvcnMKeCA8LSBjKDEsIDIsIDMsIDQsIDEwKQp5IDwtIGMoNiwgNywgOCwgOSwgNSkKCiMgYWRkIHR3byB2ZWN0b3JzIGVsZW1lbnQtd2lzZQp4ICsgeSAjIE91dHB1dDogIDcgIDkgMTEgMTMgMTUKYGBgCgojIyMgc3VidHJhY3Rpb24KCmBgYHtyfQojIHN1YnRyYWN0IHR3byB2ZWN0b3JzIGVsZW1lbnQtd2lzZQp4IC0geSAjIE91dHB1dDogLTUgLTUgLTUgLTUgIDUKYGBgCgojIyMgbXVsdGlwbGljYXRpb24KCmBgYHtyfQojIG11bHRpcGx5IHR3byB2ZWN0b3JzIGVsZW1lbnQtd2lzZQp4ICogeSAjIE91dHB1dDogICA2ICAxNCAgMjQgIDM2ICA1MApgYGAKCiMjIyBkaXZpc2lvbgoKYGBge3J9CiMgZGl2aWRlIHR3byB2ZWN0b3JzIGVsZW1lbnQtd2lzZQp5IC8geCAjIE91dHB1dDogIDYuMDAwMDAwICAzLjUwMDAwMCAgMi42NjY2NjcgIDIuMjUwMDAwICAwLjUwMDAwMApgYGAKCiMjIyBvdGhlcnMKCmBgYHtyfQojIG11bHRpcGx5aW5nIGEgdmVjdG9yIGJ5IGEgc2NhbGFyCjIgKiB4ICMgMiA0IDYgOCAyMAoKIyByYWlzZSBvbmUgdmVjdG9yIHRvIHRoZSBwb3dlciBvZiBhbm90aGVyIGVsZW1lbnQtd2lzZQp4IF4geSAjIE91dHB1dDogICAgICAgMSAgICAgMTI4ICAgIDY1NjEgIDI2MjE0NCAxMDAwMDAKCiMgY29tcGFyZSB0d28gdmVjdG9ycyBlbGVtZW50LXdpc2UKeCA8IHkgIyBPdXRwdXQ6ICBUUlVFICBUUlVFICBUUlVFICBUUlVFIEZBTFNFCgojIGNvbmNhdGVuYXRlIHR3byB2ZWN0b3JzCmMoeCwgeSkgIyBPdXRwdXQ6ICAgMSAgMiAgMyAgNCAxMCAgNiAgNyAgOCAgOSAgNQoKIyBjYWxjdWxhdGUgdGhlIGRvdCBwcm9kdWN0IG9mIHR3byB2ZWN0b3JzCnN1bSh4ICogeSkgIyBPdXRwdXQ6IDEzMApgYGAKCgpOb3RlIHRoYXQgaW4gb3JkZXIgdG8gYWRkLCBzdWJ0cmFjdCwgbXVsdGlwbHksIG9yIGRpdmlkZSB0d28gdmVjdG9ycyBlbGVtZW50LXdpc2UsIHRoZXkgbXVzdCBiZSBvZiB0aGUgc2FtZSBsZW5ndGguIElmIHRoZXkgYXJlIG5vdCBvZiB0aGUgc2FtZSBsZW5ndGgsIFIgd2lsbCByZWN5Y2xlIHRoZSBzaG9ydGVyIHZlY3RvciB0byBtYXRjaCB0aGUgbGVuZ3RoIG9mIHRoZSBsb25nZXIgdmVjdG9yLCB3aGljaCBtYXkgbGVhZCB0byB1bmV4cGVjdGVkIHJlc3VsdHMuCgojIyBWZWN0b3IgRWxlbWVudCBTb3J0aW5nCgpgYGB7cn0KIyBjcmVhdGUgYSBudW1lcmljIHZlY3Rvcgp4IDwtIGMoNSwgMiwgOSwgMSwgOCkKCiMgc29ydCB0aGUgZWxlbWVudHMgaW4gYXNjZW5kaW5nIG9yZGVyCnNvcnQoeCkgIyBPdXRwdXQ6ICAxICAyICA1ICA4ICA5CgojIHNvcnQgdGhlIGVsZW1lbnRzIGluIGRlc2NlbmRpbmcgb3JkZXIKc29ydCh4LCBkZWNyZWFzaW5nID0gVFJVRSkgIyBPdXRwdXQ6ICA5ICA4ICA1ICAyICAxCmBgYAoKSW4gdGhpcyBleGFtcGxlLCB3ZSBjcmVhdGUgYSB2ZWN0b3IgeCB3aXRoIGZpdmUgbnVtZXJpYyBlbGVtZW50cy4gV2UgdGhlbiB1c2UgdGhlIHNvcnQoKSBmdW5jdGlvbiB0byBzb3J0IHRoZSBlbGVtZW50cyBvZiB4IGluIGFzY2VuZGluZyBvcmRlciBieSBkZWZhdWx0LiBXZSBjYW4gYWxzbyBzb3J0IHRoZSBlbGVtZW50cyBpbiBkZXNjZW5kaW5nIG9yZGVyIGJ5IHNldHRpbmcgdGhlIGRlY3JlYXNpbmcgYXJndW1lbnQgdG8gVFJVRS4gVGhlIHNvcnQoKSBmdW5jdGlvbiByZXR1cm5zIGEgbmV3IHZlY3RvciB3aXRoIHRoZSBlbGVtZW50cyBzb3J0ZWQgaW4gdGhlIHNwZWNpZmllZCBvcmRlci4gTm90ZSB0aGF0IHRoZSBvcmlnaW5hbCB2ZWN0b3IgeCBpcyBub3QgbW9kaWZpZWQuCgojIyBTbGljaW5nCgpUbyBleHRyYWN0IGEgcmFuZ2Ugb2YgZWxlbWVudHMgZnJvbSBhIHZlY3Rvciwgd2UgY2FuIHVzZSBzcXVhcmUgYnJhY2tldHMgKFtdKSB3aXRoIHRoZSBzdGFydCBhbmQgZW5kIGluZGljZXMgc2VwYXJhdGVkIGJ5IGEgY29sb24gKDopLiBGb3IgZXhhbXBsZToKCmBgYHtyfQp4IDwtIGMoMSwgMiwgMywgNCwgNSkKeFsyOjRdICAjIGV4dHJhY3RzIHRoZSBzZWNvbmQgdGhyb3VnaCBmb3VydGggZWxlbWVudHMgb2YgeCwgd2hpY2ggYXJlIDIsIDMsIGFuZCA0CmBgYAoKIyMgUmV2ZXJzaW5nCgpUbyByZXZlcnNlIHRoZSBvcmRlciBvZiBlbGVtZW50cyBpbiBhIHZlY3Rvciwgd2UgY2FuIHVzZSB0aGUgJ3JldigpJyBmdW5jdGlvbi4gRm9yIGV4YW1wbGU6CgpgYGB7cn0KeCA8LSBjKDEsIDIsIDMsIDQsIDUpCnJldih4KSAgIyByZXR1cm5zIGEgbmV3IHZlY3RvciB3aXRoIHRoZSBlbGVtZW50cyBvZiB4IGluIHJldmVyc2Ugb3JkZXI6IDUsIDQsIDMsIDIsIDEKYGBgCgojIyBGaWx0ZXJpbmcKClRvIGV4dHJhY3QgYSBzdWJzZXQgb2YgZWxlbWVudHMgZnJvbSBhIHZlY3RvciBiYXNlZCBvbiBhIGNvbmRpdGlvbiwgd2UgY2FuIHVzZSBsb2dpY2FsIGluZGV4aW5nLiBGb3IgZXhhbXBsZSwgdG8gZXh0cmFjdCBhbGwgZWxlbWVudHMgb2YgeCB0aGF0IGFyZSBncmVhdGVyIHRoYW4gMzoKCmBgYHtyfQp4IDwtIGMoMSwgMiwgMywgNCwgNSkKeFt4ID4gM10gICMgcmV0dXJucyBhIG5ldyB2ZWN0b3Igd2l0aCB0aGUgZWxlbWVudHMgb2YgeCB0aGF0IGFyZSBncmVhdGVyIHRoYW4gMzogNCwgNQpgYGAKCiMjIEFnZ3JlZ2F0aW5nCgpUbyBjYWxjdWxhdGUgc3RhdGlzdGljcyBmb3IgYSB2ZWN0b3IsIHdlIGNhbiB1c2UgdmFyaW91cyBmdW5jdGlvbnMgbGlrZSBzdW0oKSwgbWVhbigpLCBtaW4oKSwgbWF4KCksIG1lZGlhbigpLCBzZCgpLCBhbmQgdmFyKCk6CgpgYGB7cn0KeCA8LSBjKDEsIDIsIDMsIDQsIDUpCnN1bSh4KSAgCm1lYW4oeCkKbWluKHgpCm1heCh4KQptZWRpYW4oeCkKc2QoeCkKdmFyKHgpCmBgYAoKIyMgQ29tYmluaW5nCgpUbyBjb21iaW5lIHR3byBvciBtb3JlIHZlY3RvcnMgaW50byBhIHNpbmdsZSB2ZWN0b3IsIHdlIGNhbiB1c2UgdGhlICdjKCknIGZ1bmN0aW9uLiAKCmBgYHtyfQp4IDwtIGMoMSwgMiwgMykKeSA8LSBjKDQsIDUsIDYpCnogPC0gYyh4LCB5KSAgIyBjb21iaW5lcyB4IGFuZCB5IGludG8gYSBzaW5nbGUgdmVjdG9yOiAxLCAyLCAzLCA0LCA1LCA2CnoKYGBgCgojIyBDaGVja2luZyBmb3IgTWVtYmVyc2hpcAoKVG8gY2hlY2sgaWYgYSB2ZWN0b3IgY29udGFpbnMgYSBwYXJ0aWN1bGFyIGVsZW1lbnQsIHdlIGNhbiB1c2UgdGhlICVpbiUgb3BlcmF0b3IuIEZvciBleGFtcGxlLCB0byBjaGVjayBpZiB4IGNvbnRhaW5zIHRoZSB2YWx1ZSAzOgoKYGBge3J9CnggPC0gYygxLCAyLCAzLCA0LCA1KQozICVpbiUgeCAgIyByZXR1cm5zIFRSVUUgYmVjYXVzZSB4IGNvbnRhaW5zIHRoZSB2YWx1ZSAzCjYgJWluJSB4ICAjIHJldHVybnMgRkFMU0UgYmVjYXVzZSB4IGRvZXNuJ3QgY29udGFpbiB0aGUgdmFsdWUgNgpgYGAKCiMgU3VtbWFyeQoKT3ZlcmFsbCwgdmVjdG9ycyBhcmUgYSBwb3dlcmZ1bCB0b29sIGluIFIgZm9yIHN0b3JpbmcgYW5kIG1hbmlwdWxhdGluZyBjb2xsZWN0aW9ucyBvZiB2YWx1ZXMsIGFuZCB0aGV5IHBsYXkgYSBjcml0aWNhbCByb2xlIGluIG1hbnkgc3RhdGlzdGljYWwgYW5kIGRhdGEgYW5hbHlzaXMgdGFza3MuCg==