R 是一门面向对象的函数化数组编程语言,所有可操作的 R 实体(entity)都是对象(object), 对象在 R 中是一种专门的数据结构。所有 R 对象都拥有一种或者多种属性(attribute), 可以用attributes()或者attr()函数来读取或设置对象的属性。一个重要属性是类(class), 所有 R 对象都拥有类属性,可以用class()函数来读取和设置一个对象的类,常见的类有numericlogicalcharacterlistmatrixarrayfactordata.frame

R 对象一定要以某种类型(type)来存储,可以用typeof()函数来获得一个 R 对象的类型。使用as.类型()函数可以将一种类型的对象转换成另一种类型,使用is.类型()函数可以判断一个对象是否属于指定类型。 此外,R 对象还有一个内在属性(Intrinsic attribute)模式(mode),它来源于 R 语言的前身 S 语言, 无法通过使用mode()storage.mode()函数分别可以返回 R 对象的模式和存储模式。在大多数情况下, typeof()mode()的返回结果相同,但typeof()会将数值模式numeric细分为整数类型integar和 双精度浮点数类型double,与storage.mode()的返回结果相同。

而数据科学中提到的数据结构显然不是对象这种笼统的概念,而是存储了我们感兴趣的数据的具体数据结构, 也即是对象的某些类型(注意这里的类型与上面说的存储的类型是不同的概念)。想要记住所有 R 数据结构 没有意义,不同的 R 包可能还会补充新的数据结构,只要了解自己需要使用的数据结构即可。下面介绍 R 中常用的数据结构。

基本类型

首先,根据存储类型是否统一,可以将 R 中数据的存储结构划分为两种基本类型: 原子向量(atomic vector)泛型向量(generic vector)

原子向量

由单一存储类型的数据构成的数据结构,称为原子向量(atomic vector),也即其所有元素都具有相同的type。 实际上,原子向量只有六种可能的存储类型:logicalintegerdoublecomplexcharacterraw。 原子向量除了通常所说的 R 语言中的(简单)向量,还包括矩阵、数组等。

泛型向量

由多种存储类型的数据构成的数据结构,称为泛型向量(generic vector),列表中不但可以包含各种类型的原子向量,还可以嵌套其他泛型向量。常见的泛型向量有数据框(data.frame)和列表(list),不过,由于数据框也可以看作一种特殊的列表,因此很多时候直接用”列表”来指代泛型向量,在不同语境中,要注意”列表”到底指的是泛型向量,还是列表这种具体的数据结构。

常用的 R 数据结构

向量

向量是一个一维数组,可以用来存储数值型、字符型和逻辑型的数据,也就是对应typeintegerdoublecomplexcharacterlogical的元素。正如前文提到过的,向量是原子向量的一种,因此一个向量只能存储同一种类型的数据,如果一个向量由不同的数值型数据构成,那么会按照integerdoublecomplex的顺序把前面的数值存储类型强制转换成最后一种数值存储类型(integer会被转换成doubleintegerdouble会被转换成complex)。

值得一提的是,向量的类(class)就是它的模式(mode)。

R 中没有标量,单个的数据元素也会被当作长度为1的向量。顺带一提,向量的长度可以通过函数length()得到。

向量的操作

创建向量

  • 从输入创建一个向量:使用函数c()
(x <- c('I','love','U'))
[1] "I"    "love" "U"   

  • 创建一个等差序列向量:使用语法:运算符(步长为1或者-1时)或者函数seq()
x <- 1:5
y <- 5:1
z <- seq(1,7,2)
x;y;z
[1] 1 2 3 4 5
[1] 5 4 3 2 1
[1] 1 3 5 7

  • 复制一个向量:使用函数rep(),使用参数each表示逐元素复制,使用参数times表示整体复制, 分别对应 Python 的 Numpy 包中的repeat()函数和tile()函数
x <- 1:3
rep(x, each = 2)
[1] 1 1 2 2 3 3
rep(x, times = 2) 
[1] 1 2 3 1 2 3

参数 times 还可以接受一个和数值向量等长的整数向量,可以依次指定每个分量重复的次数:

rep(x, times = 1:3)
[1] 1 2 2 3 3 3

数值向量的运算

R 是向量化编程语言,因此对向量的所有运算都直接作用于每一个分量:

x <- 1:3
3*x
[1] 3 6 9

两个向量进行运算时,会按位进行,如果长度不一致,会循环使用较短的一个向量以匹配较长的向量, 当较长的向量的长度不是较短向量的倍数时,循环会进行,但会给出警告信息:

v <- 2:7
x <- 1:6
y <- 1:3
z <- 1:4
v + x
[1]  3  5  7  9 11 13
x + y
[1] 2 4 6 5 7 9
x + z
Warning: longer object length is not a multiple of shorter object length
[1] 2 4 6 8 6 8

这种按位向量运算的规律适用于所有类型的向量。在 Python 的 Numpy 包中,这种特性被称为广播(broadcast)机制。

逻辑向量的操作

逻辑向量的分量都是逻辑值,逻辑真为TRUE或者T,逻辑假为FALSE或者F,转换成数值则分别为1和0。

下表列出了 R 最基础的逻辑运算:

运算符/函数 运算含义
&&& 逻辑与运算,&&非必要不检查第2位元素
||| 逻辑或运算,||非必要不检查第2位元素
! 逻辑非运算
xor() 逻辑异或运算
isTRUE() 判断逻辑值是否为真
isFALSE() 判断逻辑值是否为假

any()all()函数分别检验逻辑向量中是否有TRUE和是否全为TRUE。在 Python 中,同样的功能是通过 Numpy 包中ndarrayany()all()实例方法实现的。

which()函数接受一个逻辑向量(或者数组),并且返回逻辑值为真的全部下标,在 Python 中,同样的功能是通过 NumPy 包中的where()函数实现的。

如上一部分所述,逻辑向量也满足向量化运算的规律,不再赘述。

字符向量的操作

字符向量的分量是一个个字符串(character string),对字符串的操作和处理是数据处理中的重要内容,我们在介绍数据处理时再来介绍。

向量的下标(索引)

向量的下标是正整数时,返回该位置的分量:

x <- 1:10
x[5]
[1] 5

向量的下标是负整数时,返回去除了该位置的分量的整个向量:

x[-1]
[1]  2  3  4  5  6  7  8  9 10

向量的下标还可以接受一个正整数或者负整数构成的向量,返回所有正整数位置的分量,或者去除所有负整数位置的分量(但要注意不能同时包含正整数和负整数):

x[c(1,1,5)]
[1] 1 1 5
x[-c(2,6)]
[1]  1  3  4  5  7  8  9 10

向量下标还可以接受一个等长的逻辑向量,例如原向量的一个逻辑运算或者操作,来对数据进行筛选:

# 返回 x 中大于5 的全部元素
x[x>5]
[1]  6  7  8  9 10

这等价于使用which()函数:

x[which(x>5)]
[1]  6  7  8  9 10

数组

数组(array)是一种有多个维度的原子向量,和向量相比,它多了一个维度属性dim,此外,还可以指定各维度的名称(标识符)参数dimnames来创建dimnames属性。

创建数组使用array()函数,语法为:

{array(data = NA, dim = NULL, dimnames = NULL)}

参数data接受用于创建数组的数据向量,dim接受指定维数的向量,dimnames接受指定各维度的名称(标识符)的列表。

dname1 <- c('A','B','C')
dname2 <- c('D1','D2','D3')
dname3 <- c('d1','d2','d3')
A = array(1:27, c(3,3,3), list(dname1,dname2,dname3))
A
, , d1

  D1 D2 D3
A  1  4  7
B  2  5  8
C  3  6  9

, , d2

  D1 D2 D3
A 10 13 16
B 11 14 17
C 12 15 18

, , d3

  D1 D2 D3
A 19 22 25
B 20 23 26
C 21 24 27

dim()dimnames()函数分别用于获取数组的维数和各维度名称,分别返回一个向量和一个列表。

dim(A)
[1] 3 3 3
dimnames(A)
[[1]]
[1] "A" "B" "C"

[[2]]
[1] "D1" "D2" "D3"

[[3]]
[1] "d1" "d2" "d3"

数组的转置:通过函数aperm()实现,不常用到,不在此处展开。

注意:R 的数组与 Python 的 NumPy 包中的ndarray排列维度的顺序不一样,要区分清楚。

矩阵

矩阵实际上就是2维的数组,同时具有matrixarray两个类属性。但是矩阵的用途比数组广泛得多,因此 R 有一系列专门的矩阵函数和矩阵操作。

矩阵的创建

创建矩阵使用matrix()函数,其基本语法为:

{matrix(data = NA, nrow = NULL, ncol = NULL, byrow = FALSE, dimnames = NULL)}

参数data接受用于创建矩阵的数据向量,nrowncol分别接受行数和列数(可以省略其中的一个让函数自动匹配另一个),逻辑值参数byrow指定向量按行排列还是按列排列,默认取Falsedimnames接受指定各行和各列名称(标识符)的列表。

M <- matrix(1:6, nrow = 2)
M
     [,1] [,2] [,3]
[1,]    1    3    5
[2,]    2    4    6

常用矩阵函数

因为矩阵就是数组,所以数组函数自然也适用于矩阵。此外,下表中列出了 R 中一些常用的矩阵函数:

函数名 功能
rbind() 将两个或多个矩阵或向量按行堆叠成一个矩阵
cbind() 将两个或多个矩阵或向量按列堆叠成一个矩阵
rownames() 返回矩阵各行的名称,可以用来为矩阵指定行名称
colnames() 返回矩阵各列的名称,可以用来为矩阵指定列名称
nrow() 返回矩阵的行数
ncol() 返回矩阵的列数
t() 矩阵转置
inverse() 求矩阵的逆矩阵或者广义逆
det() 求矩阵的行列式
diag() 提取矩阵对角元,或者由向量创建对角矩阵
eigen() 求矩阵的特征值和特征向量
solve() 求线性方程组的解

矩阵的基本数学运算符号和函数都与数值型向量相同,但需要注意,矩阵乘法需要使用符号%*%,直接使用*进行的是按位乘法。

矩阵的下标(索引)

矩阵下标的用法和向量下标类似,行索引和列索引用逗号分隔开(逗号不能省略),省略行索引或者列索引则表明包含全部的行或列,下面的例子可能更直观一些。

返回矩阵 M 的第1行第2,3列的元素:

M[1,2:3]
[1] 3 5

返回矩阵 M 的第3列的元素:

M[,3]
[1] 5 6

如果有行名或者列名,还可以用行名或者列名的字符串作为下标:

rownames(M)<- c('r1','r2')
M['r1',]
[1] 1 3 5

和向量一样,矩阵也接受逻辑值下标,但会返回一个向量:

M[M>2]
[1] 3 4 5 6

向量和矩阵的元素都可以通过使用下标来修改,例如,将矩阵 M 的第2列改为0:

M[,2] <- 0
M
   [,1] [,2] [,3]
r1    1    0    5
r2    2    0    6

数据框

数据框是 R 中最重要的数据结构之一,如果只考虑 base R,甚至可以去掉之一。作为一种二维的泛型向量数据结构,它相当于矩阵的一种延申,是 R 中最常用的数据结构。数据框相当于一种特殊的、形状规整的矩形列表,所以数据框的类属性是data.frame,但存储类型是list

数据框的属性和矩阵属性类似,只不过列名属性是names而非colnames,用于得到矩阵维数的函数dim()nrow()ncol()也都适用于数据框。

数据框的创建

数据框的创建使用data.frame()函数,其基本语法如下:

data.frame(..., row.names = NULL, check.rows = FALSE,
           check.names = TRUE, fix.empty.names = TRUE,
           stringsAsFactors = FALSE)

注意到没有names参数,...部分可以直接输入数据表或者矩阵,创建数据框后可以用names()函数指定列名names;也可以用tag = value的形式(此处不能使用<-赋值号)输入多组标签-值对,以标签作为列名;或者输入多个向量,以每个向量名作为相应的列名。

A <- matrix(1:6,2,3)
data1 <- data.frame(A)
names(data1) <- c('a','b','c')
data2 <- data.frame('A' = A[,1], 'B' = A[,2], 'C' = A[,3])
col_a <- 1:2
col_b <- 3:4
col_c <- 5:6
data3 <- data.frame(col_a,col_b,col_c)
data1
data2
data3

数据框的每一列都必须是同一种存储类型,不同列之间可以是不同存储类型,这种结构与大多数情况下的截面数据一致,这也是数据框被广泛使用的原因,数据框的一列也就是截面数据中的一个变量,因此列名也常被称为变量名。

数据框的索引

数据框与矩阵结构类似,因此矩阵的下标运算也都适用。

data1[1,2]
[1] 3

但需要注意的是,如果只使用一个下标(单个整数或单个向量),数据框与矩阵的行为就不同了:矩阵会(按列)拉直为向量,然后按向量下标来处理;而数据框会把单个的下标理解为对列的索引,也就是数据框[索引值]数据框[,索引值]调用的元素是一样的(只不过前者是数据框,后者是向量)。当然由矩阵的列名索引方式可以得知,数据框[列名]数据框[列名]也是一样的(同样地,前者是数据框,后者是向量)。

data1[2]
data1[,2]
[1] 3 4

注意:Python 的 pandas 包中的DataFrame数据框是仿照 R 数据框设计的,但DataFrame会把单个的下标理解为对行的索引,这是由于 Python 的 NumPy 和 pandas 都默认把向量当作行向量,而 R 默认把向量当作列向量。


不过毕竟矩阵的下标运算不是为了数据框设计的,数据框有自己的规范的索引方法。

数据框中的列可以用$操作符来调用,其语法为数据框$变量名(这实际上是列表的语法)。

data2$C
[1] 5 6

如果不想每次调用变量都带上数据框名,可以使用attach()函数,相当于进入了数据框的内部环境,使用过后别忘了使用detach()函数退出,以免引起可能的变量名冲突:

attach(data1)
a
[1] 1 2
detach(data1)
a
Error: object 'a' not found

这两个函数也适用于列表。


或者使用with()函数创建一个使用数据框内部变量的独立环境,使用特殊赋值符<<-还可以将变量保存至外部环境:

with(data1, {
  c_double <- 2*c
  c_sq <<- c^2
})
c_double
Error: object 'c_double' not found
c_sq
[1] 25 36

而要进行较为复杂的数据选择,可以使用subset()函数,其语法为:

subset(x, subset, select, drop = FALSE, ...)

x接受数据框,subset接受行名或者用于筛选的逻辑表达式,select接受变量名。

data_matrix <- matrix(1:25,5)
data <- data.frame(data_matrix)
names(data) <- c('a','b','c','d','e')
data
subset(data, subset = c > 12, select = c('a','b'))

列表

列表是 R 中最复杂的数据结构,数据框只是列表的一个特例。数据框由不同类型的等长向量按列并排构成,而列表可以由任意 R 对象(向量、矩阵、数组、数据框甚至是其他列表)构成,它会为每一个对象创建一个索引,也就是名称标签,这些标签构成了列表的名称属性names。和数据框的变量名属性类似,列表的names属性可以通过names()函数来查看和修改。

列表的创建使用list()函数,其接受对象和names属性的的方式与data.frame()函数类似。

obj1 <- 1:5
obj2 <- 'Hello world!'
obj3 <- matrix(1:4,2)
obj4 <- array(1:24,c(2,3,4))
obj5 <- data.frame(name=c('张三','李四','王五'), age=c(23,24,25))
obj6 <- list(day <- c(1,3), month <- c('Feb','May','Aug'))
LIST <- list(vec=obj1, char=obj2, mat=obj3, arr=obj4, df=obj5, ls=obj6)
LIST
$vec
[1] 1 2 3 4 5

$char
[1] "Hello world!"

$mat
     [,1] [,2]
[1,]    1    3
[2,]    2    4

$arr
, , 1

     [,1] [,2] [,3]
[1,]    1    3    5
[2,]    2    4    6

, , 2

     [,1] [,2] [,3]
[1,]    7    9   11
[2,]    8   10   12

, , 3

     [,1] [,2] [,3]
[1,]   13   15   17
[2,]   14   16   18

, , 4

     [,1] [,2] [,3]
[1,]   19   21   23
[2,]   20   22   24


$df

$ls
$ls[[1]]
[1] 1 3

$ls[[2]]
[1] "Feb" "May" "Aug"

列表中对象的调用可以使用$操作符的形式列表$对象,也可以使用双层方括号的形式列表[[对象]]

LIST$char
[1] "Hello world!"
LIST[["mat"]]
     [,1] [,2]
[1,]    1    3
[2,]    2    4

如果不显式地指定names属性,列表就会用数字索引来标识每个对象,此时只能用双层方括号+数字索引来调用对象(有names属性时这种方法也可用):

l = list(1:3,c('a','b'))
l
[[1]]
[1] 1 2 3

[[2]]
[1] "a" "b"
l[[2]][1]
[1] "a"

因子

从数据是否可以定量地进行数学运算来划分,数据分为和定量数据和定性数据。不能简单地以是否表示为数值来区分定量数据和定性数据,因为定性数据也可以使用数值来表示,甚至数字的相对大小可以有意义:例如对一家饭店的评价分为三档:差、一般、好,就可以分别用 0-2 的整数来表示,较大的数字对应较高的评分,但对这种数字进行数学运算显然是没有意义的。对数据类型的分类不属于本篇范畴,这里仅给出一张分类示意图,更多的内容将在数据处理部分进行介绍。


回到 R 数据结构中来,因子就是 R 中专门用来表示定性变量(定性数据构成的变量)的一种数据结构,它是一种特殊的向量,其类属性为factor,其中定性变量每一个可能的取值称为一个水平(level),所有水平的向量构成了因子的水平属性level,用level()函数可以查看一个因子的水平。注意:因子只是一个单独定义的类,而不是数据的储存类型,因为定性数据也往往是以数字或者字符表示的。因子向量的存储类型为integar,而因子内部的水平向量的存储类型为character,这与因子水平在形式上是以数字还是字符表示无关,通过一个内部函数,因子可以将 \(1\sim n\) 的正整数与 \(n\) 个表示水平取值的字符关联起来。

使用factor()函数创建因子

因子的创建可以使用factor()函数,其语法为:

factor(x, levels, labels = levels,
       exclude = NA, ordered = is.ordered(x), nmax = NA)

参数说明

x接受数据向量:

a <- factor(c('b','a','c'))
a
[1] b a c
Levels: a b c

可选参数level接受指定的因子水平向量及顺序,长度不超过数据向量中不同值的个数(如果长度小于数据向量中不同值的个数,匹配不上的位置会转换成缺失值NA),默认值为as.character(x),也即将x的所有不同取值转化为字符。默认情况下因子水平按照首字母顺序和数字顺序排序。

b <- factor(1:5,levels = 1:2)
b
[1] 1    2    <NA> <NA> <NA>
Levels: 1 2

可选参数label用于因子水平的命名以及精简,它接受一个与level等长的向量(level显式指定或者缺省均如此),不同值按照位置对应level向量中不同的水平,可以使用重复的值来让多个因子水平对应一个水平名,从而把多个因子水平整合成一个;或者,也可以使用单个字符串,factor()函数会自动在字符串后面加上正整数来匹配level向量的长度。

说起来可能比较复杂,还是看例子直观一些:

f1 <- factor(c(1,2,1,2,1), levels = c(2,1), labels = 'level')
f1
[1] level2 level1 level2 level1 level2
Levels: level1 level2
f2 <- factor(c(1,2,3,2,1), levels = c(3,2,1),labels = c('female','female','male'))
f2
[1] male   female female female male  
Levels: female male
f3 <- factor(c(1,2,3,2,1), labels = c('female','female','male'))
f3
[1] female female male   female female
Levels: female male


可选参数exclude给出了需要从输入向量中去除的值,默认值为缺失值NA,也即默认去除缺失值;如果要保留缺失值作为一个水平,可以将其设为NULL

f4 <- factor(c(1,2,1,2,3), labels = c('boys','girls'), exclude = 3)
f4
[1] boys  girls boys  girls <NA> 
Levels: boys girls
f5 <- factor(c(1,2,1,2,NA), labels = c('boys','girls'))
f5
[1] boys  girls boys  girls <NA> 
Levels: boys girls
f6 <- factor(c(1,2,1,2,NA), labels = c('boys','girls','missing data'), exclude = NULL)
f6
[1] boys         girls        boys         girls        missing data
Levels: boys girls missing data

可选参数ordered用来指定是否创建定序变量,它接受一个逻辑值,TRUEFALSE分别对应因子水平是否是有序的,默认取FALSE创建无序因子。

f7 <- factor(c('a','b','c'), ordered = T)
f7
[1] a b c
Levels: a < b < c
f8 <- factor(c('a','b','c'), levels = c('c','a','b'), ordered = T)
f8
[1] a b c
Levels: c < a < b

最后,可选参数nmax指定最大水平数,在数据向量的不同值的数量过多时,可以用来节省内存。

使用cut()函数创建因子

当数据向量是数值向量时,可以使用cut()函数将数据的范围划分为多个区间来创建一个因子向量,每个区间对应一个因子水平。其基本语法为:

cut(x, breaks, labels = NULL,
      include.lowest = FALSE, right = TRUE, dig.lab = 3,
    ordered_result = FALSE, ...)

参数说明

参数x用于接受数据向量;

参数breaks用于接受全部区间的端点构成的递增数值向量,或者要划分的区间数(大于等于2);

参数labels的作用和在factor()函数中相同,用于指定水平名称,默认以区间作为水平名称;

逻辑值参数right表示区间是左开右闭还是左闭右开,默认取TRUE(左开右闭);

参数rightTRUE时,逻辑值参数include.lowest用于表示是否包含最小区间的下限,参数rightFALSE时,逻辑值参数include.highest用于表示是否包含最大区间的上限;

逻辑值参数ordered_result表示是否为有序因子,默认取FALSE

注意:
1. 根据参数right的不同设置,cut()函数划分的区间是左开右闭或是左闭右开的,所以参数breaks接受区间的端点时,下限要低于数据中的最小值,或者上限要高于数据中的最大值,以包含全部数据;
2. 参数breaks接受划分的区间数时,默认会在数据最小值和最大值之间进行等分,并且会自动将下限调低一点,上限调高一点,此时如果不指定参数labels,微调的数值会作为区间下限和上限显示在因子水平里,参数dig.lab用来调整水平中显示的微调精度,默认值为3,同时也是最大精度。

下面来看例子:

c1 <- cut(1:5, c(1,3,5))
c1
[1] <NA>  (1,3] (1,3] (3,5] (3,5]
Levels: (1,3] (3,5]
c2 <- cut(1:5, c(1,3,5), right = F)
c2
[1] [1,3) [1,3) [3,5) [3,5) <NA> 
Levels: [1,3) [3,5)
c3 <- cut(1:5, c(1,3,5), include.lowest = T)
c3
[1] [1,3] [1,3] [1,3] (3,5] (3,5]
Levels: [1,3] (3,5]
c4 <- cut(1:5, 4)
c4
[1] (0.996,2] (0.996,2] (2,3]     (3,4]     (4,5]    
Levels: (0.996,2] (2,3] (3,4] (4,5]
c5 <- cut(1:5, 4, labels = c('a','b','c','d'), ordered_result = T)
c5
[1] a a b c d
Levels: a < b < c < d

使用gl()函数创建因子

想要从零开始快速地创建一个各水平重复次数相同的因子,可以使用gl()函数。尽管局限性较强,但在没有数据,又需要临时使用一种结构简单的因子时,gl()函数是一个不错的选择。其语法为:

gl(n, k, length = n*k, labels = seq_len(n), ordered = FALSE)

参数nk分别指定了因子的水平数和每个水平重复的次数;参数length指定了因子向量的长度,默认取n*k;参数labels指定了水平名称,默认为 \(1\sim n\) 的正整数;逻辑值参数ordered用于指定因子是否有序。

gl(3,2, labels = c('a','b','c'), ordered = T)
[1] a a b b c c
Levels: a < b < c

tibble数据框

tibble数据框是tibble包中的一种数据结构,tibble包是现代化R数据科学包集合——tidyverse的核心包之一。tibble数据框是对 R base包自带的data.frame数据框的改进和简化,使其更符合现代数据科学工作者的思维。tibble数据框同时具有三种类属性:tbl_dftbldata.frame

tibble数据框的创建

tibble数据框的创建使用tibble()函数,其基本语法如下:

tibble(
  ...,
  .rows = NULL,
  .name_repair = c("check_unique", "unique", "universal", "minimal")
)

data.frame()函数不同,tibble()函数的数据输入只接受tag = value的形式,即使没有指定tagtibble()函数也会认为是tag缺失而自动填充一个tag,而不会认为只传递了一个对象作为value

data.frame数据框的区别

tibble数据框与data.frame数据框的一些区别如下:

  • tibble数据框的打印格式更紧凑,数据集较大时便于展示

  • tibble数据框不能把字符型变量自动转换为因子,而data.frame数据框可以根据需要使用逻辑值参数stringsAsFactors来指定,默认取FALSE(R 4.0.0 的改动)

  • 当变量名不符合 R 变量命名规则(比如含有空格)时,data.frame数据框会自动进行修饰使之符合命名规则(比如将空格替换成点),而tibble数据框会保留原变量名,并且支持使用反引号来指定不符合变量命名规则的变量名

names(data.frame(`crazy name` = 1))
[1] "crazy.name"
names(tibble(`crazy name` = 1))
[1] "crazy name"

  • tibble数据框没有行名属性,也不支持给行命名

  • tibble数据框使用下标索引,返回结果的类型仍然是tibble数据框,即使索引到单个元素也不例外

  • tibble数据框的列是按顺序惰性生成的,因此在创建后面的列时可以引用前面的列

想了解更多tibble数据框的特性,可以使用vignette("tibble")可以查看tibble包自带的简介文档。

LS0tDQp0aXRsZTogIlIg5Z+65pys5pWw5o2u57uT5p6EIg0KYXV0aG9yOiAiRWxsZXJ5IEhvbG1lcyINCmRhdGU6ICJgciBTeXMuRGF0ZSgpYCINCm91dHB1dDogDQogIGh0bWxfbm90ZWJvb2s6IA0KICAgIHRvYzogeWVzDQogICAgdG9jX2Zsb2F0OiB5ZXMgIyDkvb/nlKjmta7liqjnm67lvZUNCmVkaXRvcl9vcHRpb25zOiANCiAgbWFya2Rvd246IA0KICAgIHdyYXA6IDcyDQotLS0NCg0KYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9DQprbml0cjo6b3B0c19jaHVuayRzZXQoZXZhbD1UUlVFKQ0KbGlicmFyeSh0aWR5dmVyc2UpDQpgYGANCg0KUiDmmK/kuIDpl6jpnaLlkJHlr7nosaHnmoTlh73mlbDljJbmlbDnu4TnvJbnqIvor63oqIDvvIzmiYDmnInlj6/mk43kvZznmoQgUg0KKirlrp7kvZMoZW50aXR5KSoq6YO95pivKirlr7nosaEob2JqZWN0KSoq77yMIOWvueixoeWcqCBSDQrkuK3mmK/kuIDnp43kuJPpl6jnmoTmlbDmja7nu5PmnoTjgILmiYDmnIkgUg0K5a+56LGh6YO95oul5pyJ5LiA56eN5oiW6ICF5aSa56eNKirlsZ7mgKcoYXR0cmlidXRlKSoq77yMDQrlj6/ku6XnlKhgYXR0cmlidXRlcygpYOaIluiAhWBhdHRyKClg5Ye95pWw5p2l6K+75Y+W5oiW6K6+572u5a+56LGh55qE5bGe5oCn44CC5LiA5Liq6YeN6KaB5bGe5oCn5pivKirnsbsoY2xhc3MpKirvvIwNCuaJgOaciSBSDQrlr7nosaHpg73mi6XmnInnsbvlsZ7mgKfvvIzlj6/ku6XnlKhgY2xhc3MoKWDlh73mlbDmnaXor7vlj5blkozorr7nva7kuIDkuKrlr7nosaHnmoTnsbvvvIzluLjop4HnmoTnsbvmnIlgbnVtZXJpY2DvvIxgbG9naWNhbGDvvIxgY2hhcmFjdGVyYO+8jGBsaXN0YO+8jGBtYXRyaXhg77yMYGFycmF5YO+8jGBmYWN0b3Jg5ZKMDQpgZGF0YS5mcmFtZWDjgIINCg0KUiDlr7nosaHkuIDlrpropoHku6Xmn5Dnp40qKuexu+Weiyh0eXBlKSoq5p2l5a2Y5YKo77yM5Y+v5Lul55SoYHR5cGVvZigpYOWHveaVsOadpeiOt+W+l+S4gOS4qiBSDQrlr7nosaHnmoTnsbvlnovjgILkvb/nlKhgYXMu57G75Z6LKClg5Ye95pWw5Y+v5Lul5bCG5LiA56eN57G75Z6L55qE5a+56LGh6L2s5o2i5oiQ5Y+m5LiA56eN57G75Z6L77yM5L2/55SoYGlzLuexu+WeiygpYOWHveaVsOWPr+S7peWIpOaWreS4gOS4quWvueixoeaYr+WQpuWxnuS6juaMh+Wumuexu+Wei+OAgg0K5q2k5aSW77yMUiDlr7nosaHov5jmnInkuIDkuKoqKuWGheWcqOWxnuaApyhJbnRyaW5zaWMNCmF0dHJpYnV0ZSkqKu+8mioq5qih5byPKG1vZGUpKirvvIzlroPmnaXmupDkuo4gUiDor63oqIDnmoTliY3ouqsgUyDor63oqIDvvIwNCuaXoOazlemAmui/h+S9v+eUqGBtb2RlKClg5ZKMYHN0b3JhZ2UubW9kZSgpYOWHveaVsOWIhuWIq+WPr+S7pei/lOWbniBSDQrlr7nosaHnmoTmqKHlvI/lkozlrZjlgqjmqKHlvI/jgILlnKjlpKflpJrmlbDmg4XlhrXkuIvvvIwNCmB0eXBlb2YoKWDlkoxgbW9kZSgpYOeahOi/lOWbnue7k+aenOebuOWQjO+8jOS9hmB0eXBlb2YoKWDkvJrlsIbmlbDlgLzmqKHlvI9gbnVtZXJpY2Dnu4bliIbkuLrmlbTmlbDnsbvlnotgaW50ZWdhcmDlkowNCuWPjOeyvuW6pua1rueCueaVsOexu+Wei2Bkb3VibGVg77yM5LiOYHN0b3JhZ2UubW9kZSgpYOeahOi/lOWbnue7k+aenOebuOWQjOOAgg0KDQrogIzmlbDmja7np5HlrabkuK3mj5DliLDnmoTmlbDmja7nu5PmnoTmmL7nhLbkuI3mmK/lr7nosaHov5nnp43nrLznu5/nmoTmpoLlv7XvvIzogIzmmK/lrZjlgqjkuobmiJHku6zmhJ/lhbTotqPnmoTmlbDmja7nmoTlhbfkvZPmlbDmja7nu5PmnoTvvIwNCuS5n+WNs+aYr+WvueixoeeahOafkOS6m+exu+Wei++8iOazqOaEj+i/memHjOeahOexu+Wei+S4juS4iumdouivtOeahOWtmOWCqOeahOexu+Wei+aYr+S4jeWQjOeahOamguW/te+8ieOAguaDs+imgeiusOS9j+aJgOaciQ0KUiDmlbDmja7nu5PmnoQg5rKh5pyJ5oSP5LmJ77yM5LiN5ZCM55qEIFINCuWMheWPr+iDvei/mOS8muihpeWFheaWsOeahOaVsOaNrue7k+aehO+8jOWPquimgeS6huino+iHquW3semcgOimgeS9v+eUqOeahOaVsOaNrue7k+aehOWNs+WPr+OAguS4i+mdouS7i+e7jQ0KUiDkuK3luLjnlKjnmoTmlbDmja7nu5PmnoTjgIINCg0KIyDln7rmnKznsbvlnosNCg0K6aaW5YWI77yM5qC55o2u5a2Y5YKo57G75Z6L5piv5ZCm57uf5LiA77yM5Y+v5Lul5bCGIFINCuS4reaVsOaNrueahOWtmOWCqOe7k+aehOWIkuWIhuS4uuS4pOenjeWfuuacrOexu+Wei++8miAqKuWOn+WtkOWQkemHjyhhdG9taWMNCnZlY3RvcikqKuWSjCoq5rOb5Z6L5ZCR6YePKGdlbmVyaWMgdmVjdG9yKSoq44CCDQoNCiMjIOWOn+WtkOWQkemHjw0KDQrnlLHljZXkuIDlrZjlgqjnsbvlnovnmoTmlbDmja7mnoTmiJDnmoTmlbDmja7nu5PmnoTvvIznp7DkuLoqKuWOn+WtkOWQkemHjyhhdG9taWMNCnZlY3RvcikqKu+8jOS5n+WNs+WFtuaJgOacieWFg+e0oOmDveWFt+acieebuOWQjOeahGB0eXBlYOOAgg0K5a6e6ZmF5LiK77yM5Y6f5a2Q5ZCR6YeP5Y+q5pyJ5YWt56eN5Y+v6IO955qE5a2Y5YKo57G75Z6L77yaYGxvZ2ljYWxg77yMYGludGVnZXJg77yMYGRvdWJsZWDvvIxgY29tcGxleGDvvIxgY2hhcmFjdGVyYOWSjGByYXdg44CCDQrljp/lrZDlkJHph4/pmaTkuobpgJrluLjmiYDor7TnmoQgUiDor63oqIDkuK3nmoTvvIjnroDljZXvvInlkJHph4/vvIzov5jljIXmi6znn6npmLXjgIHmlbDnu4TnrYnjgIINCg0KIyMg5rOb5Z6L5ZCR6YePDQoNCueUseWkmuenjeWtmOWCqOexu+Wei+eahOaVsOaNruaehOaIkOeahOaVsOaNrue7k+aehO+8jOensOS4uioq5rOb5Z6L5ZCR6YePKGdlbmVyaWMNCnZlY3RvcikqKu+8jOWIl+ihqOS4reS4jeS9huWPr+S7peWMheWQq+WQhOenjeexu+Wei+eahOWOn+WtkOWQkemHj++8jOi/mOWPr+S7peW1jOWll+WFtuS7luazm+Wei+WQkemHj+OAguW4uOingeeahOazm+Wei+WQkemHj+acieaVsOaNruahhihkYXRhLmZyYW1lKeWSjOWIl+ihqChsaXN0Ke+8jOS4jei/h++8jOeUseS6juaVsOaNruahhuS5n+WPr+S7peeci+S9nOS4gOenjeeJueauiueahOWIl+ihqO+8jOWboOatpOW+iOWkmuaXtuWAmeebtOaOpeeUqCLliJfooagi5p2l5oyH5Luj5rOb5Z6L5ZCR6YeP77yM5Zyo5LiN5ZCM6K+t5aKD5Lit77yM6KaB5rOo5oSPIuWIl+ihqCLliLDlupXmjIfnmoTmmK/ms5vlnovlkJHph4/vvIzov5jmmK/liJfooajov5nnp43lhbfkvZPnmoTmlbDmja7nu5PmnoTjgIINCg0KIyDluLjnlKjnmoQgUiDmlbDmja7nu5PmnoQNCg0KIyMg5ZCR6YePDQoNCuWQkemHj+aYr+S4gOS4quS4gOe7tOaVsOe7hO+8jOWPr+S7peeUqOadpeWtmOWCqOaVsOWAvOWei+OAgeWtl+espuWei+WSjOmAu+i+keWei+eahOaVsOaNru+8jOS5n+WwseaYr+WvueW6lGB0eXBlYOS4umBpbnRlZ2VyYO+8jGBkb3VibGVg77yMYGNvbXBsZXhg77yMYGNoYXJhY3RlcmDlkoxgbG9naWNhbGDnmoTlhYPntKDjgILmraPlpoLliY3mlofmj5DliLDov4fnmoTvvIzlkJHph4/mmK/ljp/lrZDlkJHph4/nmoTkuIDnp43vvIzlm6DmraTkuIDkuKrlkJHph4/lj6rog73lrZjlgqjlkIzkuIDnp43nsbvlnovnmoTmlbDmja7vvIzlpoLmnpzkuIDkuKrlkJHph4/nlLHkuI3lkIznmoTmlbDlgLzlnovmlbDmja7mnoTmiJDvvIzpgqPkuYjkvJrmjInnhadgaW50ZWdlcmDvvIxgZG91YmxlYO+8jGBjb21wbGV4YOeahOmhuuW6j+aKiuWJjemdoueahOaVsOWAvOWtmOWCqOexu+Wei+W8uuWItui9rOaNouaIkOacgOWQjuS4gOenjeaVsOWAvOWtmOWCqOexu+Wei++8iGBpbnRlZ2Vy5Lya6KKr6L2s5o2i5oiQZG91YmxlYO+8jGBpbnRlZ2VyYOWSjGBkb3VibGVg5Lya6KKr6L2s5o2i5oiQYGNvbXBsZXhgKeOAgg0KDQrlgLzlvpfkuIDmj5DnmoTmmK/vvIzlkJHph4/nmoTnsbsoY2xhc3Mp5bCx5piv5a6D55qE5qih5byPKG1vZGUp44CCDQoNClINCuS4reayoeacieagh+mHj++8jOWNleS4queahOaVsOaNruWFg+e0oOS5n+S8muiiq+W9k+S9nOmVv+W6puS4ujHnmoTlkJHph4/jgILpobrluKbkuIDmj5DvvIzlkJHph4/nmoTplb/luqblj6/ku6XpgJrov4flh73mlbBgbGVuZ3RoKClg5b6X5Yiw44CCDQoNCiMjIyDlkJHph4/nmoTmk43kvZwNCg0KIyMjIyDliJvlu7rlkJHph48NCg0KLSAgIOS7jui+k+WFpeWIm+W7uuS4gOS4quWQkemHj++8muS9v+eUqOWHveaVsGBjKClgDQoNCmBgYHtyfQ0KKHggPC0gYygnSScsJ2xvdmUnLCdVJykpDQpgYGANCg0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCi0gICDliJvlu7rkuIDkuKrnrYnlt67luo/liJflkJHph4/vvJrkvb/nlKjor63ms5VgOmDov5DnrpfnrKbvvIjmraXplb/kuLox5oiW6ICFLTHml7bvvInmiJbogIXlh73mlbBgc2VxKClgDQoNCmBgYHtyfQ0KeCA8LSAxOjUNCnkgPC0gNToxDQp6IDwtIHNlcSgxLDcsMikNCng7eTt6DQpgYGANCg0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCi0gICDlpI3liLbkuIDkuKrlkJHph4/vvJrkvb/nlKjlh73mlbBgcmVwKClg77yM5L2/55So5Y+C5pWwYGVhY2hg6KGo56S66YCQ5YWD57Sg5aSN5Yi277yM5L2/55So5Y+C5pWwYHRpbWVzYOihqOekuuaVtOS9k+WkjeWItu+8jA0KICAgIOWIhuWIq+WvueW6lCBQeXRob24g55qEIE51bXB5IOWMheS4reeahGByZXBlYXQoKWDlh73mlbDlkoxgdGlsZSgpYOWHveaVsA0KDQpgYGB7cn0NCnggPC0gMTozDQpyZXAoeCwgZWFjaCA9IDIpDQpyZXAoeCwgdGltZXMgPSAyKSANCmBgYA0KDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0K5Y+C5pWwIHRpbWVzDQrov5jlj6/ku6XmjqXlj5fkuIDkuKrlkozmlbDlgLzlkJHph4/nrYnplb/nmoTmlbTmlbDlkJHph4/vvIzlj6/ku6Xkvp3mrKHmjIflrprmr4/kuKrliIbph4/ph43lpI3nmoTmrKHmlbDvvJoNCg0KYGBge3J9DQpyZXAoeCwgdGltZXMgPSAxOjMpDQpgYGANCg0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCiMjIyMg5pWw5YC85ZCR6YeP55qE6L+Q566XDQoNClIg5piv5ZCR6YeP5YyW57yW56iL6K+t6KiA77yM5Zug5q2k5a+55ZCR6YeP55qE5omA5pyJ6L+Q566X6YO955u05o6l5L2c55So5LqO5q+P5LiA5Liq5YiG6YeP77yaDQoNCmBgYHtyfQ0KeCA8LSAxOjMNCjMqeA0KYGBgDQoNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQrkuKTkuKrlkJHph4/ov5vooYzov5Dnrpfml7bvvIzkvJrmjInkvY3ov5vooYzvvIzlpoLmnpzplb/luqbkuI3kuIDoh7TvvIzkvJrlvqrnjq/kvb/nlKjovoPnn63nmoTkuIDkuKrlkJHph4/ku6XljLnphY3ovoPplb/nmoTlkJHph4/vvIwNCuW9k+i+g+mVv+eahOWQkemHj+eahOmVv+W6puS4jeaYr+i+g+efreWQkemHj+eahOWAjeaVsOaXtu+8jOW+queOr+S8mui/m+ihjO+8jOS9huS8mue7meWHuuitpuWRiuS/oeaBr++8mg0KDQpgYGB7cn0NCnYgPC0gMjo3DQp4IDwtIDE6Ng0KeSA8LSAxOjMNCnogPC0gMTo0DQp2ICsgeA0KeCArIHkNCnggKyB6DQpgYGANCg0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCui/meenjeaMieS9jeWQkemHj+i/kOeul+eahOinhOW+i+mAgueUqOS6juaJgOacieexu+Wei+eahOWQkemHj+OAguWcqCBQeXRob24g55qEIE51bXB5DQrljIXkuK3vvIzov5nnp43nibnmgKfooqvnp7DkuLrlub/mkq0oYnJvYWRjYXN0KeacuuWItuOAgg0KDQojIyMjIOmAu+i+keWQkemHj+eahOaTjeS9nA0KDQrpgLvovpHlkJHph4/nmoTliIbph4/pg73mmK/pgLvovpHlgLzvvIzpgLvovpHnnJ/kuLpgVFJVRWDmiJbogIVgVGDvvIzpgLvovpHlgYfkuLpgRkFMU0Vg5oiW6ICFYEZg77yM6L2s5o2i5oiQ5pWw5YC85YiZ5YiG5Yir5Li6MeWSjDDjgIINCg0K5LiL6KGo5YiX5Ye65LqGIFIg5pyA5Z+656GA55qE6YC76L6R6L+Q566X77yaDQoNCnwgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCnwtLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwNCnwg6L+Q566X56ymL+WHveaVsCB8IOi/kOeul+WQq+S5iSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCnwgYCZg77yMYCYmYCAgIHwg6YC76L6R5LiO6L+Q566X77yMJibpnZ7lv4XopoHkuI3mo4Dmn6XnrKwy5L2N5YWD57SgICAgfA0KfCBgfGDvvIxgfHxgICAgfCDpgLvovpHmiJbov5DnrpfvvIxcfFx86Z2e5b+F6KaB5LiN5qOA5p+l56ysMuS9jeWFg+e0oCB8DQp8IGAhYCAgICAgICAgIHwg6YC76L6R6Z2e6L+Q566XICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCnwgYHhvcigpYCAgICAgfCDpgLvovpHlvILmiJbov5DnrpcgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCnwgYGlzVFJVRSgpYCAgfCDliKTmlq3pgLvovpHlgLzmmK/lkKbkuLrnnJ8gICAgICAgICAgICAgICAgICAgIHwNCnwgYGlzRkFMU0UoKWAgfCDliKTmlq3pgLvovpHlgLzmmK/lkKbkuLrlgYcgICAgICAgICAgICAgICAgICAgIHwNCg0KYGFueSgpYOWSjGBhbGwoKWDlh73mlbDliIbliKvmo4DpqozpgLvovpHlkJHph4/kuK3mmK/lkKbmnIlgVFJVRWDlkozmmK/lkKblhajkuLpgVFJVRWDjgILlnKgNClB5dGhvbiDkuK3vvIzlkIzmoLfnmoTlip/og73mmK/pgJrov4cgTnVtcHkNCuWMheS4rWBuZGFycmF5YOeahGBhbnkoKWDlkoxgYWxsKClg5a6e5L6L5pa55rOV5a6e546w55qE44CCDQoNCmB3aGljaCgpYOWHveaVsOaOpeWPl+S4gOS4qumAu+i+keWQkemHj++8iOaIluiAheaVsOe7hO+8ie+8jOW5tuS4lOi/lOWbnumAu+i+keWAvOS4uuecn+eahOWFqOmDqOS4i+agh++8jOWcqA0KUHl0aG9uIOS4re+8jOWQjOagt+eahOWKn+iDveaYr+mAmui/hyBOdW1QeSDljIXkuK3nmoRgd2hlcmUoKWDlh73mlbDlrp7njrDnmoTjgIINCg0K5aaC5LiK5LiA6YOo5YiG5omA6L+w77yM6YC76L6R5ZCR6YeP5Lmf5ruh6Laz5ZCR6YeP5YyW6L+Q566X55qE6KeE5b6L77yM5LiN5YaN6LWY6L+w44CCDQoNCiMjIyMg5a2X56ym5ZCR6YeP55qE5pON5L2cDQoNCuWtl+espuWQkemHj+eahOWIhumHj+aYr+S4gOS4quS4qioq5a2X56ym5LiyKGNoYXJhY3Rlcg0Kc3RyaW5nKSoq77yM5a+55a2X56ym5Liy55qE5pON5L2c5ZKM5aSE55CG5piv5pWw5o2u5aSE55CG5Lit55qE6YeN6KaB5YaF5a6577yM5oiR5Lus5Zyo5LuL57uN5pWw5o2u5aSE55CG5pe25YaN5p2l5LuL57uN44CCDQoNCiMjIyDlkJHph4/nmoTkuIvmoIfvvIjntKLlvJXvvIkNCg0K5ZCR6YeP55qE5LiL5qCH5piv5q2j5pW05pWw5pe277yM6L+U5Zue6K+l5L2N572u55qE5YiG6YeP77yaDQoNCmBgYHtyfQ0KeCA8LSAxOjEwDQp4WzVdDQpgYGANCg0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCuWQkemHj+eahOS4i+agh+aYr+i0n+aVtOaVsOaXtu+8jOi/lOWbnuWOu+mZpOS6huivpeS9jee9rueahOWIhumHj+eahOaVtOS4quWQkemHj++8mg0KDQpgYGB7cn0NCnhbLTFdDQpgYGANCg0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCuWQkemHj+eahOS4i+agh+i/mOWPr+S7peaOpeWPl+S4gOS4quato+aVtOaVsOaIluiAhei0n+aVtOaVsOaehOaIkOeahOWQkemHj++8jOi/lOWbnuaJgOacieato+aVtOaVsOS9jee9rueahOWIhumHj++8jOaIluiAheWOu+mZpOaJgOaciei0n+aVtOaVsOS9jee9rueahOWIhumHj++8iOS9huimgeazqOaEj+S4jeiDveWQjOaXtuWMheWQq+ato+aVtOaVsOWSjOi0n+aVtOaVsO+8ie+8mg0KDQpgYGB7cn0NCnhbYygxLDEsNSldDQp4Wy1jKDIsNildDQpgYGANCg0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCuWQkemHj+S4i+agh+i/mOWPr+S7peaOpeWPl+S4gOS4quetiemVv+eahOmAu+i+keWQkemHj++8jOS+i+WmguWOn+WQkemHj+eahOS4gOS4qumAu+i+kei/kOeul+aIluiAheaTjeS9nO+8jOadpeWvueaVsOaNrui/m+ihjOetm+mAie+8mg0KDQpgYGB7cn0NCiMg6L+U5ZueIHgg5Lit5aSn5LqONSDnmoTlhajpg6jlhYPntKANCnhbeD41XQ0KYGBgDQoNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQrov5nnrYnku7fkuo7kvb/nlKhgd2hpY2goKWDlh73mlbDvvJoNCg0KYGBge3J9DQp4W3doaWNoKHg+NSldDQpgYGANCg0KIyMg5pWw57uEDQoNCioq5pWw57uEKGFycmF5KSoq5piv5LiA56eN5pyJ5aSa5Liq57u05bqm55qE5Y6f5a2Q5ZCR6YeP77yM5ZKM5ZCR6YeP55u45q+U77yM5a6D5aSa5LqG5LiA5Liq57u05bqm5bGe5oCnYGRpbWDvvIzmraTlpJbvvIzov5jlj6/ku6XmjIflrprlkITnu7TluqbnmoTlkI3np7DvvIjmoIfor4bnrKbvvInlj4LmlbBgZGltbmFtZXNg5p2l5Yib5bu6YGRpbW5hbWVzYOWxnuaAp+OAgg0KDQrliJvlu7rmlbDnu4Tkvb/nlKhgYXJyYXkoKWDlh73mlbDvvIzor63ms5XkuLrvvJoNCg0KYHthcnJheShkYXRhID0gTkEsIGRpbSA9IE5VTEwsIGRpbW5hbWVzID0gTlVMTCl9YA0KDQrlj4LmlbBgZGF0YWDmjqXlj5fnlKjkuo7liJvlu7rmlbDnu4TnmoTmlbDmja7lkJHph4/vvIxgZGltYOaOpeWPl+aMh+Wumue7tOaVsOeahOWQkemHj++8jGBkaW1uYW1lc2DmjqXlj5fmjIflrprlkITnu7TluqbnmoTlkI3np7DvvIjmoIfor4bnrKbvvInnmoTliJfooajjgIINCg0KYGBge3J9DQpkbmFtZTEgPC0gYygnQScsJ0InLCdDJykNCmRuYW1lMiA8LSBjKCdEMScsJ0QyJywnRDMnKQ0KZG5hbWUzIDwtIGMoJ2QxJywnZDInLCdkMycpDQpBID0gYXJyYXkoMToyNywgYygzLDMsMyksIGxpc3QoZG5hbWUxLGRuYW1lMixkbmFtZTMpKQ0KQQ0KYGBgDQoNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQpgZGltKClg5ZKMYGRpbW5hbWVzKClg5Ye95pWw5YiG5Yir55So5LqO6I635Y+W5pWw57uE55qE57u05pWw5ZKM5ZCE57u05bqm5ZCN56ew77yM5YiG5Yir6L+U5Zue5LiA5Liq5ZCR6YeP5ZKM5LiA5Liq5YiX6KGo44CCDQoNCmBgYHtyfQ0KZGltKEEpDQpgYGANCg0KYGBge3J9DQpkaW1uYW1lcyhBKQ0KYGBgDQoNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQrmlbDnu4TnmoTovaznva7vvJrpgJrov4flh73mlbBgYXBlcm0oKWDlrp7njrDvvIzkuI3luLjnlKjliLDvvIzkuI3lnKjmraTlpITlsZXlvIDjgIINCg0KPiDms6jmhI/vvJpSIOeahOaVsOe7hOS4jiBQeXRob24g55qEIE51bVB5DQo+IOWMheS4reeahGBuZGFycmF5YOaOkuWIl+e7tOW6pueahOmhuuW6j+S4jeS4gOagt++8jOimgeWMuuWIhua4healmuOAgg0KDQojIyDnn6npmLUNCg0K55+p6Zi15a6e6ZmF5LiK5bCx5pivMue7tOeahOaVsOe7hO+8jOWQjOaXtuWFt+aciWBtYXRyaXhg5ZKMYGFycmF5YOS4pOS4quexu+WxnuaAp+OAguS9huaYr+efqemYteeahOeUqOmAlOavlOaVsOe7hOW5v+azm+W+l+Wkmu+8jOWboOatpA0KUiDmnInkuIDns7vliJfkuJPpl6jnmoTnn6npmLXlh73mlbDlkoznn6npmLXmk43kvZzjgIINCg0KIyMjIOefqemYteeahOWIm+W7ug0KDQrliJvlu7rnn6npmLXkvb/nlKhgbWF0cml4KClg5Ye95pWw77yM5YW25Z+65pys6K+t5rOV5Li677yaDQoNCmBgYCAgICAgICAgIA0Ke21hdHJpeChkYXRhID0gTkEsIG5yb3cgPSBOVUxMLCBuY29sID0gTlVMTCwgYnlyb3cgPSBGQUxTRSwgZGltbmFtZXMgPSBOVUxMKX0NCmBgYA0KDQrlj4LmlbBgZGF0YWDmjqXlj5fnlKjkuo7liJvlu7rnn6npmLXnmoTmlbDmja7lkJHph4/vvIxgbnJvd2DlkoxgbmNvbGDliIbliKvmjqXlj5fooYzmlbDlkozliJfmlbDvvIjlj6/ku6XnnIHnlaXlhbbkuK3nmoTkuIDkuKrorqnlh73mlbDoh6rliqjljLnphY3lj6bkuIDkuKrvvInvvIzpgLvovpHlgLzlj4LmlbBgYnlyb3dg5oyH5a6a5ZCR6YeP5oyJ6KGM5o6S5YiX6L+Y5piv5oyJ5YiX5o6S5YiX77yM6buY6K6k5Y+WYEZhbHNlYO+8jGBkaW1uYW1lc2DmjqXlj5fmjIflrprlkITooYzlkozlkITliJflkI3np7DvvIjmoIfor4bnrKbvvInnmoTliJfooajjgIINCg0KYGBge3J9DQpNIDwtIG1hdHJpeCgxOjYsIG5yb3cgPSAyKQ0KTQ0KYGBgDQoNCiMjIyDluLjnlKjnn6npmLXlh73mlbANCg0K5Zug5Li655+p6Zi15bCx5piv5pWw57uE77yM5omA5Lul5pWw57uE5Ye95pWw6Ieq54S25Lmf6YCC55So5LqO55+p6Zi144CC5q2k5aSW77yM5LiL6KGo5Lit5YiX5Ye65LqGIFINCuS4reS4gOS6m+W4uOeUqOeahOefqemYteWHveaVsO+8mg0KDQp8ICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCnwtLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfA0KfCDlh73mlbDlkI0gICAgICAgfCDlip/og70gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCnwgYHJiaW5kKClgICAgIHwg5bCG5Lik5Liq5oiW5aSa5Liq55+p6Zi15oiW5ZCR6YeP5oyJ6KGM5aCG5Y+g5oiQ5LiA5Liq55+p6Zi1ICAgICB8DQp8IGBjYmluZCgpYCAgICB8IOWwhuS4pOS4quaIluWkmuS4quefqemYteaIluWQkemHj+aMieWIl+WghuWPoOaIkOS4gOS4quefqemYtSAgICAgfA0KfCBgcm93bmFtZXMoKWAgfCDov5Tlm57nn6npmLXlkITooYznmoTlkI3np7DvvIzlj6/ku6XnlKjmnaXkuLrnn6npmLXmjIflrprooYzlkI3np7AgfA0KfCBgY29sbmFtZXMoKWAgfCDov5Tlm57nn6npmLXlkITliJfnmoTlkI3np7DvvIzlj6/ku6XnlKjmnaXkuLrnn6npmLXmjIflrprliJflkI3np7AgfA0KfCBgbnJvdygpYCAgICAgfCDov5Tlm57nn6npmLXnmoTooYzmlbAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KfCBgbmNvbCgpYCAgICAgfCDov5Tlm57nn6npmLXnmoTliJfmlbAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KfCBgdCgpYCAgICAgICAgfCDnn6npmLXovaznva4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KfCBgaW52ZXJzZSgpYCAgfCDmsYLnn6npmLXnmoTpgIbnn6npmLXmiJbogIXlub/kuYnpgIYgICAgICAgICAgICAgICAgICAgICB8DQp8IGBkZXQoKWAgICAgICB8IOaxguefqemYteeahOihjOWIl+W8jyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQp8IGBkaWFnKClgICAgICB8IOaPkOWPluefqemYteWvueinkuWFg++8jOaIluiAheeUseWQkemHj+WIm+W7uuWvueinkuefqemYtSAgICAgICB8DQp8IGBlaWdlbigpYCAgICB8IOaxguefqemYteeahOeJueW+geWAvOWSjOeJueW+geWQkemHjyAgICAgICAgICAgICAgICAgICAgIHwNCnwgYHNvbHZlKClgICAgIHwg5rGC57q/5oCn5pa556iL57uE55qE6KejICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQoNCuefqemYteeahOWfuuacrOaVsOWtpui/kOeul+espuWPt+WSjOWHveaVsOmDveS4juaVsOWAvOWei+WQkemHj+ebuOWQjO+8jOS9humcgOimgeazqOaEj++8jOefqemYteS5mOazlemcgOimgeS9v+eUqOespuWPt2AlKiVg77yM55u05o6l5L2/55SoYCpg6L+b6KGM55qE5piv5oyJ5L2N5LmY5rOV44CCDQoNCiMjIyDnn6npmLXnmoTkuIvmoIfvvIjntKLlvJXvvIkNCg0K55+p6Zi15LiL5qCH55qE55So5rOV5ZKM5ZCR6YeP5LiL5qCH57G75Ly877yM6KGM57Si5byV5ZKM5YiX57Si5byV55So6YCX5Y+35YiG6ZqU5byA77yI6YCX5Y+35LiN6IO955yB55Wl77yJ77yM55yB55Wl6KGM57Si5byV5oiW6ICF5YiX57Si5byV5YiZ6KGo5piO5YyF5ZCr5YWo6YOo55qE6KGM5oiW5YiX77yM5LiL6Z2i55qE5L6L5a2Q5Y+v6IO95pu055u06KeC5LiA5Lqb44CCDQoNCui/lOWbnuefqemYtSBNIOeahOesrDHooYznrKwy77yMM+WIl+eahOWFg+e0oO+8mg0KDQpgYGB7cn0NCk1bMSwyOjNdDQpgYGANCg0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCui/lOWbnuefqemYtSBNIOeahOesrDPliJfnmoTlhYPntKDvvJoNCg0KYGBge3J9DQpNWywzXQ0KYGBgDQoNCuWmguaenOacieihjOWQjeaIluiAheWIl+WQje+8jOi/mOWPr+S7peeUqOihjOWQjeaIluiAheWIl+WQjeeahOWtl+espuS4suS9nOS4uuS4i+agh++8mg0KDQpgYGB7cn0NCnJvd25hbWVzKE0pPC0gYygncjEnLCdyMicpDQpNWydyMScsXQ0KYGBgDQoNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQrlkozlkJHph4/kuIDmoLfvvIznn6npmLXkuZ/mjqXlj5fpgLvovpHlgLzkuIvmoIfvvIzkvYbkvJrov5Tlm57kuIDkuKrlkJHph4/vvJoNCg0KYGBge3J9DQpNW00+Ml0NCmBgYA0KDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0K5ZCR6YeP5ZKM55+p6Zi155qE5YWD57Sg6YO95Y+v5Lul6YCa6L+H5L2/55So5LiL5qCH5p2l5L+u5pS577yM5L6L5aaC77yM5bCG55+p6Zi1IE0g55qE56ysMuWIl+aUueS4ujDvvJoNCg0KYGBge3J9DQpNWywyXSA8LSAwDQpNDQpgYGANCg0KIyMg5pWw5o2u5qGGDQoNCuaVsOaNruahhuaYryBSIOS4reacgOmHjeimgeeahOaVsOaNrue7k+aehOS5i+S4gO+8jOWmguaenOWPquiAg+iZkSBiYXNlDQpS77yM55Sa6Iez5Y+v5Lul5Y675o6J5LmL5LiA44CC5L2c5Li65LiA56eN5LqM57u055qE5rOb5Z6L5ZCR6YeP5pWw5o2u57uT5p6E77yM5a6D55u45b2T5LqO55+p6Zi155qE5LiA56eN5bu255Sz77yM5pivDQpSDQrkuK3mnIDluLjnlKjnmoTmlbDmja7nu5PmnoTjgILmlbDmja7moYbnm7jlvZPkuo7kuIDnp43nibnmrornmoTjgIHlvaLnirbop4TmlbTnmoTnn6nlvaLliJfooajvvIzmiYDku6XmlbDmja7moYbnmoTnsbvlsZ7mgKfmmK9gZGF0YS5mcmFtZWDvvIzkvYblrZjlgqjnsbvlnovmmK9gbGlzdGDjgIINCg0K5pWw5o2u5qGG55qE5bGe5oCn5ZKM55+p6Zi15bGe5oCn57G75Ly877yM5Y+q5LiN6L+H5YiX5ZCN5bGe5oCn5pivYG5hbWVzYOiAjOmdnmBjb2xuYW1lc2DvvIznlKjkuo7lvpfliLDnn6npmLXnu7TmlbDnmoTlh73mlbBgZGltKClg77yMYG5yb3coKWDvvIxgbmNvbCgpYOS5n+mDvemAgueUqOS6juaVsOaNruahhuOAgg0KDQojIyMg5pWw5o2u5qGG55qE5Yib5bu6DQoNCuaVsOaNruahhueahOWIm+W7uuS9v+eUqGBkYXRhLmZyYW1lKClg5Ye95pWw77yM5YW25Z+65pys6K+t5rOV5aaC5LiL77yaDQoNCmBgYCAgICAgICAgIA0KZGF0YS5mcmFtZSguLi4sIHJvdy5uYW1lcyA9IE5VTEwsIGNoZWNrLnJvd3MgPSBGQUxTRSwNCiAgICAgICAgICAgY2hlY2submFtZXMgPSBUUlVFLCBmaXguZW1wdHkubmFtZXMgPSBUUlVFLA0KICAgICAgICAgICBzdHJpbmdzQXNGYWN0b3JzID0gRkFMU0UpDQpgYGANCg0K5rOo5oSP5Yiw5rKh5pyJYG5hbWVzYOWPguaVsO+8jGAuLi5g6YOo5YiG5Y+v5Lul55u05o6l6L6T5YWl5pWw5o2u6KGo5oiW6ICF55+p6Zi177yM5Yib5bu65pWw5o2u5qGG5ZCO5Y+v5Lul55SoYG5hbWVzKClg5Ye95pWw5oyH5a6a5YiX5ZCNYG5hbWVzYO+8m+S5n+WPr+S7peeUqGB0YWcgPSB2YWx1ZWDnmoTlvaLlvI/vvIjmraTlpITkuI3og73kvb/nlKhgPC1g6LWL5YC85Y+377yJ6L6T5YWl5aSa57uE5qCH562+LeWAvOWvue+8jOS7peagh+etvuS9nOS4uuWIl+WQje+8m+aIluiAhei+k+WFpeWkmuS4quWQkemHj++8jOS7peavj+S4quWQkemHj+WQjeS9nOS4uuebuOW6lOeahOWIl+WQjeOAgg0KDQpgYGB7cn0NCkEgPC0gbWF0cml4KDE6NiwyLDMpDQpkYXRhMSA8LSBkYXRhLmZyYW1lKEEpDQpuYW1lcyhkYXRhMSkgPC0gYygnYScsJ2InLCdjJykNCmRhdGEyIDwtIGRhdGEuZnJhbWUoJ0EnID0gQVssMV0sICdCJyA9IEFbLDJdLCAnQycgPSBBWywzXSkNCmNvbF9hIDwtIDE6Mg0KY29sX2IgPC0gMzo0DQpjb2xfYyA8LSA1OjYNCmRhdGEzIDwtIGRhdGEuZnJhbWUoY29sX2EsY29sX2IsY29sX2MpDQpkYXRhMQ0KZGF0YTINCmRhdGEzDQpgYGANCg0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCuaVsOaNruahhueahOavj+S4gOWIl+mDveW/hemhu+aYr+WQjOS4gOenjeWtmOWCqOexu+Wei++8jOS4jeWQjOWIl+S5i+mXtOWPr+S7peaYr+S4jeWQjOWtmOWCqOexu+Wei++8jOi/meenjee7k+aehOS4juWkp+WkmuaVsOaDheWGteS4i+eahOaIqumdouaVsOaNruS4gOiHtO+8jOi/meS5n+aYr+aVsOaNruahhuiiq+W5v+azm+S9v+eUqOeahOWOn+WboO+8jOaVsOaNruahhueahOS4gOWIl+S5n+WwseaYr+aIqumdouaVsOaNruS4reeahOS4gOS4quWPmOmHj++8jOWboOatpOWIl+WQjeS5n+W4uOiiq+ensOS4uuWPmOmHj+WQjeOAgg0KDQojIyMg5pWw5o2u5qGG55qE57Si5byVDQoNCuaVsOaNruahhuS4juefqemYtee7k+aehOexu+S8vO+8jOWboOatpOefqemYteeahOS4i+agh+i/kOeul+S5n+mDvemAgueUqOOAgg0KDQpgYGB7cn0NCmRhdGExWzEsMl0NCmBgYA0KDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0K5L2G6ZyA6KaB5rOo5oSP55qE5piv77yM5aaC5p6c5Y+q5L2/55So5LiA5Liq5LiL5qCH77yI5Y2V5Liq5pW05pWw5oiW5Y2V5Liq5ZCR6YeP77yJ77yM5pWw5o2u5qGG5LiO55+p6Zi155qE6KGM5Li65bCx5LiN5ZCM5LqG77ya55+p6Zi15Lya77yI5oyJ5YiX77yJ5ouJ55u05Li65ZCR6YeP77yM54S25ZCO5oyJ5ZCR6YeP5LiL5qCH5p2l5aSE55CG77yb6ICM5pWw5o2u5qGG5Lya5oqK5Y2V5Liq55qE5LiL5qCH55CG6Kej5Li65a+55YiX55qE57Si5byV77yM5Lmf5bCx5pivYOaVsOaNruahhlvntKLlvJXlgLxdYOWSjGDmlbDmja7moYZbLOe0ouW8leWAvF1g6LCD55So55qE5YWD57Sg5piv5LiA5qC355qE77yI5Y+q5LiN6L+H5YmN6ICF5piv5pWw5o2u5qGG77yM5ZCO6ICF5piv5ZCR6YeP77yJ44CC5b2T54S255Sx55+p6Zi155qE5YiX5ZCN57Si5byV5pa55byP5Y+v5Lul5b6X55+l77yMYOaVsOaNruahhlvliJflkI1dYOWSjGDmlbDmja7moYZb5YiX5ZCNXWDkuZ/mmK/kuIDmoLfnmoTvvIjlkIzmoLflnLDvvIzliY3ogIXmmK/mlbDmja7moYbvvIzlkI7ogIXmmK/lkJHph4/vvInjgIINCg0KYGBge3J9DQpkYXRhMVsyXQ0KZGF0YTFbLDJdDQpgYGANCg0KKuazqOaEj++8mlB5dGhvbiDnmoQgcGFuZGFzIOWMheS4reeahGBEYXRhRnJhbWVg5pWw5o2u5qGG5piv5Lu/54WnIFINCuaVsOaNruahhuiuvuiuoeeahO+8jOS9hmBEYXRhRnJhbWVg5Lya5oqK5Y2V5Liq55qE5LiL5qCH55CG6Kej5Li65a+56KGM55qE57Si5byV77yM6L+Z5piv55Sx5LqODQpQeXRob24g55qEIE51bVB5IOWSjCBwYW5kYXMg6YO96buY6K6k5oqK5ZCR6YeP5b2T5L2c6KGM5ZCR6YeP77yM6ICMIFINCum7mOiupOaKiuWQkemHj+W9k+S9nOWIl+WQkemHj+OAgioNCg0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCuS4jei/h+avleern+efqemYteeahOS4i+agh+i/kOeul+S4jeaYr+S4uuS6huaVsOaNruahhuiuvuiuoeeahO+8jOaVsOaNruahhuacieiHquW3seeahOinhOiMg+eahOe0ouW8leaWueazleOAgg0KDQrmlbDmja7moYbkuK3nmoTliJflj6/ku6XnlKhgJGDmk43kvZznrKbmnaXosIPnlKjvvIzlhbbor63ms5XkuLpg5pWw5o2u5qGGJOWPmOmHj+WQjWDvvIjov5nlrp7pmYXkuIrmmK/liJfooajnmoTor63ms5XvvInjgIINCg0KYGBge3J9DQpkYXRhMiRDDQpgYGANCg0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCuWmguaenOS4jeaDs+avj+asoeiwg+eUqOWPmOmHj+mDveW4puS4iuaVsOaNruahhuWQje+8jOWPr+S7peS9v+eUqGBhdHRhY2goKWDlh73mlbDvvIznm7jlvZPkuo7ov5vlhaXkuobmlbDmja7moYbnmoTlhoXpg6jnjq/looPvvIzkvb/nlKjov4flkI7liKvlv5jkuobkvb/nlKhgZGV0YWNoKClg5Ye95pWw6YCA5Ye677yM5Lul5YWN5byV6LW35Y+v6IO955qE5Y+Y6YeP5ZCN5Yay56qB77yaDQoNCmBgYHtyIGVycm9yID0gVFJVRX0NCmF0dGFjaChkYXRhMSkNCmENCmRldGFjaChkYXRhMSkNCmENCmBgYA0KDQoq6L+Z5Lik5Liq5Ye95pWw5Lmf6YCC55So5LqO5YiX6KGo44CCKg0KDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0K5oiW6ICF5L2/55SoYHdpdGgoKWDlh73mlbDliJvlu7rkuIDkuKrkvb/nlKjmlbDmja7moYblhoXpg6jlj5jph4/nmoTni6znq4vnjq/looPvvIzkvb/nlKjnibnmrorotYvlgLznrKZgPDwtYOi/mOWPr+S7peWwhuWPmOmHj+S/neWtmOiHs+WklumDqOeOr+Wig++8mg0KDQpgYGB7ciBlcnJvciA9IFRSVUV9DQp3aXRoKGRhdGExLCB7DQogIGNfZG91YmxlIDwtIDIqYw0KICBjX3NxIDw8LSBjXjINCn0pDQpjX2RvdWJsZQ0KY19zcQ0KYGBgDQoNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQrogIzopoHov5vooYzovoPkuLrlpI3mnYLnmoTmlbDmja7pgInmi6nvvIzlj6/ku6Xkvb/nlKhgc3Vic2V0KClg5Ye95pWw77yM5YW26K+t5rOV5Li677yaDQoNCmBgYCAgICAgICAgIA0Kc3Vic2V0KHgsIHN1YnNldCwgc2VsZWN0LCBkcm9wID0gRkFMU0UsIC4uLikNCmBgYA0KDQpgeGDmjqXlj5fmlbDmja7moYbvvIxgc3Vic2V0YOaOpeWPl+ihjOWQjeaIluiAheeUqOS6juetm+mAieeahOmAu+i+keihqOi+vuW8j++8jGBzZWxlY3Rg5o6l5Y+X5Y+Y6YeP5ZCN44CCDQoNCmBgYHtyfQ0KZGF0YV9tYXRyaXggPC0gbWF0cml4KDE6MjUsNSkNCmRhdGEgPC0gZGF0YS5mcmFtZShkYXRhX21hdHJpeCkNCm5hbWVzKGRhdGEpIDwtIGMoJ2EnLCdiJywnYycsJ2QnLCdlJykNCmRhdGENCnN1YnNldChkYXRhLCBzdWJzZXQgPSBjID4gMTIsIHNlbGVjdCA9IGMoJ2EnLCdiJykpDQpgYGANCg0KIyMg5YiX6KGoDQoNCuWIl+ihqOaYryBSDQrkuK3mnIDlpI3mnYLnmoTmlbDmja7nu5PmnoTvvIzmlbDmja7moYblj6rmmK/liJfooajnmoTkuIDkuKrnibnkvovjgILmlbDmja7moYbnlLHkuI3lkIznsbvlnovnmoTnrYnplb/lkJHph4/mjInliJflubbmjpLmnoTmiJDvvIzogIzliJfooajlj6/ku6XnlLHku7vmhI8NClINCuWvueixoe+8iOWQkemHj+OAgeefqemYteOAgeaVsOe7hOOAgeaVsOaNruahhueUmuiHs+aYr+WFtuS7luWIl+ihqO+8ieaehOaIkO+8jOWug+S8muS4uuavj+S4gOS4quWvueixoeWIm+W7uuS4gOS4que0ouW8le+8jOS5n+WwseaYr+WQjeensOagh+etvu+8jOi/meS6m+agh+etvuaehOaIkOS6huWIl+ihqOeahOWQjeensOWxnuaAp2BuYW1lc2DjgILlkozmlbDmja7moYbnmoTlj5jph4/lkI3lsZ7mgKfnsbvkvLzvvIzliJfooajnmoRgbmFtZXNg5bGe5oCn5Y+v5Lul6YCa6L+HYG5hbWVzKClg5Ye95pWw5p2l5p+l55yL5ZKM5L+u5pS544CCDQoNCuWIl+ihqOeahOWIm+W7uuS9v+eUqGBsaXN0KClg5Ye95pWw77yM5YW25o6l5Y+X5a+56LGh5ZKMYG5hbWVzYOWxnuaAp+eahOeahOaWueW8j+S4jmBkYXRhLmZyYW1lKClg5Ye95pWw57G75Ly844CCDQoNCmBgYHtyfQ0Kb2JqMSA8LSAxOjUNCm9iajIgPC0gJ0hlbGxvIHdvcmxkIScNCm9iajMgPC0gbWF0cml4KDE6NCwyKQ0Kb2JqNCA8LSBhcnJheSgxOjI0LGMoMiwzLDQpKQ0Kb2JqNSA8LSBkYXRhLmZyYW1lKG5hbWU9Yygn5byg5LiJJywn5p2O5ZubJywn546L5LqUJyksIGFnZT1jKDIzLDI0LDI1KSkNCm9iajYgPC0gbGlzdChkYXkgPC0gYygxLDMpLCBtb250aCA8LSBjKCdGZWInLCdNYXknLCdBdWcnKSkNCkxJU1QgPC0gbGlzdCh2ZWM9b2JqMSwgY2hhcj1vYmoyLCBtYXQ9b2JqMywgYXJyPW9iajQsIGRmPW9iajUsIGxzPW9iajYpDQpMSVNUDQpgYGANCg0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCuWIl+ihqOS4reWvueixoeeahOiwg+eUqOWPr+S7peS9v+eUqGAkYOaTjeS9nOespueahOW9ouW8j2DliJfooagk5a+56LGhYO+8jOS5n+WPr+S7peS9v+eUqOWPjOWxguaWueaLrOWPt+eahOW9ouW8j2DliJfooahbW+WvueixoV1dYO+8mg0KDQpgYGB7cn0NCkxJU1QkY2hhcg0KTElTVFtbIm1hdCJdXQ0KYGBgDQoNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQrlpoLmnpzkuI3mmL7lvI/lnLDmjIflrppgbmFtZXNg5bGe5oCn77yM5YiX6KGo5bCx5Lya55So5pWw5a2X57Si5byV5p2l5qCH6K+G5q+P5Liq5a+56LGh77yM5q2k5pe25Y+q6IO955So5Y+M5bGC5pa55ous5Y+3K+aVsOWtl+e0ouW8leadpeiwg+eUqOWvueixoe+8iOaciWBuYW1lc2DlsZ7mgKfml7bov5nnp43mlrnms5XkuZ/lj6/nlKjvvInvvJoNCg0KYGBge3J9DQpsID0gbGlzdCgxOjMsYygnYScsJ2InKSkNCmwNCmxbWzJdXVsxXQ0KYGBgDQoNCiMjIOWboOWtkA0KDQrku47mlbDmja7mmK/lkKblj6/ku6Xlrprph4/lnLDov5vooYzmlbDlrabov5DnrpfmnaXliJLliIbvvIzmlbDmja7liIbkuLrlkozlrprph4/mlbDmja7lkozlrprmgKfmlbDmja7jgILkuI3og73nroDljZXlnLDku6XmmK/lkKbooajnpLrkuLrmlbDlgLzmnaXljLrliIblrprph4/mlbDmja7lkozlrprmgKfmlbDmja7vvIzlm6DkuLrlrprmgKfmlbDmja7kuZ/lj6/ku6Xkvb/nlKjmlbDlgLzmnaXooajnpLrvvIznlJroh7PmlbDlrZfnmoTnm7jlr7nlpKflsI/lj6/ku6XmnInmhI/kuYnvvJrkvovlpoLlr7nkuIDlrrbppa3lupfnmoTor4Tku7fliIbkuLrkuInmoaPvvJrlt67jgIHkuIDoiKzjgIHlpb3vvIzlsLHlj6/ku6XliIbliKvnlKgNCjAtMg0K55qE5pW05pWw5p2l6KGo56S677yM6L6D5aSn55qE5pWw5a2X5a+55bqU6L6D6auY55qE6K+E5YiG77yM5L2G5a+56L+Z56eN5pWw5a2X6L+b6KGM5pWw5a2m6L+Q566X5pi+54S25piv5rKh5pyJ5oSP5LmJ55qE44CC5a+55pWw5o2u57G75Z6L55qE5YiG57G75LiN5bGe5LqO5pys56+H6IyD55W077yM6L+Z6YeM5LuF57uZ5Ye65LiA5byg5YiG57G756S65oSP5Zu+77yM5pu05aSa55qE5YaF5a655bCG5Zyo5pWw5o2u5aSE55CG6YOo5YiG6L+b6KGM5LuL57uN44CCDQoNCmBgYHtyIGVjaG89RkFMU0V9DQpEaWFncmFtbWVSOjptZXJtYWlkKCINCmdyYXBoIFRCDQpBKOaVsOaNruexu+WeiyktLS1CKOWumuaAp+aVsOaNrikNCkEtLS1DKOWumumHj+aVsOaNrikNCkItLS1CMSjlrprluo/mlbDmja4pDQpCLS0tQjIo5ZCN5LmJ5pWw5o2uKQ0KQy0tLUMxKOi/nue7reWei+aVsOaNrikNCkMtLS1DMijnprvmlaPlnovmlbDmja4pDQogICAgICAgICIpDQpgYGANCg0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCuWbnuWIsCBSIOaVsOaNrue7k+aehOS4readpe+8jOWboOWtkOWwseaYryBSDQrkuK3kuJPpl6jnlKjmnaXooajnpLrlrprmgKflj5jph4/vvIjlrprmgKfmlbDmja7mnoTmiJDnmoTlj5jph4/vvInnmoTkuIDnp43mlbDmja7nu5PmnoTvvIzlroPmmK/kuIDnp43nibnmrornmoTlkJHph4/vvIzlhbbnsbvlsZ7mgKfkuLpgZmFjdG9yYO+8jOWFtuS4reWumuaAp+WPmOmHj+avj+S4gOS4quWPr+iDveeahOWPluWAvOensOS4uuS4gOS4quawtOW5syhsZXZlbCnvvIzmiYDmnInmsLTlubPnmoTlkJHph4/mnoTmiJDkuoblm6DlrZDnmoTmsLTlubPlsZ7mgKdgbGV2ZWxg77yM55SoYGxldmVsKClg5Ye95pWw5Y+v5Lul5p+l55yL5LiA5Liq5Zug5a2Q55qE5rC05bmz44CC5rOo5oSP77ya5Zug5a2Q5Y+q5piv5LiA5Liq5Y2V54us5a6a5LmJ55qE57G777yM6ICM5LiN5piv5pWw5o2u55qE5YKo5a2Y57G75Z6L77yM5Zug5Li65a6a5oCn5pWw5o2u5Lmf5b6A5b6A5piv5Lul5pWw5a2X5oiW6ICF5a2X56ym6KGo56S655qE44CC5Zug5a2Q5ZCR6YeP55qE5a2Y5YKo57G75Z6L5Li6YGludGVnYXJg77yM6ICM5Zug5a2Q5YaF6YOo55qE5rC05bmz5ZCR6YeP55qE5a2Y5YKo57G75Z6L5Li6YGNoYXJhY3RlcmDvvIzov5nkuI7lm6DlrZDmsLTlubPlnKjlvaLlvI/kuIrmmK/ku6XmlbDlrZfov5jmmK/lrZfnrKbooajnpLrml6DlhbPvvIzpgJrov4fkuIDkuKrlhoXpg6jlh73mlbDvvIzlm6DlrZDlj6/ku6XlsIYNCiQxXHNpbSBuJCDnmoTmraPmlbTmlbDkuI4gJG4kIOS4quihqOekuuawtOW5s+WPluWAvOeahOWtl+espuWFs+iBlOi1t+adpeOAgg0KDQojIyMg5L2/55SoYGZhY3RvcigpYOWHveaVsOWIm+W7uuWboOWtkA0KDQrlm6DlrZDnmoTliJvlu7rlj6/ku6Xkvb/nlKhgZmFjdG9yKClg5Ye95pWw77yM5YW26K+t5rOV5Li677yaDQoNCmBgYCAgICAgICAgIA0KZmFjdG9yKHgsIGxldmVscywgbGFiZWxzID0gbGV2ZWxzLA0KICAgICAgIGV4Y2x1ZGUgPSBOQSwgb3JkZXJlZCA9IGlzLm9yZGVyZWQoeCksIG5tYXggPSBOQSkNCmBgYA0KDQojIyMjIOWPguaVsOivtOaYjg0KDQpgeGDmjqXlj5fmlbDmja7lkJHph4/vvJoNCg0KYGBge3J9DQphIDwtIGZhY3RvcihjKCdiJywnYScsJ2MnKSkNCmENCmBgYA0KDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0K5Y+v6YCJ5Y+C5pWwYGxldmVsYOaOpeWPl+aMh+WumueahOWboOWtkOawtOW5s+WQkemHj+WPiumhuuW6j++8jOmVv+W6puS4jei2hei/h+aVsOaNruWQkemHj+S4reS4jeWQjOWAvOeahOS4quaVsO+8iOWmguaenOmVv+W6puWwj+S6juaVsOaNruWQkemHj+S4reS4jeWQjOWAvOeahOS4quaVsO+8jOWMuemFjeS4jeS4iueahOS9jee9ruS8mui9rOaNouaIkOe8uuWkseWAvGBOQWDvvInvvIzpu5jorqTlgLzkuLpgYXMuY2hhcmFjdGVyKHgpYO+8jOS5n+WNs+WwhmB4YOeahOaJgOacieS4jeWQjOWPluWAvOi9rOWMluS4uuWtl+espuOAgum7mOiupOaDheWGteS4i+WboOWtkOawtOW5s+aMieeFp+mmluWtl+avjemhuuW6j+WSjOaVsOWtl+mhuuW6j+aOkuW6j+OAgg0KDQpgYGB7cn0NCmIgPC0gZmFjdG9yKDE6NSxsZXZlbHMgPSAxOjIpDQpiDQpgYGANCg0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCuWPr+mAieWPguaVsGBsYWJlbGDnlKjkuo7lm6DlrZDmsLTlubPnmoTlkb3lkI3ku6Xlj4rnsr7nroDvvIzlroPmjqXlj5fkuIDkuKrkuI5gbGV2ZWxg562J6ZW/55qE5ZCR6YeP77yIYGxldmVsYOaYvuW8j+aMh+WumuaIluiAhee8uuecgeWdh+WmguatpO+8ie+8jOS4jeWQjOWAvOaMieeFp+S9jee9ruWvueW6lGBsZXZlbGDlkJHph4/kuK3kuI3lkIznmoTmsLTlubPvvIzlj6/ku6Xkvb/nlKjph43lpI3nmoTlgLzmnaXorqnlpJrkuKrlm6DlrZDmsLTlubPlr7nlupTkuIDkuKrmsLTlubPlkI3vvIzku47ogIzmiorlpJrkuKrlm6DlrZDmsLTlubPmlbTlkIjmiJDkuIDkuKrvvJvmiJbogIXvvIzkuZ/lj6/ku6Xkvb/nlKjljZXkuKrlrZfnrKbkuLLvvIxgZmFjdG9yKClg5Ye95pWw5Lya6Ieq5Yqo5Zyo5a2X56ym5Liy5ZCO6Z2i5Yqg5LiK5q2j5pW05pWw5p2l5Yy56YWNYGxldmVsYOWQkemHj+eahOmVv+W6puOAgg0KDQror7TotbfmnaXlj6/og73mr5TovoPlpI3mnYLvvIzov5jmmK/nnIvkvovlrZDnm7Top4LkuIDkupvvvJoNCg0KYGBge3J9DQpmMSA8LSBmYWN0b3IoYygxLDIsMSwyLDEpLCBsZXZlbHMgPSBjKDIsMSksIGxhYmVscyA9ICdsZXZlbCcpDQpmMQ0KZjIgPC0gZmFjdG9yKGMoMSwyLDMsMiwxKSwgbGV2ZWxzID0gYygzLDIsMSksbGFiZWxzID0gYygnZmVtYWxlJywnZmVtYWxlJywnbWFsZScpKQ0KZjINCmYzIDwtIGZhY3RvcihjKDEsMiwzLDIsMSksIGxhYmVscyA9IGMoJ2ZlbWFsZScsJ2ZlbWFsZScsJ21hbGUnKSkNCmYzDQpgYGANCg0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQrlj6/pgInlj4LmlbBgZXhjbHVkZWDnu5nlh7rkuobpnIDopoHku47ovpPlhaXlkJHph4/kuK3ljrvpmaTnmoTlgLzvvIzpu5jorqTlgLzkuLrnvLrlpLHlgLxgTkFg77yM5Lmf5Y2z6buY6K6k5Y676Zmk57y65aSx5YC877yb5aaC5p6c6KaB5L+d55WZ57y65aSx5YC85L2c5Li65LiA5Liq5rC05bmz77yM5Y+v5Lul5bCG5YW26K6+5Li6YE5VTExg44CCDQoNCmBgYHtyfQ0KZjQgPC0gZmFjdG9yKGMoMSwyLDEsMiwzKSwgbGFiZWxzID0gYygnYm95cycsJ2dpcmxzJyksIGV4Y2x1ZGUgPSAzKQ0KZjQNCmY1IDwtIGZhY3RvcihjKDEsMiwxLDIsTkEpLCBsYWJlbHMgPSBjKCdib3lzJywnZ2lybHMnKSkNCmY1DQpmNiA8LSBmYWN0b3IoYygxLDIsMSwyLE5BKSwgbGFiZWxzID0gYygnYm95cycsJ2dpcmxzJywnbWlzc2luZyBkYXRhJyksIGV4Y2x1ZGUgPSBOVUxMKQ0KZjYNCmBgYA0KDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0K5Y+v6YCJ5Y+C5pWwYG9yZGVyZWRg55So5p2l5oyH5a6a5piv5ZCm5Yib5bu65a6a5bqP5Y+Y6YeP77yM5a6D5o6l5Y+X5LiA5Liq6YC76L6R5YC877yMYFRSVUVg5ZKMYEZBTFNFYOWIhuWIq+WvueW6lOWboOWtkOawtOW5s+aYr+WQpuaYr+acieW6j+eahO+8jOm7mOiupOWPlmBGQUxTRWDliJvlu7rml6Dluo/lm6DlrZDjgIINCg0KYGBge3J9DQpmNyA8LSBmYWN0b3IoYygnYScsJ2InLCdjJyksIG9yZGVyZWQgPSBUKQ0KZjcNCmY4IDwtIGZhY3RvcihjKCdhJywnYicsJ2MnKSwgbGV2ZWxzID0gYygnYycsJ2EnLCdiJyksIG9yZGVyZWQgPSBUKQ0KZjgNCmBgYA0KDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0K5pyA5ZCO77yM5Y+v6YCJ5Y+C5pWwYG5tYXhg5oyH5a6a5pyA5aSn5rC05bmz5pWw77yM5Zyo5pWw5o2u5ZCR6YeP55qE5LiN5ZCM5YC855qE5pWw6YeP6L+H5aSa5pe277yM5Y+v5Lul55So5p2l6IqC55yB5YaF5a2Y44CCDQoNCiMjIyDkvb/nlKhgY3V0KClg5Ye95pWw5Yib5bu65Zug5a2QDQoNCuW9k+aVsOaNruWQkemHj+aYr+aVsOWAvOWQkemHj+aXtu+8jOWPr+S7peS9v+eUqGBjdXQoKWDlh73mlbDlsIbmlbDmja7nmoTojIPlm7TliJLliIbkuLrlpJrkuKrljLrpl7TmnaXliJvlu7rkuIDkuKrlm6DlrZDlkJHph4/vvIzmr4/kuKrljLrpl7Tlr7nlupTkuIDkuKrlm6DlrZDmsLTlubPjgILlhbbln7rmnKzor63ms5XkuLrvvJoNCg0KYGBgICAgICAgICAgDQpjdXQoeCwgYnJlYWtzLCBsYWJlbHMgPSBOVUxMLA0KICAgICAgaW5jbHVkZS5sb3dlc3QgPSBGQUxTRSwgcmlnaHQgPSBUUlVFLCBkaWcubGFiID0gMywNCiAgICBvcmRlcmVkX3Jlc3VsdCA9IEZBTFNFLCAuLi4pDQpgYGANCg0KIyMjIyDlj4LmlbDor7TmmI4NCg0K5Y+C5pWwYHhg55So5LqO5o6l5Y+X5pWw5o2u5ZCR6YeP77ybDQoNCuWPguaVsGBicmVha3Ng55So5LqO5o6l5Y+X5YWo6YOo5Yy66Ze055qE56uv54K55p6E5oiQ55qE6YCS5aKe5pWw5YC85ZCR6YeP77yM5oiW6ICF6KaB5YiS5YiG55qE5Yy66Ze05pWw77yI5aSn5LqO562J5LqOMu+8ie+8mw0KDQrlj4LmlbBgbGFiZWxzYOeahOS9nOeUqOWSjOWcqGBmYWN0b3IoKWDlh73mlbDkuK3nm7jlkIzvvIznlKjkuo7mjIflrprmsLTlubPlkI3np7DvvIzpu5jorqTku6XljLrpl7TkvZzkuLrmsLTlubPlkI3np7DvvJsNCg0K6YC76L6R5YC85Y+C5pWwYHJpZ2h0YOihqOekuuWMuumXtOaYr+W3puW8gOWPs+mXrei/mOaYr+W3pumXreWPs+W8gO+8jOm7mOiupOWPlmBUUlVFYO+8iOW3puW8gOWPs+mXre+8ie+8mw0KDQrlj4LmlbBgcmlnaHRg5Y+WYFRSVUVg5pe277yM6YC76L6R5YC85Y+C5pWwYGluY2x1ZGUubG93ZXN0YOeUqOS6juihqOekuuaYr+WQpuWMheWQq+acgOWwj+WMuumXtOeahOS4i+mZkO+8jOWPguaVsGByaWdodGDlj5ZgRkFMU0Vg5pe277yM6YC76L6R5YC85Y+C5pWwYGluY2x1ZGUuaGlnaGVzdGDnlKjkuo7ooajnpLrmmK/lkKbljIXlkKvmnIDlpKfljLrpl7TnmoTkuIrpmZDvvJsNCg0K6YC76L6R5YC85Y+C5pWwYG9yZGVyZWRfcmVzdWx0YOihqOekuuaYr+WQpuS4uuacieW6j+WboOWtkO+8jOm7mOiupOWPlmBGQUxTRWDjgIINCg0KfCDms6jmhI/vvJoNCnwgMS4g5qC55o2u5Y+C5pWwYHJpZ2h0YOeahOS4jeWQjOiuvue9ru+8jGBjdXQoKWDlh73mlbDliJLliIbnmoTljLrpl7TmmK/lt6blvIDlj7Ppl63miJbmmK/lt6bpl63lj7PlvIDnmoTvvIzmiYDku6Xlj4LmlbBgYnJlYWtzYOaOpeWPl+WMuumXtOeahOerr+eCueaXtu+8jOS4i+mZkOimgeS9juS6juaVsOaNruS4reeahOacgOWwj+WAvO+8jOaIluiAheS4iumZkOimgemrmOS6juaVsOaNruS4reeahOacgOWkp+WAvO+8jOS7peWMheWQq+WFqOmDqOaVsOaNru+8mw0KfCAyLiDlj4LmlbBgYnJlYWtzYOaOpeWPl+WIkuWIhueahOWMuumXtOaVsOaXtu+8jOm7mOiupOS8muWcqOaVsOaNruacgOWwj+WAvOWSjOacgOWkp+WAvOS5i+mXtOi/m+ihjOetieWIhu+8jOW5tuS4lOS8muiHquWKqOWwhuS4i+mZkOiwg+S9juS4gOeCue+8jOS4iumZkOiwg+mrmOS4gOeCue+8jOatpOaXtuWmguaenOS4jeaMh+WumuWPguaVsGBsYWJlbHNg77yM5b6u6LCD55qE5pWw5YC85Lya5L2c5Li65Yy66Ze05LiL6ZmQ5ZKM5LiK6ZmQ5pi+56S65Zyo5Zug5a2Q5rC05bmz6YeM77yM5Y+C5pWwYGRpZy5sYWJg55So5p2l6LCD5pW05rC05bmz5Lit5pi+56S655qE5b6u6LCD57K+5bqm77yM6buY6K6k5YC85Li6M++8jOWQjOaXtuS5n+aYr+acgOWkp+eyvuW6puOAgg0KfCANCg0K5LiL6Z2i5p2l55yL5L6L5a2Q77yaDQoNCmBgYHtyfQ0KYzEgPC0gY3V0KDE6NSwgYygxLDMsNSkpDQpjMQ0KYzIgPC0gY3V0KDE6NSwgYygxLDMsNSksIHJpZ2h0ID0gRikNCmMyDQpjMyA8LSBjdXQoMTo1LCBjKDEsMyw1KSwgaW5jbHVkZS5sb3dlc3QgPSBUKQ0KYzMNCmM0IDwtIGN1dCgxOjUsIDQpDQpjNA0KYzUgPC0gY3V0KDE6NSwgNCwgbGFiZWxzID0gYygnYScsJ2InLCdjJywnZCcpLCBvcmRlcmVkX3Jlc3VsdCA9IFQpDQpjNQ0KYGBgDQoNCiMjIyDkvb/nlKhgZ2woKWDlh73mlbDliJvlu7rlm6DlrZANCg0K5oOz6KaB5LuO6Zu25byA5aeL5b+r6YCf5Zyw5Yib5bu65LiA5Liq5ZCE5rC05bmz6YeN5aSN5qyh5pWw55u45ZCM55qE5Zug5a2Q77yM5Y+v5Lul5L2/55SoYGdsKClg5Ye95pWw44CC5bC9566h5bGA6ZmQ5oCn6L6D5by677yM5L2G5Zyo5rKh5pyJ5pWw5o2u77yM5Y+I6ZyA6KaB5Li05pe25L2/55So5LiA56eN57uT5p6E566A5Y2V55qE5Zug5a2Q5pe277yMYGdsKClg5Ye95pWw5piv5LiA5Liq5LiN6ZSZ55qE6YCJ5oup44CC5YW26K+t5rOV5Li677yaDQoNCmBgYCAgICAgICAgIA0KZ2wobiwgaywgbGVuZ3RoID0gbiprLCBsYWJlbHMgPSBzZXFfbGVuKG4pLCBvcmRlcmVkID0gRkFMU0UpDQpgYGANCg0K5Y+C5pWwYG5g5ZKMYGtg5YiG5Yir5oyH5a6a5LqG5Zug5a2Q55qE5rC05bmz5pWw5ZKM5q+P5Liq5rC05bmz6YeN5aSN55qE5qyh5pWw77yb5Y+C5pWwYGxlbmd0aGDmjIflrprkuoblm6DlrZDlkJHph4/nmoTplb/luqbvvIzpu5jorqTlj5ZgbiprYO+8m+WPguaVsGBsYWJlbHNg5oyH5a6a5LqG5rC05bmz5ZCN56ew77yM6buY6K6k5Li6DQokMVxzaW0gbiQg55qE5q2j5pW05pWw77yb6YC76L6R5YC85Y+C5pWwYG9yZGVyZWRg55So5LqO5oyH5a6a5Zug5a2Q5piv5ZCm5pyJ5bqP44CCDQoNCmBgYHtyfQ0KZ2woMywyLCBsYWJlbHMgPSBjKCdhJywnYicsJ2MnKSwgb3JkZXJlZCA9IFQpDQpgYGANCg0KIyMgYHRpYmJsZWDmlbDmja7moYYNCg0KYHRpYmJsZWDmlbDmja7moYbmmK9gdGliYmxlYOWMheS4reeahOS4gOenjeaVsOaNrue7k+aehO+8jGB0aWJibGVg5YyF5piv546w5Luj5YyWUuaVsOaNruenkeWtpuWMhembhuWQiC0tLS0tLWB0aWR5dmVyc2Vg55qE5qC45b+D5YyF5LmL5LiA44CCYHRpYmJsZWDmlbDmja7moYbmmK/lr7kNClINCmBiYXNlYOWMheiHquW4pueahGBkYXRhLmZyYW1lYOaVsOaNruahhueahOaUuei/m+WSjOeugOWMlu+8jOS9v+WFtuabtOespuWQiOeOsOS7o+aVsOaNruenkeWtpuW3peS9nOiAheeahOaAnee7tOOAgmB0aWJibGVg5pWw5o2u5qGG5ZCM5pe25YW35pyJ5LiJ56eN57G75bGe5oCn77yaYHRibF9kZmDvvIxgdGJsYOWSjGBkYXRhLmZyYW1lYOOAgg0KDQojIyMgYHRpYmJsZWDmlbDmja7moYbnmoTliJvlu7oNCg0KYHRpYmJsZWDmlbDmja7moYbnmoTliJvlu7rkvb/nlKhgdGliYmxlKClg5Ye95pWw77yM5YW25Z+65pys6K+t5rOV5aaC5LiL77yaDQoNCmBgYCAgICAgICAgIA0KdGliYmxlKA0KICAuLi4sDQogIC5yb3dzID0gTlVMTCwNCiAgLm5hbWVfcmVwYWlyID0gYygiY2hlY2tfdW5pcXVlIiwgInVuaXF1ZSIsICJ1bml2ZXJzYWwiLCAibWluaW1hbCIpDQopDQpgYGANCg0K5LiOYGRhdGEuZnJhbWUoKWDlh73mlbDkuI3lkIzvvIxgdGliYmxlKClg5Ye95pWw55qE5pWw5o2u6L6T5YWl5Y+q5o6l5Y+XYHRhZyA9IHZhbHVlYOeahOW9ouW8j++8jOWNs+S9v+ayoeacieaMh+WummB0YWdg77yMYHRpYmJsZSgpYOWHveaVsOS5n+S8muiupOS4uuaYr2B0YWdg57y65aSx6ICM6Ieq5Yqo5aGr5YWF5LiA5LiqYHRhZ2DvvIzogIzkuI3kvJrorqTkuLrlj6rkvKDpgJLkuobkuIDkuKrlr7nosaHkvZzkuLpgdmFsdWVg44CCDQoNCiMjIyDkuI5gZGF0YS5mcmFtZWDmlbDmja7moYbnmoTljLrliKsNCg0KYHRpYmJsZWDmlbDmja7moYbkuI5gZGF0YS5mcmFtZWDmlbDmja7moYbnmoTkuIDkupvljLrliKvlpoLkuIvvvJoNCg0KLSAgIGB0aWJibGVg5pWw5o2u5qGG55qE5omT5Y2w5qC85byP5pu057Sn5YeR77yM5pWw5o2u6ZuG6L6D5aSn5pe25L6/5LqO5bGV56S6DQoNCi0gICBgdGliYmxlYOaVsOaNruahhuS4jeiDveaKiuWtl+espuWei+WPmOmHj+iHquWKqOi9rOaNouS4uuWboOWtkO+8jOiAjGBkYXRhLmZyYW1lYOaVsOaNruahhuWPr+S7peagueaNrumcgOimgeS9v+eUqOmAu+i+keWAvOWPguaVsGBzdHJpbmdzQXNGYWN0b3JzYOadpeaMh+Wumu+8jOm7mOiupOWPlmBGQUxTRWDvvIhSDQogICAgNC4wLjAg55qE5pS55Yqo77yJDQoNCi0gICDlvZPlj5jph4/lkI3kuI3nrKblkIggUg0KICAgIOWPmOmHj+WRveWQjeinhOWIme+8iOavlOWmguWQq+acieepuuagvO+8ieaXtu+8jGBkYXRhLmZyYW1lYOaVsOaNruahhuS8muiHquWKqOi/m+ihjOS/rumlsOS9v+S5i+espuWQiOWRveWQjeinhOWIme+8iOavlOWmguWwhuepuuagvOabv+aNouaIkOeCue+8ie+8jOiAjGB0aWJibGVg5pWw5o2u5qGG5Lya5L+d55WZ5Y6f5Y+Y6YeP5ZCN77yM5bm25LiU5pSv5oyB5L2/55So5Y+N5byV5Y+35p2l5oyH5a6a5LiN56ym5ZCI5Y+Y6YeP5ZG95ZCN6KeE5YiZ55qE5Y+Y6YeP5ZCNDQoNCmBgYHtyfQ0KbmFtZXMoZGF0YS5mcmFtZShgY3JhenkgbmFtZWAgPSAxKSkNCm5hbWVzKHRpYmJsZShgY3JhenkgbmFtZWAgPSAxKSkNCmBgYA0KDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KLSAgIGB0aWJibGVg5pWw5o2u5qGG5rKh5pyJ6KGM5ZCN5bGe5oCn77yM5Lmf5LiN5pSv5oyB57uZ6KGM5ZG95ZCNDQoNCi0gICBgdGliYmxlYOaVsOaNruahhuS9v+eUqOS4i+agh+e0ouW8le+8jOi/lOWbnue7k+aenOeahOexu+Wei+S7jeeEtuaYr2B0aWJibGVg5pWw5o2u5qGG77yM5Y2z5L2/57Si5byV5Yiw5Y2V5Liq5YWD57Sg5Lmf5LiN5L6L5aSWDQoNCi0gICBgdGliYmxlYOaVsOaNruahhueahOWIl+aYr+aMiemhuuW6j+aDsOaAp+eUn+aIkOeahO+8jOWboOatpOWcqOWIm+W7uuWQjumdoueahOWIl+aXtuWPr+S7peW8leeUqOWJjemdoueahOWIlw0KDQrmg7Pkuobop6Pmm7TlpJpgdGliYmxlYOaVsOaNruahhueahOeJueaAp++8jOWPr+S7peS9v+eUqGB2aWduZXR0ZSgidGliYmxlIilg5Y+v5Lul5p+l55yLYHRpYmJsZWDljIXoh6rluKbnmoTnroDku4vmlofmoaPjgIINCg==