;(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

Time amador do Haiti vence jogo histórico nos EUA com 'Flamengo' na camisa

Jogadores do Violette se jogaram no chão, incrédulos, na comemoração do jogo histórico - Omar Vega/Getty Images
Jogadores do Violette se jogaram no chão, incrédulos, na comemoração do jogo histórico Imagem: Omar Vega/Getty Images

Do UOL, em São Paulo

15/03/2023 12h00

Um time semi-amador do Haiti se classificou às quartas de final da Liga dos Campeões da Concacaf na noite de ontem (14), nos Estados Unidos.

O Violette AC eliminou o Austin, time estadunidense que joga a MLS (Major League Soccer). Os haitianos haviam vencido o jogo de ida por 3 a 0 e na volta seguraram o 2 a 0 contra.

Cinco titulares do time haitiano tinham sido proibidos de entrar nos EUA. Sem visto, não puderam jogar. De última hora, o Violette precisou procurar, contratar e inscrever quatro jogadores amadores que atuam em times do Texas. Assim chegou a 14 atletas à disposição e evitou o W.O. Todos entraram em campo no jogo da classificação.

Jogador do Violette provoca torcida do Austin depois do apito final da classificação - Omar Vega/Getty Images - Omar Vega/Getty Images
Jogador do Violette provoca torcida do Austin depois do apito final da classificação
Imagem: Omar Vega/Getty Images

O Violette ficou quase um ano sem jogar antes da partida de ida, disputado na semana ada. Teve que jogar na República Dominicana por problemas de segurança no Haiti, mesmo assim atropelou o Austin do ex-são-paulino Emiliano Rigoni. Foi este saldo que rendeu, ontem, uma das maiores zebras da história do futebol das Américas Central e do Norte.

Flamengo na camisa

O time haitiano é patrocinado pelo 'Le Flamengo', um site caribenho de importação e exportação de bens de consumo. Pelo menos desde 2018 a marca aparece no peito dos jogadores do Violette. O nome "Flamengo" é uma derivação de flamingo, ave que é um dos símbolos do Caribe e aparece no logotipo do site.

O Violette agora espera a definição de seu próximo adversário na Concachampions. O campeão haitiano vai enfrentar o classificado entre o favorito León, do México, e o Tauro, da Panamá.

A reação do Violette à classificação:

A festa no vestiário: