版权声明:本套课程材料开源,使用和分享必须遵守「创作共用许可协议 CC BY-NC-SA」(来源引用-非商业用途使用-以相同方式共享)。


Chap12:主题配色

本章要点目录

## 本章所需R包
library(bruceR)
# library(ggplot2)  # 加载bruceR时已默认加载ggplot2

配色方案设置

主要认识两套经典调色板:Brewer和Viridis。

【实践1】配色方案设置

  • Brewer调色板(https://colorbrewer2.org/
    • 分类色(Qualitative palettes)—— 适用于离散/分类/因子型变量
      • Accent, Dark2, Paired, Pastel1, Pastel2, Set1 (常用), Set2, Set3
    • 对比色(Diverging palettes)—— 适用于连续/数值型变量
      • BrBG, PiYG, PRGn, PuOr, RdBu (常用), RdGy, RdYlBu, RdYlGn, Spectral
    • 渐变色(Sequential palettes)—— 适用于连续/数值型变量
      • Blues, BuGn, BuPu, GnBu, Greens, Greys, Oranges, OrRd, PuBu, PuBuGn, PuRd, Purples, RdPu, Reds, YlGn, YlGnBu, YlOrBr, YlOrRd

## ggplot基础图形对象设定(赋值给p,避免重复写代码)
p = ggplot(
  data = na.omit(airquality),
  mapping = aes(x=Solar.R, y=Ozone, color=(Temp-32)/1.8)
)
p = p +
  geom_point() +
  labs(x="Solar Radiation",
       y="Ozone Pollution",
       color="Temp.")
p  # 默认配色

p + scale_color_continuous(palette="Reds")

p + scale_color_continuous(palette="YlOrRd")

p + scale_color_continuous(palette="RdYlBu")

## distiller:蒸馏器(离散颜色 => 连续颜色)
p + scale_color_distiller(palette="Set1", direction=-1)

p + scale_color_distiller(palette="RdYlBu", direction=-1)

## fermenter:发酵器(连续颜色 => 离散颜色)
p + scale_color_fermenter(palette="RdYlBu", direction=-1)

p + scale_color_fermenter(palette = "RdYlBu",
                          direction = -1,
                          limits = c(10, 40),
                          breaks = seq(10, 40, 3))

  • Viridis调色板
    • "magma" (or "A")
    • "inferno" (or "B")
    • "plasma" (or "C")
    • "viridis" (or "D")
    • "cividis" (or "E")
    • "rocket" (or "F")
    • "mako" (or "G")
    • "turbo" (or "H")

p + scale_color_viridis_c(option="magma")  # "A"

p + scale_color_viridis_b(option="magma")  # "A"

p + scale_color_viridis_c(option="inferno")  # "B"

p + scale_color_viridis_b(option="inferno")  # "B"

p + scale_color_viridis_c(option="plasma")  # "C"

p + scale_color_viridis_b(option="plasma")  # "C"

p + scale_color_viridis_c(option="viridis")  # "D"

p + scale_color_viridis_b(option="viridis")  # "D"

p + scale_color_viridis_c(option="cividis")  # "E"

p + scale_color_viridis_b(option="cividis")  # "E"

p + scale_color_viridis_c(option="rocket")  # "F"

p + scale_color_viridis_b(option="rocket")  # "F"

p + scale_color_viridis_c(option="mako")  # "G"

p + scale_color_viridis_b(option="mako")  # "G"

p + scale_color_viridis_c(option="turbo")  # "H"

p + scale_color_viridis_b(option="turbo")  # "H"

主题元素设置

【实践2】主题元素设置

(1)theme()主题元素设置函数(自学theme()函数帮助文档

  • theme()函数共144个参数!(以下列出了常用参数)
    • 整张图(plot.*
      • 背景:plot.background
      • 主标题:plot.title, plot.title.position
      • 副标题:plot.subtitle
      • 说明文字:plot.caption, plot.caption.position
      • 序号标签:plot.tag, plot.tag.position
      • 边距:plot.margin
    • 绘图区(panel.*
      • 背景:panel.background
      • 网格线:panel.grid
      • 主刻度网格线:panel.grid.major
      • 副刻度网格线:panel.grid.minor
    • 坐标轴(axis.*
      • 轴线:axis.line
      • 轴标题:axis.title
      • 刻度值:axis.text
      • 刻度线:axis.ticks
    • 图例区(legend.*
      • 背景:legend.background
      • 位置:legend.position, legend.position.inside
      • 方向:legend.direction
      • 图例标题:legend.title
      • 图例刻度值:legend.text
      • 图例刻度线:legend.ticks
  • 分面图(strip.*
    • 背景:strip.background
    • 文字:strip.text

(2)element_*()元素属性设置函数(自学element_*()系列函数帮助文档

  • element_blank():设置为空(移除该元素)
  • element_rect():设置矩形元素(边框与底色)
  • element_line():设置线条元素
  • element_text():设置文本元素
p1 = p + scale_color_continuous(palette="YlOrRd")
p1  # 默认主题:theme_grey()

## 预定义的theme主题方案
p1 + theme_void()  # 空无主题

p1 + theme_bw()  # 黑白主题

p1 + theme_dark()  # 深色主题

p1 + theme_light()  # 浅色主题

p1 + theme_linedraw()  # 线条主题

p1 + theme_minimal()  # 极简主题

p1 + theme_classic()  # 经典主题

p1 + cowplot::theme_cowplot()  # cowplot主题

p1 + cowplot::theme_nothing()  # cowplot完全空无主题

p1 + theme_bruce()  # bruceR主题

复习与答疑

课程期末总复习

个性化答疑辅导

  • 对提问/作业/报告/操作的个性化反馈与指导

【期末作业】数据分析与可视化

作业要求:

  • 自主选择任意一个感兴趣的公开数据,综合运用本课程所学内容,迭代积累完成一项完整的R语言数据分析与可视化编程期末作业
    • 随堂作业1~10、个人阶段作业①②是期末大作业的基础和拆分任务,请在这些平时作业基础上,进一步修改完善R代码、文字注释和文档结构,即可作为期末大作业提交!
  • 使用R Markdown完成,对关键代码及结果要有注释说明

平台提交:

  • R Markdown原始代码文件(.Rmd)和运行得到的HTML网页文件(.html)
    • 提交文件命名格式
      • 学号-姓名-R期末作业.Rmd
      • 学号-姓名-R期末作业.html

返回课程主页

© 包寒吴霜

LS0tDQp0aXRsZTogIuOAilLor63oqIDjgIvnrKwxMueroO+8muS4u+mimOmFjeiJsiINCnN1YnRpdGxlOiA8YSBocmVmPSJodHRwczovL3BzeWNoYnJ1Y2UuZ2l0aHViLmlvL1JDb3Vyc2UvIj7ov5Tlm57or77nqIvkuLvpobU8L2E+DQphdXRob3I6ICLmjojor77mlZnluIjvvJrljIXlr5LlkLTpnJwiDQojIGRhdGU6ICJgciBTeXMuRGF0ZSgpYCINCm91dHB1dDoNCiAgaHRtbF9kb2N1bWVudDoNCiAgICB0b2M6IHRydWUNCiAgICB0b2NfZGVwdGg6IDMNCiAgICB0b2NfZmxvYXQ6DQogICAgICBjb2xsYXBzZWQ6IGZhbHNlDQogICAgY29kZV9kb3dubG9hZDogdHJ1ZQ0KICAgIGFuY2hvcl9zZWN0aW9uczogdHJ1ZQ0KICAgIGhpZ2hsaWdodDogcHlnbWVudHMNCiAgICBjc3M6IFJtZENTUy5jc3MNCi0tLQ0KDQpgYGB7PWh0bWx9DQo8cCBzdHlsZT0iZm9udC1zaXplOiAxMnB4Ij7niYjmnYPlo7DmmI7vvJrmnKzlpZfor77nqIvmnZDmlpnlvIDmupDvvIzkvb/nlKjlkozliIbkuqvlv4XpobvpgbXlrojjgIzliJvkvZzlhbHnlKjorrjlj6/ljY/orq4gQ0MgQlktTkMtU0HjgI3vvIjmnaXmupDlvJXnlKgt6Z2e5ZWG5Lia55So6YCU5L2/55SoLeS7peebuOWQjOaWueW8j+WFseS6q++8ieOAgjxpbWcgc3JjPSJpbWcvQ0MtQlktTkMtU0EuanBnIiB3aWR0aD0iMTIwcHgiIGhlaWdodD0iNDJweCIgc3R5bGU9ImZsb2F0OiByaWdodCIgLz48L3A+DQpgYGANCg0KYGBge3IgQ29uZmlnLCBpbmNsdWRlPUZBTFNFfQ0Kb3B0aW9ucygNCiAga25pdHIua2FibGUuTkEgPSAiIiwNCiAgZGlnaXRzID0gNA0KKQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KA0KICBjb21tZW50ID0gIiIsDQogIGZpZy53aWR0aCA9IDYsDQogIGZpZy5oZWlnaHQgPSA0LA0KICBkcGkgPSAzMDANCikNCmBgYA0KDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KIyBDaGFwMTLvvJrkuLvpopjphY3oibINCg0KIyMjIyDlvoDmnJ/opoHngrnlm57pob4NCg0KLSBbQ2hhcDExIFwjIOWIhumdouWwj+Wbvl0oaHR0cHM6Ly9wc3ljaGJydWNlLmdpdGh1Yi5pby9SQ291cnNlL0NoYXAxMSMlRTUlODglODYlRTklOUQlQTIlRTUlQjAlOEYlRTUlOUIlQkUpey51cml9DQotIFtDaGFwMTEgXCMg5aSa5Zu+57uE5ZCIXShodHRwczovL3BzeWNoYnJ1Y2UuZ2l0aHViLmlvL1JDb3Vyc2UvQ2hhcDExIyVFNSVBNCU5QSVFNSU5QiVCRSVFNyVCQiU4NCVFNSU5MCU4OCl7LnVyaX0NCi0gW0NoYXAxMSBcIyDlm77lvaLmlofku7bkv53lrZhdKGh0dHBzOi8vcHN5Y2hicnVjZS5naXRodWIuaW8vUkNvdXJzZS9DaGFwMTEjJUU1JTlCJUJFJUU1JUJEJUEyJUU2JTk2JTg3JUU0JUJCJUI2JUU0JUJGJTlEJUU1JUFEJTk4KXsudXJpfQ0KDQojIyMjIOacrOeroOimgeeCueebruW9lQ0KDQotIFvjgJDlrp7ot7Ux44CR6YWN6Imy5pa55qGI6K6+572uXSgj5a6e6Le1MemFjeiJsuaWueahiOiuvue9rinvvIjph43ngrnvvIkNCi0gW+OAkOWunui3tTLjgJHkuLvpopjlhYPntKDorr7nva5dKCPlrp7ot7Uy5Li76aKY5YWD57Sg6K6+572uKQ0KDQpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCiMjIOacrOeroOaJgOmcgFLljIUNCmxpYnJhcnkoYnJ1Y2VSKQ0KIyBsaWJyYXJ5KGdncGxvdDIpICAjIOWKoOi9vWJydWNlUuaXtuW3sum7mOiupOWKoOi9vWdncGxvdDINCmBgYA0KDQojIOmFjeiJsuaWueahiOiuvue9rg0KDQrkuLvopoHorqTor4bkuKTlpZfnu4/lhbjosIPoibLmnb/vvJpCcmV3ZXLlkoxWaXJpZGlz44CCDQoNCiMjIyMg44CQ5a6e6Le1MeOAkemFjeiJsuaWueahiOiuvue9riB7I+Wunui3tTHphY3oibLmlrnmoYjorr7nva59DQoNCi0gQnJld2Vy6LCD6Imy5p2/77yIPGh0dHBzOi8vY29sb3JicmV3ZXIyLm9yZy8+77yJDQogIC0g5YiG57G76Imy77yIUXVhbGl0YXRpdmUgcGFsZXR0ZXPvvInigJTigJQg6YCC55So5LqO56a75pWjL+WIhuexuy/lm6DlrZDlnovlj5jph48NCiAgICAtIEFjY2VudCwgRGFyazIsIFBhaXJlZCwgUGFzdGVsMSwgUGFzdGVsMiwgKipTZXQxICjluLjnlKgpKiosIFNldDIsIFNldDMNCiAgLSDlr7nmr5ToibLvvIhEaXZlcmdpbmcgcGFsZXR0ZXPvvInigJTigJQg6YCC55So5LqO6L+e57utL+aVsOWAvOWei+WPmOmHjw0KICAgIC0gQnJCRywgUGlZRywgUFJHbiwgUHVPciwgKipSZEJ1ICjluLjnlKgpKiosIFJkR3ksIFJkWWxCdSwgUmRZbEduLCBTcGVjdHJhbA0KICAtIOa4kOWPmOiJsu+8iFNlcXVlbnRpYWwgcGFsZXR0ZXPvvInigJTigJQg6YCC55So5LqO6L+e57utL+aVsOWAvOWei+WPmOmHjw0KICAgIC0gQmx1ZXMsIEJ1R24sIEJ1UHUsIEduQnUsIEdyZWVucywgR3JleXMsIE9yYW5nZXMsIE9yUmQsIFB1QnUsIFB1QnVHbiwgUHVSZCwgUHVycGxlcywgUmRQdSwgUmVkcywgWWxHbiwgWWxHbkJ1LCBZbE9yQnIsIFlsT3JSZA0KDQohW10oaW1hZ2VzL2NsaXBib2FyZC0xMTQ4OTQ1NzE4LnBuZykNCg0KIVtdKGltYWdlcy9jbGlwYm9hcmQtMzEzODA1ODczNy5wbmcpDQoNCiFbXShpbWFnZXMvY2xpcGJvYXJkLTI2ODcxNDUzOTQucG5nKQ0KDQohW10oaW1hZ2VzL2NsaXBib2FyZC0zNTk1MTIxNTEwLnBuZykNCg0KYGBge3J9DQojIyBnZ3Bsb3Tln7rnoYDlm77lvaLlr7nosaHorr7lrprvvIjotYvlgLznu5lw77yM6YG/5YWN6YeN5aSN5YaZ5Luj56CB77yJDQpwID0gZ2dwbG90KA0KICBkYXRhID0gbmEub21pdChhaXJxdWFsaXR5KSwNCiAgbWFwcGluZyA9IGFlcyh4PVNvbGFyLlIsIHk9T3pvbmUsIGNvbG9yPShUZW1wLTMyKS8xLjgpDQopDQpwID0gcCArDQogIGdlb21fcG9pbnQoKSArDQogIGxhYnMoeD0iU29sYXIgUmFkaWF0aW9uIiwNCiAgICAgICB5PSJPem9uZSBQb2xsdXRpb24iLA0KICAgICAgIGNvbG9yPSJUZW1wLiIpDQpwICAjIOm7mOiupOmFjeiJsg0KDQpwICsgc2NhbGVfY29sb3JfY29udGludW91cyhwYWxldHRlPSJSZWRzIikNCnAgKyBzY2FsZV9jb2xvcl9jb250aW51b3VzKHBhbGV0dGU9IllsT3JSZCIpDQpwICsgc2NhbGVfY29sb3JfY29udGludW91cyhwYWxldHRlPSJSZFlsQnUiKQ0KDQojIyBkaXN0aWxsZXLvvJrokrjppo/lmajvvIjnprvmlaPpopzoibIgPT4g6L+e57ut6aKc6Imy77yJDQpwICsgc2NhbGVfY29sb3JfZGlzdGlsbGVyKHBhbGV0dGU9IlNldDEiLCBkaXJlY3Rpb249LTEpDQpwICsgc2NhbGVfY29sb3JfZGlzdGlsbGVyKHBhbGV0dGU9IlJkWWxCdSIsIGRpcmVjdGlvbj0tMSkNCg0KIyMgZmVybWVudGVy77ya5Y+R6YW15Zmo77yI6L+e57ut6aKc6ImyID0+IOemu+aVo+minOiJsu+8iQ0KcCArIHNjYWxlX2NvbG9yX2Zlcm1lbnRlcihwYWxldHRlPSJSZFlsQnUiLCBkaXJlY3Rpb249LTEpDQpwICsgc2NhbGVfY29sb3JfZmVybWVudGVyKHBhbGV0dGUgPSAiUmRZbEJ1IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uID0gLTEsDQogICAgICAgICAgICAgICAgICAgICAgICAgIGxpbWl0cyA9IGMoMTAsIDQwKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtzID0gc2VxKDEwLCA0MCwgMykpDQpgYGANCg0KLSBWaXJpZGlz6LCD6Imy5p2/DQogIC0gYCJtYWdtYSJgIChvciBgIkEiYCkNCiAgLSBgImluZmVybm8iYCAob3IgYCJCImApDQogIC0gYCJwbGFzbWEiYCAob3IgYCJDImApDQogIC0gYCJ2aXJpZGlzImAgKG9yIGAiRCJgKQ0KICAtIGAiY2l2aWRpcyJgIChvciBgIkUiYCkNCiAgLSBgInJvY2tldCJgIChvciBgIkYiYCkNCiAgLSBgIm1ha28iYCAob3IgYCJHImApDQogIC0gYCJ0dXJibyJgIChvciBgIkgiYCkNCg0KIVtdKGltYWdlcy9jbGlwYm9hcmQtMzAzNTg3MTc5OC5wbmcpDQoNCiFbXShpbWFnZXMvY2xpcGJvYXJkLTEyNTc1NDY4MjkucG5nKQ0KDQpgYGB7cn0NCnAgKyBzY2FsZV9jb2xvcl92aXJpZGlzX2Mob3B0aW9uPSJtYWdtYSIpICAjICJBIg0KcCArIHNjYWxlX2NvbG9yX3ZpcmlkaXNfYihvcHRpb249Im1hZ21hIikgICMgIkEiDQoNCnAgKyBzY2FsZV9jb2xvcl92aXJpZGlzX2Mob3B0aW9uPSJpbmZlcm5vIikgICMgIkIiDQpwICsgc2NhbGVfY29sb3JfdmlyaWRpc19iKG9wdGlvbj0iaW5mZXJubyIpICAjICJCIg0KDQpwICsgc2NhbGVfY29sb3JfdmlyaWRpc19jKG9wdGlvbj0icGxhc21hIikgICMgIkMiDQpwICsgc2NhbGVfY29sb3JfdmlyaWRpc19iKG9wdGlvbj0icGxhc21hIikgICMgIkMiDQoNCnAgKyBzY2FsZV9jb2xvcl92aXJpZGlzX2Mob3B0aW9uPSJ2aXJpZGlzIikgICMgIkQiDQpwICsgc2NhbGVfY29sb3JfdmlyaWRpc19iKG9wdGlvbj0idmlyaWRpcyIpICAjICJEIg0KDQpwICsgc2NhbGVfY29sb3JfdmlyaWRpc19jKG9wdGlvbj0iY2l2aWRpcyIpICAjICJFIg0KcCArIHNjYWxlX2NvbG9yX3ZpcmlkaXNfYihvcHRpb249ImNpdmlkaXMiKSAgIyAiRSINCg0KcCArIHNjYWxlX2NvbG9yX3ZpcmlkaXNfYyhvcHRpb249InJvY2tldCIpICAjICJGIg0KcCArIHNjYWxlX2NvbG9yX3ZpcmlkaXNfYihvcHRpb249InJvY2tldCIpICAjICJGIg0KDQpwICsgc2NhbGVfY29sb3JfdmlyaWRpc19jKG9wdGlvbj0ibWFrbyIpICAjICJHIg0KcCArIHNjYWxlX2NvbG9yX3ZpcmlkaXNfYihvcHRpb249Im1ha28iKSAgIyAiRyINCg0KcCArIHNjYWxlX2NvbG9yX3ZpcmlkaXNfYyhvcHRpb249InR1cmJvIikgICMgIkgiDQpwICsgc2NhbGVfY29sb3JfdmlyaWRpc19iKG9wdGlvbj0idHVyYm8iKSAgIyAiSCINCmBgYA0KDQojIOS4u+mimOWFg+e0oOiuvue9rg0KDQojIyMjIOOAkOWunui3tTLjgJHkuLvpopjlhYPntKDorr7nva4geyPlrp7ot7Uy5Li76aKY5YWD57Sg6K6+572ufQ0KDQrvvIgx77yJYHRoZW1lKClg5Li76aKY5YWD57Sg6K6+572u5Ye95pWw77yIW+iHquWtpmB0aGVtZSgpYOWHveaVsOW4ruWKqeaWh+aho10oaHR0cHM6Ly9nZ3Bsb3QyLnRpZHl2ZXJzZS5vcmcvcmVmZXJlbmNlL3RoZW1lLmh0bWwpey51cml977yJDQoNCi0gYHRoZW1lKClg5Ye95pWw5YWxMTQ05Liq5Y+C5pWw77yB77yI5Lul5LiL5YiX5Ye65LqG5bi455So5Y+C5pWw77yJDQogIC0g5pW05byg5Zu+77yIYHBsb3QuKmDvvIkNCiAgICAtIOiDjOaZr++8mmBwbG90LmJhY2tncm91bmRgDQogICAgLSDkuLvmoIfpopjvvJpgcGxvdC50aXRsZWAsIGBwbG90LnRpdGxlLnBvc2l0aW9uYA0KICAgIC0g5Ymv5qCH6aKY77yaYHBsb3Quc3VidGl0bGVgDQogICAgLSDor7TmmI7mloflrZfvvJpgcGxvdC5jYXB0aW9uYCwgYHBsb3QuY2FwdGlvbi5wb3NpdGlvbmANCiAgICAtIOW6j+WPt+agh+etvu+8mmBwbG90LnRhZ2AsIGBwbG90LnRhZy5wb3NpdGlvbmANCiAgICAtIOi+uei3ne+8mmBwbG90Lm1hcmdpbmANCiAgLSDnu5jlm77ljLrvvIhgcGFuZWwuKmDvvIkNCiAgICAtIOiDjOaZr++8mmBwYW5lbC5iYWNrZ3JvdW5kYA0KICAgIC0g572R5qC857q/77yaYHBhbmVsLmdyaWRgDQogICAgLSDkuLvliLvluqbnvZHmoLznur/vvJpgcGFuZWwuZ3JpZC5tYWpvcmANCiAgICAtIOWJr+WIu+W6pue9keagvOe6v++8mmBwYW5lbC5ncmlkLm1pbm9yYA0KICAtIOWdkOagh+i9tO+8iGBheGlzLipg77yJDQogICAgLSDovbTnur/vvJpgYXhpcy5saW5lYA0KICAgIC0g6L205qCH6aKY77yaYGF4aXMudGl0bGVgDQogICAgLSDliLvluqblgLzvvJpgYXhpcy50ZXh0YA0KICAgIC0g5Yi75bqm57q/77yaYGF4aXMudGlja3NgDQogIC0g5Zu+5L6L5Yy677yIYGxlZ2VuZC4qYO+8iQ0KICAgIC0g6IOM5pmv77yaYGxlZ2VuZC5iYWNrZ3JvdW5kYA0KICAgIC0g5L2N572u77yaYGxlZ2VuZC5wb3NpdGlvbmAsIGBsZWdlbmQucG9zaXRpb24uaW5zaWRlYA0KICAgIC0g5pa55ZCR77yaYGxlZ2VuZC5kaXJlY3Rpb25gDQogICAgLSDlm77kvovmoIfpopjvvJpgbGVnZW5kLnRpdGxlYA0KICAgIC0g5Zu+5L6L5Yi75bqm5YC877yaYGxlZ2VuZC50ZXh0YA0KICAgIC0g5Zu+5L6L5Yi75bqm57q/77yaYGxlZ2VuZC50aWNrc2ANCi0g5YiG6Z2i5Zu+77yIYHN0cmlwLipg77yJDQogIC0g6IOM5pmv77yaYHN0cmlwLmJhY2tncm91bmRgDQogIC0g5paH5a2X77yaYHN0cmlwLnRleHRgDQoNCu+8iDLvvIlgZWxlbWVudF8qKClg5YWD57Sg5bGe5oCn6K6+572u5Ye95pWw77yIW+iHquWtpmBlbGVtZW50XyooKWDns7vliJflh73mlbDluK7liqnmlofmoaNdKGh0dHBzOi8vZ2dwbG90Mi50aWR5dmVyc2Uub3JnL3JlZmVyZW5jZS9lbGVtZW50Lmh0bWwpey51cml977yJDQoNCi0gYGVsZW1lbnRfYmxhbmsoKWDvvJrorr7nva7kuLrnqbrvvIjnp7vpmaTor6XlhYPntKDvvIkNCi0gYGVsZW1lbnRfcmVjdCgpYO+8muiuvue9ruefqeW9ouWFg+e0oO+8iOi+ueahhuS4juW6leiJsu+8iQ0KLSBgZWxlbWVudF9saW5lKClg77ya6K6+572u57q/5p2h5YWD57SgDQotIGBlbGVtZW50X3RleHQoKWDvvJrorr7nva7mlofmnKzlhYPntKANCg0KYGBge3J9DQpwMSA9IHAgKyBzY2FsZV9jb2xvcl9jb250aW51b3VzKHBhbGV0dGU9IllsT3JSZCIpDQpwMSAgIyDpu5jorqTkuLvpopjvvJp0aGVtZV9ncmV5KCkNCg0KIyMg6aKE5a6a5LmJ55qEdGhlbWXkuLvpopjmlrnmoYgNCnAxICsgdGhlbWVfdm9pZCgpICAjIOepuuaXoOS4u+mimA0KcDEgKyB0aGVtZV9idygpICAjIOm7keeZveS4u+mimA0KcDEgKyB0aGVtZV9kYXJrKCkgICMg5rex6Imy5Li76aKYDQpwMSArIHRoZW1lX2xpZ2h0KCkgICMg5rWF6Imy5Li76aKYDQpwMSArIHRoZW1lX2xpbmVkcmF3KCkgICMg57q/5p2h5Li76aKYDQpwMSArIHRoZW1lX21pbmltYWwoKSAgIyDmnoHnroDkuLvpopgNCnAxICsgdGhlbWVfY2xhc3NpYygpICAjIOe7j+WFuOS4u+mimA0KcDEgKyBjb3dwbG90Ojp0aGVtZV9jb3dwbG90KCkgICMgY293cGxvdOS4u+mimA0KcDEgKyBjb3dwbG90Ojp0aGVtZV9ub3RoaW5nKCkgICMgY293cGxvdOWujOWFqOepuuaXoOS4u+mimA0KcDEgKyB0aGVtZV9icnVjZSgpICAjIGJydWNlUuS4u+mimA0KYGBgDQoNCiMg5aSN5Lmg5LiO562U55aRDQoNCiMjIOivvueoi+acn+acq+aAu+WkjeS5oA0KDQotIFvor77nqIvlpKfnurLkuI7lrabkuaDnm67moIflm57pob5dKGh0dHBzOi8vcHN5Y2hicnVjZS5naXRodWIuaW8vUkNvdXJzZS9TeWxsYWJ1c19SLVByb2dyYW1taW5nX0Jhb0hXUy5wZGYpDQoNCiMjIOS4quaAp+WMluetlOeWkei+heWvvA0KDQotIOWvueaPkOmXri/kvZzkuJov5oql5ZGKL+aTjeS9nOeahOS4quaAp+WMluWPjemmiOS4juaMh+WvvA0KDQojIOOAkOacn+acq+S9nOS4muOAkeaVsOaNruWIhuaekOS4juWPr+inhuWMlg0KDQrkvZzkuJropoHmsYLvvJoNCg0KLSDoh6rkuLvpgInmi6nku7vmhI/kuIDkuKrmhJ/lhbTotqPnmoTlhazlvIDmlbDmja7vvIznu7zlkIjov5DnlKjmnKzor77nqIvmiYDlrablhoXlrrnvvIzov63ku6Pnp6/ntK/lrozmiJDkuIDpobnlrozmlbTnmoRS6K+t6KiA5pWw5o2u5YiG5p6Q5LiO5Y+v6KeG5YyW57yW56iL5pyf5pyr5L2c5LiaDQogIC0gKirpmo/loILkvZzkuJoxXH4xMOOAgeS4quS6uumYtuauteS9nOS4muKRoOKRoeaYr+acn+acq+Wkp+S9nOS4mueahOWfuuehgOWSjOaLhuWIhuS7u+WKoSoq77yM6K+35Zyo6L+Z5Lqb5bmz5pe25L2c5Lia5Z+656GA5LiK77yM6L+b5LiA5q2l5L+u5pS55a6M5ZaEUuS7o+eggeOAgeaWh+Wtl+azqOmHiuWSjOaWh+aho+e7k+aehO+8jOWNs+WPr+S9nOS4uuacn+acq+Wkp+S9nOS4muaPkOS6pO+8gQ0KLSDkvb/nlKhSIE1hcmtkb3du5a6M5oiQ77yM5a+55YWz6ZSu5Luj56CB5Y+K57uT5p6c6KaB5pyJ5rOo6YeK6K+05piODQoNCuW5s+WPsOaPkOS6pO+8mg0KDQotIFIgTWFya2Rvd27ljp/lp4vku6PnoIHmlofku7bvvIguUm1k77yJ5ZKM6L+Q6KGM5b6X5Yiw55qESFRNTOe9kemhteaWh+S7tu+8iC5odG1s77yJDQogIC0g5o+Q5Lqk5paH5Lu25ZG95ZCN5qC85byPDQogICAgLSBg5a2m5Y+3LeWnk+WQjS1S5pyf5pyr5L2c5LiaLlJtZGANCiAgICAtIGDlrablj7ct5aeT5ZCNLVLmnJ/mnKvkvZzkuJouaHRtbGANCg0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNClvov5Tlm57or77nqIvkuLvpobVdKGh0dHBzOi8vcHN5Y2hicnVjZS5naXRodWIuaW8vUkNvdXJzZS8pDQoNCsKpIOWMheWvkuWQtOmcnA0K