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

Brasil terá semana de manifestações com lados políticos opostos

Luís Adorno

Do UOL, em São Paulo

25/05/2019 13h44

Entre este domingo (26) e quinta-feira (30), grupos que apoiam pautas de Jair Bolsonaro e movimentos estudantis contrários às medidas do presidente devem ir às ruas para manifestações com lados opostos.

Para amanhã, estão previstas manifestações em diversas cidades a favor do governo. Entre as pautas defendidas estão o apoio à reforma da Previdência e ao pacote anticrime, além de repúdio a partidos do Centrão.

Para quinta-feira, movimentos estudantis convocaram manifestações, também em diversas cidades, contra o congelamento de verbas para a educação. Eles argumentam que o governo federal tem perseguido lideranças estudantis e organizadores dos atos do último dia 15.

Ato pró-governo

Segundo Eduardo Platon, CEO do grupo Avança Brasil, um dos organizadores do ato de domingo, o intuito é defender pautas do governo que são de interesse da população e estão sendo freadas pela atuação do "centrão" -- grupo informal formado por partidos como DEM, PR, PP e PSD, entre outros, que reúnem centenas de parlamentares.

De acordo com Platon, é necessário pressionar os parlamentares para atuar "na direção do anseio da população". Questionado se tal pressão não poderia gerar uma reação contrária dos parlamentares à pauta do governo, ele disse que este cálculo cabe aos partidos e movimentos que não estão participando da agenda de reformas.

Além do Avança Brasil, estão entre os organizadores grupos como Nas Ruas, Ativistas Independentes e Direita São Paulo, entre outros. Na semana ada, o MBL (Movimento Brasil Livre) informou que não iria aderir às manifestações de domingo pelo fato de "um setor" que convocava os atos ter divulgado hashtags com alusões ao artigo da Constituição que, para alguns apoiadores de Bolsonaro, permitiria uma intervenção militar.

Protestos de estudantes

Já os atos da próxima quinta-feira são organizados pela UNE (União Nacional dos Estudantes), Ubes (União Brasileira de Estudantes Secundaristas) e ANPG (Associação Nacional de Pós-Graduandos).

Pedro Gorki, presidente da Ubes, diz que a manifestação "defenderá a educação pública e de qualidade". "O corte na educação tem como pano de fundo atacar o caráter público da educação, para privatizá-la. Vamos defender o nosso direito de estudar", disse.

Sobre o ato a favor de Bolsonaro, afirmou: "Fico preocupado com o caráter da manifestação de amanhã porque vem para desestabilizar os poderes da República. Sempre que um protesto enseja desestabilizar os poderes, é prejudicial para o futuro do país."

Marianna Dias, presidente da UNE, afirmou que o ato do domingo "é imprevisível". "Dia 30 será mais um tsunami da educação, vamos protestar em todo Brasil, nas capitais", afirmou.