AirPassengers [144] (ts)
BJsales [150] (ts)
BOD [6,2] (data.frame)
CO2 [84,5] (nfnGroupedData)
ChickWeight [578,4] (nfnGroupedData)
DNase [176,3] (nfnGroupedData)
EuStockMarkets [1860,4] (mts)
Formaldehyde [6,2] (data.frame)
HairEyeColor [4,4,2] (table)
Harman23.cor [c(8, 8); 8; 1 ] (list)
Harman74.cor [c(24, 24); 24; 1 ] (list)
Indometh [66,3] (nfnGroupedData)
InsectSprays [72,2] (data.frame)
JohnsonJohnson [84] (ts)
LakeHuron [98] (ts)
LifeCycleSavings [50,5] (data.frame)
Loblolly [84,3] (nfnGroupedData)
Nile [100] (ts)
Orange [35,3] (nfnGroupedData)
OrchardSprays [64,4] (data.frame)
PlantGrowth [30,2] (data.frame)
Puromycin [23,3] (data.frame)
Seatbelts [192,8] (mts)
Theoph [132,5] (nfnGroupedData)
Titanic [4,2,2,2] (table)
ToothGrowth [60,3] (data.frame)
UCBAdmissions [2,2,6] (table)
UKDriverDeaths [192] (ts)
UKgas [108] (ts)
USAccDeaths [72] (ts)
USArrests [50,4] (data.frame)
USJudgeRatings [43,12] (data.frame)
USPersonalExpenditure [5,5] (matrix)
UScitiesD [10,10] (dist)
VADeaths [5,4] (matrix)
WWWusage [100] (ts)
WorldPhones [7,7] (matrix)
ability.cov [c(6, 6); 6; 1 ] (list)
airmiles [24] (ts)
airquality [153,6] (data.frame)
anscombe [11,8] (data.frame)
attenu [182,5] (data.frame)
attitude [30,7] (data.frame)
austres [89] (ts)
cars [50,2] (data.frame)
chickwts [71,2] (data.frame)
co2 [468] (ts)
crimtab [42,22] (table)
discoveries [100] (ts)
esoph [88,5] (data.frame)
euro [11] (numeric)
eurodist [21,21] (dist)
faithful [272,2] (data.frame)
freeny [39,5] (data.frame)
infert [248,8] (data.frame)
iris [150,5] (data.frame)
iris3 [50,4,3] (array)
islands [48] (numeric)
lh [48] (ts)
longley [16,7] (data.frame)
lynx [114] (ts)
morley [100,3] (data.frame)
mtcars [32,11] (data.frame)
nhtemp [60] (ts)
nottem [240] (ts)
npk [24,5] (data.frame)
occupationalStatus [8,8] (table)
precip [70] (numeric)
presidents [120] (ts)
pressure [19,2] (data.frame)
quakes [1000,5] (data.frame)
randu [400,3] (data.frame)
rivers [141] (numeric)
rock [48,4] (data.frame)
sleep [20,3] (data.frame)
stackloss [21,4] (data.frame)
sunspot.month [3177] (ts)
sunspot.year [289] (ts)
sunspots [2820] (ts)
swiss [47,6] (data.frame)
treering [7980] (ts)
trees [31,3] (data.frame)
uspop [19] (ts)
volcano [87,61] (matrix)
warpbreaks [54,3] (data.frame)
women [15,2] (data.frame)
lakers [34624,13] (data.frame)

Přiřazení hodnoty proměnné

[1] FALSE

Sčítání, odčítání, násobení a dělení

[1] Inf
[1] Inf
[1] NaN
[1] NaN

Převod desetinných čísel na zlomky

3 / 4-167 is a prime!
-167 / 100

Mocniny a odmocniny


Attaching package: ‘numbers’

The following object is masked from ‘package:shiny’:

    div
[1] 12  2
[1] 2 3

Exponenty a logaritmy

Goniometrické funkce

Vypočítejte pH 0.001 M kyseliny chlorovodíkové, 0.01 M hydroxidu sodného, 0.15 M kyseliny octové (Ka = 1.75e-5) a 0.01 M amoniaku (Kb = 1.8e-5)

[1] 10.62764

Matematické konstanty

[1] 2.718282
[1] 2.7182818284590451

Vektory - generování řady čísel

Vektory - řada náhodných čísel z daného rozmezí

Indexy

[1] 18 94 87 47

Uspořádání vektoru

 [1]  7  8  5 11 12  6 19 18  9  3 14 13 10 16  4 17  1  2 15

Množiny

Vektorová aritmetika

diff(x)
 [1]   3 -38  33 -61  17 -25   2  32  33 -51   4  33  -7  29  -7
[16]   2 -39  -4
sign(x)
 [1] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1

Filtrování hodnot ve vektoru

numbers =c(4,23,4,23,5,43,54,56,657,67,67,435,453,435,7,65,34,435)
table(numbers)[2]==1
   5 
TRUE 
numbers[2]
[1] 23
sum(numbers==435)
[1] 3

Matice

matrix(x,nrow=6,ncol=3,byrow = TRUE)
     [,1] [,2] [,3]
[1,]   90   52   58
[2,]   71   27   17
[3,]   83   50   42
[4,]   61   45   15
[5,]   24   80   36
[6,]   63   33   43
matrix(x,nrow=6,ncol=3,byrow = FALSE)
     [,1] [,2] [,3]
[1,]   90   83   24
[2,]   52   50   80
[3,]   58   42   36
[4,]   71   61   63
[5,]   27   45   33
[6,]   17   15   43

Dataframes

Seznamy (lists)

[1] 23

Vypočítejte molekulové hmotnosti alkanů C1 - C12.

      1       2       3       4       5       6       7       8 
 16.043  30.070  44.097  58.124  72.151  86.178 100.205 114.232 
      9      10      11      12 
128.259 142.286 156.313 170.340 
$`1`
[1] 16.043

$`2`
[1] 30.07

$`3`
[1] 44.097

$`4`
[1] 58.124

$`5`
[1] 72.151

$`6`
[1] 86.178

$`7`
[1] 100.205

$`8`
[1] 114.232

$`9`
[1] 128.259

$`10`
[1] 142.286

$`11`
[1] 156.313

$`12`
[1] 170.34

Vliv 3 ůzných druhů krmiva na přírůstek živé váhy (v kg) prasat, rozdělených do 4 různých skupin.

Pipe operator (%>%) v R

# pipe operator
library(magrittr)

Attaching package: ‘magrittr’

The following object is masked from ‘package:numbers’:

    mod
a = 3.14159
a %>% seq(10,3) %>% round(3)
[1] 3.142 6.142 9.142

Příkaz if-else


x = sample(12:99,18, replace = FALSE); x
ifelse(x<50,0,1)
x[x<50] = 0
x[x>=50] = 1
x

Vypocítejte vazebnou energii atomového jádra pomoci Bethe - Weiszackerovy rovnice B = 14.0 - 13.1A^(2/3) + 0.585Z(Z-1)/A^(1/3) - (18.1(A-2*Z)^2)/A + C/A, kde A - nukleonove cislo, Z - atomove cislo, C - konstanta, pro jádra se sudým počtem protonů i neutronů je rovna 132, pro jádra s lichým počtem protonů i neutronů je rovna -132, pro lichy počet protonů a sudý počet neutronů a naopak je rovna 0.


# alpha particle
A = 4 
Z = 2

# U-235
A = 235 
Z = 92

# funkce
N = A-Z
if (N%%2==0 & Z%%2==0){C = 132} else if (N%%2!=0 & Z%%2!=0){C = -132} else {C = 0}
B = 14.0 - 13.1*A^(2/3) + 0.585*Z*(Z-1)/A^(1/3) - (18.1*(A-2*Z)^2)/A + C/A
B # [MeV]
B/A # energie na 1 nukleon [MeV]

# polomer jadra: R = R0 * A^(1/3)
R0 = 1.4e-13 # [cm]
R = R0 * A^(1/3)
R = R*10e-15 
R   # [m]

Cyklus typu while

Vypočítejte molekulové hmotnosti alkanů C1 - C12 (while loop)


n = 1
Mhc = NULL
while(n <= 12){
  hc = n*12.011 + (2*n + 2)*1.008
  Mhc = c(Mhc,hc)
  n = n+1
}
names(Mhc) = c(1:12)
Mhc

Cyklus typu for (for loop)

Vypočítejte molekulové hmotnosti alkanů C1 - C12


Mhc = NULL
for(n in c(1:12)){
  hc = n*12.011 + (2*n + 2)*1.008
  Mhc = c(Mhc,hc) 
}
names(Mhc) = c(1:12)
Mhc

Vypočítejte střední kvadratickou rychlost molekul daných plynů v rozmezí teplot od 150 K do 500 K s krokem 50 K.


el = c("H2","He", "O2", "Kr")
M = c(2.0159, 4.0026, 31.9988, 83.8) # [g / mol]
Ts = seq(from=150, to=500, by=50) # [K]
R = 8314.34 # [J / kmol K]
MKV = NULL
for(tt in Ts){
  mkv= rep(0, length(M))
  for(ii in c(1:length(M))){
    mkv[ii] = (3*R*tt/M[ii])^(1/2)
  }
  MKV = rbind(MKV, mkv)   
}
colnames(MKV) = el
rownames(MKV) = Ts
MKV
plot(0,0,xlim=c(min(Ts),max(Ts)),ylim = c(min(MKV),max(MKV)), type ="n",xlab="T [K]",ylab="str. kv. rychlost [m/s]")
for(ii in c(1:length(M))){points(Ts,MKV[,ii], type="p",col=ii,pch=16)}
legend("topleft",legend=el,col=c(1:length(M)),pch=16,cex=.8)

Fyzikální konstanty

molweight("C")
      C 
12.0107 

Určete délku měděného drátu o průměru 1.6 mm jehož hmotnost je 0.8 kg.

library(PeriodicTable)

Attaching package: ‘PeriodicTable’

The following object is masked from ‘package:MSbox’:

    mass

The following object is masked from ‘package:CHNOSZ’:

    mass
data(periodicTable)
ptCu = periodicTable[which(periodicTable$symb=="Cu"),]
ptCu$density
[1] 8.96

Molekulové hmotnosti

formula1<-c("C12H10Cl10")
multiform(formula1,3)
[1] "C36H30Cl30"

Uhlovodík o molekulové hmotnosti 84 g/mol obsahuje 85.71 % uhlíku a 14.29 % vodíku. Určete molekulový vzorec.


M = 84 # g/mol
mc = 0.8571
mh = 0.1429
library(marelac)
mC = molweight("C") # g/mol
mH = molweight("H") # g/mol

rs = c(mc/mC,mh/mH)/min(mc/mC,mh/mH)
rs = round(rs,0)
n = M/sum(rs*c(mC,mH))
n = round(n,0)
form = rs*n; form
gsub(" ", "", paste("C",form[1],"H",form[2]))


library(Rdisop)
dmp = decomposeMass(mass=M, ppm=1, mzabs=0.1,  elements=initializeElements(c("C","H")), z=1, minElements="C4", maxElements="C10")
dmp$formula

library(rcdk)
generate.formula(M, window=5, validation=FALSE, charge=1,elements=list(c("C",2,10),c("H",4,30)))

Izotopy


library(enviPat)
data(isotopes)
isotopes

library(ecipex)
nistiso
nistiso$mass
nistiso$abundance
nistiso$element

library(IsoSpecR)
data(isotopicData)
isotopicData

library(CIAAWconsensus)
ciaaw.mass.2003
ciaaw.mass.2012
ciaaw.mass.2016

Izotopové patterny

Izotopové poměry

Vlastnosti vzduchu a vody


# Slozeni atmosfery
library(marelac)
atmComp() 

## Hustota vzduchu 
library(marelac)
air_density(t = 25, P = 1.013253)
# t - temperature in °C, P - pressure in bars

## Hustota vody
library(rLakeAnalyzer)
water.density(wtr = 25, sal = 0)
# wtr - temperature in °C
library(CHNOSZ)
rho.IAPWS95(T = 298.15, P = 1, state="", trace=0)
# T - temperature in K, P - pressure in bars


library(IAPWS95)
library(marelac)
library(CHNOSZ)

library(CHNOSZ)
thermo()$OBIGT

Disociační konstanty

library(CHNOSZ)
Warning: package ‘CHNOSZ’ was built under R version 4.1.3
CHNOSZ version 1.4.3 (2022-02-20)
reset: creating "thermo" object
OBIGT: loading default database with 1904 aqueous, 3445 total species

Attaching package: ‘CHNOSZ’

The following object is masked from ‘package:seqinr’:

    read.fasta
thermo = thermo()
thermo$protein
pf <- protein.formula(thermo$protein); pf
                        C         H        N        O       S
O08452_PYRFU     2338.000  3307.000  573.000  649.000   9.000
AMY_BACSU        3006.000  4584.000  850.000  965.000  11.000
AMYA_PYRFU       3526.000  5325.000  885.000  976.000  14.000
BPT1_BOVIN        284.000   438.000   84.000   79.000   7.000
CYC_BOVIN         517.000   825.000  143.000  150.000   4.000
LYSC_CHICK        613.000   959.000  193.000  185.000  10.000
MYG_PHYCA         783.000  1240.000  216.000  216.000   2.000
NUC_STAAU         747.000  1204.000  208.000  224.000   4.000
RNAS1_BOVIN       575.000   909.000  171.000  193.000  12.000
RNBR_BACAM        555.000   847.000  153.000  170.000   0.000
RNH_ECOLI         776.000  1215.000  227.000  228.000   7.000
RNH_THET8         829.000  1297.000  253.000  231.000   7.000
RNT1_ASPOR        479.000   687.000  127.000  171.000   4.000
CSG_HALJP        3669.000  5647.000  971.000 1488.000   0.000
CSG_HALSA        3642.000  5653.000  979.000 1452.000   7.000
CSG_HALVO        3439.000  5418.000  910.000 1379.000   5.000
CSG_METFE        2815.000  4411.000  747.000  872.000  14.000
CSG_METJA        2555.000  4032.000  640.000  865.000  14.000
CSG_METSC        2812.000  4405.000  747.000  872.000  16.000
CSG_METVO        2575.000  4097.000  645.000  884.000  11.000
CSG_METTL        2484.000  4000.000  638.000  844.000   7.000
CSG_METBU        1362.000  2111.000  355.000  442.000   4.000
SLAP1_BACAN      3719.000  6077.000  971.000 1197.000   7.000
SLAP_ACEKI       3584.000  5648.000  926.000 1138.000   4.000
SLAP_AERSA       2250.000  3580.000  618.000  716.000   2.000
SLAP_BACCI       7457.000 11798.000 2148.000 2338.000  20.000
SLAP_GEOSE       5676.000  9113.000 1489.000 1863.000   3.000
SLAP_CAMFE       4138.000  6730.000 1100.000 1452.000  12.000
SLAP_CAUCR       4228.000  6830.000 1148.000 1510.000   3.000
SLAP_LACAC       1930.000  3086.000  542.000  646.000   1.000
SLAP_LACBR       1976.000  3113.000  533.000  673.000   4.000
SLAP_LACHE       1927.000  3063.000  519.000  635.000   3.000
SLAP2_BACAN      3926.000  6318.000 1044.000 1270.000   1.000
SLAP_BACLI       3977.000  6396.000 1068.000 1286.000   2.000
FLAB1_AERPE       920.000  1490.000  230.000  286.000   6.000
FLAB2_AERPE      1124.000  1793.000  275.000  363.000   5.000
FLAB1_METJA       954.000  1518.000  240.000  298.000   5.000
FLAB2_METJA       944.000  1537.000  243.000  296.000   4.000
FLAB3_METJA       972.000  1553.000  257.000  299.000   3.000
FLA_BACSU        1378.000  2286.000  420.000  477.000   8.000
FLAA_AQUPY       2361.000  3823.000  649.000  773.000   8.000
FLAA_AQUAE       2401.000  3860.000  666.000  806.000   7.000
FLJJ_CAUCR       1228.000  2034.000  364.000  413.000   5.000
PST1_YEAST       1789.000  2923.000  489.000  620.000   4.000
TSA1_YEAST        980.000  1530.000  248.000  288.000   2.000
PRX1_YEAST       1340.000  2102.000  352.000  387.000   5.000
DOT5_YEAST       1070.000  1740.000  300.000  324.000   4.000
MOD5.M_YEAST     2238.000  3545.000  623.000  657.000  17.000
MOD5.N_YEAST     2187.000  3455.000  609.000  645.000  15.000
COX1_YEAST       2778.000  4195.000  649.000  713.000  22.000
COX2_YEAST       1242.000  1888.000  286.000  351.000  10.000
COX3_YEAST       1430.000  2140.000  344.000  358.000  15.000
COX4_YEAST        622.000   984.000  170.000  198.000   5.000
COX5A_YEAST       663.000  1030.000  184.000  198.000   4.000
COX5B_YEAST       694.000  1080.000  188.000  199.000   2.000
COX6_YEAST        567.000   867.000  145.000  180.000   1.000
COX7_YEAST        328.000   511.000   83.000   74.000   0.000
COX8_YEAST        261.000   384.000   62.000   59.000   1.000
COX9_YEAST        300.000   467.000   79.000   74.000   3.000
KC11_YEAST       2709.000  4234.000  796.000  828.000  16.000
KC12_YEAST       2715.000  4222.000  804.000  842.000  15.000
KC13_YEAST       2641.000  4087.000  769.000  805.000  24.000
HRR25_YEAST      2545.000  3969.000  729.000  749.000  18.000
GAL83_YEAST      2024.000  3107.000  567.000  672.000  16.000
SIP1_YEAST       4168.000  6560.000 1204.000 1370.000  25.000
SIP2_YEAST       2003.000  3178.000  568.000  665.000  13.000
GLRX1_YEAST       549.000   886.000  146.000  170.000   4.000
GLRX2.C_YEAST     527.000   856.000  136.000  165.000   3.000
GLRX2_YEAST       715.000  1161.000  181.000  213.000   5.000
GLRX3_YEAST      1444.000  2195.000  371.000  463.000  10.000
GLRX4_YEAST      1226.000  1910.000  316.000  389.000   6.000
GLRX5_YEAST       762.000  1200.000  196.000  227.000   6.000
GSHR.M_YEAST     2383.000  3768.000  652.000  715.000  14.000
GSHR.C_YEAST     2302.000  3629.000  627.000  692.000  13.000
GPD1_YEAST       1905.000  2983.000  513.000  574.000  15.000
GPD2_YEAST       2213.000  3491.000  613.000  641.000  15.000
TRX1_YEAST        502.000   785.000  123.000  150.000   5.000
TRX2_YEAST        497.000   780.000  122.000  153.000   5.000
TRX3_YEAST        651.000  1049.000  167.000  181.000  10.000
TRXB1_YEAST      1509.000  2412.000  402.000  471.000  12.000
TRXB2_YEAST      1640.000  2615.000  449.000  501.000  14.000
AMPM1_YEAST      1870.000  2926.000  518.000  565.000  21.000
AMPM2_YEAST      2087.000  3291.000  587.000  653.000  14.000
EXG1_YEAST       2110.000  3091.000  547.000  650.000  12.000
CLPX_ECOLI       2040.000  3320.000  558.000  638.000  11.000
CLPP_ECOLI       1019.000  1624.000  282.000  307.000  14.000
CLPA_ECOLI       3707.000  5997.000 1065.000 1134.000  18.000
HSLU_ECOLI       2170.000  3559.000  615.000  676.000  16.000
HSLV_ECOLI        837.000  1356.000  238.000  255.000   4.000
FTSH_ECOLI       3120.000  5013.000  881.000  936.000  27.000
LON_ECOLI        3843.000  6319.000 1077.000 1167.000  36.000
AMY1_HORVU       2041.000  3068.000  552.000  598.000  16.000
AMYB_HORVU       2671.000  4060.000  730.000  782.000  23.000
GUB2_HORVU       1448.000  2203.000  391.000  417.000  13.000
ALEU_HORVU        581.000   927.000  185.000  177.000   3.000
RPOE_ECOLI        960.000  1541.000  271.000  291.000   5.000
FLIA_ECOLI       1200.000  1946.000  356.000  375.000   5.000
RP32_ECOLI       1423.000  2264.000  414.000  434.000  11.000
RPOS_ECOLI       1661.000  2691.000  483.000  524.000   5.000
RP54_ECOLI       2365.000  3791.000  649.000  766.000  13.000
RPOD_ECOLI       3042.000  4912.000  856.000  993.000  28.000
AMY1_ECOLI       3316.000  4962.000  900.000  995.000  19.000
AMPM_ECOLI       1291.000  2079.000  353.000  392.000  16.000
AMPM_PYRFU       1490.000  2408.000  390.000  423.000   9.000
ALBU_BOVIN       2934.000  4615.000  781.000  897.000  39.000
OVAL_CHICK       1901.000  2999.000  499.000  575.000  22.000
INS_BOVIN         254.000   381.000   65.000   74.000   6.000
CTRA_BOVIN       1110.000  1753.000  299.000  346.000  12.000
LACB_BOVIN        817.000  1316.000  206.000  248.000   9.000
MYG_HORSE         769.000  1212.000  210.000  218.000   2.000
A0FHA7_HORVU     2594.000  4098.000  708.000  767.000  19.000
CLPP_HORVU       1124.000  1722.000  280.000  317.000  15.000
E13A_HORVU       1476.000  2287.000  405.000  439.000   7.000
CSG_METMP        2494.000  3951.000  613.000  841.000   9.000
HJA1_METJA        332.000   565.000   91.000   95.000   1.000
HJA2_METJA        331.000   561.000   91.000   96.000   1.000
HJA3_METJA        321.000   548.000   94.000   91.000   2.000
HJA4_METJA        338.000   569.000   91.000   96.000   1.000
HstA_METVO        323.000   556.000   92.000   94.000   3.000
HstB_METVO        320.000   545.000   87.000   97.000   3.000
HARA_PYRAB        331.000   555.000   93.000   96.000   1.000
HARB_PYRAB        325.000   567.000   97.000   92.000   1.000
HARA_PYRFU        331.000   555.000   93.000   96.000   1.000
HARB_PYRFU        322.000   559.000   95.000   93.000   1.000
HMmA_METMP        320.000   547.000   87.000   95.000   5.000
Q6LXK3_METMP      304.000   525.000   87.000   93.000   4.000
DN71_SULSO        325.000   538.000   88.000   94.000   3.000
DN72_SULSO        320.000   528.000   86.000   94.000   2.000
TPX_THIDA         762.000  1239.000  197.000  230.000   6.000
TPX_BACHD         794.000  1270.000  212.000  251.000   4.000
TPX_BACSU         805.000  1276.000  212.000  252.000   4.000
TPX_AQUAE         830.000  1353.000  213.000  252.000   7.000
TPX_ECOLI         789.000  1260.000  210.000  245.000   3.000
H-NS_PHOPR        649.000  1067.000  181.000  212.000   3.000
PPB_ECOLI        2048.000  3277.000  585.000  670.000  12.000
SPTA2.SH3_CHICK   315.000   499.000   81.000   93.000   1.000
BARS_BACAM        459.000   720.000  118.000  141.000   2.000
TRY1_BOVIN       1012.000  1597.000  279.000  324.000  14.000
CYB5.HEME_BOVIN   399.000   607.000  105.000  127.000   0.000
LYS_BPT4          823.000  1326.000  238.000  241.000   7.000
RNT1.K25_ASPOR    480.000   691.000  127.000  170.000   4.000
IOVO.3_MELGA      238.000   367.000   65.000   78.000   6.000
PAP1_CARPA       1050.000  1590.000  290.000  308.000   7.000
PRVB_ESOLU        510.000   791.000  127.000  162.000   3.000
PEPA_PIG         1530.000  2300.000  366.000  523.000  10.000
PLMN.K4_HUMAN     380.000   569.000  113.000  121.000   8.000
SPG1.B1_STRSG     268.000   414.000   66.000   94.000   0.000
SPG1.B2_STRSG     268.000   417.000   67.000   92.000   0.000
DN71.d_SULAC      325.000   535.000   91.000   98.000   2.000
SSI_STRAO|2      1000.000  1572.000  272.000  320.000  14.000
SSI_STRAO         500.000   786.000  136.000  160.000   7.000
TRPA_SALTY       1281.000  2034.000  352.000  378.000   8.000
UBIQ_HUMAN        378.000   629.000  105.000  118.000   1.000
CDK1_HUMAN       1550.000  2444.000  406.000  440.000   9.000
CDK2_HUMAN       1559.000  2446.000  408.000  423.000   8.000
CDK3_HUMAN       1603.000  2519.000  423.000  440.000   9.000
CDK4_HUMAN       1515.000  2381.000  419.000  430.000  12.000
CDK5_HUMAN       1505.000  2362.000  402.000  427.000  12.000
CDK6_HUMAN       1651.000  2612.000  452.000  485.000  12.000
CDK7_HUMAN       1771.000  2803.000  475.000  492.000  13.000
CDK8_HUMAN       2381.000  3693.000  665.000  690.000  19.000
CDK9_HUMAN       1916.000  3044.000  526.000  547.000  18.000
CDK10_HUMAN      1848.000  2962.000  506.000  510.000  19.000
CCNA1_HUMAN      2357.000  3670.000  604.000  697.000  23.000
CCNA2_HUMAN      2177.000  3451.000  579.000  645.000  15.000
CCNB1_HUMAN      2155.000  3483.000  571.000  630.000  27.000
CCNB2_HUMAN      2016.000  3271.000  549.000  594.000  18.000
CCNB3_HUMAN      7036.000 11399.000 1795.000 2180.000  61.000
CCNC_HUMAN       1522.000  2348.000  384.000  417.000  17.000
CCND1_HUMAN      1480.000  2386.000  396.000  450.000  25.000
CCND2_HUMAN      1457.000  2347.000  393.000  441.000  20.000
CCND3_HUMAN      1427.000  2306.000  402.000  422.000  21.000
CCNE1_HUMAN      2093.000  3297.000  567.000  615.000  26.000
CCNE2_HUMAN      2114.000  3337.000  553.000  601.000  20.000
CCNF_HUMAN       3854.000  6112.000 1082.000 1174.000  39.000
CCNG1_HUMAN      1525.000  2470.000  416.000  431.000  17.000
CCNG2_HUMAN      1724.000  2747.000  451.000  521.000  23.000
CCNH_HUMAN       1684.000  2660.000  450.000  491.000  18.000
CCNI_HUMAN       1904.000  3028.000  516.000  544.000  22.000
CCNJ_HUMAN       1907.000  2968.000  516.000  549.000  21.000
CCNJL_HUMAN      2171.000  3378.000  580.000  623.000  26.000
CCNK_HUMAN       1857.000  2870.000  506.000  535.000  14.000
CCNL1_HUMAN      2571.000  4198.000  846.000  766.000  13.000
CCNL2_HUMAN      2522.000  4123.000  801.000  748.000  16.000
CCNO_HUMAN       1673.000  2688.000  484.000  490.000  21.000
CCNT1_HUMAN      3528.000  5570.000 1024.000 1101.000  23.000
CCNT2_HUMAN      3524.000  5590.000 1030.000 1113.000  26.000
CCNY_HUMAN       1738.000  2744.000  490.000  526.000  13.000
CD5R1_HUMAN      1513.000  2419.000  421.000  446.000  13.000
MAT1_HUMAN       1580.000  2530.000  438.000  482.000  14.000
Q2RJF3_MOOTA     2299.000  3588.000  606.000  669.000  15.000
Q2RMD6_MOOTA     5702.000  8933.000 1521.000 1690.000  45.000
Q2RJ73_MOOTA     3685.000  5743.000  957.000 1069.000  36.000
H2O_RESIDUE         0.000     2.000    0.000    1.000   0.000
Ala_RESIDUE         3.000     5.000    1.000    1.000   0.000
Cys_RESIDUE         3.000     5.000    1.000    1.000   1.000
Asp_RESIDUE         4.000     5.000    1.000    3.000   0.000
Glu_RESIDUE         5.000     7.000    1.000    3.000   0.000
Phe_RESIDUE         9.000     9.000    1.000    1.000   0.000
Gly_RESIDUE         2.000     3.000    1.000    1.000   0.000
 [ reached getOption("max.print") -- omitted 305 rows ]
iA <- info("alanine")
info.character: found alanine(aq); also available in cr
info(iA)$formula
[1] "C3H7NO2"
as.chemical.formula(makeup(iA))
[1] "C3H7NO2"

Převody jednotek

[1] 273.15

Plynný systém mění svůj objem o 1200 ml za konstantního vnějšího tlaku 30 atm. Jakou práci vykoná plyn při expanzi? Vyjádřete v různých energetických jednotkách.

[1] 3647.7

Ocelová láhev o objemu 20.5 l je naplněna kyslíkem. Při 17 °C je tlak v láhvi 87 atm. Vypočítejte hmotnost kyslíku.

m = P*V*M/(R*Tk)
m = ceiling(m); m # g
[1] 2
mk = conv_unit(m, from="g", to="kg")
mk = round(mk,2); mk # kg
[1] 0
paste("Hmotnost kyslíku je", m, "g, resp.", mk, "kg.")
[1] "Hmotnost kyslíku je 2 g, resp. 0 kg."

Vypočítejte molekulovou hmotnost benzenu, váží-li 600 ml jeho par při 87 °C a tlaku 624 mm Hg 1.3 g.

paste("Zjištěná molární hmotnost benzenu je", round(M,0), "g/mol.")
[1] "Zjištená molární hmotnost benzenu je 78 g/mol."

Pokus trval celkem 7658 minut. Kolik je to dní, hodin a minut?

[1] "Pokus trval 5 dní, 7 hodin, 38 minut a 0 sekund."

Zaokrouhlování čísel na daný pocet desetinných míst

Nejistoty a chyby měření

Ze zásilky kaprolaktamu bylo odebráno 10 vzorku a byl u nich stanoven bod tání. Vypočítejte průměrnou hodnotu bodu tání v zásilce a její směrodatnou odchylku.

Sireni chyb

Vypočítejte hustotu a její chybu pro látku, u níž byla opakovaným měřením stanovena hmotnost 6.824 (0.008) g a objem 3.03 (0.01) ml.

Na píst o průměru 200 (0.05) mm působí pára tlakem 8.2 (0.1) atm. Jakou silou působí pára na píst?

Vypočítejte koeficient viskozity roztoku glycerinu Stokesovou metodou

Vypočítejte koeficient viskozity roztoku glycerinu pomocí kapilárního viskozimetru.

Součin rozpustnosti stříbrné soli AgX má hodnotu Ks = 4.0 (0.4) x 10^-8. Jaká je chyba vypočtené rovnovážné koncentrace stříbrných iontů ve vode?

Nejistoty a korelace

Errors: 0.022880681 0.011490987 0.007474727 0.005623896 0.004536172
[1] 0.9969624 1.0108112 1.0008685 1.0050627 1.0080674
Errors: 0.012312356 0.005439786 0.003877966 0.002770037 0.002083100
[1] 0.9969624 1.0108112 1.0008685 1.0050627 1.0080674
Errors: 0.029924187 0.015313206 0.009833843 0.007455422 0.006067488
[1] 0.9969624 1.0108112 1.0008685 1.0050627 1.0080674
LS0tDQp0aXRsZTogIlIgTm90ZWJvb2siDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KDQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQoNCg0KaW5zdGFsbC5wYWNrYWdlcyhwa2dzID0gIiIpDQppbnN0YWxsLnBhY2thZ2VzKGZpbGVfbmFtZV9hbmRfcGF0aCwgcmVwb3MgPSBOVUxMLCB0eXBlPSJzb3VyY2UiKQ0KDQoNCiMgUlN0dWRpbyAtIGNyYW4NCg0KIyBSU3R1ZGlvIC0gYXJjaGl2DQoNCiMgR2l0SHViDQpsaWJyYXJ5KGRldnRvb2xzKQ0KaW5zdGFsbF9naXRodWIoIk1vbW9jcyIsdXNlcm5hbWU9ImpmcGFsb21lcXVlIikNCmluc3RhbGxfZ2l0aHViKCJqZnBhbG9tZXF1ZS9Nb21vY3MiKQ0KDQoNCiMgQmlvY29uZHVjdG9yDQojIGh0dHBzOi8vd3d3LmJpb2NvbmR1Y3Rvci5vcmcvDQppZiAoIXJlcXVpcmUoIkJpb2NNYW5hZ2VyIiwgcXVpZXRseSA9IFRSVUUpKQ0KICAgIGluc3RhbGwucGFja2FnZXMoIkJpb2NNYW5hZ2VyIikNCkJpb2NNYW5hZ2VyOjppbnN0YWxsKHZlcnNpb24gPSAiMy4xNCIpDQoNCkJpb2NNYW5hZ2VyOjphdmFpbGFibGUoKQ0KDQppZiAoIXJlcXVpcmVOYW1lc3BhY2UoIkJpb2NNYW5hZ2VyIiwgcXVpZXRseSA9IFRSVUUpKQ0KICAgIGluc3RhbGwucGFja2FnZXMoIkJpb2NNYW5hZ2VyIikNCkJpb2NNYW5hZ2VyOjppbnN0YWxsKCJSY2hlbWNwcCIpDQpCaW9jTWFuYWdlcjo6aW5zdGFsbCgiYmlvZGIiKQ0KDQoNCiMgU2VhcmNoDQoNCmxpYnJhcnkocGtnc2VhcmNoKQ0KcGtnX3NlYXJjaF9hZGRpbihxdWVyeSA9ICIiLCB2aWV3ZXIgPSBjKCJkaWFsb2ciLCAiYnJvd3NlciIpKQ0KDQojIGh0dHBzOi8vd3d3Lml0bC5uaXN0Lmdvdi9kaXY4OTgvZWR1Y2F0aW9uL2RhdGFzZXRzLmh0bQ0KDQoNCmxpYnJhcnkoTkNtaXNjKQ0KcmVxdWlyZShOQ21pc2MpDQoNCnN1bW1hcmlzZS5yLmRhdGFzZXRzKCkNCnN1bW1hcmlzZS5yLmRhdGFzZXRzKGZpbHRlcj1UUlVFLCJtYXRyaXgiKQ0KDQpgYGANCg0KDQpQxZlpxZlhemVuw60gaG9kbm90eSBwcm9txJtubsOpDQoNCmBgYHtyIGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQoNCnggPC0gLTcNCngNCg0KeCA9IC03OyB4DQoNCih4ID0gLTcpDQoNCg0KbGlicmFyeShzY2hvb2xtYXRoKQ0Kc2Nob29sbWF0aDo6aXMubmVnYXRpdmUoeCkNCnNjaG9vbG1hdGg6OmlzLnBvc2l0aXZlKHgpDQpzY2hvb2xtYXRoOjppcy5yZWFsLnBvc2l0aXZlKHgpDQoNCmFicyh4KQ0KDQpgYGANCg0KDQpTxI3DrXTDoW7DrSwgb2TEjcOtdMOhbsOtLCBuw6Fzb2JlbsOtIGEgZMSbbGVuw60NCg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCg0KMyszDQo5LTMNCjMqMw0KOS8zDQoNCnggPSA5DQp4KzMNCngtMw0KeCozDQp4LzMNCih4LTMpLyh4LzMpDQoNCjEvMA0KSW5mKkluZg0KSW5mL0luZg0KMC8wDQoNCg0KIyBjZWxvY2lzZWxuZSBkZWxlbmkgKGludGFnZXIgZGl2aXNpb24pDQoxMyUvJTINCmxpYnJhcnkobnVtYmVycykNCmRpdigxMywyKSAgDQoNCiMgemJ5dGVrIHBvIGRlbGVuaSAocmVtaW5kZXIgYWZ0ZXIgZGl2aXNpb24pDQoxMyUlMg0KbGlicmFyeShudW1iZXJzKQ0KbW9kKDEzLDIpIA0KDQpgYGANCg0KDQpQxZlldm9kIGRlc2V0aW5uw71jaCDEjcOtc2VsIG5hIHpsb21reQ0KDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KDQpsaWJyYXJ5KE1BU1MpDQpmcmFjdGlvbnMoLTAuMTY2NjY2NykNCmZyYWN0aW9ucygwLjE0KQ0KZnJhY3Rpb25zKDAuNCkNCg0KbGlicmFyeShzY2hvb2xtYXRoKQ0KZGVjaW1hbDJmcmFjdGlvbigwLjEsNikNCg0KbGlicmFyeShmcmFjdGlvbmFsKQ0KZnJhY3Rpb25hbCgtMC4xNjY2NjY3LCBlcHMgPSAxZS0wNiwgbWF4Q29udiA9IDIwLCBzeW5jID0gRkFMU0UpDQpudW1lcmF0b3JzKC0wLjE2NjY2NjcpICMgdnlwaXNlIGNpdGF0ZWxlIChudW1lcmF0b3IpDQpkZW5vbWluYXRvcnMoLTAuMTY2NjY2NykgIyB2eXBpc2Ugam1lbm92YXRlbGUgKGRlbm9taW5hdG9yKQ0KbnVtZXJpY2FsKC0xLzYpDQp1bmZyYWN0aW9uYWwoLTEvNikNCg0KIyB6amVkbm9kdXNlbsOtIHpsb21rdSAoZnJhY3Rpb25zIHNpbXBsaWZpY2F0aW9uKQ0KbGlicmFyeShzY2hvb2xtYXRoKQ0KY2FuY2VsLmZyYWN0aW9uKDQyLCA1NikNCmNhbmNlbC5mcmFjdGlvbigtMTY3LCAxMDApDQoNCg0KIyBOZWp2ZXRzaSBzcG9sZWNueSBkZWxpdGVsIChncmVhdGVzdCBjb21tb24gZGl2aXNvcikNCnggPSAxMg0KeSA9IDgNCmxpYnJhcnkoc2Nob29sbWF0aCkNCnNjaG9vbG1hdGg6OmdjZCh4LCB5KQ0KbGlicmFyeShEZXNjVG9vbHMpDQpEZXNjVG9vbHM6OkdDRCh4LCB5LCBuYS5ybSA9IEZBTFNFKQ0KRGVzY1Rvb2xzOjpHQ0QoYygxMiwxMCw4KSwgbmEucm0gPSBGQUxTRSkNCg0KDQojIE5lam1lbnNpIHNwb2xlY255IG5hc29iZWsgKHNtYWxsZXN0IGNvbW1vbiBtdWx0aXBsZSkNCnggPSAxMg0KeSA9IDgNCmxpYnJhcnkoc2Nob29sbWF0aCkNCnNjaG9vbG1hdGg6OnNjbSh4LCB5KQ0KbGlicmFyeShEZXNjVG9vbHMpDQpEZXNjVG9vbHM6OkxDTSh4LCB5KQ0KRGVzY1Rvb2xzOjpMQ00oYygxMiwxMCw4KSwgbmEucm0gPSBGQUxTRSkNCg0KYGBgDQoNCg0KTW9jbmlueSBhIG9kbW9jbmlueQ0KDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KDQp4ID0gOQ0KeT00DQoNCnNxcnQoeCkNCnheKDEvMikNCnheKC0xLzIpDQoNCngqKjINCnheMg0KeF4oLTIpDQoNCg0KIyB6ZGEgamUgY2lzbG8gbW9jbmlub3UgY2VsZWhvIGNpc2xhDQoNCmxpYnJhcnkobnVtYmVycykNCmlzSW50cG93ZXIoMTQ0KQ0KaXNJbnRwb3dlcig4KQ0KDQpgYGANCg0KDQpFeHBvbmVudHkgYSBsb2dhcml0bXkNCg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCg0KIyMjIEV4cG9uZW50eSAjIyMNCnggPSAyDQoxMF54ICMgZXhwb25lbnQNCjEwKip4ICMgZXhwb25lbnQNCg0KeCA9IDINCmV4cCh4KSAgICMgZV54DQoNCg0KIyMjIFByaXJvemVueSBsb2dhcml0bXVzICMjIw0KeCA9IDEwDQpsb2coeCkgICMgYmFzZSBlDQpsb2coeCwgYmFzZSA9IGV4cCgxKSkgICMgYmFzZSBlDQpsb2coMCkNCg0KDQojIyMgRGVrYWRpY2t5IGxvZ2FyaXRtdXMgIyMjDQp4ID0gMTANCmxvZzEwKHgpICMgYmFzZSAxMA0KbG9nKHgsYmFzZSA9IDEwKQ0KbG9nMTAoMCkNCg0KYGBgDQoNCg0KR29uaW9tZXRyaWNrw6kgZnVua2NlDQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQoNCnggPSBwaS8yDQpjb3MoeCkNCnNpbih4KQ0KdGFuKHgpDQoNCnggPSAxDQphY29zKHgpDQphc2luKHgpDQphdGFuKHgpDQoNCg0KIyBwcmV2b2QgdWhseSB2cyByYWRpYW55DQpsaWJyYXJ5KHByYWNtYSkNCmRlZzJyYWQoMTIwKSANCnJhZDJkZWcoMy4xNCkNCg0KYGBgDQoNCg0KVnlwb8SNw610ZWp0ZSBwSCAwLjAwMSBNIGt5c2VsaW55IGNobG9yb3ZvZMOta292w6ksIDAuMDEgTSBoeWRyb3hpZHUgc29kbsOpaG8sIDAuMTUgTSBreXNlbGlueSBvY3RvdsOpIChLYSA9IDEuNzVlLTUpIGEgMC4wMSBNIGFtb25pYWt1IChLYiA9IDEuOGUtNSkNCg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCg0KIyBIQ2wNCnBIID0gLWxvZzEwKDAuMDAxKTsgcEgNCg0KDQojIE5hT0gNCnBIID0gMTQgLSAoLWxvZzEwKDAuMDEpKTsgcEgNCg0KDQojIENIM0NPT09IDQpwSCA9ICgtbG9nMTAoMS43NWUtNSktbG9nMTAoMC4xNSkpLzI7IHBIDQoNCmxpYnJhcnkoY2gpDQptb25vYShrYT0xLjc1ZS01LCBjPTAuMTUsIGRpZ2l0cyA9IDIpDQptb25vKGthPTEuNzVlLTUsIGM9MC4xNSwgZGlnaXRzID0gNCwgYWNpZCA9IFRSVUUsIGt3ID0gMWUtMTQpDQoNCg0KIyBOSDRPSA0KcEggPSAxNCAtICgtbG9nMTAoMS44ZS01KS1sb2cxMCgwLjAxKSkvMjsgcEgNCg0KbGlicmFyeShjaCkNCm1vbm9iKGthPTEuOGUtNSwgYz0wLjAxLCBkaWdpdHMgPSAyKQ0KbW9ubyhrYT0xLjhlLTUsIGM9MC4wMSwgZGlnaXRzID0gNCwgYWNpZCA9IEZBTFNFLCBrdyA9IDFlLTE0KQ0KDQpgYGANCg0KDQpNYXRlbWF0aWNrw6kga29uc3RhbnR5DQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQoNCiMjIyBMdWRvbGZvdm8gY2lzbG8gIyMjIw0KcGkNCnByaW50KHBpLCBkaWdpdHM9MjApDQoNCiMjIyBFdWxlcm92byBjaXNsbyAjIyMjDQpleHAoMSkNCnByaW50KGV4cCgxKSwgZGlnaXRzPTIwKSANCg0KYGBgDQoNCg0KVmVrdG9yeSAtIGdlbmVyb3bDoW7DrSDFmWFkeSDEjcOtc2VsDQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQoNCjE6Ng0KYygyOjEyKQ0KcmV2KGMoMjoxMikpDQoNCnNlcShmcm9tPTEsIHRvPTIwLCBieT0yKQ0Kc2VxKDUsIC01LCAtMSkNCnNlcShmcm9tPTUsIGJ5PS0xLCBhbG9uZy53aXRoID0gMToyMCkNCg0KcmVwKDEsIGxlbiA9IDkpDQpyZXAoMTo0LCBsZW4gPSA5KQ0KcmVwKDE6NCwgMikNCnJlcCgxOjQsIGVhY2ggPSAyKSAgICAgICAjIG5vdCB0aGUgc2FtZS4NCnJlcCgxOjQsIGVhY2ggPSAyLCBsZW4gPSA0KSAgICAjIGZpcnN0IDQgb25seS4NCnJlcCgxOjQsIGVhY2ggPSAyLCB0aW1lcyA9IDMpICANCg0KYGBgDQoNCg0KVmVrdG9yeSAtIMWZYWRhIG7DoWhvZG7DvWNoIMSNw61zZWwgeiBkYW7DqWhvIHJvem1lesOtDQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQoNCiMgc2V0LnNlZWQoMTIzKQ0Kc2FtcGxlKDEyOjk5LCA5LCByZXBsYWNlID0gRkFMU0UpICMgYmV6IG9wYWtvdmFuaQ0Kc29ydChzYW1wbGUoMToyMCwgOSwgcmVwbGFjZSA9IEZBTFNFKSkNCnNhbXBsZSgxMjo5OSwgOSwgcmVwbGFjZSA9IFRSVUUpICMgcyBvcGFrb3ZhbmltDQpzb3J0KHNhbXBsZSgxOjIwLCA5LCByZXBsYWNlID0gVFJVRSkpDQoNCnJub3JtKG49NiwgbWVhbj0wLCBzZD0xKQ0Kcm5vcm0oNiw5LDEuNSkNCg0KcmJpbm9tKDMwLGMoMCwxKSwwLjUpICNtaW5jZQ0KcmJpbm9tKDMwLGMoMTo2KSwoMS82KSkgI2tvc3RrYSAoZGljZSkNCg0KcnVuaWYobj01LCBtaW49MCwgbWF4PTEpICMgcm92bm9tZXJuZSByb3pkZWxlbmkNCnJ1bmlmKDYsLTIsMikNCg0KYGBgDQoNCg0KSW5kZXh5DQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpzZXQuc2VlZCgxMjMpICMgZ2VuZXJhdG9yIG5haG9kbnljaCBjaXNlbA0KeCA9IHNhbXBsZSgxMjo5OSwxOSwgcmVwbGFjZSA9IEZBTFNFKQ0KaXMudmVjdG9yKHgpDQp4DQp4WzFdDQp4WzE6NV0NCnhbYygxOjUpXQ0KeFtsZW5ndGgoeCldDQp4WyhsZW5ndGgoeCktMSldDQp4Wy0xXQ0KeFstKDE6NSldDQp4Wy1jKDE6NSldDQp4Wy1sZW5ndGgoeCldDQp4WyhsZW5ndGgoeCktMyk6bGVuZ3RoKHgpXSNwb3NsZWRuaSA0IGhvZG5vdHkNCnhbYygxLDQsNyldI3Z5YnJhbmUgaG9kbm90eQ0Kd2hpY2gubWF4KHgpDQp3aGljaC5taW4oeCkNCmxpYnJhcnkoUm1wZnIpDQp3aGljaC5taW4oeCkNCndoaWNoKHg8PTUwKQ0KeFt3aGljaCh4PD01MCldDQp4W3g8PTUwXQ0Kd2hpY2goeD49NTApDQp4W3doaWNoKHg+PTUwKV0NCndoaWNoKHggPT0gbWF4KHgpKSNtYXhpbWFsbmkgaG9kbm90YQ0Kd2hpY2goeCA9PSAxMCkNCndoaWNoKHggIT0gMTApDQp4W3ggPiA0MF0jaG9kbm90eSB2eXNzaSBuZXogNDAuDQp4W3ggPCA0MF0jaG9kbm90eSBtZW5zaSBuZXogNDANCndoaWNoKHggPiAxMCkjaG9kbm90eSB2eXNzaSBuZXogMTAuDQp3aGljaCh4IDwgMTApI2hvZG5vdHkgbWVuc2kgbmV6IDEwLg0KDQpgYGANCg0KDQpVc3BvxZnDoWTDoW7DrSB2ZWt0b3J1DQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQoNCnggPSBzYW1wbGUoMTI6OTksMTksIHJlcGxhY2UgPSBGQUxTRSkNCg0KcmFuayh4KSAgIyB2aG9kbmUgcHJvIHZla3RvcnksIG5ldmhvZG5lIHBybyBtYXRpY2UgDQoNCnNvcnQoeCwgZGVjcmVhc2luZyA9IEZBTFNFKQ0Kc29ydCh4LCBkZWNyZWFzaW5nID0gVFJVRSkNCnNvcnQoeFt3aGljaCh4Pj01MCldKQ0Kb3JkZXIoeCkgICMgcG9yYWRpIChpbmRleHkpIHBybyBzb3J0DQp4W29yZGVyKHgpXQ0KDQpgYGANCg0KDQpNbm/FvmlueQ0KDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KDQp4ID0gMTANCg0KeCA9PSAwDQp4ICE9IDANCnggPT0gMTANCnggIT0gMTANCng+MA0KeDwwDQp4Pj0wDQp4Pj0xMA0KeDw9MTANCi14Pj0xMA0KDQpsaWJyYXJ5KGV4dHJhb3BlcmF0b3JzKQ0KIyBodHRwczovL2pvc2h1YXdpbGV5LmNvbS9leHRyYW9wZXJhdG9ycy8NCnglbCUxMCAjIDwNCnglbGUlMTAgIyA8PQ0KeCVnJTEwICMgPg0KeCVnZSUxMCAjID49DQogDQogDQp4IDwtIGMoc29ydChzYW1wbGUoMToyMCwgMykpKQ0KDQp4PjUgJiB4PDEwICMgNSA8IHggQU5EIHggPCAxMQ0KeD41IHwgeDwxMCAjIDUgPCB4IE9SIHggPCAxMQ0KDQpsaWJyYXJ5KGV4dHJhb3BlcmF0b3JzKQ0KIyBodHRwczovL2pvc2h1YXdpbGV5LmNvbS9leHRyYW9wZXJhdG9ycy8NCg0KNSVnbCUxMCAjICMgNSA8IHggQU5EIHggPCAxMSAoNSwgMTEpDQo1JWdlbCUxMCAjIDUgPD0geCBBTkQgeCA8IDExIFs1LCAxMSkNCjUlZ2xlJTEwICMgNSA8IHggQU5EIHggPD0gMTEgKDUsIDExXQ0KNSVnZWxlJTEwICMgNSA8PSB4IEFORCB4IDw9IDExIFt4LCB5XQ0KDQoNCnkgPC0gYyhzb3J0KHNhbXBsZSgzOjIzLCA3KSkpDQoNCnVuaW9uKHgsIHkpICMgc2plZG5vY2VuaQ0KaW50ZXJzZWN0KHgsIHkpICMgcHJ1bmlrDQpzZXRkaWZmKHgsIHkpICMgcm96ZGlsIG1ub3ppbg0Kc2V0ZGlmZih5LCB4KSAjIHJvemRpbCBtbm96aW4NCg0KDQojIGtsYWRuZSB2cy4gemFwb3JuZSBjaXNsbw0KeCA8LSBjKC0xLCAtMiwgMy4wMiwgNCwgLTUuMiwgNiwgLTcsIDApIA0Kc2Nob29sbWF0aDo6aXMubmVnYXRpdmUoeCkNCnNjaG9vbG1hdGg6OmlzLnBvc2l0aXZlKHgpDQpzY2hvb2xtYXRoOjppcy5yZWFsLnBvc2l0aXZlKHgpDQoNCiMgc3VkZSB2cy4gbGljaGUgY2lzbG8NCnggPC0gYygxLCAyLCAzLCA0LCA1LCA2LCA3KSANCnNjaG9vbG1hdGg6OmlzLmV2ZW4oeCkNCnNjaG9vbG1hdGg6OmlzLm9kZCh4KQ0KeCAlJSAyID09IDAgDQp4ICUlIDIgIT0gMA0KDQpgYGANCg0KDQpWZWt0b3JvdsOhIGFyaXRtZXRpa2ENCg0KYGBge3J9DQphID0gYygxLCAzLCA1LCA3KSANCmIgPSBjKDEsIDIsIDQsIDgpIA0KNSAqIGENCmEgKyBiIA0KYSAtIGIgDQphICogYiANCmEgLyBiDQoNCnUgPSBjKDEwLCAyMCwgMzApIA0KdiA9IGMoMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSkgDQp1ICsgdiANCg0KZGlmZih1KQ0KZGlmZih2KQ0KDQoNCm1heCh4KQ0KbWluKHgpDQpyYW5nZSh4KQ0KbGlicmFyeShEZXNjVG9vbHMpDQpSYW5nZSh4KQ0Kc3VtKHgpDQpjdW1zdW0oeCkNCnByb2QoeCkNCmN1bXByb2QoeCkNCmRpZmYoeCkNCnNpZ24oeCkNCg0KYGBgDQoNCg0KRmlsdHJvdsOhbsOtIGhvZG5vdCB2ZSB2ZWt0b3J1DQoNCmBgYHtyfQ0KDQp4ID0gc2FtcGxlKDEyOjk5LCA5LCByZXBsYWNlID0gVFJVRSkNCngNCnVuaXF1ZSh4KQ0KdGFibGUoeCkNCnN1bW1hcnkoYXMuZmFjdG9yKHgpKQ0KIyBmcmVrdmVuY2Ugdnlza3l0dSBkYW5laG8gY2lzbGENCnN1bSh4PT0zMikNCmxlbmd0aCh3aGljaCh4PT01NykpDQoNCg0KbnVtYmVycyA9Yyg0LDIzLDQsMjMsNSw0Myw1NCw1Niw2NTcsNjcsNjcsNDM1LDQ1Myw0MzUsNyw2NSwzNCw0MzUpDQp0YWJsZShudW1iZXJzKVsyXT09MQ0KbnVtYmVyc1syXQ0Kc3VtKG51bWJlcnM9PTQzNSkNCg0KZHVwbGljYXRlZChudW1iZXJzKSAjIGlkZW50aWZ5aW5nIGR1cGxpY2F0ZWQgZWxlbWVudHMgDQpudW1iZXJzW2R1cGxpY2F0ZWQobnVtYmVycyldDQp1bmlxdWUobnVtYmVycykgIyBleHRyYWN0aW5nIHVuaXF1ZSBlbGVtZW50cywNCg0KYGBgDQoNCg0KTWF0aWNlDQoNCmBgYHtyfQ0KDQp4ID0gc2FtcGxlKDEyOjk5LDE4LCByZXBsYWNlID0gRkFMU0UpOyB4DQptYXRyaXgoeCxucm93PTYsbmNvbD0zLGJ5cm93ID0gVFJVRSkNCm1hdHJpeCh4LG5yb3c9NixuY29sPTMsYnlyb3cgPSBGQUxTRSkNCg0KDQp4MSA9IHNhbXBsZSgxMjo5OSwxOSwgcmVwbGFjZSA9IEZBTFNFKQ0KeDIgPSBzYW1wbGUoMTI6OTksMTksIHJlcGxhY2UgPSBUUlVFKQ0KDQp4MTIgPSByYmluZCh4MSx4MikNCngxMiA9IGNiaW5kKHgxLHgyKQ0KaXMubWF0cml4KHgxMikNCm5yb3coeDEyKQ0KbmNvbCh4MTIpDQoNCngxMltvcmRlcih4MSksXQ0KeDEyW29yZGVyKHgyKSxdDQp4MTJbLDFdDQp4MTJbLCJ4Il0NCngxMiR4DQoNCmNvbG5hbWVzKHgxMikNCmNvbG5hbWVzKHgxMik9YygiWCIsIlkiKQ0Kcm93bmFtZXMoeDEyKQ0Kcm93bmFtZXMoeDEyKSA9IExFVFRFUlNbMTpsZW5ndGgoeDEpXSANCg0KYGBgDQoNCg0KRGF0YWZyYW1lcw0KDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KDQp4MSA9IHNhbXBsZSgxMjo5OSwxOSwgcmVwbGFjZSA9IEZBTFNFKQ0KeDIgPSBzYW1wbGUoMTI6OTksMTksIHJlcGxhY2UgPSBUUlVFKQ0KeiA9IExFVFRFUlNbMTpsZW5ndGgoeDEpXSANCg0KeDEyID0gcmJpbmQoeDEseDIseikNCngxMiA9IGNiaW5kKHgxLHgyLHopDQpucm93KHgxMikNCm5jb2woeDEyKQ0KaXMuZGF0YS5mcmFtZSh4MTIpDQppcy5tYXRyaXgoeDEyKQ0KDQp4MTIgPSBhcy5kYXRhLmZyYW1lKHgxMikNCngxMlssMV0gPSBhcy5udW1lcmljKHgxMlssMV0pDQp4MTJbLDJdID0gYXMubnVtZXJpYyh4MTJbLDJdKQ0KDQppcy5kYXRhLmZyYW1lKHgxMikNCmNvbG5hbWVzKHgxMikNCnJvd25hbWVzKHgxMikNCmFzLm1hdHJpeCh4MTIpDQoNCg0KbWVhbih4MSkNCm1lYW4oYXMubnVtZXJpYyh4MTJbLDFdKSkNCg0KYGBgDQoNCg0KU2V6bmFteSAobGlzdHMpDQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQoNCng9IGxpc3QoMSwyLDMpDQpuYW1lcyh4KSA9IGMoIngxIiwieDIiLCJ4MyIpDQp4JHgxWzFdDQp4W1syXV1bMV0NCg0KeDEgPSBzYW1wbGUoMTI6OTksMTksIHJlcGxhY2UgPSBGQUxTRSkNCngyID0gc2FtcGxlKDEyOjk5LDE5LCByZXBsYWNlID0gVFJVRSkNCngzID0gc2FtcGxlKDEyOjk5LDE5LCByZXBsYWNlID0gVFJVRSkNCnogPSBMRVRURVJTWzE6bGVuZ3RoKHgxKV0gDQoNCngxMjMgPSBsaXN0KHgxLHgyLHgzLHopDQppcy5saXN0KHgxMjMpDQpuYW1lcyh4MTIzKSA9IGMoIngxIiwieDIiLCJ4MyIsInoiKSANCngxMjMkeDENCngxMjNbWzFdXQ0KDQoNCngxID0gc2FtcGxlKDEyOjk5LDE5LCByZXBsYWNlID0gRkFMU0UpDQp4MiA9IHNhbXBsZSgxMjo5OSwxOSwgcmVwbGFjZSA9IFRSVUUpDQp4MyA9IHNhbXBsZSgxMjo5OSwxOSwgcmVwbGFjZSA9IFRSVUUpDQpMTCA9IGxpc3QoeDEseDIseDMpDQpuYW1lcyhMTCkgPSBjKCJ4MSIsIngyIiwieDMiKQ0KDQpMTFtbMl1dWzNdDQpMTCR4MlszXQ0KDQpgYGANCg0KDQoNClZ5cG/EjcOtdGVqdGUgbW9sZWt1bG92w6kgaG1vdG5vc3RpIGFsa2Fuxa8gQzEgLSBDMTIuDQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQoNCkhDID0gZnVuY3Rpb24obil7bioxMi4wMTEgKyAoMipuICsgMikqMS4wMDh9DQoNCmhjMTEyID0gSEMoYygxOjEyKSkNCm5hbWVzKGhjMTEyKSA9IGMoMToxMikNCmhjMTEyDQoNCmhjMTEyID0gc2FwcGx5KGMoMToxMiksSEMpDQpuYW1lcyhoYzExMikgPSBjKDE6MTIpDQpoYzExMg0KDQpoYzExMiA9IGxhcHBseShjKDE6MTIpLEhDKQ0KbmFtZXMoaGMxMTIpID0gYygxOjEyKQ0KaGMxMTINCg0KYGBgDQoNCg0KVmxpdiAzIMWvem7DvWNoIGRydWjFryBrcm1pdmEgbmEgcMWZw61yxa9zdGVrIMW+aXbDqSB2w6FoeSAodiBrZykgcHJhc2F0LCByb3pkxJtsZW7DvWNoIGRvIDQgcsWvem7DvWNoIHNrdXBpbi4gDQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQoNCkEgPSBjKDcuMCwgMTYuMCwgMTAuNSwgMTMuNSkNCkIgPSBjKDE0LjAsIDE1LjUsIDE1LjAsIDIxLjApDQpDID0gYyg4LjUsIDE2LjUsIDkuNSwgMTMuNSkNCnBzID1jYmluZChBLEIsQykNCmNvbG5hbWVzKHBzKSA9IGMoIkEiLCJCIiwiQyIpDQpyb3duYW1lcyhwcykgPSBjKCJJIiwiSUkiLCJJSUkiLCJJViIpDQpwcw0KDQpjb2xTdW1zKHBzKQ0Kcm93U3VtcyhwcykNCg0KY29sTWVhbnMocHMpDQpyb3dNZWFucyhwcykNCg0KYXBwbHkocHMsMixtZWFuKQ0KYXBwbHkocHMsMSxtZWFuKQ0KDQojIGRlbGVuaSBob2Rub3QgdmUgc2xvdXBjaSBzdW1vdSBzbG91cGNlDQpzdXAgPSBhcHBseShwcywyLHN1bSkNCnNhcHBseShjKDE6MyksZnVuY3Rpb24oaSl7cHNbLGldL3N1cFtpXX0pDQoNCg0KbGlicmFyeShyZXNoYXBlMikNCm1lbHQocHMpDQpwciA9IHNldE5hbWVzKG1lbHQocHMpLCBjKCdzZXJpZScsJ2tybWVuaScsJ3ByaXJ1c3RlaycpKQ0KcHINCg0KYXMuZGF0YS5mcmFtZShwcikNCmFzLm1hdHJpeChwcikNCg0KYWNhc3QocHIsc2VyaWUgfiBrcm1lbmkpDQoNCg0Kc3QgPSBzdGFjayhhcy5kYXRhLmZyYW1lKHBzKSk7IHN0DQp1bnN0YWNrKHN0KQ0KDQoNCnByaXJ1c3RlayA9IHByWywicHJpcnVzdGVrIl0NCnNlcmllID0gYXMuZmFjdG9yKHByWywic2VyaWUiXSkNCmtybWVuaSA9IGFzLmZhY3RvcihwclssImtybWVuaSJdKQ0KDQphZ2dyZWdhdGUocHJpcnVzdGVrLGxpc3Qoa3JtZW5pKSwgRlVOPW1lYW4pDQphZ2dyZWdhdGUocHJpcnVzdGVrLGxpc3Qoc2VyaWUsa3JtZW5pKSwgRlVOPW1lYW4pDQoNCnRhcHBseShwcmlydXN0ZWssIGxpc3Qoa3JtZW5pKSwgbWVhbikNCnRhcHBseShwciRwcmlydXN0ZWssIHByJGtybWVuaSwgbWVhbikNCg0KDQoNCmxwcyA9IGxpc3QoQSxCLEMpDQpscHMNCm5hbWVzKGxwcykgPSBjKCJBIiwiQiIsIkMiKQ0KbHBzDQoNCnVubGlzdChscHMpDQoNCmRvLmNhbGwoY2JpbmQsbHBzKQ0KDQpzYXBwbHkobHBzLG1lYW4pDQpsYXBwbHkobHBzLG1lYW4pDQoNCg0Kc3QgPSBzdGFjayhscHMpOyBzdA0KdW5zdGFjayhzdCkNCg0KbGlicmFyeShyZXNoYXBlMikNCm1lbHQobHBzKQ0KbHByID0gc2V0TmFtZXMobWVsdChscHMpLCBjKCdrcm1lbmknLCdwcmlydXN0ZWsnKSkNCmxwcg0KDQoNCmBgYA0KDQoNClBpcGUgb3BlcmF0b3IgKCU+JSkgdiBSDQoNCmBgYHtyfQ0KDQphID0gMy4xNDE1OQ0KYiA9IHNlcShmcm9tID0gYSwxMCwzKQ0Kcm91bmQoYiwzKQ0KDQphID0gMy4xNDE1OQ0Kc2VxKHJvdW5kKGEsMyksMTAsMykNCg0KIyBwaXBlIG9wZXJhdG9yDQpsaWJyYXJ5KG1hZ3JpdHRyKQ0KYSA9IDMuMTQxNTkNCmEgJT4lIHNlcSgxMCwzKSAlPiUgcm91bmQoMykNCg0KYGBgDQoNCg0KUMWZw61rYXogaWYtZWxzZQ0KDQpgYGB7cn0NCg0KeCA9IHNhbXBsZSgxMjo5OSwxOCwgcmVwbGFjZSA9IEZBTFNFKTsgeA0KaWZlbHNlKHg8NTAsMCwxKQ0KeFt4PDUwXSA9IDANCnhbeD49NTBdID0gMQ0KeA0KDQpgYGANCg0KDQpWeXBvY8OtdGVqdGUgdmF6ZWJub3UgZW5lcmdpaSBhdG9tb3bDqWhvIGrDoWRyYSBwb21vY2kgQmV0aGUgLSBXZWlzemFja2Vyb3Z5IHJvdm5pY2UgQiA9IDE0LjAgLSAxMy4xKkFeKDIvMykgKyAwLjU4NSpaKihaLTEpL0FeKDEvMykgLSAoMTguMSooQS0yKlopXjIpL0EgKyBDL0EsIGtkZQ0KQSAtIG51a2xlb25vdmUgY2lzbG8sIFogLSBhdG9tb3ZlIGNpc2xvLCBDIC0ga29uc3RhbnRhLCBwcm8gasOhZHJhIHNlIHN1ZMO9bSBwb8SNdGVtIHByb3RvbsWvIGkgbmV1dHJvbsWvIGplIHJvdm5hIDEzMiwgDQpwcm8gasOhZHJhIHMgbGljaMO9bSBwb8SNdGVtIHByb3RvbsWvIGkgbmV1dHJvbsWvIGplIHJvdm5hIC0xMzIsIHBybyBsaWNoeSBwb8SNZXQgcHJvdG9uxa8gYSBzdWTDvSBwb8SNZXQgbmV1dHJvbsWvIGEgbmFvcGFrIGplIHJvdm5hIDAuDQoNCmBgYHtyfQ0KDQojIGFscGhhIHBhcnRpY2xlDQpBID0gNCANClogPSAyDQoNCiMgVS0yMzUNCkEgPSAyMzUgDQpaID0gOTINCg0KIyBmdW5rY2UNCk4gPSBBLVoNCmlmIChOJSUyPT0wICYgWiUlMj09MCl7QyA9IDEzMn0gZWxzZSBpZiAoTiUlMiE9MCAmIFolJTIhPTApe0MgPSAtMTMyfSBlbHNlIHtDID0gMH0NCkIgPSAxNC4wIC0gMTMuMSpBXigyLzMpICsgMC41ODUqWiooWi0xKS9BXigxLzMpIC0gKDE4LjEqKEEtMipaKV4yKS9BICsgQy9BDQpCICMgW01lVl0NCkIvQSAjIGVuZXJnaWUgbmEgMSBudWtsZW9uIFtNZVZdDQoNCiMgcG9sb21lciBqYWRyYTogUiA9IFIwICogQV4oMS8zKQ0KUjAgPSAxLjRlLTEzICMgW2NtXQ0KUiA9IFIwICogQV4oMS8zKQ0KUiA9IFIqMTBlLTE1IA0KUiAgICMgW21dDQoNCmBgYA0KDQoNCkN5a2x1cyB0eXB1IHdoaWxlDQoNClZ5cG/EjcOtdGVqdGUgbW9sZWt1bG92w6kgaG1vdG5vc3RpIGFsa2Fuxa8gQzEgLSBDMTIgKHdoaWxlIGxvb3ApDQoNCmBgYHtyfQ0KDQpuID0gMQ0KTWhjID0gTlVMTA0Kd2hpbGUobiA8PSAxMil7DQogIGhjID0gbioxMi4wMTEgKyAoMipuICsgMikqMS4wMDgNCiAgTWhjID0gYyhNaGMsaGMpDQogIG4gPSBuKzENCn0NCm5hbWVzKE1oYykgPSBjKDE6MTIpDQpNaGMNCg0KYGBgDQoNCg0KQ3lrbHVzIHR5cHUgZm9yIChmb3IgbG9vcCkNCg0KVnlwb8SNw610ZWp0ZSBtb2xla3Vsb3bDqSBobW90bm9zdGkgYWxrYW7FryBDMSAtIEMxMg0KDQpgYGB7cn0NCg0KTWhjID0gTlVMTA0KZm9yKG4gaW4gYygxOjEyKSl7DQogIGhjID0gbioxMi4wMTEgKyAoMipuICsgMikqMS4wMDgNCiAgTWhjID0gYyhNaGMsaGMpIA0KfQ0KbmFtZXMoTWhjKSA9IGMoMToxMikNCk1oYw0KDQpgYGANCg0KDQpWeXBvxI3DrXRlanRlIHN0xZllZG7DrSBrdmFkcmF0aWNrb3UgcnljaGxvc3QgbW9sZWt1bCBkYW7DvWNoIHBseW7FryB2IHJvem1lesOtIHRlcGxvdCBvZCAxNTAgSyBkbyA1MDAgSyBzIGtyb2tlbSA1MCBLLg0KDQpgYGB7cn0NCg0KZWwgPSBjKCJIMiIsIkhlIiwgIk8yIiwgIktyIikNCk0gPSBjKDIuMDE1OSwgNC4wMDI2LCAzMS45OTg4LCA4My44KSAjIFtnIC8gbW9sXQ0KVHMgPSBzZXEoZnJvbT0xNTAsIHRvPTUwMCwgYnk9NTApICMgW0tdDQpSID0gODMxNC4zNCAjIFtKIC8ga21vbCBLXQ0KTUtWID0gTlVMTA0KZm9yKHR0IGluIFRzKXsNCiAgbWt2PSByZXAoMCwgbGVuZ3RoKE0pKQ0KICBmb3IoaWkgaW4gYygxOmxlbmd0aChNKSkpew0KICAgIG1rdltpaV0gPSAoMypSKnR0L01baWldKV4oMS8yKQ0KICB9DQogIE1LViA9IHJiaW5kKE1LViwgbWt2KSAgIA0KfQ0KY29sbmFtZXMoTUtWKSA9IGVsDQpyb3duYW1lcyhNS1YpID0gVHMNCk1LVg0KcGxvdCgwLDAseGxpbT1jKG1pbihUcyksbWF4KFRzKSkseWxpbSA9IGMobWluKE1LViksbWF4KE1LVikpLCB0eXBlID0ibiIseGxhYj0iVCBbS10iLHlsYWI9InN0ci4ga3YuIHJ5Y2hsb3N0IFttL3NdIikNCmZvcihpaSBpbiBjKDE6bGVuZ3RoKE0pKSl7cG9pbnRzKFRzLE1LVlssaWldLCB0eXBlPSJwIixjb2w9aWkscGNoPTE2KX0NCmxlZ2VuZCgidG9wbGVmdCIsbGVnZW5kPWVsLGNvbD1jKDE6bGVuZ3RoKE0pKSxwY2g9MTYsY2V4PS44KQ0KDQpgYGANCg0KDQpGeXppa8OhbG7DrSBrb25zdGFudHkNCg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCg0KbGlicmFyeShtYXJlbGFjKQ0KZGF0YShDb25zdGFudHMpDQpDb25zdGFudHMNCg0KIyBVbml2ZXJ6YWxuaSBwbHlub3ZhIGtvbnN0YW50YQ0KQ29uc3RhbnRzJGdhc0N0MQ0KQ29uc3RhbnRzJGdhc0N0Mg0KQ29uc3RhbnRzJGdhc0N0Mw0KUiA9IGFzLm51bWVyaWMoQ29uc3RhbnRzJGdhc0N0MlsxXSk7IFIgIyBob2Rub3RhDQpDb25zdGFudHMkZ2FzQ3QyWzJdICMgamVkbm90a2ENCg0KDQpsaWJyYXJ5KGNvbnN0YW50cykNCmNvZGF0YQ0Kc3ltc193aXRoX2Vycm9ycw0Kc3ltc193aXRoX3VuaXRzDQoNCmxvb2t1cCgicGxhbmNrIiwgaWdub3JlLmNhc2U9VFJVRSkNCmxvb2t1cCgiYXZvZ2Fkcm8iLCBpZ25vcmUuY2FzZT1UUlVFKQ0KbG9va3VwKCJmYXJhZGF5IiwgaWdub3JlLmNhc2U9VFJVRSkNCmxvb2t1cCgibW9sYXIiLCBpZ25vcmUuY2FzZT1UUlVFKQ0KbG9va3VwKCJtb2xhciBtYXNzIiwgaWdub3JlLmNhc2U9VFJVRSkNCmxvb2t1cCgibGlnaHQiLCBpZ25vcmUuY2FzZT1UUlVFKQ0KbG9va3VwKCJib2x0em1hbm4iLCBpZ25vcmUuY2FzZT1UUlVFKQ0KbG9va3VwKCJtYXNzIiwgaWdub3JlLmNhc2U9VFJVRSkNCmxvb2t1cCgibWFzcyBjb25zdGFudCIsIGlnbm9yZS5jYXNlPVRSVUUpDQpsb29rdXAoInByb3RvbiBtYXNzIiwgaWdub3JlLmNhc2U9VFJVRSkNCmxvb2t1cCgiZWxlY3Ryb24gbWFzcyIsIGlnbm9yZS5jYXNlPVRSVUUpDQoNCiMgVW5pdmVyemFsbmkgcGx5bm92YSBrb25zdGFudGENCmxvb2t1cCgiZ2FzIiwgaWdub3JlLmNhc2U9VFJVRSkNCmNvZGF0YVsxMzQsXQ0KUiA9IGFzLm51bWVyaWMoY29kYXRhWzEzNCw1XSkgIyBob2Rub3RhDQpSdSA9IGFzLm51bWVyaWMoY29kYXRhWzEzNCw2XSkgIyBuZWppc3RvdGENCmNvZGF0YVsxMzQsN10gIyBqZWRub3RrYQ0KDQpgYGANCg0KDQpgYGB7cn0NCg0KbGlicmFyeShjaCkNCnBlcmlvZF90YWJsZSgpDQoNCmxpYnJhcnkoRGVzY1Rvb2xzKQ0KZGF0YShkLnBlcmlvZGljKQ0KZC5wZXJpb2RpYw0KDQpsaWJyYXJ5KGxvb24uZGF0YSkNCmRhdGEoZWxlbWVudHMpDQplbGVtZW50cw0KDQpsaWJyYXJ5KFBlcmlvZGljVGFibGUpDQpkYXRhKHBlcmlvZGljVGFibGUpDQpwZXJpb2RpY1RhYmxlDQojDQplbCA9ICJTZSINCnBlbCA9IHBlcmlvZGljVGFibGVbd2hpY2gocGVyaW9kaWNUYWJsZSRzeW1iPT1lbCksXQ0KcGVsJGNvbmZpZw0KcGVsJG1hc3MNCnBlbCRFbmVnDQp2ZWwgPSBwZWwkZ3JvdXAtMTAgICMgcG9jZXQgdmFsZW5jbmljaCBlbGVrdHJvbnUgYXRvbXUNCg0KbGlicmFyeShDaGVtbWluZVIpICMgYmlvYw0KZGF0YShhdG9tcHJvcCkNCmF0b21wcm9wDQoNCmxpYnJhcnkoQ0hOT1NaKQ0KdGhlcm1vKCkkZWxlbWVudA0KdGhlcm1vKCkkZWxlbWVudFssYygxLDQpXQ0KDQoNCiMjIyMgQXRvbW92ZSBobW90bm9zdGkNCg0KbGlicmFyeShtYXJlbGFjKQ0KZGF0YShBdG9taWNXZWlnaHQpDQpBdG9taWNXZWlnaHQNCg0KQXRvbWljV2VpZ2h0W0F0b21pY1dlaWdodCRTeW1ib2wgPT0gIkMiLF0NCmF0b21pY3dlaWdodCRDIA0KDQptb2x3ZWlnaHQoIkgiKSANCm1vbHdlaWdodCgiQyIpDQoNCmxpYnJhcnkoQ0hOT1NaKQ0KQVcgPSBDSE5PU1o6Om1hc3MoIkNhIik7IEFXDQoNCmxpYnJhcnkoYmlvZ2FzKQ0KbW9sTWFzcygiQyIpDQptb2xNYXNzKCdGZScpDQoNCmBgYA0KDQoNClVyxI1ldGUgZMOpbGt1IG3Em2TEm27DqWhvIGRyw6F0dSBvIHByxa9txJtydSAxLjYgbW0gamVob8W+IGhtb3Rub3N0IGplIDAuOCBrZy4NCg0KYGBge3J9DQoNCmxpYnJhcnkoUGVyaW9kaWNUYWJsZSkNCmRhdGEocGVyaW9kaWNUYWJsZSkNCnB0Q3UgPSBwZXJpb2RpY1RhYmxlW3doaWNoKHBlcmlvZGljVGFibGUkc3ltYj09IkN1IiksXQ0KcHRDdSRkZW5zaXR5DQoNCmhtID0gMC44ICMga2cNCnJobyA9IHB0Q3UkZGVuc2l0eSoxMDAwICMga2cvbTMNCiMgcmhvID0gODkwMCAjIGtnL20zDQpkID0gMS42ZS0zICMgbQ0KDQpWID0gaG0vcmhvDQpTID0gcGkqKGQvMileMg0KTCA9IFYvUzsgTA0KDQpwYXN0ZSgiRMOpbGthIGRyw6F0dSBqZSIsIHJvdW5kKEwsMCksICJtLiIpDQoNCmBgYA0KDQoNCk1vbGVrdWxvdsOpIGhtb3Rub3N0aQ0KDQpgYGB7cn0NCg0KbGlicmFyeShlbnZpUGF0KQ0KZGF0YShjaGVtZm9ybXMpDQpjaGVtZm9ybXMNCmZvcm11bGExPC1jKCJDMTJIMTBDbDEwIikNCmZvcm11bGEyPC1jKCJDM0g1IikNCiMgb2RlY2l0YW5pIDIgdnpvcmN1DQpzdWJmb3JtKGZvcm11bGExLGZvcm11bGEyKQ0KIyBzY2l0YW5pIDIgdnpvcmN1DQptZXJnZWZvcm0oZm9ybXVsYTEsZm9ybXVsYTIpDQojIG5hc29iZW5pIHZ6b3JjZQ0KZm9ybXVsYTE8LWMoIkMxMkgxMENsMTAiKQ0KbXVsdGlmb3JtKGZvcm11bGExLDMpDQoNCg0KbGlicmFyeShtYXJlbGFjKQ0KbW9sd2VpZ2h0KCJDTzIiKSANCm1vbHdlaWdodCgiSENPMyIpIA0KbW9sd2VpZ2h0KCJIM1BPNCIpDQptb2x3ZWlnaHQoIkNIM0NIMkNIQ0hDSDJDSENIQ0gyQ0hDSENIMkNIQ0hDSDJDSENIKENIMikzQ09PSCIpICMgZWljb3NhcGVudGFlbm9pYyBhY2lkIChFUEEpIA0KbW9sd2VpZ2h0KCJDMjBIMzBPMiIpDQptb2x3ZWlnaHQoYygiQzJINU9IIiwgIkNPMiIsICJIMk8iKSkgDQptb2x3ZWlnaHQoYygiU2lPRkg0IiwgIk5hSENPMyIsICJDNkgxMk82IiwgIkNhKEhDTzMpMiIsICJQYihOTzMpMiIsICIoTkg0KTJTTzQiKSkNCg0KDQpsaWJyYXJ5KENITk9TWikNCk1XID0gQ0hOT1NaOjptYXNzKCJDYUNPMyIpOyBNVw0KIyBwb2NldCBhdG9tdSBwcnZrdSB2ZSB2em9yY2kNCmNlID0gY291bnQuZWxlbWVudHMoIkNhQ08zIik7IGNlDQphcy5jaGVtaWNhbC5mb3JtdWxhKGNlLCBkcm9wLnplcm8gPSBUUlVFKQ0KDQptZSA9IG1ha2V1cCgiQzZIMTJPNiIsIG11bHRpcGxpZXIgPSAxLCBzdW0gPSBUUlVFLCBjb3VudC56ZXJvID0gVFJVRSk7IG1lDQpjZSA9IGNvdW50LmVsZW1lbnRzKCJDNkgxMk82Iik7IGNlDQppMkEoIkM2SDEyTzYiKQ0KYXMuY2hlbWljYWwuZm9ybXVsYShjZSwgZHJvcC56ZXJvID0gVFJVRSkNCmFzLmNoZW1pY2FsLmZvcm11bGEobWUsIGRyb3AuemVybyA9IFRSVUUpDQoNCg0KbGlicmFyeShiaW9nYXMpDQptb2xNYXNzKCJDNkgxMk82IikNCm1vbE1hc3MoYygiQzZIMTJPNiIsICJDSDNDT09IIikpDQptb2xNYXNzKCJIM0MoQ0gyKTVDT09IIikNCm1vbE1hc3MoJ0ZlU080KEgyTyk3JykgIyBoeWRyYXRlcw0KbW9sTWFzcygiKEM2SDEyTzYpMC4yNDk5OSAoSDNDT09IKTAuNzUwMDEiKQ0KDQoNCmxpYnJhcnkoQlJBSU4pICMgQmlvYw0KY2FsY3VsYXRlQXZlcmFnZU1hc3MobGlzdChDPTYwLCBIPTMwLCBOPTAsIE89MzAsIFM9MCkpDQoNCg0KbGlicmFyeShNU2JveCkNCk1TYm94OjptYXNzKCdDN0g3TycpDQpNU2JveDo6bWFzcygnQzdoN28xJykNCk1TYm94OjptYXNzKCdDN0g3TycsIGNhc2VTZW5zaXRpdmUgPSBUUlVFKQ0KDQpgYGANCg0KDQpVaGxvdm9kw61rIG8gbW9sZWt1bG92w6kgaG1vdG5vc3RpIDg0IGcvbW9sIG9ic2FodWplIDg1LjcxICUgdWhsw61rdSBhIDE0LjI5ICUgdm9kw61rdS4gVXLEjWV0ZSBtb2xla3Vsb3bDvSB2em9yZWMuDQoNCmBgYHtyfQ0KDQpNID0gODQgIyBnL21vbA0KbWMgPSAwLjg1NzENCm1oID0gMC4xNDI5DQpsaWJyYXJ5KG1hcmVsYWMpDQptQyA9IG1vbHdlaWdodCgiQyIpICMgZy9tb2wNCm1IID0gbW9sd2VpZ2h0KCJIIikgIyBnL21vbA0KDQpycyA9IGMobWMvbUMsbWgvbUgpL21pbihtYy9tQyxtaC9tSCkNCnJzID0gcm91bmQocnMsMCkNCm4gPSBNL3N1bShycypjKG1DLG1IKSkNCm4gPSByb3VuZChuLDApDQpmb3JtID0gcnMqbjsgZm9ybQ0KZ3N1YigiICIsICIiLCBwYXN0ZSgiQyIsZm9ybVsxXSwiSCIsZm9ybVsyXSkpDQoNCg0KbGlicmFyeShSZGlzb3ApDQpkbXAgPSBkZWNvbXBvc2VNYXNzKG1hc3M9TSwgcHBtPTEsIG16YWJzPTAuMSwgIGVsZW1lbnRzPWluaXRpYWxpemVFbGVtZW50cyhjKCJDIiwiSCIpKSwgej0xLCBtaW5FbGVtZW50cz0iQzQiLCBtYXhFbGVtZW50cz0iQzEwIikNCmRtcCRmb3JtdWxhDQoNCmxpYnJhcnkocmNkaykNCmdlbmVyYXRlLmZvcm11bGEoTSwgd2luZG93PTUsIHZhbGlkYXRpb249RkFMU0UsIGNoYXJnZT0xLGVsZW1lbnRzPWxpc3QoYygiQyIsMiwxMCksYygiSCIsNCwzMCkpKQ0KDQpgYGANCg0KDQpJem90b3B5DQoNCmBgYHtyfQ0KDQpsaWJyYXJ5KGVudmlQYXQpDQpkYXRhKGlzb3RvcGVzKQ0KaXNvdG9wZXMNCg0KbGlicmFyeShlY2lwZXgpDQpuaXN0aXNvDQpuaXN0aXNvJG1hc3MNCm5pc3Rpc28kYWJ1bmRhbmNlDQpuaXN0aXNvJGVsZW1lbnQNCg0KbGlicmFyeShJc29TcGVjUikNCmRhdGEoaXNvdG9waWNEYXRhKQ0KaXNvdG9waWNEYXRhDQoNCmxpYnJhcnkoQ0lBQVdjb25zZW5zdXMpDQpjaWFhdy5tYXNzLjIwMDMNCmNpYWF3Lm1hc3MuMjAxMg0KY2lhYXcubWFzcy4yMDE2DQoNCmBgYA0KDQoNCkl6b3RvcG92w6kgcGF0dGVybnkNCg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCg0KDQpsaWJyYXJ5KE9yZ01hc3NTcGVjUikNCklzb3RvcGljRGlzdHJpYnV0aW9uKGZvcm11bGEgPSBsaXN0KEMgPSAxLCBIID0gMSwgQ2wgPSAzKSwgY2hhcmdlID0gMSkNCiMgYWxsb3dlZCBlbGVtZW50czogQywgSCxOLCBPLCBTLCBQLCBCciwgQ2wsIEYsIFNpLg0KIyByZWxhdGl2ZSBhdG9taWMgbWFzc2VzIG9mIHRoZSBlbGVtZW50cyBhcmUgZnJvbSB0aGUgTklTVCBQaHlzaWNhbCBSZWZlcmVuY2UgRGF0YSANCiMgaHR0cHM6Ly93d3cubmlzdC5nb3YvcG1sL2F0b21pYy13ZWlnaHRzLWFuZC1pc290b3BpYy1jb21wb3NpdGlvbnMtcmVsYXRpdmUtYXRvbWljLW1hc3Nlcy4NCg0KbXggPC0gSXNvdG9waWNEaXN0cmlidXRpb24oZm9ybXVsYSA9IGxpc3QoQyA9IDksIEggPSA0LCBCciA9IDUsIENsID0gMSwgTiA9IDIpKQ0KbGlicmFyeShsYXR0aWNlKQ0KeHlwbG90KHBlcmNlbnQgfiBteiwgZGF0YSA9IG14LHR5cGUgPSAiaCIseGxhYiA9ICJtL3oiLHlsYWIgPSAiaW50ZW5zaXR5ICglKSIsbWFpbiA9ICJJc290b3BpYyBEaXN0cmlidXRpb24sIEM5SDRCcjVDbE4yIikNCg0KDQojIEM2MEgzME8zMA0KDQpsaWJyYXJ5KE9yZ01hc3NTcGVjUikNCnggPC0gSXNvdG9waWNEaXN0cmlidXRpb24oZm9ybXVsYSA9IExpc3RGb3JtdWxhKCJDNjBIMzBPMzAiKSkNCnBsb3QoeCRteiwgeCRwZXJjZW50LHR5cGUgPSAiaCIseGxhYiA9ICJtL3oiLHlsYWIgPSAiaW50ZW5zaXR5ICglKSIsbWFpbiA9ICJJc290b3BpYyBEaXN0cmlidXRpb24sIEM2MEgzME8zMCIsbHdkPTIpDQphYmxpbmUoaD0wLGx0eT0yKQ0KDQpsaWJyYXJ5KGVjaXBleCkNCnh4IDwtIGVjaXBleCgiQzYwSDMwTzMwIiwgaXNvaW5mbyA9IG5pc3Rpc28sIGxpbWl0ID0gMC4wMDA1LGlkID0gRkFMU0UsIHNvcnRieSA9ICJtYXNzIikNCmxtYXNzID0geHgkQzYwSDMwTzMwJG1hc3MNCmxhYnVuID0geHgkQzYwSDMwTzMwJGFidW5kYW5jZQ0KcGxvdChsbWFzcyxsYWJ1bix0eXBlPSJoIix4bGFiPSJtL3oiLHlsYWI9ImFidW5kYW5jZSIpDQphYmxpbmUoaD0wLGx0eT0yKQ0KDQpsaWJyYXJ5KHJjZGspDQpmb3JtdWxhMSA8LSBnZXQuZm9ybXVsYSgiQzYwSDMwTzMwIiwgY2hhcmdlID0gMSkNCmlzb3QxIDwtIGdldC5pc290b3Blcy5wYXR0ZXJuKGZvcm11bGExLG1pbkFidW5kPTAuMDAwMDUpDQpwbG90KGlzb3QxWywxXSwgaXNvdDFbLDJdLHR5cGUgPSAiaCIseGxhYiA9ICJtL3oiLHlsYWIgPSAiaW50ZW5zaXR5ICglKSIsbWFpbiA9ICJJc290b3BpYyBEaXN0cmlidXRpb24sIEM2MEgzME8zMCIsbHdkPTIpDQphYmxpbmUoaD0wLGx0eT0yKQ0KDQpsaWJyYXJ5KGVudmlQYXQpDQpkYXRhKGlzb3RvcGVzKQ0KDQpwYXR0ID0gaXNvcGF0dGVybihpc290b3BlcywgIkM2MEgzME8zMCIsIHRocmVzaG9sZCA9IDAuMDAxLCBjaGFyZ2UgPSBGQUxTRSxlbWFzcyA9IDAuMDAwNTQ4NTgsIHBsb3RpdCA9IFRSVUUsIGFsZ289MSwgcmVsX3RvID0gMCwgdmVyYm9zZSA9IFRSVUUscmV0dXJuX2lzb19jYWxjX2Ftb3VudCA9IEZBTFNFKQ0KDQplbnZlbG9wZShwYXR0ZXJuPXBhdHQsIHBwbSA9IEZBTFNFLCBkbXogPSAiZ2V0IiwgZnJhYyA9IDEvNCwgZW52ID0gIkdhdXNzaWFuIixyZXNvbHV0aW9uID0gNWUrMDMsIHBsb3RpdCA9IFRSVUUsIHZlcmJvc2UgPSBUUlVFKQ0KDQoNCmxpYnJhcnkoUmRpc29wKQ0KTW0gPC0gZ2V0TW9sZWN1bGUoIkM2MEgzME8zMCIsIHo9MCwgZWxlbWVudHM9aW5pdGlhbGl6ZUVsZW1lbnRzKGMoIkMiLCJIIiwiTyIpKSkNCmdldE1hc3MoTW0pDQpnZXRGb3JtdWxhKE1tKQ0KZ2V0SXNvdG9wZShNbSkNCmdldElzb3RvcGUoTW0sIGluZGV4PTEpDQpnZXRWYWxpZChNbSkNCmlzb3RvcGVzIDwtIGdldElzb3RvcGUoTW0sIHNlcSgxLDEwKSkNCmlzb3RvcGVzDQpwbG90KGlzb3RvcGVzWzEsXSwgaXNvdG9wZXNbMixdLHR5cGUgPSAiaCIseGxhYiA9ICJtL3oiLHlsYWIgPSAiYWJ1bmRhbmNlIixtYWluID0gIkM2MEgzME8zMCIsbHdkPTIpDQphYmxpbmUoaD0wLGx0eT0yKQ0KDQoNCmxpYnJhcnkoQlJBSU4pICMgYmlvYw0KYUMgPSBsaXN0KEM9NjAsIEg9MzAsIE49MCwgTz0zMCwgUz0wKQ0KbnJQZWFrcyA9IGNhbGN1bGF0ZU5yUGVha3MoYUMpDQpuclBlYWtzDQpyZXMgPC0gY2FsY3VsYXRlSXNvdG9waWNQcm9iYWJpbGl0aWVzKGFDID0gYUMsIHN0b3BPcHRpb249Im5yUGVha3MiLCBuclBlYWtzID0gbnJQZWFrcykNCnJlcw0KDQoNCmxpYnJhcnkoSXNvU3BlY1IpDQpJc29TcGVjaWZ5KG1vbGVjdWxlID0gYyhDPTEwLEg9MjIsTz0xKSwgc3RvcENvbmRpdGlvbiA9IC45OTk5ICkNCg0KYGBgDQoNCg0KSXpvdG9wb3bDqSBwb23Em3J5DQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQoNCmxpYnJhcnkoQ0lBQVdjb25zZW5zdXMpDQoNCiMjIE5vcm1hbGl6YWNlIMO6ZGFqxa8gbyBpem90b3BlY2ggcGxhdGlueSBuYSBwbGF0aW51LTE5NQ0Kbm9ybWFsaXplLnJhdGlvcyhwbGF0aW51bS5kYXRhLCAicGxhdGludW0iLCAiMTk1UHQiKQ0KDQojIyBLb25zZW56dcOhbG7DrSBwb23Em3J5IG1ub8W+c3R2w60gaXpvdG9wxa8gcGxhdGlueSANCmRmPW5vcm1hbGl6ZS5yYXRpb3MocGxhdGludW0uZGF0YSwgInBsYXRpbnVtIiwgIjE5NVB0IikgDQptbW0oZGYkUiwgZGYkdS5SKQ0KDQojIyBJem90b3BvdsOpIHBvbcSbcnkgemlua3UgeiBpem90b3BvdsO9Y2ggemFzdG91cGVuw60gDQp4ID0gYygwLjQ4NjMwLCAwLjI3OTAwLCAwLjA0MTAwLCAwLjE4NzUwLCAwLjAwNjIwKSANCnV4ID0gYygwLjAwMDkxLCAwLjAwMDc2LCAwLjAwMDMxLCAwLjAwMTM1LCAwLjAwMDEwKSANCnogPSBhYnVuZGFuY2VzMnJhdGlvcyh4LHV4LHJlZj0yKTsgeg0KYXQud2VpZ2h0KHokUix6JFIuY292LCJ6aW5jIiwiNjZabiIpDQoNCiMjIEF0b21vdsOhIGhtb3Rub3N0IGEgaXpvdG9wb3bDqSB6YXN0b3VwZW7DrSBpcmlkaWEsIGt0ZXLDqSBvZHBvdsOtZGFqw60gcG9txJtydSBpem90b3DFryAxOTFJci8xOTNJciA9IDAsNTk0NzEoMTMpIA0KYXQud2VpZ2h0KDAuNTk0NzEsIG1hdHJpeCgwLjAwMDEzXjIpLCAiaXJpZGl1bSIsICIxOTNJciIpDQoNCiMjIEF0b21vdsOhIGhtb3Rub3N0IGEgaXpvdG9wb3bDqSB6YXN0b3VwZW7DrSBrxZllbcOta3UsIGt0ZXLDqSBvZHBvdsOtZGFqw60gaXpvdG9wb3bDvW0gcG9txJtyxa9tIDI4U2kvMjlTaSA9IDEsMDc0KDY5KSBhIDMwU2kvMjlTaSA9IDI2MCgxMSkgcyBrb3JlbGFjw60gMCw4MCBtZXppIG9ixJttYSBpem90b3BvdsO9bWkgcG9txJtyeS4gDQpyYXRpb3MgPSBjKDEuMDc0LDI2MCkgDQpyLmNvdiA9IG1hdHJpeChjKDAuMDY5XjIsMC44MCowLjA2OSoxMSwwLjgwKjAuMDY5KjExLDExXjIpLG5jb2w9MixieXJvdz1UUlVFKSANCmF0LndlaWdodChyYXRpb3MsIHIuY292LCAic2lsaWNvbiIsICIyOVNpIikNCg0KYGBgDQoNCg0KVmxhc3Rub3N0aSB2emR1Y2h1IGEgdm9keQ0KDQpgYGB7cn0NCg0KIyBTbG96ZW5pIGF0bW9zZmVyeQ0KbGlicmFyeShtYXJlbGFjKQ0KYXRtQ29tcCgpIA0KDQojIyBIdXN0b3RhIHZ6ZHVjaHUgDQpsaWJyYXJ5KG1hcmVsYWMpDQphaXJfZGVuc2l0eSh0ID0gMjUsIFAgPSAxLjAxMzI1MykNCiMgdCAtIHRlbXBlcmF0dXJlIGluIMKwQywgUCAtIHByZXNzdXJlIGluIGJhcnMNCg0KIyMgSHVzdG90YSB2b2R5DQpsaWJyYXJ5KHJMYWtlQW5hbHl6ZXIpDQp3YXRlci5kZW5zaXR5KHd0ciA9IDI1LCBzYWwgPSAwKQ0KIyB3dHIgLSB0ZW1wZXJhdHVyZSBpbiDCsEMNCmxpYnJhcnkoQ0hOT1NaKQ0KcmhvLklBUFdTOTUoVCA9IDI5OC4xNSwgUCA9IDEsIHN0YXRlPSIiLCB0cmFjZT0wKQ0KIyBUIC0gdGVtcGVyYXR1cmUgaW4gSywgUCAtIHByZXNzdXJlIGluIGJhcnMNCg0KDQpsaWJyYXJ5KElBUFdTOTUpDQpsaWJyYXJ5KG1hcmVsYWMpDQpsaWJyYXJ5KENITk9TWikNCg0KbGlicmFyeShDSE5PU1opDQp0aGVybW8oKSRPQklHVA0KDQpgYGANCg0KDQoNCg0KRGlzb2NpYcSNbsOtIGtvbnN0YW50eQ0KDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KDQojaHR0cHM6Ly9jaGVtLmxpYnJldGV4dHMub3JnL0FuY2lsbGFyeV9NYXRlcmlhbHMvUmVmZXJlbmNlL1JlZmVyZW5jZV9UYWJsZXMvRXF1aWxpYnJpdW1fQ29uc3RhbnRzL0UxJTNBX0FjaWRfRGlzc29jaWF0aW9uX0NvbnN0YW50c19hdF8yNUMNCg0KDQpsaWJyYXJ5KHNlYWNhcmIpDQpLZDEgPSBLMXAoUz0wLCBUPTI1LCBQPTAsIHBIc2NhbGU9IlQiLCBrU1dTMnNjYWxlPSJ4Iiwgd2Fybj0ibiIpDQpwS2ExID0gLWxvZzEwKEtkMSk7IHBLYTENCktkMiA9IEsycChTPTAsIFQ9MjUsIFA9MCwgcEhzY2FsZT0iVCIsIGtTV1Myc2NhbGU9IngiLCB3YXJuPSJuIikNCnBLYTIgPSAtbG9nMTAoS2QyKTsgcEthMg0KS2QzID0gSzNwKFM9MCwgVD0yNSwgUD0wLCBwSHNjYWxlPSJUIiwga1NXUzJzY2FsZT0ieCIsIHdhcm49Im4iKQ0KcEthMyA9IC1sb2cxMChLZDMpOyBwS2EzDQoNCmxpYnJhcnkoc2VhY2FyYikNCmJqZXJydW0oSzE9S2QxWzFdLCBLMj1LZDJbMV0sIEszPUtkM1sxXSwgcGhtaW49MSwgcGhtYXg9MTMsIGJ5PTAuMSwgY29uYz0xLHR5cGU9ImwiLCBjb2w9YygyLDMsNCw2KSwgeWxhYj0iUmVsYXRpdmUgY29uY2VudHJhdGlvbiAoJSkiLCBhZGQ9RkFMU0UpDQoNCg0KbGlicmFyeShTb2x2ZVNBUEhFKQ0KQUtfUEhPU18xX01JTEw5NSh0X2s9Mjk4LHM9MCwgcF9iYXI9MCkNCkFLX1BIT1NfMl9NSUxMOTUodF9rPTI5OCxzPTM1LCBwX2Jhcj0wKQ0KQUtfUEhPU18zX01JTEw5NSh0X2s9Mjk4LHM9MCwgcF9iYXI9MCkNCg0KDQpsaWJyYXJ5KEFxdWFFbnYpDQpkYXRhKFBoeXNDaGVtQ29uc3QpDQpQaHlzQ2hlbUNvbnN0DQoNCmBgYA0KDQoNCmBgYHtyfQ0KDQpsaWJyYXJ5KHNlcWlucikNCmRhdGEoYWFpbmRleCkNCmFhaW5kZXgNCg0KYSgiR2x1IikNCmFhYSgiQSIpDQoNCg0KbGlicmFyeShDSE5PU1opDQp0aGVybW8gPSB0aGVybW8oKQ0KdGhlcm1vJHByb3RlaW4NCnBmIDwtIHByb3RlaW4uZm9ybXVsYSh0aGVybW8kcHJvdGVpbik7IHBmDQppQSA8LSBpbmZvKCJhbGFuaW5lIikNCmluZm8oaUEpJGZvcm11bGENCmFzLmNoZW1pY2FsLmZvcm11bGEobWFrZXVwKGlBKSkNCg0KYGBgDQoNCg0KDQpQxZlldm9keSBqZWRub3Rlaw0KDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KbGlicmFyeShtZWFzdXJlbWVudHMpDQpjb252X3VuaXRfb3B0aW9ucyAjIHBvdXppdmFuZSBqZWRub3RreQ0KDQojIGxlbmd0aA0KY29udl91bml0KDEsIGZyb209Im1tIiwgdG89Im0iKQ0KY29udl91bml0KDEsIGZyb209Im5tIiwgdG89ImFuZ3N0cm9tIikNCg0KIyBwcmVzc3VyZQ0KY29udl91bml0KDEwMSwgZnJvbT0iUGEiLCB0bz0ibW1IZyIpDQpjb252X3VuaXQoMSwgZnJvbT0iYXRtIiwgdG89IlBhIikNCg0KIyB0ZW1wZXJhdHVyZQ0KY29udl91bml0KDEwMCwgZnJvbT0iQyIsIHRvPSJLIikNCg0KIyBlbmVyZ3kNCmNvbnZfdW5pdCg1MDAsIGZyb209ImNhbCIsIHRvPSJKIikNCmNvbnZfdW5pdCgxLCBmcm9tPSJlcmciLCB0bz0iSiIpDQoNCiN2b2x1bWUNCmNvbnZfdW5pdCgxMDAsIGZyb209ImwiLCB0bz0ibTMiKQ0KDQojIG1hc3MNCmNvbnZfdW5pdCgxMDAsIGZyb209ImciLCB0bz0ibWciKQ0KY29udl91bml0KDEwMCwgZnJvbT0idWciLCB0bz0iZyIpDQoNCiMgc3BlZWQNCmNvbnZfdW5pdCgxLCBmcm9tPSJrbV9wZXJfaHIiLCB0bz0ibV9wZXJfc2VjIikNCmNvbnZfdW5pdCgxLCBmcm9tPSJsaWdodCIsIHRvPSJrbV9wZXJfaHIiKQ0KY29udl91bml0KDEsIGZyb209ImxpZ2h0IiwgdG89Im1fcGVyX3NlYyIpDQoNCg0KIyMjIG11bHRpdW5pdHMNCmNvbnZfbXVsdGl1bml0KHggPSAxLCBmcm9tPSJ1ZyAvIGwiLCB0bz0iZyAvIG0zIikNCmNvbnZfbXVsdGl1bml0KHggPSAxLCBmcm9tPSJtZyAvIGwiLCB0bz0ia2cgLyBtMyIpDQpjb252X211bHRpdW5pdCh4ID0gMSwgZnJvbT0iY2FsIC8ga2ciLCB0bz0iSiAvIGciKQ0KDQoNCiMjIFByZXZvZCB0ZXBsb3QNCmxpYnJhcnkod2VhdGhlcm1ldHJpY3MpDQpjb252ZXJ0X3RlbXBlcmF0dXJlKHRlbXBlcmF0dXJlPTAsIG9sZF9tZXRyaWM9ImMiLCBuZXdfbWV0cmljPSJrIiwgcm91bmQgPSAyKQ0KIyBtZXRyaWMgPSAiYyIsImYiLCJrIg0KY2Vsc2l1cy50by5mYWhyZW5oZWl0KFQuY2Vsc2l1cywgcm91bmQgPSAyKQ0KY2Vsc2l1cy50by5rZWx2aW4oVC5jZWxzaXVzLCByb3VuZCA9IDIpDQpmYWhyZW5oZWl0LnRvLmtlbHZpbihULmZhaHJlbmhlaXQsIHJvdW5kID0gMikNCmZhaHJlbmhlaXQudG8uY2Vsc2l1cyhULmZhaHJlbmhlaXQsIHJvdW5kID0gMikNCmtlbHZpbi50by5jZWxzaXVzKFQua2VsdmluLCByb3VuZCA9IDIpDQprZWx2aW4udG8uZmFocmVuaGVpdChULmtlbHZpbiwgcm91bmQgPSAyKQ0KDQoNCiMjIyMgbmFzb2JreSBqZWRub3RlayBTSQ0KbGlicmFyeShzaXRvb2xzKQ0KZjJzaSgxMDAwMCkNCmYyc2koMC4wMjMsIHVuaXQ9ImwiKQ0KZjJzaSgzLjVlLTUsIHVuaXQ9Im1vbCIpDQpudW1iZXJzIDwtIGMoMWU1LCAzLjVlLTEyLCAwLjAwNCkgDQpmMnNpKG51bWJlcnMsIHVuaXQ9ImciKQ0KDQpzYXBwbHkobnVtYmVycyxmdW5jdGlvbih4KXtmMnNpKHgsIHVuaXQ9ImciKX0pDQoNCg0KIyBQcmV2b2QgY2Fzb3Z5Y2ggamVkbm90ZWsNCg0KbGlicmFyeShkYXRldGltZSkNCg0KeHggPSBhcy5taW51dGUoNjApICMgNjAgbWluDQphcy5zZWNvbmQoeHgpDQphcy5ob3VyKHh4KQ0KYXMuZGF5KHh4KQ0KDQpsaWJyYXJ5KGx1YnJpZGF0ZSkNCmR1ciA9IGR1cmF0aW9uKHdlZWs9MCxkYXk9MC4wNDE2NjY2Nyxob3Vycz0xLG1pbnV0ZXM9MCxzZWNvbmRzPTM2MDApDQphcy5udW1lcmljKGR1ciwgIm1pbnV0ZXMiKQ0KDQoNCiMgT3B0aWNrZSBqZWRub3RreQ0KbGlicmFyeShwaG90b2Jpb2xvZ3kpDQpUMkEoMC45OSwgYWN0aW9uID0gTlVMTCwgYnlyZWYgPSBGQUxTRSwgY2xlYW4gPSBUUlVFKSAjIHRyYW5zbWl0YW5jZSBuYSBhYnNvcmJhbmNpDQpUMkFmcigwLjk5LCBSZnIgPSAxLzQsIGJ5cmVmID0gRkFMU0UsIGNsZWFuID0gVFJVRSkgIyB0cmFuc21pdGFuY2UgbmEgYWJzb3JwdGFuY2kgKHMgZGFub3UgbWlyb3UgcmVmbGVrdGFuY2Ugdnpvcmt1KQ0KQTJUKDAuMDEsIGFjdGlvbiA9IE5VTEwsIGJ5cmVmID0gRkFMU0UsIGNsZWFuID0gVFJVRSkgIyBhYnNvcmJhbmNlIG5hIHRyYW5zbWl0YW5jaQ0KDQoNCmBgYA0KDQoNClBseW5uw70gc3lzdMOpbSBtxJtuw60gc3bFr2ogb2JqZW0gbyAxMjAwIG1sIHphIGtvbnN0YW50bsOtaG8gdm7Em2rFocOtaG8gdGxha3UgMzAgYXRtLiBKYWtvdSBwcsOhY2kgdnlrb27DoSBwbHluIHDFmWkgZXhwYW56aT8gVnlqw6FkxZlldGUgdiByxa96bsO9Y2ggZW5lcmdldGlja8O9Y2ggamVkbm90a8OhY2guDQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQoNCmxpYnJhcnkobWVhc3VyZW1lbnRzKQ0KDQojIFcgPSBwIC4gZFYNCmRWID0gY29udl91bml0KDEyMDAsIGZyb209Im1sIiwgdG89Im0zIik7IGRWDQpwID0gY29udl91bml0KDMwLCBmcm9tPSJhdG0iLCB0bz0iUGEiKTsgcA0KVyA9IHAqZFY7IFcgIyBbSl0NClcxID0gY29udl91bml0KFcsIGZyb209IkoiLCB0bz0iY2FsIik7IFcxICMgW2NhbF0NClcyID0gY29udl91bml0KFcsIGZyb209IkoiLCB0bz0iV3NlYyIpOyBXMiAjIFtXLnNdDQpXMyA9IGNvbnZfdW5pdChXLCBmcm9tPSJKIiwgdG89ImVyZyIpOyBXMyAjIFtlcmddDQoNCmBgYA0KDQoNCk9jZWxvdsOhIGzDoWhldiBvIG9iamVtdSAyMC41IGwgamUgbmFwbG7Em25hIGt5c2zDrWtlbS4gUMWZaSAxNyDCsEMgamUgdGxhayB2IGzDoWh2aSA4NyBhdG0uIFZ5cG/EjcOtdGVqdGUgaG1vdG5vc3Qga3lzbMOta3UuDQoNCmBgYHtyfQ0KDQpsaWJyYXJ5KG1hcmVsYWMpDQpSID0gYXMubnVtZXJpYyhDb25zdGFudHMkZ2FzQ3QyWzFdKTsgUg0KQ29uc3RhbnRzJGdhc0N0MlsyXQ0KbGlicmFyeShtZWFzdXJlbWVudHMpDQpQID0gY29udl91bml0KDg3LCBmcm9tPSJhdG0iLCB0bz0iUGEiKTsgUA0KVGsgPSBjb252X3VuaXQoMTcsIGZyb209IkMiLCB0bz0iSyIpOyBUaw0KViA9IGNvbnZfdW5pdCgyMC41LCBmcm9tPSJsIiwgdG89Im0zIik7IFYNCmxpYnJhcnkoQ0hOT1NaKQ0KTSA9IG1hc3MoIk8yIik7IE0gIyBnL21vbA0KDQptID0gUCpWKk0vKFIqVGspDQptID0gY2VpbGluZyhtKTsgbSAjIGcNCm1rID0gY29udl91bml0KG0sIGZyb209ImciLCB0bz0ia2ciKQ0KbWsgPSByb3VuZChtaywyKTsgbWsgIyBrZw0KDQpwYXN0ZSgiSG1vdG5vc3Qga3lzbMOta3UgamUiLCBtLCAiZywgcmVzcC4iLCBtaywgImtnLiIpDQoNCmBgYA0KDQoNClZ5cG/EjcOtdGVqdGUgbW9sZWt1bG92b3UgaG1vdG5vc3QgYmVuemVudSwgdsOhxb7DrS1saSA2MDAgbWwgamVobyBwYXIgcMWZaSA4NyDCsEMgYSB0bGFrdSA2MjQgbW0gSGcgMS4zIGcuDQoNCmBgYHtyfQ0KDQptID0gMS4zICMgZw0KbGlicmFyeShtYXJlbGFjKQ0KUiA9IGFzLm51bWVyaWMoQ29uc3RhbnRzJGdhc0N0MlsxXSk7IFINCkNvbnN0YW50cyRnYXNDdDJbMl0NCmxpYnJhcnkobWVhc3VyZW1lbnRzKQ0KUCA9IGNvbnZfdW5pdCg2MjQsIGZyb209Im1tSGciLCB0bz0iUGEiKTsgUA0KVGsgPSBjb252X3VuaXQoODcsIGZyb209IkMiLCB0bz0iSyIpOyBUaw0KViA9IGNvbnZfdW5pdCg2MDAsIGZyb209Im1sIiwgdG89Im0zIik7IFYNCg0KTSA9IG0qUipUay8oUCpWKTsgTSAjIGcvbW9sDQoNCmxpYnJhcnkoQ0hOT1NaKQ0KTWIgPSBtYXNzKCJDNkg2Iik7IE1iICMgZy9tb2wNCg0KcGFzdGUoIlpqacWhdMSbbsOhIG1vbMOhcm7DrSBobW90bm9zdCBiZW56ZW51IGplIiwgcm91bmQoTSwwKSwgImcvbW9sLiIpDQoNCmBgYA0KDQoNClBva3VzIHRydmFsIGNlbGtlbSA3NjU4IG1pbnV0LiBLb2xpayBqZSB0byBkbsOtLCBob2RpbiBhIG1pbnV0Pw0KDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KDQp0dCA9IDc2NTggIyBbbWluXQ0KDQpsaWJyYXJ5KGx1YnJpZGF0ZSkNCnRpbSA9IHNlY29uZHNfdG9fcGVyaW9kKHR0KjYwKTsgdGltDQpsaWJyYXJ5KGRhdGV0aW1lKQ0KdGltID0gc2Vjb25kc190b19wZXJpb2QoYXMuc2Vjb25kKGFzLm1pbnV0ZSh0dCkpKTsgdGltDQoNCnRuID0gcmVnbWF0Y2hlcyh0aW0sIGdyZWdleHByKCJbWzpkaWdpdDpdXSsiLCB0aW0pKQ0KdG4gPSBhcy5udW1lcmljKHVubGlzdCh0bikpDQp0MSA9IHRuWzFdDQp0MiA9IHRuWzJdDQp0MyA9IHRuWzNdDQp0NCA9IHRuWzRdDQogIA0KcGFzdGUoIlBva3VzIHRydmFsIiwgdDEsICJkbsOtLCIsIHQyLCAiaG9kaW4sIiwgdDMsICJtaW51dCBhIiwgdDQsICJzZWt1bmQuIikNCg0KYGBgDQoNCg0KDQpaYW9rcm91aGxvdsOhbsOtIMSNw61zZWwgbmEgZGFuw70gcG9jZXQgZGVzZXRpbm7DvWNoIG3DrXN0DQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQoNCnJvdW5kKDEyMzQuNTY3LDIpDQpyb3VuZCgxMjMuNDU2LGRpZ2l0cz0yKQ0KY2VpbGluZygxMjM0LjU2NykNCmZsb29yKDEyMzQuNTY3KQ0KdHJ1bmMoMTIzNC41NjcpDQoNCmxpYnJhcnkoZ3VmKQ0Kcm91bmRfc29tZXRoaW5nKDEyMy40NTYsIGRlY2ltYWxzID0gMikNCnJvdW5kX3NvbWV0aGluZygiMTIzLjQ1NiIsIGRlY2ltYWxzID0gMikNCg0KbGlicmFyeShQS05DQSkNCnJvdW5kU3RyaW5nKDMxNDEuNTkyNjUsIGRpZ2l0cyA9IDMsIHNjaV9yYW5nZSA9IDAsIHNjaV9zZXAgPSAiZSIpDQpyb3VuZFN0cmluZygzMTQxLjU5MjY1LCBkaWdpdHMgPSAzLCBzY2lfcmFuZ2UgPSAwLCBzY2lfc2VwID0gIngxMF4iKQ0Kcm91bmRTdHJpbmcoMzE0MS41OTI2NSwgZGlnaXRzID0gMywgc2NpX3JhbmdlID0gSW5mLCBzY2lfc2VwID0gImUiKQ0KDQojIHZla3RvcnkNCnggPC0gYyhzb3J0KHNhbXBsZSgxLjc2NToyMCwgMTApKSkNCnJvdW5kKHgsZGlnaXRzPTIpDQpjZWlsaW5nKHgpDQpmbG9vcih4KQ0KdHJ1bmMoeCkNCg0KbGlicmFyeShjaCkNClJvdW5kKHgsIG49MikNClJvdW5kMih4LCBuPTIpDQoNCg0KIyBtYXRpY2UNCg0KWCA9IG1hdHJpeCh4LDUsMixieXJvdyA9IFRSVUUpDQpyb3VuZChYLGRpZ2l0cz0yKQ0KY2VpbGluZyhYKQ0KZmxvb3IoWCkNCnRydW5jKFgpDQoNClJvdW5kKFgsIG49MikNClJvdW5kMihYLCBuPTIpDQoNCmBgYA0KDQoNCk5lamlzdG90eSBhIGNoeWJ5IG3Em8WZZW7DrQ0KDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KDQpsaWJyYXJ5KGVycm9ycykNCnhlIDwtIHNldF9lcnJvcnMoMy42MDIsIDAuMDA4KQ0Kb3B0aW9ucyhlcnJvcnMubm90YXRpb24gPSAicGx1cy1taW51cyIpIA0KcHJpbnQoeGUsIGRpZ2l0cyA9IDIpDQpvcHRpb25zKGVycm9ycy5ub3RhdGlvbiA9ICJwYXJlbnRoZXNpcyIpDQpwcmludCh4ZSwgZGlnaXRzID0gMikNCg0KIyBlbGVtZW50YXJuaSBuYWJvag0KZSA8LSBzZXRfZXJyb3JzKDEuNjAyMTc2NjIwOGUtMTksIDAuMDAwMDAwMDA5OGUtMTkpIA0Kb3B0aW9ucyhlcnJvcnMubm90YXRpb24gPSAicGx1cy1taW51cyIpIA0KcHJpbnQoZSwgZGlnaXRzID0gMikNCm9wdGlvbnMoZXJyb3JzLm5vdGF0aW9uID0gInBhcmVudGhlc2lzIikNCnByaW50KGUsIGRpZ2l0cyA9IDMpDQoNCmBgYA0KDQoNClplIHrDoXNpbGt5IGthcHJvbGFrdGFtdSBieWxvIG9kZWJyw6FubyAxMCB2em9ya3UgYSBieWwgdSBuaWNoIHN0YW5vdmVuIGJvZCB0w6Fuw60uIFZ5cG/EjcOtdGVqdGUgcHLFr23Em3Jub3UgaG9kbm90dSBib2R1IHTDoW7DrSB2IHrDoXNpbGNlIGEgamVqw60gc23Em3JvZGF0bm91IG9kY2h5bGt1Lg0KDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KDQp4YyA9IGMoNjguNSwgNjguNywgNjguMywgNjguOCwgNjguNSwgNjguMiwgNjguNiwgNjguNCwgNjguMiwgNjguNykNCm1lYW4oeGMpDQpzZCh4YykgIyBzZA0Kc2QoeGMpL3NxcnQobGVuZ3RoKHhjKSkgIyBzdHIgY2h5YmEgcHJ1bWVydQ0KDQplIDwtIHNldF9lcnJvcnMobWVhbih4YyksIHNkKHhjKS9zcXJ0KGxlbmd0aCh4YykpKSANCm9wdGlvbnMoZXJyb3JzLm5vdGF0aW9uID0gInBsdXMtbWludXMiKTsgcHJpbnQoZSwgZGlnaXRzID0gMikNCg0KYGBgDQoNCg0KU2lyZW5pIGNoeWINCg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCg0KbGlicmFyeShwcm9wYWdhdGUpDQoNCiMgeiBwcnVtZXJ1IGEgbmVqaXN0b3R5LCBiZXogdXZlZGVuw60gcG9jdHUgc3R1cG51IHZvbG5vc3RpLCByZXNwLiBwb2N0dSBvcGFrb3ZhbmkNCg0KeCA8LSBjKDUsIDAuMDEpIA0KeSA8LSBjKDEsIDAuMDEpIA0KDQpFWFBSMSA8LSBleHByZXNzaW9uKHgveSkgDQpERjEgPC0gY2JpbmQoeCwgeSkNClJFUzEgPC0gcHJvcGFnYXRlKGV4cHIgPSBFWFBSMSwgZGF0YSA9IERGMSwgdHlwZSA9ICJzdGF0IiwgZG8uc2ltID0gVFJVRSwgdmVyYm9zZSA9IFRSVUUsIG5zaW0gPSAxMDAwMDApIA0KUkVTMQ0KUkVTMSRkYXRhDQpSRVMxJHByb3ANClJFUzEkc2ltDQpzdW1tYXJ5KFJFUzEpDQpwbG90KFJFUzEpDQoNCkVYUFIgPC0gZXhwcmVzc2lvbihhXmIqeCkNCmEgPSBjKDUsIDAuMSkNCmIgPSBjKDEwLCAwLjEpDQp4ID0gYygxLCAwLjEpDQpEQVQgPC0gY2JpbmQoYSwgYiwgeCkNCihyZXMgPC0gcHJvcGFnYXRlKEVYUFIsIERBVCkpDQpyZXMkZGF0YQ0KcmVzJHByb3ANCnJlcyRzaW0NCnN1bW1hcnkocmVzKQ0KcGxvdChyZXMpDQoNCg0KIyB6IHBydW1lcnUgYSBuZWppc3RvdHksIHMgdXZlZGVuw61tIHBvY3R1IHN0dXBudSB2b2xub3N0aQ0KRVhQUjIgPC0gZXhwcmVzc2lvbih4L3kpIA0KeCA8LSBjKDUsIDAuMDEsIDEyKSANCnkgPC0gYygxLCAwLjAxLCA1KSANCkRGMiA8LSBjYmluZCh4LCB5KSANClJFUzIgPC0gcHJvcGFnYXRlKGV4cHIgPSBFWFBSMiwgZGF0YSA9IERGMiwgdHlwZSA9ICJzdGF0IiwgZG8uc2ltID0gVFJVRSwgdmVyYm9zZSA9IFRSVUUsIG5zaW0gPSAxMDAwMDApDQpSRVMyDQpSRVMyJGRhdGENClJFUzIkcHJvcA0KUkVTMiRzaW0NCnN1bW1hcnkoUkVTMikNCnBsb3QoUkVTMikNCg0KDQojIFbDvXBvY2V0IHBvbW9jw60gaW50ZXJ2YWx1IA0KDQpFWFBSMyA8LSBleHByZXNzaW9uKEMgKiBzcXJ0KCg1MjAgKiBIICogUCkvKE0gKih0ICsgNDYwKSkpKQ0KSCA8LSBjKDY0LCA2NSkNCk0gPC0gYygxNiwgMTYuMikNClAgPC0gYygzNjEsIDM2NSkNCnQgPC0gYygxNjUsIDE3MCkNCkMgPC0gYygzOC40LCAzOC41KQ0KREFUMyA8LSBtYWtlRGF0KEVYUFIzKQ0KaW50ZXJ2YWwoREFUMywgRVhQUjMsIHNlcSA9IDIpDQoNCkVYUFI1IDwtIGV4cHJlc3Npb24oeF4yIC0geCArIDEpDQp4IDwtIGMoLTIsIDEpDQpjdXJ2ZSh4XjIgLSB4ICsgMSwgLTIsIDEpDQpEQVQ1IDwtIG1ha2VEYXQoRVhQUjUpDQppbnRlcnZhbChEQVQ1LCBFWFBSNSwgc2VxID0gMikNCg0KDQpsaWJyYXJ5KG1ldFJvbG9neSkNCg0KZGF0YShHVU0uSC4xKQ0KR1VNLkguMQ0KDQojIyBhIHNpbXBsZSB1bmNlcnRhaW50eSBhbmFseXNpcyBmb3IgdGhlIHByb2R1Y3Qgb2YgdHdvIHF1YW50aXRpZXMNCkdVTShjKCJ4MSIsIngyIiksYygyLjMsMS4xKSxjKDAuMDMwLDAuMDE1KSxjKDUsOTk5OSksIngxKngyIikNCg0KIyMgYSBzaW1wbGUgdW5jZXJ0YWludHkgYW5hbHlzaXMgZm9yIHRoZSBwcm9kdWN0IG9mIHR3byBxdWFudGl0aWVzDQpHVU0udmFsaWRhdGUoYygieDEiLCJ4MiIpLCBjKDIuMywxLjEpLCBjKDAuMDMwLDAuMDE1KSwgYyg1LDk5OTkpLCBjKCJBIiwiQiIpLGMoIk5vcm1hbCIsIlJlY3Rhbmd1bGFyIiksIngxKngyIikNCg0KDQpleHByIDwtIGV4cHJlc3Npb24oYStiKjIrYyozK2QvMikNCnggPC0gbGlzdChhPTEsIGI9MywgYz0yLCBkPTExKQ0KdSA8LSBsYXBwbHkoeCwgZnVuY3Rpb24oeCkgeC8xMCkgIyBuZWppc3RvdGEgMTAgJQ0KdS5leHByPC11bmNlcnQoZXhwciwgeCwgdSwgbWV0aG9kPSJOVU0iKQ0KdS5leHByDQojIGZ1bmN0aW9uIG1ldGhvZA0KZiA8LSBmdW5jdGlvbihhLGIsYyxkKSBhK2IqMitjKjMrZC8yDQp1LmZ1bjwtdW5jZXJ0KGYsIHgsIHUsIG1ldGhvZD0iTlVNIikNCnUuZnVuDQojIGZvcm11bGEgbWV0aG9kDQp1LmZvcm08LXVuY2VydCh+YStiKjIrYyozK2QvMiwgeCwgdSwgbWV0aG9kPSJOVU0iKQ0KdS5mb3JtDQoNCg0KIyBzIGtvcmVsYWNpDQp1LmNvcjwtZGlhZygxLDQpDQp1LmNvclszLDRdPC11LmNvcls0LDNdPC0wLjUNCnUuY29yDQojIG51bQ0KdS5mb3JtYzwtdW5jZXJ0KH5hK2IqMitjKjMrZC8yLCB4LCB1LCBtZXRob2Q9Ik5VTSIsIGNvcj11LmNvcikNCnUuZm9ybWMNCiMgTW9udGUgQ2FybG8NCnUuZm9ybWMuTUM8LXVuY2VydCh+YStiKjIrYyozK2QvMiwgeCwgdSwgbWV0aG9kPSJNQyIsIGNvcj11LmNvciwgQj0yMDApDQp1LmZvcm1jLk1DDQoNCg0KZXhwciA8LSBleHByZXNzaW9uKGEvKGItYykpDQp4IDwtIGxpc3QoYT0xLCBiPTMsIGM9MikNCnUgPC0gbGFwcGx5KHgsIGZ1bmN0aW9uKHgpIHgvMjApDQpzZXQuc2VlZCg0MDMpDQp1LmludmV4cHI8LXVuY2VydE1DKGV4cHIsIHgsIHUsIGRpc3RyaWI9cmVwKCJub3JtIiwgMyksIEI9OTk5LCBrZWVwLng9VFJVRSApDQp1LmludmV4cHINCg0KYGBgDQoNCg0KVnlwb8SNw610ZWp0ZSBodXN0b3R1IGEgamVqw60gY2h5YnUgcHJvIGzDoXRrdSwgdSBuw63FviBieWxhIG9wYWtvdmFuw71tIG3Em8WZZW7DrW0gc3Rhbm92ZW5hIGhtb3Rub3N0IDYuODI0ICgwLjAwOCkgZyBhIG9iamVtIDMuMDMgKDAuMDEpIG1sLg0KDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KDQpsaWJyYXJ5KHByb3BhZ2F0ZSkNCg0KRVhQUjIgPC0gZXhwcmVzc2lvbihtL1YpIA0KbSA9IGMoNi44MjQsIDAuMDA4KSAjW2ddIA0KViA9IGMoMy4wMywgMC4wMSkgI1ttbF0NCkRGMiA8LSBjYmluZChtLCBWKSANClJFUzIgPC0gcHJvcGFnYXRlKGV4cHIgPSBFWFBSMiwgZGF0YSA9IERGMiwgdHlwZSA9ICJzdGF0IiwgZG8uc2ltID0gVFJVRSwgdmVyYm9zZSA9IFRSVUUsIG5zaW0gPSAxMDAwMDApDQpSRVMyDQpSRVMyJGRhdGENClJFUzIkcHJvcA0KUkVTMiRzaW0NCmxpYnJhcnkoZXJyb3JzKQ0KZSA8LSBzZXRfZXJyb3JzKFJFUzIkc2ltWzFdLCBSRVMyJHNpbVsyXSkgDQpvcHRpb25zKGVycm9ycy5ub3RhdGlvbiA9ICJwbHVzLW1pbnVzIik7IHByaW50KGUsIGRpZ2l0cyA9IDEpDQpvcHRpb25zKGVycm9ycy5ub3RhdGlvbiA9ICJwYXJlbnRoZXNpcyIpOyBwcmludChlLCBkaWdpdHMgPSAxKQ0KDQpgYGANCg0KDQpOYSBww61zdCBvIHByxa9txJtydSAyMDAgKDAuMDUpIG1tIHDFr3NvYsOtIHDDoXJhIHRsYWtlbSA4LjIgKDAuMSkgYXRtLiBKYWtvdSBzaWxvdSBwxa9zb2LDrSBww6FyYSBuYSBww61zdD8NCg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCg0KbGlicmFyeShwcm9wYWdhdGUpDQpsaWJyYXJ5KG1lYXN1cmVtZW50cykNCg0KZCA9IGMoMjAwLCAwLjA1KSAjIFttbV0gbmEgW21dDQpkID0gYXMudmVjdG9yKGNvbnZfdW5pdChjKDIwMCwgMC4wNSksIGZyb209Im1tIiwgdG89Im0iKSkNCnAgPSBjKDguMiwgMC4xKSAgIyBbYXRtXSBuYSBbUGFdDQpwID0gYXMudmVjdG9yKGNvbnZfdW5pdChjKDguMiwgMC4xKSwgZnJvbT0iYXRtIiwgdG89IlBhIikpDQpwaQ0KRVhQUjcgPC0gZXhwcmVzc2lvbihwKjMuMTQxNTkzKihkLzIpXjIpDQpERjcgPC0gY2JpbmQoZCwgcCkgDQpSRVM3IDwtIHByb3BhZ2F0ZShleHByID0gRVhQUjcsIGRhdGEgPSBERjcsIHR5cGUgPSAic3RhdCIsIGRvLnNpbSA9IFRSVUUsIHZlcmJvc2UgPSBUUlVFLCBuc2ltID0gMTAwMDAwKQ0KUkVTNw0KUkVTNyRkYXRhDQpSRVM3JHByb3ANClJFUzckc2ltDQpsaWJyYXJ5KGVycm9ycykNCmUgPC0gc2V0X2Vycm9ycyhSRVM3JHNpbVsxXSwgUkVTNyRzaW1bMl0pIA0Kb3B0aW9ucyhlcnJvcnMubm90YXRpb24gPSAicGx1cy1taW51cyIpOyBwcmludChlLCBkaWdpdHMgPSAxKQ0Kb3B0aW9ucyhlcnJvcnMubm90YXRpb24gPSAicGFyZW50aGVzaXMiKTsgcHJpbnQoZSwgZGlnaXRzID0gMSkNCg0KYGBgDQoNCg0KVnlwb8SNw610ZWp0ZSBrb2VmaWNpZW50IHZpc2tveml0eSByb3p0b2t1IGdseWNlcmludSBTdG9rZXNvdm91IG1ldG9kb3UNCg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCg0KbGlicmFyeShwcm9wYWdhdGUpDQoNCnIgPSBjKDAuMDExMiwgMC4wMDAxKSAjIHBvbG9tZXIga3VsaWNreSBbY21dDQpsID0gYygzMS4yMywgMC4wNSkgIyBkcmFoYSBrdWxpY2t5IHphIGNhcyB0IFtjbV0NCnQgPSBjKDYyLjEsIDAuMikgIyBjYXMgW3NdDQpnID0gYyg5ODAuMSwwKSAjIHRpaG92ZSB6cnljaGxlbmkgW2NtL3MyXSB6IHRhYnVsZWsNCmQwID0gYygxMy41NSwwKSAjIGh1c3RvdGEga3VsaWNreSBbZy9jbTNdIHogdGFidWxlaw0KZCA9IGMoMS4yOCwwKSAjIGh1c3RvdGEgcm96dG9rdSBbZy9jbTNdIHogdGFidWxlaw0KRVhQUjMgPC0gZXhwcmVzc2lvbigoMi85KSpnKigoKGQwLWQpKnJeMikvbCkqdCkNCkRGMyA8LSBjYmluZChyLCBsLCB0LCBnLCBkMCwgZCkgDQpSRVMzIDwtIHByb3BhZ2F0ZShleHByID0gRVhQUjMsIGRhdGEgPSBERjMsIHR5cGUgPSAic3RhdCIsIGRvLnNpbSA9IFRSVUUsIHZlcmJvc2UgPSBUUlVFLCBuc2ltID0gMTAwMDAwKQ0KUkVTMw0KUkVTMyRkYXRhDQpSRVMzJHByb3ANClJFUzMkc2ltDQpFWFBSNCA8LSBleHByZXNzaW9uKCgyLzkpKjk4MC4xKigoKDEzLjU1LTEuMjgpKnJeMikvbCkqdCkNCkRGNCA8LSBjYmluZChyLCBsLCB0KSANClJFUzQgPC0gcHJvcGFnYXRlKGV4cHIgPSBFWFBSNCwgZGF0YSA9IERGNCwgdHlwZSA9ICJzdGF0IiwgZG8uc2ltID0gVFJVRSwgdmVyYm9zZSA9IFRSVUUsIG5zaW0gPSAxMDAwMDApDQpSRVM0JGRhdGENClJFUzQkcHJvcA0KUkVTNCRzaW0NCmxpYnJhcnkoZXJyb3JzKQ0KZSA8LSBzZXRfZXJyb3JzKFJFUzQkc2ltWzFdLCBSRVM0JHNpbVsyXSkgDQpvcHRpb25zKGVycm9ycy5ub3RhdGlvbiA9ICJwbHVzLW1pbnVzIik7IHByaW50KGUsIGRpZ2l0cyA9IDEpDQpvcHRpb25zKGVycm9ycy5ub3RhdGlvbiA9ICJwYXJlbnRoZXNpcyIpOyBwcmludChlLCBkaWdpdHMgPSAxKQ0KDQpgYGANCg0KDQpWeXBvxI3DrXRlanRlIGtvZWZpY2llbnQgdmlza296aXR5IHJvenRva3UgZ2x5Y2VyaW51IHBvbW9jw60ga2FwaWzDoXJuw61obyB2aXNrb3ppbWV0cnUuDQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQoNCmxpYnJhcnkocHJvcGFnYXRlKQ0KbGlicmFyeShtZWFzdXJlbWVudHMpDQoNCnAgPSBjKDIwLjEyLCAwLjAxKSAjIHRsYWsgbmEgdnl0b2t1IHoga2FwaWxhcnkgW21tIEhnXSB0byBbUGFdDQpwID0gYXMudmVjdG9yKGNvbnZfdW5pdChjKDIwLjEyLCAwLjAxKSwgZnJvbT0ibW1IZyIsIHRvPSJQYSIpKQ0KciA9IGMoMC41NzAsIDAuMDAzKSAjIHBvbG9tZXIga2FwaWxhcnkgW21tXSB0byBbbV0NCnIgPSBjb252X3VuaXQoYygwLjU3MCwgMC4wMDMpLCBmcm9tPSJtbSIsIHRvPSJtIikNCmwgPSBjKDEwLjUyNiwgMC4wMDUpICMgZGVsa2Ega2FwaWxhcnkgW21tXSB0byBbbV0NCmwgPSBjb252X3VuaXQoYygxMC41MjYsIDAuMDA1KSwgZnJvbT0ibW0iLCB0bz0ibSIpDQpWID0gYyg1LjAyNSwgMC4wMDEpIyBvYmplbSBrYXBhbGlueSB2eXRla2xlIHphIGNhcyB0IFtjbTNdIHRvIFttM10NClYgPSBjb252X3VuaXQoYyg1LjAyNSwgMC4wMDEpLCBmcm9tPSJjbTMiLCB0bz0ibTMiKQ0KdCA9IGMoMjcuMzQsIDAuMDIpICMgY2FzIFtzXQ0KcGkNCkVYUFI1IDwtIGV4cHJlc3Npb24oKDMuMTQxNTkzKnAqKHJeNCkqdCkvKDgqVipsKSkNCkRGNSA8LSBjYmluZChwLCByLCBsLCBWLCB0KSANClJFUzUgPC0gcHJvcGFnYXRlKGV4cHIgPSBFWFBSNSwgZGF0YSA9IERGNSwgdHlwZSA9ICJzdGF0IiwgZG8uc2ltID0gVFJVRSwgdmVyYm9zZSA9IFRSVUUsIG5zaW0gPSAxMDAwMDApDQpSRVM1ICMgW2tnIC8gbS5zXQ0KUkVTNSRkYXRhDQpSRVM1JHByb3ANClJFUzUkc2ltDQojIGNvbnZfbXVsdGl1bml0KHggPSBSRVM1JHNpbVsxOjJdLCBmcm9tPSJrZyAvIG0iLCB0bz0iZyAvIGNtIikNCmxpYnJhcnkoZXJyb3JzKQ0KZSA8LSBzZXRfZXJyb3JzKFJFUzUkc2ltWzFdLCBSRVM1JHNpbVsyXSkgDQpvcHRpb25zKGVycm9ycy5ub3RhdGlvbiA9ICJwbHVzLW1pbnVzIik7IHByaW50KGUsIGRpZ2l0cyA9IDEpDQpvcHRpb25zKGVycm9ycy5ub3RhdGlvbiA9ICJwYXJlbnRoZXNpcyIpOyBwcmludChlLCBkaWdpdHMgPSAxKQ0KDQpgYGANCg0KDQpTb3XEjWluIHJvenB1c3Rub3N0aSBzdMWZw61icm7DqSBzb2xpIEFnWCBtw6EgaG9kbm90dSBLcyA9IDQuMCAoMC40KSB4IDEwXi04LiBKYWvDoSBqZSBjaHliYSB2eXBvxI10ZW7DqSByb3Zub3bDocW+bsOpIGtvbmNlbnRyYWNlIHN0xZnDrWJybsO9Y2ggaW9udMWvIHZlIHZvZGU/DQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQoNCmxpYnJhcnkocHJvcGFnYXRlKQ0KRVhQUiA8LSBleHByZXNzaW9uKHheMC41KQ0KeCA9IGMoNC4wLCAwLjQpDQpEQVQgPC0gZGF0YS5mcmFtZSh4KQ0KcmVzIDwtIHByb3BhZ2F0ZShFWFBSLERBVCkNCiMgTkVGVU5HVUpFIHBybyBqZWRudSBwcm9tZW5ub3UuDQoNCg0KbGlicmFyeShtZXRSb2xvZ3kpDQoNCkdVTSgiS3MiLDQuMGUtOCwwLjRlLTgsMSwic3FydChLcykiLHNpZy5kaWdpdHMuVSA9IDIpIA0KDQpleHByIDwtIGV4cHJlc3Npb24oYV4wLjUpDQp4IDwtIGxpc3QoYT00LjBlLTgpDQp1IDwtIGxhcHBseSh4LCBmdW5jdGlvbih4KSB4LzEwKSAjIG5lamlzdG90YSAxMCAlDQp1LmV4cHI8LXVuY2VydChleHByLCB4LCB1LCBtZXRob2Q9Ik5VTSIpDQp1LmV4cHINCiMgZnVuY3Rpb24gbWV0aG9kDQpmIDwtIGZ1bmN0aW9uKGEpIGFeMC41DQp1LmZ1bjwtdW5jZXJ0KGYsIHgsIHUsIG1ldGhvZD0iTlVNIikNCnUuZnVuDQojIGZvcm11bGEgbWV0aG9kDQp1LmZvcm08LXVuY2VydCh+YV4wLjUsIHgsIHUsIG1ldGhvZD0iTlVNIikNCnUuZm9ybQ0KDQpgYGANCg0KDQpOZWppc3RvdHkgYSBrb3JlbGFjZQ0KDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KDQpsaWJyYXJ5KGVycm9ycykNCg0KeCA9IGMoMC45NzE5Mzc4LCAxLjk4NDAwMDYsIDIuOTk2MTgzMCwgNC4wMTIzMzQ2LCA1LjAwMTI3OTkpDQplcnJvcnMoeCkgPSBjKDAuMDEsIDAuMDEsIDAuMDEsIDAuMDEsIDAuMDEpDQp5ID0gYygwLjk3NDg5OTIsIDEuOTYyNzgwNSwgMi45OTM1ODMxLCAzLjk5MjEyMzcsIDQuOTYxMjU1NSkNCmVycm9ycyh5KSA9IGMoMC4wMiwgMC4wMiwgMC4wMiwgMC4wMiwgMC4wMikNCg0KIyBiZXoga29yZWxhY2UNCmNvcnJlbCh4LCB5KSA9ICBjKDAsIDAsIDAsIDAsIDApIA0KeiA8LSB4IC8geTsgeg0KDQojIHMga29yZWxhY8OtDQpjb3JyZWwoeCwgeSkgPSAgYygwLjg4NjQyODIsIDAuOTc2MTg0MSwgMC45MTQwMjA5LCAwLjk0OTYyNjYsIDAuOTkxMTgzNykNCnpfY29ycmVscCA8LSB4IC8geTsgel9jb3JyZWxwDQoNCmNvcnJlbCh4LCB5KSA9ICBjKC0wLjg4NjQyODIsIC0wLjk3NjE4NDEsIC0wLjkxNDAyMDksIC0wLjk0OTYyNjYsIC0wLjk5MTE4MzcpDQp6X2NvcnJlbG4gPC0geCAvIHk7IHpfY29ycmVsbg0KDQpgYGANCg0K