;(function() { window.createMeasureObserver = (measureName) => { var markPrefix = `_uol-measure-${measureName}-${new Date().getTime()}`; performance.mark(`${markPrefix}-start`); return { end: function() { performance.mark(`${markPrefix}-end`); performance.measure(`uol-measure-${measureName}`, `${markPrefix}-start`, `${markPrefix}-end`); performance.clearMarks(`${markPrefix}-start`); performance.clearMarks(`${markPrefix}-end`); } } }; /** * Gerenciador de eventos */ window.gevent = { stack: [], RUN_ONCE: true, on: function(name, callback, once) { this.stack.push([name, callback, !!once]); }, emit: function(name, args) { for (var i = this.stack.length, item; i--;) { item = this.stack[i]; if (item[0] === name) { item[1](args); if (item[2]) { this.stack.splice(i, 1); } } } } }; var runningSearch = false; var hadAnEvent = true; var elementsToWatch = window.elementsToWatch = new Map(); var innerHeight = window.innerHeight; // timestamp da última rodada do requestAnimationFrame // É usado para limitar a procura por elementos visíveis. var lastAnimationTS = 0; // verifica se elemento está no viewport do usuário var isElementInViewport = function(el) { var rect = el.getBoundingClientRect(); var clientHeight = window.innerHeight || document.documentElement.clientHeight; // renderizando antes, evitando troca de conteúdo visível no chartbeat-related-content if(el.className.includes('related-content-front')) return true; // garante que usa ao mínimo 280px de margem para fazer o lazyload var margin = clientHeight + Math.max(280, clientHeight * 0.2); // se a base do componente está acima da altura da tela do usuário, está oculto if(rect.bottom < 0 && rect.bottom > margin * -1) { return false; } // se o topo do elemento está abaixo da altura da tela do usuário, está oculto if(rect.top > margin) { return false; } // se a posição do topo é negativa, verifica se a altura dele ainda // compensa o que já foi scrollado if(rect.top < 0 && rect.height + rect.top < 0) { return false; } return true; }; var asynxNextFreeTime = () => { return new Promise((resolve) => { if(window.requestIdleCallback) { window.requestIdleCallback(resolve, { timeout: 5000, }); } else { window.requestAnimationFrame(resolve); } }); }; var asyncValidateIfElIsInViewPort = function(promise, el) { return promise.then(() => { if(el) { if(isElementInViewport(el) == true) { const cb = elementsToWatch.get(el); // remove da lista para não ser disparado novamente elementsToWatch.delete(el); cb(); } } }).then(asynxNextFreeTime); }; // inicia o fluxo de procura de elementos procurados var look = function() { if(window.requestIdleCallback) { window.requestIdleCallback(findByVisibleElements, { timeout: 5000, }); } else { window.requestAnimationFrame(findByVisibleElements); } }; var findByVisibleElements = function(ts) { var elapsedSinceLast = ts - lastAnimationTS; // se não teve nenhum evento que possa alterar a página if(hadAnEvent == false) { return look(); } if(elementsToWatch.size == 0) { return look(); } if(runningSearch == true) { return look(); } // procura por elementos visíveis apenas 5x/seg if(elapsedSinceLast < 1000/5) { return look(); } // atualiza o último ts lastAnimationTS = ts; // reseta status de scroll para não entrar novamente aqui hadAnEvent = false; // indica que está rodando a procura por elementos no viewport runningSearch = true; const done = Array.from(elementsToWatch.keys()).reduce(asyncValidateIfElIsInViewPort, Promise.resolve()); // obtém todos os elementos que podem ter view contabilizados //elementsToWatch.forEach(function(cb, el) { // if(isElementInViewport(el) == true) { // // remove da lista para não ser disparado novamente // elementsToWatch.delete(el); // cb(el); // } //}); done.then(function() { runningSearch = false; }); // reinicia o fluxo de procura look(); }; /** * Quando o elemento `el` entrar no viewport (-20%), cb será disparado. */ window.lazyload = function(el, cb) { if(el.nodeType != Node.ELEMENT_NODE) { throw new Error("element parameter should be a Element Node"); } if(typeof cb !== 'function') { throw new Error("callback parameter should be a Function"); } elementsToWatch.set(el, cb); } var setEvent = function() { hadAnEvent = true; }; window.addEventListener('scroll', setEvent, { capture: true, ive: true }); window.addEventListener('click', setEvent, { ive: true }); window.addEventListener('resize', setEvent, { ive: true }); window.addEventListener('load', setEvent, { once: true, ive: true }); window.addEventListener('DOMContentLoaded', setEvent, { once: true, ive: true }); window.gevent.on('allJSLoadedAndCreated', setEvent, window.gevent.RUN_ONCE); // inicia a validação look(); })();
  • AssineUOL
Topo

Pan 2019

Pneu furado e maré de azar impedem ouro histórico no ciclismo

Henrique Avancini na prova de mountain bike dos Jogos Pan-Americanos de Lima - Abelardo Mendes Jr/ rededoesporte.gov.br
Henrique Avancini na prova de mountain bike dos Jogos Pan-Americanos de Lima Imagem: Abelardo Mendes Jr/ rededoesporte.gov.br

Demétrio Vecchioli

Do UOL, em Lima (Peru)

28/07/2019 15h10

Henrique Avancini cumpriu, pedalada após pedalada, todas as etapas para se tornar um dos melhores atletas de mountain bike do mundo. Campeão mundial em longa distância, terceiro do ranking mundial e medalhista de etapas do circuito mundial, ele queria, neste domingo (28), furar a bolha do ciclismo e mostrar-se para o grande público brasileiro com uma medalha de ouro nos Jogos Pan-Americanos.

Uma maré de azar, porém, não deixou que ele se tornasse o primeiro brasileiro no alto do pódio do ciclismo do Pan em 60 anos. Primeiro, o cabo da suspensão rompeu-se. Depois, o pneu furou e lhe tomou valiosos minutos. No fim das contas, a medalha de prata, a dois minutos do mexicano Jose Ulloa Arévalo, teve gosto amargo.

"Consegui fazer um milagre, mas não dois. Arrebentei o cabo da suspensão na largada e corri a prova inteira sem suspensão. Queria abrir do Ullloa para poder parar para arrumar, mas não consegui abrir o suficiente. E logo depois furei", contou. O pneu de trás da bicicleta de Avancini furou cerca de 100 metros depois da primeira área de apoio, o que fez andar metade do circuito até chegar à segunda área para fazer o reparo - no ciclismo, eles trocam toda a roda quando um pneu fura.

"Perdi 3 minutos só por andar com o pneu furado. E quando você anda com pneu furado, tem gasto energético maior. Competir é aprender. Tiro lições deste dia, mas falando da prova em si, é uma grande frustração. Larguei para competir pelo ouro, ficou claro que tenho condições disso. Não dá para mentir, foi uma grande frustração", reconheceu.

Problemas mecânicos são relativamente comuns no mountain bike, mas nem tanto. Avancini, que este ano ganhou sua primeira medalha de Circuito Mundial no cross country olímpico, ainda não tinha tido problemas em 2019. Muito menos dois. "Tem uns três anos que eu não tenho dois problemas mecânicos na mesma prova. Nunca tive esse problema de suspensão, tem dois anos e meio que não furo o pneu. Não era para ser", reconheceu, rindo da própria (má) sorte.

Avancini acredita que ainda terá outras oportunidades de "furar a bolha" da comunidade ciclística e se mostrar para o grande público. "O mundo não muda em um dia. É uma boa oportunidade que perco, mas tem outras. No segundo semestre, tenho tudo para conseguir meus melhores resultados até hoje", diz ele. Além do campeão Ulloa e do vice-campeão Avancini, o pódio também teve o chileno Martin Kossmann, com o bronze. Outro brasileiro na prova, Guilherme Gotardelo terminou em quinto. Antes dele, o Brasil já tinah comemorado o bronze de Jaqueline Mourão no MTB.