演習

以下の指標の中から、二つを選択して、データの概要(description)を記録し、データを WDI で取得し、以下の分析をする。

  1. 各年毎のデータの数の棒グラフ
  2. 国または地域を選択
  3. それぞれの経年変化を表す折れ線グラフ
    1. 日本
    2. 選択した国または地域
  4. 二つのデータの散布図-必要に応じて log10 スケールを用いる
    1. すべての値の散布図
    2. NA ではない値の散布図、近似(回帰)直線を表示
    3. 地域を除き国のみの散布図、近似(回帰)直線を表示
    4. 最近の年を選択し、地域を除き国のもの散布図、近似(回帰)直線を表示

それぞれについて考察(気づいたこと、疑問など)を記す

注:以下においては、地域はすべて BRICS とし、4 項目目は、d のみを示し、相関係数の表示も省略。また、データは、一括で読み込む。

環境(Environment)について

概要(Abstract)

以下においては、世界銀行の、世界開発指標(World Development Indicators)の、五つの指標、すなわち、一人当たりのCO2排出量(単位:トン)、森林面積(陸地面積に占める割合)、および、総発電量に占める、再生可能エネルギー発電量、化石燃料(石油、ガス、石炭)による発電量、原子力による発電量から、二つずつ指標を選択し、それらの関係について考察する。

データについて

  • CO2 emissions (metric tons per capita) :EN.ATM.CO2E.PC [Link] (co2pcap)

    • Carbon dioxide emissions are those stemming from the burning of fossil fuels and the manufacture of cement. They include carbon dioxide produced during consumption of solid, liquid, and gas fuels and gas flaring.

    • 一人当たりのCO2排出量(単位:トン):二酸化炭素排出量は、化石燃料の燃焼とセメントの製造に由来するものである。固形燃料、液体燃料、ガス燃料の消費時に発生する二酸化炭素や、ガスのフレアリングも含まれる。

  • Forest area (% of land area):AG.LND.FRST.ZS [Link] (forest)

    • Forest area is land under natural or planted stands of trees of at least 5 meters in situ, whether productive or not, and excludes tree stands in agricultural production systems (for example, in fruit plantations and agroforestry systems) and trees in urban parks and gardens.

    • 森林面積(陸地面積に占める割合):森林面積とは、生産的か否かを問わず、原位置で5m以上の樹木の天然林または人工林の下にある土地であり、農業生産システム(例えば、果樹園やアグロフォレストリーシステム)における樹木の立木や、都市の公園や庭園の樹木を除く。

  • Renewable electricity output (% of total electricity output):EG.ELC.RNEW.ZS [Link] (renewable)

    • Renewable electricity is the share of electrity generated by renewable power plants in total electricity generated by all types of plants.

    • 再生可能エネルギー発電量(総発電量に占める割合):再生可能エネルギー発電量とは、再生可能エネルギー発電所で発電された電力が、すべての種類の発電所で発電された電力に占める割合。

  • Electricity production from oil, gas and coal sources (% of total):EG.ELC.FOSL.ZS [Link] (fossil)

    • Sources of electricity refer to the inputs used to generate electricity. Oil refers to crude oil and petroleum products. Gas refers to natural gas but excludes natural gas liquids. Coal refers to all coal and brown coal, both primary (including hard coal and lignite-brown coal) and derived fuels (including patent fuel, coke oven coke, gas coke, coke oven gas, and blast furnace gas). Peat is also included in this category.

    • 化石燃料(石油、ガス、石炭)による発電量(総発電量に占める割合):電力源とは、発電に使用される投入物を指す。石油は原油および石油製品。ガスとは天然ガスを指し、天然ガス液体は含まない。石炭は、一次炭(硬質炭、褐炭を含む)と派生燃料(パテント燃料、コークス炉コークス、ガスコークス、コークス炉ガス、高炉ガスを含む)のすべての石炭と褐炭を指す。泥炭もこのカテゴリーに含まれる。

  • Electricity production from nuclear sources (% of total):EG.ELC.NUCL.ZS [Link] (nuclear)

    • Sources of electricity refer to the inputs used to generate electricity. Nuclear power refers to electricity produced by nuclear power plants.

    • 原子力による発電量(総発電量に占める割合):電力源とは、発電に使用される投入物を指す。原子力発電とは、原子力発電所で生産された電力を指す。

データの取得

準備

library(tidyverse)
library(WDI)

データのダウンロードと保存:コードと変数名を指定。

df_environment <- WDI(
  indicator = c(co2pcap = "EN.ATM.CO2E.PC",
                forest = "AG.LND.FRST.ZS",
                renewable = "EG.ELC.RNEW.ZS",
                fossil = "EG.ELC.FOSL.ZS",
                nuclear = "EG.ELC.NUCL.ZS"
                ), extra = TRUE)

2回目からは、data から読み込めるようにしておく ファイル (Rmd) の保存場所に data フォルダがあることを確認

write_csv(df_environment, "data/environment.csv")
df_environment <- read_csv("data/environment.csv")
Rows: 16758 Columns: 17── Column specification ─────────────────────────────────────────────────────────────────
Delimiter: ","
chr  (7): country, iso2c, iso3c, region, capital, income, lending
dbl  (8): year, co2pcap, forest, renewable, fossil, nuclear, longitude, latitude
lgl  (1): status
date (1): lastupdated
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.

データの確認

df_environment
str(df_environment)
spc_tbl_ [16,758 × 17] (S3: spec_tbl_df/tbl_df/tbl/data.frame)
 $ country    : chr [1:16758] "Afghanistan" "Afghanistan" "Afghanistan" "Afghanistan" ...
 $ iso2c      : chr [1:16758] "AF" "AF" "AF" "AF" ...
 $ iso3c      : chr [1:16758] "AFG" "AFG" "AFG" "AFG" ...
 $ year       : num [1:16758] 2014 1971 2006 2013 1995 ...
 $ status     : logi [1:16758] NA NA NA NA NA NA ...
 $ lastupdated: Date[1:16758], format: "2023-12-18" "2023-12-18" ...
 $ co2pcap    : num [1:16758] 0.2837 NA 0.0898 0.2981 0.0888 ...
 $ forest     : num [1:16758] 1.85 NA 1.85 1.85 1.85 ...
 $ renewable  : num [1:16758] 85.3 NA 70.8 78.6 69 ...
 $ fossil     : num [1:16758] NA NA NA NA NA NA NA NA NA NA ...
 $ nuclear    : num [1:16758] NA NA NA NA NA NA NA NA NA NA ...
 $ region     : chr [1:16758] "South Asia" "South Asia" "South Asia" "South Asia" ...
 $ capital    : chr [1:16758] "Kabul" "Kabul" "Kabul" "Kabul" ...
 $ longitude  : num [1:16758] 69.2 69.2 69.2 69.2 69.2 ...
 $ latitude   : num [1:16758] 34.5 34.5 34.5 34.5 34.5 ...
 $ income     : chr [1:16758] "Low income" "Low income" "Low income" "Low income" ...
 $ lending    : chr [1:16758] "IDA" "IDA" "IDA" "IDA" ...
 - attr(*, "spec")=
  .. cols(
  ..   country = col_character(),
  ..   iso2c = col_character(),
  ..   iso3c = col_character(),
  ..   year = col_double(),
  ..   status = col_logical(),
  ..   lastupdated = col_date(format = ""),
  ..   co2pcap = col_double(),
  ..   forest = col_double(),
  ..   renewable = col_double(),
  ..   fossil = col_double(),
  ..   nuclear = col_double(),
  ..   region = col_character(),
  ..   capital = col_character(),
  ..   longitude = col_double(),
  ..   latitude = col_double(),
  ..   income = col_character(),
  ..   lending = col_character()
  .. )
 - attr(*, "problems")=<externalptr> 

データの数

すべての指標の値があるもののデータ数を、年毎に表示する。

df_environment |> drop_na(co2pcap, forest, renewable, fossil, nuclear) |> 
  ggplot(aes(year)) + geom_bar()

気づいたこと・疑問

  • データは、1990年以降で、すべてのデータが存在するのは、2014年ごろとなる。のちに、それぞれの場合に、個別にみる。

参考

それぞれのデータがどのくらいあるか見たい時は、データを縦長(long data)にして使う次のような方法もある。おおよそ、どの指標のデータが少ないかがわかる。

df_environment |> pivot_longer(cols = c(co2pcap, forest, renewable, fossil, nuclear)) |> 
  drop_na(value) |> ggplot(aes(year, fill = name)) + geom_bar(col = "black", linewidth = 0.1)

気づいたこと・疑問

  • すべてのデーが十分あるのは、2014年。ある程度あるのは、2015年、それ以降は、co2pcap と、forest のみ。

変数の選択(selecting)

df_env <- df_environment |> 
  select(country, iso2c, year, co2pcap, forest, 
         renewable, fossil, nuclear, region, income)
df_env

変数の相関関係

データを概観するため、授業の最初に見たように、国を選択し、変数の相関関係を見てみる。

df_env |> filter(!(iso2c %in% REGION)) |> # 地域以外(国のみ選択)
  drop_na(co2pcap, forest, renewable, fossil, nuclear) |> 
  select(co2pcap, forest, renewable, fossil, nuclear) |> cor()
             co2pcap     forest  renewable     fossil    nuclear
co2pcap    1.0000000 -0.1832374 -0.4138267  0.3220169  0.1369711
forest    -0.1832374  1.0000000  0.3683177 -0.4234481  0.1131410
renewable -0.4138267  0.3683177  1.0000000 -0.8784240 -0.1851655
fossil     0.3220169 -0.4234481 -0.8784240  1.0000000 -0.2354258
nuclear    0.1369711  0.1131410 -0.1851655 -0.2354258  1.0000000

2014年に限定してみる。

df_env |> filter(!(iso2c %in% REGION), year == 2014) |> # 地域以外(国のみ選択)
  drop_na(co2pcap, forest, renewable, fossil, nuclear) |> 
  select(co2pcap, forest, renewable, fossil, nuclear) |> cor()
              co2pcap     forest  renewable     fossil     nuclear
co2pcap    1.00000000 -0.1548686 -0.3902420  0.3056159  0.09178764
forest    -0.15486856  1.0000000  0.3316376 -0.3664743  0.10163594
renewable -0.39024200  0.3316376  1.0000000 -0.8824027 -0.11973317
fossil     0.30561592 -0.3664743 -0.8824027  1.0000000 -0.28368597
nuclear    0.09178764  0.1016359 -0.1197332 -0.2836860  1.00000000

原子力だけ考えると、値が 0 のところが多いので、0 を省いたほうが良いかもしれない。

df_env |> filter(!(iso2c %in% REGION), year == 2014) |> filter(nuclear >0) |>
  select(country, iso2c, nuclear) |> arrange(desc(nuclear))
df_env |> filter(!(iso2c %in% REGION), year == 2014) |> # 地域以外(国のみ選択)
  drop_na(co2pcap, forest, renewable, fossil, nuclear) |> filter(nuclear >0) |>
  select(co2pcap, forest, renewable, fossil, nuclear) |> cor()
              co2pcap     forest   renewable     fossil     nuclear
co2pcap    1.00000000  0.2244851 -0.17539482  0.1539010 -0.05136171
forest     0.22448511  1.0000000  0.42931138 -0.5034195  0.25603803
renewable -0.17539482  0.4293114  1.00000000 -0.6569930 -0.06107962
fossil     0.15390104 -0.5034195 -0.65699299  1.0000000 -0.71114308
nuclear   -0.05136171  0.2560380 -0.06107962 -0.7111431  1.00000000

気づいたこと・疑問

  • 一人当たりの二酸化炭素排出量(co2pcap)との関係でみると、再生可能エネルギーとの負の相関が最大で、次が、化石燃料との正の相関が強い。原子力は、非常に弱い正の相関、森林の面積は、弱い負の相関がある。ことがわかる。

あくまでも、相関であり、因果関係ではない。再生可能エネルギーを増やしたり、化石燃料による発電を減らしたり、森を増やせば、二酸化炭素排出量が減ると、ここから結論できるわけではない。あくまでも、化石燃料の発電が多い国のほうが、二酸化炭素排出量が多い傾向があるというようなことが見て取れることである。相関関係は因果関係にあらず。Correlation is not causation.

国と地域

country には、国と地域両方が入っています。地域の iso2c は以下のものです。

REGION <- c("1A", "1W", "4E", "6F", "6N", "6X", "7E", "8S", "A4", "A5", 
"A9", "B1", "B2", "B3", "B4", "B6", "B7", "B8", "C4", "C5", "C6", 
"C7", "C8", "C9", "D2", "D3", "D4", "D5", "D6", "D7", "EU", "F1", 
"F6", "M1", "M2", "N6", "OE", "R6", "S1", "S2", "S3", "S4", "T2", 
"T3", "T4", "T5", "T6", "T7", "V1", "V2", "V3", "V4", "XC", "XD", 
"XE", "XF", "XG", "XH", "XI", "XJ", "XL", "XM", "XN", "XO", "XP", 
"XQ", "XT", "XU", "XY", "Z4", "Z7", "ZB", "ZF", "ZG", "ZH", "ZI", 
"ZJ", "ZQ", "ZT")

地域のリストを表示

df_env |> filter(iso2c %in% REGION) |> distinct(country, iso2c)

国名とその地域・所得レベルを表示

df_env |> filter(!(iso2c %in% REGION)) |> distinct(country, iso2c, region, income)

分析する国のリスト

いくつかの国のグループについて、国名または、iso2c または iso3c のリストを作成しておくと、便利です。そのときに、上のリストは、役に立ちます。

BRICS と呼ばれる、ブラジル、ロシア、インド、中国、南アフリカ5カ国についてデータをみる。

BRICS <- c("Brazil", "Russian Federation", "India", "China", "South Africa")

国名ではなく、iso2c で選択することも可能。

brics <- c("BR","RU","IN","CN","ZA")

経年変化を表す折線グラフ

一人当たりの二酸化炭素排出量

a. 日本

df_env |> filter(country == "Japan") |> drop_na(co2pcap) |>
  ggplot(aes(year, co2pcap)) + geom_line()

気づいたこと・疑問

b. 選択した国・地域

df_env |> filter(country %in% BRICS) |> drop_na(co2pcap) |>
  ggplot(aes(year, co2pcap, col = country)) + geom_line()

iso2c の brics で選択する時は、

df_env |> filter(iso2c %in% brics) |> drop_na(co2pcap) |>
  ggplot(aes(year, co2pcap, col = country)) + geom_line()

凡例も、ISO2C 表示にすることも可能です。

df_env |> filter(iso2c %in% brics) |> drop_na(co2pcap) |>
  ggplot(aes(year, co2pcap, col = iso2c)) + geom_line()

気づいたこと・疑問

森林面積

a. 日本

df_env |> filter(country == "Japan") |> drop_na(forest) |>
  ggplot(aes(year, forest)) + geom_line()

気づいたこと・疑問

b. 選択した国・地域

df_env |> filter(country %in% BRICS) |> drop_na(forest) |>
  ggplot(aes(year, forest, col = country)) + geom_line()

気づいたこと・疑問

再生可能エネルギー

a. 日本

df_env |> filter(country == "Japan") |> drop_na(renewable) |>
  ggplot(aes(year, renewable)) + geom_line()

気づいたこと・疑問

b. 選択した国・地域

df_env |> filter(country %in% BRICS) |> drop_na(renewable) |>
  ggplot(aes(year, renewable, col = country)) + geom_line()

気づいたこと・疑問

化石エネルギー

a. 日本

df_env |> filter(country == "Japan") |> drop_na(fossil) |>
  ggplot(aes(year, fossil)) + geom_line()

気づいたこと・疑問

b. 選択した国・地域

df_env |> filter(country %in% BRICS) |> drop_na(fossil) |>
  ggplot(aes(year, fossil, col = country)) + geom_line()

気づいたこと・疑問

原子力

a. 日本

df_env |> filter(country == "Japan") |> drop_na(nuclear) |>
  ggplot(aes(year, nuclear)) + geom_line()

気づいたこと・疑問

b. 選択した国・地域

df_env |> filter(country %in% BRICS) |> drop_na(nuclear) |>
  ggplot(aes(year, nuclear, col = country)) + geom_line()

気づいたこと・疑問

相関を表す散布図

一人当たりの二酸化炭素排出量と、森林面積

df_env |> filter(!(iso2c %in% REGION)) |> filter(year == 2014) |> drop_na(co2pcap, forest) |> 
  ggplot(aes(forest, co2pcap)) + geom_point(aes(col = region)) +
  geom_smooth(formula = 'y~x', method = "lm", se = FALSE)

df_env |> filter(!(iso2c %in% REGION)) |> filter(year == 2014) |> drop_na(co2pcap, forest) |> 
  ggplot(aes(forest, co2pcap)) + geom_point(aes(col = income)) +
  geom_smooth(formula = 'y~x', method = "lm", se = FALSE)

気づいたこと・疑問

一人当たりの二酸化炭素排出量と、再生可能エネルギー

df_env |> filter(!(iso2c %in% REGION)) |> filter(year == 2014) |> 
  drop_na(co2pcap, renewable) |> 
  ggplot(aes(renewable, co2pcap)) + geom_point(aes(col = region)) +
  geom_smooth(formula = 'y~x', method = "lm", se = FALSE)

df_env |> filter(!(iso2c %in% REGION)) |> filter(year == 2014) |> 
  drop_na(co2pcap, renewable) |> 
  ggplot(aes(renewable, co2pcap)) + geom_point(aes(col = income)) +
  geom_smooth(formula = 'y~x', method = "lm", se = FALSE)

気づいたこと・疑問

一人当たりの二酸化炭素排出量と、化石エネルギー

df_env |> filter(!(iso2c %in% REGION)) |> filter(year == 2014) |> 
  drop_na(co2pcap, fossil) |> 
  ggplot(aes(fossil, co2pcap)) + geom_point(aes(col = region)) +
  geom_smooth(formula = 'y~x', method = "lm", se = FALSE)

df_env |> filter(!(iso2c %in% REGION)) |> filter(year == 2014) |> 
  drop_na(co2pcap, fossil) |> 
  ggplot(aes(fossil, co2pcap)) + geom_point(aes(col = income)) +
  geom_smooth(formula = 'y~x', method = "lm", se = FALSE)

気づいたこと・疑問

一人当たりの二酸化炭素排出量と、原子力

df_env |> filter(!(iso2c %in% REGION)) |> filter(year == 2014) |> 
  drop_na(co2pcap, nuclear) |> 
  ggplot(aes(nuclear, co2pcap)) + geom_point(aes(col = region)) +
  geom_smooth(formula = 'y~x', method = "lm", se = FALSE)

df_env |> filter(!(iso2c %in% REGION)) |> filter(year == 2014) |> 
  drop_na(co2pcap, nuclear) |> filter(nuclear >0) |>
  ggplot(aes(nuclear, co2pcap)) + geom_point(aes(col = income)) +
  geom_smooth(formula = 'y~x', method = "lm", se = FALSE)

気づいたこと・疑問

森林面積と、再生可能エネルギー

df_env |> filter(!(iso2c %in% REGION)) |> filter(year == 2014) |> 
  drop_na(forest, renewable) |> 
  ggplot(aes(renewable, forest)) + geom_point(aes(col = region)) +
  geom_smooth(formula = 'y~x', method = "lm", se = FALSE)

df_env |> filter(!(iso2c %in% REGION)) |> filter(year == 2014) |> 
  drop_na(forest, renewable) |> 
  ggplot(aes(renewable, forest)) + geom_point(aes(col = income)) +
  geom_smooth(formula = 'y~x', method = "lm", se = FALSE)

気づいたこと・疑問

森林面積と、化石エネルギー

df_env |> filter(!(iso2c %in% REGION)) |> filter(year == 2014) |> 
  drop_na(fossil, forest) |> 
  ggplot(aes(fossil, forest)) + geom_point(aes(col = region)) +
  geom_smooth(formula = 'y~x', method = "lm", se = FALSE)

df_env |> filter(!(iso2c %in% REGION)) |> filter(year == 2014) |> 
  drop_na(fossil, forest) |> 
  ggplot(aes(fossil, forest)) + geom_point(aes(col = income)) +
  geom_smooth(formula = 'y~x', method = "lm", se = FALSE)

気づいたこと・疑問

森林面積と、原子力

df_env |> filter(!(iso2c %in% REGION)) |> filter(year == 2014) |> 
  drop_na(nuclear, forest) |> 
  ggplot(aes(forest, nuclear)) + geom_point(aes(col = region)) +
  geom_smooth(formula = 'y~x', method = "lm", se = FALSE)

df_env |> filter(!(iso2c %in% REGION)) |> filter(year == 2014) |> 
  drop_na(nuclear, forest) |> filter(nuclear >0) |>
  ggplot(aes(forest, nuclear)) + geom_point(aes(col = income)) +
  geom_smooth(formula = 'y~x', method = "lm", se = FALSE)

気づいたこと・疑問

再生可能エネルギーと、化石エネルギー

df_env |> filter(!(iso2c %in% REGION)) |> filter(year == 2014) |> 
  drop_na(fossil, renewable) |> 
  ggplot(aes(renewable, fossil)) + geom_point(aes(col = region)) +
  geom_smooth(formula = 'y~x', method = "lm", se = FALSE)

df_env |> filter(!(iso2c %in% REGION)) |> filter(year == 2014) |> 
  drop_na(fossil, renewable) |> 
  ggplot(aes(renewable, fossil)) + geom_point(aes(col = income)) +
  geom_smooth(formula = 'y~x', method = "lm", se = FALSE)

気づいたこと・疑問

再生可能エネルギーと、原子力

df_env |> filter(!(iso2c %in% REGION)) |> filter(year == 2014) |> 
  drop_na(nuclear, renewable) |> 
  ggplot(aes(renewable, nuclear)) + geom_point(aes(col = region)) +
  geom_smooth(formula = 'y~x', method = "lm", se = FALSE)

df_env |> filter(!(iso2c %in% REGION)) |> filter(year == 2014) |> 
  drop_na(nuclear, renewable) |> filter(nuclear >0) |>
  ggplot(aes(renewable, nuclear)) + geom_point(aes(col = income)) +
  geom_smooth(formula = 'y~x', method = "lm", se = FALSE)

気づいたこと・疑問

化石エネルギーと、原子力

df_env |> filter(!(iso2c %in% REGION)) |> filter(year == 2014) |> 
  drop_na(fossil, nuclear) |> 
  ggplot(aes(fossil, nuclear)) + geom_point(aes(col = region)) +
  geom_smooth(formula = 'y~x', method = "lm", se = FALSE)

df_env |> filter(!(iso2c %in% REGION)) |> filter(year == 2014) |> 
  drop_na(fossil, nuclear) |> filter(nuclear >0) |>
  ggplot(aes(fossil, nuclear)) + geom_point(aes(col = income)) +
  geom_smooth(formula = 'y~x', method = "lm", se = FALSE)

気づいたこと・疑問

参考

df_env_long <- df_env |> pivot_longer(c(renewable, fossil, nuclear))
df_env_long
df_env_long |> filter(country == "Japan") |> drop_na(value) |>
  ggplot(aes(year, value, fill = name)) + geom_area(col = "black", linewidth = 0.2)

df_env_long |> filter(country == "World") |> drop_na(value) |>
  ggplot(aes(year, value, fill = name)) + geom_area(col = "black", linewidth = 0.2)

df_env |> filter(region != "Aggregates", !is.na(region)) |> distinct(region) |> dput()
structure(list(region = c("South Asia", "Europe & Central Asia", 
"Middle East & North Africa", "East Asia & Pacific", "Sub-Saharan Africa", 
"Latin America & Caribbean", "North America")), row.names = c(NA, 
-7L), class = c("tbl_df", "tbl", "data.frame"))
regions <- c("South Asia", "Europe & Central Asia", 
"Middle East & North Africa", "East Asia & Pacific", "Sub-Saharan Africa", 
"Latin America & Caribbean", "North America")
df_env_long |> filter(country %in% regions) |> filter(year >= 1990) |> drop_na(value) |>
  ggplot(aes(year, value, fill = name)) + geom_area(col = "black", linewidth = 0.2) +
  facet_wrap(~country)

LS0tCnRpdGxlOiAi56ysNumAsSDmjqLntKLnmoTjg4fjg7zjgr/liIbmnpAgLSBFREEiCmF1dGhvcjogIkhpcm9zaGkgU3V6dWtpIgpkYXRlOiAiMjAyNOW5tDHmnIgzMOaXpSIKb3V0cHV0OgogIGh0bWxfbm90ZWJvb2s6IAogICAgdG9jOiB5ZXMKICAgIHRvY19mbG9hdDogeWVzCi0tLQoKIyMg5ryU57+SCgrku6XkuIvjga7mjIfmqJnjga7kuK3jgYvjgonjgIHkuozjgaTjgpLpgbjmip7jgZfjgabjgIHjg4fjg7zjgr/jga7mpoLopoHvvIhkZXNjcmlwdGlvbu+8ieOCkuiomOmMsuOBl+OAgeODh+ODvOOCv+OCkiBXREkg44Gn5Y+W5b6X44GX44CB5Lul5LiL44Gu5YiG5p6Q44KS44GZ44KL44CCCgoxLiAg5ZCE5bm05q+O44Gu44OH44O844K/44Gu5pWw44Gu5qOS44Kw44Op44OVCjIuICDlm73jgb7jgZ/jga/lnLDln5/jgpLpgbjmip4KMy4gIOOBneOCjOOBnuOCjOOBrue1jOW5tOWkieWMluOCkuihqOOBmeaKmOOCjOe3muOCsOODqeODlQogICAgYS4gIOaXpeacrAogICAgYi4gIOmBuOaKnuOBl+OBn+WbveOBvuOBn+OBr+WcsOWfnwo0LiAg5LqM44Gk44Gu44OH44O844K/44Gu5pWj5biD5ZuzLeW/heimgeOBq+W/nOOBmOOBpiBsb2cxMCDjgrnjgrHjg7zjg6vjgpLnlKjjgYTjgosKICAgIGEuICDjgZnjgbnjgabjga7lgKTjga7mlaPluIPlm7MKICAgIGIuICBOQSDjgafjga/jgarjgYTlgKTjga7mlaPluIPlm7PjgIHov5HkvLzvvIjlm57luLDvvInnm7Tnt5rjgpLooajnpLoKICAgIGMuICDlnLDln5/jgpLpmaTjgY3lm73jga7jgb/jga7mlaPluIPlm7PjgIHov5HkvLzvvIjlm57luLDvvInnm7Tnt5rjgpLooajnpLoKICAgIGQuICDmnIDov5Hjga7lubTjgpLpgbjmip7jgZfjgIHlnLDln5/jgpLpmaTjgY3lm73jga7jgoLjga7mlaPluIPlm7PjgIHov5HkvLzvvIjlm57luLDvvInnm7Tnt5rjgpLooajnpLoKCuOBneOCjOOBnuOCjOOBq+OBpOOBhOOBpuiAg+Wvn++8iOawl+OBpeOBhOOBn+OBk+OBqOOAgeeWkeWVj+OBquOBqe+8ieOCkuiomOOBmQoKPCEtLSAqKjIwMjMuMi4zLjIzOjU5Kiog44G+44Gn44GrIE1vb2RsZSDjga7mvJTnv5Ljga7oqrLpoYzjg5zjg4Pjgq/jgrnjgavmj5Dlh7rjgZfjgZ/jgoLjga7jgavjgaTjgYTjgabjga/jgIHjgarjgovjgbnjgY/jgIHml6njgY/opovjgabjgIHjg5XjgqPjg7zjg4njg5Djg4Pjgq/jgpLmm7jjgY3jgb7jgZnjgILjgZ3jgozku6XpmY3jgavmj5Dlh7rjgZXjgozjgZ/jgoLjga7jgoLopovjgb7jgZnjgYzjgIHjg5XjgqPjg7zjg4njg5Djg4Pjgq/jga/pgYXjgY/jgarjgovjgajmgJ3jgaPjgabjgY/jgaDjgZXjgYTjgIIgLS0+CgoqKuazqO+8muS7peS4i+OBq+OBiuOBhOOBpuOBr+OAgeWcsOWfn+OBr+OBmeOBueOBpiBCUklDUyDjgajjgZfjgIE0IOmgheebruebruOBr+OAgWQg44Gu44G/44KS56S644GX44CB55u46Zai5L+C5pWw44Gu6KGo56S644KC55yB55Wl44CC44G+44Gf44CB44OH44O844K/44Gv44CB5LiA5ous44Gn6Kqt44G/6L6844KA44CCKioKCiMg55Kw5aKD77yIRW52aXJvbm1lbnTvvInjgavjgaTjgYTjgaYKCiMjIOamguimge+8iEFic3RyYWN077yJCgrku6XkuIvjgavjgYrjgYTjgabjga/jgIHkuJbnlYzpioDooYzjga7jgIHkuJbnlYzplovnmbrmjIfmqJnvvIhXb3JsZCBEZXZlbG9wbWVudCBJbmRpY2F0b3Jz77yJ44Gu44CB5LqU44Gk44Gu5oyH5qiZ44CB44GZ44Gq44KP44Gh44CB5LiA5Lq65b2T44Gf44KK44GuQ08y5o6S5Ye66YeP77yI5Y2Y5L2N77ya44OI44Oz77yJ44CB5qOu5p6X6Z2i56mN77yI6Zm45Zyw6Z2i56mN44Gr5Y2g44KB44KL5Ymy5ZCI77yJ44CB44GK44KI44Gz44CB57eP55m66Zu76YeP44Gr5Y2g44KB44KL44CB5YaN55Sf5Y+v6IO944Ko44ON44Or44Ku44O855m66Zu76YeP44CB5YyW55+z54eD5paZ77yI55+z5rK544CB44Ks44K544CB55+z54Kt77yJ44Gr44KI44KL55m66Zu76YeP44CB5Y6f5a2Q5Yqb44Gr44KI44KL55m66Zu76YeP44GL44KJ44CB5LqM44Gk44Ga44Gk5oyH5qiZ44KS6YG45oqe44GX44CB44Gd44KM44KJ44Gu6Zai5L+C44Gr44Gk44GE44Gm6ICD5a+f44GZ44KL44CCCgojIyDjg4fjg7zjgr/jgavjgaTjgYTjgaYKCi0gICBDTzIgZW1pc3Npb25zIChtZXRyaWMgdG9ucyBwZXIgY2FwaXRhKSDvvJpFTi5BVE0uQ08yRS5QQyBbW0xpbmtdKGh0dHBzOi8vZGF0YS53b3JsZGJhbmsub3JnL2luZGljYXRvci9FTi5BVE0uQ08yRS5QQyldIChjbzJwY2FwKQoKICAgIC0gICBDYXJib24gZGlveGlkZSBlbWlzc2lvbnMgYXJlIHRob3NlIHN0ZW1taW5nIGZyb20gdGhlIGJ1cm5pbmcgb2YgZm9zc2lsIGZ1ZWxzIGFuZCB0aGUgbWFudWZhY3R1cmUgb2YgY2VtZW50LiBUaGV5IGluY2x1ZGUgY2FyYm9uIGRpb3hpZGUgcHJvZHVjZWQgZHVyaW5nIGNvbnN1bXB0aW9uIG9mIHNvbGlkLCBsaXF1aWQsIGFuZCBnYXMgZnVlbHMgYW5kIGdhcyBmbGFyaW5nLgoKICAgIC0gICDkuIDkurrlvZPjgZ/jgorjga5DTzLmjpLlh7rph4/vvIjljZjkvY3vvJrjg4jjg7PvvInvvJrkuozphbjljJbngq3ntKDmjpLlh7rph4/jga/jgIHljJbnn7Pnh4Pmlpnjga7nh4PnhLzjgajjgrvjg6Hjg7Pjg4jjga7oo73pgKDjgavnlLHmnaXjgZnjgovjgoLjga7jgafjgYLjgovjgILlm7rlvaLnh4PmlpnjgIHmtrLkvZPnh4PmlpnjgIHjgqzjgrnnh4Pmlpnjga7mtojosrvmmYLjgavnmbrnlJ/jgZnjgovkuozphbjljJbngq3ntKDjgoTjgIHjgqzjgrnjga7jg5Xjg6zjgqLjg6rjg7PjgrDjgoLlkKvjgb7jgozjgovjgIIKCi0gICBGb3Jlc3QgYXJlYSAoJSBvZiBsYW5kIGFyZWEp77yaQUcuTE5ELkZSU1QuWlMgW1tMaW5rXShodHRwczovL2RhdGEud29ybGRiYW5rLm9yZy9pbmRpY2F0b3IvQUcuTE5ELkZSU1QuWlMpXSAoZm9yZXN0KQoKICAgIC0gICBGb3Jlc3QgYXJlYSBpcyBsYW5kIHVuZGVyIG5hdHVyYWwgb3IgcGxhbnRlZCBzdGFuZHMgb2YgdHJlZXMgb2YgYXQgbGVhc3QgNSBtZXRlcnMgaW4gc2l0dSwgd2hldGhlciBwcm9kdWN0aXZlIG9yIG5vdCwgYW5kIGV4Y2x1ZGVzIHRyZWUgc3RhbmRzIGluIGFncmljdWx0dXJhbCBwcm9kdWN0aW9uIHN5c3RlbXMgKGZvciBleGFtcGxlLCBpbiBmcnVpdCBwbGFudGF0aW9ucyBhbmQgYWdyb2ZvcmVzdHJ5IHN5c3RlbXMpIGFuZCB0cmVlcyBpbiB1cmJhbiBwYXJrcyBhbmQgZ2FyZGVucy4KCiAgICAtICAg5qOu5p6X6Z2i56mN77yI6Zm45Zyw6Z2i56mN44Gr5Y2g44KB44KL5Ymy5ZCI77yJ77ya5qOu5p6X6Z2i56mN44Go44Gv44CB55Sf55Sj55qE44GL5ZCm44GL44KS5ZWP44KP44Ga44CB5Y6f5L2N572u44GnNW3ku6XkuIrjga7mqLnmnKjjga7lpKnnhLbmnpfjgb7jgZ/jga/kurrlt6Xmnpfjga7kuIvjgavjgYLjgovlnJ/lnLDjgafjgYLjgorjgIHovrLmpa3nlJ/nlKPjgrfjgrnjg4bjg6DvvIjkvovjgYjjgbDjgIHmnpzmqLnlnJLjgoTjgqLjgrDjg63jg5Xjgqnjg6zjgrnjg4jjg6rjg7zjgrfjgrnjg4bjg6DvvInjgavjgYrjgZHjgovmqLnmnKjjga7nq4vmnKjjgoTjgIHpg73luILjga7lhazlnJLjgoTluq3lnJLjga7mqLnmnKjjgpLpmaTjgY/jgIIKCi0gICBSZW5ld2FibGUgZWxlY3RyaWNpdHkgb3V0cHV0ICglIG9mIHRvdGFsIGVsZWN0cmljaXR5IG91dHB1dCnvvJpFRy5FTEMuUk5FVy5aUyBbW0xpbmtdKGh0dHBzOi8vZGF0YS53b3JsZGJhbmsub3JnL2luZGljYXRvci9FRy5FTEMuUk5FVy5aUyldIChyZW5ld2FibGUpCgogICAgLSAgIFJlbmV3YWJsZSBlbGVjdHJpY2l0eSBpcyB0aGUgc2hhcmUgb2YgZWxlY3RyaXR5IGdlbmVyYXRlZCBieSByZW5ld2FibGUgcG93ZXIgcGxhbnRzIGluIHRvdGFsIGVsZWN0cmljaXR5IGdlbmVyYXRlZCBieSBhbGwgdHlwZXMgb2YgcGxhbnRzLgoKICAgIC0gICDlho3nlJ/lj6/og73jgqjjg43jg6vjgq7jg7znmbrpm7vph4/vvIjnt4/nmbrpm7vph4/jgavljaDjgoHjgovlibLlkIjvvInvvJrlho3nlJ/lj6/og73jgqjjg43jg6vjgq7jg7znmbrpm7vph4/jgajjga/jgIHlho3nlJ/lj6/og73jgqjjg43jg6vjgq7jg7znmbrpm7vmiYDjgafnmbrpm7vjgZXjgozjgZ/pm7vlipvjgYzjgIHjgZnjgbnjgabjga7nqK7poZ7jga7nmbrpm7vmiYDjgafnmbrpm7vjgZXjgozjgZ/pm7vlipvjgavljaDjgoHjgovlibLlkIjjgIIKCi0gICBFbGVjdHJpY2l0eSBwcm9kdWN0aW9uIGZyb20gb2lsLCBnYXMgYW5kIGNvYWwgc291cmNlcyAoJSBvZiB0b3RhbCnvvJpFRy5FTEMuRk9TTC5aUyBbW0xpbmtdKGh0dHBzOi8vZGF0YS53b3JsZGJhbmsub3JnL2luZGljYXRvci9FRy5FTEMuRk9TTC5aUyldIChmb3NzaWwpCgogICAgLSAgIFNvdXJjZXMgb2YgZWxlY3RyaWNpdHkgcmVmZXIgdG8gdGhlIGlucHV0cyB1c2VkIHRvIGdlbmVyYXRlIGVsZWN0cmljaXR5LiBPaWwgcmVmZXJzIHRvIGNydWRlIG9pbCBhbmQgcGV0cm9sZXVtIHByb2R1Y3RzLiBHYXMgcmVmZXJzIHRvIG5hdHVyYWwgZ2FzIGJ1dCBleGNsdWRlcyBuYXR1cmFsIGdhcyBsaXF1aWRzLiBDb2FsIHJlZmVycyB0byBhbGwgY29hbCBhbmQgYnJvd24gY29hbCwgYm90aCBwcmltYXJ5IChpbmNsdWRpbmcgaGFyZCBjb2FsIGFuZCBsaWduaXRlLWJyb3duIGNvYWwpIGFuZCBkZXJpdmVkIGZ1ZWxzIChpbmNsdWRpbmcgcGF0ZW50IGZ1ZWwsIGNva2Ugb3ZlbiBjb2tlLCBnYXMgY29rZSwgY29rZSBvdmVuIGdhcywgYW5kIGJsYXN0IGZ1cm5hY2UgZ2FzKS4gUGVhdCBpcyBhbHNvIGluY2x1ZGVkIGluIHRoaXMgY2F0ZWdvcnkuCgogICAgLSAgIOWMluefs+eHg+aWme+8iOefs+ayueOAgeOCrOOCueOAgeefs+eCre+8ieOBq+OCiOOCi+eZuumbu+mHj++8iOe3j+eZuumbu+mHj+OBq+WNoOOCgeOCi+WJsuWQiO+8ie+8mumbu+WKm+a6kOOBqOOBr+OAgeeZuumbu+OBq+S9v+eUqOOBleOCjOOCi+aKleWFpeeJqeOCkuaMh+OBmeOAguefs+ayueOBr+WOn+ayueOBiuOCiOOBs+efs+ayueijveWTgeOAguOCrOOCueOBqOOBr+WkqeeEtuOCrOOCueOCkuaMh+OBl+OAgeWkqeeEtuOCrOOCuea2suS9k+OBr+WQq+OBvuOBquOBhOOAguefs+eCreOBr+OAgeS4gOasoeeCre+8iOehrOizqueCreOAgeikkOeCreOCkuWQq+OCgO+8ieOBqOa0vueUn+eHg+aWme+8iOODkeODhuODs+ODiOeHg+aWmeOAgeOCs+ODvOOCr+OCueeCieOCs+ODvOOCr+OCueOAgeOCrOOCueOCs+ODvOOCr+OCueOAgeOCs+ODvOOCr+OCueeCieOCrOOCueOAgemrmOeCieOCrOOCueOCkuWQq+OCgO+8ieOBruOBmeOBueOBpuOBruefs+eCreOBqOikkOeCreOCkuaMh+OBmeOAguazpeeCreOCguOBk+OBruOCq+ODhuOCtOODquODvOOBq+WQq+OBvuOCjOOCi+OAggoKLSAgIEVsZWN0cmljaXR5IHByb2R1Y3Rpb24gZnJvbSBudWNsZWFyIHNvdXJjZXMgKCUgb2YgdG90YWwp77yaRUcuRUxDLk5VQ0wuWlMgW1tMaW5rXShodHRwczovL2RhdGEud29ybGRiYW5rLm9yZy9pbmRpY2F0b3IvRUcuRUxDLk5VQ0wuWlMpXSAobnVjbGVhcikKCiAgICAtICAgU291cmNlcyBvZiBlbGVjdHJpY2l0eSByZWZlciB0byB0aGUgaW5wdXRzIHVzZWQgdG8gZ2VuZXJhdGUgZWxlY3RyaWNpdHkuIE51Y2xlYXIgcG93ZXIgcmVmZXJzIHRvIGVsZWN0cmljaXR5IHByb2R1Y2VkIGJ5IG51Y2xlYXIgcG93ZXIgcGxhbnRzLgoKICAgIC0gICDljp/lrZDlipvjgavjgojjgovnmbrpm7vph4/vvIjnt4/nmbrpm7vph4/jgavljaDjgoHjgovlibLlkIjvvInvvJrpm7vlipvmupDjgajjga/jgIHnmbrpm7vjgavkvb/nlKjjgZXjgozjgovmipXlhaXnianjgpLmjIfjgZnjgILljp/lrZDlipvnmbrpm7vjgajjga/jgIHljp/lrZDlipvnmbrpm7vmiYDjgafnlJ/nlKPjgZXjgozjgZ/pm7vlipvjgpLmjIfjgZnjgIIKCiMjIyDjg4fjg7zjgr/jga7lj5blvpcKCiMjIyMg5rqW5YKZCgpgYGB7cn0KbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkoV0RJKQpgYGAKCuODh+ODvOOCv+OBruODgOOCpuODs+ODreODvOODieOBqOS/neWtmO+8muOCs+ODvOODieOBqOWkieaVsOWQjeOCkuaMh+WumuOAggoKYGBge3IgZXZhbCA9IEZBTFNFfQpkZl9lbnZpcm9ubWVudCA8LSBXREkoCiAgaW5kaWNhdG9yID0gYyhjbzJwY2FwID0gIkVOLkFUTS5DTzJFLlBDIiwKICAgICAgICAgICAgICAgIGZvcmVzdCA9ICJBRy5MTkQuRlJTVC5aUyIsCiAgICAgICAgICAgICAgICByZW5ld2FibGUgPSAiRUcuRUxDLlJORVcuWlMiLAogICAgICAgICAgICAgICAgZm9zc2lsID0gIkVHLkVMQy5GT1NMLlpTIiwKICAgICAgICAgICAgICAgIG51Y2xlYXIgPSAiRUcuRUxDLk5VQ0wuWlMiCiAgICAgICAgICAgICAgICApLCBleHRyYSA9IFRSVUUpCmBgYAoKKu+8kuWbnuebruOBi+OCieOBr+OAgWRhdGEg44GL44KJ6Kqt44G/6L6844KB44KL44KI44GG44Gr44GX44Gm44GK44GPIOODleOCoeOCpOODqyAoUm1kKSDjga7kv53lrZjloLTmiYDjgasgZGF0YSDjg5Xjgqnjg6vjg4DjgYzjgYLjgovjgZPjgajjgpLnorroqo0qCgpgYGB7ciBldmFsID0gRkFMU0V9CndyaXRlX2NzdihkZl9lbnZpcm9ubWVudCwgImRhdGEvZW52aXJvbm1lbnQuY3N2IikKYGBgCgpgYGB7cn0KZGZfZW52aXJvbm1lbnQgPC0gcmVhZF9jc3YoImRhdGEvZW52aXJvbm1lbnQuY3N2IikKYGBgCgojIyMg44OH44O844K/44Gu56K66KqNCgpgYGB7cn0KZGZfZW52aXJvbm1lbnQKYGBgCgpgYGB7cn0Kc3RyKGRmX2Vudmlyb25tZW50KQpgYGAKCiMjIyDjg4fjg7zjgr/jga7mlbAKCuOBmeOBueOBpuOBruaMh+aomeOBruWApOOBjOOBguOCi+OCguOBruOBruODh+ODvOOCv+aVsOOCkuOAgeW5tOavjuOBq+ihqOekuuOBmeOCi+OAggoKYGBge3J9CmRmX2Vudmlyb25tZW50IHw+IGRyb3BfbmEoY28ycGNhcCwgZm9yZXN0LCByZW5ld2FibGUsIGZvc3NpbCwgbnVjbGVhcikgfD4gCiAgZ2dwbG90KGFlcyh5ZWFyKSkgKyBnZW9tX2JhcigpCmBgYAoKKirmsJfjgaXjgYTjgZ/jgZPjgajjg7vnlpHllY8qKgoKLSAgIOODh+ODvOOCv+OBr+OAgTE5OTDlubTku6XpmY3jgafjgIHjgZnjgbnjgabjga7jg4fjg7zjgr/jgYzlrZjlnKjjgZnjgovjga7jga/jgIEyMDE05bm044GU44KN44Go44Gq44KL44CC44Gu44Gh44Gr44CB44Gd44KM44Ge44KM44Gu5aC05ZCI44Gr44CB5YCL5Yil44Gr44G/44KL44CCCgojIyMjIOWPguiAgwoK44Gd44KM44Ge44KM44Gu44OH44O844K/44GM44Gp44Gu44GP44KJ44GE44GC44KL44GL6KaL44Gf44GE5pmC44Gv44CB44OH44O844K/44KS57im6ZW377yIbG9uZyBkYXRh77yJ44Gr44GX44Gm5L2/44GG5qyh44Gu44KI44GG44Gq5pa55rOV44KC44GC44KL44CC44GK44GK44KI44Gd44CB44Gp44Gu5oyH5qiZ44Gu44OH44O844K/44GM5bCR44Gq44GE44GL44GM44KP44GL44KL44CCCgpgYGB7cn0KZGZfZW52aXJvbm1lbnQgfD4gcGl2b3RfbG9uZ2VyKGNvbHMgPSBjKGNvMnBjYXAsIGZvcmVzdCwgcmVuZXdhYmxlLCBmb3NzaWwsIG51Y2xlYXIpKSB8PiAKICBkcm9wX25hKHZhbHVlKSB8PiBnZ3Bsb3QoYWVzKHllYXIsIGZpbGwgPSBuYW1lKSkgKyBnZW9tX2Jhcihjb2wgPSAiYmxhY2siLCBsaW5ld2lkdGggPSAwLjEpCmBgYAoKKirmsJfjgaXjgYTjgZ/jgZPjgajjg7vnlpHllY8qKgoKLSDjgZnjgbnjgabjga7jg4fjg7zjgYzljYHliIbjgYLjgovjga7jga/jgIEyMDE05bm044CC44GC44KL56iL5bqm44GC44KL44Gu44Gv44CBMjAxNeW5tOOAgeOBneOCjOS7pemZjeOBr+OAgWNvMnBjYXAg44Go44CBZm9yZXN0IOOBruOBv+OAggoKIyMjIOWkieaVsOOBrumBuOaKnu+8iHNlbGVjdGluZ++8iQoKYGBge3J9CmRmX2VudiA8LSBkZl9lbnZpcm9ubWVudCB8PiAKICBzZWxlY3QoY291bnRyeSwgaXNvMmMsIHllYXIsIGNvMnBjYXAsIGZvcmVzdCwgCiAgICAgICAgIHJlbmV3YWJsZSwgZm9zc2lsLCBudWNsZWFyLCByZWdpb24sIGluY29tZSkKZGZfZW52CmBgYAoKIyMg5aSJ5pWw44Gu55u46Zai6Zai5L+CCgrjg4fjg7zjgr/jgpLmpoLoprPjgZnjgovjgZ/jgoHjgIHmjojmpa3jga7mnIDliJ3jgavopovjgZ/jgojjgYbjgavjgIHlm73jgpLpgbjmip7jgZfjgIHlpInmlbDjga7nm7jplqLplqLkv4LjgpLopovjgabjgb/jgovjgIIKCmBgYHtyfQpkZl9lbnYgfD4gZmlsdGVyKCEoaXNvMmMgJWluJSBSRUdJT04pKSB8PiAjIOWcsOWfn+S7peWklu+8iOWbveOBruOBv+mBuOaKnu+8iQogIGRyb3BfbmEoY28ycGNhcCwgZm9yZXN0LCByZW5ld2FibGUsIGZvc3NpbCwgbnVjbGVhcikgfD4gCiAgc2VsZWN0KGNvMnBjYXAsIGZvcmVzdCwgcmVuZXdhYmxlLCBmb3NzaWwsIG51Y2xlYXIpIHw+IGNvcigpCmBgYAoKMjAxNOW5tOOBq+mZkOWumuOBl+OBpuOBv+OCi+OAggoKYGBge3J9CmRmX2VudiB8PiBmaWx0ZXIoIShpc28yYyAlaW4lIFJFR0lPTiksIHllYXIgPT0gMjAxNCkgfD4gIyDlnLDln5/ku6XlpJbvvIjlm73jga7jgb/pgbjmip7vvIkKICBkcm9wX25hKGNvMnBjYXAsIGZvcmVzdCwgcmVuZXdhYmxlLCBmb3NzaWwsIG51Y2xlYXIpIHw+IAogIHNlbGVjdChjbzJwY2FwLCBmb3Jlc3QsIHJlbmV3YWJsZSwgZm9zc2lsLCBudWNsZWFyKSB8PiBjb3IoKQpgYGAKCuWOn+WtkOWKm+OBoOOBkeiAg+OBiOOCi+OBqOOAgeWApOOBjCAwIOOBruOBqOOBk+OCjeOBjOWkmuOBhOOBruOBp+OAgTAg44KS55yB44GE44Gf44G744GG44GM6Imv44GE44GL44KC44GX44KM44Gq44GE44CCCgpgYGB7cn0KZGZfZW52IHw+IGZpbHRlcighKGlzbzJjICVpbiUgUkVHSU9OKSwgeWVhciA9PSAyMDE0KSB8PiBmaWx0ZXIobnVjbGVhciA+MCkgfD4KICBzZWxlY3QoY291bnRyeSwgaXNvMmMsIG51Y2xlYXIpIHw+IGFycmFuZ2UoZGVzYyhudWNsZWFyKSkKYGBgCgpgYGB7cn0KZGZfZW52IHw+IGZpbHRlcighKGlzbzJjICVpbiUgUkVHSU9OKSwgeWVhciA9PSAyMDE0KSB8PiAjIOWcsOWfn+S7peWklu+8iOWbveOBruOBv+mBuOaKnu+8iQogIGRyb3BfbmEoY28ycGNhcCwgZm9yZXN0LCByZW5ld2FibGUsIGZvc3NpbCwgbnVjbGVhcikgfD4gZmlsdGVyKG51Y2xlYXIgPjApIHw+CiAgc2VsZWN0KGNvMnBjYXAsIGZvcmVzdCwgcmVuZXdhYmxlLCBmb3NzaWwsIG51Y2xlYXIpIHw+IGNvcigpCmBgYAoKKirmsJfjgaXjgYTjgZ/jgZPjgajjg7vnlpHllY8qKgoKLSAgIOS4gOS6uuW9k+OBn+OCiuOBruS6jOmFuOWMlueCree0oOaOkuWHuumHj++8iGNvMnBjYXDvvInjgajjga7plqLkv4Ljgafjgb/jgovjgajjgIHlho3nlJ/lj6/og73jgqjjg43jg6vjgq7jg7zjgajjga7osqDjga7nm7jplqLjgYzmnIDlpKfjgafjgIHmrKHjgYzjgIHljJbnn7Pnh4Pmlpnjgajjga7mraPjga7nm7jplqLjgYzlvLfjgYTjgILljp/lrZDlipvjga/jgIHpnZ7luLjjgavlvLHjgYTmraPjga7nm7jplqLjgIHmo67mnpfjga7pnaLnqY3jga/jgIHlvLHjgYTosqDjga7nm7jplqLjgYzjgYLjgovjgILjgZPjgajjgYzjgo/jgYvjgovjgIIKCl/jgYLjgY/jgb7jgafjgoLjgIHnm7jplqLjgafjgYLjgorjgIHlm6DmnpzplqLkv4Ljgafjga/jgarjgYTjgILlho3nlJ/lj6/og73jgqjjg43jg6vjgq7jg7zjgpLlopfjgoTjgZfjgZ/jgorjgIHljJbnn7Pnh4Pmlpnjgavjgojjgovnmbrpm7vjgpLmuJvjgonjgZfjgZ/jgorjgIHmo67jgpLlopfjgoTjgZvjgbDjgIHkuozphbjljJbngq3ntKDmjpLlh7rph4/jgYzmuJvjgovjgajjgIHjgZPjgZPjgYvjgonntZDoq5bjgafjgY3jgovjgo/jgZHjgafjga/jgarjgYTjgILjgYLjgY/jgb7jgafjgoLjgIHljJbnn7Pnh4Pmlpnjga7nmbrpm7vjgYzlpJrjgYTlm73jga7jgbvjgYbjgYzjgIHkuozphbjljJbngq3ntKDmjpLlh7rph4/jgYzlpJrjgYTlgr7lkJHjgYzjgYLjgovjgajjgYTjgYbjgojjgYbjgarjgZPjgajjgYzopovjgablj5bjgozjgovjgZPjgajjgafjgYLjgovjgILnm7jplqLplqLkv4Ljga/lm6DmnpzplqLkv4LjgavjgYLjgonjgZrjgIJDb3JyZWxhdGlvbiBpcyBub3QgY2F1c2F0aW9uLl8KCgojIyDlm73jgajlnLDln58KCmNvdW50cnkg44Gr44Gv44CB5Zu944Go5Zyw5Z+f5Lih5pa544GM5YWl44Gj44Gm44GE44G+44GZ44CC5Zyw5Z+f44GuIGlzbzJjIOOBr+S7peS4i+OBruOCguOBruOBp+OBmeOAggoKYGBge3J9ClJFR0lPTiA8LSBjKCIxQSIsICIxVyIsICI0RSIsICI2RiIsICI2TiIsICI2WCIsICI3RSIsICI4UyIsICJBNCIsICJBNSIsIAoiQTkiLCAiQjEiLCAiQjIiLCAiQjMiLCAiQjQiLCAiQjYiLCAiQjciLCAiQjgiLCAiQzQiLCAiQzUiLCAiQzYiLCAKIkM3IiwgIkM4IiwgIkM5IiwgIkQyIiwgIkQzIiwgIkQ0IiwgIkQ1IiwgIkQ2IiwgIkQ3IiwgIkVVIiwgIkYxIiwgCiJGNiIsICJNMSIsICJNMiIsICJONiIsICJPRSIsICJSNiIsICJTMSIsICJTMiIsICJTMyIsICJTNCIsICJUMiIsIAoiVDMiLCAiVDQiLCAiVDUiLCAiVDYiLCAiVDciLCAiVjEiLCAiVjIiLCAiVjMiLCAiVjQiLCAiWEMiLCAiWEQiLCAKIlhFIiwgIlhGIiwgIlhHIiwgIlhIIiwgIlhJIiwgIlhKIiwgIlhMIiwgIlhNIiwgIlhOIiwgIlhPIiwgIlhQIiwgCiJYUSIsICJYVCIsICJYVSIsICJYWSIsICJaNCIsICJaNyIsICJaQiIsICJaRiIsICJaRyIsICJaSCIsICJaSSIsIAoiWkoiLCAiWlEiLCAiWlQiKQpgYGAKCiMjIyDlnLDln5/jga7jg6rjgrnjg4jjgpLooajnpLoKCmBgYHtyfQpkZl9lbnYgfD4gZmlsdGVyKGlzbzJjICVpbiUgUkVHSU9OKSB8PiBkaXN0aW5jdChjb3VudHJ5LCBpc28yYykKYGBgCgojIyMg5Zu95ZCN44Go44Gd44Gu5Zyw5Z+f44O75omA5b6X44Os44OZ44Or44KS6KGo56S6CgpgYGB7cn0KZGZfZW52IHw+IGZpbHRlcighKGlzbzJjICVpbiUgUkVHSU9OKSkgfD4gZGlzdGluY3QoY291bnRyeSwgaXNvMmMsIHJlZ2lvbiwgaW5jb21lKQpgYGAKCiMjIyDliIbmnpDjgZnjgovlm73jga7jg6rjgrnjg4gKCl/jgYTjgY/jgaTjgYvjga7lm73jga7jgrDjg6vjg7zjg5fjgavjgaTjgYTjgabjgIHlm73lkI3jgb7jgZ/jga/jgIFpc28yYyDjgb7jgZ/jga8gaXNvM2Mg44Gu44Oq44K544OI44KS5L2c5oiQ44GX44Gm44GK44GP44Go44CB5L6/5Yip44Gn44GZ44CC44Gd44Gu44Go44GN44Gr44CB5LiK44Gu44Oq44K544OI44Gv44CB5b2544Gr56uL44Gh44G+44GZ44CCXwoKQlJJQ1Mg44Go5ZG844Gw44KM44KL44CB44OW44Op44K444Or44CB44Ot44K344Ki44CB44Kk44Oz44OJ44CB5Lit5Zu944CB5Y2X44Ki44OV44Oq44Kr77yV44Kr5Zu944Gr44Gk44GE44Gm44OH44O844K/44KS44G/44KL44CCCgpgYGB7cn0KQlJJQ1MgPC0gYygiQnJhemlsIiwgIlJ1c3NpYW4gRmVkZXJhdGlvbiIsICJJbmRpYSIsICJDaGluYSIsICJTb3V0aCBBZnJpY2EiKQpgYGAKCuWbveWQjeOBp+OBr+OBquOBj+OAgWlzbzJjIOOBp+mBuOaKnuOBmeOCi+OBk+OBqOOCguWPr+iDveOAggoKYGBge3J9CmJyaWNzIDwtIGMoIkJSIiwiUlUiLCJJTiIsIkNOIiwiWkEiKQpgYGAKCiMjIOe1jOW5tOWkieWMluOCkuihqOOBmeaKmOe3muOCsOODqeODlQoKIyMjIOS4gOS6uuW9k+OBn+OCiuOBruS6jOmFuOWMlueCree0oOaOkuWHuumHjwoKIyMjIyBhLiDml6XmnKwKCmBgYHtyfQpkZl9lbnYgfD4gZmlsdGVyKGNvdW50cnkgPT0gIkphcGFuIikgfD4gZHJvcF9uYShjbzJwY2FwKSB8PgogIGdncGxvdChhZXMoeWVhciwgY28ycGNhcCkpICsgZ2VvbV9saW5lKCkKYGBgCgoqKuawl+OBpeOBhOOBn+OBk+OBqOODu+eWkeWVjyoqCgojIyMjIGIuIOmBuOaKnuOBl+OBn+WbveODu+WcsOWfnwoKYGBge3J9CmRmX2VudiB8PiBmaWx0ZXIoY291bnRyeSAlaW4lIEJSSUNTKSB8PiBkcm9wX25hKGNvMnBjYXApIHw+CiAgZ2dwbG90KGFlcyh5ZWFyLCBjbzJwY2FwLCBjb2wgPSBjb3VudHJ5KSkgKyBnZW9tX2xpbmUoKQpgYGAKCmlzbzJjIOOBriBicmljcyDjgafpgbjmip7jgZnjgovmmYLjga/jgIEKCmBgYHtyfQpkZl9lbnYgfD4gZmlsdGVyKGlzbzJjICVpbiUgYnJpY3MpIHw+IGRyb3BfbmEoY28ycGNhcCkgfD4KICBnZ3Bsb3QoYWVzKHllYXIsIGNvMnBjYXAsIGNvbCA9IGNvdW50cnkpKSArIGdlb21fbGluZSgpCmBgYAoK5Yeh5L6L44KC44CBSVNPMkMg6KGo56S644Gr44GZ44KL44GT44Go44KC5Y+v6IO944Gn44GZ44CCCgpgYGB7cn0KZGZfZW52IHw+IGZpbHRlcihpc28yYyAlaW4lIGJyaWNzKSB8PiBkcm9wX25hKGNvMnBjYXApIHw+CiAgZ2dwbG90KGFlcyh5ZWFyLCBjbzJwY2FwLCBjb2wgPSBpc28yYykpICsgZ2VvbV9saW5lKCkKYGBgCgoqKuawl+OBpeOBhOOBn+OBk+OBqOODu+eWkeWVjyoqCgojIyMg5qOu5p6X6Z2i56mNCgojIyMjIGEuIOaXpeacrAoKYGBge3J9CmRmX2VudiB8PiBmaWx0ZXIoY291bnRyeSA9PSAiSmFwYW4iKSB8PiBkcm9wX25hKGZvcmVzdCkgfD4KICBnZ3Bsb3QoYWVzKHllYXIsIGZvcmVzdCkpICsgZ2VvbV9saW5lKCkKYGBgCgoqKuawl+OBpeOBhOOBn+OBk+OBqOODu+eWkeWVjyoqCgojIyMjIGIuIOmBuOaKnuOBl+OBn+WbveODu+WcsOWfnwoKYGBge3J9CmRmX2VudiB8PiBmaWx0ZXIoY291bnRyeSAlaW4lIEJSSUNTKSB8PiBkcm9wX25hKGZvcmVzdCkgfD4KICBnZ3Bsb3QoYWVzKHllYXIsIGZvcmVzdCwgY29sID0gY291bnRyeSkpICsgZ2VvbV9saW5lKCkKYGBgCgoqKuawl+OBpeOBhOOBn+OBk+OBqOODu+eWkeWVjyoqCgojIyMg5YaN55Sf5Y+v6IO944Ko44ON44Or44Ku44O8CgojIyMjIGEuIOaXpeacrAoKYGBge3J9CmRmX2VudiB8PiBmaWx0ZXIoY291bnRyeSA9PSAiSmFwYW4iKSB8PiBkcm9wX25hKHJlbmV3YWJsZSkgfD4KICBnZ3Bsb3QoYWVzKHllYXIsIHJlbmV3YWJsZSkpICsgZ2VvbV9saW5lKCkKYGBgCgoqKuawl+OBpeOBhOOBn+OBk+OBqOODu+eWkeWVjyoqCgojIyMjIGIuIOmBuOaKnuOBl+OBn+WbveODu+WcsOWfnwoKYGBge3J9CmRmX2VudiB8PiBmaWx0ZXIoY291bnRyeSAlaW4lIEJSSUNTKSB8PiBkcm9wX25hKHJlbmV3YWJsZSkgfD4KICBnZ3Bsb3QoYWVzKHllYXIsIHJlbmV3YWJsZSwgY29sID0gY291bnRyeSkpICsgZ2VvbV9saW5lKCkKYGBgCgoqKuawl+OBpeOBhOOBn+OBk+OBqOODu+eWkeWVjyoqCgojIyMg5YyW55+z44Ko44ON44Or44Ku44O8CgojIyMjIGEuIOaXpeacrAoKYGBge3J9CmRmX2VudiB8PiBmaWx0ZXIoY291bnRyeSA9PSAiSmFwYW4iKSB8PiBkcm9wX25hKGZvc3NpbCkgfD4KICBnZ3Bsb3QoYWVzKHllYXIsIGZvc3NpbCkpICsgZ2VvbV9saW5lKCkKYGBgCgoqKuawl+OBpeOBhOOBn+OBk+OBqOODu+eWkeWVjyoqCgojIyMjIGIuIOmBuOaKnuOBl+OBn+WbveODu+WcsOWfnwoKYGBge3J9CmRmX2VudiB8PiBmaWx0ZXIoY291bnRyeSAlaW4lIEJSSUNTKSB8PiBkcm9wX25hKGZvc3NpbCkgfD4KICBnZ3Bsb3QoYWVzKHllYXIsIGZvc3NpbCwgY29sID0gY291bnRyeSkpICsgZ2VvbV9saW5lKCkKYGBgCgoqKuawl+OBpeOBhOOBn+OBk+OBqOODu+eWkeWVjyoqCgojIyMg5Y6f5a2Q5YqbCgojIyMjIGEuIOaXpeacrAoKYGBge3J9CmRmX2VudiB8PiBmaWx0ZXIoY291bnRyeSA9PSAiSmFwYW4iKSB8PiBkcm9wX25hKG51Y2xlYXIpIHw+CiAgZ2dwbG90KGFlcyh5ZWFyLCBudWNsZWFyKSkgKyBnZW9tX2xpbmUoKQpgYGAKCioq5rCX44Gl44GE44Gf44GT44Go44O755aR5ZWPKioKCiMjIyMgYi4g6YG45oqe44GX44Gf5Zu944O75Zyw5Z+fCgpgYGB7cn0KZGZfZW52IHw+IGZpbHRlcihjb3VudHJ5ICVpbiUgQlJJQ1MpIHw+IGRyb3BfbmEobnVjbGVhcikgfD4KICBnZ3Bsb3QoYWVzKHllYXIsIG51Y2xlYXIsIGNvbCA9IGNvdW50cnkpKSArIGdlb21fbGluZSgpCmBgYAoKKirmsJfjgaXjgYTjgZ/jgZPjgajjg7vnlpHllY8qKgoKIyMg55u46Zai44KS6KGo44GZ5pWj5biD5ZuzCgojIyMg5LiA5Lq65b2T44Gf44KK44Gu5LqM6YW45YyW54Kt57Sg5o6S5Ye66YeP44Go44CB5qOu5p6X6Z2i56mNCgpgYGB7cn0KZGZfZW52IHw+IGZpbHRlcighKGlzbzJjICVpbiUgUkVHSU9OKSkgfD4gZmlsdGVyKHllYXIgPT0gMjAxNCkgfD4gZHJvcF9uYShjbzJwY2FwLCBmb3Jlc3QpIHw+IAogIGdncGxvdChhZXMoZm9yZXN0LCBjbzJwY2FwKSkgKyBnZW9tX3BvaW50KGFlcyhjb2wgPSByZWdpb24pKSArCiAgZ2VvbV9zbW9vdGgoZm9ybXVsYSA9ICd5fngnLCBtZXRob2QgPSAibG0iLCBzZSA9IEZBTFNFKQpgYGAKCmBgYHtyfQpkZl9lbnYgfD4gZmlsdGVyKCEoaXNvMmMgJWluJSBSRUdJT04pKSB8PiBmaWx0ZXIoeWVhciA9PSAyMDE0KSB8PiBkcm9wX25hKGNvMnBjYXAsIGZvcmVzdCkgfD4gCiAgZ2dwbG90KGFlcyhmb3Jlc3QsIGNvMnBjYXApKSArIGdlb21fcG9pbnQoYWVzKGNvbCA9IGluY29tZSkpICsKICBnZW9tX3Ntb290aChmb3JtdWxhID0gJ3l+eCcsIG1ldGhvZCA9ICJsbSIsIHNlID0gRkFMU0UpCmBgYAoKKirmsJfjgaXjgYTjgZ/jgZPjgajjg7vnlpHllY8qKgoKIyMjIOS4gOS6uuW9k+OBn+OCiuOBruS6jOmFuOWMlueCree0oOaOkuWHuumHj+OBqOOAgeWGjeeUn+WPr+iDveOCqOODjeODq+OCruODvAoKYGBge3J9CmRmX2VudiB8PiBmaWx0ZXIoIShpc28yYyAlaW4lIFJFR0lPTikpIHw+IGZpbHRlcih5ZWFyID09IDIwMTQpIHw+IAogIGRyb3BfbmEoY28ycGNhcCwgcmVuZXdhYmxlKSB8PiAKICBnZ3Bsb3QoYWVzKHJlbmV3YWJsZSwgY28ycGNhcCkpICsgZ2VvbV9wb2ludChhZXMoY29sID0gcmVnaW9uKSkgKwogIGdlb21fc21vb3RoKGZvcm11bGEgPSAneX54JywgbWV0aG9kID0gImxtIiwgc2UgPSBGQUxTRSkKYGBgCgpgYGB7cn0KZGZfZW52IHw+IGZpbHRlcighKGlzbzJjICVpbiUgUkVHSU9OKSkgfD4gZmlsdGVyKHllYXIgPT0gMjAxNCkgfD4gCiAgZHJvcF9uYShjbzJwY2FwLCByZW5ld2FibGUpIHw+IAogIGdncGxvdChhZXMocmVuZXdhYmxlLCBjbzJwY2FwKSkgKyBnZW9tX3BvaW50KGFlcyhjb2wgPSBpbmNvbWUpKSArCiAgZ2VvbV9zbW9vdGgoZm9ybXVsYSA9ICd5fngnLCBtZXRob2QgPSAibG0iLCBzZSA9IEZBTFNFKQpgYGAKCioq5rCX44Gl44GE44Gf44GT44Go44O755aR5ZWPKioKCiMjIyDkuIDkurrlvZPjgZ/jgorjga7kuozphbjljJbngq3ntKDmjpLlh7rph4/jgajjgIHljJbnn7Pjgqjjg43jg6vjgq7jg7wKCmBgYHtyfQpkZl9lbnYgfD4gZmlsdGVyKCEoaXNvMmMgJWluJSBSRUdJT04pKSB8PiBmaWx0ZXIoeWVhciA9PSAyMDE0KSB8PiAKICBkcm9wX25hKGNvMnBjYXAsIGZvc3NpbCkgfD4gCiAgZ2dwbG90KGFlcyhmb3NzaWwsIGNvMnBjYXApKSArIGdlb21fcG9pbnQoYWVzKGNvbCA9IHJlZ2lvbikpICsKICBnZW9tX3Ntb290aChmb3JtdWxhID0gJ3l+eCcsIG1ldGhvZCA9ICJsbSIsIHNlID0gRkFMU0UpCmBgYAoKYGBge3J9CmRmX2VudiB8PiBmaWx0ZXIoIShpc28yYyAlaW4lIFJFR0lPTikpIHw+IGZpbHRlcih5ZWFyID09IDIwMTQpIHw+IAogIGRyb3BfbmEoY28ycGNhcCwgZm9zc2lsKSB8PiAKICBnZ3Bsb3QoYWVzKGZvc3NpbCwgY28ycGNhcCkpICsgZ2VvbV9wb2ludChhZXMoY29sID0gaW5jb21lKSkgKwogIGdlb21fc21vb3RoKGZvcm11bGEgPSAneX54JywgbWV0aG9kID0gImxtIiwgc2UgPSBGQUxTRSkKYGBgCgoqKuawl+OBpeOBhOOBn+OBk+OBqOODu+eWkeWVjyoqCgojIyMg5LiA5Lq65b2T44Gf44KK44Gu5LqM6YW45YyW54Kt57Sg5o6S5Ye66YeP44Go44CB5Y6f5a2Q5YqbCgpgYGB7cn0KZGZfZW52IHw+IGZpbHRlcighKGlzbzJjICVpbiUgUkVHSU9OKSkgfD4gZmlsdGVyKHllYXIgPT0gMjAxNCkgfD4gCiAgZHJvcF9uYShjbzJwY2FwLCBudWNsZWFyKSB8PiAKICBnZ3Bsb3QoYWVzKG51Y2xlYXIsIGNvMnBjYXApKSArIGdlb21fcG9pbnQoYWVzKGNvbCA9IHJlZ2lvbikpICsKICBnZW9tX3Ntb290aChmb3JtdWxhID0gJ3l+eCcsIG1ldGhvZCA9ICJsbSIsIHNlID0gRkFMU0UpCmBgYAoKYGBge3J9CmRmX2VudiB8PiBmaWx0ZXIoIShpc28yYyAlaW4lIFJFR0lPTikpIHw+IGZpbHRlcih5ZWFyID09IDIwMTQpIHw+IAogIGRyb3BfbmEoY28ycGNhcCwgbnVjbGVhcikgfD4gZmlsdGVyKG51Y2xlYXIgPjApIHw+CiAgZ2dwbG90KGFlcyhudWNsZWFyLCBjbzJwY2FwKSkgKyBnZW9tX3BvaW50KGFlcyhjb2wgPSBpbmNvbWUpKSArCiAgZ2VvbV9zbW9vdGgoZm9ybXVsYSA9ICd5fngnLCBtZXRob2QgPSAibG0iLCBzZSA9IEZBTFNFKQpgYGAKCioq5rCX44Gl44GE44Gf44GT44Go44O755aR5ZWPKioKCiMjIyDmo67mnpfpnaLnqY3jgajjgIHlho3nlJ/lj6/og73jgqjjg43jg6vjgq7jg7wKCmBgYHtyfQpkZl9lbnYgfD4gZmlsdGVyKCEoaXNvMmMgJWluJSBSRUdJT04pKSB8PiBmaWx0ZXIoeWVhciA9PSAyMDE0KSB8PiAKICBkcm9wX25hKGZvcmVzdCwgcmVuZXdhYmxlKSB8PiAKICBnZ3Bsb3QoYWVzKHJlbmV3YWJsZSwgZm9yZXN0KSkgKyBnZW9tX3BvaW50KGFlcyhjb2wgPSByZWdpb24pKSArCiAgZ2VvbV9zbW9vdGgoZm9ybXVsYSA9ICd5fngnLCBtZXRob2QgPSAibG0iLCBzZSA9IEZBTFNFKQpgYGAKCmBgYHtyfQpkZl9lbnYgfD4gZmlsdGVyKCEoaXNvMmMgJWluJSBSRUdJT04pKSB8PiBmaWx0ZXIoeWVhciA9PSAyMDE0KSB8PiAKICBkcm9wX25hKGZvcmVzdCwgcmVuZXdhYmxlKSB8PiAKICBnZ3Bsb3QoYWVzKHJlbmV3YWJsZSwgZm9yZXN0KSkgKyBnZW9tX3BvaW50KGFlcyhjb2wgPSBpbmNvbWUpKSArCiAgZ2VvbV9zbW9vdGgoZm9ybXVsYSA9ICd5fngnLCBtZXRob2QgPSAibG0iLCBzZSA9IEZBTFNFKQpgYGAKCioq5rCX44Gl44GE44Gf44GT44Go44O755aR5ZWPKioKCiMjIyDmo67mnpfpnaLnqY3jgajjgIHljJbnn7Pjgqjjg43jg6vjgq7jg7wKCmBgYHtyfQpkZl9lbnYgfD4gZmlsdGVyKCEoaXNvMmMgJWluJSBSRUdJT04pKSB8PiBmaWx0ZXIoeWVhciA9PSAyMDE0KSB8PiAKICBkcm9wX25hKGZvc3NpbCwgZm9yZXN0KSB8PiAKICBnZ3Bsb3QoYWVzKGZvc3NpbCwgZm9yZXN0KSkgKyBnZW9tX3BvaW50KGFlcyhjb2wgPSByZWdpb24pKSArCiAgZ2VvbV9zbW9vdGgoZm9ybXVsYSA9ICd5fngnLCBtZXRob2QgPSAibG0iLCBzZSA9IEZBTFNFKQpgYGAKCmBgYHtyfQpkZl9lbnYgfD4gZmlsdGVyKCEoaXNvMmMgJWluJSBSRUdJT04pKSB8PiBmaWx0ZXIoeWVhciA9PSAyMDE0KSB8PiAKICBkcm9wX25hKGZvc3NpbCwgZm9yZXN0KSB8PiAKICBnZ3Bsb3QoYWVzKGZvc3NpbCwgZm9yZXN0KSkgKyBnZW9tX3BvaW50KGFlcyhjb2wgPSBpbmNvbWUpKSArCiAgZ2VvbV9zbW9vdGgoZm9ybXVsYSA9ICd5fngnLCBtZXRob2QgPSAibG0iLCBzZSA9IEZBTFNFKQpgYGAKCioq5rCX44Gl44GE44Gf44GT44Go44O755aR5ZWPKioKCiMjIyDmo67mnpfpnaLnqY3jgajjgIHljp/lrZDlipsKCmBgYHtyfQpkZl9lbnYgfD4gZmlsdGVyKCEoaXNvMmMgJWluJSBSRUdJT04pKSB8PiBmaWx0ZXIoeWVhciA9PSAyMDE0KSB8PiAKICBkcm9wX25hKG51Y2xlYXIsIGZvcmVzdCkgfD4gCiAgZ2dwbG90KGFlcyhmb3Jlc3QsIG51Y2xlYXIpKSArIGdlb21fcG9pbnQoYWVzKGNvbCA9IHJlZ2lvbikpICsKICBnZW9tX3Ntb290aChmb3JtdWxhID0gJ3l+eCcsIG1ldGhvZCA9ICJsbSIsIHNlID0gRkFMU0UpCmBgYAoKYGBge3J9CmRmX2VudiB8PiBmaWx0ZXIoIShpc28yYyAlaW4lIFJFR0lPTikpIHw+IGZpbHRlcih5ZWFyID09IDIwMTQpIHw+IAogIGRyb3BfbmEobnVjbGVhciwgZm9yZXN0KSB8PiBmaWx0ZXIobnVjbGVhciA+MCkgfD4KICBnZ3Bsb3QoYWVzKGZvcmVzdCwgbnVjbGVhcikpICsgZ2VvbV9wb2ludChhZXMoY29sID0gaW5jb21lKSkgKwogIGdlb21fc21vb3RoKGZvcm11bGEgPSAneX54JywgbWV0aG9kID0gImxtIiwgc2UgPSBGQUxTRSkKYGBgCgoqKuawl+OBpeOBhOOBn+OBk+OBqOODu+eWkeWVjyoqCgojIyMg5YaN55Sf5Y+v6IO944Ko44ON44Or44Ku44O844Go44CB5YyW55+z44Ko44ON44Or44Ku44O8CgpgYGB7cn0KZGZfZW52IHw+IGZpbHRlcighKGlzbzJjICVpbiUgUkVHSU9OKSkgfD4gZmlsdGVyKHllYXIgPT0gMjAxNCkgfD4gCiAgZHJvcF9uYShmb3NzaWwsIHJlbmV3YWJsZSkgfD4gCiAgZ2dwbG90KGFlcyhyZW5ld2FibGUsIGZvc3NpbCkpICsgZ2VvbV9wb2ludChhZXMoY29sID0gcmVnaW9uKSkgKwogIGdlb21fc21vb3RoKGZvcm11bGEgPSAneX54JywgbWV0aG9kID0gImxtIiwgc2UgPSBGQUxTRSkKYGBgCgpgYGB7cn0KZGZfZW52IHw+IGZpbHRlcighKGlzbzJjICVpbiUgUkVHSU9OKSkgfD4gZmlsdGVyKHllYXIgPT0gMjAxNCkgfD4gCiAgZHJvcF9uYShmb3NzaWwsIHJlbmV3YWJsZSkgfD4gCiAgZ2dwbG90KGFlcyhyZW5ld2FibGUsIGZvc3NpbCkpICsgZ2VvbV9wb2ludChhZXMoY29sID0gaW5jb21lKSkgKwogIGdlb21fc21vb3RoKGZvcm11bGEgPSAneX54JywgbWV0aG9kID0gImxtIiwgc2UgPSBGQUxTRSkKYGBgCgoqKuawl+OBpeOBhOOBn+OBk+OBqOODu+eWkeWVjyoqCgojIyMg5YaN55Sf5Y+v6IO944Ko44ON44Or44Ku44O844Go44CB5Y6f5a2Q5YqbCgpgYGB7cn0KZGZfZW52IHw+IGZpbHRlcighKGlzbzJjICVpbiUgUkVHSU9OKSkgfD4gZmlsdGVyKHllYXIgPT0gMjAxNCkgfD4gCiAgZHJvcF9uYShudWNsZWFyLCByZW5ld2FibGUpIHw+IAogIGdncGxvdChhZXMocmVuZXdhYmxlLCBudWNsZWFyKSkgKyBnZW9tX3BvaW50KGFlcyhjb2wgPSByZWdpb24pKSArCiAgZ2VvbV9zbW9vdGgoZm9ybXVsYSA9ICd5fngnLCBtZXRob2QgPSAibG0iLCBzZSA9IEZBTFNFKQpgYGAKCmBgYHtyfQpkZl9lbnYgfD4gZmlsdGVyKCEoaXNvMmMgJWluJSBSRUdJT04pKSB8PiBmaWx0ZXIoeWVhciA9PSAyMDE0KSB8PiAKICBkcm9wX25hKG51Y2xlYXIsIHJlbmV3YWJsZSkgfD4gZmlsdGVyKG51Y2xlYXIgPjApIHw+CiAgZ2dwbG90KGFlcyhyZW5ld2FibGUsIG51Y2xlYXIpKSArIGdlb21fcG9pbnQoYWVzKGNvbCA9IGluY29tZSkpICsKICBnZW9tX3Ntb290aChmb3JtdWxhID0gJ3l+eCcsIG1ldGhvZCA9ICJsbSIsIHNlID0gRkFMU0UpCmBgYAoKKirmsJfjgaXjgYTjgZ/jgZPjgajjg7vnlpHllY8qKgoKIyMjIOWMluefs+OCqOODjeODq+OCruODvOOBqOOAgeWOn+WtkOWKmwoKYGBge3J9CmRmX2VudiB8PiBmaWx0ZXIoIShpc28yYyAlaW4lIFJFR0lPTikpIHw+IGZpbHRlcih5ZWFyID09IDIwMTQpIHw+IAogIGRyb3BfbmEoZm9zc2lsLCBudWNsZWFyKSB8PiAKICBnZ3Bsb3QoYWVzKGZvc3NpbCwgbnVjbGVhcikpICsgZ2VvbV9wb2ludChhZXMoY29sID0gcmVnaW9uKSkgKwogIGdlb21fc21vb3RoKGZvcm11bGEgPSAneX54JywgbWV0aG9kID0gImxtIiwgc2UgPSBGQUxTRSkKYGBgCgpgYGB7cn0KZGZfZW52IHw+IGZpbHRlcighKGlzbzJjICVpbiUgUkVHSU9OKSkgfD4gZmlsdGVyKHllYXIgPT0gMjAxNCkgfD4gCiAgZHJvcF9uYShmb3NzaWwsIG51Y2xlYXIpIHw+IGZpbHRlcihudWNsZWFyID4wKSB8PgogIGdncGxvdChhZXMoZm9zc2lsLCBudWNsZWFyKSkgKyBnZW9tX3BvaW50KGFlcyhjb2wgPSBpbmNvbWUpKSArCiAgZ2VvbV9zbW9vdGgoZm9ybXVsYSA9ICd5fngnLCBtZXRob2QgPSAibG0iLCBzZSA9IEZBTFNFKQpgYGAKCioq5rCX44Gl44GE44Gf44GT44Go44O755aR5ZWPKioKCiMjIOWPguiAgwoKYGBge3J9CmRmX2Vudl9sb25nIDwtIGRmX2VudiB8PiBwaXZvdF9sb25nZXIoYyhyZW5ld2FibGUsIGZvc3NpbCwgbnVjbGVhcikpCmRmX2Vudl9sb25nCmBgYAoKYGBge3J9CmRmX2Vudl9sb25nIHw+IGZpbHRlcihjb3VudHJ5ID09ICJKYXBhbiIpIHw+IGRyb3BfbmEodmFsdWUpIHw+CiAgZ2dwbG90KGFlcyh5ZWFyLCB2YWx1ZSwgZmlsbCA9IG5hbWUpKSArIGdlb21fYXJlYShjb2wgPSAiYmxhY2siLCBsaW5ld2lkdGggPSAwLjIpCmBgYAoKYGBge3J9CmRmX2Vudl9sb25nIHw+IGZpbHRlcihjb3VudHJ5ID09ICJXb3JsZCIpIHw+IGRyb3BfbmEodmFsdWUpIHw+CiAgZ2dwbG90KGFlcyh5ZWFyLCB2YWx1ZSwgZmlsbCA9IG5hbWUpKSArIGdlb21fYXJlYShjb2wgPSAiYmxhY2siLCBsaW5ld2lkdGggPSAwLjIpCmBgYAoKYGBge3J9CmRmX2VudiB8PiBmaWx0ZXIocmVnaW9uICE9ICJBZ2dyZWdhdGVzIiwgIWlzLm5hKHJlZ2lvbikpIHw+IGRpc3RpbmN0KHJlZ2lvbikgfD4gZHB1dCgpCmBgYApgYGB7cn0KcmVnaW9ucyA8LSBjKCJTb3V0aCBBc2lhIiwgIkV1cm9wZSAmIENlbnRyYWwgQXNpYSIsIAoiTWlkZGxlIEVhc3QgJiBOb3J0aCBBZnJpY2EiLCAiRWFzdCBBc2lhICYgUGFjaWZpYyIsICJTdWItU2FoYXJhbiBBZnJpY2EiLCAKIkxhdGluIEFtZXJpY2EgJiBDYXJpYmJlYW4iLCAiTm9ydGggQW1lcmljYSIpCmBgYAoKYGBge3J9CmRmX2Vudl9sb25nIHw+IGZpbHRlcihjb3VudHJ5ICVpbiUgcmVnaW9ucykgfD4gZmlsdGVyKHllYXIgPj0gMTk5MCkgfD4gZHJvcF9uYSh2YWx1ZSkgfD4KICBnZ3Bsb3QoYWVzKHllYXIsIHZhbHVlLCBmaWxsID0gbmFtZSkpICsgZ2VvbV9hcmVhKGNvbCA9ICJibGFjayIsIGxpbmV3aWR0aCA9IDAuMikgKwogIGZhY2V0X3dyYXAofmNvdW50cnkpCmBgYAoKCg==