Reading Data

BLOC 2022-2024

2022 First

Elo First 2022

-Competitors = 34-

######Elo History check code Chunk if running Sub16 alone

Elo in time

Elo Accumulated First_2022

competitor Team R.new Prob.Finals Prob.podium
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 %

2022 Second

Elo Second 2022

-Competitors = 24-

#####_ Elo History _

Elo in time

Elo Accumulated Second_2023

competitor Team R.new Prob.Finals Prob.podium
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 %

2022 Third

Elo Third 2022

-Competitors = 36-

#####_ Elo History _

Elo in time

Elo Accumulated Third_2023

competitor Team R.new Prob.Finals Prob.podium
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

2023 First

Elo First 2023

-Competitors = 34-

#####_ Elo History _

Elo in time

Elo Accumulated First_2023

competitor Team R.new Prob.Finals Prob.podium
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 %

2023 Second

Elo Second 2023

-Competitors = 36-

#####_ Elo History _

Elo in time

Elo Accumulated Second_2023

competitor Team R.new Prob.Finals Prob.podium
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 %

2023 Third

Elo Third 2023

-Competitors = 36-

#####_ Elo History _

Elo in time

Elo Accumulated Third_2023

competitor Team R.new Prob.Finals Prob.podium
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 %

2023 CAMP

Elo CAMP 2023

-Competitors = 36-

#####_ Elo History _

Elo in time

Elo Accumulated camp_2023

competitor Team R.new Prob.Finals Prob.podium
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

2024 FIRST

Elo First 2024

-Competitors = 48-

re-instating ‘elo.last.accum’

elo.last.accum <- elo.23.accum 

#####_ Elo History _

Elo in time

Elo Accumulated First_2024

competitor Team R.new Prob.Finals Prob.podium
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 %

2024 Second

Elo Second 2023

-Competitors = 36-

#####_ Elo History _

Elo in time

Elo Accumulated Second_2024

competitor Team R.new Prob.Finals Prob.podium
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 %

2024 THIRD

Elo Third 2023

-Competitors = 44-

#####_ Elo History _

Elo in time

Elo Accumulated Third_2024

competitor Team R.new Prob.Finals Prob.podium
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==