Licença

This work is licensed under the Creative Commons Attribution-ShareAlike 4.0 International License. To view a copy of this license, visit http://creativecommons.org/licenses/by-sa/4.0/ or send a letter to Creative Commons, PO Box 1866, Mountain View, CA 94042, USA.

License: CC BY-SA 4.0

Citação

Sugestão de citação: FIGUEIREDO, Adriano Marcos Rodrigues. MRIO_Exemplo de Porsse e Vale 2020. Campo Grande-MS, Brasil: RStudio/Rpubs, 2021. Disponível em https://rpubs.com/amrofi/mrio_exemplo.

1 Chamar pacotes e dados

Os dados originais vieram de Porsse e Vale (2020) como na figura, e dados originais em Miller e Blair (2009, p.82).

Fonte: Miller e Blair (2009) citados por Porsse e Vale (2020).

#
# Exemplo com duas regioes L e M 
# 3 (três) setores produtivos em L
# 2 (dois) setores produtivos em M
# apenas DF= demanda final total
# apens VA = valor adicionado total
#

library(openxlsx)
library(knitr)
library(kableExtra)
library(dplyr)
## 
## Attaching package: 'dplyr'
## The following object is masked from 'package:kableExtra':
## 
##     group_rows
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
library(ggplot2)
library(scales)
library(ggrepel)
library(tibble)
library(gridExtra)
## 
## Attaching package: 'gridExtra'
## The following object is masked from 'package:dplyr':
## 
##     combine
# Importando dados com o pacote openxls
# Consumo intermediário 
Z <- read.xlsx("EXEMPLO_MRIO.xlsx", sheet = "Z", colNames = FALSE)
print(Z)
##    X1  X2  X3  X4  X5
## 1 150 500  50  25  75
## 2 200 100 400 200 100
## 3 300 500  50  60  40
## 4  75 100  60 200 250
## 5  50  25  25 150 100
# Demanda final total
y <- read.xlsx("EXEMPLO_MRIO.xlsx", sheet = "y", colNames = FALSE) 
print(y)
##     X1
## 1  200
## 2 1000
## 3   50
## 4  515
## 5  450
# Valor Bruto da Produção (VBP)
x = read.xlsx("EXEMPLO_MRIO.xlsx", sheet = "x", colNames = FALSE)
print(x)
##     X1
## 1 1000
## 2 2000
## 3 1000
## 4 1200
## 5  800
# Valor adicionado total
v = read.xlsx("EXEMPLO_MRIO.xlsx", sheet = "v", colNames = FALSE) # Valor adicionado
print(v)
##    X1
## 1 225
## 2 775
## 3 415
## 4 565
## 5 235
Setores = read.xlsx("EXEMPLO_MRIO.xlsx", sheet = "set", colNames = FALSE) # Setores
print(Setores)
##   X1
## 1 s1
## 2 s2
## 3 s3
class(Z) # Verificar classe do objeto Z [1] "data.frame"
## [1] "data.frame"
class(y)
## [1] "data.frame"
# Mudar classe dos objetos
Z = data.matrix(Z) # Consumo intermediário
y = data.matrix(y) # Demanda final
x = data.matrix(x) # Valor Bruto da Produção
x = as.vector(x)   # Valor Bruto da Produção
v = data.matrix(v) # Valor adicionado

class(x)
## [1] "numeric"
x = as.vector(x)
class(v)
## [1] "matrix" "array"
# Salvar base de dados no formato RData
save(Z, y, x, v, file = "EXEMPLO_MRIO.RData")

2 Modelo Regional Insumo-Produto

2.1 Modelo aberto

O script desenvolve os cálculos em R e os resultados saem como em Miller e Blair (2009, p.83), respectivamente para a matriz de coeficientes técnicos, A, e a matriz inversa de Leontief, L, para o agregado.

Fonte: Miller e Blair (2009, p.83).

Fonte: Miller e Blair (2009, p.83).

# L <-Z %*% diag(c(1/X))
A = Z %*% diag(c(1 / x)) # Matriz de coeficientes técnicos
writexl::write_xlsx(x=data.frame(A),"A.xlsx")
print(A)
##    [,1]   [,2]  [,3]       [,4]    [,5]
## 1 0.150 0.2500 0.050 0.02083333 0.09375
## 2 0.200 0.0500 0.400 0.16666667 0.12500
## 3 0.300 0.2500 0.050 0.05000000 0.05000
## 4 0.075 0.0500 0.060 0.16666667 0.31250
## 5 0.050 0.0125 0.025 0.12500000 0.12500
n = length(x) # Número de setores
I = diag(n) # Matriz identidade
print(I) # Matriz identidade
##      [,1] [,2] [,3] [,4] [,5]
## [1,]    1    0    0    0    0
## [2,]    0    1    0    0    0
## [3,]    0    0    1    0    0
## [4,]    0    0    0    1    0
## [5,]    0    0    0    0    1
# atentar para notação da matriz Leontief como B e não L
# **em alguns pacotes B será a matriz de Gosh**
# 
B = solve(I - A) # Matriz inversa de Leontief
#View(B) # Matriz inversa de Leontief
print(B)
##              1         2          3         4         5
## [1,] 1.4234091 0.4652263 0.29090939 0.1916932 0.3040543
## [2,] 0.6346126 1.4236653 0.67067995 0.4092164 0.4558483
## [3,] 0.6382907 0.5368698 1.33625161 0.2501219 0.3107705
## [4,] 0.2671947 0.2000077 0.19734869 1.3406125 0.5472678
## [5,] 0.1468111 0.0908341 0.09257582 0.2154623 1.2538041

3 Automatizar pelo ioanalysis

library(ioanalysis)
## Loading required package: plot3D
## Loading required package: lpSolve
RS_label = read.xlsx("EXEMPLO_MRIO.xlsx", sheet = "RS_label", colNames = FALSE) # "RS_label"
# V_label 1x1
V_label<-matrix(rep(c("VAtotal"),5),ncol = 1)
# f_label
label <- c("DT")
region <- c("L","M")
f_label <- rbind(region, label)
# 
# objeto inputoutput do ioanalysis
mrio_exemplo<-as.inputoutput(Z=Z,RS_label =RS_label,#f=y,f_label = f_label,
               X=x)#,V=v,V_label =V_label)
## 
##   Final Demand matrix (f) was not provided. Calculating aggregate Final Demand...
key1 <- key.sector(mrio_exemplo,
                   ES = NULL, crit = 3, regions = "all", sectors = "all", 
                   type = c("direct","total"), intra.inter = T)
# resultados não-normalizados
# lembrar que o ioanalysis faz FL com a matriz de Gosh
print(key1$L)
##    BL.intra.dir FL.intra.dir key.intra.dir BL.inter.dir FL.inter.dir
## s1         0.65         0.70             I       0.1250         0.10
## s2         0.55         0.35             I       0.0625         0.15
## s3         0.50         0.85             I       0.0850         0.10
##    key.inter.dir BL.agg.dir FL.agg.dir key.agg.dir BL.intra.tot FL.intra.tot
## s1             I     0.7750       0.80           I     2.696312     2.644771
## s2             I     0.6125       0.50           I     2.425761     2.076312
## s3             I     0.5850       0.95           I     2.297841     3.048282
##    key.intra.tot BL.inter.tot FL.inter.tot key.inter.tot BL.agg.tot FL.agg.tot
## s1             I    0.4140058    0.4732752             I   3.110318   3.118046
## s2             I    0.2908418    0.4278691             I   2.716603   2.504181
## s3            II    0.2899245    0.5487626             I   2.587765   3.597045
##    key.agg.tot
## s1         III
## s2           I
## s3          II
print(key1$M)
##    BL.intra.dir FL.intra.dir key.intra.dir BL.inter.dir FL.inter.dir
## s1    0.2916667       0.3750             I      0.23750    0.1958333
## s2    0.4375000       0.3125             I      0.26875    0.1250000
##    key.inter.dir BL.agg.dir FL.agg.dir key.agg.dir BL.intra.tot FL.intra.tot
## s1             I  0.5291667  0.5708333           I     1.556075     1.705458
## s2             I  0.7062500  0.4375000           I     1.801072     1.576997
##    key.intra.tot BL.inter.tot FL.inter.tot key.inter.tot BL.agg.tot FL.agg.tot
## s1             I    0.8510315    0.7204656             I   2.407106   2.425923
## s2             I    1.0706730    0.5263189             I   2.871745   2.103316
##    key.agg.tot
## s1           I
## s2           I
print(mrio_exemplo$B)
##          X1         X2      X3        X4        X5
## [1,] 0.1500 0.50000000 0.05000 0.0250000 0.0750000
## [2,] 0.1000 0.05000000 0.20000 0.1000000 0.0500000
## [3,] 0.3000 0.50000000 0.05000 0.0600000 0.0400000
## [4,] 0.0625 0.08333333 0.05000 0.1666667 0.2083333
## [5,] 0.0625 0.03125000 0.03125 0.1875000 0.1250000
print(mrio_exemplo$G)
##         [,1]      [,2]      [,3]      [,4]      [,5]
## X1 1.4234091 0.9304526 0.2909094 0.2300318 0.2432434
## X2 0.3173063 1.4236653 0.3353400 0.2455298 0.1823393
## X3 0.6382907 1.0737396 1.3362516 0.3001463 0.2486164
## X4 0.2226622 0.3333462 0.1644572 1.3406125 0.3648452
## X5 0.1835139 0.2270853 0.1157198 0.3231934 1.2538041
# resultados não-normalizados
key2<-linkages(mrio_exemplo,
               ES = NULL, regions = "all", sectors = "all",
               type = c("direct","total"), intra.inter = T,
               normalize = F)
knitr::kable(cbind(RS_label,
                   rbind(as.data.frame(round(key2$L,3)),as.data.frame(round(key2$M,3)))))
X1 X2 BL.intra.dir FL.intra.dir BL.inter.dir FL.inter.dir BL.agg.dir FL.agg.dir BL.intra.tot FL.intra.tot BL.inter.tot FL.inter.tot BL.agg.tot FL.agg.tot
L s1 0.650 0.700 0.125 0.100 0.775 0.800 2.696 2.645 0.414 0.473 3.110 3.118
L s2 0.550 0.350 0.062 0.150 0.613 0.500 2.426 2.076 0.291 0.428 2.717 2.504
L s3 0.500 0.850 0.085 0.100 0.585 0.950 2.298 3.048 0.290 0.549 2.588 3.597
M s1 0.292 0.375 0.238 0.196 0.529 0.571 1.556 1.705 0.851 0.720 2.407 2.426
M s2 0.438 0.312 0.269 0.125 0.706 0.438 1.801 1.577 1.071 0.526 2.872 2.103
#
#multiplicadores
mult=ioanalysis::multipliers(mrio_exemplo,multipliers = c("output","input"))
tabela<-rbind(round(mult$L,3),round(mult$M,3))
tabela<-cbind(RS_label, tabela)
tabela
# Total field of influence
fit = f.influence.total(mrio_exemplo)                       
heatmap.io(fit, RS_label, low = '#00fcef', high = 'blueviolet')

p<-heatmap.io(fit, RS_label, low = '#00fcef', high = 'blueviolet',
              FUN = NULL, max = 12)
p

heatmap.io(fit, RS_label)

4 Referências

MILLER, R.E.; BLAIR, P.D. Input–Output Analysis: Foundations and Extensions, 2nd ed. Cambridge: Cambridge University Press, 2009.

PORSSE, A.; VALE, V. Insumo-Produto: Modelos Inter-regionais. Curitiba: NEDUR-UFPR,2020. Disponível em: http://www.nedur.ufpr.br/portal/wp-content/uploads/2020/08/09-insumo-produto-modelos-inter-regionais.pdf.

LS0tDQp0aXRsZTogIk1SSU9fRXhlbXBsbyBkZSBQb3Jzc2UgZSBWYWxlIDIwMjAiDQphdXRob3I6ICJBZHJpYW5vIE1hcmNvcyBSb2RyaWd1ZXMgRmlndWVpcmVkbywgKmUtbWFpbDogYWRyaWFuby5maWd1ZWlyZWRvQHVmbXMuYnIqIg0KZGF0ZTogImByIGZvcm1hdChTeXMuRGF0ZSgpLCAnJWQgJUIgJVknKWAiDQpvdXRwdXQ6DQogIGh0bWxfZG9jdW1lbnQ6DQogICAgY29kZV9kb3dubG9hZDogeWVzDQogICAgdGhlbWU6IGRlZmF1bHQNCiAgICBudW1iZXJfc2VjdGlvbnM6IHllcw0KICAgIHRvYzogeWVzDQogICAgdG9jX2Zsb2F0OiB5ZXMNCiAgICBkZl9wcmludDogcGFnZWQNCiAgICBmaWdfY2FwdGlvbjogeWVzDQotLS0NCg0KYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9DQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUpDQpgYGANCg0KIyBMaWNlbsOnYSB7I0xpY2Vuw6dhIC51bm51bWJlcmVkfQ0KDQpUaGlzIHdvcmsgaXMgbGljZW5zZWQgdW5kZXIgdGhlIENyZWF0aXZlIENvbW1vbnMgQXR0cmlidXRpb24tU2hhcmVBbGlrZSA0LjAgSW50ZXJuYXRpb25hbCBMaWNlbnNlLiBUbyB2aWV3IGEgY29weSBvZiB0aGlzIGxpY2Vuc2UsIHZpc2l0IDxodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9saWNlbnNlcy9ieS1zYS80LjAvPiBvciBzZW5kIGEgbGV0dGVyIHRvIENyZWF0aXZlIENvbW1vbnMsIFBPIEJveCAxODY2LCBNb3VudGFpbiBWaWV3LCBDQSA5NDA0MiwgVVNBLg0KDQohW0xpY2Vuc2U6IENDIEJZLVNBIDQuMF0oaHR0cHM6Ly9taXJyb3JzLmNyZWF0aXZlY29tbW9ucy5vcmcvcHJlc3NraXQvYnV0dG9ucy84OHgzMS9wbmcvYnktc2EucG5nKXt3aWR0aD0iMjUlIn0NCg0KDQojIENpdGHDp8OjbyB7I0NpdGHDp8OjbyAudW5udW1iZXJlZH0NCg0KU3VnZXN0w6NvIGRlIGNpdGHDp8OjbzogRklHVUVJUkVETywgQWRyaWFubyBNYXJjb3MgUm9kcmlndWVzLiBNUklPX0V4ZW1wbG8gZGUgUG9yc3NlIGUgVmFsZSAyMDIwLiBDYW1wbyBHcmFuZGUtTVMsIEJyYXNpbDogUlN0dWRpby9ScHVicywgMjAyMS4gRGlzcG9uw612ZWwgZW0gPGh0dHBzOi8vcnB1YnMuY29tL2Ftcm9maS9tcmlvX2V4ZW1wbG8+Lg0KDQojIENoYW1hciBwYWNvdGVzIGUgZGFkb3MNCg0KT3MgZGFkb3Mgb3JpZ2luYWlzIHZpZXJhbSBkZSBQb3Jzc2UgZSBWYWxlICgyMDIwKSBjb21vIG5hIGZpZ3VyYSwgZSBkYWRvcyBvcmlnaW5haXMgZW0gTWlsbGVyIGUgQmxhaXIgKDIwMDksIHAuODIpLg0KDQpbIVtGb250ZTogTWlsbGVyIGUgQmxhaXIgKDIwMDkpIGNpdGFkb3MgcG9yIFBvcnNzZSBlIFZhbGUgKDIwMjApLl0oU2lzdGVtYV9NUklPX2V4ZW1wbG8ucG5nICJTaXN0ZW1hIGludGVyLXJlZ2lvbmFsIGNvbSAyIHJlZ2nDtWVzIChMIGUgTSkgZSBzZXRvcmVzIGRpZmVyZW50ZXMgZW0gY2FkYSB1bWEuIildKGh0dHA6Ly93d3cubmVkdXIudWZwci5ici9wb3J0YWwvd3AtY29udGVudC91cGxvYWRzLzIwMjAvMDgvMDktaW5zdW1vLXByb2R1dG8tbW9kZWxvcy1pbnRlci1yZWdpb25haXMucGRmKQ0KDQpgYGB7cn0NCiMNCiMgRXhlbXBsbyBjb20gZHVhcyByZWdpb2VzIEwgZSBNIA0KIyAzICh0csOqcykgc2V0b3JlcyBwcm9kdXRpdm9zIGVtIEwNCiMgMiAoZG9pcykgc2V0b3JlcyBwcm9kdXRpdm9zIGVtIE0NCiMgYXBlbmFzIERGPSBkZW1hbmRhIGZpbmFsIHRvdGFsDQojIGFwZW5zIFZBID0gdmFsb3IgYWRpY2lvbmFkbyB0b3RhbA0KIw0KDQpsaWJyYXJ5KG9wZW54bHN4KQ0KbGlicmFyeShrbml0cikNCmxpYnJhcnkoa2FibGVFeHRyYSkNCmxpYnJhcnkoZHBseXIpDQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KHNjYWxlcykNCmxpYnJhcnkoZ2dyZXBlbCkNCmxpYnJhcnkodGliYmxlKQ0KbGlicmFyeShncmlkRXh0cmEpDQoNCiMgSW1wb3J0YW5kbyBkYWRvcyBjb20gbyBwYWNvdGUgb3Blbnhscw0KIyBDb25zdW1vIGludGVybWVkacOhcmlvIA0KWiA8LSByZWFkLnhsc3goIkVYRU1QTE9fTVJJTy54bHN4Iiwgc2hlZXQgPSAiWiIsIGNvbE5hbWVzID0gRkFMU0UpDQpwcmludChaKQ0KIyBEZW1hbmRhIGZpbmFsIHRvdGFsDQp5IDwtIHJlYWQueGxzeCgiRVhFTVBMT19NUklPLnhsc3giLCBzaGVldCA9ICJ5IiwgY29sTmFtZXMgPSBGQUxTRSkgDQpwcmludCh5KQ0KIyBWYWxvciBCcnV0byBkYSBQcm9kdcOnw6NvIChWQlApDQp4ID0gcmVhZC54bHN4KCJFWEVNUExPX01SSU8ueGxzeCIsIHNoZWV0ID0gIngiLCBjb2xOYW1lcyA9IEZBTFNFKQ0KcHJpbnQoeCkNCiMgVmFsb3IgYWRpY2lvbmFkbyB0b3RhbA0KdiA9IHJlYWQueGxzeCgiRVhFTVBMT19NUklPLnhsc3giLCBzaGVldCA9ICJ2IiwgY29sTmFtZXMgPSBGQUxTRSkgIyBWYWxvciBhZGljaW9uYWRvDQpwcmludCh2KQ0KU2V0b3JlcyA9IHJlYWQueGxzeCgiRVhFTVBMT19NUklPLnhsc3giLCBzaGVldCA9ICJzZXQiLCBjb2xOYW1lcyA9IEZBTFNFKSAjIFNldG9yZXMNCnByaW50KFNldG9yZXMpDQpjbGFzcyhaKSAjIFZlcmlmaWNhciBjbGFzc2UgZG8gb2JqZXRvIFogWzFdICJkYXRhLmZyYW1lIg0KY2xhc3MoeSkNCiMgTXVkYXIgY2xhc3NlIGRvcyBvYmpldG9zDQpaID0gZGF0YS5tYXRyaXgoWikgIyBDb25zdW1vIGludGVybWVkacOhcmlvDQp5ID0gZGF0YS5tYXRyaXgoeSkgIyBEZW1hbmRhIGZpbmFsDQp4ID0gZGF0YS5tYXRyaXgoeCkgIyBWYWxvciBCcnV0byBkYSBQcm9kdcOnw6NvDQp4ID0gYXMudmVjdG9yKHgpICAgIyBWYWxvciBCcnV0byBkYSBQcm9kdcOnw6NvDQp2ID0gZGF0YS5tYXRyaXgodikgIyBWYWxvciBhZGljaW9uYWRvDQoNCmNsYXNzKHgpDQp4ID0gYXMudmVjdG9yKHgpDQpjbGFzcyh2KQ0KDQojIFNhbHZhciBiYXNlIGRlIGRhZG9zIG5vIGZvcm1hdG8gUkRhdGENCnNhdmUoWiwgeSwgeCwgdiwgZmlsZSA9ICJFWEVNUExPX01SSU8uUkRhdGEiKQ0KYGBgDQoNCiMgTW9kZWxvIFJlZ2lvbmFsIEluc3Vtby1Qcm9kdXRvDQoNCiMjIE1vZGVsbyBhYmVydG8NCg0KTyBzY3JpcHQgZGVzZW52b2x2ZSBvcyBjw6FsY3Vsb3MgZW0gUiBlIG9zIHJlc3VsdGFkb3Mgc2FlbSBjb21vIGVtIE1pbGxlciBlIEJsYWlyICgyMDA5LCBwLjgzKSwgcmVzcGVjdGl2YW1lbnRlIHBhcmEgYSBtYXRyaXogZGUgY29lZmljaWVudGVzIHTDqWNuaWNvcywgQSwgZSBhIG1hdHJpeiBpbnZlcnNhIGRlIExlb250aWVmLCBMLCBwYXJhIG8gYWdyZWdhZG8uDQoNCiFbRm9udGU6IE1pbGxlciBlIEJsYWlyICgyMDA5LCBwLjgzKS5dKG1hdF9BX2dlcmFsLnBuZyAiTWF0cml6IEEgZGUgY29lZmljaWVudGVzIHTDqWNuaWNvcyBkbyBhZ3JlZ2FkbyIpDQoNCiFbRm9udGU6IE1pbGxlciBlIEJsYWlyICgyMDA5LCBwLjgzKS5dKG1hdF9MX2dlcmFsLnBuZyAiTWF0cml6IEwgZGEgaW52ZXJzYSBkZSBMZW9udGllZiBkbyBhZ3JlZ2FkbyIpDQoNCmBgYHtyfQ0KIyBMIDwtWiAlKiUgZGlhZyhjKDEvWCkpDQpBID0gWiAlKiUgZGlhZyhjKDEgLyB4KSkgIyBNYXRyaXogZGUgY29lZmljaWVudGVzIHTDqWNuaWNvcw0Kd3JpdGV4bDo6d3JpdGVfeGxzeCh4PWRhdGEuZnJhbWUoQSksIkEueGxzeCIpDQpwcmludChBKQ0KbiA9IGxlbmd0aCh4KSAjIE7Dum1lcm8gZGUgc2V0b3Jlcw0KSSA9IGRpYWcobikgIyBNYXRyaXogaWRlbnRpZGFkZQ0KcHJpbnQoSSkgIyBNYXRyaXogaWRlbnRpZGFkZQ0KIyBhdGVudGFyIHBhcmEgbm90YcOnw6NvIGRhIG1hdHJpeiBMZW9udGllZiBjb21vIEIgZSBuw6NvIEwNCiMgKiplbSBhbGd1bnMgcGFjb3RlcyBCIHNlcsOhIGEgbWF0cml6IGRlIEdvc2gqKg0KIyANCkIgPSBzb2x2ZShJIC0gQSkgIyBNYXRyaXogaW52ZXJzYSBkZSBMZW9udGllZg0KI1ZpZXcoQikgIyBNYXRyaXogaW52ZXJzYSBkZSBMZW9udGllZg0KcHJpbnQoQikNCmBgYA0KDQojIEF1dG9tYXRpemFyIHBlbG8gYGlvYW5hbHlzaXNgDQoNCmBgYHtyfQ0KDQpsaWJyYXJ5KGlvYW5hbHlzaXMpDQpSU19sYWJlbCA9IHJlYWQueGxzeCgiRVhFTVBMT19NUklPLnhsc3giLCBzaGVldCA9ICJSU19sYWJlbCIsIGNvbE5hbWVzID0gRkFMU0UpICMgIlJTX2xhYmVsIg0KIyBWX2xhYmVsIDF4MQ0KVl9sYWJlbDwtbWF0cml4KHJlcChjKCJWQXRvdGFsIiksNSksbmNvbCA9IDEpDQojIGZfbGFiZWwNCmxhYmVsIDwtIGMoIkRUIikNCnJlZ2lvbiA8LSBjKCJMIiwiTSIpDQpmX2xhYmVsIDwtIHJiaW5kKHJlZ2lvbiwgbGFiZWwpDQojIA0KIyBvYmpldG8gaW5wdXRvdXRwdXQgZG8gaW9hbmFseXNpcw0KbXJpb19leGVtcGxvPC1hcy5pbnB1dG91dHB1dChaPVosUlNfbGFiZWwgPVJTX2xhYmVsLCNmPXksZl9sYWJlbCA9IGZfbGFiZWwsDQogICAgICAgICAgICAgICBYPXgpIyxWPXYsVl9sYWJlbCA9Vl9sYWJlbCkNCmtleTEgPC0ga2V5LnNlY3RvcihtcmlvX2V4ZW1wbG8sDQogICAgICAgICAgICAgICAgICAgRVMgPSBOVUxMLCBjcml0ID0gMywgcmVnaW9ucyA9ICJhbGwiLCBzZWN0b3JzID0gImFsbCIsIA0KICAgICAgICAgICAgICAgICAgIHR5cGUgPSBjKCJkaXJlY3QiLCJ0b3RhbCIpLCBpbnRyYS5pbnRlciA9IFQpDQojIHJlc3VsdGFkb3MgbsOjby1ub3JtYWxpemFkb3MNCiMgbGVtYnJhciBxdWUgbyBpb2FuYWx5c2lzIGZheiBGTCBjb20gYSBtYXRyaXogZGUgR29zaA0KcHJpbnQoa2V5MSRMKQ0KcHJpbnQoa2V5MSRNKQ0KDQpwcmludChtcmlvX2V4ZW1wbG8kQikNCnByaW50KG1yaW9fZXhlbXBsbyRHKQ0KDQojIHJlc3VsdGFkb3MgbsOjby1ub3JtYWxpemFkb3MNCmtleTI8LWxpbmthZ2VzKG1yaW9fZXhlbXBsbywNCiAgICAgICAgICAgICAgIEVTID0gTlVMTCwgcmVnaW9ucyA9ICJhbGwiLCBzZWN0b3JzID0gImFsbCIsDQogICAgICAgICAgICAgICB0eXBlID0gYygiZGlyZWN0IiwidG90YWwiKSwgaW50cmEuaW50ZXIgPSBULA0KICAgICAgICAgICAgICAgbm9ybWFsaXplID0gRikNCmtuaXRyOjprYWJsZShjYmluZChSU19sYWJlbCwNCiAgICAgICAgICAgICAgICAgICByYmluZChhcy5kYXRhLmZyYW1lKHJvdW5kKGtleTIkTCwzKSksYXMuZGF0YS5mcmFtZShyb3VuZChrZXkyJE0sMykpKSkpDQojDQojbXVsdGlwbGljYWRvcmVzDQptdWx0PWlvYW5hbHlzaXM6Om11bHRpcGxpZXJzKG1yaW9fZXhlbXBsbyxtdWx0aXBsaWVycyA9IGMoIm91dHB1dCIsImlucHV0IikpDQp0YWJlbGE8LXJiaW5kKHJvdW5kKG11bHQkTCwzKSxyb3VuZChtdWx0JE0sMykpDQp0YWJlbGE8LWNiaW5kKFJTX2xhYmVsLCB0YWJlbGEpDQp0YWJlbGENCiAgICAgIA0KIyBUb3RhbCBmaWVsZCBvZiBpbmZsdWVuY2UNCmZpdCA9IGYuaW5mbHVlbmNlLnRvdGFsKG1yaW9fZXhlbXBsbykgICAgICAgICAgICAgICAgICAgICAgIA0KaGVhdG1hcC5pbyhmaXQsIFJTX2xhYmVsLCBsb3cgPSAnIzAwZmNlZicsIGhpZ2ggPSAnYmx1ZXZpb2xldCcpDQpwPC1oZWF0bWFwLmlvKGZpdCwgUlNfbGFiZWwsIGxvdyA9ICcjMDBmY2VmJywgaGlnaCA9ICdibHVldmlvbGV0JywNCiAgICAgICAgICAgICAgRlVOID0gTlVMTCwgbWF4ID0gMTIpDQpwDQpoZWF0bWFwLmlvKGZpdCwgUlNfbGFiZWwpDQoNCmBgYA0KDQojIFJlZmVyw6puY2lhcw0KDQpNSUxMRVIsIFIuRS47IEJMQUlSLCBQLkQuIElucHV04oCTT3V0cHV0IEFuYWx5c2lzOiBGb3VuZGF0aW9ucyBhbmQgRXh0ZW5zaW9ucywgMm5kIGVkLiBDYW1icmlkZ2U6IENhbWJyaWRnZSBVbml2ZXJzaXR5IFByZXNzLCAyMDA5Lg0KDQpQT1JTU0UsIEEuOyBWQUxFLCBWLiBJbnN1bW8tUHJvZHV0bzogTW9kZWxvcyBJbnRlci1yZWdpb25haXMuIEN1cml0aWJhOiBORURVUi1VRlBSLDIwMjAuIERpc3BvbsOtdmVsIGVtOiA8aHR0cDovL3d3dy5uZWR1ci51ZnByLmJyL3BvcnRhbC93cC1jb250ZW50L3VwbG9hZHMvMjAyMC8wOC8wOS1pbnN1bW8tcHJvZHV0by1tb2RlbG9zLWludGVyLXJlZ2lvbmFpcy5wZGY+LiA=