Reading Data
BLOC 2022-2024
Elo First 2022
-Competitors = 34-
######Elo History check code Chunk if running Sub16
alone
Elo Accumulated First_2022
Manuel PASTOR SÁNCHEZ |
FEMECV |
1031.24 |
51.8 % |
50.7 % |
Andrés VILA ANDRÉS |
FEMECV |
1029.68 |
51.6 % |
50.4 % |
Roc VERGÉS SOLÉ |
FEEC |
1028.12 |
51.3 % |
50.2 % |
Cisneros González AARÓN |
FEXME |
1026.56 |
51.1 % |
50 % |
Martí FARRÚS SORIANO |
FEEC |
1024.99 |
50.9 % |
49.8 % |
Elias GARCIA FERNANDEZ-OJANGUREN |
FEMPA |
1023.43 |
50.7 % |
49.6 % |
Martí MULET COLL |
FBME |
1021.87 |
50.4 % |
49.3 % |
Asier ANTUNEZ HERREROS |
EMF-FVM |
1020.31 |
50.2 % |
49.1 % |
Chabier VELILLA SANCHEZ |
FAM |
1018.75 |
50 % |
48.9 % |
Eric GONZALEZ INGLÉS |
FEEC |
1017.19 |
49.8 % |
48.7 % |
Lucas PÉREZ NIETO |
FEXME |
1017.19 |
49.8 % |
48.7 % |
Lizer AZNAREZ BESCOS |
FAM |
1014.07 |
49.3 % |
48.2 % |
Hugo VELILLA SANCHEZ |
FAM |
1012.51 |
49.1 % |
48 % |
Mario LÓPEZ LÓPEZ |
FDMESCyL |
1010.95 |
48.9 % |
47.8 % |
Santiago ORONICH GREGORIO |
FAM |
1010.95 |
48.9 % |
47.8 % |
Gari MARKUERKIAGA SARRIA |
EMF-FVM |
1007.82 |
48.4 % |
47.3 % |
Juan INFANTE MIRANDA |
FADMES |
1006.26 |
48.2 % |
47.1 % |
Santiago LOPEZ GARCÍA |
FMM |
1004.70 |
48 % |
46.9 % |
Iván GONZÁLEZ PICÓN |
FEXME |
1003.14 |
47.8 % |
46.6 % |
Yago REAL WHITE |
FEXME |
1001.58 |
47.5 % |
46.4 % |
Hugo AMAT GARCIA |
FADMES |
1000.02 |
47.3 % |
46.2 % |
Juan HERNÁNDEZ GÓMEZ |
FDMCM |
998.46 |
47.1 % |
46 % |
Mario LUDEÑA BROTONS |
FEMECV |
996.90 |
46.9 % |
45.7 % |
Fernando PRIETO PRIETO |
FADMES |
995.34 |
46.6 % |
45.5 % |
Juan CORREA LÓPEZ |
FEGAMON |
993.77 |
46.4 % |
45.3 % |
Daniel HERNÁNDEZ GÓMEZ |
FDMCM |
992.21 |
46.2 % |
45.1 % |
Ernest WOJDEL ZGIERSKI |
FEEC |
992.21 |
46.2 % |
45.1 % |
Ignacio PÉREZ GALÁN |
FDMCM |
989.09 |
45.7 % |
44.6 % |
Fernando OLIVERA MARTINEZ |
FMM |
987.53 |
45.5 % |
44.4 % |
Manex IÑURRATEGI LASAGABASTER |
EMF-FVM |
985.97 |
45.3 % |
44.2 % |
Eric SEGURA JORDÁN |
FEMECV |
984.41 |
45.1 % |
44 % |
Nicolás AMADOR DEL CASTILLO |
FMM |
982.85 |
44.9 % |
43.7 % |
Tom FELDENKRIZ |
FEEC |
982.85 |
44.9 % |
43.7 % |
Luis GAVIRO SORIANO |
FEXME |
979.73 |
44.4 % |
43.3 % |
Lucas CAMACHO TORRES |
FEEC |
978.16 |
44.2 % |
43.1 % |
Hugo GLORIES ROIG |
FEMECV |
976.60 |
44 % |
42.9 % |
Rodrigo RAMIRO-IBÁÑEZ CRAIG |
FDMCM |
975.04 |
43.7 % |
42.6 % |
Roque LARA RIVERO |
FDMESCyL |
973.48 |
43.5 % |
42.4 % |
Mateo MARCOS BASQUERO |
FMM |
971.92 |
43.3 % |
42.2 % |
Bel TORRENTS PALOMARES |
FEEC |
970.36 |
43.1 % |
42 % |
Daniel FERNANDEZ ALVES |
FMM |
968.80 |
42.9 % |
41.8 % |
Gael RODRIGUEZ MENDEZ |
FEGAMON |
967.24 |
42.6 % |
41.5 % |
Elo Second 2022
-Competitors = 24-
#####_ Elo History _
Elo Accumulated Second_2023
Manuel PASTOR SÁNCHEZ |
FEMECV |
1062.04 |
55.6 % |
53.4 % |
Roc VERGÉS SOLÉ |
FEEC |
1053.11 |
54.3 % |
52.1 % |
Martí MULET COLL |
FBME |
1050.76 |
54 % |
51.8 % |
Lucas PÉREZ NIETO |
FEXME |
1038.34 |
52.2 % |
50 % |
Asier ANTUNEZ HERREROS |
EMF-FVM |
1037.57 |
52.1 % |
49.9 % |
Lizer AZNAREZ BESCOS |
FAM |
1037.16 |
52 % |
49.8 % |
Eric GONZALEZ INGLÉS |
FEEC |
1030.58 |
51.1 % |
48.9 % |
Mario LÓPEZ LÓPEZ |
FDMESCyL |
1030.18 |
51 % |
48.8 % |
Andrés VILA ANDRÉS |
FEMECV |
1029.68 |
51.6 % |
50.4 % |
Aarón CISNEROS GONZÁLEZ |
FEXME |
1027.18 |
50.6 % |
48.4 % |
Cisneros González AARÓN |
FEXME |
1026.56 |
51.1 % |
50 % |
Elias GARCIA FERNANDEZ-OJANGUREN |
FEMPA |
1023.22 |
50 % |
47.8 % |
Martí FARRÚS SORIANO |
FEEC |
1018.96 |
49.4 % |
47.2 % |
Chabier VELILLA SANCHEZ |
FAM |
1018.75 |
50 % |
48.9 % |
Juan INFANTE MIRANDA |
FADMES |
1017.74 |
49.2 % |
47 % |
Gari MARKUERKIAGA SARRIA |
EMF-FVM |
1017.36 |
49.2 % |
47 % |
Yago REAL WHITE |
FEXME |
1016.96 |
49.1 % |
46.9 % |
Hugo VELILLA SANCHEZ |
FAM |
1012.51 |
49.1 % |
48 % |
Santiago ORONICH GREGORIO |
FAM |
1010.95 |
48.9 % |
47.8 % |
Santiago LOPEZ GARCÍA |
FMM |
1008.43 |
47.9 % |
45.7 % |
Iván GONZÁLEZ PICÓN |
FEXME |
1004.94 |
47.4 % |
45.2 % |
Hugo AMAT GARCIA |
FADMES |
1000.02 |
47.3 % |
46.2 % |
Fernando OLIVERA MARTINEZ |
FMM |
995.19 |
46 % |
43.8 % |
Manex IÑURRATEGI LASAGABASTER |
EMF-FVM |
993.64 |
45.8 % |
43.6 % |
Juan CORREA LÓPEZ |
FEGAMON |
991.72 |
45.5 % |
43.3 % |
Fernando PRIETO PRIETO |
FADMES |
991.34 |
45.4 % |
43.3 % |
Mario LUDEÑA BROTONS |
FEMECV |
989.02 |
45.1 % |
43 % |
Eric SEGURA JORDÁN |
FEMECV |
984.41 |
45.1 % |
44 % |
Tom FELDENKRIZ |
FEEC |
982.85 |
44.9 % |
43.7 % |
Juan HERNÁNDEZ GÓMEZ |
FDMCM |
982.82 |
44.2 % |
42.1 % |
Hadrián PÉREZ GÓMEZ |
FEGAMON |
980.63 |
43.9 % |
41.8 % |
Ernest WOJDEL ZGIERSKI |
FEEC |
980.46 |
43.9 % |
41.7 % |
Adahy PEREZ MENDEZ |
FEMPA |
976.76 |
43.4 % |
41.2 % |
Rodrigo RAMIRO-IBÁÑEZ CRAIG |
FDMCM |
975.04 |
43.7 % |
42.6 % |
Roque LARA RIVERO |
FDMESCyL |
973.48 |
43.5 % |
42.4 % |
Sergio LOPEZ MURCIA |
FEMPA |
972.88 |
42.8 % |
40.7 % |
Mateo MARCOS BASQUERO |
FMM |
971.92 |
43.3 % |
42.2 % |
Ignacio PÉREZ GALÁN |
FDMCM |
971.54 |
42.6 % |
40.5 % |
Bel TORRENTS PALOMARES |
FEEC |
970.36 |
43.1 % |
42 % |
Luis GAVIRO SORIANO |
FEXME |
969.96 |
42.4 % |
40.3 % |
Nicolás AMADOR DEL CASTILLO |
FMM |
969.19 |
42.3 % |
40.2 % |
Adrian LUCIO PANIAGUA |
FDMESCyL |
969.00 |
42.3 % |
40.2 % |
Daniel FERNANDEZ ALVES |
FMM |
968.80 |
42.9 % |
41.8 % |
Daniel HERNÁNDEZ GÓMEZ |
FDMCM |
959.13 |
40.9 % |
38.8 % |
Hugo GLORIES ROIG |
FEMECV |
955.21 |
40.3 % |
38.3 % |
Lucas CAMACHO TORRES |
FEEC |
949.00 |
39.5 % |
37.4 % |
Gael RODRIGUEZ MENDEZ |
FEGAMON |
942.00 |
38.5 % |
36.5 % |
Elo Third 2022
-Competitors = 36-
#####_ Elo History _
Elo Accumulated Third_2023
Manuel PASTOR SÁNCHEZ |
FEMECV |
1092.82 |
56.9 % |
54.9 % |
Roc VERGÉS SOLÉ |
FEEC |
1080.15 |
55.1 % |
53.1 % |
Martí MULET COLL |
FBME |
1066.51 |
53.1 % |
51.1 % |
Andrés VILA ANDRÉS |
FEMECV |
1058.67 |
52 % |
50 % |
Mario LÓPEZ LÓPEZ |
FDMESCyL |
1049.76 |
50.7 % |
48.7 % |
Lizer AZNAREZ BESCOS |
FAM |
1049.19 |
50.6 % |
48.6 % |
Lucas PÉREZ NIETO |
FEXME |
1048.48 |
50.5 % |
48.5 % |
Asier ANTUNEZ HERREROS |
EMF-FVM |
1045.83 |
50.1 % |
48.2 % |
Aarón CISNEROS GONZÁLEZ |
FEXME |
1044.89 |
50 % |
48 % |
Martí FARRÚS SORIANO |
FEEC |
1042.34 |
49.6 % |
47.7 % |
Elias GARCIA FERNANDEZ-OJANGUREN |
FEMPA |
1027.76 |
47.5 % |
45.6 % |
Eric GONZALEZ INGLÉS |
FEEC |
1027.57 |
47.5 % |
45.5 % |
Cisneros González AARÓN |
FEXME |
1026.56 |
51.1 % |
50 % |
Santiago ORONICH GREGORIO |
FAM |
1024.94 |
47.1 % |
45.2 % |
Fernando OLIVERA MARTINEZ |
FMM |
1020.52 |
46.5 % |
44.5 % |
Juan INFANTE MIRANDA |
FADMES |
1020.42 |
46.5 % |
44.5 % |
Yago REAL WHITE |
FEXME |
1015.87 |
45.8 % |
43.9 % |
Fernando PRIETO PRIETO |
FADMES |
1012.92 |
45.4 % |
43.5 % |
Gari MARKUERKIAGA SARRIA |
EMF-FVM |
1012.51 |
45.4 % |
43.4 % |
Santiago LOPEZ GARCÍA |
FMM |
1008.43 |
47.9 % |
45.7 % |
Sergio MIRANDA CID |
FEEC |
1006.64 |
44.5 % |
42.6 % |
Chabier VELILLA SANCHEZ |
FAM |
1004.48 |
44.2 % |
42.3 % |
Álvaro MORALES NAVARRO |
FADMES |
1001.00 |
43.7 % |
41.8 % |
Hugo AMAT GARCIA |
FADMES |
1000.02 |
47.3 % |
46.2 % |
Hugo VELILLA SANCHEZ |
FAM |
996.38 |
43.1 % |
41.1 % |
Manex IÑURRATEGI LASAGABASTER |
EMF-FVM |
993.64 |
45.8 % |
43.6 % |
Mario LUDEÑA BROTONS |
FEMECV |
989.02 |
45.1 % |
43 % |
Alexander PALAN OÑA |
FMM |
987.82 |
41.9 % |
39.9 % |
Iván GONZÁLEZ PICÓN |
FEXME |
985.07 |
41.5 % |
39.6 % |
Eric SEGURA JORDÁN |
FEMECV |
984.41 |
45.1 % |
44 % |
Hadrián PÉREZ GÓMEZ |
FEGAMON |
980.63 |
43.9 % |
41.8 % |
Ernest WOJDEL ZGIERSKI |
FEEC |
980.46 |
43.9 % |
41.7 % |
Adahy PEREZ MENDEZ |
FEMPA |
976.76 |
43.4 % |
41.2 % |
Nadyan LEÓN VILCHES |
FEXME |
976.53 |
40.3 % |
38.4 % |
Roque LARA RIVERO |
FDMESCyL |
973.48 |
43.5 % |
42.4 % |
Sergio LOPEZ MURCIA |
FEMPA |
972.88 |
42.8 % |
40.7 % |
Tom FELDENKRIZ |
FEEC |
972.46 |
39.7 % |
37.8 % |
Bel TORRENTS PALOMARES |
FEEC |
970.36 |
43.1 % |
42 % |
Juan CORREA LÓPEZ |
FEGAMON |
970.01 |
39.4 % |
37.5 % |
Adrian LUCIO PANIAGUA |
FDMESCyL |
969.00 |
42.3 % |
40.2 % |
Martín FERREIRO RODRÍGUEZ |
FEGAMON |
969.00 |
39.2 % |
37.4 % |
Daniel FERNANDEZ ALVES |
FMM |
968.80 |
42.9 % |
41.8 % |
Mateo MARCOS BASQUERO |
FMM |
965.33 |
38.7 % |
36.9 % |
Juan HERNÁNDEZ GÓMEZ |
FDMCM |
964.90 |
38.7 % |
36.8 % |
Hugo GLORIES ROIG |
FEMECV |
955.21 |
40.3 % |
38.3 % |
Daniel HERNÁNDEZ GÓMEZ |
FDMCM |
950.69 |
36.8 % |
34.9 % |
Lucas CAMACHO TORRES |
FEEC |
949.00 |
39.5 % |
37.4 % |
Rodrigo RAMIRO-IBÁÑEZ CRAIG |
FDMCM |
947.73 |
36.4 % |
34.6 % |
Nicolás AMADOR DEL CASTILLO |
FMM |
945.66 |
36.1 % |
34.3 % |
Gael RODRIGUEZ MENDEZ |
FEGAMON |
942.00 |
38.5 % |
36.5 % |
Luis GAVIRO SORIANO |
FEXME |
940.78 |
35.5 % |
33.7 % |
Ignacio PÉREZ GALÁN |
FDMCM |
938.59 |
35.2 % |
33.4 % |
#####* Capturando los futuros Sub18
bloc.Sub18M.23 <- ranks %>%
filter(stage=="Clasific",
Category=="Sub18_M",
year=="2023"
# Name== nombre
) %>%
group_by(competitor= Name,
Year= year,
Compe= Compe_,
Team = Team,
Date= Date) %>%
reframe(rank= Rank) %>%
reshape2::dcast(formula = competitor + Team ~ Compe,
na.rm = TRUE)
bloc.Sub18M.23 <- as_tibble(bloc.Sub18M.23)
#####* Los sub16 “salen”
## enviando los sub16 a otro archivo
elo.22.accum.to_sub18 <- elo.last.accum %>% semi_join(bloc.Sub18M.23,by="competitor")
## sub16 saliendo
elo.last.accum <- elo.last.accum %>% anti_join(bloc.Sub18M.23,by="competitor")
MERGING from sub14
Elo First 2023
-Competitors = 34-
#####_ Elo History _
Elo Accumulated First_2023
Teo GARCÍA DEL ALAMO |
FDMESCyL |
1110.24 |
64.4 % |
58.2 % |
Bernat MUNNE GUITART |
FEEC |
1102.47 |
63.3 % |
57.1 % |
Manuel PASTOR SÁNCHEZ |
FEMECV |
1092.82 |
56.9 % |
54.9 % |
Íker GARCÍA PEREIRA |
FEXME |
1085.56 |
61 % |
54.7 % |
Andrés VILA ANDRÉS |
FEMECV |
1082.54 |
60.6 % |
54.3 % |
Roc VERGÉS SOLÉ |
FEEC |
1080.15 |
55.1 % |
53.1 % |
Lucas PÉREZ NIETO |
FEXME |
1078.23 |
60 % |
53.6 % |
Mario LÓPEZ LÓPEZ |
FDMESCyL |
1071.74 |
59.1 % |
52.7 % |
Aitor AMAYA LÓPEZ |
FADMES |
1070.00 |
58.9 % |
52.5 % |
Jan MOLIST DOMINGO |
FEEC |
1059.55 |
57.4 % |
51 % |
Santiago ORONICH GREGORIO |
FAM |
1052.88 |
56.5 % |
50 % |
Eric GONZALEZ INGLÉS |
FEEC |
1036.10 |
54.1 % |
47.6 % |
Juan INFANTE MIRANDA |
FADMES |
1032.87 |
53.6 % |
47.1 % |
Darío ANDRÉS RUIZ |
FMM |
1029.28 |
53.1 % |
46.6 % |
Elias GARCIA FERNANDEZ-OJANGUREN |
FEMPA |
1027.76 |
47.5 % |
45.6 % |
Cisneros González AARÓN |
FEXME |
1026.56 |
51.1 % |
50 % |
Yago REAL WHITE |
FEXME |
1026.41 |
52.7 % |
46.2 % |
Ibon LORENTE GARCIA |
FAM |
1025.71 |
52.6 % |
46.1 % |
Chabier VELILLA SANCHEZ |
FAM |
1018.97 |
51.6 % |
45.1 % |
Santiago LOPEZ GARCÍA |
FMM |
1008.43 |
47.9 % |
45.7 % |
Gari MARKUERKIAGA SARRIA |
EMF-FVM |
1007.56 |
50 % |
43.5 % |
Sergio MIRANDA CID |
FEEC |
1003.66 |
49.4 % |
43 % |
Álvaro MORALES NAVARRO |
FADMES |
1001.00 |
43.7 % |
41.8 % |
Aimar ALONSO LEMES |
FECAMON |
1000.04 |
48.9 % |
42.5 % |
Juan GONZÁLEZ FRADE |
FMM |
994.22 |
48.1 % |
41.6 % |
Manex IÑURRATEGI LASAGABASTER |
EMF-FVM |
993.64 |
45.8 % |
43.6 % |
Alexander PALAN OÑA |
FMM |
987.82 |
41.9 % |
39.9 % |
Aratz SANZOL LUMBRERAS |
FNDME |
985.41 |
46.8 % |
40.4 % |
Eric SEGURA JORDÁN |
FEMECV |
984.41 |
45.1 % |
44 % |
Aaron REINARES SANTANDER |
FERIMON |
982.59 |
46.4 % |
40 % |
Alejandro SEGADO DIAZ |
FMM |
980.65 |
46.1 % |
39.8 % |
Martín FERREIRO RODRÍGUEZ |
FEGAMON |
975.93 |
45.5 % |
39.1 % |
Roque LARA RIVERO |
FDMESCyL |
973.48 |
43.5 % |
42.4 % |
Haritz URKIOLA AZURMENDI |
EMF-FVM |
970.95 |
44.8 % |
38.4 % |
Bel TORRENTS PALOMARES |
FEEC |
970.36 |
43.1 % |
42 % |
Hadrián PÉREZ GÓMEZ |
FEGAMON |
970.04 |
44.6 % |
38.3 % |
Alejandro PRIETO GARDEY |
FEMPA |
969.01 |
44.5 % |
38.2 % |
Javier GALÁN FERRER |
FDMCLM |
969.01 |
44.5 % |
38.2 % |
Adrian LUCIO PANIAGUA |
FDMESCyL |
969.00 |
42.3 % |
40.2 % |
Daniel FERNANDEZ ALVES |
FMM |
968.80 |
42.9 % |
41.8 % |
Juan HERNÁNDEZ GÓMEZ |
FDMCM |
964.90 |
38.7 % |
36.8 % |
Ernest WOJDEL ZGIERSKI |
FEEC |
964.05 |
43.8 % |
37.5 % |
Daniel ARMAS TERRADILLO |
FEMPA |
961.01 |
43.3 % |
37.1 % |
Hugo GLORIES ROIG |
FEMECV |
955.21 |
40.3 % |
38.3 % |
Daniel HERNÁNDEZ GÓMEZ |
FDMCM |
953.85 |
42.3 % |
36.1 % |
Mateo MARCOS BASQUERO |
FMM |
950.95 |
41.9 % |
35.7 % |
Lucas CAMACHO TORRES |
FEEC |
949.00 |
39.5 % |
37.4 % |
Rodrigo RAMIRO-IBÁÑEZ CRAIG |
FDMCM |
947.73 |
36.4 % |
34.6 % |
Favila MENENDEZ COTGROVE |
FEMPA |
945.45 |
41.2 % |
35 % |
Luis GAVIRO SORIANO |
FEXME |
942.05 |
40.7 % |
34.6 % |
Gael RODRIGUEZ MENDEZ |
FEGAMON |
942.00 |
38.5 % |
36.5 % |
Efren GONZALEZ LAVANDERA |
FEMPA |
912.93 |
36.7 % |
30.9 % |
Elo Second 2023
-Competitors = 36-
#####_ Elo History _
Elo Accumulated Second_2023
Bernat MUNNE GUITART |
FEEC |
1127.61 |
58.2 % |
52.9 % |
Teo GARCÍA DEL ALAMO |
FDMESCyL |
1126.22 |
58 % |
52.7 % |
Andrés VILA ANDRÉS |
FEMECV |
1109.57 |
55.6 % |
50.4 % |
Lucas PÉREZ NIETO |
FEXME |
1107.10 |
55.3 % |
50 % |
Íker GARCÍA PEREIRA |
FEXME |
1105.26 |
55 % |
49.7 % |
Mario LÓPEZ LÓPEZ |
FDMESCyL |
1093.31 |
53.3 % |
48 % |
Manuel PASTOR SÁNCHEZ |
FEMECV |
1092.82 |
56.9 % |
54.9 % |
Santiago ORONICH GREGORIO |
FAM |
1083.65 |
51.9 % |
46.6 % |
Roc VERGÉS SOLÉ |
FEEC |
1080.15 |
55.1 % |
53.1 % |
Aitor AMAYA LÓPEZ |
FADMES |
1071.46 |
50.2 % |
44.9 % |
Jan MOLIST DOMINGO |
FEEC |
1070.19 |
50 % |
44.7 % |
Eric GONZALEZ INGLÉS |
FEEC |
1054.12 |
47.7 % |
42.4 % |
Yago REAL WHITE |
FEXME |
1049.95 |
47.1 % |
41.8 % |
Juan INFANTE MIRANDA |
FADMES |
1047.25 |
46.7 % |
41.5 % |
Elias GARCIA FERNANDEZ-OJANGUREN |
FEMPA |
1027.76 |
47.5 % |
45.6 % |
Cisneros González AARÓN |
FEXME |
1026.56 |
51.1 % |
50 % |
Darío ANDRÉS RUIZ |
FMM |
1023.55 |
43.3 % |
38.2 % |
Chabier VELILLA SANCHEZ |
FAM |
1018.97 |
51.6 % |
45.1 % |
Sergio MIRANDA CID |
FEEC |
1010.81 |
41.5 % |
36.5 % |
Álvaro MORALES NAVARRO |
FADMES |
1009.99 |
41.4 % |
36.4 % |
Santiago LOPEZ GARCÍA |
FMM |
1008.43 |
47.9 % |
45.7 % |
Gari MARKUERKIAGA SARRIA |
EMF-FVM |
1007.38 |
41.1 % |
36 % |
Ibon LORENTE GARCIA |
FAM |
1003.54 |
40.5 % |
35.5 % |
Aimar ALONSO LEMES |
FECAMON |
998.06 |
39.8 % |
34.8 % |
Juan GONZÁLEZ FRADE |
FMM |
994.22 |
48.1 % |
41.6 % |
Manex IÑURRATEGI LASAGABASTER |
EMF-FVM |
993.64 |
45.8 % |
43.6 % |
Bruno GÓMEZ ALCOCER |
FMM |
992.71 |
39 % |
34.1 % |
Alexander PALAN OÑA |
FMM |
987.82 |
41.9 % |
39.9 % |
Eric SEGURA JORDÁN |
FEMECV |
982.48 |
37.6 % |
32.8 % |
Samuel SCUTELNICU ILIE |
FEMECV |
981.74 |
37.5 % |
32.7 % |
Martín FERREIRO RODRÍGUEZ |
FEGAMON |
975.93 |
45.5 % |
39.1 % |
Hadrián PÉREZ GÓMEZ |
FEGAMON |
975.47 |
36.7 % |
31.9 % |
Pablo SÓLVEZ GÓMEZ |
FDMCM |
974.43 |
36.6 % |
31.8 % |
Roque LARA RIVERO |
FDMESCyL |
973.48 |
43.5 % |
42.4 % |
Aaron REINARES SANTANDER |
FERIMON |
971.52 |
36.2 % |
31.4 % |
Haritz URKIOLA AZURMENDI |
EMF-FVM |
970.95 |
44.8 % |
38.4 % |
Álvaro ÁVILA CORROCHANO |
FDMCLM |
970.77 |
36.1 % |
31.3 % |
Darío ARRANZ BUESO |
FDMCM |
970.77 |
36.1 % |
31.3 % |
Mateo GUTIÉRREZ PASTEUR |
FMRM |
970.77 |
36.1 % |
31.3 % |
Bel TORRENTS PALOMARES |
FEEC |
970.36 |
43.1 % |
42 % |
Alejandro PRIETO GARDEY |
FEMPA |
969.01 |
44.5 % |
38.2 % |
Adrian LUCIO PANIAGUA |
FDMESCyL |
969.00 |
42.3 % |
40.2 % |
Daniel FERNANDEZ ALVES |
FMM |
968.80 |
42.9 % |
41.8 % |
Aratz SANZOL LUMBRERAS |
FNDME |
965.19 |
35.3 % |
30.6 % |
Juan HERNÁNDEZ GÓMEZ |
FDMCM |
964.90 |
38.7 % |
36.8 % |
Alejandro SEGADO DIAZ |
FMM |
964.10 |
35.2 % |
30.5 % |
Hugo GLORIES ROIG |
FEMECV |
955.21 |
40.3 % |
38.3 % |
Luis GAVIRO SORIANO |
FEXME |
954.87 |
34 % |
29.4 % |
Ernest WOJDEL ZGIERSKI |
FEEC |
954.86 |
34 % |
29.4 % |
Daniel HERNÁNDEZ GÓMEZ |
FDMCM |
953.85 |
42.3 % |
36.1 % |
Rodrigo RAMIRO-IBÁÑEZ CRAIG |
FDMCM |
951.39 |
33.5 % |
29 % |
Lucas CAMACHO TORRES |
FEEC |
949.00 |
39.5 % |
37.4 % |
Daniel ARMAS TERRADILLO |
FEMPA |
946.35 |
32.9 % |
28.4 % |
Gael RODRIGUEZ MENDEZ |
FEGAMON |
942.00 |
38.5 % |
36.5 % |
Javier GALÁN FERRER |
FDMCLM |
941.52 |
32.3 % |
27.8 % |
Mateo MARCOS BASQUERO |
FMM |
938.15 |
31.9 % |
27.4 % |
Favila MENENDEZ COTGROVE |
FEMPA |
921.69 |
29.8 % |
25.6 % |
Efren GONZALEZ LAVANDERA |
FEMPA |
912.93 |
36.7 % |
30.9 % |
Elo Third 2023
-Competitors = 36-
#####_ Elo History _
Elo Accumulated Third_2023
Teo GARCÍA DEL ALAMO |
FDMESCyL |
1143.27 |
59.7 % |
51.1 % |
Bernat MUNNE GUITART |
FEEC |
1142.71 |
59.6 % |
51 % |
Andrés VILA ANDRÉS |
FEMECV |
1140.24 |
59.3 % |
50.6 % |
Lucas PÉREZ NIETO |
FEXME |
1135.83 |
58.7 % |
50 % |
Íker GARCÍA PEREIRA |
FEXME |
1128.18 |
57.6 % |
48.9 % |
Mario LÓPEZ LÓPEZ |
FDMESCyL |
1118.20 |
56.2 % |
47.5 % |
Santiago ORONICH GREGORIO |
FAM |
1110.51 |
55.1 % |
46.4 % |
Manuel PASTOR SÁNCHEZ |
FEMECV |
1092.82 |
56.9 % |
54.9 % |
Jan MOLIST DOMINGO |
FEEC |
1091.27 |
52.3 % |
43.6 % |
Roc VERGÉS SOLÉ |
FEEC |
1080.15 |
55.1 % |
53.1 % |
Aitor AMAYA LÓPEZ |
FADMES |
1075.08 |
50 % |
41.3 % |
Yago REAL WHITE |
FEXME |
1063.33 |
48.3 % |
39.7 % |
Eric GONZALEZ INGLÉS |
FEEC |
1059.73 |
47.8 % |
39.2 % |
Juan INFANTE MIRANDA |
FADMES |
1058.70 |
47.6 % |
39.1 % |
Chabier VELILLA SANCHEZ |
FAM |
1028.56 |
43.3 % |
35 % |
Elias GARCIA FERNANDEZ-OJANGUREN |
FEMPA |
1027.76 |
47.5 % |
45.6 % |
Cisneros González AARÓN |
FEXME |
1026.56 |
51.1 % |
50 % |
Sergio MIRANDA CID |
FEEC |
1018.49 |
41.9 % |
33.7 % |
Darío ANDRÉS RUIZ |
FMM |
1017.62 |
41.8 % |
33.6 % |
Santiago LOPEZ GARCÍA |
FMM |
1008.43 |
47.9 % |
45.7 % |
Ibon LORENTE GARCIA |
FAM |
1005.42 |
40.1 % |
32.1 % |
Gari MARKUERKIAGA SARRIA |
EMF-FVM |
1003.43 |
39.8 % |
31.8 % |
Álvaro MORALES NAVARRO |
FADMES |
994.40 |
38.6 % |
30.7 % |
Manex IÑURRATEGI LASAGABASTER |
EMF-FVM |
993.64 |
45.8 % |
43.6 % |
Aimar ALONSO LEMES |
FECAMON |
990.26 |
38 % |
30.2 % |
Alexander PALAN OÑA |
FMM |
987.82 |
41.9 % |
39.9 % |
Eric SEGURA JORDÁN |
FEMECV |
982.48 |
37.6 % |
32.8 % |
Samuel SCUTELNICU ILIE |
FEMECV |
981.74 |
37.5 % |
32.7 % |
Hadrián PÉREZ GÓMEZ |
FEGAMON |
975.47 |
36.7 % |
31.9 % |
Pablo SÓLVEZ GÓMEZ |
FDMCM |
974.43 |
36.6 % |
31.8 % |
Luis GAVIRO SORIANO |
FEXME |
974.35 |
35.9 % |
28.3 % |
Martín FERREIRO RODRÍGUEZ |
FEGAMON |
974.02 |
35.9 % |
28.3 % |
Roque LARA RIVERO |
FDMESCyL |
973.48 |
43.5 % |
42.4 % |
Israel HERAS IGAL |
FNDME |
972.89 |
35.7 % |
28.1 % |
Juan GONZÁLEZ FRADE |
FMM |
972.86 |
35.7 % |
28.1 % |
Aaron REINARES SANTANDER |
FERIMON |
971.52 |
36.2 % |
31.4 % |
Darío ARRANZ BUESO |
FDMCM |
970.77 |
36.1 % |
31.3 % |
Mateo GUTIÉRREZ PASTEUR |
FMRM |
970.77 |
36.1 % |
31.3 % |
Bel TORRENTS PALOMARES |
FEEC |
970.36 |
43.1 % |
42 % |
Alejandro PRIETO GARDEY |
FEMPA |
969.01 |
44.5 % |
38.2 % |
Isaac REDONDO ARRANZ |
FMM |
969.01 |
35.2 % |
27.7 % |
Adrian LUCIO PANIAGUA |
FDMESCyL |
969.00 |
42.3 % |
40.2 % |
Daniel FERNANDEZ ALVES |
FMM |
968.80 |
42.9 % |
41.8 % |
Bruno GÓMEZ ALCOCER |
FMM |
967.47 |
35 % |
27.5 % |
Pau GARCÍA PÉREZ |
FEMECV |
967.07 |
34.9 % |
27.5 % |
Juan HERNÁNDEZ GÓMEZ |
FDMCM |
964.90 |
38.7 % |
36.8 % |
Haritz URKIOLA AZURMENDI |
EMF-FVM |
961.29 |
34.2 % |
26.8 % |
Hugo GLORIES ROIG |
FEMECV |
955.21 |
40.3 % |
38.3 % |
Ernest WOJDEL ZGIERSKI |
FEEC |
954.86 |
34 % |
29.4 % |
Daniel HERNÁNDEZ GÓMEZ |
FDMCM |
953.85 |
42.3 % |
36.1 % |
Alejandro SEGADO DIAZ |
FMM |
950.58 |
32.8 % |
25.6 % |
Lucas CAMACHO TORRES |
FEEC |
949.00 |
39.5 % |
37.4 % |
Aratz SANZOL LUMBRERAS |
FNDME |
947.79 |
32.5 % |
25.3 % |
Álvaro ÁVILA CORROCHANO |
FDMCLM |
947.54 |
32.4 % |
25.3 % |
Gael RODRIGUEZ MENDEZ |
FEGAMON |
942.00 |
38.5 % |
36.5 % |
Javier GALÁN FERRER |
FDMCLM |
941.52 |
32.3 % |
27.8 % |
Rodrigo RAMIRO-IBÁÑEZ CRAIG |
FDMCM |
939.85 |
31.5 % |
24.4 % |
Mateo MARCOS BASQUERO |
FMM |
938.28 |
31.3 % |
24.3 % |
Daniel ARMAS TERRADILLO |
FEMPA |
927.07 |
29.9 % |
23.1 % |
Efren GONZALEZ LAVANDERA |
FEMPA |
912.93 |
36.7 % |
30.9 % |
Favila MENENDEZ COTGROVE |
FEMPA |
892.78 |
25.9 % |
19.8 % |
Elo CAMP 2023
-Competitors = 36-
#####_ Elo History _
Elo Accumulated camp_2023
Bernat MUNNE GUITART |
FEEC |
1171.11 |
62.7 % |
52.3 % |
Andrés VILA ANDRÉS |
FEMECV |
1170.71 |
62.6 % |
52.2 % |
Lucas PÉREZ NIETO |
FEXME |
1160.12 |
61.2 % |
50.7 % |
Teo GARCÍA DEL ALAMO |
FDMESCyL |
1155.16 |
60.5 % |
50 % |
Íker GARCÍA PEREIRA |
FEXME |
1144.24 |
59 % |
48.4 % |
Mario LÓPEZ LÓPEZ |
FDMESCyL |
1140.48 |
58.5 % |
47.9 % |
Santiago ORONICH GREGORIO |
FAM |
1136.94 |
58 % |
47.4 % |
Jan MOLIST DOMINGO |
FEEC |
1105.37 |
53.5 % |
42.9 % |
Manuel PASTOR SÁNCHEZ |
FEMECV |
1092.82 |
56.9 % |
54.9 % |
Aitor AMAYA LÓPEZ |
FADMES |
1080.97 |
50 % |
39.5 % |
Roc VERGÉS SOLÉ |
FEEC |
1080.15 |
55.1 % |
53.1 % |
Yago REAL WHITE |
FEXME |
1071.32 |
48.6 % |
38.2 % |
Juan INFANTE MIRANDA |
FADMES |
1060.51 |
47.1 % |
36.7 % |
Eric GONZALEZ INGLÉS |
FEEC |
1059.73 |
47.8 % |
39.2 % |
Chabier VELILLA SANCHEZ |
FAM |
1028.56 |
43.3 % |
35 % |
Darío ANDRÉS RUIZ |
FMM |
1027.82 |
42.4 % |
32.5 % |
Elias GARCIA FERNANDEZ-OJANGUREN |
FEMPA |
1027.76 |
47.5 % |
45.6 % |
Cisneros González AARÓN |
FEXME |
1026.56 |
51.1 % |
50 % |
Gari MARKUERKIAGA SARRIA |
EMF-FVM |
1023.99 |
41.9 % |
32 % |
Santiago LOPEZ GARCÍA |
FMM |
1008.43 |
47.9 % |
45.7 % |
Sergio MIRANDA CID |
FEEC |
1003.91 |
39.1 % |
29.5 % |
Ibon LORENTE GARCIA |
FAM |
997.07 |
38.2 % |
28.7 % |
Manex IÑURRATEGI LASAGABASTER |
EMF-FVM |
993.64 |
45.8 % |
43.6 % |
Luis GAVIRO SORIANO |
FEXME |
992.94 |
37.6 % |
28.2 % |
Aimar ALONSO LEMES |
FECAMON |
990.26 |
38 % |
30.2 % |
Álvaro MORALES NAVARRO |
FADMES |
988.15 |
37 % |
27.7 % |
Alexander PALAN OÑA |
FMM |
987.82 |
41.9 % |
39.9 % |
Edu OREJA GALVÁN |
FEXME |
987.65 |
36.9 % |
27.6 % |
Eric SEGURA JORDÁN |
FEMECV |
982.48 |
37.6 % |
32.8 % |
Samuel SCUTELNICU ILIE |
FEMECV |
981.74 |
37.5 % |
32.7 % |
Miquel Àngel JAUSET SABATER |
FEEC |
977.32 |
35.5 % |
26.4 % |
Pablo SÓLVEZ GÓMEZ |
FDMCM |
974.43 |
36.6 % |
31.8 % |
Roque LARA RIVERO |
FDMESCyL |
973.48 |
43.5 % |
42.4 % |
Juan GONZÁLEZ FRADE |
FMM |
972.86 |
35.7 % |
28.1 % |
Martín FERREIRO RODRÍGUEZ |
FEGAMON |
971.97 |
34.8 % |
25.8 % |
Rafael CASTELLANO OATT |
FEMECV |
971.13 |
34.7 % |
25.7 % |
Darío ARRANZ BUESO |
FDMCM |
970.77 |
36.1 % |
31.3 % |
Mateo GUTIÉRREZ PASTEUR |
FMRM |
970.77 |
36.1 % |
31.3 % |
Bel TORRENTS PALOMARES |
FEEC |
970.36 |
43.1 % |
42 % |
Alejandro PRIETO GARDEY |
FEMPA |
969.01 |
44.5 % |
38.2 % |
Isaac REDONDO ARRANZ |
FMM |
969.01 |
35.2 % |
27.7 % |
Adrian LUCIO PANIAGUA |
FDMESCyL |
969.00 |
42.3 % |
40.2 % |
Daniel FERNANDEZ ALVES |
FMM |
968.80 |
42.9 % |
41.8 % |
Bruno GÓMEZ ALCOCER |
FMM |
967.47 |
35 % |
27.5 % |
Hadrián PÉREZ GÓMEZ |
FEGAMON |
965.15 |
33.9 % |
25.1 % |
Juan HERNÁNDEZ GÓMEZ |
FDMCM |
964.90 |
38.7 % |
36.8 % |
Haritz URKIOLA AZURMENDI |
EMF-FVM |
961.29 |
34.2 % |
26.8 % |
Hugo GLORIES ROIG |
FEMECV |
955.21 |
40.3 % |
38.3 % |
Ernest WOJDEL ZGIERSKI |
FEEC |
954.93 |
32.6 % |
24 % |
Israel HERAS IGAL |
FNDME |
954.32 |
32.5 % |
23.9 % |
Aratz SANZOL LUMBRERAS |
FNDME |
952.01 |
32.2 % |
23.7 % |
Aaron REINARES SANTANDER |
FERIMON |
950.89 |
32.1 % |
23.6 % |
Alejandro SEGADO DIAZ |
FMM |
950.58 |
32.8 % |
25.6 % |
Daniel HERNÁNDEZ GÓMEZ |
FDMCM |
949.80 |
32 % |
23.5 % |
Lucas CAMACHO TORRES |
FEEC |
949.00 |
39.5 % |
37.4 % |
Gael RODRIGUEZ MENDEZ |
FEGAMON |
942.00 |
38.5 % |
36.5 % |
Pau GARCÍA PÉREZ |
FEMECV |
940.26 |
30.8 % |
22.5 % |
Rodrigo RAMIRO-IBÁÑEZ CRAIG |
FDMCM |
939.85 |
31.5 % |
24.4 % |
Álvaro ÁVILA CORROCHANO |
FDMCLM |
918.73 |
28.2 % |
20.4 % |
Mateo MARCOS BASQUERO |
FMM |
915.69 |
27.9 % |
20.1 % |
Efren GONZALEZ LAVANDERA |
FEMPA |
912.93 |
36.7 % |
30.9 % |
Javier GALÁN FERRER |
FDMCLM |
912.73 |
27.5 % |
19.9 % |
Daniel ARMAS TERRADILLO |
FEMPA |
910.71 |
27.3 % |
19.7 % |
Favila MENENDEZ COTGROVE |
FEMPA |
892.78 |
25.9 % |
19.8 % |
###* Capturando los futuros Sub18
bloc.Sub18M.24 <- ranks %>%
filter(stage=="Clasific",
Category=="Sub18_M",
year=="2024"
# Name== nombre
) %>%
group_by(competitor= Name,
Year= year,
Compe= Compe_,
Team = Team,
Date= Date) %>%
reframe(rank= Rank) %>%
reshape2::dcast(formula = competitor + Team ~ Compe,
na.rm = TRUE)
bloc.Sub18M.24 <- as_tibble(bloc.Sub18M.24)
###* Los futuros sub18 “salen”
## enviando los sub16 a otro archivo
elo.23.accum.to_sub18 <- elo.last.accum %>% semi_join(bloc.Sub18M.24,by="competitor")
## sub16 saliendo
elo.last.accum <- elo.last.accum %>% anti_join(bloc.Sub18M.24,by="competitor")
Anchoring ‘elo.last.accum’ 2023
elo.23.accum <- elo.last.accum
MERGING FROM SUB14-2023
Elo First 2024
-Competitors = 48-
re-instating ‘elo.last.accum’
elo.last.accum <- elo.23.accum
#####_ Elo History _
Elo Accumulated First_2024
Bernat MUNNE GUITART |
FEEC |
1199.53 |
80.9 % |
59.5 % |
Eñaut USON POBES |
EMF-FVM |
1198.40 |
80.8 % |
59.3 % |
Andrés VILA ANDRÉS |
FEMECV |
1170.71 |
62.6 % |
52.2 % |
Íker GARCÍA PEREIRA |
FEXME |
1170.09 |
78.2 % |
55.3 % |
Teo GARCÍA DEL ALAMO |
FDMESCyL |
1159.16 |
77.1 % |
53.8 % |
Carlos FERREIRA GÓMEZ-VALADÉS |
FEXME |
1157.15 |
76.9 % |
53.5 % |
Nil ADSUAR PABLOS |
FEMECV |
1138.43 |
74.9 % |
50.8 % |
Jan MOLIST DOMINGO |
FEEC |
1132.82 |
74.3 % |
50 % |
Gonzalo ESCUDERO CALVO |
FEXME |
1098.86 |
70.4 % |
45.1 % |
Daniel MENDAÑA JIMENEZ |
FBME |
1095.36 |
70 % |
44.6 % |
David MARTÍNEZ GARCÍA |
FEMECV |
1090.76 |
69.4 % |
44 % |
Aitor AMAYA LÓPEZ |
FADMES |
1084.07 |
68.6 % |
43 % |
Martín RODRÍGUEZ SOMOLINOS |
FMM |
1075.64 |
67.5 % |
41.8 % |
Manuel NAVARRETE ALCARAZ |
FEMECV |
1068.44 |
66.6 % |
40.8 % |
Eric GONZALEZ INGLÉS |
FEEC |
1059.73 |
47.8 % |
39.2 % |
Darío ANDRÉS RUIZ |
FMM |
1053.08 |
64.6 % |
38.7 % |
Keanu Israel VILLATORO KUPERMAN |
FEEC |
1051.32 |
64.4 % |
38.5 % |
Biel SERRA LLOP |
FEEC |
1040.67 |
63 % |
37 % |
Elias GARCIA FERNANDEZ-OJANGUREN |
FEMPA |
1027.76 |
47.5 % |
45.6 % |
Cisneros González AARÓN |
FEXME |
1026.56 |
51.1 % |
50 % |
Lier PEREZ BARRERAS |
EMF-FVM |
1015.86 |
59.6 % |
33.8 % |
Ibon LORENTE GARCIA |
FAM |
1015.74 |
59.6 % |
33.8 % |
Martí SÁNCHEZ VÁZQUEZ |
FEEC |
1010.91 |
58.9 % |
33.1 % |
Santiago LOPEZ GARCÍA |
FMM |
1008.43 |
47.9 % |
45.7 % |
Felix FORRISDAHL |
FECAMON |
1000.78 |
57.5 % |
31.9 % |
Hugo CALVO RUIZ |
FDMESCyL |
997.29 |
57 % |
31.4 % |
Gorka GARDEAZABAL LARAUDOGOITIA |
EMF-FVM |
994.57 |
56.6 % |
31.1 % |
Manex IÑURRATEGI LASAGABASTER |
EMF-FVM |
993.64 |
45.8 % |
43.6 % |
Germán DELTIEMPO SANTOS |
FAM |
988.88 |
55.8 % |
30.4 % |
Alexander PALAN OÑA |
FMM |
987.82 |
41.9 % |
39.9 % |
Alex Tan VELASCO CAMPOS |
FADMES |
985.04 |
55.2 % |
29.9 % |
Eric SEGURA JORDÁN |
FEMECV |
982.48 |
37.6 % |
32.8 % |
Samuel SCUTELNICU ILIE |
FEMECV |
981.74 |
37.5 % |
32.7 % |
Arturo BENÍTEZ BALLESTEROS |
FADMES |
978.23 |
54.3 % |
29.1 % |
Guillermo LARES-FRANCO DIAZ-MIGUEL |
FBME |
978.23 |
54.3 % |
29.1 % |
Ian CAMPOS ALCÁNTARA |
FMRM |
978.23 |
54.3 % |
29.1 % |
Juan CONESA MARÍN |
FMRM |
978.23 |
54.3 % |
29.1 % |
Martín LANZA FERNÁNDEZ |
FEMPA |
978.23 |
54.3 % |
29.1 % |
Oliver NAVARRO BOOD |
FMRM |
978.23 |
54.3 % |
29.1 % |
Pep SOLÉ MORENO |
FEEC |
978.23 |
54.3 % |
29.1 % |
Silvio GARCIA SALVADOR |
FEMECV |
978.23 |
54.3 % |
29.1 % |
Miquel Àngel JAUSET SABATER |
FEEC |
977.32 |
35.5 % |
26.4 % |
Iván PACIOS IGLESIAS |
FEGAMON |
976.71 |
54.1 % |
28.9 % |
Pablo SÓLVEZ GÓMEZ |
FDMCM |
974.43 |
36.6 % |
31.8 % |
Roque LARA RIVERO |
FDMESCyL |
973.48 |
43.5 % |
42.4 % |
Rafael CASTELLANO OATT |
FEMECV |
971.13 |
34.7 % |
25.7 % |
Darío ARRANZ BUESO |
FDMCM |
970.77 |
36.1 % |
31.3 % |
Mateo GUTIÉRREZ PASTEUR |
FMRM |
970.77 |
36.1 % |
31.3 % |
Bel TORRENTS PALOMARES |
FEEC |
970.36 |
43.1 % |
42 % |
Alejandro PRIETO GARDEY |
FEMPA |
969.01 |
44.5 % |
38.2 % |
Adrian LUCIO PANIAGUA |
FDMESCyL |
969.00 |
42.3 % |
40.2 % |
Daniel FERNANDEZ ALVES |
FMM |
968.80 |
42.9 % |
41.8 % |
Tiago CARBALLO VARELA |
FEGAMON |
967.92 |
52.8 % |
27.9 % |
Bruno GÓMEZ ALCOCER |
FMM |
967.47 |
35 % |
27.5 % |
Cai SALINAS SELLAS |
FEEC |
966.13 |
52.5 % |
27.7 % |
Isaac REDONDO ARRANZ |
FMM |
962.00 |
52 % |
27.2 % |
Gabriel MARTÍNEZ SANCHÉZ |
FDMCLM |
960.97 |
51.8 % |
27.1 % |
David ROMERO LÁZARO |
FMM |
958.20 |
51.4 % |
26.8 % |
Hugo GLORIES ROIG |
FEMECV |
955.21 |
40.3 % |
38.3 % |
Alejandro SEGADO DIAZ |
FMM |
950.58 |
32.8 % |
25.6 % |
Fernando FRONTERA CHAMIZO |
FMM |
950.51 |
50.3 % |
25.9 % |
Albert GARCIA BERNABEU |
FEMECV |
950.33 |
50.3 % |
25.9 % |
Lucas CAMACHO TORRES |
FEEC |
949.00 |
39.5 % |
37.4 % |
Pau GARCÍA PÉREZ |
FEMECV |
948.43 |
50 % |
25.7 % |
Aimar DELARIBERETTE AZNAR |
FADMES |
942.28 |
49.1 % |
25 % |
Alejandro ROMERO MORALES |
FADMES |
935.46 |
48.1 % |
24.3 % |
Álvaro ÁVILA CORROCHANO |
FDMCLM |
932.49 |
47.7 % |
24 % |
Aratz SANZOL LUMBRERAS |
FNDME |
930.14 |
47.4 % |
23.7 % |
Manel NAVARRO LANAU |
FEEC |
915.98 |
45.3 % |
22.3 % |
Daniel ARMAS TERRADILLO |
FEMPA |
913.63 |
45 % |
22.1 % |
Efren GONZALEZ LAVANDERA |
FEMPA |
912.93 |
36.7 % |
30.9 % |
Javier GALÁN FERRER |
FDMCLM |
899.30 |
43 % |
20.7 % |
Favila MENENDEZ COTGROVE |
FEMPA |
892.78 |
25.9 % |
19.8 % |
Elo Second 2023
-Competitors = 36-
#####_ Elo History _
Elo Accumulated Second_2024
Eñaut USON POBES |
EMF-FVM |
1227.45 |
66.3 % |
55.4 % |
Bernat MUNNE GUITART |
FEEC |
1225.29 |
66 % |
55.1 % |
Íker GARCÍA PEREIRA |
FEXME |
1194.27 |
61.9 % |
50.6 % |
Teo GARCÍA DEL ALAMO |
FDMESCyL |
1189.93 |
61.3 % |
50 % |
Carlos FERREIRA GÓMEZ-VALADÉS |
FEXME |
1171.51 |
58.7 % |
47.4 % |
Andrés VILA ANDRÉS |
FEMECV |
1170.71 |
62.6 % |
52.2 % |
Jan MOLIST DOMINGO |
FEEC |
1160.36 |
57.2 % |
45.8 % |
Nil ADSUAR PABLOS |
FEMECV |
1139.70 |
54.2 % |
42.8 % |
Daniel MENDAÑA JIMENEZ |
FBME |
1116.42 |
50.9 % |
39.6 % |
David MARTÍNEZ GARCÍA |
FEMECV |
1110.19 |
50 % |
38.7 % |
Gonzalo ESCUDERO CALVO |
FEXME |
1108.42 |
49.7 % |
38.5 % |
Aitor AMAYA LÓPEZ |
FADMES |
1096.95 |
48.1 % |
36.9 % |
Darío ANDRÉS RUIZ |
FMM |
1075.88 |
45.1 % |
34.2 % |
Manuel NAVARRETE ALCARAZ |
FEMECV |
1073.15 |
44.7 % |
33.8 % |
Eric GONZALEZ INGLÉS |
FEEC |
1059.73 |
47.8 % |
39.2 % |
Keanu Israel VILLATORO KUPERMAN |
FEEC |
1059.35 |
42.7 % |
32 % |
Biel SERRA LLOP |
FEEC |
1056.94 |
42.4 % |
31.7 % |
Martín RODRÍGUEZ SOMOLINOS |
FMM |
1050.80 |
41.5 % |
31 % |
Elias GARCIA FERNANDEZ-OJANGUREN |
FEMPA |
1027.76 |
47.5 % |
45.6 % |
Cisneros González AARÓN |
FEXME |
1026.56 |
51.1 % |
50 % |
Santiago LOPEZ GARCÍA |
FMM |
1008.43 |
47.9 % |
45.7 % |
Germán DELTIEMPO SANTOS |
FAM |
1006.92 |
35.6 % |
25.9 % |
Lier PEREZ BARRERAS |
EMF-FVM |
1004.29 |
35.2 % |
25.6 % |
Martí SÁNCHEZ VÁZQUEZ |
FEEC |
1002.63 |
35 % |
25.4 % |
Felix FORRISDAHL |
FECAMON |
999.09 |
34.5 % |
25 % |
Ibon LORENTE GARCIA |
FAM |
997.61 |
34.3 % |
24.8 % |
Gorka GARDEAZABAL LARAUDOGOITIA |
EMF-FVM |
994.57 |
56.6 % |
31.1 % |
Manex IÑURRATEGI LASAGABASTER |
EMF-FVM |
993.64 |
45.8 % |
43.6 % |
Alexander PALAN OÑA |
FMM |
987.82 |
41.9 % |
39.9 % |
Jorge COBO APARICIO |
FMM |
986.89 |
33 % |
23.7 % |
Alex Tan VELASCO CAMPOS |
FADMES |
985.04 |
55.2 % |
29.9 % |
Iván PACIOS IGLESIAS |
FEGAMON |
983.29 |
32.5 % |
23.3 % |
Eric SEGURA JORDÁN |
FEMECV |
982.48 |
37.6 % |
32.8 % |
Javier DE TENA CEBALLOS |
FEXME |
981.97 |
32.3 % |
23.2 % |
Samuel SCUTELNICU ILIE |
FEMECV |
981.74 |
37.5 % |
32.7 % |
Arturo BENÍTEZ BALLESTEROS |
FADMES |
978.23 |
54.3 % |
29.1 % |
Ian CAMPOS ALCÁNTARA |
FMRM |
978.23 |
54.3 % |
29.1 % |
Juan CONESA MARÍN |
FMRM |
978.23 |
54.3 % |
29.1 % |
Oliver NAVARRO BOOD |
FMRM |
978.23 |
54.3 % |
29.1 % |
Miquel Àngel JAUSET SABATER |
FEEC |
977.32 |
35.5 % |
26.4 % |
Lucca BENIGNI LÓPEZ |
FEGAMON |
977.05 |
31.7 % |
22.7 % |
Pablo SÓLVEZ GÓMEZ |
FDMCM |
974.43 |
36.6 % |
31.8 % |
Roque LARA RIVERO |
FDMESCyL |
973.48 |
43.5 % |
42.4 % |
Silvio GARCIA SALVADOR |
FEMECV |
973.32 |
31.3 % |
22.3 % |
Rafael CASTELLANO OATT |
FEMECV |
971.13 |
34.7 % |
25.7 % |
Darío ARRANZ BUESO |
FDMCM |
970.77 |
36.1 % |
31.3 % |
Mateo GUTIÉRREZ PASTEUR |
FMRM |
970.77 |
36.1 % |
31.3 % |
Bel TORRENTS PALOMARES |
FEEC |
970.36 |
43.1 % |
42 % |
Hugo CALVO RUIZ |
FDMESCyL |
969.36 |
30.8 % |
21.9 % |
Alejandro PRIETO GARDEY |
FEMPA |
969.01 |
44.5 % |
38.2 % |
Adrian LUCIO PANIAGUA |
FDMESCyL |
969.00 |
42.3 % |
40.2 % |
Daniel FERNANDEZ ALVES |
FMM |
968.80 |
42.9 % |
41.8 % |
Pep SOLÉ MORENO |
FEEC |
968.39 |
30.7 % |
21.8 % |
Bruno GÓMEZ ALCOCER |
FMM |
967.47 |
35 % |
27.5 % |
Cai SALINAS SELLAS |
FEEC |
966.13 |
52.5 % |
27.7 % |
Hugo GLORIES ROIG |
FEMECV |
955.21 |
40.3 % |
38.3 % |
Tiago CARBALLO VARELA |
FEGAMON |
954.83 |
29 % |
20.5 % |
David ROMERO LÁZARO |
FMM |
951.70 |
28.7 % |
20.2 % |
Alejandro SEGADO DIAZ |
FMM |
950.58 |
32.8 % |
25.6 % |
Albert GARCIA BERNABEU |
FEMECV |
950.41 |
28.5 % |
20.1 % |
Martín LANZA FERNÁNDEZ |
FEMPA |
950.34 |
28.5 % |
20.1 % |
Lucas CAMACHO TORRES |
FEEC |
949.00 |
39.5 % |
37.4 % |
Pau GARCÍA PÉREZ |
FEMECV |
948.43 |
50 % |
25.7 % |
Gabriel MARTÍNEZ SANCHÉZ |
FDMCLM |
947.90 |
28.2 % |
19.9 % |
Guillermo LARES-FRANCO DIAZ-MIGUEL |
FBME |
947.06 |
28.1 % |
19.8 % |
Isaac REDONDO ARRANZ |
FMM |
944.00 |
27.8 % |
19.5 % |
Aimar DELARIBERETTE AZNAR |
FADMES |
942.28 |
49.1 % |
25 % |
Aratz SANZOL LUMBRERAS |
FNDME |
941.76 |
27.5 % |
19.3 % |
Alejandro ROMERO MORALES |
FADMES |
935.46 |
48.1 % |
24.3 % |
Álvaro ÁVILA CORROCHANO |
FDMCLM |
929.33 |
26.1 % |
18.2 % |
Fernando FRONTERA CHAMIZO |
FMM |
919.41 |
25 % |
17.4 % |
Daniel ARMAS TERRADILLO |
FEMPA |
917.08 |
24.8 % |
17.2 % |
Efren GONZALEZ LAVANDERA |
FEMPA |
912.93 |
36.7 % |
30.9 % |
Javier GALÁN FERRER |
FDMCLM |
899.30 |
43 % |
20.7 % |
Favila MENENDEZ COTGROVE |
FEMPA |
892.78 |
25.9 % |
19.8 % |
Manel NAVARRO LANAU |
FEEC |
889.89 |
22 % |
15.1 % |
Elo Third 2023
-Competitors = 44-
#####_ Elo History _
Elo Accumulated Third_2024
Bernat MUNNE GUITART |
FEEC |
1254.51 |
67.9 % |
59.5 % |
Eñaut USON POBES |
EMF-FVM |
1227.45 |
66.3 % |
55.4 % |
Íker GARCÍA PEREIRA |
FEXME |
1222.06 |
63.7 % |
55 % |
Teo GARCÍA DEL ALAMO |
FDMESCyL |
1220.70 |
63.5 % |
54.8 % |
Carlos FERREIRA GÓMEZ-VALADÉS |
FEXME |
1187.43 |
59 % |
50 % |
Jan MOLIST DOMINGO |
FEEC |
1176.30 |
57.4 % |
48.4 % |
Andrés VILA ANDRÉS |
FEMECV |
1170.71 |
62.6 % |
52.2 % |
Nil ADSUAR PABLOS |
FEMECV |
1146.75 |
53.2 % |
44.2 % |
Daniel MENDAÑA JIMENEZ |
FBME |
1139.89 |
52.2 % |
43.2 % |
David MARTÍNEZ GARCÍA |
FEMECV |
1132.19 |
51.1 % |
42.1 % |
Gonzalo ESCUDERO CALVO |
FEXME |
1124.47 |
50 % |
41 % |
Aitor AMAYA LÓPEZ |
FADMES |
1121.95 |
49.6 % |
40.7 % |
Darío ANDRÉS RUIZ |
FMM |
1096.46 |
46 % |
37.2 % |
Manuel NAVARRETE ALCARAZ |
FEMECV |
1084.81 |
44.3 % |
35.6 % |
Biel SERRA LLOP |
FEEC |
1074.59 |
42.9 % |
34.3 % |
Keanu Israel VILLATORO KUPERMAN |
FEEC |
1071.04 |
42.4 % |
33.8 % |
Eric GONZALEZ INGLÉS |
FEEC |
1059.73 |
47.8 % |
39.2 % |
Elias GARCIA FERNANDEZ-OJANGUREN |
FEMPA |
1027.76 |
47.5 % |
45.6 % |
Cisneros González AARÓN |
FEXME |
1026.56 |
51.1 % |
50 % |
Martín RODRÍGUEZ SOMOLINOS |
FMM |
1020.84 |
35.5 % |
27.7 % |
Martí SÁNCHEZ VÁZQUEZ |
FEEC |
1008.50 |
33.9 % |
26.3 % |
Santiago LOPEZ GARCÍA |
FMM |
1008.43 |
47.9 % |
45.7 % |
Lier PEREZ BARRERAS |
EMF-FVM |
1004.20 |
33.4 % |
25.8 % |
Germán DELTIEMPO SANTOS |
FAM |
1003.85 |
33.3 % |
25.8 % |
Ander BEITIA FILAMENDI |
EMF-FVM |
997.04 |
32.4 % |
25 % |
Ibon LORENTE GARCIA |
FAM |
994.56 |
32.1 % |
24.8 % |
Manex IÑURRATEGI LASAGABASTER |
EMF-FVM |
993.64 |
45.8 % |
43.6 % |
Gorka GARDEAZABAL LARAUDOGOITIA |
EMF-FVM |
993.02 |
31.9 % |
24.6 % |
Alexander PALAN OÑA |
FMM |
987.82 |
41.9 % |
39.9 % |
Jorge COBO APARICIO |
FMM |
986.89 |
33 % |
23.7 % |
Yago CORRAL PÉREZ |
FBME |
986.62 |
31.1 % |
23.9 % |
Iván PACIOS IGLESIAS |
FEGAMON |
986.23 |
31.1 % |
23.9 % |
Felix FORRISDAHL |
FECAMON |
985.62 |
31 % |
23.8 % |
Alex Tan VELASCO CAMPOS |
FADMES |
985.04 |
55.2 % |
29.9 % |
Eric SEGURA JORDÁN |
FEMECV |
982.48 |
37.6 % |
32.8 % |
Javier DE TENA CEBALLOS |
FEXME |
981.97 |
32.3 % |
23.2 % |
Samuel SCUTELNICU ILIE |
FEMECV |
981.74 |
37.5 % |
32.7 % |
Miquel Àngel JAUSET SABATER |
FEEC |
980.27 |
30.4 % |
23.3 % |
Jon VILLEGAS ELIZALDE |
FNDME |
979.18 |
30.2 % |
23.2 % |
Arturo BENÍTEZ BALLESTEROS |
FADMES |
978.23 |
54.3 % |
29.1 % |
Ian CAMPOS ALCÁNTARA |
FMRM |
978.23 |
54.3 % |
29.1 % |
Juan CONESA MARÍN |
FMRM |
978.23 |
54.3 % |
29.1 % |
Oliver NAVARRO BOOD |
FMRM |
978.23 |
54.3 % |
29.1 % |
Pablo SÓLVEZ GÓMEZ |
FDMCM |
974.43 |
36.6 % |
31.8 % |
Pep SOLÉ MORENO |
FEEC |
974.34 |
29.6 % |
22.7 % |
Roque LARA RIVERO |
FDMESCyL |
973.48 |
43.5 % |
42.4 % |
Silvio GARCIA SALVADOR |
FEMECV |
973.32 |
31.3 % |
22.3 % |
Roman KOSINTSEV |
FEEC |
971.74 |
29.3 % |
22.4 % |
Rafael CASTELLANO OATT |
FEMECV |
971.13 |
34.7 % |
25.7 % |
Darío ARRANZ BUESO |
FDMCM |
970.77 |
36.1 % |
31.3 % |
Mateo GUTIÉRREZ PASTEUR |
FMRM |
970.77 |
36.1 % |
31.3 % |
Bel TORRENTS PALOMARES |
FEEC |
970.36 |
43.1 % |
42 % |
Nicolás RODRÍGUEZ LÓPEZ |
FDMESCyL |
970.25 |
29.2 % |
22.3 % |
Alejandro PRIETO GARDEY |
FEMPA |
969.01 |
44.5 % |
38.2 % |
Adrian LUCIO PANIAGUA |
FDMESCyL |
969.00 |
42.3 % |
40.2 % |
Daniel FERNANDEZ ALVES |
FMM |
968.80 |
42.9 % |
41.8 % |
Bruno GÓMEZ ALCOCER |
FMM |
967.47 |
35 % |
27.5 % |
Cai SALINAS SELLAS |
FEEC |
963.16 |
28.3 % |
21.6 % |
Aratz SANZOL LUMBRERAS |
FNDME |
961.17 |
28.1 % |
21.4 % |
Lucca BENIGNI LÓPEZ |
FEGAMON |
956.19 |
27.5 % |
20.9 % |
Hugo GLORIES ROIG |
FEMECV |
955.21 |
40.3 % |
38.3 % |
Tiago CARBALLO VARELA |
FEGAMON |
954.83 |
29 % |
20.5 % |
Alejandro SEGADO DIAZ |
FMM |
950.58 |
32.8 % |
25.6 % |
Lucas CAMACHO TORRES |
FEEC |
949.00 |
39.5 % |
37.4 % |
Hugo CALVO RUIZ |
FDMESCyL |
948.52 |
26.6 % |
20.2 % |
Albert GARCIA BERNABEU |
FEMECV |
947.47 |
26.5 % |
20.1 % |
Pau GARCÍA PÉREZ |
FEMECV |
945.50 |
26.3 % |
19.9 % |
Daniel ARMAS TERRADILLO |
FEMPA |
943.99 |
26.1 % |
19.8 % |
Aimar DELARIBERETTE AZNAR |
FADMES |
942.28 |
49.1 % |
25 % |
Alejandro ROMERO MORALES |
FADMES |
935.46 |
48.1 % |
24.3 % |
Gabriel MARTÍNEZ SANCHÉZ |
FDMCLM |
934.55 |
25.1 % |
18.9 % |
Guillermo LARES-FRANCO DIAZ-MIGUEL |
FBME |
933.71 |
25 % |
18.8 % |
Álvaro ÁVILA CORROCHANO |
FDMCLM |
926.44 |
24.2 % |
18.2 % |
Martín LANZA FERNÁNDEZ |
FEMPA |
923.59 |
23.9 % |
18 % |
Isaac REDONDO ARRANZ |
FMM |
923.22 |
23.9 % |
17.9 % |
David ROMERO LÁZARO |
FMM |
921.97 |
23.8 % |
17.8 % |
Fernando FRONTERA CHAMIZO |
FMM |
919.41 |
25 % |
17.4 % |
Efren GONZALEZ LAVANDERA |
FEMPA |
912.93 |
36.7 % |
30.9 % |
Favila MENENDEZ COTGROVE |
FEMPA |
901.88 |
21.7 % |
16.2 % |
Javier GALÁN FERRER |
FDMCLM |
899.30 |
43 % |
20.7 % |
Manel NAVARRO LANAU |
FEEC |
876.67 |
19.4 % |
14.3 % |
## Up-coming SEASON
###* Capturando los futuros Sub16
###* Los sub16 “salen”
LS0tDQp0aXRsZTogIkVsb19TcG9ydC5DbGltYmluZ19FU1BfMi4wIChTdWIxNk0pIg0KYXV0aG9yOiAiRmVkZXJpY28gSi4gVmlsbGF0b3JvIg0KZGF0ZTogImByIFN5cy5EYXRlKClgIg0Kb3V0cHV0Og0KICBodG1sX25vdGVib29rOg0KICAgIHRvYzogdHJ1ZQ0KICAgIHRvY19kZXB0aDogNA0KICAgIHRvY19mbG9hdDogdHJ1ZQ0KLS0tDQoNCiMjIyMjIEZ1ZW50ZTogW2h0dHBzOi8vZmVkbWUucmVzdWx0cy5pbmZvXShodHRwczovL2ZlZG1lLnJlc3VsdHMuaW5mby8pDQoNCmBgYHtyIHNldHVwLCBpbmNsdWRlPVRSVUV9DQpsaWJyYXJ5KGtuaXRyKQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KA0KICBlY2hvID0gRkFMU0UsDQoJbWVzc2FnZSA9IEZBTFNFLA0KICB3YXJuaW5nID0gRkFMU0UsDQoJaW5jbHVkZSA9IEZBTFNFDQopDQpgYGAgIA0KDQpgYGB7ciBwYWNrYWdlcywgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCmlmKCFyZXF1aXJlKHRpZHl2ZXJzZSkpe2luc3RhbGwucGFja2FnZXMoInRpZHl2ZXJzZSIscmVwb3MgPSAiaHR0cDovL2NyYW4udXMuci1wcm9qZWN0Lm9yZyIpfQ0KaWYoIXJlcXVpcmUoZ29vZ2xlc2hlZXRzNCkpe2luc3RhbGwucGFja2FnZXMoImdvb2dsZXNoZWV0czQiKX0NCmlmKCFyZXF1aXJlKGdvb2dsZWRyaXZlKSl7aW5zdGFsbC5wYWNrYWdlcygiZ29vZ2xlZHJpdmUiKX0NCmlmKCFyZXF1aXJlKGRwbHlyKSl7aW5zdGFsbC5wYWNrYWdlcygiZHBseXIiKX0NCmlmKCFyZXF1aXJlKGh0dHIyKSl7aW5zdGFsbC5wYWNrYWdlcygiaHR0cjIiKX0NCmlmKCFyZXF1aXJlKGpzb25saXRlKSl7aW5zdGFsbC5wYWNrYWdlcygianNvbmxpdGUiKX0NCmlmKCFyZXF1aXJlKFJzZWxlbml1bSkpe2luc3RhbGwucGFja2FnZXMoIlJzZWxlbml1bSIpfQ0KaWYoIXJlcXVpcmUoY2hyb21vdGUpKXtpbnN0YWxsLnBhY2thZ2VzKCJjaHJvbW90ZSIpfQ0KaWYoIXJlcXVpcmUocHVycnIpKXtpbnN0YWxsLnBhY2thZ2VzKCJwdXJyciIpfQ0KaWYoIXJlcXVpcmUod2RtYW4pKXtpbnN0YWxsLnBhY2thZ2VzKCJ3ZG1hbiIpfQ0KaWYoIXJlcXVpcmUoRFQpKXtpbnN0YWxsLnBhY2thZ2VzKCJEVCIpfQ0KaWYoIXJlcXVpcmUocGxvdGx5KSl7aW5zdGFsbC5wYWNrYWdlcygicGxvdGx5Iil9DQojIw0KbGlicmFyeShwbG90bHkpDQpsaWJyYXJ5KERUKQ0KbGlicmFyeShjaHJvbW90ZSkNCmxpYnJhcnkocHVycnIpDQpsaWJyYXJ5KHdkbWFuKQ0KDQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkocnZlc3QpDQpsaWJyYXJ5KGRwbHlyKQ0KbGlicmFyeShqc29ubGl0ZSkNCmxpYnJhcnkoUlNlbGVuaXVtKQ0KDQpsaWJyYXJ5KGdvb2dsZXNoZWV0czQpDQpsaWJyYXJ5KGdvb2dsZWRyaXZlKQ0KDQpgYGAgIA0KDQoNCiMjIyMjIFJlYWRpbmcgRGF0YQ0KDQpgYGB7ciBldmFsPVRSVUUsIGluY2x1ZGU9VFJVRX0NCg0Kb3B0aW9ucyhnYXJnbGVfb2F1dGhfZW1haWwgPSAidmlsbGF0b3JvcGF6ZmpAZGF0YWFuYWx5c2lzbGFiLmNvbSIpDQoNCnNzIDwtICJodHRwczovL2RvY3MuZ29vZ2xlLmNvbS9zcHJlYWRzaGVldHMvZC8xa1hZVUg5X1FXTkJiZEloVmtncnRoWEFnMlNVQzVwNi1yQjY1MUhseUc2ay9lZGl0P3VzcD1zaGFyaW5nIg0KaG9qYSA9IDINCnJhbmdvID0gIkExOk01NDM1Ig0KcmFua3MgPC0gcmVhZF9zaGVldChzcywNCiAgICAgICAgICAgICAgICBzaGVldD1ob2phLA0KICAgICAgICAgICAgICAgIHJhbmdlPSByYW5nbywgDQogICAgICAgICAgICAgICAgICAgY29sX25hbWVzID0gVFJVRSkNCg0KcmFua3MgPC0gIHJhbmtzICU+JQ0KICBtdXRhdGVfaWYoaXMuY2hhcmFjdGVyLCBhcy5mYWN0b3IpDQoNCmBgYCAgDQoNCiMjIEJMT0MgMjAyMi0yMDI0DQpgYGB7ciBpbmNsdWRlPUZBTFNFLCByb3dzLnByaW50PSA4fQ0KYmxvYy5TdWIxNk0gPC0gcmFua3MgJT4lDQogIGZpbHRlcihzdGFnZT09IkNsYXNpZmljIiwNCiAgICAgICAgIENhdGVnb3J5PT0iU3ViMTZfTSIsDQogICAgICAgICB5ZWFyPT0iMjAyMiJ8eWVhcj09IjIwMjMifHllYXI9PSIyMDI0Ig0KICAgICMgICAgIE5hbWU9PSBub21icmUNCiAgICAgICAgICkgJT4lDQogIGdyb3VwX2J5KGNvbXBldGl0b3I9IE5hbWUsDQogICAgICAgICAgIFllYXI9IHllYXIsDQogICAgICAgICAgIENvbXBlPSBDb21wZV8sDQogICAgICAgICAgIFRlYW0gPSBUZWFtLA0KICAgICAgICAgICBEYXRlPSBEYXRlKSAlPiUNCiAgcmVmcmFtZShyYW5rPSBSYW5rKSAlPiUNCiAgcmVzaGFwZTI6OmRjYXN0KGZvcm11bGEgPSBjb21wZXRpdG9yICsgVGVhbSB+IENvbXBlLCANCiAgICAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSkNCg0KYmxvYy5TdWIxNk0gPC0gYXNfdGliYmxlKGJsb2MuU3ViMTZNKQ0KIyMNCmJsb2MuU3ViMTZNW29yZGVyKGJsb2MuU3ViMTZNJGEuYmxvYy5maXJzdC4yMiksYygxLDIsMyldIA0KDQpjb21wZXRpdG9ycy5hIDwtIG5yb3coYmxvYy5TdWIxNk1bIWlzLm5hKGJsb2MuU3ViMTZNJGEuYmxvYy5maXJzdC4yMiksXSkNCmNvbXBldGl0b3JzLmIgPC0gbnJvdyhibG9jLlN1YjE2TVshaXMubmEoYmxvYy5TdWIxNk0kYi5ibG9jLnNlYy4yMiksXSkNCmNvbXBldGl0b3JzLmMgPC0gbnJvdyhibG9jLlN1YjE2TVshaXMubmEoYmxvYy5TdWIxNk0kYy5ibG9jLnRocmQuMjIpLF0pDQpjb21wZXRpdG9ycy5kIDwtIG5yb3coYmxvYy5TdWIxNk1bIWlzLm5hKGJsb2MuU3ViMTZNJGQuYmxvYy5maXJzdC4yMyksXSkNCmNvbXBldGl0b3JzLmUgPC0gbnJvdyhibG9jLlN1YjE2TVshaXMubmEoYmxvYy5TdWIxNk0kZS5ibG9jLnNlYy4yMyksXSkNCmNvbXBldGl0b3JzLmYgPC0gbnJvdyhibG9jLlN1YjE2TVshaXMubmEoYmxvYy5TdWIxNk0kZi5ibG9jLnRocmQuMjMpLF0pDQpjb21wZXRpdG9ycy5nIDwtIG5yb3coYmxvYy5TdWIxNk1bIWlzLm5hKGJsb2MuU3ViMTZNJGcuYmxvYy5jYW1wLjIzKSxdKQ0KY29tcGV0aXRvcnMuaCA8LSBucm93KGJsb2MuU3ViMTZNWyFpcy5uYShibG9jLlN1YjE2TSRoLmJsb2MuZmlyc3QuMjQpLF0pDQpjb21wZXRpdG9ycy5pIDwtIG5yb3coYmxvYy5TdWIxNk1bIWlzLm5hKGJsb2MuU3ViMTZNJGkuYmxvYy5zZWMuMjQpLF0pDQpjb21wZXRpdG9ycy5qIDwtIG5yb3coYmxvYy5TdWIxNk1bIWlzLm5hKGJsb2MuU3ViMTZNJGouYmxvYy50aHJkLjI0KSxdKQ0KYGBgICANCg0KDQojIyMgMjAyMiBGaXJzdA0KYGBge3IgZXZhbD1UUlVFLCBpbmNsdWRlPVRSVUV9DQpibG9jLlN1YjE2TVtvcmRlcihibG9jLlN1YjE2TSRhLmJsb2MuZmlyc3QuMjIpLGMoMSwyLDMpXSAlPiUgZmlsdGVyKGEuYmxvYy5maXJzdC4yMiE9Ik5BIikNCmBgYA0KDQojIyMgRWxvIEZpcnN0IDIwMjIgDQoqLUNvbXBldGl0b3JzID0gYHIgY29tcGV0aXRvcnMuZmAtKg0KDQpgYGB7ciBldmFsPVRSVUUsaW5jbHVkZT1UUlVFfQ0KbGFzdC5jb21wIDwtIGJsb2MuU3ViMTZNWyxjKDEsMiwzKV0gJT4lIGZpbHRlcihibG9jLlN1YjE2TSRhLmJsb2MuZmlyc3QuMjIhPSJOQSIpIA0KIw0KI2xhc3RfY29tcF9kZWJ1dCA8LSBsYXN0LmNvbXAgJT4lIGFudGlfam9pbihlbG8ubGFzdC5hY2N1bSwgYnk9ImNvbXBldGl0b3IiKQ0KYGBgICANCg0KDQpgYGB7ciBldmFsPSBUUlVFLGluY2x1ZGU9RkFMU0UsIGNvbHMucHJpbnQ9IDd9DQojIyMjIyBFTE8gIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyMjICMjIEVMTyAoTkFTQ0FSKSAjIyMjIyMjIyMjIyMjDQpuLmRlYnV0ID0gMA0KIyMjDQpsYXN0LmNvbXAuY2FsYyA8LSBsYXN0LmNvbXAgDQojJT4lIHJpZ2h0X2pvaW4oZWxvLmxhc3QuYWNjdW0sIGJ5PSJjb21wZXRpdG9yIikNCiMjIw0KTiA8LSBsZW5ndGgobGFzdC5jb21wLmNhbGMkY29tcGV0aXRvclshaXMubmEobGFzdC5jb21wLmNhbGNbLDNdKV0pDQpSIDwtIHJlcCgxMDAwLCBOKQ0KI1IgPC0gbGFzdC5jb21wLmNhbGMkUi5uZXdbIWlzLm5hKGxhc3QuY29tcC5jYWxjWywzXSldDQpuYW1lcyA8LSBsYXN0LmNvbXAuY2FsY1shaXMubmEobGFzdC5jb21wLmNhbGNbLDNdKSwxXQ0KVGVhbSA8LSBsYXN0LmNvbXAuY2FsYyRUZWFtWyFpcy5uYShsYXN0LmNvbXAuY2FsY1ssM10pXQ0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQpyZXN1bHRzIDwtIGxhc3QuY29tcC5jYWxjWyFpcy5uYShsYXN0LmNvbXAuY2FsY1ssM10pLDNdDQpyZXN1bHRzIDwtICh1bmxpc3QocmVzdWx0cykpDQpzdGRldiA8LSBzZChjKDE6KE4rbi5kZWJ1dCkpKQ0KIw0KYXZnLnBsYXllciA8LSBtZWRpYW4oYyhSKSkNCm1lZGlhbmEgPC0gbWVkaWFuKHVubGlzdChsYXN0LmNvbXBbIWlzLm5hKGxhc3QuY29tcFssM10pLDNdKSkNCm1heC5zdGQgPC0gKG1lZGlhbmEtMSkvc3RkZXYNCiMjIyMjIyMjIyMjIyMjIyMjIw0KUyA8LSAoKG1lZGlhbmEgLSB1bmxpc3QobGFzdC5jb21wLmNhbGNbIWlzLm5hKGxhc3QuY29tcC5jYWxjWywzXSksM10pICkgLyBzdGRldikgLyBtYXguc3RkDQpEID0gNDAwDQprID0gMzINCkUgPC0gMS8oMSsoMTBeKCAoYXZnLnBsYXllci1SKS9EICkpKQ0KUi5uZXcgPC0gUiArIChrICogKFMgLSAoKDIqRSkvTikgKSApDQojDQptYXguY3V0LmZpbmFscyA8LSAoc3RkZXYtOSkvc3RkZXYNClByb2IuRmluYWxzIDwtIDEvKDErKDEwXiggKCBzb3J0KFIubmV3LCBkZWNyZWFzaW5nID0gVFJVRSlbOV0gLVIubmV3KS9EICkpKQ0KbWF4LmN1dC5wb2RpdW0gPC0gKHN0ZGV2LTQpL3N0ZGV2DQpQcm9iLnBvZGl1bSA8LSAxLygxKygxMF4oICggc29ydChSLm5ldywgZGVjcmVhc2luZyA9IFRSVUUpWzRdIC1SLm5ldykvRCApKSkNCiMjIw0KZWxvLmxhc3QuY29tcC5uZXcgPC0gY2JpbmQobmFtZXMgPSBuYW1lcywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlYW09IFRlYW0sDQogICAgICAgICAgICAgICAgICAgICAgICAgICBSID0gUiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMgPSByZXN1bHRzLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgUyA9IFMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBSLm5ldz0gcm91bmQoUi5uZXcsMiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9iLkZpbmFscz0gcGFzdGUocm91bmQoUHJvYi5GaW5hbHMqMTAwLCAxKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJSIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvYi5wb2RpdW0gPSBwYXN0ZShyb3VuZChQcm9iLnBvZGl1bSoxMDAsMSksICIlIiApIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgKQ0KZWxvLmxhc3QuY29tcC5uZXcgPC0gYXNfdGliYmxlKGVsby5sYXN0LmNvbXAubmV3KQ0KIyMjIyMjIyMjIyMNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyMjICMjIEVMTyAoTkFTQ0FSKSAjIyMjIyMjIyMjIyMjDQojbiA9IGxlbmd0aChsYXN0X2NvbXBfZGVidXQkY29tcGV0aXRvcikNCiNOIDwtIGxlbmd0aCh1bmxpc3QobGFzdC5jb21wWyFpcy5uYShsYXN0LmNvbXBbLDNdKSwzXSkpDQojUi5kZWJ1dCA8LSByZXAoMTAwMCwgbikNCiNuYW1lcyA8LSBsYXN0X2NvbXBfZGVidXRbLDFdDQojVGVhbSA8LSBsYXN0X2NvbXBfZGVidXQkVGVhbQ0KIyMNCiNTIDwtICgobWVkaWFuYSAtIGxhc3RfY29tcF9kZWJ1dFssM10pIC8gc3RkZXYpIC8gbWF4LnN0ZA0KI0UgPC0gMS8oMSsoMTBeKCAoYXZnLnBsYXllci1SLmRlYnV0KS9EICkpKQ0KI1IubmV3IDwtIFIuZGVidXQgKyAoayAqIChTIC0gKCgyKkUpL04pICkgKQ0KIw0KI21heC5jdXQuZmluYWxzIDwtIChzdGRldi05KS9zdGRldg0KI1Byb2IuRmluYWxzIDwtIDEvKDErKDEwXiggKCBzb3J0KGVsby5sYXN0LmNvbXAubmV3JFIubmV3LCBkZWNyZWFzaW5nID0gVFJVRSlbOV0gLSBSLm5ld1ssMV0pL0QgKSkpDQojbWF4LmN1dC5wb2RpdW0gPC0gKHN0ZGV2LTQpL3N0ZGV2DQojUHJvYi5wb2RpdW0gPC0gMS8oMSsoMTBeKCAoIHNvcnQoZWxvLmxhc3QuY29tcC5uZXckUi5uZXcsIGRlY3JlYXNpbmcgPSBUUlVFKVs0XSAtUi5uZXdbLDFdKS9EICkpKQ0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiNlbG8ubGFzdC5jb21wLm5ldy5kZWJ1dCA8LSBhc190aWJibGUoY2JpbmQobmFtZXMgPSBuYW1lcywNCiAjICAgICAgICAgICAgICAgICAgICAgICAgICBUZWFtPSBUZWFtLA0KICAjICAgICAgICAgICAgICAgICAgICAgICAgIFIgPSBSLmRlYnV0LA0KICAgIyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMgPSB1bmxpc3QobGFzdF9jb21wX2RlYnV0WywzXSksDQogICAgIyAgICAgICAgICAgICAgICAgICAgICAgUyA9IFNbLDFdLA0KICAgICAjICAgICAgICAgICAgICAgICAgICAgIFIubmV3PSByb3VuZChSLm5ld1ssMV0sMiksDQogICAgICAjICAgICAgICAgICAgICAgICAgICAgUHJvYi5GaW5hbHM9IHBhc3RlKHJvdW5kKFByb2IuRmluYWxzKjEwMCwxKSwiJSIpLA0KICAgICAgICMgICAgICAgICAgICAgICAgICAgIFByb2IucG9kaXVtID0gcGFzdGUocm91bmQoUHJvYi5wb2RpdW0qMTAwLCAxKSwNCiAgICAgICAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlIikgDQogICAgICAgICAjICAgICAgICAgICAgICAgICAgKSkNCg0KDQojZWxvLmxhc3QuY29tcC5uZXcgPC0gZWxvLmxhc3QuY29tcC5uZXcgJT4lIHJiaW5kKGVsby5sYXN0LmNvbXAubmV3LmRlYnV0KQ0KDQoNCiMjIyMjICMjIyMjIyMjIyMNCmtuaXRyOjprYWJsZShlbG8ubGFzdC5jb21wLm5ld1tvcmRlcihlbG8ubGFzdC5jb21wLm5ldyRyZXN1bHRzKSxjKDEsMiwzLDQsNiw3LDgpXSkNCg0KYGBgICANCg0KIyMjIyMjX0VsbyBIaXN0b3J5IF8gKmNoZWNrIGNvZGUgQ2h1bmsgaWYgcnVubmluZyBTdWIxNiBhbG9uZSoNCmBgYHtyfQ0KIyMgDQoNCmNvbXBlPSAiMjAyMi4xIg0KZWxvLmhpc3RvcnkubGFzdCA8LSBlbG8ubGFzdC5jb21wLm5ldyAlPiUgDQogIG11dGF0ZShjb21wID0gcmVwKGNvbXBlLCBsZW5ndGgoZWxvLmxhc3QuY29tcC5uZXckY29tcGV0aXRvcikpLA0KICAgICAgICAgY2F0ZWcgPSByZXAoIlN1YjE2TSIsIGxlbmd0aChlbG8ubGFzdC5jb21wLm5ldyRjb21wZXRpdG9yKSkpDQoNCiMNCg0KI2Vsby5oaXN0b3J5IDwtIGVsby5oaXN0b3J5ICU+JSByYmluZChlbG8uaGlzdG9yeS5sYXN0KQ0KZWxvLmhpc3RvcnkgPC0gZWxvLmhpc3RvcnkubGFzdCANCg0KIyU+JSByYmluZChlbG8uaGlzdG9yeS5sYXN0KQ0KDQojIHRpbWUtc2VyaWVzIGRhdGEuZnJhbWUNCiMjIHN1YjE2TQ0KZWxvLmhpc3RvcnkudF9zZXJpZXMuUzE2TSA8LSANCiAgYXNfdGliYmxlKGVsby5oaXN0b3J5ICU+JQ0KICAgICAgICAgICAgICBmaWx0ZXIoY2F0ZWc9PSJTdWIxNk0iKSAlPiUNCiAgICAgICAgICAgICAgcmVzaGFwZTI6OmRjYXN0KGZvcm11bGEgPSBjb21wZXRpdG9yfmNvbXAsIHZhbHVlLnZhciA9ICJSLm5ldyIpKSANCiMjIA0KDQpgYGAgIA0KDQojIyMgRWxvIGluIHRpbWUNCmBgYHtyIGluY2x1ZGU9VFJVRX0NCnAgPC0gZWxvLmhpc3RvcnkgJT4lIA0KICBmaWx0ZXIoY2F0ZWc9PSJTdWIxNk0iLCBSLm5ldz49MCkgJT4lDQogIGdncGxvdChhZXMoeD0gY29tcCwgeT0gUi5uZXcsIGdyb3VwID0gY29tcGV0aXRvciwgY29sID0gVGVhbSkpICsgDQogIGdlb21fcG9pbnQoKSArIA0KIyAgZ2VvbV9saW5lKGxpbmV0eXBlPSAiZGFzaGVkIikgKyANCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0PTEwMDAsbGluZXR5cGU9ICJkYXNoZWQiKQ0KDQojcA0KZ2dwbG90bHkocCkNCmBgYA0KDQoNCiMjIyAqKkVsbyBBY2N1bXVsYXRlZCBGaXJzdF8yMDIyKioNCmBgYHtyIGV2YWw9VFJVRSwgZWNobz1UUlVFfQ0KZWxvLmxhc3QuYWNjdW0gPC0gZWxvLmxhc3QuY29tcC5uZXcNCmVsby5sYXN0LmNvbXAubmV3IDwtIGVsby5sYXN0LmNvbXAubmV3DQpgYGANCg0KYGBge3IgZXZhbD1UUlVFLCBpbmNsdWRlPVRSVUUsIGNvbHMucHJpbnQ9N30NCg0KZWxvLmxhc3QuYWNjdW1fbGFzdC5jb21wX2Fic2VudCA8LSBlbG8ubGFzdC5hY2N1bSAlPiUgYW50aV9qb2luKGVsby5sYXN0LmNvbXAubmV3LGJ5PSJjb21wZXRpdG9yIikNCg0KZWxvLmxhc3QuYWNjdW0gPC0gZWxvLmxhc3QuY29tcC5uZXcgJT4lIHJiaW5kKGVsby5sYXN0LmFjY3VtX2xhc3QuY29tcF9hYnNlbnQpDQplbG8ubGFzdC5hY2N1bSA8LSBlbG8ubGFzdC5hY2N1bVtvcmRlcihlbG8ubGFzdC5hY2N1bSRjb21wZXRpdG9yKSxdDQojDQprbml0cjo6a2FibGUoZWxvLmxhc3QuYWNjdW1bb3JkZXIoZWxvLmxhc3QuYWNjdW0kUi5uZXcsIGRlY3JlYXNpbmcgPSBUUlVFKSxjKDEsMiw2LDcsOCldKQ0KYGBgICANCg0KIyMjIDIwMjIgU2Vjb25kICANCg0KYGBge3IgaW5jbHVkZT1UUlVFfQ0KYmxvYy5TdWIxNk1bb3JkZXIoYmxvYy5TdWIxNk0kYi5ibG9jLnNlYy4yMiksIGMoMSwyLDMsNCldICU+JSBwcmludChuPTY1KQ0KYGBgICANCg0KIyMjIEVsbyBTZWNvbmQgMjAyMiANCiotQ29tcGV0aXRvcnMgPSBgciBjb21wZXRpdG9ycy5iYC0qDQoNCmBgYHtyIGV2YWw9VFJVRSxpbmNsdWRlPVRSVUV9DQpsYXN0LmNvbXAgPC0gYmxvYy5TdWIxNk1bLGMoMSwyLDQpXSAlPiUgZmlsdGVyKGJsb2MuU3ViMTZNJGIuYmxvYy5zZWMuMjIhPSJOQSIpIA0KIw0KbGFzdF9jb21wX2RlYnV0IDwtIGxhc3QuY29tcCAlPiUgYW50aV9qb2luKGVsby5sYXN0LmFjY3VtLCBieT0iY29tcGV0aXRvciIpDQpgYGANCg0KDQoNCmBgYHtyIGV2YWw9IFRSVUUsaW5jbHVkZT1GQUxTRSwgY29scy5wcmludD0gN30NCiMjIyMjRUxPICMjIyMjIyMjIyMjIyMjIyMjDQojIyMgIyMgRUxPIChOQVNDQVIpICMjIyMjIyMjIyMjIyMNCm4uZGVidXQgPSBsZW5ndGgobGFzdF9jb21wX2RlYnV0JGNvbXBldGl0b3IpDQojIyMNCmxhc3QuY29tcC5jYWxjIDwtIGxhc3QuY29tcCAlPiUgcmlnaHRfam9pbihlbG8ubGFzdC5hY2N1bSwgYnk9ImNvbXBldGl0b3IiKQ0KIyMjDQpOIDwtIGxlbmd0aChsYXN0LmNvbXAuY2FsYyRjb21wZXRpdG9yWyFpcy5uYShsYXN0LmNvbXAuY2FsY1ssM10pXSkNClIgPC0gbGFzdC5jb21wLmNhbGMkUi5uZXdbIWlzLm5hKGxhc3QuY29tcC5jYWxjWywzXSldDQpuYW1lcyA8LSBsYXN0LmNvbXAuY2FsY1shaXMubmEobGFzdC5jb21wLmNhbGNbLDNdKSwxXQ0KVGVhbSA8LSBsYXN0LmNvbXAuY2FsYyRUZWFtLnhbIWlzLm5hKGxhc3QuY29tcC5jYWxjWywzXSldDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMNCnJlc3VsdHMgPC0gbGFzdC5jb21wLmNhbGNbIWlzLm5hKGxhc3QuY29tcC5jYWxjWywzXSksM10NCnJlc3VsdHMgPC0gKHVubGlzdChyZXN1bHRzKSkNCnN0ZGV2IDwtIHNkKGMoMTooTituLmRlYnV0KSkpDQojDQphdmcucGxheWVyIDwtIG1lZGlhbihjKFIsIHJlcCgxMDAwLCBuLmRlYnV0ICkpKQ0KbWVkaWFuYSA8LSBtZWRpYW4odW5saXN0KGxhc3QuY29tcFshaXMubmEobGFzdC5jb21wWywzXSksM10pKQ0KbWF4LnN0ZCA8LSAobWVkaWFuYS0xKS9zdGRldg0KIyMjIyMjIyMjIyMjIyMjIyMjDQpTIDwtICgobWVkaWFuYSAtIHVubGlzdChsYXN0LmNvbXAuY2FsY1shaXMubmEobGFzdC5jb21wLmNhbGNbLDNdKSwzXSkgKSAvIHN0ZGV2KSAvIG1heC5zdGQNCkQgPSA0MDANCmsgPSAzMg0KRSA8LSAxLygxKygxMF4oIChhdmcucGxheWVyLVIpL0QgKSkpDQpSLm5ldyA8LSBSICsgKGsgKiAoUyAtICgoMipFKS9OKSApICkNCiMNCm1heC5jdXQuZmluYWxzIDwtIChzdGRldi05KS9zdGRldg0KUHJvYi5GaW5hbHMgPC0gMS8oMSsoMTBeKCAoIHNvcnQoUi5uZXcsIGRlY3JlYXNpbmcgPSBUUlVFKVs5XSAtUi5uZXcpL0QgKSkpDQptYXguY3V0LnBvZGl1bSA8LSAoc3RkZXYtNCkvc3RkZXYNClByb2IucG9kaXVtIDwtIDEvKDErKDEwXiggKCBzb3J0KFIubmV3LCBkZWNyZWFzaW5nID0gVFJVRSlbNF0gLVIubmV3KS9EICkpKQ0KIyMjDQplbG8ubGFzdC5jb21wLm5ldyA8LSBjYmluZChuYW1lcyA9IG5hbWVzLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVhbT0gVGVhbSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFIgPSBSLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cyA9IHJlc3VsdHMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBTID0gUywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFIubmV3PSByb3VuZChSLm5ldywyKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2IuRmluYWxzPSBwYXN0ZShyb3VuZChQcm9iLkZpbmFscyoxMDAsIDEpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlIiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9iLnBvZGl1bSA9IHBhc3RlKHJvdW5kKFByb2IucG9kaXVtKjEwMCwxKSwgIiUiICkgDQogICAgICAgICAgICAgICAgICAgICAgICAgICApDQplbG8ubGFzdC5jb21wLm5ldyA8LSBhc190aWJibGUoZWxvLmxhc3QuY29tcC5uZXcpDQojIyMjIyMjIyMjIw0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIyMgIyMgRUxPIChOQVNDQVIpICMjIyMjIyMjIyMjIyMNCm4gPSBsZW5ndGgobGFzdF9jb21wX2RlYnV0JGNvbXBldGl0b3IpDQpOIDwtIGxlbmd0aCh1bmxpc3QobGFzdC5jb21wWyFpcy5uYShsYXN0LmNvbXBbLDNdKSwzXSkpDQpSLmRlYnV0IDwtIHJlcCgxMDAwLCBuKQ0KbmFtZXMgPC0gbGFzdF9jb21wX2RlYnV0WywxXQ0KVGVhbSA8LSBsYXN0X2NvbXBfZGVidXQkVGVhbQ0KI2NhdGVnIDwtIGJsb2MuU3ViMTRNLmFfYg0KUyA8LSAoKG1lZGlhbmEgLSBsYXN0X2NvbXBfZGVidXRbLDNdKSAvIHN0ZGV2KSAvIG1heC5zdGQNCkUgPC0gMS8oMSsoMTBeKCAoYXZnLnBsYXllci1SLmRlYnV0KS9EICkpKQ0KUi5uZXcgPC0gUi5kZWJ1dCArIChrICogKFMgLSAoKDIqRSkvTikgKSApDQojDQptYXguY3V0LmZpbmFscyA8LSAoc3RkZXYtOSkvc3RkZXYNClByb2IuRmluYWxzIDwtIDEvKDErKDEwXiggKCBzb3J0KGVsby5sYXN0LmNvbXAubmV3JFIubmV3LCBkZWNyZWFzaW5nID0gVFJVRSlbOV0gLSBSLm5ld1ssMV0pL0QgKSkpDQptYXguY3V0LnBvZGl1bSA8LSAoc3RkZXYtNCkvc3RkZXYNClByb2IucG9kaXVtIDwtIDEvKDErKDEwXiggKCBzb3J0KGVsby5sYXN0LmNvbXAubmV3JFIubmV3LCBkZWNyZWFzaW5nID0gVFJVRSlbNF0gLVIubmV3WywxXSkvRCApKSkNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQplbG8ubGFzdC5jb21wLm5ldy5kZWJ1dCA8LSBhc190aWJibGUoY2JpbmQobmFtZXMgPSBuYW1lcywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlYW09IFRlYW0sDQogICAgICAgICAgICAgICAgICAgICAgICAgICBSID0gUi5kZWJ1dCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMgPSB1bmxpc3QobGFzdF9jb21wX2RlYnV0WywzXSksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBTID0gU1ssMV0sDQogICAgICAgICAgICAgICAgICAgICAgICAgICBSLm5ldz0gcm91bmQoUi5uZXdbLDFdLDIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvYi5GaW5hbHM9IHBhc3RlKHJvdW5kKFByb2IuRmluYWxzKjEwMCwxKSwiJSIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvYi5wb2RpdW0gPSBwYXN0ZShyb3VuZChQcm9iLnBvZGl1bSoxMDAsIDEpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJSIpIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgKSkNCg0KDQplbG8ubGFzdC5jb21wLm5ldyA8LSBlbG8ubGFzdC5jb21wLm5ldyAlPiUgcmJpbmQoZWxvLmxhc3QuY29tcC5uZXcuZGVidXQpDQoNCg0KIyMjIyMgIyMjIyMjIyMjIw0Ka25pdHI6OmthYmxlKGVsby5sYXN0LmNvbXAubmV3W29yZGVyKGVsby5sYXN0LmNvbXAubmV3JHJlc3VsdHMpLGMoMSwyLDMsNCw2LDcsOCldKQ0KDQpgYGAgIA0KDQojIyMjI18gRWxvIEhpc3RvcnkgXw0KYGBge3J9DQojIyANCmNvbXBlPSAiMjAyMi4yIg0KZWxvLmhpc3RvcnkubGFzdCA8LSBlbG8ubGFzdC5jb21wLm5ldyAlPiUgDQogIG11dGF0ZShjb21wID0gcmVwKGNvbXBlLCBsZW5ndGgoZWxvLmxhc3QuY29tcC5uZXckY29tcGV0aXRvcikpLA0KICAgICAgICAgY2F0ZWcgPSByZXAoIlN1YjE2TSIsIGxlbmd0aChlbG8ubGFzdC5jb21wLm5ldyRjb21wZXRpdG9yKSkpDQoNCiMNCmVsby5oaXN0b3J5IDwtIGVsby5oaXN0b3J5ICU+JSByYmluZChlbG8uaGlzdG9yeS5sYXN0KQ0KDQojIHRpbWUtc2VyaWVzIGRhdGEuZnJhbWUNCiMjIHN1YjE2TQ0KZWxvLmhpc3RvcnkudF9zZXJpZXMuUzE2TSA8LSANCiAgYXNfdGliYmxlKGVsby5oaXN0b3J5ICU+JQ0KICAgICAgICAgICAgICBmaWx0ZXIoY2F0ZWc9PSJTdWIxNk0iKSAlPiUNCiAgICAgICAgICAgICAgcmVzaGFwZTI6OmRjYXN0KGZvcm11bGEgPSBjb21wZXRpdG9yfmNvbXAsIHZhbHVlLnZhciA9ICJSLm5ldyIpKSANCiMjIA0KDQpgYGAgIA0KDQojIyMgRWxvIGluIHRpbWUNCmBgYHtyIGluY2x1ZGU9VFJVRX0NCnAgPC0gZWxvLmhpc3RvcnkgJT4lIA0KICBmaWx0ZXIoY2F0ZWc9PSJTdWIxNk0iLCBSLm5ldz49MCkgJT4lDQogIGdncGxvdChhZXMoeD0gY29tcCwgeT0gUi5uZXcsIGdyb3VwID0gY29tcGV0aXRvciwgY29sID0gVGVhbSkpICsgDQogIGdlb21fcG9pbnQoKSArIA0KICBnZW9tX2xpbmUobGluZXR5cGU9ICJkYXNoZWQiKSArIA0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQ9MTAwMCxsaW5ldHlwZT0gImRhc2hlZCIpDQoNCiNwDQpnZ3Bsb3RseShwKQ0KYGBgICANCg0KDQojIyMgKipFbG8gQWNjdW11bGF0ZWQgU2Vjb25kXzIwMjMqKg0KYGBge3IgZXZhbD1GQUxTRSwgaW5jbHVkZT1UUlVFfQ0KZWxvLmxhc3QuYWNjdW0NCmVsby5sYXN0LmNvbXAubmV3DQpgYGANCg0KYGBge3IgZXZhbD1UUlVFLCBpbmNsdWRlPVRSVUUsIGNvbHMucHJpbnQ9N30NCg0KZWxvLmxhc3QuYWNjdW1fbGFzdC5jb21wX2Fic2VudCA8LSBlbG8ubGFzdC5hY2N1bSAlPiUgYW50aV9qb2luKGVsby5sYXN0LmNvbXAubmV3LGJ5PSJjb21wZXRpdG9yIikNCg0KZWxvLmxhc3QuYWNjdW0gPC0gZWxvLmxhc3QuY29tcC5uZXcgJT4lIHJiaW5kKGVsby5sYXN0LmFjY3VtX2xhc3QuY29tcF9hYnNlbnQpDQplbG8ubGFzdC5hY2N1bSA8LSBlbG8ubGFzdC5hY2N1bVtvcmRlcihlbG8ubGFzdC5hY2N1bSRjb21wZXRpdG9yKSxdDQojDQprbml0cjo6a2FibGUoZWxvLmxhc3QuYWNjdW1bb3JkZXIoZWxvLmxhc3QuYWNjdW0kUi5uZXcsIGRlY3JlYXNpbmcgPSBUUlVFKSxjKDEsMiw2LDcsOCldKQ0KYGBgICANCg0KDQoNCiMjIyAyMDIyIFRoaXJkDQoNCmBgYHtyIGluY2x1ZGU9VFJVRX0NCmJsb2MuU3ViMTZNW29yZGVyKGJsb2MuU3ViMTZNJGMuYmxvYy50aHJkLjIyKSwgYygxLDIsMyw0LDUpXSAlPiUgcHJpbnQobj02NSkNCmBgYCAgDQoNCiMjIyBFbG8gVGhpcmQgMjAyMiANCiotQ29tcGV0aXRvcnMgPSBgciBjb21wZXRpdG9ycy5lYC0qDQoNCmBgYHtyIGV2YWw9VFJVRSxpbmNsdWRlPUZBTFNFfQ0KbGFzdC5jb21wIDwtIGJsb2MuU3ViMTZNWyxjKDEsMiw1KV0gJT4lIGZpbHRlcihibG9jLlN1YjE2TSRjLmJsb2MudGhyZC4yMiE9Ik5BIikgDQojDQpsYXN0X2NvbXBfZGVidXQgPC0gbGFzdC5jb21wICU+JSBhbnRpX2pvaW4oZWxvLmxhc3QuYWNjdW0sIGJ5PSJjb21wZXRpdG9yIikNCmBgYA0KDQoNCg0KYGBge3IgZXZhbD0gVFJVRSxpbmNsdWRlPUZBTFNFLCBjb2xzLnByaW50PSA3fQ0KIyMjIEVMTyAjIyMjIyMjIyMjIyMjIyMjIw0KIyMjICMjIEVMTyAoTkFTQ0FSKSAjIyMjIyMjIyMjIyMjDQpuLmRlYnV0ID0gbGVuZ3RoKGxhc3RfY29tcF9kZWJ1dCRjb21wZXRpdG9yKQ0KIyMjDQpsYXN0LmNvbXAuY2FsYyA8LSBsYXN0LmNvbXAgJT4lIHJpZ2h0X2pvaW4oZWxvLmxhc3QuYWNjdW0sIGJ5PSJjb21wZXRpdG9yIikNCiMjIw0KTiA8LSBsZW5ndGgobGFzdC5jb21wLmNhbGMkY29tcGV0aXRvclshaXMubmEobGFzdC5jb21wLmNhbGNbLDNdKV0pDQpSIDwtIGxhc3QuY29tcC5jYWxjJFIubmV3WyFpcy5uYShsYXN0LmNvbXAuY2FsY1ssM10pXQ0KbmFtZXMgPC0gbGFzdC5jb21wLmNhbGNbIWlzLm5hKGxhc3QuY29tcC5jYWxjWywzXSksMV0NClRlYW0gPC0gbGFzdC5jb21wLmNhbGMkVGVhbS54WyFpcy5uYShsYXN0LmNvbXAuY2FsY1ssM10pXQ0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQpyZXN1bHRzIDwtIGxhc3QuY29tcC5jYWxjWyFpcy5uYShsYXN0LmNvbXAuY2FsY1ssM10pLDNdDQpyZXN1bHRzIDwtICh1bmxpc3QocmVzdWx0cykpDQpzdGRldiA8LSBzZChjKDE6KE4rbi5kZWJ1dCkpKQ0KIw0KYXZnLnBsYXllciA8LSBtZWRpYW4oYyhSLCByZXAoMTAwMCwgbi5kZWJ1dCApKSkNCm1lZGlhbmEgPC0gbWVkaWFuKHVubGlzdChsYXN0LmNvbXBbIWlzLm5hKGxhc3QuY29tcFssM10pLDNdKSkNCm1heC5zdGQgPC0gKG1lZGlhbmEtMSkvc3RkZXYNCiMjIyMjIyMjIyMjIyMjIyMjIw0KUyA8LSAoKG1lZGlhbmEgLSB1bmxpc3QobGFzdC5jb21wLmNhbGNbIWlzLm5hKGxhc3QuY29tcC5jYWxjWywzXSksM10pICkgLyBzdGRldikgLyBtYXguc3RkDQpEID0gNDAwDQprID0gMzINCkUgPC0gMS8oMSsoMTBeKCAoYXZnLnBsYXllci1SKS9EICkpKQ0KUi5uZXcgPC0gUiArIChrICogKFMgLSAoKDIqRSkvTikgKSApDQojDQptYXguY3V0LmZpbmFscyA8LSAoc3RkZXYtOSkvc3RkZXYNClByb2IuRmluYWxzIDwtIDEvKDErKDEwXiggKCBzb3J0KFIubmV3LCBkZWNyZWFzaW5nID0gVFJVRSlbOV0gLVIubmV3KS9EICkpKQ0KbWF4LmN1dC5wb2RpdW0gPC0gKHN0ZGV2LTQpL3N0ZGV2DQpQcm9iLnBvZGl1bSA8LSAxLygxKygxMF4oICggc29ydChSLm5ldywgZGVjcmVhc2luZyA9IFRSVUUpWzRdIC1SLm5ldykvRCApKSkNCiMjIw0KZWxvLmxhc3QuY29tcC5uZXcgPC0gY2JpbmQobmFtZXMgPSBuYW1lcywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlYW09IFRlYW0sDQogICAgICAgICAgICAgICAgICAgICAgICAgICBSID0gUiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMgPSByZXN1bHRzLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgUyA9IFMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBSLm5ldz0gcm91bmQoUi5uZXcsMiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9iLkZpbmFscz0gcGFzdGUocm91bmQoUHJvYi5GaW5hbHMqMTAwLCAxKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJSIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvYi5wb2RpdW0gPSBwYXN0ZShyb3VuZChQcm9iLnBvZGl1bSoxMDAsMSksICIlIiApIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgKQ0KZWxvLmxhc3QuY29tcC5uZXcgPC0gYXNfdGliYmxlKGVsby5sYXN0LmNvbXAubmV3KQ0KIyMjIyMjIyMjIyMNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyMjICMjIEVMTyAoTkFTQ0FSKSAjIyMjIyMjIyMjIyMjDQpuID0gbGVuZ3RoKGxhc3RfY29tcF9kZWJ1dCRjb21wZXRpdG9yKQ0KTiA8LSBsZW5ndGgodW5saXN0KGxhc3QuY29tcFshaXMubmEobGFzdC5jb21wWywzXSksM10pKQ0KUi5kZWJ1dCA8LSByZXAoMTAwMCwgbikNCm5hbWVzIDwtIGxhc3RfY29tcF9kZWJ1dFssMV0NClRlYW0gPC0gbGFzdF9jb21wX2RlYnV0JFRlYW0NCiNjYXRlZyA8LSBibG9jLlN1YjE0TS5hX2INClMgPC0gKChtZWRpYW5hIC0gbGFzdF9jb21wX2RlYnV0WywzXSkgLyBzdGRldikgLyBtYXguc3RkDQpFIDwtIDEvKDErKDEwXiggKGF2Zy5wbGF5ZXItUi5kZWJ1dCkvRCApKSkNClIubmV3IDwtIFIuZGVidXQgKyAoayAqIChTIC0gKCgyKkUpL04pICkgKQ0KIw0KbWF4LmN1dC5maW5hbHMgPC0gKHN0ZGV2LTkpL3N0ZGV2DQpQcm9iLkZpbmFscyA8LSAxLygxKygxMF4oICggc29ydChlbG8ubGFzdC5jb21wLm5ldyRSLm5ldywgZGVjcmVhc2luZyA9IFRSVUUpWzldIC0gUi5uZXdbLDFdKS9EICkpKQ0KbWF4LmN1dC5wb2RpdW0gPC0gKHN0ZGV2LTQpL3N0ZGV2DQpQcm9iLnBvZGl1bSA8LSAxLygxKygxMF4oICggc29ydChlbG8ubGFzdC5jb21wLm5ldyRSLm5ldywgZGVjcmVhc2luZyA9IFRSVUUpWzRdIC1SLm5ld1ssMV0pL0QgKSkpDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KZWxvLmxhc3QuY29tcC5uZXcuZGVidXQgPC0gYXNfdGliYmxlKGNiaW5kKG5hbWVzID0gbmFtZXMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBUZWFtPSBUZWFtLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgUiA9IFIuZGVidXQsDQogICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzID0gdW5saXN0KGxhc3RfY29tcF9kZWJ1dFssM10pLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgUyA9IFNbLDFdLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgUi5uZXc9IHJvdW5kKFIubmV3WywxXSwyKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2IuRmluYWxzPSBwYXN0ZShyb3VuZChQcm9iLkZpbmFscyoxMDAsMSksIiUiKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2IucG9kaXVtID0gcGFzdGUocm91bmQoUHJvYi5wb2RpdW0qMTAwLCAxKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiUiKSANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICkpDQoNCg0KZWxvLmxhc3QuY29tcC5uZXcgPC0gZWxvLmxhc3QuY29tcC5uZXcgJT4lIHJiaW5kKGVsby5sYXN0LmNvbXAubmV3LmRlYnV0KQ0KDQoNCiMjIyMjICMjIyMjIyMjIyMNCmtuaXRyOjprYWJsZShlbG8ubGFzdC5jb21wLm5ld1tvcmRlcihlbG8ubGFzdC5jb21wLm5ldyRyZXN1bHRzKSxjKDEsMiwzLDQsNiw3LDgpXSkNCg0KYGBgICANCg0KIyMjIyNfIEVsbyBIaXN0b3J5IF8NCmBgYHtyfQ0KIyMgDQpjb21wZT0gIjIwMjIuMyINCmVsby5oaXN0b3J5Lmxhc3QgPC0gZWxvLmxhc3QuY29tcC5uZXcgJT4lIA0KICBtdXRhdGUoY29tcCA9IHJlcChjb21wZSwgbGVuZ3RoKGVsby5sYXN0LmNvbXAubmV3JGNvbXBldGl0b3IpKSwNCiAgICAgICAgIGNhdGVnID0gcmVwKCJTdWIxNk0iLCBsZW5ndGgoZWxvLmxhc3QuY29tcC5uZXckY29tcGV0aXRvcikpKQ0KDQojDQplbG8uaGlzdG9yeSA8LSBlbG8uaGlzdG9yeSAlPiUgcmJpbmQoZWxvLmhpc3RvcnkubGFzdCkNCg0KIyB0aW1lLXNlcmllcyBkYXRhLmZyYW1lDQojIyBzdWIxNk0NCmVsby5oaXN0b3J5LnRfc2VyaWVzLlMxNk0gPC0gDQogIGFzX3RpYmJsZShlbG8uaGlzdG9yeSAlPiUNCiAgICAgICAgICAgICAgZmlsdGVyKGNhdGVnPT0iU3ViMTZNIikgJT4lDQogICAgICAgICAgICAgIHJlc2hhcGUyOjpkY2FzdChmb3JtdWxhID0gY29tcGV0aXRvcn5jb21wLCB2YWx1ZS52YXIgPSAiUi5uZXciKSkgDQojIyANCg0KYGBgICANCg0KIyMjIEVsbyBpbiB0aW1lDQpgYGB7ciBpbmNsdWRlPVRSVUV9DQpwIDwtIGVsby5oaXN0b3J5ICU+JSANCiAgZmlsdGVyKGNhdGVnPT0iU3ViMTZNIiwgUi5uZXc+PTApICU+JQ0KICBnZ3Bsb3QoYWVzKHg9IGNvbXAsIHk9IFIubmV3LCBncm91cCA9IGNvbXBldGl0b3IsIGNvbCA9IFRlYW0pKSArIA0KICBnZW9tX3BvaW50KCkgKyANCiAgZ2VvbV9saW5lKGxpbmV0eXBlPSAiZGFzaGVkIikgKyANCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0PTEwMDAsbGluZXR5cGU9ICJkYXNoZWQiKQ0KDQojcA0KZ2dwbG90bHkocCkNCmBgYCAgDQoNCg0KIyMjICoqRWxvIEFjY3VtdWxhdGVkIFRoaXJkXzIwMjMqKg0KYGBge3IgZXZhbD1GQUxTRSwgaW5jbHVkZT1UUlVFfQ0KZWxvLmxhc3QuYWNjdW0NCmVsby5sYXN0LmNvbXAubmV3DQpgYGANCg0KYGBge3IgZXZhbD1UUlVFLCBpbmNsdWRlPVRSVUUsIGNvbHMucHJpbnQ9N30NCg0KZWxvLmxhc3QuYWNjdW1fbGFzdC5jb21wX2Fic2VudCA8LSBlbG8ubGFzdC5hY2N1bSAlPiUgYW50aV9qb2luKGVsby5sYXN0LmNvbXAubmV3LGJ5PSJjb21wZXRpdG9yIikNCg0KZWxvLmxhc3QuYWNjdW0gPC0gZWxvLmxhc3QuY29tcC5uZXcgJT4lIHJiaW5kKGVsby5sYXN0LmFjY3VtX2xhc3QuY29tcF9hYnNlbnQpDQplbG8ubGFzdC5hY2N1bSA8LSBlbG8ubGFzdC5hY2N1bVtvcmRlcihlbG8ubGFzdC5hY2N1bSRjb21wZXRpdG9yKSxdDQojDQprbml0cjo6a2FibGUoZWxvLmxhc3QuYWNjdW1bb3JkZXIoZWxvLmxhc3QuYWNjdW0kUi5uZXcsIGRlY3JlYXNpbmcgPSBUUlVFKSxjKDEsMiw2LDcsOCldKQ0KYGBgICANCg0KDQojIyMjIyogKipDYXB0dXJhbmRvIGxvcyBmdXR1cm9zIFN1YjE4KiogDQpgYGB7ciBpbmNsdWRlPVRSVUUsIGVjaG89VFJVRX0NCmJsb2MuU3ViMThNLjIzIDwtIHJhbmtzICU+JQ0KICBmaWx0ZXIoc3RhZ2U9PSJDbGFzaWZpYyIsDQogICAgICAgICBDYXRlZ29yeT09IlN1YjE4X00iLA0KICAgICAgICAgeWVhcj09IjIwMjMiDQogICAgIyAgICAgTmFtZT09IG5vbWJyZQ0KICAgICAgICAgKSAlPiUNCiAgZ3JvdXBfYnkoY29tcGV0aXRvcj0gTmFtZSwNCiAgICAgICAgICAgWWVhcj0geWVhciwNCiAgICAgICAgICAgQ29tcGU9IENvbXBlXywNCiAgICAgICAgICAgVGVhbSA9IFRlYW0sDQogICAgICAgICAgIERhdGU9IERhdGUpICU+JQ0KICByZWZyYW1lKHJhbms9IFJhbmspICU+JQ0KICByZXNoYXBlMjo6ZGNhc3QoZm9ybXVsYSA9IGNvbXBldGl0b3IgKyBUZWFtIH4gQ29tcGUsIA0KICAgICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKQ0KDQpibG9jLlN1YjE4TS4yMyA8LSBhc190aWJibGUoYmxvYy5TdWIxOE0uMjMpDQpgYGANCg0KDQojIyMjIyogKl9Mb3Mgc3ViMTYgInNhbGVuIl8qDQoNCg0KYGBge3IgaW5jbHVkZT1UUlVFLCBlY2hvPVRSVUUsY29scy5wcmludD03fQ0KIyMgZW52aWFuZG8gbG9zIHN1YjE2IGEgb3RybyBhcmNoaXZvDQplbG8uMjIuYWNjdW0udG9fc3ViMTggPC0gZWxvLmxhc3QuYWNjdW0gJT4lIHNlbWlfam9pbihibG9jLlN1YjE4TS4yMyxieT0iY29tcGV0aXRvciIpDQoNCiMjIHN1YjE2IHNhbGllbmRvDQplbG8ubGFzdC5hY2N1bSA8LSBlbG8ubGFzdC5hY2N1bSAlPiUgYW50aV9qb2luKGJsb2MuU3ViMThNLjIzLGJ5PSJjb21wZXRpdG9yIikgDQpgYGAgIA0KDQoNCiMjIyMgTUVSR0lORyBmcm9tIHN1YjE0ICMjIyMNCmBgYHtyfQ0KYmxvYy5TdWIxNE0gPC0gcmFua3MgJT4lDQogIGZpbHRlcihzdGFnZT09IkNsYXNpZmljIiwNCiAgICAgICAgIENhdGVnb3J5PT0iU3ViMTRfTSIsDQogICAgICAgICB5ZWFyPT0iMjAyMiJ8eWVhcj09IjIwMjMiDQogICAgIyAgICAgTmFtZT09IG5vbWJyZQ0KICAgICAgICAgKSAlPiUNCiAgZ3JvdXBfYnkoY29tcGV0aXRvcj0gTmFtZSwNCiAgICAgICAgICAgWWVhcj0geWVhciwNCiAgICAgICAgICAgQ29tcGU9IENvbXBlXywNCiAgICAgICAgICAgVGVhbSA9IFRlYW0sDQogICAgICAgICAgIERhdGU9IERhdGUpICU+JQ0KICByZWZyYW1lKHJhbms9IFJhbmspICU+JQ0KICByZXNoYXBlMjo6ZGNhc3QoZm9ybXVsYSA9IGNvbXBldGl0b3IgKyBUZWFtIH4gQ29tcGUsIA0KICAgICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKQ0KDQpibG9jLlN1YjE0TSA8LSBhc190aWJibGUoYmxvYy5TdWIxNE0pDQojIw0KYmxvYy5TdWIxNE1bb3JkZXIoYmxvYy5TdWIxNE0kYS5ibG9jLmZpcnN0LjIyKSxjKDEsMiwzKV0gDQojDQpjb21wZXRpdG9ycy5hIDwtIG5yb3coYmxvYy5TdWIxNE1bIWlzLm5hKGJsb2MuU3ViMTRNJGEuYmxvYy5maXJzdC4yMiksXSkNCmNvbXBldGl0b3JzLmIgPC0gbnJvdyhibG9jLlN1YjE0TVshaXMubmEoYmxvYy5TdWIxNE0kYi5ibG9jLnNlYy4yMiksXSkNCmNvbXBldGl0b3JzLmMgPC0gbnJvdyhibG9jLlN1YjE0TVshaXMubmEoYmxvYy5TdWIxNE0kYy5ibG9jLnRocmQuMjIpLF0pDQojDQojIyMgRWxvIEZpcnN0IDIwMjIgICMjIyMNCiMNCk4gPC0gbGVuZ3RoKGJsb2MuU3ViMTRNJGEuYmxvYy5maXJzdC4yMlshaXMubmEoYmxvYy5TdWIxNE0kYS5ibG9jLmZpcnN0LjIyKV0pDQpSIDwtIHJlcCgxMDAwLCBOKQ0KbmFtZXMgPC0gYmxvYy5TdWIxNE1bIWlzLm5hKGJsb2MuU3ViMTRNJGEuYmxvYy5maXJzdC4yMiksIDFdDQpUZWFtIDwtIGJsb2MuU3ViMTRNWyFpcy5uYShibG9jLlN1YjE0TSRhLmJsb2MuZmlyc3QuMjIpLCAyXQ0KI2NhdGVnIDwtIGJsb2MuU3ViMTRNWyFpcy5uYShibG9jLlN1YjE0TSRhLmJsb2MuZmlyc3QuMjIpLCBdDQpyZXN1bHRzIDwtIGJsb2MuU3ViMTRNJGEuYmxvYy5maXJzdC4yMlshaXMubmEoYmxvYy5TdWIxNE0kYS5ibG9jLmZpcnN0LjIyKV0NCnN0ZGV2IDwtIHNkKGMoMTooTituLmRlYnV0KSkpDQphdmcucGxheWVyIDwtIG1lZGlhbihSKQ0KbWVkaWFuYSA8LSBtZWRpYW4ocmVzdWx0cykNCm1heC5zdGQgPC0gKG1lZGlhbmEtMSkvc3RkZXYNClMgPC0gKChtZWRpYW5hLXJlc3VsdHMpIC8gc3RkZXYpIC8gbWF4LnN0ZA0KRCA9IDQwMA0KayA9IDMyDQpFIDwtIDEvKDErKDEwXiggKGF2Zy5wbGF5ZXItUikvRCApKSkNClIubmV3IDwtIFIgKyAoayAqIChTIC0gKCgyKkUpL04pICkgKQ0KIw0KbWF4LmN1dC5maW5hbHMgPC0gKHN0ZGV2LTkpL3N0ZGV2DQpQcm9iLkZpbmFscyA8LSAxLygxKygxMF4oICggc29ydChSLm5ldywgZGVjcmVhc2luZyA9IFRSVUUpWzldIC1SLm5ldykvRCApKSkNCm1heC5jdXQucG9kaXVtIDwtIChzdGRldi00KS9zdGRldg0KUHJvYi5wb2RpdW0gPC0gMS8oMSsoMTBeKCAoIHNvcnQoUi5uZXcsIGRlY3JlYXNpbmcgPSBUUlVFKVs0XSAtUi5uZXcpL0QgKSkpDQojIyMNCmVsby5hLmJsb2MuZmlyc3QuMjIgPC0gY2JpbmQobmFtZXMgPSBuYW1lcywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVhbT0gVGVhbSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUiA9IFIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMgPSByZXN1bHRzLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTID0gUywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUi5uZXc9IHJvdW5kKFIubmV3LDIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9iLkZpbmFscz0gcGFzdGUocm91bmQoUHJvYi5GaW5hbHMqMTAwLCAxKSwgIiUiKSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2IucG9kaXVtID0gcGFzdGUocm91bmQoUHJvYi5wb2RpdW0qMTAwLCAxKSwiJSIgKSApDQoNCmVsby5hLmJsb2MuZmlyc3QuMjIgPC0gYXNfdGliYmxlKGVsby5hLmJsb2MuZmlyc3QuMjIpDQoNCmtuaXRyOjprYWJsZShlbG8uYS5ibG9jLmZpcnN0LjIyW29yZGVyKGVsby5hLmJsb2MuZmlyc3QuMjIkcmVzdWx0cyksIGMoMSwyLDMsNCw2LDcsOCldLCApDQojIyMgXyBFbG8gSGlzdG9yeSBfICMjIyMNCiNlbG8uaGlzdG9yeS5sYXN0IDwtDQojICBlbG8uYS5ibG9jLmZpcnN0LjIyICU+JSANCiAjIG11dGF0ZShjb21wID0gcmVwKCIyMDIyLjEiLCBsZW5ndGgoZWxvLmEuYmxvYy5maXJzdC4yMiRjb21wZXRpdG9yKSksDQogICMgICAgICAgY2F0ZWcgPSByZXAoIlN1YjE0TSIsIGxlbmd0aChlbG8uYS5ibG9jLmZpcnN0LjIyJGNvbXBldGl0b3IpKSkNCiNlbG8uaGlzdG9yeSA8LSByYmluZChlbG8uaGlzdG9yeS5sYXN0KQ0KIyMgMjAyMiBTZWNvbmQgIyMjIw0KYmxvYy5TdWIxNE1bb3JkZXIoYmxvYy5TdWIxNE0kYi5ibG9jLnNlYy4yMiksIGMoMSwyLDMsNCldDQojDQpibG9jLlN1YjE0TS5hX2IgPC0gYmxvYy5TdWIxNE1bLGMoMTo0KV0gJT4lDQogIGZpbHRlcighaXMubmEoYmxvYy5TdWIxNE0kYi5ibG9jLnNlYy4yMikmIWlzLm5hKGJsb2MuU3ViMTRNJGEuYmxvYy5maXJzdC4yMikpDQoNCmJsb2MuU3ViMTRNLmFfYiA8LSBlbG8uYS5ibG9jLmZpcnN0LjIyICU+JSANCiAgcmlnaHRfam9pbihibG9jLlN1YjE0TS5hX2IsIGJ5PSAiY29tcGV0aXRvciIpICU+JQ0KICBhc190aWJibGUoKQ0KIyMjIEVsbyBTZWNvbmQgMjAyMg0KbiA9IGxlbmd0aChibG9jLlN1YjE0TS5hX2IkYi5ibG9jLnNlYy4yMikNCk4gPC0gbGVuZ3RoKGJsb2MuU3ViMTRNJGIuYmxvYy5zZWMuMjJbIWlzLm5hKGJsb2MuU3ViMTRNJGIuYmxvYy5zZWMuMjIpXSkNClIgPC0gYmxvYy5TdWIxNE0uYV9iJFIubmV3DQpuYW1lcyA8LSBibG9jLlN1YjE0TS5hX2JbIWlzLm5hKGJsb2MuU3ViMTRNLmFfYiRiLmJsb2Muc2VjLjIyKSwxXQ0KVGVhbSA8LSBibG9jLlN1YjE0TS5hX2IkVGVhbS54DQojDQpyZXN1bHRzIDwtIGJsb2MuU3ViMTRNJGIuYmxvYy5zZWMuMjJbIWlzLm5hKGJsb2MuU3ViMTRNJGIuYmxvYy5zZWMuMjIpXQ0Kc3RkZXYgPC0gc2QoYygxOihOK24uZGVidXQpKSkNCmF2Zy5wbGF5ZXIgPC0gbWVkaWFuKGMoUiwgcmVwKDEwMDAsIE4tbiApKSkNCm1lZGlhbmEgPC0gbWVkaWFuKGJsb2MuU3ViMTRNJGIuYmxvYy5zZWMuMjJbIWlzLm5hKGJsb2MuU3ViMTRNJGIuYmxvYy5zZWMuMjIpXSkNCm1heC5zdGQgPC0gKG1lZGlhbmEtMSkvc3RkZXYNCiMNClMgPC0gKChtZWRpYW5hIC0gYmxvYy5TdWIxNE0uYV9iJGIuYmxvYy5zZWMuMjIgKSAvIHN0ZGV2KSAvIG1heC5zdGQNCkQgPSA0MDANCmsgPSAzMg0KRSA8LSAxLygxKygxMF4oIChhdmcucGxheWVyLVIpL0QgKSkpDQpSLm5ldyA8LSBSICsgKGsgKiAoUyAtICgoMipFKS9OKSApICkNCiMNCm1heC5jdXQuZmluYWxzIDwtIChzdGRldi05KS9zdGRldg0KUHJvYi5GaW5hbHMgPC0gMS8oMSsoMTBeKCAoIHNvcnQoUi5uZXcsIGRlY3JlYXNpbmcgPSBUUlVFKVs5XSAtUi5uZXcpL0QgKSkpDQptYXguY3V0LnBvZGl1bSA8LSAoc3RkZXYtNCkvc3RkZXYNClByb2IucG9kaXVtIDwtIDEvKDErKDEwXiggKCBzb3J0KFIubmV3LCBkZWNyZWFzaW5nID0gVFJVRSlbNF0gLVIubmV3KS9EICkpKQ0KIyMjDQplbG8uYi5ibG9jLnNlYy4yMiA8LSBjYmluZChuYW1lcyA9IG5hbWVzLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVhbT0gVGVhbSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFIgPSBSLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cyA9IGJsb2MuU3ViMTRNLmFfYiRiLmJsb2Muc2VjLjIyLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgUyA9IFMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBSLm5ldz0gcm91bmQoUi5uZXcsMiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9iLkZpbmFscz0gcGFzdGUocm91bmQoUHJvYi5GaW5hbHMqMTAwLCAxKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJSIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvYi5wb2RpdW0gPSBwYXN0ZShyb3VuZChQcm9iLnBvZGl1bSoxMDAsMSksIiUiICkgDQopDQplbG8uYi5ibG9jLnNlYy4yMiA8LSBhc190aWJibGUoZWxvLmIuYmxvYy5zZWMuMjIpDQojIyMgZGVidXQgbGlzdCAjIyMjDQpibG9jLlN1YjE0TS5iLmRlYnV0IDwtIGJsb2MuU3ViMTRNWyFpcy5uYShibG9jLlN1YjE0TSRiLmJsb2Muc2VjLjIyKSxjKDEsMiw0KV0gJT4lIGFudGlfam9pbihibG9jLlN1YjE0TS5hX2JbLCBjKDEpXSwgYnk9ICJjb21wZXRpdG9yIikgJT4lIGFzX3RpYmJsZSgpDQojDQpuID0gbGVuZ3RoKGJsb2MuU3ViMTRNLmIuZGVidXQkYi5ibG9jLnNlYy4yMikNCk4gPC0gbGVuZ3RoKGJsb2MuU3ViMTRNJGIuYmxvYy5zZWMuMjJbIWlzLm5hKGJsb2MuU3ViMTRNJGIuYmxvYy5zZWMuMjIpXSkNClIuZGVidXQgPC0gcmVwKDEwMDAsIG4pDQpuYW1lcyA8LSBibG9jLlN1YjE0TS5iLmRlYnV0WywxXQ0KVGVhbSA8LSBibG9jLlN1YjE0TS5iLmRlYnV0JFRlYW0NCiMNClMgPC0gKChtZWRpYW5hLSBibG9jLlN1YjE0TS5iLmRlYnV0JGIuYmxvYy5zZWMuMjIpIC8gc3RkZXYpIC8gbWF4LnN0ZA0KRSA8LSAxLygxKygxMF4oIChhdmcucGxheWVyLVIuZGVidXQpL0QgKSkpDQpSLm5ldyA8LSBSLmRlYnV0ICsgKGsgKiAoUyAtICgoMipFKS9OKSApICkNCiMNCm1heC5jdXQuZmluYWxzIDwtIChzdGRldi05KS9zdGRldg0KUHJvYi5GaW5hbHMgPC0gMS8oMSsoMTBeKCAoIHNvcnQoZWxvLmIuYmxvYy5zZWMuMjIkUi5uZXcsIGRlY3JlYXNpbmcgPSBUUlVFKVs5XSAtIFIubmV3KS9EICkpKQ0KbWF4LmN1dC5wb2RpdW0gPC0gKHN0ZGV2LTQpL3N0ZGV2DQpQcm9iLnBvZGl1bSA8LSAxLygxKygxMF4oICggc29ydChlbG8uYi5ibG9jLnNlYy4yMiRSLm5ldywgZGVjcmVhc2luZyA9IFRSVUUpWzRdIC1SLm5ldykvRCApKSkNCiMjIyMNCmVsby5iLmJsb2Muc2VjLjIyLmRlYnV0IDwtIGNiaW5kKG5hbWVzID0gbmFtZXMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZWFtPSBUZWFtLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUiA9IFIuZGVidXQsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzID0gYmxvYy5TdWIxNE0uYi5kZWJ1dCRiLmJsb2Muc2VjLjIyLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUyA9IFMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSLm5ldz0gcm91bmQoUi5uZXcsMiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9iLkZpbmFscz0gcGFzdGUocm91bmQoUHJvYi5GaW5hbHMqMTAwLDEpLCIlIiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9iLnBvZGl1bSA9IHBhc3RlKHJvdW5kKFByb2IucG9kaXVtKjEwMCwgMSksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlIikgDQopDQplbG8uYi5ibG9jLnNlYy4yMi5kZWJ1dCA8LSBhc190aWJibGUoZWxvLmIuYmxvYy5zZWMuMjIuZGVidXQpDQoNCmVsby5iLmJsb2Muc2VjLjIyIDwtIGVsby5iLmJsb2Muc2VjLjIyICU+JSByYmluZChlbG8uYi5ibG9jLnNlYy4yMi5kZWJ1dCkNCiMNCmtuaXRyOjprYWJsZShlbG8uYi5ibG9jLnNlYy4yMltvcmRlcihlbG8uYi5ibG9jLnNlYy4yMiRyZXN1bHRzKSxjKDEsMiwzLDQsNiw3LDgpXSkNCiMjIyBfIEVsbyBIaXN0b3J5IF8gIyMjIw0KIw0KI2Vsby5oaXN0b3J5Lmxhc3QgPC0gZWxvLmIuYmxvYy5zZWMuMjIgJT4lIA0KIyAgbXV0YXRlKGNvbXAgPSByZXAoIjIwMjIuMiIsIGxlbmd0aChlbG8uYi5ibG9jLnNlYy4yMiRjb21wZXRpdG9yKSksDQogIyAgICAgICAgY2F0ZWcgPSByZXAoIlN1YjE0TSIsIGxlbmd0aChlbG8uYi5ibG9jLnNlYy4yMiRjb21wZXRpdG9yKSkpDQojZWxvLmhpc3RvcnkgPC0gZWxvLmhpc3RvcnkgJT4lIHJiaW5kKGVsby5oaXN0b3J5Lmxhc3QpDQojIyMjIyB0aW1lLXNlcmllcyBkYXRhLmZyYW1lICMjIyMNCiNlbG8uaGlzdG9yeS50X3NlcmllcyA8LSBlbG8uaGlzdG9yeSAlPiUgcmVzaGFwZTI6OmRjYXN0KGZvcm11bGEgPSBjb21wZXRpdG9yfmNvbXAsIHZhbHVlLnZhciA9ICJSLm5ldyIpDQojIyAyMDIyIFRoaXJkICMjIyMNCmJsb2MuU3ViMTRNW29yZGVyKGJsb2MuU3ViMTRNJGMuYmxvYy50aHJkLjIyKSwgYygxLDIsMyw0LDUpXQ0KIyMjIEVsbyBUaGlyZCAyMDIyICAjIyMjDQojDQpibG9jLlN1YjE0TS5jIDwtIGFzX3RpYmJsZShibG9jLlN1YjE0TVshaXMubmEoYmxvYy5TdWIxNE0kYy5ibG9jLnRocmQuMjIpICwgYygxLDIsNSldKQ0KIyMNCmJsb2MuU3ViMTRNLmMuZGVidXQgPC0gYmxvYy5TdWIxNE1baXMubmEoYmxvYy5TdWIxNE0kYS5ibG9jLmZpcnN0LjIyKSZpcy5uYShibG9jLlN1YjE0TSRiLmJsb2Muc2VjLjIyJiFpcy5uYShibG9jLlN1YjE0TSRjLmJsb2MudGhyZC4yMikpICwgYygxLDIsNSldDQojIw0KYmxvYy5TdWIxNE0uYV9iX2MgPC0gYmxvYy5TdWIxNE1bIWlzLm5hKGJsb2MuU3ViMTRNJGEuYmxvYy5maXJzdC4yMikmIWlzLm5hKGJsb2MuU3ViMTRNJGIuYmxvYy5zZWMuMjIpJiFpcy5uYShibG9jLlN1YjE0TSRjLmJsb2MudGhyZC4yMiksIGMoMSwyLDUpXQ0KIyMNCmJsb2MuU3ViMTRNLmFfX2MgPC0gYmxvYy5TdWIxNE1bIWlzLm5hKGJsb2MuU3ViMTRNJGEuYmxvYy5maXJzdC4yMikmaXMubmEoYmxvYy5TdWIxNE0kYi5ibG9jLnNlYy4yMikmIWlzLm5hKGJsb2MuU3ViMTRNJGMuYmxvYy50aHJkLjIyKSwgYygxLDIsMyw1KV0NCiMNCmJsb2MuU3ViMTRNLmFfb25seSA8LSBibG9jLlN1YjE0TVshaXMubmEoYmxvYy5TdWIxNE0kYS5ibG9jLmZpcnN0LjIyKSZpcy5uYShibG9jLlN1YjE0TSRiLmJsb2Muc2VjLjIyKSZpcy5uYShibG9jLlN1YjE0TSRjLmJsb2MudGhyZC4yMiksXQ0KIyMjIyBFTE9zICMjIyMNCmVsby5hLmJsb2MuZmlyc3QuMjIuYV9vbmx5IDwtIGVsby5hLmJsb2MuZmlyc3QuMjJbLF0gJT4lIGFudGlfam9pbihlbG8uYi5ibG9jLnNlYy4yMiwgYnk9ImNvbXBldGl0b3IiKQ0KIyMjIEVsbyBBY2N1bXVsYXRlZCBzZWNvbmQgY29tcCAjIyMjDQplbG8uYi5ibG9jLnNlYy4yMi5hY2N1bSA8LSBlbG8uYi5ibG9jLnNlYy4yMiAlPiUgcmJpbmQoZWxvLmEuYmxvYy5maXJzdC4yMi5hX29ubHkpDQplbG8uYi5ibG9jLnNlYy4yMi5hY2N1bSAgPC0gDQogIGVsby5iLmJsb2Muc2VjLjIyLmFjY3VtW29yZGVyKGVsby5iLmJsb2Muc2VjLjIyLmFjY3VtJGNvbXBldGl0b3IpLF0NCg0KDQojIyMjICMjIEVMTyAoTkFTQ0FSKSAjIyMjIyMjDQpuID0gbGVuZ3RoKGVsby5iLmJsb2Muc2VjLjIyLmFjY3VtJGNvbXBldGl0b3IpDQpuLmRlYnV0ID0gbGVuZ3RoKGJsb2MuU3ViMTRNLmMuZGVidXQkY29tcGV0aXRvcikNCiMNCmMgPC0gYmxvYy5TdWIxNE0uYyAlPiUgcmlnaHRfam9pbihlbG8uYi5ibG9jLnNlYy4yMi5hY2N1bSwgYnk9ImNvbXBldGl0b3IiKQ0KIw0KTiA8LSBsZW5ndGgoYyRjb21wZXRpdG9yWyFpcy5uYShjJGMuYmxvYy50aHJkLjIyKV0pDQpSIDwtIGMkUi5uZXdbIWlzLm5hKGMkYy5ibG9jLnRocmQuMjIpXQ0KbmFtZXMgPC0gY1shaXMubmEoYyRjLmJsb2MudGhyZC4yMiksMV0NClRlYW0gPC0gYyRUZWFtLnhbIWlzLm5hKGMkYy5ibG9jLnRocmQuMjIpXQ0KIw0KcmVzdWx0cyA8LSBibG9jLlN1YjE0TS5jJGMuYmxvYy50aHJkLjIyDQpzdGRldiA8LSBzZChjKDE6KE4rbi5kZWJ1dCkpKQ0KIw0KYXZnLnBsYXllciA8LSBtZWRpYW4oYyhSLCByZXAoMTAwMCwgbi5kZWJ1dCApKSkNCm1lZGlhbmEgPC0gbWVkaWFuKGJsb2MuU3ViMTRNJGMuYmxvYy50aHJkLjIyWyFpcy5uYShibG9jLlN1YjE0TSRjLmJsb2MudGhyZC4yMildKQ0KbWF4LnN0ZCA8LSAobWVkaWFuYS0xKS9zdGRldg0KIw0KUyA8LSAoKG1lZGlhbmEgLSBjJGMuYmxvYy50aHJkLjIyWyFpcy5uYShjJGMuYmxvYy50aHJkLjIyKV0gKSAvIHN0ZGV2KSAvIG1heC5zdGQNCkQgPSA0MDANCmsgPSAzMg0KRSA8LSAxLygxKygxMF4oIChhdmcucGxheWVyLVIpL0QgKSkpDQpSLm5ldyA8LSBSICsgKGsgKiAoUyAtICgoMipFKS9OKSApICkNCiMNCm1heC5jdXQuZmluYWxzIDwtIChzdGRldi05KS9zdGRldg0KUHJvYi5GaW5hbHMgPC0gMS8oMSsoMTBeKCAoIHNvcnQoUi5uZXcsIGRlY3JlYXNpbmcgPSBUUlVFKVs5XSAtUi5uZXcpL0QgKSkpDQptYXguY3V0LnBvZGl1bSA8LSAoc3RkZXYtNCkvc3RkZXYNClByb2IucG9kaXVtIDwtIDEvKDErKDEwXiggKCBzb3J0KFIubmV3LCBkZWNyZWFzaW5nID0gVFJVRSlbNF0gLVIubmV3KS9EICkpKQ0KIw0KZWxvLmMuYmxvYy50aHJkLjIyIDwtIGNiaW5kKG5hbWVzID0gbmFtZXMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVhbT0gVGVhbSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBSID0gUiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzID0gYyRjLmJsb2MudGhyZC4yMlshaXMubmEoYyRjLmJsb2MudGhyZC4yMildLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFMgPSBTLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFIubmV3PSByb3VuZChSLm5ldywyKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9iLkZpbmFscz0gcGFzdGUocm91bmQoUHJvYi5GaW5hbHMqMTAwLCAxKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiUiKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9iLnBvZGl1bSA9IHBhc3RlKHJvdW5kKFByb2IucG9kaXVtKjEwMCwxKSwgIiUiICkgDQopDQplbG8uYy5ibG9jLnRocmQuMjIgPC0gYXNfdGliYmxlKGVsby5jLmJsb2MudGhyZC4yMikNCiMNCm4gPSBsZW5ndGgoYmxvYy5TdWIxNE0uYy5kZWJ1dCRjLmJsb2MudGhyZC4yMikNCk4gPC0gbGVuZ3RoKGJsb2MuU3ViMTRNJGMuYmxvYy50aHJkLjIyWyFpcy5uYShibG9jLlN1YjE0TSRjLmJsb2MudGhyZC4yMildKQ0KUi5kZWJ1dCA8LSByZXAoMTAwMCwgbikNCm5hbWVzIDwtIGJsb2MuU3ViMTRNLmMuZGVidXRbLDFdDQpUZWFtIDwtIGJsb2MuU3ViMTRNLmMuZGVidXQkVGVhbQ0KIw0KUyA8LSAoKG1lZGlhbmEtIGJsb2MuU3ViMTRNLmMuZGVidXQkYy5ibG9jLnRocmQuMjIpIC8gc3RkZXYpIC8gbWF4LnN0ZA0KRSA8LSAxLygxKygxMF4oIChhdmcucGxheWVyLVIuZGVidXQpL0QgKSkpDQpSLm5ldyA8LSBSLmRlYnV0ICsgKGsgKiAoUyAtICgoMipFKS9OKSApICkNCiMNCm1heC5jdXQuZmluYWxzIDwtIChzdGRldi05KS9zdGRldg0KUHJvYi5GaW5hbHMgPC0gMS8oMSsoMTBeKCAoIHNvcnQoZWxvLmMuYmxvYy50aHJkLjIyJFIubmV3LCBkZWNyZWFzaW5nID0gVFJVRSlbOV0gLSBSLm5ldykvRCApKSkNCm1heC5jdXQucG9kaXVtIDwtIChzdGRldi00KS9zdGRldg0KUHJvYi5wb2RpdW0gPC0gMS8oMSsoMTBeKCAoIHNvcnQoZWxvLmMuYmxvYy50aHJkLjIyJFIubmV3LCBkZWNyZWFzaW5nID0gVFJVRSlbNF0gLVIubmV3KS9EICkpKQ0KIw0KZWxvLmMuYmxvYy50aHJkLjIyLmRlYnV0IDwtIGNiaW5kKG5hbWVzID0gbmFtZXMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVhbT0gVGVhbSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSID0gUi5kZWJ1dCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzID0gYmxvYy5TdWIxNE0uYy5kZWJ1dCRjLmJsb2MudGhyZC4yMiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTID0gUywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSLm5ldz0gcm91bmQoUi5uZXcsMiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvYi5GaW5hbHM9IHBhc3RlKHJvdW5kKFByb2IuRmluYWxzKjEwMCwxKSwiJSIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2IucG9kaXVtID0gcGFzdGUocm91bmQoUHJvYi5wb2RpdW0qMTAwLCAxKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlIikgDQopDQplbG8uYy5ibG9jLnRocmQuMjIuZGVidXQgPC0gYXNfdGliYmxlKGVsby5jLmJsb2MudGhyZC4yMi5kZWJ1dCkNCiMNCmVsby5jLmJsb2MudGhyZC4yMiA8LSBlbG8uYy5ibG9jLnRocmQuMjIgJT4lIHJiaW5kKGVsby5jLmJsb2MudGhyZC4yMi5kZWJ1dCkNCiMNCmtuaXRyOjprYWJsZShlbG8uYy5ibG9jLnRocmQuMjJbb3JkZXIoZWxvLmMuYmxvYy50aHJkLjIyJHJlc3VsdHMpLGMoMSwyLDMsNCw2LDcsOCldKQ0KIw0KIyMjIF8gRWxvIEhpc3RvcnkgXyAjIyMjDQpjb21wZSA8LSAiMjAyMi4zIg0KI2Vsby5oaXN0b3J5Lmxhc3QgPC0gZWxvLmMuYmxvYy50aHJkLjIyICU+JSANCiMgIG11dGF0ZShjb21wID0gcmVwKGNvbXBlLCBsZW5ndGgoZWxvLmMuYmxvYy50aHJkLjIyJGNvbXBldGl0b3IpKSwNCiAjICAgICAgICBjYXRlZyA9IHJlcCgiU3ViMTRNIiwgbGVuZ3RoKGVsby5jLmJsb2MudGhyZC4yMiRjb21wZXRpdG9yKSkpDQojZWxvLmhpc3RvcnkgPC0gZWxvLmhpc3RvcnkgJT4lIHJiaW5kKGVsby5oaXN0b3J5Lmxhc3QpDQojIyMjIHRpbWUtc2VyaWVzIGRhdGEuZnJhbWUgIyMjIw0KI2Vsby5oaXN0b3J5LnRfc2VyaWVzIDwtIGFzX3RpYmJsZShlbG8uaGlzdG9yeSAlPiUgcmVzaGFwZTI6OmRjYXN0KGZvcm11bGEgPSBjb21wZXRpdG9yfmNvbXAsIHZhbHVlLnZhciA9ICJSLm5ldyIpKQ0KIyMjICoqRWxvIEFjY3VtdWxhdGVkIDIwMjIqKiAjIyMjDQoNCmVsby5iLmJsb2Muc2VjLjIyLmFjY3VtLmNfYWJzZW50IDwtIGVsby5iLmJsb2Muc2VjLjIyLmFjY3VtICU+JSBhbnRpX2pvaW4oZWxvLmMuYmxvYy50aHJkLjIyLCBieT0iY29tcGV0aXRvciIpDQojDQplbG8uYy5ibG9jLnRocmQuMjIuYWNjdW0gPC0gZWxvLmMuYmxvYy50aHJkLjIyICU+JSByYmluZChlbG8uYi5ibG9jLnNlYy4yMi5hY2N1bS5jX2Fic2VudCkNCmVsby5jLmJsb2MudGhyZC4yMi5hY2N1bSA8LSBlbG8uYy5ibG9jLnRocmQuMjIuYWNjdW1bb3JkZXIoZWxvLmMuYmxvYy50aHJkLjIyLmFjY3VtJGNvbXBldGl0b3IpLF0NCg0KIw0KYmxvYy5TdWIxNk0uMjMgPC0gcmFua3MgJT4lDQogIGZpbHRlcihzdGFnZT09IkNsYXNpZmljIiwNCiAgICAgICAgIENhdGVnb3J5PT0iU3ViMTZfTSIsDQogICAgICAgICB5ZWFyPT0iMjAyMyINCiAgICAgICAgICMgICAgIE5hbWU9PSBub21icmUNCiAgKSAlPiUNCiAgZ3JvdXBfYnkoY29tcGV0aXRvcj0gTmFtZSwNCiAgICAgICAgICAgWWVhcj0geWVhciwNCiAgICAgICAgICAgQ29tcGU9IENvbXBlXywNCiAgICAgICAgICAgVGVhbSA9IFRlYW0sDQogICAgICAgICAgIERhdGU9IERhdGUpICU+JQ0KICByZWZyYW1lKHJhbms9IFJhbmspICU+JQ0KICByZXNoYXBlMjo6ZGNhc3QoZm9ybXVsYSA9IGNvbXBldGl0b3IgKyBUZWFtIH4gQ29tcGUsIA0KICAgICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKQ0KDQpibG9jLlN1YjE2TS4yMyA8LSBhc190aWJibGUoYmxvYy5TdWIxNk0uMjMpDQojDQojICogKipfTG9zIHN1YjE2ICJzYWxlbiJfKiAjIyMjDQoNCiMjIyAqKkVsbyBBY2N1bXVsYXRlZCBGaXJzdF8yMDIzKiogIyMjIw0KIyMgZW52aWFuZG8gbG9zIHN1YjE2IGEgb3RybyBhcmNoaXZvDQplbG8uMjIuYWNjdW0udG9fc3ViMTYgPC0gZWxvLmMuYmxvYy50aHJkLjIyLmFjY3VtICU+JSBzZW1pX2pvaW4oYmxvYy5TdWIxNk0uMjMsYnk9ImNvbXBldGl0b3IiKQ0KIyMgc3ViMTYgc2FsaWVuZG8NCiMgZWxvLmMuYmxvYy50aHJkLjIyLmFjY3VtIDwtIGVsby5jLmJsb2MudGhyZC4yMi5hY2N1bSAlPiUgYW50aV9qb2luKGJsb2MuU3ViMTZNLjIzLGJ5PSJjb21wZXRpdG9yIikgDQoNCmBgYA0KDQoNCiMjIyAyMDIzIEZpcnN0DQoNCmBgYHtyIGluY2x1ZGU9VFJVRX0NCmJsb2MuU3ViMTZNW29yZGVyKGJsb2MuU3ViMTZNJGQuYmxvYy5maXJzdC4yMyksIGMoMSwyLDUsNildICU+JSBwcmludChuPTY1KQ0KYGBgICANCg0KIyMjIEVsbyBGaXJzdCAyMDIzIA0KKi1Db21wZXRpdG9ycyA9IGByIGNvbXBldGl0b3JzLmRgLSoNCg0KYGBge3IgZXZhbD1UUlVFLGluY2x1ZGU9RkFMU0V9DQpsYXN0LmNvbXAgPC0gYmxvYy5TdWIxNk1bLGMoMSwyLDYpXSAlPiUgZmlsdGVyKGJsb2MuU3ViMTZNJGQuYmxvYy5maXJzdC4yMyE9Ik5BIikgDQojDQpsYXN0X2NvbXBfZGVidXQgPC0gbGFzdC5jb21wICU+JSBhbnRpX2pvaW4oZWxvLmxhc3QuYWNjdW0sIGJ5PSJjb21wZXRpdG9yIikNCmBgYCAgDQoNCg0KDQpgYGB7cn0NCiMjIGV4LVN1YjE0IGNvbWluZyBpbiAjIyMNCmxhc3RfY29tcF9kZWJ1dC5mcm9tX2x3cl9jYXQgPC0gbGFzdF9jb21wX2RlYnV0ICU+JSByaWdodF9qb2luKGVsby4yMi5hY2N1bS50b19zdWIxNiwgYnk9ImNvbXBldGl0b3IiKQ0KbGFzdF9jb21wX2RlYnV0LmZyb21fbHdyX2NhdCA8LSBsYXN0X2NvbXBfZGVidXQuZnJvbV9sd3JfY2F0WyFpcy5uYShsYXN0X2NvbXBfZGVidXQuZnJvbV9sd3JfY2F0WywzXSksXQ0KIw0KbGFzdF9jb21wX2RlYnV0IDwtIGxhc3RfY29tcF9kZWJ1dCAlPiUgYW50aV9qb2luKGxhc3RfY29tcF9kZWJ1dC5mcm9tX2x3cl9jYXQsIGJ5PSJjb21wZXRpdG9yIikNCmBgYA0KDQoNCg0KYGBge3IgZXZhbD0gVFJVRSxpbmNsdWRlPUZBTFNFLCBjb2xzLnByaW50PSA3fQ0KIyMjIEVMTyAjIyMjIyMjIyMjIyMjIyMjIw0KIyMjICMjIEVMTyAoTkFTQ0FSKSAjIyMjIyMjIyMjIyMjDQpuLmRlYnV0ID0gbGVuZ3RoKGxhc3RfY29tcF9kZWJ1dCRjb21wZXRpdG9yKQ0Kbi5kZWJ1dC5mcm9tX2x3cl9jYXQgPSBucm93KGxhc3RfY29tcF9kZWJ1dC5mcm9tX2x3cl9jYXQpDQojIyMNCmxhc3QuY29tcC5jYWxjIDwtIGxhc3QuY29tcCAlPiUgcmlnaHRfam9pbihlbG8ubGFzdC5hY2N1bSwgYnk9ImNvbXBldGl0b3IiKQ0KIyMjDQpOIDwtIGxlbmd0aChsYXN0LmNvbXAuY2FsYyRjb21wZXRpdG9yWyFpcy5uYShsYXN0LmNvbXAuY2FsY1ssM10pXSkNClIgPC0gbGFzdC5jb21wLmNhbGMkUi5uZXdbIWlzLm5hKGxhc3QuY29tcC5jYWxjWywzXSldDQpuYW1lcyA8LSBsYXN0LmNvbXAuY2FsY1shaXMubmEobGFzdC5jb21wLmNhbGNbLDNdKSwxXQ0KVGVhbSA8LSBsYXN0LmNvbXAuY2FsYyRUZWFtLnhbIWlzLm5hKGxhc3QuY29tcC5jYWxjWywzXSldDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMNCnJlc3VsdHMgPC0gbGFzdC5jb21wLmNhbGNbIWlzLm5hKGxhc3QuY29tcC5jYWxjWywzXSksM10NCnJlc3VsdHMgPC0gKHVubGlzdChyZXN1bHRzKSkNCnN0ZGV2IDwtIHNkKGMoMTooTituLmRlYnV0K24uZGVidXQuZnJvbV9sd3JfY2F0KSkpDQojDQpSLmx3cl9jYXQgPC0gbGFzdF9jb21wX2RlYnV0LmZyb21fbHdyX2NhdCRSLm5ldw0KYXZnLnBsYXllciA8LSBtZWRpYW4oYyhSLCByZXAoMTAwMCwgbi5kZWJ1dCksYyhSLmx3cl9jYXQpICkpDQptZWRpYW5hIDwtIG1lZGlhbih1bmxpc3QobGFzdC5jb21wWyFpcy5uYShsYXN0LmNvbXBbLDNdKSwzXSkpDQptYXguc3RkIDwtIChtZWRpYW5hLTEpL3N0ZGV2DQojIyMjIyMjIyMjIyMjIyMjIyMNClMgPC0gKChtZWRpYW5hIC0gdW5saXN0KGxhc3QuY29tcC5jYWxjWyFpcy5uYShsYXN0LmNvbXAuY2FsY1ssM10pLDNdKSApIC8gc3RkZXYpIC8gbWF4LnN0ZA0KRCA9IDQwMA0KayA9IDMyDQpFIDwtIDEvKDErKDEwXiggKGF2Zy5wbGF5ZXItUikvRCApKSkNClIubmV3IDwtIFIgKyAoayAqIChTIC0gKCgyKkUpL04pICkgKQ0KIw0KbWF4LmN1dC5maW5hbHMgPC0gKHN0ZGV2LTkpL3N0ZGV2DQpQcm9iLkZpbmFscyA8LSAxLygxKygxMF4oICggc29ydChSLm5ldywgZGVjcmVhc2luZyA9IFRSVUUpWzldIC1SLm5ldykvRCApKSkNCm1heC5jdXQucG9kaXVtIDwtIChzdGRldi00KS9zdGRldg0KUHJvYi5wb2RpdW0gPC0gMS8oMSsoMTBeKCAoIHNvcnQoUi5uZXcsIGRlY3JlYXNpbmcgPSBUUlVFKVs0XSAtUi5uZXcpL0QgKSkpDQojIyMNCmVsby5sYXN0LmNvbXAubmV3IDwtIGNiaW5kKG5hbWVzID0gbmFtZXMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBUZWFtPSBUZWFtLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgUiA9IFIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzID0gcmVzdWx0cywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFMgPSBTLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgUi5uZXc9IHJvdW5kKFIubmV3LDIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvYi5GaW5hbHM9IHBhc3RlKHJvdW5kKFByb2IuRmluYWxzKjEwMCwgMSksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiUiKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2IucG9kaXVtID0gcGFzdGUocm91bmQoUHJvYi5wb2RpdW0qMTAwLDEpLCAiJSIgKSANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICkNCmVsby5sYXN0LmNvbXAubmV3IDwtIGFzX3RpYmJsZShlbG8ubGFzdC5jb21wLm5ldykNCiMjIyMjIyMjIyMjDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCm4gPSBsZW5ndGgobGFzdF9jb21wX2RlYnV0JGNvbXBldGl0b3IpDQpOIDwtIGxlbmd0aCh1bmxpc3QobGFzdC5jb21wWyFpcy5uYShsYXN0LmNvbXBbLDNdKSwzXSkpDQpSLmRlYnV0IDwtIHJlcCgxMDAwLCBuKQ0KbmFtZXMgPC0gbGFzdF9jb21wX2RlYnV0WywxXQ0KVGVhbSA8LSBsYXN0X2NvbXBfZGVidXQkVGVhbQ0KI2NhdGVnIDwtIGJsb2MuU3ViMTRNLmFfYg0KUyA8LSAoKG1lZGlhbmEgLSBsYXN0X2NvbXBfZGVidXRbLDNdKSAvIHN0ZGV2KSAvIG1heC5zdGQNCkUgPC0gMS8oMSsoMTBeKCAoYXZnLnBsYXllci1SLmRlYnV0KS9EICkpKQ0KUi5uZXcgPC0gUi5kZWJ1dCArIChrICogKFMgLSAoKDIqRSkvTikgKSApDQojDQptYXguY3V0LmZpbmFscyA8LSAoc3RkZXYtOSkvc3RkZXYNClByb2IuRmluYWxzIDwtIDEvKDErKDEwXiggKCBzb3J0KGVsby5sYXN0LmNvbXAubmV3JFIubmV3LCBkZWNyZWFzaW5nID0gVFJVRSlbOV0gLSBSLm5ld1ssMV0pL0QgKSkpDQptYXguY3V0LnBvZGl1bSA8LSAoc3RkZXYtNCkvc3RkZXYNClByb2IucG9kaXVtIDwtIDEvKDErKDEwXiggKCBzb3J0KGVsby5sYXN0LmNvbXAubmV3JFIubmV3LCBkZWNyZWFzaW5nID0gVFJVRSlbNF0gLVIubmV3WywxXSkvRCApKSkNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQplbG8ubGFzdC5jb21wLm5ldy5kZWJ1dCA8LSBhc190aWJibGUoY2JpbmQobmFtZXMgPSBuYW1lcywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlYW09IFRlYW0sDQogICAgICAgICAgICAgICAgICAgICAgICAgICBSID0gUi5kZWJ1dCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMgPSB1bmxpc3QobGFzdF9jb21wX2RlYnV0WywzXSksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBTID0gU1ssMV0sDQogICAgICAgICAgICAgICAgICAgICAgICAgICBSLm5ldz0gcm91bmQoUi5uZXdbLDFdLDIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvYi5GaW5hbHM9IHBhc3RlKHJvdW5kKFByb2IuRmluYWxzKjEwMCwxKSwiJSIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvYi5wb2RpdW0gPSBwYXN0ZShyb3VuZChQcm9iLnBvZGl1bSoxMDAsIDEpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJSIpIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgKSkNCg0KIyMgZnJvbV9sd3JfQ2F0ICMjIyMjIyMjIyMjIyMjIyMjDQpuID0gbnJvdyhsYXN0X2NvbXBfZGVidXQuZnJvbV9sd3JfY2F0KQ0KTiA8LSBsZW5ndGgodW5saXN0KGxhc3QuY29tcFshaXMubmEobGFzdC5jb21wWywzXSksM10pKQ0KUi5kZWJ1dCA8LSBSLmx3cl9jYXQNCm5hbWVzIDwtIGxhc3RfY29tcF9kZWJ1dC5mcm9tX2x3cl9jYXRbLDFdDQpUZWFtIDwtIHVubGlzdChsYXN0X2NvbXBfZGVidXQuZnJvbV9sd3JfY2F0WywyXSkNCiNjYXRlZyA8LSBibG9jLlN1YjE0TS5hX2INClMgPC0gKChtZWRpYW5hIC0gbGFzdF9jb21wX2RlYnV0LmZyb21fbHdyX2NhdFssM10pIC8gc3RkZXYpIC8gbWF4LnN0ZA0KRSA8LSAxLygxKygxMF4oIChhdmcucGxheWVyLVIuZGVidXQpL0QgKSkpDQpSLm5ldyA8LSBSLmRlYnV0ICsgKGsgKiAoUyAtICgoMipFKS9OKSApICkNCiMNCm1heC5jdXQuZmluYWxzIDwtIChzdGRldi05KS9zdGRldg0KUHJvYi5GaW5hbHMgPC0gMS8oMSsoMTBeKCAoIHNvcnQoZWxvLmxhc3QuY29tcC5uZXckUi5uZXcsIGRlY3JlYXNpbmcgPSBUUlVFKVs5XSAtIFIubmV3WywxXSkvRCApKSkNCm1heC5jdXQucG9kaXVtIDwtIChzdGRldi00KS9zdGRldg0KUHJvYi5wb2RpdW0gPC0gMS8oMSsoMTBeKCAoIHNvcnQoZWxvLmxhc3QuY29tcC5uZXckUi5uZXcsIGRlY3JlYXNpbmcgPSBUUlVFKVs0XSAtUi5uZXdbLDFdKS9EICkpKQ0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCmVsby5sYXN0LmNvbXAubmV3LmRlYnV0Lmx3cl9jYXQgPC0gYXNfdGliYmxlKGNiaW5kKG5hbWVzID0gbmFtZXMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBUZWFtPSBUZWFtLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgUiA9IFIuZGVidXQsDQogICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzID0gdW5saXN0KGxhc3RfY29tcF9kZWJ1dC5mcm9tX2x3cl9jYXRbLDNdKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFMgPSBTWywxXSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFIubmV3PSByb3VuZChSLm5ld1ssMV0sMiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9iLkZpbmFscz0gcGFzdGUocm91bmQoUHJvYi5GaW5hbHMqMTAwLDEpLCIlIiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9iLnBvZGl1bSA9IHBhc3RlKHJvdW5kKFByb2IucG9kaXVtKjEwMCwgMSksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlIikgDQogICAgICAgICAgICAgICAgICAgICAgICAgICApKQ0KDQojIyMjDQplbG8ubGFzdC5jb21wLm5ldyA8LSBlbG8ubGFzdC5jb21wLm5ldyAlPiUgcmJpbmQoZWxvLmxhc3QuY29tcC5uZXcuZGVidXQsIGVsby5sYXN0LmNvbXAubmV3LmRlYnV0Lmx3cl9jYXQpDQoNCg0KIyMjIyMgIyMjIyMjIyMjIw0Ka25pdHI6OmthYmxlKGVsby5sYXN0LmNvbXAubmV3W29yZGVyKGVsby5sYXN0LmNvbXAubmV3JHJlc3VsdHMpLGMoMSwyLDMsNCw2LDcsOCldKQ0KDQpgYGAgIA0KDQojIyMjI18gRWxvIEhpc3RvcnkgXw0KYGBge3J9DQojIyANCmNvbXBlPSAiMjAyMy4xIg0KZWxvLmhpc3RvcnkubGFzdCA8LSBlbG8ubGFzdC5jb21wLm5ldyAlPiUgDQogIG11dGF0ZShjb21wID0gcmVwKGNvbXBlLCBsZW5ndGgoZWxvLmxhc3QuY29tcC5uZXckY29tcGV0aXRvcikpLA0KICAgICAgICAgY2F0ZWcgPSByZXAoIlN1YjE2TSIsIGxlbmd0aChlbG8ubGFzdC5jb21wLm5ldyRjb21wZXRpdG9yKSkpDQoNCiMNCmVsby5oaXN0b3J5IDwtIGVsby5oaXN0b3J5ICU+JSByYmluZChlbG8uaGlzdG9yeS5sYXN0KQ0KDQojIHRpbWUtc2VyaWVzIGRhdGEuZnJhbWUNCiMjIHN1YjE2TQ0KZWxvLmhpc3RvcnkudF9zZXJpZXMuUzE2TSA8LSANCiAgYXNfdGliYmxlKGVsby5oaXN0b3J5ICU+JQ0KICAgICAgICAgICAgICBmaWx0ZXIoY2F0ZWc9PSJTdWIxNk0iKSAlPiUNCiAgICAgICAgICAgICAgcmVzaGFwZTI6OmRjYXN0KGZvcm11bGEgPSBjb21wZXRpdG9yfmNvbXAsIHZhbHVlLnZhciA9ICJSLm5ldyIpKSANCiMjIA0KDQpgYGAgIA0KDQoNCiMjIyBFbG8gaW4gdGltZQ0KYGBge3IgaW5jbHVkZT1UUlVFLCBmaWcud2lkdGg9IDl9DQpwIDwtIGVsby5oaXN0b3J5ICU+JSANCiAgZmlsdGVyKGNhdGVnPT0iU3ViMTZNIiwgUi5uZXc+PTApICU+JQ0KICBnZ3Bsb3QoYWVzKHg9IGNvbXAsIHk9IFIubmV3LCBncm91cCA9IGNvbXBldGl0b3IsIGNvbCA9IFRlYW0pKSArIA0KICBnZW9tX3BvaW50KCkgKyANCiAgZ2VvbV9saW5lKGxpbmV0eXBlPSAiZGFzaGVkIikgKyANCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0PTEwMDAsbGluZXR5cGU9ICJkYXNoZWQiKQ0KDQojcA0KZ2dwbG90bHkocCkNCmBgYCAgDQoNCg0KDQojIyMgKipFbG8gQWNjdW11bGF0ZWQgRmlyc3RfMjAyMyoqICANCg0KYGBge3IgZXZhbD1GQUxTRSwgaW5jbHVkZT1UUlVFfQ0KZWxvLmxhc3QuYWNjdW0NCmVsby5sYXN0LmNvbXAubmV3DQpgYGANCg0KYGBge3IgZXZhbD1UUlVFLCBpbmNsdWRlPVRSVUUsIGNvbHMucHJpbnQ9N30NCg0KZWxvLmxhc3QuYWNjdW1fbGFzdC5jb21wX2Fic2VudCA8LSBlbG8ubGFzdC5hY2N1bSAlPiUgYW50aV9qb2luKGVsby5sYXN0LmNvbXAubmV3LGJ5PSJjb21wZXRpdG9yIikNCg0KZWxvLmxhc3QuYWNjdW0gPC0gZWxvLmxhc3QuY29tcC5uZXcgJT4lIHJiaW5kKGVsby5sYXN0LmFjY3VtX2xhc3QuY29tcF9hYnNlbnQpDQplbG8ubGFzdC5hY2N1bSA8LSBlbG8ubGFzdC5hY2N1bVtvcmRlcihlbG8ubGFzdC5hY2N1bSRjb21wZXRpdG9yKSxdDQojDQprbml0cjo6a2FibGUoZWxvLmxhc3QuYWNjdW1bb3JkZXIoZWxvLmxhc3QuYWNjdW0kUi5uZXcsIGRlY3JlYXNpbmcgPSBUUlVFKSxjKDEsMiw2LDcsOCldKQ0KYGBgICANCg0KIyMjIDIwMjMgU2Vjb25kICANCg0KYGBge3IgaW5jbHVkZT1UUlVFfQ0KYmxvYy5TdWIxNk1bb3JkZXIoYmxvYy5TdWIxNk0kZS5ibG9jLnNlYy4yMyksIGMoMSwyLDYsNyldICU+JSBwcmludChuPTY1KQ0KYGBgICANCg0KIyMjIEVsbyBTZWNvbmQgMjAyMyANCiotQ29tcGV0aXRvcnMgPSBgciBjb21wZXRpdG9ycy5lYC0qDQoNCmBgYHtyIGV2YWw9VFJVRSxpbmNsdWRlPUZBTFNFfQ0KbGFzdC5jb21wIDwtIGJsb2MuU3ViMTZNWyxjKDEsMiw3KV0gJT4lIGZpbHRlcihibG9jLlN1YjE2TSRlLmJsb2Muc2VjLjIzIT0iTkEiKSANCiMNCmxhc3RfY29tcF9kZWJ1dCA8LSBsYXN0LmNvbXAgJT4lIGFudGlfam9pbihlbG8ubGFzdC5hY2N1bSwgYnk9ImNvbXBldGl0b3IiKQ0KYGBgDQoNCg0KDQpgYGB7ciBldmFsPSBUUlVFLGluY2x1ZGU9RkFMU0UsIGNvbHMucHJpbnQ9IDd9DQojIyMgRUxPICMjIyMjIyMjIyMjIyMjIyMjDQojIyMgIyMgRUxPIChOQVNDQVIpICMjIyMjIyMjIyMjIyMNCm4uZGVidXQgPSBsZW5ndGgobGFzdF9jb21wX2RlYnV0JGNvbXBldGl0b3IpDQojIyMNCmxhc3QuY29tcC5jYWxjIDwtIGxhc3QuY29tcCAlPiUgcmlnaHRfam9pbihlbG8ubGFzdC5hY2N1bSwgYnk9ImNvbXBldGl0b3IiKQ0KIyMjDQpOIDwtIGxlbmd0aChsYXN0LmNvbXAuY2FsYyRjb21wZXRpdG9yWyFpcy5uYShsYXN0LmNvbXAuY2FsY1ssM10pXSkNClIgPC0gbGFzdC5jb21wLmNhbGMkUi5uZXdbIWlzLm5hKGxhc3QuY29tcC5jYWxjWywzXSldDQpuYW1lcyA8LSBsYXN0LmNvbXAuY2FsY1shaXMubmEobGFzdC5jb21wLmNhbGNbLDNdKSwxXQ0KVGVhbSA8LSBsYXN0LmNvbXAuY2FsYyRUZWFtLnhbIWlzLm5hKGxhc3QuY29tcC5jYWxjWywzXSldDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMNCnJlc3VsdHMgPC0gbGFzdC5jb21wLmNhbGNbIWlzLm5hKGxhc3QuY29tcC5jYWxjWywzXSksM10NCnJlc3VsdHMgPC0gKHVubGlzdChyZXN1bHRzKSkNCnN0ZGV2IDwtIHNkKGMoMTooTituLmRlYnV0KSkpDQojDQphdmcucGxheWVyIDwtIG1lZGlhbihjKFIsIHJlcCgxMDAwLCBuLmRlYnV0ICkpKQ0KbWVkaWFuYSA8LSBtZWRpYW4odW5saXN0KGxhc3QuY29tcFshaXMubmEobGFzdC5jb21wWywzXSksM10pKQ0KbWF4LnN0ZCA8LSAobWVkaWFuYS0xKS9zdGRldg0KIyMjIyMjIyMjIyMjIyMjIyMjDQpTIDwtICgobWVkaWFuYSAtIHVubGlzdChsYXN0LmNvbXAuY2FsY1shaXMubmEobGFzdC5jb21wLmNhbGNbLDNdKSwzXSkgKSAvIHN0ZGV2KSAvIG1heC5zdGQNCkQgPSA0MDANCmsgPSAzMg0KRSA8LSAxLygxKygxMF4oIChhdmcucGxheWVyLVIpL0QgKSkpDQpSLm5ldyA8LSBSICsgKGsgKiAoUyAtICgoMipFKS9OKSApICkNCiMNCm1heC5jdXQuZmluYWxzIDwtIChzdGRldi05KS9zdGRldg0KUHJvYi5GaW5hbHMgPC0gMS8oMSsoMTBeKCAoIHNvcnQoUi5uZXcsIGRlY3JlYXNpbmcgPSBUUlVFKVs5XSAtUi5uZXcpL0QgKSkpDQptYXguY3V0LnBvZGl1bSA8LSAoc3RkZXYtNCkvc3RkZXYNClByb2IucG9kaXVtIDwtIDEvKDErKDEwXiggKCBzb3J0KFIubmV3LCBkZWNyZWFzaW5nID0gVFJVRSlbNF0gLVIubmV3KS9EICkpKQ0KIyMjDQplbG8ubGFzdC5jb21wLm5ldyA8LSBjYmluZChuYW1lcyA9IG5hbWVzLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVhbT0gVGVhbSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFIgPSBSLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cyA9IHJlc3VsdHMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBTID0gUywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFIubmV3PSByb3VuZChSLm5ldywyKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2IuRmluYWxzPSBwYXN0ZShyb3VuZChQcm9iLkZpbmFscyoxMDAsIDEpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlIiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9iLnBvZGl1bSA9IHBhc3RlKHJvdW5kKFByb2IucG9kaXVtKjEwMCwxKSwgIiUiICkgDQogICAgICAgICAgICAgICAgICAgICAgICAgICApDQplbG8ubGFzdC5jb21wLm5ldyA8LSBhc190aWJibGUoZWxvLmxhc3QuY29tcC5uZXcpDQojIyMjIyMjIyMjIw0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIyMgIyMgRUxPIChOQVNDQVIpICMjIyMjIyMjIyMjIyMNCm4gPSBsZW5ndGgobGFzdF9jb21wX2RlYnV0JGNvbXBldGl0b3IpDQpOIDwtIGxlbmd0aCh1bmxpc3QobGFzdC5jb21wWyFpcy5uYShsYXN0LmNvbXBbLDNdKSwzXSkpDQpSLmRlYnV0IDwtIHJlcCgxMDAwLCBuKQ0KbmFtZXMgPC0gbGFzdF9jb21wX2RlYnV0WywxXQ0KVGVhbSA8LSBsYXN0X2NvbXBfZGVidXQkVGVhbQ0KI2NhdGVnIDwtIGJsb2MuU3ViMTRNLmFfYg0KUyA8LSAoKG1lZGlhbmEgLSBsYXN0X2NvbXBfZGVidXRbLDNdKSAvIHN0ZGV2KSAvIG1heC5zdGQNCkUgPC0gMS8oMSsoMTBeKCAoYXZnLnBsYXllci1SLmRlYnV0KS9EICkpKQ0KUi5uZXcgPC0gUi5kZWJ1dCArIChrICogKFMgLSAoKDIqRSkvTikgKSApDQojDQptYXguY3V0LmZpbmFscyA8LSAoc3RkZXYtOSkvc3RkZXYNClByb2IuRmluYWxzIDwtIDEvKDErKDEwXiggKCBzb3J0KGVsby5sYXN0LmNvbXAubmV3JFIubmV3LCBkZWNyZWFzaW5nID0gVFJVRSlbOV0gLSBSLm5ld1ssMV0pL0QgKSkpDQptYXguY3V0LnBvZGl1bSA8LSAoc3RkZXYtNCkvc3RkZXYNClByb2IucG9kaXVtIDwtIDEvKDErKDEwXiggKCBzb3J0KGVsby5sYXN0LmNvbXAubmV3JFIubmV3LCBkZWNyZWFzaW5nID0gVFJVRSlbNF0gLVIubmV3WywxXSkvRCApKSkNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQplbG8ubGFzdC5jb21wLm5ldy5kZWJ1dCA8LSBhc190aWJibGUoY2JpbmQobmFtZXMgPSBuYW1lcywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlYW09IFRlYW0sDQogICAgICAgICAgICAgICAgICAgICAgICAgICBSID0gUi5kZWJ1dCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMgPSB1bmxpc3QobGFzdF9jb21wX2RlYnV0WywzXSksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBTID0gU1ssMV0sDQogICAgICAgICAgICAgICAgICAgICAgICAgICBSLm5ldz0gcm91bmQoUi5uZXdbLDFdLDIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvYi5GaW5hbHM9IHBhc3RlKHJvdW5kKFByb2IuRmluYWxzKjEwMCwxKSwiJSIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvYi5wb2RpdW0gPSBwYXN0ZShyb3VuZChQcm9iLnBvZGl1bSoxMDAsIDEpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJSIpIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgKSkNCg0KDQplbG8ubGFzdC5jb21wLm5ldyA8LSBlbG8ubGFzdC5jb21wLm5ldyAlPiUgcmJpbmQoZWxvLmxhc3QuY29tcC5uZXcuZGVidXQpDQoNCg0KIyMjIyMgIyMjIyMjIyMjIw0Ka25pdHI6OmthYmxlKGVsby5sYXN0LmNvbXAubmV3W29yZGVyKGVsby5sYXN0LmNvbXAubmV3JHJlc3VsdHMpLGMoMSwyLDMsNCw2LDcsOCldKQ0KDQpgYGAgIA0KDQojIyMjI18gRWxvIEhpc3RvcnkgXw0KYGBge3J9DQojIyANCmNvbXBlPSAiMjAyMy4yIg0KZWxvLmhpc3RvcnkubGFzdCA8LSBlbG8ubGFzdC5jb21wLm5ldyAlPiUgDQogIG11dGF0ZShjb21wID0gcmVwKGNvbXBlLCBsZW5ndGgoZWxvLmxhc3QuY29tcC5uZXckY29tcGV0aXRvcikpLA0KICAgICAgICAgY2F0ZWcgPSByZXAoIlN1YjE2TSIsIGxlbmd0aChlbG8ubGFzdC5jb21wLm5ldyRjb21wZXRpdG9yKSkpDQoNCiMNCmVsby5oaXN0b3J5IDwtIGVsby5oaXN0b3J5ICU+JSByYmluZChlbG8uaGlzdG9yeS5sYXN0KQ0KDQojIHRpbWUtc2VyaWVzIGRhdGEuZnJhbWUNCiMjIHN1YjE2TQ0KZWxvLmhpc3RvcnkudF9zZXJpZXMuUzE2TSA8LSANCiAgYXNfdGliYmxlKGVsby5oaXN0b3J5ICU+JQ0KICAgICAgICAgICAgICBmaWx0ZXIoY2F0ZWc9PSJTdWIxNk0iKSAlPiUNCiAgICAgICAgICAgICAgcmVzaGFwZTI6OmRjYXN0KGZvcm11bGEgPSBjb21wZXRpdG9yfmNvbXAsIHZhbHVlLnZhciA9ICJSLm5ldyIpKSANCiMjIA0KDQpgYGAgIA0KDQojIyMgRWxvIGluIHRpbWUNCmBgYHtyIGluY2x1ZGU9VFJVRSwgZmlnLndpZHRoPSAxNn0NCnAgPC0gZWxvLmhpc3RvcnkgJT4lIA0KICBmaWx0ZXIoY2F0ZWc9PSJTdWIxNk0iLCBSLm5ldz49MCkgJT4lDQogIGdncGxvdChhZXMoeD0gY29tcCwgeT0gUi5uZXcsIGdyb3VwID0gY29tcGV0aXRvciwgY29sID0gVGVhbSkpICsgDQogIGdlb21fcG9pbnQoKSArIA0KICBnZW9tX2xpbmUobGluZXR5cGU9ICJkYXNoZWQiKSArIA0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQ9MTAwMCxsaW5ldHlwZT0gImRhc2hlZCIpDQoNCiNwDQpnZ3Bsb3RseShwKQ0KYGBgICANCg0KDQojIyMgKipFbG8gQWNjdW11bGF0ZWQgU2Vjb25kXzIwMjMqKg0KYGBge3IgZXZhbD1GQUxTRSwgaW5jbHVkZT1UUlVFfQ0KZWxvLmxhc3QuYWNjdW0NCmVsby5sYXN0LmNvbXAubmV3DQpgYGANCg0KYGBge3IgZXZhbD1UUlVFLCBpbmNsdWRlPVRSVUUsIGNvbHMucHJpbnQ9N30NCg0KZWxvLmxhc3QuYWNjdW1fbGFzdC5jb21wX2Fic2VudCA8LSBlbG8ubGFzdC5hY2N1bSAlPiUgYW50aV9qb2luKGVsby5sYXN0LmNvbXAubmV3LGJ5PSJjb21wZXRpdG9yIikNCg0KZWxvLmxhc3QuYWNjdW0gPC0gZWxvLmxhc3QuY29tcC5uZXcgJT4lIHJiaW5kKGVsby5sYXN0LmFjY3VtX2xhc3QuY29tcF9hYnNlbnQpDQplbG8ubGFzdC5hY2N1bSA8LSBlbG8ubGFzdC5hY2N1bVtvcmRlcihlbG8ubGFzdC5hY2N1bSRjb21wZXRpdG9yKSxdDQojDQprbml0cjo6a2FibGUoZWxvLmxhc3QuYWNjdW1bb3JkZXIoZWxvLmxhc3QuYWNjdW0kUi5uZXcsIGRlY3JlYXNpbmcgPSBUUlVFKSxjKDEsMiw2LDcsOCldKQ0KYGBgICANCg0KIyMjIDIwMjMgVGhpcmQgIA0KDQpgYGB7ciBpbmNsdWRlPVRSVUV9DQpibG9jLlN1YjE2TVtvcmRlcihibG9jLlN1YjE2TSRmLmJsb2MudGhyZC4yMyksIGMoMSwyLDYsNyw4KV0gJT4lIHByaW50KG49NjUpDQpgYGAgIA0KDQojIyMgRWxvIFRoaXJkIDIwMjMgDQoqLUNvbXBldGl0b3JzID0gYHIgY29tcGV0aXRvcnMuZWAtKg0KDQpgYGB7ciBldmFsPVRSVUUsaW5jbHVkZT1GQUxTRX0NCmxhc3QuY29tcCA8LSBibG9jLlN1YjE2TVssYygxLDIsOCldICU+JSBmaWx0ZXIoYmxvYy5TdWIxNk0kZi5ibG9jLnRocmQuMjMhPSJOQSIpIA0KIw0KbGFzdF9jb21wX2RlYnV0IDwtIGxhc3QuY29tcCAlPiUgYW50aV9qb2luKGVsby5sYXN0LmFjY3VtLCBieT0iY29tcGV0aXRvciIpDQpgYGANCg0KYGBge3IgZXZhbD0gVFJVRSxpbmNsdWRlPUZBTFNFLCBjb2xzLnByaW50PSA3fQ0KIyMjIEVMTyAjIyMjIyMjIyMjIyMjIyMjIw0KIyMjICMjIEVMTyAoTkFTQ0FSKSAjIyMjIyMjIyMjIyMjDQpuLmRlYnV0ID0gbGVuZ3RoKGxhc3RfY29tcF9kZWJ1dCRjb21wZXRpdG9yKQ0KIyMjDQpsYXN0LmNvbXAuY2FsYyA8LSBsYXN0LmNvbXAgJT4lIHJpZ2h0X2pvaW4oZWxvLmxhc3QuYWNjdW0sIGJ5PSJjb21wZXRpdG9yIikNCiMjIw0KTiA8LSBsZW5ndGgobGFzdC5jb21wLmNhbGMkY29tcGV0aXRvclshaXMubmEobGFzdC5jb21wLmNhbGNbLDNdKV0pDQpSIDwtIGxhc3QuY29tcC5jYWxjJFIubmV3WyFpcy5uYShsYXN0LmNvbXAuY2FsY1ssM10pXQ0KbmFtZXMgPC0gbGFzdC5jb21wLmNhbGNbIWlzLm5hKGxhc3QuY29tcC5jYWxjWywzXSksMV0NClRlYW0gPC0gbGFzdC5jb21wLmNhbGMkVGVhbS54WyFpcy5uYShsYXN0LmNvbXAuY2FsY1ssM10pXQ0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQpyZXN1bHRzIDwtIGxhc3QuY29tcC5jYWxjWyFpcy5uYShsYXN0LmNvbXAuY2FsY1ssM10pLDNdDQpyZXN1bHRzIDwtICh1bmxpc3QocmVzdWx0cykpDQpzdGRldiA8LSBzZChjKDE6KE4rbi5kZWJ1dCkpKQ0KIw0KYXZnLnBsYXllciA8LSBtZWRpYW4oYyhSLCByZXAoMTAwMCwgbi5kZWJ1dCApKSkNCm1lZGlhbmEgPC0gbWVkaWFuKHVubGlzdChsYXN0LmNvbXBbIWlzLm5hKGxhc3QuY29tcFssM10pLDNdKSkNCm1heC5zdGQgPC0gKG1lZGlhbmEtMSkvc3RkZXYNCiMjIyMjIyMjIyMjIyMjIyMjIw0KUyA8LSAoKG1lZGlhbmEgLSB1bmxpc3QobGFzdC5jb21wLmNhbGNbIWlzLm5hKGxhc3QuY29tcC5jYWxjWywzXSksM10pICkgLyBzdGRldikgLyBtYXguc3RkDQpEID0gNDAwDQprID0gMzINCkUgPC0gMS8oMSsoMTBeKCAoYXZnLnBsYXllci1SKS9EICkpKQ0KUi5uZXcgPC0gUiArIChrICogKFMgLSAoKDIqRSkvTikgKSApDQojDQptYXguY3V0LmZpbmFscyA8LSAoc3RkZXYtOSkvc3RkZXYNClByb2IuRmluYWxzIDwtIDEvKDErKDEwXiggKCBzb3J0KFIubmV3LCBkZWNyZWFzaW5nID0gVFJVRSlbOV0gLVIubmV3KS9EICkpKQ0KbWF4LmN1dC5wb2RpdW0gPC0gKHN0ZGV2LTQpL3N0ZGV2DQpQcm9iLnBvZGl1bSA8LSAxLygxKygxMF4oICggc29ydChSLm5ldywgZGVjcmVhc2luZyA9IFRSVUUpWzRdIC1SLm5ldykvRCApKSkNCiMjIw0KZWxvLmxhc3QuY29tcC5uZXcgPC0gY2JpbmQobmFtZXMgPSBuYW1lcywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlYW09IFRlYW0sDQogICAgICAgICAgICAgICAgICAgICAgICAgICBSID0gUiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMgPSByZXN1bHRzLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgUyA9IFMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBSLm5ldz0gcm91bmQoUi5uZXcsMiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9iLkZpbmFscz0gcGFzdGUocm91bmQoUHJvYi5GaW5hbHMqMTAwLCAxKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJSIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvYi5wb2RpdW0gPSBwYXN0ZShyb3VuZChQcm9iLnBvZGl1bSoxMDAsMSksICIlIiApIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgKQ0KZWxvLmxhc3QuY29tcC5uZXcgPC0gYXNfdGliYmxlKGVsby5sYXN0LmNvbXAubmV3KQ0KIyMjIyMjIyMjIyMNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyMjICMjIEVMTyAoTkFTQ0FSKSAjIyMjIyMjIyMjIyMjDQpuID0gbGVuZ3RoKGxhc3RfY29tcF9kZWJ1dCRjb21wZXRpdG9yKQ0KTiA8LSBsZW5ndGgodW5saXN0KGxhc3QuY29tcFshaXMubmEobGFzdC5jb21wWywzXSksM10pKQ0KUi5kZWJ1dCA8LSByZXAoMTAwMCwgbikNCm5hbWVzIDwtIGxhc3RfY29tcF9kZWJ1dFssMV0NClRlYW0gPC0gbGFzdF9jb21wX2RlYnV0JFRlYW0NCiNjYXRlZyA8LSBibG9jLlN1YjE0TS5hX2INClMgPC0gKChtZWRpYW5hIC0gbGFzdF9jb21wX2RlYnV0WywzXSkgLyBzdGRldikgLyBtYXguc3RkDQpFIDwtIDEvKDErKDEwXiggKGF2Zy5wbGF5ZXItUi5kZWJ1dCkvRCApKSkNClIubmV3IDwtIFIuZGVidXQgKyAoayAqIChTIC0gKCgyKkUpL04pICkgKQ0KIw0KbWF4LmN1dC5maW5hbHMgPC0gKHN0ZGV2LTkpL3N0ZGV2DQpQcm9iLkZpbmFscyA8LSAxLygxKygxMF4oICggc29ydChlbG8ubGFzdC5jb21wLm5ldyRSLm5ldywgZGVjcmVhc2luZyA9IFRSVUUpWzldIC0gUi5uZXdbLDFdKS9EICkpKQ0KbWF4LmN1dC5wb2RpdW0gPC0gKHN0ZGV2LTQpL3N0ZGV2DQpQcm9iLnBvZGl1bSA8LSAxLygxKygxMF4oICggc29ydChlbG8ubGFzdC5jb21wLm5ldyRSLm5ldywgZGVjcmVhc2luZyA9IFRSVUUpWzRdIC1SLm5ld1ssMV0pL0QgKSkpDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KZWxvLmxhc3QuY29tcC5uZXcuZGVidXQgPC0gYXNfdGliYmxlKGNiaW5kKG5hbWVzID0gbmFtZXMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBUZWFtPSBUZWFtLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgUiA9IFIuZGVidXQsDQogICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzID0gdW5saXN0KGxhc3RfY29tcF9kZWJ1dFssM10pLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgUyA9IFNbLDFdLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgUi5uZXc9IHJvdW5kKFIubmV3WywxXSwyKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2IuRmluYWxzPSBwYXN0ZShyb3VuZChQcm9iLkZpbmFscyoxMDAsMSksIiUiKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2IucG9kaXVtID0gcGFzdGUocm91bmQoUHJvYi5wb2RpdW0qMTAwLCAxKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiUiKSANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICkpDQoNCg0KZWxvLmxhc3QuY29tcC5uZXcgPC0gZWxvLmxhc3QuY29tcC5uZXcgJT4lIHJiaW5kKGVsby5sYXN0LmNvbXAubmV3LmRlYnV0KQ0KDQoNCiMjIyMjICMjIyMjIyMjIyMNCmtuaXRyOjprYWJsZShlbG8ubGFzdC5jb21wLm5ld1tvcmRlcihlbG8ubGFzdC5jb21wLm5ldyRyZXN1bHRzKSxjKDEsMiwzLDQsNiw3LDgpXSkNCg0KYGBgICANCg0KIyMjIyNfIEVsbyBIaXN0b3J5IF8NCmBgYHtyfQ0KIyMgDQpjb21wZT0gIjIwMjMuMyINCmVsby5oaXN0b3J5Lmxhc3QgPC0gZWxvLmxhc3QuY29tcC5uZXcgJT4lIA0KICBtdXRhdGUoY29tcCA9IHJlcChjb21wZSwgbGVuZ3RoKGVsby5sYXN0LmNvbXAubmV3JGNvbXBldGl0b3IpKSwNCiAgICAgICAgIGNhdGVnID0gcmVwKCJTdWIxNk0iLCBsZW5ndGgoZWxvLmxhc3QuY29tcC5uZXckY29tcGV0aXRvcikpKQ0KDQojDQplbG8uaGlzdG9yeSA8LSBlbG8uaGlzdG9yeSAlPiUgcmJpbmQoZWxvLmhpc3RvcnkubGFzdCkNCg0KIyB0aW1lLXNlcmllcyBkYXRhLmZyYW1lDQojIyBzdWIxNk0NCmVsby5oaXN0b3J5LnRfc2VyaWVzLlMxNk0gPC0gDQogIGFzX3RpYmJsZShlbG8uaGlzdG9yeSAlPiUNCiAgICAgICAgICAgICAgZmlsdGVyKGNhdGVnPT0iU3ViMTZNIikgJT4lDQogICAgICAgICAgICAgIHJlc2hhcGUyOjpkY2FzdChmb3JtdWxhID0gY29tcGV0aXRvcn5jb21wLCB2YWx1ZS52YXIgPSAiUi5uZXciKSkgDQojIyANCg0KYGBgICANCg0KIyMjIEVsbyBpbiB0aW1lDQpgYGB7ciBpbmNsdWRlPVRSVUUsIGZpZy53aWR0aD0gMTZ9DQpwIDwtIGVsby5oaXN0b3J5ICU+JSANCiAgZmlsdGVyKGNhdGVnPT0iU3ViMTZNIiwgUi5uZXc+PTApICU+JQ0KICBnZ3Bsb3QoYWVzKHg9IGNvbXAsIHk9IFIubmV3LCBncm91cCA9IGNvbXBldGl0b3IsIGNvbCA9IFRlYW0pKSArIA0KICBnZW9tX3BvaW50KCkgKyANCiAgZ2VvbV9saW5lKGxpbmV0eXBlPSAiZGFzaGVkIikgKyANCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0PTEwMDAsbGluZXR5cGU9ICJkYXNoZWQiKQ0KDQojcA0KZ2dwbG90bHkocCkNCmBgYCAgDQoNCg0KIyMjICoqRWxvIEFjY3VtdWxhdGVkIFRoaXJkXzIwMjMqKg0KYGBge3IgZXZhbD1GQUxTRSwgaW5jbHVkZT1UUlVFfQ0KZWxvLmxhc3QuYWNjdW0NCmVsby5sYXN0LmNvbXAubmV3DQpgYGANCg0KYGBge3IgZXZhbD1UUlVFLCBpbmNsdWRlPVRSVUUsIGNvbHMucHJpbnQ9N30NCg0KZWxvLmxhc3QuYWNjdW1fbGFzdC5jb21wX2Fic2VudCA8LSBlbG8ubGFzdC5hY2N1bSAlPiUgYW50aV9qb2luKGVsby5sYXN0LmNvbXAubmV3LGJ5PSJjb21wZXRpdG9yIikNCg0KZWxvLmxhc3QuYWNjdW0gPC0gZWxvLmxhc3QuY29tcC5uZXcgJT4lIHJiaW5kKGVsby5sYXN0LmFjY3VtX2xhc3QuY29tcF9hYnNlbnQpDQplbG8ubGFzdC5hY2N1bSA8LSBlbG8ubGFzdC5hY2N1bVtvcmRlcihlbG8ubGFzdC5hY2N1bSRjb21wZXRpdG9yKSxdDQojDQprbml0cjo6a2FibGUoZWxvLmxhc3QuYWNjdW1bb3JkZXIoZWxvLmxhc3QuYWNjdW0kUi5uZXcsIGRlY3JlYXNpbmcgPSBUUlVFKSxjKDEsMiw2LDcsOCldKQ0KYGBgICAgDQoNCiMjIyAyMDIzIENBTVAgIA0KDQpgYGB7ciBpbmNsdWRlPVRSVUV9DQpibG9jLlN1YjE2TVtvcmRlcihibG9jLlN1YjE2TSRnLmJsb2MuY2FtcC4yMyksIGMoMSwyLDcsOCw5KV0gJT4lIHByaW50KG49NjUpDQpgYGAgIA0KDQojIyMgRWxvIENBTVAgMjAyMyANCiotQ29tcGV0aXRvcnMgPSBgciBjb21wZXRpdG9ycy5lYC0qDQoNCmBgYHtyIGV2YWw9VFJVRSxpbmNsdWRlPUZBTFNFfQ0KbGFzdC5jb21wIDwtIGJsb2MuU3ViMTZNWyxjKDEsMiw5KV0gJT4lIGZpbHRlcihibG9jLlN1YjE2TSRnLmJsb2MuY2FtcC4yMyE9Ik5BIikgDQojDQpsYXN0X2NvbXBfZGVidXQgPC0gbGFzdC5jb21wICU+JSBhbnRpX2pvaW4oZWxvLmxhc3QuYWNjdW0sIGJ5PSJjb21wZXRpdG9yIikNCmBgYA0KDQoNCmBgYHtyIGV2YWw9IFRSVUUsaW5jbHVkZT1GQUxTRSwgY29scy5wcmludD0gN30NCiMjIyBFTE8gIyMjIyMjIyMjIyMjIyMjIyMNCiMjIyAjIyBFTE8gKE5BU0NBUikgIyMjIyMjIyMjIyMjIw0Kbi5kZWJ1dCA9IGxlbmd0aChsYXN0X2NvbXBfZGVidXQkY29tcGV0aXRvcikNCiMjIw0KbGFzdC5jb21wLmNhbGMgPC0gbGFzdC5jb21wICU+JSByaWdodF9qb2luKGVsby5sYXN0LmFjY3VtLCBieT0iY29tcGV0aXRvciIpDQojIyMNCk4gPC0gbGVuZ3RoKGxhc3QuY29tcC5jYWxjJGNvbXBldGl0b3JbIWlzLm5hKGxhc3QuY29tcC5jYWxjWywzXSldKQ0KUiA8LSBsYXN0LmNvbXAuY2FsYyRSLm5ld1shaXMubmEobGFzdC5jb21wLmNhbGNbLDNdKV0NCm5hbWVzIDwtIGxhc3QuY29tcC5jYWxjWyFpcy5uYShsYXN0LmNvbXAuY2FsY1ssM10pLDFdDQpUZWFtIDwtIGxhc3QuY29tcC5jYWxjJFRlYW0ueFshaXMubmEobGFzdC5jb21wLmNhbGNbLDNdKV0NCiMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KcmVzdWx0cyA8LSBsYXN0LmNvbXAuY2FsY1shaXMubmEobGFzdC5jb21wLmNhbGNbLDNdKSwzXQ0KcmVzdWx0cyA8LSAodW5saXN0KHJlc3VsdHMpKQ0Kc3RkZXYgPC0gc2QoYygxOihOK24uZGVidXQpKSkNCiMNCmF2Zy5wbGF5ZXIgPC0gbWVkaWFuKGMoUiwgcmVwKDEwMDAsIG4uZGVidXQgKSkpDQptZWRpYW5hIDwtIG1lZGlhbih1bmxpc3QobGFzdC5jb21wWyFpcy5uYShsYXN0LmNvbXBbLDNdKSwzXSkpDQptYXguc3RkIDwtIChtZWRpYW5hLTEpL3N0ZGV2DQojIyMjIyMjIyMjIyMjIyMjIyMNClMgPC0gKChtZWRpYW5hIC0gdW5saXN0KGxhc3QuY29tcC5jYWxjWyFpcy5uYShsYXN0LmNvbXAuY2FsY1ssM10pLDNdKSApIC8gc3RkZXYpIC8gbWF4LnN0ZA0KRCA9IDQwMA0KayA9IDMyDQpFIDwtIDEvKDErKDEwXiggKGF2Zy5wbGF5ZXItUikvRCApKSkNClIubmV3IDwtIFIgKyAoayAqIChTIC0gKCgyKkUpL04pICkgKQ0KIw0KbWF4LmN1dC5maW5hbHMgPC0gKHN0ZGV2LTkpL3N0ZGV2DQpQcm9iLkZpbmFscyA8LSAxLygxKygxMF4oICggc29ydChSLm5ldywgZGVjcmVhc2luZyA9IFRSVUUpWzldIC1SLm5ldykvRCApKSkNCm1heC5jdXQucG9kaXVtIDwtIChzdGRldi00KS9zdGRldg0KUHJvYi5wb2RpdW0gPC0gMS8oMSsoMTBeKCAoIHNvcnQoUi5uZXcsIGRlY3JlYXNpbmcgPSBUUlVFKVs0XSAtUi5uZXcpL0QgKSkpDQojIyMNCmVsby5sYXN0LmNvbXAubmV3IDwtIGNiaW5kKG5hbWVzID0gbmFtZXMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBUZWFtPSBUZWFtLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgUiA9IFIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzID0gcmVzdWx0cywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFMgPSBTLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgUi5uZXc9IHJvdW5kKFIubmV3LDIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvYi5GaW5hbHM9IHBhc3RlKHJvdW5kKFByb2IuRmluYWxzKjEwMCwgMSksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiUiKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2IucG9kaXVtID0gcGFzdGUocm91bmQoUHJvYi5wb2RpdW0qMTAwLDEpLCAiJSIgKSANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICkNCmVsby5sYXN0LmNvbXAubmV3IDwtIGFzX3RpYmJsZShlbG8ubGFzdC5jb21wLm5ldykNCiMjIyMjIyMjIyMjDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMjIyAjIyBFTE8gKE5BU0NBUikgIyMjIyMjIyMjIyMjIw0KbiA9IGxlbmd0aChsYXN0X2NvbXBfZGVidXQkY29tcGV0aXRvcikNCk4gPC0gbGVuZ3RoKHVubGlzdChsYXN0LmNvbXBbIWlzLm5hKGxhc3QuY29tcFssM10pLDNdKSkNClIuZGVidXQgPC0gcmVwKDEwMDAsIG4pDQpuYW1lcyA8LSBsYXN0X2NvbXBfZGVidXRbLDFdDQpUZWFtIDwtIGxhc3RfY29tcF9kZWJ1dCRUZWFtDQojY2F0ZWcgPC0gYmxvYy5TdWIxNE0uYV9iDQpTIDwtICgobWVkaWFuYSAtIGxhc3RfY29tcF9kZWJ1dFssM10pIC8gc3RkZXYpIC8gbWF4LnN0ZA0KRSA8LSAxLygxKygxMF4oIChhdmcucGxheWVyLVIuZGVidXQpL0QgKSkpDQpSLm5ldyA8LSBSLmRlYnV0ICsgKGsgKiAoUyAtICgoMipFKS9OKSApICkNCiMNCm1heC5jdXQuZmluYWxzIDwtIChzdGRldi05KS9zdGRldg0KUHJvYi5GaW5hbHMgPC0gMS8oMSsoMTBeKCAoIHNvcnQoZWxvLmxhc3QuY29tcC5uZXckUi5uZXcsIGRlY3JlYXNpbmcgPSBUUlVFKVs5XSAtIFIubmV3WywxXSkvRCApKSkNCm1heC5jdXQucG9kaXVtIDwtIChzdGRldi00KS9zdGRldg0KUHJvYi5wb2RpdW0gPC0gMS8oMSsoMTBeKCAoIHNvcnQoZWxvLmxhc3QuY29tcC5uZXckUi5uZXcsIGRlY3JlYXNpbmcgPSBUUlVFKVs0XSAtUi5uZXdbLDFdKS9EICkpKQ0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCmVsby5sYXN0LmNvbXAubmV3LmRlYnV0IDwtIGFzX3RpYmJsZShjYmluZChuYW1lcyA9IG5hbWVzLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVhbT0gVGVhbSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFIgPSBSLmRlYnV0LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cyA9IHVubGlzdChsYXN0X2NvbXBfZGVidXRbLDNdKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFMgPSBTWywxXSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFIubmV3PSByb3VuZChSLm5ld1ssMV0sMiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9iLkZpbmFscz0gcGFzdGUocm91bmQoUHJvYi5GaW5hbHMqMTAwLDEpLCIlIiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9iLnBvZGl1bSA9IHBhc3RlKHJvdW5kKFByb2IucG9kaXVtKjEwMCwgMSksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlIikgDQogICAgICAgICAgICAgICAgICAgICAgICAgICApKQ0KDQoNCmVsby5sYXN0LmNvbXAubmV3IDwtIGVsby5sYXN0LmNvbXAubmV3ICU+JSByYmluZChlbG8ubGFzdC5jb21wLm5ldy5kZWJ1dCkNCg0KDQojIyMjIyAjIyMjIyMjIyMjDQprbml0cjo6a2FibGUoZWxvLmxhc3QuY29tcC5uZXdbb3JkZXIoZWxvLmxhc3QuY29tcC5uZXckcmVzdWx0cyksYygxLDIsMyw0LDYsNyw4KV0pDQoNCmBgYCAgDQoNCiMjIyMjXyBFbG8gSGlzdG9yeSBfDQpgYGB7cn0NCiMjIA0KY29tcGU9ICIyMDIzLmNhbXAiDQplbG8uaGlzdG9yeS5sYXN0IDwtIGVsby5sYXN0LmNvbXAubmV3ICU+JSANCiAgbXV0YXRlKGNvbXAgPSByZXAoY29tcGUsIGxlbmd0aChlbG8ubGFzdC5jb21wLm5ldyRjb21wZXRpdG9yKSksDQogICAgICAgICBjYXRlZyA9IHJlcCgiU3ViMTZNIiwgbGVuZ3RoKGVsby5sYXN0LmNvbXAubmV3JGNvbXBldGl0b3IpKSkNCg0KIw0KZWxvLmhpc3RvcnkgPC0gZWxvLmhpc3RvcnkgJT4lIHJiaW5kKGVsby5oaXN0b3J5Lmxhc3QpDQoNCiMgdGltZS1zZXJpZXMgZGF0YS5mcmFtZQ0KIyMgc3ViMTZNDQplbG8uaGlzdG9yeS50X3Nlcmllcy5TMTZNIDwtIA0KICBhc190aWJibGUoZWxvLmhpc3RvcnkgJT4lDQogICAgICAgICAgICAgIGZpbHRlcihjYXRlZz09IlN1YjE2TSIpICU+JQ0KICAgICAgICAgICAgICByZXNoYXBlMjo6ZGNhc3QoZm9ybXVsYSA9IGNvbXBldGl0b3J+Y29tcCwgdmFsdWUudmFyID0gIlIubmV3IikpIA0KIyMgDQoNCmBgYCAgDQoNCg0KIyMjIEVsbyBpbiB0aW1lDQpgYGB7ciBpbmNsdWRlPVRSVUUsIGZpZy53aWR0aD0gMTZ9DQpwIDwtIGVsby5oaXN0b3J5ICU+JSANCiAgZmlsdGVyKGNhdGVnPT0iU3ViMTZNIiwgUi5uZXc+PTApICU+JQ0KICBnZ3Bsb3QoYWVzKHg9IGNvbXAsIHk9IFIubmV3LCBncm91cCA9IGNvbXBldGl0b3IsIGNvbCA9IFRlYW0pKSArIA0KICBnZW9tX3BvaW50KCkgKyANCiAgZ2VvbV9saW5lKGxpbmV0eXBlPSAiZGFzaGVkIikgKyANCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0PTEwMDAsbGluZXR5cGU9ICJkYXNoZWQiKQ0KDQojcA0KZ2dwbG90bHkocCkNCmBgYA0KDQojIyMgKipFbG8gQWNjdW11bGF0ZWQgY2FtcF8yMDIzKioNCmBgYHtyIGV2YWw9VFJVRSwgaW5jbHVkZT1UUlVFfQ0KZWxvLmxhc3QuYWNjdW0NCmVsby5sYXN0LmNvbXAubmV3DQpgYGANCg0KYGBge3IgZXZhbD1UUlVFLCBpbmNsdWRlPVRSVUUsIGNvbHMucHJpbnQ9N30NCg0KZWxvLmxhc3QuYWNjdW1fbGFzdC5jb21wX2Fic2VudCA8LSBlbG8ubGFzdC5hY2N1bSAlPiUgYW50aV9qb2luKGVsby5sYXN0LmNvbXAubmV3LGJ5PSJjb21wZXRpdG9yIikNCg0KZWxvLmxhc3QuYWNjdW0gPC0gZWxvLmxhc3QuY29tcC5uZXcgJT4lIHJiaW5kKGVsby5sYXN0LmFjY3VtX2xhc3QuY29tcF9hYnNlbnQpDQplbG8ubGFzdC5hY2N1bSA8LSBlbG8ubGFzdC5hY2N1bVtvcmRlcihlbG8ubGFzdC5hY2N1bSRjb21wZXRpdG9yKSxdDQojDQprbml0cjo6a2FibGUoZWxvLmxhc3QuYWNjdW1bb3JkZXIoZWxvLmxhc3QuYWNjdW0kUi5uZXcsIGRlY3JlYXNpbmcgPSBUUlVFKSxjKDEsMiw2LDcsOCldKQ0KYGBgICAgDQoNCiMjIyogKipDYXB0dXJhbmRvIGxvcyBmdXR1cm9zIFN1YjE4KiogDQpgYGB7ciBlY2hvPVRSVUUsIGluY2x1ZGU9VFJVRX0NCmJsb2MuU3ViMThNLjI0IDwtIHJhbmtzICU+JQ0KICBmaWx0ZXIoc3RhZ2U9PSJDbGFzaWZpYyIsDQogICAgICAgICBDYXRlZ29yeT09IlN1YjE4X00iLA0KICAgICAgICAgeWVhcj09IjIwMjQiDQogICAgIyAgICAgTmFtZT09IG5vbWJyZQ0KICAgICAgICAgKSAlPiUNCiAgZ3JvdXBfYnkoY29tcGV0aXRvcj0gTmFtZSwNCiAgICAgICAgICAgWWVhcj0geWVhciwNCiAgICAgICAgICAgQ29tcGU9IENvbXBlXywNCiAgICAgICAgICAgVGVhbSA9IFRlYW0sDQogICAgICAgICAgIERhdGU9IERhdGUpICU+JQ0KICByZWZyYW1lKHJhbms9IFJhbmspICU+JQ0KICByZXNoYXBlMjo6ZGNhc3QoZm9ybXVsYSA9IGNvbXBldGl0b3IgKyBUZWFtIH4gQ29tcGUsIA0KICAgICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKQ0KDQpibG9jLlN1YjE4TS4yNCA8LSBhc190aWJibGUoYmxvYy5TdWIxOE0uMjQpDQpgYGANCg0KIyMjKiAqX0xvcyBmdXR1cm9zIHN1YjE4ICJzYWxlbiJfKg0KYGBge3IgZWNobz1UUlVFLCBpbmNsdWRlPVRSVUUsIGNvbHMucHJpbnQ9N30NCiMjIGVudmlhbmRvIGxvcyBzdWIxNiBhIG90cm8gYXJjaGl2bw0KZWxvLjIzLmFjY3VtLnRvX3N1YjE4IDwtIGVsby5sYXN0LmFjY3VtICU+JSBzZW1pX2pvaW4oYmxvYy5TdWIxOE0uMjQsYnk9ImNvbXBldGl0b3IiKQ0KDQojIyBzdWIxNiBzYWxpZW5kbw0KZWxvLmxhc3QuYWNjdW0gPC0gZWxvLmxhc3QuYWNjdW0gJT4lIGFudGlfam9pbihibG9jLlN1YjE4TS4yNCxieT0iY29tcGV0aXRvciIpIA0KYGBgICANCg0KDQoNCiMjIyMgQW5jaG9yaW5nICdlbG8ubGFzdC5hY2N1bScgMjAyMw0KYGBge3IgZWNobz1UUlVFLCBpbmNsdWRlPVRSVUV9DQplbG8uMjMuYWNjdW0gPC0gZWxvLmxhc3QuYWNjdW0NCmBgYA0KDQoNCiMjIyMgTUVSR0lORyBGUk9NIFNVQjE0LTIwMjMgIyMjIyMNCmBgYHtyfQ0KI2Jsb2MuU3ViMTRNIDwtIHJhbmtzICU+JQ0KIyAgZmlsdGVyKHN0YWdlPT0iQ2xhc2lmaWMiLA0KICMgICAgICAgIENhdGVnb3J5PT0iU3ViMTRfTSIsDQogICMgICAgICAgeWVhcj09IjIwMjIifHllYXI9PSIyMDIzIg0KICAgICMgICAgIE5hbWU9PSBub21icmUNCiAgICMgICAgICApICU+JQ0KIyAgZ3JvdXBfYnkoY29tcGV0aXRvcj0gTmFtZSwNCiAjICAgICAgICAgIFllYXI9IHllYXIsDQogICMgICAgICAgICBDb21wZT0gQ29tcGVfLA0KICAgIyAgICAgICAgVGVhbSA9IFRlYW0sDQogICAgIyAgICAgICBEYXRlPSBEYXRlKSAlPiUNCiMgIHJlZnJhbWUocmFuaz0gUmFuaykgJT4lDQogIyByZXNoYXBlMjo6ZGNhc3QoZm9ybXVsYSA9IGNvbXBldGl0b3IgKyBUZWFtIH4gQ29tcGUsIA0KICMgICAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSkNCg0KI2Jsb2MuU3ViMTRNIDwtIGFzX3RpYmJsZShibG9jLlN1YjE0TSkNCiMjDQpibG9jLlN1YjE0TS5kIDwtIGJsb2MuU3ViMTRNWyxjKDEsMiw2KV0gJT4lIGZpbHRlcihibG9jLlN1YjE0TSRkLmJsb2MuZmlyc3QuMjMhPSJOQSIpIA0KIw0KYmxvYy5TdWIxNE0uZC5kZWJ1dCA8LSBibG9jLlN1YjE0TS5kICU+JSBhbnRpX2pvaW4oZWxvLmMuYmxvYy50aHJkLjIyLmFjY3VtLCBieT0iY29tcGV0aXRvciIpDQoNCg0KDQoNCg0KIyMjICMjIEVMTyAoTkFTQ0FSKSAjIyMjIyMjIyMjIyMjDQpuLmRlYnV0ID0gbGVuZ3RoKGJsb2MuU3ViMTRNLmQuZGVidXQkY29tcGV0aXRvcikNCiMjIw0KZCA8LSBibG9jLlN1YjE0TS5kICU+JSByaWdodF9qb2luKGVsby5jLmJsb2MudGhyZC4yMi5hY2N1bSwgYnk9ImNvbXBldGl0b3IiKQ0KIyMjDQpOIDwtIGxlbmd0aChkJGNvbXBldGl0b3JbIWlzLm5hKGQkZC5ibG9jLmZpcnN0LjIzKV0pDQpSIDwtIGQkUi5uZXdbIWlzLm5hKGQkZC5ibG9jLmZpcnN0LjIzKV0NCm5hbWVzIDwtIGRbIWlzLm5hKGQkZC5ibG9jLmZpcnN0LjIzKSwxXQ0KVGVhbSA8LSBkJFRlYW0ueFshaXMubmEoZCRkLmJsb2MuZmlyc3QuMjMpXQ0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQpyZXN1bHRzIDwtIGJsb2MuU3ViMTRNLmQkZC5ibG9jLmZpcnN0LjIzDQpzdGRldiA8LSBzZChyZXN1bHRzKQ0KIw0KYXZnLnBsYXllciA8LSBtZWRpYW4oYyhSLCByZXAoMTAwMCwgbi5kZWJ1dCApKSkNCm1lZGlhbmEgPC0gbWVkaWFuKGJsb2MuU3ViMTRNJGQuYmxvYy5maXJzdC4yM1shaXMubmEoYmxvYy5TdWIxNE0kZC5ibG9jLmZpcnN0LjIzKV0pDQptYXguc3RkIDwtIChtZWRpYW5hLTEpL3N0ZGV2DQojIyMjIyMjIyMjIyMjIyMjIyMNClMgPC0gKChtZWRpYW5hIC0gZCRkLmJsb2MuZmlyc3QuMjNbIWlzLm5hKGQkZC5ibG9jLmZpcnN0LjIzKV0gKSAvIHN0ZGV2KSAvIG1heC5zdGQNCkQgPSA0MDANCmsgPSAzMg0KRSA8LSAxLygxKygxMF4oIChhdmcucGxheWVyLVIpL0QgKSkpDQpSLm5ldyA8LSBSICsgKGsgKiAoUyAtICgoMipFKS9OKSApICkNCiMNCm1heC5jdXQuZmluYWxzIDwtIChzdGRldi05KS9zdGRldg0KUHJvYi5GaW5hbHMgPC0gMS8oMSsoMTBeKCAoIHNvcnQoUi5uZXcsIGRlY3JlYXNpbmcgPSBUUlVFKVs5XSAtUi5uZXcpL0QgKSkpDQptYXguY3V0LnBvZGl1bSA8LSAoc3RkZXYtNCkvc3RkZXYNClByb2IucG9kaXVtIDwtIDEvKDErKDEwXiggKCBzb3J0KFIubmV3LCBkZWNyZWFzaW5nID0gVFJVRSlbNF0gLVIubmV3KS9EICkpKQ0KIyMjDQoNCmVsby5kLmJsb2MuZmlyc3QuMjMgPC0gY2JpbmQobmFtZXMgPSBuYW1lcywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlYW09IFRlYW0sDQogICAgICAgICAgICAgICAgICAgICAgICAgICBSID0gUiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMgPSBkJGQuYmxvYy5maXJzdC4yM1shaXMubmEoZCRkLmJsb2MuZmlyc3QuMjMpXSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFMgPSBTLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgUi5uZXc9IHJvdW5kKFIubmV3LDIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvYi5GaW5hbHM9IHBhc3RlKHJvdW5kKFByb2IuRmluYWxzKjEwMCwgMSksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiUiKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2IucG9kaXVtID0gcGFzdGUocm91bmQoUHJvYi5wb2RpdW0qMTAwLDEpLCAiJSIgKSANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICkNCmVsby5kLmJsb2MuZmlyc3QuMjMgPC0gYXNfdGliYmxlKGVsby5kLmJsb2MuZmlyc3QuMjMpDQoNCiMjIyMjIyMjIyMjDQoNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyMjICMjIEVMTyAoTkFTQ0FSKSAjIyMjIyMjIyMjIyMjDQpuID0gbGVuZ3RoKGJsb2MuU3ViMTRNLmQuZGVidXQkZC5ibG9jLmZpcnN0LjIzKQ0KTiA8LSBsZW5ndGgoYmxvYy5TdWIxNE0kZC5ibG9jLmZpcnN0LjIzWyFpcy5uYShibG9jLlN1YjE0TSRkLmJsb2MuZmlyc3QuMjMpXSkNClIuZGVidXQgPC0gcmVwKDEwMDAsIG4pDQpuYW1lcyA8LSBibG9jLlN1YjE0TS5kLmRlYnV0WywxXQ0KVGVhbSA8LSBibG9jLlN1YjE0TS5kLmRlYnV0JFRlYW0NCiNjYXRlZyA8LSBibG9jLlN1YjE0TS5hX2INClMgPC0gKChtZWRpYW5hLSBibG9jLlN1YjE0TS5kLmRlYnV0JGQuYmxvYy5maXJzdC4yMykgLyBzdGRldikgLyBtYXguc3RkDQpFIDwtIDEvKDErKDEwXiggKGF2Zy5wbGF5ZXItUi5kZWJ1dCkvRCApKSkNClIubmV3IDwtIFIuZGVidXQgKyAoayAqIChTIC0gKCgyKkUpL04pICkgKQ0KIw0KbWF4LmN1dC5maW5hbHMgPC0gKHN0ZGV2LTkpL3N0ZGV2DQpQcm9iLkZpbmFscyA8LSAxLygxKygxMF4oICggc29ydChlbG8uZC5ibG9jLmZpcnN0LjIzJFIubmV3LCBkZWNyZWFzaW5nID0gVFJVRSlbOV0gLSBSLm5ldykvRCApKSkNCm1heC5jdXQucG9kaXVtIDwtIChzdGRldi00KS9zdGRldg0KUHJvYi5wb2RpdW0gPC0gMS8oMSsoMTBeKCAoIHNvcnQoZWxvLmQuYmxvYy5maXJzdC4yMyRSLm5ldywgZGVjcmVhc2luZyA9IFRSVUUpWzRdIC1SLm5ldykvRCApKSkNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQplbG8uZC5ibG9jLmZpcnN0LjIzLmRlYnV0IDwtIGNiaW5kKG5hbWVzID0gbmFtZXMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBUZWFtPSBUZWFtLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgUiA9IFIuZGVidXQsDQogICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzID0gYmxvYy5TdWIxNE0uZC5kZWJ1dCRkLmJsb2MuZmlyc3QuMjMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBTID0gUywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFIubmV3PSByb3VuZChSLm5ldywyKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2IuRmluYWxzPSBwYXN0ZShyb3VuZChQcm9iLkZpbmFscyoxMDAsMSksIiUiKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2IucG9kaXVtID0gcGFzdGUocm91bmQoUHJvYi5wb2RpdW0qMTAwLCAxKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiUiKSANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICkNCmVsby5kLmJsb2MuZmlyc3QuMjMuZGVidXQgPC0gYXNfdGliYmxlKGVsby5kLmJsb2MuZmlyc3QuMjMuZGVidXQpDQoNCmVsby5kLmJsb2MuZmlyc3QuMjMgPC0gZWxvLmQuYmxvYy5maXJzdC4yMyAlPiUgcmJpbmQoZWxvLmQuYmxvYy5maXJzdC4yMy5kZWJ1dCkNCg0KDQoNCg0KDQoNCiMgIyBDb3J0ZSBTdWIxNC1TdWIxNiBfMjAyNCAjIyMjICANCiMjIyAqKkVsbyBBY2N1bXVsYXRlZCBGaXJzdF8yMDIzKioNCiMjDQplbG8ubGFzdC5hY2N1bSA8LSBlbG8uYy5ibG9jLnRocmQuMjIuYWNjdW0NCmVsby5sYXN0LmNvbXAgPC0gZWxvLmQuYmxvYy5maXJzdC4yMw0KIyMjDQplbG8ubGFzdC5hY2N1bV9sYXN0LmNvbXBfYWJzZW50IDwtIGVsby5sYXN0LmFjY3VtICU+JSBhbnRpX2pvaW4oZWxvLmxhc3QuY29tcCxieT0iY29tcGV0aXRvciIpDQplbG8ubGFzdC5hY2N1bSA8LSBlbG8ubGFzdC5jb21wICU+JSByYmluZChlbG8ubGFzdC5hY2N1bV9sYXN0LmNvbXBfYWJzZW50KQ0KZWxvLmxhc3QuYWNjdW0gPC0gZWxvLmxhc3QuYWNjdW1bb3JkZXIoZWxvLmxhc3QuYWNjdW0kY29tcGV0aXRvciksXQ0KIyMjIDIwMjMgU2Vjb25kICANCmJsb2MuU3ViMTRNW29yZGVyKGJsb2MuU3ViMTRNJGUuYmxvYy5zZWMuMjMpLCBjKDEsMiw2LDcpXSAlPiUgcHJpbnQobj02NSkNCiMjIyBFbG8gU2Vjb25kIDIwMjMgDQpsYXN0LmNvbXAgPC0gYmxvYy5TdWIxNE1bLGMoMSwyLDcpXSAlPiUgZmlsdGVyKGJsb2MuU3ViMTRNJGUuYmxvYy5zZWMuMjMhPSJOQSIpIA0KIw0KbGFzdF9jb21wX2RlYnV0IDwtIGxhc3QuY29tcCAlPiUgYW50aV9qb2luKGVsby5sYXN0LmFjY3VtLCBieT0iY29tcGV0aXRvciIpDQojIyMgRUxPICMjIyMjIyMjIyMjIyMjIyMjDQpuLmRlYnV0ID0gbGVuZ3RoKGxhc3RfY29tcF9kZWJ1dCRjb21wZXRpdG9yKQ0KIyMjDQpsYXN0LmNvbXAuY2FsYyA8LSBsYXN0LmNvbXAgJT4lIHJpZ2h0X2pvaW4oZWxvLmxhc3QuYWNjdW0sIGJ5PSJjb21wZXRpdG9yIikNCiMjIw0KTiA8LSBsZW5ndGgobGFzdC5jb21wLmNhbGMkY29tcGV0aXRvclshaXMubmEobGFzdC5jb21wLmNhbGNbLDNdKV0pDQpSIDwtIGxhc3QuY29tcC5jYWxjJFIubmV3WyFpcy5uYShsYXN0LmNvbXAuY2FsY1ssM10pXQ0KbmFtZXMgPC0gbGFzdC5jb21wLmNhbGNbIWlzLm5hKGxhc3QuY29tcC5jYWxjWywzXSksMV0NClRlYW0gPC0gbGFzdC5jb21wLmNhbGMkVGVhbS54WyFpcy5uYShsYXN0LmNvbXAuY2FsY1ssM10pXQ0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQpyZXN1bHRzIDwtIGxhc3QuY29tcC5jYWxjWyFpcy5uYShsYXN0LmNvbXAuY2FsY1ssM10pLDNdDQpyZXN1bHRzIDwtICh1bmxpc3QocmVzdWx0cykpDQpzdGRldiA8LSBzZChjKDE6KE4rbi5kZWJ1dCkpKQ0KIw0KYXZnLnBsYXllciA8LSBtZWRpYW4oYyhSLCByZXAoMTAwMCwgbi5kZWJ1dCApKSkNCm1lZGlhbmEgPC0gbWVkaWFuKHVubGlzdChsYXN0LmNvbXBbIWlzLm5hKGxhc3QuY29tcFssM10pLDNdKSkNCm1heC5zdGQgPC0gKG1lZGlhbmEtMSkvc3RkZXYNCiMjIyMjIyMjIyMjIyMjIyMjIw0KUyA8LSAoKG1lZGlhbmEgLSB1bmxpc3QobGFzdC5jb21wLmNhbGNbIWlzLm5hKGxhc3QuY29tcC5jYWxjWywzXSksM10pICkgLyBzdGRldikgLyBtYXguc3RkDQpEID0gNDAwDQprID0gMzINCkUgPC0gMS8oMSsoMTBeKCAoYXZnLnBsYXllci1SKS9EICkpKQ0KUi5uZXcgPC0gUiArIChrICogKFMgLSAoKDIqRSkvTikgKSApDQojDQptYXguY3V0LmZpbmFscyA8LSAoc3RkZXYtOSkvc3RkZXYNClByb2IuRmluYWxzIDwtIDEvKDErKDEwXiggKCBzb3J0KFIubmV3LCBkZWNyZWFzaW5nID0gVFJVRSlbOV0gLVIubmV3KS9EICkpKQ0KbWF4LmN1dC5wb2RpdW0gPC0gKHN0ZGV2LTQpL3N0ZGV2DQpQcm9iLnBvZGl1bSA8LSAxLygxKygxMF4oICggc29ydChSLm5ldywgZGVjcmVhc2luZyA9IFRSVUUpWzRdIC1SLm5ldykvRCApKSkNCiMjIw0KZWxvLmxhc3QuY29tcC5uZXcgPC0gY2JpbmQobmFtZXMgPSBuYW1lcywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlYW09IFRlYW0sDQogICAgICAgICAgICAgICAgICAgICAgICAgICBSID0gUiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMgPSByZXN1bHRzLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgUyA9IFMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBSLm5ldz0gcm91bmQoUi5uZXcsMiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9iLkZpbmFscz0gcGFzdGUocm91bmQoUHJvYi5GaW5hbHMqMTAwLCAxKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJSIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvYi5wb2RpdW0gPSBwYXN0ZShyb3VuZChQcm9iLnBvZGl1bSoxMDAsMSksICIlIiApIA0KKQ0KZWxvLmxhc3QuY29tcC5uZXcgPC0gYXNfdGliYmxlKGVsby5sYXN0LmNvbXAubmV3KQ0KIyMjIyMjIyMjIyMNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KbiA9IGxlbmd0aChsYXN0X2NvbXBfZGVidXQkY29tcGV0aXRvcikNCk4gPC0gbGVuZ3RoKHVubGlzdChsYXN0LmNvbXBbIWlzLm5hKGxhc3QuY29tcFssM10pLDNdKSkNClIuZGVidXQgPC0gcmVwKDEwMDAsIG4pDQpuYW1lcyA8LSBsYXN0X2NvbXBfZGVidXRbLDFdDQpUZWFtIDwtIGxhc3RfY29tcF9kZWJ1dCRUZWFtDQojDQpTIDwtICgobWVkaWFuYSAtIGxhc3RfY29tcF9kZWJ1dFssM10pIC8gc3RkZXYpIC8gbWF4LnN0ZA0KRSA8LSAxLygxKygxMF4oIChhdmcucGxheWVyLVIuZGVidXQpL0QgKSkpDQpSLm5ldyA8LSBSLmRlYnV0ICsgKGsgKiAoUyAtICgoMipFKS9OKSApICkNCiMNCm1heC5jdXQuZmluYWxzIDwtIChzdGRldi05KS9zdGRldg0KUHJvYi5GaW5hbHMgPC0gMS8oMSsoMTBeKCAoIHNvcnQoZWxvLmxhc3QuY29tcC5uZXckUi5uZXcsIGRlY3JlYXNpbmcgPSBUUlVFKVs5XSAtIFIubmV3WywxXSkvRCApKSkNCm1heC5jdXQucG9kaXVtIDwtIChzdGRldi00KS9zdGRldg0KUHJvYi5wb2RpdW0gPC0gMS8oMSsoMTBeKCAoIHNvcnQoZWxvLmxhc3QuY29tcC5uZXckUi5uZXcsIGRlY3JlYXNpbmcgPSBUUlVFKVs0XSAtUi5uZXdbLDFdKS9EICkpKQ0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCmVsby5sYXN0LmNvbXAubmV3LmRlYnV0IDwtIGFzX3RpYmJsZShjYmluZChuYW1lcyA9IG5hbWVzLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlYW09IFRlYW0sDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUiA9IFIuZGVidXQsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cyA9IHVubGlzdChsYXN0X2NvbXBfZGVidXRbLDNdKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTID0gU1ssMV0sDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUi5uZXc9IHJvdW5kKFIubmV3WywxXSwyKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9iLkZpbmFscz0gcGFzdGUocm91bmQoUHJvYi5GaW5hbHMqMTAwLDEpLCIlIiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvYi5wb2RpdW0gPSBwYXN0ZShyb3VuZChQcm9iLnBvZGl1bSoxMDAsIDEpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiUiKSANCikpDQojDQplbG8ubGFzdC5jb21wLm5ldyA8LSBlbG8ubGFzdC5jb21wLm5ldyAlPiUgcmJpbmQoZWxvLmxhc3QuY29tcC5uZXcuZGVidXQpDQoNCiMjIyBfIEVsbyBIaXN0b3J5IF8NCmVsby5sYXN0LmFjY3VtDQplbG8ubGFzdC5jb21wLm5ldw0KZWxvLmxhc3QuYWNjdW1fbGFzdC5jb21wX2Fic2VudCA8LSBlbG8ubGFzdC5hY2N1bSAlPiUgYW50aV9qb2luKGVsby5sYXN0LmNvbXAubmV3LGJ5PSJjb21wZXRpdG9yIikNCiMNCmVsby5sYXN0LmFjY3VtIDwtIGVsby5sYXN0LmNvbXAubmV3ICU+JSByYmluZChlbG8ubGFzdC5hY2N1bV9sYXN0LmNvbXBfYWJzZW50KQ0KZWxvLmxhc3QuYWNjdW0gPC0gZWxvLmxhc3QuYWNjdW1bb3JkZXIoZWxvLmxhc3QuYWNjdW0kY29tcGV0aXRvciksXQ0KIw0Ka25pdHI6OmthYmxlKGVsby5sYXN0LmFjY3VtW29yZGVyKGVsby5sYXN0LmFjY3VtJFIubmV3LCBkZWNyZWFzaW5nID0gVFJVRSksYygxLDIsNiw3LDgpXSkNCiMNCmJsb2MuU3ViMTRNW29yZGVyKGJsb2MuU3ViMTRNJGYuYmxvYy50aHJkLjIzKSxjKDEsMiw2LDcsOCldICU+JSBmaWx0ZXIoZi5ibG9jLnRocmQuMjMhPSJOQSIgKQ0KIyMjIEVsbyBUaGlyZCAyMDIzIA0KbGFzdC5jb21wIDwtIGJsb2MuU3ViMTRNWyxjKDEsMiw4KV0gJT4lIGZpbHRlcihibG9jLlN1YjE0TSRmLmJsb2MudGhyZC4yMyE9Ik5BIikgDQojDQpsYXN0X2NvbXBfZGVidXQgPC0gbGFzdC5jb21wICU+JSBhbnRpX2pvaW4oZWxvLmxhc3QuYWNjdW0sIGJ5PSJjb21wZXRpdG9yIikNCiMjIyBFTE8gIyMjIyMjIyMjIyMjIyMjIyMNCiMNCm4uZGVidXQgPSBsZW5ndGgobGFzdF9jb21wX2RlYnV0JGNvbXBldGl0b3IpDQojIyMNCmxhc3QuY29tcC5jYWxjIDwtIGxhc3QuY29tcCAlPiUgcmlnaHRfam9pbihlbG8ubGFzdC5hY2N1bSwgYnk9ImNvbXBldGl0b3IiKQ0KIyMjDQpOIDwtIGxlbmd0aChsYXN0LmNvbXAuY2FsYyRjb21wZXRpdG9yWyFpcy5uYShsYXN0LmNvbXAuY2FsY1ssM10pXSkNClIgPC0gbGFzdC5jb21wLmNhbGMkUi5uZXdbIWlzLm5hKGxhc3QuY29tcC5jYWxjWywzXSldDQpuYW1lcyA8LSBsYXN0LmNvbXAuY2FsY1shaXMubmEobGFzdC5jb21wLmNhbGNbLDNdKSwxXQ0KVGVhbSA8LSBsYXN0LmNvbXAuY2FsYyRUZWFtLnhbIWlzLm5hKGxhc3QuY29tcC5jYWxjWywzXSldDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMNCnJlc3VsdHMgPC0gbGFzdC5jb21wLmNhbGNbIWlzLm5hKGxhc3QuY29tcC5jYWxjWywzXSksM10NCnJlc3VsdHMgPC0gKHVubGlzdChyZXN1bHRzKSkNCnN0ZGV2IDwtIHNkKGMoMTooTituLmRlYnV0KSkpDQojDQphdmcucGxheWVyIDwtIG1lZGlhbihjKFIsIHJlcCgxMDAwLCBuLmRlYnV0ICkpKQ0KbWVkaWFuYSA8LSBtZWRpYW4odW5saXN0KGxhc3QuY29tcFshaXMubmEobGFzdC5jb21wWywzXSksM10pKQ0KbWF4LnN0ZCA8LSAobWVkaWFuYS0xKS9zdGRldg0KIyMjIyMjIyMjIyMjIyMjIyMjDQpTIDwtICgobWVkaWFuYSAtIHVubGlzdChsYXN0LmNvbXAuY2FsY1shaXMubmEobGFzdC5jb21wLmNhbGNbLDNdKSwzXSkgKSAvIHN0ZGV2KSAvIG1heC5zdGQNCkQgPSA0MDANCmsgPSAzMg0KRSA8LSAxLygxKygxMF4oIChhdmcucGxheWVyLVIpL0QgKSkpDQpSLm5ldyA8LSBSICsgKGsgKiAoUyAtICgoMipFKS9OKSApICkNCiMNCm1heC5jdXQuZmluYWxzIDwtIChzdGRldi05KS9zdGRldg0KUHJvYi5GaW5hbHMgPC0gMS8oMSsoMTBeKCAoIHNvcnQoUi5uZXcsIGRlY3JlYXNpbmcgPSBUUlVFKVs5XSAtUi5uZXcpL0QgKSkpDQptYXguY3V0LnBvZGl1bSA8LSAoc3RkZXYtNCkvc3RkZXYNClByb2IucG9kaXVtIDwtIDEvKDErKDEwXiggKCBzb3J0KFIubmV3LCBkZWNyZWFzaW5nID0gVFJVRSlbNF0gLVIubmV3KS9EICkpKQ0KIyMjDQplbG8ubGFzdC5jb21wLm5ldyA8LSBjYmluZChuYW1lcyA9IG5hbWVzLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVhbT0gVGVhbSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFIgPSBSLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cyA9IHJlc3VsdHMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBTID0gUywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFIubmV3PSByb3VuZChSLm5ldywyKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2IuRmluYWxzPSBwYXN0ZShyb3VuZChQcm9iLkZpbmFscyoxMDAsIDEpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlIiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9iLnBvZGl1bSA9IHBhc3RlKHJvdW5kKFByb2IucG9kaXVtKjEwMCwxKSwgIiUiICkgDQopDQplbG8ubGFzdC5jb21wLm5ldyA8LSBhc190aWJibGUoZWxvLmxhc3QuY29tcC5uZXcpDQojIyMjIyMjIyMjIw0KbiA9IGxlbmd0aChsYXN0X2NvbXBfZGVidXQkY29tcGV0aXRvcikNCk4gPC0gbGVuZ3RoKHVubGlzdChsYXN0LmNvbXBbIWlzLm5hKGxhc3QuY29tcFssM10pLDNdKSkNClIuZGVidXQgPC0gcmVwKDEwMDAsIG4pDQpuYW1lcyA8LSBsYXN0X2NvbXBfZGVidXRbLDFdDQpUZWFtIDwtIGxhc3RfY29tcF9kZWJ1dCRUZWFtDQojDQpTIDwtICgobWVkaWFuYSAtIGxhc3RfY29tcF9kZWJ1dFssM10pIC8gc3RkZXYpIC8gbWF4LnN0ZA0KRSA8LSAxLygxKygxMF4oIChhdmcucGxheWVyLVIuZGVidXQpL0QgKSkpDQpSLm5ldyA8LSBSLmRlYnV0ICsgKGsgKiAoUyAtICgoMipFKS9OKSApICkNCiMNCm1heC5jdXQuZmluYWxzIDwtIChzdGRldi05KS9zdGRldg0KUHJvYi5GaW5hbHMgPC0gMS8oMSsoMTBeKCAoIHNvcnQoZWxvLmxhc3QuY29tcC5uZXckUi5uZXcsIGRlY3JlYXNpbmcgPSBUUlVFKVs5XSAtIFIubmV3WywxXSkvRCApKSkNCm1heC5jdXQucG9kaXVtIDwtIChzdGRldi00KS9zdGRldg0KUHJvYi5wb2RpdW0gPC0gMS8oMSsoMTBeKCAoIHNvcnQoZWxvLmxhc3QuY29tcC5uZXckUi5uZXcsIGRlY3JlYXNpbmcgPSBUUlVFKVs0XSAtUi5uZXdbLDFdKS9EICkpKQ0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCmVsby5sYXN0LmNvbXAubmV3LmRlYnV0IDwtIGFzX3RpYmJsZShjYmluZChuYW1lcyA9IG5hbWVzLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlYW09IFRlYW0sDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUiA9IFIuZGVidXQsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cyA9IHVubGlzdChsYXN0X2NvbXBfZGVidXRbLDNdKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTID0gU1ssMV0sDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUi5uZXc9IHJvdW5kKFIubmV3WywxXSwyKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9iLkZpbmFscz0gcGFzdGUocm91bmQoUHJvYi5GaW5hbHMqMTAwLDEpLCIlIiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvYi5wb2RpdW0gPSBwYXN0ZShyb3VuZChQcm9iLnBvZGl1bSoxMDAsIDEpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiUiKSANCikpDQojDQplbG8ubGFzdC5jb21wLm5ldyA8LSBlbG8ubGFzdC5jb21wLm5ldyAlPiUgcmJpbmQoZWxvLmxhc3QuY29tcC5uZXcuZGVidXQpDQojIyMjIyAjIyMjIyMjIyMjDQprbml0cjo6a2FibGUoZWxvLmxhc3QuY29tcC5uZXdbb3JkZXIoZWxvLmxhc3QuY29tcC5uZXckcmVzdWx0cyksYygxLDIsMyw0LDYsNyw4KV0pDQojIyMgKipFbG8gQWNjdW11bGF0ZWQgVGhpcmRfMjAyMyoqDQplbG8ubGFzdC5hY2N1bQ0KZWxvLmxhc3QuY29tcC5uZXcNCiMNCmVsby5sYXN0LmFjY3VtX2xhc3QuY29tcF9hYnNlbnQgPC0gZWxvLmxhc3QuYWNjdW0gJT4lIGFudGlfam9pbihlbG8ubGFzdC5jb21wLm5ldyxieT0iY29tcGV0aXRvciIpDQojDQplbG8ubGFzdC5hY2N1bSA8LSBlbG8ubGFzdC5jb21wLm5ldyAlPiUgcmJpbmQoZWxvLmxhc3QuYWNjdW1fbGFzdC5jb21wX2Fic2VudCkNCmVsby5sYXN0LmFjY3VtIDwtIGVsby5sYXN0LmFjY3VtW29yZGVyKGVsby5sYXN0LmFjY3VtJGNvbXBldGl0b3IpLF0NCiMNCmtuaXRyOjprYWJsZShlbG8ubGFzdC5hY2N1bVtvcmRlcihlbG8ubGFzdC5hY2N1bSRSLm5ldywgZGVjcmVhc2luZyA9IFRSVUUpLGMoMSwyLDYsNyw4KV0pDQojIyMgMjAyMyBDaGFtcA0KYmxvYy5TdWIxNE1bb3JkZXIoYmxvYy5TdWIxNE0kZy5ibG9jLmNhbXAuMjMpLGMoMSwyLDYsNyw4LDkpXSAlPiUgZmlsdGVyKGcuYmxvYy5jYW1wLjIzIT0iTkEiICkNCiMjIyBFbG8gQ2FtcCAyMDIzIA0KbGFzdC5jb21wIDwtIGJsb2MuU3ViMTRNWyxjKDEsMiw5KV0gJT4lIGZpbHRlcihibG9jLlN1YjE0TSRnLmJsb2MuY2FtcC4yMyE9Ik5BIikgDQojDQpsYXN0X2NvbXBfZGVidXQgPC0gbGFzdC5jb21wICU+JSBhbnRpX2pvaW4oZWxvLmxhc3QuYWNjdW0sIGJ5PSJjb21wZXRpdG9yIikNCiMjIyBFTE8gIyMjIyMjIyMjIyMjIyMjIyMNCiMNCm4uZGVidXQgPSBsZW5ndGgobGFzdF9jb21wX2RlYnV0JGNvbXBldGl0b3IpDQojIyMNCmxhc3QuY29tcC5jYWxjIDwtIGxhc3QuY29tcCAlPiUgcmlnaHRfam9pbihlbG8ubGFzdC5hY2N1bSwgYnk9ImNvbXBldGl0b3IiKQ0KIyMjDQpOIDwtIGxlbmd0aChsYXN0LmNvbXAuY2FsYyRjb21wZXRpdG9yWyFpcy5uYShsYXN0LmNvbXAuY2FsY1ssM10pXSkNClIgPC0gbGFzdC5jb21wLmNhbGMkUi5uZXdbIWlzLm5hKGxhc3QuY29tcC5jYWxjWywzXSldDQpuYW1lcyA8LSBsYXN0LmNvbXAuY2FsY1shaXMubmEobGFzdC5jb21wLmNhbGNbLDNdKSwxXQ0KVGVhbSA8LSBsYXN0LmNvbXAuY2FsYyRUZWFtLnhbIWlzLm5hKGxhc3QuY29tcC5jYWxjWywzXSldDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMNCnJlc3VsdHMgPC0gbGFzdC5jb21wLmNhbGNbIWlzLm5hKGxhc3QuY29tcC5jYWxjWywzXSksM10NCnJlc3VsdHMgPC0gKHVubGlzdChyZXN1bHRzKSkNCnN0ZGV2IDwtIHNkKGMoMTooTituLmRlYnV0KSkpDQojDQphdmcucGxheWVyIDwtIG1lZGlhbihjKFIsIHJlcCgxMDAwLCBuLmRlYnV0ICkpKQ0KbWVkaWFuYSA8LSBtZWRpYW4odW5saXN0KGxhc3QuY29tcFshaXMubmEobGFzdC5jb21wWywzXSksM10pKQ0KbWF4LnN0ZCA8LSAobWVkaWFuYS0xKS9zdGRldg0KIyMjIyMjIyMjIyMjIyMjIyMjDQpTIDwtICgobWVkaWFuYSAtIHVubGlzdChsYXN0LmNvbXAuY2FsY1shaXMubmEobGFzdC5jb21wLmNhbGNbLDNdKSwzXSkgKSAvIHN0ZGV2KSAvIG1heC5zdGQNCkQgPSA0MDANCmsgPSAzMg0KRSA8LSAxLygxKygxMF4oIChhdmcucGxheWVyLVIpL0QgKSkpDQpSLm5ldyA8LSBSICsgKGsgKiAoUyAtICgoMipFKS9OKSApICkNCiMNCm1heC5jdXQuZmluYWxzIDwtIChzdGRldi05KS9zdGRldg0KUHJvYi5GaW5hbHMgPC0gMS8oMSsoMTBeKCAoIHNvcnQoUi5uZXcsIGRlY3JlYXNpbmcgPSBUUlVFKVs5XSAtUi5uZXcpL0QgKSkpDQptYXguY3V0LnBvZGl1bSA8LSAoc3RkZXYtNCkvc3RkZXYNClByb2IucG9kaXVtIDwtIDEvKDErKDEwXiggKCBzb3J0KFIubmV3LCBkZWNyZWFzaW5nID0gVFJVRSlbNF0gLVIubmV3KS9EICkpKQ0KIyMjDQplbG8ubGFzdC5jb21wLm5ldyA8LSBjYmluZChuYW1lcyA9IG5hbWVzLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVhbT0gVGVhbSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFIgPSBSLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cyA9IHJlc3VsdHMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBTID0gUywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFIubmV3PSByb3VuZChSLm5ldywyKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2IuRmluYWxzPSBwYXN0ZShyb3VuZChQcm9iLkZpbmFscyoxMDAsIDEpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlIiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9iLnBvZGl1bSA9IHBhc3RlKHJvdW5kKFByb2IucG9kaXVtKjEwMCwxKSwgIiUiICkgDQopDQplbG8ubGFzdC5jb21wLm5ldyA8LSBhc190aWJibGUoZWxvLmxhc3QuY29tcC5uZXcpDQojIyMgIyMgRUxPIChOQVNDQVIpICMjIyMjIyMjIyMjIyMNCm4gPSBsZW5ndGgobGFzdF9jb21wX2RlYnV0JGNvbXBldGl0b3IpDQpOIDwtIGxlbmd0aCh1bmxpc3QobGFzdC5jb21wWyFpcy5uYShsYXN0LmNvbXBbLDNdKSwzXSkpDQpSLmRlYnV0IDwtIHJlcCgxMDAwLCBuKQ0KbmFtZXMgPC0gbGFzdF9jb21wX2RlYnV0WywxXQ0KVGVhbSA8LSBsYXN0X2NvbXBfZGVidXQkVGVhbQ0KIw0KUyA8LSAoKG1lZGlhbmEgLSBsYXN0X2NvbXBfZGVidXRbLDNdKSAvIHN0ZGV2KSAvIG1heC5zdGQNCkUgPC0gMS8oMSsoMTBeKCAoYXZnLnBsYXllci1SLmRlYnV0KS9EICkpKQ0KUi5uZXcgPC0gUi5kZWJ1dCArIChrICogKFMgLSAoKDIqRSkvTikgKSApDQojDQptYXguY3V0LmZpbmFscyA8LSAoc3RkZXYtOSkvc3RkZXYNClByb2IuRmluYWxzIDwtIDEvKDErKDEwXiggKCBzb3J0KGVsby5sYXN0LmNvbXAubmV3JFIubmV3LCBkZWNyZWFzaW5nID0gVFJVRSlbOV0gLSBSLm5ld1ssMV0pL0QgKSkpDQptYXguY3V0LnBvZGl1bSA8LSAoc3RkZXYtNCkvc3RkZXYNClByb2IucG9kaXVtIDwtIDEvKDErKDEwXiggKCBzb3J0KGVsby5sYXN0LmNvbXAubmV3JFIubmV3LCBkZWNyZWFzaW5nID0gVFJVRSlbNF0gLVIubmV3WywxXSkvRCApKSkNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQplbG8ubGFzdC5jb21wLm5ldy5kZWJ1dCA8LSBhc190aWJibGUoY2JpbmQobmFtZXMgPSBuYW1lcywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZWFtPSBUZWFtLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFIgPSBSLmRlYnV0LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMgPSB1bmxpc3QobGFzdF9jb21wX2RlYnV0WywzXSksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUyA9IFNbLDFdLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFIubmV3PSByb3VuZChSLm5ld1ssMV0sMiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvYi5GaW5hbHM9IHBhc3RlKHJvdW5kKFByb2IuRmluYWxzKjEwMCwxKSwiJSIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2IucG9kaXVtID0gcGFzdGUocm91bmQoUHJvYi5wb2RpdW0qMTAwLCAxKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlIikgDQopKQ0KIw0KZWxvLmxhc3QuY29tcC5uZXcgPC0gZWxvLmxhc3QuY29tcC5uZXcgJT4lIHJiaW5kKGVsby5sYXN0LmNvbXAubmV3LmRlYnV0KQ0KIyMjICoqRWxvIEFjY3VtdWxhdGVkIENoYW1wXzIwMjMqKg0KZWxvLmxhc3QuYWNjdW0NCmVsby5sYXN0LmNvbXAubmV3DQojDQplbG8ubGFzdC5hY2N1bV9sYXN0LmNvbXBfYWJzZW50IDwtIGVsby5sYXN0LmFjY3VtICU+JSBhbnRpX2pvaW4oZWxvLmxhc3QuY29tcC5uZXcsYnk9ImNvbXBldGl0b3IiKQ0KDQplbG8ubGFzdC5hY2N1bSA8LSBlbG8ubGFzdC5jb21wLm5ldyAlPiUgcmJpbmQoZWxvLmxhc3QuYWNjdW1fbGFzdC5jb21wX2Fic2VudCkNCmVsby5sYXN0LmFjY3VtIDwtIGVsby5sYXN0LmFjY3VtW29yZGVyKGVsby5sYXN0LmFjY3VtJGNvbXBldGl0b3IpLF0NCiMNCiMjIyogKipDYXB0dXJhbmRvIGxvcyBmdXR1cm9zIFN1YjE2KiogDQpibG9jLlN1YjE2TS4yNCA8LSByYW5rcyAlPiUNCiAgZmlsdGVyKHN0YWdlPT0iQ2xhc2lmaWMiLA0KICAgICAgICAgQ2F0ZWdvcnk9PSJTdWIxNl9NIiwNCiAgICAgICAgIHllYXI9PSIyMDI0Ig0KICAgICAgICAgIyAgICAgTmFtZT09IG5vbWJyZQ0KICApICU+JQ0KICBncm91cF9ieShjb21wZXRpdG9yPSBOYW1lLA0KICAgICAgICAgICBZZWFyPSB5ZWFyLA0KICAgICAgICAgICBDb21wZT0gQ29tcGVfLA0KICAgICAgICAgICBUZWFtID0gVGVhbSwNCiAgICAgICAgICAgRGF0ZT0gRGF0ZSkgJT4lDQogIHJlZnJhbWUocmFuaz0gUmFuaykgJT4lDQogIHJlc2hhcGUyOjpkY2FzdChmb3JtdWxhID0gY29tcGV0aXRvciArIFRlYW0gfiBDb21wZSwgDQogICAgICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpDQojDQpibG9jLlN1YjE2TS4yNCA8LSBhc190aWJibGUoYmxvYy5TdWIxNk0uMjQpDQojIyMqICpfTG9zIHN1YjE2ICJzYWxlbiJfKg0KIyMgZW52aWFuZG8gbG9zIHN1YjE2IGEgb3RybyBhcmNoaXZvDQplbG8uMjMuYWNjdW0udG9fc3ViMTYgPC0gZWxvLmxhc3QuYWNjdW0gJT4lIHNlbWlfam9pbihibG9jLlN1YjE2TS4yNCxieT0iY29tcGV0aXRvciIpDQojIyBzdWIxNiBzYWxpZW5kbw0KI2Vsby5sYXN0LmFjY3VtIDwtIGVsby5sYXN0LmFjY3VtICU+JSBhbnRpX2pvaW4oYmxvYy5TdWIxNk0uMjQsYnk9ImNvbXBldGl0b3IiKQ0KYGBgICANCg0KDQojIyMgMjAyNCBGSVJTVA0KDQpgYGB7ciBpbmNsdWRlPVRSVUV9DQpibG9jLlN1YjE2TVtvcmRlcihibG9jLlN1YjE2TSRoLmJsb2MuZmlyc3QuMjQpLCBjKDEsMiw5LDEwKV0gJT4lIHByaW50KG49NjUpDQpgYGAgIA0KIyMjIEVsbyBGaXJzdCAyMDI0IA0KKi1Db21wZXRpdG9ycyA9IGByIGNvbXBldGl0b3JzLmhgLSoNCmBgYHtyIGV2YWw9VFJVRSxpbmNsdWRlPUZBTFNFfQ0KbGFzdC5jb21wIDwtIGJsb2MuU3ViMTZNWyxjKDEsMiwxMCldICU+JSBmaWx0ZXIoYmxvYy5TdWIxNk0kaC5ibG9jLmZpcnN0LjI0IT0iTkEiKSANCiMNCmxhc3RfY29tcF9kZWJ1dCA8LSBsYXN0LmNvbXAgJT4lIGFudGlfam9pbihlbG8uMjMuYWNjdW0sIGJ5PSJjb21wZXRpdG9yIikNCmBgYCAgDQoNCg0KYGBge3J9DQojIyBleC1TdWIxNCBjb21pbmcgaW4gIyMjDQpsYXN0X2NvbXBfZGVidXQuZnJvbV9sd3JfY2F0IDwtIGxhc3RfY29tcF9kZWJ1dCAlPiUgcmlnaHRfam9pbihlbG8uMjMuYWNjdW0udG9fc3ViMTYsIGJ5PSJjb21wZXRpdG9yIikNCmxhc3RfY29tcF9kZWJ1dC5mcm9tX2x3cl9jYXQgPC0gbGFzdF9jb21wX2RlYnV0LmZyb21fbHdyX2NhdFshaXMubmEobGFzdF9jb21wX2RlYnV0LmZyb21fbHdyX2NhdFssM10pLF0NCiMNCmxhc3RfY29tcF9kZWJ1dCA8LSBsYXN0X2NvbXBfZGVidXQgJT4lIGFudGlfam9pbihsYXN0X2NvbXBfZGVidXQuZnJvbV9sd3JfY2F0LCBieT0iY29tcGV0aXRvciIpDQpgYGAgICANCg0KDQojIyMjIHJlLWluc3RhdGluZyAnZWxvLmxhc3QuYWNjdW0nIA0KYGBge3IgZWNobz1UUlVFLCBpbmNsdWRlPVRSVUV9DQplbG8ubGFzdC5hY2N1bSA8LSBlbG8uMjMuYWNjdW0gDQpgYGANCg0KYGBge3IgZXZhbD0gVFJVRSxpbmNsdWRlPUZBTFNFLCBjb2xzLnByaW50PSA3fQ0KIyMjIEVMTyAjIyMjIyMjIyMjIyMjIyMjIw0KIyMjICMjIEVMTyAoTkFTQ0FSKSAjIyMjIyMjIyMjIyMjDQpuLmRlYnV0ID0gbGVuZ3RoKGxhc3RfY29tcF9kZWJ1dCRjb21wZXRpdG9yKQ0Kbi5kZWJ1dC5mcm9tX2x3cl9jYXQgPSBucm93KGxhc3RfY29tcF9kZWJ1dC5mcm9tX2x3cl9jYXQpDQojIyMNCmxhc3QuY29tcC5jYWxjIDwtIGxhc3QuY29tcCAlPiUgcmlnaHRfam9pbihlbG8ubGFzdC5hY2N1bSwgYnk9ImNvbXBldGl0b3IiKQ0KIyMjDQpOIDwtIGxlbmd0aChsYXN0LmNvbXAuY2FsYyRjb21wZXRpdG9yWyFpcy5uYShsYXN0LmNvbXAuY2FsY1ssM10pXSkNClIgPC0gbGFzdC5jb21wLmNhbGMkUi5uZXdbIWlzLm5hKGxhc3QuY29tcC5jYWxjWywzXSldDQpuYW1lcyA8LSBsYXN0LmNvbXAuY2FsY1shaXMubmEobGFzdC5jb21wLmNhbGNbLDNdKSwxXQ0KVGVhbSA8LSBsYXN0LmNvbXAuY2FsYyRUZWFtLnhbIWlzLm5hKGxhc3QuY29tcC5jYWxjWywzXSldDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMNCnJlc3VsdHMgPC0gbGFzdC5jb21wLmNhbGNbIWlzLm5hKGxhc3QuY29tcC5jYWxjWywzXSksM10NCnJlc3VsdHMgPC0gKHVubGlzdChyZXN1bHRzKSkNCnN0ZGV2IDwtIHNkKGMoMTooTituLmRlYnV0K24uZGVidXQuZnJvbV9sd3JfY2F0KSkpDQojDQpSLmx3cl9jYXQgPC0gbGFzdF9jb21wX2RlYnV0LmZyb21fbHdyX2NhdCRSLm5ldw0KYXZnLnBsYXllciA8LSBtZWRpYW4oYyhSLCByZXAoMTAwMCwgbi5kZWJ1dCksYyhSLmx3cl9jYXQpICkpDQptZWRpYW5hIDwtIG1lZGlhbih1bmxpc3QobGFzdC5jb21wWyFpcy5uYShsYXN0LmNvbXBbLDNdKSwzXSkpDQptYXguc3RkIDwtIChtZWRpYW5hLTEpL3N0ZGV2DQojIyMjIyMjIyMjIyMjIyMjIyMNClMgPC0gKChtZWRpYW5hIC0gdW5saXN0KGxhc3QuY29tcC5jYWxjWyFpcy5uYShsYXN0LmNvbXAuY2FsY1ssM10pLDNdKSApIC8gc3RkZXYpIC8gbWF4LnN0ZA0KRCA9IDQwMA0KayA9IDMyDQpFIDwtIDEvKDErKDEwXiggKGF2Zy5wbGF5ZXItUikvRCApKSkNClIubmV3IDwtIFIgKyAoayAqIChTIC0gKCgyKkUpL04pICkgKQ0KIw0KbWF4LmN1dC5maW5hbHMgPC0gKHN0ZGV2LTkpL3N0ZGV2DQpQcm9iLkZpbmFscyA8LSAxLygxKygxMF4oICggc29ydChSLm5ldywgZGVjcmVhc2luZyA9IFRSVUUpWzldIC1SLm5ldykvRCApKSkNCm1heC5jdXQucG9kaXVtIDwtIChzdGRldi00KS9zdGRldg0KUHJvYi5wb2RpdW0gPC0gMS8oMSsoMTBeKCAoIHNvcnQoUi5uZXcsIGRlY3JlYXNpbmcgPSBUUlVFKVs0XSAtUi5uZXcpL0QgKSkpDQojIyMNCmVsby5sYXN0LmNvbXAubmV3IDwtIGNiaW5kKG5hbWVzID0gbmFtZXMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBUZWFtPSBUZWFtLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgUiA9IFIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzID0gcmVzdWx0cywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFMgPSBTLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgUi5uZXc9IHJvdW5kKFIubmV3LDIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvYi5GaW5hbHM9IHBhc3RlKHJvdW5kKFByb2IuRmluYWxzKjEwMCwgMSksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiUiKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2IucG9kaXVtID0gcGFzdGUocm91bmQoUHJvYi5wb2RpdW0qMTAwLDEpLCAiJSIgKSANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICkNCmVsby5sYXN0LmNvbXAubmV3IDwtIGFzX3RpYmJsZShlbG8ubGFzdC5jb21wLm5ldykNCiMjIyMjIyMjIyMjDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCm4gPSBsZW5ndGgobGFzdF9jb21wX2RlYnV0JGNvbXBldGl0b3IpDQpOIDwtIGxlbmd0aCh1bmxpc3QobGFzdC5jb21wWyFpcy5uYShsYXN0LmNvbXBbLDNdKSwzXSkpDQpSLmRlYnV0IDwtIHJlcCgxMDAwLCBuKQ0KbmFtZXMgPC0gbGFzdF9jb21wX2RlYnV0WywxXQ0KVGVhbSA8LSBsYXN0X2NvbXBfZGVidXQkVGVhbQ0KI2NhdGVnIDwtIGJsb2MuU3ViMTRNLmFfYg0KUyA8LSAoKG1lZGlhbmEgLSBsYXN0X2NvbXBfZGVidXRbLDNdKSAvIHN0ZGV2KSAvIG1heC5zdGQNCkUgPC0gMS8oMSsoMTBeKCAoYXZnLnBsYXllci1SLmRlYnV0KS9EICkpKQ0KUi5uZXcgPC0gUi5kZWJ1dCArIChrICogKFMgLSAoKDIqRSkvTikgKSApDQojDQptYXguY3V0LmZpbmFscyA8LSAoc3RkZXYtOSkvc3RkZXYNClByb2IuRmluYWxzIDwtIDEvKDErKDEwXiggKCBzb3J0KGVsby5sYXN0LmNvbXAubmV3JFIubmV3LCBkZWNyZWFzaW5nID0gVFJVRSlbOV0gLSBSLm5ld1ssMV0pL0QgKSkpDQptYXguY3V0LnBvZGl1bSA8LSAoc3RkZXYtNCkvc3RkZXYNClByb2IucG9kaXVtIDwtIDEvKDErKDEwXiggKCBzb3J0KGVsby5sYXN0LmNvbXAubmV3JFIubmV3LCBkZWNyZWFzaW5nID0gVFJVRSlbNF0gLVIubmV3WywxXSkvRCApKSkNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQplbG8ubGFzdC5jb21wLm5ldy5kZWJ1dCA8LSBhc190aWJibGUoY2JpbmQobmFtZXMgPSBuYW1lcywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlYW09IFRlYW0sDQogICAgICAgICAgICAgICAgICAgICAgICAgICBSID0gUi5kZWJ1dCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMgPSB1bmxpc3QobGFzdF9jb21wX2RlYnV0WywzXSksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBTID0gU1ssMV0sDQogICAgICAgICAgICAgICAgICAgICAgICAgICBSLm5ldz0gcm91bmQoUi5uZXdbLDFdLDIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvYi5GaW5hbHM9IHBhc3RlKHJvdW5kKFByb2IuRmluYWxzKjEwMCwxKSwiJSIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvYi5wb2RpdW0gPSBwYXN0ZShyb3VuZChQcm9iLnBvZGl1bSoxMDAsIDEpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJSIpIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgKSkNCg0KIyMgZnJvbV9sd3JfQ2F0ICMjIyMjIyMjIyMjIyMjIyMjDQpuID0gbnJvdyhsYXN0X2NvbXBfZGVidXQuZnJvbV9sd3JfY2F0KQ0KTiA8LSBsZW5ndGgodW5saXN0KGxhc3QuY29tcFshaXMubmEobGFzdC5jb21wWywzXSksM10pKQ0KUi5kZWJ1dCA8LSBSLmx3cl9jYXQNCm5hbWVzIDwtIGxhc3RfY29tcF9kZWJ1dC5mcm9tX2x3cl9jYXRbLDFdDQpUZWFtIDwtIHVubGlzdChsYXN0X2NvbXBfZGVidXQuZnJvbV9sd3JfY2F0WywyXSkNCiNjYXRlZyA8LSBibG9jLlN1YjE0TS5hX2INClMgPC0gKChtZWRpYW5hIC0gbGFzdF9jb21wX2RlYnV0LmZyb21fbHdyX2NhdFssM10pIC8gc3RkZXYpIC8gbWF4LnN0ZA0KRSA8LSAxLygxKygxMF4oIChhdmcucGxheWVyLVIuZGVidXQpL0QgKSkpDQpSLm5ldyA8LSBSLmRlYnV0ICsgKGsgKiAoUyAtICgoMipFKS9OKSApICkNCiMNCm1heC5jdXQuZmluYWxzIDwtIChzdGRldi05KS9zdGRldg0KUHJvYi5GaW5hbHMgPC0gMS8oMSsoMTBeKCAoIHNvcnQoZWxvLmxhc3QuY29tcC5uZXckUi5uZXcsIGRlY3JlYXNpbmcgPSBUUlVFKVs5XSAtIFIubmV3WywxXSkvRCApKSkNCm1heC5jdXQucG9kaXVtIDwtIChzdGRldi00KS9zdGRldg0KUHJvYi5wb2RpdW0gPC0gMS8oMSsoMTBeKCAoIHNvcnQoZWxvLmxhc3QuY29tcC5uZXckUi5uZXcsIGRlY3JlYXNpbmcgPSBUUlVFKVs0XSAtUi5uZXdbLDFdKS9EICkpKQ0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCmVsby5sYXN0LmNvbXAubmV3LmRlYnV0Lmx3cl9jYXQgPC0gYXNfdGliYmxlKGNiaW5kKG5hbWVzID0gbmFtZXMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBUZWFtPSBUZWFtLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgUiA9IFIuZGVidXQsDQogICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzID0gdW5saXN0KGxhc3RfY29tcF9kZWJ1dC5mcm9tX2x3cl9jYXRbLDNdKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFMgPSBTWywxXSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFIubmV3PSByb3VuZChSLm5ld1ssMV0sMiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9iLkZpbmFscz0gcGFzdGUocm91bmQoUHJvYi5GaW5hbHMqMTAwLDEpLCIlIiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9iLnBvZGl1bSA9IHBhc3RlKHJvdW5kKFByb2IucG9kaXVtKjEwMCwgMSksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlIikgDQogICAgICAgICAgICAgICAgICAgICAgICAgICApKQ0KDQojIyMjDQplbG8ubGFzdC5jb21wLm5ldyA8LSBlbG8ubGFzdC5jb21wLm5ldyAlPiUgcmJpbmQoZWxvLmxhc3QuY29tcC5uZXcuZGVidXQsIGVsby5sYXN0LmNvbXAubmV3LmRlYnV0Lmx3cl9jYXQpDQoNCg0KIyMjIyMgIyMjIyMjIyMjIw0Ka25pdHI6OmthYmxlKGVsby5sYXN0LmNvbXAubmV3W29yZGVyKGVsby5sYXN0LmNvbXAubmV3JHJlc3VsdHMpLGMoMSwyLDMsNCw2LDcsOCldKQ0KDQpgYGAgIA0KDQojIyMjI18gRWxvIEhpc3RvcnkgXw0KYGBge3J9DQojIyANCmNvbXBlPSAiMjAyNC4xIg0KZWxvLmhpc3RvcnkubGFzdCA8LSBlbG8ubGFzdC5jb21wLm5ldyAlPiUgDQogIG11dGF0ZShjb21wID0gcmVwKGNvbXBlLCBsZW5ndGgoZWxvLmxhc3QuY29tcC5uZXckY29tcGV0aXRvcikpLA0KICAgICAgICAgY2F0ZWcgPSByZXAoIlN1YjE2TSIsIGxlbmd0aChlbG8ubGFzdC5jb21wLm5ldyRjb21wZXRpdG9yKSkpDQoNCiMNCmVsby5oaXN0b3J5IDwtIGVsby5oaXN0b3J5ICU+JSByYmluZChlbG8uaGlzdG9yeS5sYXN0KQ0KDQojIHRpbWUtc2VyaWVzIGRhdGEuZnJhbWUNCiMjIHN1YjE2TQ0KZWxvLmhpc3RvcnkudF9zZXJpZXMuUzE2TSA8LSANCiAgYXNfdGliYmxlKGVsby5oaXN0b3J5ICU+JQ0KICAgICAgICAgICAgICBmaWx0ZXIoY2F0ZWc9PSJTdWIxNk0iKSAlPiUNCiAgICAgICAgICAgICAgcmVzaGFwZTI6OmRjYXN0KGZvcm11bGEgPSBjb21wZXRpdG9yfmNvbXAsIHZhbHVlLnZhciA9ICJSLm5ldyIpKSANCiMjIA0KDQpgYGAgIA0KDQoNCiMjIyBFbG8gaW4gdGltZQ0KYGBge3IgaW5jbHVkZT1UUlVFLCBmaWcud2lkdGg9IDEyfQ0KcCA8LSBlbG8uaGlzdG9yeSAlPiUgDQogIGZpbHRlcihjYXRlZz09IlN1YjE2TSIsIFIubmV3Pj0wKSAlPiUNCiAgZ2dwbG90KGFlcyh4PSBjb21wLCB5PSBSLm5ldywgZ3JvdXAgPSBjb21wZXRpdG9yLCBjb2wgPSBUZWFtKSkgKyANCiAgZ2VvbV9wb2ludCgpICsgDQogIGdlb21fbGluZShsaW5ldHlwZT0gImRhc2hlZCIpICsgDQogIGdlb21faGxpbmUoeWludGVyY2VwdD0xMDAwLGxpbmV0eXBlPSAiZGFzaGVkIikgKw0KICBzY2FsZV95X2NvbnRpbnVvdXMobmFtZT0gIkVsbyBSYW5raW5nIikgKw0KICBzY2FsZV94X2Rpc2NyZXRlKG5hbWUgPSAiVGltZSIpDQojcA0KZ2dwbG90bHkocCkNCmBgYCAgDQoNCg0KDQojIyMgKipFbG8gQWNjdW11bGF0ZWQgRmlyc3RfMjAyNCoqICANCg0KYGBge3IgZXZhbD1GQUxTRSwgaW5jbHVkZT1UUlVFfQ0KZWxvLmxhc3QuYWNjdW0NCmVsby5sYXN0LmNvbXAubmV3DQpgYGANCg0KYGBge3IgZXZhbD1UUlVFLCBpbmNsdWRlPVRSVUUsIGNvbHMucHJpbnQ9N30NCg0KZWxvLmxhc3QuYWNjdW1fbGFzdC5jb21wX2Fic2VudCA8LSBlbG8ubGFzdC5hY2N1bSAlPiUgYW50aV9qb2luKGVsby5sYXN0LmNvbXAubmV3LGJ5PSJjb21wZXRpdG9yIikNCg0KZWxvLmxhc3QuYWNjdW0gPC0gZWxvLmxhc3QuY29tcC5uZXcgJT4lIHJiaW5kKGVsby5sYXN0LmFjY3VtX2xhc3QuY29tcF9hYnNlbnQpDQplbG8ubGFzdC5hY2N1bSA8LSBlbG8ubGFzdC5hY2N1bVtvcmRlcihlbG8ubGFzdC5hY2N1bSRjb21wZXRpdG9yKSxdDQojDQprbml0cjo6a2FibGUoZWxvLmxhc3QuYWNjdW1bb3JkZXIoZWxvLmxhc3QuYWNjdW0kUi5uZXcsIGRlY3JlYXNpbmcgPSBUUlVFKSxjKDEsMiw2LDcsOCldKQ0KYGBgICANCg0KDQojIyMgMjAyNCBTZWNvbmQgIA0KDQpgYGB7ciBpbmNsdWRlPVRSVUV9DQpibG9jLlN1YjE2TVtvcmRlcihibG9jLlN1YjE2TSRpLmJsb2Muc2VjLjI0KSwgYygxLDIsMTAsMTEpXSAlPiUgcHJpbnQobj02NSkNCmBgYCAgDQoNCiMjIyBFbG8gU2Vjb25kIDIwMjMgDQoqLUNvbXBldGl0b3JzID0gYHIgY29tcGV0aXRvcnMuZWAtKg0KDQpgYGB7ciBldmFsPVRSVUUsaW5jbHVkZT1GQUxTRX0NCmxhc3QuY29tcCA8LSBibG9jLlN1YjE2TVssYygxLDIsMTEpXSAlPiUgZmlsdGVyKGJsb2MuU3ViMTZNJGkuYmxvYy5zZWMuMjQhPSJOQSIpIA0KIw0KbGFzdF9jb21wX2RlYnV0IDwtIGxhc3QuY29tcCAlPiUgYW50aV9qb2luKGVsby5sYXN0LmFjY3VtLCBieT0iY29tcGV0aXRvciIpDQpgYGANCg0KDQoNCmBgYHtyIGV2YWw9IFRSVUUsaW5jbHVkZT1GQUxTRSwgY29scy5wcmludD0gN30NCiMjIyBFTE8gIyMjIyMjIyMjIyMjIyMjIyMNCiMjIyAjIyBFTE8gKE5BU0NBUikgIyMjIyMjIyMjIyMjIw0Kbi5kZWJ1dCA9IGxlbmd0aChsYXN0X2NvbXBfZGVidXQkY29tcGV0aXRvcikNCiMjIw0KbGFzdC5jb21wLmNhbGMgPC0gbGFzdC5jb21wICU+JSByaWdodF9qb2luKGVsby5sYXN0LmFjY3VtLCBieT0iY29tcGV0aXRvciIpDQojIyMNCk4gPC0gbGVuZ3RoKGxhc3QuY29tcC5jYWxjJGNvbXBldGl0b3JbIWlzLm5hKGxhc3QuY29tcC5jYWxjWywzXSldKQ0KUiA8LSBsYXN0LmNvbXAuY2FsYyRSLm5ld1shaXMubmEobGFzdC5jb21wLmNhbGNbLDNdKV0NCm5hbWVzIDwtIGxhc3QuY29tcC5jYWxjWyFpcy5uYShsYXN0LmNvbXAuY2FsY1ssM10pLDFdDQpUZWFtIDwtIGxhc3QuY29tcC5jYWxjJFRlYW0ueFshaXMubmEobGFzdC5jb21wLmNhbGNbLDNdKV0NCiMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KcmVzdWx0cyA8LSBsYXN0LmNvbXAuY2FsY1shaXMubmEobGFzdC5jb21wLmNhbGNbLDNdKSwzXQ0KcmVzdWx0cyA8LSAodW5saXN0KHJlc3VsdHMpKQ0Kc3RkZXYgPC0gc2QoYygxOihOK24uZGVidXQpKSkNCiMNCmF2Zy5wbGF5ZXIgPC0gbWVkaWFuKGMoUiwgcmVwKDEwMDAsIG4uZGVidXQgKSkpDQptZWRpYW5hIDwtIG1lZGlhbih1bmxpc3QobGFzdC5jb21wWyFpcy5uYShsYXN0LmNvbXBbLDNdKSwzXSkpDQptYXguc3RkIDwtIChtZWRpYW5hLTEpL3N0ZGV2DQojIyMjIyMjIyMjIyMjIyMjIyMNClMgPC0gKChtZWRpYW5hIC0gdW5saXN0KGxhc3QuY29tcC5jYWxjWyFpcy5uYShsYXN0LmNvbXAuY2FsY1ssM10pLDNdKSApIC8gc3RkZXYpIC8gbWF4LnN0ZA0KRCA9IDQwMA0KayA9IDMyDQpFIDwtIDEvKDErKDEwXiggKGF2Zy5wbGF5ZXItUikvRCApKSkNClIubmV3IDwtIFIgKyAoayAqIChTIC0gKCgyKkUpL04pICkgKQ0KIw0KbWF4LmN1dC5maW5hbHMgPC0gKHN0ZGV2LTkpL3N0ZGV2DQpQcm9iLkZpbmFscyA8LSAxLygxKygxMF4oICggc29ydChSLm5ldywgZGVjcmVhc2luZyA9IFRSVUUpWzldIC1SLm5ldykvRCApKSkNCm1heC5jdXQucG9kaXVtIDwtIChzdGRldi00KS9zdGRldg0KUHJvYi5wb2RpdW0gPC0gMS8oMSsoMTBeKCAoIHNvcnQoUi5uZXcsIGRlY3JlYXNpbmcgPSBUUlVFKVs0XSAtUi5uZXcpL0QgKSkpDQojIyMNCmVsby5sYXN0LmNvbXAubmV3IDwtIGNiaW5kKG5hbWVzID0gbmFtZXMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBUZWFtPSBUZWFtLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgUiA9IFIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzID0gcmVzdWx0cywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFMgPSBTLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgUi5uZXc9IHJvdW5kKFIubmV3LDIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvYi5GaW5hbHM9IHBhc3RlKHJvdW5kKFByb2IuRmluYWxzKjEwMCwgMSksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiUiKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2IucG9kaXVtID0gcGFzdGUocm91bmQoUHJvYi5wb2RpdW0qMTAwLDEpLCAiJSIgKSANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICkNCmVsby5sYXN0LmNvbXAubmV3IDwtIGFzX3RpYmJsZShlbG8ubGFzdC5jb21wLm5ldykNCiMjIyMjIyMjIyMjDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMjIyAjIyBFTE8gKE5BU0NBUikgIyMjIyMjIyMjIyMjIw0KbiA9IGxlbmd0aChsYXN0X2NvbXBfZGVidXQkY29tcGV0aXRvcikNCk4gPC0gbGVuZ3RoKHVubGlzdChsYXN0LmNvbXBbIWlzLm5hKGxhc3QuY29tcFssM10pLDNdKSkNClIuZGVidXQgPC0gcmVwKDEwMDAsIG4pDQpuYW1lcyA8LSBsYXN0X2NvbXBfZGVidXRbLDFdDQpUZWFtIDwtIGxhc3RfY29tcF9kZWJ1dCRUZWFtDQojY2F0ZWcgPC0gYmxvYy5TdWIxNE0uYV9iDQpTIDwtICgobWVkaWFuYSAtIGxhc3RfY29tcF9kZWJ1dFssM10pIC8gc3RkZXYpIC8gbWF4LnN0ZA0KRSA8LSAxLygxKygxMF4oIChhdmcucGxheWVyLVIuZGVidXQpL0QgKSkpDQpSLm5ldyA8LSBSLmRlYnV0ICsgKGsgKiAoUyAtICgoMipFKS9OKSApICkNCiMNCm1heC5jdXQuZmluYWxzIDwtIChzdGRldi05KS9zdGRldg0KUHJvYi5GaW5hbHMgPC0gMS8oMSsoMTBeKCAoIHNvcnQoZWxvLmxhc3QuY29tcC5uZXckUi5uZXcsIGRlY3JlYXNpbmcgPSBUUlVFKVs5XSAtIFIubmV3WywxXSkvRCApKSkNCm1heC5jdXQucG9kaXVtIDwtIChzdGRldi00KS9zdGRldg0KUHJvYi5wb2RpdW0gPC0gMS8oMSsoMTBeKCAoIHNvcnQoZWxvLmxhc3QuY29tcC5uZXckUi5uZXcsIGRlY3JlYXNpbmcgPSBUUlVFKVs0XSAtUi5uZXdbLDFdKS9EICkpKQ0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCmVsby5sYXN0LmNvbXAubmV3LmRlYnV0IDwtIGFzX3RpYmJsZShjYmluZChuYW1lcyA9IG5hbWVzLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVhbT0gVGVhbSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFIgPSBSLmRlYnV0LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cyA9IHVubGlzdChsYXN0X2NvbXBfZGVidXRbLDNdKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFMgPSBTWywxXSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFIubmV3PSByb3VuZChSLm5ld1ssMV0sMiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9iLkZpbmFscz0gcGFzdGUocm91bmQoUHJvYi5GaW5hbHMqMTAwLDEpLCIlIiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9iLnBvZGl1bSA9IHBhc3RlKHJvdW5kKFByb2IucG9kaXVtKjEwMCwgMSksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlIikgDQogICAgICAgICAgICAgICAgICAgICAgICAgICApKQ0KDQoNCmVsby5sYXN0LmNvbXAubmV3IDwtIGVsby5sYXN0LmNvbXAubmV3ICU+JSByYmluZChlbG8ubGFzdC5jb21wLm5ldy5kZWJ1dCkNCg0KDQojIyMjIyAjIyMjIyMjIyMjDQprbml0cjo6a2FibGUoZWxvLmxhc3QuY29tcC5uZXdbb3JkZXIoZWxvLmxhc3QuY29tcC5uZXckcmVzdWx0cyksYygxLDIsMyw0LDYsNyw4KV0pDQoNCmBgYCAgDQoNCiMjIyMjXyBFbG8gSGlzdG9yeSBfDQpgYGB7cn0NCiMjIA0KY29tcGU9ICIyMDI0LjIiDQplbG8uaGlzdG9yeS5sYXN0IDwtIGVsby5sYXN0LmNvbXAubmV3ICU+JSANCiAgbXV0YXRlKGNvbXAgPSByZXAoY29tcGUsIGxlbmd0aChlbG8ubGFzdC5jb21wLm5ldyRjb21wZXRpdG9yKSksDQogICAgICAgICBjYXRlZyA9IHJlcCgiU3ViMTZNIiwgbGVuZ3RoKGVsby5sYXN0LmNvbXAubmV3JGNvbXBldGl0b3IpKSkNCg0KIw0KZWxvLmhpc3RvcnkgPC0gZWxvLmhpc3RvcnkgJT4lIHJiaW5kKGVsby5oaXN0b3J5Lmxhc3QpDQoNCiMgdGltZS1zZXJpZXMgZGF0YS5mcmFtZQ0KIyMgc3ViMTZNDQplbG8uaGlzdG9yeS50X3Nlcmllcy5TMTZNIDwtIA0KICBhc190aWJibGUoZWxvLmhpc3RvcnkgJT4lDQogICAgICAgICAgICAgIGZpbHRlcihjYXRlZz09IlN1YjE2TSIpICU+JQ0KICAgICAgICAgICAgICByZXNoYXBlMjo6ZGNhc3QoZm9ybXVsYSA9IGNvbXBldGl0b3J+Y29tcCwgdmFsdWUudmFyID0gIlIubmV3IikpIA0KIyMgDQoNCmBgYCAgDQoNCiMjIyBFbG8gaW4gdGltZQ0KYGBge3IgaW5jbHVkZT1UUlVFLCBmaWcud2lkdGg9IDE2fQ0KcCA8LSBlbG8uaGlzdG9yeSAlPiUgDQogIGZpbHRlcihjYXRlZz09IlN1YjE2TSIsIFIubmV3Pj0wKSAlPiUNCiAgZ2dwbG90KGFlcyh4PSBjb21wLCB5PSBSLm5ldywgZ3JvdXAgPSBjb21wZXRpdG9yLCBjb2wgPSBUZWFtKSkgKyANCiAgZ2VvbV9wb2ludCgpICsgDQogIGdlb21fbGluZShsaW5ldHlwZT0gImRhc2hlZCIpICsgDQogIGdlb21faGxpbmUoeWludGVyY2VwdD0xMDAwLGxpbmV0eXBlPSAiZGFzaGVkIikNCg0KI3ANCmdncGxvdGx5KHApDQpgYGAgIA0KDQoNCiMjIyAqKkVsbyBBY2N1bXVsYXRlZCBTZWNvbmRfMjAyNCoqDQpgYGB7ciBldmFsPUZBTFNFLCBpbmNsdWRlPVRSVUV9DQplbG8ubGFzdC5hY2N1bQ0KZWxvLmxhc3QuY29tcC5uZXcNCmBgYA0KDQpgYGB7ciBldmFsPVRSVUUsIGluY2x1ZGU9VFJVRSwgY29scy5wcmludD03fQ0KDQplbG8ubGFzdC5hY2N1bV9sYXN0LmNvbXBfYWJzZW50IDwtIGVsby5sYXN0LmFjY3VtICU+JSBhbnRpX2pvaW4oZWxvLmxhc3QuY29tcC5uZXcsYnk9ImNvbXBldGl0b3IiKQ0KDQplbG8ubGFzdC5hY2N1bSA8LSBlbG8ubGFzdC5jb21wLm5ldyAlPiUgcmJpbmQoZWxvLmxhc3QuYWNjdW1fbGFzdC5jb21wX2Fic2VudCkNCmVsby5sYXN0LmFjY3VtIDwtIGVsby5sYXN0LmFjY3VtW29yZGVyKGVsby5sYXN0LmFjY3VtJGNvbXBldGl0b3IpLF0NCiMNCmtuaXRyOjprYWJsZShlbG8ubGFzdC5hY2N1bVtvcmRlcihlbG8ubGFzdC5hY2N1bSRSLm5ldywgZGVjcmVhc2luZyA9IFRSVUUpLGMoMSwyLDYsNyw4KV0pDQpgYGAgIA0KDQojIyMgMjAyNCBUSElSRCAgDQoNCmBgYHtyIGluY2x1ZGU9VFJVRX0NCmJsb2MuU3ViMTZNW29yZGVyKGJsb2MuU3ViMTZNJGouYmxvYy50aHJkLjI0KSwgYygxLDIsMTAsMTEsMTIpXSAlPiUgcHJpbnQobj02NSkNCmBgYCAgDQoNCiMjIyBFbG8gVGhpcmQgMjAyMyANCiotQ29tcGV0aXRvcnMgPSBgciBjb21wZXRpdG9ycy5qYC0qDQoNCmBgYHtyIGV2YWw9VFJVRSxpbmNsdWRlPUZBTFNFIH0NCmxhc3QuY29tcCA8LSBibG9jLlN1YjE2TVssYygxLDIsMTIpXSAlPiUgZmlsdGVyKGJsb2MuU3ViMTZNJGouYmxvYy50aHJkLjI0IT0iTkEiKSANCiMNCmxhc3RfY29tcF9kZWJ1dCA8LSBsYXN0LmNvbXAgJT4lIGFudGlfam9pbihlbG8ubGFzdC5hY2N1bSwgYnk9ImNvbXBldGl0b3IiKQ0KYGBgDQoNCg0KDQpgYGB7ciBldmFsPSBUUlVFLGluY2x1ZGU9RkFMU0UsIGNvbHMucHJpbnQ9IDd9DQojIyMgRUxPICMjIyMjIyMjIyMjIyMjIyMjDQojIyMgIyMgRUxPIChOQVNDQVIpICMjIyMjIyMjIyMjIyMNCm4uZGVidXQgPSBsZW5ndGgobGFzdF9jb21wX2RlYnV0JGNvbXBldGl0b3IpDQojIyMNCmxhc3QuY29tcC5jYWxjIDwtIGxhc3QuY29tcCAlPiUgcmlnaHRfam9pbihlbG8ubGFzdC5hY2N1bSwgYnk9ImNvbXBldGl0b3IiKQ0KIyMjDQpOIDwtIGxlbmd0aChsYXN0LmNvbXAuY2FsYyRjb21wZXRpdG9yWyFpcy5uYShsYXN0LmNvbXAuY2FsY1ssM10pXSkNClIgPC0gbGFzdC5jb21wLmNhbGMkUi5uZXdbIWlzLm5hKGxhc3QuY29tcC5jYWxjWywzXSldDQpuYW1lcyA8LSBsYXN0LmNvbXAuY2FsY1shaXMubmEobGFzdC5jb21wLmNhbGNbLDNdKSwxXQ0KVGVhbSA8LSBsYXN0LmNvbXAuY2FsYyRUZWFtLnhbIWlzLm5hKGxhc3QuY29tcC5jYWxjWywzXSldDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMNCnJlc3VsdHMgPC0gbGFzdC5jb21wLmNhbGNbIWlzLm5hKGxhc3QuY29tcC5jYWxjWywzXSksM10NCnJlc3VsdHMgPC0gKHVubGlzdChyZXN1bHRzKSkNCnN0ZGV2IDwtIHNkKGMoMTooTituLmRlYnV0KSkpDQojDQphdmcucGxheWVyIDwtIG1lZGlhbihjKFIsIHJlcCgxMDAwLCBuLmRlYnV0KSkpDQptZWRpYW5hIDwtIG1lZGlhbih1bmxpc3QobGFzdC5jb21wWyFpcy5uYShsYXN0LmNvbXBbLDNdKSwzXSkpDQptYXguc3RkIDwtIChtZWRpYW5hLTEpL3N0ZGV2DQojIyMjIyMjIyMjIyMjIyMjIyMNClMgPC0gKChtZWRpYW5hIC0gdW5saXN0KGxhc3QuY29tcC5jYWxjWyFpcy5uYShsYXN0LmNvbXAuY2FsY1ssM10pLDNdKSApIC8gc3RkZXYpIC8gbWF4LnN0ZA0KRCA9IDQwMA0KayA9IDMyDQpFIDwtIDEvKDErKDEwXiggKGF2Zy5wbGF5ZXItUikvRCApKSkNClIubmV3IDwtIFIgKyAoayAqIChTIC0gKCgyKkUpL04pICkgKQ0KIw0KbWF4LmN1dC5maW5hbHMgPC0gKHN0ZGV2LTkpL3N0ZGV2DQpQcm9iLkZpbmFscyA8LSAxLygxKygxMF4oICggc29ydChSLm5ldywgZGVjcmVhc2luZyA9IFRSVUUpWzldIC1SLm5ldykvRCApKSkNCm1heC5jdXQucG9kaXVtIDwtIChzdGRldi00KS9zdGRldg0KUHJvYi5wb2RpdW0gPC0gMS8oMSsoMTBeKCAoIHNvcnQoUi5uZXcsIGRlY3JlYXNpbmcgPSBUUlVFKVs0XSAtUi5uZXcpL0QgKSkpDQojIyMNCmVsby5sYXN0LmNvbXAubmV3IDwtIGNiaW5kKG5hbWVzID0gbmFtZXMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBUZWFtPSBUZWFtLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgUiA9IFIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzID0gcmVzdWx0cywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFMgPSBTLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgUi5uZXc9IHJvdW5kKFIubmV3LDIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvYi5GaW5hbHM9IHBhc3RlKHJvdW5kKFByb2IuRmluYWxzKjEwMCwgMSksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiUiKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2IucG9kaXVtID0gcGFzdGUocm91bmQoUHJvYi5wb2RpdW0qMTAwLDEpLCAiJSIgKSANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICkNCmVsby5sYXN0LmNvbXAubmV3IDwtIGFzX3RpYmJsZShlbG8ubGFzdC5jb21wLm5ldykNCiMjIyMjIyMjIyMjDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMjIyAjIyBFTE8gKE5BU0NBUikgIyMjIyMjIyMjIyMjIw0KbiA9IGxlbmd0aChsYXN0X2NvbXBfZGVidXQkY29tcGV0aXRvcikNCk4gPC0gbGVuZ3RoKHVubGlzdChsYXN0LmNvbXBbIWlzLm5hKGxhc3QuY29tcFssM10pLDNdKSkNClIuZGVidXQgPC0gcmVwKDEwMDAsIG4pDQpuYW1lcyA8LSBsYXN0X2NvbXBfZGVidXRbLDFdDQpUZWFtIDwtIGxhc3RfY29tcF9kZWJ1dCRUZWFtDQojY2F0ZWcgPC0gYmxvYy5TdWIxNE0uYV9iDQpTIDwtICgobWVkaWFuYSAtIGxhc3RfY29tcF9kZWJ1dFssM10pIC8gc3RkZXYpIC8gbWF4LnN0ZA0KRSA8LSAxLygxKygxMF4oIChhdmcucGxheWVyLVIuZGVidXQpL0QgKSkpDQpSLm5ldyA8LSBSLmRlYnV0ICsgKGsgKiAoUyAtICgoMipFKS9OKSApICkNCiMNCm1heC5jdXQuZmluYWxzIDwtIChzdGRldi05KS9zdGRldg0KUHJvYi5GaW5hbHMgPC0gMS8oMSsoMTBeKCAoIHNvcnQoZWxvLmxhc3QuY29tcC5uZXckUi5uZXcsIGRlY3JlYXNpbmcgPSBUUlVFKVs5XSAtIFIubmV3WywxXSkvRCApKSkNCm1heC5jdXQucG9kaXVtIDwtIChzdGRldi00KS9zdGRldg0KUHJvYi5wb2RpdW0gPC0gMS8oMSsoMTBeKCAoIHNvcnQoZWxvLmxhc3QuY29tcC5uZXckUi5uZXcsIGRlY3JlYXNpbmcgPSBUUlVFKVs0XSAtUi5uZXdbLDFdKS9EICkpKQ0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCmVsby5sYXN0LmNvbXAubmV3LmRlYnV0IDwtIGFzX3RpYmJsZShjYmluZChuYW1lcyA9IG5hbWVzLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVhbT0gVGVhbSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFIgPSBSLmRlYnV0LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cyA9IHVubGlzdChsYXN0X2NvbXBfZGVidXRbLDNdKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFMgPSBTWywxXSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFIubmV3PSByb3VuZChSLm5ld1ssMV0sMiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9iLkZpbmFscz0gcGFzdGUocm91bmQoUHJvYi5GaW5hbHMqMTAwLDEpLCIlIiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9iLnBvZGl1bSA9IHBhc3RlKHJvdW5kKFByb2IucG9kaXVtKjEwMCwgMSksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlIikgDQogICAgICAgICAgICAgICAgICAgICAgICAgICApKQ0KDQoNCmVsby5sYXN0LmNvbXAubmV3IDwtIGVsby5sYXN0LmNvbXAubmV3ICU+JSByYmluZChlbG8ubGFzdC5jb21wLm5ldy5kZWJ1dCkNCg0KDQojIyMjIyAjIyMjIyMjIyMjDQprbml0cjo6a2FibGUoZWxvLmxhc3QuY29tcC5uZXdbb3JkZXIoZWxvLmxhc3QuY29tcC5uZXckcmVzdWx0cyksYygxLDIsMyw0LDYsNyw4KV0pDQoNCmBgYCAgDQoNCiMjIyMjXyBFbG8gSGlzdG9yeSBfDQpgYGB7cn0NCiMjIA0KY29tcGU9ICIyMDI0LjMiDQplbG8uaGlzdG9yeS5sYXN0IDwtIGVsby5sYXN0LmNvbXAubmV3ICU+JSANCiAgbXV0YXRlKGNvbXAgPSByZXAoY29tcGUsIGxlbmd0aChlbG8ubGFzdC5jb21wLm5ldyRjb21wZXRpdG9yKSksDQogICAgICAgICBjYXRlZyA9IHJlcCgiU3ViMTZNIiwgbGVuZ3RoKGVsby5sYXN0LmNvbXAubmV3JGNvbXBldGl0b3IpKSkNCg0KIw0KZWxvLmhpc3RvcnkgPC0gZWxvLmhpc3RvcnkgJT4lIHJiaW5kKGVsby5oaXN0b3J5Lmxhc3QpDQoNCiMgdGltZS1zZXJpZXMgZGF0YS5mcmFtZQ0KIyMgc3ViMTZNDQplbG8uaGlzdG9yeS50X3Nlcmllcy5TMTZNIDwtIA0KICBhc190aWJibGUoZWxvLmhpc3RvcnkgJT4lDQogICAgICAgICAgICAgIGZpbHRlcihjYXRlZz09IlN1YjE2TSIpICU+JQ0KICAgICAgICAgICAgICByZXNoYXBlMjo6ZGNhc3QoZm9ybXVsYSA9IGNvbXBldGl0b3J+Y29tcCwgdmFsdWUudmFyID0gIlIubmV3IikpIA0KIyMgDQoNCmBgYCAgDQoNCiMjIyBFbG8gaW4gdGltZQ0KYGBge3IgaW5jbHVkZT1UUlVFLCAgZmlnLmhlaWdodD0xMiwgZmlnLndpZHRoPSAxNn0NCiMgaWQgPSAiIg0KIyBzaG9ydG5hbWUgPSAiIg0KDQojIw0KY29scz0gYygiRkVFQyIgPSAiZGFya29yYW5nZTIiLA0KICAgICAgICAiY2N0MjEiPSAieWVsbG93MyIsDQogICAgICAgICJGRU1FQ1YiID0gInJlZDQiLA0KICAgICAgICAiT3RoZXIgY2xpbW5iZXJzIiA9ICJncmF5Ig0KICAgICAgICApDQojIw0KIyBjY3QgPSBjKCJjY3QyMSIgPSAieWVsbG93MiIpDQojIw0KcCA8LSBlbG8uaGlzdG9yeSAlPiUNCiAgbXV0YXRlKGZvY3VzID0gY2FzZV93aGVuKA0KICAgIGNvbXBldGl0b3IgPT0gIktlYW51IElzcmFlbCBWSUxMQVRPUk8gS1VQRVJNQU4iIH4gImNjdDIxIixjb21wZXRpdG9yID09ICAiSmFuIE1PTElTVCBET01JTkdPIiB+ICJjY3QyMSIsDQogICAgY29tcGV0aXRvciA9PSAgIlJvYyBWRVJHw4lTIFNPTMOJIiB+ICJjY3QyMSIsDQogICAgY29tcGV0aXRvciA9PSAgIk1hcnTDrSBGQVJSw5pTIFNPUklBTk8iIH4gImNjdDIxIiwNCiAgICBjb21wZXRpdG9yID09ICAiVG9tIEZFTERFTktSSVoiIH4gImNjdDIxIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBldGl0b3IgPT0gICJTZXJnaW8gTUlSQU5EQSBDSUQiIH4gImNjdDIxIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBldGl0b3IgPT0gICJCaWVsIFNFUlJBIExMT1AiIH4gImNjdDIxIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBldGl0b3IgPT0gICJSb21hbiBLT1NJTlRTRVYiIH4gImNjdDIxIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBldGl0b3IgPT0gIk1pcXVlbCDDgG5nZWwgSkFVU0VUIFNBQkFURVIiIH4gImNjdDIxIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBldGl0b3IgPT0gIkVyaWMgR09OWkFMRVogSU5HTMOJUyIgfiAiY2N0MjEiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGV0aXRvciA9PSAiQmVsIFRPUlJFTlRTIFBBTE9NQVJFUyIgfiAiY2N0MjEiLA0KICAgICAgICAgICAgICAgICAgICAgY29tcGV0aXRvciA9PSAiSm9hbiBBTEVKQU5EUk8gSUxMQSIgfiAiY2N0MjEiLA0KICAgICAgICAgICAgICAgICAgICAgY29tcGV0aXRvciA9PSAiRXJpYyBHSU1FTkVaIFNFUlJBTk8iIH4gImNjdDIxIiwgY29tcGV0aXRvciA9PSAiQmVybmF0IE1VTk5FIEdVSVRBUlQiIH4gImNjdDIxIiwNCiAgICBjb21wZXRpdG9yID09ICJOaWNvbGF1IFRBVUxBVFMgTUNET05BTEQiIH4gImNjdDIxIiwNCiAgICBUZWFtPT0gIkZFRUMiIH4gIkZFRUMiLA0KICAgIFRlYW09PSAiRkVNRUNWIiB+ICJGRU1FQ1YiLA0KICAgIFRSVUUgfiAiT3RoZXIgY2xpbWJlcnMiKSkgJT4lIA0KICBmaWx0ZXIoY2F0ZWc9PSJTdWIxNk0iLCBSLm5ldz49MCkgJT4lDQogIGdncGxvdChhZXMoeD0gY29tcCwgeT0gUi5uZXcsIGdyb3VwID0gY29tcGV0aXRvciwgY29sID0gZm9jdXMpKSArIA0KICBnZW9tX3BvaW50KHNpemU9MC42KSArIA0KICBnZW9tX2xpbmUobGluZXR5cGU9ICJkYXNoZWQiKSArIA0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQ9MTAwMCxsaW5ldHlwZT0gImRhc2hlZCIpICsNCiAgc2NhbGVfY29sb3JfbWFudWFsKG5hbWUgPSAiQ2xpbWJlciIsDQogICAgICAgICAgICAgICAgICAgICBhZXN0aGV0aWNzID0gImNvbG9yIiwNCiAgICAgICAgICAgICAgICAgICAgICwNCiAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGNjdA0KICAgICAgICAgICAgICAgICAgICAgKQ0KI3ANCmdncGxvdGx5KHApDQpgYGAgIA0KDQoNCiMjIyAqKkVsbyBBY2N1bXVsYXRlZCBUaGlyZF8yMDI0KioNCmBgYHtyIGV2YWw9RkFMU0UsIGluY2x1ZGU9VFJVRX0NCmVsby5sYXN0LmFjY3VtDQplbG8ubGFzdC5jb21wLm5ldw0KYGBgDQoNCmBgYHtyIGV2YWw9VFJVRSwgaW5jbHVkZT1UUlVFLCBjb2xzLnByaW50PTd9DQoNCmVsby5sYXN0LmFjY3VtX2xhc3QuY29tcF9hYnNlbnQgPC0gZWxvLmxhc3QuYWNjdW0gJT4lIGFudGlfam9pbihlbG8ubGFzdC5jb21wLm5ldyxieT0iY29tcGV0aXRvciIpDQoNCmVsby5sYXN0LmFjY3VtIDwtIGVsby5sYXN0LmNvbXAubmV3ICU+JSByYmluZChlbG8ubGFzdC5hY2N1bV9sYXN0LmNvbXBfYWJzZW50KQ0KZWxvLmxhc3QuYWNjdW0gPC0gZWxvLmxhc3QuYWNjdW1bb3JkZXIoZWxvLmxhc3QuYWNjdW0kY29tcGV0aXRvciksXQ0KIw0Ka25pdHI6OmthYmxlKGVsby5sYXN0LmFjY3VtW29yZGVyKGVsby5sYXN0LmFjY3VtJFIubmV3LCBkZWNyZWFzaW5nID0gVFJVRSksYygxLDIsNiw3LDgpXSkNCmBgYCAgDQoNCg0KDQojIyMgIyMgVXAtY29taW5nIFNFQVNPTiAjIyMjIw0KDQojIyMqICoqQ2FwdHVyYW5kbyBsb3MgZnV0dXJvcyBTdWIxNioqIA0KYGBge3IgZXZhbD1GQUxTRSwgaW5jbHVkZT1GQUxTRX0NCmJsb2MuU3ViMThNLjI1IDwtIHJhbmtzICU+JQ0KICBmaWx0ZXIoc3RhZ2U9PSJDbGFzaWZpYyIsDQogICAgICAgICBDYXRlZ29yeT09IlN1YjE4X00iLA0KICAgICAgICAgeWVhcj09IjIwMjUiDQogICAgIyAgICAgTmFtZT09IG5vbWJyZQ0KICAgICAgICAgKSAlPiUNCiAgZ3JvdXBfYnkoY29tcGV0aXRvcj0gTmFtZSwNCiAgICAgICAgICAgWWVhcj0geWVhciwNCiAgICAgICAgICAgQ29tcGU9IENvbXBlXywNCiAgICAgICAgICAgVGVhbSA9IFRlYW0sDQogICAgICAgICAgIERhdGU9IERhdGUpICU+JQ0KICByZWZyYW1lKHJhbms9IFJhbmspICU+JQ0KICByZXNoYXBlMjo6ZGNhc3QoZm9ybXVsYSA9IGNvbXBldGl0b3IgKyBUZWFtIH4gQ29tcGUsIA0KICAgICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKQ0KDQpibG9jLlN1YjE4TS4yNSA8LSBhc190aWJibGUoYmxvYy5TdWIxOE0uMjUpDQpgYGANCg0KDQojIyMqICpfTG9zIHN1YjE2ICJzYWxlbiJfKg0KYGBge3IgZXZhbD0gRkFMU0UsIGluY2x1ZGU9RkFMU0UsIGNvbHMucHJpbnQ9N30NCiMjIGVudmlhbmRvIGxvcyBzdWIxNiBhIG90cm8gYXJjaGl2bw0KZWxvLjI0LmFjY3VtLnRvX3N1YjE4IDwtIGVsby5sYXN0LmFjY3VtICU+JSBzZW1pX2pvaW4oYmxvYy5TdWIxNk0uMjUsYnk9ImNvbXBldGl0b3IiKQ0KDQojIyBzdWIxNiBzYWxpZW5kbw0KZWxvLmxhc3QuYWNjdW0gPC0gZWxvLmxhc3QuYWNjdW0gJT4lIGFudGlfam9pbihibG9jLlN1YjE4TS4yNSxieT0iY29tcGV0aXRvciIpIA0KYGBgIA==