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

Boulos vota em São Paulo e crê em TV e debates para bater Covas no 2º turno

Do UOL, em São Paulo*

15/11/2020 10h51

Guilherme Boulos (PSOL) votou na manhã de hoje na PUC (Pontifícia Universidade Católica), em Perdizes, na Zona Oeste de São Paulo. O candidato à prefeitura de São Paulo compareceu ao local por volta das 10h30 (de Brasília), acompanhado de apoiadores.

Em rápida fala a jornalistas depois da votação, Boulos disse que em um eventual segundo turno, com paridade de tempo no horário eleitoral e debates em todas as grandes redes de TV, terá mais condições de virar o resultado das pesquisas, que apontam o favoritismo do prefeito Bruno Covas (PSDB).

"Chegamos até aqui em segundo lugar nas pesquisas com 17 segundos na TV, sem apoio da máquina dos governos federal e estadual só com engajamento de gente de verdade, sem robôs, sem fake news. Imagine no segundo turno, quando 17 segundos virarem 10 minutos todo dia, com debate em todas as grandes redes de TV, olho no olho", disse.

O candidato ainda ressaltou que sua campanha representa um resgate na forma de disputar eleições, sem grandes estruturas financeiras nem de marketing.

"Estou muito confiante que vamos para o segundo turno. A gente tem feito até aqui uma campanha linda, uma campanha marcada pela esperança. Se a gente puder avaliar o que foram estes meses, além de apresentar um projeto novo e ousado para São Paulo, com foco nas periferias, está sendo um resgate de um jeito de fazer política com esperança, sonho, princípios, mostrando que é possível voltar a fazer política desse jeito", afirmou.

Ontem, Boulos comemorou os resultados apontados pelas pesquisas Ibope e Datafolha, divulgadas ontem, sobre a disputa pela prefeitura de São Paulo.

Os institutos apontaram que Covas lidera as pesquisas e seguirá ao segundo turno. Boulos, Márcio França (PSB) e Celso Russomanno (Republicanos) brigam pela outra vaga tecnicamente empatados, mas com o psolista numericamente à frente.

"Ibope confirma o Datafolha e mostra que estamos em segundo lugar! Vamos virar o jogo em SP!", escreveu Boulos no Twitter.

*Com informações da Agência Estado