Fuente:
Reading Data

Chamonix

Chamonix: Semi-finals

Semi-finals

-Competitors = n.semis-

#####_ Elo History _

Elo Accumulated Chamonix Semis

competitor Ctry R.new Prob.Finals Prob.podium
Jakob Schubert AUT 2262.00 NA NA
sorato ANRAKU JPN 2237.00 NA NA
toby ROBERTS GBR 2185.23 83.6 % 69.4 %
alberto GIN<U+00C9>S L<U+00D3>PEZ ESP 2156.74 81.2 % 65.9 %
taisei HOMMA JPN 2097.41 75.5 % 57.8 %
dohyun LEE KOR 2054.00 NA NA
adam ONDRA CZE 2042.60 69.2 % 50 %
colin DUFFY USA 1989.55 62.3 % 42.4 %
Alexander Megos GER 1983.00 NA NA
sascha LEHMANN SUI 1977.18 60.6 % 40.7 %
jesse GRUPPER USA 1956.83 57.8 % 37.9 %
shion OMATA JPN 1910.21 51.1 % 31.8 %
sam AVEZOU FRA 1902.25 50 % 30.8 %
guillermo PEINADO FRANGANILLO ESP 1901.34 49.9 % 30.7 %
kibeom KWON KOR 1888.54 48 % 29.2 %
max BERTONE FRA 1885.98 47.7 % 28.9 %
stefan SCHERZ AUT 1883.42 47.3 % 28.6 %
Tomoa Narasaki JPN 1877.00 NA NA
satone YOSHIDA JPN 1874.24 46 % 27.5 %
ties VANCRAEYNEST BEL 1873.18 45.8 % 27.4 %
timo UZNIK AUT 1868.06 45.1 % 26.8 %
giorgio TOMATIS ITA 1865.50 44.7 % 26.5 %
ao YURIKUSA JPN 1857.89 43.6 % 25.7 %
yannick FLOH<U+00C9> GER 1849.00 NA NA
masahiro HIGUCHI JPN 1837.13 40.7 % 23.5 %
Hannes Van Duysen BEL 1827.00 NA NA
stefano GHISOLFI ITA 1826.61 39.3 % 22.4 %
Sean Bailey USA 1807.00 NA NA
mejdi SCHALCK FRA 1795.00 NA NA
yoshiyuki OGATA JPN 1783.00 NA NA
Hidemasa Nishida JPN 1774.00 NA NA
zento MURASHITA JPN 1770.43 31.9 % 17.3 %
Neo Suzuki JPN 1768.00 NA NA
luka POTOCAR SLO 1767.31 31.5 % 17 %
Hyunbin Min KOR 1761.00 NA NA
shuta TANAKA JPN 1760.00 NA NA
Hamish Mcarthur GBR 1751.00 NA NA
Yunchan Song KOR 1745.00 NA NA
paul JENFT FRA 1743.41 28.6 % 15.2 %
nao MONCHOIS FRA 1734.00 NA NA
martin STRANIK CZE 1723.00 NA NA
Meichi Narasaki JPN 1716.00 NA NA
Sebastian Halenke GER 1714.00 NA NA
jonas UTELLI SUI 1700.73 23.9 % 12.3 %
jules MARCHALAND FRA 1698.45 23.6 % 12.1 %
Yufei Pan CHN 1682.00 NA NA
hannes PUMAN SWE 1676.00 NA NA
Hanwool Kim KOR 1660.00 NA NA
ravianto RAMADHAN INA 1655.00 NA NA
Sean Mccoll CAN 1650.00 NA NA
Simon Lorenzi BEL 1646.00 NA NA
Nino Grunenfelder SUI 1644.00 NA NA
Nicolas Collin BEL 1617.00 NA NA
filip SCHENK ITA 1616.46 16.2 % 7.9 %
marcello BOMBARDI ITA 1614.00 NA NA
ars<U+00E8>ne DUVAL FRA 1600.00 NA NA
Dillon Countryman USA 1597.00 NA NA

Chamonix: Final

Finals

-Competitors = n.final-

#####_ Elo History _

Elo Accumulated Chamonix Final

competitor Ctry R.new Prob.Finals Prob.podium
Jakob Schubert AUT 2262.00 NA NA
sorato ANRAKU JPN 2237.00 NA NA
toby ROBERTS GBR 2201.39 77.9 % 74.3 %
alberto GIN<U+00C9>S L<U+00D3>PEZ ESP 2168.52 74.4 % 70.6 %
taisei HOMMA JPN 2097.41 75.5 % 57.8 %
dohyun LEE KOR 2054.00 NA NA
adam ONDRA CZE 2046.20 59 % 54.3 %
colin DUFFY USA 2016.56 54.8 % 50 %
Alexander Megos GER 1983.00 NA NA
sascha LEHMANN SUI 1976.89 49.1 % 44.3 %
jesse GRUPPER USA 1956.83 57.8 % 37.9 %
sam AVEZOU FRA 1925.67 41.8 % 37.2 %
shion OMATA JPN 1919.82 41 % 36.4 %
guillermo PEINADO FRANGANILLO ESP 1897.34 37.9 % 33.5 %
kibeom KWON KOR 1888.54 48 % 29.2 %
max BERTONE FRA 1885.98 47.7 % 28.9 %
stefan SCHERZ AUT 1883.42 47.3 % 28.6 %
Tomoa Narasaki JPN 1877.00 NA NA
satone YOSHIDA JPN 1874.24 46 % 27.5 %
ties VANCRAEYNEST BEL 1873.18 45.8 % 27.4 %
timo UZNIK AUT 1868.06 45.1 % 26.8 %
giorgio TOMATIS ITA 1865.50 44.7 % 26.5 %
ao YURIKUSA JPN 1857.89 43.6 % 25.7 %
yannick FLOH<U+00C9> GER 1849.00 NA NA
masahiro HIGUCHI JPN 1837.13 40.7 % 23.5 %
Hannes Van Duysen BEL 1827.00 NA NA
stefano GHISOLFI ITA 1826.61 39.3 % 22.4 %
Sean Bailey USA 1807.00 NA NA
mejdi SCHALCK FRA 1795.00 NA NA
yoshiyuki OGATA JPN 1783.00 NA NA
Hidemasa Nishida JPN 1774.00 NA NA
zento MURASHITA JPN 1770.43 31.9 % 17.3 %
Neo Suzuki JPN 1768.00 NA NA
luka POTOCAR SLO 1767.31 31.5 % 17 %
Hyunbin Min KOR 1761.00 NA NA
shuta TANAKA JPN 1760.00 NA NA
Hamish Mcarthur GBR 1751.00 NA NA
Yunchan Song KOR 1745.00 NA NA
paul JENFT FRA 1743.41 28.6 % 15.2 %
nao MONCHOIS FRA 1734.00 NA NA
martin STRANIK CZE 1723.00 NA NA
Meichi Narasaki JPN 1716.00 NA NA
Sebastian Halenke GER 1714.00 NA NA
jonas UTELLI SUI 1700.73 23.9 % 12.3 %
jules MARCHALAND FRA 1698.45 23.6 % 12.1 %
Yufei Pan CHN 1682.00 NA NA
hannes PUMAN SWE 1676.00 NA NA
Hanwool Kim KOR 1660.00 NA NA
ravianto RAMADHAN INA 1655.00 NA NA
Sean Mccoll CAN 1650.00 NA NA
Simon Lorenzi BEL 1646.00 NA NA
Nino Grunenfelder SUI 1644.00 NA NA
Nicolas Collin BEL 1617.00 NA NA
filip SCHENK ITA 1616.46 16.2 % 7.9 %
marcello BOMBARDI ITA 1614.00 NA NA
ars<U+00E8>ne DUVAL FRA 1600.00 NA NA
Dillon Countryman USA 1597.00 NA NA

Brianc

Brianc: Semi-finals

Semi-finals

-Competitors = n.semis-

#####_ Elo History _

Elo Accumulated Brianc Semis

competitor Ctry R.new Prob.Finals Prob.podium
Jakob Schubert AUT 2262.00 NA NA
sorato ANRAKU JPN 2237.00 NA NA
toby ROBERTS GBR 2201.39 77.9 % 74.3 %
alberto GIN<U+00C9>S L<U+00D3>PEZ ESP 2168.52 74.4 % 70.6 %
taisei HOMMA JPN 2087.71 80.9 % 74.5 %
dohyun LEE KOR 2054.00 NA NA
adam ONDRA CZE 2046.20 59 % 54.3 %
colin DUFFY USA 2016.56 54.8 % 50 %
Alexander Megos GER 1983.00 NA NA
sascha LEHMANN SUI 1976.89 49.1 % 44.3 %
jesse GRUPPER USA 1956.83 57.8 % 37.9 %
shion OMATA JPN 1949.31 65.7 % 56.8 %
sam AVEZOU FRA 1925.67 41.8 % 37.2 %
max BERTONE FRA 1905.41 59.8 % 50.6 %
satone YOSHIDA JPN 1901.42 59.2 % 50 %
guillermo PEINADO FRANGANILLO ESP 1897.34 37.9 % 33.5 %
kibeom KWON KOR 1892.60 58 % 48.7 %
Tomoa Narasaki JPN 1877.00 NA NA
timo UZNIK AUT 1868.06 45.1 % 26.8 %
ao YURIKUSA JPN 1857.00 53 % 43.6 %
stefan SCHERZ AUT 1849.11 51.8 % 42.5 %
yannick FLOH<U+00C9> GER 1849.00 NA NA
ties VANCRAEYNEST BEL 1846.60 51.5 % 42.2 %
mototaka ISHIZU JPN 1845.84 51.4 % 42.1 %
yuta IMAIZUMI JPN 1843.28 51 % 41.7 %
sebastian HALENKE GER 1840.72 50.6 % 41.4 %
masahiro HIGUCHI JPN 1837.13 40.7 % 23.5 %
giorgio TOMATIS ITA 1836.41 50 % 40.8 %
stefano GHISOLFI ITA 1833.58 49.6 % 40.4 %
giovanni PLACCI ITA 1830.48 49.1 % 39.9 %
Hannes Van Duysen BEL 1827.00 NA NA
christoph HANKE GER 1825.36 48.4 % 39.2 %
philipp MARTIN GER 1822.80 48 % 38.9 %
yuval SHEMLA ISR 1815.12 46.9 % 37.8 %
raviandi RAMADHAN INA 1812.56 46.6 % 37.5 %
Sean Bailey USA 1807.00 NA NA
nino GR<U+00DC>NENFELDER SUI 1804.88 45.5 % 36.5 %
jordi POLES FRA 1797.20 44.4 % 35.4 %
zento MURASHITA JPN 1795.64 44.2 % 35.2 %
mejdi SCHALCK FRA 1795.00 NA NA
yoshiyuki OGATA JPN 1792.78 43.8 % 34.9 %
shuta TANAKA JPN 1782.71 42.3 % 33.6 %
Hidemasa Nishida JPN 1774.00 NA NA
Neo Suzuki JPN 1768.00 NA NA
luka POTOCAR SLO 1767.31 31.5 % 17 %
Hyunbin Min KOR 1761.00 NA NA
Hamish Mcarthur GBR 1751.00 NA NA
Yunchan Song KOR 1745.00 NA NA
paul JENFT FRA 1743.41 28.6 % 15.2 %
nao MONCHOIS FRA 1734.00 NA NA
martin STRANIK CZE 1723.00 NA NA
Meichi Narasaki JPN 1716.00 NA NA
Sebastian Halenke GER 1714.00 NA NA
jules MARCHALAND FRA 1698.45 23.6 % 12.1 %
jonas UTELLI SUI 1682.79 29.2 % 22.1 %
Yufei Pan CHN 1682.00 NA NA
hannes PUMAN SWE 1676.00 NA NA
Hanwool Kim KOR 1660.00 NA NA
Sean Mccoll CAN 1650.00 NA NA
Simon Lorenzi BEL 1646.00 NA NA
Nino Grunenfelder SUI 1644.00 NA NA
ravianto RAMADHAN INA 1634.72 23.8 % 17.7 %
Nicolas Collin BEL 1617.00 NA NA
marcello BOMBARDI ITA 1614.00 NA NA
filip SCHENK ITA 1606.59 21 % 15.5 %
ars<U+00E8>ne DUVAL FRA 1600.00 NA NA
Dillon Countryman USA 1597.00 NA NA

Brianc: Final

Finals

-Competitors = n.final-

#####_ Elo History _

Elo Accumulated Brianc Final

competitor Ctry R.new Prob.Finals Prob.podium
Jakob Schubert AUT 2262.00 NA NA
sorato ANRAKU JPN 2237.00 NA NA
toby ROBERTS GBR 2201.39 77.9 % 74.3 %
alberto GIN<U+00C9>S L<U+00D3>PEZ ESP 2168.52 74.4 % 70.6 %
taisei HOMMA JPN 2087.71 80.9 % 74.5 %
dohyun LEE KOR 2054.00 NA NA
adam ONDRA CZE 2046.20 59 % 54.3 %
colin DUFFY USA 2016.56 54.8 % 50 %
Alexander Megos GER 1983.00 NA NA
sascha LEHMANN SUI 1976.89 49.1 % 44.3 %
shion OMATA JPN 1966.38 47.6 % 66.1 %
jesse GRUPPER USA 1956.83 57.8 % 37.9 %
sam AVEZOU FRA 1925.67 41.8 % 37.2 %
satone YOSHIDA JPN 1923.53 41.5 % 60.4 %
max BERTONE FRA 1918.34 40.8 % 59.7 %
guillermo PEINADO FRANGANILLO ESP 1897.34 37.9 % 33.5 %
kibeom KWON KOR 1892.60 58 % 48.7 %
Tomoa Narasaki JPN 1877.00 NA NA
timo UZNIK AUT 1868.06 45.1 % 26.8 %
ao YURIKUSA JPN 1857.00 53 % 43.6 %
mototaka ISHIZU JPN 1850.26 31.8 % 50 %
sebastian HALENKE GER 1849.77 31.7 % 49.9 %
stefan SCHERZ AUT 1849.11 51.8 % 42.5 %
yannick FLOH<U+00C9> GER 1849.00 NA NA
ties VANCRAEYNEST BEL 1846.60 51.5 % 42.2 %
yuta IMAIZUMI JPN 1838.59 30.3 % 48.3 %
masahiro HIGUCHI JPN 1837.13 40.7 % 23.5 %
giorgio TOMATIS ITA 1836.41 50 % 40.8 %
stefano GHISOLFI ITA 1833.58 49.6 % 40.4 %
giovanni PLACCI ITA 1830.48 49.1 % 39.9 %
Hannes Van Duysen BEL 1827.00 NA NA
christoph HANKE GER 1825.36 48.4 % 39.2 %
zento MURASHITA JPN 1823.49 28.5 % 46.2 %
philipp MARTIN GER 1822.80 48 % 38.9 %
yuval SHEMLA ISR 1815.12 46.9 % 37.8 %
raviandi RAMADHAN INA 1812.56 46.6 % 37.5 %
Sean Bailey USA 1807.00 NA NA
nino GR<U+00DC>NENFELDER SUI 1804.88 45.5 % 36.5 %
jordi POLES FRA 1797.20 44.4 % 35.4 %
mejdi SCHALCK FRA 1795.00 NA NA
yoshiyuki OGATA JPN 1792.78 43.8 % 34.9 %
shuta TANAKA JPN 1783.28 24.1 % 40.5 %
Hidemasa Nishida JPN 1774.00 NA NA
Neo Suzuki JPN 1768.00 NA NA
luka POTOCAR SLO 1767.31 31.5 % 17 %
Hyunbin Min KOR 1761.00 NA NA
Hamish Mcarthur GBR 1751.00 NA NA
Yunchan Song KOR 1745.00 NA NA
paul JENFT FRA 1743.41 28.6 % 15.2 %
nao MONCHOIS FRA 1734.00 NA NA
martin STRANIK CZE 1723.00 NA NA
Meichi Narasaki JPN 1716.00 NA NA
Sebastian Halenke GER 1714.00 NA NA
jules MARCHALAND FRA 1698.45 23.6 % 12.1 %
jonas UTELLI SUI 1682.79 29.2 % 22.1 %
Yufei Pan CHN 1682.00 NA NA
hannes PUMAN SWE 1676.00 NA NA
Hanwool Kim KOR 1660.00 NA NA
Sean Mccoll CAN 1650.00 NA NA
Simon Lorenzi BEL 1646.00 NA NA
Nino Grunenfelder SUI 1644.00 NA NA
ravianto RAMADHAN INA 1634.72 23.8 % 17.7 %
Nicolas Collin BEL 1617.00 NA NA
marcello BOMBARDI ITA 1614.00 NA NA
filip SCHENK ITA 1606.59 21 % 15.5 %
ars<U+00E8>ne DUVAL FRA 1600.00 NA NA
Dillon Countryman USA 1597.00 NA NA

Koper

Koper: Semi-finals

Semi-finals

-Competitors = n.semis-

#####_ Elo History _

Elo Accumulated Koper Semis

competitor Ctry R.new Prob.Finals Prob.podium
sorato ANRAKU JPN 2266.73 88.9 % 77.1 %
Jakob Schubert AUT 2262.00 NA NA
toby ROBERTS GBR 2228.61 86.5 % 72.9 %
alberto GIN<U+00C9>S L<U+00D3>PEZ ESP 2168.52 74.4 % 70.6 %
dohyun LEE KOR 2066.20 71.6 % 51.4 %
taisei HOMMA JPN 2056.30 70.4 % 50 %
adam ONDRA CZE 2046.20 59 % 54.3 %
colin DUFFY USA 2016.56 54.8 % 50 %
shion OMATA JPN 1991.66 62.2 % 40.8 %
sascha LEHMANN SUI 1986.78 61.5 % 40.1 %
Alexander Megos GER 1983.00 NA NA
jesse GRUPPER USA 1956.83 57.8 % 37.9 %
sam AVEZOU FRA 1945.98 55.8 % 34.6 %
max BERTONE FRA 1933.55 54 % 33 %
satone YOSHIDA JPN 1905.44 50 % 29.6 %
kibeom KWON KOR 1897.67 48.9 % 28.6 %
guillermo PEINADO FRANGANILLO ESP 1897.34 37.9 % 33.5 %
Tomoa Narasaki JPN 1877.00 NA NA
ao YURIKUSA JPN 1875.00 45.6 % 26 %
yannick FLOH<U+00C9> GER 1872.15 45.2 % 25.7 %
timo UZNIK AUT 1868.06 45.1 % 26.8 %
ross FULKERSON USA 1855.30 42.8 % 23.9 %
mototaka ISHIZU JPN 1850.26 31.8 % 50 %
sebastian HALENKE GER 1849.77 31.7 % 49.9 %
stefan SCHERZ AUT 1849.11 51.8 % 42.5 %
yuta IMAIZUMI JPN 1841.30 40.9 % 22.5 %
stefano GHISOLFI ITA 1833.58 49.6 % 40.4 %
zento MURASHITA JPN 1831.37 39.5 % 21.5 %
ties VANCRAEYNEST BEL 1831.36 39.5 % 21.5 %
giovanni PLACCI ITA 1830.48 49.1 % 39.9 %
masahiro HIGUCHI JPN 1829.60 39.3 % 21.3 %
Hannes Van Duysen BEL 1827.00 NA NA
christoph HANKE GER 1825.36 48.4 % 39.2 %
philipp MARTIN GER 1822.80 48 % 38.9 %
yuval SHEMLA ISR 1815.12 46.9 % 37.8 %
raviandi RAMADHAN INA 1812.56 46.6 % 37.5 %
giorgio TOMATIS ITA 1810.96 36.7 % 19.6 %
Sean Bailey USA 1807.00 NA NA
jordi POLES FRA 1797.20 44.4 % 35.4 %
yoshiyuki OGATA JPN 1780.29 32.7 % 17 %
mejdi SCHALCK FRA 1774.82 32 % 16.5 %
Hidemasa Nishida JPN 1774.00 NA NA
shuta TANAKA JPN 1773.38 31.9 % 16.4 %
nino GR<U+00DC>NENFELDER SUI 1771.87 31.7 % 16.3 %
Neo Suzuki JPN 1768.00 NA NA
luka POTOCAR SLO 1767.31 31.5 % 17 %
Hyunbin Min KOR 1761.00 NA NA
Hamish Mcarthur GBR 1751.00 NA NA
Yunchan Song KOR 1745.00 NA NA
paul JENFT FRA 1743.41 28.6 % 15.2 %
nao MONCHOIS FRA 1734.00 NA NA
martin STRANIK CZE 1720.98 25.7 % 12.7 %
Meichi Narasaki JPN 1716.00 NA NA
Sebastian Halenke GER 1714.00 NA NA
Yufei Pan CHN 1682.00 NA NA
jonas UTELLI SUI 1678.32 21.3 % 10.2 %
hannes PUMAN SWE 1676.00 NA NA
jules MARCHALAND FRA 1670.90 20.6 % 9.8 %
Hanwool Kim KOR 1660.00 NA NA
Sean Mccoll CAN 1650.00 NA NA
Simon Lorenzi BEL 1646.00 NA NA
Nino Grunenfelder SUI 1644.00 NA NA
ravianto RAMADHAN INA 1634.72 23.8 % 17.7 %
Nicolas Collin BEL 1617.00 NA NA
marcello BOMBARDI ITA 1614.00 NA NA
filip SCHENK ITA 1607.43 15.2 % 7 %
ars<U+00E8>ne DUVAL FRA 1600.00 NA NA
Dillon Countryman USA 1597.00 NA NA

Koper: Final

Finals

-Competitors = n.final-

#####_ Elo History _

Elo Accumulated Koper Final

competitor Ctry R.new Prob.Finals Prob.podium
sorato ANRAKU JPN 2286.91 84.5 % 83.5 %
Jakob Schubert AUT 2262.00 NA NA
toby ROBERTS GBR 2253.52 81.9 % 80.7 %
alberto GIN<U+00C9>S L<U+00D3>PEZ ESP 2168.52 74.4 % 70.6 %
dohyun LEE KOR 2060.17 59.7 % 57.9 %
taisei HOMMA JPN 2056.30 70.4 % 50 %
adam ONDRA CZE 2046.20 59 % 54.3 %
colin DUFFY USA 2016.56 54.8 % 50 %
shion OMATA JPN 2004.62 51.9 % 50 %
sascha LEHMANN SUI 1986.78 61.5 % 40.1 %
Alexander Megos GER 1983.00 NA NA
sam AVEZOU FRA 1964.00 46 % 44.2 %
jesse GRUPPER USA 1956.83 57.8 % 37.9 %
max BERTONE FRA 1937.99 42.3 % 40.5 %
satone YOSHIDA JPN 1905.44 50 % 29.6 %
kibeom KWON KOR 1897.67 48.9 % 28.6 %
guillermo PEINADO FRANGANILLO ESP 1897.34 37.9 % 33.5 %
yannick FLOH<U+00C9> GER 1881.86 34.7 % 33 %
Tomoa Narasaki JPN 1877.00 NA NA
ao YURIKUSA JPN 1875.54 33.9 % 32.2 %
timo UZNIK AUT 1868.06 45.1 % 26.8 %
ross FULKERSON USA 1855.30 42.8 % 23.9 %
mototaka ISHIZU JPN 1850.26 31.8 % 50 %
sebastian HALENKE GER 1849.77 31.7 % 49.9 %
stefan SCHERZ AUT 1849.11 51.8 % 42.5 %
yuta IMAIZUMI JPN 1841.30 40.9 % 22.5 %
stefano GHISOLFI ITA 1833.58 49.6 % 40.4 %
zento MURASHITA JPN 1831.37 39.5 % 21.5 %
ties VANCRAEYNEST BEL 1831.36 39.5 % 21.5 %
giovanni PLACCI ITA 1830.48 49.1 % 39.9 %
masahiro HIGUCHI JPN 1829.60 39.3 % 21.3 %
Hannes Van Duysen BEL 1827.00 NA NA
christoph HANKE GER 1825.36 48.4 % 39.2 %
philipp MARTIN GER 1822.80 48 % 38.9 %
yuval SHEMLA ISR 1815.12 46.9 % 37.8 %
raviandi RAMADHAN INA 1812.56 46.6 % 37.5 %
giorgio TOMATIS ITA 1810.96 36.7 % 19.6 %
Sean Bailey USA 1807.00 NA NA
jordi POLES FRA 1797.20 44.4 % 35.4 %
yoshiyuki OGATA JPN 1780.29 32.7 % 17 %
mejdi SCHALCK FRA 1774.82 32 % 16.5 %
Hidemasa Nishida JPN 1774.00 NA NA
shuta TANAKA JPN 1773.38 31.9 % 16.4 %
nino GR<U+00DC>NENFELDER SUI 1771.87 31.7 % 16.3 %
Neo Suzuki JPN 1768.00 NA NA
luka POTOCAR SLO 1767.31 31.5 % 17 %
Hyunbin Min KOR 1761.00 NA NA
Hamish Mcarthur GBR 1751.00 NA NA
Yunchan Song KOR 1745.00 NA NA
paul JENFT FRA 1743.41 28.6 % 15.2 %
nao MONCHOIS FRA 1734.00 NA NA
martin STRANIK CZE 1720.98 25.7 % 12.7 %
Meichi Narasaki JPN 1716.00 NA NA
Sebastian Halenke GER 1714.00 NA NA
Yufei Pan CHN 1682.00 NA NA
jonas UTELLI SUI 1678.32 21.3 % 10.2 %
hannes PUMAN SWE 1676.00 NA NA
jules MARCHALAND FRA 1670.90 20.6 % 9.8 %
Hanwool Kim KOR 1660.00 NA NA
Sean Mccoll CAN 1650.00 NA NA
Simon Lorenzi BEL 1646.00 NA NA
Nino Grunenfelder SUI 1644.00 NA NA
ravianto RAMADHAN INA 1634.72 23.8 % 17.7 %
Nicolas Collin BEL 1617.00 NA NA
marcello BOMBARDI ITA 1614.00 NA NA
filip SCHENK ITA 1607.43 15.2 % 7 %
ars<U+00E8>ne DUVAL FRA 1600.00 NA NA
Dillon Countryman USA 1597.00 NA NA

Seoul

Seoul: Semi-finals

Semi-finals

-Competitors = n.semis-

#####_ Elo History _

Elo Accumulated Seoul Semis

competitor Ctry R.new Prob.Finals Prob.podium
sorato ANRAKU JPN 2316.37 91.9 % 83.9 %
Jakob Schubert AUT 2262.00 NA NA
toby ROBERTS GBR 2253.52 81.9 % 80.7 %
alberto GIN<U+00C9>S L<U+00D3>PEZ ESP 2168.52 74.4 % 70.6 %
taisei HOMMA JPN 2083.69 74.8 % 57.7 %
dohyun LEE KOR 2082.42 74.6 % 57.5 %
adam ONDRA CZE 2046.20 59 % 54.3 %
shion OMATA JPN 2029.62 68.5 % 50 %
colin DUFFY USA 2016.56 54.8 % 50 %
sascha LEHMANN SUI 1986.24 62.8 % 43.8 %
Alexander Megos GER 1983.00 NA NA
sam AVEZOU FRA 1976.34 61.5 % 42.4 %
jesse GRUPPER USA 1956.83 57.8 % 37.9 %
max BERTONE FRA 1919.71 53.6 % 34.7 %
satone YOSHIDA JPN 1912.89 52.6 % 33.8 %
guillermo PEINADO FRANGANILLO ESP 1897.34 37.9 % 33.5 %
kibeom KWON KOR 1894.91 50 % 31.5 %
ao YURIKUSA JPN 1885.67 48.7 % 30.4 %
yannick FLOH<U+00C9> GER 1881.86 34.7 % 33 %
Tomoa Narasaki JPN 1877.00 NA NA
shinyeong YUN KOR 1868.29 46.2 % 28.3 %
timo UZNIK AUT 1868.06 45.1 % 26.8 %
oscar BAUDRAND CAN 1865.73 45.8 % 28 %
yuta IMAIZUMI JPN 1861.81 45.3 % 27.6 %
ross FULKERSON USA 1855.30 42.8 % 23.9 %
sebastian HALENKE GER 1849.77 31.7 % 49.9 %
stefan SCHERZ AUT 1849.11 51.8 % 42.5 %
hyunbin MIN KOR 1845.25 42.9 % 25.7 %
mototaka ISHIZU JPN 1837.45 41.8 % 24.9 %
zento MURASHITA JPN 1836.56 41.7 % 24.8 %
stefano GHISOLFI ITA 1833.58 49.6 % 40.4 %
ties VANCRAEYNEST BEL 1831.36 39.5 % 21.5 %
Hannes Van Duysen BEL 1827.00 NA NA
christoph HANKE GER 1825.36 48.4 % 39.2 %
yuval SHEMLA ISR 1815.12 46.9 % 37.8 %
raviandi RAMADHAN INA 1812.56 46.6 % 37.5 %
masahiro HIGUCHI JPN 1809.19 37.9 % 21.9 %
Sean Bailey USA 1807.00 NA NA
giovanni PLACCI ITA 1804.95 37.3 % 21.5 %
jordi POLES FRA 1797.20 44.4 % 35.4 %
yoshiyuki OGATA JPN 1795.91 36.1 % 20.7 %
philipp MARTIN GER 1794.74 36 % 20.6 %
giorgio TOMATIS ITA 1788.07 35.1 % 19.9 %
shuta TANAKA JPN 1776.23 33.6 % 18.9 %
Hidemasa Nishida JPN 1774.00 NA NA
nino GR<U+00DC>NENFELDER SUI 1771.87 31.7 % 16.3 %
Neo Suzuki JPN 1768.00 NA NA
luka POTOCAR SLO 1767.31 31.5 % 17 %
paul JENFT FRA 1761.73 31.7 % 17.6 %
Hyunbin Min KOR 1761.00 NA NA
mejdi SCHALCK FRA 1759.74 31.5 % 17.5 %
Hamish Mcarthur GBR 1751.00 NA NA
Yunchan Song KOR 1745.00 NA NA
nao MONCHOIS FRA 1734.00 NA NA
martin STRANIK CZE 1720.98 25.7 % 12.7 %
Meichi Narasaki JPN 1716.00 NA NA
Sebastian Halenke GER 1714.00 NA NA
Yufei Pan CHN 1682.00 NA NA
hannes PUMAN SWE 1676.00 NA NA
jules MARCHALAND FRA 1670.90 20.6 % 9.8 %
Hanwool Kim KOR 1660.00 NA NA
Sean Mccoll CAN 1650.00 NA NA
Simon Lorenzi BEL 1646.00 NA NA
jonas UTELLI SUI 1645.64 19.2 % 9.9 %
Nino Grunenfelder SUI 1644.00 NA NA
ravianto RAMADHAN INA 1634.72 23.8 % 17.7 %
Nicolas Collin BEL 1617.00 NA NA
marcello BOMBARDI ITA 1614.00 NA NA
filip SCHENK ITA 1603.10 15.7 % 7.9 %
ars<U+00E8>ne DUVAL FRA 1600.00 NA NA
Dillon Countryman USA 1597.00 NA NA

Seoul: Final

Finals

-Competitors = n.final-

#####_ Elo History _

Elo Accumulated Seoul Final

competitor Ctry R.new Prob.Finals Prob.podium
sorato ANRAKU JPN 2340.69 86.6 % 84.5 %
Jakob Schubert AUT 2262.00 NA NA
toby ROBERTS GBR 2253.52 81.9 % 80.7 %
alberto GIN<U+00C9>S L<U+00D3>PEZ ESP 2168.52 74.4 % 70.6 %
dohyun LEE KOR 2102.94 62.2 % 58.1 %
taisei HOMMA JPN 2076.77 58.6 % 54.4 %
adam ONDRA CZE 2046.20 59 % 54.3 %
shion OMATA JPN 2045.89 54.2 % 50 %
colin DUFFY USA 2016.56 54.8 % 50 %
sascha LEHMANN SUI 1986.24 62.8 % 43.8 %
sam AVEZOU FRA 1983.86 45.3 % 41.2 %
Alexander Megos GER 1983.00 NA NA
jesse GRUPPER USA 1956.83 57.8 % 37.9 %
max BERTONE FRA 1919.71 53.6 % 34.7 %
satone YOSHIDA JPN 1912.89 52.6 % 33.8 %
guillermo PEINADO FRANGANILLO ESP 1897.34 37.9 % 33.5 %
kibeom KWON KOR 1894.91 50 % 31.5 %
ao YURIKUSA JPN 1885.67 48.7 % 30.4 %
yannick FLOH<U+00C9> GER 1881.86 34.7 % 33 %
Tomoa Narasaki JPN 1877.00 NA NA
shinyeong YUN KOR 1868.29 46.2 % 28.3 %
timo UZNIK AUT 1868.06 45.1 % 26.8 %
oscar BAUDRAND CAN 1865.73 45.8 % 28 %
yuta IMAIZUMI JPN 1861.26 29 % 25.7 %
ross FULKERSON USA 1855.30 42.8 % 23.9 %
sebastian HALENKE GER 1849.77 31.7 % 49.9 %
stefan SCHERZ AUT 1849.11 51.8 % 42.5 %
hyunbin MIN KOR 1845.25 42.9 % 25.7 %
mototaka ISHIZU JPN 1837.45 41.8 % 24.9 %
zento MURASHITA JPN 1836.56 41.7 % 24.8 %
stefano GHISOLFI ITA 1833.58 49.6 % 40.4 %
ties VANCRAEYNEST BEL 1831.36 39.5 % 21.5 %
Hannes Van Duysen BEL 1827.00 NA NA
christoph HANKE GER 1825.36 48.4 % 39.2 %
yuval SHEMLA ISR 1815.12 46.9 % 37.8 %
raviandi RAMADHAN INA 1812.56 46.6 % 37.5 %
masahiro HIGUCHI JPN 1809.19 37.9 % 21.9 %
Sean Bailey USA 1807.00 NA NA
giovanni PLACCI ITA 1804.95 37.3 % 21.5 %
yoshiyuki OGATA JPN 1800.66 22.4 % 19.6 %
jordi POLES FRA 1797.20 44.4 % 35.4 %
philipp MARTIN GER 1794.74 36 % 20.6 %
giorgio TOMATIS ITA 1788.07 35.1 % 19.9 %
shuta TANAKA JPN 1776.23 33.6 % 18.9 %
paul JENFT FRA 1776.02 20 % 17.5 %
Hidemasa Nishida JPN 1774.00 NA NA
nino GR<U+00DC>NENFELDER SUI 1771.87 31.7 % 16.3 %
Neo Suzuki JPN 1768.00 NA NA
luka POTOCAR SLO 1767.31 31.5 % 17 %
Hyunbin Min KOR 1761.00 NA NA
mejdi SCHALCK FRA 1759.74 31.5 % 17.5 %
Hamish Mcarthur GBR 1751.00 NA NA
Yunchan Song KOR 1745.00 NA NA
nao MONCHOIS FRA 1734.00 NA NA
martin STRANIK CZE 1720.98 25.7 % 12.7 %
Meichi Narasaki JPN 1716.00 NA NA
Sebastian Halenke GER 1714.00 NA NA
Yufei Pan CHN 1682.00 NA NA
hannes PUMAN SWE 1676.00 NA NA
jules MARCHALAND FRA 1670.90 20.6 % 9.8 %
Hanwool Kim KOR 1660.00 NA NA
Sean Mccoll CAN 1650.00 NA NA
Simon Lorenzi BEL 1646.00 NA NA
jonas UTELLI SUI 1645.64 19.2 % 9.9 %
Nino Grunenfelder SUI 1644.00 NA NA
ravianto RAMADHAN INA 1634.72 23.8 % 17.7 %
Nicolas Collin BEL 1617.00 NA NA
marcello BOMBARDI ITA 1614.00 NA NA
filip SCHENK ITA 1603.10 15.7 % 7.9 %
ars<U+00E8>ne DUVAL FRA 1600.00 NA NA
Dillon Countryman USA 1597.00 NA NA

Wujiang

Wujiang: Semi-finals

Semi-finals

-Competitors = n.semis-

#####_ Elo History _

Elo Accumulated Wujiang Semis

competitor Ctry R.new Prob.Finals Prob.podium
sorato ANRAKU JPN 2369.47 91.6 % 83.3 %
Jakob Schubert AUT 2262.00 NA NA
toby ROBERTS GBR 2243.52 84.1 % 70.7 %
alberto GIN<U+00C9>S L<U+00D3>PEZ ESP 2197.73 80.3 % 64.9 %
dohyun LEE KOR 2090.67 68.8 % 50 %
taisei HOMMA JPN 2078.52 67.2 % 48.3 %
adam ONDRA CZE 2046.20 59 % 54.3 %
shion OMATA JPN 2039.44 62.1 % 42.7 %
colin DUFFY USA 2016.56 54.8 % 50 %
Alexander Megos GER 1983.00 NA NA
sascha LEHMANN SUI 1971.73 52.6 % 33.5 %
neo SUZUKI JPN 1966.91 51.9 % 32.9 %
yufei PAN CHN 1961.35 51.1 % 32.2 %
sam AVEZOU FRA 1961.01 51.1 % 32.2 %
jesse GRUPPER USA 1953.60 50 % 31.2 %
hannes VAN DUYSEN BEL 1950.22 49.5 % 30.8 %
satone YOSHIDA JPN 1934.93 47.3 % 29 %
hiroto SHIMIZU JPN 1919.61 45.1 % 27.2 %
yannick NAGEL GER 1916.82 44.7 % 26.9 %
joonha SHIN KOR 1914.04 44.3 % 26.6 %
max BERTONE FRA 1902.76 42.7 % 25.3 %
guillermo PEINADO FRANGANILLO ESP 1897.34 37.9 % 33.5 %
kibeom KWON KOR 1894.91 50 % 31.5 %
yannick FLOH<U+00C9> GER 1892.92 41.4 % 24.3 %
ao YURIKUSA JPN 1885.67 48.7 % 30.4 %
Tomoa Narasaki JPN 1877.00 NA NA
shinyeong YUN KOR 1868.29 46.2 % 28.3 %
timo UZNIK AUT 1868.06 45.1 % 26.8 %
oscar BAUDRAND CAN 1865.73 45.8 % 28 %
yuta IMAIZUMI JPN 1861.26 29 % 25.7 %
ross FULKERSON USA 1855.30 42.8 % 23.9 %
sebastian HALENKE GER 1849.77 31.7 % 49.9 %
stefan SCHERZ AUT 1849.11 51.8 % 42.5 %
hyunbin MIN KOR 1845.25 42.9 % 25.7 %
mototaka ISHIZU JPN 1837.45 41.8 % 24.9 %
zento MURASHITA JPN 1836.56 41.7 % 24.8 %
stefano GHISOLFI ITA 1833.58 49.6 % 40.4 %
ties VANCRAEYNEST BEL 1831.36 39.5 % 21.5 %
Hannes Van Duysen BEL 1827.00 NA NA
christoph HANKE GER 1825.36 48.4 % 39.2 %
yuval SHEMLA ISR 1815.12 46.9 % 37.8 %
raviandi RAMADHAN INA 1812.56 46.6 % 37.5 %
masahiro HIGUCHI JPN 1809.19 37.9 % 21.9 %
Sean Bailey USA 1807.00 NA NA
giovanni PLACCI ITA 1805.24 29.9 % 16.2 %
yoshiyuki OGATA JPN 1800.66 22.4 % 19.6 %
jordi POLES FRA 1797.20 44.4 % 35.4 %
philipp MARTIN GER 1794.74 36 % 20.6 %
luka POTOCAR SLO 1781.67 27.1 % 14.4 %
shuta TANAKA JPN 1776.23 33.6 % 18.9 %
paul JENFT FRA 1776.02 20 % 17.5 %
Hidemasa Nishida JPN 1774.00 NA NA
giorgio TOMATIS ITA 1768.96 25.7 % 13.6 %
Neo Suzuki JPN 1768.00 NA NA
Hyunbin Min KOR 1761.00 NA NA
mejdi SCHALCK FRA 1759.74 31.5 % 17.5 %
Hamish Mcarthur GBR 1751.00 NA NA
Yunchan Song KOR 1745.00 NA NA
nino GR<U+00DC>NENFELDER SUI 1738.91 22.5 % 11.7 %
nao MONCHOIS FRA 1734.00 NA NA
martin STRANIK CZE 1720.98 25.7 % 12.7 %
Meichi Narasaki JPN 1716.00 NA NA
Sebastian Halenke GER 1714.00 NA NA
Yufei Pan CHN 1682.00 NA NA
hannes PUMAN SWE 1676.00 NA NA
jules MARCHALAND FRA 1670.90 20.6 % 9.8 %
Hanwool Kim KOR 1660.00 NA NA
jonas UTELLI SUI 1654.84 15.2 % 7.5 %
Sean Mccoll CAN 1650.00 NA NA
Simon Lorenzi BEL 1646.00 NA NA
Nino Grunenfelder SUI 1644.00 NA NA
ravianto RAMADHAN INA 1634.72 23.8 % 17.7 %
filip SCHENK ITA 1629.10 13.4 % 6.6 %
Nicolas Collin BEL 1617.00 NA NA
marcello BOMBARDI ITA 1614.00 NA NA
ars<U+00E8>ne DUVAL FRA 1600.00 NA NA
Dillon Countryman USA 1597.00 NA NA

Wujiang: Final

Finals

-Competitors = n.final-

#####_ Elo History _

Elo Accumulated Wujiang Final

competitor Ctry R.new Prob.Finals Prob.podium
sorato ANRAKU JPN 2393.58 89.8 % 92.1 %
Jakob Schubert AUT 2262.00 NA NA
toby ROBERTS GBR 2243.52 84.1 % 70.7 %
alberto GIN<U+00C9>S L<U+00D3>PEZ ESP 2212.88 75.6 % 80.4 %
dohyun LEE KOR 2090.67 68.8 % 50 %
taisei HOMMA JPN 2078.52 67.2 % 48.3 %
adam ONDRA CZE 2046.20 59 % 54.3 %
shion OMATA JPN 2039.44 62.1 % 42.7 %
colin DUFFY USA 2016.56 54.8 % 50 %
neo SUZUKI JPN 1987.34 45.8 % 52.8 %
Alexander Megos GER 1983.00 NA NA
sascha LEHMANN SUI 1971.73 52.6 % 33.5 %
yufei PAN CHN 1968.09 43.1 % 50 %
sam AVEZOU FRA 1961.01 51.1 % 32.2 %
jesse GRUPPER USA 1953.60 50 % 31.2 %
hannes VAN DUYSEN BEL 1950.22 49.5 % 30.8 %
satone YOSHIDA JPN 1946.39 40 % 46.9 %
hiroto SHIMIZU JPN 1919.61 45.1 % 27.2 %
yannick NAGEL GER 1916.82 44.7 % 26.9 %
joonha SHIN KOR 1914.04 44.3 % 26.6 %
max BERTONE FRA 1902.76 42.7 % 25.3 %
guillermo PEINADO FRANGANILLO ESP 1897.34 37.9 % 33.5 %
kibeom KWON KOR 1894.91 50 % 31.5 %
yannick FLOH<U+00C9> GER 1886.36 32.1 % 38.4 %
ao YURIKUSA JPN 1885.67 48.7 % 30.4 %
Tomoa Narasaki JPN 1877.00 NA NA
shinyeong YUN KOR 1868.29 46.2 % 28.3 %
timo UZNIK AUT 1868.06 45.1 % 26.8 %
oscar BAUDRAND CAN 1865.73 45.8 % 28 %
yuta IMAIZUMI JPN 1861.26 29 % 25.7 %
ross FULKERSON USA 1855.30 42.8 % 23.9 %
sebastian HALENKE GER 1849.77 31.7 % 49.9 %
stefan SCHERZ AUT 1849.11 51.8 % 42.5 %
hyunbin MIN KOR 1845.25 42.9 % 25.7 %
mototaka ISHIZU JPN 1837.45 41.8 % 24.9 %
zento MURASHITA JPN 1836.56 41.7 % 24.8 %
stefano GHISOLFI ITA 1833.58 49.6 % 40.4 %
ties VANCRAEYNEST BEL 1831.36 39.5 % 21.5 %
Hannes Van Duysen BEL 1827.00 NA NA
christoph HANKE GER 1825.36 48.4 % 39.2 %
yuval SHEMLA ISR 1815.12 46.9 % 37.8 %
raviandi RAMADHAN INA 1812.56 46.6 % 37.5 %
masahiro HIGUCHI JPN 1809.19 37.9 % 21.9 %
Sean Bailey USA 1807.00 NA NA
giovanni PLACCI ITA 1805.24 29.9 % 16.2 %
yoshiyuki OGATA JPN 1800.66 22.4 % 19.6 %
jordi POLES FRA 1797.20 44.4 % 35.4 %
philipp MARTIN GER 1794.74 36 % 20.6 %
luka POTOCAR SLO 1785.16 20.9 % 25.9 %
shuta TANAKA JPN 1776.23 33.6 % 18.9 %
paul JENFT FRA 1776.02 20 % 17.5 %
Hidemasa Nishida JPN 1774.00 NA NA
giorgio TOMATIS ITA 1768.96 25.7 % 13.6 %
Neo Suzuki JPN 1768.00 NA NA
Hyunbin Min KOR 1761.00 NA NA
mejdi SCHALCK FRA 1759.74 31.5 % 17.5 %
Hamish Mcarthur GBR 1751.00 NA NA
Yunchan Song KOR 1745.00 NA NA
nino GR<U+00DC>NENFELDER SUI 1738.91 22.5 % 11.7 %
nao MONCHOIS FRA 1734.00 NA NA
martin STRANIK CZE 1720.98 25.7 % 12.7 %
Meichi Narasaki JPN 1716.00 NA NA
Sebastian Halenke GER 1714.00 NA NA
Yufei Pan CHN 1682.00 NA NA
hannes PUMAN SWE 1676.00 NA NA
jules MARCHALAND FRA 1670.90 20.6 % 9.8 %
Hanwool Kim KOR 1660.00 NA NA
jonas UTELLI SUI 1654.84 15.2 % 7.5 %
Sean Mccoll CAN 1650.00 NA NA
Simon Lorenzi BEL 1646.00 NA NA
Nino Grunenfelder SUI 1644.00 NA NA
ravianto RAMADHAN INA 1634.72 23.8 % 17.7 %
filip SCHENK ITA 1629.67 9.7 % 12.5 %
Nicolas Collin BEL 1617.00 NA NA
marcello BOMBARDI ITA 1614.00 NA NA
ars<U+00E8>ne DUVAL FRA 1600.00 NA NA
Dillon Countryman USA 1597.00 NA NA

Bali

Bali: Semi-finals

Semi-finals

-Competitors = n.semis-

#####_ Elo History _

Elo Accumulated Bali Semis

competitor Ctry R.new Prob.Finals Prob.podium
sorato ANRAKU JPN 2380.84 92.3 % 84.7 %
Jakob Schubert AUT 2262.00 NA NA
toby ROBERTS GBR 2243.52 84.1 % 70.7 %
alberto GIN<U+00C9>S L<U+00D3>PEZ ESP 2236.62 83.9 % 70.7 %
dohyun LEE KOR 2109.22 71.4 % 53.7 %
taisei HOMMA JPN 2083.20 68.2 % 50 %
shion OMATA JPN 2055.40 64.7 % 46 %
adam ONDRA CZE 2046.20 59 % 54.3 %
colin DUFFY USA 2016.56 54.8 % 50 %
neo SUZUKI JPN 2009.09 58.4 % 39.5 %
Alexander Megos GER 1983.00 NA NA
satone YOSHIDA JPN 1976.67 53.8 % 35.1 %
yufei PAN CHN 1968.09 43.1 % 50 %
sascha LEHMANN SUI 1962.94 51.8 % 33.4 %
sam AVEZOU FRA 1961.01 51.1 % 32.2 %
jesse GRUPPER USA 1950.46 50 % 31.8 %
hannes VAN DUYSEN BEL 1950.22 49.5 % 30.8 %
muhammad RIZKY SYAHRAFLI SIMATUPANG INA 1935.01 47.8 % 29.9 %
hiroto SHIMIZU JPN 1922.19 45.9 % 28.4 %
hyunseung NOH KOR 1921.10 45.8 % 28.2 %
yannick NAGEL GER 1916.82 44.7 % 26.9 %
yannick FLOH<U+00C9> GER 1914.14 44.8 % 27.4 %
joonha SHIN KOR 1914.04 44.3 % 26.6 %
max BERTONE FRA 1913.77 44.7 % 27.4 %
putra TRI RAMADANI INA 1907.19 43.8 % 26.6 %
victor GUILLERMIN FRA 1901.62 43 % 26 %
guillermo PEINADO FRANGANILLO ESP 1897.34 37.9 % 33.5 %
kibeom KWON KOR 1894.91 50 % 31.5 %
ao YURIKUSA JPN 1885.67 48.7 % 30.4 %
Tomoa Narasaki JPN 1877.00 NA NA
shinyeong YUN KOR 1868.29 46.2 % 28.3 %
timo UZNIK AUT 1868.06 45.1 % 26.8 %
oscar BAUDRAND CAN 1865.73 45.8 % 28 %
yuta IMAIZUMI JPN 1861.26 29 % 25.7 %
ross FULKERSON USA 1855.30 42.8 % 23.9 %
stefan SCHERZ AUT 1849.11 51.8 % 42.5 %
hyunbin MIN KOR 1845.25 42.9 % 25.7 %
mototaka ISHIZU JPN 1837.45 41.8 % 24.9 %
zento MURASHITA JPN 1836.56 41.7 % 24.8 %
stefano GHISOLFI ITA 1833.58 49.6 % 40.4 %
Hannes Van Duysen BEL 1827.00 NA NA
christoph HANKE GER 1825.36 48.4 % 39.2 %
sebastian HALENKE GER 1816.49 31.6 % 17.7 %
yuval SHEMLA ISR 1815.12 46.9 % 37.8 %
ties VANCRAEYNEST BEL 1809.30 30.7 % 17.1 %
masahiro HIGUCHI JPN 1809.19 37.9 % 21.9 %
Sean Bailey USA 1807.00 NA NA
yoshiyuki OGATA JPN 1800.66 22.4 % 19.6 %
giovanni PLACCI ITA 1799.98 29.6 % 16.4 %
jordi POLES FRA 1797.20 44.4 % 35.4 %
raviandi RAMADHAN INA 1796.14 29.1 % 16.1 %
philipp MARTIN GER 1794.74 36 % 20.6 %
luka POTOCAR SLO 1785.16 20.9 % 25.9 %
shuta TANAKA JPN 1776.23 33.6 % 18.9 %
paul JENFT FRA 1776.02 20 % 17.5 %
Hidemasa Nishida JPN 1774.00 NA NA
giorgio TOMATIS ITA 1768.96 25.7 % 13.6 %
Neo Suzuki JPN 1768.00 NA NA
Hyunbin Min KOR 1761.00 NA NA
mejdi SCHALCK FRA 1759.74 31.5 % 17.5 %
Hamish Mcarthur GBR 1751.00 NA NA
Yunchan Song KOR 1745.00 NA NA
nao MONCHOIS FRA 1734.00 NA NA
Meichi Narasaki JPN 1716.00 NA NA
Sebastian Halenke GER 1714.00 NA NA
nino GR<U+00DC>NENFELDER SUI 1708.86 19.9 % 10.4 %
martin STRANIK CZE 1693.78 18.6 % 9.6 %
Yufei Pan CHN 1682.00 NA NA
hannes PUMAN SWE 1676.00 NA NA
jules MARCHALAND FRA 1670.90 20.6 % 9.8 %
Hanwool Kim KOR 1660.00 NA NA
Sean Mccoll CAN 1650.00 NA NA
Simon Lorenzi BEL 1646.00 NA NA
Nino Grunenfelder SUI 1644.00 NA NA
filip SCHENK ITA 1638.91 14.3 % 7.2 %
ravianto RAMADHAN INA 1634.72 23.8 % 17.7 %
jonas UTELLI SUI 1630.62 13.7 % 6.9 %
Nicolas Collin BEL 1617.00 NA NA
marcello BOMBARDI ITA 1614.00 NA NA
ars<U+00E8>ne DUVAL FRA 1600.00 NA NA
Dillon Countryman USA 1597.00 NA NA

Bali: Final

Finals

-Competitors = n.final-

#####_ Elo History _

Elo Accumulated Bali Final

competitor Ctry R.new Prob.Finals Prob.podium
sorato ANRAKU JPN 2380.84 92.3 % 84.7 %
Jakob Schubert AUT 2262.00 NA NA
alberto GIN<U+00C9>S L<U+00D3>PEZ ESP 2252.56 79.6 % 79.9 %
toby ROBERTS GBR 2243.52 84.1 % 70.7 %
dohyun LEE KOR 2116.89 64.1 % 64.5 %
taisei HOMMA JPN 2083.20 68.2 % 50 %
shion OMATA JPN 2054.43 55.4 % 55.9 %
adam ONDRA CZE 2046.20 59 % 54.3 %
colin DUFFY USA 2016.56 54.8 % 50 %
neo SUZUKI JPN 2013.16 49.5 % 50 %
satone YOSHIDA JPN 2003.95 48.2 % 48.7 %
Alexander Megos GER 1983.00 NA NA
yufei PAN CHN 1968.09 43.1 % 50 %
sascha LEHMANN SUI 1962.94 51.8 % 33.4 %
sam AVEZOU FRA 1961.01 51.1 % 32.2 %
jesse GRUPPER USA 1950.46 50 % 31.8 %
hannes VAN DUYSEN BEL 1950.22 49.5 % 30.8 %
max BERTONE FRA 1937.20 38.8 % 39.2 %
muhammad RIZKY SYAHRAFLI SIMATUPANG INA 1930.77 37.9 % 38.4 %
yannick FLOH<U+00C9> GER 1928.42 37.6 % 38 %
hiroto SHIMIZU JPN 1922.19 45.9 % 28.4 %
hyunseung NOH KOR 1921.10 45.8 % 28.2 %
yannick NAGEL GER 1916.82 44.7 % 26.9 %
joonha SHIN KOR 1914.04 44.3 % 26.6 %
putra TRI RAMADANI INA 1907.19 43.8 % 26.6 %
victor GUILLERMIN FRA 1901.62 43 % 26 %
guillermo PEINADO FRANGANILLO ESP 1897.34 37.9 % 33.5 %
kibeom KWON KOR 1894.91 50 % 31.5 %
ao YURIKUSA JPN 1885.67 48.7 % 30.4 %
Tomoa Narasaki JPN 1877.00 NA NA
shinyeong YUN KOR 1868.29 46.2 % 28.3 %
timo UZNIK AUT 1868.06 45.1 % 26.8 %
oscar BAUDRAND CAN 1865.73 45.8 % 28 %
yuta IMAIZUMI JPN 1861.26 29 % 25.7 %
ross FULKERSON USA 1855.30 42.8 % 23.9 %
stefan SCHERZ AUT 1849.11 51.8 % 42.5 %
hyunbin MIN KOR 1845.25 42.9 % 25.7 %
mototaka ISHIZU JPN 1837.45 41.8 % 24.9 %
zento MURASHITA JPN 1836.56 41.7 % 24.8 %
stefano GHISOLFI ITA 1833.58 49.6 % 40.4 %
Hannes Van Duysen BEL 1827.00 NA NA
christoph HANKE GER 1825.36 48.4 % 39.2 %
sebastian HALENKE GER 1816.49 31.6 % 17.7 %
yuval SHEMLA ISR 1815.12 46.9 % 37.8 %
ties VANCRAEYNEST BEL 1809.30 30.7 % 17.1 %
masahiro HIGUCHI JPN 1809.19 37.9 % 21.9 %
Sean Bailey USA 1807.00 NA NA
yoshiyuki OGATA JPN 1800.66 22.4 % 19.6 %
giovanni PLACCI ITA 1799.98 29.6 % 16.4 %
jordi POLES FRA 1797.20 44.4 % 35.4 %
raviandi RAMADHAN INA 1796.14 29.1 % 16.1 %
philipp MARTIN GER 1794.74 36 % 20.6 %
luka POTOCAR SLO 1785.16 20.9 % 25.9 %
shuta TANAKA JPN 1776.23 33.6 % 18.9 %
paul JENFT FRA 1776.02 20 % 17.5 %
Hidemasa Nishida JPN 1774.00 NA NA
giorgio TOMATIS ITA 1768.96 25.7 % 13.6 %
Neo Suzuki JPN 1768.00 NA NA
Hyunbin Min KOR 1761.00 NA NA
mejdi SCHALCK FRA 1759.74 31.5 % 17.5 %
Hamish Mcarthur GBR 1751.00 NA NA
Yunchan Song KOR 1745.00 NA NA
nao MONCHOIS FRA 1734.00 NA NA
Meichi Narasaki JPN 1716.00 NA NA
Sebastian Halenke GER 1714.00 NA NA
nino GR<U+00DC>NENFELDER SUI 1708.86 19.9 % 10.4 %
martin STRANIK CZE 1693.78 18.6 % 9.6 %
Yufei Pan CHN 1682.00 NA NA
hannes PUMAN SWE 1676.00 NA NA
jules MARCHALAND FRA 1670.90 20.6 % 9.8 %
Hanwool Kim KOR 1660.00 NA NA
Sean Mccoll CAN 1650.00 NA NA
Simon Lorenzi BEL 1646.00 NA NA
Nino Grunenfelder SUI 1644.00 NA NA
filip SCHENK ITA 1638.91 14.3 % 7.2 %
ravianto RAMADHAN INA 1634.72 23.8 % 17.7 %
jonas UTELLI SUI 1630.62 13.7 % 6.9 %
Nicolas Collin BEL 1617.00 NA NA
marcello BOMBARDI ITA 1614.00 NA NA
ars<U+00E8>ne DUVAL FRA 1600.00 NA NA
Dillon Countryman USA 1597.00 NA NA
LS0tDQp0aXRsZTogIklGU0NfRWxvX0xFQURfTWVuXzIwMjQiDQphdXRob3I6ICJGZWRlcmljbyBKLiBWaWxsYXRvcm8iDQpkYXRlOiAiYHIgU3lzLkRhdGUoKWAiDQpvdXRwdXQ6DQogIGh0bWxfbm90ZWJvb2s6DQogICAgdG9jOiB0cnVlDQogICAgdG9jX2RlcHRoOiA0DQogICAgdG9jX2Zsb2F0OiB0cnVlDQotLS0NCg0KIyMjIyMgRnVlbnRlOiBbXSgpDQoNCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQ0KbGlicmFyeShmbGV4ZGFzaGJvYXJkKQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KA0KICBlY2hvID0gRkFMU0UsDQoJbWVzc2FnZSA9IEZBTFNFLA0KICB3YXJuaW5nID0gRkFMU0UsDQoJaW5jbHVkZSA9IFRSVUUNCikNCmBgYCAgDQoNCmBgYHtyIHBhY2thZ2VzLCBtZXNzYWdlPUZBTFNFLCBpbmNsdWRlPUZBTFNFfQ0KaWYoIXJlcXVpcmUodGlkeXZlcnNlKSl7aW5zdGFsbC5wYWNrYWdlcygidGlkeXZlcnNlIixyZXBvcyA9ICJodHRwOi8vY3Jhbi51cy5yLXByb2plY3Qub3JnIil9DQppZighcmVxdWlyZShnb29nbGVzaGVldHM0KSl7aW5zdGFsbC5wYWNrYWdlcygiZ29vZ2xlc2hlZXRzNCIpfQ0KaWYoIXJlcXVpcmUoZ29vZ2xlZHJpdmUpKXtpbnN0YWxsLnBhY2thZ2VzKCJnb29nbGVkcml2ZSIpfQ0KaWYoIXJlcXVpcmUoZHBseXIpKXtpbnN0YWxsLnBhY2thZ2VzKCJkcGx5ciIpfQ0KaWYoIXJlcXVpcmUoaHR0cjIpKXtpbnN0YWxsLnBhY2thZ2VzKCJodHRyMiIpfQ0KaWYoIXJlcXVpcmUoanNvbmxpdGUpKXtpbnN0YWxsLnBhY2thZ2VzKCJqc29ubGl0ZSIpfQ0KaWYoIXJlcXVpcmUoUnNlbGVuaXVtKSl7aW5zdGFsbC5wYWNrYWdlcygiUnNlbGVuaXVtIil9DQppZighcmVxdWlyZShjaHJvbW90ZSkpe2luc3RhbGwucGFja2FnZXMoImNocm9tb3RlIil9DQppZighcmVxdWlyZShwdXJycikpe2luc3RhbGwucGFja2FnZXMoInB1cnJyIil9DQppZighcmVxdWlyZSh3ZG1hbikpe2luc3RhbGwucGFja2FnZXMoIndkbWFuIil9DQppZighcmVxdWlyZShEVCkpe2luc3RhbGwucGFja2FnZXMoIkRUIil9DQppZighcmVxdWlyZShwbG90bHkpKXtpbnN0YWxsLnBhY2thZ2VzKCJwbG90bHkiKX0NCiMjDQpsaWJyYXJ5KHBsb3RseSkNCmxpYnJhcnkoRFQpDQpsaWJyYXJ5KGNocm9tb3RlKQ0KbGlicmFyeShwdXJycikNCmxpYnJhcnkod2RtYW4pDQoNCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShydmVzdCkNCmxpYnJhcnkoZHBseXIpDQpsaWJyYXJ5KGpzb25saXRlKQ0KbGlicmFyeShSU2VsZW5pdW0pDQoNCmxpYnJhcnkoZ29vZ2xlc2hlZXRzNCkNCmxpYnJhcnkoZ29vZ2xlZHJpdmUpDQoNCmBgYCAgDQoNCg0KIyMjIyMgUmVhZGluZyBEYXRhDQoNCmBgYHtyIGluY2x1ZGU9VFJVRX0NCg0Kb3B0aW9ucyhnYXJnbGVfb2F1dGhfZW1haWwgPSAidmlsbGF0b3JvcGF6ZmpAZGF0YWFuYWx5c2lzbGFiLmNvbSIpDQojDQpzcyA8LSAiaHR0cHM6Ly9kb2NzLmdvb2dsZS5jb20vc3ByZWFkc2hlZXRzL2QvMUpoQnM3eWNlRVhVcm5uY1lEV2tXVDE2bktZMU1DeF9aVHB4Z09PVVJKNk0vZWRpdD91c3A9c2hhcmluZyINCmhvamEgPSAxDQpyYW5nbyA9ICJBMTpJNTU4Ig0KcmFua3MgPC0gcmVhZF9zaGVldChzcywNCiAgICAgICAgICAgICAgICBzaGVldD1ob2phLA0KICAgICAgICAgICAgICAgIHJhbmdlPSByYW5nbywgDQogICAgICAgICAgICAgICAgICAgY29sX25hbWVzID0gVFJVRQ0KICAgICAgICAgICAgICAgICMsDQogICAgICAgICAgICAgICAgI2NvbF90eXBlcyA9ICJjIg0KICAgICAgICAgICAgICAgICkNCg0KcmFua3MgPC0gIHJhbmtzICU+JQ0KICBtdXRhdGVfaWYoaXMuY2hhcmFjdGVyLCBhcy5mYWN0b3IpDQojIyMgRWxvIGxlYWQgSnVuZS0yMDI0DQpzcyA8LSAiaHR0cHM6Ly9kb2NzLmdvb2dsZS5jb20vc3ByZWFkc2hlZXRzL2QvMWNpNWVXc3BjeDZhR2htaTdPMmp6ZUR4Q1FaOHVTVWJ2WVBDQmhpWXBmRGcvZWRpdD91c3A9c2hhcmluZyINCmhvamEgPSAiRWxvX01lbidzX0xlYWRfSnVuZV8yMDI0Ig0KcmFuZ28gPSAiQTE6QzUxIg0KZWxvLmFjY3VtIDwtIHJlYWRfc2hlZXQoc3MsDQogICAgICAgICAgICAgICAgc2hlZXQ9aG9qYSwNCiAgICAgICAgICAgICAgICByYW5nZT0gcmFuZ28sIA0KICAgICAgICAgICAgICAgICAgIGNvbF9uYW1lcyA9IFRSVUUNCiAgICAgICAgICAgICAgICAjLA0KICAgICAgICAgICAgICAgICNjb2xfdHlwZXMgPSAiYyINCiAgICAgICAgICAgICAgICApDQoNCmVsby5hY2N1bSA8LSAgZWxvLmFjY3VtICU+JQ0KICBtdXRhdGVfaWYoaXMuY2hhcmFjdGVyLCBhcy5mYWN0b3IpDQplbG8ubGVhZC5tZW4uYWNjdW0gPC0gZWxvLmFjY3VtIA0KDQpgYGAgIA0KDQojIyMgQ2hhbW9uaXgNCmBgYHtyIGluY2x1ZGU9VFJVRSwgcm93cy5wcmludD0gOH0NCmxlYWRfbWVuIDwtIHJhbmtzICU+JQ0KICBmaWx0ZXIoY29tcGU9PSJDaGFtb25peCIpICU+JQ0KICBncm91cF9ieShjb21wZXRpdG9yPSBOYW1lLA0KICAgICAgIyAgICAgWWVhcj0geWVhciwNCiAgICAgICAgICAgQ29tcGU9IGNvbXBlLA0KICAgICAgU3RhZ2UgPSBTdGFnZSwNCiAgICAgICAgICAgQ291bnRyeSA9IENvdW50cnksDQogICAgICAgICAgIERhdGU9IERhdGUsDQogICAgICBSYW5rID0gUmFuaykgJT4lDQojICByZWZyYW1lKHJhbms9IFJhbmspICU+JQ0KICByZXNoYXBlMjo6ZGNhc3QoZm9ybXVsYSA9IGNvbXBldGl0b3IgKyBDb3VudHJ5ICsgQ29tcGUgfiBTdGFnZSwNCiAgICAgICAgICAgICAgICAgIHZhbHVlLnZhciA9ICJSYW5rIiwNCiAgICAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSkNCg0KbGVhZF9tZW4gPC0gYXNfdGliYmxlKGxlYWRfbWVuKQ0KIyMNCmxlYWRfbWVuW29yZGVyKGxlYWRfbWVuJGBTZW1pLWZpbmFsYCksXSANCiMjDQpuLnNlbWlzIDwtIG5yb3cobGVhZF9tZW5bIWlzLm5hKGxlYWRfbWVuJGBTZW1pLWZpbmFsYCksXSkNCm4uZmluYWxzIDwtIG5yb3cobGVhZF9tZW5bIWlzLm5hKGxlYWRfbWVuJEZpbmFsKSxdKQ0KDQpgYGAgIA0KDQojIyMgQ2hhbW9uaXg6IFNlbWktZmluYWxzDQoNCmBgYHtyIGluY2x1ZGU9VFJVRX0NCmxlYWRfbWVuW29yZGVyKGxlYWRfbWVuJGBTZW1pLWZpbmFsYCksIGMoMSwyLDYpXSAlPiUgcHJpbnQobj02MCkNCmBgYCAgDQoNCiMjIyBTZW1pLWZpbmFscyANCiotQ29tcGV0aXRvcnMgPSBgbi5zZW1pc2AtKg0KDQpgYGB7ciBpbmNsdWRlPUZBTFNFfQ0KbGVhZF9tZW4uY2hhbW9uaXguc2VtaXMgPC0gbGVhZF9tZW5bLGMoMSwyLDYpXSAlPiUgZmlsdGVyKGxlYWRfbWVuJGBTZW1pLWZpbmFsYCE9Ik5BIikgDQojDQpsYXN0LmNvbXAuZGVidXQgPC0gbGVhZF9tZW4uY2hhbW9uaXguc2VtaXMgJT4lIGFudGlfam9pbihlbG8ubGVhZC5tZW4uYWNjdW0sIGJ5PSJjb21wZXRpdG9yIikNCmBgYA0KDQoNCg0KYGBge3IgZXZhbD0gVFJVRSxpbmNsdWRlPUZBTFNFLCBjb2xzLnByaW50PSA3fQ0KIyMjIEVMTyAjIyMjIyMjIyMjIyMjIyMjIw0KIyMjICMjIEVMTyAoTkFTQ0FSKSAjIyMjIyMjIyMjIyMjDQpuLmRlYnV0ID0gbGVuZ3RoKGxhc3QuY29tcC5kZWJ1dCRjb21wZXRpdG9yKQ0KIyMjDQpsYXN0LmNvbXAuY2FsYyA8LSBsZWFkX21lbi5jaGFtb25peC5zZW1pcyAlPiUgcmlnaHRfam9pbihlbG8ubGVhZC5tZW4uYWNjdW0sIGJ5PSJjb21wZXRpdG9yIikNCiMjIw0KTiA8LSBsZW5ndGgobGFzdC5jb21wLmNhbGMkY29tcGV0aXRvclshaXMubmEobGFzdC5jb21wLmNhbGMkYFNlbWktZmluYWxgKV0pDQpSIDwtIGxhc3QuY29tcC5jYWxjJEVsb1shaXMubmEobGFzdC5jb21wLmNhbGMkYFNlbWktZmluYWxgKV0NCm5hbWVzIDwtIGxhc3QuY29tcC5jYWxjWyFpcy5uYShsYXN0LmNvbXAuY2FsYyRgU2VtaS1maW5hbGApLDFdDQpjb3VudHJ5IDwtIGxhc3QuY29tcC5jYWxjJENvdW50cnlbIWlzLm5hKGxhc3QuY29tcC5jYWxjJGBTZW1pLWZpbmFsYCldDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMNCnJlc3VsdHMgPC0gbGFzdC5jb21wLmNhbGMkYFNlbWktZmluYWxgDQpzdGRldiA8LSBzZChyZXN1bHRzLCBuYS5ybSA9IFRSVUUpDQojDQphdmcucGxheWVyIDwtIG1lYW4oYyhSLCByZXAobWVhbihSKSwgbi5kZWJ1dCApKSkNCm1lZGlhbmEgPC0gbWVkaWFuKGxlYWRfbWVuJGBTZW1pLWZpbmFsYFshaXMubmEobGVhZF9tZW4kYFNlbWktZmluYWxgKV0pDQptYXguc3RkIDwtIChtZWRpYW5hLTEpL3N0ZGV2DQojIyMjIyMjIyMjIyMjIyMjIyMNClMgPC0gKChtZWRpYW5hIC0gbGFzdC5jb21wLmNhbGMkYFNlbWktZmluYWxgWyFpcy5uYShsYXN0LmNvbXAuY2FsYyRgU2VtaS1maW5hbGApXSApIC8gc3RkZXYpIC8gbWF4LnN0ZA0KRCA9IDQwMA0KayA9IDMyDQpFIDwtIDEvKDErKDEwXiggKGF2Zy5wbGF5ZXItUikvRCApKSkNClIubmV3IDwtIFIgKyAoayAqIChTIC0gKCgyKkUpL04pICkgKQ0KIw0KbWF4LmN1dC5maW5hbHMgPC0gKHN0ZGV2LTkpL3N0ZGV2DQpQcm9iLkZpbmFscyA8LSAxLygxKygxMF4oICggc29ydChSLm5ldywgZGVjcmVhc2luZyA9IFRSVUUpWzldIC1SLm5ldykvRCApKSkNCm1heC5jdXQucG9kaXVtIDwtIChzdGRldi00KS9zdGRldg0KUHJvYi5wb2RpdW0gPC0gMS8oMSsoMTBeKCAoIHNvcnQoUi5uZXcsIGRlY3JlYXNpbmcgPSBUUlVFKVs0XSAtUi5uZXcpL0QgKSkpDQojIyMNCg0KZWxvLkNoYW1vbml4LnNlbWlzIDwtIGNiaW5kKG5hbWVzID0gbmFtZXMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBDdHJ5PSBjb3VudHJ5LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgUiA9IFIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzID0gbGFzdC5jb21wLmNhbGMkYFNlbWktZmluYWxgWyFpcy5uYShsYXN0LmNvbXAuY2FsYyRgU2VtaS1maW5hbGApXSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFMgPSBTLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgUi5uZXc9IHJvdW5kKFIubmV3LDIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvYi5GaW5hbHM9IHBhc3RlKHJvdW5kKFByb2IuRmluYWxzKjEwMCwgMSksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiUiKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2IucG9kaXVtID0gcGFzdGUocm91bmQoUHJvYi5wb2RpdW0qMTAwLDEpLCAiJSIgKSANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICkNCmVsby5DaGFtb25peC5zZW1pcyA8LSBhc190aWJibGUoZWxvLkNoYW1vbml4LnNlbWlzKQ0KDQojIyMjIyMjIyMjIw0KDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMjIyAjIyBFTE8gKE5BU0NBUikgIyMjIyMjIyMjIyMjIw0KbiA9IGxlbmd0aChsYXN0LmNvbXAuZGVidXQkYFNlbWktZmluYWxgKQ0KTiA8LSBsZW5ndGgobGFzdC5jb21wLmNhbGMkYFNlbWktZmluYWxgWyFpcy5uYShsYXN0LmNvbXAuY2FsYyRgU2VtaS1maW5hbGApXSkNClIuZGVidXQgPC0gcmVwKG1lYW4oUiksIG4pDQpuYW1lcyA8LSBsYXN0LmNvbXAuZGVidXRbLDFdDQpjb3VudHJ5IDwtIGxhc3QuY29tcC5kZWJ1dCRDb3VudHJ5DQojY2F0ZWcgPC0gbGVhZF9tZW4uYV9iDQpTIDwtICgobWVkaWFuYS0gbGFzdC5jb21wLmRlYnV0JGBTZW1pLWZpbmFsYCkgLyBzdGRldikgLyBtYXguc3RkDQpFIDwtIDEvKDErKDEwXiggKGF2Zy5wbGF5ZXItUi5kZWJ1dCkvRCApKSkNClIubmV3IDwtIFIuZGVidXQgKyAoayAqIChTIC0gKCgyKkUpL04pICkgKQ0KIw0KbWF4LmN1dC5maW5hbHMgPC0gKHN0ZGV2LTkpL3N0ZGV2DQpQcm9iLkZpbmFscyA8LSAxLygxKygxMF4oICggc29ydChlbG8uQ2hhbW9uaXguc2VtaXMkUi5uZXcsIGRlY3JlYXNpbmcgPSBUUlVFKVs5XSAtIFIubmV3KS9EICkpKQ0KbWF4LmN1dC5wb2RpdW0gPC0gKHN0ZGV2LTQpL3N0ZGV2DQpQcm9iLnBvZGl1bSA8LSAxLygxKygxMF4oICggc29ydChlbG8uQ2hhbW9uaXguc2VtaXMkUi5uZXcsIGRlY3JlYXNpbmcgPSBUUlVFKVs0XSAtUi5uZXcpL0QgKSkpDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KZWxvLkNoYW1vbml4LmRlYnV0IDwtIGNiaW5kKG5hbWVzID0gbmFtZXMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBDdHJ5PSBjb3VudHJ5LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgUiA9IFIuZGVidXQsDQogICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzID0gbGFzdC5jb21wLmRlYnV0JGBTZW1pLWZpbmFsYCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFMgPSBTLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgUi5uZXc9IHJvdW5kKFIubmV3LDIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvYi5GaW5hbHM9IHBhc3RlKHJvdW5kKFByb2IuRmluYWxzKjEwMCwxKSwiJSIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvYi5wb2RpdW0gPSBwYXN0ZShyb3VuZChQcm9iLnBvZGl1bSoxMDAsIDEpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJSIpIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgKQ0KZWxvLkNoYW1vbml4LmRlYnV0IDwtIGFzX3RpYmJsZShlbG8uQ2hhbW9uaXguZGVidXQpDQoNCmVsby5DaGFtb25peC5zZW1pcyA8LSBlbG8uQ2hhbW9uaXguc2VtaXMgJT4lIHJiaW5kKGVsby5DaGFtb25peC5kZWJ1dCkNCg0KDQojIyMjIyAjIyMjIyMjIyMjDQprbml0cjo6a2FibGUoZWxvLkNoYW1vbml4LnNlbWlzW29yZGVyKGVsby5DaGFtb25peC5zZW1pcyRyZXN1bHRzKSxjKDEsMiwzLDQsNiw3LDgpXSkNCg0KYGBgICANCg0KDQojIyMjI18gRWxvIEhpc3RvcnkgXw0KYGBge3IgZXZhbD1UUlVFfQ0KIw0KIyBTYWNhbmRvIHN1YjE2DQpjb21wZSA8LSAiQ2hhbW9uaXguc2VtaXMiDQojZWxvLmhpc3RvcnkubGFzdCA8LSBlbG8uMjIuYWNjdW0udG9fc3ViMTYgJT4lIA0KIyAgbXV0YXRlKGNvbXAgPSByZXAoY29tcGUsIGxlbmd0aChlbG8uMjIuYWNjdW0udG9fc3ViMTYkY29tcGV0aXRvcikpLA0KICMgICAgICAgIGNhdGVnID0gcmVwKCJTdWIxNk0iLCBsZW5ndGgoZWxvLjIyLmFjY3VtLnRvX3N1YjE2JGNvbXBldGl0b3IpKSkNCiMNCiNlbG8uaGlzdG9yeSA8LSBlbG8uaGlzdG9yeSAlPiUgcmJpbmQoZWxvLmhpc3RvcnkubGFzdCkNCiMjIA0KZWxvLmhpc3RvcnkubGFzdCA8LSBlbG8uQ2hhbW9uaXguc2VtaXMgJT4lIA0KICBtdXRhdGUoY29tcCA9IHJlcChjb21wZSwgbGVuZ3RoKGVsby5DaGFtb25peC5zZW1pcyRjb21wZXRpdG9yKSkpDQoNCiMNCmVsby5oaXN0b3J5IDwtIGVsby5oaXN0b3J5Lmxhc3QNCg0KYGBgICANCg0KDQoNCiMjIyAqKkVsbyBBY2N1bXVsYXRlZCBDaGFtb25peCBTZW1pcyoqDQoNCmBgYHtyIGluY2x1ZGU9VFJVRX0NCiMjDQoNCmVsby5sYXN0LmFjY3VtIDwtIGVsby5hY2N1bSAlPiUgDQogIHJlbmFtZShSLm5ldz0gRWxvKQ0KZWxvLmxhc3QuY29tcCA8LSBlbG8uQ2hhbW9uaXguc2VtaXMNCiMjIw0KZWxvLmxhc3QuYWNjdW1fbGFzdC5jb21wX2Fic2VudCA8LSBlbG8ubGFzdC5hY2N1bSAlPiUgYW50aV9qb2luKGVsby5sYXN0LmNvbXAsIGJ5PSJjb21wZXRpdG9yIikNCg0KZWxvLmxhc3QuYWNjdW0gPC0gZWxvLmxhc3QuY29tcCAlPiUgZnVsbF9qb2luKGVsby5sYXN0LmFjY3VtX2xhc3QuY29tcF9hYnNlbnQpDQplbG8ubGFzdC5hY2N1bSA8LSBlbG8ubGFzdC5hY2N1bVtvcmRlcihlbG8ubGFzdC5hY2N1bSRjb21wZXRpdG9yKSxdDQojDQprbml0cjo6a2FibGUoZWxvLmxhc3QuYWNjdW1bb3JkZXIoZWxvLmxhc3QuYWNjdW0kUi5uZXcsIGRlY3JlYXNpbmcgPSBUUlVFKSxjKDEsMiw2LDcsOCldKQ0KYGBgICANCg0KDQoNCiMjIyBDaGFtb25peDogRmluYWwNCg0KYGBge3IgaW5jbHVkZT1UUlVFfQ0KbGVhZF9tZW5bb3JkZXIobGVhZF9tZW4kRmluYWwpLCBjKDEsMiw0KV0gJT4lIHByaW50KG49NjApDQpgYGAgIA0KDQojIyMgRmluYWxzIA0KKi1Db21wZXRpdG9ycyA9IGBuLmZpbmFsYC0qDQoNCmBgYHtyIGluY2x1ZGU9RkFMU0V9DQpsZWFkX21lbi5jaGFtb25peC5maW5hbCA8LSBsZWFkX21lblssYygxLDIsNCldICU+JSBmaWx0ZXIobGVhZF9tZW4kRmluYWwhPSJOQSIpIA0KIw0KI2xhc3QuY29tcC5kZWJ1dCA8LSBsZWFkX21lbi5jaGFtb25peC5maW5hbCAlPiUgYW50aV9qb2luKGVsby5sYXN0LmFjY3VtLCBieT0iY29tcGV0aXRvciIpDQpgYGANCg0KDQoNCmBgYHtyIGV2YWw9IFRSVUUsaW5jbHVkZT1GQUxTRSwgY29scy5wcmludD0gN30NCiMjIyBFTE8gIyMjIyMjIyMjIyMjIyMjIyMNCiMjIyAjIyBFTE8gKE5BU0NBUikgIyMjIyMjIyMjIyMjIw0KI24uZGVidXQgPSBsZW5ndGgobGFzdC5jb21wLmRlYnV0JGNvbXBldGl0b3IpDQojIyMNCmxhc3QuY29tcC5jYWxjIDwtIGxlYWRfbWVuLmNoYW1vbml4LmZpbmFsICU+JSByaWdodF9qb2luKGVsby5sYXN0LmFjY3VtLCBieT0iY29tcGV0aXRvciIpDQojIyMNCk4gPC0gbGVuZ3RoKGxhc3QuY29tcC5jYWxjJGNvbXBldGl0b3JbIWlzLm5hKGxhc3QuY29tcC5jYWxjJEZpbmFsKV0pDQpSIDwtIGxhc3QuY29tcC5jYWxjJFIubmV3WyFpcy5uYShsYXN0LmNvbXAuY2FsYyRGaW5hbCldDQpuYW1lcyA8LSBsYXN0LmNvbXAuY2FsY1shaXMubmEobGFzdC5jb21wLmNhbGMkRmluYWwpLDFdDQpjb3VudHJ5IDwtIGxhc3QuY29tcC5jYWxjJENvdW50cnlbIWlzLm5hKGxhc3QuY29tcC5jYWxjJEZpbmFsKV0NCiMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KDQpyZXN1bHRzIDwtIGxhc3QuY29tcC5jYWxjJEZpbmFsDQpzdGRldiA8LSBzZChyZXN1bHRzLCBuYS5ybSA9IFRSVUUpDQojDQphdmcucGxheWVyIDwtIG1lYW4oYyhSDQogICAgICAgICAgICAgICAgICAgICAjLCByZXAobWVhbihSKSwgbi5kZWJ1dCApDQogICAgICAgICAgICAgICAgICAgICApKQ0KI21lZGlhbmEgPC0gbWVkaWFuKGxlYWRfbWVuJEZpbmFsWyFpcy5uYShsZWFkX21lbiRGaW5hbCldKQ0KbWVkaWFuYSA8LSA4DQptYXguc3RkIDwtIChtZWRpYW5hLTEpL3N0ZGV2DQojIyMjIyMjIyMjIyMjIyMjIyMNClMgPC0gKChtZWRpYW5hIC0gbGFzdC5jb21wLmNhbGMkRmluYWxbIWlzLm5hKGxhc3QuY29tcC5jYWxjJEZpbmFsKV0gKSAvIHN0ZGV2KSAvIG1heC5zdGQNCkQgPSA0MDANCmsgPSAzMg0KI0UgPC0gMS8oMSsoMTBeKCAoYXZnLnBsYXllci1SKS9EICkpKQ0KRSA8LSAxLygxKygxMF4oICggc29ydChSLCBkZWNyZWFzaW5nID0gVFJVRSlbOF0gLVIpL0QgKSkpDQpSLm5ldyA8LSBSICsgKGsgKiAoUyAtICgoMipFKS9OKSApICkNCiMNCiNtYXguY3V0LmZpbmFscyA8LSAoc3RkZXYtOSkvc3RkZXYNClByb2IuRmluYWxzIDwtIDEvKDErKDEwXiggKCBzb3J0KGVsby5sYXN0LmFjY3VtJFIubmV3LCBkZWNyZWFzaW5nID0gVFJVRSlbOV0gLVIubmV3KS9EICkpKQ0KI21heC5jdXQucG9kaXVtIDwtIChzdGRldi00KS9zdGRldg0KUHJvYi5wb2RpdW0gPC0gMS8oMSsoMTBeKCAoIHNvcnQoUi5uZXcsIGRlY3JlYXNpbmcgPSBUUlVFKVs0XSAtUi5uZXcpL0QgKSkpDQojIyMNCg0KZWxvLkNoYW1vbml4LmZpbmFsIDwtIGNiaW5kKG5hbWVzID0gbmFtZXMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBDdHJ5PSBjb3VudHJ5LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgUiA9IFIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzID0gbGFzdC5jb21wLmNhbGMkRmluYWxbIWlzLm5hKGxhc3QuY29tcC5jYWxjJEZpbmFsKV0sDQogICAgICAgICAgICAgICAgICAgICAgICAgICBTID0gUywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFIubmV3PSByb3VuZChSLm5ldywyKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2IuRmluYWxzPSBwYXN0ZShyb3VuZChQcm9iLkZpbmFscyoxMDAsIDEpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlIiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9iLnBvZGl1bSA9IHBhc3RlKHJvdW5kKFByb2IucG9kaXVtKjEwMCwxKSwgIiUiICkgDQogICAgICAgICAgICAgICAgICAgICAgICAgICApDQplbG8uQ2hhbW9uaXguZmluYWwgPC0gYXNfdGliYmxlKGVsby5DaGFtb25peC5maW5hbCkNCg0KYGBgICANCg0KDQojIyMjI18gRWxvIEhpc3RvcnkgXw0KYGBge3IgZXZhbD1UUlVFfQ0KIw0KZWxvLmxhc3QuY29tcC5uZXcgPC0gZWxvLkNoYW1vbml4LmZpbmFsDQojIFNhY2FuZG8gc3ViMTYNCmNvbXBlIDwtICJDaGFtb25peC5maW5hbCINCiMNCmVsby5oaXN0b3J5Lmxhc3QgPC0gZWxvLmxhc3QuY29tcC5uZXcgJT4lIA0KICBtdXRhdGUoY29tcCA9IHJlcChjb21wZSwgbGVuZ3RoKGVsby5sYXN0LmNvbXAubmV3JGNvbXBldGl0b3IpKSkNCg0KIw0KZWxvLmhpc3RvcnkgPC0gZWxvLmhpc3RvcnkgJT4lDQogIHJiaW5kKGVsby5oaXN0b3J5Lmxhc3QpDQoNCmBgYCAgDQoNCg0KDQojIyMgKipFbG8gQWNjdW11bGF0ZWQgQ2hhbW9uaXggRmluYWwqKg0KDQpgYGB7ciBpbmNsdWRlPVRSVUV9DQojIw0KDQojZWxvLmxhc3QuYWNjdW0gPC0gZWxvLmFjY3VtICU+JSANCiMgIHJlbmFtZShSLm5ldz0gRWxvKQ0KZWxvLmxhc3QuY29tcCA8LSBlbG8uQ2hhbW9uaXguZmluYWwNCiMjIw0KZWxvLmxhc3QuYWNjdW1fbGFzdC5jb21wX2Fic2VudCA8LSBlbG8ubGFzdC5hY2N1bSAlPiUgYW50aV9qb2luKGVsby5sYXN0LmNvbXAsIGJ5PSJjb21wZXRpdG9yIikNCg0KZWxvLmxhc3QuYWNjdW0gPC0gZWxvLmxhc3QuY29tcCAlPiUgZnVsbF9qb2luKGVsby5sYXN0LmFjY3VtX2xhc3QuY29tcF9hYnNlbnQpDQplbG8ubGFzdC5hY2N1bSA8LSBlbG8ubGFzdC5hY2N1bVtvcmRlcihlbG8ubGFzdC5hY2N1bSRjb21wZXRpdG9yKSxdDQojDQprbml0cjo6a2FibGUoZWxvLmxhc3QuYWNjdW1bb3JkZXIoZWxvLmxhc3QuYWNjdW0kUi5uZXcsIGRlY3JlYXNpbmcgPSBUUlVFKSxjKDEsMiw2LDcsOCldKQ0KYGBgICANCg0KDQojIyMgQnJpYW5jICANCg0KYGBge3IgaW5jbHVkZT1UUlVFLCByb3dzLnByaW50PSA4fQ0KbGVhZF9tZW4gPC0gcmFua3MgJT4lDQogIGZpbHRlcihjb21wZT09IkJyaWFuYyIpICU+JQ0KICBncm91cF9ieShjb21wZXRpdG9yPSBOYW1lLA0KICAgICAgIyAgICAgWWVhcj0geWVhciwNCiAgICAgICAgICAgQ29tcGU9IGNvbXBlLA0KICAgICAgU3RhZ2UgPSBTdGFnZSwNCiAgICAgICAgICAgQ291bnRyeSA9IENvdW50cnksDQogICAgICAgICAgIERhdGU9IERhdGUsDQogICAgICBSYW5rID0gUmFuaykgJT4lDQojICByZWZyYW1lKHJhbms9IFJhbmspICU+JQ0KICByZXNoYXBlMjo6ZGNhc3QoZm9ybXVsYSA9IGNvbXBldGl0b3IgKyBDb3VudHJ5ICsgQ29tcGUgfiBTdGFnZSwNCiAgICAgICAgICAgICAgICAgIHZhbHVlLnZhciA9ICJSYW5rIiwNCiAgICAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSkNCg0KbGVhZF9tZW4gPC0gYXNfdGliYmxlKGxlYWRfbWVuKQ0KIyMNCmxlYWRfbWVuW29yZGVyKGxlYWRfbWVuJGBTZW1pLWZpbmFsYCksXSANCiMjDQpuLnNlbWlzIDwtIG5yb3cobGVhZF9tZW5bIWlzLm5hKGxlYWRfbWVuJGBTZW1pLWZpbmFsYCksXSkNCm4uZmluYWxzIDwtIG5yb3cobGVhZF9tZW5bIWlzLm5hKGxlYWRfbWVuJEZpbmFsKSxdKQ0KDQpgYGAgIA0KDQoNCg0KDQoNCg0KIyMjIEJyaWFuYzogU2VtaS1maW5hbHMNCg0KYGBge3IgaW5jbHVkZT1UUlVFfQ0KbGVhZF9tZW5bb3JkZXIobGVhZF9tZW4kYFNlbWktZmluYWxgKSwgYygxLDIsNildICU+JSBwcmludChuPTYwKQ0KYGBgICANCg0KIyMjIFNlbWktZmluYWxzIA0KKi1Db21wZXRpdG9ycyA9IGBuLnNlbWlzYC0qDQoNCmBgYHtyIGluY2x1ZGU9RkFMU0V9DQpsZWFkX21lbi5CcmlhbmMuc2VtaXMgPC0gbGVhZF9tZW5bLGMoMSwyLDYpXSAlPiUgZmlsdGVyKGxlYWRfbWVuJGBTZW1pLWZpbmFsYCE9Ik5BIikgDQojDQpsYXN0LmNvbXAuZGVidXQgPC0gbGVhZF9tZW4uQnJpYW5jLnNlbWlzICU+JSBhbnRpX2pvaW4oZWxvLmxhc3QuYWNjdW0sIGJ5PSJjb21wZXRpdG9yIikNCmBgYA0KDQoNCg0KYGBge3IgZXZhbD0gVFJVRSxpbmNsdWRlPUZBTFNFLCBjb2xzLnByaW50PSA3fQ0KIyMjIEVMTyAjIyMjIyMjIyMjIyMjIyMjIw0KIyMjICMjIEVMTyAoTkFTQ0FSKSAjIyMjIyMjIyMjIyMjDQpuLmRlYnV0ID0gbGVuZ3RoKGxhc3QuY29tcC5kZWJ1dCRjb21wZXRpdG9yKQ0KIyMjDQpsYXN0LmNvbXAuY2FsYyA8LSBsZWFkX21lbi5CcmlhbmMuc2VtaXMgJT4lIHJpZ2h0X2pvaW4oZWxvLmxhc3QuYWNjdW0sIGJ5PSJjb21wZXRpdG9yIikNCiMjIw0KTiA8LSBsZW5ndGgobGFzdC5jb21wLmNhbGMkY29tcGV0aXRvclshaXMubmEobGFzdC5jb21wLmNhbGMkYFNlbWktZmluYWxgKV0pDQpSIDwtIGxhc3QuY29tcC5jYWxjJFIubmV3WyFpcy5uYShsYXN0LmNvbXAuY2FsYyRgU2VtaS1maW5hbGApXQ0KbmFtZXMgPC0gbGFzdC5jb21wLmNhbGNbIWlzLm5hKGxhc3QuY29tcC5jYWxjJGBTZW1pLWZpbmFsYCksMV0NCmNvdW50cnkgPC0gbGFzdC5jb21wLmNhbGMkQ291bnRyeVshaXMubmEobGFzdC5jb21wLmNhbGMkYFNlbWktZmluYWxgKV0NCiMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KcmVzdWx0cyA8LSBsYXN0LmNvbXAuY2FsYyRgU2VtaS1maW5hbGBbIWlzLm5hKGxhc3QuY29tcC5jYWxjJGBTZW1pLWZpbmFsYCldDQpzdGRldiA8LSBzZChyZXN1bHRzLCBuYS5ybSA9IFRSVUUpDQojDQphdmcucGxheWVyIDwtIG1lYW4oYyhSLCByZXAobWVhbihSKSwgbi5kZWJ1dCApKSkNCm1lZGlhbmEgPC0gbWVkaWFuKGxlYWRfbWVuJGBTZW1pLWZpbmFsYFshaXMubmEobGVhZF9tZW4kYFNlbWktZmluYWxgKV0pDQptYXguc3RkIDwtIChtZWRpYW5hLTEpL3N0ZGV2DQojIyMjIyMjIyMjIyMjIyMjIyMNClMgPC0gKChtZWRpYW5hIC0gbGFzdC5jb21wLmNhbGMkYFNlbWktZmluYWxgWyFpcy5uYShsYXN0LmNvbXAuY2FsYyRgU2VtaS1maW5hbGApXSApIC8gc3RkZXYpIC8gbWF4LnN0ZA0KRCA9IDQwMA0KayA9IDMyDQpFIDwtIDEvKDErKDEwXiggKGF2Zy5wbGF5ZXItUikvRCApKSkNClIubmV3IDwtIFIgKyAoayAqIChTIC0gKCgyKkUpL04pICkgKQ0KIw0KbWF4LmN1dC5maW5hbHMgPC0gKHN0ZGV2LTkpL3N0ZGV2DQpQcm9iLkZpbmFscyA8LSAxLygxKygxMF4oICggc29ydChSLm5ldywgZGVjcmVhc2luZyA9IFRSVUUpWzldIC1SLm5ldykvRCApKSkNCm1heC5jdXQucG9kaXVtIDwtIChzdGRldi00KS9zdGRldg0KUHJvYi5wb2RpdW0gPC0gMS8oMSsoMTBeKCAoIHNvcnQoUi5uZXcsIGRlY3JlYXNpbmcgPSBUUlVFKVs0XSAtUi5uZXcpL0QgKSkpDQojIyMNCg0KZWxvLkJyaWFuYy5zZW1pcyA8LSBjYmluZChuYW1lcyA9IG5hbWVzLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3RyeT0gY291bnRyeSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFIgPSBSLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cyA9IGxhc3QuY29tcC5jYWxjJGBTZW1pLWZpbmFsYFshaXMubmEobGFzdC5jb21wLmNhbGMkYFNlbWktZmluYWxgKV0sDQogICAgICAgICAgICAgICAgICAgICAgICAgICBTID0gUywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFIubmV3PSByb3VuZChSLm5ldywyKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2IuRmluYWxzPSBwYXN0ZShyb3VuZChQcm9iLkZpbmFscyoxMDAsIDEpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlIiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9iLnBvZGl1bSA9IHBhc3RlKHJvdW5kKFByb2IucG9kaXVtKjEwMCwxKSwgIiUiICkgDQogICAgICAgICAgICAgICAgICAgICAgICAgICApDQplbG8uQnJpYW5jLnNlbWlzIDwtIGFzX3RpYmJsZShlbG8uQnJpYW5jLnNlbWlzKQ0KDQojIyMjIyMjIyMjIw0KDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMjIyAjIyBFTE8gKE5BU0NBUikgIyMjIyMjIyMjIyMjIw0KbiA9IGxlbmd0aChsYXN0LmNvbXAuZGVidXQkYFNlbWktZmluYWxgKQ0KTiA8LSBsZW5ndGgobGFzdC5jb21wLmNhbGMkYFNlbWktZmluYWxgWyFpcy5uYShsYXN0LmNvbXAuY2FsYyRgU2VtaS1maW5hbGApXSkNClIuZGVidXQgPC0gcmVwKG1lYW4oUiksIG4pDQpuYW1lcyA8LSBsYXN0LmNvbXAuZGVidXRbLDFdDQpjb3VudHJ5IDwtIGxhc3QuY29tcC5kZWJ1dCRDb3VudHJ5DQojY2F0ZWcgPC0gbGVhZF9tZW4uYV9iDQpTIDwtICgobWVkaWFuYS0gbGFzdC5jb21wLmRlYnV0JGBTZW1pLWZpbmFsYCkgLyBzdGRldikgLyBtYXguc3RkDQpFIDwtIDEvKDErKDEwXiggKGF2Zy5wbGF5ZXItUi5kZWJ1dCkvRCApKSkNClIubmV3IDwtIFIuZGVidXQgKyAoayAqIChTIC0gKCgyKkUpL04pICkgKQ0KIw0KbWF4LmN1dC5maW5hbHMgPC0gKHN0ZGV2LTkpL3N0ZGV2DQpQcm9iLkZpbmFscyA8LSAxLygxKygxMF4oICggc29ydChlbG8uQnJpYW5jLnNlbWlzJFIubmV3LCBkZWNyZWFzaW5nID0gVFJVRSlbOV0gLSBSLm5ldykvRCApKSkNCm1heC5jdXQucG9kaXVtIDwtIChzdGRldi00KS9zdGRldg0KUHJvYi5wb2RpdW0gPC0gMS8oMSsoMTBeKCAoIHNvcnQoZWxvLkJyaWFuYy5zZW1pcyRSLm5ldywgZGVjcmVhc2luZyA9IFRSVUUpWzRdIC1SLm5ldykvRCApKSkNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQplbG8uQnJpYW5jLmRlYnV0IDwtIGNiaW5kKG5hbWVzID0gbmFtZXMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBDdHJ5PSBjb3VudHJ5LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgUiA9IFIuZGVidXQsDQogICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzID0gbGFzdC5jb21wLmRlYnV0JGBTZW1pLWZpbmFsYCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFMgPSBTLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgUi5uZXc9IHJvdW5kKFIubmV3LDIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvYi5GaW5hbHM9IHBhc3RlKHJvdW5kKFByb2IuRmluYWxzKjEwMCwxKSwiJSIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvYi5wb2RpdW0gPSBwYXN0ZShyb3VuZChQcm9iLnBvZGl1bSoxMDAsIDEpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJSIpIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgKQ0KZWxvLkJyaWFuYy5kZWJ1dCA8LSBhc190aWJibGUoZWxvLkJyaWFuYy5kZWJ1dCkNCg0KZWxvLkJyaWFuYy5zZW1pcyA8LSBlbG8uQnJpYW5jLnNlbWlzICU+JSByYmluZChlbG8uQnJpYW5jLmRlYnV0KQ0KDQoNCiMjIyMjICMjIyMjIyMjIyMNCmtuaXRyOjprYWJsZShlbG8uQnJpYW5jLnNlbWlzW29yZGVyKGVsby5CcmlhbmMuc2VtaXMkcmVzdWx0cyksYygxLDIsMyw0LDYsNyw4KV0pDQoNCmBgYCAgDQoNCg0KIyMjIyNfIEVsbyBIaXN0b3J5IF8NCmBgYHtyIGV2YWw9VFJVRX0NCiMNCiMgU2FjYW5kbyBzdWIxNg0KY29tcGUgPC0gIkJyaWFuYy5zZW1pcyINCiNlbG8uaGlzdG9yeS5sYXN0IDwtIGVsby4yMi5hY2N1bS50b19zdWIxNiAlPiUgDQojICBtdXRhdGUoY29tcCA9IHJlcChjb21wZSwgbGVuZ3RoKGVsby4yMi5hY2N1bS50b19zdWIxNiRjb21wZXRpdG9yKSksDQogIyAgICAgICAgY2F0ZWcgPSByZXAoIlN1YjE2TSIsIGxlbmd0aChlbG8uMjIuYWNjdW0udG9fc3ViMTYkY29tcGV0aXRvcikpKQ0KIw0KI2Vsby5oaXN0b3J5IDwtIGVsby5oaXN0b3J5ICU+JSByYmluZChlbG8uaGlzdG9yeS5sYXN0KQ0KIyMgDQplbG8uaGlzdG9yeS5sYXN0IDwtIGVsby5CcmlhbmMuc2VtaXMgJT4lIA0KICBtdXRhdGUoY29tcCA9IHJlcChjb21wZSwgbGVuZ3RoKGVsby5CcmlhbmMuc2VtaXMkY29tcGV0aXRvcikpKQ0KDQojDQplbG8uaGlzdG9yeSA8LSBlbG8uaGlzdG9yeSAlPiUNCiAgcmJpbmQoZWxvLmhpc3RvcnkubGFzdCkNCg0KDQpgYGAgIA0KDQoNCg0KIyMjICoqRWxvIEFjY3VtdWxhdGVkIEJyaWFuYyBTZW1pcyoqDQoNCmBgYHtyIGluY2x1ZGU9VFJVRX0NCiMjDQoNCiNlbG8ubGFzdC5hY2N1bSA8LSBlbG8uYWNjdW0gJT4lIA0KIyAgcmVuYW1lKFIubmV3PSBFbG8pDQplbG8ubGFzdC5jb21wIDwtIGVsby5CcmlhbmMuc2VtaXMNCiMjIw0KZWxvLmxhc3QuYWNjdW1fbGFzdC5jb21wX2Fic2VudCA8LSBlbG8ubGFzdC5hY2N1bSAlPiUgYW50aV9qb2luKGVsby5sYXN0LmNvbXAsIGJ5PSJjb21wZXRpdG9yIikNCg0KZWxvLmxhc3QuYWNjdW0gPC0gZWxvLmxhc3QuY29tcCAlPiUgZnVsbF9qb2luKGVsby5sYXN0LmFjY3VtX2xhc3QuY29tcF9hYnNlbnQpDQplbG8ubGFzdC5hY2N1bSA8LSBlbG8ubGFzdC5hY2N1bVtvcmRlcihlbG8ubGFzdC5hY2N1bSRjb21wZXRpdG9yKSxdDQojDQprbml0cjo6a2FibGUoZWxvLmxhc3QuYWNjdW1bb3JkZXIoZWxvLmxhc3QuYWNjdW0kUi5uZXcsIGRlY3JlYXNpbmcgPSBUUlVFKSxjKDEsMiw2LDcsOCldKQ0KYGBgICANCg0KDQoNCiMjIyBCcmlhbmM6IEZpbmFsDQoNCmBgYHtyIGluY2x1ZGU9VFJVRX0NCmxlYWRfbWVuW29yZGVyKGxlYWRfbWVuJEZpbmFsKSwgYygxLDIsNCldICU+JSBwcmludChuPTYwKQ0KYGBgICANCg0KIyMjIEZpbmFscyANCiotQ29tcGV0aXRvcnMgPSBgbi5maW5hbGAtKg0KDQpgYGB7ciBpbmNsdWRlPUZBTFNFfQ0KbGVhZF9tZW4uQnJpYW5jLmZpbmFsIDwtIGxlYWRfbWVuWyxjKDEsMiw0KV0gJT4lIGZpbHRlcihsZWFkX21lbiRGaW5hbCE9Ik5BIikgDQojDQojbGFzdC5jb21wLmRlYnV0IDwtIGxlYWRfbWVuLkJyaWFuYy5maW5hbCAlPiUgYW50aV9qb2luKGVsby5sYXN0LmFjY3VtLCBieT0iY29tcGV0aXRvciIpDQpgYGANCg0KDQoNCmBgYHtyIGV2YWw9IFRSVUUsaW5jbHVkZT1GQUxTRSwgY29scy5wcmludD0gN30NCiMjIyBFTE8gIyMjIyMjIyMjIyMjIyMjIyMNCiMjIyAjIyBFTE8gKE5BU0NBUikgIyMjIyMjIyMjIyMjIw0KI24uZGVidXQgPSBsZW5ndGgobGFzdC5jb21wLmRlYnV0JGNvbXBldGl0b3IpDQojIyMNCmxhc3QuY29tcC5jYWxjIDwtIGxlYWRfbWVuLkJyaWFuYy5maW5hbCAlPiUgcmlnaHRfam9pbihlbG8ubGFzdC5hY2N1bSwgYnk9ImNvbXBldGl0b3IiKQ0KIyMjDQpOIDwtIGxlbmd0aChsYXN0LmNvbXAuY2FsYyRjb21wZXRpdG9yWyFpcy5uYShsYXN0LmNvbXAuY2FsYyRGaW5hbCldKQ0KUiA8LSBsYXN0LmNvbXAuY2FsYyRSLm5ld1shaXMubmEobGFzdC5jb21wLmNhbGMkRmluYWwpXQ0KbmFtZXMgPC0gbGFzdC5jb21wLmNhbGNbIWlzLm5hKGxhc3QuY29tcC5jYWxjJEZpbmFsKSwxXQ0KY291bnRyeSA8LSBsYXN0LmNvbXAuY2FsYyRDb3VudHJ5WyFpcy5uYShsYXN0LmNvbXAuY2FsYyRGaW5hbCldDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMNCg0KcmVzdWx0cyA8LSBsYXN0LmNvbXAuY2FsYyRGaW5hbFshaXMubmEobGFzdC5jb21wLmNhbGMkRmluYWwpXQ0Kc3RkZXYgPC0gc2QocmVzdWx0cywgbmEucm0gPSBUUlVFKQ0KIw0KYXZnLnBsYXllciA8LSBtZWFuKGMoUg0KICAgICAgICAgICAgICAgICAgICAgIywgcmVwKG1lYW4oUiksIG4uZGVidXQgKQ0KICAgICAgICAgICAgICAgICAgICAgKSkNCiNtZWRpYW5hIDwtIG1lZGlhbihsZWFkX21lbiRGaW5hbFshaXMubmEobGVhZF9tZW4kRmluYWwpXSkNCm1lZGlhbmEgPC0gOA0KbWF4LnN0ZCA8LSAobWVkaWFuYS0xKS9zdGRldg0KIyMjIyMjIyMjIyMjIyMjIyMjDQpTIDwtICgobWVkaWFuYSAtIGxhc3QuY29tcC5jYWxjJEZpbmFsWyFpcy5uYShsYXN0LmNvbXAuY2FsYyRGaW5hbCldICkgLyBzdGRldikgLyBtYXguc3RkDQpEID0gNDAwDQprID0gMzINCiNFIDwtIDEvKDErKDEwXiggKGF2Zy5wbGF5ZXItUikvRCApKSkNCkUgPC0gMS8oMSsoMTBeKCAoIHNvcnQoUiwgZGVjcmVhc2luZyA9IFRSVUUpWzhdIC1SKS9EICkpKQ0KUi5uZXcgPC0gUiArIChrICogKFMgLSAoKDIqRSkvTikgKSApDQojDQojbWF4LmN1dC5maW5hbHMgPC0gKHN0ZGV2LTkpL3N0ZGV2DQpQcm9iLkZpbmFscyA8LSAxLygxKygxMF4oICggc29ydChlbG8ubGFzdC5hY2N1bSRSLm5ldywgZGVjcmVhc2luZyA9IFRSVUUpWzldIC1SLm5ldykvRCApKSkNCiNtYXguY3V0LnBvZGl1bSA8LSAoc3RkZXYtNCkvc3RkZXYNClByb2IucG9kaXVtIDwtIDEvKDErKDEwXiggKCBzb3J0KFIubmV3LCBkZWNyZWFzaW5nID0gVFJVRSlbNF0gLVIubmV3KS9EICkpKQ0KIyMjDQoNCmVsby5CcmlhbmMuZmluYWwgPC0gY2JpbmQobmFtZXMgPSBuYW1lcywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIEN0cnk9IGNvdW50cnksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBSID0gUiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMgPSBsYXN0LmNvbXAuY2FsYyRGaW5hbFshaXMubmEobGFzdC5jb21wLmNhbGMkRmluYWwpXSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFMgPSBTLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgUi5uZXc9IHJvdW5kKFIubmV3LDIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvYi5GaW5hbHM9IHBhc3RlKHJvdW5kKFByb2IuRmluYWxzKjEwMCwgMSksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiUiKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2IucG9kaXVtID0gcGFzdGUocm91bmQoUHJvYi5wb2RpdW0qMTAwLDEpLCAiJSIgKSANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICkNCmVsby5CcmlhbmMuZmluYWwgPC0gYXNfdGliYmxlKGVsby5CcmlhbmMuZmluYWwpDQoNCmBgYCAgDQoNCg0KIyMjIyNfIEVsbyBIaXN0b3J5IF8NCmBgYHtyIGV2YWw9VFJVRX0NCiMNCmVsby5sYXN0LmNvbXAubmV3IDwtIGVsby5CcmlhbmMuZmluYWwNCiMgU2FjYW5kbyBzdWIxNg0KY29tcGUgPC0gIkJyaWFuYy5maW5hbCINCiMNCmVsby5oaXN0b3J5Lmxhc3QgPC0gZWxvLmxhc3QuY29tcC5uZXcgJT4lIA0KICBtdXRhdGUoY29tcCA9IHJlcChjb21wZSwgbGVuZ3RoKGVsby5sYXN0LmNvbXAubmV3JGNvbXBldGl0b3IpKSkNCg0KIw0KZWxvLmhpc3RvcnkgPC0gZWxvLmhpc3RvcnkgJT4lDQogIHJiaW5kKGVsby5oaXN0b3J5Lmxhc3QpDQoNCmBgYCAgDQoNCg0KDQojIyMgKipFbG8gQWNjdW11bGF0ZWQgQnJpYW5jIEZpbmFsKioNCg0KYGBge3IgaW5jbHVkZT1UUlVFfQ0KIyMNCg0KI2Vsby5sYXN0LmFjY3VtIDwtIGVsby5hY2N1bSAlPiUgDQojICByZW5hbWUoUi5uZXc9IEVsbykNCmVsby5sYXN0LmNvbXAgPC0gZWxvLkJyaWFuYy5maW5hbA0KIyMjDQplbG8ubGFzdC5hY2N1bV9sYXN0LmNvbXBfYWJzZW50IDwtIGVsby5sYXN0LmFjY3VtICU+JSBhbnRpX2pvaW4oZWxvLmxhc3QuY29tcCwgYnk9ImNvbXBldGl0b3IiKQ0KDQplbG8ubGFzdC5hY2N1bSA8LSBlbG8ubGFzdC5jb21wICU+JSBmdWxsX2pvaW4oZWxvLmxhc3QuYWNjdW1fbGFzdC5jb21wX2Fic2VudCkNCmVsby5sYXN0LmFjY3VtIDwtIGVsby5sYXN0LmFjY3VtW29yZGVyKGVsby5sYXN0LmFjY3VtJGNvbXBldGl0b3IpLF0NCiMNCmtuaXRyOjprYWJsZShlbG8ubGFzdC5hY2N1bVtvcmRlcihlbG8ubGFzdC5hY2N1bSRSLm5ldywgZGVjcmVhc2luZyA9IFRSVUUpLGMoMSwyLDYsNyw4KV0pDQpgYGAgIA0KDQojIyMgS29wZXIgIA0KDQpgYGB7ciBpbmNsdWRlPVRSVUUsIHJvd3MucHJpbnQ9IDh9DQpsZWFkX21lbiA8LSByYW5rcyAlPiUNCiAgZmlsdGVyKGNvbXBlPT0iS29wZXIiKSAlPiUNCiAgZ3JvdXBfYnkoY29tcGV0aXRvcj0gTmFtZSwNCiAgICAgICMgICAgIFllYXI9IHllYXIsDQogICAgICAgICAgIENvbXBlPSBjb21wZSwNCiAgICAgIFN0YWdlID0gU3RhZ2UsDQogICAgICAgICAgIENvdW50cnkgPSBDb3VudHJ5LA0KICAgICAgICAgICBEYXRlPSBEYXRlLA0KICAgICAgUmFuayA9IFJhbmspICU+JQ0KIyAgcmVmcmFtZShyYW5rPSBSYW5rKSAlPiUNCiAgcmVzaGFwZTI6OmRjYXN0KGZvcm11bGEgPSBjb21wZXRpdG9yICsgQ291bnRyeSArIENvbXBlIH4gU3RhZ2UsDQogICAgICAgICAgICAgICAgICB2YWx1ZS52YXIgPSAiUmFuayIsDQogICAgICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpDQoNCmxlYWRfbWVuIDwtIGFzX3RpYmJsZShsZWFkX21lbikNCiMjDQpsZWFkX21lbltvcmRlcihsZWFkX21lbiRgU2VtaS1maW5hbGApLF0gDQojIw0Kbi5zZW1pcyA8LSBucm93KGxlYWRfbWVuWyFpcy5uYShsZWFkX21lbiRgU2VtaS1maW5hbGApLF0pDQpuLmZpbmFscyA8LSBucm93KGxlYWRfbWVuWyFpcy5uYShsZWFkX21lbiRGaW5hbCksXSkNCg0KYGBgICANCg0KDQojIyMgS29wZXI6IFNlbWktZmluYWxzDQoNCmBgYHtyIGluY2x1ZGU9VFJVRX0NCmxlYWRfbWVuW29yZGVyKGxlYWRfbWVuJGBTZW1pLWZpbmFsYCksIGMoMSwyLDYpXSAlPiUgcHJpbnQobj02MCkNCmBgYCAgDQoNCiMjIyBTZW1pLWZpbmFscyANCiotQ29tcGV0aXRvcnMgPSBgbi5zZW1pc2AtKg0KDQpgYGB7ciBpbmNsdWRlPUZBTFNFfQ0KbGVhZF9tZW4uS29wZXIuc2VtaXMgPC0gbGVhZF9tZW5bLGMoMSwyLDYpXSAlPiUgZmlsdGVyKGxlYWRfbWVuJGBTZW1pLWZpbmFsYCE9Ik5BIikgDQojDQpsYXN0LmNvbXAuZGVidXQgPC0gbGVhZF9tZW4uS29wZXIuc2VtaXMgJT4lIGFudGlfam9pbihlbG8ubGFzdC5hY2N1bSwgYnk9ImNvbXBldGl0b3IiKQ0KYGBgDQoNCg0KDQpgYGB7ciBldmFsPSBUUlVFLGluY2x1ZGU9RkFMU0UsIGNvbHMucHJpbnQ9IDd9DQojIyMgRUxPICMjIyMjIyMjIyMjIyMjIyMjDQojIyMgIyMgRUxPIChOQVNDQVIpICMjIyMjIyMjIyMjIyMNCm4uZGVidXQgPSBsZW5ndGgobGFzdC5jb21wLmRlYnV0JGNvbXBldGl0b3IpDQojIyMNCmxhc3QuY29tcC5jYWxjIDwtIGxlYWRfbWVuLktvcGVyLnNlbWlzICU+JSByaWdodF9qb2luKGVsby5sYXN0LmFjY3VtLCBieT0iY29tcGV0aXRvciIpDQojIyMNCk4gPC0gbGVuZ3RoKGxhc3QuY29tcC5jYWxjJGNvbXBldGl0b3JbIWlzLm5hKGxhc3QuY29tcC5jYWxjJGBTZW1pLWZpbmFsYCldKQ0KUiA8LSBsYXN0LmNvbXAuY2FsYyRSLm5ld1shaXMubmEobGFzdC5jb21wLmNhbGMkYFNlbWktZmluYWxgKV0NCm5hbWVzIDwtIGxhc3QuY29tcC5jYWxjWyFpcy5uYShsYXN0LmNvbXAuY2FsYyRgU2VtaS1maW5hbGApLDFdDQpjb3VudHJ5IDwtIGxhc3QuY29tcC5jYWxjJENvdW50cnlbIWlzLm5hKGxhc3QuY29tcC5jYWxjJGBTZW1pLWZpbmFsYCldDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMNCnJlc3VsdHMgPC0gbGFzdC5jb21wLmNhbGMkYFNlbWktZmluYWxgWyFpcy5uYShsYXN0LmNvbXAuY2FsYyRgU2VtaS1maW5hbGApXQ0Kc3RkZXYgPC0gc2QocmVzdWx0cywgbmEucm0gPSBUUlVFKQ0KIw0KYXZnLnBsYXllciA8LSBtZWFuKGMoUiwgcmVwKG1lYW4oUiksIG4uZGVidXQgKSkpDQptZWRpYW5hIDwtIG1lZGlhbihsZWFkX21lbiRgU2VtaS1maW5hbGBbIWlzLm5hKGxlYWRfbWVuJGBTZW1pLWZpbmFsYCldKQ0KbWF4LnN0ZCA8LSAobWVkaWFuYS0xKS9zdGRldg0KIyMjIyMjIyMjIyMjIyMjIyMjDQpTIDwtICgobWVkaWFuYSAtIGxhc3QuY29tcC5jYWxjJGBTZW1pLWZpbmFsYFshaXMubmEobGFzdC5jb21wLmNhbGMkYFNlbWktZmluYWxgKV0gKSAvIHN0ZGV2KSAvIG1heC5zdGQNCkQgPSA0MDANCmsgPSAzMg0KRSA8LSAxLygxKygxMF4oIChhdmcucGxheWVyLVIpL0QgKSkpDQpSLm5ldyA8LSBSICsgKGsgKiAoUyAtICgoMipFKS9OKSApICkNCiMNCm1heC5jdXQuZmluYWxzIDwtIChzdGRldi05KS9zdGRldg0KUHJvYi5GaW5hbHMgPC0gMS8oMSsoMTBeKCAoIHNvcnQoUi5uZXcsIGRlY3JlYXNpbmcgPSBUUlVFKVs5XSAtUi5uZXcpL0QgKSkpDQptYXguY3V0LnBvZGl1bSA8LSAoc3RkZXYtNCkvc3RkZXYNClByb2IucG9kaXVtIDwtIDEvKDErKDEwXiggKCBzb3J0KFIubmV3LCBkZWNyZWFzaW5nID0gVFJVRSlbNF0gLVIubmV3KS9EICkpKQ0KIyMjDQoNCmVsby5Lb3Blci5zZW1pcyA8LSBjYmluZChuYW1lcyA9IG5hbWVzLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3RyeT0gY291bnRyeSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFIgPSBSLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cyA9IGxhc3QuY29tcC5jYWxjJGBTZW1pLWZpbmFsYFshaXMubmEobGFzdC5jb21wLmNhbGMkYFNlbWktZmluYWxgKV0sDQogICAgICAgICAgICAgICAgICAgICAgICAgICBTID0gUywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFIubmV3PSByb3VuZChSLm5ldywyKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2IuRmluYWxzPSBwYXN0ZShyb3VuZChQcm9iLkZpbmFscyoxMDAsIDEpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlIiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9iLnBvZGl1bSA9IHBhc3RlKHJvdW5kKFByb2IucG9kaXVtKjEwMCwxKSwgIiUiICkgDQogICAgICAgICAgICAgICAgICAgICAgICAgICApDQplbG8uS29wZXIuc2VtaXMgPC0gYXNfdGliYmxlKGVsby5Lb3Blci5zZW1pcykNCg0KIyMjIyMjIyMjIyMNCg0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIyMgIyMgRUxPIChOQVNDQVIpICMjIyMjIyMjIyMjIyMNCm4gPSBsZW5ndGgobGFzdC5jb21wLmRlYnV0JGBTZW1pLWZpbmFsYCkNCk4gPC0gbGVuZ3RoKGxhc3QuY29tcC5jYWxjJGBTZW1pLWZpbmFsYFshaXMubmEobGFzdC5jb21wLmNhbGMkYFNlbWktZmluYWxgKV0pDQpSLmRlYnV0IDwtIHJlcChtZWFuKFIpLCBuKQ0KbmFtZXMgPC0gbGFzdC5jb21wLmRlYnV0WywxXQ0KY291bnRyeSA8LSBsYXN0LmNvbXAuZGVidXQkQ291bnRyeQ0KI2NhdGVnIDwtIGxlYWRfbWVuLmFfYg0KUyA8LSAoKG1lZGlhbmEtIGxhc3QuY29tcC5kZWJ1dCRgU2VtaS1maW5hbGApIC8gc3RkZXYpIC8gbWF4LnN0ZA0KRSA8LSAxLygxKygxMF4oIChhdmcucGxheWVyLVIuZGVidXQpL0QgKSkpDQpSLm5ldyA8LSBSLmRlYnV0ICsgKGsgKiAoUyAtICgoMipFKS9OKSApICkNCiMNCm1heC5jdXQuZmluYWxzIDwtIChzdGRldi05KS9zdGRldg0KUHJvYi5GaW5hbHMgPC0gMS8oMSsoMTBeKCAoIHNvcnQoZWxvLktvcGVyLnNlbWlzJFIubmV3LCBkZWNyZWFzaW5nID0gVFJVRSlbOV0gLSBSLm5ldykvRCApKSkNCm1heC5jdXQucG9kaXVtIDwtIChzdGRldi00KS9zdGRldg0KUHJvYi5wb2RpdW0gPC0gMS8oMSsoMTBeKCAoIHNvcnQoZWxvLktvcGVyLnNlbWlzJFIubmV3LCBkZWNyZWFzaW5nID0gVFJVRSlbNF0gLVIubmV3KS9EICkpKQ0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCmVsby5Lb3Blci5kZWJ1dCA8LSBjYmluZChuYW1lcyA9IG5hbWVzLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3RyeT0gY291bnRyeSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFIgPSBSLmRlYnV0LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cyA9IGxhc3QuY29tcC5kZWJ1dCRgU2VtaS1maW5hbGAsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBTID0gUywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFIubmV3PSByb3VuZChSLm5ldywyKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2IuRmluYWxzPSBwYXN0ZShyb3VuZChQcm9iLkZpbmFscyoxMDAsMSksIiUiKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2IucG9kaXVtID0gcGFzdGUocm91bmQoUHJvYi5wb2RpdW0qMTAwLCAxKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiUiKSANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICkNCmVsby5Lb3Blci5kZWJ1dCA8LSBhc190aWJibGUoZWxvLktvcGVyLmRlYnV0KQ0KDQplbG8uS29wZXIuc2VtaXMgPC0gZWxvLktvcGVyLnNlbWlzICU+JSByYmluZChlbG8uS29wZXIuZGVidXQpDQoNCg0KIyMjIyMgIyMjIyMjIyMjIw0Ka25pdHI6OmthYmxlKGVsby5Lb3Blci5zZW1pc1tvcmRlcihlbG8uS29wZXIuc2VtaXMkcmVzdWx0cyksYygxLDIsMyw0LDYsNyw4KV0pDQoNCmBgYCAgDQoNCg0KIyMjIyNfIEVsbyBIaXN0b3J5IF8NCmBgYHtyIGV2YWw9VFJVRX0NCiMNCiMgU2FjYW5kbyBzdWIxNg0KY29tcGUgPC0gIktvcGVyLnNlbWlzIg0KI2Vsby5oaXN0b3J5Lmxhc3QgPC0gZWxvLjIyLmFjY3VtLnRvX3N1YjE2ICU+JSANCiMgIG11dGF0ZShjb21wID0gcmVwKGNvbXBlLCBsZW5ndGgoZWxvLjIyLmFjY3VtLnRvX3N1YjE2JGNvbXBldGl0b3IpKSwNCiAjICAgICAgICBjYXRlZyA9IHJlcCgiU3ViMTZNIiwgbGVuZ3RoKGVsby4yMi5hY2N1bS50b19zdWIxNiRjb21wZXRpdG9yKSkpDQojDQojZWxvLmhpc3RvcnkgPC0gZWxvLmhpc3RvcnkgJT4lIHJiaW5kKGVsby5oaXN0b3J5Lmxhc3QpDQojIyANCmVsby5oaXN0b3J5Lmxhc3QgPC0gZWxvLktvcGVyLnNlbWlzICU+JSANCiAgbXV0YXRlKGNvbXAgPSByZXAoY29tcGUsIGxlbmd0aChlbG8uS29wZXIuc2VtaXMkY29tcGV0aXRvcikpKQ0KDQojDQplbG8uaGlzdG9yeSA8LSBlbG8uaGlzdG9yeSAlPiUNCiAgcmJpbmQoZWxvLmhpc3RvcnkubGFzdCkNCg0KDQpgYGAgIA0KDQoNCg0KIyMjICoqRWxvIEFjY3VtdWxhdGVkIEtvcGVyIFNlbWlzKioNCg0KYGBge3IgaW5jbHVkZT1UUlVFfQ0KIyMNCg0KI2Vsby5sYXN0LmFjY3VtIDwtIGVsby5hY2N1bSAlPiUgDQojICByZW5hbWUoUi5uZXc9IEVsbykNCmVsby5sYXN0LmNvbXAgPC0gZWxvLktvcGVyLnNlbWlzDQojIyMNCmVsby5sYXN0LmFjY3VtX2xhc3QuY29tcF9hYnNlbnQgPC0gZWxvLmxhc3QuYWNjdW0gJT4lIGFudGlfam9pbihlbG8ubGFzdC5jb21wLCBieT0iY29tcGV0aXRvciIpDQoNCmVsby5sYXN0LmFjY3VtIDwtIGVsby5sYXN0LmNvbXAgJT4lIGZ1bGxfam9pbihlbG8ubGFzdC5hY2N1bV9sYXN0LmNvbXBfYWJzZW50KQ0KZWxvLmxhc3QuYWNjdW0gPC0gZWxvLmxhc3QuYWNjdW1bb3JkZXIoZWxvLmxhc3QuYWNjdW0kY29tcGV0aXRvciksXQ0KIw0Ka25pdHI6OmthYmxlKGVsby5sYXN0LmFjY3VtW29yZGVyKGVsby5sYXN0LmFjY3VtJFIubmV3LCBkZWNyZWFzaW5nID0gVFJVRSksYygxLDIsNiw3LDgpXSkNCmBgYCAgDQoNCg0KDQojIyMgS29wZXI6IEZpbmFsDQoNCmBgYHtyIGluY2x1ZGU9VFJVRX0NCmxlYWRfbWVuW29yZGVyKGxlYWRfbWVuJEZpbmFsKSwgYygxLDIsNCldICU+JSBwcmludChuPTYwKQ0KYGBgICANCg0KIyMjIEZpbmFscyANCiotQ29tcGV0aXRvcnMgPSBgbi5maW5hbGAtKg0KDQpgYGB7ciBpbmNsdWRlPUZBTFNFfQ0KbGVhZF9tZW4uS29wZXIuZmluYWwgPC0gbGVhZF9tZW5bLGMoMSwyLDQpXSAlPiUgZmlsdGVyKGxlYWRfbWVuJEZpbmFsIT0iTkEiKSANCiMNCiNsYXN0LmNvbXAuZGVidXQgPC0gbGVhZF9tZW4uS29wZXIuZmluYWwgJT4lIGFudGlfam9pbihlbG8ubGFzdC5hY2N1bSwgYnk9ImNvbXBldGl0b3IiKQ0KYGBgDQoNCg0KDQpgYGB7ciBldmFsPSBUUlVFLGluY2x1ZGU9RkFMU0UsIGNvbHMucHJpbnQ9IDd9DQojIyMgRUxPICMjIyMjIyMjIyMjIyMjIyMjDQojIyMgIyMgRUxPIChOQVNDQVIpICMjIyMjIyMjIyMjIyMNCiNuLmRlYnV0ID0gbGVuZ3RoKGxhc3QuY29tcC5kZWJ1dCRjb21wZXRpdG9yKQ0KIyMjDQpsYXN0LmNvbXAuY2FsYyA8LSBsZWFkX21lbi5Lb3Blci5maW5hbCAlPiUgcmlnaHRfam9pbihlbG8ubGFzdC5hY2N1bSwgYnk9ImNvbXBldGl0b3IiKQ0KIyMjDQpOIDwtIGxlbmd0aChsYXN0LmNvbXAuY2FsYyRjb21wZXRpdG9yWyFpcy5uYShsYXN0LmNvbXAuY2FsYyRGaW5hbCldKQ0KUiA8LSBsYXN0LmNvbXAuY2FsYyRSLm5ld1shaXMubmEobGFzdC5jb21wLmNhbGMkRmluYWwpXQ0KbmFtZXMgPC0gbGFzdC5jb21wLmNhbGNbIWlzLm5hKGxhc3QuY29tcC5jYWxjJEZpbmFsKSwxXQ0KY291bnRyeSA8LSBsYXN0LmNvbXAuY2FsYyRDb3VudHJ5WyFpcy5uYShsYXN0LmNvbXAuY2FsYyRGaW5hbCldDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMNCg0KcmVzdWx0cyA8LSBsYXN0LmNvbXAuY2FsYyRGaW5hbFshaXMubmEobGFzdC5jb21wLmNhbGMkRmluYWwpXQ0Kc3RkZXYgPC0gc2QocmVzdWx0cywgbmEucm0gPSBUUlVFKQ0KIw0KYXZnLnBsYXllciA8LSBtZWFuKGMoUg0KICAgICAgICAgICAgICAgICAgICAgIywgcmVwKG1lYW4oUiksIG4uZGVidXQgKQ0KICAgICAgICAgICAgICAgICAgICAgKSkNCiNtZWRpYW5hIDwtIG1lZGlhbihsZWFkX21lbiRGaW5hbFshaXMubmEobGVhZF9tZW4kRmluYWwpXSkNCm1lZGlhbmEgPC0gOA0KbWF4LnN0ZCA8LSAobWVkaWFuYS0xKS9zdGRldg0KIyMjIyMjIyMjIyMjIyMjIyMjDQpTIDwtICgobWVkaWFuYSAtIGxhc3QuY29tcC5jYWxjJEZpbmFsWyFpcy5uYShsYXN0LmNvbXAuY2FsYyRGaW5hbCldICkgLyBzdGRldikgLyBtYXguc3RkDQpEID0gNDAwDQprID0gMzINCiNFIDwtIDEvKDErKDEwXiggKGF2Zy5wbGF5ZXItUikvRCApKSkNCkUgPC0gMS8oMSsoMTBeKCAoIHNvcnQoUiwgZGVjcmVhc2luZyA9IFRSVUUpWzhdIC1SKS9EICkpKQ0KUi5uZXcgPC0gUiArIChrICogKFMgLSAoKDIqRSkvTikgKSApDQojDQojbWF4LmN1dC5maW5hbHMgPC0gKHN0ZGV2LTkpL3N0ZGV2DQpQcm9iLkZpbmFscyA8LSAxLygxKygxMF4oICggc29ydChlbG8ubGFzdC5hY2N1bSRSLm5ldywgZGVjcmVhc2luZyA9IFRSVUUpWzldIC1SLm5ldykvRCApKSkNCiNtYXguY3V0LnBvZGl1bSA8LSAoc3RkZXYtNCkvc3RkZXYNClByb2IucG9kaXVtIDwtIDEvKDErKDEwXiggKCBzb3J0KFIubmV3LCBkZWNyZWFzaW5nID0gVFJVRSlbNF0gLVIubmV3KS9EICkpKQ0KIyMjDQoNCmVsby5Lb3Blci5maW5hbCA8LSBjYmluZChuYW1lcyA9IG5hbWVzLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3RyeT0gY291bnRyeSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFIgPSBSLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cyA9IGxhc3QuY29tcC5jYWxjJEZpbmFsWyFpcy5uYShsYXN0LmNvbXAuY2FsYyRGaW5hbCldLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgUyA9IFMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBSLm5ldz0gcm91bmQoUi5uZXcsMiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9iLkZpbmFscz0gcGFzdGUocm91bmQoUHJvYi5GaW5hbHMqMTAwLCAxKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJSIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvYi5wb2RpdW0gPSBwYXN0ZShyb3VuZChQcm9iLnBvZGl1bSoxMDAsMSksICIlIiApIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgKQ0KZWxvLktvcGVyLmZpbmFsIDwtIGFzX3RpYmJsZShlbG8uS29wZXIuZmluYWwpDQoNCmBgYCAgDQoNCg0KIyMjIyNfIEVsbyBIaXN0b3J5IF8NCmBgYHtyIGV2YWw9VFJVRX0NCiMNCmVsby5sYXN0LmNvbXAubmV3IDwtIGVsby5Lb3Blci5maW5hbA0KIyBTYWNhbmRvIHN1YjE2DQpjb21wZSA8LSAiS29wZXIuZmluYWwiDQojDQplbG8uaGlzdG9yeS5sYXN0IDwtIGVsby5sYXN0LmNvbXAubmV3ICU+JSANCiAgbXV0YXRlKGNvbXAgPSByZXAoY29tcGUsIGxlbmd0aChlbG8ubGFzdC5jb21wLm5ldyRjb21wZXRpdG9yKSkpDQoNCiMNCmVsby5oaXN0b3J5IDwtIGVsby5oaXN0b3J5ICU+JQ0KICByYmluZChlbG8uaGlzdG9yeS5sYXN0KQ0KDQpgYGAgIA0KDQoNCg0KIyMjICoqRWxvIEFjY3VtdWxhdGVkIEtvcGVyIEZpbmFsKioNCg0KYGBge3IgaW5jbHVkZT1UUlVFfQ0KIyMNCg0KI2Vsby5sYXN0LmFjY3VtIDwtIGVsby5hY2N1bSAlPiUgDQojICByZW5hbWUoUi5uZXc9IEVsbykNCmVsby5sYXN0LmNvbXAgPC0gZWxvLktvcGVyLmZpbmFsDQojIyMNCmVsby5sYXN0LmFjY3VtX2xhc3QuY29tcF9hYnNlbnQgPC0gZWxvLmxhc3QuYWNjdW0gJT4lIGFudGlfam9pbihlbG8ubGFzdC5jb21wLCBieT0iY29tcGV0aXRvciIpDQoNCmVsby5sYXN0LmFjY3VtIDwtIGVsby5sYXN0LmNvbXAgJT4lIGZ1bGxfam9pbihlbG8ubGFzdC5hY2N1bV9sYXN0LmNvbXBfYWJzZW50KQ0KZWxvLmxhc3QuYWNjdW0gPC0gZWxvLmxhc3QuYWNjdW1bb3JkZXIoZWxvLmxhc3QuYWNjdW0kY29tcGV0aXRvciksXQ0KIw0Ka25pdHI6OmthYmxlKGVsby5sYXN0LmFjY3VtW29yZGVyKGVsby5sYXN0LmFjY3VtJFIubmV3LCBkZWNyZWFzaW5nID0gVFJVRSksYygxLDIsNiw3LDgpXSkNCmBgYCAgDQoNCiMjIFNlb3VsICANCg0KYGBge3IgaW5jbHVkZT1UUlVFLCByb3dzLnByaW50PSA4fQ0KbGVhZF9tZW4gPC0gcmFua3MgJT4lDQogIGZpbHRlcihjb21wZT09IlNlb3VsIikgJT4lDQogIGdyb3VwX2J5KGNvbXBldGl0b3I9IE5hbWUsDQogICAgICAjICAgICBZZWFyPSB5ZWFyLA0KICAgICAgICAgICBDb21wZT0gY29tcGUsDQogICAgICBTdGFnZSA9IFN0YWdlLA0KICAgICAgICAgICBDb3VudHJ5ID0gQ291bnRyeSwNCiAgICAgICAgICAgRGF0ZT0gRGF0ZSwNCiAgICAgIFJhbmsgPSBSYW5rKSAlPiUNCiMgIHJlZnJhbWUocmFuaz0gUmFuaykgJT4lDQogIHJlc2hhcGUyOjpkY2FzdChmb3JtdWxhID0gY29tcGV0aXRvciArIENvdW50cnkgKyBDb21wZSB+IFN0YWdlLA0KICAgICAgICAgICAgICAgICAgdmFsdWUudmFyID0gIlJhbmsiLA0KICAgICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKQ0KDQpsZWFkX21lbiA8LSBhc190aWJibGUobGVhZF9tZW4pDQojIw0KbGVhZF9tZW5bb3JkZXIobGVhZF9tZW4kYFNlbWktZmluYWxgKSxdIA0KIyMNCm4uc2VtaXMgPC0gbnJvdyhsZWFkX21lblshaXMubmEobGVhZF9tZW4kYFNlbWktZmluYWxgKSxdKQ0Kbi5maW5hbHMgPC0gbnJvdyhsZWFkX21lblshaXMubmEobGVhZF9tZW4kRmluYWwpLF0pDQoNCmBgYCAgDQoNCg0KIyMjIFNlb3VsOiBTZW1pLWZpbmFscw0KDQpgYGB7ciBpbmNsdWRlPVRSVUV9DQpsZWFkX21lbltvcmRlcihsZWFkX21lbiRgU2VtaS1maW5hbGApLCBjKDEsMiw2KV0gJT4lIHByaW50KG49NjApDQpgYGAgIA0KDQojIyMgU2VtaS1maW5hbHMgDQoqLUNvbXBldGl0b3JzID0gYG4uc2VtaXNgLSoNCg0KYGBge3IgaW5jbHVkZT1GQUxTRX0NCmxlYWRfbWVuLlNlb3VsLnNlbWlzIDwtIGxlYWRfbWVuWyxjKDEsMiw2KV0gJT4lIGZpbHRlcihsZWFkX21lbiRgU2VtaS1maW5hbGAhPSJOQSIpIA0KIw0KbGFzdC5jb21wLmRlYnV0IDwtIGxlYWRfbWVuLlNlb3VsLnNlbWlzICU+JSBhbnRpX2pvaW4oZWxvLmxhc3QuYWNjdW0sIGJ5PSJjb21wZXRpdG9yIikNCmBgYA0KDQoNCg0KYGBge3IgZXZhbD0gVFJVRSxpbmNsdWRlPUZBTFNFLCBjb2xzLnByaW50PSA3fQ0KIyMjIEVMTyAjIyMjIyMjIyMjIyMjIyMjIw0KIyMjICMjIEVMTyAoTkFTQ0FSKSAjIyMjIyMjIyMjIyMjDQpuLmRlYnV0ID0gbGVuZ3RoKGxhc3QuY29tcC5kZWJ1dCRjb21wZXRpdG9yKQ0KIyMjDQpsYXN0LmNvbXAuY2FsYyA8LSBsZWFkX21lbi5TZW91bC5zZW1pcyAlPiUgcmlnaHRfam9pbihlbG8ubGFzdC5hY2N1bSwgYnk9ImNvbXBldGl0b3IiKQ0KIyMjDQpOIDwtIGxlbmd0aChsYXN0LmNvbXAuY2FsYyRjb21wZXRpdG9yWyFpcy5uYShsYXN0LmNvbXAuY2FsYyRgU2VtaS1maW5hbGApXSkNClIgPC0gbGFzdC5jb21wLmNhbGMkUi5uZXdbIWlzLm5hKGxhc3QuY29tcC5jYWxjJGBTZW1pLWZpbmFsYCldDQpuYW1lcyA8LSBsYXN0LmNvbXAuY2FsY1shaXMubmEobGFzdC5jb21wLmNhbGMkYFNlbWktZmluYWxgKSwxXQ0KY291bnRyeSA8LSBsYXN0LmNvbXAuY2FsYyRDb3VudHJ5WyFpcy5uYShsYXN0LmNvbXAuY2FsYyRgU2VtaS1maW5hbGApXQ0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQpyZXN1bHRzIDwtIGxhc3QuY29tcC5jYWxjJGBTZW1pLWZpbmFsYFshaXMubmEobGFzdC5jb21wLmNhbGMkYFNlbWktZmluYWxgKV0NCnN0ZGV2IDwtIHNkKHJlc3VsdHMsIG5hLnJtID0gVFJVRSkNCiMNCmF2Zy5wbGF5ZXIgPC0gbWVhbihjKFIsIHJlcChtZWFuKFIpLCBuLmRlYnV0ICkpKQ0KbWVkaWFuYSA8LSBtZWRpYW4obGVhZF9tZW4kYFNlbWktZmluYWxgWyFpcy5uYShsZWFkX21lbiRgU2VtaS1maW5hbGApXSkNCm1heC5zdGQgPC0gKG1lZGlhbmEtMSkvc3RkZXYNCiMjIyMjIyMjIyMjIyMjIyMjIw0KUyA8LSAoKG1lZGlhbmEgLSBsYXN0LmNvbXAuY2FsYyRgU2VtaS1maW5hbGBbIWlzLm5hKGxhc3QuY29tcC5jYWxjJGBTZW1pLWZpbmFsYCldICkgLyBzdGRldikgLyBtYXguc3RkDQpEID0gNDAwDQprID0gMzINCkUgPC0gMS8oMSsoMTBeKCAoYXZnLnBsYXllci1SKS9EICkpKQ0KUi5uZXcgPC0gUiArIChrICogKFMgLSAoKDIqRSkvTikgKSApDQojDQptYXguY3V0LmZpbmFscyA8LSAoc3RkZXYtOSkvc3RkZXYNClByb2IuRmluYWxzIDwtIDEvKDErKDEwXiggKCBzb3J0KFIubmV3LCBkZWNyZWFzaW5nID0gVFJVRSlbOV0gLVIubmV3KS9EICkpKQ0KbWF4LmN1dC5wb2RpdW0gPC0gKHN0ZGV2LTQpL3N0ZGV2DQpQcm9iLnBvZGl1bSA8LSAxLygxKygxMF4oICggc29ydChSLm5ldywgZGVjcmVhc2luZyA9IFRSVUUpWzRdIC1SLm5ldykvRCApKSkNCiMjIw0KDQplbG8uU2VvdWwuc2VtaXMgPC0gY2JpbmQobmFtZXMgPSBuYW1lcywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIEN0cnk9IGNvdW50cnksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBSID0gUiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMgPSBsYXN0LmNvbXAuY2FsYyRgU2VtaS1maW5hbGBbIWlzLm5hKGxhc3QuY29tcC5jYWxjJGBTZW1pLWZpbmFsYCldLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgUyA9IFMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBSLm5ldz0gcm91bmQoUi5uZXcsMiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9iLkZpbmFscz0gcGFzdGUocm91bmQoUHJvYi5GaW5hbHMqMTAwLCAxKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJSIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvYi5wb2RpdW0gPSBwYXN0ZShyb3VuZChQcm9iLnBvZGl1bSoxMDAsMSksICIlIiApIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgKQ0KZWxvLlNlb3VsLnNlbWlzIDwtIGFzX3RpYmJsZShlbG8uU2VvdWwuc2VtaXMpDQoNCiMjIyMjIyMjIyMjDQoNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyMjICMjIEVMTyAoTkFTQ0FSKSAjIyMjIyMjIyMjIyMjDQpuID0gbGVuZ3RoKGxhc3QuY29tcC5kZWJ1dCRgU2VtaS1maW5hbGApDQpOIDwtIGxlbmd0aChsYXN0LmNvbXAuY2FsYyRgU2VtaS1maW5hbGBbIWlzLm5hKGxhc3QuY29tcC5jYWxjJGBTZW1pLWZpbmFsYCldKQ0KUi5kZWJ1dCA8LSByZXAobWVhbihSKSwgbikNCm5hbWVzIDwtIGxhc3QuY29tcC5kZWJ1dFssMV0NCmNvdW50cnkgPC0gbGFzdC5jb21wLmRlYnV0JENvdW50cnkNCiNjYXRlZyA8LSBsZWFkX21lbi5hX2INClMgPC0gKChtZWRpYW5hLSBsYXN0LmNvbXAuZGVidXQkYFNlbWktZmluYWxgKSAvIHN0ZGV2KSAvIG1heC5zdGQNCkUgPC0gMS8oMSsoMTBeKCAoYXZnLnBsYXllci1SLmRlYnV0KS9EICkpKQ0KUi5uZXcgPC0gUi5kZWJ1dCArIChrICogKFMgLSAoKDIqRSkvTikgKSApDQojDQptYXguY3V0LmZpbmFscyA8LSAoc3RkZXYtOSkvc3RkZXYNClByb2IuRmluYWxzIDwtIDEvKDErKDEwXiggKCBzb3J0KGVsby5TZW91bC5zZW1pcyRSLm5ldywgZGVjcmVhc2luZyA9IFRSVUUpWzldIC0gUi5uZXcpL0QgKSkpDQptYXguY3V0LnBvZGl1bSA8LSAoc3RkZXYtNCkvc3RkZXYNClByb2IucG9kaXVtIDwtIDEvKDErKDEwXiggKCBzb3J0KGVsby5TZW91bC5zZW1pcyRSLm5ldywgZGVjcmVhc2luZyA9IFRSVUUpWzRdIC1SLm5ldykvRCApKSkNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQplbG8uU2VvdWwuZGVidXQgPC0gY2JpbmQobmFtZXMgPSBuYW1lcywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIEN0cnk9IGNvdW50cnksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBSID0gUi5kZWJ1dCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMgPSBsYXN0LmNvbXAuZGVidXQkYFNlbWktZmluYWxgLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgUyA9IFMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBSLm5ldz0gcm91bmQoUi5uZXcsMiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9iLkZpbmFscz0gcGFzdGUocm91bmQoUHJvYi5GaW5hbHMqMTAwLDEpLCIlIiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9iLnBvZGl1bSA9IHBhc3RlKHJvdW5kKFByb2IucG9kaXVtKjEwMCwgMSksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlIikgDQogICAgICAgICAgICAgICAgICAgICAgICAgICApDQplbG8uU2VvdWwuZGVidXQgPC0gYXNfdGliYmxlKGVsby5TZW91bC5kZWJ1dCkNCg0KZWxvLlNlb3VsLnNlbWlzIDwtIGVsby5TZW91bC5zZW1pcyAlPiUgcmJpbmQoZWxvLlNlb3VsLmRlYnV0KQ0KDQoNCiMjIyMjICMjIyMjIyMjIyMNCmtuaXRyOjprYWJsZShlbG8uU2VvdWwuc2VtaXNbb3JkZXIoZWxvLlNlb3VsLnNlbWlzJHJlc3VsdHMpLGMoMSwyLDMsNCw2LDcsOCldKQ0KDQpgYGAgIA0KDQoNCiMjIyMjXyBFbG8gSGlzdG9yeSBfDQpgYGB7ciBldmFsPVRSVUV9DQojDQojIFNhY2FuZG8gc3ViMTYNCmNvbXBlIDwtICJTZW91bC5zZW1pcyINCiNlbG8uaGlzdG9yeS5sYXN0IDwtIGVsby4yMi5hY2N1bS50b19zdWIxNiAlPiUgDQojICBtdXRhdGUoY29tcCA9IHJlcChjb21wZSwgbGVuZ3RoKGVsby4yMi5hY2N1bS50b19zdWIxNiRjb21wZXRpdG9yKSksDQogIyAgICAgICAgY2F0ZWcgPSByZXAoIlN1YjE2TSIsIGxlbmd0aChlbG8uMjIuYWNjdW0udG9fc3ViMTYkY29tcGV0aXRvcikpKQ0KIw0KI2Vsby5oaXN0b3J5IDwtIGVsby5oaXN0b3J5ICU+JSByYmluZChlbG8uaGlzdG9yeS5sYXN0KQ0KIyMgDQplbG8uaGlzdG9yeS5sYXN0IDwtIGVsby5TZW91bC5zZW1pcyAlPiUgDQogIG11dGF0ZShjb21wID0gcmVwKGNvbXBlLCBsZW5ndGgoZWxvLlNlb3VsLnNlbWlzJGNvbXBldGl0b3IpKSkNCg0KIw0KZWxvLmhpc3RvcnkgPC0gZWxvLmhpc3RvcnkgJT4lDQogIHJiaW5kKGVsby5oaXN0b3J5Lmxhc3QpDQoNCg0KYGBgICANCg0KDQoNCiMjIyAqKkVsbyBBY2N1bXVsYXRlZCBTZW91bCBTZW1pcyoqDQoNCmBgYHtyIGluY2x1ZGU9VFJVRX0NCiMjDQoNCiNlbG8ubGFzdC5hY2N1bSA8LSBlbG8uYWNjdW0gJT4lIA0KIyAgcmVuYW1lKFIubmV3PSBFbG8pDQplbG8ubGFzdC5jb21wIDwtIGVsby5TZW91bC5zZW1pcw0KIyMjDQplbG8ubGFzdC5hY2N1bV9sYXN0LmNvbXBfYWJzZW50IDwtIGVsby5sYXN0LmFjY3VtICU+JSBhbnRpX2pvaW4oZWxvLmxhc3QuY29tcCwgYnk9ImNvbXBldGl0b3IiKQ0KDQplbG8ubGFzdC5hY2N1bSA8LSBlbG8ubGFzdC5jb21wICU+JSBmdWxsX2pvaW4oZWxvLmxhc3QuYWNjdW1fbGFzdC5jb21wX2Fic2VudCkNCmVsby5sYXN0LmFjY3VtIDwtIGVsby5sYXN0LmFjY3VtW29yZGVyKGVsby5sYXN0LmFjY3VtJGNvbXBldGl0b3IpLF0NCiMNCmtuaXRyOjprYWJsZShlbG8ubGFzdC5hY2N1bVtvcmRlcihlbG8ubGFzdC5hY2N1bSRSLm5ldywgZGVjcmVhc2luZyA9IFRSVUUpLGMoMSwyLDYsNyw4KV0pDQpgYGAgIA0KDQoNCg0KIyMjIFNlb3VsOiBGaW5hbA0KDQpgYGB7ciBpbmNsdWRlPVRSVUV9DQpsZWFkX21lbltvcmRlcihsZWFkX21lbiRGaW5hbCksIGMoMSwyLDQpXSAlPiUgcHJpbnQobj02MCkNCmBgYCAgDQoNCiMjIyBGaW5hbHMgDQoqLUNvbXBldGl0b3JzID0gYG4uZmluYWxgLSoNCg0KYGBge3IgaW5jbHVkZT1GQUxTRX0NCmxlYWRfbWVuLlNlb3VsLmZpbmFsIDwtIGxlYWRfbWVuWyxjKDEsMiw0KV0gJT4lIGZpbHRlcihsZWFkX21lbiRGaW5hbCE9Ik5BIikgDQojDQojbGFzdC5jb21wLmRlYnV0IDwtIGxlYWRfbWVuLlNlb3VsLmZpbmFsICU+JSBhbnRpX2pvaW4oZWxvLmxhc3QuYWNjdW0sIGJ5PSJjb21wZXRpdG9yIikNCmBgYA0KDQoNCg0KYGBge3IgZXZhbD0gVFJVRSxpbmNsdWRlPUZBTFNFLCBjb2xzLnByaW50PSA3fQ0KIyMjIEVMTyAjIyMjIyMjIyMjIyMjIyMjIw0KIyMjICMjIEVMTyAoTkFTQ0FSKSAjIyMjIyMjIyMjIyMjDQojbi5kZWJ1dCA9IGxlbmd0aChsYXN0LmNvbXAuZGVidXQkY29tcGV0aXRvcikNCiMjIw0KbGFzdC5jb21wLmNhbGMgPC0gbGVhZF9tZW4uU2VvdWwuZmluYWwgJT4lIHJpZ2h0X2pvaW4oZWxvLmxhc3QuYWNjdW0sIGJ5PSJjb21wZXRpdG9yIikNCiMjIw0KTiA8LSBsZW5ndGgobGFzdC5jb21wLmNhbGMkY29tcGV0aXRvclshaXMubmEobGFzdC5jb21wLmNhbGMkRmluYWwpXSkNClIgPC0gbGFzdC5jb21wLmNhbGMkUi5uZXdbIWlzLm5hKGxhc3QuY29tcC5jYWxjJEZpbmFsKV0NCm5hbWVzIDwtIGxhc3QuY29tcC5jYWxjWyFpcy5uYShsYXN0LmNvbXAuY2FsYyRGaW5hbCksMV0NCmNvdW50cnkgPC0gbGFzdC5jb21wLmNhbGMkQ291bnRyeVshaXMubmEobGFzdC5jb21wLmNhbGMkRmluYWwpXQ0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQoNCnJlc3VsdHMgPC0gbGFzdC5jb21wLmNhbGMkRmluYWxbIWlzLm5hKGxhc3QuY29tcC5jYWxjJEZpbmFsKV0NCnN0ZGV2IDwtIHNkKHJlc3VsdHMsIG5hLnJtID0gVFJVRSkNCiMNCmF2Zy5wbGF5ZXIgPC0gbWVhbihjKFINCiAgICAgICAgICAgICAgICAgICAgICMsIHJlcChtZWFuKFIpLCBuLmRlYnV0ICkNCiAgICAgICAgICAgICAgICAgICAgICkpDQojbWVkaWFuYSA8LSBtZWRpYW4obGVhZF9tZW4kRmluYWxbIWlzLm5hKGxlYWRfbWVuJEZpbmFsKV0pDQptZWRpYW5hIDwtIDgNCm1heC5zdGQgPC0gKG1lZGlhbmEtMSkvc3RkZXYNCiMjIyMjIyMjIyMjIyMjIyMjIw0KUyA8LSAoKG1lZGlhbmEgLSBsYXN0LmNvbXAuY2FsYyRGaW5hbFshaXMubmEobGFzdC5jb21wLmNhbGMkRmluYWwpXSApIC8gc3RkZXYpIC8gbWF4LnN0ZA0KRCA9IDQwMA0KayA9IDMyDQojRSA8LSAxLygxKygxMF4oIChhdmcucGxheWVyLVIpL0QgKSkpDQpFIDwtIDEvKDErKDEwXiggKCBzb3J0KFIsIGRlY3JlYXNpbmcgPSBUUlVFKVs4XSAtUikvRCApKSkNClIubmV3IDwtIFIgKyAoayAqIChTIC0gKCgyKkUpL04pICkgKQ0KIw0KI21heC5jdXQuZmluYWxzIDwtIChzdGRldi05KS9zdGRldg0KUHJvYi5GaW5hbHMgPC0gMS8oMSsoMTBeKCAoIHNvcnQoZWxvLmxhc3QuYWNjdW0kUi5uZXcsIGRlY3JlYXNpbmcgPSBUUlVFKVs5XSAtUi5uZXcpL0QgKSkpDQojbWF4LmN1dC5wb2RpdW0gPC0gKHN0ZGV2LTQpL3N0ZGV2DQpQcm9iLnBvZGl1bSA8LSAxLygxKygxMF4oICggc29ydChSLm5ldywgZGVjcmVhc2luZyA9IFRSVUUpWzRdIC1SLm5ldykvRCApKSkNCiMjIw0KDQplbG8uU2VvdWwuZmluYWwgPC0gY2JpbmQobmFtZXMgPSBuYW1lcywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIEN0cnk9IGNvdW50cnksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBSID0gUiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMgPSBsYXN0LmNvbXAuY2FsYyRGaW5hbFshaXMubmEobGFzdC5jb21wLmNhbGMkRmluYWwpXSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFMgPSBTLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgUi5uZXc9IHJvdW5kKFIubmV3LDIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvYi5GaW5hbHM9IHBhc3RlKHJvdW5kKFByb2IuRmluYWxzKjEwMCwgMSksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiUiKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2IucG9kaXVtID0gcGFzdGUocm91bmQoUHJvYi5wb2RpdW0qMTAwLDEpLCAiJSIgKSANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICkNCmVsby5TZW91bC5maW5hbCA8LSBhc190aWJibGUoZWxvLlNlb3VsLmZpbmFsKQ0KDQpgYGAgIA0KDQoNCiMjIyMjXyBFbG8gSGlzdG9yeSBfDQpgYGB7ciBldmFsPVRSVUV9DQojDQplbG8ubGFzdC5jb21wLm5ldyA8LSBlbG8uU2VvdWwuZmluYWwNCiMgU2FjYW5kbyBzdWIxNg0KY29tcGUgPC0gIlNlb3VsLmZpbmFsIg0KIw0KZWxvLmhpc3RvcnkubGFzdCA8LSBlbG8ubGFzdC5jb21wLm5ldyAlPiUgDQogIG11dGF0ZShjb21wID0gcmVwKGNvbXBlLCBsZW5ndGgoZWxvLmxhc3QuY29tcC5uZXckY29tcGV0aXRvcikpKQ0KDQojDQplbG8uaGlzdG9yeSA8LSBlbG8uaGlzdG9yeSAlPiUNCiAgcmJpbmQoZWxvLmhpc3RvcnkubGFzdCkNCg0KYGBgICANCg0KDQoNCiMjIyAqKkVsbyBBY2N1bXVsYXRlZCBTZW91bCBGaW5hbCoqDQoNCmBgYHtyIGluY2x1ZGU9VFJVRX0NCiMjDQoNCiNlbG8ubGFzdC5hY2N1bSA8LSBlbG8uYWNjdW0gJT4lIA0KIyAgcmVuYW1lKFIubmV3PSBFbG8pDQplbG8ubGFzdC5jb21wIDwtIGVsby5TZW91bC5maW5hbA0KIyMjDQplbG8ubGFzdC5hY2N1bV9sYXN0LmNvbXBfYWJzZW50IDwtIGVsby5sYXN0LmFjY3VtICU+JSBhbnRpX2pvaW4oZWxvLmxhc3QuY29tcCwgYnk9ImNvbXBldGl0b3IiKQ0KDQplbG8ubGFzdC5hY2N1bSA8LSBlbG8ubGFzdC5jb21wICU+JSBmdWxsX2pvaW4oZWxvLmxhc3QuYWNjdW1fbGFzdC5jb21wX2Fic2VudCkNCmVsby5sYXN0LmFjY3VtIDwtIGVsby5sYXN0LmFjY3VtW29yZGVyKGVsby5sYXN0LmFjY3VtJGNvbXBldGl0b3IpLF0NCiMNCmtuaXRyOjprYWJsZShlbG8ubGFzdC5hY2N1bVtvcmRlcihlbG8ubGFzdC5hY2N1bSRSLm5ldywgZGVjcmVhc2luZyA9IFRSVUUpLGMoMSwyLDYsNyw4KV0pDQpgYGAgIA0KDQoNCiMjIFd1amlhbmcgIA0KDQpgYGB7ciBpbmNsdWRlPVRSVUUsIHJvd3MucHJpbnQ9IDh9DQpsZWFkX21lbiA8LSByYW5rcyAlPiUNCiAgZmlsdGVyKGNvbXBlPT0iV3VqaWFuZyIpICU+JQ0KICBncm91cF9ieShjb21wZXRpdG9yPSBOYW1lLA0KICAgICAgIyAgICAgWWVhcj0geWVhciwNCiAgICAgICAgICAgQ29tcGU9IGNvbXBlLA0KICAgICAgU3RhZ2UgPSBTdGFnZSwNCiAgICAgICAgICAgQ291bnRyeSA9IENvdW50cnksDQogICAgICAgICAgIERhdGU9IERhdGUsDQogICAgICBSYW5rID0gUmFuaykgJT4lDQojICByZWZyYW1lKHJhbms9IFJhbmspICU+JQ0KICByZXNoYXBlMjo6ZGNhc3QoZm9ybXVsYSA9IGNvbXBldGl0b3IgKyBDb3VudHJ5ICsgQ29tcGUgfiBTdGFnZSwNCiAgICAgICAgICAgICAgICAgIHZhbHVlLnZhciA9ICJSYW5rIiwNCiAgICAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSkNCg0KbGVhZF9tZW4gPC0gYXNfdGliYmxlKGxlYWRfbWVuKQ0KIyMNCmxlYWRfbWVuW29yZGVyKGxlYWRfbWVuJGBTZW1pLWZpbmFsYCksXSANCiMjDQpuLnNlbWlzIDwtIG5yb3cobGVhZF9tZW5bIWlzLm5hKGxlYWRfbWVuJGBTZW1pLWZpbmFsYCksXSkNCm4uZmluYWxzIDwtIG5yb3cobGVhZF9tZW5bIWlzLm5hKGxlYWRfbWVuJEZpbmFsKSxdKQ0KDQpgYGAgIA0KDQoNCiMjIyBXdWppYW5nOiBTZW1pLWZpbmFscw0KDQpgYGB7ciBpbmNsdWRlPVRSVUV9DQpsZWFkX21lbltvcmRlcihsZWFkX21lbiRgU2VtaS1maW5hbGApLCBjKDEsMiw2KV0gJT4lIHByaW50KG49NjApDQpgYGAgIA0KDQojIyMgU2VtaS1maW5hbHMgDQoqLUNvbXBldGl0b3JzID0gYG4uc2VtaXNgLSoNCg0KYGBge3IgaW5jbHVkZT1GQUxTRX0NCmxlYWRfbWVuLld1amlhbmcuc2VtaXMgPC0gbGVhZF9tZW5bLGMoMSwyLDYpXSAlPiUgZmlsdGVyKGxlYWRfbWVuJGBTZW1pLWZpbmFsYCE9Ik5BIikgDQojDQpsYXN0LmNvbXAuZGVidXQgPC0gbGVhZF9tZW4uV3VqaWFuZy5zZW1pcyAlPiUgYW50aV9qb2luKGVsby5sYXN0LmFjY3VtLCBieT0iY29tcGV0aXRvciIpDQpgYGANCg0KDQoNCmBgYHtyIGV2YWw9IFRSVUUsaW5jbHVkZT1GQUxTRSwgY29scy5wcmludD0gN30NCiMjIyBFTE8gIyMjIyMjIyMjIyMjIyMjIyMNCiMjIyAjIyBFTE8gKE5BU0NBUikgIyMjIyMjIyMjIyMjIw0Kbi5kZWJ1dCA9IGxlbmd0aChsYXN0LmNvbXAuZGVidXQkY29tcGV0aXRvcikNCiMjIw0KbGFzdC5jb21wLmNhbGMgPC0gbGVhZF9tZW4uV3VqaWFuZy5zZW1pcyAlPiUgcmlnaHRfam9pbihlbG8ubGFzdC5hY2N1bSwgYnk9ImNvbXBldGl0b3IiKQ0KIyMjDQpOIDwtIGxlbmd0aChsYXN0LmNvbXAuY2FsYyRjb21wZXRpdG9yWyFpcy5uYShsYXN0LmNvbXAuY2FsYyRgU2VtaS1maW5hbGApXSkNClIgPC0gbGFzdC5jb21wLmNhbGMkUi5uZXdbIWlzLm5hKGxhc3QuY29tcC5jYWxjJGBTZW1pLWZpbmFsYCldDQpuYW1lcyA8LSBsYXN0LmNvbXAuY2FsY1shaXMubmEobGFzdC5jb21wLmNhbGMkYFNlbWktZmluYWxgKSwxXQ0KY291bnRyeSA8LSBsYXN0LmNvbXAuY2FsYyRDb3VudHJ5WyFpcy5uYShsYXN0LmNvbXAuY2FsYyRgU2VtaS1maW5hbGApXQ0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQpyZXN1bHRzIDwtIGxhc3QuY29tcC5jYWxjJGBTZW1pLWZpbmFsYFshaXMubmEobGFzdC5jb21wLmNhbGMkYFNlbWktZmluYWxgKV0NCnN0ZGV2IDwtIHNkKHJlc3VsdHMsIG5hLnJtID0gVFJVRSkNCiMNCmF2Zy5wbGF5ZXIgPC0gbWVhbihjKFIsIHJlcChtZWFuKFIpLCBuLmRlYnV0ICkpKQ0KbWVkaWFuYSA8LSBtZWRpYW4obGVhZF9tZW4kYFNlbWktZmluYWxgWyFpcy5uYShsZWFkX21lbiRgU2VtaS1maW5hbGApXSkNCm1heC5zdGQgPC0gKG1lZGlhbmEtMSkvc3RkZXYNCiMjIyMjIyMjIyMjIyMjIyMjIw0KUyA8LSAoKG1lZGlhbmEgLSBsYXN0LmNvbXAuY2FsYyRgU2VtaS1maW5hbGBbIWlzLm5hKGxhc3QuY29tcC5jYWxjJGBTZW1pLWZpbmFsYCldICkgLyBzdGRldikgLyBtYXguc3RkDQpEID0gNDAwDQprID0gMzINCkUgPC0gMS8oMSsoMTBeKCAoYXZnLnBsYXllci1SKS9EICkpKQ0KUi5uZXcgPC0gUiArIChrICogKFMgLSAoKDIqRSkvTikgKSApDQojDQptYXguY3V0LmZpbmFscyA8LSAoc3RkZXYtOSkvc3RkZXYNClByb2IuRmluYWxzIDwtIDEvKDErKDEwXiggKCBzb3J0KFIubmV3LCBkZWNyZWFzaW5nID0gVFJVRSlbOV0gLVIubmV3KS9EICkpKQ0KbWF4LmN1dC5wb2RpdW0gPC0gKHN0ZGV2LTQpL3N0ZGV2DQpQcm9iLnBvZGl1bSA8LSAxLygxKygxMF4oICggc29ydChSLm5ldywgZGVjcmVhc2luZyA9IFRSVUUpWzRdIC1SLm5ldykvRCApKSkNCiMjIw0KDQplbG8uV3VqaWFuZy5zZW1pcyA8LSBjYmluZChuYW1lcyA9IG5hbWVzLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3RyeT0gY291bnRyeSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFIgPSBSLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cyA9IGxhc3QuY29tcC5jYWxjJGBTZW1pLWZpbmFsYFshaXMubmEobGFzdC5jb21wLmNhbGMkYFNlbWktZmluYWxgKV0sDQogICAgICAgICAgICAgICAgICAgICAgICAgICBTID0gUywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFIubmV3PSByb3VuZChSLm5ldywyKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2IuRmluYWxzPSBwYXN0ZShyb3VuZChQcm9iLkZpbmFscyoxMDAsIDEpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlIiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9iLnBvZGl1bSA9IHBhc3RlKHJvdW5kKFByb2IucG9kaXVtKjEwMCwxKSwgIiUiICkgDQogICAgICAgICAgICAgICAgICAgICAgICAgICApDQplbG8uV3VqaWFuZy5zZW1pcyA8LSBhc190aWJibGUoZWxvLld1amlhbmcuc2VtaXMpDQoNCiMjIyMjIyMjIyMjDQoNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyMjICMjIEVMTyAoTkFTQ0FSKSAjIyMjIyMjIyMjIyMjDQpuID0gbGVuZ3RoKGxhc3QuY29tcC5kZWJ1dCRgU2VtaS1maW5hbGApDQpOIDwtIGxlbmd0aChsYXN0LmNvbXAuY2FsYyRgU2VtaS1maW5hbGBbIWlzLm5hKGxhc3QuY29tcC5jYWxjJGBTZW1pLWZpbmFsYCldKQ0KUi5kZWJ1dCA8LSByZXAobWVhbihSKSwgbikNCm5hbWVzIDwtIGxhc3QuY29tcC5kZWJ1dFssMV0NCmNvdW50cnkgPC0gbGFzdC5jb21wLmRlYnV0JENvdW50cnkNCiNjYXRlZyA8LSBsZWFkX21lbi5hX2INClMgPC0gKChtZWRpYW5hLSBsYXN0LmNvbXAuZGVidXQkYFNlbWktZmluYWxgKSAvIHN0ZGV2KSAvIG1heC5zdGQNCkUgPC0gMS8oMSsoMTBeKCAoYXZnLnBsYXllci1SLmRlYnV0KS9EICkpKQ0KUi5uZXcgPC0gUi5kZWJ1dCArIChrICogKFMgLSAoKDIqRSkvTikgKSApDQojDQptYXguY3V0LmZpbmFscyA8LSAoc3RkZXYtOSkvc3RkZXYNClByb2IuRmluYWxzIDwtIDEvKDErKDEwXiggKCBzb3J0KGVsby5XdWppYW5nLnNlbWlzJFIubmV3LCBkZWNyZWFzaW5nID0gVFJVRSlbOV0gLSBSLm5ldykvRCApKSkNCm1heC5jdXQucG9kaXVtIDwtIChzdGRldi00KS9zdGRldg0KUHJvYi5wb2RpdW0gPC0gMS8oMSsoMTBeKCAoIHNvcnQoZWxvLld1amlhbmcuc2VtaXMkUi5uZXcsIGRlY3JlYXNpbmcgPSBUUlVFKVs0XSAtUi5uZXcpL0QgKSkpDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KZWxvLld1amlhbmcuZGVidXQgPC0gY2JpbmQobmFtZXMgPSBuYW1lcywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIEN0cnk9IGNvdW50cnksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBSID0gUi5kZWJ1dCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMgPSBsYXN0LmNvbXAuZGVidXQkYFNlbWktZmluYWxgLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgUyA9IFMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBSLm5ldz0gcm91bmQoUi5uZXcsMiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9iLkZpbmFscz0gcGFzdGUocm91bmQoUHJvYi5GaW5hbHMqMTAwLDEpLCIlIiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9iLnBvZGl1bSA9IHBhc3RlKHJvdW5kKFByb2IucG9kaXVtKjEwMCwgMSksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlIikgDQogICAgICAgICAgICAgICAgICAgICAgICAgICApDQplbG8uV3VqaWFuZy5kZWJ1dCA8LSBhc190aWJibGUoZWxvLld1amlhbmcuZGVidXQpDQoNCmVsby5XdWppYW5nLnNlbWlzIDwtIGVsby5XdWppYW5nLnNlbWlzICU+JSByYmluZChlbG8uV3VqaWFuZy5kZWJ1dCkNCg0KDQojIyMjIyAjIyMjIyMjIyMjDQprbml0cjo6a2FibGUoZWxvLld1amlhbmcuc2VtaXNbb3JkZXIoZWxvLld1amlhbmcuc2VtaXMkcmVzdWx0cyksYygxLDIsMyw0LDYsNyw4KV0pDQoNCmBgYCAgDQoNCg0KIyMjIyNfIEVsbyBIaXN0b3J5IF8NCmBgYHtyIGV2YWw9VFJVRX0NCiMNCiMgU2FjYW5kbyBzdWIxNg0KY29tcGUgPC0gIld1amlhbmcuc2VtaXMiDQojZWxvLmhpc3RvcnkubGFzdCA8LSBlbG8uMjIuYWNjdW0udG9fc3ViMTYgJT4lIA0KIyAgbXV0YXRlKGNvbXAgPSByZXAoY29tcGUsIGxlbmd0aChlbG8uMjIuYWNjdW0udG9fc3ViMTYkY29tcGV0aXRvcikpLA0KICMgICAgICAgIGNhdGVnID0gcmVwKCJTdWIxNk0iLCBsZW5ndGgoZWxvLjIyLmFjY3VtLnRvX3N1YjE2JGNvbXBldGl0b3IpKSkNCiMNCiNlbG8uaGlzdG9yeSA8LSBlbG8uaGlzdG9yeSAlPiUgcmJpbmQoZWxvLmhpc3RvcnkubGFzdCkNCiMjIA0KZWxvLmhpc3RvcnkubGFzdCA8LSBlbG8uV3VqaWFuZy5zZW1pcyAlPiUgDQogIG11dGF0ZShjb21wID0gcmVwKGNvbXBlLCBsZW5ndGgoZWxvLld1amlhbmcuc2VtaXMkY29tcGV0aXRvcikpKQ0KDQojDQplbG8uaGlzdG9yeSA8LSBlbG8uaGlzdG9yeSAlPiUNCiAgcmJpbmQoZWxvLmhpc3RvcnkubGFzdCkNCg0KDQpgYGAgIA0KDQoNCg0KIyMjICoqRWxvIEFjY3VtdWxhdGVkIFd1amlhbmcgU2VtaXMqKg0KDQpgYGB7ciBpbmNsdWRlPVRSVUV9DQojIw0KDQojZWxvLmxhc3QuYWNjdW0gPC0gZWxvLmFjY3VtICU+JSANCiMgIHJlbmFtZShSLm5ldz0gRWxvKQ0KZWxvLmxhc3QuY29tcCA8LSBlbG8uV3VqaWFuZy5zZW1pcw0KIyMjDQplbG8ubGFzdC5hY2N1bV9sYXN0LmNvbXBfYWJzZW50IDwtIGVsby5sYXN0LmFjY3VtICU+JSBhbnRpX2pvaW4oZWxvLmxhc3QuY29tcCwgYnk9ImNvbXBldGl0b3IiKQ0KDQplbG8ubGFzdC5hY2N1bSA8LSBlbG8ubGFzdC5jb21wICU+JSBmdWxsX2pvaW4oZWxvLmxhc3QuYWNjdW1fbGFzdC5jb21wX2Fic2VudCkNCmVsby5sYXN0LmFjY3VtIDwtIGVsby5sYXN0LmFjY3VtW29yZGVyKGVsby5sYXN0LmFjY3VtJGNvbXBldGl0b3IpLF0NCiMNCmtuaXRyOjprYWJsZShlbG8ubGFzdC5hY2N1bVtvcmRlcihlbG8ubGFzdC5hY2N1bSRSLm5ldywgZGVjcmVhc2luZyA9IFRSVUUpLGMoMSwyLDYsNyw4KV0pDQpgYGAgIA0KDQoNCg0KIyMjIFd1amlhbmc6IEZpbmFsDQoNCmBgYHtyIGluY2x1ZGU9VFJVRX0NCmxlYWRfbWVuW29yZGVyKGxlYWRfbWVuJEZpbmFsKSwgYygxLDIsNCldICU+JSBwcmludChuPTYwKQ0KYGBgICANCg0KIyMjIEZpbmFscyANCiotQ29tcGV0aXRvcnMgPSBgbi5maW5hbGAtKg0KDQpgYGB7ciBpbmNsdWRlPUZBTFNFfQ0KbGVhZF9tZW4uV3VqaWFuZy5maW5hbCA8LSBsZWFkX21lblssYygxLDIsNCldICU+JSBmaWx0ZXIobGVhZF9tZW4kRmluYWwhPSJOQSIpIA0KIw0KI2xhc3QuY29tcC5kZWJ1dCA8LSBsZWFkX21lbi5XdWppYW5nLmZpbmFsICU+JSBhbnRpX2pvaW4oZWxvLmxhc3QuYWNjdW0sIGJ5PSJjb21wZXRpdG9yIikNCmBgYA0KDQoNCg0KYGBge3IgZXZhbD0gVFJVRSxpbmNsdWRlPUZBTFNFLCBjb2xzLnByaW50PSA3fQ0KIyMjIEVMTyAjIyMjIyMjIyMjIyMjIyMjIw0KIyMjICMjIEVMTyAoTkFTQ0FSKSAjIyMjIyMjIyMjIyMjDQojbi5kZWJ1dCA9IGxlbmd0aChsYXN0LmNvbXAuZGVidXQkY29tcGV0aXRvcikNCiMjIw0KbGFzdC5jb21wLmNhbGMgPC0gbGVhZF9tZW4uV3VqaWFuZy5maW5hbCAlPiUgcmlnaHRfam9pbihlbG8ubGFzdC5hY2N1bSwgYnk9ImNvbXBldGl0b3IiKQ0KIyMjDQpOIDwtIGxlbmd0aChsYXN0LmNvbXAuY2FsYyRjb21wZXRpdG9yWyFpcy5uYShsYXN0LmNvbXAuY2FsYyRGaW5hbCldKQ0KUiA8LSBsYXN0LmNvbXAuY2FsYyRSLm5ld1shaXMubmEobGFzdC5jb21wLmNhbGMkRmluYWwpXQ0KbmFtZXMgPC0gbGFzdC5jb21wLmNhbGNbIWlzLm5hKGxhc3QuY29tcC5jYWxjJEZpbmFsKSwxXQ0KY291bnRyeSA8LSBsYXN0LmNvbXAuY2FsYyRDb3VudHJ5WyFpcy5uYShsYXN0LmNvbXAuY2FsYyRGaW5hbCldDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMNCg0KcmVzdWx0cyA8LSBsYXN0LmNvbXAuY2FsYyRGaW5hbFshaXMubmEobGFzdC5jb21wLmNhbGMkRmluYWwpXQ0Kc3RkZXYgPC0gc2QocmVzdWx0cywgbmEucm0gPSBUUlVFKQ0KIw0KYXZnLnBsYXllciA8LSBtZWFuKGMoUg0KICAgICAgICAgICAgICAgICAgICAgIywgcmVwKG1lYW4oUiksIG4uZGVidXQgKQ0KICAgICAgICAgICAgICAgICAgICAgKSkNCiNtZWRpYW5hIDwtIG1lZGlhbihsZWFkX21lbiRGaW5hbFshaXMubmEobGVhZF9tZW4kRmluYWwpXSkNCm1lZGlhbmEgPC0gOA0KbWF4LnN0ZCA8LSAobWVkaWFuYS0xKS9zdGRldg0KIyMjIyMjIyMjIyMjIyMjIyMjDQpTIDwtICgobWVkaWFuYSAtIGxhc3QuY29tcC5jYWxjJEZpbmFsWyFpcy5uYShsYXN0LmNvbXAuY2FsYyRGaW5hbCldICkgLyBzdGRldikgLyBtYXguc3RkDQpEID0gNDAwDQprID0gMzINCiNFIDwtIDEvKDErKDEwXiggKGF2Zy5wbGF5ZXItUikvRCApKSkNCkUgPC0gMS8oMSsoMTBeKCAoIHNvcnQoUiwgZGVjcmVhc2luZyA9IFRSVUUpWzhdIC1SKS9EICkpKQ0KUi5uZXcgPC0gUiArIChrICogKFMgLSAoKDIqRSkvTikgKSApDQojDQojbWF4LmN1dC5maW5hbHMgPC0gKHN0ZGV2LTkpL3N0ZGV2DQpQcm9iLkZpbmFscyA8LSAxLygxKygxMF4oICggc29ydChlbG8ubGFzdC5hY2N1bSRSLm5ldywgZGVjcmVhc2luZyA9IFRSVUUpWzldIC1SLm5ldykvRCApKSkNCiNtYXguY3V0LnBvZGl1bSA8LSAoc3RkZXYtNCkvc3RkZXYNClByb2IucG9kaXVtIDwtIDEvKDErKDEwXiggKCBzb3J0KFIubmV3LCBkZWNyZWFzaW5nID0gVFJVRSlbNF0gLVIubmV3KS9EICkpKQ0KIyMjDQoNCmVsby5XdWppYW5nLmZpbmFsIDwtIGNiaW5kKG5hbWVzID0gbmFtZXMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBDdHJ5PSBjb3VudHJ5LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgUiA9IFIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzID0gbGFzdC5jb21wLmNhbGMkRmluYWxbIWlzLm5hKGxhc3QuY29tcC5jYWxjJEZpbmFsKV0sDQogICAgICAgICAgICAgICAgICAgICAgICAgICBTID0gUywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFIubmV3PSByb3VuZChSLm5ldywyKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2IuRmluYWxzPSBwYXN0ZShyb3VuZChQcm9iLkZpbmFscyoxMDAsIDEpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlIiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9iLnBvZGl1bSA9IHBhc3RlKHJvdW5kKFByb2IucG9kaXVtKjEwMCwxKSwgIiUiICkgDQogICAgICAgICAgICAgICAgICAgICAgICAgICApDQplbG8uV3VqaWFuZy5maW5hbCA8LSBhc190aWJibGUoZWxvLld1amlhbmcuZmluYWwpDQoNCmBgYCAgDQoNCg0KIyMjIyNfIEVsbyBIaXN0b3J5IF8NCmBgYHtyIGV2YWw9VFJVRX0NCiMNCmVsby5sYXN0LmNvbXAubmV3IDwtIGVsby5XdWppYW5nLmZpbmFsDQojIFNhY2FuZG8gc3ViMTYNCmNvbXBlIDwtICJXdWppYW5nLmZpbmFsIg0KIw0KZWxvLmhpc3RvcnkubGFzdCA8LSBlbG8ubGFzdC5jb21wLm5ldyAlPiUgDQogIG11dGF0ZShjb21wID0gcmVwKGNvbXBlLCBsZW5ndGgoZWxvLmxhc3QuY29tcC5uZXckY29tcGV0aXRvcikpKQ0KDQojDQplbG8uaGlzdG9yeSA8LSBlbG8uaGlzdG9yeSAlPiUNCiAgcmJpbmQoZWxvLmhpc3RvcnkubGFzdCkNCg0KYGBgICANCg0KDQoNCiMjIyAqKkVsbyBBY2N1bXVsYXRlZCBXdWppYW5nIEZpbmFsKioNCg0KYGBge3IgaW5jbHVkZT1UUlVFfQ0KIyMNCg0KI2Vsby5sYXN0LmFjY3VtIDwtIGVsby5hY2N1bSAlPiUgDQojICByZW5hbWUoUi5uZXc9IEVsbykNCmVsby5sYXN0LmNvbXAgPC0gZWxvLld1amlhbmcuZmluYWwNCiMjIw0KZWxvLmxhc3QuYWNjdW1fbGFzdC5jb21wX2Fic2VudCA8LSBlbG8ubGFzdC5hY2N1bSAlPiUgYW50aV9qb2luKGVsby5sYXN0LmNvbXAsIGJ5PSJjb21wZXRpdG9yIikNCg0KZWxvLmxhc3QuYWNjdW0gPC0gZWxvLmxhc3QuY29tcCAlPiUgZnVsbF9qb2luKGVsby5sYXN0LmFjY3VtX2xhc3QuY29tcF9hYnNlbnQpDQplbG8ubGFzdC5hY2N1bSA8LSBlbG8ubGFzdC5hY2N1bVtvcmRlcihlbG8ubGFzdC5hY2N1bSRjb21wZXRpdG9yKSxdDQojDQprbml0cjo6a2FibGUoZWxvLmxhc3QuYWNjdW1bb3JkZXIoZWxvLmxhc3QuYWNjdW0kUi5uZXcsIGRlY3JlYXNpbmcgPSBUUlVFKSxjKDEsMiw2LDcsOCldKQ0KYGBgICANCg0KDQojIyBCYWxpICANCg0KYGBge3IgaW5jbHVkZT1UUlVFLCByb3dzLnByaW50PSA4fQ0KbGVhZF9tZW4gPC0gcmFua3MgJT4lDQogIGZpbHRlcihjb21wZT09IkJhbGkiKSAlPiUNCiAgZ3JvdXBfYnkoY29tcGV0aXRvcj0gTmFtZSwNCiAgICAgICMgICAgIFllYXI9IHllYXIsDQogICAgICAgICAgIENvbXBlPSBjb21wZSwNCiAgICAgIFN0YWdlID0gU3RhZ2UsDQogICAgICAgICAgIENvdW50cnkgPSBDb3VudHJ5LA0KICAgICAgICAgICBEYXRlPSBEYXRlLA0KICAgICAgUmFuayA9IFJhbmspICU+JQ0KIyAgcmVmcmFtZShyYW5rPSBSYW5rKSAlPiUNCiAgcmVzaGFwZTI6OmRjYXN0KGZvcm11bGEgPSBjb21wZXRpdG9yICsgQ291bnRyeSArIENvbXBlIH4gU3RhZ2UsDQogICAgICAgICAgICAgICAgICB2YWx1ZS52YXIgPSAiUmFuayIsDQogICAgICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpDQoNCmxlYWRfbWVuIDwtIGFzX3RpYmJsZShsZWFkX21lbikNCiMjDQpsZWFkX21lbltvcmRlcihsZWFkX21lbiRgU2VtaS1maW5hbGApLF0gDQojIw0Kbi5zZW1pcyA8LSBucm93KGxlYWRfbWVuWyFpcy5uYShsZWFkX21lbiRgU2VtaS1maW5hbGApLF0pDQpuLmZpbmFscyA8LSBucm93KGxlYWRfbWVuWyFpcy5uYShsZWFkX21lbiRGaW5hbCksXSkNCg0KYGBgICANCg0KDQojIyMgQmFsaTogU2VtaS1maW5hbHMNCg0KYGBge3IgaW5jbHVkZT1UUlVFfQ0KbGVhZF9tZW5bb3JkZXIobGVhZF9tZW4kYFNlbWktZmluYWxgKSwgYygxLDIsNildICU+JSBwcmludChuPTYwKQ0KYGBgICANCg0KIyMjIFNlbWktZmluYWxzIA0KKi1Db21wZXRpdG9ycyA9IGBuLnNlbWlzYC0qDQoNCmBgYHtyIGluY2x1ZGU9RkFMU0V9DQpsZWFkX21lbi5CYWxpLnNlbWlzIDwtIGxlYWRfbWVuWyxjKDEsMiw2KV0gJT4lIGZpbHRlcihsZWFkX21lbiRgU2VtaS1maW5hbGAhPSJOQSIpIA0KIw0KbGFzdC5jb21wLmRlYnV0IDwtIGxlYWRfbWVuLkJhbGkuc2VtaXMgJT4lIGFudGlfam9pbihlbG8ubGFzdC5hY2N1bSwgYnk9ImNvbXBldGl0b3IiKQ0KYGBgDQoNCg0KDQpgYGB7ciBldmFsPSBUUlVFLGluY2x1ZGU9RkFMU0UsIGNvbHMucHJpbnQ9IDd9DQojIyMgRUxPICMjIyMjIyMjIyMjIyMjIyMjDQojIyMgIyMgRUxPIChOQVNDQVIpICMjIyMjIyMjIyMjIyMNCm4uZGVidXQgPSBsZW5ndGgobGFzdC5jb21wLmRlYnV0JGNvbXBldGl0b3IpDQojIyMNCmxhc3QuY29tcC5jYWxjIDwtIGxlYWRfbWVuLkJhbGkuc2VtaXMgJT4lIHJpZ2h0X2pvaW4oZWxvLmxhc3QuYWNjdW0sIGJ5PSJjb21wZXRpdG9yIikNCiMjIw0KTiA8LSBsZW5ndGgobGFzdC5jb21wLmNhbGMkY29tcGV0aXRvclshaXMubmEobGFzdC5jb21wLmNhbGMkYFNlbWktZmluYWxgKV0pDQpSIDwtIGxhc3QuY29tcC5jYWxjJFIubmV3WyFpcy5uYShsYXN0LmNvbXAuY2FsYyRgU2VtaS1maW5hbGApXQ0KbmFtZXMgPC0gbGFzdC5jb21wLmNhbGNbIWlzLm5hKGxhc3QuY29tcC5jYWxjJGBTZW1pLWZpbmFsYCksMV0NCmNvdW50cnkgPC0gbGFzdC5jb21wLmNhbGMkQ291bnRyeVshaXMubmEobGFzdC5jb21wLmNhbGMkYFNlbWktZmluYWxgKV0NCiMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KcmVzdWx0cyA8LSBsYXN0LmNvbXAuY2FsYyRgU2VtaS1maW5hbGBbIWlzLm5hKGxhc3QuY29tcC5jYWxjJGBTZW1pLWZpbmFsYCldDQpzdGRldiA8LSBzZChyZXN1bHRzLCBuYS5ybSA9IFRSVUUpDQojDQphdmcucGxheWVyIDwtIG1lYW4oYyhSLCByZXAobWVhbihSKSwgbi5kZWJ1dCApKSkNCm1lZGlhbmEgPC0gbWVkaWFuKGxlYWRfbWVuJGBTZW1pLWZpbmFsYFshaXMubmEobGVhZF9tZW4kYFNlbWktZmluYWxgKV0pDQptYXguc3RkIDwtIChtZWRpYW5hLTEpL3N0ZGV2DQojIyMjIyMjIyMjIyMjIyMjIyMNClMgPC0gKChtZWRpYW5hIC0gbGFzdC5jb21wLmNhbGMkYFNlbWktZmluYWxgWyFpcy5uYShsYXN0LmNvbXAuY2FsYyRgU2VtaS1maW5hbGApXSApIC8gc3RkZXYpIC8gbWF4LnN0ZA0KRCA9IDQwMA0KayA9IDMyDQpFIDwtIDEvKDErKDEwXiggKGF2Zy5wbGF5ZXItUikvRCApKSkNClIubmV3IDwtIFIgKyAoayAqIChTIC0gKCgyKkUpL04pICkgKQ0KIw0KbWF4LmN1dC5maW5hbHMgPC0gKHN0ZGV2LTkpL3N0ZGV2DQpQcm9iLkZpbmFscyA8LSAxLygxKygxMF4oICggc29ydChSLm5ldywgZGVjcmVhc2luZyA9IFRSVUUpWzldIC1SLm5ldykvRCApKSkNCm1heC5jdXQucG9kaXVtIDwtIChzdGRldi00KS9zdGRldg0KUHJvYi5wb2RpdW0gPC0gMS8oMSsoMTBeKCAoIHNvcnQoUi5uZXcsIGRlY3JlYXNpbmcgPSBUUlVFKVs0XSAtUi5uZXcpL0QgKSkpDQojIyMNCg0KZWxvLkJhbGkuc2VtaXMgPC0gY2JpbmQobmFtZXMgPSBuYW1lcywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIEN0cnk9IGNvdW50cnksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBSID0gUiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMgPSBsYXN0LmNvbXAuY2FsYyRgU2VtaS1maW5hbGBbIWlzLm5hKGxhc3QuY29tcC5jYWxjJGBTZW1pLWZpbmFsYCldLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgUyA9IFMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBSLm5ldz0gcm91bmQoUi5uZXcsMiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9iLkZpbmFscz0gcGFzdGUocm91bmQoUHJvYi5GaW5hbHMqMTAwLCAxKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJSIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvYi5wb2RpdW0gPSBwYXN0ZShyb3VuZChQcm9iLnBvZGl1bSoxMDAsMSksICIlIiApIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgKQ0KZWxvLkJhbGkuc2VtaXMgPC0gYXNfdGliYmxlKGVsby5CYWxpLnNlbWlzKQ0KDQojIyMjIyMjIyMjIw0KDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMjIyAjIyBFTE8gKE5BU0NBUikgIyMjIyMjIyMjIyMjIw0KbiA9IGxlbmd0aChsYXN0LmNvbXAuZGVidXQkYFNlbWktZmluYWxgKQ0KTiA8LSBsZW5ndGgobGFzdC5jb21wLmNhbGMkYFNlbWktZmluYWxgWyFpcy5uYShsYXN0LmNvbXAuY2FsYyRgU2VtaS1maW5hbGApXSkNClIuZGVidXQgPC0gcmVwKG1lYW4oUiksIG4pDQpuYW1lcyA8LSBsYXN0LmNvbXAuZGVidXRbLDFdDQpjb3VudHJ5IDwtIGxhc3QuY29tcC5kZWJ1dCRDb3VudHJ5DQojY2F0ZWcgPC0gbGVhZF9tZW4uYV9iDQpTIDwtICgobWVkaWFuYS0gbGFzdC5jb21wLmRlYnV0JGBTZW1pLWZpbmFsYCkgLyBzdGRldikgLyBtYXguc3RkDQpFIDwtIDEvKDErKDEwXiggKGF2Zy5wbGF5ZXItUi5kZWJ1dCkvRCApKSkNClIubmV3IDwtIFIuZGVidXQgKyAoayAqIChTIC0gKCgyKkUpL04pICkgKQ0KIw0KbWF4LmN1dC5maW5hbHMgPC0gKHN0ZGV2LTkpL3N0ZGV2DQpQcm9iLkZpbmFscyA8LSAxLygxKygxMF4oICggc29ydChlbG8uQmFsaS5zZW1pcyRSLm5ldywgZGVjcmVhc2luZyA9IFRSVUUpWzldIC0gUi5uZXcpL0QgKSkpDQptYXguY3V0LnBvZGl1bSA8LSAoc3RkZXYtNCkvc3RkZXYNClByb2IucG9kaXVtIDwtIDEvKDErKDEwXiggKCBzb3J0KGVsby5CYWxpLnNlbWlzJFIubmV3LCBkZWNyZWFzaW5nID0gVFJVRSlbNF0gLVIubmV3KS9EICkpKQ0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCmVsby5CYWxpLmRlYnV0IDwtIGNiaW5kKG5hbWVzID0gbmFtZXMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBDdHJ5PSBjb3VudHJ5LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgUiA9IFIuZGVidXQsDQogICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzID0gbGFzdC5jb21wLmRlYnV0JGBTZW1pLWZpbmFsYCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFMgPSBTLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgUi5uZXc9IHJvdW5kKFIubmV3LDIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvYi5GaW5hbHM9IHBhc3RlKHJvdW5kKFByb2IuRmluYWxzKjEwMCwxKSwiJSIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvYi5wb2RpdW0gPSBwYXN0ZShyb3VuZChQcm9iLnBvZGl1bSoxMDAsIDEpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJSIpIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgKQ0KZWxvLkJhbGkuZGVidXQgPC0gYXNfdGliYmxlKGVsby5CYWxpLmRlYnV0KQ0KDQplbG8uQmFsaS5zZW1pcyA8LSBlbG8uQmFsaS5zZW1pcyAlPiUgcmJpbmQoZWxvLkJhbGkuZGVidXQpDQoNCg0KIyMjIyMgIyMjIyMjIyMjIw0Ka25pdHI6OmthYmxlKGVsby5CYWxpLnNlbWlzW29yZGVyKGVsby5CYWxpLnNlbWlzJHJlc3VsdHMpLGMoMSwyLDMsNCw2LDcsOCldKQ0KDQpgYGAgIA0KDQoNCiMjIyMjXyBFbG8gSGlzdG9yeSBfDQpgYGB7ciBldmFsPVRSVUV9DQojDQojIFNhY2FuZG8gc3ViMTYNCmNvbXBlIDwtICJCYWxpLnNlbWlzIg0KI2Vsby5oaXN0b3J5Lmxhc3QgPC0gZWxvLjIyLmFjY3VtLnRvX3N1YjE2ICU+JSANCiMgIG11dGF0ZShjb21wID0gcmVwKGNvbXBlLCBsZW5ndGgoZWxvLjIyLmFjY3VtLnRvX3N1YjE2JGNvbXBldGl0b3IpKSwNCiAjICAgICAgICBjYXRlZyA9IHJlcCgiU3ViMTZNIiwgbGVuZ3RoKGVsby4yMi5hY2N1bS50b19zdWIxNiRjb21wZXRpdG9yKSkpDQojDQojZWxvLmhpc3RvcnkgPC0gZWxvLmhpc3RvcnkgJT4lIHJiaW5kKGVsby5oaXN0b3J5Lmxhc3QpDQojIyANCmVsby5oaXN0b3J5Lmxhc3QgPC0gZWxvLkJhbGkuc2VtaXMgJT4lIA0KICBtdXRhdGUoY29tcCA9IHJlcChjb21wZSwgbGVuZ3RoKGVsby5CYWxpLnNlbWlzJGNvbXBldGl0b3IpKSkNCg0KIw0KZWxvLmhpc3RvcnkgPC0gZWxvLmhpc3RvcnkgJT4lDQogIHJiaW5kKGVsby5oaXN0b3J5Lmxhc3QpDQoNCg0KYGBgICANCg0KDQoNCiMjIyAqKkVsbyBBY2N1bXVsYXRlZCBCYWxpIFNlbWlzKioNCg0KYGBge3IgaW5jbHVkZT1UUlVFfQ0KIyMNCg0KI2Vsby5sYXN0LmFjY3VtIDwtIGVsby5hY2N1bSAlPiUgDQojICByZW5hbWUoUi5uZXc9IEVsbykNCmVsby5sYXN0LmNvbXAgPC0gZWxvLkJhbGkuc2VtaXMNCiMjIw0KZWxvLmxhc3QuYWNjdW1fbGFzdC5jb21wX2Fic2VudCA8LSBlbG8ubGFzdC5hY2N1bSAlPiUgYW50aV9qb2luKGVsby5sYXN0LmNvbXAsIGJ5PSJjb21wZXRpdG9yIikNCg0KZWxvLmxhc3QuYWNjdW0gPC0gZWxvLmxhc3QuY29tcCAlPiUgZnVsbF9qb2luKGVsby5sYXN0LmFjY3VtX2xhc3QuY29tcF9hYnNlbnQpDQplbG8ubGFzdC5hY2N1bSA8LSBlbG8ubGFzdC5hY2N1bVtvcmRlcihlbG8ubGFzdC5hY2N1bSRjb21wZXRpdG9yKSxdDQojDQprbml0cjo6a2FibGUoZWxvLmxhc3QuYWNjdW1bb3JkZXIoZWxvLmxhc3QuYWNjdW0kUi5uZXcsIGRlY3JlYXNpbmcgPSBUUlVFKSxjKDEsMiw2LDcsOCldKQ0KYGBgICANCg0KDQoNCiMjIyBCYWxpOiBGaW5hbA0KDQpgYGB7ciBpbmNsdWRlPVRSVUV9DQpsZWFkX21lbltvcmRlcihsZWFkX21lbiRGaW5hbCksIGMoMSwyLDQpXSAlPiUgcHJpbnQobj02MCkNCmBgYCAgDQoNCiMjIyBGaW5hbHMgDQoqLUNvbXBldGl0b3JzID0gYG4uZmluYWxgLSoNCg0KYGBge3IgaW5jbHVkZT1GQUxTRX0NCmxlYWRfbWVuLkJhbGkuZmluYWwgPC0gbGVhZF9tZW5bLGMoMSwyLDQpXSAlPiUgZmlsdGVyKGxlYWRfbWVuJEZpbmFsIT0iTkEiKSANCiMNCiNsYXN0LmNvbXAuZGVidXQgPC0gbGVhZF9tZW4uQmFsaS5maW5hbCAlPiUgYW50aV9qb2luKGVsby5sYXN0LmFjY3VtLCBieT0iY29tcGV0aXRvciIpDQpgYGANCg0KDQoNCmBgYHtyIGV2YWw9IFRSVUUsaW5jbHVkZT1GQUxTRSwgY29scy5wcmludD0gN30NCiMjIyBFTE8gIyMjIyMjIyMjIyMjIyMjIyMNCiMjIyAjIyBFTE8gKE5BU0NBUikgIyMjIyMjIyMjIyMjIw0KI24uZGVidXQgPSBsZW5ndGgobGFzdC5jb21wLmRlYnV0JGNvbXBldGl0b3IpDQojIyMNCmxhc3QuY29tcC5jYWxjIDwtIGxlYWRfbWVuLkJhbGkuZmluYWwgJT4lIHJpZ2h0X2pvaW4oZWxvLmxhc3QuYWNjdW0sIGJ5PSJjb21wZXRpdG9yIikNCiMjIw0KTiA8LSBsZW5ndGgobGFzdC5jb21wLmNhbGMkY29tcGV0aXRvclshaXMubmEobGFzdC5jb21wLmNhbGMkRmluYWwpXSkNClIgPC0gbGFzdC5jb21wLmNhbGMkUi5uZXdbIWlzLm5hKGxhc3QuY29tcC5jYWxjJEZpbmFsKV0NCm5hbWVzIDwtIGxhc3QuY29tcC5jYWxjWyFpcy5uYShsYXN0LmNvbXAuY2FsYyRGaW5hbCksMV0NCmNvdW50cnkgPC0gbGFzdC5jb21wLmNhbGMkQ291bnRyeVshaXMubmEobGFzdC5jb21wLmNhbGMkRmluYWwpXQ0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQoNCnJlc3VsdHMgPC0gbGFzdC5jb21wLmNhbGMkRmluYWxbIWlzLm5hKGxhc3QuY29tcC5jYWxjJEZpbmFsKV0NCnN0ZGV2IDwtIHNkKHJlc3VsdHMsIG5hLnJtID0gVFJVRSkNCiMNCmF2Zy5wbGF5ZXIgPC0gbWVhbihjKFINCiAgICAgICAgICAgICAgICAgICAgICMsIHJlcChtZWFuKFIpLCBuLmRlYnV0ICkNCiAgICAgICAgICAgICAgICAgICAgICkpDQojbWVkaWFuYSA8LSBtZWRpYW4obGVhZF9tZW4kRmluYWxbIWlzLm5hKGxlYWRfbWVuJEZpbmFsKV0pDQptZWRpYW5hIDwtIDgNCm1heC5zdGQgPC0gKG1lZGlhbmEtMSkvc3RkZXYNCiMjIyMjIyMjIyMjIyMjIyMjIw0KUyA8LSAoKG1lZGlhbmEgLSBsYXN0LmNvbXAuY2FsYyRGaW5hbFshaXMubmEobGFzdC5jb21wLmNhbGMkRmluYWwpXSApIC8gc3RkZXYpIC8gbWF4LnN0ZA0KRCA9IDQwMA0KayA9IDMyDQojRSA8LSAxLygxKygxMF4oIChhdmcucGxheWVyLVIpL0QgKSkpDQpFIDwtIDEvKDErKDEwXiggKCBzb3J0KFIsIGRlY3JlYXNpbmcgPSBUUlVFKVs4XSAtUikvRCApKSkNClIubmV3IDwtIFIgKyAoayAqIChTIC0gKCgyKkUpL04pICkgKQ0KIw0KI21heC5jdXQuZmluYWxzIDwtIChzdGRldi05KS9zdGRldg0KUHJvYi5GaW5hbHMgPC0gMS8oMSsoMTBeKCAoIHNvcnQoZWxvLmxhc3QuYWNjdW0kUi5uZXcsIGRlY3JlYXNpbmcgPSBUUlVFKVs5XSAtUi5uZXcpL0QgKSkpDQojbWF4LmN1dC5wb2RpdW0gPC0gKHN0ZGV2LTQpL3N0ZGV2DQpQcm9iLnBvZGl1bSA8LSAxLygxKygxMF4oICggc29ydChSLm5ldywgZGVjcmVhc2luZyA9IFRSVUUpWzRdIC1SLm5ldykvRCApKSkNCiMjIw0KDQplbG8uQmFsaS5maW5hbCA8LSBjYmluZChuYW1lcyA9IG5hbWVzLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3RyeT0gY291bnRyeSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFIgPSBSLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cyA9IGxhc3QuY29tcC5jYWxjJEZpbmFsWyFpcy5uYShsYXN0LmNvbXAuY2FsYyRGaW5hbCldLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgUyA9IFMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBSLm5ldz0gcm91bmQoUi5uZXcsMiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9iLkZpbmFscz0gcGFzdGUocm91bmQoUHJvYi5GaW5hbHMqMTAwLCAxKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJSIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvYi5wb2RpdW0gPSBwYXN0ZShyb3VuZChQcm9iLnBvZGl1bSoxMDAsMSksICIlIiApIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgKQ0KZWxvLkJhbGkuZmluYWwgPC0gYXNfdGliYmxlKGVsby5CYWxpLmZpbmFsKQ0KDQpgYGAgIA0KDQoNCiMjIyMjXyBFbG8gSGlzdG9yeSBfDQpgYGB7ciBldmFsPVRSVUV9DQojDQplbG8ubGFzdC5jb21wLm5ldyA8LSBlbG8uQmFsaS5maW5hbA0KIyBTYWNhbmRvIHN1YjE2DQpjb21wZSA8LSAiQmFsaS5maW5hbCINCiMNCmVsby5oaXN0b3J5Lmxhc3QgPC0gZWxvLmxhc3QuY29tcC5uZXcgJT4lIA0KICBtdXRhdGUoY29tcCA9IHJlcChjb21wZSwgbGVuZ3RoKGVsby5sYXN0LmNvbXAubmV3JGNvbXBldGl0b3IpKSkNCg0KIw0KZWxvLmhpc3RvcnkgPC0gZWxvLmhpc3RvcnkgJT4lDQogIHJiaW5kKGVsby5oaXN0b3J5Lmxhc3QpDQoNCmBgYCAgDQoNCg0KDQojIyMgKipFbG8gQWNjdW11bGF0ZWQgQmFsaSBGaW5hbCoqDQoNCmBgYHtyIGluY2x1ZGU9VFJVRX0NCiMjDQoNCiNlbG8ubGFzdC5hY2N1bSA8LSBlbG8uYWNjdW0gJT4lIA0KIyAgcmVuYW1lKFIubmV3PSBFbG8pDQplbG8ubGFzdC5jb21wIDwtIGVsby5CYWxpLmZpbmFsDQojIyMNCmVsby5sYXN0LmFjY3VtX2xhc3QuY29tcF9hYnNlbnQgPC0gZWxvLmxhc3QuYWNjdW0gJT4lIGFudGlfam9pbihlbG8ubGFzdC5jb21wLCBieT0iY29tcGV0aXRvciIpDQoNCmVsby5sYXN0LmFjY3VtIDwtIGVsby5sYXN0LmNvbXAgJT4lIGZ1bGxfam9pbihlbG8ubGFzdC5hY2N1bV9sYXN0LmNvbXBfYWJzZW50KQ0KZWxvLmxhc3QuYWNjdW0gPC0gZWxvLmxhc3QuYWNjdW1bb3JkZXIoZWxvLmxhc3QuYWNjdW0kY29tcGV0aXRvciksXQ0KIw0Ka25pdHI6OmthYmxlKGVsby5sYXN0LmFjY3VtW29yZGVyKGVsby5sYXN0LmFjY3VtJFIubmV3LCBkZWNyZWFzaW5nID0gVFJVRSksYygxLDIsNiw3LDgpXSkNCmBgYCAgDQoNCg==